From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Barry OReilly Newsgroups: gmane.emacs.bugs Subject: bug#17235: Undo in region adjusts past positions incorrectly Date: Sat, 26 Apr 2014 17:00:04 -0400 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a11c2b8b2c87a4c04f7f85d30 X-Trace: ger.gmane.org 1398546088 23187 80.91.229.3 (26 Apr 2014 21:01:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 26 Apr 2014 21:01:28 +0000 (UTC) Cc: 17235@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Apr 26 23:01:21 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1We9iq-0003Sh-GT for geb-bug-gnu-emacs@m.gmane.org; Sat, 26 Apr 2014 23:01:20 +0200 Original-Received: from localhost ([::1]:37212 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1We9iq-0007rF-7G for geb-bug-gnu-emacs@m.gmane.org; Sat, 26 Apr 2014 17:01:20 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1We9if-0007ks-Lo for bug-gnu-emacs@gnu.org; Sat, 26 Apr 2014 17:01:15 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1We9iZ-0001Bc-CW for bug-gnu-emacs@gnu.org; Sat, 26 Apr 2014 17:01:09 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:51205) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1We9iZ-0001BY-8p for bug-gnu-emacs@gnu.org; Sat, 26 Apr 2014 17:01:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1We9iY-0000a7-FF for bug-gnu-emacs@gnu.org; Sat, 26 Apr 2014 17:01:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Barry OReilly Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 26 Apr 2014 21:01:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17235 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 17235-submit@debbugs.gnu.org id=B17235.13985460122140 (code B ref 17235); Sat, 26 Apr 2014 21:01:02 +0000 Original-Received: (at 17235) by debbugs.gnu.org; 26 Apr 2014 21:00:12 +0000 Original-Received: from localhost ([127.0.0.1]:59362 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1We9hi-0000YN-2p for submit@debbugs.gnu.org; Sat, 26 Apr 2014 17:00:12 -0400 Original-Received: from mail-oa0-f42.google.com ([209.85.219.42]:33336) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1We9hd-0000XQ-8X for 17235@debbugs.gnu.org; Sat, 26 Apr 2014 17:00:08 -0400 Original-Received: by mail-oa0-f42.google.com with SMTP id i4so5745176oah.1 for <17235@debbugs.gnu.org>; Sat, 26 Apr 2014 14:00:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=+EzoidtPKTmZ48MJoK47oRTMntpbXULGS8o0tY4RunQ=; b=ntdB45F2LLpJc3O++mpJsdHIOER2hJVaw7oPTxEZbvtpLj9gajaHUCk1zRqTRgPy1K 3U337aSeIJmGR7f1ciHgalJs1Ov/twhKdFjlfK2fTaILnq5aU2q4vD+daudfesZ7eShf pGzmC6+dpKmlaz91gjMR2xodwu+jbDFEHldgVDARJ3tzuHhX8f4ckhYDYWz6rUj6gy6Y vxwc5v3olQZw2SQXyKf4DspZ2MIy4JulsL35cNKbK1etyp1zw1Xv0ZDchgpudrYImB81 35H36UpC8FL3n5S3U8dnF2AwpwkYXK8vdri9Q5QshowbKBn6TCzWxiMdHb+gdGp4YmjC EM0g== X-Received: by 10.182.29.33 with SMTP id g1mr3459589obh.53.1398546004201; Sat, 26 Apr 2014 14:00:04 -0700 (PDT) Original-Received: by 10.76.6.44 with HTTP; Sat, 26 Apr 2014 14:00:04 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 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.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:88319 Archived-At: --001a11c2b8b2c87a4c04f7f85d30 Content-Type: multipart/alternative; boundary=001a11c2b8b2c87a4704f7f85d2e --001a11c2b8b2c87a4704f7f85d2e Content-Type: text/plain; charset=UTF-8 >> +;; More interesting is how to adjust the "ddd" insertion due to the >> +;; next undo-delta: (6 . -2). If the reinsertion of "ad" was an undo, >> +;; it is most sensical that the total "ddd" insertion adjustment be (7 >> +;; . 10) -> (6 . 8) -> (7 . 10). However, if the reinsertion was a >> +;; normal user edit, then most sensical is: (7 . 10) -> (6 . 8) -> (8 >> +;; . 10). The undo history is ambiguous about which. > I was not able to understand the above comment. By "normal user edit", I mean manually typing "ad" again, in which case, the "ad" is new. If "ad" was reintroduced using undo, then it is conceptually the same "ad" as before, in which case one might hope the "ddd" insertion starts at position 7 rather than 8. By "undo history is ambiguous", I mean buffer-undo-list is. undo-equiv-table can disambiguate the two, albeit not usefully. I revised the comments in the hopes it is clearer. Here's the diff of comments changes since the last patch: ;; The adjustment of the (7 . 10) insertion of "ddd" shows an edge -;; case. Normally an undo-delta of (6 . 2) would cause positions after -;; 6 to adjust by 2. However, they shouldn't adjust to less than 6, so -;; (7 . 10) adjusts to (6 . 8) due to this particular undo delta. +;; case. It is adjusted through the undo-deltas: ((6 . 2) (6 +;; . -2)). Normally an undo-delta of (6 . 2) would cause positions +;; after 6 to adjust by 2. However, they shouldn't adjust to less than +;; 6, so (7 . 10) adjusts to (6 . 8) due to the first undo delta. ;; ;; More interesting is how to adjust the "ddd" insertion due to the -;; next undo-delta: (6 . -2). If the reinsertion of "ad" was an undo, -;; it is most sensical that the total "ddd" insertion adjustment be (7 -;; . 10) -> (6 . 8) -> (7 . 10). However, if the reinsertion was a -;; normal user edit, then most sensical is: (7 . 10) -> (6 . 8) -> (8 -;; . 10). The undo history is ambiguous about which. +;; next undo-delta: (6 . -2), corresponding to reinsertion of "ad". If +;; the reinsertion was a manual retyping of "ad", then the total +;; adjustment should be (7 . 10) -> (6 . 8) -> (8 . 10). However, if +;; the reinsertion was due to undo, one might expect the first "d" +;; character would again be a part of the "ddd" text, meaning its +;; total adjustment would be (7 . 10) -> (6 . 8) -> (7 . 10). ;; ;; undo-make-selective-list assumes in this situation that "ad" was a -;; new edit. This means the undo system considers there to be a -;; deleted "ad" at position 8 of buffer content "ccaabaddd". If the -;; user undos in region "7 to 9", they could be surprised to get -;; buffer content: "ccaabadaddd" . This is a FIXME. Bug 16411 -;; describes the possibility of undo elements referencing what they -;; undid, and so resolving the problematic ambiguity. +;; new edit, even if it was inserted because of an undo. Consequently, +;; if the user undos in region "8 to 10" of the "ccaabaddd" buffer, +;; they could be surprised that it becomes "ccaabad", as though the +;; first "d" became detached from the original "ddd" insertion. This +;; quirk is a FIXME. Whether it's a quirk or bug is debatable. Either way, I think an approach is to effectively cancel out undos, using ideas described in bug 16411. Here's the other substantive changes since the last patch: @@ -2523,19 +2524,50 @@ list." (undo-adjust-pos elt deltas)) ;; (BEG . END) (`(,(and beg (pred integerp)) . ,(and end (pred integerp))) - (cons (undo-adjust-pos beg deltas) - (undo-adjust-pos end deltas t))) + (undo-adjust-beg-end beg end deltas)) ;; (TEXT . POSITION) (`(,(and text (pred stringp)) . ,(and pos (pred integerp))) - (cons text (undo-adjust-pos pos deltas))) + (cons text (* (if (< pos 0) -1 1) + (undo-adjust-pos (abs pos) deltas)))) ;; (nil PROPERTY VALUE BEG . END) (`(nil . ,(or `(,prop ,val ,beg . ,end) pcase--dontcare)) - `(nil ,prop ,val ,(undo-adjust-pos beg deltas) . ,(undo-adjust-pos end deltas t))) + `(nil ,prop ,val . ,(undo-adjust-beg-end beg end deltas))) ;; (apply DELTA START END FUN . ARGS) ;; FIXME: (Prior undo in region code didn't implement this.) ;; All others return same elt (_ elt))) +;; (BEG . END) can adjust to the same positions, commonly when an +;; insertion was undone and they are out of region, for example: +;; +;; buf pos: +;; 123456789 buffer-undo-list undo-deltas +;; --------- ---------------- ----------- +;; [...] +;; abbaa (2 . 4) (2 . -2) +;; aaa ("bb" . 2) (2 . 2) +;; [...] +;; +;; "bb" insertion (2 . 4) adjusts to (2 . 2) because of the subsequent +;; undo. Further adjustments to such an element should be the same as +;; for (TEXT . POSITION) elements. The options are: +;; +;; 1: POSITION adjusts using <= (use-< nil), resulting in behavior +;; analogous to marker insertion-type t. +;; +;; 2: POSITION adjusts using <, resulting in behavior analogous to +;; marker insertion-type nil. +;; +;; There was no strong reason to prefer one or the other, except that +;; the first is more consistent with prior undo in region behavior. +(defun undo-adjust-beg-end (beg end deltas) + "Return cons of adjustments to BEG and END by the undo DELTAS +list." + (let ((adj-beg (undo-adjust-pos beg deltas))) + ;; Note: option 2 above would be like (cons (min ...) adj-end) + (cons adj-beg + (max adj-beg (undo-adjust-pos end deltas t))))) + (defun undo-adjust-pos (pos deltas &optional use-<) "Return adjustment of POS by the undo DELTAS list, comparing with < or <= based on USE-<." Attached is the latest revision, which I'll install soon. --001a11c2b8b2c87a4704f7f85d2e Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
>> +;; More interesting is how to adjust the "d= dd" insertion due to the
>> +;; next undo-delta: (6 . -2). If= the reinsertion of "ad" was an undo,
>> +;; it is most = sensical that the total "ddd" insertion adjustment be (7
>> +;; . 10) -> (6 . 8) -> (7 . 10). However, if the reinsertio= n was a
>> +;; normal user edit, then most sensical is: (7 . 10) -= > (6 . 8) -> (8
>> +;; . 10). The undo history is ambiguous = about which.

