Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Aug 2023 18:03:38 -0400
From:      "David E. Cross" <david@crossfamilyweb.com>
To:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   crypt(3) style password support for lua-loader
Message-ID:  <74a1eb5e-64a5-f8e7-c44e-55188539643a@crossfamilyweb.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------7ulGrikZoqg5HlrZ0BE7ZO0t
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

I sent this earlier from the wrong account and either -hackers bounced 
it, or -hackers is down, apologies if you get a dupe on this, but I also 
included a reviews.freebsd.org link this time)


Something that has always bothered me is the if you enable boot 
passwords with loader(8) they are stored *plaintext* in the loader.conf, 
so you need to make sure that file is root-only access and is just poor 
security in general.

Well, I decided to fix that.  See attached, also at:

https://reviews.freebsd.org/D41509


It is lua only, I evaluated doing a forth version to maintain parity 
with forth-loader, but that exceeds my available time at this point and 
I'd rather get this out there.

Includes loader.conf.5 documentation update.  This is tested and working 
in boot environment.  (... why doesn't lua-loader have math.*?);

additionally crypt.lua has commented-out test suite and validates 
against all crypt-sha256.c and crypt-sha512.c test vectors.


The only real gotcha with this is that crypt(3) style passwords use '$' 
in them and that must be escaped in loader.conf(5).  I debated switching 
this to ! or another character but decided to stick with $ as no matter 
what you will need to edit between strict crypt(3) format and what is 
placed in the config file, and this makes testing easier if the formats 
are the strictly identical.  That is even if I changed it to not need 
escaping, you'd still need to edit it anyway, so if you still have to 
edit, might as well keep the underlying format the same.


This gotcha is documented in the updated loader.conf(5)


Thanks.

--------------7ulGrikZoqg5HlrZ0BE7ZO0t
Content-Type: text/x-patch; charset=UTF-8; name="luahash.diff"
Content-Disposition: attachment; filename="luahash.diff"
Content-Transfer-Encoding: base64

ZGlmZiAtLWdpdCBhL3N0YW5kL2RlZmF1bHRzL2xvYWRlci5jb25mLjUgYi9zdGFuZC9kZWZh
dWx0cy9sb2FkZXIuY29uZi41CmluZGV4IDIzYTY1OTM1Yzk1Li5kZGQzMjdhOTM5ZCAxMDA2
NDQKLS0tIGEvc3RhbmQvZGVmYXVsdHMvbG9hZGVyLmNvbmYuNQorKysgYi9zdGFuZC9kZWZh
dWx0cy9sb2FkZXIuY29uZi41CkBAIC0xNzgsNyArMTc4LDE1IEBAIGlzIGRhbWFnZWQsIGxv
c3QsIG9yIHJlYWQgZnJvbSB0aGUgd3JvbmcgcGFydGl0aW9uLgogUHJvdGVjdCBib290IG1l
bnUgd2l0aCBhIHBhc3N3b3JkIHdpdGhvdXQgaW50ZXJydXB0aW5nCiAuSWMgYXV0b2Jvb3QK
IHByb2Nlc3MuCi1UaGUgcGFzc3dvcmQgc2hvdWxkIGJlIGluIGNsZWFyIHRleHQgZm9ybWF0
LgorVGhlIHBhc3N3b3JkIG1heSBiZSBpbiBjbGVhciB0ZXh0IGZvcm1hdCBvciB0aGUKK2x1
YS1sb2FkZXIgYWRkaXRpb25hbGx5IHN1cHBvcnRzCisuWHIgY3J5cHQgMworZm9ybWF0IHdp
dGggYWxnb3JpdGhtcyA1IChTSEEtMjU2KSBvciA2IChTSEEtNTEyKS4gIFdoZW4gdXNpbmcK
Ky5YciBjcnlwdCAzCitmb3JtYXQgcGFzc3dvcmRzIHJlbWVtYmVyIHRvIGVzY2FwZSBhbnkK
Ky5EcSBMaSBcW0RvXQord2l0aAorLkRxIExpIFxlIC4KIElmIGEgcGFzc3dvcmQgaXMgc2V0
LCBib290IG1lbnUgd2lsbCBub3QgYXBwZWFyIHVudGlsIGFueSBrZXkgaXMgcHJlc3NlZCBk
dXJpbmcKIGNvdW50ZG93biBwZXJpb2Qgc3BlY2lmaWVkIGJ5CiAuVmEgYXV0b2Jvb3RfZGVs
YXkKQEAgLTE5MCw3ICsxOTgsMTUgQEAgbWVudS4KIC5JdCBBciBib290bG9ja19wYXNzd29y
ZAogUHJvdmlkZXMgYSBwYXNzd29yZCB0byBiZSByZXF1aXJlZCBieSBjaGVjay1wYXNzd29y
ZCBiZWZvcmUgZXhlY3V0aW9uIGlzCiBhbGxvd2VkIHRvIGNvbnRpbnVlLgotVGhlIHBhc3N3
b3JkIHNob3VsZCBiZSBpbiBjbGVhciB0ZXh0IGZvcm1hdC4KK1RoZSBwYXNzd29yZCBtYXkg
YmUgaW4gY2xlYXIgdGV4dCBmb3JtYXQgb3IgdGhlCitsdWEtbG9hZGVyIGFkZGl0aW9uYWxs
eSBzdXBwb3J0cworLlhyIGNyeXB0IDMKK2Zvcm1hdCB3aXRoIGFsZ29yaXRobXMgNSAoU0hB
LTI1Nikgb3IgNiAoU0hBLTUxMikuICBXaGVuIHVzaW5nCisuWHIgY3J5cHQgMworZm9ybWF0
IHBhc3N3b3JkcyByZW1lbWJlciB0byBlc2NhcGUgYW55CisuRHEgTGkgXFtEb10KK3dpdGgK
Ky5EcSBMaSBcZSAuCiBJZiBhIHBhc3N3b3JkIGlzIHNldCwgdGhlIHVzZXIgbXVzdCBwcm92
aWRlIHNwZWNpZmllZCBwYXNzd29yZCB0byBib290LgogLkl0IEFyIHZlcmJvc2VfbG9hZGlu
ZwogSWYgc2V0IHRvCmRpZmYgLS1naXQgYS9zdGFuZC9sdWEvTWFrZWZpbGUgYi9zdGFuZC9s
dWEvTWFrZWZpbGUKaW5kZXggZmU2ZmQ2ZjYzYzguLmMyMjI1NGVlZTIxIDEwMDY0NAotLS0g
YS9zdGFuZC9sdWEvTWFrZWZpbGUKKysrIGIvc3RhbmQvbHVhL01ha2VmaWxlCkBAIC0xNyw3
ICsxNyw5IEBAIEZJTEVTPQljbGkubHVhIFwKIAljb2xvci5sdWEgXAogCWNvbmZpZy5sdWEg
XAogCWNvcmUubHVhIFwKKwljcnlwdC5sdWEgXAogCWRyYXdlci5sdWEgXAorCWhhc2hlcy5s
dWEgXAogCWhvb2subHVhIFwKIAlsb2FkZXIubHVhIFwKIAlnZngtYmVhc3RpZS5sdWEgXApk
aWZmIC0tZ2l0IGEvc3RhbmQvbHVhL2NyeXB0Lmx1YSBiL3N0YW5kL2x1YS9jcnlwdC5sdWEK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjNlODIyZGZiNTgxCi0t
LSAvZGV2L251bGwKKysrIGIvc3RhbmQvbHVhL2NyeXB0Lmx1YQpAQCAtMCwwICsxLDMyNiBA
QAorbG9jYWwgaGFzaGVzID0gcmVxdWlyZSgiaGFzaGVzIikKKworbG9jYWwgdGNwc2VyPSIk
NiQycGJjeVJrZ2c4TXZKLks4JGI3UDRKb2RaZ3hleldCSUUxeGlVUFk5YS8vOU5PcFRmR1dx
RExhMVdkMzdrY1pyUU4vczBoUC90SS5kUzJFL0V0dzd4RVRLNVRtVTlJUzlsa01vZGYxIgor
Citsb2NhbCBiNjRfYWxwaGFiZXQgPSB7Jy4nLCAnLycsICcwJywgJzEnLCAnMicsICczJywg
JzQnLCAnNScsICc2JywgJzcnLCAnOCcsCisJCSc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAn
RScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsCisJCSdMJywgJ00nLCAnTicsICdP
JywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsCisJCSdYJywgJ1kn
LCAnWicsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsCisJ
CSdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3Qn
LCAndScsCisJCSd2JywgJ3cnLCAneCcsICd5JywgJ3onfQorCitsb2NhbCBzaGFYX3JvdW5k
c19wcmVmaXggPSAicm91bmRzPSIKK2xvY2FsIHNoYVhfcm91bmRzX2RlZmF1bHQgPSA1MDAw
Citsb2NhbCBzaGFYX3JvdW5kc19taW4gPSAxMDAwCitsb2NhbCBzaGFYX3JvdW5kc19tYXgg
PSA5OTk5OTk5OTkKK2xvY2FsIHNoYVhfc2FsdF9tYXggPSAxNgorCitsb2NhbCBmdW5jdGlv
biBiNjRfZnJvbV8yNGJpdChiMiwgYjEsIGIwLCBuKQorCWxvY2FsIHcgPSAoKGIyICYgMHhm
ZikgPDwgMTYpIHwgKChiMSAmIDB4ZmYpIDw8IDgpIHwgKGIwICYgMHhmZikKKwlsb2NhbCBz
ID0gIiIKKwlmb3IgaSA9IDEsIG4gZG8KKwkJcyA9IHMgLi4gYjY0X2FscGhhYmV0WyAodyAm
IDB4M2YpICsgMV0KKwkJdyA9IHcgPj4gNgorCWVuZAorCXJldHVybiBzCitlbmQKKworbG9j
YWwgZnVuY3Rpb24gbWluKGEsIGIpCisJaWYgYSA8IGIgdGhlbgorCQlyZXR1cm4gYQorCWVu
ZAorCXJldHVybiBiCitlbmQKKworbG9jYWwgZnVuY3Rpb24gbWF4KGEsIGIpCisJaWYgYSA+
IGIgdGhlbgorCQlyZXR1cm4gYQorCWVuZAorCXJldHVybiBiCitlbmQKKworbG9jYWwgY3J5
cHQgPSB7fQorCitmdW5jdGlvbiBjcnlwdC5zaGEyNTYoc2FsdGhhc2gsIHBhc3N3b3JkKQor
CWxvY2FsIHJvdW5kcyA9IHNoYVhfcm91bmRzX2RlZmF1bHQKKwlsb2NhbCBjdXN0b21fcm91
bmRzPWZhbHNlCisKKwlpZiBzdHJpbmcuc3ViKHNhbHRoYXNoLCAxLCAjc2hhWF9yb3VuZHNf
cHJlZml4KSA9PSBzaGFYX3JvdW5kc19wcmVmaXggdGhlbgorCQlsb2NhbCBlbmRfcm91bmRz
ID0gc3RyaW5nLmZpbmQoc2FsdGhhc2gsICIlJCIpCisJCWlmIGVuZF9yb3VuZHMgfj0gbmls
IHRoZW4KKwkJCWxvY2FsIG5ld19yb3VuZHMgPSB0b251bWJlcihzdHJpbmcuc3ViKHNhbHRo
YXNoLCAjc2hhWF9yb3VuZHNfcHJlZml4ICsgMSwgZW5kX3JvdW5kcyAtIDEpKQorCQkJaWYg
bmV3X3JvdW5kcyB+PSBuaWwgdGhlbgorCQkJCXJvdW5kcyA9IG1heChzaGFYX3JvdW5kc19t
aW4sIG1pbihuZXdfcm91bmRzLCBzaGFYX3JvdW5kc19tYXgpKTsKKwkJCQljdXN0b21fcm91
bmRzPXRydWUKKwkJCQlzYWx0aGFzaCA9IHN0cmluZy5zdWIoc2FsdGhhc2gsIGVuZF9yb3Vu
ZHMgKyAxKQorCQkJZW5kCisJCWVuZAorCWVuZAorCWxvY2FsIHNhbHRzcGxpdCA9IHN0cmlu
Zy5maW5kKHNhbHRoYXNoLCAnJSQnKQorCWlmIHNhbHRzcGxpdCA9PSBuaWwgdGhlbgorCQlz
YWx0c3BsaXQgPSAjc2FsdGhhc2grMQorCWVuZAorCWlmIHNhbHRzcGxpdCA+IChzaGFYX3Nh
bHRfbWF4ICsgMSkgdGhlbgorCQlzYWx0c3BsaXQgPSBzaGFYX3NhbHRfbWF4ICsgMQorCWVu
ZAorCWxvY2FsIHNhbHQgPSBzdHJpbmcuc3ViKHNhbHRoYXNoLCAxLCBzYWx0c3BsaXQtMSkK
KworCWxvY2FsIHNoYTI1NiA9IGhhc2hlcy5zaGEyNTYoKQorCXNoYTI1NihwYXNzd29yZCkK
KwlzaGEyNTYoc2FsdCkKKworCWxvY2FsIHNoYTI1Nl9hbHQgPSBoYXNoZXMuc2hhMjU2KCkK
KwlzaGEyNTZfYWx0KHBhc3N3b3JkKQorCXNoYTI1Nl9hbHQoc2FsdCkKKwlzaGEyNTZfYWx0
KHBhc3N3b3JkKQorCisJbG9jYWwgYWx0X3Jlc3VsdCA9IHNoYTI1Nl9hbHQoKQorCS0tIGZv
ciBlYWNoIGNoYXJhY3RlciBvZiB0aGUgcGFzc3dvcmQsIGFkZCBhbHRfcmVzdWx0ICh3cmFw
cGluZyBhcyBuZWVkZWQpCisJZm9yIGNudCA9ICNwYXNzd29yZCwgMzMsIC0zMiBkbworCQlz
aGEyNTYoYWx0X3Jlc3VsdCkKKwllbmQKKwlzaGEyNTYoc3RyaW5nLnN1YihhbHRfcmVzdWx0
LCAxLCAjcGFzc3dvcmQgJSAzMikpCisKKwlsb2NhbCBjb3VudCA9ICNwYXNzd29yZAorCXdo
aWxlIGNvdW50ID4gMCBkbworCQlpZiAoY291bnQgJiAxKSB+PTAgdGhlbgorCQkJc2hhMjU2
KGFsdF9yZXN1bHQpCisJCWVsc2UKKwkJCXNoYTI1NihwYXNzd29yZCkKKwkJZW5kCisJCWNv
dW50ID0gY291bnQgPj4gMQorCWVuZAorCisJYWx0X3Jlc3VsdD1zaGEyNTYoKQorCisJLS0g
UCBzZXF1ZW5jZQorCXNoYTI1NiA9IGhhc2hlcy5zaGEyNTYoKQorCWZvciBjbnQ9MSwjcGFz
c3dvcmQgZG8KKwkJc2hhMjU2KHBhc3N3b3JkKQorCWVuZAorCWxvY2FsIHRlbXBfcmVzdWx0
ID0gc2hhMjU2KCkKKwlsb2NhbCBwX2J5dGVzID0gIiIKKworCXdoaWxlICNwX2J5dGVzIH49
ICNwYXNzd29yZCBkbworCQlwX2J5dGVzID0gcF9ieXRlcyAuLiBzdHJpbmcuc3ViKHRlbXBf
cmVzdWx0LCAxLAorCQkJbWluKCN0ZW1wX3Jlc3VsdCwgI3Bhc3N3b3JkLSNwX2J5dGVzKSkK
KwllbmQKKworCS0tIFMgc2VxdWVuY2UKKwlzaGEyNTYgPSBoYXNoZXMuc2hhMjU2KCkKKwlm
b3IgY250PTEsIDE2ICsgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMSkgZG8KKwkJc2hhMjU2
KHNhbHQpCisJZW5kCisJdGVtcF9yZXN1bHQgPSBzaGEyNTYoKQorCisJbG9jYWwgc19ieXRl
cyA9ICIiCisJd2hpbGUgI3NfYnl0ZXMgfj0gI3NhbHQgZG8KKwkJc19ieXRlcyA9IHNfYnl0
ZXMgLi4gc3RyaW5nLnN1Yih0ZW1wX3Jlc3VsdCwgMSwKKwkJCW1pbigjdGVtcF9yZXN1bHQs
ICNzYWx0IC0gI3NfYnl0ZXMpKQorCWVuZAorCisJZm9yIGNudD0wLCByb3VuZHMtMSBkbwor
CQlzaGEyNTYgPSBoYXNoZXMuc2hhMjU2KCkKKwkJaWYgKGNudCAmIDEpIH49IDAgdGhlbgor
CQkJc2hhMjU2KHBfYnl0ZXMpCisJCWVsc2UKKwkJCXNoYTI1NihhbHRfcmVzdWx0KQorCQll
bmQKKwkJaWYgKGNudCAlIDMpIH49IDAgdGhlbgorCQkJc2hhMjU2KHNfYnl0ZXMpCisJCWVu
ZAorCQlpZiAoY250ICUgNykgfj0gMCB0aGVuCisJCQlzaGEyNTYocF9ieXRlcykKKwkJZW5k
CisJCWlmIChjbnQgJiAxKSB+PSAwIHRoZW4KKwkJCXNoYTI1NihhbHRfcmVzdWx0KQorCQll
bHNlCisJCQlzaGEyNTYocF9ieXRlcykKKwkJZW5kCisJCWFsdF9yZXN1bHQgPSBzaGEyNTYo
KQorCWVuZAorCWxvY2FsIHMgPSAiJDUkIgorCWlmIGN1c3RvbV9yb3VuZHMgdGhlbgorCQlz
ID0gcyAuLiAicm91bmRzPSIgLi4gcm91bmRzIC4uICIkIgorCWVuZAorCisJcyA9IHMgLi4g
c2FsdCAuLiAiJCIKKwlzID0gcyAuLiBiNjRfZnJvbV8yNGJpdChzdHJpbmcuYnl0ZShhbHRf
cmVzdWx0LCAxKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMTEpLCBzdHJpbmcuYnl0ZShh
bHRfcmVzdWx0LCAyMSksIDQpOworCXMgPSBzIC4uIGI2NF9mcm9tXzI0Yml0KHN0cmluZy5i
eXRlKGFsdF9yZXN1bHQsIDIyKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMiksIHN0cmlu
Zy5ieXRlKGFsdF9yZXN1bHQsIDEyKSwgNCk7CisJcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQo
c3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMTMpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAy
MyksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDMpLCA0KTsKKwlzID0gcyAuLiBiNjRfZnJv
bV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA0KSwgc3RyaW5nLmJ5dGUoYWx0X3Jl
c3VsdCwgMTQpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAyNCksIDQpOworCXMgPSBzIC4u
IGI2NF9mcm9tXzI0Yml0KHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDI1KSwgc3RyaW5nLmJ5
dGUoYWx0X3Jlc3VsdCwgNSksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDE1KSwgNCk7CisJ
cyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMTYpLCBz
dHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAyNiksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDYp
LCA0KTsKKwlzID0gcyAuLiBiNjRfZnJvbV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0
LCA3KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMTcpLCBzdHJpbmcuYnl0ZShhbHRfcmVz
dWx0LCAyNyksIDQpOworCXMgPSBzIC4uIGI2NF9mcm9tXzI0Yml0KHN0cmluZy5ieXRlKGFs
dF9yZXN1bHQsIDI4KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgOCksIHN0cmluZy5ieXRl
KGFsdF9yZXN1bHQsIDE4KSwgNCk7CisJcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5n
LmJ5dGUoYWx0X3Jlc3VsdCwgMTkpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAyOSksIHN0
cmluZy5ieXRlKGFsdF9yZXN1bHQsIDkpLCA0KTsKKwlzID0gcyAuLiBiNjRfZnJvbV8yNGJp
dChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAxMCksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQs
IDIwKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMzApLCA0KTsKKwlzID0gcyAuLiBiNjRf
ZnJvbV8yNGJpdCgwLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAzMiksIHN0cmluZy5ieXRl
KGFsdF9yZXN1bHQsIDMxKSwgMyk7CisKKwlyZXR1cm4gcworZW5kCisKK2Z1bmN0aW9uIGNy
eXB0LnNoYTUxMihzYWx0aGFzaCwgcGFzc3dvcmQpCisJbG9jYWwgcm91bmRzID0gc2hhWF9y
b3VuZHNfZGVmYXVsdAorCWxvY2FsIGN1c3RvbV9yb3VuZHM9ZmFsc2UKKwlpZiBzdHJpbmcu
c3ViKHNhbHRoYXNoLCAxLCAjc2hhWF9yb3VuZHNfcHJlZml4KSA9PSBzaGFYX3JvdW5kc19w
cmVmaXggdGhlbgorCQlsb2NhbCBlbmRfcm91bmRzID0gc3RyaW5nLmZpbmQoc2FsdGhhc2gs
ICIlJCIpCisJCWlmIGVuZF9yb3VuZHMgfj0gbmlsIHRoZW4KKwkJCWxvY2FsIG5ld19yb3Vu
ZHMgPSB0b251bWJlcihzdHJpbmcuc3ViKHNhbHRoYXNoLCAjc2hhWF9yb3VuZHNfcHJlZml4
ICsgMSwgZW5kX3JvdW5kcyAtIDEpKQorCQkJaWYgbmV3X3JvdW5kcyB+PSBuaWwgdGhlbgor
CQkJCXJvdW5kcyA9IG1heChzaGFYX3JvdW5kc19taW4sIG1pbihuZXdfcm91bmRzLCBzaGFY
X3JvdW5kc19tYXgpKTsKKwkJCQljdXN0b21fcm91bmRzPXRydWUKKwkJCQlzYWx0aGFzaCA9
IHN0cmluZy5zdWIoc2FsdGhhc2gsIGVuZF9yb3VuZHMgKyAxKQorCQkJZW5kCisJCWVuZAor
CWVuZAorCWxvY2FsIHNhbHRzcGxpdCA9IHN0cmluZy5maW5kKHNhbHRoYXNoLCAnJSQnKQor
CWlmIHNhbHRzcGxpdCA9PSBuaWwgdGhlbgorCQlzYWx0c3BsaXQgPSAjc2FsdGhhc2grMQor
CWVuZAorCWlmIHNhbHRzcGxpdCA+IChzaGFYX3NhbHRfbWF4ICsgMSkgdGhlbgorCQlzYWx0
c3BsaXQgPSBzaGFYX3NhbHRfbWF4ICsgMQorCWVuZAorCWxvY2FsIHNhbHQgPSBzdHJpbmcu
c3ViKHNhbHRoYXNoLCAxLCBzYWx0c3BsaXQtMSkKKwlsb2NhbCBzaGE1MTIgPSBoYXNoZXMu
c2hhNTEyKCkKKworCXNoYTUxMihwYXNzd29yZCkKKworCXNoYTUxMihzYWx0KQorCisJbG9j
YWwgYWx0X3NoYTUxMiA9IGhhc2hlcy5zaGE1MTIoKQorCWFsdF9zaGE1MTIocGFzc3dvcmQp
CisJYWx0X3NoYTUxMihzYWx0KQorCWFsdF9zaGE1MTIocGFzc3dvcmQpCisJbG9jYWwgYWx0
X3Jlc3VsdCA9IGFsdF9zaGE1MTIoKQorCS0tIGZvciBlYWNoIGNoYXJhY3RlciBvZiB0aGUg
cGFzc3dvcmQgYWRkIHRoZSBhbHRfcmVzdWx0ICAod3JhcHBpbmcgYXMgbmVlZGVkKQorCWZv
ciBjbnQgPSAjcGFzc3dvcmQsIDY1LCAtNjQgZG8KKwkJc2hhNTEyKGFsdF9yZXN1bHQpCisJ
ZW5kCisJc2hhNTEyKHN0cmluZy5zdWIoYWx0X3Jlc3VsdCwgMSwgI3Bhc3N3b3JkICUgNjQp
KQorCisJbG9jYWwgY291bnQgPSAjcGFzc3dvcmQKKwl3aGlsZSBjb3VudCA+IDAgZG8KKwkJ
aWYgKGNvdW50ICYgMSkgfj0wIHRoZW4KKwkJCXNoYTUxMihhbHRfcmVzdWx0KQorCQllbHNl
CisJCQlzaGE1MTIocGFzc3dvcmQpCisJCWVuZAorCQljb3VudCA9IGNvdW50ID4+IDEKKwll
bmQKKworCS0tIFAgc2VxdWVuY2UKKwlhbHRfcmVzdWx0PXNoYTUxMigpCisJc2hhNTEyID0g
aGFzaGVzLnNoYTUxMigpCisJZm9yIGNudD0xLCNwYXNzd29yZCBkbworCQlzaGE1MTIocGFz
c3dvcmQpCisJZW5kCisJbG9jYWwgdGVtcF9yZXN1bHQgPSBzaGE1MTIoKQorCWxvY2FsIHBf
Ynl0ZXMgPSAiIgorCisJd2hpbGUgI3BfYnl0ZXMgfj0gI3Bhc3N3b3JkIGRvCisJCXBfYnl0
ZXMgPSBwX2J5dGVzIC4uIHN0cmluZy5zdWIodGVtcF9yZXN1bHQsIDEsCisJCQltaW4oI3Rl
bXBfcmVzdWx0LCAjcGFzc3dvcmQtI3BfYnl0ZXMpKQorCWVuZAorCisJLS0gUyBzZXF1ZW5j
ZQorCXNoYTUxMiA9IGhhc2hlcy5zaGE1MTIoKQorCWZvciBjbnQ9MSwgMTYgKyBzdHJpbmcu
Ynl0ZShhbHRfcmVzdWx0LCAxKSBkbworCQlzaGE1MTIoc2FsdCkKKwllbmQKKwl0ZW1wX3Jl
c3VsdCA9IHNoYTUxMigpCisKKwlsb2NhbCBzX2J5dGVzID0gIiIKKwl3aGlsZSAjc19ieXRl
cyB+PSAjc2FsdCBkbworCQlzX2J5dGVzID0gc19ieXRlcyAuLiBzdHJpbmcuc3ViKHRlbXBf
cmVzdWx0LCAxLAorCQkJbWluKCN0ZW1wX3Jlc3VsdCwgI3NhbHQgLSAjc19ieXRlcykpCisJ
ZW5kCisKKwlmb3IgY250PTAsIHJvdW5kcy0xIGRvCisJCXNoYTUxMiA9IGhhc2hlcy5zaGE1
MTIoKQorCQlpZiAoY250ICYgMSkgfj0gMCB0aGVuCisJCQlzaGE1MTIocF9ieXRlcykKKwkJ
ZWxzZQorCQkJc2hhNTEyKGFsdF9yZXN1bHQpCisJCWVuZAorCQlpZiAoY250ICUgMykgfj0g
MCB0aGVuCisJCQlzaGE1MTIoc19ieXRlcykKKwkJZW5kCisJCWlmIChjbnQgJSA3KSB+PSAw
IHRoZW4KKwkJCXNoYTUxMihwX2J5dGVzKQorCQllbmQKKwkJaWYgKGNudCAmIDEpIH49IDAg
dGhlbgorCQkJc2hhNTEyKGFsdF9yZXN1bHQpCisJCWVsc2UKKwkJCXNoYTUxMihwX2J5dGVz
KQorCQllbmQKKwkJYWx0X3Jlc3VsdCA9IHNoYTUxMigpCisJZW5kCisJbG9jYWwgcyA9ICIk
NiQiCisJaWYgY3VzdG9tX3JvdW5kcyB0aGVuCisJCXMgPSBzIC4uICJyb3VuZHM9IiAuLiBy
b3VuZHMgLi4gIiQiCisJZW5kCisJcyA9IHMgLi4gc2FsdCAuLiAiJCIKKyAgICAgICAgcyA9
IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMSksIHN0cmlu
Zy5ieXRlKGFsdF9yZXN1bHQsIDIyKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNDMpLCA0
KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jl
c3VsdCwgMjMpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA0NCksIHN0cmluZy5ieXRlKGFs
dF9yZXN1bHQsIDIpLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3Ry
aW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNDUpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAzKSwg
c3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMjQpLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0
X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNCksIHN0cmluZy5ieXRlKGFs
dF9yZXN1bHQsIDI1KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNDYpLCA0KTsKKyAgICAg
ICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMjYp
LCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA0NyksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQs
IDUpLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUo
YWx0X3Jlc3VsdCwgNDgpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA2KSwgc3RyaW5nLmJ5
dGUoYWx0X3Jlc3VsdCwgMjcpLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRi
aXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNyksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQs
IDI4KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNDkpLCA0KTsKKyAgICAgICAgcyA9IHMg
Li4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMjkpLCBzdHJpbmcu
Ynl0ZShhbHRfcmVzdWx0LCA1MCksIHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDgpLCA0KTsK
KyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3Vs
dCwgNTEpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA5KSwgc3RyaW5nLmJ5dGUoYWx0X3Jl
c3VsdCwgMzApLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5n
LmJ5dGUoYWx0X3Jlc3VsdCwgMTApLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAzMSksIHN0
cmluZy5ieXRlKGFsdF9yZXN1bHQsIDUyKSwgNCk7CisgICAgICAgIHMgPSBzIC4uIGI2NF9m
cm9tXzI0Yml0KHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDMyKSwgc3RyaW5nLmJ5dGUoYWx0
X3Jlc3VsdCwgNTMpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAxMSksIDQpOworICAgICAg
ICBzID0gcyAuLiBiNjRfZnJvbV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA1NCks
IHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDEyKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwg
MzMpLCA0KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUo
YWx0X3Jlc3VsdCwgMTMpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAzNCksIHN0cmluZy5i
eXRlKGFsdF9yZXN1bHQsIDU1KSwgNCk7CisgICAgICAgIHMgPSBzIC4uIGI2NF9mcm9tXzI0
Yml0KHN0cmluZy5ieXRlKGFsdF9yZXN1bHQsIDM1KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3Vs
dCwgNTYpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAxNCksIDQpOworICAgICAgICBzID0g
cyAuLiBiNjRfZnJvbV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA1NyksIHN0cmlu
Zy5ieXRlKGFsdF9yZXN1bHQsIDE1KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMzYpLCA0
KTsKKyAgICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jl
c3VsdCwgMTYpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAzNyksIHN0cmluZy5ieXRlKGFs
dF9yZXN1bHQsIDU4KSwgNCk7CisgICAgICAgIHMgPSBzIC4uIGI2NF9mcm9tXzI0Yml0KHN0
cmluZy5ieXRlKGFsdF9yZXN1bHQsIDM4KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNTkp
LCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCAxNyksIDQpOworICAgICAgICBzID0gcyAuLiBi
NjRfZnJvbV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA2MCksIHN0cmluZy5ieXRl
KGFsdF9yZXN1bHQsIDE4KSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgMzkpLCA0KTsKKyAg
ICAgICAgcyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwg
MTkpLCBzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA0MCksIHN0cmluZy5ieXRlKGFsdF9yZXN1
bHQsIDYxKSwgNCk7CisgICAgICAgIHMgPSBzIC4uIGI2NF9mcm9tXzI0Yml0KHN0cmluZy5i
eXRlKGFsdF9yZXN1bHQsIDQxKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNjIpLCBzdHJp
bmcuYnl0ZShhbHRfcmVzdWx0LCAyMCksIDQpOworICAgICAgICBzID0gcyAuLiBiNjRfZnJv
bV8yNGJpdChzdHJpbmcuYnl0ZShhbHRfcmVzdWx0LCA2MyksIHN0cmluZy5ieXRlKGFsdF9y
ZXN1bHQsIDIxKSwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwgNDIpLCA0KTsKKyAgICAgICAg
cyA9IHMgLi4gYjY0X2Zyb21fMjRiaXQoMCwgMCwgc3RyaW5nLmJ5dGUoYWx0X3Jlc3VsdCwg
NjQpLCAyKTsKKworCXJldHVybiBzCitlbmQKKworZnVuY3Rpb24gY3J5cHQuY29tcGFyZShl
bnRlcmVkLCBzdG9yZWQpCisJYWxnb3JpdGhtID0gc3RyaW5nLnN1YihzdG9yZWQsIDEsIDMp
CisJc2FsdGhhc2ggPSBzdHJpbmcuc3ViKHN0b3JlZCw0KQorCWlmICAgICBhbGdvcml0aG0g
PT0gJyQ1JCcgdGhlbiBoYXNoZWQgPSBjcnlwdC5zaGEyNTYoc2FsdGhhc2gsIGVudGVyZWQp
CisgICAgICAgIGVsc2VpZiBhbGdvcml0aG0gPT0gJyQ2JCcgdGhlbiBoYXNoZWQgPSBjcnlw
dC5zaGE1MTIoc2FsdGhhc2gsIGVudGVyZWQpCisgICAgICAgIGVsc2UgcmV0dXJuIG5pbAor
CWVuZAorCWlmIGhhc2hlZCB+PSBuaWwgIHRoZW4KKwkJcmV0dXJuIGhhc2hlZCA9PSBzdG9y
ZWQKKwllbmQKKwlyZXR1cm4gbmlsCitlbmQKKworLS1bWworLS0gdGVzdHMKKworLS1zaGE1
MTIgLS0gY29waWVkIGZyb20gY3J5cHQtc2hhNTEyLmMKK2Fzc2VydChjcnlwdC5zaGE1MTIo
InNhbHRzdHJpbmciLCAiSGVsbG8gd29ybGQhIikgPT0gIiQ2JHNhbHRzdHJpbmckc3ZuOFVv
U1ZhcE50TXVxMXVrS1M0dFBRZDhpS3dTTUhXamwvTzgxN0czdUJuSUZOam5RSnVlc0k2OHU0
T1RMaUJGZGNiWUVkRkNvRU9mYVMzNWluejEiKQorYXNzZXJ0KGNyeXB0LnNoYTUxMigicm91
bmRzPTEwMDAwJHNhbHRzdHJpbmdzYWx0c3RyaW5nIiwgIkhlbGxvIHdvcmxkISIpID09ICIk
NiRyb3VuZHM9MTAwMDAkc2FsdHN0cmluZ3NhbHRzdCRPVzEvTzZCWUhWNkJjWFp1OFFWZVhi
RFdyYTNPZXFoMHNiSGJiTUNWTlNuQ00vVXJqbU0wRHA4dk91WmVIQnkvWVRCbVNLNkg5cXMv
eTNSbk9hdzV2LiIpCithc3NlcnQoY3J5cHQuc2hhNTEyKCJyb3VuZHM9NTAwMCR0b29sb25n
c2FsdHN0cmluZyIsICJUaGlzIGlzIGp1c3QgYSB0ZXN0IikgPT0gIiQ2JHJvdW5kcz01MDAw
JHRvb2xvbmdzYWx0c3RyaW4kbFE4am9saGdWUlZoWTRiNXBaS2F5c0NMaTBRQnhHb05lS1F6
UTNnbE1od2xsRjdvR0RaeFVoeDF5eGRZY3ovZTFKU2JxM3k2Sk14eGw4YXVka1VFbTAiKQor
YXNzZXJ0KGNyeXB0LnNoYTUxMigicm91bmRzPTE0MDAkYW5vdGhlcmxvbmdzYWx0c3RyaW5n
IiwgImEgdmVyeSBtdWNoIGxvbmdlciB0ZXh0IHRvIGVuY3J5cHQuICBUaGlzIG9uZSBldmVu
IHN0cmV0Y2hlcyBvdmVyIG1vcmV0aGFuIG9uZSBsaW5lLiIpID09ICIkNiRyb3VuZHM9MTQw
MCRhbm90aGVybG9uZ3NhbHRzJFBPZll3VEVvazk3VldjanhJaVNPaml5a3RpLm8vcFFzLndQ
dk14UTZGbTdJNklvWU4zQ21MczY2eDl0MG9Td2J0RVc3bzdVbUpFaUR3R3FkOHA0dXIxIikK
K2Fzc2VydChjcnlwdC5zaGE1MTIoInJvdW5kcz03Nzc3NyRzaG9ydCIsICJ3ZSBoYXZlIGEg
c2hvcnQgc2FsdCBzdHJpbmcgYnV0IG5vdCBhIHNob3J0IHBhc3N3b3JkIikgPT0gIiQ2JHJv
dW5kcz03Nzc3NyRzaG9ydCRXdVF5VzJZUi5oQk5wampSaHBZRC9pZkl3MDV4ZGZlRXlRb014
SVhia3ZyMGdnZTFhMXgzeVJVTEo1Q0NhVWVPeEZtdGxjR1plbEZsNUN4dGdmaUFjMCIpCith
c3NlcnQoY3J5cHQuc2hhNTEyKCJyb3VuZHM9MTIzNDU2JGFzYWx0b2YxNmNoYXJzLi4iLCAi
YSBzaG9ydCBzdHJpbmciKSA9PSAiJDYkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4u
JEJ0Q3dqcU1KR3g1aHJKaFp5d1d2dDBSTEU4dVo0b1B3Y2VsQ2ptdzJrU1l1LkVjNnljVUxl
dm9CSzI1ZnMyeFhnTU5yQ3pJTVZjZ0VKQXN0SmVvbmoxIikKK2Fzc2VydChjcnlwdC5zaGE1
MTIoInJvdW5kcz0xMCRyb3VuZHN0b29sb3ciLCAidGhlIG1pbmltdW0gbnVtYmVyIGlzIHN0
aWxsIG9ic2VydmVkIikgPT0gIiQ2JHJvdW5kcz0xMDAwJHJvdW5kc3Rvb2xvdyRrVU1zYmUz
MDZuMjFwOVIuRlJrVzNJR24uUzlOUE4weDUwWWhIMXhoTHNQdVdHc1VTa2xadDU4amFUZkY0
WkVRcHlVTkdjMGRxYnBCWVlCYUhIcnNYLiIpCisKKy0tIHNoYTI1NiAtLSBjb3BpZWQgZnJv
bSBjcnlwdC1zaGEyNTYuYworYXNzZXJ0KGNyeXB0LnNoYTI1Nigic2FsdHN0cmluZyIsICJI
ZWxsbyB3b3JsZCEiKSA9PSAiJDUkc2FsdHN0cmluZyQ1Qjh2WVlpWS5DVnQxUmxUVGY4S2JY
QkgzaHN4WS9HTm9vWmFCQkdXRWM1IikKK2Fzc2VydChjcnlwdC5zaGEyNTYoInJvdW5kcz0x
MDAwMCRzYWx0c3RyaW5nc2FsdHN0cmluZyIsICJIZWxsbyB3b3JsZCEiKSA9PSAiJDUkcm91
bmRzPTEwMDAwJHNhbHRzdHJpbmdzYWx0c3QkM3h2LlZiU0hCYjQxQUw5QXZMZXVqWmtaUkJB
d3FGTXoyLm9wcWV5NkljQSIpCithc3NlcnQoY3J5cHQuc2hhMjU2KCJyb3VuZHM9NTAwMCR0
b29sb25nc2FsdHN0cmluZyIsICJUaGlzIGlzIGp1c3QgYSB0ZXN0IikgPT0gIiQ1JHJvdW5k
cz01MDAwJHRvb2xvbmdzYWx0c3RyaW4kVW4vNWp6QUhNZ09HWjUubVdKcHVWb2xpbDA3Z3VI
UHZPVzhtR1JjdnhhNSIpCithc3NlcnQoY3J5cHQuc2hhMjU2KCJyb3VuZHM9MTQwMCRhbm90
aGVybG9uZ3NhbHRzdHJpbmciLCAiYSB2ZXJ5IG11Y2ggbG9uZ2VyIHRleHQgdG8gZW5jcnlw
dC4gIFRoaXMgb25lIGV2ZW4gc3RyZXRjaGVzIG92ZXIgbW9yZXRoYW4gb25lIGxpbmUuIikg
PT0gIiQ1JHJvdW5kcz0xNDAwJGFub3RoZXJsb25nc2FsdHMkUnguajhILmg4SGpFREdvbUZV
OGJEa1htM1hJVW56eXhmMTJvUDg0Qm5xMSIpCithc3NlcnQoY3J5cHQuc2hhMjU2KCJyb3Vu
ZHM9Nzc3Nzckc2hvcnQiLCAid2UgaGF2ZSBhIHNob3J0IHNhbHQgc3RyaW5nIGJ1dCBub3Qg
YSBzaG9ydCBwYXNzd29yZCIpID09ICIkNSRyb3VuZHM9Nzc3Nzckc2hvcnQkSmlPMU8zWnBE
QXhHSmVhREl1cUNvRUZ5c0FlMW1aTkpSczNwdzBLUVJkLyIpCithc3NlcnQoY3J5cHQuc2hh
MjU2KCJyb3VuZHM9MTIzNDU2JGFzYWx0b2YxNmNoYXJzLi4iLCAiYSBzaG9ydCBzdHJpbmci
KSA9PSAiJDUkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4uJGdQM1ZRLzZYN1VVRVcz
SGtCbjJ3MS9QdHEyanhQeXpWL2NaS21GL3dKdkQiKQorYXNzZXJ0KGNyeXB0LnNoYTI1Nigi
cm91bmRzPTEwJHJvdW5kc3Rvb2xvdyIsICJ0aGUgbWluaW11bSBudW1iZXIgaXMgc3RpbGwg
b2JzZXJ2ZWQiKSA9PSAiJDUkcm91bmRzPTEwMDAkcm91bmRzdG9vbG93JHlmdndjV3JROGwv
SzBEQVd5dVBNRE5IcElWbFRRZWJZOWwvZ0w5NzJiSUMiKQorCistLV1dCisKK3JldHVybiBj
cnlwdApkaWZmIC0tZ2l0IGEvc3RhbmQvbHVhL2hhc2hlcy5sdWEgYi9zdGFuZC9sdWEvaGFz
aGVzLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjZlMjE5
ZTUxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFuZC9sdWEvaGFzaGVzLmx1YQpAQCAtMCww
ICsxLDI0MCBAQAorbG9jYWwgc2hhMjU2X2sgPSB7MHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwg
MHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwKKwkJMHg1OWYxMTFmMSwgMHg5
MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwKKwkJMHgyNDMx
ODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywK
KwkJMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgy
NDBjYTFjYywKKwkJMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5
ODhkYSwgMHg5ODNlNTE1MiwKKwkJMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2Zj
NywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywKKwkJMHgwNmNhNjM1MSwgMHgxNDI5Mjk2Nywg
MHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywKKwkJMHg1MzM4MGQxMywgMHg2
NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwKKwkJMHhhMmJm
ZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwK
KwkJMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgx
ZTM3NmMwOCwKKwkJMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4
YWE0YSwgMHg1YjljY2E0ZiwKKwkJMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2
ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwKKwkJMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwg
MHhiZWY5YTNmNywgMHhjNjcxNzhmMiB9CisKKworbG9jYWwgc2hhNTEyX2sgPSB7MHg0Mjhh
MmY5OGQ3MjhhZTIyLCAweDcxMzc0NDkxMjNlZjY1Y2QsIDB4YjVjMGZiY2ZlYzRkM2IyZiwK
KwkJMHhlOWI1ZGJhNTgxODlkYmJjLCAweDM5NTZjMjViZjM0OGI1MzgsIDB4NTlmMTExZjFi
NjA1ZDAxOSwKKwkJMHg5MjNmODJhNGFmMTk0ZjliLCAweGFiMWM1ZWQ1ZGE2ZDgxMTgsIDB4
ZDgwN2FhOThhMzAzMDI0MiwKKwkJMHgxMjgzNWIwMTQ1NzA2ZmJlLCAweDI0MzE4NWJlNGVl
NGIyOGMsIDB4NTUwYzdkYzNkNWZmYjRlMiwKKwkJMHg3MmJlNWQ3NGYyN2I4OTZmLCAweDgw
ZGViMWZlM2IxNjk2YjEsIDB4OWJkYzA2YTcyNWM3MTIzNSwKKwkJMHhjMTliZjE3NGNmNjky
Njk0LCAweGU0OWI2OWMxOWVmMTRhZDIsIDB4ZWZiZTQ3ODYzODRmMjVlMywKKwkJMHgwZmMx
OWRjNjhiOGNkNWI1LCAweDI0MGNhMWNjNzdhYzljNjUsIDB4MmRlOTJjNmY1OTJiMDI3NSwK
KwkJMHg0YTc0ODRhYTZlYTZlNDgzLCAweDVjYjBhOWRjYmQ0MWZiZDQsIDB4NzZmOTg4ZGE4
MzExNTNiNSwKKwkJMHg5ODNlNTE1MmVlNjZkZmFiLCAweGE4MzFjNjZkMmRiNDMyMTAsIDB4
YjAwMzI3Yzg5OGZiMjEzZiwKKwkJMHhiZjU5N2ZjN2JlZWYwZWU0LCAweGM2ZTAwYmYzM2Rh
ODhmYzIsIDB4ZDVhNzkxNDc5MzBhYTcyNSwKKwkJMHgwNmNhNjM1MWUwMDM4MjZmLCAweDE0
MjkyOTY3MGEwZTZlNzAsIDB4MjdiNzBhODU0NmQyMmZmYywKKwkJMHgyZTFiMjEzODVjMjZj
OTI2LCAweDRkMmM2ZGZjNWFjNDJhZWQsIDB4NTMzODBkMTM5ZDk1YjNkZiwKKwkJMHg2NTBh
NzM1NDhiYWY2M2RlLCAweDc2NmEwYWJiM2M3N2IyYTgsIDB4ODFjMmM5MmU0N2VkYWVlNiwK
KwkJMHg5MjcyMmM4NTE0ODIzNTNiLCAweGEyYmZlOGExNGNmMTAzNjQsIDB4YTgxYTY2NGJi
YzQyMzAwMSwKKwkJMHhjMjRiOGI3MGQwZjg5NzkxLCAweGM3NmM1MWEzMDY1NGJlMzAsIDB4
ZDE5MmU4MTlkNmVmNTIxOCwKKwkJMHhkNjk5MDYyNDU1NjVhOTEwLCAweGY0MGUzNTg1NTc3
MTIwMmEsIDB4MTA2YWEwNzAzMmJiZDFiOCwKKwkJMHgxOWE0YzExNmI4ZDJkMGM4LCAweDFl
Mzc2YzA4NTE0MWFiNTMsIDB4Mjc0ODc3NGNkZjhlZWI5OSwKKwkJMHgzNGIwYmNiNWUxOWI0
OGE4LCAweDM5MWMwY2IzYzVjOTVhNjMsIDB4NGVkOGFhNGFlMzQxOGFjYiwKKwkJMHg1Yjlj
Y2E0Zjc3NjNlMzczLCAweDY4MmU2ZmYzZDZiMmI4YTMsIDB4NzQ4ZjgyZWU1ZGVmYjJmYywK
KwkJMHg3OGE1NjM2ZjQzMTcyZjYwLCAweDg0Yzg3ODE0YTFmMGFiNzIsIDB4OGNjNzAyMDgx
YTY0MzllYywKKwkJMHg5MGJlZmZmYTIzNjMxZTI4LCAweGE0NTA2Y2ViZGU4MmJkZTksIDB4
YmVmOWEzZjdiMmM2NzkxNSwKKwkJMHhjNjcxNzhmMmUzNzI1MzJiLCAweGNhMjczZWNlZWEy
NjYxOWMsIDB4ZDE4NmI4YzcyMWMwYzIwNywKKwkJMHhlYWRhN2RkNmNkZTBlYjFlLCAweGY1
N2Q0ZjdmZWU2ZWQxNzgsIDB4MDZmMDY3YWE3MjE3NmZiYSwKKwkJMHgwYTYzN2RjNWEyYzg5
OGE2LCAweDExM2Y5ODA0YmVmOTBkYWUsIDB4MWI3MTBiMzUxMzFjNDcxYiwKKwkJMHgyOGRi
NzdmNTIzMDQ3ZDg0LCAweDMyY2FhYjdiNDBjNzI0OTMsIDB4M2M5ZWJlMGExNWM5YmViYywK
KwkJMHg0MzFkNjdjNDljMTAwZDRjLCAweDRjYzVkNGJlY2IzZTQyYjYsIDB4NTk3ZjI5OWNm
YzY1N2UyYSwKKwkJMHg1ZmNiNmZhYjNhZDZmYWVjLCAweDZjNDQxOThjNGE0NzU4MTcgfQor
Citsb2NhbCBmdW5jdGlvbiBtYXNrbihzaXplKQorCXJldHVybiB+KH4wIDw8IHNpemUpCitl
bmQKKworbG9jYWwgZnVuY3Rpb24gcm9yKG4sIGJpdHMsIHNpemUpCisJcmV0dXJuIChuID4+
IGJpdHMpIHwgKChuIDw8IHNpemUgLSBiaXRzKSAmIG1hc2tuKHNpemUpKQorZW5kCisKK2xv
Y2FsIGZ1bmN0aW9uIHN0cmluZzJudW1iZXIocywgaSwgbGVuKQorCWxvY2FsIG4gPSAwCisJ
Zm9yIGkgPSBpLCBpICsgbGVuIC0gMSBkbworCQluID0gKG48PDgpICsgc3RyaW5nLmJ5dGUo
cywgaSkKKwllbmQKKwlyZXR1cm4gbgorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHNoYTUxMl9i
bG9jayhILCBjaHVuaykKKwlsb2NhbCB3ID0ge30KKwlmb3IgaSA9IDEsIDE2IGRvCisJCXdb
aV0gPSBzdHJpbmcybnVtYmVyKGNodW5rLCAoKGktMSkgKiA4KSsxLCA4KQorCWVuZAorCisJ
Zm9yIGkgPSAxNywgODAgZG8KKwkJbG9jYWwgdiA9IHdbaSAtIDE1XQorCQlsb2NhbCBzMCA9
IHJvcih2LCAxLCA2NCkgfiByb3IodiwgOCwgNjQpIH4gKHYgPj4gNykKKwkJdiA9IHdbaSAt
IDJdCisJCWxvY2FsIHMxID0gcm9yKHYsIDE5LCA2NCkgfiByb3IodiwgNjEsIDY0KSB+ICh2
ID4+IDYpCisJCXdbaV0gPSAod1tpIC0gMTZdICsgczAgKyB3W2kgLSA3XSArIHMxKSAmIG1h
c2tuKDY0KQorCWVuZAorCWxvY2FsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGggPSBIWzFdLCBI
WzJdLCBIWzNdLCBIWzRdLCBIWzVdLCBIWzZdLCBIWzddLCBIWzhdCisKKwlmb3IgaT0xLCA4
MCBkbworCQlsb2NhbCBzMCA9IHJvcihhLCAyOCwgNjQpIH4gcm9yKGEsIDM0LCA2NCkgfiBy
b3IoYSwgMzksIDY0KQorCQlsb2NhbCBtYWogPSAoYSAmIGIpIH4gKGEgJiBjKSB+IChiICYg
YykKKwkJbG9jYWwgdDIgPSBzMCArIG1hagorCQlsb2NhbCBzMSA9IHJvcihlLCAxNCwgNjQp
IH4gcm9yKGUsIDE4LCA2NCkgfiByb3IoZSwgNDEsIDY0KQorCQlsb2NhbCBjaCA9IChlICYg
ZikgfiAofmUgJiBnKQorCQlsb2NhbCB0MSA9IGggKyBzMSArIGNoICsgc2hhNTEyX2tbaV0g
KyB3W2ldCisKKwkJaCA9IGcKKwkJZyA9IGYKKwkJZiA9IGUKKwkJZSA9IChkICsgdDEpICYg
bWFza24oNjQpCisJCWQgPSBjCisJCWMgPSBiCisJCWIgPSBhCisJCWEgPSAodDEgKyB0Mikg
JiBtYXNrbig2NCkKKwllbmQKKwlIWzFdID0gbWFza24oNjQpICYgKEhbMV0gKyBhKQorCUhb
Ml0gPSBtYXNrbig2NCkgJiAoSFsyXSArIGIpCisJSFszXSA9IG1hc2tuKDY0KSAmIChIWzNd
ICsgYykKKwlIWzRdID0gbWFza24oNjQpICYgKEhbNF0gKyBkKQorCUhbNV0gPSBtYXNrbig2
NCkgJiAoSFs1XSArIGUpCisJSFs2XSA9IG1hc2tuKDY0KSAmIChIWzZdICsgZikKKwlIWzdd
ID0gbWFza24oNjQpICYgKEhbN10gKyBnKQorCUhbOF0gPSBtYXNrbig2NCkgJiAoSFs4XSAr
IGgpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gc2hhMjU2X2Jsb2NrKEgsIGNodW5rKQorCWxv
Y2FsIHcgPSB7fQorCWZvciBpID0gMSwgMTYgZG8KKwkJd1tpXSA9IHN0cmluZzJudW1iZXIo
Y2h1bmssICgoaS0xKSAqIDQpKzEsIDQpCisgICAgICAgIGVuZAorCisJZm9yIGkgPSAxNywg
NjQgZG8KKwkJbG9jYWwgdiA9IHdbaSAtIDE1XQorCQlsb2NhbCBzMCA9IHJvcih2LCA3LCAz
MikgfiByb3IodiwgMTgsIDMyKSB+ICh2ID4+IDMpCisJCXYgPSB3W2kgLSAyXQorCQlsb2Nh
bCBzMSA9IHJvcih2LCAxNywgMzIpIH4gcm9yKHYsIDE5LCAzMikgfiAodiA+PiAxMCkKKwkJ
d1tpXSA9ICh3W2kgLSAxNl0gKyBzMCArIHdbaSAtIDddICsgczEpICYgbWFza24oMzIpCisJ
ZW5kCisJbG9jYWwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCA9IEhbMV0sIEhbMl0sIEhbM10s
IEhbNF0sIEhbNV0sIEhbNl0sIEhbN10sIEhbOF0KKworCWZvciBpPTEsIDY0IGRvCisJCWxv
Y2FsIHMwID0gcm9yKGEsIDIsIDMyKSB+IHJvcihhLCAxMywgMzIpIH4gcm9yKGEsIDIyLCAz
MikKKwkJbG9jYWwgbWFqID0gKGEgJiBiKSB+IChhICYgYykgfiAoYiAmIGMpCisJCWxvY2Fs
IHQyID0gczAgKyBtYWoKKwkJbG9jYWwgczEgPSByb3IoZSwgNiwgMzIpIH4gcm9yKGUsIDEx
LCAzMikgfiByb3IoZSwgMjUsIDMyKQorCQlsb2NhbCBjaCA9IChlICYgZikgfiAofmUgJiBn
KQorCQlsb2NhbCB0MSA9IGggKyBzMSArIGNoICsgc2hhMjU2X2tbaV0gKyB3W2ldCisKKwkJ
aCA9IGcKKwkJZyA9IGYKKwkJZiA9IGUKKwkJZSA9IChkICsgdDEpICYgbWFza24oMzIpCisJ
CWQgPSBjCisJCWMgPSBiCisJCWIgPSBhCisJCWEgPSAodDEgKyB0MikgJiBtYXNrbigzMikK
KwllbmQKKwlIWzFdID0gbWFza24oMzIpICYgKEhbMV0gKyBhKQorCUhbMl0gPSBtYXNrbigz
MikgJiAoSFsyXSArIGIpCisJSFszXSA9IG1hc2tuKDMyKSAmIChIWzNdICsgYykKKwlIWzRd
ID0gbWFza24oMzIpICYgKEhbNF0gKyBkKQorCUhbNV0gPSBtYXNrbigzMikgJiAoSFs1XSAr
IGUpCisJSFs2XSA9IG1hc2tuKDMyKSAmIChIWzZdICsgZikKKwlIWzddID0gbWFza24oMzIp
ICYgKEhbN10gKyBnKQorCUhbOF0gPSBtYXNrbigzMikgJiAoSFs4XSArIGgpCitlbmQKKwor
bG9jYWwgZnVuY3Rpb24gbnVtYmVyMnN0cmluZyhuLCBsZW5ndGgpCisJbG9jYWwgcyA9ICIi
CisJZm9yIGk9MSwgbGVuZ3RoIGRvCisJCWxvY2FsIHJlbSA9IG4gJSAyNTYKKwkJcyA9IHN0
cmluZy5jaGFyKHJlbSkgLi4gcworCQluID0gbiA+PiA4CisJZW5kCisJcmV0dXJuIHMKK2Vu
ZAorCitsb2NhbCBmdW5jdGlvbiBzaGEyNTYobXNnKQorCWxvY2FsIGJ1ZmZlciA9ICIiCisJ
bG9jYWwgbGVuZ3RoID0gMAorCWxvY2FsIEggPSB7MHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwg
MHgzYzZlZjM3MiwgMHhhNTRmZjUzYSwgMHg1MTBlNTI3ZiwKKwkJMHg5YjA1Njg4YywgMHgx
ZjgzZDlhYiwgMHg1YmUwY2QxOSB9CisJbG9jYWwgZnVuY3Rpb24gdXBkYXRlKG1zZykKKwkJ
aWYgbXNnIHRoZW4KKwkJCWxvY2FsIG9mZnNldCA9IDEKKwkJCWxvY2FsIGVuZHJhbmdlID0g
NjQgLSAjYnVmZmVyCisJCQlsZW5ndGggPSBsZW5ndGggKyAjbXNnCisJCQlidWZmZXIgPSBi
dWZmZXIuLnN0cmluZy5zdWIobXNnLCAxLCBlbmRyYW5nZSkKKwkJCW9mZnNldCA9IGVuZHJh
bmdlICsgMQorCQkJd2hpbGUgKCNidWZmZXIgPT0gNjQpIGRvCisJCQkJc2hhMjU2X2Jsb2Nr
KEgsIGJ1ZmZlcikKKwkJCQlidWZmZXIgPSBzdHJpbmcuc3ViKG1zZywgb2Zmc2V0LCBvZmZz
ZXQgKyA2MykKKwkJCQlvZmZzZXQgPSBvZmZzZXQgKyA2NAorCQkJZW5kCisJCQlyZXR1cm4g
dXBkYXRlCisJCWVsc2UKKwkJCWxvY2FsIHBhZGRpbmcgPSAtKGxlbmd0aCArIDEgKyA4KSAl
IDY0CisJCQl1cGRhdGUoIlwxMjgiIC4uIHN0cmluZy5yZXAoIlwwIiwgcGFkZGluZykgLi4g
bnVtYmVyMnN0cmluZyhsZW5ndGgqOCwgOCkpCisJCQlidWZmZXIgPSBuaWwKKwkJCWxvY2Fs
IHJlc3VsdCA9ICIiCisJCQlmb3IgaT0xLCA4IGRvCisJCQkJcmVzdWx0ID0gcmVzdWx0IC4u
IG51bWJlcjJzdHJpbmcoSFtpXSwgNCkKKwkJCWVuZAorCQkJcmV0dXJuIHJlc3VsdDsKKwkJ
ZW5kCisJZW5kCisJaWYgbXNnIHRoZW4KKwkJcmV0dXJuIHVwZGF0ZShtc2cpKCkKKwllbHNl
CisJCXJldHVybiB1cGRhdGUKKwllbmQKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBzaGE1MTIo
bXNnKQorCWxvY2FsIGxlbmd0aCA9IDAKKwlsb2NhbCBidWZmZXIgPSAiIgorCWxvY2FsIEgg
PSB7MHg2YTA5ZTY2N2YzYmNjOTA4LCAweGJiNjdhZTg1ODRjYWE3M2IsIDB4M2M2ZWYzNzJm
ZTk0ZjgyYiwKKwkJMHhhNTRmZjUzYTVmMWQzNmYxLCAweDUxMGU1MjdmYWRlNjgyZDEsIDB4
OWIwNTY4OGMyYjNlNmMxZiwKKwkJMHgxZjgzZDlhYmZiNDFiZDZiLCAweDViZTBjZDE5MTM3
ZTIxNzl9CisJbG9jYWwgZnVuY3Rpb24gdXBkYXRlKG1zZykKKwkJaWYgbXNnIHRoZW4KKwkJ
CWxvY2FsIG9mZnNldCA9IDEKKwkJCWxvY2FsIGVuZHJhbmdlID0gMTI4IC0gI2J1ZmZlcgor
CQkJbGVuZ3RoID0gbGVuZ3RoICsgI21zZworCQkJYnVmZmVyID0gYnVmZmVyLi5zdHJpbmcu
c3ViKG1zZywgMSwgZW5kcmFuZ2UpCisJCQlvZmZzZXQgPSBlbmRyYW5nZSArIDEKKwkJCXdo
aWxlICgjYnVmZmVyID09IDEyOCkgZG8KKwkJCQlzaGE1MTJfYmxvY2soSCwgYnVmZmVyKQor
CQkJCWJ1ZmZlciA9IHN0cmluZy5zdWIobXNnLCBvZmZzZXQsIG9mZnNldCArIDEyNykKKwkJ
CQlvZmZzZXQgPSBvZmZzZXQgKyAxMjgKKwkJCWVuZAorCQkJcmV0dXJuIHVwZGF0ZQorCQll
bHNlCisJCQlsb2NhbCBwYWRkaW5nID0gKC0obGVuZ3RoICsgMSArIDE2KSAlIDEyOCkgKyA4
CisJCQlsb2NhbCBwYWRzdHJpbmcgPSAiXDEyOCIgLi4gc3RyaW5nLnJlcCgiXDAiLCBwYWRk
aW5nKSAuLiBudW1iZXIyc3RyaW5nKGxlbmd0aCo4LCA4KQorCQkJdXBkYXRlKHBhZHN0cmlu
ZykKKwkJCWJ1ZmZlciA9IG5pbAorCQkJbG9jYWwgcmVzdWx0ID0gIiIKKwkJCWZvciBpPTEs
IDggZG8KKwkJCQlyZXN1bHQgPSByZXN1bHQgLi4gbnVtYmVyMnN0cmluZyhIW2ldLCA4KQor
CQkJZW5kCisJCQlyZXR1cm4gcmVzdWx0CisJCWVuZAorCWVuZAorCWlmIG1zZyB0aGVuCisJ
CXJldHVybiB1cGRhdGUobXNnKSgpCisJZWxzZQorCQlyZXR1cm4gdXBkYXRlCisJZW5kCitl
bmQKKworbG9jYWwgZnVuY3Rpb24gc3RyaW5nMmhleChzKQorCWxvY2FsIGggPSBzdHJpbmcu
Z3N1YihzLCAiLiIsIGZ1bmN0aW9uKGMpIHJldHVybiBzdHJpbmcuZm9ybWF0KCIlMDJ4Iiwg
c3RyaW5nLmJ5dGUoYykpCisJCQllbmQpCisJcmV0dXJuIGgKK2VuZAorCitsb2NhbCBoYXNo
ZXMgPSB7CisJc2hhMjU2PSBzaGEyNTYsCisJc2hhNTEyPSBzaGE1MTIsCisJc3RyaW5nMmhl
eD0gc3RyaW5nMmhleAorfQorCityZXR1cm4gaGFzaGVzCmRpZmYgLS1naXQgYS9zdGFuZC9s
dWEvcGFzc3dvcmQubHVhIGIvc3RhbmQvbHVhL3Bhc3N3b3JkLmx1YQppbmRleCA4ZWRkNGVk
ZDdlYy4uNTJhY2JmODQ3NjkgMTAwNjQ0Ci0tLSBhL3N0YW5kL2x1YS9wYXNzd29yZC5sdWEK
KysrIGIvc3RhbmQvbHVhL3Bhc3N3b3JkLmx1YQpAQCAtMzEsNiArMzEsNyBAQAogCiBsb2Nh
bCBjb3JlID0gcmVxdWlyZSgiY29yZSIpCiBsb2NhbCBzY3JlZW4gPSByZXF1aXJlKCJzY3Jl
ZW4iKQorbG9jYWwgY3J5cHQgPSByZXF1aXJlKCJjcnlwdCIpCiAKIGxvY2FsIHBhc3N3b3Jk
ID0ge30KIApAQCAtODcsNiArODgsMTYgQEAgZnVuY3Rpb24gcGFzc3dvcmQucmVhZChwcm9t
cHRfbGVuZ3RoKQogZW5kCiAKIGZ1bmN0aW9uIHBhc3N3b3JkLmNoZWNrKCkKKwlsb2NhbCBm
dW5jdGlvbiBjb21wYXJlKGVudGVyZWQsIHN0b3JlZCkKKwkJaWYgc3RvcmVkID09IG5pbCB0
aGVuCisJCQlyZXR1cm4gdHJ1ZQorCQllbmQKKwkJbG9jYWwgcmVzdWx0ID0gY3J5cHQuY29t
cGFyZShlbnRlcmVkLCBzdG9yZWQpCisJCWlmIHJlc3VsdCA9PSBuaWwgdGhlbgorCQkJcmV0
dXJuIGVudGVyZWQgPT0gc3RvcmVkCisJCWVuZAorCQlyZXR1cm4gcmVzdWx0CisgICAgICAg
IGVuZAogCS0tIHB3ZCBpcyBvcHRpb25hbGx5IHN1cHBsaWVkIGlmIHdlIHdhbnQgdG8gY2hl
Y2sgaXQKIAlsb2NhbCBmdW5jdGlvbiBkb1Byb21wdChwcm9tcHQsIHB3ZCkKIAkJbG9jYWwg
YXR0ZW1wdHMgPSAxCkBAIC0xMDYsNyArMTE3LDcgQEAgZnVuY3Rpb24gcGFzc3dvcmQuY2hl
Y2soKQogCQkJc2NyZWVuLmRlZmN1cnNvcigpCiAJCQlwcmludGMocHJvbXB0KQogCQkJbG9j
YWwgcmVhZF9wd2QgPSBwYXNzd29yZC5yZWFkKCNwcm9tcHQpCi0JCQlpZiBwd2QgPT0gbmls
IG9yIHB3ZCA9PSByZWFkX3B3ZCB0aGVuCisJCQlpZiBjb21wYXJlKHJlYWRfcHdkLCBwd2Qp
IHRoZW4KIAkJCQktLSBDbGVhciB0aGUgcHJvbXB0ICsgdHdpZGRsZQogCQkJCXByaW50Yyhz
dHJpbmcucmVwKCIgIiwgI3Byb21wdCArIDUpKQogCQkJCXJldHVybiByZWFkX3B3ZApAQCAt
MTE2LDcgKzEyNyw3IEBAIGZ1bmN0aW9uIHBhc3N3b3JkLmNoZWNrKCkKIAkJCWxvYWRlci5k
ZWxheSgzKjEwMDAqMTAwMCkKIAkJZW5kCiAJZW5kCi0JbG9jYWwgZnVuY3Rpb24gY29tcGFy
ZShwcm9tcHQsIHB3ZCkKKwlsb2NhbCBmdW5jdGlvbiBwd0dhdGUocHJvbXB0LCBwd2QpCiAJ
CWlmIHB3ZCA9PSBuaWwgdGhlbgogCQkJcmV0dXJuCiAJCWVuZApAQCAtMTI0LDcgKzEzNSw3
IEBAIGZ1bmN0aW9uIHBhc3N3b3JkLmNoZWNrKCkKIAllbmQKIAogCWxvY2FsIGJvb3RfcHdk
ID0gbG9hZGVyLmdldGVudigiYm9vdGxvY2tfcGFzc3dvcmQiKQotCWNvbXBhcmUoIkJvb3Rs
b2NrIHBhc3N3b3JkOiIsIGJvb3RfcHdkKQorCXB3R2F0ZSgiQm9vdGxvY2sgcGFzc3dvcmQ6
IiwgYm9vdF9wd2QpCiAKIAlsb2NhbCBnZWxpX3Byb21wdCA9IGxvYWRlci5nZXRlbnYoImdl
b21fZWxpX3Bhc3NwaHJhc2VfcHJvbXB0IikKIAlpZiBnZWxpX3Byb21wdCB+PSBuaWwgYW5k
IGdlbGlfcHJvbXB0Omxvd2VyKCkgPT0gInllcyIgdGhlbgpAQCAtMTQxLDcgKzE1Miw3IEBA
IGZ1bmN0aW9uIHBhc3N3b3JkLmNoZWNrKCkKIAkJLS0gaW4gdGhlIG1pZGRsZSBvZiBvdGhl
ciB0ZXh0LgogCQlzZXR1cF9zY3JlZW4oKQogCWVuZAotCWNvbXBhcmUoIkxvYWRlciBwYXNz
d29yZDoiLCBwd2QpCisJcHdHYXRlKCJMb2FkZXIgcGFzc3dvcmQ6IiwgcHdkKQogZW5kCiAK
IHJldHVybiBwYXNzd29yZAo=

--------------7ulGrikZoqg5HlrZ0BE7ZO0t--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?74a1eb5e-64a5-f8e7-c44e-55188539643a>