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 ABE6F5D4 for ; Tue, 9 Jun 2020 08:29:04 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.73,491,1583190000"; d="scan'208,217";a="453715120" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Jun 2020 10:28:58 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A602CE1F22; Tue, 9 Jun 2020 10:28:58 +0200 (CEST) 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 8036BE1EA0 for ; Tue, 9 Jun 2020 10:28:55 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3AXM24lROG8lCYLSKZI6kl6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K///o8bcNUDSrc9gkEXOFd2Cra4d1qyP7vyrATBIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSizexfLN/IA+roQjRucQajpduJ6kswRbVv3VEfP?= =?us-ascii?q?hby3l1LlyJhRb84cmw/J9n8ytOvv8q6tBNX6bncakmVLJUFDspPXw7683trhnD?= =?us-ascii?q?UBCA5mAAXWUMkxpHGBbK4RfnVZrsqCT6t+592C6HPc3qSL0/RDqv47t3RBLulS?= =?us-ascii?q?wIMCM38HzMisxokq1UvA6hqRJ4w47Reo6VNfx+db7Zcd4VQWdNW8BcWyxCDIO6?= =?us-ascii?q?cYsPDvEBPedDoIn5uVQFsBW/BQ62BOzy0T9Dm3v60KMm3+gkFwzNwQ4uEM8UsH?= =?us-ascii?q?nMrNv7KrocX+62wqbH0TrOdOlZ1Svn5YXSbhwtvfOBULRtesTR00kvEAbFg02M?= =?us-ascii?q?pIzhJTyV0PkGvXWH4OpgUOKvinInqx1sqTWo3MgsjpPGhoQPxlDf6Sp5wIM1Jd?= =?us-ascii?q?ykSE5netOkCJxQtyWaNotqXMwtX2FouCA7yr0fpJ60YjIGyJM9xx7QcvGKdZWD?= =?us-ascii?q?7R3/WuiLOzh4mG5ld6ylhxa06UWuyvDxW8u03VtKridIndnBu3IO2hDO6MWLVv?= =?us-ascii?q?Vz8Emu1zuP1Q3f9uBJL04qmabHKJMs3KI9mJUSvEnAHiH4l1n6gamLfUsq/eio?= =?us-ascii?q?7v7oYrTgppKEL497lB3+MqUymsOhGeQ4NQ0OX22F9uim0r3s41H5TK1NjvIqiK?= =?us-ascii?q?bZtZTaKd4cpq6jDA9Zyokj6xejDzemzdQXhmMLI05CeBKCl4TpNFDOIOz8Dfil?= =?us-ascii?q?mFugiitkx/fDPrH5GJrNNHfCkLb/fbpn7E5c0gUzwche55JSELEBIej8VlX/tN?= =?us-ascii?q?zCFhM5KA20w+n/CNV5zIweX3iDAqiDMKPdqVOI6eMvI/WMZI8IoznxMfkl5/n2?= =?us-ascii?q?gX87g1Ade7em3YALaHCiAPtpPVmZbWDwjdcGFGcGpgs+Q/HqiV2GVT5ffXGyX7?= =?us-ascii?q?gz5j0jE4KmFZ3MRoa3jLyd2ye2GIBdaGNeCl2UDHvkaYGJV+0RZC6OLcJtiDIJ?= =?us-ascii?q?WaS7R4Iv2hyirA33xrl9IubK9SAUq4jv2MV66uHJiB0/+iB4AsKA2G+XVW50hH?= =?us-ascii?q?kHRzou0aB/v0N9zlCD3LB9g/1XCNBf/etJUgA+NZ/c0+x1Fcz9WgLHfteIUVam?= =?us-ascii?q?X8upDSs2TtIrzN8Ce0d9G9O8gRDfxyemHqEZmriRCJAp7q7R0GL9Kshhx3rc2q?= =?us-ascii?q?QsgEEqQs5VOm2ngq5/+RLTB4nMk0iBiqikabkS0DLV+WmAyGSOs1pUXRZyXKrF?= =?us-ascii?q?RX0ffkzWrdD550PeUbChFbQnMg1Ayc6bN6tFdMfljVJcRPfsINnReWaxlH22BR?= =?us-ascii?q?qS3bODcIrqe2Ac3CXBFEgJiBsc/XGbNQg4GiiuvXneACZrFV/gbELg6+5+qGm0?= =?us-ascii?q?TkMs1QGFc1Vh16ap+h4SnfGTV+kc3rcAuCs4rzV0HU29387NBtqbpwtheb1cbs?= =?us-ascii?q?kn7FdG02LZrQ19MYa6I6BsnF5NOzhw6gnqyBM9QtFEjs4CqGwsigx/NfTcmBlK?= =?us-ascii?q?aDXSldikMaLRAm3z5wy0La/ay1XaltGM9fFLoP8xrlGmuACyCmIj9W9m2p9byT?= =?us-ascii?q?/U7ZLPFCIWUIntSQAw7RJ7u7jebC4toY7JhlN2NqzhmzvL3ZoSD+sgywq8N4NW?= =?us-ascii?q?NKqCUhT5E8gbG9SGMOsuikSkZRICPflP+egzJczwJKjO47KiIOs1xGHutm9A+o?= =?us-ascii?q?0ojRPVpnhMD9XQ1pNA+Mm2mw6OVjPyllCk65+lk4dZYzofBSy6lTiiA5ReNPQr?= =?us-ascii?q?INQ7TFy2Ksjy/e1Qwp7gX3kCrwymFwpAwMitaAafZFz73BRN2AIQu3P1wHLknQ?= =?us-ascii?q?wxqCkgq++k5AKL2/7rLUtVImlPVXVvhlfqIJGpgpYdRkf6NgU=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DHAgDvR99efSIeaIEVBksdAQEBAQkBE?= =?us-ascii?q?gEFBQGCCgKBIVIGQQFdVTIshCSJAYkJgg2FOI1MhAKBEANQEAEDAQwYAQwHAQI?= =?us-ascii?q?EAQGBUIJ0AheBfQIdBgEFMxMCEAEBBQEBAQIBAwMEARMBAQkWCIVeASwMgjsMD?= =?us-ascii?q?AMDgyEBGAECBgQGOyoUDwMUAQYDAgQNARcBFAoDFAESFAYBAYMLgnwEAQqJfYp?= =?us-ascii?q?6m3l/M4Q6AQMDEA+EeYFADQITgRYBhTSGdiYPgUw/ZioBghJJB2yCTg4LAQEBA?= =?us-ascii?q?QGBQAEBBgYFRYJegmAEjlkRCBQPgQCLJTuFP5IqKAeCXIEFBAqGLXeKKoZFgmi?= =?us-ascii?q?BFYd9hRWNOyGQGUmBYYVeB4I6hWWKEoRBgUAqgUcBGgMMBzMaMFACgloJYA1Vh?= =?us-ascii?q?muHRIFIF4EDAQILgj6BPoEmgXU7hUEDPzMCAQEBDSUCBgEHAQEDCXUBAQUTCwG?= =?us-ascii?q?MMQIFIYIdAQE?= X-IPAS-Result: =?us-ascii?q?A0DHAgDvR99efSIeaIEVBksdAQEBAQkBEgEFBQGCCgKBIVI?= =?us-ascii?q?GQQFdVTIshCSJAYkJgg2FOI1MhAKBEANQEAEDAQwYAQwHAQIEAQGBUIJ0AheBf?= =?us-ascii?q?QIdBgEFMxMCEAEBBQEBAQIBAwMEARMBAQkWCIVeASwMgjsMDAMDgyEBGAECBgQ?= =?us-ascii?q?GOyoUDwMUAQYDAgQNARcBFAoDFAESFAYBAYMLgnwEAQqJfYp6m3l/M4Q6AQMDE?= =?us-ascii?q?A+EeYFADQITgRYBhTSGdiYPgUw/ZioBghJJB2yCTg4LAQEBAQGBQAEBBgYFRYJ?= =?us-ascii?q?egmAEjlkRCBQPgQCLJTuFP5IqKAeCXIEFBAqGLXeKKoZFgmiBFYd9hRWNOyGQG?= =?us-ascii?q?UmBYYVeB4I6hWWKEoRBgUAqgUcBGgMMBzMaMFACgloJYA1VhmuHRIFIF4EDAQI?= =?us-ascii?q?Lgj6BPoEmgXU7hUEDPzMCAQEBDSUCBgEHAQEDCXUBAQUTCwGMMQIFIYIdAQE?= X-IronPort-AV: E=Sophos;i="5.73,491,1583190000"; d="scan'208,217";a="453715017" X-MGA-submission: =?us-ascii?q?MDFAiiVECq0TA765BIu0/IDOgYVbxqW5bH9DXi?= =?us-ascii?q?kIPdE3XS8hyCkL5wvmt+K5c6qxn/CdbYCQhl1uC+YszFnlMshO7Hw4R4?= =?us-ascii?q?S8PXDeZzMtqjySLXUyyAgjQx6dNyDbtEzXwmjQ8q/eHebdmm+oGFyxko?= =?us-ascii?q?cKL6iz0cFNA9TTu41PayFMLw=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; 09 Jun 2020 10:28:18 +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 7D7AF5648D0; Tue, 9 Jun 2020 10:28:15 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 09 Jun 2020 10:28:05 +0200 Message-ID: <87zh9cd4oa.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 9 10:28:16 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.002337, queueID=09ED75648D5 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: 18163 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 ZWsgb2YgSnVuZSAwMiB0byAwOSwNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTXVsdGljb3Jl IFVwZGF0ZTogQXByaWwgMjAyMCwgd2l0aCBhIHByZXByaW50IHBhcGVyDQpCQVAgMi4xLjAgUmVs ZWFzZQ0KTWlncmF0aW5nIGFuIEFzeW5jIHByb2plY3QgdG8gTHd0LCBhIHNob3J0IHByaW1lcg0K am9zZSAwLjQuMA0KT0NhbWwgNC4xMS4wLCBzZWNvbmQgYWxwaGEgcmVsZWFzZQ0KT0NhbWwgV29y a3Nob3AgMjAyMDogQ2FsbCBmb3IgVm9sdW50ZWVycw0KSW50cm9kdWN0aW9uIHRvIEx3dA0KT3Ro ZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk11bHRpY29yZSBVcGRhdGU6IEFwcmlsIDIwMjAs IHdpdGggYSBwcmVwcmludCBwYXBlcg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0 aWNvcmUtdXBkYXRlLWFwcmlsLTIwMjAtd2l0aC1hLXByZXByaW50LXBhcGVyLzU2MzAvMjZdDQoN Cg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgRGFuaWVsIELDvG56bGkgYXNrZWQgYW5kIEtDIFNp dmFyYW1ha3Jpc2huYW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgT25lIHRoaW5nIHRoYXQgSSBkaWRu4oCZ dCBnZXQgZnJvbSB0aGUgcGFwZXIgaXMgaG93IGV4YWN0bHkNCiAgICAgICAgYENvbmN1ck1pbm9y JyBicmVha3MgdGhlIGN1cnJlbnQgRkZJIGFuZCB0aGUgaW1wYWN0IGl0DQogICAgICAgIHdvdWxk IGhhdmUgb24gdGhlIGV4aXN0aW5nIGVjby1zeXN0ZW0sIG9uIGEgc2NhbGUgZnJvbSDigJxpdA0K ICAgICAgICBhZmZlY3QgYWxsIHByb2plY3Rz4oCdIHRvIOKAnG9ubHkgcGVvcGxlIGRvaW5nICp0 aGF0KiBmYW5jeQ0KICAgICAgICB0aGluZ+KAnSA64oCTKSA/DQoNCiAgQWxsIHRoZSBwcm9qZWN0 cyB0aGF0IHVzZSB0aGUgQyBBUEkuIFRoZSBkZXRhaWxzIGFyZSBoZXJlOg0KICBbaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUvd2lraS9DLUFQSS1jaGFu Z2VzXQ0KDQogICAgICAgIEF0IHRoZSBlbmQgb2YgdGhlIHBhcGVyIGl0IHNlZW1zIHlvdSBtYWtl IHRoZSBwb2ludCB0aGF0DQogICAgICAgIGBQYXJNaW5vcicgaXMgdGhlIHNvbHV0aW9uIHRvIGdv IHdpdGggZm9yIHRoZSB0aW1lDQogICAgICAgIGJlaW5nLiBEb2VzIHRoaXMgbWVhbnMgeW91IGFy ZSBnb2luZyB0byBsZWF2ZSBiZWhpbmQgdGhlDQogICAgICAgIHdvcmsgZG9uZSBvbiBgQ29uY3Vy TWlub3InIG9yIGRvIHlvdSBpbnRlbmQgdG8gY29udGludWUgdG8NCiAgICAgICAgbWFpbnRhaW4g aXQgPw0KDQogIFdlIGRvbid0IGludGVuZCB0byBtYWludGFpbiBpdC4gSXQgaXMgcXVpdGUgYSBi aXQgb2Ygd29yayB0byBtYWludGFpbg0KICBhbmQgcG9ydCB0aGUgY2hhbmdlcyBhY3Jvc3MgdHdv IGRpZmZlcmVudCBHQ3MuICBgUGFyTWlub3InIEdDIGlzIG5vdw0KICBhdCA0LjExIGJyYW5jaCBw b2ludCAodGhlIGRlZmF1bHQgbXVsdGljb3JlIGNvbXBpbGVyIGlzIDQuMTAgKw0KICBQYXJNaW5v ciBub3cpLiBUaGUgYENvbmNNaW5vcicgaXMgYXQgNC4wNi4xLg0KDQogIEdpdmVuIHRoYXQgYENv bmNNaW5vcicgYnJlYWtzIHRoZSBDIEFQSSwgdGhlIGVjb3N5c3RlbSB3b3VsZCBoYXZlIHRvDQog IGJlIGZpeGVkIGZvciBgQ29uY01pbm9yJyB0byBiZSB1c2VmdWwuIFRoZSBjb2RlIGNoYW5nZXMg YXJlIGluZGVlZA0KICBpbnRyaWNhdGU7IHRoZSBkaWZmZXJlbmNlcyBhcmUgbm90IGp1c3QgaW4g dGhlIG1pbm9yIEdDLCBidXQgdGhlDQogIGNvbXBpbGVycyBpbnRlcm5hbCB1c2Ugb2YgdGhlIEMg QVBJLiBJdCB3aWxsIGJlIHF1aXRlIGEgYml0IG9mIHdvcmsgdG8NCiAga2VlcCBib3RoIEdDcyBp biB0aGUgc2FtZSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KDQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNj YWdub25pIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgICAgICAgR2l2ZW4gdGhhdCBgQ29uY01pbm9yJyBicmVha3MgdGhl IEMgQVBJLCB0aGUgZWNvc3lzdGVtDQogICAgICAgIHdvdWxkIGhhdmUgdG8gYmUgZml4ZWQgZm9y IGBDb25jTWlub3InIHRvIGJlIHVzZWZ1bC4NCg0KICBJIGRvIG5vdCB0aGluayB0aGlzIGlzIG5l Y2Vzc2FyaWx5IHRydWUuDQoNCiAgSGVyZSBpcyB3aHkgSSB0aGluayBzbywgYnV0IGJlIHdhcm5l ZCB0aGF0IHRoaXMgaXMgcHJlbGltaW5hcnkgYXMgSSBkbw0KICBub3QgaGF2ZSB0aW1lIHRvIGV4 cGxvcmUgdGhpcyBpZGVhIGZ1cnRoZXIgb24gbXkgb3duIGF0IHRoZSBtb21lbnQuDQoNCg0KU3Rh dGUgaW4gUnVzdA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg QnJlYWtpbmcgdGhlIEMgQVBJIGlzIGEgY29uc2VxdWVuY2Ugb2YgZGVjaWRpbmcgdGhhdCBhbGwN CiAgc2luZ2xlLXRocmVhZGVkIHNoYXJlZCBtdXRhYmxlIHN0YXRlIG11c3QgYXNzdW1lIHRoZXkg YXJlIGFsc28gc2hhcmVkDQogIGJldHdlZW4gdGhyZWFkcy4gU28gYSBuZXcgcmVhZCBiYXJyaWVy IGlzIHVzZWQgdG8gcHJvbW90ZSB2YWx1ZXMgd2hlbg0KICByZWFkIGZyb20gYW5vdGhlciB0aHJl YWQuIEJ1dCBmb3IgZGF0YSB0eXBlcyB0aGF0IHdlcmUgY29ycmVjdCB1cCB0bw0KICBub3csIHVz ZXJzIG11c3QgYWxzbyBiZSBjYXJlZnVsIHRvIGF2b2lkIHJhY2VzIGZyb20gbm93IG9u4oCmIGZv cg0KICBpbnN0YW5jZSBieSBhdm9pZGluZyBzaGFyaW5nIHZhbHVlcyBvZiBzdWNoIHR5cGVzIGJl dHdlZW4gZG9tYWlucy4NCg0KICBPbmUgbGVzc29uIG9mIFJ1c3QgaXMgdGhhdCB0aGVyZSBhcmUg ZGlmZmVyZW50IGtpbmRzIG9mIG11dGFibGUgc3RhdGUsDQogIGZvciBkaWZmZXJlbnQgdXNhZ2Vz LCB3aXRoIGRpZmZlcmVudCBtZWFucyB0byBhY2hpZXZlIHRocmVhZC1zYWZldHkuDQoNCiAgVGhl IGNsb3Nlc3QgdGhlcmUgaXMgdG8gY3VycmVudCBPQ2FtbCdzIGBtdXRhYmxlJyBpcyB0aGUgbm90 aW9uIG9mDQogIHNpbmdsZS10aHJlYWRlZCBtdWx0aXBsZS13cml0ZXJzIG11dGFibGUgc3RhdGUg KF9gQ2VsbCdfKS4gSXQgaXMgbWFkZQ0KICB0aHJlYWQtc2FmZSBpbiBSdXN0IGJ5IHN0YXRpY2Fs bHkgcHJldmVudGluZyB2YWx1ZXMgY29udGFpbmluZyBgQ2VsbCcNCiAgZnJvbSBjcm9zc2luZyB0 aHJlYWQgYm91bmRhcmllcyAoYnkgdmlydHVlIG9mIG5vdCBoYXZpbmcgdGhlIF9gU2VuZCcNCiAg dHJhaXRfKS4gVGhlIHNhbWUgcmVzdHJpY3Rpb24gaXMgdXNlZCB0byBtYWtlIHNvbWUgZGF0YSBz dHJ1Y3R1cmVzDQogIG1vcmUgZWZmaWNpZW50IGJ5IGF2b2lkaW5nIHRoZSBjb3N0IG9mIHN5bmNo cm9uaXNhdGlvbiAoY2YuIHRoZQ0KICByZWZlcmVuY2UtY291bnRpbmcgcG9pbnRlciBgUmMnIHZz LiB0aGUgYXRvbWljIHJlZmVyZW5jZS1jb3VudGluZw0KICBwb2ludGVyIGBBcmMnKS4NCg0KICBU aGlzIGlzIG5vdCBlbm91Z2ggYnkgaXRzZWxmLCBhbmQgUnVzdCBvZmZlcnMgb3RoZXIga2luZHMg b2Ygc3RhdGUgZm9yDQogIGNvbW11bmljYXRpbmcgYW5kIHNoYXJpbmcgdmFsdWVzIGJldHdlZW4g dGhyZWFkcy4NCg0KICBfYFVuc2FmZUNlbGwnXyBsaWtlIE9jYW1sIG11bHRpY29yZSdzIGBtdXRh YmxlJyAodGhvdWdoIHlvdXJzIGlzIHNhZmUNCiAgdGhhbmtzIHRvIHRoZSB3b3JrIG9uIHRoZSBt ZW1vcnkgbW9kZWwpOiBpdCBoYXMgYWxtb3N0IG5vIHJlc3RyaWN0aW9uDQogIGFuZCBjYW4gYmUg c2VudCBhY3Jvc3MgZG9tYWlucywgYnV0IHRoZSB1c2VyIGlzIGxpa2V3aXNlIHRvbGQgdG8NCiAg 4oCcYXZvaWQgZGF0YSByYWNlc+KAnS4gSXQgaXMgcmFyZWx5IHVzZWQgYWxvbmUsIGJ1dCB0b2dl dGhlciB3aXRoIHR5cGUNCiAgYWJzdHJhY3Rpb24gaXQgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbSBz YWZlIGNvbmN1cnJlbnQgZGF0YSBzdHJ1Y3R1cmVzLg0KDQogIExhc3RseSwgdGhlIGRlZmF1bHQg bm90aW9uIG9mIHN0YXRlIGluIFJ1c3QgaXMgbGluZWFyIHN0YXRlLCB3aGljaCBjYW4NCiAgYmUg c2VudCBmcmVlbHkgYWNyb3NzIHRocmVhZHMuIFRocmVhZC1zYWZldHkgaXMgZW5zdXJlZCBieSBy ZXN0cmljdGluZw0KICBhbGlhc2luZyB1c2luZyB0aGUgb3duZXJzaGlwIGFuZCBib3Jyb3dpbmcg ZGlzY2lwbGluZS4NCg0KDQpBIGJhY2t3YXJkcy1jb21wYXRpYmxlIGNvbmN1cnJlbnQgY29sbGVj dG9yPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSWYgSSBoYWQgdG8gaW1hZ2luZSBhIGJhY2t3 YXJkcy1jb21wYXRpYmxlIE9DYW1sIHdpdGggc3RhdGljIGNvbnRyb2wNCiAgb2YgaW50ZXJmZXJl bmNlIMOgIGxhIFJ1c3QgYmFzZWQgb24gYENvbmNNaW5vcicsIGl0IHdvdWxkIGRpc3Rpbmd1aXNo DQogIHRoZSB0aHJlZSBraW5kcyBvZiBzdGF0ZSAoY29uY3JldGVseSB3aXRoIG90aGVyIGtleXdv cmRzIGluIGFkZGl0aW9uDQogIHRvIGBtdXRhYmxlJykuIGBtdXRhYmxlJyB3b3VsZCBrZWVwIGl0 cyBjdXJyZW50IG1lYW5pbmcgb2YNCiAgc2luZ2xlLWRvbWFpbiwgbXVsdGlwbGUtd3JpdGVycyBz dGF0ZSBhbmQgbm90IHJlcXVpcmUgYSByZWFkIGJhcnJpZXIsDQogIGFuZCBpbiBwYXJ0aWN1bGFy IHByZXNlcnZlIHRoZSBBUEkuIChJIGNvdW50IHN5c3RocmVhZHMgYXMNCiAgc2luZ2xlLXRocmVh ZGVkIGZvciB0aGlzIHB1cnBvc2UsIHNpbmNlIGhlcmUgaXQgbWVhbnMgInNoYXJpbmcgdGhlDQog IHNhbWUgbWlub3IgaGVhcCIuKQ0KDQogIFByb2dyYW1zIGNvdWxkIHByb2dyZXNzaXZlbHkgdHJh bnNpdGlvbiB0byBvdGhlciBraW5kcyBvZiBzdGF0ZSB3aGVuDQogIHBhcmFsbGVsaXNpbmcgdGhl IHByb2dyYW0uIENvbmNyZXRlbHksIGEgZGF0YSBzdHJ1Y3R1cmUgbGlrZQ0KICBgU3RhY2sudCcs IGluc3RlYWQgb2YgYmVjb21pbmcgcmFjeSwgd291bGQga2VlcCBpdHMgY3VycmVudCBtZWFuaW5n LA0KICBidXQgdXNlcnMgY291bGQgcmVwbGFjZSBpdCB3aXRoIGEgbGluZWFyIHN0YWNrIG9yIGEg Y29uY3VycmVudCBzdGFjaywNCiAgdHdvIGRhdGEgc3RydWN0dXJlcyBkaXN0aW5jdCBmcm9tIHRo ZSBmaXJzdCBvbmUsIHdoZW4gcGFyYWxsZWxpemluZw0KICB0aGVpciBwcm9ncmFtcy4NCg0KICBT byBob3cgY291bGQgdGhpcyBmaXQgd2l0aCB0aGUgY3VycmVudCBwbGFucz8gSXQgaXMgbm90IGVu dGlyZWx5IGNsZWFyDQogIHRvIG1lLiBJZiBwZW9wbGUgc3RhcnQgdG8gcmVseSBvbiBwYXJhbGxl bGlzbSBpbiBhbiB1bnN0cnVjdHVyZWQgd2F5DQogIChlLmcuIG5vIGNsZWFyIGRpc3RpbmN0aW9u IGJldHdlZW4gZGlmZmVyZW50IGtpbmRzIG9mIGRhdGEgdHlwZXMNCiAgYXJpc2luZyBmcm9tIGRp ZmZlcmVudCB3YXlzIG9mIGVuc3VyaW5nIHRocmVhZC1zYWZldHkpIHRoZW4gb25lIHdpbGwNCiAg YWxzbyBsb3NlIHRoZSBhYmlsaXR5IHRvIHJldHJvZml0IGBDb25jTWlub3InIGluIGENCiAgYmFj a3dhcmRzLWNvbXBhdGlibGUgbWFubmVyIChieSBsb3NpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQg dGhlDQogIGN1cnJlbnQgYG11dGFibGUnIEFQSSBpcyBzaW5nbGUtdGhyZWFkZWQpLiBUaGUgQVBJ IGJyZWFrYWdlIG9mDQogIGBDb25jTWlub3InIHdoaWNoIG1pZ2h0IG9ubHkgYmUgdmlydHVhbCBy aWdodCBub3cgKGlmIEkgdHJ1c3QgdGhpcw0KICBwcmVsaW1pbmFyeSwgbm90IGZ1bGx5LWV4cGxv cmVkIGlkZWEpIHdpbGwgYmVjb21lIHJlYWwuICAoRnVydGhlcg0KICBkaWZmaWN1bHRpZXMgYXJp c2Ugd2l0aCB0aGUgZW11bGF0aW9uIG9mIHRoZSBgVGhyZWFkJyBsaWJyYXJ5IHdpdGgNCiAgZG9t YWlucywgYnV0IHRoaXMgY291bGQgYmUgY2hhbmdlZCBsYXRlci4pDQoNCiAgQnV0IGlmIHVzZXJz IGFyZSBwcm92aWRlZCBpbiBhZHZhbmNlIHdpdGggYSBnZW5lcmFsIGRpcmVjdGlvbiBmb3IgYQ0K ICBtb2RlbCBvZiBjb250cm9sIG9mIGludGVyZmVyZW5jZSB0aGlzIG1pZ2h0IGhhcHBlbiBkaWZm ZXJlbnRseS4gQW5kDQogIGV2ZW50dWFsbHkgaGF2aW5nIHN1Y2ggYSBtb2RlbCBpcyBkZXNpcmFi bGUgaW4gYW55IGNhc2UsIGFzIGl0IGhlbHBzDQogIHBhcmFsbGVsaXppbmcgcHJvZ3JhbXMgKGZv ciBpbnN0YW5jZSB0aGUgRmlyZWZveCBwZW9wbGUgcmVwb3J0ZWQgdGhhdA0KICB0aGV5IGhhZCBh dHRlbXB0ZWQgYW5kIGZhaWxlZCB0d2ljZSB0byBwYXJhbGxlbGlzZSB0aGUgQ1NTIGVuZ2luZSBp bg0KICBDKysgYmVmb3JlIHN1Y2NlZWRpbmcgd2l0aCBSdXN0KS4gRnVydGhlcm1vcmUsIGluIGFu IGltYWdpbmFyeQ0KICByZXRyb2ZpdHRpbmcgb2YgYENvbmNNaW5vcicsIG9uZSBjb3VsZCBpbWFn aW5lIGVuZm9yY2luZyBzb21ldGhpbmcNCiAgbGlrZSB0aGUgYFNlbmQnIHRyYWl0IGF0IHRoZSBs ZXZlbCBvZiB0aGUgcmVhZCBiYXJyaWVyIHVudGlsIHRoZXJlIGlzDQogIGEgYmV0dGVyIHdheSAo dGhlcmUgd291bGQgYmUgdHdvIGtpbmRzIG9mIGJhcnJpZXJzLCBvbmUgb2Ygd2hpY2ggd291bGQN CiAgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGEgc3RhdGUgaGFwcGVuZWQgdG8gYmUgaW5jb3JyZWN0 bHkgc2hhcmVkIGFjcm9zcw0KICBkb21haW5zLCBhbmQgbm90IGJlIHJlcXVpcmVkIGluIHRoZSBG RkkpLg0KDQogIEkgZmluZCBgQ29uY01pbm9yJyBpbnRlcmVzdGluZyBmcm9tIGEgc3lzdGVtcyBw cm9ncmFtbWluZyBwZXJzcGVjdGl2ZQ0KICBjb21wYXJlZCB0byB0aGUgc3RvcC10aGUtd29ybGQg Y29sbGVjdG9yIGJlY2F1c2UgaXQgY291bGQgKEkgaG9wZSkNCiAgb2ZmZXIgcG9zc2liaWxpdGll cyBzdWNoIGFzIGhhdmluZyBhIGxvdy1sYXRlbmN5IGRvbWFpbiBjb21tdW5pY2F0aW5nDQogIHdp dGggYSBoaWdoZXItbGF0ZW5jeSBkb21haW4uIE1vcmVvdmVyIHRoZSBwZXJmb3JtYW5jZSBjb3N0 IG9mIHRoZQ0KICByZWFkIGJhcnJpZXIgbWlnaHQgYmUgbG93ZXIgaW4gdGhpcyBzY2hlbWUgaWYg aXQgY291bGQgYmUgcmVtb3ZlZCBmb3INCiAgYWxsIGJ1dCB0aGUgY29uY3VycmVudCBkYXRhIHN0 cnVjdHVyZXMuDQoNCg0KQkFQIDIuMS4wIFJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IFtodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWJhcC0yLTEtMC1yZWxlYXNlLzU5MDYvMV0NCg0KDQpJdmFuIEdv dG92Y2hpdHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgQ2FybmVnaWUg TWVsbG9uIFVuaXZlcnNpdHkgQmluYXJ5IEFuYWx5c2lzIFBsYXRmb3JtIChbQ01VIEJBUF0pIGlz DQogIGEgc3VpdGUgb2YgdXRpbGl0aWVzIGFuZCBsaWJyYXJpZXMgdGhhdCBlbmFibGVzIGFuYWx5 c2lzIG9mIHByb2dyYW1zDQogIHRoYXQgYXJlIHJlcHJlc2VudGVkIGFzIG1hY2hpbmUgY29kZSAo YWthIGJpbmFyaWVzKS4gQ01VIEJBUCBpcw0KICB3cml0dGVuIGluIE9DYW1sIGFuZCB1c2VzIHBs dWdpbi1iYXNlZCBhcmNoaXRlY3R1cmUgdG8gZW5hYmxlDQogIGV4dGVuc2liaWxpdHkuIFdlIGFs c28gaGF2ZSBhIGRvbWFpbi1zcGVjaWZpYyBsYW5ndWFnZSwgY2FsbGVkIFByaW11cw0KICBMaXNw LCB0aGF0IHdlIHVzZSB0byB3cml0ZSBhbmFseXNpcywgc3BlY2lmeSB2ZXJpZmljYXRpb24gY29u ZGl0aW9ucywNCiAgaW50ZXJhY3Qgd2l0aCB0aGUgYnVpbHQtaW4gU01UIHNvbHZlciwgYW5kIG1v ZGVsIHRoZSBzZW1hbnRpY3Mgb2YNCiAgbWFjaGluZSBpbnN0cnVjdGlvbnMgYW5kIGZ1bmN0aW9u cy4NCg0KICBUaGUgMi4xLjAgUmVsZWFzZSBpcyB2ZXJ5IHJpY2ggaW4gW25ldyBmZWF0dXJlc10g YnV0IHRoZSBtb3N0DQogIHByb21pbmVudCBhZGRpdGlvbiBpcyB0aGUgbmV3IFtzeW1ib2xpYyBl eGVjdXRvcl0gbW9kZSBmb3IgdGhlIFByaW11cw0KICBmcmFtZXdvcmsuIFdlIGFsc28gc2lnbmlm aWNhbnRseSB1cGRhdGVkIHRoZSBQcmltdXMgZnJhbWV3b3JrLA0KICBpbnRlZ3JhdGVkIGl0IHdp dGggb3VyIG5ldyBLbm93bGVkZ2UgQmFzZSwgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlDQog IEJBUCAyLjAgcmVsZWFzZTsgd2UgbWFkZSBvdXIgaW50ZXJwcmV0ZXIgbXVjaCBmYXN0ZXI7IHdl IGFkZGVkIHRoZQ0KICBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIGZhY2lsaXRpZXMsIGluc3BpcmVk IGJ5IENvbW1vbiBMaXNwOyBhbmQgd2UNCiAgaW1wbGVtZW50ZWQgYSBncmFkdWFsIHR5cGUgY2hl Y2tlciBmb3IgUHJpbXVzIExpc3Agd2l0aCB0eXBlDQogIGluZmVyZW5jZS4gV2UgYWxzbyBhZGRl ZCBhbiBhYmlsaXR5IHRvIHJlcHJlc2VudCBtYWNoaW5lIGluc3RydWN0aW9ucw0KICBhcyBpbnRy aW5zaWMgZnVuY3Rpb25zIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIHRoZWlyDQog IHNlbWFudGljcyB1c2luZyBQcmltdXMgTGlzcCBzaW5jZSB3ZSBhZGRlZCBJRUVFNzU0IHByaW1p dGl2ZXMgdG8gdGhlDQogIExpc3AgaW50ZXJwcmV0ZXIuDQoNCiAgQXMgdXN1YWwsIHdlIHVwZ3Jh ZGVkIEJBUCB0byB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIENvcmUgbGlicmFyeQ0KICBhbmQg T0NhbWwgKHdlIG5vdyBzdXBwb3J0IE9DYW1sIHZlcnNpb25zIGZyb20gNC4wNyB0byA0LjA5KS4g V2UgYWxzbw0KICBzaWduaWZpY2FudGx5IGltcHJvdmVkIG91ciBidWlsZCB0aW1lcyBhbmQgYWRk ZWQgYW4gb3B0aW9uYWwgb21ha2UNCiAgYmFja2VuZCwgd2hpY2ggd2UgYXJlIHVzaW5nIGluLWhv dXNlLg0KDQogIEZyb20gdGhlIHVzZXIgcGVyc3BlY3RpdmUsIG9uZSBvZiB0aGUga2V5IGZlYXR1 cmVzIG9mIEJBUCBhcyBhbg0KICBhbmFseXNpcyBwbGF0Zm9ybSBpcyB0aGF0IHlvdSBjYW4gcnVu IEJBUCBvbiBiaW5hcmllcyB0aGF0IHlvdSBjYW4ndA0KICBydW4gb3RoZXJ3aXNlLCBlaXRoZXIg YmVjYXVzZSB0aGV5IG5lZWQgc3BlY2lhbCBoYXJkd2FyZSBvciBzb2Z0d2FyZSwNCiAgb3IgbmVl ZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBvdXRzaWRlIHdvcmxkLiBJbiB0aGUgcGFzdCBjb3VwbGUg b2YNCiAgbW9udGhzLCB3ZSBoYXZlIHJ1biBCQVAgb24gdmFyaW91cyBmaXJtd2FyZSBhbmQgZm91 bmQgbnVtZXJvdXMNCiAgemVyby1kYXkgdnVsbmVyYWJpbGl0aWVzLCBwYXJ0aWN1bGFyLCB3ZSB3 ZXJlIGFibGUgdG8gZmluZCBjcml0aWNhbA0KICB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIFZ4V29y a3Mgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHJ1bnMgb24sDQogIHBvdGVudGlhbGx5LCBiaWxsaW9u cyBvZiBkZXZpY2VzIGluY2x1ZGluZyBtaXNzaW9uLWNyaXRpY2FsIGFuZA0KICBtaWxpdGFyeSBh cHBsaWFuY2VzLg0KDQogIEFzIGFsd2F5cywgcXVlc3Rpb25zLCBzdWdnZXN0aW9ucywgYW5kIG9w aW5pb25zIGFyZSB2ZXJ5IHdlbGNvbWUhDQoNCg0KW0NNVSBCQVBdIGh0dHBzOi8vZ2l0aHViLmNv bS9CaW5hcnlBbmFseXNpc1BsYXRmb3JtL2JhcA0KDQpbbmV3IGZlYXR1cmVzXQ0KaHR0cHM6Ly9n aXRodWIuY29tL0JpbmFyeUFuYWx5c2lzUGxhdGZvcm0vYmFwL3JlbGVhc2VzL3RhZy92Mi4xLjAN Cg0KW3N5bWJvbGljIGV4ZWN1dG9yXQ0KaHR0cHM6Ly9naXRodWIuY29tL0JpbmFyeUFuYWx5c2lz UGxhdGZvcm0vYmFwL3B1bGwvMTEwNQ0KDQoNCk1pZ3JhdGluZyBhbiBBc3luYyBwcm9qZWN0IHRv IEx3dCwgYSBzaG9ydCBwcmltZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWlncmF0aW5nLWFu LWFzeW5jLXByb2plY3QtdG8tbHd0LWEtc2hvcnQtcHJpbWVyLzU5MDgvMV0NCg0KDQpNaWNoYWVs IEJhY2FyZWxsYSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIENvbnNp ZGVyIHRoaXMgYSBwb3N0IHdoZXJlIEkgdGhpbmsgYWxvdWQgYWJvdXQgbXkgZXhwZXJpZW5jZSBt aWdyYXRpbmcNCiAgYW4gQXN5bmMgcHJvamVjdCB0byBMd3QuICBJJ3ZlIHNwZW50IGFib3V0IGEg d2Vla2VuZCBkb2luZyBzdWNoIGENCiAgdGhpbmcsIGFuZCBpZiwgaW4gdGhlIHByb2Nlc3Mgb2Yg dGFsa2luZyBhYm91dCBpdCBoZXJlIEkgY2FuIHNhdmUgYQ0KICBmZXcgcGVvcGxlIGFuIGhvdXIg b3IgdHdvIChvciBwZXJoYXBzIGluc3BpcmUgY29uZmlkZW5jZSB0byB0YWtlIHN1Y2gNCiAgYSBw cm9qZWN0IG9uIGluIHRoZSBmaXJzdCBwbGFjZSkgdGhlbiBpdCB3aWxsIGhhdmUgYmVlbiB3b3J0 aHdoaWxlLg0KDQogIFRoaXMgd291bGRuJ3QgYmUgYSBjb21wbGV0ZSBwb3N0IGlmIEkgZGlkbid0 IGFsc28gbWVudGlvbiBAZGtpbSdzDQogIFt0cmFuc2xhdGlvbiBvZiBSZWFsIFdvcmxkIE9DYW1s J3MgQXN5bmMgZXhhbXBsZXMgdG8gTHd0XQ0KDQogIFRoaXMgd2FzIGJvcm4gb3V0IG9mIGEgcHJl dmlvdXMgZWZmb3J0IHdoZXJlIEkgW3RyaWVkIHRvIG1peCBMd3QgYW5kDQogIEFzeW5jIGluIHRo ZSBzYW1lIHByb2plY3RdLiAgVGhpcyBkaWRuJ3QgZ28gc28gd2VsbCwgc28gSSB0cmllZA0KICBj b252ZXJ0aW5nIHRoZSB3aG9sZSB0aGluZyB0byBMd3QsIGFuZCBpdCB0dXJucyBvdXQgYWRhcHRp bmcgdG8gTHd0IGlmDQogIHlvdSdyZSBhbiBBc3luYyBwZXJzb24gaXMgYWN0dWFsbHkgbXVjaCBl YXNpZXIgdGhhbiBJIHRob3VnaHQgaXQgd291bGQNCiAgYmUuDQoNCg0KW3RyYW5zbGF0aW9uIG9m IFJlYWwgV29ybGQgT0NhbWwncyBBc3luYyBleGFtcGxlcyB0byBMd3RdDQpodHRwczovL2dpdGh1 Yi5jb20vZGtpbS9yd28tbHd0DQoNClt0cmllZCB0byBtaXggTHd0IGFuZCBBc3luYyBpbiB0aGUg c2FtZSBwcm9qZWN0XQ0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jlc3QtcHJhY3RpY2Vz LW9uLW1peGluZy1sd3QtYW5kLWFzeW5jLzUzNzINCg0KQmFzaWNzDQrilYzilYzilYzilYzilYzi lYwNCg0KICBCb3RoIGxpYnJhcmllcyBpbnZvbHZlIHByb21pc2VzL2Z1dHVyZXMuICBBc3luYyBj YWxscyBpdHMgcHJvbWlzZXMNCiAgYERlZmVycmVkLnQnLCB3aGVyZWFzIGluIEx3dCB0aGV5J3Jl IGNhbGxlZCBgTHd0LnQnLg0KDQogIEluIEFzeW5jIHlvdSBzdGFydCB5b3VyIHByb2dyYW0gYnkg c2F5aW5nIGBuZXZlcl9yZXR1cm5zIChTY2hlZHVsZXIuZ28NCiAgKCkpJyBvciBgQ29tbWFuZC5h c3luY19zcGVjJyBhZnRlciB5b3Ugc2V0IHVwIHlvdXIgaW5pdGlhbA0KICBgRGVmZXJyZWQudCcu DQoNCiAgSW4gTHd0IHlvdSBzYXkgYEx3dF9tYWluLnJ1bicgb24gYSB0b3AtbGV2ZWwgYEx3dC50 JyBhcmd1bWVudC4gIE5vdGUNCiAgeW91IGNhbiByZS1ydW4gYEx3dF9tYWluLnJ1bicgaW4gYSBz aW5nbGUgcHJvZ3JhbSBhcyBtYW55IHRpbWVzIGFzIHlvdQ0KICB3YW50LCBidXQgcGVyaGFwcyB5 b3Ugc2hvdWxkbid0IHJ1biBtdWx0aXBsZSBgTHd0X21haW4ucnVuJyBpbg0KICBwYXJhbGxlbC4N Cg0KICBUaGVyZSdzIGFuIGVhc3kgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBiYXNpYyBvcGVyYXRv cnMuDQoNCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQogICBB c3luYyAgICAgICAgICAgICAgICAgICAgICBMd3QgICAgICAgICAgICAgICAgICAgICANCiAg4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQogICBgRGVmZXJyZWQuYmlu ZCcgICAgICAgICAgICBgTHd0LmJpbmQnICAgICAgICAgICAgICANCiAgIGBEZWZlcnJlZC5yZXR1 cm4nICAgICAgICAgIGBMd3QucmV0dXJuJyAgICAgICAgICAgIA0KICAgYD4+PScgICAgICAgICAg ICAgICAgICAgICAgYD4+PScgICAgICAgICAgICAgICAgICAgDQogICBgRGVmZXJyZWQubWFwJyAg ICAgICAgICAgICBgTHd0Lm1hcCcgICAgICAgICAgICAgICANCiAgIGA+PnwnICAgICAgICAgICAg ICAgICAgICAgIGA+fD0nICAgICAgICAgICAgICAgICAgIA0KICAgYERlZmVycmVkLmRvbid0X3dh aXRfZm9yJyAgYEx3dC5hc3luYycgICAgICAgICAgICAgDQogICBgSW5fdGhyZWFkLnJ1bicgICAg ICAgICAgICBgTHd0X3ByZWVtcHRpdmUuZGV0YWNoJyANCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQoNCg0KU3RhcnZhdGlvbiB3b3JyaWVzDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgbW9z dCBpbXBvcnRhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIEFzeW5jIGFuZCBMd3QgaXMgdGhhdCAqZnVs ZmlsbGVkDQogIHByb21pc2VzIGFyZSBhY3RlZCBvbiBpbW1lZGlhdGVseSosIHdoZXJlYXMgQXN5 bmMga2luZGEgcHVudHMgdGhlbSB0bw0KICB0aGUgZW5kIG9mIGEgd29yayBxdWV1ZSBhbmQgcnVu cyB0aGVpciB0aHVua3MgbGF0ZXIuDQoNCiAgQSByZXR1cm4gbG9vcCBsaWtlIHRoaXMgc3RhcnZl cyB0aGUgcmVzdCBvZiBMd3Q6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIEx3dC5J bmZpeA0KICDilIIgDQogIOKUgiBsZXQgbWFpbiAoKSA9DQogIOKUgiAgIGxldCByZWMgbG9vcCAo KSA9DQogIOKUgiAgICAgTHd0LnJldHVybiAoKQ0KICDilIIgICAgID4+PSBmdW4gKCkgLT4NCiAg 4pSCICAgICBsb29wICgpDQogIOKUgiAgIGluDQogIOKUgiAgIEx3dC5hc3luYyAobG9vcCAoKSk7 DQogIOKUgiAgIEx3dF9pby5wcmludGxmICJ0aGlzIGxpbmUgbmV2ZXIgcHJpbnRzISINCiAg4pSC IDs7DQogIOKUgiANCiAg4pSCIGxldCAoKSA9IEx3dF9tYWluLnJ1biBtYWluIDs7DQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIHdoZXJlYXMgdGhlIGNvcnJlc3BvbmRpbmcgQXN5bmMgbG9vcCBkb2Vz IG5vdCBzdGFydmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuISBBc3luYw0KICDi lIIgDQogIOKUgiBsZXQgbWFpbiAoKSA9DQogIOKUgiAgIGxldCByZWMgbG9vcCAoKSA9DQogIOKU giAgICAgRGVmZXJyZWQucmV0dXJuICgpDQogIOKUgiAgICAgPj49IGZ1biAoKSAtPg0KICDilIIg ICAgIGxvb3AgKCkNCiAg4pSCICAgaW4NCiAg4pSCICAgZG9uJ3Rfd2FpdF9mb3IgKGxvb3AgKCkp Ow0KICDilIIgICBwcmludGYgInRoaXMgbGluZSBkb2VzIHByaW50IVxuIjsNCiAg4pSCICAgcmV0 dXJuICgpDQogIOKUgiA7Ow0KICDilIIgDQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBsZXQgY21k ID0gQ29tbWFuZC5hc3luY19zcGVjIH5zdW1tYXJ5OiIiIENvbW1hbmQuU3BlYy5lbXB0eSBtYWlu IGluDQogIOKUgiAgIENvbW1hbmQucnVuIGNtZA0KICDilIIgOzsNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgRm9ydHVuYXRlbHkgdGhlcmUncyBhIHdvcmthcm91bmQuIFlvdSBjYW4gZ2V0IHNvbWV0 aGluZyBjbG9zZXIgdG8gdGhlDQogIEFzeW5jLXN0eWxlIGJlaGF2aW9yIGluIEx3dCBieSB1c2lu ZyBgTHd0LnlpZWxkICgpJyBpbnN0ZWFkIG9mDQogIGBMd3QucmV0dXJuICgpJy4NCg0KDQpTcGF3 bmluZyB0aHJlYWRzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBGcm9tIHRpbWUgdG8gdGltZSB5b3UgbWF5IG5lZWQgdG8gcnVuIHNvbWV0aGlu ZyBpbiBhIHN5c3RlbSB0aHJlYWQuDQogIEluIEFzeW5jIHlvdSBzYXkgYEluX3RocmVhZC5ydW4n LCB3aGVyZWFzIGluIEx3dCB5b3Ugc2F5DQogIGBMd3RfcHJlZW1wdGl2ZS5kZXRhY2gnLiAgRm9y IHNpbXBsZSB0aGluZ3MgdGhleSdyZSBwcmV0dHkgbXVjaA0KICBpbnRlcmNoYW5nZWFibGUsIGJ1 dCBvbmUgc3R1bWJsaW5nIHBvaW50IGZvciBtZSB3YXMgdGhhdCBpbiBBc3luYyB5b3UNCiAgY2Fu IGNyZWF0ZSBhIG5hbWVkIHRocmVhZCBhbmQgYWx3YXlzIHVzZSB0aGF0IGZvciB0aGUgYEluX3Ro cmVhZC5ydW4nLA0KICB3aXRoIG11bHRpcGxlIHNpbXVsdGFuZW91cyBkaXNwYXRjaGVzIHRvIHRo YXQgdGhyZWFkIGJlY29taW5nDQogIHNlcXVlbmNlZC4NCg0KICBUaGlzIGlzIHJlYWxseSB1c2Vm dWwgZm9yIGludGVyYWN0aW5nIHdpdGggbGlicmFyaWVzIHRoYXQgYXJlbid0IHNvDQogIHRocmVh ZCBmcmllbmRseS4NCg0KICBMd3QncyBkZXRhY2ggZG9lc24ndCBwcm92aWRlIGFuIGVhc3kgd2F5 IHRvIGRvIHRoaXMgb3V0IG9mIHRoZSBib3gsDQogIGJ1dCBJIHRoaW5rIHlvdSBjYW4gc3RpbGwg ZGVhbCB3aXRoIHRocmVhZCB1bmZyaWVuZGx5IGxpYnJhcmllcyBieQ0KICB1c2luZyB0aGUgYEx3 dF9wcmVlbXB0aXZlLnJ1bl9pbl9tYWluJyBjYWxsLg0KDQogIEJhc2ljYWxseSwgbmV2ZXIgZXhp dCB0aGUgZGV0YWNoIHRocmVhZCB5b3Ugc3RhcnRlZCB0byBpbnRlcmFjdCB3aXRoDQogIHlvdXIg bGlicmFyeSwgYW5kIGluc3RlYWQgaGF2ZSBpdCBibG9jayBvbiBwcm9taXNlIHRoYXQgZ2V0cyBm aWxsZWQNCiAgdGhyb3VnaCBydW5faW5fbWFpbi4gIEluIHRoaXMgd2F5IHlvdSBjYW4gc2VxdWVu Y2UgeW91ciBkZXRhY2hlZCBMd3QNCiAgdGhyZWFkIHNpbWlsYXJseSB0byBBc3luYy4NCg0KICBI YXBweSB0byBleHBsYWluIGZ1cnRoZXIgaWYgdGhpcyBpcyB1bmNsZWFyLg0KDQoNCk90aGVyIGxp YnJhcmllcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgYEFzeW5jLlVuaXgnIGhhcyBhIHNvbWV3aGF0IGJ1aWx0LXVwIGNvbmNlcHRpb24gb2YgdGhl IFVOSVggQVBJLA0KICB3aGVyZWFzIGBMd3RfbWFpbicgaXMgbW9yZSBhIGRpcmVjdCBtYXBwaW5n IG9mIG9jYW1sJ3MgYFVuaXgnIG1vZHVsZQ0KICB0byBwcm9taXNlcy4NCg0KICBBc3luYyBgQ2xv Y2suZXZlcnknIGFuZCBgQ2xvY2suYWZ0ZXInIGRvbid0IGhhdmUgZXhhY3QgYW5hbG9ncywgYnV0 DQogIHlvdSBjYW4gbWFrZSBuZXcgdmVyc2lvbnMgcHJldHR5IHNpbXBseS4NCg0KICBFeGFtcGxl IG9mIGEgc2hhbGxvdyBpbWl0YXRpb24gb2YgQXN5bmMgYENsb2NrLmV2ZXJ5Jw0KICDilIzilIDi lIDilIDilIANCiAg4pSCIGxldCBldmVyeSBzcGFuIGYgPQ0KICDilIIgICBMd3QuYXN5bmMgKGZ1 biAoKSAtPg0KICDilIIgICAgIGxldCBzcGFuID0gVGltZS5TcGFuLnRvX3NlYyBzcGFuIGluDQog IOKUgiAgICAgbGV0IHJlYyBsb29wICgpID0NCiAg4pSCICAgICAgIGYgKCk7DQogIOKUgiAgICAg ICBMd3RfdW5peC5zbGVlcCBzcGFuDQogIOKUgiAgICAgICA+Pj0gZnVuICgpIC0+DQogIOKUgiAg ICAgICBsb29wICgpDQogIOKUgiAgICAgaW4NCiAg4pSCICAgICBsb29wICgpKQ0KICDilIIgOzsN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgKk9wZW4gcXVlc3Rpb25zKg0KDQogIEkgaGF2ZW4ndCBz b3J0ZWQgb3V0IGEgZ29vZCBMd3Qgc3Vic3RpdHV0ZSB0aGF0J3MgYXMgY29tZm9ydGFibGUgYXMN CiAgQXN5bmMgUGlwZSB5ZXQuICBUaG91Z2ggc29tZSBjb21iaW5hdGlvbiBvZiBMd3Rfc3RyZWFt LCBMd3Rfc2VxdWVuY2UNCiAgYW5kIGBsd3QtcGlwZScgbWlnaHQgZml0IHRoZSBiaWxsLiAgSWYg eW91IGp1c3QgaGFwcGVuIHRvIGtub3cgYWxyZWFkeQ0KICBmZWVsIGZyZWUgdG8gY2x1ZXBob25l Lg0KDQoNCkNsb3NpbmcgcmVtYXJrcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyBiYXNpY2FsbHkgZXZlcnl0aGluZz8gIEknbSBhbG1v c3Qgc3VzcGljaW91cyB0aGF0IEknbSBub3QNCiAgaGF2aW5nIG1vcmUgcHJvYmxlbXMsIGJ1dCB3 aWxsIGhhcHBpbHkgYWNjZXB0IGdyYWNlIHdoZW4gaXQgYXJpc2VzLg0KDQoNClJhcGhhw6tsIFBy b3VzdCB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEkgaGF2ZW7igJl0IHNv cnRlZCBvdXQgYSBnb29kIEx3dCBzdWJzdGl0dXRlIHRoYXTigJlzIGFzDQogICAgICAgIGNvbWZv cnRhYmxlIGFzIEFzeW5jIFBpcGUgeWV0LiBUaG91Z2ggc29tZSBjb21iaW5hdGlvbiBvZg0KICAg ICAgICBMd3Rfc3RyZWFtLCBMd3Rfc2VxdWVuY2UgYW5kIGBsd3QtcGlwZScgbWlnaHQgZml0IHRo ZQ0KICAgICAgICBiaWxsLiBJZiB5b3UganVzdCBoYXBwZW4gdG8ga25vdyBhbHJlYWR5IGZlZWwg ZnJlZSB0bw0KICAgICAgICBjbHVlcGhvbmUuDQoNCiAgVGhlIFRlem9zIHByb2plY3QgaGFzIGEg cGlwZS1saWtlIG1vZHVsZToNCiAgW2h0dHBzOi8vZ2l0bGFiLmNvbS90ZXpvcy90ZXpvcy8tL2Js b2IvbWFzdGVyL3NyYy9saWJfc3RkbGliL2x3dF9waXBlLm1saV0NCiAgSXQgaGFzbid0IGJlZW4g cmVsZWFzZWQgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkgKHlldCkgYnV0IGl0IGlzDQogIHJlbGVh c2VkIGFzIHBhcnQgb2YgdGhlIGB0ZXpvcy1zdGRsaWInIHBhY2thZ2UuDQoNCiAgSSBoYXZlbid0 IHVzZWQgQXN5bmMncyBwaXBlLCBzbyBJIGRvbid0IGtub3cgaG93IGNsb3NlIG9mIGEgbWF0Y2gg aXQNCiAgaXMuDQoNCg0Kam9zZSAwLjQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tam9zZS0wLTQt MC81OTA5LzFdDQoNCg0KVWxyaWsgU3RyaWQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBIG5ldyBy ZWxlYXNlIG9mIEpPU0UgaGFzIGJlZW4gcHVibGlzaGVkIHRvIG9wYW0NCg0KICBUaGUgZm9sbG93 aW5nIGNoYW5nZXMgaGFzIGJlZW4gbWFkZQ0KICDigKIgUkZDNzYzODogSW1wbGVtZW50IHRodW1i cHJpbnRzIEB1bmR1DQogIOKAoiBNYWtlIGtpZCBvcHRpb25hbCBpbiB0aGUgaGVhZGVyIGFuZCBq d2sgdG8gYWxpZ24gYmV0dGVyIHdpdGggdGhlDQogICAgc3BlYywgdGhpcyBpcyBhIGJyZWFraW5n IGNoYW5nZQ0KDQogIEkgaGF2ZSBzdGFydGVkIGRvZyBmb29kaW5nIHRoZSBsaWJyYXJ5IGZvciBh IE9wZW5JRCBDb25uZWN0IGNsaWVudA0KICB3aGljaCBob3BlZnVsbHkgd2lsbCBoZWxwIHdpdGgg dGhlIGRlc2lnbiBnb2luZyBmb3J3YXJkLg0KDQoNCk9DYW1sIDQuMTEuMCwgc2Vjb25kIGFscGhh IHJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMS0w LXNlY29uZC1hbHBoYS1yZWxlYXNlLzU5MTAvMV0NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBBIG5ldyBhbHBoYSB2ZXJzaW9uIG9mIE9DYW1sIDQuMTEuMCBoYXMgYmVlbiBwdWJsaXNo ZWQuICBDb21wYXJlZCB0bw0KICB0aGUgZmlyc3QgYWxwaGEgdmVyc2lvbiwgdGhpcyB2ZXJzaW9u IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbmV3IGJ1Zw0KICBmaXhlczoNCg0KICDigKIgKmFkZGl0 aW9uYWwgZml4ZXMqIFs2NjczXSwgWzExMzJdLCBbKzk2MTddOiBSZWxheCB0aGUgaGFuZGxpbmcg b2YNCiAgICAgZXhwbGljaXQgcG9seW1vcnBoaWMgdHlwZXMgKExlbyBXaGl0ZSwgcmV2aWV3IGJ5 IEphY3F1ZXMgR2FycmlndWUNCiAgICAgYW5kIEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgKmFk ZGl0aW9uYWwgZml4ZXMqIFs3MzY0XSwgWzIxODhdLCBbKzk1OTJdLCBbKzk2MDldOiBpbXByb3Zl bWVudCBvZg0KICAgICB0aGUgdW5ib3hhYmlsaXR5IGNoZWNrIGZvciB0eXBlcyB3aXRoIGEgc2lu Z2xlDQogICAgIGNvbnN0cnVjdG9yLiBNdXR1YWxseS1yZWN1cnNpdmUgdHlwZSBkZWNsYXJhdGlv bnMgY2FuIG5vdyBjb250YWluDQogICAgIHVuYm94ZWQgdHlwZXMuIFRoaXMgaXMgYmFzZWQgb24g dGhlIHBhcGVyDQogICAgIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTgxMS4wMjMwMF0NCg0KICDi gKIgWzc4MTddLCBbOTU0Nl06IFVuc291bmQgaW5jbHVzaW9uIGNoZWNrIGZvciBwb2x5bW9ycGhp YyB2YXJpYW50DQogICAgKEphY3F1ZXMgR2FycmlndWUsIHJlcG9ydCBieSBNaWtoYWlsIE1hbmRy eWtpbiwgcmV2aWV3IGJ5IEdhYnJpZWwNCiAgICBTY2hlcmVyKQ0KDQogIOKAoiBbOTU0OV0sIFs5 NTU3XTogTWFrZSAtZmxhcmdlLXRvYyB0aGUgZGVmYXVsdCBmb3IgUG93ZXJQQyBhbmQNCiAgICBp bnRyb2R1Y2UgLWZzbWFsbC10b2MgdG8gZW5hYmxlIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuIChE YXZpZA0KICAgIEFsbHNvcHAsIHJlcG9ydCBieSBOYXRoYW5pZWwgV2VzbGV5IEZpbGFyZG8sIHJl dmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFs5MzIwXSwgWzk1NTBdOiB1bmRlciBXaW5k b3dzLCBtYWtlIHN1cmUgdGhhdCB0aGUgVW5peC5leGVjKg0KICAgIGZ1bmN0aW9ucyBwcm9wZXJs eSBxdW90ZSB0aGVpciBhcmd1bWVudCBsaXN0cy4gKFhhdmllciBMZXJveSwgcmVwb3J0DQogICAg YnkgQW5kcsOpIE1hcm9uZXplLCByZXZpZXcgYnkgTmljb2zDoXMgT2plZGEgQsOkciBhbmQgRGF2 aWQgQWxsc29wcCkNCg0KICDigKIgWzk0OTBdLCBbOTUwNV06IGVuc3VyZSBwcm9wZXIgcm91bmRp bmcgb2YgZmlsZSB0aW1lcyByZXR1cm5lZCBieQ0KICAgIFVuaXguc3RhdCwgVW5peC5sc3RhdCwg VW5peC5mc3RhdC4gKFhhdmllciBMZXJveSBhbmQgR3VpbGxhdW1lDQogICAgTWVscXVpb25kLCBy ZXBvcnQgYnkgRGF2aWQgQnJvd24sIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIgYW5kDQogICAg RGF2aWQgQWxsc29wcCkNCg0KICDigKIgWzg2NzZdLCBbOTU5NF06IHR1cm4gZGVidWdnZXIgb2Zm IGluIHByb2dyYW1zIGxhdW5jaGVkIGJ5IHRoZQ0KICAgIHByb2dyYW0gYmVpbmcgZGVidWdnZWQg KFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IE1pY2hhZWwgU29lZ3Ryb3AsDQogICAgcmV2aWV3IGJ5 IEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgWzk1NTJdOiByZXN0b3JlIG9jYW1sb3B0cCBidWls ZCBhbmQgaW5zdGFsbGF0aW9uIChGbG9yaWFuIEFuZ2VsZXR0aSwNCiAgICByZXZpZXcgYnkgRGF2 aWQgQWxsc29wcCBhbmQgWGF2aWVyIExlcm95KQ0KDQogIOKAoiBbNzcwOF0sIFs5NTgwXTogRW5z dXJlIFN0ZGxpYiBkb2N1bWVudGF0aW9uIGluZGV4IHJlZmVycyB0bw0KICAgIFN0ZGxpYi4gKFN0 ZXBoZW4gRG9sYW4sIHJldmlldyBieSBGbG9yaWFuIEFuZ2VsZXR0aSwgcmVwb3J0IGJ5DQogICAg SGFubmVzIE1laG5lcnQpDQoNCiAg4oCiIFs5MTg5XSwgWzkyODFdOiBmaXggYSBjb25mbGljdCB3 aXRoIEdlbnRvbyBidWlsZCBzeXN0ZW0gYnkgcmVtb3ZpbmcNCiAgICBhbiBvbmUtbGV0dGVyIE1h a2VmaWxlIHZhcmlhYmxlLiAoRmxvcmlhbiBBbmdlbGV0dGksIHJlcG9ydCBieSBSYWxwaA0KICAg IFNlaWNodGVyLCByZXZpZXcgYnkgRGF2aWQgQWxsc29wcCBhbmQgRGFtaWVuIERvbGlnZXopDQoN CiAgVGhlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gT1BBTSBzd2l0Y2ggd2l0aCBv bmUgb2YgdGhlDQogIGZvbGxvd2luZyBjb21tYW5kcw0KICDilIzilIDilIDilIDilIANCiAg4pSC IG9wYW0gc3dpdGNoIGNyZWF0ZSBvY2FtbC12YXJpYW50cy40LjExLjArYWxwaGEyIC0tcmVwb3Np dG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJl dGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIG9yDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCthbHBo YTIrPFZBUklBTlQ+IC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSA DQogIHdoZXJlIDxWQVJJQU5UPiBpcyByZXBsYWNlZCB3aXRoIG9uZSBvZiB0aGVzZTogYWZsLCBm bGFtYmRhLCBmcCwNCiAgZnArZmxhbWJkYQ0KDQogIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGFs cGhhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJlc3NlczoNCg0KICDigKIgW2h0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEuMCthbHBoYTIudGFyLmd6XQ0K ICDigKIgW2h0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC00LjExL29jYW1s LTQuMTEuMCthbHBoYTIudGFyLmd6XQ0KDQogIElmIHlvdSBmaW5kIGFueSBidWdzLCBwbGVhc2Ug cmVwb3J0IHRoZW0gaGVyZToNCiAgIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzXQ0KDQoNCls2NjczXSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzY2 NzMNCg0KWzExMzJdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEzMg0K DQpbKzk2MTddIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTYxNw0KDQpb NzM2NF0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy83MzY0DQoNClsyMTg4 XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzIxODgNCg0KWys5NTkyXSBo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1OTINCg0KWys5NjA5XSBodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk2MDkNCg0KWzc4MTddIGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvNzgxNw0KDQpbOTU0Nl0gaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NTQ2DQoNCls5NTQ5XSBodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1NDkNCg0KWzk1NTddIGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvOTU1Nw0KDQpbOTMyMF0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlcy85MzIwDQoNCls5NTUwXSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzk1NTANCg0KWzk0OTBdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvOTQ5MA0KDQpbOTUwNV0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy85NTA1DQoNCls4Njc2XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzg2 NzYNCg0KWzk1OTRdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTU5NA0K DQpbOTU1Ml0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NTUyDQoNCls3 NzA4XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzc3MDgNCg0KWzk1ODBd IGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTU4MA0KDQpbOTE4OV0gaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85MTg5DQoNCls5MjgxXSBodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzkyODENCg0KDQpPQ2FtbCBXb3Jrc2hvcCAy MDIwOiBDYWxsIGZvciBWb2x1bnRlZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjAtY2FsbC1mb3Itdm9sdW50 ZWVycy81OTEzLzFdDQoNCg0KSXZhbiBHb3RvdmNoaXRzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgVGhlIE9DYW1sIFdvcmtzaG9wIHdpbGwgYmUgaGVsZCBpbiB0aGUgdmlydHVh bCBmb3JtYXQgdGhpcyB5ZWFyLCB3aGljaA0KICBwb3NlcyBuZXcgY2hhbGxlbmdlcyBhbmQgcmVx dWlyZXMgcGVvcGxlIHdpdGggc3BlY2lhbCB0YWxlbnRzIGFuZA0KICB0cmFpbmluZy4gVGhlIE9y Z2FuaXppbmcgQ29tbWl0dGVlIGlzIHNlZWtpbmcgZm9yIG1lbWJlcnMgd2hvIHdpbGwNCiAgdm9s dW50ZWVyIHRvIGZpbGwgb25lIChvciBtb3JlKSBvZiB0aGUgZm9sbG93aW5nIHJvbGVzOg0KDQog IDEuIEFWIEVkaXRvcg0KICAyLiBTZXNzaW9uIEhvc3QNCiAgMy4gVHJhbnNjcmliZXJzL0ludGVy cHJldGVyDQogIDQuIENvbnRlbnQgTWFuYWdlcg0KICA1LiBBY2Nlc3NpYmlsaXR5IENoYWlyDQoN CiAgVGhlIHJvbGVzIGFyZSBkZXNjcmliZWQgaW4gZGV0YWlscyBiZWxvdy4gV2UgYXJlIGFza2lu ZyBwcm9zcGVjdGl2ZQ0KICBPcmdhbml6aW5nIENvbW1pdHRlZSBtZW1iZXJzIHRvIGNvbnRhY3Qg dGhlIE9yZ2FuaXppbmcgQ29tbWl0dGVlIGNoYWlyDQogIChbaXZnQGllZWUub3JnXShbbWFpbHRv Oml2Z0BpZWVlLm9yZ10pKSwgaW5kaWNhdGluZyB3aGljaCByb2xlKHMpIHRoZXkNCiAgYXJlIHJl YWR5IHRvIHRha2UuDQoNCg0KW0FWIEVkaXRvcl0NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIEFWIChBdWRpby9WaWRlbykgZWRpdG9ycyBhcmUgcmVzcG9uc2libGUgZm9y IHByZXZpZXdpbmcgdGhlDQogIHByZXNlbnRhdGlvbnMgYW5kIHByb3ZpZGluZyBoZWxwIGFuZCBm ZWVkYmFjayB0byB0aGUgYXV0aG9ycy4gSWRlYWxseQ0KICB3ZSB0YXJnZXQgZm9yIG9uZSBlZGl0 b3IgcGVyIHRhbGsuDQoNCg0KW0FWIEVkaXRvcl0gaHR0cHM6Ly9pY2ZwMjAuc2lncGxhbi5vcmcv aG9tZS9vY2FtbC0yMDIwI2F2LWVkaXRvcg0KDQril4ogW0R1dGllc10NCg0KICDigKIgUHJldmll dyBhbmQgKGlmIG5lY2Vzc2FyeSkgcG9zdC1wcm9jZXNzIG9yIChhc2sgdGhlIGF1dGhvciB0byBz aG9vdA0KICAgIGFnYWluKSB0aGUgcHJlLXJlY29yZGVkIHZpZGVvcy4NCiAg4oCiIEFkdmlzZSBh dXRob3JzIGFuZCBoZWxwIGluIGNob2ljZSBvZiBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUsIHRlYWNo DQogICAgaG93IHRvIHNldCB1cCB0aGUgY2FtZXJhLCBsaWdodCwgbWFrZSBzdXJlIHRoYXQgdGhl IGF1ZGlvIGlzIG9mIGdvb2QNCiAgICBxdWFsaXR5IGFuZCwgaW4gZ2VuZXJhbCwgY2hhbm5lbCBv dXIgcXVhbGl0eSBndWlkZWxpbmVzLg0KICDigKIgRW5zdXJlIHRoYXQgYWxsIHZpZGVvcyBhcmUg b2YgdGhlIHNhbWUgcXVhbGl0eSwgdGhlIGF1ZGlvIGxldmVscyBhcmUNCiAgICB0aGUgc2FtZSwg YW5kIHRoYXQgZXZlcnl0aGluZyBpcyBsb3VkIGFuZCBjbGVhci4NCg0KDQogIFtEdXRpZXNdIGh0 dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNkdXRpZXMNCg0KDQpbU2Vz c2lvbiBIb3N0c10NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFNlc3Npb24gaG9zdHMgd2lsbCBhc3Npc3Qgc2Vzc2lvbiBjaGFpcnMgaW4gc3RyZWFt aW5nIHRoZSBwcmUtcmVjb3JkZWQNCiAgdmlkZW9zIGFzIHdlbGwgYXMgaGVscGluZyBhbmQgbW9k ZXJhdGluZyB0aGUgUSZBIHNlc3Npb25zIGFuZCB0aGUNCiAgcGFuZWwgc2Vzc2lvbi4gVGhleSB3 aWxsIGFsc28gYmUgcmVzcG9uc2libGUgZm9yIHNlY3VyaXR5IGFuZCBiZSByZWFkeQ0KICB0byBy ZWFjdCB0byBwb3RlbnRpYWwgdGhyZWF0cyBhbmQgd3Jvbmdkb2Vycy4gU2luY2Ugd2Ugd2lsbCBi cm9hZGNhc3QNCiAgc2Vzc2lvbnMgaW4gc2V2ZXJhbCB0aW1lIHpvbmVzIHdlIG5lZWQgc2V2ZXJh bCBob3N0cyBmb3IgZWFjaCBzZXNzaW9uLg0KDQoNCltTZXNzaW9uIEhvc3RzXSBodHRwczovL2lj ZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjc2Vzc2lvbi1ob3N0cw0KDQril4ogW0R1 dGllc10NCg0KICDigKIgTW9kZXJhdGluZyB0aGUgdGV4dCBjaGF0cw0KICDigKIgQ29udHJvbGxp bmcgbWljcm9waG9uZXMgaW4gdGhlIHZpZGVvLWNvbmZlcmVuY2luZw0KICDigKIgV2F0Y2hpbmcg Zm9yIHRoZSB0aW1lDQogIOKAoiBQZXJmb3JtaW5nIHNvdW5kIGNoZWNrcw0KICDigKIgV2VsY29t aW5nIGFuZCBvdGhlcndpc2UgZ3VpZGluZyBwYXJ0aWNpcGFudHMNCg0KDQogIFtEdXRpZXNdIGh0 dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNkdXRpZXMNCg0KDQpbVHJh bnNjcmliZXJzIC8gSW50ZXJwcmV0ZXJzXQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgV2Ugd291bGQgbGlrZSB0byBoYXZlIGF0IGxlYXN0IEVuZ2xpc2ggdHJhbnNjcmlwdGlv bnMgZm9yIGVhY2ggdGFsaw0KICBhbmQgdHJhbnNsYXRpb25zIHRvIG90aGVyIGxhbmd1YWdlcyBh cmUgdmVyeSB3ZWxjb21lLiBUcmFuc2NyaXB0aW9ucw0KICBlbmFibGUgYWNjZXNzaWJpbGl0eSBh cyB3ZWxsIGFzIHBvdGVudGlhbGx5IGluY3JlYXNlIHRoZSBhdWRpZW5jZSBhbmQNCiAgcHVibGlj aXR5IGFzIHRoZXkgY291bGQgYmUgaW5kZXhlZCBieSB0aGUgc2VhcmNoIGVuZ2luZXMuDQoNCg0K W1RyYW5zY3JpYmVycyAvIEludGVycHJldGVyc10NCmh0dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3Jn L2hvbWUvb2NhbWwtMjAyMCN0cmFuc2NyaWJlcnMtaW50ZXJwcmV0ZXJzDQoNCuKXiiBbRHV0aWVz XQ0KDQogIOKAoiBDcmVhdGUgdHJhbnNjcmlwdGlvbnMgZm9yIHZpZGVvcywgcG90ZW50aWFsbHkg aW4gb3RoZXIgbGFuZ3VhZ2VzLg0KDQoNCiAgW0R1dGllc10gaHR0cHM6Ly9pY2ZwMjAuc2lncGxh bi5vcmcvaG9tZS9vY2FtbC0yMDIwI2R1dGllcw0KDQoNCltDb250ZW50IE1hbmFnZXJdDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUg Y29udGVudCBtYW5hZ2VyIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSB3 ZWINCiAgcHJlc2VuY2Ugb2YgdGhlIGNvbmZlcmVuY2Ugb24gW2h0dHBzOi8vb2NhbWwub3JnL10u IFdlIHBsYW4gdG8gaGF2ZQ0KICBhbGwgdmlkZW9zIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBtYWlu dGFpbiBhIHBhZ2UgZm9yIGVhY2ggc3VibWl0dGVkDQogIHdvcmsuDQoNCg0KW0NvbnRlbnQgTWFu YWdlcl0NCmh0dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNjb250ZW50 LW1hbmFnZXINCg0KDQpbQWNjZXNzaWJpbGl0eSBDaGFpcl0NCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIGFyZSBz dHJpdmluZyB0byBtYWtlIHRoZSBjb25mZXJlbmNlIGFjY2Vzc2libGUgdG8gZXZlcnlvbmUgYW5k IHdlDQogIGFyZSBsb29raW5nIGZvciB2b2x1bnRlZXJzIHdobyBoYXZlIGV4cGVyaWVuY2UgaW4g b25saW5lDQogIGFjY2Vzc2liaWxpdHkuDQoNCg0KW0FjY2Vzc2liaWxpdHkgQ2hhaXJdDQpodHRw czovL2ljZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjYWNjZXNzaWJpbGl0eS1jaGFp cg0KDQril4ogW0R1dGllc10NCg0KICDigKIgSGVscGluZyB3aXRoIHRoZSBzZWxlY3Rpb24gb2Yg YWNjZXNzaWJsZSBwbGF0Zm9ybXMgYW5kIHRvb2xzLg0KICDigKIgV29ya2luZyB3aXRoIGF0dGVu ZGVlcyB0byBlbnN1cmUgdGhlIG5lY2Vzc2FyeSBhY2Nlc3Mgc2VydmljZXMgYXJlDQogICAgaW5j bHVkZWQuDQogIOKAoiBFc3RhYmxpc2hpbmcgYmVzdCBwcmFjdGljZXMgZm9yIHByZXBhcmluZyBh bmQgcnVubmluZyBhY2Nlc3NpYmxlDQogICAgc2Vzc2lvbnMuDQoNCg0KICBbRHV0aWVzXSBodHRw czovL2ljZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjZHV0aWVzDQoNCg0KSW50cm9k dWN0aW9uIHRvIEx3dA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9pbnRyb2R1Y3Rpb24tdG8tbHd0LzU5NDAvMV0NCg0KDQpSYXBoYcOrbCBQcm91c3QgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHB1Ymxpc2hlZA0KICBbaHR0cHM6Ly9yYXBo YWVsLXByb3VzdC5naXRodWIuaW8vY29kZS9sd3QtcGFydC0xLmh0bWxdLCBhIDItcGFydA0KICBp bnRyb2R1Y3Rpb24gdG8gTHd0Lg0KDQogIFRoZSBtYWluIGFpbSBvZiB0aGUgaW50cm9kdWN0aW9u IGlzIHRvIGdpdmUgYSBnb29kIG1lbnRhbCBtb2RlbCBvZg0KICB3aGF0IHByb21pc2VzIGFyZSwg aG93IHRoZXkgYmVoYXZlIGFuZCBob3cgdG8gdXNlIHRoZW0uIEl0IGFzc3VtZXMNCiAgYmFzaWMg ZmFtaWxpYXJpdHkgd2l0aCBPQ2FtbC4NCg0KICBEb24ndCBoZXNpdGF0ZSB0byBhc2sgcXVlc3Rp b25zIG9yIHNoYXJlIGZlZWRiYWNrLg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNv cmUgcGxhbmV0IGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhl cmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQ bGFuZXRdLg0KDQogIOKAoiBbVXNpbmcgQVNDSUkgd2F2ZWZvcm1zIHRvIHRlc3QgaGFyZHdhcmUg ZGVzaWduc10NCg0KDQpbT0NhbWwgUGxhbmV0XSBodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9w bGFuZXQvDQoNCltVc2luZyBBU0NJSSB3YXZlZm9ybXMgdG8gdGVzdCBoYXJkd2FyZSBkZXNpZ25z XQ0KaHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3VzaW5nLWFzY2lpLXdhdmVmb3Jtcy10by10 ZXN0LWhhcmR3YXJlLWRlc2lnbnMvDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVz c2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoNClt0aGUg YXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzDQoN CltvbmxpbmVdIGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWts eS8NCg0KW0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0KDQo= --=-=-= 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 June 02 to 09, 2020.

Multicore Update: April 2020, with a = preprint paper

Continuing this thread, Daniel B=C3=BCnzli asked and = KC Sivaramakrishnan replied

One thing that I didn=E2=80=99t get from the paper is how exactly Co= ncurMinor breaks the current FFI and the impact it would have on the existing eco-system, on a scale from =E2=80=9Cit affect a= ll projects=E2=80=9D to =E2=80=9Conly people doing that fancy thing=E2=80=9D :=E2=80=93) ?

All the projects that use the C API. The details are here: https://github.com/ocaml-multicore/ocaml-multicore/wiki/C-API-change= s

At the end of the paper it seems you make the point that ParMinor is the solution to go with for the time being. Does this means you are going to leave behind the work done on ConcurMinor or do you intend to continue to maintain it ?

We don't intend to maintain it. It is quite a bit of work to maintain and p= ort the changes across two different GCs. ParMinor GC is now at 4.11 branch point (the default multicore= compiler is 4.10 + ParMinor now). The ConcMinor is at 4.06.1.

Given that ConcMinor breaks the C API, the ecosystem would hav= e to be fixed for ConcMinor to be useful. The code changes are indeed intricate; the differences are not just in the minor GC,= but the compilers internal use of the C API. It will be quite a bit of work to keep both GCs in the same source dis= tribution.

