From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christopher Genovese Subject: full parser implementation for tag queries (parentheses, fast heading match, and more) Date: Sat, 4 Aug 2012 03:50:56 -0400 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=f46d042fdc1ed5fe9004c66be874 Return-path: Received: from eggs.gnu.org ([208.118.235.92]:47222) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SxZ8s-00005k-5Y for emacs-orgmode@gnu.org; Sat, 04 Aug 2012 03:51:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SxZ8p-0000s6-5G for emacs-orgmode@gnu.org; Sat, 04 Aug 2012 03:51:22 -0400 Received: from mail-pb0-f41.google.com ([209.85.160.41]:64386) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SxZ8o-0000ry-CS for emacs-orgmode@gnu.org; Sat, 04 Aug 2012 03:51:19 -0400 Received: by pbbrp2 with SMTP id rp2so2834755pbb.0 for ; Sat, 04 Aug 2012 00:51:17 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --f46d042fdc1ed5fe9004c66be874 Content-Type: multipart/alternative; boundary=f46d042fdc1ed5fe8804c66be872 --f46d042fdc1ed5fe8804c66be872 Content-Type: text/plain; charset=ISO-8859-1 I am writing an application layer on top of org that uses the entry mapping API, but I needed both negation of complex selections and heading searches. Because the current tag query parser does not handle parenthesized expressions, it does not allow negating complex queries. At first, I wrote a workaround solution that mimics/specializes the mapping API, but that approach seemed inelegant and harder to maintain. So instead I implemented a full parser for tag queries with a number of useful features (see the labeled Notes at the bottom for further comments on these features): 1. Parenthesized expressions to arbitrary depth are allowed. 2. A '-' can be used to negate a parenthesized term. [Note a] 3. Regex's in {} can contain braces escaped by doubling: {{ }}. [Note b] 4. Supports fast property search on HEADING and PRIORITY. [Note c] 5. Handles hyphens in property names properly. [Note d,h] 6. Allows only the proper comparison operators, including ==. [Note e,h] 7. Allows spaces around operators and terms for readability. [Note f] 8. Matchers use the original expression order; not a big deal, but free. 9. The error messages during parsing are reasonably helpful. 10. Several bug fixes and a cleaner `org-make-tags-matcher'. [Note h] I'm submitting the code for your consideration, with the goal of eventually incorporating this into org.el. I would be happy to hear any comments or suggestions you have. As I'll describe below, this involves relatively minor changes to two existing functions and adding a few new support functions. I've attached two files org-tag-query-parse.el (the code) and tag-query-tests.el (a collection of tests built on a simple framework). I've also put the files in http://www.stat.cmu.edu/~genovese/emacs/. The comments in both files will I hope be helpful. At the risk of going on too long, I'd like to add a few comments about the code and tests. First, the two existing functions that are affected in the code are `org-make-tags-matcher' and `org-scan-tags'. In the new version of the former, I've extracted out both kinds of query parsing, leading to a shorter and cleaner function. The new version of the latter differs in only a couple *very minor* places that capture two values that were already being computed anyway (see the diff reproduced in the comments). Btw, I'm working from the 7.8.11 code. Loading org-tag-query-parse.el does not change the original functions. Instead, I've added a `-NEW' to the names of these functions and saved the originals also with a `-ORIGINAL' added. After loading the file, you can choose a version to try by doing (org-tmp-use-tag-parser 'new) and (org-tmp-use-tag-parser 'original) or do (org-tmp-use-tag-parser) to toggle between versions. You can also just use the names with suffixes directly. I'd also suggest byte-compiling the file. I think the place to start looking at the code is the new version of `org-make-tags-matcher'. The main entry function for the new parser is `org-tag-query-parse', though the real workhorse is actually the function `org-tag-query-parse-1'. There is also a new function `org-todo-query-parse' which just extracts the existing todo matching method. (I didn't do anything with that method as the manual makes it clear that it is of secondary importance.) I think the modularity here makes `org-make-tags-matcher' and each separate parser easier to read and understand. The other substantial piece (in terms of lines of code) is a utility macro `org-match-cond' that is used throughout and makes the main parser much more readable IMHO. Admittedly, I went a bit overboard in optimizing it; the first version worked fine but this one produces really nice code. I'd suggest ignoring this code (in section "Parsing utility for readable matchers") on first pass. The docstring is pretty complete, and its use is more or less self-explanatory. Most of its work is done at compile time. To run the tests, load org-tag-query-parse.el and tag-query-tests.el and do (tag-test-run :results) ; use :summary for a brief summary of all runs (tag-test-other-tests) ; miscellaneous other tests, including scanning or name individual suites. They are at the moment: (tag-test-run :results 'org-comparison-1) ; or use :summary (tag-test-run :results 'org-comparison-2) (tag-test-run :results 'match-results-1) (tag-test-run :results 'match-results-2) (tag-test-run :results 'should-error-1) If you have other ideas for tests or find any bugs, please let me know. Sorry for the homegrown framework; it just sort of grew and then I was too tired to rewrite the tests. One complication here is that the original and new algorithms produce different term orders and use a few different functions. The function tag-test-transform transforms original results to the new algorithms conventions, but it does not handle PRIORITY or HEADING matches at the moment. Use the tree form of the tess (see match-results-1 for example) on these. Btw, I've run the tests on GNU Emacs 23.2 and 24.1 (running on OS X lion). Notes: a. There is no need to introduce a new character such as ! for negation because the semantics of the - are clear and are consistent with its use for tags. A - binds more tightly than & which in turn binds more tightly than |. A + selector can also be used for positive selection of a parenthesized term but it is equivalent to using no selector, just as for tags. b. Because \'s are so heavily used in regex's and because they have to be doubled in strings, using \'s for an additional escape layer would be messy, ambiguous, and hard to read. Only the {}'s need to be escaped and the doubling escapes {{ -> { and }} -> } are simple, readable, and fast to parse. For example: "+{abc\\{{3,7\\}}}" gives the regex "abc\\{3,7\\}". Parity makes correctness clear at a glance. c. Because headline (and priority) searches can be useful and powerful, and because the information on those fields is *already processed* in `org-scan-tags', we get those special searches *essentially for free*, requiring only two minor changes to `org-scan-tags'. See the unified diff in comments. The special PRIORITY property already exists; I added the special HEADING property for these purposes. I'm open to changing the name of course, but I do think the feature is both useful and elegant. (I'm using it in my application, for instance.) d. I did not see it in the manual, but I think that property names with hyphens should have these \-escaped -'s in the query string, with the escaping slashes removed in the produced matcher. This is not currently done, but the new version does. See Note h for details. e. It seems desirable to support both = and == as equality operators since the latter is so common by habit. The new version allows this explicitly. The original version does as well, but the regex for the comparison operator also allows other operators <<, ><, >>, =>, and >= as well, which can produce bad matchers. See Note h for details. f. Currently, spaces are ignored around &, |, the implicit & between terms, around the comparison operators in property searches, and around +/- selectors. Spaces are not ignored inside {}'s for a regexp match. g. The current code also allows +/- selectors before property comparisons. I don't really like this because +PROP<>"something" and -PROP="something" have the same meaning but look very different. But the new code does support this. As a side note, there's really no need for the & characters as +/- serve the and/and-not function completely. But again, no prob. h. A few bugs detected in the 7.8.11 code: + Faulty test for todo matcher in org-make-tags-matcher (string-match "/+" match) Ex: (org-make-tags-matcher "PROP={^\\s-*// .*$}") produces an erroneous matcher: ("PROP={^\\s-*// .*$}" progn (setq org-cached-props nil) (member "PROP" tags-list)) For all practical purposes it will be enough to do: (string-match "\\(/\\(!\\)?\\s-*\\)[^{}\"]*$" match) instead of the current test in org-make-tags-matcher. This works as long as the TODO keywords do not contain a right brace or quotation marks. (In most other cases, the new parser should give an error message at parse time.) A technicality: this is /not/ a complete solution because arbitrary strings can be TODO keywords. For instance, both PROP={/!} and PROP="/!{/!}" are valid TODO keywords (it works!) *and* valid property comparisons. So, a pattern alone is insufficient. We want to find the first slash that is not enclosed in {}'s or ""'s; if found, a todo match is needed. The function `org-find-todo-query' does this and (org-find-todo-query match) can be plugged in directly replacing the above (string-match ...) in then new `org-make-tags-matcher'. But because the todo parsing uses {}'s for regex matches, TODO keywords with {}'s are ignored anyway. So there's no need to go beyond the fixed string-match above. The function `org-todo-query-parse', which handles todo parsing in the new version, makes this explicit. + Property names with -'s are not handled properly (cf. Note d) Specifically, the escapes are not removed. Example: (org-make-tags-matcher "PROP\\-WITH\\-HYPHENS=2") produces ("PROP\\-WITH\\-HYPHENS=2" and (progn (setq org-cached-props nil) (= (string-to-number (or (org-cached-entry-get nil "PROP\\-WITH\\-HYPHENS") "")) 2)) t) The original code /does/ instead remove -'s from tag names, which shouldn't have them anyway. I suspect that this was intended for property names rather than tag names. The new version fixes up property names but does not allow -'s in tags. + Incorrect comparison operators allowed (cf. Note e) The regular expression used is "[<=>]\\{1,2\\}" is used to detect the comparison operators. But this can produce bad matchers that fail opaquely at match time rather than giving an appropriate error message at parse time. Ex: (org-make-tags-matcher "P<<2") produces ("P<<2" and (progn (setq org-cached-props nil) (nil (string-to-number (or (org-cached-entry-get nil "P") "")) 2)) t) This is fixed in the new version and delivers an error message at parse time. + missing org-re (line 7179 in org.el) with posix classes Minor consistency issue. This line does not occur in the new code. Thanks and regards, Christopher Genovese --f46d042fdc1ed5fe8804c66be872 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I am writing an applicati= on layer on top of org that uses the
entry map= ping API, but I needed both negation of complex
selections and heading se= arches. Because the current tag query
parser d= oes not handle parenthesized expressions, it does not
allow negating complex qu= eries. At first, I wrote a workaround
solution= that mimics/specializes the mapping API, but that
approach seemed inelegant= and harder to maintain.

So instead I implemented a full parser for tag q= ueries with a
number of useful features= (see the labeled Notes at the bottom
for furt= her comments on these features):

=A0 1. Parenthesized expressions to arbitrary depth = are allowed.
=A0 2. A '-' can be used = to negate a parenthesized term.=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 [Note a= ]
=A0 3. Regex's in {} = can contain braces escaped by doubling: {{ }}.=A0 [Note b]
=A0 4. Supports fast property search on HEADING and PRIORITY.= =A0=A0=A0=A0=A0=A0=A0 [Note c]
=A0 5. Handles hyphens in= property names properly.=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 [Note d,h]
=A0 6. Allows only the prope= r comparison operators, including =3D=3D.=A0=A0=A0 [Note e,h]
=A0 7. Allows spaces arou= nd operators and terms for readability.=A0=A0=A0=A0 [Note f]
=A0 8. Matchers use the original expression order; not a big=
=A0=A0=A0=A0 deal, but fr= ee.
=A0 9. The error messages during parsing a= re reasonably helpful.
=A0 10. Several bug fixes= and a cleaner `org-make-tags-matcher'.=A0=A0=A0=A0 [Note h]

I'm submitting the co= de for your consideration, with the
goal of eventually incorporating th= is into org.el. I would be

happy to hear any comment= s or suggestions you have. As I'll describe
functions and adding a fe= w new support functions. I've attached two
files org-tag-query-parse.el (the code) and tag-query-tests.el (a collection of tests built= on a simple framework). I've also
put the= files in http://www.s= tat.cmu.edu/~genovese/emacs/. The
comments in both files wi= ll I hope be helpful.

At the risk of going on too long, I'd like to a= dd a few comments
about the code and tests.= First, the two existing functions that
are af= fected in the code are `org-make-tags-matcher' and
`org-scan-tags'. In t= he new version of the former, I've extracted
out both kinds of query parsing, leading to a shorter and cleaner=
function. The new version= of the latter differs in only a couple
*very = minor* places that capture two values that were already
being computed anyway (se= e the diff reproduced in the comments).
Btw, I= 'm working from the 7.8.11 code.

Loading org-tag-query-parse.el does not change the o= riginal
functions. Instead, I've added a= `-NEW' to the names of these
functions and saved the o= riginals also with a `-ORIGINAL' added.
Af= ter loading the file, you can choose a version to try by doing

=A0=A0=A0 (org-tmp-use-tag-parser 'new)and
=A0=A0=A0 (org-tmp-use-ta= g-parser 'original)

or do (org-tmp-use-tag-parser) to toggle between = versions.
You can also just use the= names with suffixes directly.
I'd also s= uggest byte-compiling the file.

I think the place to start looking at the code is th= e new version
of `org-make-tags-matcher'. = The main entry function for the new
parser is `org-tag-query-= parse', though the real workhorse is
actua= lly the function `org-tag-query-parse-1'. There is also a
new function `org-todo-qu= ery-parse' which just extracts the
existin= g todo matching method. (I didn't do anything with that
method as the manual make= s it clear that it is of secondary
importance.= ) I think the modularity here makes
`org-make-tags-matcher= 9; and each separate parser easier to read
and= understand.

