From mboxrd@z Thu Jan  1 00:00:00 1970
Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail
From: Jim Porter <jporterbugs@gmail.com>
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: <a9812c1d-71e4-5f3f-83a4-a2923e649f3a@gmail.com>
 <a5120e2f-b008-1b74-1ad9-3fe7d861b13c@gmail.com>
 <E1qx8nq-0007DY-HV@fencepost.gnu.org>
 <3ade119d-0f0d-e60e-1bdc-9c7e02c1559c@gmail.com>
 <E1r4YeF-0001fe-Ex@fencepost.gnu.org>
 <381836df-c16f-b3e7-d0c4-473290e165de@gmail.com>
 <f44cca7f-13bb-a41a-c9ce-55f1b736c52b@gmail.com>
 <E1r5zuY-00041H-Bl@fencepost.gnu.org>
 <9239b6bd-b476-b6c1-aef9-245e439aee42@gmail.com> <83jzq7fx5o.fsf@gnu.org>
 <64d90b0b-e003-7bc3-5312-6c7ab4c4591f@gmail.com> <838r6nfkfj.fsf@gnu.org>
 <fb691578-f89f-d0d1-aab0-7e9e4236bab1@gmail.com> <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 <eliz@gnu.org>
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: <bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org>
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 <bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org>)
	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 <bug-gnu-emacs-bounces@gnu.org>)
	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 <Debian-debbugs@debbugs.gnu.org>)
 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 <Debian-debbugs@debbugs.gnu.org>)
 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 <Debian-debbugs@debbugs.gnu.org>) 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 <jporterbugs@gmail.com>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces@debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@gnu.org
Resent-Date: Thu, 30 Nov 2023 21:05:02 +0000
Resent-Message-ID: <handler.66756.B66756.17013782519724@debbugs.gnu.org>
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 <debbugs-submit-bounces@debbugs.gnu.org>)
 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 <jporterbugs@gmail.com>) 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" <bug-gnu-emacs.gnu.org>
List-Unsubscribe: <https://lists.gnu.org/mailman/options/bug-gnu-emacs>,
 <mailto:bug-gnu-emacs-request@gnu.org?subject=unsubscribe>
List-Archive: <https://lists.gnu.org/archive/html/bug-gnu-emacs>
List-Post: <mailto:bug-gnu-emacs@gnu.org>
List-Help: <mailto:bug-gnu-emacs-request@gnu.org?subject=help>
List-Subscribe: <https://lists.gnu.org/mailman/listinfo/bug-gnu-emacs>,
 <mailto:bug-gnu-emacs-request@gnu.org?subject=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: <http://permalink.gmane.org/gmane.emacs.bugs/275296>

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--