Guillaume Munch-Maccagnoni then said

Given that ConcMinor breaks the C API, the ecosystem would hav= e to be fixed for ConcMinor to be useful.

I do not think this is necessarily true.

Here is why I think so, but be warned that this is preliminary as I do not = have time to explore this idea further on my own at the moment.

State in Rust

Breaking the C API is a consequence of deciding that all single-threaded sh= ared mutable state must assume they are also shared between threads. So a new read barrier is used to promote value= s when read from another thread. But for data types that were correct up to now, users must also be careful to avoid= races from now on… for instance by avoiding sharing values of such types between domains.

One lesson of Rust is that there are different kinds of mutable state, for = different usages, with different means to achieve thread-safety.

The closest there is to current OCaml's mutable is the notion = of single-threaded multiple-writers mutable state (Cell). It is made thread-saf= e in Rust by statically preventing values containing Cell from= crossing thread boundaries (by virtue of not having the Sen= d trait). The same restriction is used to make some data stru= ctures more efficient by avoiding the cost of synchronisation (cf. the reference-c= ounting pointer Rc vs. the atomic reference-counting pointer Arc).

This is not enough by itself, and Rust offers other kinds of state for comm= unicating and sharing values between threads.

UnsafeCell like Ocaml multico= re's mutable (though yours is safe thanks to the work on the m= emory model): it has almost no restriction and can be sent across domains, but the user is likew= ise told to =E2=80=9Cavoid data races=E2=80=9D. It is rarely used alone, but together with type abstraction it can be used to pro= gram safe concurrent data structures.

