From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=vOlbvR3n; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Y24Zgv3F; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id F0640B80123 for ; Tue, 8 Oct 2024 11:56:44 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=oRAWWKeVVn91oZT377w2Auo21zE5cFEM5v1ImHfpgys=; b=vOlbvR3ntBVKXd3bFAHogyd94HRUQlGSq6kiihfpDu2oG8uVxh1OIgdC SQq5W1ZJQZvwhOspe55G/O37iJDYkdV9AKKDbYIEfZFEfaCe5ERyNVBpg 2K0mLgxLQulfSOyn5Aj0vQ15yJMyUtnoIr5O5bDuYasobtC2LPN5BHKyr Y=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,186,1725314400"; d="scan'208,217";a="187609210" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Oct 2024 12:56:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id EC3AFE0D16; Tue, 8 Oct 2024 12:56:42 +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 17051E0035 for ; Tue, 8 Oct 2024 12:56:37 +0200 (CEST) IronPort-SDR: 67050fe3_2ltuVVUiAxNGLkr2ChYl8eAA65HkwswHoAijiipC22JRzmd pLAB5exoqjgdFKek//7F+p6c3s5PBsjEwT486gg== X-IPAS-Result: =?us-ascii?q?A0GrSwA1DwVn/yIeaIFagliBQVsoBxIBY1ozBwhIA0Aeg?= =?us-ascii?q?3WDT44ggRabLYJ7AxgWIxQBAwENLgEFDQECBAEBAwECAYIMgi5ABAICFooCA?= =?us-ascii?q?h8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECgQoIC4U1D?= =?us-ascii?q?AY0DYJGLiNxXgMEAwY2AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQIIBAEHBRcGBwMPHCQcAQgEBhMBASkPGCMDEAQBBgMCB?= =?us-ascii?q?A0BNQMBEwESFAIEAoJmgh9FAwQBDAY/kDabORB6fzOBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gUBDgkm2gaBYwmBSIgxGgEFJUhqAoRECYQxAicPgVVEgRWCcgdvgVABLUEXC?= =?us-ascii?q?wEBAQEBF0RgAQEIBj8JGIMNgmmGHlWDV4ESaWyBCUUPgmMbgSlwASaBY1cPR?= =?us-ascii?q?QQObT4SQgIMgUSBPWYWJT4LLSwQhiBegQQTgXCCH4M2BhmJV4FHIgMmMyETA?= =?us-ascii?q?VUTFwsJBWSGC4JGgyaCFIQVhSWBZwlgh2WBbIE+gVlHgnFKhUaBBoJLa045A?= =?us-ascii?q?g0CN4IlJGSCVoNigX4dQAMLbT01FBurewQNKQGBWgFGgVYtAg4LNQUnBAwPD?= =?us-ascii?q?QgoBQETFQEBAQkZNi0MCgIXHRcCDgwFEAcSBQQCCwItkk0QGAUlAnWOO44Pk?= =?us-ascii?q?1CBCjQHhBuBXQYMiQOBJJVzhAWBVoU3hXSGf5JFIpgWPiKCNIcgXUgJgW0eT?= =?us-ascii?q?IhvjEkWBIFUg3yBUSwnOQ1iARsCAwkHMxowIiGCZwkJAUoOD4wxgXwWgQwBC?= =?us-ascii?q?IElgR6BPgqBHIE8OTtavTFBNQIBAQkuAgcBCgEBAwmFRR0BAYZVgUsBAQ?= IronPort-PHdr: A9a23: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 1bGRDBuY5aqsYjofZJITT0JkKA= IronPort-Data: A9a23:Pw1+VaP97R+Il0LvrR1UlsFynXyQoLVcMsEvi/4bfWQNrUoh0GNSx 2EdXz3SPvnYMWP0etx+O9y+oExVvpDVnNVjTHM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8mk/vgqoPUUIbsIjp2SRJvVBAvgBdin/9RqoNziLBVOSvU0 T/Ji5OZYQbNNwJcaDpOt/vb8EM35pwehRtB1rAATaAT1LPhvyJNZH4vDfnZB2f1RIBSAtm7S 47rpF1u1j6xE78FU7tJo56jGqE4aua60Tum1hK6b5Ofbi1q/UTe5EqU2M00Mi+7gx3R9zx4J U4kWZaYEW/FNYWU8AgRvoUx/4iT8sSq9ZeeSUVTv/B/wGXhL1DC3MxLHHo4OK5D+NZQW1lF3 9UXfWVlghCr34pawZq+WrAqnsMnPdXmN4MZu2h9wHfeF/lOrZLrGv+bo4YAgHFr3oYVQZ4yZ OJBAdZrRC/6WEUaIGsoLscEsbKwgX3ubzBTqFSUvLc6pW/Jw1l41LHrdsHeetmLWdl9lEGFo GnL5CL8XgFcM8aQodaA2iv82bGXzHqkCer+EpWxxuRgmlGC1lUUVkU1Vl2f+OmStXeXDoc3x 0s8v3BGQbIJ3EeiS924WxyjvFafrxsEUpxRFfc74UeD0MLpDx2xA3hdCCZGbM06ucQ2Qz0zy 1LPmMnmbdByjICopbum3u/8hVuP1eI9dwfuyAddJefZy7EPYb3fjy4jiv5mAPfzltrxCC39y DCMrTEjivMUl8FjO2CT4wXcmzz1znTWZldd2+kVdjvNAsBFiEqNbYu171PW9rBFcJbfSUOO1 JTBs9bL9/gAVPlhiwTUKNjg39iVCzKtKDrYkEJiFJkn9i2w9jikZ484DPSS4qt2Gp5sRAIFq 3M/de+cCFG/8ZdqgWJKj1qNNvkX IronPort-HdrOrdr: A9a23:aUW/f6068+rkAH51PtNwnwqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-Talos-CUID: 9a23:9Tnerm14nx/vbpSmvDXoUrxfPZwOXGLk6WfrLUqbUmRZb+etQnW59/Yx X-Talos-MUID: 9a23:I+zUrgg8MlQ4peYf/OSCB8MpPfdy6b6iGVA0lstemMqCEXVgEAikpWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,186,1725314400"; d="scan'208,217";a="187609179" X-MGA-submission: =?us-ascii?q?MDGMC6tefnfUwZs83rZyD31JQicSd02MACy5r8?= =?us-ascii?q?r4/nt+w1Cz1g13lvmh1dUe1CSFo4hX1rCp7rrJ9w6U0jiOMK2XApqkP2?= =?us-ascii?q?7OPCSFRSbXYejAK1UcCq2zBoMAbdhyq+f5IQFVxPecznzlFfPBZQQyvb?= =?us-ascii?q?cJpNvAkc1bPZft32At+G76Dg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Oct 2024 12:56:33 +0200 Received: from TM.local (unknown [37.165.155.185]) (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 3316A5648B1; Tue, 8 Oct 2024 12:56:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1728384983; bh=RpDLAfVrIkWsBnYDoGKCECVgU6+VV+B0Ya7LMCZ01aM=; h=From:To:Subject:Date:Message-ID; b=Y24Zgv3FrfO0GDDvKVFYmcvv4GBikTN2/D7jiGFiRkN8Nmbu/3gAk2WK+ePNYsyJZ RaxDA/DloCxFdvVw7s2i4uWZHE9k+cU0ioNnce0gFI0/FlxFPikT/+xfPZGW+Ul+x2 rb5SnDt69Vl34buM0JrIfTJdwv4rTTJqjzMbRlOA= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 08 Oct 2024 12:56:22 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 8 12:56:24 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499884, queueID=BEF895648B2 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: 19185 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 ZWsgb2YgT2N0b2JlciAwMSB0byAwOCwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KUmVsZWFz ZXMgb2YgZnBhdGgtc2V4cGxpYjAsIGZwYXRoLWJhc2UsIGxvYywgZmlsZS1yZXdyaXRlciwgc2V4 cHMtcmV3cml0ZXIgYW5kIHByb3ZpZGVyDQpCdWlsZCBhIHByb2plY3Qgd2l0aG91dCBTdGRsaWIN Cm9iYXRjaGVyOiBGcmFtZXdvcmsgZm9yIGJ1aWxkaW5nIGVmZmljaWVudCBjb25jdXJyZW50IHNl cnZpY2VzDQpEQkxQIHF1ZXJ5IHByb2dyYW0gYW5kIGxpYnJhcnkNCmN1ZGFqaXQ6IEJpbmRpbmdz IHRvIHRoZSBgY3VkYScgYW5kIGBudnJ0YycgbGlicmFyaWVzDQpZT0NhbWwsIGEgZnJhbWV3b3Jr IGZvciBzdGF0aWMgc2l0ZSBnZW5lcmF0b3INCm9lcHViIDAuMS4wIDogQSBsaWJyYXJ5IHRvIHBh cnNlIGVwdWIgZmlsZXMNCnBweF9kZXJpdmluZ19yb3V0ZXIg4oCUIHR5cGUgc2FmZSByb3V0aW5n IGZvciBEcmVhbSBhbmQgTWVsYW5nZQ0KTWljYSwgYSBQUFggdGhhdCBhdXRvbWF0ZXMgZGlmZmVy ZW50aWFsIHRlc3RpbmcgZm9yIE9DYW1sIG1vZHVsZXMNClNpbXBsaWZpZWQgQW5kcm9pZCBjcm9z cy1jb21waWxlciB3aXRoIERrTUwNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpSZWxl YXNlcyBvZiBmcGF0aC1zZXhwbGliMCwgZnBhdGgtYmFzZSwgbG9jLCBmaWxlLXJld3JpdGVyLCBz ZXhwcy1yZXdyaXRlciBhbmQgcHJvdmlkZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsZWFz ZXMtb2YtZnBhdGgtc2V4cGxpYjAtZnBhdGgtYmFzZS1sb2MtZmlsZS1yZXdyaXRlci1zZXhwcy1y ZXdyaXRlci1hbmQtcHJvdmlkZXIvMTUzNjQvMT4NCg0KDQpNYXRoaWV1IEJhcmJpbiBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd2FudGVkIHRvIGFubm91bmNlIHRoZSBpbml0aWFs IHJlbGVhc2Ugb2YgNiB1dGlsaXR5IHBhY2thZ2VzIHRvIHRoZQ0KICBvcGFtLXJlcG9zaXRvcnku IFRoZXkgYXJlIGRlcGVuZGVuY2llcyB0byBzb21lIG90aGVyIG9uZ29pbmcgcHJvamVjdHMNCiAg SSBoYXZlLCBwZXJoYXBzIHNvbWUgd2lsbCBmaW5kIHRoZW0gdXNlZnVsLg0KDQogIFRoZXNlIGFy ZSB2ZXJ5IGVhcmx5IGRheXMgZm9yIHRoaXMgc29mdHdhcmUuIFBsZWFzZSBmZWVsIHdlbGNvbWUg dG8NCiAgb3BlbmluZyBpc3N1ZXMgb3IgZGlzY3Vzc2lvbnMgdGlja2V0cyBpZiB5b3UgYXJlIGlu Y2xpbmVkLg0KDQogIFRoYW5rIHlvdSBAbXNlcmkgLCBAYXZzbSAmIEBzaG9uZmVkZXIgZm9yIHlv dXIgaGVscCBpbiBtYWtpbmcgdGhlc2UNCiAgbGlicmFyaWVzIGF2YWlsYWJsZSENCg0KICBCZWxv dyB5b3UnbGwgZmluZCBzaG9ydCBkZXNjcmlwdGlvbnMgd2l0aCBsaW5rcyB0byB0aGUgcGFja2Fn ZXMgaG9tZQ0KICBwYWdlcy4gVGhhbmsgeW91IQ0KDQogIFtGcGF0aF9zZXhwbGliMF0gb25seSBk ZXBlbmRzIG9uIGBmcGF0aCcgYW5kIGBzZXhwbGliMCcuIEl0IGRlZmluZXMgYQ0KICBzaW5nbGUg bW9kdWxlLCBgRnBhdGhfc2V4cGxpYjAnLCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBvcGVuZWQg dG8NCiAgc2hhZG93IHRoZSBgRnBhdGgnIG1vZHVsZSB0byBhZGQgc21hbGwgaGVscGVycyBhbmQg YSBgc2V4cF9vZicNCiAgc2VyaWFsaXplciB0byBpdC4gVGhlIHBhY2thZ2UgYWxzbyBpbnRyb2R1 Y2VzIHRocmVlIG5ldyBtb2R1bGVzIHRvIHRoZQ0KICBzY29wZTogYEZwYXJ0JywgYEFic29sdXRl X3BhdGgnIGFuZCBgUmVsYXRpdmVfcGF0aCcgdG8gaW5jcmVhc2UNCiAgdHlwZS1zYWZldHkgd2hl biBtYW5pcHVsYXRpbmcgcGF0aHMgdGhhdCBhcmUga25vd24gdG8gYmUgcmVsYXRpdmUgb3INCiAg YWJzb2x1dGUuDQoNCiAgW0ZwYXRoX2Jhc2VdIGZ1cnRoZXIgZXh0ZW5kcyBgZnBhdGgtc2V4cGxp YjAnIGFuZCBhZGRzIGEgZGVwZW5kZW5jeSBvbg0KICBiYXNlLiBJdCBpcyBkZXNpZ25lZCB0byBi ZSBjb21wYXRpYmxlIHdpdGggQmFzZS1zdHlsZSBjb250YWluZXJzIHN1Y2gNCiAgYXMgYE1hcCcs IGBTZXQnLCBgSGFzaHRibCcsIGBIYXNoX3NldCcuDQoNCiAgW0xvY10gaXMgYW4gT0NhbWwgbGli cmFyeSB0byBtYW5pcHVsYXRlIGNvZGUgbG9jYXRpb25zLCB3aGljaCBhcmUNCiAgcmFuZ2VzIG9m IGxleGluZyBwb3NpdGlvbnMgZnJvbSBhIHBhcnNlZCBmaWxlLg0KDQogIFtGaWxlX3Jld3JpdGVy XSBpcyBhbiBPQ2FtbCBsaWJyYXJ5IGZvciBhcHBseWluZyBzbWFsbCByZXdyaXRlcyB0bw0KICB0 d2VhayBvciByZWZhY3RvciB5b3VyIGZpbGVzLiBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgaW50 ZXJmYWNlIHRvDQogIGFwcGx5IHN1cmdpY2FsIHRleHR1YWwgc3Vic3RpdHV0aW9ucyBvbiB0aGUg Zmx5LCB3aGlsZSBuYXZpZ2F0aW5nIHRoZQ0KICBjb250ZW50cyBvZiBhIGZpbGUgdGhyb3VnaCBh biBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIGNvZGUNCiAgbG9jYXRpb25zLg0K DQogIFtTZXhwc19yZXdyaXRlcl0gaXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBgZmls ZS1yZXdyaXRlcicNCiAgbGlicmFyeSBkZWRpY2F0ZWQgdG8gcmV3cml0aW5nIHNleHAgZmlsZXMs IHN1Y2ggYXMgZHVuZSBjb25maWcgZmlsZXMuDQoNCiAgW1Byb3ZpZGVyXSBpcyBhbiBPQ2FtbCBs aWJyYXJ5IGZvciBjcmVhdGluZyBUcmFpdHMgYW5kIEludGVyZmFjZXMuIEl0DQogIGFsbG93cyB5 b3UgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCBieSBhIGxpYnJhcnkgd2l0aG91 dA0KICBjb21taXR0aW5nIHRvIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gLSBpbiBlc3NlbmNl IDogZHluYW1pYw0KICBkaXNwYXRjaC4gUHJvdmlkZXIgaXMgYSBwYXR0ZXJuIGZlYXR1cmVkIGlu IHRoZSBgRWlvJyBwcm9qZWN0DQogIChgRWlvLlJlc291cmNlJykuIEkgd2FudGVkIHRvIG1ha2Ug aXQgcmV1c2FibGUgaW4gb3RoZXIgcHJvamVjdHMgLSBpbg0KICBwYXJ0aWN1bGFyIEkgYW0gY3Vy cmVudGx5IHVzaW5nIGl0IGFzIHRoZSBwYXJhbWV0cml6YXRpb24gc3Rvcnkgb2YNCiAgYHZjcycu IFRoaXMgcGFja2FnZSBoYWQgYWxyZWFkeSBiZWVuIGF2YWlsYWJsZSBmb3IgYSBsaXR0bGUgd2hp bGUNCiAgYWxyZWFkeSBidXQgd2FzIHN0aWxsIHVuYW5ub3VuY2VkLg0KDQoNCltGcGF0aF9zZXhw bGliMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2ZwYXRoLWJhc2U+DQoNCltGcGF0aF9i YXNlXSA8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vZnBhdGgtYmFzZT4NCg0KW0xvY10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2xvYz4NCg0KW0ZpbGVfcmV3cml0ZXJdIDxodHRwczov L2dpdGh1Yi5jb20vbWJhcmJpbi9maWxlLXJld3JpdGVyPg0KDQpbU2V4cHNfcmV3cml0ZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9maWxlLXJld3JpdGVyPg0KDQpbUHJvdmlkZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9wcm92aWRlcj4NCg0KDQpCdWlsZCBhIHByb2plY3Qg d2l0aG91dCBTdGRsaWINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYnVpbGQtYS1wcm9qZWN0LXdp dGhvdXQtc3RkbGliLzE1Mzc0LzE+DQoNCg0KTWlraGFpbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZGVjaWRlZCB0 byBleHBlcmltZW50IHdpdGggY29tcGlsaW5nIGEgcHJvamVjdCB3aXRob3V0IHRoZSBzdGFuZGFy ZA0KICBsaWJyYXJ5LiBXaHk/IEkgZG9uJ3Qga25vdy4gQnV0IEkgY291bGQgc2F2ZSB+NTBLLiBK dXN0IHNoYXJpbmcgbXkNCiAgbm90ZSBhYm91dCBpdC4NCg0KICBZb3UgY2FuIGZpbmQgYW4gZXhh bXBsZSBpbiBteSBbcmVwb3NpdG9yeV0uDQoNCiAgSSBmb3VuZCB0aGUgYC1ub3N0ZGxpYicgYW5k IGAtbm9wZXJ2YXNpdmVzJyAodW5kb2N1bWVudGVkKSBmbGFncyBhbmQNCiAgYWZ0ZXIgYSBsb3Qg b2YgdHJ5aW5nIEkgd2FzIGFibGUgdG8gZG8gd2hhdCBJIHdhbnRlZC4gSXQgZG9lc24ndA0KICBk aXNhYmxlIGFic29sdXRlbHkgZXZlcnl0aGluZyAobGlzdHMgYW5kIG90aGVyIHR5cGVzIGxpa2Ug YG9wdGlvbicgYXJlDQogIGF2YWlsYWJsZSkuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAo ZmxhZ3MNCiAg4pSCICAgOnN0YW5kYXJkDQogIOKUgiAgIC1ub3N0ZGxpYg0KICDilIIgICAtbm9w ZXJ2YXNpdmVzDQogIOKUgiAgIDsgYWRkIHJ1bnRpbWUNCiAg4pSCICAgLWNjbGliDQogIOKUgiAg IC1sYXNtcnVuDQogIOKUgiAgIC1jY29wdA0KICDilIIgICAiLUwgJXtvY2FtbF93aGVyZX0iDQog IOKUgiAgIC1jY29wdA0KICDilIIgICAiLWxtIC1sZGwiKQ0KICDilJTilIDilIDilIDilIANCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCICgqIHN0ZGxpYi5tbCAqKQ0KICDilIIgZXh0ZXJuYWwg cHJpbnRfZW5kbGluZSA6IHN0cmluZyAtPiB1bml0ID0gImNhbWxfcHJpbnRfZW5kbGluZSIgW0BA bm9hbGxvY10NCiAg4pSCIA0KICDilIIgKCogbWFpbi5tbCAqKQ0KICDilIIgb3BlbiBTdGRsaWIN CiAg4pSCIGxldCAoKSA9IHByaW50X2VuZGxpbmUgImhlbGxvIGZyb20gbXkgc3RkbGliIg0KICDi lJTilIDilIDilIDilIANCg0KICBIZWxsbyBXb3JsZCBwcm9ncmFtOg0KDQogIOKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KICAgICAgICAgICB3 aXRoIFN0ZGxpYiAgd2l0aG91dCBTdGRsaWIgDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KICAgKnNpemUqICAzNDlLICAgICAgICAgMzAy SyAgICAgICAgICAgDQogIOKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgQ0KDQoNCltyZXBvc2l0b3J5XSA8aHR0cHM6Ly9naXRodWIuY29tL2R4M21v ZC9vY2FtbC13aXRob3V0LXN0ZGxpYj4NCg0KDQpvYmF0Y2hlcjogRnJhbWV3b3JrIGZvciBidWls ZGluZyBlZmZpY2llbnQgY29uY3VycmVudCBzZXJ2aWNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2JhdGNoZXItZnJh bWV3b3JrLWZvci1idWlsZGluZy1lZmZpY2llbnQtY29uY3VycmVudC1zZXJ2aWNlcy8xNTM4NC8x Pg0KDQoNCkxlZSBLb29uIFdlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhvdCBvbiB0aGUg aGVlbHMgb2YgdGhlIHBhcGVyIFsvIkNvbmN1cnJlbnQgRGF0YSBTdHJ1Y3R1cmVzIE1hZGUNCiAg RWFzeSIvXSBhcHBlYXJpbmcgYXQgW09PUFNMQSAyMDI0XSBvbiB0aGUgMjR0aCBPY3RvYmVyLCBJ J20gcGxlYXNlZCB0bw0KICBhbm5vdW5jZSByZWxlYXNlIG9mICpvYmF0Y2hlciogLSBhIF9waWNv c18gY29tcGF0aWJsZSBsaWJyYXJ5IGZvcg0KICBpbXBsZW1lbnRpbmcgZWZmaWNpZW50IGJhdGNo ZWQgc2VydmljZXMgaW4gT0NhbWwuDQoNCiAgKm9iYXRjaGVyKiBwcm9wb3NlcyBhICpuZXcqIHdh eSB0byBhcHByb2FjaCB0aGUgZGVzaWduIGFuZA0KICAgaW1wbGVtZW50YXRpb24gb2YgY29uY3Vy cmVudCBzZXJ2aWNlcy4gSXQncyBrZXkgYmVuZWZpdHMgYXJlOg0KDQogIOKAoiBJbmNyZW1lbnRh bCBvcHRpbWl6YXRpb24gYW5kIHBhcmFsbGVsaXNtIG9mIHNlcnZpY2VzDQogIOKAoiBFYXN5IHRv IGNvbnRyb2wgYW5kIHJlYXNvbiBhYm91dCBjb25jdXJyZW5jeQ0KICDigKIgUmV0YWlucyBhdG9t aWMtc3R5bGUgaW50ZXJmYWNlIHdpdGggeW91ciBzZXJ2aWNlcyB3aGlsZSBiYXRjaGluZw0KICAg IGhhcHBlbnMgaW1wbGljaXRseQ0KICDigKIgVGhyZWFkLXNhZmV0eSBmb3IgY2hlYXAhDQoNCiAg QXZhaWxhYmxlIG9uIG9wYW0gdG9kYXksIGluc3RhbGwgd2l0aA0KICDilIzilIDilIDilIDilIAN CiAg4pSCIG9wYW0gaW5zdGFsbCBvYmF0Y2hlcg0KICDilJTilIDilIDilIDilIANCg0KICBGb3Ig bW9yZSBkZXRhaWxzLCBjaGVjayBvdXQgdGhlIHNvdXJjZSBhbmQgUkVBRE1FIG9uIEdpdEh1YjoN CiAgW29iYXRjaGVyXS4NCg0KICBGZWVkYmFjaywgY29udHJpYnV0aW9ucywgYW5kIGRpc2N1c3Np b25zIGFyZSB3ZWxjb21lIQ0KDQoNClsvIkNvbmN1cnJlbnQgRGF0YSBTdHJ1Y3R1cmVzIE1hZGUg RWFzeSIvXQ0KPGh0dHBzOi8va29vbndlbi5naXRodWIuaW8vYXNzZXRzL3BkZi9jb25jdXJyZW50 LXN0cnVjdHVyZXMtbWFkZS1lYXN5LnBkZj4NCg0KW09PUFNMQSAyMDI0XQ0KPGh0dHBzOi8vMjAy NC5zcGxhc2hjb24ub3JnL2RldGFpbHMvc3BsYXNoLTIwMjQtb29wc2xhLzExOC9Db25jdXJyZW50 LURhdGEtU3RydWN0dXJlcy1NYWRlLUVhc3k+DQoNCltvYmF0Y2hlcl0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9rb29ud2VuL29iYXRjaGVyPg0KDQoNCkRCTFAgcXVlcnkgcHJvZ3JhbSBhbmQgbGlicmFy eQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGJscC1xdWVyeS1wcm9ncmFtLWFuZC1saWJy YXJ5LzE1Mzg1LzE+DQoNCg0KU2FtdWVsIE1pbXJhbSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlYWxlYXNlIG9mIFtvY2FtbC1k YmxwXSwgd2hpY2gNCiAgcHJvdmlkZXMgYm90aCBhIHByb2dyYW0gYW5kIGEgbGlicmFyeSB0byBx dWVyeSB0aGUgW0RCTFBdDQogIGJpYmxpb2dyYXBoaWMgZGF0YWJhc2UuIEluIHByYWN0aWNlLCBp dCBpcyBtb3N0bHkgdXNlZnVsIGZvcg0KICByZXRyaWV2aW5nIGJpYnRleCBlbnRyaWVzIHdpdGgg Y29tbWFuZHMgc3VjaCBhcw0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZGJscCBiaWJ0ZXgg Z2lyYXJkIGxvY3VzIHNvbHVtDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoaWNoIHdpbGwgc3Bp dCBvdXQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIEBhcnRpY2xle0RCTFA6am91cm5hbHMv bXNjcy9HaXJhcmQwMSwNCiAg4pSCICAgYXV0aG9yICAgICAgID0ge0plYW57LX1ZdmVzIEdpcmFy ZH0sDQogIOKUgiAgIHRpdGxlICAgICAgICA9IHtMb2N1cyBTb2x1bTogRnJvbSB0aGUgcnVsZXMg b2YgbG9naWMgdG8gdGhlIGxvZ2ljIG9mIHJ1bGVzfSwNCiAg4pSCICAgam91cm5hbCAgICAgID0g e01hdGguIFN0cnVjdC4gQ29tcHV0LiBTY2kufSwNCiAg4pSCICAgdm9sdW1lICAgICAgID0gezEx fSwNCiAg4pSCICAgbnVtYmVyICAgICAgID0gezN9LA0KICDilIIgICBwYWdlcyAgICAgICAgPSB7 MzAxLS01MDZ9LA0KICDilIIgICB5ZWFyICAgICAgICAgPSB7MjAwMX0sDQogIOKUgiAgIHVybCAg ICAgICAgICA9IHtodHRwczovL2RvaS5vcmcvMTAuMTAxNy9TMDk2MDEyOTUwMTAwMzM2WH0sDQog IOKUgiAgIGRvaSAgICAgICAgICA9IHsxMC4xMDE3L1MwOTYwMTI5NTAxMDAzMzZYfSwNCiAg4pSC ICAgdGltZXN0YW1wICAgID0ge1dlZCwgMDEgQXByIDIwMjAgMDg6NDg6NDcgKzAyMDB9LA0KICDi lIIgICBiaWJ1cmwgICAgICAgPSB7aHR0cHM6Ly9kYmxwLm9yZy9yZWMvam91cm5hbHMvbXNjcy9H aXJhcmQwMS5iaWJ9LA0KICDilIIgICBiaWJzb3VyY2UgICAgPSB7ZGJscCBjb21wdXRlciBzY2ll bmNlIGJpYmxpb2dyYXBoeSwgaHR0cHM6Ly9kYmxwLm9yZ30NCiAg4pSCIH0NCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgKG9yLCBldmVuIGJldHRlciwgdXNlIGBkYmxwIGJpYicgdG8gZGlyZWN0bHkg YWRkIHRoaXMgYXQgdGhlIGVuZCBvZg0KICB0aGUgYC5iaWInIGZpbGUgaW4gdGhlIGN1cnJlbnQg ZGlyZWN0b3J5KS4NCg0KICBJdCBtaWdodCBzdGlsbCBuZWVkIHNvbWUgcG9saXNoaW5nLCBmZWVs IGZyZWUgdG8gcmVhY2ggb3V0IGlmIHlvdQ0KICBlbmNvdW50ZXIgc29tZSBwcm9ibGVtcy4NCg0K DQpbb2NhbWwtZGJscF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zbWltcmFtL29jYW1sLWRibHA+DQoN CltEQkxQXSA8aHR0cHM6Ly9kYmxwLm9yZy8+DQoNCg0KY3VkYWppdDogQmluZGluZ3MgdG8gdGhl IGBjdWRhJyBhbmQgYG52cnRjJyBsaWJyYXJpZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWN1ZGFqaXQtYmluZGluZ3MtdG8tdGhlLWN1ZGEtYW5kLW52cnRjLWxpYnJh cmllcy8xNTAxMC8yPg0KDQoNCkx1a2FzeiBTdGFmaW5pYWsgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBjdWRhaml0IDAuNS4wIGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIG9w YW0gcmVwb3NpdG9yeS4gSXQncyBvcmdhbml6ZWQNCiAgaW50byBbbW9kdWxlc10sIGFuZCBpdCBh ZGRzIHN1cHBvcnQgZm9yIENVREEgZXZlbnRzLg0KDQoNClttb2R1bGVzXQ0KPGh0dHBzOi8vbHVr c3RhZmkuZ2l0aHViLmlvL29jYW1sLWN1ZGFqaXQvY3VkYWppdC9DdWRhaml0L2luZGV4Lmh0bWw+ DQoNCg0KWU9DYW1sLCBhIGZyYW1ld29yayBmb3Igc3RhdGljIHNpdGUgZ2VuZXJhdG9yDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi15b2NhbWwtYS1mcmFtZXdvcmstZm9yLXN0YXRpYy1zaXRlLWdlbmVyYXRvci8x NTM5My8xPg0KDQoNClhhdmllciBWYW4gZGUgV29lc3R5bmUgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICA6d2F2ZTogSGVsbG8gZXZlcnlvbmUh IFdlLCB0aGUgWU9DYW1sIGRldmVsb3BtZW50IHRlYW0sIGFyZSB2ZXJ5DQogIHBsZWFzZWQgdG8g YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW3ZlcnNpb24gMl0sIGZyZXNobHkgbWVyZ2VkIGludG8N CiAgW29wYW0tcmVwb3NpdG9yeV0gOmNoYW1wYWduZTohDQoNCiAgKllPQ2FtbCBpcyBhIGZyYW1l d29yayBmb3IgZGVzY3JpYmluZyBzdGF0aWMgc2l0ZSBnZW5lcmF0b3JzKiAoYSB2ZXJ5DQogICBz bWFsbCBhcHBsaWNhdGl2ZSBidWlsZC1zeXN0ZW0gd2hvc2UgQVBJIGlzIHRhaWxvci1tYWRlIGZv ciBjcmVhdGluZw0KICAgd2ViIHBhZ2VzICkgYW5kIGl0cyBpbnRlcm5hbCBtb2RlbCBpcyB2ZXJ5 IHNpbWlsYXIgdG8gW0hha3lsbF0gKHRoZQ0KICAgM3RoIHZlcnNpb24pLCBhbm90aGVyIEhhc2tl bGwgZnJhbWV3b3JrLiAoYSBwcmVzZW50YXRpb24gd2FzIGdpdmVuIHRvDQogICB0aGUgT0NhbWwg dXNlciBHcm91cCBpbiBQYXJpcyBhbmQgeW91IGNhbiBmaW5kIHRoZSB2aWRlbywgW2luIEZyZW5j aCwNCiAgIGhlcmVdKS4NCg0KDQpbdmVyc2lvbiAyXSA8aHR0cHM6Ly9naXRodWIuY29tL3hodG1s Ym9pL3lvY2FtbC9yZWxlYXNlcy90YWcvdjIuMC4wPg0KDQpbb3BhbS1yZXBvc2l0b3J5XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeT4NCg0KW0hha3lsbF0gPGh0dHBz Oi8vamFzcGVydmRqLmJlL2hha3lsbC8+DQoNCltpbiBGcmVuY2gsIGhlcmVdDQo8aHR0cHM6Ly93 d3cuaXJpbGwub3JnL3ZpZGVvcy9PVVBTLzIwMjMtMDEveGF2aWVyLXZhbi1kZS13b2VzdHluZS5o dG1sPg0KDQpDaGFuZ2VzIHdpdGggMS4wLjANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEhpc3RvcmljYWxseSwgWU9DYW1sIHdhcyB3 cml0dGVuIHZlcnksIHZlcnkgcXVpY2tseSB0byBnaXZlIGV4YW1wbGVzDQogIG9mIHNsaWdodGx5 IGV4b3RpYyB1c2VzIG9mIHRoZSBsaWJyYXJ5IFtQcmVmYWNlXS4gRHVlIHRvIGl0cw0KICBleHBl cmltZW50YWwgbmF0dXJlLCB0aGUgQVBJIHdhcyBhIGJpdCBsYWJvcmlvdXMsIGJ1dCB3ZSBkaWQg ZmluZCBzb21lDQogIHVzZXJzISBXZSB0b29rIGFkdmFudGFnZSBvZiB0aGUgcmVkZXNpZ24gdG8g c3RvcCByZWx5aW5nIG9uIFByZWZhY2UNCiAgKGFuZCB5ZXMsIFlPQ2FtbCB3YXMgYWxyZWFkeSBt b3JlIHdpZGVseSB1c2VkIHRoYW4gUHJlZmFjZSksIG1vdmUgdG8NCiAgT0NhbWwgNS54IGFuZCB0 YWtlIGFkdmFudGFnZSBvZiBfdXNlci1kZWZpbmVkLWVmZmVjdHNfIGFuZCBzdXBwb3J0DQogIGR5 bmFtaWMgZGVwZW5kZW5jaWVzLiBJbiBvdGhlciB3b3JkcywgWU9DYW1sIGAyLjAuMCcgaXMgbm90 IGF0IGFsbA0KICBjb21wYXRpYmxlIHdpdGggdmVyc2lvbiAx4oCmDQoNCg0KW1ByZWZhY2VdIDxo dHRwczovL2dpdGh1Yi5jb20veHZ3L3ByZWZhY2U+DQoNCg0KUGx1Z2lucyBhbmQgcnVudGltZXMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIFRoZSBhaW0gb2YgWU9DYW1sIGlzIHRvIGJlIHZlcnkgZ2VuZXJpYyBhbmQgdG8g YWxsb3cgdXNlcnMgdG8gYnJpbmcNCiAgdGhlaXIgb3duIGRlcGVuZGVuY2llcywgYnV0IHdlJ3Zl IHRha2VuIHRoZSBvcHBvcnR1bml0eSB0byByZWxlYXNlIGl0DQogIHdpdGggc2V2ZXJhbCBwbHVn aW5zIGFuZCBydW50aW1lcyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5Lg0KDQoNCuKX iiBSdW50aW1lcw0KDQogIEEgUnVudGltZSBpcyBhbiDigJhleGVjdXRpb24gY29udGV4dOKAmSBh bmQgZ2VuZXJhbGx5IGV4cG9zZXMgdGhlDQogIHByaW1pdGl2ZSB1c2VkIHRvIGV4ZWN1dGUgYSBZ T0NhbWwgcHJvZ3JhbS4gWU9DYW1sIDIgaXMgYnVuZGxlZCB3aXRoIDMNCiAgUnVudGltZXM6DQoN CiAg4oCiICpZb2NhbWxfdW5peCo6IHRoZSBkZWZhdWx0IHJ1bnRpbWUsIHdob3NlIHByZXZpZXcg c2VydmVyIGlzDQogICAgIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYnJhbmQgbmV3IFtodHRw Y2F0c10hDQoNCiAg4oCiICpZb2NhbWxfZWlvKjogYSBydW50aW1lIGlzbyB0byBVbml4IGJ1dCBi YXNlZCBvbiBbZWlvXSBhbmQgd2hvc2UNCiAgICAgcHJldmlldyBzZXJ2ZXIgaXMgZGVzY3JpYmVk IGJ5IFtjb2h0dHBfZWlvXS4NCg0KICDigKIgKllvY2FtbF9naXQqOiBhIHBhcmFtZXRlcmlzZWQg cnVudGltZSBmb3IgZ2VuZXJhdGluZyBhIHNpdGUgZGlyZWN0bHkNCiAgICAgaW4gYSBnaXQgcmVw b3NpdG9yeSwgd2hpY2ggY2FuIGJlIHNlcnZlZCwgZm9yIGV4YW1wbGUsIGJ5IGENCiAgICAgW01p cmFnZV0gKFt1bmlwaV0pLCB2ZXJ5IHdlbGwgZG9jdW1lbnRlZCBpbiB0aGlzIFtleGNlbGxlbnQN CiAgICAgYXJ0aWNsZV0gYnkgQGRpbm9zYXVyZSENCg0KDQogIFtodHRwY2F0c10gPGh0dHBzOi8v Z2l0aHViLmNvbS9yb2J1ci1jb29wL2h0dHBjYXRzPg0KDQogIFtlaW9dIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpbz4NCg0KICBbY29odHRwX2Vpb10gPGh0dHBzOi8vZ2l0 aHViLmNvbS9taXJhZ2Uvb2NhbWwtY29odHRwPg0KDQogIFtNaXJhZ2VdIDxodHRwczovL21pcmFn ZS5pby8+DQoNCiAgW3VuaXBpXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdW5pcGk+ DQoNCiAgW2V4Y2VsbGVudCBhcnRpY2xlXSA8aHR0cHM6Ly9ibG9nLm9zYXUucmUvYXJ0aWNsZXMv YmxvZ19yZXF1aWVtLmh0bWw+DQoNCg0K4peKIFBsdWdpbnMNCg0KICDigKIgKllvY2FtbF9jbWFy a2l0KiBwcm92aWRlcyBhIGNvbnZlbmllbnQgQVBJICh2aWEgWU9DYW1sKSBmb3INCiAgICAgY29u dmVydGluZyBNYXJrZG93biBmaWxlcyB0byBIVE1MIHZpYSB0aGUgZXhjZWxsZW50IFtjbWFya2l0 XQ0KICAgICBsaWJyYXJ5Lg0KDQogIOKAoiAqWW9jYW1sX29tZCogcHJvdmlkZXMgYSBjb252ZW5p ZW50IEFQSSAodmlhIFlPQ2FtbCkgZm9yIGNvbnZlcnRpbmcNCiAgICAgTWFya2Rvd24gZmlsZXMg dG8gSFRNTCB2aWEgdGhlIGV4Y2VsbGVudCBbT01EXSBsaWJyYXJ5IChidXQgd2UNCiAgICAgcmVj b21tZW5kIGB5b2NhbWxfY21hcmtpdCcpLg0KDQogIOKAoiAqeW9jYW1sX3lhbWwqIHByb3ZpZGVz IGEgY29udmVuaWVudCBBUEkgKHZpYSBZT0NhbWwpIGZvciByZWFkaW5nDQogICAgIFlhbWwgdmlh IHRoZSBleGNlbGxlbnQgbGlicmFyeSBbb2NhbWwteWFtbF0NCg0KICDigKIgKnlvY2FtbF9vdG9t bCogcHJvdmlkZXMgYSBjb252ZW5pZW50IEFQSSAoZm9yIFlPQ2FtbCkgZm9yIHJlYWRpbmcNCiAg ICAgVE9NTCB2aWEgdGhlIGV4Y2VsbGVudCBsaWJyYXJ5IFtPdG9tbF0NCg0KICDigKIgKnlvY2Ft bF9tdXN0YWNoZSogcHJvdmlkZXMgYSBjb252ZW5pZW50IEFQSSAodmlhIFlPQ2FtbCkgZm9yIHVz aW5nDQogICAgIFtNdXN0YWNoZV0gYXMgYSB0ZW1wbGF0ZSBsYW5ndWFnZSB2aWEgdGhlIGV4Y2Vs bGVudCBsaWJyYXJ5DQogICAgIFtvY2FtbC1tdXN0YWNoZV0NCg0KICDigKIgKnlvY2FtbF9qaW5n b28qIHByb3ZpZGVzIGEgY29udmVuaWVudCBBUEkgKHZpYSBZT0NhbWwpIGZvciB1c2luZw0KICAg ICBbSmluZ29vXSBhcyBhIHRlbXBsYXRlIGxhbmd1YWdlIHZpYSB0aGUgZXhjZWxsZW50IGxpYnJh cnkgW2ppbmdvb10NCg0KICDigKIgKnlvY2FtbF9zeW5kaWNhdGlvbiogdGhhdCBnaXZlcyB0b29s IHRvIGdlbmVyYXRlIGZlZWRzDQogICAgIChbQXRvbV0oPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9y Zy93aWtpL0F0b21fKHdlYl9zdGFuZGFyZCk+KSwgW1JTU10NCiAgICAgMSBhbmQgMiBhbmQgW09Q TUxdKS4gVGhlIGxpYnJhcnkgaXMgaW5zcGlyZWQgYnkgW1N5bmRpY10gYnV0IGRvZXMNCiAgICAg bm90IGRlcGVuZCBkaXJlY3RseSBvbiBpdC4NCg0KDQogIFtjbWFya2l0XSA8aHR0cHM6Ly9naXRo dWIuY29tL2RidWVuemxpL2NtYXJraXQ+DQoNCiAgW09NRF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vbWQ+DQoNCiAgW29jYW1sLXlhbWxdIDxodHRwczovL2dpdGh1Yi5jb20vYXZzbS9vY2Ft bC15YW1sPg0KDQogIFtPdG9tbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vb3RvbWw+ DQoNCiAgW011c3RhY2hlXSA8aHR0cHM6Ly9tdXN0YWNoZS5naXRodWIuaW8vPg0KDQogIFtvY2Ft bC1tdXN0YWNoZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yZ3JpbmJlcmcvb2NhbWwtbXVzdGFjaGU+ DQoNCiAgW0ppbmdvb10gPGh0dHA6Ly90YXRlZ2FraWJ1bmtvLmdpdGh1Yi5pby9qaW5nb28vPg0K DQogIFtqaW5nb29dIDxodHRwczovL2dpdGh1Yi5jb20vdGF0ZWdha2lidW5rby9qaW5nb28+DQoN CiAgW1JTU10gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JTUz4NCg0KICBbT1BNTF0g PGh0dHBzOi8vb3BtbC5vcmcvPg0KDQogIFtTeW5kaWNdIDxodHRwczovL2dpdGh1Yi5jb20vQ3Vt dWx1cy9TeW5kaWM+DQoNCg0KQSBmaW5hbCB3b3JkDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBZT0NhbWwgMiB3YXMgbWFpbmx5IHdyaXR0ZW4gYnkgW3hodG1sYm9p XSwgaGVscGVkIGJ5IFtnci1pbV0sIFttc3B3bl0NCiAgYW5kIFtkaW5vc2F1cmVdIHdpdGggb2Nj YXNpb25hbCBzdXBwb3J0IGZyb20gW21haXN0ZV0uIEl0IGhhcyBhbHJlYWR5DQogIGJlZW4gdXNl ZCBleHBlcmltZW50YWxseSBpbiBhIG51bWJlciBvZiBzbWFsbCBwcm9qZWN0czoNCg0KICDigKIg W1JpbmcubXVob2thbWFdIGEgdmVyeSBzbWFsbCB3ZWJyaW5nIC0gW3NvdXJjZXNdDQogIOKAoiBb TWFpc3RlLmZyXSAtIFtzb3VyY2VzXQ0KICDigKIgW2dyLWltLmdpdGh1Yi5pb10gLSBbc291cmNl c10NCg0KICBZb3Ugd2lsbCBhbHNvIGZpbmQgZXh0ZW5zaXZlbHkgZG9jdW1lbnRlZCBleGFtcGxl cyBpbiB0aGUgW2V4YW1wbGVzXQ0KICBkaXJlY3RvcnkuDQoNCiAgVG8gY29uY2x1ZGUsIHdlIGZp bmQgKG5vdCB2ZXJ5IG9iamVjdGl2ZWx5KSB0aGF0IFlPQ2FtbCBpcyBhIGxvdCBvZg0KICBmdW4g dG8gdXNlLCBhbmQgaXQncyB2ZXJ5IGNvb2wgdG8gbWFrZSB5b3VyIHNpdGUgdXNpbmcgYXMgbXVj aCBPQ2FtbA0KICBhcyBwb3NzaWJsZS4NCg0KICBIYXBweSBIYWNraW5nIQ0KDQogIOKAoiBbWW9j YW1sIG9uIE9QQU1dDQogIOKAoiBbRGV2IHJlcG9zaXRvcnldDQoNCg0KW3hodG1sYm9pXSA8aHR0 cHM6Ly9naXRodWIuY29tL3hodG1sYm9pPg0KDQpbZ3ItaW1dIDxodHRwczovL2dpdGh1Yi5jb20v Z3ItaW0+DQoNClttc3B3bl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9tc3B3bj4NCg0KW2Rpbm9zYXVy ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmU+DQoNClttYWlzdGVdIDxodHRwczovL2dp dGh1Yi5jb20vbWFpc3RlPg0KDQpbUmluZy5tdWhva2FtYV0gPGh0dHBzOi8vcmluZy5tdWhva2Ft YS5mdW4+DQoNCltzb3VyY2VzXSA8aHR0cHM6Ly9naXRodWIuY29tL211aG9rYW1hL3Jpbmc+DQoN CltNYWlzdGUuZnJdIDxodHRwczovL21haXN0ZS5mcj4NCg0KW3NvdXJjZXNdIDxodHRwczovL2dp dGh1Yi5jb20vbWFpc3RlL21haXN0ZS5mcj4NCg0KW2dyLWltLmdpdGh1Yi5pb10gPGh0dHBzOi8v Z3ItaW0uZ2l0aHViLmlvPg0KDQpbc291cmNlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9nci1pbS9z aXRlPg0KDQpbZXhhbXBsZXNdIDxodHRwczovL2dpdGh1Yi5jb20veGh0bWxib2kveW9jYW1sL3Ry ZWUvbWFpbi9leGFtcGxlcz4NCg0KW1lvY2FtbCBvbiBPUEFNXSA8aHR0cHM6Ly9vY2FtbC5vcmcv cC95b2NhbWwvbGF0ZXN0Pg0KDQpbRGV2IHJlcG9zaXRvcnldIDxodHRwczovL2dpdGh1Yi5jb20v eGh0bWxib2kveW9jYW1sPg0KDQoNCm9lcHViIDAuMS4wIDogQSBsaWJyYXJ5IHRvIHBhcnNlIGVw dWIgZmlsZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLW9lcHViLTAtMS0wLWEtbGlicmFyeS10by1wYXJzZS1lcHViLWZp bGVzLzE1Mzk0LzE+DQoNCg0KRXJ1RXJpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBodW1ibHkgYW5ub3VuY2Ugb2VwdWIg YSBzbWFsbCBsaWJyYXJ5IHRvIHBhcnNlIGVwdWIgZmlsZXMgYW5kIHRvDQogIHNvbWUgZXh0ZW5k IGNyZWF0ZSBhIGxpc3Qgb2YgY2hhcHRlcnMgZnJvbSB0aGUgZXB1YiBhcmNoaXZlLg0KDQogIFlv dSBjYW4gZmluZCB0aGUgcmVwb3NpdG9yeSBhdCBbQ29kZWJlcmcgLSBPZXB1Yl0NCg0KDQpbQ29k ZWJlcmcgLSBPZXB1Yl0gPGh0dHBzOi8vY29kZWJlcmcub3JnL0VydUVyaS9vZXB1Yj4NCg0KDQpw cHhfZGVyaXZpbmdfcm91dGVyIOKAlCB0eXBlIHNhZmUgcm91dGluZyBmb3IgRHJlYW0gYW5kIE1l bGFuZ2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLXBweC1kZXJpdmluZy1yb3V0ZXItdHlwZS1zYWZlLXJvdXRpbmctZm9yLWRy ZWFtLWFuZC1tZWxhbmdlLzE1NDAxLzE+DQoNCg0KQW5kcmV5IFBvcHAgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIGEgbmV3IHBweCBmb3IgZGVyaXZp bmcgW0RyZWFtXSByb3V0ZXJzDQogIGJhc2VkIG9uIHZhcmlhbnQgdHlwZSBkZWNsYXJhdGlvbnMs IFtwcHhfZGVyaXZpbmdfcm91dGVyXS4NCg0KICBBIHNtYWxsIGV4YW1wbGUuIEZpcnN0IHdlIGRl ZmluZSByb3V0ZXMgKHRoZSBzaWduYXR1cmUgc2hvd2Nhc2VzIHRoZQ0KICBnZW5lcmF0ZWQgY29k ZSk6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIFBhZ2VzIDogc2lnDQogIOKUgiAg IC4uLg0KICDilIIgDQogIOKUgiAgIHZhbCBocmVmIDogdCAtPiBzdHJpbmcNCiAg4pSCICAgKCoq IGdlbmVyYXRlIFVSTCBmcm9tIHRoZSByb3V0ZSAqKQ0KICDilIIgDQogIOKUgiAgIHZhbCBodHRw X21ldGhvZCA6IHQgLT4gWyBgREVMRVRFIHwgYEdFVCB8IGBQT1NUIHwgYFBVVCBdDQogIOKUgiAg ICgqKiBIVFRQIG1ldGhvZCBmb3IgdGhlIHJvdXRlICopDQogIOKUgiANCiAg4pSCICAgdmFsIGhh bmRsZSA6ICh0IC0+IERyZWFtLmhhbmRsZXIpIC0+IERyZWFtLmhhbmRsZXINCiAg4pSCICAgKCoq IGNyZWF0ZSBhIHJvdXRlIGhhbmRsZXIgKikNCiAg4pSCIGVuZCA9IHN0cnVjdA0KICDilIIgICBv cGVuIFBweF9kZXJpdmluZ19yb3V0ZXJfcnVudGltZS5QcmltaXRpdmVzDQogIOKUgiANCiAg4pSC ICAgdHlwZSB0ID0NCiAg4pSCICAgICB8IEhvbWUgW0BHRVQgIi8iXQ0KICDilIIgICAgIHwgQWJv dXQNCiAg4pSCICAgICB8IEhlbGxvIG9mIHsgbmFtZSA6IHN0cmluZzsgcmVwZWF0IDogaW50IG9w dGlvbiB9IFtAR0VUICIvaGVsbG8vOm5hbWUiXQ0KICDilIIgICAgIFtAQGRlcml2aW5nIHJvdXRl cl0NCiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0KICBUaGVuIHdlIGRlc2NyaWJlIGhv dyB3ZSBoYW5kbGUgZWFjaCByb3V0ZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgaGFu ZGxlID0NCiAg4pSCICAgUGFnZXMuaGFuZGxlIChmdW4gcm91dGUgX3JlcSAtPg0KICDilIIgICAg ICAgbWF0Y2ggcm91dGUgd2l0aA0KICDilIIgICAgICAgfCBIb21lIC0+IERyZWFtLnJlc3BvbmQg IkhvbWUgcGFnZSEiDQogIOKUgiAgICAgICB8IEFib3V0IC0+IERyZWFtLnJlc3BvbmQgIkFib3V0 IHBhZ2UhIg0KICDilIIgICAgICAgfCBIZWxsbyB7IG5hbWU7IHJlcGVhdCB9IC0+DQogIOKUgiAg ICAgICAgICAgbGV0IG5hbWUgPQ0KICDilIIgICAgICAgICAgICAgbWF0Y2ggcmVwZWF0IHdpdGgN CiAg4pSCICAgICAgICAgICAgIHwgU29tZSByZXBlYXQgLT4NCiAg4pSCICAgICAgICAgICAgICAg ICBMaXN0LmluaXQgcmVwZWF0IChmdW4gXyAtPiBuYW1lKSB8PiBTdHJpbmcuY29uY2F0ICIsICIN CiAg4pSCICAgICAgICAgICAgIHwgTm9uZSAtPiBuYW1lDQogIOKUgiAgICAgICAgICAgaW4NCiAg 4pSCICAgICAgICAgICBEcmVhbS5yZXNwb25kIChQcmludGYuc3ByaW50ZiAiSGVsbG8sICVzIiBu YW1lKSkNCiAg4pSCIA0KICDilIIgbGV0ICgpID0gRHJlYW0ucnVuIH5pbnRlcmZhY2U6IjEyNy4w LjAuMSIgfnBvcnQ6ODA4MCBoYW5kbGUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVXNpbmcgZ2Vu ZXJhdGVkIGBQYWdlcy5ocmVmJyBmdW5jdGlvbiB3ZSBjYW4gZ2VuZXJhdGUgVVJMcyBmb3Igcm91 dGVzOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCAoKSA9DQogIOKUgiAgIGFzc2VydCAo UGFnZXMuaHJlZiBIb21lID0gIi8iKTsNCiAg4pSCICAgYXNzZXJ0IChQYWdlcy5ocmVmIEFib3V0 ID0gIi9hYm91dCIpOw0KICDilIIgICBhc3NlcnQgKFBhZ2VzLmhyZWYgKEhlbGxvIHsgbmFtZSA9 ICJ3b3JsZCI7IHJlcGVhdCA9IE5vbmUgfSkgPSAiL2hlbGxvL3dvcmxkIik7DQogIOKUgiAgIGFz c2VydCAoUGFnZXMuaHJlZiAoSGVsbG8geyBuYW1lID0gIndvcmxkIjsgcmVwZWF0ID0gU29tZSAz IH0pID0gIi9oZWxsby93b3JsZD9yZXBlYXQ9MyIpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBVUkwgbWF0Y2hpbmcgaXMgZG9uZSBieSBbcm91dGVzXSBsaWJyYXJ5Lg0KDQogIFRoZXJlJ3Mg YWxzbyBzdXBwb3J0IGZvciBbcm91dGVzIHRoYXQgdHJhY2sgdGhlaXIgcmVzcG9uc2UgdHlwZXNd IGFuZA0KICB0aGUgcHB4IGF1dG9tYXRpY2FsbHkgZGVyaXZlcyBKU09OIGVuY29kZXJzIGFuZCBk ZWNvZGVycyBmb3IgdGhlbSAoYnkNCiAgdXNpbmcgW21lbGFuZ2UtanNvbi5wcHhdKS4NCg0KICBP biB0b3Agb2YgdGhhdCBhIFtzZXBhcmF0ZSBwcHggaXMgcHJvdmlkZWRdIGZvciBbTWVsYW5nZV0g d2hpY2ggYWxsb3dzDQogIHRvIGNvbnN0cnVjdCB0eXBlIHNhZmUgSFRUUCBjbGllbnRzIChyb3V0 ZSBkZWZpbnRpb25zIGFyZSBzaGFyZWQNCiAgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCkuDQoN CiAgSGFwcHkgaGFja2luZyENCg0KDQpbRHJlYW1dIDxodHRwczovL2FhbnRyb24uZ2l0aHViLmlv L2RyZWFtLz4NCg0KW3BweF9kZXJpdmluZ19yb3V0ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Fu ZHJleXBvcHAvcHB4X2Rlcml2aW5nX3JvdXRlcj4NCg0KW3JvdXRlc10gPGh0dHBzOi8vYW51cmFn c29uaS5naXRodWIuaW8vcm91dGVzLz4NCg0KW3JvdXRlcyB0aGF0IHRyYWNrIHRoZWlyIHJlc3Bv bnNlIHR5cGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXlwb3BwL3BweF9kZXJpdmluZ19y b3V0ZXIjcm91dGVzLXdpdGgtdHlwZWQtcmVzcG9uc2VzPg0KDQpbbWVsYW5nZS1qc29uLnBweF0N CjxodHRwczovL2dpdGh1Yi5jb20vbWVsYW5nZS1jb21tdW5pdHkvbWVsYW5nZS1qc29uP3RhYj1y ZWFkbWUtb3YtZmlsZSNwcHgtZm9yLW1lbGFuZ2U+DQoNCltzZXBhcmF0ZSBwcHggaXMgcHJvdmlk ZWRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2FuZHJleXBvcHAvcHB4X2Rlcml2aW5nX3JvdXRlciN1 c2luZy13aXRoLW1lbGFuZ2U+DQoNCltNZWxhbmdlXSA8aHR0cHM6Ly9tZWxhbmdlLnJlLz4NCg0K DQpNaWNhLCBhIFBQWCB0aGF0IGF1dG9tYXRlcyBkaWZmZXJlbnRpYWwgdGVzdGluZyBmb3IgT0Nh bWwgbW9kdWxlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWljYS1hLXBweC10aGF0LWF1dG9tYXRlcy1k aWZmZXJlbnRpYWwtdGVzdGluZy1mb3Itb2NhbWwtbW9kdWxlcy8xNTQwNi8xPg0KDQoNCkVybmVz dCBOZyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBkZWxpZ2h0ZWQgdG8gYW5ub3VuY2UgdGhlIGluaXRp YWwgcmVsZWFzZSBvZiBbTWljYV0sIGEgUFBYIGRlcml2ZXINCiAgdGhhdCBhdXRvbWF0ZXMgZGlm ZmVyZW50aWFsIHRlc3RpbmcgZm9yIGEgcGFpciBvZiBPQ2FtbCBtb2R1bGVzDQogIGltcGxlbWVu dGluZyB0aGUgc2FtZSBzaWduYXR1cmUuIFVzZXJzIGFubm90YXRlIG1vZHVsZSBzaWduYXR1cmVz IHdpdGgNCiAgdGhlIGRpcmVjdGl2ZSBgW0BAZGVyaXZpbmcgbWljYV0nLCBhbmQgYXQgY29tcGls ZS10aW1lLCBNaWNhIGRlcml2ZXMNCiAgc3BlY2lhbGl6ZWQgW3Byb3BlcnR5LWJhc2VkIHRlc3Rp bmddIChQQlQpIGNvZGUgdGhhdCBjaGVja3MgaWYgdHdvDQogIG1vZHVsZXMgaW1wbGVtZW50aW5n IHRoZSBzaWduYXR1cmUgYXJlIG9ic2VydmF0aW9uYWxseQ0KICBlcXVpdmFsZW50LiAoVW5kZXIg dGhlIGhvb2QsIE1pY2EgdXNlcyBKYW5lIFN0cmVldCdzDQogIFtgQ29yZS5RdWlja2NoZWNrJ10g UEJUIGxpYnJhcnkuKQ0KDQogIE1pY2Egd2FzIHByZXNlbnRlZCBhdCB0aGUgT0NhbWwgV29ya3No b3AgJzI0IChbcGFwZXJdKSBhbmQgdGhlIElDRlANCiAgJzIzIFN0dWRlbnQgUmVzZWFyY2ggQ29t cGV0aXRpb24gKFtwb3N0ZXJdKS4NCg0KICAqTm90ZSo6IE1pY2EgaXMgY3VycmVudGx5IGEgcmVz ZWFyY2ggdG9vbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluDQogICBwcm9kdWN0aW9uIGNvZGUs IGFsdGhvdWdoIGNvbnRyaWJ1dGlvbnMgYXJlIHZlcnkgd2VsY29tZSENCg0KICBNaWNhIGlzIGF2 YWlsYWJsZSBvbiBPcGFtOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlIA0K ICDilIIgb3BhbSBpbnN0YWxsIHBweF9taWNhDQogIOKUlOKUgOKUgOKUgOKUgA0KICAoT0NhbWwg NS4xIG9yIG5ld2VyIGlzIHJlcXVpcmVkLikNCg0KICBEb2NzIGFyZSBhdmFpbGFibGUgW2hlcmVd LCBhbmQgYSBzaW1wbGUgd2ViIGFwcCBkZW1vLWluZyBNaWNhIGlzDQogIGF2YWlsYWJsZSBbaGVy ZV0uDQoNCg0KW01pY2FdIDxodHRwczovL2dpdGh1Yi5jb20vbmdlcm5lc3QvbWljYT4NCg0KW3By b3BlcnR5LWJhc2VkIHRlc3RpbmddIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXFt QTlxaGFFQ2NFPg0KDQpbYENvcmUuUXVpY2tjaGVjayddIDxodHRwczovL2Jsb2cuamFuZXN0cmVl dC5jb20vcXVpY2tjaGVjay1mb3ItY29yZS8+DQoNCltwYXBlcl0gPGh0dHBzOi8vYXJ4aXYub3Jn L2Ficy8yNDA4LjE0NTYxPg0KDQpbcG9zdGVyXSA8aHR0cHM6Ly9uZ2VybmVzdC5naXRodWIuaW8v cGRmcy9taWNhX2ljZnAyM3NyY19wb3N0ZXIucGRmPg0KDQpbaGVyZV0gPGh0dHBzOi8vbmdlcm5l c3QuZ2l0aHViLmlvL21pY2EvcHB4X21pY2EvaW5kZXguaHRtbD4NCg0KW2hlcmVdIDxodHRwczov L25nZXJuZXN0LmdpdGh1Yi5pby9taWNhL2RlbW8uaHRtbD4NCg0KDQpTaW1wbGlmaWVkIEFuZHJv aWQgY3Jvc3MtY29tcGlsZXIgd2l0aCBEa01MDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zaW1wbGlmaWVkLWFuZHJvaWQt Y3Jvc3MtY29tcGlsZXItd2l0aC1ka21sLzE1NDA3LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgRGtNTCBoYXMgaGFkIGEgY3Jvc3MtY29tcGlsZXIgZm9yIHllYXJzLCBidXQgSSBo YXZlIGNsZWFuZWQgaXQgdXAgc28NCiAgdGhhdCBpdCBpcyBtdWNoIGVhc2llciB0byB1c2UgZm9y IEFuZHJvaWQgZGV2ZWxvcGVycy4gSXQgKm5vdyB3b3Jrcw0KICB3aXRoIGEgcmVndWxhciBvcGFt IGluc3RhbGxhdGlvbiBpbiBhIGN1c3RvbSByZXBvc2l0b3J5Ki4gQWxzbw0KICBpbmNsdWRlZCBh cmUgcGF0Y2hlcyB0byB0aGUgT0NhbWwgY29tcGlsZXIgdG8gd29yayB3aXRoIEFuZHJvaWQgTkRL DQogIDIxKyAoY3VycmVudGx5IEdvb2dsZSBpcyBhdCBOREsgMjcpLg0KDQogIFRyeSBpdCBvdXQg aWYgeW91IGRvIEFuZHJvaWQgZGV2ZWxvcG1lbnQg4oCmIGp1c3QgY29weS1hbmQtcGFzdGUgdGhl DQogIGluc3RydWN0aW9ucyBiZWxvdyDigKYgYnV0IHBsZWFzZSByZWFkIHRoZSBub3RlcyBhbmQg Y2F1dGlvbnMgYmVsb3cuIEFuZA0KICBpZiB5b3UgYXJlIHN0aWxsIGludGVyZXN0ZWQgaW4gQW5k cm9pZCBkZXZlbG9wbWVudCwgdGVsbCBtZSBzbyBJIGNhbg0KICBkZWNpZGUgaWYgSSdsbCBtZXJn ZSB0aGUgcGFja2FnZXMgaW50byB0aGUgcmVndWxhciBvcGFtIHJlcG9zaXRvcnkuDQoNCiAgVHJp bW1lZCBzbGlnaHRseSBmcm9tIHRoZSBbZGttbC1jb21waWxlciBRdWljayBTdGFydF06DQoNCiAg 4oCiIERvY2tlciBjb250YWluZXIgaXMgdXNlZCBiZWxvdyBmb3IgV2luZG93cyBhbmQgbWFjT1Mg dXNlcnMsIGFuZA0KICAgIGJlY2F1c2UgaXQgaXMgZWFzeSB0byBnZXQgdGhlIEFuZHJvaWQgTkRL IGZyb20gQ2lyY2xlQ0kuDQogIOKAoiBBcHBsZSBTaWxpY29uIGRvZXMgbm90IHN1cHBvcnQgMzIt Yml0LiBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IEFwcGxlDQogICAgU2lsaWNvbiB1c2VycyBjYW5u b3QgY3Jvc3MtY29tcGlsZSBgYW5kcm9pZF9hcm0zMnY3YScuDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAkIGRvY2tlciBydW4gLWl0IC0tcm0gY2ltZy9hbmRyb2lkOjIwMjQuMTAuMS1uZGsN CiAg4pSCIA0KICDilIIgIyBJbnN0YWxsIG9wYW0gaWYgeW91IGRvbid0IGhhdmUgaXQNCiAg4pSC IH4vcHJvamVjdCQgc3VkbyBhcHQtZ2V0IHVwZGF0ZSAmJiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBi dWlsZC1lc3NlbnRpYWwgY3VybCBnaXQgcGF0Y2ggcnN5bmMgdW56aXAgLXkNCiAg4pSCIH4vcHJv amVjdCQgZWNobyAvdXNyL2xvY2FsL2JpbiB8IHN1ZG8gYmFzaCAtYyAic2ggPChjdXJsIC1mc1NM IGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvaW5zdGFsbC5zaCkgLS12ZXJzaW9uIDIuMi4xIg0KICDi lIIgDQogIOKUgiAjIEluaXRpYWxpemUgb3BhbSBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5LiBObyBz YW5kYm94aW5nIGlzIG5lZWRlZCBpbiBjb250YWluZXJzLg0KICDilIIgfi9wcm9qZWN0JCBvcGFt IGluaXQgLS1jbGk9Mi4xIC0tbm8tc2V0dXAgLS1iYXJlIC0tZGlzYWJsZS1zYW5kYm94aW5nDQog IOKUgiANCiAg4pSCICMgVHdvIEFuZHJvaWQgb3B0aW9ucyB0byBzZXQuIEFORFJPSURfUExBVEZP Uk0gaXMgdGhlIG1pbmltdW0gQVBJIGxldmVsICgidGFyZ2V0U2RrVmVyc2lvbiIgaW4gdGhlIEFu ZHJvaWQgbWFuaWZlc3QpDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gdmFyIC0tY2xpPTIuMSAtLWds b2JhbCBBTkRST0lEX05ESz0vaG9tZS9jaXJjbGVjaS9hbmRyb2lkLXNkay9uZGsvMjcuMS4xMjI5 NzAwNg0KICDilIIgfi9wcm9qZWN0JCBvcGFtIHZhciAtLWNsaT0yLjEgLS1nbG9iYWwgQU5EUk9J RF9QTEFURk9STT1hbmRyb2lkLTM0DQogIOKUgiANCiAg4pSCICMgUElDSyBPTkU6IEFuZHJvaWQg YXJtNjQtdjhhIHN3aXRjaA0KICDilIIgfi9wcm9qZWN0JCBvcGFtIHN3aXRjaCBjcmVhdGUgYW5k cm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLWNsaT0yLjEgXA0KICDilIIgICAtLXBhY2thZ2VzIGRr bWwtYmFzZS1jb21waWxlcixka21sLWhvc3QtYWJpLWxpbnV4X3g4Nl82NCxka21sLXRhcmdldC1h YmktYW5kcm9pZF9hcm02NHY4YSxvY2FtbGZpbmQsY29uZi1ka21sLWNyb3NzLXRvb2xjaGFpbiBc DQogIOKUgiAgIC0tcmVwb3MgZGVmYXVsdCxkaXNrdXYtNGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0 aHViLmNvbS9kaXNrdXYvZGlza3V2LW9wYW0tcmVwb3NpdG9yeS5naXQjNGQ3OWU3MzINCiAg4pSC IA0KICDilIIgIyBQSUNLIE9ORTogQW5kcm9pZCBhcm1lYWJpLXY3YSBzd2l0Y2guIFlvdSB3aWxs IG5lZWQgYSAzMi1iaXQgQy9DKysgY29tcGlsZXIuDQogIOKUgiB+L3Byb2plY3QkIHN1ZG8gYXB0 LWdldCBpbnN0YWxsIGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgLXkNCiAg4pSCIH4vcHJvamVj dCQgb3BhbSBzd2l0Y2ggY3JlYXRlIGFuZHJvaWQzNC1uZGsyNy1hcm1lYWJpLXY3YSAtLWNsaT0y LjEgXA0KICDilIIgICAtLXBhY2thZ2VzIGRrbWwtYmFzZS1jb21waWxlcixka21sLWhvc3QtYWJp LWxpbnV4X3g4Nixka21sLXRhcmdldC1hYmktYW5kcm9pZF9hcm0zMnY3YSxvY2FtbGZpbmQsY29u Zi1ka21sLWNyb3NzLXRvb2xjaGFpbiBcDQogIOKUgiAgIC0tcmVwb3MgZGVmYXVsdCxkaXNrdXYt NGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGlza3V2LW9wYW0tcmVwb3Np dG9yeS5naXQjNGQ3OWU3MzINCiAg4pSCIA0KICDilIIgIyBQSUNLIE9ORTogQW5kcm9pZCB4ODZf NjQgc3dpdGNoDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gc3dpdGNoIGNyZWF0ZSBhbmRyb2lkMzQt bmRrMjcteDg2XzY0IC0tY2xpPTIuMSBcDQogIOKUgiAgIC0tcGFja2FnZXMgZGttbC1iYXNlLWNv bXBpbGVyLGRrbWwtaG9zdC1hYmktbGludXhfeDg2XzY0LGRrbWwtdGFyZ2V0LWFiaS1hbmRyb2lk X3g4Nl82NCxvY2FtbGZpbmQsY29uZi1ka21sLWNyb3NzLXRvb2xjaGFpbiBcDQogIOKUgiAgIC0t cmVwb3MgZGVmYXVsdCxkaXNrdXYtNGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kaXNr dXYvZGlza3V2LW9wYW0tcmVwb3NpdG9yeS5naXQjNGQ3OWU3MzINCiAg4pSCIA0KICDilIIgIyBU SEVOOiBHZXQgYW5kIGNyb3NzLWNvbXBpbGUgeW91ciBzb3VyY2UgY29kZS4gSGVyZSB3ZSB1c2Ug RHVuZSBhbmQgYXNzdW1lICdhbmRyb2lkMzQtbmRrMjctYXJtNjQtdjhhJw0KICDilIIgfi9wcm9q ZWN0JCBvcGFtIGluc3RhbGwgLS1jbGk9Mi4xIC0tc3dpdGNoIGFuZHJvaWQzNC1uZGsyNy1hcm02 NC12OGEgZHVuZQ0KICDilIIgfi9wcm9qZWN0JCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29t L2F2c20vaGVsbG8td29ybGQtYWN0aW9uLW9jYW1sIGhlbGxvDQogIOKUgiB+L3Byb2plY3QkIGNk IGhlbGxvDQogIOKUgiB+L3Byb2plY3QvaGVsbG8kIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0 Y2ggYW5kcm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIGR1bmUgYnVpbGQgLXgg YW5kcm9pZF9hcm02NHY4YSB3b3JsZC5leGUNCiAg4pSCIA0KICDilIIgfi9wcm9qZWN0L2hlbGxv JCBmaWxlIF9idWlsZC9kZWZhdWx0Ki93b3JsZC5leGUNCiAg4pSCIF9idWlsZC9kZWZhdWx0LmFu ZHJvaWRfYXJtNjR2OGEvd29ybGQuZXhlOiBFTEYgNjQtYml0IExTQiBwaWUgZXhlY3V0YWJsZSwg QVJNIGFhcmNoNjQsIHZlcnNpb24gMSAoU1lTViksIGR5bmFtaWNhbGx5IGxpbmtlZCwgaW50ZXJw cmV0ZXIgL3N5c3RlbS9iaW4vbGlua2VyNjQsIHdpdGggZGVidWdfaW5mbywgbm90IHN0cmlwcGVk DQogIOKUgiBfYnVpbGQvZGVmYXVsdC93b3JsZC5leGU6ICAgICAgICAgICAgICAgICAgRUxGIDY0 LWJpdCBMU0IgcGllIGV4ZWN1dGFibGUsIHg4Ni02NCwgdmVyc2lvbiAxIChTWVNWKSwgZHluYW1p Y2FsbHkgbGlua2VkLCBpbnRlcnByZXRlciAvbGliNjQvbGQtbGludXgteDg2LTY0LnNvLjIsIEJ1 aWxkSURbc2hhMV09MTczMWFkOWNlMGZkZWZmNjlkZjI4YWYwYjEyMTdlODQzZWFiZTI2ZSwgZm9y IEdOVS9MaW51eCAzLjIuMCwgd2l0aCBkZWJ1Z19pbmZvLCBub3Qgc3RyaXBwZWQNCiAg4pSCIA0K ICDilIIgIyBZb3UgY2FuIGFsc28gZGlyZWN0bHkgdXNlIHRoZSBvY2FtbGZpbmQgLXRvb2xjaGFp bg0KICDilIIgDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0Y2gg YW5kcm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIG9jYW1sZmluZCBvY2FtbGMg LWNvbmZpZy12YXIgbmF0aXZlX2NfY29tcGlsZXINCiAg4pSCIGdjYyAtTzIgLWZuby1zdHJpY3Qt YWxpYXNpbmcgLWZ3cmFwdiAtcHRocmVhZCAtZlBJQyAgLURfRklMRV9PRkZTRVRfQklUUz02NA0K ICDilIIgDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0Y2ggYW5k cm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIG9jYW1sZmluZCAtdG9vbGNoYWlu IGFuZHJvaWRfYXJtNjR2OGEgb2NhbWxjIC1jb25maWctdmFyIG5hdGl2ZV9jX2NvbXBpbGVyDQog IOKUgiAvaG9tZS9jaXJjbGVjaS9hbmRyb2lkLXNkay9uZGsvMjcuMS4xMjI5NzAwNi90b29sY2hh aW5zL2xsdm0vcHJlYnVpbHQvbGludXgteDg2XzY0L2Jpbi9hYXJjaDY0LWxpbnV4LWFuZHJvaWQz NC1jbGFuZyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZ3cmFwdiAtcHRocmVhZCAtZlBJQyAg LURfRklMRV9PRkZTRVRfQklUUz02NA0KICDilJTilIDilIDilIDilIANCg0KICBEa01MIHN1cHBv cnRzIHRocmVlIG91dCBvZiB0aGUgZm91ciBzdXBwb3J0ZWQgQW5kcm9pZCBBQklzLiBUaGUgdGhy ZWUNCiAgQUJJcyAoYWxsIGJ1dCBgeDg2Jykgd2VyZSBjaG9zZW4gYmFzZWQgb24gW3N0YXRpc3Rp Y3MgZm9yIGEgbGFyZ2UgZ2FtZQ0KICBvbiBBdWcgMjksIDIwMjNdOg0KDQogIOKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0K ICAgQXJjaCAgICAgICAgIFBlcmNlbnQgDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KICAgYXJtNjQtdjhhICAgICAg NjguNjYgDQogICBhcm1lYWJpLXY3YSAgICAzMC4zOCANCiAgIHg4Nl82NCAgICAgICAgICAwLjcx IA0KICAgeDg2ICAgICAgICAgICAgIDAuMjYgDQogIOKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KDQogIGFuZCBhbHNvIFtH b29nbGUncyByZWNvbW1lbmRhdGlvbl06DQoNCiAgKk5vdGUqOiBXaGlsZSA2NC1iaXQtb25seSBk ZXZpY2VzIHdpbGwgZ3JvdyBpbiBwb3B1bGFyaXR5IHdpdGggcGhvbmVzDQogICBqb2luaW5nIEFu ZHJvaWQgQXV0byBpbiB0aGlzIGdyb3VwLCAzMi1iaXQtb25seSBkZXZpY2VzIHdpbGwgY29udGlu dWUNCiAgIHRvIGJlIGltcG9ydGFudCBmb3IgQW5kcm9pZCBHbywgQW5kcm9pZCBUViwgYW5kIEFu ZHJvaWQgV2Vhci4gUGxlYXNlDQogICBjb250aW51ZSBzdXBwb3J0aW5nIDMyLWJpdCBBQklzOyBH b29nbGUgUGxheSB3aWxsIGNvbnRpbnVlIHNlcnZpbmcNCiAgIDMyLWJpdCBhcHBzIHRvIDMyLWJp dC1vbmx5IGRldmljZXMuDQoNCiAgRmluYWxseSwgYSB3b3JkIG9mICpDQVVUSU9OKi4gVGhlIEFu ZHJvaWQgY3Jvc3MtY29tcGlsZXIgL2NhbiBuZXZlci8NCiAgdXNlIE9DYW1sIDUrIGJlY2F1c2Ug W09DYW1sIDUgd2lsbCBuZXZlciBicmluZyBiYWNrIHRoZSAzMi1iaXQNCiAgaW5zdHJ1Y3Rpb24g c2V0XS4gVGhhdCBtZWFucyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkcm9wIGEgbGFyZ2UgcGVyY2Vu dA0KICBvZiB5b3VyIHVzZXJzIG9yIGRyb3AgbmV3IEFuZHJvaWQgY2F0ZWdvcmllcyBvdmVyIHRo ZSBuZXh0IGZpdmUgKD8pDQogIHllYXJzLCB5b3Ugd2lsbCBoYXZlIGEgY3JpdGljYWwgZGVwZW5k ZW5jeSBvbiBEa01MLg0KDQoNCltka21sLWNvbXBpbGVyIFF1aWNrIFN0YXJ0XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9kaXNrdXYvZGttbC1jb21waWxlcj90YWI9cmVhZG1lLW92LWZpbGUjcXVpY2st c3RhcnQ+DQoNCltzdGF0aXN0aWNzIGZvciBhIGxhcmdlIGdhbWUgb24gQXVnIDI5LCAyMDIzXQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkL25kay9pc3N1ZXMvMTc3MiNpc3N1ZWNvbW1lbnQt MTY5NzgzMTUxOD4NCg0KW0dvb2dsZSdzIHJlY29tbWVuZGF0aW9uXQ0KPGh0dHBzOi8vYW5kcm9p ZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMjIvMTAvNjQtYml0LW9ubHktZGV2aWNlcy5o dG1sPg0KDQpbT0NhbWwgNSB3aWxsIG5ldmVyIGJyaW5nIGJhY2sgdGhlIDMyLWJpdCBpbnN0cnVj dGlvbiBzZXRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzMyLWJpdC1uYXRpdmUtY29k ZS1zdXBwb3J0LWZvci1vY2FtbC01LzEyNTgzLzEzP3U9amJlY2tmb3JkPg0KDQoNCk90aGVyIE9D YW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUg bGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcN CiAgYmxvZ10uDQoNCiAg4oCiIFtEZXZlbG9wZXIgZWR1Y2F0aW9uIGF0IEphbmUgU3RyZWV0XQ0K ICDigKIgW1NvbHZpbmcgUHV6emxlcyBpbiBQcm9kdWN0aW9uIHdpdGggTGlvcmEgRnJpZWRiZXJn XQ0KICDigKIgW01ldEFjc2wgdjAuNyBmb3IgRnJhbWEtQyAyOS4wfiBDb3BwZXJdDQogIOKAoiBb SW50cm9kdWNpbmcgdGhlIER1bmUgRGV2ZWxvcGVyIFByZXZpZXc6IEEgTmV3IEVyYSBmb3IgT0Nh bWwNCiAgICBEZXZlbG9wbWVudF0NCiAg4oCiIFtVbmxvY2sgeW91ciBUZWFt4oCZcyBQb3RlbnRp YWwgd2l0aCBFeHBlcnQgVHJhaW5pbmcgaW4gT0NhbWwsDQogICAgQ3liZXJzZWN1cml0eSBGdW5k YW1lbnRhbHMsIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIGFuZCBNb3JlXQ0KICDigKIgW0FsdC1F cmdvIDIuNiBpcyBPdXQhXQ0KICDigKIgW0hhcHB5IGV5ZWJhbGxzPyFdDQoNCg0KW3RoZSBvY2Ft bC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbRGV2ZWxvcGVyIGVkdWNh dGlvbiBhdCBKYW5lIFN0cmVldF0NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vZGV2ZWxv cGVyLWVkdWNhdGlvbi1hdC1qYW5lLXN0cmVldC1pbmRleC8+DQoNCltTb2x2aW5nIFB1enpsZXMg aW4gUHJvZHVjdGlvbiB3aXRoIExpb3JhIEZyaWVkYmVyZ10NCjxodHRwczovL3NpZ25hbHMtdGhy ZWFkcy5zaW1wbGVjYXN0LmNvbS9lcGlzb2Rlcy9zb2x2aW5nLXB1enpsZXMtaW4tcHJvZHVjdGlv bi13aXRoLWxpb3JhLWZyaWVkYmVyZy1kazZ2WW5LMj4NCg0KW01ldEFjc2wgdjAuNyBmb3IgRnJh bWEtQyAyOS4wfiBDb3BwZXJdDQo8aHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy1wbHVnaW5zL21ldGFj c2wuaHRtbD4NCg0KW0ludHJvZHVjaW5nIHRoZSBEdW5lIERldmVsb3BlciBQcmV2aWV3OiBBIE5l dyBFcmEgZm9yIE9DYW1sDQpEZXZlbG9wbWVudF0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyNC0xMC0wMy1pbnRyb2R1Y2luZy10aGUtZHVuZS1kZXZlbG9wZXItcHJldmlldy1hLW5ldy1l cmEtZm9yLW9jYW1sLWRldmVsb3BtZW50Pg0KDQpbVW5sb2NrIHlvdXIgVGVhbeKAmXMgUG90ZW50 aWFsIHdpdGggRXhwZXJ0IFRyYWluaW5nIGluIE9DYW1sLA0KQ3liZXJzZWN1cml0eSBGdW5kYW1l bnRhbHMsIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIGFuZCBNb3JlXQ0KPGh0dHBzOi8vdGFyaWRl cy5jb20vYmxvZy8yMDI0LTEwLTAxLXVubG9jay15b3VyLXRlYW0tcy1wb3RlbnRpYWwtd2l0aC1l eHBlcnQtdHJhaW5pbmctaW4tb2NhbWwtY3liZXJzZWN1cml0eS1mdW5kYW1lbnRhbHMtZnVuY3Rp b25hbC1wcm9ncmFtbWluZy1hbmQtbW9yZT4NCg0KW0FsdC1FcmdvIDIuNiBpcyBPdXQhXQ0KPGh0 dHBzOi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAyNF8wOV8wMV9hbHRfZXJnb18yXzZfMF9yZWxlYXNl ZD4NCg0KW0hhcHB5IGV5ZWJhbGxzPyFdIDxodHRwczovL2Jsb2cub3NhdS5yZS9hcnRpY2xlcy9o YXBweV9leWViYWxscy5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3Nh Z2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhl IGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5 b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1 YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Pg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoN CltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1w YS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 01 to 08, 202= 4.