The other substantial piece (in terms of lines of co= de) is a utility
macro `org-match-cond' th= at is used throughout and makes the main

parser much more readable= IMHO. Admittedly, I went a bit
overboard in o= ptimizing it; the first version worked fine
but this one produces rea= lly nice code. I'd suggest ignoring this
c= ode (in section "Parsing utility for readable matchers") on
first pass. The docstring= is pretty complete, and its use is more
or le= ss self-explanatory. Most of its work is done at compile time.

To run the tests, load org-tag-query-parse.el and ta= g-query-tests.el
and do


=A0=A0 (tag-test-run :results) ; use :summary for a = brief summary of all runs
=A0=A0 (tag-test-other-te= sts)=A0 ; miscellaneous other tests, including scanning

or name individual suites. They are at the moment:

=A0=A0 (tag-test-run :res= ults 'org-comparison-1)=A0 ; or use :summary
=A0=A0 (tag-test-run :results 'org-comparison-2)
=A0=A0 (tag-test-run :res= ults 'match-results-1)
=A0=A0 (tag-test-ru= n :results 'match-results-2)
=A0=A0 (tag-test-run :res= ults 'should-error-1)

If you have other ideas for tests or find any b= ugs, please let me
know. Sorry for the homeg= rown framework; it just sort of grew and
then = I was too tired to rewrite the tests. One complication here
is that the original and = new algorithms produce different term
orders a= nd use a few different functions. The function
tag-test-transform transf= orms original results to the new
algorithms co= nventions, but it does not handle PRIORITY or
HEADING matches at the mo= ment. Use the tree form of the tess (see
match= -results-1 for example) on these. Btw, I've run the tests on
GNU Emacs 23.2 and 24.1 (= running on OS X lion).

Notes:
=A0=A0 a. There is no nee= d to introduce a new character such as ! for
= =A0=A0=A0=A0=A0 negation because the semantics of the - are clear and are
=A0=A0=A0=A0=A0 consisten= t with its use for tags. A - binds more tightly
=A0=A0=A0=A0=A0 selector = can also be used for positive selection of a
= =A0=A0=A0=A0=A0 parenthesized term but it is equivalent to using no<= br style=3D"font-family:courier new,monospace"> =A0=A0=A0=A0=A0 selector,= just as for tags.
=A0=A0=A0=A0=A0

=A0=A0 b. Because \'s= are so heavily used in regex's and because they
=A0=A0=A0=A0=A0 have to be doubled in strings, using \'s for an = additional
=A0=A0=A0=A0=A0 escape la= yer would be messy, ambiguous, and hard to read.
=A0=A0=A0=A0=A0 Only the {}'s need to be escaped and the doubling es= capes
=A0=A0=A0=A0=A0 {{ -> = { and }} -> } are simple, readable, and fast to
=A0=A0=A0=A0=A0 parse. For example: "+{abc\\{{3,7\\}}}" give= s the regex
=A0=A0=A0=A0=A0 "abc= \\{3,7\\}". Parity makes correctness clear at a glance.
=A0=A0=A0=A0=A0
=A0=A0 c. Because headlin= e (and priority) searches can be useful and
= =A0=A0=A0=A0=A0 powerful, and because the information on those fields is
=A0=A0=A0=A0=A0 *already = processed* in `org-scan-tags', we get those
=A0=A0=A0=A0=A0 minor cha= nges to `org-scan-tags'. See the unified diff in
=A0=A0=A0=A0=A0 comments. The special PRIORITY property already exis= ts; I
=A0=A0=A0=A0=A0 added the= special HEADING property for these purposes. I'm
=A0=A0=A0=A0=A0 open to changing the name of course, but I do think= the
=A0=A0=A0=A0=A0 feature i= s both useful and elegant. (I'm using it in my
=A0=A0=A0=A0=A0 application, for instance.)

=A0=A0 d. I did not see it in the manual, but I thin= k that property names
=A0=A0=A0=A0=A0 with hyp= hens should have these \-escaped -'s in the query
=A0=A0=A0=A0=A0 string, w= ith the escaping slashes removed in the produced
=A0=A0=A0=A0=A0 matcher. This is not currently done, but the new version= does.
=A0=A0=A0=A0=A0 See Note = h for details.

=A0=A0 e. It seems desirable to support both =3D and =3D= =3D as equality operators
=A0=A0=A0=A0=A0 since the= latter is so common by habit. The new version allows
=A0=A0=A0=A0=A0 this explicitly. The original version does as well,= but the
=A0=A0=A0=A0=A0 regex for= the comparison operator also allows other operators
=A0=A0=A0=A0=A0 <<, ><, >>, =3D>, and >=3D a= s well, which can produce bad matchers.
=A0=A0=A0=A0=A0 See Note = h for details.

=A0=A0 f. Currently, spaces are ignored around &, |, t= he implicit & between
=A0=A0=A0=A0=A0 terms, ar= ound the comparison operators in property searches,
=A0=A0=A0=A0=A0 and around +/- selectors. Spaces are not ignored insi= de {}'s
=A0=A0=A0=A0=A0 for a reg= exp match.

=A0=A0 g. The current code also allows +/- selectors before p= roperty
=A0=A0=A0=A0=A0 compariso= ns. I don't really like this because
=A0= =A0=A0=A0=A0 +PROP<>"something" and -PROP=3D"something= " have the same
=A0=A0=A0=A0=A0 meaning b= ut look very different. But the new code does
= =A0=A0=A0=A0=A0 support this. As a side note, there's really no need fo= r
=A0=A0=A0=A0=A0 the &= characters as +/- serve the and/and-not function
=A0=A0=A0=A0=A0 completely. But again, no prob.

=A0=A0 h. A few bugs detected in the 7.8.11 code:

=A0=A0=A0=A0=A0 + Faulty = test for todo matcher in org-make-tags-matcher
=A0=A0=A0=A0=A0=A0=A0 (string-match "/+" match)

=A0=A0=A0=A0=A0=A0=A0 Ex: (org-make-tags-matcher &qu= ot;PROP=3D{^\\s-*// .*$}") produces
=A0=A0=A0=A0=A0=A0=A0 an = erroneous matcher:
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ("PROP=3D{^\\s-= *// .*$}" progn
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 (setq org-cached-props nil)
=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (member "PROP" tags-list))

=A0=A0=A0=A0=A0=A0=A0 For all practical purposes it = will be enough to do:
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0=A0 = (string-match "\\(/\\(!\\)?\\s-*\\)[^{}\"]*$" match)<= br style=3D"font-family:courier new,monospace">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 ins= tead of the current test in org-make-tags-matcher.
=A0=A0=A0=A0=A0=A0=A0 This works as long as the TODO keywords do not c= ontain a
=A0=A0=A0=A0=A0=A0=A0 rig= ht brace or quotation marks. (In most other cases, the
=A0=A0=A0=A0=A0=A0=A0 new parser should give an error message at p= arse time.)
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 A technicality: this is /n= ot/ a complete solution because
=A0=A0=A0=A0=A0=A0=A0 arb= itrary strings can be TODO keywords. For instance,
=A0=A0=A0=A0=A0=A0=A0 both PROP=3D{/!} and PROP=3D"/!{/!}" a= re valid TODO keywords
=A0=A0=A0=A0=A0=A0=A0 (it= works!) *and* valid property comparisons. So, a pattern

=A0=A0=A0=A0=A0=A0=A0 alone is insufficient. We want to find the= first slash
=A0=A0=A0=A0=A0=A0=A0 tha= t is not enclosed in {}'s or ""'s; if found, a todo
=A0=A0=A0=A0=A0=A0=A0 match is needed. The function= `org-find-todo-query' does
=A0=A0=A0=A0=A0=A0=A0 thi= s and (org-find-todo-query match) can be plugged in
=A0=A0=A0=A0=A0=A0=A0 directly replacing the above (string-match ...)= in then
=A0=A0=A0=A0=A0=A0=A0 new= `org-make-tags-matcher'.
=A0=A0=A0=A0=A0= =A0=A0
=A0=A0=A0=A0=A0=A0=A0 But= because the todo parsing uses {}'s for regex matches,
=A0=A0=A0=A0=A0=A0=A0 TODO keywords with {}'s are ignored= anyway. So there's
=A0=A0=A0=A0=A0=A0=A0 no = need to go beyond the fixed string-match above.
=A0=A0=A0=A0=A0=A0=A0 par= sing in the new version, makes this explicit.
= =A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0 + Propert= y names with -'s are not handled properly (cf. Note d)

=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 Spe= cifically, the escapes are not removed. Example:
=A0=A0=A0=A0=A0=A0=A0 (org-make-tags-matcher "PROP\\-WITH\\-HYPHENS= =3D2")
=A0=A0=A0=A0=A0=A0=A0 pro= duces
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 (&q= uot;PROP\\-WITH\\-HYPHENS=3D2" and
=A0=A0= =A0=A0=A0=A0=A0=A0 (progn
=A0=A0=A0=A0=A0=A0=A0=A0 = (setq org-cached-props nil)
=A0=A0=A0=A0=A0=A0= =A0=A0 (=3D
=A0=A0=A0=A0=A0=A0=A0=A0= =A0 (string-to-number
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 (or (org-cached-entry-get nil "PROP\\-WITH\\-HYPHENS")

=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 ""))
=A0=A0=A0=A0=A0=A0=A0=A0= =A0 2))
=A0=A0=A0=A0=A0=A0=A0=A0 = t)
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 The= original code /does/ instead remove -'s from tag
=A0=A0=A0=A0=A0=A0=A0 names, which shouldn't have them anyway. = I suspect that
=A0=A0=A0=A0=A0=A0=A0 thi= s was intended for property names rather than tag
=A0=A0=A0=A0=A0=A0=A0 names. The new version fixes up property names bu= t does
=A0=A0=A0=A0=A0=A0=A0 not= allow -'s in tags.

=A0=A0=A0=A0=A0 + Incorrect comparison operators = allowed (cf. Note e)
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 The regular expression use= d is "[<=3D>]\\{1,2\\}" is used to
=A0=A0=A0=A0=A0=A0=A0 det= ect the comparison operators. But this can produce bad
=A0=A0=A0=A0=A0=A0=A0 matchers that fail opaquely at match time ra= ther than
=A0=A0=A0=A0=A0=A0=A0 giv= ing an appropriate error message at parse time.

= =A0=A0=A0=A0=A0=A0=A0 Ex:= (org-make-tags-matcher "P<<2") produces

=A0=A0=A0=A0=A0=A0=A0=A0 ("P<<2" and=
=A0=A0=A0=A0=A0=A0=A0=A0=A0 (progn
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 (setq org-cached-props nil)
=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 (nil
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 (string-to-number (or (org-cached-entry-get nil "P")= "")) 2))
<= span style=3D"font-family:courier new,monospace">=A0=A0=A0=A0=A0=A0=A0=A0= =A0 t)


=A0=A0=A0=A0=A0=A0=A0 This is fixed in the new versi= on and delivers an error
=A0=A0=A0=A0=A0=A0= =A0 message at parse time.

=A0=A0=A0=A0=A0 + missing org-re (line 7179 in org.e= l) with posix classes
=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0 Min= or consistency issue.=A0 This line does not occur in the new
=A0=A0=A0=A0=A0=A0=A0 code.


Than= ks and regards,

=A0=A0 Christopher Genove= se


--f46d042fdc1ed5fe8804c66be872-- --f46d042fdc1ed5fe9004c66be874 Content-Type: application/octet-stream; name="org-tag-query-parse.el" Content-Disposition: attachment; filename="org-tag-query-parse.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h5ge90ym0 Ozs7IG9yZy10YWctcXVlcnktcGFyc2UuZWwgLS0gcHJvcG9zZWQgZnVsbCBwYXJzZXIgZm9yIHRh ZyBxdWVyaWVzCgo7OyBDb3B5cmlnaHQgKEMpIDIwMTIsIENocmlzdG9waGVyIFIuIEdlbm92ZXNl LCBhbGwgcmlnaHRzIHJlc2VydmVkLgoKOzsgQXV0aG9yOiAgQ2hyaXN0b3BoZXIgR2Vub3Zlc2Ug PGdlbm92ZXNlQGNtdS5lZHU+Cjs7IFZlcnNpb246IDAuOQo7Owo7OyBDcmVhdGVkOiAgICAgIFN1 biAyOSBKdWwgMjAxMiBhdCAxMDowNCBFRFQKOzsgTGFzdC1VcGRhdGVkOiBGcmkgMDMgQXVnIDIw MTIgYXQgMjM6NTIgRURUCjs7IFVwZGF0ZWQgQnk6ICAgQ2hyaXN0b3BoZXIgUi4gR2Vub3Zlc2UK OzsgS2V5d29yZHM6IG9yZy1tb2RlLCB0YWdzLCBxdWVyeSwgc2VhcmNoCjs7IFBhY2thZ2UtUmVx dWlyZXM6ICgob3JnLW1vZGUgNy44KSkKCgo7OzsgQ29tbWVudGFyeToKOzsKOzsgIFRoZSBjdXJy ZW50IHBhcnNlciBmb3IgdGFnIHF1ZXJ5IHNlYXJjaGVzIGRvZXMgbm90IGhhbmRsZQo7OyAgcGFy ZW50aGVzaXplZCBleHByZXNzaW9ucyBhbmQgdGh1cyBkb2VzIG5vdCBhbGxvdyBuZWdhdGluZyBj b21wbGV4Cjs7ICBxdWVyaWVzLiBUaGlzIGNvZGUgaW1wbGVtZW50cyBhIGZ1bGwgcGFyc2VyIGZv ciB0YWcgcXVlcmllcyB3aXRoCjs7ICBudW1iZXIgb2YgdXNlZnVsIGZlYXR1cmVzIChzZWUgdGhl IGxhYmVsZWQgTm90ZXMgYmVsb3cgZm9yIGZ1cnRoZXIKOzsgIGNvbW1lbnRzIG9uIHRoZXNlIGZl YXR1cmVzKToKOzsgCjs7ICAgMS4gUGFyZW50aGVzaXplZCBleHByZXNzaW9ucyB0byBhcmJpdHJh cnkgZGVwdGggYXJlIGFsbG93ZWQuCjs7ICAgMi4gQSAnLScgY2FuIGJlIHVzZWQgdG8gbmVnYXRl IGEgcGFyZW50aGVzaXplZCB0ZXJtLiAgICAgICAgICAgICBbTm90ZSBhXQo7OyAgIDMuIFJlZ2V4 J3MgaW4ge30gY2FuIGNvbnRhaW4gYnJhY2VzIGVzY2FwZWQgYnkgZG91Ymxpbmc6IHt7IH19LiAg W05vdGUgYl0KOzsgICA0LiBTdXBwb3J0cyBmYXN0IHByb3BlcnR5IHNlYXJjaCBvbiBIRUFESU5H IGFuZCBQUklPUklUWS4gICAgICAgIFtOb3RlIGNdCjs7ICAgNS4gSGFuZGxlcyBoeXBoZW5zIGlu IHByb3BlcnR5IG5hbWVzIHByb3Blcmx5LiAgICAgICAgICAgICAgICAgICBbTm90ZSBkXQo7OyAg IDYuIEFsbG93cyBvbmx5IHRoZSBwcm9wZXIgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGluY2x1ZGlu ZyA9PS4gICAgW05vdGUgZV0KOzsgICA3LiBBbGxvd3Mgc3BhY2VzIGFyb3VuZCBvcGVyYXRvcnMg YW5kIHRlcm1zIGZvciByZWFkYWJpbGl0eS4gICAgIFtOb3RlIGZdCjs7ICAgOC4gUGFyc2UgdHJl ZXMgdXNlIHRoZSBvcmlnaW5hbCBleHByZXNzaW9uIG9yZGVyOyBub3QgYSBiaWcKOzsgICAgICBk ZWFsLCBidXQgZnJlZS4KOzsgICA5LiBSZXR1cm5lZCBwYXJzZSB0cmVlcyBhcmUgY2xlYW4sIHdp dGhvdXQgdHJpdmlhbCBvcGVyYXRvcnMsCjs7ICAgICAgYW5kIGVycm9yIG1lc3NhZ2VzIGR1cmlu ZyBwYXJzaW5nIGFyZSByZWFzb25hYmx5IGhlbHBmdWwuCjs7ICAgMTAuIEEgZmV3IGJ1ZyBmaXhl cyBhbmQgYSBjbGVhbmVyIGBvcmctbWFrZS10YWdzLW1hdGNoZXInLiAgICAgICBbTm90ZSBoXQo7 Owo7OyAgSSBwcm9wb3NlIHRoYXQgdGhpcyBuZXcgcGFyc2VyIGJlIGluY29ycG9yYXRlZCBpbnRv IG9yZy5lbC4KOzsgIAo7OyAgVGhlIHR3byBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBhcmUgYWZm ZWN0ZWQgaW4gdGhlIGNvZGUgYXJlCjs7ICBgb3JnLW1ha2UtdGFncy1tYXRjaGVyJyBhbmQgYG9y Zy1zY2FuLXRhZ3MnLiBJbiB0aGUgbmV3IHZlcnNpb24gb2YKOzsgIHRoZSBmb3JtZXIsIEkndmUg ZXh0cmFjdGVkIG91dCBib3RoIGtpbmRzIG9mIHF1ZXJ5IHBhcnNpbmcsCjs7ICBsZWFkaW5nIHRv IGEgc2hvcnRlciBhbmQgY2xlYW5lciBmdW5jdGlvbi4gVGhlIG5ldyB2ZXJzaW9uIG9mIHRoZQo7 OyAgbGF0dGVyIGRpZmZlcnMgaW4gb25seSBhIGNvdXBsZSAqdmVyeSBtaW5vciogcGxhY2VzIHRo YXQgY2FwdHVyZQo7OyAgdHdvIHZhbHVlcyB0aGF0IHdlcmUgYWxyZWFkeSBiZWluZyBjb21wdXRl ZCBhbnl3YXkgKHNlZSB0aGUgZGlmZgo7OyAgcmVwcm9kdWNlZCBpbiB0aGUgY29tbWVudHMpLgo7 OyAgCjs7ICBMb2FkaW5nIG9yZy10YWctcXVlcnktcGFyc2UuZWwgZG9lcyBub3QgY2hhbmdlIHRo ZSBvcmlnaW5hbAo7OyAgZnVuY3Rpb25zLiBJbnN0ZWFkLCBJJ3ZlIGFkZGVkIGEgYC1ORVcnIHRv IHRoZSBuYW1lcyBvZiB0aGVzZQo7OyAgZnVuY3Rpb25zIGFuZCBzYXZlZCB0aGUgb3JpZ2luYWxz IGFsc28gd2l0aCBhIGAtT1JJR0lOQUwnIGFkZGVkLgo7OyAgQWZ0ZXIgbG9hZGluZyB0aGUgZmls ZSwgeW91IGNhbiBjaG9vc2UgYSB2ZXJzaW9uIHRvIHRyeSBieSBkb2luZwo7OyAgCjs7ICAgICAg KG9yZy10bXAtdXNlLXRhZy1wYXJzZXIgJ25ldykKOzsgIGFuZAo7OyAgICAgIChvcmctdG1wLXVz ZS10YWctcGFyc2VyICdvcmlnaW5hbCkKOzsgIAo7OyAgb3IgZG8gKG9yZy10bXAtdXNlLXRhZy1w YXJzZXIpIHRvIHRvZ2dsZSBiZXR3ZWVuIHZlcnNpb25zLgo7OyAgWW91IGNhbiBhbHNvIGp1c3Qg dXNlIHRoZSBuYW1lcyB3aXRoIHN1ZmZpeGVzIGRpcmVjdGx5LiAKOzsgIAo7OyAgSSB0aGluayB0 aGUgcGxhY2UgdG8gc3RhcnQgbG9va2luZyBhdCB0aGUgY29kZSBpcyB0aGUgbmV3IHZlcnNpb24K OzsgIG9mIGBvcmctbWFrZS10YWdzLW1hdGNoZXInLiBUaGUgbWFpbiBlbnRyeSBmdW5jdGlvbiBm b3IgdGhlIG5ldwo7OyAgcGFyc2VyIGlzIGBvcmctdGFnLXF1ZXJ5LXBhcnNlJywgdGhvdWdoIHRo ZSByZWFsIHdvcmtob3JzZSBpcwo7OyAgYWN0dWFsbHkgdGhlIGZ1bmN0aW9uIGBvcmctdGFnLXF1 ZXJ5LXBhcnNlLTEnLiBUaGVyZSBpcyBhbHNvIGEKOzsgIG5ldyBmdW5jdGlvbiBgb3JnLXRvZG8t cXVlcnktcGFyc2UnIHdoaWNoIGp1c3QgZXh0cmFjdHMgdGhlCjs7ICBleGlzdGluZyB0b2RvIG1h dGNoaW5nIG1ldGhvZC4gKEkgZGlkbid0IGRvIGFueXRoaW5nIHdpdGggdGhhdAo7OyAgbWV0aG9k IGFzIHRoZSBtYW51YWwgbWFrZXMgaXQgY2xlYXIgdGhhdCBpdCBpcyBvZiBzZWNvbmRhcnkKOzsg IGltcG9ydGFuY2UuKSBJIHRoaW5rIHRoZSBtb2R1bGFyaXR5IGhlcmUgbWFrZXMKOzsgIGBvcmct bWFrZS10YWdzLW1hdGNoZXInIGFuZCBlYWNoIHNlcGFyYXRlIHBhcnNlciBlYXNpZXIgdG8gcmVh ZAo7OyAgYW5kIHVuZGVyc3RhbmQuCjs7ICAKOzsgIFRoZSBvdGhlciBzdWJzdGFudGlhbCBwaWVj ZSAoaW4gdGVybXMgb2YgbGluZXMgb2YgY29kZSkgaXMgYSB1dGlsaXR5Cjs7ICBtYWNybyBgb3Jn LW1hdGNoLWNvbmQnIHRoYXQgaXMgdXNlZCB0aHJvdWdob3V0IGFuZCBtYWtlcyB0aGUgbWFpbgo7 OyAgcGFyc2VyIG11Y2ggbW9yZSByZWFkYWJsZSBJTUhPLiBBZG1pdHRlZGx5LCBJIHdlbnQgYSBi aXQgb3ZlcmJvYXJkCjs7ICBpbiBvcHRpbWl6aW5nIGl0OyB0aGUgZmlyc3QgdmVyc2lvbiB3b3Jr ZWQgZmluZSBidXQgdGhpcyBvbmUKOzsgIHByb2R1Y2VzIHJlYWxseSBuaWNlIGNvZGUuIEknZCBz dWdnZXN0IGlnbm9yaW5nIHRoaXMgY29kZSAoaW4KOzsgIHNlY3Rpb24gIlBhcnNpbmcgdXRpbGl0 eSBmb3IgcmVhZGFibGUgbWF0Y2hlcnMiKSBvbiBmaXJzdCBwYXNzLiBUaGUKOzsgIGRvY3N0cmlu ZyBpcyBwcmV0dHkgY29tcGxldGUsIGFuZCBpdHMgdXNlIGlzIG1vcmUgb3IgbGVzcwo7OyAgc2Vs Zi1leHBsYW5hdG9yeS4KOzsgIAo7OyAgTm90ZXM6Cjs7ICAgIGEuIFRoZXJlIGlzIG5vIG5lZWQg dG8gaW50cm9kdWNlIGEgbmV3IGNoYXJhY3RlciBzdWNoIGFzICEgZm9yCjs7ICAgICAgIG5lZ2F0 aW9uIGJlY2F1c2UgdGhlIHNlbWFudGljcyBvZiB0aGUgLSBhcmUgY2xlYXIgYW5kIGFyZQo7OyAg ICAgICBjb25zaXN0ZW50IHdpdGggaXRzIHVzZSBmb3IgdGFncy4gQSAtIGJpbmRzIG1vcmUgdGln aHRseQo7OyAgICAgICB0aGFuICYgd2hpY2ggaW4gdHVybiBiaW5kcyBtb3JlIHRpZ2h0bHkgdGhh biB8LiBBICsKOzsgICAgICAgc2VsZWN0b3IgY2FuIGFsc28gYmUgdXNlZCBmb3IgcG9zaXRpdmUg c2VsZWN0aW9uIG9mIGEKOzsgICAgICAgcGFyZW50aGVzaXplZCB0ZXJtIGJ1dCBpdCBpcyBlcXVp dmFsZW50IHRvIHVzaW5nIG5vCjs7ICAgICAgIHNlbGVjdG9yLCBqdXN0IGFzIGZvciB0YWdzLgo7 OyAgICAgICAKOzsgICAgYi4gQmVjYXVzZSBcJ3MgYXJlIHNvIGhlYXZpbHkgdXNlZCBpbiByZWdl eCdzIGFuZCBiZWNhdXNlIHRoZXkKOzsgICAgICAgaGF2ZSB0byBiZSBkb3VibGVkIGluIHN0cmlu Z3MsIHVzaW5nIFwncyBmb3IgYW4gYWRkaXRpb25hbAo7OyAgICAgICBlc2NhcGUgbGF5ZXIgd291 bGQgYmUgbWVzc3ksIGFtYmlndW91cywgYW5kIGhhcmQgdG8gcmVhZC4KOzsgICAgICAgT25seSB0 aGUge30ncyBuZWVkIHRvIGJlIGVzY2FwZWQgYW5kIHRoZSBkb3VibGluZyBlc2NhcGVzCjs7ICAg ICAgIHt7IC0+IHsgYW5kIH19IC0+IH0gYXJlIHNpbXBsZSwgcmVhZGFibGUsIGFuZCBmYXN0IHRv Cjs7ICAgICAgIHBhcnNlLiBGb3IgZXhhbXBsZTogIit7YWJjXFx7ezMsN1xcfX19IiBnaXZlcyB0 aGUgcmVnZXgKOzsgICAgICAgImFiY1xcezMsN1xcfSIuIFBhcml0eSBtYWtlcyBjb3JyZWN0bmVz cyBjbGVhciBhdCBhIGdsYW5jZS4KOzsgICAgICAgCjs7ICAgIGMuIEJlY2F1c2UgaGVhZGxpbmUg KGFuZCBwcmlvcml0eSkgc2VhcmNoZXMgY2FuIGJlIHVzZWZ1bCBhbmQKOzsgICAgICAgcG93ZXJm dWwsIGFuZCBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBvbiB0aG9zZSBmaWVsZHMgaXMKOzsgICAg ICAgKmFscmVhZHkgcHJvY2Vzc2VkKiBpbiBgb3JnLXNjYW4tdGFncycsIHdlIGdldCB0aG9zZQo7 OyAgICAgICBzcGVjaWFsIHNlYXJjaGVzICplc3NlbnRpYWxseSBmb3IgZnJlZSosIHJlcXVpcmlu ZyBvbmx5IHR3bwo7OyAgICAgICBtaW5vciBjaGFuZ2VzIHRvIGBvcmctc2Nhbi10YWdzJy4gU2Vl IHRoZSB1bmlmaWVkIGRpZmYgaW4KOzsgICAgICAgY29tbWVudHMuIFRoZSBzcGVjaWFsIFBSSU9S SVRZIHByb3BlcnR5IGFscmVhZHkgZXhpc3RzOyBJCjs7ICAgICAgIGFkZGVkIHRoZSBzcGVjaWFs IEhFQURJTkcgcHJvcGVydHkgZm9yIHRoZXNlIHB1cnBvc2VzLiBJJ20KOzsgICAgICAgb3BlbiB0 byBjaGFuZ2luZyB0aGUgbmFtZSBvZiBjb3Vyc2UsIGJ1dCBJIGRvIHRoaW5rIHRoZQo7OyAgICAg ICBmZWF0dXJlIGlzIHZlcnkgdXNlZnVsLgo7OyAKOzsgICAgZC4gSSBkaWQgbm90IHNlZSBpdCBp biB0aGUgbWFudWFsLCBidXQgSSB0aGluayB0aGF0IHByb3BlcnR5IG5hbWVzCjs7ICAgICAgIHdp dGggaHlwaGVucyBzaG91bGQgaGF2ZSB0aGVzZSBcLWVzY2FwZWQgLSdzIGluIHRoZSBxdWVyeQo7 OyAgICAgICBzdHJpbmcsIHdpdGggdGhlIGVzY2FwaW5nIHNsYXNoZXMgcmVtb3ZlZCBpbiB0aGUg cHJvZHVjZWQKOzsgICAgICAgbWF0Y2hlci4gVGhpcyBpcyBub3QgY3VycmVudGx5IGRvbmUsIGJ1 dCB0aGUgbmV3IHZlcnNpb24gZG9lcy4KOzsgICAgICAgU2VlIE5vdGUgaCBmb3IgZGV0YWlscy4K OzsgCjs7ICAgIGUuIEl0IHNlZW1zIGRlc2lyYWJsZSB0byBzdXBwb3J0IGJvdGggPSBhbmQgPT0g YXMgZXF1YWxpdHkgb3BlcmF0b3JzCjs7ICAgICAgIHNpbmNlIHRoZSBsYXR0ZXIgaXMgc28gY29t bW9uIGJ5IGhhYml0LiBUaGUgbmV3IHZlcnNpb24gYWxsb3dzCjs7ICAgICAgIHRoaXMgZXhwbGlj aXRseS4gVGhlIG9yaWdpbmFsIHZlcnNpb24gZG9lcyBhcyB3ZWxsLCBidXQgdGhlCjs7ICAgICAg IHJlZ2V4IGZvciB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBhbHNvIGFsbG93cyBvdGhlciBvcGVy YXRvcnMKOzsgICAgICAgPDwsID48LCA+PiwgPT4sIGFuZCA+PSBhcyB3ZWxsLCB3aGljaCBjYW4g cHJvZHVjZSBiYWQgbWF0Y2hlcnMuCjs7ICAgICAgIFNlZSBOb3RlIGggZm9yIGRldGFpbHMuCjs7 IAo7OyAgICBmLiBDdXJyZW50bHksIHNwYWNlcyBhcmUgaWdub3JlZCBhcm91bmQgJiwgfCwgdGhl IGltcGxpY2l0ICYgYmV0d2Vlbgo7OyAgICAgICB0ZXJtcywgYXJvdW5kIHRoZSBjb21wYXJpc29u IG9wZXJhdG9ycyBpbiBwcm9wZXJ0eSBzZWFyY2hlcywKOzsgICAgICAgYW5kIGFyb3VuZCArLy0g c2VsZWN0b3JzLiBTcGFjZXMgYXJlIG5vdCBpZ25vcmVkIGluc2lkZSB7fSdzCjs7ICAgICAgIGZv ciBhIHJlZ2V4cCBtYXRjaC4gVHJ1dGggYmUgdG9sZCwgSSBwcmVmZXIgaGF2aW5nIG5vIHNwYWNl cwo7OyAgICAgICBhZnRlciB0aGUgKy8tIHNlbGVjdG9ycywgYnV0IGl0IHNlZW1zIHNvbWV3aGF0 Li4uaGFyc2ggdG8gaW5zaXN0Cjs7ICAgICAgIG9uIHRoYXQgZm9yIGV2ZXJ5b25lLiBMaXZlIGFu ZCBsZXQgbGl2ZS4KOzsgCjs7ICAgIGcuIFRoZSBjdXJyZW50IGNvZGUgYWxzbyBhbGxvd3MgKy8t IHNlbGVjdG9ycyBiZWZvcmUgcHJvcGVydHkKOzsgICAgICAgY29tcGFyaXNvbnMuIEkgZG9uJ3Qg cmVhbGx5IGxpa2UgdGhpcyBiZWNhdXNlCjs7ICAgICAgICtQUk9QPD4ic29tZXRoaW5nIiBhbmQg LVBST1A9InNvbWV0aGluZyIgaGF2ZSB0aGUgc2FtZQo7OyAgICAgICBtZWFuaW5nIGJ1dCBsb29r IHZlcnkgZGlmZmVyZW50LiBCdXQgdGhlIG5ldyBjb2RlIGRvZXMKOzsgICAgICAgc3VwcG9ydCB0 aGlzLiBBcyBhIHNpZGUgbm90ZSwgdGhlcmUncyByZWFsbHkgbm8gbmVlZCBmb3IKOzsgICAgICAg dGhlICYgY2hhcmFjdGVycyBhcyArLy0gc2VydmUgdGhlIGFuZC9hbmQtbm90IGZ1bmN0aW9uCjs7 ICAgICAgIGNvbXBsZXRlbHkuIEJ1dCBhZ2Fpbiwgbm8gcHJvYi4KOzsgCjs7ICAgIGguIEEgZmV3 IGJ1Z3MgZGV0ZWN0ZWQgaW4gdGhlIDcuOC4xMSBjb2RlOgo7OyAKOzsgICAgICAgKyBGYXVsdHkg dGVzdCBmb3IgdG9kbyBtYXRjaGVyIGluIG9yZy1tYWtlLXRhZ3MtbWF0Y2hlcgo7OyAgICAgICAg IChzdHJpbmctbWF0Y2ggIi8rIiBtYXRjaCkKOzsgCjs7ICAgICAgICAgRXg6IChvcmctbWFrZS10 YWdzLW1hdGNoZXIgIlBST1A9e15cXHMtKi8vIC4qJH0iKSBwcm9kdWNlcyAKOzsgICAgICAgICBh biBlcnJvbmVvdXMgbWF0Y2hlcjoKOzsgCjs7ICAgICAgICAgICAgICgiUFJPUD17Xlxccy0qLy8g LiokfSIgcHJvZ24KOzsgICAgICAgICAgICAgIChzZXRxIG9yZy1jYWNoZWQtcHJvcHMgbmlsKQo7 OyAgICAgICAgICAgICAgKG1lbWJlciAiUFJPUCIgdGFncy1saXN0KSkKOzsgCjs7ICAgICAgICAg Rm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMgaXQgd2lsbCBiZSBlbm91Z2ggdG8gZG86Cjs7ICAg ICAgICAgCjs7ICAgICAgICAgIChzdHJpbmctbWF0Y2ggIlxcKC9cXCghXFwpP1xccy0qXFwpW157 fVwiXSokIiBtYXRjaCkKOzsgICAgICAgICAgICAgICAKOzsgICAgICAgICBpbnN0ZWFkIG9mIHRo ZSBjdXJyZW50IHRlc3QgaW4gb3JnLW1ha2UtdGFncy1tYXRjaGVyLgo7OyAgICAgICAgIFRoaXMg d29ya3MgYXMgbG9uZyBhcyB0aGUgVE9ETyBrZXl3b3JkcyBkbyBub3QgY29udGFpbiBhCjs7ICAg ICAgICAgcmlnaHQgYnJhY2Ugb3IgcXVvdGF0aW9uIG1hcmtzLiAoSW4gbW9zdCBvdGhlciBjYXNl cywgdGhlCjs7ICAgICAgICAgbmV3IHBhcnNlciBzaG91bGQgZ2l2ZSBhbiBlcnJvciBtZXNzYWdl IGF0IHBhcnNlIHRpbWUuKQo7OyAgICAgICAgIAo7OyAgICAgICAgIEEgdGVjaG5pY2FsaXR5OiB0 aGlzIGlzIC9ub3QvIGEgY29tcGxldGUgc29sdXRpb24gYmVjYXVzZQo7OyAgICAgICAgIGFyYml0 cmFyeSBzdHJpbmdzIGNhbiBiZSBUT0RPIGtleXdvcmRzLiBGb3IgaW5zdGFuY2UsCjs7ICAgICAg ICAgYm90aCBQUk9QPXsvIX0gYW5kIFBST1A9Ii8hey8hfSIgYXJlIHZhbGlkIFRPRE8ga2V5d29y ZHMKOzsgICAgICAgICAoaXQgd29ya3MhKSAqYW5kKiB2YWxpZCBwcm9wZXJ0eSBjb21wYXJpc29u cy4gU28sIGEgcGF0dGVybgo7OyAgICAgICAgIGFsb25lIGlzIGluc3VmZmljaWVudC4gV2Ugd2Fu dCB0byBmaW5kIHRoZSBmaXJzdCBzbGFzaAo7OyAgICAgICAgIHRoYXQgaXMgbm90IGVuY2xvc2Vk IGluIHt9J3Mgb3IgIiInczsgaWYgZm91bmQsIGEgdG9kbwo7OyAgICAgICAgIG1hdGNoIGlzIG5l ZWRlZC4gVGhlIGZ1bmN0aW9uIGBvcmctZmluZC10b2RvLXF1ZXJ5JyBkb2VzCjs7ICAgICAgICAg dGhpcyBhbmQgKG9yZy1maW5kLXRvZG8tcXVlcnkgbWF0Y2gpIGNhbiBiZSBwbHVnZ2VkIGluCjs7 ICAgICAgICAgZGlyZWN0bHkgcmVwbGFjaW5nIHRoZSBhYm92ZSAoc3RyaW5nLW1hdGNoIC4uLikg aW4gdGhlbgo7OyAgICAgICAgIG5ldyBgb3JnLW1ha2UtdGFncy1tYXRjaGVyJy4KOzsgICAgICAg ICAKOzsgICAgICAgICBCdXQgYmVjYXVzZSB0aGUgdG9kbyBwYXJzaW5nIHVzZXMge30ncyBmb3Ig cmVnZXggbWF0Y2hlcywKOzsgICAgICAgICBUT0RPIGtleXdvcmRzIHdpdGgge30ncyBhcmUgaWdu b3JlZCBhbnl3YXkuIFNvIHRoZXJlJ3MKOzsgICAgICAgICBubyBuZWVkIHRvIGdvIGJleW9uZCB0 aGUgZml4ZWQgc3RyaW5nLW1hdGNoIGFib3ZlLgo7OyAgICAgICAgIFRoZSBmdW5jdGlvbiBgb3Jn LXRvZG8tcXVlcnktcGFyc2UnLCB3aGljaCBoYW5kbGVzIHRvZG8KOzsgICAgICAgICBwYXJzaW5n IGluIHRoZSBuZXcgdmVyc2lvbiwgbWFrZXMgdGhpcyBleHBsaWNpdC4KOzsgICAgICAgICAKOzsg ICAgICAgKyBQcm9wZXJ0eSBuYW1lcyB3aXRoIC0ncyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkg KGNmLiBOb3RlIGQpCjs7ICAgICAgICAgCjs7ICAgICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgZXNj YXBlcyBhcmUgbm90IHJlbW92ZWQuIEV4YW1wbGU6Cjs7ICAgICAgICAgKG9yZy1tYWtlLXRhZ3Mt bWF0Y2hlciAiUFJPUFxcLVdJVEhcXC1IWVBIRU5TPTIiKQo7OyAgICAgICAgIHByb2R1Y2VzCjs7 ICAgICAgICAgCjs7ICAgICAgICAgKCJQUk9QXFwtV0lUSFxcLUhZUEhFTlM9MiIgYW5kCjs7ICAg ICAgICAgIChwcm9nbgo7OyAgICAgICAgICAoc2V0cSBvcmctY2FjaGVkLXByb3BzIG5pbCkKOzsg ICAgICAgICAgKD0KOzsgICAgICAgICAgIChzdHJpbmctdG8tbnVtYmVyCjs7ICAgICAgICAgICAg KG9yIChvcmctY2FjaGVkLWVudHJ5LWdldCBuaWwgIlBST1BcXC1XSVRIXFwtSFlQSEVOUyIpCjs7 ICAgICAgICAgICAgIiIpKQo7OyAgICAgICAgICAgMikpCjs7ICAgICAgICAgIHQpCjs7ICAgICAg ICAgCjs7ICAgICAgICAgVGhlIG9yaWdpbmFsIGNvZGUgL2RvZXMvIGluc3RlYWQgcmVtb3ZlIC0n cyBmcm9tIHRhZwo7OyAgICAgICAgIG5hbWVzLCB3aGljaCBzaG91bGRuJ3QgaGF2ZSB0aGVtIGFu eXdheS4gSSBzdXNwZWN0IHRoYXQKOzsgICAgICAgICB0aGlzIHdhcyBpbnRlbmRlZCBmb3IgcHJv cGVydHkgbmFtZXMgcmF0aGVyIHRoYW4gdGFnCjs7ICAgICAgICAgbmFtZXMuIFRoZSBuZXcgdmVy c2lvbiBmaXhlcyB1cCBwcm9wZXJ0eSBuYW1lcyBidXQgZG9lcwo7OyAgICAgICAgIG5vdCBhbGxv dyAtJ3MgaW4gdGFncy4KOzsgCjs7ICAgICAgICsgSW5jb3JyZWN0IGNvbXBhcmlzb24gb3BlcmF0 b3JzIGFsbG93ZWQgKGNmLiBOb3RlIGUpCjs7ICAgICAgICAgCjs7ICAgICAgICAgVGhlIHJlZ3Vs YXIgZXhwcmVzc2lvbiB1c2VkIGlzICJbPD0+XVxcezEsMlxcfSIgaXMgdXNlZCB0bwo7OyAgICAg ICAgIGRldGVjdCB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMuIEJ1dCB0aGlzIGNhbiBwcm9kdWNl IGJhZAo7OyAgICAgICAgIG1hdGNoZXJzIHRoYXQgZmFpbCBvcGFxdWVseSBhdCBtYXRjaCB0aW1l IHJhdGhlciB0aGFuIAo7OyAgICAgICAgIGdpdmluZyBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNz YWdlIGF0IHBhcnNlIHRpbWUuCjs7IAo7OyAgICAgICAgIEV4OiAob3JnLW1ha2UtdGFncy1tYXRj aGVyICJQPDwyIikgcHJvZHVjZXMKOzsgCjs7ICAgICAgICAgICgiUDw8MiIgYW5kCjs7ICAgICAg ICAgICAocHJvZ24KOzsgICAgICAgICAgICAgKHNldHEgb3JnLWNhY2hlZC1wcm9wcyBuaWwpCjs7 ICAgICAgICAgICAgIChuaWwKOzsgICAgICAgICAgICAgIChzdHJpbmctdG8tbnVtYmVyIChvciAo b3JnLWNhY2hlZC1lbnRyeS1nZXQgbmlsICJQIikgIiIpKSAyKSkKOzsgICAgICAgICAgIHQpCjs7 IAo7OyAgICAgICAgIFRoaXMgaXMgZml4ZWQgaW4gdGhlIG5ldyB2ZXJzaW9uIGFuZCBkZWxpdmVy cyBhbiBlcnJvciAKOzsgICAgICAgICBtZXNzYWdlIGF0IHBhcnNlIHRpbWUuCjs7IAo7OyAgICAg ICArIG1pc3Npbmcgb3JnLXJlIChsaW5lIDcxNzkgaW4gb3JnLmVsKSB3aXRoIHBvc2l4IGNsYXNz ZXMKOzsgICAgICAgICAKOzsgICAgICAgICBNaW5vciBjb25zaXN0ZW5jeSBpc3N1ZS4gIFRoaXMg bGluZSBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgbmV3Cjs7ICAgICAgICAgY29kZS4KOzsKOzsgIFdo YXQgZm9sbG93cyBpcyBhIGdyYW1tYXIgZm9yIHRoZSB1cGRhdGVkIHRhZyBxdWVyeSBkc2wsIHdo aWNoIGlzCjs7ICBnaXZlbiBpbiBhbiBpbmZvcm1hbCBoeWJyaWQgb2YgQk5GIGFuZCByZWdleCBv cGVyYXRvcnMuIEhvcGVmdWxseSwgaXQncwo7OyAgY2xlYXIgZW5vdWdoLiBUaGUgbm9uLW9idmlv dXMgdGVybWluYWxzIGFyZSBBTEwgQ0FQUyBhbmQgYXJlIGxpc3RlZCBiZWxvdy4KOzsgCjs7ICBH cmFtbWFyOgo7OyAgICBFeHByZXNzaW9uICA8LSAgQ29uanVuY3Rpb24gKE9SIENvbmp1bmN0aW9u KSoKOzsgICAgQ29uanVuY3Rpb24gPC0gIFRlcm0gKEFORD8gVGVybSkqCjs7ICAgIFRlcm0gICAg ICAgIDwtICBTRUxFQ1RPUj8gVEFHX0lERU5UCjs7ICAgICAgICAgICAgICAgICB8ICBTRUxFQ1RP Uj8gTEJSQUNFIFJlZ2V4IFJCUkFDRQo7OyAgICAgICAgICAgICAgICAgfCAgU0VMRUNUT1I/IFBS T1BfSURFTlQgQ01QX09QIE5VTUJFUgo7OyAgICAgICAgICAgICAgICAgfCAgU0VMRUNUT1I/IFBS T1BfSURFTlQgQ01QX09QIFNUUklORwo7OyAgICAgICAgICAgICAgICAgfCAgU0VMRUNUT1I/IFBS T1BfSURFTlQgQ01QX09QIERBVEVfU1RSSU5HCjs7ICAgICAgICAgICAgICAgICB8ICBTRUxFQ1RP Uj8gUFJPUF9JREVOVCBNQVRDSF9PUCBMQlJBQ0UgUkVHRVggUkJSQUNFCjs7ICAgICAgICAgICAg ICAgICB8ICBTRUxFQ1RPUj8gTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOCjs7ICAgICAgICAgICAg ICAgICAKOzsgIFRlcm1pbmFscyAodGhlIG5vbm9idmlvdXMgb25lcyk6Cjs7ICAgIE9SID0gfAo7 OyAgICBBTkQgPSAmCjs7ICAgIENNUF9PUCA9ICg9PXw9fDw9fDw+fD49fD58PCkKOzsgICAgTUFU Q0hfT1AgPSAoPT18PXw8PikKOzsgICAgVEFHX0lERU5UID0gW0EtWmEtejAtOV9AIyVdKyAgICAg ICAgIAo7OyAgICBQUk9QX0lERU5UID0gKFtBLVphLXowLTlfXSsoXFwtKSopKyAgCjs7ICAgIFNF TEVDVE9SPyA9IFstK10/Cjs7ICAgIFNUUklORyA9IGJhbGFuY2VkIGRvdWJsZS1xdW90ZWQgc3Ry aW5nIHdpdGggZXNjYXBlcwo7OyAgICBEQVRFX1NUUklORyA9IG9yZyBzdHlsZSBkYXRlIHN0cmlu Zwo7OyAgICBSRUdFWFAgPSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB7IGFuZCB9IGRvdWJsZWQg dG8gZXNjYXBlLCB7eyBhbmQgfX0KOzsKCgo7OzsgTGljZW5zZToKOzsKOzsgVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgo7OyBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cwo7OyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMywgb3IKOzsgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KOzsKOzsg VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCjs7IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KOzsKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwo7OyB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoCjs7IEZsb29y LCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KOzsKCgo7OzsgQ29kZToKCihldmFsLXdoZW4t Y29tcGlsZQogIChyZXF1aXJlICdjbCkpCihyZXF1aXJlICdvcmcpCgoKOzs7IFV0aWxpdGllcwoK KGRlZnVuIG9yZy1yZWFkLWJhbGFuY2VkLXN0cmluZyAob3Blbi1kZWxpbSBjbG9zZS1kZWxpbSkK ICAiUmV0dXJuIHN0cmluZyBkZWxpbWl0ZWQgYnkgT1BFTi1ERUxJTSBhbmQgQ0xPU0UtREVMSU0g d2l0aCBlc2NhcGVzLgpPUEVOLURFTElNIGFuZCBDTE9TRS1ERUxJTSBtdXN0IGJlICpkaXN0aW5j dCogY2hhcmFjdGVycy4gUmVhZGluZwpiZWdpbnMgYXQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgYnVm ZmVyLiBUbyBpbmNsdWRlIE9QRU4tREVMSU0gYW5kCkNMT1NFLURFTElNIGluc2lkZSB0aGUgc3Ry aW5nIGJlaW5nIHJlYWQsIHRob3NlIGNoYXJhY3RlcnMgbXVzdApiZSAqZG91YmxlZCogYW5kIG9u bHkgb25lIGNvcHkgb2YgdGhlIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZQpzdHJpbmcuIFRoZSBv cGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgZm9yIHRoZSByZWFkIHNlcXVlbmNlCm11c3Qg YmUgc2luZ2xlIGNvcGllcywgYW5kIGFuIHVuZXNjYXBlZCBPUEVOLURFTElNIHdpbGwgcmFpc2Ug YW4KZXJyb3IuIgogICh3aGVuIChjaGFyLWVxdWFsIG9wZW4tZGVsaW0gY2xvc2UtZGVsaW0pCiAg ICAoZXJyb3IgIk9wZW4gYW5kIGNsb3NlIGRlbGltaXRlcnMgbXVzdCBiZSBkaXN0aW5jdCwgJWMi IG9wZW4tZGVsaW0pKQogICh1bmxlc3MgKGNoYXItZXF1YWwgKGNoYXItYWZ0ZXIpIG9wZW4tZGVs aW0pCiAgICAoZXJyb3IgIk1pc3Npbmcgb3BlbmluZyAlYyBpbiBkZWxpbWl0ZWQgc3RyaW5nIiBv cGVuLWRlbGltKSkKICAoZm9yd2FyZC1jaGFyIDEpIDsgc2tpcCBpbml0aWFsIGRlbGltaXRlcgog IChsZXQgKChkZWxpbS1yZSAoZm9ybWF0ICJbJWMlY10iIG9wZW4tZGVsaW0gY2xvc2UtZGVsaW0p KQogICAgICAgIChkZWxpbXMtdW5iYWxhbmNlZCB0KQogICAgICAgIChiZWdpbiAocG9pbnQpKQog ICAgICAgIChmcmFnbWVudHMgbmlsKQogICAgICAgIChjaCBuaWwpKQogICAgKHdoaWxlIChhbmQg ZGVsaW1zLXVuYmFsYW5jZWQgKHJlLXNlYXJjaC1mb3J3YXJkIGRlbGltLXJlIG5pbCB0KSkKICAg ICAgKHNldHEgY2ggKGNoYXItYmVmb3JlKSkKICAgICAgKGNvbmQKICAgICAgICAoKGNoYXItZXF1 YWwgY2ggb3Blbi1kZWxpbSkKICAgICAgICAgKHNldHEgY2ggKGNoYXItYWZ0ZXIpKQogICAgICAg ICAoaWYgKG5vdCAoYW5kIGNoIChjaGFyLWVxdWFsIGNoIG9wZW4tZGVsaW0pKSkKICAgICAgICAg ICAgIChlcnJvciAiVW5lc2NhcGVkIG9wZW4gZGVsaW1pdGVyICVjIGluIGJhbGFuY2VkIHN0cmlu ZyIgb3Blbi1kZWxpbSkKICAgICAgICAgICAocHVzaCAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9w ZXJ0aWVzIGJlZ2luICgxLSAocG9pbnQpKSkgZnJhZ21lbnRzKQogICAgICAgICAgIChzZXRxIGJl Z2luIChwb2ludCkpCiAgICAgICAgICAgKGZvcndhcmQtY2hhciAxKSkpCiAgICAgICAgKChjaGFy LWVxdWFsIGNoIGNsb3NlLWRlbGltKQogICAgICAgICAoc2V0cSBjaCAoY2hhci1hZnRlcikpCiAg ICAgICAgIChpZiAobm90IChhbmQgY2ggKGNoYXItZXF1YWwgY2ggY2xvc2UtZGVsaW0pKSkKICAg ICAgICAgICAgIChzZXRxIGRlbGltcy11bmJhbGFuY2VkIG5pbCkKICAgICAgICAgICAocHVzaCAo YnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzIGJlZ2luICgxLSAocG9pbnQpKSkgZnJhZ21l bnRzKQogICAgICAgICAgIChzZXRxIGJlZ2luIChwb2ludCkpCiAgICAgICAgICAgKGZvcndhcmQt Y2hhciAxKSkpKSkKICAgICh3aGVuIGRlbGltcy11bmJhbGFuY2VkCiAgICAgIChlcnJvciAiVW5i YWxhbmNlZCBkZWxpbWl0ZXJzICVjJWMgaW4gYmFsYW5jZWQgc3RyaW5nIGF0IGNoYXIgJWQuIgog ICAgICAgICAgICAgb3Blbi1kZWxpbSBjbG9zZS1kZWxpbSAocG9pbnQpKSkKICAgIChwdXNoIChi dWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgYmVnaW4gKDEtIChwb2ludCkpKSBmcmFnbWVu dHMpCiAgICAoaWYgKG51bGwgKGNkciBmcmFnbWVudHMpKQogICAgICAgIChjYXIgZnJhZ21lbnRz KQogICAgICAoYXBwbHkgJ2NvbmNhdCAobnJldmVyc2UgZnJhZ21lbnRzKSkpKSkKCihkZWZ1biBv cmctcmVhZC1xdW90ZWQtc3RyaW5nLWluLXF1ZXJ5ICgpCiAgIlJlYWQgYSBxdW90ZWQgc3RyaW5n LCB3aXRoIGVzY2FwZXMsIHN0YXJ0aW5nIGF0IHBvaW50LgpBc3N1bWUgdGhhdCBhbiBvcGVuaW5n IHF1b3RlIGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gVGhpcyBpcyBqdXN0CmEgd3JhcHBlciBmb3Ig YHJlYWQnIHRoYXQgcmVwb3J0cyBlcnJvcnMgbmljZWx5LiIKICAobGV0ICgoc3RhcnQgKHBvaW50 KSkpCiAgICAoY29uZGl0aW9uLWNhc2UgZXhjZXB0aW9uCiAgICAgICAgKHJlYWQgKGN1cnJlbnQt YnVmZmVyKSkKICAgICAgKGVycm9yCiAgICAgICAob3JnLXRxdWVyeS1lcnJvcgogICAgICAgICJi YWRseSBmb3JtZWQgcXVvdGVkIHZhbHVlIGluIHByb3BlcnR5IGNvbXBhcmlzb24iIDpwb3Mgc3Rh cnQpKSkpKQoKOzsgSSdtIGluY2xpbmVkIHRvIGRlZmluZSBhbiBlcnJvciBzeW1ib2xzIGhlcmUg dG8gYWxsb3cgZmluZXIgY29udHJvbC4KOzsgQnV0IGVycm9yIHN5bWJvbHMgZG9uJ3Qgc2VlbSB0 byBiZSB1c2VkIGluIHRoZSBtYWluIG9yZyBjb2RlLCBzbyBJJ2xsCjs7IGZvcmdvIHRoZW0gaGVy ZSBhbmQgdXNlIGBlcnJvcicgZGlyZWN0bHkuICAtLSBDUkcgMzEgSnVseSAyMDEyCihkZWZ1biBv cmctdHF1ZXJ5LWVycm9yIChpbmZvICZyZXN0IG90aGVyLWFyZ3MpCiAgIlJhaXNlIGEgcXVlcnkg cGFyc2luZyBlcnJvci4KSU5GTyBpcyBhbiBhdXhpbGxpYXJ5IG1lc3NhZ2Ugd2hpY2ggaXMgYXBw ZW5kZWQgdG8gdGhlIHN0YW5kYXJkCm1lc3NhZ2UgYW5kIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSBm b3JtYXQgc3RyaW5nIGZvciBPVEhFUi1BUkdTLgpUaGlzIG5lZWQvc2hvdWxkIG5vdCBiZSBjYXBp dGFsaXplZC4gVGhlIGVuZCBvZiBPVEhFUi1BUkdTIGNhbgpjb250YWluIGtleXdvcmQtdmFsdWUg cGFpcnMgOnBvcyA8bnVtYmVyLW9yLW1hcmtlcj4gYW5kIDp0eXBlCjxkZXNjcmlwdGl2ZSBzdHJp bmc+IHRvIGNvbnRyb2wgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2UuIFRoZQpmb3JtZXIgZGVmYXVs dHMgdG8gcG9pbnQgKHBvc2l0aW9uIGluIHRoZSBxdWVyeSBzdHJpbmcpIGFuZCB0aGUKbGF0dGVy IGRlZmF1bHRzIHRvIGB0YWcnLiIKICAobGV0KiAoKHBvcyAob3IgKGNhZHIgKG1lbXEgOnBvcyBv dGhlci1hcmdzKSkgKHBvaW50KSkpCiAgICAgICAgIChxdHlwZSAob3IgKGNhZHIgKG1lbXEgOnR5 cGUgb3RoZXItYXJncykpICJ0YWcgIikpKQogICAgKGVycm9yIChmb3JtYXQgIlBhcnNlIGVycm9y IGluICVzcXVlcnkgYXQgY2hhcmFjdGVyICVkLCAlcyIKICAgICAgICAgICAgICAgICAgIHF0eXBl IHBvcyAoYXBwbHkgJ2Zvcm1hdCBpbmZvIG90aGVyLWFyZ3MpKSkpKQoKOzsgVGhpcyBpcyB1c2Vk IHRvIGRlZmluZSB0aGUgcGFyc2VyIHN5bWJvbCB0YWJsZSBhdCBjb21waWxlIHRpbWUuCihkZWZt YWNybyBvcmctZGVmaGFzaC1hdC1jb21waWxlIChuYW1lIG9wdGlvbnMgJnJlc3QgYm9keSkgCiAg IkRlZmluZSBhIGhhc2ggdGFibGUgTkFNRSBhdCBjb21waWxlIHRpbWUgYW5kL29yIGxvYWQtdGlt ZS4KT1BUSU9OUyBpcyBhIGxpc3QsIHBvc3NpYmx5IGVtcHR5LCBvZiBvcHRpb25zIHRvIHBhc3Mg dG8KYG1ha2UtaGFzaC10YWJsZScuIEJPRFkgaXMgYSBsaXN0IG9mIHNlcXVlbmNlcyAobGlzdHMg b3IKdmVjdG9ycyksIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgYSBrZXkgdmFsdWUgcGFpci4gVGhl IGtleSBhbmQKdGhlIHZhbHVlIHdpbGwgYmUgZXZhbHVhdGVkLCBzbyBmb3IgZXhhbXBsZSwgYSBz eW1ib2wga2V5IHNob3VsZApiZSBxdW90ZWQuIgogIChkZWNsYXJlIChpbmRlbnQgMikpCiAgKGxl dCogKChkb2NzdHJpbmcgKGFuZCAoc3RyaW5ncCAoY2FyIGJvZHkpKSAoY2FyIGJvZHkpKSkKICAg ICAgICAgKHRhYmxlIChpZiBkb2NzdHJpbmcgKGNkciBib2R5KSBib2R5KSkpCiAgICBgKGV2YWwt YW5kLWNvbXBpbGUKICAgICAgIChkZWZ2YXIgLG5hbWUgKG1ha2UtaGFzaC10YWJsZSAsQG9wdGlv bnMpICxkb2NzdHJpbmcpCiAgICAgICAsQChtYXBjYXIgKGxhbWJkYSAocykgYChwdXRoYXNoICwo ZWx0IHMgMCkgLChlbHQgcyAxKSAsbmFtZSkpIHRhYmxlKSkpKQoKCjs7OyBSZWdleCBjb21wYXJp c29uIGZ1bmN0aW9ucyBpbiBhIGZvcm0gbGlrZSB0aGUgb3RoZXIgY29tcGFyaXNvbiBvcGVyYXRv cnMKCihkZWZ1biBvcmctc3RyaW5nLW1hdGNoPSAoc3RyaW5nIHJlZ2V4cCkKICAoc3RyaW5nLW1h dGNoLXAgcmVnZXhwIHN0cmluZykpCgooZGVmdW4gb3JnLXN0cmluZy1tYXRjaDw+IChzdHJpbmcg cmVnZXhwKQogIChub3QgKHN0cmluZy1tYXRjaC1wIHJlZ2V4cCBzdHJpbmcpKSkKCgo7OzsgUGFy c2luZyB1dGlsaXR5IGZvciByZWFkYWJsZSBtYXRjaGVycwoKKG9yZy1kZWZoYXNoLWF0LWNvbXBp bGUgb3JnLXRhZy1xdWVyeS10ZXJtaW5hbHMgKCkKICAiTGV4aWNhbCB0b2tlbiByZWdleGVzIGZv ciB0YWcgcXVlcnkgcGFyc2luZy4KSGFzaCB0YWJsZSBhbHNvIGNvbnRhaW5zIHRoZSBzeW1ib2xz ICssICogYW5kID8gdGhhdCBjYW4gYmUgdXNlZAp0byByZXByZXNlbnQgcmVwZXRpdGlvbiBvcGVy YXRvcnMgaW4gbWF0Y2hlZCBleHByZXNzaW9ucywKZS5nLiwgKE5VTUJFUikrIG9yIChTRUxFQ1RP UilcPy4gKD8gbXVzdCBiZSBlc2NhcGVkLikiCiAgWydURVJNLUJFR0lOICAgIChvcmctcmUgIlst K1s6YWxudW06XV97KF0iKV0KICBbJ1NFTEVDVE9SICAgICAgIlstK10iXQogIFsnVEFHLUlERU5U ICAgICAob3JnLXJlICAiW1s6YWxudW06XV9AIyU6XSsiKV0KICBbJ1BST1AtSURFTlQgICAgKG9y Zy1yZSAiXFwoPzpbWzphbG51bTpdX10rXFwoPzpcXFxcLVxcKSpcXCkrIildCiAgWydDTVAtT1Ag ICAgICAgICJcXCg/Oj09P1xcfDw9XFx8PD5cXHw+PVxcfDxcXHw+XFwpIl0KICBbJ01BVENILU9Q ICAgICAgIlxcKD86PT0/XFx8PD5cXCkiXQogIFsnQ01QLVJIUy1CRUdJTiAob3JnLXJlICJcXCg/ OntcXHxcXFwiXFx8LT9bLls6ZGlnaXQ6XV1cXCkiKV0KICBbJ1JFR0VYLU9QRU4gICAgInsiXQog IFsnR1JPVVAtT1BFTiAgICAiKCJdCiAgWydHUk9VUC1DTE9TRSAgICIpIl0KICBbJ09SLU9QICAg ICAgICAgInwiXQogIFsnQU5ELU9QICAgICAgICAiJiJdCiAgWydEQVRFLVNUUklORyAgICJcIltb PF0uKj9bXT5dXCIiXQogIFsnSU5URUdFUiAgICAgICAob3JnLXJlICItP1tbOmRpZ2l0Ol1dKyIp XQogIFsnTlVNQkVSICAgICAgICAiLT9cXCg/OlxcLlswLTldK1xcfFswLTldK1xcKFxcLlswLTld KlxcKT9cXClcXCg/OltlRV1bLStdWzAtOV0rXFwpPyJdCiAgWydTUEFDRSAgICAgICAgICJbWzpi bGFuazpdXSJdCiAgWydTUEFDRSogICAgICAgICJbWzpibGFuazpdXSoiXQogIFsnKiAgICAgICAg ICAgICAiKiJdCiAgWycrICAgICAgICAgICAgICIrIl0KICBbJ1w/ICAgICAgICAgICAgIj8iXSkK CihvcmctZGVmaGFzaC1hdC1jb21waWxlIG9yZy10YWctcXVlcnktY21wLW9wcyAoOnRlc3QgJ2Vx dWFsKQogICJNYXBzIGNvbXBhcmlzb24gb3BlcmF0b3Igc3RyaW5ncyB0byBhIHZlY3RvciBvZiBj b21wYXJpc29uIGZ1bmN0aW9ucy4KVGhlIGZ1bmN0aW9ucyBhcmUgYXJyYW5nZWQgaW4gdGhlIHZl Y3RvciBmb3IgZGlmZmVyZW50IHR5cGVzIGFzIGZvbGxvd3M6CiAgICAgICAgIE5VTSAgIFNUUklO RyAgICAgICBUSU1FICAgICAgIFJFR0VYIgogICgiPSIgIFs9ICAgICBzdHJpbmc9ICAgICAgb3Jn LXRpbWU9ICBvcmctc3RyaW5nLW1hdGNoPV0pCiAgKCI9PSIgWz0gICAgIHN0cmluZz0gICAgICBv cmctdGltZT0gIG9yZy1zdHJpbmctbWF0Y2g9XSkKICAoIjw+IiBbb3JnPD4gb3JnLXN0cmluZzw+ IG9yZy10aW1lPD4gb3JnLXN0cmluZy1tYXRjaDw+XSkKICAoIjwiICBbPCAgICAgc3RyaW5nPCAg ICAgIG9yZy10aW1lPCAgbmlsXSkKICAoIjw9IiBbPD0gICAgb3JnLXN0cmluZzw9IG9yZy10aW1l PD0gbmlsXSkKICAoIj49IiBbPj0gICAgb3JnLXN0cmluZz49IG9yZy10aW1lPj0gbmlsXSkKICAo Ij4iICBbPiAgICAgb3JnLXN0cmluZz4gIG9yZy10aW1lPiAgbmlsXSkpCgooZXZhbC1hbmQtY29t cGlsZQogIDs7IEknZCBwcmVmZXIgZ2Vuc3ltcyBmb3IgdGhpcywgYnV0IHJlYWxpc3RpY2FsbHkg dGhpcyB3aWxsIGRvLgogIChkZWZ2YXIgb3JnLXRhZy1xdWVyeS9wcml2YXRlLW9wdC1jaC0gbmls CiAgICAiVGhpcyB2YXJpYWJsZSBzaG91bGQgbm90IGJlIHNldCBieSB0aGUgdXNlciwgZXZlbiBs b2NhbGx5LgpJdCBzaG91bGQgcmVtYWluIG5pbCBvciBjaGFvcyBtYXkgZW5zdWUuIikKCiAgKGRl ZnVuIG9yZy1zdHJpbmctYXMtY2hhci1wIChzKQogICAgIklzIFMgYSBzdHJpbmcgb2YgYSBzaW5n bGUsIHBvc3NpYmx5IGJhY2tzbGFzaC1lc2NhcGVkLCBjaGFyYWN0ZXI/CklmIHNvLCByZXR1cm4g dGhlIGNoYXJhY3RlciB0aGlzIHJlcHJlc2VudHMsIG90aGVyd2lzZSBuaWwuIgogICAgKGlmIChz dHJpbmdwIHMpCiAgICAgICAgKGxldCAoKGxlbiAobGVuZ3RoIHMpKSkKICAgICAgICAgIChvciAo YW5kICg9IDEgbGVuKSAoc3RyaW5nLXRvLWNoYXIgcykpCiAgICAgICAgICAgICAgKGFuZCAoPSAy IGxlbikgKGNoYXItZXF1YWwgP1xcIChzdHJpbmctdG8tY2hhciBzKSkgKGFyZWYgcyAxKSkpKQog ICAgICBuaWwpKQoKICAoZGVmdW4gb3JnLXRhZy1xdWVyeS1tYXRjaGVyPC0gKHBhdHRlcm5zICZv cHRpb25hbCBhdXRvZ3JvdXAgdGVybWluYWxzIG5leHQtY2gpCiAgICAiQ29udmVydCBhIGxpc3Qg b2YgUEFUVEVSTlMgdG8gYSBgbG9va2luZy1hdCcgcXVlcnkuIApBVVRPR1JPVVAsIGlmIG5vbi1u aWwsIHR1cm5zIG9uIGF1dG9ncm91cGluZyBvZiBzaW5nbGV0b25zLgpURVJNSU5BTFMsIGlmIG5v bi1uaWwsIHNob3VsZCBiZSBhIGhhc2ggdGFibGUgZm9yIGF0dGVtcHRlZApzeW1ib2wgbG9va3Vw LiBTZWUgYG9yZy1tYXRjaC1jb25kJyBmb3IgbW9yZSBkZXRhaWxzIG9uClBBVFRFUk5TJ3MgZm9y bWF0LiIKICAgIChsZXQqICgoYWxsLXN0cmluZ3MKICAgICAgICAgICAgKGxhbWJkYSAoZWxlbWVu dHMpCiAgICAgICAgICAgICAgKGxldCAoKHB0ciBlbGVtZW50cykpCiAgICAgICAgICAgICAgICAo d2hpbGUgKGFuZCBwdHIgKHN0cmluZ3AgKGNhciBwdHIpKSkKICAgICAgICAgICAgICAgICAgKHNl dHEgcHRyIChjZHIgcHRyKSkpCiAgICAgICAgICAgICAgICAobnVsbCBwdHIpKSkpCiAgICAgICAg ICAgKHJlcGxhY2UtdGVybWluYWwKICAgICAgICAgICAgKGxhbWJkYSAoaXRlbSkKICAgICAgICAg ICAgICAoY29uZCAoKG5vdCAoaGFzaC10YWJsZS1wIHRlcm1pbmFscykpIGl0ZW0pCiAgICAgICAg ICAgICAgICAgICAgKChzeW1ib2xwIGl0ZW0pICAgIChnZXRoYXNoIGl0ZW0gdGVybWluYWxzIGl0 ZW0pKQogICAgICAgICAgICAgICAgICAgICh0ICAgICAgICAgICAgICAgICBpdGVtKSkpKQogICAg ICAgICAgIChwdXNoLWFsbAogICAgICAgICAgICAobGFtYmRhIChzcmMgZGVzdCkgKGRvbGlzdCAo cyBzcmMgZGVzdCkgKHB1c2ggcyBkZXN0KSkpKQogICAgICAgICAgIChhbHRlcm5hdGl2ZXMKICAg ICAgICAgICAgKGxldCAocmhzIGFjYyBub2dyb3VwIG5vY2FwdHVyZSkKICAgICAgICAgICAgICAo ZG9saXN0IChwIHBhdHRlcm5zIChwcm9nbiAocHVzaCAobnJldmVyc2UgcmhzKSBhY2MpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5yZXZlcnNlIGFjYykpKQogICAg ICAgICAgICAgICAgKGNvbmQgCiAgICAgICAgICAgICAgICAgKChlcSBwICd8KQogICAgICAgICAg ICAgICAgICAoaWYgKG51bGwgcmhzKQogICAgICAgICAgICAgICAgICAgICAgKG9yZy10cXVlcnkt ZXJyb3IgIm1pc3BsYWNlZCBhbHRlcm5hdGl2ZSBtYXJrZXIiKQogICAgICAgICAgICAgICAgICAg IChwdXNoIChucmV2ZXJzZSByaHMpIGFjYykKICAgICAgICAgICAgICAgICAgICAoc2V0cSByaHMg bmlsKSkpCiAgICAgICAgICAgICAgICAgKChlcSBwIDpub2dyb3VwKQogICAgICAgICAgICAgICAg ICAoc2V0cSBub2dyb3VwIHQpKQogICAgICAgICAgICAgICAgICgoZXEgcCA6bm9jYXB0dXJlKQog ICAgICAgICAgICAgICAgICAoc2V0cSBub2NhcHR1cmUgdCkpCiAgICAgICAgICAgICAgICAgKChv ciAoY29uc3AgcCkgKHZlY3RvcnAgcCkpIDsgY2FwdHVyaW5nL25vbmNhcHR1cmluZyBncm91cCBy ZXNwLgogICAgICAgICAgICAgICAgICAodW5sZXNzIG5vZ3JvdXAgOyBhbGxvdyBub2dyb3VwL25v Y2FwdHVyZSBoZXJlIGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICAgICAgICAgIChwdXNoIChp ZiAob3Igbm9jYXB0dXJlICh2ZWN0b3JwIHApKSAiXFwoPzoiICJcXCgiKSByaHMpKQogICAgICAg ICAgICAgICAgICAoc2V0cSByaHMgKGZ1bmNhbGwgcHVzaC1hbGwgKG1hcGNhciByZXBsYWNlLXRl cm1pbmFsIHApIHJocykpCiAgICAgICAgICAgICAgICAgICh1bmxlc3Mgbm9ncm91cAogICAgICAg ICAgICAgICAgICAgIChwdXNoICJcXCkiIHJocykpCiAgICAgICAgICAgICAgICAgIChzZXRxIG5v Z3JvdXAgbmlsIG5vY2FwdHVyZSBuaWwpKQogICAgICAgICAgICAgICAgICgoYW5kIGF1dG9ncm91 cCAobm90IG5vZ3JvdXApKQogICAgICAgICAgICAgICAgICAocHVzaCAoaWYgKG9yIG5vY2FwdHVy ZSAodmVjdG9ycCBwKSkgIlxcKD86IiAiXFwoIikgcmhzKQogICAgICAgICAgICAgICAgICAocHVz aCAoZnVuY2FsbCByZXBsYWNlLXRlcm1pbmFsIHApIHJocykKICAgICAgICAgICAgICAgICAgKHB1 c2ggIlxcKSIgcmhzKQogICAgICAgICAgICAgICAgICAoc2V0cSBub2dyb3VwIG5pbCBub2NhcHR1 cmUgbmlsKSkKICAgICAgICAgICAgICAgICAodAogICAgICAgICAgICAgICAgICAocHVzaCAoZnVu Y2FsbCByZXBsYWNlLXRlcm1pbmFsIHApIHJocykKICAgICAgICAgICAgICAgICAgKHNldHEgbm9n cm91cCBuaWwgbm9jYXB0dXJlIG5pbCkpKSkpKQogICAgICAgICAgIChtYXRjaGVycwogICAgICAg ICAgICAobWFwY2FyIChsYW1iZGEgKHB0ZXJtcykKICAgICAgICAgICAgICAgICAgICAgIChsZXQg KChmc3QgKGNhciBwdGVybXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjaCBuaWwp KQogICAgICAgICAgICAgICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICAgICAgICAg KChhbmQgKGNkciBwdGVybXMpIChmdW5jYWxsIGFsbC1zdHJpbmdzIHB0ZXJtcykpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgYChsb29raW5nLWF0ICwoYXBwbHkgJ2NvbmNhdCBwdGVybXMpKSkK ICAgICAgICAgICAgICAgICAgICAgICAgICgoY2RyIHB0ZXJtcykKICAgICAgICAgICAgICAgICAg ICAgICAgICBgKGxvb2tpbmctYXQgKGNvbmNhdCAsQHB0ZXJtcykpKQogICAgICAgICAgICAgICAg ICAgICAgICAgKChhbmQgbmV4dC1jaCAoc2V0cSBzY2ggKG9yZy1zdHJpbmctYXMtY2hhci1wIGZz dCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgIGAoYW5kIChjaGFyLWVxdWFsICxuZXh0LWNo ICxzY2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgb3JnLXRhZy1xdWVy eS9wcml2YXRlLW9wdC1jaC0gLHNjaCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHQKICAg ICAgICAgICAgICAgICAgICAgICAgICBgKGxvb2tpbmctYXQgLGZzdCkpKSkpCiAgICAgICAgICAg ICAgICAgICAgYWx0ZXJuYXRpdmVzKSkpCiAgICAgIChpZiAoY2RyIG1hdGNoZXJzKQogICAgICAg ICAgYChvciAsQG1hdGNoZXJzKQogICAgICAgIGAsKGNhciBtYXRjaGVycykpKSkpCgooZGVmbWFj cm8gb3JnLW1hdGNoLWNvbmQgKG9wdGlvbnMgJnJlc3QgY2xhdXNlcykKICAiTGlrZSBgY29uZCcs IGJ1dCBhbGxvd3Mgc3BlY2lhbCBmb3JtcyBpbiB0aGUgY2xhdXNlcyB0aGF0IGxvb2thaGVhZCBp biwKZXh0cmFjdCBmcm9tLCBhbmQgbW92ZSBpbiB0aGUgY3VycmVudCBidWZmZXIuIFRoZSBzcGVj aWFsIGZvcm1zCmFyZSBkZXNjcmliZWQgYmVsb3cuIE9QVElPTlMsIGlmIG5vbi1uaWwsIGlzIGVp dGhlciBhIHN5bWJvbCwKU1lNQk9MLVRBQkxFLCBib3VuZCB0byBhIGhhc2ggdGFibGUgZm9yIHN5 bWJvbCBsb29rdXAsIG9yIGEgbGlzdApvZiB0aGUgZm9ybSAoU1lNQk9MLVRBQkxFIE5FWFQtQ0hB Ui1TWU0gJnJlc3QgQklORElOR1MpLiBJZiBORVhULUNIQVItU1lNCmlzIG5vdCBuaWwsIGl0IHNo b3VsZCBiZSBhIHN5bWJvbCB0aGF0IHdpbGwgYmUgYm91bmQgdG8gdGhlIG5leHQgY2hhcmFjdGVy CmFuZCB1c2VkIHRvIG9wdGltaXplIHRoZSBtYXRjaGluZyBvZiBlc3BlY2lhbGx5IHNpbXBsZSBw YXR0ZXJucywgYXMgZGVzY3JpYmVkCmJlbG93LiBCSU5ESU5HUyBhcmUgc3RhbmRhcmQgbGV0IGJp bmRpbmdzIHdoaWNoIHdpbGwgdmlzaWJsZSBpbiB0aGUKQ0xBVVNFUy4gQ0xBVVNFUyBhcmUgc3Ry dWN0dXJlZCBsaWtlIHRoZSBjbGF1c2VzIGluIGBjb25kJy4KCiAgIExvb2thaGVhZDoKICAgICAo PC0gIFBBVFRFUk4uLi4gW3wgUEFUVEVSTi4uLl0qKSAgLS0gc3ltYm9sIGxvb2t1cCBpbiBTWU1C T0wtSEFTSAogICAgICg8PC0gUEFUVEVSTi4uLiBbfCBQQVRURVJOLi4uXSopICAtLSBzeW1ib2wg bG9va3VwICsgc2luZ2xldG9uIGF1dG9ncm91cGluZwogICAgICg8PD0gUEFUVEVSTi4uLiBbfCBQ QVRURVJOLi4uXSopICAtLSBubyBzeW1ib2wgbG9va3VwIG9yIGF1dG9ncm91cGluZwoKICAgICBF YWNoIHBhdHRlcm4gaW4gdGhlIGxpc3QgaXMgZWl0aGVyIGEgc3RyaW5nLCBhIHN5bWJvbCwgYQog ICAgIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgc3ltYm9scyAtLSByZXByZXNlbnRpbmcgY2FwdHVyaW5n CiAgICAgZ3JvdXBzLCBvciBhIHZlY3RvciBvZiBzdHJpbmdzIGFuZCBzeW1ib2xzIC0tIHJlcHJl c2VudGluZwogICAgIG5vbi1jYXB0dXJpbmcgZ3JvdXBzLiBUaGUgfCdzIHNlcGFyYXRlIGFsdGVy bmF0aXZlcyB0aGF0IGFyZQogICAgIHRlc3RlZCBsYXppbHkgKGEgbGEgYG9yJyk7IHRoZSBldmVu dHVhbCBzdHJpbmdzIGNvbXB1dGVkIGZvcgogICAgIHRoZSBwYXR0ZXJucyBpbiBlYWNoIGFsdGVy bmF0aXZlIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIKICAgICB0byBmb3JtIGEgcmVndWxhciBl eHByZXNzaW9uIHdoaWNoIGlzIHRlc3RlZCB3aXRoCiAgICAgYGxvb2tpbmctYXQnLiBXaGVuIHN5 bWJvbCBsb29rdXAgaXMgaW4gZWZmZWN0ICg8LSBhbmQgPDwtCiAgICAgZm9ybXMpLCBzeW1ib2xz IGluIGEgcGF0dGVybiBhcmUgZmlyc3QgbG9va2VkIHVwIGluCiAgICAgU1lNQk9MLVRBQkxFIGlm IGl0IGV4aXN0cywgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgY29ycmVzcG9uZGluZyB2YWx1 ZSBpZiBwcmVzZW50LiBJZiBhbGwgdGhlIHBhdHRlcm5zJ3MgaW4gYW4KICAgICBhbHRlcm5hdGl2 ZSByZXNvbHZlIHRvIHN0cmluZ3MgYXQgY29tcGlsZSB0aW1lLCB0aGUgcmVndWxhcgogICAgIGV4 cHJlc3Npb24gaXMgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lIGFuZCBhbGwgdGhlIGZvcm1zCiAg ICAgcmVkdWNlIHRvIGEgc2luZ2xlIGNhbGwgdG8gYGxvb2tpbmctYXQnLiBPdGhlcndpc2UsIHRo ZQogICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBjb21wdXRlZCBhdCBydW50aW1lLgoKICAgICBJ biB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZXJlIGFyZSBubyBhbHRlcm5hdGl2ZXMsIHRoZQog ICAgIHBhdHRlcm4gaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNoYXJhY3RlciBh dAogICAgIGNvbXBpbGUgdGltZSAob25lIGNoYXJhY3RlciBvciBhIGJhY2tzbGFzaC1lc2NhcGVk CiAgICAgY2hhcmFjdGVyKSwgYW5kIE5FWFQtQ0hBUi1TWU0gaXMgYSBub24tbmlsIHN5bWJvbCwg dGhlIGNvbmQKICAgICBjbGF1c2UgaXMgb3B0aW1pemVkIHRvIGRvIGEgY2hhcmFjdGVyIGNvbXBh cmlzb24gcmF0aGVyIHRoYW4KICAgICBhIGBsb29raW5nLWF0Jy4gU3BlY2lmaWNhbGx5LCBORVhU LUNIQVItU1lNIGlzIGJvdW5kIHRvIHRoZQogICAgIGNoYXJhY3RlciBhdCBwb2ludCBiZWZvcmUg YW55IHRlc3RzIGFuZCB1c2VkIHZpYQogICAgIGBjaGFyLWVxdWFsJyBmb3IgdGhpcyBvcHRpbWl6 ZWQgbWF0Y2guIE1vdmVtZW50IGFuZCBzdHJpbmcKICAgICBmb3JtcyB3aXRoIGdyb3VwIDAsIGku ZS4sIChAIGVuZCAwKSwgKCQgMCksICgkJCAwKSwgc2VlCiAgICAgYmVsb3csIHN0aWxsIHdvcmsg YXMgZXhwZWN0ZWQgaW4gdGhpcyBjYXNlLiBUbyBzdXBwcmVzcyB0aGUKICAgICBjaGFyYWN0ZXIg b3B0aW1pemF0aW9uIHdoZW4gTkVYVC1DSEFSLVNZTSBpcyBub24tbmlsLCBmb3IKICAgICBpbnN0 YW5jZSB0byBtYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBgLicsIGl0IGlzIHN1ZmZpY2llbnQK ICAgICB0byBpbmNsdWRlIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgcGF0dGVybiBsaXN0IG9yIHRv IHB1dCB0aGUKICAgICB0ZXJtIGluIGEgbm9uLWNhcHR1cmluZyBncm91cC4uCgogICAgIEluIHRo ZSA8PC0gZm9ybSwgZWFjaCBzaW5nbGV0b24gcGF0dGVybiAoc3RyaW5ncyBvciBzeW1ib2xzKQog ICAgIGlzIGF1dG9tYXRpY2FsbHkgcHV0IGluIGEgY2FwdHVyaW5nIGdyb3VwLCB1bmxlc3MgcHJl Y2VkZWQgYnkKICAgICA6bm9ncm91cCAoaW5oaWJpdGluZyBncm91cCkgb3IgOm5vY2FwdHVyZSAo aW5oaWJpdGluZyBjYXB0dXJlKS4KCiAgIE1vdmVtZW50OgogICAgIChAIEZST00gR1JPVVAgW09G RlNFVF0pIAogICAgICAgIE1vdmVzIHBvaW50IHRvIGEgcG9zaXRpb24gcmVsYXRpdmUgdG8gYSBt YXRjaCBHUk9VUCwKICAgICAgICB3aGljaCBzaG91bGQgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdl ci4gVGhpcyBoYXMgbm8KICAgICAgICBlZmZlY3QgaWYgdGhlIGdyb3VwIGRpZCBub3QgbWF0Y2gs IGV4Y2VwdCBhbiAoQCBlbmQgMCkKICAgICAgICBhbHdheXMgbW92ZXMgdG8gdGhlIGVuZCBvZiB3 aGF0IG1hdGNoZWQgZXZlbiBpZiB0aGUKICAgICAgICBjbGF1c2Ugd2FzIG9wdGltaXplZCBpbnRv IGEgY2hhcmFjdGVyIG1hdGNoLiBGUk9NIGNhbiBiZQogICAgICAgIGVpdGhlciB0aGUgc3ltYm9s IGBlbmQnIG9yIGBiZWdpbicsIHdoaWNoIG1hdGNoZXMgdGhlIGVuZAogICAgICAgIG9yIGJlZ2lu bmluZyBvZiB0aGUgZ3JvdXAsIG9yIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkCiAgICAgICAg d2l0aCBncm91cCBhcyBhbiBhcmd1bWVudC4gT3B0aW9uYWwgT0ZGU0VULCBpZiBub24tbmlsLAog ICAgICAgIGlzIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCgogICBTdHJpbmcgRXh0 cmFjdGlvbjoKICAgICAoJCBHUk9VUCkgICBUaGUgbWF0Y2hlZCBzdHJpbmcgZm9yIGdyb3VwIEdS T1VQLCBvciBuaWwuCiAgICAgICAgICAgICAgICAgQSAoJCAwKSBhbHdheXMgd29ya3MsIGV2ZW4g d2l0aCBjaGFyYWN0ZXIgb3B0aW1pemF0aW9uLgoiCiAgKGRlY2xhcmUgKGluZGVudCAxKSkKICAo bGV0KiAoKG9wdC1saXN0cCAoY29uc3Agb3B0aW9ucykpCiAgICAgICAgIChzeW0tdGFibGUgKGlm IG9wdC1saXN0cCAoY2FyIG9wdGlvbnMpICAgICAgb3B0aW9ucykpCiAgICAgICAgIChuZXh0LWNo YXIgKGlmIG9wdC1saXN0cCAoY2FkciBvcHRpb25zKSAgICAgbmlsKSkKICAgICAgICAgKG5leHQt c3ltICAoaWYgbmV4dC1jaGFyIGAnLG5leHQtY2hhciBuaWwpKQogICAgICAgICAoYmluZGluZ3Mg IChpZiBvcHQtbGlzdHAgKG50aGNkciAyIG9wdGlvbnMpIG5pbCkpKQogICBgKG1hY3JvbGV0ICgo PC0gKCZyZXN0IHBhdHRlcm5zKSAgICAgOyBsb29rdXAKICAgICAgICAgICAgICAgICAgIGAsKG9y Zy10YWctcXVlcnktbWF0Y2hlcjwtIHBhdHRlcm5zIG5pbCAsc3ltLXRhYmxlICxuZXh0LXN5bSkp CiAgICAgICAgICAgICAgICg8PC0gKCZyZXN0IHBhdHRlcm5zKSAgICA7IGxvb2t1cCArIGF1dG9n cm91cGluZwogICAgICAgICAgICAgICAgICAgIGAsKG9yZy10YWctcXVlcnktbWF0Y2hlcjwtIHBh dHRlcm5zIHQgLHN5bS10YWJsZSAsbmV4dC1zeW0pKQogICAgICAgICAgICAgICAoPDw9ICgmcmVz dCBwYXR0ZXJucykgICAgOyBubyBsb29rdXAgb3IgYXV0b2dyb3VwaW5nCiAgICAgICAgICAgICAg ICAgICAgYCwob3JnLXRhZy1xdWVyeS1tYXRjaGVyPC0gcGF0dGVybnMgbmlsIG5pbCAsbmV4dC1z eW0pKQogICAgICAgICAgICAgICAoQCAoZnJvbSBncm91cCAmb3B0aW9uYWwgb2Zmc2V0KSA7IG1v dmUgcG9pbnQgcmVsYXRpdmUgdG8gZ3JvdXAKICAgICAgICAgICAgICAgICAgOzsgSGFuZGxpbmcg dGhlIGNoYXJhY3Rlci1tYXRjaCBvcHRpbWl6YXRpb24gcmVxdWlyZXMKICAgICAgICAgICAgICAg ICAgOzsgY2hlY2tpbmcgaWYgYSBjaGFyYWN0ZXIgbWF0Y2ggd2FzIG1hZGUgc28gYW4gKEAgZW5k IDApCiAgICAgICAgICAgICAgICAgIDs7IG1vdmVzIGZvcndhcmQgaW5zdGVhZCBvZiByZWZlcnJp bmcgdG8gdGhlIG1hdGNoCiAgICAgICAgICAgICAgICAgIDs7IGRhdGEuIFRoZSBpZGVhIGhlcmUg aXMgdG8gb25seSBjaGVjayB0aGF0IGNhc2Ugd2hlbgogICAgICAgICAgICAgICAgICA7OyB0aGUg b3B0aW1pemF0aW9uIHdhcyByZXF1ZXN0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlCiAgICAgICAgICAg ICAgICAgIDs7IGFuZCB0aGVuIHRvIGRvIGFzIG11Y2ggd29yayBhcyBwb3NzaWJsZSBhdCBjb21w aWxlCiAgICAgICAgICAgICAgICAgIDs7IHRpbWUuIEFkbWl0dGVkbHksIHRoaXMgcGFydCBoYXMg Z290dGVuIGEgYml0IGNyYXp5LAogICAgICAgICAgICAgICAgICA7OyBidXQgaXQgZG9lcyBwcm9k dWNlIGdvb2QgY29kZS4gLS0gQ1JHIDAyIEF1ZyAyMDEyCiAgICAgICAgICAgICAgICAgICwoaWYg KG5vdCBuZXh0LWNoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgYChsZXQgKChpcG9zCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FzZSBmcm9tCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChlbmQgYChvciAobWF0Y2gtZW5kICxncm91cCkgKHBvaW50KSkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbiBgKG9yIChtYXRjaC1iZWdpbm5pbmcg LGdyb3VwKSAocG9pbnQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgYCgs ZnJvbSAsZ3JvdXApKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgIGAoZ290by1jaGFyICwo aWYgb2Zmc2V0IGAoKyAsaXBvcyAsb2Zmc2V0KSBpcG9zKSkpCiAgICAgICAgICAgICAgICAgICAg IGAobGV0ICgoaXBvcyAoY2FzZSBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoaWYgb3JnLXRh Zy1xdWVyeS9wcml2YXRlLW9wdC1jaC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLChjb25kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKChhbmQgKGludGVnZXJwIGdyb3VwKSAoemVyb3AgZ3JvdXApKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKG1pbiAoMSsgKHBvaW50KSkgKHBvaW50LW1h eCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50ZWdl cnAgZ3JvdXApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICco cG9pbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAobWluICgrIChwb2lu dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGlmICh6ZXJvcCAsZ3JvdXApIDEgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChwb2ludC1tYXgpKSkpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAob3IgKG1hdGNoLWVuZCAsZ3JvdXApIChwb2ludCkpKSkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2luCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBgKG9yIChhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChub3Qgb3JnLXRhZy1xdWVyeS9wcml2YXRlLW9wdC1jaC0pCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtYmVnaW5uaW5nICxncm91 cCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkpKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCBgKCxmcm9tICxncm91cCkpKSkp CiAgICAgICAgICAgICAgICAgICAgICAgIGAoZ290by1jaGFyICwoaWYgb2Zmc2V0IGAoKyAsaXBv cyAsb2Zmc2V0KSBpcG9zKSkpKSkKICAgICAgICAgICAgICAgKCQgKGdyb3VwKSAgICAgICAgICA7 IHN0cmluZyBvciBuaWwgaWYgbm8gbWF0Y2ggZm9yIGdyb3VwCiAgICAgICAgICAgICAgICAgICwo aWYgKG5vdCBuZXh0LWNoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgYGAobWF0Y2gtc3RyaW5n ICxncm91cCkKICAgICAgICAgICAgICAgICAgICAgYGAoaWYgb3JnLXRhZy1xdWVyeS9wcml2YXRl LW9wdC1jaC0KICAgICAgICAgICAgICAgICAgICAgICAgICAsKGlmIChpbnRlZ2VycCBncm91cCkg Ozsgdy9saXRlcmFsIGdyb3VwLCBqdXN0IGRvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoaWYgKHplcm9wIGdyb3VwKSA7OyAgbGlrZWx5IHRoZSBjb21tb24gY2FzZQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoc3RyaW5nIG9yZy10YWctcXVlcnkvcHJpdmF0 ZS1vcHQtY2gtKSBuaWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYChpZiAoemVyb3Ag LGdyb3VwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyBvcmctdGFn LXF1ZXJ5L3ByaXZhdGUtb3B0LWNoLSkgbmlsKSkKICAgICAgICAgICAgICAgICAgICAgICAgKG1h dGNoLXN0cmluZyAsZ3JvdXApKSkpKQogICAgICAobGV0ICgsQGJpbmRpbmdzCiAgICAgICAgICAg ICxAKGlmIG5leHQtY2hhciAobGlzdCBgKCxuZXh0LWNoYXIgKGNoYXItYWZ0ZXIpKSkgbmlsKQog ICAgICAgICAgICAsQChpZiBuZXh0LWNoYXIgKGxpc3QgJyhvcmctdGFnLXF1ZXJ5L3ByaXZhdGUt b3B0LWNoLSBuaWwpKSBuaWwpKQogICAgICAgIChjb25kCiAgICAgICAgICxAY2xhdXNlcykpKSkp CgoKOzs7IFRoZSB0YWcgcXVlcnkgcGFyc2VyIGl0c2VsZgoKOzsgU3VjY2Vzc2l2ZSBtYXRjaGVz IChcRy1zdHlsZSkgaW4gYSBmaXhlZCBzdHJpbmcgYXJlIG5vdCBwb3NzaWJsZSBpbgo7OyBlbWFj cyAod2l0aG91dCBtYWtpbmcgcmVwZWF0ZWQgY29waWVzIG9mIHN1YnN0cmluZ3MpIGJlY2F1c2Ug dGhlcmUgaXMKOzsgbm8gd2F5IHRvIGFuY2hvciBhIHN0cmluZy1tYXRjaCBhdCB0aGUgc3RhcnQg cG9zaXRpb24gYXJndW1lbnQuCjs7IChJIGhhdmUgc3VnZ2VzdGVkIHVzaW5nIHRoZSB6ZXJvLWxl bmd0aCBhc3NlcnRpb24gXD0gaW4gYSBzdHJpbmcgdG8KOzsgYW5jaG9yIGF0IHRoYXQgcG9zaXRp b24sIGFuYWxvZ291cyB0byBpdHMgdXNlIGluIGJ1ZmZlciBzZWFyY2hlcy4gSWYKOzsgeW91J3Jl IHdpdGggbWUsIHNwcmVhZCB0aGUgd29yZC4pCjs7Cjs7IFNvIGluc3RlYWQgb2YgbWFyY2hpbmcg dGhyb3VnaCB0aGUgc3RyaW5nIGNvcHlpbmcgc3Vic3RyaW5ncywgd2UKOzsgcHJvY2VzcyB0aGUg cXVlcnkgc3RyaW5nIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBpcyBtb3JlCjs7IGlkaW9t YXRpYyBlbGlzcCBpbiBhbnkgY2FzZSwgYW5kIGlzIHF1aXRlIGZhc3QgYW5kIGNvbnZlbmllbnQg aXQKOzsgdHVybnMgb3V0LiBEb2luZyBpdCB0aGUgb3RoZXIgd2F5IGlzIHBvc3NpYmxlIGFzIHdl bGwsIGJ5IGNoYW5naW5nCjs7IHRoZSBvcmctbWF0Y2gtY29uZCBtYWNybyBhbmQgb3JnLXRhZy1x dWVyeS1wYXJzZS0xIGluIGEgZmV3IHBsYWNlcy4KOzsgQnV0IHNvIGZhciBJIGxpa2UgdGhpcyBh cHByb2FjaC4KCihkZWZ1biBvcmctdGFnLXF1ZXJ5LXBhcnNlIChxdWVyeS1zdHJpbmcpCiAgIkNv bnZlcnQgYW4gT3JnIHRhZyBRVUVSWS1TVFJJTkcgaW50byBhIG1hdGNoZXIgbGlzcCBmb3JtLgpU aGUgbWF0Y2hlciBpcyBhIGxpc3AgZm9ybSIKICAoY29uZAogICAoKG9yIChub3QgcXVlcnktc3Ry aW5nKSAobm90IChzdHJpbmctbWF0Y2gtcCAiXFxTLSIgcXVlcnktc3RyaW5nKSkpCiAgICB0KQog ICAoKHN0cmluZy1tYXRjaCAiXlxccy0qXFwoW14tK0EtWmEtejAtOV9AJSM6eygvXVxcKSIgcXVl cnktc3RyaW5nKQogICAgKG9yZy10cXVlcnktZXJyb3IgImludmFsaWQgY2hhcmFjdGVycyBpbiBx dWVyeSBzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICA6cG9zIChtYXRjaC1iZWdpbm5pbmcg MSkpKQogICAodAogICAgKHdpdGgtdGVtcC1idWZmZXIKICAgICAgKGluc2VydCBxdWVyeS1zdHJp bmcpCiAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiAgICAgIChvcmctdGFnLXF1ZXJ5LXBh cnNlLTEpKSkpKQoKKGRlZnVuIG9yZy10YWctcXVlcnktcGFyc2UtMSAoKQogIDs7IFdvcmtzIGlu IGN1cnJlbnQgYnVmZmVyIHdpdGggc3RyaW5nIHRvIGJlIHBhcnNlZCBzdGFydGluZyBhdCBwb2lu dC4KICAobGV0ICgocGFyc2Utc3RhY2sgbmlsKQogICAgICAgIChwYXJlbi1jb3VudCAwKQogICAg ICAgIG5lZy1zZWxlY3QgZ290LXNlbGVjdCkKICAgIChsYWJlbHMKICAgICAgICAoKGVtaXQgKCZy ZXN0IGl0ZW1zKQogICAgICAgICAgICAgICAoZG9saXN0IChpdGVtIGl0ZW1zKSAocHVzaCBpdGVt IHBhcnNlLXN0YWNrKSkpCiAgICAgICAgIChuby10ZXJtLXAgKCkKICAgICAgICAgICAgICAgICAg ICAoc3ltYm9scCAoY2FyIHBhcnNlLXN0YWNrKSkpCiAgICAgICAgIChuZWdhdGUtaWYgKG5lZ2F0 ZSBpdGVtKQogICAgICAgICAgICAgICAgICAgIChpZiBuZWdhdGUgYChub3QgLGl0ZW0pIGl0ZW0p KQogICAgICAgICAodGhyZWFkICgmcmVzdCBpdGVyYXRpb25zKQogICAgICAgICAgICAgICAgIChk b2xpc3QgKF8gaXRlcmF0aW9ucykKICAgICAgICAgICAgICAgICAgIChsZXQgKGVudHJpZXMgbmV3 LWVudHJ5IHR5cGUpCiAgICAgICAgICAgICAgICAgICAgICh3aGlsZSAobm90IChzeW1ib2xwIChj YXIgcGFyc2Utc3RhY2spKSkKICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBlbnRyaWVzIChj b25zIChwb3AgcGFyc2Utc3RhY2spIGVudHJpZXMpKSkKICAgICAgICAgICAgICAgICAgICAgKHVu bGVzcyAoYW5kIGVudHJpZXMgcGFyc2Utc3RhY2spCiAgICAgICAgICAgICAgICAgICAgICAgKG9y Zy10cXVlcnktZXJyb3IgImVtcHR5IHN1YmV4cHJlc3Npb24iKSkKICAgICAgICAgICAgICAgICAg ICAgKGNhc2UgKHNldHEgdHlwZSAocG9wIHBhcnNlLXN0YWNrKSkKICAgICAgICAgICAgICAgICAg ICAgICAoKGFuZCBvcikKICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgbmV3LWVudHJ5IAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGNkciBlbnRyaWVzKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgdHlwZSBlbnRyaWVzKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjYXIgZW50cmllcykpKSkKICAgICAgICAgICAgICAgICAgICAg ICAobm90CiAgICAgICAgICAgICAgICAgICAgICAgIChhc3NlcnQgKG51bGwgKGNkciBlbnRyaWVz KSkgbmlsICJub3QgaXMgdW5hcnkiKQogICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoYXJn IChjYXIgZW50cmllcykpKQogICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIG5ldy1lbnRy eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kIChjb25zcCBhcmcpIChl cSAoY2FyIGFyZykgJ25vdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChj YWRyIGFyZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAobm90ICxhcmcpKSkp KQogICAgICAgICAgICAgICAgICAgICAgIChpZGVudGl0eQogICAgICAgICAgICAgICAgICAgICAg ICAoYXNzZXJ0IChudWxsIChjZHIgZW50cmllcykpIG5pbCAiKCkgaXMgb25lIGV4cHJlc3Npb24i KQogICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBuZXctZW50cnkgKGNhciBlbnRyaWVzKSkp CiAgICAgICAgICAgICAgICAgICAgICAgKHQgICAgICAgICAgICAgICAgICA7IHRoaXMgcmVhbGx5 IHNob3VsZG4ndCBoYXBwZW4KICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy10cXVlcnktZXJy b3IgImludmFsaWQgc3ltYm9sICVzIG9uIHN0YWNrLiIgdHlwZSkpKQogICAgICAgICAgICAgICAg ICAgICAoZW1pdCBuZXctZW50cnkpKSkpCiAgICAgICAgICh0YWctY2hlY2sgKGlkICZvcHRpb25h bCBuZWdhdGUpCiAgICAgICAgICAgICAgICAgICAgKGxldCAoKGNoZWNrIGAobWVtYmVyICxpZCB0 YWdzLWxpc3QpKSkKICAgICAgICAgICAgICAgICAgICAgIChpZiBuZWdhdGUgYChub3QgLGNoZWNr KSBjaGVjaykpKQogICAgICAgICAocHJvcC1jaGVjayAocHJvcCAmb3B0aW9uYWwgbnVtZXJpY3Ap CiAgICAgICAgICAgICAgICAgICAgIChjb25kCiAgICAgICAgICAgICAgICAgICAgICAoKHN0cmlu Zy1lcXVhbCBwcm9wICJMRVZFTCIpCiAgICAgICAgICAgICAgICAgICAgICAgJ2xldmVsKQogICAg ICAgICAgICAgICAgICAgICAgKChtZW1iZXIgcHJvcCAnKCJUT0RPIiAiSEVBRElORyIgIlBSSU9S SVRZIikpCiAgICAgICAgICAgICAgICAgICAgICAgYChvciAsKGludGVybiAoZG93bmNhc2UgcHJv cCkpICIiKSkKICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLWVxdWFsIHByb3AgIkNBVEVH T1JZIikKICAgICAgICAgICAgICAgICAgICAgICAnKG9yIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9p bnQpICdvcmctY2F0ZWdvcnkpICIiKSkKICAgICAgICAgICAgICAgICAgICAgICAobnVtZXJpY3AK ICAgICAgICAgICAgICAgICAgICAgICAgYChzdHJpbmctdG8tbnVtYmVyCiAgICAgICAgICAgICAg ICAgICAgICAgICAgKG9yIChvcmctY2FjaGVkLWVudHJ5LWdldCBuaWwgLHByb3ApICIiKSkpCiAg ICAgICAgICAgICAgICAgICAgICAgKHQKICAgICAgICAgICAgICAgICAgICAgICAgYChvciAob3Jn LWNhY2hlZC1lbnRyeS1nZXQgbmlsICxwcm9wKSAiIikpKSkpCiAgICAgIDs7IFNlZWQgb3V0ZXJt b3N0IGV4cHJlc3Npb24gaW4gcGFyc2UgdHJlZQogICAgICAoZW1pdCAnb3IgJ2FuZCkKICAgICAg KHNraXAtY2hhcnMtZm9yd2FyZCAob3JnLXJlICJbOmJsYW5rOl0iKSkKCiAgICAgICh3aGlsZSAo bm90IChlb2JwKSkKICAgICAgICA7OyBQcm9jZXNzIGEgdGVybQogICAgICAgIDs7ICAgTG9vayBm b3IgdGhlIHNlbGVjdG9yIGNoYXIgZmlyc3QKICAgICAgICAob3JnLW1hdGNoLWNvbmQgb3JnLXRh Zy1xdWVyeS10ZXJtaW5hbHMKICAgICAgICAgICgoPC0gKFNFTEVDVE9SKSBTUEFDRSopCiAgICAg ICAgICAgKEAgZW5kIDApCiAgICAgICAgICAgKHNldHEgZ290LXNlbGVjdCB0CiAgICAgICAgICAg ICAgICAgbmVnLXNlbGVjdCAoY2hhci1lcXVhbCAoc3RyaW5nLXRvLWNoYXIgKCQgMSkpID8tKSkp CiAgICAgICAgICAodAogICAgICAgICAgIChzZXRxIGdvdC1zZWxlY3QgbmlsCiAgICAgICAgICAg ICAgICAgbmVnLXNlbGVjdCBuaWwpKSkKCiAgICAgICAgOzsgICBOb3cgbG9vayBmb3IgdGhlIHJl c3Qgb2YgdGhlIHRlcm0KICAgICAgICAob3JnLW1hdGNoLWNvbmQgKG9yZy10YWctcXVlcnktdGVy bWluYWxzIGNoYXItYXQtcG9pbnQpCiAgICAgICAgICgoPC0gKFBST1AtSURFTlQpIFNQQUNFKiAo Q01QLU9QKSBTUEFDRSogKENNUC1SSFMtQkVHSU4pKQogICAgICAgICAgKEAgYmVnaW4gMykKICAg ICAgICAgIChsZXQqICgocHJvcCAoc2F2ZS1tYXRjaC1kYXRhCiAgICAgICAgICAgICAgICAgICAg ICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAg IlxcXFwtIiAiLSIgKCQgMSkgdCB0KSkpCiAgICAgICAgICAgICAgICAgKGNtcCAgKCQgMikpCiAg ICAgICAgICAgICAgICAgKGluZHggKGNhc2UgKGNoYXItYWZ0ZXIpCiAgICAgICAgICAgICAgICAg ICAgICAgICAoP1x7IDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAoP1wiIChvcmctbWF0Y2gt Y29uZCBvcmctdGFnLXF1ZXJ5LXRlcm1pbmFscwogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICgoPC0gREFURS1TVFJJTkcpIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHQgMSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHQgMCkpKQogICAgICAgICAgICAgICAg IChvcC1mIChhcmVmIChnZXRoYXNoIGNtcCBvcmctdGFnLXF1ZXJ5LWNtcC1vcHMpIGluZHgpKQog ICAgICAgICAgICAgICAgIChyaHMKICAgICAgICAgICAgICAgICAgKGNhc2UgaW5keAogICAgICAg ICAgICAgICAgICAgICgwIChvcmctbWF0Y2gtY29uZCBvcmctdGFnLXF1ZXJ5LXRlcm1pbmFscwog ICAgICAgICAgICAgICAgICAgICAgICAgKCg8LSBOVU1CRVIpIChAIGVuZCAwKSAoc3RyaW5nLXRv LW51bWJlciAoJCAwKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAodCAob3JnLXRxdWVyeS1l cnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG51bWJlciBvbiByaHMg b2YgcHJvcGVydHkgY29tcGFyaXNvbiIpKSkpCiAgICAgICAgICAgICAgICAgICAgKDEgKG9yZy1y ZWFkLXF1b3RlZC1zdHJpbmctaW4tcXVlcnkpKQogICAgICAgICAgICAgICAgICAgICgyIChvcmct bWF0Y2hlci10aW1lIChvcmctcmVhZC1xdW90ZWQtc3RyaW5nLWluLXF1ZXJ5KSkpCiAgICAgICAg ICAgICAgICAgICAgKDMgKG9yZy1yZWFkLWJhbGFuY2VkLXN0cmluZyA/XHsgP1x9KSkpKQogICAg ICAgICAgICAgICAgIChmb3JtIChsaXN0IG9wLWYgKHByb3AtY2hlY2sgcHJvcCAoemVyb3AgaW5k eCkpIHJocykpKQogICAgICAgICAgICAodW5sZXNzIG9wLWYKICAgICAgICAgICAgICAob3JnLXRx dWVyeS1lcnJvciAiaW52YWxpZCBvcGVyYXRvciBmb3IgcHJvcGVydHkgcmVnZXhwIG1hdGNoIikp CiAgICAgICAgICAgIChlbWl0IChuZWdhdGUtaWYgbmVnLXNlbGVjdCBmb3JtKSkpKQogICAgICAg ICAoKDwtIFRBRy1JREVOVCkKICAgICAgICAgIChAIGVuZCAwKQogICAgICAgICAgKGVtaXQgKHRh Zy1jaGVjayAoJCAwKSBuZWctc2VsZWN0KSkpCiAgICAgICAgICgoPC0gUkVHRVgtT1BFTikKICAg ICAgICAgIChsZXQgKChyZWdleCAob3JnLXJlYWQtYmFsYW5jZWQtc3RyaW5nID9ceyA/XH0pKSkK ICAgICAgICAgICAgKGVtaXQgKG5lZ2F0ZS1pZiBuZWctc2VsZWN0IGAob3JnLW1hdGNoLWFueS1w ICxyZWdleCB0YWdzLWxpc3QpKSkpKQogICAgICAgICAoKDwtIEdST1VQLU9QRU4pCiAgICAgICAg ICAoQCBlbmQgMCkKICAgICAgICAgIChlbWl0IChpZiBuZWctc2VsZWN0ICdub3QgJ2lkZW50aXR5 KSAnb3IgJ2FuZCkKICAgICAgICAgIChpbmNmIHBhcmVuLWNvdW50KSkKICAgICAgICAgKGdvdC1z ZWxlY3QKICAgICAgICAgIChvcmctdHF1ZXJ5LWVycm9yICJ0cmFpbGluZyBzZWxlY3RvciB3aXRo IG5vIHRlcm0iKSkKICAgICAgICAgKChuby10ZXJtLXApCiAgICAgICAgICAob3JnLXRxdWVyeS1l cnJvciAibWlzc2luZyB0aGUgZXhwZWN0ZWQgdGVybSIpKQogICAgICAgICAoKDwtIEdST1VQLUNM T1NFKSAgICA7IGVuZCBvZiBzdWJleHByZXNzaW9uLCBjbGVhbiB1cAogICAgICAgICAgKEAgZW5k IDApCiAgICAgICAgICAoZGVjZiBwYXJlbi1jb3VudCkKICAgICAgICAgICh3aGVuICg8IHBhcmVu LWNvdW50IDApIChvcmctdHF1ZXJ5LWVycm9yICJtaXNtYXRjaGVkICkncyIpKQogICAgICAgICAg KHRocmVhZCAnY29uanVuY3Rpb24gJ2Rpc2p1bmN0aW9uICdzZWxlY3RvcikpCiAgICAgICAgICgo PC0gQU5ELU9QKSAgICAgICAgIDsgY29udGludWUgY29uanVuY3Rpb24sIGV4cGVjdCBhIHRlcm0K ICAgICAgICAgIChAIGVuZCAwKSkgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICgoPC0gT1It T1ApICAgICAgICAgIDsgc3RhcnQgb3IgY29udGludWUgYSBkaXNqdW5jdGlvbgogICAgICAgICAg KEAgZW5kIDApCiAgICAgICAgICAodGhyZWFkICdjb25qdW5jdGlvbikKICAgICAgICAgIChlbWl0 ICdhbmQpKQogICAgICAgICAodAogICAgICAgICAgKG9yZy10cXVlcnktZXJyb3IgImludmFsaWQg dG9rZW4gJWMgZHVyaW5nIHF1ZXJ5IHBhcnNlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg KGNoYXItYWZ0ZXIpKSkpCiAgICAgICAgOzsgQWxsb3cgc3BhY2VzIGFyb3VuZCB0ZXJtcywgb3Bl cmF0b3JzLCBhbmQgcGFyZW5zCiAgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAob3JnLXJlICJb OmJsYW5rOl0iKSkpCgogICAgICAodW5sZXNzICh6ZXJvcCBwYXJlbi1jb3VudCkKICAgICAgICAo b3JnLXRxdWVyeS1lcnJvciAibWlzc2luZyApcyBpbiBxdWVyeSBzdHJpbmciKSkKCiAgICAgIDs7 IEJ1aWxkIHRoZSBmaW5hbCBwYXJzZSB0cmVlIGJ5IHRocmVhZGluZyB0aGUgc3RhY2sKICAgICAg KHdoaWxlIChjZHIgcGFyc2Utc3RhY2spCiAgICAgICAgKHRocmVhZCAnYW55KSkKCiAgICAgIGAo cHJvZ24KICAgICAgICAgKHNldHEgb3JnLWNhY2hlZC1wcm9wcyBuaWwpCiAgICAgICAgICwoY2Fy IHBhcnNlLXN0YWNrKSkpKSkKCgo7OzsgTW9kaWZpZWQgYG9yZy1tYWtlLXRhZ3MtbWF0Y2hlcicg YW5kIGBvcmctc2Nhbi10YWdzJyB0aGF0IHVzZSB0aGUgbmV3IHBhcnNlcgoKOzs7IFRoZSBtYWlu IGNoYW5nZSB0byBgb3JnLW1ha2UtdGFncy1tYXRjaGVyJyBpcyB0byBpbnNlcnQgdGhlIG5ldyB0 YWcKOzs7IHBhcnNlciwgYnV0IHRoaXMgYWxsb3dlZCBtZSB0byBzaG9ydGVuIGFuZCBjbGVhbiB1 cCB0aGUgY29kZSwgZml4Cjs7OyBvbmUgdmVyeSBtaW5vciBidWcgKHNlZSBOT1RFIGJlbG93KSwg YW5kIHVwZGF0ZSB0aGUgZG9jc3RyaW5nLgo7OzsgSSd2ZSBhbHNvIHNlcGFyYXRlZCBvdXQgdGhl IHRvZG8gcGFyc2luZyBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24KOzs7IGZvciBjbGFyaXR5IGFu ZCBzeW1tZXRyeSwgdGhvdWdoIEkndmUgbGVmdCB0aGUgbWV0aG9kIGFzIGlzLgo7OzsgCjs7OyBU aGUgY2hhbmdlcyB0byBgb3JnLXNjYW4tdGFncycgYXJlIG1pbm9yIGFuZCBlc3NlbnRpYWxseSBm cmVlLCBhbmQgCjs7OyBJIGluY2x1ZGUgdGhlIGNvbnRleHQgZGlmZiBpbiBjb21tZW50cyBiZWxv dy4KOzs7Cjs7OyBUaGVzZSBib3RoIGFyZSBkcmF3biBmcm9tIHRoZSA3LjguMTEgY29kZS4gVG8g ZmFjaWxpdGF0ZSB0ZXN0aW5nLAo7OzsgSSd2ZSBhZGRlZCBhbiAtTkVXIHRvIHRoZSBuYW1lcyBv ZiB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBtb21lbnQsCjs7OyBidXQgdGhhdCBzaG91bGQgYmUg Y2hhbmdlZCBpZiB0aGV5IGFyZSB1c2VkLiBUaGUgdGVtcG9yYXJ5IGZ1bmN0aW9uCjs7OyBgb3Jn LXRtcC11c2UtdGFnLXBhcnNlcicgYWxsb3dzIHN3aXRjaGluZyBiZXR3ZWVuIG9sZCBhbmQgbmV3 IGZvcgo7OzsgdGVzdGluZy4gU2VlIGFsc28gdGhlIGZpbGUgYHRhZy1xdWVyeS10ZXN0cy5lbCcg dGhhdCBydW5zIHNvbWUgYmFzaWMKOzs7IHRlc3RzLgoKKGRlZnVuIG9yZy1tYWtlLXRhZ3MtbWF0 Y2hlci1ORVcgKG1hdGNoKQogICJDcmVhdGUgdGhlIFRBR1MvVE9ETyBtYXRjaGVyIGZvcm0gZm9y IHRoZSBzZWxlY3Rpb24gc3RyaW5nIE1BVENILgoKVGhlIHZhcmlhYmxlIGB0b2RvLW9ubHknIGlz IHNjb3BlZCBkeW5hbWljYWxseSBpbnRvIHRoaXMKZnVuY3Rpb247IGl0IHdpbGwgYmUgc2V0IHRv IHQgaWYgdGhlIG1hdGNoZXIgcmVzdHJpY3RzIG1hdGNoaW5nCnRvIFRPRE8gZW50cmllcywgb3Ro ZXJ3aXNlIHdpbGwgbm90IGJlIHRvdWNoZWQuCgpSZXR1cm5zIGEgY29ucyBvZiB0aGUgc2VsZWN0 aW9uIHN0cmluZyBNQVRDSCBhbmQgdGhlIGNvbnN0cnVjdGVkCmxpc3AgZm9ybSBpbXBsZW1lbnRp bmcgdGhlIG1hdGNoZXIuIFRoZSBtYXRjaGVyIGlzIHRvIGJlCmV2YWx1YXRlZCBhdCBhbiBPcmcg ZW50cnksIHdpdGggcG9pbnQgb24gdGhlIGhlYWRsaW5lLCBhbmQKcmV0dXJucyB0IGlmIHRoZSBl bnRyeSBtYXRjaGVzIHRoZSBzZWxlY3Rpb24gc3RyaW5nIE1BVENILiBUaGUKcmV0dXJuZWQgbGlz cCBmb3JtIG1heSByZWZlcmVuY2UgZm91ciB2YXJpYWJsZXMgd2l0aCBpbmZvcm1hdGlvbgphYm91 dCB0aGUgZW50cnksIHdoaWNoIG11c3QgYmUgYm91bmQgYXJvdW5kIHRoZSBmb3JtJ3MKZXZhbHVh dGlvbjogdG9kbywgdGhlIFRPRE8ga2V5d29yZCBhdCB0aGUgZW50cnkgKG9yIG5pbCBvZiBub25l KTsKaGVhZGluZywgdGhlIHRleHQgb2YgdGhlIGhlYWRpbmcgZm9yIHRoZSBlbnRyeTsgcHJpb3Jp dHksIHRoZQpwcmlvcml0eSBjb29raWUgZm9yIHRoZSBlbnRyeSBvciBuaWw7IGFuZCB0YWdzLWxp c3QsIHRoZSBsaXN0IG9mCmFsbCB0YWdzIGF0IHRoZSBlbnRyeSBpbmNsdWRpbmcgaW5oZXJpdGVk IG9uZXMuIEFkZGl0aW9uYWxseSwgdGhlCmNhdGVnb3J5IG9mIHRoZSBlbnRyeSAoaWYgYW55KSBt dXN0IGJlIHNwZWNpZmllZCBhcyB0aGUgdGV4dApwcm9wZXJ0eSAnb3JnLWNhdGVnb3J5IG9uIHRo ZSBoZWFkbGluZS4KClNlZSBhbHNvIGBvcmctc2Nhbi10YWdzJy4KIgogIChkZWNsYXJlIChzcGVj aWFsIHRvZG8tb25seSkpCiAgKHVubGVzcyAoYm91bmRwICd0b2RvLW9ubHkpCiAgICAoZXJyb3Ig Im9yZy1tYWtlLXRhZ3MtbWF0Y2hlciBleHBlY3RzIHRvZG8tb25seSB0byBiZSBzY29wZWQgaW4i KSkKICAodW5sZXNzIG1hdGNoCiAgICA7OyBHZXQgYSBuZXcgbWF0Y2ggcmVxdWVzdCwgd2l0aCBj b21wbGV0aW9uCiAgICAobGV0ICgob3JnLWxhc3QtdGFncy1jb21wbGV0aW9uLXRhYmxlCgkgICAo b3JnLWdsb2JhbC10YWdzLWNvbXBsZXRpb24tdGFibGUpKSkKICAgICAgKHNldHEgbWF0Y2ggKG9y Zy1jb21wbGV0aW5nLXJlYWQtbm8taQoJCSAgICJNYXRjaDogIiAnb3JnLXRhZ3MtY29tcGxldGlv bi1mdW5jdGlvbiBuaWwgbmlsIG5pbAoJCSAgICdvcmctdGFncy1oaXN0b3J5KSkpKQoKICA7OyBQ YXJzZSB0aGUgc3RyaW5nIGFuZCBjcmVhdGUgYSBsaXNwIGZvcm0KICAobGV0ICgobWF0Y2gwIG1h dGNoKQoJdGFnc21hdGNoIHRvZG9tYXRjaCkKICAgIChpZiAoc3RyaW5nLW1hdGNoICJcXCgvXFwo IVxcKT9cXHMtKlxcKVtee31cIl0qJCIgbWF0Y2gpIDsgU2VlIE5vdGUgaCBhYm92ZQoJOzsgbWF0 Y2ggY29udGFpbnMgYWxzbyBhIHRvZG8tbWF0Y2hpbmcgcmVxdWVzdAoJKHByb2duCgkgIChzZXRx IHRhZ3NtYXRjaCAoc3Vic3RyaW5nIG1hdGNoIDAgKG1hdGNoLWJlZ2lubmluZyAxKSkKCQl0b2Rv bWF0Y2ggKHN1YnN0cmluZyBtYXRjaCAobWF0Y2gtZW5kIDEpKSkKCSAgKGlmIChtYXRjaC1lbmQg MikKCSAgICAgIChzZXRxIHRvZG8tb25seSB0KSkKCSAgKGlmICg9IChtYXRjaC1lbmQgMCkgKG1h dGNoLWVuZCAxKSkgOyB0aGUgc3BhY2UqIGlzIGdyZWVkeQoJICAgICAgKHNldHEgdG9kb21hdGNo IG5pbCkpKQogICAgICA7OyBvbmx5IG1hdGNoaW5nIHRhZ3MKICAgICAgKHNldHEgdGFnc21hdGNo IG1hdGNoIHRvZG9tYXRjaCBuaWwpKQogICAgKGxldCogKCh0YWdzbWF0Y2hlciAob3JnLXRhZy1x dWVyeS1wYXJzZSB0YWdzbWF0Y2gpKQogICAgICAgICAgICh0b2RvbWF0Y2hlciAob3JnLXRvZG8t cXVlcnktcGFyc2UgdG9kb21hdGNoKSkKICAgICAgICAgICAobWF0Y2hlciAoaWYgKGVxIHRvZG9t YXRjaGVyIHQpIDs7IE5PVEU6IG9yaWdpbmFsIGtlcHQgKGFuZCAuLi4gdCkgd2hlbiBubyB0b2Rv IG1hdGNoZXIgLS0gQ1JHIDMxIEp1bCAyMDEyCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3Nt YXRjaGVyCiAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnYW5kIHRhZ3NtYXRjaGVyIHRvZG9t YXRjaGVyKSkpKQogICAgICAod2hlbiB0b2RvLW9ubHkKICAgICAgICAoc2V0cSBtYXRjaGVyIChs aXN0ICdhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcobWVtYmVyIHRvZG8gb3JnLW5v dC1kb25lLWtleXdvcmRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcikpKQog ICAgICA7OyBSZXR1cm4gdGhlIHN0cmluZyBhbmQgbGlzcCBmb3JtcyBvZiB0aGUgbWF0Y2hlcgog ICAgICAoY29ucyBtYXRjaDAgbWF0Y2hlcikpKSkKCihkZWZ1biBvcmctdG9kby1xdWVyeS1wYXJz ZSAocXVlcnktc3RyaW5nKQogIChpZiAob3IgKG5vdCBxdWVyeS1zdHJpbmcpIChub3QgKHN0cmlu Zy1tYXRjaCAiXFxTLSIgcXVlcnktc3RyaW5nKSkpCiAgICAgIHQKICAgIChsZXQgKChvcnRlcm1z IChvcmctc3BsaXQtc3RyaW5nIHF1ZXJ5LXN0cmluZyAifCIpKQogICAgICAgICAgKG9ybGlzdCBu aWwpCiAgICAgICAgICAodG9kb21hdGNoZXIgbmlsKQogICAgICAgICAgKHJlIChvcmctcmUgIl4m P1xcKFstKzpdXFwpP1xcKHtbXn1dKn1cXHxbXi0rXCJ7fSZ8XStcXCkiKSkKICAgICAgICAgIHRl cm0gbWludXMga3dkIHJlLXAgbW0pCiAgICAgICh3aGlsZSAoc2V0cSB0ZXJtIChwb3Agb3J0ZXJt cykpCiAgICAgICAgKHdoaWxlIChzdHJpbmctbWF0Y2ggcmUgdGVybSkKICAgICAgICAgIChzZXRx IG1pbnVzIChhbmQgKG1hdGNoLWVuZCAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1 YWwgKG1hdGNoLXN0cmluZyAxIHRlcm0pICItIikpCiAgICAgICAgICAgICAgICBrd2QgKG1hdGNo LXN0cmluZyAyIHRlcm0pCiAgICAgICAgICAgICAgICByZS1wIChlcXVhbCAoc3RyaW5nLXRvLWNo YXIga3dkKSA/eykKICAgICAgICAgICAgICAgIHRlcm0gKHN1YnN0cmluZyB0ZXJtIChtYXRjaC1l bmQgMCkpCiAgICAgICAgICAgICAgICBtbSAoaWYgcmUtcAogICAgICAgICAgICAgICAgICAgICAg IGAoc3RyaW5nLW1hdGNoICAsKHN1YnN0cmluZyBrd2QgMSAtMSkgdG9kbykKICAgICAgICAgICAg ICAgICAgICAgKGxpc3QgJ2VxdWFsICd0b2RvIGt3ZCkpCiAgICAgICAgICAgICAgICBtbSAoaWYg bWludXMgKGxpc3QgJ25vdCBtbSkgbW0pKQogICAgICAgICAgKHB1c2ggbW0gdG9kb21hdGNoZXIp KQogICAgICAgIChwdXNoIChpZiAoPiAobGVuZ3RoIHRvZG9tYXRjaGVyKSAxKQogICAgICAgICAg ICAgICAgICAoY29ucyAnYW5kIHRvZG9tYXRjaGVyKQogICAgICAgICAgICAgICAgKGNhciB0b2Rv bWF0Y2hlcikpCiAgICAgICAgICAgICAgb3JsaXN0KQogICAgICAgIChzZXRxIHRvZG9tYXRjaGVy IG5pbCkpCiAgICAgIChpZiAoPiAobGVuZ3RoIG9ybGlzdCkgMSkKICAgICAgICAgIChjb25zICdv ciBvcmxpc3QpIChjYXIgb3JsaXN0KSkpKSkKCjs7IFRoZSBjaGFuZ2VzIHRvIG9yZy1zY2FuLXRh Z3MgYXJlIG1pbm9yIGFuZCBlc3NlbnRpYWxseSBmcmVlLgo7OyBBIGRpZmYgLVUgMiBhZ2FpbnN0 IG9yZy5lbCBmcm9tIDcuOC4xMSB3aXRoIG9ubHkgdGhpcyBmdW5jdGlvbgo7OyBjaGFuZ2VkIGZv bGxvd3MuCjs7Cjs7IC0tLSBvcmcuZWwgICAgICAyMDEyLTA3LTMxIDE1OjMyOjE3LjAwMDAwMDAw MCAtMDQwMAo7OyArKysgbW9kaWZpZWQtb3JnLmVsICAgICAyMDEyLTA3LTMxIDE1OjIwOjU2LjAw MDAwMDAwMCAtMDQwMAo7OyBAQCAtMTI4MzAsNSArMTI4MzAsNSBAQAo7OyAgICAgICAgICAgICAg ICAgICAgICAiICpcXChcXDxcXCgiCjs7ICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQg J3JlZ2V4cC1xdW90ZSBvcmctdG9kby1rZXl3b3Jkcy0xICJcXHwiKQo7OyAtICAgICAgICAgICAg ICAgICAgICAob3JnLXJlICJcXClcXD5cXCk/ICpcXCguKj9cXClcXCg6W1s6YWxudW06XV9AIyU6 XSs6XFwpP1sgXHRdKiQiKSkpCjs7ICsgICAgICAgICAgICAgICAgICAgIChvcmctcmUgIlxcKVxc PlxcKT9bIFx0XSpcXCg/OlxcWyNcXCguXFwpXFxdXFwpP1sgXHRdKlxcKC4qP1xcKVxcKDpbWzph bG51bTpdX0AjJTpdKzpcXCk/WyBcdF0qJCIpKSkKOzsgICAgICAgICAgKHByb3BzIChsaXN0ICdm YWNlICdkZWZhdWx0Cjs7ICAgICAgICAgICAgICAgICAgICAgICAnZG9uZS1mYWNlICdvcmctYWdl bmRhLWRvbmUKOzsgQEAgLTEyODQ4LDUgKzEyODQ4LDUgQEAKOzsgICAgICAgICAgKHRhZ3MtYWxp c3QgKGxpc3QgKGNvbnMgMCBvcmctZmlsZS10YWdzKSkpCjs7ICAgICAgICAgIChsbGFzdCAwKSBy dG4gcnRuMSBsZXZlbCBjYXRlZ29yeSBpIHR4dAo7OyAtICAgICAgICB0b2RvIG1hcmtlciBlbnRy eSBwcmlvcml0eSkKOzsgKyAgICAgICAgdG9kbyBtYXJrZXIgZW50cnkgaGVhZGluZyBwcmlvcml0 eSBwcmlvcml0eS1udW0pCjs7ICAgICAgKHdoZW4gKG5vdCAob3IgKG1lbWJlciBhY3Rpb24gJyhh Z2VuZGEgc3BhcnNlLXRyZWUpKSAoZnVuY3Rpb25wIGFjdGlvbikpKQo7OyAgICAgICAgKHNldHEg YWN0aW9uIChsaXN0ICdsYW1iZGEgbmlsIGFjdGlvbikpKQo7OyBAQCAtMTI4NjAsNSArMTI4NjAs NyBAQAo7OyAgICAgICAgIChjYXRjaCA6c2tpcAo7OyAgICAgICAgICAgKHNldHEgdG9kbyAoaWYg KG1hdGNoLWVuZCAxKSAob3JnLW1hdGNoLXN0cmluZy1uby1wcm9wZXJ0aWVzIDIpKQo7OyAtICAg ICAgICAgICAgICAgdGFncyAoaWYgKG1hdGNoLWVuZCA0KSAob3JnLW1hdGNoLXN0cmluZy1uby1w cm9wZXJ0aWVzIDQpKSkKOzsgKyAgICAgICAgICAgICAgICBwcmlvcml0eSAoaWYgKG1hdGNoLWVu ZCAzKSAob3JnLW1hdGNoLXN0cmluZy1uby1wcm9wZXJ0aWVzIDMpKQo7OyArICAgICAgICAgICAg ICAgIGhlYWRpbmcgKG9yZy1tYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyA0KQo7OyArICAgICAg ICAgICAgICAgdGFncyAoaWYgKG1hdGNoLWVuZCA1KSAob3JnLW1hdGNoLXN0cmluZy1uby1wcm9w ZXJ0aWVzIDUpKSkKOzsgICAgICAgICAgIChnb3RvLWNoYXIgKHNldHEgbHNwb3MgKG1hdGNoLWJl Z2lubmluZyAwKSkpCjs7ICAgICAgICAgICAoc2V0cSBsZXZlbCAob3JnLXJlZHVjZWQtbGV2ZWwg KGZ1bmNhbGwgb3V0bGluZS1sZXZlbCkpCjs7IEBAIC0xMjkzOCw1ICsxMjk0MCw1IEBACjs7ICAg ICAgICAgICAgICAgICAgICAgICAgICB0YWdzLWxpc3QKOzsgICAgICAgICAgICAgICAgICAgICAg ICAgICkKOzsgLSAgICAgICAgICAgICAgICAgICBwcmlvcml0eSAob3JnLWdldC1wcmlvcml0eSB0 eHQpKQo7OyArICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LW51bSAob3JnLWdldC1wcmlvcml0 eSB0eHQpKQo7OyAgICAgICAgICAgICAgIChnb3RvLWNoYXIgbHNwb3MpCjs7ICAgICAgICAgICAg ICAgKHNldHEgbWFya2VyIChvcmctYWdlbmRhLW5ldy1tYXJrZXIpKQo7OyBAQCAtMTI5NDQsNSAr MTI5NDYsNSBAQAo7OyAgICAgICAgICAgICAgICAgJ29yZy1tYXJrZXIgbWFya2VyICdvcmctaGQt bWFya2VyIG1hcmtlciAnb3JnLWNhdGVnb3J5IGNhdGVnb3J5Cjs7ICAgICAgICAgICAgICAgICAn dG9kby1zdGF0ZSB0b2RvCjs7IC0gICAgICAgICAgICAgICAncHJpb3JpdHkgcHJpb3JpdHkgJ3R5 cGUgInRhZ3NtYXRjaCIpCjs7ICsgICAgICAgICAgICAgICAncHJpb3JpdHkgcHJpb3JpdHktbnVt ICd0eXBlICJ0YWdzbWF0Y2giKQo7OyAgICAgICAgICAgICAgIChwdXNoIHR4dCBydG4pKQo7OyAg ICAgICAgICAgICAgKChmdW5jdGlvbnAgYWN0aW9uKQo7OyAKCihkZWZ1biBvcmctc2Nhbi10YWdz LU5FVyAoYWN0aW9uIG1hdGNoZXIgdG9kby1vbmx5ICZvcHRpb25hbCBzdGFydC1sZXZlbCkKICAi U2NhbiBoZWFkbGluZSB0YWdzIHdpdGggaW5oZXJpdGFuY2UgYW5kIHByb2R1Y2Ugb3V0cHV0IEFD VElPTi4KCkFDVElPTiBjYW4gYmUgYHNwYXJzZS10cmVlJyB0byBwcm9kdWNlIGEgc3BhcnNlIHRy ZWUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLApvciBgYWdlbmRhJyB0byBwcm9kdWNlIGFuIGVudHJ5 IGxpc3QgZm9yIGFuIGFnZW5kYSB2aWV3LiAgSXQgY2FuIGFsc28gYmUKYSBMaXNwIGZvcm0gb3Ig YSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYXQgZWFjaCBtYXRjaGVkIGhlYWRsaW5l LCBpbgp0aGlzIGNhc2UgdGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2YgYWxsIHJldHVybiB2 YWx1ZXMgZnJvbSB0aGVzZSBjYWxscy4KCk1BVENIRVIgaXMgYSBMaXNwIGZvcm0gdG8gYmUgZXZh bHVhdGVkLCB0ZXN0aW5nIGlmIGEgZ2l2ZW4gc2V0IG9mIHRhZ3MKcXVhbGlmaWVzIGEgaGVhZGxp bmUgZm9yIGluY2x1c2lvbi4gIFdoZW4gVE9ETy1PTkxZIGlzIG5vbi1uaWwsCm9ubHkgbGluZXMg d2l0aCBhIG5vdC1kb25lIFRPRE8ga2V5d29yZCBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4K VGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFyaWFibGUgdGhhdCB3YXMgc2NvcGVkIGludG8KYW5k IHNldCBieSBgb3JnLW1ha2UtdGFncy1tYXRjaGVyJyB3aGVuIGl0IGNvbnN0cnVjdGVkIE1BVENI RVIuCgpTVEFSVC1MRVZFTCBjYW4gYmUgYSBzdHJpbmcgd2l0aCBhc3Rlcmlza3MsIHJlZHVjaW5n IHRoZSBzY29wZSB0bwpoZWFkbGluZXMgbWF0Y2hpbmcgdGhpcyBzdHJpbmcuIgogIChyZXF1aXJl ICdvcmctYWdlbmRhKQogIChsZXQqICgocmUgKGNvbmNhdCAiXiIKCQkgICAgIChpZiBzdGFydC1s ZXZlbAoJCQkgOzsgR2V0IHRoZSBjb3JyZWN0IGxldmVsIHRvIG1hdGNoCgkJCSAoY29uY2F0ICJc XCpcXHsiIChudW1iZXItdG8tc3RyaW5nIHN0YXJ0LWxldmVsKSAiXFx9ICIpCgkJICAgICAgIG9y Zy1vdXRsaW5lLXJlZ2V4cCkKCQkgICAgICIgKlxcKFxcPFxcKCIKCQkgICAgIChtYXBjb25jYXQg J3JlZ2V4cC1xdW90ZSBvcmctdG9kby1rZXl3b3Jkcy0xICJcXHwiKQoJCSAgICAgKG9yZy1yZSAi XFwpXFw+XFwpP1sgXHRdKlxcKD86XFxbI1xcKC5cXClcXF1cXCk/WyBcdF0qXFwoLio/XFwpXFwo OltbOmFsbnVtOl1fQCMlOl0rOlxcKT9bIFx0XSokIikpKQoJIChwcm9wcyAobGlzdCAnZmFjZSAn ZGVmYXVsdAoJCSAgICAgICdkb25lLWZhY2UgJ29yZy1hZ2VuZGEtZG9uZQoJCSAgICAgICd1bmRv bmUtZmFjZSAnZGVmYXVsdAoJCSAgICAgICdtb3VzZS1mYWNlICdoaWdobGlnaHQKCQkgICAgICAn b3JnLW5vdC1kb25lLXJlZ2V4cCBvcmctbm90LWRvbmUtcmVnZXhwCgkJICAgICAgJ29yZy10b2Rv LXJlZ2V4cCBvcmctdG9kby1yZWdleHAKCQkgICAgICAnb3JnLWNvbXBsZXgtaGVhZGluZy1yZWdl eHAgb3JnLWNvbXBsZXgtaGVhZGluZy1yZWdleHAKCQkgICAgICAnaGVscC1lY2hvCgkJICAgICAg KGZvcm1hdCAibW91c2UtMiBvciBSRVQganVtcCB0byBvcmcgZmlsZSAlcyIKCQkJICAgICAgKGFi YnJldmlhdGUtZmlsZS1uYW1lCgkJCSAgICAgICAob3IgKGJ1ZmZlci1maWxlLW5hbWUgKGJ1ZmZl ci1iYXNlLWJ1ZmZlcikpCgkJCQkgICAoYnVmZmVyLW5hbWUgKGJ1ZmZlci1iYXNlLWJ1ZmZlcikp KSkpKSkKCSAoY2FzZS1mb2xkLXNlYXJjaCBuaWwpCgkgKG9yZy1tYXAtY29udGludWUtZnJvbSBu aWwpCiAgICAgICAgIGxzcG9zIHRhZ3MgdGFncy1saXN0CgkgKHRhZ3MtYWxpc3QgKGxpc3QgKGNv bnMgMCBvcmctZmlsZS10YWdzKSkpCgkgKGxsYXN0IDApIHJ0biBydG4xIGxldmVsIGNhdGVnb3J5 IGkgdHh0CgkgdG9kbyBtYXJrZXIgZW50cnkgaGVhZGluZyBwcmlvcml0eSBwcmlvcml0eS1udW0p CiAgICAod2hlbiAobm90IChvciAobWVtYmVyIGFjdGlvbiAnKGFnZW5kYSBzcGFyc2UtdHJlZSkp IChmdW5jdGlvbnAgYWN0aW9uKSkpCiAgICAgIChzZXRxIGFjdGlvbiAobGlzdCAnbGFtYmRhIG5p bCBhY3Rpb24pKSkKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1jaGFyIChwb2ludC1t aW4pKQogICAgICAod2hlbiAoZXEgYWN0aW9uICdzcGFyc2UtdHJlZSkKCShvcmctb3ZlcnZpZXcp Cgkob3JnLXJlbW92ZS1vY2N1ci1oaWdobGlnaHRzKSkKICAgICAgKHdoaWxlIChyZS1zZWFyY2gt Zm9yd2FyZCByZSBuaWwgdCkKCShzZXRxIG9yZy1tYXAtY29udGludWUtZnJvbSBuaWwpCgkoY2F0 Y2ggOnNraXAKCSAgKHNldHEgdG9kbyAoaWYgKG1hdGNoLWVuZCAxKSAob3JnLW1hdGNoLXN0cmlu Zy1uby1wcm9wZXJ0aWVzIDIpKQogICAgICAgICAgICAgICAgcHJpb3JpdHkgKGlmIChtYXRjaC1l bmQgMykgKG9yZy1tYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyAzKSkKICAgICAgICAgICAgICAg IGhlYWRpbmcgKG9yZy1tYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyA0KQoJCXRhZ3MgKGlmICht YXRjaC1lbmQgNSkgKG9yZy1tYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyA1KSkpCgkgIChnb3Rv LWNoYXIgKHNldHEgbHNwb3MgKG1hdGNoLWJlZ2lubmluZyAwKSkpCgkgIChzZXRxIGxldmVsIChv cmctcmVkdWNlZC1sZXZlbCAoZnVuY2FsbCBvdXRsaW5lLWxldmVsKSkKCQljYXRlZ29yeSAob3Jn LWdldC1jYXRlZ29yeSkpCgkgIChzZXRxIGkgbGxhc3QgbGxhc3QgbGV2ZWwpCgkgIDs7IHJlbW92 ZSB0YWcgbGlzdHMgZnJvbSBzYW1lIGFuZCBzdWJsZXZlbHMKCSAgKHdoaWxlICg+PSBpIGxldmVs KQoJICAgICh3aGVuIChzZXRxIGVudHJ5IChhc3NvYyBpIHRhZ3MtYWxpc3QpKQoJICAgICAgKHNl dHEgdGFncy1hbGlzdCAoZGVsZXRlIGVudHJ5IHRhZ3MtYWxpc3QpKSkKCSAgICAoc2V0cSBpICgx LSBpKSkpCgkgIDs7IGFkZCB0aGUgbmV4dCB0YWdzCgkgICh3aGVuIHRhZ3MKCSAgICAoc2V0cSB0 YWdzIChvcmctc3BsaXQtc3RyaW5nIHRhZ3MgIjoiKQoJCSAgdGFncy1hbGlzdAoJCSAgKGNvbnMg KGNvbnMgbGV2ZWwgdGFncykgdGFncy1hbGlzdCkpKQoJICA7OyBjb21waWxlIHRhZ3MgZm9yIGN1 cnJlbnQgaGVhZGxpbmUKCSAgKHNldHEgdGFncy1saXN0CgkJKGlmIG9yZy11c2UtdGFnLWluaGVy aXRhbmNlCgkJICAgIChhcHBseSAnYXBwZW5kIChtYXBjYXIgJ2NkciAocmV2ZXJzZSB0YWdzLWFs aXN0KSkpCgkJICB0YWdzKQoJCW9yZy1zY2FubmVyLXRhZ3MgdGFncy1saXN0KQoJICAod2hlbiBv cmctdXNlLXRhZy1pbmhlcml0YW5jZQoJICAgIChzZXRjZHIgKGNhciB0YWdzLWFsaXN0KQoJCSAg ICAobWFwY2FyIChsYW1iZGEgKHgpCgkJCSAgICAgIChzZXRxIHggKGNvcHktc2VxdWVuY2UgeCkp CgkJCSAgICAgIChvcmctYWRkLXByb3AtaW5oZXJpdGVkIHgpKQoJCQkgICAgKGNkYXIgdGFncy1h bGlzdCkpKSkKCSAgKHdoZW4gKGFuZCB0YWdzIG9yZy11c2UtdGFnLWluaGVyaXRhbmNlCgkJICAg ICAob3IgKG5vdCAoZXEgdCBvcmctdXNlLXRhZy1pbmhlcml0YW5jZSkpCgkJCSBvcmctdGFncy1l eGNsdWRlLWZyb20taW5oZXJpdGFuY2UpKQoJICAgIDs7IHNlbGVjdGl2ZSBpbmhlcml0YW5jZSwg cmVtb3ZlIHVuaW5oZXJpdGVkIG9uZXMKCSAgICAoc2V0Y2RyIChjYXIgdGFncy1hbGlzdCkKCQkg ICAgKG9yZy1yZW1vdmUtdW5pbmhlcml0ZWQtdGFncyAoY2RhciB0YWdzLWFsaXN0KSkpKQoJICAo d2hlbiAoYW5kCgoJCSA7OyBldmFsIG1hdGNoZXIgb25seSB3aGVuIHRoZSB0b2RvIGNvbmRpdGlv biBpcyBPSwoJCSAoYW5kIChvciAobm90IHRvZG8tb25seSkgKG1lbWJlciB0b2RvIG9yZy1ub3Qt ZG9uZS1rZXl3b3JkcykpCgkJICAgICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggdCkpIChldmFs IG1hdGNoZXIpKSkKCgkJIDs7IENhbGwgdGhlIHNraXBwZXIsIGJ1dCByZXR1cm4gdCBpZiBpdCBk b2VzIG5vdCBza2lwLAoJCSA7OyBzbyB0aGF0IHRoZSBgYW5kJyBmb3JtIGNvbnRpbnVlcyBldmFs dWF0aW5nCgkJIChwcm9nbgoJCSAgICh1bmxlc3MgKGVxIGFjdGlvbiAnc3BhcnNlLXRyZWUpIChv cmctYWdlbmRhLXNraXApKQoJCSAgIHQpCgoJCSA7OyBDaGVjayBpZiB0aW1lc3RhbXBzIGFyZSBk ZXNlbGVjdGluZyB0aGlzIGVudHJ5CgkJIChvciAobm90IHRvZG8tb25seSkKCQkgICAgIChhbmQg KG1lbWJlciB0b2RvIG9yZy1ub3QtZG9uZS1rZXl3b3JkcykKCQkJICAob3IgKG5vdCBvcmctYWdl bmRhLXRhZ3MtdG9kby1ob25vci1pZ25vcmUtb3B0aW9ucykKCQkJICAgICAgKG5vdCAob3JnLWFn ZW5kYS1jaGVjay1mb3ItdGltZXN0YW1wLWFzLXJlYXNvbi10by1pZ25vcmUtdG9kby1pdGVtKSkp KSkKCgkJIDs7IEV4dHJhIGNoZWNrIGZvciB0aGUgYXJjaGl2ZSB0YWcKCQkgOzsgRklYTUU6IERv ZXMgdGhlIHNraXBwZXIgYWxyZWFkeSBkbyB0aGlzPz8/PwoJCSAob3IKCQkgIChub3QgKG1lbWJl ciBvcmctYXJjaGl2ZS10YWcgdGFncy1saXN0KSkKCQkgIDs7IHdlIGhhdmUgYW4gYXJjaGl2ZSB0 YWcsIHNob3VsZCB3ZSB1c2UgdGhpcyBhbnl3YXk/CgkJICAob3IgKG5vdCBvcmctYWdlbmRhLXNr aXAtYXJjaGl2ZWQtdHJlZXMpCgkJICAgICAgKGFuZCAoZXEgYWN0aW9uICdhZ2VuZGEpIG9yZy1h Z2VuZGEtYXJjaGl2ZXMtbW9kZSkpKSkKCgkgICAgOzsgc2VsZWN0IHRoaXMgaGVhZGxpbmUKCgkg ICAgKGNvbmQKCSAgICAgKChlcSBhY3Rpb24gJ3NwYXJzZS10cmVlKQoJICAgICAgKGFuZCBvcmct aGlnaGxpZ2h0LXNwYXJzZS10cmVlLW1hdGNoZXMKCQkgICAob3JnLWdldC1oZWFkaW5nKSAobWF0 Y2gtZW5kIDApCgkJICAgKG9yZy1oaWdobGlnaHQtbmV3LW1hdGNoCgkJICAgIChtYXRjaC1iZWdp bm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpCgkgICAgICAob3JnLXNob3ctY29udGV4dCAndGFncy10 cmVlKSkKCSAgICAgKChlcSBhY3Rpb24gJ2FnZW5kYSkKCSAgICAgIChzZXRxIHR4dCAob3JnLWFn ZW5kYS1mb3JtYXQtaXRlbQoJCQkgIiIKCQkJIChjb25jYXQKCQkJICAoaWYgKGVxIG9yZy10YWdz LW1hdGNoLWxpc3Qtc3VibGV2ZWxzICdpbmRlbnRlZCkKCQkJICAgICAgKG1ha2Utc3RyaW5nICgx LSBsZXZlbCkgPy4pICIiKQoJCQkgIChvcmctZ2V0LWhlYWRpbmcpKQoJCQkgY2F0ZWdvcnkKCQkJ IHRhZ3MtbGlzdAoJCQkgKQoJCSAgICBwcmlvcml0eS1udW0gKG9yZy1nZXQtcHJpb3JpdHkgdHh0 KSkKCSAgICAgIChnb3RvLWNoYXIgbHNwb3MpCgkgICAgICAoc2V0cSBtYXJrZXIgKG9yZy1hZ2Vu ZGEtbmV3LW1hcmtlcikpCgkgICAgICAob3JnLWFkZC1wcm9wcyB0eHQgcHJvcHMKCQknb3JnLW1h cmtlciBtYXJrZXIgJ29yZy1oZC1tYXJrZXIgbWFya2VyICdvcmctY2F0ZWdvcnkgY2F0ZWdvcnkK CQkndG9kby1zdGF0ZSB0b2RvCgkJJ3ByaW9yaXR5IHByaW9yaXR5LW51bSAndHlwZSAidGFnc21h dGNoIikKCSAgICAgIChwdXNoIHR4dCBydG4pKQoJICAgICAoKGZ1bmN0aW9ucCBhY3Rpb24pCgkg ICAgICAoc2V0cSBvcmctbWFwLWNvbnRpbnVlLWZyb20gbmlsKQoJICAgICAgKHNhdmUtZXhjdXJz aW9uCgkJKHNldHEgcnRuMSAoZnVuY2FsbCBhY3Rpb24pKQoJCShwdXNoIHJ0bjEgcnRuKSkpCgkg ICAgICh0IChlcnJvciAiSW52YWxpZCBhY3Rpb24iKSkpCgoJICAgIDs7IGlmIHdlIGFyZSB0byBz a2lwIHN1YmxldmVscywganVtcCB0byBlbmQgb2Ygc3VidHJlZQoJICAgICh1bmxlc3Mgb3JnLXRh Z3MtbWF0Y2gtbGlzdC1zdWJsZXZlbHMKCSAgICAgIChvcmctZW5kLW9mLXN1YnRyZWUgdCkKCSAg ICAgIChiYWNrd2FyZC1jaGFyIDEpKSkpCgk7OyBHZXQgdGhlIGNvcnJlY3QgcG9zaXRpb24gZnJv bSB3aGVyZSB0byBjb250aW51ZQoJKGlmIG9yZy1tYXAtY29udGludWUtZnJvbQoJICAgIChnb3Rv LWNoYXIgb3JnLW1hcC1jb250aW51ZS1mcm9tKQoJICAoYW5kICg9IChwb2ludCkgbHNwb3MpIChl bmQtb2YtbGluZSAxKSkpKSkKICAgICh3aGVuIChhbmQgKGVxIGFjdGlvbiAnc3BhcnNlLXRyZWUp CgkgICAgICAgKG5vdCBvcmctc3BhcnNlLXRyZWUtb3Blbi1hcmNoaXZlZC10cmVlcykpCiAgICAg IChvcmctaGlkZS1hcmNoaXZlZC1zdWJ0cmVlcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkpCiAg ICAobnJldmVyc2UgcnRuKSkpCgoKOzs7IEV4dHJhcwoKOzsgU2VlIE5vdGUgaCBhYm92ZS4gVGhv dWdoIGl0IGdpdmVzIGEgZnVsbCBzb2x1dGlvbiB0byBmaW5kaW5nCjs7IHRoZSB0b2RvIG1hdGNo ZXIsIGl0IGlzIGxpa2VseSBub3QgbmVlZGVkIGluIHByYWN0aWNlLCBhbmQKOzsgdW5sZXNzL3Vu dGlsIHRoYXQgY2hhbmdlcywgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsIGNvZGUuIAoK KGRlZnVuIG9yZy1maW5kLXRvZG8tcXVlcnkgKHF1ZXJ5LXN0cmluZykKICAiRG9lcyBxdWVyeSBz dHJpbmcgY29udGFpbiBhIHRvZG8gbWF0Y2ggZXhwcmVzc2lvbj8gClNlYXJjaCBmb3IgdGhlIGZp cnN0IC8gdGhhdCBpcyBub3QgYmV0d2VlbiBxdW90ZXMgb3IgYnJhY2VzLCBhbmQKcmV0dXJuIHRo ZSBpbmRleCBvZiB0aGF0IGNoYXJhY3RlciBpZiBmb3VuZCwgb3IgbmlsLgpTZXQgbWF0Y2ggZGF0 YSBmb3IgUVVFUlktU1RSSU5HIHNvIHRoYXQgZ3JvdXAgMCBzcGFucyBmcm9tIHRoZQpmb3VuZCAv IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgZ3JvdXAgMSBtYXRjaGVzIFwiLyE/XFxzLSpcIiBh dAp0aGUgZm91bmQgLywgYW5kIGdyb3VwIDIgbWF0Y2hlcyB0aGUgISBpZiBwcmVzZW50LiIKICAo d2l0aC10ZW1wLWJ1ZmZlcgogICAgKGluc2VydCBxdWVyeS1zdHJpbmcpCiAgICAoZ290by1jaGFy IChwb2ludC1taW4pKQogICAgOzsgU2VhcmNoIGZvciBmaXJzdCAvIHRoYXQgaXMgbm90IGJldHdl ZW4gIiIncyBvciB7fSdzCiAgICAoY2F0Y2ggOmZvdW5kLXNsYXNoCiAgICAgICh3aGlsZSAocmUt c2VhcmNoLWZvcndhcmQgIlxcKC9cXCghXFwpP1xccy0qXFwpXFx8W1wie10iIG5pbCB0KQogICAg ICAgICh3aGVuIChtYXRjaC1lbmQgMSkKICAgICAgICAgIChzZXQtbWF0Y2gtZGF0YSAgCiAgICAg ICAgICAgKG1hcGNhciAnMS0gICAgOyBzZXQgaW5kaWNlcyB1c2luZyBzdHJpbmcgY29udmVudGlv bgogICAgICAgICAgICAgICAgICAgKG5jb25jIChsaXN0IChtYXRjaC1iZWdpbm5pbmcgMCkgKHBv aW50LW1heCkgICAgOzAgLyB0byBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpIDsxIC8hP1xccy0qCiAgICAgICAgICAg ICAgICAgICAgICAgICAgKGlmIChtYXRjaC1lbmQgMikgICAgICAgICAgICAgICAgICAgICAgICA7 MiAhPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAobWF0Y2gtYmVnaW5uaW5n IDIpIChtYXRjaC1lbmQgMikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwpKSkpCiAg ICAgICAgICAodGhyb3cgOmZvdW5kLXNsYXNoICgxLSAobWF0Y2gtYmVnaW5uaW5nIDEpKSkpCiAg ICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQogICAgICAgIChjYXNlIChjaGFy LWFmdGVyKQogICAgICAgICAgKD9cIiAob3JnLXJlYWQtcXVvdGVkLXN0cmluZy1pbi1xdWVyeSkp CiAgICAgICAgICAoP1x7IChvcmctcmVhZC1iYWxhbmNlZC1zdHJpbmcgP1x7ID9cfSkpKSkKICAg ICAgbmlsKSkpCgo7OyBUZW1wb3JhcnkgY29kZSB0byBoZWxwIHdpdGggaW50ZXJhY3RpdmUgdGVz dGluZwo7Owo7OyAgSSd2ZSBhZGRlZCBhIGAtTkVXJyB0byB0aGUgbmFtZXMgb2YgdGhlIG1vZGlm aWVkIGZ1bmN0aW9ucyBhbmQgc2F2ZQo7OyAgdGhlIG9yaWdpbmFscyBiZWxvd28gd2l0aCBhIGAt T1JJR0lOQUwnIGFkZGVkLiBBZnRlciBsb2FkaW5nIHRoaXMKOzsgIGZpbGUsIHlvdSBjYW4gZG8K OzsgIAo7OyAgICAgIChvcmctdG1wLXVzZS10YWctcGFyc2VyICduZXcpCjs7ICBhbmQKOzsgICAg ICAob3JnLXRtcC11c2UtdGFnLXBhcnNlciAnb3JpZ2luYWwpCjs7ICAKOzsgIHR3byBzd2l0Y2gg YmV0d2VlbiB2ZXJzaW9ucyBhbmQgdHJ5IHRoZW0gb3V0LiBPciBqdXN0IHVzZSB0aGUKOzsgIG5h bWVzIHdpdGggc3VmZml4ZXMgZGlyZWN0bHkuIFNlZSBhbHNvIHRoZSB0ZXN0cyBpbiBgdGFnLXF1 ZXJ5LXRlc3RzLmVsJy4KCgooZnNldCAnb3JnLXNjYW4tdGFncy1PUklHSU5BTCAoc3ltYm9sLWZ1 bmN0aW9uICdvcmctc2Nhbi10YWdzKSkKKGZzZXQgJ29yZy1tYWtlLXRhZ3MtbWF0Y2hlci1PUklH SU5BTCAoc3ltYm9sLWZ1bmN0aW9uICdvcmctbWFrZS10YWdzLW1hdGNoZXIpKQoKKGRlZnZhciBv cmctdG1wLXdoaWNoLXRhZy1wYXJzZXIgJ29yaWdpbmFsKQooZGVmdW4gb3JnLXRtcC11c2UtdGFn LXBhcnNlciAoJm9wdGlvbmFsIHdoaWNoKQogICJTd2l0Y2ggYmV0d2VlbiB0YWcgcXVlcnkgcGFy c2Vycy4gCklmIG5vbi1uaWwsIFdISUNIIG11c3QgYmUgZWl0aGVyICduZXcgb3IgJ29yaWdpbmFs LiBJZiBuaWwsIGl0IHRvZ2dsZXMuIgogIChzZXRxIG9yZy10bXAtd2hpY2gtdGFnLXBhcnNlcgog ICAgICAgIChvciB3aGljaCAoaWYgKGVxIG9yZy10bXAtd2hpY2gtdGFnLXBhcnNlciAnb3JpZ2lu YWwpICduZXcgJ29yaWdpbmFsKSkpCiAgKGVjYXNlIG9yZy10bXAtd2hpY2gtdGFnLXBhcnNlcgog ICAgKG5ldwogICAgIChmc2V0ICdvcmctc2Nhbi10YWdzIChzeW1ib2wtZnVuY3Rpb24gJ29yZy1z Y2FuLXRhZ3MtTkVXKSkKICAgICAoZnNldCAnb3JnLW1ha2UtdGFncy1tYXRjaGVyIChzeW1ib2wt ZnVuY3Rpb24gJ29yZy1tYWtlLXRhZ3MtbWF0Y2hlci1ORVcpKSkKICAgIChvcmlnaW5hbAogICAg IChmc2V0ICdvcmctc2Nhbi10YWdzIChzeW1ib2wtZnVuY3Rpb24gJ29yZy1zY2FuLXRhZ3MtT1JJ R0lOQUwpKQogICAgIChmc2V0ICdvcmctbWFrZS10YWdzLW1hdGNoZXIgKHN5bWJvbC1mdW5jdGlv biAnb3JnLW1ha2UtdGFncy1tYXRjaGVyLU9SSUdJTkFMKSkpKQogIG9yZy10bXAtd2hpY2gtdGFn LXBhcnNlcikKCgo7Ozsgb3JnLXRhZy1xdWVyeS1wYXJzZS5lbCBlbmRzIGhlcmUK --f46d042fdc1ed5fe9004c66be874 Content-Type: application/octet-stream; name="tag-query-tests.el" Content-Disposition: attachment; filename="tag-query-tests.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h5ge951x1 O2ZpcnN0PT47IChsb2FkICJvcmctdGFnLXF1ZXJ5LXBhcnNlLmVsIikKCihldmFsLXdoZW4tY29t cGlsZQogIChyZXF1aXJlICdjbCkpCgo7OyBBIHZlcnkgcnVkaW1lbnRhcnkgdGVzdCBmcmFtZXdv cmsKCjs7OyBDb21wYXJpbmcgb3JnLXRhZy1xdWVyeS1wYXJzZXIgYW5kIG9yZy1tYWtlLXRhZy1t YXRjaGVyIGlzCjs7OyBjb21wbGljYXRlZCBieSB0aGUgZGlmZmVyZW50IG9yZGVyaW5nIG9mIGxl YXZlcyBpbiB0aGUgdHJlZXMuCjs7OyBTcGVjaWZpY2FsbHksIHRoZSBmb3JtZXIgcHV0cyB0aGUg dGVybXMgaW4gdGhlIGdpdmVuIG9yZGVyLAo7OzsgYnV0IHRoZSBsYXR0ZXIgKHRoZSBleGlzdGlu ZyBvcmcgY29kZSkgcmV2ZXJzZXMgdGhlIHRlcm1zLgo7OzsgUGFyc2luZyB0aGUgc3RyaW5nIHRv IHJldmVyc2Ugd291bGQgcmVxdWlyZSB0ZXN0aW5nIHRoZSBzZWNvbmRhcnkKOzs7IHBhcnNlciBh bmQgdHVydGxlcyBhbGwgdGhlIHdheSBkb3duLgo7OzsKOzs7IFR3byBhcHByb2FjaGVzIHRoZW46 IHNwZWNpZnkgdGhlIHN0cmluZ3MgbWFudWFsbHkgaW4gcGFpcnMsIG9yCjs7OyBkZWZpbmUgdHJh bnNmb3JtIHRoYXQgYWNjb3VudHMgZm9yIHRoZSBkaWZmZXJlbmNlcy4gSGVyZQo7OzsgYHRhZy10 ZXN0LXN1aXRlJyBtb3N0bHkgdGFrZXMgdGhlIGZvcm1lciBhcHByb2FjaCwgdW5sZXNzIG9ubHkg b25lCjs7OyBzdHJpbmcgaXMgZ2l2ZW4gaW4gd2hpY2ggY2FzZSBpdCB1c2VzIGB0YWctdGVzdC10 cmFuc2Zvcm0nIHRvIHJlbWFwCjs7OyB0aGUgb3JpZ2luYWwgZm9ybXMuIFRoZSBmdW5jdGlvbiBg dGFnLXRlc3QtdHJhbnNmb3JtJyB0YW5zZm9ybXMgdGhlCjs7OyBleGlzdGluZyBmb3JtcyBpbnRv IG5ldyBmb3JtcyBleGNlcHQgaXQgaWdub3JlcyBQUklPUklUWSBhbmQgSEVBRElORwo7OzsgcXVl cmllcyB3aGljaCBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSBpbiB0aGUgbmV3IGNvZGUuCgooZGVm dW4gdGFnLXRlc3QtdHJhbnNmb3JtIChtYXRjaGVyKQogIChsZXQgKChzcGVjCiAgICAgICAgIChp ZiAoYW5kIChlcSAoY2FkciBtYXRjaGVyKSAnYW5kKQogICAgICAgICAgICAgICAgICAoZXEgKGNh ciAobGFzdCBtYXRjaGVyKSkgdCkpCiAgICAgICAgICAgICAoY29ucyAoY2FyIG1hdGNoZXIpIChj YXIgKGNkZHIgbWF0Y2hlcikpKQogICAgICAgICAgIG1hdGNoZXIpKSkKICAgIChpZiAobGlzdHAg KGNkciBzcGVjKSkKICAgICAgICAobWFwY2FyICd0YWctdGVzdC10cmFuc2Zvcm0tMSBzcGVjKQog ICAgICBzcGVjKSkpCgooZGVmdW4gdGFnLXRlc3QtdHJhbnNmb3JtLTEgKHNwZWMpCiAgKGlmIChh dG9tIHNwZWMpCiAgICAgIHNwZWMKICAgIChjYXNlIChjYXIgc3BlYykKICAgICAgKGFuZAogICAg ICAgKGNvbnMgJ2FuZCAobnJldmVyc2UgKG1hcGNhciAndGFnLXRlc3QtdHJhbnNmb3JtLTEgKGNk ciBzcGVjKSkpKSkKICAgICAgKG9yCiAgICAgICAoaWYgKGFuZCAobnVsbCAobnRoY2RyIDMgc3Bl YykpCiAgICAgICAgICAgICAgICAoZXF1YWwgKGNhciAoY2RkciBzcGVjKSkgIiIpKQogICAgICAg ICAgIHNwZWMKICAgICAgICAgKGNvbnMgJ29yIChucmV2ZXJzZSAobWFwY2FyICd0YWctdGVzdC10 cmFuc2Zvcm0tMSAoY2RyIHNwZWMpKSkpKSkKICAgICAgKG5vdAogICAgICAgKGlmIChlcSAoY2Fy IChjYWRyIHNwZWMpKSAnc3RyaW5nLW1hdGNoKQogICAgICAgICAgIChsaXN0ICdvcmctc3RyaW5n LW1hdGNoPD4KICAgICAgICAgICAgICAgICAoY2FyIChjZGRyIChjYWRyIHNwZWMpKSkKICAgICAg ICAgICAgICAgICAoY2FkciAoY2FkciBzcGVjKSkpCiAgICAgICAgIHNwZWMpKQogICAgICAoc3Ry aW5nLW1hdGNoCiAgICAgICAobGlzdCAnb3JnLXN0cmluZy1tYXRjaD0gKGNhciAoY2RkciBzcGVj KSkgKGNhZHIgc3BlYykpKQogICAgICAodAogICAgICAgKGNvbnMgKHRhZy10ZXN0LXRyYW5zZm9y bS0xIChjYXIgc3BlYykpCiAgICAgICAgICAgICAobWFwY2FyICd0YWctdGVzdC10cmFuc2Zvcm0t MSAoY2RyIHNwZWMpKSkpKSkpCgooZGVmdW4gdGFnLXRlc3QtbSAocXVlcnkgJm9wdGlvbmFsIG9y aWdpbmFscCkKICAiQ2FsbCBgb3JnLW1ha2UtdGFncy1tYXRjaGVyJyBvbiBRVUVSWS4gCk5ldyB2 ZXJzaW9uIGJ5IGRlZmF1bHQsIG9yaWdpbmFsIHZlcnNpb24gaWYgT1JJR0lOQUxQIGlzIG5vbi1u aWwuIgogIChsZXQgKCh0b2RvLW9ubHkgbmlsKSkKICAgIChmdW5jYWxsCiAgICAgIChpZiBvcmln aW5hbHAKICAgICAgICAgICdvcmctbWFrZS10YWdzLW1hdGNoZXItT1JJR0lOQUwKICAgICAgICAn b3JnLW1ha2UtdGFncy1tYXRjaGVyLU5FVykKICAgICAgcXVlcnkpKSkKCihkZWZ1biB0YWctdGVz dC1wYXJzZS10cmVlIChxdWVyeSkKICAiUmV0dXJuIChqdXN0KSB0aGUgcGFyc2UgdHJlZSBmb3Ig cXVlcnkgcHJvZHVjZWQgYnkgYG9yZy10YWctcXVlcnktcGFyc2VyJyIKICAoY2FyIChudGhjZHIg MiAob3JnLXRhZy1xdWVyeS1wYXJzZSBxdWVyeSkpKSkKOzsgdXNlZnVsIGF0IHJlcGw6IChkZWZ1 biB0cSAocXVlcnkpIChjb25zIHF1ZXJ5ICh0YWctdGVzdC1wYXJzZS10cmVlIHF1ZXJ5KSkpCgoK KGRlZnVuIHRhZy10ZXN0LWNvbXBhcmUgKG5ldyBvcmlnaW5hbCkKICAoaWYgKGFuZCAob3IgKGVx IChjZHIgbmV3KSB0KSAoZXEgKGNhZHIgbmV3KSAncHJvZ24pKQogICAgICAgICAgIChlcSAoY2Fk ciBvcmlnaW5hbCkgJ2FuZCkKICAgICAgICAgICAoZXEgKGNhciAobGFzdCBvcmlnaW5hbCkpIHQp KQogICAgICAoZXF1YWwgYChhbmQgLChjZHIgbmV3KSB0KSAoY2RyIG9yaWdpbmFsKSkKICAgIChl cXVhbCAoY2RyIG5ldykgKGNkciBvcmlnaW5hbCkpKSkKOzsgZm9ybWVybHkgcmV0dXJuZWQgKGFu ZCBfXyAoZm9ybWF0ICIlczw9PT4lcyIgKGNhciBuZXcpIChjYXIgb3JpZ2luYWwpKSkKCihvcmct ZGVmaGFzaC1hdC1jb21waWxlIHRhZy10ZXN0LXN1aXRlLXRhYmxlICgpCiAgIk1hcHBpbmcgZnJv bSB0ZXN0IG5hbWUgc3ltYm9scyB0byB0YWcgdGVzdCBmdW5jdGlvbnMuIEVhY2gKZnVuY3Rpb24g dGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsIHdoaWNoIGlmIG5vbi1uaWwsIGNhdXNlcyBhCnNp bXBsZSBib29sZWFuIHN1bW1hcnkgdG8gYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGZ1bmN0 aW9uCnJldHVybnMgdGhlIGxpc3Qgb2YgcmVzdWx0cyBmb3Jtcy4gQ2FsbCB3aXRoIGB0YWctdGVz dC1ydW4nCmdpdmluZyBuYW1lIGFuZCBvcHRpb25hbCBzdW1tYXJpemUgYXJndW1lbnQuIikKCihk ZWZtYWNybyB0YWctdGVzdC1zdWl0ZSAobmFtZSAmcmVzdCBib2R5KQogICJSZWdpc3RlciB0ZXN0 IE5BTUUuIElmIE5BTUUgaXMgbmlsLCBkbyBub3Qgc2F2ZSB0aGUgdGVzdCwgcnVuIGl0Cm5vdyB3 aXRoIHN1bW1hcml6ZSBhcmd1bWVudCB0LiIKICAoZGVjbGFyZSAoaW5kZW50IDEpKQogIChmbGV0 ICgodGVzdC1pdCAoc3BlYykKICAgICAgICAgICAgICAgICAgKGxldCAoKHF1ZXJ5IChjYXIgc3Bl YykpCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmogICAoY2RyIHNwZWMpKSkKICAgICAgICAg ICAgICAgICAgICAoY29uZAogICAgICAgICAgICAgICAgICAgICAoKG51bGwgb2JqKQogICAgICAg ICAgICAgICAgICAgICAgYChsZXQgKCh0b2RvLW9ubHkgbmlsKSkgOyBuZWVkcyB0byBiZSBzY29w ZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kaXRpb24tY2FzZSBleGNlcHRpb24K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoZXF1YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmctbWFrZS10 YWdzLW1hdGNoZXItTkVXICxxdWVyeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0 YWctdGVzdC10cmFuc2Zvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLW1h a2UtdGFncy1tYXRjaGVyLU9SSUdJTkFMICxxdWVyeSkpKQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAscXVlcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvciAoY29ucyBu aWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIkVSUk9S IG9uIHF1ZXJ5ICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLHF1ZXJ5IChjYWRyIGV4Y2VwdGlvbikpKSkpKSkKICAgICAgICAgICAgICAgICAg ICAgKChzdHJpbmdwIG9iaikKICAgICAgICAgICAgICAgICAgICAgIGAobGV0ICgodG9kby1vbmx5 IG5pbCkpIDsgbmVlZHMgdG8gYmUgc2NvcGVkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAo Y29uZGl0aW9uLWNhc2UgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNv bnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhZy10ZXN0LWNvbXBhcmUKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChvcmctbWFrZS10YWdzLW1hdGNoZXItTkVXICxxdWVy eSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmctbWFrZS10YWdzLW1hdGNoZXIt T1JJR0lOQUwgLG9iaikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxxdWVyeSkKICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yIChjb25zIG5pbAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiRVJST1Igb24gcXVlcnkgJXM6ICVzIgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscXVlcnkgKGNh ZHIgZXhjZXB0aW9uKSkpKSkpKQogICAgICAgICAgICAgICAgICAgICAoKGVxIG9iaiAnZXJyb3Ip CiAgICAgICAgICAgICAgICAgICAgICBgKGNvbmRpdGlvbi1jYXNlIGV4Y2VwdGlvbgogICAgICAg ICAgICAgICAgICAgICAgICAgICAobGV0ICgodG9kby1vbmx5IG5pbCkpIDsgbmVlZHMgdG8gYmUg c2NvcGVkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy1tYWtlLXRhZ3MtbWF0 Y2hlci1ORVcgLHF1ZXJ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIG5pbCAs cXVlcnkpKQogICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yIChjb25zIChjYWRyIGV4Y2Vw dGlvbikgLHF1ZXJ5KSkpKQogICAgICAgICAgICAgICAgICAgICAoKGVxIG9iaiB0KQogICAgICAg ICAgICAgICAgICAgICAgYChjb25kaXRpb24tY2FzZSBleGNlcHRpb24KICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGNvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAodGFn LXRlc3QtbSAscXVlcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygscXVl cnkgLiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICxxdWVyeSkKICAgICAgICAgICAg ICAgICAgICAgICAgIChlcnJvciAoY29ucyBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChmb3JtYXQgIkVSUk9SIG9uIHF1ZXJ5ICVzOiAlcyIKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHF1ZXJ5IChjYWRyIGV4Y2VwdGlv bikpKSkpKQogICAgICAgICAgICAgICAgICAgICAoKGFuZCAoY29uc3Agb2JqKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoLXAgIlxcKC9cXCghXFwpP1xccy0qXFwpW157 fVwiXSokIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkp KQogICAgICAgICAgICAgICAgICAgICAgYChjb25kaXRpb24tY2FzZSBleGNlcHRpb24KICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGNvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChl cXVhbCAodGFnLXRlc3QtbSAscXVlcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJywoY29ucyBxdWVyeSAoY2FyIG9iaikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg LHF1ZXJ5KQogICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yIChjb25zIG5pbAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiRVJST1Igb24gcXVlcnkg JXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAs cXVlcnkgKGNhZHIgZXhjZXB0aW9uKSkpKSkpCiAgICAgICAgICAgICAgICAgICAgICgoY29uc3Ag b2JqKQogICAgICAgICAgICAgICAgICAgICAgYChjb25kaXRpb24tY2FzZSBleGNlcHRpb24KICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAg IChlcXVhbCAodGFnLXRlc3QtbSAscXVlcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJygscXVlcnkgcHJvZ24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoc2V0cSBvcmctY2FjaGVkLXByb3BzIG5pbCkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAsKGNhciBvYmopKSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICxxdWVyeSkKICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvciAoY29ucyBuaWwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIkVSUk9SIG9u IHF1ZXJ5ICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLHF1ZXJ5IChjYWRyIGV4Y2VwdGlvbikpKSkpKQogICAgICAgICAgICAgICAgICAgICAo dCAoZXJyb3IgIlVucmVjb2duaXplZCB0ZXN0IHR5cGUiKSkpKSkpCiAgICAobGV0KiAoKHJlc3Vs dC1mb3JtcyAobWFwY2FyICd0ZXN0LWl0IGJvZHkpKQogICAgICAgICAgICh0ZXN0IGAobGFtYmRh ICgmb3B0aW9uYWwgc3VtbWFyaXplPykKICAgICAgICAgICAgICAgICAgICAobGV0ICgodGVzdHMg KGxpc3QgLEByZXN1bHQtZm9ybXMpKSkKICAgICAgICAgICAgICAgICAgICAgIChpZiBzdW1tYXJp emU/CiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKG91dGNvbWUgKGNhdGNoIDpmYWls dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG9saXN0IChy ZXN1bHQgdGVzdHMgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHVubGVzcyAoY2FyIHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAodGhyb3cgOmZhaWx1cmUgbmlsKSkpKSkpCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoaWYgb3V0Y29tZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICht ZXNzYWdlICJBbGwgJXMgdGVzdHMgcGFzc2VkLiIgJyxuYW1lKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAobWVzc2FnZSAiU29tZSAlcyB0ZXN0cyBmYWlsZWQuIiAnLG5hbWUpKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSkKICAgICAgICAgICAgICAgICAgICAgICAg KGxpc3QgLEByZXN1bHQtZm9ybXMpKSkpKSkKICAgICAgKGlmIG5hbWUKICAgICAgICAgIGAocHJv Z24gKHB1dGhhc2ggJyxuYW1lICx0ZXN0IHRhZy10ZXN0LXN1aXRlLXRhYmxlKSB0KQogICAgICAg IGAoZnVuY2FsbCAsdGVzdCB0KSkpKSkKCihkZWZ1biB0YWctdGVzdC1ydW4gKHN1bW1hcml6ZT8g JnJlc3Qgc3VpdGUtc3ltYm9scykKICAobGV0ICgoc3VtbWFyaXplIChhbmQgc3VtbWFyaXplPyAo bm90IChtZW1xIHN1bW1hcml6ZT8gJyg6c2hvdyA6cmVzdWx0cykpKSkpCiAgICAgICAgKHJlc3Vs dHMgbmlsKQogICAgICAgIChzdWl0ZXMgKGlmIHN1aXRlLXN5bWJvbHMKICAgICAgICAgICAgICAg ICAgICBzdWl0ZS1zeW1ib2xzCiAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcg dGhlIGhhc2gta2V5cyBvZiB0YWctdGVzdC1zdWl0ZS10YWJsZQogICAgICAgICAgICAgICAgICAg ICAgICBjb2xsZWN0IGtleSkpKSkKICAgIChkb2xpc3QgKHN1aXRlIHN1aXRlcykKICAgICAgKGNv bmRpdGlvbi1jYXNlIGV4Y2VwdAogICAgICAgICAgKGxldCAoKHRlc3QgKGdldGhhc2ggc3VpdGUg dGFnLXRlc3Qtc3VpdGUtdGFibGUpKSkKICAgICAgICAgICAgKGlmIChhbmQgdGVzdCAoZnVuY3Rp b25wIHRlc3QpKQogICAgICAgICAgICAgICAgKHB1c2ggKGNvbnMgc3VpdGUgKGZ1bmNhbGwgdGVz dCBzdW1tYXJpemUpKSByZXN1bHRzKQogICAgICAgICAgICAgIChwdXNoIChjb25zIHN1aXRlCiAg ICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgbmlsIChmb3JtYXQgIlRlc3Qgc3VpdGUgJXMg bm90IGZvdW5kIiBzdWl0ZSkpKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMpKSkKICAgICAg ICAoZXJyb3IgKHB1c2ggKGZvcm1hdCAiVW5jYXVnaHQgZXJyb3Igb24gc3VpdGUgJXM6ICVzIgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlIGV4Y2VwdCkKICAgICAgICAgICAgICAg ICAgICAgcmVzdWx0cykpKSkKICAgIChpZiAoY2RyIHJlc3VsdHMpIChucmV2ZXJzZSByZXN1bHRz KSAoY2FyIHJlc3VsdHMpKSkpCgoKOzsKOzsgU29tZSBCYXNpYyBUZXN0cwo7Owo7OyBLZWVwIGlu IG1pbmQgdGVybSByZXZlcnNhbCBtZW50aW9uZWQgYWJvdmUKOzsKCih0YWctdGVzdC1zdWl0ZSBv cmctY29tcGFyaXNvbi0xCiAgKCIiKQogICgiZm9vIikKICAoIi1mb28iKQogICgie15IVStSUkFZ fSIpCiAgKCIte15CTypPIX0iKQogICgiTEVWRUw8MyIpCiAgKCJMRVZFTD4zIikKICAoIkxFVkVM PD0zIikKICAoIkxFVkVMPj0zIikKICAoIkxFVkVMPTMiKQogICgiTEVWRUw8PjMiKQogICgiVE9E Tz1cIldBSVRcIiIpCiAgKCJUT0RPPD5cIldBSVRcIiIpCiAgKCJBX1BST1A8XCJmb29cIiIpCiAg KCJBX1BST1A+XCJmb29cIiIpCiAgKCJBX1BST1A8PVwiZm9vXCIiKQogICgiQV9QUk9QPj1cImZv b1wiIikKICAoIkFfUFJPUDw+XCJmb29cIiIpCiAgKCJBX1BST1A9XCJmb29cIiIpCiAgKCJBX0RB VEU9XCI8MjAwOC0xMi0yNCAxODozMD5cIiIpCiAgKCJBX0RBVEU8XCI8MjAwOC0xMi0yNCAxODoz MD5cIiIpCiAgKCJBX0RBVEU8PVwiPDIwMDgtMTItMjQgMTg6MzA+XCIiKQogICgiQV9EQVRFPj1c IjwyMDA4LTEyLTI0IDE4OjMwPlwiIikKICAoIkFfREFURT5cIjwyMDA4LTEyLTI0IDE4OjMwPlwi IikKICAoIkFfREFURTw+XCI8MjAwOC0xMi0yNCAxODozMD5cIiIpCiAgKCJERUFETElORTw+XCI8 LTJkPlwiIikKICAoIkRFQURMSU5FPVwiPCsxdz5cIiIpCiAgKCJERUFETElORT5cIjwrNjBtPlwi IikKICAoIkRFQURMSU5FPFwiPHRvZGF5PlwiIikKICAoIlNDSEVEVUxFRD49XCI8dG9tb3Jyb3c+ XCIiKQogICgiU0NIRURVTEVEPD1cIjwrMnk+XCIiKQogICgiQ0FURUdPUlk9XCJmb29cIiIpCiAg KCJmb28rUFJPUD1cIkFcIitaPXthYmN9LWJhciIpCiAgKCJmb28rYmFyK3phcCIpCiAgKCJmb28t YmFyK3phcCIpCiAgKCItZm9vK2Jhci16YXAiKQogICgiZm9vfGJhcnwtemFwIikKICAoIi1mb28r YmFyK3phcC17XmEuKn0iKQogICgiLXteYWJjfSt7XmF9IikKICAoIi17WzAtOV19fHphcDlAIyVp dHxMRVZFTD41IikKICAoInteQX18e14uQn18e15DfSIpCiAgKCJ7XkF9fG9rLXphcHx7XkN9IikK ICAoIndvcmsrVE9ETz1cIldBSVRJTkdcInxob21lK1RPRE89XCJXQUlUSU5HXCIiKQogICgid29y ay1UT0RPPVwiV0FJVElOR1wifGhvbWUmVE9ETz1cIldBSVRJTkdcIiIpCiAgKCJ6YXAtYmFyK2Zv byZMRVZFTD4yIikKICAoIi16YXArYmFyfExFVkVMPD0yJlRPRE88PlwiV0FJVFwiIikKICAoIit3 b3JrLWJvc3MrUFJJT1JDPVwiQVwiK0NvZmZlZT1cInVubGltaXRlZFwiK0VmZm9ydDwyK1dpdGg9 e1NhcmFoXFx8RGVubnl9K1NDSEVEVUxFRD49XCI8MjAwOC0xMC0xMT5cIiIpCiAgKQoKOzsgU29t ZSBvZiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgYWJvdmUsIGJ1dCBJJ3ZlIGV4cGxpY2l0bHkgcmV2 ZXJzZWQKOzsgdGhlIHRlcm1zIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2Zvcm1lciBpcyBu b3QgbWFza2luZyBhbnkgcHJvYmxlbXMuCjs7IFRoaXMgbmVjZXNzYXJpbHkgZXhjbHVkZXMgdGhl IG90aGVyIHRyYW5zZm9ybWF0aW9ucyBzbyBpdCBpcyByZWFsbHkgYSBtZXRhLXRlc3QuCjs7IFRo ZSByZXN0IGluY2x1ZGUgdG9kbyBtYXRjaGVycyBpbiB0aGUgY29tcGFyaXNvbi4KKHRhZy10ZXN0 LXN1aXRlIG9yZy1jb21wYXJpc29uLTIKICAoImZvbytiYXIremFwIiAuICJ6YXArYmFyK2ZvbyIp CiAgKCJmb28tYmFyK3phcCIgLiAiemFwLWJhcitmb28iKQogICgiLWZvbytiYXItemFwIiAuICIt emFwK2Jhci1mb28iKQogICgiZm9vfGJhcnwtemFwIiAuICItemFwfGJhcnxmb28iKQogICgiLWZv bytiYXIremFwLXteYS4qfSIgLiAiLXteYS4qfSt6YXArYmFyLWZvbyIpCiAgKCIte15hYmN9K3te YX0iIC4gInteYX0te15hYmN9IikKICAoIi17WzAtOV19fHphcDlAIyVpdHxMRVZFTD41IiAuICJM RVZFTD41fHphcDlAIyVpdHwte1swLTldfSIpCiAgKCJ7XkF9fHteLkJ9fHteQ30iIC4gInteQ318 e14uQn18e15BfSIpCiAgKCJ7XkF9fG9rLXphcHx7XkN9IiAuICJ7XkN9fC16YXArb2t8e15BfSIp CiAgKCJ3b3JrK1RPRE89XCJXQUlUSU5HXCJ8aG9tZStUT0RPPVwiV0FJVElOR1wiIiAuICJUT0RP PVwiV0FJVElOR1wiK2hvbWV8VE9ETz1cIldBSVRJTkdcIit3b3JrIikKICAoIndvcmstVE9ETz1c IldBSVRJTkdcInxob21lJlRPRE89XCJXQUlUSU5HXCIiIC4gIlRPRE89XCJXQUlUSU5HXCImaG9t ZXwtVE9ETz1cIldBSVRJTkdcIit3b3JrIikKICAoInphcCAtYmFyICAgK2ZvbyAmIExFVkVMID4g MiIgLiAiTEVWRUw+MiZmb28tYmFyK3phcCIpCiAgKCItemFwK2JhciB8IExFVkVMIDw9IDIgJiBU T0RPIDw+IFwiV0FJVFwiIiAuICJUT0RPPD5cIldBSVRcIiZMRVZFTDw9MnxiYXItemFwIikKICAo ImZvbytiYXIvVE9ETytXQUlULURPTkUiIC4gImJhcitmb28vVE9ETytXQUlULURPTkUiKQogICgi Zm9vK2Jhci8hVE9ETytXQUlUIiAuICJiYXIrZm9vLyFUT0RPK1dBSVQiKSkKCih0YWctdGVzdC1z dWl0ZSBtYXRjaC1yZXN1bHRzLTEKICAoIiIgLiB0KQogICgiQV9QUk9QPXteMHhbMC05QS1GXSt9 IgogICAob3JnLXN0cmluZy1tYXRjaD0KICAgIChvciAob3JnLWNhY2hlZC1lbnRyeS1nZXQgbmls ICJBX1BST1AiKSAiIikgIl4weFswLTlBLUZdKyIpKQogICgiQV9QUk9QPD57XltBLVpdK30iCiAg IChvcmctc3RyaW5nLW1hdGNoPD4KICAgIChvciAob3JnLWNhY2hlZC1lbnRyeS1nZXQgbmlsICJB X1BST1AiKSAiIikgIl5bQS1aXSsiKSkKICAoIihhK2ItY3xBX1BST1A9PTJ8LShkLWUrZiZMRVZF TD4zKSkiCiAgIChvcgogICAgKGFuZAogICAgIChtZW1iZXIgImEiIHRhZ3MtbGlzdCkKICAgICAo bWVtYmVyICJiIiB0YWdzLWxpc3QpCiAgICAgKG5vdCAobWVtYmVyICJjIiB0YWdzLWxpc3QpKSkK ICAgICg9IChzdHJpbmctdG8tbnVtYmVyIChvciAob3JnLWNhY2hlZC1lbnRyeS1nZXQgbmlsICJB X1BST1AiKSAiIikpIDIpCiAgICAobm90IChhbmQKICAgICAgICAgIChtZW1iZXIgImQiIHRhZ3Mt bGlzdCkKICAgICAgICAgIChub3QgKG1lbWJlciAiZSIgdGFncy1saXN0KSkKICAgICAgICAgICht ZW1iZXIgImYiIHRhZ3MtbGlzdCkKICAgICAgICAgICg+IGxldmVsIDMpKSkpKQogICgiKChjKSki IChtZW1iZXIgImMiIHRhZ3MtbGlzdCkpCiAgKCIoKC0oKCgtKGMpKSkpKSkiIChtZW1iZXIgImMi IHRhZ3MtbGlzdCkpCiAgKCIoKC0oLSgoLShjKSkpKSkpIiAobm90IChtZW1iZXIgImMiIHRhZ3Mt bGlzdCkpKQogICgiLSh6YXAgLWJhciAgICtmb28gJiBMRVZFTCA+IDIgfCBIRUFESU5HID09IHta e3szLDd9fX0pIgogICAobm90IChvciAoYW5kCiAgICAgICAgICAgICAobWVtYmVyICJ6YXAiIHRh Z3MtbGlzdCkKICAgICAgICAgICAgIChub3QgKG1lbWJlciAiYmFyIiB0YWdzLWxpc3QpKQogICAg ICAgICAgICAgKG1lbWJlciAiZm9vIiB0YWdzLWxpc3QpCiAgICAgICAgICAgICAoPiBsZXZlbCAy KSkKICAgICAgICAgICAgKG9yZy1zdHJpbmctbWF0Y2g9IChvciBoZWFkaW5nICIiKSAiWnszLDd9 IikpKSkKICAoInphcCAtYmFyICAgK2ZvbyAmIExFVkVMID4gMiIgCiAgIChhbmQgCiAgICAobWVt YmVyICJ6YXAiIHRhZ3MtbGlzdCkKICAgIChub3QgKG1lbWJlciAiYmFyIiB0YWdzLWxpc3QpKQog ICAgKG1lbWJlciAiZm9vIiB0YWdzLWxpc3QpCiAgICAoPiBsZXZlbCAyKSkpCiAgKCItemFwK2Jh ciB8IExFVkVMIDw9IDIgJiBUT0RPIDw+IFwiV0FJVFwiIiAKICAgKG9yCiAgICAoYW5kCiAgICAg KG5vdCAobWVtYmVyICJ6YXAiIHRhZ3MtbGlzdCkpCiAgICAgKG1lbWJlciAiYmFyIiB0YWdzLWxp c3QpKQogICAgKGFuZAogICAgICg8PSBsZXZlbCAyKQogICAgIChvcmctc3RyaW5nPD4gKG9yIHRv ZG8gIiIpICAiV0FJVCIpKSkpCiAgKCItKHphcHx7XkF9fExFVkVMPTIpIgogICAobm90IChvcgog ICAgICAgICAobWVtYmVyICJ6YXAiIHRhZ3MtbGlzdCkKICAgICAgICAgKG9yZy1tYXRjaC1hbnkt cCAiXkEiIHRhZ3MtbGlzdCkKICAgICAgICAgKD0gbGV2ZWwgMikpKSkKICAoIi8hVE9ETyIKICAg KGFuZAogICAgKG1lbWJlciB0b2RvIG9yZy1ub3QtZG9uZS1rZXl3b3JkcykKICAgIChhbmQgdCAo ZXF1YWwgdG9kbyAiVE9ETyIpKSkpCiAgKCIvVE9ETyIKICAgKGFuZCB0IChlcXVhbCB0b2RvICJU T0RPIikpKQogICgiLyEiCiAgIChhbmQgKG1lbWJlciB0b2RvIG9yZy1ub3QtZG9uZS1rZXl3b3Jk cykgdCkpCiAgKCJhYmMtdXZ3K3h5ei8hVE9ETyIKICAgKGFuZAogICAgKG1lbWJlciB0b2RvIG9y Zy1ub3QtZG9uZS1rZXl3b3JkcykKICAgIChhbmQKICAgICAocHJvZ24KICAgICAgIChzZXRxIG9y Zy1jYWNoZWQtcHJvcHMgbmlsKQogICAgICAgKGFuZAogICAgICAgIChtZW1iZXIgImFiYyIgdGFn cy1saXN0KQogICAgICAgIChub3QgKG1lbWJlciAidXZ3IiB0YWdzLWxpc3QpKQogICAgICAgICht ZW1iZXIgInh5eiIgdGFncy1saXN0KSkpCiAgICAgKGVxdWFsIHRvZG8gIlRPRE8iKSkpKQogICgi YWJjLXV2dyt4eXorTEVWRUw8PTMvVE9ET3xIT0xESU5HLVdBSVRJTkd8QVZPSURJTkctUkVBTExZ X0FWT0lESU5HIiAKICAgKGFuZAogICAgKHByb2duCiAgICAgIChzZXRxIG9yZy1jYWNoZWQtcHJv cHMgbmlsKQogICAgICAoYW5kCiAgICAgICAobWVtYmVyICJhYmMiIHRhZ3MtbGlzdCkKICAgICAg IChub3QgKG1lbWJlciAidXZ3IiB0YWdzLWxpc3QpKQogICAgICAgKG1lbWJlciAieHl6IiB0YWdz LWxpc3QpCiAgICAgICAoPD0gbGV2ZWwgMykpKQogICAgKG9yCiAgICAgKGFuZAogICAgICAobm90 IChlcXVhbCB0b2RvICJSRUFMTFlfQVZPSURJTkciKSkKICAgICAgKGVxdWFsIHRvZG8gIkFWT0lE SU5HIikpCiAgICAgKGFuZAogICAgICAobm90IChlcXVhbCB0b2RvICJXQUlUSU5HIikpCiAgICAg IChlcXVhbCB0b2RvICJIT0xESU5HIikpCiAgICAgKGVxdWFsIHRvZG8gIlRPRE8iKSkpKSkKCih0 YWctdGVzdC1zdWl0ZSBtYXRjaC1yZXN1bHRzLTIKICAoIigoYSArYiAtYyAmIExFVkVMID4gMiB8 IGMgJiBMRVZFTCA9PSAxKS0oSEVBRElORz17PE5PVEVTPn18VE9ETz1cIkRPTkVcIil8dXJnZW50 fF9xdWV1ZSZERUFETElORT5cIjwyMDEyLTAxLTAxIDA0OjAwPlwiKSIKICAgKG9yCiAgICAoYW5k CiAgICAgKG9yIChhbmQKICAgICAgICAgIChtZW1iZXIgImEiIHRhZ3MtbGlzdCkKICAgICAgICAg IChtZW1iZXIgImIiIHRhZ3MtbGlzdCkKICAgICAgICAgIChub3QgKG1lbWJlciAiYyIgdGFncy1s aXN0KSkKICAgICAgICAgICg+IGxldmVsIDIpKQogICAgICAgICAoYW5kCiAgICAgICAgICAobWVt YmVyICJjIiB0YWdzLWxpc3QpCiAgICAgICAgICAoPSBsZXZlbCAxKSkpCiAgICAgKG5vdAogICAg ICAob3IgKG9yZy1zdHJpbmctbWF0Y2g9IChvciBoZWFkaW5nICIiKSAiPE5PVEVTPiIpCiAgICAg ICAgICAoc3RyaW5nPSAob3IgdG9kbyAiIikgIkRPTkUiKSkpKQogICAgKG1lbWJlciAidXJnZW50 IiB0YWdzLWxpc3QpCiAgICAoYW5kCiAgICAgKG1lbWJlciAiX3F1ZXVlIiB0YWdzLWxpc3QpCiAg ICAgKG9yZy10aW1lPiAob3IgKG9yZy1jYWNoZWQtZW50cnktZ2V0IG5pbCAiREVBRExJTkUiKSAi IikgMTMyNTM5NDAwMC4wKSkpKQogICgiK3lvdSttZS10aGVtJlBSSU9SSVRZPT1cIkFcIitDQVRF R09SWTw+XCJtaXNzaW5nXCIiCiAgIChhbmQKICAgIChtZW1iZXIgInlvdSIgdGFncy1saXN0KQog ICAgKG1lbWJlciAibWUiIHRhZ3MtbGlzdCkKICAgIChub3QgKG1lbWJlciAidGhlbSIgdGFncy1s aXN0KSkKICAgIChzdHJpbmc9IChvciBwcmlvcml0eSAiIikgIkEiKQogICAgKG9yZy1zdHJpbmc8 PgogICAgIChvciAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAnb3JnLWNhdGVnb3J5KSAiIikg Im1pc3NpbmciKSkpCiAgKCIreW91K21lLXRoZW0gJiBQUklPUklUWSA9PSBcIkFcIiArIENBVEVH T1JZIDw+IFwibWlzc2luZ1wiIgogICAoYW5kCiAgICAobWVtYmVyICJ5b3UiIHRhZ3MtbGlzdCkK ICAgIChtZW1iZXIgIm1lIiB0YWdzLWxpc3QpCiAgICAobm90IChtZW1iZXIgInRoZW0iIHRhZ3Mt bGlzdCkpCiAgICAoc3RyaW5nPSAob3IgcHJpb3JpdHkgIiIpICJBIikKICAgIChvcmctc3RyaW5n PD4gKG9yIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdvcmctY2F0ZWdvcnkpICIiKSAibWlz c2luZyIpKSkKICAoIit5b3UrbWUtdGhlbSAmIFBSSU9SSVRZIDwgXCJBXCIgfCBDQVRFR09SWSA8 PiBcIm1pc3NpbmdcIiArIHVzIHwgSEVBRElORz17XFwoPzpbU3NdZWNyZXRcXCl7ezEsM319fSIK ICAgKG9yCiAgICAoYW5kCiAgICAgKG1lbWJlciAieW91IiB0YWdzLWxpc3QpCiAgICAgKG1lbWJl ciAibWUiIHRhZ3MtbGlzdCkKICAgICAobm90IChtZW1iZXIgInRoZW0iIHRhZ3MtbGlzdCkpCiAg ICAgKHN0cmluZzwgKG9yIHByaW9yaXR5ICIiKSAiQSIpKQogICAgKGFuZAogICAgIChvcmctc3Ry aW5nPD4gKG9yIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdvcmctY2F0ZWdvcnkpICIiKQog ICAgICAgICAgICAgICAgICAgIm1pc3NpbmciKQogICAgIChtZW1iZXIgInVzIiB0YWdzLWxpc3Qp KQogICAgKG9yZy1zdHJpbmctbWF0Y2g9IChvciBoZWFkaW5nICIiKSAiXFwoPzpbU3NdZWNyZXRc XCl7MSwzfSIpKSkKICAoIlBST1BcXC1XSVRIXFwtSFlQSEVOUz0yIgogICAoPQogICAgKHN0cmlu Zy10by1udW1iZXIKICAgICAob3IKICAgICAgKG9yZy1jYWNoZWQtZW50cnktZ2V0IG5pbCAiUFJP UC1XSVRILUhZUEhFTlMiKQogICAgICAiIikpCiAgICAyKSkKICAoIlBST1A9e15cXHMtKi8vIC4q JH0iCiAgIChvcmctc3RyaW5nLW1hdGNoPQogICAgKG9yIChvcmctY2FjaGVkLWVudHJ5LWdldCBu aWwgIlBST1AiKSAiIikKICAgICJeXFxzLSovLyAuKiQiKSkKICApCgoodGFnLXRlc3Qtc3VpdGUg c2hvdWxkLWVycm9yLTEKICAoIigpIiAuIGVycm9yKSA7IHdlIG1pZ2h0IGp1c3QgZG8gdCBoZXJl LCBidXQgdGhlIHBhcmVucyBzdWdnZXN0IGFuIGVycm9yCiAgKCIoJmZvbytMRVZFTD0xKSIgLiBl cnJvcikKICAoIihmb28rTEVWRUw9MSIgLiBlcnJvcikKICAoIihmb28rTEVWRUw9MSkpIiAuIGVy cm9yKQogICgiKGFiYyspIiAuIGVycm9yKQogICgiYWJjK3h5eiEiIC4gZXJyb3IpCiAgKCIobWlz c2luZytwYXJlbiIgLiBlcnJvcikgICAgICAgICAgICAKICAoIlBST1A9ey4qY2xvc2luZyBicmFj ZT8iIC4gZXJyb3IpIAogICgiUFJPUD1cImFiYyIgLiBlcnJvcikKICAoIlA8PDItYmFkK2NtcCtv cCIgLiBlcnJvcikKICAoIlA8PXteZm9vfSIgLiBlcnJvcikKICAoIlBST1A8LS5keCIgLiBlcnJv cikgICAgICAgICAgIDsgYmFkIG51bWJlcgogICgiUFJPUD17Xlxccy0qLy8gLiokfS9Be31CIiAu IGVycm9yKSA7IFNlZSBOb3RlIGggZm9yIHdoeSB0aGlzIHNob3VsZCByYWlzZSBhbiBlcnJvcgog ICgiIT87IiAuIGVycm9yKQogICgiICAgW3hdIiAuIGVycm9yKQogICkKCjs7OyBNaXNjZWxsYW5l b3VzIE90aGVyIHRlc3RzIC0tIHJlYWxseSBuZWVkIGEgY29tcGxldGUgZnJhbWV3b3JrIGhlcmUu CgooZGVmdW4gdGFnLXRlc3QtZmluZC10b2RvLXF1ZXJ5IChzKQogIChpZiAob3JnLWZpbmQtdG9k by1xdWVyeSBzKQogICAgICAodmVjdG9yIChzdWJzdHJpbmcgcyAwIChtYXRjaC1iZWdpbm5pbmcg MSkpCiAgICAgICAgICAgICAgKHN1YnN0cmluZyBzIChtYXRjaC1lbmQgMSkpCiAgICAgICAgICAg ICAgKG1hdGNoLWVuZCAyKQogICAgICAgICAgICAgICg9IChtYXRjaC1lbmQgMCkgKG1hdGNoLWVu ZCAxKSkpCiAgICAodmVjdG9yIHMgbmlsIG5pbCBuaWwpKSkKCihkZWZ1biB0YWctdGVzdC1hcHBy b3hpbWF0ZS10b2RvLWNoZWNrIChzKQogIChpZiAoc3RyaW5nLW1hdGNoICJcXCgvXFwoIVxcKT9c XHMtKlxcKVtee31cIl0qJCIgcykKICAgICAgKHZlY3RvciAoc3Vic3RyaW5nIHMgMCAobWF0Y2gt YmVnaW5uaW5nIDEpKQogICAgICAgICAgICAgIChzdWJzdHJpbmcgcyAobWF0Y2gtZW5kIDEpKQog ICAgICAgICAgICAgIChtYXRjaC1lbmQgMikKICAgICAgICAgICAgICAoPSAobWF0Y2gtZW5kIDAp IChtYXRjaC1lbmQgMSkpKQogICAgKHZlY3RvciBzIG5pbCBuaWwgbmlsKSkpCgooZGVmdW4gdHFz IChxKQogIChsZXQgKCh0b2RvLW9ubHkgbmlsKSkKICAgIChjZHIgKG9yZy1tYWtlLXRhZ3MtbWF0 Y2hlci1ORVcgcSkpKSkKCihkZWZ1biB0YWctdGVzdC1zY2FuIChzIHBvaW50LWxpc3QgJm9wdGlv bmFsIHN0YXktcHV0KQogIChwcm9nMQogICAgICAoaWYgKGF0b20gcG9pbnQtbGlzdCkKICAgICAg ICAgIChvcmctc2Nhbi10YWdzLU5FVyAncG9pbnQgKHRxcyBzKSBuaWwpCiAgICAgICAgKGNvbnMg KGVxdWFsIChvcmctc2Nhbi10YWdzLU5FVyAncG9pbnQgKHRxcyBzKSBuaWwpIHBvaW50LWxpc3Qp IHMpKQogICAgKHVubGVzcyBzdGF5LXB1dAogICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKSkp KQoKKGRlZnVuIHRhZy10ZXN0LXNjYW4tZG8tdGVzdHMgKHRlc3RzKQogIChsZXQgKChjb250ZW50 cwogICAgICAgICAiKiBbI0JdIEEgaGVhZGluZyBPbmUgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnh5ejoKKiogUHV0IGEgT25lIGhlcmUgdG9v IGF0IGxldmVsIFR3bwoqKiogQW5kIGEgbGV2ZWwgVGhyZWUsIGFsc28gT25lICAgCiogWyNDXSBC IGhlYWRpbmcgVHdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDp1dnc6CioqIEFub3RoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDphYmM6CiogWyNBXSBDIGhlYWRpbmcg VGhyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDp4eXo6CiogPE5PVEVTPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDp3dGY6CioqIE1vcmUgbW9yZSBtb3JlCioqKiBUT0RP IE9ud2FyZAoqKiogVE9ETyBVcHdhcmQKKioqIFdBVFQgV2hhdCBjb21lcyB1cC4uLgoqKiogRE9O RSBHbGlkaW5nIGhvbWUKKioqKiBKdXN0IGEgdGVzdCAgICAKKiBbI0FdIEQgaGVhZGluZyBGb3Vy ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnV2 dzoKKiBUT0RPIEUgaGVhZGluZyBGaXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDphYmM6dXZ3Onh5ejoKICBTQ0hFRFVMRUQ6IDwyMDEyLTA3LTMxIFR1ZT4K KiogQW5zd2VycwogICArIHh5ejogMSAzMTQgNjc2CiAgICsgeHl6LWFiYzogMSAzMTQgIAogICAr IFByaW9yaXR5IEE6IDMxNCA1OTUKICAgKyBQcmlvcml0eSBub3QgZW1wdHk6IDEgMTUyIDMxNCA1 OTUKICAgKyBQcmlvcml0eSBlbXB0eSwgTGV2ZWwgMTogMzk1IDY3NgogICArIFNjaGVkdWxlZCBh ZnRlciA8MjAxMi0wNy0wMSAwMDowMD46IDY3NgogICArIFRPRE89XCJUT0RPXCI6IDQ5NCA1MTAg Njc2CiAgICsgVE9ETz1cIlRPRE9cIiwgTGV2ZWw+MTogNDk0IDUxMAogICArIEhFQURJTkc9ezwu Kj59OiAzOTUKICAgKyBIRUFESU5HPXtPbmVcXHxUd299LCBMZXZlbCA8PSAyOiAxIDgyIDE1Mgoi KSkKICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUg J29yZy10YWdzLWNvbHVtbikgLTgwKQogICAgICAob3JnLW1vZGUpCiAgICAgIChpbnNlcnQgY29u dGVudHMpCiAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiAgICAgIChtYXBjYXIKICAgICAg IChsYW1iZGEgKHYpICh0YWctdGVzdC1zY2FuIChjYXIgdikgKGNkciB2KSkpCiAgICAgICB0ZXN0 cykpKSkKCihkZWZ1biB0YWctdGVzdC1vdGhlci10ZXN0cyAoKQogIChsaXN0CiAgIDs7IFRlc3Rp bmcgdGhlIG9yZy1maW5kLXRvZG8tcXVlcnkgZnVuY3Rpb24KICAgKG1hcGNhcgogICAgKGxhbWJk YSAocy1hKQogICAgICAoY29ucwogICAgICAgKGVxdWFsICh0YWctdGVzdC1maW5kLXRvZG8tcXVl cnkgKGNhciBzLWEpKSAoY2FkciBzLWEpKQogICAgICAgKGNhciBzLWEpKSkgCiAgICAnKCgiZm9v K2Jhci9BLUIrQyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vK2JhciIgIkEtQitD IiBuaWwgbmlsXSkKICAgICAgKCJmb28rYmFyLyIgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgWyJmb28rYmFyIiAiIiBuaWwgdF0pCiAgICAgICgiZm9vK2Jhci8gICAgICAgICAiICAg ICAgICAgICAgICAgICAgICAgICAgIFsiZm9vK2JhciIgIiIgbmlsIHRdKQogICAgICAoImZvbyti YXIvICAgICAgICAgYSIgICAgICAgICAgICAgICAgICAgICAgICBbImZvbytiYXIiICJhIiBuaWwg bmlsXSkKICAgICAgKCJmb28rYmFyLyFBLUIrQyIgICAgICAgICAgICAgICAgICAgICAgICAgICAg WyJmb28rYmFyIiAiQS1CK0MiIDkgbmlsXSkKICAgICAgKCJmb28rYmFyLyEiICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgWyJmb28rYmFyIiAiIiA5IHRdKQogICAgICAoImZvbytiYXIv ISAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBbImZvbytiYXIiICIiIDkgdF0pCiAg ICAgICgiZm9vK2Jhci8hICAgICAgICAgYSIgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vK2Jh ciIgImEiIDkgbmlsXSkKICAgICAgKCJQUk9QPXteXFxzLSovLyAuKiR9IiAgICAgICAgICAgICAg ICAgICAgICAgWyJQUk9QPXteXFxzLSovLyAuKiR9IiBuaWwgbmlsIG5pbF0pCiAgICAgICgiUFJP UD17Xlxccy0qLy8gLiokfStBPVwiLyFBLUJcIi8hQS1CIiAgICAgIFsiUFJPUD17Xlxccy0qLy8g LiokfStBPVwiLyFBLUJcIiIgIkEtQiIgMzAgbmlsXSkKICAgICAgKCJQUk9QPXteXFxzLSovLyAu KiR9K0E9XCIvIUEtQlwiLyEgICAgICAgICIgWyJQUk9QPXteXFxzLSovLyAuKiR9K0E9XCIvIUEt QlwiIiAiIiAzMCB0XSkpKQogICA7OyBUZXN0aW5nIHRoYXQgdGhlIHRvZG8gcXVlcmllcyB3b3Jr IHdpdGggdGhlIGV4aXN0aW5nIHN0cmluZy1tYXRjaAogICAobWFwY2FyCiAgICAobGFtYmRhIChz LWEpCiAgICAgIChjb25zCiAgICAgICAoZXF1YWwgKHRhZy10ZXN0LWFwcHJveGltYXRlLXRvZG8t Y2hlY2sgKGNhciBzLWEpKSAoY2FkciBzLWEpKQogICAgICAgKGNhciBzLWEpKSkgCiAgICAnKCgi Zm9vK2Jhci9BLUIrQyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vK2JhciIgIkEt QitDIiBuaWwgbmlsXSkKICAgICAgKCJmb28rYmFyLyIgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgWyJmb28rYmFyIiAiIiBuaWwgdF0pCiAgICAgICgiZm9vK2Jhci8gICAgICAgICAi ICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vK2JhciIgIiIgbmlsIHRdKQogICAgICAoImZv bytiYXIvICAgICAgICAgYSIgICAgICAgICAgICAgICAgICAgICAgICBbImZvbytiYXIiICJhIiBu aWwgbmlsXSkKICAgICAgKCJmb28rYmFyLyFBLUIrQyIgICAgICAgICAgICAgICAgICAgICAgICAg ICAgWyJmb28rYmFyIiAiQS1CK0MiIDkgbmlsXSkKICAgICAgKCJmb28rYmFyLyEiICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgWyJmb28rYmFyIiAiIiA5IHRdKQogICAgICAoImZvbyti YXIvISAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBbImZvbytiYXIiICIiIDkgdF0p CiAgICAgICgiZm9vK2Jhci8hICAgICAgICAgYSIgICAgICAgICAgICAgICAgICAgICAgIFsiZm9v K2JhciIgImEiIDkgbmlsXSkKICAgICAgKCJQUk9QPXteXFxzLSovLyAuKiR9IiAgICAgICAgICAg ICAgICAgICAgICAgWyJQUk9QPXteXFxzLSovLyAuKiR9IiBuaWwgbmlsIG5pbF0pCiAgICAgICgi UFJPUD17Xlxccy0qLy8gLiokfStBPVwiLyFBLUJcIi8hQS1CIiAgICAgIFsiUFJPUD17Xlxccy0q Ly8gLiokfStBPVwiLyFBLUJcIiIgIkEtQiIgMzAgbmlsXSkKICAgICAgKCJQUk9QPXteXFxzLSov LyAuKiR9K0E9XCIvIUEtQlwiLyEgICAgICAgICIgWyJQUk9QPXteXFxzLSovLyAuKiR9K0E9XCIv IUEtQlwiIiAiIiAzMCB0XSkpKQogICA7OyBUZXN0aW5nIHRoYXQgdGhlIG1hdGNoZXJzIHdvcmsg d2l0aCBvcmctc2Nhbi10YWdzCiAgIChsZXQgKChzY2FuLXRlc3RzICcoKCJ4eXorTEVWRUw9MSIg MSAzMTQgNjc2KQogICAgICAgICAgICAgICAgICAgICAgICgieHl6LWFiYytMRVZFTD0xIiAxIDMx NCkKICAgICAgICAgICAgICAgICAgICAgICAoInh5eiIgMSA4MiAxMTcgMzE0IDY3NiA3ODcpCiAg ICAgICAgICAgICAgICAgICAgICAgKCJ4eXotYWJjIiAxIDgyIDExNyAzMTQpCiAgICAgICAgICAg ICAgICAgICAgICAgKCJIRUFESU5HPXs8Lio+fSIgMzk1KQogICAgICAgICAgICAgICAgICAgICAg ICgiSEVBRElORz17T25lXFx8VHdvfSAmIExFVkVMIDw9IDIiIDEgODIgMTUyKQogICAgICAgICAg ICAgICAgICAgICAgICgiUFJJT1JJVFk9XCJBXCIiIDMxNCA1OTUpCiAgICAgICAgICAgICAgICAg ICAgICAgKCJQUklPUklUWTw+XCJcIiIgMSAxNTIgMzE0IDU5NSkKICAgICAgICAgICAgICAgICAg ICAgICAoIlBSSU9SSVRZPVwiXCIgKyBMRVZFTCA9PSAxIiAzOTUgNjc2KQogICAgICAgICAgICAg ICAgICAgICAgICgiU0NIRURVTEVEPj1cIjwyMDEyLTA3LTAxIDAwOjAwPlwiIiA2NzYpCiAgICAg ICAgICAgICAgICAgICAgICAgKCJUT0RPPVwiVE9ET1wiIiA0OTQgNTEwIDY3NikKICAgICAgICAg ICAgICAgICAgICAgICAoIlRPRE89XCJUT0RPXCIgICYgTEVWRUwgPiAxIiA0OTQgNTEwKSkpKQog ICAgICh0YWctdGVzdC1zY2FuLWRvLXRlc3RzIHNjYW4tdGVzdHMpKSkpCgo= --f46d042fdc1ed5fe9004c66be874--