Lastly, the default notion of state in Rust is linear state, which can be s= ent freely across threads. Thread-safety is ensured by restricting aliasing using the ownership and borrowing discip= line.

A backwards-compatible concurrent collector?

If I had to imagine a backwards-compatible OCaml with static control of int= erference =C3=A0 la Rust based on ConcMinor, it would distinguish the three kinds of state (concretely with other keywor= ds in addition to mutable). mutable would keep its current meaning of single-domain, multiple-writers state and= not require a read barrier, and in particular preserve the API. (I count systhreads as single-threaded for thi= s purpose, since here it means "sharing the same minor heap".)

Programs could progressively transition to other kinds of state when parall= elising the program. Concretely, a data structure like Stack.t, instead of becoming racy, would keep i= ts current meaning, but users could replace it with a linear stack or a concurrent stack, two data structures distinct from the f= irst one, when parallelizing their programs.

So how could this fit with the current plans? It is not entirely clear to m= e. If people start to rely on parallelism in an unstructured way (e.g. no clear distinction between different kinds o= f data types arising from different ways of ensuring thread-safety) then one will also lose the ability to retrofit = ConcMinor in a backwards-compatible manner (by losing the information that the current mutable API= is single-threaded). The API breakage of ConcMinor which might only be virtual right now (if I trust this preliminary, not ful= ly-explored idea) will become real. (Further difficulties arise with the emulation of the Thread l= ibrary with domains, but this could be changed later.)

