From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= Newsgroups: gmane.emacs.devel Subject: Re: Imports / inclusion of s.el into Emacs Date: Sat, 9 May 2020 19:37:37 +0100 Message-ID: References: <0c88192c-3c33-46ed-95cb-b4c6928016e3@default> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000002671d005a53b6934" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="83455"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel To: Richard Stallman Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat May 09 20:38:45 2020 Return-path: Envelope-to: ged-emacs-devel@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 1jXUN2-000LWu-KP for ged-emacs-devel@m.gmane-mx.org; Sat, 09 May 2020 20:38:45 +0200 Original-Received: from localhost ([::1]:53444 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jXUN1-0001rW-5r for ged-emacs-devel@m.gmane-mx.org; Sat, 09 May 2020 14:38:43 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:41774) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jXUMD-0000BR-LG for emacs-devel@gnu.org; Sat, 09 May 2020 14:37:53 -0400 Original-Received: from mail-il1-x12f.google.com ([2607:f8b0:4864:20::12f]:34006) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jXUMB-0006fr-9S; Sat, 09 May 2020 14:37:53 -0400 Original-Received: by mail-il1-x12f.google.com with SMTP id w6so4579310ilg.1; Sat, 09 May 2020 11:37:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=QjG8MSVQu5ztuws391qOqQJTFv5SB4rQ3MyNW9RxVjs=; b=XnnRUN+jOZpMqf6DN5BBiQdLKvxZ6fp0oMM2v4XBp1tyYk37PdKKQDcVNuI2IvDvWT AMijz4LQh8/oHn94HbDyLNqEjz+0NfPSdELzUVzLBaE/8RKNuOf83PZqpeYfZYRUZWr7 rR+zTHoQT/+RSxQu78UaPCfw20MQncFN5A0fUkxeLJF8qli59PEvfgkrm7WHCTSLcVys DkjESBhILZhjxPHFKIDPl+4I/DSLeZV0DWAhuy67Uw7wLuWGbSub0Yx6WbSNcxLJrsGT mAyxbJmbtWg4BPf2bUP4e2Dfb8TBrGSI9vVNHPTr0LZMd/QznJ2W8/EmzYmTWfytGGox MCuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=QjG8MSVQu5ztuws391qOqQJTFv5SB4rQ3MyNW9RxVjs=; b=Uiogoe1kjpfUwwvEbvhy98webPkMVLAjDFwUbayzcPeMtB7MoIOO/8/IpZgSajDHD4 2d64wM2lzxZL53W6IYYHZCPlNqHjtz07n/VTR1QieCsBHtKvmvBz8m4ehePAGU5rj/4A 06G/2soPfPvLvQbP7snEfg2QSxeMB286pFcWElQLtQCOPpvEvlIg9JeKAdG4NOOsRow/ zhfNd6DYPnFs19wJ9MpppvQm6/ABNGLI7+EhEFp4f58VLnATr3g2fPkCbnORTBHFimuq sscqf2ZRshH76f7nK35lWECXg6+2Cn3KKUPUznJLeGv9xSguCbWYJhqjMib04E0j4GaH PvZA== X-Gm-Message-State: AGi0PuaSqEWpwpYuBFGy5JJ2UemndIHag7fq/bY0kJj7btdLifb3YK7W CFYMIJoQUTAkl3FTA0pK5lqvg7VCK/xwJEkzu09lAXwg X-Google-Smtp-Source: APiQypLEJv9rjHe6HLR80H+ic6LcQsM6GHX5laNg1ab5QC6FktDtBcd2BT59kXZiW2BBxn3QOcrXmJP8/Xx496oxJGE= X-Received: by 2002:a92:7e86:: with SMTP id q6mr9179808ill.9.1589049469308; Sat, 09 May 2020 11:37:49 -0700 (PDT) In-Reply-To: Received-SPF: pass client-ip=2607:f8b0:4864:20::12f; envelope-from=joaotavora@gmail.com; helo=mail-il1-x12f.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, FROM_EXCESS_BASE64=0.979, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:249544 Archived-At: --0000000000002671d005a53b6934 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, May 8, 2020 at 3:49 AM Richard Stallman wrote: > Thank you for taking back that word. It hurt my feelings. My apologies, again > Or perhaps "Would have a significant drawback"? That I can agree with > you about. Still, it may be the best choice available under the > circumstances. I agree. Under the current circumstances. But we can work to change the circumstances. > was never to use it nontrivially. Thus I decided, when writing Emacs > Lisp to, to avoid conflicts by means of name prefixes, and not have > packages at all. > However, the state of the art may have advanced since then. It has indeed evolved since the 1980's. Most implementations of Common Lisp now have something called "package local nicknames", which many find advantageous. There are proponents and adversaries. I'm one of the proponents, and if you wish I can sing you the joys of the CL package system. But that can be for later. Currently, I count around 7 different implementations and even more vapourware. The debate over which to choose is likely to be very lengthy. In the end we can even choose more than one system. But we should keep our eyes on the prize, as they say, and resolve the s.el and dash.el (and also f.el) situation in the shorter term, so that those free programs can join our ranks without hurting us, our existing users, or their existing users. > This week you said there was a kind of namespace system for Lisp that > works well and avoids those problems. If that is true, it could be a > good solution. Indeed I said so: I was referring to a simple shorthand system. In this system, there are no profound changes to how symbols are organized in Emacs. Things can have different names in different contexts, much as "RMS" means something different in Electrical Engineering or in this mailing list. > Another obstacle for my reading those messages was that you were > responding to other people's questions, which were not the same > questions that I need to understand. > > Can you show me programmer's intro to using a package system of the > sort you're advocating? I think I could tell what I need to know from > that. Yes, that's a good idea. So our goal is to use the problematic s.el library without having it pollute our namespace, right? To do that, we first load the library shorthand.el (attached to this message) into our Emacs. Then, we must change s.el minimally. Its contents are (very truncanted): ;;; s.el --- The long lost Emacs string manipulation library. ;; Author: Magnar Sveen (defun s-collapse-whitespace (s) "Convert all adjacent whitespace characters to a single space." ...) (defun s-lines (s) "Splits S into a list of strings on newline characters." ...) (provide 's) ;;; s.el ends here, We need to ask the author to add a few lines to the end of the file and maybe also change the file name: ;;; magnar-string.el --- Now with 99% less namespace pain (defun s-collapse-whitespace (s) ...) (defun s-lines (s) ...) (provide 'magnar-string) ;;; magnar-string.el ends here, ;; Local Variables: ;; shorthand-shorthands: (("^s-" . "magnar-string-")) ;; End: Theoretically, we could avoid this step altogether and "guess" the shorthand from a list of known problematic cases. Now, Richard, when you load the new magnar-string.el file into your Emacs namespace won't be polluted with those two names. Instead, the the two symbols will be called `magnar-string-lines' and `magnar-string-collapse-whitespace'. In your hypothetical "foobarbaz.el" you can now: (require 'magnar-string) (defun f-test () (interactive) (message (cadr (s-lines "this\nworks")))) ;; Local Variables: ;; shorthand-shorthands: (("^s-" . "magnar-string-") ("^f" . "foobarfaz"= )) ;; End: Again, by loading foobarbaz.el you will have created the function `foobarbaz-test', despite having typed `f-test'. > After that, would you be willing to talk with me by voice so I can > understand enough to see whether this is a good solution? Yes. What voice system do you prefer? I live in GMT, btw. Jo=C3=A3o PS: I attach to this message the shorthand.el file mentioned above, followed by the modified magnar-string.el. Please note that shorthand.el is EXPERIMENTAL. If you want to try it, you should read it beforehand (it's less than 50 lines) and load it into a separate Emacs. --0000000000002671d005a53b6934 Content-Type: text/x-emacs-lisp; charset="UTF-8"; name="magnar-string.el" Content-Disposition: attachment; filename="magnar-string.el" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_k9zyo0g51 Ozs7IG1hZ25hci1zdHJpbmcuZWwgLS0tIEZvcm1lcmx5IHMuZWwsIG5vdyB3aXRoIDk5JSBsZXNz IG5hbWVzcGFjZSBwYWluIQoKOzsgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgTWFnbmFyIFN2ZWVu Cgo7OyBBdXRob3I6IE1hZ25hciBTdmVlbiA8bWFnbmFyc0BnbWFpbC5jb20+Cjs7IEhhY2tlZC1i eTogSm/Do28gVMOhdm9yYSA8am9hb3Rhdm9yYUBnbWFpbC5jb20+Cjs7IFZlcnNpb246IDEuMTIu MC14eHgKOzsgS2V5d29yZHM6IHN0cmluZ3MKCjs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cjs7IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 Cjs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhl IExpY2Vuc2UsIG9yCjs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJ ZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVudGFy eToKCjs7IFRoZSBsb25nIGxvc3QgRW1hY3Mgc3RyaW5nIG1hbmlwdWxhdGlvbiBsaWJyYXJ5LAo7 OyBub3cgd2l0aCA5OSUgbGVzcyBuYW1lc3BhY2UgcGFpbiEKOzsKOzsgU2VlIGRvY3VtZW50YXRp b24gb24gaHR0cHM6Ly9naXRodWIuY29tL21hZ25hcnMvcy5lbCNmdW5jdGlvbnMKCjs7OyBDb2Rl OgoKOzsgU2lsZW5jZSBieXRlLWNvbXBpbGVyCihkZWZ2YXIgdWNzLW5vcm1hbGl6ZS1jb21iaW5p bmctY2hhcnMpICA7IERlZmluZWQgaW4gYHVjcy1ub3JtYWxpemUnCihhdXRvbG9hZCAnc2xvdC12 YWx1ZSAiZWllaW8iKQoKKGRlZnVuIHMtdHJpbS1sZWZ0IChzKQogICJSZW1vdmUgd2hpdGVzcGFj ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVj dC1mcmVlIHQpKQogIChzYXZlLW1hdGNoLWRhdGEKICAgIChpZiAoc3RyaW5nLW1hdGNoICJcXGBb IFx0XG5ccl0rIiBzKQogICAgICAgIChyZXBsYWNlLW1hdGNoICIiIHQgdCBzKQogICAgICBzKSkp CgooZGVmdW4gcy10cmltLXJpZ2h0IChzKQogICJSZW1vdmUgd2hpdGVzcGFjZSBhdCB0aGUgZW5k IG9mIFMuIgogIChzYXZlLW1hdGNoLWRhdGEKICAgIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVm ZmVjdC1mcmVlIHQpKQogICAgKGlmIChzdHJpbmctbWF0Y2ggIlsgXHRcblxyXStcXCciIHMpCiAg ICAgICAgKHJlcGxhY2UtbWF0Y2ggIiIgdCB0IHMpCiAgICAgIHMpKSkKCihkZWZ1biBzLXRyaW0g KHMpCiAgIlJlbW92ZSB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBTLiIK ICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAocy10cmltLWxlZnQg KHMtdHJpbS1yaWdodCBzKSkpCgooZGVmdW4gcy1jb2xsYXBzZS13aGl0ZXNwYWNlIChzKQogICJD b252ZXJ0IGFsbCBhZGphY2VudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYSBzaW5nbGUgc3Bh Y2UuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChyZXBsYWNl LXJlZ2V4cC1pbi1zdHJpbmcgIlsgXHRcblxyXSsiICIgIiBzKSkKCihkZWZ1biBzLXNwbGl0IChz ZXBhcmF0b3IgcyAmb3B0aW9uYWwgb21pdC1udWxscykKICAiU3BsaXQgUyBpbnRvIHN1YnN0cmlu Z3MgYm91bmRlZCBieSBtYXRjaGVzIGZvciByZWdleHAgU0VQQVJBVE9SLgpJZiBPTUlULU5VTExT IGlzIG5vbi1uaWwsIHplcm8tbGVuZ3RoIHN1YnN0cmluZ3MgYXJlIG9taXR0ZWQuCgpUaGlzIGlz IGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBidWlsdC1pbiBgc3BsaXQtc3RyaW5nJy4iCiAg KGRlY2xhcmUgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHNhdmUtbWF0Y2gtZGF0YQogICAgKHNw bGl0LXN0cmluZyBzIHNlcGFyYXRvciBvbWl0LW51bGxzKSkpCgooZGVmdW4gcy1zcGxpdC11cC10 byAoc2VwYXJhdG9yIHMgbiAmb3B0aW9uYWwgb21pdC1udWxscykKICAiU3BsaXQgUyB1cCB0byBO IHRpbWVzIGludG8gc3Vic3RyaW5ncyBib3VuZGVkIGJ5IG1hdGNoZXMgZm9yIHJlZ2V4cCBTRVBB UkFUT1IuCgpJZiBPTUlULU5VTExTIGlzIG5vbi1uaWwsIHplcm8tbGVuZ3RoIHN1YnN0cmluZ3Mg YXJlIG9taXR0ZWQuCgpTZWUgYWxzbyBgcy1zcGxpdCcuIgogIChkZWNsYXJlIChzaWRlLWVmZmVj dC1mcmVlIHQpKQogIChzYXZlLW1hdGNoLWRhdGEKICAgIChsZXQgKChvcCAwKQogICAgICAgICAg KHIgbmlsKSkKICAgICAgKHdpdGgtdGVtcC1idWZmZXIKICAgICAgICAoaW5zZXJ0IHMpCiAgICAg ICAgKHNldHEgb3AgKGdvdG8tY2hhciAocG9pbnQtbWluKSkpCiAgICAgICAgKHdoaWxlIChhbmQg KHJlLXNlYXJjaC1mb3J3YXJkIHNlcGFyYXRvciBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAo PCAwIG4pKQogICAgICAgICAgKGxldCAoKHN1YiAoYnVmZmVyLXN1YnN0cmluZyBvcCAobWF0Y2gt YmVnaW5uaW5nIDApKSkpCiAgICAgICAgICAgICh1bmxlc3MgKGFuZCBvbWl0LW51bGxzCiAgICAg ICAgICAgICAgICAgICAgICAgICAoZXF1YWwgc3ViICIiKSkKICAgICAgICAgICAgICAocHVzaCBz dWIgcikpKQogICAgICAgICAgKHNldHEgb3AgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKICAg ICAgICAgIChzZXRxIG4gKDEtIG4pKSkKICAgICAgICAobGV0ICgoc3ViIChidWZmZXItc3Vic3Ry aW5nIG9wIChwb2ludC1tYXgpKSkpCiAgICAgICAgICAodW5sZXNzIChhbmQgb21pdC1udWxscwog ICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCBzdWIgIiIpKQogICAgICAgICAgICAocHVzaCBz dWIgcikpKSkKICAgICAgKG5yZXZlcnNlIHIpKSkpCgooZGVmdW4gcy1saW5lcyAocykKICAiU3Bs aXRzIFMgaW50byBhIGxpc3Qgb2Ygc3RyaW5ncyBvbiBuZXdsaW5lIGNoYXJhY3RlcnMuIgogIChk ZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChzLXNwbGl0ICJcXChcclxu XFx8W1xuXHJdXFwpIiBzKSkKCihkZWZ1biBzLWpvaW4gKHNlcGFyYXRvciBzdHJpbmdzKQogICJK b2luIGFsbCB0aGUgc3RyaW5ncyBpbiBTVFJJTkdTIHdpdGggU0VQQVJBVE9SIGluIGJldHdlZW4u IgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChtYXBjb25jYXQg J2lkZW50aXR5IHN0cmluZ3Mgc2VwYXJhdG9yKSkKCihkZWZ1biBzLWNvbmNhdCAoJnJlc3Qgc3Ry aW5ncykKICAiSm9pbiBhbGwgdGhlIHN0cmluZyBhcmd1bWVudHMgaW50byBvbmUgc3RyaW5nLiIK ICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAoYXBwbHkgJ2NvbmNh dCBzdHJpbmdzKSkKCihkZWZ1biBzLXByZXBlbmQgKHByZWZpeCBzKQogICJDb25jYXRlbmF0ZSBQ UkVGSVggYW5kIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQog IChjb25jYXQgcHJlZml4IHMpKQoKKGRlZnVuIHMtYXBwZW5kIChzdWZmaXggcykKICAiQ29uY2F0 ZW5hdGUgUyBhbmQgU1VGRklYLiIKICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJl ZSB0KSkKICAoY29uY2F0IHMgc3VmZml4KSkKCihkZWZ1biBzLXJlcGVhdCAobnVtIHMpCiAgIk1h a2UgYSBzdHJpbmcgb2YgUyByZXBlYXRlZCBOVU0gdGltZXMuIgogIChkZWNsYXJlIChwdXJlIHQp IChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQgKHNzKQogICAgKHdoaWxlICg+IG51bSAwKQog ICAgICAoc2V0cSBzcyAoY29ucyBzIHNzKSkKICAgICAgKHNldHEgbnVtICgxLSBudW0pKSkKICAg IChhcHBseSAnY29uY2F0IHNzKSkpCgooZGVmdW4gcy1jaG9wLXN1ZmZpeCAoc3VmZml4IHMpCiAg IlJlbW92ZSBTVUZGSVggaWYgaXQgaXMgYXQgZW5kIG9mIFMuIgogIChkZWNsYXJlIChwdXJlIHQp IChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQgKChwb3MgKC0gKGxlbmd0aCBzdWZmaXgpKSkp CiAgICAoaWYgKGFuZCAoPj0gKGxlbmd0aCBzKSAobGVuZ3RoIHN1ZmZpeCkpCiAgICAgICAgICAg ICAoc3RyaW5nPSBzdWZmaXggKHN1YnN0cmluZyBzIHBvcykpKQogICAgICAgIChzdWJzdHJpbmcg cyAwIHBvcykKICAgICAgcykpKQoKKGRlZnVuIHMtY2hvcC1zdWZmaXhlcyAoc3VmZml4ZXMgcykK ICAiUmVtb3ZlIFNVRkZJWEVTIG9uZSBieSBvbmUgaW4gb3JkZXIsIGlmIHRoZXkgYXJlIGF0IHRo ZSBlbmQgb2YgUy4iCiAgKGRlY2xhcmUgKHB1cmUgdCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAg KHdoaWxlIHN1ZmZpeGVzCiAgICAoc2V0cSBzIChzLWNob3Atc3VmZml4IChjYXIgc3VmZml4ZXMp IHMpKQogICAgKHNldHEgc3VmZml4ZXMgKGNkciBzdWZmaXhlcykpKQogIHMpCgooZGVmdW4gcy1j aG9wLXByZWZpeCAocHJlZml4IHMpCiAgIlJlbW92ZSBQUkVGSVggaWYgaXQgaXMgYXQgdGhlIHN0 YXJ0IG9mIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChs ZXQgKChwb3MgKGxlbmd0aCBwcmVmaXgpKSkKICAgIChpZiAoYW5kICg+PSAobGVuZ3RoIHMpIChs ZW5ndGggcHJlZml4KSkKICAgICAgICAgICAgIChzdHJpbmc9IHByZWZpeCAoc3Vic3RyaW5nIHMg MCBwb3MpKSkKICAgICAgICAoc3Vic3RyaW5nIHMgcG9zKQogICAgICBzKSkpCgooZGVmdW4gcy1j aG9wLXByZWZpeGVzIChwcmVmaXhlcyBzKQogICJSZW1vdmUgUFJFRklYRVMgb25lIGJ5IG9uZSBp biBvcmRlciwgaWYgdGhleSBhcmUgYXQgdGhlIHN0YXJ0IG9mIFMuIgogIChkZWNsYXJlIChwdXJl IHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogICh3aGlsZSBwcmVmaXhlcwogICAgKHNldHEgcyAo cy1jaG9wLXByZWZpeCAoY2FyIHByZWZpeGVzKSBzKSkKICAgIChzZXRxIHByZWZpeGVzIChjZHIg cHJlZml4ZXMpKSkKICBzKQoKKGRlZnVuIHMtc2hhcmVkLXN0YXJ0IChzMSBzMikKICAiUmV0dXJu cyB0aGUgbG9uZ2VzdCBwcmVmaXggUzEgYW5kIFMyIGhhdmUgaW4gY29tbW9uLiIKICAoZGVjbGFy ZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAobGV0ICgoc2VhcmNoLWxlbmd0aCAo bWluIChsZW5ndGggczEpIChsZW5ndGggczIpKSkKICAgICAgICAoaSAwKSkKICAgICh3aGlsZSAo YW5kICg8IGkgc2VhcmNoLWxlbmd0aCkKICAgICAgICAgICAgICAgICg9IChhcmVmIHMxIGkpIChh cmVmIHMyIGkpKSkKICAgICAgKHNldHEgaSAoMSsgaSkpKQogICAgKHN1YnN0cmluZyBzMSAwIGkp KSkKCihkZWZ1biBzLXNoYXJlZC1lbmQgKHMxIHMyKQogICJSZXR1cm5zIHRoZSBsb25nZXN0IHN1 ZmZpeCBTMSBhbmQgUzIgaGF2ZSBpbiBjb21tb24uIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRl LWVmZmVjdC1mcmVlIHQpKQogIChsZXQqICgobDEgKGxlbmd0aCBzMSkpCiAgICAgICAgIChsMiAo bGVuZ3RoIHMyKSkKICAgICAgICAgKHNlYXJjaC1sZW5ndGggKG1pbiBsMSBsMikpCiAgICAgICAg IChpIDApKQogICAgKHdoaWxlIChhbmQgKDwgaSBzZWFyY2gtbGVuZ3RoKQogICAgICAgICAgICAg ICAgKD0gKGFyZWYgczEgKC0gbDEgaSAxKSkgKGFyZWYgczIgKC0gbDIgaSAxKSkpKQogICAgICAo c2V0cSBpICgxKyBpKSkpCiAgICA7OyBJZiBJIGlzIDAsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGVy ZSdzIG5vIGNvbW1vbiBzdWZmaXggYmV0d2VlbgogICAgOzsgUzEgYW5kIFMyLgogICAgOzsKICAg IDs7IEhvd2V2ZXIsIHNpbmNlIChzdWJzdHJpbmcgcyAoLSAwKSkgd2lsbCByZXR1cm4gdGhlIHdo b2xlCiAgICA7OyBzdHJpbmcsIGBzLXNoYXJlZC1lbmQnIHNob3VsZCBzaW1wbHkgcmV0dXJuIHRo ZSBlbXB0eSBzdHJpbmcKICAgIDs7IHdoZW4gSSBpcyAwLgogICAgKGlmICh6ZXJvcCBpKQogICAg ICAgICIiCiAgICAgIChzdWJzdHJpbmcgczEgKC0gaSkpKSkpCgooZGVmdW4gcy1jaG9tcCAocykK ICAiUmVtb3ZlIG9uZSB0cmFpbGluZyBgXFxuYCwgYFxccmAgb3IgYFxcclxcbmAgZnJvbSBTLiIK ICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAocy1jaG9wLXN1ZmZp eGVzICcoIlxuIiAiXHIiKSBzKSkKCihkZWZ1biBzLXRydW5jYXRlIChsZW4gcyAmb3B0aW9uYWwg ZWxsaXBzaXMpCiAgIklmIFMgaXMgbG9uZ2VyIHRoYW4gTEVOLCBjdXQgaXQgZG93biBhbmQgYWRk IEVMTElQU0lTIHRvIHRoZSBlbmQuCgpUaGUgcmVzdWx0aW5nIHN0cmluZywgaW5jbHVkaW5nIGVs bGlwc2lzLCB3aWxsIGJlIExFTiBjaGFyYWN0ZXJzCmxvbmcuCgpXaGVuIG5vdCBzcGVjaWZpZWQs IEVMTElQU0lTIGRlZmF1bHRzIHRvIOKAmC4uLuKAmS4iCiAgKGRlY2xhcmUgKHB1cmUgdCkgKHNp ZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHVubGVzcyBlbGxpcHNpcwogICAgKHNldHEgZWxsaXBzaXMg Ii4uLiIpKQogIChpZiAoPiAobGVuZ3RoIHMpIGxlbikKICAgICAgKGZvcm1hdCAiJXMlcyIgKHN1 YnN0cmluZyBzIDAgKC0gbGVuIChsZW5ndGggZWxsaXBzaXMpKSkgZWxsaXBzaXMpCiAgICBzKSkK CihkZWZ1biBzLXdvcmQtd3JhcCAobGVuIHMpCiAgIklmIFMgaXMgbG9uZ2VyIHRoYW4gTEVOLCB3 cmFwIHRoZSB3b3JkcyB3aXRoIG5ld2xpbmVzLiIKICAoZGVjbGFyZSAoc2lkZS1lZmZlY3QtZnJl ZSB0KSkKICAoc2F2ZS1tYXRjaC1kYXRhCiAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAoaW5z ZXJ0IHMpCiAgICAgIChsZXQgKChmaWxsLWNvbHVtbiBsZW4pKQogICAgICAgIChmaWxsLXJlZ2lv biAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkpCiAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2lu dC1taW4pIChwb2ludC1tYXgpKSkpKQoKKGRlZnVuIHMtY2VudGVyIChsZW4gcykKICAiSWYgUyBp cyBzaG9ydGVyIHRoYW4gTEVOLCBwYWQgaXQgd2l0aCBzcGFjZXMgc28gaXQgaXMgY2VudGVyZWQu IgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQgKChleHRy YSAobWF4IDAgKC0gbGVuIChsZW5ndGggcykpKSkpCiAgICAoY29uY2F0CiAgICAgKG1ha2Utc3Ry aW5nIChjZWlsaW5nIGV4dHJhIDIpID8gKQogICAgIHMKICAgICAobWFrZS1zdHJpbmcgKGZsb29y IGV4dHJhIDIpID8gKSkpKQoKKGRlZnVuIHMtcGFkLWxlZnQgKGxlbiBwYWRkaW5nIHMpCiAgIklm IFMgaXMgc2hvcnRlciB0aGFuIExFTiwgcGFkIGl0IHdpdGggUEFERElORyBvbiB0aGUgbGVmdC4i CiAgKGRlY2xhcmUgKHB1cmUgdCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKGxldCAoKGV4dHJh IChtYXggMCAoLSBsZW4gKGxlbmd0aCBzKSkpKSkKICAgIChjb25jYXQgKG1ha2Utc3RyaW5nIGV4 dHJhIChzdHJpbmctdG8tY2hhciBwYWRkaW5nKSkKICAgICAgICAgICAgcykpKQoKKGRlZnVuIHMt cGFkLXJpZ2h0IChsZW4gcGFkZGluZyBzKQogICJJZiBTIGlzIHNob3J0ZXIgdGhhbiBMRU4sIHBh ZCBpdCB3aXRoIFBBRERJTkcgb24gdGhlIHJpZ2h0LiIKICAoZGVjbGFyZSAocHVyZSB0KSAoc2lk ZS1lZmZlY3QtZnJlZSB0KSkKICAobGV0ICgoZXh0cmEgKG1heCAwICgtIGxlbiAobGVuZ3RoIHMp KSkpKQogICAgKGNvbmNhdCBzCiAgICAgICAgICAgIChtYWtlLXN0cmluZyBleHRyYSAoc3RyaW5n LXRvLWNoYXIgcGFkZGluZykpKSkpCgooZGVmdW4gcy1sZWZ0IChsZW4gcykKICAiUmV0dXJucyB1 cCB0byB0aGUgTEVOIGZpcnN0IGNoYXJzIG9mIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRl LWVmZmVjdC1mcmVlIHQpKQogIChpZiAoPiAobGVuZ3RoIHMpIGxlbikKICAgICAgKHN1YnN0cmlu ZyBzIDAgbGVuKQogICAgcykpCgooZGVmdW4gcy1yaWdodCAobGVuIHMpCiAgIlJldHVybnMgdXAg dG8gdGhlIExFTiBsYXN0IGNoYXJzIG9mIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVm ZmVjdC1mcmVlIHQpKQogIChsZXQgKChsIChsZW5ndGggcykpKQogICAgKGlmICg+IGwgbGVuKQog ICAgICAgIChzdWJzdHJpbmcgcyAoLSBsIGxlbikgbCkKICAgICAgcykpKQoKKGRlZnVuIHMtZW5k cy13aXRoPyAoc3VmZml4IHMgJm9wdGlvbmFsIGlnbm9yZS1jYXNlKQogICJEb2VzIFMgZW5kIHdp dGggU1VGRklYPwoKSWYgSUdOT1JFLUNBU0UgaXMgbm9uLW5pbCwgdGhlIGNvbXBhcmlzb24gaXMg ZG9uZSB3aXRob3V0IHBheWluZwphdHRlbnRpb24gdG8gY2FzZSBkaWZmZXJlbmNlcy4KCkFsaWFz OiBgcy1zdWZmaXg/JyIKICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkK ICAobGV0ICgoc3RhcnQtcG9zICgtIChsZW5ndGggcykgKGxlbmd0aCBzdWZmaXgpKSkpCiAgICAo YW5kICg+PSBzdGFydC1wb3MgMCkKICAgICAgICAgKGVxIHQgKGNvbXBhcmUtc3RyaW5ncyBzdWZm aXggbmlsIG5pbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgc3RhcnQtcG9zIG5p bCBpZ25vcmUtY2FzZSkpKSkpCgooZGVmdW4gcy1zdGFydHMtd2l0aD8gKHByZWZpeCBzICZvcHRp b25hbCBpZ25vcmUtY2FzZSkKICAiRG9lcyBTIHN0YXJ0IHdpdGggUFJFRklYPwoKSWYgSUdOT1JF LUNBU0UgaXMgbm9uLW5pbCwgdGhlIGNvbXBhcmlzb24gaXMgZG9uZSB3aXRob3V0IHBheWluZwph dHRlbnRpb24gdG8gY2FzZSBkaWZmZXJlbmNlcy4KCkFsaWFzOiBgcy1wcmVmaXg/Jy4gVGhpcyBp cyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgYnVpbHQtaW4KYHN0cmluZy1wcmVmaXgtcCcu IgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChzdHJpbmctcHJl Zml4LXAgcHJlZml4IHMgaWdub3JlLWNhc2UpKQoKKGRlZnVuIHMtLXRydXRoeT8gKHZhbCkKICAo ZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAobm90IChudWxsIHZhbCkp KQoKKGRlZnVuIHMtY29udGFpbnM/IChuZWVkbGUgcyAmb3B0aW9uYWwgaWdub3JlLWNhc2UpCiAg IkRvZXMgUyBjb250YWluIE5FRURMRT8KCklmIElHTk9SRS1DQVNFIGlzIG5vbi1uaWwsIHRoZSBj b21wYXJpc29uIGlzIGRvbmUgd2l0aG91dCBwYXlpbmcKYXR0ZW50aW9uIHRvIGNhc2UgZGlmZmVy ZW5jZXMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQg KChjYXNlLWZvbGQtc2VhcmNoIGlnbm9yZS1jYXNlKSkKICAgIChzLS10cnV0aHk/IChzdHJpbmct bWF0Y2gtcCAocmVnZXhwLXF1b3RlIG5lZWRsZSkgcykpKSkKCihkZWZ1biBzLWVxdWFscz8gKHMx IHMyKQogICJJcyBTMSBlcXVhbCB0byBTMj8KClRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91 bmQgdGhlIGJ1aWx0LWluIGBzdHJpbmctZXF1YWwnLiIKICAoZGVjbGFyZSAocHVyZSB0KSAoc2lk ZS1lZmZlY3QtZnJlZSB0KSkKICAoc3RyaW5nLWVxdWFsIHMxIHMyKSkKCihkZWZ1biBzLWxlc3M/ IChzMSBzMikKICAiSXMgUzEgbGVzcyB0aGFuIFMyPwoKVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVy IGFyb3VuZCB0aGUgYnVpbHQtaW4gYHN0cmluZy1sZXNzcCcuIgogIChkZWNsYXJlIChwdXJlIHQp IChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChzdHJpbmctbGVzc3AgczEgczIpKQoKKGRlZnVuIHMt bWF0Y2hlcz8gKHJlZ2V4cCBzICZvcHRpb25hbCBzdGFydCkKICAiRG9lcyBSRUdFWFAgbWF0Y2gg Uz8KSWYgU1RBUlQgaXMgbm9uLW5pbCB0aGUgc2VhcmNoIHN0YXJ0cyBhdCB0aGF0IGluZGV4LgoK VGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgYnVpbHQtaW4gYHN0cmluZy1tYXRj aC1wJy4iCiAgKGRlY2xhcmUgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHMtLXRydXRoeT8gKHN0 cmluZy1tYXRjaC1wIHJlZ2V4cCBzIHN0YXJ0KSkpCgooZGVmdW4gcy1ibGFuaz8gKHMpCiAgIklz IFMgbmlsIG9yIHRoZSBlbXB0eSBzdHJpbmc/IgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVm ZmVjdC1mcmVlIHQpKQogIChvciAobnVsbCBzKSAoc3RyaW5nPSAiIiBzKSkpCgooZGVmdW4gcy1i bGFuay1zdHI/IChzKQogICJJcyBTIG5pbCBvciB0aGUgZW1wdHkgc3RyaW5nIG9yIHN0cmluZyBv bmx5IGNvbnRhaW5zIHdoaXRlc3BhY2U/IgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVj dC1mcmVlIHQpKQogIChvciAocy1ibGFuaz8gcykgKHMtYmxhbms/IChzLXRyaW0gcykpKSkKCihk ZWZ1biBzLXByZXNlbnQ/IChzKQogICJJcyBTIGFueXRoaW5nIGJ1dCBuaWwgb3IgdGhlIGVtcHR5 IHN0cmluZz8iCiAgKGRlY2xhcmUgKHB1cmUgdCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKG5v dCAocy1ibGFuaz8gcykpKQoKKGRlZnVuIHMtcHJlc2VuY2UgKHMpCiAgIlJldHVybiBTIGlmIGl0 J3MgYHMtcHJlc2VudD8nLCBvdGhlcndpc2UgcmV0dXJuIG5pbC4iCiAgKGRlY2xhcmUgKHB1cmUg dCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKGFuZCAocy1wcmVzZW50PyBzKSBzKSkKCihkZWZ1 biBzLWxvd2VyY2FzZT8gKHMpCiAgIkFyZSBhbGwgdGhlIGxldHRlcnMgaW4gUyBpbiBsb3dlciBj YXNlPyIKICAoZGVjbGFyZSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAobGV0ICgoY2FzZS1mb2xk LXNlYXJjaCBuaWwpKQogICAgKG5vdCAoc3RyaW5nLW1hdGNoLXAgIltbOnVwcGVyOl1dIiBzKSkp KQoKKGRlZnVuIHMtdXBwZXJjYXNlPyAocykKICAiQXJlIGFsbCB0aGUgbGV0dGVycyBpbiBTIGlu IHVwcGVyIGNhc2U/IgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQgKChj YXNlLWZvbGQtc2VhcmNoIG5pbCkpCiAgICAobm90IChzdHJpbmctbWF0Y2gtcCAiW1s6bG93ZXI6 XV0iIHMpKSkpCgooZGVmdW4gcy1taXhlZGNhc2U/IChzKQogICJBcmUgdGhlcmUgYm90aCBsb3dl ciBjYXNlIGFuZCB1cHBlciBjYXNlIGxldHRlcnMgaW4gUz8iCiAgKGxldCAoKGNhc2UtZm9sZC1z ZWFyY2ggbmlsKSkKICAgIChzLS10cnV0aHk/CiAgICAgKGFuZCAoc3RyaW5nLW1hdGNoLXAgIltb Omxvd2VyOl1dIiBzKQogICAgICAgICAgKHN0cmluZy1tYXRjaC1wICJbWzp1cHBlcjpdXSIgcykp KSkpCgooZGVmdW4gcy1jYXBpdGFsaXplZD8gKHMpCiAgIkluIFMsIGlzIHRoZSBmaXJzdCBsZXR0 ZXIgdXBwZXIgY2FzZSwgYW5kIGFsbCBvdGhlciBsZXR0ZXJzIGxvd2VyIGNhc2U/IgogIChkZWNs YXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsZXQgKChjYXNlLWZvbGQtc2VhcmNoIG5pbCkp CiAgICAocy0tdHJ1dGh5PwogICAgIChzdHJpbmctbWF0Y2gtcCAiXltbOnVwcGVyOl1dW15bOnVw cGVyOl1dKiQiIHMpKSkpCgooZGVmdW4gcy1udW1lcmljPyAocykKICAiSXMgUyBhIG51bWJlcj8i CiAgKGRlY2xhcmUgKHB1cmUgdCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHMtLXRydXRoeT8K ICAgKHN0cmluZy1tYXRjaC1wICJeWzAtOV0rJCIgcykpKQoKKGRlZnVuIHMtcmVwbGFjZSAob2xk IG5ldyBzKQogICJSZXBsYWNlcyBPTEQgd2l0aCBORVcgaW4gUy4iCiAgKGRlY2xhcmUgKHB1cmUg dCkgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAocmVn ZXhwLXF1b3RlIG9sZCkgbmV3IHMgdCB0KSkKCihkZWZhbGlhcyAncy1yZXBsYWNlLXJlZ2V4cCAn cmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nKQoKKGRlZnVuIHMtLWFnZXQgKGFsaXN0IGtleSkKICAo ZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAoY2RyIChhc3NvYy1zdHJp bmcga2V5IGFsaXN0KSkpCgooZGVmdW4gcy1yZXBsYWNlLWFsbCAocmVwbGFjZW1lbnRzIHMpCiAg IlJFUExBQ0VNRU5UUyBpcyBhIGxpc3Qgb2YgY29ucy1jZWxscy4gRWFjaCBgY2FyYCBpcyByZXBs YWNlZCB3aXRoIGBjZHJgIGluIFMuIgogIChkZWNsYXJlIChwdXJlIHQpIChzaWRlLWVmZmVjdC1m cmVlIHQpKQogIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgKHJlZ2V4cC1vcHQgKG1hcGNhciAn Y2FyIHJlcGxhY2VtZW50cykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChp dCkgKHMtLWFnZXQgcmVwbGFjZW1lbnRzIGl0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg IHMgdCB0KSkKCihkZWZ1biBzLWRvd25jYXNlIChzKQogICJDb252ZXJ0IFMgdG8gbG93ZXIgY2Fz ZS4KClRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGJ1aWx0LWluIGBkb3duY2Fz ZScuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChkb3duY2FzZSBzKSkKCihk ZWZ1biBzLXVwY2FzZSAocykKICAiQ29udmVydCBTIHRvIHVwcGVyIGNhc2UuCgpUaGlzIGlzIGEg c2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBidWlsdC1pbiBgdXBjYXNlJy4iCiAgKGRlY2xhcmUg KHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHVwY2FzZSBzKSkKCihkZWZ1biBzLWNhcGl0YWxpemUg KHMpCiAgIkNvbnZlcnQgdGhlIGZpcnN0IHdvcmQncyBmaXJzdCBjaGFyYWN0ZXIgdG8gdXBwZXIg Y2FzZSBhbmQgdGhlIHJlc3QgdG8gbG93ZXIgY2FzZSBpbiBTLiIKICAoZGVjbGFyZSAoc2lkZS1l ZmZlY3QtZnJlZSB0KSkKICAoY29uY2F0ICh1cGNhc2UgKHN1YnN0cmluZyBzIDAgMSkpIChkb3du Y2FzZSAoc3Vic3RyaW5nIHMgMSkpKSkKCihkZWZ1biBzLXRpdGxlaXplIChzKQogICJDb252ZXJ0 IGVhY2ggd29yZCdzIGZpcnN0IGNoYXJhY3RlciB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCB0 byBsb3dlciBjYXNlIGluIFMuCgpUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBi dWlsdC1pbiBgY2FwaXRhbGl6ZScuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQog IChjYXBpdGFsaXplIHMpKQoKKGRlZm1hY3JvIHMtd2l0aCAocyBmb3JtICZyZXN0IG1vcmUpCiAg IlRocmVhZHMgUyB0aHJvdWdoIHRoZSBmb3Jtcy4gSW5zZXJ0cyBTIGFzIHRoZSBsYXN0IGl0ZW0K aW4gdGhlIGZpcnN0IGZvcm0sIG1ha2luZyBhIGxpc3Qgb2YgaXQgaWYgaXQgaXMgbm90IGEgbGlz dAphbHJlYWR5LiBJZiB0aGVyZSBhcmUgbW9yZSBmb3JtcywgaW5zZXJ0cyB0aGUgZmlyc3QgZm9y bSBhcyB0aGUKbGFzdCBpdGVtIGluIHNlY29uZCBmb3JtLCBldGMuIgogIChkZWNsYXJlIChkZWJ1 ZyAoZm9ybSAmcmVzdCBbJm9yIChmdW5jdGlvbiAmcmVzdCBmb3JtKSBmYm91bmRwXSkpKQogIChp ZiAobnVsbCBtb3JlKQogICAgICAoaWYgKGxpc3RwIGZvcm0pCiAgICAgICAgICBgKCwoY2FyIGZv cm0pICxAKGNkciBmb3JtKSAscykKICAgICAgICAobGlzdCBmb3JtIHMpKQogICAgYChzLXdpdGgg KHMtd2l0aCAscyAsZm9ybSkgLEBtb3JlKSkpCgoocHV0ICdzLXdpdGggJ2xpc3AtaW5kZW50LWZ1 bmN0aW9uIDEpCgooZGVmdW4gcy1pbmRleC1vZiAobmVlZGxlIHMgJm9wdGlvbmFsIGlnbm9yZS1j YXNlKQogICJSZXR1cm5zIGZpcnN0IGluZGV4IG9mIE5FRURMRSBpbiBTLCBvciBuaWwuCgpJZiBJ R05PUkUtQ0FTRSBpcyBub24tbmlsLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIHdpdGhvdXQgcGF5 aW5nCmF0dGVudGlvbiB0byBjYXNlIGRpZmZlcmVuY2VzLiIKICAoZGVjbGFyZSAocHVyZSB0KSAo c2lkZS1lZmZlY3QtZnJlZSB0KSkKICAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCBpZ25vcmUtY2Fz ZSkpCiAgICAoc3RyaW5nLW1hdGNoLXAgKHJlZ2V4cC1xdW90ZSBuZWVkbGUpIHMpKSkKCihkZWZ1 biBzLXJldmVyc2UgKHMpCiAgIlJldHVybiB0aGUgcmV2ZXJzZSBvZiBTLiIKICAoZGVjbGFyZSAo cHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAoc2F2ZS1tYXRjaC1kYXRhCiAgICAoaWYg KG11bHRpYnl0ZS1zdHJpbmctcCBzKQogICAgICAgIChsZXQgKChpbnB1dCAoc3RyaW5nLXRvLWxp c3QgcykpCiAgICAgICAgICAgICAgb3V0cHV0KQogICAgICAgICAgKHJlcXVpcmUgJ3Vjcy1ub3Jt YWxpemUpCiAgICAgICAgICAod2hpbGUgaW5wdXQKICAgICAgICAgICAgOzsgSGFuZGxlIGVudGly ZSBncmFwaGVtZSBjbHVzdGVyIGFzIGEgc2luZ2xlIHVuaXQKICAgICAgICAgICAgKGxldCAoKGdy YXBoZW1lIChsaXN0IChwb3AgaW5wdXQpKSkpCiAgICAgICAgICAgICAgKHdoaWxlIChtZW1xbCAo Y2FyIGlucHV0KSB1Y3Mtbm9ybWFsaXplLWNvbWJpbmluZy1jaGFycykKICAgICAgICAgICAgICAg IChwdXNoIChwb3AgaW5wdXQpIGdyYXBoZW1lKSkKICAgICAgICAgICAgICAoc2V0cSBvdXRwdXQg KG5jb25jIChucmV2ZXJzZSBncmFwaGVtZSkgb3V0cHV0KSkpKQogICAgICAgICAgKGNvbmNhdCBv dXRwdXQpKQogICAgICAoY29uY2F0IChucmV2ZXJzZSAoc3RyaW5nLXRvLWxpc3QgcykpKSkpKQoK KGRlZnVuIHMtbWF0Y2gtc3RyaW5ncy1hbGwgKHJlZ2V4IHN0cmluZykKICAiUmV0dXJuIGEgbGlz dCBvZiBtYXRjaGVzIGZvciBSRUdFWCBpbiBTVFJJTkcuCgpFYWNoIGVsZW1lbnQgaXRzZWxmIGlz IGEgbGlzdCBvZiBtYXRjaGVzLCBhcyBwZXIKYG1hdGNoLXN0cmluZycuIE11bHRpcGxlIG1hdGNo ZXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gd2lsbCBiZQppZ25vcmVkIGFmdGVyIHRoZSBmaXJzdC4i CiAgKGRlY2xhcmUgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHNhdmUtbWF0Y2gtZGF0YQogICAg KGxldCAoKGFsbC1zdHJpbmdzICgpKQogICAgICAgICAgKGkgMCkpCiAgICAgICh3aGlsZSAoYW5k ICg8IGkgKGxlbmd0aCBzdHJpbmcpKQogICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIHJl Z2V4IHN0cmluZyBpKSkKICAgICAgICAoc2V0cSBpICgxKyAobWF0Y2gtYmVnaW5uaW5nIDApKSkK ICAgICAgICAobGV0IChzdHJpbmdzCiAgICAgICAgICAgICAgKG51bS1tYXRjaGVzICgvIChsZW5n dGggKG1hdGNoLWRhdGEpKSAyKSkKICAgICAgICAgICAgICAobWF0Y2ggMCkpCiAgICAgICAgICAo d2hpbGUgKC89IG1hdGNoIG51bS1tYXRjaGVzKQogICAgICAgICAgICAocHVzaCAobWF0Y2gtc3Ry aW5nIG1hdGNoIHN0cmluZykgc3RyaW5ncykKICAgICAgICAgICAgKHNldHEgbWF0Y2ggKDErIG1h dGNoKSkpCiAgICAgICAgICAocHVzaCAobnJldmVyc2Ugc3RyaW5ncykgYWxsLXN0cmluZ3MpKSkK ICAgICAgKG5yZXZlcnNlIGFsbC1zdHJpbmdzKSkpKQoKKGRlZnVuIHMtbWF0Y2hlZC1wb3NpdGlv bnMtYWxsIChyZWdleHAgc3RyaW5nICZvcHRpb25hbCBzdWJleHAtZGVwdGgpCiAgIlJldHVybiBh IGxpc3Qgb2YgbWF0Y2hlZCBwb3NpdGlvbnMgZm9yIFJFR0VYUCBpbiBTVFJJTkcuClNVQkVYUC1E RVBUSCBpcyAwIGJ5IGRlZmF1bHQuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQog IChpZiAobnVsbCBzdWJleHAtZGVwdGgpCiAgICAgIChzZXRxIHN1YmV4cC1kZXB0aCAwKSkKICAo c2F2ZS1tYXRjaC1kYXRhCiAgICAobGV0ICgocG9zIDApIHJlc3VsdCkKICAgICAgKHdoaWxlIChh bmQgKHN0cmluZy1tYXRjaCByZWdleHAgc3RyaW5nIHBvcykKICAgICAgICAgICAgICAgICAgKDwg cG9zIChsZW5ndGggc3RyaW5nKSkpCiAgICAgICAgKGxldCAoKG0gKG1hdGNoLWVuZCBzdWJleHAt ZGVwdGgpKSkKICAgICAgICAgIChwdXNoIChjb25zIChtYXRjaC1iZWdpbm5pbmcgc3ViZXhwLWRl cHRoKSAobWF0Y2gtZW5kIHN1YmV4cC1kZXB0aCkpIHJlc3VsdCkKICAgICAgICAgIChzZXRxIHBv cyAobWF0Y2gtZW5kIDApKSkpCiAgICAgIChucmV2ZXJzZSByZXN1bHQpKSkpCgooZGVmdW4gcy1t YXRjaCAocmVnZXhwIHMgJm9wdGlvbmFsIHN0YXJ0KQogICJXaGVuIHRoZSBnaXZlbiBleHByZXNz aW9uIG1hdGNoZXMgdGhlIHN0cmluZywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbGlzdApvZiB0 aGUgd2hvbGUgbWF0Y2hpbmcgc3RyaW5nIGFuZCBhIHN0cmluZyBmb3IgZWFjaCBtYXRjaGVkIHN1 YmV4cHJlc3Npb25zLgpJZiBpdCBkaWQgbm90IG1hdGNoIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBh biBlbXB0eSBsaXN0IChuaWwpLgoKV2hlbiBTVEFSVCBpcyBub24tbmlsIHRoZSBzZWFyY2ggd2ls bCBzdGFydCBhdCB0aGF0IGluZGV4LiIKICAoZGVjbGFyZSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkK ICAoc2F2ZS1tYXRjaC1kYXRhCiAgICAoaWYgKHN0cmluZy1tYXRjaCByZWdleHAgcyBzdGFydCkK ICAgICAgICAobGV0ICgobWF0Y2gtZGF0YS1saXN0IChtYXRjaC1kYXRhKSkKICAgICAgICAgICAg ICByZXN1bHQpCiAgICAgICAgICAod2hpbGUgbWF0Y2gtZGF0YS1saXN0CiAgICAgICAgICAgIChs ZXQqICgoYmVnIChjYXIgbWF0Y2gtZGF0YS1saXN0KSkKICAgICAgICAgICAgICAgICAgIChlbmQg KGNhZHIgbWF0Y2gtZGF0YS1saXN0KSkKICAgICAgICAgICAgICAgICAgIChzdWJzIChpZiAoYW5k IGJlZyBlbmQpIChzdWJzdHJpbmcgcyBiZWcgZW5kKSBuaWwpKSkKICAgICAgICAgICAgICAoc2V0 cSByZXN1bHQgKGNvbnMgc3VicyByZXN1bHQpKQogICAgICAgICAgICAgIChzZXRxIG1hdGNoLWRh dGEtbGlzdAogICAgICAgICAgICAgICAgICAgIChjZGRyIG1hdGNoLWRhdGEtbGlzdCkpKSkKICAg ICAgICAgIChucmV2ZXJzZSByZXN1bHQpKSkpKQoKKGRlZnVuIHMtc2xpY2UtYXQgKHJlZ2V4cCBz KQogICJTbGljZXMgUyB1cCBhdCBldmVyeSBpbmRleCBtYXRjaGluZyBSRUdFWFAuIgogIChkZWNs YXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChpZiAoPSAwIChsZW5ndGggcykpIChsaXN0ICIi KQogICAgKHNhdmUtbWF0Y2gtZGF0YQogICAgICAobGV0IChpKQogICAgICAgIChzZXRxIGkgKHN0 cmluZy1tYXRjaCByZWdleHAgcyAxKSkKICAgICAgICAoaWYgaQogICAgICAgICAgICAoY29ucyAo c3Vic3RyaW5nIHMgMCBpKQogICAgICAgICAgICAgICAgICAocy1zbGljZS1hdCByZWdleHAgKHN1 YnN0cmluZyBzIGkpKSkKICAgICAgICAgIChsaXN0IHMpKSkpKSkKCihkZWZ1biBzLXNwbGl0LXdv cmRzIChzKQogICJTcGxpdCBTIGludG8gbGlzdCBvZiB3b3Jkcy4iCiAgKGRlY2xhcmUgKHNpZGUt ZWZmZWN0LWZyZWUgdCkpCiAgKHMtc3BsaXQKICAgIlteWzp3b3JkOl0wLTldKyIKICAgKGxldCAo KGNhc2UtZm9sZC1zZWFyY2ggbmlsKSkKICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAg ICAgICJcXChbWzpsb3dlcjpdXVxcKVxcKFtbOnVwcGVyOl1dXFwpIiAiXFwxIFxcMiIKICAgICAg KHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiXFwoW1s6dXBwZXI6XV1cXClcXChbWzp1cHBlcjpd XVswLTlbOmxvd2VyOl1dXFwpIiAiXFwxIFxcMiIgcykpKQogICB0KSkKCihkZWZ1biBzLS1tYXBj YXItaGVhZCAoZm4taGVhZCBmbi1yZXN0IGxpc3QpCiAgIkxpa2UgTUFQQ0FSLCBidXQgYXBwbGll cyBhIGRpZmZlcmVudCBmdW5jdGlvbiB0byB0aGUgZmlyc3QgZWxlbWVudC4iCiAgKGlmIGxpc3QK ICAgICAgKGNvbnMgKGZ1bmNhbGwgZm4taGVhZCAoY2FyIGxpc3QpKSAobWFwY2FyIGZuLXJlc3Qg KGNkciBsaXN0KSkpKSkKCihkZWZ1biBzLWxvd2VyLWNhbWVsLWNhc2UgKHMpCiAgIkNvbnZlcnQg UyB0byBsb3dlckNhbWVsQ2FzZS4iCiAgKGRlY2xhcmUgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAg KHMtam9pbiAiIiAocy0tbWFwY2FyLWhlYWQgJ2Rvd25jYXNlICdjYXBpdGFsaXplIChzLXNwbGl0 LXdvcmRzIHMpKSkpCgooZGVmdW4gcy11cHBlci1jYW1lbC1jYXNlIChzKQogICJDb252ZXJ0IFMg dG8gVXBwZXJDYW1lbENhc2UuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChz LWpvaW4gIiIgKG1hcGNhciAnY2FwaXRhbGl6ZSAocy1zcGxpdC13b3JkcyBzKSkpKQoKKGRlZnVu IHMtc25ha2UtY2FzZSAocykKICAiQ29udmVydCBTIHRvIHNuYWtlX2Nhc2UuIgogIChkZWNsYXJl IChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChzLWpvaW4gIl8iIChtYXBjYXIgJ2Rvd25jYXNlIChz LXNwbGl0LXdvcmRzIHMpKSkpCgooZGVmdW4gcy1kYXNoZWQtd29yZHMgKHMpCiAgIkNvbnZlcnQg UyB0byBkYXNoZWQtd29yZHMuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChz LWpvaW4gIi0iIChtYXBjYXIgJ2Rvd25jYXNlIChzLXNwbGl0LXdvcmRzIHMpKSkpCgooZGVmdW4g cy1jYXBpdGFsaXplZC13b3JkcyAocykKICAiQ29udmVydCBTIHRvIENhcGl0YWxpemVkIHdvcmRz LiIKICAoZGVjbGFyZSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkKICAobGV0ICgod29yZHMgKHMtc3Bs aXQtd29yZHMgcykpKQogICAgKHMtam9pbiAiICIgKGNvbnMgKGNhcGl0YWxpemUgKGNhciB3b3Jk cykpIChtYXBjYXIgJ2Rvd25jYXNlIChjZHIgd29yZHMpKSkpKSkKCihkZWZ1biBzLXRpdGxlaXpl ZC13b3JkcyAocykKICAiQ29udmVydCBTIHRvIFRpdGxlaXplZCBXb3Jkcy4iCiAgKGRlY2xhcmUg KHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAgKHMtam9pbiAiICIgKG1hcGNhciAncy10aXRsZWl6ZSAo cy1zcGxpdC13b3JkcyBzKSkpKQoKKGRlZnVuIHMtd29yZC1pbml0aWFscyAocykKICAiQ29udmVy dCBTIHRvIGl0cyBpbml0aWFscy4iCiAgKGRlY2xhcmUgKHNpZGUtZWZmZWN0LWZyZWUgdCkpCiAg KHMtam9pbiAiIiAobWFwY2FyIChsYW1iZGEgKHNzKSAoc3Vic3RyaW5nIHNzIDAgMSkpCiAgICAg ICAgICAgICAgICAgICAgIChzLXNwbGl0LXdvcmRzIHMpKSkpCgo7OyBFcnJvcnMgZm9yIHMtZm9y bWF0Cihwcm9nbgogIChwdXQgJ3MtZm9ybWF0LXJlc29sdmUKICAgICAgICdlcnJvci1jb25kaXRp b25zCiAgICAgICAnKGVycm9yIHMtZm9ybWF0IHMtZm9ybWF0LXJlc29sdmUpKQogIChwdXQgJ3Mt Zm9ybWF0LXJlc29sdmUKICAgICAgICdlcnJvci1tZXNzYWdlCiAgICAgICAiQ2Fubm90IHJlc29s dmUgYSB0ZW1wbGF0ZSB0byB2YWx1ZXMiKSkKCihkZWZ1biBzLWZvcm1hdCAodGVtcGxhdGUgcmVw bGFjZXIgJm9wdGlvbmFsIGV4dHJhKQogICJGb3JtYXQgVEVNUExBVEUgd2l0aCB0aGUgZnVuY3Rp b24gUkVQTEFDRVIuCgpSRVBMQUNFUiB0YWtlcyBhbiBhcmd1bWVudCBvZiB0aGUgZm9ybWF0IHZh cmlhYmxlIGFuZCBvcHRpb25hbGx5CmFuIGV4dHJhIGFyZ3VtZW50IHdoaWNoIGlzIHRoZSBFWFRS QSB2YWx1ZSBmcm9tIHRoZSBjYWxsIHRvCmBzLWZvcm1hdCcuCgpTZXZlcmFsIHN0YW5kYXJkIGBz LWZvcm1hdCcgaGVscGVyIGZ1bmN0aW9ucyBhcmUgcmVjb2duaXplZCBhbmQKYWRhcHRlZCBmb3Ig dGhpczoKCiAgICAocy1mb3JtYXQgXCIke25hbWV9XCIgJ2dldGhhc2ggaGFzaC10YWJsZSkKICAg IChzLWZvcm1hdCBcIiR7bmFtZX1cIiAnYWdldCBhbGlzdCkKICAgIChzLWZvcm1hdCBcIiQwXCIg J2VsdCBzZXF1ZW5jZSkKClRoZSBSRVBMQUNFUiBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBkbyBh bnkgb3RoZXIga2luZCBvZgp0cmFuc2Zvcm1hdGlvbi4iCiAgKGxldCAoKHNhdmVkLW1hdGNoLWRh dGEgKG1hdGNoLWRhdGEpKSkKICAgICh1bndpbmQtcHJvdGVjdAogICAgICAgIChyZXBsYWNlLXJl Z2V4cC1pbi1zdHJpbmcKICAgICAgICAgIlxcJFxcKHtcXChbXn1dK1xcKX1cXHxbMC05XStcXCki CiAgICAgICAgIChsYW1iZGEgKG1kKQogICAgICAgICAgIChsZXQgKCh2YXIKICAgICAgICAgICAg ICAgICAgKGxldCAoKG0gKG1hdGNoLXN0cmluZyAyIG1kKSkpCiAgICAgICAgICAgICAgICAgICAg KGlmIG0gbQogICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0 cmluZyAxIG1kKSkpKSkKICAgICAgICAgICAgICAgICAocmVwbGFjZXItbWF0Y2gtZGF0YSAobWF0 Y2gtZGF0YSkpKQogICAgICAgICAgICAgKHVud2luZC1wcm90ZWN0CiAgICAgICAgICAgICAgICAg KGxldCAoKHYKICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICAg ICAgICAgICgoZXEgcmVwbGFjZXIgJ2dldGhhc2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAg KGZ1bmNhbGwgcmVwbGFjZXIgdmFyIGV4dHJhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICgo ZXEgcmVwbGFjZXIgJ2FnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgJ3Mt LWFnZXQgZXh0cmEgdmFyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgcmVwbGFjZXIg J2VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCByZXBsYWNlciBleHRyYSB2 YXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgKChlcSByZXBsYWNlciAnb3JlZikKICAgICAg ICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCAjJ3Nsb3QtdmFsdWUgZXh0cmEgKGludGVybiB2 YXIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgICAg ICAgKHNldC1tYXRjaC1kYXRhIHNhdmVkLW1hdGNoLWRhdGEpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgKGlmIGV4dHJhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIHJl cGxhY2VyIHZhciBleHRyYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIHJl cGxhY2VyIHZhcikpKSkpKQogICAgICAgICAgICAgICAgICAgKGlmIHYgKGZvcm1hdCAiJXMiIHYp IChzaWduYWwgJ3MtZm9ybWF0LXJlc29sdmUgbWQpKSkKICAgICAgICAgICAgICAgKHNldC1tYXRj aC1kYXRhIHJlcGxhY2VyLW1hdGNoLWRhdGEpKSkpIHRlbXBsYXRlCiAgICAgICAgICAgICAgIDs7 IE5lZWQgbGl0ZXJhbCB0byBtYWtlIHN1cmUgaXQgd29ya3MKICAgICAgICAgICAgICAgdCB0KQog ICAgICAoc2V0LW1hdGNoLWRhdGEgc2F2ZWQtbWF0Y2gtZGF0YSkpKSkKCihkZWZ2YXIgcy1sZXgt dmFsdWUtYXMtbGlzcCBuaWwKICAiSWYgYHQnIGludGVycG9sYXRlIGxpc3AgdmFsdWVzIGFzIGxp c3AuCgpgcy1sZXgtZm9ybWF0JyBpbnNlcnRzIHZhbHVlcyB3aXRoIChmb3JtYXQgXCIlU1wiKS4i KQoKKGRlZnVuIHMtbGV4LWZtdHxleHBhbmQgKGZtdCkKICAiRXhwYW5kIEZNVCBpbnRvIGxpc3Au IgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQpKQogIChsaXN0ICdzLWZvcm1hdCBmbXQg KHF1b3RlICdhZ2V0KQogICAgICAgIChhcHBlbmQgJyhsaXN0KQogICAgICAgICAgICAgICAgKG1h cGNhcgogICAgICAgICAgICAgICAgIChsYW1iZGEgKG1hdGNoZXMpCiAgICAgICAgICAgICAgICAg ICAobGlzdAogICAgICAgICAgICAgICAgICAgICdjb25zCiAgICAgICAgICAgICAgICAgICAgKGNh ZHIgbWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICBgKGZvcm1hdAogICAgICAgICAgICAgICAg ICAgICAgKGlmIHMtbGV4LXZhbHVlLWFzLWxpc3AgIiVTIiAiJXMiKQogICAgICAgICAgICAgICAg ICAgICAgLChpbnRlcm4gKGNhZHIgbWF0Y2hlcykpKSkpCiAgICAgICAgICAgICAgICAgKHMtbWF0 Y2gtc3RyaW5ncy1hbGwgIiR7XFwoW159XStcXCl9IiBmbXQpKSkpKQoKKGRlZm1hY3JvIHMtbGV4 LWZvcm1hdCAoZm9ybWF0LXN0cikKICAiYHMtZm9ybWF0YCB3aXRoIHRoZSBjdXJyZW50IGVudmly b25tZW50LgoKRk9STUFULVNUUiBtYXkgdXNlIHRoZSBgcy1mb3JtYXQnIHZhcmlhYmxlIHJlZmVy ZW5jZSB0byByZWZlciB0bwphbnkgdmFyaWFibGU6CgogKGxldCAoKHggMSkpCiAgIChzLWxleC1m b3JtYXQgXCJ4IGlzOiAke3h9XCIpKQoKVGhlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIGFyZSBp bnRlcnBvbGF0ZWQgd2l0aCBcIiVzXCIgdW5sZXNzCnRoZSB2YXJpYWJsZSBgcy1sZXgtdmFsdWUt YXMtbGlzcCcgaXMgYHQnIGFuZCB0aGVuIHRoZXkgYXJlCmludGVycG9sYXRlZCB3aXRoIFwiJVNc Ii4iCiAgKGRlY2xhcmUgKGRlYnVnIChmb3JtKSkpCiAgKHMtbGV4LWZtdHxleHBhbmQgZm9ybWF0 LXN0cikpCgooZGVmdW4gcy1jb3VudC1tYXRjaGVzIChyZWdleHAgcyAmb3B0aW9uYWwgc3RhcnQg ZW5kKQogICJDb3VudCBvY2N1cnJlbmNlcyBvZiBgcmVnZXhwJyBpbiBgcycuCgpgc3RhcnQnLCBp bmNsdXNpdmUsIGFuZCBgZW5kJywgZXhjbHVzaXZlLCBkZWxpbWl0IHRoZSBwYXJ0IG9mIGBzJyB0 bwptYXRjaC4gIGBzdGFydCcgYW5kIGBlbmQnIGFyZSBib3RoIGluZGV4ZWQgc3RhcnRpbmcgYXQg MTsgdGhlIGluaXRpYWwKY2hhcmFjdGVyIGluIGBzJyBpcyBpbmRleCAxLgoKVGhpcyBmdW5jdGlv biBzdGFydHMgbG9va2luZyBmb3IgdGhlIG5leHQgbWF0Y2ggZnJvbSB0aGUgZW5kIG9mIHRoZQpw cmV2aW91cyBtYXRjaC4gIEhlbmNlLCBpdCBpZ25vcmVzIG1hdGNoZXMgdGhhdCBvdmVybGFwIGEg cHJldmlvdXNseQpmb3VuZCBtYXRjaC4gIFRvIGNvdW50IG92ZXJsYXBwaW5nIG1hdGNoZXMsIHVz ZQpgcy1jb3VudC1tYXRjaGVzLWFsbCcuIgogIChkZWNsYXJlIChzaWRlLWVmZmVjdC1mcmVlIHQp KQogIChzYXZlLW1hdGNoLWRhdGEKICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgIChpbnNlcnQg cykKICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAgKGNvdW50LW1hdGNoZXMgcmVn ZXhwIChvciBzdGFydCAxKSAob3IgZW5kIChwb2ludC1tYXgpKSkpKSkKCihkZWZ1biBzLWNvdW50 LW1hdGNoZXMtYWxsIChyZWdleHAgcyAmb3B0aW9uYWwgc3RhcnQgZW5kKQogICJDb3VudCBvY2N1 cnJlbmNlcyBvZiBgcmVnZXhwJyBpbiBgcycuCgpgc3RhcnQnLCBpbmNsdXNpdmUsIGFuZCBgZW5k JywgZXhjbHVzaXZlLCBkZWxpbWl0IHRoZSBwYXJ0IG9mIGBzJyB0bwptYXRjaC4gIGBzdGFydCcg YW5kIGBlbmQnIGFyZSBib3RoIGluZGV4ZWQgc3RhcnRpbmcgYXQgMTsgdGhlIGluaXRpYWwKY2hh cmFjdGVyIGluIGBzJyBpcyBpbmRleCAxLgoKVGhpcyBmdW5jdGlvbiBzdGFydHMgbG9va2luZyBm b3IgdGhlIG5leHQgbWF0Y2ggZnJvbSB0aGUgc2Vjb25kCmNoYXJhY3RlciBvZiB0aGUgcHJldmlv dXMgbWF0Y2guICBIZW5jZSwgaXQgY291bnRzIG1hdGNoZXMgdGhhdApvdmVybGFwIGEgcHJldmlv dXNseSBmb3VuZCBtYXRjaC4gIFRvIGlnbm9yZSBtYXRjaGVzIHRoYXQgb3ZlcmxhcCBhCnByZXZp b3VzbHkgZm91bmQgbWF0Y2gsIHVzZSBgcy1jb3VudC1tYXRjaGVzJy4iCiAgKGRlY2xhcmUgKHNp ZGUtZWZmZWN0LWZyZWUgdCkpCiAgKGxldCogKChhbmNob3JlZC1yZWdleHAgKGZvcm1hdCAiXiVz IiByZWdleHApKQogICAgICAgICAobWF0Y2gtY291bnQgMCkKICAgICAgICAgKGkgMCkKICAgICAg ICAgKG5hcnJvd2VkLXMgKHN1YnN0cmluZyBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHdoZW4gc3RhcnQgKDEtIHN0YXJ0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAod2hlbiBlbmQgKDEtIGVuZCkpKSkpCiAgICAoc2F2ZS1tYXRjaC1kYXRhCiAgICAgICh3aGls ZSAoPCBpIChsZW5ndGggbmFycm93ZWQtcykpCiAgICAgICAgKHdoZW4gKHMtbWF0Y2hlcz8gYW5j aG9yZWQtcmVnZXhwIChzdWJzdHJpbmcgbmFycm93ZWQtcyBpKSkKICAgICAgICAgIChzZXRxIG1h dGNoLWNvdW50ICgxKyBtYXRjaC1jb3VudCkpKQogICAgICAgIChzZXRxIGkgKDErIGkpKSkpCiAg ICBtYXRjaC1jb3VudCkpCgooZGVmdW4gcy13cmFwIChzIHByZWZpeCAmb3B0aW9uYWwgc3VmZml4 KQogICJXcmFwIHN0cmluZyBTIHdpdGggUFJFRklYIGFuZCBvcHRpb25hbGx5IFNVRkZJWC4KClJl dHVybiBzdHJpbmcgUyB3aXRoIFBSRUZJWCBwcmVwZW5kZWQuICBJZiBTVUZGSVggaXMgcHJlc2Vu dCwgaXQKaXMgYXBwZW5kZWQsIG90aGVyd2lzZSBQUkVGSVggaXMgdXNlZCBhcyBib3RoIHByZWZp eCBhbmQKc3VmZml4LiIKICAoZGVjbGFyZSAocHVyZSB0KSAoc2lkZS1lZmZlY3QtZnJlZSB0KSkK ICAoY29uY2F0IHByZWZpeCBzIChvciBzdWZmaXggcHJlZml4KSkpCgoMCjs7OyBBbGlhc2VzCgoo ZGVmYWxpYXMgJ3MtYmxhbmstcCAncy1ibGFuaz8pCihkZWZhbGlhcyAncy1ibGFuay1zdHItcCAn cy1ibGFuay1zdHI/KQooZGVmYWxpYXMgJ3MtY2FwaXRhbGl6ZWQtcCAncy1jYXBpdGFsaXplZD8p CihkZWZhbGlhcyAncy1jb250YWlucy1wICdzLWNvbnRhaW5zPykKKGRlZmFsaWFzICdzLWVuZHMt d2l0aC1wICdzLWVuZHMtd2l0aD8pCihkZWZhbGlhcyAncy1lcXVhbHMtcCAncy1lcXVhbHM/KQoo ZGVmYWxpYXMgJ3MtbGVzcy1wICdzLWxlc3M/KQooZGVmYWxpYXMgJ3MtbG93ZXJjYXNlLXAgJ3Mt bG93ZXJjYXNlPykKKGRlZmFsaWFzICdzLW1hdGNoZXMtcCAncy1tYXRjaGVzPykKKGRlZmFsaWFz ICdzLW1peGVkY2FzZS1wICdzLW1peGVkY2FzZT8pCihkZWZhbGlhcyAncy1udW1lcmljLXAgJ3Mt bnVtZXJpYz8pCihkZWZhbGlhcyAncy1wcmVmaXgtcCAncy1zdGFydHMtd2l0aD8pCihkZWZhbGlh cyAncy1wcmVmaXg/ICdzLXN0YXJ0cy13aXRoPykKKGRlZmFsaWFzICdzLXByZXNlbnQtcCAncy1w cmVzZW50PykKKGRlZmFsaWFzICdzLXN0YXJ0cy13aXRoLXAgJ3Mtc3RhcnRzLXdpdGg/KQooZGVm YWxpYXMgJ3Mtc3VmZml4LXAgJ3MtZW5kcy13aXRoPykKKGRlZmFsaWFzICdzLXN1ZmZpeD8gJ3Mt ZW5kcy13aXRoPykKKGRlZmFsaWFzICdzLXVwcGVyY2FzZS1wICdzLXVwcGVyY2FzZT8pCgoMCihw cm92aWRlICdtYWduYXItc3RyaW5nKQo7OzsgbWFnbmFyLXN0cmluZy5lbCBlbmRzIGhlcmUsCjs7 IExvY2FsIFZhcmlhYmxlczoKOzsgc2hvcnRoYW5kLXNob3J0aGFuZHM6ICgoIl5zLSIgLiAibWFn bmFyLXN0cmluZy0iKSkKOzsgRW5kOgo= --0000000000002671d005a53b6934 Content-Type: text/x-emacs-lisp; charset="UTF-8"; name="shorthand.el" Content-Disposition: attachment; filename="shorthand.el" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_k9zyozi41 Ozs7IHNob3J0aGFuZC5lbCAtLS0gbmFtZXNwYWNpbmcgc3lzdGVtICAtKi0gbGV4aWNhbC1iaW5k aW5nOiB0OyAtKi0KCjs7IENvcHlyaWdodCAoQykgMjAyMCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uCgo7OyBBdXRob3I6IEpvw6NvIFTDoXZvcmEgPGpvYW90YXZvcmFAZ21haWwuY29tPgo7OyBL ZXl3b3JkczogbGFuZ3VhZ2VzLCBsaXNwCgo7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo7OyBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7 OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBM aWNlbnNlLCBvcgo7OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKOzsgVGhp cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYg bm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCjs7OyBDb21tZW50YXJ5 OgoKOzs7IENvZGU6CgoocmVxdWlyZSAnY2wtbGliKQoKKGRlZnZhciBzaG9ydGhhbmQtc2hvcnRo YW5kcyBuaWwpCihwdXQgJ3Nob3J0aGFuZC1zaG9ydGhhbmRzICdzYWZlLWxvY2FsLXZhcmlhYmxl ICMnY29uc3ApCgooZGVmdW4gc2hvcnRoYW5kLS1leHBhbmQtc2hvcnRoYW5kIChmb3JtKQogIChj bC10eXBlY2FzZSBmb3JtCiAgICAoY29ucyAoc2V0Y2FyIGZvcm0gKHNob3J0aGFuZC0tZXhwYW5k LXNob3J0aGFuZCAoY2FyIGZvcm0pKSkKICAgICAgICAgIChzZXRjZHIgZm9ybSAoc2hvcnRoYW5k LS1leHBhbmQtc2hvcnRoYW5kIChjZHIgZm9ybSkpKSkKICAgICh2ZWN0b3IgKGNsLWxvb3AgZm9y IGkgZnJvbSAwIGZvciBlIGFjcm9zcyBmb3JtCiAgICAgICAgICAgICAgICAgICAgIGRvIChhc2V0 IGZvcm0gaSAoc2hvcnRoYW5kLS1leHBhbmQtc2hvcnRoYW5kIGUpKSkpCiAgICAoc3ltYm9sIChs ZXQqICgobmFtZSAoc3ltYm9sLW5hbWUgZm9ybSkpKQogICAgICAgICAgICAgIChjbC1sb29wIGZv ciAoc2hvcnQtcGF0IC4gbG9uZy1wYXQpIGluIHNob3J0aGFuZC1zaG9ydGhhbmRzCiAgICAgICAg ICAgICAgICAgICAgICAgd2hlbiAoc3RyaW5nLW1hdGNoIHNob3J0LXBhdCBuYW1lKQogICAgICAg ICAgICAgICAgICAgICAgIGRvIChzZXRxIG5hbWUgKHJlcGxhY2UtbWF0Y2ggbG9uZy1wYXQgdCBu aWwgbmFtZSkpKQogICAgICAgICAgICAgIChzZXRxIGZvcm0gKGludGVybiBuYW1lKSkpKQogICAg KHN0cmluZykgKG51bWJlcikKICAgICh0ICAgICAgIChtZXNzYWdlICJbc2hvcnRoYW5kXSB1bmV4 cGVjdGdlZCAlcyIgKHR5cGUtb2YgZm9ybSkpKSkKICBmb3JtKQoKKGRlZnVuIHNob3J0aGFuZC1y ZWFkLXdyYXBwZXIgKHdyYXBwZWUgc3RyZWFtICZyZXN0IHN0dWZmKQogIChpZiAoYW5kIGxvYWQt ZmlsZS1uYW1lIChzdHJpbmctbWF0Y2ggIlxcLmVsYyQiIGxvYWQtZmlsZS1uYW1lKSkKICAgICAg KGFwcGx5IHdyYXBwZWUgc3RyZWFtIHN0dWZmKQogICAgKHNob3J0aGFuZC0tZXhwYW5kLXNob3J0 aGFuZAogICAgIChsZXQgKChvYmFycmF5IChvYmFycmF5LW1ha2UpKSkgKGFwcGx5IHdyYXBwZWUg c3RyZWFtIHN0dWZmKSkpKSkKCihkZWZ1biBzaG9ydGhhbmQtaW50ZXJuLXNvZnQtd3JhcHBlciAo d3JhcHBlZSBuYW1lICZyZXN0IHN0dWZmKQogIChsZXQgKChyZXMgKGFwcGx5IHdyYXBwZWUgbmFt ZSBzdHVmZikpKQogICAgKG9yIHJlcyAoY2wtbG9vcAogICAgICAgICAgICAgZm9yIChzaG9ydC1w YXQgLiBsb25nLXBhdCkgaW4gc2hvcnRoYW5kLXNob3J0aGFuZHMKICAgICAgICAgICAgIHRoZXJl aXMgKGFwcGx5IHdyYXBwZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYWNlLXJl Z2V4cC1pbi1zdHJpbmcgc2hvcnQtcGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGxvbmctcGF0IG5hbWUpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHVmZikpKSkpCgooZGVmdW4gc2hvcnRoYW5kLWxvYWQtd3JhcHBlciAod3JhcHBl ZSBmaWxlICZyZXN0IHN0dWZmKQogIChsZXQgKGZpbGUtbG9jYWwtc2hvcnRoYW5kcykKICAgICh3 aGVuIChmaWxlLXJlYWRhYmxlLXAgZmlsZSkKICAgICAgKHdpdGgtdGVtcC1idWZmZXIKICAgICAg ICAoaW5zZXJ0LWZpbGUtY29udGVudHMgZmlsZSkKICAgICAgICAoaGFjay1sb2NhbC12YXJpYWJs ZXMpCiAgICAgICAgKHNldHEgZmlsZS1sb2NhbC1zaG9ydGhhbmRzIHNob3J0aGFuZC1zaG9ydGhh bmRzKSkpCiAgICAobGV0ICgoc2hvcnRoYW5kLXNob3J0aGFuZHMgZmlsZS1sb2NhbC1zaG9ydGhh bmRzKSkKICAgICAgKGFwcGx5IHdyYXBwZWUgZmlsZSBzdHVmZikpKSkpCgooYWR2aWNlLWFkZCAn cmVhZCAgICAgICAgOmFyb3VuZCAjJ3Nob3J0aGFuZC1yZWFkLXdyYXBwZXIpCihhZHZpY2UtYWRk ICdpbnRlcm4tc29mdCA6YXJvdW5kICMnc2hvcnRoYW5kLWludGVybi1zb2Z0LXdyYXBwZXIpCihh ZHZpY2UtYWRkICdsb2FkICAgICAgICA6YXJvdW5kICMnc2hvcnRoYW5kLWxvYWQtd3JhcHBlcikK Cihwcm92aWRlICdzaG9ydGhhbmQpCjs7OyBzaG9ydGhhbmQuZWwgZW5kcyBoZXJlCg== --0000000000002671d005a53b6934--