Re: problems with try-ark

Will Partain <[email protected]> Sat, 24 Jan 2004 13:34:50 +0000
Newsgroups gmane.comp.sysutils.ark.devel
Message-ID <[email protected]>
--=-=-=

Edward Moy provided a truly excellent problem report on
Thursday, the details of which we'll get to shortly...

The general issue we're dealing with here is that there's
just *no telling* what combination of Python and XML support
a (try-)ARK'ing site will have.

Traditionally, the core ARK people have used a reasonably
modern Python with a recent-ish PyXML "module" added on.
(Why? Because in the early days, nothing else really
worked.)  Latterly, we have claimed to support a plain old
Python out of the box -- because it includes a not-too-bad
"minidom" XML thing, and ARK has v modest XMLing needs.

But whether a plain old minidom'ing Python will really work
depends on whether it's got an expat parser wired into it.
Somewhat bizarrely, if you build Python and it doesn't find
an expat library, it will (*SILENTLY*) build you a minidom
thing anyway -- and it will be totally useless to man or
beast.

The code for 'read' in ARK/arkbase/ark/xmlfile.py *tries* to
account for these various possibilities, and to provide the
rest of ARK with an interface blissfully untroubled by the
vagaries of Python implementations.  Sadly, if it fails,
your first encounter with the ARK code base will be a scary
one :-(

The Moy Report reflects bit rot in the xmlfile.py code for
the minidom-with-a-decent-expat case.  I attach a copy with
my initial fixes in it.  (I'll run with this a while before
checking it in.)  OK, a few specific things...

> ... Looks like it is because comments are being handled
> differently in Python 2.3.x:

As I say, I think it's a minidom vs PyXML thing, not a
version thing.

> Panic: sigh: element <#comment> is bogus
>
> so I changed the line in _process_subfields() to:
>
>      elif hname == 'comment' or hname == '#comment':

That confuses an <!-- XML comment --> with an <comment>ARK
comment</comment>, not that it matters a lot.

> Seems that some of the <code> sections in sidai/package/ALL.xml use
> CDATA, and _process_code() is unhappy:

I tried to handle this by munging things in one place (a
little local routine, is_textly).

Anyway, you can see what I did; and I'll keep running it,
and check it in soon.  Thanks again for a very fine report.

Will


--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=xmlfile.py
Content-Transfer-Encoding: base64
Content-Description: hacked ARK/arkbase/ark/xmlfile.py

IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAKIyBD
b3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBXaWxsIFBhcnRhaW4KIyAKIyBUaGlzIHByb2dyYW0g
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm
eQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgojIAojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQoj
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgCiMgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2Ft
YnJpZGdlLCBNQSAwMjEzOSwgVVNBLgojIAojIE5hbWUgICA6IHhtbGZpbGUucHkKIyBBdXRo
b3IgOiBXaWxsIFBhcnRhaW4gPHBhcnRhaW5AZGNzLmdsYS5hYy51az4KIyAKIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjCl9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogMS4zMyAkIlsxMTot
Ml0KX19kb2NfXyA9ICIiIgphcmsueG1sZmlsZSBtb2R1bGUsIHZlcnNpb24gJXMKCkFSSyBY
TUwgZmlsZXM6IHJlYWRpbmcsIHBhcnNpbmcKIiIiICUgKF9fdmVyc2lvbl9fKQoKaW1wb3J0
IGNQaWNrbGUsb3Msc3RhdCxzdHJpbmcsc3lzLHRpbWUKaW1wb3J0IGFyay5lcnJvcgppbXBv
cnQgYXJrLnRlYW0KaW1wb3J0IGFyay51dGlscwoKIyA9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTaW5nbGV0b24g
cGF0dGVybiAoc2VlCiMgaHR0cDovL3Rvci5kaHMub3JnL356ZXBoeXJmYWxjb24vc25pcHBl
dHMvc291cmNlLzMxNS5weSkKCmRlZiBBcmtYbWxGaWxlTWdyKCk6CiAgICBpZiBfQXJrWG1s
RmlsZU1nci5pbnN0YW5jZSA9PSBOb25lOgoJX0Fya1htbEZpbGVNZ3IuaW5zdGFuY2UgPSBf
QXJrWG1sRmlsZU1ncigpCiAgICByZXR1cm4gX0Fya1htbEZpbGVNZ3IuaW5zdGFuY2UKCmNs
YXNzIF9BcmtYbWxGaWxlTWdyOgogICAgIiIiCiAgICBNYW5hZ2VzIGFsbCB0aGUgWE1MIGZp
bGVzIChmb3IgYWxsIHRlYW1zKSBhdCBvbmUgc2l0ZS4KICAgICIiIgogICAgaW5zdGFuY2Ug
PSBOb25lICMgdG8gZG8gdGhlIHNpbmdsZXRvbiB0aGluZy4uLgoKICAgIF94bWxmX2NhY2hl
ICAgICAgID0ge30KICAgIF94bWxmX2NhY2hlX3RpbWVzID0ge30KCiAgICAjIGRlZiBfX2lu
aXRfXyhzZWxmKTogcGFzcwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRlZiBsb29rdXAoc2VsZix0ZWFt
LGVudHR5cGUsZW50bmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0
aGUgc3BlY2lmaWVkIFhNTCBmaWxlIiIiCiAgICAgICAga2V5ID0gKHRlYW0sZW50dHlwZSxl
bnRuYW1lKQoKICAgICAgICBjdXJyX3RpbWUgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAg
dHJ5OgogICAgICAgICAgICBjYWNoZV90aW1lID0gc2VsZi5feG1sZl9jYWNoZV90aW1lc1tr
ZXldCiAgICAgICAgICAgIGlmIGN1cnJfdGltZSA8PSBjYWNoZV90aW1lICsgNjAwOiAjIFRv
RG86IHBhcmFtZXRlcml6ZSB0aGUgNjAwPwogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3htbGZfY2FjaGVba2V5XSAjICp0aGF0KiB3YXMgZWFzeS4uLgogICAgICAgICAgICBlbGlm
IGFyay5jb250cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5DQUNISU5HKToK
ICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ2ZpbGUgY2FjaGUgZXhwaXJlZCBm
b3IgJXNcbicgJShga2V5YCkpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiBwYXNzCgogICAg
ICAgICMgYWgsIGJldHRlciBzdGFydCBzbHVycGluZy4uLgogICAgICAgICNwcmludCAneG1s
ZiBsb29rdXA6JywgdGVhbSwgZW50dHlwZSwgZW50bmFtZTsKCiAgICAgICAgeG1sZiA9IEFy
a1htbEZpbGUodGVhbSxlbnR0eXBlLGVudG5hbWUpCiAgICAgICAgc3R1ZmYgPSB4bWxmLnJl
YWQoKQoKICAgICAgICBzZWxmLl94bWxmX2NhY2hlW2tleV0gICAgICAgPSBzdHVmZiAjIGZv
ciBwb3N0ZXJpdHkuLi4KICAgICAgICBzZWxmLl94bWxmX2NhY2hlX3RpbWVzW2tleV0gPSBj
dXJyX3RpbWUKICAgICAgICByZXR1cm4gc3R1ZmYKCiMgPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEFya1ht
bEZpbGU6CiAgICAiIiIKICAgIEFuIEFSSyB4bWwgZmlsZQogICAgIiIiCiAgICAjIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAgICBkZWYgX19pbml0X18oc2VsZix0ZWFtX2lkLGVudHR5cGUsZW50bmFtZSk6CiAgICAg
ICAgYXNzZXJ0KGVudG5hbWUgIT0gJycpCiAgICAgICAgc2VsZi5fdGVhbV9pZCA9IHRlYW1f
aWQKICAgICAgICBzZWxmLl90eXBlICAgID0gZW50dHlwZQogICAgICAgIHNlbGYuX25hbWUg
ICAgPSBlbnRuYW1lCiAgICAgICAgI3ByaW50ICdBcmtYbWxGaWxlOicsdGVhbV9pZCxlbnR0
eXBlLGVudG5hbWUKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgcmVhZChzZWxmLGV4cGxpY2l0X2Zp
bGVuYW1lPU5vbmUpOgogICAgICAgICIiIgoJPz8/PwogICAgICAgICIiIgogICAgICAgIGlm
IGV4cGxpY2l0X2ZpbGVuYW1lOgogICAgICAgICAgICBmaWxlbmFtZSA9IGV4cGxpY2l0X2Zp
bGVuYW1lCiAgICAgICAgZWxpZiBzZWxmLl90eXBlID09ICd0ZWFtJzoKICAgICAgICAgICAg
ZmlsZW5hbWUgPSAnJXMvdGVhbS54bWwnICUgKGFyay50ZWFtLkFDVElOR19URUFNKCkucmVw
b3NpdG9yeShzZWxmLl90ZWFtX2lkKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxl
bmFtZSA9ICclcy8lcy8lcy54bWwnICUgKGFyay50ZWFtLkFDVElOR19URUFNKCkucmVwb3Np
dG9yeShzZWxmLl90ZWFtX2lkKSwgc2VsZi5fdHlwZSwgc2VsZi5fbmFtZSkKCiAgICAgICAg
aWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmFpc2UgYXJr
LmVycm9yLk5vU3VjaFRoaW5nLCAnJXMgJXMnICUgKHNlbGYuX3R5cGUsIGZpbGVuYW1lKQoK
ICAgICAgICAjIGhlcmUsIHdlIGxvb2sgZm9yIGEgLnhtbGEgImNvbXBpbGVkIiBlcXVpdjoK
ICAgICAgICBmaWxlbmFtZV9hID0gZmlsZW5hbWUgKyAnYScKCiAgICAgICAgaWYgb3MucGF0
aC5leGlzdHMoZmlsZW5hbWVfYSk6CiAgICAgICAgICAgIHRpbWVzdGFtcCAgID0gb3Muc3Rh
dChmaWxlbmFtZSlbc3RhdC5TVF9NVElNRV0KICAgICAgICAgICAgdGltZXN0YW1wX2EgPSBv
cy5zdGF0KGZpbGVuYW1lX2EpW3N0YXQuU1RfTVRJTUVdCiAgICAgICAgICAgIGlmIHRpbWVz
dGFtcF9hID09IHRpbWVzdGFtcDogIyBob29yYXksIGdvdCBvbmUhCgkJdHJ5OgogICAgICAg
ICAgICAgICAgICAgIChpc19wcm90b3R5cGUsIHhtbF92ZXJzaW9uLCBmaWVsZHMpID0gXAog
ICAgICAgICAgICAgICAgICAgICAgICBjUGlja2xlLmxvYWQob3BlbihmaWxlbmFtZV9hLCdy
YicpKQoJCSAgICAjcHJpbnQgJ3BpY2tsZWQ6Jyxgc3R1ZmZgCgkJICAgIGlmIGFyay5jb250
cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5QQVJTSU5HKToKCQkJc3lzLnN0
ZGVyci53cml0ZSgncmVhZCBjb21waWxlZDogJXNcbicgJSBmaWxlbmFtZSkKCQkgICAgcmV0
dXJuIChpc19wcm90b3R5cGUsIHhtbF92ZXJzaW9uLCBmaWVsZHMpCgkJZXhjZXB0OgoJCSAg
ICAjIFNraXAgaXQgaWYgd2UgY2FuJ3QgbG9hZCB0aGUgYmluYXJ5IHZlcnNpb24KCQkgICAg
aWYgYXJrLmNvbnRyb2wuQXJrQ29udHJvbCgpLmRlYnVnKGFyay5jb250cm9sLlBBUlNJTkcp
OgoJCQlzeXMuc3RkZXJyLndyaXRlKCdpZ25vcmluZyAoY29ycnVwdD8pIGNvbXBpbGVkOiAl
c1xuJwoJCQkJCSAlIGZpbGVuYW1lKQoJCSAgICBwYXNzCgogICAgICAgICMgT2ggd2VsbCwg
bm8gY29tcGlsZWQgZXF1aXY6IGRvIGl0IHRoZSBoYXJkIHdheS4KCSMgV2UgcmVjb3JkIHRo
ZSBjb21waWxlZCBzdHVmZiBiZWZvcmUgd2UgcmV0dXJuIChiZWxvdykuCgogICAgICAgIGlm
IGFyay5jb250cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5QQVJTSU5HKToK
ICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgncGFyc2luZzogJXMnICUgZmlsZW5hbWUp
CgogICAgICAgICMgT0ssIHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGZpZ3VyZSBvdXQgaG93
IHRvIHBhcnNlIFhNTCBmaWxlcwogICAgICAgICMgc2luY2UgdGhlIHhtbC52ZXJzaW9uX2lu
Zm8gdmFyaWFibGUgaXMgbm90IGEgcmVsaWFibGUgaW5kaWNhdG9yLgoJdHJ5OgoJICAgICMg
VHJ5IGZvciBhIFB5WE1MIGltcGxlbWVudGF0aW9uIGZpcnN0LCBzdGFydGluZyB3aXRoCgkg
ICAgIyB0aGUgbmV3LXN0eWxlIFB5WE1MIGZpcnN0ICg+PSAwLjUuNik6CgkgICAgaW1wb3J0
IHhtbC5kb20uZXh0LnJlYWRlci5TYXgKCSAgICBkb2MgPSB4bWwuZG9tLmV4dC5yZWFkZXIu
U2F4LkZyb21YbWxTdHJlYW0ob3BlbihmaWxlbmFtZSkpCgkgICAgaWYgYXJrLmNvbnRyb2wu
QXJrQ29udHJvbCgpLmRlYnVnKGFyay5jb250cm9sLlBBUlNJTkcpOgoJCXN5cy5zdGRlcnIu
d3JpdGUoJyAobmV3IFB5WE1MKVxuJykKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAg
ICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgTm8gbHVjayB0aGVyZSwgc28gdHJ5
IHRoZSBvbGQtc3R5bGUgUHlYTUwgKHByb2JhYmx5CiAgICAgICAgICAgICAgICAjIDAuNS41
LjEpOgogICAgICAgICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQogICAgICAgICAgICAg
ICAgaW1wb3J0IHhtbC5kb20udXRpbHMKICAgICAgICAgICAgICAgIGRvYyAgPSB4bWwuZG9t
LnV0aWxzLkZpbGVSZWFkZXIoKS5yZWFkRmlsZShmaWxlbmFtZSkKCQlpZiBhcmsuY29udHJv
bC5BcmtDb250cm9sKCkuZGVidWcoYXJrLmNvbnRyb2wuUEFSU0lORyk6CgkJICAgIHN5cy5z
dGRlcnIud3JpdGUoJyAob2xkIFB5WE1MKVxuJykKCSAgICBleGNlcHQgSW1wb3J0RXJyb3I6
CgkJIyBMYXN0IGRpdGNoLCBkbyB3ZSBoYXZlIGEgbW9kZXJuIFB5dGhvbiAoPj0gMi4wKSB3
aXRoCiAgICAgICAgICAgICAgICAjIGEgbWluaWRvbSBpbXBsZW1lbnRhdGlvbjoKCQlpbXBv
cnQgeG1sLmRvbS5taW5pZG9tCgkJZG9jID0geG1sLmRvbS5taW5pZG9tLnBhcnNlKCBvcGVu
KGZpbGVuYW1lKSApCgkJaWYgYXJrLmNvbnRyb2wuQXJrQ29udHJvbCgpLmRlYnVnKGFyay5j
b250cm9sLlBBUlNJTkcpOgoJCSAgICBzeXMuc3RkZXJyLndyaXRlKCcgKG1pbmlkb20pXG4n
KQoKCXJvb3RfZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKCXRyeToKCSAgICByb290X2Vs
ZW0ubm9ybWFsaXplKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAg
ICAgICMgQmFoISBjcmFwcHkgUHl0aG9uIDIuMCBtaW5pZG9tLiBVc2Ugb3VyIG93biBub3Jt
YWxpc2VyOgogICAgICAgICAgICBhcmsudXRpbHMubm9ybWFsaXplRE9NKCByb290X2VsZW0g
KQoKICAgICAgICAjIFdlIGhhZCBiZXR0ZXIgaGF2ZSBqdXN0IHJlYWQgdGhlIHJpZ2h0IGtp
bmQgb2YgdGhpbmc6CiAgICAgICAgaWYgcm9vdF9lbGVtLm5vZGVOYW1lICE9IHNlbGYuX3R5
cGU6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImRvYyB0eXBl
ICVzIGFuZCBkb2MgJXMgZG9uJ3QgbWF0Y2giJShzZWxmLl90eXBlLHJvb3RfZWxlbS5ub2Rl
TmFtZSkKICAgICAgICAjIFRoZSByb290IGVsZW1lbnQgbXVzdCBoYXZlIG9uZSBhdHRyaWJ1
dGUgLS0gIm5hbWUiIC0tCiAgICAgICAgIyBhbmQgaXQgbXVzdCBtYXRjaCB0aGUgbmFtZSBn
aXZlbjoKICAgICAgICAocm9vdF9uYW1lLHJvb3RfeG1sX3ZlcnNpb24saXNfcHJvdG90eXBl
KSA9IHR3b19vcl90aHJlZV9hdHRyaWJ1dGVzKHJvb3RfZWxlbSwnbmFtZScsJ3htbC12ZXJz
aW9uJywncHJvdG90eXBlJykKICAgICAgICB4bWxfdmVyc2lvbiA9IGludChyb290X3htbF92
ZXJzaW9uKQogICAgICAgIGlmIHJvb3RfbmFtZSAhPSBzZWxmLl9uYW1lOgogICAgICAgICAg
ICByYWlzZSBhcmsuZXJyb3IuRmlsZW5hbWVNaXNtYXRjaCwiZG9jIG5hbWU9XCIlc1wiIGRv
ZXMgbm90IG1hdGNoIGZpbGVuYW1lIGAlcyciICUgKHJvb3RfbmFtZSxzZWxmLl9uYW1lKQog
ICAgICAgIGlmIGlzX3Byb3RvdHlwZSAhPSBOb25lOgogICAgICAgICAgICAjIG11c3QgYmUg
eWVzIG9yIG5vCiAgICAgICAgICAgIGlmIGlzX3Byb3RvdHlwZSA9PSAneWVzJzoKICAgICAg
ICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBpc19wcm90b3R5cGUgPT0gJ25vJzoK
ICAgICAgICAgICAgICAgIGlzX3Byb3RvdHlwZSA9IE5vbmUKICAgICAgICAgICAgZWxzZToK
ICAgICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImRvYyBwcm90
b3R5cGU9XCIlc1wiIGlzIG5vdCB5ZXMgb3Igbm8iICUgKGlzX3Byb3RvdHlwZSkKCiAgICAg
ICAgIyBub3cgd2UgZGVhbCB3aXRoIGFsbCB0aGUgY2hpbGQgbm9kZXM6CiAgICAgICAgZmll
bGRzID0ge30KCWZvciBjaGlsZCBpbiBub250cml2aWFsKHJvb3RfZWxlbS5jaGlsZE5vZGVz
KToKICAgICAgICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCgogICAgICAgICAgICBpZiBjaGls
ZC5ub2RlTmFtZSA9PSAncHJvdG90eXBlcyc6CiAgICAgICAgICAgICAgICBmbmFtZSA9ICdw
cm90b3R5cGVzJwogICAgICAgICAgICAgICAgZnZhbCAgPSBfcmVhZF9wcm90b3R5cGVzKCBz
ZWxmLl90eXBlLCBjaGlsZCwgZmlsZW5hbWUgKQoKICAgICAgICAgICAgZWxpZiBjaGlsZC5u
b2RlTmFtZSA9PSAncHJvdG90eXBlJzogIyBhdm9pZCBzb21lIHR5cG9zLi4uCiAgICAgICAg
ICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJjYW4ndCBoYXZlIGZpZWxk
IG5hbWVkIDxwcm90b3R5cGU+ICh0eXBvPykiCgogICAgICAgICAgICBlbHNlOgogICAgICAg
ICAgICAgICAgKGZuYW1lLCBmdmFsKSA9IF9yZWFkX2Nvb2tlZF9yZXNvdXJjZSggY2hpbGQs
IGZpbGVuYW1lICkKCgkgICAgI3ByaW50ICdmaWVsZCBgJXNcJzogJXMnICUgKGZuYW1lLCBm
dmFsKQogICAgICAgICAgICBpZiBub3QgZmllbGRzLmhhc19rZXkoZm5hbWUpOiBmaWVsZHNb
Zm5hbWVdID0gW10KICAgICAgICAgICAgZmllbGRzW2ZuYW1lXS5hcHBlbmQoZnZhbCkKCiAg
ICAgICAgdG9fcmV0dXJuID0gKGlzX3Byb3RvdHlwZSwgeG1sX3ZlcnNpb24sIGZpZWxkcykK
ICAgICAgICAjcHJpbnQgJ2ZpZWxkczonLGZpZWxkcwoKICAgICAgICAjIHBpY2tsZSB3aGF0
IHdlJ3ZlIGdvdCwgZm9yIG5leHQgdGltZToKICAgICAgICAjIChpdCdzIE9LIHRvIGZhaWwp
Cgl0cnk6CgkgICAgY1BpY2tsZS5kdW1wKHRvX3JldHVybixvcGVuKGZpbGVuYW1lX2EsJ3di
JyksMSkKCSAgICB0aW1lc3RhbXAgPSBvcy5zdGF0KGZpbGVuYW1lKVtzdGF0LlNUX01USU1F
XQoJICAgIG9zLnV0aW1lKGZpbGVuYW1lX2EsKHRpbWVzdGFtcCx0aW1lc3RhbXApKQoJZXhj
ZXB0OgoJICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIHRvX3JldHVybgoKICAgICMgLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
ICAgICMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEFya1htbEZpbGVG
aWVsZDoKICAgICIiIgogICAgQSByZXNvdXJjZSBmaWVsZCBmcm9tIGFuIFhNTCBmaWxlLgog
ICAgIiIiCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX19pbml0X18oc2VsZix2YWwsdHlwZT1Ob25l
LGZpbGVuYW1lPSc/Pz8nKToKICAgICAgICAiIiIKCSIiIgogICAgICAgIHNlbGYuZmlsZW5h
bWUgICAgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuY29uc3RyYWludHMgPSBbXQogICAgICAg
IHNlbGYuY29tbWVudCAgICAgPSBOb25lCiAgICAgICAgc2VsZi5wYXJhbXMgICAgICA9IFtd
CgogICAgICAgICMgaWYgdHlwZS92YWwgYXJlIHNldCwgaXQncyBzbyB3ZSBjYW4gcXVpY2ts
eSBnZXQKCSMgYSBzaW1wbGUgdmFsdWUgaW4gaGVyZSwgd2l0aG91dCBmdXJ0aGVyIGZ1c3Mu
CiAgICAgICAgc2VsZi52YWx0eXBlID0gdHlwZQogICAgICAgIGlmIHR5cGUgIT0gTm9uZToK
ICAgICAgICAgICAgc2VsZi52YWx1ZSAgICA9IHZhbAogICAgICAgICAgICBzZWxmLnZhbHBy
b3BzID0ge30KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAg
aWYgc2VsZi52YWx0eXBlICE9IE5vbmU6CiAgICAgICAgICAgIHJldHVybignJXM6OiVzICMg
JXMsICVzJyAlIChzZWxmLnZhbHR5cGUsIHNlbGYudmFsdWUsIHNlbGYudmFscHJvcHMsIHNl
bGYuZmlsZW5hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAncGFydGlh
bCB4bWwgZmllbGQnCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQpkZWYgbm9udHJpdmlhbChub2Rlcyk6CiAgICBy
ZXR1cm4gZmlsdGVyKGxhbWJkYSBuOiBub3QgX2lzRW1wdHlUZXh0Tm9kZShuKSxub2RlcykK
CiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KZGVmIG5vdFRleHROb2RlKG5vZGUpOgojICAgIHRyeTogIyBweXRob24gMgog
ICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gW25vZGUuVEVYVF9OT0RFLCBub2RlLkNEQVRB
X1NFQ1RJT05fTk9ERV06CiAgICAgICAgcmV0dXJuCiMgICAgZXhjZXB0IEF0dHJpYnV0ZUVy
cm9yOgojICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAgICAgIGlmIG5vZGUubm9k
ZVR5cGUgIT0geG1sLmRvbS5jb3JlLlRFWFRfTk9ERTogcmV0dXJuCiAgICByYWlzZSBhcmsu
ZXJyb3IuR2VuZXJhbFBhbmljLCJ0ZXh0IGNvbnRlbnQgd2hlcmUgbm90IGFsbG93ZWQ6ICVz
IiAlIG5vZGUubm9kZVZhbHVlCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfaXNFbXB0eVRleHROb2RlKG5vZGUp
OgogICAgIiIiCiAgICBJZiBpdCBpcyBhbiBlbXB0eSB0ZXh0IG5vZGUsIHJldHVybiAxCiAg
ICBPSyBpZiBpdCdzIG5vdCBhIHRleHQgbm9kZSAocmV0dXJuIDApCiAgICBUaHJvdyBhbiBl
eGNlcHRpb24gaWYgaXQgaXMgYSBub24tZW1wdHkgdGV4dCBub2RlLgogICAgIiIiCiMgICAg
IHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSAhPSBub2RlLlRF
WFRfTk9ERTogcmV0dXJuIDAKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAg
ICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSAhPSB4
bWwuZG9tLmNvcmUuVEVYVF9OT0RFOiByZXR1cm4gMAoKICAgIGlmIG5vZGUubm9kZVR5cGUg
bm90IGluIFtub2RlLlRFWFRfTk9ERSwgbm9kZS5DREFUQV9TRUNUSU9OX05PREVdOgogICAg
ICAgIHJldHVybiAwCgogICAgaWYgc3RyaW5nLnN0cmlwKG5vZGUubm9kZVZhbHVlKSA9PSAn
JzogcmV0dXJuIDEKICAgIHJldHVybiAwCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGVmIF9yZWFkX3Byb3Rv
dHlwZXMod2hhdCxwcyx4bWxmaWxlKToKICAgIHplcm9fYXR0cmlidXRlcyhwcykKCiAgICBw
cm90b3MgPSBbXQogICAgZm9yIGNoaWxkIGluIG5vbnRyaXZpYWwocHMuY2hpbGROb2Rlcyk6
CiAgICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCiAgICAgICAgaWYgY2hpbGQubm9kZU5hbWUg
IT0gJ3Byb3RvdHlwZSc6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFu
aWMsImVsZW1lbnQgPCVzPiBjYW5ub3QgYXBwZWFyIGluIDxwcm90b3R5cGVzPiIgJSAoY2hp
bGQubm9kZU5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJvdG9zLmFwcGVuZChf
cmVhZF9wcm90b3R5cGUod2hhdCxjaGlsZCkpCgogICAgI3ByaW50ICdwcm90b3M6JyxgcHJv
dG9zYAoKICAgIHJldHVybiBBcmtYbWxGaWxlRmllbGQocHJvdG9zLHR5cGU9J0Fya1Byb3Rv
dHlwZXMnLGZpbGVuYW1lPXhtbGZpbGUpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfcmVhZF9wcm90b3R5cGUo
d2hhdCxwKToKICAgICMgPHRlYW0+IG9ubHkgaGFzIHRlYW0uLi47IG90aGVycyBib3RoCiAg
ICBpZiB3aGF0ID09ICd0ZWFtJzoKICAgICAgICBwX3RlYW0gPSBvbmVfYXR0cmlidXRlKHAs
J3RlYW0nKQogICAgICAgIHBfbmFtZSA9ICcnCiAgICBlbHNlOgogICAgICAgIChwX3RlYW0s
cF9uYW1lKSA9IHR3b19hdHRyaWJ1dGVzKHAsJ3RlYW0nLCduYW1lJykKCiAgICBmb3IgY2hp
bGQgaW4gbm9udHJpdmlhbChwLmNoaWxkTm9kZXMpOgogICAgICAgIG5vdFRleHROb2RlKGNo
aWxkKQogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImVsZW1lbnQgPCVz
PiBjYW5ub3QgYXBwZWFyIGluIDxwcm90b3R5cGU+IiAlIChjaGlsZC5ub2RlTmFtZSkKCiAg
ICByZXR1cm4gKHBfdGVhbSwgcF9uYW1lKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgX3JlYWRfY29va2VkX3Jl
c291cmNlKHJlcyx4bWxmaWxlKToKICAgIHplcm9fYXR0cmlidXRlcyhyZXMpCgogICAgY2hp
bGRyZW4gPSBub250cml2aWFsKHJlcy5jaGlsZE5vZGVzKQogICAgIyBjaGVjayBmb3IgdGhl
IGNvbW1vbiBjYXNlIG9mIGEgc3RyaW5nIGZpcnN0OgojICAgICB0cnk6ICMgcHl0aG9uIDIK
IyAgICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMSBhbmQgY2hpbGRyZW5bMF0ubm9kZVR5
cGUgPT0gcmVzLlRFWFRfTk9ERToKIyAgICAgICAgICAgICByZXR1cm4ocmVzLm5vZGVOYW1l
LCBBcmtYbWxGaWxlRmllbGQoc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5u
b2RlVmFsdWUpKSx0eXBlPSdzdHJpbmcnLGZpbGVuYW1lPXhtbGZpbGUpKQojICAgICBleGNl
cHQgQXR0cmlidXRlRXJyb3I6CiMgICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAg
ICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09
IHhtbC5kb20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgcmV0dXJuKHJlcy5ub2Rl
TmFtZSwgQXJrWG1sRmlsZUZpZWxkKHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFs
dWUpLHR5cGU9J3N0cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgIyBmaXJzdCB0aGUg
ZW1wdHkgc3RyaW5nL3ZhbHVlIGNhc2U6CiAgICBpZiBsZW4oY2hpbGRyZW4pID09IDA6CiAg
ICAgICAgcmV0dXJuKHJlcy5ub2RlTmFtZSwgQXJrWG1sRmlsZUZpZWxkKCcnLHR5cGU9J3N0
cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgZWxpZiBsZW4oY2hpbGRyZW4pID09IDE6
CiAgICAgICAgKGlzX29uZSx2YWwpID0gaXNfdGV4dGx5KGNoaWxkcmVuWzBdKQogICAgICAg
IGlmIGlzX29uZToKICAgICAgICAgICAgcmV0dXJuKHJlcy5ub2RlTmFtZSxBcmtYbWxGaWxl
RmllbGQodmFsLHR5cGU9J3N0cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgIyBPSywg
ZG8gaXQgdGhlIGhhcmQgd2F5OgogICAgcmV0dXJuKHJlcy5ub2RlTmFtZSwgX3Byb2Nlc3Nf
c3ViZmllbGRzKGNoaWxkcmVuLEFya1htbEZpbGVGaWVsZChOb25lLGZpbGVuYW1lPXhtbGZp
bGUpKSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KZGVmIGlzX3RleHRseShub2RlKToKICAgICIiIlJldHVybiAoMSx2
YWx1ZSkgb3IgKDAsIGFueXRoaW5nKSIiIgogICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4g
W25vZGUuVEVYVF9OT0RFLG5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXToKICAgICAgICByZXR1
cm4oMCwnPz8/JykKICAgIHJldHVybigxLCBzdHJpbmcuc3RyaXAodW51bmljb2RlKG5vZGUu
bm9kZVZhbHVlKSkpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfcHJvY2Vzc19zdWJmaWVsZHMobm9kZXMsYWNj
X3Jlc3VsdCk6CiAgICAjIGEgcmVjdXJzaXZlIHRoaW5nCiAgICBpZiBsZW4obm9kZXMpID09
IDA6IHJldHVybiBhY2NfcmVzdWx0CgogICAgaGVhZCAgPSBub2Rlc1swXQogICAgdGFpbCAg
PSBub2Rlc1sxOl0KCiAgICBobmFtZSA9IGhlYWQubm9kZU5hbWUKCiAgICBpZiBobmFtZSA9
PSAnY29uc3RyYWludCc6CiAgICAgICAgYWNjX3Jlc3VsdC5jb25zdHJhaW50cy5hcHBlbmQo
X3Byb2Nlc3NfY29uc3RyYWludChoZWFkKSkKCiAgICBlbGlmIGhuYW1lID09ICdjb21tZW50
JzogIyB0aGlzIGlzIGFuICpBUksqIDxjb21tZW50PiBlbGVtZW50CiAgICAgICAgaWYgYWNj
X3Jlc3VsdC5jb21tZW50ICE9IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5H
ZW5lcmFsUGFuaWMsJ3R3byA8Y29tbWVudD5zIGZvciBmaWVsZD8nCiAgICAgICAgYWNjX3Jl
c3VsdC5jb21tZW50ID0gX3Byb2Nlc3NfY29tbWVudChoZWFkKQogICAgZWxpZiBobmFtZSA9
PSAnI2NvbW1lbnQnOiAjIHRoaXMgaXMgYW4gWE1MIGNvbW1lbnQgPCEtLSAuLi4gLT4KICAg
ICAgICBwYXNzCiAgICBlbGlmIGhuYW1lID09ICdwYXJhbSc6CiAgICAgICAgYWNjX3Jlc3Vs
dC5wYXJhbXMuYXBwZW5kKF9wcm9jZXNzX3BhcmFtKGhlYWQpKQogICAgZWxpZiBobmFtZSBp
biBbJ3N0cmluZycsJ2xpc3QnLCd0YWJsZScsJ2NvZGUnLCdkb2MnXToKICAgICAgICBpZiBh
Y2NfcmVzdWx0LnZhbHR5cGUgIT0gTm9uZToKICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9y
LkJhZElucHV0LCd0d28gdmFsdWVzIGluIHRoZSBzYW1lIGZpZWxkJwogICAgICAgIGFjY19y
ZXN1bHQudmFsdHlwZSwgYWNjX3Jlc3VsdC52YWx1ZSwgYWNjX3Jlc3VsdC52YWxwcm9wcyA9
IF9wcm9jZXNzX3Jlc3VsdChoZWFkKQogICAgICAgICNwcmludCAncmVzdWx0OicsIGFjY19y
ZXN1bHQudmFsdHlwZSwgYWNjX3Jlc3VsdC52YWx1ZSwgYWNjX3Jlc3VsdC52YWxwcm9wcyAK
ICAgIGVsc2U6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiZWxlbWVu
dCA8JXM+IGlzIGJvZ3VzIiAlIChobmFtZSkKCiAgICByZXR1cm4gX3Byb2Nlc3Nfc3ViZmll
bGRzKHRhaWwsYWNjX3Jlc3VsdCkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIF9wcm9jZXNzX2NvbW1lbnQobm9k
ZSk6CiAgICB6ZXJvX2F0dHJpYnV0ZXMobm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZp
YWwobm9kZS5jaGlsZE5vZGVzKQogICAgaWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAg
IHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IGhhdmUgZXhh
Y3RseSBvbmUgY2hpbGQgbm9kZSIKCiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAg
aWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAg
ICAgdmFsICAgPSBzdHJpbmcuc3RyaXAodW51bmljb2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1
ZSkpCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5l
cmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IG9ubHkgaGF2ZSB0ZXh0IGluIGl0IgojICAgICBl
eGNlcHQgQXR0cmlidXRlRXJyb3I6CiMgICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMg
ICAgICAgICBpZiBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9O
T0RFOgojICAgICAgICAgICAgIHZhbCAgID0gc3RyaW5nLnN0cmlwKGNoaWxkcmVuWzBdLm5v
ZGVWYWx1ZSkKIyAgICAgICAgIGVsc2U6CiMgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9y
LkdlbmVyYWxQYW5pYywiPGNvbW1lbnQ+IG11c3Qgb25seSBoYXZlIHRleHQgaW4gaXQiCgog
ICAgKGlzX29uZSx2YWwpID0gaXNfdGV4dGx5KGNoaWxkcmVuWzBdKQoKICAgIGlmIGlzX29u
ZToKICAgICAgICByZXR1cm4gdmFsCiAgICBlbHNlOgogICAgICAgIHJhaXNlIGFyay5lcnJv
ci5HZW5lcmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IG9ubHkgaGF2ZSB0ZXh0IGluIGl0IgoK
IyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgpkZWYgX3Byb2Nlc3NfcGFyYW0obm9kZSk6CiAgICAobmFtZSxkZWZhdWx0ZWQp
ID0gb25lX29yX3R3b19hdHRyaWJ1dGVzKG5vZGUsJ25hbWUnLCdkZWZhdWx0JykKICAgIG5h
bWUgPSB1bnVuaWNvZGUobmFtZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5j
aGlsZE5vZGVzKQoKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDogIyBpcyBpdCBhIHBhcmFt
IHdpdGggbm8gZGVmYXVsdCB2YWx1ZSwgb3IgYW4gZW1wdHktc3RyaW5nIHZhbHVlPwogICAg
ICAgIGlmIGRlZmF1bHRlZCA9PSAnbm8nOgogICAgICAgICAgICByZXR1cm4gKG5hbWUsIE5v
bmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIChuYW1lLCAnJykKCiAgICBp
ZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQ
YW5pYywiPHBhcmFtPiB3aXRoIG1vcmUgdGhhbiBvbmUgc3ViLWVsZW1lbnQ/Pz8iCgojICAg
ICB0cnk6ICMgcHl0aG9uIDIKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09
IG5vZGUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHJldHVybiAobmFtZSwgc3RyaW5nLnN0
cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5ub2RlVmFsdWUpKSkKIyAgICAgICAgIGVsc2U6
CiMgICAgICAgICAgICAgcmV0dXJuIChuYW1lLCBfcHJvY2Vzc19yZXN1bHQoY2hpbGRyZW5b
MF0sZnVsbD0wKSkKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1w
b3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0g
eG1sLmRvbS5jb3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICByZXR1cm4gKG5hbWUsIHN0
cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpKQojICAgICAgICAgZWxzZToKIyAg
ICAgICAgICAgICByZXR1cm4gKG5hbWUsIF9wcm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxm
dWxsPTApKQoKICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKCiAg
ICBpZiBpc19vbmU6CiAgICAgICAgcmV0dXJuIChuYW1lLCB2YWwpCiAgICBlbHNlOgogICAg
ICAgIHJldHVybiAobmFtZSwgX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9MCkp
CgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCmRlZiBfcHJvY2Vzc19jb25zdHJhaW50KG5vZGUpOgogICAgemVyb19hdHRy
aWJ1dGVzKG5vZGUpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5vZGUuY2hpbGROb2Rl
cykKCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVycm9y
LkdlbmVyYWxQYW5pYywiPGNvbnN0cmFpbnQ+IHdpdGggbW9yZSB0aGFuIG9uZSBzdWItZWxl
bWVudD8/PyIKCiAgICBjaGlsZCA9IGNoaWxkcmVuWzBdCiAgICBub3RUZXh0Tm9kZShjaGls
ZCkKICAgICMgcHJpbnQgJ2xpc3Qgc3ViOicsIGNoaWxkLm5vZGVOYW1lCiAgICBjbmFtZSA9
IGNoaWxkLm5vZGVOYW1lCiAgICBpZiBjbmFtZSA9PSAnZGVwZW5kZW5jeSc6CiAgICAgICAg
cmV0dXJuIF9wcm9jZXNzX2RlcGVuZGVuY3koY2hpbGQpCiAgICBlbGlmIGNuYW1lID09ICdo
b3N0LXNwZWMnOgogICAgICAgIHJldHVybiBfcHJvY2Vzc19ob3N0X3NwZWMoY2hpbGQpCiAg
ICBlbGlmIGNuYW1lID09ICdnZW5lcmFsJzoKICAgICAgICByZXR1cm4gX3Byb2Nlc3NfZ2Vu
ZXJhbF9jb25zdHJhaW50KGNoaWxkKQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJy
b3IuR2VuZXJhbFBhbmljLCI8Y29uc3RyYWludD4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIg
JSAoY25hbWUpCgoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgpfREVQRU5ERU5DWV9BVFRSUyA9IHsgIyB3aXRoIGRlZmF1
bHRzCiAgICduYW1lJzogTm9uZQogLCAndHlwZSc6ICdyZWd1bGFyJwogLCAndmVyc2lvbi1z
cGVjJzogJyonCiAsICdvbi1tZXRob2QnOiAncmV2ZWFsJwogLCAnbWF5LWZhaWwnOiAnbm8n
CiAsICd3aGF0JyA6ICdwYWNrYWdlJwogLCAndmFsdWUnOiBOb25lCiB9CgpkZWYgX3Byb2Nl
c3NfZGVwZW5kZW5jeShub2RlKToKICAgIGRlcHByb3BzID0gbXVsdGlwbGVfYXR0cmlidXRl
cyhub2RlLF9ERVBFTkRFTkNZX0FUVFJTKQoKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChu
b2RlLmNoaWxkTm9kZXMpCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDA6CiAgICAgICAgcmFp
c2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGRlcGVuZGVuY3k+IGNhbm5vdCBoYXZlIGEg
Y2hpbGQgbm9kZSIKCiAgICByZXR1cm4gKCdkZXBlbmRlbmN5JywgZGVwcHJvcHMpCgojIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCmRlZiBfcHJvY2Vzc19ob3N0X3NwZWMobm9kZSk6CiAgICB6ZXJvX2F0dHJpYnV0ZXMo
bm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5jaGlsZE5vZGVzKQogICAg
aWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFs
UGFuaWMsIjxob3N0LXNwZWM+IG11c3QgaGF2ZSBleGFjdGx5IG9uZSBjaGlsZCBub2RlIgoK
IyAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAgICAgICBpZiBjaGlsZHJlblswXS5ub2RlVHlw
ZSA9PSBub2RlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2YWwgICA9IHN0cmluZy5zdHJp
cCh1bnVuaWNvZGUoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSkKIyAgICAgICAgIGVsc2U6CiMg
ICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGhvc3Qtc3BlYz4g
bXVzdCBvbmx5IGhhdmUgdGV4dCBpbiBpdCIKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9y
OgojICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5b
MF0ubm9kZVR5cGUgPT0geG1sLmRvbS5jb3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2
YWwgICA9IHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICBl
bHNlOgojICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxob3N0
LXNwZWM+IG11c3Qgb25seSBoYXZlIHRleHQgaW4gaXQiCgogICAgKGlzX29uZSx2YWwpID0g
aXNfdGV4dGx5KGNoaWxkcmVuWzBdKQoKICAgIGlmIG5vdCBpc19vbmU6CiAgICAgICAgcmFp
c2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGhvc3Qtc3BlYz4gbXVzdCBvbmx5IGhhdmUg
dGV4dCBpbiBpdCIKCiAgICByZXR1cm4gKCdob3N0LXNwZWMnLCB2YWwpCgojIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRl
ZiBfcHJvY2Vzc19nZW5lcmFsX2NvbnN0cmFpbnQobm9kZSk6CiAgICB6ZXJvX2F0dHJpYnV0
ZXMobm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5jaGlsZE5vZGVzKQog
ICAgaWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5l
cmFsUGFuaWMsIjxnZW5lcmFsPiBjb25zdHJhaW50IG11c3QgaGF2ZSBleGFjdGx5IG9uZSBj
aGlsZCBub2RlIgoKICAgICMgd2hhdCdzIGluc2lkZSBjYW4gYmUgZXhhY3RseSB0aGUgc2Ft
ZSBhcyBhIDxwYXJhbT4sIGhvd2V2ZXIKICAgICMgd2VpcmQgdGhhdCBtaWdodCBiZS4uLgoK
ICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKCiAgICBpZiBub3Qg
aXNfb25lOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxnZW5lcmFs
PiBjb25zdHJhaW50IGlzIG5vdCBwbGFpbiB0ZXh0IgoKICAgIGlmIHZhbFswXSAhPSAnISc6
CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0
cmFpbnQgbXVzdCBiZWdpbiB3aXRoICEiCgogICAgcmV0dXJuICgnZ2VuZXJhbCcsIHZhbCkK
CiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5
cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFsID0gc3RyaW5nLnN0cmlw
KHVudW5pY29kZShjaGlsZHJlblswXS5ub2RlVmFsdWUpKQojICAgICAgICAgICAgIGlmIHZh
bFswXSAhPSAnISc6CiMgICAgICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFs
UGFuaWMsIjxnZW5lcmFsPiBjb25zdHJhaW50IG11c3QgYmVnaW4gd2l0aCAhIgojICAgICAg
ICAgICAgIHJldHVybiAoJ2dlbmVyYWwnLCB2YWwpCiMgICAgICAgICBlbHNlOgojICAgICAg
ICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxnZW5lcmFsPiBjb25zdHJh
aW50IGlzIG5vdCBwbGFpbiB0ZXh0IgojICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiMg
ICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAgICAgICBpZiBjaGlsZHJlblswXS5u
b2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHZhbCA9
IHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgaWYg
dmFsWzBdICE9ICchJzoKIyAgICAgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVy
YWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0cmFpbnQgbXVzdCBiZWdpbiB3aXRoICEiCiMgICAg
ICAgICAgICAgcmV0dXJuICgnZ2VuZXJhbCcsIHZhbCkKIyAgICAgICAgIGVsc2U6CiMgICAg
ICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0
cmFpbnQgaXMgbm90IHBsYWluIHRleHQgWzJdIgoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgX3Byb2Nlc3NfcmVz
dWx0KG5vZGUsZnVsbD0xKToKICAgIHR5cGUgPSBub2RlLm5vZGVOYW1lCiAgICBpZiB0eXBl
ID09ICdsaXN0JzoKICAgICAgICAodmFsLCB2YWxwcm9wcykgPSBfcHJvY2Vzc19saXN0KG5v
ZGUpCiAgICBlbGlmIHR5cGUgPT0gJ3RhYmxlJzoKICAgICAgICAodmFsLCB2YWxwcm9wcykg
PSBfcHJvY2Vzc190YWJsZShub2RlKQogICAgZWxpZiB0eXBlID09ICdjb2RlJzoKICAgICAg
ICAodmFsLCB2YWxwcm9wcykgPSBfcHJvY2Vzc19jb2RlKG5vZGUpCiAgICBlbGlmIHR5cGUg
PT0gJ2RvYyc6CiAgICAgICAgKHZhbCwgdmFscHJvcHMpID0gX3Byb2Nlc3NfZG9jKG5vZGUp
CiAgICBlbGlmIHR5cGUgPT0gJ3N0cmluZyc6CiAgICAgICAgIyBkbyBpdCBpbmxpbmU6CiAg
ICAgICAgdmFscHJvcHMgPSB7fQogICAgICAgIGNoaWxkcmVuICAgPSBub250cml2aWFsKG5v
ZGUuY2hpbGROb2RlcykKCiAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxOgogICAgICAg
ICAgICAoaXNfb25lLHZhbCkgPSBpc190ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICAgICAgICAg
IGlmIG5vdCBpc19vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJh
bFBhbmljLCJ3ZWlyZCA8c3RyaW5nPiBlbGVtZW50Pz8/ICVzIiAlIGBjaGlsZHJlbmAKICAg
ICAgICBlbGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICAgICAgdmFsID0gJycKICAg
ICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJ3
ZWlyZCA8c3RyaW5nPiBlbGVtZW50IGxlbmd0aD8/PyAlcyIgJSBgY2hpbGRyZW5gCgojICAg
ICAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAgICAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9
PSAxIGFuZCBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSBub2RlLlRFWFRfTk9ERToKIyAgICAg
ICAgICAgICAgICAgdmFsID0gc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5u
b2RlVmFsdWUpKQojICAgICAgICAgICAgIGVsaWYgbGVuKGNoaWxkcmVuKSA9PSAwOgojICAg
ICAgICAgICAgICAgICB2YWwgPSAnJwojICAgICAgICAgICAgIGVsc2U6CiMgICAgICAgICAg
ICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIndlaXJkIDxzdHJpbmc+IGVs
ZW1lbnQ/Pz8gJXMiICUgYGNoaWxkcmVuYAojICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVy
cm9yOgojICAgICAgICAgICAgIGltcG9ydCB4bWwuZG9tLmNvcmUKIyAgICAgICAgICAgICBp
ZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09IHhtbC5k
b20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgICAgIHZhbCA9IHN0cmluZy5zdHJp
cChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgZWxpZiBsZW4oY2hpbGRy
ZW4pID09IDA6CiMgICAgICAgICAgICAgICAgIHZhbCA9ICcnCiMgICAgICAgICAgICAgZWxz
ZToKIyAgICAgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywid2Vp
cmQgPHN0cmluZz4gZWxlbWVudD8/PyAlcyIgJSBgY2hpbGRyZW5gCgogICAgaWYgZnVsbCA9
PSAwOiByZXR1cm4gdmFsICMgdGhhdCdzIGFsbCB3ZSB3YW50CgogICAgI2lmIHR5cGUgPT0g
J2NvZGUnOiBwcmludCAncmV0dXJuaW5nJyx2YWwsdmFscHJvcHMKICAgIHJldHVybiAodHlw
ZSwgdmFsLCB2YWxwcm9wcykKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KX0NPREVfQVRUUlMgPSB7ICMgd2l0aCBkZWZh
dWx0cywgd2hpY2ggYXJlICoqTk9UKiogdXNlZAogICAnZGFuZ2Vyb3VzJzonbm8nCiAsICdp
bnRlcmFjdGl2ZSc6J25vJwogLCAnbGFuZyc6J3NoJwogLCAnb25jZS1wZXInOiAnaG9zdCcK
ICwgJ3ByZXRlbmRhYmxlJzonbm8nCiAsICdwcml2aWxlZ2VzJzonLicKICwgJ3Byb3h5LWhv
c3RzJzogJy4nCiAsICdyZWNvcmRhYmxlJzoneWVzJwogLCAncmVkb2FibGUnOidubycKIH0K
CmRlZiBfcHJvY2Vzc19jb2RlKG5vZGUpOgogICAgdmFscHJvcHMgPSBtdWx0aXBsZV9hdHRy
aWJ1dGVzKG5vZGUsX0NPREVfQVRUUlMpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5v
ZGUuY2hpbGROb2RlcykKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICAjcHJp
bnQgJ3Byb2Nlc3NfY29kZTonLGAoJycsdmFscHJvcHMpYAogICAgICAgIHJldHVybignJyx2
YWxwcm9wcykKICAgIGVsaWYgbGVuKGNoaWxkcmVuKSA9PSAxOgogICAgICAgIChpc19vbmUs
dmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKICAgICAgICBpZiBpc19vbmU6CiAgICAg
ICAgICAgIHJldHVybih2YWwsdmFscHJvcHMpCgojICAgICB0cnk6ICMgcHl0aG9uIDIKIyAg
ICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMSBhbmQgY2hpbGRyZW5bMF0ubm9kZVR5cGUg
PT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgcyA9IHN0cmluZy5zdHJpcCh1bnVu
aWNvZGUoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSkKIyAgICAgICAgICAgICByZXR1cm4ocyx2
YWxwcm9wcykKIyAJZWxpZiBsZW4oY2hpbGRyZW4pID09IDA6CiMgCSAgICAjcHJpbnQgJ3By
b2Nlc3NfY29kZTonLGAoJycsdmFscHJvcHMpYAojICAgICAgICAgICAgIHJldHVybignJyx2
YWxwcm9wcykKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0
IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxIGFuZCBjaGls
ZHJlblswXS5ub2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAg
ICAgIHJldHVybihzdHJpbmcuc3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSx2YWxwcm9w
cykKIyAJZWxpZiBsZW4oY2hpbGRyZW4pID09IDA6CiMgICAgICAgICAgICAgcmV0dXJuKCcn
LHZhbHByb3BzKQoKICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKICAgICAgICByYWlzZSAn
ZHVmZiBjb2RlOicsY2hpbGQubm9kZU5hbWUsIGNoaWxkLm5vZGVUeXBlCgogICAgcmFpc2Ug
YXJrLmVycm9yLkdlbmVyYWxQYW5pYywiY29kZSBlbGVtZW50IDwlcz4gaXMgYm9ndXMiICUg
KG5vZGUubm9kZU5hbWUpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCl9ET0NfQVRUUlMgPSB7ICMgd2l0aCBkZWZhdWx0
cywgd2hpY2ggYXJlICoqTk9UKiogdXNlZAogICAnZm9ybWF0JzondHh0JwogfQoKZGVmIF9w
cm9jZXNzX2RvYyhub2RlKToKICAgIHZhbHByb3BzID0gbXVsdGlwbGVfYXR0cmlidXRlcyhu
b2RlLF9ET0NfQVRUUlMpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5vZGUuY2hpbGRO
b2RlcykKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICByZXR1cm4oJycsdmFs
cHJvcHMpCiAgICBlbGlmIGxlbihjaGlsZHJlbikgPT0gMToKICAgICAgICAoaXNfb25lLHZh
bCkgPSBpc190ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICAgICAgaWYgaXNfb25lOgogICAgICAg
ICAgICByZXR1cm4odmFsLHZhbHByb3BzKQoKIyAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAg
ICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09
IG5vZGUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHMgPSBzdHJpbmcuc3RyaXAodW51bmlj
b2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1ZSkpCiMgICAgICAgICAgICAgI3ByaW50ICdzPScs
YHNgCiMgICAgICAgICAgICAgcmV0dXJuKHMsdmFscHJvcHMpCiMgCWVsaWYgbGVuKGNoaWxk
cmVuKSA9PSAwOgojICAgICAgICAgICAgIHJldHVybignJyx2YWxwcm9wcykKIyAgICAgZXhj
ZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAg
ICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxIGFuZCBjaGlsZHJlblswXS5ub2RlVHlwZSA9
PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHJldHVybihzdHJpbmcu
c3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSx2YWxwcm9wcykKIyAJZWxpZiBsZW4oY2hp
bGRyZW4pID09IDA6CiMgICAgICAgICAgICAgcmV0dXJuKCcnLHZhbHByb3BzKQoKICAgIGZv
ciBjaGlsZCBpbiBjaGlsZHJlbjoKICAgICAgICByYWlzZSAnZHVmZiBkb2M6JyxjaGlsZC5u
b2RlTmFtZSwgY2hpbGQubm9kZVR5cGUKCiAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBh
bmljLCJkb2MgZWxlbWVudCA8JXM+IGlzIGJvZ3VzIiAlIChub2RlLm5vZGVOYW1lKQoKIyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgpkZWYgX3Byb2Nlc3NfbGlzdChub2RlKToKICAgIHplcm9fYXR0cmlidXRlcyhub2Rl
KQoKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMpCgogICAgdmFs
cHJvcHMgPSB7fQogICAgbGlzdCA9IFtdCiAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CiAg
ICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCiAgICAgICAgIyBwcmludCAnbGlzdCBzdWI6Jywg
Y2hpbGQubm9kZU5hbWUKICAgICAgICBjbmFtZSA9IGNoaWxkLm5vZGVOYW1lCiAgICAgICAg
aWYgY25hbWUgIT0gJ2l0ZW0nOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJh
bFBhbmljLCI8bGlzdD4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIgJSAoY25hbWUpCiAgICAg
ICAgbGlzdC5hcHBlbmQoX3Byb2Nlc3NfaXRlbShjaGlsZCkpCgogICAgcmV0dXJuIChsaXN0
LCB2YWxwcm9wcykKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIF9wcm9jZXNzX2l0ZW0obm9kZSk6CiAgICB6ZXJv
X2F0dHJpYnV0ZXMobm9kZSkKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxk
Tm9kZXMpCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVy
cm9yLkdlbmVyYWxQYW5pYywibGlzdCBpdGVtIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBjaGls
ZCBub2RlIgoKICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKICAg
IGlmIG5vdCBpc19vbmU6CiAgICAgICAgdmFsID0gX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVu
WzBdLGZ1bGw9MCkKCiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgY2hpbGRy
ZW5bMF0ubm9kZVR5cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFsICAg
PSBzdHJpbmcuc3RyaXAodW51bmljb2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1ZSkpCiMgICAg
ICAgICAgICAgIyBzdHVmZiA9ICgnc3RyaW5nJywgdmFsLCB7fSkKIyAgICAgICAgIGVsc2U6
CiMgICAgICAgICAgICAgdmFsID0gX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9
MCkKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0IHhtbC5k
b20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0geG1sLmRvbS5j
b3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2YWwgICA9IHN0cmluZy5zdHJpcChjaGls
ZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgIyBzdHVmZiA9ICgnc3RyaW5nJywg
dmFsLCB7fSkKIyAgICAgICAgIGVsc2U6CiMgICAgICAgICAgICAgdmFsID0gX3Byb2Nlc3Nf
cmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9MCkKCiAgICByZXR1cm4gdmFsCgojIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRl
ZiBfcHJvY2Vzc190YWJsZShub2RlKToKICAgIHplcm9fYXR0cmlidXRlcyhub2RlKQoKICAg
IGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMpCgogICAgdmFscHJvcHMg
PSB7fQogICAgdGFibGUgPSB7fQogICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgogICAgICAg
IG5vdFRleHROb2RlKGNoaWxkKQogICAgICAgICMgcHJpbnQgJ2xpc3Qgc3ViOicsIGNoaWxk
Lm5vZGVOYW1lCiAgICAgICAgY25hbWUgPSBjaGlsZC5ub2RlTmFtZQogICAgICAgIGlmIGNu
YW1lICE9ICdlbnRyeSc6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFu
aWMsIjx0YWJsZT4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIgJSAoY25hbWUpCiAgICAgICAg
KGtleSx2YWwpID0gX3Byb2Nlc3NfZW50cnkoY2hpbGQpCiAgICAgICAgaWYgdGFibGUuaGFz
X2tleShrZXkpOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8
dGFibGU+IGhhcyBkdXBsaWNhdGUgZW50cnkgbmFtZWQ6ICVzIiAlIChrZXkpCiAgICAgICAg
dGFibGVba2V5XSA9IHZhbAoKICAgIHJldHVybiAodGFibGUsIHZhbHByb3BzKQoKIyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgpkZWYgX3Byb2Nlc3NfZW50cnkobm9kZSk6CiAgICBrZXkgPSBvbmVfYXR0cmlidXRlKG5v
ZGUsICduYW1lJykKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMp
CgogICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAwOgogICAgICAgIHJldHVybihrZXksICcnKSAj
IGhvcGUgdGhhdCdzIE9LLi4uCgogICAgZWxpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAg
ICAgcHJpbnQgJ2VudHJ5OicsIGtleQogICAgICAgIGZvciBjIGluIGNoaWxkcmVuOgogICAg
ICAgICAgICBwcmludCAncm9ndWUgbm9kZTonLGMubm9kZVR5cGUjLGBjLm5vZGVWYWx1ZWAK
ICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJ0YWJsZSBlbnRyeSBtdXN0
IGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgbm9kZSIKCiAgICAoaXNfb25lLHZhbCkgPSBpc190
ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICBpZiBub3QgaXNfb25lOgogICAgICAgIHZhbCA9IF9w
cm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxmdWxsPTApCgojICAgICB0cnk6ICMgcHl0aG9u
IDIKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09IG5vZGUuVEVYVF9OT0RF
OgojICAgICAgICAgICAgIHZhbCAgID0gc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJl
blswXS5ub2RlVmFsdWUpKQojICAgICAgICAgICAgICMgc3R1ZmYgPSAoJ3N0cmluZycsIHZh
bCwge30pCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHZhbCA9IF9wcm9jZXNzX3Jl
c3VsdChjaGlsZHJlblswXSxmdWxsPTApCiMgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoK
IyAgICAgICAgIGltcG9ydCB4bWwuZG9tLmNvcmUKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBd
Lm5vZGVUeXBlID09IHhtbC5kb20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFs
ICAgPSBzdHJpbmcuc3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKQojICAgICAgICAgICAg
ICMgc3R1ZmYgPSAoJ3N0cmluZycsIHZhbCwge30pCiMgICAgICAgICBlbHNlOgojICAgICAg
ICAgICAgIHZhbCA9IF9wcm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxmdWxsPTApCiAgICBy
ZXR1cm4gKGtleSwgdmFsKQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kbm9fY29kZWNzID0gMCAjIHRoaXMgaXMg
MS41LnggY29tcGF0aWJpbGl0eSBzdHVmZgp0cnk6CiAgICBpbXBvcnQgY29kZWNzCiAgICBs
YXRpbjFfZW5jb2RlID0gY29kZWNzLmxvb2t1cCgnaXNvLTg4NTktMScpIFswXQpleGNlcHQg
SW1wb3J0RXJyb3I6CiAgICBub19jb2RlY3MgPSAxCgpkZWYgdW51bmljb2RlKHVzKToKICAg
IGlmIG5vX2NvZGVjczogcmV0dXJuIHVzICMgbm90aGluZyB3ZSBjYW4gZG8KCiAgICBzLCBj
b25zdW1lZCA9IGxhdGluMV9lbmNvZGUoIHVzICkKICAgIGFzc2VydCBjb25zdW1lZCA9PSBs
ZW4oIHVzICkKICAgIHJldHVybiBzCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiB6ZXJvX2F0dHJpYnV0ZXMobm9k
ZSk6CiAgICBhdHRycyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBv
ciBsZW4oYXR0cnMpID09IDA6CiAgICAgICAgcmV0dXJuCiAgICByYWlzZSBhcmsuZXJyb3Iu
R2VuZXJhbFBhbmljLCJlbGVtZW50IDwlcz4gY2Fubm90IGhhdmUgYXR0cmlidXRlcyIgJSAo
bm9kZS5ub2RlTmFtZSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIG9uZV9hdHRyaWJ1dGUobm9kZSxhdHRyX25h
bWUpOgogICAgIiIiTm9kZSA8bm9kZT4gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGF0dHJpYnV0
ZSwgbmFtZWQgPGF0dHJfbmFtZT4KICAgIFJldHVybiBpdHMgdmFsdWUuCiAgICAiIiIKICAg
IGF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzCiAgICBpZiAgYXR0cnMgPT0gTm9uZSBvciBsZW4o
YXR0cnMpID09IDA6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVz
PjogZXhwZWN0ZWQgZXhhY3RseSBvbmUgYXR0cmlidXRlLCBpLmUuIGAlcycgLS0gZ290IG5v
bmUiICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKICAgIGF0dHJfbmFtZXMgPSBhdHRy
cy5rZXlzKCkKICAgIGlmIGxlbihhdHRycykgPT0gMSBhbmQgYXR0cl9uYW1lIGluIGF0dHJf
bmFtZXM6CiAgICAgICAgcmV0dXJuKHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWVdLnZh
bHVlKSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywi
PCVzPjogZXhwZWN0ZWQgZXhhY3RseSBvbmUgYXR0cmlidXRlLCBpLmUuIGAlcyciICUgKG5v
ZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIHplcm9fb3Jfb25lX2F0dHJp
YnV0ZXMobm9kZSxhdHRyX25hbWUpOgogICAgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXMKICAg
IGlmIGF0dHJzID09IE5vbmUgb3IgbGVuKGF0dHJzKSA9PSAwOiByZXR1cm4gTm9uZQogICAg
YXR0cl9uYW1lcyA9IGF0dHJzLmtleXMoKQogICAgaWYgbGVuKGF0dHJzKSA9PSAxIGFuZCBh
dHRyX25hbWUgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4oc3RyaW5nLnN0cmlwKGF0
dHJzW2F0dHJfbmFtZV0udmFsdWUpKQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJy
b3IuR2VuZXJhbFBhbmljLCI8JXM+OiBleHBlY3RlZCB6ZXJvIG9yIG9uZSBhdHRyaWJ1dGVz
LCBpLmUuIGAlcyciICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKCiMgLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVm
IG9uZV9vcl90d29fYXR0cmlidXRlcyhub2RlLGF0dHJfbmFtZTEsYXR0cl9uYW1lMik6CiAg
ICAiIiJOb2RlIDxub2RlPiBtdXN0IGhhdmUgb25lIGF0dHJpYnV0ZSwgbmFtZWQgPGF0dHJf
bmFtZTE+LAogICAgYW5kICptYXkqIGhhdmUgYW5vdGhlciBhdHRyLCA8YXR0cl9uYW1lMz4K
ICAgIFJldHVybiB0aGUgdmFsdWVzLgogICAgIiIiCiAgICBhdHRycyA9IG5vZGUuYXR0cmli
dXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBvciBsZW4oYXR0cnMpID09IDA6CiAgICAgICAg
cmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVzPjogZXhwZWN0ZWQgb25lIG9yIHR3
byBhdHRyaWJ1dGVzLCBpLmUuIGAlcycgYW5kIG1heWJlIGAlcycgLS0tIGdvdCBub25lIiAl
IChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLGF0dHJfbmFtZTIpCgogICAgYXR0cl9uYW1l
cyA9IGF0dHJzLmtleXMoKQogICAgaWYgICBsZW4oYXR0cnMpID09IDEgYW5kIGF0dHJfbmFt
ZTEgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmluZy5zdHJpcChhdHRyc1th
dHRyX25hbWUxXS52YWx1ZSksIE5vbmUpCiAgICBlbGlmIGxlbihhdHRycykgPT0gMiBhbmQg
YXR0cl9uYW1lMSBpbiBhdHRyX25hbWVzIGFuZCBhdHRyX25hbWUyIGluIGF0dHJfbmFtZXM6
CiAgICAgICAgcmV0dXJuIChzdHJpbmcuc3RyaXAoYXR0cnNbYXR0cl9uYW1lMV0udmFsdWUp
LCBzdHJpbmcuc3RyaXAoYXR0cnNbYXR0cl9uYW1lMl0udmFsdWUpKQogICAgZWxzZToKICAg
ICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+OiBleHBlY3RlZCBvbmUg
b3IgdHdvIGF0dHJpYnV0ZXMsIGkuZS4gYCVzJyBhbmQgbWF5YmUgYCVzJyIgJSAobm9kZS5u
b2RlTmFtZSwgYXR0cl9uYW1lMSxhdHRyX25hbWUyKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgdHdvX29yX3Ro
cmVlX2F0dHJpYnV0ZXMobm9kZSxhdHRyX25hbWUxLGF0dHJfbmFtZTIsYXR0cl9uYW1lMyk6
CiAgICAiIiJOb2RlIDxub2RlPiBtdXN0IGhhdmUgdHdvIGF0dHJpYnV0ZXMsIG5hbWVkIDxh
dHRyX25hbWUxPgogICAgYW5kIDxhdHRyX25hbWUyPiwgYW5kICptYXkqIGhhdmUgYW5vdGhl
ciBhdHRyLCA8YXR0cl9uYW1lMz4KICAgIFJldHVybiB0aGUgdmFsdWVzLgogICAgIiIiCiAg
ICBhdHRycyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBvciBsZW4o
YXR0cnMpID09IDA6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVz
PjogZXhwZWN0ZWQgdHdvIG9yIHRocmVlIGF0dHJpYnV0ZXMsIGkuZS4gYCVzJywgJyVzJyBh
bmQgbWF5YmUgYCVzJyAtLS0gZ290IG5vbmUiICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFt
ZTEsYXR0cl9uYW1lMixhdHRyX25hbWUzKQoKICAgIGF0dHJfbmFtZXMgPSBhdHRycy5rZXlz
KCkKICAgIGlmICAgbGVuKGF0dHJzKSA9PSAyIGFuZCBhdHRyX25hbWUxIGluIGF0dHJfbmFt
ZXMgYW5kIGF0dHJfbmFtZTIgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmlu
Zy5zdHJpcChhdHRyc1thdHRyX25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1th
dHRyX25hbWUyXS52YWx1ZSksIE5vbmUpCiAgICBlbGlmIGxlbihhdHRycykgPT0gMyBhbmQg
YXR0cl9uYW1lMSBpbiBhdHRyX25hbWVzIGFuZCBhdHRyX25hbWUyIGluIGF0dHJfbmFtZXMg
YW5kIGF0dHJfbmFtZTMgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmluZy5z
dHJpcChhdHRyc1thdHRyX25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRy
X25hbWUyXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWUzXS52YWx1ZSkp
CiAgICBlbHNlOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjwlcz46
IGV4cGVjdGVkIHR3byBvciB0aHJlZSBhdHRyaWJ1dGVzLCBpLmUuIGAlcycsIGAlcycgYW5k
IG1heWJlIGAlcyciICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZTEsYXR0cl9uYW1lMixh
dHRyX25hbWUzKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgdHdvX2F0dHJpYnV0ZXMobm9kZSxhdHRyX25hbWUx
LGF0dHJfbmFtZTIpOgogICAgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXMKICAgIGlmIGF0dHJz
ID09IE5vbmUgb3IgbGVuKGF0dHJzKSA9PSAwOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5H
ZW5lcmFsUGFuaWMsIjwlcz46IGV4cGVjdGVkIHR3byBhdHRyaWJ1dGVzLCBpLmUuIGAlcycg
YW5kIGAlcycgLS0tIGdvdCBub25lIiAlIChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLGF0
dHJfbmFtZTIpCgogICAgYXR0cl9uYW1lcyA9IGF0dHJzLmtleXMoKQogICAgaWYgbGVuKGF0
dHJzKSA9PSAyIGFuZCBhdHRyX25hbWUxIGluIGF0dHJfbmFtZXMgYW5kIGF0dHJfbmFtZTIg
aW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4oKHN0cmluZy5zdHJpcChhdHRyc1thdHRy
X25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWUyXS52YWx1ZSkp
KQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+
IGRvZXMgbm90IGhhdmUgZXhhY3RseSB0d28gYXR0cmlidXRlcywgaS5lLiBgJXMnIGFuZCBg
JXMnIiAlIChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLCBhdHRyX25hbWUyKQoKIyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgpkZWYgbXVsdGlwbGVfYXR0cmlidXRlcyhub2RlLHRhYmxlKToKICAgIGF0dHJzID0gbm9k
ZS5hdHRyaWJ1dGVzCiAgICBpZiBhdHRycyA9PSBOb25lOiBhdHRycyA9IHt9CiAgICB2YWxw
cm9wcyA9IHt9CiAgICBmb3IgYW4gaW4gYXR0cnMua2V5cygpOgogICAgICAgIGlmIG5vdCB0
YWJsZS5oYXNfa2V5KGFuKToKICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQ
YW5pYywiPCVzPiBoYXMgYm9ndXMgYXR0cmlidXRlIGAlcyciICUgKG5vZGUubm9kZU5hbWUs
IGFuKQogICAgICAgIGlmIHZhbHByb3BzLmhhc19rZXkoYW4pOgogICAgICAgICAgICByYWlz
ZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+IGhhcyBhdHRyaWJ1dGUgYCVzJyBtb3Jl
IHRoYW4gb25jZSIgJSAobm9kZS5ub2RlTmFtZSwgYW4pCiAgICAgICAgdmFscHJvcHNbYW5d
ID0gc3RyaW5nLnN0cmlwKGF0dHJzW2FuXS52YWx1ZSkKCiAgICAjIGZpbGwgaW4gYW55IHJl
bWFpbmluZyBkZWZhdWx0cwojIE5vOiBkb24ndAojICAgIGZvciBhbiBpbiB0YWJsZS5rZXlz
KCk6CiMgICAgICAgIGlmIG5vdCB2YWxwcm9wcy5oYXNfa2V5KGFuKTogdmFscHJvcHNbYW5d
ID0gdGFibGVbYW5dCgogICAgcmV0dXJuIHZhbHByb3BzCgojID09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaWYgX19u
YW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5zdGRlcnIud3JpdGUoJ2Fyay54bWxmaWxl
Pz8/XG4nKQoKIyB0aGUgZW5kCg==
--=-=-=--


-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn