From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 7CFB882355 for ; Mon, 11 Dec 2017 07:50:33 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=sven.sauleau@xtuc.fr; spf=Neutral smtp.mailfrom=sven.sauleau@xtuc.fr; spf=None smtp.helo=postmaster@6.mo176.mail-out.ovh.net Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of sven.sauleau@xtuc.fr) identity=pra; client-ip=46.105.44.204; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="sven.sauleau@xtuc.fr"; x-sender="sven.sauleau@xtuc.fr"; x-conformance=sidf_compatible Received-SPF: Neutral (mail3-smtp-sop.national.inria.fr: domain of sven.sauleau@xtuc.fr does not assert whether or not 46.105.44.204 is permitted sender) identity=mailfrom; client-ip=46.105.44.204; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="sven.sauleau@xtuc.fr"; x-sender="sven.sauleau@xtuc.fr"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@6.mo176.mail-out.ovh.net) identity=helo; client-ip=46.105.44.204; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="sven.sauleau@xtuc.fr"; x-sender="postmaster@6.mo176.mail-out.ovh.net"; x-conformance=sidf_compatible IronPort-PHdr: =?us-ascii?q?9a23=3A5T9jLxynGPP46j/XCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?0u0UIJqq85mqBkHD//Il1AaPBtqLra8cw8Pt8IneGkU4qa6bt34DdJEeHzQksu?= =?us-ascii?q?4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2UXPdrkWVyHZSR0y+ZkJJ?= =?us-ascii?q?IbGhEYfXi4Gz1vuu05zVeQRBwjSnN+BcNhKz+D7Pu89euqJfDosY91OduWVFfa?= =?us-ascii?q?JNzH5sKFuOtwbg+8z28oQ1oHcYgO4o68MVCfayRK8/V7ENUW0r?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DpAgBUKi5ah8wsaS5bHQEBBQELAYQkd?= =?us-ascii?q?CcHg3uLFY9WiSSQLAojhRgCCBKERUMUAQEBAQEBAQEBARIBAQEIDQkIKC+COAw?= =?us-ascii?q?MglMDAyMEYgs/AwICAh0CJREGDQYCAQEQColyAxkMpxeBbTomhwoNgyYBAQEBA?= =?us-ascii?q?QUBAQEBAQEBHAWDaINhghKCTDaCaoJMgn6CYwWIV4ILjmmJCT0eaYV3e4gshHy?= =?us-ascii?q?TY4hwhBo9iReBOzZIgSlzS4IpgmKBdHeIUgGBFAEBAQ?= X-IPAS-Result: =?us-ascii?q?A0DpAgBUKi5ah8wsaS5bHQEBBQELAYQkdCcHg3uLFY9WiSS?= =?us-ascii?q?QLAojhRgCCBKERUMUAQEBAQEBAQEBARIBAQEIDQkIKC+COAwMglMDAyMEYgs/A?= =?us-ascii?q?wICAh0CJREGDQYCAQEQColyAxkMpxeBbTomhwoNgyYBAQEBAQUBAQEBAQEBHAW?= =?us-ascii?q?DaINhghKCTDaCaoJMgn6CYwWIV4ILjmmJCT0eaYV3e4gshHyTY4hwhBo9iReBO?= =?us-ascii?q?zZIgSlzS4IpgmKBdHeIUgGBFAEBAQ?= X-IronPort-AV: E=Sophos;i="5.45,391,1508796000"; d="scan'208,217";a="247871644" Received: from 6.mo176.mail-out.ovh.net ([46.105.44.204]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Dec 2017 07:50:03 +0100 Received: from ex.mail.ovh.net (gw2.ex.mail.ovh.net [176.31.149.1]) by mo176.mail-out.ovh.net (Postfix) with SMTP id E6EE6A5A34 for ; Mon, 11 Dec 2017 07:50:02 +0100 (CET) To: References: From: Sven SAULEAU Message-ID: Date: Mon, 11 Dec 2017 07:50:02 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/alternative; boundary="------------795CF74694864722D42B0D4F" Content-Language: en-US X-Originating-IP: [90.63.216.93] X-ClientProxiedBy: CAS05.indiv.local (172.16.1.5) To MBX018.indiv.local (172.16.2.18) X-Ovh-Tracer-Id: 3069766098121983007 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtuddrvdehgdegiecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecu X-Validation-by: sven.sauleau@xtuc.fr Subject: Re: [Caml-list] ReasonML concrete syntax --------------795CF74694864722D42B0D4F Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable Hi, The reason behind that move (from Reasonml version 2 to 3), is that it feel= s more natural to JavaScript developers. Since it's quite a new language and their main target are JS developers thi= s kinda make sense to me but I agree with Viet, as a ML fan I don't like th= is new syntax. Also I hope it won't confuse them about functional programming concepts. Pa= rtial application for example looks not clear at all that way: let add =3D (x, y) =3D> x + y; let addFive =3D add(5); let eleven =3D addFive(6); let twelve =3D addFive(7); In JavaScript add* functions clearly only take one argument. has very well received in the JavaScript community and it will lead to wide= r OCaml adoption I'm afraid it probably won't, if they are used to the JavaScript syntax. Re= asonml is also meant to be used in the web more than used through OCaml. Sven. On 11/12/2017 06:50, Viet Le wrote: Such a terrible way to cave in to appear more JS-esque. I really hope OCaml= community doesn't adopt this style because it's confusing, inelegant and s= uperficial. Viet. On Mon, 11 Dec 2017 at 00:11, Yawar Amin > wrote: Hi Bob, you can find more details about the syntax change and discussion in= this slightly outdated PR: https://github.com/facebook/reason/pull/1299 Long story short, you can write let add((m, n)) =3D m + n. Note that the ReasonML project actually includes several long-time members = of the OCaml community. I feel that the new syntax has very well received i= n the JavaScript community and it will lead to wider OCaml adoption. It's a= win-win situation. Regards, Yawar On Sun, Dec 10, 2017 at 1:12 PM, Robert Muller > wrote: The team developing ReasonML seems to be experimenting with concrete syntax= in an effort to make it feel as familiar and natural as possible to JavaSc= ript programmers. Seems like a good idea. But the present version seems to = hardwire parentheses awkwardly for function definitions and calls. Parenthe= ses are required for both function definitions and calls. So one writes let incr(n) =3D n + 1 and incr(5) but not let incr n =3D n + 1 or incr 5 Fair enough, but for multi-argument functions the parser seems to unroll th= e parenthesized items (both parameters & arguments) to leave curried functi= ons. E.g., let add(m, n) =3D m + n or equivalently let add =3D (m, n) =3D> m + n then add(5, 3) is 8 as one would expect. But the (m, n) in let add(m, n) = =3D ... isn't a pattern matching a pair, it's the JS-style sequence of inpu= t parameters and the definition unrolls to let add =3D (m) =3D> (n) =3D> ..= . . So add(5) : int -> int and all three of add(5, 3), add(5)(3) and { let = add5 =3D add(5); add5(3) } are 8. There's probably a way to write an add f= unction of type int * int -> int, but I don't know how to write it. I'm wondering what the OCaml community makes of this. I find it awkward. Bob Muller -- Kind regards, Viet -- Sven SAULEAU +33 6 28 69 51 44 --------------795CF74694864722D42B0D4F Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlw ZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjwvaGVh ZD4NCjxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiPg0K PHA+SGksPC9wPg0KPHA+VGhlIHJlYXNvbiBiZWhpbmQgdGhhdCBtb3ZlIChm cm9tIFJlYXNvbm1sIHZlcnNpb24gMiB0byAzKSwgaXMgdGhhdCBpdCBmZWVs cyBtb3JlIG5hdHVyYWwgdG8gSmF2YVNjcmlwdCBkZXZlbG9wZXJzLjwvcD4N CjxwPlNpbmNlIGl0J3MgcXVpdGUgYSBuZXcgbGFuZ3VhZ2UgYW5kIHRoZWly IG1haW4gdGFyZ2V0IGFyZSBKUyBkZXZlbG9wZXJzIHRoaXMga2luZGEgbWFr ZSBzZW5zZSB0byBtZSBidXQgSSBhZ3JlZSB3aXRoIFZpZXQsIGFzIGEgTUwg ZmFuIEkgZG9uJ3QgbGlrZSB0aGlzIG5ldyBzeW50YXguPC9wPg0KPHA+QWxz byBJIGhvcGUgaXQgd29uJ3QgY29uZnVzZSB0aGVtIGFib3V0IGZ1bmN0aW9u YWwgcHJvZ3JhbW1pbmcgY29uY2VwdHMuIFBhcnRpYWwgYXBwbGljYXRpb24g Zm9yIGV4YW1wbGUgbG9va3Mgbm90IGNsZWFyIGF0IGFsbCB0aGF0IHdheTo8 L3A+DQo8cHJlIGNsYXNzPSJobGpzIGxhbmctcmVhc29uIiBzdHlsZT0iYm94 LXNpemluZzogaW5oZXJpdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9u b3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07IG1hcmdpbjogMHB4IDBweCAx LjQ1cmVtOyBsaW5lLWhlaWdodDogMS40MjsgYmFja2dyb3VuZDogcmdiKDI1 MSwgMjUwLCAyNTApOyBib3JkZXItcmFkaXVzOiAxcHg7IG92ZXJmbG93OiBh dXRvOyB3b3JkLXdyYXA6IG5vcm1hbDsgcGFkZGluZzogMTBweDsgZGlzcGxh eTogYmxvY2s7IGNvbG9yOiByZ2IoODUsIDg1LCA4NSk7IHRleHQtc2l6ZS1h ZGp1c3Q6IG5vbmU7IGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMzgsIDIzOCwg MjM4KTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQtbGlnYXR1 cmVzOiBub3JtYWw7IGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7IGZvbnQt d2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6 IDI7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0 LXRyYW5zZm9ybTogbm9uZTsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBw eDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4OyB0ZXh0LWRlY29y YXRpb24tc3R5bGU6IGluaXRpYWw7IHRleHQtZGVjb3JhdGlvbi1jb2xvcjog aW5pdGlhbDsiPjxjb2RlIHN0eWxlPSJib3gtc2l6aW5nOiBpbmhlcml0OyBm b250LWZhbWlseTogU0ZNb25vLVJlZ3VsYXIsIENvbnNvbGFzLCAmcXVvdDtS b2JvdG8gTW9ubyZxdW90OywgJnF1b3Q7RHJvaWQgU2FucyBNb25vJnF1b3Q7 LCAmcXVvdDtMaWJlcmF0aW9uIE1vbm8mcXVvdDssIE1lbmxvLCBDb3VyaWVy LCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44NXJlbTsgbGluZS1oZWlnaHQ6 IDEuNDI7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDNweDsg cGFkZGluZzogMC4yZW0gMHB4OyI+PHNwYW4gY2xhc3M9ImhsanMta2V5d29y ZCIgc3R5bGU9ImJveC1zaXppbmc6IGluaGVyaXQ7IGNvbG9yOiByZ2IoMTcw LCAxNiwgMTQ4KTsiPmxldDwvc3Bhbj4gYWRkID0gKHgsIHkpID0mZ3Q7IHgg JiM0MzsgeTsKPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCIgc3R5bGU9ImJv eC1zaXppbmc6IGluaGVyaXQ7IGNvbG9yOiByZ2IoMTcwLCAxNiwgMTQ4KTsi PmxldDwvc3Bhbj4gYWRkRml2ZSA9IGFkZCg8c3BhbiBjbGFzcz0iaGxqcy1u dW1iZXIiIHN0eWxlPSJib3gtc2l6aW5nOiBpbmhlcml0OyBjb2xvcjogcmdi KDI4LCAwLCAyMDcpOyI+NTwvc3Bhbj4pOwo8c3BhbiBjbGFzcz0iaGxqcy1r ZXl3b3JkIiBzdHlsZT0iYm94LXNpemluZzogaW5oZXJpdDsgY29sb3I6IHJn YigxNzAsIDE2LCAxNDgpOyI+bGV0PC9zcGFuPiBlbGV2ZW4gPSBhZGRGaXZl KDxzcGFuIGNsYXNzPSJobGpzLW51bWJlciIgc3R5bGU9ImJveC1zaXppbmc6 IGluaGVyaXQ7IGNvbG9yOiByZ2IoMjgsIDAsIDIwNyk7Ij42PC9zcGFuPik7 CjxzcGFuIGNsYXNzPSJobGpzLWtleXdvcmQiIHN0eWxlPSJib3gtc2l6aW5n OiBpbmhlcml0OyBjb2xvcjogcmdiKDE3MCwgMTYsIDE0OCk7Ij5sZXQ8L3Nw YW4+IHR3ZWx2ZSA9IGFkZEZpdmUoPHNwYW4gY2xhc3M9ImhsanMtbnVtYmVy IiBzdHlsZT0iYm94LXNpemluZzogaW5oZXJpdDsgY29sb3I6IHJnYigyOCwg MCwgMjA3KTsiPjc8L3NwYW4+KTs8L2NvZGU+PC9wcmU+DQpJbiBKYXZhU2Ny aXB0IGFkZCogZnVuY3Rpb25zIGNsZWFybHkgb25seSB0YWtlIG9uZSBhcmd1 bWVudC48YnI+DQo8YnI+DQo8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5oYXMg dmVyeSB3ZWxsIHJlY2VpdmVkIGluIHRoZSBKYXZhU2NyaXB0IGNvbW11bml0 eSBhbmQgaXQgd2lsbCBsZWFkIHRvIHdpZGVyIE9DYW1sIGFkb3B0aW9uPC9i bG9ja3F1b3RlPg0KPGJyPg0KSSdtIGFmcmFpZCBpdCBwcm9iYWJseSB3b24n dCwgaWYgdGhleSBhcmUgdXNlZCB0byB0aGUgSmF2YVNjcmlwdCBzeW50YXgu IFJlYXNvbm1sIGlzIGFsc28gbWVhbnQgdG8gYmUgdXNlZCBpbiB0aGUgd2Vi IG1vcmUgdGhhbiB1c2VkIHRocm91Z2ggT0NhbWwuPGJyPg0KPGJyPg0KU3Zl bi48YnI+DQo8YnI+DQo8ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9u IDExLzEyLzIwMTcgMDY6NTAsIFZpZXQgTGUgd3JvdGU6PGJyPg0KPC9kaXY+ DQo8YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6Q0FHXzgmIzQz O0c1dF9pTDlKWXE4Y0NwU2dfbjlHdE00JiM0Mzs1Y1czeDl5MDJlTDZZNGpO ZmtmTHdAbWFpbC5nbWFpbC5jb20iPg0KPGRpdiBkaXI9ImF1dG8iPlN1Y2gg YSB0ZXJyaWJsZSB3YXkgdG8gY2F2ZSBpbiB0byBhcHBlYXIgbW9yZSBKUy1l c3F1ZS4gSSByZWFsbHkgaG9wZSBPQ2FtbCBjb21tdW5pdHkgZG9lc24ndCBh ZG9wdCB0aGlzIHN0eWxlIGJlY2F1c2UgaXQncyBjb25mdXNpbmcsIGluZWxl Z2FudCBhbmQgc3VwZXJmaWNpYWwuPC9kaXY+DQo8ZGl2IGRpcj0iYXV0byI+ PGJyPg0KPC9kaXY+DQo8ZGl2IGRpcj0iYXV0byI+VmlldC48L2Rpdj4NCjxk aXY+PGJyPg0KPGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPg0KPGRpdj5PbiBN b24sIDExIERlYyAyMDE3IGF0IDAwOjExLCBZYXdhciBBbWluICZsdDs8YSBo cmVmPSJtYWlsdG86eWF3YXIuYW1pbkBnbWFpbC5jb20iIG1vei1kby1ub3Qt c2VuZD0idHJ1ZSI+eWF3YXIuYW1pbkBnbWFpbC5jb208L2E+Jmd0OyB3cm90 ZTo8YnI+DQo8L2Rpdj4NCjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90 ZSIgc3R5bGU9Im1hcmdpbjowIDAgMAogICAgICAgICAgICAuOGV4O2JvcmRl ci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPg0KPGRp dj5IaSBCb2IsIHlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMgYWJvdXQgdGhl IHN5bnRheCBjaGFuZ2UgYW5kIGRpc2N1c3Npb24gaW4gdGhpcyBzbGlnaHRs eSBvdXRkYXRlZCBQUjombmJzcDs8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vZmFjZWJvb2svcmVhc29uL3B1bGwvMTI5OSIgdGFyZ2V0PSJfYmxhbmsi IG1vei1kby1ub3Qtc2VuZD0idHJ1ZSI+aHR0cHM6Ly9naXRodWIuY29tL2Zh Y2Vib29rL3JlYXNvbi9wdWxsLzEyOTk8L2E+DQo8ZGl2Pjxicj4NCjwvZGl2 Pg0KPGRpdj5Mb25nIHN0b3J5IHNob3J0LCB5b3UgY2FuIHdyaXRlIGxldCBh ZGQoKG0sIG4pKSA9IG0gJiM0Mzsgbi48L2Rpdj4NCjxkaXY+PGJyPg0KPC9k aXY+DQo8ZGl2Pk5vdGUgdGhhdCB0aGUgUmVhc29uTUwmbmJzcDtwcm9qZWN0 IGFjdHVhbGx5IGluY2x1ZGVzIHNldmVyYWwgbG9uZy10aW1lIG1lbWJlcnMg b2YgdGhlIE9DYW1sIGNvbW11bml0eS4gSSBmZWVsIHRoYXQgdGhlIG5ldyBz eW50YXggaGFzIHZlcnkgd2VsbCByZWNlaXZlZCBpbiB0aGUgSmF2YVNjcmlw dCBjb21tdW5pdHkgYW5kIGl0IHdpbGwgbGVhZCB0byB3aWRlciBPQ2FtbCBh ZG9wdGlvbi4gSXQncyBhIHdpbi13aW4gc2l0dWF0aW9uLjwvZGl2Pg0KPGRp dj48YnI+DQo8L2Rpdj4NCjxkaXY+UmVnYXJkcyw8L2Rpdj4NCjxkaXY+PGJy Pg0KPC9kaXY+DQo8ZGl2Pllhd2FyPC9kaXY+DQo8L2Rpdj4NCjxkaXYgY2xh c3M9ImdtYWlsX2V4dHJhIj48YnI+DQo8ZGl2IGNsYXNzPSJnbWFpbF9xdW90 ZSI+T24gU3VuLCBEZWMgMTAsIDIwMTcgYXQgMToxMiBQTSwgUm9iZXJ0IE11 bGxlciA8c3Bhbj4mbHQ7PGEgaHJlZj0ibWFpbHRvOnJvYmVydC5tdWxsZXIy QGdtYWlsLmNvbSIgdGFyZ2V0PSJfYmxhbmsiIG1vei1kby1ub3Qtc2VuZD0i dHJ1ZSI+cm9iZXJ0Lm11bGxlcjJAZ21haWwuY29tPC9hPiZndDs8L3NwYW4+ IHdyb3RlOjxicj4NCjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIg c3R5bGU9Im1hcmdpbjowIDAgMAogICAgICAgICAgICAgICAgICAuOGV4O2Jv cmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPg0K PGRpdj5UaGUgdGVhbSBkZXZlbG9waW5nIFJlYXNvbk1MIHNlZW1zIHRvIGJl IGV4cGVyaW1lbnRpbmcgd2l0aCBjb25jcmV0ZSBzeW50YXggaW4gYW4gZWZm b3J0IHRvIG1ha2UgaXQgZmVlbCBhcyBmYW1pbGlhciBhbmQgbmF0dXJhbCBh cyBwb3NzaWJsZSB0byBKYXZhU2NyaXB0IHByb2dyYW1tZXJzLiBTZWVtcyBs aWtlIGEgZ29vZCBpZGVhLiBCdXQgdGhlIHByZXNlbnQgdmVyc2lvbiBzZWVt cyB0byBoYXJkd2lyZSBwYXJlbnRoZXNlcyBhd2t3YXJkbHkNCiBmb3IgZnVu Y3Rpb24gZGVmaW5pdGlvbnMgYW5kIGNhbGxzLiBQYXJlbnRoZXNlcyBhcmUg cmVxdWlyZWQgZm9yIGJvdGggZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGNh bGxzLiBTbyBvbmUgd3JpdGVzDQo8ZGl2Pg0KPGRpdj48YnI+DQo8L2Rpdj4N CjxkaXY+bGV0IGluY3IobikgPSBuICYjNDM7IDEmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDthbmQmbmJzcDsgJm5ic3A7aW5jcig1KTwvZGl2Pg0KPGRp dj48YnI+DQo8L2Rpdj4NCjxkaXY+YnV0IG5vdDwvZGl2Pg0KPGRpdj48YnI+ DQo8L2Rpdj4NCjxkaXY+bGV0IGluY3IgbiA9IG4gJiM0MzsgMSZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyBvciZuYnNwOyAmbmJzcDsgaW5jciA1PC9k aXY+DQo8ZGl2Pjxicj4NCjwvZGl2Pg0KPGRpdj5GYWlyIGVub3VnaCwgYnV0 IGZvciBtdWx0aS1hcmd1bWVudCBmdW5jdGlvbnMgdGhlIHBhcnNlciBzZWVt cyB0byB1bnJvbGwgdGhlIHBhcmVudGhlc2l6ZWQgaXRlbXMgKGJvdGggcGFy YW1ldGVycyAmYW1wOyBhcmd1bWVudHMpIHRvIGxlYXZlIGN1cnJpZWQgZnVu Y3Rpb25zLiBFLmcuLDwvZGl2Pg0KPGRpdj48YnI+DQo8L2Rpdj4NCjxkaXY+ bGV0IGFkZChtLCBuKSA9IG0gJiM0MzsgbiZuYnNwOyBvciBlcXVpdmFsZW50 bHkgbGV0IGFkZCA9IChtLCBuKSA9Jmd0OyBtICYjNDM7IG48L2Rpdj4NCjxk aXY+PGJyPg0KPC9kaXY+DQo8ZGl2PnRoZW4gYWRkKDUsIDMpIGlzIDggYXMg b25lIHdvdWxkIGV4cGVjdC4gQnV0IHRoZSAobSwgbikgaW4gbGV0IGFkZCht LCBuKSA9IC4uLiBpc24ndCBhIHBhdHRlcm4gbWF0Y2hpbmcgYSBwYWlyLCBp dCdzIHRoZSBKUy1zdHlsZSBzZXF1ZW5jZSBvZiBpbnB1dCBwYXJhbWV0ZXJz IGFuZCB0aGUgZGVmaW5pdGlvbiB1bnJvbGxzIHRvIGxldCBhZGQgPSAobSkg PSZndDsgKG4pID0mZ3Q7IC4uLiAuIFNvIGFkZCg1KSA6IGludCAtJmd0OyBp bnQgYW5kIGFsbCB0aHJlZQ0KIG9mIGFkZCg1LCAzKSwgYWRkKDUpKDMpIGFu ZCB7IGxldCBhZGQ1ID0gYWRkKDUpOyZuYnNwOyBhZGQ1KDMpIH0gYXJlIDgu IFRoZXJlJ3MgcHJvYmFibHkgYSB3YXkgdG8gd3JpdGUgYW4gYWRkIGZ1bmN0 aW9uIG9mIHR5cGUgaW50ICogaW50IC0mZ3Q7IGludCwgYnV0IEkgZG9uJ3Qg a25vdyBob3cgdG8gd3JpdGUgaXQuPC9kaXY+DQo8L2Rpdj4NCjxkaXY+PGJy Pg0KPC9kaXY+DQo8ZGl2PkknbSB3b25kZXJpbmcgd2hhdCB0aGUgT0NhbWwg Y29tbXVuaXR5IG1ha2VzIG9mIHRoaXMuIEkgZmluZCBpdCBhd2t3YXJkLjwv ZGl2Pg0KPGRpdj5Cb2IgTXVsbGVyPC9kaXY+DQo8ZGl2Pjxicj4NCjwvZGl2 Pg0KPGRpdj48YnI+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0K PC9kaXY+DQo8YnI+DQo8L2Rpdj4NCjwvYmxvY2txdW90ZT4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGRpcj0ibHRyIj4tLSA8YnI+DQo8L2Rpdj4NCjxkaXYg Y2xhc3M9ImdtYWlsX3NpZ25hdHVyZSIgZGF0YS1zbWFydG1haWw9ImdtYWls X3NpZ25hdHVyZSI+DQo8ZGl2IGRpcj0ibHRyIj4NCjxkaXY+S2luZCByZWdh cmRzLDxicj4NCjwvZGl2Pg0KPGRpdj5WaWV0PC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGJyPg0KPHA+LS08L3A+DQo8cD48c3Ry b25nPlN2ZW4gU0FVTEVBVTwvc3Ryb25nPjwvcD4NCjxwPiYjNDM7MzMgNiAy OCA2OSA1MSA0NDwvcD4NCjwvYm9keT4NCjwvaHRtbD4NCg== --------------795CF74694864722D42B0D4F--