Releases of fpath-sexplib0, fpath-base, loc, file-rewriter, se= xps-rewriter and provider

Mathieu Barbin announced

I wanted to announce the initial release of 6 utility packages to the opam-= repository. They are dependencies to some other ongoing projects I have, pe= rhaps some will find them useful.

These are very early days for this software. Please feel welcome to opening= issues or discussions tickets if you are inclined.

Thank you @mseri , @avsm & @shonfeder for your help in making these lib= raries available!

Below you'll find short descriptions with links to the packages home pages.= Thank you!

Fpath_sexplib0 only d= epends on fpath and sexplib0. It defines a single= module, Fpath_sexplib0, which is designed to be opened to sha= dow the Fpath module to add small helpers and a sexp_of<= /code> serializer to it. The package also introduces three new modules to t= he scope: Fpart, Absolute_path and Relative= _path to increase type-safety when manipulating paths that are known= to be relative or absolute.

Fpath_base further ex= tends fpath-sexplib0 and adds a dependency on base. It is desi= gned to be compatible with Base-style containers such as Map, = Set, Hashtbl, Hash_set.

Loc is an OCaml library to m= anipulate code locations, which are ranges of lexing positions from a parse= d file.

File_rewriter is a= n OCaml library for applying small rewrites to tweak or refactor your files= . It provides a convenient interface to apply surgical textual substitution= s on the fly, while navigating the contents of a file through an abstract r= epresentation containing code locations.

