From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jim Porter Newsgroups: gmane.emacs.bugs Subject: bug#66756: 30.0.50; [PATCH] Improve discussion of 'let' in Elisp Introduction manual Date: Thu, 30 Nov 2023 13:03:52 -0800 Message-ID: <0fe9fc29-11d5-2983-8970-3f4b7969df2d@gmail.com> References: <3ade119d-0f0d-e60e-1bdc-9c7e02c1559c@gmail.com> <381836df-c16f-b3e7-d0c4-473290e165de@gmail.com> <9239b6bd-b476-b6c1-aef9-245e439aee42@gmail.com> <83jzq7fx5o.fsf@gnu.org> <64d90b0b-e003-7bc3-5312-6c7ab4c4591f@gmail.com> <838r6nfkfj.fsf@gnu.org> <83jzq6e0dn.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------lfRemlczGkaSGJ0whIlnXGXz" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="15380"; mail-complaints-to="usenet@ciao.gmane.io" Cc: rms@gnu.org, 66756@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu Nov 30 22:05:41 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1r8oE8-0003qv-KL for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 30 Nov 2023 22:05:40 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r8oDP-00027l-TD; Thu, 30 Nov 2023 16:04:55 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r8oDO-00027S-Hv for bug-gnu-emacs@gnu.org; Thu, 30 Nov 2023 16:04:54 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r8oDO-0003az-9d for bug-gnu-emacs@gnu.org; Thu, 30 Nov 2023 16:04:54 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1r8oDW-0002Y8-6N for bug-gnu-emacs@gnu.org; Thu, 30 Nov 2023 16:05:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Jim Porter Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 30 Nov 2023 21:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 66756 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 66756-submit@debbugs.gnu.org id=B66756.17013782519724 (code B ref 66756); Thu, 30 Nov 2023 21:05:02 +0000 Original-Received: (at 66756) by debbugs.gnu.org; 30 Nov 2023 21:04:11 +0000 Original-Received: from localhost ([127.0.0.1]:54569 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r8oCg-0002Wk-4r for submit@debbugs.gnu.org; Thu, 30 Nov 2023 16:04:11 -0500 Original-Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]:45496) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r8oCe-0002WU-Mq for 66756@debbugs.gnu.org; Thu, 30 Nov 2023 16:04:09 -0500 Original-Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-6cdd28aa7f8so1392349b3a.3 for <66756@debbugs.gnu.org>; Thu, 30 Nov 2023 13:04:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701378234; x=1701983034; darn=debbugs.gnu.org; h=in-reply-to:from:references:cc:to:content-language:subject :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=VjmvX6CpkixRO7gTTwlVgrMOzLUcIG/HYXDXAOstDNY=; b=DOoEOSvfXm/RVgshfSORXlGj2zAt5iCQxv92fcfphwd8THTR6W4/SbK4uS3yb/0hbL VDc54tWTF3e5YGIemsjuGYgpErK9zx5Qx1ZHjxkRf9ARKYw/RWAMV9YN15OBn0gF5kHU QuzbgPvWDira4cOwdXL8ndXIrn1Mq4w/HGvvupvOTSgcB8ZRhhN/a1Ifpft8MLGjqVOd R1/TZVv/YskOsI0oi9V0rPLU/goc8uAPR4Ebs5m1IuHwM5nmcOaxR+cS1Q+WOKfb4d6q CUQ0+d14H1NdJc44fCitLXJ2rGohrWyQOwWoOari9WyC2brzko+JRFnVgLghT5dQSlGt pEZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701378234; x=1701983034; h=in-reply-to:from:references:cc:to:content-language:subject :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=VjmvX6CpkixRO7gTTwlVgrMOzLUcIG/HYXDXAOstDNY=; b=cmZOfZEpIvCNzfryR69tnDCJvR/s5uPhGtSrJfpVcZZWrSDFQcMA96DSvuGxtuvgAx 2COkB4RgHHsaDHaL2xjkNIZNNc0tERj53fneAxowpWPLXd2tubqKro6nhLTXCj0+yEw0 BAs4id50ZgkZHLIMSrFt/mOQqaGXq9J2JNc9YdI8WTediJqQnTCoYAfyp7VFdghkKhRP tGL/hUmLlcmEMq7zfSQtGzt0letdUncl14X+fdLBYie8eEKbDGXcOn6AkISSDVmWIYR5 fx7RIMgXMX9J/mtabZR4MfXG3SyJJt/zWz/NYHmU9XjwezPUG5Za5kbRHmrhsYyuC2Bp wFiw== X-Gm-Message-State: AOJu0YwOrR/NYOgIBOdkAJ198bnvB82NwWdS25tJ7sMBF/1s+H705pTC 9gVBqshbU6IKgOxG2d87JYU= X-Google-Smtp-Source: AGHT+IFMaGUrgYSxB9Abf/JtWqr/3RU58eoeihx/HmlXMGSVryfZV+EcYsMh0jwN6vDh83KkzqVbTg== X-Received: by 2002:a17:902:d2cb:b0:1cf:ee3a:2398 with SMTP id n11-20020a170902d2cb00b001cfee3a2398mr13592039plc.42.1701378234184; Thu, 30 Nov 2023 13:03:54 -0800 (PST) Original-Received: from [192.168.1.2] (076-168-148-233.res.spectrum.com. [76.168.148.233]) by smtp.googlemail.com with ESMTPSA id h10-20020a170902748a00b001cfb99d8b82sm1842342pll.136.2023.11.30.13.03.53 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 30 Nov 2023 13:03:53 -0800 (PST) Content-Language: en-US In-Reply-To: <83jzq6e0dn.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:275296 Archived-At: This is a multi-part message in MIME format. --------------lfRemlczGkaSGJ0whIlnXGXz Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/24/2023 11:51 PM, Eli Zaretskii wrote: > I think something is missing from this description: "inside the 'let' > body" is ambiguous when the body calls functions. The text should > explain that the body of functions called from 'let' is NOT considered > to be "inside the 'let' body". This crucial point is hinted or > explained later, but it must be explained right here at the start. I added a short parenthetical here to explain this point: "(such as when calling a function that was defined elsewhere)". I intentionally kept this brief though, since this introductory section is primarily about introducing the basics of 'let' and why you'd use it. Once we've shown readers *how* to use 'let', then we return to a more detailed discussion of how the binding works in the last section. >> +As we discussed before, when you create local variables with >> +@code{let} under lexical binding, those variables are valid only >> +within the body of the @code{let} expression. In other parts of your >> +code, they have other meanings, so if you call a function in the >> +@code{let} body, that function would be unable to ``see'' the local >> +variables you've created. > > First, AFAIU the last sentence is correct only if the function's > definition is outside of the 'let'. And second, this crucial > dependence on where the function is defined is very important for > understanding _why_ the function won't see the value bound by 'let'. > So it must be in the text, IMO. I've expanded upon this and added a description of what happens when you call a function defined within a 'let' body. >> +Under dynamic binding, the rules are different: instead, when you use >> +@code{let}, the local variables you've created are valid during >> +execution of the let expression. This means that, if your @code{let} >> +expression calls a function, that function can see (and modify) these >> +local variables. > > This should say "...regardless of where the function is defined." I > would even add that the above is true even for functions defined on > other Lisp files. Done. > This should IMO tell that this "binding stack" is _global_, i.e. it is > seen by every function regardless of where and how it was defined. Done. >> +Here, the result of @code{(getx)} is @code{1}. Under lexical binding, >> +@code{getx} doesn't see the value from our @code{let} expression. >> +That's because the body of @code{getx} is outside of the body of our >> +@code{let} expression. > > The last sentence is critical for understanding of the issue, and > should be at the very beginning of the 'let' description (and repeated > here, of course). Done. >> Instead, @code{getx} looks for @code{x} >> +elsewhere, and finds it at the global scope of our code. > > This "looks for and finds" is problematic, IMO, because it is not > clear why would it "find" the value of x set by 'setq', but not the > value of x set by 'let'. IOW, the mechanism of "looking and finding" > remains mysterious and no intuitive description is provided to help > understanding it. Can we provide such a description? If you cannot > think about one, how about explaining the internal workings of this > "looking and finding" as it is implemented, and we could then take it > from there and express the idea in less technical ways. I've reworded this to hopefully be more explicit that, since 'getx' is defined outside of any 'let' body, it will look for 'x' at global scope. Combined with the previous, more-general discussion of how 'let' and 'defun' interact, I think (hope) this should cover things. >> +Now, the result of @code{(getx)} is @code{2}! That's because under >> +dynamic binding, when executing @code{getx}, the current binding for >> +@code{x} is the one from our @code{let} binding. This time, >> +@code{getx} doesn't see the global value for @code{x}, since its >> +binding is below the one from our @code{let} expression in the stack >> +of bindings. > > This should mention the stack and its top earlier, where it talks > about "the current binding". Done. --------------lfRemlczGkaSGJ0whIlnXGXz Content-Type: text/plain; charset=UTF-8; name="0001-Introduce-let-using-lexical-binding-in-the-Lisp-Intr.patch" Content-Disposition: attachment; filename*0="0001-Introduce-let-using-lexical-binding-in-the-Lisp-Intr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA4YzQxNmI3NTJhODdiYzkyMjZlZWFhZDAzOTlhMzY3OTk4NTgyNWE5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gUG9ydGVyIDxqcG9ydGVyYnVnc0BnbWFpbC5j b20+CkRhdGU6IFdlZCwgMjUgT2N0IDIwMjMgMjA6NDM6NTcgLTA3MDAKU3ViamVjdDogW1BB VENIXSBJbnRyb2R1Y2UgJ2xldCcgdXNpbmcgbGV4aWNhbCBiaW5kaW5nIGluIHRoZSBMaXNw CiBJbnRyb2R1Y3Rpb24KCiogZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWludHJvLnRleGkg KFByZXZlbnQgY29uZnVzaW9uKTogUmV3b3JrIHRoZQpleHBsYW5hdGlvbiB0byBkaXNjdXNz IGhvdyB0aGluZ3Mgd29yayB1bmRlciBsZXhpY2FsIGJpbmRpbmcuCihIb3cgbGV0IEJpbmRz IFZhcmlhYmxlcyk6IERlc2NyaWJlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGxleGljYWwK YW5kIGR5bmFtaWMgYmluZGluZyAoaW5jbHVkaW5nIGhvdyB0byBjb25maWd1cmUgaXQpLgoo ZGVmdmFyKTogTWVudGlvbiB0aGF0ICdkZWZ2YXInIGRlY2xhcmVzIHZhcmlhYmxlcyBhcyBh bHdheXMKZHluYW1pY2FsbHktYm91bmQgKGJ1ZyM2Njc1NikuCi0tLQogZG9jL2xpc3BpbnRy by9lbWFjcy1saXNwLWludHJvLnRleGkgfCAxNjEgKysrKysrKysrKysrKysrKysrKysrKyst LS0tLQogMSBmaWxlIGNoYW5nZWQsIDEzNyBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9kb2MvbGlzcGludHJvL2VtYWNzLWxpc3AtaW50cm8udGV4aSBi L2RvYy9saXNwaW50cm8vZW1hY3MtbGlzcC1pbnRyby50ZXhpCmluZGV4IGM1YjMzYWM1ZWFh Li5jYWY5YTNjODc2YyAxMDA2NDQKLS0tIGEvZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWlu dHJvLnRleGkKKysrIGIvZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWludHJvLnRleGkKQEAg LTM1OTEsNiArMzU5MSw3IEBAIGxldAogKiBQYXJ0cyBvZiBsZXQgRXhwcmVzc2lvbjo6CiAq IFNhbXBsZSBsZXQgRXhwcmVzc2lvbjo6CiAqIFVuaW5pdGlhbGl6ZWQgbGV0IFZhcmlhYmxl czo6CisqIEhvdyBsZXQgQmluZHMgVmFyaWFibGVzOjoKIEBlbmQgbWVudQogCiBAaWZub3R0 ZXgKQEAgLTM2MDIsMjQgKzM2MDMsMjIgQEAgUHJldmVudCBjb25mdXNpb24KIEBjaW5kZXgg QHNhbXB7dmFyaWFibGUsIGxvY2FsfSwgZGVmaW5lZAogVGhlIEBjb2Rle2xldH0gc3BlY2lh bCBmb3JtIHByZXZlbnRzIGNvbmZ1c2lvbi4gIEBjb2Rle2xldH0gY3JlYXRlcyBhCiBuYW1l IGZvciBhIEBkZm57bG9jYWwgdmFyaWFibGV9IHRoYXQgb3ZlcnNoYWRvd3MgYW55IHVzZSBv ZiB0aGUgc2FtZQotbmFtZSBvdXRzaWRlIHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24uICBU aGlzIGlzIGxpa2UgdW5kZXJzdGFuZGluZwotdGhhdCB3aGVuZXZlciB5b3VyIGhvc3QgcmVm ZXJzIHRvIGBgdGhlIGhvdXNlJycsIGhlIG1lYW5zIGhpcyBob3VzZSwgbm90Ci15b3Vycy4g IChTeW1ib2xzIHVzZWQgaW4gYXJndW1lbnQgbGlzdHMgd29yayB0aGUgc2FtZSB3YXkuCi1A eHJlZntkZWZ1biwgLCBUaGUgQGNvZGV7ZGVmdW59IE1hY3JvfS4pCi0KLUxvY2FsIHZhcmlh YmxlcyBjcmVhdGVkIGJ5IGEgQGNvZGV7bGV0fSBleHByZXNzaW9uIHJldGFpbiB0aGVpciB2 YWx1ZQotQGVtcGh7b25seX0gd2l0aGluIHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24gaXRz ZWxmIChhbmQgd2l0aGluCi1leHByZXNzaW9ucyBjYWxsZWQgd2l0aGluIHRoZSBAY29kZXts ZXR9IGV4cHJlc3Npb24pOyB0aGUgbG9jYWwKLXZhcmlhYmxlcyBoYXZlIG5vIGVmZmVjdCBv dXRzaWRlIHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24uCi0KLUFub3RoZXIgd2F5IHRvIHRo aW5rIGFib3V0IEBjb2Rle2xldH0gaXMgdGhhdCBpdCBpcyBsaWtlIGEgQGNvZGV7c2V0cX0K LXRoYXQgaXMgdGVtcG9yYXJ5IGFuZCBsb2NhbC4gIFRoZSB2YWx1ZXMgc2V0IGJ5IEBjb2Rl e2xldH0gYXJlCi1hdXRvbWF0aWNhbGx5IHVuZG9uZSB3aGVuIHRoZSBAY29kZXtsZXR9IGlz IGZpbmlzaGVkLiAgVGhlIHNldHRpbmcKLW9ubHkgYWZmZWN0cyBleHByZXNzaW9ucyB0aGF0 IGFyZSBpbnNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgQGNvZGV7bGV0fQotZXhwcmVzc2lvbi4g IEluIGNvbXB1dGVyIHNjaWVuY2UgamFyZ29uLCB3ZSB3b3VsZCBzYXkgdGhlIGJpbmRpbmcg b2YKLWEgc3ltYm9sIGlzIHZpc2libGUgb25seSBpbiBmdW5jdGlvbnMgY2FsbGVkIGluIHRo ZSBAY29kZXtsZXR9IGZvcm07Ci1pbiBFbWFjcyBMaXNwLCB0aGUgZGVmYXVsdCBzY29waW5n IGlzIGR5bmFtaWMsIG5vdCBsZXhpY2FsLiAgKFRoZQotbm9uLWRlZmF1bHQgbGV4aWNhbCBi aW5kaW5nIGlzIG5vdCBkaXNjdXNzZWQgaW4gdGhpcyBtYW51YWwuKQorbmFtZSBvdXRzaWRl IHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24gKGluIGNvbXB1dGVyIHNjaWVuY2UgamFyZ29u LCB3ZQorY2FsbCB0aGlzIEBkZm57YmluZGluZ30gdGhlIHZhcmlhYmxlKS4gIFRoaXMgaXMg bGlrZSB1bmRlcnN0YW5kaW5nCit0aGF0IGluIHlvdXIgaG9zdCdzIGhvbWUsIHdoZW5ldmVy IGhlIHJlZmVycyB0byBgYHRoZSBob3VzZScnLCBoZQorbWVhbnMgaGlzIGhvdXNlLCBub3Qg eW91cnMuICAoU3ltYm9scyB1c2VkIGluIGFyZ3VtZW50IGxpc3RzIHdvcmsgdGhlCitzYW1l IHdheS4gIEB4cmVme2RlZnVuLCAsIFRoZSBAY29kZXtkZWZ1bn0gTWFjcm99LikKKworQW5v dGhlciB3YXkgdG8gdGhpbmsgYWJvdXQgQGNvZGV7bGV0fSBpcyB0aGF0IGl0IGRlZmluZXMg YSBzcGVjaWFsCityZWdpb24gaW4geW91ciBjb2RlOiB3aXRoaW4gdGhlIGJvZHkgb2YgdGhl IEBjb2Rle2xldH0gZXhwcmVzc2lvbiwgdGhlCit2YXJpYWJsZXMgeW91J3ZlIG5hbWVkIGhh dmUgdGhlaXIgb3duIGxvY2FsIG1lYW5pbmcuICBPdXRzaWRlIG9mIHRoZQorQGNvZGV7bGV0 fSBib2R5LCB0aGV5IGhhdmUgb3RoZXIgbWVhbmluZ3MgKG9yIHRoZXkgbWF5IG5vdCBiZSBk ZWZpbmVkCithdCBhbGwpLiAgVGhpcyBtZWFucyB0aGF0IGluc2lkZSB0aGUgQGNvZGV7bGV0 fSBib2R5LCBjYWxsaW5nCitAY29kZXtzZXRxfSBmb3IgYSB2YXJpYWJsZSBuYW1lZCBieSB0 aGUgQGNvZGV7bGV0fSBleHByZXNzaW9uIHdpbGwgc2V0Cit0aGUgdmFsdWUgb2YgdGhlIEBl bXBoe2xvY2FsfSB2YXJpYWJsZSBvZiB0aGF0IG5hbWUuICBIb3dldmVyLCBvdXRzaWRlCitv ZiB0aGUgQGNvZGV7bGV0fSBib2R5IChzdWNoIGFzIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9u IHRoYXQgd2FzCitkZWZpbmVkIGVsc2V3aGVyZSksIGNhbGxpbmcgQGNvZGV7c2V0cX0gZm9y IGEgdmFyaWFibGUgbmFtZWQgYnkgdGhlCitAY29kZXtsZXR9IGV4cHJlc3Npb24gd2lsbCBA ZW1waHtub3R9IGFmZmVjdCB0aGF0IGxvY2FsIHZhcmlhYmxlLgogCiBAY29kZXtsZXR9IGNh biBjcmVhdGUgbW9yZSB0aGFuIG9uZSB2YXJpYWJsZSBhdCBvbmNlLiAgQWxzbywKIEBjb2Rl e2xldH0gZ2l2ZXMgZWFjaCB2YXJpYWJsZSBpdCBjcmVhdGVzIGFuIGluaXRpYWwgdmFsdWUs IGVpdGhlciBhCkBAIC0zNzc5LDYgKzM3NzgsMTE4IEBAIFVuaW5pdGlhbGl6ZWQgbGV0IFZh cmlhYmxlcwogQHNhbXB7JXN9LikgIFRoZSBmb3VyIHZhcmlhYmxlcyBhcyBhIGdyb3VwIGFy ZSBwdXQgaW50byBhIGxpc3QgdG8KIGRlbGltaXQgdGhlbSBmcm9tIHRoZSBib2R5IG9mIHRo ZSBAY29kZXtsZXR9LgogCitAbm9kZSBIb3cgbGV0IEJpbmRzIFZhcmlhYmxlcworQHN1YnNl Y3Rpb24gSG93IEBjb2Rle2xldH0gQmluZHMgVmFyaWFibGVzCitAY2luZGV4IExleGljYWwg YmluZGluZworQGNpbmRleCBCaW5kaW5nLCBsZXhpY2FsCitAY2luZGV4IER5bmFtaWMgYmlu ZGluZworQGNpbmRleCBCaW5kaW5nLCBkeW5hbWljCisKK0VtYWNzIExpc3Agc3VwcG9ydHMg dHdvIGRpZmZlcmVudCB3YXlzIG9mIGJpbmRpbmcgdmFyaWFibGUgbmFtZXMgdG8KK3RoZWly IHZhbHVlcy4gIFRoZXNlIHdheXMgYWZmZWN0IHRoZSBwYXJ0cyBvZiB5b3VyIHByb2dyYW0g d2hlcmUgYQorcGFydGljdWxhciBiaW5kaW5nIGlzIHZhbGlkc2NvcC4gIEZvciBoaXN0b3Jp Y2FsIHJlYXNvbnMsIEVtYWNzIExpc3AgdXNlcworYSBmb3JtIG9mIHZhcmlhYmxlIGJpbmRp bmcgY2FsbGVkIEBkZm57ZHluYW1pYyBiaW5kaW5nfSBieSBkZWZhdWx0LgorSG93ZXZlciwg aW4gdGhpcyBtYW51YWwgd2UgZGlzY3VzcyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgYmluZGlu ZywKK2NhbGxlZCBAZGZue2xleGljYWwgYmluZGluZ30sIHVubGVzcyBvdGhlcndpc2Ugbm90 ZWQgKGluIHRoZSBmdXR1cmUsCit0aGUgRW1hY3MgbWFpbnRhaW5lcnMgcGxhbiB0byBjaGFu Z2UgdGhlIGRlZmF1bHQgdG8gbGV4aWNhbCBiaW5kaW5nKS4KK0lmIHlvdSBoYXZlIHByb2dy YW1tZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzIGJlZm9yZSwgeW91J3JlIGxpa2VseQorYWxyZWFk eSBmYW1pbGlhciB3aXRoIGhvdyBsZXhpY2FsIGJpbmRpbmcgYmVoYXZlcy4KKworSW4gb3Jk ZXIgdG8gdXNlIGxleGljYWwgYmluZGluZyBpbiBhIHByb2dyYW0sIHlvdSBzaG91bGQgYWRk IHRoaXMgdG8KK3RoZSBmaXJzdCBsaW5lIG9mIHlvdXIgRW1hY3MgTGlzcCBmaWxlOgorCitA ZXhhbXBsZQorOzs7IC0qLSBsZXhpY2FsLWJpbmRpbmc6IHQgLSotCitAZW5kIGV4YW1wbGUK KworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcywgQHB4cmVme1NlbGVjdGluZyBM aXNwIERpYWxlY3QsICwgLAorZWxpc3AsIFRoZSBFbWFjcyBMaXNwIFJlZmVyZW5jZSBNYW51 YWx9LgorCitBcyB3ZSBkaXNjdXNzZWQgYmVmb3JlLCB3aGVuIHlvdSBjcmVhdGUgbG9jYWwg dmFyaWFibGVzIHdpdGgKK0Bjb2Rle2xldH0gdW5kZXIgbGV4aWNhbCBiaW5kaW5nLCB0aG9z ZSB2YXJpYWJsZXMgYXJlIHZhbGlkIG9ubHkKK3dpdGhpbiB0aGUgYm9keSBvZiB0aGUgQGNv ZGV7bGV0fSBleHByZXNzaW9uLiAgSW4gb3RoZXIgcGFydHMgb2YgeW91cgorY29kZSwgdGhl eSBoYXZlIG90aGVyIG1lYW5pbmdzLCBzbyBpZiB5b3UgY2FsbCBhIGZ1bmN0aW9uIGRlZmlu ZWQKK2Vsc2V3aGVyZSB3aXRoaW4gdGhlIEBjb2Rle2xldH0gYm9keSwgdGhhdCBmdW5jdGlv biB3b3VsZCBiZSB1bmFibGUgdG8KK2Bgc2VlJycgdGhlIGxvY2FsIHZhcmlhYmxlcyB5b3Un dmUgY3JlYXRlZC4gIChPbiB0aGUgb3RoZXIgaGFuZCwgaWYKK3lvdSBjYWxsIGEgZnVuY3Rp b24gZGVmaW5lZCB3aXRoaW4gYSBAY29kZXtsZXR9IGJvZHksIHRoYXQgZnVuY3Rpb24KK0Bl bXBoe3dvdWxkfSBiZSBhYmxlIHRvIHNlZS0tLWFuZCBtb2RpZnktLS10aGUgbG9jYWwgdmFy aWFibGVzIGZyb20KK3RoYXQgQGNvZGV7bGV0fSBleHByZXNzaW9uLikKKworVW5kZXIgZHlu YW1pYyBiaW5kaW5nLCB0aGUgcnVsZXMgYXJlIGRpZmZlcmVudDogaW5zdGVhZCwgd2hlbiB5 b3UgdXNlCitAY29kZXtsZXR9LCB0aGUgbG9jYWwgdmFyaWFibGVzIHlvdSd2ZSBjcmVhdGVk IGFyZSB2YWxpZCBkdXJpbmcKK2V4ZWN1dGlvbiBvZiB0aGUgbGV0IGV4cHJlc3Npb24uICBU aGlzIG1lYW5zIHRoYXQsIGlmIHlvdXIgQGNvZGV7bGV0fQorZXhwcmVzc2lvbiBjYWxscyBh IGZ1bmN0aW9uLCB0aGF0IGZ1bmN0aW9uIGNhbiBzZWUgdGhlc2UgbG9jYWwKK3ZhcmlhYmxl cywgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCAoaW5jbHVk aW5nIGluCithbm90aGVyIGZpbGUgZW50aXJlbHkpLgorCitBbm90aGVyIHdheSB0byB0aGlu ayBhYm91dCBAY29kZXtsZXR9IHdoZW4gdXNpbmcgZHluYW1pYyBiaW5kaW5nIGlzCit0aGF0 IGV2ZXJ5IHZhcmlhYmxlIG5hbWUgaGFzIGEgZ2xvYmFsIGBgc3RhY2snJyBvZiBiaW5kaW5n cywgYW5kCit3aGVuZXZlciB5b3UgdXNlIHRoYXQgdmFyaWFibGUncyBuYW1lLCBpdCByZWZl cnMgdG8gdGhlIGJpbmRpbmcgb24gdGhlCit0b3Agb2YgdGhlIHN0YWNrLiAgKFlvdSBjYW4g aW1hZ2luZSB0aGlzIGxpa2UgYSBzdGFjayBvZiBwYXBlcnMgb24KK3lvdXIgZGVzayB3aXRo IHRoZSB2YWx1ZXMgd3JpdHRlbiBvbiB0aGVtLikgIFdoZW4geW91IGJpbmQgYSB2YXJpYWJs ZQord2l0aCBAY29kZXtsZXR9LCBpdCBwdXRzIHRoZSBuZXcgYmluZGluZyB5b3UndmUgc3Bl Y2lmaWVkIG9uIHRoZSB0b3AKK29mIHRoZSBzdGFjaywgYW5kIHRoZW4gZXhlY3V0ZXMgdGhl IEBjb2Rle2xldH0gYm9keS4gIE9uY2UgdGhlCitAY29kZXtsZXR9IGJvZHkgZmluaXNoZXMs IGl0IHRha2VzIHRoYXQgYmluZGluZyBvZmYgb2YgdGhlIHN0YWNrLAorcmV2ZWFsaW5nIHRo ZSBvbmUgaXQgaGFkIChpZiBhbnkpIGJlZm9yZSB0aGUgQGNvZGV7bGV0fSBleHByZXNzaW9u LgorCitJbiBzb21lIGNhc2VzLCBib3RoIGxleGljYWwgYW5kIGR5bmFtaWMgYmluZGluZyBi ZWhhdmUgaWRlbnRpY2FsbHkuCitIb3dldmVyLCBpbiBvdGhlciBjYXNlcywgdGhleSBjYW4g Y2hhbmdlIHRoZSBtZWFuaW5nIG9mIHlvdXIgcHJvZ3JhbS4KK0ZvciBleGFtcGxlLCBzZWUg d2hhdCBoYXBwZW5zIGluIHRoaXMgY29kZSB1bmRlciBsZXhpY2FsIGJpbmRpbmc6CisKK0Bl eGFtcGxlCis7OzsgLSotIGxleGljYWwtYmluZGluZzogdCAtKi0KKworKHNldHEgeCAwKQor CisoZGVmdW4gZ2V0eCAoKQorICB4KQorCisoc2V0cSB4IDEpCisKKyhsZXQgKCh4IDIpKQor ICAoZ2V0eCkpCisgICAgIEByZXN1bHR7fSAxCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50 CitIZXJlLCB0aGUgcmVzdWx0IG9mIEBjb2RleyhnZXR4KX0gaXMgQGNvZGV7MX0uICBVbmRl ciBsZXhpY2FsIGJpbmRpbmcsCitAY29kZXtnZXR4fSBkb2Vzbid0IHNlZSB0aGUgdmFsdWUg ZnJvbSBvdXIgQGNvZGV7bGV0fSBleHByZXNzaW9uLgorVGhhdCdzIGJlY2F1c2UgdGhlIGJv ZHkgb2YgQGNvZGV7Z2V0eH0gaXMgb3V0c2lkZSBvZiB0aGUgYm9keSBvZiBvdXIKK0Bjb2Rl e2xldH0gZXhwcmVzc2lvbi4gIFNpbmNlIEBjb2Rle2dldHh9IGlzIGRlZmluZWQgYXQgdGhl IHRvcCwKK2dsb2JhbCBsZXZlbCBvZiBvdXIgY29kZSAoaS5lLkA6IG5vdCBpbnNpZGUgdGhl IGJvZHkgb2YgYW55IEBjb2Rle2xldH0KK2V4cHJlc3Npb24pLCBpdCBsb29rcyBmb3IgYW5k IGZpbmRzIEBjb2Rle3h9IGF0IHRoZSBnbG9iYWwgbGV2ZWwgYXMKK3dlbGwuICBXaGVuIGV4 ZWN1dGluZyBAY29kZXtnZXR4fSwgdGhlIGN1cnJlbnQgZ2xvYmFsIHZhbHVlIG9mCitAY29k ZXt4fSBpcyBAY29kZXsxfSwgc28gdGhhdCdzIHdoYXQgQGNvZGV7Z2V0eH0gcmV0dXJucy4K KworSWYgd2UgdXNlIGR5bmFtaWMgYmluZGluZyBpbnN0ZWFkLCB0aGUgYmVoYXZpb3IgaXMg ZGlmZmVyZW50OgorCitAZXhhbXBsZQorOzs7IC0qLSBsZXhpY2FsLWJpbmRpbmc6IG5pbCAt Ki0KKworKHNldHEgeCAwKQorCisoZGVmdW4gZ2V0eCAoKQorICB4KQorCisoc2V0cSB4IDEp CisKKyhsZXQgKCh4IDIpKQorICAoZ2V0eCkpCisgICAgIEByZXN1bHR7fSAyCitAZW5kIGV4 YW1wbGUKKworQG5vaW5kZW50CitOb3csIHRoZSByZXN1bHQgb2YgQGNvZGV7KGdldHgpfSBp cyBAY29kZXsyfSEgIFRoYXQncyBiZWNhdXNlIHVuZGVyCitkeW5hbWljIGJpbmRpbmcsIHdo ZW4gZXhlY3V0aW5nIEBjb2Rle2dldHh9LCB0aGUgY3VycmVudCBiaW5kaW5nIGZvcgorQGNv ZGV7eH0gYXQgdGhlIHRvcCBvZiBvdXIgc3RhY2sgaXMgdGhlIG9uZSBmcm9tIG91ciBAY29k ZXtsZXR9CitiaW5kaW5nLiAgVGhpcyB0aW1lLCBAY29kZXtnZXR4fSBkb2Vzbid0IHNlZSB0 aGUgZ2xvYmFsIHZhbHVlIGZvcgorQGNvZGV7eH0sIHNpbmNlIGl0cyBiaW5kaW5nIGlzIGJl bG93IHRoZSBvbmUgZnJvbSBvdXIgQGNvZGV7bGV0fQorZXhwcmVzc2lvbiBpbiB0aGUgc3Rh Y2sgb2YgYmluZGluZ3MuCisKKyhTb21lIHZhcmlhYmxlcyBhcmUgYWxzbyBgYHNwZWNpYWwn JywgYW5kIHRoZXkgYXJlIGFsd2F5cyBkeW5hbWljYWxseQorYm91bmQgZXZlbiB3aGVuIEBj b2Rle2xleGljYWwtYmluZGluZ30gaXMgQGNvZGV7dH0uICBAeHJlZntkZWZ2YXIsICwKK0lu aXRpYWxpemluZyBhIFZhcmlhYmxlIHdpdGggQGNvZGV7ZGVmdmFyfX0uKQorCiBAbm9kZSBp ZgogQHNlY3Rpb24gVGhlIEBjb2Rle2lmfSBTcGVjaWFsIEZvcm0KIEBmaW5kZXggaWYKQEAg LTkxMzAsMTIgKzkyNDEsMTQgQEAgZGVmdmFyCiBnaXZlbiBhbiBpbml0aWFsIHZhbHVlIGJ5 IHVzaW5nIHRoZSBAY29kZXtkZWZ2YXJ9IHNwZWNpYWwgZm9ybS4gIFRoZQogbmFtZSBjb21l cyBmcm9tIGBgZGVmaW5lIHZhcmlhYmxlJycuCiAKLVRoZSBAY29kZXtkZWZ2YXJ9IHNwZWNp YWwgZm9ybSBpcyBzaW1pbGFyIHRvIEBjb2Rle3NldHF9IGluIHRoYXQgaXQgc2V0cwotdGhl IHZhbHVlIG9mIGEgdmFyaWFibGUuICBJdCBpcyB1bmxpa2UgQGNvZGV7c2V0cX0gaW4gdHdv IHdheXM6IGZpcnN0LAotaXQgb25seSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUg aWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGFscmVhZHkKLWhhdmUgYSB2YWx1ZS4gIElmIHRo ZSB2YXJpYWJsZSBhbHJlYWR5IGhhcyBhIHZhbHVlLCBAY29kZXtkZWZ2YXJ9IGRvZXMKLW5v dCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgdmFsdWUuICBTZWNvbmQsIEBjb2Rle2RlZnZhcn0g aGFzIGEKLWRvY3VtZW50YXRpb24gc3RyaW5nLgorVGhlIEBjb2Rle2RlZnZhcn0gc3BlY2lh bCBmb3JtIGlzIHNpbWlsYXIgdG8gQGNvZGV7c2V0cX0gaW4gdGhhdCBpdAorc2V0cyB0aGUg dmFsdWUgb2YgYSB2YXJpYWJsZS4gIEl0IGlzIHVubGlrZSBAY29kZXtzZXRxfSBpbiB0aHJl ZSB3YXlzOgorZmlyc3QsIGl0IG1hcmtzIHRoZSB2YXJpYWJsZSBhcyBgYHNwZWNpYWwnJyBz byB0aGF0IGl0IGlzIGFsd2F5cworZHluYW1pY2FsbHkgYm91bmQsIGV2ZW4gd2hlbiBAY29k ZXtsZXhpY2FsLWJpbmRpbmd9IGlzIEBjb2Rle3R9CisoQHB4cmVme0hvdyBsZXQgQmluZHMg VmFyaWFibGVzfSkuICBTZWNvbmQsIGl0IG9ubHkgc2V0cyB0aGUgdmFsdWUgb2YKK3RoZSB2 YXJpYWJsZSBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgdmFsdWUu ICBJZiB0aGUKK3ZhcmlhYmxlIGFscmVhZHkgaGFzIGEgdmFsdWUsIEBjb2Rle2RlZnZhcn0g ZG9lcyBub3Qgb3ZlcnJpZGUgdGhlCitleGlzdGluZyB2YWx1ZS4gIFRoaXJkLCBAY29kZXtk ZWZ2YXJ9IGhhcyBhIGRvY3VtZW50YXRpb24gc3RyaW5nLgogCiAoVGhlcmUgaXMgYSByZWxh dGVkIG1hY3JvLCBAY29kZXtkZWZjdXN0b219LCBkZXNpZ25lZCBmb3IgdmFyaWFibGVzCiB0 aGF0IHBlb3BsZSBjdXN0b21pemUuICBJdCBoYXMgbW9yZSBmZWF0dXJlcyB0aGFuIEBjb2Rl e2RlZnZhcn0uCi0tIAoyLjI1LjEKCg== --------------lfRemlczGkaSGJ0whIlnXGXz--