[Zope] Experimental searchable mail list archive

The Dragon De Monsyne dragondm@integral.org
Sun, 17 Oct 1999 03:51:51 -0500 (CDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---221137916-2036866673-940150311=:30786
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Thu, 7 Oct 1999, Ben Leslie wrote:

> Hi The!
> 
> On Tue, 05 Oct 1999, The Dragon De Monsyne wrote:
> 
> > On Tue, 28 Sep 1999, Michel Pelletier wrote:
> > 
> > > Greetings,
> > > 
> > > I finally got sick of paging through endless archive messages, so I
> > > implimented an expirimental searchable list archive:
> > > 
> > > http://www.zope.org:12080/archives/Catalog/S

	[snip]


> > 	Hmmm! Whaddayaknow! this is exactly what I've been working on! 
> > I've been planning out a product called MessageBase to do this.  I'm
> > sketching out the Message class right now. I'm planning on it having full
> > MIME suport. (one of the things I have gotten done so far is an imporved
> > version of python's mimetools module thast is actually compliant to the
> > MIME RFC's) 
> 
> 
> Umm any chance you could send me a copy of these? I have been working on
> the NotMail product and have got it viewing MIME messages slightly better,
> however an improved mimetools would certainly make my life easier and code 
> neater.

	Sure! there was one more improvement I wanted to make, which is
why it took a few days to reply, here's the module.

	-The Dragon De Monsyne

---221137916-2036866673-940150311=:30786
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="mimetools.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.991017035151.30786B@delta.integral.org>
Content-Description: 

IyBWYXJpb3VzIHRvb2xzIHVzZWQgYnkgTUlNRS1yZWFkaW5nIG9yIE1JTUUt
d3JpdGluZyBwcm9ncmFtcy4NCg0KDQppbXBvcnQgb3MNCmltcG9ydCByZmM4
MjINCmltcG9ydCBzdHJpbmcNCmltcG9ydCB0ZW1wZmlsZQ0KZnJvbSBVc2Vy
RGljdCBpbXBvcnQgVXNlckRpY3QNCg0KIyBBIGRlcml2ZWQgY2xhc3Mgb2Yg
cmZjODIyLk1lc3NhZ2UgdGhhdCBrbm93cyBhYm91dCBNSU1FIGhlYWRlcnMg
YW5kDQojIGNvbnRhaW5zIHNvbWUgaG9va3MgZm9yIGRlY29kaW5nIGVuY29k
ZWQgYW5kIG11bHRpcGFydCBtZXNzYWdlcy4NCg0KY2xhc3MgTWVzc2FnZShy
ZmM4MjIuTWVzc2FnZSk6DQoNCglkZWYgX19pbml0X18oc2VsZiwgZnAsIHNl
ZWthYmxlID0gMSk6DQoJCXJmYzgyMi5NZXNzYWdlLl9faW5pdF9fKHNlbGYs
IGZwLCBzZWVrYWJsZSkNCgkJc2VsZi5lbmNvZGluZ2hlYWRlciA9IFwNCgkJ
CXNlbGYuZ2V0aGVhZGVyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJykN
CgkJc2VsZi50eXBlaGVhZGVyID0gXA0KCQkJc2VsZi5nZXRoZWFkZXIoJ2Nv
bnRlbnQtdHlwZScpDQoJCXNlbGYuZGlzcGhlYWRlciA9IFwNCgkJCXNlbGYu
Z2V0aGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJykNCgkJc2VsZi5wYXJz
ZXR5cGUoKQ0KCQlzZWxmLnBhcnNlcGxpc3QoKQ0KDQoJZGVmIHBhcnNldHlw
ZShzZWxmKToNCgkJc3RyID0gc2VsZi50eXBlaGVhZGVyDQoJCWlmIHN0ciA9
PSBOb25lOg0KCQkJc3RyID0gJ3RleHQvcGxhaW4nDQoJCWlmICc7JyBpbiBz
dHI6DQoJCQlpID0gc3RyaW5nLmluZGV4KHN0ciwgJzsnKQ0KCQkJc2VsZi5w
bGlzdHRleHQgPSBzdHJbaTpdDQoJCQlzdHIgPSBzdHJbOmldDQoJCWVsc2U6
DQoJCQlzZWxmLnBsaXN0dGV4dCA9ICcnDQoJCWZpZWxkcyA9IHN0cmluZy5z
cGxpdGZpZWxkcyhzdHIsICcvJykNCgkJZm9yIGkgaW4gcmFuZ2UobGVuKGZp
ZWxkcykpOg0KCQkJZmllbGRzW2ldID0gc3RyaW5nLmxvd2VyKHN0cmluZy5z
dHJpcChmaWVsZHNbaV0pKQ0KCQlzZWxmLnR5cGUgPSBzdHJpbmcuam9pbmZp
ZWxkcyhmaWVsZHMsICcvJykNCgkJc2VsZi5tYWludHlwZSA9IGZpZWxkc1sw
XQ0KCQlzZWxmLnN1YnR5cGUgPSBzdHJpbmcuam9pbmZpZWxkcyhmaWVsZHNb
MTpdLCAnLycpDQoNCgkgICAgICAgIGlmIHNlbGYuZGlzcGhlYWRlcjoNCgkJ
ICAgIGlmICc7JyBpbiBzZWxmLmRpc3BoZWFkZXI6DQoJCQlpID0gc3RyaW5n
LmluZGV4KHNlbGYuZGlzcGhlYWRlciwgJzsnKQ0KCQkJc2VsZi5kcGxpc3R0
ZXh0ID0gc2VsZi5kaXNwaGVhZGVyW2k6XQ0KCQkJc2VsZi5kaXNwb3NpdGlv
biA9IHNlbGYuZGlzcGhlYWRlcls6aV0NCgkJICAgIGVsc2U6DQoJCQlzZWxm
LmRwbGlzdHRleHQgPSAnJw0KICAgICAgICAgICAgICAgICAgICAgICAgc2Vs
Zi5kaXNwb3NpdGlvbiA9IHNlbGYuZGlzcGhlYWRlcg0KICAgICAgICAgICAg
ICAgIGVsc2U6DQoJICAgICAgICAgICAgc2VsZi5kcGxpc3R0ZXh0ID0gJycN
CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwb3NpdGlvbiA9IE5vbmUg
DQogICAgICAgICAgICAgICAgDQoJZGVmIHBhcnNlcGxpc3Qoc2VsZik6DQog
ICAgICAgICAgICAgICAgc2VsZi5wbGlzdD1bXQ0KICAgICAgICAgICAgICAg
IHNlbGYudHlwZV9wYXJhbXM9cGFyc2VwbGlzdChzZWxmLnBsaXN0dGV4dCkN
CgkJZm9yIGVhY2ggaW4gc2VsZi50eXBlX3BhcmFtcy5pdGVtcygpOg0KICAg
ICAgICAgICAgICAgICAgICBzZWxmLnBsaXN0LmFwcGVuZCgiJXM9JXMiICUg
ZWFjaCkNCiAgICAgICAgICAgICAgICBzZWxmLmRpc3BfcGFyYW1zID0gcGFy
c2VwbGlzdChzZWxmLmRwbGlzdHRleHQpDQoNCglkZWYgZ2V0cGxpc3Qoc2Vs
Zik6DQoJCXJldHVybiBzZWxmLnBsaXN0DQoNCglkZWYgZ2V0dHlwZV9wYXJh
bXMoc2VsZik6DQoJCXJldHVybiBzZWxmLnR5cGVfcGFyYW1zDQoNCglkZWYg
Z2V0ZGlzcF9wYXJhbXMoc2VsZik6DQoJCXJldHVybiBzZWxmLmRpc3BfcGFy
YW1zDQoNCglkZWYgZ2V0dHlwZV9wYXJhbShzZWxmLCBuYW1lKToNCgkJbmFt
ZSA9IHN0cmluZy5sb3dlcihuYW1lKSAgICAgICAgICAgICAgICANCiAgICAg
ICAgICAgICAgICBpZiBzZWxmLnR5cGVfcGFyYW1zLmhhc19rZXkobmFtZSk6
DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnR5cGVfcGFyYW1z
W25hbWVdDQogICAgICAgICAgICAgICAgZWxzZToNCgkJICAgICByZXR1cm4g
Tm9uZQ0KDQoJZGVmIGdldGRpc3BfcGFyYW0oc2VsZiwgbmFtZSk6DQoJCW5h
bWUgPSBzdHJpbmcubG93ZXIobmFtZSkgICAgICAgICAgICAgICAgDQogICAg
ICAgICAgICAgICAgaWYgc2VsZi5kaXNwX3BhcmFtcy5oYXNfa2V5KG5hbWUp
Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50eXBlX3BhcmFt
c1tuYW1lXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQoJCSAgICByZXR1cm4g
Tm9uZQ0KDQoJZGVmIGdldGRpc3BfcGFyYW1uYW1lcyhzZWxmKToNCiAgICAg
ICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwX3BhcmFtcy5rZXlzKCkNCg0K
CWRlZiBnZXR0eXBlX3BhcmFtbmFtZXMoc2VsZik6DQogICAgICAgICAgICAg
ICAgcmV0dXJuIHNlbGYudHlwZV9wYXJhbXMua2V5cygpDQoNCiAgICAgICAg
IyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxsaXR5IC1kZG0NCiAgICAgICAg
Z2V0cGFyYW0gPSBnZXR0eXBlX3BhcmFtDQogICAgICAgIGdldHBhcmFtbmFt
ZXMgPSBnZXR0eXBlX3BhcmFtbmFtZXMNCg0KCWRlZiBnZXRlbmNvZGluZyhz
ZWxmKToNCgkJaWYgc2VsZi5lbmNvZGluZ2hlYWRlciA9PSBOb25lOg0KCQkJ
cmV0dXJuICc3Yml0Jw0KCQlyZXR1cm4gc3RyaW5nLmxvd2VyKHNlbGYuZW5j
b2RpbmdoZWFkZXIpDQoNCglkZWYgZ2V0ZGlzcG9zaXRpb24oc2VsZik6DQoJ
CXJldHVybiBzZWxmLmRpc3Bvc2l0aW9uDQoNCglkZWYgZ2V0dHlwZShzZWxm
KToNCgkJcmV0dXJuIHNlbGYudHlwZQ0KDQoJZGVmIGdldG1haW50eXBlKHNl
bGYpOg0KCQlyZXR1cm4gc2VsZi5tYWludHlwZQ0KDQoJZGVmIGdldHN1YnR5
cGUoc2VsZik6DQoJCXJldHVybiBzZWxmLnN1YnR5cGUNCg0KDQpjbGFzcyBJ
MThuRGljdChVc2VyRGljdCk6DQogICAgIiIiRGljdGlvbmFyeS1saWtlIGNs
YXNzIHRoYXQga2VlcHMgdHJhY2sgb2YgaTE4biANCiAgICAgICBkYXRhIChz
cGVjaWZpY2FsbHkgbGFuZ3VhZ2UgYW5kIGNoYXJhY3RlciBzZXQpDQogICAg
ICAgZm9yIGVhY2ggb2YgaXQncyBlbnRyaWVzLg0KDQogICAgICAgYWRkcyBm
b3VyIG1ldGhvZHM6DQogICAgICAgICAgIGQuZ2V0X2NoYXJzZXQoa2V5KQ0K
CSAgIGQuZ2V0X2xhbmcoa2V5KQ0KCSAgIGQuc2V0X2NoYXJzZXQoa2V5LHZh
bHVlKQ0KCSAgIGQuc2V0X2xhbmcoa2V5LHZhbHVlKQ0KICAgICAgIGZvciBn
ZXR0aW5nIGFuZCBzZXR0aW5nIGkxOG4gZGF0YSBmb3IgZWFjaCBrZXkuDQog
ICAgICAgdGhlIGdldF8qIG1ldGhvZHMgcmV0dXJuIE5vbmUgaWYgdGhlcmUg
aXMgbm8gaTE4biBkYXRhIGZvciB0aGF0IGtleQ0KICAgICAgIA0KICAgICAg
IEF0dGVtcHRpbmcgdG8gc2V0IGkxOG4gZGF0YSBmb3IgYSBub25leGlzdGFu
dCBrZXkNCiAgICAgICB0aHJvd3MgYSBLZXlFcnJvci4NCg0KICAgICIiIg0K
ICAgIA0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaWN0PU5vbmUpOg0KICAg
ICAgICBzZWxmLmNoYXJzZXRfZGF0YT17fQ0KCXNlbGYubGFuZ19kYXRhPXt9
DQoJVXNlckRpY3QuX19pbml0X18oc2VsZikNCglpZiBkaWN0IGlzIG5vdCBO
b25lOg0KCSAgICBzZWxmLnVwZGF0ZShkaWN0KQ0KCSAgICANCiAgICBkZWYg
X19kZWxpdGVtX18oc2VsZiwga2V5KTogDQogICAgICAgIGRlbCBzZWxmLmRh
dGFba2V5XQ0KCXRyeToNCgkgICAgZGVsIHNlbGYuY2hhcnNldF9kYXRhW2tl
eV0NCglleGNlcHQgS2V5RXJyb3I6DQoJICAgIHBhc3MNCgl0cnk6DQoJICAg
IGRlbCBzZWxmLmxhbmdfZGF0YVtrZXldDQoJZXhjZXB0IEtleUVycm9yOg0K
CSAgICBwYXNzDQoNCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3QpOg0KICAg
ICAgICBpZiBpc2luc3RhbmNlKGRpY3QsIEkxOG5EaWN0KToJDQogICAgICAg
ICAgICBzZWxmLmRhdGEudXBkYXRlKGRpY3QuZGF0YSkNCiAgICAgICAgICAg
IGZvciBrIGluIGRpY3Qua2V5cygpOg0KICAgICAgICAgICAgICAgIHNlbGYu
c2V0X2xhbmcoayxkaWN0LmdldF9sYW5nKGspKQ0KICAgICAgICAgICAgICAg
IHNlbGYuc2V0X2NoYXJzZXQoayxkaWN0LmdldF9jaGFyc2V0KGspKQ0KICAg
ICAgICBlbHNlOg0KCSAgICBVc2VyRGljdC51cGRhdGUoc2VsZixkaWN0KQ0K
CSAgICAJICAgIA0KICAgIGRlZiBjbGVhcihzZWxmKTogDQogICAgICAgIHNl
bGYuZGF0YS5jbGVhcigpDQoJc2VsZi5jaGFyc2V0X2RhdGEuY2xlYXIoKQ0K
CXNlbGYubGFuZ19kYXRhLmNsZWFyKCkNCg0KICAgIGRlZiBjb3B5KHNlbGYp
Og0KICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBJMThuRGljdDoNCiAg
ICAgICAgICAgIHJldHVybiBJMThuRGljdChzZWxmLmRhdGEpDQoJZWxzZToN
CiAgICAgICAgICAgIGltcG9ydCBjb3B5DQogICAgICAgICAgICByZXR1cm4g
Y29weS5jb3B5KHNlbGYpDQoNCiAgICBkZWYgc2V0X2xhbmcoc2VsZixrZXks
dmFsPU5vbmUpOg0KICAgICAgICBpZiBzZWxmLmhhc19rZXkoa2V5KToNCgkg
ICAgaWYgdmFsIGlzIG5vdCBOb25lOg0KCSAgICAgICAgc2VsZi5sYW5nX2Rh
dGFba2V5XT12YWwNCiAgICAgICAgICAgIGVsc2U6DQoJICAgICAgICB0cnk6
DQoJCSAgICBkZWwgc2VsZi5sYW5nX2RhdGFba2V5XQ0KCQlleGNlcHQgS2V5
RXJyb3I6DQoJCSAgICBwYXNzDQoJZWxzZToNCgkgICAgcmFpc2UgS2V5RXJy
b3Isa2V5DQoNCiAgICBkZWYgc2V0X2NoYXJzZXQoc2VsZixrZXksdmFsPU5v
bmUpOg0KICAgICAgICBpZiBzZWxmLmhhc19rZXkoa2V5KToNCgkgICAgaWYg
dmFsIGlzIG5vdCBOb25lOg0KCSAgICAgICAgc2VsZi5jaGFyc2V0X2RhdGFb
a2V5XT12YWwNCiAgICAgICAgICAgIGVsc2U6DQoJICAgICAgICB0cnk6DQoJ
CSAgICBkZWwgc2VsZi5jaGFyc2V0X2RhdGFba2V5XQ0KCQlleGNlcHQgS2V5
RXJyb3I6DQoJCSAgICBwYXNzDQoJZWxzZToNCgkgICAgcmFpc2UgS2V5RXJy
b3Isa2V5DQoJICAgIA0KCQ0KICAgIGRlZiBnZXRfbGFuZyhzZWxmLGtleSxm
YWlsb2JqPU5vbmUpOg0KICAgICAgICByZXR1cm4gc2VsZi5sYW5nX2RhdGEu
Z2V0KGtleSxmYWlsb2JqKQ0KCQ0KICAgIGRlZiBnZXRfY2hhcnNldChzZWxm
LGtleSxmYWlsb2JqPU5vbmUpOg0KICAgICAgICByZXR1cm4gc2VsZi5jaGFy
c2V0X2RhdGEuZ2V0KGtleSxmYWlsb2JqKQ0KICANCg0KIyBVdGlsaXR5IGZ1
bmN0aW9ucw0KIyAtLS0tLS0tLS0tLS0tLS0tLQ0KDQojcGFyc2VzIGEgTUlN
RSBwYXJhbWV0ZXIgbGlzdCANCg0KZGVmIHBhcnNlcGxpc3QocHN0cik6DQog
ICAgIiIiIFBhcnNlIGEgTUlNRSBwYXJhbWV0ZXIgbGlzdC4NCiAgICAgICAg
U2hvdWxkIGNvbXBseSB0byByZmMyMDQ1LCByZmMyMjMxLg0KDQogICAgICAg
ICAgLS0gVGhlIERyYWdvbiBEZSBNb25zeW5lIDxkcmFnb25kbUBpbnRlZ3Jh
bC5vcmc+DQoNCiAgICAgICAgV2lsbCBkZWNvZGUgcmZjMjIzMSAlIGVzY2Fw
ZXMgYW5kIHBhcmFtICdwYXJhbW5hbWUqPG51bWJlcj4nDQogICAgICAgIGZv
bGRpbmcuIEFsc28gYnJlYWtzIG9mZiBsYW5nIGFuZCBjaGFyc2V0IGluZm8s
IGlmIGl0IGlzIHNwZWNpZmllZA0KCXVzaW5nIE1JTUUgJ2NoYXJzZXQnbGFu
Zyd2YWx1ZSBleHRlbmRlZCBub3RhdGlvbi4gDQoJUmZjIDgyMiBjb21tZW50
cyBzaG91bGQgYmUgcHJvcGVybHkgIGlnbm9yZWQuIFVucXVvdGVkIA0KICAg
ICAgICB3aGl0ZXNwYWNlIGlzIGFsc28gaWdub3JlZC4gIA0KICAgIA0KICAg
ICAgICB0aGlzIHBhcnNlciB0cmllcyB0byBiZSBwYXRoYWxvZ2ljYWxseSB0
b2xlcmFudC4NCiANCiAgICAgICAgTk9URVM6IA0KICAgICAgICAoMSkgICBU
aGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHJldHVybnMgYSBkaWN0aW9uYXJ5LWxp
a2UgY2xhc3MgaW5zdGFuY2UNCgkoYW4gaW5zdGFuY2Ugb2YgbWltZXRvb2xz
LkkxOG5EaWN0KS4gQW55IGxhbmcgb3IgY2hhcnNldCBpbmZvIHByZXNlbnQN
Cglmb3IgYW4gaXRlbSBjYW4gYmUgb2J0YWluZWQgdXNpbmcgdGhhdCBjbGFz
cydzIGdldF9sYW5nIGFuZCBnZXRfY2hhcnNldA0KCW1ldGhvZHMuIE90aGVy
d2lzZSB0aGUgb2JqZWN0IHJldHVybmVkIGFjdHMgbGlrZSBhIG5vcm1hbA0K
CWRpY3Rpb25hcnkuDQoJDQogICAgICAgICgyKSAgIFRoaXMgZnVuY3Rpb24g
cmV0dXJucyBhIGRpY3Rpb25hcnkoLWxpa2UgIG9iamVjdCkgd2hvc2Uga2V5
cyANCglhcmUgcGFyYW0gbmFtZXMsIChtYXBwZWQgdG8gbG93ZXIgY2FzZSkg
YW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIA0KCW1hdGNoaW5nIHBhcmFtIHZh
bHVlcy4gDQogICAgICAgIFRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAgbWlt
ZXRvb2xzIE1lc3NhZ2UgY2xhc3MncyBwYXJzZXBsaXN0KCkNCiAgICAgICAg
bWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBsaXN0IG9mICJwYXJhbT12YWx1ZSIg
c3RyaW5ncy4NCiAgICAgICAgSU1ITywgdGhhdCBmb3JtYXQgaXMgdW5uZWNj
ZXNhcnksIGFuZCBzaW1wbHkgbWFrZXMgbW9yZSB3b3JrIGZvciB0aGUgDQog
ICAgICAgIHByb2dyYW1tZXIsIGFzOiBhKSBNSU1FIHBhcmFtZXRlciBsaXN0
cyBhcmUgZXhwbGljaXRseSB1bm9yZGVyZWQgDQogICAgICAgIChzbyBzYXll
dGggdGhlIHJmYykgYW5kIHRoZSBvbmx5IG90aGVyIHJlYXNvbiB0byB1c2Ug
YSBsaXN0LCBtdWx0aXBsZQ0KICAgICAgICBwYXJhbWV0ZXJzIHdpdGggdGhl
IHNhbWUgbmFtZSwgd2hpbGUgbm90IGV4cGxpY2l0bHkgZGlzYWxsb3dlZCwg
d291bGQNCiAgICAgICAgaW1wbGljaXRseSB2aW9sYXRlIHJmYzIyMzEgKHRv
IGV4cGxhaW4gdGhhdDogcmZjMjIzMSBzdGF0ZXMgdGhhdCANCiAgICAgICAg
cGFyYW1ldGVycyBtYXkgYmUgYnJva2VuLXVwIChpLmUuIGJ5IHVzZXItYWdl
bnRzKSBhY3Jvc3MgbXVsdGlwbGUgDQogICAgICAgIHBhcmFtZXRlcnMgYnkg
dXNpbmcgYSBzcGVjaWFsIHN5bnRheCAocGFyYW1uYW1lKnNlcXVlbmNlLW51
bWJlciksDQogICAgICAgIGFuZCB0aGF0IHRoaXMgc3ludGF4IG11c3QgYmUg
dHJhbnNwYXJlbnQgdG8gTUlNRS4gSXQgYWxzbyBzdGF0ZXMNCiAgICAgICAg
dGhhdCBzb21lIHN5c3RlbXMgKGUuZyBJTUFQIHNlcnZlcnMpIG11c3QgYXV0
b21hdGljYWxseSBkZWNvZGUgc3VjaCANCiAgICAgICAgZW5jb2RpbmcgZm9y
ICBjZXJ0YWluIHBhcmFtZXRlcnMuIFNpbmNlIE1JTUUgcGFyYW1ldGVyIGxp
c3RzIGFyZSANCiAgICAgICAgdW5vcmRlcmVkLCBtdWx0aXBsZSBwYXJhbWV0
ZXJzIHdpdGggdGhlIHNhbWUgbmFtZSB3b3VsZCBicmVhayB0aGlzDQogICAg
ICAgIHN5bnRheCwgaWYgdHdvIHN1Y2ggcGFyYW1ldGVycyB3ZXJlICdmb2xk
ZWQnLCB0aGVyZSB3b3VsZCBiZSBubyB3YXkNCiAgICAgICAgb2YgZGVjb2Rp
bmcgd2hhdCBwYXJ0IHdlbnQgdG8gd2hpY2guKSANCg0KICAgICIiIg0KICAg
IGNvbW1lbnQ9MA0KICAgIHBhcmFtcz1JMThuRGljdCgpDQogICAgdGhpc2No
cj0nJw0KICAgIGxhc3RjaHI9JycNCiAgICBwPVtdDQogICAgdj1bXQ0KICAg
IGlzVmFsdWU9MA0KDQogICAgcHN0cmxpc3Q9bGlzdChwc3RyKQ0KICAgIHBz
dHJsaXN0LnJldmVyc2UoKQ0KDQogICAgd2hpbGUgcHN0cmxpc3Q6DQogICAg
ICAgIGxhc3RjaHI9dGhpc2Nocg0KICAgICAgICB0aGlzY2hyPXBzdHJsaXN0
LnBvcCgpDQogICAgICAgIGlmIHRoaXNjaHIgPT0gJzsnOg0KICAgICAgICAg
ICAgcHBzdHI9c3RyaW5nLmxvd2VyKHN0cmluZy5zdHJpcChzdHJpbmcuam9p
bihwLCcnKSkpDQogICAgICAgICAgICB2cHN0cj1zdHJpbmcuam9pbih2LCcn
KQ0KICAgICAgICAgICAgaWYgcHBzdHI6DQogICAgICAgICAgICAgICAgcGFy
YW1zW3Bwc3RyXT12cHN0cg0KICAgICAgICAgICAgcD1bXQ0KICAgICAgICAg
ICAgdj1bXQ0KICAgICAgICAgICAgaXNWYWx1ZT0wDQoNCiAgICAgICAgZWxp
ZiB0aGlzY2hyID09JygnOg0KICAgICAgICAgICAgY29tbWVudD1jb21tZW50
KzENCiAgICAgICAgICAgIHdoaWxlIHBzdHJsaXN0IGFuZCBjb21tZW50Og0K
ICAgICAgICAgICAgICAgIGxhc3RjaHI9dGhpc2Nocg0KICAgICAgICAgICAg
ICAgIHRoaXNjaHIgPSBwc3RybGlzdC5wb3AoKQ0KICAgICAgICAgICAgICAg
IGlmIHRoaXNjaHIgPT0gJygnIGFuZCBsYXN0Y2hyIDw+J1xcJzoNCiAgICAg
ICAgICAgICAgICAgICAgY29tbWVudD1jb21tZW50KzENCiAgICAgICAgICAg
ICAgICBlbGlmIHRoaXNjaHIgPT0gJyknIGFuZCBsYXN0Y2hyIDw+J1xcJzoN
CiAgICAgICAgICAgICAgICAgICAgY29tbWVudD1jb21tZW50LTENCg0KICAg
ICAgICBlbGlmIHRoaXNjaHIgPT0nPScgOg0KCSAgICBpZiBsZW4ocCkgPjA6
DQogICAgICAgICAgICAgICAgaWYgcFstMV0gPT0gJyonOg0KICAgICAgICAg
ICAgICAgICAgICAjIHJmYyAyMjMxIGRlc2NyaWJlcyBkaWZmZXJlbnQgc2Vt
YW50aWNzIA0KICAgICAgICAgICAgICAgICAgICAjIGZvciBleHRlbmRlZCBw
YXJhbSB2YWx1ZXMuIEFtb25nc3Qgb3RoZXIgdGhpbmdzDQogICAgICAgICAg
ICAgICAgICAgICMgcXVvdGVkIHN0cmluZ3MgYXJlbid0IGFsbG93ZWQsIGJ1
dCAlIGVzY2FwZXMgYXJlLiAtZGRtDQogICAgICAgICAgICAgICAgICAgICNw
cmludCAiMjogJXMgJXMiICUgKHN0cihwKSxwWy0xXSkNCgkJICAgIGlzVmFs
dWU9Mg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAg
ICAgICNwcmludCAiMTogJXMgJXMiICUgKHN0cihwKSxwWy0xXSkNCiAgICAg
ICAgICAgICAgICAgICAgaXNWYWx1ZT0xDQoNCiAgICAgICAgZWxpZiB0aGlz
Y2hyPT0nIicgYW5kIGlzVmFsdWU9PTEgOg0KICAgICAgICAgICAgd2hpbGUg
cHN0cmxpc3Q6DQogICAgICAgICAgICAgICAgbGFzdGNociA9IHRoaXNjaHIN
CiAgICAgICAgICAgICAgICB0aGlzY2hyPXBzdHJsaXN0LnBvcCgpDQogICAg
ICAgICAgICAgICAgaWYgdGhpc2NociA9PSAnIicgYW5kIGxhc3RjaHI8Pidc
XCc6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAg
ICAgaWYgdGhpc2NociA9PSAnXFwnIGFuZCBsYXN0Y2hyIDw+J1xcJzoNCiAg
ICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAgICAgICAgIGVsc2U6
DQogICAgICAgICAgICAgICAgICAgIHYuYXBwZW5kKHRoaXNjaHIpDQoNCiAg
ICAgICAgZWxpZiB0aGlzY2hyPT0nJScgYW5kIGlzVmFsdWU9PTIgOg0KICAg
ICAgICAgICAgeGQxPScnDQogICAgICAgICAgICB4ZDI9JycNCiAgICAgICAg
ICAgIHRyeToNCiAgICAgICAgICAgICAgICB4ZDE9cHN0cmxpc3QucG9wKCkN
CiAgICAgICAgICAgICAgICB4ZDI9cHN0cmxpc3QucG9wKCkNCiAgICAgICAg
ICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHYuYXBwZW5kKGNo
cihzdHJpbmcuYXRvaSh4ZDEreGQyLDE2KSkpDQogICAgICAgICAgICAgICAg
ZXhjZXB0IFZhbHVlRXJyb3I6DQogICAgICAgICAgICAgICAgICAgICNzb21l
IGJvZ3VzICUgZXNjYXBlID8/IA0KICAgICAgICAgICAgICAgICAgICAjIG1l
YmJlIHNvbWVvbmUgZmVyZ290IHRvIHF1b3RlIHNvbWV0aGluZyAgICANCiAg
ICAgICAgICAgICAgICAgICAgIyBwYXNzIGl0IGFzIGl0LiAtZGRtDQogICAg
ICAgICAgICAgICAgICAgIHYuYXBwZW5kKCclJykNCiAgICAgICAgICAgICAg
ICAgICAgdi5hcHBlbmQoeGQxKQ0KICAgICAgICAgICAgICAgICAgICB2LmFw
cGVuZCh4ZDIpDQogICAgICAgICAgICAgICAgbGFzdGNocj14ZDINCiAgICAg
ICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICNi
bGFnaC4gU29tZXRoaW5nIGdvdCB0cnVuY2F0ZWQsIG9yIGJhZCAlIGVzY2Fw
ZQ0KICAgICAgICAgICAgICAgICNwYXNzIGFzLWlzIC1kZG0NCiAgICAgICAg
ICAgICAgICB2LmFwcGVuZCgnJScpDQogICAgICAgICAgICAgICAgbGFzdGNo
cj0nJScNCiAgICAgICAgICAgICAgICBpZiB4ZDE6DQogICAgICAgICAgICAg
ICAgICAgIHYuYXBwZW5kKHhkMSkNCiAgICAgICAgICAgICAgICAgICAgbGFz
dGNocj14ZDENCiAgICAgICAgZWxpZiB0aGlzY2hyIGluIHN0cmluZy53aGl0
ZXNwYWNlOg0KICAgICAgICAgICAgcGFzcw0KICAgICAgICBlbHNlOg0KICAg
ICAgICAgICAgaWYgaXNWYWx1ZToNCiAgICAgICAgICAgICAgICB2LmFwcGVu
ZCh0aGlzY2hyKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAg
ICBwLmFwcGVuZCh0aGlzY2hyKQ0KDQogICAgcHBzdHI9c3RyaW5nLmxvd2Vy
KHN0cmluZy5zdHJpcChzdHJpbmcuam9pbihwLCcnKSkpDQogICAgdnBzdHI9
c3RyaW5nLmpvaW4odiwnJykNCiAgICBpZiBwcHN0cjoNCiAgICAgICAgcGFy
YW1zW3Bwc3RyXT12cHN0cg0KICAgIGZwYXJhbXM9e30NCiAgICAjdW5kbyAg
cmZjMjIzMSBwYXJhbSBmb2xkaW5nLiAtZGRtDQogICAgZm9yIGVhY2ggaW4g
cGFyYW1zLmtleXMoKTogICAgDQogICAgICAgaWYgZWFjaFstMV09PScqJzoN
CiAgICAgICAgICAgcGFyYW1uYW1lPWVhY2hbOi0xXQ0KICAgICAgIGVsc2U6
DQogICAgICAgICAgIHBhcmFtbmFtZT1lYWNoDQogICAgICAgaWYgJyonIGlu
IHBhcmFtbmFtZToNCiAgICAgICAgICAgcGw9c3RyaW5nLnNwbGl0KHBhcmFt
bmFtZSwnKicsMSkNCiAgICAgICAgICAgaWYgbGVuKHBsKSA8PjI6DQogICAg
ICAgICAgICAgICBicmVhaw0KICAgICAgICAgICB0cnk6DQogICAgICAgICAg
ICAgICBwYXJhbW51bT1zdHJpbmcuYXRvaShwbFsxXSwxMCkNCiAgICAgICAg
ICAgZXhjZXB0IFZhbHVlRXJyb3I6DQogICAgICAgICAgICAgICBwYXNzDQog
ICAgICAgICAgIGVsc2U6DQoJICAgICAgIGlmIHBhcmFtbnVtPT0wOg0KCSAg
ICAgICAgICAgaWYgZWFjaFstMV09PScqJzogDQogICAgICAgICAgICAgICAg
ICAgICAgIGlmIG5vdCBmcGFyYW1zLmhhc19rZXkocGxbMF0rIioiKToNCgkJ
ICAgICAgICAgICBpZiBmcGFyYW1zLmhhc19rZXkocGxbMF0pOg0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZwYXJhbXNbcGxbMF0rIioiXT1m
cGFyYW1zW3BsWzBdXQ0KCQkJICAgICAgIGRlbCBmcGFyYW1zW3BsWzBdXQ0K
CQkJICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
cGFyYW1zW3BsWzBdKyIqIl09e30NCgkJICAgICAgIGZwYXJhbXNbcGxbMF0r
JyonXVswXT1wYXJhbXNbZWFjaF0NCiAJCSAgIGVsc2U6DQogICAgICAgICAg
ICAgICAgICAgICAgIGlmIG5vdCBmcGFyYW1zLmhhc19rZXkocGxbMF0pOg0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBhcmFtc1twbFswXV09e30N
CgkJICAgICAgIGZwYXJhbXNbcGxbMF1dWzBdPXBhcmFtc1tlYWNoXQ0KICAg
ICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICBpZiBmcGFy
YW1zLmhhc19rZXkocGxbMF0rJyonKToNCiAgICAgICAgICAgICAgICAgICAg
ICAgZnBhcmFtc1twbFswXSsnKiddW3BhcmFtbnVtXT1wYXJhbXNbZWFjaF0N
CgkJICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZw
YXJhbXMuaGFzX2tleShwbFswXSk6DQogICAgICAgICAgICAgICAgICAgICAg
ICAgICBmcGFyYW1zW3BsWzBdXT17fQ0KCQkgICAgICAgZnBhcmFtc1twbFsw
XV1bcGFyYW1udW1dPXBhcmFtc1tlYWNoXSAgICAgICANCiAgICAgICAgICAg
ICAgIGRlbCBwYXJhbXNbZWFjaF0NCiAgICBmb3IgZWFjaCBpbiBmcGFyYW1z
LmtleXMoKToNCiAgICAgICAgbD1mcGFyYW1zW2VhY2hdLmtleXMoKQ0KICAg
ICAgICBsLnNvcnQoKQ0KICAgICAgICB2YWw9IiINCiAgICAgICAgZm9yIGkg
aW4gbDoNCiAgICAgICAgICAgIHZhbD12YWwrZnBhcmFtc1tlYWNoXVtpXQ0K
ICAgICAgICBwYXJhbXNbZWFjaF09dmFsDQogICAgZm9yIGVhY2ggaW4gcGFy
YW1zLmtleXMoKToNCiAgICAgICAgaWYgZWFjaFstMV09PSAnKic6DQoJICAg
IGs9c3RyaW5nLnN0cmlwKGVhY2hbOi0xXSkNCgkgICAgdj1wYXJhbXNbZWFj
aF0NCgkgICAgZGVsIHBhcmFtc1tlYWNoXQ0KCSAgICBpZiBub3QgazoNCgkg
ICAgICAgIGNvbnRpbnVlDQoJICAgIHZsID0gc3RyaW5nLnNwbGl0KHYsIici
LDIpDQoJICAgIGlmIGxlbih2bCk9PTM6DQoJICAgICAgICBwYXJhbXNba109
dmxbMl0NCgkJY2hhcnNldD1zdHJpbmcuc3RyaXAodmxbMF0pDQoJCWxhbmc9
c3RyaW5nLnN0cmlwKHZsWzFdKQ0KCQlpZiBub3QgY2hhcnNldDoNCgkJICAg
IGNoYXJzZXQ9Tm9uZQ0KCQlpZiBub3QgbGFuZzoNCgkJICAgIGxhbmc9Tm9u
ZQ0KCQlwYXJhbXMuc2V0X2NoYXJzZXQoayxjaGFyc2V0KQ0KCQlwYXJhbXMu
c2V0X2xhbmcoayxsYW5nKQ0KCSAgICBlbHNlOg0KCSAgICAgICAgIyBTb21l
dGhpbmcgYm9ndXMgaGVyZSwgcHVudCAgLWRkbQ0KCQlwYXJhbXNba109dg0K
ICAgIHJldHVybiBwYXJhbXMNCg0KZGVmIHRlc3RfcGFyc2VwbGlzdCgpOg0K
ICAgIHBwdGVzdCA9IFsnOyB0aGlzPXRoYXQgO3RoZW90aGVydGhpbmc9InNv
bWUgdGhpbmcgaGVyZTsgcmVhbGx5IjsgZm9vPWJhcicsDQogICAgJ3RoaXM9
dGhhdDsgZm9vPWJhcicsDQogICAgIiIiO3RpdGxlKjAqPXVzLWFzY2lpJ2Vu
J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwDQogICAgO3RpdGxlKjEqPSUy
QSUyQSUyQWZ1biUyQSUyQSUyQSUyMA0KICAgIDt0aXRsZSoyPSJpc24ndCBp
dCEiICIiIiwNCiAgICAndGhpcz10aGF0IChBIGNvbW1lbnQ7IFJlYWxseSkg
OyBmb289YmFyJywNCiAgICAndGhpcz0idGhhdCAoaGkhKSI7IChBIGNvbW1l
bnQ7IFJlYWxseSkgOyBmb289YmFyJ10NCiAgICBmb3IgZWFjaCBpbiBwcHRl
c3Q6DQogICAgICAgIHByaW50ICItLS0tLXRleHQtLS0tLSINCglwcmludCBl
YWNoDQoJcHJpbnQgIi0tLS0tcGFyc2VkLS0tIg0KCXByaW50IHBhcnNlcGxp
c3QoZWFjaCkNCglwcmludCAiLS0tLS0tLS0tLS0tLS0iDQoNCiMgUmV0dXJu
IGEgcmFuZG9tIHN0cmluZyB1c2FibGUgYXMgYSBtdWx0aXBhcnQgYm91bmRh
cnkuDQojIFRoZSBtZXRob2QgdXNlZCBpcyBzbyB0aGF0IGl0IGlzICp2ZXJ5
KiB1bmxpa2VseSB0aGF0IHRoZSBzYW1lDQojIHN0cmluZyBvZiBjaGFyYWN0
ZXJzIHdpbGwgZXZlcnkgb2NjdXIgYWdhaW4gaW4gdGhlIFVuaXZlcnNlLA0K
IyBzbyB0aGUgY2FsbGVyIG5lZWRuJ3QgY2hlY2sgdGhlIGRhdGEgaXQgaXMg
cGFja2luZyBmb3IgdGhlDQojIG9jY3VycmVuY2Ugb2YgdGhlIGJvdW5kYXJ5
Lg0KIw0KIyBUaGUgYm91bmRhcnkgY29udGFpbnMgZG90cyBzbyB5b3UgaGF2
ZSB0byBxdW90ZSBpdCBpbiB0aGUgaGVhZGVyLg0KDQpfcHJlZml4ID0gTm9u
ZQ0KDQpkZWYgY2hvb3NlX2JvdW5kYXJ5KCk6DQoJZ2xvYmFsIF9wcmVmaXgN
CglpbXBvcnQgdGltZQ0KCWltcG9ydCByYW5kb20NCglpZiBfcHJlZml4ID09
IE5vbmU6DQoJCWltcG9ydCBzb2NrZXQNCgkJaW1wb3J0IG9zDQoJCWhvc3Rp
ZCA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgp
KQ0KCQl0cnk6DQoJCSAgICB1aWQgPSBgb3MuZ2V0dWlkKClgDQoJCWV4Y2Vw
dDoNCgkJICAgIHVpZCA9ICcxJw0KCQl0cnk6DQoJCSAgICBwaWQgPSBgb3Mu
Z2V0cGlkKClgDQoJCWV4Y2VwdDoNCgkJICAgIHBpZCA9ICcxJw0KCQlfcHJl
Zml4ID0gaG9zdGlkICsgJy4nICsgdWlkICsgJy4nICsgcGlkDQoJdGltZXN0
YW1wID0gJyUuM2YnICUgdGltZS50aW1lKCkNCglzZWVkID0gYHJhbmRvbS5y
YW5kaW50KDAsIDMyNzY3KWANCglyZXR1cm4gX3ByZWZpeCArICcuJyArIHRp
bWVzdGFtcCArICcuJyArIHNlZWQNCg0KDQojIFN1YnJvdXRpbmVzIGZvciBk
ZWNvZGluZyBzb21lIGNvbW1vbiBjb250ZW50LXRyYW5zZmVyLXR5cGVzDQoN
CmRlZiBkZWNvZGUoaW5wdXQsIG91dHB1dCwgZW5jb2RpbmcpOg0KCWlmIGVu
Y29kaW5nID09ICdiYXNlNjQnOg0KCQlpbXBvcnQgYmFzZTY0DQoJCXJldHVy
biBiYXNlNjQuZGVjb2RlKGlucHV0LCBvdXRwdXQpDQoJaWYgZW5jb2Rpbmcg
PT0gJ3F1b3RlZC1wcmludGFibGUnOg0KCQlpbXBvcnQgcXVvcHJpDQoJCXJl
dHVybiBxdW9wcmkuZGVjb2RlKGlucHV0LCBvdXRwdXQpDQoJaWYgZW5jb2Rp
bmcgaW4gKCd1dWVuY29kZScsICd4LXV1ZW5jb2RlJywgJ3V1ZScsICd4LXV1
ZScpOg0KCQlpbXBvcnQgdXUNCgkJcmV0dXJuIHV1LmRlY29kZShpbnB1dCwg
b3V0cHV0KQ0KCWlmIGRlY29kZXRhYi5oYXNfa2V5KGVuY29kaW5nKToNCgkJ
cGlwZXRocm91Z2goaW5wdXQsIGRlY29kZXRhYltlbmNvZGluZ10sIG91dHB1
dCkNCgllbHNlOg0KCQlyYWlzZSBWYWx1ZUVycm9yLCBcDQoJCSAgICAgICd1
bmtub3duIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICVzJyAlIGVuY29k
aW5nDQoNCmRlZiBlbmNvZGUoaW5wdXQsIG91dHB1dCwgZW5jb2RpbmcpOg0K
CWlmIGVuY29kaW5nID09ICdiYXNlNjQnOg0KCQlpbXBvcnQgYmFzZTY0DQoJ
CXJldHVybiBiYXNlNjQuZW5jb2RlKGlucHV0LCBvdXRwdXQpDQoJaWYgZW5j
b2RpbmcgPT0gJ3F1b3RlZC1wcmludGFibGUnOg0KCQlpbXBvcnQgcXVvcHJp
DQoJCXJldHVybiBxdW9wcmkuZW5jb2RlKGlucHV0LCBvdXRwdXQsIDApDQoJ
aWYgZW5jb2RpbmcgaW4gKCd1dWVuY29kZScsICd4LXV1ZW5jb2RlJywgJ3V1
ZScsICd4LXV1ZScpOg0KCQlpbXBvcnQgdXUNCgkJcmV0dXJuIHV1LmVuY29k
ZShpbnB1dCwgb3V0cHV0KQ0KCWlmIGVuY29kZXRhYi5oYXNfa2V5KGVuY29k
aW5nKToNCgkJcGlwZXRocm91Z2goaW5wdXQsIGVuY29kZXRhYltlbmNvZGlu
Z10sIG91dHB1dCkNCgllbHNlOg0KCQlyYWlzZSBWYWx1ZUVycm9yLCBcDQoJ
CSAgICAgICd1bmtub3duIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICVz
JyAlIGVuY29kaW5nDQoNCiMgVGhlIGZvbGxvd2luZyBpcyBubyBsb25nZXIg
dXNlZCBmb3Igc3RhbmRhcmQgZW5jb2RpbmdzDQoNCiMgWFhYIFRoaXMgcmVx
dWlyZXMgdGhhdCB1dWRlY29kZSBhbmQgbW1lbmNvZGUgYXJlIGluICRQQVRI
DQoNCnV1ZGVjb2RlX3BpcGUgPSAnJycoDQpURU1QPS90bXAvQHV1LiQkDQpz
ZWQgInMlXmJlZ2luIFswLTddWzAtN10qIC4qJWJlZ2luIDYwMCAkVEVNUCUi
IHwgdXVkZWNvZGUNCmNhdCAkVEVNUA0Kcm0gJFRFTVANCiknJycNCg0KZGVj
b2RldGFiID0gew0KCSd1dWVuY29kZSc6CQl1dWRlY29kZV9waXBlLA0KCSd4
LXV1ZW5jb2RlJzoJCXV1ZGVjb2RlX3BpcGUsDQoJJ3V1ZSc6CQkJdXVkZWNv
ZGVfcGlwZSwNCgkneC11dWUnOgkJdXVkZWNvZGVfcGlwZSwNCgkncXVvdGVk
LXByaW50YWJsZSc6CSdtbWVuY29kZSAtdSAtcScsDQoJJ2Jhc2U2NCc6CQkn
bW1lbmNvZGUgLXUgLWInLA0KfQ0KDQplbmNvZGV0YWIgPSB7DQoJJ3gtdXVl
bmNvZGUnOgkJJ3V1ZW5jb2RlIHRlbXBmaWxlJywNCgkndXVlbmNvZGUnOgkJ
J3V1ZW5jb2RlIHRlbXBmaWxlJywNCgkneC11dWUnOgkJJ3V1ZW5jb2RlIHRl
bXBmaWxlJywNCgkndXVlJzoJCQkndXVlbmNvZGUgdGVtcGZpbGUnLA0KCSdx
dW90ZWQtcHJpbnRhYmxlJzoJJ21tZW5jb2RlIC1xJywNCgknYmFzZTY0JzoJ
CSdtbWVuY29kZSAtYicsDQp9DQoNCmRlZiBwaXBldG8oaW5wdXQsIGNvbW1h
bmQpOg0KCXBpcGUgPSBvcy5wb3Blbihjb21tYW5kLCAndycpDQoJY29weWxp
dGVyYWwoaW5wdXQsIHBpcGUpDQoJcGlwZS5jbG9zZSgpDQoNCmRlZiBwaXBl
dGhyb3VnaChpbnB1dCwgY29tbWFuZCwgb3V0cHV0KToNCgl0ZW1wbmFtZSA9
IHRlbXBmaWxlLm1rdGVtcCgpDQoJdHJ5Og0KCQl0ZW1wID0gb3Blbih0ZW1w
bmFtZSwgJ3cnKQ0KCWV4Y2VwdCBJT0Vycm9yOg0KCQlwcmludCAnKioqIENh
bm5vdCBjcmVhdGUgdGVtcCBmaWxlJywgYHRlbXBuYW1lYA0KCQlyZXR1cm4N
Cgljb3B5bGl0ZXJhbChpbnB1dCwgdGVtcCkNCgl0ZW1wLmNsb3NlKCkNCglw
aXBlID0gb3MucG9wZW4oY29tbWFuZCArICcgPCcgKyB0ZW1wbmFtZSwgJ3In
KQ0KCWNvcHliaW5hcnkocGlwZSwgb3V0cHV0KQ0KCXBpcGUuY2xvc2UoKQ0K
CW9zLnVubGluayh0ZW1wbmFtZSkNCg0KZGVmIGNvcHlsaXRlcmFsKGlucHV0
LCBvdXRwdXQpOg0KCXdoaWxlIDE6DQoJCWxpbmUgPSBpbnB1dC5yZWFkbGlu
ZSgpDQoJCWlmIG5vdCBsaW5lOiBicmVhaw0KCQlvdXRwdXQud3JpdGUobGlu
ZSkNCg0KZGVmIGNvcHliaW5hcnkoaW5wdXQsIG91dHB1dCk6DQoJQlVGU0la
RSA9IDgxOTINCgl3aGlsZSAxOg0KCQlsaW5lID0gaW5wdXQucmVhZChCVUZT
SVpFKQ0KCQlpZiBub3QgbGluZTogYnJlYWsNCgkJb3V0cHV0LndyaXRlKGxp
bmUpDQo=
---221137916-2036866673-940150311=:30786--