Received: from mx0.gmx.net (mx0.gmx.net [213.165.64.100]) by h1439878.stratoserver.net (8.14.2/8.14.2/Debian-2build1) with SMTP id p9JLl2dp005980 for ; Wed, 19 Oct 2011 23:47:04 +0200 Received: (qmail 5165 invoked by alias); 19 Oct 2011 21:46:57 -0000 Delivered-To: GMX delivery to rainer.schoepf@gmx.net Received: (qmail invoked by alias); 19 Oct 2011 21:46:57 -0000 Received: from relay2.uni-heidelberg.de (EHLO relay2.uni-heidelberg.de) [129.206.210.211] by mx0.gmx.net (mx118) with SMTP; 19 Oct 2011 23:46:57 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [129.206.100.94]) by relay2.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id p9JLggsQ007983 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 19 Oct 2011 23:42:42 +0200 Received: from listserv.uni-heidelberg.de (localhost.localdomain [127.0.0.1]) by listserv.uni-heidelberg.de (8.13.1/8.13.1) with ESMTP id p9JKqWLd030425; Wed, 19 Oct 2011 23:42:39 +0200 Received: by LISTSERV.UNI-HEIDELBERG.DE (LISTSERV-TCP/IP release 16.0) with spool id 1873807 for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Wed, 19 Oct 2011 23:42:39 +0200 Received: from relay2.uni-heidelberg.de (relay2.uni-heidelberg.de [129.206.210.211]) by listserv.uni-heidelberg.de (8.13.1/8.13.1) with ESMTP id p9JLgda4001170 for ; Wed, 19 Oct 2011 23:42:39 +0200 Received: from csep02.cliche.se (csep02.cliche.se [195.249.40.184]) by relay2.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id p9JLgHKQ007877 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 19 Oct 2011 23:42:21 +0200 Received: from nova-2.local (c-94-255-156-147.cust.bredband2.com [94.255.156.147]) by csep02.cliche.se (Postfix) with ESMTP id 9789D73592 for ; Wed, 19 Oct 2011 23:42:15 +0200 (CEST) User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; sv-SE; rv:1.9.2.22) Gecko/20110902 Thunderbird/3.1.14 MIME-Version: 1.0 References: <4E95A9C2.6020607@residenset.net> <4E95C086.7060806@morningstar2.co.uk> <4E96F7BF.9070700@residenset.net> <4E9EA1CF.4040807@residenset.net> Content-Type: multipart/mixed; boundary="------------040209030002080803040506" Message-ID: <4E9F443D.9020703@residenset.net> Date: Wed, 19 Oct 2011 23:42:21 +0200 Reply-To: Mailing list for the LaTeX3 project Sender: Mailing list for the LaTeX3 project From: =?ISO-8859-1?Q?Lars_Hellstr=F6m?= Subject: Re: Church booleans To: LATEX-L@listserv.uni-heidelberg.de In-Reply-To: Precedence: list List-Help: , List-Unsubscribe: List-Subscribe: List-Owner: List-Archive: X-GMX-Antispam: 0 (eXpurgate); Detail=5D7Q89H36p6sJLDpZh614LdjtwLz6vwIs/n1AL26iuRSIxRbldTj5llPnNX89isVJpfbQ VFRvWDXUNvwkQ+TrzN5mtnJnFxmClDljNjfMc1TAYeG7nyhgrYoUTTb9OeHQoLSWPPj9N/sK9KVu b6hz6xjpJTqpffD9tHqbZXaTMeTna2yBNmKdBfgkDwxqIUNKtMo2N6gUfk=V1; X-Resent-By: Forwarder X-Resent-For: rainer.schoepf@gmx.net X-Resent-To: rainer@rainer-schoepf.de Status: R X-Status: X-Keywords: X-UID: 6953 This is a multi-part message in MIME format. --------------040209030002080803040506 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Bruno Le Floch skrev 2011-10-19 18.16: >> A better formatting would be >> >> \bool_if:nTF { >> \bool_pred:n{\l_my_first_bool}&& ( >> \bool_pred:n{\l_my_second_bool}&& >> ! \bool_pred:n{\l_my_third_bool} >> ) >> } > > Still unreadable in my view, because the \bool_pred:n add no > information, and are just there to make TeX happy. Since we can avoid > them altogether, let's do it. We can also avoid these corny infix expressions altogether... ;-) > \bool_if:nTF > { > \l_my_first_bool > && ( > \l_my_second_bool > && ! \l_my_third_bool > ) > } > >> :) But maybe the problem is that&&, (, ), !, and || do not really stan= d out >> from the background of braces and backslashes (far less than against t= he >> background of alphanumeric identifiers you'd encounter in C)? Fortanis= h >> .AND., .OR., and .NOT. would be more eye-catching, but the parentheses= are >> probably a lost cause readability-wise. > > I find&& and || to be more visible than AND and OR in fact (probably > a matter of syntax highlighting in the editor). I find it unlikely that an editor with syntax highlighting for LaTeX woul= d=20 assign special highlighting to || and !, unless someone has specially=20 reconfigured it to do so. >> Well, it depends on the parsing scheme one uses. If instead going for >> delimited-argument style subformula grabbing, then it wouldn't matter = how >> many tokens an expression terminal (predicate) consists of, and as a >> side-effect operation priority becomes straightforward (the operation = you >> split at first gets the lowest priority). What would be tricky for thi= s >> approach is the handling of parentheses, since in that case there are = two >> distinct possibilities for "the next token of interest here", but I th= ink it >> is doable (first split on one, then try to split on the second, and tr= eat >> the combination of the outcomes as a case). > > The other problem with this approach is that my working copy with > Church booleans is now catcode agnostic, while delimited arguments > would require one particular catcode. You are right on the other > arguments for that approach. Catcodes for ADNORT and () don't tend to change much. >> I believe one could preferably structure the whole thing as an expand-= only >> rewrite of infix boolean expression to Church-style compositions of >> booleans. It probably wouldn't be good at catching certain syntax erro= rs, >> though. > > That's a pretty big change. I need some time to ponder it. (And in any > case, changes won't happen before a few weeks from now.) Well, changes could as a matter of fact happen tonight already, since I h= ad=20 just completed my implementation of it when I received your mail. See=20 attached file (I hope it gets through). I've probably picked strange name= s=20 for some macros, but I think the post-colon parts are acceptable. Here's an example: \if_bool_expr:nTF{ ( NOT \l_my_first_bool OR \IfFileExists{latex.ltx} ) AND \l_my_second_bool }{Evaluates~to~true.}{Evaluates~to~false.} This works. And it's done using macros. *Nothing* but macros. >> Consider a command whose role is similar to that of the 2e \makelabel:= A >> user-definable command which gets its argument(s) from more basic leve= ls of >> LaTeX, and is supposed to do something in a configurable way. ((In the= >> future all such commands should be template keys, you say? Why, yes, i= t may >> well be. Template instances will often be defined with \ExplSyntaxOff,= I >> think.)) Suppose further that one of these arguments is a boolean. ((P= oor >> design? Well, such things will happen; it's an open system.)) Now, if = said >> boolean is a Church boolean (effectively \use_i:nn or \use_ii:nn), the= n it >> can be used directly to select between two pieces of code, e.g. like >> >> \def\makesomething#1#2{% Assuming \ExplSyntaxOff >> % #1 is some text >> % #2 is the boolean >> #1% >> #2{ \thetheorem}{}% >> .\ % >> } > > What about \let \ifthenelse \bool_if:nTF ? That doesn't assume > anything about the internals, and allows precisely what you describe > (and is slightly more general, since the user can now use boolean > expressions). I'm not particularly fond of that. In particular, requiring the use of a = command that does fancy expression parsing just for the sake of even usin= g a=20 boolean seems highly wasteful. >>> We could provide \bool_and:nn etc. (or some variation thereof). One >>> problem is where to stop: here you've used the three argument variant= >>> \add:nnn, but we should then provide a four argument variant, etc. >> >> Even if you include everything up to the nine argument forms, you'll e= nd up >> with fewer macros in total than for the alternative. ;-) > > True with the current code, I think, but my new code doesn't need two > separate branches, so that statement becomes false :). Then it _is_ > true that 18 cs is not that much. However, > > \bool_if:nTF > { > \bool_and:nnnnnnn % n? > \l_i_bool > \l_ii_bool > \l_iii_bool > \l_iv_bool > \l_v_bool > \l_vi_bool > \l_vii_bool > \l_viii_bool > } Provided that the booleans are really Church booleans, that \bool_if:nTF = serves no purpose. > is not exactly obvious to update if a boolean is added. The&& version > is simple: add "&& \l_last_bool". Anyone writing expressions with that many clauses deserve a little=20 difficulty in updating them; usually, it is a sign that one is making thi= ngs=20 far too complicated, and should rethink one's approach to the problem. :-= ) Lars Hellstr=F6m --------------040209030002080803040506 Content-Type: multipart/appledouble; boundary="------------ad070602060704010501060903"; x-mac-type="54455854"; x-mac-creator="414C4641"; name="churchbool.dtx" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="churchbool.dtx" --------------ad070602060704010501060903 Content-Type: application/applefile Content-Transfer-Encoding: base64 BxYFAAAAAgAAAAAAAAAAAAAAAAAAAAAABQADAAAAVgAAAA4AAAAJAAAAZAAAACAAAAAIAAAA hAAAABAAAAAEAAAAlAAAAAAAAAACAAAAlAAAAH4BAABjaHVyY2hib29sLmR0eFRYRVRBRkxB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxJQxFmURMhYADG1L3RwyFgAAAQAAAAFMAAAATAAA ADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAlNb25hY28AAP9/BAAAAAAAAAD8BAAA JQAAAAIAAAD//wAGAAgAcwAAAyAB/gBzAAADIAH+ysUFZQAAL68AAC+vAAAt6AEAAAABAAAA AUwAAABMAAAAMkwxggArEwAAABwAMgAATVBTUgAAAAoD7f//AAAAAKQRsCE= --------------ad070602060704010501060903 Content-Type: text/plain; name="churchbool.dtx" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="churchbool.dtx" JSAKJSBcaWZmYWxzZQolPCpkcml2ZXI+Clxkb2N1bWVudGNsYXNze2x0eGRvY30KXGNhdGNv ZGVgXF89MTIKXGJlZ2lue2RvY3VtZW50fQpcRG9jSW5wdXR7Y2h1cmNoYm9vbC5kdHh9Clxl bmR7ZG9jdW1lbnR9CiU8L2RyaXZlcj4KJSBcZmkKJSAKJSAKJSBcdGl0bGV7Q2h1cmNoIGJv b2xlYW4gaW1wbGVtZW50YXRpb25zfQolIFxhdXRob3J7TGFycyBIZWxsc3RyXCJvbX0KJSBc bWFrZXRpdGxlCiUgCiUgXHNlY3Rpb257UHJlbGltaW5hcmllc30KJSAKJSBTaW5jZSBJJ2xs IHByb2JhYmx5IGJlIHdvcmtpbmcgd2l0aGluIGEgXExhVGVYZVwgc3lzdGVtIHdoZW4gCiUg ZGV2ZWxvcGluZyB0aGUgZm9sbG93aW5nLCBJJ2xsIG5lZWQgdG8gcHJvdmlkZSB0aGUgXExh VGVYMyBjb21tYW5kcyAKJSBJJ2xsIHVzZSBzZXBhcmF0ZWx5LgolIAolICAgIFxiZWdpbntt YWNyb2NvZGV9CiU8KjJlPgpcZGVmXEV4cGxTeW50YXhPbnslCiAgIFxjYXRjb2RlICAxMjY9 MTAgXHJlbGF4ICUgdGlsZGUgaXMgYSBzcGFjZSBjaGFyLgogICBcY2F0Y29kZSAgIDMyPTkg IFxyZWxheCAlIHNwYWNlIGlzIGlnbm9yZWQKICAgXGNhdGNvZGUgICAgOT05ICBccmVsYXgg JSB0YWIgYWxzbyBpZ25vcmVkCiAgIFxlbmRsaW5lY2hhciA9MzIgXHJlbGF4ICUgZW5kbGlu ZSBpcyBzcGFjZQogICBcY2F0Y29kZSAgIDk1PTExIFxyZWxheCAlIHVuZGVyc2NvcmUgbGV0 dGVyCiAgIFxjYXRjb2RlICAgNTg9MTEgXHJlbGF4ICUgY29sb24gbGV0dGVyCn0KXGRlZlxF eHBsU3ludGF4T2ZmeyUKICAgXGNhdGNvZGUgIDEyNj0xMyBccmVsYXggJSB0aWxkZSBpcyBh Y3RpdmUuCiAgIFxjYXRjb2RlICAgMzI9MTAgXHJlbGF4ICUgc3BhY2UgaXMgc3BhY2UKICAg XGNhdGNvZGUgICAgOT0xMCBccmVsYXggJSB0YWIgYWxzbyBzcGFjZQogICBcZW5kbGluZWNo YXIgPTEzIFxyZWxheCAlIGVuZGxpbmUgaXMgXl5NCiAgIFxjYXRjb2RlICAgOTU9OCAgXHJl bGF4ICUgdW5kZXJzY29yZSBpcyBzdWJzY3JpcHQKICAgXGNhdGNvZGUgICA1OD0xMiBccmVs YXggJSBjb2xvbiBpcyBvdGhlcgp9ClxFeHBsU3ludGF4T24KXGRlZlxjc19uZXc6TnBue1xs b25nXGRlZn0gJSBGYWtlOiBJZ25vcmVzIGNoZWNraW5nIG5ldyBzdGF0dXMKXGRlZlxjc19z ZXRfZXE6Tk4gIzEgeyBcbGV0ICMxPX4gfQpcZGVmXHFfc3RvcHtcc3RyaW5nXHFfc3RvcH0g JSBJc24ndCB0aGlzIGEgbXVjaCBzYWZlciB3YXkgdG8KXGRlZlxxX21hcmt7XHN0cmluZ1xx X21hcmt9ICUgY29uc3RydWN0IGEgcXVhcms/CiU8LzJlPgolICAgIFxlbmR7bWFjcm9jb2Rl fQolIAolIAolIAolIFxzZWN0aW9ue1RoZSByZWFsIHN0dWZmfQolIAolICAgIFxiZWdpbntt YWNyb2NvZGV9CiU8KmNvZGU+CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgCiUgXHN1YnNlY3Rp b257VGhlIGJvb2xlYW5zIHRoZW1zZWx2ZXN9CiUgCiUgVGhlIHJ1bGVzIG9mIHRoZSBnYW1l IGFyZSB0aGF0IGEgYGBib29sZWFuJycsIGluIHdpZGUgc2Vuc2UsIGlzIAolIGFueXRoaW5n IHdpdGggYW4gb3ZlcmFsbCBzeW50YXggb2YgfDpURnwsIGkuZS4sCiUgXGJlZ2lue3F1b3Rl fQolICAgXG1ldGF7Ym9vbGVhbn1cbWFyZ3t0cnVlIGNvZGV9XG1hcmd7ZmFsc2UgY29kZX0K JSBcZW5ke3F1b3RlfQolIHdpbGwgZXZlbnR1YWxseSBlbmQgdXAgYXMgZWl0aGVyIFxtZXRh e3RydWUgY29kZX0gb3IgXG1ldGF7ZmFsc2UgCiUgY29kZX0sIGRlcGVuZGluZyBvbiB3aGF0 IHZhbHVlIHRoZSBib29sZWFuIGBgZXZhbHVhdGVzIHRvJycuCiUgCiUgXGJlZ2lue21hY3Jv fXtcaWZfdHJ1ZTpURn0KJSBcYmVnaW57bWFjcm99e1xpZl9mYWxzZTpURn0KJSAgIFRoZSBj b25zdGFudCBib29sZWFuIHZhbHVlcyBhcmUgdGhlcmVmb3JlIGlkZW50aWNhbCB0byB0aGUg CiUgICBjbGFzc2ljYWwgaGVscGVyIG1hY3JvcyB8XEBmaXJzdG9mdHdvfCBhbmQgfFxAc2Vj b25kb2Z0d298LgolICAgIFxiZWdpbnttYWNyb2NvZGV9Clxjc19uZXc6TnBuIFxpZl90cnVl OlRGICMxICMyIHsgIzEgfQpcY3NfbmV3Ok5wbiBcaWZfZmFsc2U6VEYgIzEgIzIgeyAjMiB9 CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb31cZW5ke21hY3JvfQolIAolIFxi ZWdpbnttYWNyb317XGlmX2FuZDpublRGfQolIFxiZWdpbnttYWNyb317XGlmX29yOm5uVEZ9 CiUgXGJlZ2lue21hY3JvfXtcaWZfbm90Om5URn0KJSAgIFRoZSBuaWNlIHRoaW5nIGFib3V0 IENodXJjaCBib29sZWFucyBpcyB0aGF0IGJvb2xlYW4gZXhwcmVzc2lvbnMgCiUgICBpbiB0 ZXJtcyBvZiB0aGVtIGNhbiBiZSBjb21wdXRlZCBwdXJlbHkgdXNpbmcgbWFjcm8gZXhwYW5z aW9uLgolICAgQ29uY3JldGVseSwKJSAgIFxiZWdpbntxdW90ZX0KJSAgICAgfFxpZl9hbmQ6 bm5URnxcbWFyZ3tiMX1cbWFyZ3tiMn1cbWFyZ3t0cnVlIGNvZGV9XG1hcmd7ZmFsc2UgY29k ZX0KJSAgIFxlbmR7cXVvdGV9CiUgICBleHBhbmRzIHRvIFxtZXRhe3RydWUgY29kZX0gaWZm IGJvdGggXG1ldGF7YjF9IGFuZCBcbWV0YXtiMX0gCiUgICBldmFsdWF0ZSB0byB0cnVlLCBh bmQgZXhwYW5kcyB0byBcbWV0YXtmYWxzZSBjb2RlfSBvdGhlcndpc2U7CiUgICBcYmVnaW57 cXVvdGV9CiUgICAgIHxcaWZfb3I6bm5URnxcbWFyZ3tiMX1cbWFyZ3tiMn1cbWFyZ3t0cnVl IGNvZGV9XG1hcmd7ZmFsc2UgY29kZX0KJSAgIFxlbmR7cXVvdGV9CiUgICBleHBhbmRzIHRv IFxtZXRhe2ZhbHNlIGNvZGV9IGlmZiBib3RoIFxtZXRhe2IxfSBhbmQgXG1ldGF7YjF9IAol ICAgZXZhbHVhdGUgdG8gZmFsc2UsIGFuZCBleHBhbmRzIHRvIFxtZXRhe3RydWUgY29kZX0g b3RoZXJ3aXNlOwolICAgXGJlZ2lue3F1b3RlfQolICAgICB8XGlmX25vdDpuVEZ8XG1hcmd7 YjF9XG1hcmd7dHJ1ZSBjb2RlfVxtYXJne2ZhbHNlIGNvZGV9CiUgICBcZW5ke3F1b3RlfQol ICAgZXhwYW5kcyB0byBcbWV0YXtmYWxzZSBjb2RlfSBpZmYgXG1ldGF7YjF9IGV2YWx1YXRl IHRvIHRydWUsIGFuZCAKJSAgIGV4cGFuZHMgdG8gXG1ldGF7dHJ1ZSBjb2RlfSBvdGhlcndp c2UuCiUgICAKJSAgIEFsbCBldmFsdWF0aW9uIGlzIHNob3J0LWN1cmN1aXQsIGkuZS4sIGlm IHRoZSByZXN1bHQgaXMga25vd24gCiUgICBmcm9tIGV2YWx1YXRpbmcgXG1ldGF7YjF9IGFs b25lLCB0aGVuIFxtZXRhe2IyfSB3aWxsIG5vdCBiZSAKJSAgIGV2YWx1YXRlZC4KJSAgICBc YmVnaW57bWFjcm9jb2RlfQpcY3NfbmV3Ok5wbiBcaWZfYW5kOm5uVEYgIzEgIzIgeyAjMSB7 IzJ9IHtcaWZfZmFsc2U6VEZ9IH0KXGNzX25ldzpOcG4gXGlmX29yOm5uVEYgIzEgIzIgeyAj MSB7XGlmX3RydWU6VEZ9IHsjMn0gfQpcY3NfbmV3Ok5wbiBcaWZfbm90Om5uVEYgIzEgeyAj MSB7XGlmX2ZhbHNlOlRGfSB7XGlmX3RydWU6VEZ9IH0KJSAgICBcZW5ke21hY3JvY29kZX0K JSBcZW5ke21hY3JvfVxlbmR7bWFjcm99XGVuZHttYWNyb30KJSAKJSBcYmVnaW57bWFjcm99 e1xpZl9hbmQ6bm5uVEZ9CiUgXGJlZ2lue21hY3JvfXtcaWZfb3I6bm5uVEZ9CiUgICBIaWdo ZXIgYXJpdHkgY29uanVuY3Rpb25zIGNhbiBiZSBjb25zdHJ1Y3RlZCBieSBuZXN0aW5nIHRo ZSAKJSAgIGJpbmFyeSBvbmVzLCBidXQgYWxzbyBpbiBhIHNpbmdsZSBzdGVwLgolICAgIFxi ZWdpbnttYWNyb2NvZGV9Clxjc19uZXc6TnBuIFxpZl9hbmQ6bm5uVEYgIzEgIzIgIzMgeyAK ICAgIzEgeyMyIHsjM30ge1xpZl9mYWxzZTpURn0gfSB7XGlmX2ZhbHNlOlRGfSAKfQpcY3Nf bmV3Ok5wbiBcaWZfb3I6bm5uVEYgIzEgIzIgIzMgeyAKICAgIzEge1xpZl90cnVlOlRGfSB7 IzIge1xpZl90cnVlOlRGfSB7IzN9IH0gCn0KJSAgICBcZW5ke21hY3JvY29kZX0KJSAgIE5v dGUgaW4gcGFydGljdWxhciB0aGF0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbmVlZCB0byBiZSBj b3BpZWQuIAolICAgRXhjbHVzaXZlIG9yLCBzaG91bGQgb25lIHdpc2ggdG8gaW1wbGVtZW50 IGl0LCBpcyBub3QgcXVpdGUgc28gCiUgICBuaWNlLgolIFxlbmR7bWFjcm99XGVuZHttYWNy b30KJSAKJSAKJSBcc3Vic2VjdGlvbntDaHVyY2ggYm9vbGVhbnMgYXMgdmFyaWFibGVzfQol IAolIFNpbmNlIENodXJjaCBib29sZWFucyBhcmVuJ3Qgb3JkaW5hcnkgdmFsdWVzLCBidXQg cmF0aGVyIGZ1bmN0aW9ucywgCiUgb25lIG1pZ2h0IGZlZWwgdW5jZXJ0YWluIGFzIHRvIGhv dyBmZWFzaWJsZSBpdCBpcyB0byBzdG9yZSBzdWNoIGEgCiUgYm9vbGVhbiB2YWx1ZSBpbiBh IHZhcmlhYmxlOyBnZXR0aW5nIHRoaXMgd3JvbmcgY291bGQgaW5zdGVhZCBlbmQgCiUgdXAg c3RvcmluZyB0aGUgZXhwcmVzc2lvbiBmb3IgYSBib29sZWFuLCBhbmQgY2F1c2UgaXQgdG8g YmUgCiUgcmVldmFsdWF0ZWQgZWFjaCB0aW1lIHVzZWQuIEhvd2V2ZXIsIHRoZSBzb2x1dGlv biBpcyBleHRyZW1lbHkgCiUgc2ltcGxlLgolIAolIFxiZWdpbnttYWNyb317XGJvb2xfc2V0 Ok5ufQolICAgVGhlIGVmZmVjdCBvZgolICAgXGJlZ2lue3F1b3RlfQolICAgICB8XGJvb2xf c2V0Ok5ufFxtYXJne2NzfVxtYXJne2Jvb2xlYW59CiUgICBcZW5ke3F1b3RlfQolICAgaXMg dG8gZXZhbHVhdGUgdGhlIFxtZXRhe2Jvb2xlYW59IGFuZCBzZXQgdGhlIGNvbnRyb2wgc2Vx dWVuY2UgCiUgICBcbWV0YXtjc30gdG8gZWl0aGVyIHxcaWZfdHJ1ZTpURnwgb3IgfFxpZl9m YWxzZTpURnwgYWNjb3JkaW5nbHkuCiUgICAgXGJlZ2lue21hY3JvY29kZX0KXGNzX25ldzpO cG4gXGJvb2xfc2V0Ok5uICMxICMyIHsgCiAgICMyIHsgXGNzX3NldF9lcTpOTiAjMSBcaWZf dHJ1ZTpURiB9IHsgXGNzX3NldF9lcTpOTiAjMSBcaWZfZmFsc2U6VEYgfQp9CiUgICAgXGVu ZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb30KJSAKJSAKJSBcc3Vic2VjdGlvbntJbmZpeCBl eHByZXNzaW9ucyBvZiBDaHVyY2ggYm9vbGVhbnN9CiUgCiUgQWx0aG91Z2ggQ2h1cmNoIGJv b2xlYW5zIGFyZSBtb3N0IGF0IGhvbWUgd2l0aGluIGEgcHJlZml4IG5vdGF0aW9uLCAKJSBp dCB0dXJucyBvdXQgdG8gYWxzbyBiZSBwb3NzaWJsZSB0byBmb3JtIGluZml4IGV4cHJlc3Np b25zIG9mIHRoZW0sIAolIHdpdGhpbiBhIHN1aXRhYmxlIHBhcnNpbmcgZnJhbWV3b3JrLiBU aGUgYm9vbGVhbiBleHByZXNzaW9uIHN5bnRheCAKJSBzdXBwb3J0ZWQgaGVyZSBpcwolIFxi ZWdpbntkZXNjcmlwdGlvbn0KJSAgIFxkZWZcbWFrZWxhYmVsIzF7XG1ldGF7IzF9flxlbnN1 cmVtYXRoe1xsb25nbGVmdGFycm93fX0KJSAgIFxpdGVtW2V4cHJlc3Npb25dCiUgICAgIFxt ZXRhe3Rlcm19ICRcbWlkJCBcbWV0YXt0ZXJtfSB8T1J8IFxtZXRhe2V4cHJlc3Npb259CiUg ICBcaXRlbVt0ZXJtXQolICAgICBcbWV0YXtmYWN0b3J9ICRcbWlkJCBcbWV0YXtmYWN0b3J9 IHxBTkR8IFxtZXRhe3Rlcm19CiUgICBcaXRlbVtmYWN0b3JdCiUgICAgIFxtZXRhe3Rlcm1p bmFsfSAkXG1pZCQgfE5PVHwgXG1ldGF7ZmFjdG9yfQolICAgXGl0ZW1bdGVybWluYWxdCiUg ICAgIFxtZXRhe0NodXJjaCBib29sZWFufSAkXG1pZCQgfCh8IFxtZXRhe2V4cHJlc3Npb259 IHwpfAolIFxlbmR7ZGVzY3JpcHRpb259CiUgKE5vdGUgdGhlIHBhcmVudGhlc2VzIGluIHRo ZSBsYXN0IGJyYW5jaC4pCiUgCiUgVGhlIHVuZXhwZWN0ZWQgY29udHJhcG9zaXRpdmUgb2Yg dGhlIGFib3ZlIHN5bnRheCBzcGVjaWZpY2F0aW9uIGlzIAolIHRoYXQgYW55dGhpbmcgd2hp Y2ggaXMgcGFydCBvZiBzb21ldGhpbmcgcHV0IGZvcnRoIGFzIGFuIAolIFxtZXRhe2V4cHJl c3Npb259IGFuZCB3aGljaCBpcyBub3QgcGFydCBvZiBhbiB8QU5EfCwgfE9SfCwgfE5PVHws IAolIHwofCwgb3IgfCl8IHdpbGwgYmUgYXNzdW1lZCB0byBiZSBwYXJ0IG9mIFxtZXRhe0No dXJjaCBib29sZWFufS4gCiUgVHlwb3MgbWF5IHRoZXJlZm9yZSBsZWFkIHRvIGhpZ2hseSBz dXJwcmlzaW5nIHJlc3VsdHNcZG90cwolIAolIAolIFxzdWJzdWJzZWN0aW9ue0RldGVjdGlu ZyByZXNlcnZlZCB3b3Jkc30KJSAKJSBUaGUgYGByZXNlcnZlZCB3b3JkcycnIGluIGFuIGV4 cHJlc3Npb24gYXJlIHxBTkR8LCB8T1J8LCB8Tk9UfCwgCiUgfCh8LCBhbmQgfCl8LiBGb3Ig ZWFjaCBvZiB0aGVzZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgYSB0ZXN0IGZvciAKJSB3 aGV0aGVyIHRoYXQgd29yZCBvY2N1cnMgaW4gYSB0b2tlbiBzZXF1ZW5jZSAobm90IGNvdW50 aW5nIAolIG9jY3VycmVuY2llcyBiZXR3ZWVuIGJyYWNlcykuIFRoZXNlIHRlc3RzIGFyZSBi YXNlZCBvbiBzdGFuZGFyZCAKJSBleHBsb2l0cyBvZiB0cmlja2VyaWVzIG1hZGUgcG9zc2li bGUgYnkgXFRlWCdzIHJ1bGVzIGZvciBtYXRjaGluZyAKJSBkZWxpbWl0ZWQgYW5kIHVuZGVs aW1pdGVkIGFyZ3VtZW50cy4KJSAKJSBcYmVnaW57bWFjcm99e1xpZl9BTkRfaW46blRGfQol ICAgVGhpcyBtYWNybyBpcyBhIENodXJjaCBib29sZWFuIGlmIHVzZWQgYXMKJSAgIFxiZWdp bntxdW90ZX0KJSAgICAgfFxpZl9BTkRfaW46blRGfFxtYXJne2V4cHJlc3Npb24gZnJhZ21l bnR9CiUgICBcZW5ke3F1b3RlfQolICAgSXQgZXZhbHVhdGVzIHRvIHRydWUgKHB1cmVseSBi eSBleHBhbnNpb24pIGlmZiB0aGUgdGhyZWUgdG9rZW4gCiUgICBzZXF1ZW5jZSB8QU5EfCBv Y2N1cnMgdW5icmFjZWQgaW4gdGhlIFxtZXRhe2V4cHJlc3Npb24gZnJhZ21lbnR9LgolICAg IFxiZWdpbnttYWNyb2NvZGV9Clxjc19uZXc6TnBuIFxpZl9BTkRfaW46blRGICMxIHsKICAg XGlmX0FORF9pbl9oZWxwZXI6dyAjMSBBTkQgXHFfbWFyayBcaWZfdHJ1ZTpURiBccV9tYXJr IFxpZl9mYWxzZTpURgogICAgIFxxX3N0b3AKfQpcY3NfbmV3Ok5wbiBcaWZfQU5EX2luX2hl bHBlcjp3ICMxIEFORCAjMiAjMyBccV9tYXJrICM0ICM1IFxxX3N0b3AgeyM0fQolICAgIFxl bmR7bWFjcm9jb2RlfQolICAgVGhlIHdheSBpdCB3b3JrcyBpcyB0aGF0IGlmIHRoZXJlIGlz IGFuIHxBTkR8IGluIHRoZSAKJSAgIFxtZXRhe2V4cHJlc3Npb24gZnJhZ21lbnR9LCB0aGVu IGluIHRoZSBleHBhbnNpb24gb2YgCiUgICB8XGlmX0FORF9pbl9oZWxwZXI6d3wsIHwjMXwg d2lsbCBjb25zaXN0IG9mIGV2ZXJ5dGhpbmcgdXAgdG8gdGhhdCAKJSAgIHxBTkR8LCBzbyB8 IzIjM3wgd2lsbCBjb25zaXN0IG9mIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGZpcnN0IAolICAg fFxxX21hcmt8LCBhbmQgaGVuY2UgfCM0fCB3aWxsIGJlIHRoZSB8XGlmX3RydWU6VEZ8LiBJ ZiBvbiB0aGUgb3RoZXIgCiUgICBoYW5kIHRoZXJlIGlzIG5vIHxBTkR8LCB0aGVuIHwjMXwg d2lsbCBjb25zaXN0IG9mIHRoZSB3aG9sZSAKJSAgIFxtZXRhe2V4cHJlc3Npb24gZnJhZ21l bnR9LCB8IzJ8IHdpbGwgYmUgdGhlIGZpcnN0IHxccV9tYXJrfCwgYW5kIAolICAgfCM0fCB0 aGVyZWZvcmUgd2hhdCBmb2xsb3dzIGFmdGVyIHRoZSBzZWNvbmQgfFxxX21hcmt8LCBuYW1l bHkgCiUgICB8XGlmX2ZhbHNlOlRGfC4KJSBcZW5ke21hY3JvfQolIAolIFxiZWdpbnttYWNy b317XGlmX09SX2luOm5URn0KJSBcYmVnaW57bWFjcm99e1xpZl9OT1RfaW46blRGfQolIFxi ZWdpbnttYWNyb317XGlmX2xwYXJlbl9pbjpuVEZ9CiUgXGJlZ2lue21hY3JvfXtcaWZfcnBh cmVuX2luOm5URn0KJSAgIFRoZSByZW1haW5pbmcgcmVzZXJ2ZWQgd29yZHMgYXJlIGRldGVj dGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5LgolICAgIFxiZWdpbnttYWNyb2NvZGV9Clxj c19uZXc6TnBuIFxpZl9PUl9pbjpuVEYgIzEgewogICBcaWZfT1JfaW5faGVscGVyOncgIzEg T1IgXHFfbWFyayBcaWZfdHJ1ZTpURiBccV9tYXJrIFxpZl9mYWxzZTpURgogICAgIFxxX3N0 b3AKfQpcY3NfbmV3Ok5wbiBcaWZfT1JfaW5faGVscGVyOncgIzEgT1IgIzIgIzMgXHFfbWFy ayAjNCAjNSBccV9zdG9wIHsjNH0KXGNzX25ldzpOcG4gXGlmX05PVF9pbjpuVEYgIzEgewog ICBcaWZfTk9UX2luX2hlbHBlcjp3ICMxIE5PVCBccV9tYXJrIFxpZl90cnVlOlRGIFxxX21h cmsgXGlmX2ZhbHNlOlRGCiAgICAgXHFfc3RvcAp9Clxjc19uZXc6TnBuIFxpZl9OT1RfaW5f aGVscGVyOncgIzEgTk9UICMyICMzIFxxX21hcmsgIzQgIzUgXHFfc3RvcCB7IzR9Clxjc19u ZXc6TnBuIFxpZl9scGFyZW5faW46blRGICMxIHsKICAgXGlmX2xwYXJlbl9pbl9oZWxwZXI6 dyAjMSAoIFxxX21hcmsgXGlmX3RydWU6VEYgXHFfbWFyayBcaWZfZmFsc2U6VEYKICAgICBc cV9zdG9wCn0KXGNzX25ldzpOcG4gXGlmX2xwYXJlbl9pbl9oZWxwZXI6dyAjMSAoICMyICMz IFxxX21hcmsgIzQgIzUgXHFfc3RvcCB7IzR9Clxjc19uZXc6TnBuIFxpZl9ycGFyZW5faW46 blRGICMxIHsKICAgXGlmX3JwYXJlbl9pbl9oZWxwZXI6dyAjMSApIFxxX21hcmsgXGlmX3Ry dWU6VEYgXHFfbWFyayBcaWZfZmFsc2U6VEYKICAgICBccV9zdG9wCn0KXGNzX25ldzpOcG4g XGlmX3JwYXJlbl9pbl9oZWxwZXI6dyAjMSApICMyICMzIFxxX21hcmsgIzQgIzUgXHFfc3Rv cCB7IzR9CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb31cZW5ke21hY3JvfVxl bmR7bWFjcm99XGVuZHttYWNyb30KJSAKJSAKJSAKJSBcc3Vic3Vic2VjdGlvbntQYXJzaW5n IHBhcmVudGhlc2lzLWZyZWUgZXhwcmVzc2lvbnN9CiUgCiUgRm9yIHN0YXJ0ZXJzLCB3ZSB3 aWxsIGNvbnNpZGVyIHBhcnNpbmcgZXhwcmVzc2lvbnMgd2l0aG91dCAKJSBwYXJlbnRoZXNl cy4gVGhlIHN5bnRheCByZWxldmFudCBmb3IgdGhpcyBpcyB0aHVzOgolIFxiZWdpbntkZXNj cmlwdGlvbn0KJSAgIFxkZWZcbWFrZWxhYmVsIzF7XG1ldGF7IzF9flxlbnN1cmVtYXRoe1xs b25nbGVmdGFycm93fX0KJSAgIFxpdGVtW25vcGFyLWV4cHJlc3Npb25dCiUgICAgIFxtZXRh e25vcGFyLXRlcm19ICRcbWlkJCAKJSAgICAgXG1ldGF7bm9wYXItdGVybX0gfE9SfCBcbWV0 YXtub3Bhci1leHByZXNzaW9ufQolICAgXGl0ZW1bbm9wYXItdGVybV0KJSAgICAgXG1ldGF7 bm9wYXItZmFjdG9yfSAkXG1pZCQgCiUgICAgIFxtZXRhe25vcGFyLWZhY3Rvcn0gfEFORHwg XG1ldGF7bm9wYXItdGVybX0KJSAgIFxpdGVtW25vcGFyLWZhY3Rvcl0KJSAgICAgXG1ldGF7 Q2h1cmNoIGJvb2xlYW59ICRcbWlkJCB8Tk9UfCBcbWV0YXtub3Bhci1mYWN0b3J9CiUgXGVu ZHtkZXNjcmlwdGlvbn0KJSBBIHN0cmFpZ2h0Zm9yd2FyZCB0ZWNobmlxdWUgZm9yIHRoaXMg aXMgdG8gY2hlY2sgaWYgdGhlIHRoaW5nIHdlJ3JlIAolIHBhcnNpbmcgY29udGFpbnMgdGhl IHJlc2VydmVkIHdvcmQgYXQgdGhpcyBsZXZlbCwgYW5kIGlmIHNvIHNwbGl0IAolIGF0IHRo YXQgd29yZCBhbmQgcGFyc2UgdGhlIHBhcnRzIHNlcGFyYXRlbHksIG9yIGVsc2UgcmVwYXJz ZSB0aGUgCiUgdGhpbmcgYXMgdGhlIG5leHQgc2ltcGxlciB0aGluZy4gVGhpcyB3aWxsIGxl YWQgdG8gc3ViZXhwcmVzc2lvbnMgCiUgYmVpbmcgcGFyc2VkIGxhemlseSwgd2hpY2ggaXMg cHJvYmFibHkgYSBnb29kIHRoaW5nLgolIAolIFxiZWdpbnttYWNyb317XGlmX25vcGFyZXhw cjpuVEZ9CiUgICBUbyBpbGx1c3RyYXRlIHRoaXMgdGVjaG5pcXVlLCBoZXJlIGlzIHRoZSB0 b3AgbGV2ZWwgcGFyc2VyIGZvciAKJSAgIFxtZXRhe25vcGFyLWV4cHJlc3Npb259cy4gSXRz IGpvYiBpcyB0byB0dXJuCiUgICBcYmVnaW57cXVvdGV9CiUgICAgIHxcaWZfbm9wYXJleHBy Om5URnt8XG1ldGF7bm9wYXItdGVybX18IE9SIHxeXkEKJSAgICAgXG1ldGF7bm9wYXItZXhw cmVzc2lvbn18fXwKJSAgIFxlbmR7cXVvdGV9CiUgICBpbnRvCiUgICBcYmVnaW57cXVvdGV9 CiUgICAgIHxcaWZfb3I6bm5URnsgXGlmX25vcGFydGVybTpuVEZ8XG1hcmd7bm9wYXItdGVy bX0gfH17fAolICAgICB8XGlmX25vcGFyZXhwcjpuVEZ8XG1hcmd7bm9wYXItZXhwcmVzc2lv bn0gfH18CiUgICBcZW5ke3F1b3RlfQolICAgYW5kCiUgICBcYmVnaW57cXVvdGV9CiUgICAg IHxcaWZfbm9wYXJleHByOm5URnxcbWFyZ3tub3Bhci10ZXJtfQolICAgXGVuZHtxdW90ZX0K JSAgIGludG8KJSAgIFxiZWdpbntxdW90ZX0KJSAgICAgfFxpZl9ub3BhcnRlcm06blRGfFxt YXJne25vcGFyLXRlcm19CiUgICBcZW5ke3F1b3RlfQolICAgRnJvbSB0aGlzIGRlc2NyaXB0 aW9uLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgbmV4dCB0byBvYnZpb3VzLgolICAgIFxiZWdp bnttYWNyb2NvZGV9Clxjc19uZXc6TnBuIFxpZl9ub3BhcmV4cHI6blRGICMxIHsKICAgXGlm X09SX2luOm5URnsjMX17CiAgICAgIFxpZl9ub3BhcmV4cHJfc3BsaXQ6dyAjMVxxX3N0b3AK ICAgfXsKICAgICAgXGlmX25vcGFydGVybTpuVEZ7IzF9CiAgIH0KfQpcY3NfbmV3Ok5wbiBc aWZfbm9wYXJleHByX3NwbGl0OncgIzEgT1IgIzIgXHFfc3RvcCB7CiAgIFxpZl9vcjpublRG eyBcaWZfbm9wYXJ0ZXJtOm5URnsjMX0gfXsgXGlmX25vcGFyZXhwcjpuVEZ7IzJ9IH0KfQol ICAgIFxlbmR7bWFjcm9jb2RlfQolICAgRm9yIHNsaWdodGx5IGxhcmdlciBzcGVlZCAoYW5k IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdG9rZW5zKSwgb25lIAolICAgY291bGQgcHJlZXhw YW5kIHRoZSB8XGlmX29yOm5uVEZ8LCBtYWtpbmcgdGhlIGFib3ZlIGluc3RlYWQKJVxiZWdp bnt2ZXJiYXRpbX0KJSBcY3NfbmV3Ok5wbiBcaWZfbm9wYXJleHByX3NwbGl0OncgIzEgT1Ig IzIgXHFfc3RvcCB7CiUgICAgXGlmX25vcGFydGVybTpuVEZ7IzF9IFxpZl90cnVlOlRGIHsg XGlmX25vcGFyZXhwcjpuVEZ7IzJ9IH0KJSAgICAKJSB9CiVcZW5ke3ZlcmJhdGltfQolIFxl bmR7bWFjcm99CiUgCiUgXGJlZ2lue21hY3JvfXtcaWZfbm9wYXJ0ZXJtOm5URn0KJSAgIFdp dGggdGhlIGFib3ZlIGluIG1pbmQsIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBvZiBhIG1h Y3JvIGZvciAKJSAgIGRvaW5nIHRlcm1zIHNob3VsZCBob2xkIG5vIHN1cnByaXNlcy4KJSAg ICBcYmVnaW57bWFjcm9jb2RlfQpcY3NfbmV3Ok5wbiBcaWZfbm9wYXJ0ZXJtOm5URiAjMSB7 CiAgIFxpZl9BTkRfaW46blRGeyMxfXsKICAgICAgXGlmX25vcGFydGVybV9zcGxpdDp3ICMx XHFfc3RvcAogICB9ewogICAgICBcaWZfbm9wYXJmYWN0b3I6blRGeyMxfQogICB9Cn0KXGNz X25ldzpOcG4gXGlmX25vcGFydGVybV9zcGxpdDp3ICMxIEFORCAjMiBccV9zdG9wIHsKICAg XGlmX2FuZDpublRGeyBcaWZfbm9wYXJmYWN0b3I6blRGeyMxfSB9eyBcaWZfbm9wYXJ0ZXJt Om5URnsjMn0gfQp9CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb30KJSAKJSBc YmVnaW57bWFjcm99e1xpZl9ub3BhcmZhY3RvcjpuVEZ9CiUgICBGb3IgaGFuZGxpbmcgfE5P VHwsIHdlIGFjdHVhbGx5IGRvIHRoaXMga2luZCBvZiBwcmVleHBhbnNpb24sIAolICAgc2lu Y2UgaXQgaXMgc28gZXh0cmVtZWx5IGVhc3kuIEEgcG9pbnQgb2YgZG9pbmcgdGhpcyBpcyB0 aGF0IGl0IAolICAgc2ltcGxpZmllcyBhIGNvbXBhcmlzb24gd2l0aCBhIHBhcnNlciB0aGF0 IHdvdWxkIGVsaW1pbmF0ZSBkb3VibGUgCiUgICBuZWdhdGlvbnMgYmVmb3JlIGV2YWx1YXRp bmcgdGhlIHRlcm1pbmFsIGJvb2xlYW47IHRoYXQgdHVybnMgb3V0IAolICAgdG8gYmUgYW4g dW5uZWNlc3NhcnkgY29tcGxpY2F0aW9uLCBzaW5jZSBldmVuIHdvcmtpbmcgb3V0IHdoZXRo ZXIgCiUgICB3ZSBoYXZlIHBhcnNlZCBhbiBldmVuIG9yIG9kZCBudW1iZXIgb2YgfE5PVHxz IGluIHRoaXMgCiUgICBcbWV0YXtub3Bhci1mYWN0b3J9IGFtb3VudHMgdG8gYXQgbGVhc3Qg YXMgbXVjaCB3b3JrIGFzIHRoZSAKJSAgIG5lZ2F0aW9ucyB0aGF0IHRoZSBhYm92ZSB3b3Vs ZCBjb25zdHJ1Y3QgZnJvbSB0aGUgd2hvbGUgdGhpbmcuCiUgICAgXGJlZ2lue21hY3JvY29k ZX0KXGNzX25ldzpOcG4gXGlmX25vcGFyZmFjdG9yOm5URiAjMSB7CiAgIFxpZl9OT1RfaW46 blRGeyMxfXsKICAgICAgXGlmX25vcGFyZmFjdG9yX3NwbGl0OncgIzFccV9zdG9wCiAgIH17 CiAgICAgICMxCiUgICAgXGVuZHttYWNyb2NvZGV9CiUgICBJbnNlcnRpbmcgYSB8XHVzZV9p Om58IGluIGZyb250IG9mIHRoYXQgfCMxfCwgd2hpbGUgXGVtcGh7bm90fSAKJSAgIHdyYXBw aW5nIHRoZSB8IzF8IGluIGJyYWNlcywgc2hvdWxkIGhhdmUgdGhlIGVmZmVjdCBvZiBnb2Ji bGluZyAKJSAgIGFsbCBzcGFjZXMgaW4gZnJvbnQgb2YgdGhlIHRlcm1pbmFsIGJvb2xlYW5z IGluIGFuIGV4cHJlc3Npb24uIAolICAgU3BhY2VzIGZvbGxvd2luZyB0aGVtIGFyZSBnb2Ji bGVkIGFscmVhZHkgYnkgc29tZSB8XGlmX3RydWU6VEZ8IAolICAgb3IgfFxpZl9mYWxzZTpU RnwuCiUgICAgXGJlZ2lue21hY3JvY29kZX0KICAgfQp9Clxjc19uZXc6TnBuIFxpZl9ub3Bh cmZhY3Rvcl9zcGxpdDp3ICMxIE5PVCAjMiBccV9zdG9wIHsKICAgIzIgXGlmX2ZhbHNlOlRG IFxpZl90cnVlOlRGCn0KJSAgICBcZW5ke21hY3JvY29kZX0KJSBcZW5ke21hY3JvfQolIAol IAolIFxzdWJzdWJzZWN0aW9ue1BhcnNpbmcgZ2VuZXJhbCBleHByZXNzaW9uc30KJSAKJSBU aGUgaWRlYSB1c2VkIGZvciBwYXJzaW5nIGdlbmVyYWwgZXhwcmVzc2lvbnMgaXMgdG8gcmVw bGFjZSAKJSBwYXJlbnRoZXNlcyBub3QgY29udGFpbmluZyBhbm90aGVyIHBhcmVudGhlc2lz IHdpdGggYSAKJSB8XGlmX25vcGFyZXhwcjpuVEZ8IGNhbGwsIHNpbmNlIHRoYXQgaXMgYSBc bWV0YXtDaHVyY2ggYm9vbGVhbn0gYW5kIAolIHRodXMgc3ludGFjdGljYWxseSB2YWxpZCBh dCB0aGF0IHBvaW50OyB0aGlzIHByb2Nlc3MgaXMgcmVwZWF0ZWQgCiUgdW50aWwgbm8gcGFy ZW50aGVzZXMgcmVtYWluLCBhdCB3aGljaCBwb2ludCB3ZSBoYXZlIGEgCiUgXG1ldGF7bm9w YXItZXhwcmVzc2lvbn0uCiUgCiUgXGJlZ2lue21hY3JvfXtcaWZfYm9vbF9leHByOm5URn0K JSAgIFdoZW4gbG9jYXRpbmcgYSBwYXJlbnRoZXNpcyB0byBjb252ZXJ0LCBpdCBpcyBjb252 ZW5pZW50IHRvIHN0YXJ0IAolICAgd2l0aCB0aGUgZW5kIG9mIGl0LCBhcyB0aGUgZmlyc3Qg cmlnaHQgcGFyZW50aGVzaXMgaW4gYW4gCiUgICBcbWV0YXtleHByZXNzaW9ufSBhbHdheXMg Y2xvc2VzIGEgcGFyZW50aGVzaXMgbm90IGNvbnRhaW5pbmcgCiUgICBhbm90aGVyIHBhcmVu dGhlc2lzLgolICAgIFxiZWdpbnttYWNyb2NvZGV9Clxjc19uZXc6TnBuIFxpZl9ib29sX2V4 cHI6blRGICMxIHsKICBcaWZfcnBhcmVuX2luOm5URiB7IzF9IHsKICAgICBcYm9vbF9maXJz dF9ycGFyZW5fc3BsaXQ6dyAjMSBccV9zdG9wCiAgfXsKICAgICBcaWZfbm9wYXJleHByOm5U RnsjMX0KICB9Cn0KJSAgICBcZW5ke21hY3JvY29kZX0KJSBcZW5ke21hY3JvfQolIAolIFxi ZWdpbnttYWNyb317XGZpcnN0X3JwYXJlbl9zcGxpdDp3fQolICAgQWZ0ZXIgZmluZGluZyB0 aGUgcmlnaHQgcGFyZW50aGVzaXMsIG9uZSBtdXN0IGxvb2sgZm9yIGEgbWF0Y2hpbmcgCiUg ICBsZWZ0IHBhcmVudGhlc2lzLgolICAgIFxiZWdpbnttYWNyb2NvZGV9Clxjc19uZXc6TnBu IFxib29sX2ZpcnN0X3JwYXJlbl9zcGxpdDp3ICMxICkgIzIgXHFfc3RvcCB7CiAgIFxpZl9s cGFyZW5faW46blRGIHsgIzEgfSB7CiAgICAgIFxib29sX2ZpcnN0X2xwYXJlbl9zcGxpdDp3 ICMxIFxxX3N0b3AgeyMyfQogICB9ewolICAgIFxlbmR7bWFjcm9jb2RlfQolICAgVGhlIGNh c2UgdGhhdCB0aGVyZSBpc24ndCBhIGxlZnQgcGFyZW50aGVzaXMgaXMgYW4gZXJyb3IgdGhh dCAKJSAgIHdlIGFjdHVhbGx5IGNhbiBkZXRlY3QhIFRoZSBvbmx5IHByb2JsZW0gaXMgd2hh dCB0byBkbyBhYm91dCBpdCwgCiUgICBzaW5jZSB3ZSBtYXkgYmUgaW4gZXhwYW5kLW9ubHkg bGFuZCBoZXJlLiBPbmUgd2F5IG9mIHJhaXNpbmcgYW4gCiUgICBlcnJvciBpcyB0byByZWZl ciB0byBhbiB1bmRlZmluZWQgYnV0IHJlYWRhYmx5IG5hbWVkIGNvbnRyb2wgCiUgICBzZXF1 ZW5jZS4KJSAgICBcYmVnaW57bWFjcm9jb2RlfQogICAgICBcdXNlOmN7Tm9+bWF0Y2hpbmd+ bGVmdH5wYXJlbnRoZXNpc35pbn5ib29sZWFufmV4cHJlc3Npb24hfQolICAgIFxlbmR7bWFj cm9jb2RlfQolICAgSXQgbWF5IGluIHRoaXMgc2l0dWF0aW9uIGJlIHRlbXB0aW5nIHRvIHRo cm93IGF3YXkgYm90aCB0aGUgfFR8IAolICAgYW5kIHxGfCBhcmd1bWVudHMgdXAgYWhlYWQs IGJ1dCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc3Vycm91bmRpbmcgCiUgICBtYWNyb3MgKGUuZy5+ YSB8XGlmX25vdDpuVEZ8KSB0aGF0IGNhbiBqdXN0IGFzIHdlbGwgbGVhZCB0byBib3RoIAol ICAgdGhlIGV2ZW50dWFsIFxtZXRhe3RydWUtY29kZX0gYW5kIGRpdHRvIFxtZXRhe2ZhbHNl LWNvZGV9IGJlaW5nIAolICAgZXhlY3V0ZWQsIGFzIHdlbGwgYXMgYSBqdW1ibGUgb2YgYml6 YXJyZSBlcnJvcnMuIEp1c3QgcGlja2luZyBvbmUgCiUgICBicmFuY2ggY2FuIHN0aWxsIGxl YWQgdG8gZnVydGhlciBlcnJvcnMsIGJ1dCBob3BlZnVsbHkgbm90IAolICAgZHJhbWF0aWNh bGx5IG1hbnkgb2YgdGhlbS4KJSAgICBcYmVnaW57bWFjcm9jb2RlfQogICAgICBcaWZfZmFs c2U6VEYKICAgfQp9CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb30KJSAKJSBc YmVnaW57bWFjcm99e1xib29sX2ZpcnN0X2xwYXJlbl9zcGxpdDp3fQolIFxiZWdpbnttYWNy b317XGJvb2xfbGFzdF9scGFyZW5fc3BsaXQ6d30KJSAgIFRoZSBtYXRjaGluZyBsZWZ0IHBh cmVudGhlc2lzIHdlJ3JlIGxvb2tpbmcgZm9yIGlzIHRoZSBsYXN0IG9uZSAKJSAgIGJlZm9y ZSB0aGUgcHJldmlvdXNseSBkZXRlY3RlZCByaWdodCBwYXJlbnRoZXNpcy4gXFRlWFwgbWFj cm9zIGNhbiAKJSAgIG9ubHkgcGljayBvdXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSB0 b2tlbiBob3dldmVyLCBzbyBpbiBvcmRlciAKJSAgIHRvIGZpbmQgdGhlIGxhc3Qgb25lIGl0 IGJlY29tZXMgbmVjZXNzYXJ5IHRvIGRvIHNvbWUgbG9vcGluZyBieSAKJSAgIG1lYW5zIG9m IHRhaWwgcmVjdXJzaW9uLiBUbyB0aGF0IGVuZCwgdGhpcyBtYWNybyBoYXMgdGhlIGNhbGwg CiUgICBzeW50YXgKJSAgIFxiZWdpbntxdW90ZX0KJSAgICAgfFxib29sX2xhc3RfbHBhcmVu X3NwbGl0Ond8IFxtZXRhe2ZyYWdtZW50fSB8XHFfc3RvcHwKJSAgICAgXG1hcmd7cHJlZml4 fSBcbWFyZ3tzdWZmaXh9CiUgICBcZW5ke3F1b3RlfQolICAgd2l0aCB0aGUgdG9rZW4gc2Vx dWVuY2UKJSAgIFxiZWdpbntxdW90ZX0KJSAgICAgXG1ldGF7cHJlZml4fXwofFxtZXRhe2Zy YWdtZW50fXwpfFxtZXRhe3N1ZmZpeH0KJSAgIFxlbmR7cXVvdGV9CiUgICBhbiBpbnZhcmlh bnQgb2YgdGhlIGxvb3AuIE1hdGVyaWFsIGlzIGhvd2V2ZXIgYmVpbmcgbW92ZWQgZnJvbSAK JSAgIFxtZXRhe2ZyYWdtZW50fSB0byBcbWV0YXtwcmVmaXh9LgolICAgCiUgICAgXGJlZ2lu e21hY3JvY29kZX0KXGNzX25ldzpOcG4gXGJvb2xfbGFzdF9scGFyZW5fc3BsaXQ6dyAjMSAo ICMyIFxxX3N0b3AgIzMgIzQgewogICBcaWZfbHBhcmVuX2luOm5URiB7ICMyIH0gewogICAg ICBcYm9vbF9sYXN0X2xwYXJlbl9zcGxpdDp3ICMyIFxxX3N0b3AgeyMzKCMxfSB7IzR9CiAg IH17CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgICBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGxl ZnQgcGFyZW50aGVzZXMgaW4gfCMyfCwgdGhlbiBpdCB3aWxsIGJlIAolICAgcHJlY2lzZWx5 IHRoZSBcbWV0YXtub3Bhci1leHByZXNzaW9ufSB0aGF0IHRoZSBmaXJzdCByaWdodCAKJSAg IHBhcmVudGhlc2lzIGVuZGVkLCBzbyB3ZSBjYW4gbm93IGNvbnZlcnQgaXQgdG8gYW4gCiUg ICB8XGlmX25vcGFyZXhwcjpuVEZ8LiBOb3RlIHRoYXQgdGhhdCB3aWxsIHN0aWxsIGJlIGlu c2VydGVkIGludG8gCiUgICBhbiB8XGlmX2Jvb2xfZXhwcjpuVEZ8OyBpdCB3aWxsIG11dGF0 ZSBpdHNlbGYgdG8gYW4gCiUgICB8XGlmX25vcGFyZXhwcjpuVEZ8IGluIGR1ZSB0aW1lLCB3 aGVuIHRoZXJlIGFyZSBubyBwYXJlbnRoZXNlcyAKJSAgIGxlZnQgaW4gaXQuCiUgICAgXGJl Z2lue21hY3JvY29kZX0KICAgICAgXGlmX2Jvb2xfZXhwcjpuVEZ7ICMzICggIzEgXGlmX25v cGFyZXhwcjpuVEZ7IzJ9ICM0IH0KICAgfQp9CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgICAK JSAgIFRoZXJlIGlzLCBob3dldmVyLCBhIGNvbXBsaWNhdGlvbiBmb3IgdGhlIGZpcnN0IGl0 ZXJhdGlvbiwgaW4gCiUgICB0aGF0IHRoZSBcbWV0YXtmcmFnbWVudH0gYXQgdGhhdCBwb2lu dCBpcyBub3QgcHJlY2VkZWQgYnkgYSBsZWZ0IAolICAgcGFyZW50aGVzaXMuIEhlbmNlIHdl IG5lZWQgYSBzZXBhcmF0ZSBpdGVyYXRpb24gbWFjcm8gYXQgdGhhdCAKJSAgIHBvaW50LCB3 aXRoIHRoZSBzbGlnaHRseSBzaW1wbGVyIHN5bnRheAolICAgXGJlZ2lue3F1b3RlfQolICAg ICB8XGJvb2xfZmlyc3RfbHBhcmVuX3NwbGl0Ond8IFxtZXRhe2ZyYWdtZW50fSB8XHFfc3Rv cHwKJSAgICAgXG1hcmd7c3VmZml4fQolICAgXGVuZHtxdW90ZX0KJSAgIHN1Y2ggdGhhdCBp dCBpcwolICAgXGJlZ2lue3F1b3RlfQolICAgICBcbWV0YXtmcmFnbWVudH18KXxcbWV0YXtz dWZmaXh9CiUgICBcZW5ke3F1b3RlfQolICAgdGhhdCBpcyBlcXVhbCB0byB0aGUgYWJvdmUg aW52YXJpYW50IHRva2VuIHNlcXVlbmNlLgolICAgCiUgICAgXGJlZ2lue21hY3JvY29kZX0K XGNzX25ldzpOcG4gXGJvb2xfZmlyc3RfbHBhcmVuX3NwbGl0OncgIzEgKCAjMiBccV9zdG9w ICMzIHsKICAgXGlmX2xwYXJlbl9pbjpuVEYgeyAjMiB9IHsKICAgICAgXGJvb2xfbGFzdF9s cGFyZW5fc3BsaXQ6dyAjMiBccV9zdG9wIHsjMX0geyMzfQogICB9ewogICAgICBcaWZfYm9v bF9leHByOm5URnsgIzEgXGlmX25vcGFyZXhwcjpuVEZ7IzJ9ICMzIH0KICAgfQp9CiU8L2Nv ZGU+CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgXGVuZHttYWNyb31cZW5ke21hY3JvfQolIAol ICAgIFxiZWdpbnttYWNyb2NvZGV9CiU8MmU+XEV4cGxTeW50YXhPZmYKJSAgICBcZW5ke21h Y3JvY29kZX0KJSAKJSAKJSBcc2VjdGlvbntUZXN0c30KJSAKJSAgICBcYmVnaW57bWFjcm9j b2RlfQolPCp0ZXN0cz4KJTwqMmU+Clxkb2N1bWVudGNsYXNze2FydGljbGV9ClxiZWdpbntk b2N1bWVudH0KXEV4cGxTeW50YXhPbgolPC8yZT4KJSAgICBcZW5ke21hY3JvY29kZX0KJSAK JSBGaXJzdCB0aGUgZXhwcmVzc2lvbiB0aGF0IHdhcyBtZW50aW9uZWQgb24gXExhVGVYLUwu CiUgICAgXGJlZ2lue21hY3JvY29kZX0KXGJvb2xfc2V0Ok5uXGxfbXlfZmlyc3RfYm9vbHtc aWZfdHJ1ZTpURn0KXGJvb2xfc2V0Ok5uXGxfbXlfc2Vjb25kX2Jvb2x7XGlmX3RydWU6VEZ9 Clxib29sX3NldDpOblxsX215X3RoaXJkX2Jvb2x7XGlmX2ZhbHNlOlRGfQpTaG91bGR+ZXZh bHVhdGV+dG9+dHJ1ZS5+ClxpZl9ib29sX2V4cHI6blRGCiAgIHsgXGxfbXlfZmlyc3RfYm9v bCBBTkQgKCBcbF9teV9zZWNvbmRfYm9vbCBBTkQgTk9UIFxsX215X3RoaXJkX2Jvb2wgKSB9 CiAgIHtFdmFsdWF0ZXN+dG9+dHJ1ZS59CiAgIHtFdmFsdWF0ZXN+dG9+ZmFsc2UufQpccGFy Clxib29sX3NldDpOblxsX215X3RoaXJkX2Jvb2x7XGlmX3RydWU6VEZ9ClNob3VsZH5ldmFs dWF0ZX50b35mYWxzZS5+ClxpZl9ib29sX2V4cHI6blRGCiAgIHsgXGxfbXlfZmlyc3RfYm9v bCBBTkQgKCBcbF9teV9zZWNvbmRfYm9vbCBBTkQgTk9UIFxsX215X3RoaXJkX2Jvb2wgKSB9 CiAgIHtFdmFsdWF0ZXN+dG9+dHJ1ZS59CiAgIHtFdmFsdWF0ZXN+dG9+ZmFsc2UufQpccGFy CiUgICAgXGVuZHttYWNyb2NvZGV9CiUgCiUgTmV4dCBhbiBleHByZXNzaW9uIG1lYW50IHRv IGV4ZXJjaXNlIGFsbCB0d2lzdHMgYW5kIHR1cm5zIG9mIHRoZSAKJSBjb21tYW5kcywgYWxz byBkZW1vbnN0cmF0aW5nIHRoYXQgbm9uZXhwYW5kYWJsZSB0ZXN0cyBhcmUgc3VwcG9ydGVk LgolICAgIFxiZWdpbnttYWNyb2NvZGV9ClNob3VsZH5ldmFsdWF0ZX50b350cnVlLn4KXGlm X2Jvb2xfZXhwcjpuVEZ7CiAgICgoKCBOT1QgXGxfbXlfZmlyc3RfYm9vbCBPUiBcSWZGaWxl RXhpc3Rze2xhdGV4Lmx0eH0gKSkpCiAgIEFORCBcbF9teV9zZWNvbmRfYm9vbAp9e0V2YWx1 YXRlc350b350cnVlLn17RXZhbHVhdGVzfnRvfmZhbHNlLn0KXHBhcgolICAgIFxlbmR7bWFj cm9jb2RlfQolICAgIFxiZWdpbnttYWNyb2NvZGV9CiU8KjJlPgpcRXhwbFN5bnRheE9mZgpc ZW5ke2RvY3VtZW50fQolPC8yZT4KJTwvdGVzdHM+CiUgICAgXGVuZHttYWNyb2NvZGV9CiUg ClxlbmRpbnB1dA== --------------ad070602060704010501060903-- --------------040209030002080803040506--