From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brad Knotwell Subject: M4 support take#3 Date: Sun, 22 Apr 2018 17:20:58 +0000 (UTC) Message-ID: <780044045.3684079.1524417658433@mail.yahoo.com> References: <780044045.3684079.1524417658433.ref@mail.yahoo.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_3684078_1008163588.1524417658433" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:53892) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fAIfm-0001Eg-Br for emacs-orgmode@gnu.org; Sun, 22 Apr 2018 13:21:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fAIfh-0006uM-A9 for emacs-orgmode@gnu.org; Sun, 22 Apr 2018 13:21:10 -0400 Received: from sonic301-32.consmr.mail.ne1.yahoo.com ([66.163.184.201]:35242) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fAIfg-0006sx-SU for emacs-orgmode@gnu.org; Sun, 22 Apr 2018 13:21:05 -0400 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Nicolas Goaziou Cc: emacs-orgmode@gnu.org ------=_Part_3684078_1008163588.1524417658433 Content-Type: multipart/alternative; boundary="----=_Part_3684077_68107366.1524417658258" ------=_Part_3684077_68107366.1524417658258 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Thanks for the code review.=C2=A0 With one exception--:prefix-builtins is = an option not an argument--I've incorporated your feedback. As far as papers, I've read the information on that link several times and = it appears the simplest thing to do is for me to put these changes in the p= ublic domain.=C2=A0 If that works, let me know and I'll remove the license = and put in a disclaimer to that effect.=C2=A0 If not, it'll need to live in= contrib as the bureaucracy seems excessive. Thx. --Brad On Friday, April 13, 2018, 1:31:53 PM PDT, Nicolas Goaziou wrote: =20 =20 Hello, Brad Knotwell writes: > Given the code review from earlier, I've added a second file with the > requested changes. Thank you. Some minor comments follow. > (defconst org-babel-header-args:m4 >=C2=A0 '((:cmd-line . :any) >=C2=A0 =C2=A0 (:quote . :any) >=C2=A0 =C2=A0 (:unquote . :any) >=C2=A0 =C2=A0 (:list-start . :any) >=C2=A0 =C2=A0 (:list-end . :any) >=C2=A0 =C2=A0 (:prefix-builtins)) Missing allowed type for last header. Maybe :any ? > (defun org-babel--m4-prefix (params) >=C2=A0 "Prefix m4_ if :prefix-builtins is set" >=C2=A0 (if (assq :prefix-builtins params) "m4_" "")) > > (defun org-babel--m4-changequote (params) >=C2=A0 "Declare quoting behavior if start-quote and end-quote are set.=C2= =A0 Otherwise, return an empty string." The line is too long. The second sentence should go onto another line. >=C2=A0 (let ((prefix (org-babel--m4-prefix params)) > =C2=A0=C2=A0=C2=A0 (start-quote (cdr (assq :quote params))) > =C2=A0=C2=A0=C2=A0 (end-quote (cdr (assq :unquote params)))) >=C2=A0 =C2=A0 (if (and start-quote end-quote) (format "%schangequote(%s,%s= )%sdnl\n" prefix start-quote end-quote prefix) ""))) See above. > (defun org-babel--variable-assignment:m4_generic (params varname values) >=C2=A0 "Build the simple macro definitions prepended to the script body." >=C2=A0 (let ((prefix (org-babel--m4-prefix params))) > =C2=A0=C2=A0=C2=A0 (format "%sdefine(%s,%s)%sdnl\n" prefix varname values= prefix))) The (format ...) is not correctly indented. > (defun org-babel--variable-assignment:m4_list (params varname values) >=C2=A0 "Build the complex macro definitions prepended to the script body." >=C2=A0 (let ((prefix (org-babel--m4-prefix params)) > =C2=A0=C2=A0=C2=A0 (list-start (or (cdr (assq :list-start params)) "[")) > =C2=A0=C2=A0=C2=A0 (list-end (or (cdr (assq :list-end params)) "]"))) >=C2=A0 =C2=A0 (format "%sdefine(%s,%s%s%s)%sdnl\n" prefix varname list-sta= rt > =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 (mapconcat > =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 (lambda (value) > =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; value could be a numeric table= entry as well as a string > =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (=3D (length value) 1) (forma= t "%s" (car value)) > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (concat list-start (mapconcat (lamb= da (x) (format "%s" x)) value ",") > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 list-end))) valu= es ",") list-end prefix))) The line is too long. `values' should be below (lambda ...), so does ",". `list-end' and `prefix' should be below "%sdefine..." > (defun org-babel--variable-assignments:m4 (params varnames values) >=C2=A0 "Internal helper that converts parameters to m4 definitions." >=C2=A0 (pcase values >=C2=A0 =C2=A0 (`(,_ . ,_) (org-babel--variable-assignment:m4_list params v= arnames values)) >=C2=A0 =C2=A0 (_ (org-babel--variable-assignment:m4_generic params varname= s values)))) > > (defun org-babel-variable-assignments:m4 (params) >=C2=A0 "Interface function that converts parameters to m4 definitions." >=C2=A0 (concat (org-babel--m4-changequote params) > =C2=A0=C2=A0=C2=A0 =C2=A0 (apply #'concat (mapcar (lambda (pair) (org-bab= el--variable-assignments:m4 > =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 =C2=A0 params (car pair) (cdr pai= r))) > =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 (org-babel--get-vars params))))) (mapcar ...) should be below #'concat. > ;; Required to make tangling work > ;; The final "\n" is needed as GNU m4 errors out if a file doesn't end in= a newline. > (defun org-babel-expand-body:m4 (body params) >=C2=A0 "Expand BODY according to PARAMS, return the expanded body." >=C2=A0 (concat (org-babel-variable-assignments:m4 params) body "\n")) > > (defun org-babel-execute:m4 (body params) >=C2=A0 "Execute a block of m4 code with Org Babel. > BODY is the source inside a m4 source block and PARAMS is an > association list over the source block configurations.=C2=A0 This > function is called by `org-babel-execute-src-block'." >=C2=A0 (message "executing m4 source code block") >=C2=A0 (let* ((result-params (cdr (assq :result-params params))) >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cmd-line (cdr (assq :cmd-line params))= ) > =C2=A0=C2=A0=C2=A0 (prefix-builtins (assq :prefix-builtins params)) > =C2=A0=C2=A0=C2=A0 (code-file (let ((file (org-babel-temp-file "m4-"))) >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 (with-temp-file file > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (insert (org-bab= el-expand-body:m4 body params) file)) file)) Last `file' should be below (let ((file ...))). > =C2=A0=C2=A0=C2=A0 (stdin (let ((stdin (cdr (assq :stdin params)))) > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 (when stdin > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 (let ((tmp (org-babel= -temp-file "m4-stdin-")) > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 (res (org= -babel-ref-resolve stdin))) > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 (with-temp-fil= e tmp > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (insert res)) > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp)))) >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cmd (mapconcat #'identity > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (remq nil > =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 = =C2=A0 (list org-babel-m4-command > =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 cmd-line (if prefix-builtins "-P") "<" code-file)) (and prefix-builtins "-P") "<" and `code-file' should go below `#'identity'. I cannot remember: do you plan to have it integrated into Org proper? If so, have you started the process of signing FSF papers? Regards, --=20 Nicolas Goaziou =20 ------=_Part_3684077_68107366.1524417658258 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Thanks for the code review.  With one exception--:pre= fix-builtins is an option not an argument--I've incorporated your feedback.=