But if users are provided in advance with a general direction for a model o= f control of interference this might happen differently. And eventually having such a model is desirable in any = case, as it helps parallelizing programs (for instance the Firefox people reported that they had attempted and faile= d twice to parallelise the CSS engine in C++ before succeeding with Rust). Furthermore, in an imaginary retrofitting= of ConcMinor, one could imagine enforcing something like the Send trait at the level of the re= ad barrier until there is a better way (there would be two kinds of barriers, one of which would raise an exception if a state = happened to be incorrectly shared across domains, and not be required in the FFI).

I find ConcMinor interesting from a systems programming perspe= ctive compared to the stop-the-world collector because it could (I hope) offer possibilities such as having a low-latency = domain communicating with a higher-latency domain. Moreover the performance cost of the read barrier might be lower in= this scheme if it could be removed for all but the concurrent data structures.

BAP 2.1.0 Release

Ivan Gotovchits announced

The Carnegie Mellon University Binary Analysis Platform (CMU BAP) is a suite of utilitie= s and libraries that enables analysis of programs that are represented as machine code (aka bina= ries). CMU BAP is written in OCaml and uses plugin-based architecture to enable extensibility. We also have a doma= in-specific language, called Primus Lisp, that we use to write analysis, specify verification conditions, interact wi= th the built-in SMT solver, and model the semantics of machine instructions and functions.

The 2.1.0 Release is very rich in new features but the most prominen= t addition is the new symbolic executor mode for the Primus framework. We also significantly updated the Primus fra= mework, integrated it with our new Knowledge Base, which was introduced in the BAP 2.0 release; we made our in= terpreter much faster; we added the systems and components facilities, inspired by Common Lisp; and we implemen= ted a gradual type checker for Primus Lisp with type inference. We also added an ability to represent machine instruct= ions as intrinsic functions so now it is possible to express their semantics using Primus Lisp since we added IEEE75= 4 primitives to the Lisp interpreter.

As usual, we upgraded BAP to the newer versions of the Core library and OCa= ml (we now support OCaml versions from 4.07 to 4.09). We also significantly improved our build times and added an = optional omake backend, which we are using in-house.

>>From the user perspective, one of the key features of BAP as an analysis pl= atform is that you can run BAP on binaries that you can't run otherwise, either because they need special hardware or = software, or need to interact with the outside world. In the past couple of months, we have run BAP on various fir= mware and found numerous zero-day vulnerabilities, particular, we were able to find critical vulnerabilities = in the VxWorks operating system that runs on, potentially, billions of devices including mission-critical and militar= y appliances.

As always, questions, suggestions, and opinions are very welcome!

Migrating an Async project to Lwt, a = short primer

Michael Bacarella announced

Consider this a post where I think aloud about my experience migrating an A= sync project to Lwt. I've spent about a weekend doing such a thing, and if, in the process of talking about it here= I can save a few people an hour or two (or perhaps inspire confidence to take such a project on in the first place= ) then it will have been worthwhile.

This wouldn't be a complete post if I didn't also mention @dkim's translation of Real World OCaml's Asyn= c examples to Lwt

This was born out of a previous effort where I tried to mix Lwt an= d Async in the same project. This didn't go so well, so I tried converting the whole thing to Lwt, and it turns out adapting to Lwt i= f you're an Async person is actually much easier than I thought it would be.

Basics

Both libraries involve promises/futures. Async calls its promises Deferred.t, whereas in Lwt they're called Lwt.t.

In Async you start your program by saying never_returns (Scheduler.go= ()) or Command.async_spec after you set up your initial Deferred.t.

In Lwt you say Lwt_main.run on a top-level Lwt.t = argument. Note you can re-run Lwt_main.run in a single program as many times as you w= ant, but perhaps you shouldn't run multiple Lwt_main.run in parallel.

There's an easy correspondence between basic operators.

Async Lwt
Deferred.bind Lwt.bind
Deferred.return Lwt.return
>>=3D >>=3D
Deferred.map Lwt.map
>>| >|=3D
Deferred.don't_wait_for Lwt.async
In_thread.run Lwt_preemptive.detach

