From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jonas Bernoulli Newsgroups: gmane.emacs.devel Subject: extensions to lisp-mnt.el Date: Tue, 17 Nov 2009 22:05:38 +0100 Message-ID: <201bac3a0911171305h60ce419bx2d547c259b391234@mail.gmail.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=000e0cd59f9e1d87d20478977e12 X-Trace: ger.gmane.org 1258496078 13147 80.91.229.12 (17 Nov 2009 22:14:38 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 17 Nov 2009 22:14:38 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Nov 17 23:14:31 2009 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NAWJb-0002tU-RX for ged-emacs-devel@m.gmane.org; Tue, 17 Nov 2009 23:14:30 +0100 Original-Received: from localhost ([127.0.0.1]:33787 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NAWJb-0001u2-8j for ged-emacs-devel@m.gmane.org; Tue, 17 Nov 2009 17:14:23 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NAVFW-00086J-QW for emacs-devel@gnu.org; Tue, 17 Nov 2009 16:06:06 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NAVFS-00081B-I8 for emacs-devel@gnu.org; Tue, 17 Nov 2009 16:06:06 -0500 Original-Received: from [199.232.76.173] (port=38085 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NAVFS-00080g-AU for emacs-devel@gnu.org; Tue, 17 Nov 2009 16:06:02 -0500 Original-Received: from mail-gx0-f224.google.com ([209.85.217.224]:46615) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NAVFR-0005lY-AI for emacs-devel@gnu.org; Tue, 17 Nov 2009 16:06:02 -0500 Original-Received: by gxk24 with SMTP id 24so507645gxk.6 for ; Tue, 17 Nov 2009 13:05:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:from:date :x-google-sender-auth:message-id:subject:to:content-type; bh=JriTPh/Mv8NY+Ict0RMAp9lMNd59onsU37W6KM6EDCc=; b=TUC/I9jFtr5XkXF5tW8VpHnpLXxQqf5i1dt/gjNSuGgAvesCE72nYRNdccjFP63yng Hy3ConFT2lk0qOFNcma8BtEfnZbvKSzZWW0rHRNxCzXVJAgCTlg2DgmLI3KVpmQUGyEe 7fCIK90eooxIEW0/f/rWPE49nEdkDe2UujeQw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:from:date:x-google-sender-auth:message-id :subject:to:content-type; b=eZWthU4lFZ6md57jZjPrZmUhCn8G8H/bYfaRSAxsZbI/Ns60HMZS1pEdYJQ5Yc97kq 0h1YtNMdVy9g2HpOcFQMkw9OL/EFE/lyAHLrSKVAgTMI5vAP5vL66nQe5D5tWJpOHzC+ lP09Hr5KDYj5gQwdZnFqegolRoyAlsaXtlMKM= Original-Received: by 10.150.46.30 with SMTP id t30mr927256ybt.50.1258491958101; Tue, 17 Nov 2009 13:05:58 -0800 (PST) X-Google-Sender-Auth: 31ff154857901191 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-Mailman-Approved-At: Tue, 17 Nov 2009 17:14:15 -0500 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:117127 Archived-At: --000e0cd59f9e1d87d20478977e12 Content-Type: text/plain; charset=UTF-8 Hello, A "long" time ago I wrote `elx.el' an extension to `lisp-mnt.el'. From it's commentary. ;; This extends library `lisp-mnt', which is only suitable for libraries ;; that closely follow the header conventions. Unfortunately there are ;; many libraries that do not - this library tries to cope with that. Some of the things that this library does could probably be merged into `lisp-mnt': (Here I use the lm- prefix though my library uses elx- which stands for emacs lisp extract). * lm-with-file: execute BODY in current-buffer not only if FILE is nil but also if it is equal to `file-buffer-name' This is useful when several lm-* have to be called. Just set FILE to nil you say? Well some functions require the file name for other things than just opening the file. * lm-summary: optionally standardize returned string * lm-commentary: cleanup the returned string some more * lm-license: extract the license if it known (a short string :-) * lm-adapted-by: like lm-maintainer * I have reimplemented some of the functions already defined in lisp-mnt.el, because the originals where buggy, I would have to figure out which these are though. Some additions which probably can't go into `lisp-mnt.el' without some prior work (or at all): * elx-created, elx-updated: return date when library was created last updated * elx-require, elx-provide: return list of required/provided features (regex search) * elx-version[+>]: extract version, the functions with a suffix are useful If some of these modifications/additions seam interesting I can create patches. I just wanted to ask first before I start working on it. Best regards, Jonas --000e0cd59f9e1d87d20478977e12 Content-Type: application/octet-stream; name="elx.el" Content-Disposition: attachment; filename="elx.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g255ixey0 Ozs7IGVseC5lbCAtLS0gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIEVtYWNzIExpc3AgbGlicmFy aWVzCgo7OyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIEpvbmFzIEJlcm5vdWxsaQoKOzsgQXV0 aG9yOiBKb25hcyBCZXJub3VsbGkgPGpvbmFzQGJlcm5vdWwubGk+Cjs7IENyZWF0ZWQ6IDIwMDgx MjAyCjs7IFVwZGF0ZWQ6IDIwMDkwODAyCjs7IFZlcnNpb246IDAuMC45Cjs7IEhvbWVwYWdlOiBo dHRwczovL2dpdGh1Yi5jb20vdGFyc2l1cy9lbHgKOzsgS2V5d29yZHM6IGxpYnJhcmllcwoKOzsg VGhpcyBmaWxlIGlzIG5vdCBwYXJ0IG9mIEdOVSBFbWFjcy4KCjs7IFRoaXMgZmlsZSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cjs7IGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5Cjs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMs IG9yIChhdCB5b3VyIG9wdGlvbikKOzsgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBUaGlzIGZpbGUg aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVudGFyeToKCjs7IFRoaXMg bGlicmFyeSBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIEVtYWNzIExpc3AgbGlicmFyaWVzLgoK OzsgVGhpcyBleHRlbmRzIGxpYnJhcnkgYGxpc3AtbW50Jywgd2hpY2ggaXMgb25seSBzdWl0YWJs ZSBmb3IgbGlicmFyaWVzCjs7IHRoYXQgY2xvc2VseSBmb2xsb3cgdGhlIGhlYWRlciBjb252ZW50 aW9ucy4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlCjs7IG1hbnkgbGlicmFyaWVzIHRoYXQgZG8g bm90IC0gdGhpcyBsaWJyYXJ5IHRyaWVzIHRvIGNvcGUgd2l0aCB0aGF0LgoKOzsgVGhpcyBsaWJy YXJ5IGlzIGFsc28gYWJsZSB0byBleHRyYWN0IHNvbWUgdmFsdWVzIHRoYXQgYGxpc3AtbW50JyBj YW4ndC4KOzsgTW9zdCBub3RhYmx5IHRoaXMgbGlicmFyeSBjYW4gZXh0cmFjdCB0aGUgZmVhdHVy ZXMgcmVxdWlyZWQgYW5kCjs7IHByb3ZpZGVkIGJ5IGEgZmlsZSBvciBncm91cCBvZiBmaWxlcy4g IExpYnJhcmllcyBgbG9hZC1oaXN0JyBhbmQKOzsgYGxpYi1yZXF1aXJlcycgcHJvdmlkZSBzaW1p bGFyIGZ1bmN0aW9uYWxpdHkgYnkgaW5zcGVjdGluZwo7OyBgbG9hZC1oaXN0b3J5JyBhbmQgdGh1 cyByZXF1aXJlIHRoZSBpbnNwZWN0ZWQgbGlicmFyeSB0byBiZSBsb2FkZWQuCgo7OyBUaGlzIGxp YnJhcnkgb24gdGhlIG90aGVyIGhhbmQgdXNlcyByZWdleHAgc2VhcmNoIGluIHRoZSByZXNwZWN0 aXZlCjs7IGZpbGVzIG1ha2luZyBpdCB1bm5lY2Vzc2FyeSB0byBsb2FkIHRoZW0gZmlyc3QuICBU aGlzIG1lYW5zIHRoYXQgdGhlCjs7IGByZXF1aXJlJyBhbmQgYHByb3ZpZGUnIGhhdmUgdG8gc2F0 aXNmeSBjZXJ0YWluIHJlc3RyaWN0aW9ucyAoc2VlCjs7IGBlbHgtcmVxdWlyZWQnIGFuZCBgZWx4 LXByb3ZpZGVkJykgYW5kIGZlYXR1cmVzIHJlcXVpcmVkIG9yIHByb3ZpZGVkCjs7IGJ5IG90aGVy IG1lYW5zIGFyZSBub3QgcmVjb2duaXplZC4gIEJ1dCB0aGlzIGlzIHZlcnkgcmFyZSwgYW5kIHRo aXMKOzsgbGlicmFyeSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGNhbiBiZSB1c2VkIGV2ZW4g d2hlbiB0aGUgcmVxdWlyZWQKOzsgZmVhdHVyZXMgY2FuJ3QgYmUgbG9hZGVkIChiZWNhdXNlIHRo ZSBwcm92aWRpbmcgbGlicmFyaWVzIGFyZSBub3QKOzsgYXZhaWxhYmxlKSBvciB3aGVuIG9uZSBk b2Vzbid0IHdhbnQgdG8gbG9hZCB0aGVtIGZvciBzZWN1cml0eSByZWFzb25zLgoKOzs7IENvZGU6 CgoocmVxdWlyZSAnY2wpCihyZXF1aXJlICdkY29udikKKHJlcXVpcmUgJ3Zjb21wKQoocmVxdWly ZSAnbGlzcC1tbnQpCgooZGVmZ3JvdXAgbGliLWluZm8gbmlsCiAgIkV4dHJhY3QgaW5mb3JtYXRp b24gZnJvbSBFbWFjcyBMaXNwIGxpYnJhcmllcy4iCiAgOmdyb3VwICdlbWFjcwogIDpsaW5rICco dXJsLWxpbmsgOnRhZyAiSG9tZXBhZ2UiICJodHRwczovL2dpdGh1Yi5jb20vdGFyc2l1cy9lbHgi KSkKCihkZWZtYWNybyBlbHgtd2l0aC1maWxlIChmaWxlICZyZXN0IGJvZHkpCiAgIkV4ZWN1dGUg Qk9EWSBpbiBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBGSUxFLgpJZiBGSUxF IGlzIG5pbCBvciBlcXVhbCB0byBgYnVmZmVyLWZpbGUtbmFtZScgZXhlY3V0ZSBCT0RZIGluIHRo ZQpjdXJyZW50IGJ1ZmZlci4gIE1vdmUgdG8gYmVnaW5uaW5nIG9mIGJ1ZmZlciBiZWZvcmUgZXhl Y3V0aW5nIEJPRFkuIgogIChkZWNsYXJlIChpbmRlbnQgMSkgKGRlYnVnIHQpKQogIChsZXQgKChm aWxlc3ltIChnZW5zeW0gImZpbGUiKSkpCiAgICBgKGxldCAoKCxmaWxlc3ltICxmaWxlKSkKICAg ICAgIChpZiAoYW5kICxmaWxlc3ltIChub3QgKGVxdWFsICxmaWxlc3ltIGJ1ZmZlci1maWxlLW5h bWUpKSkKCSAgICh3aXRoLXRlbXAtYnVmZmVyCgkgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAs ZmlsZXN5bSkKCSAgICAgKHdpdGgtc3ludGF4LXRhYmxlIGVtYWNzLWxpc3AtbW9kZS1zeW50YXgt dGFibGUKCSAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQoJICAgICAgICxAYm9keSkpCgkg KHNhdmUtZXhjdXJzaW9uCgkgICAod2l0aC1zeW50YXgtdGFibGUgZW1hY3MtbGlzcC1tb2RlLXN5 bnRheC10YWJsZQoJICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQoJICAgICAsQGJvZHkpKSkp KSkKCihkZWZ1biBlbHgtaGVhZGVyIChoZWFkZXIgJm9wdGlvbmFsIG11bHRpbGluZSkKICAiUmV0 dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgaGVhZGVyIG5hbWVkIEhFQURFUiwgYSBzdHJpbmcuCk9y IGlmIE1VTFRJTElORSBpcyBub24tbmlsIHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5ncywgb25lIHBl cgpjb250aW51YXRpb24gbGluZS4iCiAgKGlmIG11bHRpbGluZQogICAgICAobG0taGVhZGVyLW11 bHRpbGluZSBoZWFkZXIpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGxtLWhlYWRlciBoZWFk ZXIpKSkpCgo7OzsgRXh0cmFjdCBWYXJpb3VzLgoKKGRlZnVuIGVseC1zdW1tYXJ5ICgmb3B0aW9u YWwgZmlsZSBzdGFuZGFyZGl6ZSkKICAiUmV0dXJuIHRoZSBzdW1tYXJ5IG9mIGZpbGUgRklMRS4K T3IgdGhlIGN1cnJlbnQgYnVmZmVyIGlmIEZJTEUgaXMgZXF1YWwgdG8gYGJ1ZmZlci1maWxlLW5h bWUnIG9yIGlzIG5pbC4KSWYgU1RBTkRBUkRJWkUgaXMgbm9uLW5pbCByZW1vdmUgdHJhaWxpbmcg cGVyaW9kIGFuZCB1cGNhc2UgZmlyc3Qgd29yZC4iCiAgKGxldCAoKHN1bW1hcnkKCSAoZWx4LXdp dGgtZmlsZSBmaWxlCgkgICAod2hlbiAoYW5kIChsb29raW5nLWF0IGxtLWhlYWRlci1wcmVmaXgp CgkJICAgICAgKHByb2duIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkKCQkJICAgICAobG9va2lu Zy1hdCAiW14gXStbIFx0XSstLStbIFx0XStcXCguKlxcKSIpKSkKCSAgICAgKGxldCAoKHN1bW1h cnkgKG1hdGNoLXN0cmluZy1uby1wcm9wZXJ0aWVzIDEpKSkKCSAgICAgICAoaWYgKHN0cmluZy1t YXRjaCAiWyBcdF0qLVxcKi0uKi1cXCotIiBzdW1tYXJ5KQoJCSAgIChzdWJzdHJpbmcgc3VtbWFy eSAwIChtYXRjaC1iZWdpbm5pbmcgMCkpCgkJIHN1bW1hcnkpKSkpKSkKICAgICh1bmxlc3MgKG1l bWJlciBzdW1tYXJ5ICcobmlsICIiKSkKICAgICAgKHdoZW4gc3RhbmRhcmRpemUKCSh3aGVuIChz dHJpbmctbWF0Y2ggIlxcLiQiIHN1bW1hcnkpCgkgIChzZXRxIHN1bW1hcnkgKHN1YnN0cmluZyBz dW1tYXJ5IDAgLTEpKSkKCSh3aGVuIChzdHJpbmctbWF0Y2ggIl5bYS16XSIgc3VtbWFyeSkKCSAg KHNldHEgc3VtbWFyeQoJCShjb25jYXQgKHVwY2FzZSAoc3Vic3RyaW5nIHN1bW1hcnkgMCAxKSkK CQkJKHN1YnN0cmluZyBzdW1tYXJ5IDEpKSkpKQogICAgICBzdW1tYXJ5KSkpCgooZGVmdW4gZWx4 LWtleXdvcmRzICgmb3B0aW9uYWwgZmlsZSkKICAiUmV0dXJuIGxpc3Qgb2Yga2V5d29yZHMgZ2l2 ZW4gaW4gZmlsZSBGSUxFLgpPciB0aGUgY3VycmVudCBidWZmZXIgaWYgRklMRSBpcyBlcXVhbCB0 byBgYnVmZmVyLWZpbGUtbmFtZScgb3IgaXMgbmlsLiIKICAoZWx4LXdpdGgtZmlsZSBmaWxlCiAg ICAobGV0ICgoa2V5d29yZHMgKGVseC1oZWFkZXIgImtleXdvcmRzIiB0KSkpCiAgICAgICh3aGVu IGtleXdvcmRzCgkoc3BsaXQtc3RyaW5nCgkgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJICAi XFwoXHRcXHxcc1xcKSsiICJccyIKCSAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJICAgIiwi ICIiCgkgICAoZG93bmNhc2UgKG1hcGNvbmNhdCAjJ2lkZW50aXR5IGtleXdvcmRzICIgIikpKSkK CSAiICIpKSkpKQoKKGRlZnVuIGVseC1jb21tZW50YXJ5ICgmb3B0aW9uYWwgZmlsZSkKICAiUmV0 dXJuIHRoZSBjb21tZW50YXJ5IGluIGZpbGUgRklMRS4KT3IgdGhlIGN1cnJlbnQgYnVmZmVyIGlm IEZJTEUgaXMgZXF1YWwgdG8gYGJ1ZmZlci1maWxlLW5hbWUnIG9yIGlzIG5pbC4KClJldHVybiB0 aGUgdmFsdWUgYXMgYSBzdHJpbmcsIHdoaWNoIGxlYWRpbmcgc2VtaWNvbG9ucyBhbmQgb25lIHNw YWNlCnJlbW92ZWQuICBJbiB0aGUgZmlsZSwgdGhlIGNvbW1lbnRhcnkgc2VjdGlvbiBzdGFydHMg d2l0aCB0aGUgdGFnCmBDb21tZW50YXJ5JyBvciBgRG9jdW1lbnRhdGlvbicgYW5kIGVuZHMganVz dCBiZWZvcmUgdGhlIG5leHQgc2VjdGlvbi4KSWYgdGhlIGNvbW1lbnRhcnkgc2VjdGlvbiBpcyBh YnNlbnQsIHJldHVybiBuaWwuIgogIChlbHgtd2l0aC1maWxlIGZpbGUKICAgIChsZXQgKChzdGFy dCAobG0tc2VjdGlvbi1zdGFydCBsbS1jb21tZW50YXJ5LWhlYWRlciB0KSkpCiAgICAgICh3aGVu IHN0YXJ0CgkobGV0ICgoc3RyaW5nIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKCQkgICAgICAg IlxcYFtcblx0XHNdKiIgIiIKCQkgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCQki W1xuXHRcc10qXFwnIiAiIgoJCQkocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCgkJCSAiXjsrID8i ICIiCgkJCSAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzCgkJCSAgc3RhcnQgKGxtLWNv bW1lbnRhcnktZW5kKSkpKSkpKQoJICAod2hlbiAoc3RyaW5nLW1hdGNoICJbXlxzXHRcbl0iIHN0 cmluZykKCSAgICBzdHJpbmcpKSkpKSkKCjs7OyBFeHRyYWN0IExpY2Vuc2UuCgooZGVmY3VzdG9t IGVseC1saWNlbnNlLXNlYXJjaAogIChsZXQgKChyICJbXHNcdFxuO10rIikKCShjICIgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbi4/IFxcKGVpdGhlciBcXCk/dmVyc2lvbiIpKQogICAgYCgoIkdQTC0zIiAgICAuICwocmVw bGFjZS1yZWdleHAtaW4tc3RyaW5nICIgIiByIChjb25jYXQgIkdOVSIgYyAiIDMiKSkpCiAgICAg ICgiR1BMLTIiICAgIC4gLChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIiAiIHIgKGNvbmNhdCAi R05VIiBjICIgMiIpKSkKICAgICAgKCJHUEwtMSIgICAgLiAsKHJlcGxhY2UtcmVnZXhwLWluLXN0 cmluZyAiICIgciAoY29uY2F0ICJHTlUiIGMgIiAxIikpKQogICAgICAoIkxHUEwtMyIgICAuICwo cmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICIgIiByIChjb25jYXQgIkdOVSBMZXNzZXIiIGMgIiAz IikpKQogICAgICAoIkxHUEwtMi4xIiAuICwocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICIgIiBy IChjb25jYXQgIkdOVSBMZXNzZXIiIGMgIiAyLjEiKSkpCiAgICAgICgiQUdQTC0zIiAgIC4gLChy ZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIiAiIHIgKGNvbmNhdCAiR05VIEFmZmVybyIgYyAiIDMi KSkpCiAgICAgICgiTUlUIiAgICAgICAgICAgLiAiXjtcXHsyLDRcXH0uKiBtaXQgbGljZW5zZSIp CiAgICAgICgiYXMtaXMiICAgICAgICAgLiAiXjtcXHsyLDRcXH0uKiBwcm92aWRlZCBcImFzWy0g XWlzIikKICAgICAgKCJwdWJsaWMtZG9tYWluIiAuICJeO1xcezIsNFxcfS4qIGluIHRoZSBwdWJs aWNbLSBdZG9tYWluIikpKQogICJMaXN0IG9mIHJlZ2V4cCB0byBjb21tb24gbGljZW5zZSBzdHJp bmcgbWFwcGluZ3MuClVzZWQgYnkgZnVuY3Rpb24gYGVseC1saWNlbnNlJy4gIEVhY2ggZW50cnkg aGFzIHRoZSBmb3JtClwoTElDRU5TRSAuIFJFR0VYUCkgd2hlcmUgTElDRU5TRSBpcyB1c2VkIGlu c3RlYWQgb2YgbWF0Y2hlcyBvZiBSRUdFWFAuIgogIDpncm91cCAnbGliLWluZm8KICA6dHlwZSAn KHJlcGVhdCAoY29ucyAoc3RyaW5nIDp0YWcgInVzZSIpCgkJICAgICAgIChyZWdleHAgOnRhZyAi Zm9yIHJlZ2V4cCIpKSkpCgooZGVmY3VzdG9tIGVseC1saWNlbnNlLXJlcGxhY2UKICAnKCgiR1BM LTMiICAgIC4gICJncGwtP3Y/MyIpCiAgICAoIkdQTC0yIiAgICAuICAiZ3BsLT92PzIiKQogICAg KCJHUEwtMSIgICAgLiAgImdwbC0/dj8xIikKICAgICgiTEdQTC0zIiAgIC4gImxncGwtP3Y/MyIp CiAgICAoIkxHUEwtMi4xIiAuICJsZ3BsLT92PzIuMSIpCiAgICAoIkFHUEwtMyIgICAuICJhZ3Bs LT92PzMiKQogICAgKCJNSVQiICAgICAgLiAibWl0IikKICAgICgiYXMtaXMiICAgIC4gImFzLT9p cyIpCiAgICAoInB1YmxpYy1kb21haW4iIC4gInB1YmxpY1stIF1kb21haW4iKSkKICAiTGlzdCBv ZiBzdHJpbmcgdG8gY29tbW9uIGxpY2Vuc2Ugc3RyaW5nIG1hcHBpbmdzLgpVc2VkIGJ5IGZ1bmN0 aW9uIGBlbHgtbGljZW5zZScuICBFYWNoIGVudHJ5IGhhcyB0aGUgZm9ybQpcKExJQ0VOU0UgLiBS RUdFWFApIHdoZXJlIExJQ0VOU0UgaXMgdXNlZCBpbnN0ZWFkIG9mIG1hdGNoZXMgb2YgUkVHRVhQ LiIKICA6Z3JvdXAgJ2xpYi1pbmZvCiAgOnR5cGUgJyhyZXBlYXQgKGNvbnMgKHN0cmluZyA6dGFn ICJ1c2UiKQoJCSAgICAgICAocmVnZXhwIDp0YWcgImZvciByZWdleHAiKSkpKQoKKGRlZnVuIGVs eC1saWNlbnNlICgmb3B0aW9uYWwgZmlsZSkKICAiUmV0dXJuIHRoZSBsaWNlbnNlIG9mIGZpbGUg RklMRS4KT3IgdGhlIGN1cnJlbnQgYnVmZmVyIGlmIEZJTEUgaXMgZXF1YWwgdG8gYGJ1ZmZlci1m aWxlLW5hbWUnIG9yIGlzIG5pbC4KClRoZSBsaWNlbnNlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBc IkxpY2Vuc2VcIiBoZWFkZXIgb3IgaWYgdGhhdCBpcyBtaXNzaW5nCmJ5IHNlYXJjaGluZyB0aGUg ZmlsZSBoZWFkZXIgZm9yIHRleHQgbWF0Y2hpbmcgZW50cmllcyBpbiBgZWx4LWxpY2Vuc2UtcmVn ZXhwcycuCgpUaGUgZXh0cmFjdGVkIGxpY2Vuc2Ugc3RyaW5nIG1pZ2h0IGJlIG1vZGlmaWVkIHVz aW5nIGBlbHgtbGljZW5zZS1tYXBwaW5ncycKYmVmb3JlIGl0IGlzIHJldHVybmVkIGVuc3VyaW5n IHRoYXQgZWFjaCBrbm93biBsaWNlbnNlIGlzIGFsd2F5cyByZXByZXNlbnRlZAp0aGUgc2FtZS4i CiAgKGVseC13aXRoLWZpbGUgZmlsZQogICAgKGxldCAoKGxpY2Vuc2UgKGVseC1oZWFkZXIgIkxp Y2Vuc2UiKSkpCiAgICAgICh1bmxlc3MgbGljZW5zZQoJKGxldCAoKHJlZ2V4cHMgZWx4LWxpY2Vu c2Utc2VhcmNoKQoJICAgICAgKGNhc2UtZm9sZC1zZWFyY2ggdCkKCSAgICAgIChlbHQpKQoJICAo d2hpbGUgKGFuZCAobm90IGxpY2Vuc2UpCgkJICAgICAgKHNldHEgZWx0IChwb3AgcmVnZXhwcykp KQoJICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAoY2RyIGVsdCkgKGxtLWNvZGUtc3RhcnQp IHQpCgkgICAgICAoc2V0cSBsaWNlbnNlIChjYXIgZWx0KQoJCSAgICByZWdleHBzIG5pbCkpKSkp CiAgICAgICh3aGVuIGxpY2Vuc2UKCShsZXQgKGVsdCAobWFwcGluZ3MgZWx4LWxpY2Vuc2UtcmVw bGFjZSkpCgkgICh3aGlsZSAoc2V0cSBlbHQgKHBvcCBtYXBwaW5ncykpCgkgICAgKHdoZW4gKHN0 cmluZy1tYXRjaCAoY2RyIGVsdCkgbGljZW5zZSkKCSAgICAgIChzZXRxIGxpY2Vuc2UgKGNhciBl bHQpCgkJICAgIG1hcHBpbmdzIG5pbCkpKSkKCSh3aGVuIChzdHJpbmctbWF0Y2ggIl5bLV8uYS16 QS1aMC05XSskIiBsaWNlbnNlKQoJICBsaWNlbnNlKSkpKSkKCjs7OyBFeHRyYWN0IERhdGVzLgoK KGRlZnVuIGVseC1kYXRlLS1pZC1oZWFkZXIgKCZvcHRpb25hbCBmaWxlKQogIChlbHgtd2l0aC1m aWxlIGZpbGUKICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXFwkW0ldZDogW14gXSsgW14g XSsgXFwoW14gXStcXCkiCgkJCSAgICAgKGxtLWNvZGUtbWFyaykgdCkKICAgICAgKG1hdGNoLXN0 cmluZy1uby1wcm9wZXJ0aWVzIDEpKSkpCgooZGVmdW4gZWx4LWRhdGUtLWZpcnN0LWNvcHlyaWdo dCAoJm9wdGlvbmFsIGZpbGUpCiAgKGVseC13aXRoLWZpbGUgZmlsZQogICAgKGxldCAoKGxtLWNv cHlyaWdodC1wcmVmaXggIl5cXCg7K1sgXHRdXFwpK0NvcHlyaWdodCBcXCgoQykgXFwpPyIpKQog ICAgICAod2hlbiAobG0tY29weXJpZ2h0LW1hcmspCgkoY2FkciAobG0tY3JhY2stY29weXJpZ2h0 KSkpKSkpCgooZGVmdW4gZWx4LWRhdGUtLWxhc3QtY29weXJpZ2h0ICgmb3B0aW9uYWwgZmlsZSkK ICAoZWx4LXdpdGgtZmlsZSBmaWxlCiAgICAobGV0ICgobG0tY29weXJpZ2h0LXByZWZpeCAiXlxc KDsrWyBcdF1cXCkrQ29weXJpZ2h0IFxcKChDKSBcXCk/IikpCiAgICAgICh3aGVuIChsbS1jb3B5 cmlnaHQtbWFyaykKCShsZXQgKChsYXN0IChjYXIgKGxhc3QgKGxtLWNyYWNrLWNvcHlyaWdodCkp KSkpCgkgIGxhc3QpKSkpKQoKKGRlZnVuIGVseC1kYXRlLS10aW1lLXN0YW1wLWhlYWRlciAoJm9w dGlvbmFsIGZpbGUpCiAgKGxldCAoKHZhbHVlIChlbHgtaGVhZGVyICJ0aW1lLXN0YW1wIikpKQog ICAgKHdoZW4gKGFuZCB2YWx1ZQoJICAgICAgIChzdHJpbmctbWF0Y2ggIltcIjxdXFwoWy0wLTld K1xcKVtcc1x0XS4rW1wiPl0iIHZhbHVlKSkKICAgICAgKG1hdGNoLXN0cmluZyAxIHZhbHVlKSkp KQoKKGRlZnVuIGVseC11cGRhdGVkIChmaWxlKQogIChlbHgtd2l0aC1maWxlIGZpbGUKICAgIChv ciAoZGNvbnYtY29udmVydC1kYXRlIChlbHgtaGVhZGVyICJcXChsYXN0LVxcKT91cGRhdGVkIikp CgkoZGNvbnYtY29udmVydC1kYXRlIChlbHgtaGVhZGVyICJtb2RpZmllZCIpKQoJKGRjb252LWNv bnZlcnQtZGF0ZSAoZWx4LWhlYWRlciAiXFwkZGF0ZSIpKQoJKGRjb252LWNvbnZlcnQtZGF0ZSAo ZWx4LWRhdGUtLWlkLWhlYWRlcikpCgkoZGNvbnYtY29udmVydC1kYXRlIChlbHgtZGF0ZS0tdGlt ZS1zdGFtcC1oZWFkZXIpKQoJKGRjb252LWNvbnZlcnQtZGF0ZSAoZWx4LWRhdGUtLWxhc3QtY29w eXJpZ2h0KSkpKSkKCihkZWZ1biBlbHgtY3JlYXRlZCAoJm9wdGlvbmFsIGZpbGUpCiAgKGVseC13 aXRoLWZpbGUgZmlsZQogICAgKG9yIChkY29udi1jb252ZXJ0LWRhdGUgKGxtLWNyZWF0aW9uLWRh dGUpKQoJKGRjb252LWNvbnZlcnQtZGF0ZSAoZWx4LWRhdGUtLWZpcnN0LWNvcHlyaWdodCkpKSkp Cgo7OzsgRXh0cmFjdCBWZXJzaW9uLgoKKGRlZnVuIGVseC12ZXJzaW9uLS1uby1jb2xvbiAoJm9w dGlvbmFsIGZpbGUpCiAgKGVseC13aXRoLWZpbGUgZmlsZQogICAgKHdoZW4gKHJlLXNlYXJjaC1m b3J3YXJkICI7K1tcc1x0XStWZXJzaW9uW1xzXHRdK1xcKFtcc1x0XStcXCkiCgkJCSAgICAgKGxt LWNvZGUtbWFyaykgdCkKICAgICAgKG1hdGNoLXN0cmluZy1uby1wcm9wZXJ0aWVzIDEpKSkpCgoo ZGVmdW4gZWx4LXZlcnNpb24tLWlkLWhlYWRlciAoJm9wdGlvbmFsIGZpbGUpCiAgKGVseC13aXRo LWZpbGUgZmlsZQogICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICJcXCRbSV1kOiBbXiBdKyBc XChbXiBdK1xcKSAiCgkJCSAgICAgKGxtLWNvZGUtbWFyaykgdCkKICAgICAgKG1hdGNoLXN0cmlu Zy1uby1wcm9wZXJ0aWVzIDEpKSkpCgooZGVmdW4gZWx4LXZlcnNpb24tLXJldmlzaW9uLWhlYWRl ciAoJm9wdGlvbmFsIGZpbGUpCiAgKGVseC13aXRoLWZpbGUgZmlsZQogICAgKHdoZW4gKHJlLXNl YXJjaC1mb3J3YXJkICJcXCRSZXZpc2lvbjogK1xcKFteIF0rXFwpICIKCQkJICAgICAobG0tY29k ZS1tYXJrKSB0KQogICAgICAobWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMSkpKSkKCihkZWZ1 biBlbHgtdmVyc2lvbi0tdmFyaWFibGUgKGZpbGUpCiAgKGVseC13aXRoLWZpbGUgZmlsZQogICAg KHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkCgkgICAoY29uY2F0ICIoZGVmXFwodmFyXFx8Y29uc3Rc XCkgIgoJCSAgIChmaWxlLW5hbWUtc2Fucy1leHRlbnNpb24KCQkgICAgKGZpbGUtbmFtZS1ub25k aXJlY3RvcnkgZmlsZSkpCgkJICAgIlstOl12ZXJzaW9uIFwiXFwoWy1fLjAtOWEtel0rXFwpXCIi KQoJICAgKGxtLWNvZGUtbWFyaykgdCkKICAgICAgKG1hdGNoLXN0cmluZy1uby1wcm9wZXJ0aWVz IDIpKSkpCgooZGVmdW4gZWx4LXZlcnNpb24tLWRvLXN0YW5kYXJkaXplICh2ZXJzaW9uKQogICht YXBjIChsYW1iZGEgKGVsdCkKCSAgKHNldHEgdmVyc2lvbiAocmVwbGFjZS1yZWdleHAtaW4tc3Ry aW5nCgkJCSAoY2FyIGVsdCkgKGNkciBlbHQpIHZlcnNpb24gdCB0IDEpKSkKCScoKCJbXl9dXFwo YWxwaGFcXClcXChbMC05XStcXCk/JCIgLiAiX2FscGhhIikKCSAgKCJbXl9dXFwoYmV0YVxcKVxc KFswLTldK1xcKT8kIiAuICJfYmV0YSIpCgkgICgiW15fXVxcKHByZVxcKVxcKFswLTldK1xcKT8k IiAuICJfcHJlIikKCSAgKCJbXl9dXFwocmNcXClcXChbMC05XStcXCk/JCIgLiAiX3JjIikKCSAg KCJcXCheW3ZWXVxcKVxcLj8iIC4gIiIpKSkKICAoZWx4LXZlcnNpb24tLWRvLXZlcmlmeSB2ZXJz aW9uKSkKCihkZWZ1biBlbHgtdmVyc2lvbi0tZG8tdmVyaWZ5ICh2ZXJzaW9uKQogIChpZiAoYW5k IHZlcnNpb24gKHZjb21wLXZlcnNpb24tcCB2ZXJzaW9uKSkKICAgICAgdmVyc2lvbgogICAgKGRj b252LWNvbnZlcnQtZGF0ZSB2ZXJzaW9uKSkpCgooZGVmdW4gZWx4LXZlcnNpb24tLWdyZWF0ZXIg KHZlcnNpb24gb2xkLXZlcnNpb24pCiAgKHdoZW4gKGFuZCB2ZXJzaW9uIG9sZC12ZXJzaW9uCgkg ICAgICh2Y29tcC1jb21wYXJlIHZlcnNpb24gb2xkLXZlcnNpb24gIyc8KSkKICAgIChlcnJvciAi TmV3IHZlcnNpb24gaXMgc21hbGxlciB0aGFuIG9sZCB2ZXJzaW9uOiAlcyAlcyIKCSAgIHZlcnNp b24gb2xkLXZlcnNpb24pKQogIChlbHgtdmVyc2lvbi0tZG8tdmVyaWZ5CiAgIChpZiB2ZXJzaW9u CiAgICAgICAoaWYgKGVxdWFsIHZlcnNpb24gb2xkLXZlcnNpb24pCgkgICAoaWYgKHN0cmluZy1t YXRjaCAiW15hLXpdW2Etel0kIiBvbGQtdmVyc2lvbikKCSAgICAgICAoY29uY2F0IChzdWJzdHJp bmcgb2xkLXZlcnNpb24gMCAtMSkKCQkgICAgICAgKGNoYXItdG8tc3RyaW5nICgxKyAoc3RyaW5n LXRvLWNoYXIKCQkJCQkgICAgKHN1YnN0cmluZyBvbGQtdmVyc2lvbiAtMSkpKSkpCgkgICAgIChj b25jYXQgb2xkLXZlcnNpb24gImEiKSkKCSB2ZXJzaW9uKQogICAgIChpZiBvbGQtdmVyc2lvbgoJ IChudW1iZXItdG8tc3RyaW5nICgxKyAoc3RyaW5nLXRvLW51bWJlciBvbGQtdmVyc2lvbikpKQog ICAgICAgIjAwMDEiKSkpKQoKKGRlZnVuIGVseC12ZXJzaW9uIChmaWxlICZvcHRpb25hbCBzdGFu ZGFyZGl6ZSkKICAiUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIGZpbGUgRklMRS4KT3IgdGhlIGN1cnJl bnQgYnVmZmVyIGlmIEZJTEUgaXMgZXF1YWwgdG8gYGJ1ZmZlci1maWxlLW5hbWUnLgoKUmV0dXJu IHRoZSB2YWx1ZSBvZiBoZWFkZXIgXCJWZXJzaW9uXCIuICBJZiBoZWFkZXIgXCJVcGRhdGVcXCgg I1xcKT9cIiBpcwphbHNvIGRlZmluZWQgYXBwZW5kIGl0J3MgdmFsdWUgYWZ0ZXIgYSBwZXJpb2Qu ICBJZiBcIlVwZGF0ZVxcKCAjXFwpP1wiIGlzCmRlZmluZWQgYnV0IFwiVmVyc2lvblwiIGlzIG5v dCBhc3N1bWUgMCBmb3IgXCJWZXJzaW9uXCIuCgpJZiBvcHRpb25hbCBTVEFOREFSRElaRSBpcyBu b24tbmlsIHZlcmlmeSBhbmQgcG9zc2libGUgY29udmVydCB0aGUgdmVyc2lvbgp1c2luZyBmdW5j dGlvbiBgZWx4LXZlcnNpb24tLWRvLXN0YW5kYXJkaXplJyAod2hpY2ggc2VlKS4KCklmIHRoZSBm aWxlIGZhaWxzIHRvIHByb3Blcmx5IGRlZmluZSB0aGUgdmVyc2lvbiBhbmQgeW91IGFic29sdXRl bHkgbmVlZApzb21ldGhpbmcgZWxzZSB0aGFuIG5pbCB0cnkgZnVuY3Rpb24gYGVseC12ZXJzaW9u Kycgb3IgZXZlbiBgZWx4LXZlcnNpb24+JwphbmQgY29tcGxhaW4gdG8gdGhlIHJlc3BlY3RpdmUg YXV0aG9yLiIKICAoZWx4LXdpdGgtZmlsZSBmaWxlCiAgICAobGV0ICgodmVyc2lvbiAob3IgKGVs eC1oZWFkZXIgInZlcnNpb24iKQoJCSAgICAgICAoZWx4LXZlcnNpb24tLW5vLWNvbG9uKSkpCgkg ICh1cGRhdGUgKGVseC1oZWFkZXIgInVwZGF0ZVxcKCAjXFwpPyIpKSkKICAgICAgKGNvbmQgKChu b3QgdmVyc2lvbikpCgkgICAgKChzdHJpbmctbWF0Y2ggIlxcJFtJXWQ6IFteIF0rIFxcKFteIF0r XFwpICIgdmVyc2lvbikKCSAgICAgKHNldHEgdmVyc2lvbiAobWF0Y2gtc3RyaW5nLW5vLXByb3Bl cnRpZXMgMSB2ZXJzaW9uKSkpCgkgICAgKChzdHJpbmctbWF0Y2ggIlxcJFJldmlzaW9uOiArXFwo W14gXStcXCkgIiAgdmVyc2lvbikKCSAgICAgKHNldHEgdmVyc2lvbiAobWF0Y2gtc3RyaW5nLW5v LXByb3BlcnRpZXMgMSB2ZXJzaW9uKSkpCgkgICAgKChzdHJpbmctbWF0Y2ggIlxcKFstXy4wLTlh LXpdK1xcKVtcc1x0XS4rIiAgdmVyc2lvbikKCSAgICAgKHNldHEgdmVyc2lvbiAobWF0Y2gtc3Ry aW5nLW5vLXByb3BlcnRpZXMgMSB2ZXJzaW9uKSkpKQogICAgICAod2hlbiB1cGRhdGUKCShzZXRx IHZlcnNpb24gKGNvbmNhdCAob3IgdmVyc2lvbiAiMCIpICIuIiB1cGRhdGUpKSkKICAgICAgKGVs eC12ZXJzaW9uLS1kby12ZXJpZnkgKGlmIChhbmQgdmVyc2lvbiBzdGFuZGFyZGl6ZSkKCQkJCSAg KGVseC12ZXJzaW9uLS1kby1zdGFuZGFyZGl6ZSB2ZXJzaW9uKQoJCQkJdmVyc2lvbikpKSkpCgoo ZGVmdW4gZWx4LXZlcnNpb24rIChmaWxlICZvcHRpb25hbCBzdGFuZGFyZGl6ZSkKICAiUmV0dXJu IF9hXyB2ZXJzaW9uIHN0cmluZyBmb3IgZmlsZSBGSUxFLgpPciB0aGUgY3VycmVudCBidWZmZXIg aWYgRklMRSBpcyBlcXVhbCB0byBgYnVmZmVyLWZpbGUtbmFtZScuCgpJZiB0aGUgZmlsZSBwcm9w ZXJseSBkZWZpbmVzIGEgdmVyc2lvbiBleHRyYWN0IGl0IHVzaW5nIGBlbHgtdmVyc2lvbicuCk90 aGVyd2lzZSB0cnkgc2V2ZXJhbCBrbm93biB3YXlzIGluIHdoaWNoIHBlb3BsZSBoYXZlIGRlZmlu ZWQgdGhlIHZlcnNpb24KaW4gRW1hY3MgTGlzcCBsaWJyYXJpZXMuCgpJZiBvcHRpb25hbCBTVEFO REFSRElaRSBpcyBub24tbmlsIHZlcmlmeSBhbmQgcG9zc2libGUgY29udmVydCB0aGUgdmVyc2lv bgp1c2luZyBmdW5jdGlvbiBgZWx4LXZlcnNpb24tLWRvLXN0YW5kYXJkaXplJyAod2hpY2ggc2Vl KS4KCklmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBuaWwgdGhlbiB0aGUgYXV0aG9yIG9mIEZJTEUg c3Vja3MgYmFkbHkgYXQKd3JpdGluZyBsaWJyYXJ5IGhlYWRlcnMgYW5kIGlmIHlvdSBjYW4gYWJz b2x1dGVseSBub3QgbGl2ZSB3aXRoIHRoYXQgdXNlCmBlbHgtdmVyc2lvbj4nIGluc3RlYWQuIgog IChsZXQgKCh2ZXJzaW9uIChlbHgtdmVyc2lvbiBmaWxlIHN0YW5kYXJkaXplKSkpCiAgICAoaWYg dmVyc2lvbgoJdmVyc2lvbgogICAgICAoZWx4LXdpdGgtZmlsZSBmaWxlCgkoc2V0cSB2ZXJzaW9u IChvciAoZWx4LXZlcnNpb24tLXZhcmlhYmxlIGZpbGUpCgkJCSAgKGVseC12ZXJzaW9uLS1pZC1o ZWFkZXIpCgkJCSAgKGVseC12ZXJzaW9uLS1yZXZpc2lvbi1oZWFkZXIpKSkpCiAgICAgIChlbHgt dmVyc2lvbi0tZG8tdmVyaWZ5CiAgICAgICAoaWYgKGFuZCB2ZXJzaW9uIHN0YW5kYXJkaXplKQoJ ICAgKGVseC12ZXJzaW9uLS1kby1zdGFuZGFyZGl6ZSB2ZXJzaW9uKQoJIHZlcnNpb24pKSkpKQoK KGRlZnVuIGVseC12ZXJzaW9uPiAoZmlsZSBvbGQtdmVyc2lvbiAmb3B0aW9uYWwgc3RhbmRhcmRp emUpCiAgIlJldHVybiBfYV8gdmVyc2lvbiBzdHJpbmcgZm9yIHRoZSBmaWxlIEZJTEUuCk9yIHRo ZSBjdXJyZW50IGJ1ZmZlciBpZiBGSUxFIGlzIGVxdWFsIHRvIGBidWZmZXItZmlsZS1uYW1lJy4K CklmIG5vIHZlcnNpb24gY2FuIGJlIGZvdW5kIHJldHVybiBhIHBzZXVkbyB2ZXJzaW9uIGxpa2Ug XCIwMDAxXCIuCgpJZiBPTEQtVkVSU0lPTiBpcyBub24tbmlsIHRoZSBuZXcgdmVyc2lvbiBoYXMg dG8gYmUgZ3JlYXRlci4gIElmIGl0IGlzCnNtYWxsZXIgdGhpcyBpcyBhbiBlcnJvci4gIElmIGl0 IGlzIGVxdWFsIGluY3JlYXNlIGl0LiAgRS5nLiBcIjAuMVwiIGJlY29tZXMKXCIwLjFhXCIgYnV0 IGlmIE9MRC1WRVJTSU9OIGFwcGVhcnMgdG8gYmUgYSBwc2V1ZG8gdmVyc2lvbiBsaWtlIFwiMDAw MVwiIHVzZQpzb21ldGhpbmcgbGlrZSBcIjAwMDJcIiBpbnN0ZWFkLgoKSWYgb3B0aW9uYWwgU1RB TkRBUkRJWkUgaXMgbm9uLW5pbCB2ZXJpZnkgYW5kIHBvc3NpYmxlIGNvbnZlcnQgdGhlIHZlcnNp b24KdXNpbmcgZnVuY3Rpb24gYGVseC12ZXJzaW9uLS1kby1zdGFuZGFyZGl6ZScgKHdoaWNoIHNl ZSkuCgpBbHNvIHNlZSBmdW5jdGlvbnMgYGVseC12ZXJzaW9uJyBhbmQgYGVseC12ZXJzaW9uKycg Zm9yIGxlc3MgYWdncmVzc2l2ZQphcHByb2NoZXMgYW5kIG1vcmUgYWdncmVzc2l2ZSBkb2Mtc3Ry aW5ncy4iCiAgOzsgRklYTUUgZG9jLXN0cmluZyBtaWdodCBiZSB3cm9uZyBmb3Igc29tZSBzaWRl IGNhc2VzLgogIChlbHgtdmVyc2lvbi0tZ3JlYXRlciAob3IgKGVseC12ZXJzaW9uKyBmaWxlIHN0 YW5kYXJkaXplKQoJCQkgICAgKGVseC11cGRhdGVkIGZpbGUpKQoJCQlvbGQtdmVyc2lvbikpCgoo ZGVmdW4gZWx4LXZlcnNpb24taW50ZXJuYWwgKGZpbGUgJm9wdGlvbmFsIHN0YW5kYXJkaXplKQog ICJSZXR1cm4gdGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBmaWxlIEZJTEUuCk9yIHRoZSBjdXJy ZW50IGJ1ZmZlciBpZiBGSUxFIGlzIGVxdWFsIHRvIGBidWZmZXItZmlsZS1uYW1lJy4KCk9ubHkg dXNlIHRoaXMgZm9yIGZpbGVzIHRoYXQgYXJlIGRpc3RyaWJ1dGVkIHdpdGggR05VIEVtYWNzIG90 aGVyd2lzZSB1c2UKZnVuY3Rpb24gYGVseC12ZXJzaW9uJy4KCklmIG9wdGlvbmFsIFNUQU5EQVJE SVpFIGlzIG5vbi1uaWwgdmVyaWZ5IGFuZCBwb3NzaWJseSBjb252ZXJ0IHRoZSB2ZXJzaW9uCnVz aW5nIGZ1bmN0aW9uIGBlbHgtdmVyc2lvbi0tZG8tc3RhbmRhcmRpemUnICh3aGljaCBzZWUpLgoK SWYgdGhlIGZpbGUgZGVmaW5lcyBhIHZlcnNpb24gZXh0cmFjdCBpdCB1c2luZyBmdW5jdGlvbiBg ZWx4LXZlcnNpb24nIGFuZAppZiB0aGF0IGZhaWxzIHVzaW5nIGZ1bmN0aW9uIGBlbHgtdmVyc2lv bi0tdmFyaWFibGUnLiAgSWYgdGhhdCBmYWlscyByZXR1cm4KdGhlIHZhbHVlIG9mIHZhcmlhYmxl IGBlbWFjcy12ZXJzaW9uJy4iCiAgKG9yIChlbHgtdmVyc2lvbiBmaWxlIHQpCiAgICAgIChsZXQg KCh2ZXJzaW9uIChlbHgtdmVyc2lvbi0tdmFyaWFibGUgZmlsZSkpKQoJKGVseC12ZXJzaW9uLS1k by12ZXJpZnkKCSAoaWYgKGFuZCB2ZXJzaW9uIHN0YW5kYXJkaXplKQoJICAgICAoZWx4LXZlcnNp b24tLWRvLXN0YW5kYXJkaXplIHZlcnNpb24pCgkgICB2ZXJzaW9uKSkpCiAgICAgIGVtYWNzLXZl cnNpb24pKQoKKGRlZnVuIGVseC12ZXJzaW9uLWludGVybmFsPiAoZmlsZSBvbGQtdmVyc2lvbiAm b3B0aW9uYWwgc3RhbmRhcmRpemUpCiAgKGVseC12ZXJzaW9uLS1ncmVhdGVyIChlbHgtdmVyc2lv bi1pbnRlcm5hbCBmaWxlIHN0YW5kYXJkaXplKSBvbGQtdmVyc2lvbikpCgo7OzsgRXh0cmFjdCBQ ZW9wbGUuCgooZGVmdW4gZWx4LWNyYWNrLWFkZHJlc3MgKHgpCiAgIlNwbGl0IHVwIGFuIGVtYWls IGFkZHJlc3MgWCBpbnRvIGZ1bGwgbmFtZSBhbmQgcmVhbCBlbWFpbCBhZGRyZXNzLgpUaGUgdmFs dWUgaXMgYSBjb25zIG9mIHRoZSBmb3JtIChGVUxMTkFNRSAuIEFERFJFU1MpLiIKICAoY29uZCAo KHN0cmluZy1tYXRjaCAiXFwoLitcXCkgWyg8XVxcKC4qXFwpWz4pXSIgeCkKCSAoY29ucyAobWF0 Y2gtc3RyaW5nIDEgeCkKCSAgICAgICAobWF0Y2gtc3RyaW5nIDIgeCkpKQoJKChzdHJpbmctbWF0 Y2ggIlxcUy0rQFxcUy0rIiB4KQoJIChjb25zIG5pbCB4KSkKCSh0CgkgKGNvbnMgeCBuaWwpKSkp CgooZGVmdW4gZWx4LWF1dGhvcnMgKCZvcHRpb25hbCBmaWxlKQogICJSZXR1cm4gdGhlIGF1dGhv ciBsaXN0IG9mIGZpbGUgRklMRS4KT3IgdGhlIGN1cnJlbnQgYnVmZmVyIGlmIEZJTEUgaXMgZXF1 YWwgdG8gYGJ1ZmZlci1maWxlLW5hbWUnIG9yIGlzIG5pbC4KRWFjaCBlbGVtZW50IG9mIHRoZSBs aXN0IGlzIGEgY29uczsgdGhlIGNhciBpcyB0aGUgZnVsbCBuYW1lLAp0aGUgY2RyIGlzIGFuIGVt YWlsIGFkZHJlc3MuIgogIChlbHgtd2l0aC1maWxlIGZpbGUKICAgIChsZXQgKChhdXRob3JsaXN0 IChlbHgtaGVhZGVyICJhdXRob3JzPyIgdCkpKQogICAgICAobWFwY2FyICdlbHgtY3JhY2stYWRk cmVzcyBhdXRob3JsaXN0KSkpKQoKKGRlZnVuIGVseC1tYWludGFpbmVyICgmb3B0aW9uYWwgZmls ZSkKICAiUmV0dXJuIHRoZSBtYWludGFpbmVyIG9mIGZpbGUgRklMRS4KT3IgdGhlIGN1cnJlbnQg YnVmZmVyIGlmIEZJTEUgaXMgZXF1YWwgdG8gYGJ1ZmZlci1maWxlLW5hbWUnIG9yIGlzIG5pbC4K VGhlIHJldHVybiB2YWx1ZSBoYXMgdGhlIGZvcm0gKE5BTUUgLiBBRERSRVNTKS4iCiAgKGVseC13 aXRoLWZpbGUgZmlsZQogICAgKGxldCAoKG1haW50IChlbHgtaGVhZGVyICJtYWludGFpbmVyIikp KQogICAgICAoaWYgbWFpbnQKCSAgKGVseC1jcmFjay1hZGRyZXNzIG1haW50KQoJKGNhciAobG0t YXV0aG9ycykpKSkpKQoKKGRlZnVuIGVseC1hZGFwdGVkLWJ5ICgmb3B0aW9uYWwgZmlsZSkKICAi UmV0dXJuIHRoZSBwZXJzb24gaG93IGFkYXB0ZWQgZmlsZSBGSUxFLgpPciB0aGUgY3VycmVudCBi dWZmZXIgaWYgRklMRSBpcyBlcXVhbCB0byBgYnVmZmVyLWZpbGUtbmFtZScgb3IgaXMgbmlsLgpU aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgZm9ybSAoTkFNRSAuIEFERFJFU1MpLiIKICAoZWx4LXdp dGgtZmlsZSBmaWxlCiAgICAobGV0ICgoYWRhcHRlciAoZWx4LWhlYWRlciAiYWRhcHRlZC1ieSIp KSkKICAgICAgKHdoZW4gYWRhcHRlcgoJKGVseC1jcmFjay1hZGRyZXNzIGFkYXB0ZXIpKSkpKQoK Ozs7IEV4dHJhY3QgRmVhdHVyZXMuCgooZGVmY29uc3QgZWx4LXByb3ZpZGVkLXJlZ2V4cCAiXApc KFxcKD86Y2MtXFwpP3Byb3ZpZGVbXHNcdFxuXSdcClxcKFteKCksXHNcdFxuXStcXClcXCg/Oltc c1x0XG5dKydcClwoXFwoW14oKSxdK1xcKSlcXCk/KSIpCgooZGVmdW4gZWx4LWJ1ZmZlci1wcm92 aWRlZCAoYnVmZmVyKQogIChsZXQgKGZlYXR1cmVzKQogICAgKHdpdGgtY3VycmVudC1idWZmZXIg YnVmZmVyCiAgICAgIChzYXZlLWV4Y3Vyc2lvbgoJKGdvdG8tY2hhciAocG9pbnQtbWluKSkKCSh3 aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgZWx4LXByb3ZpZGVkLXJlZ2V4cCBuaWwgdCkKCSAgKHVu bGVzcyAoc2F2ZS1tYXRjaC1kYXRhCgkJICAgIChvciAobnRoIDMgKHN5bnRheC1wcHNzKSkgICA7 IGluIHN0cmluZwoJCQkobnRoIDQgKHN5bnRheC1wcHNzKSkpKSA7IGluIGNvbW1lbnQKCSAgICAo ZG9saXN0IChmZWF0dXJlIChjb25zIChtYXRjaC1zdHJpbmcgMSkKCQkJCSAgICh3aGVuIChtYXRj aC1zdHJpbmcgMikKCQkJCSAgICAgKHNwbGl0LXN0cmluZyAobWF0Y2gtc3RyaW5nIDIpICIgIiB0 KSkpKQoJICAgICAgKGFkZC10by1saXN0ICdmZWF0dXJlcyAoaW50ZXJuIGZlYXR1cmUpKSkpKSkK ICAgICAgKHNvcnQgZmVhdHVyZXMgIydzdHJpbmc8KSkpKQoKKGRlZnVuIGVseC1wcm92aWRlZCAo c291cmNlKQogICJSZXR1cm4gYSBsaXN0IG9mIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSBTT1VS Q0UuCgpTT1VSQ0UgaGFzIHRvIGJlIGEgZmlsZSwgZGlyZWN0b3J5IG9yIGxpc3Qgb2YgZmlsZXMg YW5kL29yIGRpcmVjdG9yaWVzLgoKSWYgU09VUkNFIGlzIGEgZGlyZWN0b3J5IHJldHVybiBhbGwg ZmVhdHVyZXMgcHJvdmlkZWQgYnkgRW1hY3MgbGlzcCBmaWxlcwppbnNpZGUgU09VUkNFIGFuZCBy ZWN1cnNpdmVseSBhbGwgc3ViZGlyZWN0b3JpZXMuICBGaWxlcyBub3QgZW5kaW5nIGluClwiLmVs XCIgYW5kIGRpcmVjdG9yaWVzIHN0YXJ0aW5nIHdpdGggYSBwZXJpb2QgYXJlIGlnbm9yZWQsIGV4 Y2VwdCB3aGVuCmV4cGxpY2V0bHkgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCgpUaGlzIHdpbGwg b25seSBmaW5kIGZlYXR1cmVzIHJlcXVpcmVkIGV4YWN0bHkgbGlrZToKXChyZXF1aXJlICdGRUFU VVJFIFtuaWx8XCJQQVRIXCIgW25pbHx0XV0pLiIKICAoZGVsZXRlLWR1cGxpY2F0ZXMKICAgKHNv cnQgKGNvbmQgKChsaXN0cCBzb3VyY2UpCgkJKG1hcGNhbiAjJ2VseC1wcm92aWRlZCBzb3VyY2Up KQoJICAgICAgICgoZmlsZS1kaXJlY3RvcnktcCBzb3VyY2UpCgkJKG1hcGNhbiAobGFtYmRhIChl bHQpCgkJCSAgKHdoZW4gKG9yIChmaWxlLWRpcmVjdG9yeS1wIGVsdCkKCQkJCSAgICAoc3RyaW5n LW1hdGNoICJcXC5lbCQiIGVsdCkpCgkJCSAgICAoZWx4LXByb3ZpZGVkIGVsdCkpKQoJCQkoZGly ZWN0b3J5LWZpbGVzIHNvdXJjZSB0ICJeW15cXC5dIiB0KSkpCgkgICAgICAgKHQKCQkoZWx4LXdp dGgtZmlsZSBzb3VyY2UKCQkgIChlbHgtYnVmZmVyLXByb3ZpZGVkIChjdXJyZW50LWJ1ZmZlcikp KSkpCgkgIydzdHJpbmc8KQogICA6dGVzdCAjJ2VxdWFsKSkKCihkZWZjb25zdCBlbHgtcmVxdWly ZWQtcmVnZXhwICJcClwoXFwoPzpjYy1cXCk/cmVxdWlyZVtcc1x0XG5dJ1wKXFwoW14oKSxcc1x0 XG5dK1xcKVwKXFwoPzpcXCg/Oltcc1x0XG5dK1xcKD86bmlsXFx8XCIuKlwiXFwpXFwpXApcXCg/ Oltcc1x0XG5dK1xcKD86bmlsXFx8XFwodFxcKVxcKVxcKT9cXCk/KSIpCgooZGVmdW4gZWx4LWJ1 ZmZlci1yZXF1aXJlZCAoYnVmZmVyICZvcHRpb25hbCBwcm92aWRlZCkKICAobGV0IChyZXF1aXJl ZC1oYXJkCglyZXF1aXJlZC1zb2Z0KQogICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCiAg ICAgIChzYXZlLWV4Y3Vyc2lvbgoJKGdvdG8tY2hhciAocG9pbnQtbWluKSkKCSh3aGlsZSAocmUt c2VhcmNoLWZvcndhcmQgZWx4LXJlcXVpcmVkLXJlZ2V4cCBuaWwgdCkKCSAgKGxldCAoKGZlYXR1 cmUgKGludGVybiAobWF0Y2gtc3RyaW5nIDEpKSkpCgkgICAgKGNvbmQgKChzYXZlLW1hdGNoLWRh dGEKCQkgICAgICAob3IgKG50aCAzIChzeW50YXgtcHBzcykpICAgIDsgaW4gc3RyaW5nCgkJCSAg KG50aCA0IChzeW50YXgtcHBzcykpKSkpIDsgaW4gY29tbWVudAoJCSAgKChtYXRjaC1zdHJpbmcg MikKCQkgICAodW5sZXNzIChvciAobWVtYmVyIGZlYXR1cmUgcmVxdWlyZWQtaGFyZCkKCQkJICAg ICAgIChtZW1iZXIgZmVhdHVyZSByZXF1aXJlZC1zb2Z0KSkKCQkgICAgIChwdXNoIGZlYXR1cmUg cmVxdWlyZWQtc29mdCkpKQoJCSAgKChub3QgKG1lbWJlciBmZWF0dXJlIHJlcXVpcmVkLWhhcmQp KQoJCSAgIChzZXRxIHJlcXVpcmVkLXNvZnQgKHJlbW92ZSBmZWF0dXJlIHJlcXVpcmVkLXNvZnQp KQoJCSAgIChwdXNoIGZlYXR1cmUgcmVxdWlyZWQtaGFyZCkpKSkpKQogICAgICAobGlzdCAoc29y dCByZXF1aXJlZC1oYXJkICMnc3RyaW5nPCkKCSAgICAoc29ydCByZXF1aXJlZC1zb2Z0ICMnc3Ry aW5nPCkpKSkpCgooZGVmdW4gZWx4LXJlcXVpcmVkIChzb3VyY2UgJm9wdGlvbmFsIHByb3ZpZGVk KQogICJSZXR1cm4gdGhlIGZlYXR1cmVzIHJlcXVpcmVkIGJ5IFNPVVJDRS4KVGhlIHJldHVybmVk IHZhbHVlIGhhcyB0aGUgZm9ybSAoKEhBUkQtUkVRVUlSRUQuLi4pIChTT0ZULVJFUVVJUkVELi4u KSkuCgpTT1VSQ0UgaGFzIHRvIGJlIGEgZmlsZSwgZGlyZWN0b3J5IG9yIGxpc3Qgb2YgZmlsZXMg YW5kL29yIGRpcmVjdG9yaWVzLgoKSWYgU09VUkNFIGlzIGEgZGlyZWN0b3J5IHJldHVybiBhbGwg ZmVhdHVyZXMgcmVxdWlyZWQgYnkgRW1hY3MgbGlzcCBmaWxlcwppbnNpZGUgU09VUkNFIGFuZCBy ZWN1cnNpdmVseSBhbGwgc3ViZGlyZWN0b3JpZXMuICBGaWxlcyBub3QgZW5kaW5nIGluClwiLmVs XCIgYW5kIGRpcmVjdG9yaWVzIHN0YXJ0aW5nIHdpdGggYSBwZXJpb2QgYXJlIGlnbm9yZWQsIGV4 Y2VwdCB3aGVuCmV4cGxpY2V0bHkgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCgpJZiBvcHRpb25h bCBQUk9WSURFRCBpcyBhIGxpc3Qgb2YgZmVhdHVyZXMgb25seSByZXR1cm4gcmVxdWlyZWQgZmVh dHVyZXMKdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgUFJPVklERUQuICBJZiBQUk9WSURFRCBpcyB0 IHRoZW4gaXQgaXMgZXhwYW5kZWQgdG8KdGhlIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IFNPVVJDRS4K ClRoaXMgd2lsbCBvbmx5IGZpbmQgZmVhdHVyZXMgcHJvdmlkZWQgZXhhY3RseSBsaWtlOgpcKHBy b3ZpZGUgJ0ZFQVRVUkUgJyhTVUJGRUFUVVJFLi4uKSkuIgogICh3aGVuIChlcSBwcm92aWRlZCB0 KQogICAgKHNldHEgcHJvdmlkZWQgKGVseC1wcm92aWRlZCBzb3VyY2UpKSkKICAoZGVsZXRlLWR1 cGxpY2F0ZXMKICAgKHNvcnQgKGNvbmQgKChsaXN0cCBzb3VyY2UpCgkJKG1hcGNhbiAobGFtYmRh IChlbHQpCgkJCSAgKGVseC1yZXF1aXJlZCBlbHQgcHJvdmlkZWQpKQoJCQlzb3VyY2UpKQoJICAg ICAgICgoZmlsZS1kaXJlY3RvcnktcCBzb3VyY2UpCgkJKG1hcGNhbiAobGFtYmRhIChzb3VyY2Up CgkJCSAgKHdoZW4gKG9yIChmaWxlLWRpcmVjdG9yeS1wIHNvdXJjZSkKCQkJCSAgICAoc3RyaW5n LW1hdGNoICJcXC5lbCQiIHNvdXJjZSkpCgkJCSAgICAoZWx4LXJlcXVpcmVkIHNvdXJjZSBwcm92 aWRlZCkpKQoJCQkoZGlyZWN0b3J5LWZpbGVzIHNvdXJjZSB0ICJeW15cXC5dIiB0KSkpCgkgICAg ICAgKHQKCQkoZWx4LXdpdGgtZmlsZSBzb3VyY2UKCQkgIChlbHgtYnVmZmVyLXJlcXVpcmVkIChj dXJyZW50LWJ1ZmZlcikgcHJvdmlkZWQpKSkpCgkgIydzdHJpbmc8KQogICA6dGVzdCAjJ2VxdWFs KSkKCihwcm92aWRlICdlbHgpCjs7OyBlbHguZWwgZW5kcyBoZXJlCg== --000e0cd59f9e1d87d20478977e12--