From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Susam Pal Newsgroups: gmane.emacs.devel Subject: Re: [NonGNU ELPA] New package: devil Date: Tue, 9 May 2023 21:56:57 +0100 Message-ID: References: <875y91uc9f.fsf@posteo.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000002a1da605fb490122" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="28540"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Philip Kaludercic Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue May 09 22:58:21 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pwUPd-0007D3-30 for ged-emacs-devel@m.gmane-mx.org; Tue, 09 May 2023 22:58:21 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwUOy-0003II-Ir; Tue, 09 May 2023 16:57:40 -0400 Original-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 1pwUOw-0003I0-Kt for emacs-devel@gnu.org; Tue, 09 May 2023 16:57:38 -0400 Original-Received: from mail-yb1-xb2d.google.com ([2607:f8b0:4864:20::b2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pwUOt-0001SY-Qj for emacs-devel@gnu.org; Tue, 09 May 2023 16:57:38 -0400 Original-Received: by mail-yb1-xb2d.google.com with SMTP id 3f1490d57ef6-b9d8e8898eeso8221678276.1 for ; Tue, 09 May 2023 13:57:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1683665854; x=1686257854; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Ga+7/K5AWSPuBm1YUeqeXcfZaiPLV0o1aC7w4opkiBQ=; b=iiqlwWSM0iqKpRL259IP0KnM2ZmcW6meqH+3hZwg28yoDZDr1qzUpkWHOi0Cz6rQcO vrVO4wbDztpG70/q90AIUkws0BgK2ddEEnARL6lvRBUqYSu3cmcUxcl/qIeNdChLVi1o Zg5+lHIDNWUzpMtgRlMeZQZECMT/V24lFPlOp2y+JqsNmhWKjO574A1LKi/IwTacqgEr 7wnZ+yWbFB3zsopIZ9mTiJ/vj5yWuQWiU27ZnVhCU7wxKQY8Fjr2x3BpeNIh9DAbjkzf RhNs2XZDYPyMfI02i0kTTyFD7p9noUW0wVSBy4U/21TunGP4jVwqv4aCZ9rtg8jbxMR8 biGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683665854; x=1686257854; 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=Ga+7/K5AWSPuBm1YUeqeXcfZaiPLV0o1aC7w4opkiBQ=; b=dD7EyQCTS/CXKIb91e12ENfHgQlyESIE62G8lCtjUTJrO/WLraZ2OE8Z5rFT0eq/7M FWCQyF6e4NI9EJ72R2UzwZAwaP+X/kRcR8Pw02cVKXeYwrT3EKXtH/MwTsvoHKIK2Lo7 nyAEa1QcBnPYHxErDM/39fOKbgpVTGmPokLYv1IfxKMP/rD4ZIrYb1ZZrqDjCFEwD0F6 wcltAysVwFg7JBsuI0gD96uLfoY3JzWEOhsXJnQeepNCe4MUO5aPxZuDAM53VFQljrSN C77G2ptEGAiXsFw8Uf2Kc2IyjLqBRELGGxmzZ9JQ896bBHd1wjdOJoDQwuvNrxRG/zg7 cHoA== X-Gm-Message-State: AC+VfDwZYz4l1KTEWUmW7xmL3gDssEo10mvaiIDUWNZrG68z8GJZ1NXl F/DhTwKCM8ZQcxU4bZjn1irsrtodRE8pAXCcs9A4WMmAZt8= X-Google-Smtp-Source: ACHHUZ5OPnCY+1FrqZWaPlvnDhfIQxWX54tMpIRe3r0oOON2Mbs9alRJ/41x2tv85RO4/fNZ+XvC0IplCQtOpV/dPWY= X-Received: by 2002:a25:1545:0:b0:b8f:48ef:7d89 with SMTP id 66-20020a251545000000b00b8f48ef7d89mr15587308ybv.6.1683665854242; Tue, 09 May 2023 13:57:34 -0700 (PDT) In-Reply-To: <875y91uc9f.fsf@posteo.net> Received-SPF: pass client-ip=2607:f8b0:4864:20::b2d; envelope-from=susam.pal@gmail.com; helo=mail-yb1-xb2d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:306016 Archived-At: --0000000000002a1da605fb490122 Content-Type: text/plain; charset="UTF-8" Philip Kaludercic wrote: > Susam Pal writes: > > > Hello! > > > > I am the author and maintainer of a new package named Devil. This package > > intercepts keystrokes entered by the user and applies translation rules to > > translate the keystrokes into Emacs key sequences. It supports three types > > of rules: special keys that map to custom commands that are invoked > > immediately prior to any translations, translation rules to translate Devil > > key sequences to regular Emacs key sequences, and repeatable keys to allow > > a Devil key sequence to be repeated by typing the last keystroke over and > > over again using a transient map. > > > > See the README at https://github.com/susam/devil for more details. > > Looks interesting, here is a diff with a few comments: Thanks for the review and the diff! The code looks much better with these changes. Like we discussed a little while ago in the #emacs channel, if you send me the patches, I'll apply it to the code. > > diff -u /home/philip/devil.el.1 /home/philip/devil.el > --- /home/philip/devil.el.1 2023-05-09 10:37:55.243222106 +0200 > +++ /home/philip/devil.el 2023-05-09 10:39:50.110922443 +0200 > @@ -36,34 +36,42 @@ > ;; key sequences without using modifier keys. > > ;;; Code: > + > +(defgroup devil '() > + "Minor mode for Devil-like command entering." ;is there a clearer description? > + :prefix "devil-" > + :group 'editing) > + > (defconst devil-version "0.2.0" > "Devil version number.") Yes, a possible description could be: "Minor mode for intercepting and translating key sequences." > > -(defun devil-show-version () > +(defun devil-show-version () ;is this really needed? > "Show Devil version number in the echo area." > (interactive) > (message "Devil %s" devil-version)) Picked this style from markdown-mode: https://github.com/jrblevin/markdown-mode/blob/master/markdown-mode.el#L9762-L9765 Although not strictly necessary, I thought it does not hurt to provide a convenient command here. > -(defvar devil-key "," > +(defcustom devil-key "," > "The key sequence that begins Devil input. > > The key sequence must be specified in the format returned by `C-h > -k' (`describe-key'). This variable should be set before enabling > -Devil mode for it to take effect.") > - > -(defvar devil-lighter " Devil" > - "String displayed on the mode line when Devil mode is enabled.") > +k' (`describe-key'). This variable should be set before enabling > +Devil mode for it to take effect." > + :type 'key-sequence) > + > +(defcustom devil-lighter " Devil" > + "String displayed on the mode line when Devil mode is enabled." > + :type 'string) > > (defvar devil-mode-map > (let ((map (make-sparse-keymap))) > - (define-key map (kbd devil-key) #'devil) > + (define-key map devil-key #'devil) > map) > "Keymap to wake up Devil when `devil-key' is typed. > > By default, only `devil-key' is added to this keymap so that > -Devil can be activated using it. To support multiple activation > +Devil can be activated using it. To support multiple activation > keys, this variable may be modified to a new keymap that defines > -multiple different keys to activate Devil. This variable should > +multiple different keys to activate Devil. This variable should > be modified before loading Devil for it to take effect.") > > ;;;###autoload > @@ -74,15 +82,16 @@ > > ;;;###autoload > (define-globalized-minor-mode > - global-devil-mode devil-mode devil--on :group 'devil > + global-devil-mode devil-mode devil--on ;; :group 'devil (not needed with the defgroup above) > (if global-devil-mode (devil-add-extra-keys) (devil-remove-extra-keys))) > > (defun devil--on () > "Turn Devil mode on." > (devil-mode 1)) > > -(defvar devil-logging nil > - "Non-nil if and only if Devil should print log messages.") > +(defcustom devil-logging nil > + "Non-nil if and only if Devil should print log messages." > + :type 'boolean) > > (defvar devil-special-keys > (list (cons "%k %k" (lambda () (interactive) (devil-run-key "%k"))) > @@ -91,12 +100,12 @@ > "Special Devil keys that are executed as soon as they are typed. > > The value of this variable is an alist where each key represents > -a Devil key sequence. If a Devil key sequence matches any key in > +a Devil key sequence. If a Devil key sequence matches any key in > this alist, the function or lambda in the corresponding value is > -invoked. The format control specifier `%k' may be used to > +invoked. The format control specifier `%k' may be used to > represent `devil-key' in the keys.") > > -(defvar devil-translations > +(defcustom devil-translations > (list (cons "%k z" "C-") > (cons "%k %k" "%k") > (cons "%k m m" "M-") > @@ -108,12 +117,13 @@ > a translation rule that is applied on the Devil key sequence read > from the user to obtain the Emacs key sequence to be executed. > The translation rules are applied in the sequence they occur in > -the alist. For each rule, if the key occurs anywhere in the Devil > +the alist. For each rule, if the key occurs anywhere in the Devil > key sequence, it is replaced with the corresponding value in the > -translation rule. The format control specifier `%k' may be used > -to represent `devil-key' in the keys.") > +translation rule. The format control specifier `%k' may be used > +to represent `devil-key' in the keys." > + :type '(alist :key-type string :value-type string)) > > -(defvar devil-repeatable-keys > +(defcustom devil-repeatable-keys > (list "%k p" > "%k n" > "%k f" > @@ -128,8 +138,9 @@ > > The value of this variable is a list where each item represents a > key sequence that may be repeated merely by typing the last > -character in the key sequence. The format control specified `%k' > -may be used to represent `devil-key' in the keys.") > +character in the key sequence. The format control specified `%k' > +may be used to represent `devil-key' in the keys." > + :type '(repeat string)) > > (defun devil-run-key (key) > "Execute the given key sequence KEY. > @@ -140,7 +151,7 @@ > (dolist (key (split-string key)) > (if (string= key "%k") (insert devil-key) (execute-kbd-macro (kbd key))))) > > -(defvar devil--saved-keys > +(defvar devil--saved-keys nil ;otherwise `devil--saved-keys' is assigned a string > "Original key bindings saved by Devil.") > > (defun devil-add-extra-keys () > @@ -160,8 +171,9 @@ > > (defun devil--original-keys-to-be-saved () > "Return an alist of keys that will be modified by Devil." > - (list (cons 'isearch-comma (lookup-key isearch-mode-map (kbd devil-key))) > - (cons 'universal-u (lookup-key universal-argument-map (kbd "u"))))) > + ;; Weak suggestions > + `((isearch-comma . ,(lookup-key isearch-mode-map (kbd devil-key))) > + universal-u . ,(lookup-key universal-argument-map (kbd "u")))) > > (defun devil () > "Wake up Devil to read and translate Devil key sequences." > @@ -178,27 +190,30 @@ > after translation to Emacs key sequence. > > The argument KEY is a vector that represents the key sequence > -read so far. This function reads a new key from the user, appends > +read so far. This function reads a new key from the user, appends > it to KEY, and then checks if the result is a valid key sequence > -or an undefined key sequence. If the result is a valid key > +or an undefined key sequence. If the result is a valid key > sequence for a special key command or an Emacs command, then the > -command is executed. Otherwise, this function calls itself > +command is executed. Otherwise, this function calls itself > recursively to read yet another key from the user." > (setq key (vconcat key (vector (read-key (devil--make-prompt key))))) > (unless (devil--run-command key) > (devil--read-key key))) > > -(defvar devil-prompt "Devil: %t" > +(defcustom devil-prompt "Devil: %t" > "A format control string that determines the Devil prompt. > > The following format control sequences are supported: > > %k - Devil key sequence read by Devil so far. > %t - Emacs key sequence translated from Devil key sequence read so far. > -%% - The percent sign.") > +%% - The percent sign." > + :type 'string) > > (defun devil--make-prompt (key) > "Create Devil prompt based on the given KEY." > + ;; If you are interested in adding Compat as a dependency, you can > + ;; make use of `format-spec' without raining the minimum version. > (let ((result devil-prompt) > (controls (list (cons "%k" (key-description key)) > (cons "%t" (devil-translate key)) > @@ -210,16 +225,16 @@ > (defun devil--run-command (key) > "Try running the command bound to the key sequence in KEY. > > -KEY is a vector that represents a sequence of keystrokes. If KEY > +KEY is a vector that represents a sequence of keystrokes. If KEY > is found to be a special key in `devil-special-keys', the > corresponding special command is executed immediately and t is > returned. > > Otherwise, it is translated to an Emacs key sequence using > -`devil-translations'. If the resulting Emacs key sequence is > +`devil-translations'. If the resulting Emacs key sequence is > found to be a complete key sequence, the command it is bound to > -is executed interactively and t is returned. If it is found to be > -an undefined key sequence, then t is returned. If the resulting > +is executed interactively and t is returned. If it is found to be > +an undefined key sequence, then t is returned. If the resulting > Emacs key sequence is found to be an incomplete key sequence, > then nil is returned." > (devil--log "Trying to execute key: %s" (key-description key)) > @@ -231,7 +246,7 @@ > > If the given key sequence KEY is found to be a special key in > `devil-special-keys', the corresponding special command is > -executed, and t is returned. Otherwise nil is returned." > +executed, and t is returned. Otherwise nil is returned." > (catch 'break > (dolist (entry devil-special-keys) > (when (string= (key-description key) (devil-format (car entry))) > @@ -245,14 +260,14 @@ > > After translating KEY to an Emacs key sequence, if the resulting > key sequence turns out to be an incomplete key, then nil is > -returned. If it turns out to be a complete key sequence, the > -corresponding Emacs command is executed, and t is returned. If it > -turns out to be an undefined key sequence, t is returned. The > +returned. If it turns out to be a complete key sequence, the > +corresponding Emacs command is executed, and t is returned. If it > +turns out to be an undefined key sequence, t is returned. The > return value t indicates to the caller that no more Devil key > sequences should be read from the user." > (let* ((described-key (key-description key)) > (translated-key (devil-translate key)) > - (parsed-key (condition-case nil (kbd translated-key) (error nil))) > + (parsed-key (condition-case nil (kbd translated-key) (error nil))) ;or `ignore-errors' > (binding (when parsed-key (key-binding parsed-key)))) > (cond ((string-match "[ACHMSs]-$" translated-key) > (devil--log "Ignoring incomplete key: %s => %s" > @@ -307,27 +322,27 @@ > "Update variables that maintain command loop information. > > The given KEY and BINDING is used to update variables that > -maintain command loop information. This allows the commands that > +maintain command loop information. This allows the commands that > depend on them behave as if they were being invoked directly with > the original Emacs key sequence." > ;; > ;; Set `last-command-event' so that `digit-argument' can determine > - ;; the correct digit for key sequences like , 5 (C-5). See M-x > + ;; the correct digit for key sequences like , 5 (C-5). See M-x > ;; find-function RET digit-argument RET for details. > (setq last-command-event (aref key (- (length key) 1))) > ;; > ;; Set `this-command' to make several commands like , z SPC , z SPC > - ;; (C-SPC C-SPC) and , p (C-p) work correctly. Emacs copies > - ;; `this-command' to `last-command'. Both variables are used by > + ;; (C-SPC C-SPC) and , p (C-p) work correctly. Emacs copies > + ;; `this-command' to `last-command'. Both variables are used by > ;; `set-mark-command' to decide whether to activate/deactivate the > - ;; current mark. The first variable is used by vertical motion > - ;; commands to keep the cursor at the `temporary-goal-column'. There > + ;; current mark. The first variable is used by vertical motion > + ;; commands to keep the cursor at the `temporary-goal-column'. There > ;; may be other commands too that depend on this variable. > (setq this-command binding) > ;; > ;; Set `real-this-command' to make , x z (C-x z) work correctly. > ;; Emacs copies it to `last-repeatable-command' which is then used > - ;; by repeat. See the following for more details: > + ;; by repeat. See the following for more details: > ;; > ;; - M-x find-function RET repeat RET > ;; - C-h v last-repeatable-command RET > @@ -337,11 +352,12 @@ > (defun devil--log-command-loop-info () > "Log command loop information for debugging purpose." > (devil--log > - (concat "Found " > - (format "current-prefix-arg: %s; " current-prefix-arg) > - (format "this-command: %s; " this-command) > - (format "last-command: %s; " last-command) > - (format "last-repeatable-command: %s" last-repeatable-command)))) > + (format "Found current-prefix-arg: %s; \ > +this-command: %s; last-command: %s; last-repeatable-command: %s" > + current-prefix-arg > + this-command > + last-command > + last-repeatable-command))) > > (defun devil--repeatable-key-p (described-key) > "Return t iff DESCRIBED-KEY belongs to `devil-repeatable-keys'." > @@ -379,28 +395,25 @@ > (when devil-logging > (apply #'message (concat "Devil: " format-string) args))) > > -(defmacro devil--assert (form) > - "Evaluate FORM and cause error if the result is nil." > - `(unless ,form > - (error "Assertion failed: %s" ',form))) > - > -(defun devil--tests () > - "Test Devil functions assuming Devil has not been customized." > - (devil--assert (devil--invalid-key-p "")) > - (devil--assert (devil--invalid-key-p "C-x-C-f")) > - (devil--assert (devil--invalid-key-p "C-x CC-f")) > - (devil--assert (not (devil--invalid-key-p "C-x C-f"))) > - (devil--assert (not (devil--invalid-key-p "C-M-x"))) > - (devil--assert (string= (devil-translate (vconcat ",")) "C-")) > - (devil--assert (string= (devil-translate (vconcat ",x")) "C-x")) > - (devil--assert (string= (devil-translate (vconcat ",x,")) "C-x C-")) > - (devil--assert (string= (devil-translate (vconcat ",x,f")) "C-x C-f")) > - (devil--assert (string= (devil-translate (vconcat ",,")) ",")) > - (devil--assert (string= (devil-translate (vconcat ",,,,")) ", ,")) > - (devil--assert (string= (devil-translate (vconcat ",mx")) "C-M-x")) > - (devil--assert (string= (devil-translate (vconcat ",mmx")) "M-x")) > - (devil--assert (string= (devil-translate (vconcat ",mmm")) "M-m")) > - (message "Done")) > +(ert-deftest devil-invalid-key-p () > + "Test if `devil--invalid-key-p' words as expected." > + (should (devil--invalid-key-p "")) > + (should (devil--invalid-key-p "C-x-C-f")) > + (should (devil--invalid-key-p "C-x CC-f")) > + (should (not (devil--invalid-key-p "C-x C-f"))) > + (should (not (devil--invalid-key-p "C-M-x")))) > + > +(ert-deftest devil-translate () > + "Test if `devil-translate' works as expected." > + (should (string= (devil-translate (vconcat ",")) "C-")) > + (should (string= (devil-translate (vconcat ",x")) "C-x")) > + (should (string= (devil-translate (vconcat ",x,")) "C-x C-")) > + (should (string= (devil-translate (vconcat ",x,f")) "C-x C-f")) > + (should (string= (devil-translate (vconcat ",,")) ",")) > + (should (string= (devil-translate (vconcat ",,,,")) ", ,")) > + (should (string= (devil-translate (vconcat ",mx")) "C-M-x")) > + (should (string= (devil-translate (vconcat ",mmx")) "M-x")) > + (should (string= (devil-translate (vconcat ",mmm")) "M-m"))) > > (provide 'devil) > > > Diff finished. Tue May 9 10:39:57 2023 > > --=-=-= > Content-Type: text/plain > > > > Also, see https://www.reddit.com/r/emacs/comments/13aj99j/ for some > > discussion on this new package. > > > > Please let me know if this package can be added to NonGNU ELPA. If there > > are any questions or feedback about this, please let me know. > > I see no reason why not. Thanks for contributing. > > One point I have already mentioned on IRC is that a separate manual and > a shorter README would be nice. We can generate a TeXinfo manual from > either .texi or .org files, would you be interested in setting that up? This is a great idea. I have a busy schedule coming up in the next few weeks, so it may take me a while to do this though. In the meantime, if someone is willing to help with this, I will gladly accept the changes. > > > Regards, > > Susam > > From 3499d93502b130b1dcb8a648e73e7a614cd24abd Mon Sep 17 00:00:00 2001 > > From: Susam Pal > > Date: Tue, 9 May 2023 02:36:08 +0100 > > Subject: [PATCH] * elpa-packages (devil): New package > > > > --- > > elpa-packages | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/elpa-packages b/elpa-packages > > index c333cc8bb3..f6fd68edaf 100644 > > --- a/elpa-packages > > +++ b/elpa-packages > > @@ -112,6 +112,8 @@ > > > > (devhelp :url "https://codeberg.org/akib/emacs-devhelp") > > > > + (devil :url "https://github.com/susam/devil") > > As you have a CHANGES.md file, we can add a :news entry here as well. Attached an updated patch. > > > + > > (diff-ansi :url "https://codeberg.org/ideasman42/emacs-diff-ansi" > > :ignored-files ("LICENSE")) I believe we can continue working on the proposed improvements and make them available in new versions. Is there anything that is currently a blocker to include this package into NonGNU ELPA? Regards, Susam --0000000000002a1da605fb490122 Content-Type: application/octet-stream; name="0001-elpa-packages-devil-New-package.patch" Content-Disposition: attachment; filename="0001-elpa-packages-devil-New-package.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lhgr548k0 RnJvbSBlZjM2MjEzOWFkNTdmNTRhYjBiNjcyYjM5MDBjYTU3YmEzNjM0MzFmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTdXNhbSBQYWwgPHN1c2FtQHN1c2FtLm5ldD4KRGF0ZTogVHVl LCA5IE1heSAyMDIzIDIxOjUzOjA5ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gKiBlbHBhLXBhY2th Z2VzIChkZXZpbCk6IE5ldyBwYWNrYWdlCgotLS0KIGVscGEtcGFja2FnZXMgfCA1ICsrKysrCiAx IGZpbGUgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZWxwYS1wYWNrYWdl cyBiL2VscGEtcGFja2FnZXMKaW5kZXggYzMzM2NjOGJiMy4uYzhlNDQ4NmEyYSAxMDA2NDQKLS0t IGEvZWxwYS1wYWNrYWdlcworKysgYi9lbHBhLXBhY2thZ2VzCkBAIC0xMTIsNiArMTEyLDExIEBA CiAKICAoZGV2aGVscCAgICAgICAgICAgICAgIDp1cmwgImh0dHBzOi8vY29kZWJlcmcub3JnL2Fr aWIvZW1hY3MtZGV2aGVscCIpCiAKKyAoZGV2aWwKKyAgOnVybCAiaHR0cHM6Ly9naXRodWIuY29t L3N1c2FtL2RldmlsIgorICA6cmVhZG1lICJSRUFETUUubWQiCisgIDpuZXdzICJDSEFOR0VTLm1k IikKKwogIChkaWZmLWFuc2kJCTp1cmwgImh0dHBzOi8vY29kZWJlcmcub3JnL2lkZWFzbWFuNDIv ZW1hY3MtZGlmZi1hbnNpIgogICA6aWdub3JlZC1maWxlcyAoIkxJQ0VOU0UiKSkKIAotLSAKMi4z Mi4wIChBcHBsZSBHaXQtMTMyKQoK --0000000000002a1da605fb490122--