Subject: Verifying signatures for downloaded files [PATCH]
To: None <tech-pkg@netbsd.org>
From: Todd Willey <xtoddx@gmail.com>
List: tech-pkg
Date: 02/12/2005 12:54:43
------=_Part_1694_22886587.1108230883722
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Attached is a patch to pkg_install that works with signatures on
remote (http,ftp) packages.  It will:

*) cache pkg downloads to disk if the user wants to verify signatures
*) cache pkg downloads to disk if the -d flag is given (just to keep a
local copy)
*) attempt to download any associated signature files for the package
if -s given
*) verify downloaded packages with signatures if -s given
*) -c CACHEDIR will override the default cache directory (/var/cache/pkg)
*) does not cache to disk if no relevant options are given, as it performs now

I'm looking for feedback / testing.  I've been using this patch for a
few days now with no problems, verifying the binary packages I host on
GoBSD.com.

-Todd Willey

------=_Part_1694_22886587.1108230883722
Content-Type: application/octet-stream; name="pkg_install-patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="pkg_install-patch"

SW5kZXg6IGZpbGVzL2FkZC9tYWluLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2c3Jvb3QvcGtn
c3JjL3BrZ3Rvb2xzL3BrZ19pbnN0YWxsL2ZpbGVzL2FkZC9tYWluLmMsdgpyZXRyaWV2aW5nIHJl
dmlzaW9uIDEuOApkaWZmIC11IC1yMS44IG1haW4uYwotLS0gZmlsZXMvYWRkL21haW4uYwkyOSBE
ZWMgMjAwNCAxMjoxNjo1NiAtMDAwMAkxLjgKKysrIGZpbGVzL2FkZC9tYWluLmMJNyBGZWIgMjAw
NSAyMDo1NjoxNCAtMDAwMApAQCAtNDksNyArNDksOSBAQAogI2luY2x1ZGUgImFkZC5oIgogI2lu
Y2x1ZGUgInZlcmlmeS5oIgogCi1zdGF0aWMgY2hhciBPcHRpb25zW10gPSAiSUs6TE1SU1ZXOmZo
bnA6czp0OnV2dzoiOworLyogdG9kZFsxXTogYWRkZWQgLWMgb3B0aW9uIGZvciBjYWNoZSBkaXJl
Y3RvcnksCisgKiBhbmQgLWQgdG8gZG93bmxvYWQgYmVmb3JlIGV4dHJhY3QsIEZlYiAyMDA1ICov
CitzdGF0aWMgY2hhciBPcHRpb25zW10gPSAiSUs6TE1SU1ZXOmZobnA6czp0OnV2dzpjOmQiOwog
CiBjaGFyICAgKlByZWZpeCA9IE5VTEw7CiBjaGFyICAgKlZpZXcgPSBOVUxMOwpAQCAtNzEsOCAr
NzMsOCBAQAogdXNhZ2Uodm9pZCkKIHsKIAkodm9pZCkgZnByaW50ZihzdGRlcnIsICIlc1xuJXNc
biVzXG4iLAotCSAgICAidXNhZ2U6IHBrZ19hZGQgWy1maElMTW5SU3VWdl0gWy1wIHByZWZpeF0g
Wy1zIHZlcmlmaWNhdGlvbi10eXBlXSIsCi0JICAgICIgICAgICAgICAgICAgICBbLXQgdGVtcGxh
dGVdIFstVyB2aWV3YmFzZV0gWy13IHZpZXddIiwKKwkgICAgInVzYWdlOiBwa2dfYWRkIFstZmhJ
TE1uUlN1VnZkXSBbLXAgcHJlZml4XSBbLXMgdmVyaWZpY2F0aW9uLXR5cGVdIiwKKwkgICAgIiAg
ICAgICAgICAgICAgIFstdCB0ZW1wbGF0ZV0gWy1XIHZpZXdiYXNlXSBbLXcgdmlld10gWy1jIGNh
Y2hlZGlyXSIsCiAJICAgICIgICAgICAgICAgICAgICBwa2ctbmFtZSBbcGtnLW5hbWUgLi4uXSIp
OwogCWV4aXQoMSk7CiB9CkBAIC0xMjcsNiArMTI5LDcgQEAKIAogCQljYXNlICdzJzoKIAkJCXNl
dF92ZXJpZmljYXRpb24ob3B0YXJnKTsKKwkJCU11c3REb3dubG9hZCA9IFRSVUU7CiAJCQlicmVh
azsKIAogCQljYXNlICd0JzoKQEAgLTE1Myw2ICsxNTYsMTQgQEAKIAkJCVZpZXcgPSBvcHRhcmc7
CiAJCQlicmVhazsKIAorCQljYXNlICdkJzoKKwkJCU11c3REb3dubG9hZCA9IFRSVUU7CisJCQli
cmVhazsKKworCQljYXNlICdjJzoKKwkJCUNhY2hlRGlyID0gb3B0YXJnOworCQkJYnJlYWs7CisK
IAkJY2FzZSAnaCc6CiAJCWNhc2UgJz8nOgogCQlkZWZhdWx0OgpJbmRleDogZmlsZXMvYWRkL3Bl
cmZvcm0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9wa2dzcmMvcGtndG9vbHMvcGtn
X2luc3RhbGwvZmlsZXMvYWRkL3BlcmZvcm0uYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yOApk
aWZmIC11IC1yMS4yOCBwZXJmb3JtLmMKLS0tIGZpbGVzL2FkZC9wZXJmb3JtLmMJNCBGZWIgMjAw
NSAwOToxMDoxMyAtMDAwMAkxLjI4CisrKyBmaWxlcy9hZGQvcGVyZm9ybS5jCTcgRmViIDIwMDUg
MjA6NTY6MTQgLTAwMDAKQEAgLTU4LDEyICs1OCwxNiBAQAogI2luY2x1ZGUgPHN5cy91dHNuYW1l
Lmg+CiAjZW5kaWYKIAorI2RlZmluZSBERUZBVUxUX0NBQ0hFRElSCSIvdmFyL2NhY2hlL3BrZyIK
Kwogc3RhdGljIGNoYXIgTG9nRGlyW01heFBhdGhTaXplXTsKIHN0YXRpYyBpbnQgemFwTG9nRGly
OwkJLyogU2hvdWxkIHdlIGRlbGV0ZSBMb2dEaXI/ICovCiAKIHN0YXRpYyBwYWNrYWdlX3QgUGxp
c3Q7CiBzdGF0aWMgY2hhciAqSG9tZTsKIAorQm9vbGVhbiBmcmVlQ2FjaGVEaXIgPSBGQUxTRTsK
KwogLyogdXNlZCBpbiBidWlsZCBpbmZvcm1hdGlvbiAqLwogZW51bSB7CiAJR29vZCwKQEAgLTE2
NSw3ICsxNjksOSBAQAogCQkJICAgIFZpZXdiYXNlID8gIi1XIiA6ICIiLCBWaWV3YmFzZSA/IFZp
ZXdiYXNlIDogIiIsCiAJCQkgICAgRm9yY2UgPyAiLWYiIDogIiIsCiAJCQkgICAgUHJlZml4ID8g
Ii1wIiA6ICIiLCBQcmVmaXggPyBQcmVmaXggOiAiIiwKLQkJCSAgICBWZXJib3NlID8gIi12IiA6
ICIiLCBuYW1lLCBOVUxMKSkgeworCQkJICAgIFZlcmJvc2UgPyAiLXYiIDogIiIsCisJCQkgICAg
TXVzdERvd25sb2FkID8gIi1kIiA6ICIiLAorCQkJICAgIG5hbWUsIE5VTEwpKSB7CiAJCXdhcm54
KCJhdXRvbG9hZCBvZiBkZXBlbmRlbmN5IGAlcycgZmFpbGVkJXMiLAogCQkJbmFtZSwgRm9yY2Ug
PyAiIChwcm9jZWVkaW5nIGFueXdheSkiIDogIiEiKTsKIAkJaWYgKCFGb3JjZSkKQEAgLTIzNiwx
NiArMjQyLDUyIEBACiAJCXBrZyA9IHRtcHBrZzsKIAogCQlpZiAoSVNfVVJMKHBrZykpIHsKLQkJ
CUhvbWUgPSBmaWxlR2V0VVJMKHBrZyk7Ci0JCQlpZiAoSG9tZSA9PSBOVUxMKSB7Ci0JCQkJd2Fy
bngoInVuYWJsZSB0byBmZXRjaCBgJXMnIGJ5IFVSTCIsIHBrZyk7Ci0JCQl9Ci0JCQl3aGVyZV90
byA9IEhvbWU7CiAKLQkJCS8qIG1ha2Ugc3VyZSB0aGUgcGtnIGlzIHZlcmlmaWVkICovCi0JCQlp
ZiAoIXZlcmlmeShwa2cpKSB7Ci0JCQkJd2FybngoIlBhY2thZ2UgJXMgd2lsbCBub3QgYmUgZXh0
cmFjdGVkIiwgcGtnKTsKLQkJCQlnb3RvIGJvbWI7CisJCQlpZiggIE11c3REb3dubG9hZCApIHsK
KwkJCQkvKiBUT0RPOiBDaGVjayBmb3IgY29weSBpbiBDYWNoZSBiZWZvcmUgZC9sICovCisJCQkJ
Y2hhciAqbG9jYWxwYXRoOworCQkJCWlmKCBDYWNoZURpciA9PSBOVUxMICkgeworCQkJCQlDYWNo
ZURpciA9IHN0cmR1cCggREVGQVVMVF9DQUNIRURJUiApOworCQkJCQlmcmVlQ2FjaGVEaXIgPSBU
UlVFOworCQkJCX0KKwkJCQlwYXRoX2NyZWF0ZSggQ2FjaGVEaXIgKTsKKwkJCQlpZiggKGxvY2Fs
cGF0aCA9IGZ0cF9kb3dubG9hZF90byggcGtnLCBDYWNoZURpciApKSA9PSBOVUxMICkgeworCQkJ
CQllcnJ4KCBFWElUX0ZBSUxVUkUsCisJCQkJCQkiVW5hYmxlIHRvIGRvd25sb2FkICVzIHRvICVz
XG4iLAorCQkJCQkJcGtnLCBDYWNoZURpciApOworCQkJCX0KKwkJCQlzaWduYXR1cmVfZG93bmxv
YWRfdG8oIHBrZywgQ2FjaGVEaXIgKTsKKwkJCQlpZiAoc3RhdChsb2NhbHBhdGgsICZzYikgPT0g
RkFJTCkgeworCQkJCQl3YXJueCgiY2FuJ3Qgc3RhdCBwYWNrYWdlIGZpbGUgJyVzJyIsIHBrZyk7
CisJCQkJCWZyZWUoIGxvY2FscGF0aCApOworCQkJCQlnb3RvIGJvbWI7CisJCQkJfQorCisJCQkJ
aWYgKCF2ZXJpZnkobG9jYWxwYXRoKSkgeworCQkJCQl3YXJueCgiUGFja2FnZSAlcyB3aWxsIG5v
dCBiZSBleHRyYWN0ZWQiLCBwa2cpOworCQkJCQlmcmVlKCBsb2NhbHBhdGggKTsKKwkJCQkJZ290
byBib21iOworCQkJCX0KKwkJCQlIb21lID0gbWFrZV9wbGF5cGVuKHBsYXlwZW4sIHNpemVvZihw
bGF5cGVuKSwKKwkJCQkJc2Iuc3Rfc2l6ZSAqIDQpOworCQkJCWlmICghSG9tZSkKKwkJCQkJd2Fy
bngoInVuYWJsZSB0byBtYWtlICVsZCBieXRlIHBsYXlwZW4iLAorCQkJCQkgICAgICAobG9uZykg
KHNiLnN0X3NpemUgKiA0KSk7CisJCQkJd2hlcmVfdG8gPSBIb21lOworCQkJCWlmICh1bnBhY2so
bG9jYWxwYXRoLCBOVUxMKSkgeworCQkJCQl3YXJueCgidW5hYmxlIHRvIGV4dHJhY3QgdGFibGUg
b2YgY29udGVudHMgZmlsZSBmcm9tIGAlcycgLSBub3QgYSBwYWNrYWdlPyIsCisJCQkJCSAgICAg
IGxvY2FscGF0aCk7CisJCQkJCWZyZWUoIGxvY2FscGF0aCApOworCQkJCQlnb3RvIGJvbWI7CisJ
CQkJfQorCQkJCWZyZWUoIGxvY2FscGF0aCApOworCQkJfQorCQkJZWxzZSB7IC8qICEgTXVzdERv
d25sb2FkICovCisJCQkJSG9tZSA9IGZpbGVHZXRVUkwocGtnKTsKKwkJCQlpZiAoSG9tZSA9PSBO
VUxMKSB7CisJCQkJCXdhcm54KCJ1bmFibGUgdG8gZmV0Y2ggYCVzJyBieSBVUkwiLCBwa2cpOwor
CQkJCX0KKwkJCQl3aGVyZV90byA9IEhvbWU7CiAJCQl9CiAJCX0gZWxzZSB7IC8qIGxvY2FsICov
CiAJCQlpZiAoIUlTX1NURElOKHBrZykpIHsKQEAgLTEwMzksNiArMTA4MSw5IEBACiAJfQogCQog
CWZ0cF9zdG9wKCk7CisKKwlpZiggZnJlZUNhY2hlRGlyICkKKwkJZnJlZSggQ2FjaGVEaXIgKTsK
IAkKIAlyZXR1cm4gZXJyX2NudDsKIH0KSW5kZXg6IGZpbGVzL2FkZC92ZXJpZnkuYwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9wa2dzcmMvcGtndG9vbHMvcGtnX2luc3RhbGwvZmlsZXMv
YWRkL3ZlcmlmeS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjcKZGlmZiAtdSAtcjEuNyB2ZXJp
ZnkuYwotLS0gZmlsZXMvYWRkL3ZlcmlmeS5jCTI5IERlYyAyMDA0IDEyOjE2OjU2IC0wMDAwCTEu
NworKysgZmlsZXMvYWRkL3ZlcmlmeS5jCTcgRmViIDIwMDUgMjA6NTY6MTQgLTAwMDAKQEAgLTc2
LDEzICs3NiwyMSBAQAogCiAvKiB0aGlzIHN0cnVjdCBkZWZpbmVzIGEgdmVyaWZpY2F0aW9uIHR5
cGUgKi8gCiB0eXBlZGVmIHN0cnVjdCB2ZXJfdCB7Ci0JY29uc3QgY2hhciAgICAgKm5hbWU7CQkJ
CS8qIG5hbWUgb2YgdHlwZSAqLwotCWNvbnN0IGNoYXIgICAgICpjb21tYW5kMTsJCQkvKiBjb21t
YW5kIHRvIGV4ZWN1dGUgdG8gdmVyaWZ5ICovCi0JY29uc3QgY2hhciAgICAgKmNvbW1hbmQyOwkJ
CS8qIGNvbW1hbmQgdG8gZXhlY3V0ZSB0byB2ZXJpZnkgKi8KLQljb25zdCBjaGFyICAgICAqZXh0
ZW5zaW9uc1tNYXhFeHRlbnNpb25zXTsJLyogc2lnbmF0dXJlIGZpbGUgZXh0ZW5zaW9ucyAqLwor
CWNvbnN0IGNoYXIgICAgICpuYW1lOwkJCS8qIG5hbWUgb2YgdHlwZSAqLworCWNvbnN0IGNoYXIg
ICAgICpjb21tYW5kMTsJCS8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLworCWNvbnN0IGNoYXIgICAg
ICpjb21tYW5kMjsJCS8qIGFyZ3VtZW50cyAqLworCWNvbnN0IGNoYXIgICAgICpleHRlbnNpb25z
W01heEV4dGVuc2lvbnNdOyAvKiBmaWxlIGV4dGVuc2lvbnMgKi8KIH0gdmVyX3Q7CiAKLXN0YXRp
YyBjaGFyCSp2ZXJpZmljYXRpb25fdHlwZTsJLyogdGhlIHZlcmlmaWNhdGlvbiB0eXBlIHdoaWNo
IGhhcyBiZWVuIHNlbGVjdGVkICovCisvKiB0YWJsZSBob2xkaW5nIHBvc3NpYmxlIHZlcmlmaWNh
dGlvbnMgd2hpY2ggY2FuIGJlIG1hZGUgKi8KK3N0YXRpYyBjb25zdCB2ZXJfdAl2ZXJ0YWJbXSA9
IHsKKwl7ICJub25lIiwgICAgTlVMTCwgTlVMTCwJeyBOVUxMIH0gfSwKKwl7ICJncGciLCAgICAg
ImdwZyIsIi0tdmVyaWZ5IiwJeyAiLnNpZyIsICIuYXNjIiwgTlVMTCB9IH0sCisJeyAicGdwNSIs
ICAgICJwZ3B2IiwgTlVMTCwJeyAiLnNpZyIsICIuYXNjIiwgIi5wZ3AiLCBOVUxMIH0gfSwKKwl7
IE5VTEwgfQorfTsKKworc3RhdGljIGNoYXIJKnZlcmlmaWNhdGlvbl90eXBlOwkvKiBzZWxlY3Rl
ZCB0eXBlICh2ZXJfdC5uYW1lKSAqLwogCiAvKiBjYWxsZWQgd2hlbiBncGcgdmVyaWZpY2F0aW9u
IHR5cGUgaXMgc2VsZWN0ZWQgKi8KIHN0YXRpYyBpbnQKQEAgLTEwNSwzNCArMTEzLDY4IEBACiAJ
CQlyZXQgPSAoY21kMiA9PSBOVUxMKSA/IGZleGVjKGNtZDEsIGYsIE5VTEwpIDogZmV4ZWMoY21k
MSwgY21kMiwgZiwgTlVMTCk7CiAJCQlpZiAocmV0ICE9IDApIHsKIAkJCQkodm9pZCkgZnByaW50
ZihzdGRlcnIsICIqKiogV0FSTklORyAqKio6IGAlcycgaGFzIGEgYmFkIHNpZ25hdHVyZVxuIiwg
Zik7CisJCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiUHJvY2VlZCB3aXRoIGFkZGl0aW9uIG9m
IHBvc3NpYmx5IGJhZCBwYWNrYWdlICVzOiBbeS9uXT8gIiwgcGtnbmFtZSk7CisJCQkJaWYgKGZn
ZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSA9PSBOVUxMKSB7CisJCQkJCSh2b2lkKSBmcHJp
bnRmKHN0ZGVyciwgIkV4aXRpbmcgbm93Li4uIik7CisJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsK
KwkJCQl9CisJCQkJc3dpdGNoKGJ1ZlswXSkgeworCQkJCWNhc2UgJ1knOgorCQkJCWNhc2UgJ3kn
OgorCQkJCWNhc2UgJzEnOgorCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQkJKHZvaWQpIGZwcmlu
dGYoc3RkZXJyLCAiUGFja2FnZSBgJXMnIHdpbGwgbm90IGJlIGFkZGVkXG4iLCBwa2duYW1lKTsK
IAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIlByb2NlZWQg
d2l0aCBhZGRpdGlvbiBvZiAlczogW3kvbl0/ICIsIHBrZ25hbWUpOwotCQkJaWYgKGZnZXRzKGJ1
Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSA9PSBOVUxMKSB7Ci0JCQkJKHZvaWQpIGZwcmludGYoc3Rk
ZXJyLCAiRXhpdGluZyBub3cuLi4iKTsKLQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0JCQl9Ci0J
CQlzd2l0Y2goYnVmWzBdKSB7Ci0JCQljYXNlICdZJzoKLQkJCWNhc2UgJ3knOgotCQkJY2FzZSAn
MSc6Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJQYWNr
YWdlIGAlcycgd2lsbCBub3QgYmUgYWRkZWRcbiIsIHBrZ25hbWUpOwotCQkJcmV0dXJuIDA7CisK
KwkJCS8qIGdvb2Qgc2lnbmF0dXJlICovCisJCQlyZXR1cm4gMTsKIAkJfQogCX0KKwogCSh2b2lk
KSBmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIHNpZ25hdHVyZSBmaWxlIGZvdW5kIGZvciBgJXMn
XG4iLCBwa2duYW1lKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogdGFibGUgaG9sZGluZyBwb3NzaWJs
ZSB2ZXJpZmljYXRpb25zIHdoaWNoIGNhbiBiZSBtYWRlICovCi1zdGF0aWMgY29uc3QgdmVyX3QJ
dmVydGFiW10gPSB7Ci0JeyAibm9uZSIsCU5VTEwsCU5VTEwsCQl7IE5VTEwgfSB9LAotCXsgImdw
ZyIsCSJncGciLCAiLS12ZXJpZnkiLAl7ICIuc2lnIiwgIi5hc2MiLCBOVUxMIH0gfSwKLQl7ICJw
Z3A1IiwJInBncHYiLCBOVUxMLAkJeyAiLnNpZyIsICIuYXNjIiwgIi5wZ3AiLCBOVUxMIH0gfSwK
LQl7IE5VTEwgfQotfTsKK3ZvaWQKK3NpZ25hdHVyZV9kb3dubG9hZF90byggY29uc3QgY2hhciAq
cGtnLCBjb25zdCBjaGFyICpDYWNoZURpciApIHsKKworCWNoYXIgZltNYXhQYXRoU2l6ZV07CisJ
aW50IGk7CisJY29uc3QgY2hhciAqY29uc3QgKmVwOworCWNvbnN0IGNoYXIgKmNvbnN0ICpleHRl
bnNpb25zID0gTlVMTDsKKwljb25zdCB2ZXJfdCAqdnA7CisJY2hhciAqbG9jYWxzaWc7CisKKwlp
ZiggdmVyaWZpY2F0aW9uX3R5cGUgPT0gTlVMTCApCisJCXJldHVybjsKKworCWZvciAodnAgPSB2
ZXJ0YWIgOyB2cC0+bmFtZSA7IHZwKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAodmVyaWZpY2F0aW9u
X3R5cGUsIHZwLT5uYW1lKSA9PSAwKSB7CisJCQlleHRlbnNpb25zID0gdnAtPmV4dGVuc2lvbnM7
CisJCX0KKwl9CisJaWYoIGV4dGVuc2lvbnMgPT0gTlVMTCApIHsKKwkJZnByaW50ZihzdGRlcnIs
ICJDYW4ndCBmaW5kIHNpZ25hdXRyZSBleHRlbnNpb24gZm9yIHR5cGUgJXNcbiIsCisJCQl2ZXJp
ZmljYXRpb25fdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwLCBlcCA9IGV4dGVu
c2lvbnMgOyBpIDwgTWF4RXh0ZW5zaW9ucyAmJiAqZXAgOyBlcCsrLCBpKyspIHsKKwkJc25wcmlu
dGYoZiwgc2l6ZW9mKGYpLCAiJXMlcyIsIHBrZywgKmVwKTsKKwkJaWYoIFZlcmJvc2UgKQorCQkJ
cHJpbnRmKCAiTG9va2luZyBmb3Igc2lnbmF1dHJlIGZpbGU6ICVzXG4iLCBmICk7IAorCQlpZigg
KGxvY2Fsc2lnID0gZnRwX2Rvd25sb2FkX3RvKCBmLCBDYWNoZURpciApKSAhPSBOVUxMICkgewor
CQkJaWYoIFZlcmJvc2UgKQorCQkJCXByaW50ZiggIkZvdW5kIHNpZ25hdHVyZSBmaWxlLlxuIiAp
OworCQkJZnJlZSggbG9jYWxzaWcgKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmKCBpID09IE1h
eEV4dGVuc2lvbnMgKQorCQlmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gZG93bmxvYWQgc2ln
bmF1dHJlIGZpbGUuXG4iICk7Cit9CiAKIC8qIHNldCB0aGUgdmVyaWZpY2F0aW9uIHR5cGUgLSB1
c3VhbGx5IGNhbGxlZCBkdXJpbmcgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcgKi8KIHZvaWQKSW5k
ZXg6IGZpbGVzL2FkZC92ZXJpZnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9wa2dz
cmMvcGtndG9vbHMvcGtnX2luc3RhbGwvZmlsZXMvYWRkL3ZlcmlmeS5oLHYKcmV0cmlldmluZyBy
ZXZpc2lvbiAxLjMKZGlmZiAtdSAtcjEuMyB2ZXJpZnkuaAotLS0gZmlsZXMvYWRkL3ZlcmlmeS5o
CTIzIFNlcCAyMDAzIDA3OjEzOjQ3IC0wMDAwCTEuMworKysgZmlsZXMvYWRkL3ZlcmlmeS5oCTcg
RmViIDIwMDUgMjA6NTY6MTQgLTAwMDAKQEAgLTM2LDUgKzM2LDYgQEAKIHZvaWQgc2V0X3Zlcmlm
aWNhdGlvbihjb25zdCBjaGFyICopOwogY2hhciAqZ2V0X3ZlcmlmaWNhdGlvbih2b2lkKTsKIGlu
dCB2ZXJpZnkoY29uc3QgY2hhciAqKTsKK3ZvaWQgc2lnbmF0dXJlX2Rvd25sb2FkX3RvKCBjb25z
dCBjaGFyICosIGNvbnN0IGNoYXIgKiApOwogCiAjZW5kaWYgLyogVkVSSUZZX0hfICovCkluZGV4
OiBmaWxlcy9saWIvZnRwaW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9wa2dzcmMv
cGtndG9vbHMvcGtnX2luc3RhbGwvZmlsZXMvbGliL2Z0cGlvLmMsdgpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuMTQKZGlmZiAtdSAtcjEuMTQgZnRwaW8uYwotLS0gZmlsZXMvbGliL2Z0cGlvLmMJNyBK
YW4gMjAwNSAxMTo1ODoxMiAtMDAwMAkxLjE0CisrKyBmaWxlcy9saWIvZnRwaW8uYwk3IEZlYiAy
MDA1IDIwOjU2OjE0IC0wMDAwCkBAIC0xMjU0LDYgKzEyNTQsMTIzIEBACiAJcmV0dXJuIDA7CiB9
CiAKK2NoYXIqCitodHRwX2Rvd25sb2FkX3RvKCBjb25zdCBjaGFyKiBzcGVjLCBjb25zdCBjaGFy
KiBkZXN0ICkKK3sKKyAgICAgICAgaW50ICAgICBzdGF0ZWZ0cDsKKyAgICAgICAgcGlkX3QgICBw
aWRmdHA7CisJY2hhciBsb2NhbGZpbGVbTWF4UGF0aFNpemVdOworCWNoYXIqIHB0cjsKKwljaGFy
KiBwa2duYW1lOworCWNoYXIqIHBrZ19wYXRoOworCisJcGtnX3BhdGggPSBzdHJkdXAoIHNwZWMg
KTsKKwlpZiggKHB0ciA9IHN0cnJjaHIoIHBrZ19wYXRoLCAnLycgKSkgPT0gTlVMTCApIHsKKwkJ
d2FybngoICJVbmFsYmUgdG8gcGFyc2UgYmFzZW5hbWUgb2YgcGFja2FnZSAnJXMnXG4iLCBwa2df
cGF0aCApOworCQlmcmVlKCBwa2dfcGF0aCApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcHRyKys7
CisJcGtnbmFtZSA9IHN0cmR1cCggcHRyICk7CisJKnB0cj0nXDAnOworCWlmIChnZXRlbnYoIlBL
R19QQVRIIikgPT0gTlVMTCkgeworCQlzZXRlbnYoIlBLR19QQVRIIiwgcGtnX3BhdGgsIDEpOwor
CQlpZiAoVmVyYm9zZSkKKwkJCXByaW50Zigic2V0ZW52IFBLR19QQVRIPSclcydcbiIsIHBrZ19w
YXRoKTsKKwkJcGF0aF9wcmVwZW5kX2Zyb21fcGtnbmFtZSggc3BlYyApOworCX0KKworCXNucHJp
bnRmKCBsb2NhbGZpbGUsIE1heFBhdGhTaXplLCAiJXMvJXMiLCBkZXN0LCBwa2duYW1lICk7CisK
KyAgICAgICAgLyogZm9yayBmdHAgY2hpbGQgKi8KKyAgICAgICAgaWYgKChwaWRmdHAgPSBmb3Jr
KCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgd2FybigiY2Fubm90IGZvcmsgcHJvY2VzcyBm
b3IgZnRwIik7CisJCWZyZWUoIHBrZ19wYXRoICk7CisJCWZyZWUoIHBrZ25hbWUgKTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGlkZnRwID09
IDApIHsKKyAgICAgICAgICAgICAgICBleGVjbHAoRlRQX0NNRCwgRlRQX0NNRCwgIi1vIiwgbG9j
YWxmaWxlLCBzcGVjLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB3YXJueCgiZmFpbGVkIHRvIGV4
ZWN1dGUgZnRwIik7CisgICAgICAgICAgICAgICAgX2V4aXQoMik7CisgICAgICAgIH0KKworICAg
ICAgICB3aGlsZSAod2FpdHBpZChwaWRmdHAsICZzdGF0ZWZ0cCwgMCkgPCAwKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisJCQl3YXJueCggIndhaWRwaWQgZXJyb3I6
IG5vdCBFSU5UUlxuIiApOworCQkJZnJlZSggcGtnX3BhdGggKTsKKwkJCWZyZWUoIHBrZ25hbWUg
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggIVdJRkVYSVRFRChzdGF0ZWZ0cCkgKSB7CisJ
CXdhcm54KCAiV0lGRVhJVEVEIGVycm9yXG4iICk7CisJCWZyZWUoIHBrZ19wYXRoICk7CisJCWZy
ZWUoIHBrZ25hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAg
ICAgaWYgKCBXRVhJVFNUQVRVUyhzdGF0ZWZ0cCkgIT0gMCApIHsKKwkJd2FybngoICJXRVhJVFNU
QVRVUyBlcnJvclxuIiApOworCQlmcmVlKCBwa2dfcGF0aCApOworCQlmcmVlKCBwa2duYW1lICk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJfQorCisJZnJlZSggcGtnX3BhdGggKTsK
KwlmcmVlKCBwa2duYW1lICk7CisgICAgICAgIHJldHVybiBzdHJkdXAoIGxvY2FsZmlsZSApOwor
fQorCitjaGFyICoKK2Z0cF9kb3dubG9hZF90byggY29uc3QgY2hhciogc3BlYywgY29uc3QgY2hh
ciogZGVzdCApCit7CisJY2hhciBleHBhbmRbTWF4UGF0aFNpemVdOworCWludCByZXR2YWw7CisJ
Y2hhciBiYXNlW01heFBhdGhTaXplXTsKKwljaGFyKiBwa2duYW1lOworCWNoYXIqIHB0cjsKKwlj
aGFyIGNvbW1hbmRbMTAyNF07CisJY2hhciBsb2NhbGZpbGVbTWF4UGF0aFNpemVdOworCisJaWYo
IChyZXR2YWwgPSBleHBhbmRVUkwoIGV4cGFuZCwgc3BlYyApKSA9PSAtMSApIHsKKwkJd2Fybngo
IlVuYWJsZSB0byBleHBhbmQgVVJMOiAlc1xuIiwgc3BlYyk7CisJCXJldHVybiBOVUxMOworCX0K
KworCWlmKCBzdHJuY21wKCBleHBhbmQsICJodHRwOi8vIiwgNyApID09IDAgKQorCQlyZXR1cm4g
aHR0cF9kb3dubG9hZF90byggZXhwYW5kLCBkZXN0ICk7CisKKwlpZiggKHB0ciA9IHN0cnJjaHIo
IGV4cGFuZCwgJy8nICkpID09IE5VTEwgKSB7CisJCXdhcm54KCAiVW5hbGJlIHRvIHBhcnNlIGJh
c2VuYW1lIG9mIHBhY2thZ2U6ICclcydcbiIsIGV4cGFuZCApOworCQlyZXR1cm4gTlVMTDsKKwl9
CisJcHRyKys7CisJcGtnbmFtZSA9IHN0cmR1cCggcHRyICk7CisJKihwdHIpID0gJ1wwJzsKKwor
CWlmIChnZXRlbnYoIlBLR19QQVRIIikgPT0gTlVMTCkgeworCQlzZXRlbnYoIlBLR19QQVRIIiwg
ZXhwYW5kLCAxKTsKKwkJaWYgKFZlcmJvc2UpCisJCQlwcmludGYoInNldGVudiBQS0dfUEFUSD0n
JXMnXG4iLCBleHBhbmQpOworCQlwYXRoX3ByZXBlbmRfZnJvbV9wa2duYW1lKCBleHBhbmQgKTsK
Kwl9CisKKwlmdHBfc3RhcnQoIGV4cGFuZCApOworCisJc25wcmludGYoIGNvbW1hbmQsIHNpemVv
Zihjb21tYW5kKSwgImdldCAlcyAlcy8lc1xuIiwKKwkJcGtnbmFtZSwgZGVzdCwgcGtnbmFtZSAp
OworCisJaWYoIChyZXR2YWwgPSBmdHBfY21kKCBjb21tYW5kLCAiXG4oMjI2fDU1MCkuKlxuIiAp
KSAhPSAyMjYgKSB7CisJCXdhcm54KCAiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGUgKEZUUCBDT0RF
OiAlZCkiLCByZXR2YWwgKTsKKwkJZnJlZShwa2duYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor
CisJc25wcmludGYoIGxvY2FsZmlsZSwgc2l6ZW9mKGxvY2FsZmlsZSksICIlcy8lcyIsIGRlc3Qs
IHBrZ25hbWUgKTsKKwlyZXR1cm4gc3RyZHVwKCBsb2NhbGZpbGUgKTsKK30KIAogI2lmZGVmIFNU
QU5EQUxPTkUKIHN0YXRpYyB2b2lkCkluZGV4OiBmaWxlcy9saWIvZ2xvYmFsLmMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQpSQ1MgZmlsZTogL2N2c3Jvb3QvcGtnc3JjL3BrZ3Rvb2xzL3BrZ19pbnN0YWxsL2ZpbGVzL2xp
Yi9nbG9iYWwuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40CmRpZmYgLXUgLXIxLjQgZ2xvYmFs
LmMKLS0tIGZpbGVzL2xpYi9nbG9iYWwuYwkyMyBTZXAgMjAwMyAwNzoxMzo1MyAtMDAwMAkxLjQK
KysrIGZpbGVzL2xpYi9nbG9iYWwuYwk3IEZlYiAyMDA1IDIwOjU2OjE0IC0wMDAwCkBAIC00Miwz
ICs0Miw1IEBACiBCb29sZWFuIFZlcmJvc2UgPSBGQUxTRTsKIEJvb2xlYW4gRmFrZSA9IEZBTFNF
OwogQm9vbGVhbiBGb3JjZSA9IEZBTFNFOworQm9vbGVhbiBNdXN0RG93bmxvYWQgPSBGQUxTRTsK
K2NoYXIqIENhY2hlRGlyOwpJbmRleDogZmlsZXMvbGliL2xpYi5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZp
bGU6IC9jdnNyb290L3BrZ3NyYy9wa2d0b29scy9wa2dfaW5zdGFsbC9maWxlcy9saWIvbGliLmgs
dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTYKZGlmZiAtdSAtcjEuMTYgbGliLmgKLS0tIGZpbGVz
L2xpYi9saWIuaAk0IEZlYiAyMDA1IDA5OjEwOjEzIC0wMDAwCTEuMTYKKysrIGZpbGVzL2xpYi9s
aWIuaAk3IEZlYiAyMDA1IDIwOjU2OjE0IC0wMDAwCkBAIC0zNzUsNSArMzc1LDcgQEAKIGV4dGVy
biBCb29sZWFuIFZlcmJvc2U7CiBleHRlcm4gQm9vbGVhbiBGYWtlOwogZXh0ZXJuIEJvb2xlYW4g
Rm9yY2U7CitleHRlcm4gQm9vbGVhbiBNdXN0RG93bmxvYWQ7CitleHRlcm4gY2hhciAqQ2FjaGVE
aXI7CiAKICNlbmRpZgkJCQkvKiBfSU5TVF9MSUJfTElCX0hfICovCg==
------=_Part_1694_22886587.1108230883722--