Sexps_rewriter is = a specialized version of the file-rewriter library dedicated t= o rewriting sexp files, such as dune config files.

Provider is an OCaml li= brary for creating Traits and Interfaces. It allows you to define the funct= ionality needed by a library without committing to a specific implementatio= n - in essence : dynamic dispatch. Provider is a pattern featured in the Eio project (Eio.Resource). I wanted to make it reu= sable in other projects - in particular I am currently using it as the para= metrization story of vcs. This package had already been availa= ble for a little while already but was still unannounced.

Build a project without Stdlib

Mikhail announced

I decided to experiment with compiling a project without the standard libra= ry. Why? I don't know. But I could save ~50K. Just sharing my note about it.

You can find an example in my repository.

I found the -nostdlib and -nopervasives (undocume= nted) flags and after a lot of trying I was able to do what I wanted. It do= esn't disable absolutely everything (lists and other types like optio= n are available).

(flags
  :standard
  -nostdlib
  -nopervasives
  ; add runtime
  -cclib
  -lasmrun
  -ccopt
  "-L %{ocaml_where}"
  -ccopt
  "-lm -ldl")
(* stdlib.=
ml *)
external print_endline : string -> unit =3D "caml_print_endline" [@@noalloc]

(* main.ml *)
open Stdlib
let () =3D print_=
endline "hello from my stdlib"