As far as papers, I've read the information on th= at link several times and it appears the simplest thing to do is for me to = put these changes in the public domain.  If that works, let me know an= d I'll remove the license and put in a disclaimer to that effect.  If = not, it'll need to live in contrib as the bureaucracy seems excessive.

Thx.

--Brad

=20
=20
On Friday, April 13, 2018, 1:31:53 PM PDT, Nicolas = Goaziou <mail@nicolasgoaziou.fr> wrote:


Hello,

Brad Knotwell <bknotwell@yahoo.com> writes:
> Given the code review from earlier,= I've added a second file with the
> requested changes= .


Thank you. Some minor comments= follow.

> (defconst org-babel-head= er-args:m4
>  '((:cmd-line . :any)
>    (:quote . :any)
>   = (:unquote . :any)
>    (:list-start . :an= y)
>    (:list-end . :any)
>    (:prefix-builtins))

Missing allowed type for last header. Maybe :any ?
> (defun org-babel--m4-prefix (params)
>  "Prefix m4_ if :prefix-builtins is set"
>=   (if (assq :prefix-builtins params) "m4_" ""))
>= ;
> (defun org-babel--m4-changequote (params)
>  "Declare quoting behavior if start-quote and end-quot= e are set.  Otherwise, return an empty string."

The line is too long. The second sentence should go onto ano= ther line.

>  (let ((prefix (= org-babel--m4-prefix params))
>     (st= art-quote (cdr (assq :quote params)))
>   &n= bsp; (end-quote (cdr (assq :unquote params))))
> =   (if (and start-quote end-quote) (format "%schangequote(%s,%s)%sdnl= \n" prefix start-quote end-quote prefix) "")))

