From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id IAguHVAwd2djLAAA62LTzQ:P1 (envelope-from ) for ; Fri, 03 Jan 2025 00:33:20 +0000 Received: from aspmx1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1.migadu.com with LMTPS id IAguHVAwd2djLAAA62LTzQ (envelope-from ) for ; Fri, 03 Jan 2025 01:33:20 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20230601 header.b=YWMrMntK; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1735864400; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=UfDVqglEKsXD6QetDwD9xNElFyWOSqcEXIQgZ0KlukU=; b=RrdzAq1RlWZcslncG16RY9Ks+nxYG5vXFWabBsKin6vLfJXcEpmxbN6uZCvOp9+CK9dtFA D58WUJsBFJUrtzlvQF6a1vbANbGQAzH2LKUhpaTEnuY7oA+XSQxxwkCbwpdfaWb5Hd+dLx 8JSh7TkPSnE3WZIdojSE+Vk5vemjTCsiXNGWhpJLzZZlljNz9nZseYyrsGUGNJEGKVHYMq UDwE+b3J27dNOVWmY/03c447McXDdQVOtboTlhBnd1nF15F5uZX3Dd5uqJs0GtgryoEGCj 5XC1oBNb5BYjTMQICTAJzL/uwvPyAkQ8kkpLXWojCyv854XjUfdhKldpBICk+w== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20230601 header.b=YWMrMntK; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1735864400; a=rsa-sha256; cv=none; b=eNjeMdVDPDXA7o6BW53lGFt1W3axPGE1+PGj3abSW+r6B2c2Wv5MufiluaxWSQW6yzyHKP 58po6Lb6/dZAgSMEBndFwtlcGPgqPp1eVfpntAG3qOTOhTzNRCAC752xhBk7IhE5mtnsg5 fDOcbW5zbI5usz7yulkKQJ2UKphzCxoh7QVyELaAQjqk5sv8dxOXMAocVHCV+jsrDd1xAC KMZgQVhwXYSdft+g8brU4tFEfQxrk/D3Hw5bt2O3kUPsMAhgHkiNLAq0lobEAipMcZfFBQ 4zXbBJxkuPCXTDE/NUelX9cqpcynW0sLuy1Ny/IbJjMevZac1ZHt1hwQay5UiA== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id A77BB47EBA for ; Fri, 03 Jan 2025 01:33:19 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tTV3y-0001G1-Ac; Thu, 02 Jan 2025 18:57:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tTV3s-0001C6-HE for emacs-orgmode@gnu.org; Thu, 02 Jan 2025 18:57:08 -0500 Received: from mail-ed1-x536.google.com ([2a00:1450:4864:20::536]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tTV3m-00056l-1Z for emacs-orgmode@gnu.org; Thu, 02 Jan 2025 18:57:07 -0500 Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-5d3f28a4fccso18361504a12.2 for ; Thu, 02 Jan 2025 15:57:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735862220; x=1736467020; darn=gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=VJhcAEba+HZ+ZSK/s5G4DoTeF0ET2SS6CWN9E1ZX3fQ=; b=YWMrMntKZ28VQBxTGSXWJIgsvqV3T75UFA06yaPGxxKpbhUS3BE3PwgzG458KHFcIY +qd0ZzSL6RgnYCjNu2xDhmLEt+eG5bOOUZLf+n+2GzQMA99e4HvJokoYXOONeUYoPRuq 0qYX7k8IazRikct+EiSvxl+qfUoYCvyFFIK0zN5AHdN+wAEqRVd8QPI/Hj4rRfrePLNX fOITtIOwvJgMlKSjPK4RFSHGLnwahpRHLgMn0AP3qTCjEEI1mVPnk70Miko9sEzvZ3No ECWpaHfVA6OdrSEJwhCBDZRyn1atV2tEoYkod92awafBJPZkOfd8fr06KCKSn5Boafqg y3DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735862220; x=1736467020; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=VJhcAEba+HZ+ZSK/s5G4DoTeF0ET2SS6CWN9E1ZX3fQ=; b=r+XUU/DUE22WEXaQBMrSHXZXvwreA3d2pm6ArdHTpCMTk4GFc97+xpcutZVrT+Q65e QiBMJWphZuABHAgBNPZRmrTF8m9VTotHuXANJkCYKa2FjEDmLT+jKhJDs2DfhX4qndAR CedHkoBwB+EZ0G+NuvV6wTHnR/HclZuUXTExwfg9Fs0FAg8EXAPyNypdSUI2BCrDTG6U F3oklh7H/3+74l6AwT314iejF5ijaasAmQu2UoYpSUTBvqkLyKVL+yXZIHsWf2Xqpzqv 15qtBr3ODNL5jYyT765fqpzv4zfo9miOCYQqaGqrXhPE6n5bKhryHsi/ADVatwqkoSw6 R+Yw== X-Gm-Message-State: AOJu0Yz0opyV3x4CkDQlXJmno+jB1A9eNOq6c8e/IcmRLNOTAmORInGp hikCvZDuyZh30x54IiunhrRc1FVH0S6ztOObfzNgagRH5zT8xhrEFc2SK3YpfSsPA8NdR/ZwBi1 unZZSzMgHmPNPBcqLD/kHcZSKLZU= X-Gm-Gg: ASbGnculvNixFRyVxGuWDFqX4eth6Jad//0230FpNV/A2l7hzAATaJhVxyYyMoTJ1Mg p8k/nbaA8lHR0tHtWi+nGHVl72ZvKDiUjxx0hWw== X-Google-Smtp-Source: AGHT+IE77Zk01B1iZCcvJWdm+DNrHI9x1MCTEgm5Sj10Q49dHiLcOQvDuCyEfXRVlA2HvHG/kQFzsfGOXDksoT/AUuw= X-Received: by 2002:a05:6402:4018:b0:5d4:1ac2:277f with SMTP id 4fb4d7f45d1cf-5d81dd892ffmr40490219a12.9.1735862220291; Thu, 02 Jan 2025 15:57:00 -0800 (PST) MIME-Version: 1.0 References: <87pln4g3b2.fsf@localhost> <87cyim9c4t.fsf@localhost> <87o712lv3t.fsf@localhost> <87msgfvssp.fsf@localhost> In-Reply-To: From: John C Date: Thu, 2 Jan 2025 18:56:48 -0500 Message-ID: Subject: Re: ob-octave: improve MATLAB support To: Ihor Radchenko Cc: emacs-orgmode@gnu.org Content-Type: multipart/mixed; boundary="0000000000000539db062ac1eb7a" Received-SPF: pass client-ip=2a00:1450:4864:20::536; envelope-from=john.ciolfi.32@gmail.com; helo=mail-ed1-x536.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Scanner: mx11.migadu.com X-Migadu-Spam-Score: 4.20 X-Spam-Score: 4.20 X-Migadu-Queue-Id: A77BB47EBA X-TUID: 1SP49ibhssEV --0000000000000539db062ac1eb7a Content-Type: multipart/alternative; boundary="0000000000000539d9062ac1eb78" --0000000000000539d9062ac1eb78 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Attaching the updated org-matlab.patch On Thu, Jan 2, 2025 at 6:55=E2=80=AFPM John C wr= ote: > Hi > > Thanks for the feedback. See updated org-matlab.patch. Note > code evaluation will now error out when using an out-of-date matlab-mode > (rather than generating a warning) because when using an older matlab-mod= e, > code block evaluation doesn't work. We need to wait for the matlab-shell = to > be ready. Without that capability found in newer matlab-mode, the errors > are very hard to understand. I also added tests. Using steps outlined in > the ob-matlab-test.el comment to setup for MATLAB testing, I get on Linux= : > > matlab-mode, version 6.3 > Detected MATLAB R2024b (24.2) -- Loading history file > matlab-shell: starting server with name server-2055614 > passed 127/1250 ob-matlab/results-file-graphics (9.712776 sec) > passed 128/1250 ob-matlab/results-file-graphics-with-space (0.33200= 4 > sec) > passed 129/1250 ob-matlab/results-output (0.013681 sec) > passed 130/1250 ob-matlab/results-output-latex (0.459980 sec) > passed 131/1250 ob-matlab/results-output-preserve-whitespace > (0.281001 sec) > passed 132/1250 ob-matlab/results-output-reuse-a (0.039130 sec) > passed 133/1250 ob-matlab/results-output-reuse-b (0.043762 sec) > passed 134/1250 ob-matlab/results-output-reuse-clear (0.301597 sec) > passed 135/1250 ob-matlab/results-verbatim (0.172567 sec) > > You mentioned that we should expect org users to understand sessions, > however the doc on sessions is a bit light. Searching > https://orgmode.org/org.html for "session", we see it used two different > ways "Emacs session" and babel code block evaluations sessions described = in > "Using sessions". What is there is okay, but doesn't really help one > understand when they should/shouldn't use babel code block evaluation > sessions. What would be nice is if "Using sessions" were titled "Babel co= de > block evaluation sessions" containing the existing content minus the "Onl= y > languages that provide interactive evaluation ..." paragraph because this > is vague. In addition, each language should have a way of describing what > :session means to them, perhaps by extracting this info from ob-LANGUAGE.= el > or maybe ob-LANGUAGE.org, or maybe something else that inserts the langua= ge > specific into the org manual. > > With good MATLAB integration in org-mode, we'll see scientists and > engineers who have limited programming background leverage org-mode for > their scientific papers. Not having to worry about more advanced concepts > like sessions is nice, so thanks for letting us default the :session for > MATLAB to make it work as one would expect. > > Here's the commit info: > > ob-matlab.el: improve MATLAB support > > * lisp/ob-matlab.el (header): Update URL for MATLAB > > * lisp/ob-octave.el (org-babel-octave-evaluate): Fixed MATLAB support > - Deprecate variables related to MATLAB Emacs Link and removed the code= . > Emacs Link capability was removed from MATLAB release R2009a, 15 year= s > ago. > - Fixed the following type of org block evaluation: > 1) #+begin_src matlab :results verbatim > 2) #+begin_src matlab :results output > 3) #+begin_src matlab :results output latex > 4) #+begin_src matlab :results file graphics > which aid in writing scientific papers. > - Minor point, the correct spelling of MATLAB when referencing the > product is > all upper case. > > * lisp/ob-comint.el: enhanced org-babel-comint-with-output > - The META argument of org-babel-comint-with-output now supports an > optional > STRIP-REGEXPS which can be used to remove content from the returned > output. > > * lisp/org.el > - Add MATLAB as one of the options for org-babel-load-languages > > * mk/default.mk > - Add support for testing matlab code blocks. > > * testing/examples/ob-matlab-test.org, testing/lisp/test-ob-matlab.el > - Test for matlab code block. > > * testing/org-test.el > - Added org-test-get-code-block which is for use by > testing/lisp/test*.el files > to extract code blocks from testing/examples/*.org files for on-the-f= ly > testing using org-test-with-temp-text. > > * etc/ORG-NEWS (New functions and changes in function arguments): > Added entry "ob-octave: improved MATLAB support" > > Thanks > John > > > On Sun, Dec 29, 2024 at 2:41=E2=80=AFAM Ihor Radchenko > wrote: > >> John C writes: >> >> > See attached org-matlab.patch which addresses all feedback. Here's the >> > commit info. >> >> Thanks! >> See my comments inline. >> >> > +*** ob-matlab: fixed MATLAB support >> > + >> > +Fixed MATLAB babel code blocks processing. MATLAB code blocks, >> ~#+begin_src matlab~, with ~:results >> > +verbatim~, ~:results output~, ~:results output latex~, or ~:results >> file graphics~ now work. Fixes >> > +include (1) waiting for matlab-shell to start before evaluating MATLA= B >> code, (2) correctly showing >> > +the results using writematrix, (3) removing the code block lines from >> the result, (4) correctly >> > +handling graphics results by invoking print correctly. To use MATLAB >> with org, you need >> > +https://github.com/MathWorks/Emacs-MATLAB-Mode. >> >> There is no need to provide so many details. >> Just leave the most important things: >> >> 1. MATLAB is no longer broken >> 2. Emacs-MATLAB-Mode is required now >> >> > +*** ob-matlab: MATLAB behavior change >> > + >> > +MATLAB code blocks now reuse the ~MATLAB*~ buffer created by ~M-x >> matlab-shell~, whereas the >> > +prior version started a new shell for each evaluation. The benefit o= f >> this is that >> > +evaluations are very fast after the first evaluation and that state i= s >> maintained between >> > +evaluations, which you can clear using the MATLAB ~clear~ command. >> Another benefit of this >> > +behavior is that it is consistent with how MATLAB works. >> >> No need to explain in so much details, I think. >> Just say that MATLAB uses session by default and them mention that users >> may customize `org-babel-default-header-args:matlab' to disable session. >> >> > +(defun org-babel-comint--strip-regexps (result strip-regexps) >> > + "STRIP-REGEXPS from RESULT list of strings." >> > + (dolist (strip-regexp strip-regexps) >> > + (let ((new-result '())) >> > + (dolist (line result) >> > + (setq line (replace-regexp-in-string strip-regexp "" line)) >> > + (when (not (string=3D line "")) >> > + (setq new-result (append new-result `(,line))))) >> >> It is more efficient to use `push' + `nreverse' instead of `append'. >> >> > -(defvar org-babel-default-header-args:matlab '()) >> > +;; With `org-babel-default-header-args:matlab' set to >> > +;; '((:session . "*MATLAB*"))) >> > +;; ... >> > +;; If you want a new session each time you evaluate a MATLAB code >> block, >> > +;; (setq 'org-babel-default-header-args:matlab '()) >> > +;; However, this will make evaluations slower and is not consistent >> with how >> > +;; MATLAB works. MATLAB is designed for many evaluations. >> > +(defvar org-babel-default-header-args:matlab '((:session . >> "*MATLAB*"))) >> >> You don't need that long comment in the source code. >> If you think that explaining the details about session is necessary (it >> may or may not be, but we should assume that Org users are familiar with >> the notion of sessions in code blocks), please do it in the >> documentation, not in the code. >> >> More generally, your motivation is not specific to matlab. Yet, we >> default to no session in most babel backends. So, it is not a question >> of session being faster or slower, but a question of consistency. >> >> That said, some babel backends do default to session, so I do not oppose >> this change too much. >> >> > +(make-obsolete-variable 'org-babel-matlab-with-emacs-link >> > + "MATLAB removed EmacsLink in R2009a." "2009") >> > + >> > +(make-obsolete-variable 'org-babel-matlab-emacs-link-wrapper-method >> > + "MATLAB removed EmacsLink in R2009a." "2009") >> >> Please use Org version in WHEN argument of `make-obsolete-variable'. >> The WHEN should be "9.8". >> >> > +(defun org-babel-matlab-shell () >> > + "Start and/or wait for MATLAB shell." >> > + (require 'matlab-shell) ;; make `matlab-shell-busy-checker' availab= le >> > + (cond >> > + ((fboundp 'matlab-shell-busy-checker) >> > + ;; Start the shell if needed. `matlab-shell' will reuse existing >> if already running. >> > + (matlab-shell) >> > + ;; If we just started the matlab-shell, wait for the prompt. If >> we do not >> > + ;; wait, then the startup messages will show up in the evaluation >> results. >> > + (matlab-shell-busy-checker 'wait-for-prompt)) >> > + (t >> > + (message (concat "You version of matlab-mode is old.\n" >> > + "Please update, see >> https://github.com/mathworks/Emacs-MATLAB-Mode\n" >> > + "Updating will eliminate unexpected output in >> your results\n")) >> > + (sit-for 3) >> >> Instead of `message' + `sit-fit', you can simply use `display-warning'. >> It will give users more control. >> >> > +(defun org-babel-body-for-output (body matlabp) >> > + "If MATLABP, fixup BODY for MATLAB output result-type." >> > + (when matlabp >> > + ;; When we send multi-line input to `matlab-shell', we'll see the >> "body" >> > + ;; code lines echoed in the output which is not what one would >> expect. To >> > + ;; remove these unwanted lines, we append a comment "%-= " >> to each >> > + ;; line in the body MATLAB code. After we collect the results fr= om >> > + ;; evaluation, we leverage the "%-" to remove the >> unwanted lines. >> > + ;; Example of desired behavior: >> > ... >> >> I think that an important point here is that MATLAB does not echo the >> whole BODY all at once and instead mixes it with the output. Which is >> why we need to do something non-standard to filter out the body in >> matlab specifically. >> >> > + (setq body (replace-regexp-in-string "\n" " %--\n" body= )) >> > + (when (not (string-match "\n\\'" body)) >> > + (setq body (concat body " %--")))) >> > + body) >> >> Please put this %- into an internal constant and then reuse >> it when building the regexp to filter. >> >> > + (when matlabp >> > + '(;; MATLAB echo's all input lines, so use the >> %- comments to strip >> > + ;; them from the output >> > + "^[^\n]*%--\n" >> > + ;; Remove starting blank line caused by stripping >> %- >> > + "\\`[[:space:]\r\n]+" >> > + ;; Strip and matlab-shell >> error indicators >> > + "\n"))) >> >> Same here. Please put these regexps into a constant. >> >> -- >> Ihor Radchenko // yantar92, >> Org mode maintainer, >> Learn more about Org mode at . >> Support Org development at , >> or support my work at >> > --0000000000000539d9062ac1eb78 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Attaching the updated org-matlab.patch

On Thu, Jan 2, 2025 at 6:55=E2=80=AFPM John C <john.ciolfi.32@gmail.com> wrote:
Hi

Thanks for the feedback. See updated org-matlab.patch. Note code= =C2=A0evaluation will now error out when using an out-of-date matlab-mode (= rather than generating a warning) because when using an older matlab-mode, = code block evaluation doesn't work. We need to wait for the matlab-shel= l to be ready. Without that capability found=C2=A0in newer matlab-mode, the= errors are very hard to understand. I also added tests. Using steps outlin= ed in the ob-matlab-test.el comment to setup for MATLAB testing, I get on L= inux:

matlab-mode, version 6.3
Detected MATLAB R2024b (24.2) = =C2=A0-- Loading history file
matlab-shell: starting server with name se= rver-2055614
=C2=A0 =C2=A0passed =C2=A0 127/1250 =C2=A0ob-matlab/results= -file-graphics (9.712776 sec)
=C2=A0 =C2=A0passed =C2=A0 128/1250 =C2=A0= ob-matlab/results-file-graphics-with-space (0.332004 sec)
=C2=A0 =C2=A0p= assed =C2=A0 129/1250 =C2=A0ob-matlab/results-output (0.013681 sec)
=C2= =A0 =C2=A0passed =C2=A0 130/1250 =C2=A0ob-matlab/results-output-latex (0.45= 9980 sec)
=C2=A0 =C2=A0passed =C2=A0 131/1250 =C2=A0ob-matlab/results-ou= tput-preserve-whitespace (0.281001 sec)
=C2=A0 =C2=A0passed =C2=A0 132/1= 250 =C2=A0ob-matlab/results-output-reuse-a (0.039130 sec)
=C2=A0 =C2=A0p= assed =C2=A0 133/1250 =C2=A0ob-matlab/results-output-reuse-b (0.043762 sec)=
=C2=A0 =C2=A0passed =C2=A0 134/1250 =C2=A0ob-matlab/results-output-reus= e-clear (0.301597 sec)
=C2=A0 =C2=A0passed =C2=A0 135/1250 =C2=A0ob-matl= ab/results-verbatim (0.172567 sec)

You mentioned tha= t we should expect org users to understand sessions, however the doc on ses= sions is a bit light. Searching https://orgmode.org/org.html for "session", w= e see it used two different ways "Emacs session" and babel code b= lock evaluations sessions described in "Using sessions". What is = there is okay, but doesn't really help one understand when they should/= shouldn't use babel code block evaluation sessions. What would be nice = is if "Using sessions" were titled "Babel code block evaluat= ion sessions" containing the existing content minus the "Only lan= guages that provide interactive evaluation ..." paragraph because this= is vague. In addition, each language should have a way of describing what = :session means to them, perhaps by extracting this info from ob-LANGUAGE.el= or maybe ob-LANGUAGE.org, or maybe something else that inserts the languag= e specific into the org manual.

With good MATLAB integration in org-= mode, we'll see scientists and engineers who have limited programming b= ackground leverage org-mode for their scientific papers. Not having to worr= y about more advanced concepts like sessions is nice, so thanks for letting= us default the :session for MATLAB to make it work as one would expect.

Here's the commit info:

=
ob-matlab.el: improve MATLAB support

*= lisp/ob-matlab.el (header): Update URL for MATLAB

* lisp/ob-octave.= el (org-babel-octave-evaluate): Fixed MATLAB support
=C2=A0 - Deprecate = variables related to MATLAB Emacs Link and removed the code.
=C2=A0 =C2= =A0 Emacs Link capability was removed from MATLAB release R2009a, 15 years = ago.
=C2=A0 - Fixed the following type of org block evaluation:
=C2= =A0 =C2=A0 1) #+begin_src matlab :results verbatim
=C2=A0 =C2=A0 2) #+be= gin_src matlab :results output
=C2=A0 =C2=A0 3) #+begin_src matlab :resu= lts output latex
=C2=A0 =C2=A0 4) #+begin_src matlab :results file graph= ics
=C2=A0 =C2=A0 which aid in writing scientific papers.
=C2=A0 - Mi= nor point, the correct spelling of MATLAB when referencing the product is=C2=A0 =C2=A0 all upper case.