> I was not able to understand the above comment.

By "no= rmal user edit", I mean manually typing "ad" again, in which=
case, the "ad" is new. If "ad" was reintroduced usi= ng undo, then it is
conceptually the same "ad" as before, in which case one might hop= e the
"ddd" insertion starts at position 7 rather than 8.
<= br>By "undo history is ambiguous", I mean buffer-undo-list is. undo-equiv-table can disambiguate the two, albeit not usefully.

I re= vised the comments in the hopes it is clearer. Here's the diff of
co= mments changes since the last patch:

=C2=A0;; The adjustment of the = (7 . 10) insertion of "ddd" shows an edge
-;; case. Normally an undo-delta of (6 . 2) would cause positions after
= -;; 6 to adjust by 2. However, they shouldn't adjust to less than 6, so=
-;; (7 . 10) adjusts to (6 . 8) due to this particular undo delta.
+;; case. It is adjusted through the undo-deltas: ((6 . 2) (6
+;; . -2))= . Normally an undo-delta of (6 . 2) would cause positions
+;; after 6 to= adjust by 2. However, they shouldn't adjust to less than
+;; 6, so = (7 . 10) adjusts to (6 . 8) due to the first undo delta.
=C2=A0;;
=C2=A0;; More interesting is how to adjust the "ddd" = insertion due to the
-;; next undo-delta: (6 . -2). If the reinsertion o= f "ad" was an undo,
-;; it is most sensical that the total &qu= ot;ddd" insertion adjustment be (7
-;; . 10) -> (6 . 8) -> (7 . 10). However, if the reinsertion was a-;; normal user edit, then most sensical is: (7 . 10) -> (6 . 8) ->= (8
-;; . 10). The undo history is ambiguous about which.
+;; next un= do-delta: (6 . -2), corresponding to reinsertion of "ad". If
+;; the reinsertion was a manual retyping of "ad", then the total=
+;; adjustment should be (7 . 10) -> (6 . 8) -> (8 . 10). However= , if
+;; the reinsertion was due to undo, one might expect the first &qu= ot;d"
+;; character would again be a part of the "ddd" text, meaning it= s
+;; total adjustment would be (7 . 10) -> (6 . 8) -> (7 . 10).=C2=A0;;
=C2=A0;; undo-make-selective-list assumes in this situation t= hat "ad" was a
-;; new edit. This means the undo system considers there to be a
-;; del= eted "ad" at position 8 of buffer content "ccaabaddd". = If the
-;; user undos in region "7 to 9", they could be surpri= sed to get
-;; buffer content: "ccaabadaddd" . This is a FIXME. Bug 16411-;; describes the possibility of undo elements referencing what they
-;= ; undid, and so resolving the problematic ambiguity.
+;; new edit, even = if it was inserted because of an undo. Consequently,
+;; if the user undos in region "8 to 10" of the "ccaabaddd&= quot; buffer,
+;; they could be surprised that it becomes "ccaabad&= quot;, as though the
+;; first "d" became detached from the or= iginal "ddd" insertion. This
+;; quirk is a FIXME.

Whether it's a quirk or bug is debatable. = Either way, I think an
approach is to effectively cancel out undos, usin= g ideas described in
bug 16411.

Here's the other substantive = changes since the last patch:

@@ -2523,19 +2524,50 @@ list."
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (= undo-adjust-pos elt deltas))
=C2=A0=C2=A0=C2=A0=C2=A0 ;; (BEG . END)
= =C2=A0=C2=A0=C2=A0=C2=A0 (`(,(and beg (pred integerp)) . ,(and end (pred in= tegerp)))
-=C2=A0=C2=A0=C2=A0=C2=A0 (cons (undo-adjust-pos beg deltas)-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (undo-adjus= t-pos end deltas t)))
+=C2=A0=C2=A0=C2=A0=C2=A0 (undo-adjust-beg-end beg end deltas))
=C2=A0= =C2=A0=C2=A0=C2=A0 ;; (TEXT . POSITION)
=C2=A0=C2=A0=C2=A0=C2=A0 (`(,(an= d text (pred stringp)) . ,(and pos (pred integerp)))
-=C2=A0=C2=A0=C2=A0= =C2=A0 (cons text (undo-adjust-pos pos deltas)))
+=C2=A0=C2=A0=C2=A0=C2= =A0 (cons text (* (if (< pos 0) -1 1)
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (undo-adjust-pos (abs pos) deltas))))<= br>=C2=A0=C2=A0=C2=A0=C2=A0 ;; (nil PROPERTY VALUE BEG . END)
=C2=A0=C2= =A0=C2=A0=C2=A0 (`(nil . ,(or `(,prop ,val ,beg . ,end) pcase--dontcare))-=C2=A0=C2=A0=C2=A0=C2=A0 `(nil ,prop ,val ,(undo-adjust-pos beg deltas) = . ,(undo-adjust-pos end deltas t)))
+=C2=A0=C2=A0=C2=A0=C2=A0 `(nil ,prop ,val . ,(undo-adjust-beg-end beg end = deltas)))
=C2=A0=C2=A0=C2=A0=C2=A0 ;; (apply DELTA START END FUN . ARGS)=
=C2=A0=C2=A0=C2=A0=C2=A0 ;; FIXME: (Prior undo in region code didn'= t implement this.)
=C2=A0=C2=A0=C2=A0=C2=A0 ;; All others return same el= t
=C2=A0=C2=A0=C2=A0=C2=A0 (_ elt)))
=C2=A0
+;; (BEG . END) can adjust = to the same positions, commonly when an
+;; insertion was undone and the= y are out of region, for example:
+;;
+;; buf pos:
+;; 123456789 b= uffer-undo-list undo-deltas
+;; --------- ---------------- -----------
+;; [...]
+;; abbaa=C2=A0= =C2=A0=C2=A0=C2=A0 (2 . 4)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 (2 . -2)
+;; aaa=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ("bb&qu= ot; . 2)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (2 . 2)
+;; [...]
+;;+;; "bb" insertion (2 . 4) adjusts to (2 . 2) because of the sub= sequent
+;; undo. Further adjustments to such an element should be the same as
+= ;; for (TEXT . POSITION) elements. The options are:
+;;
+;;=C2=A0=C2= =A0 1: POSITION adjusts using <=3D (use-< nil), resulting in behavior=
+;;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 analogous to marker insertion-type t.=
+;;
+;;=C2=A0=C2=A0 2: POSITION adjusts using <, resulting in behavio= r analogous to
+;;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 marker insertion-type n= il.
+;;
+;; There was no strong reason to prefer one or the other, ex= cept that
+;; the first is more consistent with prior undo in region beh= avior.
+(defun undo-adjust-beg-end (beg end deltas)
+=C2=A0 "Return cons o= f adjustments to BEG and END by the undo DELTAS
+list."
+=C2=A0 = (let ((adj-beg (undo-adjust-pos beg deltas)))
+=C2=A0=C2=A0=C2=A0 ;; Not= e: option 2 above would be like (cons (min ...) adj-end)
+=C2=A0=C2=A0=C2=A0 (cons adj-beg
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 (max adj-beg (undo-adjust-pos end deltas t)))))
+
= =C2=A0(defun undo-adjust-pos (pos deltas &optional use-<)
=C2=A0= =C2=A0 "Return adjustment of POS by the undo DELTAS list, comparing =C2=A0with < or <=3D based on USE-<."

Attached is the = latest revision, which I'll install soon.

--001a11c2b8b2c87a4704f7f85d2e-- --001a11c2b8b2c87a4c04f7f85d30 Content-Type: text/plain; charset=US-ASCII; name="undo-in-region.2.diff" Content-Disposition: attachment; filename="undo-in-region.2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_huhe6gb60 ZGlmZiAtLWdpdCBhL2xpc3Avc2ltcGxlLmVsIGIvbGlzcC9zaW1wbGUuZWwKaW5kZXggMGFmMTUy Ni4uYzE1Nzc2NyAxMDA2NDQKLS0tIGEvbGlzcC9zaW1wbGUuZWwKKysrIGIvbGlzcC9zaW1wbGUu ZWwKQEAgLTIzNjAsOTEgKzIzNjAsMTEyIEBAIGFyZSBpZ25vcmVkLiAgSWYgQkVHIGFuZCBFTkQg YXJlIG5pbCwgYWxsIHVuZG8gZWxlbWVudHMgYXJlIHVzZWQuIgogCSAgICAodW5kby1tYWtlLXNl bGVjdGl2ZS1saXN0IChtaW4gYmVnIGVuZCkgKG1heCBiZWcgZW5kKSkKIAkgIGJ1ZmZlci11bmRv LWxpc3QpKSkKIAorOzsgVGhlIHBvc2l0aW9ucyBnaXZlbiBpbiBlbGVtZW50cyBvZiB0aGUgdW5k byBsaXN0IGFyZSB0aGUgcG9zaXRpb25zCis7OyBhcyBvZiB0aGUgdGltZSB0aGF0IGVsZW1lbnQg d2FzIHJlY29yZGVkIHRvIHVuZG8gaGlzdG9yeS4gSW4KKzs7IGdlbmVyYWwsIHN1YnNlcXVlbnQg YnVmZmVyIGVkaXRzIHJlbmRlciB0aG9zZSBwb3NpdGlvbnMgaW52YWxpZCBpbgorOzsgdGhlIGN1 cnJlbnQgYnVmZmVyLCB1bmxlc3MgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcnZlbmlu ZworOzsgdW5kbyBlbGVtZW50cy4KKzs7Cis7OyBVbmRvIGluIHJlZ2lvbiBpcyBhIHVzZSBjYXNl IHRoYXQgcmVxdWlyZXMgYWRqdXN0bWVudHMgdG8gdW5kbworOzsgZWxlbWVudHMuIEl0IG11c3Qg YWRqdXN0IHBvc2l0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgcmVnaW9uIGJhc2VkCis7OyBvbiBu ZXdlciBlbGVtZW50cyBub3QgaW4gdGhlIHJlZ2lvbiBzbyBhcyB0aGV5IG1heSBiZSBjb3JyZWN0 bHkKKzs7IGFwcGxpZWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiB1bmRvLW1ha2Utc2VsZWN0aXZl LWxpc3QKKzs7IGFjY29tcGxpc2hlcyB0aGlzIHdpdGggaXRzIHVuZG8tZGVsdGFzIGxpc3Qgb2Yg YWRqdXN0bWVudHMuIEFuCis7OyBleGFtcGxlIHVuZG8gaGlzdG9yeSBmcm9tIG9sZGVzdCB0byBu ZXdlc3Q6Cis7OworOzsgYnVmIHBvczoKKzs7IDEyMzQ1Njc4OSBidWZmZXItdW5kby1saXN0IHVu ZG8tZGVsdGFzCis7OyAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLQorOzsg YWFhICAgICAgICgxIC4gNCkgICAgICAgICAgKDEgLiAtMykKKzs7IGFhYmEgICAgICAoMyAuIDQp ICAgICAgICAgIE4vQSAoaW4gcmVnaW9uKQorOzsgY2NhYWJhICAgICgxIC4gMykgICAgICAgICAg KDEgLiAtMikKKzs7IGNjYWFiYWRkZCAoNyAuIDEwKSAgICAgICAgICg3IC4gLTMpCis7OyBjY2Fh YmRkICAgKCJhZCIgLiA2KSAgICAgICAoNiAuIDIpCis7OyBjY2FhYmFkZGQgKDYgLiA4KSAgICAg ICAgICAoNiAuIC0yKQorOzsgIHwgICB8PC0tIHJlZ2lvbjogImNhYWIiLCBmcm9tIDIgdG8gNgor OzsKKzs7IFdoZW4gdGhlIHVzZXIgc3RhcnRzIGEgcnVuIG9mIHVuZG9zIGluIHJlZ2lvbiwKKzs7 IHVuZG8tbWFrZS1zZWxlY3RpdmUtbGlzdCBpcyBjYWxsZWQgdG8gY3JlYXRlIHRoZSBmdWxsIGxp c3Qgb2YgaW4KKzs7IHJlZ2lvbiBlbGVtZW50cy4gRWFjaCBlbGVtZW50IGlzIGFkanVzdGVkIGZv cndhcmQgY2hyb25vbG9naWNhbGx5Cis7OyB0aHJvdWdoIHVuZG8tZGVsdGFzIHRvIGRldGVybWlu ZSBpZiBpdCBpcyBpbiB0aGUgcmVnaW9uLgorOzsKKzs7IEluIHRoZSBhYm92ZSBleGFtcGxlLCB0 aGUgaW5zZXJ0aW9uIG9mICJiIiBpcyAoMyAuIDQpIGluIHRoZQorOzsgYnVmZmVyLXVuZG8tbGlz dC4gVGhlIHVuZG8tZGVsdGEgKDEgLiAtMikgY2F1c2VzICgzIC4gNCkgdG8gYmVjb21lCis7OyAo NSAuIDYpLiBUaGUgbmV4dCB0aHJlZSB1bmRvLWRlbHRhcyBjYXVzZSBubyBhZGp1c3RtZW50LCBz byAoNSAuIDYpCis7OyBpcyBhc3Nlc3NlZCBhcyBpbiB0aGUgcmVnaW9uIGFuZCBwbGFjZWQgaW4g dGhlIHNlbGVjdGl2ZQorOzsgbGlzdC4gTm90YWJseSwgdGhlIGVuZCBvZiByZWdpb24gaXRzZWxm IGFkanVzdHMgZnJvbSAiMiB0byA2IiB0byAiMgorOzsgdG8gNSIgZHVlIHRvIHRoZSBzZWxlY3Rl ZCBlbGVtZW50LiBUaGUgImIiIGluc2VydGlvbiBpcyB0aGUgb25seQorOzsgZWxlbWVudCBmdWxs eSBpbiB0aGUgcmVnaW9uLCBzbyBpbiB0aGlzIGV4YW1wbGUKKzs7IHVuZG8tbWFrZS1zZWxlY3Rp dmUtbGlzdCByZXR1cm5zIChuaWwgKDUgLiA2KSkuCis7OworOzsgVGhlIGFkanVzdG1lbnQgb2Yg dGhlICg3IC4gMTApIGluc2VydGlvbiBvZiAiZGRkIiBzaG93cyBhbiBlZGdlCis7OyBjYXNlLiBJ dCBpcyBhZGp1c3RlZCB0aHJvdWdoIHRoZSB1bmRvLWRlbHRhczogKCg2IC4gMikgKDYKKzs7IC4g LTIpKS4gTm9ybWFsbHkgYW4gdW5kby1kZWx0YSBvZiAoNiAuIDIpIHdvdWxkIGNhdXNlIHBvc2l0 aW9ucworOzsgYWZ0ZXIgNiB0byBhZGp1c3QgYnkgMi4gSG93ZXZlciwgdGhleSBzaG91bGRuJ3Qg YWRqdXN0IHRvIGxlc3MgdGhhbgorOzsgNiwgc28gKDcgLiAxMCkgYWRqdXN0cyB0byAoNiAuIDgp IGR1ZSB0byB0aGUgZmlyc3QgdW5kbyBkZWx0YS4KKzs7Cis7OyBNb3JlIGludGVyZXN0aW5nIGlz IGhvdyB0byBhZGp1c3QgdGhlICJkZGQiIGluc2VydGlvbiBkdWUgdG8gdGhlCis7OyBuZXh0IHVu ZG8tZGVsdGE6ICg2IC4gLTIpLCBjb3JyZXNwb25kaW5nIHRvIHJlaW5zZXJ0aW9uIG9mICJhZCIu IElmCis7OyB0aGUgcmVpbnNlcnRpb24gd2FzIGEgbWFudWFsIHJldHlwaW5nIG9mICJhZCIsIHRo ZW4gdGhlIHRvdGFsCis7OyBhZGp1c3RtZW50IHNob3VsZCBiZSAoNyAuIDEwKSAtPiAoNiAuIDgp IC0+ICg4IC4gMTApLiBIb3dldmVyLCBpZgorOzsgdGhlIHJlaW5zZXJ0aW9uIHdhcyBkdWUgdG8g dW5kbywgb25lIG1pZ2h0IGV4cGVjdCB0aGUgZmlyc3QgImQiCis7OyBjaGFyYWN0ZXIgd291bGQg YWdhaW4gYmUgYSBwYXJ0IG9mIHRoZSAiZGRkIiB0ZXh0LCBtZWFuaW5nIGl0cworOzsgdG90YWwg YWRqdXN0bWVudCB3b3VsZCBiZSAoNyAuIDEwKSAtPiAoNiAuIDgpIC0+ICg3IC4gMTApLgorOzsK Kzs7IHVuZG8tbWFrZS1zZWxlY3RpdmUtbGlzdCBhc3N1bWVzIGluIHRoaXMgc2l0dWF0aW9uIHRo YXQgImFkIiB3YXMgYQorOzsgbmV3IGVkaXQsIGV2ZW4gaWYgaXQgd2FzIGluc2VydGVkIGJlY2F1 c2Ugb2YgYW4gdW5kby4gQ29uc2VxdWVudGx5LAorOzsgaWYgdGhlIHVzZXIgdW5kb3MgaW4gcmVn aW9uICI4IHRvIDEwIiBvZiB0aGUgImNjYWFiYWRkZCIgYnVmZmVyLAorOzsgdGhleSBjb3VsZCBi ZSBzdXJwcmlzZWQgdGhhdCBpdCBiZWNvbWVzICJjY2FhYmFkIiwgYXMgdGhvdWdoIHRoZQorOzsg Zmlyc3QgImQiIGJlY2FtZSBkZXRhY2hlZCBmcm9tIHRoZSBvcmlnaW5hbCAiZGRkIiBpbnNlcnRp b24uIFRoaXMKKzs7IHF1aXJrIGlzIGEgRklYTUUuCisKIChkZWZ1biB1bmRvLW1ha2Utc2VsZWN0 aXZlLWxpc3QgKHN0YXJ0IGVuZCkKICAgIlJldHVybiBhIGxpc3Qgb2YgdW5kbyBlbGVtZW50cyBm b3IgdGhlIHJlZ2lvbiBTVEFSVCB0byBFTkQuCi1UaGUgZWxlbWVudHMgY29tZSBmcm9tIGBidWZm ZXItdW5kby1saXN0JywgYnV0IHdlIGtlZXAgb25seQotdGhlIGVsZW1lbnRzIGluc2lkZSB0aGlz IHJlZ2lvbiwgYW5kIGRpc2NhcmQgdGhvc2Ugb3V0c2lkZSB0aGlzIHJlZ2lvbi4KLUlmIHdlIGZp bmQgYW4gZWxlbWVudCB0aGF0IGNyb3NzZXMgYW4gZWRnZSBvZiB0aGlzIHJlZ2lvbiwKLXdlIHN0 b3AgYW5kIGlnbm9yZSBhbGwgZnVydGhlciBlbGVtZW50cy4iCi0gIChsZXQgKCh1bmRvLWxpc3Qt Y29weSAodW5kby1jb3B5LWxpc3QgYnVmZmVyLXVuZG8tbGlzdCkpCi0JKHVuZG8tbGlzdCAobGlz dCBuaWwpKQotCXNvbWUtcmVqZWN0ZWQKLQl1bmRvLWVsdCB0ZW1wLXVuZG8tbGlzdCBkZWx0YSkK LSAgICAod2hpbGUgdW5kby1saXN0LWNvcHkKLSAgICAgIChzZXRxIHVuZG8tZWx0IChjYXIgdW5k by1saXN0LWNvcHkpKQotICAgICAgKGxldCAoKGtlZXAtdGhpcwotCSAgICAgKGNvbmQgKChhbmQg KGNvbnNwIHVuZG8tZWx0KSAoZXEgKGNhciB1bmRvLWVsdCkgdCkpCi0JCSAgICA7OyBUaGlzIGlz IGEgIndhcyB1bm1vZGlmaWVkIiBlbGVtZW50LgotCQkgICAgOzsgS2VlcCBpdCBpZiB3ZSBoYXZl IGtlcHQgZXZlcnl0aGluZyB0aHVzIGZhci4KLQkJICAgIChub3Qgc29tZS1yZWplY3RlZCkpCi0g ICAgICAgICAgICAgICAgICAgOzsgU2tpcCBvdmVyIG1hcmtlciBhZGp1c3RtZW50cywgaW5zdGVh ZCByZWx5aW5nIG9uCi0gICAgICAgICAgICAgICAgICAgOzsgZmluZGluZyB0aGVtIGFmdGVyIChU RVhUIC4gUE9TKSBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICgobWFya2VycCAoY2FyLXNh ZmUgdW5kby1lbHQpKQotICAgICAgICAgICAgICAgICAgICBuaWwpCi0JCSAgICh0Ci0JCSAgICAo dW5kby1lbHQtaW4tcmVnaW9uIHVuZG8tZWx0IHN0YXJ0IGVuZCkpKSkpCi0JKGlmIGtlZXAtdGhp cwotCSAgICAocHJvZ24KLQkgICAgICAoc2V0cSBlbmQgKCsgZW5kIChjZHIgKHVuZG8tZGVsdGEg dW5kby1lbHQpKSkpCi0JICAgICAgOzsgRG9uJ3QgcHV0IHR3byBuaWxzIHRvZ2V0aGVyIGluIHRo ZSBsaXN0Ci0JICAgICAgKHdoZW4gKG5vdCAoYW5kIChlcSAoY2FyIHVuZG8tbGlzdCkgbmlsKQot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIHVuZG8tZWx0IG5pbCkpKQotICAgICAg ICAgICAgICAgIChzZXRxIHVuZG8tbGlzdCAoY29ucyB1bmRvLWVsdCB1bmRvLWxpc3QpKQotICAg ICAgICAgICAgICAgIDs7IElmIChURVhUIC4gUE9TKSwgImtlZXAiIGl0cyBzdWJzZXF1ZW50IChN QVJLRVIKLSAgICAgICAgICAgICAgICA7OyAuIEFESlVTVE1FTlQpIHdob3NlIG1hcmtlcnMgaGF2 ZW4ndCBtb3ZlZC4KLSAgICAgICAgICAgICAgICAod2hlbiAoYW5kIChzdHJpbmdwIChjYXItc2Fm ZSB1bmRvLWVsdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZWdlcnAgKGNkci1z YWZlIHVuZG8tZWx0KSkpCi0gICAgICAgICAgICAgICAgICAobGV0ICgobGlzdC1pIChjZHIgdW5k by1saXN0LWNvcHkpKSkKK1RoZSBlbGVtZW50cyBjb21lIGZyb20gYGJ1ZmZlci11bmRvLWxpc3Qn LCBidXQgd2Uga2VlcCBvbmx5IHRoZQorZWxlbWVudHMgaW5zaWRlIHRoaXMgcmVnaW9uLCBhbmQg ZGlzY2FyZCB0aG9zZSBvdXRzaWRlIHRoaXMKK3JlZ2lvbi4gVGhlIGVsZW1lbnRzJyBwb3NpdGlv bnMgYXJlIGFkanVzdGVkIHNvIGFzIHRoZSByZXR1cm5lZAorbGlzdCBjYW4gYmUgYXBwbGllZCB0 byB0aGUgY3VycmVudCBidWZmZXIuIgorICAobGV0ICgodWxpc3QgYnVmZmVyLXVuZG8tbGlzdCkK KyAgICAgICAgOzsgQSBsaXN0IG9mIHBvc2l0aW9uIGFkanVzdGVkIHVuZG8gZWxlbWVudHMgaW4g dGhlIHJlZ2lvbi4KKyAgICAgICAgKHNlbGVjdGl2ZS1saXN0IChsaXN0IG5pbCkpCisgICAgICAg IDs7IEEgbGlzdCBvZiB1bmRvLWRlbHRhcyBmb3Igb3V0IG9mIHJlZ2lvbiB1bmRvIGVsZW1lbnRz LgorICAgICAgICB1bmRvLWRlbHRhcworICAgICAgICB1bmRvLWVsdCkKKyAgICAod2hpbGUgdWxp c3QKKyAgICAgIChzZXRxIHVuZG8tZWx0IChjYXIgdWxpc3QpKQorICAgICAgKGNvbmQKKyAgICAg ICAoKG51bGwgdW5kby1lbHQpCisgICAgICAgIDs7IERvbid0IHB1dCB0d28gbmlscyB0b2dldGhl ciBpbiB0aGUgbGlzdAorICAgICAgICAod2hlbiAoY2FyIHNlbGVjdGl2ZS1saXN0KQorICAgICAg ICAgIChwdXNoIG5pbCBzZWxlY3RpdmUtbGlzdCkpKQorICAgICAgICgoYW5kIChjb25zcCB1bmRv LWVsdCkgKGVxIChjYXIgdW5kby1lbHQpIHQpKQorICAgICAgICA7OyBUaGlzIGlzIGEgIndhcyB1 bm1vZGlmaWVkIiBlbGVtZW50LiAgS2VlcCBpdAorICAgICAgICA7OyBpZiB3ZSBoYXZlIGtlcHQg ZXZlcnl0aGluZyB0aHVzIGZhci4KKyAgICAgICAgKHdoZW4gKG5vdCB1bmRvLWRlbHRhcykKKyAg ICAgICAgICAocHVzaCB1bmRvLWVsdCBzZWxlY3RpdmUtbGlzdCkpKQorICAgICAgIDs7IFNraXAg b3ZlciBtYXJrZXIgYWRqdXN0bWVudHMsIGluc3RlYWQgcmVseWluZworICAgICAgIDs7IG9uIGZp bmRpbmcgdGhlbSBhZnRlciAoVEVYVCAuIFBPUykgZWxlbWVudHMKKyAgICAgICAoKG1hcmtlcnAg KGNhci1zYWZlIHVuZG8tZWx0KSkKKyAgICAgICAgbmlsKQorICAgICAgICh0CisgICAgICAgIChs ZXQgKChhZGp1c3RlZC11bmRvLWVsdCAodW5kby1hZGp1c3QtZWx0IHVuZG8tZWx0CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZG8tZGVsdGFzKSkp CisgICAgICAgICAgKGlmICh1bmRvLWVsdC1pbi1yZWdpb24gYWRqdXN0ZWQtdW5kby1lbHQgc3Rh cnQgZW5kKQorICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAoc2V0cSBlbmQg KCsgZW5kIChjZHIgKHVuZG8tZGVsdGEgYWRqdXN0ZWQtdW5kby1lbHQpKSkpCisgICAgICAgICAg ICAgICAgKHB1c2ggYWRqdXN0ZWQtdW5kby1lbHQgc2VsZWN0aXZlLWxpc3QpCisgICAgICAgICAg ICAgICAgOzsgS2VlcCAoTUFSS0VSIC4gQURKVVNUTUVOVCkgaWYgdGhlaXIgKFRFWFQgLiBQT1Mp IHdhcworICAgICAgICAgICAgICAgIDs7IGtlcHQuIHByaW1pdGl2ZS11bmRvIG1heSBkaXNjYXJk IHRoZW0gbGF0ZXIuCisgICAgICAgICAgICAgICAgKHdoZW4gKGFuZCAoc3RyaW5ncCAoY2FyLXNh ZmUgYWRqdXN0ZWQtdW5kby1lbHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVn ZXJwIChjZHItc2FmZSBhZGp1c3RlZC11bmRvLWVsdCkpKQorICAgICAgICAgICAgICAgICAgKGxl dCAoKGxpc3QtaSAoY2RyIHVsaXN0KSkpCiAgICAgICAgICAgICAgICAgICAgICh3aGlsZSAobWFy a2VycCAoY2FyLXNhZmUgKGNhciBsaXN0LWkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAobGV0 KiAoKGFkai1lbHQgKHBvcCBsaXN0LWkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bSAoY2FyIGFkai1lbHQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKGVxIChtYXJr ZXItYnVmZmVyIG0pIChjdXJyZW50LWJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICg9IChjZHIgdW5kby1lbHQpIG0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChw dXNoIGFkai1lbHQgdW5kby1saXN0KSkpKSkpKSkKLQkgIChpZiAodW5kby1lbHQtY3Jvc3Nlcy1y ZWdpb24gdW5kby1lbHQgc3RhcnQgZW5kKQotCSAgICAgIChzZXRxIHVuZG8tbGlzdC1jb3B5IG5p bCkKLQkgICAgKHNldHEgc29tZS1yZWplY3RlZCB0KQotCSAgICAoc2V0cSB0ZW1wLXVuZG8tbGlz dCAoY2RyIHVuZG8tbGlzdC1jb3B5KSkKLQkgICAgKHNldHEgZGVsdGEgKHVuZG8tZGVsdGEgdW5k by1lbHQpKQotCi0JICAgICh3aGVuICgvPSAoY2RyIGRlbHRhKSAwKQotCSAgICAgIChsZXQgKChw b3NpdGlvbiAoY2FyIGRlbHRhKSkKLQkJICAgIChvZmZzZXQgKGNkciBkZWx0YSkpKQotCi0JCTs7 IExvb3AgZG93biB0aGUgZWFybGllciBldmVudHMgYWRqdXN0aW5nIHRoZWlyIGJ1ZmZlcgotCQk7 OyBwb3NpdGlvbnMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGEgY2hhbmdlIHRvIHRoZSBidWZm ZXIKLQkJOzsgaXNuJ3QgYmVpbmcgdW5kb25lLiBXZSBvbmx5IG5lZWQgdG8gcHJvY2VzcyB0aG9z ZSBlbGVtZW50Ci0JCTs7IHR5cGVzIHdoaWNoIHVuZG8tZWx0LWluLXJlZ2lvbiB3aWxsIHJldHVy biBhcyBiZWluZyBpbgotCQk7OyB0aGUgcmVnaW9uIHNpbmNlIG9ubHkgdGhvc2UgdHlwZXMgY2Fu IGV2ZXIgZ2V0IGludG8gdGhlCi0JCTs7IG91dHB1dAotCi0JCSh3aGlsZSB0ZW1wLXVuZG8tbGlz dAotCQkgIChzZXRxIHVuZG8tZWx0IChjYXIgdGVtcC11bmRvLWxpc3QpKQotCQkgIChjb25kICgo aW50ZWdlcnAgdW5kby1lbHQpCi0JCQkgKGlmICg+PSB1bmRvLWVsdCBwb3NpdGlvbikKLQkJCSAg ICAgKHNldGNhciB0ZW1wLXVuZG8tbGlzdCAoLSB1bmRvLWVsdCBvZmZzZXQpKSkpCi0JCQkoKGF0 b20gdW5kby1lbHQpIG5pbCkKLQkJCSgoc3RyaW5ncCAoY2FyIHVuZG8tZWx0KSkKLQkJCSA7OyAo VEVYVCAuIFBPU0lUSU9OKQotCQkJIChsZXQgKCh0ZXh0LXBvcyAoYWJzIChjZHIgdW5kby1lbHQp KSkKLQkJCSAgICAgICAocG9pbnQtYXQtZW5kICg8IChjZHIgdW5kby1lbHQpIDAgKSkpCi0JCQkg ICAoaWYgKD49IHRleHQtcG9zIHBvc2l0aW9uKQotCQkJICAgICAgIChzZXRjZHIgdW5kby1lbHQg KCogKGlmIHBvaW50LWF0LWVuZCAtMSAxKQotCQkJCQkJICAgKC0gdGV4dC1wb3Mgb2Zmc2V0KSkp KSkpCi0JCQkoKGludGVnZXJwIChjYXIgdW5kby1lbHQpKQotCQkJIDs7IChCRUdJTiAuIEVORCkK LQkJCSAod2hlbiAoPj0gKGNhciB1bmRvLWVsdCkgcG9zaXRpb24pCi0JCQkgICAoc2V0Y2FyIHVu ZG8tZWx0ICgtIChjYXIgdW5kby1lbHQpIG9mZnNldCkpCi0JCQkgICAoc2V0Y2RyIHVuZG8tZWx0 ICgtIChjZHIgdW5kby1lbHQpIG9mZnNldCkpKSkKLQkJCSgobnVsbCAoY2FyIHVuZG8tZWx0KSkK LQkJCSA7OyAobmlsIFBST1BFUlRZIFZBTFVFIEJFRyAuIEVORCkKLQkJCSAobGV0ICgodGFpbCAo bnRoY2RyIDMgdW5kby1lbHQpKSkKLQkJCSAgICh3aGVuICg+PSAoY2FyIHRhaWwpIHBvc2l0aW9u KQotCQkJICAgICAoc2V0Y2FyIHRhaWwgKC0gKGNhciB0YWlsKSBvZmZzZXQpKQotCQkJICAgICAo c2V0Y2RyIHRhaWwgKC0gKGNkciB0YWlsKSBvZmZzZXQpKSkpKSkKLQkJICAoc2V0cSB0ZW1wLXVu ZG8tbGlzdCAoY2RyIHRlbXAtdW5kby1saXN0KSkpKSkpKSkKLSAgICAgIChzZXRxIHVuZG8tbGlz dC1jb3B5IChjZHIgdW5kby1saXN0LWNvcHkpKSkKLSAgICAobnJldmVyc2UgdW5kby1saXN0KSkp CisgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggKHBvcCBsaXN0LWkpIHNlbGVjdGl2ZS1saXN0 KSkpKSkKKyAgICAgICAgICAgIChsZXQgKChkZWx0YSAodW5kby1kZWx0YSB1bmRvLWVsdCkpKQor ICAgICAgICAgICAgICAod2hlbiAoLz0gMCAoY2RyIGRlbHRhKSkKKyAgICAgICAgICAgICAgICAo cHVzaCBkZWx0YSB1bmRvLWRlbHRhcykpKSkpKSkKKyAgICAgIChwb3AgdWxpc3QpKQorICAgIChu cmV2ZXJzZSBzZWxlY3RpdmUtbGlzdCkpKQogCiAoZGVmdW4gdW5kby1lbHQtaW4tcmVnaW9uICh1 bmRvLWVsdCBzdGFydCBlbmQpCiAgICJEZXRlcm1pbmUgd2hldGhlciBVTkRPLUVMVCBmYWxscyBp bnNpZGUgdGhlIHJlZ2lvbiBTVEFSVCAuLi4gRU5ELgpAQCAtMjQ5Miw2ICsyNTEzLDczIEBAIGlz IG5vdCAqaW5zaWRlKiB0aGUgcmVnaW9uIFNUQVJULi4uRU5ELiIKIAkgOzsgKEJFR0lOIC4gRU5E KQogCSAoYW5kICg8IChjYXIgdW5kby1lbHQpIGVuZCkKIAkgICAgICAoPiAoY2RyIHVuZG8tZWx0 KSBzdGFydCkpKSkpCisobWFrZS1vYnNvbGV0ZSAndW5kby1lbHQtY3Jvc3Nlcy1yZWdpb24gbmls ICIyNC41IikKKworKGRlZnVuIHVuZG8tYWRqdXN0LWVsdCAoZWx0IGRlbHRhcykKKyAgIlJldHVy biBhZGp1c3RtZW50IG9mIHVuZG8gZWxlbWVudCBFTFQgYnkgdGhlIHVuZG8gREVMVEFTCitsaXN0 LiIKKyAgKHBjYXNlIGVsdAorICAgIDs7IFBPU0lUSU9OCisgICAgKChwcmVkIGludGVnZXJwKQor ICAgICAodW5kby1hZGp1c3QtcG9zIGVsdCBkZWx0YXMpKQorICAgIDs7IChCRUcgLiBFTkQpCisg ICAgKGAoLChhbmQgYmVnIChwcmVkIGludGVnZXJwKSkgLiAsKGFuZCBlbmQgKHByZWQgaW50ZWdl cnApKSkKKyAgICAgKHVuZG8tYWRqdXN0LWJlZy1lbmQgYmVnIGVuZCBkZWx0YXMpKQorICAgIDs7 IChURVhUIC4gUE9TSVRJT04pCisgICAgKGAoLChhbmQgdGV4dCAocHJlZCBzdHJpbmdwKSkgLiAs KGFuZCBwb3MgKHByZWQgaW50ZWdlcnApKSkKKyAgICAgKGNvbnMgdGV4dCAoKiAoaWYgKDwgcG9z IDApIC0xIDEpCisgICAgICAgICAgICAgICAgICAgKHVuZG8tYWRqdXN0LXBvcyAoYWJzIHBvcykg ZGVsdGFzKSkpKQorICAgIDs7IChuaWwgUFJPUEVSVFkgVkFMVUUgQkVHIC4gRU5EKQorICAgIChg KG5pbCAuICwob3IgYCgscHJvcCAsdmFsICxiZWcgLiAsZW5kKSBwY2FzZS0tZG9udGNhcmUpKQor ICAgICBgKG5pbCAscHJvcCAsdmFsIC4gLCh1bmRvLWFkanVzdC1iZWctZW5kIGJlZyBlbmQgZGVs dGFzKSkpCisgICAgOzsgKGFwcGx5IERFTFRBIFNUQVJUIEVORCBGVU4gLiBBUkdTKQorICAgIDs7 IEZJWE1FOiAoUHJpb3IgdW5kbyBpbiByZWdpb24gY29kZSBkaWRuJ3QgaW1wbGVtZW50IHRoaXMu KQorICAgIDs7IEFsbCBvdGhlcnMgcmV0dXJuIHNhbWUgZWx0CisgICAgKF8gZWx0KSkpCisKKzs7 IChCRUcgLiBFTkQpIGNhbiBhZGp1c3QgdG8gdGhlIHNhbWUgcG9zaXRpb25zLCBjb21tb25seSB3 aGVuIGFuCis7OyBpbnNlcnRpb24gd2FzIHVuZG9uZSBhbmQgdGhleSBhcmUgb3V0IG9mIHJlZ2lv biwgZm9yIGV4YW1wbGU6Cis7OworOzsgYnVmIHBvczoKKzs7IDEyMzQ1Njc4OSBidWZmZXItdW5k by1saXN0IHVuZG8tZGVsdGFzCis7OyAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0t LS0tLQorOzsgWy4uLl0KKzs7IGFiYmFhICAgICAoMiAuIDQpICAgICAgICAgICgyIC4gLTIpCis7 OyBhYWEgICAgICAgKCJiYiIgLiAyKSAgICAgICAoMiAuIDIpCis7OyBbLi4uXQorOzsKKzs7ICJi YiIgaW5zZXJ0aW9uICgyIC4gNCkgYWRqdXN0cyB0byAoMiAuIDIpIGJlY2F1c2Ugb2YgdGhlIHN1 YnNlcXVlbnQKKzs7IHVuZG8uIEZ1cnRoZXIgYWRqdXN0bWVudHMgdG8gc3VjaCBhbiBlbGVtZW50 IHNob3VsZCBiZSB0aGUgc2FtZSBhcworOzsgZm9yIChURVhUIC4gUE9TSVRJT04pIGVsZW1lbnRz LiBUaGUgb3B0aW9ucyBhcmU6Cis7OworOzsgICAxOiBQT1NJVElPTiBhZGp1c3RzIHVzaW5nIDw9 ICh1c2UtPCBuaWwpLCByZXN1bHRpbmcgaW4gYmVoYXZpb3IKKzs7ICAgICAgYW5hbG9nb3VzIHRv IG1hcmtlciBpbnNlcnRpb24tdHlwZSB0LgorOzsKKzs7ICAgMjogUE9TSVRJT04gYWRqdXN0cyB1 c2luZyA8LCByZXN1bHRpbmcgaW4gYmVoYXZpb3IgYW5hbG9nb3VzIHRvCis7OyAgICAgIG1hcmtl ciBpbnNlcnRpb24tdHlwZSBuaWwuCis7OworOzsgVGhlcmUgd2FzIG5vIHN0cm9uZyByZWFzb24g dG8gcHJlZmVyIG9uZSBvciB0aGUgb3RoZXIsIGV4Y2VwdCB0aGF0Cis7OyB0aGUgZmlyc3QgaXMg bW9yZSBjb25zaXN0ZW50IHdpdGggcHJpb3IgdW5kbyBpbiByZWdpb24gYmVoYXZpb3IuCisoZGVm dW4gdW5kby1hZGp1c3QtYmVnLWVuZCAoYmVnIGVuZCBkZWx0YXMpCisgICJSZXR1cm4gY29ucyBv ZiBhZGp1c3RtZW50cyB0byBCRUcgYW5kIEVORCBieSB0aGUgdW5kbyBERUxUQVMKK2xpc3QuIgor ICAobGV0ICgoYWRqLWJlZyAodW5kby1hZGp1c3QtcG9zIGJlZyBkZWx0YXMpKSkKKyAgICA7OyBO b3RlOiBvcHRpb24gMiBhYm92ZSB3b3VsZCBiZSBsaWtlIChjb25zIChtaW4gLi4uKSBhZGotZW5k KQorICAgIChjb25zIGFkai1iZWcKKyAgICAgICAgICAobWF4IGFkai1iZWcgKHVuZG8tYWRqdXN0 LXBvcyBlbmQgZGVsdGFzIHQpKSkpKQorCisoZGVmdW4gdW5kby1hZGp1c3QtcG9zIChwb3MgZGVs dGFzICZvcHRpb25hbCB1c2UtPCkKKyAgIlJldHVybiBhZGp1c3RtZW50IG9mIFBPUyBieSB0aGUg dW5kbyBERUxUQVMgbGlzdCwgY29tcGFyaW5nCit3aXRoIDwgb3IgPD0gYmFzZWQgb24gVVNFLTwu IgorICAoZG9saXN0IChkIGRlbHRhcyBwb3MpCisgICAgKHdoZW4gKGlmIHVzZS08CisgICAgICAg ICAgICAgICg8IChjYXIgZCkgcG9zKQorICAgICAgICAgICAgKDw9IChjYXIgZCkgcG9zKSkKKyAg ICAgIChzZXRxIHBvcworICAgICAgICAgICAgOzsgRG9uJ3QgYWxsb3cgcG9zIHRvIGJlY29tZSBs ZXNzIHRoYW4gdGhlIHVuZG8tZGVsdGEKKyAgICAgICAgICAgIDs7IHBvc2l0aW9uLiBUaGlzIGVk Z2UgY2FzZSBpcyBkZXNjcmliZWQgaW4gdGhlIG92ZXJ2aWV3CisgICAgICAgICAgICA7OyBjb21t ZW50cy4KKyAgICAgICAgICAgIChtYXggKGNhciBkKSAoLSBwb3MgKGNkciBkKSkpKSkpKQogCiA7 OyBSZXR1cm4gdGhlIGZpcnN0IGFmZmVjdGVkIGJ1ZmZlciBwb3NpdGlvbiBhbmQgdGhlIGRlbHRh IGZvciBhbiB1bmRvIGVsZW1lbnQKIDs7IGRlbHRhIGlzIGRlZmluZWQgYXMgdGhlIGNoYW5nZSBp biBzdWJzZXF1ZW50IGJ1ZmZlciBwb3NpdGlvbnMgaWYgd2UgKmRpZCoKZGlmZiAtLWdpdCBhL3Rl c3QvYXV0b21hdGVkL3VuZG8tdGVzdHMuZWwgYi90ZXN0L2F1dG9tYXRlZC91bmRvLXRlc3RzLmVs CmluZGV4IDZlY2FjMzYuLjE3OGVhZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvYXV0b21hdGVkL3VuZG8t dGVzdHMuZWwKKysrIGIvdGVzdC9hdXRvbWF0ZWQvdW5kby10ZXN0cy5lbApAQCAtMjI2LDcgKzIy Niw3IEBACiAgICAgICAgICAgICAoc2hvdWxkLW5vdCAoYnVmZmVyLW1vZGlmaWVkLXApKSkpCiAg ICAgICAoZGVsZXRlLWZpbGUgdGVtcGZpbGUpKSkpCiAKLShlcnQtZGVmdGVzdCB1bmRvLXRlc3Qt aW4tcmVnaW9uLW5vdC1tb3N0LXJlY2VudCAoKQorKGVydC1kZWZ0ZXN0IHVuZG8tdGVzdC1yZWdp b24tbm90LW1vc3QtcmVjZW50ICgpCiAgICJUZXN0IHVuZG8gaW4gcmVnaW9uIG9mIGFuIGVkaXQg bm90IHRoZSBtb3N0IHJlY2VudC4iCiAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgKGJ1ZmZlci1l bmFibGUtdW5kbykKQEAgLTI0Nyw3ICsyNDcsNzggQEAKICAgICAoc2hvdWxkIChzdHJpbmc9IChi dWZmZXItc3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgIjExMTMxIikpKSkKIAotKGVydC1k ZWZ0ZXN0IHVuZG8tdGVzdC1pbi1yZWdpb24tZW9iICgpCisoZXJ0LWRlZnRlc3QgdW5kby10ZXN0 LXJlZ2lvbi1kZWxldGlvbiAoKQorICAiVGVzdCB1bmRvaW5nIGEgZGVsZXRpb24gdG8gZGVtb25z dHJhdGUgYnVnIDE3MjM1LiIKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAoYnVmZmVyLWVuYWJs ZS11bmRvKQorICAgICh0cmFuc2llbnQtbWFyay1tb2RlIDEpCisgICAgKGluc2VydCAiMTIzNDUi KQorICAgIChzZWFyY2gtYmFja3dhcmQgIjQiKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChk ZWxldGUtZm9yd2FyZC1jaGFyIDEpCisgICAgKHNlYXJjaC1iYWNrd2FyZCAiMSIpCisgICAgKHVu ZG8tYm91bmRhcnkpCisgICAgKGluc2VydCAieHh4eCIpCisgICAgKHVuZG8tYm91bmRhcnkpCisg ICAgKGluc2VydCAieXkiKQorICAgIChzZWFyY2gtZm9yd2FyZCAiMzUiKQorICAgICh1bmRvLWJv dW5kYXJ5KQorICAgIDs7IFNlbGVjdCAiMzUiCisgICAgKHB1c2gtbWFyayAocG9pbnQpIHQgdCkK KyAgICAoc2V0cSBtYXJrLWFjdGl2ZSB0KQorICAgIChmb3J3YXJkLWNoYXIgLTIpCisgICAgKHVu ZG8pIDsgRXhwZWN0ICI0IiB0byBjb21lIGJhY2sKKyAgICAoc2hvdWxkIChzdHJpbmc9IChidWZm ZXItc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgInh4eHh5eTEyMzQ1IikpKSkKKworKGVy dC1kZWZ0ZXN0IHVuZG8tdGVzdC1yZWdpb24tZXhhbXBsZSAoKQorICAiVGhlIHNhbWUgZXhhbXBs ZSB0ZXN0IGNhc2UgZGVzY3JpYmVkIGluIGNvbW1lbnRzIGZvcgordW5kby1tYWtlLXNlbGVjdGl2 ZS1saXN0LiIKKyAgOzsgYnVmIHBvczoKKyAgOzsgMTIzNDU2Nzg5IGJ1ZmZlci11bmRvLWxpc3Qg IHVuZG8tZGVsdGFzCisgIDs7IC0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0t LQorICA7OyBhYWEgICAgICAgKDEgLiA0KSAgICAgICAgICAgKDEgLiAtMykKKyAgOzsgYWFiYSAg ICAgICgzIC4gNCkgICAgICAgICAgIE4vQSAoaW4gcmVnaW9uKQorICA7OyBjY2FhYmEgICAgKDEg LiAzKSAgICAgICAgICAgKDEgLiAtMikKKyAgOzsgY2NhYWJhZGRkICg3IC4gMTApICAgICAgICAg ICg3IC4gLTMpCisgIDs7IGNjYWFiZGQgICAoImFkIiAuIDYpICAgICAgICAoNiAuIDIpCisgIDs7 IGNjYWFiYWRkZCAoNiAuIDgpICAgICAgICAgICAoNiAuIC0yKQorICA7OyAgfCAgIHw8LS0gcmVn aW9uOiAiY2FhYiIsIGZyb20gMiB0byA2CisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGJ1ZmZl ci1lbmFibGUtdW5kbykKKyAgICAodHJhbnNpZW50LW1hcmstbW9kZSAxKQorICAgIChpbnNlcnQg ImFhYSIpCisgICAgKGdvdG8tY2hhciAzKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChpbnNl cnQgImIiKQorICAgIChnb3RvLWNoYXIgMSkKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoaW5z ZXJ0ICJjYyIpCisgICAgKGdvdG8tY2hhciA3KQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChp bnNlcnQgImRkZCIpCisgICAgKHNlYXJjaC1iYWNrd2FyZCAiYWQiKQorICAgICh1bmRvLWJvdW5k YXJ5KQorICAgIChkZWxldGUtZm9yd2FyZC1jaGFyIDIpCisgICAgKHVuZG8tYm91bmRhcnkpCisg ICAgOzsgU2VsZWN0ICJkZCIKKyAgICAocHVzaC1tYXJrIChwb2ludCkgdCB0KQorICAgIChzZXRx IG1hcmstYWN0aXZlIHQpCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAodW5kbykK KyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoc2hvdWxkIChzdHJpbmc9IChidWZmZXItc3RyaW5n KQorICAgICAgICAgICAgICAgICAgICAgImNjYWFiYWRkZCIpKQorICAgIDs7IFNlbGVjdCAiY2Fh YiIKKyAgICAocHVzaC1tYXJrIDIgdCB0KQorICAgIChzZXRxIG1hcmstYWN0aXZlIHQpCisgICAg KGdvdG8tY2hhciA2KQorICAgICh1bmRvKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChzaG91 bGQgKHN0cmluZz0gKGJ1ZmZlci1zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAiY2NhYWFk ZGQiKSkpKQorCisoZXJ0LWRlZnRlc3QgdW5kby10ZXN0LXJlZ2lvbi1lb2IgKCkKICAgIlRlc3Qg dW5kbyBpbiByZWdpb24gb2YgYSBkZWxldGlvbiBhdCBFT0IsIGRlbW9uc3RyYXRpbmcgYnVnIDE2 NDExLiIKICAgKHdpdGgtdGVtcC1idWZmZXIKICAgICAoYnVmZmVyLWVuYWJsZS11bmRvKQo= --001a11c2b8b2c87a4c04f7f85d30--