See above.

> (defun org-b= abel--variable-assignment:m4_generic (params varname values)
>  "Build the simple macro definitions prepended to the script= body."
>  (let ((prefix (org-babel--m4-prefix p= arams)))
>     (format "%sdefine(%s,%s)= %sdnl\n" prefix varname values prefix)))

The (format ...) is not correctly indented.

> (defun org-babel--variable-assignment:m4_list (params varnam= e values)
>  "Build the complex macro definition= s prepended to the script body."
>  (let ((prefi= x (org-babel--m4-prefix params))
>     = (list-start (or (cdr (assq :list-start params)) "["))
>= ;     (list-end (or (cdr (assq :list-end params)) "]")))
>    (format "%sdefine(%s,%s%s%s)%sdnl\n" pref= ix varname list-start
>       &nbs= p; (mapconcat
>         (lam= bda (value)
>           = ;; value could be a numeric table entry as well as a string
>           (if (=3D (length value) 1= ) (format "%s" (car value))
>      = ;   (concat list-start (mapconcat (lambda (x) (format "%s" x)) v= alue ",")
>         &nbs= p;   list-end))) values ",") list-end prefix)))

The line is too long. `values' should be below (lambda= ...), so does
",". `list-end' and `prefix' should be bel= ow "%sdefine..."