* lisp/ob-comint.el: enhanced org-ba= bel-comint-with-output
=C2=A0 - The META argument of org-babel-comint-wi= th-output now supports an optional
=C2=A0 =C2=A0 STRIP-REGEXPS which can= be used to remove content from the returned output.

* lisp/org.el=C2=A0 - Add MATLAB as one of the options for org-babel-load-languages
* mk/default.mk=C2=A0 - Add support for testing matlab code blocks.

* testing/exam= ples/ob-matlab-test= .org, testing/lisp/test-ob-matlab.el
=C2=A0 - Test for matlab code b= lock.

* testing/org-test.el
=C2=A0 - Added org-test-get-code-bloc= k which is for use by testing/lisp/test*.el files
=C2=A0 =C2=A0 to extra= ct code blocks from testing/examples/*.org files for on-the-fly
=C2=A0 = =C2=A0 testing using org-test-with-temp-text.

* etc/ORG-NEWS (New fu= nctions and changes in function arguments):
=C2=A0 Added entry "ob-= octave: improved MATLAB support"

T= hanks
John


On Sun, Dec 29, 2024 at 2:41=E2=80= =AFAM Ihor Radchenko <yantar92@posteo.net> wrote:
John C <john.ciolfi.32@gmail.com> writes:

> See attached org-matlab.patch which addresses all feedback. Here's= the
> commit info.

Thanks!
See my comments inline.

> +*** ob-matlab: fixed MATLAB support
> +
> +Fixed MATLAB babel code blocks processing. MATLAB code blocks, ~#+beg= in_src matlab~, with ~:results
> +verbatim~, ~:results output~, ~:results output latex~, or ~:results f= ile graphics~ now work.=C2=A0 Fixes
> +include (1) waiting for matlab-shell to start before evaluating MATLA= B code, (2) correctly showing
> +the results using writematrix, (3) removing the code block lines from= the result, (4) correctly
> +handling graphics results by invoking print correctly. To use MATLAB = with org, you need
> +https://github.com/MathWorks/Emacs-MATLAB-Mode.

There is no need to provide so many details.
Just leave the most important things:

1. MATLAB is no longer broken
2. Emacs-MATLAB-Mode is required now

> +*** ob-matlab: MATLAB behavior change
> +
> +MATLAB code blocks now reuse the ~MATLAB*~ buffer created by ~M-x mat= lab-shell~, whereas the
> +prior version started a new shell for each evaluation.=C2=A0 The bene= fit of this is that
> +evaluations are very fast after the first evaluation and that state i= s maintained between
> +evaluations, which you can clear using the MATLAB ~clear~ command.=C2= =A0 Another benefit of this
> +behavior is that it is consistent with how MATLAB works.

No need to explain in so much details, I think.
Just say that MATLAB uses session by default and them mention that users may customize `org-babel-default-header-args:matlab' to disable session= .

> +(defun org-babel-comint--strip-regexps (result strip-regexps)
> +=C2=A0 "STRIP-REGEXPS from RESULT list of strings."
> +=C2=A0 (dolist (strip-regexp strip-regexps)
> +=C2=A0 =C2=A0 (let ((new-result '()))
> +=C2=A0 =C2=A0 =C2=A0 (dolist (line result)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq line (replace-regexp-in-string stri= p-regexp "" line))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (not (string=3D line ""))=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq new-result (append new-resul= t `(,line)))))

It is more efficient to use `push' + `nreverse' instead of `append&= #39;.

> -(defvar org-babel-default-header-args:matlab '())
> +;; With `org-babel-default-header-args:matlab' set to
> +;;=C2=A0 '((:session . "*MATLAB*")))
> +;; ...
> +;; If you want a new session each time you evaluate a MATLAB code blo= ck,
> +;;=C2=A0 =C2=A0(setq 'org-babel-default-header-args:matlab '(= ))
> +;; However, this will make evaluations slower and is not consistent w= ith how
> +;; MATLAB works.=C2=A0 MATLAB is designed for many evaluations.
> +(defvar org-babel-default-header-args:matlab '((:session . "= *MATLAB*")))

You don't need that long comment in the source code.
If you think that explaining the details about session is necessary (it
may or may not be, but we should assume that Org users are familiar with the notion of sessions in code blocks), please do it in the
documentation, not in the code.

More generally, your motivation is not specific to matlab. Yet, we
default to no session in most babel backends. So, it is not a question
of session being faster or slower, but a question of consistency.

That said, some babel backends do default to session, so I do not oppose this change too much.

> +(make-obsolete-variable 'org-babel-matlab-with-emacs-link
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 "MATLAB removed EmacsLink in R2009a." "2009&q= uot;)
> +
> +(make-obsolete-variable 'org-babel-matlab-emacs-link-wrapper-meth= od
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 "MATLAB removed EmacsLink in R2009a." "2009&q= uot;)

Please use Org version in WHEN argument of `make-obsolete-variable'. The WHEN should be "9.8".

> +(defun org-babel-matlab-shell ()
> +=C2=A0 "Start and/or wait for MATLAB shell."
> +=C2=A0 (require 'matlab-shell) ;; make `matlab-shell-busy-checker= ' available
> +=C2=A0 (cond
> +=C2=A0 =C2=A0((fboundp 'matlab-shell-busy-checker)
> +=C2=A0 =C2=A0 ;; Start the shell if needed.=C2=A0 `matlab-shell' = will reuse existing if already running.
> +=C2=A0 =C2=A0 (matlab-shell)
> +=C2=A0 =C2=A0 ;; If we just started the matlab-shell, wait for the pr= ompt.=C2=A0 If we do not
> +=C2=A0 =C2=A0 ;; wait, then the startup messages will show up in the = evaluation results.
> +=C2=A0 =C2=A0 (matlab-shell-busy-checker 'wait-for-prompt))
> +=C2=A0 =C2=A0(t
> +=C2=A0 =C2=A0 (message (concat "You version of matlab-mode is ol= d.\n"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0"Please update, see
https://github.com= /mathworks/Emacs-MATLAB-Mode\n"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0"Updating will eliminate unexpected output in your results\n&qu= ot;))
> +=C2=A0 =C2=A0 (sit-for 3)

Instead of `message' + `sit-fit', you can simply use `display-warni= ng'.
It will give users more control.

> +(defun org-babel-body-for-output (body matlabp)
> +=C2=A0 "If MATLABP, fixup BODY for MATLAB output result-type.&qu= ot;
> +=C2=A0 (when matlabp
> +=C2=A0 =C2=A0 ;; When we send multi-line input to `matlab-shell',= we'll see the "body"
> +=C2=A0 =C2=A0 ;; code lines echoed in the output which is not what on= e would expect.=C2=A0 To
> +=C2=A0 =C2=A0 ;; remove these unwanted lines, we append a comment &qu= ot;%-<org-eval>" to each
> +=C2=A0 =C2=A0 ;; line in the body MATLAB code.=C2=A0 After we collect= the results from
> +=C2=A0 =C2=A0 ;; evaluation, we leverage the "%-<org-eval>= " to remove the unwanted lines.
> +=C2=A0 =C2=A0 ;; Example of desired behavior:
> ...

I think that an important point here is that MATLAB does not echo the
whole BODY all at once and instead mixes it with the output. Which is
why we need to do something non-standard to filter out the body in
matlab specifically.

> +=C2=A0 =C2=A0 (setq body (replace-regexp-in-string "\n" &qu= ot; %-<org-eval>-\n" body))
> +=C2=A0 =C2=A0 (when (not (string-match "\n\\'" body)) > +=C2=A0 =C2=A0 =C2=A0 (setq body (concat body " %-<org-eval>= ;-"))))
> +=C2=A0 body)

Please put this %-<org-eval> into an internal constant and then reuse=
it when building the regexp to filter.

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when matlabp<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'(;= ; MATLAB echo's all input lines, so use the %-<org-eval> comments= to strip
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= ;; them from the output
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= "^[^\n]*%-<org-eval>-\n"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= ;; Remove starting blank line caused by stripping %-<org-eval>
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= "\\`[[:space:]\r\n]+"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= ;; Strip <ERRORTXT> and </ERRORTXT> matlab-shell error indicato= rs
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= "</?ERRORTXT>\n")))

Same here. Please put these regexps into a constant.

--
Ihor Radchenko // yantar92,
Org mode maintainer,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,=
or support my work at <https://liberapay.com/yantar92>
--0000000000000539d9062ac1eb78-- --0000000000000539db062ac1eb7a Content-Type: text/x-patch; charset="US-ASCII"; name="org-matlab.patch" Content-Disposition: attachment; filename="org-matlab.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m5fzjewk0 ZGlmZiAtLWdpdCBhL2V0Yy9PUkctTkVXUyBiL2V0Yy9PUkctTkVXUwppbmRleCA1ZDQyMTE3MmYu LjRmOTUyM2NmMyAxMDA2NDQKLS0tIGEvZXRjL09SRy1ORVdTCisrKyBiL2V0Yy9PUkctTkVXUwpA QCAtMTYyLDYgKzE2MiwxNyBAQCBiaWJsaW9ncmFwaHkgZm9ybWF0IHJlcXVpcmVzIHRoZW0gdG8g YmUgd3JpdHRlbiBpbiB0aXRsZS1jYXNlLgogCiAjIFRoaXMgYWxzbyBpbmNsdWRlcyBjaGFuZ2Vz IGluIGZ1bmN0aW9uIGJlaGF2aW9yIGZyb20gRWxpc3AgcGVyc3BlY3RpdmUuCiAKKyoqKiBvYi1t YXRsYWI6IGZpeGVkIE1BVExBQiBzdXBwb3J0CisKK0ZpeGVkIE1BVExBQiBiYWJlbCBjb2RlIGJs b2NrcyBwcm9jZXNzaW5nLiBNQVRMQUIgY29kZSBibG9ja3MsIH4jK2JlZ2luX3NyYyBtYXRsYWJ+ LCB3aXRoIH46cmVzdWx0cwordmVyYmF0aW1+LCB+OnJlc3VsdHMgb3V0cHV0fiwgfjpyZXN1bHRz IG91dHB1dCBsYXRleH4sIG9yIH46cmVzdWx0cyBmaWxlIGdyYXBoaWNzfiBub3cgd29yay4gIFRv IHVzZQorTUFUTEFCIHdpdGggb3JnLCB5b3UgbmVlZCBodHRwczovL2dpdGh1Yi5jb20vTWF0aFdv cmtzL0VtYWNzLU1BVExBQi1Nb2RlLgorCisqKiogb2ItbWF0bGFiOiBNQVRMQUIgYmVoYXZpb3Ig Y2hhbmdlCisKK01BVExBQiBjb2RlIGJsb2NrcyBub3cgcmV1c2UgdGhlIH5NQVRMQUIqfiBidWZm ZXIgY3JlYXRlZCBieSB+TS14IG1hdGxhYi1zaGVsbH4gYnkgZGVmYXVsdC4gVG8KK2NoYW5nZSB0 aGlzIGJlaGF2aW9yLCBjdXN0b21pemUgfm9yZy1iYWJlbC1kZWZhdWx0LWhlYWRlci1hcmdzOm1h dGxhYn4uCisKICoqKiBvYi1zcWxpdGU6IEFkZGVkIGFiaWxpdHkgdG8gb3BlbiBhIGRhdGFiYXNl IGluIHJlYWRvbmx5IG1vZGUKIAogQWRkZWQgb3B0aW9uIDpyZWFkb25seSB0byBvYi1zcWxpdGUu CmRpZmYgLS1naXQgYS9saXNwL29iLWNvbWludC5lbCBiL2xpc3Avb2ItY29taW50LmVsCmluZGV4 IGI4OGFjNDQ1YS4uMjI0NmJhZGMyIDEwMDY0NAotLS0gYS9saXNwL29iLWNvbWludC5lbAorKysg Yi9saXNwL29iLWNvbWludC5lbApAQCAtMTAxLDE1ICsxMDEsMjggQEAgUFJPTVBULVJFR0VYUCBk ZWZhdWx0cyB0byBgY29taW50LXByb21wdC1yZWdleHAnLiIKICAgICAgICAoc2V0cSBzdHJpbmcg KHN1YnN0cmluZyBzdHJpbmcgKG1hdGNoLWVuZCAwKSkpKQogICBzdHJpbmcpCiAKKyhkZWZ1biBv cmctYmFiZWwtY29taW50LS1zdHJpcC1yZWdleHBzIChyZXN1bHQgc3RyaXAtcmVnZXhwcykKKyAg IlNUUklQLVJFR0VYUFMgZnJvbSBSRVNVTFQgbGlzdCBvZiBzdHJpbmdzLiIKKyAgKGRvbGlzdCAo c3RyaXAtcmVnZXhwIHN0cmlwLXJlZ2V4cHMpCisgICAgKGxldCAoKG5ldy1yZXN1bHQgJygpKSkK KyAgICAgIChkb2xpc3QgKHN0ciByZXN1bHQpCisgICAgICAgIChzZXRxIHN0ciAocmVwbGFjZS1y ZWdleHAtaW4tc3RyaW5nIHN0cmlwLXJlZ2V4cCAiIiBzdHIpKQorICAgICAgICAod2hlbiAobm90 IChzdHJpbmc9IHN0ciAiIikpCisgICAgICAgICAgKHB1c2ggc3RyIG5ldy1yZXN1bHQpKSkKKyAg ICAgIChzZXRxIHJlc3VsdCAobnJldmVyc2UgbmV3LXJlc3VsdCkpKSkKKyAgcmVzdWx0KQorCiAo ZGVmbWFjcm8gb3JnLWJhYmVsLWNvbWludC13aXRoLW91dHB1dCAobWV0YSAmcmVzdCBib2R5KQog ICAiRXZhbHVhdGUgQk9EWSBpbiBCVUZGRVIgYW5kIHJldHVybiBwcm9jZXNzIG91dHB1dC4KIFdp bGwgd2FpdCB1bnRpbCBFT0UtSU5ESUNBVE9SIGFwcGVhcnMgaW4gdGhlIG91dHB1dCwgdGhlbiBy ZXR1cm4KIGFsbCBwcm9jZXNzIG91dHB1dC4gIElmIFJFTU9WRS1FQ0hPIGFuZCBGVUxMLUJPRFkg YXJlIHByZXNlbnQgYW5kCi1ub24tbmlsLCB0aGVuIHN0cmlwIGVjaG8nZCBib2R5IGZyb20gdGhl IHJldHVybmVkIG91dHB1dC4gIE1FVEEKLXNob3VsZCBiZSBhIGxpc3QgY29udGFpbmluZyB0aGUg Zm9sbG93aW5nIHdoZXJlIHRoZSBsYXN0IHR3bwotZWxlbWVudHMgYXJlIG9wdGlvbmFsLgorbm9u LW5pbCwgdGhlbiBzdHJpcCBlY2hvZWQgYm9keSBmcm9tIHRoZSByZXR1cm5lZCBvdXRwdXQuICBJ Zgorb3B0aW9uYWwgU1RSSVAtUkVHRVhQUywgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMs IGlzCitwcmVzZW50LCB0aGVuIGFsbCBtYXRjaGVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBy ZXR1cm5lZAorb3V0cHV0LiAgTUVUQSBzaG91bGQgYmUgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGZv bGxvd2luZyB3aGVyZSB0aGUKK2xhc3QgdGhyZWUgZWxlbWVudHMgYXJlIG9wdGlvbmFsLgogCi0g KEJVRkZFUiBFT0UtSU5ESUNBVE9SIFJFTU9WRS1FQ0hPIEZVTEwtQk9EWSkKKyAoQlVGRkVSIEVP RS1JTkRJQ0FUT1IgUkVNT1ZFLUVDSE8gRlVMTC1CT0RZIFNUUklQLVJFR0VYUFMpCiAKIFRoaXMg bWFjcm8gZW5zdXJlcyB0aGF0IHRoZSBmaWx0ZXIgaXMgcmVtb3ZlZCBpbiBjYXNlIG9mIGFuIGVy cm9yCiBvciB1c2VyIGBrZXlib2FyZC1xdWl0JyBkdXJpbmcgZXhlY3V0aW9uIG9mIGJvZHkuIgpA QCAtMTE3LDcgKzEzMCw4IEBAIG9yIHVzZXIgYGtleWJvYXJkLXF1aXQnIGR1cmluZyBleGVjdXRp b24gb2YgYm9keS4iCiAgIChsZXQgKChidWZmZXIgKG50aCAwIG1ldGEpKQogCShlb2UtaW5kaWNh dG9yIChudGggMSBtZXRhKSkKIAkocmVtb3ZlLWVjaG8gKG50aCAyIG1ldGEpKQotCShmdWxsLWJv ZHkgKG50aCAzIG1ldGEpKSkKKwkoZnVsbC1ib2R5IChudGggMyBtZXRhKSkKKyAgICAgICAgKHN0 cmlwLXJlZ2V4cHMgKG50aCA0IG1ldGEpKSkKICAgICBgKG9yZy1iYWJlbC1jb21pbnQtaW4tYnVm ZmVyICxidWZmZXIKICAgICAgICAobGV0KiAoKHN0cmluZy1idWZmZXIgIiIpCiAJICAgICAgKGNv bWludC1vdXRwdXQtZmlsdGVyLWZ1bmN0aW9ucwpAQCAtMTY1LDggKzE3OSwxMiBAQCBvciB1c2Vy IGBrZXlib2FyZC1xdWl0JyBkdXJpbmcgZXhlY3V0aW9uIG9mIGJvZHkuIgogICAgICAgICAgKGFu ZCAscmVtb3ZlLWVjaG8gLGZ1bGwtYm9keQogICAgICAgICAgICAgICAoc2V0cSBzdHJpbmctYnVm ZmVyIChvcmctYmFiZWwtY29taW50LS1lY2hvLWZpbHRlciBzdHJpbmctYnVmZmVyICxmdWxsLWJv ZHkpKSkKIAotICAgICAgICAgOzsgRmlsdGVyIG91dCBwcm9tcHRzLgotICAgICAgICAgKG9yZy1i YWJlbC1jb21pbnQtLXByb21wdC1maWx0ZXIgc3RyaW5nLWJ1ZmZlcikpKSkpCisgICAgICAgICA7 OyBGaWx0ZXIgb3V0IHByb21wdHMgZnJvbSByZXR1cm5lZCBvdXRwdXQgcmVzdWx0LgorICAgICAg ICAgKGxldCAoKHJlc3VsdCAob3JnLWJhYmVsLWNvbWludC0tcHJvbXB0LWZpbHRlciBzdHJpbmct YnVmZmVyKSkpCisgICAgICAgICAgIDs7IFJlbW92ZSBhbGwgbWF0Y2hlcyBvZiBTVFJJUC1SRUdF WFBTIGluIHJldHVybmVkIG91dHB1dCByZXN1bHQuCisgICAgICAgICAgICh3aGVuICxzdHJpcC1y ZWdleHBzCisgICAgICAgICAgICAgKHNldHEgcmVzdWx0IChvcmctYmFiZWwtY29taW50LS1zdHJp cC1yZWdleHBzIHJlc3VsdCAsc3RyaXAtcmVnZXhwcykpKQorICAgICAgICAgICByZXN1bHQpKSkp KQogCiAoZGVmdW4gb3JnLWJhYmVsLWNvbWludC1pbnB1dC1jb21tYW5kIChidWZmZXIgY21kKQog ICAiUGFzcyBDTUQgdG8gQlVGRkVSLgpkaWZmIC0tZ2l0IGEvbGlzcC9vYi1tYXRsYWIuZWwgYi9s aXNwL29iLW1hdGxhYi5lbAppbmRleCBkZThkZWFkYmUuLjA4M2RjZGVjMyAxMDA2NDQKLS0tIGEv bGlzcC9vYi1tYXRsYWIuZWwKKysrIGIvbGlzcC9vYi1tYXRsYWIuZWwKQEAgLTI4LDExICsyOCwx MCBAQAogCiA7OzsgUmVxdWlyZW1lbnRzOgogCi07OyBNYXRsYWIKLQotOzsgbWF0bGFiLmVsIHJl cXVpcmVkIGZvciBpbnRlcmFjdGl2ZSBlbWFjcyBzZXNzaW9ucyBhbmQgbWF0bGFiLW1vZGUKLTs7 IG1ham9yIG1vZGUgZm9yIHNvdXJjZSBjb2RlIGVkaXRpbmcgYnVmZmVyCi07OyBodHRwczovL21h dGxhYi1lbWFjcy5zb3VyY2Vmb3JnZS5uZXQvCis7OyAxKSBNQVRMQUIKKzs7IDIpIGh0dHBzOi8v Z2l0aHViLmNvbS9tYXRod29ya3MvRW1hY3MtTUFUTEFCLU1vZGUKKzs7ICAgIEZvciBtYXRsYWIt c2hlbGwgdG8gcnVuIE1BVExBQiB3aXRoaW4gRW1hY3MgYW5kIG1hdGxhYi1tb2RlCis7OyAgICBt YWpvciBtb2RlIGZvciBzb3VyY2UgY29kZSBlZGl0aW5nIGJ1ZmZlcgogCiA7OzsgQ29kZToKIApk aWZmIC0tZ2l0IGEvbGlzcC9vYi1vY3RhdmUuZWwgYi9saXNwL29iLW9jdGF2ZS5lbAppbmRleCAw MDU5OTBmMjAuLjVlNjIyZGY5YSAxMDA2NDQKLS0tIGEvbGlzcC9vYi1vY3RhdmUuZWwKKysrIGIv bGlzcC9vYi1vY3RhdmUuZWwKQEAgLTEsOCArMSw4IEBACi07Ozsgb2Itb2N0YXZlLmVsIC0tLSBC YWJlbCBGdW5jdGlvbnMgZm9yIE9jdGF2ZSBhbmQgTWF0bGFiIC0qLSBsZXhpY2FsLWJpbmRpbmc6 IHQ7IC0qLQorOzs7IG9iLW9jdGF2ZS5lbCAtLS0gQmFiZWwgRnVuY3Rpb25zIGZvciBPY3RhdmUg YW5kIE1BVExBQiAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KIAogOzsgQ29weXJpZ2h0IChD KSAyMDEwLTIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLTs7IEF1dGhvcjog RGFuIERhdmlzb24KKzs7IEF1dGhvcjogRGFuIERhdmlzb24gKE9jdGF2ZSksIEpvaG4gQ2lvbGZp IChNQVRMQUIpCiA7OyBLZXl3b3JkczogbGl0ZXJhdGUgcHJvZ3JhbW1pbmcsIHJlcHJvZHVjaWJs ZSByZXNlYXJjaAogOzsgVVJMOiBodHRwczovL29yZ21vZGUub3JnCiAKQEAgLTMwLDYgKzMwLDgg QEAKIAogOzs7IENvZGU6CiAKKyhyZXF1aXJlICdjbC1zZXEpCisKIChyZXF1aXJlICdvcmctbWFj cykKIChvcmctYXNzZXJ0LXZlcnNpb24pCiAKQEAgLTM5LDcgKzQxLDExIEBACiAoZGVjbGFyZS1m dW5jdGlvbiBtYXRsYWItc2hlbGwgImV4dDptYXRsYWItbW9kZSIpCiAoZGVjbGFyZS1mdW5jdGlv biBtYXRsYWItc2hlbGwtcnVuLXJlZ2lvbiAiZXh0Om1hdGxhYi1tb2RlIikKIAotKGRlZnZhciBv cmctYmFiZWwtZGVmYXVsdC1oZWFkZXItYXJnczptYXRsYWIgJygpKQorKGRlZnZhciBvcmctYmFi ZWwtZGVmYXVsdC1oZWFkZXItYXJnczptYXRsYWIgJygoOnNlc3Npb24gLiAiKk1BVExBQioiKSkK KyAgIlJldXNlIHRoZSBtYXRsYWItc2hlbGwgYnVmZmVyIGZvciBjb2RlIGJsb2NrIGV2YWx1YXRp b25zLgorQWRkIHRoZSBNQVRMQUIgY2xlYXIgY29tbWFuZCB0byB5b3VyIGNvZGUgYmxvY2sgdG8g Y2xlYXIgdGhlCitNQVRMQUIgd29ya3NwYWNlLiIpCisKIChkZWZ2YXIgb3JnLWJhYmVsLWRlZmF1 bHQtaGVhZGVyLWFyZ3M6b2N0YXZlICcoKSkKIAogKGRlZnZhciBvcmctYmFiZWwtbWF0bGFiLXNo ZWxsLWNvbW1hbmQgIm1hdGxhYiAtbm9zcGxhc2giCkBAIC00NywxOCArNTMsNDIgQEAKIChkZWZ2 YXIgb3JnLWJhYmVsLW9jdGF2ZS1zaGVsbC1jb21tYW5kICJvY3RhdmUgLXEiCiAgICJTaGVsbCBj b21tYW5kIHRvIHJ1biBvY3RhdmUgYXMgYW4gZXh0ZXJuYWwgcHJvY2Vzcy4iKQogCi0oZGVmdmFy IG9yZy1iYWJlbC1tYXRsYWItd2l0aC1lbWFjcy1saW5rIG5pbAotICAiSWYgbm9uLW5pbCB1c2Ug bWF0bGFiLXNoZWxsLXJ1bi1yZWdpb24gZm9yIHNlc3Npb24gZXZhbHVhdGlvbi4KLVRoaXMgd2ls bCB1c2UgRW1hY3NMaW5rIGlmIChtYXRsYWItd2l0aC1lbWFjcy1saW5rKSBldmFsdWF0ZXMKLXRv IGEgbm9uLW5pbCB2YWx1ZS4iKQotCi0oZGVmdmFyIG9yZy1iYWJlbC1tYXRsYWItZW1hY3MtbGlu ay13cmFwcGVyLW1ldGhvZAotICAiJXMKLWlmIGlzY2hhcihhbnMpLCBmaWQgPSBmb3BlbignJXMn LCAndycpOyBmcHJpbnRmKGZpZCwgJyUlc1xcbicsIGFucyk7IGZjbG9zZShmaWQpOwotZWxzZSwg c2F2ZSAtYXNjaWkgJXMgYW5zCi1lbmQKLWRlbGV0ZSgnJXMnKQorKG1ha2Utb2Jzb2xldGUtdmFy aWFibGUgJ29yZy1iYWJlbC1tYXRsYWItd2l0aC1lbWFjcy1saW5rCisgICAgICAgICAgICAgICAg ICAgICAgICAiTUFUTEFCIHJlbW92ZWQgRW1hY3NMaW5rIGluIFIyMDA5YS4iICI5LjgiKQorCiso bWFrZS1vYnNvbGV0ZS12YXJpYWJsZSAnb3JnLWJhYmVsLW1hdGxhYi1lbWFjcy1saW5rLXdyYXBw ZXItbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAiTUFUTEFCIHJlbW92ZWQgRW1hY3NM aW5rIGluIFIyMDA5YS4iICI5LjgiKQorCisoZGVmdmFyIG9yZy1iYWJlbC1tYXRsYWItcHJpbnQg InByaW50KFwiLWRwbmdcIiwgJVMpO1xuYW5zPSVTOyIKKyAgOzsgTUFUTEFCIGNvbW1hbmQtZnVu Y3Rpb24gZHVhbGl0eSByZXF1aXJlcyB0aGF0IHRoZSBmaWxlIG5hbWUgYmUgc3BlY2lmaWVkCisg IDs7IHdpdGhvdXQgcXVvdGVzLiBVc2luZzogcHJpbnQgLWRwbmcgImZpbGUucG5nIiwgd291bGQg cHJvZHVjZSBhIGZpbGUgd2l0aAorICA7OyB0aGUgcXVvdGVzIGluIHRoZSBmaWxlIG5hbWUgb24g ZGlzay4gVGhlcmVmb3JlLCB1c2UgdGhlIGZ1bmN0aW9uYWwgZm9ybQorICA7OyB0byBoYW5kbGUg ZmlsZXMgd2l0aCBzcGFjZXMsIHByaW50KCItZHBuZyIsICJmaWxlLnBuZyIpLgorICA7OyBFeGFt cGxlOgorICA7OyAgICAjK2JlZ2luX3NyYyBtYXRsYWIgOmZpbGUgInNpbmUgd2F2ZS5wbmciIDpy ZXN1bHRzIGZpbGUgZ3JhcGhpY3MKKyAgOzsgICAgICB0ID0gWzAgOiAwLjEgOiAyKnBpXTsKKyAg OzsgICAgICB5ID0gc2luKHQpOworICA7OyAgICAgIHBsb3QodCwgeSk7CisgIDs7ICAgICAgc2V0 KGdjZiwgJ1BhcGVyVW5pdHMnLCAnaW5jaGVzJywgJ1BhcGVyUG9zaXRpb24nLCBbMCAwIDQgM10p ICUgU2V0IHRoZSBzaXplIHRvIDQiIHggMyIKKyAgOzsgICAgIytlbmRfc3JjCisgIDs7CisgIDs7 ICAgICMrUkVTVUxUUzoKKyAgOzsgICAgW1tmaWxlOnNpbmUgd2F2ZS5wbmddXQorICAiTUFUTEFC IGZvcm1hdCBzcGVjaWZpZXIgdG8gcHJpbnQgY3VycmVudCBmaWd1cmUgdG8gYSBmaWxlLiIpCisK KyhkZWZ2YXIgb3JnLWJhYmVsLW9jdGF2ZS1wcmludCAicHJpbnQgLWRwbmcgJVNcbmFucz0lUyIK KyAgIk9jdGF2ZSBmb3JtYXQgc3BlY2lmaWVyIHRvIHByaW50IGN1cnJlbnQgZmlndXJlIHRvIGEg ZmlsZS4iKQorCisoZGVmdmFyIG9yZy1iYWJlbC1tYXRsYWItd3JhcHBlci1tZXRob2QKKyAgKGNv bmNhdCAiXAorY2QoJyVzJyk7CislcworaWYgfmV4aXN0KCdhbnMnLCAndmFyJykgYW5zID0gJyc7 IGVuZDsgXAord3JpdGVtYXRyaXgoYW5zLCAnJXMnLCAnRGVsaW1pdGVyJywgJ3RhYicpOwogIikK KyAgIkZvcm1hdCBzcGVjaWZpZXIgdXNlZCB3aGVuIGV2YWx1YXRpbmcgTUFUTEFCIGNvZGUgYmxv Y2tzLgorQXJndW1lbnRzIGFyZSB0aGUgYGRlZmF1bHQtZGlyZWN0b3J5JywgdGhlIE1BVExBQiBj b2RlLCBhbmQgYSByZXN1bHQgZmlsZS50eHQuIikKKwogKGRlZnZhciBvcmctYmFiZWwtb2N0YXZl LXdyYXBwZXItbWV0aG9kCiAgICIlcwogaWYgaXNjaGFyKGFucyksIGZpZCA9IGZvcGVuKCclcycs ICd3Jyk7IGZkaXNwKGZpZCwgYW5zKTsgZmNsb3NlKGZpZCk7CkBAIC05Miw3ICsxMjIsMTAgQEAg V2hlbiBNQVRMQUJQIGlzIG5vbi1uaWwsIGV4ZWN1dGUgTWF0bGFiLiAgT3RoZXJ3aXNlLCBleGVj dXRlIE9jdGF2ZS4iCiAJCQkJIChsaXN0CiAJCQkJICAic2V0ICgwLCBcImRlZmF1bHRmaWd1cmV2 aXNpYmxlXCIsIFwib2ZmXCIpOyIKIAkJCQkgIGZ1bGwtYm9keQotCQkJCSAgKGZvcm1hdCAicHJp bnQgLWRwbmcgJVNcbmFucz0lUyIgZ2Z4LWZpbGUgZ2Z4LWZpbGUpKQorCQkJCSAgKGZvcm1hdCAo aWYgbWF0bGFicAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG9yZy1iYWJlbC1tYXRsYWItcHJpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb3JnLWJhYmVsLW9jdGF2ZS1wcmludCkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdmeC1maWxlIGdmeC1maWxlKSkKIAkJCQkgIlxuIikKIAkJ ICAgIGZ1bGwtYm9keSkKIAkJICByZXN1bHQtdHlwZSBtYXRsYWJwKSkpCkBAIC0xNTMsNiArMTg2 LDE5IEBAIElmIHRoZXJlIGlzIG5vdCBhIGN1cnJlbnQgaW5mZXJpb3ItcHJvY2Vzcy1idWZmZXIg aW4gU0VTU0lPTiB0aGVuCiBjcmVhdGUuICBSZXR1cm4gdGhlIGluaXRpYWxpemVkIHNlc3Npb24u ICBQQVJBTVMgYXJlIHNyYyBibG9jayBwYXJhbWV0ZXJzLiIKICAgKG9yZy1iYWJlbC1vY3RhdmUt aW5pdGlhdGUtc2Vzc2lvbiBzZXNzaW9uIHBhcmFtcyAnbWF0bGFiKSkKIAorKGRlZnVuIG9yZy1i YWJlbC1tYXRsYWItc2hlbGwgKCkKKyAgIlN0YXJ0IGFuZC9vciB3YWl0IGZvciBNQVRMQUIgc2hl bGwuIgorICAocmVxdWlyZSAnbWF0bGFiLXNoZWxsKSA7OyBtYWtlIGBtYXRsYWItc2hlbGwtYnVz eS1jaGVja2VyJyBhdmFpbGFibGUKKyAgKGlmIChmYm91bmRwICdtYXRsYWItc2hlbGwtYnVzeS1j aGVja2VyKQorICAgICAgKHByb2duCisgICAgICAgIDs7IFN0YXJ0IHRoZSBzaGVsbCBpZiBuZWVk ZWQuICBgbWF0bGFiLXNoZWxsJyB3aWxsIGJlIHJldXNlZCBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5p bmcuCisgICAgICAgIChtYXRsYWItc2hlbGwpCisgICAgICAgIDs7IElmIHdlIGp1c3Qgc3RhcnRl ZCB0aGUgbWF0bGFiLXNoZWxsLCB3YWl0IGZvciB0aGUgcHJvbXB0LiAgSWYgd2UgZG8gbm90Cisg ICAgICAgIDs7IHdhaXQsIHRoZW4gdGhlIHN0YXJ0dXAgbWVzc2FnZXMgd2lsbCBzaG93IHVwIGlu IHRoZSBldmFsdWF0aW9uIHJlc3VsdHMuCisgICAgICAgIChtYXRsYWItc2hlbGwtYnVzeS1jaGVj a2VyICd3YWl0LWZvci1wcm9tcHQpKQorICAgICh1c2VyLWVycm9yICJBIG5ld2VyIHZlcnNpb24g b2YgbWF0bGFiLW1vZGUgaXMgcmVxdWlyZWQsIHNlZSBcCitodHRwczovL2dpdGh1Yi5jb20vbWF0 aHdvcmtzL0VtYWNzLU1BVExBQi1Nb2RlXG4iKSkpCisKIChkZWZ1biBvcmctYmFiZWwtb2N0YXZl LWluaXRpYXRlLXNlc3Npb24gKCZvcHRpb25hbCBzZXNzaW9uIF9wYXJhbXMgbWF0bGFicCkKICAg IkNyZWF0ZSBhbiBvY3RhdmUgaW5mZXJpb3IgcHJvY2VzcyBidWZmZXIuCiBJZiB0aGVyZSBpcyBu b3QgYSBjdXJyZW50IGluZmVyaW9yLXByb2Nlc3MtYnVmZmVyIGluIFNFU1NJT04gdGhlbgpAQCAt MTY1LDkgKzIxMSwxNSBAQCBPY3RhdmUgc2Vzc2lvbiwgdW5sZXNzIE1BVExBQlAgaXMgbm9uLW5p bC4iCiAgICh1bmxlc3MgKHN0cmluZz0gc2Vzc2lvbiAibm9uZSIpCiAgICAgKGxldCAoKHNlc3Np b24gKG9yIHNlc3Npb24KIAkJICAgICAgIChpZiBtYXRsYWJwICIqSW5mZXJpb3IgTWF0bGFiKiIg IipJbmZlcmlvciBPY3RhdmUqIikpKSkKLSAgICAgIChpZiAob3JnLWJhYmVsLWNvbWludC1idWZm ZXItbGl2ZXAgc2Vzc2lvbikgc2Vzc2lvbgorICAgICAgKGlmIChvcmctYmFiZWwtY29taW50LWJ1 ZmZlci1saXZlcCBzZXNzaW9uKQorICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgKHdoZW4g KGFuZCBtYXRsYWJwIChmYm91bmRwICdtYXRsYWItc2hlbGwtYnVzeS1jaGVja2VyKSkKKyAgICAg ICAgICAgICAgOzsgQ2FuJ3QgZXZhbHVhdGUgaWYgdGhlIG1hdGxhYi1zaGVsbCBpcyBjdXJyZW50 bHkgcnVubmluZyBjb2RlCisgICAgICAgICAgICAgIChtYXRsYWItc2hlbGwtYnVzeS1jaGVja2Vy ICdlcnJvci1pZi1idXN5KSkKKyAgICAgICAgICAgIHNlc3Npb24pCiAJKHNhdmUtd2luZG93LWV4 Y3Vyc2lvbgotCSAgKGlmIG1hdGxhYnAgKHVubGVzcyBvcmctYmFiZWwtbWF0bGFiLXdpdGgtZW1h Y3MtbGluayAobWF0bGFiLXNoZWxsKSkKKwkgIChpZiBtYXRsYWJwCisgICAgICAgICAgICAgIChv cmctYmFiZWwtbWF0bGFiLXNoZWxsKQogCSAgICAocnVuLW9jdGF2ZSkpCiAJICAocmVuYW1lLWJ1 ZmZlciAoaWYgKGJ1ZmZlcnAgc2Vzc2lvbikgKGJ1ZmZlci1uYW1lIHNlc3Npb24pCiAJCQkgICAo aWYgKHN0cmluZ3Agc2Vzc2lvbikgc2Vzc2lvbiAoYnVmZmVyLW5hbWUpKSkpCkBAIC0xODMsNzkg KzIzNSwxMjUgQEAgdmFsdWUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGluIEJPRFksIGFzIGVsaXNw LiIKICAgICAgIChvcmctYmFiZWwtb2N0YXZlLWV2YWx1YXRlLXNlc3Npb24gc2Vzc2lvbiBib2R5 IHJlc3VsdC10eXBlIG1hdGxhYnApCiAgICAgKG9yZy1iYWJlbC1vY3RhdmUtZXZhbHVhdGUtZXh0 ZXJuYWwtcHJvY2VzcyBib2R5IHJlc3VsdC10eXBlIG1hdGxhYnApKSkKIAorKGRlZnVuIG9yZy1i YWJlbC1vY3RhdmUtd3JhcHBlci10bXAtZmlsZSAobWF0bGFicCkKKyAgIlJldHVybiBhIGxvY2Fs IHRtcCBmaWxlIHdpdGggbmFtZSBhZGp1c3RlZCBmb3IgTUFUTEFCUC4iCisgIChpZiBtYXRsYWJw CisgICAgICA7OyB3cml0ZW1hdHJpeCByZXF1aXJlcyBhIGZpbGUgZW5kaW5nIHdpdGggJy50eHQn CisgICAgICAob3JnLWJhYmVsLXRlbXAtZmlsZSAibWF0bGFiLSIgIi50eHQiKQorICAgIChvcmct YmFiZWwtdGVtcC1maWxlICJvY3RhdmUtIikpKQorCisoZGVmdW4gb3JnLWJhYmVsLW9jdGF2ZS1n ZXQtY29kZS10by1ldmFsIChib2R5IHRtcC1maWxlIG1hdGxhYnApCisgICJGb3JtYXQgQk9EWSBv ZiB0aGUgY29kZSBibG9jayBmb3IgZXZhbHVhdGlvbiBzYXZpbmcgcmVzdWx0cyB0byBUTVAtRklM RS4KK0lmIE1BVExBQlAsIGZvcm1hdCBmb3IgTUFUTEFCLCBlbHNlIGZvcm1hdCBmb3IgT2N0YXZl LiIKKyAgICAoaWYgbWF0bGFicAorICAgICAgICAoZm9ybWF0IG9yZy1iYWJlbC1tYXRsYWItd3Jh cHBlci1tZXRob2QgZGVmYXVsdC1kaXJlY3RvcnkgYm9keSB0bXAtZmlsZSkKKyAgICAgIChmb3Jt YXQgb3JnLWJhYmVsLW9jdGF2ZS13cmFwcGVyLW1ldGhvZCBib2R5IHRtcC1maWxlIHRtcC1maWxl KSkpCisKIChkZWZ1biBvcmctYmFiZWwtb2N0YXZlLWV2YWx1YXRlLWV4dGVybmFsLXByb2Nlc3Mg KGJvZHkgcmVzdWx0LXR5cGUgbWF0bGFicCkKLSAgIkV2YWx1YXRlIEJPRFkgaW4gYW4gZXh0ZXJu YWwgT2N0YXZlIG9yIE1hdGFsYWIgcHJvY2Vzcy4KKyAgIkV2YWx1YXRlIEJPRFkgaW4gYW4gZXh0 ZXJuYWwgT2N0YXZlIG9yIE1BVExBQiBwcm9jZXNzLgogUHJvY2VzcyB0aGUgcmVzdWx0IGFzIFJF U1VMVC1UWVBFLiAgVXNlIE9jdGF2ZSwgdW5sZXNzIE1BVExBQlAgaXMgbm9uLW5pbC4iCiAgIChs ZXQgKChjbWQgKGlmIG1hdGxhYnAKIAkJIG9yZy1iYWJlbC1tYXRsYWItc2hlbGwtY29tbWFuZAog CSAgICAgICBvcmctYmFiZWwtb2N0YXZlLXNoZWxsLWNvbW1hbmQpKSkKICAgICAocGNhc2UgcmVz dWx0LXR5cGUKICAgICAgIChgb3V0cHV0IChvcmctYmFiZWwtZXZhbCBjbWQgYm9keSkpCi0gICAg ICAoYHZhbHVlIChsZXQgKCh0bXAtZmlsZSAob3JnLWJhYmVsLXRlbXAtZmlsZSAib2N0YXZlLSIp KSkKKyAgICAgIChgdmFsdWUgKGxldCAoKHRtcC1maWxlIChvcmctYmFiZWwtcHJvY2Vzcy1maWxl LW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLWJhYmVsLW9jdGF2ZS13 cmFwcGVyLXRtcC1maWxlIG1hdGxhYnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J25vcXVvdGUpKSkKIAkgICAgICAgIChvcmctYmFiZWwtZXZhbAogCQkgY21kCi0JCSAoZm9ybWF0 IG9yZy1iYWJlbC1vY3RhdmUtd3JhcHBlci1tZXRob2QgYm9keQotCQkJIChvcmctYmFiZWwtcHJv Y2Vzcy1maWxlLW5hbWUgdG1wLWZpbGUgJ25vcXVvdGUpCi0JCQkgKG9yZy1iYWJlbC1wcm9jZXNz LWZpbGUtbmFtZSB0bXAtZmlsZSAnbm9xdW90ZSkpKQorICAgICAgICAgICAgICAgICAob3JnLWJh YmVsLW9jdGF2ZS1nZXQtY29kZS10by1ldmFsIGJvZHkgdG1wLWZpbGUgbWF0bGFicCkpCiAJICAg ICAgICAob3JnLWJhYmVsLW9jdGF2ZS1pbXBvcnQtZWxpc3AtZnJvbS1maWxlIHRtcC1maWxlKSkp KSkpCiAKKyhkZWZ2YXIgb3JnLWJhYmVsLW9jdGF2ZS0tbWF0bGFiLWxpbmUtaW5kaWNhdG9yICIg JS08b3JnLWV2YWw+XG4iCisgICJDb21tZW50IGFwcGVuZGVkIHRvIGVhY2ggY29kZSBsaW5lIGJl aW5nIGV2YWx1YXRlZC4iKQorCisoZGVmdmFyIG9yZy1iYWJlbC1vY3RhdmUtLW1hdGxhYi1lcnJv ci1pbmRpY2F0b3ItcmUgIjwvP0VSUk9SVFhUPlxyP1xuPyIKKyAgIk1BVExBQiBzaGVsbCBlcnJv ciBpbmRpY2F0b3JzLiIpCisKKyhkZWZ1biBvcmctYmFiZWwtb2N0YXZlLWJvZHktZm9yLW91dHB1 dCAoYm9keSBtYXRsYWJwKQorICAiSWYgTUFUTEFCUCwgZml4IHVwIEJPRFkgZm9yIE1BVExBQiBv dXRwdXQgcmVzdWx0LXR5cGUuIgorICAod2hlbiBtYXRsYWJwCisgICAgOzsgTUFUTEFCIGRvZXMg bm90IGVjaG8gdGhlIHdob2xlIEJPRFkgYWxsIGF0IG9uY2UgYW5kIGluc3RlYWQgbWl4ZXMgaW5w dXQKKyAgICA7OyB3aXRoIHRoZSBvdXRwdXQuICBUaGVyZWZvcmUsIHdoZW4gd2Ugc2VuZCBtdWx0 aS1saW5lIGlucHV0IHRvCisgICAgOzsgYG1hdGxhYi1zaGVsbCcsIHdlJ2xsIHNlZSB0aGUgImJv ZHkiIGNvZGUgbGluZXMgZWNob2VkIGluIHRoZSBvdXRwdXQKKyAgICA7OyB3aGljaCBpcyBub3Qg d2hhdCBvbmUgd291bGQgZXhwZWN0LiAgVG8gcmVtb3ZlIHRoZXNlIHVud2FudGVkIGxpbmVzLAor ICAgIDs7IHdlIGFwcGVuZCBgb3JnLWJhYmVsLW9jdGF2ZS0tbWF0bGFiLWxpbmUtaW5kaWNhdG9y JyB0byBlYWNoIGxpbmUgaW4gdGhlIEJPRFkuCisgICAgOzsgV2UgbGV2ZXJhZ2UgdGhpcyBpbmRp Y2F0b3IgdG8gcmVtb3ZlIHRoZSB1bndhbnRlZCBsaW5lcy4KKyAgICA7OyBFeGFtcGxlIG9mIGRl c2lyZWQgYmVoYXZpb3I6CisgICAgOzsgICAgICMrYmVnaW5fc3JjIG1hdGxhYiA6cmVzdWx0cyBv dXRwdXQKKyAgICA7OyAgICAgICBkaXNwKCdUaGUgcmVzdWx0cyBhcmU6JykKKyAgICA7OyAgICAg ICBhID0gWzEsIDI7IDMsIDRdCisgICAgOzsgICAgICAgYiA9IGEgKiAyCisgICAgOzsgICAgICMr ZW5kX3NyYworICAgIDs7CisgICAgOzsgICAgICMrUkVTVUxUUzoKKyAgICA7OyAgICAgIytiZWdp bl9leGFtcGxlCisgICAgOzsgICAgIFRoZSByZXN1bHRzIGFyZToKKyAgICA7OworICAgIDs7ICAg ICBhID0KKyAgICA7OworICAgIDs7ICAgICAgICAgIDEgICAgIDIKKyAgICA7OyAgICAgICAgICAz ICAgICA0CisgICAgOzsKKyAgICA7OyAgICAgYiA9CisgICAgOzsKKyAgICA7OyAgICAgICAgICAy ICAgICA0CisgICAgOzsgICAgICAgICAgNiAgICAgOAorICAgIDs7ICAgICAjK2VuZF9leGFtcGxl CisgICAgKHNldHEgYm9keSAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICJcciIgIiIgYm9keSkp IDs7IENSTEYgPT4gTEYKKyAgICAoc2V0cSBib2R5IChjb25jYXQgKHN0cmluZy10cmltLXJpZ2h0 IGJvZHkpICJcbiIpKSAgOzsgRW5zdXJlIGEgc2luZ2xlIGZpbmFsIG5ld2xpbmUKKyAgICAoc2V0 cSBib2R5IChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIlxuIiBvcmctYmFiZWwtb2N0YXZlLS1t YXRsYWItbGluZS1pbmRpY2F0b3IgYm9keSkpKQorICBib2R5KQorCiAoZGVmdW4gb3JnLWJhYmVs LW9jdGF2ZS1ldmFsdWF0ZS1zZXNzaW9uCiAgICAgKHNlc3Npb24gYm9keSByZXN1bHQtdHlwZSAm b3B0aW9uYWwgbWF0bGFicCkKICAgIkV2YWx1YXRlIEJPRFkgaW4gU0VTU0lPTi4iCi0gIChsZXQq ICgodG1wLWZpbGUgKG9yZy1iYWJlbC10ZW1wLWZpbGUgKGlmIG1hdGxhYnAgIm1hdGxhYi0iICJv Y3RhdmUtIikpKQotCSAod2FpdC1maWxlIChvcmctYmFiZWwtdGVtcC1maWxlICJtYXRsYWItZW1h Y3MtbGluay13YWl0LXNpZ25hbC0iKSkKKyAgKGxldCogKCh0bXAtZmlsZSAob3JnLWJhYmVsLW9j dGF2ZS13cmFwcGVyLXRtcC1maWxlIG1hdGxhYnApKQogCSAoZnVsbC1ib2R5CiAJICAocGNhc2Ug cmVzdWx0LXR5cGUKIAkgICAgKGBvdXRwdXQKIAkgICAgIChtYXBjb25jYXQKIAkgICAgICAjJ29y Zy1iYWJlbC1jaG9tcAotCSAgICAgIChsaXN0IGJvZHkgb3JnLWJhYmVsLW9jdGF2ZS1lb2UtaW5k aWNhdG9yKSAiXG4iKSkKKwkgICAgICAobGlzdCAob3JnLWJhYmVsLW9jdGF2ZS1ib2R5LWZvci1v dXRwdXQgYm9keSBtYXRsYWJwKQorICAgICAgICAgICAgICAgICAgICBvcmctYmFiZWwtb2N0YXZl LWVvZS1pbmRpY2F0b3IpCisgICAgICAgICAgICAgICJcbiIpKQogCSAgICAoYHZhbHVlCi0JICAg ICAoaWYgKGFuZCBtYXRsYWJwIG9yZy1iYWJlbC1tYXRsYWItd2l0aC1lbWFjcy1saW5rKQotCQkg KGNvbmNhdAotCQkgIChmb3JtYXQgb3JnLWJhYmVsLW1hdGxhYi1lbWFjcy1saW5rLXdyYXBwZXIt bWV0aG9kCi0JCQkgIGJvZHkKLQkJCSAgKG9yZy1iYWJlbC1wcm9jZXNzLWZpbGUtbmFtZSB0bXAt ZmlsZSAnbm9xdW90ZSkKLQkJCSAgKG9yZy1iYWJlbC1wcm9jZXNzLWZpbGUtbmFtZSB0bXAtZmls ZSAnbm9xdW90ZSkgd2FpdC1maWxlKSAiXG4iKQotCSAgICAgICAobWFwY29uY2F0Ci0JCSMnb3Jn LWJhYmVsLWNob21wCi0JCShsaXN0IChmb3JtYXQgb3JnLWJhYmVsLW9jdGF2ZS13cmFwcGVyLW1l dGhvZAotCQkJICAgICAgYm9keQotCQkJICAgICAgKG9yZy1iYWJlbC1wcm9jZXNzLWZpbGUtbmFt ZSB0bXAtZmlsZSAnbm9xdW90ZSkKLQkJCSAgICAgIChvcmctYmFiZWwtcHJvY2Vzcy1maWxlLW5h bWUgdG1wLWZpbGUgJ25vcXVvdGUpKQotCQkgICAgICBvcmctYmFiZWwtb2N0YXZlLWVvZS1pbmRp Y2F0b3IpICJcbiIpKSkpKQotCSAocmF3IChpZiAoYW5kIG1hdGxhYnAgb3JnLWJhYmVsLW1hdGxh Yi13aXRoLWVtYWNzLWxpbmspCi0JCSAgKHNhdmUtd2luZG93LWV4Y3Vyc2lvbgotCQkgICAgKHdp dGgtdGVtcC1idWZmZXIKLQkJICAgICAgKGluc2VydCBmdWxsLWJvZHkpCi0JCSAgICAgICh3cml0 ZS1yZWdpb24gIiIgJ2lnbm9yZWQgd2FpdC1maWxlIG5pbCBuaWwgbmlsICdleGNsKQotCQkgICAg ICAobWF0bGFiLXNoZWxsLXJ1bi1yZWdpb24gKHBvaW50LW1pbikgKHBvaW50LW1heCkpCi0JCSAg ICAgIChtZXNzYWdlICJXYWl0aW5nIGZvciBNYXRsYWIgRW1hY3MgTGluayIpCi0JCSAgICAgICh3 aGlsZSAoZmlsZS1leGlzdHMtcCB3YWl0LWZpbGUpIChzaXQtZm9yIDAuMDEpKQotCQkgICAgICAi IikpIDs7IG1hdGxhYi1zaGVsbC1ydW4tcmVnaW9uIGRvZXNuJ3Qgc2VlbSB0bwotCQk7OyBtYWtl ICptYXRsYWIqIGJ1ZmZlciBjb250ZW50cyBlYXNpbHkKLQkJOzsgYXZhaWxhYmxlLCBzbyA6cmVz dWx0cyBvdXRwdXQgY3VycmVudGx5Ci0JCTs7IHdvbid0IHdvcmsKLQkJKG9yZy1iYWJlbC1jb21p bnQtd2l0aC1vdXRwdXQKLQkJICAgIChzZXNzaW9uCi0JCSAgICAgKGlmIG1hdGxhYnAKLQkJCSBv cmctYmFiZWwtb2N0YXZlLWVvZS1pbmRpY2F0b3IKLQkJICAgICAgIG9yZy1iYWJlbC1vY3RhdmUt ZW9lLW91dHB1dCkKLQkJICAgICB0IGZ1bGwtYm9keSkKLQkJICAoaW5zZXJ0IGZ1bGwtYm9keSkg KGNvbWludC1zZW5kLWlucHV0IG5pbCB0KSkpKQotCSByZXN1bHRzKQorCSAgICAgKG1hcGNvbmNh dAorCSAgICAgICMnb3JnLWJhYmVsLWNob21wCisJICAgICAgKGxpc3QgKG9yZy1iYWJlbC1vY3Rh dmUtZ2V0LWNvZGUtdG8tZXZhbCBib2R5IHRtcC1maWxlIG1hdGxhYnApCisJCSAgICBvcmctYmFi ZWwtb2N0YXZlLWVvZS1pbmRpY2F0b3IpCisgICAgICAgICAgICAgICJcbiIpKSkpCisJIChyYXct cmVzdWx0cworCSAgKG9yZy1iYWJlbC1jb21pbnQtd2l0aC1vdXRwdXQKKwkgICAgICAoc2Vzc2lv bgorCSAgICAgICAoaWYgbWF0bGFicAorCQkgICBvcmctYmFiZWwtb2N0YXZlLWVvZS1pbmRpY2F0 b3IKKwkJIG9yZy1iYWJlbC1vY3RhdmUtZW9lLW91dHB1dCkKKwkgICAgICAgdCBmdWxsLWJvZHkg OzsgUmVtb3ZlIGVjaG8nZCBmdWxsLWJvZHkgZnJvbSByZXN1bHQKKyAgICAgICAgICAgICAgICh3 aGVuIG1hdGxhYnAKKyAgICAgICAgICAgICAgICAgYCg7OyBNQVRMQUIgZWNobydzIGlucHV0IGlu dGVybGVhdmVkIHcvb3V0cHV0LCBzbyBzdHJpcCBpbnB1dHMKKyAgICAgICAgICAgICAgICAgICAs KGNvbmNhdCAiXi4qIiBvcmctYmFiZWwtb2N0YXZlLS1tYXRsYWItbGluZS1pbmRpY2F0b3IpCisg ICAgICAgICAgICAgICAgICAgOzsgU3RyaXAgbWF0bGFiLXNoZWxsIGVycm9yIGluZGljYXRvcnMK KyAgICAgICAgICAgICAgICAgICAsb3JnLWJhYmVsLW9jdGF2ZS0tbWF0bGFiLWVycm9yLWluZGlj YXRvci1yZSkpKQorICAgICAgICAgICAgKGluc2VydCBmdWxsLWJvZHkpIChjb21pbnQtc2VuZC1p bnB1dCBuaWwgdCkpKSkKICAgICAocGNhc2UgcmVzdWx0LXR5cGUKICAgICAgIChgdmFsdWUKICAg ICAgICAob3JnLWJhYmVsLW9jdGF2ZS1pbXBvcnQtZWxpc3AtZnJvbS1maWxlIHRtcC1maWxlKSkK ICAgICAgIChgb3V0cHV0Ci0gICAgICAgKHNldHEgcmVzdWx0cwotCSAgICAgKGlmIG1hdGxhYnAK LQkJIChjZHIgKHJldmVyc2UgKGRlbGV0ZSAiIiAobWFwY2FyICMnb3JnLXN0cmlwLXF1b3Rlcwot CQkJCQkgICAgICAgICAgKG1hcGNhciAjJ29yZy10cmltIHJhdykpKSkpCi0JICAgICAgIChjZHIg KG1lbWJlciBvcmctYmFiZWwtb2N0YXZlLWVvZS1vdXRwdXQKLQkJCSAgICAocmV2ZXJzZSAobWFw Y2FyICMnb3JnLXN0cmlwLXF1b3RlcwotCQkJCQkgICAgIChtYXBjYXIgIydvcmctdHJpbSByYXcp KSkpKSkpCi0gICAgICAgKG1hcGNvbmNhdCAjJ2lkZW50aXR5IChyZXZlcnNlIHJlc3VsdHMpICJc biIpKSkpKQorICAgICAgIChpZiBtYXRsYWJwCisgICAgICAgICAgIChsZXQqICgoc3RyaXBwZWQg KGRlbGV0ZSAiIiAobWFwY2FyICMnb3JnLXN0cmlwLXF1b3RlcyByYXctcmVzdWx0cykpKQorICAg ICAgICAgICAgICAgICAgOzsgVHJpbSBleHRyYSBuZXdsaW5lLCBrZWVwaW5nIE1BVExBQidzIG5l d2xpbmVzCisgICAgICAgICAgICAgICAgICAodHJpbW1lZCAobWFwY2FyIChsYW1iZGEgKHN0cikK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdleHAtaW4t c3RyaW5nICJcblxuXFwnIiAiXG4iIHN0cikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cmlwcGVkKSkKKyAgICAgICAgICAgICAgICAgIChyZXZlcnNlZCAoY2RyIChyZXZl cnNlIHRyaW1tZWQpKSkpCisgICAgICAgICAgICAgKGNvbmNhdCAoc3RyaW5nLXRyaW0gKG1hcGNv bmNhdCAjJ2lkZW50aXR5IChyZXZlcnNlIHJldmVyc2VkKSkgIltcclxuXSsiKQorICAgICAgICAg ICAgICAgICAgICAgIlxuIikpCisgICAgICAgICAobGV0ICgocmV2ZXJzZWQgKGNkciAobWVtYmVy IG9yZy1iYWJlbC1vY3RhdmUtZW9lLW91dHB1dAorCQkgICAgICAgICAgICAgICAgICAgICAgKHJl dmVyc2UgKG1hcGNhciAjJ29yZy1zdHJpcC1xdW90ZXMKKwkJCQkJICAgICAgICAgICAgICAgKG1h cGNhciAjJ29yZy10cmltIHJhdy1yZXN1bHRzKSkpKSkpKQorCSAgIChtYXBjb25jYXQgIydpZGVu dGl0eSAocmV2ZXJzZSByZXZlcnNlZCkpKSkpKSkpCiAKIChkZWZ1biBvcmctYmFiZWwtb2N0YXZl LWltcG9ydC1lbGlzcC1mcm9tLWZpbGUgKGZpbGUtbmFtZSkKICAgIkltcG9ydCBkYXRhIGZyb20g RklMRS1OQU1FLgpkaWZmIC0tZ2l0IGEvbGlzcC9vcmcuZWwgYi9saXNwL29yZy5lbAppbmRleCA4 MTlhODJlYjkuLjFlNDZkMjM4ZSAxMDA2NDQKLS0tIGEvbGlzcC9vcmcuZWwKKysrIGIvbGlzcC9v cmcuZWwKQEAgLTMzMiw5ICszMzIsMTAgQEAgcmVxdWlyZW1lbnQuIgogCQkgKGNvbnN0IDp0YWcg Ikxpc3AiIGxpc3ApCiAgICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJMdWEiIGx1YSkKIAkJ IChjb25zdCA6dGFnICJNYWtlZmlsZSIgbWFrZWZpbGUpCisgICAgICAgICAgICAgICAgIChjb25z dCA6dGFnICJNQVRMQUIiIG1hdGxhYikKIAkJIChjb25zdCA6dGFnICJNYXhpbWEiIG1heGltYSkK ICAgICAgICAgICAgICAgICAgKGNvbnN0IDp0YWcgIk9DYW1sIiBvY2FtbCkKLQkJIChjb25zdCA6 dGFnICJPY3RhdmUgYW5kIE1hdExhYiIgb2N0YXZlKQorCQkgKGNvbnN0IDp0YWcgIk9jdGF2ZSIg b2N0YXZlKQogCQkgKGNvbnN0IDp0YWcgIk9yZyIgb3JnKQogCQkgKGNvbnN0IDp0YWcgIlBlcmwi IHBlcmwpCiAgICAgICAgICAgICAgICAgIChjb25zdCA6dGFnICJQcm9jZXNzaW5nIiBwcm9jZXNz aW5nKQpkaWZmIC0tZ2l0IGEvbWsvZGVmYXVsdC5tayBiL21rL2RlZmF1bHQubWsKaW5kZXggYzVl YTFiYTAxLi4yNjM1ZDNhOTggMTAwNjQ0Ci0tLSBhL21rL2RlZmF1bHQubWsKKysrIGIvbWsvZGVm YXVsdC5tawpAQCAtNTMsNyArNTMsNyBAQCBCVEVTVF9QT1NUICA9CiAgICAgICAgICAgICAgICMg LUwgPHBhdGgtdG8+L2VydCAgICAgICMgbmVlZGVkIGZvciBFbWFjczIzLCBFbWFjczI0IGhhcyBl cnQgYnVpbHQgaW4KICAgICAgICAgICAgICAgIyAtTCA8cGF0aC10bz4vZXNzICAgICAgIyBuZWVk ZWQgZm9yIHJ1bm5pbmcgUiB0ZXN0cwogICAgICAgICAgICAgICAjIC1MIDxwYXRoLXRvPi9odG1s aXplICAjIG5lZWQgYXQgbGVhc3QgdmVyc2lvbiAxLjM0IGZvciBzb3VyY2UgY29kZSBmb3JtYXR0 aW5nCi1CVEVTVF9PQl9MQU5HVUFHRVMgPSBhd2sgQyBmb3J0cmFuIG1heGltYSBsaWx5cG9uZCBv Y3RhdmUgcGVybCBweXRob24gamF2YSBzcWxpdGUgZXNoZWxsIGNhbGMKK0JURVNUX09CX0xBTkdV QUdFUyA9IGF3ayBDIGZvcnRyYW4gbWF0bGFiIG1heGltYSBsaWx5cG9uZCBvY3RhdmUgcGVybCBw eXRob24gamF2YSBzcWxpdGUgZXNoZWxsIGNhbGMKICAgICAgICAgICAgICAgIyBSICAgICAgICAg ICAgICAgICAgICAgIyByZXF1aXJlcyBFU1MgdG8gYmUgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVk CiAgICAgICAgICAgICAgICMgcnVieSAgICAgICAgICAgICAgICAgICMgcmVxdWlyZXMgaW5mLXJ1 YnkgdG8gYmUgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkCiAjIGV4dHJhIHBhY2thZ2VzIHRvIHJl cXVpcmUgZm9yIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZXhhbXBsZXMvb2ItbWF0bGFi LXRlc3Qub3JnIGIvdGVzdGluZy9leGFtcGxlcy9vYi1tYXRsYWItdGVzdC5vcmcKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi42MzUwMGYyMjMKLS0tIC9kZXYvbnVsbAorKysg Yi90ZXN0aW5nL2V4YW1wbGVzL29iLW1hdGxhYi10ZXN0Lm9yZwpAQCAtMCwwICsxLDExNCBAQAor IytUaXRsZTogQSBjb2xsZWN0aW9uIG9mIGV4YW1wbGVzIGZvciBvYi1tYXRsYWIgdGVzdHMKKyMr T1BUSU9OUzogXjpuaWwKKworKiBUZXN0IE1BVExBQiByZXN1bHRzIG91dHB1dAorOlBST1BFUlRJ RVM6Cis6SUQ6ICAgICAgIDk5MzMyMjc3LTVlMGUtNDgzNC1hM2FkLWViY2FkZGI4NTVhYgorOkVO RDoKKworIytiZWdpbl9zcmMgbWF0bGFiIDpyZXN1bHRzIG91dHB1dAorICBkaXNwKCdUaGUgcmVz dWx0cyBhcmU6JykKKyAgYSA9IFsxLCAyOyAzLCA0XQorICBiID0gYSAqIDIKKyMrZW5kX3NyYwor CisjK1JFU1VMVFM6CisjK2JlZ2luX2V4YW1wbGUKK1RoZSByZXN1bHRzIGFyZToKKworYSA9CisK KyAgICAgMSAgICAgMgorICAgICAzICAgICA0CisKK2IgPQorCisgICAgIDIgICAgIDQKKyAgICAg NiAgICAgOAorIytlbmRfZXhhbXBsZQorCitGb2xsb3dpbmcgdmFsaWRhdGVzIHdoaXRlc3BhY2Ug aXMgcHJlc2VydmVkCisKKyMrYmVnaW5fc3JjIG1hdGxhYiA6cmVzdWx0cyBvdXRwdXQKKyAgZGlz cCgnICArLS0tKycpCisgIGRpc3AoJyAgfG9uZXwnKQorICBkaXNwKCcgICstLS0rJykKKyAgZGlz cChuZXdsaW5lKQorICBkaXNwKFsnICAgICcsIG51bTJzdHIoMSldKTsKKyAgZGlzcChuZXdsaW5l KQorICBkaXNwKCcgICstLS0rJykKKyAgZGlzcCgnICB8dHdvfCcpCisgIGRpc3AoJyAgKy0tLSsn KQorICBkaXNwKG5ld2xpbmUpCisgIGRpc3AoWycgICAgJywgbnVtMnN0cigyKV0pOworICBkaXNw KG5ld2xpbmUpCisjK2VuZF9zcmMKKworKiBUZXN0IHJldXNlIG9mIE1BVExBQiBidWZmZXIgd2l0 aCByZXN1bHRzIG91dHB1dAorOlBST1BFUlRJRVM6Cis6SUQ6ICAgICAgIGE2OGRiOWZmLWVmZGYt NDJiOS04NWZjLTE3NDAxNWNkMWY3NworOkVORDoKKworIytiZWdpbl9zcmMgbWF0bGFiIDpyZXN1 bHRzIG91dHB1dAorICBhID0gMTIzCisjK2VuZF9zcmMKKworIytSRVNVTFRTOgorOiBhID0KKzog Cis6ICAgIDEyMworCisjK2JlZ2luX3NyYyBtYXRsYWIgOmV4cG9ydHMgYm90aCA6cmVzdWx0cyBv dXRwdXQKKyAgYiA9IGEgKyAxMDAwCisjK2VuZF9zcmMKKworIytSRVNVTFRTOgorOiBiID0KKzog Cis6ICAgICAgICAgMTEyMworCitGb2xsb3dpbmcgc2hvdWxkIGdpdmU6IFVucmVjb2duaXplZCBm dW5jdGlvbiBvciB2YXJpYWJsZSAnYicuCisKKyMrYmVnaW5fc3JjIG1hdGxhYiA6cmVzdWx0cyBv dXRwdXQKKyAgY2xlYXIKKyAgYyA9IGIgKiAyCisjK2VuZF9zcmMKKworIytSRVNVTFRTOgorOiBV bnJlY29nbml6ZWQgZnVuY3Rpb24gb3IgdmFyaWFibGUgJ2InLgorCisqIFRlc3QgcmVzdWx0cyB2 ZXJiYXRpbQorOlBST1BFUlRJRVM6Cis6SUQ6ICAgICAgIDI3ODA0N2I2LTRiODctNDg1Mi05MDUw LWUzZTk5ZmNhYWJiOAorOkVORDoKKworIytiZWdpbl9zcmMgbWF0bGFiIDpyZXN1bHRzIHZlcmJh dGltCisgIGEgPSAyICsgMzsKKyAgYW5zID0gbWFnaWMoYSk7CisjK2VuZF9zcmMKKworKiBUZXN0 IHJlc3VsdHMgb3V0cHV0IGxhdGV4Cis6UFJPUEVSVElFUzoKKzpJRDogICAgICAgN2E4MTkwYmUt ZDY3NC00OTQ0LTg2NGUtNmZkYWE3MzYyNTg1Cis6RU5EOgorCisjK2JlZ2luX3NyYyBtYXRsYWIg OnJlc3VsdHMgb3V0cHV0IGxhdGV4CisgIG0gPSBbNCpwaSwgMypwaTsgMipwaSwgcGldOworICBy ZXN1bHQgPSBsYXRleChzeW0obSkpOworICBkaXNwKHJlc3VsdCkKKyMrZW5kX3NyYworCisqIFRl c3QgcmVzdWx0cyBmaWxlIGdyYXBoaWNzCis6UFJPUEVSVElFUzoKKzpJRDogICAgICAgNWJlZTg4 NDEtYTg5OC00MTM1LWI0NGItZjFiZDU0NjVjZWVkCis6RU5EOgorCisjK2JlZ2luX3NyYyBtYXRs YWIgOnJlc3VsdHMgZmlsZSBncmFwaGljcyA6ZmlsZSBOQU1FLnBuZworICB0ID0gWzAgOiAwLjEg OiAyKnBpXTsKKyAgeSA9IHNpbih0KTsKKyAgcGxvdCh0LCB5KTsKKyAgc2V0KGdjZiwgJ1BhcGVy VW5pdHMnLCAnaW5jaGVzJywgJ1BhcGVyUG9zaXRpb24nLCBbMCAwIDQgM10pICUgU2V0IHRoZSBz aXplIHRvIDQiIHggMyIKKyMrZW5kX3NyYworCisKKyMgTG9jYWxXb3JkczogIGViY2FkZGIgZWZk ZiBmYyBmY2FhYmIgZmRhYSBjZWVkIHNpbmV3YXZlCmRpZmYgLS1naXQgYS90ZXN0aW5nL2xpc3Av dGVzdC1vYi1tYXRsYWIuZWwgYi90ZXN0aW5nL2xpc3AvdGVzdC1vYi1tYXRsYWIuZWwKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi40NzZlNWIxZTQKLS0tIC9kZXYvbnVsbAor KysgYi90ZXN0aW5nL2xpc3AvdGVzdC1vYi1tYXRsYWIuZWwKQEAgLTAsMCArMSwxOTEgQEAKKzs7 OyB0ZXN0LW9iLW1hdGxhYi5lbCAtLS0gdGVzdHMgZm9yIG9iLW1hdGxhYi5lbCAgLSotIGxleGlj YWwtYmluZGluZzogdDsgLSotCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBDb3B5cmlnaHQgMjAy NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKzs7IEF1dGhvcnM6IEpvaG4gQ2lvbGZpCisKKzs7 IFRoaXMgZmlsZSBpcyBub3QgcGFydCBvZiBHTlUgRW1hY3MuCisKKzs7IFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7 OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKzs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7IEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyBhbG9u ZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCisKKzs7IC0tLS0tLS0tLS0KKzs7IENvZGUgYmxvY2tzIHJlc2lkZSBpbjogLi4v ZXhhbXBsZXMvb2ItbWF0bGFiLXRlc3Qub3JnCis7OyBUbyBydW4gdGVzdC1vYi1tYXRsYWIuZWwg dXNpbmcgbGF0ZXN0IG1hdGxhYi1tb2RlIGFuZCBvcmctbW9kZToKKzs7IDEuIERvd25sb2FkIGFu ZCBidWlsZCBsYXRlc3Qgb3JnLW1vZGUsIGh0dHBzOi8vb3JnbW9kZS5vcmcvd29yZy9vcmctY29u dHJpYnV0ZS5odG1sCis7OyAgICBFeGFtcGxlOgorOzsgICAgICBjZCB+L2dpdGh1YgorOzsgICAg ICBnaXQgY2xvbmUgaHR0cHM6Ly9naXQuc3YuZ251Lm9yZy9naXQvZW1hY3Mvb3JnLW1vZGUuZ2l0 Cis7OyAgICAgIG1ha2UgLUMgb3JnLW1vZGUgY29tcGlsZSAtajMyICYmIG1ha2UgcHJlZml4PX4v Z2l0aHViL29yZy1tb2RlLWluc3RhbGwgaW5zdGFsbAorOzsgMi4gRG93bmxvYWQgYW5kIGJ1aWxk IGxhdGVzdCBtYXRsYWItbW9kZSwgaHR0cHM6Ly9naXRodWIuY29tL01hdGhXb3Jrcy9FbWFjcy1N QVRMQUItTW9kZQorOzsgICAgRXhhbXBsZToKKzs7ICAgICAgY2Qgfi9naXRodWIKKzs7ICAgICAg Z2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRod29ya3MvRW1hY3MtTUFUTEFCLU1vZGUu Z2l0Cis7OyAgICAgIG1ha2UgLUMgRW1hY3MtTUFUTEFCLU1vZGUgLWozMgorOzsgMy4gVGVzdCB1 c2VzIG1hdGxhYi1zaGVsbCB3aGljaCByZXF1aXJlcyB0aGF0ICJtYXRsYWIiIGlzIG9uIHRoZSBQ QVRIOgorOzsgICAgRXhhbXBsZToKKzs7ICAgICAgY2Qgfi9naXRodWIvb3JnLW1vZGUKKzs7ICAg ICAgZW52IFBBVEg9L3BhdGgvdG8vTUFUTEFCLUlOU1RBTEwvYmluOiRQQVRIIFwKKzs7ICAgICAg ICAgIG1ha2UgLWozMiB0ZXN0IFwKKzs7ICAgICAgICAgIEJURVNUX1BPU1Q9Ii1MIH4vZ2l0aHVi L0VtYWNzLU1BVExBQi1Nb2RlIC1sIH4vRW1hY3MtTUFUTEFCLU1vZGUvbWF0bGFiLWF1dG9sb2Fk LmVsIgorCis7OzsgQ29kZToKKworKHJlcXVpcmUgJ29iLWNvcmUpCisKKyhvcmctdGVzdC1mb3It ZXhlY3V0YWJsZSAibWF0bGFiIikKKworKHVubGVzcyAoZmJvdW5kcCAnbWF0bGFiLXNoZWxsKQor ICAoc2lnbmFsICdtaXNzaW5nLXRlc3QtZGVwZW5kZW5jeSAnKCJTdXBwb3J0IGZvciBNQVRMQUIg Y29kZSBibG9ja3MiKSkpCisKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTs7Cis7 OyBCYXNpYyAiOnJlc3VsdHMgb3V0cHV0IiB0ZXN0cyA7OworOzstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tOzsKKyhlcnQtZGVmdGVzdCBvYi1tYXRsYWIvcmVzdWx0cy1vdXRwdXQgKCkK KyAgIlRlc3QgbWF0bGFiIDpyZXN1bHRzIG91dHB1dCBjb2RlIGJsb2NrLiIKKyAgKGxldCAoKGV4 cGVjdGVkICJcCitUaGUgcmVzdWx0cyBhcmU6CisKK2EgPQorCisgICAgIDEgICAgIDIKKyAgICAg MyAgICAgNAorCitiID0KKworICAgICAyICAgICA0CisgICAgIDYgICAgIDgKKyIpKQorICAgIChv cmctdGVzdC1hdC1pZCAiOTkzMzIyNzctNWUwZS00ODM0LWEzYWQtZWJjYWRkYjg1NWFiIgorICAg ICAgICAgICAgICAgICAgICAob3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKQorICAgICAgICAgICAg ICAgICAgICAoc2hvdWxkIChlcXVhbCBleHBlY3RlZCAob3JnLWJhYmVsLWV4ZWN1dGUtc3JjLWJs b2NrKSkpKSkpCisKKyhlcnQtZGVmdGVzdCBvYi1tYXRsYWIvcmVzdWx0cy1vdXRwdXQtcHJlc2Vy dmUtd2hpdGVzcGFjZSAoKQorICAiVGVzdCBtYXRsYWIgOnJlc3VsdHMgb3V0cHV0IGNvZGUgYmxv Y2sgcHJlc2VydmVzIHdoaXRlc3BhY2UuIgorICAobGV0ICgoZXhwZWN0ZWQgIlwKKyAgKy0tLSsK KyAgfG9uZXwKKyAgKy0tLSsKKworICAgIDEKKworICArLS0tKworICB8dHdvfAorICArLS0tKwor CisgICAgMgorIikpCisgICAgKG9yZy10ZXN0LWF0LWlkICI5OTMzMjI3Ny01ZTBlLTQ4MzQtYTNh ZC1lYmNhZGRiODU1YWIiCisgICAgICAgICAgICAgICAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMt YmxvY2sgMikKKyAgICAgICAgICAgICAgICAgICAgKHNob3VsZCAoZXF1YWwgZXhwZWN0ZWQgKG9y Zy1iYWJlbC1leGVjdXRlLXNyYy1ibG9jaykpKSkpKQorCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTs7Cis7OyBNQVRMQUIgd29ya3NwYWNlIHJldXNl IHRlc3RzICg6cmVzdWx0cyBvdXRwdXQpIDs7Cis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLTs7CisKKyhlcnQtZGVmdGVzdCBvYi1tYXRsYWIvcmVzdWx0 cy1vdXRwdXQtcmV1c2UtYSAoKQorICAiVGVzdCBtYXRsYWIgOnJlc3VsdHMgb3V0cHV0IGRlZmlu aW5nIHZhcmlhYmxlLCBhLiIKKyAgKGxldCAoKGV4cGVjdGVkICJcCithID0KKworICAgMTIzCisi KSkKKyAgICAob3JnLXRlc3QtYXQtaWQgImE2OGRiOWZmLWVmZGYtNDJiOS04NWZjLTE3NDAxNWNk MWY3NyIKKyAgICAgICAgICAgICAgICAgICAgKG9yZy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAg ICAgICAgICAgICAgICAgICAgKHNob3VsZCAoZXF1YWwgZXhwZWN0ZWQgKG9yZy1iYWJlbC1leGVj dXRlLXNyYy1ibG9jaykpKSkpKQorCisoZXJ0LWRlZnRlc3Qgb2ItbWF0bGFiL3Jlc3VsdHMtb3V0 cHV0LXJldXNlLWIgKCkKKyAgIlRlc3QgbWF0bGFiIDpyZXN1bHRzIG91dHB1dCByZXVzaW5nIHZh cmlhYmxlLCBhLCB0byBjb21wdXRlIHZhcmlhYmxlLCBiLiIKKyAgKGxldCAoKGV4cGVjdGVkICJc CitiID0KKworICAgICAgICAxMTIzCisiKSkKKyAgICAob3JnLXRlc3QtYXQtaWQgImE2OGRiOWZm LWVmZGYtNDJiOS04NWZjLTE3NDAxNWNkMWY3NyIKKyAgICAgICAgICAgICAgICAgICAgKG9yZy1i YWJlbC1uZXh0LXNyYy1ibG9jayAyKQorICAgICAgICAgICAgICAgICAgICAoc2hvdWxkIChlcXVh bCBleHBlY3RlZCAob3JnLWJhYmVsLWV4ZWN1dGUtc3JjLWJsb2NrKSkpKSkpCisKKyhlcnQtZGVm dGVzdCBvYi1tYXRsYWIvcmVzdWx0cy1vdXRwdXQtcmV1c2UtY2xlYXIgKCkKKyAgIlRlc3QgbWF0 bGFiIDpyZXN1bHRzIG91dHB1dCB3aXRoIGNsZWFyIHJlc3VsdGluZyBpbiBlcnJvci4KK0Fsc28g dmFsaWRhdGVzIHRoYXQgd2Ugc3RyaXAgdGhlIDwvP0VSUk9SVFhUPiBtYXRsYWItc2hlbGwgaW5k aWNhdG9ycy4iCisgIChsZXQgKChleHBlY3RlZCAiXAorVW5yZWNvZ25pemVkIGZ1bmN0aW9uIG9y IHZhcmlhYmxlICdiJy4KKyIpKQorICAgIChvcmctdGVzdC1hdC1pZCAiYTY4ZGI5ZmYtZWZkZi00 MmI5LTg1ZmMtMTc0MDE1Y2QxZjc3IgorICAgICAgICAgICAgICAgICAgICAob3JnLWJhYmVsLW5l eHQtc3JjLWJsb2NrIDMpCisgICAgICAgICAgICAgICAgICAgIChzaG91bGQgKGVxdWFsIGV4cGVj dGVkIChvcmctYmFiZWwtZXhlY3V0ZS1zcmMtYmxvY2spKSkpKSkKKworOzstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS07OworOzsgIjpyZXN1bHRzIHZlcmJhdGltIiB0ZXN0cyA7OworOzstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS07OworKGVydC1kZWZ0ZXN0IG9iLW1hdGxhYi9yZXN1bHRz LXZlcmJhdGltICgpCisgICJUZXN0IG1hdGxhYiA6cmVzdWx0cyB2ZXJiYXRpbS4iCisgIChsZXQg KChleHBlY3RlZCAnKCgxNyAyNCAxIDggMTUpCisgICAgICAgICAgICAgICAgICAgICgyMyA1IDcg MTQgMTYpCisgICAgICAgICAgICAgICAgICAgICg0IDYgMTMgMjAgMjIpCisgICAgICAgICAgICAg ICAgICAgICgxMCAxMiAxOSAyMSAzKQorICAgICAgICAgICAgICAgICAgICAoMTEgMTggMjUgMiA5 KSkpKQorICAgIChvcmctdGVzdC1hdC1pZCAiMjc4MDQ3YjYtNGI4Ny00ODUyLTkwNTAtZTNlOTlm Y2FhYmI4IgorICAgICAgICAgICAgICAgICAgICAob3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKQor ICAgICAgICAgICAgICAgICAgICAoc2hvdWxkIChlcXVhbCBleHBlY3RlZCAob3JnLWJhYmVsLWV4 ZWN1dGUtc3JjLWJsb2NrKSkpKSkpCisKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTs7Cis7OyAiOnJlc3VsdHMgb3V0cHV0IGxhdGV4IiB0ZXN0cyA7OworOzstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tOzsKKworKGVydC1kZWZ0ZXN0IG9iLW1hdGxhYi9yZXN1bHRzLW91 dHB1dC1sYXRleCAoKQorICAiVGVzdCBtYXRsYWIgOnJlc3VsdHMgb3V0cHV0IGxhdGV4LiIKKyAg KGxldCAoKGV4cGVjdGVkICJcCitcXGxlZnQoXFxiZWdpbnthcnJheX17Y2N9IDRcXCxcXHBpICAm IDNcXCxcXHBpIFxcXFwgMlxcLFxccGkgICYgXFxwaSAgXFxlbmR7YXJyYXl9XFxyaWdodCkKKyIp KQorICAgIChvcmctdGVzdC1hdC1pZCAiN2E4MTkwYmUtZDY3NC00OTQ0LTg2NGUtNmZkYWE3MzYy NTg1IgorICAgICAgICAgICAgICAgICAgICAob3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKQorICAg ICAgICAgICAgICAgICAgICAobGV0ICgoZ290IChvcmctYmFiZWwtZXhlY3V0ZS1zcmMtYmxvY2sp KSkKKyAgICAgICAgICAgICAgICAgICAgICAoc2hvdWxkIChlcXVhbCBleHBlY3RlZCBnb3QpKSkp KSkKKworCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOzsKKzs7ICI6cmVzdWx0 cyBmaWxlIGdyYXBoaWNzIiB0ZXN0cyA7OworOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLTs7CisKKyhlcnQtZGVmdGVzdCBvYi1tYXRsYWIvcmVzdWx0cy1maWxlLWdyYXBoaWNzICgp CisgICJUZXN0IG1hdGxhYiA6cmVzdWx0cyBmaWxlIGdyYXBoaWNzLiIKKyAgKGxldCAoKGNvZGUt YmxvY2sgKG9yZy10ZXN0LWdldC1jb2RlLWJsb2NrICI1YmVlODg0MS1hODk4LTQxMzUtYjQ0Yi1m MWJkNTQ2NWNlZWQiKSkKKyAgICAgICAgKHRlbXAtZmlsZS1wbmcgKG1ha2UtdGVtcC1maWxlICJ0 ZXN0LW9iLW1hdGxhYi0iIG5pbCAiLnBuZyIpKSkKKyAgICAoc2V0cSBjb2RlLWJsb2NrIChyZXBs YWNlLXJlZ2V4cC1pbi1zdHJpbmcgIk5BTUVcXC5wbmciIHRlbXAtZmlsZS1wbmcgY29kZS1ibG9j aykpCisgICAgKHVud2luZC1wcm90ZWN0CisgICAgICAgIChvcmctdGVzdC13aXRoLXRlbXAtdGV4 dAorICAgICAgICAgY29kZS1ibG9jaworICAgICAgICAgKG9yZy1iYWJlbC1leGVjdXRlLXNyYy1i bG9jaykKKyAgICAgICAgIChzaG91bGQgKHNlYXJjaC1mb3J3YXJkIChmb3JtYXQgIltbZmlsZTol c11dIiB0ZW1wLWZpbGUtcG5nKSBuaWwgbmlsKSkKKyAgICAgICAgIChzaG91bGQgKGZpbGUtcmVh ZGFibGUtcCB0ZW1wLWZpbGUtcG5nKSkpCisgICAgICAoZGVsZXRlLWZpbGUgdGVtcC1maWxlLXBu ZykpKSkKKworKGVydC1kZWZ0ZXN0IG9iLW1hdGxhYi9yZXN1bHRzLWZpbGUtZ3JhcGhpY3Mtd2l0 aC1zcGFjZSAoKQorICAiVGVzdCBtYXRsYWIgOnJlc3VsdHMgZmlsZSBncmFwaGljcyB1c2luZyBh IGZpbGUgbmFtZSB3aXRoIGEgc3BhY2UuIgorICAobGV0ICgoY29kZS1ibG9jayAob3JnLXRlc3Qt Z2V0LWNvZGUtYmxvY2sgIjViZWU4ODQxLWE4OTgtNDEzNS1iNDRiLWYxYmQ1NDY1Y2VlZCIpKQor ICAgICAgICAodGVtcC1maWxlLXBuZyAobWFrZS10ZW1wLWZpbGUgInRlc3Qgb2ItbWF0bGFiLSIg bmlsICIucG5nIikpKQorICAgIChzZXRxIGNvZGUtYmxvY2sgKHJlcGxhY2UtcmVnZXhwLWluLXN0 cmluZyAiTkFNRVxcLnBuZyIgdGVtcC1maWxlLXBuZyBjb2RlLWJsb2NrKSkKKyAgICAodW53aW5k LXByb3RlY3QKKyAgICAgICAgKG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0CisgICAgICAgICBjb2Rl LWJsb2NrCisgICAgICAgICAob3JnLWJhYmVsLWV4ZWN1dGUtc3JjLWJsb2NrKQorICAgICAgICAg KHNob3VsZCAoc2VhcmNoLWZvcndhcmQgKGZvcm1hdCAiW1tmaWxlOiVzXV0iIHRlbXAtZmlsZS1w bmcpIG5pbCBuaWwpKQorICAgICAgICAgKHNob3VsZCAoZmlsZS1yZWFkYWJsZS1wIHRlbXAtZmls ZS1wbmcpKSkKKyAgICAgIChkZWxldGUtZmlsZSB0ZW1wLWZpbGUtcG5nKSkpKQorCisocHJvdmlk ZSAndGVzdC1vYi1tYXRsYWIpCis7OzsgdGVzdC1vYi1tYXRsYWIuZWwgZW5kcyBoZXJlIChlbWFj cy1saXNwLWNoZWNrZG9jKQorCis7OyBMb2NhbFdvcmRzOiAgZmJvdW5kcCBlYmNhZGRiIGVmZGYg ZmMgRVJST1JUWFQgZmNhYWJiIGZkYWEgY2VlZCBzZXRxIGVudiBCVEVTVApkaWZmIC0tZ2l0IGEv dGVzdGluZy9vcmctdGVzdC5lbCBiL3Rlc3Rpbmcvb3JnLXRlc3QuZWwKaW5kZXggNTJkMzhjM2Zk Li45M2RmYTQ2ZmMgMTAwNjQ0Ci0tLSBhL3Rlc3Rpbmcvb3JnLXRlc3QuZWwKKysrIGIvdGVzdGlu Zy9vcmctdGVzdC5lbApAQCAtMTMzLDYgKzEzMywyNyBAQCBjdXJyZW50bHkgZXhlY3V0ZWQuIikK ICAgICAgICAodW5sZXNzIChvciB2aXNpdGVkLXAgKG5vdCB0by1iZS1yZW1vdmVkKSkKIAkgKGtp bGwtYnVmZmVyIHRvLWJlLXJlbW92ZWQpKSkpKQogCisoZGVmdW4gb3JnLXRlc3QtZ2V0LWNvZGUt YmxvY2sgKGlkICZvcHRpb25hbCBjb3VudCkKKyAgIkdldCB0aGUgQ09VTlQsIGRlZmF1bHRpbmcg dG8gZmlyc3QsIGNvZGUgYmxvY2sgYWZ0ZXIgSUQuIgorICAobGV0KiAoKGlkLWxvY2F0aW9uIChv cmctaWQtZmluZCBpZCkpCisgICAgICAgICAoaWQtZmlsZSAoY2FyIGlkLWxvY2F0aW9uKSkKKyAg ICAgICAgICh2aXNpdGVkLXAgKGdldC1maWxlLWJ1ZmZlciBpZC1maWxlKSkKKyAgICAgICAgIGNv ZGUtYmxvY2sKKyAgICAgICAgIHRvLWJlLXJlbW92ZWQpCisgICAgKHVud2luZC1wcm90ZWN0Cisg ICAgICAgIChzYXZlLXdpbmRvdy1leGN1cnNpb24KKyAgICAgICAgICAoc2F2ZS1tYXRjaC1kYXRh CisgICAgICAgICAgICAob3JnLWlkLWdvdG8gaWQpCisgICAgICAgICAgICAob3JnLWJhYmVsLW5l eHQtc3JjLWJsb2NrIGNvdW50KQorICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQorICAg ICAgICAgICAgKHNldHEgY29kZS1ibG9jayAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVz CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAocmUtc2VhcmNoLWZvcndhcmQgIl5bIFx0XSojXFwrZW5kX3NyY1sgXHRc cl0qXG4iKSkpCisgICAgICAgICAgICAoc2V0cSB0by1iZS1yZW1vdmVkIChjdXJyZW50LWJ1ZmZl cikpKSkKKyAgICAgICh1bmxlc3MgKG9yIHZpc2l0ZWQtcCAobm90IHRvLWJlLXJlbW92ZWQpKQor ICAgICAgICAoa2lsbC1idWZmZXIgdG8tYmUtcmVtb3ZlZCkpKQorICAgIGNvZGUtYmxvY2spKQor CiAoZGVmbWFjcm8gb3JnLXRlc3QtaW4tZXhhbXBsZS1maWxlIChmaWxlICZyZXN0IGJvZHkpCiAg ICJFeGVjdXRlIGJvZHkgaW4gdGhlIE9yZyBleGFtcGxlIGZpbGUuIgogICAoZGVjbGFyZSAoaW5k ZW50IDEpIChkZWJ1ZyB0KSkK --0000000000000539db062ac1eb7a--