From unknown Thu Aug 14 19:14:17 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#2783 <2783@debbugs.gnu.org> To: bug#2783 <2783@debbugs.gnu.org> Subject: Status: Additional texinfo-environments Reply-To: bug#2783 <2783@debbugs.gnu.org> Date: Fri, 15 Aug 2025 02:14:17 +0000 retitle 2783 Additional texinfo-environments reassign 2783 emacs submitter 2783 "Arni Magnusson" severity 2783 wishlist tag 2783 patch thanks From arnima@hafro.is Wed Mar 25 19:50:21 2009 Received: (at submit) by emacsbugs.donarmstrong.com; 26 Mar 2009 02:50:21 +0000 X-Spam-Checker-Version: SpamAssassin 3.2.5-bugs.debian.org_2005_01_02 (2008-06-10) on rzlab.ucr.edu X-Spam-Level: ** X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. X-Spam-Status: No, score=2.1 required=4.0 tests=FOURLA,FVGT_m_MULTI_ODD, IMPRONONCABLE_2,MURPHY_SEX3 autolearn=no version=3.2.5-bugs.debian.org_2005_01_02 Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n2Q2oAGD003912 for ; Wed, 25 Mar 2009 19:50:12 -0700 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LmffW-000402-Go for bug-gnu-emacs@gnu.org; Wed, 25 Mar 2009 22:50:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LmffQ-0003za-24 for bug-gnu-emacs@gnu.org; Wed, 25 Mar 2009 22:50:08 -0400 Received: from [199.232.76.173] (port=49423 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LmffP-0003zX-TD for bug-gnu-emacs@gnu.org; Wed, 25 Mar 2009 22:50:03 -0400 Received: from hafgarpur.hafro.is ([130.208.64.48]:57847) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LmffO-0008CJ-KG for bug-gnu-emacs@gnu.org; Wed, 25 Mar 2009 22:50:03 -0400 X-Virus-Scanned: amavisd-new at hafro.is Received: from hafrun.hafro.is (hafrun.hafro.is [130.208.58.66]) by hafgarpur.hafro.is (8.14.2/8.14.2/hafro-2.45) with ESMTP id n2Q2nRjj011600 for ; Thu, 26 Mar 2009 02:49:29 GMT Received: from www.hafro.is (localhost [127.0.0.1]) by hafrun.hafro.is (8.14.2/8.14.2/hafro-1.6) with ESMTP id n2Q2nQ4K000529 for ; Thu, 26 Mar 2009 02:49:26 GMT Received: from 194.144.135.59 (SquirrelMail authenticated user arnima) by www.hafro.is with HTTP; Thu, 26 Mar 2009 02:49:26 -0000 (GMT) Message-ID: <17335.194.144.135.59.1238035766.squirrel@www.hafro.is> Date: Thu, 26 Mar 2009 02:49:26 -0000 (GMT) Subject: Additional texinfo-environments From: "Arni Magnusson" To: bug-gnu-emacs@gnu.org User-Agent: SquirrelMail/1.4.10a MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20090326024926_85630" X-Priority: 3 (Normal) Importance: Normal X-detected-operating-system: by monty-python.gnu.org: Solaris 10 (beta) ------=_20090326024926_85630 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hi there, I'm using the `texinfo-insert-@end' function in emacs/lisp/textmodes/texinfo.el, version 22.3.1. I find it very useful to save keystrokes, but I have encountered some environments that it doesn't close successfully: @deftypecv @deftypeivar @deftypemethod @deftypeop @html I checked out the sources and attached is my proposed solution, where I have inserted five more strings to the `texinfo-environments' list: "deftypecv" "deftypeivar" "deftypemethod" "deftypeop", and "html". Cheers, Arni ------=_20090326024926_85630 Content-Type: application/octet-stream; name="texinfo.el.~1.125.~" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="texinfo.el.~1.125.~" Ozs7IHRleGluZm8uZWwgLS0tIG1ham9yIG1vZGUgZm9yIGVkaXRpbmcgVGV4aW5mbyBmaWxlcyAt Ki0gY29kaW5nOiBpc28tMjAyMi03Yml0IC0qLQ0KDQo7OyBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5 ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTYsIDE5OTcsDQo7OyAgIDIwMDAs IDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQoNCjs7IEF1dGhvcjogUm9iZXJ0IEouIENoYXNz ZWxsDQo7OyBEYXRlOiAgIFtTZWUgZGF0ZSBiZWxvdyBmb3IgdGV4aW5mby12ZXJzaW9uXQ0KOzsg TWFpbnRhaW5lcjogRlNGDQo7OyBLZXl3b3JkczogbWFpbnQsIHRleCwgZG9jcw0KDQo7OyBUaGlz IGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuDQoNCjs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3 YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQo7OyBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eQ0KOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0 aGUgTGljZW5zZSwgb3INCjs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQoN Cjs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLA0KOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YNCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCjs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuDQoNCjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo7OyBhbG9uZyB3aXRoIEdOVSBFbWFj cy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCg0KOzs7IFRv ZG86DQoNCjs7IC0gZmFjZW1lbnUgc3VwcG9ydC4NCjs7IC0gY29tbWFuZCBjb21wbGV0aW9uLg0K DQo7OzsgQ29tbWVudGFyeToNCg0KOzs7IENvZGU6DQoNCihldmFsLXdoZW4tY29tcGlsZSAocmVx dWlyZSAndGV4LW1vZGUpIChyZXF1aXJlICdjbCkpDQooZGVmdmFyIG91dGxpbmUtaGVhZGluZy1h bGlzdCkNCg0KKGRlZmdyb3VwIHRleGluZm8gbmlsDQogICJUZXhpbmZvIE1vZGUuIg0KICA6bGlu ayAnKGN1c3RvbS1ncm91cC1saW5rIDp0YWcgIkZvbnQgTG9jayBGYWNlcyBncm91cCIgZm9udC1s b2NrLWZhY2VzKQ0KICA6Z3JvdXAgJ2RvY3MpDQoNCjs7OyMjI2F1dG9sb2FkDQooZGVmY3VzdG9t IHRleGluZm8tb3Blbi1xdW90ZSAiYGAiDQogICJTdHJpbmcgaW5zZXJ0ZWQgYnkgdHlwaW5nIFxc W3RleGluZm8taW5zZXJ0LXF1b3RlXSB0byBvcGVuIGEgcXVvdGF0aW9uLiINCiAgOnR5cGUgJ3N0 cmluZw0KICA6Z3JvdXAgJ3RleGluZm8pDQoNCjs7OyMjI2F1dG9sb2FkDQooZGVmY3VzdG9tIHRl eGluZm8tY2xvc2UtcXVvdGUgIicnIg0KICAiU3RyaW5nIGluc2VydGVkIGJ5IHR5cGluZyBcXFt0 ZXhpbmZvLWluc2VydC1xdW90ZV0gdG8gY2xvc2UgYSBxdW90YXRpb24uIg0KICA6dHlwZSAnc3Ry aW5nDQogIDpncm91cCAndGV4aW5mbykNCg0KKGRlZmN1c3RvbSB0ZXhpbmZvLW1vZGUtaG9vayBu aWwNCiAgIk5vcm1hbCBob29rIHJ1biB3aGVuIGVudGVyaW5nIFRleGluZm8gbW9kZS4iDQogIDp0 eXBlICdob29rDQogIDpvcHRpb25zICcodHVybi1vbi1hdXRvLWZpbGwgZmx5c3BlbGwtbW9kZSkN CiAgOmdyb3VwICd0ZXhpbmZvKQ0KDQoMDQo7OzsgQXV0b2xvYWRzOg0KDQooYXV0b2xvYWQgJ21h a2VpbmZvLXJlZ2lvbg0KICAibWFrZWluZm8iDQogICJNYWtlIEluZm8gZmlsZSBmcm9tIHJlZ2lv biBvZiBjdXJyZW50IFRleGluZm8gZmlsZSwgYW5kIHN3aXRjaCB0byBpdC4NCg0KVGhpcyBjb21t YW5kIGRvZXMgbm90IG9mZmVyIHRoZSBgbmV4dC1lcnJvcicgZmVhdHVyZSBzaW5jZSBpdCB3b3Vs ZA0KYXBwbHkgdG8gYSB0ZW1wb3JhcnkgZmlsZSwgbm90IHRoZSBvcmlnaW5hbDsgdXNlIHRoZSBg bWFrZWluZm8tYnVmZmVyJw0KY29tbWFuZCB0byBnYWluIHVzZSBvZiBgbmV4dC1lcnJvcicuIg0K ICB0IG5pbCkNCg0KKGF1dG9sb2FkICdtYWtlaW5mby1idWZmZXINCiAgIm1ha2VpbmZvIg0KICAi TWFrZSBJbmZvIGZpbGUgZnJvbSBjdXJyZW50IGJ1ZmZlci4NCg0KVXNlIHRoZSBcXFtuZXh0LWVy cm9yXSBjb21tYW5kIHRvIG1vdmUgdG8gdGhlIG5leHQgZXJyb3INClwoaWYgdGhlcmUgYXJlIGVy cm9yc1wpLiINCiAgdCBuaWwpDQoNCihhdXRvbG9hZCAna2lsbC1jb21waWxhdGlvbg0KICAiY29t cGlsZSINCiAgIktpbGwgdGhlIHByb2Nlc3MgbWFkZSBieSB0aGUgXFxbY29tcGlsZV0gY29tbWFu ZC4iDQogIHQgbmlsKQ0KDQooYXV0b2xvYWQgJ21ha2VpbmZvLXJlY2VudGVyLWNvbXBpbGF0aW9u LWJ1ZmZlcg0KICAibWFrZWluZm8iDQogICJSZWRpc3BsYXkgYCpjb21waWxhdGlvbionIGJ1ZmZl ciBzbyBtb3N0IHJlY2VudCBvdXRwdXQgY2FuIGJlIHNlZW4uDQpUaGUgbGFzdCBsaW5lIG9mIHRo ZSBidWZmZXIgaXMgZGlzcGxheWVkIG9uDQpsaW5lIExJTkUgb2YgdGhlIHdpbmRvdywgb3IgY2Vu dGVyZWQgaWYgTElORSBpcyBuaWwuIg0KICB0IG5pbCkNCg0KKGF1dG9sb2FkICd0ZXhpbmZvLXVw ZGF0ZS1ub2RlDQogICJ0ZXhuZm8tdXBkIg0KICAiV2l0aG91dCBhbnkgcHJlZml4IGFyZ3VtZW50 LCB1cGRhdGUgdGhlIG5vZGUgaW4gd2hpY2ggcG9pbnQgaXMgbG9jYXRlZC4NCk5vbi1uaWwgYXJn dW1lbnQgKHByZWZpeCwgaWYgaW50ZXJhY3RpdmUpIG1lYW5zIHVwZGF0ZSB0aGUgbm9kZXMgaW4g dGhlDQptYXJrZWQgcmVnaW9uLg0KDQpUaGUgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBvciB1cGRh dGluZyBub2RlcyBhbmQgbWVudXMsIGFuZCB0aGVpcg0Ka2V5YmluZGluZ3MsIGFyZToNCg0KICAg IGB0ZXhpbmZvLXVwZGF0ZS1ub2RlJyAoJm9wdGlvbmFsIHJlZ2lvbi1wKSAgICBcXFt0ZXhpbmZv LXVwZGF0ZS1ub2RlXQ0KICAgIGB0ZXhpbmZvLWV2ZXJ5LW5vZGUtdXBkYXRlJyAoKSAgICAgICAg ICAgICAgICBcXFt0ZXhpbmZvLWV2ZXJ5LW5vZGUtdXBkYXRlXQ0KICAgIGB0ZXhpbmZvLXNlcXVl bnRpYWwtbm9kZS11cGRhdGUnICgmb3B0aW9uYWwgcmVnaW9uLXApDQoNCiAgICBgdGV4aW5mby1t YWtlLW1lbnUnICgmb3B0aW9uYWwgcmVnaW9uLXApICAgICAgXFxbdGV4aW5mby1tYWtlLW1lbnVd DQogICAgYHRleGluZm8tYWxsLW1lbnVzLXVwZGF0ZScgKCkgICAgICAgICAgICAgICAgIFxcW3Rl eGluZm8tYWxsLW1lbnVzLXVwZGF0ZV0NCiAgICBgdGV4aW5mby1tYXN0ZXItbWVudScgKCkNCg0K ICAgIGB0ZXhpbmZvLWluZGVudC1tZW51LWRlc2NyaXB0aW9uJyAoY29sdW1uICZvcHRpb25hbCBy ZWdpb24tcCkNCg0KVGhlIGB0ZXhpbmZvLWNvbHVtbi1mb3ItZGVzY3JpcHRpb24nIHZhcmlhYmxl IHNwZWNpZmllcyB0aGUgY29sdW1uIHRvDQp3aGljaCBtZW51IGRlc2NyaXB0aW9ucyBhcmUgaW5k ZW50ZWQuIEl0cyBkZWZhdWx0IHZhbHVlIGlzIDMyLiINCiAgdCBuaWwpDQoNCihhdXRvbG9hZCAn dGV4aW5mby1ldmVyeS1ub2RlLXVwZGF0ZQ0KICAidGV4bmZvLXVwZCINCiAgIlVwZGF0ZSBldmVy eSBub2RlIGluIGEgVGV4aW5mbyBmaWxlLiINCiAgdCBuaWwpDQoNCihhdXRvbG9hZCAndGV4aW5m by1zZXF1ZW50aWFsLW5vZGUtdXBkYXRlDQogICJ0ZXhuZm8tdXBkIg0KICAiVXBkYXRlIG9uZSBu b2RlIChvciBtYW55KSBpbiBhIFRleGluZm8gZmlsZSB3aXRoIHNlcXVlbnRpYWwgcG9pbnRlcnMu DQoNClRoaXMgZnVuY3Rpb24gY2F1c2VzIHRoZSBgTmV4dCcgb3IgYFByZXZpb3VzJyBwb2ludGVy IHRvIHBvaW50IHRvIHRoZQ0KaW1tZWRpYXRlbHkgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBub2Rl LCBldmVuIGlmIGl0IGlzIGF0IGEgaGlnaGVyIG9yDQpsb3dlciBoaWVyYXJjaGljYWwgbGV2ZWwg aW4gdGhlIGRvY3VtZW50LiAgQ29udGludWFsbHkgcHJlc3NpbmcgYG4nIG9yDQpgcCcgdGFrZXMg eW91IHN0cmFpZ2h0IHRocm91Z2ggdGhlIGZpbGUuDQoNCldpdGhvdXQgYW55IHByZWZpeCBhcmd1 bWVudCwgdXBkYXRlIHRoZSBub2RlIGluIHdoaWNoIHBvaW50IGlzIGxvY2F0ZWQuDQpOb24tbmls IGFyZ3VtZW50IChwcmVmaXgsIGlmIGludGVyYWN0aXZlKSBtZWFucyB1cGRhdGUgdGhlIG5vZGVz IGluIHRoZQ0KbWFya2VkIHJlZ2lvbi4NCg0KVGhpcyBjb21tYW5kIG1ha2VzIGl0IGF3a3dhcmQg dG8gbmF2aWdhdGUgYW1vbmcgc2VjdGlvbnMgYW5kDQpzdWJzZWN0aW9uczsgaXQgc2hvdWxkIGJl IHVzZWQgb25seSBmb3IgdGhvc2UgZG9jdW1lbnRzIHRoYXQgYXJlIG1lYW50DQp0byBiZSByZWFk IGxpa2UgYSBub3ZlbCByYXRoZXIgdGhhbiBhIHJlZmVyZW5jZSwgYW5kIGZvciB3aGljaCB0aGUN CkluZm8gYGcqJyBjb21tYW5kIGlzIGluYWRlcXVhdGUuIg0KICB0IG5pbCkNCg0KKGF1dG9sb2Fk ICd0ZXhpbmZvLW1ha2UtbWVudQ0KICAidGV4bmZvLXVwZCINCiAgIldpdGhvdXQgYW55IHByZWZp eCBhcmd1bWVudCwgbWFrZSBvciB1cGRhdGUgYSBtZW51Lg0KTWFrZSB0aGUgbWVudSBmb3IgdGhl IHNlY3Rpb24gZW5jbG9zaW5nIHRoZSBub2RlIGZvdW5kIGZvbGxvd2luZyBwb2ludC4NCg0KTm9u LW5pbCBhcmd1bWVudCAocHJlZml4LCBpZiBpbnRlcmFjdGl2ZSkgbWVhbnMgbWFrZSBvciB1cGRh dGUgbWVudXMNCmZvciBub2RlcyB3aXRoaW4gb3IgcGFydCBvZiB0aGUgbWFya2VkIHJlZ2lvbi4N Cg0KV2hlbmV2ZXIgYSBtZW51IGV4aXN0cywgYW5kIGlzIGJlaW5nIHVwZGF0ZWQsIHRoZSBkZXNj cmlwdGlvbnMgdGhhdA0KYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlIG5hbWVzIGluIHRoZSBwcmUt ZXhpc3RpbmcgbWVudSBhcmUNCmluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXcgbWVudS4gIE90aGVy d2lzZSwgdGhlIG5vZGVzJyBzZWN0aW9uIHRpdGxlcw0KYXJlIGluc2VydGVkIGFzIGRlc2NyaXB0 aW9ucy4iDQogIHQgbmlsKQ0KDQooYXV0b2xvYWQgJ3RleGluZm8tYWxsLW1lbnVzLXVwZGF0ZQ0K ICAidGV4bmZvLXVwZCINCiAgIlVwZGF0ZSBldmVyeSByZWd1bGFyIG1lbnUgaW4gYSBUZXhpbmZv IGZpbGUuDQpSZW1vdmUgcHJlLWV4aXN0aW5nIG1hc3RlciBtZW51LCBpZiB0aGVyZSBpcyBvbmUu DQoNCklmIGNhbGxlZCB3aXRoIGEgbm9uLW5pbCBhcmd1bWVudCwgdGhpcyBmdW5jdGlvbiBmaXJz dCB1cGRhdGVzIGFsbCB0aGUNCm5vZGVzIGluIHRoZSBidWZmZXIgYmVmb3JlIHVwZGF0aW5nIHRo ZSBtZW51cy4iDQogIHQgbmlsKQ0KDQooYXV0b2xvYWQgJ3RleGluZm8tbWFzdGVyLW1lbnUNCiAg InRleG5mby11cGQiDQogICJNYWtlIGEgbWFzdGVyIG1lbnUgZm9yIGEgd2hvbGUgVGV4aW5mbyBm aWxlLg0KTm9uLW5pbCBhcmd1bWVudCAocHJlZml4LCBpZiBpbnRlcmFjdGl2ZSkgbWVhbnMgZmly c3QgdXBkYXRlIGFsbA0KZXhpc3Rpbmcgbm9kZXMgYW5kIG1lbnVzLiAgUmVtb3ZlIHByZS1leGlz dGluZyBtYXN0ZXIgbWVudSwgaWYgdGhlcmUgaXMgb25lLg0KDQpUaGlzIGZ1bmN0aW9uIGNyZWF0 ZXMgYSBtYXN0ZXIgbWVudSB0aGF0IGZvbGxvd3MgdGhlIHRvcCBub2RlLiAgVGhlDQptYXN0ZXIg bWVudSBpbmNsdWRlcyBldmVyeSBlbnRyeSBmcm9tIGFsbCB0aGUgb3RoZXIgbWVudXMuICBJdA0K cmVwbGFjZXMgYW55IGV4aXN0aW5nIG9yZGluYXJ5IG1lbnUgdGhhdCBmb2xsb3dzIHRoZSB0b3Ag bm9kZS4NCg0KSWYgY2FsbGVkIHdpdGggYSBub24tbmlsIGFyZ3VtZW50LCB0aGlzIGZ1bmN0aW9u IGZpcnN0IHVwZGF0ZXMgYWxsIHRoZQ0KbWVudXMgaW4gdGhlIGJ1ZmZlciAoaW5jb3Jwb3JhdGlu ZyBkZXNjcmlwdGlvbnMgZnJvbSBwcmUtZXhpc3RpbmcNCm1lbnVzKSBiZWZvcmUgaXQgY29uc3Ry dWN0cyB0aGUgbWFzdGVyIG1lbnUuDQoNClRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBkZXRhaWxl ZCBwYXJ0IG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgbWFzdGVyDQptZW51LiAgVGhpcyBhY3Rpb24g ZGVwZW5kcyBvbiB0aGUgcHJlLWV4aXN0aW5nIG1hc3RlciBtZW51IHVzaW5nIHRoZQ0Kc3RhbmRh cmQgYHRleGluZm8tbWFzdGVyLW1lbnUtaGVhZGVyJy4NCg0KVGhlIG1hc3RlciBtZW51IGhhcyB0 aGUgZm9sbG93aW5nIGZvcm1hdCwgd2hpY2ggaXMgYWRhcHRlZCBmcm9tIHRoZQ0KcmVjb21tZW5k YXRpb24gaW4gdGhlIFRleGluZm8gTWFudWFsOg0KDQogICAqIFRoZSBmaXJzdCBwYXJ0IGNvbnRh aW5zIHRoZSBtYWpvciBub2RlcyBpbiB0aGUgVGV4aW5mbyBmaWxlOiB0aGUNCiAgICAgbm9kZXMg Zm9yIHRoZSBjaGFwdGVycywgY2hhcHRlci1saWtlIHNlY3Rpb25zLCBhbmQgdGhlIG1ham9yDQog ICAgIGFwcGVuZGljZXMuICBUaGlzIGluY2x1ZGVzIHRoZSBpbmRpY2VzLCBzbyBsb25nIGFzIHRo ZXkgYXJlIGluDQogICAgIGNoYXB0ZXItbGlrZSBzZWN0aW9ucywgc3VjaCBhcyB1bm51bWJlcmVk IHNlY3Rpb25zLg0KDQogICAqIFRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcGFydHMgY29udGFp biBhIGxpc3Rpbmcgb2YgdGhlIG90aGVyLA0KICAgICBsb3dlciBsZXZlbCBtZW51cywgaW4gb3Jk ZXIuICBUaGlzIHdheSwgYW4gaW5xdWlyZXIgY2FuIGdvDQogICAgIGRpcmVjdGx5IHRvIGEgcGFy dGljdWxhciBub2RlIGlmIGhlIG9yIHNoZSBpcyBzZWFyY2hpbmcgZm9yDQogICAgIHNwZWNpZmlj IGluZm9ybWF0aW9uLg0KDQpFYWNoIG9mIHRoZSBtZW51cyBpbiB0aGUgZGV0YWlsZWQgbm9kZSBs aXN0aW5nIGlzIGludHJvZHVjZWQgYnkgdGhlDQp0aXRsZSBvZiB0aGUgc2VjdGlvbiBjb250YWlu aW5nIHRoZSBtZW51LiINCiAgdCBuaWwpDQoNCihhdXRvbG9hZCAndGV4aW5mby1pbmRlbnQtbWVu dS1kZXNjcmlwdGlvbg0KICAidGV4bmZvLXVwZCINCiAgIkluZGVudCBldmVyeSBkZXNjcmlwdGlv biBpbiBtZW51IGZvbGxvd2luZyBwb2ludCB0byBDT0xVTU4uDQpOb24tbmlsIGFyZ3VtZW50IChw cmVmaXgsIGlmIGludGVyYWN0aXZlKSBtZWFucyBpbmRlbnQgZXZlcnkNCmRlc2NyaXB0aW9uIGlu IGV2ZXJ5IG1lbnUgaW4gdGhlIHJlZ2lvbi4gIERvZXMgbm90IGluZGVudCBzZWNvbmQgYW5kDQpz dWJzZXF1ZW50IGxpbmVzIG9mIGEgbXVsdGktbGluZSBkZXNjcmlwdGlvbi4iDQogIHQgbmlsKQ0K DQooYXV0b2xvYWQgJ3RleGluZm8taW5zZXJ0LW5vZGUtbGluZXMNCiAgInRleG5mby11cGQiDQog ICJJbnNlcnQgbWlzc2luZyBgQG5vZGUnIGxpbmVzIGluIHJlZ2lvbiBvZiBUZXhpbmZvIGZpbGUu DQpOb24tbmlsIGFyZ3VtZW50IChwcmVmaXgsIGlmIGludGVyYWN0aXZlKSBtZWFucyBhbHNvIHRv IGluc2VydCB0aGUNCnNlY3Rpb24gdGl0bGVzIGFzIG5vZGUgbmFtZXM7IGFuZCBhbHNvIHRvIGlu c2VydCB0aGUgc2VjdGlvbiB0aXRsZXMgYXMNCm5vZGUgbmFtZXMgaW4gcHJlLWV4aXN0aW5nIEBu b2RlIGxpbmVzIHRoYXQgbGFjayBuYW1lcy4iDQogIHQgbmlsKQ0KDQooYXV0b2xvYWQgJ3RleGlu Zm8tc3RhcnQtbWVudS1kZXNjcmlwdGlvbg0KICAidGV4bmZvLXVwZCINCiAgIkluIHRoaXMgbWVu dSBlbnRyeSwgaW5zZXJ0IHRoZSBub2RlJ3Mgc2VjdGlvbiB0aXRsZSBhcyBhIGRlc2NyaXB0aW9u Lg0KUG9zaXRpb24gcG9pbnQgYXQgYmVnaW5uaW5nIG9mIGRlc2NyaXB0aW9uIHJlYWR5IGZvciBl ZGl0aW5nLg0KRG8gbm90IGluc2VydCBhIHRpdGxlIGlmIHRoZSBsaW5lIGNvbnRhaW5zIGFuIGV4 aXN0aW5nIGRlc2NyaXB0aW9uLg0KDQpZb3Ugd2lsbCBuZWVkIHRvIGVkaXQgdGhlIGluc2VydGVk IHRleHQgc2luY2UgYSB1c2VmdWwgZGVzY3JpcHRpb24NCmNvbXBsZW1lbnRzIHRoZSBub2RlIG5h bWUgcmF0aGVyIHRoYW4gcmVwZWF0cyBpdCBhcyBhIHRpdGxlIGRvZXMuIg0KICB0IG5pbCkNCg0K KGF1dG9sb2FkICd0ZXhpbmZvLW11bHRpcGxlLWZpbGVzLXVwZGF0ZQ0KICAidGV4bmZvLXVwZCIN CiAgIlVwZGF0ZSBmaXJzdCBub2RlIHBvaW50ZXJzIGluIGVhY2ggZmlsZSBpbmNsdWRlZCBpbiBP VVRFUi1GSUxFOw0KY3JlYXRlIG9yIHVwZGF0ZSBtYWluIG1lbnUgaW4gdGhlIG91dGVyIGZpbGUg dGhhdCByZWZlcnMgdG8gc3VjaCBub2Rlcy4NClRoaXMgZG9lcyBub3QgY3JlYXRlIG9yIHVwZGF0 ZSBtZW51cyBvciBwb2ludGVycyB3aXRoaW4gdGhlIGluY2x1ZGVkIGZpbGVzLg0KDQpXaXRoIG9w dGlvbmFsIE1BS0UtTUFTVEVSLU1FTlUgYXJndW1lbnQgKHByZWZpeCBhcmcsIGlmIGludGVyYWN0 aXZlKSwNCmluc2VydCBhIG1hc3RlciBtZW51IGluIE9VVEVSLUZJTEUuICBUaGlzIGRvZXMgbm90 IGNyZWF0ZSBvciB1cGRhdGUNCm1lbnVzIG9yIHBvaW50ZXJzIHdpdGhpbiB0aGUgaW5jbHVkZWQg ZmlsZXMuDQoNCldpdGggb3B0aW9uYWwgVVBEQVRFLUVWRVJZVEhJTkcgYXJndW1lbnQgKG51bWVy aWMgcHJlZml4IGFyZywgaWYNCmludGVyYWN0aXZlKSwgdXBkYXRlIGFsbCB0aGUgbWVudXMgYW5k IGFsbCB0aGUgYE5leHQnLCBgUHJldmlvdXMnLCBhbmQNCmBVcCcgcG9pbnRlcnMgb2YgYWxsIHRo ZSBmaWxlcyBpbmNsdWRlZCBpbiBPVVRFUi1GSUxFIGJlZm9yZSBpbnNlcnRpbmcNCmEgbWFzdGVy IG1lbnUgaW4gT1VURVItRklMRS4NCg0KVGhlIGNvbW1hbmQgYWxzbyB1cGRhdGVzIHRoZSBgVG9w JyBsZXZlbCBub2RlIHBvaW50ZXJzIG9mIE9VVEVSLUZJTEUuDQoNCk5vdGVzOg0KDQogICogdGhp cyBjb21tYW5kIGRvZXMgTk9UIHNhdmUgYW55IGZpbGVzLS15b3UgbXVzdCBzYXZlIHRoZQ0KICAg IG91dGVyIGZpbGUgYW5kIGFueSBtb2RpZmllZCwgaW5jbHVkZWQgZmlsZXMuDQoNCiAgKiBleGNl cHQgZm9yIHRoZSBgVG9wJyBub2RlLCB0aGlzIGNvbW1hbmQgZG9lcyBOT1QgaGFuZGxlIGFueQ0K ICAgIHByZS1leGlzdGluZyBub2RlcyBpbiB0aGUgb3V0ZXIgZmlsZTsgaGVuY2UsIGluZGljZXMg bXVzdCBiZQ0KICAgIGVuY2xvc2VkIGluIGFuIGluY2x1ZGVkIGZpbGUuDQoNClJlcXVpcmVtZW50 czoNCg0KICAqIGVhY2ggb2YgdGhlIGluY2x1ZGVkIGZpbGVzIG11c3QgY29udGFpbiBleGFjdGx5 IG9uZSBoaWdoZXN0DQogICAgaGllcmFyY2hpY2FsIGxldmVsIG5vZGUsDQogICogdGhpcyBoaWdo ZXN0IG5vZGUgbXVzdCBiZSB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgaW5jbHVkZWQgZmlsZSwNCiAg KiBlYWNoIGhpZ2hlc3QgaGllcmFyY2hpY2FsIGxldmVsIG5vZGUgbXVzdCBiZSBvZiB0aGUgc2Ft ZSB0eXBlLg0KDQpUaHVzLCBub3JtYWxseSwgZWFjaCBpbmNsdWRlZCBmaWxlIGNvbnRhaW5zIG9u ZSwgYW5kIG9ubHkgb25lLA0KY2hhcHRlci4iDQogIHQgbmlsKQ0KDQoMDQo7OzsgQ29kZToNCg0K Ozs7IERvbid0IHlvdSBkYXJlIGluc2VydCBhbnkgYHJlcXVpcmUnIGNhbGxzIGF0IHRvcCBsZXZl bCBpbiB0aGlzIGZpbGUtLXJtcy4NCg0KKGRlZnZhciB0ZXhpbmZvLXNlY3Rpb24tbGlzdA0KICAn KCgidG9wIiAxKQ0KICAgICgiY2hhcHRlciIgMikNCiAgICAoInNlY3Rpb24iIDMpDQogICAgKCJz dWJzZWN0aW9uIiA0KQ0KICAgICgic3Vic3Vic2VjdGlvbiIgNSkNCiAgICAoInVubnVtYmVyZWQi IDIpDQogICAgKCJ1bm51bWJlcmVkc2VjIiAzKQ0KICAgICgidW5udW1iZXJlZHN1YnNlYyIgNCkN CiAgICAoInVubnVtYmVyZWRzdWJzdWJzZWMiIDUpDQogICAgKCJhcHBlbmRpeCIgMikNCiAgICAo ImFwcGVuZGl4c2VjIiAzKQ0KICAgICgiYXBwZW5kaXhzZWN0aW9uIiAzKQ0KICAgICgiYXBwZW5k aXhzdWJzZWMiIDQpDQogICAgKCJhcHBlbmRpeHN1YnN1YnNlYyIgNSkNCiAgICAoIm1ham9yaGVh ZGluZyIgMikNCiAgICAoImNoYXBoZWFkaW5nIiAyKQ0KICAgICgiaGVhZGluZyIgMykNCiAgICAo InN1YmhlYWRpbmciIDQpDQogICAgKCJzdWJzdWJoZWFkaW5nIiA1KSkNCiAgIkFsaXN0IG9mIHNl Y3Rpb25pbmcgY29tbWFuZHMgYW5kIHRoZWlyIHJlbGF0aXZlIGxldmVsLiIpDQoNCjs7OyBTeW50 YXggdGFibGUNCg0KKGRlZnZhciB0ZXhpbmZvLW1vZGUtc3ludGF4LXRhYmxlDQogIChsZXQgKChz dCAobWFrZS1zeW50YXgtdGFibGUpKSkNCiAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XCIgIi4i IHN0KQ0KICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cXCAiLiIgc3QpDQogICAgKG1vZGlmeS1z eW50YXgtZW50cnkgP0AgIlxcIiBzdCkNCiAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XF5xICJc XCIgc3QpDQogICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xbICIoXSIgc3QpDQogICAgKG1vZGlm eS1zeW50YXgtZW50cnkgP1xdICIpWyIgc3QpDQogICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP3sg Iih9IiBzdCkNCiAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/fSAiKXsiIHN0KQ0KICAgIChtb2Rp Znktc3ludGF4LWVudHJ5ID9cbiAiPiIgc3QpDQogICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1wn ICJ3IiBzdCkNCiAgICBzdCkpDQoNCjs7IFdyaXR0ZW4gYnkgV29sZmdhbmcgQmFuZ2VydGggPHpj ZzUxMTIyQHJwb29sMS5ydXMudW5pLXN0dXR0Z2FydC5kZT4NCjs7IFRvIG92ZXJyaWRlIHRoaXMg ZXhhbXBsZSwgc2V0IGVpdGhlciBgaW1lbnUtZ2VuZXJpYy1leHByZXNzaW9uJw0KOzsgb3IgYGlt ZW51LWNyZWF0ZS1pbmRleC1mdW5jdGlvbicuDQooZGVmdmFyIHRleGluZm8taW1lbnUtZ2VuZXJp Yy1leHByZXNzaW9uDQogICcoKG5pbCAiXkBcXChub2RlXFx8YW5jaG9yXFwpWyBcdF0rXFwoW14s XG5dKlxcKSIgMikNCiAgICAoIkNoYXB0ZXJzIiAiXkBjaGFwdGVyWyBcdF0rXFwoLipcXCkkIiAx KSkNCiAgIkltZW51IGdlbmVyaWMgZXhwcmVzc2lvbiBmb3IgVGV4aW5mbyBtb2RlLiAgU2VlIGBp bWVudS1nZW5lcmljLWV4cHJlc3Npb24nLiIpDQoNCihkZWZ2YXIgdGV4aW5mby1mb250LWxvY2st c3ludGFjdGljLWtleXdvcmRzDQogICcoKCJcXChAXFwpY1xcKG9tbWVudFxcKT9cXD4iICgxICI8 IikpDQogICAgKCJeXFwoQFxcKWlnbm9yZVxcPiIgKDEgIjwgYiIpKQ0KICAgICgiXkBlbmQgaWdu b3JlXFwoXG5cXCkiICgxICI+IGIiKSkpDQogICJTeW50YWN0aWMga2V5d29yZHMgdG8gY2F0Y2gg Y29tbWVudCBkZWxpbWl0ZXJzIGluIGB0ZXhpbmZvLW1vZGUnLiIpDQoNCihkZWZjb25zdCB0ZXhp bmZvLWVudmlyb25tZW50cw0KICAnKCJjYXJ0b3VjaGUiICJjb3B5aW5nIiAiZGVmY3YiICJkZWZm biIgImRlZml2YXIiICJkZWZtYWMiDQogICAgImRlZm1ldGhvZCIgImRlZm9wIiAiZGVmb3B0IiAi ZGVmc3BlYyIgImRlZnRwIiAiZGVmdHlwZWZuIg0KICAgICJkZWZ0eXBlZnVuIiAiZGVmdHlwZXZh ciIgImRlZnR5cGV2ciIgImRlZnVuIiAiZGVmdmFyIg0KICAgICJkZWZ2ciIgImRlc2NyaXB0aW9u IiAiZGV0YWlsbWVudSIgImRpcmVudHJ5IiAiZGlzcGxheSINCiAgICAiZG9jdW1lbnRkZXNjcmlw dGlvbiIgImVudW1lcmF0ZSIgImV4YW1wbGUiICJmbHVzaGxlZnQiDQogICAgImZsdXNocmlnaHQi ICJmb3JtYXQiICJmdGFibGUiICJncm91cCIgImlmY2xlYXIiICJpZnNldCINCiAgICAiaWZodG1s IiAiaWZpbmZvIiAiaWZub3RodG1sIiAiaWZub3RpbmZvIiAiaWZub3RwbGFpbnRleHQiDQogICAg Imlmbm90dGV4IiAiaWZwbGFpbnRleHQiICJpZnRleCIgImlnbm9yZSIgIml0ZW1pemUiICJsaXNw Ig0KICAgICJtYWNybyIgIm1lbnUiICJtdWx0aXRhYmxlIiAicXVvdGF0aW9uIiAic21hbGxkaXNw bGF5Ig0KICAgICJzbWFsbGV4YW1wbGUiICJzbWFsbGZvcm1hdCIgInNtYWxsbGlzcCIgInRhYmxl IiAidGV4Ig0KICAgICJ0aXRsZXBhZ2UiICJ2ZXJiYXRpbSIgInZ0YWJsZSIpDQogICJMaXN0IG9m IFRleGluZm8gZW52aXJvbm1lbnRzLiIpDQoNCihkZWZjb25zdCB0ZXhpbmZvLWVudmlyb25tZW50 LXJlZ2V4cA0KICAoY29uY2F0ICJeQCIgKHJlZ2V4cC1vcHQgKGNvbnMgImVuZCIgdGV4aW5mby1l bnZpcm9ubWVudHMpIHQpICJcXD4iKQ0KICAiUmVnZXhwIGZvciBlbnZpcm9ubWVudC1saWtlIFRl eGluZm8gbGlzdCBjb21tYW5kcy4NClN1YmV4cHJlc3Npb24gMSBpcyB3aGF0IGdvZXMgaW50byB0 aGUgY29ycmVzcG9uZGluZyBgQGVuZCcgc3RhdGVtZW50LiIpDQoNCihkZWZmYWNlIHRleGluZm8t aGVhZGluZw0KICAnKCh0ICg6aW5oZXJpdCBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkp DQogICJGYWNlIHVzZWQgZm9yIHNlY3Rpb24gaGVhZGluZ3MgaW4gYHRleGluZm8tbW9kZScuIg0K ICA6Z3JvdXAgJ3RleGluZm8pDQo7OyBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IGFsaWFzDQoocHV0 ICd0ZXhpbmZvLWhlYWRpbmctZmFjZSAnZmFjZS1hbGlhcyAndGV4aW5mby1oZWFkaW5nKQ0KKGRl ZnZhciB0ZXhpbmZvLWhlYWRpbmctZmFjZSAndGV4aW5mby1oZWFkaW5nKQ0KDQooZGVmdmFyIHRl eGluZm8tZm9udC1sb2NrLWtleXdvcmRzDQogIGAoOzsgQWxsIGJ1dCB0aGUgZmlyc3QgaGFkIGFu IE9WRVJSSURFIG9mIHQuDQogICAgOzsgSXQgZGlkbid0IHNlZW0gdG8gYmUgYW55IGJldHRlciwg YW5kIGl0J3Mgc2xvd2VyLS1zaW1vbi4NCiAgICA7OyBSb2JlcnQgSi4gQ2hhc3NlbGwgPGJvYkBn bnUub3JnPiBzYXlzIHJlbW92ZSB0aGlzIGxpbmUuDQogICAgOzsoIlxcJFxcKFteJF0qXFwpXFwk IiAxIGZvbnQtbG9jay1zdHJpbmctZmFjZSB0KQ0KICAgICgiQFxcKFthLXpBLVpdK1xcfFteIFx0 XG5dXFwpIiAxIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpIDtjb21tYW5kcw0KICAgICgiXlxcKlxc KFteXG46XSpcXCkiIDEgZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSB0KSA7bWVudSBpdGVt cw0KICAgICgiQFxcKGVtcGhcXHxpXFx8c2NcXCl7XFwoW159XStcXCkiIDIgJ2l0YWxpYykNCiAg ICAoIkBcXChzdHJvbmdcXHxiXFwpe1xcKFtefV0rXFwpIiAyICdib2xkKQ0KICAgICgiQFxcKGti ZFxcfGtleVxcfHVybFxcfHVyZWZcXCl7XFwoW159XStcXCkiIDIgZm9udC1sb2NrLXN0cmluZy1m YWNlKQ0KICAgIDs7IFRoZSBmb2xsb3dpbmcgdHdvIGdyb3VwcyBoYXZlIGFuIE9WRVJSSURFIG9m IGBrZWVwJyBiZWNhdXNlDQogICAgOzsgdGhlaXIgYXJndW1lbnRzIGZyZXF1ZW50bHkgaW5jbHVk ZSBhIEBALCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGF0DQogICAgOzsgdG8gb3ZlcndyaXRlIHRoZSBu b3JtYWwgZm9udGlmaWNhdGlvbiBvZiB0aGUgYXJndW1lbnQuDQogICAgKCJAXFwoZmlsZVxcfGVt YWlsXFwpe1xcKFtefV0rXFwpIiAyIGZvbnQtbG9jay1zdHJpbmctZmFjZSBrZWVwKQ0KICAgICgi QFxcKHNhbXBcXHxjb2RlXFx8dmFyXFx8bWF0aFxcfGVudlxcfGNvbW1hbmRcXHxvcHRpb25cXCl7 XFwoW159XStcXCkiDQogICAgIDIgZm9udC1sb2NrLXZhcmlhYmxlLW5hbWUtZmFjZSBrZWVwKQ0K ICAgICgiQFxcKGNpdGVcXHx4P3JlZlxcfHB4cmVmXFx8ZGZuXFx8aW5mb3JlZlxcKXtcXChbXn1d K1xcKSINCiAgICAgMiBmb250LWxvY2stY29uc3RhbnQtZmFjZSkNCiAgICAoIkBcXChhbmNob3Jc XCl7XFwoW159XStcXCkiIDIgZm9udC1sb2NrLXR5cGUtZmFjZSkNCiAgICAoIkBcXChkbW5cXHxh Y3JvbnltXFx8dmFsdWVcXCl7XFwoW159XStcXCkiIDIgZm9udC1sb2NrLWJ1aWx0aW4tZmFjZSkN CiAgICAoIkBcXChlbmRcXHxpdGVteD9cXCkgK1xcKC4rXFwpIiAyIGZvbnQtbG9jay1rZXl3b3Jk LWZhY2Uga2VlcCkNCiAgICA7OyAoLHRleGluZm8tZW52aXJvbm1lbnQtcmVnZXhwDQogICAgOzsg IDEgKHRleGluZm8tY2xvbmUtZW52aXJvbm1lbnQgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gt ZW5kIDEpKSBrZWVwKQ0KICAgICgsKGNvbmNhdCAiXkAiIChyZWdleHAtb3B0IChtYXBjYXIgJ2Nh ciB0ZXhpbmZvLXNlY3Rpb24tbGlzdCkgdCkNCgkgICAgICAgIi4qXG4iKSAwIHRleGluZm8taGVh ZGluZy1mYWNlIHQpKQ0KICAiQWRkaXRpb25hbCBleHByZXNzaW9ucyB0byBoaWdobGlnaHQgaW4g VGV4aW5mbyBtb2RlLiIpDQoNCihkZWZ1biB0ZXhpbmZvLWNsb25lLWVudmlyb25tZW50IChzdGFy dCBlbmQpDQogIChsZXQgKChlbmRwIG5pbCkpDQogICAgKHNhdmUtZXhjdXJzaW9uDQogICAgICAo aWdub3JlLWVycm9ycw0KCShnb3RvLWNoYXIgc3RhcnQpDQoJKHdoZW4gKGxvb2tpbmctYXQgImVu ZFxcU3crXFwoXFxzdytcXCkiKQ0KCSAgKHNldHEgZW5kcCB0IHN0YXJ0IChtYXRjaC1iZWdpbm5p bmcgMSkgZW5kIChtYXRjaC1lbmQgMSkpKQ0KCSh1bmxlc3MgKGdldC1jaGFyLXByb3BlcnR5IHN0 YXJ0ICd0ZXh0LWNsb25lcykNCgkgIChpZiBlbmRwDQoJICAgICAgKHRleGluZm8tbGFzdC11bmVu ZGVkLWJlZ2luKQ0KCSAgICAoZm9yd2FyZC13b3JkIDEpDQoJICAgICh0ZXhpbmZvLW5leHQtdW5t YXRjaGVkLWVuZCkpDQoJICAoc2tpcC1zeW50YXgtZm9yd2FyZCAiXnciKQ0KCSAgKHdoZW4gKGxv b2tpbmctYXQNCgkJIChjb25jYXQgKHJlZ2V4cC1xdW90ZSAoYnVmZmVyLXN1YnN0cmluZyBzdGFy dCBlbmQpKSAiXFw+IikpDQoJICAgICh0ZXh0LWNsb25lLWNyZWF0ZSBzdGFydCBlbmQgJ3NwcmVh ZCAiXFx3KiIpKSkpKSkpDQoNCgwNCjs7OyBLZXliaW5kaW5ncw0KDQo7OzsgS2V5cyBjb21tb24g Ym90aCB0byBUZXhpbmZvIG1vZGUgYW5kIHRvIFRlWCBzaGVsbC4NCg0KKGRlZnVuIHRleGluZm8t ZGVmaW5lLWNvbW1vbi1rZXlzIChrZXltYXApDQogICJEZWZpbmUgdGhlIGtleXMgYm90aCBpbiBU ZXhpbmZvIG1vZGUgYW5kIGluIHRoZSB0ZXhpbmZvLXRleC1zaGVsbC4iDQogIChkZWZpbmUta2V5 IGtleW1hcCAiXEMtY1xDLXRcQy1rIiAgICAndGV4LWtpbGwtam9iKQ0KICAoZGVmaW5lLWtleSBr ZXltYXAgIlxDLWNcQy10XEMteCIgICAgJ3RleGluZm8tcXVpdC1qb2IpDQogIChkZWZpbmUta2V5 IGtleW1hcCAiXEMtY1xDLXRcQy1sIiAgICAndGV4LXJlY2VudGVyLW91dHB1dC1idWZmZXIpDQog IChkZWZpbmUta2V5IGtleW1hcCAiXEMtY1xDLXRcQy1kIiAgICAndGV4aW5mby1kZWxldGUtZnJv bS1wcmludC1xdWV1ZSkNCiAgKGRlZmluZS1rZXkga2V5bWFwICJcQy1jXEMtdFxDLXEiICAgICd0 ZXgtc2hvdy1wcmludC1xdWV1ZSkNCiAgKGRlZmluZS1rZXkga2V5bWFwICJcQy1jXEMtdFxDLXAi ICAgICd0ZXhpbmZvLXRleC1wcmludCkNCiAgKGRlZmluZS1rZXkga2V5bWFwICJcQy1jXEMtdFxD LXYiICAgICd0ZXhpbmZvLXRleC12aWV3KQ0KICAoZGVmaW5lLWtleSBrZXltYXAgIlxDLWNcQy10 XEMtaSIgICAgJ3RleGluZm8tdGV4aW5kZXgpDQoNCiAgKGRlZmluZS1rZXkga2V5bWFwICJcQy1j XEMtdFxDLXIiICAgICd0ZXhpbmZvLXRleC1yZWdpb24pDQogIChkZWZpbmUta2V5IGtleW1hcCAi XEMtY1xDLXRcQy1iIiAgICAndGV4aW5mby10ZXgtYnVmZmVyKSkNCg0KOzsgTW9kZSBkb2N1bWVu dGF0aW9uIGRpc3BsYXlzIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXINCjs7IGZyb20gaG93IHRo ZXkgYXJlIGxpc3RlZCBpbiB0aGUgdGV4aW5mby1tb2RlLW1hcC4NCg0KKGRlZnZhciB0ZXhpbmZv LW1vZGUtbWFwDQogIChsZXQgKChtYXAgKG1ha2Utc3BhcnNlLWtleW1hcCkpKQ0KDQogICAgOzsg YmluZGluZ3MgZm9yIGB0ZXhuZm8tdGV4LmVsJw0KICAgICh0ZXhpbmZvLWRlZmluZS1jb21tb24t a2V5cyBtYXApDQoNCiAgICAoZGVmaW5lLWtleSBtYXAgIlwiIiAndGV4aW5mby1pbnNlcnQtcXVv dGUpDQoNCiAgICA7OyBiaW5kaW5ncyBmb3IgYG1ha2VpbmZvLmVsJw0KICAgIChkZWZpbmUta2V5 IG1hcCAiXEMtY1xDLW1cQy1rIiAna2lsbC1jb21waWxhdGlvbikNCiAgICAoZGVmaW5lLWtleSBt YXAgIlxDLWNcQy1tXEMtbCINCiAgICAgICdtYWtlaW5mby1yZWNlbnRlci1jb21waWxhdGlvbi1i dWZmZXIpDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtbVxDLXIiICdtYWtlaW5mby1yZWdp b24pDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtbVxDLWIiICdtYWtlaW5mby1idWZmZXIp DQoNCiAgICA7OyBiaW5kaW5ncyBmb3IgYHRleGluZm10LmVsJw0KICAgIChkZWZpbmUta2V5IG1h cCAiXEMtY1xDLWVcQy1yIiAgICAndGV4aW5mby1mb3JtYXQtcmVnaW9uKQ0KICAgIChkZWZpbmUt a2V5IG1hcCAiXEMtY1xDLWVcQy1iIiAgICAndGV4aW5mby1mb3JtYXQtYnVmZmVyKQ0KDQogICAg OzsgQVVDVGVYLWxpa2UgYmluZGluZ3MNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxlXHIiCQkndGV4 aW5mby1pbnNlcnQtQGl0ZW0pDQoNCiAgICA7OyBiaW5kaW5ncyBmb3IgdXBkYXRpbmcgbm9kZXMg YW5kIG1lbnVzDQoNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy11bSIgICAndGV4aW5mby1t YXN0ZXItbWVudSkNCg0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXVcQy1tIiAgICd0ZXhp bmZvLW1ha2UtbWVudSkNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy11XEMtbiIgICAndGV4 aW5mby11cGRhdGUtbm9kZSkNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy11XEMtZSIgICAn dGV4aW5mby1ldmVyeS1ub2RlLXVwZGF0ZSkNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy11 XEMtYSIgICAndGV4aW5mby1hbGwtbWVudXMtdXBkYXRlKQ0KDQogICAgKGRlZmluZS1rZXkgbWFw ICJcQy1jXEMtcyIgICAgICd0ZXhpbmZvLXNob3ctc3RydWN0dXJlKQ0KDQogICAgKGRlZmluZS1r ZXkgbWFwICJcQy1jfSIgICAgICAgICAgJ3VwLWxpc3QpDQogICAgKGRlZmluZS1rZXkgbWFwICJc Qy1jXSIgICAgICAgICAgJ3VwLWxpc3QpDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jeyIJCSd0 ZXhpbmZvLWluc2VydC1icmFjZXMpDQoNCiAgICA7OyBiaW5kaW5ncyBmb3IgaW5zZXJ0aW5nIHN0 cmluZ3MNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1vIiAgICAgJ3RleGluZm8taW5zZXJ0 LWJsb2NrKQ0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWNcQy1kIiAndGV4aW5mby1zdGFy dC1tZW51LWRlc2NyaXB0aW9uKQ0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWNcQy1zIiAn dGV4aW5mby1pbnNlcnQtQHN0cm9uZykNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jXEMt ZSIgJ3RleGluZm8taW5zZXJ0LUBlbXBoKQ0KDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMt Y3YiICAgICd0ZXhpbmZvLWluc2VydC1AdmFyKQ0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xD LWN1IiAgICAndGV4aW5mby1pbnNlcnQtQHVyZWYpDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1j XEMtY3QiICAgICd0ZXhpbmZvLWluc2VydC1AdGFibGUpDQogICAgKGRlZmluZS1rZXkgbWFwICJc Qy1jXEMtY3MiICAgICd0ZXhpbmZvLWluc2VydC1Ac2FtcCkNCiAgICAoZGVmaW5lLWtleSBtYXAg IlxDLWNcQy1jcSIgICAgJ3RleGluZm8taW5zZXJ0LUBxdW90YXRpb24pDQogICAgKGRlZmluZS1r ZXkgbWFwICJcQy1jXEMtY28iICAgICd0ZXhpbmZvLWluc2VydC1Abm9pbmRlbnQpDQogICAgKGRl ZmluZS1rZXkgbWFwICJcQy1jXEMtY24iICAgICd0ZXhpbmZvLWluc2VydC1Abm9kZSkNCiAgICAo ZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jbSIgICAgJ3RleGluZm8taW5zZXJ0LUBlbWFpbCkNCiAg ICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jayIgICAgJ3RleGluZm8taW5zZXJ0LUBrYmQpDQog ICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtY2kiICAgICd0ZXhpbmZvLWluc2VydC1AaXRlbSkN CiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jZiIgICAgJ3RleGluZm8taW5zZXJ0LUBmaWxl KQ0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWN4IiAgICAndGV4aW5mby1pbnNlcnQtQGV4 YW1wbGUpDQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtY2UiICAgICd0ZXhpbmZvLWluc2Vy dC1AZW5kKQ0KICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWNkIiAgICAndGV4aW5mby1pbnNl cnQtQGRmbikNCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jYyIgICAgJ3RleGluZm8taW5z ZXJ0LUBjb2RlKQ0KICAgIG1hcCkpDQoNCihlYXN5LW1lbnUtZGVmaW5lIHRleGluZm8tbW9kZS1t ZW51DQogIHRleGluZm8tbW9kZS1tYXANCiAgIk1lbnUgdXNlZCBmb3IgYHRleGluZm8tbW9kZScu Ig0KICAnKCJUZXhpbmZvIg0KICAgIFsiSW5zZXJ0IGJsb2NrIgl0ZXhpbmZvLWluc2VydC1ibG9j awl0XQ0KICAgIDs7IFsiSW5zZXJ0IG5vZGUiCXRleGluZm8taW5zZXJ0LUBub2RlCXRdDQogICAg Ii0tLS0iDQogICAgWyJVcGRhdGUgQWxsIgkobGFtYmRhICgpIChpbnRlcmFjdGl2ZSkgKHRleGlu Zm8tbWFzdGVyLW1lbnUgdCkpDQogICAgIDprZXlzICJcXFt1bml2ZXJzYWwtYXJndW1lbnRdIFxc W3RleGluZm8tbWFzdGVyLW1lbnVdIl0NCiAgICBbIlVwZGF0ZSBldmVyeSBub2RlIiB0ZXhpbmZv LWV2ZXJ5LW5vZGUtdXBkYXRlIHRdDQogICAgWyJVcGRhdGUgbm9kZSIJdGV4aW5mby11cGRhdGUt bm9kZQl0XQ0KICAgIFsiTWFrZSBNYXN0ZXIgbWVudSIJdGV4aW5mby1tYXN0ZXItbWVudQl0XQ0K ICAgIFsiTWFrZSBtZW51Igl0ZXhpbmZvLW1ha2UtbWVudQl0XQ0KICAgIFsiVXBkYXRlIGFsbCBt ZW51cyIJdGV4aW5mby1hbGwtbWVudXMtdXBkYXRlIHRdDQogICAgIi0tLS0iDQogICAgWyJTaG93 IHN0cnVjdHVyZSIJdGV4aW5mby1zaG93LXN0cnVjdHVyZQl0XQ0KICAgIFsiRm9ybWF0IHJlZ2lv biIJdGV4aW5mby1mb3JtYXQtcmVnaW9uCXRdDQogICAgWyJGb3JtYXQgYnVmZmVyIgl0ZXhpbmZv LWZvcm1hdC1idWZmZXIJdF0NCiAgICBbIk1ha2VpbmZvIHJlZ2lvbiIJbWFrZWluZm8tcmVnaW9u CQl0XQ0KICAgIFsiTWFrZWluZm8gYnVmZmVyIgltYWtlaW5mby1idWZmZXIJCXRdKSkNCg0KDA0K KGRlZnVuIHRleGluZm8tZmlsdGVyIChzZWN0aW9uIGxpc3QpDQogIChsZXQgKHJlcykNCiAgICAo ZG9saXN0ICh4IGxpc3QpIChpZiAoZXEgc2VjdGlvbiAoY2FkciB4KSkgKHB1c2ggKGNhciB4KSBy ZXMpKSkNCiAgICByZXMpKQ0KDQooZGVmdmFyIHRleGluZm8tY2hhcHRlci1sZXZlbC1yZWdleHAN CiAgKHJlZ2V4cC1vcHQgKHRleGluZm8tZmlsdGVyIDIgdGV4aW5mby1zZWN0aW9uLWxpc3QpKQ0K ICAiUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGp1c3QgdGhlIFRleGluZm8gY2hhcHRlciBs ZXZlbCBoZWFkaW5ncy4iKQ0KDQo7OzsgVGV4aW5mbyBtb2RlDQoNCjs7OyMjI2F1dG9sb2FkDQoo ZGVmaW5lLWRlcml2ZWQtbW9kZSB0ZXhpbmZvLW1vZGUgdGV4dC1tb2RlICJUZXhpbmZvIg0KICAi TWFqb3IgbW9kZSBmb3IgZWRpdGluZyBUZXhpbmZvIGZpbGVzLg0KDQogIEl0IGhhcyB0aGVzZSBl eHRyYSBjb21tYW5kczoNClxce3RleGluZm8tbW9kZS1tYXB9DQoNCiAgVGhlc2UgYXJlIGZpbGVz IHRoYXQgYXJlIHVzZWQgYXMgaW5wdXQgZm9yIFRlWCB0byBtYWtlIHByaW50ZWQgbWFudWFscw0K YW5kIGFsc28gdG8gYmUgdHVybmVkIGludG8gSW5mbyBmaWxlcyB3aXRoIFxcW21ha2VpbmZvLWJ1 ZmZlcl0gb3INCnRoZSBgbWFrZWluZm8nIHByb2dyYW0uICBUaGVzZSBmaWxlcyBtdXN0IGJlIHdy aXR0ZW4gaW4gYSB2ZXJ5IHJlc3RyaWN0ZWQgYW5kDQptb2RpZmllZCB2ZXJzaW9uIG9mIFRlWCBp bnB1dCBmb3JtYXQuDQoNCiAgRWRpdGluZyBjb21tYW5kcyBhcmUgbGlrZSB0ZXh0LW1vZGUgZXhj ZXB0IHRoYXQgdGhlIHN5bnRheCB0YWJsZSBpcw0Kc2V0IHVwIHNvIGV4cHJlc3Npb24gY29tbWFu ZHMgc2tpcCBUZXhpbmZvIGJyYWNrZXQgZ3JvdXBzLiAgVG8gc2VlDQp3aGF0IHRoZSBJbmZvIHZl cnNpb24gb2YgYSByZWdpb24gb2YgdGhlIFRleGluZm8gZmlsZSB3aWxsIGxvb2sgbGlrZSwNCnVz ZSBcXFttYWtlaW5mby1yZWdpb25dLCB3aGljaCBydW5zIGBtYWtlaW5mbycgb24gdGhlIGN1cnJl bnQgcmVnaW9uLg0KDQogIFlvdSBjYW4gc2hvdyB0aGUgc3RydWN0dXJlIG9mIGEgVGV4aW5mbyBm aWxlIHdpdGggXFxbdGV4aW5mby1zaG93LXN0cnVjdHVyZV0uDQpUaGlzIGNvbW1hbmQgc2hvd3Mg dGhlIHN0cnVjdHVyZSBvZiBhIFRleGluZm8gZmlsZSBieSBsaXN0aW5nIHRoZQ0KbGluZXMgd2l0 aCB0aGUgQC1zaWduIGNvbW1hbmRzIGZvciBAY2hhcHRlciwgQHNlY3Rpb24sIGFuZCB0aGUgbGlr ZS4NClRoZXNlIGxpbmVzIGFyZSBkaXNwbGF5ZWQgaW4gYW5vdGhlciB3aW5kb3cgY2FsbGVkIHRo ZSAqT2NjdXIqIHdpbmRvdy4NCkluIHRoYXQgd2luZG93LCB5b3UgY2FuIHBvc2l0aW9uIHRoZSBj dXJzb3Igb3ZlciBvbmUgb2YgdGhlIGxpbmVzIGFuZA0KdXNlIFxcW29jY3VyLW1vZGUtZ290by1v Y2N1cnJlbmNlXSwgdG8ganVtcCB0byB0aGUgY29ycmVzcG9uZGluZyBzcG90DQppbiB0aGUgVGV4 aW5mbyBmaWxlLg0KDQogIEluIGFkZGl0aW9uLCBUZXhpbmZvIG1vZGUgcHJvdmlkZXMgY29tbWFu ZHMgdGhhdCBpbnNlcnQgdmFyaW91cw0KZnJlcXVlbnRseSB1c2VkIEAtc2lnbiBjb21tYW5kcyBp bnRvIHRoZSBidWZmZXIuICBZb3UgY2FuIHVzZSB0aGVzZQ0KY29tbWFuZHMgdG8gc2F2ZSBrZXlz dHJva2VzLiAgQW5kIHlvdSBjYW4gaW5zZXJ0IGJhbGFuY2VkIGJyYWNlcyB3aXRoDQpcXFt0ZXhp bmZvLWluc2VydC1icmFjZXNdIGFuZCBsYXRlciB1c2UgdGhlIGNvbW1hbmQgXFxbdXAtbGlzdF0g dG8NCm1vdmUgZm9yd2FyZCBwYXN0IHRoZSBjbG9zaW5nIGJyYWNlLg0KDQpBbHNvLCBUZXhpbmZv IG1vZGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBhdXRvbWF0aWNhbGx5IGNyZWF0aW5nIG9yDQp1 cGRhdGluZyBtZW51cyBhbmQgbm9kZSBwb2ludGVycy4gIFRoZXNlIGZ1bmN0aW9ucw0KDQogICog aW5zZXJ0IHRoZSBgTmV4dCcsIGBQcmV2aW91cycgYW5kIGBVcCcgcG9pbnRlcnMgb2YgYSBub2Rl LA0KICAqIGluc2VydCBvciB1cGRhdGUgdGhlIG1lbnUgZm9yIGEgc2VjdGlvbiwgYW5kDQogICog Y3JlYXRlIGEgbWFzdGVyIG1lbnUgZm9yIGEgVGV4aW5mbyBzb3VyY2UgZmlsZS4NCg0KSGVyZSBh cmUgdGhlIGZ1bmN0aW9uczoNCg0KICAgIHRleGluZm8tdXBkYXRlLW5vZGUgICAgICAgICAgICAg ICAgXFxbdGV4aW5mby11cGRhdGUtbm9kZV0NCiAgICB0ZXhpbmZvLWV2ZXJ5LW5vZGUtdXBkYXRl ICAgICAgICAgIFxcW3RleGluZm8tZXZlcnktbm9kZS11cGRhdGVdDQogICAgdGV4aW5mby1zZXF1 ZW50aWFsLW5vZGUtdXBkYXRlDQoNCiAgICB0ZXhpbmZvLW1ha2UtbWVudSAgICAgICAgICAgICAg ICAgIFxcW3RleGluZm8tbWFrZS1tZW51XQ0KICAgIHRleGluZm8tYWxsLW1lbnVzLXVwZGF0ZSAg ICAgICAgICAgXFxbdGV4aW5mby1hbGwtbWVudXMtdXBkYXRlXQ0KICAgIHRleGluZm8tbWFzdGVy LW1lbnUNCg0KICAgIHRleGluZm8taW5kZW50LW1lbnUtZGVzY3JpcHRpb24gKGNvbHVtbiAmb3B0 aW9uYWwgcmVnaW9uLXApDQoNClRoZSBgdGV4aW5mby1jb2x1bW4tZm9yLWRlc2NyaXB0aW9uJyB2 YXJpYWJsZSBzcGVjaWZpZXMgdGhlIGNvbHVtbiB0bw0Kd2hpY2ggbWVudSBkZXNjcmlwdGlvbnMg YXJlIGluZGVudGVkLg0KDQpQYXNzZWQgYW4gYXJndW1lbnQgKGEgcHJlZml4IGFyZ3VtZW50LCBp ZiBpbnRlcmFjdGl2ZSksIHRoZQ0KYHRleGluZm8tdXBkYXRlLW5vZGUnIGFuZCBgdGV4aW5mby1t YWtlLW1lbnUnIGZ1bmN0aW9ucyBkbyB0aGVpciBqb2JzDQppbiB0aGUgcmVnaW9uLg0KDQpUbyB1 c2UgdGhlIHVwZGF0aW5nIGNvbW1hbmRzLCB5b3UgbXVzdCBzdHJ1Y3R1cmUgeW91ciBUZXhpbmZv IGZpbGUNCmhpZXJhcmNoaWNhbGx5LCBzdWNoIHRoYXQgZWFjaCBgQG5vZGUnIGxpbmUsIHdpdGgg dGhlIGV4Y2VwdGlvbiBvZiB0aGUNClRvcCBub2RlLCBpcyBhY2NvbXBhbmllZCBieSBzb21lIGtp bmQgb2Ygc2VjdGlvbiBsaW5lLCBzdWNoIGFzIGFuDQpgQGNoYXB0ZXInIG9yIGBAc2VjdGlvbicg bGluZS4NCg0KSWYgdGhlIGZpbGUgaGFzIGEgYHRvcCcgbm9kZSwgaXQgbXVzdCBiZSBjYWxsZWQg YHRvcCcgb3IgYFRvcCcgYW5kDQpiZSB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgZmlsZS4NCg0KRW50 ZXJpbmcgVGV4aW5mbyBtb2RlIGNhbGxzIHRoZSB2YWx1ZSBvZiBgdGV4dC1tb2RlLWhvb2snLCBh bmQgdGhlbiB0aGUNCnZhbHVlIG9mIGB0ZXhpbmZvLW1vZGUtaG9vaycuIg0KICAoc2V0IChtYWtl LWxvY2FsLXZhcmlhYmxlICdwYWdlLWRlbGltaXRlcikNCiAgICAgICAoY29uY2F0DQoJIl5Abm9k ZSBbIFx0XSpbVHRdb3BcXHxeQFxcKCINCgl0ZXhpbmZvLWNoYXB0ZXItbGV2ZWwtcmVnZXhwDQoJ IlxcKVxcPiIpKQ0KICAobWFrZS1sb2NhbC12YXJpYWJsZSAncmVxdWlyZS1maW5hbC1uZXdsaW5l KQ0KICAoc2V0cSByZXF1aXJlLWZpbmFsLW5ld2xpbmUgbW9kZS1yZXF1aXJlLWZpbmFsLW5ld2xp bmUpDQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbmRlbnQtdGFicy1tb2RlKQ0KICAoc2V0cSBp bmRlbnQtdGFicy1tb2RlIG5pbCkNCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1z ZXBhcmF0ZSkNCiAgKHNldHEgcGFyYWdyYXBoLXNlcGFyYXRlDQoJKGNvbmNhdCAiXGJcXHxAW2Et ekEtWl0qWyBcbl1cXHwiIHBhcmFncmFwaC1zZXBhcmF0ZSkpDQogIChtYWtlLWxvY2FsLXZhcmlh YmxlICdwYXJhZ3JhcGgtc3RhcnQpDQogIChzZXRxIHBhcmFncmFwaC1zdGFydCAoY29uY2F0ICJc YlxcfEBbYS16QS1aXSpbIFxuXVxcfCIgcGFyYWdyYXBoLXN0YXJ0KSkNCiAgKG1ha2UtbG9jYWwt dmFyaWFibGUgJ3NlbnRlbmNlLWVuZC1iYXNlKQ0KICAoc2V0cSBzZW50ZW5jZS1lbmQtYmFzZQ0K CSJcXChAXFwoZW5kXFwpP2RvdHN7fVxcfFsuPyFdXFwpW11cIicbJEIhSRskLDFyfRsoQil9XSoi KQ0KICAobWFrZS1sb2NhbC12YXJpYWJsZSAnYWRhcHRpdmUtZmlsbC1tb2RlKQ0KICAoc2V0cSBh ZGFwdGl2ZS1maWxsLW1vZGUgbmlsKQ0KICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZmlsbC1jb2x1 bW4pDQogIChzZXRxIGZpbGwtY29sdW1uIDcwKQ0KICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29t bWVudC1zdGFydCkNCiAgKHNldHEgY29tbWVudC1zdGFydCAiQGMgIikNCiAgKG1ha2UtbG9jYWwt dmFyaWFibGUgJ2NvbW1lbnQtc3RhcnQtc2tpcCkNCiAgKHNldHEgY29tbWVudC1zdGFydC1za2lw ICJAYyArXFx8QGNvbW1lbnQgKyIpDQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd3b3Jkcy1pbmNs dWRlLWVzY2FwZXMpDQogIChzZXRxIHdvcmRzLWluY2x1ZGUtZXNjYXBlcyB0KQ0KICAobWFrZS1s b2NhbC12YXJpYWJsZSAnaW1lbnUtZ2VuZXJpYy1leHByZXNzaW9uKQ0KICAoc2V0cSBpbWVudS1n ZW5lcmljLWV4cHJlc3Npb24gdGV4aW5mby1pbWVudS1nZW5lcmljLWV4cHJlc3Npb24pDQogIChz ZXRxIGltZW51LWNhc2UtZm9sZC1zZWFyY2ggbmlsKQ0KICAobWFrZS1sb2NhbC12YXJpYWJsZSAn Zm9udC1sb2NrLWRlZmF1bHRzKQ0KICAoc2V0cSBmb250LWxvY2stZGVmYXVsdHMNCgknKHRleGlu Zm8tZm9udC1sb2NrLWtleXdvcmRzIG5pbCBuaWwgbmlsIGJhY2t3YXJkLXBhcmFncmFwaA0KCQkJ CSAgICAgKGZvbnQtbG9jay1zeW50YWN0aWMta2V5d29yZHMNCgkJCQkgICAgICAuIHRleGluZm8t Zm9udC1sb2NrLXN5bnRhY3RpYy1rZXl3b3JkcykpKQ0KICAoc2V0IChtYWtlLWxvY2FsLXZhcmlh YmxlICdwYXJzZS1zZXhwLWxvb2t1cC1wcm9wZXJ0aWVzKSB0KQ0KDQogIDs7IE91dGxpbmUgc2V0 dGluZ3MuDQogIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ291dGxpbmUtaGVhZGluZy1hbGlz dCkNCiAgICAgICA7OyBXZSBzaG91bGQgbWVyZ2Ugb3V0bGluZS1oZWFkaW5nLWFsaXN0IGFuZCB0 ZXhpbmZvLXNlY3Rpb24tbGlzdA0KICAgICAgIDs7IGJ1dCBpbiB0aGUgbWVhbiB0aW1lLCBsZXQn cyBqdXN0IGdlbmVyYXRlIG9uZSBmcm9tIHRoZSBvdGhlci4NCiAgICAgICAobWFwY2FyIChsYW1i ZGEgKHgpIChjb25zIChjb25jYXQgIkAiIChjYXIgeCkpIChjYWRyIHgpKSkNCgkgICAgICAgdGV4 aW5mby1zZWN0aW9uLWxpc3QpKQ0KICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdvdXRsaW5l LXJlZ2V4cCkNCiAgICAgICAoY29uY2F0IChyZWdleHAtb3B0IChtYXBjYXIgJ2NhciBvdXRsaW5l LWhlYWRpbmctYWxpc3QpIHQpDQoJICAgICAgICJcXD4iKSkNCg0KICAobWFrZS1sb2NhbC12YXJp YWJsZSAndGV4LXN0YXJ0LW9mLWhlYWRlcikNCiAgKHNldHEgdGV4LXN0YXJ0LW9mLWhlYWRlciAi JVxcKlxcKnN0YXJ0IikNCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3RleC1lbmQtb2YtaGVhZGVy KQ0KICAoc2V0cSB0ZXgtZW5kLW9mLWhlYWRlciAiJVxcKlxcKmVuZCIpDQogIChtYWtlLWxvY2Fs LXZhcmlhYmxlICd0ZXgtZmlyc3QtbGluZS1oZWFkZXItcmVnZXhwKQ0KICAoc2V0cSB0ZXgtZmly c3QtbGluZS1oZWFkZXItcmVnZXhwICJeXFxcXGlucHV0IikNCiAgKG1ha2UtbG9jYWwtdmFyaWFi bGUgJ3RleC10cmFpbGVyKQ0KICAoc2V0cSB0ZXgtdHJhaWxlciAiQGJ5ZVxuIikNCg0KICA7OyBQ cmV2ZW50IGZpbGxpbmcgY2VydGFpbiBsaW5lcywgaW4gYWRkaXRpb24gdG8gb25lcyBzcGVjaWZp ZWQNCiAgOzsgYnkgdGhlIHVzZXIuDQogIChsZXQgKChwcmV2ZW50LWZpbGxpbmcgIl5AXFwoZGVm XFx8bXVsdGl0YWJsZVxcKSIpKQ0KICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2F1dG8t ZmlsbC1pbmhpYml0LXJlZ2V4cCkNCgkgKGlmIChudWxsIGF1dG8tZmlsbC1pbmhpYml0LXJlZ2V4 cCkNCgkgICAgIHByZXZlbnQtZmlsbGluZw0KCSAgIChjb25jYXQgYXV0by1maWxsLWluaGliaXQt cmVnZXhwICJcXHwiIHByZXZlbnQtZmlsbGluZykpKSkpDQoNCg0KDA0KOzs7IEluc2VydCBzdHJp bmcgY29tbWFuZHMNCg0KKGRlZnZhciB0ZXhpbmZvLWJsb2NrLWRlZmF1bHQgImV4YW1wbGUiKQ0K DQooZGVmaW5lLXNrZWxldG9uIHRleGluZm8taW5zZXJ0LWJsb2NrDQogICJDcmVhdGUgYSBtYXRj aGluZyBwYWlyIEA8Y21kPiAuLiBAZW5kIDxjbWQ+IGF0IHBvaW50Lg0KUHV0cyBwb2ludCBvbiBh IGJsYW5rIGxpbmUgYmV0d2VlbiB0aGVtLiINCiAgKHNldHEgdGV4aW5mby1ibG9jay1kZWZhdWx0 DQoJKGNvbXBsZXRpbmctcmVhZCAoZm9ybWF0ICJCbG9jayBuYW1lIFslc106ICIgdGV4aW5mby1i bG9jay1kZWZhdWx0KQ0KCQkJIHRleGluZm8tZW52aXJvbm1lbnRzDQoJCQkgbmlsIG5pbCBuaWwg bmlsIHRleGluZm8tYmxvY2stZGVmYXVsdCkpDQogIFxuICJAIiBzdHIgXG4gXyBcbiAiQGVuZCAi IHN0ciBcbikNCg0KKGRlZnVuIHRleGluZm8taW5zaWRlLW1hY3JvLXAgKG1hY3JvICZvcHRpb25h bCBib3VuZCkNCiAgIk5vbi1uaWwgaWYgaW5zaWRlIGEgbWFjcm8gbWF0Y2hpbmcgdGhlIHJlZ2V4 cCBNQUNSTy4iDQogIChjb25kaXRpb24tY2FzZSBuaWwNCiAgICAgIChzYXZlLWV4Y3Vyc2lvbg0K CShzYXZlLXJlc3RyaWN0aW9uDQoJICAobmFycm93LXRvLXJlZ2lvbiBib3VuZCAocG9pbnQpKQ0K CSAgKHdoaWxlIChwcm9nbg0KCQkgICAodXAtbGlzdCAtMSkNCgkJICAgKG5vdCAoY29uZGl0aW9u LWNhc2UgbmlsDQoJCQkgICAgKHNhdmUtZXhjdXJzaW9uDQoJCQkgICAgICAoYmFja3dhcmQtc2V4 cCAxKQ0KCQkJICAgICAgKGxvb2tpbmctYXQgbWFjcm8pKQ0KCQkJICAoc2Nhbi1lcnJvciBuaWwp KSkpKQ0KCSAgdCkpDQogICAgKHNjYW4tZXJyb3IgbmlsKSkpDQoNCihkZWZ1biB0ZXhpbmZvLWlu c2lkZS1lbnYtcCAoZW52ICZvcHRpb25hbCBib3VuZCkNCiAgIk5vbi1uaWwgaWYgaW5zaWRlIGFu IGVudmlyb25tZW50IG1hdGNoaW5nIHRoZSByZWdleHAgQEVOVi4iDQogIChzYXZlLWV4Y3Vyc2lv bg0KICAgIChhbmQgKHJlLXNlYXJjaC1iYWNrd2FyZCAoY29uY2F0ICJAXFwoZW5kXFxzICtcXCk/ IiBlbnYpIGJvdW5kIHQpDQoJIChub3QgKG1hdGNoLWVuZCAxKSkpKSkNCg0KKGRlZnZhciB0ZXhp bmZvLWVuYWJsZS1xdW90ZS1tYWNyb3MgIkBcXChjb2RlXFx8c2FtcFxcfGtiZFxcKVxcPiIpDQoo ZGVmdmFyIHRleGluZm8tZW5hYmxlLXF1b3RlLWVudnMgJygiZXhhbXBsZVxcPiIgImxpc3BcXD4i KSkNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1xdW90ZSAoJm9wdGlvbmFsIGFyZykNCiAgIkluc2Vy dCB0aGUgYXBwcm9wcmlhdGUgcXVvdGUgbWFyayBmb3IgVGV4aW5mby4NClVzdWFsbHkgaW5zZXJ0 cyB0aGUgdmFsdWUgb2YgYHRleGluZm8tb3Blbi1xdW90ZScgKG5vcm1hbGx5IGBgKSBvcg0KYHRl eGluZm8tY2xvc2UtcXVvdGUnIChub3JtYWxseSAnJyksIGRlcGVuZGluZyBvbiB0aGUgY29udGV4 dC4NCldpdGggcHJlZml4IGFyZ3VtZW50IG9yIGluc2lkZSBAY29kZSBvciBAZXhhbXBsZSwgaW5z ZXJ0cyBhIHBsYWluIFwiLiINCiAgKGludGVyYWN0aXZlICIqUCIpDQogIChsZXQgKCh0b3AgKG9y IChzYXZlLWV4Y3Vyc2lvbiAocmUtc2VhcmNoLWJhY2t3YXJkICJAbm9kZVxcPiIgbmlsIHQpKQ0K CQkgKHBvaW50LW1pbikpKSkNCiAgICAoaWYgKG9yIGFyZw0KCSAgICAoPSAocHJlY2VkaW5nLWNo YXIpID9cXCkNCgkgICAgKHNhdmUtZXhjdXJzaW9uDQogICAgICAgICAgICAgIDs7IE1pZ2h0IGJl IG5lYXIgdGhlIHN0YXJ0IG9mIGEgKG5hcnJvd2VkKSBidWZmZXIuDQogICAgICAgICAgICAgIChp Z25vcmUtZXJyb3JzIChiYWNrd2FyZC1jaGFyIChsZW5ndGggdGV4aW5mby1vcGVuLXF1b3RlKSkp DQoJICAgICAgKHdoZW4gKG9yIChsb29raW5nLWF0IHRleGluZm8tb3Blbi1xdW90ZSkNCgkJCShs b29raW5nLWF0IHRleGluZm8tY2xvc2UtcXVvdGUpKQ0KCQkoZGVsZXRlLWNoYXIgKGxlbmd0aCB0 ZXhpbmZvLW9wZW4tcXVvdGUpKQ0KCQl0KSkNCgkgICAgKHRleGluZm8taW5zaWRlLW1hY3JvLXAg dGV4aW5mby1lbmFibGUtcXVvdGUtbWFjcm9zIHRvcCkNCgkgICAgKGxldCAoKGluLWVudiBuaWwp KQ0KCSAgICAgIChkb2xpc3QgKGVudiB0ZXhpbmZvLWVuYWJsZS1xdW90ZS1lbnZzIGluLWVudikN CgkJKGlmICh0ZXhpbmZvLWluc2lkZS1lbnYtcCBlbnYgdG9wKQ0KCQkgICAgKHNldHEgaW4tZW52 IHQpKSkpKQ0KCShzZWxmLWluc2VydC1jb21tYW5kIChwcmVmaXgtbnVtZXJpYy12YWx1ZSBhcmcp KQ0KICAgICAgKGluc2VydA0KICAgICAgIChpZiAob3IgKGJvYnApDQogICAgICAgICAgICAgICAo bWVtcSAoY2hhci1zeW50YXggKHByZWNlZGluZy1jaGFyKSkgJyg/XCggPz4gP1xzKSkpDQoJICAg dGV4aW5mby1vcGVuLXF1b3RlDQoJIHRleGluZm8tY2xvc2UtcXVvdGUpKSkpKQ0KDQo7OyBUaGUg Zm9sbG93aW5nIHRleGluZm8taW5zZXJ0LUBlbmQgY29tbWFuZCBub3Qgb25seSBpbnNlcnRzIGEg U1BDDQo7OyBhZnRlciB0aGUgQGVuZCwgYnV0IHRyaWVzIHRvIGZpbmQgb3V0IHdoYXQgYmVsb25n cyB0aGVyZS4gIEl0IGlzDQo7OyBub3QgdmVyeSBzbWFydDogaXQgZG9lcyBub3QgdW5kZXJzdGFu ZCBuZXN0ZWQgbGlzdHMuDQoNCihkZWZ1biB0ZXhpbmZvLWxhc3QtdW5lbmRlZC1iZWdpbiAoKQ0K ICAod2hpbGUgKGFuZCAocmUtc2VhcmNoLWJhY2t3YXJkIHRleGluZm8tZW52aXJvbm1lbnQtcmVn ZXhwKQ0KCSAgICAgIChsb29raW5nLWF0ICJAZW5kIikpDQogICAgKHRleGluZm8tbGFzdC11bmVu ZGVkLWJlZ2luKSkpDQoNCihkZWZ1biB0ZXhpbmZvLW5leHQtdW5tYXRjaGVkLWVuZCAoKQ0KICAo d2hpbGUgKGFuZCAocmUtc2VhcmNoLWZvcndhcmQgdGV4aW5mby1lbnZpcm9ubWVudC1yZWdleHAp DQoJICAgICAgKHNhdmUtZXhjdXJzaW9uDQoJCShnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAw KSkNCgkJKG5vdCAobG9va2luZy1hdCAiQGVuZCIpKSkpDQogICAgKHRleGluZm8tbmV4dC11bm1h dGNoZWQtZW5kKSkpDQoNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1AZW5kICgpDQogICJJbnNlcnQg dGhlIG1hdGNoaW5nIGBAZW5kJyBmb3IgdGhlIGxhc3QgVGV4aW5mbyBjb21tYW5kIHRoYXQgbmVl ZHMgb25lLiINCiAgKGludGVyYWN0aXZlKQ0KICAobGV0ICgoc3RyaW5nDQoJIChpZ25vcmUtZXJy b3JzDQoJICAgKHNhdmUtZXhjdXJzaW9uDQoJICAgICAodGV4aW5mby1sYXN0LXVuZW5kZWQtYmVn aW4pDQoJICAgICAobWF0Y2gtc3RyaW5nIDEpKSkpKQ0KICAgIChpbnNlcnQgIkBlbmQgIikNCiAg ICAoaWYgc3RyaW5nIChpbnNlcnQgc3RyaW5nICJcbiIpKSkpDQoNCjs7IFRoZSBmb2xsb3dpbmcg aW5zZXJ0IGNvbW1hbmRzIGFjY2VwdCBhIHByZWZpeCBhcmcgTiwgd2hpY2ggaXMgdGhlDQo7OyBu dW1iZXIgb2Ygd29yZHMgKGFjdHVhbGx5IHMtZXhwcnMpIHRoYXQgc2hvdWxkIGJlIHN1cnJvdW5k ZWQgYnkNCjs7IGJyYWNlcy4gIFRodXMgeW91IGNhbiBmaXJzdCBwYXN0ZSBhIHZhcmlhYmxlIG5h bWUgaW50byBhIC50ZXhpbmZvDQo7OyBidWZmZXIsIHRoZW4gc2F5IEMtdSAxIEMtYyBDLWMgdiBh dCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBqdXN0DQo7OyBwYXN0ZWQgdmFyaWFibGUgbmFtZSB0byBw dXQgQHZhcnsuLi59ICphcm91bmQqIHRoZSB2YXJpYWJsZSBuYW1lLg0KOzsgT3BlcmF0ZSBvbiBw cmV2aW91cyB3b3JkIG9yIHdvcmRzIHdpdGggbmVnYXRpdmUgYXJnLg0KDQo7OyBUaGVzZSBjb21t YW5kcyB1c2UgdGV4aW5mby1pbnNlcnQtQC13aXRoLWFyZw0KKGRlZnVuIHRleGluZm8taW5zZXJ0 LUAtd2l0aC1hcmcgKHN0cmluZyAmb3B0aW9uYWwgYXJnKQ0KICAoaWYgYXJnDQogICAgICAocHJv Z24NCiAgICAgICAgKHNldHEgYXJnIChwcmVmaXgtbnVtZXJpYy12YWx1ZSBhcmcpKQ0KICAgICAg ICAoaWYgKDwgYXJnIDApDQogICAgICAgICAgICAocHJvZ24NCiAgICAgICAgICAgICAgKHNraXAt Y2hhcnMtYmFja3dhcmQgIiBcdFxuXHJcZiIpDQogICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lv bg0KICAgICAgICAgICAgICAgIChmb3J3YXJkLXNleHAgYXJnKQ0KICAgICAgICAgICAgICAgIChp bnNlcnQgIkAiIHN0cmluZyAieyIpKQ0KICAgICAgICAgICAgICAoaW5zZXJ0ICJ9IikpDQogICAg ICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0XG5cclxmIikNCiAgICAgICAgICAoaW5zZXJ0 ICJAIiBzdHJpbmcgInsiKQ0KICAgICAgICAgIChmb3J3YXJkLXNleHAgYXJnKQ0KICAgICAgICAg IChpbnNlcnQgIn0iKSkpDQogICAgKGluc2VydCAiQCIgc3RyaW5nICJ7fSIpDQogICAgKGJhY2t3 YXJkLWNoYXIpKSkNCg0KKGRlZnVuIHRleGluZm8taW5zZXJ0LWJyYWNlcyAoKQ0KICAiTWFrZSBh IHBhaXIgb2YgYnJhY2VzIGFuZCBiZSBwb2lzZWQgdG8gdHlwZSBpbnNpZGUgb2YgdGhlbS4NClVz ZSBcXFt1cC1saXN0XSB0byBtb3ZlIGZvcndhcmQgb3V0IG9mIHRoZSBicmFjZXMuIg0KICAoaW50 ZXJhY3RpdmUpDQogIChpbnNlcnQgInt9IikNCiAgKGJhY2t3YXJkLWNoYXIpKQ0KDQooZGVmdW4g dGV4aW5mby1pbnNlcnQtQGNvZGUgKCZvcHRpb25hbCBhcmcpDQogICJJbnNlcnQgYSBgQGNvZGV7 Li4ufScgY29tbWFuZCBpbiBhIFRleGluZm8gYnVmZmVyLg0KQSBudW1lcmljIGFyZ3VtZW50IHNh eXMgaG93IG1hbnkgd29yZHMgdGhlIGJyYWNlcyBzaG91bGQgc3Vycm91bmQuDQpUaGUgZGVmYXVs dCBpcyBub3QgdG8gc3Vycm91bmQgYW55IGV4aXN0aW5nIHdvcmRzIHdpdGggdGhlIGJyYWNlcy4i DQogIChpbnRlcmFjdGl2ZSAiUCIpDQogICh0ZXhpbmZvLWluc2VydC1ALXdpdGgtYXJnICJjb2Rl IiBhcmcpKQ0KDQooZGVmdW4gdGV4aW5mby1pbnNlcnQtQGRmbiAoJm9wdGlvbmFsIGFyZykNCiAg Ikluc2VydCBhIGBAZGZuey4uLn0nIGNvbW1hbmQgaW4gYSBUZXhpbmZvIGJ1ZmZlci4NCkEgbnVt ZXJpYyBhcmd1bWVudCBzYXlzIGhvdyBtYW55IHdvcmRzIHRoZSBicmFjZXMgc2hvdWxkIHN1cnJv dW5kLg0KVGhlIGRlZmF1bHQgaXMgbm90IHRvIHN1cnJvdW5kIGFueSBleGlzdGluZyB3b3JkcyB3 aXRoIHRoZSBicmFjZXMuIg0KICAoaW50ZXJhY3RpdmUgIlAiKQ0KICAodGV4aW5mby1pbnNlcnQt QC13aXRoLWFyZyAiZGZuIiBhcmcpKQ0KDQooZGVmdW4gdGV4aW5mby1pbnNlcnQtQGVtYWlsICgm b3B0aW9uYWwgYXJnKQ0KICAiSW5zZXJ0IGEgYEBlbWFpbHsuLi59JyBjb21tYW5kIGluIGEgVGV4 aW5mbyBidWZmZXIuDQpBIG51bWVyaWMgYXJndW1lbnQgc2F5cyBob3cgbWFueSB3b3JkcyB0aGUg YnJhY2VzIHNob3VsZCBzdXJyb3VuZC4NClRoZSBkZWZhdWx0IGlzIG5vdCB0byBzdXJyb3VuZCBh bnkgZXhpc3Rpbmcgd29yZHMgd2l0aCB0aGUgYnJhY2VzLiINCiAgKGludGVyYWN0aXZlICJQIikN CiAgKHRleGluZm8taW5zZXJ0LUAtd2l0aC1hcmcgImVtYWlsIiBhcmcpKQ0KDQooZGVmdW4gdGV4 aW5mby1pbnNlcnQtQGVtcGggKCZvcHRpb25hbCBhcmcpDQogICJJbnNlcnQgYSBgQGVtcGh7Li4u fScgY29tbWFuZCBpbiBhIFRleGluZm8gYnVmZmVyLg0KQSBudW1lcmljIGFyZ3VtZW50IHNheXMg aG93IG1hbnkgd29yZHMgdGhlIGJyYWNlcyBzaG91bGQgc3Vycm91bmQuDQpUaGUgZGVmYXVsdCBp cyBub3QgdG8gc3Vycm91bmQgYW55IGV4aXN0aW5nIHdvcmRzIHdpdGggdGhlIGJyYWNlcy4iDQog IChpbnRlcmFjdGl2ZSAiUCIpDQogICh0ZXhpbmZvLWluc2VydC1ALXdpdGgtYXJnICJlbXBoIiBh cmcpKQ0KDQooZGVmdW4gdGV4aW5mby1pbnNlcnQtQGV4YW1wbGUgKCkNCiAgIkluc2VydCB0aGUg c3RyaW5nIGBAZXhhbXBsZScgaW4gYSBUZXhpbmZvIGJ1ZmZlci4iDQogIChpbnRlcmFjdGl2ZSkN CiAgKGluc2VydCAiQGV4YW1wbGVcbiIpKQ0KDQooZGVmdW4gdGV4aW5mby1pbnNlcnQtQGZpbGUg KCZvcHRpb25hbCBhcmcpDQogICJJbnNlcnQgYSBgQGZpbGV7Li4ufScgY29tbWFuZCBpbiBhIFRl eGluZm8gYnVmZmVyLg0KQSBudW1lcmljIGFyZ3VtZW50IHNheXMgaG93IG1hbnkgd29yZHMgdGhl IGJyYWNlcyBzaG91bGQgc3Vycm91bmQuDQpUaGUgZGVmYXVsdCBpcyBub3QgdG8gc3Vycm91bmQg YW55IGV4aXN0aW5nIHdvcmRzIHdpdGggdGhlIGJyYWNlcy4iDQogIChpbnRlcmFjdGl2ZSAiUCIp DQogICh0ZXhpbmZvLWluc2VydC1ALXdpdGgtYXJnICJmaWxlIiBhcmcpKQ0KDQooZGVmdW4gdGV4 aW5mby1pbnNlcnQtQGl0ZW0gKCkNCiAgIkluc2VydCB0aGUgc3RyaW5nIGBAaXRlbScgaW4gYSBU ZXhpbmZvIGJ1ZmZlci4NCklmIGluIGEgdGFibGUgZGVmaW5lZCBieSBAdGFibGUsIGZvbGxvdyBz YWlkIHN0cmluZyB3aXRoIGEgc3BhY2UuDQpPdGhlcndpc2UsIGZvbGxvdyB3aXRoIGEgbmV3bGlu ZS4iDQogIChpbnRlcmFjdGl2ZSkNCiAgKGluc2VydCAiQGl0ZW0iDQoJICAoaWYgKGVxdWFsIChp Z25vcmUtZXJyb3JzDQoJCSAgICAgIChzYXZlLWV4Y3Vyc2lvbg0KCQkJKHRleGluZm8tbGFzdC11 bmVuZGVkLWJlZ2luKQ0KCQkJKG1hdGNoLXN0cmluZyAxKSkpDQoJCSAgICAgInRhYmxlIikNCgkg ICAgICA/XHMNCgkgICAgP1xuKSkpDQoNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1Aa2JkICgmb3B0 aW9uYWwgYXJnKQ0KICAiSW5zZXJ0IGEgYEBrYmR7Li4ufScgY29tbWFuZCBpbiBhIFRleGluZm8g YnVmZmVyLg0KQSBudW1lcmljIGFyZ3VtZW50IHNheXMgaG93IG1hbnkgd29yZHMgdGhlIGJyYWNl cyBzaG91bGQgc3Vycm91bmQuDQpUaGUgZGVmYXVsdCBpcyBub3QgdG8gc3Vycm91bmQgYW55IGV4 aXN0aW5nIHdvcmRzIHdpdGggdGhlIGJyYWNlcy4iDQogIChpbnRlcmFjdGl2ZSAiUCIpDQogICh0 ZXhpbmZvLWluc2VydC1ALXdpdGgtYXJnICJrYmQiIGFyZykpDQoNCihkZWZ1biB0ZXhpbmZvLWlu c2VydC1Abm9kZSAoKQ0KICAiSW5zZXJ0IHRoZSBzdHJpbmcgYEBub2RlJyBpbiBhIFRleGluZm8g YnVmZmVyLg0KSW5zZXJ0IGEgY29tbWVudCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaW5kaWNhdGlu ZyB0aGUgb3JkZXIgb2YNCmFyZ3VtZW50cyB0byBAbm9kZS4gIEluc2VydCBhIGNhcnJpYWdlIHJl dHVybiBhZnRlciB0aGUgY29tbWVudCBsaW5lLg0KTGVhdmUgcG9pbnQgYWZ0ZXIgYEBub2RlJy4i DQogIChpbnRlcmFjdGl2ZSkNCiAgKGluc2VydCAiQG5vZGUgXG5AY29tbWVudCAgbm9kZS1uYW1l LCAgbmV4dCwgIHByZXZpb3VzLCAgdXBcbiIpDQogIChmb3J3YXJkLWxpbmUgLTIpDQogIChmb3J3 YXJkLWNoYXIgNikpDQoNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1Abm9pbmRlbnQgKCkNCiAgIklu c2VydCB0aGUgc3RyaW5nIGBAbm9pbmRlbnQnIGluIGEgVGV4aW5mbyBidWZmZXIuIg0KICAoaW50 ZXJhY3RpdmUpDQogIChpbnNlcnQgIkBub2luZGVudFxuIikpDQoNCihkZWZ1biB0ZXhpbmZvLWlu c2VydC1AcXVvdGF0aW9uICgpDQogICJJbnNlcnQgdGhlIHN0cmluZyBgQHF1b3RhdGlvbicgaW4g YSBUZXhpbmZvIGJ1ZmZlci4iDQogIChpbnRlcmFjdGl2ZSkNCiAgKGluc2VydCAiQHF1b3RhdGlv blxuIikpDQoNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1Ac2FtcCAoJm9wdGlvbmFsIGFyZykNCiAg Ikluc2VydCBhIGBAc2FtcHsuLi59JyBjb21tYW5kIGluIGEgVGV4aW5mbyBidWZmZXIuDQpBIG51 bWVyaWMgYXJndW1lbnQgc2F5cyBob3cgbWFueSB3b3JkcyB0aGUgYnJhY2VzIHNob3VsZCBzdXJy b3VuZC4NClRoZSBkZWZhdWx0IGlzIG5vdCB0byBzdXJyb3VuZCBhbnkgZXhpc3Rpbmcgd29yZHMg d2l0aCB0aGUgYnJhY2VzLiINCiAgKGludGVyYWN0aXZlICJQIikNCiAgKHRleGluZm8taW5zZXJ0 LUAtd2l0aC1hcmcgInNhbXAiIGFyZykpDQoNCihkZWZ1biB0ZXhpbmZvLWluc2VydC1Ac3Ryb25n ICgmb3B0aW9uYWwgYXJnKQ0KICAiSW5zZXJ0IGEgYEBzdHJvbmd7Li4ufScgY29tbWFuZCBpbiBh IFRleGluZm8gYnVmZmVyLg0KQSBudW1lcmljIGFyZ3VtZW50IHNheXMgaG93IG1hbnkgd29yZHMg dGhlIGJyYWNlcyBzaG91bGQgc3Vycm91bmQuDQpUaGUgZGVmYXVsdCBpcyBub3QgdG8gc3Vycm91 bmQgYW55IGV4aXN0aW5nIHdvcmRzIHdpdGggdGhlIGJyYWNlcy4iDQogIChpbnRlcmFjdGl2ZSAi UCIpDQogICh0ZXhpbmZvLWluc2VydC1ALXdpdGgtYXJnICJzdHJvbmciIGFyZykpDQoNCihkZWZ1 biB0ZXhpbmZvLWluc2VydC1AdGFibGUgKCkNCiAgIkluc2VydCB0aGUgc3RyaW5nIGBAdGFibGUn IGluIGEgVGV4aW5mbyBidWZmZXIuIg0KICAoaW50ZXJhY3RpdmUpDQogIChpbnNlcnQgIkB0YWJs ZSAiKSkNCg0KKGRlZnVuIHRleGluZm8taW5zZXJ0LUB2YXIgKCZvcHRpb25hbCBhcmcpDQogICJJ bnNlcnQgYSBgQHZhcnt9JyBjb21tYW5kIGluIGEgVGV4aW5mbyBidWZmZXIuDQpBIG51bWVyaWMg YXJndW1lbnQgc2F5cyBob3cgbWFueSB3b3JkcyB0aGUgYnJhY2VzIHNob3VsZCBzdXJyb3VuZC4N ClRoZSBkZWZhdWx0IGlzIG5vdCB0byBzdXJyb3VuZCBhbnkgZXhpc3Rpbmcgd29yZHMgd2l0aCB0 aGUgYnJhY2VzLiINCiAgKGludGVyYWN0aXZlICJQIikNCiAgKHRleGluZm8taW5zZXJ0LUAtd2l0 aC1hcmcgInZhciIgYXJnKSkNCg0KKGRlZnVuIHRleGluZm8taW5zZXJ0LUB1cmVmICgmb3B0aW9u YWwgYXJnKQ0KICAiSW5zZXJ0IGEgYEB1cmVme30nIGNvbW1hbmQgaW4gYSBUZXhpbmZvIGJ1ZmZl ci4NCkEgbnVtZXJpYyBhcmd1bWVudCBzYXlzIGhvdyBtYW55IHdvcmRzIHRoZSBicmFjZXMgc2hv dWxkIHN1cnJvdW5kLg0KVGhlIGRlZmF1bHQgaXMgbm90IHRvIHN1cnJvdW5kIGFueSBleGlzdGlu ZyB3b3JkcyB3aXRoIHRoZSBicmFjZXMuIg0KICAoaW50ZXJhY3RpdmUgIlAiKQ0KICAodGV4aW5m by1pbnNlcnQtQC13aXRoLWFyZyAidXJlZiIgYXJnKSkNCihkZWZhbGlhcyAndGV4aW5mby1pbnNl cnQtQHVybCAndGV4aW5mby1pbnNlcnQtQHVyZWYpDQoMDQo7OzsgVGV4aW5mbyBmaWxlIHN0cnVj dHVyZQ0KDQooZGVmdW4gdGV4aW5mby1zaG93LXN0cnVjdHVyZSAoJm9wdGlvbmFsIG5vZGVzLXRv bykNCiAgIlNob3cgdGhlIHN0cnVjdHVyZSBvZiBhIFRleGluZm8gZmlsZS4NCkxpc3QgdGhlIGxp bmVzIGluIHRoZSBmaWxlIHRoYXQgYmVnaW4gd2l0aCB0aGUgQC1zaWduIGNvbW1hbmRzIGZvcg0K QGNoYXB0ZXIsIEBzZWN0aW9uLCBhbmQgdGhlIGxpa2UuDQoNCldpdGggb3B0aW9uYWwgYXJndW1l bnQgKHByZWZpeCBpZiBpbnRlcmFjdGl2ZSksIGxpc3QgYm90aCB0aGUgbGluZXMNCndpdGggQC1z aWduIGNvbW1hbmRzIGZvciBAY2hhcHRlciwgQHNlY3Rpb24sIGFuZCB0aGUgbGlrZSwgYW5kIGxp c3QNCkBub2RlIGxpbmVzLg0KDQpMaW5lcyB3aXRoIHN0cnVjdHVyaW5nIGNvbW1hbmRzIGJlZ2lu bmluZyBpbiB0aGVtIGFyZSBkaXNwbGF5ZWQgaW4NCmFub3RoZXIgYnVmZmVyIG5hbWVkIGAqT2Nj dXIqJy4gIEluIHRoYXQgYnVmZmVyLCB5b3UgY2FuIG1vdmUgcG9pbnQgdG8NCm9uZSBvZiB0aG9z ZSBsaW5lcyBhbmQgdGhlbiB1c2UNClxcPG9jY3VyLW1vZGUtbWFwPlxcW29jY3VyLW1vZGUtZ290 by1vY2N1cnJlbmNlXSwNCnRvIGp1bXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3BvdCBpbiB0aGUg VGV4aW5mbyBzb3VyY2UgZmlsZS4iDQoNCiAgKGludGVyYWN0aXZlICJQIikNCiAgOzsgRmlyc3Qs IHJlbWVtYmVyIGN1cnJlbnQgbG9jYXRpb24NCiAgKGxldCAoY3VycmVudC1sb2NhdGlvbikNCiAg ICAoc2F2ZS1leGN1cnNpb24NCiAgICAgIChlbmQtb2YtbGluZSkgICAgICAgICAgICA7IHNvIGFz IHRvIGZpbmQgc2VjdGlvbiBvbiBjdXJyZW50IGxpbmUNCiAgICAgIChpZiAocmUtc2VhcmNoLWJh Y2t3YXJkDQogICAgICAgICAgIDs7IGRvIG5vdCByZXF1aXJlIGB0ZXhpbmZvLXNlY3Rpb24tdHlw ZXMtcmVnZXhwJyBpbiB0ZXhuZm8tdXBkLmVsDQogICAgICAgICAgICJeQFxcKGNoYXB0ZXIgXFx8 c2VjdFxcfHN1YnNcXHxzdWJoXFx8dW5udW1cXHxtYWpvclxcfGNoYXBoZWFkaW5nIFxcfGhlYWRp bmcgXFx8YXBwZW5kaXhcXCkiDQogICAgICAgICAgIG5pbCB0KQ0KICAgICAgICAgIChzZXRxIGN1 cnJlbnQtbG9jYXRpb24NCiAgICAgICAgICAgICAgICAocHJvZ24NCiAgICAgICAgICAgICAgICAg IChiZWdpbm5pbmctb2YtbGluZSkNCiAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5n IChwb2ludCkgKHByb2duIChlbmQtb2YtbGluZSkgKHBvaW50KSkpKSkNCiAgICAgICAgOzsgZWxz ZSBwb2ludCBpcyBsb2NhdGVkIGJlZm9yZSBhbnkgc2VjdGlvbiBjb21tYW5kLg0KICAgICAgICAo c2V0cSBjdXJyZW50LWxvY2F0aW9uICJ0ZXgiKSkpDQogICAgOzsgU2Vjb25kLCBjcmVhdGUgYW5k IGZvcm1hdCBhbiAqT2NjdXIqIGJ1ZmZlcg0KICAgIChzYXZlLWV4Y3Vyc2lvbg0KICAgICAgKGdv dG8tY2hhciAocG9pbnQtbWluKSkNCiAgICAgIChvY2N1ciAoY29uY2F0ICJeXFwoPzoiIChpZiBu b2Rlcy10b28gIkBub2RlXFw+XFx8IikNCgkJICAgICBvdXRsaW5lLXJlZ2V4cCAiXFwpIikpKQ0K ICAgIChwb3AtdG8tYnVmZmVyICIqT2NjdXIqIikNCiAgICAoZ290by1jaGFyIChwb2ludC1taW4p KQ0KICAgIChsZXQgKChpbmhpYml0LXJlYWQtb25seSB0KSkNCiAgICAgIChmbHVzaC1saW5lcyAi LS0tLS0iKQ0KICAgICAgOzsgTm93IGZvcm1hdCB0aGUgIipPY2N1cioiIGJ1ZmZlciB0byBzaG93 IHRoZSBzdHJ1Y3R1cmUuDQogICAgICA7OyBUaGFua3MgdG8gY2VkZXJAc2lnbnVtLnNlIChQZXIg Q2VkZXJxdmlzdCkNCiAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpDQogICAgICAobGV0IChs ZXZlbCkNCiAgICAgICAgKHdoaWxlIChyZS1zZWFyY2gtYmFja3dhcmQgIl4gKlswLTldKjpAXFwo XFxzdytcXCkiIG5pbCAwKQ0KICAgICAgICAgIChnb3RvLWNoYXIgKDEtIChtYXRjaC1iZWdpbm5p bmcgMSkpKQ0KICAgICAgICAgIChzZXRxIGxldmVsDQogICAgICAgICAgICAgICAgKG9yIChjYWRy IChhc3NvYyAobWF0Y2gtc3RyaW5nIDEpIHRleGluZm8tc2VjdGlvbi1saXN0KSkgMikpDQogICAg ICAgICAgKGluZGVudC10by1jb2x1bW4gKCsgKGN1cnJlbnQtY29sdW1uKSAoKiA0ICgtIGxldmVs IDIpKSkpDQogICAgICAgICAgKGJlZ2lubmluZy1vZi1saW5lKSkpKQ0KICAgIDs7IFRoaXJkLCBn byB0byBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gbG9jYXRpb24gaW4gc291cmNlIGZpbGUNCiAgICA7 OyBwb3RlbnRpYWwgYnVnOiB0d28gZXhhY3RseSBzaW1pbGFyIGBjdXJyZW50LWxvY2F0aW9uJyBs aW5lcyAuLi4NCiAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQ0KICAgIChyZS1zZWFyY2gtZm9y d2FyZCBjdXJyZW50LWxvY2F0aW9uIG5pbCB0KQ0KICAgIChiZWdpbm5pbmctb2YtbGluZSkNCiAg ICApKQ0KDQoMDQo7OzsgVGhlICB0ZXggIGFuZCAgcHJpbnQgIGZ1bmN0aW9uIGRlZmluaXRpb25z Og0KDQooZGVmY3VzdG9tIHRleGluZm8tdGV4aTJkdmktY29tbWFuZCAidGV4aTJkdmkiDQogICJD b21tYW5kIHVzZWQgYnkgYHRleGluZm8tdGV4LWJ1ZmZlcicgdG8gcnVuIFRlWCBhbmQgdGV4aW5k ZXggb24gYSBidWZmZXIuIg0KICA6dHlwZSAnc3RyaW5nDQogIDpncm91cCAndGV4aW5mbykNCg0K KGRlZmN1c3RvbSB0ZXhpbmZvLXRleC1jb21tYW5kICJ0ZXgiDQogICJDb21tYW5kIHVzZWQgYnkg YHRleGluZm8tdGV4LXJlZ2lvbicgdG8gcnVuIFRlWCBvbiBhIHJlZ2lvbi4iDQogIDp0eXBlICdz dHJpbmcNCiAgOmdyb3VwICd0ZXhpbmZvKQ0KDQooZGVmY3VzdG9tIHRleGluZm8tdGV4aW5kZXgt Y29tbWFuZCAidGV4aW5kZXgiDQogICJDb21tYW5kIHVzZWQgYnkgYHRleGluZm8tdGV4aW5kZXgn IHRvIHNvcnQgdW5zb3J0ZWQgaW5kZXggZmlsZXMuIg0KICA6dHlwZSAnc3RyaW5nDQogIDpncm91 cCAndGV4aW5mbykNCg0KKGRlZmN1c3RvbSB0ZXhpbmZvLWRlbGV0ZS1mcm9tLXByaW50LXF1ZXVl LWNvbW1hbmQgImxwcm0iDQogICJDb21tYW5kIHN0cmluZyB1c2VkIHRvIGRlbGV0ZSBhIGpvYiBm cm9tIHRoZSBsaW5lIHByaW50ZXIgcXVldWUuDQpDb21tYW5kIGlzIHVzZWQgYnkgXFxbdGV4aW5m by1kZWxldGUtZnJvbS1wcmludC1xdWV1ZV0gYmFzZWQgb24NCm51bWJlciBwcm92aWRlZCBieSBh IHByZXZpb3VzIFxcW3RleC1zaG93LXByaW50LXF1ZXVlXQ0KY29tbWFuZC4iDQogIDp0eXBlICdz dHJpbmcNCiAgOmdyb3VwICd0ZXhpbmZvKQ0KDQooZGVmdmFyIHRleGluZm8tdGV4LXRyYWlsZXIg IkBieWUiDQogICJTdHJpbmcgYXBwZW5kZWQgYWZ0ZXIgYSByZWdpb24gc2VudCB0byBUZVggYnkg YHRleGluZm8tdGV4LXJlZ2lvbicuIikNCg0KKGRlZnVuIHRleGluZm8tdGV4LXJlZ2lvbiAoYmVn IGVuZCkNCiAgIlJ1biBUZVggb24gdGhlIGN1cnJlbnQgcmVnaW9uLg0KVGhpcyB3b3JrcyBieSB3 cml0aW5nIGEgdGVtcG9yYXJ5IGZpbGUgKGB0ZXgtemFwLWZpbGUnKSBpbiB0aGUgZGlyZWN0b3J5 DQp0aGF0IGlzIHRoZSB2YWx1ZSBvZiBgdGV4LWRpcmVjdG9yeScsIHRoZW4gcnVubmluZyBUZVgg b24gdGhhdCBmaWxlLg0KDQpUaGUgZmlyc3QgbGluZSBvZiB0aGUgYnVmZmVyIGlzIGNvcGllZCB0 byB0aGUNCnRlbXBvcmFyeSBmaWxlOyBhbmQgaWYgdGhlIGJ1ZmZlciBoYXMgYSBoZWFkZXIsIGl0 IGlzIHdyaXR0ZW4gdG8gdGhlDQp0ZW1wb3JhcnkgZmlsZSBiZWZvcmUgdGhlIHJlZ2lvbiBpdHNl bGYuICBUaGUgYnVmZmVyJ3MgaGVhZGVyIGlzIGFsbCBsaW5lcw0KYmV0d2VlbiB0aGUgc3RyaW5n cyBkZWZpbmVkIGJ5IGB0ZXgtc3RhcnQtb2YtaGVhZGVyJyBhbmQgYHRleC1lbmQtb2YtaGVhZGVy Jw0KaW5jbHVzaXZlLiAgVGhlIGhlYWRlciBtdXN0IHN0YXJ0IGluIHRoZSBmaXJzdCAxMDAgbGlu ZXMuDQoNClRoZSB2YWx1ZSBvZiBgdGV4aW5mby10ZXgtdHJhaWxlcicgaXMgYXBwZW5kZWQgdG8g dGhlIHRlbXBvcmFyeSBmaWxlIGFmdGVyIHRoZSByZWdpb24uIg0KICAoaW50ZXJhY3RpdmUgInIi KQ0KICAocmVxdWlyZSAndGV4LW1vZGUpDQogIChsZXQgKCh0ZXgtY29tbWFuZCB0ZXhpbmZvLXRl eC1jb21tYW5kKQ0KCSh0ZXgtdHJhaWxlciB0ZXhpbmZvLXRleC10cmFpbGVyKSkNCiAgICAodGV4 LXJlZ2lvbiBiZWcgZW5kKSkpDQoNCihkZWZ1biB0ZXhpbmZvLXRleC1idWZmZXIgKCkNCiAgIlJ1 biBUZVggb24gdmlzaXRlZCBmaWxlLCBvbmNlIG9yIHR3aWNlLCB0byBtYWtlIGEgY29ycmVjdCBg LmR2aScgZmlsZS4iDQogIChpbnRlcmFjdGl2ZSkNCiAgKHJlcXVpcmUgJ3RleC1tb2RlKQ0KICAo bGV0ICgodGV4LWNvbW1hbmQgdGV4aW5mby10ZXhpMmR2aS1jb21tYW5kKQ0KCTs7IERpc2FibGUg dGV4LXN0YXJ0LW9wdGlvbnMtc3RyaW5nLiAgdGV4aTJkdmkgd291bGQgbm90DQoJOzsgdW5kZXJz dGFuZCBhbnl0aGluZyBzcGVjaWZpZWQgaGVyZS4NCgkodGV4LXN0YXJ0LW9wdGlvbnMtc3RyaW5n ICIiKSkNCiAgICAodGV4LWJ1ZmZlcikpKQ0KDQooZGVmdW4gdGV4aW5mby10ZXhpbmRleCAoKQ0K ICAiUnVuIGB0ZXhpbmRleCcgb24gdW5zb3J0ZWQgaW5kZXggZmlsZXMuDQpUaGUgaW5kZXggZmls ZXMgYXJlIG1hZGUgYnkgXFxbdGV4aW5mby10ZXgtcmVnaW9uXSBvciBcXFt0ZXhpbmZvLXRleC1i dWZmZXJdLg0KVGhpcyBydW5zIHRoZSBzaGVsbCBjb21tYW5kIGRlZmluZWQgYnkgYHRleGluZm8t dGV4aW5kZXgtY29tbWFuZCcuIg0KICAoaW50ZXJhY3RpdmUpDQogIChyZXF1aXJlICd0ZXgtbW9k ZSkNCiAgKHRleC1zZW5kLWNvbW1hbmQgdGV4aW5mby10ZXhpbmRleC1jb21tYW5kIChjb25jYXQg dGV4LXphcC1maWxlICIuPz8iKSkNCiAgOzsgYWx0ZXJuYXRpdmVseQ0KICA7OyAoc2VuZC1zdHJp bmcgInRleC1zaGVsbCINCiAgOzsgICAgICAgICAgICAgIChjb25jYXQgdGV4aW5mby10ZXhpbmRl eC1jb21tYW5kDQogIDs7ICAgICAgICAgICAgICAgICAgICAgICIgIiB0ZXgtemFwLWZpbGUgIi4/ PyIgIlxuIikpDQogICh0ZXgtcmVjZW50ZXItb3V0cHV0LWJ1ZmZlciBuaWwpKQ0KDQooZGVmdW4g dGV4aW5mby10ZXgtcHJpbnQgKCkNCiAgIlByaW50IGAuZHZpJyBmaWxlIG1hZGUgYnkgXFxbdGV4 aW5mby10ZXgtcmVnaW9uXSBvciBcXFt0ZXhpbmZvLXRleC1idWZmZXJdLg0KVGhpcyBydW5zIHRo ZSBzaGVsbCBjb21tYW5kIGRlZmluZWQgYnkgYHRleC1kdmktcHJpbnQtY29tbWFuZCcuIg0KICAo aW50ZXJhY3RpdmUpDQogIChyZXF1aXJlICd0ZXgtbW9kZSkNCiAgKHRleC1wcmludCkpDQoNCihk ZWZ1biB0ZXhpbmZvLXRleC12aWV3ICgpDQogICJWaWV3IGAuZHZpJyBmaWxlIG1hZGUgYnkgXFxb dGV4aW5mby10ZXgtcmVnaW9uXSBvciBcXFt0ZXhpbmZvLXRleC1idWZmZXJdLg0KVGhpcyBydW5z IHRoZSBzaGVsbCBjb21tYW5kIGRlZmluZWQgYnkgYHRleC1kdmktdmlldy1jb21tYW5kJy4iDQog IChpbnRlcmFjdGl2ZSkNCiAgKHJlcXVpcmUgJ3RleC1tb2RlKQ0KICAodGV4LXZpZXcpKQ0KDQoo ZGVmdW4gdGV4aW5mby1xdWl0LWpvYiAoKQ0KICAiUXVpdCBjdXJyZW50bHkgcnVubmluZyBUZVgg am9iLCBieSBzZW5kaW5nIGFuIGB4JyB0byBpdC4iDQogIChpbnRlcmFjdGl2ZSkNCiAgKGlmIChu b3QgKGdldC1wcm9jZXNzICJ0ZXgtc2hlbGwiKSkNCiAgICAgIChlcnJvciAiTm8gVGVYIHNoZWxs IHJ1bm5pbmciKSkNCiAgKHRleC1zZW5kLWNvbW1hbmQgIngiKSkNCjs7IGFsdGVybmF0aXZlbHk6 DQo7OyBzYXZlLWV4Y3Vyc2lvbg0KOzsgICAoc2V0LWJ1ZmZlciAoZ2V0LWJ1ZmZlciAiKnRleC1z aGVsbCoiKSkNCjs7ICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkNCjs7ICAgKGluc2VydCAieCIp DQo7OyAgIChjb21pbnQtc2VuZC1pbnB1dCkNCg0KKGRlZnVuIHRleGluZm8tZGVsZXRlLWZyb20t cHJpbnQtcXVldWUgKGpvYi1udW1iZXIpDQogICJEZWxldGUgam9iIGZyb20gdGhlIGxpbmUgcHJp bnRlciBzcG9vbGluZyBxdWV1ZS4NCllvdSBhcmUgcHJvbXB0ZWQgZm9yIHRoZSBqb2IgbnVtYmVy ICh1c2UgYSBudW1iZXIgc2hvd24gYnkgYSBwcmV2aW91cw0KXFxbdGV4LXNob3ctcHJpbnQtcXVl dWVdIGNvbW1hbmQpLiINCiAgKGludGVyYWN0aXZlICJuUHJpbnRlciBqb2IgbnVtYmVyIGZvciBk ZWxldGlvbjogIikNCiAgKHJlcXVpcmUgJ3RleC1tb2RlKQ0KICAoaWYgKHRleC1zaGVsbC1ydW5u aW5nKQ0KICAgICAgKHRleC1raWxsLWpvYikNCiAgICAodGV4LXN0YXJ0LXNoZWxsKSkNCiAgKHRl eC1zZW5kLWNvbW1hbmQgdGV4aW5mby1kZWxldGUtZnJvbS1wcmludC1xdWV1ZS1jb21tYW5kIGpv Yi1udW1iZXIpDQogIDs7IGFsdGVybmF0aXZlbHkNCiAgOzsgKHNlbmQtc3RyaW5nICJ0ZXgtc2hl bGwiDQogIDs7ICAgICAgICAgICAgICAoY29uY2F0DQogIDs7ICAgICAgICAgICAgICAgdGV4aW5m by1kZWxldGUtZnJvbS1wcmludC1xdWV1ZS1jb21tYW5kDQogIDs7ICAgICAgICAgICAgICAgIiAi DQogIDs7ICAgICAgICAgICAgICAgam9iLW51bWJlciJcbiIpKQ0KICAodGV4LXJlY2VudGVyLW91 dHB1dC1idWZmZXIgbmlsKSkNCg0KKHByb3ZpZGUgJ3RleGluZm8pDQoNCjs7IGFyY2gtdGFnOiAw MDVkN2MzOC00M2I5LTRiN2QtYWExZC1hZWE2OWJhZTczZTENCjs7OyB0ZXhpbmZvLmVsIGVuZHMg aGVyZQ0K ------=_20090326024926_85630 Content-Type: text/x-emacs-lisp; name="texinfo.el" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="texinfo.el" ;;; texinfo.el --- major mode for editing Texinfo files -*- coding: iso-2022-7bit -*- ;; Copyright (C) 1985, 1988, 1989, 1990, 1991, 1992, 1993, 1996, 1997, ;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. ;; Author: Robert J. Chassell ;; Date: [See date below for texinfo-version] ;; Maintainer: FSF ;; Keywords: maint, tex, docs ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Todo: ;; - facemenu support. ;; - command completion. ;;; Commentary: ;;; Code: (eval-when-compile (require 'tex-mode) (require 'cl)) (defvar outline-heading-alist) (defgroup texinfo nil "Texinfo Mode." :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) :group 'docs) ;;;###autoload (defcustom texinfo-open-quote "``" "String inserted by typing \\[texinfo-insert-quote] to open a quotation." :type 'string :group 'texinfo) ;;;###autoload (defcustom texinfo-close-quote "''" "String inserted by typing \\[texinfo-insert-quote] to close a quotation." :type 'string :group 'texinfo) (defcustom texinfo-mode-hook nil "Normal hook run when entering Texinfo mode." :type 'hook :options '(turn-on-auto-fill flyspell-mode) :group 'texinfo) ;;; Autoloads: (autoload 'makeinfo-region "makeinfo" "Make Info file from region of current Texinfo file, and switch to it. This command does not offer the `next-error' feature since it would apply to a temporary file, not the original; use the `makeinfo-buffer' command to gain use of `next-error'." t nil) (autoload 'makeinfo-buffer "makeinfo" "Make Info file from current buffer. Use the \\[next-error] command to move to the next error \(if there are errors\)." t nil) (autoload 'kill-compilation "compile" "Kill the process made by the \\[compile] command." t nil) (autoload 'makeinfo-recenter-compilation-buffer "makeinfo" "Redisplay `*compilation*' buffer so most recent output can be seen. The last line of the buffer is displayed on line LINE of the window, or centered if LINE is nil." t nil) (autoload 'texinfo-update-node "texnfo-upd" "Without any prefix argument, update the node in which point is located. Non-nil argument (prefix, if interactive) means update the nodes in the marked region. The functions for creating or updating nodes and menus, and their keybindings, are: `texinfo-update-node' (&optional region-p) \\[texinfo-update-node] `texinfo-every-node-update' () \\[texinfo-every-node-update] `texinfo-sequential-node-update' (&optional region-p) `texinfo-make-menu' (&optional region-p) \\[texinfo-make-menu] `texinfo-all-menus-update' () \\[texinfo-all-menus-update] `texinfo-master-menu' () `texinfo-indent-menu-description' (column &optional region-p) The `texinfo-column-for-description' variable specifies the column to which menu descriptions are indented. Its default value is 32." t nil) (autoload 'texinfo-every-node-update "texnfo-upd" "Update every node in a Texinfo file." t nil) (autoload 'texinfo-sequential-node-update "texnfo-upd" "Update one node (or many) in a Texinfo file with sequential pointers. This function causes the `Next' or `Previous' pointer to point to the immediately preceding or following node, even if it is at a higher or lower hierarchical level in the document. Continually pressing `n' or `p' takes you straight through the file. Without any prefix argument, update the node in which point is located. Non-nil argument (prefix, if interactive) means update the nodes in the marked region. This command makes it awkward to navigate among sections and subsections; it should be used only for those documents that are meant to be read like a novel rather than a reference, and for which the Info `g*' command is inadequate." t nil) (autoload 'texinfo-make-menu "texnfo-upd" "Without any prefix argument, make or update a menu. Make the menu for the section enclosing the node found following point. Non-nil argument (prefix, if interactive) means make or update menus for nodes within or part of the marked region. Whenever a menu exists, and is being updated, the descriptions that are associated with node names in the pre-existing menu are incorporated into the new menu. Otherwise, the nodes' section titles are inserted as descriptions." t nil) (autoload 'texinfo-all-menus-update "texnfo-upd" "Update every regular menu in a Texinfo file. Remove pre-existing master menu, if there is one. If called with a non-nil argument, this function first updates all the nodes in the buffer before updating the menus." t nil) (autoload 'texinfo-master-menu "texnfo-upd" "Make a master menu for a whole Texinfo file. Non-nil argument (prefix, if interactive) means first update all existing nodes and menus. Remove pre-existing master menu, if there is one. This function creates a master menu that follows the top node. The master menu includes every entry from all the other menus. It replaces any existing ordinary menu that follows the top node. If called with a non-nil argument, this function first updates all the menus in the buffer (incorporating descriptions from pre-existing menus) before it constructs the master menu. The function removes the detailed part of an already existing master menu. This action depends on the pre-existing master menu using the standard `texinfo-master-menu-header'. The master menu has the following format, which is adapted from the recommendation in the Texinfo Manual: * The first part contains the major nodes in the Texinfo file: the nodes for the chapters, chapter-like sections, and the major appendices. This includes the indices, so long as they are in chapter-like sections, such as unnumbered sections. * The second and subsequent parts contain a listing of the other, lower level menus, in order. This way, an inquirer can go directly to a particular node if he or she is searching for specific information. Each of the menus in the detailed node listing is introduced by the title of the section containing the menu." t nil) (autoload 'texinfo-indent-menu-description "texnfo-upd" "Indent every description in menu following point to COLUMN. Non-nil argument (prefix, if interactive) means indent every description in every menu in the region. Does not indent second and subsequent lines of a multi-line description." t nil) (autoload 'texinfo-insert-node-lines "texnfo-upd" "Insert missing `@node' lines in region of Texinfo file. Non-nil argument (prefix, if interactive) means also to insert the section titles as node names; and also to insert the section titles as node names in pre-existing @node lines that lack names." t nil) (autoload 'texinfo-start-menu-description "texnfo-upd" "In this menu entry, insert the node's section title as a description. Position point at beginning of description ready for editing. Do not insert a title if the line contains an existing description. You will need to edit the inserted text since a useful description complements the node name rather than repeats it as a title does." t nil) (autoload 'texinfo-multiple-files-update "texnfo-upd" "Update first node pointers in each file included in OUTER-FILE; create or update main menu in the outer file that refers to such nodes. This does not create or update menus or pointers within the included files. With optional MAKE-MASTER-MENU argument (prefix arg, if interactive), insert a master menu in OUTER-FILE. This does not create or update menus or pointers within the included files. With optional UPDATE-EVERYTHING argument (numeric prefix arg, if interactive), update all the menus and all the `Next', `Previous', and `Up' pointers of all the files included in OUTER-FILE before inserting a master menu in OUTER-FILE. The command also updates the `Top' level node pointers of OUTER-FILE. Notes: * this command does NOT save any files--you must save the outer file and any modified, included files. * except for the `Top' node, this command does NOT handle any pre-existing nodes in the outer file; hence, indices must be enclosed in an included file. Requirements: * each of the included files must contain exactly one highest hierarchical level node, * this highest node must be the first node in the included file, * each highest hierarchical level node must be of the same type. Thus, normally, each included file contains one, and only one, chapter." t nil) ;;; Code: ;;; Don't you dare insert any `require' calls at top level in this file--rms. (defvar texinfo-section-list '(("top" 1) ("chapter" 2) ("section" 3) ("subsection" 4) ("subsubsection" 5) ("unnumbered" 2) ("unnumberedsec" 3) ("unnumberedsubsec" 4) ("unnumberedsubsubsec" 5) ("appendix" 2) ("appendixsec" 3) ("appendixsection" 3) ("appendixsubsec" 4) ("appendixsubsubsec" 5) ("majorheading" 2) ("chapheading" 2) ("heading" 3) ("subheading" 4) ("subsubheading" 5)) "Alist of sectioning commands and their relative level.") ;;; Syntax table (defvar texinfo-mode-syntax-table (let ((st (make-syntax-table))) (modify-syntax-entry ?\" "." st) (modify-syntax-entry ?\\ "." st) (modify-syntax-entry ?@ "\\" st) (modify-syntax-entry ?\^q "\\" st) (modify-syntax-entry ?\[ "(]" st) (modify-syntax-entry ?\] ")[" st) (modify-syntax-entry ?{ "(}" st) (modify-syntax-entry ?} "){" st) (modify-syntax-entry ?\n ">" st) (modify-syntax-entry ?\' "w" st) st)) ;; Written by Wolfgang Bangerth ;; To override this example, set either `imenu-generic-expression' ;; or `imenu-create-index-function'. (defvar texinfo-imenu-generic-expression '((nil "^@\\(node\\|anchor\\)[ \t]+\\([^,\n]*\\)" 2) ("Chapters" "^@chapter[ \t]+\\(.*\\)$" 1)) "Imenu generic expression for Texinfo mode. See `imenu-generic-expression'.") (defvar texinfo-font-lock-syntactic-keywords '(("\\(@\\)c\\(omment\\)?\\>" (1 "<")) ("^\\(@\\)ignore\\>" (1 "< b")) ("^@end ignore\\(\n\\)" (1 "> b"))) "Syntactic keywords to catch comment delimiters in `texinfo-mode'.") (defconst texinfo-environments '("cartouche" "copying" "defcv" "deffn" "defivar" "defmac" "defmethod" "defop" "defopt" "defspec" "deftp" "deftypecv" "deftypefn" "deftypefun" "deftypeivar" "deftypemethod" "deftypeop" "deftypevar" "deftypevr" "defun" "defvar" "defvr" "description" "detailmenu" "direntry" "display" "documentdescription" "enumerate" "example" "flushleft" "flushright" "format" "ftable" "group" "html" "ifclear" "ifset" "ifhtml" "ifinfo" "ifnothtml" "ifnotinfo" "ifnotplaintext" "ifnottex" "ifplaintext" "iftex" "ignore" "itemize" "lisp" "macro" "menu" "multitable" "quotation" "smalldisplay" "smallexample" "smallformat" "smalllisp" "table" "tex" "titlepage" "verbatim" "vtable") "List of Texinfo environments.") (defconst texinfo-environment-regexp (concat "^@" (regexp-opt (cons "end" texinfo-environments) t) "\\>") "Regexp for environment-like Texinfo list commands. Subexpression 1 is what goes into the corresponding `@end' statement.") (defface texinfo-heading '((t (:inherit font-lock-function-name-face))) "Face used for section headings in `texinfo-mode'." :group 'texinfo) ;; backward-compatibility alias (put 'texinfo-heading-face 'face-alias 'texinfo-heading) (defvar texinfo-heading-face 'texinfo-heading) (defvar texinfo-font-lock-keywords `(;; All but the first had an OVERRIDE of t. ;; It didn't seem to be any better, and it's slower--simon. ;; Robert J. Chassell says remove this line. ;;("\\$\\([^$]*\\)\\$" 1 font-lock-string-face t) ("@\\([a-zA-Z]+\\|[^ \t\n]\\)" 1 font-lock-keyword-face) ;commands ("^\\*\\([^\n:]*\\)" 1 font-lock-function-name-face t) ;menu items ("@\\(emph\\|i\\|sc\\){\\([^}]+\\)" 2 'italic) ("@\\(strong\\|b\\){\\([^}]+\\)" 2 'bold) ("@\\(kbd\\|key\\|url\\|uref\\){\\([^}]+\\)" 2 font-lock-string-face) ;; The following two groups have an OVERRIDE of `keep' because ;; their arguments frequently include a @@, and we don't want that ;; to overwrite the normal fontification of the argument. ("@\\(file\\|email\\){\\([^}]+\\)" 2 font-lock-string-face keep) ("@\\(samp\\|code\\|var\\|math\\|env\\|command\\|option\\){\\([^}]+\\)" 2 font-lock-variable-name-face keep) ("@\\(cite\\|x?ref\\|pxref\\|dfn\\|inforef\\){\\([^}]+\\)" 2 font-lock-constant-face) ("@\\(anchor\\){\\([^}]+\\)" 2 font-lock-type-face) ("@\\(dmn\\|acronym\\|value\\){\\([^}]+\\)" 2 font-lock-builtin-face) ("@\\(end\\|itemx?\\) +\\(.+\\)" 2 font-lock-keyword-face keep) ;; (,texinfo-environment-regexp ;; 1 (texinfo-clone-environment (match-beginning 1) (match-end 1)) keep) (,(concat "^@" (regexp-opt (mapcar 'car texinfo-section-list) t) ".*\n") 0 texinfo-heading-face t)) "Additional expressions to highlight in Texinfo mode.") (defun texinfo-clone-environment (start end) (let ((endp nil)) (save-excursion (ignore-errors (goto-char start) (when (looking-at "end\\Sw+\\(\\sw+\\)") (setq endp t start (match-beginning 1) end (match-end 1))) (unless (get-char-property start 'text-clones) (if endp (texinfo-last-unended-begin) (forward-word 1) (texinfo-next-unmatched-end)) (skip-syntax-forward "^w") (when (looking-at (concat (regexp-quote (buffer-substring start end)) "\\>")) (text-clone-create start end 'spread "\\w*"))))))) ;;; Keybindings ;;; Keys common both to Texinfo mode and to TeX shell. (defun texinfo-define-common-keys (keymap) "Define the keys both in Texinfo mode and in the texinfo-tex-shell." (define-key keymap "\C-c\C-t\C-k" 'tex-kill-job) (define-key keymap "\C-c\C-t\C-x" 'texinfo-quit-job) (define-key keymap "\C-c\C-t\C-l" 'tex-recenter-output-buffer) (define-key keymap "\C-c\C-t\C-d" 'texinfo-delete-from-print-queue) (define-key keymap "\C-c\C-t\C-q" 'tex-show-print-queue) (define-key keymap "\C-c\C-t\C-p" 'texinfo-tex-print) (define-key keymap "\C-c\C-t\C-v" 'texinfo-tex-view) (define-key keymap "\C-c\C-t\C-i" 'texinfo-texindex) (define-key keymap "\C-c\C-t\C-r" 'texinfo-tex-region) (define-key keymap "\C-c\C-t\C-b" 'texinfo-tex-buffer)) ;; Mode documentation displays commands in reverse order ;; from how they are listed in the texinfo-mode-map. (defvar texinfo-mode-map (let ((map (make-sparse-keymap))) ;; bindings for `texnfo-tex.el' (texinfo-define-common-keys map) (define-key map "\"" 'texinfo-insert-quote) ;; bindings for `makeinfo.el' (define-key map "\C-c\C-m\C-k" 'kill-compilation) (define-key map "\C-c\C-m\C-l" 'makeinfo-recenter-compilation-buffer) (define-key map "\C-c\C-m\C-r" 'makeinfo-region) (define-key map "\C-c\C-m\C-b" 'makeinfo-buffer) ;; bindings for `texinfmt.el' (define-key map "\C-c\C-e\C-r" 'texinfo-format-region) (define-key map "\C-c\C-e\C-b" 'texinfo-format-buffer) ;; AUCTeX-like bindings (define-key map "\e\r" 'texinfo-insert-@item) ;; bindings for updating nodes and menus (define-key map "\C-c\C-um" 'texinfo-master-menu) (define-key map "\C-c\C-u\C-m" 'texinfo-make-menu) (define-key map "\C-c\C-u\C-n" 'texinfo-update-node) (define-key map "\C-c\C-u\C-e" 'texinfo-every-node-update) (define-key map "\C-c\C-u\C-a" 'texinfo-all-menus-update) (define-key map "\C-c\C-s" 'texinfo-show-structure) (define-key map "\C-c}" 'up-list) (define-key map "\C-c]" 'up-list) (define-key map "\C-c{" 'texinfo-insert-braces) ;; bindings for inserting strings (define-key map "\C-c\C-o" 'texinfo-insert-block) (define-key map "\C-c\C-c\C-d" 'texinfo-start-menu-description) (define-key map "\C-c\C-c\C-s" 'texinfo-insert-@strong) (define-key map "\C-c\C-c\C-e" 'texinfo-insert-@emph) (define-key map "\C-c\C-cv" 'texinfo-insert-@var) (define-key map "\C-c\C-cu" 'texinfo-insert-@uref) (define-key map "\C-c\C-ct" 'texinfo-insert-@table) (define-key map "\C-c\C-cs" 'texinfo-insert-@samp) (define-key map "\C-c\C-cq" 'texinfo-insert-@quotation) (define-key map "\C-c\C-co" 'texinfo-insert-@noindent) (define-key map "\C-c\C-cn" 'texinfo-insert-@node) (define-key map "\C-c\C-cm" 'texinfo-insert-@email) (define-key map "\C-c\C-ck" 'texinfo-insert-@kbd) (define-key map "\C-c\C-ci" 'texinfo-insert-@item) (define-key map "\C-c\C-cf" 'texinfo-insert-@file) (define-key map "\C-c\C-cx" 'texinfo-insert-@example) (define-key map "\C-c\C-ce" 'texinfo-insert-@end) (define-key map "\C-c\C-cd" 'texinfo-insert-@dfn) (define-key map "\C-c\C-cc" 'texinfo-insert-@code) map)) (easy-menu-define texinfo-mode-menu texinfo-mode-map "Menu used for `texinfo-mode'." '("Texinfo" ["Insert block" texinfo-insert-block t] ;; ["Insert node" texinfo-insert-@node t] "----" ["Update All" (lambda () (interactive) (texinfo-master-menu t)) :keys "\\[universal-argument] \\[texinfo-master-menu]"] ["Update every node" texinfo-every-node-update t] ["Update node" texinfo-update-node t] ["Make Master menu" texinfo-master-menu t] ["Make menu" texinfo-make-menu t] ["Update all menus" texinfo-all-menus-update t] "----" ["Show structure" texinfo-show-structure t] ["Format region" texinfo-format-region t] ["Format buffer" texinfo-format-buffer t] ["Makeinfo region" makeinfo-region t] ["Makeinfo buffer" makeinfo-buffer t])) (defun texinfo-filter (section list) (let (res) (dolist (x list) (if (eq section (cadr x)) (push (car x) res))) res)) (defvar texinfo-chapter-level-regexp (regexp-opt (texinfo-filter 2 texinfo-section-list)) "Regular expression matching just the Texinfo chapter level headings.") ;;; Texinfo mode ;;;###autoload (define-derived-mode texinfo-mode text-mode "Texinfo" "Major mode for editing Texinfo files. It has these extra commands: \\{texinfo-mode-map} These are files that are used as input for TeX to make printed manuals and also to be turned into Info files with \\[makeinfo-buffer] or the `makeinfo' program. These files must be written in a very restricted and modified version of TeX input format. Editing commands are like text-mode except that the syntax table is set up so expression commands skip Texinfo bracket groups. To see what the Info version of a region of the Texinfo file will look like, use \\[makeinfo-region], which runs `makeinfo' on the current region. You can show the structure of a Texinfo file with \\[texinfo-show-structure]. This command shows the structure of a Texinfo file by listing the lines with the @-sign commands for @chapter, @section, and the like. These lines are displayed in another window called the *Occur* window. In that window, you can position the cursor over one of the lines and use \\[occur-mode-goto-occurrence], to jump to the corresponding spot in the Texinfo file. In addition, Texinfo mode provides commands that insert various frequently used @-sign commands into the buffer. You can use these commands to save keystrokes. And you can insert balanced braces with \\[texinfo-insert-braces] and later use the command \\[up-list] to move forward past the closing brace. Also, Texinfo mode provides functions for automatically creating or updating menus and node pointers. These functions * insert the `Next', `Previous' and `Up' pointers of a node, * insert or update the menu for a section, and * create a master menu for a Texinfo source file. Here are the functions: texinfo-update-node \\[texinfo-update-node] texinfo-every-node-update \\[texinfo-every-node-update] texinfo-sequential-node-update texinfo-make-menu \\[texinfo-make-menu] texinfo-all-menus-update \\[texinfo-all-menus-update] texinfo-master-menu texinfo-indent-menu-description (column &optional region-p) The `texinfo-column-for-description' variable specifies the column to which menu descriptions are indented. Passed an argument (a prefix argument, if interactive), the `texinfo-update-node' and `texinfo-make-menu' functions do their jobs in the region. To use the updating commands, you must structure your Texinfo file hierarchically, such that each `@node' line, with the exception of the Top node, is accompanied by some kind of section line, such as an `@chapter' or `@section' line. If the file has a `top' node, it must be called `top' or `Top' and be the first node in the file. Entering Texinfo mode calls the value of `text-mode-hook', and then the value of `texinfo-mode-hook'." (set (make-local-variable 'page-delimiter) (concat "^@node [ \t]*[Tt]op\\|^@\\(" texinfo-chapter-level-regexp "\\)\\>")) (make-local-variable 'require-final-newline) (setq require-final-newline mode-require-final-newline) (make-local-variable 'indent-tabs-mode) (setq indent-tabs-mode nil) (make-local-variable 'paragraph-separate) (setq paragraph-separate (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-separate)) (make-local-variable 'paragraph-start) (setq paragraph-start (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-start)) (make-local-variable 'sentence-end-base) (setq sentence-end-base "\\(@\\(end\\)?dots{}\\|[.?!]\\)[]\"'$B!I$,1r}(B)}]*") (make-local-variable 'adaptive-fill-mode) (setq adaptive-fill-mode nil) (make-local-variable 'fill-column) (setq fill-column 70) (make-local-variable 'comment-start) (setq comment-start "@c ") (make-local-variable 'comment-start-skip) (setq comment-start-skip "@c +\\|@comment +") (make-local-variable 'words-include-escapes) (setq words-include-escapes t) (make-local-variable 'imenu-generic-expression) (setq imenu-generic-expression texinfo-imenu-generic-expression) (setq imenu-case-fold-search nil) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(texinfo-font-lock-keywords nil nil nil backward-paragraph (font-lock-syntactic-keywords . texinfo-font-lock-syntactic-keywords))) (set (make-local-variable 'parse-sexp-lookup-properties) t) ;; Outline settings. (set (make-local-variable 'outline-heading-alist) ;; We should merge outline-heading-alist and texinfo-section-list ;; but in the mean time, let's just generate one from the other. (mapcar (lambda (x) (cons (concat "@" (car x)) (cadr x))) texinfo-section-list)) (set (make-local-variable 'outline-regexp) (concat (regexp-opt (mapcar 'car outline-heading-alist) t) "\\>")) (make-local-variable 'tex-start-of-header) (setq tex-start-of-header "%\\*\\*start") (make-local-variable 'tex-end-of-header) (setq tex-end-of-header "%\\*\\*end") (make-local-variable 'tex-first-line-header-regexp) (setq tex-first-line-header-regexp "^\\\\input") (make-local-variable 'tex-trailer) (setq tex-trailer "@bye\n") ;; Prevent filling certain lines, in addition to ones specified ;; by the user. (let ((prevent-filling "^@\\(def\\|multitable\\)")) (set (make-local-variable 'auto-fill-inhibit-regexp) (if (null auto-fill-inhibit-regexp) prevent-filling (concat auto-fill-inhibit-regexp "\\|" prevent-filling))))) ;;; Insert string commands (defvar texinfo-block-default "example") (define-skeleton texinfo-insert-block "Create a matching pair @ .. @end at point. Puts point on a blank line between them." (setq texinfo-block-default (completing-read (format "Block name [%s]: " texinfo-block-default) texinfo-environments nil nil nil nil texinfo-block-default)) \n "@" str \n _ \n "@end " str \n) (defun texinfo-inside-macro-p (macro &optional bound) "Non-nil if inside a macro matching the regexp MACRO." (condition-case nil (save-excursion (save-restriction (narrow-to-region bound (point)) (while (progn (up-list -1) (not (condition-case nil (save-excursion (backward-sexp 1) (looking-at macro)) (scan-error nil))))) t)) (scan-error nil))) (defun texinfo-inside-env-p (env &optional bound) "Non-nil if inside an environment matching the regexp @ENV." (save-excursion (and (re-search-backward (concat "@\\(end\\s +\\)?" env) bound t) (not (match-end 1))))) (defvar texinfo-enable-quote-macros "@\\(code\\|samp\\|kbd\\)\\>") (defvar texinfo-enable-quote-envs '("example\\>" "lisp\\>")) (defun texinfo-insert-quote (&optional arg) "Insert the appropriate quote mark for Texinfo. Usually inserts the value of `texinfo-open-quote' (normally ``) or `texinfo-close-quote' (normally ''), depending on the context. With prefix argument or inside @code or @example, inserts a plain \"." (interactive "*P") (let ((top (or (save-excursion (re-search-backward "@node\\>" nil t)) (point-min)))) (if (or arg (= (preceding-char) ?\\) (save-excursion ;; Might be near the start of a (narrowed) buffer. (ignore-errors (backward-char (length texinfo-open-quote))) (when (or (looking-at texinfo-open-quote) (looking-at texinfo-close-quote)) (delete-char (length texinfo-open-quote)) t)) (texinfo-inside-macro-p texinfo-enable-quote-macros top) (let ((in-env nil)) (dolist (env texinfo-enable-quote-envs in-env) (if (texinfo-inside-env-p env top) (setq in-env t))))) (self-insert-command (prefix-numeric-value arg)) (insert (if (or (bobp) (memq (char-syntax (preceding-char)) '(?\( ?> ?\s))) texinfo-open-quote texinfo-close-quote))))) ;; The following texinfo-insert-@end command not only inserts a SPC ;; after the @end, but tries to find out what belongs there. It is ;; not very smart: it does not understand nested lists. (defun texinfo-last-unended-begin () (while (and (re-search-backward texinfo-environment-regexp) (looking-at "@end")) (texinfo-last-unended-begin))) (defun texinfo-next-unmatched-end () (while (and (re-search-forward texinfo-environment-regexp) (save-excursion (goto-char (match-beginning 0)) (not (looking-at "@end")))) (texinfo-next-unmatched-end))) (defun texinfo-insert-@end () "Insert the matching `@end' for the last Texinfo command that needs one." (interactive) (let ((string (ignore-errors (save-excursion (texinfo-last-unended-begin) (match-string 1))))) (insert "@end ") (if string (insert string "\n")))) ;; The following insert commands accept a prefix arg N, which is the ;; number of words (actually s-exprs) that should be surrounded by ;; braces. Thus you can first paste a variable name into a .texinfo ;; buffer, then say C-u 1 C-c C-c v at the beginning of the just ;; pasted variable name to put @var{...} *around* the variable name. ;; Operate on previous word or words with negative arg. ;; These commands use texinfo-insert-@-with-arg (defun texinfo-insert-@-with-arg (string &optional arg) (if arg (progn (setq arg (prefix-numeric-value arg)) (if (< arg 0) (progn (skip-chars-backward " \t\n\r\f") (save-excursion (forward-sexp arg) (insert "@" string "{")) (insert "}")) (skip-chars-forward " \t\n\r\f") (insert "@" string "{") (forward-sexp arg) (insert "}"))) (insert "@" string "{}") (backward-char))) (defun texinfo-insert-braces () "Make a pair of braces and be poised to type inside of them. Use \\[up-list] to move forward out of the braces." (interactive) (insert "{}") (backward-char)) (defun texinfo-insert-@code (&optional arg) "Insert a `@code{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "code" arg)) (defun texinfo-insert-@dfn (&optional arg) "Insert a `@dfn{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "dfn" arg)) (defun texinfo-insert-@email (&optional arg) "Insert a `@email{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "email" arg)) (defun texinfo-insert-@emph (&optional arg) "Insert a `@emph{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "emph" arg)) (defun texinfo-insert-@example () "Insert the string `@example' in a Texinfo buffer." (interactive) (insert "@example\n")) (defun texinfo-insert-@file (&optional arg) "Insert a `@file{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "file" arg)) (defun texinfo-insert-@item () "Insert the string `@item' in a Texinfo buffer. If in a table defined by @table, follow said string with a space. Otherwise, follow with a newline." (interactive) (insert "@item" (if (equal (ignore-errors (save-excursion (texinfo-last-unended-begin) (match-string 1))) "table") ?\s ?\n))) (defun texinfo-insert-@kbd (&optional arg) "Insert a `@kbd{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "kbd" arg)) (defun texinfo-insert-@node () "Insert the string `@node' in a Texinfo buffer. Insert a comment on the following line indicating the order of arguments to @node. Insert a carriage return after the comment line. Leave point after `@node'." (interactive) (insert "@node \n@comment node-name, next, previous, up\n") (forward-line -2) (forward-char 6)) (defun texinfo-insert-@noindent () "Insert the string `@noindent' in a Texinfo buffer." (interactive) (insert "@noindent\n")) (defun texinfo-insert-@quotation () "Insert the string `@quotation' in a Texinfo buffer." (interactive) (insert "@quotation\n")) (defun texinfo-insert-@samp (&optional arg) "Insert a `@samp{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "samp" arg)) (defun texinfo-insert-@strong (&optional arg) "Insert a `@strong{...}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "strong" arg)) (defun texinfo-insert-@table () "Insert the string `@table' in a Texinfo buffer." (interactive) (insert "@table ")) (defun texinfo-insert-@var (&optional arg) "Insert a `@var{}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "var" arg)) (defun texinfo-insert-@uref (&optional arg) "Insert a `@uref{}' command in a Texinfo buffer. A numeric argument says how many words the braces should surround. The default is not to surround any existing words with the braces." (interactive "P") (texinfo-insert-@-with-arg "uref" arg)) (defalias 'texinfo-insert-@url 'texinfo-insert-@uref) ;;; Texinfo file structure (defun texinfo-show-structure (&optional nodes-too) "Show the structure of a Texinfo file. List the lines in the file that begin with the @-sign commands for @chapter, @section, and the like. With optional argument (prefix if interactive), list both the lines with @-sign commands for @chapter, @section, and the like, and list @node lines. Lines with structuring commands beginning in them are displayed in another buffer named `*Occur*'. In that buffer, you can move point to one of those lines and then use \\\\[occur-mode-goto-occurrence], to jump to the corresponding spot in the Texinfo source file." (interactive "P") ;; First, remember current location (let (current-location) (save-excursion (end-of-line) ; so as to find section on current line (if (re-search-backward ;; do not require `texinfo-section-types-regexp' in texnfo-upd.el "^@\\(chapter \\|sect\\|subs\\|subh\\|unnum\\|major\\|chapheading \\|heading \\|appendix\\)" nil t) (setq current-location (progn (beginning-of-line) (buffer-substring (point) (progn (end-of-line) (point))))) ;; else point is located before any section command. (setq current-location "tex"))) ;; Second, create and format an *Occur* buffer (save-excursion (goto-char (point-min)) (occur (concat "^\\(?:" (if nodes-too "@node\\>\\|") outline-regexp "\\)"))) (pop-to-buffer "*Occur*") (goto-char (point-min)) (let ((inhibit-read-only t)) (flush-lines "-----") ;; Now format the "*Occur*" buffer to show the structure. ;; Thanks to ceder@signum.se (Per Cederqvist) (goto-char (point-max)) (let (level) (while (re-search-backward "^ *[0-9]*:@\\(\\sw+\\)" nil 0) (goto-char (1- (match-beginning 1))) (setq level (or (cadr (assoc (match-string 1) texinfo-section-list)) 2)) (indent-to-column (+ (current-column) (* 4 (- level 2)))) (beginning-of-line)))) ;; Third, go to line corresponding to location in source file ;; potential bug: two exactly similar `current-location' lines ... (goto-char (point-min)) (re-search-forward current-location nil t) (beginning-of-line) )) ;;; The tex and print function definitions: (defcustom texinfo-texi2dvi-command "texi2dvi" "Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer." :type 'string :group 'texinfo) (defcustom texinfo-tex-command "tex" "Command used by `texinfo-tex-region' to run TeX on a region." :type 'string :group 'texinfo) (defcustom texinfo-texindex-command "texindex" "Command used by `texinfo-texindex' to sort unsorted index files." :type 'string :group 'texinfo) (defcustom texinfo-delete-from-print-queue-command "lprm" "Command string used to delete a job from the line printer queue. Command is used by \\[texinfo-delete-from-print-queue] based on number provided by a previous \\[tex-show-print-queue] command." :type 'string :group 'texinfo) (defvar texinfo-tex-trailer "@bye" "String appended after a region sent to TeX by `texinfo-tex-region'.") (defun texinfo-tex-region (beg end) "Run TeX on the current region. This works by writing a temporary file (`tex-zap-file') in the directory that is the value of `tex-directory', then running TeX on that file. The first line of the buffer is copied to the temporary file; and if the buffer has a header, it is written to the temporary file before the region itself. The buffer's header is all lines between the strings defined by `tex-start-of-header' and `tex-end-of-header' inclusive. The header must start in the first 100 lines. The value of `texinfo-tex-trailer' is appended to the temporary file after the region." (interactive "r") (require 'tex-mode) (let ((tex-command texinfo-tex-command) (tex-trailer texinfo-tex-trailer)) (tex-region beg end))) (defun texinfo-tex-buffer () "Run TeX on visited file, once or twice, to make a correct `.dvi' file." (interactive) (require 'tex-mode) (let ((tex-command texinfo-texi2dvi-command) ;; Disable tex-start-options-string. texi2dvi would not ;; understand anything specified here. (tex-start-options-string "")) (tex-buffer))) (defun texinfo-texindex () "Run `texindex' on unsorted index files. The index files are made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. This runs the shell command defined by `texinfo-texindex-command'." (interactive) (require 'tex-mode) (tex-send-command texinfo-texindex-command (concat tex-zap-file ".??")) ;; alternatively ;; (send-string "tex-shell" ;; (concat texinfo-texindex-command ;; " " tex-zap-file ".??" "\n")) (tex-recenter-output-buffer nil)) (defun texinfo-tex-print () "Print `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. This runs the shell command defined by `tex-dvi-print-command'." (interactive) (require 'tex-mode) (tex-print)) (defun texinfo-tex-view () "View `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. This runs the shell command defined by `tex-dvi-view-command'." (interactive) (require 'tex-mode) (tex-view)) (defun texinfo-quit-job () "Quit currently running TeX job, by sending an `x' to it." (interactive) (if (not (get-process "tex-shell")) (error "No TeX shell running")) (tex-send-command "x")) ;; alternatively: ;; save-excursion ;; (set-buffer (get-buffer "*tex-shell*")) ;; (goto-char (point-max)) ;; (insert "x") ;; (comint-send-input) (defun texinfo-delete-from-print-queue (job-number) "Delete job from the line printer spooling queue. You are prompted for the job number (use a number shown by a previous \\[tex-show-print-queue] command)." (interactive "nPrinter job number for deletion: ") (require 'tex-mode) (if (tex-shell-running) (tex-kill-job) (tex-start-shell)) (tex-send-command texinfo-delete-from-print-queue-command job-number) ;; alternatively ;; (send-string "tex-shell" ;; (concat ;; texinfo-delete-from-print-queue-command ;; " " ;; job-number"\n")) (tex-recenter-output-buffer nil)) (provide 'texinfo) ;; arch-tag: 005d7c38-43b9-4b7d-aa1d-aea69bae73e1 ;;; texinfo.el ends here ------=_20090326024926_85630 Content-Type: application/octet-stream; name="texinfo.el.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="texinfo.el.diff" MzIwLDMyMmMzMjAsMzIxCjwgICAgICJkZWZtZXRob2QiICJkZWZvcCIgImRlZm9wdCIgImRlZnNw ZWMiICJkZWZ0cCIgImRlZnR5cGVjdiINCjwgICAgICJkZWZ0eXBlZm4iICJkZWZ0eXBlZnVuIiAi ZGVmdHlwZWl2YXIiICJkZWZ0eXBlbWV0aG9kIg0KPCAgICAgImRlZnR5cGVvcCIgImRlZnR5cGV2 YXIiICJkZWZ0eXBldnIiICJkZWZ1biIgImRlZnZhciINCi0tLQo+ICAgICAiZGVmbWV0aG9kIiAi ZGVmb3AiICJkZWZvcHQiICJkZWZzcGVjIiAiZGVmdHAiICJkZWZ0eXBlZm4iDQo+ICAgICAiZGVm dHlwZWZ1biIgImRlZnR5cGV2YXIiICJkZWZ0eXBldnIiICJkZWZ1biIgImRlZnZhciINCjMyNWMz MjQKPCAgICAgImZsdXNocmlnaHQiICJmb3JtYXQiICJmdGFibGUiICJncm91cCIgImh0bWwiICJp ZmNsZWFyIiAiaWZzZXQiDQotLS0KPiAgICAgImZsdXNocmlnaHQiICJmb3JtYXQiICJmdGFibGUi ICJncm91cCIgImlmY2xlYXIiICJpZnNldCINCg== ------=_20090326024926_85630-- From rgm@gnu.org Thu Mar 26 17:49:56 2009 Received: (at control) by emacsbugs.donarmstrong.com; 27 Mar 2009 00:49:56 +0000 X-Spam-Checker-Version: SpamAssassin 3.2.5-bugs.debian.org_2005_01_02 (2008-06-10) on rzlab.ucr.edu X-Spam-Level: X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. X-Spam-Status: No, score=-2.0 required=4.0 tests=VALID_BTS_CONTROL autolearn=ham version=3.2.5-bugs.debian.org_2005_01_02 Received: from fencepost.gnu.org (fencepost.gnu.org [140.186.70.10]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n2R0nr41000629 for ; Thu, 26 Mar 2009 17:49:54 -0700 Received: from rgm by fencepost.gnu.org with local (Exim 4.67) (envelope-from ) id 1Ln0Ge-0002dy-8w; Thu, 26 Mar 2009 20:49:52 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <18892.8880.183509.192318@fencepost.gnu.org> Date: Thu, 26 Mar 2009 20:49:52 -0400 From: Glenn Morris To: control Subject: control message severity 2783 wishlist close 2789 reassign 2791 emacs,ns reassign 2793 spam severity 936 important stop 936 leads to data loss, therefore is important From debbugs-submit-bounces@debbugs.gnu.org Mon Jan 25 18:09:13 2010 Received: (at control) by debbugs.gnu.org; 25 Jan 2010 23:09:13 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NZY3T-00080e-Bp for submit@debbugs.gnu.org; Mon, 25 Jan 2010 18:09:13 -0500 Received: from fencepost.gnu.org ([140.186.70.10]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NZY3R-00080Z-GC for control@debbugs.gnu.org; Mon, 25 Jan 2010 18:09:09 -0500 Received: from rgm by fencepost.gnu.org with local (Exim 4.69) (envelope-from ) id 1NZY3N-0001rb-MZ; Mon, 25 Jan 2010 18:09:05 -0500 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19294.9361.597434.290863@fencepost.gnu.org> Date: Mon, 25 Jan 2010 18:09:05 -0500 From: Glenn Morris To: control Subject: control X-Attribution: GM X-Mailer: VM (www.wonderworks.com/vm), GNU Emacs (www.gnu.org/software/emacs) X-Hue: cyan X-Ran: ]Vs^BnQ:)I3;cKQqWxKp@TGK'E]LM(//C2_\bp!Z2?_2a-3VCDk#4X2:43E"]wIG9nlSf5 X-Debbugs-No-Ack: yes X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -5.0 (-----) close 2709 unarchive 2761 unarchive 2722 merge 2722 2761 tags 2783 patch unarchive 2786 unarchive 1982 merge 1982 2786 From debbugs-submit-bounces@debbugs.gnu.org Mon Mar 07 23:42:35 2011 Received: (at 2783-done) by debbugs.gnu.org; 8 Mar 2011 04:42:35 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Pwokl-0007ov-2D for submit@debbugs.gnu.org; Mon, 07 Mar 2011 23:42:35 -0500 Received: from fencepost.gnu.org ([140.186.70.10]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Pwokj-0007og-MU for 2783-done@debbugs.gnu.org; Mon, 07 Mar 2011 23:42:34 -0500 Received: from localhost ([127.0.0.1]:56549) by fencepost.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pwoke-0001PN-Dw; Mon, 07 Mar 2011 23:42:28 -0500 From: Glenn Morris To: 2783-done@debbugs.gnu.org Subject: Re: Additional texinfo-environments References: <17335.194.144.135.59.1238035766.squirrel@www.hafro.is> X-Spook: threat Serbian Peking sweep wire transfer Osama NSA CID X-Ran: ~\Ymqg(ZpC^WBeuB82{S=AJL|!r"wyMBil$U[drB~Mz)5a?HWo X-Hue: red X-Attribution: GM Date: Mon, 07 Mar 2011 23:42:28 -0500 In-Reply-To: <17335.194.144.135.59.1238035766.squirrel@www.hafro.is> (Arni Magnusson's message of "Thu, 26 Mar 2009 02:49:26 -0000 (GMT)") Message-ID: User-Agent: Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Score: -6.3 (------) X-Debbugs-Envelope-To: 2783-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.3 (------) Version: 24.1 Thank you; applied. (By the way, the patch was backwards and had the wrong line endings, but no problem.) From unknown Thu Aug 14 19:14:17 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Tue, 05 Apr 2011 11:24:05 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator