From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: A Soare Newsgroups: gmane.emacs.devel Subject: Re: An automaton for indenting the lisp code in linear time Date: Tue, 1 Jul 2008 04:24:59 +0200 (CEST) Message-ID: <24276243.2453471214879099434.JavaMail.www@wwinf4604> Reply-To: alinsoar@voila.fr NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_15351_28664559.1214879099433" X-Trace: ger.gmane.org 1214879128 5128 80.91.229.12 (1 Jul 2008 02:25:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 1 Jul 2008 02:25:28 +0000 (UTC) Cc: "Emacs Dev \[emacs-devel\]" To: "Lennart Borgman (gmail)" Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Jul 01 04:26:12 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KDVZC-00028q-V3 for ged-emacs-devel@m.gmane.org; Tue, 01 Jul 2008 04:26:03 +0200 Original-Received: from localhost ([127.0.0.1]:46749 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KDVYM-0003Ig-Az for ged-emacs-devel@m.gmane.org; Mon, 30 Jun 2008 22:25:10 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KDVYG-0003IR-GN for emacs-devel@gnu.org; Mon, 30 Jun 2008 22:25:04 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KDVYF-0003ID-74 for emacs-devel@gnu.org; Mon, 30 Jun 2008 22:25:03 -0400 Original-Received: from [199.232.76.173] (port=33150 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KDVYF-0003IA-0b for emacs-devel@gnu.org; Mon, 30 Jun 2008 22:25:03 -0400 Original-Received: from smtp2.voila.fr ([193.252.22.175]:40506 helo=smtp1.voila.fr) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KDVYE-0005GE-A8 for emacs-devel@gnu.org; Mon, 30 Jun 2008 22:25:02 -0400 Original-Received: from me-wanadoo.net (localhost [127.0.0.1]) by mwinf4101.voila.fr (SMTP Server) with ESMTP id A5ED51C002E9; Tue, 1 Jul 2008 04:24:59 +0200 (CEST) Original-Received: from wwinf4604 (wwinf4604 [10.232.13.31]) by mwinf4101.voila.fr (SMTP Server) with ESMTP id 6B58B1C00315; Tue, 1 Jul 2008 04:24:59 +0200 (CEST) X-ME-UUID: 20080701022459439.6B58B1C00315@mwinf4101.voila.fr X-Originating-IP: [93.112.90.5] X-Wum-Nature: EMAIL-NATURE X-WUM-FROM: |~| X-WUM-TO: |~| X-WUM-CC: |~| X-WUM-REPLYTO: |~| X-me-spamlevel: not-spam X-me-spamrating: 40.000000 X-me-spamcause: OK, (-100)(0000)secvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-kernel: by monty-python.gnu.org: Linux 2.4-2.6 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:100252 Archived-At: ------=_Part_15351_28664559.1214879099433 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable >=20 > Maybe it would be good if you explained a bit more how to use the=20 > example code. (The example code seems to have difficulties with lines=20 > that have indentation 0.) >=20 For all: please report me problems , unconsidered cases, where the indent d= oes not work. When I wrote it, I tested it on a limited number (little) of = examples. This version works just on the examples that I tested. Today I realised tha= t it did not work on all the uses of comments. I attach again here my last version. The automaton is written long time ago= , and yesterday I wrote just the examples: consult the 2 examples to unders= tand. The examples are just suggestions to understand how it works: I explain here for all to understand: 1. Put the text of the function you want to indent. 2. Put after the function that you want to indent this code (leave before t= he "(let" a space): (let (indent-lines state=20 (l (prog2 (beginning-of-line) (point)))) (save-excursion (lisp-indent-automaton)) indent-lines) 3. Evaluate this . You will get a list L whose (mapcar 'car L) is the corre= ct indentation. I believed that there are hackers of lisp here and you see imediately how i= t works :) EXAMPLE: (defun lisp-indent-automaton (&optional end state indent-what-argument star= t-col) " an automaton to indent the lisp code VERSION: NEW " (let ( indent indent-next-line-to ) (or end (beginning-of-line) (setq end (point))) (or indent-what-argument (setq indent-what-argument 0)) (or state (beginning-of-defun)) (and (null start-col) (setq start-col 0)) (catch 'STOP (while (< (point) end) (cond ((and (elt state 8) (not (elt state 4))) ;; inside a string (and (looking-at "\\s>") (setq indent-lines (cons (lisp-indent-value) indent-lin= es))) (setq state (lisp-indent-next-state)) ) ((looking-at "\\s\"") ;; the start of a string (setq indent (append indent (list :s () (current-column))) state (lisp-indent-next-state)) ) ((looking-at "\\s\(") ;; open a parenthesis (let ((col (if indent-lines (+ (current-column) (- (caar indent-lines) (c= dar indent-lines))) (current-column)))) (setq indent (append indent (list :l () col)) state (lisp-indent-automaton end (lisp-indent-next-s= tate) (lisp-indent-what-argum= ent) col))) ) ((looking-at "\\s\)") ;; close a parenthesis (throw 'STOP (lisp-indent-next-state)) ) ((looking-at "\\s ") ;; spaces are ignored (while (looking-at "[[:blank:]]") (setq state (lisp-indent-next-state))) ) ((looking-at "\\sw\\|\\s_") ;; a function or a parameter (let* ((col (if indent-lines (+ (current-column) (- (caar indent-lines) (c= dar indent-lines))) (current-column))) r (w (catch 'WORD (while t (setq r (concat r (string (following-char)))) (setq state (lisp-indent-next-state)) (and (not (looking-at "\\w\\|\\s_")) (throw 'WORD r)))))) (setq indent (append indent (list :w w col)))) ) ((looking-at "\\s<") ;; start of a comment (while (not (looking-at "\\s>")) (setq state (lisp-indent-next-state))) ) ((looking-at "\\s\'") ;; quote (setq indent (append indent (list :q () (current-column)))) (setq state (lisp-indent-next-state)) ) ((looking-at "\\s\\") ;; a special character (setq state (lisp-indent-next-state 2)) ) ((looking-at "\\s>") ;; end of line (setq state (lisp-indent-next-state)) (while (looking-at "\\s ") (setq state (lisp-indent-next-state))) (setq indent-lines (cons (cons (lisp-indent-value) (current-= column)) indent-lines)) ) (t (error "oops! unknown class of syntax ! (indent failed at po= sition %d)" (point)))))))) (let (indent-lines state=20 (l (prog2 (beginning-of-line) (point)))) (save-excursion (lisp-indent-automaton)) indent-lines) EVALUATE HERE WITH M-x M-e ((0 . 0) (0 . 0) (0 . 0) (2 . 3) (2 . 3) (6 . 7) (6 . 7) (0 . 1) (0 . 0) (0= . 0) (0 . 0) (0 . 0) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (17 . 17) (15= . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (15 . 15) (14 . 14= ) (15 . 15) (15 . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (15= . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (34 . 34) (29 . 29) (29 . 29= ) (29 . 29) (27 . 27) (22 . 22) (22 . 22) (29 . 28) (31 . 30) (15 . 15) (15= . 15) (14 . 14) (15 . 15) (17 . 17) (15 . 15) (15 . 15) (14 . 14) (15 . 15= ) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (52 . 52) (52 . 52) (23 . 23) (17= . 17) (28 . 28) (30 . 30) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (21 . 21= ) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (20 . 20) (15 . 15) (15= . 15) (20 . 20) (8 . 8) (6 . 6) (4 . 4) (4 . 4) (4 . 4) (8 . 8) (4 . 4) (4= . 4) (8 . 8) (8 . 8) (8 . 8) (2 . 2) nil nil nil (2 . 2)) (mapcar 'car=20 '((0 . 0) (0 . 0) (0 . 0) (2 . 3) (2 . 3) (6 . 7) (6 . 7) (0 . 1) (0 . 0) (= 0 . 0) (0 . 0) (0 . 0) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (17 . 17) (1= 5 . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (15 . 15) (14 . 1= 4) (15 . 15) (15 . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (1= 5 . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (34 . 34) (29 . 29) (29 . 2= 9) (29 . 29) (27 . 27) (22 . 22) (22 . 22) (29 . 28) (31 . 30) (15 . 15) (1= 5 . 15) (14 . 14) (15 . 15) (17 . 17) (15 . 15) (15 . 15) (14 . 14) (15 . 1= 5) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (52 . 52) (52 . 52) (23 . 23) (1= 7 . 17) (28 . 28) (30 . 30) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (21 . 2= 1) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (20 . 20) (15 . 15) (1= 5 . 15) (20 . 20) (8 . 8) (6 . 6) (4 . 4) (4 . 4) (4 . 4) (8 . 8) (4 . 4) (= 4 . 4) (8 . 8) (8 . 8) (8 . 8) (2 . 2) nil nil nil (2 . 2))) (0 0 0 2 2 6 6 0 0 0 0 0 15 14 15 15 17 15 15 15 14 15 15 15 14 15 15 15 15= 14 15 17 15 15 14 15 17 34 29 29 29 27 22 22 29 31 15 15 14 15 17 15 15 14= 15 15 15 14 15 52 52 23 17 28 30 15 15 14 15 21 15 15 14 15 15 20 15 15 20= 8 6 4 4 4 8 4 4 8 8 8 2 nil nil nil 2) THIS IS THE CORRECT INDENTATION. (mapcar 'cdr=20 '((0 . 0) (0 . 0) (0 . 0) (2 . 3) (2 . 3) (6 . 7) (6 . 7) (0 . 1) (0 . 0) (= 0 . 0) (0 . 0) (0 . 0) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (17 . 17) (1= 5 . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (15 . 15) (14 . 1= 4) (15 . 15) (15 . 15) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (1= 5 . 15) (15 . 15) (14 . 14) (15 . 15) (17 . 17) (34 . 34) (29 . 29) (29 . 2= 9) (29 . 29) (27 . 27) (22 . 22) (22 . 22) (29 . 28) (31 . 30) (15 . 15) (1= 5 . 15) (14 . 14) (15 . 15) (17 . 17) (15 . 15) (15 . 15) (14 . 14) (15 . 1= 5) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (52 . 52) (52 . 52) (23 . 23) (1= 7 . 17) (28 . 28) (30 . 30) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (21 . 2= 1) (15 . 15) (15 . 15) (14 . 14) (15 . 15) (15 . 15) (20 . 20) (15 . 15) (1= 5 . 15) (20 . 20) (8 . 8) (6 . 6) (4 . 4) (4 . 4) (4 . 4) (8 . 8) (4 . 4) (= 4 . 4) (8 . 8) (8 . 8) (8 . 8) (2 . 2) nil nil nil (2 . 2))) (0 0 0 3 3 7 7 1 0 0 0 0 15 14 15 15 17 15 15 15 14 15 15 15 14 15 15 15 15= 14 15 17 15 15 14 15 17 34 29 29 29 27 22 22 28 30 15 15 14 15 17 15 15 14= 15 15 15 14 15 52 52 23 17 28 30 15 15 14 15 21 15 15 14 15 15 20 15 15 20= 8 6 4 4 4 8 4 4 8 8 8 2 nil nil nil 2) THIS IS THE OLD INDENTATION (nil means that there are spaces) Read the indent-defun to see how to use it. Alin Soare. ____________________________________________________ Sur le mail Voila, vous pouvez personnaliser l=E2=80=99anti-spam ! http://m= ail.voila.fr ------=_Part_15351_28664559.1214879099433 Content-Type: application/octet-stream; name=indent.el content-transfer-encoding: base64 Content-Disposition: attachment; filename=indent.el CihkZWZ1biBsaXNwLWluZGVudC12YWx1ZSAoKQogICIKICBWRVJTSU9OIDogTkVXCiAgIgogIChj b25kICgoZWx0IHN0YXRlIDMpCiAgICAgICAgIDs7IEluc2lkZSBhIHN0cmluZywgZG9uJ3QgY2hh bmdlIGluZGVudGF0aW9uLgogICAgICAgICBuaWwKICAgICAgICAgKQogICAgICAgICgobnVsbCAo Y2FkciBzdGF0ZSkpCiAgICAgICAgIDs7IG91dHNpZGUgYW4gZXhwcmVzc2lvbiBhbGlnbiB0byB0 aGUgbGVmdCBjb2x1bW4KICAgICAgICAgMAogICAgICAgICApCiAgICAgICAgKChudWxsIGluZGVu dCkKICAgICAgICAgOzsgYW4gZW1wdHkgcGFyZXRoZXNpcwogICAgICAgICAoMSsgc3RhcnQtY29s KSkKICAgICAgICAoKGFuZCAoaW50ZWdlcnAgbGlzcC1pbmRlbnQtb2Zmc2V0KQogICAgICAgICAg ICAgIChpbnRlZ2VycCAoY2FkciBpbmRlbnQpKSkKICAgICAgICAgOzsgaW5kZW50IGJ5IGNvbnN0 YW50IG9mZnNldAogICAgICAgICAoKyAoY2FkciBpbmRlbnQpIGxpc3AtaW5kZW50LW9mZnNldCkK ICAgICAgICAgKQogICAgICAgICgobG9va2luZy1hdCAiXFxzPFxcczxcXHM8IikKICAgICAgICAg OzsgQ29tbWVudHMgdGhhdCBzdGFydCB3aXRoIHRocmVlIHNlbWljb2xvbnMgb3IgbW9yZSwgc2hv dWxkCiAgICAgICAgIDs7IHN0YXJ0IGF0IHRoZSBsZWZ0IG1hcmdpbgogICAgICAgICAwCiAgICAg ICAgICkKICAgICAgICAoKGVxIChjYXIgaW5kZW50KSA6bCkKICAgICAgICAgOzsgaW5kZW50IGJl bmVhdGggYSBsaXN0CiAgICAgICAgIChjYWRkciBpbmRlbnQpCiAgICAgICAgICkKICAgICAgICAg KChhbmQgKGVxIChjYXIgaW5kZW50KSA6dykKICAgICAgICAgICAgICAoc3RyaW5ncCAoY2FkciBp bmRlbnQpKQogICAgICAgICAgICAgICg+PSAobGVuZ3RoIChjYWRyIGluZGVudCkpIDMpCiAgICAg ICAgICAgICAgKHN0cmluZy1lcXVhbCAiZGVmIiAoc3Vic3RyaW5nIChjYWRyIGluZGVudCkgMCAz KSkpCiAgICAgICAgIDs7IGluZGVudCBhIGRlZi1mb3JtCiAgICAgICAgICgrIGxpc3AtYm9keS1p bmRlbnQgc3RhcnQtY29sKQogICAgICAgICApCiAgICAgICAgKChhbmQgKGVxIChjYXIgaW5kZW50 KSA6dykKICAgICAgICAgICAgICAod2hvbGVudW1wIChnZXQgKGludGVybi1zb2Z0IChjYWRyIGlu ZGVudCkpICdsaXNwLWluZGVudC1mdW5jdGlvbikpKQogICAgICAgICA7OyBoZXJlIHRoZXJlIGlz IGEgc3BlY2lhbCBmb3JtCiAgICAgICAgIChzZXRxIG9vIChvciAoZ2V0IChpbnRlcm4tc29mdCAo Y2FkciBpbmRlbnQpKSAnbGlzcC1pbmRlbnQtZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAg ICAoZ2V0IChpbnRlcm4tc29mdCAoY2FkciBpbmRlbnQpKSAnbGlzcC1pbmRlbnQtaG9vaykpKQog ICAgICAgICAoaWYgKD4gKGxlbmd0aCBpbmRlbnQpICgqIDMgb28pKQogICAgICAgICAgICAgKCsg bGlzcC1ib2R5LWluZGVudCBzdGFydC1jb2wpCiAgICAgICAgICAgKCsgKCogMiBsaXNwLWJvZHkt aW5kZW50KSBzdGFydC1jb2wpKQogICAgICAgICApCiAgICAgICAgKChhbmQgKGVxIChjYXIgaW5k ZW50KSA6dykKICAgICAgICAgICAgICAoZ2V0IChpbnRlcm4tc29mdCAoY2FkciBpbmRlbnQpKSAn bGlzcC1pbmRlbnQtaG9vaykKICAgICAgICAgICAgICBuaWwpCiAgICAgICAgIDs7IGluZGVudCBk ZWZpbmVkIGJ5IGFub3RoZXIgZnVuY3Rpb24KICAgICAgICAgOzsgbm90IGRlZmluZWQgeWV0CiAg ICAgICAgIChmdW5jYWxsIChnZXQgKGludGVybi1zb2Z0IChjYWRyIGluZGVudCkpICdsaXNwLWlu ZGVudC1ob29rKSkKICAgICAgICAgKQogICAgICAgICgoYW5kIChlcXVhbCAoZm9sbG93aW5nLWNo YXIpID86KQogICAgICAgICAgICAgIG5pbCkKICAgICAgICAgOzsgaW5kZW50IG9mIGEgY29uc3Rh bnQgc3ltYm9sCiAgICAgICAgIDs7IG5vdCB5ZWQgZGVmaW5lZAogICAgICAgICAoY2FkZHIgaW5k ZW50KQogICAgICAgICApCiAgICAgICAgKChhbmQgKGVxIChjYXIgaW5kZW50KSA6dykKICAgICAg ICAgICAgICAoPiAobGVuZ3RoIGluZGVudCkgMykpCiAgICAgICAgIDs7IGluZGVudCBiZW5lYXRo IHRoZSBgaW5kZW50LXdoYXQtYXJndW1lbnQnIHBhcmFtZXRlcgogICAgICAgICAoZWx0IGluZGVu dCAoKyAzICgxLSAoKiAzIGluZGVudC13aGF0LWFyZ3VtZW50KSkpKQogICAgICAgICApCiAgICAg ICAgKHQKICAgICAgICAgOzsgIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiBjYWxs CiAgICAgICAgIChjYWRkciBpbmRlbnQpKQogICAgICAgICApKQoKKGRlZnVuIGxpc3AtaW5kZW50 LXdoYXQtYXJndW1lbnQgbmlsCiAgKGNvbmQgKChhbmQgKGVxIChjYXIgaW5kZW50KSA6dykKICAg ICAgICAgICAgICAoc3RyaW5ncCAoY2FkciBpbmRlbnQpKQogICAgICAgICAgICAgICg+PSAobGVu Z3RoIChjYWRyIGluZGVudCkpIDMpCiAgICAgICAgICAgICAgKHN0cmluZy1lcXVhbCAiZGVmIiAo c3Vic3RyaW5nIChjYWRyIGluZGVudCkgMCAzKSkKICAgICAgICAgICAgICAoPSAobGVuZ3RoIGlu ZGVudCkgOSkpCiAgICAgICAgIDs7IGlmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIGRlZnVuIGlz IGEgbGlzdCwgdGhlbiB0aGlzIGxpc3QKICAgICAgICAgOzsgaXMgbm90IGEgZnVuY3Rpb24gY2Fs bAogICAgICAgICAwKQogICAgICAgICgob3IKICAgICAgICAgIChhbmQgKD49IChsZW5ndGggaW5k ZW50KSA2KQogICAgICAgICAgICAgICAoZXEgKGVsdCBpbmRlbnQgKC0gKGxlbmd0aCBpbmRlbnQg KSA2KSkgOnEpKQogICAgICAgICAgKGFuZCAoZXEgKGNhciBpbmRlbnQpIDp3KQogICAgICAgICAg ICAgICAoc3RyaW5ncCAoY2FkciBpbmRlbnQpKQogICAgICAgICAgICAgICAoc3RyaW5nLWVxdWFs ICJxdW90ZSIgKGNhZHIgaW5kZW50KSkpKQogICAgICAgICA7OyBhIHF1b3RlZCBsaXN0IGlzIG5v dCBhIGZ1bmN0aW9uIGNhbGwKICAgICAgICAgMAogICAgICAgICApCiAgICAgICAgKHQKICAgICAg ICAgOzsgZm9yIHRoZSByZXN0LCBhbHdheXMgaW5kZW50IGJlbmVhdGggdGhlIGZpcnN0IHBhcmFt ZXRlciBvZgogICAgICAgICA7OyB0aGUgZnVuY3Rpb24uLi4KICAgICAgICAgMSkpKQoKKGRlZnVu IGxpc3AtaW5kZW50LW5leHQtc3RhdGUgKCZvcHRpb25hbCBuKQogIChwYXJzZS1wYXJ0aWFsLXNl eHAgKHBvaW50KSAoKyAob3IgbiAxKSAocG9pbnQpKSAoKSAoKSBzdGF0ZSkpCgooZGVmdW4gbGlz cC1pbmRlbnQtYXV0b21hdG9uICgmb3B0aW9uYWwgZW5kIHN0YXRlIGluZGVudC13aGF0LWFyZ3Vt ZW50IHN0YXJ0LWNvbCkKICAiCiAgIGFuIGF1dG9tYXRvbiB0byBpbmRlbnQgdGhlIGxpc3AgY29k ZQogICBWRVJTSU9OOiBORVcKICAiCiAgKGxldCAoCiAgICAgICAgaW5kZW50CiAgICAgICAgaW5k ZW50LW5leHQtbGluZS10bwogICAgICAgICkKICAgIChvciBlbmQgKGJlZ2lubmluZy1vZi1saW5l KSAoc2V0cSBlbmQgKHBvaW50KSkpCiAgICAob3IgaW5kZW50LXdoYXQtYXJndW1lbnQKICAgICAg ICAoc2V0cSBpbmRlbnQtd2hhdC1hcmd1bWVudCAwKSkKICAgIChvciBzdGF0ZSAoYmVnaW5uaW5n LW9mLWRlZnVuKSkKICAgIChhbmQgKG51bGwgc3RhcnQtY29sKSAoc2V0cSBzdGFydC1jb2wgMCkp CiAgICAoY2F0Y2ggJ1NUT1AKICAgICAgKHdoaWxlICg8IChwb2ludCkgZW5kKQogICAgICAgIChj b25kICgoYW5kIChlbHQgc3RhdGUgOCkKICAgICAgICAgICAgICAgICAgICAobm90IChlbHQgc3Rh dGUgNCkpKQogICAgICAgICAgICAgICA7OyBpbnNpZGUgYSBzdHJpbmcKICAgICAgICAgICAgICAg KGFuZCAobG9va2luZy1hdCAiXFxzPiIpCiAgICAgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50 LWxpbmVzIChjb25zIChsaXNwLWluZGVudC12YWx1ZSkgaW5kZW50LWxpbmVzKSkpCiAgICAgICAg ICAgICAgIChzZXRxIHN0YXRlIChsaXNwLWluZGVudC1uZXh0LXN0YXRlKSkKICAgICAgICAgICAg ICAgKQogICAgICAgICAgICAgICgobG9va2luZy1hdCAiXFxzXCIiKQogICAgICAgICAgICAgICA7 OyB0aGUgc3RhcnQgb2YgYSBzdHJpbmcKICAgICAgICAgICAgICAgKHNldHEgaW5kZW50IChhcHBl bmQgaW5kZW50IChsaXN0IDpzICgpIChjdXJyZW50LWNvbHVtbikpKQogICAgICAgICAgICAgICAg ICAgICBzdGF0ZSAobGlzcC1pbmRlbnQtbmV4dC1zdGF0ZSkpCiAgICAgICAgICAgICAgICkKICAg ICAgICAgICAgICAoKGxvb2tpbmctYXQgIlxcc1woIikKICAgICAgICAgICAgICAgOzsgb3BlbiBh IHBhcmVudGhlc2lzCiAgICAgICAgICAgICAgIChsZXQgKChjb2wgKGlmIGluZGVudC1saW5lcwog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAoY3VycmVudC1jb2x1bW4pICgtIChjYWFy IGluZGVudC1saW5lcykgKGNkYXIgaW5kZW50LWxpbmVzKSkpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY3VycmVudC1jb2x1bW4pKSkpCiAgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50 IChhcHBlbmQgaW5kZW50IChsaXN0IDpsICgpIGNvbCkpCiAgICAgICAgICAgICAgICAgICAgICAg c3RhdGUgKGxpc3AtaW5kZW50LWF1dG9tYXRvbiBlbmQgKGxpc3AtaW5kZW50LW5leHQtc3RhdGUp CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlz cC1pbmRlbnQtd2hhdC1hcmd1bWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbCkpKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgICAg KChsb29raW5nLWF0ICJcXHNcKSIpCiAgICAgICAgICAgICAgIDs7IGNsb3NlIGEgcGFyZW50aGVz aXMKICAgICAgICAgICAgICAgKHRocm93ICdTVE9QIChsaXNwLWluZGVudC1uZXh0LXN0YXRlKSkK ICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICgobG9va2luZy1hdCAiXFxzICIpCiAgICAg ICAgICAgICAgIDs7IHNwYWNlcyBhcmUgaWdub3JlZAogICAgICAgICAgICAgICAod2hpbGUgKGxv b2tpbmctYXQgIltbOmJsYW5rOl1dIikKICAgICAgICAgICAgICAgICAoc2V0cSBzdGF0ZSAobGlz cC1pbmRlbnQtbmV4dC1zdGF0ZSkpKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgKChs b29raW5nLWF0ICJcXHN3XFx8XFxzXyIpCiAgICAgICAgICAgICAgIDs7IGEgZnVuY3Rpb24gb3Ig YSBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgKGxldCogKChjb2wgKGlmIGluZGVudC1saW5lcwog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAoY3VycmVudC1jb2x1bW4pICgtIChjYWFy IGluZGVudC1saW5lcykgKGNkYXIgaW5kZW50LWxpbmVzKSkpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY3VycmVudC1jb2x1bW4pKSkKICAgICAgICAgICAgICAgICAgICAgIHIKICAgICAg ICAgICAgICAgICAgICAgICh3IChjYXRjaCAnV09SRAogICAgICAgICAgICAgICAgICAgICAgICAg ICAod2hpbGUgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHIgKGNvbmNhdCBy IChzdHJpbmcgKGZvbGxvd2luZy1jaGFyKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg IChzZXRxIHN0YXRlIChsaXNwLWluZGVudC1uZXh0LXN0YXRlKSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoYW5kIChub3QgKGxvb2tpbmctYXQgIlxcd1xcfFxcc18iKSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJvdyAnV09SRCByKSkpKSkpCiAgICAgICAgICAg ICAgICAgKHNldHEgaW5kZW50IChhcHBlbmQgaW5kZW50IChsaXN0IDp3IHcgY29sKSkpKQogICAg ICAgICAgICAgICApCiAgICAgICAgICAgICAgKChsb29raW5nLWF0ICJcXHM8IikKICAgICAgICAg ICAgICAgOzsgc3RhcnQgb2YgYSBjb21tZW50CiAgICAgICAgICAgICAgICh3aGlsZSAobm90IChs b29raW5nLWF0ICJcXHM+IikpCiAgICAgICAgICAgICAgICAgKHNldHEgc3RhdGUgKGxpc3AtaW5k ZW50LW5leHQtc3RhdGUpKSkKICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICgobG9va2lu Zy1hdCAiXFxzXCciKQogICAgICAgICAgICAgICA7OyBxdW90ZQogICAgICAgICAgICAgICAoc2V0 cSBpbmRlbnQgKGFwcGVuZCBpbmRlbnQgKGxpc3QgOnEgKCkgKGN1cnJlbnQtY29sdW1uKSkpKQog ICAgICAgICAgICAgICAoc2V0cSBzdGF0ZSAobGlzcC1pbmRlbnQtbmV4dC1zdGF0ZSkpCiAgICAg ICAgICAgICAgICkKICAgICAgICAgICAgICAoKGxvb2tpbmctYXQgIlxcc1xcIikKICAgICAgICAg ICAgICAgOzsgYSBzcGVjaWFsIGNoYXJhY3RlcgogICAgICAgICAgICAgICAoc2V0cSBzdGF0ZSAo bGlzcC1pbmRlbnQtbmV4dC1zdGF0ZSAyKSkKICAgICAgICAgICAgICAgKQogICAgICAgICAgICAg ICgobG9va2luZy1hdCAiXFxzPiIpCiAgICAgICAgICAgICAgIDs7IGVuZCBvZiBsaW5lCiAgICAg ICAgICAgICAgIChzZXRxIHN0YXRlIChsaXNwLWluZGVudC1uZXh0LXN0YXRlKSkKICAgICAgICAg ICAgICAgKHdoaWxlIChsb29raW5nLWF0ICJcXHMgIikKICAgICAgICAgICAgICAgICAoc2V0cSBz dGF0ZSAobGlzcC1pbmRlbnQtbmV4dC1zdGF0ZSkpKQogICAgICAgICAgICAgICAoc2V0cSBpbmRl bnQtbGluZXMgKGNvbnMgKGNvbnMgKGxpc3AtaW5kZW50LXZhbHVlKSAoY3VycmVudC1jb2x1bW4p KSBpbmRlbnQtbGluZXMpKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgKHQKICAgICAg ICAgICAgICAgKGVycm9yICJvb3BzISB1bmtub3duIGNsYXNzIG9mIHN5bnRheCAhIChpbmRlbnQg ZmFpbGVkIGF0IHBvc2l0aW9uICVkKSIgKHBvaW50KSkpKSkpKSkKCihkZWZ1biBpbmRlbnQtZGVm dW4tZXhhbXBsZSBuaWwKICAiCiAgQW4gZXhhbXBsZSBob3cgdG8gdXNlIHRoZSBhdXRvbWF0b25p biBmb3IgaW5kZW50aWcgYSB3aG9sZSByZWdpb24KICBvZiBsaXNwIGNvZGUgaW4gbGluZWFyIHRp bWUgKGEgZnVuY3Rpb24gZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHRoZSBwb2ludCkuCiAgIgogIChs ZXQqIChpbmRlbnQtbGluZXMKICAgICAgICAgc3RhdGUgCiAgICAgICAgIGwpCiAgICAoc2F2ZS1l eGN1cnNpb24KICAgICAgKGxpc3AtaW5kZW50LWF1dG9tYXRvbikKICAgICAgKGRvbGlzdCAoaSBp bmRlbnQtbGluZXMpCiAgICAgICAgKHdoZW4gKGNvbnNwIGkpCiAgICAgICAgICAoc2V0cSBsIChw cm9nMiAoYmVnaW5uaW5nLW9mLWxpbmUpIChwb2ludCkpKQogICAgICAgICAgKHNraXAtY2hhcnMt Zm9yd2FyZCAiW1s6Ymxhbms6XV0iKQogICAgICAgICAgKHdoZW4gKG5vdCAoemVyb3AgKC0gICgt IGwgKHBvaW50KSkgKC0gKGNkciBpKSAoY2FyIGkpKSkpKQogICAgICAgICAgICAoZGVsZXRlLXJl Z2lvbiBsIChwb2ludCkpCiAgICAgICAgICAgIChpbmRlbnQtdG8gKGNhciBpKSkpKQogICAgICAg IChwcmV2aW91cy1saW5lKSkpKSkKCihkZWZ1biBpbmRlbnQtbGluZS1leGFtcGxlIG5pbAogICIK ICBBbiBleGFtcGxlIGhvdyB0byBpbmRlbnQgYSBsaW5lIG9mIGNvZGUgdXNpbmcgdGhlIGF1dG9t YXRvbgogICIKICAobGV0KiAoaW5kZW50LWxpbmVzCiAgICAgICAgIHN0YXRlIAogICAgICAgICBk aWYKICAgICAgICAgKHBvcyAocG9pbnQtbWFya2VyKSkKICAgICAgICAgKGwgKHByb2cyIChiZWdp bm5pbmctb2YtbGluZSkgKHBvaW50KSkpKQogICAgKHNhdmUtZXhjdXJzaW9uIChsaXNwLWluZGVu dC1hdXRvbWF0b24pKQogICAgKGlmIChub3QgKGNvbnNwIChjYXIgaW5kZW50LWxpbmVzKSkpCiAg ICAgICAgbmlsCiAgICAgIChzZXRxIGRpZgogICAgICAgICAgICAoY2F0Y2ggJ0RJRgogICAgICAg ICAgICAgIChkb2xpc3QgKGkgKGNkciBpbmRlbnQtbGluZXMpKQogICAgICAgICAgICAgICAgKGFu ZCAoY29uc3AgaSkKICAgICAgICAgICAgICAgICAgICAgKHRocm93ICdESUYgKC0gKGNkciBpKSAo Y2FyIGkpKSkpKSkpCiAgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIltbOmJsYW5rOl1dIikKICAg ICAgKHdoZW4gKG5vdCAoemVyb3AgKC0gKCsgKGNhYXIgaW5kZW50LWxpbmVzKSBkaWYpICgtIChw b2ludCkgbCkpKSkKICAgICAgICAoZGVsZXRlLXJlZ2lvbiBsIChwb2ludCkpCiAgICAgICAgKGlu ZGVudC10byAoKyAoY2FhciBpbmRlbnQtbGluZXMpIGRpZikpCiAgICAgICAgKGdvdG8tY2hhciAo bWF4IHBvcyAocG9pbnQpKSkpKSkpCgoKCg== ------=_Part_15351_28664559.1214879099433--