Hello World program:

  with Stdlib without Stdlib
size 349K 302K

obatcher: Framework for building efficient concurrent services=

Lee Koon Wen announced

Hot on the heels of the paper "Concurrent Data Structures Made= Easy" appearing at OOPSLA 2024= on the 24th October, I'm pleased to announce release of obatcher - = a picos compatible library for implementin= g efficient batched services in OCaml.

obatcher proposes a new way to approach the design and implem= entation of concurrent services. It's key benefits are:

  • Incremental optimization and parallelism of services
  • Easy to control and reason about concurrency
  • Retains atomic-style interface with your services while batching happen= s implicitly
  • Thread-safety for cheap!

Available on opam today, install with

opam install obatcher

For more details, check out the source and README on GitHub: obatcher.

Feedback, contributions, and discussions are welcome!

DBLP query program and library

Samuel Mimram announced

I am happy to announce the first realease of ocaml-dblp, which provides both a program and a lib= rary to query the DBLP bibliographic data= base. In practice, it is mostly useful for retrieving bibtex entries with c= ommands such as

dblp bibtex girard locus solum

which will spit out

@article{DBLP:journals/mscs/Girard01,
  author       =3D {Jean{-}Yves Gira=
rd},
  title        =3D {Locus Solum: Fro=
m the rules of logic to the logic of rules},
  journal      =3D {Math. Struct. Co=
mput. Sci.},
  volume       =3D {11},
  number       =3D {3},
  pages        =3D {301--506},
  year         =3D {2001},
  url          =3D {https://doi.org/10.1017/S096012=
950100336X},
  doi          =3D {10.1017/S096012950100336X},
  timestamp    =3D {Wed, 01 Apr 2020=
 08:48:47 +0200},
  biburl       =3D {https://dblp.org=
/rec/journals/mscs/Girard01.bib},
  bibsource    =3D {dblp computer sc=
ience bibliography, https://dblp.org}
}

(or, even better, use dblp bib to directly add this at the end= of the .bib file in the current directory).

It might still need some polishing, feel free to reach out if you encounter= some problems.

cudajit: Bindings to the cuda and nvrtc libraries

Lukasz Stafiniak announced

cudajit 0.5.0 is now available in the opam repository. It's organized into = modules, and it adds support for CUDA events.

YOCaml, a framework for static site generator

Xavier Van de Woestyne announced

:wave: Hello everyone! We, the YOCaml development team, are very pleased to= announce the release of version 2, freshly merged into opam-repository :champagne:!=20

YOCaml is a framework for describing static site generators (a very = small applicative build-system whose API is tailor-made for creating web pa= ges ) and its internal model is very similar to Hakyll (the 3th version), another Haskell framework. (a p= resentation was given to the OCaml user Group in Paris and you can find the= video, in French, here).

Changes with 1.0.0

Historically, YOCaml was written very, very quickly to give examples of sli= ghtly exotic uses of the library Preface. Due to its experimental nature, the API was a bit laborious, = but we did find some users! We took advantage of the redesign to stop relyi= ng on Preface (and yes, YOCaml was already more widely used than Preface), = move to OCaml 5.x and take advantage of user-defi= ned-effects and support dynamic dependencies. In other words, YOCaml= 2.0.0 is not at all compatible with version 1…

Plugins and runtimes

The aim of YOCaml is to be very generic and to allow users to bring their o= wn dependencies, but we've taken the opportunity to release it with several= plugins and runtimes so that it can be used directly.

  • Runtimes

    A Runtime is an =E2=80=98execution context=E2=80=99 and generally exposes t= he primitive used to execute a YOCaml program. YOCaml 2 is bundled with 3 R= untimes:

    • Yocaml_unix: the default runtime, whose preview server is implem= ented on top of the brand new httpcats!
    • Yocaml_eio: a runtime iso to Unix but based on eio and whose preview server is descr= ibed by cohttp_eio.<= /li>
    • Yocaml_git: a parameterised runtime for generating a site direct= ly in a git repository, which can be served, for example, by a Mirage (unipi), very well documented in this excellent article by @dinosaure!
  • Plugins
    • Yocaml_cmarkit provides a convenient API (via YOCaml) for conver= ting Markdown files to HTML via the excellent cmarkit library.
    • Yocaml_omd provides a convenient API (via YOCaml) for converting= Markdown files to HTML via the excellent OMD library (but we recommend yocaml_cmarkit).
    • yocaml_yaml provides a convenient API (via YOCaml) for reading Y= aml via the excellent library ocaml-yaml
    • yocaml_otoml provides a convenient API (for YOCaml) for reading = TOML via the excellent library Otoml
    • yocaml_mustache provides a convenient API (via YOCaml) for using= Mustache as a template languag= e via the excellent library ocaml-mustache
    • yocaml_jingoo provides a convenient API (via YOCaml) for using <= a href=3D"http://tategakibunko.github.io/jingoo/">Jingoo as a template = language via the excellent library jingoo
    • yocaml_syndication that gives tool to generate feeds ([Atom](https://en.wikip= edia.org/wiki/Atom_(web_standard)), RSS 1 and 2 and OPML). The= library is inspired by Syndi= c but does not depend directly on it.

A final word

YOCaml 2 was mainly written by xhtm= lboi, helped by gr-im, mspwn and dinosaure with occasional support from maiste. It has already been used experimentally in a nu= mber of small projects:

You will also find extensively documented examples in the examples directory.

To conclude, we find (not very objectively) that YOCaml is a lot of fun to = use, and it's very cool to make your site using as much OCaml as possible.= =20

Happy Hacking!

oepub 0.1.0 : A library to parse epub files

EruEri announced

I humbly announce oepub a small library to parse epub files and to some ext= end create a list of chapters from the epub archive.

You can find the repository at Codeberg - Oepub

ppx_deriving_router =E2=80=94 type safe routing for Dream and = Melange

Andrey Popp announced

It's my pleasure to announce a new ppx for deriving Dream routers based on variant type declarations,= ppx_deriving= _router.

A small example. First we define routes (the signature showcases the genera= ted code):

module Pages : sig
  ...

  val href : t -> string
  (** generate URL from=
 the route *)

  val http_method : t -> [ `DELETE | `GET | `POST | `PUT ]
  (** HTTP method for t=
he route *)

  val handle : (t -> Dream.handler) -> Dream.handler
  (** create a route ha=
ndler *)
end =3D struct
  open Ppx_deriving_router_runtime.Primitives

  type t =3D
    | Home [@GET "/"]
    | About
    | Hello of { name : st=
ring; repeat : int option } [@GET "/hello/:name"]
    [@@deriving router]
end

Then we describe how we handle each route:

let handle =3D
  Pages.handle (fun r=
oute _req ->
      match route=
 with
      | Home -> Dream.respond "Home page!"
      | About -> Dream.respond "About page!"
      | Hello { name; repeat } ->
          let name =3D
            match=
 repeat with
            | So=
me repeat ->
                List.init repeat (fun _ -> name) |>=
 String.concat ", "
            | No=
ne -> name
          in
          Dream.respond (Printf.sprintf =
"Hello, %s" name))

let () =3D Dream.run =
~interface:"127.0.0.1" ~port:8080 handle

Using generated Pages.href function we can generate URLs for r= outes:

let () =3D
  assert (Pages.href Home =3D =
"/");
  assert (Pages.href About =3D "/about");
  assert (Pages.href (Hello { name =3D "world"; repeat =3D None }) =3D "/he=
llo/world");
  assert (Pages.href (Hello { name =3D "world"; repeat =3D Some 3 }) =3D "/=
hello/world?repeat=3D3")

The URL matching is done by routes library.

There's also support for routes that track their response ty= pes and the ppx automatically derives JSON encoders and decoders for th= em (by using melange-json.ppx).

On top of that a separate ppx is provided for Melange which allows to construct type safe HTTP clients (= route defintions are shared between server and client).

Happy hacking!

Mica, a PPX that automates differential testing for OCaml modu= les

Ernest Ng announced

I'm delighted to announce the initial release of Mica, a PPX deriver that automates differential test= ing for a pair of OCaml modules implementing the same signature. Users anno= tate module signatures with the directive [@@deriving mica], a= nd at compile-time, Mica derives specialized property-based testing (PBT) code that chec= ks if two modules implementing the signature are observationally equivalent= . (Under the hood, Mica uses Jane Street's Core.Quickcheck PBT library.)

Mica was presented at the OCaml Workshop '24 (paper) and the ICFP '23 Student Research Competition (<= a href=3D"https://ngernest.github.io/pdfs/mica_icfp23src_poster.pdf">poster= ).=20

Note: Mica is currently a research tool and should not be used in pr= oduction code, although contributions are very welcome!

Mica is available on Opam:=20

opam update=20
opam install ppx_mica

(OCaml 5.1 or newer is required.)

Docs are available here, and a simple web app demo-ing Mica is available here.

Simplified Android cross-compiler with DkML

jbeckford announced

DkML has had a cross-compiler for years, but I have cleaned it up so that i= t is much easier to use for Android developers. It now works with a regu= lar opam installation in a custom repository. Also included are patches= to the OCaml compiler to work with Android NDK 21+ (currently Google is at= NDK 27).

Try it out if you do Android development … just copy-and-paste the i= nstructions below … but please read the notes and cautions below. An= d if you are still interested in Android development, tell me so I can deci= de if I'll merge the packages into the regular opam repository.

Trimmed slightly from the dkml-compiler Quick Start:

  • Docker container is used below for Windows and macOS users, and because= it is easy to get the Android NDK from CircleCI.
  • Apple Silicon does not support 32-bit. The net effect is that Apple Sil= icon users cannot cross-compile android_arm32v7a.
$ docker run -it --rm cimg/android:2024.10.1-ndk

# Install opam if you don't have it
~/project$ sudo apt-get update && sudo apt-get install build-essent=
ial curl git patch rsync unzip -y
~/project$ echo /usr/local/bin | sudo bash -c "sh <(curl -fsSL https://o=
pam.ocaml.org/install.sh) --version 2.2.1"

# Initialize opam if you haven't already. No sandboxing is needed in contai=
ners.
~/project$ opam init --cli=3D2.1 --no-setup --bare --disable-sandboxing

# Two Android options to set. ANDROID_PLATFORM is the minimum API level ("t=
argetSdkVersion" in the Android manifest)
~/project$ opam var --cli=3D2.1 --global ANDROID_NDK=3D/home/circleci/andro=
id-sdk/ndk/27.1.12297006
~/project$ opam var --cli=3D2.1 --global ANDROID_PLATFORM=3Dandroid-34

# PICK ONE: Android arm64-v8a switch
~/project$ opam switch create android34-ndk27-arm64-v8a --cli=3D2.1 \
  --packages dkml-base-compiler,dkml-host-abi-linux_x86_64,dkml-target-abi-=
android_arm64v8a,ocamlfind,conf-dkml-cross-toolchain \
  --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
am-repository.git#4d79e732

# PICK ONE: Android armeabi-v7a switch. You will need a 32-bit C/C++ compil=
er.
~/project$ sudo apt-get install gcc-multilib g++-multilib -y
~/project$ opam switch create android34-ndk27-armeabi-v7a --cli=3D2.1 \
  --packages dkml-base-compiler,dkml-host-abi-linux_x86,dkml-target-abi-and=
roid_arm32v7a,ocamlfind,conf-dkml-cross-toolchain \
  --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
am-repository.git#4d79e732

# PICK ONE: Android x86_64 switch
~/project$ opam switch create android34-ndk27-x86_64 --cli=3D2.1 \
  --packages dkml-base-compiler,dkml-host-abi-linux_x86_64,dkml-target-abi-=
android_x86_64,ocamlfind,conf-dkml-cross-toolchain \
  --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
am-repository.git#4d79e732

# THEN: Get and cross-compile your source code. Here we use Dune and assume=
 'android34-ndk27-arm64-v8a'
~/project$ opam install --cli=3D2.1 --switch android34-ndk27-arm64-v8a dune
~/project$ git clone https://github.com/avsm/hello-world-action-ocaml hello
~/project$ cd hello
~/project/hello$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -=
- \
  dune build -x android_arm64v8a world.exe

~/project/hello$ file _build/default*/world.exe
_build/default.android_arm64v8a/world.exe: ELF 64-bit LSB pie executable, A=
RM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/l=
inker64, with debug_info, not stripped
_build/default/world.exe:                  ELF 64-bit LSB pie executable, x=
86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x8=
6-64.so.2, BuildID[sha1]=3D1731ad9ce0fdeff69df28af0b1217e843eabe26e, for GN=
U/Linux 3.2.0, with debug_info, not stripped

# You can also directly use the ocamlfind -toolchain

~/project$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -- \
  ocamlfind ocamlc -config-var native_c_compiler
gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC  -D_FILE_OFFSET_BITS=3D=
64

~/project$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -- \
  ocamlfind -toolchain android_arm64v8a ocamlc -config-var native_c_compiler
/home/circleci/android-sdk/ndk/27.1.12297006/toolchains/llvm/prebuilt/linux=
-x86_64/bin/aarch64-linux-android34-clang -O2 -fno-strict-aliasing -fwrapv =
-pthread -fPIC  -D_FILE_OFFSET_BITS=3D64

DkML supports three out of the four supported Android ABIs. The three ABIs = (all but x86) were chosen based on statistics for a large = game on Aug 29, 2023:

Arch Percent
arm64-v8a 68.66
armeabi-v7a 30.38
x86_64 0.71
x86 0.26

and also Google's recommendation:

Note: While 64-bit-only devices will grow in popularity with phones = joining Android Auto in this group, 32-bit-only devices will continue to be= important for Android Go, Android TV, and Android Wear. Please continue su= pporting 32-bit ABIs; Google Play will continue serving 32-bit apps to 32-b= it-only devices.

Finally, a word of CAUTION. The Android cross-compiler can never<= /i> use OCaml 5+ because OCaml 5 will never brin= g back the 32-bit instruction set. That means if you don't want to drop= a large percent of your users or drop new Android categories over the next= five (?) years, you will have a critical dependency on DkML.

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 <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--