> (defun org-babel= --variable-assignments:m4 (params varnames values)
>&n= bsp; "Internal helper that converts parameters to m4 definitions."
>  (pcase values
>    (= `(,_ . ,_) (org-babel--variable-assignment:m4_list params varnames values))=
>    (_ (org-babel--variable-assignment:m4= _generic params varnames values))))
>
> (defun org-babel-variable-assignments:m4 (params)
= >  "Interface function that converts parameters to m4 definitions.= "
>  (concat (org-babel--m4-changequote params)<= br clear=3D"none">>       (apply #'concat (mapcar (l= ambda (pair) (org-babel--variable-assignments:m4
> &nb= sp;               &n= bsp;         params (car pair) (cdr pair)))>           &nb= sp;       (org-babel--get-vars params)))))

(mapcar ...) should be below #'concat.

> ;; Required to make tangling work
> ;; The final "\n" is needed as GNU m4 errors out if a file d= oesn't end in a newline.
> (defun org-babel-expand-bod= y:m4 (body params)
>  "Expand BODY according to = PARAMS, return the expanded body."
>  (concat (o= rg-babel-variable-assignments:m4 params) body "\n"))
>=
> (defun org-babel-execute:m4 (body params)
>  "Execute a block of m4 code with Org Babel.
> BODY is the source inside a m4 source block and PARAMS is an=
> association list over the source block configuratio= ns.  This
> function is called by `org-babel-exec= ute-src-block'."
>  (message "executing m4 sourc= e code block")
>  (let* ((result-params (cdr (as= sq :result-params params)))
>      &nbs= p;   (cmd-line (cdr (assq :cmd-line params)))
> &= nbsp;   (prefix-builtins (assq :prefix-builtins params))
>     (code-file (let ((file (org-babel-temp-= file "m4-")))
>          &nbs= p;           (with-temp-file file
>             (insert (o= rg-babel-expand-body:m4 body params) file)) file))

Last `file' should be below (let ((file ...))).

>     (stdin (let ((stdin (cdr (a= ssq :stdin params))))
>       = ;    (when stdin
>      = ;       (let ((tmp (org-babel-temp-file "m4-stdin-"))<= br clear=3D"none">>           &n= bsp;   (res (org-babel-ref-resolve stdin)))
> &n= bsp;             (with-temp-file t= mp
>           = ;  (insert res))
>      &nbs= p;        tmp))))
>    =       (cmd (mapconcat #'identity
> &nbs= p;           (remq nil
>              =     (list org-babel-m4-command
>  &nb= sp;                &= nbsp; cmd-line (if prefix-builtins "-P") "<" code-file))

(and prefix-builtins "-P")

"<" and `code-file' should go below `#'identity'.

I cannot remember: do you plan to have it inte= grated into Org proper? If
so, have you started the proce= ss of signing FSF papers?

Regards,

--
Nicolas Goaziou
------=_Part_3684077_68107366.1524417658258-- ------=_Part_3684078_1008163588.1524417658433 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ob-m4.el" Content-ID: <463b4cd9-2d5d-e93c-2ffc-42151e94534d@yahoo.com> Ozs7IG9iLW00LmVsIC0tLSBCYWJlbCBGdW5jdGlvbnMgZm9yIG00IHNjcmlwdHMgICAgLSotIGxl eGljYWwtYmluZGluZzogdDsgLSotCgo7OyBDb3B5cmlnaHQgKEMpIDIwMTgtMjAxOCBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCjs7IEF1dGhvcjogQnJhZCBLbm90d2VsbAo7OyBLZXl3 b3JkczogbGl0ZXJhdGUgcHJvZ3JhbW1pbmcsIHJlcHJvZHVjaWJsZSByZXNlYXJjaAo7OyBWZXJz aW9uOiAwLjEuMAoKOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgoKOzsgR05VIEVt YWNzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkKOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVy IHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKOzsgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KCjs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAo7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCjs7IEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7OyBhbG9uZyB3aXRoIEdO VSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7 OzsgQ29tbWVudGFyeToKCjs7IFByb3ZpZGVzIGEgd2F5IHRvIGV2YWx1YXRlIG00IHNjcmlwdHMg aW4gT3JnIG1vZGUuCgo7OzsgVXNhZ2U6Cgo7OyBBZGQgdG8geW91ciBFbWFjcyBjb25maWc6Cgo7 OyAob3JnLWJhYmVsLWRvLWxvYWQtbGFuZ3VhZ2VzCjs7ICAnb3JnLWJhYmVsLWxvYWQtbGFuZ3Vh Z2VzCjs7ICAnKChtNCAuIHQpKSkKCjs7IEluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgaGVhZGVy IGFyZ3VtZW50cywgb2ItbTQgYWxzbyBwcm92aWRlcwo7OyBzaXggc3BlY2lmaWMgb3B0aW9uczoK OzsgIDpjbWQtbGluZSAtLSBhbGxvd3MgYSB1c2VyIHRvIGFwcGVuZCBhcmd1bWVudHMgdG8gdGhl IGNhbGwKOzsgIDpwcmVmaXgtYnVpbGRpbnMgLS0gY2FsbHMgd2l0aCB0aGUgLVAgb3B0aW9uIHRv IGF1dG9tYXRpY2FsbHkKOzsgICAgICAgcHJlZml4IGFsbCBidWlsdC1pbiBtYWNyb3Mgd2l0aCAn bTRfJwo7OyAgOnF1b3RlLzp1bnF1b3RlIC0tIHNldCB0aGUgbTQgcXVvdGluZyBjaGFyYWN0ZXJz IHRvIGEgbm9uLWRlZmF1bHQgdmFsdWUKOzsgIDpsaXN0LXN0YXJ0LzpsaXN0LWVuZCAtLSBkZWZh dWx0ICJbIiBhbmQgIl0iIGJ1dCBjYW4gYmUgc2V0IHRvIHNvbWV0aGluZyBlbHNlIChlLmcuICIo IiBhbmQgIikiKQo7OyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSB3YW50IHRvIHVz ZSAiWyIgYW5kICJdIiBhcyBxdW90ZSBjaGFyYWN0ZXJzCjs7Cjs7Cjs7IE5vdGU6ICBpdCBpcyBh IGJhZCBpZGVhIHRvIGV4cGxpY2l0bHkgcGFzcyB0aGUgIi1QIiBvcHRpb24gaW4gOmNtZC1saW5l IHRvIGVuYWJsZSBwcmVmaXhpbmcKOzsgYXMgYW55IGFyZ3VtZW50cyBzcGVjaWZpZWQgdmlhIHZh ciBOQU1FPXZhbHVlIHdpbGwgYmUgcHJlZml4ZWQgaW5jb3JyZWN0bHkuCjs7Cjs7IEV4cGxhaW5p bmcgdGhpcyB3aXRoIGEgYml0IG1vcmUgZGV0YWlsLCBhbGwgOnZhciBOQU1FPXZhbHVlIGFyZ3Vt ZW50cyBhcmUKOzsgcHJlcGVuZGVkIHRvIHRoZSBib2R5IGFzIGRlZmluaXRpb25zOgo7OyAgICAg ZGVmaW5lKE5BTUUsdmFsdWUpCjs7ICAgICAgICAgICAgb3IKOzsgICAgIG00X2RlZmluZShOQU1F LHZhbHVlKSBpZmYgOnByZWZpeC1idWlsdGlucyBpcyBzZXQKOzsKOzsgTm90ZTogIHRoZSA6cHJl Zml4LWJ1aWx0aW4gb3B0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIFBvc2l4IGNvbXBsaWFudCBt NCBpbXBsZW1lbnRhdGlvbnMuCjs7ICAgICAgICBUaGlzIGlzIGZpbmUgZm9yIHR3byByZWFzb25z Ogo7OyAgICAgICAgICAgKiBhIFBvc2l4IGNvbXBsaWFudCB1dGlsaXR5IGlzIGNvcnJlY3QgYnkg ZGVmYXVsdCBhcyB0aGUgLVAgb3B0aW9uIGlzIG9taXR0ZWQKOzsgICAgICAgICAgICogR05VJ3Mg bTQgaW1wbGVtZW50YXRpb24gaXMgKGVzc2VudGlhbGx5KSBzdGFuZGFyZCBhdCB0aGlzIHBvaW50 CihyZXF1aXJlICdvYikKCihkZWZ2YXIgb3JnLWJhYmVsLW00LWNvbW1hbmQgIm00IgogICJOYW1l IG9mIHRoZSBtNCBleGVjdXRhYmxlIGNvbW1hbmQuIikKCihkZWZ2YXIgb3JnLWJhYmVsLXRhbmds ZS1sYW5nLWV4dHMpCihhZGQtdG8tbGlzdCAnb3JnLWJhYmVsLXRhbmdsZS1sYW5nLWV4dHMgJygi bTQiIC4gIm00IikpCgo7OyBwcmVmaXgtYnVpbHRpbnMgaXMgYSBmbGFnCihkZWZjb25zdCBvcmct YmFiZWwtaGVhZGVyLWFyZ3M6bTQKICAnKCg6Y21kLWxpbmUgLiA6YW55KQogICAgKDpxdW90ZSAu IDphbnkpCiAgICAoOnVucXVvdGUgLiA6YW55KQogICAgKDpsaXN0LXN0YXJ0IC4gOmFueSkKICAg ICg6bGlzdC1lbmQgLiA6YW55KQogICAgKDpwcmVmaXgtYnVpbHRpbnMpKQogICJNNCBzcGVjaWZp YyBoZWFkZXIgYXJndW1lbnRzLiIpCgooZGVmdmFyIG9yZy1iYWJlbC1kZWZhdWx0LWhlYWRlci1h cmdzOm00ICcoKQogICJEZWZhdWx0IGFyZ3VtZW50cyBmb3IgZXZhbHVhdGluZyBhIG00IHNvdXJj ZSBibG9jay4iKQoKOzsgcGFzc2VkLWluIG1hY3JvIGRlZmluaXRpb25zIGFyZSBjb25zdHJ1Y3Rl ZCBhcyBhIHNpbmdsZSBzdHJpbmcgdGhhdCBpcwo7OyBwcmVwZW5kZWQgdG8gdGhlIHNjcmlwdCBi b2R5Lgo7Owo7OyA6cHJlZml4LWJ1aWx0aW5zIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIC1QIG9wdGlv biB0byB3b3JrCgooZGVmdW4gb3JnLWJhYmVsLS1tNC1wcmVmaXggKHBhcmFtcykKICAiUHJlZml4 IG00XyBpZiA6cHJlZml4LWJ1aWx0aW5zIGlzIHNldCIKICAoaWYgKGFzc3EgOnByZWZpeC1idWls dGlucyBwYXJhbXMpICJtNF8iICIiKSkKCihkZWZ1biBvcmctYmFiZWwtLW00LWNoYW5nZXF1b3Rl IChwYXJhbXMpCiAgIkRlY2xhcmUgcXVvdGluZyBiZWhhdmlvciBpZiBzdGFydC1xdW90ZSBhbmQg ZW5kLXF1b3RlIGFyZSBzZXQuCk90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4iCiAg KGxldCAoKHByZWZpeCAob3JnLWJhYmVsLS1tNC1wcmVmaXggcGFyYW1zKSkKCShzdGFydC1xdW90 ZSAoY2RyIChhc3NxIDpxdW90ZSBwYXJhbXMpKSkKCShlbmQtcXVvdGUgKGNkciAoYXNzcSA6dW5x dW90ZSBwYXJhbXMpKSkpCiAgICAoaWYgKGFuZCBzdGFydC1xdW90ZSBlbmQtcXVvdGUpCgkoZm9y bWF0ICIlc2NoYW5nZXF1b3RlKCVzLCVzKSVzZG5sXG4iIHByZWZpeCBzdGFydC1xdW90ZSBlbmQt cXVvdGUgcHJlZml4KSAiIikpKQoKKGRlZnVuIG9yZy1iYWJlbC0tdmFyaWFibGUtYXNzaWdubWVu dDptNF9nZW5lcmljIChwYXJhbXMgdmFybmFtZSB2YWx1ZXMpCiAgIkJ1aWxkIHRoZSBzaW1wbGUg bWFjcm8gZGVmaW5pdGlvbnMgcHJlcGVuZGVkIHRvIHRoZSBzY3JpcHQgYm9keS4iCiAgKGxldCAo KHByZWZpeCAob3JnLWJhYmVsLS1tNC1wcmVmaXggcGFyYW1zKSkpCiAgICAoZm9ybWF0ICIlc2Rl ZmluZSglcywlcyklc2RubFxuIiBwcmVmaXggdmFybmFtZSB2YWx1ZXMgcHJlZml4KSkpCgooZGVm dW4gb3JnLWJhYmVsLS12YXJpYWJsZS1hc3NpZ25tZW50Om00X2xpc3QgKHBhcmFtcyB2YXJuYW1l IHZhbHVlcykKICAiQnVpbGQgdGhlIGNvbXBsZXggbWFjcm8gZGVmaW5pdGlvbnMgcHJlcGVuZGVk IHRvIHRoZSBzY3JpcHQgYm9keS4iCiAgKGxldCAoKHByZWZpeCAob3JnLWJhYmVsLS1tNC1wcmVm aXggcGFyYW1zKSkKCShsaXN0LXN0YXJ0IChvciAoY2RyIChhc3NxIDpsaXN0LXN0YXJ0IHBhcmFt cykpICJbIikpCgkobGlzdC1lbmQgKG9yIChjZHIgKGFzc3EgOmxpc3QtZW5kIHBhcmFtcykpICJd IikpKQogICAgKGZvcm1hdCAiJXNkZWZpbmUoJXMsJXMlcyVzKSVzZG5sXG4iIHByZWZpeCB2YXJu YW1lIGxpc3Qtc3RhcnQKCSAgICAobWFwY29uY2F0CgkgICAgIChsYW1iZGEgKHZhbHVlKQoJICAg ICAgIDs7IHZhbHVlIGNvdWxkIGJlIGEgbnVtZXJpYyB0YWJsZSBlbnRyeSBhcyB3ZWxsIGFzIGEg c3RyaW5nCgkgICAgICAgKGlmICg9IChsZW5ndGggdmFsdWUpIDEpIChmb3JtYXQgIiVzIiAoY2Fy IHZhbHVlKSkKCQkgKGNvbmNhdCBsaXN0LXN0YXJ0IChtYXBjb25jYXQgKGxhbWJkYSAoeCkgKGZv cm1hdCAiJXMiIHgpKSB2YWx1ZSAiLCIpCgkJCSBsaXN0LWVuZCkpKQoJICAgICB2YWx1ZXMgIiwi KQoJICAgIGxpc3QtZW5kIHByZWZpeCkpKQoKKGRlZnVuIG9yZy1iYWJlbC0tdmFyaWFibGUtYXNz aWdubWVudHM6bTQgKHBhcmFtcyB2YXJuYW1lcyB2YWx1ZXMpCiAgIkludGVybmFsIGhlbHBlciB0 aGF0IGNvbnZlcnRzIHBhcmFtZXRlcnMgdG8gbTQgZGVmaW5pdGlvbnMuIgogIChwY2FzZSB2YWx1 ZXMKICAgIChgKCxfIC4gLF8pIChvcmctYmFiZWwtLXZhcmlhYmxlLWFzc2lnbm1lbnQ6bTRfbGlz dCBwYXJhbXMgdmFybmFtZXMgdmFsdWVzKSkKICAgIChfIChvcmctYmFiZWwtLXZhcmlhYmxlLWFz c2lnbm1lbnQ6bTRfZ2VuZXJpYyBwYXJhbXMgdmFybmFtZXMgdmFsdWVzKSkpKQoKKGRlZnVuIG9y Zy1iYWJlbC12YXJpYWJsZS1hc3NpZ25tZW50czptNCAocGFyYW1zKQogICJJbnRlcmZhY2UgZnVu Y3Rpb24gdGhhdCBjb252ZXJ0cyBwYXJhbWV0ZXJzIHRvIG00IGRlZmluaXRpb25zLiIKICAoY29u Y2F0IChvcmctYmFiZWwtLW00LWNoYW5nZXF1b3RlIHBhcmFtcykKCSAgKGFwcGx5ICMnY29uY2F0 CgkJIChtYXBjYXIgKGxhbWJkYSAocGFpcikgKG9yZy1iYWJlbC0tdmFyaWFibGUtYXNzaWdubWVu dHM6bTQKCQkJCQkgcGFyYW1zIChjYXIgcGFpcikgKGNkciBwYWlyKSkpCgkJCSAob3JnLWJhYmVs LS1nZXQtdmFycyBwYXJhbXMpKSkpKQoKOzsgUmVxdWlyZWQgdG8gbWFrZSB0YW5nbGluZyB3b3Jr Cjs7IFRoZSBmaW5hbCAiXG4iIGlzIG5lZWRlZCBhcyBHTlUgbTQgZXJyb3JzIG91dCBpZiBhIGZp bGUgZG9lc24ndCBlbmQgaW4gYSBuZXdsaW5lLgooZGVmdW4gb3JnLWJhYmVsLWV4cGFuZC1ib2R5 Om00IChib2R5IHBhcmFtcykKICAiRXhwYW5kIEJPRFkgYWNjb3JkaW5nIHRvIFBBUkFNUywgcmV0 dXJuIHRoZSBleHBhbmRlZCBib2R5LiIKICAoY29uY2F0IChvcmctYmFiZWwtdmFyaWFibGUtYXNz aWdubWVudHM6bTQgcGFyYW1zKSBib2R5ICJcbiIpKQoKKGRlZnVuIG9yZy1iYWJlbC1leGVjdXRl Om00IChib2R5IHBhcmFtcykKICAiRXhlY3V0ZSBhIGJsb2NrIG9mIG00IGNvZGUgd2l0aCBPcmcg QmFiZWwuCkJPRFkgaXMgdGhlIHNvdXJjZSBpbnNpZGUgYSBtNCBzb3VyY2UgYmxvY2sgYW5kIFBB UkFNUyBpcyBhbgphc3NvY2lhdGlvbiBsaXN0IG92ZXIgdGhlIHNvdXJjZSBibG9jayBjb25maWd1 cmF0aW9ucy4gIFRoaXMKZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGBvcmctYmFiZWwtZXhlY3V0ZS1z cmMtYmxvY2snLiIKICAobWVzc2FnZSAiZXhlY3V0aW5nIG00IHNvdXJjZSBjb2RlIGJsb2NrIikK ICAobGV0KiAoKHJlc3VsdC1wYXJhbXMgKGNkciAoYXNzcSA6cmVzdWx0LXBhcmFtcyBwYXJhbXMp KSkKICAgICAgICAgKGNtZC1saW5lIChjZHIgKGFzc3EgOmNtZC1saW5lIHBhcmFtcykpKQoJIChw cmVmaXgtYnVpbHRpbnMgKGFzc3EgOnByZWZpeC1idWlsdGlucyBwYXJhbXMpKQoJIChjb2RlLWZp bGUgKGxldCAoKGZpbGUgKG9yZy1iYWJlbC10ZW1wLWZpbGUgIm00LSIpKSkKICAgICAgICAgICAg ICAgICAgICAgICh3aXRoLXRlbXAtZmlsZSBmaWxlCgkJCShpbnNlcnQgKG9yZy1iYWJlbC1leHBh bmQtYm9keTptNCBib2R5IHBhcmFtcykgZmlsZSkpCgkJICAgICAgZmlsZSkpCgkgKHN0ZGluIChs ZXQgKChzdGRpbiAoY2RyIChhc3NxIDpzdGRpbiBwYXJhbXMpKSkpCgkJICAgKHdoZW4gc3RkaW4K CQkgICAgIChsZXQgKCh0bXAgKG9yZy1iYWJlbC10ZW1wLWZpbGUgIm00LXN0ZGluLSIpKQoJCQkg ICAocmVzIChvcmctYmFiZWwtcmVmLXJlc29sdmUgc3RkaW4pKSkKCQkgICAgICAgKHdpdGgtdGVt cC1maWxlIHRtcAoJCQkgKGluc2VydCByZXMpKQoJCSAgICAgICB0bXApKSkpCiAgICAgICAgIChj bWQgKG1hcGNvbmNhdCAjJ2lkZW50aXR5CgkJCSAocmVtcSBuaWwKCQkJICAgICAgIChsaXN0IG9y Zy1iYWJlbC1tNC1jb21tYW5kCgkJCQkgICAgIGNtZC1saW5lIChhbmQgcHJlZml4LWJ1aWx0aW5z ICItUCIpCgkJCQkgICAgICI8IiBjb2RlLWZpbGUpKQoJCQkgIiAiKSkpCiAgICAob3JnLWJhYmVs LXJlYXNzZW1ibGUtdGFibGUKICAgICAobGV0ICgocmVzdWx0cwogICAgICAgICAgICAoY29uZAog ICAgICAgICAgICAgKHN0ZGluICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgICAgICAgICAgICAgICAg ICAoY2FsbC1wcm9jZXNzLXNoZWxsLWNvbW1hbmQgY21kIHN0ZGluIChjdXJyZW50LWJ1ZmZlcikp CiAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN0cmluZykpKQogICAgICAgICAgICAgKHQg KG9yZy1iYWJlbC1ldmFsIGNtZCAiIikpKSkpCiAgICAgICAod2hlbiByZXN1bHRzCiAgICAgICAg IChvcmctYmFiZWwtcmVzdWx0LWNvbmQgcmVzdWx0LXBhcmFtcwoJICAgcmVzdWx0cwoJICAgKGxl dCAoKHRtcCAob3JnLWJhYmVsLXRlbXAtZmlsZSAibTQtcmVzdWx0cy0iKSkpCgkgICAgICh3aXRo LXRlbXAtZmlsZSB0bXAgKGluc2VydCByZXN1bHRzKSkKCSAgICAgKG9yZy1iYWJlbC1pbXBvcnQt ZWxpc3AtZnJvbS1maWxlIHRtcCkpKSkpCiAgICAgKG9yZy1iYWJlbC1waWNrLW5hbWUKICAgICAg KGNkciAoYXNzcSA6Y29sbmFtZS1uYW1lcyBwYXJhbXMpKSAoY2RyIChhc3NxIDpjb2xuYW1lcyBw YXJhbXMpKSkKICAgICAob3JnLWJhYmVsLXBpY2stbmFtZQogICAgICAoY2RyIChhc3NxIDpyb3du YW1lLW5hbWVzIHBhcmFtcykpIChjZHIgKGFzc3EgOnJvd25hbWVzIHBhcmFtcykpKSkpKQoKKHBy b3ZpZGUgJ29iLW00KQo7Ozsgb2ItbTQuZWwgZW5kcyBoZXJlCg== ------=_Part_3684078_1008163588.1524417658433--