Starvation worries

The most important difference between Async and Lwt is that fulfilled pr= omises are acted on immediately, whereas Async kinda punts them to the end of a work queue and runs their thunks lat= er.

A return loop like this starves the rest of Lwt:

open Lwt.Infix

let main () =3D
  let rec loop () =3D
    Lwt.return ()
    >>=3D fun () ->
    loop ()
  in
  Lwt.async (loop ());
  Lwt_io.printlf "this line never prints!"
;;

let () =3D Lwt_main.run main ;;

whereas the corresponding Async loop does not starve:

open! Async

let main () =3D
  let rec loop () =3D
    Deferred.return ()
    >>=3D fun () ->
    loop ()
  in
  don't_wait_for (loop ());
  printf "this line does print!\n";
  return ()
;;

let () =3D
  let cmd =3D Command=
.async_spec ~summary:"" Command.S=
pec.empty main in=

  Command.run cmd
;;

Fortunately there's a workaround. You can get something closer to the Async= -style behavior in Lwt by using Lwt.yield () instead of = Lwt.return ().

Spawning threads

>>From time to time you may need to run something in a system thread. In As= ync you say In_thread.run, whereas in Lwt you say Lwt_preemptive.detach. For simple things they're = pretty much interchangeable, but one stumbling point for me was that in Async you can create a named thread and always use that = for the In_thread.run, with multiple simultaneous dispatches to that thread becoming sequenced.

This is really useful for interacting with libraries that aren't so thread = friendly.

Lwt's detach doesn't provide an easy way to do this out of the box, but I t= hink you can still deal with thread unfriendly libraries by using the Lwt_preemptive.run_in_main c= all.

Basically, never exit the detach thread you started to interact with your l= ibrary, and instead have it block on promise that gets filled through run_in_main. In this way you can sequence= your detached Lwt thread similarly to Async.

Happy to explain further if this is unclear.

Other libraries

Async.Unix has a somewhat built-up conception of the UNIX API,= whereas Lwt_main is more a direct mapping of ocaml's Unix= module to promises.

Async Clock.every and Clock.after don't have exac= t analogs, but you can make new versions pretty simply.

Example of a shallow imitation of Async Clock.every

let every span f =3D
  Lwt.async (fun () ->
    let span =3D Time=
.Span.to_sec span in
    let rec loop () =3D
      f ();
      Lwt_unix.sleep span
      >>=3D fun () ->
      loop ()
    in
    loop ())
;;

Open questions

I haven't sorted out a good Lwt substitute that's as comfortable as Async P= ipe yet. Though some combination of Lwt_stream, Lwt_sequence and lwt-pipe might fit the bill. If= you just happen to know already feel free to cluephone.

Closing remarks

This is basically everything? I'm almost suspicious that I'm not having mo= re problems, but will happily accept grace when it arises.

Rapha=C3=ABl Proust then said

I haven=E2=80=99t sorted out a good Lwt substitute that=E2=80=99s as comfor= table as Async Pipe yet. Though some combination of Lwt_stream, Lwt_sequence and lwt-pipe might fit the bill. If y= ou just happen to know already feel free to cluephone.

The Tezos project has a pipe-like module: https://gitlab.com/tezo= s/tezos/-/blob/master/src/lib_stdlib/lwt_pipe.mli It hasn't been released as a standalone library (yet) but it is released as= part of the tezos-stdlib package.

I haven't used Async's pipe, so I don't know how close of a match it is.

jose 0.4.0

Ulrik Strid announced

A new release of JOSE has been published to opam

The following changes has been made

  • RFC7638: Implement thumbprints @undu
  • Make kid optional in the header and jwk to align better with the spec, = this is a breaking change

I have started dog fooding the library for a OpenID Connect client which ho= pefully will help with the design going forward.

OCaml 4.11.0, second alpha release

octachron announced

A new alpha version of OCaml 4.11.0 has been published. Compared to the first alpha version, this version contains the following ne= w bug fixes:

  • additional fixes 6673, 11= 32, +9617: R= elax the handling of explicit polymorphic types (Leo White, review by Jacqu= es Garrigue and Gabriel Scherer)
  • additional fixes 7364, 21= 88, +9592, <= a href=3D"https://github.com/ocaml/ocaml/issues/9609">+9609: improvemen= t of the unboxability check for types with a single constructor. Mutually-r= ecursive type declarations can now contain unboxed types. This is based on = the paper https://arxiv.org/ab= s/1811.02300
  • 7817, 9546: Unsound inclusio= n check for polymorphic variant (Jacques Garrigue, report by Mikhail Mandry= kin, review by Gabriel Scherer)
  • 9549, 9557: Make -flarge-toc= the default for PowerPC and introduce -fsmall-toc to enable the previous b= ehaviour. (David Allsopp, report by Nathaniel Wesley Filardo, review by Xav= ier Leroy)
  • 9320, 9550: under Windows, m= ake sure that the Unix.exec* functions properly quote their argument lists.= (Xavier Leroy, report by Andr=C3=A9 Maroneze, review by Nicol=C3=A1s Ojeda= B=C3=A4r and David Allsopp)
  • 9490, 9505: ensure proper ro= unding of file times returned by Unix.stat, Unix.lstat, Unix.fstat. (Xavier= Leroy and Guillaume Melquiond, report by David Brown, review by Gabriel Sc= herer and David Allsopp)
  • 8676, 9594: turn debugger of= f in programs launched by the program being debugged (Xavier Leroy, report = by Michael Soegtrop, review by Gabriel Scherer)
  • 9552: restor= e ocamloptp build and installation (Florian Angeletti, review by David Alls= opp and Xavier Leroy)
  • 7708, 9580: Ensure Stdlib do= cumentation index refers to Stdlib. (Stephen Dolan, review by Florian Angel= etti, report by Hannes Mehnert)
  • 9189, 9281: fix a conflict w= ith Gentoo build system by removing an one-letter Makefile variable. (Flori= an Angeletti, report by Ralph Seichter, review by David Allsopp and Damien = Doligez)

The compiler can be installed as an OPAM switch with one of the following c= ommands

opam switch create ocaml-variants.4.11.0+alpha=
2 --repositories=3Ddefault,beta=3Dgi=
t+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+alpha=
2+<VARIANT> --repositories=3Ddefault,=
beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where <VARIANT> is replaced with one of these: afl, flambda, fp, fp+f= lambda

The source code for the alpha is also available at these addresses:

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

OCaml Workshop 2020: Call for Volunte= ers

Ivan Gotovchits announced

The OCaml Workshop will be held in the virtual format this year, which pose= s new challenges and requires people with special talents and training. The Organizing Committee is seeking for membe= rs who will volunteer to fill one (or more) of the following roles:

  1. AV Editor
  2. Session Host
  3. Transcribers/Interpreter
  4. Content Manager
  5. Accessibility Chair

The roles are described in details below. We are asking prospective Organiz= ing Committee members to contact the Organizing Committee chair ([ivg@ieee.org](= mailto:ivg@ieee.org)), indicating which role(s) they are ready to take.

AV Editor

AV (Audio/Video) editors are responsible for previewing the presentations a= nd providing help and feedback to the authors. Ideally we target for one editor per talk.

  • Duties
    • Preview and (if necessary) post-process or (ask the author to shoot aga= in) the pre-recorded videos.
    • Advise authors and help in choice of software and hardware, teach how t= o set up the camera, light, make sure that the audio is of good quality and= , in general, channel our quality guidelines.
    • Ensure that all videos are of the same quality, the audio levels are th= e same, and that everything is loud and clear.

Session Hosts

Session hosts will assist session chairs in streaming the pre-recorded vide= os as well as helping and moderating the Q&A sessions and the panel session. They will also be responsible for s= ecurity and be ready to react to potential threats and wrongdoers. Since we will broadcast sessions in several time zo= nes we need several hosts for each session.

  • Duties
    • Moderating the text chats
    • Controlling microphones in the video-conferencing
    • Watching for the time
    • Performing sound checks
    • Welcoming and otherwise guiding participants

Transcribers / Interpreters

We would like to have at least English transcriptions for each talk and tra= nslations to other languages are very welcome. Transcriptions enable accessibility as well as potentially increas= e the audience and publicity as they could be indexed by the search engines.

  • Duties
    • Create transcriptions for videos, potentially in other languages.

Content Manager

The content manager will be responsible for maintaining the web presence of= the conference on https://ocaml.org/. We plan to have all videos available, as well as maintain a page for each subm= itted work.

Accessibility Chair

We are striving to make the conference accessible to everyone and we are lo= oking for volunteers who have experience in online accessibility.

  • Duties
    • Helping with the selection of accessible platforms and tools.
    • Working with attendees to ensure the necessary access services are incl= uded.
    • Establishing best practices for preparing and running accessible sessio= ns.

Introduction to Lwt

Rapha=C3=ABl Proust announced

I've published https://raphael-proust.github.io/code/lwt-part-1.html, a 2-part i= ntroduction to Lwt.

The main aim of the introduction is to give a good mental model of what pro= mises are, how they behave and how to use them. It assumes basic familiarity with OCaml.

Don't hesitate to ask questions or share feedback.

Other OCaml News

From the ocamlcore planet blog

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

Old CWN

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

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

--=-=-=--