ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNjI4MAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsNCBAQAorKi5kc3AgLWNybGYKKyouZHN3IC1jcmxmCisqLnNsbiAtY3JsZgorKi52Y3Byb2ogLWNybGYKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDVjOTEyOTUuLmQ1MTljYWIgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNCwxMSArNCwxOCBAQAogKi5weW8KICouc28KICouc3dbYS16XQorKi5wYwogKn4KIGRlcGVuZAogZGVwZW5kLmJhawogbGliCiBsaWI2NAorY29uZmlndXJlCithdXRvbTR0ZS5jYWNoZQorYWNsb2NhbC5tNAorY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY3Njb3BlKgogLnNjb25zaWduKgogY29uZmlnLnB5CiBidWlsZApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA5YjNiZTQzLi5iMGNiMTZhIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMTgsMjUgKzE4LDIzIEBACiBkb3h5Z2VuOgogCWNkIGRveHlnZW4gJiYgJChNQUtFKQogCi0uUEhPTlk6IGRveHlnZW4KLQotCiBjbGVhbjoKLQlAZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCS1AdG91Y2ggJChUT1ApL2NvbmZpZ3MvY3VycmVudAorCS1AZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAogCQlpZiBbIC1kICQkZGlyIF0gOyB0aGVuIFwKIAkJCShjZCAkJGRpciAmJiAkKE1BS0UpIGNsZWFuKSA7IFwKIAkJZmkgXAogCWRvbmUKKwktQHRlc3QgLXMgJChUT1ApL2NvbmZpZ3MvY3VycmVudCB8fCBybSAtZiAkKFRPUCkvY29uZmlncy9jdXJyZW50CiAKIAotcmVhbGNsZWFuOgotCS1ybSAtZiBgZmluZCAuIC1uYW1lIFwqLm9gCi0JLXJtIC1mIGBmaW5kIC4gLW5hbWUgXCouYWAKLQktcm0gLWYgYGZpbmQgLiAtbmFtZSBcKi5zb2AKLQktcm0gLWYgYGZpbmQgLiAtbmFtZSBkZXBlbmRgCityZWFsY2xlYW46IGNsZWFuCiAJLXJtIC1yZiBsaWIqCi0JJChNQUtFKSBjbGVhbgogCS1ybSAtZiAkKFRPUCkvY29uZmlncy9jdXJyZW50CisJLXJtIC1mICQoVE9QKS9jb25maWdzL2F1dG9jb25mCisJLXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQorCS1maW5kIC4gJygnIC1uYW1lICcqLm8nIC1vIC1uYW1lICcqLmEnIC1vIC1uYW1lICcqLnNvJyAtbyBcCisJICAtbmFtZSBkZXBlbmQgLW8gLW5hbWUgZGVwZW5kLmJhayAnKScgLWV4ZWMgcm0gLWYgJ3t9JyAnOycKIAogCiBpbnN0YWxsOgpAQCAtNTEsMTQgKzQ5LDIwIEBACiBsaW51eC1kaXJlY3RmYi1pbnN0YWxsOgogCWNkIHNyYy9tZXNhL2RyaXZlcnMvZGlyZWN0ZmIgJiYgJChNQUtFKSBpbnN0YWxsCiAKKy5QSE9OWTogZGVmYXVsdCBkb3h5Z2VuIGNsZWFuIHJlYWxjbGVhbiBpbnN0YWxsIGxpbnV4LWRpcmVjdGZiLWluc3RhbGwKKwogIyBJZiB0aGVyZSdzIG5vIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmaWxlCiAkKFRPUCkvY29uZmlncy9jdXJyZW50OgogCUBlY2hvCiAJQGVjaG8KIAlAZWNobyAiUGxlYXNlIGNob29zZSBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6IgotCUBscyAtMSAkKFRPUCkvY29uZmlncyB8IGdyZXAgLXYgImN1cnJlbnRcfGRlZmF1bHRcfENWUyIKKwlAbHMgLTEgJChUT1ApL2NvbmZpZ3MgfCBncmVwIC12ICJjdXJyZW50XHxkZWZhdWx0XHxDVlNcfGF1dG9jb25mLioiCiAJQGVjaG8KIAlAZWNobyAiVGhlbiB0eXBlICdtYWtlIDxjb25maWc+JyAoZXg6ICdtYWtlIGxpbnV4LXg4NicpIgorCUBlY2hvCisJQGVjaG8gIk9yLCBydW4gJy4vY29uZmlndXJlJyB0aGVuICdtYWtlJyIKKwlAZWNobyAiU2VlICcuL2NvbmZpZ3VyZSAtLWhlbHAnIGZvciBkZXRhaWxzIgorCUBlY2hvCiAJQGVjaG8gIihpZ25vcmUgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlKSIKIAlAZXhpdCAxCiAKQEAgLTY5LDExICs3MywxNiBAQAogYWl4LTY0LXN0YXRpYyBcCiBhaXgtZ2NjIFwKIGFpeC1zdGF0aWMgXAorYXV0b2NvbmYgXAorYmx1ZWdlbmUtb3NtZXNhIFwKK2JsdWVnZW5lLXhsYy1vc21lc2EgXAogYmVvcyBcCitjYXRhbW91bnQtb3NtZXNhLXBnaSBcCiBkYXJ3aW4gXAorZGFyd2luLWZhdC0zMmJpdCBcCitkYXJ3aW4tZmF0LWFsbCBcCiBkYXJ3aW4tc3RhdGljIFwKIGRhcndpbi1zdGF0aWMteDg2cHBjIFwKLWRhcndpbi14ODZwcGMgXAogZnJlZWJzZCBcCiBmcmVlYnNkLWRyaSBcCiBmcmVlYnNkLWRyaS1hbWQ2NCBcCkBAIC0xNjAsOCArMTY5LDkgQEAKIHN1bm9zNS12OC1zdGF0aWMgXAogc3Vub3M1LXY5IFwKIHN1bm9zNS12OS1zdGF0aWMgXAorc3Vub3M1LXY5LWNjLWcrKyBcCiB1bHRyaXgtZ2NjOgotCUAgaWYgWyAtZSBjb25maWdzL2N1cnJlbnQgXSA7IHRoZW4gXAorCUAgaWYgdGVzdCAtZiBjb25maWdzL2N1cnJlbnQgfHwgdGVzdCAtTCBjb25maWdzL2N1cnJlbnQgOyB0aGVuIFwKIAkJZWNobyAiUGxlYXNlIHJ1biAnbWFrZSByZWFsY2xlYW4nIGJlZm9yZSBjaGFuZ2luZyBjb25maWdzIiA7IFwKIAkJZXhpdCAxIDsgXAogCWZpCkBAIC0xNzEsMTcgKzE4MSwyNSBAQAogCiAjIFJ1bGVzIGZvciBtYWtpbmcgcmVsZWFzZSB0YXJiYWxscwogCi1ESVJFQ1RPUlkgPSBNZXNhLTcuMXByZQotTElCX05BTUUgPSBNZXNhTGliLTcuMXByZQotREVNT19OQU1FID0gTWVzYURlbW9zLTcuMXByZQotR0xVVF9OQU1FID0gTWVzYUdMVVQtNy4xcHJlCitESVJFQ1RPUlkgPSBNZXNhLTcuMS1yYzQKK0xJQl9OQU1FID0gTWVzYUxpYi03LjEtcmM0CitERU1PX05BTUUgPSBNZXNhRGVtb3MtNy4xLXJjNAorR0xVVF9OQU1FID0gTWVzYUdMVVQtNy4xLXJjNAogCiBNQUlOX0ZJTEVTID0gXAogCSQoRElSRUNUT1JZKS9NYWtlZmlsZSoJCQkJCQlcCisJJChESVJFQ1RPUlkpL2NvbmZpZ3VyZQkJCQkJCVwKKwkkKERJUkVDVE9SWSkvY29uZmlndXJlLmFjCQkJCQlcCisJJChESVJFQ1RPUlkpL2FjaW5jbHVkZS5tNAkJCQkJXAorCSQoRElSRUNUT1JZKS9hY2xvY2FsLm00CQkJCQkJXAogCSQoRElSRUNUT1JZKS9kZXNjcmlwLm1tcwkJCQkJXAogCSQoRElSRUNUT1JZKS9tbXMtY29uZmlnLgkJCQkJXAorCSQoRElSRUNUT1JZKS9iaW4vY29uZmlnLmd1ZXNzCQkJCQlcCisJJChESVJFQ1RPUlkpL2Jpbi9jb25maWcuc3ViCQkJCQlcCisJJChESVJFQ1RPUlkpL2Jpbi9pbnN0YWxsLXNoCQkJCQlcCiAJJChESVJFQ1RPUlkpL2Jpbi9ta2xpYgkJCQkJCVwKIAkkKERJUkVDVE9SWSkvYmluL21pbnN0YWxsCQkJCQlcCisJJChESVJFQ1RPUlkpL2Jpbi92ZXJzaW9uLm1rCQkJCQlcCiAJJChESVJFQ1RPUlkpL2NvbmZpZ3MvW2Etel0qCQkJCQlcCiAJJChESVJFQ1RPUlkpL2RvY3MvKi5odG1sCQkJCQlcCiAJJChESVJFQ1RPUlkpL2RvY3MvQ09QWUlORwkJCQkJXApAQCAtMjE4LDUxICsyMzYsNDQgQEAKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvTWFrZWZpbGUqCQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3NvdXJjZXMJCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZGVzY3JpcC5tbXMJCQkJXAorCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9nbC5wYy5pbgkJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kZXBlbmQJCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvbWFpbi8qLltjaFNdCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvbWFpbi9kZXNjcmlwLm1tcwkJCQlcCi0JJChESVJFQ1RPUlkpL3NyYy9tZXNhL21haW4vc291cmNlcwkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2dsYXBpLyouW2NoU10JCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9nbGFwaS9kZXNjcmlwLm1tcwkJCQlcCi0JJChESVJFQ1RPUlkpL3NyYy9tZXNhL2dsYXBpL3NvdXJjZXMJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9tYXRoLyouW2NoXQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL21hdGgvZGVzY3JpcC5tbXMJCQkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9tYXRoL3NvdXJjZXMJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zaGFkZXIvKi5bY2hdCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL2Rlc2NyaXAubW1zCQkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zaGFkZXIvc291cmNlcwkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3NoYWRlci9ncmFtbWFyLyouW2NoXQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIvZGVzY3JpcC5tbXMJCVwKLQkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIvc291cmNlcwkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL3NsYW5nLyouW2NoXQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2Rlc2NyaXAubW1zCQkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zaGFkZXIvc2xhbmcvc291cmNlcwkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2xpYnJhcnkvKi5bY2hdCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5LyouZ2MJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5Lyouc3luCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5L01ha2VmaWxlCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3N3cmFzdC8qLltjaF0JCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zd3Jhc3QvZGVzY3JpcC5tbXMJCQlcCi0JJChESVJFQ1RPUlkpL3NyYy9tZXNhL3N3cmFzdC9zb3VyY2VzCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc3dyYXN0X3NldHVwLyouW2NoXQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2Evc3dyYXN0X3NldHVwL2Rlc2NyaXAubW1zCQkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc291cmNlcwkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvdmJvLyouW2NoU10JCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS92Ym8vZGVzY3JpcC5tbXMJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS90bmwvKi5bY2hTXQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3RubC9kZXNjcmlwLm1tcwkJCQlcCi0JJChESVJFQ1RPUlkpL3NyYy9tZXNhL3RubC9zb3VyY2VzCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvdG5sX2RkLyouW2NoXQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3RubF9kZC9pbW0vKi5bY2hdCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvdG5sX2RkL2ltbS9OT1RFUy5pbW0JCQlcCisJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvTWFrZWZpbGUJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2Jlb3MvKi5jcHAJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvYmVvcy9NYWtlZmlsZQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9jb21tb24vKi5bY2hdCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2NvbW1vbi9kZXNjcmlwLm1tcwkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2NvbW1vbi9zb3VyY2VzCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2RpcmVjdGZiLyouW2NoXQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9NYWtlZmlsZQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9kb3MvKi5bY2hTXQkJCVwKKwkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9mYmRldi9NYWtlZmlsZQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9mYmRldi9nbGZiZGV2LmMJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvKi5bY2hdCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2dnaS8qLltjaF0JCQlcCkBAIC0yNzIsNiArMjgzLDcgQEAKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9nZ2kvZGlzcGxheS8qLmMJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvZ2dpL2Rpc3BsYXkvZmJkZXYuY29uZi5pbgkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2dnaS9pbmNsdWRlL2dnaS9tZXNhLyouaAkJXAorCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9NYWtlZmlsZQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9vc21lc2EvTWFrZWZpbGUud2luCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL2Rlc2NyaXAubW1zCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL29zbWVzYS5kZWYJCQlcCkBAIC0yNzksOCArMjkxLDggQEAKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy9zdmdhLyouW2NoXQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy93aW5kb3dzLyovKi5bY2hdCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvKi8qLmRlZgkJCVwKKwkkKERJUkVDVE9SWSkvc3JjL21lc2EvZHJpdmVycy94MTEvTWFrZWZpbGUJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMveDExL2Rlc2NyaXAubW1zCQkJXAotCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL3gxMS9zb3VyY2VzCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL3gxMS8qLltjaF0JCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL3BwYy8qLltjaF0JCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9zcGFyYy8qLltjaFNdCQkJCVwKQEAgLTMwOSwxMiArMzIxLDE0IEBACiAKIERSSV9GSUxFUyA9IFwKIAkkKERJUkVDVE9SWSkvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgJCVwKKwkkKERJUkVDVE9SWSkvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfc2FyZWEuaAkJCVwKIAkkKERJUkVDVE9SWSkvaW5jbHVkZS9HTC9pbnRlcm5hbC9zYXJlYS5oCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x4L01ha2VmaWxlCQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9nbHgveDExL01ha2VmaWxlCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL2dseC94MTEvKi5bY2hdCQkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9NYWtlZmlsZS50ZW1wbGF0ZQkJXAorCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9kcmkucGMuaW4JCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi94bWxwb29sLyouW2NoXQkJXAogCSQoRElSRUNUT1JZKS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24veG1scG9vbC8qLnBvCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9tZXNhL2RyaXZlcnMvZHJpLyovKi5bY2hTXQkJCVwKQEAgLTMyNSw2ICszMzksNyBAQAogU0dJX0dMVV9GSUxFUyA9IFwKIAkkKERJUkVDVE9SWSkvc3JjL2dsdS9NYWtlZmlsZQkJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1L2Rlc2NyaXAubW1zCQkJCVwKKwkkKERJUkVDVE9SWSkvc3JjL2dsdS9nbHUucGMuaW4JCQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL2dsdS9zZ2kvTWFrZWZpbGUJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1L3NnaS9NYWtlZmlsZS5tZ3cJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1L3NnaS9NYWtlZmlsZS53aW4JCQkJXApAQCAtMzMyLDYgKzM0Nyw4IEBACiAJJChESVJFQ1RPUlkpL3NyYy9nbHUvc2dpL2dsdS5kZWYJCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1L3NnaS9kdW1teS5jYwkJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9nbHUvc2dpL2Rlc2NyaXAubW1zCQkJCVwKKwkkKERJUkVDVE9SWSkvc3JjL2dsdS9zZ2kvZ2x1LmV4cG9ydHMJCQkJXAorCSQoRElSRUNUT1JZKS9zcmMvZ2x1L3NnaS9nbHUuZXhwb3J0cy5kYXJ3aW4JCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9nbHUvc2dpL21lc2FnbHUub3B0CQkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL2dsdS9zZ2kvaW5jbHVkZS9nbHVvcy5oCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcmZhY2UvKi5oCQkJXApAQCAtMzU4LDYgKzM3NSw3IEBACiAJJChESVJFQ1RPUlkpL3NyYy9nbHcvKi5bY2hdCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x3L01ha2VmaWxlKgkJCVwKIAkkKERJUkVDVE9SWSkvc3JjL2dsdy9SRUFETUUJCQlcCisJJChESVJFQ1RPUlkpL3NyYy9nbHcvZ2x3LnBjLmluCQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x3L2RlcGVuZAogCiBERU1PX0ZJTEVTID0gXApAQCAtMzg2LDcgKzQwNCw4IEBACiAJJChESVJFQ1RPUlkpL3Byb2dzL3NhbXBsZXMvKi5jCQkJXAogCSQoRElSRUNUT1JZKS9wcm9ncy9nbHNsL01ha2VmaWxlKgkJXAogCSQoRElSRUNUT1JZKS9wcm9ncy9nbHNsLyouYwkJCVwKLQkkKERJUkVDVE9SWSkvcHJvZ3MvZ2xzbC8qLnR4dAkJCVwKKwkkKERJUkVDVE9SWSkvcHJvZ3MvZ2xzbC8qLmZyYWcJCQlcCisJJChESVJFQ1RPUlkpL3Byb2dzL2dsc2wvKi52ZXJ0CQkJXAogCSQoRElSRUNUT1JZKS9wcm9ncy93aW5kbWwvTWFrZWZpbGUudWdsCQlcCiAJJChESVJFQ1RPUlkpL3Byb2dzL3dpbmRtbC8qLmMJCQlcCiAJJChESVJFQ1RPUlkpL3Byb2dzL3dpbmRtbC8qLmJtcAkJCVwKQEAgLTQwMSw2ICs0MjAsNyBAQAogCSQoRElSRUNUT1JZKS9pbmNsdWRlL0dML2dsdXRmOTAuaAkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9nbHgvTWFrZWZpbGUqCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9nbHV0L2dseC9kZXBlbmQJCVwKKwkkKERJUkVDVE9SWSkvc3JjL2dsdXQvZ2x4L2dsdXQucGMuaW4JCVwKIAkkKERJUkVDVE9SWSkvc3JjL2dsdXQvZ2x4LypkZWYJCQlcCiAJJChESVJFQ1RPUlkpL3NyYy9nbHV0L2dseC9kZXNjcmlwLm1tcwkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9nbHgvbW1zX2RlcGVuZAkJXApAQCAtNDE2LDYgKzQzNiwxMCBAQAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9mYmRldi9NYWtlZmlsZQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9mYmRldi8qW2NoXQkJXAogCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9taW5pLypbY2hdCQlcCisJJChESVJFQ1RPUlkpL3NyYy9nbHV0L21pbmkvZ2x1dC5wYy5pbgkJXAorCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9kaXJlY3RmYi9NYWtlZmlsZQkJXAorCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9kaXJlY3RmYi9OT1RFUwkJXAorCSQoRElSRUNUT1JZKS9zcmMvZ2x1dC9kaXJlY3RmYi8qW2NoXQkJXAogCSQoRElSRUNUT1JZKS93aW5kb3dzL1ZDNi9wcm9ncy9nbHV0L2dsdXQuZHNwCVwKIAkkKERJUkVDVE9SWSkvd2luZG93cy9WQzcvcHJvZ3MvZ2x1dC9nbHV0LnZjcHJvagogCkBAIC00MzEsOSArNDU1LDIwIEBACiAKIAogIyBFdmVyeXRoaW5nIGZvciBuZXcgYSBNZXNhIHJlbGVhc2U6Ci10YXJiYWxsczogcm1fZGVwZW5kIGxpYl9neiBkZW1vX2d6IGdsdXRfZ3ogbGliX2J6MiBkZW1vX2J6MiBnbHV0X2J6MiBsaWJfemlwIGRlbW9femlwIGdsdXRfemlwIG1kNQordGFyYmFsbHM6IHJtX2RlcGVuZCBjb25maWd1cmUgYWNsb2NhbC5tNCBsaWJfZ3ogZGVtb19neiBnbHV0X2d6IFwKKwlsaWJfYnoyIGRlbW9fYnoyIGdsdXRfYnoyIGxpYl96aXAgZGVtb196aXAgZ2x1dF96aXAgbWQ1CiAKIAorIyBIZWxwZXIgZm9yIGF1dG9jb25mIGJ1aWxkcworQUNMT0NBTCA9IGFjbG9jYWwKK0FDTE9DQUxfRkxBR1MgPQorQVVUT0NPTkYgPSBhdXRvY29uZgorQUNfRkxBR1MgPQorYWNsb2NhbC5tNDogY29uZmlndXJlLmFjIGFjaW5jbHVkZS5tNAorCSQoQUNMT0NBTCkgJChBQ0xPQ0FMX0ZMQUdTKQorY29uZmlndXJlOiBjb25maWd1cmUuYWMgYWNsb2NhbC5tNCBhY2luY2x1ZGUubTQKKwkkKEFVVE9DT05GKSAkKEFDX0ZMQUdTKQorCiBybV9kZXBlbmQ6CiAJQGZvciBkZXAgaW4gJChERVBFTkRfRklMRVMpIDsgZG8gXAogCQlybSAtZiAkJGRlcCA7IFwKQEAgLTQ0Miw2ICs0NzcsNyBAQAogCiBsaWJfZ3o6CiAJcm0gLWYgY29uZmlncy9jdXJyZW50IDsgXAorCXJtIC1mIGNvbmZpZ3MvYXV0b2NvbmYgOyBcCiAJY2QgLi4gOyBcCiAJdGFyIC1jZiAkKExJQl9OQU1FKS50YXIgJChMSUJfRklMRVMpIDsgXAogCWd6aXAgJChMSUJfTkFNRSkudGFyIDsgXApAQCAtNDYxLDYgKzQ5Nyw3IEBACiAKIGxpYl9iejI6CiAJcm0gLWYgY29uZmlncy9jdXJyZW50IDsgXAorCXJtIC1mIGNvbmZpZ3MvYXV0b2NvbmYgOyBcCiAJY2QgLi4gOyBcCiAJdGFyIC1jZiAkKExJQl9OQU1FKS50YXIgJChMSUJfRklMRVMpIDsgXAogCWJ6aXAyICQoTElCX05BTUUpLnRhciA7IFwKQEAgLTQ4MCw2ICs1MTcsNyBAQAogCiBsaWJfemlwOgogCXJtIC1mIGNvbmZpZ3MvY3VycmVudCA7IFwKKwlybSAtZiBjb25maWdzL2F1dG9jb25mIDsgXAogCXJtIC1mICQoTElCX05BTUUpLnppcCA7IFwKIAljZCAuLiA7IFwKIAl6aXAgLXFyICQoTElCX05BTUUpLnppcCAkKExJQl9GSUxFUykgOyBcCkBAIC01MDcsMyArNTQ1LDYgQEAKIAlALW1kNXN1bSAkKEdMVVRfTkFNRSkudGFyLmd6CiAJQC1tZDVzdW0gJChHTFVUX05BTUUpLnRhci5iejIKIAlALW1kNXN1bSAkKEdMVVRfTkFNRSkuemlwCisKKy5QSE9OWTogdGFyYmFsbHMgcm1fZGVwZW5kIGxpYl9neiBkZW1vX2d6IGdsdXRfZ3ogbGliX2J6MiBkZW1vX2J6MiBcCisJZ2x1dF9iejIgbGliX3ppcCBkZW1vX3ppcCBnbHV0X3ppcCBtZDUKZGlmZiAtLWdpdCBhL2FjaW5jbHVkZS5tNCBiL2FjaW5jbHVkZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIzODlkCi0tLSAvZGV2L251bGwKKysrIGIvYWNpbmNsdWRlLm00CkBAIC0wLDAgKzEsMTE5IEBACisjIEEgZmV3IGNvbnZlbmllbmNlIG1hY3JvcyBmb3IgTWVzYSwgbW9zdGx5IHRvIGtlZXAgYWxsIHRoZSBwbGF0Zm9ybQorIyBzcGVjaWZpY3Mgb3V0IG9mIGNvbmZpZ3VyZS5hYy4KKworIyBNRVNBX1BJQ19GTEFHUygpCisjCisjIEZpbmQgb3V0IHdoZXRoZXIgdG8gYnVpbGQgUElDIGNvZGUgdXNpbmcgdGhlIG9wdGlvbiAtLWVuYWJsZS1waWMgYW5kCisjIHRoZSBjb25maWd1cmUgZW5hYmxlX3N0YXRpYy9lbmFibGVfc2hhcmVkIHNldHRpbmdzLiBJZiBQSUMgaXMgbmVlZGVkLAorIyBmaWd1cmUgb3V0IHRoZSBuZWNlc3NhcnkgZmxhZ3MgZm9yIHRoZSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIuCisjCisjIFRoZSBwbGF0Zm9ybSBjaGVja3MgaGF2ZSBiZWVuIHNoYW1lbGVzc2x5IHRha2VuIGZyb20gbGlidG9vbCBhbmQKKyMgc3RyaXBwZWQgZG93biB0byBqdXN0IHdoYXQncyBuZWVkZWQgZm9yIE1lc2EuIFNlZSBfTFRfQ09NUElMRVJfUElDIGluCisjIC91c3Ivc2hhcmUvYWNsb2NhbC9saWJ0b29sLm00IG9yCisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9bGlidG9vbC5naXQ7YT1ibG9iO2Y9bGlibHRkbC9tNC9saWJ0b29sLm00O2hiPUhFQUQKKyMKK0FDX0RFRlVOKFtNRVNBX1BJQ19GTEFHU10sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19BUkdfVkFSKFtQSUNfRkxBR1NdLCBbY29tcGlsZXIgZmxhZ3MgZm9yIFBJQyBjb2RlXSkKK0FDX0FSR19FTkFCTEUoW3BpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtcGljXSwKKyAgICAgICAgW2NvbXBpbGUgUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9ZW5hYmxlZCBmb3Igc2hhcmVkIGJ1aWxkcworICAgICAgICBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zQDo+QF0pXSwKKyAgICBbZW5hYmxlX3BpYz0iJGVuYWJsZXZhbCIKKyAgICB0ZXN0ICJ4JGVuYWJsZV9waWMiID0geCAmJiBlbmFibGVfcGljPWF1dG9dLAorICAgIFtlbmFibGVfcGljPWF1dG9dKQorIyBkaXNhYmxlIFBJQyBieSBkZWZhdWx0IGZvciBzdGF0aWMgYnVpbGRzCitpZiB0ZXN0ICIkZW5hYmxlX3BpYyIgPSBhdXRvICYmIHRlc3QgIiRlbmFibGVfc3RhdGljIiA9IHllczsgdGhlbgorICAgIGVuYWJsZV9waWM9bm8KK2ZpCisjIGlmIFBJQyBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IGRpc2FibGVkLCB0cnkgdG8gZmlndXJlIG91dCB0aGUgZmxhZ3MKK2lmIHRlc3QgIiRlbmFibGVfcGljIiAhPSBubzsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbZm9yICRDQyBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorICAgICMgYWxsb3cgdGhlIHVzZXIncyBmbGFncyB0byBvdmVycmlkZQorICAgIGlmIHRlc3QgIngkUElDX0ZMQUdTIiA9IHg7IHRoZW4KKyAgICAgICAgIyBzZWUgaWYgd2UncmUgdXNpbmcgR0NDCisgICAgICAgIGlmIHRlc3QgIngkR0NDIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgICAgICAgYWl4KnxiZW9zKnxjeWd3aW4qfGlyaXg1Knxpcml4Nip8b3NmMyp8b3NmNCp8b3NmNSopCisgICAgICAgICAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIG1pbmd3KnxvczIqfHB3MzIqKQorICAgICAgICAgICAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIKKyAgICAgICAgICAgICAgICAjIGl0IGlzIGJlaW5nIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQKKyAgICAgICAgICAgICAgICAjIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1ERExMX0VYUE9SVCIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZGFyd2luKnxyaGFwc29keSopCisgICAgICAgICAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1mbm8tY29tbW9uIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBocHV4KikKKyAgICAgICAgICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLAorICAgICAgICAgICAgICAgICMgYnV0IG5vdCBmb3IgUEEgSFAtVVguCisgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1mUElDIgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAjIEV2ZXJ5b25lIGVsc2Ugb24gR0NDIHVzZXMgLWZQSUMKKyAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1mUElDIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGVsc2UgIyAhR0NDCisgICAgICAgICAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgICAgICAgIGhwdXg5KnxocHV4MTAqfGhwdXgxMSopCisgICAgICAgICAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwKKyAgICAgICAgICAgICAgICAjIGJ1dCBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgICAgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgICAgICAgIyArWiB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgIFBJQ19GTEFHUz0iK1oiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBsaW51eCp8aypic2QqLWdudSkKKyAgICAgICAgICAgICAgICBjYXNlIGBiYXNlbmFtZSAiJENDImAgaW4KKyAgICAgICAgICAgICAgICBpY2MqfGVjYyp8aWZvcnQqKQorICAgICAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1LUElDIgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIHBnY2MqfHBnZjc3KnxwZ2Y5MCp8cGdmOTUqKQorICAgICAgICAgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjCisgICAgICAgICAgICAgICAgICAgICMgY29tcGlsZXIsIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorICAgICAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1mcGljIgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGNjYyopCisgICAgICAgICAgICAgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIHhsKikKKyAgICAgICAgICAgICAgICAgICAgIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xIG9uIFBQQworICAgICAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1xcGljIgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAgICAgICAgICAgICAgICAgICAqU3VuXCBDKnwqU3VuXCBGKikKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU3VuIEMgNS45IG9yIFN1biBGb3J0cmFuCisgICAgICAgICAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1LUElDIgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgc29sYXJpcyopCisgICAgICAgICAgICAgICAgUElDX0ZMQUdTPSItS1BJQyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgc3Vub3M0KikKKyAgICAgICAgICAgICAgICBQSUNfRkxBR1M9Ii1QSUMiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkgIyBHQ0MKKyAgICBmaSAjIFBJQ19GTEFHUworICAgIEFDX01TR19SRVNVTFQoWyRQSUNfRkxBR1NdKQorZmkKK0FDX1NVQlNUKFtQSUNfRkxBR1NdKQorXSkjIE1FU0FfUElDX0ZMQUdTCmRpZmYgLS1naXQgYS9hdXRvZ2VuLnNoIGIvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOWU1YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXV0b2dlbi5zaApAQCAtMCwwICsxLDE2IEBACisjISAvYmluL3NoCisKK3NyY2Rpcj1gZGlybmFtZSAiJDAiYAordGVzdCAteiAiJHNyY2RpciIgJiYgc3JjZGlyPS4KKworU1JDRElSPWAoY2QgIiRzcmNkaXIiICYmIHB3ZClgCitPUklHRElSPWBwd2RgCisKK2lmIHRlc3QgIngkU1JDRElSIiAhPSAieCRPUklHRElSIjsgdGhlbgorCWVjaG8gIk1lc2EgY2Fubm90IGJlIGJ1aWx0IHdoZW4gc3JjZGlyICE9IGJ1aWxkZGlyIiAxPiYyCisJZXhpdCAxCitmaQorCithdXRvcmVjb25mIC12IC0taW5zdGFsbCB8fCBleGl0IDEKKworIiRzcmNkaXIiL2NvbmZpZ3VyZSAiJEAiCmRpZmYgLS1naXQgYS9iaW4vY29uZmRpZmYuc2ggYi9iaW4vY29uZmRpZmYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTY4ZmNkNgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9jb25mZGlmZi5zaApAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vYmFzaCAtZQorCit1c2FnZSgpCit7CisJZWNobyAiVXNhZ2U6ICQwIDx0YXJnZXQxPiA8dGFyZ2V0Mj4iCisJZWNobyAiSGlnaGxpZ2h0IGRpZmZlcmVuY2VzIGJldHdlZW4gTWVzYSBjb25maWdzIgorCWVjaG8gIkV4YW1wbGU6IgorCWVjaG8gIiAgJDAgbGludXggbGludXgteDg2IgorfQorCitkaWUoKQoreworCWVjaG8gIiRAIiA+JjIKKwlyZXR1cm4gMQorfQorCitjYXNlICIkMSIgaW4KKy1ofC0taGVscCkgdXNhZ2U7IGV4aXQgMDs7Citlc2FjCisKK1sgJCMgLWx0IDIgXSAmJiBkaWUgMiB0YXJnZXRzIG5lZWRlZC4gU2VlICQwIC0taGVscAordGFyZ2V0MT0kMQordGFyZ2V0Mj0kMgorCit0b3BkaXI9JChjZCAiYGRpcm5hbWUgJDBgIi8uLjsgcHdkKQorY2QgIiR0b3BkaXIiCisKK1sgLWYgIi4vY29uZmlncy8kdGFyZ2V0MSIgXSB8fCBkaWUgTWlzc2luZyBjb25maWdzLyR0YXJnZXQxCitbIC1mICIuL2NvbmZpZ3MvJHRhcmdldDIiIF0gfHwgZGllIE1pc3NpbmcgY29uZmlncy8kdGFyZ2V0MgorCit0cmFwICdybSAtZiAiJHQxIiAiJHQyIicgMAorCit0MT0kKG1rdGVtcCkKK3QyPSQobWt0ZW1wKQorCittYWtlIC1mLSAtbiAtcCA8PEVPRiB8IHNlZCAnL14jIE5vdCBhIHRhcmdldC8sL14kL2QnID4gJHQxCitUT1AgPSAuCitpbmNsdWRlIFwkKFRPUCkvY29uZmlncy8kdGFyZ2V0MQorZGVmYXVsdDoKK0VPRgorCittYWtlIC1mLSAtbiAtcCA8PEVPRiB8IHNlZCAnL14jIE5vdCBhIHRhcmdldC8sL14kL2QnID4gJHQyCitUT1AgPSAuCitpbmNsdWRlIFwkKFRPUCkvY29uZmlncy8kdGFyZ2V0MgorZGVmYXVsdDoKK0VPRgorCitkaWZmIC1wdSAtSSdeIycgJHQxICR0MgpkaWZmIC0tZ2l0IGEvYmluL2NvbmZpZy5ndWVzcyBiL2Jpbi9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc4ZjllOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTE2IEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKwordGltZXN0YW1wPScyMDA3LTA3LTIyJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXJtOnJpc2NvczoqOip8YXJtOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgOzsKKyAgICAqOkludGVyaXgqOlszNDU2XSopCisgICAgCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIEVNNjRUIHwgYXV0aGVudGljYW1kKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwllc2FjIDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzCisJI3VuZGVmIG1pcHNlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHNlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwcworCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHM2NAorCSN1bmRlZiBtaXBzNjRlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHM2NGVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzNjQKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKKwkgICAgL15DUFUveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWxwaGE6TGludXg6KjoqKQorCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCisJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OworCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7CisJICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OworCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7CisJICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKKyAgICAgICAgZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgbGQuc28uMSA+L2Rldi9udWxsCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHZheDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2E6TGludXg6KjoqKQorICAgIAllY2hvIHh0ZW5zYS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCA7OworCSAgY29mZi1pMzg2KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCisJCWV4aXQgOzsKKwkgICIiKQorCQkjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkgb3IKKwkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiCisJCWV4aXQgOzsKKwllc2FjCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWZkZWYgX19FTEZfXworCSMgaWZkZWYgX19HTElCQ19fCisJIyAgaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSMgIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyAgZW5kaWYKKwkjIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyBlbmRpZgorCSNlbHNlCisJI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgfHwgZGVmaW5lZChfX1BHSSkgfHwgZGVmaW5lZChfX1NVTlBST19DKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQorCUxJQkM9Z251CisJI2Vsc2UKKwlMSUJDPWdudWFvdXQKKwkjZW5kaWYKKwkjZW5kaWYKKwkjaWZkZWYgX19kaWV0bGliY19fCisJTElCQz1kaWV0bGliYworCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkxJQkMveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7TElCQ30iICE9IHggJiYgeworCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCisJCWV4aXQKKwl9CisJdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiB7IGVjaG8gIiR7VEVOVEFUSVZFfSI7IGV4aXQ7IH0KKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCA7OworICAgIGkqODY6c3lsbGFibGU6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQorCWV4aXQgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCA7OworICAgIGkqODY6Kjo1Ols2NzhdKikKKyAgICAJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCA7OworICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgOzsKKyAgICAqOipWTVM6KjoqKQorICAgIAlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9jZ2ktYmluL3ZpZXdjdnMvKmNoZWNrb3V0Ki9jb25maWcvY29uZmlnL2NvbmZpZy5ndWVzcworYW5kCisgIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLnN1YgorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2Jpbi9jb25maWcuc3ViIGIvYmluL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTc2MWQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTYyNiBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKwordGltZXN0YW1wPScyMDA3LTA2LTI4JworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IGxpbnV4LXVjbGliYyogfCBcCisgIHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSB8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmZpbi0qIHwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EtKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2KQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkamdwcCkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCW9zPS1tc2Rvc2RqZ3BwCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpKjg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWkqODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpKjg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaSo4NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKKwkJb3M9LW1hY2gKKwkJOzsKKwlpMzg2LXZzdGEgfCB2c3RhKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5ndzMyY2UpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LW1pbmd3MzJjZQorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvYWQxKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAorCQlvcz0tdG9wczIwCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXRwZikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJb3M9LXRwZgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdjgxMCB8IG5lY3Y4MTApCisJCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKKwkJb3M9LW5vbmUKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorCQk7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeGJveCkKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJbWFjIHwgbXB3IHwgbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCTs7CisJcG1hYyB8IHBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKwkqLXVua25vd24pCisJCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCisJCTs7CisJKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWRpZ2l0YWwqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKKwkJOzsKKwkqLWNvbW1vZG9yZSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCisJCTs7CisJKikKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2lmIFsgeCIkb3MiICE9IHgiIiBdCit0aGVuCitjYXNlICRvcyBpbgorICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCisJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCisJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktbGludXgtZGlldGxpYmMpCisJCW9zPS1saW51eC1kaWV0bGliYworCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisgICAgICAgIC10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKyAgICAgICAgc2NvcmUtKikKKwkJb3M9LWVsZgorCQk7OworICAgICAgICBzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIGM0eC0qIHwgdGljNHgtKikKKyAgICAgICAgCW9zPS1jb2ZmCisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvYmluL2luc3RhbGwtc2ggYi9iaW4vaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wODg0MDdkCi0tLSAvZGV2L251bGwKKysrIGIvYmluL2luc3RhbGwtc2gKQEAgLTAsMCArMSBAQAorbWluc3RhbGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW4vbWluc3RhbGwgYi9iaW4vbWluc3RhbGwKaW5kZXggODE5YjJiYy4uOGVlOTYwOCAxMDA3NTUKLS0tIGEvYmluL21pbnN0YWxsCisrKyBiL2Jpbi9taW5zdGFsbApAQCAtNDIsNiArNDIsOCBAQAogCQkJZXhpdCAwCiAJCWZpCiAKKwkJUFdEU0FWRT1gcHdkYAorCiAJCSMgZGV0ZXJtaW5lIGZpbGUncyB0eXBlCiAJCWlmIFsgLWggIiRGSUxFIiBdIDsgdGhlbgogCQkJI2VjaG8gJEZJTEUgaXMgYSBzeW1saW5rCkBAIC01Nyw3ICs1OSw2IEBACiAKIAkJCUZJTEU9YGJhc2VuYW1lICIkRklMRSJgCiAJCQkjIEdvIHRvICRERVNUIGFuZCBtYWtlIHRoZSBsaW5rCi0JCQlQV0RTQVZFPSIkUFdEIgogCQkJY2QgIiRERVNUIiAgICAgICAgIyBwdXNoZAogCQkJCSRSTSAiJEZJTEUiCiAJCQkJJFNZTUxJTksgIiRUQVJHRVQiICIkRklMRSIKZGlmZiAtLWdpdCBhL2Jpbi9ta2xpYiBiL2Jpbi9ta2xpYgppbmRleCAwMzFlMDQ5Li5hMjVkNWJmIDEwMDc1NQotLS0gYS9iaW4vbWtsaWIKKysrIGIvYmluL21rbGliCkBAIC0zNCw2ICszNCw3IEBACiBQQVRDSD0iIgogREVQUz0iIgogTElOSz0iIgorTERGTEFHUz0iIgogQ1BMVVNQTFVTPTAKIFNUQVRJQz0wCiBETE9QRU49MApAQCAtNDIsNyArNDMsNyBAQAogQVJDSE9QVD0iIgogTk9QUkVGSVg9MAogRVhQT1JUUz0iIgotCitJRD0iIgogCiAjCiAjIFBhcnNlIGFyZ3VtZW50cwpAQCAtNjAsMTcgKzYxLDIxIEBACiAJICAgIGVjaG8gJyAgLW1pbm9yIE4gICAgICBzcGVjaWZpZXMgbWlub3IgdmVyc2lvbiBudW1iZXIgKGRlZmF1bHQgaXMgMCknCiAJICAgIGVjaG8gJyAgLXBhdGNoIE4gICAgICBzcGVjaWZpZXMgcGF0Y2ggdmVyc2lvbiBudW1iZXIgKGRlZmF1bHQgaXMgMCknCiAJICAgIGVjaG8gJyAgLWxMSUJSQVJZICAgICBzcGVjaWZpZXMgYSBkZXBlbmRlbmN5IG9uIExJQlJBUlknCi0JICAgIGVjaG8gJyAgLUxESVIgICAgICAgICBzZWFyY2ggaW4gRElSIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcycKKwkgICAgZWNobyAnICAtTERJUiAgICAgICAgIHNlYXJjaCBpbiBESVIgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGF0IGJ1aWxkIHRpbWUnCisJICAgIGVjaG8gJyAgLVJESVIgICAgICAgICBzZWFyY2ggaW4gRElSIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcyBhdCBydW4gdGltZScKIAkgICAgZWNobyAnICAtbGlua2VyIEwgICAgIGV4cGxpY2l0eSBzcGVjaWZ5IHRoZSBsaW5rZXIgcHJvZ3JhbSB0byB1c2UgKGVnOiBnY2MsIGcrKyknCiAJICAgIGVjaG8gJyAgICAgICAgICAgICAgICBOb3Qgb2JzZXJ2ZWQgb24gYWxsIHN5c3RlbXMgYXQgdGhpcyB0aW1lLicKKwkgICAgZWNobyAnICAtbGRmbGFncyBPUFQgIHNwZWNpZnkgYW55IGFkZGl0aW9uYWwgbGlua2VyIGZsYWdzIGluIE9QVCcKIAkgICAgZWNobyAnICAtY3BsdXNwbHVzICAgIGxpbmsgd2l0aCBDKysgcnVudGltZScKIAkgICAgZWNobyAnICAtc3RhdGljICAgICAgIG1ha2UgYSBzdGF0aWMgbGlicmFyeSAoZGVmYXVsdCBpcyBkeW5hbWljL3NoYXJlZCknCiAJICAgIGVjaG8gJyAgLWRsb3BlbiAgICAgICBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgc3VpdGFibGUgZm9yIGR5bmFtaWMgbG9hZGluZycKIAkgICAgZWNobyAnICAtaW5zdGFsbCBESVIgIHB1dCByZXN1bHRpbmcgbGlicmFyeSBmaWxlKHMpIGluIERJUicKIAkgICAgZWNobyAnICAtYXJjaCBBUkNIICAgIG92ZXJyaWRlIHVzaW5nIGB1bmFtZWAgdG8gZGV0ZXJtaW5lIGhvc3Qgc3lzdGVtJwogCSAgICBlY2hvICcgIC1hcmNob3B0IE9QVCAgc3BlY2lmeSBhbiBleHRyYSBhY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpb24gT1BUJworCSAgICBlY2hvICcgIC1hbHRvcHRzIE9QVFMgYWx0ZXJuYXRlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgYWxsIG90aGVycycKIAkgICAgZWNobyAiICAtbm9wcmVmaXggICAgIGRvbid0IHByZWZpeCBsaWJyYXJ5IG5hbWUgd2l0aCAnbGliJyBub3IgYWRkIGFueSBzdWZmaXgiCiAJICAgIGVjaG8gJyAgLWV4cG9ydHMgRklMRSBvbmx5IGV4cG9ydCB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gRklMRScKKwkgICAgZWNobyAnICAtaWQgTkFNRSAgICAgIFNldHMgdGhlIGlkIG9mIHRoZSBkeWxpYiAoRGFyd2luKScKIAkgICAgZWNobyAnICAtaCwgLS1oZWxwICAgIGRpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbiBhbmQgZXhpdCcKIAkgICAgZXhpdCAxCiAJICAgIDs7CkBAIC05NCwxMiArOTksMjIgQEAKIAkgICAgc2hpZnQgMTsKIAkgICAgTElOSz0kMQogCSAgICA7OworCSctbGRmbGFncycpCisJICAgIHNoaWZ0IDE7CisJICAgIExERkxBR1M9JDEKKwkgICAgOzsKIAktbCopCiAJICAgIERFUFM9IiRERVBTICQxIgogCSAgICA7OwogCS1MKikKIAkgICAgREVQUz0iJERFUFMgJDEiCiAJICAgIDs7CisJLVIqKQorCSAgICBERVBTPSIkREVQUyAkMSIKKwkgICAgOzsKKwktV2wqKQorICAgICAgICAgICAgREVQUz0iJERFUFMgJDEiCisgICAgICAgICAgICA7OwogCS1wdGhyZWFkKQogCSAgICAjIHRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgKHNlZSBidWd6aWxsYSAxMDg3NikKIAkgICAgREVQUz0iJERFUFMgJDEiCkBAIC0xMjgsNiArMTQzLDEwIEBACiAJICAgIHNoaWZ0IDE7CiAJICAgIEFSQ0hPUFQ9JDEKIAkgICAgOzsKKwknLWFsdG9wdHMnKQorICAgICAgICAgICAgc2hpZnQgMTsKKyAgICAgICAgICAgIEFMVE9QVFM9JDEKKyAgICAgICAgICAgIDs7CiAJJy1ub3ByZWZpeCcpCiAJICAgIE5PUFJFRklYPTEKIAkgICAgOzsKQEAgLTEzNSw2ICsxNTQsMTAgQEAKIAkgICAgc2hpZnQgMTsKIAkgICAgRVhQT1JUUz0kMQogCSAgICA7OworCSctaWQnKQorCSAgICBzaGlmdCAxOworCSAgICBJRD0kMQorCSAgICA7OwogCS0qKQogCSAgICBlY2hvICJta2xpYjogVW5rbm93biBvcHRpb246ICIgJDEgOwogCSAgICBleGl0IDEKQEAgLTE3OCw2ICsyMDEsNyBAQAogICAgIGVjaG8gUEFUQ0ggaXMgJFBBVENICiAgICAgZWNobyBERVBTIGFyZSAkREVQUwogICAgIGVjaG8gIkVYUE9SVFMgaW4iICRFWFBPUlRTCisgICAgZWNobyBJRCBpcyAkSUQKICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLSIKIGZpCiAKQEAgLTE4Nyw3ICsyMTEsNyBAQAogIwogY2FzZSAkQVJDSCBpbgogCi0gICAgJ0xpbnV4JyB8ICdPcGVuQlNEJyB8ICdHTlUnIHwgR05VLyopCisgICAgJ0xpbnV4JyB8ICdPcGVuQlNEJyB8ICdEcmFnb25GbHknIHwgJ0dOVScgfCBHTlUvKikKIAkjIHdlIGFzc3VtZSBnY2MKIAogCWlmIFsgIngkTElOSyIgPSAieCIgXSA7IHRoZW4KQEAgLTIxOCw5ICsyNDIsMTMgQEAKIAkJT1BUUz0iLW0zMiAke09QVFN9IgogCSAgICBmaQogCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKKwogICAgICAgICAgICAgcm0gLWYgJHtMSUJOQU1FfQogICAgICAgICAgICAgIyBtYWtlIGxpYgotICAgICAgICAgICAgJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisgICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gJHtMREZMQUdTfSAtbyAke0xJQk5BTUV9ICR7T0JKRUNUU30gJHtERVBTfQogICAgICAgICAgICAgIyBmaW5pc2ggdXAKICAgICAgICAgICAgIEZJTkFMX0xJQlM9IiR7TElCTkFNRX0iCiAgICAgICAgIGVsaWYgWyAkU1RBVElDID0gMSBdIDsgdGhlbgpAQCAtMjI4LDYgKzI1Niw5IEBACiAgICAgICAgICAgICBlY2hvICJta2xpYjogTWFraW5nIiAkQVJDSCAic3RhdGljIGxpYnJhcnk6ICIgJHtMSUJOQU1FfQogICAgICAgICAgICAgTElOSz0iYXIiCiAgICAgICAgICAgICBPUFRTPSItcnUiCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKICAgICAgICAgICAgIHJtIC1mICR7TElCTkFNRX0KICAgICAgICAgICAgICMgbWFrZSBsaWIKICAgICAgICAgICAgICR7TElOS30gJHtPUFRTfSAke0xJQk5BTUV9ICR7T0JKRUNUU30KQEAgLTI2Myw2ICsyOTQsOSBAQAogCSAgICBpZiBbICIke0FCSTMyfSIgLWEgYHVuYW1lIC1tYCA9ICJ4ODZfNjQiIF0gOyB0aGVuCiAJCU9QVFM9Ii1tMzIgJHtPUFRTfSIKIAkgICAgZmkKKyAgICAgICAgICAgIGlmIFsgIiR7QUxUT1BUU30iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0ke0FMVE9QVFN9CisgICAgICAgICAgICBmaQogCiAJICAgIGlmIFsgeCR7UEFUQ0h9ID0gIngiIF0gOyB0aGVuCiAJCVZFUlNJT049IiR7TUFKT1J9LiR7TUlOT1J9IgpAQCAtMjc4LDcgKzMxMiw3IEBACiAgICAgICAgICAgICBybSAtZiAke0xJQk5BTUV9LnNvCiAKICAgICAgICAgICAgICMgbWFrZSBsaWIKLSAgICAgICAgICAgICR7TElOS30gJHtPUFRTfSAtbyAke0xJQk5BTUV9LnNvLiR7VkVSU0lPTn0gJHtPQkpFQ1RTfSAke0RFUFN9CisgICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gJHtMREZMQUdTfSAtbyAke0xJQk5BTUV9LnNvLiR7VkVSU0lPTn0gJHtPQkpFQ1RTfSAke0RFUFN9CiAgICAgICAgICAgICAjIG1ha2UgdXN1YWwgc3ltbGlua3MKICAgICAgICAgICAgIGxuIC1zICR7TElCTkFNRX0uc28uJHtWRVJTSU9OfSAke0xJQk5BTUV9LnNvLiR7TUFKT1J9CiAgICAgICAgICAgICBsbiAtcyAke0xJQk5BTUV9LnNvLiR7TUFKT1J9ICR7TElCTkFNRX0uc28KQEAgLTMxMiw3ICszNDYsNyBAQAogCQkJIyB1c2UgZysrCiAJCQlMSU5LPSJnKysiCiAJCSAgICBlbHNlCi0JCQllY2hvICJta2xpYjogd2FybmluZzogY2FuJ3QgZmluZCBDKysgY29taWxlciwgdHJ5aW5nIENDLiIKKwkJCWVjaG8gIm1rbGliOiB3YXJuaW5nOiBjYW4ndCBmaW5kIEMrKyBjb21waWxlciwgdHJ5aW5nIENDLiIKIAkJCUxJTks9IkNDIgogCQkgICAgZmkKIAkJZWxzZQpAQCAtMzQxLDE5ICszNzUsMjMgQEAKIAkgICAgIyBDaGVjayBpZiBvYmplY3RzIGFyZSBTUEFSQyB2OQogCSAgICAjIGZpbGUgc2F5czogRUxGIDY0LWJpdCBNU0IgcmVsb2NhdGFibGUgU1BBUkNWOSBWZXJzaW9uIDEKIAkgICAgc2V0ICR7T0JKRUNUU30KLQkgICAgU1BBUkNWOT1gZmlsZSAkMSB8IGdyZXAgU1BBUkNWOWAKLQkgICAgaWYgWyAiJHtTUEFSQ1Y5fSIgXSA7IHRoZW4KLQkJT1BUUz0iJHtPUFRTfSAteGFyY2g9djkiCisJICAgIGlmIFsgJHtMSU5LfSA9ICJjYyIgLW8gJHtMSU5LfSA9ICJDQyIgXSA7IHRoZW4KKwkJU1BBUkNWOT1gZmlsZSAkMSB8IGdyZXAgU1BBUkNWOWAKKwkJaWYgWyAiJHtTUEFSQ1Y5fSIgXSA7IHRoZW4KKwkJICAgIE9QVFM9IiR7T1BUU30gLXhhcmNoPXY5IgorCQlmaQogCSAgICBmaQotCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKIAkgICAgIyBmb3IgZGVidWc6CiAJICAgICNlY2hvICJta2xpYjogbGlua2VyIGlzIiAke0xJTkt9ICR7T1BUU30KIAkgICAgaWYgWyAkTk9QUkVGSVggPSAxIF0gOyB0aGVuCiAJCXJtIC1mICR7TElCTkFNRX0KLQkJJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisJCSR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CiAJICAgIGVsc2UKIAkJcm0gLWYgJHtMSUJOQU1FfS4ke01BSk9SfSAke0xJQk5BTUV9Ci0JCSR7TElOS30gJHtPUFRTfSAtbyAke0xJQk5BTUV9LiR7TUFKT1J9ICR7T0JKRUNUU30gJHtERVBTfQorCQkke0xJTkt9ICR7T1BUU30gJHtMREZMQUdTfSAtbyAke0xJQk5BTUV9LiR7TUFKT1J9IC1oICR7TElCTkFNRX0uJHtNQUpPUn0gJHtPQkpFQ1RTfSAke0RFUFN9CiAJCWxuIC1zICR7TElCTkFNRX0uJHtNQUpPUn0gJHtMSUJOQU1FfQogCSAgICBmaQogCSAgICBGSU5BTF9MSUJTPSIke0xJQk5BTUV9LiR7TUFKT1J9ICR7TElCTkFNRX0iCkBAIC0zNzYsOCArNDE0LDExIEBACiAJICAgICMgTm8gImxpYiIgb3IgIi5zbyIgcGFydAogCSAgICBlY2hvICJta2xpYjogTWFraW5nIEZyZWVCU0Qgc2hhcmVkIGxpYnJhcnk6ICIgJHtMSUJOQU1FfQogCSAgICBPUFRTPSItc2hhcmVkIgorICAgICAgICAgICAgaWYgWyAiJHtBTFRPUFRTfSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSR7QUxUT1BUU30KKyAgICAgICAgICAgIGZpCiAJICAgIHJtIC1mICR7TElCTkFNRX0KLQkgICAgJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisJICAgICR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CiAJICAgIEZJTkFMX0xJQlM9JHtMSUJOQU1FfQogICAgICAgICBlbGlmIFsgJFNUQVRJQyA9IDEgXSA7IHRoZW4KIAkgICAgU1RMSUI9ImxpYiR7TElCTkFNRX0uYSIKQEAgLTM4OSw5ICs0MzAsMTIgQEAKIAllbHNlCiAJICAgIFNITElCPSJsaWIke0xJQk5BTUV9LnNvLiR7TUFKT1J9IgogCSAgICBPUFRTPSItc2hhcmVkIC1XbCwtc29uYW1lLCR7U0hMSUJ9IgorICAgICAgICAgICAgaWYgWyAiJHtBTFRPUFRTfSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSR7QUxUT1BUU30KKyAgICAgICAgICAgIGZpCiAJICAgIGVjaG8gIm1rbGliOiBNYWtpbmcgRnJlZUJTRCBzaGFyZWQgbGlicmFyeTogIiAke1NITElCfQogCSAgICBybSAtZiAke1NITElCfQotCSAgICAke0xJTkt9ICR7T1BUU30gLW8gJHtTSExJQn0gJHtPQkpFQ1RTfSAke0RFUFN9CisJICAgICR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7U0hMSUJ9ICR7T0JKRUNUU30gJHtERVBTfQogCSAgICBsbiAtc2YgJHtTSExJQn0gImxpYiR7TElCTkFNRX0uc28iCiAJICAgIEZJTkFMX0xJQlM9IiR7U0hMSUJ9IGxpYiR7TElCTkFNRX0uc28iCiAJZmkKQEAgLTQ0Miw2ICs0ODYsMTAgQEAKIAkJZXhpdCAxCiAJICAgIGZpCiAKKyAgICAgICAgICAgIGlmIFsgIiR7QUxUT1BUU30iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0ke0FMVE9QVFN9CisgICAgICAgICAgICBmaQorCiAJICAgIGlmIFsgJENQTFVTUExVUyA9IDEgXSA7IHRoZW4KIAkJTElOSz0iQ0MiCiAJICAgIGVsc2UKQEAgLTQ0OSw3ICs0OTcsNyBAQAogCSAgICBmaQogCiAJICAgIGVjaG8gIm1rbGliOiBNYWtpbmcgSVJJWCAiICR7QUJJfSAiIHNoYXJlZCBsaWJyYXJ5OiAiICR7TElCTkFNRX0KLQkgICAgJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisJICAgICR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CiAJICAgIEZJTkFMX0xJQlM9JHtMSUJOQU1FfQogCWZpCiAJOzsKQEAgLTUyMiwxMiArNTcwLDE2IEBACiAJCX0KIAkgICAgfScgfCBzb3J0IC11ID4+ICR7RVhQRklMRX0KIAorICAgICAgICAgICAgaWYgWyAiJHtBTFRPUFRTfSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSR7QUxUT1BUU30KKyAgICAgICAgICAgIGZpCisKICAgICAgICAgICAgICMgT24gQUlYIGEgc2hhcmVkIGxpYnJhcnkgaXMgbGlua2VkIGRpZmZlcmVudGx5IHdoZW4KICAgICAgICAgICAgICMgeW91IHdhbnQgdG8gZGxvcGVuIHRoZSBmaWxlCiAJICAgIGlmIFsgJERMT1BFTiA9ICIxIiBdIDsgdGhlbgotCQljYyAtRyAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisJCWNjIC1HICR7T1BUU30gJHtMREZMQUdTfSAtbyAke0xJQk5BTUV9ICR7T0JKRUNUU30gJHtERVBTfQogCSAgICBlbHNlCi0JCWNjICR7T1BUU30gLW8gJHtPRklMRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisJCWNjICR7T1BUU30gJHtMREZMQUdTfSAtbyAke09GSUxFfSAke09CSkVDVFN9ICR7REVQU30KIAkJYXIgJHtYNjR9IC1yICR7TElCTkFNRX0gJHtPRklMRX0KIAkgICAgZmkKIApAQCAtNTczLDYgKzYyNSw5IEBACiAgICAgICAgICAgICBlY2hvICJta2xpYjogTWFraW5nIERhcndpbiBzdGF0aWMgbGlicmFyeTogIiAke0xJQk5BTUV9CiAgICAgICAgICAgICBMSU5LPSJhciIKICAgICAgICAgICAgIE9QVFM9Ii1ydXZzIgorICAgICAgICAgICAgaWYgWyAiJHtBTFRPUFRTfSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSR7QUxUT1BUU30KKyAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gJHtMSUJOQU1FfSAke09CSkVDVFN9CiAgICAgICAgICAgICBGSU5BTF9MSUJTPSR7TElCTkFNRX0KICAgICAgICAgZWxzZQpAQCAtNTgxLDIyICs2MzYsNDYgQEAKICAgICAgICAgICAgICAgICBMSUJTVUZGSVg9ImJ1bmRsZSIKICAgICAgICAgICAgICAgICBPUFRTPSIke0FSQ0hPUFR9IC1idW5kbGUgLW11bHRpcGx5X2RlZmluZWQgc3VwcHJlc3MiCiAgICAgICAgICAgICBlbHNlCi0JCUxJQlNVRkZJWD0iZHlsaWIiCi0gICAgICAgICAgICAgICAgT1BUUz0iJHtBUkNIT1BUfSAtZHluYW1pY2xpYiAtbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcyAtY3VycmVudF92ZXJzaW9uICR7TUFKT1J9LiR7TUlOT1J9LjAgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke01BSk9SfS4ke01JTk9SfS4wIC1pbnN0YWxsX25hbWUgbGliJHtMSUJOQU1FfS4ke01BSk9SfS4ke0xJQlNVRkZJWH0iCisgICAgICAgICAgICAgICAgTElCU1VGRklYPSJkeWxpYiIKKyAgICAgICAgICAgICAgICBpZiBbIC16ICIkSUQiIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIElEPSJsaWIke0xJQk5BTUV9LiR7TUFKT1J9LiR7TElCU1VGRklYfSIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIE9QVFM9IiR7QVJDSE9QVH0gLWR5bmFtaWNsaWIgLW11bHRpcGx5X2RlZmluZWQgc3VwcHJlc3MgLWN1cnJlbnRfdmVyc2lvbiAke01BSk9SfS4ke01JTk9SfS4wIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHtNQUpPUn0uJHtNSU5PUn0uMCAtaW5zdGFsbF9uYW1lICR7SUR9IgogICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIExJTktOQU1FPSJsaWIke0xJQk5BTUV9LiR7TElCU1VGRklYfSIKLSAgICAgICAgICAgIExJQk5BTUU9ImxpYiR7TElCTkFNRX0uJHtNQUpPUn0uJHtMSUJTVUZGSVh9IgorCisgICAgICAgICAgICBpZiBbICR7RVhQT1JUU30gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbIC1mICR7RVhQT1JUU30iLmRhcndpbiIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgRVhQT1JUUz0kRVhQT1JUUyIuZGFyd2luIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgT1BUUz0iJHtPUFRTfSAtZXhwb3J0ZWRfc3ltYm9sc19saXN0ICR7RVhQT1JUU30iCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBMSU5LTkFNRT0ibGliJHtMSUJOQU1FfS4ke01BSk9SfS4ke0xJQlNVRkZJWH0iCisgICAgICAgICAgICBMSU5LTkFNRTI9ImxpYiR7TElCTkFNRX0uJHtMSUJTVUZGSVh9IgorICAgICAgICAgICAgTElCTkFNRT0ibGliJHtMSUJOQU1FfS4ke01BSk9SfS4ke01JTk9SfS4ke0xJQlNVRkZJWH0iCiAKIAkgICAgIyBleGFtaW5lIGZpcnN0IG9iamVjdCB0byBkZXRlcm1pbmUgQUJJCiAgICAgCSAgICBzZXQgJHtPQkpFQ1RTfQotCSAgICBBQklfUFBDPWBmaWxlICQxIHwgZ3JlcCAnb2JqZWN0IHBwYydgCi0JICAgIEFCSV9JMzg2PWBmaWxlICQxIHwgZ3JlcCAnb2JqZWN0IGkzODYnYAotCSAgICBpZiBbICIke0FCSV9QUEN9IiBdIDsgdGhlbgotCQlPUFRTPSIke09QVFN9IC1hcmNoIHBwYyIKLQkgICAgZmkKLQkgICAgaWYgWyAiJHtBQklfSTM4Nn0iIF0gOyB0aGVuCi0JCU9QVFM9IiR7T1BUU30gLWFyY2ggaTM4NiIKLQkgICAgZmkKKyAgICAgICAgICAgIEFCSV9QUEM9YGZpbGUgJDEgfCBncmVwICcgcHBjJ2AKKyAgICAgICAgICAgIEFCSV9JMzg2PWBmaWxlICQxIHwgZ3JlcCAnIGkzODYnYAorICAgICAgICAgICAgQUJJX1BQQzY0PWBmaWxlICQxIHwgZ3JlcCAnIHBwYzY0J2AKKyAgICAgICAgICAgIEFCSV9YODZfNjQ9YGZpbGUgJDEgfCBncmVwICcgeDg2XzY0J2AKKyAgICAgICAgICAgIGlmIFsgIiR7QUJJX1BQQ30iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0iJHtPUFRTfSAtYXJjaCBwcGMiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgWyAiJHtBQklfSTM4Nn0iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0iJHtPUFRTfSAtYXJjaCBpMzg2IgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIFsgIiR7QUJJX1BQQzY0fSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSIke09QVFN9IC1hcmNoIHBwYzY0IgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIFsgIiR7QUJJX1g4Nl82NH0iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0iJHtPUFRTfSAtYXJjaCB4ODZfNjQiCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKIAogCSAgICAjIFhYWCBjYW4gd2UgYWx3YXlzIGFkZCAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkawogCSAgICAjIHRvIE9QVFMgaGVyZT8KQEAgLTYwOSw5ICs2ODgsMTEgQEAKIAkgICAgZmkKIAogICAgICAgICAgICAgZWNobyAibWtsaWI6IE1ha2luZyBEYXJ3aW4gc2hhcmVkIGxpYnJhcnk6ICIgJHtMSUJOQU1FfQotICAgICAgICAgICAgJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CisKKyAgICAgICAgICAgICR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7TElCTkFNRX0gJHtPQkpFQ1RTfSAke0RFUFN9CiAgICAgICAgICAgICBsbiAtcyAke0xJQk5BTUV9ICR7TElOS05BTUV9Ci0gICAgICAgICAgICBGSU5BTF9MSUJTPSIke0xJQk5BTUV9ICR7TElOS05BTUV9IgorICAgICAgICAgICAgbG4gLXMgJHtMSUJOQU1FfSAke0xJTktOQU1FMn0KKyAgICAgICAgICAgIEZJTkFMX0xJQlM9IiR7TElCTkFNRX0gJHtMSU5LTkFNRX0gJHtMSU5LTkFNRTJ9IgogICAgICAgICBmaQogICAgICAgICA7OwogCkBAIC02NjMsNiArNzQ0LDkgQEAKICAgICAgICAgICAgIGVjaG8gIm1rbGliOiBNYWtpbmcgSW50ZWwgSUNDIHN0YXRpYyBsaWJyYXJ5OiAiICR7TElCTkFNRX0uYQogICAgICAgICAgICAgTElOSz0iYXIiCiAgICAgICAgICAgICBPUFRTPSItcnV2IgorICAgICAgICAgICAgaWYgWyAiJHtBTFRPUFRTfSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBPUFRTPSR7QUxUT1BUU30KKyAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAjIG1ha2UgbGliCiAgICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gJHtMSUJOQU1FfS5hICR7T0JKRUNUU30KICAgICAgICAgICAgICMgZmluaXNoIHVwCkBAIC02NzMsNiArNzU3LDkgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgT1BUUz0iLXNoYXJlZCIKICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKICAgICAgICAgICAgIFZFUlNJT049IiR7TUFKT1J9LiR7TUlOT1J9LiR7UEFUQ0h9IgogICAgICAgICAgICAgZWNobyAibWtsaWI6IE1ha2luZyBJbnRlbCBJQ0Mgc2hhcmVkIGxpYnJhcnk6ICIgJHtMSUJOQU1FfS5zby4ke1ZFUlNJT059CiAKQEAgLTY4Niw3ICs3NzMsNyBAQAogICAgICAgICAgICAgcm0gLWYgJHtMSUJOQU1FfS5zby4ke01BSk9SfQogICAgICAgICAgICAgcm0gLWYgJHtMSUJOQU1FfS5zbwogICAgICAgICAgICAgIyBtYWtlIGxpYgotICAgICAgICAgICAgJHtMSU5LfSAke09QVFN9IC1vICR7TElCTkFNRX0uc28uJHtWRVJTSU9OfSAke09CSkVDVFN9ICR7REVQU30KKyAgICAgICAgICAgICR7TElOS30gJHtPUFRTfSAke0xERkxBR1N9IC1vICR7TElCTkFNRX0uc28uJHtWRVJTSU9OfSAke09CSkVDVFN9ICR7REVQU30KICAgICAgICAgICAgICMgbWFrZSB1c3VhbCBzeW1saW5rcwogICAgICAgICAgICAgbG4gLXMgJHtMSUJOQU1FfS5zby4ke1ZFUlNJT059ICR7TElCTkFNRX0uc28uJHtNQUpPUn0KICAgICAgICAgICAgIGxuIC1zICR7TElCTkFNRX0uc28uJHtNQUpPUn0gJHtMSUJOQU1FfS5zbwpAQCAtNzM3LDYgKzgyNCw5IEBACiAgICAgICAgICAgICBlY2hvICJta2xpYjogTWFraW5nIiAkQVJDSCAic3RhdGljIGxpYnJhcnk6ICIgJHtMSUJOQU1FfS5hCiAgICAgICAgICAgICBMSU5LPSJhciIKICAgICAgICAgICAgIE9QVFM9Ii1ydSIKKyAgICAgICAgICAgIGlmIFsgIiR7QUxUT1BUU30iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgT1BUUz0ke0FMVE9QVFN9CisgICAgICAgICAgICBmaQogICAgICAgICAgICAgIyBtYWtlIGxpYgogICAgICAgICAgICAgJHtMSU5LfSAke09QVFN9ICR7TElCTkFNRX0uYSAke09CSkVDVFN9CiAJICAgIHJhbmxpYiAke0xJQk5BTUV9LmEKQEAgLTc0NCw2ICs4MzQsOSBAQAogICAgICAgICAgICAgRklOQUxfTElCUz0ke0xJQk5BTUV9LmEKICAgICAgICAgZWxzZQogCSAgICBPUFRTPSItc2hhcmVkIC1XbCwtZXhwb3J0LWFsbCAtV2wsLS1vdXQtaW1wbGliPSR7TElCTkFNRX0tJHtNQUpPUn0uZGxsLmEiCisgICAgICAgICAgICBpZiBbICIke0FMVE9QVFN9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIE9QVFM9JHtBTFRPUFRTfQorICAgICAgICAgICAgZmkKICAgICAgICAgICAgIGVjaG8gIm1rbGliOiBNYWtpbmciICRBUkNIICJzaGFyZWQgbGlicmFyeTogIiAke0xJQk5BTUV9LSR7TUFKT1J9LmRsbAogCiAgICAgICAgICAgICBpZiBbICRDUExVU1BMVVMgPSAxIF0gOyB0aGVuCkBAIC03NTgsNyArODUxLDcgQEAKICAgICAgICAgICAgIHJtIC1mICR7TElCTkFNRX0uYQogCiAgICAgICAgICAgICAjIG1ha2UgbGliCi0gICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gLW8gJHtDWUdOQU1FfS0ke01BSk9SfS5kbGwgJHtPQkpFQ1RTfSAke0RFUFN9CisgICAgICAgICAgICAke0xJTkt9ICR7T1BUU30gJHtMREZMQUdTfSAtbyAke0NZR05BTUV9LSR7TUFKT1J9LmRsbCAke09CSkVDVFN9ICR7REVQU30KICAgICAgICAgICAgICMgbWFrZSB1c3VhbCBzeW1saW5rcwogICAgICAgICAgICAgbG4gLXMgJHtMSUJOQU1FfS0ke01BSk9SfS5kbGwuYSAke0xJQk5BTUV9LmRsbC5hCiAgICAgICAgICAgICAjIGZpbmlzaCB1cApkaWZmIC0tZ2l0IGEvYmluL3ZlcnNpb24ubWsgYi9iaW4vdmVyc2lvbi5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYjIwZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3ZlcnNpb24ubWsKQEAgLTAsMCArMSwxNyBAQAorIyEvdXNyL2Jpbi9tYWtlIC1zZgorIyBQcmludCB0aGUgdmFyaW91cyBNZXNhIHZlcnNpb24gZmllbGRzLiBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIGFkZCB0aGUKKyMgdmVyc2lvbiB0byBjb25maWd1cmUuCisKKyMgVGhpcyByZWZsZWN0cyB0aGF0IHRoaXMgc2NyaXB0IGlzIHVzdWFsbHkgY2FsbGVkIGZyb20gdGhlIHRvcGxldmVsCitUT1AgPSAuCisKK2luY2x1ZGUgJChUT1ApL2NvbmZpZ3MvZGVmYXVsdAorCit2ZXJzaW9uOgorCUBlY2hvICQoTUVTQV9WRVJTSU9OKQorbWFqb3I6CisJQGVjaG8gJChNRVNBX01BSk9SKQorbWlub3I6CisJQGVjaG8gJChNRVNBX01JTk9SKQordGlueToKKwlAZWNobyAkKE1FU0FfVElOWSkKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvLmdpdGlnbm9yZSBiL2NvbmZpZ3MvLmdpdGlnbm9yZQppbmRleCA1YjkwMjNhLi45N2FjNWI3IDEwMDY0NAotLS0gYS9jb25maWdzLy5naXRpZ25vcmUKKysrIGIvY29uZmlncy8uZ2l0aWdub3JlCkBAIC0xICsxLDIgQEAKIGN1cnJlbnQKK2F1dG9jb25mCmRpZmYgLS1naXQgYS9jb25maWdzL2FpeC1nY2MgYi9jb25maWdzL2FpeC1nY2MKaW5kZXggODE0NjcwOC4uM2I5NjRmMyAxMDA2NDQKLS0tIGEvY29uZmlncy9haXgtZ2NjCisrKyBiL2NvbmZpZ3MvYWl4LWdjYwpAQCAtMTEsNiArMTEsMTAgQEAKIENGTEFHUyA9IC1PMiAtREFJWFYzCiBDWFhGTEFHUyA9IC1PMiAtREFJWFYzCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKKwogTUtMSUJfT1BUSU9OUyA9IC1hcmNoIGFpeC1nY2MKIEdMX0xJQl9ERVBTID0gLWxYMTEgLWxYZXh0IC1sbQogR0xVX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xfTElCKSAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3MvYXV0b2NvbmYuaW4gYi9jb25maWdzL2F1dG9jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWFlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2F1dG9jb25mLmluCkBAIC0wLDAgKzEsMTA3IEBACisjIEF1dG9jb25mIGNvbmZpZ3VyYXRpb24KKworIyBQdWxsIGluIHRoZSBkZWZhdWx0cworaW5jbHVkZSAkKFRPUCkvY29uZmlncy9kZWZhdWx0CisKKyMgVGhpcyBpcyBnZW5lcmF0ZWQgYnkgY29uZmlndXJlCitDT05GSUdfTkFNRSA9IGF1dG9jb25mCisKKyMgQ29tcGlsZXIgYW5kIGZsYWdzCitDQyA9IEBDQ0AKK0NYWCA9IEBDWFhACitPUFRfRkxBR1MgPSBAT1BUX0ZMQUdTQAorQVJDSF9GTEFHUyA9IEBBUkNIX0ZMQUdTQAorQVNNX0ZMQUdTID0gQEFTTV9GTEFHU0AKK1BJQ19GTEFHUyA9IEBQSUNfRkxBR1NACitERUZJTkVTID0gQERFRklORVNACitDRkxBR1MgPSBAQ1BQRkxBR1NAIEBDRkxBR1NAIFwKKwkkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChBU01fRkxBR1MpICQoREVGSU5FUykKK0NYWEZMQUdTID0gQENQUEZMQUdTQCBAQ1hYRkxBR1NAIFwKKwkkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChERUZJTkVTKQorTERGTEFHUyA9IEBMREZMQUdTQAorRVhUUkFfTElCX1BBVEggPSBARVhUUkFfTElCX1BBVEhACisKKyMgQXNzZW1ibGVyCitBU01fU09VUkNFUyA9IEBBU01fU09VUkNFU0AKK0FTTV9BUEkgPSBAQVNNX0FQSUAKKworIyBNaXNjIHRvb2xzIGFuZCBmbGFncworTUFLRSA9IEBNQUtFQAorU0hFTEwgPSBAU0hFTExACitNS0xJQl9PUFRJT05TID0gQE1LTElCX09QVElPTlNACitNS0RFUCA9IEBNS0RFUEAKK01LREVQX09QVElPTlMgPSBATUtERVBfT1BUSU9OU0AKKworIyBQeXRob24gYW5kIGZsYWdzIChnZW5lcmFsbHkgb25seSBuZWVkZWQgYnkgdGhlIGRldmVsb3BlcnMpCitQWVRIT04yID0gcHl0aG9uCitQWVRIT05fRkxBR1MgPSAtdCAtTyAtTworCisjIExpYnJhcnkgbmFtZXMgKGJhc2UgbmFtZSkKK0dMX0xJQiA9IEdMCitHTFVfTElCID0gR0xVCitHTFVUX0xJQiA9IGdsdXQKK0dMV19MSUIgPSBHTHcKK09TTUVTQV9MSUIgPSBAT1NNRVNBX0xJQkAKKworIyBMaWJyYXJ5IG5hbWVzIChhY3R1YWwgZmlsZSBuYW1lcykKK0dMX0xJQl9OQU1FID0gQEdMX0xJQl9OQU1FQAorR0xVX0xJQl9OQU1FID0gQEdMVV9MSUJfTkFNRUAKK0dMVVRfTElCX05BTUUgPSBAR0xVVF9MSUJfTkFNRUAKK0dMV19MSUJfTkFNRSA9IEBHTFdfTElCX05BTUVACitPU01FU0FfTElCX05BTUUgPSBAT1NNRVNBX0xJQl9OQU1FQAorCisjIERpcmVjdG9yaWVzIHRvIGJ1aWxkCitMSUJfRElSID0gQExJQl9ESVJACitTUkNfRElSUyA9IEBTUkNfRElSU0AKK0dMVV9ESVJTID0gQEdMVV9ESVJTQAorRFJJVkVSX0RJUlMgPSBARFJJVkVSX0RJUlNACisjIFdoaWNoIHN1YmRpcnMgdW5kZXIgJChUT1ApL3Byb2dzLyB0byBlbnRlcjoKK1BST0dSQU1fRElSUyA9IEBQUk9HUkFNX0RJUlNACisKKyMgRHJpdmVyIHNwZWNpZmljIGJ1aWxkIHZhcnMKK0RSSV9ESVJTID0gQERSSV9ESVJTQAorV0lORE9XX1NZU1RFTSA9IEBXSU5ET1dfU1lTVEVNQAorVVNJTkdfRUdMID0gQFVTSU5HX0VHTEAKKworIyBEZXBlbmRlbmNpZXMKK1gxMV9JTkNMVURFUyA9IEBYMTFfSU5DTFVERVNACisKKyMgR0x3IG1vdGlmIHNldHVwCitHTFdfU09VUkNFUyA9IEBHTFdfU09VUkNFU0AKK01PVElGX0NGTEFHUyA9IEBNT1RJRl9DRkxBR1NACisKKyMgTGlicmFyeS9wcm9ncmFtIGRlcGVuZGVuY2llcworR0xfTElCX0RFUFMgPSAkKEVYVFJBX0xJQl9QQVRIKSBAR0xfTElCX0RFUFNACitPU01FU0FfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIEBPU01FU0FfTUVTQV9ERVBTQCBcCisJJChFWFRSQV9MSUJfUEFUSCkgQE9TTUVTQV9MSUJfREVQU0AKK0dMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgQEdMVV9NRVNBX0RFUFNAIFwKKwkkKEVYVFJBX0xJQl9QQVRIKSBAR0xVX0xJQl9ERVBTQAorR0xVVF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgQEdMVVRfTUVTQV9ERVBTQCBcCisJJChFWFRSQV9MSUJfUEFUSCkgQEdMVVRfTElCX0RFUFNACitHTFdfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIEBHTFdfTUVTQV9ERVBTQCBcCisJJChFWFRSQV9MSUJfUEFUSCkgQEdMV19MSUJfREVQU0AKK0FQUF9MSUJfREVQUyA9ICQoRVhUUkFfTElCX1BBVEgpIEBBUFBfTElCX0RFUFNACisKKyMgRFJJIGRlcGVuZGVuY2llcworRFJJX0xJQl9ERVBTID0gJChFWFRSQV9MSUJfUEFUSCkgQERSSV9MSUJfREVQU0AKK0xJQkRSTV9DRkxBR1MgPSBATElCRFJNX0NGTEFHU0AKK0xJQkRSTV9MSUIgPSBATElCRFJNX0xJQlNACitEUkkyUFJPVE9fQ0ZMQUdTID0gQERSSTJQUk9UT19DRkxBR1NACitFWFBBVF9JTkNMVURFUyA9IEBFWFBBVF9JTkNMVURFU0AKKworIyBBdXRvY29uZiBkaXJlY3RvcmllcworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgKGZvciBtYWtlIGluc3RhbGwpCitJTlNUQUxMX0RJUiA9ICQocHJlZml4KQorSU5TVEFMTF9MSUJfRElSID0gJChsaWJkaXIpCitJTlNUQUxMX0lOQ19ESVIgPSAkKGluY2x1ZGVkaXIpCisKKyMgRFJJIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcworRFJJX0RSSVZFUl9JTlNUQUxMX0RJUiA9IEBEUklfRFJJVkVSX0lOU1RBTExfRElSQAorCisjIFdoZXJlIGxpYkdMIHdpbGwgbG9vayBmb3IgRFJJIGhhcmR3YXJlIGRyaXZlcnMKK0RSSV9EUklWRVJfU0VBUkNIX0RJUiA9ICQoRFJJX0RSSVZFUl9JTlNUQUxMX0RJUikKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvYmVvcyBiL2NvbmZpZ3MvYmVvcwppbmRleCBjNmU5NzI3Li44OTdjMzY4IDEwMDY0NAotLS0gYS9jb25maWdzL2Jlb3MKKysrIGIvY29uZmlncy9iZW9zCkBAIC0zOSw2ICszOSwxMCBAQAogCiAJQ1hYRkxBR1MgPSAkKENGTEFHUykKIAorCSMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKKwlDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKKwlDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworCiAJTERGTEFHUyArPSAtWGxpbmtlcgogCiAJaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvYmx1ZWdlbmUtb3NtZXNhIGIvY29uZmlncy9ibHVlZ2VuZS1vc21lc2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNDU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvYmx1ZWdlbmUtb3NtZXNhCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgYnVpbGRpbmcgb25seSBsaWJPU01lc2Egb24gQmx1ZUdlbmUsIG5vIFhsaWIgZHJpdmVyCisjIFRoaXMgZG9lc24ndCByZWFsbHkgaGF2ZSBhIGxvdCBvZiBkZXBlbmRlbmNpZXMsIHNvIGl0IHNob3VsZCBiZSB1c2FibGUKKyMgb24gb3RoZXIgKGdjYy1iYXNlZCkgc3lzdGVtcyB0b28uCisjIEl0IHVzZXMgc3RhdGljIGxpbmtpbmcgYW5kIGRpc2FibGVzIG11bHRpdGhyZWFkaW5nLgorCitpbmNsdWRlICQoVE9QKS9jb25maWdzL2RlZmF1bHQKKworQ09ORklHX05BTUUgPSBibHVlZ2VuZS1vc21lc2EKKworIyBDb21waWxlciBhbmQgZmxhZ3MKK0NDID0gL2JnbC9CbHVlTGlnaHQvcHBjZmxvb3IvYmxydHMtZ251L2Jpbi9wb3dlcnBjLWJnbC1ibHJ0cy1nbnUtZ2NjCitDWFggPSAvYmdsL0JsdWVMaWdodC9wcGNmbG9vci9ibHJ0cy1nbnUvYmluL3Bvd2VycGMtYmdsLWJscnRzLWdudS1nKysKK0NGTEFHUyA9IC1PMyAtYW5zaSAtcGVkYW50aWMgLWZQSUMgLWZmYXN0LW1hdGggLURfUE9TSVhfU09VUkNFIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfU1ZJRF9TT1VSQ0UgLURfQlNEX1NPVVJDRQorQ1hYRkxBR1MgPSAtTzMgLWFuc2kgLXBlZGFudGljIC1mUElDIC1mZmFzdC1tYXRoIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQworCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKK01LTElCX09QVElPTlMgPSAtc3RhdGljCisKK09TTUVTQV9MSUJfTkFNRSA9IGxpYk9TTWVzYS5hCisKKyMgRGlyZWN0b3JpZXMKK1NSQ19ESVJTID0gbWVzYSBnbHUKK0RSSVZFUl9ESVJTID0gb3NtZXNhCitQUk9HUkFNX0RJUlMgPSBvc2RlbW9zCisKKworIyBEZXBlbmRlbmNpZXMKK09TTUVTQV9MSUJfREVQUyA9IC1sbQorR0xVX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoT1NNRVNBX0xJQikKK0FQUF9MSUJfREVQUyA9IC1sT1NNZXNhIC1sR0xVIC1sbQpkaWZmIC0tZ2l0IGEvY29uZmlncy9ibHVlZ2VuZS14bGMtb3NtZXNhIGIvY29uZmlncy9ibHVlZ2VuZS14bGMtb3NtZXNhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzc2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2JsdWVnZW5lLXhsYy1vc21lc2EKQEAgLTAsMCArMSwyOSBAQAorIyBDb25maWd1cmF0aW9uIGZvciBidWlsZGluZyBvbmx5IGxpYk9TTWVzYSBvbiBCbHVlR2VuZSB1c2luZyB0aGUgSUJNIHhsYyBjb21waWxlcgorIyBUaGlzIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBsb3Qgb2YgZGVwZW5kZW5jaWVzLCBzbyBpdCBzaG91bGQgYmUgdXNhYmxlCisjIG9uIHNpbWlsYXIgc3lzdGVtcyB0b28uCisjIEl0IHVzZXMgc3RhdGljIGxpbmtpbmcgYW5kIGRpc2FibGVzIG11bHRpdGhyZWFkaW5nLgorCitpbmNsdWRlICQoVE9QKS9jb25maWdzL2RlZmF1bHQKKworQ09ORklHX05BTUUgPSBibHVlZ2VuZS1vc21lc2EKKworIyBDb21waWxlciBhbmQgZmxhZ3MKK0NDID0gL29wdC9pYm1jbXAvdmFjcHAvYmcvOC4wL2Jpbi9ibHJ0c194bGMKK0NYWCA9IC9vcHQvaWJtY21wL3ZhY3BwL2JnLzguMC9iaW4vYmxydHNfeGxDCitDRkxBR1MgPSAtTzMgLXBlZGFudGljIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UKK0NYWEZMQUdTID0gLU8zIC1wZWRhbnRpYyAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFCisKK01LTElCX09QVElPTlMgPSAtc3RhdGljCisKK09TTUVTQV9MSUJfTkFNRSA9IGxpYk9TTWVzYS5hCisKKyMgRGlyZWN0b3JpZXMKK1NSQ19ESVJTID0gbWVzYSBnbHUKK0RSSVZFUl9ESVJTID0gb3NtZXNhCitQUk9HUkFNX0RJUlMgPSBvc2RlbW9zCisKKworIyBEZXBlbmRlbmNpZXMKK09TTUVTQV9MSUJfREVQUyA9IC1sbQorR0xVX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoT1NNRVNBX0xJQikKK0FQUF9MSUJfREVQUyA9IC1sT1NNZXNhIC1sR0xVIC1sbQpkaWZmIC0tZ2l0IGEvY29uZmlncy9jYXRhbW91bnQtb3NtZXNhLXBnaSBiL2NvbmZpZ3MvY2F0YW1vdW50LW9zbWVzYS1wZ2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1ZjZlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvY2F0YW1vdW50LW9zbWVzYS1wZ2kKQEAgLTAsMCArMSwzMiBAQAorIyBDb25maWd1cmF0aW9uIGZvciBidWlsZGluZyBvbmx5IGxpYk9TTWVzYSBvbiBDcmF5IFh0MworIyBmb3IgdGhlIGNvbXB1dGUgbm9kZXMgcnVubmluZyBDYXRhbW91bnQgdXNpbmcgdGhlIAorIyBQb3J0bGFuZCBHcm91cCBjb21waWxlci4gVGhlIFBvcnRsYW5kIEdyb3VwIHRvb2xjaGFpbiBoYXMgdG8gYmUgCisjIGVuYWJsZWQgYmVmb3JlIHVzaW5nICJtb2R1bGUgc3dpdGNoIFByZ0Vudi1nbnUgUHJnRW52LXBnaSIgLgorIyBUaGlzIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBsb3Qgb2YgZGVwZW5kZW5jaWVzLCBzbyBpdCBzaG91bGQgYmUgdXNhYmxlCisjIG9uIG90aGVyIHNpbWlsYXIgc3lzdGVtcyB0b28uCisjIEl0IHVzZXMgc3RhdGljIGxpbmtpbmcgYW5kIGRpc2FibGVzIG11bHRpdGhyZWFkaW5nLgorCitpbmNsdWRlICQoVE9QKS9jb25maWdzL2RlZmF1bHQKKworQ09ORklHX05BTUUgPSBjYXRhbW91bnQtb3NtZXNhLXBnaQorCisjIENvbXBpbGVyIGFuZCBmbGFncworQ0MgPSBjYworQ1hYID0gQ0MKK0NGTEFHUyA9IC10YXJnZXQ9Y2F0YW1vdW50IC1mYXN0c3NlIC1PMyAtTW5vbnRlbXBvcmFsIC1NcHJlZmV0Y2g9ZGlzdGFuY2U6OCxudGEgICAtZlBJQyAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFCitDWFhGTEFHUyA9IC10YXJnZXQ9Y2F0YW1vdW50IC1mYXN0c3NlIC1PMyAtTW5vbnRlbXBvcmFsIC1NcHJlZmV0Y2g9ZGlzdGFuY2U6OCxudGEgLWZQSUMgLURfUE9TSVhfU09VUkNFIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfU1ZJRF9TT1VSQ0UgLURfQlNEX1NPVVJDRQorCitNS0xJQl9PUFRJT05TID0gLXN0YXRpYworCitPU01FU0FfTElCX05BTUUgPSBsaWJPU01lc2EuYQorCisjIERpcmVjdG9yaWVzCitTUkNfRElSUyA9IG1lc2EgZ2x1CitEUklWRVJfRElSUyA9IG9zbWVzYQorUFJPR1JBTV9ESVJTID0gb3NkZW1vcworCisKKyMgRGVwZW5kZW5jaWVzCitPU01FU0FfTElCX0RFUFMgPSAtbG0KK0dMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKE9TTUVTQV9MSUIpCitBUFBfTElCX0RFUFMgPSAtbE9TTWVzYSAtbEdMVSAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3MvY29uZmlnLm1ndyBiL2NvbmZpZ3MvY29uZmlnLm1ndwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc0ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9jb25maWcubWd3CkBAIC0wLDAgKzEsNDIgQEAKKyMgTWluR1cgY29uZmlnIGluY2x1ZGUgZmlsZSB1cGRhdGVkIGZvciBNZXNhIDcuMAorIworIyAgVXBkYXRlZCA6IGJ5IEhlcm9teXRoLCBvbiAyMDA3LTctMjEKKyMgIEVtYWlsICAgOiB6eHBteXRoQHlhaG9vLmNvbS5jbgorIyAgQnVncyAgICA6IDEpIEFsbCB0aGUgZGVmYXVsdCBzZXR0aW5ncyB3b3JrIGZpbmUuIEJ1dCB0aGUgc2V0dGluZyBYODY9MSBjYW4ndCB3b3JrLiAKKyMgICAgICAgICAgICBUaGUgb3RoZXJzIGhhdm4ndCBiZWVuIHRlc3RlZCB5ZXQuCisjICAgICAgICAgICAgMikgVGhlIGdlbmVyYXRlZCBETExzIGFyZSAqbm90KiBjb21wYXRpYmxlIHdpdGggdGhlIG9uZXMgYnVpbHQKKyMgICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBjb21waWxlcnMgbGlrZSBWQzgsIGVzcGVjaWFsbHkgZm9yIEdMVVQuIAorIyAgICAgICAgICAgIDMpIEFsdGhvdWdoIG1vcmUgdGVzdHMgYXJlIG5lZWRlZCwgaXQgY2FuIGJlIHVzZWQgaW5kaXZpZHVhbGx5IQorCisjIFRoZSBnZW5lcmF0ZWQgRExMcyBieSBNaW5nVyB3aXRoIFNURENBTEwgYXJlIG5vdCB0b3RhbGx5IGNvbXBhdGlibGUgCisjIHdpdGggdGhlIG9uZXMgbGlua2VkIGJ5IE1pY3Jvc29mdCdzIGNvbXBpbGVycy4KKyMKKyMgeHh4X1VTSU5HX1NURENBTEwgPSAxICAgICAgICAgIENvbXBpbGluZyBNRVNBIHdpdGggX19zdGRjYWxsLiBUaGlzIGlzIGRlZmF1bHQhCisjIAorIyB4eHhfVVNJTkdfU1REQ0FMTCA9IDAgICAgICAgICAgQ29tcGlsaW5nIE1FU0Egd2l0aG91dCBfX3N0ZGNhbGwuIEkgbGlrZSB0aGlzOikKKyMgIAorCisjIEluIGZhY3QsIEdMX1VTSU5HX1NURENBTEwgYW5kIEdMVVRfVVNJTkdfU1REQ0FMTCBjYW4gYmUKKyMgZGlmZmVyZW50LiBGb3IgZXhhbXBsZToKKyMKKyMgICBHTF9VU0lOR19TVERDQUxMID0gMAorIyAgIEdMVVRfVVNJTkdfU1REQ0FMTCA9IDEKKyMgCisjIFN1Z2dlc3RlZCBzZXR0aW5nOgorIworIyAgICAgQUxMX1VTSU5HX1NURENBTEwgPSAxCisjCisjIFRoYXQncyBkZWZhdWx0IQorIworCisKK0FMTF9VU0lOR19TVERDQUxMID0gMQorCisKK2lmZXEgKCQoQUxMX1VTSU5HX1NURENBTEwpLDEpCisgIEdMX1VTSU5HX1NURENBTEwgPSAxCisgIEdMVVRfVVNJTkdfU1REQ0FMTCA9IDEKK2Vsc2UKKyAgR0xfVVNJTkdfU1REQ0FMTCA9IDAKKyAgR0xVVF9VU0lOR19TVERDQUxMID0gMAorZW5kaWYKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZGFyd2luIGIvY29uZmlncy9kYXJ3aW4KaW5kZXggYmJhNzgwMi4uYWE5ZWZiNiAxMDA2NDQKLS0tIGEvY29uZmlncy9kYXJ3aW4KKysrIGIvY29uZmlncy9kYXJ3aW4KQEAgLTQsMTEgKzQsMjYgQEAKIAogQ09ORklHX05BTUUgPSBkYXJ3aW4KIAorSU5TVEFMTF9ESVIgPSAvdXNyL1gxMQorCiAjIENvbXBpbGVyIGFuZCBmbGFncwotQ0MgPSBjYwotQ1hYID0gY2MKLUNGTEFHUyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlIC1PMyAtZlBJQyAtZm5vLWNvbW1vbiAtZmZhc3QtbWF0aCAtZnVucm9sbC1sb29wcyAtZmV4cGVuc2l2ZS1vcHRpbWl6YXRpb25zIC1uby1jcHAtcHJlY29tcCAtZHluYW1pYyAtRGRhcndpbgotQ1hYRkxBR1MgPSAtSS91c3IvWDExUjYvaW5jbHVkZSAtTzMgLWZQSUMgLWZuby1jb21tb24gLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyAtbm8tY3BwLXByZWNvbXAgLWR5bmFtaWMgLURkYXJ3aW4KK0NDID0gZ2NjCitDWFggPSBnY2MKK1BJQ19GTEFHUyA9IC1mUElDCitERUZJTkVTID0gIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCBcCisJICAgLURfQlNEX1NPVVJDRSAtRF9TVklEX1NPVVJDRSAtRF9HTlVfU09VUkNFIC1EUFRIUkVBRFMgXAorCSAgIC1ER0xYX0lORElSRUNUX1JFTkRFUklORyBcCisJICAgLURHTFhfQUxJQVNfVU5TVVBQT1JURUQKKworIyAtREdMWF9ESVJFQ1RfUkVOREVSSU5HIC0gcHVsbHMgaW4gbGliZHJtIHN0dWZmIGluIGdseC94MTEKKyMgLURJTl9EUklfRFJJVkVSCisKK0FSQ0hfRkxBR1MgKz0gJChSQ19DRkxBR1MpCisKK0NGTEFHUyA9ICAtZyAtTzIgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLXN0ZD1jOTkgLWZmYXN0LW1hdGggLWZuby1zdHJpY3QtYWxpYXNpbmcgXAorCS1JJChJTlNUQUxMX0RJUikvaW5jbHVkZSAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChBU01fRkxBR1MpICQoREVGSU5FUykKK0NYWEZMQUdTID0gIC1nIC1PMiAtV2FsbCAtZm5vLXN0cmljdC1hbGlhc2luZyBcCisJLUkkKElOU1RBTExfRElSKS9pbmNsdWRlICQoT1BUX0ZMQUdTKSAkKFBJQ19GTEFHUykgJChBUkNIX0ZMQUdTKSAkKEFTTV9GTEFHUykgJChERUZJTkVTKQogCiAjIExpYnJhcnkgbmFtZXMgKGFjdHVhbCBmaWxlIG5hbWVzKQogR0xfTElCX05BTUUgPSBsaWJHTC5keWxpYgpAQCAtMTcsMTMgKzMyLDI0IEBACiBHTFdfTElCX05BTUUgPSBsaWJHTHcuZHlsaWIKIE9TTUVTQV9MSUJfTkFNRSA9IGxpYk9TTWVzYS5keWxpYgogCi1HTF9MSUJfREVQUyA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYZXh0IC1sbSAtbHB0aHJlYWQKLU9TTUVTQV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWxHTAotR0xVX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbEdMCi1HTFVUX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbEdMIC1sR0xVIC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYbXUgLWxYaSAtbFhleHQKLUdMV19MSUJfREVQUyA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYdCAkKFRPUCkvbGliL0dMLmR5bGliCi1BUFBfTElCX0RFUFMgPSAtTCQoVE9QKS9saWIgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLUwvdXNyL1gxMVI2L2xpYiAtbFgxMSAtbFhtdSAtbFh0IC1sWGkgLWxtCisjIGdsb2JzIHVzZWQgdG8gaW5zdGFsbCB0aGUgbGliIGFuZCBhbGwgc3ltbGlua3MKK0dMX0xJQl9HTE9CID0gbGliR0wuKmR5bGliCitHTFVfTElCX0dMT0IgPSBsaWJHTFUuKmR5bGliCitHTFVUX0xJQl9HTE9CID0gbGliZ2x1dC4qZHlsaWIKK0dMV19MSUJfR0xPQiA9IGxpYkdMdy4qZHlsaWIKK09TTUVTQV9MSUJfR0xPQiA9IGxpYk9TTWVzYS4qZHlsaWIKKworR0xfTElCX0RFUFMgPSAtTCQoSU5TVEFMTF9ESVIpLyQoTElCX0RJUikgLWxYMTEgLWxYZXh0IC1sbSAtbHB0aHJlYWQKK09TTUVTQV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikKK0dMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikKK0dMVVRfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAgLUwkKElOU1RBTExfRElSKS8kKExJQl9ESVIpIC1sWDExIC1sWG11IC1sWGkgLWxYZXh0CitHTFdfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTF9MSUIpIC1MJChJTlNUQUxMX0RJUikvJChMSUJfRElSKSAtbFgxMSAtbFh0CitBUFBfTElCX0RFUFMgPSAtTCQoVE9QKS9saWIgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLUwkKElOU1RBTExfRElSKS8kKExJQl9ESVIpIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbG0KIAogIyBvbWl0IGdsdyBsaWIgZm9yIG5vdzoKLVNSQ19ESVJTID0gZ2FsbGl1bSBtZXNhIGdsdSBnbHV0L2dseAotCitTUkNfRElSUyA9IGdseC94MTEgbWVzYSBnbHUgZ2x3IGdsdXQvZ2x4CitHTFVfRElSUyA9IHNnaQorRFJJVkVSX0RJUlMgPSBvc21lc2EKKyNEUklWRVJfRElSUyA9IGRyaQorRFJJX0RJUlMgPSBzd3Jhc3QKK1BST0dSQU1fRElSUyA9IHhkZW1vcwpkaWZmIC0tZ2l0IGEvY29uZmlncy9kYXJ3aW4tZmF0LTMyYml0IGIvY29uZmlncy9kYXJ3aW4tZmF0LTMyYml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2Rhcndpbi1mYXQtMzJiaXQKQEAgLTAsMCArMSw3IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIERhcndpbiAvIE1hY09TIFgsIG1ha2luZyAzMmJpdCBmYXQgZHluYW1pYyBsaWJzCisKK1JDX0NGTEFHUz0tYXJjaCBwcGMgLWFyY2ggaTM4NgorCitpbmNsdWRlICQoVE9QKS9jb25maWdzL2RhcndpbgorCitDT05GSUdfTkFNRSA9IGRhcndpbi1mYXQtMzJiaXQKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZGFyd2luLWZhdC1hbGwgYi9jb25maWdzL2Rhcndpbi1mYXQtYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjY4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2Rhcndpbi1mYXQtYWxsCkBAIC0wLDAgKzEsNyBAQAorIyBDb25maWd1cmF0aW9uIGZvciBEYXJ3aW4gLyBNYWNPUyBYLCBtYWtpbmcgMzJiaXQgYW5kIDY0Yml0IGZhdCBkeW5hbWljIGxpYnMKKworUkNfQ0ZMQUdTPS1hcmNoIHBwYyAtYXJjaCBpMzg2IC1hcmNoIHBwYzY0IC1hcmNoIHg4Nl82NAorCitpbmNsdWRlICQoVE9QKS9jb25maWdzL2RhcndpbgorCitDT05GSUdfTkFNRSA9IGRhcndpbi1mYXQtYWxsCmRpZmYgLS1naXQgYS9jb25maWdzL2Rhcndpbi1zdGF0aWMgYi9jb25maWdzL2Rhcndpbi1zdGF0aWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjY1ODEuLjAwMDAwMDAKLS0tIGEvY29uZmlncy9kYXJ3aW4tc3RhdGljCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBEYXJ3aW4gLyBNYWNPUyBYLCBtYWtpbmcgc3RhdGljIGxpYnMKLQotaW5jbHVkZSAkKFRPUCkvY29uZmlncy9kYXJ3aW4KLQotQ09ORklHX05BTUUgPSBkYXJ3aW4tc3RhdGljCi0KLSMgQ29tcGlsZXIgYW5kIGZsYWdzCi1DRkxBR1MgPSAtSS91c3IvWDExUjYvaW5jbHVkZSAtTzMgLWZuby1jb21tb24gLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyAtbm8tY3BwLXByZWNvbXAgLWR5bmFtaWMgLURkYXJ3aW4KLUNYWEZMQUdTID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUgLU8zIC1mbm8tY29tbW9uIC1mZmFzdC1tYXRoIC1mdW5yb2xsLWxvb3BzIC1mZXhwZW5zaXZlLW9wdGltaXphdGlvbnMgLW5vLWNwcC1wcmVjb21wIC1keW5hbWljIC1EZGFyd2luCi1NS0xJQl9PUFRJT05TID0gLXN0YXRpYwotCi0jIExpYnJhcnkgbmFtZXMgKGFjdHVhbCBmaWxlIG5hbWVzKQotR0xfTElCX05BTUUgPSBsaWJHTC5hCi1HTFVfTElCX05BTUUgPSBsaWJHTFUuYQotR0xVVF9MSUJfTkFNRSA9IGxpYmdsdXQuYQotR0xXX0xJQl9OQU1FID0gbGliR0x3LmEKLU9TTUVTQV9MSUJfTkFNRSA9IGxpYk9TTWVzYS5hCi0KLUdMX0xJQl9ERVBTID0KLU9TTUVTQV9MSUJfREVQUyA9IAotR0xVX0xJQl9ERVBTID0gCi1HTFVUX0xJQl9ERVBTID0gCi1HTFdfTElCX0RFUFMgPSAKLUFQUF9MSUJfREVQUyA9IC1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0IC1MJChUT1ApL2xpYiAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAtTC91c3IvWDExUjYvbGliIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbHN0ZGMrKyAtbGdjY19zLjEgLWxtCmRpZmYgLS1naXQgYS9jb25maWdzL2Rhcndpbi1zdGF0aWMteDg2cHBjIGIvY29uZmlncy9kYXJ3aW4tc3RhdGljLXg4NnBwYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0YTFkMi4uMDAwMDAwMAotLS0gYS9jb25maWdzL2Rhcndpbi1zdGF0aWMteDg2cHBjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBEYXJ3aW4gLyBNYWNPUyBYLCBtYWtpbmcgc3RhdGljIGxpYnMKLQotaW5jbHVkZSAkKFRPUCkvY29uZmlncy9kYXJ3aW4KLQotQ09ORklHX05BTUUgPSBkYXJ3aW4tc3RhdGljCi0KLSMgQ29tcGlsZXIgYW5kIGZsYWdzCi1DRkxBR1MgPSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayBcCi0gICAgICAgICAtSS91c3IvWDExUjYvaW5jbHVkZSAtTzMgLWZuby1jb21tb24gLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyAtbm8tY3BwLXByZWNvbXAgLWR5bmFtaWMgLURkYXJ3aW4KLUNYWEZMQUdTID0gLWFyY2ggcHBjIC1hcmNoIGkzODYgLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgXAotICAgICAgICAgICAtSS91c3IvWDExUjYvaW5jbHVkZSAtTzMgLWZuby1jb21tb24gLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyAtbm8tY3BwLXByZWNvbXAgLWR5bmFtaWMgLURkYXJ3aW4KLU1LTElCX09QVElPTlMgPSAtc3RhdGljIC1hcmNob3B0ICItaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayIKLQotIyBMaWJyYXJ5IG5hbWVzIChhY3R1YWwgZmlsZSBuYW1lcykKLUdMX0xJQl9OQU1FID0gbGliR0wuYQotR0xVX0xJQl9OQU1FID0gbGliR0xVLmEKLUdMVVRfTElCX05BTUUgPSBsaWJnbHV0LmEKLUdMV19MSUJfTkFNRSA9IGxpYkdMdy5hCi1PU01FU0FfTElCX05BTUUgPSBsaWJPU01lc2EuYQotCi1HTF9MSUJfREVQUyA9Ci1PU01FU0FfTElCX0RFUFMgPSAKLUdMVV9MSUJfREVQUyA9IAotR0xVVF9MSUJfREVQUyA9IAotR0xXX0xJQl9ERVBTID0gCi1BUFBfTElCX0RFUFMgPSAtV2wsLXNlYXJjaF9wYXRoc19maXJzdCAtTCQoVE9QKS9saWIgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLUwvdXNyL1gxMVI2L2xpYiAtbFgxMSAtbFhtdSAtbFh0IC1sWGkgLWxzdGRjKysgLWxnY2Nfcy4xIC1sbQpkaWZmIC0tZ2l0IGEvY29uZmlncy9kZWZhdWx0IGIvY29uZmlncy9kZWZhdWx0CmluZGV4IGNkMmMzOWMuLjc2ZDAzZjUgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvZGVmYXVsdAorKysgYi9jb25maWdzL2RlZmF1bHQKQEAgLTExLDYgKzExLDcgQEAKIE1FU0FfTUFKT1I9NwogTUVTQV9NSU5PUj0xCiBNRVNBX1RJTlk9MAorTUVTQV9WRVJTSU9OID0gJChNRVNBX01BSk9SKS4kKE1FU0FfTUlOT1IpLiQoTUVTQV9USU5ZKQogCiAjIGV4dGVybmFsIHByb2plY3RzLiAgVGhpcyBzaG91bGQgYmUgdXNlbGVzcyBub3cgdGhhdCB3ZSB1c2UgbGliZHJtLgogRFJNX1NPVVJDRV9QQVRIPSQoVE9QKS8uLi9kcm0KQEAgLTIxLDE4ICsyMiwyMyBAQAogSE9TVF9DQyA9ICQoQ0MpCiBDRkxBR1MgPSAtTwogQ1hYRkxBR1MgPSAtTworTERGTEFHUyA9CiBHTFVfQ0ZMQUdTID0gCiAKICMgTWlzYyB0b29scyBhbmQgZmxhZ3MKK1NIRUxMID0gL2Jpbi9zaAorTUtMSUIgPSAkKFNIRUxMKSAkKFRPUCkvYmluL21rbGliCiBNS0xJQl9PUFRJT05TID0gCiBNS0RFUCA9IG1ha2VkZXBlbmQKIE1LREVQX09QVElPTlMgPSAtZmRlcGVuZAogTUFLRSA9IG1ha2UKLUlOU1RBTEwgPSAkKFRPUCkvYmluL21pbnN0YWxsCitJTlNUQUxMID0gJChTSEVMTCkgJChUT1ApL2Jpbi9taW5zdGFsbAogCi0jIFB5dGhvbiBhbmQgZmxhZ3MgKGdlbmVyYWxseSBvbmx5IG5lZWRlZCBieSB0aGUgZGV2ZWxvcGVycykKKyMgVG9vbHMgZm9yIHJlZ2VuZXJhdGluZyBnbGFwaSAoZ2VuZXJhbGx5IG9ubHkgbmVlZGVkIGJ5IHRoZSBkZXZlbG9wZXJzKQogUFlUSE9OMiA9IHB5dGhvbgogUFlUSE9OX0ZMQUdTID0gLXQgLU8gLU8KK0lOREVOVCA9IGluZGVudAorSU5ERU5UX0ZMQUdTID0gLWk0IC1udXQgLWJyIC1icnMgLW5wY3MgLWNlIC1UIEdMdWJ5dGUgLVQgR0xieXRlIC1UIEJvb2wKIAogIyBMaWJyYXJ5IG5hbWVzIChiYXNlIG5hbWUpCiBHTF9MSUIgPSBHTApAQCAtNDksNiArNTUsMTIgQEAKIEdMV19MSUJfTkFNRSA9IGxpYiQoR0xXX0xJQikuc28KIE9TTUVTQV9MSUJfTkFNRSA9IGxpYiQoT1NNRVNBX0xJQikuc28KIAorIyBnbG9icyB1c2VkIHRvIGluc3RhbGwgdGhlIGxpYiBhbmQgYWxsIHN5bWxpbmtzCitHTF9MSUJfR0xPQiA9ICQoR0xfTElCX05BTUUpKgorR0xVX0xJQl9HTE9CID0gJChHTFVfTElCX05BTUUpKgorR0xVVF9MSUJfR0xPQiA9ICQoR0xVVF9MSUJfTkFNRSkqCitHTFdfTElCX0dMT0IgPSAkKEdMV19MSUJfTkFNRSkqCitPU01FU0FfTElCX0dMT0IgPSAkKE9TTUVTQV9MSUJfTkFNRSkqCiAKICMgT3B0aW9uYWwgYXNzZW1ibHkgbGFuZ3VhZ2Ugb3B0aW1pemF0aW9uIGZpbGVzIGZvciBsaWJHTAogTUVTQV9BU01fU09VUkNFUyA9IApAQCAtNTYsNiArNjgsNyBAQAogIyBHTHcgd2lkZ2V0IHNvdXJjZXMgKEFwcGVuZCAiR0x3TURyYXdBLmMiIGhlcmUgYW5kIGFkZCAtbFhtIHRvIEdMV19MSUJfREVQUyBpbgogIyBvcmRlciB0byBidWlsZCB0aGUgTW90aWYgd2lkZ2V0IHRvbykKIEdMV19TT1VSQ0VTID0gR0x3RHJhd0EuYworTU9USUZfQ0ZMQUdTID0gLUkvdXNyL2luY2x1ZGUvTW90aWYxLjIKIAogCiAjIERpcmVjdG9yaWVzIHRvIGJ1aWxkCkBAIC03Nyw3ICs5MCw3IEBACiBHQUxMSVVNX1dJTlNZU19ESVJTID0geGxpYiBlZ2xfeGxpYgogCiAKLSMgTGlicmFyeS9wcm9ncmFtIGRlcGVuZGVuY2llcworIyBMaWJyYXJ5IGRlcGVuZGVuY2llcwogI0VYVFJBX0xJQl9QQVRIID89CiBHTF9MSUJfREVQUyAgICAgPSAkKEVYVFJBX0xJQl9QQVRIKSAtbFgxMSAtbFhleHQgLWxtIC1scHRocmVhZAogT1NNRVNBX0xJQl9ERVBTID0gJChFWFRSQV9MSUJfUEFUSCkgLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xfTElCKQpAQCAtODYsMTEgKzk5LDE1IEBACiBHTFdfTElCX0RFUFMgICAgPSAkKEVYVFJBX0xJQl9QQVRIKSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTF9MSUIpIC1sWHQgLWxYMTEKIEFQUF9MSUJfREVQUyAgICA9ICQoRVhUUkFfTElCX1BBVEgpIC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLWxtCiAKKyMgUHJvZ3JhbSBkZXBlbmRlbmNpZXMgLSBzcGVjaWZpYyBHTC9nbHV0IGxpYnJhcmllcyBhZGRlZCBpbiBNYWtlZmlsZXMKK0FQUF9MSUJfREVQUyA9IC1sbQogCiAKICMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIChmb3IgbWFrZSBpbnN0YWxsKQogSU5TVEFMTF9ESVIgPSAvdXNyL2xvY2FsCi1EUklfRFJJVkVSX0lOU1RBTExfRElSID0gL3Vzci9saWIvZHJpCitJTlNUQUxMX0xJQl9ESVIgPSAkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCitJTlNUQUxMX0lOQ19ESVIgPSAkKElOU1RBTExfRElSKS9pbmNsdWRlCitEUklfRFJJVkVSX0lOU1RBTExfRElSID0gJChJTlNUQUxMX0xJQl9ESVIpL2RyaQogCiAjIFdoZXJlIGxpYkdMIHdpbGwgbG9vayBmb3IgRFJJIGhhcmR3YXJlIGRyaXZlcnMKIERSSV9EUklWRVJfU0VBUkNIX0RJUiA9ICQoRFJJX0RSSVZFUl9JTlNUQUxMX0RJUikKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZnJlZWJzZCBiL2NvbmZpZ3MvZnJlZWJzZAppbmRleCBkYjdkZDNiLi45NzZkZGQxIDEwMDY0NAotLS0gYS9jb25maWdzL2ZyZWVic2QKKysrIGIvY29uZmlncy9mcmVlYnNkCkBAIC0xMyw5ICsxMyw5IEBACiBQSUNfRkxBR1MgID0gLWZQSUMKIAogREVGSU5FUyA9IC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLURVU0VfWFNITSBcCi0JLURIWj0xMDAgLURIQVZFX1BPU0lYX01FTUFMSUdOCisJLURIWj0xMDAKIAotWDExX0lOQ0xVREVTID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUKK1gxMV9JTkNMVURFUyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCiAKIENGTEFHUyArPSAkKFdBUk5fRkxBR1MpICQoT1BUX0ZMQUdTKSAkKFBJQ19GTEFHUykgJChERUZJTkVTKSAkKFgxMV9JTkNMVURFUykgLWZmYXN0LW1hdGggLXBlZGFudGljCiAKQEAgLTIzLDUgKzIzLDkgQEAKIAogR0xVVF9DRkxBR1MgPSAtZmV4Y2VwdGlvbnMKIAotRVhUUkFfTElCX1BBVEggPSAtTC91c3IvWDExUjYvbGliCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKK0VYVFJBX0xJQl9QQVRIID0gLUwvdXNyL2xvY2FsL2xpYgogQVBQX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAkKEVYVFJBX0xJQl9QQVRIKSAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAtbFhleHQgLWxYbXUgLWxYaSAtbFgxMSAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZnJlZWJzZC1kcmkgYi9jb25maWdzL2ZyZWVic2QtZHJpCmluZGV4IDZmYzFhYmIuLmY3ZTFmYTAgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvZnJlZWJzZC1kcmkKKysrIGIvY29uZmlncy9mcmVlYnNkLWRyaQpAQCAtOSwzMCArOSwzNSBAQAogQ0MgPSBnY2MKIENYWCA9IGcrKwogV0FSTl9GTEFHUyA9IC1XYWxsCi1PUFRfRkxBR1MgPSAtTworT1BUX0ZMQUdTID0gLU8gLWcKIAogRVhQQVRfSU5DTFVERVMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQotWDExX0lOQ0xVREVTID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUKK1gxMV9JTkNMVURFUyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCiBERUZJTkVTID0gLURQVEhSRUFEUyAtRFVTRV9FWFRFUk5BTF9EWFROX0xJQj0xIC1ESU5fRFJJX0RSSVZFUiBcCiAJLURHTFhfRElSRUNUX1JFTkRFUklORyAtREdMWF9JTkRJUkVDVF9SRU5ERVJJTkcgXAotCS1ESEFWRV9BTElBUyAtREhBVkVfUE9TSVhfTUVNQUxJR04KKwktREhBVkVfQUxJQVMKIAogQ0ZMQUdTID0gJChXQVJOX0ZMQUdTKSAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpIC1XbWlzc2luZy1wcm90b3R5cGVzIC1zdGQ9Yzk5IC1XdW5kZWYgLWZmYXN0LW1hdGggXAogCSQoQVNNX0ZMQUdTKSAkKFgxMV9JTkNMVURFUykgJChERUZJTkVTKQogCiBDWFhGTEFHUyA9ICQoV0FSTl9GTEFHUykgJChPUFRfRkxBR1MpICQoUElDX0ZMQUdTKSAkKERFRklORVMpIC1XYWxsIC1hbnNpIC1wZWRhbnRpYyAkKEFTTV9GTEFHUykgJChYMTFfSU5DTFVERVMpIAogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKK0FTTV9TT1VSQ0VTID0gCiBNRVNBX0FTTV9TT1VSQ0VTID0gCiAKICMgTGlicmFyeS9wcm9ncmFtIGRlcGVuZGVuY2llcwogTElCRFJNX0NGTEFHUyA9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYmRybWAKIExJQkRSTV9MSUIgPSBgcGtnLWNvbmZpZyAtLWxpYnMgbGliZHJtYAogRFJJX0xJQl9ERVBTID0gLUwvdXNyL2xvY2FsL2xpYiAtbG0gLXB0aHJlYWQgLWxleHBhdCAkKExJQkRSTV9MSUIpCi1HTF9MSUJfREVQUyA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYZXh0IC1sWHhmODZ2bSAtbFhkYW1hZ2UgLWxYZml4ZXMgXAorR0xfTElCX0RFUFMgPSAtTC91c3IvbG9jYWwvbGliIC1sWDExIC1sWGV4dCAtbFh4Zjg2dm0gLWxYZGFtYWdlIC1sWGZpeGVzIFwKIAktbG0gLXB0aHJlYWQgJChMSUJEUk1fTElCKQogCi1HTFVUX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtTC91c3IvWDExUjYvbGliIC1sR0xVIC1sR0wgLWxYMTEgLWxYbXUgLWxYdCAtbFhpIC1sbQotR0xXX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtTC91c3IvWDExUjYvbGliIC1sR0wgLWxYdCAtbFgxMQorR0xVVF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLUwvdXNyL2xvY2FsL2xpYiAtbEdMVSAtbEdMIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbG0KK0dMV19MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLUwvdXNyL2xvY2FsL2xpYiAtbEdMIC1sWHQgLWxYMTEKIAogCiAjIERpcmVjdG9yaWVzCmRpZmYgLS1naXQgYS9jb25maWdzL2hwdXgxMC1nY2MgYi9jb25maWdzL2hwdXgxMC1nY2MKaW5kZXggMTBhOWFkNS4uYmUzOTZmOCAxMDA2NDQKLS0tIGEvY29uZmlncy9ocHV4MTAtZ2NjCisrKyBiL2NvbmZpZ3MvaHB1eDEwLWdjYwpAQCAtMTIsNSArMTIsOSBAQAogQ1hYRkxBR1MgPSAtYW5zaSAtTzMgLURfSFBVWF9TT1VSQ0UKIEdMVVRfQ0ZMQUdTID0gLWZleGNlcHRpb25zCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKKwogQVBQX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtTC91c3IvbGliL1gxMVI2IC1ML3Vzci9jb250cmliL1gxMVI2L2xpYiAtbFhleHQgLWxYbXUgLWxYaSAtbFgxMSAtbG0KIApkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eCBiL2NvbmZpZ3MvbGludXgKaW5kZXggMGQ0NTVmZi4uMTU3MDBhMSAxMDA2NDQKLS0tIGEvY29uZmlncy9saW51eAorKysgYi9jb25maWdzL2xpbnV4CkBAIC0yOCw2ICsyOCwxMCBAQAogQ1hYRkxBR1MgPSAtV2FsbCAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChERUZJTkVTKSBcCiAJJChYMTFfSU5DTFVERVMpIAogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKIEdMVVRfQ0ZMQUdTID0gLWZleGNlcHRpb25zCiAKIEVYVFJBX0xJQl9QQVRIID0gLUwvdXNyL1gxMVI2L2xpYgpkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1hbHBoYSBiL2NvbmZpZ3MvbGludXgtYWxwaGEKaW5kZXggZDY5YWFiYi4uNjViZjBjMiAxMDA2NDQKLS0tIGEvY29uZmlncy9saW51eC1hbHBoYQorKysgYi9jb25maWdzL2xpbnV4LWFscGhhCkBAIC0xMSw2ICsxMSwxMCBAQAogQ1hYRkxBR1MgPSAtTzMgLW1jcHU9ZXY1IC1hbnNpIC1taWVlZSAtcGVkYW50aWMgLWZQSUMgLURfWE9QRU5fU09VUkNFCiBHTFVUX0NGTEFHUyA9IC1mZXhjZXB0aW9ucwogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKIEdMX0xJQl9ERVBTID0gLUwvdXNyL1gxMVI2L2xpYiAtbFgxMSAtbFhleHQgLWxtIC1scHRocmVhZAogR0xVVF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpIC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYbXUgLWxYdCAtbFhpIC1sbQogR0xXX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xfTElCKSAtTC91c3IvWDExUjYvbGliIC1sWHQgLWxYMTEKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgtYWxwaGEtc3RhdGljIGIvY29uZmlncy9saW51eC1hbHBoYS1zdGF0aWMKaW5kZXggMmEzMGFmOS4uNTM4MDhkNyAxMDA2NDQKLS0tIGEvY29uZmlncy9saW51eC1hbHBoYS1zdGF0aWMKKysrIGIvY29uZmlncy9saW51eC1hbHBoYS1zdGF0aWMKQEAgLTExLDcgKzExLDExIEBACiBDWFhGTEFHUyA9IC1PMyAtbWNwdT1ldjUgLWFuc2kgLW1pZWVlIC1wZWRhbnRpYyAtRF9YT1BFTl9TT1VSQ0UKIEdMVVRfQ0ZMQUdTID0gLWZleGNlcHRpb25zCiBNS0xJQl9PUFRJT05TID0gLXN0YXRpYworUElDX0ZMQUdTID0KIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZwogCiAjIExpYnJhcnkgbmFtZXMgKGFjdHVhbCBmaWxlIG5hbWVzKQogR0xfTElCX05BTUUgPSBsaWJHTC5hCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LWRpcmVjdGZiIGIvY29uZmlncy9saW51eC1kaXJlY3RmYgppbmRleCAyZWQ5NGZlLi5iMWZiOTE0IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWRpcmVjdGZiCisrKyBiL2NvbmZpZ3MvbGludXgtZGlyZWN0ZmIKQEAgLTEzLDYgKzEzLDEwIEBACiAKIENYWEZMQUdTID0gLVdhbGwgLU8zIC1mUElDIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UgICAKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworCiBIQVZFX1g4NiA9ICQoc2hlbGwgdW5hbWUgLW0gfCBncmVwICdpWzMtNl04NicgPi9kZXYvbnVsbCAmJiBlY2hvIHllcykKIGlmZXEgKCQoSEFWRV9YODYpLCB5ZXMpCiAgICAgIENGTEFHUyAgICs9IC1EVVNFX1g4Nl9BU00gLURVU0VfTU1YX0FTTSAtRFVTRV8zRE5PV19BU00gLURVU0VfU1NFX0FTTQpkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1kcmkgYi9jb25maWdzL2xpbnV4LWRyaQppbmRleCBkNDQxMTk0Li5hYzk0MGMwIDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWRyaQorKysgYi9jb25maWdzL2xpbnV4LWRyaQpAQCAtMzIsNiArMzIsMTEgQEAKIAogQ1hYRkxBR1MgPSAtV2FsbCAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChERUZJTkVTKQogCitHTFVUX0NGTEFHUyA9IC1mZXhjZXB0aW9ucworCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCiAKIE1FU0FfQVNNX1NPVVJDRVMgPSAKIApAQCAtNDIsMTQgKzQ3LDIyIEBACiBMSUJEUk1fTElCID0gJChzaGVsbCBwa2ctY29uZmlnIC0tbGlicyBsaWJkcm0pCiBEUklfTElCX0RFUFMgID0gJChFWFRSQV9MSUJfUEFUSCkgLWxtIC1scHRocmVhZCAtbGV4cGF0IC1sZGwgJChMSUJEUk1fTElCKQogR0xfTElCX0RFUFMgICA9ICQoRVhUUkFfTElCX1BBVEgpIC1sWDExIC1sWGV4dCAtbFh4Zjg2dm0gLWxYZGFtYWdlIC1sWGZpeGVzIFwKLQkJLWxtIC1scHRocmVhZCAtbGRsIFwKLSAgICAgICAgICAgICAgICAkKExJQkRSTV9MSUIpCisJCS1sbSAtbHB0aHJlYWQgLWxkbCAkKExJQkRSTV9MSUIpCiAKIAogIyBEaXJlY3RvcmllcwogU1JDX0RJUlMgOj0gZ2x4L3gxMSBlZ2wgJChTUkNfRElSUykKIAogCisjIERpcmVjdG9yaWVzCitpZmVxICgkKFVTSU5HX0VHTCksIDEpCitTUkNfRElSUyA9IGVnbCBnbHgveDExIG1lc2EgZ2x1IGdsdXQvZ2x4IGdsdworUFJPR1JBTV9ESVJTID0gZWdsIHhkZW1vcworZWxzZQorU1JDX0RJUlMgPSBnbHgveDExIG1lc2EgZ2x1IGdsdXQvZ2x4IGdsdworUFJPR1JBTV9ESVJTID0geGRlbW9zCitlbmRpZgorCiAjIEVHTCBkaXJlY3RvcmllcwogRUdMX0RSSVZFUlNfRElSUyA9IGRlbW8gZHJpIHhkcmkKIApAQCAtNTksNCArNzIsMTEgQEAKIAogIyBnYW1tYSBhcmUgbWlzc2luZyBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBuZXcKICMgaW50ZXJmYWNlLgorCisjIFhYWDogbmVlZCB0byBmaWd1cmUgb3V0IGEgd2F5IGZvciBnYWxsaXVtIGFuZCBub24tZ2FsbGl1bSBidWlsZHMgdG8KKyMgY29leGlzdDoKKyMKKworI0RSSV9ESVJTID0gaTgxMCBpOTE1IGk5NjUgbWFjaDY0IG1nYSByMTI4IHIyMDAgcjMwMCByYWRlb24gczN2IFwKKyMJc2F2YWdlIHNpcyB0ZGZ4IHRyaWRlbnQgdW5pY2hyb21lIGZmYgogRFJJX0RJUlMgPSBpbnRlbCAKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgtZHJpLXg4NiBiL2NvbmZpZ3MvbGludXgtZHJpLXg4NgppbmRleCBlYzgyNDJkLi40ZWVkZmE1IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWRyaS14ODYKKysrIGIvY29uZmlncy9saW51eC1kcmkteDg2CkBAIC01LDkgKzUsNiBAQAogCiBDT05GSUdfTkFNRSA9IGxpbnV4LWRyaS14ODYKIAotIyBVbm5lY2Vzc2FyeSBvbiB4ODYsIGdlbmVyYWxseS4KLVBJQ19GTEFHUyA9IAotCiAjIEFkZCAtbTMyIHRvIENGTEFHUzoKIEFSQ0hfRkxBR1MgPSAtbTMyCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgtZHJpLXg4Ni02NCBiL2NvbmZpZ3MvbGludXgtZHJpLXg4Ni02NAppbmRleCBiYjU2ZGUzLi5jZWFiMDVkIDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWRyaS14ODYtNjQKKysrIGIvY29uZmlncy9saW51eC1kcmkteDg2LTY0CkBAIC0yMCw1ICsyMCw1IEBACiAjIHRoZSBuZXcgaW50ZXJmYWNlLiAgaTgxMCBhcmUgbWlzc2luZyBiZWNhdXNlIHRoZXJlIGlzIG5vIHg4Ni02NAogIyBzeXN0ZW0gd2hlcmUgdGhleSBjb3VsZCAqZXZlciogYmUgdXNlZC4KICMKLURSSV9ESVJTID0gaTkxNXRleCBpOTE1IGk5NjUgbWFjaDY0IG1nYSByMTI4IHIyMDAgcmFkZW9uIHRkZnggdW5pY2hyb21lIHNhdmFnZSByMzAwCitEUklfRElSUyA9IGk5MTUgaTk2NSBtYWNoNjQgbWdhIHIxMjggcjIwMCByMzAwIHJhZGVvbiBzYXZhZ2UgdGRmeCB1bmljaHJvbWUKIApkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1kcmkteGNiIGIvY29uZmlncy9saW51eC1kcmkteGNiCmluZGV4IGZiZjliOWIuLmQ3YjAwYTIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgtZHJpLXhjYgorKysgYi9jb25maWdzL2xpbnV4LWRyaS14Y2IKQEAgLTMyLDYgKzMyLDkgQEAKIAogQ1hYRkxBR1MgPSAtV2FsbCAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChERUZJTkVTKQogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCiAKIE1FU0FfQVNNX1NPVVJDRVMgPSAKIApAQCAtNTcsNyArNjAsNyBAQAogUFJPR1JBTV9ESVJTID0gZWdsCiBlbHNlCiBTUkNfRElSUyA9IGdseC94MTEgZ2FsbGl1bSBtZXNhIGdsdSBnbHV0L2dseCBnbHcKLVBST0dSQU1fRElSUyA9CitQUk9HUkFNX0RJUlMgPSB4ZGVtb3MKIGVuZGlmCiAKIERSSVZFUl9ESVJTID0gZHJpCkBAIC02Niw0ICs2OSw0IEBACiAjIGdhbW1hIGFyZSBtaXNzaW5nIGJlY2F1c2UgdGhleSBoYXZlIG5vdCBiZWVuIGNvbnZlcnRlZCB0byB1c2UgdGhlIG5ldwogIyBpbnRlcmZhY2UuCiBEUklfRElSUyA9IGk4MTAgaTkxNSBtYWNoNjQgbWdhIHIxMjggcjIwMCByMzAwIHJhZGVvbiBzM3YgXAotCXNhdmFnZSBzaXMgdGRmeCB0cmlkZW50IHVuaWNocm9tZSBmZmIgbm91dmVhdQorCXNhdmFnZSBzaXMgdGRmeCB0cmlkZW50IHVuaWNocm9tZSBmZmIgCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LWZiZGV2IGIvY29uZmlncy9saW51eC1mYmRldgppbmRleCAxZGRjY2IzLi5mNTRjNzM2IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWZiZGV2CisrKyBiL2NvbmZpZ3MvbGludXgtZmJkZXYKQEAgLTYsNiArNiw5IEBACiAKIENGTEFHUyA9IC1PMyAtZmZhc3QtbWF0aCAtYW5zaSAtcGVkYW50aWMgLWZQSUMgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFIC1EUFRIUkVBRFMgLURVU0VfR0xGQkRFVl9EUklWRVIKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKIFNSQ19ESVJTID0gZ2FsbGl1bSBtZXNhIGdsdSBnbHV0L2ZiZGV2CiBEUklWRVJfRElSUyA9IGZiZGV2IG9zbWVzYQogUFJPR1JBTV9ESVJTID0gZmJkZXYgZGVtb3MgcmVkYm9vayBzYW1wbGVzCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LWdsaWRlIGIvY29uZmlncy9saW51eC1nbGlkZQppbmRleCAwYTQwNTIxLi4zMTQ3NWM4IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWdsaWRlCisrKyBiL2NvbmZpZ3MvbGludXgtZ2xpZGUKQEAgLTEyLDYgKzEyLDkgQEAKIENYWEZMQUdTID0gLU8zIC1hbnNpIC1wZWRhbnRpYyAtZlBJQyAtZmZhc3QtbWF0aCAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFCiBHTFVUX0NGTEFHUyA9IC1mZXhjZXB0aW9ucwogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCiAKICMgTGlicmFyeS9wcm9ncmFtIGRlcGVuZGVuY2llcwogR0xfTElCX0RFUFMgPSAtTC91c3IvWDExUjYvbGliIC1sWDExIC1sWGV4dCAtTC91c3IvbG9jYWwvZ2xpZGUvbGliIC1sZ2xpZGUzeCAtbG0gLWxwdGhyZWFkCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LWluZGlyZWN0IGIvY29uZmlncy9saW51eC1pbmRpcmVjdAppbmRleCAwYzQ4MDVlLi4zMTBhZTZkIDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LWluZGlyZWN0CisrKyBiL2NvbmZpZ3MvbGludXgtaW5kaXJlY3QKQEAgLTMzLDYgKzMzLDkgQEAKIAogQ1hYRkxBR1MgPSAkKFdBUk5fRkxBR1MpICQoT1BUX0ZMQUdTKSAkKFBJQ19GTEFHUykgJChBUkNIX0ZMQUdTKSAkKERFRklORVMpCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKIAogTUVTQV9BU01fU09VUkNFUyA9IAogCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LW9zbWVzYSBiL2NvbmZpZ3MvbGludXgtb3NtZXNhCmluZGV4IDAzODJhMTkuLmMxMTI2NDIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgtb3NtZXNhCisrKyBiL2NvbmZpZ3MvbGludXgtb3NtZXNhCkBAIC0xMiw2ICsxMiw5IEBACiBDRkxBR1MgPSAtTzMgLWFuc2kgLXBlZGFudGljIC1mUElDIC1mZmFzdC1tYXRoIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UgLURQVEhSRUFEUwogQ1hYRkxBR1MgPSAtTzMgLWFuc2kgLXBlZGFudGljIC1mUElDIC1mZmFzdC1tYXRoIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZwogCiAjIERpcmVjdG9yaWVzCiBTUkNfRElSUyA9IGdhbGxpdW0gbWVzYSBnbHUKQEAgLTIyLDQgKzI1LDQgQEAKICMgRGVwZW5kZW5jaWVzCiBPU01FU0FfTElCX0RFUFMgPSAtbG0gLWxwdGhyZWFkCiBHTFVfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChPU01FU0FfTElCKQotQVBQX0xJQl9ERVBTID0gLWxPU01lc2EgLWxHTFUKK0FQUF9MSUJfREVQUyA9IC1sbSAtbHB0aHJlYWQKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgtb3NtZXNhMTYgYi9jb25maWdzL2xpbnV4LW9zbWVzYTE2CmluZGV4IDlhNTI3NTkuLmIzYzhkYTAgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgtb3NtZXNhMTYKKysrIGIvY29uZmlncy9saW51eC1vc21lc2ExNgpAQCAtMTAsNiArMTAsOSBAQAogQ0ZMQUdTID0gLU8zIC1hbnNpIC1wZWRhbnRpYyAtZlBJQyAtZmZhc3QtbWF0aCAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFIC1EVVNFX1hTSE0gLURQVEhSRUFEUyAtSS91c3IvWDExUjYvaW5jbHVkZSAtRENIQU5fQklUUz0xNiAtRERFRkFVTFRfU09GVFdBUkVfREVQVEhfQklUUz0zMQogQ1hYRkxBR1MgPSAtTzMgLWFuc2kgLXBlZGFudGljIC1mUElDIC1mZmFzdC1tYXRoIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZwogCiAjIExpYnJhcnkgbmFtZXMKIE9TTUVTQV9MSUIgPSBPU01lc2ExNgpAQCAtMjUsNCArMjgsNCBAQAogIyBEZXBlbmRlbmNpZXMKIE9TTUVTQV9MSUJfREVQUyA9IC1sbSAtbHB0aHJlYWQKIEdMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKE9TTUVTQV9MSUIpCi1BUFBfTElCX0RFUFMgPSAtbE9TTWVzYTE2CitBUFBfTElCX0RFUFMgPSAtbG0gLWxwdGhyZWFkCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LW9zbWVzYTE2LXN0YXRpYyBiL2NvbmZpZ3MvbGludXgtb3NtZXNhMTYtc3RhdGljCmluZGV4IDFlNjM4MGIuLjE0NmFlYjggMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgtb3NtZXNhMTYtc3RhdGljCisrKyBiL2NvbmZpZ3MvbGludXgtb3NtZXNhMTYtc3RhdGljCkBAIC0xMCw3ICsxMCwxMSBAQAogQ0ZMQUdTID0gLU8zIC1hbnNpIC1wZWRhbnRpYyAtZmZhc3QtbWF0aCAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFIC1EVVNFX1hTSE0gLURQVEhSRUFEUyAtSS91c3IvWDExUjYvaW5jbHVkZSAtRENIQU5fQklUUz0xNiAtRERFRkFVTFRfU09GVFdBUkVfREVQVEhfQklUUz0zMQogQ1hYRkxBR1MgPSAtTzMgLWFuc2kgLXBlZGFudGljIC1mZmFzdC1tYXRoIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX1NWSURfU09VUkNFIC1EX0JTRF9TT1VSQ0UKIE1LTElCX09QVElPTlMgPSAtc3RhdGljCitQSUNfRkxBR1MgPQogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCiAKICMgTGlicmFyeSBuYW1lcwogT1NNRVNBX0xJQiA9IE9TTWVzYTE2CkBAIC0yNSw0ICsyOSw0IEBACiAKICMgRGVwZW5kZW5jaWVzCiBPU01FU0FfTElCX0RFUFMgPSAtbG0gLWxwdGhyZWFkCi1BUFBfTElCX0RFUFMgPSAtbE9TTWVzYTE2CitBUFBfTElCX0RFUFMgPSAtbG0gLWxwdGhyZWFkCmRpZmYgLS1naXQgYS9jb25maWdzL2xpbnV4LW9zbWVzYTMyIGIvY29uZmlncy9saW51eC1vc21lc2EzMgppbmRleCBmMGVmMTgzLi41ODA0ZWY4IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LW9zbWVzYTMyCisrKyBiL2NvbmZpZ3MvbGludXgtb3NtZXNhMzIKQEAgLTEwLDYgKzEwLDkgQEAKIENGTEFHUyA9IC1PMyAtYW5zaSAtcGVkYW50aWMgLWZQSUMgLWZmYXN0LW1hdGggLURfUE9TSVhfU09VUkNFIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfU1ZJRF9TT1VSQ0UgLURfQlNEX1NPVVJDRSAtRFVTRV9YU0hNIC1EUFRIUkVBRFMgLUkvdXNyL1gxMVI2L2luY2x1ZGUgLURDSEFOX0JJVFM9MzIgLURERUZBVUxUX1NPRlRXQVJFX0RFUFRIX0JJVFM9MzEKIENYWEZMQUdTID0gLU8zIC1hbnNpIC1wZWRhbnRpYyAtZlBJQyAtZmZhc3QtbWF0aCAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9TVklEX1NPVVJDRSAtRF9CU0RfU09VUkNFCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKIAogIyBMaWJyYXJ5IG5hbWVzCiBPU01FU0FfTElCID0gT1NNZXNhMzIKQEAgLTI1LDQgKzI4LDQgQEAKICMgRGVwZW5kZW5jaWVzCiBPU01FU0FfTElCX0RFUFMgPSAtbG0gLWxwdGhyZWFkCiBHTFVfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChPU01FU0FfTElCKQotQVBQX0xJQl9ERVBTID0gLWxPU01lc2EzMgorQVBQX0xJQl9ERVBTID0gLWxtIC1scHRocmVhZApkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1wcGMtc3RhdGljIGIvY29uZmlncy9saW51eC1wcGMtc3RhdGljCmluZGV4IGQwZTE2ODguLjNmM2RjNTUgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgtcHBjLXN0YXRpYworKysgYi9jb25maWdzL2xpbnV4LXBwYy1zdGF0aWMKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTkFNRSA9IGxpbnV4LXBwYy1zdGF0aWMKIAogTUtMSUJfT1BUSU9OUyA9IC1zdGF0aWMKK1BJQ19GTEFHUyA9CiAKICMgTGlicmFyeSBuYW1lcyAoYWN0dWFsIGZpbGUgbmFtZXMpCiBHTF9MSUJfTkFNRSA9IGxpYkdMLmEKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgtc29sbyBiL2NvbmZpZ3MvbGludXgtc29sbwppbmRleCAzMTQ1ZTEyLi40YmU3NjgwIDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LXNvbG8KKysrIGIvY29uZmlncy9saW51eC1zb2xvCkBAIC0zMiw2ICszMiw5IEBACiAKIENYWEZMQUdTID0gJChXQVJOX0ZMQUdTKSAkKE9QVF9GTEFHUykgJChQSUNfRkxBR1MpICQoQVJDSF9GTEFHUykgJChERUZJTkVTKQogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCiAKIE1FU0FfQVNNX1NPVVJDRVMgPSAKIApkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1zb2xvLXg4NiBiL2NvbmZpZ3MvbGludXgtc29sby14ODYKaW5kZXggNWY1YWEwOS4uYTliZjM4OCAxMDA2NDQKLS0tIGEvY29uZmlncy9saW51eC1zb2xvLXg4NgorKysgYi9jb25maWdzL2xpbnV4LXNvbG8teDg2CkBAIC01LDkgKzUsNiBAQAogCiBDT05GSUdfTkFNRSA9IGxpbnV4LXNvbG8teDg2CiAKLSMgVW5uZWNlc3Nhcnkgb24geDg2LCBnZW5lcmFsbHkuCi1QSUNfRkxBR1MgPSAKLQogQVNNX0ZMQUdTID0gLURVU0VfWDg2X0FTTSAtRFVTRV9NTVhfQVNNIC1EVVNFXzNETk9XX0FTTSAtRFVTRV9TU0VfQVNNCiBNRVNBX0FTTV9TT1VSQ0VTID0gJChYODZfU09VUkNFUykKIEdMQVBJX0FTTV9TT1VSQ0VTID0gJChYODZfQVBJKQpkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC1zdGF0aWMgYi9jb25maWdzL2xpbnV4LXN0YXRpYwppbmRleCBkNWZiZTljLi4yZmMzOWZmIDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LXN0YXRpYworKysgYi9jb25maWdzL2xpbnV4LXN0YXRpYwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19OQU1FID0gbGludXgtc3RhdGljCiAKIE1LTElCX09QVElPTlMgPSAtc3RhdGljCitQSUNfRkxBR1MgPQogCiAjIExpYnJhcnkgbmFtZXMgKGFjdHVhbCBmaWxlIG5hbWVzKQogR0xfTElCX05BTUUgPSBsaWJHTC5hCkBAIC0yMyw1ICsyNCw1IEBACiAjIE5lZWQgdG8gc3BlY2lmeSBhbGwgbGlicmFyaWVzIHdlIG1heSBuZWVkCiBBUFBfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1XbCwtLXN0YXJ0LWdyb3VwIFwKIAktbCQoR0xfTElCKSAkKFRPUCkvc3JjL21lc2EvcGlwZS9zb2Z0cGlwZS9saWJzb2Z0cGlwZS5hIC1XbCwtLWVuZC1ncm91cCAtbG0gXAotCS1ML3Vzci9YMTFSNi9saWIvIC1sWDExIC1sWG11IC1sWGkgLWxwdGhyZWFkCisJLUwvdXNyL1gxMVI2L2xpYi8gLWxYMTEgLWxYZXh0IC1sWG11IC1sWGkgLWxwdGhyZWFkCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgteDg2LTY0LXN0YXRpYyBiL2NvbmZpZ3MvbGludXgteDg2LTY0LXN0YXRpYwppbmRleCA5MDk5NjVkLi42MjZkNTc5IDEwMDY0NAotLS0gYS9jb25maWdzL2xpbnV4LXg4Ni02NC1zdGF0aWMKKysrIGIvY29uZmlncy9saW51eC14ODYtNjQtc3RhdGljCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX05BTUUgPSBsaW51eC14ODYtNjQtc3RhdGljCiAKIE1LTElCX09QVElPTlMgPSAtc3RhdGljCitQSUNfRkxBR1MgPQogCiAjIExpYnJhcnkgbmFtZXMgKGFjdHVhbCBmaWxlIG5hbWVzKQogR0xfTElCX05BTUUgPSBsaWJHTC5hCkBAIC0yMyw0ICsyNCw0IEBACiAjIE5lZWQgdG8gc3BlY2lmeSBhbGwgbGlicmFyaWVzIHdlIG1heSBuZWVkCiBBUFBfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1XbCwtLXN0YXJ0LWdyb3VwIFwKICAgICAgICAgICAgICAgIC1sJChHTF9MSUIpICQoVE9QKS9zcmMvbWVzYS9waXBlL3NvZnRwaXBlL2xpYnNvZnRwaXBlLmEgLVdsLC0tZW5kLWdyb3VwIFwKLSAgICAgICAgICAgICAgICQoRVhUUkFfTElCX1BBVEgpIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbHB0aHJlYWQgLWxzdGRjKysgLWxtCisgICAgICAgICAgICAgICAkKEVYVFJBX0xJQl9QQVRIKSAtbFgxMSAtbFhleHQgLWxYbXUgLWxYdCAtbFhpIC1scHRocmVhZCAtbHN0ZGMrKyAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3MvbGludXgteDg2LWdsaWRlIGIvY29uZmlncy9saW51eC14ODYtZ2xpZGUKaW5kZXggYjk2M2ZiZC4uNjAzYjJiZiAxMDA2NDQKLS0tIGEvY29uZmlncy9saW51eC14ODYtZ2xpZGUKKysrIGIvY29uZmlncy9saW51eC14ODYtZ2xpZGUKQEAgLTE0LDYgKzE0LDkgQEAKIAogR0xVVF9DRkxBR1MgPSAtZmV4Y2VwdGlvbnMKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZwogCiBNRVNBX0FTTV9TT1VSQ0VTID0gJChYODZfU09VUkNFUykKIEdMQVBJX0FTTV9TT1VSQ0VTID0gJChYODZfQVBJKQpkaWZmIC0tZ2l0IGEvY29uZmlncy9saW51eC14ODYtc3RhdGljIGIvY29uZmlncy9saW51eC14ODYtc3RhdGljCmluZGV4IDNiMjgxZTYuLjY1YzkyY2YgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvbGludXgteDg2LXN0YXRpYworKysgYi9jb25maWdzL2xpbnV4LXg4Ni1zdGF0aWMKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTkFNRSA9IGxpbnV4LXg4Ni1zdGF0aWMKIAogTUtMSUJfT1BUSU9OUyA9IC1zdGF0aWMKK1BJQ19GTEFHUyA9CiAKICMgTGlicmFyeSBuYW1lcyAoYWN0dWFsIGZpbGUgbmFtZXMpCiBHTF9MSUJfTkFNRSA9IGxpYkdMLmEKQEAgLTIzLDQgKzI0LDQgQEAKICMgTmVlZCB0byBzcGVjaWZ5IGFsbCBsaWJyYXJpZXMgd2UgbWF5IG5lZWQKIEFQUF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLVdsLC0tc3RhcnQtZ3JvdXAgXAogICAgICAgICAgICAgICAgLWwkKEdMX0xJQikgJChUT1ApL3NyYy9tZXNhL3BpcGUvc29mdHBpcGUvbGlic29mdHBpcGUuYSAtV2wsLS1lbmQtZ3JvdXAgXAotICAgICAgICAgICAgICAgJChFWFRSQV9MSUJfUEFUSCkgLWxYMTEgLWxYbXUgLWxYdCAtbFhpIC1scHRocmVhZCAtbHN0ZGMrKyAtbG0KKyAgICAgICAgICAgICAgICQoRVhUUkFfTElCX1BBVEgpIC1sWDExIC1sWGV4dCAtbFhtdSAtbFh0IC1sWGkgLWxwdGhyZWFkIC1sc3RkYysrIC1sbQpkaWZmIC0tZ2l0IGEvY29uZmlncy9uZXRic2QgYi9jb25maWdzL25ldGJzZAppbmRleCBmNWE2MWE4Li5hZWM0NTY5IDEwMDY0NAotLS0gYS9jb25maWdzL25ldGJzZAorKysgYi9jb25maWdzL25ldGJzZApAQCAtMTIsMyArMTIsNiBAQAogR0xVVF9DRkxBR1MgPSAtZmV4Y2VwdGlvbnMKIEFQUF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLUwvdXNyL1gxMVI2L2xpYiAtbFhleHQgLWxYbXUgLWxYaSAtbFgxMSAtbG0KIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZwpkaWZmIC0tZ2l0IGEvY29uZmlncy9vcGVuYnNkIGIvY29uZmlncy9vcGVuYnNkCmluZGV4IDZhZDZlMmIuLmJkMTlmYTggMTAwNjQ0Ci0tLSBhL2NvbmZpZ3Mvb3BlbmJzZAorKysgYi9jb25maWdzL29wZW5ic2QKQEAgLTEwLDYgKzEwLDEwIEBACiBDRkxBR1MgPSAtTzIgLWZQSUMgLUkvdXNyL1gxMVI2L2luY2x1ZGUgLURVU0VfWFNITSAtREhaPTEwMAogQ1hYRkxBR1MgPSAtTzIgLWZQSUMgLUkvdXNyL1gxMVI2L2luY2x1ZGUgLURIWj0xMDAKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworCiBHTF9MSUJfREVQUyA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEgLWxYZXh0IC1sbQogT1NNRVNBX0xJQl9ERVBTID0gLWxtCiBHTFVfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTF9MSUIpCmRpZmYgLS1naXQgYS9jb25maWdzL3NvbGFyaXMteDg2LWdjYyBiL2NvbmZpZ3Mvc29sYXJpcy14ODYtZ2NjCmluZGV4IDVlYzcyMzcuLjYxNmJmZGYgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3Mvc29sYXJpcy14ODYtZ2NjCisrKyBiL2NvbmZpZ3Mvc29sYXJpcy14ODYtZ2NjCkBAIC0xMSw2ICsxMSwxMCBAQAogQ1hYRkxBR1MgPSAtTzMgLW1hcmNoPWk0ODYgLWZQSUMKIEdMVVRfQ0ZMQUdTID0gLWZleGNlcHRpb25zCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKKwogR0xfTElCX0RFUFMgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEgLWxYZXh0IC1sbSAtbHB0aHJlYWQKIEdMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikgLWxtCiBHTFVUX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLUwvdXNyL29wZW53aW4vbGliIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3Mvc29sYXJpcy14ODYtZ2NjLXN0YXRpYyBiL2NvbmZpZ3Mvc29sYXJpcy14ODYtZ2NjLXN0YXRpYwppbmRleCBiZTAyNzM1Li40ODUwMjg0IDEwMDY0NAotLS0gYS9jb25maWdzL3NvbGFyaXMteDg2LWdjYy1zdGF0aWMKKysrIGIvY29uZmlncy9zb2xhcmlzLXg4Ni1nY2Mtc3RhdGljCkBAIC0xMiw2ICsxMiwxMCBAQAogR0xVVF9DRkxBR1MgPSAtZmV4Y2VwdGlvbnMKIE1LTElCX09QVElPTlMgPSAtc3RhdGljCiAKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworQ1hYRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKKwogR0xfTElCX0RFUFMgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEgLWxYZXh0IC1sbSAtbHB0aHJlYWQKIEdMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikgLWxtCiBHTFVUX0xJQl9ERVBTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLUwvdXNyL29wZW53aW4vbGliIC1sWDExIC1sWG11IC1sWHQgLWxYaSAtbG0KZGlmZiAtLWdpdCBhL2NvbmZpZ3Mvc3Vub3M0LWdjYyBiL2NvbmZpZ3Mvc3Vub3M0LWdjYwppbmRleCAyMDIyZGQ3Li4wOTQyMjkxIDEwMDY0NAotLS0gYS9jb25maWdzL3N1bm9zNC1nY2MKKysrIGIvY29uZmlncy9zdW5vczQtZ2NjCkBAIC0xMSw1ICsxMSw5IEBACiBDWFhGTEFHUyA9IC1mUElDIC1PMyAtSS91c3Ivb3Blbndpbi9pbmNsdWRlIC1EU1VOT1M0CiBHTFVUX0NGTEFHUyA9IC1mZXhjZXB0aW9ucyAtRFNPTEFSSVNfMl80X0JVRwogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKIEFQUF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLUwvdXNyL29wZW53aW4vbGliIC1sWDExIC1sWGV4dCAtbFhtdSAtbFhpIC1sbQogCmRpZmYgLS1naXQgYS9jb25maWdzL3N1bm9zNS1nY2MgYi9jb25maWdzL3N1bm9zNS1nY2MKaW5kZXggM2ZhMTNkMC4uNTcxZmYyNCAxMDA2NDQKLS0tIGEvY29uZmlncy9zdW5vczUtZ2NjCisrKyBiL2NvbmZpZ3Mvc3Vub3M1LWdjYwpAQCAtMjgsNiArMjgsMTAgQEAKIAogR0xVVF9DRkxBR1MgPSAtZmV4Y2VwdGlvbnMgLURTT0xBUklTXzJfNF9CVUcKIAorIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCitDWFhGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZworCiAjIExpYnJhcnkvcHJvZ3JhbSBkZXBlbmRlbmNpZXMKIEVYVFJBX0xJQl9QQVRIPS1ML3Vzci9vcGVud2luL2xpYgogCmRpZmYgLS1naXQgYS9jb25maWdzL3N1bm9zNS12OS1jYy1nKysgYi9jb25maWdzL3N1bm9zNS12OS1jYy1nKysKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1NjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3Mvc3Vub3M1LXY5LWNjLWcrKwpAQCAtMCwwICsxLDM1IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIFN1bk9TIDUsIFNQQVJDIFY5IGFuZCBjYy9nKysgKGZvciBDIGFuZCBDKysgc291cmNlcykKKworaW5jbHVkZSAkKFRPUCkvY29uZmlncy9kZWZhdWx0CisKK0NPTkZJR19OQU1FID0gc3Vub3M1LXY5LWNjLWcrKworCitNS0xJQl9PUFRJT05TID0gLWNwbHVzcGx1cworCitMSUJfRElSID0gbGliNjQKKworIyBDb21waWxlciBhbmQgZmxhZ3MKK0NDID0gY2MKK0NYWCA9IGcrKworCitDWFhfV0FSTl9GTEFHUyA9IC1XYWxsCitDWFhfUElDX0ZMQUdTICA9IC1mUElDCitDWFhfT1BUX0ZMQUdTICA9IC1PMyAtbTY0IC1tY3B1PXVsdHJhc3BhcmMgLW12OHBsdXMgLW12aXMgLWcgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUKK0NYWF9BUkNIX0ZMQUdTID0gLW02NAorCisKK0NYWEZMQUdTID0gJChDWFhfV0FSTl9GTEFHUykgJChDWFhfT1BUX0ZMQUdTKSAkKENYWF9QSUNfRkxBR1MpICQoQ1hYX0FSQ0hfRkxBR1MpICQoREVGSU5FUykgXAorICAgICAgICAtSS91c3Ivb3Blbndpbi9pbmNsdWRlCisKKyMgV29yayBhcm91bmQgYWxpYXNpbmcgYnVncyAtIGRldmVsb3BlcnMgc2hvdWxkIGNvbW1lbnQgdGhpcyBvdXQKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKK0NGTEFHUyA9IC14YXJjaD12OSAtS1BJQyAtTyAtSS91c3Ivb3Blbndpbi9pbmNsdWRlIC1JL3Vzci9kdC9pbmNsdWRlIC1EVVNFX1hTSE0gLURQVEhSRUFEUworI0NYWEZMQUdTID0gLXhhcmNoPXY5IC1LUElDIC1PIC1JL3Vzci9vcGVud2luL2luY2x1ZGUgLUkvdXNyL2R0L2luY2x1ZGUgLURQVEhSRUFEUworR0xVVF9DRkxBR1MgPSAtRFNPTEFSSVNfMl80X0JVRworCitHTF9MSUJfREVQUyA9IC1ML3Vzci9vcGVud2luL2xpYiAtTC91c3IvZHQvbGliIC1sWDExIC1sWGV4dCAtbFhtdSAtbFhpIC1sbSAtbHB0aHJlYWQKK0dMVV9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikgLWxtIC1sQ3N0ZCAtbENydW4KK0dMVVRfTElCX0RFUFMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAtbG0KK0dMV19MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMX0xJQikgLUwvdXNyL29wZW53aW4vbGliIC1sWHQgLWxYMTEKK0FQUF9MSUJfREVQUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWxYMTEgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgLWxtCmRpZmYgLS1naXQgYS9jb25maWdzL3VsdHJpeC1nY2MgYi9jb25maWdzL3VsdHJpeC1nY2MKaW5kZXggNWMwZjIyZC4uNDU1YjY5MyAxMDA2NDQKLS0tIGEvY29uZmlncy91bHRyaXgtZ2NjCisrKyBiL2NvbmZpZ3MvdWx0cml4LWdjYwpAQCAtMTIsNiArMTIsMTAgQEAKIEdMVVRfQ0ZMQUdTID0gLWZleGNlcHRpb25zCiBNS0xJQl9PUFRJT05TID0gLXN0YXRpYwogCisjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NYWEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKIEdMX0xJQl9OQU1FID0gbGliR0wuYQogR0xVX0xJQl9OQU1FID0gbGliR0xVLmEKIEdMVVRfTElCX05BTUUgPSBsaWJnbHV0LmEKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdkY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTA4NyBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gY3JlYXRlIGNvbmZpZ3VyZS4KKworQUNfUFJFUkVRKFsyLjU5XSkKKworZG5sIFZlcnNpb25pbmcgLSBzY3JhcGUgdGhlIHZlcnNpb24gZnJvbSBjb25maWdzL2RlZmF1bHQKK200X2RlZmluZShbbWVzYV92ZXJzaW9uXSwKKyAgICBbbTRfZXN5c2NtZChbJHtNQUtFLW1ha2V9IC1zIC1mIGJpbi92ZXJzaW9uLm1rIHZlcnNpb24gfCB0ciAtZCAnXG4nXSldKQorbTRfaWZ2YWwobWVzYV92ZXJzaW9uLFtdLFsKKyAgICBtNF9lcnJwcmludChbRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIE1lc2EgdmVyc2lvbiBmcm9tIHRoZSBvdXRwdXQgb2YKKyAgICAgICBydW5uaW5nIGBtYWtlIC1mIGJpbi92ZXJzaW9uLm1rIHZlcnNpb24nCitdKQorICAgIG00X2V4aXQoWzFdKQorXSkKKworZG5sIFRlbGwgdGhlIHVzZXIgYWJvdXQgYXV0b2NvbmYuaHRtbCBpbiB0aGUgLS1oZWxwIG91dHB1dAorbTRfZGl2ZXJ0X29uY2UoW0hFTFBfRU5EXSwgWworU2VlIGRvY3MvYXV0b2NvbmYuaHRtbCBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBvcHRpb25zIGZvciBNZXNhLl0pCisKK0FDX0lOSVQoW01lc2FdLFttZXNhX3ZlcnNpb25dLAorICAgIFtodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1NZXNhXSkKK0FDX0NPTkZJR19BVVhfRElSKFtiaW5dKQorQUNfQ0FOT05JQ0FMX0hPU1QKKworZG5sIFZlcnNpb25zIGZvciBleHRlcm5hbCBkZXBlbmRlbmNpZXMKK0xJQkRSTV9SRVFVSVJFRD0yLjMuMQorRFJJMlBST1RPX1JFUVVJUkVEPTEuMQorCitkbmwgQ2hlY2sgZm9yIHByb2dzCitBQ19QUk9HX0NQUAorQUNfUFJPR19DQworQUNfUFJPR19DWFgKK0FDX0NIRUNLX1BST0dTKFtNQUtFXSwgW2dtYWtlIG1ha2VdKQorQUNfUEFUSF9QUk9HKFtNS0RFUF0sIFttYWtlZGVwZW5kXSkKK0FDX1BBVEhfUFJPRyhbU0VEXSwgW3NlZF0pCisKK2RubCBXZSBuZWVkIGEgUE9TSVggc2hlbGwgZm9yIHBhcnRzIG9mIHRoZSBidWlsZC4gQXNzdW1lIHdlIGhhdmUgb25lCitkbmwgaW4gbW9zdCBjYXNlcy4KK2Nhc2UgIiRob3N0X29zIiBpbgorc29sYXJpcyopCisgICAgIyBTb2xhcmlzIC9iaW4vc2ggaXMgdG9vIG9sZC9ub24tUE9TSVggY29tcGxpYW50CisgICAgQUNfUEFUSF9QUk9HUyhQT1NJWF9TSEVMTCwgW2tzaDkzIGtzaCBzaF0pCisgICAgU0hFTEw9IiRQT1NJWF9TSEVMTCIKKyAgICA7OworZXNhYworCitNS0RFUF9PUFRJT05TPS1mZGVwZW5kCitkbmwgQXNrIGdjYyB3aGVyZSBpdCdzIGtlZXBpbmcgaXRzIHNlY3JldCBoZWFkZXJzCitpZiB0ZXN0ICJ4JEdDQyIgPSB4eWVzOyB0aGVuCisgICAgR0NDX0lOQ0xVREVTPWAkQ0MgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlYAorICAgIGlmIHRlc3QgIngkR0NDX0lOQ0xVREVTIiAhPSB4OyB0aGVuCisgICAgICAgIE1LREVQX09QVElPTlM9IiRNS0RFUF9PUFRJT05TIC1JJEdDQ19JTkNMVURFUyIKKyAgICBmaQorZmkKK0FDX1NVQlNUKFtNS0RFUF9PUFRJT05TXSkKKworZG5sIE1ha2Ugc3VyZSB0aGUgcGtnLWNvbmZpZyBtYWNyb3MgYXJlIGRlZmluZWQKK200X2lmZGVmKFtQS0dfUFJPR19QS0dfQ09ORklHXSxbXSxbCisgICAgbTRfZXJycHJpbnQoW0Vycm9yOiBDb3VsZCBub3QgbG9jYXRlIHRoZSBwa2ctY29uZmlnIGF1dG9jb25mIG1hY3Jvcy4KKyAgICAgICBUaGVzZSBhcmUgdXN1YWxseSBsb2NhdGVkIGluIC91c3Ivc2hhcmUvYWNsb2NhbC9wa2cubTQuIElmIHlvdXIKKyAgICAgICBtYWNyb3MgYXJlIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uLCB0cnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKKyAgICAgICB2YXJpYWJsZSBBQ0xPQ0FMPSJhY2xvY2FsIC1JL290aGVyL21hY3JvL2RpciIgYmVmb3JlIHJ1bm5pbmcKKyAgICAgICBhdXRvcmVjb25mLgorXSkKKyAgICBtNF9leGl0KFsxXSkKK10pCitQS0dfUFJPR19QS0dfQ09ORklHKCkKKworZG5sIExJQl9ESVIgLSBsaWJyYXJ5IGJhc2VuYW1lCitMSUJfRElSPWBlY2hvICRsaWJkaXIgfCAkU0VEICdzJS4qLyUlJ2AKK0FDX1NVQlNUKFtMSUJfRElSXSkKKworZG5sIENhY2hlIExERkxBR1Mgc28gd2UgY2FuIGFkZCBFWFRSQV9MSUJfUEFUSCBhbmQgcmVzdG9yZSBpdCBsYXRlcgorX1NBVkVfTERGTEFHUz0iJExERkxBR1MiCitBQ19BUkdfVkFSKFtFWFRSQV9MSUJfUEFUSF0sW0V4dHJhIC1MIHBhdGhzIGZvciB0aGUgbGlua2VyXSkKK0FDX1NVQlNUKFtFWFRSQV9MSUJfUEFUSF0pCisKK2RubCBDYWNoZSBDUFBGTEFHUyBzbyB3ZSBjYW4gYWRkICpfSU5DTFVERVMgYW5kIHJlc3RvcmUgaXQgbGF0ZXIKK19TQVZFX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCitBQ19BUkdfVkFSKFtYMTFfSU5DTFVERVNdLFtFeHRyYSAtSSBwYXRocyBmb3IgWDExIGhlYWRlcnNdKQorQUNfU1VCU1QoW1gxMV9JTkNMVURFU10pCisKK2RubCBDb21waWxlciBtYWNyb3MKK0RFRklORVM9IiIKK0FDX1NVQlNUKFtERUZJTkVTXSkKK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQoraWYgdGVzdCAieCRHQ0MiID0geHllczsgdGhlbgorICAgIERFRklORVM9IiRERUZJTkVTIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UiCitmaQorICAgIERFRklORVM9IiRERUZJTkVTIC1EX1NWSURfU09VUkNFIC1EX0dOVV9TT1VSQ0UgLURQVEhSRUFEUyIKKyAgICA7Oworc29sYXJpcyopCisgICAgREVGSU5FUz0iJERFRklORVMgLURQVEhSRUFEUyAtRFNWUjQiCisgICAgOzsKK2VzYWMKKworZG5sIEFkZCBmbGFncyBmb3IgZ2NjIGFuZCBnKysKK2lmIHRlc3QgIngkR0NDIiA9IHh5ZXM7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLXN0ZD1jOTkgLWZmYXN0LW1hdGgiCisKKyAgICAjIFdvcmsgYXJvdW5kIGFsaWFzaW5nIGJ1Z3MgLSBkZXZlbG9wZXJzIHNob3VsZCBjb21tZW50IHRoaXMgb3V0CisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tc3RyaWN0LWFsaWFzaW5nIgorZmkKK2lmIHRlc3QgIngkR1hYIiA9IHh5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1XYWxsIgorCisgICAgIyBXb3JrIGFyb3VuZCBhbGlhc2luZyBidWdzIC0gZGV2ZWxvcGVycyBzaG91bGQgY29tbWVudCB0aGlzIG91dAorICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWZuby1zdHJpY3QtYWxpYXNpbmciCitmaQorCitkbmwgVGhlc2Ugc2hvdWxkIGJlIHVubmVjZXNzYXJ5LCBidXQgbGV0IHRoZSB1c2VyIHNldCB0aGVtIGlmIHRoZXkgd2FudAorQUNfQVJHX1ZBUihbT1BUX0ZMQUdTXSwgW0FkZGl0aW9uYWwgb3B0aW1pemF0aW9uIGZsYWdzIGZvciB0aGUgY29tcGlsZXIuCisgICAgRGVmYXVsdCBpcyB0byB1c2UgQ0ZMQUdTLl0pCitBQ19BUkdfVkFSKFtBUkNIX0ZMQUdTXSwgW0FkZGl0aW9uYWwgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZsYWdzIGZvciB0aGUKKyAgICBjb21waWxlci4gRGVmYXVsdCBpcyB0byB1c2UgQ0ZMQUdTLl0pCitBQ19TVUJTVChbT1BUX0ZMQUdTXSkKK0FDX1NVQlNUKFtBUkNIX0ZMQUdTXSkKKworZG5sCitkbmwgSGFja3MgdG8gZW5hYmxlIDMyIG9yIDY0IGJpdCBidWlsZAorZG5sCitBQ19BUkdfRU5BQkxFKFszMi1iaXRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtMzItYml0XSwKKyAgICAgICAgW2J1aWxkIDMyLWJpdCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKV0sCisgICAgW2VuYWJsZV8zMmJpdD0iJGVuYWJsZXZhbCJdLAorICAgIFtlbmFibGVfMzJiaXQ9YXV0b10KKykKK2lmIHRlc3QgIngkZW5hYmxlXzMyYml0IiA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JEdDQyIgPSB4eWVzOyB0aGVuCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtbTMyIgorICAgIGZpCisgICAgaWYgdGVzdCAieCRHWFgiID0geHllczsgdGhlbgorICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1tMzIiCisgICAgZmkKK2ZpCitBQ19BUkdfRU5BQkxFKFs2NC1iaXRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtNjQtYml0XSwKKyAgICAgICAgW2J1aWxkIDY0LWJpdCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKV0sCisgICAgW2VuYWJsZV82NGJpdD0iJGVuYWJsZXZhbCJdLAorICAgIFtlbmFibGVfNjRiaXQ9YXV0b10KKykKK2lmIHRlc3QgIngkZW5hYmxlXzY0Yml0IiA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JEdDQyIgPSB4eWVzOyB0aGVuCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtbTY0IgorICAgIGZpCisgICAgaWYgdGVzdCAieCRHWFgiID0geHllczsgdGhlbgorICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1tNjQiCisgICAgZmkKK2ZpCisKK2RubAorZG5sIHNoYXJlZC9zdGF0aWMgbGlicmFyaWVzLCBtaW1pYyBsaWJ0b29sIG9wdGlvbnMKK2RubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY10sCisgICAgICAgIFtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PWRpc2FibGVkQDo+QF0pXSwKKyAgICBbZW5hYmxlX3N0YXRpYz0iJGVuYWJsZXZhbCJdLAorICAgIFtlbmFibGVfc3RhdGljPW5vXQorKQorY2FzZSAieCRlbmFibGVfc3RhdGljIiBpbgoreHllc3x4bm8gKSA7OworeCApIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyogKQorICAgIEFDX01TR19FUlJPUihbU3RhdGljIGxpYnJhcnkgb3B0aW9uICckZW5hYmxlX3N0YXRpYycgaXMgbm90IGEgdmFsaWRdKQorICAgIDs7Citlc2FjCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNoYXJlZF0sCisgICAgICAgIFtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PWVuYWJsZWRAOj5AXSldLAorICAgIFtlbmFibGVfc2hhcmVkPSIkZW5hYmxldmFsIl0sCisgICAgW2VuYWJsZV9zaGFyZWQ9eWVzXQorKQorY2FzZSAieCRlbmFibGVfc2hhcmVkIiBpbgoreHllc3x4bm8gKSA7OworeCApIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisqICkKKyAgICBBQ19NU0dfRVJST1IoW1NoYXJlZCBsaWJyYXJ5IG9wdGlvbiAnJGVuYWJsZV9zaGFyZWQnIGlzIG5vdCBhIHZhbGlkXSkKKyAgICA7OworZXNhYworCitkbmwgQ2FuJ3QgaGF2ZSBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMsIGRlZmF1bHQgdG8gc3RhdGljIGlmIHVzZXIKK2RubCBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgYm90aCBkaXNhYmxlZCwgc2V0IHRvIHN0YXRpYyBzaW5jZSBzaGFyZWQKK2RubCB3YXMgZXhwbGljaXRseSByZXF1aXJlc3RlZC4KK2Nhc2UgIngkZW5hYmxlX3N0YXRpYyRlbmFibGVfc2hhcmVkIiBpbgoreHllc3llcyApCisgICAgQUNfTVNHX1dBUk4oW0Nhbid0IGJ1aWxkIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcywgZGlzYWJsaW5nIHNoYXJlZF0pCisgICAgZW5hYmxlX3NoYXJlZD1ubworICAgIDs7Cit4bm9ubyApCisgICAgQUNfTVNHX1dBUk4oW0Nhbid0IGRpc2FibGUgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMsIGVuYWJsaW5nIHN0YXRpY10pCisgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICA7OworZXNhYworCitkbmwKK2RubCBta2xpYiBvcHRpb25zCitkbmwKK0FDX0FSR19WQVIoW01LTElCX09QVElPTlNdLFtPcHRpb25zIGZvciB0aGUgTWVzYSBsaWJyYXJ5IHNjcmlwdCwgbWtsaWJdKQoraWYgdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0geWVzOyB0aGVuCisgICAgTUtMSUJfT1BUSU9OUz0iJE1LTElCX09QVElPTlMgLXN0YXRpYyIKK2ZpCitBQ19TVUJTVChbTUtMSUJfT1BUSU9OU10pCisKK2RubAorZG5sIG90aGVyIGNvbXBpbGVyIG9wdGlvbnMKK2RubAorQUNfQVJHX0VOQUJMRShbZGVidWddLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZGVidWddLAorICAgICAgICBbdXNlIGRlYnVnIGNvbXBpbGVyIGZsYWdzIGFuZCBtYWNyb3MgQDw6QGRlZmF1bHQ9ZGlzYWJsZWRAOj5AXSldLAorICAgIFtlbmFibGVfZGVidWc9IiRlbmFibGV2YWwiXSwKKyAgICBbZW5hYmxlX2RlYnVnPW5vXQorKQoraWYgdGVzdCAieCRlbmFibGVfZGVidWciID0geHllczsgdGhlbgorICAgIERFRklORVM9IiRERUZJTkVTIC1EREVCVUciCisgICAgaWYgdGVzdCAieCRHQ0MiID0geHllczsgdGhlbgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLWciCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JEdYWCIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWciCisgICAgZmkKK2ZpCisKK2RubAorZG5sIGxpYnJhcnkgbmFtZXMKK2RubAoraWYgdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0geWVzOyB0aGVuCisgICAgR0xfTElCX05BTUU9J2xpYiQoR0xfTElCKS5hJworICAgIEdMVV9MSUJfTkFNRT0nbGliJChHTFVfTElCKS5hJworICAgIEdMVVRfTElCX05BTUU9J2xpYiQoR0xVVF9MSUIpLmEnCisgICAgR0xXX0xJQl9OQU1FPSdsaWIkKEdMV19MSUIpLmEnCisgICAgT1NNRVNBX0xJQl9OQU1FPSdsaWIkKE9TTUVTQV9MSUIpLmEnCitlbHNlCisgICAgR0xfTElCX05BTUU9J2xpYiQoR0xfTElCKS5zbycKKyAgICBHTFVfTElCX05BTUU9J2xpYiQoR0xVX0xJQikuc28nCisgICAgR0xVVF9MSUJfTkFNRT0nbGliJChHTFVUX0xJQikuc28nCisgICAgR0xXX0xJQl9OQU1FPSdsaWIkKEdMV19MSUIpLnNvJworICAgIE9TTUVTQV9MSUJfTkFNRT0nbGliJChPU01FU0FfTElCKS5zbycKK2ZpCitBQ19TVUJTVChbR0xfTElCX05BTUVdKQorQUNfU1VCU1QoW0dMVV9MSUJfTkFNRV0pCitBQ19TVUJTVChbR0xVVF9MSUJfTkFNRV0pCitBQ19TVUJTVChbR0xXX0xJQl9OQU1FXSkKK0FDX1NVQlNUKFtPU01FU0FfTElCX05BTUVdKQorCitkbmwKK2RubCBBcmNoL3BsYXRmb3JtLXNwZWNpZmljIHNldHRpbmdzCitkbmwKK0FDX0FSR19FTkFCTEUoW2FzbV0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYXNtXSwKKyAgICAgICAgW2Rpc2FibGUgYXNzZW1ibHkgdXNhZ2UgQDw6QGRlZmF1bHQ9ZW5hYmxlZCBvbiBzdXBwb3J0ZWQgcGxhZm9ybXNAOj5AXSldLAorICAgIFtlbmFibGVfYXNtPSIkZW5hYmxldmFsIl0sCisgICAgW2VuYWJsZV9hc209eWVzXQorKQorYXNtX2FyY2g9IiIKK0FTTV9GTEFHUz0iIgorQVNNX1NPVVJDRVM9IiIKK0FTTV9BUEk9IiIKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgYXNzZW1ibHldKQordGVzdCAieCRlbmFibGVfYXNtIiA9IHhubyAmJiBBQ19NU0dfUkVTVUxUKFtub10pCisjIGRpc2FibGUgaWYgY3Jvc3MgY29tcGlsaW5nIG9uIHg4Ni94ODZfNjQgc2luY2Ugd2UgbXVzdCBydW4gZ2VuX21hdHlwZXMKK2lmIHRlc3QgIngkZW5hYmxlX2FzbSIgPSB4eWVzICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgaT84NiB8IHg4Nl82NCkKKyAgICAgICAgZW5hYmxlX2FzbT1ubworICAgICAgICBBQ19NU0dfUkVTVUxUKFtubywgY3Jvc3MgY29tcGlsaW5nXSkKKyAgICAgICAgOzsKKyAgICBlc2FjCitmaQorIyBjaGVjayBmb3Igc3VwcG9ydGVkIGFyY2hlcworaWYgdGVzdCAieCRlbmFibGVfYXNtIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgaT84NikKKyAgICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICAgIGxpbnV4KiB8IGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgICAgIHRlc3QgIngkZW5hYmxlXzY0Yml0IiA9IHh5ZXMgJiYgYXNtX2FyY2g9eDg2XzY0IHx8IGFzbV9hcmNoPXg4NgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworICAgIHg4Nl82NCkKKyAgICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICAgIGxpbnV4KiB8IGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgICAgIHRlc3QgIngkZW5hYmxlXzMyYml0IiA9IHh5ZXMgJiYgYXNtX2FyY2g9eDg2IHx8IGFzbV9hcmNoPXg4Nl82NAorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworICAgIHBvd2VycGMpCisgICAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgICBsaW51eCopCisgICAgICAgICAgICBhc21fYXJjaD1wcGMKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICIkYXNtX2FyY2giIGluCisgICAgeDg2KQorICAgICAgICBBU01fRkxBR1M9Ii1EVVNFX1g4Nl9BU00gLURVU0VfTU1YX0FTTSAtRFVTRV8zRE5PV19BU00gLURVU0VfU1NFX0FTTSIKKyAgICAgICAgQVNNX1NPVVJDRVM9JyQoWDg2X1NPVVJDRVMpJworICAgICAgICBBU01fQVBJPSckKFg4Nl9BUEkpJworICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXMsIHg4Nl0pCisgICAgICAgIDs7CisgICAgeDg2XzY0KQorICAgICAgICBBU01fRkxBR1M9Ii1EVVNFX1g4Nl82NF9BU00iCisgICAgICAgIEFTTV9TT1VSQ0VTPSckKFg4Ni02NF9TT1VSQ0VTKScKKyAgICAgICAgQVNNX0FQST0nJChYODYtNjRfQVBJKScKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzLCB4ODZfNjRdKQorICAgICAgICA7OworICAgIHBwYykKKyAgICAgICAgQVNNX0ZMQUdTPSItRFVTRV9QUENfQVNNIC1EVVNFX1ZNWF9BU00iCisgICAgICAgIEFTTV9TT1VSQ0VTPSckKFBQQ19TT1VSQ0VTKScKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzLCBwcGNdKQorICAgICAgICA7OworICAgICopCisgICAgICAgIEFDX01TR19SRVNVTFQoW25vLCBwbGF0Zm9ybSBub3Qgc3VwcG9ydGVkXSkKKyAgICAgICAgOzsKKyAgICBlc2FjCitmaQorQUNfU1VCU1QoW0FTTV9GTEFHU10pCitBQ19TVUJTVChbQVNNX1NPVVJDRVNdKQorQUNfU1VCU1QoW0FTTV9BUEldKQorCitkbmwgUElDIGNvZGUgbWFjcm8KK01FU0FfUElDX0ZMQUdTCisKK2RubCBDaGVjayB0byBzZWUgaWYgZGxvcGVuIGlzIGluIGRlZmF1bHQgbGlicmFyaWVzIChsaWtlIFNvbGFyaXMsIHdoaWNoCitkbmwgaGFzIGl0IGluIGxpYmMpLCBvciBpZiBsaWJkbCBpcyBuZWVkZWQgdG8gZ2V0IGl0LgorQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwgW10sCisgICAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwgW0RMT1BFTl9MSUJTPSItbGRsIl0pXSkKKworZG5sIFNlZSBpZiBwb3NpeF9tZW1hbGlnbiBpcyBhdmFpbGFibGUKK0FDX0NIRUNLX0ZVTkMoW3Bvc2l4X21lbWFsaWduXSwgW0RFRklORVM9IiRERUZJTkVTIC1ESEFWRV9QT1NJWF9NRU1BTElHTiJdKQorCitkbmwgU0VMaW51eCBhd2FyZW5lc3MuCitBQ19BUkdfRU5BQkxFKFtzZWxpbnV4XSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNlbGludXhdLAorICAgICAgICBbQnVpbGQgU0VMaW51eC1hd2FyZSBNZXNhIEA8OkBkZWZhdWx0PWRpc2FibGVkQDo+QF0pXSwKKyAgICBbTUVTQV9TRUxJTlVYPSIkZW5hYmxldmFsIl0sCisgICAgW01FU0FfU0VMSU5VWD1ub10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9zZWxpbnV4IiA9ICJ4eWVzIjsgdGhlbgorICAgIEFDX0NIRUNLX0hFQURFUihbc2VsaW51eC9zZWxpbnV4LmhdLFtdLAorICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtTRUxpbnV4IGhlYWRlcnMgbm90IGZvdW5kXSldKQorICAgIEFDX0NIRUNLX0xJQihbc2VsaW51eF0sW2lzX3NlbGludXhfZW5hYmxlZF0sW10sCisgICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW1NFTGludXggbGlicmFyeSBub3QgZm91bmRdKV0pCisgICAgU0VMSU5VWF9MSUJTPSItbHNlbGludXgiCisgICAgREVGSU5FUz0iJERFRklORVMgLURNRVNBX1NFTElOVVgiCitmaQorCitkbmwgT1Mtc3BlY2lmaWMgbGlicmFyaWVzCitPU19MSUJTPSIiCitjYXNlICIkaG9zdF9vcyIgaW4KK3NvbGFyaXMqKQorICAgIE9TX0xJQlM9Ii1sYyIKKyAgICBpZiB0ZXN0ICJ4JEdYWCIgIT0geHllczsgdGhlbgorICAgICAgICBPU19DUExVU1BMVVNfTElCUz0iLWxDcnVuICRPU19MSUJTIgorICAgIGZpCisgICAgOzsKK2VzYWMKKworZG5sCitkbmwgRHJpdmVyIGNvbmZpZ3VyYXRpb24uIE9wdGlvbnMgYXJlIHhsaWIsIGRyaSBhbmQgb3NtZXNhIHJpZ2h0IG5vdy4KK2RubCBNb3JlIGxhdGVyOiBkaXJlY3RmYiwgZmJkZXYsIC4uLgorZG5sCitkZWZhdWx0X2RyaXZlcj0ieGxpYiIKKworY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgIGkqODZ8eDg2XzY0fHBvd2VycGMqKSBkZWZhdWx0X2RyaXZlcj0iZHJpIjs7CisgICAgZXNhYworICAgIDs7CitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgIGkqODZ8eDg2XzY0KSBkZWZhdWx0X2RyaXZlcj0iZHJpIjs7CisgICAgZXNhYworICAgIDs7Citlc2FjCisKK0FDX0FSR19XSVRIKFtkcml2ZXJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWRyaXZlcj1EUklWRVJdLAorICAgICAgICBbZHJpdmVyIGZvciBNZXNhOiB4bGliLGRyaSxvc21lc2EgQDw6QGRlZmF1bHQ9ZHJpIHdoZW4gYXZhaWxhYmxlLCBvciB4bGliQDo+QF0pXSwKKyAgICBbbWVzYV9kcml2ZXI9IiR3aXRodmFsIl0sCisgICAgW21lc2FfZHJpdmVyPSIkZGVmYXVsdF9kcml2ZXIiXSkKK2RubCBDaGVjayBmb3IgdmFsaWQgb3B0aW9uCitjYXNlICJ4JG1lc2FfZHJpdmVyIiBpbgoreHhsaWJ8eGRyaXx4b3NtZXNhKQorICAgIDs7CisqKQorICAgIEFDX01TR19FUlJPUihbRHJpdmVyICckbWVzYV9kcml2ZXInIGlzIG5vdCBhIHZhbGlkIG9wdGlvbl0pCisgICAgOzsKK2VzYWMKKworZG5sCitkbmwgRHJpdmVyIHNwZWNpZmljIGJ1aWxkIGRpcmVjdG9yaWVzCitkbmwKK1NSQ19ESVJTPSJtZXNhIgorR0xVX0RJUlM9InNnaSIKK1dJTkRPV19TWVNURU09IiIKK2Nhc2UgIiRtZXNhX2RyaXZlciIgaW4KK3hsaWIpCisgICAgRFJJVkVSX0RJUlM9IngxMSIKKyAgICA7OworZHJpKQorICAgIFNSQ19ESVJTPSJnbHgveDExICRTUkNfRElSUyIKKyAgICBEUklWRVJfRElSUz0iZHJpIgorICAgIFdJTkRPV19TWVNURU09ImRyaSIKKyAgICA7Oworb3NtZXNhKQorICAgIERSSVZFUl9ESVJTPSJvc21lc2EiCisgICAgOzsKK2VzYWMKK0FDX1NVQlNUKFtTUkNfRElSU10pCitBQ19TVUJTVChbR0xVX0RJUlNdKQorQUNfU1VCU1QoW0RSSVZFUl9ESVJTXSkKK0FDX1NVQlNUKFtXSU5ET1dfU1lTVEVNXSkKKworZG5sCitkbmwgVXNlciBzdXBwbGllZCBwcm9ncmFtIGNvbmZpZ3VyYXRpb24KK2RubAoraWYgdGVzdCAtZCAiJHNyY2Rpci9wcm9ncy9kZW1vcyI7IHRoZW4KKyAgICBkZWZhdWx0X2RlbW9zPXllcworZWxzZQorICAgIGRlZmF1bHRfZGVtb3M9bm8KK2ZpCitBQ19BUkdfV0lUSChbZGVtb3NdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWRlbW9zQDw6QD1ESVJTLi4uQDo+QF0sCisgICAgICAgIFtvcHRpb25hbCBjb21tYSBkZWxpbWl0ZWQgZGVtbyBkaXJlY3RvcmllcyB0byBidWlsZAorICAgICAgICBAPDpAZGVmYXVsdD1hdXRvIGlmIHNvdXJjZSBhdmFpbGFibGVAOj5AXSldLAorICAgIFt3aXRoX2RlbW9zPSIkd2l0aHZhbCJdLAorICAgIFt3aXRoX2RlbW9zPSIkZGVmYXVsdF9kZW1vcyJdKQoraWYgdGVzdCAieCR3aXRoX2RlbW9zIiA9IHg7IHRoZW4KKyAgICB3aXRoX2RlbW9zPW5vCitmaQorCitkbmwgSWYgJHdpdGhfZGVtb3MgaXMgeWVzLCBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIGxpYnMgYXZhaWxhYmxlCitQUk9HUkFNX0RJUlM9IiIKK2Nhc2UgIiR3aXRoX2RlbW9zIiBpbgorbm8pIDs7Cit5ZXMpCisgICAgIyBJZiB0aGUgZHJpdmVyIGlzbid0IG9zbWVzYSwgd2UgaGF2ZSBsaWJHTCBhbmQgY2FuIGJ1aWxkIHhkZW1vcworICAgIGlmIHRlc3QgIiRtZXNhX2RyaXZlciIgIT0gb3NtZXNhOyB0aGVuCisgICAgICAgIFBST0dSQU1fRElSUz0ieGRlbW9zIgorICAgIGZpCisgICAgOzsKKyopCisgICAgIyB2ZXJpZnkgdGhlIHJlcXVlc3RlZCBkZW1vcyBkaXJlY3RvcmllcyBleGlzdAorICAgIGRlbW9zPWBJRlM9LDsgZWNobyAkd2l0aF9kZW1vc2AKKyAgICBmb3IgZGVtbyBpbiAkZGVtb3M7IGRvCisgICAgICAgIHRlc3QgLWQgIiRzcmNkaXIvcHJvZ3MvJGRlbW8iIHx8IFwKKyAgICAgICAgICAgIEFDX01TR19FUlJPUihbUHJvZ3JhbSBkaXJlY3RvcnkgJyRkZW1vJyBkb2Vzbid0IGV4aXN0XSkKKyAgICBkb25lCisgICAgUFJPR1JBTV9ESVJTPSIkZGVtb3MiCisgICAgOzsKK2VzYWMKKworZG5sCitkbmwgRmluZCBvdXQgaWYgWCBpcyBhdmFpbGFibGUuIFRoZSB2YXJpYWJsZSBoYXZlX3ggaXMgc2V0IGlmIGxpYlgxMSBpcworZG5sIGZvdW5kIHRvIG1pbWljIEFDX1BBVEhfWFRSQS4KK2RubAoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtwa2ctY29uZmlnIGZpbGVzIGZvciBYMTEgYXJlIGF2YWlsYWJsZV0pCisgICAgUEtHX0NIRUNLX0VYSVNUUyhbeDExXSxbCisgICAgICAgIHgxMV9wa2djb25maWc9eWVzCisgICAgICAgIGhhdmVfeD15ZXMKKyAgICAgICAgXSxbCisgICAgICAgIHgxMV9wa2djb25maWc9bm8KKyAgICBdKQorICAgIEFDX01TR19SRVNVTFQoWyR4MTFfcGtnY29uZmlnXSkKK2Vsc2UKKyAgICB4MTFfcGtnY29uZmlnPW5vCitmaQorZG5sIFVzZSB0aGUgYXV0b2NvbmYgbWFjcm8gaWYgbm8gcGtnLWNvbmZpZyBmaWxlcworaWYgdGVzdCAiJHgxMV9wa2djb25maWciID0gbm87IHRoZW4KKyAgICBBQ19QQVRIX1hUUkEKK2ZpCisKK2RubCBUcnkgdG8gdGVsbCB0aGUgdXNlciB0aGF0IHRoZSAtLXgtKiBvcHRpb25zIGFyZSBvbmx5IHVzZWQgd2hlbgorZG5sIHBrZy1jb25maWcgaXMgbm90IGF2YWlsYWJsZS4gVGhpcyBtdXN0IGJlIHJpZ2h0IGFmdGVyIEFDX1BBVEhfWFRSQS4KK200X2RpdmVydF9vbmNlKFtIRUxQX0JFR0lOXSwKK1tUaGVzZSBvcHRpb25zIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgWCBsaWJyYXJpZXMgY2Fubm90IGJlIGZvdW5kIGJ5IHRoZQorcGtnLWNvbmZpZyB1dGlsaXR5Ll0pCisKK2RubCBXZSBuZWVkIFggZm9yIHhsaWIgYW5kIGRyaSwgc28gYm9tYiBub3cgaWYgaXQncyBub3QgZm91bmQKK2Nhc2UgIiRtZXNhX2RyaXZlciIgaW4KK3hsaWJ8ZHJpKQorICAgIGlmIHRlc3QgIiRub194IiA9IHllczsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1IoW1gxMSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgbmVlZGVkIGZvciAkbWVzYV9kcml2ZXIgZHJpdmVyXSkKKyAgICBmaQorICAgIDs7Citlc2FjCisKK2RubCBYQ0IgLSB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgR0xYIHJpZ2h0IG5vdworQUNfQVJHX0VOQUJMRShbeGNiXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXhjYl0sCisgICAgICAgIFt1c2UgWENCIGZvciBHTFggQDw6QGRlZmF1bHQ9ZGlzYWJsZWRAOj5AXSldLAorICAgIFtlbmFibGVfeGNiPSIkZW5hYmxldmFsIl0sCisgICAgW2VuYWJsZV94Y2I9bm9dKQoraWYgdGVzdCAieCRlbmFibGVfeGNiIiA9IHh5ZXM7IHRoZW4KKyAgICBERUZJTkVTPSIkREVGSU5FUyAtRFVTRV9YQ0IiCitlbHNlCisgICAgZW5hYmxlX3hjYj1ubworZmkKKworZG5sCitkbmwgbGliR0wgY29uZmlndXJhdGlvbiBwZXIgZHJpdmVyCitkbmwKK2Nhc2UgIiRtZXNhX2RyaXZlciIgaW4KK3hsaWIpCisgICAgaWYgdGVzdCAiJHgxMV9wa2djb25maWciID0geWVzOyB0aGVuCisgICAgICAgIFBLR19DSEVDS19NT0RVTEVTKFtYTElCR0xdLCBbeDExIHhleHRdKQorICAgICAgICBYMTFfSU5DTFVERVM9IiRYMTFfSU5DTFVERVMgJFhMSUJHTF9DRkxBR1MiCisgICAgICAgIEdMX0xJQl9ERVBTPSIkWExJQkdMX0xJQlMiCisgICAgZWxzZQorICAgICAgICAjIHNob3VsZCBjaGVjayB0aGVzZS4uLgorICAgICAgICBYMTFfSU5DTFVERVM9IiRYMTFfSU5DTFVERVMgJFhfQ0ZMQUdTIgorICAgICAgICBHTF9MSUJfREVQUz0iJFhfTElCUyAtbFgxMSAtbFhleHQiCisgICAgZmkKKyAgICBHTF9MSUJfREVQUz0iJEdMX0xJQl9ERVBTICRTRUxJTlVYX0xJQlMgLWxtIC1scHRocmVhZCAkT1NfTElCUyIKKworICAgICMgaWYgc3RhdGljLCBtb3ZlIHRoZSBleHRlcm5hbCBsaWJyYXJpZXMgdG8gdGhlIHByb2dyYW1zCisgICAgIyBhbmQgZW1wdHkgdGhlIGxpYnJhcmllcyBmb3IgbGliR0wKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgQVBQX0xJQl9ERVBTPSIkQVBQX0xJQl9ERVBTICRHTF9MSUJfREVQUyIKKyAgICAgICAgR0xfTElCX0RFUFM9IiIKKyAgICBmaQorICAgIDs7CitkcmkpCisgICAgIyBEUkkgbXVzdCBiZSBzaGFyZWQsIEkgdGhpbmsKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtDYW4ndCB1c2Ugc3RhdGljIGxpYnJhcmllcyBmb3IgRFJJIGRyaXZlcnNdKQorICAgIGZpCisKKyAgICAjIENoZWNrIGZvciBsaWJkcm0KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbTElCRFJNXSwgW2xpYmRybSA+PSAkTElCRFJNX1JFUVVJUkVEXSkKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbRFJJMlBST1RPXSwgW2RyaTJwcm90byA+PSAkRFJJMlBST1RPX1JFUVVJUkVEXSkKKworICAgICMgZmluZCB0aGUgRFJJIGRlcHMgZm9yIGxpYkdMCisgICAgaWYgdGVzdCAiJHgxMV9wa2djb25maWciID0geWVzOyB0aGVuCisgICAgICAgICMgYWRkIHhjYiBtb2R1bGVzIGlmIG5lY2Vzc2FyeQorICAgICAgICBkcmlfbW9kdWxlcz0ieDExIHhleHQgeHhmODZ2bSB4ZGFtYWdlIHhmaXhlcyIKKyAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV94Y2IiID0geWVzOyB0aGVuCisgICAgICAgICAgICBkcmlfbW9kdWxlcz0iJGRyaV9tb2R1bGVzIHgxMS14Y2IgeGNiLWdseCIKKyAgICAgICAgZmkKKworICAgICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbRFJJR0xdLCBbJGRyaV9tb2R1bGVzXSkKKyAgICAgICAgWDExX0lOQ0xVREVTPSIkWDExX0lOQ0xVREVTICREUklHTF9DRkxBR1MiCisgICAgICAgIEdMX0xJQl9ERVBTPSIkRFJJR0xfTElCUyIKKyAgICBlbHNlCisgICAgICAgICMgc2hvdWxkIGNoZWNrIHRoZXNlLi4uCisgICAgICAgIFgxMV9JTkNMVURFUz0iJFgxMV9JTkNMVURFUyAkWF9DRkxBR1MiCisgICAgICAgIEdMX0xJQl9ERVBTPSIkWF9MSUJTIC1sWDExIC1sWGV4dCAtbFh4Zjg2dm0gLWxYZGFtYWdlIC1sWGZpeGVzIgorCisgICAgICAgICMgWENCIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSBwa2ctY29uZmlnCisgICAgICAgIGlmIHRlc3QgIiRlbmFibGVfeGNiIiA9IHllczsgdGhlbgorICAgICAgICAgICAgUEtHX0NIRUNLX01PRFVMRVMoW1hDQl0sW3gxMS14Y2IgeGNiLWdseF0pCisgICAgICAgICAgICBYMTFfSU5DTFVERVM9IiRYMTFfSU5DTFVERVMgJFhDQl9DRkxBR1MiCisgICAgICAgICAgICBHTF9MSUJfREVQUz0iJEdMX0xJQl9ERVBTICRYQ0JfTElCUyIKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgIyBuZWVkIERSTSBsaWJzLCAtbHB0aHJlYWQsIGV0Yy4KKyAgICBHTF9MSUJfREVQUz0iJEdMX0xJQl9ERVBTICRMSUJEUk1fTElCUyAtbG0gLWxwdGhyZWFkICRETE9QRU5fTElCUyAkT1NfTElCUyIKKyAgICA7Oworb3NtZXNhKQorICAgICMgTm8gbGliR0wgZm9yIG9zbWVzYQorICAgIEdMX0xJQl9ERVBTPSIkT1NfTElCUyIKKyAgICA7OworZXNhYworQUNfU1VCU1QoW0dMX0xJQl9ERVBTXSkKKworZG5sCitkbmwgTW9yZSBYMTEgc2V0dXAKK2RubAoraWYgdGVzdCAiJG1lc2FfZHJpdmVyIiA9IHhsaWI7IHRoZW4KKyAgICBERUZJTkVTPSIkREVGSU5FUyAtRFVTRV9YU0hNIgorZmkKKworZG5sCitkbmwgTW9yZSBEUkkgc2V0dXAKK2RubAorQUNfQVJHX0VOQUJMRShbZ2x4LXRsc10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nbHgtdGxzXSwKKyAgICAgICAgW2VuYWJsZSBUTFMgc3VwcG9ydCBpbiBHTFggQDw6QGRlZmF1bHQ9ZGlzYWJsZWRAOj5AXSldLAorICAgIFtHTFhfVVNFX1RMUz0iJGVuYWJsZXZhbCJdLAorICAgIFtHTFhfVVNFX1RMUz1ub10pCitkbmwgRGlyZWN0b3J5IGZvciBEUkkgZHJpdmVycworQUNfQVJHX1dJVEgoW2RyaS1kcml2ZXJkaXJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWRyaS1kcml2ZXJkaXI9RElSXSwKKyAgICAgICAgW2RpcmVjdG9yeSBmb3IgdGhlIERSSSBkcml2ZXJzIEA8OkAke2xpYmRpcn0vZHJpQDo+QF0pXSwKKyAgICBbRFJJX0RSSVZFUl9JTlNUQUxMX0RJUj0iJHdpdGh2YWwiXSwKKyAgICBbRFJJX0RSSVZFUl9JTlNUQUxMX0RJUj0nJHtsaWJkaXJ9L2RyaSddKQorQUNfU1VCU1QoW0RSSV9EUklWRVJfSU5TVEFMTF9ESVJdKQorZG5sIERpcmVjdCByZW5kZXJpbmcgb3IganVzdCBpbmRpcmVjdCByZW5kZXJpbmcKK0FDX0FSR19FTkFCTEUoW2RyaWdseC1kaXJlY3RdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWRyaWdseC1kaXJlY3RdLAorICAgICAgICBbZW5hYmxlIGRpcmVjdCByZW5kZXJpbmcgaW4gR0xYIGZvciBEUkkgQDw6QGRlZmF1bHQ9ZW5hYmxlZEA6PkBdKV0sCisgICAgW2RyaWdseF9kaXJlY3Q9IiRlbmFibGV2YWwiXSwKKyAgICBbZHJpZ2x4X2RpcmVjdD0ieWVzIl0pCitkbmwgdHRtIHN1cHBvcnQKK0FDX0FSR19FTkFCTEUoW3R0bS1hcGldLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdHRtLWFwaV0sCisgICAgICAgIFtlbmFibGUgVFRNIEFQSSB1c2VycyBAPDpAZGVmYXVsdD1kaXNhYmxlZEA6PkBdKV0sCisgICAgW3R0bWFwaT0iJGVuYWJsZXZhbCJdLAorICAgIFt0dG1hcGk9Im5vIl0pCisKK2lmIHRlc3QgIngkdHRtYXBpIiA9ICJ4eWVzIjsgdGhlbgorICAgIHNhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9JExJQkRSTV9DRkxBR1MKKyAgICBBQ19DSEVDS19IRUFERVJTKFt4Zjg2bW0uaF0sW10sW0FDX01TR19FUlJPUihbeGY4Nm1tLmggcmVxdWlyZWQgZm9yIFRUTS5dKV0sWyNpbmNsdWRlICJzdGRpbnQuaCJcbiNpbmNsdWRlICJkcm0uaCJdKQorICAgIENGTEFHUz0kc2F2ZV9DRkxBR1MKK2ZpCisKK2RubCBXaGljaCBkcml2ZXJzIHRvIGJ1aWxkIC0gZGVmYXVsdCBpcyBjaG9zZW4gYnkgcGxhdGZvcm0KK0FDX0FSR19XSVRIKFtkcmktZHJpdmVyc10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZHJpLWRyaXZlcnNAPDpAPURJUlMuLi5AOj5AXSwKKyAgICAgICAgW2NvbW1hIGRlbGltaXRlZCBEUkkgZHJpdmVycyBsaXN0LCBlLmcuCisgICAgICAgICJzd3Jhc3QsaTk2NSxyYWRlb24sbm91dmVhdSIgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKV0sCisgICAgW3dpdGhfZHJpX2RyaXZlcnM9IiR3aXRodmFsIl0sCisgICAgW3dpdGhfZHJpX2RyaXZlcnM9eWVzXSkKK2lmIHRlc3QgIngkd2l0aF9kcmlfZHJpdmVycyIgPSB4OyB0aGVuCisgICAgd2l0aF9kcmlfZHJpdmVycz1ubworZmkKKworZG5sIElmICR3aXRoX2RyaV9kcml2ZXJzIGlzIHllcywgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCB0aHJvdWdoCitkbmwgcGxhdGZvcm0gY2hlY2tzCitEUklfRElSUz0iIgorY2FzZSAiJHdpdGhfZHJpX2RyaXZlcnMiIGluCitubykgOzsKK3llcykKKyAgICBEUklfRElSUz0ieWVzIgorICAgIDs7CisqKQorICAgICMgdmVyaWZ5IHRoZSByZXF1ZXN0ZWQgZHJpdmVyIGRpcmVjdG9yaWVzIGV4aXN0CisgICAgZHJpX2RyaXZlcnM9YElGUz0nLCAnOyBlY2hvICR3aXRoX2RyaV9kcml2ZXJzYAorICAgIGZvciBkcml2ZXIgaW4gJGRyaV9kcml2ZXJzOyBkbworICAgICAgICB0ZXN0IC1kICIkc3JjZGlyL3NyYy9tZXNhL2RyaXZlcnMvZHJpLyRkcml2ZXIiIHx8IFwKKyAgICAgICAgICAgIEFDX01TR19FUlJPUihbRFJJIGRyaXZlciBkaXJlY3RvcnkgJyRkcml2ZXInIGRvZXNuJ3QgZXhpc3RdKQorICAgIGRvbmUKKyAgICBEUklfRElSUz0iJGRyaV9kcml2ZXJzIgorICAgIDs7Citlc2FjCisKK2RubCBKdXN0IGRlZmF1bHQgdG8gbm8gRUdMIGZvciBub3cKK1VTSU5HX0VHTD0wCitBQ19TVUJTVChbVVNJTkdfRUdMXSkKKworZG5sIFNldCBEUklfRElSUywgREVGSU5FUyBhbmQgTElCX0RFUFMKK2lmIHRlc3QgIiRtZXNhX2RyaXZlciIgPSBkcmk7IHRoZW4KKyAgICAjIFVzZSBUTFMgaW4gR0xYPworICAgIGlmIHRlc3QgIngkR0xYX1VTRV9UTFMiID0geHllczsgdGhlbgorICAgICAgICBERUZJTkVTPSIkREVGSU5FUyAtREdMWF9VU0VfVExTIC1EUFRIUkVBRFMiCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkdHRtYXBpIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgREVGSU5FUz0iJERFRklORVMgLURUVE1fQVBJIgorICAgIGZpCisKKyAgICBpZiB0ZXN0ICJ4JFVTSU5HX0VHTCIgPSB4MTsgdGhlbgorICAgICAgICBQUk9HUkFNX0RJUlM9ImVnbCIKKyAgICBmaQorCisgICAgIyBQbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyBhbmQgZHJpdmVycyB0byBidWlsZAorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIGxpbnV4KikKKyAgICAgICAgREVGSU5FUz0iJERFRklORVMgLURVU0VfRVhURVJOQUxfRFhUTl9MSUI9MSAtRElOX0RSSV9EUklWRVIiCisgICAgICAgIERFRklORVM9IiRERUZJTkVTIC1ER0xYX0lORElSRUNUX1JFTkRFUklORyAtREhBVkVfQUxJQVMiCisgICAgICAgIGlmIHRlc3QgIngkZHJpZ2x4X2RpcmVjdCIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICBERUZJTkVTPSIkREVGSU5FUyAtREdMWF9ESVJFQ1RfUkVOREVSSU5HIgorICAgICAgICBmaQorCisgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgeDg2XzY0KQorICAgICAgICAgICAgIyBmZmIsIGdhbW1hLCBhbmQgc2lzIGFyZSBtaXNzaW5nIGJlY2F1c2UgdGhleSBoYXZlIG5vdCBiZQorICAgICAgICAgICAgIyBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBuZXcgaW50ZXJmYWNlLiAgaTgxMCBhcmUgbWlzc2luZworICAgICAgICAgICAgIyBiZWNhdXNlIHRoZXJlIGlzIG5vIHg4Ni02NCBzeXN0ZW0gd2hlcmUgdGhleSBjb3VsZCAqZXZlcioKKyAgICAgICAgICAgICMgYmUgdXNlZC4KKyAgICAgICAgICAgIGlmIHRlc3QgIngkRFJJX0RJUlMiID0gInh5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgRFJJX0RJUlM9Imk5MTUgaTk2NSBtYWNoNjQgbWdhIHIxMjggcjIwMCByMzAwIHJhZGVvbiBcCisgICAgICAgICAgICAgICAgICAgIHNhdmFnZSB0ZGZ4IHVuaWNocm9tZSBzd3Jhc3QiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgcG93ZXJwYyopCisgICAgICAgICAgICAjIEJ1aWxkIG9ubHkgdGhlIGRyaXZlcnMgZm9yIGNhcmRzIHRoYXQgZXhpc3Qgb24gUG93ZXJQQy4KKyAgICAgICAgICAgICMgQXQgc29tZSBwb2ludCBNR0Egd2lsbCBiZSBhZGRlZCwgYnV0IG5vdCB5ZXQuCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JERSSV9ESVJTIiA9ICJ4eWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIERSSV9ESVJTPSJtYWNoNjQgcjEyOCByMjAwIHIzMDAgcmFkZW9uIHRkZnggc3dyYXN0IgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIHNwYXJjKikKKyAgICAgICAgICAgICMgQnVpbGQgb25seSB0aGUgZHJpdmVycyBmb3IgY2FyZHMgdGhhdCBleGlzdCBvbiBzcGFyY2AKKyAgICAgICAgICAgIGlmIHRlc3QgIngkRFJJX0RJUlMiID0gInh5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgRFJJX0RJUlM9Im1hY2g2NCByMTI4IHIyMDAgcjMwMCByYWRlb24gZmZiIHN3cmFzdCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgICBERUZJTkVTPSIkREVGSU5FUyAtRFBUSFJFQURTIC1EVVNFX0VYVEVSTkFMX0RYVE5fTElCPTEiCisgICAgICAgIERFRklORVM9IiRERUZJTkVTIC1ESU5fRFJJX0RSSVZFUiAtREhBVkVfQUxJQVMiCisgICAgICAgIERFRklORVM9IiRERUZJTkVTIC1ER0xYX0lORElSRUNUX1JFTkRFUklORyIKKyAgICAgICAgaWYgdGVzdCAieCRkcmlnbHhfZGlyZWN0IiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIERFRklORVM9IiRERUZJTkVTIC1ER0xYX0RJUkVDVF9SRU5ERVJJTkciCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgIngkR1hYIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWFuc2kgLXBlZGFudGljIgorICAgICAgICBmaQorCisgICAgICAgICMgZmZiIGFuZCBnYW1tYSBhcmUgbWlzc2luZyBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQKKyAgICAgICAgIyB0byB1c2UgdGhlIG5ldyBpbnRlcmZhY2UuCisgICAgICAgIGlmIHRlc3QgIngkRFJJX0RJUlMiID0gInh5ZXMiOyB0aGVuCisgICAgICAgICAgICBEUklfRElSUz0iaTgxMCBpOTE1IGk5NjUgbWFjaDY0IG1nYSByMTI4IHIyMDAgcjMwMCByYWRlb24gdGRmeCBcCisgICAgICAgICAgICAgICAgdW5pY2hyb21lIHNhdmFnZSBzaXMgc3dyYXN0IgorICAgICAgICBmaQorICAgICAgICA7OworICAgIHNvbGFyaXMqKQorICAgICAgICBERUZJTkVTPSIkREVGSU5FUyAtRFVTRV9FWFRFUk5BTF9EWFROX0xJQj0xIC1ESU5fRFJJX0RSSVZFUiIKKyAgICAgICAgREVGSU5FUz0iJERFRklORVMgLURHTFhfSU5ESVJFQ1RfUkVOREVSSU5HIgorICAgICAgICBpZiB0ZXN0ICJ4JGRyaWdseF9kaXJlY3QiID0geHllczsgdGhlbgorICAgICAgICAgICAgREVGSU5FUz0iJERFRklORVMgLURHTFhfRElSRUNUX1JFTkRFUklORyIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIGRlZmF1bHQgZHJpdmVycworICAgIGlmIHRlc3QgIngkRFJJX0RJUlMiID0gInh5ZXMiOyB0aGVuCisgICAgICAgIERSSV9ESVJTPSJpODEwIGk5MTUgaTk2NSBtYWNoNjQgbWdhIHIxMjggcjIwMCByMzAwIHJhZGVvbiBzM3YgXAorICAgICAgICAgICAgc2F2YWdlIHNpcyB0ZGZ4IHRyaWRlbnQgdW5pY2hyb21lIGZmYiBzd3Jhc3QiCisgICAgZmkKKworICAgIERSSV9ESVJTPWBlY2hvICIkRFJJX0RJUlMiIHwgJFNFRCAncy8gICovIC9nJ2AKKworICAgICMgQ2hlY2sgZm9yIGV4cGF0CisgICAgRVhQQVRfSU5DTFVERVM9IiIKKyAgICBFWFBBVF9MSUI9LWxleHBhdAorICAgIEFDX0FSR19XSVRIKFtleHBhdF0sCisgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWV4cGF0PURJUl0sCisgICAgICAgICAgICBbZXhwYXQgaW5zdGFsbCBkaXJlY3RvcnldKV0sWworICAgICAgICBFWFBBVF9JTkNMVURFUz0iLUkkd2l0aHZhbC9pbmNsdWRlIgorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRFWFBBVF9JTkNMVURFUyIKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aHZhbC8kTElCX0RJUiIKKyAgICAgICAgRVhQQVRfTElCPSItTCR3aXRodmFsLyRMSUJfRElSIC1sZXhwYXQiCisgICAgICAgIF0pCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtleHBhdC5oXSxbXSxbQUNfTVNHX0VSUk9SKFtFeHBhdCByZXF1aXJlZCBmb3IgRFJJLl0pXSkKKyAgICBBQ19DSEVDS19MSUIoW2V4cGF0XSxbWE1MX1BhcnNlckNyZWF0ZV0sW10sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW0V4cGF0IHJlcXVpcmVkIGZvciBEUkkuXSldKQorCisgICAgIyBwdXQgYWxsIHRoZSBuZWNlc3NhcnkgbGlicyB0b2dldGhlcgorICAgIERSSV9MSUJfREVQUz0iJFNFTElOVVhfTElCUyAkTElCRFJNX0xJQlMgJEVYUEFUX0xJQiAtbG0gLWxwdGhyZWFkICRETE9QRU5fTElCUyIKK2ZpCitBQ19TVUJTVChbRFJJX0RJUlNdKQorQUNfU1VCU1QoW0VYUEFUX0lOQ0xVREVTXSkKK0FDX1NVQlNUKFtEUklfTElCX0RFUFNdKQorCitkbmwKK2RubCBPU01lc2EgY29uZmlndXJhdGlvbgorZG5sCitpZiB0ZXN0ICIkbWVzYV9kcml2ZXIiID0geGxpYjsgdGhlbgorICAgIGRlZmF1bHRfZ2xfb3NtZXNhPXllcworZWxzZQorICAgIGRlZmF1bHRfZ2xfb3NtZXNhPW5vCitmaQorQUNfQVJHX0VOQUJMRShbZ2wtb3NtZXNhXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWdsLW9zbWVzYV0sCisgICAgICAgIFtlbmFibGUgT1NNZXNhIG9uIGxpYkdMIEA8OkBkZWZhdWx0PWVuYWJsZWQgZm9yIHhsaWIgZHJpdmVyQDo+QF0pXSwKKyAgICBbZ2xfb3NtZXNhPSIkZW5hYmxldmFsIl0sCisgICAgW2dsX29zbWVzYT0iJGRlZmF1bHRfZ2xfb3NtZXNhIl0pCitpZiB0ZXN0ICJ4JGdsX29zbWVzYSIgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCAiJG1lc2FfZHJpdmVyIiA9IG9zbWVzYTsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1IoW2xpYkdMIGlzIG5vdCBhdmFpbGFibGUgZm9yIE9TTWVzYSBkcml2ZXJdKQorICAgIGVsc2UKKyAgICAgICAgRFJJVkVSX0RJUlM9IiREUklWRVJfRElSUyBvc21lc2EiCisgICAgZmkKK2ZpCisKK2RubCBDb25maWd1cmUgdGhlIGNoYW5uZWwgYml0cyBmb3IgT1NNZXNhIChsaWJPU01lc2EsIGxpYk9TTWVzYTE2LCAuLi4pCitBQ19BUkdfV0lUSChbb3NtZXNhLWJpdHNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLW9zbWVzYS1iaXRzPUJJVFNdLAorICAgICAgICBbT1NNZXNhIGNoYW5uZWwgYml0cyBhbmQgbGlicmFyeSBuYW1lOiA4LCAxNiwgMzIgQDw6QGRlZmF1bHQ9OEA6PkBdKV0sCisgICAgW29zbWVzYV9iaXRzPSIkd2l0aHZhbCJdLAorICAgIFtvc21lc2FfYml0cz04XSkKK2lmIHRlc3QgIiRtZXNhX2RyaXZlciIgIT0gb3NtZXNhICYmIHRlc3QgIngkb3NtZXNhX2JpdHMiICE9IHg4OyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0lnbm9yaW5nIE9TTWVzYSBjaGFubmVsIGJpdHMgZm9yIG5vbi1PU01lc2EgZHJpdmVyXSkKKyAgICBvc21lc2FfYml0cz04CitmaQorY2FzZSAieCRvc21lc2FfYml0cyIgaW4KK3g4KQorICAgIE9TTUVTQV9MSUI9T1NNZXNhCisgICAgOzsKK3gxNnx4MzIpCisgICAgT1NNRVNBX0xJQj0iT1NNZXNhJG9zbWVzYV9iaXRzIgorICAgIERFRklORVM9IiRERUZJTkVTIC1EQ0hBTl9CSVRTPSRvc21lc2FfYml0cyAtRERFRkFVTFRfU09GVFdBUkVfREVQVEhfQklUUz0zMSIKKyAgICA7OworKikKKyAgICBBQ19NU0dfRVJST1IoW09TTWVzYSBiaXRzICckb3NtZXNhX2JpdHMnIGlzIG5vdCBhIHZhbGlkIG9wdGlvbl0pCisgICAgOzsKK2VzYWMKK0FDX1NVQlNUKFtPU01FU0FfTElCXSkKKworY2FzZSAiJG1lc2FfZHJpdmVyIiBpbgorb3NtZXNhKQorICAgICMgb25seSBsaW5rIGxpYnJhcmllcyB3aXRoIG9zbWVzYSBpZiBzaGFyZWQKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubzsgdGhlbgorICAgICAgICBPU01FU0FfTElCX0RFUFM9Ii1sbSAtbHB0aHJlYWQgJFNFTElOVVhfTElCUyIKKyAgICBlbHNlCisgICAgICAgIE9TTUVTQV9MSUJfREVQUz0iIgorICAgIGZpCisgICAgT1NNRVNBX01FU0FfREVQUz0iIgorICAgIDs7CisqKQorICAgICMgTGluayBPU01lc2EgdG8gbGliR0wgb3RoZXJ3aXNlCisgICAgT1NNRVNBX0xJQl9ERVBTPSIiCisgICAgIyBvbmx5IGxpbmsgbGlicmFyaWVzIHdpdGggb3NtZXNhIGlmIHNoYXJlZAorICAgIGlmIHRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vOyB0aGVuCisgICAgICAgIE9TTUVTQV9NRVNBX0RFUFM9Jy1sJChHTF9MSUIpJworICAgIGVsc2UKKyAgICAgICAgT1NNRVNBX01FU0FfREVQUz0iIgorICAgIGZpCisgICAgOzsKK2VzYWMKK2lmIHRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vOyB0aGVuCisgICAgT1NNRVNBX0xJQl9ERVBTPSIkT1NNRVNBX0xJQl9ERVBTICRPU19MSUJTIgorZmkKK0FDX1NVQlNUKFtPU01FU0FfTElCX0RFUFNdKQorQUNfU1VCU1QoW09TTUVTQV9NRVNBX0RFUFNdKQorCitkbmwKK2RubCBHTFUgY29uZmlndXJhdGlvbgorZG5sCitBQ19BUkdfRU5BQkxFKFtnbHVdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdsdV0sCisgICAgICAgIFtlbmFibGUgT3BlbkdMIFV0aWxpdHkgbGlicmFyeSBAPDpAZGVmYXVsdD1lbmFibGVkQDo+QF0pXSwKKyAgICBbZW5hYmxlX2dsdT0iJGVuYWJsZXZhbCJdLAorICAgIFtlbmFibGVfZ2x1PXllc10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9nbHUiID0geHllczsgdGhlbgorICAgIFNSQ19ESVJTPSIkU1JDX0RJUlMgZ2x1IgorCisgICAgY2FzZSAiJG1lc2FfZHJpdmVyIiBpbgorICAgIG9zbWVzYSkKKyAgICAgICAgIyBJZiBHTFUgaXMgYXZhaWxhYmxlIGFuZCB3ZSBoYXZlIGxpYk9TTWVzYSAobm90IDE2IG9yIDMyKSwKKyAgICAgICAgIyB3ZSBjYW4gYnVpbGQgdGhlIG9zZGVtb3MKKyAgICAgICAgaWYgdGVzdCAiJHdpdGhfZGVtb3MiID0geWVzICYmIHRlc3QgIiRvc21lc2FfYml0cyIgPSA4OyB0aGVuCisgICAgICAgICAgICBQUk9HUkFNX0RJUlM9IiRQUk9HUkFNX0RJUlMgb3NkZW1vcyIKKyAgICAgICAgZmkKKworICAgICAgICAjIExpbmsgbGliR0xVIHRvIGxpYk9TTWVzYSBpbnN0ZWFkIG9mIGxpYkdMCisgICAgICAgIEdMVV9MSUJfREVQUz0iIgorICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubzsgdGhlbgorICAgICAgICAgICAgR0xVX01FU0FfREVQUz0nLWwkKE9TTUVTQV9MSUIpJworICAgICAgICBlbHNlCisgICAgICAgICAgICBHTFVfTUVTQV9ERVBTPSIiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgIyBJZiBzdGF0aWMsIGVtcHR5IEdMVV9MSUJfREVQUyBhbmQgYWRkIGxpYnMgZm9yIHByb2dyYW1zIHRvIGxpbmsKKyAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm87IHRoZW4KKyAgICAgICAgICAgIEdMVV9MSUJfREVQUz0iLWxtIgorICAgICAgICAgICAgR0xVX01FU0FfREVQUz0nLWwkKEdMX0xJQiknCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEdMVV9MSUJfREVQUz0iIgorICAgICAgICAgICAgR0xVX01FU0FfREVQUz0iIgorICAgICAgICAgICAgQVBQX0xJQl9ERVBTPSIkQVBQX0xJQl9ERVBTIC1sc3RkYysrIgorICAgICAgICBmaQorICAgICAgICA7OworICAgIGVzYWMKK2ZpCitpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubzsgdGhlbgorICAgIEdMVV9MSUJfREVQUz0iJEdMVV9MSUJfREVQUyAkT1NfQ1BMVVNQTFVTX0xJQlMiCitmaQorQUNfU1VCU1QoW0dMVV9MSUJfREVQU10pCitBQ19TVUJTVChbR0xVX01FU0FfREVQU10pCisKK2RubAorZG5sIEdMdyBjb25maWd1cmF0aW9uCitkbmwKK0FDX0FSR19FTkFCTEUoW2dsd10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZ2x3XSwKKyAgICAgICAgW2VuYWJsZSBYdC9Nb3RpZiB3aWRnZXQgbGlicmFyeSBAPDpAZGVmYXVsdD1lbmFibGVkQDo+QF0pXSwKKyAgICBbZW5hYmxlX2dsdz0iJGVuYWJsZXZhbCJdLAorICAgIFtlbmFibGVfZ2x3PXllc10pCitkbmwgRG9uJ3QgYnVpbGQgR0x3IG9uIG9zbWVzYQoraWYgdGVzdCAieCRlbmFibGVfZ2x3IiA9IHh5ZXMgJiYgdGVzdCAiJG1lc2FfZHJpdmVyIiA9IG9zbWVzYTsgdGhlbgorICAgIEFDX01TR19XQVJOKFtEaXNhYmxpbmcgR0x3IHNpbmNlIHRoZSBkcml2ZXIgaXMgT1NNZXNhXSkKKyAgICBlbmFibGVfZ2x3PW5vCitmaQorQUNfQVJHX0VOQUJMRShbbW90aWZdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbW90aWZdLAorICAgICAgICBbdXNlIE1vdGlmIHdpZGdldHMgaW4gR0x3IEA8OkBkZWZhdWx0PWRpc2FibGVkQDo+QF0pXSwKKyAgICBbZW5hYmxlX21vdGlmPSIkZW5hYmxldmFsIl0sCisgICAgW2VuYWJsZV9tb3RpZj1ub10pCisKK2lmIHRlc3QgIngkZW5hYmxlX2dsdyIgPSB4eWVzOyB0aGVuCisgICAgU1JDX0RJUlM9IiRTUkNfRElSUyBnbHciCisgICAgaWYgdGVzdCAiJHgxMV9wa2djb25maWciID0geWVzOyB0aGVuCisgICAgICAgIFBLR19DSEVDS19NT0RVTEVTKFtHTFddLFt4MTEgeHRdKQorICAgICAgICBHTFdfTElCX0RFUFM9IiRHTFdfTElCUyIKKyAgICBlbHNlCisgICAgICAgICMgc2hvdWxkIGNoZWNrIHRoZXNlLi4uCisgICAgICAgIEdMV19MSUJfREVQUz0iJFhfTElCUyAtbFh0IC1sWDExIgorICAgIGZpCisKKyAgICBHTFdfU09VUkNFUz0iR0x3RHJhd0EuYyIKKyAgICBNT1RJRl9DRkxBR1M9CisgICAgaWYgdGVzdCAieCRlbmFibGVfbW90aWYiID0geHllczsgdGhlbgorICAgICAgICBHTFdfU09VUkNFUz0iJEdMV19TT1VSQ0VTIEdMd01EcmF3QS5jIgorICAgICAgICBBQ19QQVRIX1BST0coW01PVElGX0NPTkZJR10sIFttb3RpZi1jb25maWddLCBbbm9dKQorICAgICAgICBpZiB0ZXN0ICJ4JE1PVElGX0NPTkZJRyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBNT1RJRl9DRkxBR1M9YCRNT1RJRl9DT05GSUcgLS1jZmxhZ3NgCisgICAgICAgICAgICBNT1RJRl9MSUJTPWAkTU9USUZfQ09ORklHIC0tbGlic2AKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKFtYbS9QcmltaXRpdmVQLmhdLCBbXSwKKyAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtDYW4ndCBsb2NhdGUgTW90aWYgaGVhZGVyc10pXSkKKyAgICAgICAgICAgIEFDX0NIRUNLX0xJQihbWG1dLCBbWG1HZXRQaXhtYXBdLCBbTU9USUZfTElCUz0iLWxYbSJdLAorICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW0Nhbid0IGxvY2F0ZSBNb3RpZiBYbSBsaWJyYXJ5XSldKQorICAgICAgICBmaQorICAgICAgICAjIE1PVElGX0xJQlMgaXMgcHJlcGVuZGVkIHRvIEdMV19MSUJfREVQUyBzaW5jZSBYbSBuZWVkcyBYdC9YMTEKKyAgICAgICAgR0xXX0xJQl9ERVBTPSIkTU9USUZfTElCUyAkR0xXX0xJQl9ERVBTIgorICAgIGZpCisKKyAgICAjIElmIHN0YXRpYywgZW1wdHkgR0xXX0xJQl9ERVBTIGFuZCBhZGQgbGlicyBmb3IgcHJvZ3JhbXMgdG8gbGluaworICAgIGlmIHRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vOyB0aGVuCisgICAgICAgIEdMV19NRVNBX0RFUFM9Jy1sJChHTF9MSUIpJworICAgICAgICBHTFdfTElCX0RFUFM9IiRHTFdfTElCX0RFUFMgJE9TX0xJQlMiCisgICAgZWxzZQorICAgICAgICBBUFBfTElCX0RFUFM9IiRBUFBfTElCX0RFUFMgJEdMV19MSUJfREVQUyIKKyAgICAgICAgR0xXX0xJQl9ERVBTPSIiCisgICAgICAgIEdMV19NRVNBX0RFUFM9IiIKKyAgICBmaQorZmkKK0FDX1NVQlNUKFtHTFdfTElCX0RFUFNdKQorQUNfU1VCU1QoW0dMV19NRVNBX0RFUFNdKQorQUNfU1VCU1QoW0dMV19TT1VSQ0VTXSkKK0FDX1NVQlNUKFtNT1RJRl9DRkxBR1NdKQorCitkbmwKK2RubCBHTFVUIGNvbmZpZ3VyYXRpb24KK2RubAoraWYgdGVzdCAtZiAiJHNyY2Rpci9pbmNsdWRlL0dML2dsdXQuaCI7IHRoZW4KKyAgICBkZWZhdWx0X2dsdXQ9eWVzCitlbHNlCisgICAgZGVmYXVsdF9nbHV0PW5vCitmaQorQUNfQVJHX0VOQUJMRShbZ2x1dF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZ2x1dF0sCisgICAgICAgIFtlbmFibGUgR0xVVCBsaWJyYXJ5IEA8OkBkZWZhdWx0PWVuYWJsZWQgaWYgc291cmNlIGF2YWlsYWJsZUA6PkBdKV0sCisgICAgW2VuYWJsZV9nbHV0PSIkZW5hYmxldmFsIl0sCisgICAgW2VuYWJsZV9nbHV0PSIkZGVmYXVsdF9nbHV0Il0pCisKK2RubCBDYW4ndCBidWlsZCBnbHV0IGlmIEdMVSBub3QgYXZhaWxhYmxlCitpZiB0ZXN0ICJ4JGVuYWJsZV9nbHUkZW5hYmxlX2dsdXQiID0geG5veWVzOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0Rpc2FibGluZyBnbHV0IHNpbmNlIEdMVSBpcyBkaXNhYmxlZF0pCisgICAgZW5hYmxlX2dsdXQ9bm8KK2ZpCitkbmwgRG9uJ3QgYnVpbGQgZ2x1dCBvbiBvc21lc2EKK2lmIHRlc3QgIngkZW5hYmxlX2dsdXQiID0geHllcyAmJiB0ZXN0ICIkbWVzYV9kcml2ZXIiID0gb3NtZXNhOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0Rpc2FibGluZyBnbHV0IHNpbmNlIHRoZSBkcml2ZXIgaXMgT1NNZXNhXSkKKyAgICBlbmFibGVfZ2x1dD1ubworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZ2x1dCIgPSB4eWVzOyB0aGVuCisgICAgU1JDX0RJUlM9IiRTUkNfRElSUyBnbHV0L2dseCIKKyAgICBHTFVUX0NGTEFHUz0iIgorICAgIGlmIHRlc3QgIngkR0NDIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgR0xVVF9DRkxBR1M9Ii1mZXhjZXB0aW9ucyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiR4MTFfcGtnY29uZmlnIiA9IHllczsgdGhlbgorICAgICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbR0xVVF0sW3gxMSB4bXUgeGldKQorICAgICAgICBHTFVUX0xJQl9ERVBTPSIkR0xVVF9MSUJTIgorICAgIGVsc2UKKyAgICAgICAgIyBzaG91bGQgY2hlY2sgdGhlc2UuLi4KKyAgICAgICAgR0xVVF9MSUJfREVQUz0iJFhfTElCUyAtbFgxMSAtbFhtdSAtbFhpIgorICAgIGZpCisgICAgR0xVVF9MSUJfREVQUz0iJEdMVVRfTElCX0RFUFMgLWxtICRPU19MSUJTIgorCisgICAgIyBJZiBnbHV0IGlzIGF2YWlsYWJsZSwgd2UgY2FuIGJ1aWxkIG1vc3QgcHJvZ3JhbXMKKyAgICBpZiB0ZXN0ICIkd2l0aF9kZW1vcyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgUFJPR1JBTV9ESVJTPSIkUFJPR1JBTV9ESVJTIGRlbW9zIHJlZGJvb2sgc2FtcGxlcyBnbHNsIgorICAgIGZpCisKKyAgICAjIElmIHN0YXRpYywgZW1wdHkgR0xVVF9MSUJfREVQUyBhbmQgYWRkIGxpYnMgZm9yIHByb2dyYW1zIHRvIGxpbmsKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubzsgdGhlbgorICAgICAgICBHTFVUX01FU0FfREVQUz0nLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpJworICAgIGVsc2UKKyAgICAgICAgQVBQX0xJQl9ERVBTPSIkQVBQX0xJQl9ERVBTICRHTFVUX0xJQl9ERVBTIgorICAgICAgICBHTFVUX0xJQl9ERVBTPSIiCisgICAgICAgIEdMVVRfTUVTQV9ERVBTPSIiCisgICAgZmkKK2ZpCitBQ19TVUJTVChbR0xVVF9MSUJfREVQU10pCitBQ19TVUJTVChbR0xVVF9NRVNBX0RFUFNdKQorQUNfU1VCU1QoW0dMVVRfQ0ZMQUdTXSkKKworZG5sCitkbmwgUHJvZ3JhbSBsaWJyYXJ5IGRlcGVuZGVuY2llcworZG5sICAgIE9ubHkgbGlibSBpcyBhZGRlZCBoZXJlIGlmIG5lY2Vzc2FyeSBhcyB0aGUgbGlicmFyaWVzIHNob3VsZAorZG5sICAgIGJlIHB1bGxlZCBpbiBieSB0aGUgbGlua2VyCitkbmwKK2lmIHRlc3QgIngkQVBQX0xJQl9ERVBTIiA9IHg7IHRoZW4KKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBzb2xhcmlzKikKKyAgICAgICAgQVBQX0xJQl9ERVBTPSItbFgxMSAtbHNvY2tldCAtbG5zbCAtbG0iCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgQVBQX0xJQl9ERVBTPSItbG0iCisgICAgICAgIDs7CisgICAgZXNhYworZmkKK0FDX1NVQlNUKFtBUFBfTElCX0RFUFNdKQorQUNfU1VCU1QoW1BST0dSQU1fRElSU10pCisKKworZG5sIFJlc3RvcmUgTERGTEFHUyBhbmQgQ1BQRkxBR1MKK0xERkxBR1M9IiRfU0FWRV9MREZMQUdTIgorQ1BQRkxBR1M9IiRfU0FWRV9DUFBGTEFHUyIKKworZG5sIFN1YnN0aXR1dGUgdGhlIGNvbmZpZworQUNfQ09ORklHX0ZJTEVTKFtjb25maWdzL2F1dG9jb25mXSkKKworZG5sIFJlcGxhY2UgdGhlIGNvbmZpZ3MvY3VycmVudCBzeW1saW5rCitBQ19DT05GSUdfQ09NTUFORFMoW2NvbmZpZ3NdLFsKK2lmIHRlc3QgLWYgY29uZmlncy9jdXJyZW50IHx8IHRlc3QgLUwgY29uZmlncy9jdXJyZW50OyB0aGVuCisgICAgcm0gLWYgY29uZmlncy9jdXJyZW50CitmaQorbG4gLXMgYXV0b2NvbmYgY29uZmlncy9jdXJyZW50CitdKQorCitBQ19PVVRQVVQKKworZG5sCitkbmwgT3V0cHV0IHNvbWUgY29uZmlndXJhdGlvbiBpbmZvIGZvciB0aGUgdXNlcgorZG5sCitlY2hvICIiCitlY2hvICIgICAgICAgIHByZWZpeDogICAgICAgICAgJHByZWZpeCIKK2VjaG8gIiAgICAgICAgZXhlY19wcmVmaXg6ICAgICAkZXhlY19wcmVmaXgiCitlY2hvICIgICAgICAgIGxpYmRpcjogICAgICAgICAgJGxpYmRpciIKK2VjaG8gIiAgICAgICAgaW5jbHVkZWRpcjogICAgICAkaW5jbHVkZWRpciIKKworZG5sIERyaXZlciBpbmZvCitlY2hvICIiCitlY2hvICIgICAgICAgIERyaXZlcjogICAgICAgICAgJG1lc2FfZHJpdmVyIgoraWYgZWNobyAiJERSSVZFUl9ESVJTIiB8IGdyZXAgJ29zbWVzYScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZWNobyAiICAgICAgICBPU01lc2E6ICAgICAgICAgIGxpYiRPU01FU0FfTElCIgorZWxzZQorICAgIGVjaG8gIiAgICAgICAgT1NNZXNhOiAgICAgICAgICBubyIKK2ZpCitpZiB0ZXN0ICIkbWVzYV9kcml2ZXIiID0gZHJpOyB0aGVuCisgICAgIyBjbGVhbnVwIHRoZSBkcml2ZXJzIHZhcgorICAgIGRyaV9kaXJzPWBlY2hvICREUklfRElSUyB8ICRTRUQgJ3MvXiAqLy87cy8gICovIC87cy8gKiQvLydgCitpZiB0ZXN0ICJ4JERSSV9ESVJTIiA9IHg7IHRoZW4KKyAgICBlY2hvICIgICAgICAgIERSSSBkcml2ZXJzOiAgICAgbm8iCitlbHNlCisgICAgZWNobyAiICAgICAgICBEUkkgZHJpdmVyczogICAgICRkcmlfZGlycyIKK2ZpCisgICAgZWNobyAiICAgICAgICBEUkkgZHJpdmVyIGRpcjogICREUklfRFJJVkVSX0lOU1RBTExfRElSIgorICAgIGVjaG8gIiAgICAgICAgVFRNIEFQSSBzdXBwb3J0OiAkdHRtYXBpIgorZmkKKworZG5sIExpYnJhcmllcworZWNobyAiIgorZWNobyAiICAgICAgICBTaGFyZWQgbGliczogICAgICRlbmFibGVfc2hhcmVkIgorZWNobyAiICAgICAgICBTdGF0aWMgbGliczogICAgICRlbmFibGVfc3RhdGljIgorZWNobyAiICAgICAgICBHTFU6ICAgICAgICAgICAgICRlbmFibGVfZ2x1IgorZWNobyAiICAgICAgICBHTHc6ICAgICAgICAgICAgICRlbmFibGVfZ2x3IChNb3RpZjogJGVuYWJsZV9tb3RpZikiCitlY2hvICIgICAgICAgIGdsdXQ6ICAgICAgICAgICAgJGVuYWJsZV9nbHV0IgorCitkbmwgUHJvZ3JhbXMKKyMgY2xlYW51cCB0aGUgcHJvZ3JhbXMgdmFyIGZvciBkaXNwbGF5Citwcm9ncmFtX2RpcnM9YGVjaG8gJFBST0dSQU1fRElSUyB8ICRTRUQgJ3MvXiAqLy87cy8gICovIC87cy8gKiQvLydgCitpZiB0ZXN0ICJ4JHByb2dyYW1fZGlycyIgPSB4OyB0aGVuCisgICAgZWNobyAiICAgICAgICBEZW1vczogICAgICAgICAgIG5vIgorZWxzZQorICAgIGVjaG8gIiAgICAgICAgRGVtb3M6ICAgICAgICAgICAkcHJvZ3JhbV9kaXJzIgorZmkKKworZG5sIENvbXBpbGVyIG9wdGlvbnMKKyMgY2xlYW51cCB0aGUgQ0ZMQUdTL0NYWEZMQUdTL0RFRklORVMgdmFycworY2ZsYWdzPWBlY2hvICRDRkxBR1MgJE9QVF9GTEFHUyAkUElDX0ZMQUdTICRBUkNIX0ZMQUdTIHwgXAorICAgICRTRUQgJ3MvXiAqLy87cy8gICovIC87cy8gKiQvLydgCitjeHhmbGFncz1gZWNobyAkQ1hYRkxBR1MgJE9QVF9GTEFHUyAkUElDX0ZMQUdTICRBUkNIX0ZMQUdTIHwgXAorICAgICRTRUQgJ3MvXiAqLy87cy8gICovIC87cy8gKiQvLydgCitkZWZpbmVzPWBlY2hvICRERUZJTkVTICRBU01fRkxBR1MgfCAkU0VEICdzL14gKi8vO3MvICAqLyAvO3MvICokLy8nYAorZWNobyAiIgorZWNobyAiICAgICAgICBDRkxBR1M6ICAgICAgICAgICRjZmxhZ3MiCitlY2hvICIgICAgICAgIENYWEZMQUdTOiAgICAgICAgJGN4eGZsYWdzIgorZWNobyAiICAgICAgICBNYWNyb3M6ICAgICAgICAgICRkZWZpbmVzIgorCitlY2hvICIiCitlY2hvICIgICAgICAgIFJ1biAnJHtNQUtFLW1ha2V9JyB0byBidWlsZCBNZXNhIgorZWNobyAiIgpkaWZmIC0tZ2l0IGEvZG9jcy9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsLnNwZWMgYi9kb2NzL09MRC9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsLnNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvTUVTQV9wYWNrZWRfZGVwdGhfc3RlbmNpbC5zcGVjCnJlbmFtZSB0byBkb2NzL09MRC9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsLnNwZWMKZGlmZiAtLWdpdCBhL2RvY3MvTUVTQV9wcm9ncmFtX2RlYnVnLnNwZWMgYi9kb2NzL09MRC9NRVNBX3Byb2dyYW1fZGVidWcuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9NRVNBX3Byb2dyYW1fZGVidWcuc3BlYwpyZW5hbWUgdG8gZG9jcy9PTEQvTUVTQV9wcm9ncmFtX2RlYnVnLnNwZWMKZGlmZiAtLWdpdCBhL2RvY3MvTUVTQV9zcHJpdGVfcG9pbnQuc3BlYyBiL2RvY3MvT0xEL01FU0Ffc3ByaXRlX3BvaW50LnNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvTUVTQV9zcHJpdGVfcG9pbnQuc3BlYwpyZW5hbWUgdG8gZG9jcy9PTEQvTUVTQV9zcHJpdGVfcG9pbnQuc3BlYwpkaWZmIC0tZ2l0IGEvZG9jcy9NRVNBX3RyYWNlLnNwZWMgYi9kb2NzL09MRC9NRVNBX3RyYWNlLnNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvTUVTQV90cmFjZS5zcGVjCnJlbmFtZSB0byBkb2NzL09MRC9NRVNBX3RyYWNlLnNwZWMKZGlmZiAtLWdpdCBhL2RvY3MvUkVBRE1FLk1JTkdXMzIgYi9kb2NzL1JFQURNRS5NSU5HVzMyCmluZGV4IDEzOGRkNDMuLjk0NzdiMmIgMTAwNjQ0Ci0tLSBhL2RvY3MvUkVBRE1FLk1JTkdXMzIKKysrIGIvZG9jcy9SRUFETUUuTUlOR1czMgpAQCAtOTEsOSArOTEsMTEgQEAKIAogCiAKLSoqKioqKioqKioqKioqKioqKipUaGlzIHNlY3Rpb24gaXMgYWRkZWQgYnkgSGVyb215dGgqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVXBkYXRlZCBvbiAyMDA3LTctMjEsIGJ5IEhlcm9teXRoIDx6eHBteXRoQHlhaG9vLmNvbS5jbj4KKyoqKioqKlRoaXMgc2VjdGlvbiBpcyBhZGRlZCBieSBIZXJvbXl0aCA8enhwbXl0aEB5YWhvby5jb20uY24+KioqKioqKioqKioqKgogCis9PT09PT09PT09PT09PT09PT09PQorVXBkYXRlZCBvbiAyMDA3LTctMjEKKz09PT09PT09PT09PT09PT09PT09CiAKIE5vdGljZToKIAkxKSBUaGUgZ2VuZXJhdGVkIERMTHMgYXJlICpub3QqIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyBidWlsdApAQCAtMTE1LDcgKzExNyw3IEBACiAsIGFuZCBkZWxldGUgYWxsIHRoZSBsaW5lcyB3aGVyZSBhbGwgdGhlIHdnbCooKSBmdW5jdGlvbnMgYXJlLiBCZWNhdXNlIHRoZXkgd291bGQgCiBiZSBjb25mbGljdGVkIHdpdGggdGhlIG9uZXMgaW4gPE1lc2EzRC1yb290PlxpbmNsdWRlXEdMXG1lc2Ffd2dsLmguCiAKLT09PT09PT0gQ29uZmxpY3RlZCBGdW5jdGlvbnMgTGlzdCA9PT09PT0KKz4+Pj4+Pj4+Pj4gQ29uZmxpY3RlZCBGdW5jdGlvbnMgTGlzdCA+Pj4+Pj4+Pj4+CiBXSU5HRElBUEkgQk9PTCBXSU5BUEkgd2dsQ29weUNvbnRleHQoSEdMUkMsSEdMUkMsVUlOVCk7CiBXSU5HRElBUEkgSEdMUkMgV0lOQVBJIHdnbENyZWF0ZUNvbnRleHQoSERDKTsKIFdJTkdESUFQSSBIR0xSQyBXSU5BUEkgd2dsQ3JlYXRlTGF5ZXJDb250ZXh0KEhEQyxpbnQpOwpAQCAtMTM0LDYgKzEzNiwxOCBAQAogV0lOR0RJQVBJIEJPT0wgV0lOQVBJIHdnbFVzZUZvbnRCaXRtYXBzVyhIREMsRFdPUkQsRFdPUkQsRFdPUkQpOwogV0lOR0RJQVBJIEJPT0wgV0lOQVBJIHdnbFVzZUZvbnRPdXRsaW5lc0EoSERDLERXT1JELERXT1JELERXT1JELEZMT0FULEZMT0FULGludCxMUEdMWVBITUVUUklDU0ZMT0FUKTsKIFdJTkdESUFQSSBCT09MIFdJTkFQSSB3Z2xVc2VGb250T3V0bGluZXNXKEhEQyxEV09SRCxEV09SRCxEV09SRCxGTE9BVCxGTE9BVCxpbnQsTFBHTFlQSE1FVFJJQ1NGTE9BVCk7Ci09PT09PT09PT09PT09PT09PT09Cis8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAorCis9PT09PT09PT09PT09PT09PT09PQorVXBkYXRlZCBvbiAyMDA3LTctMjIKKz09PT09PT09PT09PT09PT09PT09CisJSSBoYXZuJ3QgdGhvdWdodCB0aGF0IEkgd291bGQgZmluZCBhIGJldHRlciB3YXkgdG8gc29sdmUgbXkgcHJvYmxlbXMgc28gc29vbi4gCitJIGNoYW5nZWQgdGhlIG1ldGhvZCBpbiB3aGljaCB0aGUgaW1wb3J0LWxpYnMgYW5kIERMTHMgYXJlIG1hZGUuIEFmdGVyIHRoaXMgdXBkYXRlLAordGhlIERMTHMgb2YgTUVTQSBhcmUgbW9yZSBvcHRpbWl6ZWQgYW5kIG1vcmUgY29tcGF0aWJsZS4gCisJSXQgc2VlbXMgdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgdGhlIGJ1aWxkaW5nIHdheSBvZiAnTk8tU1REQ0FMTCcuVGhlIAord2F5IG9mIFVTSU5HX1NURENBTEwgaXMgc28gbmljZSEgVGhlIGZpbGUgPE1lc2EzRC1yb290Plxjb25maWdzXGNvbmZpZy5tZ3cgaXMgCithbHNvIG5vdCBuZWVkZWQsIGFuZCBjYW4gYmUgZGVsZXRlZCBzYWZlbHkhCisJCisKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9hdXRvY29uZi5odG1sIGIvZG9jcy9hdXRvY29uZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2F1dG9jb25mLmh0bWwKQEAgLTAsMCArMSwyODkgQEAKKzxodG1sPgorCis8dGl0bGU+Q29tcGlsYXRpb24gYW5kIEluc3RhbGxhdGlvbiB1c2luZyBBdXRvY29uZjwvdGl0bGU+CisKKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1lc2EuY3NzIj48L2hlYWQ+CisKKzxib2R5PgorCisKKzxoMT5Db21waWxhdGlvbiBhbmQgSW5zdGFsbGF0aW9uIHVzaW5nIEF1dG9jb25mPC9oMT4KKworPG9sPgorPGxpPjxhIGhyZWY9IiNiYXNpYyI+QmFzaWMgVXNhZ2U8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjZHJpdmVyIj5Ecml2ZXIgT3B0aW9uczwvYT48L2xpPgorICA8dWw+CisgIDxsaT48YSBocmVmPSIjeGxpYiI+WGxpYiBEcml2ZXIgT3B0aW9uczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2RyaSI+RFJJIERyaXZlciBPcHRpb25zPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjb3NtZXNhIj5PU01lc2EgRHJpdmVyIE9wdGlvbnM8L2E+PC9saT4KKyAgPC91bD4KKzxsaT48YSBocmVmPSIjbGlicmFyeSI+TGlicmFyeSBPcHRpb25zPC9hPjwvbGk+CisgIDx1bD4KKyAgPGxpPjxhIGhyZWY9IiNnbHUiPkdMVTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2dsdyI+R0x3PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjZ2x1dCI+R0xVVDwvYT48L2xpPgorICA8L3VsPgorPGxpPjxhIGhyZWY9IiNkZW1vcyI+RGVtbyBQcm9ncmFtIE9wdGlvbnM8L2E+PC9saT4KKzwvb2w+CisKKworPGEgbmFtZT0iYmFzaWMiPgorPGgyPjEuIEJhc2ljIFVzYWdlPC9oMj4KKworPHA+CitUaGUgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gZ3Vlc3MgeW91cgorcGxhdGZvcm0gYW5kIGNoYW5nZSB2YXJpb3VzIG9wdGlvbnMgZm9yIGJ1aWxkaW5nIE1lc2EuIFRvIHVzZSB0aGUKK2NvbmZpZ3VyZSBzY3JpcHQsIHR5cGU6Cis8L3A+CisKKzxwcmU+CisgICAgLi9jb25maWd1cmUKKzwvcHJlPgorCis8cD4KK1RvIHNlZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIGFsbCB0aGUgb3B0aW9ucywgdHlwZSA8Y29kZT4uL2NvbmZpZ3VyZQorLS1oZWxwPC9jb2RlPi4gSWYgeW91IGFyZSB1c2luZyBhIGRldmVsb3BtZW50IHNuYXBzaG90IGFuZCB0aGUgY29uZmlndXJlCitzY3JpcHQgZG9lcyBub3QgZXhpc3QsIHR5cGUgPGNvZGU+Li9hdXRvZ2VuLnNoPC9jb2RlPiB0byBnZW5lcmF0ZSBpdAorZmlyc3QuIElmIHlvdSBrbm93IHRoZSBvcHRpb25zIHlvdSB3YW50IHRvIHBhc3MgdG8KKzxjb2RlPmNvbmZpZ3VyZTwvY29kZT4sIHlvdSBjYW4gcGFzcyB0aGVtIHRvIDxjb2RlPmF1dG9nZW4uc2g8L2NvZGU+LiBJdAord2lsbCBydW4gPGNvZGU+Y29uZmlndXJlPC9jb2RlPiB3aXRoIHRoZXNlIG9wdGlvbnMgYWZ0ZXIgaXQgaXMKK2dlbmVyYXRlZC4gT25jZSB5b3UgaGF2ZSBydW4gPGNvZGU+Y29uZmlndXJlPC9jb2RlPiBhbmQgc2V0IHRoZSBvcHRpb25zCit0byB5b3VyIHByZWZlcmVuY2UsIHR5cGU6Cis8L3A+CisKKzxwcmU+CisgICAgbWFrZQorPC9wcmU+CisKKzxwPgorVGhpcyB3aWxsIHByb2R1Y2UgbGliR0wuc28gYW5kIHNldmVyYWwgb3RoZXIgbGlicmFyaWVzIGRlcGVuZGluZyBvbiB0aGUKK29wdGlvbnMgeW91IGhhdmUgY2hvc2VuLiBMYXRlciwgaWYgeW91IHdhbnQgdG8gcmVidWlsZCBmb3IgYSBkaWZmZXJlbnQKK2NvbmZpZ3VyYXRpb24gcnVuIDxjb2RlPm1ha2UgcmVhbGNsZWFuPC9jb2RlPiBiZWZvcmUgcmVidWlsZGluZy4KKzwvcD4KKworPHA+CitTb21lIG9mIHRoZSBnZW5lcmljIGF1dG9jb25mIG9wdGlvbnMgYXJlIHVzZWQgd2l0aCBNZXNhOgorCis8dWw+Cis8bGk+PGNvZGU+LS1wcmVmaXg9UFJFRklYPC9jb2RlPiAtIFRoaXMgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IHdoZXJlCitmaWxlcyB3aWxsIGJlIGluc3RhbGxlZCBieSA8Y29kZT5tYWtlIGluc3RhbGw8L2NvZGU+LiBUaGUgZGVmYXVsdCBpcworPGNvZGU+L3Vzci9sb2NhbDwvY29kZT4uCis8L2xpPgorPGxpPjxjb2RlPi0tZXhlYy1wcmVmaXg9RVBSRUZJWDwvY29kZT4gLSBUaGlzIGlzIHRoZSByb290IGRpcmVjdG9yeQord2hlcmUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyB3aWxsIGJlIGluc3RhbGxlZC4gSW4gTWVzYSwgdGhpcyBpcworb25seSB1c2VkIHRvIGRlcml2ZSB0aGUgZGlyZWN0b3J5IGZvciB0aGUgbGlicmFyaWVzLiBUaGUgZGVmYXVsdCBpcworPGNvZGU+JHtwcmVmaXh9PC9jb2RlPi4KKzwvbGk+Cis8bGk+PGNvZGU+LS1saWJkaXI9TElCRElSPC9jb2RlPiAtIFRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5Cit3aGVyZSB0aGUgR0wgbGlicmFyaWVzIHdpbGwgYmUgaW5zdGFsbGVkLiBUaGUgZGVmYXVsdCBpcworPGNvZGU+JHtleGVjX3ByZWZpeH0vbGliPC9jb2RlPi4gSXQgYWxzbyBzZXJ2ZXMgYXMgdGhlIG5hbWUgb2YgdGhlCitsaWJyYXJ5IHN0YWdpbmcgYXJlYSBpbiB0aGUgc291cmNlIHRyZWUuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG9wdGlvbgorPGNvZGU+LS1saWJkaXI9L3Vzci9sb2NhbC9saWI2NDwvY29kZT4gaXMgdXNlZCwgdGhlIGxpYnJhcmllcyB3aWxsIGJlCitjcmVhdGVkIGluIGEgPGNvZGU+bGliNjQ8L2NvZGU+IGRpcmVjdG9yeSBhdCB0aGUgdG9wIG9mIHRoZSBNZXNhIHNvdXJjZQordHJlZS4KKzwvbGk+Cis8bGk+PGNvZGU+LS1lbmFibGUtc3RhdGljLCAtLWRpc2FibGUtc2hhcmVkPC9jb2RlPiAtIEJ5IGRlZmF1bHQsIE1lc2EKK3dpbGwgYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4gRWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgd2lsbCBmb3JjZSBzdGF0aWMKK2xpYnJhcmllcyB0byBiZSBidWlsdC4gSXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBidWlsZCBzdGF0aWMgYW5kCitzaGFyZWQgbGlicmFyaWVzIGluIGEgc2luZ2xlIHBhc3MuCis8L2xpPgorPGxpPjxjb2RlPkNDLCBDRkxBR1MsIENYWCwgQ1hYRkxBR1M8L2NvZGU+IC0gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCitjb250cm9sIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHVzZWQgZHVyaW5nIHRoZSBidWlsZC4gQnkgZGVmYXVsdCwKKzxjb2RlPmdjYzwvY29kZT4gYW5kIDxjb2RlPmcrKzwvY29kZT4gYXJlIHVzZWQgd2l0aCB0aGUgb3B0aW9ucworPGNvZGU+Ii1nIC1PMiI8L2NvZGU+LgorPC9saT4KKzxsaT48Y29kZT5MREZMQUdTPC9jb2RlPiAtIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWNpZnlpbmcgZmxhZ3MgdG8KK3Bhc3Mgd2hlbiBsaW5raW5nIHByb2dyYW1zLiBUaGVzZSBhcmUgbm9ybWFsbHkgZW1wdHksIGJ1dCBjYW4gYmUgdXNlZAordG8gZGlyZWN0IHRoZSBsaW5rZXIgdG8gdXNlIGxpYnJhcmllcyBpbiBub25zdGFuZGFyZCBkaXJlY3Rvcmllcy4gRm9yCitleGFtcGxlLCA8Y29kZT5MREZMQUdTPSItTC91c3IvWDExUjYvbGliIjwvY29kZT4uCis8L2xpPgorPGxpPjxjb2RlPlBLR19DT05GSUdfUEFUSDwvY29kZT4gLSBXaGVuIGF2YWlsYWJsZSwgdGhlCis8Y29kZT5wa2ctY29uZmlnPC9jb2RlPiB1dGlsaXR5IGlzIHVzZWQgdG8gc2VhcmNoIGZvciBleHRlcm5hbCBsaWJyYXJpZXMKK29uIHRoZSBzeXN0ZW0uIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCB0byBjb250cm9sIHRoZSBzZWFyY2gKK3BhdGggZm9yIDxjb2RlPnBrZy1jb25maWc8L2NvZGU+LiBGb3IgaW5zdGFuY2UsIHNldHRpbmcKKzxjb2RlPlBLR19DT05GSUdfUEFUSD0vdXNyL1gxMVI2L2xpYi9wa2djb25maWc8L2NvZGU+IHdpbGwgc2VhcmNoIGZvcgorcGFja2FnZSBtZXRhZGF0YSBpbiA8Y29kZT4vdXNyL1gxMVI2PC9jb2RlPiBiZWZvcmUgdGhlIHN0YW5kYXJkCitkaXJlY3Rvcmllcy4KKzwvbGk+Cis8L3VsPgorPC9wPgorCis8cD4KK1RoZXJlIGFyZSBhbHNvIGEgZmV3IGdlbmVyYWwgb3B0aW9ucyBmb3IgYWx0ZXJpbmcgdGhlIE1lc2EgYnVpbGQ6Cis8dWw+Cis8bGk+PGNvZGU+LS13aXRoLXg8L2NvZGU+IC0gV2hlbiB0aGUgWDExIGRldmVsb3BtZW50IGxpYnJhcmllcyBhcmUKK25lZWRlZCwgdGhlIDxjb2RlPnBrZy1jb25maWc8L2NvZGU+IHV0aWxpdHkgPGEgaHJlZj0iI3BrZy1jb25maWciPndpbGwKK2JlIHVzZWQ8L2E+IGZvciBsb2NhdGluZyB0aGVtLiBJZiB0aGV5IGNhbm5vdCBiZSBmb3VuZCB0aHJvdWdoCis8Y29kZT5wa2ctY29uZmlnPC9jb2RlPiBhIGZhbGxiYWNrIHJvdXRpbmcgdXNpbmcgPGNvZGU+aW1ha2U8L2NvZGU+IHdpbGwKK2JlIHVzZWQuIEluIHRoaXMgY2FzZSwgdGhlIDxjb2RlPi0td2l0aC14PC9jb2RlPiwKKzxjb2RlPi0teC1pbmNsdWRlczwvY29kZT4gYW5kIDxjb2RlPi0teC1saWJyYXJpZXM8L2NvZGU+IG9wdGlvbnMgY2FuCitjb250cm9sIHRoZSB1c2Ugb2YgWCBmb3IgTWVzYS4KKzwvbGk+Cis8bGk+PGNvZGU+LS1lbmFibGUtZ2wtb3NtZXNhPC9jb2RlPiAtIFRoZSA8YSBocmVmPSJvc21lc2EuaHRtbCI+T1NNZXNhCitsaWJyYXJ5PC9hPiBjYW4gYmUgYnVpbHQgb24gdG9wIG9mIGxpYkdMIGZvciBkcml2ZXJzIHRoYXQgcHJvdmlkZSBpdC4KK1RoaXMgb3B0aW9uIGNvbnRyb2xzIHdoZXRoZXIgdG8gYnVpbGQgbGliT1NNZXNhLiBCeSBkZWZhdWx0LCB0aGlzIGlzCitlbmFibGVkIGZvciB0aGUgWGxpYiBkcml2ZXIgYW5kIGRpc2FibGVkIG90aGVyd2lzZS4gTm90ZSB0aGF0IHRoaXMKK29wdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB1c2luZyBPU01lc2EgYXMgdGhlIGRyaXZlci4KKzwvbGk+Cis8bGk+PGNvZGU+LS1lbmFibGUtZGVidWc8L2NvZGU+IC0gVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgY29tcGlsZXIKK29wdGlvbnMgYW5kIG1hY3JvcyB0byBhaWQgaW4gZGVidWdnaW5nIHRoZSBNZXNhIGxpYnJhcmllcy4KKzwvbGk+Cis8bGk+PGNvZGU+LS1kaXNhYmxlLWFzbTwvY29kZT4gLSBUaGVyZSBhcmUgYXNzZW1ibHkgcm91dGluZXMKK2F2YWlsYWJsZSBmb3IgYSBmZXcgYXJjaGl0ZWN0dXJlcy4gVGhlc2Ugd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQgaWYKK29uZSBvZiB0aGVzZSBhcmNoaXRlY3R1cmVzIGlzIGRldGVjdGVkLiBUaGlzIG9wdGlvbiBlbnN1cmVzIHRoYXQKK2Fzc2VtYmx5IHdpbGwgbm90IGJlIHVzZWQuCis8L2xpPgorPGxpPjxjb2RlPi0tZW5hYmxlLTMyLWJpdCwgLS1lbmFibGUtNjQtYml0PC9jb2RlPiAtIEJ5IGRlZmF1bHQsIHRoZQorYnVpbGQgd2lsbCBjb21waWxlIGNvZGUgYXMgZGlyZWN0ZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworPGNvZGU+Q0M8L2NvZGU+LCA8Y29kZT5DRkxBR1M8L2NvZGU+LCBldGMuIElmIHRoZSBjb21waWxlciBpcworPGNvZGU+Z2NjPC9jb2RlPiwgdGhlc2Ugb3B0aW9ucyBvZmZlciBhIGhlbHBlciB0byBhZGQgdGhlIGNvbXBpbGVyIGZsYWdzCit0byBmb3JjZSAzMi0gb3IgNjQtYml0IGNvZGUgZ2VuZXJhdGlvbiBhcyB1c2VkIG9uIHRoZSB4ODYgYW5kIHg4Nl82NAorYXJjaGl0ZWN0dXJlcy4KKzwvbGk+Cis8L3VsPgorPC9wPgorCisKKzxhIG5hbWU9ImRyaXZlciI+Cis8aDI+Mi4gRHJpdmVyIE9wdGlvbnM8L2gyPgorCis8cD4KK1RoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCBkcml2ZXIgbW9kZXMgdGhhdCBNZXNhIGNhbiB1c2UuIFRoZXNlIGFyZQorZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSA8YSBocmVmPSJpbnN0YWxsLmh0bWwiPmJhc2ljCitpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zPC9hPi4gVGhlIE1lc2EgZHJpdmVyIGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUKK2NvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWRyaXZlci4gVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSBzdXBwb3J0ZWQKK29wdGlvbnMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCis8L3A+CisKKzx1bD4KKworPGEgbmFtZT0ieGxpYiI+Cis8bGk+PGI+PGVtPlhsaWI8L2VtPjwvYj4gLSBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIGJ1aWxkaW5nIE1lc2EuCitJdCB1c2VzIFhsaWIgYXMgYSBzb2Z0d2FyZSByZW5kZXJlciB0byBkbyBhbGwgcmVuZGVyaW5nLiBJdCBjb3JyZXNwb25kcwordG8gdGhlIG9wdGlvbiA8Y29kZT4tLXdpdGgtZHJpdmVyPXhsaWI8L2NvZGU+LiBUaGUgbGliWDExIGFuZCBsaWJYZXh0CitsaWJyYXJpZXMsIGFzIHdlbGwgYXMgdGhlIFgxMSBkZXZlbG9wbWVudCBoZWFkZXJzLCB3aWxsIGJlIG5lZWQgdG8KK3N1cHBvcnQgdGhlIFhsaWIgZHJpdmVyLgorPC9saT4KKworPGEgbmFtZT0iZHJpIj4KKzxsaT48Yj48ZW0+RFJJPC9lbT48L2I+IC0gVGhpcyBtb2RlIHVzZXMgdGhlIERSSSBoYXJkd2FyZSBkcml2ZXJzIGZvcgorYWNjZWxlcmF0ZWQgT3BlbkdMIHJlbmRlcmluZy4gRW5hYmxlIHRoZSBEUkkgZHJpdmVycyB3aXRoIHRoZSBvcHRpb24KKzxjb2RlPi0td2l0aC1kcml2ZXI9ZHJpPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPSJpbnN0YWxsLmh0bWwiPmJhc2ljCitpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zPC9hPiBmb3IgZGV0YWlscyBvbiBwcmVyZXF1aXNpdGVzIGZvciB0aGUgRFJJCitkcml2ZXJzLgorPC9saT4KKworPCEtLSBEUkkgc3BlY2lmaWMgb3B0aW9ucyAtLT4KKzxwPgorPHVsPgorPGxpPjxjb2RlPi0td2l0aC1kcmktZHJpdmVyZGlyPURJUjwvY29kZT4gLSBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlCitsb2NhdGlvbiB0aGUgRFJJIGRyaXZlcnMgd2lsbCBiZSBpbnN0YWxsZWQgdG8gYW5kIHRoZSBsb2NhdGlvbiBsaWJHTAord2lsbCBzZWFyY2ggZm9yIERSSSBkcml2ZXJzLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT4ke2xpYmRpcn0vZHJpPC9jb2RlPi4KKzwvbGk+Cis8bGk+PGNvZGU+LS13aXRoLWRyaS1kcml2ZXJzPURSSVZFUixEUklWRVIsLi4uPC9jb2RlPiAtIFRoaXMgb3B0aW9uCithbGxvd3MgYSBzcGVjaWZpYyBzZXQgb2YgRFJJIGRyaXZlcnMgdG8gYmUgYnVpbHQuIEZvciBleGFtcGxlLAorPGNvZGU+LS13aXRoLWRyaS1kcml2ZXJzPSJzd3Jhc3QsaTk2NSxyYWRlb24sbm91dmVhdSI8L2NvZGU+LiBCeQorZGVmYXVsdCwgdGhlIGRyaXZlcnMgd2lsbCBiZSBjaG9zZW4gZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0uCitTZWUgdGhlIGRpcmVjdG9yeSA8Y29kZT5zcmMvbWVzYS9kcml2ZXJzL2RyaTwvY29kZT4gaW4gdGhlIHNvdXJjZSB0cmVlCitmb3IgYXZhaWxhYmxlIGRyaXZlcnMuIEJld2FyZSB0aGF0IHRoZSBzd3Jhc3QgRFJJIGRyaXZlciBpcyB1c2VkIGJ5IGJvdGgKK2xpYkdMIGFuZCB0aGUgWC5PcmcgeHNlcnZlciBHTFggbW9kdWxlIHRvIGRvIHNvZnR3YXJlIHJlbmRlcmluZywgc28geW91CittYXkgcnVuIGludG8gcHJvYmxlbXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZS48L2xpPgorPCEtLSBUaGlzIGV4cGxhbmF0aW9uIG1pZ2h0IGJlIHRvdGFsbHkgYm9ndXMuIEtyaXN0aWFuPyAtLT4KKzxsaT48Y29kZT4tLWRpc2FibGUtZHJpZ2x4LWRpcmVjdDwvY29kZT4gLSBEaXNhYmxlIGRpcmVjdCByZW5kZXJpbmcgaW4KK0dMWC4gTm9ybWFsbHksIGRpcmVjdCBoYXJkd2FyZSByZW5kZXJpbmcgdGhyb3VnaCB0aGUgRFJJIGRyaXZlcnMgYW5kCitpbmRpcmVjdCBzb2Z0d2FyZSByZW5kZXJpbmcgYXJlIGVuYWJsZWQgaW4gR0xYLiBUaGlzIG9wdGlvbiBkaXNhYmxlcworZGlyZWN0IHJlbmRlcmluZyBlbnRpcmVseS4gSXQgY2FuIGJlIHVzZWZ1bCBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlCitrZXJuZWwgRFJNIG1vZHVsZXMgYXJlIG5vdCBhdmFpbGFibGUuCis8L2xpPgorPGxpPjxjb2RlPi0tZW5hYmxlLWdseC10bHM8L2NvZGU+IC0gRW5hYmxlIFRocmVhZCBMb2NhbCBTdG9yYWdlIChUTFMpIGluCitHTFguCis8L2xpPgorPGxpPjxjb2RlPi0td2l0aC1leHBhdD1ESVI8L2NvZGU+IC0gVGhlIERSSS1lbmFibGVkIGxpYkdMIHVzZXMgZXhwYXQgdG8KK3BhcnNlIHRoZSBEUkkgY29uZmlndXJhdGlvbiBmaWxlcyBpbiA8Y29kZT4vZXRjL2RyaXJjPC9jb2RlPiBhbmQKKzxjb2RlPn4vLmRyaXJjPC9jb2RlPi4gVGhpcyBvcHRpb24gYWxsb3dzIGEgc3BlY2lmaWMgZXhwYXQgaW5zdGFsbGF0aW9uCit0byBiZSB1c2VkLiBGb3IgZXhhbXBsZSwgPGNvZGU+LS13aXRoLWV4cGF0PS91c3IvbG9jYWw8L2NvZGU+IHdpbGwKK3NlYXJjaCBmb3IgZXhwYXQgaGVhZGVycyBhbmQgbGlicmFyaWVzIGluIDxjb2RlPi91c3IvbG9jYWwvaW5jbHVkZTwvY29kZT4KK2FuZCA8Y29kZT4vdXNyL2xvY2FsL2xpYjwvY29kZT4sIHJlc3BlY3RpdmVseS4KKzwvbGk+Cis8L3VsPgorPC9wPgorCis8YSBuYW1lPSJvc21lc2EiPgorPGxpPjxiPjxlbT5PU01lc2E8L2VtPjwvYj4gLSBObyBsaWJHTCBpcyBidWlsdCBpbiB0aGlzCittb2RlLiBJbnN0ZWFkLCB0aGUgZHJpdmVyIGNvZGUgaXMgYnVpbHQgaW50byB0aGUgT2ZmLVNjcmVlbiBNZXNhCisoT1NNZXNhKSBsaWJyYXJ5LiBTZWUgdGhlIDxhIGhyZWY9Im9zbWVzYS5odG1sIj5PZmYtU2NyZWVuIFJlbmRlcmluZzwvYT4KK3BhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+CisKKzwhLS0gT1NNZXNhIHNwZWNpZmljIG9wdGlvbnMgLS0+Cis8cD4KKzx1bD4KKzxsaT48Y29kZT4tLXdpdGgtb3NtZXNhLWJpdHM9QklUUzwvY29kZT4gLSBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIHNpemUKK29mIHRoZSBjb2xvciBjaGFubmVsIGluIGJpdHMgdG8gYmUgc3BlY2lmaWVkLiBCeSBkZWZhdWx0LCBhbiA4LWJpdAorY2hhbm5lbCB3aWxsIGJlIHVzZWQsIGFuZCB0aGUgZHJpdmVyIHdpbGwgYmUgbmFtZWQgbGliT1NNZXNhLiBPdGhlcgorb3B0aW9ucyBhcmUgMTYtIGFuZCAzMi1iaXQgY29sb3IgY2hhbm5lbHMsIHdoaWNoIHdpbGwgYWRkIHRoZSBiaXQgc2l6ZQordG8gdGhlIGxpYnJhcnkgbmFtZS4gRm9yIGV4YW1wbGUsIDxjb2RlPi0td2l0aC1vc21lc2EtYml0cz0xNjwvY29kZT4KK3dpbGwgY3JlYXRlIHRoZSBsaWJPU01lc2ExNiBsaWJyYXJ5IHdpdGggYSAxNi1iaXQgY29sb3IgY2hhbm5lbC4KKzwvbGk+Cis8L3VsPgorPC9wPgorCis8L3VsPgorCisKKzxhIG5hbWU9ImxpYnJhcnkiPgorPGgyPjMuIExpYnJhcnkgT3B0aW9uczwvaDI+CisKKzxwPgorVGhlIGNvbmZpZ3VyZSBzY3JpcHQgcHJvdmlkZXMgbW9yZSBmaW5lIGdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBHTAorbGlicmFyaWVzIHRoYXQgd2lsbCBiZSBidWlsdC4gTW9yZSBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYyBHTCBsaWJyYXJpZXMKK2NhbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaW5zdGFsbC5odG1sIj5iYXNpYyBpbnN0YWxsYXRpb24KK2luc3RydWN0aW9uczwvYT4uCisKKzx1bD4KKzxhIG5hbWU9ImdsdSI+Cis8bGk+PGI+PGVtPkdMVTwvZW0+PC9iPiAtIFRoZSBsaWJHTFUgbGlicmFyeSB3aWxsIGJlIGJ1aWx0IGJ5IGRlZmF1bHQKK29uIGFsbCBkcml2ZXJzLiBUaGlzIGNhbiBiZSBkaXNhYmxlIHdpdGggdGhlIG9wdGlvbgorPGNvZGU+LS1kaXNhYmxlLWdsdTwvY29kZT4uCis8L2xpPgorCis8YSBuYW1lPSJnbHciPgorPGxpPjxiPjxlbT5HTHc8L2VtPjwvYj4gLSBUaGUgbGliR0x3IGxpYnJhcnkgd2lsbCBiZSBidWlsdCBieSBkZWZhdWx0CitpZiBsaWJHTFUgaGFzIGJlZW4gZW5hYmxlZC4gVGhpcyBjYW4gYmUgZGlzYWJsZSB3aXRoIHRoZSBvcHRpb24KKzxjb2RlPi0tZGlzYWJsZS1nbHc8L2NvZGU+LgorPC9saT4KKworPGEgbmFtZT0iZ2x1dCI+Cis8bGk+PGI+PGVtPkdMVVQ8L2VtPjwvYj4gLSBUaGUgbGliZ2x1dCBsaWJyYXJ5IHdpbGwgYmUgYnVpbHQgYnkgZGVmYXVsdAoraWYgbGliR0xVIGhhcyBiZWVuIGVuYWJsZWQgYW5kIHRoZSBnbHV0IHNvdXJjZSBjb2RlIGZyb20gdGhlIE1lc2FHTFVUCit0YXJiYWxsIGlzIGF2YWlsYWJsZS4gVGhpcyBjYW4gYmUgZGlzYWJsZSB3aXRoIHRoZSBvcHRpb24KKzxjb2RlPi0tZGlzYWJsZS1nbHV0PC9jb2RlPi4KKzwvbGk+Cis8L3VsPgorPC9wPgorCisKKzxhIG5hbWU9ImRlbW9zIj4KKzxoMj40LiBEZW1vIFByb2dyYW0gT3B0aW9uczwvaDI+CisKKzxwPgorVGhlcmUgYXJlIG1hbnkgZGVtb25zdHJhdGlvbiBwcm9ncmFtcyBpbiB0aGUgTWVzYURlbW9zIHRhcmJhbGwuIElmIHRoZQorcHJvZ3JhbXMgYXJlIGF2YWlsYWJsZSB3aGVuIDxjb2RlPi4vY29uZmlndXJlPC9jb2RlPiBpcyBydW4sIGEgc3Vic2V0IG9mCit0aGUgcHJvZ3JhbXMgd2lsbCBiZSBidWlsdCBkZXBlbmRpbmcgb24gdGhlIGRyaXZlciBhbmQgbGlicmFyeSBvcHRpb25zCitjaG9zZW4uIFNlZSB0aGUgZGlyZWN0b3J5IDxjb2RlPnByb2dzPC9jb2RlPiBmb3IgdGhlIGZ1bGwgc2V0IG9mIGRlbW9zLgorCis8dWw+Cis8bGk+PGNvZGU+LS13aXRoLWRlbW9zPURFTU9TLERFTU9TLC4uLjwvY29kZT4gLSBUaGlzIG9wdGlvbiBhbGxvd3MgYQorc3BlY2lmaWMgc2V0IG9mIGRlbW8gcHJvZ3JhbXMgdG8gYmUgYnVpbHQuIEZvciBleGFtcGxlLAorPGNvZGU+LS13aXRoLWRlbW9zPSJ4ZGVtb3Msc2xhbmciPC9jb2RlPi4gQmV3YXJlIHRoYXQgaWYgdGhpcyBvcHRpb24gaXMKK3VzZWQsIGl0IHdpbGwgbm90IGJlIGVuc3VyZWQgdGhhdCB0aGUgbmVjZXNzYXJ5IEdMIGxpYnJhcmllcyB3aWxsIGJlCithdmFpbGFibGUuCis8L2xpPgorPGxpPjxjb2RlPi0td2l0aG91dC1kZW1vczwvY29kZT4gLSBUaGlzIGNvbXBsZXRlbHkgZGlzYWJsZXMgYnVpbGRpbmcgdGhlCitkZW1vIHByb2dyYW1zLiBJdCBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPi0td2l0aC1kZW1vcz1ubzwvY29kZT4uCis8L2xpPgorPC91bD4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9idWdzLmh0bWwgYi9kb2NzL2J1Z3MuaHRtbAppbmRleCBkMjU1ZjQyLi40Mzk3MzM5IDEwMDY0NAotLS0gYS9kb2NzL2J1Z3MuaHRtbAorKysgYi9kb2NzL2J1Z3MuaHRtbApAQCAtOSw5ICs5LDkgQEAKIDxIMT5CdWcgRGF0YWJhc2U8L0gxPgogCiA8cD4KLVRoZSBNZXNhIGJ1ZyBkYXRhYmFzZSBpcyBub3cgaG9zdGVkIG9uCi08YSBocmVmPSJodHRwOi8vZnJlZWRlc2t0b3Aub3JnIiB0YXJnZXQ9Il9wYXJlbnQiPmZyZWVkZXNrdG9wLm9yZzwvYT4KLWluc3RlYWQgb2YgU291cmNlRm9yZ2UuCitUaGUgTWVzYSBidWcgZGF0YWJhc2UgaXMgaG9zdGVkIG9uCis8YSBocmVmPSJodHRwOi8vZnJlZWRlc2t0b3Aub3JnIiB0YXJnZXQ9Il9wYXJlbnQiPmZyZWVkZXNrdG9wLm9yZzwvYT4uCitUaGUgb2xkIGJ1ZyBkYXRhYmFzZSBvbiBTb3VyY2VGb3JnZSBpcyBubyBsb25nZXIgdXNlZC4KIDwvcD4KIAogPHA+CkBAIC0yNiwxNiArMjYsMjAgQEAKIDwvcD4KIAogPHVsPgotPGxpPk1ha2Ugc3VyZSB5b3UncmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgTWVzYQotPGxpPk1ha2Ugc3VyZSB5b3VyIGJ1ZyBpc24ndCBhbHJlYWR5IHJlcG9ydGVkCi08bGk+SW5jbHVkZSBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIHRoZSByZXBvcnQKKzxsaT5DaGVjayBpZiBhIG5ldyB2ZXJzaW9uIG9mIE1lc2EgaXMgYXZhaWxhYmxlIHdoaWNoIG1pZ2h0IGhhdmUgZml4ZWQKK3RoZSBwcm9ibGVtLgorPGxpPkNoZWNrIGlmIHlvdXIgYnVnIGlzIGFscmVhZHkgcmVwb3J0ZWQgaW4gdGhlIGRhdGFiYXNlLgorPGxpPk1vbml0b3IgeW91ciBidWcgcmVwb3J0IGZvciByZXF1ZXN0cyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgZXRjLgorPGxpPklmIHlvdSdyZSByZXBvcnRpbmcgYSBjcmFzaCwgdHJ5IHRvIHVzZSB5b3VyIGRlYnVnZ2VyIChnZGIpIHRvIGdldCBhIHN0YWNrCit0cmFjZS4gQWxzbywgcmVjb21waWxlIE1lc2EgaW4gZGVidWcgbW9kZSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKzxsaT5EZXNjcmliZSBpbiBkZXRhaWwgaG93IHRvIHJlcHJvZHVjZSB0aGUgYnVnLCBlc3BlY2lhbGx5IHdpdGggZ2FtZXMKK2FuZCBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgTWVzYSBkZXZlbG9wZXJzIG1pZ2h0IG5vdCBiZSBmYW1pbGlhciB3aXRoLgogPGxpPlByb3ZpZGUgYSBzaW1wbGUgR0xVVC1iYXNlZCB0ZXN0IHByb2dyYW0gaWYgcG9zc2libGUKLTxsaT5DaGVjayBiYWNrIGZvciBmb2xsb3ctdXBzIHRvIHRoZSByZXBvcnQKIDwvdWw+CiAKIDxwPgotQnVnIHJlcG9ydHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZvcndhcmRlZCB0byB0aGUgTWVzYSBkZXZlbG9wZXIncyBtYWlsaW5nCi1saXN0LgorQnVnIHJlcG9ydHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZvcndhcmRlZCBieSBidWd6aWxsYSB0byB0aGUgTWVzYQorZGV2ZWxvcGVyJ3MgbWFpbGluZyBsaXN0LgogPC9wPgogCiA8cD4KZGlmZiAtLWdpdCBhL2RvY3MvY2VsbC5odG1sIGIvZG9jcy9jZWxsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MTVkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvY2VsbC5odG1sCkBAIC0wLDAgKzEsMTA3IEBACis8SFRNTD4KKworPFRJVExFPkNlbGwgRHJpdmVyPC9USVRMRT4KKworPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ibWVzYS5jc3MiPjwvaGVhZD4KKworPEJPRFk+CisKKzxIMT5NZXNhIENlbGwgRHJpdmVyPC9IMT4KKworPHA+CitUaGUgTWVzYQorPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DZWxsXyUyOG1pY3JvcHJvY2Vzc29yJTI5IiB0YXJnZXQ9Il9wYXJlbnQiPkNlbGw8L2E+Citkcml2ZXIgaXMgcGFydCBvZiB0aGUgCis8YSBocmVmPSJodHRwOi8vd3d3LnR1bmdzdGVuZ3JhcGhpY3MuY29tL3dpa2kvaW5kZXgucGhwL0dhbGxpdW0zRCIgdGFyZ2V0PSJfcGFyZW50Ij5HYWxsaXVtM0Q8L2E+CithcmNoaXRlY3R1cmUuCis8L3A+CisKKzxwPgorPGEgaHJlZj0iaHR0cDovL3d3dy50dW5nc3RlbmdyYXBoaWNzLmNvbS8iIHRhcmdldD0iX3BhcmVudCI+VHVuZ3N0ZW4gR3JhcGhpY3M8L2E+CitpcyBsZWFkaW5nIHRoZSBwcm9qZWN0LgorVHdvIHBoYXNlcyBhcmUgcGxhbm5lZC4KK0ZpcnN0LCB0byBpbXBsZW1lbnQgdGhlIGZyYW1ld29yayBmb3IgcGFyYWxsZWwgcmFzdGVyaXphdGlvbiB1c2luZyB0aGUgQ2VsbAorU1BFcywgaW5jbHVkaW5nIHRleHR1cmUgbWFwcGluZy4KK1NlY29uZCwgdG8gaW1wbGVtZW50IGEgZnVsbC1mZWF0dXJlZCBPcGVuR0wgZHJpdmVyIHdpdGggc3VwcG9ydCBmb3IgR0xTTCwgZXRjLgorPC9wPgorCisKKzxIMj5Tb3VyY2UgQ29kZTwvSDI+CisKKzxwPgorVGhlIENlbGwgZHJpdmVyIHNvdXJjZSBjb2RlIGlzIG9uIHRoZSA8Y29kZT5nYWxsaXVtLTAuMTwvY29kZT4gYnJhbmNoIG9mIHRoZQorZ2l0IHJlcG9zaXRvcnkuCitBZnRlciB5b3UndmUgY2xvbmVkIHRoZSByZXBvc2l0b3J5LCBjaGVjayBvdXQgdGhlIGJyYW5jaCB3aXRoOgorPC9wPgorPHByZT4KKyAgIGdpdC1jaGVja291dCAtYiBnYWxsaXVtLTAuMSBvcmlnaW4vZ2FsbGl1bS0wLjEKKzwvcHJlPgorPHA+CitUbyBidWlsZCB0aGUgZHJpdmVyIHlvdSdsbCBuZWVkIHRoZSBJQk0gQ2VsbCBTREsgKHZlcnNpb24gMi4xIG9yIDMuMCkuCitUbyB1c2UgdGhlIGRyaXZlciB5b3UnbGwgbmVlZCBhIENlbGwgc3lzdGVtLCBzdWNoIGFzIGEgUFMzIHJ1bm5pbmcgTGludXgsCitvciB0aGUgQ2VsbCBTaW11bGF0b3IgKHVudGVzdGVkLCB0aG91Z2gpLgorPC9wPgorCis8cD4KK0lmIHVzaW5nIENlbGwgU0RLIDMuMCwgZmlyc3QgZWRpdCBjb25maWdzL2xpbnV4LWNlbGwgYW5kIGFkZAorPGNvZGU+LURTUFVfTUFJTl9QQVJBTV9MT05HX0xPTkc8L2NvZGU+IHRvIHRoZSBTUFVfQ0ZMQUdTLgorPC9wPgorCis8cD4KK1RvIGNvbXBpbGUgdGhlIGNvZGUsIHJ1biA8Y29kZT5tYWtlIGxpbnV4LWNlbGw8L2NvZGU+LgorPC9wPgorCis8cD4KK1RvIHVzZSB0aGUgbGlicmFyeSwgbWFrZSBzdXJlIDxjb2RlPkxEX0xJQlJBUllfUEFUSDwvY29kZT4gcG9pbnRzIHRoZSBNZXNhL2xpYi8KK2RpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIDxjb2RlPmxpYkdMLnNvPC9jb2RlPi4KKzwvcD4KKworPHA+CitWZXJpZnkgdGhhdCB0aGUgQ2VsbCBkcml2ZXIgaXMgYmVpbmcgdXNlZCBieSBydW5uaW5nIDxjb2RlPmdseGluZm88L2NvZGU+CithbmQgbG9va2luZyBmb3I6Cis8cHJlPgorICBPcGVuR0wgcmVuZGVyZXIgc3RyaW5nOiBHYWxsaXVtIDAuMSwgQ2VsbCBvbiBYbGliCis8L3ByZT4KKworCis8SDI+RHJpdmVyIEltcGxlbWVudGF0aW9uIFN1bW1hcnk8L0gyPgorCis8cD4KK1Jhc3Rlcml6YXRpb24gaXMgcGFyYWxsZWxpemVkIGFjcm9zcyB0aGUgU1BVcyBpbiBhIHRpbGVkLWJhc2VkIG1hbm5lci4KK0JhdGNoZXMgb2YgdHJhbnNmb3JtZWQgdHJpYW5nbGVzIGFyZSBzZW50IHRvIHRoZSBTUFVzIChhY3R1YWxseSwgcHVsbGVkIGJ5IGZyb20KK21haW4gbWVtb3J5IGJ5IHRoZSBTUFVzKS4KK0VhY2ggU1BVIGxvb3BzIG92ZXIgYSBzZXQgb2YgMzJ4MzItcGl4ZWwgc2NyZWVuIHRpbGVzLCByZW5kZXJpbmcgdGhlIHRyaWFuZ2xlcworaW50byBlYWNoIHRpbGUuCitCZWNhdXNlIG9mIHRoZSBsaW1pdGVkIFNQVSBtZW1vcnksIGZyYW1lYnVmZmVyIHRpbGVzIGFyZSBwYWdlZCBpbi9vdXQgb2YKK1NQVSBsb2NhbCBzdG9yZSBhcyBuZWVkZWQuCitTaW1pbGFybHksIHRleHR1cmVzIGFyZSB0aWxlZCBhbmQgYnJvdWdodCBpbnRvIGxvY2FsIHN0b3JlIGFzIG5lZWRlZC4KKzwvcD4KKworPHA+CitNb3JlIHJlY2VudGx5LCB2ZXJ0ZXggdHJhbnNmb3JtYXRpb24gaGFzIGJlZW4gcGFyYWxsZWxpemVkIGFjcm9zcyB0aGUgU1BVcworYXMgd2VsbC4KKzwvcD4KKworCis8SDI+U3RhdHVzPC9IMj4KKworPHA+CitBcyBvZiBGZWJydWFyeSAyMDA4IHRoZSBkcml2ZXIgc3VwcG9ydHMgc21vb3RoL2ZsYXQgc2hhZGVkIHRyaWFuZ2xlIHJlbmRlcmluZword2l0aCBaIHRlc3RpbmcgYW5kIHNpbXBsZSB0ZXh0dXJlIG1hcHBpbmcuCitTaW1wbGUgZGVtb3MgbGlrZSBnZWFycyBydW4gc3VjY2Vzc2Z1bGx5LgorVG8gdGVzdCB0ZXh0dXJlIG1hcHBpbmcsIHRyeSBwcm9ncy9kZW1vcy90ZXhjeWwgKHByZXNzIHJpZ2h0IG1vdXNlIGJ1dHRvbiBmb3IKK3JlbmRlcmluZyBvcHRpb25zKS4KKzwvcD4KKworCis8SDI+Q29udHJpYnV0aW5nPC9IMj4KKworPHA+CitJZiB5b3UncmUgaW50ZXJlc3RlZCBpbiBjb250cmlidXRpbmcgdG8gdGhlIGVmZm9ydCwgZmFtaWxpYXJpemUgeW91cnNlbGYKK3dpdGggdGhlIGNvZGUsIGpvaW4gdGhlIDxhIGhyZWY9Imxpc3RzLmh0bWwiPm1lc2EzZC1kZXYgbWFpbGluZyBsaXN0PC9hPiwKK2FuZCBkZXNjcmliZSB3aGF0IHlvdSdkIGxpa2UgdG8gZG8uCis8L3A+CisKKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9jb250ZW50cy5odG1sIGIvZG9jcy9jb250ZW50cy5odG1sCmluZGV4IGEyMTM0MWEuLjNmZWI4Y2EgMTAwNjQ0Ci0tLSBhL2RvY3MvY29udGVudHMuaHRtbAorKysgYi9kb2NzL2NvbnRlbnRzLmh0bWwKQEAgLTc1LDYgKzc1LDcgQEAKIDxsaT48YSBocmVmPSJzdWJzZXQuaHRtbCIgdGFyZ2V0PSJNYWluRnJhbWUiPk1lc2EgU3Vic2V0IERyaXZlcjwvYT4KIDxsaT48YSBocmVmPSJnbGZiZGV2LWRyaXZlci5odG1sIiB0YXJnZXQ9Ik1haW5GcmFtZSI+Z2xGQkRldiBEcml2ZXI8L2E+CiA8TEk+PEEgSFJFRj0iZGlzcGF0Y2guaHRtbCIgdGFyZ2V0PSJNYWluRnJhbWUiPkdMIERpc3BhdGNoPC9BPgorPGxpPjxhIGhyZWY9ImNlbGwuaHRtbCIgdGFyZ2V0PSJNYWluRnJhbWUiPkNlbGwgRHJpdmVyPC9BPgogPC91bD4KIAogPGI+TGlua3M8L2I+CmRpZmYgLS1naXQgYS9kb2NzL2RldmluZm8uaHRtbCBiL2RvY3MvZGV2aW5mby5odG1sCmluZGV4IGNjZTE0ZDcuLjNjZWJmNWYgMTAwNjQ0Ci0tLSBhL2RvY3MvZGV2aW5mby5odG1sCisrKyBiL2RvY3MvZGV2aW5mby5odG1sCkBAIC0xMzUsMTIgKzEzNSwxMiBAQAogPC9wPgogCiA8cD4KLUVkaXQgY29uZmlncy9kZWZhdWx0IGFuZCBjaGFuZ2UgdGhlIE1FU0FfTUFKT1IsIE1FU0FfTUlOT1IgYW5kIE1FU0FfVElOWQotdmVyc2lvbiBudW1iZXJzLgorRWRpdCB0aGUgTUVTQV9NQUpPUiwgTUVTQV9NSU5PUiBhbmQgTUVTQV9USU5ZIHZlcnNpb24gbnVtYmVycyBpbgorY29uZmlncy9kZWZhdWx0LgogPC9wPgogCiA8cD4KLU1ha2Ugc3VyZSB0aGUgdmFsdWVzIGluIHNyYy9tZXNhL21haW4vdmVyc2lvbi5oIGlzIGNvcnJlY3QuCitNYWtlIHN1cmUgdGhlIHZhbHVlcyBpbiBzcmMvbWVzYS9tYWluL3ZlcnNpb24uaCBhcmUgY29ycmVjdC4KIDwvcD4KIAogPHA+CmRpZmYgLS1naXQgYS9kb2NzL2Rvd25sb2FkLmh0bWwgYi9kb2NzL2Rvd25sb2FkLmh0bWwKaW5kZXggOTBmNTY2My4uNGE5ODA0OSAxMDA2NDQKLS0tIGEvZG9jcy9kb3dubG9hZC5odG1sCisrKyBiL2RvY3MvZG93bmxvYWQuaHRtbApAQCAtOSw3ICs5LDcgQEAKIDxIMT5Eb3dubG9hZGluZzwvSDE+CiAKIDxwPgotTGFzdCBzdGFibGUgcmVsZWFzZTogPGI+Ny4wPC9iPgorTGFzdCBzdGFibGUgcmVsZWFzZTogPGI+Ny4wLjQ8L2I+CiA8L3A+CiAKIDxwPgpAQCAtMTgsNiArMTgsMTEgQEAKIHRhcmdldD0iX3BhcmVudCI+U291cmNlRm9yZ2U8L2E+CiA8L3A+CiAKKzxwPgorV2hlbiBhIG5ldyByZWxlYXNlIGlzIGNvbWluZywgcmVsZWFzZSBjYW5kaWRhdGVzIChiZXRhcykgY2FuIGJlIGZvdW5kCis8YSBocmVmPSJodHRwOi8vd3d3Lm1lc2EzZC5vcmcvYmV0YS8iPmhlcmU8L2E+LgorPC9wPgorCiAKIDxwPgogTWVzYSBpcyBkaXN0cmlidXRlZCBpbiBzZXZlcmFsIHBhcnRzOgpkaWZmIC0tZ2l0IGEvZG9jcy9mYXEuaHRtbCBiL2RvY3MvZmFxLmh0bWwKaW5kZXggODk0OTZjOC4uMTFiNWQ0MyAxMDA2NDQKLS0tIGEvZG9jcy9mYXEuaHRtbAorKysgYi9kb2NzL2ZhcS5odG1sCkBAIC0xODcsMjQgKzE4Nyw3IEBACiA8L2E+PC9wPgogCiAKLTxoMj48YSBuYW1lPSJwYXJ0MiI+Mi4yIFJ1bm5pbmcgPGNvZGU+Y29uZmlndXJlOyBtYWtlPC9jb2RlPiBkb2Vzbid0IFdvcms8L2E+PC9oMj4KLTxwPgotTWVzYSBubyBsb25nZXIgc3VwcG9ydHMgR05VIGF1dG9jb25mL2F1dG9tYWtlLiAgV2h5PwotPHVsPgotPGxpPkl0IHNlZW1lZCB0byBzZWxkb20gd29yayBvbiBhbnl0aGluZyBidXQgTGludXgKLTxsaT5UaGUgY29uZmlnIGZpbGVzIHdlcmUgaGFyZCB0byBtYWludGFpbiBhbmQgaGFyZCB0byB1bmRlcnN0YW5kCi08bGk+bGlidG9vbCBjYXVzZWQgYSBsb3Qgb2YgZ3JpZWYKLTwvdWw+Ci0KLTxwPgotTm93IE1lc2EgYWdhaW4gdXNlcyBhIGNvbnZlbnRpb25hbCBNYWtlZmlsZSBzeXN0ZW0gKGFzIGl0IGRpZCBvcmlnaW5hbGx5KS4KLUJhc2ljYWxseSwgZWFjaCBNYWtlZmlsZSBpbiB0aGUgdHJlZSBpbmNsdWRlcyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLWZpbGVzIGZyb20gdGhlIGNvbmZpZy8gZGlyZWN0b3J5LgotVGhlIGNvbmZpZyBmaWxlcyBzcGVjaWZ5IGFsbCB0aGUgdmFyaWFibGVzIGZvciBhIHZhcmlldHkgb2YgcG9wdWxhciBzeXN0ZW1zLgotPC9wPgotCi0KLTxoMj48YSBuYW1lPSJwYXJ0MiI+Mi4zIEkgZ2V0IHVuZGVmaW5lZCBzeW1ib2xzIHN1Y2ggYXMgYmducG9seWdvbiwgdjNmLCBldGMuLi48L2E+PC9oMj4KKzxoMj48YSBuYW1lPSJwYXJ0MiI+Mi4yIEkgZ2V0IHVuZGVmaW5lZCBzeW1ib2xzIHN1Y2ggYXMgYmducG9seWdvbiwgdjNmLCBldGMuLi48L2E+PC9oMj4KIDxwPgogPGEgbmFtZT0icGFydDIiPllvdSdyZSBhcHBsaWNhdGlvbiBpcyB3cml0dGVuIGluIElSSVMgR0wsIG5vdCBPcGVuR0wuCiBJUklTIEdMIHdhcyB0aGUgcHJlZGVjZXNzb3IgdG8gT3BlbkdMIGFuZCBpcyBhIGRpZmZlcmVudCB0aGluZyAoYWxtb3N0KQpAQCAtMjEzLDcgKzE5Niw3IEBACiA8L2E+PC9wPgogCiAKLTxoMj48YSBuYW1lPSJwYXJ0MiI+Mi40IFdoZXJlIGlzIHRoZSBHTFVUIGxpYnJhcnk/PC9hPjwvaDI+Cis8aDI+PGEgbmFtZT0icGFydDIiPjIuMyBXaGVyZSBpcyB0aGUgR0xVVCBsaWJyYXJ5PzwvYT48L2gyPgogPHA+CiA8YSBuYW1lPSJwYXJ0MiI+R0xVVCAoT3BlbkdMIFV0aWxpdHkgVG9vbGtpdCkgaXMgaW4gdGhlIHNlcGFyYXRlIE1lc2FHTFVULXgueS56LnRhci5neiBmaWxlLgogSWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSBHTFVUIGluc3RhbGxlZCwgeW91IHNob3VsZCBncmFiIHRoZSBNZXNhR0xVVApAQCAtMjIyLDcgKzIwNSw3IEBACiAKIAogCi08aDI+PGEgbmFtZT0icGFydDIiPjIuNSBXaGF0J3MgdGhlIHByb3BlciBwbGFjZSBmb3IgdGhlIGxpYnJhcmllcyBhbmQgaGVhZGVycz88L2E+PC9oMj4KKzxoMj48YSBuYW1lPSJwYXJ0MiI+Mi40IFdoYXQncyB0aGUgcHJvcGVyIHBsYWNlIGZvciB0aGUgbGlicmFyaWVzIGFuZCBoZWFkZXJzPzwvYT48L2gyPgogPHA+CiA8YSBuYW1lPSJwYXJ0MiI+T24gTGludXgtYmFzZWQgc3lzdGVtcyB5b3UnbGwgd2FudCB0byBmb2xsb3cgdGhlCiA8L2E+PGEgaHJlZj0iaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL29nbC1zYW1wbGUvQUJJL2luZGV4Lmh0bWwiCkBAIC0zNDIsMTIgKzMyNSwxMiBAQAogCiA8aDI+NC4xIEhvdyBjYW4gSSBjb250cmlidXRlPzwvYT48L2gyPgogPHA+Ci1GaXJzdCwgam9pbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXNhM2Qub3JnL2xpc3RzLmh0bWw+TWVzYTNkLWRldgorRmlyc3QsIGpvaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cubWVzYTNkLm9yZy9saXN0cy5odG1sIj5NZXNhM2QtZGV2CiBtYWlsaW5nIGxpc3Q8L2E+LgogVGhhdCdzIHdoZXJlIE1lc2EgZGV2ZWxvcG1lbnQgaXMgZGlzY3Vzc2VkLgotPC9hPjwvcD4KKzwvcD4KIDxwPgotVGhlIDwvYT48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5nbC5vcmcvZG9jdW1lbnRhdGlvbiIgdGFyZ2V0PSJfcGFyZW50Ij4KK1RoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5nbC5vcmcvZG9jdW1lbnRhdGlvbiIgdGFyZ2V0PSJfcGFyZW50Ij4KIE9wZW5HTCBTcGVjaWZpY2F0aW9uPC9hPiBpcyB0aGUgYmlibGUgZm9yIE9wZW5HTCBpbXBsZW1lbnRpb24gd29yay4KIFlvdSBzaG91bGQgcmVhZCBpdC4KIDwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvZmJkZXYtZHJpLmh0bWwgYi9kb2NzL2ZiZGV2LWRyaS5odG1sCmluZGV4IGM3ZjU5YmIuLmU5NDFiMTYgMTAwNjQ0Ci0tLSBhL2RvY3MvZmJkZXYtZHJpLmh0bWwKKysrIGIvZG9jcy9mYmRldi1kcmkuaHRtbApAQCAtMSwxNSArMSwxNSBAQAotPGh0bWw+Cis8aHRtbD48aGVhZD48dGl0bGU+TWVzYSBmYmRldi9EUkkgRW52aXJvbm1lbnQ8L3RpdGxlPgogCi08VElUTEU+TWVzYSBmYmRldi9EUkkgRW52aXJvbm1lbnQ8L1RJVExFPgorCiAKIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1lc2EuY3NzIj48L2hlYWQ+CiAKLTxCT0RZPgorPGJvZHk+CiAKLTxjZW50ZXI+PEgxPk1lc2EgZmJkZXYvRFJJIERyaXZlcnM8L0gxPjwvY2VudGVyPgorPGNlbnRlcj48aDE+TWVzYSBmYmRldi9EUkkgRHJpdmVyczwvaDE+PC9jZW50ZXI+Cis8YnI+CiAKLQotPEgxPjEuIEludHJvZHVjdGlvbjwvSDE+Cis8aDE+MS4gSW50cm9kdWN0aW9uPC9oMT4KIAogPHA+CiBUaGUgZmJkZXYvRFJJIGVudmlyb25tZW50IHN1cHBvcnRzIGhhcmR3YXJlLWFjY2VsZXJhdGVkIDNEIHJlbmRlcmluZyB3aXRob3V0CkBAIC0yMiw0OCArMjIsMTMxIEBACiAKIDxwPgogQXBwbGljYXRpb25zIGluIHRoZSBmYmRldi9EUkkgZW52aXJvbm1lbnQgdXNlCi10aGUgPGEgaHJlZj0iTWluaUdYTC5odG1sIj4gTWluaUdMWDwvYT4gaW50ZXJmYWNlIHRvIGNob29zZSBwaXhlbAordGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cubmFiYmxlLmNvbS9maWxlL3AxNTQ4MDY2Ni9NaW5pR1hMLmh0bWwiPiBNaW5pR0xYPC9hPiBpbnRlcmZhY2UgdG8gY2hvb3NlIHBpeGVsCiBmb3JtYXRzLCBjcmVhdGUgcmVuZGVyaW5nIGNvbnRleHRzLCBldGMuICBJdCdzIGEgc3Vic2V0IG9mIHRoZSBHTFggYW5kCiBYbGliIGludGVyZmFjZXMgYWxsb3dpbmcgc29tZSBkZWdyZWUgb2YgYXBwbGljYXRpb24gcG9ydGFiaWxpdHkgYmV0d2VlbgogdGhlIFggYW5kIFgtbGVzcyBlbnZpcm9ubWVudHMuCiA8L3A+CiAKKzxwPgorTm90ZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgaXMgbm90IHdlbGwtc3VwcG9ydGVkIGFuZCB0aGVzZSBpbnN0cnVjdGlvbnMKK21heSBub3QgYmUgY29tcGxldGVseSB1cCB0byBkYXRlLgorPC9wPgorPGJyPgorCisKIAogPGgxPjIuIENvbXBpbGF0aW9uPC9oMT4KLQogPHA+Ci1Zb3UnbGwgbmVlZCB0aGUgRFJNIGFuZCBwY2lhY2Nlc3MgbGlicmFyaWVzLiAgQ2hlY2sgd2l0aDoKKworPGgyPjIuMSBnbHhwcm90bzwvaDI+CisKK0dldCA8YSBocmVmPSJodHRwOi8vY3Zzd2ViLnhmcmVlODYub3JnL2N2c3dlYi8qY2hlY2tvdXQqL3hjL2luY2x1ZGUvR0wvZ2x4cHJvdG8uaD9yZXY9MS45Ij5nbHhwcm90by5oPC9hPi4gQ29weSBpdCB0byB0aGUgL21lc2EvaW5jbHVkZS9HTC8gZGlyZWN0b3J5LgogPC9wPgotPHByZT4KLSAgIHBrZy1jb25maWcgLS1tb2R2ZXJzaW9uIGxpYmRybQotICAgcGtnLWNvbmZpZyAtLW1vZHZlcnNpb24gcGNpYWNjZXNzCisKKzxoMj4yLjIgbGlicGNpYWNjZXNzPC9oMj4KKzxwPgorQ2hlY2sgaWYgeW91IGhhdmUgbGlicGNpYWNjZXNzIGluc3RhbGxlZDoKKzwvcD4KKworPHByZT5wa2ctY29uZmlnIC0tbW9kdmVyc2lvbiBwY2lhY2Nlc3MKKzwvcHJlPgorPHA+CitJZiBub3QgeW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IGNvZGUgZnJvbToKKzwvcD4KKzxwcmU+ICAgZ2l0IGNsb25lIGdpdDovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC94b3JnL2xpYi9saWJwY2lhY2Nlc3MKKzwvcHJlPgorPHA+CitSdW4gYXV0b2dlbi5zaCB0byBnZW5lcmF0ZSBhIGNvbmZpZ3VyZSBmaWxlLiBhdXRvZ2VuLnNoIHVzZXMgYXV0b2NvbmYKK3V0aWxpdHkuIFRoaXMgdXRpbGl0eSBtYXkgbm90IGJlIGluc3RhbGxlZCB3aXRoIHlvdXIgbGludXggZGlzdHJvLAorY2hlY2sgaWYgaXQgaXMgYXZhaWxhYmxlLiBpZiBub3QgeW91IGNhbiB1c2UgeW91ciBwYWNrYWdlIG1hbmFnZXIgb3IKK3R5cGU6Cis8L3A+Cis8cHJlPnN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9jb25mCis8L3ByZT4KK1RoZSBuZXh0IHN0ZXAgaXMgdG8gaW5zdGFsbCB0aGUgbGlicGNpYWNjZXNzIGxpYnJhcnkuIAorPHByZT5tYWtlCittYWtlIGluc3RhbGwKKzwvcHJlPgorPHA+IE5vdyB5b3VyIGxpYnBjaWFjY2Vzcy5hIGZpbGUgaXMgc2F2ZWQgaW50byAvdXNyL2xvY2FsL2xpYgorZGlyZWN0b3J5LiBJZiB5b3UgaGF2ZSBhIGxpYnBjaWFjY2Vzcy5hIGluIC91c3IvbGliIHlvdSBtYXkgc2ltcGx5IGNvcHkKK2FuZCBvdmVyd3JpdGUgdGhlc2UgZmlsZXMuIERvbid0IGZvcmdldCB0byBjb3B5IGxpYnBjaWFjY2Vzcy5wYyBmaWxlIHRvCisvdXNyL2xpYi9wa2djb25maWcsIHdoaWNoIGlzIGFsc28gbG9jYXRlZCBpbiAvdXNyL2xvY2FsL2xpYi9wa2djb25maWcvLgorT3IgeW91IG1heSB1c2UgdGhlIGZvbGxvd2luZyBzeXN0ZW0gdmFyaWFibGVzOgorPC9wPgorPHByZT5leHBvcnQgTERfTElCUkFSWV9QQVRIPS91c3IvbG9jYWwvbGliCitleHBvcnQgUEtHX0NPTkZJR19QQVRIPS91c3IvbG9jYWwvbGliL3BrZ2NvbmZpZwogPC9wcmU+CiAKLTxwPgotWW91IGNhbiBnZXQgdGhlbSBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSB3aXRoOgorPGgyPjIuMyBkcm08L2gyPgorCis8cD5UaGUgbmV4dCBzdGVwIGlzIHRvIGNvbXBpbGUgdGhlIGRybS4gRFJNIGNvbnNpc3RzIG9mIHR3byBzZXBlcmF0ZSBwYXJ0cywKK3RoZSBEUk0gY2xpZW50IGxpYnJhcnkobGluZHJtLnNvKSBhbmQga2VybmVsIGRldmljZSBtb2R1bGUoc3VjaCBhcworcmFkZW9uLmtvKS4gV2UgbmVlZCB0byBtYWtlIGEgc21hbGwgY2hhbmdlIGluIGtlcm5lbCBkZXZpY2UgbW9kdWxlLiBTbworeW91IG5lZWQgdG8gZG93bmxvYWQgdGhlIGtlcm5lbCBzb3VyY2UuIFlvdSBtYXkgY2hvb3NlIHRoZSBuZWFyZXN0CittaXJyb3IgZnJvbSB3d3cua2VybmVsLm9yZywgb3IgeW91IGFyZSB1c2luZyBGZWRvcmEgQ29yZSA1LCBmb3IKK2V4YW1wbGUsIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIFJQTXMgc3VjaCBhczoKK2tlcm5lbC1zbXAtZGV2ZWwtMi4xNi4xNS0xLjIwNTRfRkM1Lmk2ODYucnBtCitrZXJuZWwtZGV2ZWwtMi42LjE1LTEuMjA1NF9GQzUuaTY4Ni5ycG0KK2V0Yy4gWW91IGNhbiBmaW5kIGEgZGV0YWlsZWQgaW5mb3JtYXRpb24gPGEgaHJlZj0iaHR0cDovL3d3dy5ob3d0b2ZvcmdlLmNvbS9rZXJuZWxfY29tcGlsYXRpb25fZmVkb3JhIj5oZXJlLjwvYT4KIDwvcD4KKworPHA+WW91IHdpbGwgZmluZCBkcm1fZHJ2LmMgYXQgL3Vzci9zcmMvTElOVVgtVkVSU0lPTi9kcml2ZXJzL2NoYXIvZHJtLy4gRWRpdCB0aGlzIGNvZGUgYW5kIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgcGFydDoKKzwvcD4KKwogPHByZT4KLSAgIGdpdCBjbG9uZSBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9naXQvbWVzYS9kcm0KLSAgIGdpdCBjbG9uZSBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9naXQveG9yZy9saWIvbGlicGNpYWNjZXNzCisgICAvKiB8fAorICAgKChpb2N0bC0mZ3Q7ZmxhZ3MgJmFtcDsgRFJNX01BU1RFUikgJmFtcDsmYW1wOyAhcHJpdi0mZ3Q7bWFzdGVyKSovCiA8L3ByZT4KLQotPHA+Ci1TZWUgdGhlIFJFQURNRSBmaWxlcyBpbiB0aG9zZSBwcm9qZWN0cyBmb3IgYnVpbGQvaW5zdGFsbCBpbnN0cnVjdGlvbnMuCi08L3A+Ci0KLQotPHA+CitOb3cgeW91IGFyZSByZWFkeSB0byBjb21waWxlIHlvdXIga2VybmVsLiBJZiB5b3VyIGtlcm5lbCB2ZXJzaW9uIGlzCitpZGVudGljYWwgdG8gdGhlIHZlcnNpb24geW91IGhhdmUgY29tcGlsZWQsIHlvdSBjYW4gc2ltcGx5IG92ZXIgd3JpdGUKK3lvdXIgbmV3ICJrbyIgZmlsZXMgb3ZlciBvbGRlciBvbmVzLiBJZiB5b3UgaGF2ZSBjb21waWxlZCBhIGRpZmZlcmVudAora2VybmVsLCB5b3UgbXVzdCBjb25maWd1cmUgeW91ciBncnViIG9yIGxpbG8gdG8gYmUgYWJsZSB0byBib290IHlvdXIKK25ldyBrZXJuZWwuIDxwPgogWW91J2xsIG5lZWQgZmJkZXYgaGVhZGVyIGZpbGVzLiAgQ2hlY2sgd2l0aDoKIDwvcD4KIDxwcmU+Ci0gICBscyAtbCAvdXNyL2luY2x1ZGUvbGludXgvZmIuaAorICAgbHMgLWwgL3Vzci9pbmNsdWRlL2xpbnV4L2ZiLgogPC9wcmU+Cis8cD5UaGlzIGZpbGUgbWF5IGJlIG1pc3NpbmcgaWYgeW91IGhhdmUgbm90IGluc3RhbGxlZCBsaW51eCBoZWFkZXIgZmlsZXMuCiAKLTxwPgotQ29tcGlsZSBNZXNhIHdpdGggdGhlICdsaW51eC1zb2xvJyBjb25maWd1cmF0aW9uOgorCis8aDI+Mi40IE1lc2E8L2gyPgorCis8L3A+PHA+R2V0IGxhdGVzdCBkZXZlbG9wbWVudCBNZXNhIHNvdXJjZXMgZnJvbSBnaXQgcmVwb3NpdG9yeQorKGN1cnJlbnRseSA3LjEtcHJlcmVsZWFzZSkKIDwvcD4KIDxwcmU+Ci0gICBtYWtlIGxpbnV4LXNvbG8KKyAgIGdpdCBjbG9uZSBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9naXQvbWVzYS9tZXNhCis8L3ByZT4KKworPHA+WW91IHdpbGwgbmVlZCB0aGUgbWFrZWRlcGVuZCB1dGlsaXR5IHdoaWNoIGlzIGEgcGFydCBvZiBtZXNhIHByb2plY3QKK3RvIGJ1aWxkIHlvdXIgbGludXgtc29sby4gWW91IHByb2JhYmx5IHdvbnQgaGF2ZSB0aGlzIHV0aWxpdHkuIFlvdSBjYW4KK2Rvd25sb2FkIGl0cyBzb3VyY2UgZnJvbSBmb2xsb3dpbmcgZ2l0IHJlcHVsc2l0b3J5OgorPC9wPgorPHByZT4KKyAgIGdpdCBjbG9uZSBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9naXQveG9yZy91dGlsL21ha2VkZXBlbmQKKzwvcHJlPgorCis8cD5HZXQgdGhlIGxhdGVzdCBzdGFibGUgbWVzYSB2ZXJzaW9uIGZyb20gU291cmNlRm9yZ2UgKGN1cnJlbnRseSA3LjAuMykKKzxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTMiPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTM8L2E+Cis8L3A+CisKKzxwPkNvcHkgdGhlIG1pbmlnbHggZm9sZGVyIGZyb20gNy4xLXByZXJlbGVhc2UgdG8gNy4wLjMuCitZb3UgbWF5IGFsc28gZXh0cmFjdCBHTFVUIHRvIDcuMC4zIHZlcnNpb24gYXQgdGhpcyBzdGVwLiAKKzwvcD4KKworPHA+RWRpdCBsaW51eC1zb2xvLmNvbmYgYXQgL2NvbmYgZGlyZWN0b3J5LCBqdXN0IG9ubHkgY29tcGlsZSB0aGUKK2dyYXBoaWNzIGRyaXZlciB5b3UgbmVlZCwgZGVsZXRlIHRoZSB1bndhbnRlZCBkcml2ZXJzIG5hbWVzIGZyb20gdGhlCitsaXN0KHNvbWUgZHJpdmVycyBhcmUgY2F1c2luZyBwcm9ibGVtcy4uLikKKzwvcD4KKzxwcmU+CisgICB3aGlsZShidWlsZD09MCkKKyAgIHsKKyAgICAgbWFrZSBsaW51eC1zb2xvCisKKyAgICAgVGhlcmUgd2lsbCBiZSBzb21lIG1pc3NpbmcgaGVhZGVyIGZpbGVzLCBjb3B5IHRoZW0gZnJvbSA3LjEtcHJlcmVsZWFzZQorICAgfQogPC9wcmU+CiAKIDxwPgpAQCAtNzEsMjIgKzE1NCw0MCBAQAogPC9wPgogPHVsPgogPGxpPmxpYi9saWJHTC5zbyAtIHRoZSBHTCBsaWJyYXJ5IHdoaWNoIGFwcGxpY2F0aW9ucyBsaW5rIHdpdGgKLTxsaT5saWIvKl9kcmlfc28gLSBEUkkgZHJpdmVycwotPGxpPmxpYi9taW5pZ2x4LmNvbmYgLSBzYW1wbGUgTWluaUdMWCBjb25maWcgZmlsZQotPGxpPnByb2dzL21pbmlnbHgvKiAtIHNldmVyYWwgTWluaUdMWCBzYW1wbGUgcHJvZ3JhbXMKLTwvdWw+Cis8L2xpPjxsaT5saWIvKl9kcmlfc28gLSBEUkkgZHJpdmVycworPC9saT48bGk+bGliL21pbmlnbHguY29uZiAtIHNhbXBsZSBNaW5pR0xYIGNvbmZpZyBmaWxlCis8L2xpPjxsaT5wcm9ncy9taW5pZ2x4LyogLSBzZXZlcmFsIE1pbmlHTFggc2FtcGxlIHByb2dyYW1zCis8L2xpPjwvdWw+CiAKK1RvIGluc3RhbGwgdGhlc2UgZmlsZXMgaW50byBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgaW4gc3lzdGVtOgorPHByZT4KKyAgIG1ha2UgaW5zdGFsbAorPC9wcmU+CisKK05vdyB5b3VyIG9wZW5HTCBsaWJyYXJpZXMgYXJlIGNvcGllZCB0byAvdXNyL2xvY2FsL2xpYiBhbmQKK21pbmlnbHguY29uZiBpcyBjb3BpZWQgdG8gL2V0Yy4gWW91IG1heSBjb3B5IHRoZW0gdG8gL3Vzci9saWIgYW5kCitvdmVyd3JpdGUgeW91ciBvbGQgR0wgbGlicmFyaWVzLiBPciB5b3UgbWF5IGV4cG9ydCBmb2xsb3dpbmcgdmFyaWFibGU6CisKKzxwcmU+CisgICBleHBvcnQgTElCR0xfRFJJVkVSU19QQVRIPS91c3IvbG9jYWwvbGliCis8L3ByZT4KKzxicj4KIAogCiA8aDE+My4gVXNpbmcgZmJkZXYvRFJJPC9oMT4KIAogPHA+CiBJZiBhbiBYIHNlcnZlciBjdXJyZW50bHkgcnVubmluZywgZXhpdC9zdG9wIGl0IHNvIHlvdSdyZSB3b3JraW5nIGZyb20KLXRoZSBjb25zb2xlLgordGhlIGNvbnNvbGUuIEZvbGxvd2luZyBjb21tYW5kIHNodXRzIGRvd24gdGhlIHggd2luZG93IGFuZCBhbHNvIHRoZSBtdWx0aSB1c2VyIHN1cHBvcnQuCiA8L3A+Cis8cHJlPgorICAgaW5pdCAxCis8L3ByZT4KIAotCi08aDI+My4xIExvYWQgS2VybmVsIE1vZHVsZXM8L2gyPgorPHA+QWxzbyB5b3UgbWF5IGRlZmluZSB0aGUgcnVubGV2ZWwgYXMgMSBpbiAiL2V0Yy9pbml0dGFiIi4gWW91ciBzeXN0ZW0KK3dpbGwgYWx3YXlzIHN0YXJ0IGluIHNpbmdsZSB1c2VyIG1vZGUgYW5kIHdpdGhvdXQgeC13aW5kb3cgd2l0aCB0aGlzCitvcHRpb24gc2V0LgorPC9wPjxoMj4zLjEgTG9hZCBLZXJuZWwgTW9kdWxlczwvaDI+CiAKIDxwPgogWW91J2xsIG5lZWQgdG8gbG9hZCB0aGUga2VybmVsIG1vZHVsZXMgc3BlY2lmaWMgdG8geW91ciBncmFwaGljcyBoYXJkd2FyZS4KQEAgLTEwMCw4ICsyMDEsNyBAQAogPHA+CiBJZiB5b3UgaGF2ZSBJbnRlbCBpOTE1L2k5NDUgaGFyZHdhcmU6CiA8L3A+Ci08cHJlPgotICAgbW9kcHJvYmUgYWdwZ2FydCAgICAgICAgICAgICMgdGhlIEFHUCBHQVJUIG1vZHVsZQorPHByZT4gICBtb2Rwcm9iZSBhZ3BnYXJ0ICAgICAgICAgICAgIyB0aGUgQUdQIEdBUlQgbW9kdWxlCiAgICBtb2Rwcm9iZSBpbnRlbGZiICAgICAgICAgICAgIyB0aGUgSW50ZWwgZmJkZXYgZHJpdmVyCiAgICBtb2Rwcm9iZSBpOTE1ICAgICAgICAgICAgICAgIyB0aGUgaTkxNS85NDUgRFJJIGtlcm5lbCBtb2R1bGUKIDwvcHJlPgpAQCAtMTA5LDggKzIwOSw3IEBACiA8cD4KIElmIHlvdSBoYXZlIEFUSSBSYWRlb24vUjIwMCBoYXJkd2FyZToKIDwvcD4KLTxwcmU+Ci0gICBtb2Rwcm9iZSBhZ3BnYXJ0ICAgICAgICAgICAgIyB0aGUgQUdQIEdBUlQgbW9kdWxlCis8cHJlPiAgIG1vZHByb2JlIGFncGdhcnQgICAgICAgICAgICAjIHRoZSBBR1AgR0FSVCBtb2R1bGUKICAgIG1vZHByb2JlIHJhZGVvbmZiICAgICAgICAgICAjIHRoZSBSYWRlb24gZmJkZXYgZHJpdmVyCiAgICBtb2Rwcm9iZSByYWRlb24gICAgICAgICAgICAgIyB0aGUgUmFkZW9uIERSSSBrZXJuZWwgbW9kdWxlCiA8L3ByZT4KQEAgLTExOCw4ICsyMTcsNyBAQAogPHA+CiBJZiB5b3UgaGF2ZSBBVEkgUmFnZSAxMjggaGFyZHdhcmU6CiA8L3A+Ci08cHJlPgotICAgbW9kcHJvYmUgYWdwZ2FydCAgICAgICAgICAgICMgdGhlIEFHUCBHQVJUIG1vZHVsZQorPHByZT4gICBtb2Rwcm9iZSBhZ3BnYXJ0ICAgICAgICAgICAgIyB0aGUgQUdQIEdBUlQgbW9kdWxlCiAgICBtb2Rwcm9iZSBhdHkxMjhmYiAgICAgICAgICAgIyB0aGUgUmFnZSAxMjggZmJkZXYgZHJpdmVyCiAgICBtb2Rwcm9iZSByMTI4ICAgICAgICAgICAgICAgIyB0aGUgUmFnZSAxMjggRFJJIGtlcm5lbCBtb2R1bGUKIDwvcHJlPgpAQCAtMTI3LDggKzIyNSw3IEBACiA8cD4KIElmIHlvdSBoYXZlIE1hdHJveCBHMjAwL0c0MDAgaGFyZHdhcmU6CiA8L3A+Ci08cHJlPgotICAgbW9kcHJvYmUgYWdwZ2FydCAgICAgICAgICAgICMgdGhlIEFHUCBHQVJUIG1vZHVsZQorPHByZT4gICBtb2Rwcm9iZSBhZ3BnYXJ0ICAgICAgICAgICAgIyB0aGUgQUdQIEdBUlQgbW9kdWxlCiAgICBtb2Rwcm9iZSBtZ2FmYiAgICAgICAgICAgICAgIyB0aGUgTWF0cm94IGZiZGV2IGRyaXZlcgogICAgbW9kcHJvYmUgbWdhICAgICAgICAgICAgICAgICMgdGhlIE1hdHJveCBEUkkga2VybmVsIG1vZHVsZQogPC9wcmU+CkBAIC0xMzYsOCArMjMzLDcgQEAKIDxwPgogVG8gdmVyaWZ5IHRoYXQgdGhlIGFncGdhcnQsIGZiZGV2IGFuZCBkcm0gbW9kdWxlcyBhcmUgbG9hZGVkOgogPC9wPgotPHByZT4KLSAgIGxzIC1sIC9kZXYvYWdwZ2FydCAvZGV2L2ZiKiAvZGV2L2RyaQorPHByZT4gICBscyAtbCAvZGV2L2FncGdhcnQgL2Rldi9mYiogL2Rldi9kcmkKIDwvcHJlPgogPHA+CiBBbHRlcm5hdGVseSwgdXNlIGxzbW9kIHRvIGluc3BlY3QgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgbW9kdWxlcy4KQEAgLTE0OCwxNiArMjQ0LDE1IEBACiA8aDI+My4yIENvbmZpZ3VyYXRpb24gRmlsZTwvaDI+CiAKIDxwPgotQ29weSB0aGUgc2FtcGxlIG1pbmlnbHguY29uZiB0byAvZXRjL21pbmlnbHguY29uZiBhbmQgcmV2aWV3L2VkaXQgaXRzIGNvbnRlbnRzLgorcmV2aWV3L2VkaXQgL2V0Yy9taW5pZ2x4LmNvbmYuCiBBbHRlcm5hdGVseSwgdGhlIE1JTklHTFhfQ09ORiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0bwogaW5kaWNhdGUgdGhlIGxvY2F0aW9uIG9mIG1pbmlnbHguY29uZgogPC9wPgogCiBUbyBkZXRlcm1pbmUgdGhlIHBjaUJ1c0lEIHZhbHVlLCBydW4gbHNwY2kgYW5kIGV4YW1pbmUgdGhlIG91dHB1dC4KIEZvciBleGFtcGxlOgotPC9wPgotPHByZT4KLSAgIC9zYmluL2xzcGNpOgorPHA+PC9wPgorPHByZT4gICAvc2Jpbi9sc3BjaToKICAgIDAwOjAyLjAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gODI5MTVHL0dWLzkxMEdMIEV4cHJlc3MgQ2hpcHNldCBGYW1pbHkgR3JhcGhpY3MgQ29udHJvbGxlciAocmV2IDA0KQogPC9wcmU+CiA8cD4KQEAgLTE4MCwxNSArMjc1LDEzIEBACiBDaGFuZ2UgdG8gdGhlIDxjb2RlPk1lc2EvcHJvZ3MvbWluaWdseC88L2NvZGU+IGRpcmVjdG9yeSBhbmQKIHN0YXJ0IHRoZSBzYW1wbGVfc2VydmVyIHByb2dyYW0gaW4gdGhlIGJhY2tncm91bmQ6CiA8L3A+Ci08cHJlPgotICAgLi9zYW1wbGVfc2VydmVyICZhbXA7Cis8cHJlPiAgIC4vc2FtcGxlX3NlcnZlciAmYW1wOwogPC9wcmU+CiAKIDxwPgogVGhlbiB0cnkgcnVubmluZyB0aGUgPGNvZGU+bWluaWdseHRlc3Q8L2NvZGU+IHByb2dyYW06CiA8L3A+Ci08cHJlPgotICAgLi9taW5pZ2x4dGVzdAorPHByZT4gICAuL21pbmlnbHh0ZXN0CiA8L3ByZT4KIDxwPgogWW91IHNob3VsZCBzZWUgYSByb3RhdGluZyBxdWFkcmlsYXRlcmFsIHdoaWNoIGNoYW5nZXMgY29sb3IgYXMgaXQgcm90YXRlcy4KQEAgLTE5OSw3ICsyOTIsNyBAQAogSWYgeW91IHJ1biBvdGhlciB0ZXN0cyBpbiB0aGUgbWluaWdseC8gZGlyZWN0b3J5LCB5b3UgbWF5IHdhbnQgdG8gcnVuCiB0aGVtIGZyb20gYSByZW1vdGUgc2hlbGwgc28gdGhhdCB5b3UgY2FuIHN0b3AgdGhlbSB3aXRoIGN0cmwtQy4KIDwvcD4KLQorPGJyPgogCiAKIDxoMT40LjAgVHJvdWJsZXNob290aW5nPC9oMT4KQEAgLTIwOCw4ICszMDEsNyBAQAogPGxpPgogSWYgeW91IHRyeSB0byBydW4gbWluaWdseHRlc3QgYW5kIGdldCB0aGUgZm9sbG93aW5nOgogPGJyPgotPHByZT4KLSAgIFttaW5pZ2x4XSBmYWlsZWQgdG8gcHJvYmUgY2hpcHNldAorPHByZT4gICBbbWluaWdseF0gZmFpbGVkIHRvIHByb2JlIGNoaXBzZXQKICAgIGNvbm5lY3Q6IENvbm5lY3Rpb24gcmVmdXNlZAogICAgc2VydmVyIGNvbm5lY3Rpb24gbG9zdAogPC9wcmU+CkBAIC0yMjMsNyArMzE1LDcgQEAKIDxoMT41LjAgUHJvZ3JhbW1pbmcgSW5mb3JtYXRpb248L2gxPgogCiA8cD4KLU9wZW5HTC9NZXNhIGlzIGludGVyZmFjZWQgdG8gZmJkZXYgdmlhIHRoZSA8YSBocmVmPSJNaW5pR0xYLmh0bWwiPk1pbmlHTFg8L2E+CitPcGVuR0wvTWVzYSBpcyBpbnRlcmZhY2VkIHRvIGZiZGV2IHZpYSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5uYWJibGUuY29tL2ZpbGUvcDE1NDgwNjY2L01pbmlHTFguaHRtbCI+TWluaUdMWDwvYT4KIGludGVyZmFjZS4KIE1pbmlHTFggaXMgYSBzdWJzZXQgb2YgWGxpYiBhbmQgR0xYIEFQSSBmdW5jdGlvbnMgd2hpY2ggcHJvdmlkZXMganVzdAogZW5vdWdoIGZ1bmN0aW9uYWxpdHkgdG8gc2V0dXAgT3BlbkdMIHJlbmRlcmluZyBhbmQgcmVzcG9uZCB0byBzaW1wbGUKQEAgLTI0NCw1ICszMzYsNiBAQAogPC9wPgogCiAKKwogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9oZWxwd2FudGVkLmh0bWwgYi9kb2NzL2hlbHB3YW50ZWQuaHRtbAppbmRleCAzNDZmMDkzLi40Y2Q5MmI5IDEwMDY0NAotLS0gYS9kb2NzL2hlbHB3YW50ZWQuaHRtbAorKysgYi9kb2NzL2hlbHB3YW50ZWQuaHRtbApAQCAtNiw3ICs2LDcgQEAKIAogPEJPRFk+CiAKLTxIMT5IZWxwIFdhbnRlZDwvSDE+Cis8SDE+SGVscCBXYW50ZWQgLyBUby1EbyBMaXN0PC9IMT4KIAogPHA+CiBXZSBjYW4gYWx3YXlzIHVzZSBtb3JlIGhlbHAgd2l0aCB0aGUgTWVzYSBwcm9qZWN0LgpAQCAtMTQsMzYgKzE0LDEzIEBACiA8L3A+CiAKIDxvbD4KLTxsaT48cD4KLSAgICBHZW5lcmF0ZSB0aGUgc3JjL21lc2EvbWFpbi9lbnVtcy5jIGZpbGUgd2l0aCBhIFB5dGhvbiBzY3JpcHQgd2hpY2gKLSAgICB1c2VzIHRoZSBnbF9BUEkueG1sIGZpbGUuCi0gICAgPC9wPgotPGxpPjxwPgotICAgIFRyeSB0byBhdXRvLWdlbmVyYXRlIHRoZSBkaXNwbGF5IGxpc3QgInNhdmUiIGZ1bmN0aW9ucyBzZWVuIGluIGRsaXN0LmMKLSAgICB1c2luZyBhIFB5dGhvbiBzY3JpcHQgYW5kIHRoZSBnbF9BUEkueG1sIGZpbGUuCi0gICAgVGhlIGdsX0FQSS54bWwgZmlsZSB3aWxsIHByb2JhYmx5IG5lZWQgYSBuZXcgdGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3IKLSAgICBub3QgZWFjaCBmdW5jdGlvbiBnZXRzIGNvbXBpbGVkIGludG8gZGlzcGxheSBsaXN0cy4KLSAgICA8L3A+Ci08bGk+PHA+Ci0gICAgTWFpbnRlbmFuY2Ugb2YgYXNzZW1ibHkgbGFuZ3VhZ2UgZmlsZXMgb24gTGludXgsIFdpbmRvd3MgYW5kIFNQQVJDIHN5c3RlbXMuCi0gICAgPC9wPgotPGxpPjxwPgotICAgIEhlbHAgdG8gaW5jb3Jwb3JhdGUgdGhlIDNEbGFicycgc2hhZGluZyBsYW5ndWFnZSBjb21waWxlciBmb3IgT3BlbkdMIDIuMC4KLSAgICA8L3A+Ci08bGk+PHA+Ci0gICAgSW1wbGVtZW50IGFzc2VtYmx5IGxhbmd1YWdlIChTU0UvTU1YKSBjb2RlIGdlbmVyYXRpb24gZm9yCi0gICAgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zLgotICAgIDwvcD4KLTxsaT48cD4KLSAgICBXaW5kb3dzIDk4L05UIGRyaXZlciBidWlsZGluZywgbWFpbnRlbmFuY2UgYW5kIHRlc3RpbmcKLSAgICAoS2FybCBTY2h1bHR6IGhhcyBiZWVuIGRvaW5nIGEgZ3JlYXQgam9iIG9mIHRoaXMgbGF0ZWx5KS4KLSAgICA8L3A+Ci08bGk+PHA+Ci0gICAgTWFpbnRlbmFuY2UgYW5kIHRlc3Rpbmcgb2YgdmFyaW91cyBkcml2ZXJzLCBzdWNoIGFzIERPUy9ESkdQUCwgR0dJLCBldGMuCi0gICAgPC9wPgotPGxpPjxwPgotICAgIFdyaXRlIG5ldyB0ZXN0cyBmb3IgR2xlYW4uCi0gICAgPC9wPgorPGxpPgorRW5hYmxlIC1Xc3RyaWN0LWFsaWFzaW5nPTIgLWZzdHJpY3QtYWxpYXNpbmcgYW5kIHRyYWNrIGRvd24gYWxpYXNpbmcKK2lzc3VlcyBpbiB0aGUgY29kZS4KKzxsaT4KK1dpbmRvd3MgOTgvTlQgZHJpdmVyIGJ1aWxkaW5nLCBtYWludGVuYW5jZSBhbmQgdGVzdGluZworPGxpPgorTWFpbnRlbmFuY2UgYW5kIHRlc3Rpbmcgb2YgbGVzc2VyLXVzZWQgZHJpdmVycywgc3VjaCBhcyBET1MvREpHUFAsIEdHSSwgZXRjLgogPC9vbD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2luc3RhbGwuaHRtbCBiL2RvY3MvaW5zdGFsbC5odG1sCmluZGV4IDgwNGRlZTUuLjE2ZWYwMTMgMTAwNjQ0Ci0tLSBhL2RvY3MvaW5zdGFsbC5odG1sCisrKyBiL2RvY3MvaW5zdGFsbC5odG1sCkBAIC0yMSwxMCArMjEsNDIgQEAKIDxhIG5hbWU9InVuaXgteDExIj4KIDxIMj4xLiBVbml4L1gxMSBDb21waWxhdGlvbiBhbmQgSW5zdGFsbGF0aW9uPC9IMT4KIAotPGgzPjEuMSBDb21waWxhdGlvbjwvaDM+CisKKzxoMz4xLjEgUHJlcmVxdWlzaXRlcyBmb3IgRFJJIGFuZCBIYXJkd2FyZSBBY2NlbGVyYXRpb248L2gzPgogCiA8cD4KLU1lc2EgbWF5IGJlIGNvbXBpbGVkIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXM6CitUbyBidWlsZCBNZXNhIDcuMSB3aXRoIERSSS1iYXNlZCBoYXJkd2FyZSBhY2NlbGVyYXRpb24geW91IG11c3QgZmlyc3QgaGF2ZQordGhlIDxhIGhyZWY9Imh0dHA6Ly9kcmkuZnJlZWRlc2t0b3Aub3JnL2xpYmRybS8iIHRhcmdldD0iX3BhcmVudCI+RFJNIHZlcnNpb24gMi4zLjE8L2E+LgorPC9wPgorCis8cD4KK1lvdSBzaG91bGQgYWxzbyBiZSB1c2luZyB0aGUgWG9yZyBzZXJ2ZXIgdmVyc2lvbiAxLjQgb3IgMS41LgorPC9wPgorCisKKworPGgzPjEuMiBBdXRvY29uZiBDb21waWxhdGlvbjwvaDM+CisKKzxwPgorTWVzYSBtYXkgYmUgPGEgaHJlZj0iYXV0b2NvbmYuaHRtbCI+YnVpbHQgdXNpbmcgYXV0b2NvbmY8L2E+LgorVGhpcyBzaG91bGQgd29yayB3ZWxsIG9uIG1vc3QgR05VLWJhc2VkIHN5c3RlbXMuCitXaGVuIHRoYXQgZmFpbHMsIHRoZSB0cmFkaXRpb25hbCBNZXNhIGJ1aWxkIHN5c3RlbSBpcyBhdmFpbGFibGUuCisKKworCis8aDM+MS4zIFRyYWRpdGlvbmFsIENvbXBpbGF0aW9uPC9oMz4KKworPHA+CitUaGUgdHJhZGl0aW9uYWwgTWVzYSBidWlsZCBzeXN0ZW0gaXMgYmFzZWQgb24gYSBjb2xsZWN0aW9uIG9mIHByZS1kZWZpbmVkCitzeXN0ZW0gY29uZmlndXJhdGlvbnMuCis8L3A+Cis8cD4KK1RvIHNlZSB0aGUgbGlzdCBvZiBjb25maWd1cmF0aW9ucywgdHlwZSA8Yj5tYWtlPC9iPiBhbG9uZS4KK1RoZW4gY2hvb3NlIGEgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBsaXN0IGFuZCB0eXBlIDxiPm1ha2UgY29uZmlnbmFtZTwvYj4uCis8L3A+CisKKzxwPgorTWVzYSBtYXkgYmUgYnVpbHQgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyB1c2luZyB0aGUgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9uczoKIDwvcD4KIDx1bD4KIDxsaT48Yj48ZW0+U3RhbmQtYWxvbmUvWGxpYiBtb2RlPC9lbT48L2I+IC0gTWVzYSB3aWxsIGJlIGNvbXBpbGVkIGFzCkBAIC00OSw2MiArODEsNiBAQAogVGhlIGxpYkdMLnNvIGxpYnJhcnkgd2lsbCBzdXBwb3J0IHRoZSBHTFggZXh0ZW5zaW9uIGFuZCB3aWxsIGxvYWQvdXNlCiB0aGUgRFJJIGhhcmR3YXJlIGRyaXZlcnMuCiAKLTxwPgotPGI+UHJlcmVxdWlzaXRlczo8L2I+Ci08L3A+Ci0KLTxvbD4KLQotPGxpPgotPHA+Ci1EUk0ga2VybmVsIG1vZHVsZXMgYW5kIGhlYWRlciBmaWxlcyBmcm9tIHRoZQotPGEgaHJlZj0iaHR0cDovL2RyaS5zZi5uZXQvIiB0YXJnZXQ9Il9wYXJlbnQiPkRSSTwvYT4gcHJvamVjdC4KLTwvcD4KLQotPHA+Ci1JZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIHRoZSBEUk0gZmlsZSwgeW91IGNhbiBnZXQgdGhlIHNvdXJjZXMgZnJvbQotQ1ZTIGJ5IGRvaW5nOgotPHByZT4KLWN2cyAtejMgLWQ6cHNlcnZlcjphbm9ueW1vdXNAYW5vbmN2cy5mcmVlZGVza3RvcC5vcmc6L2N2cy9kcmkgY28gZHJtCi08L3ByZT4KLTxwPgotU2VlIHRoZSA8YSBocmVmPSJodHRwOi8vZHJpLmZyZWVkZXNrdG9wLm9yZy93aWtpL0J1aWxkaW5nIiB0YXJnZXQ9Il9wYXJlbnQiPgotRFJJIEJ1aWxkaW5nIEluc3RydWN0aW9uczwvYT4gZm9yIHRoZSBzdGVwcyB0byBidWlsZCB0aGUgRFJNIG1vZHVsZXMuICBNZXNhCi02LjUgcmVxdWlyZXMgYXQgbGVhc3QgbGliZHJtIDIuMC4xIG9yIGdyZWF0ZXIuCi08L3A+Ci08cD4KLVlvdSBjYW4gdmVyaWZ5IHRoYXQgdGhlIERSTSBmaWxlcyBoYXZlIGJlZW4gcHJvcGVybHkgaW5zdGFsbGVkIGJ5Ci1ydW5uaW5nIDxjb2RlPnBrZy1jb25maWcgLS1tb2R2ZXJzaW9uIGxpYmRybTwvY29kZT4KLQotPC9saT4KLQotPGxpPgotUmVjZW50IC91c3IvaW5jbHVkZS9HTC9nbHhwcm90by5oIGZpbGUuCi08cD5Zb3UnbGwgbmVlZCB0aGlzIGlmIHlvdSBnZXQgYW55IGVycm9ycyBhYm91dCBfR0xYdm9wX0JpbmRUZXhJbWFnZUVYVAotYmVpbmcgdW5kZWZpbmVkLgotPC9wPgotPHA+Ci1Eb3dubG9hZC9pbnN0YWxsIHRoZQotPGEgaHJlZj0iaHR0cDovL2dpdHdlYi5mcmVlZGVza3RvcC5vcmcvP3A9eG9yZy9wcm90by9nbHByb3RvLmdpdCI+Z2xwcm90bzwvYT4KLW1vZHVsZSBmcm9tIFgub3JnIGdpdCwgb3IgZ3JhYiB0aGUKLTxBIGhyZWY9Imh0dHA6Ly93ZWJjdnMuZnJlZWRlc2t0b3Aub3JnLypjaGVja291dCoveG9yZy9wcm90by9HTC9nbHhwcm90by5oP3Jldj0xLjkmY29udGVudC10eXBlPXRleHQlMkZwbGFpbiI+Z2x4cHJvdG8uaCBmaWxlPC9hPiBhbmQgcHV0IGl0IGluIHRoZQotTWVzYS9pbmNsdWRlL0dMLyBkaXJlY3RvcnkuCi08L3A+Ci0KLTwvbGk+Ci0KLTxsaT5EUkktZW5hYmxlZCBYIHNlcnZlci4KLTxwPlZpc2l0Ci08YSBocmVmPSJodHRwOi8vd3d3LnhmcmVlODYub3JnIiB0YXJnZXQ9Il9wYXJlbnQiPlhGcmVlODY8L2E+Ci1vcgotPGEgaHJlZj0iaHR0cDovL2ZyZWVkZXNrdG9wLm9yZy93aWtpL1NvZnR3YXJlXzJmWHNlcnZlciIgdGFyZ2V0PSJfcGFyZW50Ij4KLVgub3JnPC9hPgotZm9yIG1vcmUgaW5mb3JtYXRpb24uCi08L3A+Ci08L2xpPgotCi08L29sPgotCiAKIDxwPgogQnVpbGQgTWVzYSBhbmQgdGhlIERSSSBoYXJkd2FyZSBkcml2ZXJzIGJ5IHJ1bm5pbmcKQEAgLTExNyw4ICs5MywxMyBAQAogYW5kIDxjb2RlPmxpbnV4LXBwYzwvY29kZT4gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlIG9wdGltaXplZCBmb3IgdGhvc2UKIGFyY2hpdGVjdHVyZXMuCiA8L3A+Cis8cD4KK01ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgcHJlcmVxdWlzaXRlIHZlcnNpb25zIG9mIERSTSBhbmQgWHNlcnZlciBtZW50aW9uZWQKK2Fib3ZlLgorPC9wPgogCiA8L2xpPgorCiA8L3VsPgogCiAKQEAgLTEyOCw3ICsxMDksNyBAQAogPC9wPgogCiAKLTxoMz4xLjIgVGhlIGxpYnJhcmllczwvaDM+Cis8aDM+MS40IFRoZSBsaWJyYXJpZXM8L2gzPgogCiA8cD4KIFdoZW4gY29tcGlsYXRpb24gaGFzIGZpbmlzaGVkLCBsb29rIGluIHRoZSB0b3AtbGV2ZWwgPGNvZGU+bGliLzwvY29kZT4KQEAgLTE2OSwxNSArMTUwLDE1IEBACiBJZiB5b3UgYnVpbHQgdGhlIERSSSBoYXJkd2FyZSBkcml2ZXJzLCB5b3UnbGwgYWxzbyBzZWUgdGhlIERSSSBkcml2ZXJzOgogPC9wPgogPHByZT4KLS1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDE1NjA3ODUxIEp1bCAyMSAxMjoxMSBmZmJfZHJpLnNvKgotLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTUxNDg3NDcgSnVsIDIxIDEyOjExIGk4MTBfZHJpLnNvKgotLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTQ0OTc4MTQgSnVsIDIxIDEyOjExIGk4MzBfZHJpLnNvKgotLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTY4OTU0MTMgSnVsIDIxIDEyOjExIGk5MTVfZHJpLnNvKgorLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTU2MDc4NTEgSnVsIDIxIDEyOjExIGZmYl9kcmkuc28KKy1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDE1MTQ4NzQ3IEp1bCAyMSAxMjoxMSBpODEwX2RyaS5zbworLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTQ0OTc4MTQgSnVsIDIxIDEyOjExIGk4MzBfZHJpLnNvCistcnd4ci14ci14ICAgMSBicmlhbiB1c2VycyAxNjg5NTQxMyBKdWwgMjEgMTI6MTEgaTkxNV9kcmkuc28KIC1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDExMzIwODAzIEp1bCAyMSAxMjoxMSBtYWNoNjRfZHJpLnNvCiAtcnd4ci14ci14ICAgMSBicmlhbiB1c2VycyAxMTQxODAxNCBKdWwgMjEgMTI6MTIgbWdhX2RyaS5zbwogLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTEwNjQ0MjYgSnVsIDIxIDEyOjEyIHIxMjhfZHJpLnNvCiAtcnd4ci14ci14ICAgMSBicmlhbiB1c2VycyAxMTg0OTg1OCBKdWwgMjEgMTI6MTIgcjIwMF9kcmkuc28KLS1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDE2MDUwNDg4IEp1bCAyMSAxMjoxMSByMzAwX2RyaS5zbyoKKy1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDE2MDUwNDg4IEp1bCAyMSAxMjoxMSByMzAwX2RyaS5zbwogLXJ3eHIteHIteCAgIDEgYnJpYW4gdXNlcnMgMTE3NTczODggSnVsIDIxIDEyOjEyIHJhZGVvbl9kcmkuc28KIC1yd3hyLXhyLXggICAxIGJyaWFuIHVzZXJzIDExMjMyMzA0IEp1bCAyMSAxMjoxMyBzM3ZfZHJpLnNvCiAtcnd4ci14ci14ICAgMSBicmlhbiB1c2VycyAxMTA2Mjk3MCBKdWwgMjEgMTI6MTMgc2F2YWdlX2RyaS5zbwpAQCAtMTg4LDcgKzE2OSw3IEBACiA8L3ByZT4KIAogCi08aDM+MS4zIFJ1bm5pbmcgdGhlIGRlbW9zPC9oMz4KKzxoMz4xLjUgUnVubmluZyB0aGUgZGVtb3M8L2gzPgogCiA8cD4KIElmIHlvdSBkb3dubG9hZGVkL3VucGFja2VkIHRoZSBNZXNhRGVtb3MteC55LnoudGFyLmd6IGFyY2hpdmUgb3IKQEAgLTE5NywxOCArMTc4LDE1IEBACiA8L3A+CiAKIDxwPgotQmVmb3JlIHJ1bm5pbmcgYSBkZW1vLCB5b3UgbWF5IGhhdmUgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlCi0oc3VjaCBhcyA8Yj5MRF9MSUJSQVJZX1BBVEg8L2I+IG9uIExpbnV4KSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUKLWxpYnJhcmllcyBhcmUgbG9jYXRlZC4gIEZvciBleGFtcGxlOgorQmVmb3JlIHJ1bm5pbmcgYSBkZW1vLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBzZXQgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcwordG8gaW5kaWNhdGUgd2hlcmUgdGhlIGxpYnJhcmllcyBhcmUgbG9jYXRlZC4gIEZvciBleGFtcGxlOgogPHA+CiA8YmxvY2txdW90ZT4KLTxiPmNkPC9iPiBpbnRvIHRoZSBNZXNhIDxiPmxpYi88L2I+IGRpcmVjdG9yeS4KKzxiPmNkIGxpYi88L2I+CiA8YnI+Ci08Yj5zZXRlbnYgTERfTElCUkFSWV9QQVRIICR7Y3dkfTwvYj4gICAoaWYgdXNpbmcgY3NoIG9yIHRjc2ggc2hlbGwpCis8Yj5leHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFdEfTwvYj4KIDxicj4KLW9yLAotPGJyPgotPGI+ZXhwb3J0IExEX0xJQlJBUllfUEFUSD0ke1BXRH08L2I+ICAgKGlmIHVzaW5nIGJhc2ggb3Igc2ggc2hlbGwpCis8Yj5leHBvcnQgTElCR0xfRFJJVkVSU19QQVRIPSR7UFdEfTwvYj4gKGlmIHVzaW5nIERSSSBkcml2ZXJzKQogPC9ibG9ja3F1b3RlPgogCiA8cD4KQEAgLTI2Niw3ICsyNDQsNyBAQAogPC9wPgogCiAKLTxIMz4xLjQgSW5zdGFsbGluZyB0aGUgaGVhZGVyIGFuZCBsaWJyYXJ5IGZpbGVzPC9IMz4KKzxIMz4xLjYgSW5zdGFsbGluZyB0aGUgaGVhZGVyIGFuZCBsaWJyYXJ5IGZpbGVzPC9IMz4KIAogPHA+CiBUaGUgc3RhbmRhcmQgbG9jYXRpb24gZm9yIHRoZSBPcGVuR0wgaGVhZGVyIGZpbGVzIG9uIFVuaXgtdHlwZSBzeXN0ZW1zIGlzCkBAIC0yODcsNyArMjY1LDE1IEBACiBUbyBpbnN0YWxsIE1lc2EncyBoZWFkZXJzIGFuZCBsaWJyYXJpZXMsIHJ1biA8Y29kZT5tYWtlIGluc3RhbGw8L2NvZGU+LgogQnV0IGZpcnN0LCBjaGVjayB0aGUgTWVzYS9jb25maWdzL2RlZmF1bHQgZmlsZSBhbmQgZXhhbWluZSB0aGUgdmFsdWVzCiBvZiB0aGUgPGI+SU5TVEFMTF9ESVI8L2I+IGFuZCA8Yj5EUklfRFJJVkVSX0lOU1RBTExfRElSPC9iPiB2YXJpYWJsZXMuCi1DaGFuZ2UgdGhlbSBpZiBuZWVkZWQsIHRoZW4gcnVuIDxjb2RlPm1ha2UgaW5zdGFsbDwvY29kZT4KK0NoYW5nZSB0aGVtIGlmIG5lZWRlZCwgdGhlbiBydW4gPGNvZGU+bWFrZSBpbnN0YWxsPC9jb2RlPi4KKzwvcD4KKworPHA+CitUaGUgdmFyaWFibGUKKzxiPkRFU1RESVI8L2I+IG1heSBhbHNvIGJlIHVzZWQgdG8gaW5zdGFsbCB0aGUgY29udGVudHMgdG8gYSB0ZW1wb3JhcnkKK3N0YWdpbmcgZGlyZWN0b3J5LgorVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQuCitGb3IgZXhhbXBsZTogPGNvZGU+bWFrZSBpbnN0YWxsIERFU1RESVI9L3NvbWVwYXRoLzwvY29kZT4KIDwvcD4KIAogPHA+CkBAIC0yOTgsNiArMjg0LDI2IEBACiA8L3A+CiAKIAorPEgzPjEuNyBCdWlsZGluZyBPcGVuR0wgUHJvZ3JhbXMgV2l0aCBwa2ctY29uZmlnPC9IMz4KKworPHA+CitSdW5uaW5nIDxjb2RlPm1ha2UgaW5zdGFsbDwvY29kZT4gd2lsbCBpbnN0YWxsIHBhY2thZ2UgY29uZmlndXJhdGlvbiBmaWxlcworZm9yIHRoZSBwa2ctY29uZmlnIHV0aWxpdHkuCis8L3A+CisKKzxwPgorV2hlbiBjb21waWxpbmcgeW91ciBPcGVuR0wgYXBwbGljYXRpb24geW91IGNhbiB1c2UgcGtnLWNvbmZpZyB0byBkZXRlcm1pbmUKK3RoZSBwcm9wZXIgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncy4KKzwvcD4KKworPHA+CitGb3IgZXhhbXBsZSwgY29tcGlsaW5nIGFuZCBsaW5raW5nIGEgR0xVVCBhcHBsaWNhdGlvbiBjYW4gYmUgZG9uZSB3aXRoOgorPC9wPgorPHByZT4KKyAgIGdjYyBgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgZ2x1dGAgbXlkZW1vLmMgLW8gbXlkZW1vCis8L3ByZT4KKworPGJyPgogCiA8YSBuYW1lPSJ3aW5kb3dzIj4KIDxIMj4yLiBXaW5kb3dzIENvbXBpbGF0aW9uIGFuZCBJbnN0YWxsYXRpb248L0gxPgpkaWZmIC0tZ2l0IGEvZG9jcy9saWNlbnNlLmh0bWwgYi9kb2NzL2xpY2Vuc2UuaHRtbAppbmRleCA5NDRhNWRkLi40NGI5ODBkIDEwMDY0NAotLS0gYS9kb2NzL2xpY2Vuc2UuaHRtbAorKysgYi9kb2NzL2xpY2Vuc2UuaHRtbApAQCAtODYsMjkgKzg2LDMyIEBACiA8SDE+TWVzYSBDb21wb25lbnQgTGljZW5zZXM8L0gxPgogCiA8cHJlPgotQ29tcG9uZW50ICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICBQcmltYXJ5IEF1dGhvciAgICAgIExpY2Vuc2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1haW4gTWVzYSBjb2RlICAgIHNyYy9tZXNhLyAgICAgICAgICAgICAgQnJpYW4gUGF1bCAgICAgICAgICBNZXNhIChNSVQpCitDb21wb25lbnQgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgIExpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWFpbiBNZXNhIGNvZGUgICAgc3JjL21lc2EvICAgICAgICAgICAgICBNZXNhIChNSVQpCiAKLURldmljZSBkcml2ZXJzICAgIHNyYy9tZXNhL2RyaXZlcnMvKiAgICAgU2VlIGRyaXZlcnMgICAgICAgICBTZWUgZHJpdmVycworRGV2aWNlIGRyaXZlcnMgICAgc3JjL21lc2EvZHJpdmVycy8qICAgICBNSVQsIGdlbmVyYWxseQogCi1FeHQgaGVhZGVycyAgICAgICBpbmNsdWRlL0dML2dsZXh0LmggICAgIFNHSSAgICAgICAgICAgICAgICAgU0dJIEZyZWUgQgorRXh0IGhlYWRlcnMgICAgICAgaW5jbHVkZS9HTC9nbGV4dC5oICAgICBLaHJvbm9zCiAgICAgICAgICAgICAgICAgICBpbmNsdWRlL0dML2dseGV4dC5oCiAKLUdMVVQgICAgICAgICAgICAgIHNyYy9nbHV0LyAgICAgICAgICAgICAgTWFyayBLaWxnYXJkICAgICAgICBNYXJrJ3MgY29weXJpZ2h0CitHTFVUICAgICAgICAgICAgICBzcmMvZ2x1dC8gICAgICAgICAgICAgIE1hcmsgS2lsZ2FyZCdzIGNvcHlyaWdodAogCi1NZXNhIEdMVSBsaWJyYXJ5ICBzcmMvZ2x1L21lc2EvICAgICAgICAgIEJyaWFuIFBhdWwgICAgICAgICAgR05VLUxHUEwKK1NHSSBHTFUgbGlicmFyeSAgIHNyYy9nbHUvc2dpLyAgICAgICAgICAgU0dJIEZyZWUgQgogCi1TR0kgR0xVIGxpYnJhcnkgICBzcmMvZ2x1L3NnaS8gICAgICAgICAgIFNHSSAgICAgICAgICAgICAgICAgU0dJIEZyZWUgQgorZGVtbyBwcm9ncmFtcyAgICAgcHJvZ3MvZGVtb3MvICAgICAgICAgICBzZWUgc291cmNlIGZpbGVzCiAKLWRlbW8gcHJvZ3JhbXMgICAgIHByb2dzL2RlbW9zLyAgICAgICAgICAgdmFyaW91cyAgICAgICAgICAgICBzZWUgc291cmNlIGZpbGVzCitYIGRlbW9zICAgICAgICAgICBwcm9ncy94ZGVtb3MvICAgICAgICAgIHNlZSBzb3VyY2UgZmlsZXMKIAotWCBkZW1vcyAgICAgICAgICAgcHJvZ3MveGRlbW9zLyAgICAgICAgICBCcmlhbiBQYXVsICAgICAgICAgIHNlZSBzb3VyY2UgZmlsZXMKK1NHSSBkZW1vcyAgICAgICAgIHByb2dzL3NhbXBsZXMvICAgICAgICAgU0dJIGxpY2Vuc2UKIAotU0dJIGRlbW9zICAgICAgICAgcHJvZ3Mvc2FtcGxlcy8gICAgICAgICBTR0kgICAgICAgICAgICAgICAgIFNHSSBjb3B5cmlnaHQKLQotUmVkQm9vayBkZW1vcyAgICAgcHJvZ3MvcmVkYm9vay8gICAgICAgICBTR0kgICAgICAgICAgICAgICAgIFNHSSBjb3B5cmlnaHQKK1JlZEJvb2sgZGVtb3MgICAgIHByb2dzL3JlZGJvb2svICAgICAgICAgU0dJIGxpY2Vuc2UKIDwvcHJlPgogCis8cD4KK0luIGdlbmVyYWwsIGNvbnN1bHQgdGhlIHNvdXJjZSBmaWxlcyBmb3IgbGljZW5zZSB0ZXJtcy4KKzwvcD4KKworCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21vZGVsZXJzLmh0bWwgYi9kb2NzL21vZGVsZXJzLmh0bWwKaW5kZXggYjkzZjRkOC4uYWFlOTY4NiAxMDA2NDQKLS0tIGEvZG9jcy9tb2RlbGVycy5odG1sCisrKyBiL2RvY3MvbW9kZWxlcnMuaHRtbApAQCAtMjgsNyArMjgsNyBAQAogCTwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9pbm5vdmF0aW9uM2Quc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfcGFyZW50Ij5Jbm5vdmF0aW9uM0Q8L2E+CiAJLSAzRCBtb2RlbGluZyBwcm9ncmFtCiAJPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL21lc2EzZC5zb3VyY2Vmb3JnZS5uZXQvbm90Zm91bmQuaHRtbCIgdGFyZ2V0PSJfcGFyZW50Ij5LV1JMPC9hPiAtIFZSTUwgYnJvd3NlcgotCTwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudmVybW9udGVsLmNvbS8lN0VjbW9ybGV5L3ZybWwuaHRtbCIgdGFyZ2V0PSJfcGFyZW50Ij5MaWJWUk1MOTcvTG9va2F0PC9hPgorCTwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnZybWwub3JnLyIgdGFyZ2V0PSJfcGFyZW50Ij5MaWJWUk1MOTcvTG9va2F0PC9hPgogCS0gVlJNTCB2aWV3ZXIKIAk8L2xpPjxsaT48YSBocmVmPSJodHRwOi8vYWlnLmNzLm1hbi5hYy51ay9zeXN0ZW1zL01hdmVyaWsvIiB0YXJnZXQ9Il9wYXJlbnQiPk1hdmVyaWs8L2E+CiAJLSBWUiBncmFwaGljcyBhbmQgaW50ZXJhY3Rpb24gc3lzdGVtCmRpZmYgLS1naXQgYS9kb2NzL25ld3MuaHRtbCBiL2RvY3MvbmV3cy5odG1sCmluZGV4IGI3NjZjZTcuLjFiZjY0MzYgMTAwNjQ0Ci0tLSBhL2RvY3MvbmV3cy5odG1sCisrKyBiL2RvY3MvbmV3cy5odG1sCkBAIC0xMSw2ICsxMSw1OSBAQAogPEgxPk5ld3M8L0gxPgogCiAKKzxoMj5BdWd1c3QgMTYsIDIwMDg8L2gyPgorPHA+Cis8YSBocmVmPSJyZWxub3Rlcy03LjAuNC5odG1sIj5NZXNhIDcuMC40PC9hPiBpcyByZWxlYXNlZC4KK1RoaXMgaXMgYSBidWctZml4IHJlbGVhc2UuCis8L3A+CisKKworPGgyPkFwcmlsIDQsIDIwMDg8L2gyPgorPHA+Cis8YSBocmVmPSJyZWxub3Rlcy03LjAuMy5odG1sIj5NZXNhIDcuMC4zPC9hPiBpcyByZWxlYXNlZC4KK1RoaXMgaXMgYSBidWctZml4IHJlbGVhc2UuCis8L3A+CisKKworPGgyPkphbnVhcnkgMjQsIDIwMDg8L2gyPgorCis8cD4KK0FkZGVkIGEgbmV3IHBhZ2UgZGVzY3JpYmluZyB0aGUgPGEgaHJlZj0iY2VsbC5odG1sIj5NZXNhIENlbGwgZHJpdmVyPC9hPi4KKzwvcD4KKworCisKKzxoMj5Ob3ZlbWJlciAxMywgMjAwNzwvaDI+CisKKzxwPgorR2FsbGl1bTNEIGlzIHRoZSBjb2RlbmFtZSBmb3IgdGhlIG5ldyBNZXNhIGRldmljZSBkcml2ZXIgYXJjaGl0ZWN0dXJlCit3aGljaCBpcyBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQuCitBIDxhIGhyZWY9Imh0dHA6Ly93d3cudHVuZ3N0ZW5ncmFwaGljcy5jb20vd2lraS9pbmRleC5waHAvR2FsbGl1bTNEIgordGFyZ2V0PSJfcGFyZW50Ij4gc3VtbWFyeTwvYT4gb2YgdGhlIGFyY2hpdGVjdHVyZSBjYW4gYmUgZm91bmQgb24gdGhlCitUdW5nc3RlbiBHcmFwaGljcyB3ZWJzaXRlLgorPC9wPgorPHA+CitHYWxsaXVtM0QgZGV2ZWxvcG1lbnQgaXMgdGFraW5nIHBsYWNlIG9uIHRoZSA8ZW0+Z2FsbGl1bS0wLjE8L2VtPiBicmFuY2gKK29mIHRoZSBnaXQgcmVwb3NpdG9yeS4KK0N1cnJlbnRseSwgdGhlcmUncyBvbmx5IGEgc29mdHdhcmUtb25seSBkcml2ZXIgYW5kIGFuIEludGVsIGk5MTUvOTQ1IGRyaXZlcgorYnV0IG90aGVyIGRyaXZlcnMgd2lsbCBiZSBjb21pbmcuLi4KKzwvcD4KKworCis8aDI+Tm92ZW1iZXIgMTAsIDIwMDc8L2gyPgorPHA+Cis8YSBocmVmPSJyZWxub3Rlcy03LjAuMi5odG1sIj5NZXNhIDcuMC4yPC9hPiBpcyByZWxlYXNlZC4KK1RoaXMgaXMgYSBidWctZml4IHJlbGVhc2UuCis8L3A+CisKKworPGgyPkF1Z3VzdCAzLCAyMDA3PC9oMj4KKzxwPgorPGEgaHJlZj0icmVsbm90ZXMtNy4wLjEuaHRtbCI+TWVzYSA3LjAuMTwvYT4gaXMgcmVsZWFzZWQuCitUaGlzIGlzIGEgYnVnLWZpeCByZWxlYXNlLgorPC9wPgorCisKIDxoMj5KdW5lIDIyLCAyMDA3PC9oMj4KIDxwPgogPGEgaHJlZj0icmVsbm90ZXMtNy4wLmh0bWwiPk1lc2EgNy4wPC9hPiBpcyByZWxlYXNlZC4KZGlmZiAtLWdpdCBhL2RvY3MvcmVsbm90ZXMtNy4wLjEuaHRtbCBiL2RvY3MvcmVsbm90ZXMtNy4wLjEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcxM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9yZWxub3Rlcy03LjAuMS5odG1sCkBAIC0wLDAgKzEsMTAxIEBACis8SFRNTD4KKworPFRJVExFPk1lc2EgUmVsZWFzZSBOb3RlczwvVElUTEU+CisKKzxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1lc2EuY3NzIj48L2hlYWQ+CisKKzxCT0RZPgorCis8Ym9keSBiZ2NvbG9yPSIjZWVlZWVlIj4KKworPEgxPk1lc2EgNy4wLjEgUmVsZWFzZSBOb3RlcyAvIEF1Z3VzdCAzLCAyMDA3PC9IMT4KKworPHA+CitNZXNhIDcuMC4xIGlzIGEgc3RhYmxlIHJlbGVhc2Ugd2l0aCBidWcgZml4ZXMgc2luY2UgdmVyc2lvbiA3LjAuCis8L3A+CisKKworPGgyPk1ENSBjaGVja3N1bXM8L2gyPgorPHByZT4KK2RiNTUxNDFhNDRiOTAyZmNjNjFkOTI2NWI3ODYyYzA2ICBNZXNhTGliLTcuMC4xLnRhci5negorYzA1NmFiZDc2M2U4OTkxMTRiZjc0NWM5ZWVkYmY5YWQgIE1lc2FMaWItNy4wLjEudGFyLmJ6MgorZWNjMjYzNzU0N2ZhZTJiMzgyNzFhZTM2MmQwMTNhZmEgIE1lc2FMaWItNy4wLjEuemlwCitiODVhNGE1YmU0ZTgyOWY0YTExNjVlNDUxNGIxMzE4MyAgTWVzYURlbW9zLTcuMC4xLnRhci5negorM2I2NmIzMjY4ZGYxMmNhOGE2YzRlMGM0YzQ1NzkxMmMgIE1lc2FEZW1vcy03LjAuMS50YXIuYnoyCitiMWMxODAwNmYxNmU0NGU4MGZlYTY2Nzc0YzU5YjM5MSAgTWVzYURlbW9zLTcuMC4xLnppcAorYjg3YTY5OTg2ODM5YWU0M2NlMTJmYzhlM2RjMWViYjQgIE1lc2FHTFVULTcuMC4xLnRhci5negorMjVmMzBkMGMxNjUxOTk3YjQ0MTIzNjZiYTA1NzJmN2YgIE1lc2FHTFVULTcuMC4xLnRhci5iejIKKzY3NmVlNjY4MmE2Y2U3OGE1NTQwNTU0ZmQ5NzVjMDNlICBNZXNhR0xVVC03LjAuMS56aXAKKzwvcHJlPgorCisKKzxoMj5OZXcgZmVhdHVyZXM8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgYmx1ZWdlbmUtb3NtZXNhIGJ1aWxkIGNvbmZpZworPC91bD4KKworPGgyPkJ1ZyBmaXhlczwvaDI+Cis8dWw+Cis8bGk+Rml4ZWQgc29tZSBNaW5nVyBidWlsZCBpc3N1ZXMKKzxsaT5BZGRlZCBhIGZldyBtaXNzaW5nIE9wZW5HTCAyLjAgQVBJIGVudHJ5cG9pbnRzOgorICA8dWw+CisgIDxsaT5nbFZlcnRleEF0dHJpYjRidgorICA8bGk+Z2xWZXJ0ZXhBdHRyaWI0aXYKKyAgPGxpPmdsVmVydGV4QXR0cmliNHVidgorICA8bGk+Z2xWZXJ0ZXhBdHRyaWI0dWl2CisgIDxsaT5nbFZlcnRleEF0dHJpYjR1c3YKKyAgPC91bD4KKzxsaT5GaXhlZCBnbERyYXdQaXhlbHMoR0xfU1RFTkNJTF9JTkRFWCkgcGl4ZWwgdHJhbnNmZXIgYnVnIDExNDU3Cis8bGk+R0xTTCBidWcgZml4OiBhZGRlZCB2ZWMyKHZlYzQpIGNvbnN0cnVjdG9yCis8bGk+R0xTTCBidWcgZml4OiAuc3RycSBhbmQgLnJnYmEgd3JpdGVtYXNrcyBkaWRuJ3QgYWx3YXlzIHdvcmsKKzxsaT5TdGVuY2lsIHBpeGVsIG1hcCBkaWRuJ3QgYWx3YXlzIHdvcmsgZm9yIGdsRHJhd1BpeGVscyAoYnVnIDExNDc1KQorPGxpPkZpeGVkIHBvbHlnb24gc3RpcHBsZSBidWcgaW4gaTkxNSBkcml2ZXIKKzxsaT5CaW5kaW5nIGEgemVyby1zaXplZCB0ZXh0dXJlIGRpZG4ndCBkaXNhYmxlIHRleHR1cmluZyAoYnVnIDExMzA5KQorPGxpPlF1ZXJpZXMgb2YgR0xfSU5GT19MT0dfTEVOR1RILCBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCBkaWRuJ3QgaW5jbHVkZQordGhlIHRlcm1pbmF0aW5nIHplcm8gKGJ1ZyAxMTU4OCkKKzxsaT5nbFhDaG9vc2VGQkNvbmZpZygpIGluIFhsaWIgZHJpdmVyIGRpZG4ndCBoYW5kbGUgR0xYX1NURVJFTyBmbGFnIHByb3Blcmx5Cis8bGk+Rml4ZWQgYSBHTFNMIGZ1bmN0aW9uIGNhbGwgYnVnICgjMTE3MzEpCis8bGk+Z2xQb2ludFBhcmFtZXRlcml2KEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCkgZGlkbid0IHdvcmsgKGJ1ZyAxMTc1NCkKKzxsaT5nbEdldEF0dHJpYkxvY2F0aW9uKCkgYWx3YXlzIHJldHVybmVkIDEgKGJ1ZyAxMTc3NCkKKzxsaT5GaXhlZCBhIGZldyBtZW1vcnktcmVsYXRlZCBidWdzIGluIEdMVSBsaWJyYXJ5Cis8L3VsPgorCisKKzxoMj5DaGFuZ2VzPC9oMj4KKzx1bD4KKzxsaT5UaGUgbGliT1NNZXNhIGxpYnJhcnkgdmVyc2lvbiBoYXMgYmVlbiByZXZlcnRlZCB0byA2LjUuMyAoc29uYW1lPTYpCitpbiBvcmRlciB0byBhdm9pZCBhcHBsaWNhdGlvbiBsaW5raW5nIGlzc3Vlcy4gIE90aGVyd2lzZSwgYXBwbGljYXRpb25zCitwcmV2aW91c2x5IGxpbmtlZCB3aXRoIGxpYk9TTWVzYS5zby42IHdvdWxkIG5vIGxvbmdlciBsaW5rIHdpdGggbGliT1NNZXNhLnNvLjcKKzxsaT5Ecm9wcGVkIG9ic29sZXRlLCB1bm1haW50YWluZWQgV2luZG93cyBwcm9qZWN0IGZpbGVzIGZvciBWQzYgYW5kIFZDNy4KKzwvdWw+CisKKworPGgyPlRvIERvIChzb21lZGF5KSBpdGVtczwvaDI+Cis8dWw+Cis8bGk+U3dpdGNoIHRvIGZyZWVnbHV0Cis8bGk+Rml4IGxpbnV4LWdsaWRlIHRhcmdldC9kcml2ZXIuCis8bGk+SW1wcm92ZWQgbGFtYmRhIGFuZCBkZXJpdmF0aXZlIGNhbGN1bGF0aW9uIGZvciBmcmFnIHByb2dzLgorPC91bD4KKworCis8aDI+RHJpdmVyIFN0YXR1czwvaDI+CisKKzxwcmU+CitEcml2ZXIJCQlTdGF0dXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRFJJIGRyaXZlcnMJCXZhcmllcyB3aXRoIHRoZSBkcml2ZXIKK1hNZXNhL0dMWCAob24gWGxpYikJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitPU01lc2EgKG9mZi1zY3JlZW4pCWltcGxlbWVudHMgT3BlbkdMIDIuMQorV2luZG93cy9XaW4zMgkJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitHbGlkZSAoM2RmeCBWb29kb28xLzIpCWltcGxlbWVudHMgT3BlbkdMIDEuMworU1ZHQQkJCXVuc3VwcG9ydGVkCitXaW5kIFJpdmVyIFVHTAkJdW5zdXBwb3J0ZWQKK0RKR1BQCQkJdW5zdXBwb3J0ZWQKK0dHSQkJCXVuc3VwcG9ydGVkCitCZU9TCQkJdW5zdXBwb3J0ZWQKK0FsbGVncm8JCQl1bnN1cHBvcnRlZAorRDNECQkJdW5zdXBwb3J0ZWQKKzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL3JlbG5vdGVzLTcuMC4yLmh0bWwgYi9kb2NzL3JlbG5vdGVzLTcuMC4yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3YzcwZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcmVsbm90ZXMtNy4wLjIuaHRtbApAQCAtMCwwICsxLDg4IEBACis8SFRNTD4KKworPFRJVExFPk1lc2EgUmVsZWFzZSBOb3RlczwvVElUTEU+CisKKzxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1lc2EuY3NzIj48L2hlYWQ+CisKKzxCT0RZPgorCis8Ym9keSBiZ2NvbG9yPSIjZWVlZWVlIj4KKworPEgxPk1lc2EgNy4wLjIgUmVsZWFzZSBOb3RlcyAvIE5vdmVtYmVyIDEwLCAyMDA3PC9IMT4KKworPHA+CitNZXNhIDcuMC4yIGlzIGEgc3RhYmxlIHJlbGVhc2Ugd2l0aCBidWcgZml4ZXMgc2luY2UgdmVyc2lvbiA3LjAuCis8L3A+CisKKworPGgyPk1ENSBjaGVja3N1bXM8L2gyPgorPHByZT4KK2M5Y2Y2MDdmMzZlN2U1MDE3MmY1ZjljN2Q1NTJjMzRlICBNZXNhTGliLTcuMC4yLnRhci5negorOTNlNmVkNzkyNGZmMDY5YTRmODgzYjRmY2U1MzQ5ZGMgIE1lc2FMaWItNy4wLjIudGFyLmJ6MgorMTBjMzI0YzM2MTNmOTBmMDU5Y2I4NDI5ZjcwMGYzMDAgIE1lc2FMaWItNy4wLjIuemlwCithYThiMTI0NGE1ZGUxZDIzZTU4MTRiZjliNjdmMTQzNSAgTWVzYURlbW9zLTcuMC4yLnRhci5negorMTFhMTA0MTBiYWU3YmU4NWNmMjViYzcxMTk5NjY0NjggIE1lc2FEZW1vcy03LjAuMi50YXIuYnoyCisxZGQwYjVmZDZkNjk0MzBhMmZkNzZhNmFkYmZkOGZmZiAgTWVzYURlbW9zLTcuMC4yLnppcAorYTdkYmYyNWMwMjU5NTU4NThiZDJkODlhNmViNmRiNGMgIE1lc2FHTFVULTcuMC4yLnRhci5negorM2EzM2Y4ZWZjOGM1OGE1OTJhODU0Y2ZjN2E2NDMyODYgIE1lc2FHTFVULTcuMC4yLnRhci5iejIKK2ViYTRlZjJhYThjMzYyZWFkODFiNTQzNTdmMTkwM2EzICBNZXNhR0xVVC03LjAuMi56aXAKKzwvcHJlPgorCisKKzxoMj5OZXcgZmVhdHVyZXM8L2gyPgorPHVsPgorPGxpPlVwZGF0ZWQgV2luZG93cyBWQzcgcHJvamVjdCBmaWxlcworPGxpPkFkZGVkIERFU1RESVIgdmFyaWFibGUgZm9yICdtYWtlIGluc3RhbGwnCis8bGk+QWRkZWQgcGtnLWNvbmZpZyBmaWxlcyBmb3IgZ2wsIGdsdSwgZ2x1dCBhbmQgZ2x3IGxpYnJhcmllcworPGxpPkFkZGVkIGJsdWVnZW5lLXhsYy1vc21lc2EgYW5kIGNhdGFtb3VudC1vc21lc2EtcGdpIGNvbmZpZ3MKKzxsaT5TdXBwb3J0IGZvciBJbnRlbCBHMzMvUTMzL1EzNSBncmFwaGljcyBjaGlwc2V0cworPC91bD4KKworPGgyPkJ1ZyBmaXhlczwvaDI+Cis8dWw+Cis8bGk+Rml4ZWQgYSB2ZXJ0ZXggYnVmZmVyIHdyYXBwaW5nIGlzc3VlIChidWcgOTk2MikKKzxsaT5BZGRlZCBtdXRleCBwcm90ZWN0aW9uIGFyb3VuZCB0ZXh0dXJlIG9iamVjdCByZWZlcmVuY2UgY291bnRlcnMKKzxsaT5BZGRlZCBjaGVja2luZy9zdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNoaXBzIGluIHRoZSBpOTE1L2k5NDUgZmFtaWx5Cisoc2VlIDExOTc4KQorPGxpPkZpeGVkIGEgYmxlbmRpbmcvYmFuZGluZyBpc3N1ZSAoYnVnIDExOTMxKQorPGxpPkZpeGVkIGEgR0xVIG1hdHJpeCBpbnZlcnNpb24gYnVnICgjNjc0OCkKKzxsaT5GaXhlZCBwcm9ibGVtIHdpdGggbGFyZ2UgZ2xEcmF3QXJyYXlzIGNhbGxzIGFuZCBpbmRpcmVjdCByZW5kZXJpbmcgKGJ1ZyAxMjE0MSkKKzxsaT5GaXhlZCBhbiBhc3NvcnRtZW50IG9mIGk5NjUgZHJpdmVyIGJ1Z3MKKzxsaT5GaXhlZCB4ODYtNjQgdmVydGV4IHRyYW5zZm9ybWF0aW9uIGJ1ZyAoMTIyMTYpCis8bGk+Rml4ZWQgWCBzZXJ2ZXIgY3Jhc2ggY2F1c2VkIGJ5IG11bHRpcGxlIGluZGlyZWN0IHJlbmRlcmluZyBjbGllbnRzCis8bGk+UGFyc2luZyBvZiBzdGF0ZS50ZXhnZW4gaW4gQVJCIHZlcnRleC9mcmFnbWVudCBwcm9ncmFtcyBkaWRuJ3Qgd29yayAoYnVnIDEyMzEzKQorPGxpPkZpeGVkIGEgZ2xDb3B5UGl4ZWxzL2dsUGl4ZWxab29tIGJ1ZyAoMTI0MTcpCis8bGk+Rml4ZWQgYSBidWcgd2hlbiB1c2luZyBnbE1hdGVyaWFsIGluIGRpc3BsYXkgbGlzdHMgKGJ1ZyAxMDYwNCkKKzxsaT5GaXhlZCBhIGZldyBHTFVUL0ZvcnRyYW4gaXNzdWVzIChCaWxsIE1pdGNoZWxsKQorPGxpPkZpeGVkIEJsZW5kZXIgY3Jhc2ggYnVnICgxMjE2NCkKKzxsaT5GaXhlZCBzb21lIGlzc3VlcyBwcmV2ZW50aW5nIGNyb3NzLWNvbXBpbGluZworPGxpPkZpeGVkIHVwIGJyb2tlbiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbCBleHRlbnNpb24KKzxsaT5nbERyYXdBcnJheXMoY291bnQ9MCkgbGVkIHRvIGEgY3Jhc2gKKzxsaT5GaXggU1NFIGNvZGUgZ2VuIG1lbW9yeSBsZWFrLCBwb3NzaWJsZSBjcmFzaAorPGxpPkZpeGVkIE1NWCA1NjUgcmdiIGNvbnZlcnNpb24gcHJvYmxlbSAoYnVnIDEyNjE0KQorPGxpPkFkZGVkIC1mbm8tc3RyaWN0LWFsaWFzaW5nIGFuZCAtZlBJQyBmbGFncyBmb3IgZ2NjCis8bGk+Rml4ZWQgQmxlbmRlciBjcmFzaCBpbiBVbmljaHJvbWUgZHJpdmVyIChidWcgMTMxNDIpCis8L3VsPgorCisKKzxoMj5Ecml2ZXIgU3RhdHVzPC9oMj4KKworPHByZT4KK0RyaXZlcgkJCVN0YXR1cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEUkkgZHJpdmVycwkJdmFyaWVzIHdpdGggdGhlIGRyaXZlcgorWE1lc2EvR0xYIChvbiBYbGliKQlpbXBsZW1lbnRzIE9wZW5HTCAyLjEKK09TTWVzYSAob2ZmLXNjcmVlbikJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitXaW5kb3dzL1dpbjMyCQlpbXBsZW1lbnRzIE9wZW5HTCAyLjEKK0dsaWRlICgzZGZ4IFZvb2RvbzEvMikJaW1wbGVtZW50cyBPcGVuR0wgMS4zCitTVkdBCQkJdW5zdXBwb3J0ZWQKK1dpbmQgUml2ZXIgVUdMCQl1bnN1cHBvcnRlZAorREpHUFAJCQl1bnN1cHBvcnRlZAorR0dJCQkJdW5zdXBwb3J0ZWQKK0JlT1MJCQl1bnN1cHBvcnRlZAorQWxsZWdybwkJCXVuc3VwcG9ydGVkCitEM0QJCQl1bnN1cHBvcnRlZAorPC9wcmU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvcmVsbm90ZXMtNy4wLjMuaHRtbCBiL2RvY3MvcmVsbm90ZXMtNy4wLjMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzhlZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9yZWxub3Rlcy03LjAuMy5odG1sCkBAIC0wLDAgKzEsODQgQEAKKzxIVE1MPgorCis8VElUTEU+TWVzYSBSZWxlYXNlIE5vdGVzPC9USVRMRT4KKworPGhlYWQ+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ibWVzYS5jc3MiPjwvaGVhZD4KKworPEJPRFk+CisKKzxib2R5IGJnY29sb3I9IiNlZWVlZWUiPgorCis8SDE+TWVzYSA3LjAuMyBSZWxlYXNlIE5vdGVzIC8gQXByaWwgNCwgMjAwODwvSDE+CisKKzxwPgorTWVzYSA3LjAuMyBpcyBhIHN0YWJsZSByZWxlYXNlIHdpdGggYnVnIGZpeGVzIHNpbmNlIHZlcnNpb24gNy4wLjIuCis8L3A+CisKKworPGgyPk1ENSBjaGVja3N1bXM8L2gyPgorPHByZT4KKzNmZDFjYjc2NTMxYjI1MTVlZjdkYjkyZDlhOTNkYmY4ICBNZXNhTGliLTcuMC4zLnRhci5negorZTZlNjM3OWQ3NzkzYWY0MGE2YmMzY2UxYmFjZTU3MmUgIE1lc2FMaWItNy4wLjMudGFyLmJ6MgorOTc4ODJiYWMxOTUyMjllZTBiNzhjYWI4MmUwZTNiZTEgIE1lc2FMaWItNy4wLjMuemlwCis4YWJmNmJiY2IxNjYxZTdkZDRjZTczYjNmYmI4NTg5OCAgTWVzYURlbW9zLTcuMC4zLnRhci5negorNDdmZDY4NjM2MjFkM2M5YzdkYmI4NzBhYjdmMGMzMDMgIE1lc2FEZW1vcy03LjAuMy50YXIuYnoyCis5OWU0NDJlMTRkYTE5MjhmNzZhNzI5N2JiNDIxYTNhZiAgTWVzYURlbW9zLTcuMC4zLnppcAorMmI1MGZlOWZhZGM0NzA5YjU3YzUyYWRlZjA5ZmNlM2MgIE1lc2FHTFVULTcuMC4zLnRhci5negorMGZmMjNjNGU5MWIyMzhhYmFlNjNhNWZjOWZhMDAzZTcgIE1lc2FHTFVULTcuMC4zLnRhci5iejIKKzcwZTgzNTU0YTQ0NjJkYWQyOGUwZDZlMjBmNzlhYWRhICBNZXNhR0xVVC03LjAuMy56aXAKKzwvcHJlPgorCisKKzxoMj5CdWcgZml4ZXM8L2gyPgorPHVsPgorPGxpPkFkZGVkIG1pc3NpbmcgZ2x3LnBjLmluIGZpbGUgdG8gcmVsZWFzZSB0YXJiYWxsCis8bGk+Rml4IEdMVVQvRm9ydHJhbiBpc3N1ZXMKKzxsaT5HTFNMIGdsX0Zyb250TGlnaHRNb2RlbFByb2R1Y3Quc2NlbmVDb2xvciB2YXJpYWJsZSB3YXNuJ3QgZGVmaW5lZAorPGxpPkZpeCBjcmFzaCB1cG9uIEdMU0wgdmFyaWFibGUgYXJyYXkgaW5kZXhlcyAobm90IHlldCBzdXBwb3J0ZWQpCis8bGk+VHdvLXNpZGVkIHN0ZW5jaWwgdGVzdCBkaWRuJ3Qgd29yayBpbiBzb2Z0d2FyZSByZW5kZXJpbmcKKzxsaT5GaXggdHdvLXNpZGVkIGxpZ2h0aW5nIGJ1Z3MvY3Jhc2hlcyAoYnVnIDEzMzY4KQorPGxpPkdMU0wgZ2xfRnJvbnRGYWNpbmcgZGlkbid0IHdvcmsgcHJvcGVybHkKKzxsaT5nbEdldEFjdGl2ZVVuaWZvcm0gcmV0dXJuZWQgaW5jb3JyZWN0IHNpemVzIChidWcgMTM3NTEpCis8bGk+Rml4IHNldmVyYWwgYnVncyByZWxhdGluZyB0byB1bmlmb3JtcyBhbmQgYXR0cmlidXRlcyBpbiBHTFNMIEFQSSAoQnJ1Y2UgTWVycnksIGJ1ZyAxMzc1MykKKzxsaT5nbFRleEltYWdlM0QoR0xfUFJPWFlfVEVYVFVSRV8zRCkgbWlzLXNldCB0ZXhpbWFnZSBkZXB0aCBmaWVsZAorPGxpPkZpeGVkIEdMWCBpbmRpcmVjdCB2ZXJ0ZXggYXJyYXkgcmVuZGVyaW5nIGJ1ZyAoMTQxOTcpCis8bGk+Rml4ZWQgY3Jhc2ggd2hlbiBkZWxldGluZyBmcmFtZWJ1ZmZlciBvYmplY3RzIChidWdzIDEzNTA3LCAxNDI5MykKKzxsaT5Vc2VyLWRlZmluZWQgY2xpcCBwbGFuZXMgZW5hYmxlZCBmb3IgUjMwMCAoYnVnIDk4NzEpCis8bGk+Rml4ZWQgZ2xCaW5kVGV4dHVyZSgpIGNyYXNoIHVwb24gYmFkIHRhcmdldCAoYnVnIDE0NTE0KQorPGxpPkZpeGVkIHBvdGVudGlhbCBjcmFzaCBpbiBnbERyYXdQaXhlbHMoR0xfREVQVEhfQ09NUE9ORU5UKSAoYnVnIDEzOTE1KQorPGxpPkJhZCBzdHJpbmdzIGdpdmVuIHRvIGdsUHJvZ3JhbVN0cmluZ0FSQigpIGRpZG4ndCBnZW5lcmF0ZSBHTF9JTlZBTElEX09QRVJBVElPTgorPGxpPkZpeGVkIG1pbm9yIHBvaW50IHJhc3Rlcml6YXRpb24gcmVncmVzc2lvbiAoYnVnIDExMDE2KQorPGxpPnN0YXRlLnRleGVudi5jb2xvciBzdGF0ZSB2YXIgZGlkbid0IHdvcmsgaW4gR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0gKGJ1ZyAxNDkzMSkKKzxsaT5nbEJpdG1hcCBmcm9tIGEgUEJPIGRpZG4ndCBhbHdheXMgd29yaworPGxpPmdsR2V0VGV4SW1hZ2UgaW50byBhIFBCTyBkaWRuJ3QgYWx3YXlzIHdvcmsKKzxsaT5Db21tZW50cyBhdCB0aGUgZW5kIG9mIEFSQiB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbXMgY3Jhc2hlZCB0aGUgcGFyc2VyCis8L3VsPgorCis8aDI+Q2hhbmdlczwvaDI+Cis8dWw+Cis8bGk+VXBkYXRlZCBnbGV4dC5oIHRvIHZlcnNpb24gNDAKKzwvdWw+CisKKworCis8aDI+RHJpdmVyIFN0YXR1czwvaDI+CisKKzxwcmU+CitEcml2ZXIJCQlTdGF0dXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRFJJIGRyaXZlcnMJCXZhcmllcyB3aXRoIHRoZSBkcml2ZXIKK1hNZXNhL0dMWCAob24gWGxpYikJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitPU01lc2EgKG9mZi1zY3JlZW4pCWltcGxlbWVudHMgT3BlbkdMIDIuMQorV2luZG93cy9XaW4zMgkJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitHbGlkZSAoM2RmeCBWb29kb28xLzIpCWltcGxlbWVudHMgT3BlbkdMIDEuMworU1ZHQQkJCXVuc3VwcG9ydGVkCitXaW5kIFJpdmVyIFVHTAkJdW5zdXBwb3J0ZWQKK0RKR1BQCQkJdW5zdXBwb3J0ZWQKK0dHSQkJCXVuc3VwcG9ydGVkCitCZU9TCQkJdW5zdXBwb3J0ZWQKK0FsbGVncm8JCQl1bnN1cHBvcnRlZAorRDNECQkJdW5zdXBwb3J0ZWQKKzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL3JlbG5vdGVzLTcuMC40Lmh0bWwgYi9kb2NzL3JlbG5vdGVzLTcuMC40Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwMGQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcmVsbm90ZXMtNy4wLjQuaHRtbApAQCAtMCwwICsxLDgwIEBACis8SFRNTD4KKworPFRJVExFPk1lc2EgUmVsZWFzZSBOb3RlczwvVElUTEU+CisKKzxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Im1lc2EuY3NzIj48L2hlYWQ+CisKKzxCT0RZPgorCis8Ym9keSBiZ2NvbG9yPSIjZWVlZWVlIj4KKworPEgxPk1lc2EgNy4wLjQgUmVsZWFzZSBOb3RlcyAvIEF1Z3VzdCAxNiwgMjAwODwvSDE+CisKKzxwPgorTWVzYSA3LjAuNCBpcyBhIHN0YWJsZSByZWxlYXNlIHdpdGggYnVnIGZpeGVzIHNpbmNlIHZlcnNpb24gNy4wLjMuCis8L3A+CisKKworPGgyPk1ENSBjaGVja3N1bXM8L2gyPgorPHByZT4KKzkwOWFmYTNhMDFhZTMxNDc4ZDM2MzgzNzY4MTQxNWFjICBNZXNhTGliLTcuMC40LnRhci5negorOGQ3YmFjYmUwMjM0NzQyYTVkMDhjODA4OGM0NjE5ZTkgIE1lc2FMaWItNy4wLjQudGFyLmJ6MgorNWU0NDI2MWVmODViMDQ5YTg2OGUxNzg1ZDlhZGMyNzYgIE1lc2FMaWItNy4wLjQuemlwCis1M2RjZDc3ZDM3YTgxOWZlYWY1MGI1ZmNkZDBhNmUwZiAgTWVzYURlbW9zLTcuMC40LnRhci5negorYzEyMTViMzFjNWY3Yjg1ZjgxZWVkM2JmYmEwN2Q1NTYgIE1lc2FEZW1vcy03LjAuNC50YXIuYnoyCitiMTgyNWE3MzYxZjExNmIyOGQ4MmQzMjgwNzc2MzBiNCAgTWVzYURlbW9zLTcuMC40LnppcAorZDc2NzdkMDE1ZjUyNjAyZDFiZjhiODM3ZmI3MTc4NDggIE1lc2FHTFVULTcuMC40LnRhci5negorZjVmOGI0NmY3ZTc2M2Q5ZjdiN2QxZDExNWMxYzQ0ZWUgIE1lc2FHTFVULTcuMC40LnRhci5iejIKK2E3ODY3NzUyNzFhMDJjNjJhMzM3MGIxM2IyNmJmNDhkICBNZXNhR0xVVC03LjAuNC56aXAKKzwvcHJlPgorCisKKzxoMj5CdWcgZml4ZXM8L2gyPgorPHVsPgorPGxpPmRlZmluZSAjZXh0ZW5zaW9uIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSBpbiBzaGFkaW5nIGxhbmd1YWdlCis8bGk+Zml4ZWQgV0lOMzIgY29tcGlsZSBwcm9ibGVtIGluIGxpYkdMVQorPGxpPkZpeGVkIGEgcGVyLXZlcnRleCBnbE1hdGVyaWFsIGJ1ZyB3aGljaCBjb3VsZCBjYXVzZSBiYWQgbGlnaHRpbmcKKzxsaT5GaXhlZCBwb3RlbnRpYWwgY3Jhc2ggaW4gQUEvc21vb3RoZWQgdHJpYW5nbGUgcmVuZGVyaW5nIHdoZW4gdXNpbmcgYSBmcmFnbWVudCBzaGFkZXIKKzxsaT5GaXhlZCBnbERyYXdFbGVtZW50ICsgVkJPIHNlZ2ZhdWx0IChidWcgMTYxNTYpCis8bGk+Rml4ZWQgR0xTTCBsaW5rZXIgYnVnIGNhdXNpbmcgZ2VuZXJpYyB2ZXJ0ZXggYXR0cmlidXRlcyB0byBnZXQgYWxpYXNlZAorPGxpPkZpeGVkIHN0YWNrIG92ZXJmbG93IHdoZW4gdXNpbmcgZ2xQaXhlbFpvb20gb24gV2luZG93cworPGxpPkZpeGVkIGJyb2tlbiBhbGwoYnZlYzIpIEdMU0wgZnVuY3Rpb24sIGFkZGVkIG1pc2MgbWlzc2luZyBidmVjIGNvbnN0cnVjdG9ycworPGxpPkFSQiBwcm9ncmFtICJzdGF0ZS5jbGlwW25dLnBsYW5lIiBkaWRuJ3QgcGFyc2UgY29ycmVjdGx5Cis8bGk+Rml4ZWQgYnJva2VuIGdsR2V0VW5pZm9ybWl2KCkgKGJ1ZyAxMzc3NCkKKzwvdWw+CisKKzxoMj5DaGFuZ2VzPC9oMj4KKzx1bD4KKzxsaT5JbmNsdWRpbmcgdGhlIGxhdGVzdCBnbGV4dC5oIGFuZCBnbHhleHQuaCBoZWFkZXIgZmlsZXMgZnJvbSBLaHJvbm9zCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgRHJhZ29uRmx5IE9TCis8bGk+QWRkZWQgYSBidWlsZCBjb25maWcgZm9yIEZyZWVCU0Qgc3RhdGljIGxpYnMgKEFuYXRvbGlqIFNoa29kaW4pCis8bGk+RW5hYmxlZCBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgZXh0ZW5zaW9uIGluIFIyMDAvUjMwMCBkcml2ZXJzCis8bGk+RW5hYmxlZCBHTF9BUkJfcG9pbnRfc3ByaXRlIGV4dGVuc2lvbiBpbiBJOTY1IGRyaXZlcgorPGxpPkVuYWJsZWQgR0xfRVhUX3RleHR1cmVfc1JHQiBleHRlbnNpb24gaW4gSTk2NSBkcml2ZXIKKzxsaT5BZGRlZCBzdXBwb3J0IGZvciBHTCBzaGFkaW5nIGxhbmd1YWdlIGluIEk5NjUgZHJpdmVyCis8L3VsPgorCisKKworCis8aDI+RHJpdmVyIFN0YXR1czwvaDI+CisKKzxwcmU+CitEcml2ZXIJCQlTdGF0dXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRFJJIGRyaXZlcnMJCXZhcmllcyB3aXRoIHRoZSBkcml2ZXIKK1hNZXNhL0dMWCAob24gWGxpYikJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitPU01lc2EgKG9mZi1zY3JlZW4pCWltcGxlbWVudHMgT3BlbkdMIDIuMQorV2luZG93cy9XaW4zMgkJaW1wbGVtZW50cyBPcGVuR0wgMi4xCitHbGlkZSAoM2RmeCBWb29kb28xLzIpCWltcGxlbWVudHMgT3BlbkdMIDEuMworU1ZHQQkJCXVuc3VwcG9ydGVkCitXaW5kIFJpdmVyIFVHTAkJdW5zdXBwb3J0ZWQKK0RKR1BQCQkJdW5zdXBwb3J0ZWQKK0dHSQkJCXVuc3VwcG9ydGVkCitCZU9TCQkJdW5zdXBwb3J0ZWQKK0FsbGVncm8JCQl1bnN1cHBvcnRlZAorRDNECQkJdW5zdXBwb3J0ZWQKKzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL3JlbG5vdGVzLTcuMS5odG1sIGIvZG9jcy9yZWxub3Rlcy03LjEuaHRtbAppbmRleCBkNWQyODU4Li5hYmNiYzMxIDEwMDY0NAotLS0gYS9kb2NzL3JlbG5vdGVzLTcuMS5odG1sCisrKyBiL2RvY3MvcmVsbm90ZXMtNy4xLmh0bWwKQEAgLTgsMTAgKzgsMTMgQEAKIAogPGJvZHkgYmdjb2xvcj0iI2VlZWVlZSI+CiAKLTxIMT5NZXNhIDcuMSBSZWxlYXNlIE5vdGVzIC8gKDxlbT5pbiBwcm9ncmVzczwvZW0+KTwvSDE+Cis8SDE+TWVzYSA3LjEgUmVsZWFzZSBOb3RlcyAvIE1heSBYWCwgMjAwODwvSDE+CiAKIDxwPgogTWVzYSA3LjEgaXMgYSBuZXcgZGV2ZWxvcG1lbnQgcmVsZWFzZS4KK1RoZXJlIGhhdmUgYmVlbiBtYW55IGludGVybmFsIGNvZGUgY2hhbmdlcyBzaW5jZSBNZXNhIDcuMC54LgorSXQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgc3RhYmxlLCBidXQgdGhvc2Ugd2hvIGFyZSBlc3BlY2lhbGx5IGNvbmNlcm5lZCBhYm91dAorc3RhYmlsaXR5IHNob3VsZCB3YWl0IGZvciBNZXNhIDcuMi4KIDwvcD4KIAogCkBAIC0yMywxNyArMjYsMTcgQEAKIAogPGgyPk5ldyBmZWF0dXJlczwvaDI+CiA8dWw+Cis8bGk+YXV0b2NvbmYtYmFzZWQgY29uZmlndXJhdGlvbiAoYW5kIGNsZWFuLXVwIG9mIE1ha2VmaWxlcykKKzxsaT5SZWR1Y2VkIGRlcGVuZGVuY2llcyBiZXR3ZWVuIFggc2VydmVyIGFuZCBNZXNhCiA8bGk+R0xfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgZXh0ZW5zaW9uIGZvciBYbGliIGRyaXZlcgorPGxpPlN1cHBvcnQgZm9yIHRoZSBHTCBzaGFkaW5nIGxhbmd1YWdlIHdpdGggaTk2NSBkcml2ZXIgKGltcGxlbWVudGVkIGJ5IEludGVsKQogPC91bD4KIAogCiA8aDI+QnVnIGZpeGVzPC9oMj4KIDx1bD4KLTwvdWw+Ci0KLQotPGgyPkludGVybmFsIGNvZGUgY2hhbmdlczwvaDI+Ci08dWw+Cis8bGk+TnVtZXJvdXMgR0xTTCBmaXhlcworPGxpPkZpeGVkIHNvbWUgZXJyb3IgY29kZS9kZXRlY3Rpb24gYnVncyBpbiB0aGUgR0xTTC1yZWxhdGVkIEFQSSBmdW5jdGlvbnMKIDwvdWw+CiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9yZWxub3Rlcy5odG1sIGIvZG9jcy9yZWxub3Rlcy5odG1sCmluZGV4IDczYmFlODUuLmUzMDU5NzcgMTAwNjQ0Ci0tLSBhL2RvY3MvcmVsbm90ZXMuaHRtbAorKysgYi9kb2NzL3JlbG5vdGVzLmh0bWwKQEAgLTIxLDYgKzIxLDEwIEBACiAKIDxVTD4KIDxMST48QSBIUkVGPSJyZWxub3Rlcy03LjEuaHRtbCI+Ny4xIHJlbGVhc2Ugbm90ZXM8L0E+Cis8TEk+PEEgSFJFRj0icmVsbm90ZXMtNy4wLjQuaHRtbCI+Ny4wLjQgcmVsZWFzZSBub3RlczwvQT4KKzxMST48QSBIUkVGPSJyZWxub3Rlcy03LjAuMy5odG1sIj43LjAuMyByZWxlYXNlIG5vdGVzPC9BPgorPExJPjxBIEhSRUY9InJlbG5vdGVzLTcuMC4yLmh0bWwiPjcuMC4yIHJlbGVhc2Ugbm90ZXM8L0E+Cis8TEk+PEEgSFJFRj0icmVsbm90ZXMtNy4wLjEuaHRtbCI+Ny4wLjEgcmVsZWFzZSBub3RlczwvQT4KIDxMST48QSBIUkVGPSJyZWxub3Rlcy03LjAuaHRtbCI+Ny4wIHJlbGVhc2Ugbm90ZXM8L0E+CiA8TEk+PEEgSFJFRj0icmVsbm90ZXMtNi41LjMuaHRtbCI+Ni41LjMgcmVsZWFzZSBub3RlczwvQT4KIDxMST48QSBIUkVGPSJyZWxub3Rlcy02LjUuMi5odG1sIj42LjUuMiByZWxlYXNlIG5vdGVzPC9BPgpkaWZmIC0tZ2l0IGEvZG9jcy9yZXBvc2l0b3J5Lmh0bWwgYi9kb2NzL3JlcG9zaXRvcnkuaHRtbAppbmRleCAzOWY1ZGE0Li5lZDM4NTI4IDEwMDY0NAotLS0gYS9kb2NzL3JlcG9zaXRvcnkuaHRtbAorKysgYi9kb2NzL3JlcG9zaXRvcnkuaHRtbApAQCAtODUsNiArODUsMjcgQEAKIDwvb2w+CiAKIAorPEgyPldpbmRvd3MgVXNlcnM8L0gyPgorCis8cD4KK0lmIHlvdSdyZSA8YSBocmVmPSJodHRwOi8vZ2l0Lm9yLmN6L2dpdHdpa2kvV2luZG93c0luc3RhbGwiIHRhcmdldD0iX3BhcmVudCI+Cit1c2luZyBnaXQgb24gV2luZG93czwvYT4geW91J2xsIHdhbnQgdG8gZW5hYmxlIGF1dG9tYXRpYyBDUi9MRiBjb252ZXJzaW9uIGluCit5b3VyIGxvY2FsIGNvcHkgb2YgdGhlIHJlcG9zaXRvcnk6Cis8L3A+Cis8cHJlPgorICAgZ2l0IGNvbmZpZyAtLWdsb2JhbCBjb3JlLmF1dG9jcmxmIHRydWUKKzwvcHJlPgorCis8cD4KK1RoaXMgd2lsbCBjYXVzZSBnaXQgdG8gY29udmVydCBhbGwgdGV4dCBmaWxlcyB0byBDUitMRiBvbiBjaGVja291dCwKK2FuZCB0byBMRiBvbiBjb21taXQuCis8L3A+Cis8cD4KK1VuaXggdXNlcnMgZG9uJ3QgbmVlZCB0byBzZXQgdGhpcyBvcHRpb24uCis8L3A+Cis8YnI+CisKKwogPGEgbmFtZT0iZGV2ZWxvcGVyIj4KIDxIMj5EZXZlbG9wbWVudCBCcmFuY2hlczwvSDI+CiAKZGlmZiAtLWdpdCBhL2RvY3Mvc2hhZGluZy5odG1sIGIvZG9jcy9zaGFkaW5nLmh0bWwKaW5kZXggMGUxYTVlMS4uMmNkMTdjNyAxMDA2NDQKLS0tIGEvZG9jcy9zaGFkaW5nLmh0bWwKKysrIGIvZG9jcy9zaGFkaW5nLmh0bWwKQEAgLTI1LDkgKzI1LDEwIEBACiA8bGk+PGEgaHJlZj0iI3Vuc3VwIj5VbnN1cHBvcnRlZCBGZWF0dXJlczwvYT4KIDxsaT48YSBocmVmPSIjbm90ZXMiPkltcGxlbWVudGF0aW9uIE5vdGVzPC9hPgogPGxpPjxhIGhyZWY9IiNoaW50cyI+UHJvZ3JhbW1pbmcgSGludHM8L2E+Ci08bGk+PGEgaHJlZj0iI3N0YW5kYWxvbmUiPlN0YW5kLWFsb25lIENvbXBpbGVyPC9hPgorPGxpPjxhIGhyZWY9IiNzdGFuZGFsb25lIj5TdGFuZC1hbG9uZSBHTFNMIENvbXBpbGVyPC9hPgogPGxpPjxhIGhyZWY9IiNpbXBsZW1lbnRhdGlvbiI+Q29tcGlsZXIgSW1wbGVtZW50YXRpb248L2E+CiA8bGk+PGEgaHJlZj0iI3ZhbGlkYXRpb24iPkNvbXBpbGVyIFZhbGlkYXRpb248L2E+Cis8bGk+PGEgaHJlZj0iIzEyMCI+R0xTTCAxLjIwIHN1cHBvcnQ8L2E+CiA8L3VsPgogCiAKQEAgLTQ4LDYgKzQ5LDcgQEAKIDxsaT5UaGUgaW52ZXJzZSB0cmlnIGZ1bmN0aW9ucyBhc2luKCksIGFjb3MoKSwgYW5kIGF0YW4oKSBhcmUgbm90IGltcGxlbWVudGVkCiA8bGk+VGhlIGdsX0NvbG9yIGFuZCBnbF9TZWNvbmRhcnlDb2xvciB2YXJ5aW5nIHZhcnMgYXJlIGludGVycG9sYXRlZAogICAgIHdpdGhvdXQgcGVyc3BlY3RpdmUgY29ycmVjdGlvbgorPGxpPkZsb2F0aW5nIHBvaW50IGxpdGVyYWwgc3VmZml4ZXMgJ2YnIGFuZCAnRicgYXJlbid0IGFsbG93ZWQuCiA8L3VsPgogCiA8cD4KQEAgLTEzMiw3ICsxMzQsNyBAQAogCiAKIDxhIG5hbWU9InN0YW5kYWxvbmUiPgotPGgyPlN0YW5kLWFsb25lIENvbXBpbGVyPC9oMj4KKzxoMj5TdGFuZC1hbG9uZSBHTFNMIENvbXBpbGVyPC9oMj4KIAogPHA+CiBBIHVuaXF1ZSBzdGFuZC1hbG9uZSBHTFNMIGNvbXBpbGVyIGRyaXZlciBoYXMgYmVlbiBhZGRlZCB0byBNZXNhLgpAQCAtMTU0LDEyICsxNTYsMTAgQEAKIDwvdWw+CiAKIDxwPgotVG8gYnVpbGQgdGhlIGdsc2xjb21waWxlciBwcm9ncmFtICh0aGlzIHdpbGwgYmUgaW1wcm92ZWQgc29tZWRheSk6CitBZnRlciBidWlsZGluZyBNZXNhLCB0aGUgZ2xzbGNvbXBpbGVyIGNhbiBiZSBidWlsdCBieSBtYW51YWxseSBydW5uaW5nOgogPC9wPgogPHByZT4KLSAgICBjZCBzcmMvbWVzYQotICAgIG1ha2UgbGlibWVzYS5hCi0gICAgY2QgZHJpdmVycy9nbHNsY29tcGlsZXIKKyAgICBjZCBzcmMvbWVzYS9kcml2ZXJzL2dsc2xjb21waWxlcgogICAgIG1ha2UKIDwvcHJlPgogCkBAIC0xNjksMjAgKzE2OSwzMSBAQAogZW1pdCBHTF9BUkJfdmVydGV4X3Byb2dyYW0tc3R5bGUgaW5zdHJ1Y3Rpb25zOgogPC9wPgogPHByZT4KLSAgICBnbHNsY29tcGlsZXIgLS1hcmIgLS1saW5lbnVtYmVycyAtLXZzIHZlcnRzaGFkZXIudHh0CisgICAgYmluL2dsc2xjb21waWxlciAtLWRlYnVnIC0tbnVtYmVycyAtLWZzIHByb2dzL2dsc2wvQ0gwNi1icmljay5mcmFnLnR4dAogPC9wcmU+CiA8cD4KLVRoZSBvdXRwdXQgbWF5IGxvb2sgc2ltaWxhciB0byB0aGlzOgorcmVzdWx0cyBpbjoKIDwvcD4KIDxwcmU+Ci0hIUFSQnZwMS4wCi0gIDA6IE1PViByZXN1bHQudGV4Y29vcmRbMF0sIHZlcnRleC50ZXhjb29yZFswXTsKLSAgMTogRFA0IHRlbXAwLngsIHN0YXRlLm1hdHJpeC5tdnAucm93WzBdLCB2ZXJ0ZXgucG9zaXRpb247Ci0gIDI6IERQNCB0ZW1wMC55LCBzdGF0ZS5tYXRyaXgubXZwLnJvd1sxXSwgdmVydGV4LnBvc2l0aW9uOwotICAzOiBEUDQgdGVtcDAueiwgc3RhdGUubWF0cml4Lm12cC5yb3dbMl0sIHZlcnRleC5wb3NpdGlvbjsKLSAgNDogRFA0IHRlbXAwLncsIHN0YXRlLm1hdHJpeC5tdnAucm93WzNdLCB2ZXJ0ZXgucG9zaXRpb247Ci0gIDU6IE1PViByZXN1bHQucG9zaXRpb24sIHRlbXAwOwotICA2OiBFTkQKKyMgRnJhZ21lbnQgUHJvZ3JhbS9TaGFkZXIKKyAgMDogUkNQIFRFTVBbNF0ueCwgVU5JRk9STVsyXS54eHh4OworICAxOiBSQ1AgVEVNUFs0XS55LCBVTklGT1JNWzJdLnl5eXk7CisgIDI6IE1VTCBURU1QWzNdLnh5LCBWQVJZSU5HWzBdLCBURU1QWzRdOworICAzOiBNT1YgVEVNUFsxXSwgVEVNUFszXTsKKyAgNDogTVVMIFRFTVBbMF0udywgVEVNUFsxXS55eXl5LCBDT05TVFs0XS54eHh4OworICA1OiBGUkMgVEVNUFsxXS56LCBURU1QWzBdLnd3d3c7CisgIDY6IFNHVC5DIFRFTVBbMF0udywgVEVNUFsxXS56enp6LCBDT05TVFs0XS54eHh4OworICA3OiBJRiAoTkUud3d3dyk7ICMgKGlmIGZhbHNlLCBnb3RvIDkpOworICA4OiAgICBBREQgVEVNUFsxXS54LCBURU1QWzFdLnh4eHgsIENPTlNUWzRdLnh4eHg7CisgIDk6IEVORElGOworIDEwOiBGUkMgVEVNUFsxXS54eSwgVEVNUFsxXTsKKyAxMTogU0dUIFRFTVBbMl0ueHksIFVOSUZPUk1bM10sIFRFTVBbMV07CisgMTI6IE1VTCBURU1QWzFdLnosIFRFTVBbMl0ueHh4eCwgVEVNUFsyXS55eXl5OworIDEzOiBMUlAgVEVNUFswXSwgVEVNUFsxXS56enp6LCBVTklGT1JNWzBdLCBVTklGT1JNWzFdOworIDE0OiBNVUwgVEVNUFswXS54eXosIFRFTVBbMF0sIFZBUllJTkdbMV0ueHh4eDsKKyAxNTogTU9WIE9VVFBVVFswXS54eXosIFRFTVBbMF07CisgMTY6IE1PViBPVVRQVVRbMF0udywgQ09OU1RbNF0ueXl5eTsKKyAxNzogRU5ECiA8L3ByZT4KIAogPHA+CkBAIC0zMDgsNSArMzE5LDM5IEBACiA8L3A+CiAKIAorCis8YSBuYW1lPSIxMjAiPgorPGgyPkdMU0wgMS4yMCBzdXBwb3J0PC9oMj4KKworPHA+CitTdXBwb3J0IGZvciBHTFNMIHZlcnNpb24gMS4yMCBpcyB1bmRlcndheS4gIFN0YXR1cyBhcyBmb2xsb3dzLgorPC9wPgorCis8aDM+U3VwcG9ydGVkPC9oMz4KKzx1bD4KKzxsaT48Y29kZT5tYXQyeDMsIG1hdDJ4NDwvY29kZT4sIGV0Yy4gdHlwZXMgYW5kIGZ1bmN0aW9ucworPGxpPjxjb2RlPnRyYW5zcG9zZSgpLCBvdXRlclByb2R1Y3QoKSwgbWF0cml4Q29tcE11bHQoKTwvY29kZT4gZnVuY3Rpb25zCisoYnV0IHVudGVzdGVkKQorPGxpPnByZWNpc2lvbiBxdWFsaWZpZXJzIChsb3dwLCBtZWRpdW1wLCBoaWdocCkKKzwvdWw+CisKKzxoMz5QYXJ0aWFsbHkgQ29tcGxldGU8L2gzPgorPHVsPgorPGxpPjxjb2RlPmludmFyaWFudDwvY29kZT4gcXVhbGlmaWVyCis8L3VsPgorCis8aDM+Tm90IENvbXBsZXRlZDwvaDM+Cis8dWw+Cis8bGk+PGNvZGU+YXJyYXkubGVuZ3RoKCk8L2NvZGU+IG1ldGhvZAorPGxpPjxjb2RlPmZsb2F0WzVdIGE7PC9jb2RlPiBhcnJheSBzeW50YXgKKzxsaT48Y29kZT5jZW50cm9pZDwvY29kZT4gcXVhbGlmaWVyCis8bGk+dW5zaXplZCBhcnJheSBjb25zdHJ1Y3RvcnMKKzxsaT5pbml0aWFsaXplcnMgZm9yIHVuaWZvcm1zCis8bGk+Y29uc3QgaW5pdGlhbGl6ZXJzIGNhbGxpbmcgYnVpbHQtaW4gZnVuY3Rpb25zCis8L3VsPgorCisKKworCiA8L0JPRFk+CiA8L0hUTUw+CmRpZmYgLS1naXQgYS9kb3h5Z2VuL01ha2VmaWxlIGIvZG94eWdlbi9NYWtlZmlsZQppbmRleCBkOGRkNTU1Li4xNWFkZTQwIDEwMDY0NAotLS0gYS9kb3h5Z2VuL01ha2VmaWxlCisrKyBiL2RveHlnZW4vTWFrZWZpbGUKQEAgLTI5LDUgKzI5LDUgQEAKIAkkKGZvcmVhY2ggRklMRSwkKFNVQlNFVCksZG94eWdlbiAkKEZJTEUpOykKIAogY2xlYW46Ci0Jcm0gLXJmICQoRlVMTDouZG94eT0pICQoU1VCU0VUOi5kb3h5PSkKLQlybSAtcmYgKi50YWcKKwktcm0gLXJmICQoRlVMTDouZG94eT0pICQoU1VCU0VUOi5kb3h5PSkKKwktcm0gLXJmICoudGFnCmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML2Zvb21lc2EuaCBiL2luY2x1ZGUvR0wvZm9vbWVzYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE3ZDg4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvR0wvZm9vbWVzYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICAzLjAKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4ICBCcmlhbiBQYXVsCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotCi0vKgotICogRXhhbXBsZSBGb28vTWVzYSBpbnRlcmZhY2UuICBTZWUgc3JjL2Rkc2FtcGxlLmMgZm9yIG1vcmUgaW5mby4KLSAqLwotCi0KLQotI2lmbmRlZiBGT09NRVNBX0gKLSNkZWZpbmUgRk9PTUVTQV9ICi0KLQotCi10eXBlZGVmIHN0cnVjdCBmb29fbWVzYV92aXN1YWwgICpGb29NZXNhVmlzdWFsOwotCi10eXBlZGVmIHN0cnVjdCBmb29fbWVzYV9idWZmZXIgICpGb29NZXNhQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdCBmb29fbWVzYV9jb250ZXh0ICpGb29NZXNhQ29udGV4dDsKLQotCi0KLSNpZmRlZiBCRU9TCi0jcHJhZ21hIGV4cG9ydCBvbgotI2VuZGlmCi0KLQotZXh0ZXJuIEZvb01lc2FWaXN1YWwgRm9vTWVzYUNob29zZVZpc3VhbCggLyogeW91ciBwYXJhbXMgKi8gKTsKLQotZXh0ZXJuIHZvaWQgRm9vTWVzYURlc3Ryb3lWaXN1YWwoIEZvb01lc2FWaXN1YWwgdmlzdWFsICk7Ci0KLQotZXh0ZXJuIEZvb01lc2FCdWZmZXIgRm9vTWVzYUNyZWF0ZUJ1ZmZlciggRm9vTWVzYVZpc3VhbCB2aXN1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp5b3VyX3dpbmRvd19pZCApOwotCi1leHRlcm4gdm9pZCBGb29NZXNhRGVzdHJveUJ1ZmZlciggRm9vTWVzYUJ1ZmZlciBidWZmZXIgKTsKLQotCi1leHRlcm4gRm9vTWVzYUNvbnRleHQgRm9vTWVzYUNyZWF0ZUNvbnRleHQoIEZvb01lc2FWaXN1YWwgdmlzdWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb29NZXNhQ29udGV4dCBzaGFyZWxpc3QgKTsKLQotZXh0ZXJuIHZvaWQgRm9vTWVzYURlc3Ryb3lDb250ZXh0KCBGb29NZXNhQ29udGV4dCBjb250ZXh0ICk7Ci0KLQotZXh0ZXJuIHZvaWQgRm9vTWVzYU1ha2VDdXJyZW50KCBGb29NZXNhQ29udGV4dCBjb250ZXh0LCBGb29NZXNhQnVmZmVyIGJ1ZmZlciApOwotCi0KLWV4dGVybiB2b2lkIEZvb01lc2FTd2FwQnVmZmVycyggRm9vTWVzYUJ1ZmZlciBidWZmZXIgKTsKLQotCi0vKiBQcm9iYWJseSBzb21lIG1vcmUgZnVuY3Rpb25zLi4uICovCi0KLQotI2lmZGVmIEJFT1MKLSNwcmFnbWEgZXhwb3J0IG9mZgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9HTC9nbHUuaCBiL2luY2x1ZGUvR0wvZ2x1LmgKaW5kZXggZDgyMTAzZC4uN2RiNGI3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC9nbHUuaAorKysgYi9pbmNsdWRlL0dML2dsdS5oCkBAIC00NCwyMiArNDQsMTcgQEAKICNkZWZpbmUgR0xBUElFTlRSWVAgR0xBUElFTlRSWSAqCiAjZW5kaWYKIAotI2lmZGVmIEdMQVBJCi0jdW5kZWYgR0xBUEkKLSNlbmRpZgotCi0jICBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpICYmIGRlZmluZWQoQlVJTERfR0xVMzIpCi0jICAgIGRlZmluZSBHTEFQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgIGVsaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiBkZWZpbmVkKF9ETEwpIC8qIHRhZyBzcGVjaWZ5aW5nIHdlJ3JlIGJ1aWxkaW5nIGZvciBETEwgcnVudGltZSBzdXBwb3J0ICovCi0jICAgIGRlZmluZSBHTEFQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgIGVsc2UgLyogZm9yIHVzZSB3aXRoIHN0YXRpYyBsaW5rIGxpYiBidWlsZCBvZiBXaW4zMiBlZGl0aW9uIG9ubHkgKi8KLSMgICAgZGVmaW5lIEdMQVBJIGV4dGVybgotIyAgZW5kaWYgLyogX1NUQVRJQ19NRVNBIHN1cHBvcnQgKi8KLQotCi0jaWZuZGVmIEdMQVBJCi0jZGVmaW5lIEdMQVBJCi0jZW5kaWYKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpICYmIGRlZmluZWQoQlVJTERfR0xVMzIpCisjIHVuZGVmIEdMQVBJCisjIGRlZmluZSBHTEFQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkgJiYgZGVmaW5lZChfRExMKQorLyogdGFnIHNwZWNpZnlpbmcgd2UncmUgYnVpbGRpbmcgZm9yIERMTCBydW50aW1lIHN1cHBvcnQgKi8KKyMgdW5kZWYgR0xBUEkKKyMgZGVmaW5lIEdMQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VsaWYgIWRlZmluZWQoR0xBUEkpCisvKiBmb3IgdXNlIHdpdGggc3RhdGljIGxpbmsgbGliIGJ1aWxkIG9mIFdpbjMyIGVkaXRpb24gb25seSAqLworIyBkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYgLyogX1NUQVRJQ19NRVNBIHN1cHBvcnQgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvR0wvZ2x1dC5oIGIvaW5jbHVkZS9HTC9nbHV0LmgKaW5kZXggZTI4NjM0OS4uMTM3YjhlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC9nbHV0LmgKKysrIGIvaW5jbHVkZS9HTC9nbHV0LmgKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgYW5kIHJlZGlmaW5pdGlvbiBvZiBXaW5kb3dzIHN5c3RlbSBkZWZzLCBhbHNvIHJlbW92ZXMgcmVxdWlyZW1lbnQgb2YKICAgIHByZXR0eSBtdWNoIGFueSBzdGFuZGFyZCB3aW5kb3dzIGhlYWRlciBmcm9tIHRoaXMgZmlsZSAqLwogCi0jaWYgKF9NU0NfVkVSID49IDgwMCkgfHwgZGVmaW5lZChfU1REQ0FMTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorI2lmIChfTVNDX1ZFUiA+PSA4MDApIHx8IGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX1NURENBTExfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykKICMJZGVmaW5lIEdMVVRBUElFTlRSWSBfX3N0ZGNhbGwKICNlbHNlCiAjCWRlZmluZSBHTFVUQVBJRU5UUlkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvR0wvZ2x1dGY5MC5oIGIvaW5jbHVkZS9HTC9nbHV0ZjkwLmgKaW5kZXggN2JhM2UxOS4uOGEzYTg2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC9nbHV0ZjkwLmgKKysrIGIvaW5jbHVkZS9HTC9nbHV0ZjkwLmgKQEAgLTc1LDcgKzc1LDcgQEAKIHR5cGVkZWYgdm9pZCAoR0xVVENBTExCQUNLICpHTFVUaWRsZUZDQikgKHZvaWQpOwogCiAvKiBGdW5jdGlvbnMgdGhhdCBzZXQgYW5kIHJldHVybiBGb3J0cmFuIGNhbGxiYWNrIGZ1bmN0aW9ucy4gKi8KLUdMVVRBUEkgdm9pZCogQVBJRU5UUlkgX19nbHV0R2V0RkNCKGludCB3aGljaCk7Ci1HTFVUQVBJIHZvaWQgQVBJRU5UUlkgX19nbHV0U2V0RkNCKGludCB3aGljaCwgdm9pZCAqZnVuYyk7CitHTFVUQVBJIEdMVVRwcm9jIEFQSUVOVFJZIF9fZ2x1dEdldEZDQihpbnQgd2hpY2gpOworR0xVVEFQSSB2b2lkIEFQSUVOVFJZIF9fZ2x1dFNldEZDQihpbnQgd2hpY2gsIEdMVVRwcm9jIGZ1bmMpOwogCiAjZW5kaWYgIC8qIF9fZ2x1dGY5MF9oX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvR0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oIGIvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgKaW5kZXggOGQyNGUzMS4uZTc3ODBkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IDE5OTgtMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IFJlZCBIYXQsIEluYy4KICAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDQKICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMzMsMTMgKzM0LDIwIEBACiAgKiAKICAqIFxhdXRob3IgS2V2aW4gRS4gTWFydGluIDxrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbT4KICAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpZHJAdXMuaWJtLmNvbT4KKyAqIFxhdXRob3IgS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KICAqLwogCiAjaWZuZGVmIERSSV9JTlRFUkZBQ0VfSAogI2RlZmluZSBEUklfSU5URVJGQUNFX0gKIAotI2luY2x1ZGUgPEdML2ludGVybmFsL2dsY29yZS5oPgorLyogTWFrZSB0aGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIF9fQVBQTEVfXyBmb3Igb3RoZXIgYXJjcyB3aXRoIG5vIGRybS5oICovCisjaWZuZGVmIF9fQVBQTEVfXwogI2luY2x1ZGUgPGRybS5oPgorI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50IGRybV9jb250ZXh0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fZHJhd2FibGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3QgZHJtX2NsaXBfcmVjdF90OworI2VuZGlmCiAKIC8qKgogICogXG5hbWUgRFJJIGludGVyZmFjZSBzdHJ1Y3R1cmVzCkBAIC00OCw2NSArNTYsMTkwIEBACiAgKiBzaWRlIGxpYnJhcnkgYW5kIHRoZSBEUkkgKGRpcmVjdCByZW5kZXJpbmcgaW5mcmFzdHJ1Y3R1cmUpLgogICovCiAvKkB7Ki8KLXR5cGVkZWYgc3RydWN0IF9fRFJJZGlzcGxheVJlYyAgX19EUklkaXNwbGF5OwotdHlwZWRlZiBzdHJ1Y3QgX19EUklzY3JlZW5SZWMgICBfX0RSSXNjcmVlbjsKLXR5cGVkZWYgc3RydWN0IF9fRFJJY29udGV4dFJlYyAgX19EUkljb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgX19EUklkcmF3YWJsZVJlYyBfX0RSSWRyYXdhYmxlOwotdHlwZWRlZiBzdHJ1Y3QgX19EUklkcml2ZXJSZWMgICBfX0RSSWRyaXZlcjsKLXR5cGVkZWYgc3RydWN0IF9fRFJJZnJhbWVidWZmZXJSZWMgX19EUklmcmFtZWJ1ZmZlcjsKLXR5cGVkZWYgc3RydWN0IF9fRFJJdmVyc2lvblJlYyAgICAgX19EUkl2ZXJzaW9uOwotdHlwZWRlZiBzdHJ1Y3QgX19EUklpbnRlcmZhY2VNZXRob2RzUmVjICBfX0RSSWludGVyZmFjZU1ldGhvZHM7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19EUklpZDsKLXR5cGVkZWYgdm9pZCBfX0RSSW5hdGl2ZURpc3BsYXk7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWRpc3BsYXlSZWMJCV9fRFJJZGlzcGxheTsKK3R5cGVkZWYgc3RydWN0IF9fRFJJc2NyZWVuUmVjCQlfX0RSSXNjcmVlbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJY29udGV4dFJlYwkJX19EUkljb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgX19EUklkcmF3YWJsZVJlYwkJX19EUklkcmF3YWJsZTsKK3R5cGVkZWYgc3RydWN0IF9fRFJJY29uZmlnUmVjCQlfX0RSSWNvbmZpZzsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZnJhbWVidWZmZXJSZWMJX19EUklmcmFtZWJ1ZmZlcjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJdmVyc2lvblJlYwkJX19EUkl2ZXJzaW9uOworCit0eXBlZGVmIHN0cnVjdCBfX0RSSWNvcmVFeHRlbnNpb25SZWMJCV9fRFJJY29yZUV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZXh0ZW5zaW9uUmVjCQlfX0RSSWV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJY29weVN1YkJ1ZmZlckV4dGVuc2lvblJlYwlfX0RSSWNvcHlTdWJCdWZmZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uUmVjCV9fRFJJc3dhcENvbnRyb2xFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWFsbG9jYXRlRXh0ZW5zaW9uUmVjCV9fRFJJYWxsb2NhdGVFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWZyYW1lVHJhY2tpbmdFeHRlbnNpb25SZWMJX19EUklmcmFtZVRyYWNraW5nRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUkltZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb25SZWMJX19EUkltZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXRleE9mZnNldEV4dGVuc2lvblJlYwlfX0RSSXRleE9mZnNldEV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uUmVjCV9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklsZWdhY3lFeHRlbnNpb25SZWMJCV9fRFJJbGVnYWN5RXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklzd3Jhc3RFeHRlbnNpb25SZWMJCV9fRFJJc3dyYXN0RXh0ZW5zaW9uOwogLypAfSovCiAKIAogLyoqCi0gKiBcbmFtZSBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGRyaXZlciBsb2FkZXIuCi0gKi8KLS8qQHsqLwotLyoqCi0gKiBUeXBlIG9mIGEgcG9pbnRlciB0byBcYyBnbFhHZXRTY3JlZW5Ecml2ZXIsIGFzIHJldHVybmVkIGJ5Ci0gKiBcYyBnbFhHZXRQcm9jQWRkcmVzcy4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIERSSQotICogZHJpdmVyIGZvciB0aGUgc3BlY2lmaWVkIHNjcmVlbiBvZiB0aGUgc3BlY2lmaWVkIGRpc3BsYXkuICBUaGUgZHJpdmVyCi0gKiBuYW1lIGlzIHR5cGljYWxseSB1c2VkIHdpdGggXGMgZ2xYR2V0RHJpdmVyQ29uZmlnLgorICogRXh0ZW5zaW9uIHN0cnVjdC4gIERyaXZlcnMgJ2luaGVyaXQnIGZyb20gdGhpcyBzdHJ1Y3QgYnkgZW1iZWRkaW5nCisgKiBpdCBhcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZXh0ZW5zaW9uIHN0cnVjdC4KICAqCi0gKiBcc2EgZ2xYR2V0U2NyZWVuRHJpdmVyLCBnbFhHZXRQcm9jQWRkcmVzcywgZ2xYR2V0RHJpdmVyQ29uZmlnCi0gKi8KLXR5cGVkZWYgY29uc3QgY2hhciAqICgqIFBGTkdMWEdFVFNDUkVFTkRSSVZFUlBST0MpIChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjck51bSk7Ci0KLS8qKgotICogVHlwZSBvZiBhIHBvaW50ZXIgdG8gXGMgZ2xYR2V0RHJpdmVyQ29uZmlnLCBhcyByZXR1cm5lZCBieQotICogXGMgZ2xYR2V0UHJvY0FkZHJlc3MuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBYTUwgZG9jdW1lbnQKLSAqIGRlc2NyaWJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgZHJpdmVyLgorICogV2UgbmV2ZXIgYnJlYWsgQVBJIGluIGZvciBhIERSSSBleHRlbnNpb24uICBJZiB3ZSBuZWVkIHRvIGNoYW5nZQorICogdGhlIHdheSB0aGluZ3Mgd29yayBpbiBhIG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBtYW5uZXIsIHdlCisgKiBpbnRyb2R1Y2UgYSBuZXcgZXh0ZW5zaW9uLiAgRHVyaW5nIGEgdHJhbnNpdGlvbiBwZXJpb2QsIHdlIGNhbgorICogbGVhdmUgYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IGV4dGVuc2lvbiBpbiB0aGUgZHJpdmVyLCB3aGljaAorICogYWxsb3dzIHVzIHRvIG1vdmUgdG8gdGhlIG5ldyBpbnRlcmZhY2Ugd2l0aG91dCBoYXZpbmcgdG8gdXBkYXRlIHRoZQorICogbG9hZGVyKHMpIGluIGxvY2sgc3RlcC4KICAqCi0gKiBcc2EgZ2xYR2V0RHJpdmVyQ29uZmlnLCBnbFhHZXRQcm9jQWRkcmVzcywgZ2xYR2V0U2NyZWVuRHJpdmVyCisgKiBIb3dldmVyLCB3ZSBjYW4gYWRkIGVudHJ5IHBvaW50cyB0byBhbiBleHRlbnNpb24gb3ZlciB0aW1lIGFzIGxvbmcKKyAqIGFzIHdlIGRvbid0IGJyZWFrIHRoZSBvbGQgb25lcy4gIEFzIHdlIGFkZCBlbnRyeSBwb2ludHMgdG8gYW4KKyAqIGV4dGVuc2lvbiwgd2UgaW5jcmVhc2UgdGhlIHZlcnNpb24gbnVtYmVyLiAgVGhlIGNvcnJlc3BvbmRpbmcKKyAqICNkZWZpbmUgY2FuIGJlIHVzZWQgdG8gZ3VhcmQgY29kZSB0aGF0IGFjY2Vzc2VzIHRoZSBuZXcgZW50cnkKKyAqIHBvaW50cyBhdCBjb21waWxlIHRpbWUgYW5kIHRoZSB2ZXJzaW9uIGZpZWxkIGluIHRoZSBleHRlbnNpb24KKyAqIHN0cnVjdCBjYW4gYmUgdXNlZCBhdCBydW4tdGltZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSB0aGUKKyAqIGV4dGVuc2lvbi4KICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKCogUEZOR0xYR0VURFJJVkVSQ09ORklHUFJPQykgKGNvbnN0IGNoYXIgKmRyaXZlck5hbWUpOworc3RydWN0IF9fRFJJZXh0ZW5zaW9uUmVjIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCB2ZXJzaW9uOworfTsKIAogLyoqCi0gKiBUeXBlIG9mIGEgcG9pbnRlciB0byBcYyBnbHhFbmFibGVFeHRlbnNpb24sIGFzIHJldHVybmVkIGJ5Ci0gKiBcYyBfX0RSSWludGVyZmFjZU1ldGhvZHM6OmdldFByb2NBZGRyZXNzLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZQotICogYSBHTFggZXh0ZW5zaW9uIG9uIHRoZSBzcGVjaWZpZWQgc2NyZWVuLgorICogVGhlIGZpcnN0IHNldCBvZiBleHRlbnNpb24gYXJlIHRoZSBzY3JlZW4gZXh0ZW5zaW9ucywgcmV0dXJuZWQgYnkKKyAqIF9fRFJJY29yZTo6Z2V0RXh0ZW5zaW9ucygpLiAgVGhpcyBlbnRyeSBwb2ludCB3aWxsIHJldHVybiBhIGxpc3Qgb2YKKyAqIGV4dGVuc2lvbnMgYW5kIHRoZSBsb2FkZXIgY2FuIHVzZSB0aGUgb25lcyBpdCBrbm93cyBhYm91dCBieQorICogY2FzdGluZyB0aGVtIHRvIG1vcmUgc3BlY2lmaWMgZXh0ZW5zaW9ucyBhbmQgYWR2ZXJ0aXNpbmcgYW55IEdMWAorICogZXh0ZW5zaW9ucyB0aGUgRFJJIGV4dGVuc2lvbnMgZW5hYmxlcy4KICAqLwotdHlwZWRlZiB2b2lkICgqIFBGTkdMWFNDUkVOQUJMRUVYVEVOU0lPTlBST0MpICggdm9pZCAqcHNjLCBjb25zdCBjaGFyICogbmFtZSApOwotLypAfSovCisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRvIGluZGljYXRlIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIHJlYWQgZHJhd2FibGUuCisgKi8KKyNkZWZpbmUgX19EUklfUkVBRF9EUkFXQUJMRSAiRFJJX1JlYWREcmF3YWJsZSIKKyNkZWZpbmUgX19EUklfUkVBRF9EUkFXQUJMRV9WRVJTSU9OIDEKKworLyoqCisgKiBVc2VkIGJ5IGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlciBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfQ09QWV9TVUJfQlVGRkVSICJEUklfQ29weVN1YkJ1ZmZlciIKKyNkZWZpbmUgX19EUklfQ09QWV9TVUJfQlVGRkVSX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJY29weVN1YkJ1ZmZlckV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKyAgICB2b2lkICgqY29weVN1YkJ1ZmZlcikoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKK307CisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfU0dJX3N3YXBfY29udHJvbCBvcgorICogR0xYX01FU0Ffc3dhcF9jb250cm9sIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9TV0FQX0NPTlRST0wgIkRSSV9Td2FwQ29udHJvbCIKKyNkZWZpbmUgX19EUklfU1dBUF9DT05UUk9MX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3dhcENvbnRyb2xFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisgICAgdm9pZCAoKnNldFN3YXBJbnRlcnZhbCkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIHVuc2lnbmVkIGludCBpbnRldmFsKTsKKyAgICB1bnNpZ25lZCBpbnQgKCpnZXRTd2FwSW50ZXJ2YWwpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKK307CisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfTUVTQV9hbGxvY2F0ZV9tZW1vcnkuCisgKi8KKyNkZWZpbmUgX19EUklfQUxMT0NBVEUgIkRSSV9BbGxvY2F0ZSIKKyNkZWZpbmUgX19EUklfQUxMT0NBVEVfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklhbGxvY2F0ZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIHZvaWQgKigqYWxsb2NhdGVNZW1vcnkpKF9fRFJJc2NyZWVuICpzY3JlZW4sIEdMc2l6ZWkgc2l6ZSwKKwkJCSAgICBHTGZsb2F0IHJlYWRmcmVxLCBHTGZsb2F0IHdyaXRlZnJlcSwKKwkJCSAgICBHTGZsb2F0IHByaW9yaXR5KTsKKyAgIAorICAgIHZvaWQgKCpmcmVlTWVtb3J5KShfX0RSSXNjcmVlbiAqc2NyZWVuLCBHTHZvaWQgKnBvaW50ZXIpOworICAgCisgICAgR0x1aW50ICgqbWVtb3J5T2Zmc2V0KShfX0RSSXNjcmVlbiAqc2NyZWVuLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworfTsKKworLyoqCisgKiBVc2VkIGJ5IGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIEdMWF9NRVNBX3N3YXBfZnJhbWVfdXNhZ2UgZXh0ZW5zaW9uLgorICovCisjZGVmaW5lIF9fRFJJX0ZSQU1FX1RSQUNLSU5HICJEUklfRnJhbWVUcmFja2luZyIKKyNkZWZpbmUgX19EUklfRlJBTUVfVFJBQ0tJTkdfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklmcmFtZVRyYWNraW5nRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgZnJhbWUgdXNhZ2UgdHJhY2tpbmcuCisgICAgICogCisgICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgorICAgICAqLworICAgIGludCAoKmZyYW1lVHJhY2tpbmcpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLCBHTGJvb2xlYW4gZW5hYmxlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGZyYW1lIHVzYWdlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDAzMDMxNy4KKyAgICAgKi8KKyAgICBpbnQgKCpxdWVyeUZyYW1lVHJhY2tpbmcpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorCQkJICAgICAgaW50NjRfdCAqIHNiYywgaW50NjRfdCAqIG1pc3NlZEZyYW1lcywKKwkJCSAgICAgIGZsb2F0ICogbGFzdE1pc3NlZFVzYWdlLCBmbG9hdCAqIHVzYWdlKTsKK307CiAKIAogLyoqCi0gKiBcbmFtZSBGdW5jdGlvbnMgYW5kIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KKyAqIFVzZWQgYnkgZHJpdmVycyB0aGF0IGltcGxlbWVudCB0aGUgR0xYX1NHSV92aWRlb19zeW5jIGV4dGVuc2lvbi4KICAqLwotLypAeyovCisjZGVmaW5lIF9fRFJJX01FRElBX1NUUkVBTV9DT1VOVEVSICJEUklfTWVkaWFTdHJlYW1Db3VudGVyIgorI2RlZmluZSBfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUl9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSW1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKIAotdHlwZWRlZiB2b2lkICooQ1JFQVRFTkVXU0NSRUVORlVOQykoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLAotICAgIF9fRFJJc2NyZWVuICpwc2MsIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlcywKLSAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkZHhfdmVyc2lvbiwgY29uc3QgX19EUkl2ZXJzaW9uICogZHJpX3ZlcnNpb24sCi0gICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJtX3ZlcnNpb24sIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKiBmcmFtZV9idWZmZXIsCi0gICAgdm9pZCAqIHBTQVJFQSwgaW50IGZkLCBpbnQgaW50ZXJuYWxfYXBpX3ZlcnNpb24sCi0gICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotICAgIF9fR0xjb250ZXh0TW9kZXMgKiogZHJpdmVyX21vZGVzKTsKLXR5cGVkZWYgQ1JFQVRFTkVXU0NSRUVORlVOQyogUEZOQ1JFQVRFTkVXU0NSRUVORlVOQzsKLWV4dGVybiBDUkVBVEVORVdTQ1JFRU5GVU5DIF9fZHJpQ3JlYXRlTmV3U2NyZWVuXzIwMDUwNzI3OworICAgIC8qKgorICAgICAqIFdhaXQgZm9yIHRoZSBNU0MgdG8gZXF1YWwgdGFyZ2V0X21zYywgb3IsIGlmIHRoYXQgaGFzIGFscmVhZHkgcGFzc2VkLAorICAgICAqIHRoZSBuZXh0IHRpbWUgKE1TQyAlIGRpdmlzb3IpIGlzIGVxdWFsIHRvIHJlbWFpbmRlci4gIElmIGRpdmlzb3IgaXMKKyAgICAgKiB6ZXJvLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYXMgc29vbiBhcyBNU0MgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICogdG8gdGFyZ2V0X21zYy4KKyAgICAgKi8KKyAgICBpbnQgKCp3YWl0Rm9yTVNDKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJICAgICAgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyLAorCQkgICAgICBpbnQ2NF90ICogbXNjLCBpbnQ2NF90ICogc2JjKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIHJlZnJlc2hlcyBzaW5jZSBzb21lIHBvaW50IGluIHRpbWUgYmVmb3JlCisgICAgICogdGhpcyBmdW5jdGlvbiB3YXMgZmlyc3QgY2FsbGVkIChpLmUuLCBzeXN0ZW0gc3RhcnQgdXApLgorICAgICAqLworICAgIGludCAoKmdldERyYXdhYmxlTVNDKShfX0RSSXNjcmVlbiAqc2NyZWVuLCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJCSAgaW50NjRfdCAqbXNjKTsKK307CisKKworI2RlZmluZSBfX0RSSV9URVhfT0ZGU0VUICJEUklfVGV4T2Zmc2V0IgorI2RlZmluZSBfX0RSSV9URVhfT0ZGU0VUX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIG92ZXJyaWRlIGJhc2UgdGV4dHVyZSBpbWFnZSB3aXRoIGEgZHJpdmVyIHNwZWNpZmljICdvZmZzZXQnLgorICAgICAqIFRoZSBkZXB0aCBwYXNzZWQgaW4gYWxsb3dzIGUuZy4gdG8gaWdub3JlIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRleHR1cmUKKyAgICAgKiBpbWFnZXMgd2hlcmUgdGhlIG5vbi1hbHBoYSBjb21wb25lbnRzIGRvbid0IG9jY3VweSBhIHdob2xlIHRleGVsLgorICAgICAqCisgICAgICogRm9yIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCB3aXRoIEFJR0xYLgorICAgICAqLworICAgIHZvaWQgKCpzZXRUZXhPZmZzZXQpKF9fRFJJY29udGV4dCAqcERSSUN0eCwgR0xpbnQgdGV4bmFtZSwKKwkJCSB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwgR0x1aW50IHBpdGNoKTsKK307CisKKworI2RlZmluZSBfX0RSSV9URVhfQlVGRkVSICJEUklfVGV4QnVmZmVyIgorI2RlZmluZSBfX0RSSV9URVhfQlVGRkVSX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIG92ZXJyaWRlIGJhc2UgdGV4dHVyZSBpbWFnZSB3aXRoIHRoZSBjb250ZW50cyBvZiBhCisgICAgICogX19EUklkcmF3YWJsZS4gCisgICAgICoKKyAgICAgKiBGb3IgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIHdpdGggQUlHTFguCisgICAgICovCisgICAgdm9pZCAoKnNldFRleEJ1ZmZlcikoX19EUkljb250ZXh0ICpwRFJJQ3R4LAorCQkJIEdMaW50IHRhcmdldCwKKwkJCSBfX0RSSWRyYXdhYmxlICpwRHJhdyk7Cit9OwogCiAKIC8qKgpAQCAtMTE3LDYgKzI1MCwyODkgQEAKIAogLypAfSovCiAKKy8qKgorICogVGhlIGZvbGxvd2luZyBleHRlbnNpb25zIGRlc2NyaWJlIGxvYWRlciBmZWF0dXJlcyB0aGF0IHRoZSBEUkkKKyAqIGRyaXZlciBjYW4gbWFrZSB1c2Ugb2YuICBTb21lIG9mIHRoZXNlIGFyZSBtYW5kYXRvcnksIHN1Y2ggYXMgdGhlCisgKiBnZXREcmF3YWJsZUluZm8gZXh0ZW5zaW9uIGZvciBEUkkgYW5kIHRoZSBEUkkgTG9hZGVyIGV4dGVuc2lvbnMgZm9yCisgKiBEUkkyLCB3aGlsZSBvdGhlcnMgYXJlIG9wdGlvbmFsLCBhbmQgaWYgcHJlc2VudCBhbGxvdyB0aGUgZHJpdmVyIHRvCisgKiBleHBvc2UgY2VydGFpbiBmZWF0dXJlcy4gIFRoZSBsb2FkZXIgcGFzcyBpbiBhIE5VTEwgdGVybWluYXRlZAorICogYXJyYXkgb2YgdGhlc2UgZXh0ZW5zaW9ucyB0byB0aGUgZHJpdmVyIGluIHRoZSBjcmVhdGVOZXdTY3JlZW4KKyAqIGNvbnN0cnVjdG9yLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uUmVjIF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uUmVjIF9fRFJJc3lzdGVtVGltZUV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZGFtYWdlRXh0ZW5zaW9uUmVjIF9fRFJJZGFtYWdlRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklsb2FkZXJFeHRlbnNpb25SZWMgX19EUklsb2FkZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXN3cmFzdExvYWRlckV4dGVuc2lvblJlYyBfX0RSSXN3cmFzdExvYWRlckV4dGVuc2lvbjsKKworCisvKioKKyAqIENhbGxiYWNrIHRvIGdldERyYXdhYmxlSW5mbyBwcm90b2NvbAorICovCisjZGVmaW5lIF9fRFJJX0dFVF9EUkFXQUJMRV9JTkZPICJEUklfR2V0RHJhd2FibGVJbmZvIgorI2RlZmluZSBfX0RSSV9HRVRfRFJBV0FCTEVfSU5GT19WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSWdldERyYXdhYmxlSW5mb0V4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvc2l0aW9uLCBzaXplLCBhbmQKKyAgICAgKiBjbGlwIHJlY3RzIG9mIGEgZHJhd2FibGUuCisgICAgICovCisgICAgR0xib29sZWFuICgqIGdldERyYXdhYmxlSW5mbykgKCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwl1bnNpZ25lZCBpbnQgKiBpbmRleCwgdW5zaWduZWQgaW50ICogc3RhbXAsCisgICAgICAgIGludCAqIHgsIGludCAqIHksIGludCAqIHdpZHRoLCBpbnQgKiBoZWlnaHQsCisgICAgICAgIGludCAqIG51bUNsaXBSZWN0cywgZHJtX2NsaXBfcmVjdF90ICoqIHBDbGlwUmVjdHMsCisgICAgICAgIGludCAqIGJhY2tYLCBpbnQgKiBiYWNrWSwKKwlpbnQgKiBudW1CYWNrQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcEJhY2tDbGlwUmVjdHMsCisJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIENhbGxiYWNrIHRvIGdldCBzeXN0ZW0gdGltZSBmb3IgbWVkaWEgc3RyZWFtIGNvdW50ZXIgZXh0ZW5zaW9ucy4KKyAqLworI2RlZmluZSBfX0RSSV9TWVNURU1fVElNRSAiRFJJX1N5c3RlbVRpbWUiCisjZGVmaW5lIF9fRFJJX1NZU1RFTV9USU1FX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3lzdGVtVGltZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgNjQtYml0IHVuYWRqdXN0ZWQgc3lzdGVtIHRpbWUgKFVTVCkuCisgICAgICovCisgICAgaW50ICgqZ2V0VVNUKShpbnQ2NF90ICogdXN0KTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVkaWEgc3RyZWFtIGNvdW50ZXIgKE1TQykgcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBNYXRjaGluZyB0aGUgZGVmaW5pdGlvbiBpbiBHTFhfT01MX3N5bmNfY29udHJvbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICogdGhlIHJhdGUgb2YgdGhlICJtZWRpYSBzdHJlYW0gY291bnRlciIuICBJbiBwcmFjdGljYWwgdGVybXMsIHRoaXMgaXMKKyAgICAgKiB0aGUgZnJhbWUgcmVmcmVzaCByYXRlIG9mIHRoZSBkaXNwbGF5LgorICAgICAqLworICAgIEdMYm9vbGVhbiAoKmdldE1TQ1JhdGUpKF9fRFJJZHJhd2FibGUgKmRyYXcsCisJCQkgICAgaW50MzJfdCAqIG51bWVyYXRvciwgaW50MzJfdCAqIGRlbm9taW5hdG9yLAorCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBEYW1hZ2UgcmVwb3J0aW5nCisgKi8KKyNkZWZpbmUgX19EUklfREFNQUdFICJEUklfRGFtYWdlIgorI2RlZmluZSBfX0RSSV9EQU1BR0VfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklkYW1hZ2VFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIGFyZWFzIG9mIHRoZSBnaXZlbiBkcmF3YWJsZSB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgdGhlCisgICAgICogZHJpdmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGRyYXdhYmxlIHdoaWNoIHRoZSBkcmF3aW5nIHdhcyBkb25lIHRvLgorICAgICAqIFxwYXJhbSByZWN0cyByZWN0YW5nbGVzIGFmZmVjdGVkLCB3aXRoIHRoZSBkcmF3YWJsZSBvcmlnaW4gYXMgdGhlCisgICAgICoJICAgICAgb3JpZ2luLgorICAgICAqIFxwYXJhbSB4IFggb2Zmc2V0IG9mIHRoZSBkcmF3YWJsZSB3aXRoaW4gdGhlIHNjcmVlbiAodXNlZCBpbiB0aGUKKyAgICAgKgkgICAgICBmcm9udF9idWZmZXIgY2FzZSkKKyAgICAgKiBccGFyYW0geSBZIG9mZnNldCBvZiB0aGUgZHJhd2FibGUgd2l0aGluIHRoZSBzY3JlZW4uCisgICAgICogXHBhcmFtIGZyb250X2J1ZmZlciBib29sZWFuIGZsYWcgZm9yIHdoZXRoZXIgdGhlIGRyYXdpbmcgdG8gdGhlCisgICAgICogCSAgICAgIGRyYXdhYmxlIHdhcyBhY3R1YWxseSBkb25lIGRpcmVjdGx5IHRvIHRoZSBmcm9udCBidWZmZXIgKGluc3RlYWQKKyAgICAgKgkgICAgICBvZiBiYWNraW5nIHN0b3JhZ2UsIGZvciBleGFtcGxlKQorICAgICAqIFxwYXJhbSBsb2FkZXJQcml2YXRlIHRoZSBkYXRhIHBhc3NlZCBpbiBhdCBjcmVhdGVOZXdEcmF3YWJsZSB0aW1lCisgICAgICovCisgICAgdm9pZCAoKnJlcG9ydERhbWFnZSkoX19EUklkcmF3YWJsZSAqZHJhdywKKwkJCSBpbnQgeCwgaW50IHksCisJCQkgZHJtX2NsaXBfcmVjdF90ICpyZWN0cywgaW50IG51bV9yZWN0cywKKwkJCSBHTGJvb2xlYW4gZnJvbnRfYnVmZmVyLAorCQkJIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBEUkkyIExvYWRlciBleHRlbnNpb24uICBUaGlzIGV4dGVuc2lvbiBkZXNjcmliZXMgdGhlIGJhc2ljCisgKiBmdW5jdGlvbmFsaXR5IHRoZSBsb2FkZXIgbmVlZHMgdG8gcHJvdmlkZSBmb3IgdGhlIERSSSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgX19EUklfTE9BREVSICJEUklfTG9hZGVyIgorI2RlZmluZSBfX0RSSV9MT0FERVJfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklsb2FkZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBQaW5nIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHRvIGdldCBpdCB0byByZWVtaXQgaW5mbyBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGRyYXdhYmxlIGluIHRoZSBEUkkyIGV2ZW50IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkcmF3IHRoZSBkcmF3YWJsZSBmb3Igd2hpY2ggdG8gcmVxdWVzdCBpbmZvCisgICAgICogXHBhcmFtIHRhaWwgdGhlIG5ldyBldmVudCBidWZmZXIgdGFpbCBwb2ludGVyCisgICAgICovCisgICAgdm9pZCAoKnJlZW1pdERyYXdhYmxlSW5mbykoX19EUklkcmF3YWJsZSAqZHJhdywgdW5zaWduZWQgaW50ICp0YWlsLAorCQkJICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgdm9pZCAoKnBvc3REYW1hZ2UpKF9fRFJJZHJhd2FibGUgKmRyYXcsIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0cywKKwkJICAgICAgIGludCBudW1fcmVjdHMsIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworI2RlZmluZSBfX0RSSV9TV1JBU1RfSU1BR0VfT1BfRFJBVwkxCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9DTEVBUgkyCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9TV0FQCTMKKworLyoqCisgKiBTV1Jhc3QgTG9hZGVyIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9TV1JBU1RfTE9BREVSICJEUklfU1dSYXN0TG9hZGVyIgorI2RlZmluZSBfX0RSSV9TV1JBU1RfTE9BREVSX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoKKyAgICAgKiBEcmF3YWJsZSBwb3NpdGlvbiBhbmQgc2l6ZQorICAgICAqLworICAgIHZvaWQgKCpnZXREcmF3YWJsZUluZm8pKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorCQkJICAgIGludCAqeCwgaW50ICp5LCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwKKwkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIC8qKgorICAgICAqIFB1dCBpbWFnZSB0byBkcmF3YWJsZQorICAgICAqLworICAgIHZvaWQgKCpwdXRJbWFnZSkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIGludCBvcCwKKwkJICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgY2hhciAqZGF0YSwKKwkJICAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIC8qKgorICAgICAqIEdldCBpbWFnZSBmcm9tIGRyYXdhYmxlCisgICAgICovCisgICAgdm9pZCAoKmdldEltYWdlKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgY2hhciAqZGF0YSwKKwkJICAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKK307CisKKy8qKgorICogVGhlIHJlbWFpbmluZyBleHRlbnNpb25zIGRlc2NyaWJlIGRyaXZlciBleHRlbnNpb25zLCBpbW1lZGlhdGVseQorICogYXZhaWxhYmxlIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4gIFRvIHN0YXJ0IHVzaW5nIHRoZQorICogZHJpdmVyLCBkbHN5bSgpIGZvciB0aGUgX19EUklfRFJJVkVSX0VYVEVOU0lPTlMgc3ltYm9sIGFuZCBsb29rIGZvcgorICogdGhlIGV4dGVuc2lvbiB5b3UgbmVlZCBpbiB0aGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgX19EUklfRFJJVkVSX0VYVEVOU0lPTlMgIl9fZHJpRHJpdmVyRXh0ZW5zaW9ucyIKKworLyoqCisgKiBUb2tlbnMgZm9yIF9fRFJJY29uZmlnIGF0dHJpYnMuICBBIG51bWJlciBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgYnkKKyAqIEdMWCBvciBFR0wgc3RhbmRhcmRzIGFyZSBub3QgaW4gdGhlIHRhYmxlLCBhcyB0aGV5IG11c3QgYmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBsb2FkZXIuICBGb3IgZXhhbXBsZSwgRkJDb25maWcgSUQgb3IgdmlzdWFsIElELCBkcmF3YWJsZSB0eXBlLgorICovCisKKyNkZWZpbmUgX19EUklfQVRUUklCX0JVRkZFUl9TSVpFCQkgMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTEVWRUwJCQkgMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfUkVEX1NJWkUJCQkgMworI2RlZmluZSBfX0RSSV9BVFRSSUJfR1JFRU5fU0laRQkJCSA0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CTFVFX1NJWkUJCQkgNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTFVNSU5BTkNFX1NJWkUJCSA2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BTFBIQV9TSVpFCQkJIDcKKyNkZWZpbmUgX19EUklfQVRUUklCX0FMUEhBX01BU0tfU0laRQkJIDgKKyNkZWZpbmUgX19EUklfQVRUUklCX0RFUFRIX1NJWkUJCQkgOQorI2RlZmluZSBfX0RSSV9BVFRSSUJfU1RFTkNJTF9TSVpFCQkxMAorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fUkVEX1NJWkUJCTExCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BQ0NVTV9HUkVFTl9TSVpFCQkxMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fQkxVRV9TSVpFCQkxMworI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fQUxQSEFfU0laRQkJMTQKKyNkZWZpbmUgX19EUklfQVRUUklCX1NBTVBMRV9CVUZGRVJTCQkxNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfU0FNUExFUwkJCTE2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9SRU5ERVJfVFlQRQkJMTcKKyNkZWZpbmUgX19EUklfQVRUUklCX0NPTkZJR19DQVZFQVQJCTE4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9DT05GT1JNQU5UCQkJMTkKKyNkZWZpbmUgX19EUklfQVRUUklCX0RPVUJMRV9CVUZGRVIJCTIwCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9TVEVSRU8JCQkyMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQVVYX0JVRkZFUlMJCTIyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9UWVBFCQkyMworI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUJMjQKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1JFRF9WQUxVRQkyNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUJMjYKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUJMjcKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFCTI4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9GTE9BVF9NT0RFCQkJMjkKKyNkZWZpbmUgX19EUklfQVRUUklCX1JFRF9NQVNLCQkJMzAKKyNkZWZpbmUgX19EUklfQVRUUklCX0dSRUVOX01BU0sJCQkzMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQkxVRV9NQVNLCQkJMzIKKyNkZWZpbmUgX19EUklfQVRUUklCX0FMUEhBX01BU0sJCQkzMworI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1BCVUZGRVJfV0lEVEgJCTM0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9IRUlHSFQJCTM1CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9QSVhFTFMJCTM2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9PUFRJTUFMX1BCVUZGRVJfV0lEVEgJMzcKKyNkZWZpbmUgX19EUklfQVRUUklCX09QVElNQUxfUEJVRkZFUl9IRUlHSFQJMzgKKyNkZWZpbmUgX19EUklfQVRUUklCX1ZJU1VBTF9TRUxFQ1RfR1JPVVAJMzkKKyNkZWZpbmUgX19EUklfQVRUUklCX1NXQVBfTUVUSE9ECQk0MAorI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1NXQVBfSU5URVJWQUwJCTQxCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NSU5fU1dBUF9JTlRFUlZBTAkJNDIKKyNkZWZpbmUgX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9SR0IJNDMKKyNkZWZpbmUgX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9SR0JBCTQ0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX01JUE1BUF9URVhUVVJFCTQ1CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfVEFSR0VUUwk0NgorI2RlZmluZSBfX0RSSV9BVFRSSUJfWUlOVkVSVEVECQkJNDcKKworLyogX19EUklfQVRUUklCX1JFTkRFUl9UWVBFICovCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9SR0JBX0JJVAkJCTB4MDEJCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9DT0xPUl9JTkRFWF9CSVQJCTB4MDIKKyNkZWZpbmUgX19EUklfQVRUUklCX0xVTUlOQU5DRV9CSVQJCTB4MDQKKworLyogX19EUklfQVRUUklCX0NPTkZJR19DQVZFQVQgKi8KKyNkZWZpbmUgX19EUklfQVRUUklCX1NMT1dfQklUCQkJMHgwMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTk9OX0NPTkZPUk1BTlRfQ09ORklHCTB4MDIKKworLyogX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1RZUEUgKi8KKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1JHQgkJMHgwMAorI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVgJCTB4MDEKKworLyogX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTCSAqLworI2RlZmluZSBfX0RSSV9BVFRSSUJfVEVYVFVSRV8xRF9CSVQJCTB4MDEKKyNkZWZpbmUgX19EUklfQVRUUklCX1RFWFRVUkVfMkRfQklUCQkweDAyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9URVhUVVJFX1JFQ1RBTkdMRV9CSVQJMHgwNAorCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIGRlZmluZXMgdGhlIGNvcmUgRFJJIGZ1bmN0aW9uYWxpdHkuCisgKi8KKyNkZWZpbmUgX19EUklfQ09SRSAiRFJJX0NvcmUiCisjZGVmaW5lIF9fRFJJX0NPUkVfVkVSU0lPTiAxCisKK3N0cnVjdCBfX0RSSWNvcmVFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSXNjcmVlbiAqKCpjcmVhdGVOZXdTY3JlZW4pKGludCBzY3JlZW4sIGludCBmZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNhcmVhX2hhbmRsZSwKKwkJCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkJCSAgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJDb25maWdzLAorCQkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIHZvaWQgKCpkZXN0cm95U2NyZWVuKShfX0RSSXNjcmVlbiAqc2NyZWVuKTsKKworICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqKCpnZXRFeHRlbnNpb25zKShfX0RSSXNjcmVlbiAqc2NyZWVuKTsKKworICAgIGludCAoKmdldENvbmZpZ0F0dHJpYikoY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCSAgIHVuc2lnbmVkIGludCBhdHRyaWIsCisJCQkgICB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKKworICAgIGludCAoKmluZGV4Q29uZmlnQXR0cmliKShjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLCBpbnQgaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGludCAqYXR0cmliLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKKworICAgIF9fRFJJZHJhd2FibGUgKigqY3JlYXRlTmV3RHJhd2FibGUpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCWNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJCXVuc2lnbmVkIGludCBkcmF3YWJsZV9pZCwKKwkJCQkJdW5zaWduZWQgaW50IGhlYWQsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgdm9pZCAoKmRlc3Ryb3lEcmF3YWJsZSkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUpOworCisgICAgdm9pZCAoKnN3YXBCdWZmZXJzKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7CisKKyAgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlTmV3Q29udGV4dCkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgICAgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCSAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgaW50ICgqY29weUNvbnRleHQpKF9fRFJJY29udGV4dCAqZGVzdCwKKwkJICAgICAgIF9fRFJJY29udGV4dCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrKTsKKworICAgIHZvaWQgKCpkZXN0cm95Q29udGV4dCkoX19EUkljb250ZXh0ICpjb250ZXh0KTsKKworICAgIGludCAoKmJpbmRDb250ZXh0KShfX0RSSWNvbnRleHQgKmN0eCwKKwkJICAgICAgIF9fRFJJZHJhd2FibGUgKnBkcmF3LAorCQkgICAgICAgX19EUklkcmF3YWJsZSAqcHJlYWQpOworCisgICAgaW50ICgqdW5iaW5kQ29udGV4dCkoX19EUkljb250ZXh0ICpjdHgpOworfTsKIAogLyoqCiAgKiBTdG9yZWQgdmVyc2lvbiBvZiBzb21lIGNvbXBvbmVudCAoaS5lLiwgc2VydmVyLXNpZGUgRFJJIG1vZHVsZSwga2VybmVsLXNpZGUKQEAgLTEzMywxMzMgKzU0OSw2IEBACiAgICAgaW50ICAgIHBhdGNoOyAgICAgICAgLyoqPCBQYXRjaC1sZXZlbC4gKi8KIH07CiAKLQotdHlwZWRlZiB2b2lkICgqX19EUklmdW5jUHRyKSh2b2lkKTsKLQotc3RydWN0IF9fRFJJaW50ZXJmYWNlTWV0aG9kc1JlYyB7Ci0gICAgLyoqCi0gICAgICogR2V0IHBvaW50ZXIgdG8gbmFtZWQgZnVuY3Rpb24uCi0gICAgICovCi0gICAgX19EUklmdW5jUHRyICgqZ2V0UHJvY0FkZHJlc3MpKCBjb25zdCBjaGFyICogcHJvY19uYW1lICk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIFxjIF9fR0xjb250ZXh0TW9kZXMgc3RydWN0dXJlcy4KLSAgICAgKi8KLSAgICBfX0dMY29udGV4dE1vZGVzICogKCpjcmVhdGVDb250ZXh0TW9kZXMpKHVuc2lnbmVkIGNvdW50LAotICAgICAgICBzaXplX3QgbWluaW11bV9ieXRlc19wZXJfc3RydWN0KTsKLQotICAgIC8qKgotICAgICAqIERlc3Ryb3kgYSBsaXN0IG9mIFxjIF9fR0xjb250ZXh0TW9kZXMgc3RydWN0dXJlcy4KLSAgICAgKgotICAgICAqIFx0b2RvCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBkcml2ZXJzIGFjdHVhbGx5IG5lZWQgdG8gY2FsbCB0aGlzLgotICAgICAqLwotICAgIHZvaWQgKCpkZXN0cm95Q29udGV4dE1vZGVzKSggX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzICk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFxjIF9fRFJJc2NyZWVuIGZvciBhIGdpdmVuIGRpc3BsYXkgYW5kIHNjcmVlbiBudW1iZXIuCi0gICAgICovCi0gICAgX19EUklzY3JlZW4gKigqZ2V0U2NyZWVuKShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcmVlbk51bSk7Ci0KLQotICAgIC8qKgotICAgICAqIFxuYW1lIENsaWVudC9zZXJ2ZXIgcHJvdG9jb2wgZnVuY3Rpb25zLgotICAgICAqCi0gICAgICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgRFJJIGNsaWVudC9zZXJ2ZXIgcHJvdG9jb2wgZm9yCi0gICAgICogY29udGV4dCBhbmQgZHJhd2FibGUgb3BlcmF0aW9ucy4gIFBsYXRmb3JtcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQKLSAgICAgKiB0aGUgd2lyZSBwcm90b2NvbCAoZS5nLiwgRUdMKSB3aWxsIGltcGxlbWVudCBnbG9yaWZpZWQgbm8tb3AgZnVuY3Rpb25zLgotICAgICAqLwotICAgIC8qQHsqLwotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIHdpbmRvdyBJRCBzdGlsbCBleGlzdHMuCi0gICAgICogCi0gICAgICogXG5vdGUKLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbWF5IGFzc3VtZSB0aGF0IHRoZSBkcml2ZXIgd2lsbCBvbmx5IHBhc3MgYW4gSUQgaW50bwotICAgICAqIHRoaXMgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBjb3JyZXNwb25kcyB0byBhIHdpbmRvdy4gIE9uCi0gICAgICogaW1wbGVtZW50YXRpb25zIHdoZXJlIHdpbmRvd3MgY2FuIG9ubHkgYmUgZGVzdHJveWVkIGJ5IHRoZSBEUkkgZHJpdmVyCi0gICAgICogKGUuZy4sIEVHTCksIHRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBhbHdheXMgcmV0dXJuIFxjIEdMX1RSVUUuCi0gICAgICovCi0gICAgR0xib29sZWFuICgqd2luZG93RXhpc3RzKShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgX19EUklpZCBkcmF3KTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgc2VydmVyLXNpZGUgcG9ydGlvbiBvZiB0aGUgR0wgY29udGV4dC4KLSAgICAgKi8KLSAgICBHTGJvb2xlYW4gKCogY3JlYXRlQ29udGV4dCkoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuTnVtLAotICAgICAgICBpbnQgY29uZmlnSUQsIHZvaWQgKiBjb250ZXh0SUQsIGRybV9jb250ZXh0X3QgKiBod19jb250ZXh0ICk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXN0cm95IHRoZSBzZXJ2ZXItc2lkZSBwb3J0aW9uIG9mIHRoZSBHTCBjb250ZXh0LgotICAgICAqLwotICAgIEdMYm9vbGVhbiAoKiBkZXN0cm95Q29udGV4dCkoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuTnVtLAotICAgICAgICBfX0RSSWlkIGNvbnRleHQgKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgc2VydmVyLXNpZGUgcG9ydGlvbiBvZiB0aGUgZHJhd2FibGUuCi0gICAgICovCi0gICAgR0xib29sZWFuICgqY3JlYXRlRHJhd2FibGUpKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBuZHB5LCBpbnQgc2NyZWVuLAotICAgICAgICBfX0RSSWlkIGRyYXdhYmxlLCBkcm1fZHJhd2FibGVfdCAqIGhIV0RyYXdhYmxlICk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXN0cm95IHRoZSBzZXJ2ZXItc2lkZSBwb3J0aW9uIG9mIHRoZSBkcmF3YWJsZS4KLSAgICAgKi8KLSAgICBHTGJvb2xlYW4gKCpkZXN0cm95RHJhd2FibGUpKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBuZHB5LCBpbnQgc2NyZWVuLAotICAgICAgICBfX0RSSWlkIGRyYXdhYmxlICk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3NpdGlvbiwgc2l6ZSwgYW5kCi0gICAgICogY2xpcCByZWN0cyBvZiBhIGRyYXdhYmxlLgotICAgICAqLwotICAgIEdMYm9vbGVhbiAoKiBnZXREcmF3YWJsZUluZm8pICggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLAotICAgICAgICBfX0RSSWlkIGRyYXcsIHVuc2lnbmVkIGludCAqIGluZGV4LCB1bnNpZ25lZCBpbnQgKiBzdGFtcCwKLSAgICAgICAgaW50ICogeCwgaW50ICogeSwgaW50ICogd2lkdGgsIGludCAqIGhlaWdodCwKLSAgICAgICAgaW50ICogbnVtQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcENsaXBSZWN0cywKLSAgICAgICAgaW50ICogYmFja1gsIGludCAqIGJhY2tZLAotICAgICAgICBpbnQgKiBudW1CYWNrQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcEJhY2tDbGlwUmVjdHMgKTsKLSAgICAvKkB9Ki8KLQotCi0gICAgLyoqCi0gICAgICogXG5hbWUgVGltaW5nIHJlbGF0ZWQgZnVuY3Rpb25zLgotICAgICAqLwotICAgIC8qQHsqLwotICAgIC8qKgotICAgICAqIEdldCB0aGUgNjQtYml0IHVuYWRqdXN0ZWQgc3lzdGVtIHRpbWUgKFVTVCkuCi0gICAgICovCi0gICAgaW50ICgqZ2V0VVNUKShpbnQ2NF90ICogdXN0KTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVkaWEgc3RyZWFtIGNvdW50ZXIgKE1TQykgcmF0ZS4KLSAgICAgKiAKLSAgICAgKiBNYXRjaGluZyB0aGUgZGVmaW5pdGlvbiBpbiBHTFhfT01MX3N5bmNfY29udHJvbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICAgICogdGhlIHJhdGUgb2YgdGhlICJtZWRpYSBzdHJlYW0gY291bnRlciIuICBJbiBwcmFjdGljYWwgdGVybXMsIHRoaXMgaXMKLSAgICAgKiB0aGUgZnJhbWUgcmVmcmVzaCByYXRlIG9mIHRoZSBkaXNwbGF5LgotICAgICAqLwotICAgIEdMYm9vbGVhbiAoKmdldE1TQ1JhdGUpKF9fRFJJbmF0aXZlRGlzcGxheSAqIGRweSwgX19EUklpZCBkcmF3YWJsZSwKLSAgICAgICAgaW50MzJfdCAqIG51bWVyYXRvciwgaW50MzJfdCAqIGRlbm9taW5hdG9yKTsKLSAgICAvKkB9Ki8KLQotICAgIC8qKgotICAgICAqIFJlcG9ydHMgYXJlYXMgb2YgdGhlIGdpdmVuIGRyYXdhYmxlIHdoaWNoIGhhdmUgYmVlbiBtb2RpZmllZCBieSB0aGUKLSAgICAgKiBkcml2ZXIuCi0gICAgICoKLSAgICAgKiBccGFyYW0gZHJhd2FibGUgd2hpY2ggdGhlIGRyYXdpbmcgd2FzIGRvbmUgdG8uCi0gICAgICogXHBhcmFtIHJlY3RzIHJlY3RhbmdsZXMgYWZmZWN0ZWQsIHdpdGggdGhlIGRyYXdhYmxlIG9yaWdpbiBhcyB0aGUKLSAgICAgKgkgICAgICBvcmlnaW4uCi0gICAgICogXHBhcmFtIHggWCBvZmZzZXQgb2YgdGhlIGRyYXdhYmxlIHdpdGhpbiB0aGUgc2NyZWVuICh1c2VkIGluIHRoZQotICAgICAqCSAgICAgIGZyb250X2J1ZmZlciBjYXNlKQotICAgICAqIFxwYXJhbSB5IFkgb2Zmc2V0IG9mIHRoZSBkcmF3YWJsZSB3aXRoaW4gdGhlIHNjcmVlbi4KLSAgICAgKiBccGFyYW0gZnJvbnRfYnVmZmVyIGJvb2xlYW4gZmxhZyBmb3Igd2hldGhlciB0aGUgZHJhd2luZyB0byB0aGUKLSAgICAgKiAJICAgICAgZHJhd2FibGUgd2FzIGFjdHVhbGx5IGRvbmUgZGlyZWN0bHkgdG8gdGhlIGZyb250IGJ1ZmZlciAoaW5zdGVhZAotICAgICAqCSAgICAgIG9mIGJhY2tpbmcgc3RvcmFnZSwgZm9yIGV4YW1wbGUpCi0gICAgICovCi0gICAgdm9pZCAoKnJlcG9ydERhbWFnZSkoX19EUkluYXRpdmVEaXNwbGF5ICogZHB5LCBpbnQgc2NyZWVuLAotCQkJIF9fRFJJaWQgZHJhd2FibGUsCi0JCQkgaW50IHgsIGludCB5LAotCQkJIGRybV9jbGlwX3JlY3RfdCAqcmVjdHMsIGludCBudW1fcmVjdHMsCi0JCQkgaW50IGZyb250X2J1ZmZlcik7Ci19OwotCi0gICAKIC8qKgogICogRnJhbWVidWZmZXIgaW5mb3JtYXRpb24gcmVjb3JkLiAgVXNlZCBieSBsaWJHTCB0byBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbgogICogYWJvdXQgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBkcml2ZXIncyBcYyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jdGlvbi4KQEAgLTI4OSwyMjkgKzU3OCw1OSBAQAogCiAKIC8qKgotICogU2NyZWVuIGRlcGVuZGVudCBtZXRob2RzLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZQotICogXGMgX19EUklkaXNwbGF5UmVjOjpjcmVhdGVTY3JlZW4gY2FsbC4KKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHNjcmVlbiwgZHJhd2FibGUgYW5kIGNvbnRleHQKKyAqIGNvbnN0cnVjdG9ycyBmb3IgbGVnYWN5IERSSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb3JlIGV4dGVuc2lvbi4KICAqLwotc3RydWN0IF9fRFJJc2NyZWVuUmVjIHsKLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZGVzdHJveSB0aGUgcHJpdmF0ZSBEUkkgc2NyZWVuIGRhdGEuCi0gICAgICovCi0gICAgdm9pZCAoKmRlc3Ryb3lTY3JlZW4pKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2Nybiwgdm9pZCAqc2NyZWVuUHJpdmF0ZSk7CisjZGVmaW5lIF9fRFJJX0xFR0FDWSAiRFJJX0xlZ2FjeSIKKyNkZWZpbmUgX19EUklfTEVHQUNZX1ZFUlNJT04gMQogCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIGNyZWF0ZSB0aGUgcHJpdmF0ZSBEUkkgZHJhd2FibGUgZGF0YSBhbmQgaW5pdGlhbGl6ZSB0aGUKLSAgICAgKiBkcmF3YWJsZSBkZXBlbmRlbnQgbWV0aG9kcy4KLSAgICAgKi8KLSAgICB2b2lkICooKmNyZWF0ZU5ld0RyYXdhYmxlKShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsCi0JCQkgICAgICAgX19EUklpZCBkcmF3LCBfX0RSSWRyYXdhYmxlICpwZHJhdywKLQkJCSAgICAgICBpbnQgcmVuZGVyVHlwZSwgY29uc3QgaW50ICphdHRycyk7CitzdHJ1Y3QgX19EUklsZWdhY3lFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgRFJJIGRyYXdhYmxlIGRhdGEuCi0gICAgICovCi0gICAgX19EUklkcmF3YWJsZSAqKCpnZXREcmF3YWJsZSkoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIF9fRFJJaWQgZHJhdywKLQkJCQkgIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSk7CisgICAgX19EUklzY3JlZW4gKigqY3JlYXRlTmV3U2NyZWVuKShpbnQgc2NyZWVuLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRkeF92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRyaV92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRybV92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICpmcmFtZV9idWZmZXIsCisJCQkJICAgIHZvaWQgKnBTQVJFQSwgaW50IGZkLCAKKwkJCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkJCSAgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJfY29uZmlncywKKwkJCQkgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CiAKLSAgICAvKioKLSAgICAgKiBPcGFxdWUgcG9pbnRlciB0byBwcml2YXRlIHBlciBzY3JlZW4gZGlyZWN0IHJlbmRlcmluZyBkYXRhLiAgXGMgTlVMTAotICAgICAqIGlmIGRpcmVjdCByZW5kZXJpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNjcmVlbi4gIE5ldmVyCi0gICAgICogZGVyZWZlcmVuY2VkIGluIGxpYkdMLgotICAgICAqLwotICAgIHZvaWQgKnByaXZhdGU7CisgICAgX19EUklkcmF3YWJsZSAqKCpjcmVhdGVOZXdEcmF3YWJsZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJZHJtX2RyYXdhYmxlX3QgaHdEcmF3YWJsZSwKKwkJCQkJaW50IHJlbmRlclR5cGUsIGNvbnN0IGludCAqYXR0cnMsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOwogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgdmVydGljYWwgcmVmcmVzaGVzIHNpbmNlIHNvbWUgcG9pbnQgaW4gdGltZSBiZWZvcmUKLSAgICAgKiB0aGlzIGZ1bmN0aW9uIHdhcyBmaXJzdCBjYWxsZWQgKGkuZS4sIHN5c3RlbSBzdGFydCB1cCkuCi0gICAgICogCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludCAoKmdldE1TQykoIHZvaWQgKnNjcmVlblByaXZhdGUsIGludDY0X3QgKm1zYyApOwotCi0gICAgLyoqCi0gICAgICogT3BhcXVlIHBvaW50ZXIgdGhhdCBwb2ludHMgYmFjayB0byB0aGUgY29udGFpbmluZyAKLSAgICAgKiBcYyBfX0dMWHNjcmVlbkNvbmZpZ3MuICBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHNoYXJlZCB3aXRoIERSSSBkcml2ZXJzCi0gICAgICogYnV0IFxjIF9fR0xYc2NyZWVuQ29uZmlncyBpcyBub3QuIEhvd2V2ZXIsIHRoZXkgYXJlIG5lZWRlZCBieSBzb21lIEdMWAotICAgICAqIGZ1bmN0aW9ucyBjYWxsZWQgYnkgRFJJIGRyaXZlcnMuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzA4MTMuCi0gICAgICovCi0gICAgdm9pZCAqc2NyZWVuQ29uZmlnczsKLQotICAgIC8qKgotICAgICAqIEZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggTUVTQV9hbGxvY2F0ZV9tZW1vcnkuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzA4MTUuCi0gICAgICovCi0gICAgLypAeyovCi0gICAgdm9pZCAqKCphbGxvY2F0ZU1lbW9yeSkoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBHTHNpemVpIHNpemUsCi0JCQkgICAgR0xmbG9hdCByZWFkZnJlcSwgR0xmbG9hdCB3cml0ZWZyZXEsCi0JCQkgICAgR0xmbG9hdCBwcmlvcml0eSk7Ci0gICAKLSAgICB2b2lkICgqZnJlZU1lbW9yeSkoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBHTHZvaWQgKnBvaW50ZXIpOwotICAgCi0gICAgR0x1aW50ICgqbWVtb3J5T2Zmc2V0KShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0gICAgLypAfSovCi0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gY3JlYXRlIHRoZSBwcml2YXRlIERSSSBjb250ZXh0IGRhdGEgYW5kIGluaXRpYWxpemUgdGhlCi0gICAgICogY29udGV4dCBkZXBlbmRlbnQgbWV0aG9kcy4KLSAgICAgKgotICAgICAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDAzMTIwMS4KLSAgICAgKi8KLSAgICB2b2lkICogKCpjcmVhdGVOZXdDb250ZXh0KShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsCi0JCQkgICAgICAgaW50IHJlbmRlcl90eXBlLAotCQkJICAgICAgIHZvaWQgKnNoYXJlZFByaXZhdGUsIF9fRFJJY29udGV4dCAqcGN0eCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gb3ZlcnJpZGUgYmFzZSB0ZXh0dXJlIGltYWdlIHdpdGggYSBkcml2ZXIgc3BlY2lmaWMgJ29mZnNldCcuCi0gICAgICogVGhlIGRlcHRoIHBhc3NlZCBpbiBhbGxvd3MgZS5nLiB0byBpZ25vcmUgdGhlIGFscGhhIGNoYW5uZWwgb2YgdGV4dHVyZQotICAgICAqIGltYWdlcyB3aGVyZSB0aGUgbm9uLWFscGhhIGNvbXBvbmVudHMgZG9uJ3Qgb2NjdXB5IGEgd2hvbGUgdGV4ZWwuCi0gICAgICoKLSAgICAgKiBGb3IgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIHdpdGggQUlHTFguCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwNzAxMjEuCi0gICAgICovCi0gICAgdm9pZCAoKnNldFRleE9mZnNldCkoX19EUkljb250ZXh0ICpwRFJJQ3R4LCBHTGludCB0ZXhuYW1lLAotCQkJIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIEdMaW50IGRlcHRoLCBHTHVpbnQgcGl0Y2gpOworICAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVOZXdDb250ZXh0KShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCSAgICAgIGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJICAgICAgaW50IHJlbmRlcl90eXBlLAorCQkJCSAgICAgIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCSAgICAgIGRybV9jb250ZXh0X3QgaHdDb250ZXh0LAorCQkJCSAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOwogfTsKIAogLyoqCi0gKiBDb250ZXh0IGRlcGVuZGVudCBtZXRob2RzLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZQotICogXGMgX19EUklzY3JlZW5SZWM6OmNyZWF0ZUNvbnRleHQgY2FsbC4KKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHNjcmVlbiwgZHJhd2FibGUgYW5kIGNvbnRleHQKKyAqIGNvbnN0cnVjdG9ycyBmb3Igc3dyYXN0IERSSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb3JlIGV4dGVuc2lvbi4KICAqLwotc3RydWN0IF9fRFJJY29udGV4dFJlYyB7Ci0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIGRlc3Ryb3kgdGhlIHByaXZhdGUgRFJJIGNvbnRleHQgZGF0YS4KLSAgICAgKi8KLSAgICB2b2lkICgqZGVzdHJveUNvbnRleHQpKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2Nybiwgdm9pZCAqY29udGV4dFByaXZhdGUpOworI2RlZmluZSBfX0RSSV9TV1JBU1QgIkRSSV9TV1Jhc3QiCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9WRVJTSU9OIDEKIAotICAgIC8qKgotICAgICAqIE9wYXF1ZSBwb2ludGVyIHRvIHByaXZhdGUgcGVyIGNvbnRleHQgZGlyZWN0IHJlbmRlcmluZyBkYXRhLgotICAgICAqIFxjIE5VTEwgaWYgZGlyZWN0IHJlbmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkaXNwbGF5IG9yCi0gICAgICogc2NyZWVuIHVzZWQgdG8gY3JlYXRlIHRoaXMgY29udGV4dC4gIE5ldmVyIGRlcmVmZXJlbmNlZCBpbiBsaWJHTC4KLSAgICAgKi8KLSAgICB2b2lkICpwcml2YXRlOworc3RydWN0IF9fRFJJc3dyYXN0RXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOwogCi0gICAgLyoqCi0gICAgICogUG9pbnRlciB0byB0aGUgbW9kZSB1c2VkIHRvIGNyZWF0ZSB0aGlzIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwNDAzMTcuCi0gICAgICovCi0gICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1vZGU7CisgICAgX19EUklzY3JlZW4gKigqY3JlYXRlTmV3U2NyZWVuKShpbnQgc2NyZWVuLAorCQkJCSAgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnMsCisJCQkJICAgIGNvbnN0IF9fRFJJY29uZmlnICoqKmRyaXZlcl9jb25maWdzLAorCQkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBiaW5kIGEgRFJJIGRyYXdhYmxlIHRvIGEgRFJJIGdyYXBoaWNzIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwNTA3MjcuCi0gICAgICovCi0gICAgR0xib29sZWFuICgqYmluZENvbnRleHQpKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgX19EUklpZCBkcmF3LAotCQkJIF9fRFJJaWQgcmVhZCwgX19EUkljb250ZXh0ICpjdHgpOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIHVuYmluZCBhIERSSSBkcmF3YWJsZSBmcm9tIGEgRFJJIGdyYXBoaWNzIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwNTA3MjcuCi0gICAgICovCi0gICAgR0xib29sZWFuICgqdW5iaW5kQ29udGV4dCkoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBfX0RSSWlkIGRyYXcsCi0JCQkgICBfX0RSSWlkIHJlYWQsIF9fRFJJY29udGV4dCAqY3R4KTsKLX07Ci0KLS8qKgotICogRHJhd2FibGUgZGVwZW5kZW50IG1ldGhvZHMuICBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBkdXJpbmcgdGhlCi0gKiBcYyBfX0RSSXNjcmVlblJlYzo6Y3JlYXRlRHJhd2FibGUgY2FsbC4gIFxjIGNyZWF0ZURyYXdhYmxlIGlzIG5vdCBjYWxsZWQKLSAqIGJ5IGxpYkdMIGF0IHRoaXMgdGltZS4gIEl0J3MgY3VycmVudGx5IHVzZWQgdmlhIHRoZSBkcmlfdXRpbC5jIHV0aWxpdHkgY29kZQotICogaW5zdGVhZC4KLSAqLwotc3RydWN0IF9fRFJJZHJhd2FibGVSZWMgewotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBkZXN0cm95IHRoZSBwcml2YXRlIERSSSBkcmF3YWJsZSBkYXRhLgotICAgICAqLwotICAgIHZvaWQgKCpkZXN0cm95RHJhd2FibGUpKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCB2b2lkICpkcmF3YWJsZVByaXZhdGUpOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIHN3YXAgdGhlIGZyb250IGFuZCBiYWNrIGJ1ZmZlcnMuCi0gICAgICovCi0gICAgdm9pZCAoKnN3YXBCdWZmZXJzKShfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgdm9pZCAqZHJhd2FibGVQcml2YXRlKTsKLQotICAgIC8qKgotICAgICAqIE9wYXF1ZSBwb2ludGVyIHRvIHByaXZhdGUgcGVyIGRyYXdhYmxlIGRpcmVjdCByZW5kZXJpbmcgZGF0YS4KLSAgICAgKiBcYyBOVUxMIGlmIGRpcmVjdCByZW5kZXJpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZGlzcGxheSBvcgotICAgICAqIHNjcmVlbiB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRyYXdhYmxlLiAgTmV2ZXIgZGVyZWZlcmVuY2VkIGluIGxpYkdMLgotICAgICAqLwotICAgIHZvaWQgKnByaXZhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgc3dhcCBidWZmZXJzIGZvciB0aGlzIGRyYXdhYmxlLgotICAgICAqCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludCAoKmdldFNCQykoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSwgaW50NjRfdCAqc2JjICk7Ci0KLSAgICAvKioKLSAgICAgKiBXYWl0IGZvciB0aGUgU0JDIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0YXJnZXRfc2JjLgotICAgICAqCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludCAoKndhaXRGb3JTQkMpKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBkcHksIHZvaWQgKmRyYXdhYmxlUHJpdiwKLQkJICAgICAgIGludDY0X3QgdGFyZ2V0X3NiYywKLQkJICAgICAgIGludDY0X3QgKiBtc2MsIGludDY0X3QgKiBzYmMgKTsKLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBNU0MgdG8gZXF1YWwgdGFyZ2V0X21zYywgb3IsIGlmIHRoYXQgaGFzIGFscmVhZHkgcGFzc2VkLAotICAgICAqIHRoZSBuZXh0IHRpbWUgKE1TQyAlIGRpdmlzb3IpIGlzIGVxdWFsIHRvIHJlbWFpbmRlci4gIElmIGRpdmlzb3IgaXMKLSAgICAgKiB6ZXJvLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYXMgc29vbiBhcyBNU0MgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCi0gICAgICogdG8gdGFyZ2V0X21zYy4KLSAgICAgKiAKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzAzMTcuCi0gICAgICovCi0gICAgaW50ICgqd2FpdEZvck1TQykoIF9fRFJJbmF0aXZlRGlzcGxheSAqIGRweSwgdm9pZCAqZHJhd2FibGVQcml2LAotCQkgICAgICAgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyLAotCQkgICAgICAgaW50NjRfdCAqIG1zYywgaW50NjRfdCAqIHNiYyApOwotCi0gICAgLyoqCi0gICAgICogTGlrZSBcYyBzd2FwQnVmZmVycywgYnV0IGRvZXMgTk9UIGhhdmUgYW4gaW1wbGljaXQgXGMgZ2xGbHVzaC4gIE9uY2UKLSAgICAgKiByZW5kZXJpbmcgaXMgY29tcGxldGUsIHdhaXRzIHVudGlsIE1TQyBpcyBlcXVhbCB0byB0YXJnZXRfbXNjLCBvcgotICAgICAqIGlmIHRoYXQgaGFzIGFscmVhZHkgcGFzc2VkLCB3YWl0cyB1bnRpbCAoTVNDICUgZGl2aXNvcikgaXMgZXF1YWwKLSAgICAgKiB0byByZW1haW5kZXIuICBJZiBkaXZpc29yIGlzIHplcm8sIHRoZSBzd2FwIHdpbGwgaGFwcGVuIGFzIHNvb24gYXMKLSAgICAgKiBNU0MgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRhcmdldF9tc2MuCi0gICAgICogCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludDY0X3QgKCpzd2FwQnVmZmVyc01TQykoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSwKLQkJCSAgICAgIGludDY0X3QgdGFyZ2V0X21zYywKLQkJCSAgICAgIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIpOwotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgZnJhbWUgdXNhZ2UgdHJhY2tpbmcuCi0gICAgICogCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludCAoKmZyYW1lVHJhY2tpbmcpKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCB2b2lkICpkcmF3YWJsZVByaXZhdGUsIEdMYm9vbGVhbiBlbmFibGUpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgZnJhbWUgdXNhZ2UgaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgotICAgICAqLwotICAgIGludCAoKnF1ZXJ5RnJhbWVUcmFja2luZykoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSwKLQkJCSAgICAgIGludDY0X3QgKiBzYmMsIGludDY0X3QgKiBtaXNzZWRGcmFtZXMsCi0JCQkgICAgICBmbG9hdCAqIGxhc3RNaXNzZWRVc2FnZSwgZmxvYXQgKiB1c2FnZSApOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfU0dJX3N3YXBfY29udHJvbCBvcgotICAgICAqIEdMWF9NRVNBX3N3YXBfY29udHJvbCBleHRlbnNpb24uCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzAzMTcuCi0gICAgICovCi0gICAgdW5zaWduZWQgc3dhcF9pbnRlcnZhbDsKLQotICAgIC8qKgotICAgICAqIFVzZWQgYnkgZHJpdmVycyB0aGF0IGltcGxlbWVudCB0aGUgR0xYX01FU0FfY29weV9zdWJfYnVmZmVyIGV4dGVuc2lvbi4KLSAgICAgKgotICAgICAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDA2MDMxNC4KLSAgICAgKi8KLSAgICB2b2lkICgqY29weVN1YkJ1ZmZlcikoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSwKLQkJCSAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworICAgIF9fRFJJZHJhd2FibGUgKigqY3JlYXRlTmV3RHJhd2FibGUpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCWNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML2ludGVybmFsL2RyaV9zYXJlYS5oIGIvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfc2FyZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkxNjFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfc2FyZWEuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IFJlZCBIYXQsIEluYworICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIG9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKKyAqIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIERSSV9TQVJFQV9ICisjZGVmaW5lIERSSV9TQVJFQV9ICisKKyNpbmNsdWRlIDxkcm0uaD4KKworLyogVGhlIERSSTIgU0FSRUEgaG9sZHMgYSBsaXN0IG9mIHNlbGYtZGVzY3JpYmluZyBibG9ja3MuICBFYWNoIGJsb2NrCisgKiBpcyA4IGJ5dGUgYWxpZ25lZCBhbmQgaGFzIGEgY29tbW9uIDMyLWJpdCBoZWFkZXIgd29yZC4gIFRoZSB1cHBlcgorICogMTYgYml0cyBkZXNjcmliZSB0aGUgdHlwZSBvZiB0aGUgYmxvY2sgYW5kIHRoZSBsb3dlciAxNiBiaXRzIHRoZQorICogc2l6ZS4gIERSSTIgb25seSBkZWZpbmVzIGEgY291cGxlIG9mIGJsb2NrcyBhbmQgYWxsb3dzIGRyaXZlcnMgdG8KKyAqIGRlZmluZSBkcml2ZXIgc3BlY2lmaWMgYmxvY2tzIHVzaW5nIHR5cGUgY29kZXMgZnJvbSAweDgwMDAgYW5kIHVwLgorICogVGhlIHR5cGUgY29kZSAweDAwMDAgZGVmaW5lcyB0aGUgZW5kIG9mIHRoZSBzYXJlYS4gKi8KKworI2RlZmluZSBEUkkyX1NBUkVBX0JMT0NLX0hFQURFUih0eXBlLCBzaXplKSAoKCh0eXBlKSA8PCAxNikgfCAoc2l6ZSkpCisjZGVmaW5lIERSSTJfU0FSRUFfQkxPQ0tfVFlQRShiKSAoKGIpID4+IDE2KQorI2RlZmluZSBEUkkyX1NBUkVBX0JMT0NLX1NJWkUoYikgKChiKSAmIDB4ZmZmZikKKyNkZWZpbmUgRFJJMl9TQVJFQV9CTE9DS19ORVhUKHApCQkJCVwKKyAgICAoKHZvaWQgKikgKCh1bnNpZ25lZCBjaGFyICopIChwKSArCQkJCVwKKyAgICAgICAgICAgICAgIERSSTJfU0FSRUFfQkxPQ0tfU0laRSgqKHVuc2lnbmVkIGludCAqKSBwKSkpCisKKyNkZWZpbmUgRFJJMl9TQVJFQV9CTE9DS19FTkQJCTB4MDAwMAorI2RlZmluZSBEUkkyX1NBUkVBX0JMT0NLX0xPQ0sJCTB4MDAwMQorI2RlZmluZSBEUkkyX1NBUkVBX0JMT0NLX0VWRU5UX0JVRkZFUgkweDAwMDIKKworLyogQ2hpcHNldCBzcGVjaWZpYyBibG9ja3Mgc3RhcnQgYXQgMHg4MDAwLCAweGZmZmYgaXMgcmVzZXJ2ZWQuICovCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJTG9jayBfX0RSSUxvY2s7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSUV2ZW50QnVmZmVyIF9fRFJJRXZlbnRCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSURyYXdhYmxlQnVmZmVyIF9fRFJJRHJhd2FibGVCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSURyYXdhYmxlQ29uZmlnRXZlbnQgX19EUklEcmF3YWJsZUNvbmZpZ0V2ZW50OwordHlwZWRlZiBzdHJ1Y3QgX19EUklCdWZmZXJBdHRhY2hFdmVudCBfX0RSSUJ1ZmZlckF0dGFjaEV2ZW50OworCitzdHJ1Y3QgX19EUklMb2NrIHsKKyAgICB1bnNpZ25lZCBpbnQgYmxvY2tfaGVhZGVyOworICAgIGRybV9od19sb2NrX3QgbG9jazsKKworICAgIC8qIFdlIHVzZSB0aGlzIHdpdGggRFJNX0NBUyB0byBhbGxvY2F0ZSBsb2NrIElEcyBmb3IgdGhlIHJlYWwgbG9jay4qLworICAgIHVuc2lnbmVkIGludCBuZXh0X2lkOworfTsKKworc3RydWN0IF9fRFJJRXZlbnRCdWZmZXIgeworICAgIHVuc2lnbmVkIGludCBibG9ja19oZWFkZXI7CisgICAgdW5zaWduZWQgaW50IGhlYWQ7CQkvKiBsYXN0IHZhbGlkIGV2ZW50ICovCisgICAgdW5zaWduZWQgaW50IHByZWFsbG9jOwkvKiBldmVudCBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiAqLworICAgIHVuc2lnbmVkIGludCBzaXplOwkJLyogc2l6ZSBvZiBkYXRhICovCisgICAgdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworZW51bSB7CisgICAgICAgIC8qIHRoZSBmb3VyIHN0YW5kYXJkIGNvbG9yIGJ1ZmZlcnMgKi8KKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9GUk9OVF9MRUZUICA9IDAsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfQkFDS19MRUZUICAgPSAxLAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX0ZST05UX1JJR0hUID0gMiwKKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9CQUNLX1JJR0hUICA9IDMsCisgICAgICAgIC8qIG9wdGlvbmFsIGF1eCBidWZmZXIgKi8KKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9BVVgwICAgICAgICA9IDQsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfQVVYMSAgICAgICAgPSA1LAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX0FVWDIgICAgICAgID0gNiwKKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9BVVgzICAgICAgICA9IDcsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfREVQVEggICAgICAgPSA4LAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX1NURU5DSUwgICAgID0gOSwKKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9BQ0NVTSAgICAgICA9IDEwLAorICAgICAgICAvKiBnZW5lcmljIHJlbmRlcmJ1ZmZlcnMgKi8KKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9DT0xPUjAgICAgICA9IDExLAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX0NPTE9SMSAgICAgID0gMTIsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfQ09MT1IyICAgICAgPSAxMywKKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9DT0xPUjMgICAgICA9IDE0LAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX0NPTE9SNCAgICAgID0gMTUsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfQ09MT1I1ICAgICAgPSAxNiwKKyAgICAgICAgRFJJX0RSQVdBQkxFX0JVRkZFUl9DT0xPUjYgICAgICA9IDE3LAorICAgICAgICBEUklfRFJBV0FCTEVfQlVGRkVSX0NPTE9SNyAgICAgID0gMTgsCisgICAgICAgIERSSV9EUkFXQUJMRV9CVUZGRVJfQ09VTlQgICAgICAgPSAxOQorfTsKKworc3RydWN0IF9fRFJJRHJhd2FibGVCdWZmZXIgeworICAgIHVuc2lnbmVkIGludCBhdHRhY2htZW50OworICAgIHVuc2lnbmVkIGludCBoYW5kbGU7CisgICAgdW5zaWduZWQgaW50IHBpdGNoOworICAgIHVuc2lnbmVkIHNob3J0IGNwcDsKKworICAgIC8qIFVwcGVyIDggYml0cyBhcmUgZHJpdmVyIHNwZWNpZmljLCBsb3dlciA4IGJpdHMgZ2VuZXJpYy4gIFRoZQorICAgICAqIGJpdHMgY2FuIGluaWRpY2F0ZSBidWZmZXIgcHJvcGVydGllcyBzdWNoIGFzIHRpbGVkLCBzd2l6emxlZCBldGMuICovCisgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Cit9OworCisjZGVmaW5lIERSSTJfRVZFTlRfSEVBREVSKHR5cGUsIHNpemUpICgoKHR5cGUpIDw8IDE2KSB8IChzaXplKSkKKyNkZWZpbmUgRFJJMl9FVkVOVF9UWVBFKGIpICgoYikgPj4gMTYpCisjZGVmaW5lIERSSTJfRVZFTlRfU0laRShiKSAoKGIpICYgMHhmZmZmKQorCisjZGVmaW5lIERSSTJfRVZFTlRfUEFECQkJMHgwMDAwCisjZGVmaW5lIERSSTJfRVZFTlRfRFJBV0FCTEVfQ09ORklHCTB4MDAwMQorI2RlZmluZSBEUkkyX0VWRU5UX0JVRkZFUl9BVFRBQ0gJMHgwMDAyCisKK3N0cnVjdCBfX0RSSURyYXdhYmxlQ29uZmlnRXZlbnQgeworICAgIHVuc2lnbmVkIGludAkJZXZlbnRfaGVhZGVyOworICAgIHVuc2lnbmVkIGludAkJZHJhd2FibGU7CisgICAgc2hvcnQJCQl4OworICAgIHNob3J0CQkJeTsKKyAgICB1bnNpZ25lZCBpbnQJCXdpZHRoOworICAgIHVuc2lnbmVkIGludAkJaGVpZ2h0OworICAgIHVuc2lnbmVkIGludAkJbnVtX3JlY3RzOworICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0CXJlY3RzWzBdOworfTsKKworc3RydWN0IF9fRFJJQnVmZmVyQXR0YWNoRXZlbnQgeworICAgIHVuc2lnbmVkIGludAlldmVudF9oZWFkZXI7CisgICAgdW5zaWduZWQgaW50CWRyYXdhYmxlOworICAgIF9fRFJJRHJhd2FibGVCdWZmZXIJYnVmZmVyOworfTsKKworI2VuZGlmIC8qIERSSV9TQVJFQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML2ludGVybmFsL2dsY29yZS5oIGIvaW5jbHVkZS9HTC9pbnRlcm5hbC9nbGNvcmUuaAppbmRleCBkNjJmMzFiLi5hM2FmM2I1IDEwMDY0NAotLS0gYS9pbmNsdWRlL0dML2ludGVybmFsL2dsY29yZS5oCisrKyBiL2luY2x1ZGUvR0wvaW50ZXJuYWwvZ2xjb3JlLmgKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgR0xfQ09SRV9TR0kgIDEKICNkZWZpbmUgR0xfQ09SRV9NRVNBIDIKICNkZWZpbmUgR0xfQ09SRV9BUFBMRSA0CisjZGVmaW5lIEdMX0NPUkVfV0lORE9XUyA4CiAKIHR5cGVkZWYgc3RydWN0IF9fR0xjb250ZXh0UmVjIF9fR0xjb250ZXh0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML21lc2Ffd2dsLmggYi9pbmNsdWRlL0dML21lc2Ffd2dsLmgKaW5kZXggMWQ3NzQ1Ny4uNTcxNDcyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC9tZXNhX3dnbC5oCisrKyBiL2luY2x1ZGUvR0wvbWVzYV93Z2wuaApAQCAtODEsOCArODEsNiBAQAogV0dMQVBJIGludCAgIEdMQVBJRU5UUlkgd2dsRGVzY3JpYmVQaXhlbEZvcm1hdChIREMsaW50LCB1bnNpZ25lZCBpbnQsIExQUElYRUxGT1JNQVRERVNDUklQVE9SKTsKIFdHTEFQSSBpbnQgICBHTEFQSUVOVFJZIHdnbEdldFBpeGVsRm9ybWF0KEhEQyBoZGMpOwogCi0KLSNpZiBkZWZpbmVkKEdMX05PX1NURENBTEwpIHx8ICFkZWZpbmVkKF9fTUlOR1czMl9fKQogV0dMQVBJIGludCAgIEdMQVBJRU5UUlkgd2dsQ29weUNvbnRleHQoSEdMUkMsIEhHTFJDLCB1bnNpZ25lZCBpbnQpOwogV0dMQVBJIEhHTFJDIEdMQVBJRU5UUlkgd2dsQ3JlYXRlQ29udGV4dChIREMpOwogV0dMQVBJIEhHTFJDIEdMQVBJRU5UUlkgd2dsQ3JlYXRlTGF5ZXJDb250ZXh0KEhEQyxpbnQpOwpAQCAtMTAxLDcgKzk5LDYgQEAKIFdHTEFQSSBpbnQgICBHTEFQSUVOVFJZIHdnbFVzZUZvbnRCaXRtYXBzVyhIREMsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogV0dMQVBJIGludCAgIEdMQVBJRU5UUlkgd2dsVXNlRm9udE91dGxpbmVzQShIREMsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGZsb2F0LGZsb2F0LCBpbnQsIExQR0xZUEhNRVRSSUNTRkxPQVQpOwogV0dMQVBJIGludCAgIEdMQVBJRU5UUlkgd2dsVXNlRm9udE91dGxpbmVzVyhIREMsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGZsb2F0LGZsb2F0LCBpbnQsIExQR0xZUEhNRVRSSUNTRkxPQVQpOwotI2VuZGlmCiAKICNpZm5kZWYgX19NSU5HVzMyX18KIFdHTEFQSSBpbnQgICBHTEFQSUVOVFJZIFN3YXBCdWZmZXJzKEhEQyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML3dtZXNhLmggYi9pbmNsdWRlL0dML3dtZXNhLmgKaW5kZXggMWM5NTlhNi4uZjVmNGYyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTC93bWVzYS5oCisrKyBiL2luY2x1ZGUvR0wvd21lc2EuaApAQCAtMTMwLDcgKzEzMCw3IEBACiAKIGV4dGVybiB2b2lkIFdNZXNhTW92ZSh2b2lkKTsKIAotCit2b2lkIFdNZXNhU2hhcmVMaXN0cyhXTWVzYUNvbnRleHQgY3R4X3RvX3NoYXJlLCBXTWVzYUNvbnRleHQgY3R4KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL0dML3htZXNhX3hmODYuaCBiL2luY2x1ZGUvR0wveG1lc2FfeGY4Ni5oCmluZGV4IDRkNjlkNGQuLjEwZjkzYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvR0wveG1lc2FfeGY4Ni5oCisrKyBiL2luY2x1ZGUvR0wveG1lc2FfeGY4Ni5oCkBAIC0xNjksOCArMTY5LDEzIEBACiAKIAogLyogQ3JlYXRlUGl4bWFwIHJldHVybnMgYSBQaXhtYXBQdHI7IHNvLCBpdCBjYW5ub3QgYmUgaW5zaWRlIGJyYWNlcyAqLworI2lmZGVmIENSRUFURV9QSVhNQVBfVVNBR0VfU0NSQVRDSAorI2RlZmluZSBYTWVzYUNyZWF0ZVBpeG1hcChfX2QsX19iLF9fdyxfX2gsX19kZXB0aCkgXAorICAoKl9fZC0+Q3JlYXRlUGl4bWFwKShfX2QsIF9fdywgX19oLCBfX2RlcHRoLCAwKQorI2Vsc2UKICNkZWZpbmUgWE1lc2FDcmVhdGVQaXhtYXAoX19kLF9fYixfX3csX19oLF9fZGVwdGgpIFwKICAgICAoKl9fZC0+Q3JlYXRlUGl4bWFwKShfX2QsIF9fdywgX19oLCBfX2RlcHRoKQorI2VuZGlmCiAKICNkZWZpbmUgWE1lc2FGcmVlUGl4bWFwKF9fZCxfX2IpIFwKICAgICAoKl9fZC0+RGVzdHJveVBpeG1hcCkoX19iKQpkaWZmIC0tZ2l0IGEvcHJvZ3MvTWFrZWZpbGUgYi9wcm9ncy9NYWtlZmlsZQppbmRleCA1ZTcwNWVmLi5jOTlmNGVlIDEwMDY0NAotLS0gYS9wcm9ncy9NYWtlZmlsZQorKysgYi9wcm9ncy9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogaW5zdGFsbDoKIAogY2xlYW46Ci0JQGZvciBkaXIgaW4gJChTVUJESVJTKSB0ZXN0cyA7IGRvIFwKKwktQGZvciBkaXIgaW4gJChTVUJESVJTKSB0ZXN0cyA7IGRvIFwKIAkJaWYgWyAtZCAkJGRpciBdIDsgdGhlbiBcCiAJCQkoY2QgJCRkaXIgJiYgJChNQUtFKSBjbGVhbikgOyBcCiAJCWZpIFwKZGlmZiAtLWdpdCBhL3Byb2dzL2Jlb3MvTWFrZWZpbGUgYi9wcm9ncy9iZW9zL01ha2VmaWxlCmluZGV4IDQ1NzgyZmIuLjBkYzRjZGMgMTAwNjQ0Ci0tLSBhL3Byb2dzL2Jlb3MvTWFrZWZpbGUKKysrIGIvcHJvZ3MvYmVvcy9NYWtlZmlsZQpAQCAtMTAsMjQgKzEwLDI2IEBACiAjCiAjIE1vZGlmaWVkIGJ5IFBoaWxpcHBlIEhvdWRvaW4KIAotTERGTEFHUyArPSAtc29uYW1lPV9BUFBfICQoQVBQX0xJQl9ERVBTKQorTERGTEFHUyArPSAtc29uYW1lPV9BUFBfCisKK0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQogCiBJTkNMVURFUyA9IC1JLiAtSS0gLUkuLi8uLi9pbmNsdWRlCiAKIGRlZmF1bHQ6IGRlbW8gc2FtcGxlIEdMSW5mbwogCiBjbGVhbjoKLQlybSAtZiBkZW1vIHNhbXBsZSBHTEluZm8KLQlybSAtZiAqLm8KKwktcm0gLWYgZGVtbyBzYW1wbGUgR0xJbmZvCisJLXJtIC1mICoubwogCiBkZW1vOiBkZW1vLm8KLQkkKExEKSBkZW1vLm8gJChMREZMQUdTKSAtbyAkQAorCSQoTEQpIGRlbW8ubyAkKExERkxBR1MpICQoTElCUykgLW8gJEAKIAogc2FtcGxlOiBzYW1wbGUubwotCSQoTEQpIHNhbXBsZS5vICQoTERGTEFHUykgLW8gJEAKKwkkKExEKSBzYW1wbGUubyAkKExERkxBR1MpICQoTElCUykgLW8gJEAKIAogR1RMSW5mbzogR0xJbmZvLm8KLQkkKExEKSBHTEluZm8ubyAkKElOQ0xVREVTKSAkKExERkxBR1MpIC1vICRACisJJChMRCkgR0xJbmZvLm8gJChJTkNMVURFUykgJChMREZMQUdTKSAkKExJQlMpIC1vICRACiAKIC5jcHAubzoKIAkkKENDKSAtYyAkPCAkKElOQ0xVREVTKSAkKENGTEFHUykgLW8gJEAKZGlmZiAtLWdpdCBhL3Byb2dzL2RlbW9zLy5naXRpZ25vcmUgYi9wcm9ncy9kZW1vcy8uZ2l0aWdub3JlCmluZGV4IGQ5ZTQ4ODEuLjM2OTNmYWYgMTAwNjQ0Ci0tLSBhL3Byb2dzL2RlbW9zLy5naXRpZ25vcmUKKysrIGIvcHJvZ3MvZGVtb3MvLmdpdGlnbm9yZQpAQCAtMyw2ICszLDcgQEAKIGFyYm9jY2x1ZGUKIGJvdW5jZQogY2xlYXJzcGQKK2NvcHlwaXgKIGN1YmVtYXAKIGRyYXdwaXgKIGVuZ2luZQpAQCAtMzAsNiArMzEsNyBAQAogcGFsdGV4CiBwaXhlbHRleAogcG9pbnRibGFzdAorcmFpbgogcmF5CiByZWFkcGl4CiByZWFkdGV4LmMKZGlmZiAtLWdpdCBhL3Byb2dzL2RlbW9zL01ha2VmaWxlIGIvcHJvZ3MvZGVtb3MvTWFrZWZpbGUKaW5kZXggNDM4NzRlYy4uODFkOWViZSAxMDA2NDQKLS0tIGEvcHJvZ3MvZGVtb3MvTWFrZWZpbGUKKysrIGIvcHJvZ3MvZGVtb3MvTWFrZWZpbGUKQEAgLTExLDcgKzExLDExIEBACiAKIE9TTUVTQTMyX0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sZ2x1dCAtbE9TTWVzYTMyIC1sR0xVIC1sR0wgJChBUFBfTElCX0RFUFMpCiAKLUxJQl9ERVAgPSAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKQorTElCX0RFUCA9ICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVX0xJQl9OQU1FKSBcCisJJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKQorCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSBcCisJJChBUFBfTElCX0RFUFMpCiAKIFBST0dTID0gXAogCWFyYmZwbGlnaHQgXApAQCAtMTksOSArMjMsMTEgQEAKIAlhcmJvY2NsdWRlIFwKIAlib3VuY2UgXAogCWNsZWFyc3BkIFwKKwljb3B5cGl4IFwKIAljdWJlbWFwIFwKIAlkcmF3cGl4IFwKIAllbmdpbmUgXAorCWZib19maXJlY3ViZSBcCiAJZmlyZSBcCiAJZm9nY29vcmQgXAogCWZwbGlnaHQgXApAQCAtNDIsNiArNDgsNyBAQAogCW11bHRpYXJiIFwKIAlwYWx0ZXggXAogCXBvaW50Ymxhc3QgXAorCXJhaW4gXAogCXJheSBcCiAJcmVhZHBpeCBcCiAJcmVmbGVjdCBcCkBAIC03MCwxMSArNzcsMTEgQEAKIAogLlNVRkZJWEVTOgogLlNVRkZJWEVTOiAuYwotCisuU1VGRklYRVM6IC5jeHgKIAogIyBtYWtlIGV4ZWN1dGFibGUgZnJvbSAuYyBmaWxlOgogLmM6ICQoTElCX0RFUCkgcmVhZHRleC5vCi0JJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQ8IHJlYWR0ZXgubyAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSAkPCByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAogCiAKICMjIyMjIFRBUkdFVFMgIyMjIyMKQEAgLTExOCwzOSArMTI1LDUxIEBACiAKIAogcmVmbGVjdDogcmVmbGVjdC5vIHNob3didWZmZXIubyByZWFkdGV4Lm8KLQkkKENDKSByZWZsZWN0Lm8gc2hvd2J1ZmZlci5vIHJlYWR0ZXgubyAkKEFQUF9MSUJfREVQUykgJChBUkNIX0ZMQUdTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHJlZmxlY3QubyBzaG93YnVmZmVyLm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKIAogcmVmbGVjdC5vOiByZWZsZWN0LmMgc2hvd2J1ZmZlci5oCiAJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIHJlZmxlY3QuYwogCiAKIHNoYWRvd3RleDogc2hhZG93dGV4Lm8gc2hvd2J1ZmZlci5vCi0JJChDQykgc2hhZG93dGV4Lm8gc2hvd2J1ZmZlci5vICQoQVBQX0xJQl9ERVBTKSAkKEFSQ0hfRkxBR1MpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgc2hhZG93dGV4Lm8gc2hvd2J1ZmZlci5vICQoTElCUykgLW8gJEAKIAogc2hhZG93dGV4Lm86IHNoYWRvd3RleC5jIHNob3didWZmZXIuaAogCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBzaGFkb3d0ZXguYwogCiAKIGdsb3NzOiBnbG9zcy5vIHRyYWNrYmFsbC5vIHJlYWR0ZXgubwotCSQoQ0MpIGdsb3NzLm8gdHJhY2tiYWxsLm8gcmVhZHRleC5vICQoQVBQX0xJQl9ERVBTKSAkKEFSQ0hfRkxBR1MpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgZ2xvc3MubyB0cmFja2JhbGwubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAogCiBnbG9zcy5vOiBnbG9zcy5jIHRyYWNrYmFsbC5oCiAJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIGdsb3NzLmMKIAogCiBlbmdpbmU6IGVuZ2luZS5vIHRyYWNrYmFsbC5vIHJlYWR0ZXgubwotCSQoQ0MpIGVuZ2luZS5vIHRyYWNrYmFsbC5vIHJlYWR0ZXgubyAkKEFQUF9MSUJfREVQUykgJChBUkNIX0ZMQUdTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGVuZ2luZS5vIHRyYWNrYmFsbC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACiAKIGVuZ2luZS5vOiBlbmdpbmUuYyB0cmFja2JhbGwuaAogCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBlbmdpbmUuYwogCiAKIGZzbGlnaHQ6IGZzbGlnaHQubwotCSQoQ0MpIGZzbGlnaHQubyAkKEFQUF9MSUJfREVQUykgJChBUkNIX0ZMQUdTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGZzbGlnaHQubyAkKExJQlMpIC1vICRACiAKIGZzbGlnaHQubzogZnNsaWdodC5jIGV4dGZ1bmNzLmgKIAkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgZnNsaWdodC5jCiAKK3JhaW46IHBhcnRpY2xlcy5vIHJhaW4ubyByZWFkdGV4Lm8KKwkkKENYWCkgJChDWFhGTEFHUykgJChMREZMQUdTKSAkXiAkKExJQlMpIC1vICRACisKK3JhaW4ubzogcmFpbi5jeHggcmVhZHRleC5oCisJJChDWFgpIC1jIC1JJChJTkNESVIpICQoQ1hYRkxBR1MpICQ8CisKK3BhcnRpY2xlcy5vOiBwYXJ0aWNsZXMuY3h4CisJJChDWFgpIC1jIC1JJChJTkNESVIpICQoQ1hYRkxBR1MpICQ8CisKKwordmlld2Rkczogdmlld2Rkcy5jCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQ8IHJlYWR0ZXgubyAkKExJQlMpIC1MLiAtbGdsdGMgLW8gJEAKIAogCiBjbGVhbjoKZGlmZiAtLWdpdCBhL3Byb2dzL2RlbW9zL2NvcHlwaXguYyBiL3Byb2dzL2RlbW9zL2NvcHlwaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTAwMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MvZGVtb3MvY29weXBpeC5jCkBAIC0wLDAgKzEsMjQ4IEBACisvKioKKyAqIGdsQ29weVBpeGVscyB0ZXN0CisgKiAKKyAqIEJyaWFuIFBhdWwKKyAqIDE0IFNlcCAyMDA3CisgKi8KKworCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorCisjaW5jbHVkZSAicmVhZHRleC5oIgorCisjZGVmaW5lIElNQUdFX0ZJTEUgIi4uL2ltYWdlcy9hcmNoLnJnYiIKKworc3RhdGljIGludCBJbWdXaWR0aCwgSW1nSGVpZ2h0Oworc3RhdGljIEdMZW51bSBJbWdGb3JtYXQ7CitzdGF0aWMgR0x1Ynl0ZSAqSW1hZ2UgPSBOVUxMOworCitzdGF0aWMgaW50IFdpbldpZHRoID0gODAwLCBXaW5IZWlnaHQgPSA4MDA7CitzdGF0aWMgaW50IFhwb3MsIFlwb3M7CitzdGF0aWMgaW50IFNjaXNzb3IgPSAwOworc3RhdGljIGZsb2F0IFh6b29tLCBZem9vbTsKK3N0YXRpYyBHTGJvb2xlYW4gRHJhd0Zyb250ID0gR0xfRkFMU0U7CitzdGF0aWMgR0xib29sZWFuIERpdGhlciA9IEdMX1RSVUU7CisKKworc3RhdGljIHZvaWQgUmVzZXQoIHZvaWQgKQoreworICAgWHBvcyA9IFlwb3MgPSAyMDsKKyAgIFNjaXNzb3IgPSAwOworICAgWHpvb20gPSBZem9vbSA9IDEuMDsKK30KKworCitzdGF0aWMgdm9pZCBEaXNwbGF5KCB2b2lkICkKK3sKKyAgIGNvbnN0IGludCBkeCA9IChXaW5XaWR0aCAtIEltZ1dpZHRoKSAvIDI7CisgICBjb25zdCBpbnQgZHkgPSAoV2luSGVpZ2h0IC0gSW1nSGVpZ2h0KSAvIDI7CisKKyAgIGlmIChEcmF3RnJvbnQpIHsKKyAgICAgIGdsRHJhd0J1ZmZlcihHTF9GUk9OVCk7CisgICAgICBnbFJlYWRCdWZmZXIoR0xfRlJPTlQpOworICAgfQorICAgZWxzZSB7CisgICAgICBnbERyYXdCdWZmZXIoR0xfQkFDSyk7CisgICAgICBnbFJlYWRCdWZmZXIoR0xfQkFDSyk7CisgICB9CisKKyAgIGdsQ2xlYXIoIEdMX0NPTE9SX0JVRkZFUl9CSVQgKTsKKworICAgLyogZHJhdyBvcmlnaW5hbCBpbWFnZSAqLworICAgZ2xXaW5kb3dQb3MyaUFSQihkeCwgZHkpOyAgICAgICAgICAgICAgICAgICAgCisgICBnbERyYXdQaXhlbHMoSW1nV2lkdGgsIEltZ0hlaWdodCwgSW1nRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCBJbWFnZSk7CisKKyAgIGlmIChTY2lzc29yKQorICAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgLyogZHJhdyBjb3B5ICovCisgICBnbFBpeGVsWm9vbShYem9vbSwgWXpvb20pOworICAgZ2xXaW5kb3dQb3MyaUFSQihYcG9zLCBZcG9zKTsKKyAgIGdsQ29weVBpeGVscyhkeCwgZHksIEltZ1dpZHRoLCBJbWdIZWlnaHQsIEdMX0NPTE9SKTsKKyAgIGdsUGl4ZWxab29tKDEsIDEpOworCisgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgaWYgKERyYXdGcm9udCkKKyAgICAgIGdsRmluaXNoKCk7CisgICBlbHNlCisgICAgICBnbHV0U3dhcEJ1ZmZlcnMoKTsKK30KKworCitzdGF0aWMgdm9pZCBSZXNoYXBlKCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworICAgV2luV2lkdGggPSB3aWR0aDsKKyAgIFdpbkhlaWdodCA9IGhlaWdodDsKKworICAgZ2xWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworICAgZ2xNYXRyaXhNb2RlKCBHTF9QUk9KRUNUSU9OICk7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xPcnRobyggMC4wLCB3aWR0aCwgMC4wLCBoZWlnaHQsIDAuMCwgMi4wICk7CisgICBnbE1hdHJpeE1vZGUoIEdMX01PREVMVklFVyApOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgZ2xTY2lzc29yKHdpZHRoLzQsIGhlaWdodC80LCB3aWR0aC8yLCBoZWlnaHQvMik7Cit9CisKKworc3RhdGljIHZvaWQgS2V5KCB1bnNpZ25lZCBjaGFyIGtleSwgaW50IHgsIGludCB5ICkKK3sKKyAgICh2b2lkKSB4OworICAgKHZvaWQpIHk7CisgICBzd2l0Y2ggKGtleSkgeworICAgICAgY2FzZSAnICc6CisgICAgICAgICBSZXNldCgpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJzoKKyAgICAgICAgIERpdGhlciA9ICFEaXRoZXI7CisgICAgICAgICBpZiAoRGl0aGVyKQorICAgICAgICAgICAgZ2xFbmFibGUoR0xfRElUSEVSKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoKKyAgICAgICAgIFNjaXNzb3IgPSAhU2Npc3NvcjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAneCc6CisgICAgICAgICBYem9vbSAtPSAwLjE7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgWHpvb20gKz0gMC4xOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd5JzoKKyAgICAgICAgIFl6b29tIC09IDAuMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnWSc6CisgICAgICAgICBZem9vbSArPSAwLjE7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgRHJhd0Zyb250ID0gIURyYXdGcm9udDsKKyAgICAgICAgIHByaW50ZigiZ2xEcmF3QnVmZmVyKCVzKVxuIiwgRHJhd0Zyb250ID8gIkdMX0ZST05UIiA6ICJHTF9CQUNLIik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjc6CisgICAgICAgICBleGl0KDApOworICAgICAgICAgYnJlYWs7CisgICB9CisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKK3N0YXRpYyB2b2lkIFNwZWNpYWxLZXkoIGludCBrZXksIGludCB4LCBpbnQgeSApCit7CisgICBjb25zdCBpbnQgc3RlcCA9IChnbHV0R2V0TW9kaWZpZXJzKCkgJiBHTFVUX0FDVElWRV9TSElGVCkgPyAxMCA6IDE7CisgICAodm9pZCkgeDsKKyAgICh2b2lkKSB5OworICAgc3dpdGNoIChrZXkpIHsKKyAgICAgIGNhc2UgR0xVVF9LRVlfVVA6CisgICAgICAgICBZcG9zICs9IHN0ZXA7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xVVF9LRVlfRE9XTjoKKyAgICAgICAgIFlwb3MgLT0gc3RlcDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTFVUX0tFWV9MRUZUOgorICAgICAgICAgWHBvcyAtPSBzdGVwOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMVVRfS0VZX1JJR0hUOgorICAgICAgICAgWHBvcyArPSBzdGVwOworICAgICAgICAgYnJlYWs7CisgICB9CisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKK3N0YXRpYyB2b2lkIEluaXQoIEdMYm9vbGVhbiBjaU1vZGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lICkKK3sKKyAgIHByaW50ZigiR0xfVkVSU0lPTiA9ICVzXG4iLCAoY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKSk7CisgICBwcmludGYoIkdMX1JFTkRFUkVSID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSk7CisKKyAgIEltYWdlID0gTG9hZFJHQkltYWdlKCBmaWxlbmFtZSwgJkltZ1dpZHRoLCAmSW1nSGVpZ2h0LCAmSW1nRm9ybWF0ICk7CisgICBpZiAoIUltYWdlKSB7CisgICAgICBwcmludGYoIkNvdWxkbid0IHJlYWQgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGV4aXQoMCk7CisgICB9CisKKyAgIGlmIChjaU1vZGUpIHsKKyAgICAgIC8qIENvbnZlcnQgUkdCIGltYWdlIHRvIGdyYXlzY2FsZSAqLworICAgICAgR0x1Ynl0ZSAqaW5kZXhJbWFnZSA9IChHTHVieXRlICopIG1hbGxvYyggSW1nV2lkdGggKiBJbWdIZWlnaHQgKTsKKyAgICAgIEdMaW50IGk7CisgICAgICBmb3IgKGk9MDsgaTxJbWdXaWR0aCpJbWdIZWlnaHQ7IGkrKykgeworICAgICAgICAgaW50IGdyYXkgPSBJbWFnZVtpKjNdICsgSW1hZ2VbaSozKzFdICsgSW1hZ2VbaSozKzJdOworICAgICAgICAgaW5kZXhJbWFnZVtpXSA9IGdyYXkgLyAzOworICAgICAgfQorICAgICAgZnJlZShJbWFnZSk7CisgICAgICBJbWFnZSA9IGluZGV4SW1hZ2U7CisgICAgICBJbWdGb3JtYXQgPSBHTF9DT0xPUl9JTkRFWDsKKworICAgICAgZm9yIChpPTA7aTwyNTU7aSsrKSB7CisgICAgICAgICBmbG9hdCBnID0gaSAvIDI1NS4wOworICAgICAgICAgZ2x1dFNldENvbG9yKGksIGcsIGcsIGcpOworICAgICAgfQorICAgfQorCisgICBwcmludGYoIkxvYWRlZCAlZCBieSAlZCBpbWFnZVxuIiwgSW1nV2lkdGgsIEltZ0hlaWdodCApOworCisgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgSW1nV2lkdGgpOworCisgICBSZXNldCgpOworfQorCisKK3N0YXRpYyB2b2lkIFVzYWdlKHZvaWQpCit7CisgICBwcmludGYoIktleXM6XG4iKTsKKyAgIHByaW50ZigiICAgICAgIFNQQUNFICBSZXNldCBQYXJhbWV0ZXJzXG4iKTsKKyAgIHByaW50ZigiICAgICBVcC9Eb3duICBNb3ZlIGltYWdlIHVwL2Rvd24gKFNISUZUIGZvciBsYXJnZSBzdGVwKVxuIik7CisgICBwcmludGYoIiAgTGVmdC9SaWdodCAgTW92ZSBpbWFnZSBsZWZ0L3JpZ2h0IChTSElGVCBmb3IgbGFyZ2Ugc3RlcClcbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIHggIERlY3JlYXNlIFgtYXhpcyBQaXhlbFpvb21cbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIFggIEluY3JlYXNlIFgtYXhpcyBQaXhlbFpvb21cbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIHkgIERlY3JlYXNlIFktYXhpcyBQaXhlbFpvb21cbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIFkgIEluY3JlYXNlIFktYXhpcyBQaXhlbFpvb21cbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIHMgIFRvZ2dsZSBHTF9TQ0lTU09SX1RFU1RcbiIpOworICAgcHJpbnRmKCIgICAgICAgICAgIGYgIFRvZ2dsZSBmcm9udC9iYWNrIGJ1ZmZlciBkcmF3aW5nXG4iKTsKKyAgIHByaW50ZigiICAgICAgICAgRVNDICBFeGl0XG4iKTsKK30KKworCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCit7CisgICBHTGJvb2xlYW4gY2lNb2RlID0gR0xfRkFMU0U7CisgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IElNQUdFX0ZJTEU7CisgICBpbnQgaSA9IDE7CisKKyAgIGlmIChhcmdjID4gaSAmJiBzdHJjbXAoYXJndltpXSwgIi1jaSIpPT0wKSB7CisgICAgICBjaU1vZGUgPSBHTF9UUlVFOworICAgICAgaSsrOworICAgfQorICAgaWYgKGFyZ2MgPiBpKSB7CisgICAgICBmaWxlbmFtZSA9IGFyZ3ZbaV07CisgICB9CisKKyAgIGdsdXRJbml0KCAmYXJnYywgYXJndiApOworICAgZ2x1dEluaXRXaW5kb3dQb3NpdGlvbiggMCwgMCApOworICAgZ2x1dEluaXRXaW5kb3dTaXplKCBXaW5XaWR0aCwgV2luSGVpZ2h0ICk7CisKKyAgIGlmIChjaU1vZGUpCisgICAgICBnbHV0SW5pdERpc3BsYXlNb2RlKCBHTFVUX0lOREVYIHwgR0xVVF9ET1VCTEUgKTsKKyAgIGVsc2UKKyAgICAgIGdsdXRJbml0RGlzcGxheU1vZGUoIEdMVVRfUkdCIHwgR0xVVF9ET1VCTEUpOworCisgICBnbHV0Q3JlYXRlV2luZG93KGFyZ3ZbMF0pOworCisgICBJbml0KGNpTW9kZSwgZmlsZW5hbWUpOworICAgVXNhZ2UoKTsKKworICAgZ2x1dFJlc2hhcGVGdW5jKCBSZXNoYXBlICk7CisgICBnbHV0S2V5Ym9hcmRGdW5jKCBLZXkgKTsKKyAgIGdsdXRTcGVjaWFsRnVuYyggU3BlY2lhbEtleSApOworICAgZ2x1dERpc3BsYXlGdW5jKCBEaXNwbGF5ICk7CisKKyAgIGdsdXRNYWluTG9vcCgpOworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy9kZW1vcy9jdWJlbWFwLmMgYi9wcm9ncy9kZW1vcy9jdWJlbWFwLmMKaW5kZXggZWY1ZDIzNS4uYjNiZGQ2NCAxMDA2NDQKLS0tIGEvcHJvZ3MvZGVtb3MvY3ViZW1hcC5jCisrKyBiL3Byb2dzL2RlbW9zL2N1YmVtYXAuYwpAQCAtNDcsNiArNDcsOCBAQAogc3RhdGljIEdMZmxvYXQgRXllRGlzdCA9IDEwOwogc3RhdGljIEdMYm9vbGVhbiB1c2VfdmVydGV4X2FycmF5cyA9IEdMX0ZBTFNFOwogc3RhdGljIEdMYm9vbGVhbiBhbmltID0gR0xfVFJVRTsKK3N0YXRpYyBHTGJvb2xlYW4gTm9DbGVhciA9IEdMX0ZBTFNFOworc3RhdGljIEdMaW50IEZyYW1lUGFyaXR5ID0gMDsKIAogI2RlZmluZSBlcHMxIDAuOTkKICNkZWZpbmUgYnIgICAyMC4wICAvKiBib3ggcmFkaXVzICovCkBAIC0xNTYsNyArMTU4LDMwIEBACiAKIHN0YXRpYyB2b2lkIGRyYXcoIHZvaWQgKQogewotICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisgICBpZiAoTm9DbGVhcikgeworICAgICAgLyogVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHdlIGNhbiBhdm9pZCBjYWxsaW5nIGdsQ2xlYXIuCisgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIGV2ZXJ5IHBpeGVsIGluIHRoZSB3aW5kb3cgaXMgcGFpbnRlZCBmb3IKKyAgICAgICAqIGV2ZXJ5IGZyYW1lLgorICAgICAgICogV2UgY2FuIHNpbXBseSBza2lwIGNsZWFyaW5nIG9mIHRoZSBjb2xvciBidWZmZXIgaW4gdGhpcyBjYXNlLgorICAgICAgICogRm9yIHRoZSBkZXB0aCBidWZmZXIsIHdlIGFsdGVybmF0ZWx5IHVzZSBhIGRpZmZlcmVudCBzdWJyYW5nZSBvZgorICAgICAgICogdGhlIGRlcHRoIGJ1ZmZlciBmb3IgZWFjaCBmcmFtZS4gIEZvciB0aGUgb2RkIGZyYW1lIHVzZSB0aGUgcmFuZ2UKKyAgICAgICAqIFswLCAwLjVdIHdpdGggR0xfTEVTUy4gIEZvciB0aGUgZXZlbiBmcmFtZXMsIHVzZSB0aGUgcmFuZ2UgWzEsIDAuNV0KKyAgICAgICAqIHdpdGggR0xfR1JFQVRFUi4KKyAgICAgICAqLworICAgICAgRnJhbWVQYXJpdHkgPSAxIC0gRnJhbWVQYXJpdHk7CisgICAgICBpZiAoRnJhbWVQYXJpdHkpIHsKKyAgICAgICAgIGdsRGVwdGhSYW5nZSgwLjAsIDAuNSk7CisgICAgICAgICBnbERlcHRoRnVuYyhHTF9MRVNTKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgZ2xEZXB0aFJhbmdlKDEuMCwgMC41KTsKKyAgICAgICAgIGdsRGVwdGhGdW5jKEdMX0dSRUFURVIpOworICAgICAgfSAgICAgIAorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBvcmRpbmFyeSBjbGVhcmluZyAqLworICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisgICB9CiAKICAgIGdsUHVzaE1hdHJpeCgpOyAvKk1PREVMVklFVyovCiAgICAgICBnbFRyYW5zbGF0ZWYoIDAuMCwgMC4wLCAtRXllRGlzdCApOwpAQCAtNDUyLDYgKzQ3NywyNCBAQAogfQogCiAKK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGludCBpbml0RmxhZyA9IDA7CisgICBpbnQgaTsKKworICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWkiKSA9PSAwKQorICAgICAgICAgaW5pdEZsYWcgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLW5vY2xlYXIiKSA9PSAwKQorICAgICAgICAgTm9DbGVhciA9IEdMX1RSVUU7CisgICAgICBlbHNlIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIG9wdGlvbjogJXNcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgIH0KKyAgIGluaXQgKGluaXRGbGFnKTsKK30KKwogaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQogewogICAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOwpAQCAtNDU5LDE3ICs1MDIsMTMgQEAKICAgIGdsdXRJbml0V2luZG93U2l6ZSg2MDAsIDUwMCk7CiAgICBnbHV0SW5pdERpc3BsYXlNb2RlKCBHTFVUX1JHQiB8IEdMVVRfREVQVEggfCBHTFVUX0RPVUJMRSApOwogICAgZ2x1dENyZWF0ZVdpbmRvdygiVGV4dHVyZSBDdWJlIE1hcHBpbmciKTsKLQotICAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdICwgIi1pIikgPT0gMCkKLSAgICAgIGluaXQoIDEgKTsKLSAgIGVsc2UKLSAgICAgIGluaXQoIDAgKTsKICAgIGdsdXRSZXNoYXBlRnVuYyggcmVzaGFwZSApOwogICAgZ2x1dEtleWJvYXJkRnVuYygga2V5ICk7CiAgICBnbHV0U3BlY2lhbEZ1bmMoIHNwZWNpYWxrZXkgKTsKICAgIGdsdXREaXNwbGF5RnVuYyggZHJhdyApOwogICAgaWYgKGFuaW0pCiAgICAgICBnbHV0SWRsZUZ1bmMoaWRsZSk7CisgICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogICAgdXNhZ2UoKTsKICAgIGdsdXRNYWluTG9vcCgpOwogICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9wcm9ncy9kZW1vcy9kZXNjcmlwLm1tcyBiL3Byb2dzL2RlbW9zL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTkxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy9kZW1vcy9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDkwIEBACisjIE1ha2VmaWxlIGZvciBHTFVULWJhc2VkIGRlbW8gcHJvZ3JhbXMgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCB1cGRhdGUgOiAzMCBOb3ZlbWJlciAyMDA3CisKKy5maXJzdAorCWRlZmluZSBnbCBbLS0uaW5jbHVkZS5nbF0KKworLmluY2x1ZGUgWy0tXW1tcy1jb25maWcuCisKKyMjIyMjIE1BQ1JPUyAjIyMjIworCitJTkNESVIgPSAoWy0tLmluY2x1ZGVdLFstLnV0aWxdKQorQ0ZMQUdTID0vaW5jbHVkZT0kKElOQ0RJUikvcHJlZml4PWFsbC9uYW1lPShhc19pcyxzaG9ydCkvZmxvYXQ9aWVlZS9pZWVlPWRlbm9ybQorCisuaWZkZWYgU0hBUkUKK0dMX0xJQlMgPSAkKFhMSUJTKQorTElCX0RFUCA9IFstLS5saWJdJChHTF9TSEFSKSBbLS0ubGliXSQoR0xVX1NIQVIpIFstLS5saWJdJChHTFVUX1NIQVIpCisuZWxzZQorR0xfTElCUyA9IFstLS5saWJdbGliR0xVVC9sLGxpYk1lc2FHTFUvbCxsaWJNZXNhR0wvbCwkKFhMSUJTKQorTElCX0RFUCA9IFstLS5saWJdJChHTF9MSUIpIFstLS5saWJdJChHTFVfTElCKSBbLS0ubGliXSQoR0xVVF9MSUIpCisuZW5kaWYKKworCitQUk9HUyA9IGJvdW5jZS5leGUsY2xlYXJzcGQuZXhlLGRyYXdwaXguZXhlLGdhbW1hLmV4ZSxnZWFycy5leGUsXAorCWdsaW5mby5leGUsZ2x1dGZ4LmV4ZSxpc29zdXJmLmV4ZSxtb3JwaDNkLmV4ZSxcCisJcGFsdGV4LmV4ZSxwb2ludGJsYXN0LmV4ZSxyZWZsZWN0LmV4ZSxzcGVjdGV4LmV4ZSxzdGV4M2QuZXhlLFwKKwl0ZXNzZGVtby5leGUsdGV4Y3lsLmV4ZSx0ZXhvYmouZXhlLHRyaXNwZC5leGUsd2lucG9zLmV4ZQorCisKKyMjIyMjIFJVTEVTICMjIyMjCisub2JqLmV4ZSA6CisJY3h4bGluayAkKE1NUyRUQVJHRVRfTkFNRSksJChHTF9MSUJTKQorCisjIyMjIyBUQVJHRVRTICMjIyMjCitkZWZhdWx0IDoKKwkkKE1NUykkKE1NU1FVQUxJRklFUlMpICQoUFJPR1MpCisKK2NsZWFuIDoKKwlkZWxldGUgKi5vYmo7KgorCityZWFsY2xlYW4gOgorCWRlbGV0ZSAqLmV4ZTsqCisJZGVsZXRlICoub2JqOyoKKworYm91bmNlLmV4ZSA6IGJvdW5jZS5vYmogJChMSUJfREVQKQorY2xlYXJzcGQuZXhlIDogY2xlYXJzcGQub2JqICQoTElCX0RFUCkKK2RyYXdwaXguZXhlIDogZHJhd3BpeC5vYmogJChMSUJfREVQKSBbLS51dGlsXXJlYWR0ZXgub2JqCisJY3h4bGluayAkKE1NUyRUQVJHRVRfTkFNRSksWy0udXRpbF1yZWFkdGV4Lm9iaiwkKEdMX0xJQlMpCitnYW1tYS5leGUgOiBnYW1tYS5vYmogJChMSUJfREVQKQorZ2VhcnMuZXhlIDogZ2VhcnMub2JqICQoTElCX0RFUCkKK2dsaW5mby5leGUgOiBnbGluZm8ub2JqICQoTElCX0RFUCkKK2dsdXRmeC5leGUgOiBnbHV0Zngub2JqICQoTElCX0RFUCkKK2lzb3N1cmYuZXhlIDogaXNvc3VyZi5vYmogJChMSUJfREVQKSBbLS51dGlsXXJlYWR0ZXgub2JqCisJY3h4bGluayAkKE1NUyRUQVJHRVRfTkFNRSksWy0udXRpbF1yZWFkdGV4Lm9iaiwkKEdMX0xJQlMpCittb3JwaDNkLmV4ZSA6IG1vcnBoM2Qub2JqICQoTElCX0RFUCkKK3BhbHRleC5leGUgOiBwYWx0ZXgub2JqICQoTElCX0RFUCkKK3BvaW50Ymxhc3QuZXhlIDogcG9pbnRibGFzdC5vYmogJChMSUJfREVQKQorcmVmbGVjdC5leGUgOiByZWZsZWN0Lm9iaiBbLS51dGlsXXJlYWR0ZXgub2JqIFstLnV0aWxdc2hvd2J1ZmZlci5vYmpcCisJJChMSUJfREVQKQorCWN4eGxpbmsgJChNTVMkVEFSR0VUX05BTUUpLFstLnV0aWxdcmVhZHRleCxzaG93YnVmZmVyLCQoR0xfTElCUykKK3NwZWN0ZXguZXhlIDogc3BlY3RleC5vYmogJChMSUJfREVQKQorc3RleDNkLmV4ZSA6IHN0ZXgzZC5vYmogJChMSUJfREVQKQordGVzc2RlbW8uZXhlIDogdGVzc2RlbW8ub2JqICQoTElCX0RFUCkKK3RleGN5bC5leGUgOiB0ZXhjeWwub2JqIFstLnV0aWxdcmVhZHRleC5vYmogJChMSUJfREVQKQorCWN4eGxpbmsgJChNTVMkVEFSR0VUX05BTUUpLFstLnV0aWxdcmVhZHRleC5vYmosJChHTF9MSUJTKQordGV4b2JqLmV4ZSA6IHRleG9iai5vYmogJChMSUJfREVQKQordHJpc3BkLmV4ZSA6IHRyaXNwZC5vYmogJChMSUJfREVQKQord2lucG9zLmV4ZSA6IHdpbnBvcy5vYmogWy0udXRpbF1yZWFkdGV4Lm9iaiAkKExJQl9ERVApCisJY3h4bGluayAkKE1NUyRUQVJHRVRfTkFNRSksWy0udXRpbF1yZWFkdGV4Lm9iaiwkKEdMX0xJQlMpCisKKworYm91bmNlLm9iaiA6IGJvdW5jZS5jCitjbGVhcnNwZC5vYmogOiBjbGVhcnNwZC5jCitkcmF3cGl4Lm9iaiA6IGRyYXdwaXguYworZ2FtbWEub2JqIDogZ2FtbWEuYworZ2VhcnMub2JqIDogZ2VhcnMuYworZ2xpbmZvLm9iaiA6IGdsaW5mby5jCitnbHV0Zngub2JqIDogZ2x1dGZ4LmMKK2lzb3N1cmYub2JqIDogaXNvc3VyZi5jCittb3JwaDNkLm9iaiA6IG1vcnBoM2QuYworcGFsdGV4Lm9iaiA6IHBhbHRleC5jCitwb2ludGJsYXN0Lm9iaiA6IHBvaW50Ymxhc3QuYworcmVmbGVjdC5vYmogOiByZWZsZWN0LmMKK3NwZWN0ZXgub2JqIDogc3BlY3RleC5jCitzdGV4M2Qub2JqIDogc3RleDNkLmMKK3Rlc3NkZW1vLm9iaiA6IHRlc3NkZW1vLmMKK3RleGN5bC5vYmogOiB0ZXhjeWwuYwordGV4b2JqLm9iaiA6IHRleG9iai5jCit0cmlzcGQub2JqIDogdHJpc3BkLmMKK3dpbnBvcy5vYmogOiB3aW5wb3MuYwpkaWZmIC0tZ2l0IGEvcHJvZ3MvZGVtb3MvZW5naW5lLmMgYi9wcm9ncy9kZW1vcy9lbmdpbmUuYwppbmRleCAxNDNiMDJhLi42MDQwYTJmIDEwMDY0NAotLS0gYS9wcm9ncy9kZW1vcy9lbmdpbmUuYworKysgYi9wcm9ncy9kZW1vcy9lbmdpbmUuYwpAQCAtMTYsNiArMTYsMTAgQEAKICNpbmNsdWRlICJ0cmFja2JhbGwuaCIKIAogCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKwogI2RlZmluZSBERUdfVE9fUkFEKERFRykgICgoREVHKSAqIE1fUEkgLyAxODAuMCkKIAogI2RlZmluZSBURVhUVVJFX0ZJTEUgIi4uL2ltYWdlcy9yZWZsZWN0LnJnYiIKQEAgLTQ0MSw4ICs0NDUsOCBAQAogICAgZm9yIChpID0gMDsgaSA8PSAzNjsgaSsrKSB7CiAgICAgICBjb25zdCBpbnQgaiA9IGkgJSAzNjsKICAgICAgIGdsTm9ybWFsM2Yobm9ybWFsc1tqXVswXSwgbm9ybWFsc1tqXVsxXSwgMCk7Ci0gICAgICBnbFZlcnRleDNmKHBvaW50c1tqXVswXSwgcG9pbnRzW2pdWzFdLCB6MCk7CiAgICAgICBnbFZlcnRleDNmKHBvaW50c1tqXVswXSwgcG9pbnRzW2pdWzFdLCB6MSk7CisgICAgICBnbFZlcnRleDNmKHBvaW50c1tqXVswXSwgcG9pbnRzW2pdWzFdLCB6MCk7CiAgICB9CiAgICBnbEVuZCgpOwogfQpAQCAtNzQxLDcgKzc0NSw3IEBACiAgICBnbFRyYW5zbGF0ZWYoMCwgMCwgLTAuNSAqIGNyYW5rTGVuKTsKIAogICAgLyogY3JhbmtzaGFmdCAqLwotICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCBDcmFua3NoYWZ0Q29sb3IpOworICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05ULCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCBDcmFua3NoYWZ0Q29sb3IpOwogICAgZ2xDb2xvcjRmdihDcmFua3NoYWZ0Q29sb3IpOwogICAgRHJhd1Bvc2l0aW9uZWRDcmFua3NoYWZ0KGVuZywgY3JhbmtBbmdsZSk7CiAKQEAgLTc2MCwxMiArNzY0LDEyIEBACiAgICAgICAgICByb3QgKz0gayAqIGVuZy0+Vl9BbmdsZTsKIAogICAgICAgICAgLyogcGlzdG9uICovCi0gICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UsIFBpc3RvbkNvbG9yKTsKKyAgICAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVCwgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwgUGlzdG9uQ29sb3IpOwogICAgICAgICAgZ2xDb2xvcjRmdihQaXN0b25Db2xvcik7CiAgICAgICAgICBEcmF3UG9zaXRpb25lZFBpc3RvbihlbmcsIHJvdCk7CiAKICAgICAgICAgIC8qIGNvbm5lY3Rpbmcgcm9kICovCi0gICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UsIENvbm5Sb2RDb2xvcik7CisgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlQsIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UsIENvbm5Sb2RDb2xvcik7CiAgICAgICAgICBnbENvbG9yNGZ2KENvbm5Sb2RDb2xvcik7CiAgICAgICAgICBEcmF3UG9zaXRpb25lZENvbm5lY3RpbmdSb2QoZW5nLCByb3QpOwogICAgICAgZ2xQb3BNYXRyaXgoKTsKQEAgLTc4MCw3ICs3ODQsNyBAQAogICAgICAgfQogICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKIAotICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCBCbG9ja0NvbG9yKTsKKyAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVCwgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwgQmxvY2tDb2xvcik7CiAgICAgICBnbENvbG9yNGZ2KEJsb2NrQ29sb3IpOwogICAgICAgaWYgKGVuZy0+Q3JhbmtMaXN0KQogICAgICAgICAgZ2xDYWxsTGlzdChlbmctPkJsb2NrTGlzdCk7CkBAIC0xMjUwLDYgKzEyNTQsNyBAQAogewogICAgY29uc3QgR0xmbG9hdCBsaWdodENvbG9yWzRdID0geyAwLjcsIDAuNywgMC43LCAxLjAgfTsKICAgIGNvbnN0IEdMZmxvYXQgc3BlY3VsYXJbNF0gPSB7IDAuOCwgMC44LCAwLjgsIDEuMCB9OworICAgY29uc3QgR0xmbG9hdCBiYWNrQ29sb3JbNF0gPSB7IDEsIDEsIDAsIDAgfTsKIAogICAgUSA9IGdsdU5ld1F1YWRyaWMoKTsKICAgIGdsdVF1YWRyaWNOb3JtYWxzKFEsIEdMVV9TTU9PVEgpOwpAQCAtMTI2MSwxMCArMTI2NiwxNCBAQAogICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOwogICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKICAgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX0RJRkZVU0UsIGxpZ2h0Q29sb3IpOwotICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNDApOwotICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgc3BlY3VsYXIpOworICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlQsIEdMX1NISU5JTkVTUywgNDApOworICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05ULCBHTF9TUEVDVUxBUiwgc3BlY3VsYXIpOwogICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKIAorICAgZ2xNYXRlcmlhbGZ2KEdMX0JBQ0ssIEdMX0RJRkZVU0UsIGJhY2tDb2xvcik7CisjaWYgMAorICAgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9UV09fU0lERSwgMSk7CisjZW5kaWYKICAgIGdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CiAKICAgIEluaXRWaWV3SW5mbygmVmlldyk7CmRpZmYgLS1naXQgYS9wcm9ncy9kZW1vcy9mYm9fZmlyZWN1YmUuYyBiL3Byb2dzL2RlbW9zL2Zib19maXJlY3ViZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODdkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy9kZW1vcy9mYm9fZmlyZWN1YmUuYwpAQCAtMCwwICsxLDEwNDEgQEAKKy8qCisgKiBEcmF3IHRoZSAiZmlyZSIgdGVzdCBwcm9ncmFtIG9uIHRoZSBzaXggZmFjZXMgb2YgYSBjdWJlIHVzaW5nCisgKiBmYm8gcmVuZGVyLXRvLXRleHR1cmUuCisgKiAKKyAqIE11Y2ggb2YgdGhlIGNvZGUgY29tZXMgZnJvbSBEYXZpZCBCdWNjaWFyZWxsaSdzICJmaXJlIiAKKyAqIHRlc3QgcHJvZ3JhbS4gVGhlIHJlc3QgYmFzaWNhbGx5IGZyb20gQnJpYW4gUGF1bCdzICJnZWFyYm94IiBhbmQKKyAqIGZib3RleHR1cmUgcHJvZ3JhbXMuCisgKgorICogQnkgcHJlc3NpbmcgdGhlICdxJyBrZXksIHlvdSBjYW4gbWFrZSB0aGUgZHJpdmVyIGNob29zZSBkaWZmZXJlbnQKKyAqIGludGVybmFsIHRleHR1cmUgUkdCQSBmb3JtYXRzIGJ5IGdpdmluZyBpdCBkaWZmZXJlbnQgImZvcm1hdCIgYW5kICJ0eXBlIgorICogYXJndW1lbnRzIHRvIHRoZSBnbFRleEltYWdlMkQgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSB0ZXh0dXJlCisgKiBpbWFnZSBiZWluZyByZW5kZXJlZCB0by4gSWYgdGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgYSB0ZXh0dXJlIGltYWdlCisgKiBmb3JtYXQgYXMgYSByZW5kZXIgdGFyZ2V0LCBpdCB3aWxsIHVzdWFsbHkgZmFsbCBiYWNrIHRvIHNvZnR3YXJlIHdoZW4KKyAqIGRyYXdpbmcgdGhlICJmaXJlIiBpbWFnZSwgYW5kIGZyYW1lLXJhdGUgc2hvdWxkIGRyb3AgY29uc2lkZXJhYmx5LgorICoKKyAqIFBlcmZvcm1hbmNlOiAKKyAqIFRoZSByZW5kZXJpbmcgc3BlZWQgb2YgdGhpcyBwcm9ncmFtIGlzIHVzdWFsbHkgZGljdGF0ZWQgYnkgZmlsbCByYXRlCisgKiBhbmQgdGhlIGZhY3QgdGhhdCBzb2Z0d2FyZSBmYWxsYmFja3MgZm9yIGdsQml0TWFwIG1ha2VzIHRoZSBkcml2ZXIKKyAqIG9wZXJhdGUgc3luY2hyb25vdXNseS4gTG93LWVuZCBVTUEgaGFyZHdhcmUgd2lsbCBwcm9iYWJseSBzZWUgYXJvdW5kCisgKiAzNSBmcHMgd2l0aCB0aGUgaGVscCBzY3JlZW4gZGlzYWJsZWQgYW5kIDMyYnBwIHdpbmRvdy0gYW5kIHVzZXIKKyAqIGZyYW1lLWJ1ZmZlcnMgKDIwMDgpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciBHUEwsIGZvbGxvd2luZyB0aGUgImZpcmUiIGxpY2Vuc2luZy4KKyAqCisgKiBBdXRob3JzOgorICogICBEYXZpZCBCdWNjaWFyZWxsaSAoImZpcmUiKQorICogICBCcmlhbiBQYXVsICgiZ2VhcmJveCIsICJmYm90ZXh0dXJlIikKKyAqICAgVGhvbWFzIEhlbGxzdHJvbSAoUHV0dGluZyBpdCB0b2dldGhlcikKKyAqCisgKi8KKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorI2luY2x1ZGUgInJlYWR0ZXguaCIKKworCisvKgorICogRm9ybWF0IG9mIHRleHR1cmUgd2UgcmVuZGVyIHRvLgorICovCisKKyNkZWZpbmUgVEVYSU5URk9STUFUIEdMX1JHQkEKKworc3RhdGljIEdMdWludCB0ZXhUeXBlc1tdID0gCisgICB7R0xfVU5TSUdORURfQllURSwKKyAgICBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsCisgICAgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYsCisgICAgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYsCisgICAgR0xfVU5TSUdORURfSU5UXzhfOF84XzgsCisgICAgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwKKyAgICBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LAorICAgIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwKKyAgICBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViwKKyAgICBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViwKKyAgICBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCwKKyAgICBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLAorICAgIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsCisgICAgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsCisgICAgR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWLAorICAgIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LAorICAgIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFVn07CisKK3N0YXRpYyBHTHVpbnQgdGV4Rm9ybWF0c1tdID0gCisgICB7R0xfUkdCQSwKKyAgICBHTF9SR0JBLAorICAgIEdMX1JHQkEsCisgICAgR0xfUkdCQSwKKyAgICBHTF9SR0JBLAorICAgIEdMX1JHQkEsCisgICAgR0xfUkdCQSwKKyAgICBHTF9CR1JBLAorICAgIEdMX0JHUkEsCisgICAgR0xfQkdSQSwKKyAgICBHTF9CR1JBLAorICAgIEdMX0JHUkEsCisgICAgR0xfQkdSQSwKKyAgICBHTF9SR0IsCisgICAgR0xfUkdCLAorICAgIEdMX0JHUiwKKyAgICBHTF9CR1J9OworCitzdGF0aWMgY29uc3QgY2hhciAqdGV4TmFtZXNbXSA9IAorICAgeyJHTF9SR0JBIEdMX1VOU0lHTkVEX0JZVEUiLAorICAgICJHTF9SR0JBIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViIsCisgICAgIkdMX1JHQkEgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYiLAorICAgICJHTF9SR0JBIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWIiwKKyAgICAiR0xfUkdCQSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCIsCisgICAgIkdMX1JHQkEgR0xfVU5TSUdORURfSU5UXzVfNV81XzEiLAorICAgICJHTF9SR0JBIEdMX1VOU0lHTkVEX0lOVF80XzRfNF80IiwKKyAgICAiR0xfQkdSQSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYiLAorICAgICJHTF9CR1JBIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWIiwKKyAgICAiR0xfQkdSQSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViIsCisgICAgIkdMX0JHUkEgR0xfVU5TSUdORURfSU5UXzhfOF84XzgiLAorICAgICJHTF9CR1JBIEdMX1VOU0lHTkVEX0lOVF81XzVfNV8xIiwKKyAgICAiR0xfQkdSQSBHTF9VTlNJR05FRF9JTlRfNF80XzRfNCIsCisgICAgIkdMX1JHQiBHTF9VTlNJR05FRF9JTlRfNV82XzUiLAorICAgICJHTF9SR0IgR0xfVU5TSUdORURfSU5UXzVfNl81X1JFViIsCisgICAgIkdMX0JHUiBHTF9VTlNJR05FRF9JTlRfNV82XzUiLAorICAgICJHTF9CR1IgR0xfVU5TSUdORURfSU5UXzVfNl81X1JFViJ9OworCisKKworCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzUKKyNlbmRpZgorCisjZGVmaW5lIHZpbml0KGEsaSxqLGspIHsJCQlcCisgICAgICAoYSlbMF09aTsJCQkJCVwKKyAgICAgIChhKVsxXT1qOwkJCQkJXAorICAgICAgKGEpWzJdPWs7CQkJCQlcCisgICB9CisKKyNkZWZpbmUgdmluaXQ0KGEsaSxqLGssdykgewkJCVwKKyAgICAgIChhKVswXT1pOwkJCQkJXAorICAgICAgKGEpWzFdPWo7CQkJCQlcCisgICAgICAoYSlbMl09azsJCQkJCVwKKyAgICAgIChhKVszXT13OwkJCQkJXAorICAgfQorCisKKyNkZWZpbmUgdmFkZHMoYSxkdCxiKSB7CQkJCVwKKyAgICAgIChhKVswXSs9KGR0KSooYilbMF07CQkJXAorICAgICAgKGEpWzFdKz0oZHQpKihiKVsxXTsJCQlcCisgICAgICAoYSlbMl0rPShkdCkqKGIpWzJdOwkJCVwKKyAgIH0KKworI2RlZmluZSB2ZXF1KGEsYikgewkJCQlcCisgICAgICAoYSlbMF09KGIpWzBdOwkJCQlcCisgICAgICAoYSlbMV09KGIpWzFdOwkJCQlcCisgICAgICAoYSlbMl09KGIpWzJdOwkJCQlcCisgICB9CisKKyNkZWZpbmUgdmludGVyKGEsZHQsYixjKSB7CQkJXAorICAgICAgKGEpWzBdPShkdCkqKGIpWzBdKygxLjAtZHQpKihjKVswXTsJXAorICAgICAgKGEpWzFdPShkdCkqKGIpWzFdKygxLjAtZHQpKihjKVsxXTsJXAorICAgICAgKGEpWzJdPShkdCkqKGIpWzJdKygxLjAtZHQpKihjKVsyXTsJXAorICAgfQorCisjZGVmaW5lIGNsYW1wKGEpICAgICAgICAoKGEpIDwgMC4wID8gMC4wIDogKChhKSA8IDEuMCA/IChhKSA6IDEuMCkpCisKKyNkZWZpbmUgdmNsYW1wKHYpIHsJCQkJXAorICAgICAgKHYpWzBdPWNsYW1wKCh2KVswXSk7CQkJXAorICAgICAgKHYpWzFdPWNsYW1wKCh2KVsxXSk7CQkJXAorICAgICAgKHYpWzJdPWNsYW1wKCh2KVsyXSk7CQkJXAorICAgfQorCitzdGF0aWMgR0xpbnQgV2luV2lkdGggPSA4MDAsIFdpbkhlaWdodCA9IDgwMDsKK3N0YXRpYyBHTGludCBUZXhXaWR0aCwgVGV4SGVpZ2h0Oworc3RhdGljIEdMdWludCBUZXhPYmo7CitzdGF0aWMgR0x1aW50IE15RkI7CitzdGF0aWMgR0x1aW50IERlcHRoUkI7CitzdGF0aWMgR0xib29sZWFuIFdpcmVGcmFtZSA9IEdMX0ZBTFNFOworc3RhdGljIEdMaW50IHRleFR5cGUgPSAwOworCitzdGF0aWMgR0xpbnQgVDAgPSAwOworc3RhdGljIEdMaW50IEZyYW1lcyA9IDA7CitzdGF0aWMgR0xpbnQgV2luID0gMDsKKworc3RhdGljIEdMZmxvYXQgVmlld1JvdFggPSAyMC4wLCBWaWV3Um90WSA9IDMwLjAsIFZpZXdSb3RaID0gMC4wOworc3RhdGljIEdMZmxvYXQgQ3ViZVJvdCA9IDAuMDsKKworc3RhdGljIHZvaWQKK0NoZWNrRXJyb3IoaW50IGxpbmUpCit7CisgICBHTGVudW0gZXJyID0gZ2xHZXRFcnJvcigpOworICAgaWYgKGVycikgeworICAgICAgcHJpbnRmKCJHTCBFcnJvciAweCV4IGF0IGxpbmUgJWRcbiIsIChpbnQpIGVyciwgbGluZSk7CisgICAgICBleGl0KDEpOworICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjbGVhbnVwKHZvaWQpCit7CisgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIDApOworICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJk15RkIpOworICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZEZXB0aFJCKTsKKyAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJlRleE9iaik7CisgICBnbHV0RGVzdHJveVdpbmRvdyhXaW4pOworfQorCitzdGF0aWMgR0xpbnQgTmljZUZvZyA9IDE7CisKKyNkZWZpbmUgRElNUCAyMC4wCisjZGVmaW5lIERJTVRQIDE2LjAKKworI2RlZmluZSBSSURDT0wgMC40CisKKyNkZWZpbmUgTlVNVFJFRSA1MAorI2RlZmluZSBUUkVFSU5SIDIuNQorI2RlZmluZSBUUkVFT1VUUiA4LjAKKworI2RlZmluZSBBR1JBViAtOS44CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBpbnQgYWdlOworICAgZmxvYXQgcFszXVszXTsKKyAgIGZsb2F0IHZbM107CisgICBmbG9hdCBjWzNdWzRdOworfQorICAgcGFydDsKKworc3RhdGljIGZsb2F0IHRyZWVwb3NbTlVNVFJFRV1bM107CisKK3N0YXRpYyBmbG9hdCBibGFja1szXSA9IHsgMC4wLCAwLjAsIDAuMCB9Oworc3RhdGljIGZsb2F0IGJsdVszXSA9IHsgMS4wLCAwLjIsIDAuMCB9Oworc3RhdGljIGZsb2F0IGJsdTJbM10gPSB7IDEuMCwgMS4wLCAwLjAgfTsKKworc3RhdGljIGZsb2F0IGZvZ2NvbG9yWzRdID0geyAxLjAsIDEuMCwgMS4wLCAxLjAgfTsKKworc3RhdGljIGZsb2F0IHFbNF1bM10gPSB7CisgICB7LURJTVAsIDAuMCwgLURJTVB9LAorICAge0RJTVAsIDAuMCwgLURJTVB9LAorICAge0RJTVAsIDAuMCwgRElNUH0sCisgICB7LURJTVAsIDAuMCwgRElNUH0KK307CisKK3N0YXRpYyBmbG9hdCBxdFs0XVsyXSA9IHsKKyAgIHstRElNVFAsIC1ESU1UUH0sCisgICB7RElNVFAsIC1ESU1UUH0sCisgICB7RElNVFAsIERJTVRQfSwKKyAgIHstRElNVFAsIERJTVRQfQorfTsKKworc3RhdGljIGludCBucDsKK3N0YXRpYyBmbG9hdCBlamVjdF9yLCBkdCwgbWF4YWdlLCBlamVjdF92eSwgZWplY3Rfdmw7CitzdGF0aWMgc2hvcnQgc2hhZG93czsKK3N0YXRpYyBmbG9hdCByaWR0cmk7CitzdGF0aWMgaW50IGZvZyA9IDA7CitzdGF0aWMgaW50IGhlbHAgPSAxOworCitzdGF0aWMgcGFydCAqcDsKKworc3RhdGljIEdMdWludCBncm91bmRpZDsKK3N0YXRpYyBHTHVpbnQgdHJlZWlkOworCitzdGF0aWMgZmxvYXQgb2JzWzNdID0geyAyLjAsIDEuMCwgMC4wIH07CitzdGF0aWMgZmxvYXQgZGlyWzNdOworc3RhdGljIGZsb2F0IHYgPSAwLjA7CitzdGF0aWMgZmxvYXQgYWxwaGEgPSAtODQuMDsKK3N0YXRpYyBmbG9hdCBiZXRhID0gOTAuMDsKKworc3RhdGljIGZsb2F0Cit2cm5kKHZvaWQpCit7CisgICByZXR1cm4gKCgoZmxvYXQpIHJhbmQoKSkgLyBSQU5EX01BWCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRuZXdwYXJ0KHBhcnQgKiBwKQoreworICAgZmxvYXQgYSwgdlszXSwgKmM7CisKKyAgIHAtPmFnZSA9IDA7CisKKyAgIGEgPSB2cm5kKCkgKiAzLjE0MTU5MjY1MzU5ICogMi4wOworCisgICB2aW5pdCh2LCBzaW4oYSkgKiBlamVjdF9yICogdnJuZCgpLCAwLjE1LCBjb3MoYSkgKiBlamVjdF9yICogdnJuZCgpKTsKKyAgIHZpbml0KHAtPnBbMF0sIHZbMF0gKyB2cm5kKCkgKiByaWR0cmksIHZbMV0gKyB2cm5kKCkgKiByaWR0cmksCisJIHZbMl0gKyB2cm5kKCkgKiByaWR0cmkpOworICAgdmluaXQocC0+cFsxXSwgdlswXSArIHZybmQoKSAqIHJpZHRyaSwgdlsxXSArIHZybmQoKSAqIHJpZHRyaSwKKwkgdlsyXSArIHZybmQoKSAqIHJpZHRyaSk7CisgICB2aW5pdChwLT5wWzJdLCB2WzBdICsgdnJuZCgpICogcmlkdHJpLCB2WzFdICsgdnJuZCgpICogcmlkdHJpLAorCSB2WzJdICsgdnJuZCgpICogcmlkdHJpKTsKKworICAgdmluaXQocC0+diwgdlswXSAqIGVqZWN0X3ZsIC8gKGVqZWN0X3IgLyAyKSwKKwkgdnJuZCgpICogZWplY3RfdnkgKyBlamVjdF92eSAvIDIsIHZbMl0gKiBlamVjdF92bCAvIChlamVjdF9yIC8gMikpOworCisgICBjID0gYmx1OworCisgICB2aW5pdDQocC0+Y1swXSwgY1swXSAqICgoMS4wIC0gUklEQ09MKSArIHZybmQoKSAqIFJJRENPTCksCisJICBjWzFdICogKCgxLjAgLSBSSURDT0wpICsgdnJuZCgpICogUklEQ09MKSwKKwkgIGNbMl0gKiAoKDEuMCAtIFJJRENPTCkgKyB2cm5kKCkgKiBSSURDT0wpLCAxLjApOworICAgdmluaXQ0KHAtPmNbMV0sIGNbMF0gKiAoKDEuMCAtIFJJRENPTCkgKyB2cm5kKCkgKiBSSURDT0wpLAorCSAgY1sxXSAqICgoMS4wIC0gUklEQ09MKSArIHZybmQoKSAqIFJJRENPTCksCisJICBjWzJdICogKCgxLjAgLSBSSURDT0wpICsgdnJuZCgpICogUklEQ09MKSwgMS4wKTsKKyAgIHZpbml0NChwLT5jWzJdLCBjWzBdICogKCgxLjAgLSBSSURDT0wpICsgdnJuZCgpICogUklEQ09MKSwKKwkgIGNbMV0gKiAoKDEuMCAtIFJJRENPTCkgKyB2cm5kKCkgKiBSSURDT0wpLAorCSAgY1syXSAqICgoMS4wIC0gUklEQ09MKSArIHZybmQoKSAqIFJJRENPTCksIDEuMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRwYXJ0KHBhcnQgKiBwKQoreworICAgZmxvYXQgZmFjdDsKKworICAgaWYgKHAtPnBbMF1bMV0gPCAwLjEpIHsKKyAgICAgIHNldG5ld3BhcnQocCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHAtPnZbMV0gKz0gQUdSQVYgKiBkdDsKKworICAgdmFkZHMocC0+cFswXSwgZHQsIHAtPnYpOworICAgdmFkZHMocC0+cFsxXSwgZHQsIHAtPnYpOworICAgdmFkZHMocC0+cFsyXSwgZHQsIHAtPnYpOworCisgICBwLT5hZ2UrKzsKKworICAgaWYgKChwLT5hZ2UpID4gbWF4YWdlKSB7CisgICAgICB2ZXF1KHAtPmNbMF0sIGJsdTIpOworICAgICAgdmVxdShwLT5jWzFdLCBibHUyKTsKKyAgICAgIHZlcXUocC0+Y1syXSwgYmx1Mik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGZhY3QgPSAxLjAgLyBtYXhhZ2U7CisgICAgICB2YWRkcyhwLT5jWzBdLCBmYWN0LCBibHUyKTsKKyAgICAgIHZjbGFtcChwLT5jWzBdKTsKKyAgICAgIHAtPmNbMF1bM10gPSBmYWN0ICogKG1heGFnZSAtIHAtPmFnZSk7CisKKyAgICAgIHZhZGRzKHAtPmNbMV0sIGZhY3QsIGJsdTIpOworICAgICAgdmNsYW1wKHAtPmNbMV0pOworICAgICAgcC0+Y1sxXVszXSA9IGZhY3QgKiAobWF4YWdlIC0gcC0+YWdlKTsKKworICAgICAgdmFkZHMocC0+Y1syXSwgZmFjdCwgYmx1Mik7CisgICAgICB2Y2xhbXAocC0+Y1syXSk7CisgICAgICBwLT5jWzJdWzNdID0gZmFjdCAqIChtYXhhZ2UgLSBwLT5hZ2UpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorZHJhd3RyZWUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKK3sKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xUZXhDb29yZDJmKDAuMCwgMC4wKTsKKyAgIGdsVmVydGV4M2YoeCAtIDEuNSwgeSArIDAuMCwgeik7CisKKyAgIGdsVGV4Q29vcmQyZigxLjAsIDAuMCk7CisgICBnbFZlcnRleDNmKHggKyAxLjUsIHkgKyAwLjAsIHopOworCisgICBnbFRleENvb3JkMmYoMS4wLCAxLjApOworICAgZ2xWZXJ0ZXgzZih4ICsgMS41LCB5ICsgMy4wLCB6KTsKKworICAgZ2xUZXhDb29yZDJmKDAuMCwgMS4wKTsKKyAgIGdsVmVydGV4M2YoeCAtIDEuNSwgeSArIDMuMCwgeik7CisKKworICAgZ2xUZXhDb29yZDJmKDAuMCwgMC4wKTsKKyAgIGdsVmVydGV4M2YoeCwgeSArIDAuMCwgeiAtIDEuNSk7CisKKyAgIGdsVGV4Q29vcmQyZigxLjAsIDAuMCk7CisgICBnbFZlcnRleDNmKHgsIHkgKyAwLjAsIHogKyAxLjUpOworCisgICBnbFRleENvb3JkMmYoMS4wLCAxLjApOworICAgZ2xWZXJ0ZXgzZih4LCB5ICsgMy4wLCB6ICsgMS41KTsKKworICAgZ2xUZXhDb29yZDJmKDAuMCwgMS4wKTsKKyAgIGdsVmVydGV4M2YoeCwgeSArIDMuMCwgeiAtIDEuNSk7CisKKyAgIGdsRW5kKCk7CisKK30KKworc3RhdGljIHZvaWQKK2NhbGNwb3NvYnModm9pZCkKK3sKKyAgIGRpclswXSA9IHNpbihhbHBoYSAqIE1fUEkgLyAxODAuMCk7CisgICBkaXJbMl0gPSBjb3MoYWxwaGEgKiBNX1BJIC8gMTgwLjApICogc2luKGJldGEgKiBNX1BJIC8gMTgwLjApOworICAgZGlyWzFdID0gY29zKGJldGEgKiBNX1BJIC8gMTgwLjApOworCisgICBpZiAoZGlyWzBdIDwgMS4wZS01ICYmIGRpclswXSA+IC0xLjBlLTUpCisgICAgICBkaXJbMF0gPSAwOworICAgaWYgKGRpclsxXSA8IDEuMGUtNSAmJiBkaXJbMV0gPiAtMS4wZS01KQorICAgICAgZGlyWzFdID0gMDsKKyAgIGlmIChkaXJbMl0gPCAxLjBlLTUgJiYgZGlyWzJdID4gLTEuMGUtNSkKKyAgICAgIGRpclsyXSA9IDA7CisKKyAgIG9ic1swXSArPSB2ICogZGlyWzBdOworICAgb2JzWzFdICs9IHYgKiBkaXJbMV07CisgICBvYnNbMl0gKz0gdiAqIGRpclsyXTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50c3RyaW5nKHZvaWQgKmZvbnQsIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgIGludCBsZW4sIGk7CisKKyAgIGxlbiA9IChpbnQpIHN0cmxlbihzdHJpbmcpOworICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgZ2x1dEJpdG1hcENoYXJhY3Rlcihmb250LCBzdHJpbmdbaV0pOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludGhlbHAodm9pZCkKK3sKKyAgIGdsQ29sb3I0ZigwLjAsIDAuMCwgMC4wLCAwLjUpOworICAgZ2xSZWN0aSg0MCwgNDAsIDYwMCwgNDQwKTsKKworICAgZ2xDb2xvcjNmKDEuMCwgMC4wLCAwLjApOworICAgZ2xSYXN0ZXJQb3MyaSgzMDAsIDQyMCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgIkhlbHAiKTsKKworICAgZ2xSYXN0ZXJQb3MyaSg2MCwgMzkwKTsKKyAgIHByaW50c3RyaW5nKEdMVVRfQklUTUFQX1RJTUVTX1JPTUFOXzI0LCAiaCAtIFRvZ2dsZSBIZWxwIik7CisKKyAgIGdsUmFzdGVyUG9zMmkoNjAsIDM2MCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgInQgLSBJbmNyZWFzZSBwYXJ0aWNsZSBzaXplIik7CisgICBnbFJhc3RlclBvczJpKDYwLCAzMzApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICJUIC0gRGVjcmVhc2UgcGFydGljbGUgc2l6ZSIpOworCisgICBnbFJhc3RlclBvczJpKDYwLCAzMDApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICJyIC0gSW5jcmVhc2UgZW1pc3Npb24gcmFkaXVzIik7CisgICBnbFJhc3RlclBvczJpKDYwLCAyNzApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICJSIC0gRGVjcmVhc2UgZW1pc3Npb24gcmFkaXVzIik7CisKKyAgIGdsUmFzdGVyUG9zMmkoNjAsIDI0MCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgImYgLSBUb2dnbGUgRm9nIik7CisgICBnbFJhc3RlclBvczJpKDYwLCAyMTApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICJzIC0gVG9nZ2xlIHNoYWRvd3MiKTsKKyAgIGdsUmFzdGVyUG9zMmkoNjAsIDE4MCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgInEgLSBUb2dnbGUgdGV4dHVyZSBmb3JtYXQgJiB0eXBlIik7CisgICBnbFJhc3RlclBvczJpKDYwLCAxNTApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICJhIC0gSW5jcmVhc2UgdmVsb2NpdHkiKTsKKyAgIGdsUmFzdGVyUG9zMmkoNjAsIDEyMCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgInogLSBEZWNyZWFzZSB2ZWxvY2l0eSIpOworICAgZ2xSYXN0ZXJQb3MyaSg2MCwgOTApOworICAgcHJpbnRzdHJpbmcoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsICAiQXJyb3cgS2V5cyAtIFJvdGF0ZSIpOworfQorCisKK3N0YXRpYyB2b2lkCitkcmF3ZmlyZSh2b2lkKQoreworICAgc3RhdGljIGNoYXIgZnJidWZbODBdID0gIiI7CisgICBpbnQgajsKKyAgIHN0YXRpYyBkb3VibGUgdDAgPSAtMS47CisgICBkb3VibGUgdCA9IGdsdXRHZXQoR0xVVF9FTEFQU0VEX1RJTUUpIC8gMTAwMC4wOworICAgaWYgKHQwIDwgMC4wKQorICAgICAgdDAgPSB0OworICAgZHQgPSAodCAtIHQwKSAqIDEuMDsKKyAgIHQwID0gdDsKKworICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBNeUZCKTsKKworICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworCisgICBnbEVuYWJsZShHTF9GT0cpOworICAgZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApOworICAgZ2xGb2dmdihHTF9GT0dfQ09MT1IsIGZvZ2NvbG9yKTsKKyAgIGdsRm9nZihHTF9GT0dfREVOU0lUWSwgMC4xKTsKKworCisgICBnbFZpZXdwb3J0KDAsIDAsIChHTGludCkgVGV4V2lkdGgsIChHTGludCkgVGV4SGVpZ2h0KTsKKyAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbHVQZXJzcGVjdGl2ZSg3MC4wLCBUZXhXaWR0aC8gKGZsb2F0KSBUZXhIZWlnaHQsIDAuMSwgMzAuMCk7CisKKyAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgaWYgKE5pY2VGb2cpCisgICAgICBnbEhpbnQoR0xfRk9HX0hJTlQsIEdMX05JQ0VTVCk7CisgICBlbHNlCisgICAgICBnbEhpbnQoR0xfRk9HX0hJTlQsIEdMX0RPTlRfQ0FSRSk7CisKKyAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCisgICBpZiAoZm9nKQorICAgICAgZ2xFbmFibGUoR0xfRk9HKTsKKyAgIGVsc2UKKyAgICAgIGdsRGlzYWJsZShHTF9GT0cpOworCisgICBnbERlcHRoTWFzayhHTF9UUlVFKTsKKyAgIGdsQ2xlYXJDb2xvcigxLjAsIDEuMCwgMS4wLCAxLjApOworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKworICAgZ2xQdXNoTWF0cml4KCk7CisgICBjYWxjcG9zb2JzKCk7CisgICBnbHVMb29rQXQob2JzWzBdLCBvYnNbMV0sIG9ic1syXSwKKwkgICAgIG9ic1swXSArIGRpclswXSwgb2JzWzFdICsgZGlyWzFdLCBvYnNbMl0gKyBkaXJbMl0sCisJICAgICAwLjAsIDEuMCwgMC4wKTsKKworICAgZ2xDb2xvcjRmKDEuMCwgMS4wLCAxLjAsIDEuMCk7CisKKyAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworCisgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdyb3VuZGlkKTsKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xUZXhDb29yZDJmdihxdFswXSk7CisgICBnbFZlcnRleDNmdihxWzBdKTsKKyAgIGdsVGV4Q29vcmQyZnYocXRbMV0pOworICAgZ2xWZXJ0ZXgzZnYocVsxXSk7CisgICBnbFRleENvb3JkMmZ2KHF0WzJdKTsKKyAgIGdsVmVydGV4M2Z2KHFbMl0pOworICAgZ2xUZXhDb29yZDJmdihxdFszXSk7CisgICBnbFZlcnRleDNmdihxWzNdKTsKKyAgIGdsRW5kKCk7CisKKyAgIGdsRW5hYmxlKEdMX0FMUEhBX1RFU1QpOworICAgZ2xBbHBoYUZ1bmMoR0xfR0VRVUFMLCAwLjkpOworCisgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRyZWVpZCk7CisgICBmb3IgKGogPSAwOyBqIDwgTlVNVFJFRTsgaisrKQorICAgICAgZHJhd3RyZWUodHJlZXBvc1tqXVswXSwgdHJlZXBvc1tqXVsxXSwgdHJlZXBvc1tqXVsyXSk7CisKKyAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgIGdsRGVwdGhNYXNrKEdMX0ZBTFNFKTsKKyAgIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKKworICAgaWYgKHNoYWRvd3MpIHsKKyAgICAgIGdsQmVnaW4oR0xfVFJJQU5HTEVTKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBucDsgaisrKSB7CisJIGdsQ29sb3I0ZihibGFja1swXSwgYmxhY2tbMV0sIGJsYWNrWzJdLCBwW2pdLmNbMF1bM10pOworCSBnbFZlcnRleDNmKHBbal0ucFswXVswXSwgMC4xLCBwW2pdLnBbMF1bMl0pOworCisJIGdsQ29sb3I0ZihibGFja1swXSwgYmxhY2tbMV0sIGJsYWNrWzJdLCBwW2pdLmNbMV1bM10pOworCSBnbFZlcnRleDNmKHBbal0ucFsxXVswXSwgMC4xLCBwW2pdLnBbMV1bMl0pOworCisJIGdsQ29sb3I0ZihibGFja1swXSwgYmxhY2tbMV0sIGJsYWNrWzJdLCBwW2pdLmNbMl1bM10pOworCSBnbFZlcnRleDNmKHBbal0ucFsyXVswXSwgMC4xLCBwW2pdLnBbMl1bMl0pOworICAgICAgfQorICAgICAgZ2xFbmQoKTsKKyAgIH0KKworICAgZ2xCZWdpbihHTF9UUklBTkdMRVMpOworICAgZm9yIChqID0gMDsgaiA8IG5wOyBqKyspIHsKKyAgICAgIGdsQ29sb3I0ZnYocFtqXS5jWzBdKTsKKyAgICAgIGdsVmVydGV4M2Z2KHBbal0ucFswXSk7CisKKyAgICAgIGdsQ29sb3I0ZnYocFtqXS5jWzFdKTsKKyAgICAgIGdsVmVydGV4M2Z2KHBbal0ucFsxXSk7CisKKyAgICAgIGdsQ29sb3I0ZnYocFtqXS5jWzJdKTsKKyAgICAgIGdsVmVydGV4M2Z2KHBbal0ucFsyXSk7CisKKyAgICAgIHNldHBhcnQoJnBbal0pOworICAgfQorICAgZ2xFbmQoKTsKKworCisgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7CisgICBnbERpc2FibGUoR0xfQUxQSEFfVEVTVCk7CisgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICBnbERpc2FibGUoR0xfRk9HKTsKKworICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsT3J0aG8oLTAuNSwgNjM5LjUsIC0wLjUsIDQ3OS41CisJICAgLCAtMS4wLCAxLjApOworICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICBnbExvYWRJZGVudGl0eSgpOworCisgICBnbENvbG9yM2YoMS4wLCAwLjAsIDAuMCk7CisgICBnbFJhc3RlclBvczJpKDEwLCAxMCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9IRUxWRVRJQ0FfMTgsIGZyYnVmKTsKKyAgIGdsQ29sb3IzZigwLjAsIDAuMCwgMS4wKTsKKyAgIGdsUmFzdGVyUG9zMmkoMTAsIDQ1MCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9IRUxWRVRJQ0FfMTgsIHRleE5hbWVzW3RleFR5cGVdKTsKKyAgIGdsQ29sb3IzZigxLjAsIDAuMCwgMC4wKTsKKyAgIGdsUmFzdGVyUG9zMmkoMTAsIDQ3MCk7CisgICBwcmludHN0cmluZyhHTFVUX0JJVE1BUF9IRUxWRVRJQ0FfMTAsCisJICAgICAgICJGaXJlIFYxLjUgV3JpdHRlbiBieSBEYXZpZCBCdWNjaWFyZWxsaSAodGVjaC5obXdAcGx1cy5pdCkiKTsKKworICAgaWYgKGhlbHApCisgICAgICBwcmludGhlbHAoKTsKKworICAgZ2xQb3BNYXRyaXgoKTsKKyAgIGdsRGVwdGhNYXNrKEdMX1RSVUUpOworICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCAwKTsgICAKKyAgIEZyYW1lcysrOworCisgICB7CisgICAgICBHTGludCB0ID0gZ2x1dEdldChHTFVUX0VMQVBTRURfVElNRSk7CisgICAgICBpZiAodCAtIFQwID49IDIwMDApIHsKKwkgR0xmbG9hdCBzZWNvbmRzID0gKHQgLSBUMCkgLyAxMDAwLjA7CisJIEdMZmxvYXQgZnBzID0gRnJhbWVzIC8gc2Vjb25kczsKKwkgc3ByaW50ZihmcmJ1ZiwgIkZyYW1lIHJhdGU6ICVmIiwgZnBzKTsKKwkgVDAgPSB0OworCSBGcmFtZXMgPSAwOworICAgICAgfQorICAgfQorICAgCit9CisKK3N0YXRpYyB2b2lkCityZWdlbl90ZXhJbWFnZSh2b2lkKQoreworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBUZXhPYmopOworICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIFRFWElOVEZPUk1BVCwgVGV4V2lkdGgsIFRleEhlaWdodCwgMCwKKwkJdGV4Rm9ybWF0c1t0ZXhUeXBlXSwgdGV4VHlwZXNbdGV4VHlwZV0sIE5VTEwpOworICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBNeUZCKTsKKyAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsCisJCQkgICAgIEdMX1RFWFRVUkVfMkQsIFRleE9iaiwgMCk7CisgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIDApOworfQorCitzdGF0aWMgdm9pZAora2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICBzd2l0Y2ggKGtleSkgeworICAgY2FzZSAyNzoKKyAgICAgIGNsZWFudXAoKTsKKyAgICAgIGV4aXQoMCk7CisgICAgICBicmVhazsKKworICAgY2FzZSAnYSc6CisgICAgICB2ICs9IDAuMDAwNTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAneic6CisgICAgICB2IC09IDAuMDAwNTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnaCc6CisgICAgICBoZWxwID0gKCFoZWxwKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnZic6CisgICAgICBmb2cgPSAoIWZvZyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3MnOgorICAgICAgc2hhZG93cyA9ICFzaGFkb3dzOworICAgICAgYnJlYWs7CisgICBjYXNlICdSJzoKKyAgICAgIGVqZWN0X3IgLT0gMC4wMzsKKyAgICAgIGJyZWFrOworICAgY2FzZSAncic6CisgICAgICBlamVjdF9yICs9IDAuMDM7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3QnOgorICAgICAgcmlkdHJpICs9IDAuMDA1OworICAgICAgYnJlYWs7CisgICBjYXNlICdUJzoKKyAgICAgIHJpZHRyaSAtPSAwLjAwNTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAndic6CisgICAgICBWaWV3Um90WiArPSA1LjA7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ1YnOgorICAgICAgVmlld1JvdFogLT0gNS4wOworICAgICAgYnJlYWs7CisgICBjYXNlICd3JzoKKyAgICAgIFdpcmVGcmFtZSA9ICFXaXJlRnJhbWU7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3EnOgorICAgICAgaWYgKCsrdGV4VHlwZSA+IDE2KQorCSB0ZXhUeXBlID0gMDsKKyAgICAgIHJlZ2VuX3RleEltYWdlKCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ24nOgorICAgICAgTmljZUZvZyA9ICFOaWNlRm9nOworICAgICAgcHJpbnRmKCJOaWNlRm9nICVkXG4iLCBOaWNlRm9nKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworc3RhdGljIHZvaWQKK2luaXR0ZXh0dXJlcyh2b2lkKQoreworICAgR0xlbnVtIGdsdWVycjsKKyAgIEdMdWJ5dGUgdGV4WzEyOF1bMTI4XVs0XTsKKworICAgZ2xHZW5UZXh0dXJlcygxLCAmZ3JvdW5kaWQpOworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBncm91bmRpZCk7CisKKyAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7CisgICBpZiAoIUxvYWRSR0JNaXBtYXBzKCIuLi9pbWFnZXMvczEyOC5yZ2IiLCBHTF9SR0IpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgYSB0ZXh0dXJlLlxuIik7CisgICAgICBleGl0KC0xKTsKKyAgIH0KKworICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworCisgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLAorCQkgICBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUik7CisgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKKworICAgZ2xHZW5UZXh0dXJlcygxLCAmdHJlZWlkKTsKKyAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdHJlZWlkKTsKKworICAgaWYgKDEpCisgICAgICB7CisJIGludCB3LCBoOworCSBHTGVudW0gZm9ybWF0OworCSBpbnQgeCwgeTsKKwkgR0x1Ynl0ZSAqaW1hZ2UgPSBMb2FkUkdCSW1hZ2UoIi4uL2ltYWdlcy90cmVlMy5yZ2IiLCAmdywgJmgsICZmb3JtYXQpOworCisJIGlmICghaW1hZ2UpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIGEgdGV4dHVyZS5cbiIpOworCSAgICBleGl0KC0xKTsKKwkgfQorCisJIGZvciAoeSA9IDA7IHkgPCAxMjg7IHkrKykKKwkgICAgZm9yICh4ID0gMDsgeCA8IDEyODsgeCsrKSB7CisJICAgICAgIHRleFt4XVt5XVswXSA9IGltYWdlWyh5ICsgeCAqIDEyOCkgKiAzXTsKKwkgICAgICAgdGV4W3hdW3ldWzFdID0gaW1hZ2VbKHkgKyB4ICogMTI4KSAqIDMgKyAxXTsKKwkgICAgICAgdGV4W3hdW3ldWzJdID0gaW1hZ2VbKHkgKyB4ICogMTI4KSAqIDMgKyAyXTsKKwkgICAgICAgaWYgKCh0ZXhbeF1beV1bMF0gPT0gdGV4W3hdW3ldWzFdKSAmJgorCQkgICAodGV4W3hdW3ldWzFdID09IHRleFt4XVt5XVsyXSkgJiYgKHRleFt4XVt5XVsyXSA9PSAyNTUpKQorCQkgIHRleFt4XVt5XVszXSA9IDA7CisJICAgICAgIGVsc2UKKwkJICB0ZXhbeF1beV1bM10gPSAyNTU7CisJICAgIH0KKworCSBpZiAoKGdsdWVyciA9IGdsdUJ1aWxkMkRNaXBtYXBzKEdMX1RFWFRVUkVfMkQsIDQsIDEyOCwgMTI4LCBHTF9SR0JBLAorCQkJCQkgR0xfVU5TSUdORURfQllURSwgKEdMdm9pZCAqKSAodGV4KSkpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiR0xVTGliJXNcbiIsIChjaGFyICopIGdsdUVycm9yU3RyaW5nKGdsdWVycikpOworCSAgICBleGl0KC0xKTsKKwkgfQorICAgICAgfQorICAgZWxzZSB7CisgICAgICBpZiAoIUxvYWRSR0JNaXBtYXBzKCIuLi9pbWFnZXMvdHJlZTIucmdiYSIsIEdMX1JHQkEpKSB7CisJIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBhIHRleHR1cmUuXG4iKTsKKwkgZXhpdCgtMSk7CisgICAgICB9CisgICB9CisKKyAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKKyAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwKKwkJICAgR0xfTElORUFSX01JUE1BUF9MSU5FQVIpOworICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9NT0RVTEFURSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0dHJlZSh2b2lkKQoreworICAgaW50IGk7CisgICBmbG9hdCBkaXN0OworCisgICBmb3IgKGkgPSAwOyBpIDwgTlVNVFJFRTsgaSsrKQorICAgICAgZG8geworCSB0cmVlcG9zW2ldWzBdID0gdnJuZCgpICogVFJFRU9VVFIgKiAyLjAgLSBUUkVFT1VUUjsKKwkgdHJlZXBvc1tpXVsxXSA9IDAuMDsKKwkgdHJlZXBvc1tpXVsyXSA9IHZybmQoKSAqIFRSRUVPVVRSICogMi4wIC0gVFJFRU9VVFI7CisJIGRpc3QgPQorCSAgICBzcXJ0KHRyZWVwb3NbaV1bMF0gKiB0cmVlcG9zW2ldWzBdICsKKwkJIHRyZWVwb3NbaV1bMl0gKiB0cmVlcG9zW2ldWzJdKTsKKyAgICAgIH0gd2hpbGUgKChkaXN0IDwgVFJFRUlOUikgfHwgKGRpc3QgPiBUUkVFT1VUUikpOworfQorCitzdGF0aWMgaW50IAoraW5pdF9maXJlKGludCBhYywgY2hhciAqYXZbXSkKK3sKKyAgIGludCBpOworCisgICBucCA9IDgwMDsKKyAgIGVqZWN0X3IgPSAtMC42NTsKKyAgIGR0ID0gMC4wMTU7CisgICBlamVjdF92eSA9IDQ7CisgICBlamVjdF92bCA9IDE7CisgICBzaGFkb3dzID0gMTsKKyAgIHJpZHRyaSA9IDAuMjU7CisKKyAgIG1heGFnZSA9IDEuMCAvIGR0OworCisgICBpZiAoYWMgPT0gMikKKyAgICAgIG5wID0gYXRvaShhdlsxXSk7CisKKworICAgaW5pdHRleHR1cmVzKCk7CisKKyAgIHAgPSAocGFydCAqKSBtYWxsb2Moc2l6ZW9mKHBhcnQpICogbnApOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnA7IGkrKykKKyAgICAgIHNldG5ld3BhcnQoJnBbaV0pOworCisgICBpbml0dHJlZSgpOworCisgICByZXR1cm4gKDApOworfQorCisKKworCisKKworc3RhdGljIHZvaWQKK0RyYXdDdWJlKHZvaWQpCit7CisgICBzdGF0aWMgY29uc3QgR0xmbG9hdCB0ZXhjb29yZHNbNF1bMl0gPSB7CisgICAgICB7IDAsIDAgfSwgeyAxLCAwIH0sIHsgMSwgMSB9LCB7IDAsIDEgfQorICAgfTsKKyAgIHN0YXRpYyBjb25zdCBHTGZsb2F0IHZlcnRpY2VzWzRdWzJdID0geworICAgICAgeyAtMSwgLTEgfSwgeyAxLCAtMSB9LCB7IDEsIDEgfSwgeyAtMSwgMSB9CisgICB9OworICAgc3RhdGljIGNvbnN0IEdMZmxvYXQgeGZvcm1zWzZdWzRdID0geworICAgICAgeyAgIDAsIDAsIDEsIDAgfSwKKyAgICAgIHsgIDkwLCAwLCAxLCAwIH0sCisgICAgICB7IDE4MCwgMCwgMSwgMCB9LAorICAgICAgeyAyNzAsIDAsIDEsIDAgfSwKKyAgICAgIHsgIDkwLCAxLCAwLCAwIH0sCisgICAgICB7IC05MCwgMSwgMCwgMCB9CisgICB9OworICAgc3RhdGljIGNvbnN0IEdMZmxvYXQgbWF0WzRdID0geyAxLjAsIDEuMCwgMC41LCAxLjAgfTsKKyAgIEdMaW50IGksIGo7CisKKyAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwgbWF0KTsKKyAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsUm90YXRlZihWaWV3Um90WCwgMS4wLCAwLjAsIDAuMCk7CisgICBnbFJvdGF0ZWYoMTUsIDEsIDAsIDApOworICAgZ2xSb3RhdGVmKEN1YmVSb3QsIDAsIDEsIDApOworICAgZ2xTY2FsZWYoNCwgNCwgNCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgZ2xSb3RhdGVmKHhmb3Jtc1tpXVswXSwgeGZvcm1zW2ldWzFdLCB4Zm9ybXNbaV1bMl0sIHhmb3Jtc1tpXVszXSk7CisgICAgICBnbFRyYW5zbGF0ZWYoMCwgMCwgMS4xKTsKKyAgICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICAgICBnbE5vcm1hbDNmKDAsIDAsIDEpOworICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCSBnbFRleENvb3JkMmZ2KHRleGNvb3Jkc1tqXSk7CisJIGdsVmVydGV4MmZ2KHZlcnRpY2VzW2pdKTsKKyAgICAgIH0KKyAgICAgIGdsRW5kKCk7CisgICAgICBnbFBvcE1hdHJpeCgpOworICAgfQorICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOworfQorCisKK3N0YXRpYyB2b2lkCitkcmF3KHZvaWQpCit7CisgICBmbG9hdCBhcjsKKyAgIHN0YXRpYyBHTGZsb2F0IHBvc1s0XSA9IHs1LjAsIDUuMCwgMTAuMCwgMC4wfTsKKworICAgZHJhd2ZpcmUoKTsKKworICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIHBvcyk7CisgICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsCisJCSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUik7CisKKyAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgZ2xEaXNhYmxlKEdMX0ZPRyk7CisKKyAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgLTQwLjApOworCisgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisgICAvKiBkcmF3IHRleHR1cmVkIGN1YmUgKi8KKworICAgZ2xWaWV3cG9ydCgwLCAwLCBXaW5XaWR0aCwgV2luSGVpZ2h0KTsKKyAgIGdsQ2xlYXJDb2xvcigwLjUsIDAuNSwgMC44LCAwLjApOworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgYXIgPSAoZmxvYXQpIChXaW5XaWR0aCkgLyBXaW5IZWlnaHQ7CisgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xGcnVzdHVtKC1hciwgYXIsIC0xLjAsIDEuMCwgNS4wLCA2MC4wKTsKKyAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBUZXhPYmopOworCisgICBEcmF3Q3ViZSgpOworCisgICAvKiBmaW5pc2ggdXAgKi8KKyAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisKK3N0YXRpYyB2b2lkCitpZGxlKHZvaWQpCit7CisgICBzdGF0aWMgZG91YmxlIHQwID0gLTEuOworICAgZG91YmxlIGR0LCB0ID0gZ2x1dEdldChHTFVUX0VMQVBTRURfVElNRSkgLyAxMDAwLjA7CisgICBpZiAodDAgPCAwLjApCisgICAgICB0MCA9IHQ7CisgICBkdCA9IHQgLSB0MDsKKyAgIHQwID0gdDsKKworICAgQ3ViZVJvdCA9IGZtb2QoQ3ViZVJvdCArIDE1LjAgKiBkdCwgMzYwLjApOyAgLyogMTUgZGVnL3NlYyAqLworCisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKKy8qIGNoYW5nZSB2aWV3IGFuZ2xlICovCitzdGF0aWMgdm9pZAorc3BlY2lhbChpbnQgaywgaW50IHgsIGludCB5KQoreworICAgKHZvaWQpIHg7CisgICAodm9pZCkgeTsKKyAgIHN3aXRjaCAoaykgeworICAgY2FzZSBHTFVUX0tFWV9VUDoKKyAgICAgIFZpZXdSb3RYICs9IDUuMDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFVUX0tFWV9ET1dOOgorICAgICAgVmlld1JvdFggLT0gNS4wOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMVVRfS0VZX0xFRlQ6CisgICAgICBWaWV3Um90WSArPSA1LjA7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xVVF9LRVlfUklHSFQ6CisgICAgICBWaWV3Um90WSAtPSA1LjA7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICB9CisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKKy8qIG5ldyB3aW5kb3cgc2l6ZSBvciBleHBvc3VyZSAqLworc3RhdGljIHZvaWQKK3Jlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgV2luV2lkdGggPSB3aWR0aDsKKyAgIFdpbkhlaWdodCA9IGhlaWdodDsKK30KKworCitzdGF0aWMgdm9pZCAKK2luaXRfZmJvdGV4dHVyZSgpCit7CisgICBHTGludCBpOworCisgICAvKiBnZW4gZnJhbWVidWZmZXIgaWQsIGRlbGV0ZSBpdCwgZG8gc29tZSBhc3NlcnRpb25zLCBqdXN0IGZvciB0ZXN0aW5nICovCisgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmTXlGQik7CisgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIE15RkIpOworICAgZ2xHZXRJbnRlZ2VydihHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCwgJmkpOworCisgICAvKiBNYWtlIHRleHR1cmUgb2JqZWN0L2ltYWdlICovCisgICBnbEdlblRleHR1cmVzKDEsICZUZXhPYmopOworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBUZXhPYmopOworICAgLyogbWFrZSBvbmUgaW1hZ2UgbGV2ZWwuICovCisgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgVEVYSU5URk9STUFULCBUZXhXaWR0aCwgVGV4SGVpZ2h0LCAwLAorCQl0ZXhGb3JtYXRzW3RleFR5cGVdLCB0ZXhUeXBlc1t0ZXhUeXBlXSwgTlVMTCk7CisKKyAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKKyAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0JBU0VfTEVWRUwsIDApOworICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFYX0xFVkVMLCAwKTsKKworICAgQ2hlY2tFcnJvcihfX0xJTkVfXyk7CisKKyAgIC8qIFJlbmRlciBjb2xvciB0byB0ZXh0dXJlICovCisgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULAorCQkJICAgICBHTF9URVhUVVJFXzJELCBUZXhPYmosIDApOworICAgQ2hlY2tFcnJvcihfX0xJTkVfXyk7CisKKworICAgLyogbWFrZSBkZXB0aCByZW5kZXJidWZmZXIgKi8KKyAgIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmRGVwdGhSQik7CisgICBnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgRGVwdGhSQik7CisgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgR0xfREVQVEhfQ09NUE9ORU5UMTYsCisJCQkgICAgVGV4V2lkdGgsIFRleEhlaWdodCk7CisgICBDaGVja0Vycm9yKF9fTElORV9fKTsKKyAgIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwKKwkJCQkgICBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9FWFQsICZpKTsKKyAgIENoZWNrRXJyb3IoX19MSU5FX18pOworICAgcHJpbnRmKCJEZXB0aCByZW5kZXJidWZmZXIgc2l6ZSA9ICVkIGJpdHNcbiIsIGkpOworCisgICAvKiBhdHRhY2ggRGVwdGhSQiB0byBNeUZCICovCisgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsCisJCQkJR0xfUkVOREVSQlVGRkVSX0VYVCwgRGVwdGhSQik7CisgICBDaGVja0Vycm9yKF9fTElORV9fKTsKKyAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgMCk7CisKKyAgIC8qCisgICAgKiBDaGVjayBmb3IgY29tcGxldGVuZXNzLgorICAgICovCisKK30KKworCitzdGF0aWMgdm9pZAoraW5pdChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgR0xpbnQgaTsKKworICAgaWYgKCFnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU29ycnksIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgaXMgcmVxdWlyZWQhXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIFRleFdpZHRoID0gNTEyOworICAgVGV4SGVpZ2h0ID0gNTEyOworCisgICBpbml0X2Zib3RleHR1cmUoKTsKKyAgIGluaXRfZmlyZShhcmdjLCBhcmd2KTsKKworCisgICBmb3IgKCBpPTE7IGk8YXJnYzsgaSsrICkgeworICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWluZm8iKT09MCkgeworCSBwcmludGYoIkdMX1JFTkRFUkVSICAgPSAlc1xuIiwgKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpKTsKKwkgcHJpbnRmKCJHTF9WRVJTSU9OICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pKTsKKwkgcHJpbnRmKCJHTF9WRU5ET1IgICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOworCSBwcmludGYoIkdMX0VYVEVOU0lPTlMgPSAlc1xuIiwgKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOworICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyB2b2lkIAordmlzaWJsZShpbnQgdmlzKQoreworICAgaWYgKHZpcyA9PSBHTFVUX1ZJU0lCTEUpCisgICAgICBnbHV0SWRsZUZ1bmMoaWRsZSk7CisgICBlbHNlCisgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7Cit9CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICBnbHV0SW5pdCgmYXJnYywgYXJndik7CisKKyAgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0IgfCBHTFVUX0RFUFRIIHwgR0xVVF9ET1VCTEUpOworCisgICBnbHV0SW5pdFdpbmRvd1NpemUoV2luV2lkdGgsIFdpbkhlaWdodCk7CisgICBXaW4gPSBnbHV0Q3JlYXRlV2luZG93KCJmYm9fZmlyZWN1YmUiKTsKKyAgIGluaXQoYXJnYywgYXJndik7CisKKyAgIGdsdXREaXNwbGF5RnVuYyhkcmF3KTsKKyAgIGdsdXRSZXNoYXBlRnVuYyhyZXNoYXBlKTsKKyAgIGdsdXRLZXlib2FyZEZ1bmMoa2V5KTsKKyAgIGdsdXRTcGVjaWFsRnVuYyhzcGVjaWFsKTsKKyAgIGdsdXRWaXNpYmlsaXR5RnVuYyh2aXNpYmxlKTsKKworICAgZ2x1dE1haW5Mb29wKCk7CisgICByZXR1cm4gMDsgICAgICAgICAgICAgLyogQU5TSSBDIHJlcXVpcmVzIG1haW4gdG8gcmV0dXJuIGludC4gKi8KK30KZGlmZiAtLWdpdCBhL3Byb2dzL2RlbW9zL2dlYXJib3guYyBiL3Byb2dzL2RlbW9zL2dlYXJib3guYwppbmRleCAzYTE2NjJjLi4zNWJkZTA0IDEwMDY0NAotLS0gYS9wcm9ncy9kZW1vcy9nZWFyYm94LmMKKysrIGIvcHJvZ3MvZGVtb3MvZ2VhcmJveC5jCkBAIC0yNjQsMzggKzI2NCw0NCBAQAogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgLTQwLjApOwogCisgICAvKiBjbGVhciB3aG9sZSBkZXB0aCBidWZmZXIgKi8KICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwogICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CiAKLSAgIC8qIGRyYXcgZ2VhcnMgKi8KKyAgIC8qIGNsZWFyIHVwcGVyLWxlZnQgY29ybmVyIG9mIGNvbG9yIGJ1ZmZlciAodW51c2VkIHNwYWNlKSAqLworICAgZ2xTY2lzc29yKDAsIFRleEhlaWdodCwgVGV4V2lkdGgsIFdpbkhlaWdodCAtIFRleEhlaWdodCk7CisgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDAuMCwgMC4wKTsKKyAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgIC8qIGNsZWFyIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yIGJ1ZmZlciAqLwogICAgZ2xWaWV3cG9ydCgwLCAwLCBUZXhXaWR0aCwgVGV4SGVpZ2h0KTsKICAgIGdsU2Npc3NvcigwLCAwLCBUZXhXaWR0aCwgVGV4SGVpZ2h0KTsKLSAgIGdsQ2xlYXJDb2xvcigwLjUsIDAuNSwgMC44LCAwLjApOwogICAgZ2xDbGVhckNvbG9yKDEsIDEsIDEsIDApOwogICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKIAorICAgLyogZHJhdyBnZWFycyBpbiBsb3dlci1sZWZ0IGNvcm5lciAqLwogICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGdsRnJ1c3R1bSgtMS4wLCAxLjAsIC0xLjAsIDEuMCwgNS4wLCA2MC4wKTsKICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotCiAgICBEcmF3R2VhcnMoKTsKIAorICAgLyogY29weSBjb2xvciBidWZmZXIgdG8gdGV4dHVyZSAqLwogICAgZ2xDb3B5VGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAwLCAwLCBUZXhXaWR0aCwgVGV4SGVpZ2h0KTsKICAgIAotICAgLyogZHJhdyB0ZXh0dXJlZCBjdWJlICovCisgICAvKiBjbGVhciByaWdodCBoYWxmIG9mIGNvbG9yIGJ1ZmZlciAqLwogICAgZ2xWaWV3cG9ydChUZXhXaWR0aCwgMCwgV2luV2lkdGggLSBUZXhXaWR0aCwgV2luSGVpZ2h0KTsKICAgIGdsU2Npc3NvcihUZXhXaWR0aCwgMCwgV2luV2lkdGggLSBUZXhXaWR0aCwgV2luSGVpZ2h0KTsKICAgIGdsQ2xlYXJDb2xvcigwLjUsIDAuNSwgMC44LCAwLjApOwogICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKIAorICAgLyogZHJhdyB0ZXh0dXJlZCBjdWJlIGluIHJpZ2h0IGhhbGYgb2Ygd2luZG93ICovCiAgICBhciA9IChmbG9hdCkgKFdpbldpZHRoIC0gVGV4V2lkdGgpIC8gV2luSGVpZ2h0OwogICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGdsRnJ1c3R1bSgtYXIsIGFyLCAtMS4wLCAxLjAsIDUuMCwgNjAuMCk7CiAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQogICAgRHJhd0N1YmUoKTsKIAogICAgLyogZmluaXNoIHVwICovCmRpZmYgLS1naXQgYS9wcm9ncy9kZW1vcy9nbHNsbm9pc2UuYyBiL3Byb2dzL2RlbW9zL2dsc2xub2lzZS5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3Byb2dzL2RlbW9zL211bHRpYXJiLmMgYi9wcm9ncy9kZW1vcy9tdWx0aWFyYi5jCmluZGV4IGQ5NjM5ODUuLjQ1MWZkMTEgMTAwNjQ0Ci0tLSBhL3Byb2dzL2RlbW9zL211bHRpYXJiLmMKKysrIGIvcHJvZ3MvZGVtb3MvbXVsdGlhcmIuYwpAQCAtMSw0ICsxLDMgQEAKLQogLyoKICAqIEdMX0FSQl9tdWx0aXRleHR1cmUgZGVtbwogICoKQEAgLTMyLDcgKzMxLDYgQEAKIHN0YXRpYyBHTGJvb2xlYW4gVGV4RW5hYmxlZFs4XTsKIAogc3RhdGljIEdMZmxvYXQgRHJpZnQgPSAwLjA7Ci1zdGF0aWMgR0xmbG9hdCBkcmlmdF9pbmNyZW1lbnQgPSAwLjAwNTsKIHN0YXRpYyBHTGZsb2F0IFhyb3QgPSAyMC4wLCBZcm90ID0gMzAuMCwgWnJvdCA9IDAuMDsKIAogCkBAIC00MSw5ICszOSw3IEBACiAgICBpZiAoQW5pbWF0ZSkgewogICAgICAgR0xpbnQgaTsKIAotICAgICAgRHJpZnQgKz0gZHJpZnRfaW5jcmVtZW50OwotICAgICAgaWYgKERyaWZ0ID49IDEuMCkKLSAgICAgICAgIERyaWZ0ID0gMC4wOworICAgICAgRHJpZnQgPSBnbHV0R2V0KEdMVVRfRUxBUFNFRF9USU1FKSAqIDAuMDAxOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtVW5pdHM7IGkrKykgewogICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIGkpOwpAQCAtNTcsMTAgKzUzLDExIEBACiAgICAgICAgICAgICBnbFRyYW5zbGF0ZWYoMC4wLCBEcmlmdCwgMC4wKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2xUcmFuc2xhdGVmKDAuNSwgMC41LCAwLjApOworICAgICAgICAgICAgZmxvYXQgdHggPSAwLjUsIHR5ID0gMC41OworICAgICAgICAgICAgZ2xUcmFuc2xhdGVmKHR4LCB0eSwgMC4wKTsKICAgICAgICAgICAgIGdsUm90YXRlZigxODAuMCAqIERyaWZ0LCAwLCAwLCAxKTsKICAgICAgICAgICAgIGdsU2NhbGVmKDEuMC9pLCAxLjAvaSwgMS4wL2kpOwotICAgICAgICAgICAgZ2xUcmFuc2xhdGVmKC0wLjUsIC0wLjUsIDAuMCk7CisgICAgICAgICAgICBnbFRyYW5zbGF0ZWYoLXR4LCAtdHkgKyBpICogMC4xLCAwLjApOwogICAgICAgICAgfQogICAgICAgfQogICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CkBAIC03MiwxMCArNjksOSBAQAogCiBzdGF0aWMgdm9pZCBEcmF3T2JqZWN0KHZvaWQpCiB7Ci0gICBHTGludCBpOwotICAgR0xpbnQgajsKLSAgIHN0YXRpYyBjb25zdCBHTGZsb2F0ICAgdGV4X2Nvb3Jkc1tdID0geyAgMC4wLCAgMC4wLCAgMS4wLCAgMS4wLCAgMC4wIH07Ci0gICBzdGF0aWMgY29uc3QgR0xmbG9hdCAgIHZ0eF9jb29yZHNbXSA9IHsgLTEuMCwgLTEuMCwgIDEuMCwgIDEuMCwgLTEuMCB9OworICAgc3RhdGljIGNvbnN0IEdMZmxvYXQgdGV4X2Nvb3Jkc1tdID0geyAgMC4wLCAgMC4wLCAgMS4wLCAgMS4wLCAgMC4wIH07CisgICBzdGF0aWMgY29uc3QgR0xmbG9hdCB2dHhfY29vcmRzW10gPSB7IC0xLjAsIC0xLjAsICAxLjAsICAxLjAsIC0xLjAgfTsKKyAgIEdMaW50IGksIGo7CiAKICAgIGlmICghVGV4RW5hYmxlZFswXSAmJiAhVGV4RW5hYmxlZFsxXSkKICAgICAgIGdsQ29sb3IzZigwLjEsIDAuMSwgMC4xKTsgIC8qIGFkZCBvbnRvIHRoaXMgKi8KQEAgLTgzLDM3ICs3OSwyMCBAQAogICAgICAgZ2xDb2xvcjNmKDEsIDEsIDEpOyAgLyogbW9kdWxhdGUgdGhpcyAqLwogCiAgICBnbEJlZ2luKEdMX1FVQURTKTsKLQotICAgLyogVG9nZ2xlIGJldHdlZW4gdGhlIHZlY3RvciBhbmQgc2NhbGFyIGVudHJ5IHBvaW50cy4gIFRoaXMgaXMgZG9uZSBwdXJlbHkKLSAgICAqIHRvIGhpdCBtdWx0aXBsZSBwYXRocyBpbiB0aGUgZHJpdmVyLgotICAgICovCi0gICBpZiAoIERyaWZ0ID4gMC40OSApIHsKLSAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKysgKSB7Ci0JIGZvciAoaSA9IDA7IGkgPCBOdW1Vbml0czsgaSsrKQotCSAgICBnbE11bHRpVGV4Q29vcmQyZkFSQihHTF9URVhUVVJFMF9BUkIgKyBpLCAKLQkJCQkgdGV4X2Nvb3Jkc1tqXSwgdGV4X2Nvb3Jkc1tqKzFdKTsKLQkgZ2xWZXJ0ZXgyZiggdnR4X2Nvb3Jkc1tqXSwgdnR4X2Nvb3Jkc1tqKzFdICk7CisgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrICkgeworICAgICAgZm9yIChpID0gMDsgaSA8IE51bVVuaXRzOyBpKyspIHsKKyAgICAgICAgIGlmIChUZXhFbmFibGVkW2ldKQorICAgICAgICAgICAgZ2xNdWx0aVRleENvb3JkMmZBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhfY29vcmRzW2pdLCB0ZXhfY29vcmRzW2orMV0pOwogICAgICAgfQorICAgICAgZ2xWZXJ0ZXgyZiggdnR4X2Nvb3Jkc1tqXSwgdnR4X2Nvb3Jkc1tqKzFdICk7CiAgICB9Ci0gICBlbHNlIHsKLSAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKysgKSB7Ci0JIGZvciAoaSA9IDA7IGkgPCBOdW1Vbml0czsgaSsrKQotCSAgICBnbE11bHRpVGV4Q29vcmQyZnZBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSwgJiB0ZXhfY29vcmRzW2pdKTsKLQkgZ2xWZXJ0ZXgyZnYoICYgdnR4X2Nvb3Jkc1tqXSApOwotICAgICAgfQotICAgfQotCiAgICBnbEVuZCgpOwogfQogCiAKLQogc3RhdGljIHZvaWQgRGlzcGxheSggdm9pZCApCiB7Ci0gICBzdGF0aWMgR0xpbnQgVDAgPSAwOwotICAgc3RhdGljIEdMaW50IEZyYW1lcyA9IDA7Ci0gICBHTGludCB0OwotCiAgICBnbENsZWFyKCBHTF9DT0xPUl9CVUZGRVJfQklUICk7CiAKICAgIGdsUHVzaE1hdHJpeCgpOwpAQCAtMTI1LDE2ICsxMDQsNiBAQAogICAgZ2xQb3BNYXRyaXgoKTsKIAogICAgZ2x1dFN3YXBCdWZmZXJzKCk7Ci0KLSAgIEZyYW1lcysrOwotCi0gICB0ID0gZ2x1dEdldChHTFVUX0VMQVBTRURfVElNRSk7Ci0gICBpZiAodCAtIFQwID49IDI1MCkgewotICAgICAgR0xmbG9hdCBzZWNvbmRzID0gKHQgLSBUMCkgLyAxMDAwLjA7Ci0gICAgICBkcmlmdF9pbmNyZW1lbnQgPSAyLjIgKiBzZWNvbmRzIC8gRnJhbWVzOwotICAgICAgVDAgPSB0OwotICAgICAgRnJhbWVzID0gMDsKLSAgIH0KIH0KIAogCkBAIC0xNTEsMjQgKzEyMCwzNCBAQAogfQogCiAKK3N0YXRpYyB2b2lkIFRvZ2dsZVVuaXQoaW50IHVuaXQpCit7CisgICBUZXhFbmFibGVkW3VuaXRdID0gIVRleEVuYWJsZWRbdW5pdF07CisgICBnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgdW5pdCk7CisgICBpZiAoVGV4RW5hYmxlZFt1bml0XSkKKyAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgZWxzZQorICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOworICAgcHJpbnRmKCJFbmFibGVkOiAiKTsKKyAgIGZvciAodW5pdCA9IDA7IHVuaXQgPCBOdW1Vbml0czsgdW5pdCsrKQorICAgICAgcHJpbnRmKCIlZCAiLCAoaW50KSBUZXhFbmFibGVkW3VuaXRdKTsKKyAgIHByaW50ZigiXG4iKTsKK30KKworCiBzdGF0aWMgdm9pZCBNb2RlTWVudShpbnQgZW50cnkpCiB7CiAgICBpZiAoZW50cnkgPj0gVEVYMCAmJiBlbnRyeSA8PSBURVg3KSB7CiAgICAgICAvKiB0b2dnbGUgKi8KICAgICAgIEdMaW50IGkgPSBlbnRyeSAtIFRFWDA7Ci0gICAgICBUZXhFbmFibGVkW2ldID0gIVRleEVuYWJsZWRbaV07Ci0gICAgICBnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSk7Ci0gICAgICBpZiAoVGV4RW5hYmxlZFtpXSkKLSAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgZWxzZQotICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgcHJpbnRmKCJFbmFibGVkOiAiKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1Vbml0czsgaSsrKQotICAgICAgICAgcHJpbnRmKCIlZCAiLCAoaW50KSBUZXhFbmFibGVkW2ldKTsKLSAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgIFRvZ2dsZVVuaXQoaSk7CiAgICB9CiAgICBlbHNlIGlmIChlbnRyeT09QU5JTUFURSkgewogICAgICAgQW5pbWF0ZSA9ICFBbmltYXRlOworICAgICAgaWYgKEFuaW1hdGUpCisgICAgICAgICBnbHV0SWRsZUZ1bmMoSWRsZSk7CisgICAgICBlbHNlCisgICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CiAgICB9CiAgICBlbHNlIGlmIChlbnRyeT09UVVJVCkgewogICAgICAgZXhpdCgwKTsKQEAgLTE4Myw5ICsxNjIsMzYgQEAKICAgICh2b2lkKSB4OwogICAgKHZvaWQpIHk7CiAgICBzd2l0Y2ggKGtleSkgewotICAgICAgY2FzZSAyNzoKLSAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICBicmVhazsKKyAgIGNhc2UgJ2EnOgorICAgICAgQW5pbWF0ZSA9ICFBbmltYXRlOworICAgICAgYnJlYWs7CisgICBjYXNlICcwJzoKKyAgICAgIFRvZ2dsZVVuaXQoMCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJzEnOgorICAgICAgVG9nZ2xlVW5pdCgxKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnMic6CisgICAgICBUb2dnbGVVbml0KDIpOworICAgICAgYnJlYWs7CisgICBjYXNlICczJzoKKyAgICAgIFRvZ2dsZVVuaXQoMyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJzQnOgorICAgICAgVG9nZ2xlVW5pdCg0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnNSc6CisgICAgICBUb2dnbGVVbml0KDUpOworICAgICAgYnJlYWs7CisgICBjYXNlICc2JzoKKyAgICAgIFRvZ2dsZVVuaXQoNik7CisgICAgICBicmVhazsKKyAgIGNhc2UgJzcnOgorICAgICAgVG9nZ2xlVW5pdCg3KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAyNzoKKyAgICAgIGV4aXQoMCk7CisgICAgICBicmVhazsKICAgIH0KICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CiB9CkBAIC0zMjcsNyArMzMzLDggQEAKICAgIGdsdXRLZXlib2FyZEZ1bmMoIEtleSApOwogICAgZ2x1dFNwZWNpYWxGdW5jKCBTcGVjaWFsS2V5ICk7CiAgICBnbHV0RGlzcGxheUZ1bmMoIERpc3BsYXkgKTsKLSAgIGdsdXRJZGxlRnVuYyggSWRsZSApOworICAgaWYgKEFuaW1hdGUpCisgICAgICBnbHV0SWRsZUZ1bmMoSWRsZSk7CiAKICAgIGdsdXRDcmVhdGVNZW51KE1vZGVNZW51KTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3MvZGVtb3MvcmFpbi5jeHggYi9wcm9ncy9kZW1vcy9yYWluLmN4eAppbmRleCBkMTlmMDQ5Li41YzUzZDQyIDEwMDY0NAotLS0gYS9wcm9ncy9kZW1vcy9yYWluLmN4eAorKysgYi9wcm9ncy9kZW1vcy9yYWluLmN4eApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxHTC9nbHV0Lmg+CmRpZmYgLS1naXQgYS9wcm9ncy9kZW1vcy9zaGFkb3d0ZXguYyBiL3Byb2dzL2RlbW9zL3NoYWRvd3RleC5jCmluZGV4IDA1NzQxNzUuLjQ3ODdmMGYgMTAwNjQ0Ci0tLSBhL3Byb2dzL2RlbW9zL3NoYWRvd3RleC5jCisrKyBiL3Byb2dzL2RlbW9zL3NoYWRvd3RleC5jCkBAIC04NCw2ICs4NCw3IEBACiAgICAicHJvZ3JhbSB3aXRoIFwiT1BUSU9OIEFSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvd1wiIiwKIH07CiAKK3N0YXRpYyBHTGJvb2xlYW4gSGF2ZVNoYWRvdyA9IEdMX0ZBTFNFOwogc3RhdGljIEdMYm9vbGVhbiBIYXZlRkJPID0gR0xfRkFMU0U7CiBzdGF0aWMgR0xib29sZWFuIFVzZUZCTyA9IEdMX0ZBTFNFOwogc3RhdGljIEdMYm9vbGVhbiBIYXZlVlAgPSBHTF9GQUxTRTsKQEAgLTUyOSw3ICs1MzAsMTAgQEAKICAgIERpc2FibGVUZXhnZW4oKTsKIAogICAgLyogaW50ZXJwcmV0IHRleHR1cmUncyBkZXB0aCB2YWx1ZXMgYXMgbHVtaW5hbmNlIHZhbHVlcyAqLwotICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiwgR0xfTk9ORSk7CisgICBpZiAoSGF2ZVNoYWRvdykgeworICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiwgR0xfTk9ORSk7CisgICB9CisKICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9ERVBUSF9URVhUVVJFX01PREVfQVJCLCBHTF9MVU1JTkFOQ0UpOwogICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKIApAQCAtNTk2LDcgKzYwMCw5IEBACiAgICAgICB9CiAKICAgICAgIGlmIChEaXNwbGF5TW9kZSA9PSBTSE9XX0RFUFRIX01BUFBJTkcpIHsKLSAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9BUkIsIEdMX05PTkUpOworICAgICAgICAgaWYgKEhhdmVTaGFkb3cpIHsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9BUkIsIEdMX05PTkUpOworICAgICAgICAgfQogICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwogCkBAIC02MTQsOCArNjIwLDEwIEBACiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgIGFzc2VydChEaXNwbGF5TW9kZSA9PSBTSE9XX1NIQURPV1MpOwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIpOworICAgICAgICAgaWYgKEhhdmVTaGFkb3cpIHsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9BUkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkVfQVJCKTsKKyAgICAgICAgIH0KIAogICAgICAgICAgaWYgKGN1cnJfZnJhZyA+IDApIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKTsKQEAgLTcyNCw2ICs3MzIsMTAgQEAKICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAnTSc6CiAgICAgICAgICBjdXJyX2ZyYWcgPSAoMSArIGN1cnJfZnJhZykgJSBtYXhfZnJhZzsKKyAgICAgICAgIGlmICghSGF2ZVNoYWRvdyAmJiAoY3Vycl9mcmFnID09IDApKSB7CisgICAgICAgICAgICBjdXJyX2ZyYWcgPSAxOworICAgICAgICAgfQorCiAgICAgICAgICBwcmludGYoIlVzaW5nIGZyYWdtZW50ICVzXG4iLCBGcmFnUHJvZ05hbWVzW2N1cnJfZnJhZ10pOwogCiAgICAgICAgICBpZiAoSGF2ZUZQKSB7CkBAIC03NDEsOCArNzUzLDEwIEBACiAgICAgICAgICAgICBpZiAoT3BlcmF0b3IgPj0gOCkKICAgICAgICAgICAgICAgIE9wZXJhdG9yID0gMDsKICAgICAgICAgICAgIHByaW50ZigiT3BlcmF0b3I6ICVzXG4iLCBPcGVyYXRvck5hbWVbT3BlcmF0b3JdKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQ19BUkIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JGdW5jW09wZXJhdG9yXSk7CisgICAgICAgICAgICBpZiAoSGF2ZVNoYWRvdykgeworICAgICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0FSQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckZ1bmNbT3BlcmF0b3JdKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAncCc6CkBAIC04NTksMTcgKzg3MywzMSBAQAogewogICAgc3RhdGljIGNvbnN0IEdMZmxvYXQgYm9yZGVyQ29sb3JbNF0gPSB7MS4wLCAwLjAsIDAuMCwgMC4wfTsKIAotICAgaWYgKCFnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9BUkJfZGVwdGhfdGV4dHVyZSIpIHx8Ci0gICAgICAgIWdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FSQl9zaGFkb3ciKSkgewotICAgICAgcHJpbnRmKCJTb3JyeSwgdGhpcyBkZW1vIHJlcXVpcmVzIHRoZSBHTF9BUkJfZGVwdGhfdGV4dHVyZSBhbmQgR0xfQVJCX3NoYWRvdyBleHRlbnNpb25zXG4iKTsKKyAgIGlmICghZ2x1dEV4dGVuc2lvblN1cHBvcnRlZCgiR0xfQVJCX2RlcHRoX3RleHR1cmUiKSkgeworICAgICAgcHJpbnRmKCJTb3JyeSwgdGhpcyBkZW1vIHJlcXVpcmVzIHRoZSBHTF9BUkJfZGVwdGhfdGV4dHVyZSBleHRlbnNpb25cbiIpOwogICAgICAgZXhpdCgxKTsKICAgIH0KLSAgIHByaW50ZigiVXNpbmcgR0xfQVJCX2RlcHRoX3RleHR1cmUgYW5kIEdMX0FSQl9zaGFkb3dcbiIpOwogCisgICBIYXZlU2hhZG93ID0gZ2x1dEV4dGVuc2lvblN1cHBvcnRlZCgiR0xfQVJCX3NoYWRvdyIpOwogICAgSGF2ZVZQID0gZ2x1dEV4dGVuc2lvblN1cHBvcnRlZCgiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIik7CiAgICBIYXZlRlAgPSBnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIpOwogICAgSGF2ZUZQX1NoYWRvdyA9IGdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdyIpOwogCisgICBpZiAoIUhhdmVTaGFkb3cgJiYgIUhhdmVGUCkgeworICAgICAgcHJpbnRmKCJTb3JyeSwgdGhpcyBkZW1vIHJlcXVpcmVzIGVpdGhlciB0aGUgR0xfQVJCX3NoYWRvdyBleHRlbnNpb24gIgorCSAgICAgIm9yIHRoZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSBleHRlbnNpb25cbiIpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgcHJpbnRmKCJVc2luZyBHTF9BUkJfZGVwdGhfdGV4dHVyZVxuIik7CisgICBpZiAoSGF2ZVNoYWRvdykgeworICAgICAgcHJpbnRmKCJhbmQgR0xfQVJCX3NoYWRvd1xuIik7CisgICB9CisKKyAgIGlmIChIYXZlRlApIHsKKyAgICAgIHByaW50ZigiYW5kIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtXG4iKTsKKyAgIH0KKwogICAgSGF2ZVNoYWRvd0FtYmllbnQgPSBnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9BUkJfc2hhZG93X2FtYmllbnQiKTsKICAgIGlmIChIYXZlU2hhZG93QW1iaWVudCkgewogICAgICAgcHJpbnRmKCJhbmQgR0xfQVJCX3NoYWRvd19hbWJpZW50XG4iKTsKQEAgLTg5Niw5ICs5MjQsMTIgQEAKICAgIGdsVGV4UGFyYW1ldGVyZnYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9CT1JERVJfQ09MT1IsIGJvcmRlckNvbG9yKTsKICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwogICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUCk7Ci0gICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DT01QQVJFX01PREVfQVJCLAotICAgICAgICAgICAgICAgICAgIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFX0FSQik7Ci0gICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkNfQVJCLCBHTF9MRVFVQUwpOworCisgICBpZiAoSGF2ZVNoYWRvdykgeworICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiwKKyAgICAgICAgICAgICAgICAgICAgICBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIpOworICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0FSQiwgR0xfTEVRVUFMKTsKKyAgIH0KIAogICAgaWYgKEhhdmVTaGFkb3dBbWJpZW50KSB7CiAgICAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DT01QQVJFX0ZBSUxfVkFMVUVfQVJCLCAwLjMpOwpAQCAtOTI0LDcgKzk1NSw2IEBACiAgICBnbEdlblRleHR1cmVzKDEsICZHcmF5VGV4dHVyZSk7CiAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMUQsIEdyYXlUZXh0dXJlKTsKICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzFELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwotICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMUQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUCk7CiAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8xRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwogICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMUQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKICAgIHsKQEAgLTk1NSw2ICs5ODUsMTEgQEAKICAgICAgIG1heF9mcmFnID0gMzsKICAgIH0KIAorICAgaWYgKCFIYXZlU2hhZG93KSB7CisgICAgICBjdXJyX2ZyYWcgPSAxOworICAgICAgZ2xCaW5kUHJvZ3JhbUFSQihHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiwgZnJhZ19wcm9nc1tjdXJyX2ZyYWddKTsKKyAgIH0KKwogICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CiAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CiAgICBnbEVuYWJsZShHTF9MSUdIVDApOwpkaWZmIC0tZ2l0IGEvcHJvZ3MvZGlyZWN0ZmIvTWFrZWZpbGUgYi9wcm9ncy9kaXJlY3RmYi9NYWtlZmlsZQppbmRleCA1M2IxMDBhLi45M2MyYTdkIDEwMDY0NAotLS0gYS9wcm9ncy9kaXJlY3RmYi9NYWtlZmlsZQorKysgYi9wcm9ncy9kaXJlY3RmYi9NYWtlZmlsZQpAQCAtMTEsNiArMTEsOCBAQAogQ0ZMQUdTICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyBkaXJlY3RmYikKIEFQUF9MSUJfREVQUyArPSAkKHNoZWxsIHBrZy1jb25maWcgLS1saWJzIGRpcmVjdGZiKQogCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCisKIFBST0dTID0gZGZfZ2VhcnMgXAogCSAgIGRmX3JlZmxlY3QgXAogCSAgIGRmX21vcnBoM2QgXApAQCAtMjIsNyArMjQsNyBAQAogLlNVRkZJWEVTOiAuYwogCiAuYzogJChMSUJfREVQKQotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkPCAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSAkPCAkKExJQlMpIC1vICRACiAKIAogIyMjIyMgVEFSR0VUUyAjIyMjIwpkaWZmIC0tZ2l0IGEvcHJvZ3MvZWdsL01ha2VmaWxlIGIvcHJvZ3MvZWdsL01ha2VmaWxlCmluZGV4IDk0OGQ3MzUuLjc1Y2Q0MTEgMTAwNjQ0Ci0tLSBhL3Byb2dzL2VnbC9NYWtlZmlsZQorKysgYi9wcm9ncy9lZ2wvTWFrZWZpbGUKQEAgLTI5LDQyICsyOSw0MiBAQAogCiAKIGRlbW8xOiBkZW1vMS5vICQoVE9QKS8kKExJQl9ESVIpL2xpYkVHTC5zbwotCSQoQ0MpICQoQ0ZMQUdTKSBkZW1vMS5vIC1MJChUT1ApLyQoTElCX0RJUikgLWxFR0wgJChMSUJEUk1fTElCKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGRlbW8xLm8gLUwkKFRPUCkvJChMSUJfRElSKSAtbEVHTCAkKExJQkRSTV9MSUIpIC1vICRACiAKIGRlbW8xLm86IGRlbW8xLmMgJChIRUFERVJTKQogCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtSSQoVE9QKS9pbmNsdWRlIGRlbW8xLmMKIAogCiBkZW1vMjogZGVtbzIubyAkKFRPUCkvJChMSUJfRElSKS9saWJFR0wuc28KLQkkKENDKSAkKENGTEFHUykgZGVtbzIubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sRUdMICQoTElCRFJNX0xJQikgJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgZGVtbzIubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sRUdMICQoTElCRFJNX0xJQikgJChBUFBfTElCX0RFUFMpIC1vICRACiAKIGRlbW8yLm86IGRlbW8yLmMgJChIRUFERVJTKQogCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtSSQoVE9QKS9pbmNsdWRlIGRlbW8yLmMKIAogCiBkZW1vMzogZGVtbzMubyAkKFRPUCkvJChMSUJfRElSKS9saWJFR0wuc28KLQkkKENDKSAkKENGTEFHUykgZGVtbzMubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sRUdMICQoTElCRFJNX0xJQikgJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgZGVtbzMubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sRUdMICQoTElCRFJNX0xJQikgJChBUFBfTElCX0RFUFMpIC1vICRACiAKIGRlbW8zLm86IGRlbW8zLmMgJChIRUFERVJTKQogCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtSSQoVE9QKS9pbmNsdWRlIGRlbW8zLmMKIAogCiBlZ2x0cmk6IGVnbHRyaS5vICQoVE9QKS8kKExJQl9ESVIpL2xpYkVHTC5zbwotCSQoQ0MpICQoQ0ZMQUdTKSBlZ2x0cmkubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sR0wgLWxFR0wgJChMSUJEUk1fTElCKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSBlZ2x0cmkubyAtTCQoVE9QKS8kKExJQl9ESVIpIC1sRUdMICQoTElCRFJNX0xJQikgLW8gJEAKIAogZWdsdHJpLm86IGVnbHRyaS5jICQoSEVBREVSUykKIAkkKENDKSAtYyAkKENGTEFHUykgLUkkKFRPUCkvaW5jbHVkZSBlZ2x0cmkuYwogCiAKIGVnbGluZm86IGVnbGluZm8ubyAkKFRPUCkvJChMSUJfRElSKS9saWJFR0wuc28KLQkkKENDKSAkKENGTEFHUykgZWdsaW5mby5vIC1MJChUT1ApLyQoTElCX0RJUikgLWxHTCAtbEVHTCAkKExJQkRSTV9MSUIpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgZWdsaW5mby5vIC1MJChUT1ApLyQoTElCX0RJUikgLWxFR0wgJChMSUJEUk1fTElCKSAtbyAkQAogCiBlZ2xpbmZvLm86IGVnbGluZm8uYyAkKEhFQURFUlMpCiAJJChDQykgLWMgJChDRkxBR1MpIC1JJChUT1ApL2luY2x1ZGUgZWdsaW5mby5jCiAKIAogZWdsZ2VhcnM6IGVnbGdlYXJzLm8gJChUT1ApLyQoTElCX0RJUikvbGliRUdMLnNvCi0JJChDQykgJChDRkxBR1MpIGVnbGdlYXJzLm8gLUwkKFRPUCkvJChMSUJfRElSKSAtbEVHTCAkKExJQkRSTV9MSUIpICQoQVBQX0xJQl9ERVBTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGVnbGdlYXJzLm8gLUwkKFRPUCkvJChMSUJfRElSKSAtbEVHTCAkKExJQkRSTV9MSUIpICQoQVBQX0xJQl9ERVBTKSAtbyAkQAogCiBlZ2xnZWFycy5vOiBlZ2xnZWFycy5jICQoSEVBREVSUykKIAkkKENDKSAtYyAkKENGTEFHUykgLUkkKFRPUCkvaW5jbHVkZSBlZ2xnZWFycy5jCkBAIC05MiwxMiArOTIsNyBAQAogCiAKIGNsZWFuOgotCXJtIC1mICoubyAqfgotCXJtIC1mICouc28KLQlybSAtZiAkKFBST0dSQU1TKQorCS1ybSAtZiAqLm8gKn4KKwktcm0gLWYgKi5zbworCS1ybSAtZiAkKFBST0dSQU1TKQogCi1ydW46Ci0JTERfTElCUkFSWV9QQVRIPSQoVE9QKS9saWIgLi9lZ2x0cmkKLQotZGVidWc6Ci0JTERfTElCUkFSWV9QQVRIPSQoVE9QKS9saWIgZ2RiIC4vZWdsZ2VhcnMKZGlmZiAtLWdpdCBhL3Byb2dzL2ZiZGV2L01ha2VmaWxlIGIvcHJvZ3MvZmJkZXYvTWFrZWZpbGUKaW5kZXggMTc4MDIwZS4uZTkzNWE1MSAxMDA2NDQKLS0tIGEvcHJvZ3MvZmJkZXYvTWFrZWZpbGUKKysrIGIvcHJvZ3MvZmJkZXYvTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIAktSS4gXAogCS1JJChUT1ApL2luY2x1ZGUKIAorTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQogCiAjIyMjIyBSVUxFUyAjIyMjIwogCkBAIC0yMiw3ICsyMyw3IEBACiAuU1VGRklYRVM6IC5jCiAKIC5jOgotCSQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPCAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAkKElOQ0xVREVTKSAkKENGTEFHUykgJChMREZMQUdTKSAkPCAkKExJQlMpIC1vICRACiAKIC5jLm86CiAJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQ8IC1vICRACkBAIC0zNiw4ICszNyw4IEBACiBkZWZhdWx0OiAgZGVwZW5kICQoUFJPR1MpCiAKIGNsZWFuOgotCXJtIC1mICQoUFJPR1MpCi0Jcm0gLWYgKi5vCisJLXJtIC1mICQoUFJPR1MpCisJLXJtIC1mICoubwogCiAKIGRlcGVuZDogJChTT1VSQ0VTKQpkaWZmIC0tZ2l0IGEvcHJvZ3MvZnAvTWFrZWZpbGUgYi9wcm9ncy9mcC9NYWtlZmlsZQppbmRleCBiY2ZmNjk5Li4yMDg5ZmM1IDEwMDY0NAotLS0gYS9wcm9ncy9mcC9NYWtlZmlsZQorKysgYi9wcm9ncy9mcC9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIGluY2x1ZGUgJChUT1ApL2NvbmZpZ3MvY3VycmVudAogCiAKLUxJQlMgPSAkKEFQUF9MSUJfREVQUykKK0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQogCiBTT1VSQ0VTID0gXAogCXRyaS10ZXguYyBcCkBAIC00MCw3ICs0MCw3IEBACiAuU1VGRklYRVM6IC5jCiAKIC5jOgotCSQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPCAkKExJQlMpIC1vICRACisJJChDQykgJChJTkNMVURFUykgJChDRkxBR1MpICQoTERGTEFHUykgJDwgJChMSUJTKSAtbyAkQAogCiAuYy5vOgogCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACkBAIC01NCw5ICs1NCw5IEBACiBkZWZhdWx0OiAkKFVUSUxfRklMRVMpICQoUFJPR1MpCiAKIGNsZWFuOgotCXJtIC1mICQoUFJPR1MpCi0Jcm0gLWYgKi5vCi0Jcm0gLWYgZ2V0cHJvY2xpc3QuaAorCS1ybSAtZiAkKFBST0dTKQorCS1ybSAtZiAqLm8KKwktcm0gLWYgZ2V0cHJvY2xpc3QuaAogCiAKICMgYXV0byBjb2RlIGdlbmVyYXRpb24KQEAgLTY3LDEzICs2NywxMyBAQAogCiAKIHRleHJlY3Q6IHRleHJlY3QubyByZWFkdGV4Lm8KLQkkKENDKSB0ZXhyZWN0Lm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSB0ZXhyZWN0Lm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKIAogdGV4cmVjdC5vOiB0ZXhyZWN0LmMgcmVhZHRleC5oCiAJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgJDwgLW8gJEAKIAogaW52ZXJ0OiBpbnZlcnQubyByZWFkdGV4Lm8KLQkkKENDKSBpbnZlcnQubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGludmVydC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACiAKIGludmVydC5vOiBpbnZlcnQuYyByZWFkdGV4LmgKIAkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQApkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC8uZ2l0aWdub3JlIGIvcHJvZ3MvZ2xzbC8uZ2l0aWdub3JlCmluZGV4IDgxZWNmNWIuLjA5MzQwZmYgMTAwNjQ0Ci0tLSBhL3Byb2dzL2dsc2wvLmdpdGlnbm9yZQorKysgYi9wcm9ncy9nbHNsLy5naXRpZ25vcmUKQEAgLTEsMTEgKzEsMTggQEAKK2JpdG1hcAogYnJpY2sKIGJ1bXAKIGNvbnZvbHV0aW9ucwogZGVyaXYKIGV4dGZ1bmNzLmgKIG1hbmRlbGJyb3QKK211bHRpdGV4CiBub2lzZQorcG9pbnRzCiByZWFkdGV4LmMKIHJlYWR0ZXguaAorc2hhZGVydXRpbC5jCitzaGFkZXJ1dGlsLmgKIHRleGRlbW8xCiB0b3liYWxsCit0cmlyYXN0Cit0d29zaWRlCmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL0NIMDYtYnJpY2suZnJhZy50eHQgYi9wcm9ncy9nbHNsL0NIMDYtYnJpY2suZnJhZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDA2LWJyaWNrLmZyYWcudHh0CnJlbmFtZSB0byBwcm9ncy9nbHNsL0NIMDYtYnJpY2suZnJhZwpkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC9DSDA2LWJyaWNrLnZlcnQudHh0IGIvcHJvZ3MvZ2xzbC9DSDA2LWJyaWNrLnZlcnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByb2dzL2dsc2wvQ0gwNi1icmljay52ZXJ0LnR4dApyZW5hbWUgdG8gcHJvZ3MvZ2xzbC9DSDA2LWJyaWNrLnZlcnQKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvQ0gxMS1idW1wbWFwLmZyYWcudHh0IGIvcHJvZ3MvZ2xzbC9DSDExLWJ1bXBtYXAuZnJhZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDExLWJ1bXBtYXAuZnJhZy50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvQ0gxMS1idW1wbWFwLmZyYWcKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvQ0gxMS1idW1wbWFwLnZlcnQudHh0IGIvcHJvZ3MvZ2xzbC9DSDExLWJ1bXBtYXAudmVydApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDExLWJ1bXBtYXAudmVydC50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvQ0gxMS1idW1wbWFwLnZlcnQKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvQ0gxMS10b3liYWxsLmZyYWcudHh0IGIvcHJvZ3MvZ2xzbC9DSDExLXRveWJhbGwuZnJhZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDExLXRveWJhbGwuZnJhZy50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvQ0gxMS10b3liYWxsLmZyYWcKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvQ0gxMS10b3liYWxsLnZlcnQudHh0IGIvcHJvZ3MvZ2xzbC9DSDExLXRveWJhbGwudmVydApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDExLXRveWJhbGwudmVydC50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvQ0gxMS10b3liYWxsLnZlcnQKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvQ0gxOC1tYW5kZWwuZnJhZy50eHQgYi9wcm9ncy9nbHNsL0NIMTgtbWFuZGVsLmZyYWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByb2dzL2dsc2wvQ0gxOC1tYW5kZWwuZnJhZy50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvQ0gxOC1tYW5kZWwuZnJhZwpkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC9DSDE4LW1hbmRlbC52ZXJ0LnR4dCBiL3Byb2dzL2dsc2wvQ0gxOC1tYW5kZWwudmVydApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJvZ3MvZ2xzbC9DSDE4LW1hbmRlbC52ZXJ0LnR4dApyZW5hbWUgdG8gcHJvZ3MvZ2xzbC9DSDE4LW1hbmRlbC52ZXJ0CmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL01ha2VmaWxlIGIvcHJvZ3MvZ2xzbC9NYWtlZmlsZQppbmRleCBiOWNhZTY2Li5iYTdhNGM2IDEwMDY0NAotLS0gYS9wcm9ncy9nbHNsL01ha2VmaWxlCisrKyBiL3Byb2dzL2dsc2wvTWFrZWZpbGUKQEAgLTcsMTMgKzcsMjMgQEAKIAogTElCX0RFUCA9ICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVX0xJQl9OQU1FKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVVRfTElCX05BTUUpCiAKK0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQorCiBQUk9HUyA9IFwKKwliaXRtYXAgXAogCWJyaWNrIFwKIAlidW1wIFwKKwljb252b2x1dGlvbnMgXAogCWRlcml2IFwKIAltYW5kZWxicm90IFwKKwltdWx0aXRleCBcCiAJbm9pc2UgXAorCXBvaW50cyBcCisJcG9pbnRjb29yZCBcCisJdGV4ZGVtbzEgXAogCXRveWJhbGwgXAorCXR3b3NpZGUgXAorCXRyaXJhc3QgXAogCXRleGRlbW8xIFwKICAgICAgICAgY29udm9sdXRpb25zCiAKQEAgLTI2LDcgKzM2LDcgQEAKIAogIyBtYWtlIGV4ZWN1dGFibGUgZnJvbSAuYyBmaWxlOgogLmM6ICQoTElCX0RFUCkKLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJDwgJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgJDwgJChMSUJTKSAtbyAkQAogCiAKICMjIyMjIFRBUkdFVFMgIyMjIyMKQEAgLTQwLDYgKzUwLDcgQEAKIGV4dGZ1bmNzLmg6ICAkKFRPUCkvcHJvZ3MvdXRpbC9leHRmdW5jcy5oCiAJY3AgJDwgLgogCisKIHJlYWR0ZXguYzogJChUT1ApL3Byb2dzL3V0aWwvcmVhZHRleC5jCiAJY3AgJDwgLgogCkBAIC00OSwyMCArNjAsMTE2IEBACiByZWFkdGV4Lm86IHJlYWR0ZXguYyByZWFkdGV4LmgKIAkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgcmVhZHRleC5jCiAKLWJyaWNrLmM6IGV4dGZ1bmNzLmgKIAotYnVtcC5jOiBleHRmdW5jcy5oCitzaGFkZXJ1dGlsLmM6ICQoVE9QKS9wcm9ncy91dGlsL3NoYWRlcnV0aWwuYworCWNwICQ8IC4KIAotbWFuZGVsYnJvdC5jOiBleHRmdW5jcy5oCitzaGFkZXJ1dGlsLmg6ICQoVE9QKS9wcm9ncy91dGlsL3NoYWRlcnV0aWwuaAorCWNwICQ8IC4KIAotdG95YmFsbC5jOiBleHRmdW5jcy5oCitzaGFkZXJ1dGlsLm86IHNoYWRlcnV0aWwuYyBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgc2hhZGVydXRpbC5jCiAKLXRleGRlbW8xOiB0ZXhkZW1vMS5vIHJlYWR0ZXgubwotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSB0ZXhkZW1vMS5vIHJlYWR0ZXgubyAkKEFQUF9MSUJfREVQUykgLW8gJEAKIAotdGV4ZGVtbzEubzogdGV4ZGVtbzEuYyByZWFkdGV4LmggZXh0ZnVuY3MuaAorCitiaXRtYXAubzogYml0bWFwLmMgZXh0ZnVuY3MuaCBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgYml0bWFwLmMKKworYml0bWFwOiBiaXRtYXAubyBzaGFkZXJ1dGlsLm8KKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSBiaXRtYXAubyBzaGFkZXJ1dGlsLm8gJChMSUJTKSAtbyAkQAorCisKK2JyaWNrLm86IGJyaWNrLmMgZXh0ZnVuY3MuaCBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgYnJpY2suYworCiticmljazogYnJpY2subyBzaGFkZXJ1dGlsLm8KKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSBicmljay5vIHNoYWRlcnV0aWwubyAkKExJQlMpIC1vICRACisKKworYnVtcC5vOiBidW1wLmMgZXh0ZnVuY3MuaCBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgYnVtcC5jCisKK2J1bXA6IGJ1bXAubyBzaGFkZXJ1dGlsLm8KKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSBidW1wLm8gc2hhZGVydXRpbC5vICQoTElCUykgLW8gJEAKKworCitjb252b2x1dGlvbnMubzogY29udm9sdXRpb25zLmMgcmVhZHRleC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIGNvbnZvbHV0aW9ucy5jCisKK2NvbnZvbHV0aW9uczogY29udm9sdXRpb25zLm8gcmVhZHRleC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgY29udm9sdXRpb25zLm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKKworCitkZXJpdi5vOiBkZXJpdi5jIGV4dGZ1bmNzLmggc2hhZGVydXRpbC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIGRlcml2LmMKKworZGVyaXY6IGRlcml2Lm8gc2hhZGVydXRpbC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgZGVyaXYubyBzaGFkZXJ1dGlsLm8gJChMSUJTKSAtbyAkQAorCisKK21hbmRlbGJyb3QubzogbWFuZGVsYnJvdC5jIGV4dGZ1bmNzLmggc2hhZGVydXRpbC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIG1hbmRlbGJyb3QuYworCittYW5kZWxicm90OiBtYW5kZWxicm90Lm8gc2hhZGVydXRpbC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgbWFuZGVsYnJvdC5vIHNoYWRlcnV0aWwubyAkKExJQlMpIC1vICRACisKKworbXVsdGl0ZXgubzogbXVsdGl0ZXguYyBleHRmdW5jcy5oIHJlYWR0ZXguaCBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgbXVsdGl0ZXguYworCittdWx0aXRleDogbXVsdGl0ZXgubyByZWFkdGV4Lm8gc2hhZGVydXRpbC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgbXVsdGl0ZXgubyByZWFkdGV4Lm8gc2hhZGVydXRpbC5vICQoTElCUykgLW8gJEAKKworCitub2lzZS5vOiBub2lzZS5jIGV4dGZ1bmNzLmggc2hhZGVydXRpbC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIG5vaXNlLmMKKworbm9pc2U6IG5vaXNlLm8gc2hhZGVydXRpbC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgbm9pc2UubyBzaGFkZXJ1dGlsLm8gJChMSUJTKSAtbyAkQAorCisKK3BvaW50cy5vOiBwb2ludHMuYyBleHRmdW5jcy5oIHNoYWRlcnV0aWwuaAorCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBwb2ludHMuYworCitwb2ludHM6IHBvaW50cy5vIHNoYWRlcnV0aWwubworCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBvaW50cy5vIHNoYWRlcnV0aWwubyAkKExJQlMpIC1vICRACisKKworcG9pbnRjb29yZC5vOiBwb2ludGNvb3JkLmMgcmVhZHRleC5oIGV4dGZ1bmNzLmggc2hhZGVydXRpbC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIHBvaW50Y29vcmQuYworCitwb2ludGNvb3JkOiBwb2ludGNvb3JkLm8gcmVhZHRleC5vIHNoYWRlcnV0aWwubworCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBvaW50Y29vcmQubyByZWFkdGV4Lm8gc2hhZGVydXRpbC5vICQoTElCUykgLW8gJEAKKworCit0ZXhkZW1vMS5vOiB0ZXhkZW1vMS5jIHJlYWR0ZXguaCBleHRmdW5jcy5oIHNoYWRlcnV0aWwuaAogCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSB0ZXhkZW1vMS5jCiAKK3RleGRlbW8xOiB0ZXhkZW1vMS5vIHJlYWR0ZXgubyBzaGFkZXJ1dGlsLm8KKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSB0ZXhkZW1vMS5vIHJlYWR0ZXgubyBzaGFkZXJ1dGlsLm8gJChMSUJTKSAtbyAkQAorCisKK3RveWJhbGwubzogdG95YmFsbC5jIGV4dGZ1bmNzLmggc2hhZGVydXRpbC5oCisJJChDQykgLWMgLUkkKElOQ0RJUikgJChDRkxBR1MpIHRveWJhbGwuYworCit0b3liYWxsOiB0b3liYWxsLm8gc2hhZGVydXRpbC5vCisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgdG95YmFsbC5vIHNoYWRlcnV0aWwubyAkKExJQlMpIC1vICRACisKKwordHdvc2lkZS5vOiB0d29zaWRlLmMgZXh0ZnVuY3MuaCBzaGFkZXJ1dGlsLmgKKwkkKENDKSAtYyAtSSQoSU5DRElSKSAkKENGTEFHUykgdHdvc2lkZS5jCisKK3R3b3NpZGU6IHR3b3NpZGUubyBzaGFkZXJ1dGlsLm8KKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSB0d29zaWRlLm8gc2hhZGVydXRpbC5vICQoTElCUykgLW8gJEAKKworCit0cmlyYXN0Lm86IHRyaXJhc3QuYyBleHRmdW5jcy5oIHNoYWRlcnV0aWwuaAorCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSB0cmlyYXN0LmMKKwordHJpcmFzdDogdHJpcmFzdC5vIHNoYWRlcnV0aWwubworCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHRyaXJhc3QubyBzaGFkZXJ1dGlsLm8gJChMSUJTKSAtbyAkQAorCisKIGNvbnZvbHV0aW9uczogY29udm9sdXRpb25zLm8gcmVhZHRleC5vCiAJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpIGNvbnZvbHV0aW9ucy5vIHJlYWR0ZXgubyAkKEFQUF9MSUJfREVQUykgLW8gJEAKIApAQCAtNzQsMyArMTgxLDQgQEAKIAktcm0gLWYgJChQUk9HUykKIAktcm0gLWYgKi5vICp+CiAJLXJtIC1mIGV4dGZ1bmNzLmgKKwktcm0gLWYgc2hhZGVydXRpbC4qCmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL2JpdG1hcC5jIGIvcHJvZ3MvZ2xzbC9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg4ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MvZ2xzbC9iaXRtYXAuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoqCisgKiBJbXBsZW1lbnQgZ2xSYXN0ZXJQb3MgKyBnbEJpdG1hcCB3aXRoIHRleHR1cmVzICsgc2hhZGVycy4KKyAqIEJyaWFuIFBhdWwKKyAqIDE0IE1heSAyMDA3CisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorI2luY2x1ZGUgPEdML2dsZXh0Lmg+CisjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCisKKworc3RhdGljIEdMdWludCBGcmFnU2hhZGVyOworc3RhdGljIEdMdWludCBWZXJ0U2hhZGVyOworc3RhdGljIEdMdWludCBQcm9ncmFtOworCitzdGF0aWMgR0xpbnQgV2luID0gMDsKK3N0YXRpYyBHTGludCBXaW5XaWR0aCA9IDUwMCwgV2luSGVpZ2h0ID0gNTAwOworc3RhdGljIEdMYm9vbGVhbiBBbmltID0gR0xfVFJVRTsKK3N0YXRpYyBHTGJvb2xlYW4gQml0bWFwID0gR0xfRkFMU0U7CitzdGF0aWMgR0xmbG9hdCBYcm90ID0gMjAuMGYsIFlyb3QgPSA3MC4wZjsKK3N0YXRpYyBHTGludCB1VGV4LCB1U2NhbGU7CitzdGF0aWMgR0x1aW50IFRleHR1cmVzWzJdOworCisjZGVmaW5lIFRFWF9XSURUSCAxNgorI2RlZmluZSBURVhfSEVJR0hUIDgKKworCitzdGF0aWMgdm9pZAorQml0bWFwVGV4dChjb25zdCBjaGFyICpzKQoreworICAgd2hpbGUgKCpzKSB7CisgICAgICBnbHV0Qml0bWFwQ2hhcmFjdGVyKEdMVVRfQklUTUFQXzhfQllfMTMsIChpbnQpICpzKTsKKyAgICAgIHMrKzsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAorUmVkaXNwbGF5KHZvaWQpCit7CisgICBzdGF0aWMgY29uc3QgR0xmbG9hdCBweFszXSA9IHsgMS4yLCAwLCAwfTsKKyAgIHN0YXRpYyBjb25zdCBHTGZsb2F0IG54WzNdID0gey0xLjIsIDAsIDB9OworCisgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFJvdGF0ZWYoWHJvdCwgMS4wZiwgMC4wZiwgMC4wZik7CisgICBnbFJvdGF0ZWYoWXJvdCwgMC4wZiwgMS4wZiwgMC4wZik7CisKKyAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKworICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFNjYWxlZigwLjUsIDAuNSwgMC41KTsKKyAgIGdsdXRTb2xpZERvZGVjYWhlZHJvbigpOworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgZ2xDb2xvcjNmKDAsIDEsIDApOworICAgZ2xCZWdpbihHTF9MSU5FUyk7CisgICBnbFZlcnRleDNmKC0xLCAwLCAwKTsKKyAgIGdsVmVydGV4M2YoIDEsIDAsIDApOworICAgZ2xFbmQoKTsKKworICAgZ2xDb2xvcjNmKDEsIDEsIDApOworCisgICBpZiAoQml0bWFwKSB7CisgICAgICBnbFJhc3RlclBvczNmdihweCk7CisgICAgICBCaXRtYXBUZXh0KCIrWCIpOworICAgICAgZ2xSYXN0ZXJQb3MzZnYobngpOworICAgICAgQml0bWFwVGV4dCgiLVgiKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZ2xVc2VQcm9ncmFtX2Z1bmMoUHJvZ3JhbSk7CisKKyAgICAgIC8qIHZlcnRleCBwb3NpdGlvbnMgKGRlbHRhcykgZGVwZW5kIG9uIHRleHR1cmUgc2l6ZSBhbmQgd2luZG93IHNpemUgKi8KKyAgICAgIGlmICh1U2NhbGUgIT0gLTEpIHsKKyAgICAgICAgIGdsVW5pZm9ybTJmX2Z1bmModVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAgKiBURVhfV0lEVEggLyBXaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wICogVEVYX0hFSUdIVCAvIFdpbkhlaWdodCk7CisgICAgICB9CisKKyAgICAgIC8qIGRyYXcgK1ggKi8KKyAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgVGV4dHVyZXNbMF0pOworICAgICAgZ2xCZWdpbihHTF9RVUFEUyk7CisgICAgICBnbFRleENvb3JkMmYoMCwgMCk7ICBnbFZlcnRleDNmdihweCk7CisgICAgICBnbFRleENvb3JkMmYoMSwgMCk7ICBnbFZlcnRleDNmdihweCk7CisgICAgICBnbFRleENvb3JkMmYoMSwgMSk7ICBnbFZlcnRleDNmdihweCk7CisgICAgICBnbFRleENvb3JkMmYoMCwgMSk7ICBnbFZlcnRleDNmdihweCk7CisgICAgICBnbEVuZCgpOworCisgICAgICAvKiBkcmF3IC1YICovCisgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIFRleHR1cmVzWzFdKTsKKyAgICAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgICAgZ2xUZXhDb29yZDJmKDAsIDApOyAgZ2xWZXJ0ZXgzZnYobngpOworICAgICAgZ2xUZXhDb29yZDJmKDEsIDApOyAgZ2xWZXJ0ZXgzZnYobngpOworICAgICAgZ2xUZXhDb29yZDJmKDEsIDEpOyAgZ2xWZXJ0ZXgzZnYobngpOworICAgICAgZ2xUZXhDb29yZDJmKDAsIDEpOyAgZ2xWZXJ0ZXgzZnYobngpOworICAgICAgZ2xFbmQoKTsKKworICAgICAgZ2xVc2VQcm9ncmFtX2Z1bmMoMCk7CisgICB9CisKKyAgIGdsUG9wTWF0cml4KCk7CisKKyAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisKK3N0YXRpYyB2b2lkCitJZGxlKHZvaWQpCit7CisgICBZcm90ID0gZ2x1dEdldChHTFVUX0VMQVBTRURfVElNRSkgKiAwLjAxOworICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZAorUmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBXaW5XaWR0aCA9IHdpZHRoOworICAgV2luSGVpZ2h0ID0gaGVpZ2h0OworICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbEZydXN0dW0oLTEuMCwgMS4wLCAtMS4wLCAxLjAsIDUuMCwgMjUuMCk7CisgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTEwLjBmKTsKK30KKworCitzdGF0aWMgdm9pZAorS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICh2b2lkKSB4OworICAodm9pZCkgeTsKKworICAgc3dpdGNoKGtleSkgeworICAgY2FzZSAnICc6CisgICBjYXNlICdhJzoKKyAgICAgIEFuaW0gPSAhQW5pbTsKKyAgICAgIGlmIChBbmltKQorICAgICAgICAgZ2x1dElkbGVGdW5jKElkbGUpOworICAgICAgZWxzZQorICAgICAgICAgZ2x1dElkbGVGdW5jKE5VTEwpOworICAgICAgYnJlYWs7CisgICBjYXNlICdiJzoKKyAgICAgIEJpdG1hcCA9ICFCaXRtYXA7CisgICAgICBpZiAoQml0bWFwKQorICAgICAgICAgcHJpbnRmKCJVc2luZyBnbEJpdG1hcFxuIik7CisgICAgICBlbHNlCisgICAgICAgICBwcmludGYoIlVzaW5nIGJpbGxib2FyZCB0ZXh0dXJlXG4iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAyNzoKKyAgICAgIGdsRGVsZXRlU2hhZGVyX2Z1bmMoRnJhZ1NoYWRlcik7CisgICAgICBnbERlbGV0ZVNoYWRlcl9mdW5jKFZlcnRTaGFkZXIpOworICAgICAgZ2xEZWxldGVQcm9ncmFtX2Z1bmMoUHJvZ3JhbSk7CisgICAgICBnbHV0RGVzdHJveVdpbmRvdyhXaW4pOworICAgICAgZXhpdCgwKTsKKyAgIH0KKyAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7Cit9CisKKworc3RhdGljIHZvaWQKK1NwZWNpYWxLZXkoaW50IGtleSwgaW50IHgsIGludCB5KQoreworICAgY29uc3QgR0xmbG9hdCBzdGVwID0gMC4xMjVmOworICAgc3dpdGNoKGtleSkgeworICAgY2FzZSBHTFVUX0tFWV9VUDoKKyAgICAgIFhyb3QgLT0gc3RlcDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFVUX0tFWV9ET1dOOgorICAgICAgWHJvdCArPSBzdGVwOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMVVRfS0VZX0xFRlQ6CisgICAgICBZcm90IC09IHN0ZXA7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xVVF9LRVlfUklHSFQ6CisgICAgICBZcm90ICs9IHN0ZXA7CisgICAgICBicmVhazsKKyAgIH0KKyAgIC8qcHJpbnRmKCJYcm90OiAlZiAgWXJvdDogJWZcbiIsIFhyb3QsIFlyb3QpOyovCisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKK3N0YXRpYyB2b2lkCitNYWtlVGV4SW1hZ2UoY29uc3QgY2hhciAqcCwgR0x1aW50IHRleG9iaikKK3sKKyAgIEdMdWJ5dGUgaW1hZ2VbVEVYX0hFSUdIVF1bVEVYX1dJRFRIXTsKKyAgIEdMdWludCBpLCBqLCBrOworCisgICBmb3IgKGkgPSAwOyBpIDwgVEVYX0hFSUdIVDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgVEVYX1dJRFRIOyBqKyspIHsKKyAgICAgICAgIGsgPSBpICogVEVYX1dJRFRIICsgajsKKyAgICAgICAgIGlmIChwW2tdID09ICcgJykgeworICAgICAgICAgICAgaW1hZ2VbaV1bal0gPSAwOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbWFnZVtpXVtqXSA9IDI1NTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXhvYmopOworICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0lOVEVOU0lUWSwgVEVYX1dJRFRILCBURVhfSEVJR0hULCAwLAorICAgICAgICAgICAgICAgIEdMX1JFRCwgR0xfVU5TSUdORURfQllURSwgaW1hZ2UpOworICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFYX0xFVkVMLCAxKTsKKyAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Cit9CisKKworc3RhdGljIHZvaWQKK01ha2VCaXRtYXBUZXh0dXJlcyh2b2lkKQoreworICAgY29uc3QgY2hhciAqcHggPQorICAgICAgIiAgICAgICAgWCAgICAgWCAiCisgICAgICAiICAgWCAgICAgWCAgIFggICIKKyAgICAgICIgICBYICAgICAgWCBYICAgIgorICAgICAgIiBYWFhYWCAgICAgWCAgICAiCisgICAgICAiICAgWCAgICAgIFggWCAgICIKKyAgICAgICIgICBYICAgICBYICAgWCAgIgorICAgICAgIiAgICAgICAgWCAgICAgWCAiCisgICAgICAiICAgICAgICBYICAgICBYICI7CisgICBjb25zdCBjaGFyICpueCA9CisgICAgICAiICAgICAgICBYICAgICBYICIKKyAgICAgICIgICAgICAgICBYICAgWCAgIgorICAgICAgIiAgICAgICAgICBYIFggICAiCisgICAgICAiIFhYWFhYICAgICBYICAgICIKKyAgICAgICIgICAgICAgICAgWCBYICAgIgorICAgICAgIiAgICAgICAgIFggICBYICAiCisgICAgICAiICAgICAgICBYICAgICBYICIKKyAgICAgICIgICAgICAgIFggICAgIFggIjsKKyAgIGdsR2VuVGV4dHVyZXMoMiwgVGV4dHVyZXMpOworICAgTWFrZVRleEltYWdlKHB4LCBUZXh0dXJlc1swXSk7CisgICBNYWtlVGV4SW1hZ2UobngsIFRleHR1cmVzWzFdKTsKK30KKworCitzdGF0aWMgdm9pZAorSW5pdCh2b2lkKQoreworICAgLyogRnJhZ21lbnQgc2hhZGVyOiBtb2R1bGF0ZSByYXN0ZXIgY29sb3IgYnkgdGV4dHVyZSwgZGlzY2FyZCBmcmFnbWVudHMKKyAgICAqIHdpdGggYWxwaGEgPCAxLjAKKyAgICAqLworICAgc3RhdGljIGNvbnN0IGNoYXIgKmZyYWdTaGFkZXJUZXh0ID0KKyAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXgyZDsgXG4iCisgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgIiAgIHZlYzQgYyA9IHRleHR1cmUyRCh0ZXgyZCwgZ2xfVGV4Q29vcmRbMF0ueHkpOyBcbiIKKyAgICAgICIgICBpZiAoYy53IDwgMS4wKSBcbiIKKyAgICAgICIgICAgICBkaXNjYXJkOyBcbiIKKyAgICAgICIgICBnbF9GcmFnQ29sb3IgPSBjICogZ2xfQ29sb3I7IFxuIgorICAgICAgIn1cbiI7CisgICAvKiBWZXJ0ZXggc2hhZGVyOiBjb21wdXRlIG5ldyB2ZXJ0ZXggcG9zaXRpb24gYmFzZWQgb24gaW5jb21pbmcgdmVydGV4IHBvcywKKyAgICAqIHRleGNvb3JkcyBhbmQgc3BlY2lhbCBzY2FsZSBmYWN0b3IuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBjaGFyICp2ZXJ0U2hhZGVyVGV4dCA9CisgICAgICAidW5pZm9ybSB2ZWMyIHNjYWxlOyBcbiIKKyAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAiICAgdmVjNCBwID0gZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCAqIGdsX1ZlcnRleDtcbiIKKyAgICAgICIgICBnbF9Qb3NpdGlvbi54eSA9IHAueHkgKyBnbF9NdWx0aVRleENvb3JkMC54eSAqIHNjYWxlICogcC53OyBcbiIKKyAgICAgICIgICBnbF9Qb3NpdGlvbi56dyA9IHAuenc7IFxuIgorICAgICAgIiAgIGdsX1RleENvb3JkWzBdID0gZ2xfTXVsdGlUZXhDb29yZDA7IFxuIgorICAgICAgIiAgIGdsX0Zyb250Q29sb3IgPSBnbF9Db2xvcjsgXG4iCisgICAgICAifVxuIjsKKworICAgaWYgKCFTaGFkZXJzU3VwcG9ydGVkKCkpCisgICAgICBleGl0KDEpOworCisgICBHZXRFeHRlbnNpb25GdW5jcygpOworCisgICBWZXJ0U2hhZGVyID0gQ29tcGlsZVNoYWRlclRleHQoR0xfVkVSVEVYX1NIQURFUiwgdmVydFNoYWRlclRleHQpOworICAgRnJhZ1NoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KEdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZ1NoYWRlclRleHQpOworICAgUHJvZ3JhbSA9IExpbmtTaGFkZXJzKFZlcnRTaGFkZXIsIEZyYWdTaGFkZXIpOworCisgICBnbFVzZVByb2dyYW1fZnVuYyhQcm9ncmFtKTsKKworICAgdVNjYWxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhQcm9ncmFtLCAic2NhbGUiKTsKKyAgIHVUZXggPSBnbEdldFVuaWZvcm1Mb2NhdGlvbl9mdW5jKFByb2dyYW0sICJ0ZXgyZCIpOworICAgaWYgKHVUZXggIT0gLTEpIHsKKyAgICAgIGdsVW5pZm9ybTFpX2Z1bmModVRleCwgMCk7ICAvKiB0ZXggdW5pdCAwICovCisgICB9CisKKyAgIGdsVXNlUHJvZ3JhbV9mdW5jKDApOworCisgICBnbENsZWFyQ29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZik7CisgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisgICBnbEVuYWJsZShHTF9MSUdIVDApOworCisgICBNYWtlQml0bWFwVGV4dHVyZXMoKTsKK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKyAgIGdsdXRJbml0V2luZG93U2l6ZShXaW5XaWR0aCwgV2luSGVpZ2h0KTsKKyAgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0IgfCBHTFVUX0RPVUJMRSB8IEdMVVRfREVQVEgpOworICAgV2luID0gZ2x1dENyZWF0ZVdpbmRvdyhhcmd2WzBdKTsKKyAgIGdsdXRSZXNoYXBlRnVuYyhSZXNoYXBlKTsKKyAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKKyAgIGdsdXRTcGVjaWFsRnVuYyhTcGVjaWFsS2V5KTsKKyAgIGdsdXREaXNwbGF5RnVuYyhSZWRpc3BsYXkpOworICAgaWYgKEFuaW0pCisgICAgICBnbHV0SWRsZUZ1bmMoSWRsZSk7CisgICBJbml0KCk7CisgICBnbHV0TWFpbkxvb3AoKTsKKyAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvYnJpY2suYyBiL3Byb2dzL2dsc2wvYnJpY2suYwppbmRleCA1MjI2OThiLi41MjZlZjBlIDEwMDY0NAotLS0gYS9wcm9ncy9nbHNsL2JyaWNrLmMKKysrIGIvcHJvZ3MvZ2xzbC9icmljay5jCkBAIC0xMywzMyArMTMsMjYgQEAKICNpbmNsdWRlIDxHTC9nbHV0Lmg+CiAjaW5jbHVkZSA8R0wvZ2xleHQuaD4KICNpbmNsdWRlICJleHRmdW5jcy5oIgorI2luY2x1ZGUgInNoYWRlcnV0aWwuaCIKIAogCi1zdGF0aWMgY2hhciAqRnJhZ1Byb2dGaWxlID0gIkNIMDYtYnJpY2suZnJhZy50eHQiOwotc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9ICJDSDA2LWJyaWNrLnZlcnQudHh0IjsKK3N0YXRpYyBjaGFyICpGcmFnUHJvZ0ZpbGUgPSAiQ0gwNi1icmljay5mcmFnIjsKK3N0YXRpYyBjaGFyICpWZXJ0UHJvZ0ZpbGUgPSAiQ0gwNi1icmljay52ZXJ0IjsKIAogLyogcHJvZ3JhbS9zaGFkZXIgb2JqZWN0cyAqLwogc3RhdGljIEdMdWludCBmcmFnU2hhZGVyOwogc3RhdGljIEdMdWludCB2ZXJ0U2hhZGVyOwogc3RhdGljIEdMdWludCBwcm9ncmFtOwogCi0KLXN0cnVjdCB1bmlmb3JtX2luZm8gewotICAgY29uc3QgY2hhciAqbmFtZTsKLSAgIEdMdWludCBzaXplOwotICAgR0xpbnQgbG9jYXRpb247Ci0gICBHTGZsb2F0IHZhbHVlWzRdOwotfTsKLQogc3RhdGljIHN0cnVjdCB1bmlmb3JtX2luZm8gVW5pZm9ybXNbXSA9IHsKICAgIC8qIHZlcnQgKi8KLSAgIHsgIkxpZ2h0UG9zaXRpb24iLCAgICAgMywgLTEsIHsgMC4xLCAwLjEsIDkuMCwgMH0gfSwKKyAgIHsgIkxpZ2h0UG9zaXRpb24iLCAgICAgMywgR0xfRkxPQVQsIHsgMC4xLCAwLjEsIDkuMCwgMH0sIC0xIH0sCiAgICAvKiBmcmFnICovCi0gICB7ICJCcmlja0NvbG9yIiwgICAgICAgIDMsIC0xLCB7IDAuOCwgMC4yLCAwLjIsIDAgfSB9LAotICAgeyAiTW9ydGFyQ29sb3IiLCAgICAgICAzLCAtMSwgeyAwLjYsIDAuNiwgMC42LCAwIH0gfSwKLSAgIHsgIkJyaWNrU2l6ZSIsICAgICAgICAgMiwgLTEsIHsgMS4wLCAwLjMsIDAsIDAgfSB9LAotICAgeyAiQnJpY2tQY3QiLCAgICAgICAgICAyLCAtMSwgeyAwLjksIDAuOCwgMCwgMCB9IH0sCi0gICB7IE5VTEwsIDAsIDAsIHsgMCwgMCwgMCwgMCB9IH0KKyAgIHsgIkJyaWNrQ29sb3IiLCAgICAgICAgMywgR0xfRkxPQVQsIHsgMC44LCAwLjIsIDAuMiwgMCB9LCAtMSB9LAorICAgeyAiTW9ydGFyQ29sb3IiLCAgICAgICAzLCBHTF9GTE9BVCwgeyAwLjYsIDAuNiwgMC42LCAwIH0sIC0xIH0sCisgICB7ICJCcmlja1NpemUiLCAgICAgICAgIDIsIEdMX0ZMT0FULCB7IDEuMCwgMC4zLCAwLCAwIH0sIC0xIH0sCisgICB7ICJCcmlja1BjdCIsICAgICAgICAgIDIsIEdMX0ZMT0FULCB7IDAuOSwgMC44LCAwLCAwIH0sIC0xIH0sCisgICBFTkRfT0ZfVU5JRk9STVMKIH07CiAKIHN0YXRpYyBHTGludCB3aW4gPSAwOwpAQCAtMTQ2LDEyMSArMTM5LDIwIEBACiAKIAogc3RhdGljIHZvaWQKLUxvYWRBbmRDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0gICBHTGludCBzdGF0OwotCi0gICBnbFNoYWRlclNvdXJjZV9mdW5jKHNoYWRlciwgMSwgKGNvbnN0IEdMY2hhciAqKikgJnRleHQsIE5VTEwpOwotCi0gICBnbENvbXBpbGVTaGFkZXJfZnVuYyhzaGFkZXIpOwotCi0gICBnbEdldFNoYWRlcml2X2Z1bmMoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFNoYWRlckluZm9Mb2dfZnVuYyhzaGFkZXIsIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImJyaWNrOiBwcm9ibGVtIGNvbXBpbGluZyBzaGFkZXI6ICVzXG4iLCBsb2cpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZWQgT0tcbiIpOwotICAgfQotfQotCi0KLS8qKgotICogUmVhZCBhIHNoYWRlciBmcm9tIGEgZmlsZS4KLSAqLwotc3RhdGljIHZvaWQKLVJlYWRTaGFkZXIoR0x1aW50IHNoYWRlciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICBjb25zdCBpbnQgbWF4ID0gMTAwKjEwMDA7Ci0gICBpbnQgbjsKLSAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKG1heCk7Ci0gICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICBpZiAoIWYpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiYnJpY2s6IFVuYWJsZSB0byBvcGVuIHNoYWRlciBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBuID0gZnJlYWQoYnVmZmVyLCAxLCBtYXgsIGYpOwotICAgcHJpbnRmKCJicmljazogcmVhZCAlZCBieXRlcyBmcm9tIHNoYWRlciBmaWxlICVzXG4iLCBuLCBmaWxlbmFtZSk7Ci0gICBpZiAobiA+IDApIHsKLSAgICAgIGJ1ZmZlcltuXSA9IDA7Ci0gICAgICBMb2FkQW5kQ29tcGlsZVNoYWRlcihzaGFkZXIsIGJ1ZmZlcik7Ci0gICB9Ci0KLSAgIGZjbG9zZShmKTsKLSAgIGZyZWUoYnVmZmVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotQ2hlY2tMaW5rKEdMdWludCBwcm9nKQotewotICAgR0xpbnQgc3RhdDsKLSAgIGdsR2V0UHJvZ3JhbWl2X2Z1bmMocHJvZywgR0xfTElOS19TVEFUVVMsICZzdGF0KTsKLSAgIGlmICghc3RhdCkgewotICAgICAgR0xjaGFyIGxvZ1sxMDAwXTsKLSAgICAgIEdMc2l6ZWkgbGVuOwotICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZ19mdW5jKHByb2csIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmtlciBlcnJvcjpcbiVzXG4iLCBsb2cpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmsgc3VjY2VzcyFcbiIpOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCiBJbml0KHZvaWQpCiB7Ci0gICBjb25zdCBjaGFyICp2ZXJzaW9uOwotICAgR0xpbnQgaTsKLQotICAgdmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwotICAgaWYgKHZlcnNpb25bMF0gIT0gJzInIHx8IHZlcnNpb25bMV0gIT0gJy4nKSB7Ci0gICAgICBwcmludGYoIldhcm5pbmc6IHRoaXMgcHJvZ3JhbSBleHBlY3RzIE9wZW5HTCAyLjBcbiIpOwotICAgICAgLypleGl0KDEpOyovCi0gICB9CisgICBpZiAoIVNoYWRlcnNTdXBwb3J0ZWQoKSkKKyAgICAgIGV4aXQoMSk7CiAKICAgIEdldEV4dGVuc2lvbkZ1bmNzKCk7CiAKLSAgIHZlcnRTaGFkZXIgPSBnbENyZWF0ZVNoYWRlcl9mdW5jKEdMX1ZFUlRFWF9TSEFERVIpOwotICAgUmVhZFNoYWRlcih2ZXJ0U2hhZGVyLCBWZXJ0UHJvZ0ZpbGUpOworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX1ZFUlRFWF9TSEFERVIsIFZlcnRQcm9nRmlsZSk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlckZpbGUoR0xfRlJBR01FTlRfU0hBREVSLCBGcmFnUHJvZ0ZpbGUpOworICAgcHJvZ3JhbSA9IExpbmtTaGFkZXJzKHZlcnRTaGFkZXIsIGZyYWdTaGFkZXIpOwogCi0gICBmcmFnU2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9GUkFHTUVOVF9TSEFERVIpOwotICAgUmVhZFNoYWRlcihmcmFnU2hhZGVyLCBGcmFnUHJvZ0ZpbGUpOwotCi0gICBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtX2Z1bmMoKTsKLSAgIGdsQXR0YWNoU2hhZGVyX2Z1bmMocHJvZ3JhbSwgZnJhZ1NoYWRlcik7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIHZlcnRTaGFkZXIpOwotICAgZ2xMaW5rUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwotICAgQ2hlY2tMaW5rKHByb2dyYW0pOwogICAgZ2xVc2VQcm9ncmFtX2Z1bmMocHJvZ3JhbSk7CiAKLSAgIGZvciAoaSA9IDA7IFVuaWZvcm1zW2ldLm5hbWU7IGkrKykgewotICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24KLSAgICAgICAgID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCBVbmlmb3Jtc1tpXS5uYW1lKTsKLSAgICAgIHByaW50ZigiVW5pZm9ybSAlcyBsb2NhdGlvbjogJWRcbiIsIFVuaWZvcm1zW2ldLm5hbWUsCi0gICAgICAgICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24pOwotICAgICAgc3dpdGNoIChVbmlmb3Jtc1tpXS5zaXplKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBnbFVuaWZvcm0xZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBnbFVuaWZvcm0yZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBnbFVuaWZvcm0zZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgICBnbFVuaWZvcm00ZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgYWJvcnQoKTsKLSAgICAgIH0KLSAgIH0KKyAgIEluaXRVbmlmb3Jtcyhwcm9ncmFtLCBVbmlmb3Jtcyk7CiAKICAgIGFzc2VydChnbEdldEVycm9yKCkgPT0gMCk7CiAKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvYnVtcC5jIGIvcHJvZ3MvZ2xzbC9idW1wLmMKaW5kZXggYTY4NDZhYy4uYTJlMDkxNiAxMDA2NDQKLS0tIGEvcHJvZ3MvZ2xzbC9idW1wLmMKKysrIGIvcHJvZ3MvZ2xzbC9idW1wLmMKQEAgLTEzLDEwICsxMywxMSBAQAogI2luY2x1ZGUgPEdML2dsdS5oPgogI2luY2x1ZGUgPEdML2dsZXh0Lmg+CiAjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCiAKIAotc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9ICJDSDExLWJ1bXBtYXAuZnJhZy50eHQiOwotc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9ICJDSDExLWJ1bXBtYXAudmVydC50eHQiOworc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9ICJDSDExLWJ1bXBtYXAuZnJhZyI7CitzdGF0aWMgY2hhciAqVmVydFByb2dGaWxlID0gIkNIMTEtYnVtcG1hcC52ZXJ0IjsKIAogLyogcHJvZ3JhbS9zaGFkZXIgb2JqZWN0cyAqLwogc3RhdGljIEdMdWludCBmcmFnU2hhZGVyOwpAQCAtMjQsMjAgKzI1LDEzIEBACiBzdGF0aWMgR0x1aW50IHByb2dyYW07CiAKIAotc3RydWN0IHVuaWZvcm1faW5mbyB7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgR0x1aW50IHNpemU7Ci0gICBHTGludCBsb2NhdGlvbjsKLSAgIEdMZmxvYXQgdmFsdWVbNF07Ci19OwotCiBzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBVbmlmb3Jtc1tdID0gewotICAgeyAiTGlnaHRQb3NpdGlvbiIsICAgICAgIDMsIC0xLCB7IDAuNTc3MzcsIDAuNTc3MzUsIDAuNTc3MzUsIDAuMCB9IH0sCi0gICB7ICJTdXJmYWNlQ29sb3IiLCAgICAgICAgMywgLTEsIHsgMC44LCAwLjgsIDAuMiwgMCB9IH0sCi0gICB7ICJCdW1wRGVuc2l0eSIsICAgICAgICAgMSwgLTEsIHsgMTAuMCwgMCwgMCwgMCB9IH0sCi0gICB7ICJCdW1wU2l6ZSIsICAgICAgICAgICAgMSwgLTEsIHsgMC4xMjUsIDAsIDAsIDAgfSB9LAotICAgeyAiU3BlY3VsYXJGYWN0b3IiLCAgICAgIDEsIC0xLCB7IDAuNSwgMCwgMCwgMCB9IH0sCi0gICB7IE5VTEwsIDAsIDAsIHsgMCwgMCwgMCwgMCB9IH0KKyAgIHsgIkxpZ2h0UG9zaXRpb24iLCAgICAzLCBHTF9GTE9BVCwgeyAwLjU3NzM3LCAwLjU3NzM1LCAwLjU3NzM1LCAwLjAgfSwgLTEgfSwKKyAgIHsgIlN1cmZhY2VDb2xvciIsICAgICAzLCBHTF9GTE9BVCwgeyAwLjgsIDAuOCwgMC4yLCAwIH0sIC0xIH0sCisgICB7ICJCdW1wRGVuc2l0eSIsICAgICAgMSwgR0xfRkxPQVQsIHsgMTAuMCwgMCwgMCwgMCB9LCAtMSB9LAorICAgeyAiQnVtcFNpemUiLCAgICAgICAgIDEsIEdMX0ZMT0FULCB7IDAuMTI1LCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJTcGVjdWxhckZhY3RvciIsICAgMSwgR0xfRkxPQVQsIHsgMC41LCAwLCAwLCAwIH0sIC0xIH0sCisgICBFTkRfT0ZfVU5JRk9STVMKIH07CiAKIHN0YXRpYyBHTGludCB3aW4gPSAwOwpAQCAtMjMyLDEwMCArMjI2LDE4IEBACiB9CiAKIAotCi1zdGF0aWMgdm9pZAotTG9hZEFuZENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlciwgY29uc3QgY2hhciAqdGV4dCkKLXsKLSAgIEdMaW50IHN0YXQ7Ci0KLSAgIGdsU2hhZGVyU291cmNlX2Z1bmMoc2hhZGVyLCAxLCAoY29uc3QgR0xjaGFyICoqKSAmdGV4dCwgTlVMTCk7Ci0KLSAgIGdsQ29tcGlsZVNoYWRlcl9mdW5jKHNoYWRlcik7Ci0KLSAgIGdsR2V0U2hhZGVyaXZfZnVuYyhzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdCk7Ci0gICBpZiAoIXN0YXQpIHsKLSAgICAgIEdMY2hhciBsb2dbMTAwMF07Ci0gICAgICBHTHNpemVpIGxlbjsKLSAgICAgIGdsR2V0U2hhZGVySW5mb0xvZ19mdW5jKHNoYWRlciwgMTAwMCwgJmxlbiwgbG9nKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiYnJpY2s6IHByb2JsZW0gY29tcGlsaW5nIHNoYWRlcjogJXNcbiIsIGxvZyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBwcmludGYoIlNoYWRlciBjb21waWxlZCBPS1xuIik7Ci0gICB9Ci19Ci0KLQotLyoqCi0gKiBSZWFkIGEgc2hhZGVyIGZyb20gYSBmaWxlLgotICovCi1zdGF0aWMgdm9pZAotUmVhZFNoYWRlcihHTHVpbnQgc2hhZGVyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgIGNvbnN0IGludCBtYXggPSAxMDAqMTAwMDsKLSAgIGludCBuOwotICAgY2hhciAqYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MobWF4KTsKLSAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgIGlmICghZikgewotICAgICAgZnByaW50ZihzdGRlcnIsICJicmljazogVW5hYmxlIHRvIG9wZW4gc2hhZGVyIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIG4gPSBmcmVhZChidWZmZXIsIDEsIG1heCwgZik7Ci0gICBwcmludGYoImJyaWNrOiByZWFkICVkIGJ5dGVzIGZyb20gc2hhZGVyIGZpbGUgJXNcbiIsIG4sIGZpbGVuYW1lKTsKLSAgIGlmIChuID4gMCkgewotICAgICAgYnVmZmVyW25dID0gMDsKLSAgICAgIExvYWRBbmRDb21waWxlU2hhZGVyKHNoYWRlciwgYnVmZmVyKTsKLSAgIH0KLQotICAgZmNsb3NlKGYpOwotICAgZnJlZShidWZmZXIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1DaGVja0xpbmsoR0x1aW50IHByb2cpCi17Ci0gICBHTGludCBzdGF0OwotICAgZ2xHZXRQcm9ncmFtaXZfZnVuYyhwcm9nLCBHTF9MSU5LX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFByb2dyYW1JbmZvTG9nX2Z1bmMocHJvZywgMTAwMCwgJmxlbiwgbG9nKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTGlua2VyIGVycm9yOlxuJXNcbiIsIGxvZyk7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTGluayBzdWNjZXNzIVxuIik7Ci0gICB9Ci19Ci0KLQogc3RhdGljIHZvaWQKIEluaXQodm9pZCkKIHsKLSAgIGNvbnN0IGNoYXIgKnZlcnNpb247Ci0gICBHTGludCBpOwotCi0gICB2ZXJzaW9uID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7Ci0gICBpZiAodmVyc2lvblswXSAhPSAnMicgfHwgdmVyc2lvblsxXSAhPSAnLicpIHsKLSAgICAgIHByaW50ZigiV2FybmluZzogdGhpcyBwcm9ncmFtIGV4cGVjdHMgT3BlbkdMIDIuMFxuIik7Ci0gICAgICAvKmV4aXQoMSk7Ki8KLSAgIH0KLSAgIHByaW50ZigiR0xfUkVOREVSRVIgPSAlc1xuIiwoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworICAgaWYgKCFTaGFkZXJzU3VwcG9ydGVkKCkpCisgICAgICBleGl0KDEpOwogCiAgICBHZXRFeHRlbnNpb25GdW5jcygpOwogCi0gICB2ZXJ0U2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9WRVJURVhfU0hBREVSKTsKLSAgIFJlYWRTaGFkZXIodmVydFNoYWRlciwgVmVydFByb2dGaWxlKTsKKyAgIHZlcnRTaGFkZXIgPSBDb21waWxlU2hhZGVyRmlsZShHTF9WRVJURVhfU0hBREVSLCBWZXJ0UHJvZ0ZpbGUpOworICAgZnJhZ1NoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX0ZSQUdNRU5UX1NIQURFUiwgRnJhZ1Byb2dGaWxlKTsKKyAgIHByb2dyYW0gPSBMaW5rU2hhZGVycyh2ZXJ0U2hhZGVyLCBmcmFnU2hhZGVyKTsKIAotICAgZnJhZ1NoYWRlciA9IGdsQ3JlYXRlU2hhZGVyX2Z1bmMoR0xfRlJBR01FTlRfU0hBREVSKTsKLSAgIFJlYWRTaGFkZXIoZnJhZ1NoYWRlciwgRnJhZ1Byb2dGaWxlKTsKLQotICAgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbV9mdW5jKCk7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIGZyYWdTaGFkZXIpOwotICAgZ2xBdHRhY2hTaGFkZXJfZnVuYyhwcm9ncmFtLCB2ZXJ0U2hhZGVyKTsKLSAgIGdsTGlua1Byb2dyYW1fZnVuYyhwcm9ncmFtKTsKLSAgIENoZWNrTGluayhwcm9ncmFtKTsKICAgIGdsVXNlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwogCiAgICBhc3NlcnQoZ2xJc1Byb2dyYW1fZnVuYyhwcm9ncmFtKSk7CkBAIC0zMzYsMjggKzI0OCw3IEBACiAKICAgIENoZWNrRXJyb3IoX19MSU5FX18pOwogCi0gICBmb3IgKGkgPSAwOyBVbmlmb3Jtc1tpXS5uYW1lOyBpKyspIHsKLSAgICAgIFVuaWZvcm1zW2ldLmxvY2F0aW9uCi0gICAgICAgICA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgVW5pZm9ybXNbaV0ubmFtZSk7Ci0gICAgICBwcmludGYoIlVuaWZvcm0gJXMgbG9jYXRpb246ICVkXG4iLCBVbmlmb3Jtc1tpXS5uYW1lLAotICAgICAgICAgICAgIFVuaWZvcm1zW2ldLmxvY2F0aW9uKTsKLSAgICAgIHN3aXRjaCAoVW5pZm9ybXNbaV0uc2l6ZSkgewotICAgICAgY2FzZSAxOgotICAgICAgICAgZ2xVbmlmb3JtMWZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICAgZ2xVbmlmb3JtMmZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOgotICAgICAgICAgZ2xVbmlmb3JtM2Z2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgICAgZ2xVbmlmb3JtNGZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICB9CisgICBJbml0VW5pZm9ybXMocHJvZ3JhbSwgVW5pZm9ybXMpOwogCiAgICBDaGVja0Vycm9yKF9fTElORV9fKTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC9jb252b2x1dGlvbnMuYyBiL3Byb2dzL2dsc2wvY29udm9sdXRpb25zLmMKaW5kZXggOWI5ZWU1My4uYTI1ZGFkNSAxMDA2NDQKLS0tIGEvcHJvZ3MvZ2xzbC9jb252b2x1dGlvbnMuYworKysgYi9wcm9ncy9nbHNsL2NvbnZvbHV0aW9ucy5jCkBAIC0xLDMgKzEsMTAgQEAKKy8qKgorICogQ29udm9sdXRpb24gd2l0aCBHTFNMLgorICogTm90ZTogdXNlcyBHTF9BUkJfc2hhZGVyX29iamVjdHMsIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyLCBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyLAorICogbm90IHRoZSBPcGVuR0wgMi4wIHNoYWRlciBBUEkuCisgKiBBdXRob3I6IFphY2sgUnVzaW4KKyAqLworCiAjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKICNpbmNsdWRlICJyZWFkdGV4LmgiCiAKQEAgLTIyNyw5ICsyMzQsMTEgQEAKIAogICAgZ2xVc2VQcm9ncmFtKHByb2dyYW0pOwogCisgICAvKgogICAgYXNzZXJ0KGdsSXNQcm9ncmFtKHByb2dyYW0pKTsKICAgIGFzc2VydChnbElzU2hhZGVyKGZyYWdTaGFkZXIpKTsKICAgIGFzc2VydChnbElzU2hhZGVyKHZlcnRTaGFkZXIpKTsKKyAgICovCiAKICAgIGNoZWNrRXJyb3IoX19MSU5FX18pOwogICAgey8qdGV4dHVyZSovCkBAIC0zMTYsNiArMzI1LDEzIEBACiAKIHN0YXRpYyB2b2lkIGluaXQoKQogeworICAgaWYgKCFnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9BUkJfc2hhZGVyX29iamVjdHMiKSB8fAorICAgICAgICFnbHV0RXh0ZW5zaW9uU3VwcG9ydGVkKCJHTF9BUkJfdmVydGV4X3NoYWRlciIpIHx8CisgICAgICAgIWdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FSQl9mcmFnbWVudF9zaGFkZXIiKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJTb3JyeSwgdGhpcyBwcm9ncmFtIHJlcXVpcmVzIEdMX0FSQl9zaGFkZXJfb2JqZWN0cywgR0xfQVJCX3ZlcnRleF9zaGFkZXIsIGFuZCBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKICAgIGZwcmludGYoc3RkZXJyLCAiR0xfUkVOREVSRVIgICA9ICVzXG4iLCAoY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOwogICAgZnByaW50ZihzdGRlcnIsICJHTF9WRVJTSU9OICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pKTsKICAgIGZwcmludGYoc3RkZXJyLCAiR0xfVkVORE9SICAgICA9ICVzXG4iLCAoY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvY3ViZW1hcC5mcmFnLnR4dCBiL3Byb2dzL2dsc2wvY3ViZW1hcC5mcmFnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcm9ncy9nbHNsL2N1YmVtYXAuZnJhZy50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvY3ViZW1hcC5mcmFnCmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL2Rlcml2LmMgYi9wcm9ncy9nbHNsL2Rlcml2LmMKaW5kZXggOGI2NTJiYy4uZTY5ZjBiOCAxMDA2NDQKLS0tIGEvcHJvZ3MvZ2xzbC9kZXJpdi5jCisrKyBiL3Byb2dzL2dsc2wvZGVyaXYuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPEdML2dsdXQuaD4KICNpbmNsdWRlIDxHTC9nbGV4dC5oPgogI2luY2x1ZGUgImV4dGZ1bmNzLmgiCisjaW5jbHVkZSAic2hhZGVydXRpbC5oIgogCiAKIHN0YXRpYyBjaGFyICpGcmFnUHJvZ0ZpbGUgPSBOVUxMOwpAQCAtMTU5LDY4ICsxNjAsNiBAQAogfQogCiAKLQotc3RhdGljIHZvaWQKLUxvYWRBbmRDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0gICBHTGludCBzdGF0OwotCi0gICBnbFNoYWRlclNvdXJjZV9mdW5jKHNoYWRlciwgMSwgKGNvbnN0IEdMY2hhciAqKikgJnRleHQsIE5VTEwpOwotCi0gICBnbENvbXBpbGVTaGFkZXJfZnVuYyhzaGFkZXIpOwotCi0gICBnbEdldFNoYWRlcml2X2Z1bmMoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFNoYWRlckluZm9Mb2dfZnVuYyhzaGFkZXIsIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImZzbGlnaHQ6IHByb2JsZW0gY29tcGlsaW5nIHNoYWRlcjpcbiVzXG4iLCBsb2cpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLX0KLQotCi0vKioKLSAqIFJlYWQgYSBzaGFkZXIgZnJvbSBhIGZpbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1SZWFkU2hhZGVyKEdMdWludCBzaGFkZXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgY29uc3QgaW50IG1heCA9IDEwMCoxMDAwOwotICAgaW50IG47Ci0gICBjaGFyICpidWZmZXIgPSAoY2hhciopIG1hbGxvYyhtYXgpOwotICAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgaWYgKCFmKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImZzbGlnaHQ6IFVuYWJsZSB0byBvcGVuIHNoYWRlciBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBuID0gZnJlYWQoYnVmZmVyLCAxLCBtYXgsIGYpOwotICAgcHJpbnRmKCJmc2xpZ2h0OiByZWFkICVkIGJ5dGVzIGZyb20gc2hhZGVyIGZpbGUgJXNcbiIsIG4sIGZpbGVuYW1lKTsKLSAgIGlmIChuID4gMCkgewotICAgICAgYnVmZmVyW25dID0gMDsKLSAgICAgIExvYWRBbmRDb21waWxlU2hhZGVyKHNoYWRlciwgYnVmZmVyKTsKLSAgIH0KLQotICAgZmNsb3NlKGYpOwotICAgZnJlZShidWZmZXIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1DaGVja0xpbmsoR0x1aW50IHByb2cpCi17Ci0gICBHTGludCBzdGF0OwotICAgZ2xHZXRQcm9ncmFtaXZfZnVuYyhwcm9nLCBHTF9MSU5LX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFByb2dyYW1JbmZvTG9nX2Z1bmMocHJvZywgMTAwMCwgJmxlbiwgbG9nKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTGlua2VyIGVycm9yOlxuJXNcbiIsIGxvZyk7Ci0gICB9Ci19Ci0KLQogc3RhdGljIHZvaWQKIEluaXQodm9pZCkKIHsKQEAgLTIzNCwzMyArMTczLDE2IEBACiAgICAgICAiICAgZ2xfUG9zaXRpb24gPSBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ICogZ2xfVmVydGV4O1xuIgogICAgICAgIiAgIGdsX1RleENvb3JkWzBdID0gZ2xfTXVsdGlUZXhDb29yZDA7XG4iCiAgICAgICAifVxuIjsKLSAgIGNvbnN0IGNoYXIgKnZlcnNpb247CiAKLSAgIHZlcnNpb24gPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKLSAgIGlmICh2ZXJzaW9uWzBdICE9ICcyJyB8fCB2ZXJzaW9uWzFdICE9ICcuJykgewotICAgICAgcHJpbnRmKCJUaGlzIHByb2dyYW0gcmVxdWlyZXMgT3BlbkdMIDIueCwgZm91bmQgJXNcbiIsIHZlcnNpb24pOworICAgaWYgKCFTaGFkZXJzU3VwcG9ydGVkKCkpCiAgICAgICBleGl0KDEpOwotICAgfQogCiAgICBHZXRFeHRlbnNpb25GdW5jcygpOwogCi0gICBmcmFnU2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9GUkFHTUVOVF9TSEFERVIpOwotICAgaWYgKEZyYWdQcm9nRmlsZSkKLSAgICAgIFJlYWRTaGFkZXIoZnJhZ1NoYWRlciwgRnJhZ1Byb2dGaWxlKTsKLSAgIGVsc2UKLSAgICAgIExvYWRBbmRDb21waWxlU2hhZGVyKGZyYWdTaGFkZXIsIGZyYWdTaGFkZXJUZXh0KTsKKyAgIHZlcnRTaGFkZXIgPSBDb21waWxlU2hhZGVyVGV4dChHTF9WRVJURVhfU0hBREVSLCB2ZXJ0U2hhZGVyVGV4dCk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlclRleHQoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnU2hhZGVyVGV4dCk7CisgICBwcm9ncmFtID0gTGlua1NoYWRlcnModmVydFNoYWRlciwgZnJhZ1NoYWRlcik7CiAKLSAgIHZlcnRTaGFkZXIgPSBnbENyZWF0ZVNoYWRlcl9mdW5jKEdMX1ZFUlRFWF9TSEFERVIpOwotICAgaWYgKFZlcnRQcm9nRmlsZSkKLSAgICAgIFJlYWRTaGFkZXIodmVydFNoYWRlciwgVmVydFByb2dGaWxlKTsKLSAgIGVsc2UKLSAgICAgIExvYWRBbmRDb21waWxlU2hhZGVyKHZlcnRTaGFkZXIsIHZlcnRTaGFkZXJUZXh0KTsKLQotICAgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbV9mdW5jKCk7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIGZyYWdTaGFkZXIpOwotICAgZ2xBdHRhY2hTaGFkZXJfZnVuYyhwcm9ncmFtLCB2ZXJ0U2hhZGVyKTsKLSAgIGdsTGlua1Byb2dyYW1fZnVuYyhwcm9ncmFtKTsKLSAgIENoZWNrTGluayhwcm9ncmFtKTsKICAgIGdsVXNlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwogCiAgICAvKmFzc2VydChnbEdldEVycm9yKCkgPT0gMCk7Ki8KZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvbWFuZGVsYnJvdC5jIGIvcHJvZ3MvZ2xzbC9tYW5kZWxicm90LmMKaW5kZXggN2EyYmFkNi4uZTYzNjFiNCAxMDA2NDQKLS0tIGEvcHJvZ3MvZ2xzbC9tYW5kZWxicm90LmMKKysrIGIvcHJvZ3MvZ2xzbC9tYW5kZWxicm90LmMKQEAgLTEzLDEwICsxMywxMSBAQAogI2luY2x1ZGUgPEdML2dsdXQuaD4KICNpbmNsdWRlIDxHTC9nbGV4dC5oPgogI2luY2x1ZGUgImV4dGZ1bmNzLmgiCisjaW5jbHVkZSAic2hhZGVydXRpbC5oIgogCiAKLXN0YXRpYyBjaGFyICpGcmFnUHJvZ0ZpbGUgPSAiQ0gxOC1tYW5kZWwuZnJhZy50eHQiOwotc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9ICJDSDE4LW1hbmRlbC52ZXJ0LnR4dCI7CitzdGF0aWMgY2hhciAqRnJhZ1Byb2dGaWxlID0gIkNIMTgtbWFuZGVsLmZyYWciOworc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9ICJDSDE4LW1hbmRlbC52ZXJ0IjsKIAogLyogcHJvZ3JhbS9zaGFkZXIgb2JqZWN0cyAqLwogc3RhdGljIEdMdWludCBmcmFnU2hhZGVyOwpAQCAtMjQsMjggKzI1LDIxIEBACiBzdGF0aWMgR0x1aW50IHByb2dyYW07CiAKIAotc3RydWN0IHVuaWZvcm1faW5mbyB7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgR0x1aW50IHNpemU7Ci0gICBHTGludCBsb2NhdGlvbjsKLSAgIEdMZmxvYXQgdmFsdWVbNF07Ci19OwotCiBzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBVbmlmb3Jtc1tdID0gewogICAgLyogdmVydCAqLwotICAgeyAiTGlnaHRQb3NpdGlvbiIsICAgICAgICAzLCAtMSwgeyAwLjEsIDAuMSwgOS4wLCAwfSB9LAotICAgeyAiU3BlY3VsYXJDb250cmlidXRpb24iLCAxLCAtMSwgeyAwLjUsIDAsIDAsIDAgfSB9LAotICAgeyAiRGlmZnVzZUNvbnRyaWJ1dGlvbiIsICAxLCAtMSwgeyAwLjUsIDAsIDAsIDAgfSB9LAotICAgeyAiU2hpbmluZXNzIiwgICAgICAgICAgICAxLCAtMSwgeyAyMC4wLCAwLCAwLCAwIH0gfSwKKyAgIHsgIkxpZ2h0UG9zaXRpb24iLCAgICAgICAgMywgR0xfRkxPQVQsIHsgMC4xLCAwLjEsIDkuMCwgMH0sIC0xIH0sCisgICB7ICJTcGVjdWxhckNvbnRyaWJ1dGlvbiIsIDEsIEdMX0ZMT0FULCB7IDAuNSwgMCwgMCwgMCB9LCAtMSB9LAorICAgeyAiRGlmZnVzZUNvbnRyaWJ1dGlvbiIsICAxLCBHTF9GTE9BVCwgeyAwLjUsIDAsIDAsIDAgfSwgLTEgfSwKKyAgIHsgIlNoaW5pbmVzcyIsICAgICAgICAgICAgMSwgR0xfRkxPQVQsIHsgMjAuMCwgMCwgMCwgMCB9LCAtMSB9LAogICAgLyogZnJhZyAqLwotICAgeyAiTWF4SXRlcmF0aW9ucyIsICAgICAgICAxLCAtMSwgeyAxMiwgMCwgMCwgMCB9IH0sCi0gICB7ICJab29tIiwgICAgICAgICAgICAgICAgIDEsIC0xLCB7IDAuMTI1LCAwLCAwLCAwIH0gfSwKLSAgIHsgIlhjZW50ZXIiLCAgICAgICAgICAgICAgMSwgLTEsIHsgLTEuNSwgMCwgMCwgMCB9IH0sCi0gICB7ICJZY2VudGVyIiwgICAgICAgICAgICAgIDEsIC0xLCB7IC4wMDUsIDAsIDAsIDAgfSB9LAotICAgeyAiSW5uZXJDb2xvciIsICAgICAgICAgICAzLCAtMSwgeyAxLCAwLCAwLCAwIH0gfSwKLSAgIHsgIk91dGVyQ29sb3IxIiwgICAgICAgICAgMywgLTEsIHsgMCwgMSwgMCwgMCB9IH0sCi0gICB7ICJPdXRlckNvbG9yMiIsICAgICAgICAgIDMsIC0xLCB7IDAsIDAsIDEsIDAgfSB9LAotICAgeyBOVUxMLCAwLCAwLCB7IDAsIDAsIDAsIDAgfSB9CisgICB7ICJNYXhJdGVyYXRpb25zIiwgICAgICAgIDEsIEdMX0ZMT0FULCB7IDEyLCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJab29tIiwgICAgICAgICAgICAgICAgIDEsIEdMX0ZMT0FULCB7IDAuMTI1LCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJYY2VudGVyIiwgICAgICAgICAgICAgIDEsIEdMX0ZMT0FULCB7IC0xLjUsIDAsIDAsIDAgfSwgLTEgfSwKKyAgIHsgIlljZW50ZXIiLCAgICAgICAgICAgICAgMSwgR0xfRkxPQVQsIHsgLjAwNSwgMCwgMCwgMCB9LCAtMSB9LAorICAgeyAiSW5uZXJDb2xvciIsICAgICAgICAgICAzLCBHTF9GTE9BVCwgeyAxLCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJPdXRlckNvbG9yMSIsICAgICAgICAgIDMsIEdMX0ZMT0FULCB7IDAsIDEsIDAsIDAgfSwgLTEgfSwKKyAgIHsgIk91dGVyQ29sb3IyIiwgICAgICAgICAgMywgR0xfRkxPQVQsIHsgMCwgMCwgMSwgMCB9LCAtMSB9LAorICAgRU5EX09GX1VOSUZPUk1TCiB9OwogCiBzdGF0aWMgR0xpbnQgd2luID0gMDsKQEAgLTE1NywxMjMgKzE1MSwyMSBAQAogfQogCiAKLQotc3RhdGljIHZvaWQKLUxvYWRBbmRDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0gICBHTGludCBzdGF0OwotCi0gICBnbFNoYWRlclNvdXJjZV9mdW5jKHNoYWRlciwgMSwgKGNvbnN0IEdMY2hhciAqKikgJnRleHQsIE5VTEwpOwotCi0gICBnbENvbXBpbGVTaGFkZXJfZnVuYyhzaGFkZXIpOwotCi0gICBnbEdldFNoYWRlcml2X2Z1bmMoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFNoYWRlckluZm9Mb2dfZnVuYyhzaGFkZXIsIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImJyaWNrOiBwcm9ibGVtIGNvbXBpbGluZyBzaGFkZXI6ICVzXG4iLCBsb2cpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZWQgT0tcbiIpOwotICAgfQotfQotCi0KLS8qKgotICogUmVhZCBhIHNoYWRlciBmcm9tIGEgZmlsZS4KLSAqLwotc3RhdGljIHZvaWQKLVJlYWRTaGFkZXIoR0x1aW50IHNoYWRlciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICBjb25zdCBpbnQgbWF4ID0gMTAwKjEwMDA7Ci0gICBpbnQgbjsKLSAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKG1heCk7Ci0gICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICBpZiAoIWYpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiYnJpY2s6IFVuYWJsZSB0byBvcGVuIHNoYWRlciBmaWxlICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBuID0gZnJlYWQoYnVmZmVyLCAxLCBtYXgsIGYpOwotICAgcHJpbnRmKCJicmljazogcmVhZCAlZCBieXRlcyBmcm9tIHNoYWRlciBmaWxlICVzXG4iLCBuLCBmaWxlbmFtZSk7Ci0gICBpZiAobiA+IDApIHsKLSAgICAgIGJ1ZmZlcltuXSA9IDA7Ci0gICAgICBMb2FkQW5kQ29tcGlsZVNoYWRlcihzaGFkZXIsIGJ1ZmZlcik7Ci0gICB9Ci0KLSAgIGZjbG9zZShmKTsKLSAgIGZyZWUoYnVmZmVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotQ2hlY2tMaW5rKEdMdWludCBwcm9nKQotewotICAgR0xpbnQgc3RhdDsKLSAgIGdsR2V0UHJvZ3JhbWl2X2Z1bmMocHJvZywgR0xfTElOS19TVEFUVVMsICZzdGF0KTsKLSAgIGlmICghc3RhdCkgewotICAgICAgR0xjaGFyIGxvZ1sxMDAwXTsKLSAgICAgIEdMc2l6ZWkgbGVuOwotICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZ19mdW5jKHByb2csIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmtlciBlcnJvcjpcbiVzXG4iLCBsb2cpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmsgc3VjY2VzcyFcbiIpOwotICAgfQotfQotCi0KIHN0YXRpYyB2b2lkCiBJbml0KHZvaWQpCiB7Ci0gICBjb25zdCBjaGFyICp2ZXJzaW9uOwotICAgR0xpbnQgaTsKLQotICAgdmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwotICAgaWYgKHZlcnNpb25bMF0gIT0gJzInIHx8IHZlcnNpb25bMV0gIT0gJy4nKSB7Ci0gICAgICBwcmludGYoIldhcm5pbmc6IHRoaXMgcHJvZ3JhbSBleHBlY3RzIE9wZW5HTCAyLjBcbiIpOwotICAgICAgLypleGl0KDEpOyovCi0gICB9CisgICBpZiAoIVNoYWRlcnNTdXBwb3J0ZWQoKSkKKyAgICAgIGV4aXQoMSk7CiAKICAgIEdldEV4dGVuc2lvbkZ1bmNzKCk7CiAKLSAgIHZlcnRTaGFkZXIgPSBnbENyZWF0ZVNoYWRlcl9mdW5jKEdMX1ZFUlRFWF9TSEFERVIpOwotICAgUmVhZFNoYWRlcih2ZXJ0U2hhZGVyLCBWZXJ0UHJvZ0ZpbGUpOworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX1ZFUlRFWF9TSEFERVIsIFZlcnRQcm9nRmlsZSk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlckZpbGUoR0xfRlJBR01FTlRfU0hBREVSLCBGcmFnUHJvZ0ZpbGUpOworICAgcHJvZ3JhbSA9IExpbmtTaGFkZXJzKHZlcnRTaGFkZXIsIGZyYWdTaGFkZXIpOwogCi0gICBmcmFnU2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9GUkFHTUVOVF9TSEFERVIpOwotICAgUmVhZFNoYWRlcihmcmFnU2hhZGVyLCBGcmFnUHJvZ0ZpbGUpOwotCi0gICBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtX2Z1bmMoKTsKLSAgIGdsQXR0YWNoU2hhZGVyX2Z1bmMocHJvZ3JhbSwgZnJhZ1NoYWRlcik7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIHZlcnRTaGFkZXIpOwotICAgZ2xMaW5rUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwotICAgQ2hlY2tMaW5rKHByb2dyYW0pOwogICAgZ2xVc2VQcm9ncmFtX2Z1bmMocHJvZ3JhbSk7CiAKLSAgIGZvciAoaSA9IDA7IFVuaWZvcm1zW2ldLm5hbWU7IGkrKykgewotICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24KLSAgICAgICAgID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCBVbmlmb3Jtc1tpXS5uYW1lKTsKLSAgICAgIHByaW50ZigiVW5pZm9ybSAlcyBsb2NhdGlvbjogJWRcbiIsIFVuaWZvcm1zW2ldLm5hbWUsCi0gICAgICAgICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24pOwotICAgICAgc3dpdGNoIChVbmlmb3Jtc1tpXS5zaXplKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBnbFVuaWZvcm0xZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBnbFVuaWZvcm0yZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBnbFVuaWZvcm0zZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgICBnbFVuaWZvcm00ZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgYWJvcnQoKTsKLSAgICAgIH0KLSAgIH0KKyAgIEluaXRVbmlmb3Jtcyhwcm9ncmFtLCBVbmlmb3Jtcyk7CiAKICAgIHVab29tID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCAiWm9vbSIpOwogICAgdVhjZW50ZXIgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbl9mdW5jKHByb2dyYW0sICJYY2VudGVyIik7CmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL211bHRpdGV4LmMgYi9wcm9ncy9nbHNsL211bHRpdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2ZDQwZgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dzL2dsc2wvbXVsdGl0ZXguYwpAQCAtMCwwICsxLDI4NSBAQAorLyoqCisgKiBUZXN0IG11bHRpLXRleHR1cmluZyB3aXRoIEdMIHNoYWRpbmcgbGFuZ3VhZ2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIkdML2dsdXQuaCIKKyNpbmNsdWRlICJyZWFkdGV4LmgiCisjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpEZW1vID0gIm11bHRpdGV4IjsKKworc3RhdGljIGNvbnN0IGNoYXIgKlZlcnRGaWxlID0gIm11bHRpdGV4LnZlcnQiOworc3RhdGljIGNvbnN0IGNoYXIgKkZyYWdGaWxlID0gIm11bHRpdGV4LmZyYWciOworCitzdGF0aWMgY29uc3QgY2hhciAqVGV4RmlsZXNbMl0gPSAKKyAgIHsKKyAgICAgICIuLi9pbWFnZXMvdGlsZS5yZ2IiLAorICAgICAgIi4uL2ltYWdlcy90cmVlMi5yZ2JhIgorICAgfTsKKworCitzdGF0aWMgR0x1aW50IFByb2dyYW07CisKK3N0YXRpYyBHTGZsb2F0IFhyb3QgPSAtOTAuMCwgWXJvdCA9IC4wLCBacm90ID0gMC4wOworc3RhdGljIEdMZmxvYXQgRXllRGlzdCA9IDEwOworc3RhdGljIEdMYm9vbGVhbiBBbmltID0gR0xfVFJVRTsKKworCisvKiB2YWx1ZVswXSA9IHRleCB1bml0ICovCitzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBVbmlmb3Jtc1tdID0geworICAgeyAidGV4MSIsICAxLCBHTF9JTlQsIHsgMCwgMCwgMCwgMCB9LCAtMSB9LAorICAgeyAidGV4MiIsICAxLCBHTF9JTlQsIHsgMSwgMCwgMCwgMCB9LCAtMSB9LAorICAgRU5EX09GX1VOSUZPUk1TCit9OworCisKK3N0YXRpYyB2b2lkCitEcmF3UG9seWdvbihHTGZsb2F0IHNpemUpCit7CisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsUm90YXRlZig5MCwgMSwgMCwgMCk7CisgICBnbE5vcm1hbDNmKDAsIDAsIDEpOworICAgZ2xCZWdpbihHTF9QT0xZR09OKTsKKworICAgZ2xNdWx0aVRleENvb3JkMmYoR0xfVEVYVFVSRTAsIDAsIDApOworICAgZ2xNdWx0aVRleENvb3JkMmYoR0xfVEVYVFVSRTEsIDAsIDApOworICAgZ2xWZXJ0ZXgyZigtc2l6ZSwgLXNpemUpOworCisgICBnbE11bHRpVGV4Q29vcmQyZihHTF9URVhUVVJFMCwgMiwgMCk7CisgICBnbE11bHRpVGV4Q29vcmQyZihHTF9URVhUVVJFMSwgMSwgMCk7CisgICBnbFZlcnRleDJmKCBzaXplLCAtc2l6ZSk7CisKKyAgIGdsTXVsdGlUZXhDb29yZDJmKEdMX1RFWFRVUkUwLCAyLCAyKTsKKyAgIGdsTXVsdGlUZXhDb29yZDJmKEdMX1RFWFRVUkUxLCAxLCAxKTsKKyAgIGdsVmVydGV4MmYoIHNpemUsICBzaXplKTsKKworICAgZ2xNdWx0aVRleENvb3JkMmYoR0xfVEVYVFVSRTAsIDAsIDIpOworICAgZ2xNdWx0aVRleENvb3JkMmYoR0xfVEVYVFVSRTEsIDAsIDEpOworICAgZ2xWZXJ0ZXgyZigtc2l6ZSwgIHNpemUpOworCisgICBnbEVuZCgpOworICAgZ2xQb3BNYXRyaXgoKTsKK30KKworCitzdGF0aWMgdm9pZAorZHJhdyh2b2lkKQoreworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgIGdsUHVzaE1hdHJpeCgpOyAvKiBtb2RlbHZpZXcgbWF0cml4ICovCisgICAgICBnbFRyYW5zbGF0ZWYoMC4wLCAwLjAsIC1FeWVEaXN0KTsKKyAgICAgIGdsUm90YXRlZihacm90LCAwLCAwLCAxKTsKKyAgICAgIGdsUm90YXRlZihZcm90LCAwLCAxLCAwKTsKKyAgICAgIGdsUm90YXRlZihYcm90LCAxLCAwLCAwKTsKKworICAgICAgRHJhd1BvbHlnb24oMy4wKTsKKworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisKKworc3RhdGljIHZvaWQKK2lkbGUodm9pZCkKK3sKKyAgIEdMZmxvYXQgdCA9IDAuMDUgKiBnbHV0R2V0KEdMVVRfRUxBUFNFRF9USU1FKTsKKyAgIFlyb3QgPSB0OworICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZAora2V5KHVuc2lnbmVkIGNoYXIgaywgaW50IHgsIGludCB5KQoreworICAgKHZvaWQpIHg7CisgICAodm9pZCkgeTsKKyAgIHN3aXRjaCAoaykgeworICAgY2FzZSAnICc6CisgICBjYXNlICdhJzoKKyAgICAgIEFuaW0gPSAhQW5pbTsKKyAgICAgIGlmIChBbmltKQorICAgICAgICAgZ2x1dElkbGVGdW5jKGlkbGUpOworICAgICAgZWxzZQorICAgICAgICAgZ2x1dElkbGVGdW5jKE5VTEwpOworICAgICAgYnJlYWs7CisgICBjYXNlICd6JzoKKyAgICAgIEV5ZURpc3QgLT0gMC41OworICAgICAgaWYgKEV5ZURpc3QgPCAzLjApCisgICAgICAgICBFeWVEaXN0ID0gMy4wOworICAgICAgYnJlYWs7CisgICBjYXNlICdaJzoKKyAgICAgIEV5ZURpc3QgKz0gMC41OworICAgICAgaWYgKEV5ZURpc3QgPiA5MC4wKQorICAgICAgICAgRXllRGlzdCA9IDkwOworICAgICAgYnJlYWs7CisgICBjYXNlIDI3OgorICAgICAgZXhpdCgwKTsKKyAgIH0KKyAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7Cit9CisKKworc3RhdGljIHZvaWQKK3NwZWNpYWxrZXkoaW50IGtleSwgaW50IHgsIGludCB5KQoreworICAgR0xmbG9hdCBzdGVwID0gMi4wOworICAgKHZvaWQpIHg7CisgICAodm9pZCkgeTsKKyAgIHN3aXRjaCAoa2V5KSB7CisgICBjYXNlIEdMVVRfS0VZX1VQOgorICAgICAgWHJvdCArPSBzdGVwOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMVVRfS0VZX0RPV046CisgICAgICBYcm90IC09IHN0ZXA7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xVVF9LRVlfTEVGVDoKKyAgICAgIFlyb3QgLT0gc3RlcDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFVUX0tFWV9SSUdIVDoKKyAgICAgIFlyb3QgKz0gc3RlcDsKKyAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCisvKiBuZXcgd2luZG93IHNpemUgb3IgZXhwb3N1cmUgKi8KK3N0YXRpYyB2b2lkCitSZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgIEdMZmxvYXQgYXIgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7CisgICBnbFZpZXdwb3J0KDAsIDAsIChHTGludCl3aWR0aCwgKEdMaW50KWhlaWdodCk7CisgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xGcnVzdHVtKC0yLjAqYXIsIDIuMCphciwgLTIuMCwgMi4wLCA0LjAsIDEwMC4wKTsKKyAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKK30KKworCitzdGF0aWMgdm9pZAorSW5pdFRleHR1cmVzKHZvaWQpCit7CisgICBHTGVudW0gZmlsdGVyID0gR0xfTElORUFSOworICAgaW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIEdMaW50IGltZ1dpZHRoLCBpbWdIZWlnaHQ7CisgICAgICBHTGVudW0gaW1nRm9ybWF0OworICAgICAgR0x1Ynl0ZSAqaW1hZ2UgPSBOVUxMOworCisgICAgICBpbWFnZSA9IExvYWRSR0JJbWFnZShUZXhGaWxlc1tpXSwgJmltZ1dpZHRoLCAmaW1nSGVpZ2h0LCAmaW1nRm9ybWF0KTsKKyAgICAgIGlmICghaW1hZ2UpIHsKKyAgICAgICAgIHByaW50ZigiQ291bGRuJ3QgcmVhZCAlc1xuIiwgVGV4RmlsZXNbaV0pOworICAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0KKworICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgaSk7CisgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDQyICsgaSk7CisgICAgICBnbHVCdWlsZDJETWlwbWFwcyhHTF9URVhUVVJFXzJELCA0LCBpbWdXaWR0aCwgaW1nSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW1nRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCBpbWFnZSk7CisgICAgICBmcmVlKGltYWdlKTsKKyAgICAgIAorICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyKTsKKyAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIGZpbHRlcik7CisgICB9Cit9CisKKworc3RhdGljIEdMdWludAorQ3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyICp2ZXJ0UHJvZ0ZpbGUsIGNvbnN0IGNoYXIgKmZyYWdQcm9nRmlsZSwKKyAgICAgICAgICAgICAgc3RydWN0IHVuaWZvcm1faW5mbyAqdW5pZm9ybXMpCit7CisgICBHTHVpbnQgZnJhZ1NoYWRlciwgdmVydFNoYWRlciwgcHJvZ3JhbTsKKworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRQcm9nRmlsZSk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlckZpbGUoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnUHJvZ0ZpbGUpOworICAgYXNzZXJ0KHZlcnRTaGFkZXIpOworICAgcHJvZ3JhbSA9IExpbmtTaGFkZXJzKHZlcnRTaGFkZXIsIGZyYWdTaGFkZXIpOworCisgICBnbFVzZVByb2dyYW1fZnVuYyhwcm9ncmFtKTsKKworICAgSW5pdFVuaWZvcm1zKHByb2dyYW0sIHVuaWZvcm1zKTsKKworICAgcmV0dXJuIHByb2dyYW07Cit9CisKKworc3RhdGljIHZvaWQKK0luaXRQcm9ncmFtcyh2b2lkKQoreworICAgUHJvZ3JhbSA9IENyZWF0ZVByb2dyYW0oVmVydEZpbGUsIEZyYWdGaWxlLCBVbmlmb3Jtcyk7Cit9CisKKworc3RhdGljIHZvaWQKK0luaXRHTCh2b2lkKQoreworICAgY29uc3QgY2hhciAqdmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOworCisgICBpZiAodmVyc2lvblswXSAhPSAnMicgfHwgdmVyc2lvblsxXSAhPSAnLicpIHsKKyAgICAgIHByaW50ZigiV2FybmluZzogdGhpcyBwcm9ncmFtIGV4cGVjdHMgT3BlbkdMIDIuMFxuIik7CisgICAgICAvKmV4aXQoMSk7Ki8KKyAgIH0KKyAgIHByaW50ZigiR0xfUkVOREVSRVIgPSAlc1xuIiwoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworCisgICBHZXRFeHRlbnNpb25GdW5jcygpOworCisgICBJbml0VGV4dHVyZXMoKTsKKyAgIEluaXRQcm9ncmFtcygpOworCisgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKworICAgZ2xDbGVhckNvbG9yKC42LCAuNiwgLjksIDApOworICAgZ2xDb2xvcjNmKDEuMCwgMS4wLCAxLjApOworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworICAgZ2x1dEluaXRXaW5kb3dTaXplKDUwMCwgNDAwKTsKKyAgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0IgfCBHTFVUX0RFUFRIIHwgR0xVVF9ET1VCTEUpOworICAgZ2x1dENyZWF0ZVdpbmRvdyhEZW1vKTsKKyAgIGdsdXRSZXNoYXBlRnVuYyhSZXNoYXBlKTsKKyAgIGdsdXRLZXlib2FyZEZ1bmMoa2V5KTsKKyAgIGdsdXRTcGVjaWFsRnVuYyhzcGVjaWFsa2V5KTsKKyAgIGdsdXREaXNwbGF5RnVuYyhkcmF3KTsKKyAgIGlmIChBbmltKQorICAgICAgZ2x1dElkbGVGdW5jKGlkbGUpOworICAgSW5pdEdMKCk7CisgICBnbHV0TWFpbkxvb3AoKTsKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC9tdWx0aXRleC5mcmFnIGIvcHJvZ3MvZ2xzbC9tdWx0aXRleC5mcmFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjMzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy9nbHNsL211bHRpdGV4LmZyYWcKQEAgLTAsMCArMSwxNSBAQAorLy8gTXVsdGktdGV4dHVyZSBmcmFnbWVudCBzaGFkZXIKKy8vIEJyaWFuIFBhdWwKKworLy8gQ29tcG9zaXRlIHNlY29uZCB0ZXh0dXJlIG92ZXIgZmlyc3QuCisvLyBXZSdyZSBhc3N1bWluZyB0aGUgMm5kIHRleHR1cmUgaGFzIGEgbWVhbmluZ2Z1bCBhbHBoYSBjaGFubmVsLgorCit1bmlmb3JtIHNhbXBsZXIyRCB0ZXgxOwordW5pZm9ybSBzYW1wbGVyMkQgdGV4MjsKKwordm9pZCBtYWluKCkKK3sKKyAgIHZlYzQgdDEgPSB0ZXh0dXJlMkQodGV4MSwgZ2xfVGV4Q29vcmRbMF0ueHkpOworICAgdmVjNCB0MiA9IHRleHR1cmUyRCh0ZXgyLCBnbF9UZXhDb29yZFsxXS54eSk7CisgICBnbF9GcmFnQ29sb3IgPSBtaXgodDEsIHQyLCB0Mi53KTsKK30KZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvbXVsdGl0ZXgudmVydCBiL3Byb2dzL2dsc2wvbXVsdGl0ZXgudmVydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE4Y2ExCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MvZ2xzbC9tdWx0aXRleC52ZXJ0CkBAIC0wLDAgKzEsMTAgQEAKKy8vIE11bHRpLXRleHR1cmUgdmVydGV4IHNoYWRlcgorLy8gQnJpYW4gUGF1bAorCisKK3ZvaWQgbWFpbigpIAoreworICAgZ2xfVGV4Q29vcmRbMF0gPSBnbF9NdWx0aVRleENvb3JkMDsKKyAgIGdsX1RleENvb3JkWzFdID0gZ2xfTXVsdGlUZXhDb29yZDE7CisgICBnbF9Qb3NpdGlvbiA9IGZ0cmFuc2Zvcm0oKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvbm9pc2UuYyBiL3Byb2dzL2dsc2wvbm9pc2UuYwppbmRleCBhMjZhODA1Li45ZGE3MWFjIDEwMDY0NAotLS0gYS9wcm9ncy9nbHNsL25vaXNlLmMKKysrIGIvcHJvZ3MvZ2xzbC9ub2lzZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8R0wvZ2x1dC5oPgogI2luY2x1ZGUgPEdML2dsZXh0Lmg+CiAjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCiAKIAogc3RhdGljIGNvbnN0IGNoYXIgKlZlcnRTaGFkZXJUZXh0ID0KQEAgLTM0LDE4ICszNSwxMSBAQAogICAgIn1cbiI7CiAKIAotc3RydWN0IHVuaWZvcm1faW5mbyB7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgR0x1aW50IHNpemU7Ci0gICBHTGludCBsb2NhdGlvbjsKLSAgIEdMZmxvYXQgdmFsdWVbNF07Ci19OwotCiBzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBVbmlmb3Jtc1tdID0gewotICAgeyAiU2NhbGUiLCAgICAgICAgICA0LCAtMSwgeyAwLjUsIDAuNCwgMC4wLCAwfSB9LAotICAgeyAiQmlhcyIsICAgICAgICAgICA0LCAtMSwgeyAwLjUsIDAuMywgMC4wLCAwfSB9LAotICAgeyAiU2xpY2UiLCAgICAgICAgICAxLCAtMSwgeyAwLjUsIDAsIDAsIDB9IH0sCi0gICB7IE5VTEwsIDAsIDAsIHsgMCwgMCwgMCwgMCB9IH0KKyAgIHsgIlNjYWxlIiwgICAgNCwgR0xfRkxPQVQsIHsgMC41LCAwLjQsIDAuMCwgMH0sIC0xIH0sCisgICB7ICJCaWFzIiwgICAgIDQsIEdMX0ZMT0FULCB7IDAuNSwgMC4zLCAwLjAsIDB9LCAtMSB9LAorICAgeyAiU2xpY2UiLCAgICAxLCBHTF9GTE9BVCwgeyAwLjUsIDAsIDAsIDB9LCAtMSB9LAorICAgRU5EX09GX1VOSUZPUk1TCiB9OwogCiAvKiBwcm9ncmFtL3NoYWRlciBvYmplY3RzICovCkBAIC0xNzUsOTQgKzE2OSwyMCBAQAogCiAKIHN0YXRpYyB2b2lkCi1Mb2FkQW5kQ29tcGlsZVNoYWRlcihHTHVpbnQgc2hhZGVyLCBjb25zdCBjaGFyICp0ZXh0KQotewotICAgR0xpbnQgc3RhdDsKLQotICAgZ2xTaGFkZXJTb3VyY2VfZnVuYyhzaGFkZXIsIDEsIChjb25zdCBHTGNoYXIgKiopICZ0ZXh0LCBOVUxMKTsKLQotICAgZ2xDb21waWxlU2hhZGVyX2Z1bmMoc2hhZGVyKTsKLQotICAgZ2xHZXRTaGFkZXJpdl9mdW5jKHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0KTsKLSAgIGlmICghc3RhdCkgewotICAgICAgR0xjaGFyIGxvZ1sxMDAwXTsKLSAgICAgIEdMc2l6ZWkgbGVuOwotICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nX2Z1bmMoc2hhZGVyLCAxMDAwLCAmbGVuLCBsb2cpOwotICAgICAgZnByaW50ZihzdGRlcnIsICJicmljazogcHJvYmxlbSBjb21waWxpbmcgc2hhZGVyOiAlc1xuIiwgbG9nKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHByaW50ZigiU2hhZGVyIGNvbXBpbGVkIE9LXG4iKTsKLSAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotQ2hlY2tMaW5rKEdMdWludCBwcm9nKQotewotICAgR0xpbnQgc3RhdDsKLSAgIGdsR2V0UHJvZ3JhbWl2X2Z1bmMocHJvZywgR0xfTElOS19TVEFUVVMsICZzdGF0KTsKLSAgIGlmICghc3RhdCkgewotICAgICAgR0xjaGFyIGxvZ1sxMDAwXTsKLSAgICAgIEdMc2l6ZWkgbGVuOwotICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZ19mdW5jKHByb2csIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmtlciBlcnJvcjpcbiVzXG4iLCBsb2cpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmsgc3VjY2VzcyFcbiIpOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCiBJbml0KHZvaWQpCiB7Ci0gICBjb25zdCBjaGFyICp2ZXJzaW9uOwotICAgR0xpbnQgaTsKLQotICAgdmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwotICAgaWYgKHZlcnNpb25bMF0gIT0gJzInIHx8IHZlcnNpb25bMV0gIT0gJy4nKSB7Ci0gICAgICBwcmludGYoIldhcm5pbmc6IHRoaXMgcHJvZ3JhbSBleHBlY3RzIE9wZW5HTCAyLjBcbiIpOwotICAgICAgLypleGl0KDEpOyovCi0gICB9CisgICBpZiAoIVNoYWRlcnNTdXBwb3J0ZWQoKSkKKyAgICAgIGV4aXQoMSk7CiAKICAgIEdldEV4dGVuc2lvbkZ1bmNzKCk7CiAKLSAgIHZlcnRTaGFkZXIgPSBnbENyZWF0ZVNoYWRlcl9mdW5jKEdMX1ZFUlRFWF9TSEFERVIpOwotICAgTG9hZEFuZENvbXBpbGVTaGFkZXIodmVydFNoYWRlciwgVmVydFNoYWRlclRleHQpOworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KEdMX1ZFUlRFWF9TSEFERVIsIFZlcnRTaGFkZXJUZXh0KTsKKyAgIGZyYWdTaGFkZXIgPSBDb21waWxlU2hhZGVyVGV4dChHTF9GUkFHTUVOVF9TSEFERVIsIEZyYWdTaGFkZXJUZXh0KTsKKyAgIHByb2dyYW0gPSBMaW5rU2hhZGVycyh2ZXJ0U2hhZGVyLCBmcmFnU2hhZGVyKTsKIAotICAgZnJhZ1NoYWRlciA9IGdsQ3JlYXRlU2hhZGVyX2Z1bmMoR0xfRlJBR01FTlRfU0hBREVSKTsKLSAgIExvYWRBbmRDb21waWxlU2hhZGVyKGZyYWdTaGFkZXIsIEZyYWdTaGFkZXJUZXh0KTsKLQotICAgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbV9mdW5jKCk7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIGZyYWdTaGFkZXIpOwotICAgZ2xBdHRhY2hTaGFkZXJfZnVuYyhwcm9ncmFtLCB2ZXJ0U2hhZGVyKTsKLSAgIGdsTGlua1Byb2dyYW1fZnVuYyhwcm9ncmFtKTsKLSAgIENoZWNrTGluayhwcm9ncmFtKTsKICAgIGdsVXNlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwogCi0gICBmb3IgKGkgPSAwOyBVbmlmb3Jtc1tpXS5uYW1lOyBpKyspIHsKLSAgICAgIFVuaWZvcm1zW2ldLmxvY2F0aW9uCi0gICAgICAgICA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgVW5pZm9ybXNbaV0ubmFtZSk7Ci0gICAgICBwcmludGYoIlVuaWZvcm0gJXMgbG9jYXRpb246ICVkXG4iLCBVbmlmb3Jtc1tpXS5uYW1lLAotICAgICAgICAgICAgIFVuaWZvcm1zW2ldLmxvY2F0aW9uKTsKLSAgICAgIHN3aXRjaCAoVW5pZm9ybXNbaV0uc2l6ZSkgewotICAgICAgY2FzZSAxOgotICAgICAgICAgZ2xVbmlmb3JtMWZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICAgZ2xVbmlmb3JtMmZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOgotICAgICAgICAgZ2xVbmlmb3JtM2Z2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgICAgZ2xVbmlmb3JtNGZ2X2Z1bmMoVW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIFVuaWZvcm1zW2ldLnZhbHVlKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICB9CisgICBJbml0VW5pZm9ybXMocHJvZ3JhbSwgVW5pZm9ybXMpOwogCiAgICBhc3NlcnQoZ2xHZXRFcnJvcigpID09IDApOwogCmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL3BvaW50Y29vcmQuYyBiL3Byb2dzL2dsc2wvcG9pbnRjb29yZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDAwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy9nbHNsL3BvaW50Y29vcmQuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoqCisgKiBUZXN0IEdMU0wgMS4yMCBnbF9Qb2ludENvb3JkIGZyYWdtZW50IHByb2dyYW0gYXR0cmlidXRlLgorICogQnJpYW4gUGF1bAorICogMTEgQXVnIDIwMDcKKyAqLworCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxHTC9nbC5oPgorI2luY2x1ZGUgPEdML2dsdXQuaD4KKyNpbmNsdWRlIDxHTC9nbGV4dC5oPgorI2luY2x1ZGUgImV4dGZ1bmNzLmgiCisjaW5jbHVkZSAic2hhZGVydXRpbC5oIgorCisKK3N0YXRpYyBHTGludCBXaW5XaWR0aCA9IDMwMCwgV2luSGVpZ2h0ID0gMzAwOworc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9IE5VTEw7CitzdGF0aWMgY2hhciAqVmVydFByb2dGaWxlID0gTlVMTDsKK3N0YXRpYyBHTHVpbnQgZnJhZ1NoYWRlcjsKK3N0YXRpYyBHTHVpbnQgdmVydFNoYWRlcjsKK3N0YXRpYyBHTHVpbnQgcHJvZ3JhbTsKK3N0YXRpYyBHTGludCB3aW4gPSAwOworc3RhdGljIEdMaW50IHRleDA7CitzdGF0aWMgR0xlbnVtIEZpbHRlciA9IEdMX05FQVJFU1Q7CisKKworc3RhdGljIHZvaWQKK1JlZGlzcGxheSh2b2lkKQoreworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgLyogZHJhdyBvbmUgcG9pbnQvc3ByaXRlICovCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsUG9pbnRTaXplKDYwKTsKKyAgIGdsQmVnaW4oR0xfUE9JTlRTKTsKKyAgIGdsVmVydGV4MmYoV2luV2lkdGggLyAyLjBmLCBXaW5IZWlnaHQgLyAyLjBmKTsKKyAgIGdsRW5kKCk7CisgICBnbFBvcE1hdHJpeCgpOworCisgICBnbHV0U3dhcEJ1ZmZlcnMoKTsKK30KKworCitzdGF0aWMgdm9pZAorUmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsT3J0aG8oMCwgd2lkdGgsIDAsIGhlaWdodCwgLTEsIDEpOworCisgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgIFdpbldpZHRoID0gd2lkdGg7CisgICBXaW5IZWlnaHQgPSBoZWlnaHQ7Cit9CisKKworc3RhdGljIHZvaWQKK0NsZWFuVXAodm9pZCkKK3sKKyAgIGdsRGVsZXRlU2hhZGVyX2Z1bmMoZnJhZ1NoYWRlcik7CisgICBnbERlbGV0ZVNoYWRlcl9mdW5jKHZlcnRTaGFkZXIpOworICAgZ2xEZWxldGVQcm9ncmFtX2Z1bmMocHJvZ3JhbSk7CisgICBnbHV0RGVzdHJveVdpbmRvdyh3aW4pOworfQorCisKK3N0YXRpYyB2b2lkCitLZXkodW5zaWduZWQgY2hhciBrZXksIGludCB4LCBpbnQgeSkKK3sKKyAgKHZvaWQpIHg7CisgICh2b2lkKSB5OworCisgICBzd2l0Y2goa2V5KSB7CisgICBjYXNlIDI3OgorICAgICAgQ2xlYW5VcCgpOworICAgICAgZXhpdCgwKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitNYWtlVGV4dHVyZSh2b2lkKQoreworI2RlZmluZSBTWiAxNgorICAgR0x1Ynl0ZSBpbWFnZVtTWl1bU1pdWzRdOworICAgR0x1aW50IGksIGo7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBTWjsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgU1o7IGorKykgeworICAgICAgICAgaWYgKChpICsgaikgJiAxKSB7CisgICAgICAgICAgICBpbWFnZVtpXVtqXVswXSA9IDA7CisgICAgICAgICAgICBpbWFnZVtpXVtqXVsxXSA9IDA7CisgICAgICAgICAgICBpbWFnZVtpXVtqXVsyXSA9IDA7CisgICAgICAgICAgICBpbWFnZVtpXVtqXVszXSA9IDI1NTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW1hZ2VbaV1bal1bMF0gPSBqICogMjU1IC8gKFNaLTEpOworICAgICAgICAgICAgaW1hZ2VbaV1bal1bMV0gPSBpICogMjU1IC8gKFNaLTEpOworICAgICAgICAgICAgaW1hZ2VbaV1bal1bMl0gPSAwOworICAgICAgICAgICAgaW1hZ2VbaV1bal1bM10gPSAyNTU7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7IC8qIHVuaXQgMCAqLworICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCA0Mik7CisgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgU1osIFNaLCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGltYWdlKTsKKyAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEZpbHRlcik7CisgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBGaWx0ZXIpOworICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisjdW5kZWYgU1oKK30KKworCitzdGF0aWMgdm9pZAorSW5pdCh2b2lkKQoreworICAgc3RhdGljIGNvbnN0IGNoYXIgKmZyYWdTaGFkZXJUZXh0ID0KKyAgICAgICIjdmVyc2lvbiAxMjAgXG4iCisgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgdGV4MDsgXG4iCisgICAgICAidm9pZCBtYWluKCkgeyBcbiIKKyAgICAgICIgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4MCwgZ2xfUG9pbnRDb29yZC54eSwgMC4wKTsgXG4iCisgICAgICAifVxuIjsKKyAgIHN0YXRpYyBjb25zdCBjaGFyICp2ZXJ0U2hhZGVyVGV4dCA9CisgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCAqIGdsX1ZlcnRleDtcbiIKKyAgICAgICJ9XG4iOworCisgICBpZiAoIVNoYWRlcnNTdXBwb3J0ZWQoKSkKKyAgICAgIGV4aXQoMSk7CisKKyAgIEdldEV4dGVuc2lvbkZ1bmNzKCk7CisKKyAgIHZlcnRTaGFkZXIgPSBDb21waWxlU2hhZGVyVGV4dChHTF9WRVJURVhfU0hBREVSLCB2ZXJ0U2hhZGVyVGV4dCk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlclRleHQoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnU2hhZGVyVGV4dCk7CisgICBwcm9ncmFtID0gTGlua1NoYWRlcnModmVydFNoYWRlciwgZnJhZ1NoYWRlcik7CisKKyAgIGdsVXNlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOworCisgICB0ZXgwID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCAidGV4MCIpOworICAgcHJpbnRmKCJVbmlmb3JtczogdGV4MDogJWRcbiIsIHRleDApOworCisgICBnbFVuaWZvcm0xaV9mdW5jKHRleDAsIDApOyAvKiB0ZXggdW5pdCAwICovCisKKyAgIC8qYXNzZXJ0KGdsR2V0RXJyb3IoKSA9PSAwKTsqLworCisgICBnbENsZWFyQ29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZik7CisKKyAgIHByaW50ZigiR0xfUkVOREVSRVIgPSAlc1xuIiwoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworCisgICBhc3NlcnQoZ2xJc1Byb2dyYW1fZnVuYyhwcm9ncmFtKSk7CisgICBhc3NlcnQoZ2xJc1NoYWRlcl9mdW5jKGZyYWdTaGFkZXIpKTsKKyAgIGFzc2VydChnbElzU2hhZGVyX2Z1bmModmVydFNoYWRlcikpOworCisgICBNYWtlVGV4dHVyZSgpOworCisgICBnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEUpOworCisgICBnbENvbG9yM2YoMSwgMCwgMCk7Cit9CisKKworc3RhdGljIHZvaWQKK1BhcnNlT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgaW50IGk7CisgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZnMiKSA9PSAwKSB7CisgICAgICAgICBGcmFnUHJvZ0ZpbGUgPSBhcmd2W2krMV07CisgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi12cyIpID09IDApIHsKKyAgICAgICAgIFZlcnRQcm9nRmlsZSA9IGFyZ3ZbaSsxXTsKKyAgICAgIH0KKyAgIH0KK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKyAgIGdsdXRJbml0V2luZG93UG9zaXRpb24oIDAsIDApOworICAgZ2x1dEluaXRXaW5kb3dTaXplKFdpbldpZHRoLCBXaW5IZWlnaHQpOworICAgZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX1JHQiB8IEdMVVRfRE9VQkxFKTsKKyAgIHdpbiA9IGdsdXRDcmVhdGVXaW5kb3coYXJndlswXSk7CisgICBnbHV0UmVzaGFwZUZ1bmMoUmVzaGFwZSk7CisgICBnbHV0S2V5Ym9hcmRGdW5jKEtleSk7CisgICBnbHV0RGlzcGxheUZ1bmMoUmVkaXNwbGF5KTsKKyAgIFBhcnNlT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgIEluaXQoKTsKKyAgIGdsdXRNYWluTG9vcCgpOworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL3BvaW50cy5jIGIvcHJvZ3MvZ2xzbC9wb2ludHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJkYzRkCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MvZ2xzbC9wb2ludHMuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoqCisgKiBJbXBsZW1lbnQgc21vb3RoIChBQSkgcG9pbnRzIHdpdGggc2hhZGVycy4KKyAqIEEgc2ltcGxlIHZhcmlhdGlvbiBjb3VsZCBiZSB1c2VkIGZvciBzcHJpdGUgcG9pbnRzLgorICogQnJpYW4gUGF1bAorICogMjkgSnVseSAyMDA3CisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorI2luY2x1ZGUgPEdML2dsZXh0Lmg+CisjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCisKKworc3RhdGljIEdMdWludCBGcmFnU2hhZGVyOworc3RhdGljIEdMdWludCBWZXJ0U2hhZGVyOworc3RhdGljIEdMdWludCBQcm9ncmFtOworCitzdGF0aWMgR0xpbnQgV2luID0gMDsKK3N0YXRpYyBHTGludCBXaW5XaWR0aCA9IDUwMCwgV2luSGVpZ2h0ID0gMjAwOworc3RhdGljIEdMZmxvYXQgWHBvcyA9IDAuMGYsIFlwb3MgPSAwLjBmOworc3RhdGljIEdMaW50IHVWaWV3cG9ydEludjsKK3N0YXRpYyBHTGJvb2xlYW4gU21vb3RoID0gR0xfVFJVRSwgQmxlbmQgPSBHTF9UUlVFOworCisKKy8qKgorICogSXNzdWUgdmVydGljZXMgZm9yIGEgInNoYWRlciBwb2ludCIuCisgKiBUaGUgcG9zaXRpb24gaXMgZHVwbGljYXRlZCwgb25seSB0ZXhjb29yZHMgKG9yIG90aGVyIHZlcnRleCBhdHRyaWIpIGNoYW5nZS4KKyAqIFRoZSB2ZXJ0ZXggcHJvZ3JhbSB3aWxsIGNvbXB1dGUgdGhlICJyZWFsIiBxdWFkIGNvcm5lcnMuCisgKi8KK3N0YXRpYyB2b2lkCitQb2ludFZlcnRleDNmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCit7CisgICBnbFRleENvb3JkMmYoLTEsIC0xKTsKKyAgIGdsVmVydGV4M2YoeCwgeSwgeik7CisKKyAgIGdsVGV4Q29vcmQyZiggMSwgLTEpOworICAgZ2xWZXJ0ZXgzZih4LCB5LCB6KTsKKworICAgZ2xUZXhDb29yZDJmKCAxLCAgMSk7CisgICBnbFZlcnRleDNmKHgsIHksIHopOworCisgICBnbFRleENvb3JkMmYoLTEsICAxKTsKKyAgIGdsVmVydGV4M2YoeCwgeSwgeik7Cit9CisKKworc3RhdGljIHZvaWQKK0RyYXdQb2ludHMoR0xib29sZWFuIHNoYWRlclBvaW50cykKK3sKKyAgIGludCBpOworICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgR0xmbG9hdCB4ID0gaSAtIDQsIHkgPSAwLCB6ID0gMDsKKyAgICAgIC8qIG5vdGU6IGNhbid0IGNhbGwgZ2xQb2ludFNpemUgaW5zaWRlIEJlZ2luL0VuZCA6KCAqLworICAgICAgZ2xQb2ludFNpemUoIDIgKyBpICogNSApOworICAgICAgaWYgKHNoYWRlclBvaW50cykgeworICAgICAgICAgZ2xCZWdpbihHTF9RVUFEUyk7CisgICAgICAgICBQb2ludFZlcnRleDNmKHgsIHksIHopOworICAgICAgICAgZ2xFbmQoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgZ2xCZWdpbihHTF9QT0lOVFMpOworICAgICAgICAgZ2xWZXJ0ZXgzZih4LCB5LCB6KTsKKyAgICAgICAgIGdsRW5kKCk7CisgICAgICB9CisgICB9Cit9CisKKworLyoqCisgKiBUb3Agcm93IG9mIHBvaW50cyByZW5kZXJlZCBjb252ZXRpb25hbGx5LAorICogYm90dG9tIHJvdyByZW5kZXJlZCB3aXRoIHNoYWRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitSZWRpc3BsYXkodm9pZCkKK3sKKyAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisgICBpZiAoU21vb3RoKQorICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU01PT1RIKTsKKyAgIGVsc2UKKyAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TTU9PVEgpOworCisgICBpZiAoQmxlbmQpCisgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICBlbHNlCisgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsVHJhbnNsYXRlZihYcG9zLCBZcG9zLCAwKTsKKworICAgLyoKKyAgICAqIHJlZ3VsYXIgcG9pbnRzCisgICAgKi8KKyAgIGdsUHVzaE1hdHJpeCgpOworICAgZ2xUcmFuc2xhdGVmKDAsIDEuMiwgMCk7CisgICBnbFVzZVByb2dyYW1fZnVuYygwKTsKKyAgIERyYXdQb2ludHMoR0xfRkFMU0UpOworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgLyoKKyAgICAqIHNoYWRlciBwb2ludHMKKyAgICAqLworICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFRyYW5zbGF0ZWYoMCwgLTEuMiwgMCk7CisgICBnbFVzZVByb2dyYW1fZnVuYyhQcm9ncmFtKTsKKyAgIGlmICh1Vmlld3BvcnRJbnYgIT0gLTEpIHsKKyAgICAgIGdsVW5pZm9ybTJmX2Z1bmModVZpZXdwb3J0SW52LCAxLjAgLyBXaW5XaWR0aCwgMS4wIC8gV2luSGVpZ2h0KTsKKyAgIH0KKyAgIERyYXdQb2ludHMoR0xfVFJVRSk7CisgICBnbFBvcE1hdHJpeCgpOworCisgICBnbFBvcE1hdHJpeCgpOworCisgICBnbHV0U3dhcEJ1ZmZlcnMoKTsKK30KKworCitzdGF0aWMgdm9pZAorUmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBXaW5XaWR0aCA9IHdpZHRoOworICAgV2luSGVpZ2h0ID0gaGVpZ2h0OworICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbEZydXN0dW0oLTEuMCwgMS4wLCAtMS4wLCAxLjAsIDQuMCwgMzAuMCk7CisgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTIwLjBmKTsKK30KKworCitzdGF0aWMgdm9pZAorS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICh2b2lkKSB4OworICAodm9pZCkgeTsKKworICAgc3dpdGNoKGtleSkgeworICAgY2FzZSAnYic6CisgICAgICBCbGVuZCA9ICFCbGVuZDsKKyAgICAgIGJyZWFrOworICAgY2FzZSAncyc6CisgICAgICBTbW9vdGggPSAhU21vb3RoOworICAgICAgYnJlYWs7CisgICBjYXNlIDI3OgorICAgICAgZ2xEZWxldGVTaGFkZXJfZnVuYyhGcmFnU2hhZGVyKTsKKyAgICAgIGdsRGVsZXRlU2hhZGVyX2Z1bmMoVmVydFNoYWRlcik7CisgICAgICBnbERlbGV0ZVByb2dyYW1fZnVuYyhQcm9ncmFtKTsKKyAgICAgIGdsdXREZXN0cm95V2luZG93KFdpbik7CisgICAgICBleGl0KDApOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZAorU3BlY2lhbEtleShpbnQga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICBjb25zdCBHTGZsb2F0IHN0ZXAgPSAxLzEwMC4wOworICAgc3dpdGNoKGtleSkgeworICAgY2FzZSBHTFVUX0tFWV9VUDoKKyAgICAgIFlwb3MgKz0gc3RlcDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFVUX0tFWV9ET1dOOgorICAgICAgWXBvcyAtPSBzdGVwOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMVVRfS0VZX0xFRlQ6CisgICAgICBYcG9zIC09IHN0ZXA7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xVVF9LRVlfUklHSFQ6CisgICAgICBYcG9zICs9IHN0ZXA7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7Cit9CisKKworc3RhdGljIHZvaWQKK0luaXQodm9pZCkKK3sKKyAgIC8qIEZyYWdtZW50IHNoYWRlcjogY29tcHV0ZSBkaXN0YW5jZSBvZiBmcmFnbWVudCBmcm9tIGNlbnRlciBvZiBwb2ludAorICAgICogKHdlJ3JlIHVzaW5nIHRleGNvb3JkcyBidXQgYW5vdGhlciB2YXJ5aW5nIGNvdWxkIGJlIHVzZWQpLgorICAgICogICBpZiBkaXN0ID4gMSwgZGlzY2FyZCAoY292ZXJhZ2U9PTApCisgICAgKiAgIGlmIGRpc3QgPCBrLCBjb3ZlcmFnZSA9IDEKKyAgICAqICAgZWxzZSwgY292ZXJhZ2UgPSBmdW5jKGRpc3QpCisgICAgKiBOb3RlOiBsZW5ndGgoKSB1c2VzIHNxcnQoKSBhbmQgbWF5IGJlIGV4cGVuc2l2ZS4gIFRoZSBkaXN0YW5jZSBjb3VsZAorICAgICogYmUgc3F1YXJlZCBpbnN0ZWFkICh3aXRoIGFkanVzdG1lbnRzIHRvIHRoZSB0aHJlc2hvbGQgKGspIHRlc3QpCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBjaGFyICpmcmFnU2hhZGVyVGV4dCA9CisgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgIiAgIGZsb2F0IGNvdmVyOyBcbiIKKyAgICAgICIgICBmbG9hdCBrID0gMi4wIC8gZ2xfUG9pbnQuc2l6ZTsgXG4iCisgICAgICAiICAgZmxvYXQgZCA9IGxlbmd0aChnbF9UZXhDb29yZFswXS54eSk7IFxuIgorICAgICAgIiAgIGlmIChkID49IDEuMCkgXG4iCisgICAgICAiICAgICAgZGlzY2FyZDsgXG4iCisgICAgICAiICAgaWYgKGQgPCAxLjAgLSBrKSBcbiIKKyAgICAgICIgICAgICBjb3ZlciA9IDEuMDsgXG4iCisgICAgICAiICAgZWxzZSBcbiIKKyAgICAgICIgICAgICBjb3ZlciA9ICgxLjAgLSBkKSAqIDAuNSAqIGdsX1BvaW50LnNpemU7IFxuIgorICAgICAgIiAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBnbF9Db2xvci5yZ2I7IFxuIgorICAgICAgIiAgIGdsX0ZyYWdDb2xvci5hID0gY292ZXI7IFxuIgorICAgICAgIn1cbiI7CisgICAvKiBWZXJ0ZXggc2hhZGVyOiBjb21wdXRlIG5ldyB2ZXJ0ZXggcG9zaXRpb24gYmFzZWQgb24gaW5jb21pbmcgdmVydGV4IHBvcywKKyAgICAqIHRleGNvb3JkcywgcG9pbnQgc2l6ZSwgYW5kIGludmVyc2Ugdmlld3BvcnQgc2NhbGUgZmFjdG9yLgorICAgICogTm90ZTogc2hvdWxkIGNvbXB1dGUgcG9pbnQgc2l6ZSBhdHRlbnVhdGlvbiBoZXJlIHRvby4KKyAgICAqLworICAgc3RhdGljIGNvbnN0IGNoYXIgKnZlcnRTaGFkZXJUZXh0ID0KKyAgICAgICJ1bmlmb3JtIHZlYzIgdmlld3BvcnRJbnY7IFxuIgorICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICIgICB2ZWM0IHBvcyA9IGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggKiBnbF9WZXJ0ZXg7XG4iCisgICAgICAiICAgZ2xfUG9zaXRpb24ueHkgPSBwb3MueHkgKyBnbF9NdWx0aVRleENvb3JkMC54eSAqIHZpZXdwb3J0SW52IFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgKiBnbF9Qb2ludC5zaXplICogcG9zLnc7IFxuIgorICAgICAgIiAgIGdsX1Bvc2l0aW9uLnp3ID0gcG9zLnp3OyBcbiIKKyAgICAgICIgICBnbF9UZXhDb29yZFswXSA9IGdsX011bHRpVGV4Q29vcmQwOyBcbiIKKyAgICAgICIgICBnbF9Gcm9udENvbG9yID0gZ2xfQ29sb3I7IFxuIgorICAgICAgIn1cbiI7CisKKyAgIGlmICghU2hhZGVyc1N1cHBvcnRlZCgpKQorICAgICAgZXhpdCgxKTsKKworICAgR2V0RXh0ZW5zaW9uRnVuY3MoKTsKKworICAgVmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRTaGFkZXJUZXh0KTsKKyAgIEZyYWdTaGFkZXIgPSBDb21waWxlU2hhZGVyVGV4dChHTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdTaGFkZXJUZXh0KTsKKyAgIFByb2dyYW0gPSBMaW5rU2hhZGVycyhWZXJ0U2hhZGVyLCBGcmFnU2hhZGVyKTsKKworICAgZ2xVc2VQcm9ncmFtX2Z1bmMoUHJvZ3JhbSk7CisKKyAgIHVWaWV3cG9ydEludiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMoUHJvZ3JhbSwgInZpZXdwb3J0SW52Iik7CisKKyAgIGdsVXNlUHJvZ3JhbV9mdW5jKDApOworCisgICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworICAgZ2x1dEluaXRXaW5kb3dTaXplKFdpbldpZHRoLCBXaW5IZWlnaHQpOworICAgZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX1JHQiB8IEdMVVRfRE9VQkxFIHwgR0xVVF9ERVBUSCk7CisgICBXaW4gPSBnbHV0Q3JlYXRlV2luZG93KGFyZ3ZbMF0pOworICAgZ2x1dFJlc2hhcGVGdW5jKFJlc2hhcGUpOworICAgZ2x1dEtleWJvYXJkRnVuYyhLZXkpOworICAgZ2x1dFNwZWNpYWxGdW5jKFNwZWNpYWxLZXkpOworICAgZ2x1dERpc3BsYXlGdW5jKFJlZGlzcGxheSk7CisgICBJbml0KCk7CisgICBnbHV0TWFpbkxvb3AoKTsKKyAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvcmVmbGVjdC52ZXJ0LnR4dCBiL3Byb2dzL2dsc2wvcmVmbGVjdC52ZXJ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcm9ncy9nbHNsL3JlZmxlY3QudmVydC50eHQKcmVuYW1lIHRvIHByb2dzL2dsc2wvcmVmbGVjdC52ZXJ0CmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL3NoYWRvd3RleC5mcmFnLnR4dCBiL3Byb2dzL2dsc2wvc2hhZG93dGV4LmZyYWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByb2dzL2dsc2wvc2hhZG93dGV4LmZyYWcudHh0CnJlbmFtZSB0byBwcm9ncy9nbHNsL3NoYWRvd3RleC5mcmFnCmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL3NpbXBsZS52ZXJ0LnR4dCBiL3Byb2dzL2dsc2wvc2ltcGxlLnZlcnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByb2dzL2dsc2wvc2ltcGxlLnZlcnQudHh0CnJlbmFtZSB0byBwcm9ncy9nbHNsL3NpbXBsZS52ZXJ0CmRpZmYgLS1naXQgYS9wcm9ncy9nbHNsL3RleGRlbW8xLmMgYi9wcm9ncy9nbHNsL3RleGRlbW8xLmMKaW5kZXggM2NlYWUxNC4uOTZkZGNhMSAxMDA2NDQKLS0tIGEvcHJvZ3MvZ2xzbC90ZXhkZW1vMS5jCisrKyBiL3Byb2dzL2dsc2wvdGV4ZGVtbzEuYwpAQCAtMzEsMTQgKzMxLDE1IEBACiAjaW5jbHVkZSAiR0wvZ2x1dC5oIgogI2luY2x1ZGUgInJlYWR0ZXguaCIKICNpbmNsdWRlICJleHRmdW5jcy5oIgorI2luY2x1ZGUgInNoYWRlcnV0aWwuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgKkRlbW8gPSAidGV4ZGVtbzEiOwogCi1zdGF0aWMgY29uc3QgY2hhciAqUmVmbGVjdFZlcnRGaWxlID0gInJlZmxlY3QudmVydC50eHQiOwotc3RhdGljIGNvbnN0IGNoYXIgKkN1YmVGcmFnRmlsZSA9ICJjdWJlbWFwLmZyYWcudHh0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpSZWZsZWN0VmVydEZpbGUgPSAicmVmbGVjdC52ZXJ0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpDdWJlRnJhZ0ZpbGUgPSAiY3ViZW1hcC5mcmFnIjsKIAotc3RhdGljIGNvbnN0IGNoYXIgKlNpbXBsZVZlcnRGaWxlID0gInNpbXBsZS52ZXJ0LnR4dCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqU2ltcGxlVGV4RnJhZ0ZpbGUgPSAic2hhZG93dGV4LmZyYWcudHh0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpTaW1wbGVWZXJ0RmlsZSA9ICJzaW1wbGUudmVydCI7CitzdGF0aWMgY29uc3QgY2hhciAqU2ltcGxlVGV4RnJhZ0ZpbGUgPSAic2hhZG93dGV4LmZyYWciOwogCiBzdGF0aWMgY29uc3QgY2hhciAqR3JvdW5kSW1hZ2UgPSAiLi4vaW1hZ2VzL3RpbGUucmdiIjsKIApAQCAtNTEsMzkgKzUyLDIwIEBACiBzdGF0aWMgaW50IHdpbiA9IDA7CiAKIAotc3RydWN0IHVuaWZvcm1faW5mbyB7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgR0x1aW50IHNpemU7Ci0gICBHTGludCBsb2NhdGlvbjsKLSAgIEdMZW51bSB0eXBlOyAgLyoqPCBHTF9GTE9BVCBvciBHTF9JTlQgKi8KLSAgIEdMZmxvYXQgdmFsdWVbNF07Ci19OwotCiBzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBSZWZsZWN0VW5pZm9ybXNbXSA9IHsKLSAgIHsgImN1YmVUZXgiLCAgMSwgLTEsIEdMX0lOVCwgeyAwLCAwLCAwLCAwIH0gfSwKLSAgIHsgImxpZ2h0UG9zIiwgMywgLTEsIEdMX0ZMT0FULCB7IDEwLCAxMCwgMjAsIDAgfSB9LAotICAgeyBOVUxMLCAwLCAwLCAwLCB7IDAsIDAsIDAsIDAgfSB9CisgICB7ICJjdWJlVGV4IiwgIDEsIEdMX0lOVCwgeyAwLCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJsaWdodFBvcyIsIDMsIEdMX0ZMT0FULCB7IDEwLCAxMCwgMjAsIDAgfSwgLTEgfSwKKyAgIEVORF9PRl9VTklGT1JNUwogfTsKIAogc3RhdGljIHN0cnVjdCB1bmlmb3JtX2luZm8gU2ltcGxlVW5pZm9ybXNbXSA9IHsKLSAgIHsgInRleDJkIiwgICAgMSwgLTEsIEdMX0lOVCwgICB7IDEsIDAsIDAsIDAgfSB9LAotICAgeyAibGlnaHRQb3MiLCAzLCAtMSwgR0xfRkxPQVQsIHsgMTAsIDEwLCAyMCwgMCB9IH0sCi0gICB7IE5VTEwsIDAsIDAsIDAsIHsgMCwgMCwgMCwgMCB9IH0KKyAgIHsgInRleDJkIiwgICAgMSwgR0xfSU5ULCAgIHsgMSwgMCwgMCwgMCB9LCAtMSB9LAorICAgeyAibGlnaHRQb3MiLCAzLCBHTF9GTE9BVCwgeyAxMCwgMTAsIDIwLCAwIH0sIC0xIH0sCisgICBFTkRfT0ZfVU5JRk9STVMKIH07CiAKIAogc3RhdGljIHZvaWQKLUNoZWNrRXJyb3IoaW50IGxpbmUpCi17Ci0gICBHTGVudW0gZXJyID0gZ2xHZXRFcnJvcigpOwotICAgaWYgKGVycikgewotICAgICAgcHJpbnRmKCJHTCBFcnJvciAlcyAoMHgleCkgYXQgbGluZSAlZFxuIiwKLSAgICAgICAgICAgICBnbHVFcnJvclN0cmluZyhlcnIpLCAoaW50KSBlcnIsIGxpbmUpOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCiBEcmF3R3JvdW5kKEdMZmxvYXQgc2l6ZSkKIHsKICAgIGdsUHVzaE1hdHJpeCgpOwpAQCAtMzg4LDEzMiArMzcwLDE5IEBACiB9CiAKIAotc3RhdGljIHZvaWQKLUxvYWRBbmRDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0gICBHTGludCBzdGF0OwotCi0gICBnbFNoYWRlclNvdXJjZV9mdW5jKHNoYWRlciwgMSwgKGNvbnN0IEdMY2hhciAqKikgJnRleHQsIE5VTEwpOwotCi0gICBnbENvbXBpbGVTaGFkZXJfZnVuYyhzaGFkZXIpOwotCi0gICBnbEdldFNoYWRlcml2X2Z1bmMoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFNoYWRlckluZm9Mb2dfZnVuYyhzaGFkZXIsIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBwcm9ibGVtIGNvbXBpbGluZyBzaGFkZXI6ICVzXG4iLCBEZW1vLCBsb2cpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZWQgT0tcbiIpOwotICAgfQotfQotCi0KLS8qKgotICogUmVhZCBhIHNoYWRlciBmcm9tIGEgZmlsZS4KLSAqLwotc3RhdGljIHZvaWQKLVJlYWRTaGFkZXIoR0x1aW50IHNoYWRlciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICBjb25zdCBpbnQgbWF4ID0gMTAwKjEwMDA7Ci0gICBpbnQgbjsKLSAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKG1heCk7Ci0gICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICBpZiAoIWYpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IFVuYWJsZSB0byBvcGVuIHNoYWRlciBmaWxlICVzXG4iLCBEZW1vLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBuID0gZnJlYWQoYnVmZmVyLCAxLCBtYXgsIGYpOwotICAgcHJpbnRmKCIlczogcmVhZCAlZCBieXRlcyBmcm9tIHNoYWRlciBmaWxlICVzXG4iLCBEZW1vLCBuLCBmaWxlbmFtZSk7Ci0gICBpZiAobiA+IDApIHsKLSAgICAgIGJ1ZmZlcltuXSA9IDA7Ci0gICAgICBMb2FkQW5kQ29tcGlsZVNoYWRlcihzaGFkZXIsIGJ1ZmZlcik7Ci0gICB9Ci0KLSAgIGZjbG9zZShmKTsKLSAgIGZyZWUoYnVmZmVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotQ2hlY2tMaW5rKEdMdWludCBwcm9nKQotewotICAgR0xpbnQgc3RhdDsKLSAgIGdsR2V0UHJvZ3JhbWl2X2Z1bmMocHJvZywgR0xfTElOS19TVEFUVVMsICZzdGF0KTsKLSAgIGlmICghc3RhdCkgewotICAgICAgR0xjaGFyIGxvZ1sxMDAwXTsKLSAgICAgIEdMc2l6ZWkgbGVuOwotICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZ19mdW5jKHByb2csIDEwMDAsICZsZW4sIGxvZyk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmtlciBlcnJvcjpcbiVzXG4iLCBsb2cpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpbmsgc3VjY2VzcyFcbiIpOwotICAgfQotfQotCi0KIHN0YXRpYyBHTHVpbnQKIENyZWF0ZVByb2dyYW0oY29uc3QgY2hhciAqdmVydFByb2dGaWxlLCBjb25zdCBjaGFyICpmcmFnUHJvZ0ZpbGUsCiAgICAgICAgICAgICAgIHN0cnVjdCB1bmlmb3JtX2luZm8gKnVuaWZvcm1zKQogewotICAgR0x1aW50IGZyYWdTaGFkZXIgPSAwLCB2ZXJ0U2hhZGVyID0gMCwgcHJvZ3JhbSA9IDA7Ci0gICBHTGludCBpOworICAgR0x1aW50IGZyYWdTaGFkZXIsIHZlcnRTaGFkZXIsIHByb2dyYW07CiAKLSAgIHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW1fZnVuYygpOwotICAgaWYgKHZlcnRQcm9nRmlsZSkgewotICAgICAgdmVydFNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyX2Z1bmMoR0xfVkVSVEVYX1NIQURFUik7Ci0gICAgICBSZWFkU2hhZGVyKHZlcnRTaGFkZXIsIHZlcnRQcm9nRmlsZSk7Ci0gICAgICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIHZlcnRTaGFkZXIpOwotICAgfQotCi0gICBpZiAoZnJhZ1Byb2dGaWxlKSB7Ci0gICAgICBmcmFnU2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9GUkFHTUVOVF9TSEFERVIpOwotICAgICAgUmVhZFNoYWRlcihmcmFnU2hhZGVyLCBmcmFnUHJvZ0ZpbGUpOwotICAgICAgZ2xBdHRhY2hTaGFkZXJfZnVuYyhwcm9ncmFtLCBmcmFnU2hhZGVyKTsKLSAgIH0KLQotICAgZ2xMaW5rUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwotICAgQ2hlY2tMaW5rKHByb2dyYW0pOworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRQcm9nRmlsZSk7CisgICBmcmFnU2hhZGVyID0gQ29tcGlsZVNoYWRlckZpbGUoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnUHJvZ0ZpbGUpOworICAgcHJvZ3JhbSA9IExpbmtTaGFkZXJzKHZlcnRTaGFkZXIsIGZyYWdTaGFkZXIpOwogCiAgICBnbFVzZVByb2dyYW1fZnVuYyhwcm9ncmFtKTsKIAotICAgYXNzZXJ0KGdsSXNQcm9ncmFtX2Z1bmMocHJvZ3JhbSkpOwotICAgYXNzZXJ0KGdsSXNTaGFkZXJfZnVuYyhmcmFnU2hhZGVyKSk7Ci0gICBhc3NlcnQoZ2xJc1NoYWRlcl9mdW5jKHZlcnRTaGFkZXIpKTsKLQotICAgQ2hlY2tFcnJvcihfX0xJTkVfXyk7Ci0gICBmb3IgKGkgPSAwOyB1bmlmb3Jtc1tpXS5uYW1lOyBpKyspIHsKLSAgICAgIHVuaWZvcm1zW2ldLmxvY2F0aW9uCi0gICAgICAgICA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgdW5pZm9ybXNbaV0ubmFtZSk7Ci0gICAgICBwcmludGYoIlVuaWZvcm0gJXMgbG9jYXRpb246ICVkXG4iLCB1bmlmb3Jtc1tpXS5uYW1lLAotICAgICAgICAgICAgIHVuaWZvcm1zW2ldLmxvY2F0aW9uKTsKLQotICAgICAgc3dpdGNoICh1bmlmb3Jtc1tpXS5zaXplKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBpZiAodW5pZm9ybXNbaV0udHlwZSA9PSBHTF9JTlQpCi0gICAgICAgICAgICBnbFVuaWZvcm0xaV9mdW5jKHVuaWZvcm1zW2ldLmxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0xpbnQpIHVuaWZvcm1zW2ldLnZhbHVlWzBdKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdsVW5pZm9ybTFmdl9mdW5jKHVuaWZvcm1zW2ldLmxvY2F0aW9uLCAxLCB1bmlmb3Jtc1tpXS52YWx1ZSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIGdsVW5pZm9ybTJmdl9mdW5jKHVuaWZvcm1zW2ldLmxvY2F0aW9uLCAxLCB1bmlmb3Jtc1tpXS52YWx1ZSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIGdsVW5pZm9ybTNmdl9mdW5jKHVuaWZvcm1zW2ldLmxvY2F0aW9uLCAxLCB1bmlmb3Jtc1tpXS52YWx1ZSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgIGdsVW5pZm9ybTRmdl9mdW5jKHVuaWZvcm1zW2ldLmxvY2F0aW9uLCAxLCB1bmlmb3Jtc1tpXS52YWx1ZSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgfQotCi0gICBDaGVja0Vycm9yKF9fTElORV9fKTsKKyAgIEluaXRVbmlmb3Jtcyhwcm9ncmFtLCB1bmlmb3Jtcyk7CiAKICAgIHJldHVybiBwcm9ncmFtOwogfQpkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC90b3liYWxsLmMgYi9wcm9ncy9nbHNsL3RveWJhbGwuYwppbmRleCBjZWY1MmMwLi4yZGFhZWRkIDEwMDY0NAotLS0gYS9wcm9ncy9nbHNsL3RveWJhbGwuYworKysgYi9wcm9ncy9nbHNsL3RveWJhbGwuYwpAQCAtMTMsMTAgKzEzLDExIEBACiAjaW5jbHVkZSA8R0wvZ2x1dC5oPgogI2luY2x1ZGUgPEdML2dsZXh0Lmg+CiAjaW5jbHVkZSAiZXh0ZnVuY3MuaCIKKyNpbmNsdWRlICJzaGFkZXJ1dGlsLmgiCiAKIAotc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9ICJDSDExLXRveWJhbGwuZnJhZy50eHQiOwotc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9ICJDSDExLXRveWJhbGwudmVydC50eHQiOworc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9ICJDSDExLXRveWJhbGwuZnJhZyI7CitzdGF0aWMgY2hhciAqVmVydFByb2dGaWxlID0gIkNIMTEtdG95YmFsbC52ZXJ0IjsKIAogLyogcHJvZ3JhbS9zaGFkZXIgb2JqZWN0cyAqLwogc3RhdGljIEdMdWludCBmcmFnU2hhZGVyOwpAQCAtMjQsMzAgKzI1LDIzIEBACiBzdGF0aWMgR0x1aW50IHByb2dyYW07CiAKIAotc3RydWN0IHVuaWZvcm1faW5mbyB7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgR0x1aW50IHNpemU7Ci0gICBHTGludCBsb2NhdGlvbjsKLSAgIEdMZmxvYXQgdmFsdWVbNF07Ci19OwotCiBzdGF0aWMgc3RydWN0IHVuaWZvcm1faW5mbyBVbmlmb3Jtc1tdID0gewotICAgeyAiTGlnaHREaXIiLCAgICAgICA0LCAtMSwgeyAwLjU3NzM3LCAwLjU3NzM1LCAwLjU3NzM1LCAwLjAgfSB9LAotICAgeyAiSFZlY3RvciIsICAgICAgICA0LCAtMSwgeyAwLjMyNTA2LCAwLjMyNTA2LCAwLjg4ODA4LCAwLjAgfSB9LAotICAgeyAiQmFsbENlbnRlciIsICAgICA0LCAtMSwgeyAwLjAsIDAuMCwgMC4wLCAxLjAgfSB9LAotICAgeyAiU3BlY3VsYXJDb2xvciIsICA0LCAtMSwgeyAwLjQsIDAuNCwgMC40LCA2MC4wIH0gfSwKLSAgIHsgIlJlZCIsICAgICAgICAgICAgNCwgLTEsIHsgMC42LCAwLjAsIDAuMCwgMS4wIH0gfSwKLSAgIHsgIkJsdWUiLCAgICAgICAgICAgNCwgLTEsIHsgMC4wLCAwLjMsIDAuNiwgMS4wIH0gfSwKLSAgIHsgIlllbGxvdyIsICAgICAgICAgNCwgLTEsIHsgMC42LCAwLjUsIDAuMCwgMS4wIH0gfSwKLSAgIHsgIkhhbGZTcGFjZTAiLCAgICAgNCwgLTEsIHsgMS4wLCAwLjAsIDAuMCwgMC4yIH0gfSwKLSAgIHsgIkhhbGZTcGFjZTEiLCAgICAgNCwgLTEsIHsgMC4zMDkwMTY5OTQsIDAuOTUxMDU2NTE2LCAwLjAsIDAuMiB9IH0sCi0gICB7ICJIYWxmU3BhY2UyIiwgICAgIDQsIC0xLCB7IC0wLjgwOTAxNjk5NCwgMC41ODc3ODUyNTIsIDAuMCwgMC4yIH0gfSwKLSAgIHsgIkhhbGZTcGFjZTMiLCAgICAgNCwgLTEsIHsgLTAuODA5MDE2OTk0LCAtMC41ODc3ODUyNTIsIDAuMCwgMC4yIH0gfSwKLSAgIHsgIkhhbGZTcGFjZTQiLCAgICAgNCwgLTEsIHsgMC4zMDkxMTY5OTQsIC0wLjk1MTA1NjUxNiwgMC4wLCAwLjIgfSB9LAotICAgeyAiSW5Pck91dEluaXQiLCAgICAxLCAtMSwgeyAtMy4wLCAwLCAwLCAwIH0gfSwKLSAgIHsgIlN0cmlwZVdpZHRoIiwgICAgMSwgLTEsIHsgIDAuMywgMCwgMCwgMCB9IH0sCi0gICB7ICJGV2lkdGgiLCAgICAgICAgIDEsIC0xLCB7IDAuMDA1LCAwLCAwLCAwIH0gfSwKLSAgIHsgTlVMTCwgMCwgMCwgeyAwLCAwLCAwLCAwIH0gfQorICAgeyAiTGlnaHREaXIiLCAgICAgICA0LCBHTF9GTE9BVCwgeyAwLjU3NzM3LCAwLjU3NzM1LCAwLjU3NzM1LCAwLjAgfSwgLTEgfSwKKyAgIHsgIkhWZWN0b3IiLCAgICAgICAgNCwgR0xfRkxPQVQsIHsgMC4zMjUwNiwgMC4zMjUwNiwgMC44ODgwOCwgMC4wIH0sIC0xIH0sCisgICB7ICJCYWxsQ2VudGVyIiwgICAgIDQsIEdMX0ZMT0FULCB7IDAuMCwgMC4wLCAwLjAsIDEuMCB9LCAtMSB9LAorICAgeyAiU3BlY3VsYXJDb2xvciIsICA0LCBHTF9GTE9BVCwgeyAwLjQsIDAuNCwgMC40LCA2MC4wIH0sIC0xIH0sCisgICB7ICJSZWQiLCAgICAgICAgIDQsIEdMX0ZMT0FULCB7IDAuNiwgMC4wLCAwLjAsIDEuMCB9LCAtMSB9LAorICAgeyAiQmx1ZSIsICAgICAgICA0LCBHTF9GTE9BVCwgeyAwLjAsIDAuMywgMC42LCAxLjAgfSwgLTEgfSwKKyAgIHsgIlllbGxvdyIsICAgICAgNCwgR0xfRkxPQVQsIHsgMC42LCAwLjUsIDAuMCwgMS4wIH0sIC0xIH0sCisgICB7ICJIYWxmU3BhY2UwIiwgIDQsIEdMX0ZMT0FULCB7IDEuMCwgMC4wLCAwLjAsIDAuMiB9LCAtMSB9LAorICAgeyAiSGFsZlNwYWNlMSIsICA0LCBHTF9GTE9BVCwgeyAwLjMwOTAxNjk5NCwgMC45NTEwNTY1MTYsIDAuMCwgMC4yIH0sIC0xIH0sCisgICB7ICJIYWxmU3BhY2UyIiwgIDQsIEdMX0ZMT0FULCB7IC0wLjgwOTAxNjk5NCwgMC41ODc3ODUyNTIsIDAuMCwgMC4yIH0sIC0xIH0sCisgICB7ICJIYWxmU3BhY2UzIiwgIDQsIEdMX0ZMT0FULCB7IC0wLjgwOTAxNjk5NCwgLTAuNTg3Nzg1MjUyLCAwLjAsIDAuMiB9LCAtMSB9LAorICAgeyAiSGFsZlNwYWNlNCIsICA0LCBHTF9GTE9BVCwgeyAwLjMwOTExNjk5NCwgLTAuOTUxMDU2NTE2LCAwLjAsIDAuMiB9LCAtMSB9LAorICAgeyAiSW5Pck91dEluaXQiLCAxLCBHTF9GTE9BVCwgeyAtMy4wLCAwLCAwLCAwIH0sIC0xIH0sCisgICB7ICJTdHJpcGVXaWR0aCIsIDEsIEdMX0ZMT0FULCB7ICAwLjMsIDAsIDAsIDAgfSwgLTEgfSwKKyAgIHsgIkZXaWR0aCIsICAgICAgMSwgR0xfRkxPQVQsIHsgMC4wMDUsIDAsIDAsIDAgfSwgLTEgfSwKKyAgIEVORF9PRl9VTklGT1JNUwogfTsKIAogc3RhdGljIEdMaW50IHdpbiA9IDA7CkBAIC0xNzIsMTI3ICsxNjYsMjAgQEAKIAogCiBzdGF0aWMgdm9pZAotTG9hZEFuZENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlciwgY29uc3QgY2hhciAqdGV4dCkKLXsKLSAgIEdMaW50IHN0YXQ7Ci0KLSAgIGdsU2hhZGVyU291cmNlX2Z1bmMoc2hhZGVyLCAxLCAoY29uc3QgR0xjaGFyICoqKSAmdGV4dCwgTlVMTCk7Ci0KLSAgIGdsQ29tcGlsZVNoYWRlcl9mdW5jKHNoYWRlcik7Ci0KLSAgIGdsR2V0U2hhZGVyaXZfZnVuYyhzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdCk7Ci0gICBpZiAoIXN0YXQpIHsKLSAgICAgIEdMY2hhciBsb2dbMTAwMF07Ci0gICAgICBHTHNpemVpIGxlbjsKLSAgICAgIGdsR2V0U2hhZGVySW5mb0xvZ19mdW5jKHNoYWRlciwgMTAwMCwgJmxlbiwgbG9nKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiYnJpY2s6IHByb2JsZW0gY29tcGlsaW5nIHNoYWRlcjogJXNcbiIsIGxvZyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBwcmludGYoIlNoYWRlciBjb21waWxlZCBPS1xuIik7Ci0gICB9Ci19Ci0KLQotLyoqCi0gKiBSZWFkIGEgc2hhZGVyIGZyb20gYSBmaWxlLgotICovCi1zdGF0aWMgdm9pZAotUmVhZFNoYWRlcihHTHVpbnQgc2hhZGVyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgIGNvbnN0IGludCBtYXggPSAxMDAqMTAwMDsKLSAgIGludCBuOwotICAgY2hhciAqYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MobWF4KTsKLSAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgIGlmICghZikgewotICAgICAgZnByaW50ZihzdGRlcnIsICJicmljazogVW5hYmxlIHRvIG9wZW4gc2hhZGVyIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIG4gPSBmcmVhZChidWZmZXIsIDEsIG1heCwgZik7Ci0gICBwcmludGYoImJyaWNrOiByZWFkICVkIGJ5dGVzIGZyb20gc2hhZGVyIGZpbGUgJXNcbiIsIG4sIGZpbGVuYW1lKTsKLSAgIGlmIChuID4gMCkgewotICAgICAgYnVmZmVyW25dID0gMDsKLSAgICAgIExvYWRBbmRDb21waWxlU2hhZGVyKHNoYWRlciwgYnVmZmVyKTsKLSAgIH0KLQotICAgZmNsb3NlKGYpOwotICAgZnJlZShidWZmZXIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1DaGVja0xpbmsoR0x1aW50IHByb2cpCi17Ci0gICBHTGludCBzdGF0OwotICAgZ2xHZXRQcm9ncmFtaXZfZnVuYyhwcm9nLCBHTF9MSU5LX1NUQVRVUywgJnN0YXQpOwotICAgaWYgKCFzdGF0KSB7Ci0gICAgICBHTGNoYXIgbG9nWzEwMDBdOwotICAgICAgR0xzaXplaSBsZW47Ci0gICAgICBnbEdldFByb2dyYW1JbmZvTG9nX2Z1bmMocHJvZywgMTAwMCwgJmxlbiwgbG9nKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTGlua2VyIGVycm9yOlxuJXNcbiIsIGxvZyk7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTGluayBzdWNjZXNzIVxuIik7Ci0gICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKIEluaXQodm9pZCkKIHsKLSAgIGNvbnN0IGNoYXIgKnZlcnNpb247Ci0gICBHTGludCBpOwotCi0gICB2ZXJzaW9uID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7Ci0gICBpZiAodmVyc2lvblswXSAhPSAnMicgfHwgdmVyc2lvblsxXSAhPSAnLicpIHsKLSAgICAgIHByaW50ZigiV2FybmluZzogdGhpcyBwcm9ncmFtIGV4cGVjdHMgT3BlbkdMIDIuMFxuIik7Ci0gICAgICAvKmV4aXQoMSk7Ki8KLSAgIH0KLSAgIHByaW50ZigiR0xfUkVOREVSRVIgPSAlc1xuIiwoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworICAgaWYgKCFTaGFkZXJzU3VwcG9ydGVkKCkpCisgICAgICBleGl0KDEpOwogCiAgICBHZXRFeHRlbnNpb25GdW5jcygpOwogCi0gICB2ZXJ0U2hhZGVyID0gZ2xDcmVhdGVTaGFkZXJfZnVuYyhHTF9WRVJURVhfU0hBREVSKTsKLSAgIFJlYWRTaGFkZXIodmVydFNoYWRlciwgVmVydFByb2dGaWxlKTsKKyAgIHZlcnRTaGFkZXIgPSBDb21waWxlU2hhZGVyRmlsZShHTF9WRVJURVhfU0hBREVSLCBWZXJ0UHJvZ0ZpbGUpOworICAgZnJhZ1NoYWRlciA9IENvbXBpbGVTaGFkZXJGaWxlKEdMX0ZSQUdNRU5UX1NIQURFUiwgRnJhZ1Byb2dGaWxlKTsKKyAgIHByb2dyYW0gPSBMaW5rU2hhZGVycyh2ZXJ0U2hhZGVyLCBmcmFnU2hhZGVyKTsKIAotICAgZnJhZ1NoYWRlciA9IGdsQ3JlYXRlU2hhZGVyX2Z1bmMoR0xfRlJBR01FTlRfU0hBREVSKTsKLSAgIFJlYWRTaGFkZXIoZnJhZ1NoYWRlciwgRnJhZ1Byb2dGaWxlKTsKLQotICAgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbV9mdW5jKCk7Ci0gICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIGZyYWdTaGFkZXIpOwotICAgZ2xBdHRhY2hTaGFkZXJfZnVuYyhwcm9ncmFtLCB2ZXJ0U2hhZGVyKTsKLSAgIGdsTGlua1Byb2dyYW1fZnVuYyhwcm9ncmFtKTsKLSAgIENoZWNrTGluayhwcm9ncmFtKTsKICAgIGdsVXNlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOwogCi0gICBhc3NlcnQoZ2xJc1Byb2dyYW1fZnVuYyhwcm9ncmFtKSk7Ci0gICBhc3NlcnQoZ2xJc1NoYWRlcl9mdW5jKGZyYWdTaGFkZXIpKTsKLSAgIGFzc2VydChnbElzU2hhZGVyX2Z1bmModmVydFNoYWRlcikpOwotCi0KLSAgIGZvciAoaSA9IDA7IFVuaWZvcm1zW2ldLm5hbWU7IGkrKykgewotICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24KLSAgICAgICAgID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCBVbmlmb3Jtc1tpXS5uYW1lKTsKLSAgICAgIHByaW50ZigiVW5pZm9ybSAlcyBsb2NhdGlvbjogJWRcbiIsIFVuaWZvcm1zW2ldLm5hbWUsCi0gICAgICAgICAgICAgVW5pZm9ybXNbaV0ubG9jYXRpb24pOwotICAgICAgc3dpdGNoIChVbmlmb3Jtc1tpXS5zaXplKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBnbFVuaWZvcm0xZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBnbFVuaWZvcm0yZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBnbFVuaWZvcm0zZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgICBnbFVuaWZvcm00ZnZfZnVuYyhVbmlmb3Jtc1tpXS5sb2NhdGlvbiwgMSwgVW5pZm9ybXNbaV0udmFsdWUpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgYWJvcnQoKTsKLSAgICAgIH0KLSAgIH0KKyAgIEluaXRVbmlmb3Jtcyhwcm9ncmFtLCBVbmlmb3Jtcyk7CiAKICAgIGFzc2VydChnbEdldEVycm9yKCkgPT0gMCk7CiAKZGlmZiAtLWdpdCBhL3Byb2dzL2dsc2wvdHJpcmFzdC5jIGIvcHJvZ3MvZ2xzbC90cmlyYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZjY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dzL2dsc2wvdHJpcmFzdC5jCkBAIC0wLDAgKzEsMjU5IEBACisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgZG9pbmcgdHJpYW5nbGUgcmFzdGVyaXphdGlvbiB3aXRoIGEgZnJhZ21lbnQgcHJvZ3JhbS4KKyAqIEJhc2ljIGlkZWE6CisgKiAgIDEuIERyYXcgc2NyZWVuLWFsaWduZWQgcXVhZCAvIGJvdW5kaW5nIGJveCBhcm91bmQgdGhlIHRyaWFuZ2xlIHZlcnRzLgorICogICAyLiBGb3IgZWFjaCBwaXhlbCBpbiB0aGUgcXVhZCwgZGV0ZXJtaW5lIGlmIHBpeGVsIGlzIGluc2lkZS9vdXRzaWRlCisgKiAgICAgIHRoZSB0cmlhbmdsZSBlZGdlcy4KKyAqCisgKiBCcmlhbiBQYXVsCisgKiAxIEF1ZyAyMDA3CisgKi8KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNpbmNsdWRlIDxHTC9nbHV0Lmg+CisjaW5jbHVkZSA8R0wvZ2xleHQuaD4KKyNpbmNsdWRlICJleHRmdW5jcy5oIgorI2luY2x1ZGUgInNoYWRlcnV0aWwuaCIKKworCitzdGF0aWMgR0xpbnQgV2luV2lkdGggPSAzMDAsIFdpbkhlaWdodCA9IDMwMDsKK3N0YXRpYyBjaGFyICpGcmFnUHJvZ0ZpbGUgPSBOVUxMOworc3RhdGljIGNoYXIgKlZlcnRQcm9nRmlsZSA9IE5VTEw7CitzdGF0aWMgR0x1aW50IGZyYWdTaGFkZXI7CitzdGF0aWMgR0x1aW50IHZlcnRTaGFkZXI7CitzdGF0aWMgR0x1aW50IHByb2dyYW07CitzdGF0aWMgR0xpbnQgd2luID0gMDsKK3N0YXRpYyBHTGJvb2xlYW4gYW5pbSA9IEdMX1RSVUU7CitzdGF0aWMgR0xmbG9hdCBacm90ID0gMC4wZjsKK3N0YXRpYyBHTGludCB1djAsIHV2MSwgdXYyOworCisKK3N0YXRpYyBjb25zdCBHTGZsb2F0IFRyaVZlcnRzWzNdWzJdID0geworICAgeyA1MCwgIDUwIH0sCisgICB7IDI1MCwgNTAgfSwKKyAgIHsgMTUwLCAyNTAgfQorfTsKKworCitzdGF0aWMgdm9pZAorUm90YXRlVmVydHMoR0xmbG9hdCBhLAorICAgICAgICAgICAgR0x1aW50IG4sIGNvbnN0IEdMZmxvYXQgdmVydHNJbltdWzJdLCBHTGZsb2F0IHZlcnRzT3V0W11bMl0pCit7CisgICBHTHVpbnQgaTsKKyAgIEdMZmxvYXQgY3ggPSBXaW5XaWR0aCAvIDIsIGN5ID0gV2luSGVpZ2h0IC8gMjsKKyAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGZsb2F0IHggPSB2ZXJ0c0luW2ldWzBdIC0gY3g7CisgICAgICBmbG9hdCB5ID0gdmVydHNJbltpXVsxXSAtIGN5OworICAgICAgCisgICAgICB2ZXJ0c091dFtpXVswXSA9ICB4ICogY29zKGEpICsgeSAqIHNpbihhKSAgKyBjeDsKKyAgICAgIHZlcnRzT3V0W2ldWzFdID0gLXggKiBzaW4oYSkgKyB5ICogY29zKGEpICArIGN5OworICAgfQorfQorCitzdGF0aWMgdm9pZAorQ29tcHV0ZUJvdW5kcyhHTHVpbnQgbiwgR0xmbG9hdCB2ZXJ0c0luW11bMl0sCisgICAgICAgICAgICAgIEdMZmxvYXQgKnhtaW4sIEdMZmxvYXQgKnltaW4sCisgICAgICAgICAgICAgIEdMZmxvYXQgKnhtYXgsIEdMZmxvYXQgKnltYXgpCit7CisgICBHTHVpbnQgaTsKKyAgICp4bWluID0gKnhtYXggPSB2ZXJ0c0luWzBdWzBdOworICAgKnltaW4gPSAqeW1heCA9IHZlcnRzSW5bMF1bMV07CisgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICBpZiAodmVydHNJbltpXVswXSA8ICp4bWluKQorICAgICAgICAgKnhtaW4gPSB2ZXJ0c0luW2ldWzBdOworICAgICAgZWxzZSBpZiAodmVydHNJbltpXVswXSA+ICp4bWF4KQorICAgICAgICAgKnhtYXggPSB2ZXJ0c0luW2ldWzBdOworICAgICAgaWYgKHZlcnRzSW5baV1bMV0gPCAqeW1pbikKKyAgICAgICAgICp5bWluID0gdmVydHNJbltpXVsxXTsKKyAgICAgIGVsc2UgaWYgKHZlcnRzSW5baV1bMV0gPiAqeW1heCkKKyAgICAgICAgICp5bWF4ID0gdmVydHNJbltpXVsxXTsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAorUmVkaXNwbGF5KHZvaWQpCit7CisgICBHTGZsb2F0IHZbM11bMl0sIHhtaW4sIHltaW4sIHhtYXgsIHltYXg7CisKKyAgIFJvdGF0ZVZlcnRzKFpyb3QsIDMsIFRyaVZlcnRzLCB2KTsKKyAgIENvbXB1dGVCb3VuZHMoMywgdiwgJnhtaW4sICZ5bWluLCAmeG1heCwgJnltYXgpOworCisgICBnbFVuaWZvcm0yZnZfZnVuYyh1djAsIDEsIHZbMF0pOworICAgZ2xVbmlmb3JtMmZ2X2Z1bmModXYxLCAxLCB2WzFdKTsKKyAgIGdsVW5pZm9ybTJmdl9mdW5jKHV2MiwgMSwgdlsyXSk7CisKKyAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CisgICBnbFZlcnRleDJmKHhtaW4sIHltaW4pOworICAgZ2xWZXJ0ZXgyZih4bWF4LCB5bWluKTsKKyAgIGdsVmVydGV4MmYoeG1heCwgeW1heCk7CisgICBnbFZlcnRleDJmKHhtaW4sIHltYXgpOworICAgZ2xFbmQoKTsKKyAgIGdsUG9wTWF0cml4KCk7CisKKyAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisKK3N0YXRpYyB2b2lkCitJZGxlKHZvaWQpCit7CisgICBpZiAoYW5pbSkgeworICAgICAgWnJvdCA9IGdsdXRHZXQoR0xVVF9FTEFQU0VEX1RJTUUpICogMC4wMDA1OworICAgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIGFib3J0KCk7Cit9CisKKworc3RhdGljIHZvaWQKK1Jlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbE9ydGhvKDAsIHdpZHRoLCAwLCBoZWlnaHQsIC0xLCAxKTsKKworICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICBnbExvYWRJZGVudGl0eSgpOworfQorCisKK3N0YXRpYyB2b2lkCitDbGVhblVwKHZvaWQpCit7CisgICBnbERlbGV0ZVNoYWRlcl9mdW5jKGZyYWdTaGFkZXIpOworICAgZ2xEZWxldGVTaGFkZXJfZnVuYyh2ZXJ0U2hhZGVyKTsKKyAgIGdsRGVsZXRlUHJvZ3JhbV9mdW5jKHByb2dyYW0pOworICAgZ2x1dERlc3Ryb3lXaW5kb3cod2luKTsKK30KKworCitzdGF0aWMgdm9pZAorS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICh2b2lkKSB4OworICAodm9pZCkgeTsKKworICAgc3dpdGNoKGtleSkgeworICAgY2FzZSAnICc6CisgICBjYXNlICdhJzoKKyAgICAgIGFuaW0gPSAhYW5pbTsKKyAgICAgIGlmIChhbmltKQorICAgICAgICAgZ2x1dElkbGVGdW5jKElkbGUpOworICAgICAgZWxzZQorICAgICAgICAgZ2x1dElkbGVGdW5jKE5VTEwpOworICAgICAgYnJlYWs7CisgICBjYXNlICd6JzoKKyAgICAgIFpyb3QgPSAwOworICAgICAgYnJlYWs7CisgICBjYXNlICdzJzoKKyAgICAgIFpyb3QgKz0gMC4wNTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAyNzoKKyAgICAgIENsZWFuVXAoKTsKKyAgICAgIGV4aXQoMCk7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7Cit9CisKKworc3RhdGljIHZvaWQKK0luaXQodm9pZCkKK3sKKyAgIHN0YXRpYyBjb25zdCBjaGFyICpmcmFnU2hhZGVyVGV4dCA9CisgICAgICAidW5pZm9ybSB2ZWMyIHYwLCB2MSwgdjI7IFxuIgorICAgICAgImZsb2F0IGNycyhjb25zdCB2ZWMyIHUsIGNvbnN0IHZlYzIgdikgXG4iCisgICAgICAieyBcbiIKKyAgICAgICIgICByZXR1cm4gdS54ICogdi55IC0gdS55ICogdi54OyBcbiIKKyAgICAgICJ9IFxuIgorICAgICAgIlxuIgorICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICIgICB2ZWMyIHAgPSBnbF9GcmFnQ29vcmQueHk7IFxuIgorICAgICAgIiAgIGlmIChjcnModjEgLSB2MCwgcCAtIHYwKSA+PSAwICYmIFxuIgorICAgICAgIiAgICAgICBjcnModjIgLSB2MSwgcCAtIHYxKSA+PSAwICYmIFxuIgorICAgICAgIiAgICAgICBjcnModjAgLSB2MiwgcCAtIHYyKSA+PSAwKSBcbiIKKyAgICAgICIgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7IFxuIgorICAgICAgIiAgIGVsc2UgXG4iCisgICAgICAiICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjUpOyBcbiIKKyAgICAgICJ9XG4iOworICAgc3RhdGljIGNvbnN0IGNoYXIgKnZlcnRTaGFkZXJUZXh0ID0KKyAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAiICAgZ2xfUG9zaXRpb24gPSBmdHJhbnNmb3JtKCk7IFxuIgorICAgICAgIn1cbiI7CisKKyAgIGlmICghU2hhZGVyc1N1cHBvcnRlZCgpKQorICAgICAgZXhpdCgxKTsKKworICAgR2V0RXh0ZW5zaW9uRnVuY3MoKTsKKworICAgdmVydFNoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRTaGFkZXJUZXh0KTsKKyAgIGZyYWdTaGFkZXIgPSBDb21waWxlU2hhZGVyVGV4dChHTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdTaGFkZXJUZXh0KTsKKyAgIHByb2dyYW0gPSBMaW5rU2hhZGVycyh2ZXJ0U2hhZGVyLCBmcmFnU2hhZGVyKTsKKworICAgZ2xVc2VQcm9ncmFtX2Z1bmMocHJvZ3JhbSk7CisKKyAgIHV2MCA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgInYwIik7CisgICB1djEgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbl9mdW5jKHByb2dyYW0sICJ2MSIpOworICAgdXYyID0gZ2xHZXRVbmlmb3JtTG9jYXRpb25fZnVuYyhwcm9ncmFtLCAidjIiKTsKKyAgIHByaW50ZigiVW5pZm9ybXM6ICVkICVkICVkXG4iLCB1djAsIHV2MSwgdXYyKTsKKworICAgLyphc3NlcnQoZ2xHZXRFcnJvcigpID09IDApOyovCisKKyAgIGdsQ2xlYXJDb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAwLjBmKTsKKyAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworCisgICBwcmludGYoIkdMX1JFTkRFUkVSID0gJXNcbiIsKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpKTsKKworICAgYXNzZXJ0KGdsSXNQcm9ncmFtX2Z1bmMocHJvZ3JhbSkpOworICAgYXNzZXJ0KGdsSXNTaGFkZXJfZnVuYyhmcmFnU2hhZGVyKSk7CisgICBhc3NlcnQoZ2xJc1NoYWRlcl9mdW5jKHZlcnRTaGFkZXIpKTsKKworICAgZ2xDb2xvcjNmKDEsIDAsIDApOworfQorCisKK3N0YXRpYyB2b2lkCitQYXJzZU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGludCBpOworICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWZzIikgPT0gMCkgeworICAgICAgICAgRnJhZ1Byb2dGaWxlID0gYXJndltpKzFdOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItdnMiKSA9PSAwKSB7CisgICAgICAgICBWZXJ0UHJvZ0ZpbGUgPSBhcmd2W2krMV07CisgICAgICB9CisgICB9Cit9CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICBnbHV0SW5pdCgmYXJnYywgYXJndik7CisgICBnbHV0SW5pdFdpbmRvd1Bvc2l0aW9uKCAwLCAwKTsKKyAgIGdsdXRJbml0V2luZG93U2l6ZShXaW5XaWR0aCwgV2luSGVpZ2h0KTsKKyAgIGdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0IgfCBHTFVUX0RPVUJMRSB8IEdMVVRfREVQVEgpOworICAgd2luID0gZ2x1dENyZWF0ZVdpbmRvdyhhcmd2WzBdKTsKKyAgIGdsdXRSZXNoYXBlRnVuYyhSZXNoYXBlKTsKKyAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKKyAgIGdsdXREaXNwbGF5RnVuYyhSZWRpc3BsYXkpOworICAgaWYgKGFuaW0pCisgICAgICBnbHV0SWRsZUZ1bmMoSWRsZSk7CisgICBQYXJzZU9wdGlvbnMoYXJnYywgYXJndik7CisgICBJbml0KCk7CisgICBnbHV0TWFpbkxvb3AoKTsKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3MvZ2xzbC90d29zaWRlLmMgYi9wcm9ncy9nbHNsL3R3b3NpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJhMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MvZ2xzbC90d29zaWRlLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qKgorICogVGVzdCB0d28tc2lkZWQgbGlnaHRpbmcgd2l0aCBzaGFkZXJzLgorICogQm90aCBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSBhbmQgZ2xfRnJvbnRGYWNpbmcgY2FuIGJlIHRlc3RlZAorICogKHNlZSBrZXlzIGJlbG93KS4KKyAqCisgKiBCcmlhbiBQYXVsCisgKiAxOCBEZWMgMjAwNworICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxHTC9nbC5oPgorI2luY2x1ZGUgPEdML2dsdXQuaD4KKyNpbmNsdWRlIDxHTC9nbGV4dC5oPgorI2luY2x1ZGUgImV4dGZ1bmNzLmgiCisjaW5jbHVkZSAic2hhZGVydXRpbC5oIgorCisKK3N0YXRpYyBHTGludCBXaW5XaWR0aCA9IDMwMCwgV2luSGVpZ2h0ID0gMzAwOworc3RhdGljIGNoYXIgKkZyYWdQcm9nRmlsZSA9IE5VTEw7CitzdGF0aWMgY2hhciAqVmVydFByb2dGaWxlID0gTlVMTDsKK3N0YXRpYyBHTHVpbnQgZnJhZ1NoYWRlcjsKK3N0YXRpYyBHTHVpbnQgdmVydFNoYWRlcjsKK3N0YXRpYyBHTHVpbnQgcHJvZ3JhbTsKK3N0YXRpYyBHTGludCB3aW4gPSAwOworc3RhdGljIEdMYm9vbGVhbiBhbmltID0gMCpHTF9UUlVFOworc3RhdGljIEdMYm9vbGVhbiBEZXRlcm1pbmVJbkZyYWdQcm9nID0gR0xfVFJVRTsKK3N0YXRpYyBHTGZsb2F0IFhyb3QgPSAzMC4wZjsKK3N0YXRpYyBHTGludCB1X2ZyYWdmYWNlOworc3RhdGljIEdMZW51bSBGcm9udFdpbmRpbmcgPSBHTF9DQ1c7CitzdGF0aWMgaW50IHByZXZUaW1lID0gMDsKKworCitzdGF0aWMgY29uc3QgR0xmbG9hdCBSZWRbNF0gPSB7MSwgMCwgMCwgMH07CitzdGF0aWMgY29uc3QgR0xmbG9hdCBHcmVlbls0XSA9IHswLCAxLCAwLCAwfTsKKworCitzdGF0aWMgdm9pZAorUmVkaXNwbGF5KHZvaWQpCit7CisgICBpbnQgaTsKKyAgIGZsb2F0IHJhZGl1cyA9IDI7CisKKyAgIGdsRnJvbnRGYWNlKEZyb250V2luZGluZyk7CisKKyAgIGlmIChEZXRlcm1pbmVJbkZyYWdQcm9nKSB7CisgICAgICBnbFVuaWZvcm0xaV9mdW5jKHVfZnJhZ2ZhY2UsIDEpOworICAgICAgZ2xEaXNhYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1RXT19TSURFKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZ2xVbmlmb3JtMWlfZnVuYyh1X2ZyYWdmYWNlLCAwKTsKKyAgICAgIGdsRW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1RXT19TSURFKTsKKyAgIH0KKworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCApOworCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsUm90YXRlZihYcm90LCAxLCAwLCAwKTsKKworICAgLyogRHJhdyBhIHRyaXN0cmlwIHJpbmcgKi8KKyAgIGdsQmVnaW4oR0xfVFJJQU5HTEVfU1RSSVApOworICAgZ2xDb2xvcjRmdihSZWQpOworICAgZ2xTZWNvbmRhcnlDb2xvcjNmdl9mdW5jKEdyZWVuKTsKKyAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICBmbG9hdCBhID0gaSAvIDE5LjAgKiBNX1BJICogMi4wOworICAgICAgZmxvYXQgeCA9IHJhZGl1cyAqIGNvcyhhKTsKKyAgICAgIGZsb2F0IHkgPSByYWRpdXMgKiBzaW4oYSk7CisgICAgICBnbFZlcnRleDNmKHgsIC0xLCB5KTsKKyAgICAgIGdsVmVydGV4M2YoeCwgKzEsIHkpOworICAgfQorICAgZ2xFbmQoKTsKKworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisKKworc3RhdGljIHZvaWQKK0lkbGUodm9pZCkKK3sKKyAgIGludCBjdXJUaW1lID0gZ2x1dEdldChHTFVUX0VMQVBTRURfVElNRSk7CisgICBpbnQgZHQgPSBjdXJUaW1lIC0gcHJldlRpbWU7CisKKyAgIGlmIChwcmV2VGltZSA9PSAwKSB7CisgICAgICBwcmV2VGltZSA9IGN1clRpbWU7CisgICAgICByZXR1cm47CisgICB9CisgICBwcmV2VGltZSA9IGN1clRpbWU7CisKKyAgIFhyb3QgKz0gZHQgKiAwLjE7CisgICBnbHV0UG9zdFJlZGlzcGxheSgpOworfQorCisKK3N0YXRpYyB2b2lkCitSZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgIGZsb2F0IGFyID0gKGZsb2F0KSB3aWR0aCAvIGhlaWdodDsKKyAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xGcnVzdHVtKC1hciwgYXIsIC0xLCAxLCAzLCAyNSk7CisgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7CisgICBnbFRyYW5zbGF0ZWYoMCwgMCwgLTEwKTsKK30KKworCitzdGF0aWMgdm9pZAorQ2xlYW5VcCh2b2lkKQoreworICAgZ2xEZWxldGVTaGFkZXJfZnVuYyhmcmFnU2hhZGVyKTsKKyAgIGdsRGVsZXRlU2hhZGVyX2Z1bmModmVydFNoYWRlcik7CisgICBnbERlbGV0ZVByb2dyYW1fZnVuYyhwcm9ncmFtKTsKKyAgIGdsdXREZXN0cm95V2luZG93KHdpbik7Cit9CisKKworc3RhdGljIHZvaWQKK0tleSh1bnNpZ25lZCBjaGFyIGtleSwgaW50IHgsIGludCB5KQoreworICAodm9pZCkgeDsKKyAgKHZvaWQpIHk7CisKKyAgIHN3aXRjaChrZXkpIHsKKyAgIGNhc2UgJyAnOgorICAgY2FzZSAnYSc6CisgICAgICBhbmltID0gIWFuaW07CisgICAgICBpZiAoYW5pbSkgeworICAgICAgICAgcHJldlRpbWUgPSBnbHV0R2V0KEdMVVRfRUxBUFNFRF9USU1FKTsKKyAgICAgICAgIGdsdXRJZGxlRnVuYyhJZGxlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIGdsdXRJZGxlRnVuYyhOVUxMKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnZic6CisgICAgICBwcmludGYoIlVzaW5nIGZyYWcgc2hhZGVyIGdsX0Zyb250RmFjaW5nXG4iKTsKKyAgICAgIERldGVybWluZUluRnJhZ1Byb2cgPSBHTF9UUlVFOworICAgICAgYnJlYWs7CisgICBjYXNlICd2JzoKKyAgICAgIHByaW50ZigiVXNpbmcgdmVydCBzaGFkZXIgVHdvLXNpZGVkIGxpZ2h0aW5nXG4iKTsKKyAgICAgIERldGVybWluZUluRnJhZ1Byb2cgPSBHTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAncic6CisgICAgICAvKiByZXNldCAqLworICAgICAgWHJvdCA9IDMwOworICAgICAgYW5pbSA9IDA7CisgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3MnOgorICAgICAgWHJvdCArPSA1OworICAgICAgYnJlYWs7CisgICBjYXNlICdTJzoKKyAgICAgIFhyb3QgLT0gNTsKKyAgICAgIGJyZWFrOworICAgY2FzZSAndyc6CisgICAgICBpZiAoRnJvbnRXaW5kaW5nID09IEdMX0NDVykgeworICAgICAgICAgRnJvbnRXaW5kaW5nID0gR0xfQ1c7CisgICAgICAgICBwcmludGYoIkZyb250RmFjZSA9IEdMX0NXXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgRnJvbnRXaW5kaW5nID0gR0xfQ0NXOworICAgICAgICAgcHJpbnRmKCJGcm9udEZhY2UgPSBHTF9DQ1dcbiIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIDI3OgorICAgICAgQ2xlYW5VcCgpOworICAgICAgZXhpdCgwKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZAorSW5pdCh2b2lkKQoreworICAgc3RhdGljIGNvbnN0IGNoYXIgKmZyYWdTaGFkZXJUZXh0ID0KKyAgICAgICJ1bmlmb3JtIGJvb2wgZnJhZ2ZhY2U7IFxuIgorICAgICAgInZvaWQgbWFpbigpIHsgXG4iCisjaWYgMAorICAgICAgIiAgIGlmICghZnJhZ2ZhY2UgfHwgZ2xfRnJvbnRGYWNpbmcpIHsgXG4iCisgICAgICAiICAgICAgZ2xfRnJhZ0NvbG9yID0gZ2xfQ29sb3I7IFxuIgorICAgICAgIiAgIH0gXG4iCisgICAgICAiICAgZWxzZSB7IFxuIgorICAgICAgIiAgICAgIGdsX0ZyYWdDb2xvciA9IDAuOCAqIGdsX1NlY29uZGFyeUNvbG9yOyBcbiIKKyAgICAgICIgICB9IFxuIgorI2Vsc2UKKyAgICAgICIgICBib29sIGYgPSBnbF9Gcm9udEZhY2luZzsgXG4iCisgICAgICAiICAgaWYgKGYpIHsgXG4iCisgICAgICAiICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAwLjApOyBcbiIKKyAgICAgICIgICB9IFxuIgorICAgICAgIiAgIGVsc2UgeyBcbiIKKyAgICAgICIgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDAuMCk7IFxuIgorICAgICAgIiAgIH0gXG4iCisgICAgICAiICAgLy9mbG9hdCBnID0gZmxvYXQoZ2xfRnJvbnRGYWNpbmcpICogMC41ICsgMC41OyBcbiIKKyAgICAgICIgICAvL2dsX0ZyYWdDb2xvciA9IHZlYzQoZyk7IFxuIgorI2VuZGlmCisgICAgICAifSBcbiI7CisgICBzdGF0aWMgY29uc3QgY2hhciAqdmVydFNoYWRlclRleHQgPQorICAgICAgInVuaWZvcm0gYm9vbCBmcmFnZmFjZTsgXG4iCisgICAgICAidm9pZCBtYWluKCkgeyBcbiIKKyAgICAgICIgICBnbF9Gcm9udENvbG9yID0gZ2xfQ29sb3I7IFxuIgorICAgICAgIiAgIGlmIChmcmFnZmFjZSkgeyBcbiIKKyAgICAgICIgICAgICAvLyBmcm9udC9iYWNrIGNob3NlbiBpbiBmcmFnIHByb2cgXG4iCisgICAgICAiICAgICAgZ2xfRnJvbnRTZWNvbmRhcnlDb2xvciA9IGdsX1NlY29uZGFyeUNvbG9yOyBcbiIKKyAgICAgICIgICB9IFxuIgorICAgICAgIiAgIGVsc2UgeyBcbiIKKyAgICAgICIgICAgICAvLyBmcm9udC9iYWNrIGNob3NlbiBpbiBwcmltIHNldHVwIFxuIgorICAgICAgIiAgICAgIGdsX0JhY2tDb2xvciA9IGdsX1NlY29uZGFyeUNvbG9yOyBcbiIKKyAgICAgICIgICB9IFxuIgorICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gZnRyYW5zZm9ybSgpOyBcbiIKKyAgICAgICJ9IFxuIjsKKworICAgaWYgKCFTaGFkZXJzU3VwcG9ydGVkKCkpCisgICAgICBleGl0KDEpOworCisgICBHZXRFeHRlbnNpb25GdW5jcygpOworCisgICB2ZXJ0U2hhZGVyID0gQ29tcGlsZVNoYWRlclRleHQoR0xfVkVSVEVYX1NIQURFUiwgdmVydFNoYWRlclRleHQpOworICAgZnJhZ1NoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KEdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZ1NoYWRlclRleHQpOworICAgcHJvZ3JhbSA9IExpbmtTaGFkZXJzKHZlcnRTaGFkZXIsIGZyYWdTaGFkZXIpOworCisgICBnbFVzZVByb2dyYW1fZnVuYyhwcm9ncmFtKTsKKworICAgdV9mcmFnZmFjZSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgImZyYWdmYWNlIik7CisgICBwcmludGYoIlVuaWZvcm1zOiAlZFxuIiwgdV9mcmFnZmFjZSk7CisKKyAgIC8qYXNzZXJ0KGdsR2V0RXJyb3IoKSA9PSAwKTsqLworCisgICBnbENsZWFyQ29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZik7CisKKyAgIHByaW50ZigiR0xfUkVOREVSRVIgPSAlc1xuIiwoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9SRU5ERVJFUikpOworCisgICBhc3NlcnQoZ2xJc1Byb2dyYW1fZnVuYyhwcm9ncmFtKSk7CisgICBhc3NlcnQoZ2xJc1NoYWRlcl9mdW5jKGZyYWdTaGFkZXIpKTsKKyAgIGFzc2VydChnbElzU2hhZGVyX2Z1bmModmVydFNoYWRlcikpOworCisgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKK30KKworCitzdGF0aWMgdm9pZAorUGFyc2VPcHRpb25zKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICBpbnQgaTsKKyAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1mcyIpID09IDApIHsKKyAgICAgICAgIEZyYWdQcm9nRmlsZSA9IGFyZ3ZbaSsxXTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLXZzIikgPT0gMCkgeworICAgICAgICAgVmVydFByb2dGaWxlID0gYXJndltpKzFdOworICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitVc2FnZSh2b2lkKQoreworICAgcHJpbnRmKCJLZXlzOlxuIik7CisgICBwcmludGYoIiAgIGYgLSBkbyBmcm9udC9iYWNrIGRldGVybWluYXRpb24gaW4gZnJhZ21lbnQgc2hhZGVyXG4iKTsKKyAgIHByaW50ZigiICAgdiAtIGRvIGZyb250L2JhY2sgZGV0ZXJtaW5hdGlvbiBpbiB2ZXJ0ZXggc2hhZGVyXG4iKTsKKyAgIHByaW50ZigiICAgciAtIHJlc2V0LCBzaG93IGZyb250XG4iKTsKKyAgIHByaW50ZigiICAgYSAtIHRvZ2dsZSBhbmltYXRpb25cbiIpOworICAgcHJpbnRmKCIgICBzIC0gc3RlcCByb3RhdGlvblxuIik7CisgICBwcmludGYoIiAgIHcgLSB0b2dnbGUgQ1csIENDVyBmcm9udC1mYWNlIHdpbmRpbmdcbiIpOworICAgcHJpbnRmKCJOT1RFOiByZWQgPSBmcm9udCBmYWNlLCBncmVlbiA9IGJhY2sgZmFjZS5cbiIpOworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworICAgZ2x1dEluaXRXaW5kb3dQb3NpdGlvbiggMCwgMCk7CisgICBnbHV0SW5pdFdpbmRvd1NpemUoV2luV2lkdGgsIFdpbkhlaWdodCk7CisgICBnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCIHwgR0xVVF9ERVBUSCB8IEdMVVRfRE9VQkxFKTsKKyAgIHdpbiA9IGdsdXRDcmVhdGVXaW5kb3coYXJndlswXSk7CisgICBnbHV0UmVzaGFwZUZ1bmMoUmVzaGFwZSk7CisgICBnbHV0S2V5Ym9hcmRGdW5jKEtleSk7CisgICBnbHV0RGlzcGxheUZ1bmMoUmVkaXNwbGF5KTsKKyAgIGlmIChhbmltKQorICAgICAgZ2x1dElkbGVGdW5jKElkbGUpOworICAgUGFyc2VPcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgSW5pdCgpOworICAgVXNhZ2UoKTsKKyAgIGdsdXRNYWluTG9vcCgpOworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy9taW5pZ2x4L01ha2VmaWxlIGIvcHJvZ3MvbWluaWdseC9NYWtlZmlsZQppbmRleCBjYzI3MDI0Li5lNmY1ZmE1IDEwMDY0NAotLS0gYS9wcm9ncy9taW5pZ2x4L01ha2VmaWxlCisrKyBiL3Byb2dzL21pbmlnbHgvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDggQEAKIAktSS4gXAogCS1JJChUT1ApL2luY2x1ZGUKIAorTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCisKIAogIyMjIyMgUlVMRVMgIyMjIyMKIApAQCAtMjcsNyArMjksNyBAQAogLlNVRkZJWEVTOiAuYwogCiAuYzoKLQkkKENDKSAkKElOQ0xVREVTKSAkKENGTEFHUykgJDwgJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgJChJTkNMVURFUykgJChDRkxBR1MpICQoTERGTEFHUykgJDwgJChMSUJTKSAtbyAkQAogCiAuYy5vOgogCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPCAtbyAkQApAQCAtNDEsOCArNDMsOCBAQAogZGVmYXVsdDogIGRlcGVuZCAkKFBST0dTKQogCiBjbGVhbjoKLQlybSAtZiAkKFBST0dTKQotCXJtIC1mICoubworCS1ybSAtZiAkKFBST0dTKQorCS1ybSAtZiAqLm8KIAogCiBkZXBlbmQ6ICQoU09VUkNFUykKZGlmZiAtLWdpdCBhL3Byb2dzL29zZGVtb3MvTWFrZWZpbGUgYi9wcm9ncy9vc2RlbW9zL01ha2VmaWxlCmluZGV4IGY4Y2JhOWUuLjAyM2VhMDIgMTAwNjQ0Ci0tLSBhL3Byb2dzL29zZGVtb3MvTWFrZWZpbGUKKysrIGIvcHJvZ3Mvb3NkZW1vcy9NYWtlZmlsZQpAQCAtNSwxMyArNSwxOSBAQAogCiBJTkNESVIgPSAkKFRPUCkvaW5jbHVkZQogCi1PU01FU0FfTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWxPU01lc2EgJChBUFBfTElCX0RFUFMpCitPU01FU0FfTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVV9MSUIpIC1sJChPU01FU0FfTElCKSAkKEFQUF9MSUJfREVQUykKIAotT1NNRVNBMTZfTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWxnbHV0IC1sT1NNZXNhMTYgLWxHTFUgLWxHTCAkKEFQUF9MSUJfREVQUykKK09TTUVTQTE2X0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWxPU01lc2ExNiAtbCQoR0xVX0xJQikgXAorCS1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQogCi1PU01FU0EzMl9MSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbGdsdXQgLWxPU01lc2EzMiAtbEdMVSAtbEdMICQoQVBQX0xJQl9ERVBTKQorT1NNRVNBMzJfTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbE9TTWVzYTMyIC1sJChHTFVfTElCKSBcCisJLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCiAKLUxJQl9ERVAgPSAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKQorTElCX0RFUCA9ICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVX0xJQl9OQU1FKSBcCisJJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKQorCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSBcCisJJChBUFBfTElCX0RFUFMpCiAKIFBST0dTID0gXAogCW9zZGVtbyBcCkBAIC0yNiw3ICszMiw3IEBACiAKICMgbWFrZSBleGVjdXRhYmxlIGZyb20gLmMgZmlsZToKIC5jOiAkKExJQl9ERVApIHJlYWR0ZXgubwotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkPCByZWFkdGV4Lm8gJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgJDwgcmVhZHRleC5vICQoTElCUykgLW8gJEAKIAogCiAjIyMjIyBUQVJHRVRTICMjIyMjCkBAIC01NiwxOSArNjIsMTkgQEAKIAogIyBzcGVjaWFsIGNhc2U6IG5lZWQgdGhlIC1sT1NNZXNhIGxpYnJhcnk6CiBvc2RlbW86IG9zZGVtby5jCi0JJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpIG9zZGVtby5jICQoT1NNRVNBX0xJQlMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgb3NkZW1vLmMgJChPU01FU0FfTElCUykgLW8gJEAKIAogIyBzcGVjaWFsIGNhc2U6IG5lZWQgdGhlIC1sT1NNZXNhIGxpYnJhcnk6CiBvc3Rlc3QxOiBvc3Rlc3QxLmMKLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgb3N0ZXN0MS5jICQoT1NNRVNBX0xJQlMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgb3N0ZXN0MS5jICQoT1NNRVNBX0xJQlMpIC1vICRACiAKICMgYW5vdGhlciBzcGVjaWFsIGNhc2U6IG5lZWQgdGhlIC1sT1NNZXNhMTYgbGlicmFyeToKIG9zZGVtbzE2OiBvc2RlbW8xNi5jCi0JJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpIG9zZGVtbzE2LmMgJChPU01FU0ExNl9MSUJTKSAtbyAkQAorCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkKExERkxBR1MpIG9zZGVtbzE2LmMgJChPU01FU0ExNl9MSUJTKSAtbyAkQAogCiAjIGFub3RoZXIgc3BlY2lhbCBjYXNlOiBuZWVkIHRoZSAtbE9TTWVzYTMyIGxpYnJhcnk6CiBvc2RlbW8zMjogb3NkZW1vMzIuYwotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBvc2RlbW8zMi5jICQoT1NNRVNBMzJfTElCUykgLW8gJEAKKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSBvc2RlbW8zMi5jICQoT1NNRVNBMzJfTElCUykgLW8gJEAKIAogCiAKZGlmZiAtLWdpdCBhL3Byb2dzL29zZGVtb3Mvb3N0ZXN0MS5jIGIvcHJvZ3Mvb3NkZW1vcy9vc3Rlc3QxLmMKaW5kZXggMmM3YWRmYy4uMDAwYjhjNCAxMDA2NDQKLS0tIGEvcHJvZ3Mvb3NkZW1vcy9vc3Rlc3QxLmMKKysrIGIvcHJvZ3Mvb3NkZW1vcy9vc3Rlc3QxLmMKQEAgLTQwNyw3ICs0MDcsMTAgQEAKICAgIGdsR2V0SW50ZWdlcnYoR0xfQUxQSEFfQklUUywgJmNCaXRzKTsKICAgIGFzc2VydChjQml0cyA9PSBiaXRzKTsKIAotICAgcHJpbnRmKCJSZW5kZXJpbmcgJWQgYml0L2NoYW5uZWwgaW1hZ2U6ICVzXG4iLCBiaXRzLCBmaWxlbmFtZSk7CisgICBpZiAoV3JpdGVGaWxlcykKKyAgICAgIHByaW50ZigiUmVuZGVyaW5nICVkIGJpdC9jaGFubmVsIGltYWdlOiAlc1xuIiwgYml0cywgZmlsZW5hbWUpOworICAgZWxzZQorICAgICAgcHJpbnRmKCJSZW5kZXJpbmcgJWQgYml0L2NoYW5uZWwgaW1hZ2VcbiIsIGJpdHMpOwogCiAgICBPU01lc2FDb2xvckNsYW1wKEdMX1RSVUUpOwogCkBAIC00NTgsNiArNDYxLDggQEAKIHsKICAgIGludCBpOwogCisgICBwcmludGYoIlVzZSAtZiB0byB3cml0ZSBpbWFnZSBmaWxlc1xuIik7CisKICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1mIikgPT0gMCkKICAgICAgICAgIFdyaXRlRmlsZXMgPSBHTF9UUlVFOwpkaWZmIC0tZ2l0IGEvcHJvZ3MvcmVkYm9vay9NYWtlZmlsZSBiL3Byb2dzL3JlZGJvb2svTWFrZWZpbGUKaW5kZXggZmViYzc0NC4uN2JhNjc2YyAxMDA2NDQKLS0tIGEvcHJvZ3MvcmVkYm9vay9NYWtlZmlsZQorKysgYi9wcm9ncy9yZWRib29rL01ha2VmaWxlCkBAIC03LDYgKzcsOCBAQAogCiBMSUJfREVQID0gJChUT1ApLyQoTElCX0RJUikvJChHTF9MSUJfTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChHTFVfTElCX05BTUUpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVVF9MSUJfTkFNRSkKIAorTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCisKIFBST0dTID0gYWFpbmRleCBhYXBvbHkgYWFyZ2IgYWNjYW50aSBhY2NwZXJzcCBhbHBoYSBhbHBoYTNEIGFudGkgXAogCWJlemN1cnZlIGJlem1lc2ggY2hlY2tlciBjbGlwIGNvbG9ybWF0IGN1YmUgZGVwdGhjdWUgZG9mIFwKIAlkb3VibGUgZHJhd2YgZmVlZGJhY2sgZm9nIGZvZ2luZGV4IGZvbnQgaGVsbG8gaW1hZ2UgbGlnaHQgXApAQCAtMjQsNyArMjYsNyBAQAogLlNVRkZJWEVTOiAuYwogCiAuYzogJChMSUJfREVQKQotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAkPCAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJChMREZMQUdTKSAkPCAkKExJQlMpIC1vICRACiAKIAogCmRpZmYgLS1naXQgYS9wcm9ncy9zYW1wbGVzL01ha2VmaWxlIGIvcHJvZ3Mvc2FtcGxlcy9NYWtlZmlsZQppbmRleCAwNjMwMDhkLi42NTA5YTU1IDEwMDY0NAotLS0gYS9wcm9ncy9zYW1wbGVzL01ha2VmaWxlCisrKyBiL3Byb2dzL3NhbXBsZXMvTWFrZWZpbGUKQEAgLTcsNiArNyw4IEBACiAKIExJQl9ERVAgPSAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKQogCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAkKEFQUF9MSUJfREVQUykKKwogUFJPR1MgPSBhY2N1bSBiaXRtYXAxIGJpdG1hcDIgYmxlbmRlcSBibGVuZHhvciBjb3B5IGN1cnNvciBkZXB0aCBldmFsIGZvZyBcCiAJZm9udCBsaW5lIGxvZ28gbnVyYiBvbHltcGljIG92ZXJsYXkgcG9pbnQgcHJpbSBxdWFkIHNlbGVjdCBcCiAJc2hhcGUgc3BoZXJlIHN0YXIgc3RlbmNpbCBzdHJldGNoIHRleHR1cmUgdHJpIHdhdmUKQEAgLTE4LDcgKzIwLDcgQEAKIC5TVUZGSVhFUzogLmMKIAogLmM6ICQoTElCX0RFUCkKLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgJDwgJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgJDwgJChMSUJTKSAtbyAkQAogCiAKICMjIyMjIFRBUkdFVFMgIyMjIyMKQEAgLTI3LDcgKzI5LDcgQEAKIAogCiBzcGhlcmU6IHNwaGVyZS5vIHJlYWR0ZXgubwotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBzcGhlcmUubyByZWFkdGV4Lm8gJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQoTERGTEFHUykgc3BoZXJlLm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKIAogc3BoZXJlLm86IHNwaGVyZS5jIHJlYWR0ZXguaAogCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBzcGhlcmUuYwpkaWZmIC0tZ2l0IGEvcHJvZ3Mvc2FtcGxlcy9NYWtlZmlsZS5tZ3cgYi9wcm9ncy9zYW1wbGVzL01ha2VmaWxlLm1ndwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI5NzViCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3Mvc2FtcGxlcy9NYWtlZmlsZS5tZ3cKQEAgLTAsMCArMSw3OCBAQAorIyBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisjIFZlcnNpb246ICA0LjAKKyMgCisjIENvcHlyaWdodCAoQykgMTk5OSAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIAorIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorIyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorIyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMgCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisjIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIyAKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyMgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyBCUklBTiBQQVVMIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisjIE1pbkdXIHNhbXBsZXMgbWFrZWZpbGUgdjEuMiBmb3IgTWVzYQorIworIyAgQ29weXJpZ2h0IChDKSAyMDAyIC0gRGFuaWVsIEJvcmNhCisjICBFbWFpbCA6IGRib3JjYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyMgIFdlYiAgIDogaHR0cDovL3d3dy5nZW9jaXRpZXMuY29tL2Rib3JjYQorCisjIE1pbkdXIHNhbXBsZXMgbWFrZWZpbGUgdXBkYXRlZCBmb3IgTWVzYSA3LjAKKyMKKyMgIFVwZGF0ZWQgOiBieSBIZXJvbXl0aCwgb24gMjAwNy03LTIxCisjICBFbWFpbCAgIDogenhwbXl0aEB5YWhvby5jb20uY24KKyMgIEJ1Z3MgICAgOiAxKSBBbGwgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgd29yayBmaW5lLiBCdXQgdGhlIHNldHRpbmcgWDg2PTEgY2FuJ3Qgd29yay4gCisjICAgICAgICAgICAgVGhlIG90aGVycyBoYXZuJ3QgYmVlbiB0ZXN0ZWQgeWV0LgorIyAgICAgICAgICAgIDIpIFRoZSBnZW5lcmF0ZWQgRExMcyBhcmUgKm5vdCogY29tcGF0aWJsZSB3aXRoIHRoZSBvbmVzIGJ1aWx0CisjICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgY29tcGlsZXJzIGxpa2UgVkM4LCBlc3BlY2lhbGx5IGZvciBHTFVULiAKKyMgICAgICAgICAgICAzKSBBbHRob3VnaCBtb3JlIHRlc3RzIGFyZSBuZWVkZWQsIGl0IGNhbiBiZSB1c2VkIGluZGl2aWR1YWxseSEKKworIworIyAgQXZhaWxhYmxlIG9wdGlvbnM6CisjCisjICAgIEVudmlyb25tZW50IHZhcmlhYmxlczoKKyMKKyMgICAgVGFyZ2V0czoKKyMJPGZpbGUuZXhlPglidWlsZCBhIHNwZWNpZmljIGZpbGUKKyMKKworCisKKy5QSE9OWTogYWxsCisuU1VGRklYRVM6IC5jIC5vIC5leGUKKy5TRUNPTkRBUlk6IC4uL3V0aWwvcmVhZHRleC5vIC4uL3V0aWwvc2hvd2J1ZmZlci5vCisKK1RPUCA9IC4uLy4uCisKK0NDID0gbWluZ3czMi1nY2MKK0NGTEFHUyA9IC1XYWxsIC1wZWRhbnRpYworQ0ZMQUdTICs9IC1PMiAtZmZhc3QtbWF0aCAtRF9ETEwKK0NGTEFHUyArPSAtSSQoVE9QKS9pbmNsdWRlIC1JLi4vdXRpbAoraWZlcSAoJChGWCksMSkKKyAgQ0ZMQUdTICs9IC1ERlgKK2VuZGlmCisKK0NGTEFHUyArPSAtREdMVVRfRElTQUJMRV9BVEVYSVRfSEFDSworCitMRCA9IG1pbmd3MzItZysrCitMREZMQUdTID0gLXMgLUwkKFRPUCkvbGliCisKK0xETElCUyA9IC1sZ2x1dDMyIC1sZ2x1MzIgLWxvcGVuZ2wzMgorCisuYy5vOgorCSQoQ0MpIC1vICRAICQoQ0ZMQUdTKSAtYyAkPAorJS5leGU6IC4uL3V0aWwvcmVhZHRleC5vIC4uL3V0aWwvc2hvd2J1ZmZlci5vICUubworCSQoTEQpIC1vICRAICQoTERGTEFHUykgJChMRExJQlMpICReCisKKworYWxsOgorCSQoZXJyb3IgTXVzdCBzcGVjaWZ5IDxmaWxlbmFtZS5leGU+IHRvIGJ1aWxkKQpkaWZmIC0tZ2l0IGEvcHJvZ3Mvc2FtcGxlcy9ibGVuZGVxLmMgYi9wcm9ncy9zYW1wbGVzL2JsZW5kZXEuYwppbmRleCBmNzhhZmQzLi5kNTE0M2VjIDEwMDY0NAotLS0gYS9wcm9ncy9zYW1wbGVzL2JsZW5kZXEuYworKysgYi9wcm9ncy9zYW1wbGVzL2JsZW5kZXEuYwpAQCAtMjUsNiArMjUsMjcgQEAKIHN0YXRpYyBpbnQgZGVsdGFZOwogR0xpbnQgd2luZFcsIHdpbmRIOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgIEdMZW51bSBtb2RlOworICAgY29uc3QgY2hhciAqbmFtZTsKK30gTG9naWNPcE1vZGVzW10gPSB7CisgICB7IEdMX1NFVCwgIkdMX1NFVCIgfSwKKyAgIHsgR0xfQ09QWSwgIkdMX0NPUFkiIH0sCisgICB7IEdMX05PT1AsICJHTF9OT09QIiB9LAorICAgeyBHTF9BTkQsICJHTF9BTkQiIH0sCisgICB7IEdMX0lOVkVSVCwgIkdMX0lOVkVSVCIgfSwKKyAgIHsgR0xfT1IsICJHTF9PUiIgfSwKKyAgIHsgR0xfWE9SLCAiR0xfWE9SIiB9LAorICAgeyBHTF9OT1IsICJHTF9OT1IiIH0sCisgICB7IEdMX05BTkQsICJHTF9OQU5EIiB9LAorICAgeyBHTF9PUl9SRVZFUlNFLCAiR0xfT1JfUkVWRVJTRSIgfSwKKyAgIHsgR0xfT1JfSU5WRVJURUQsICJHTF9PUl9JTlZFUlRFRCIgfSwKKyAgIHsgR0xfQU5EX0lOVkVSVEVELCAiR0xfQU5EX0lOVkVSVEVEIiB9LAorICAgeyAwLCBOVUxMIH0KK307CisKKworCiBzdGF0aWMgdm9pZCBEcmF3U3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZykKIHsKICAgICBpbnQgaTsKQEAgLTQ3LDcgKzY4LDcgQEAKICAgICB3aW5kSCA9IChHTGludCloZWlnaHQ7CiAKICAgICBnbFZpZXdwb3J0KDAsIDAsIChHTGludCl3aWR0aCwgKEdMaW50KWhlaWdodCk7Ci0gICAgZGVsdGFZID0gd2luZEggLzE2OworICAgIGRlbHRhWSA9IHdpbmRIIC8yMDsKIAogICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKICAgICBnbExvYWRJZGVudGl0eSgpOwpAQCAtMTA1LDcgKzEyNiw3IEBACiB7CiAgICAgaW50IHN0cmluZ09mZnNldCA9IDUsIHN0cmluZ3ggPSA4OwogICAgIGludCB4MSwgeDIsIHhsZWZ0LCB4cmlnaHQ7Ci0gICAgaW50IGk7CisgICAgaW50IGksIGs7CiAKICAgICAoZGl0aGVyaW5nKSA/IGdsRW5hYmxlKEdMX0RJVEhFUikgOiBnbERpc2FibGUoR0xfRElUSEVSKTsKICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwpAQCAtMTIyLDYgKzE0Myw3IEBACiAgICAgLyogRHJhdyBsYWJlbHMgKi8KICAgICBnbENvbG9yM2YoMC44LCAwLjgsIDAuMCk7CiAgICAgaSA9IHdpbmRIIC0gZGVsdGFZICsgc3RyaW5nT2Zmc2V0OworCiAgICAgZ2xSYXN0ZXJQb3MyZihzdHJpbmd4LCBpKTsgaSAtPSBkZWx0YVk7CiAgICAgRHJhd1N0cmluZygiU09VUkNFIik7CiAgICAgZ2xSYXN0ZXJQb3MyZihzdHJpbmd4LCBpKTsgaSAtPSBkZWx0YVk7CkBAIC0xMzYsMjEgKzE1OCwxMiBAQAogICAgIERyYXdTdHJpbmcoInJldmVyc2Vfc3VidHJhY3QiKTsKICAgICBnbFJhc3RlclBvczJmKHN0cmluZ3gsIGkpOyBpIC09IGRlbHRhWTsKICAgICBEcmF3U3RyaW5nKCJjbGVhciIpOwotICAgIGdsUmFzdGVyUG9zMmYoc3RyaW5neCwgaSk7IGkgLT0gZGVsdGFZOwotICAgIERyYXdTdHJpbmcoInNldCIpOwotICAgIGdsUmFzdGVyUG9zMmYoc3RyaW5neCwgaSk7IGkgLT0gZGVsdGFZOwotICAgIERyYXdTdHJpbmcoImNvcHkiKTsKLSAgICBnbFJhc3RlclBvczJmKHN0cmluZ3gsIGkpOyBpIC09IGRlbHRhWTsKLSAgICBEcmF3U3RyaW5nKCJub29wIik7Ci0gICAgZ2xSYXN0ZXJQb3MyZihzdHJpbmd4LCBpKTsgaSAtPSBkZWx0YVk7Ci0gICAgRHJhd1N0cmluZygiYW5kIik7Ci0gICAgZ2xSYXN0ZXJQb3MyZihzdHJpbmd4LCBpKTsgaSAtPSBkZWx0YVk7Ci0gICAgRHJhd1N0cmluZygiaW52ZXJ0Iik7Ci0gICAgZ2xSYXN0ZXJQb3MyZihzdHJpbmd4LCBpKTsgaSAtPSBkZWx0YVk7Ci0gICAgRHJhd1N0cmluZygib3IiKTsKLSAgICBnbFJhc3RlclBvczJmKHN0cmluZ3gsIGkpOyBpIC09IGRlbHRhWTsKLSAgICBEcmF3U3RyaW5nKCJ4b3IiKTsKIAorICAgIGZvciAoayA9IDA7IExvZ2ljT3BNb2Rlc1trXS5uYW1lOyBrKyspIHsKKyAgICAgICBnbFJhc3RlclBvczJmKHN0cmluZ3gsIGkpOworICAgICAgIGkgLT0gZGVsdGFZOworICAgICAgIERyYXdTdHJpbmcoTG9naWNPcE1vZGVzW2tdLm5hbWUpOworICAgIH0KIAogICAgIGkgPSB3aW5kSCAtIGRlbHRhWTsKICAgICB4MSA9IHdpbmRXLzQ7CkBAIC0xOTMsNDMgKzIwNiwyMyBAQAogICAgIGdsTG9naWNPcChHTF9DTEVBUik7CiAgICAgZ2xSZWN0Zih4MSwgaSwgeDIsIGkrZGVsdGFZKTsKIAotICAgIGkgLT0gZGVsdGFZOwotICAgIGdsTG9naWNPcChHTF9TRVQpOwotICAgIGdsUmVjdGYoeDEsIGksIHgyLCBpK2RlbHRhWSk7CisgICAgZm9yIChrID0gMDsgTG9naWNPcE1vZGVzW2tdLm5hbWU7IGsrKykgeworICAgICAgIGkgLT0gZGVsdGFZOworICAgICAgIGdsTG9naWNPcChMb2dpY09wTW9kZXNba10ubW9kZSk7CisgICAgICAgZ2xSZWN0Zih4MSwgaSwgeDIsIGkrZGVsdGFZKTsKKyAgICAgICBpZiAoTG9naWNPcE1vZGVzW2tdLm1vZGUgPT0gR0xfWE9SKSB7CisgICAgICAgICAgZ2xSZWN0Zih4MSwgaSsxMCwgeDIsIGkrNSk7CisgICAgICAgfQorICAgIH0KIAotICAgIGkgLT0gZGVsdGFZOwotICAgIGdsTG9naWNPcChHTF9DT1BZKTsKLSAgICBnbFJlY3RmKHgxLCBpLCB4MiwgaStkZWx0YVkpOwotCi0gICAgaSAtPSBkZWx0YVk7Ci0gICAgZ2xMb2dpY09wKEdMX05PT1ApOwotICAgIGdsUmVjdGYoeDEsIGksIHgyLCBpK2RlbHRhWSk7Ci0KLSAgICBpIC09IGRlbHRhWTsKLSAgICBnbExvZ2ljT3AoR0xfQU5EKTsKLSAgICBnbFJlY3RmKHgxLCBpLCB4MiwgaStkZWx0YVkpOwotCi0gICAgaSAtPSBkZWx0YVk7Ci0gICAgZ2xMb2dpY09wKEdMX0lOVkVSVCk7Ci0gICAgZ2xSZWN0Zih4MSwgaSwgeDIsIGkrZGVsdGFZKTsKLQotICAgIGkgLT0gZGVsdGFZOwotICAgIGdsTG9naWNPcChHTF9PUik7Ci0gICAgZ2xSZWN0Zih4MSwgaSwgeDIsIGkrZGVsdGFZKTsKLQotICAgIGkgLT0gZGVsdGFZOwotICAgIGdsTG9naWNPcChHTF9YT1IpOwotICAgIGdsUmVjdGYoeDEsIGksIHgyLCBpK2RlbHRhWSk7Ci0gICAgZ2xSZWN0Zih4MSwgaSsxMCwgeDIsIGkrNSk7Ci0KLSAgaWYgKGRvUHJpbnQpIHsKLSAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICBpZiAoc3VwcG9ydGxvZ29wcyAmIDIpCisgICAgaWYgKGRvUHJpbnQpIHsKKyAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgIGlmIChzdXBwb3J0bG9nb3BzICYgMikKICAgICAgICAgICBnbERpc2FibGUoR0xfQ09MT1JfTE9HSUNfT1ApOwotICAgICAgZ2xDb2xvcjNmKDEuMCwgMS4wLCAxLjApOwotICAgICAgUHJpbnRDb2xvclN0cmluZ3MoKTsKLSAgfQotICBnbEZsdXNoKCk7CisgICAgICAgZ2xDb2xvcjNmKDEuMCwgMS4wLCAxLjApOworICAgICAgIFByaW50Q29sb3JTdHJpbmdzKCk7CisgICAgfQorICAgIGdsRmx1c2goKTsKIAogICAgIGlmIChkb3VibGVCdWZmZXIpIHsKICAgICAgICBnbHV0U3dhcEJ1ZmZlcnMoKTsKQEAgLTI3MSw3ICsyNjQsNyBAQAogCWV4aXQoMSk7CiAgICAgfQogCi0gICAgZ2x1dEluaXRXaW5kb3dQb3NpdGlvbigwLCAwKTsgZ2x1dEluaXRXaW5kb3dTaXplKCA4MDAsIDQwMCk7CisgICAgZ2x1dEluaXRXaW5kb3dQb3NpdGlvbigwLCAwKTsgZ2x1dEluaXRXaW5kb3dTaXplKCA4MDAsIDUyMCk7CiAKICAgICB0eXBlID0gR0xVVF9SR0I7CiAgICAgdHlwZSB8PSAoZG91YmxlQnVmZmVyKSA/IEdMVVRfRE9VQkxFIDogR0xVVF9TSU5HTEU7CmRpZmYgLS1naXQgYS9wcm9ncy9zbGFuZy9NYWtlZmlsZSBiL3Byb2dzL3NsYW5nL01ha2VmaWxlCmluZGV4IDFjNjAyY2UuLmY2ZjM0ZmMgMTAwNjQ0Ci0tLSBhL3Byb2dzL3NsYW5nL01ha2VmaWxlCisrKyBiL3Byb2dzL3NsYW5nL01ha2VmaWxlCkBAIC04LDYgKzgsOCBAQAogCiBMSUJfREVQID0gJChUT1ApLyQoTElCX0RJUikvJChHTF9MSUJfTkFNRSkKIAorTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCisKICMKICMgdGFyZ2V0cwogIwpAQCAtMjIsMzQgKzI0LDM0IEBACiAJISAuL2NsdGVzdCAyPiAvZGV2L251bGwgfCAoZ3JlcCAtZSBeWypdWypdWypdKQogCiBjbGVhbjoKLQlybSAtZiBjbHRlc3QubyBzb3Rlc3QubyB2c3Rlc3QubyBmcmFtZXdvcmsubyBjbHRlc3Qgc290ZXN0IHZzdGVzdAorCS1ybSAtZiBjbHRlc3QubyBzb3Rlc3QubyB2c3Rlc3QubyBmcmFtZXdvcmsubyBjbHRlc3Qgc290ZXN0IHZzdGVzdAogCiAjCiAjIGV4ZWN1dGFibGVzCiAjCiAKIGNsdGVzdDogY2x0ZXN0Lm8gZnJhbWV3b3JrLm8gJChMSUJfREVQKQotCSQoQ0MpIGNsdGVzdC5vIGZyYW1ld29yay5vICQoQVBQX0xJQl9ERVBTKSAtbyBjbHRlc3QKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSBjbHRlc3QubyBmcmFtZXdvcmsubyAkKExJQlMpIC1vIGNsdGVzdAogCiBzb3Rlc3Q6IHNvdGVzdC5vIGZyYW1ld29yay5vICQoTElCX0RFUCkKLQkkKENDKSBzb3Rlc3QubyBmcmFtZXdvcmsubyAkKEFQUF9MSUJfREVQUykgLW8gc290ZXN0CisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgc290ZXN0Lm8gZnJhbWV3b3JrLm8gJChMSUJTKSAtbyBzb3Rlc3QKIAogdnN0ZXN0OiB2c3Rlc3QubyBmcmFtZXdvcmsubyAkKExJQl9ERVApCi0JJChDQykgdnN0ZXN0Lm8gZnJhbWV3b3JrLm8gJChBUFBfTElCX0RFUFMpIC1vIHZzdGVzdAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHZzdGVzdC5vIGZyYW1ld29yay5vICQoTElCUykgLW8gdnN0ZXN0CiAKICMKICMgb2JqZWN0cwogIwogCiBmcmFtZXdvcmsubzogZnJhbWV3b3JrLmMgZnJhbWV3b3JrLmgKLQkkKENDKSAtYyAtSSQoSU5DRElSKSBmcmFtZXdvcmsuYyAtbyBmcmFtZXdvcmsubworCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBmcmFtZXdvcmsuYyAtbyBmcmFtZXdvcmsubwogCiBjbHRlc3QubzogY2x0ZXN0LmMgZnJhbWV3b3JrLmgKLQkkKENDKSAtYyAtSSQoSU5DRElSKSBjbHRlc3QuYyAtbyBjbHRlc3QubworCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBjbHRlc3QuYyAtbyBjbHRlc3QubwogCiBzb3Rlc3Qubzogc290ZXN0LmMgZnJhbWV3b3JrLmgKLQkkKENDKSAtYyAtSSQoSU5DRElSKSBzb3Rlc3QuYyAtbyBzb3Rlc3QubworCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBzb3Rlc3QuYyAtbyBzb3Rlc3QubwogCiB2c3Rlc3QubzogdnN0ZXN0LmMgZnJhbWV3b3JrLmgKLQkkKENDKSAtYyAtSSQoSU5DRElSKSB2c3Rlc3QuYyAtbyB2c3Rlc3QubworCSQoQ0MpIC1jIC1JJChJTkNESVIpICQoQ0ZMQUdTKSB2c3Rlc3QuYyAtbyB2c3Rlc3QubwogCmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy8uZ2l0aWdub3JlIGIvcHJvZ3MvdGVzdHMvLmdpdGlnbm9yZQppbmRleCA0MGNiNjg1Li5jNWI5ZTI4IDEwMDY0NAotLS0gYS9wcm9ncy90ZXN0cy8uZ2l0aWdub3JlCisrKyBiL3Byb2dzL3Rlc3RzLy5naXRpZ25vcmUKQEAgLTI2LDYgKzI2LDcgQEAKIGRpbm9zaGFkZQogZHJhd2J1ZmZlcnMKIGV4dGZ1bmNzLmgKK2V4YWN0cmFzdAogZmJvdGVzdDEKIGZib3Rlc3QyCiBmYm90ZXh0dXJlCkBAIC00MCw2ICs0MSw3IEBACiBpbnRlcmxlYXZlCiBpbnZlcnQKIGprcmFobnRlc3QKK2xpbmVjbGlwCiBtYW55dGV4CiBtaW5tYWcKIG1pcG1hcF9saW1pdHMKQEAgLTU2LDYgKzU4LDkgQEAKIHJlYWR0ZXguaAogc2VjY29sb3IKIHNoYXJlZHRleAorc2hhZGVyX2FwaQorc3RlbmNpbF90d29zaWRlCitzdGVuY2lsX3dyYXAKIHN0ZW5jaWx3cmFwCiBzdGVuY2lsX3dyYXAKIHN1YnRleApAQCAtNjksNiArNzQsNyBAQAogdGV4b2Jqc2hhcmUKIHRleHJlY3QKIHRleHdyYXAKK3VuZmlsbGVkY2xpcAogdmFvLTAxCiB2YW8tMDIKIHZwYXJyYXkKZGlmZiAtLWdpdCBhL3Byb2dzL3Rlc3RzL01ha2VmaWxlIGIvcHJvZ3MvdGVzdHMvTWFrZWZpbGUKaW5kZXggN2U4YzBjOC4uYjExMTE1NCAxMDA2NDQKLS0tIGEvcHJvZ3MvdGVzdHMvTWFrZWZpbGUKKysrIGIvcHJvZ3MvdGVzdHMvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiBpbmNsdWRlICQoVE9QKS9jb25maWdzL2N1cnJlbnQKIAogCi1MSUJTID0gJChBUFBfTElCX0RFUFMpCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xVVF9MSUIpIC1sJChHTFVfTElCKSAtbCQoR0xfTElCKSAkKEFQUF9MSUJfREVQUykKIAogU09VUkNFUyA9IFwKIAlhZnNtdWx0aWFyYi5jIFwKQEAgLTM3LDYgKzM3LDcgQEAKIAljdmEuYyBcCiAJZGlub3NoYWRlLmMgXAogCWRyYXdidWZmZXJzLmMgXAorCWV4YWN0cmFzdC5jIFwKIAlmbG9hdHRleC5jIFwKIAlmYm90ZXN0MS5jIFwKIAlmYm90ZXN0Mi5jIFwKQEAgLTUwLDYgKzUxLDcgQEAKIAlpbnRlcmxlYXZlLmMgXAogCWludmVydC5jIFwKIAlqa3JhaG50ZXN0LmMgXAorCWxpbmVjbGlwLmMgXAogCW1hbnl0ZXguYyBcCiAJbWlubWFnLmMgXAogCW1pcG1hcF9saW1pdHMuYyBcCkBAIC02Myw3ICs2NSw5IEBACiAJcmFuZG9tLmMgXAogCXJlYWRyYXRlLmMgXAogCXNlY2NvbG9yLmMgXAorCXNoYWRlcl9hcGkuYyBcCiAJc2hhcmVkdGV4LmMgXAorCXN0ZW5jaWxfdHdvc2lkZS5jIFwKIAlzdGVuY2lsd3JhcC5jIFwKIAlzdGVuY2lsX3dyYXAuYyBcCiAJc3VidGV4IFwKQEAgLTc1LDYgKzc5LDcgQEAKIAl0ZXhvYmpzaGFyZS5jIFwKIAl0ZXhyZWN0LmMgXAogCXRleHdyYXAuYyBcCisJdW5maWxsZWRjbGlwLmMgXAogCXZhby0wMS5jIFwKIAl2YW8tMDIuYyBcCiAJdnBhcnJheS5jIFwKQEAgLTk2LDEzICsxMDEsMjIgQEAKIFVUSUxfRklMRVMgPSByZWFkdGV4LmggcmVhZHRleC5jCiAKIAorIyMjIyMgVEFSR0VUUyAjIyMjIworCitkZWZhdWx0OiAkKFVUSUxfRklMRVMpICQoUFJPR1MpCisKK2NsZWFuOgorCS1ybSAtZiAkKFBST0dTKQorCS1ybSAtZiAqLm8KKwktcm0gLWYgZ2V0cHJvY2xpc3QuaAorCiAjIyMjIyBSVUxFUyAjIyMjIwogCiAuU1VGRklYRVM6CiAuU1VGRklYRVM6IC5jCiAKIC5jOgotCSQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPCAkKExJQlMpIC1vICRACisJJChDQykgJChJTkNMVURFUykgJChDRkxBR1MpICQoTERGTEFHUykgJDwgJChMSUJTKSAtbyAkQAogCiAuYy5vOgogCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACkBAIC0xMTAsMTcgKzEyNCw2IEBACiAuUy5vOgogCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICAkPCAtbyAkQAogCi0KLSMjIyMjIFRBUkdFVFMgIyMjIyMKLQotZGVmYXVsdDogJChVVElMX0ZJTEVTKSAkKFBST0dTKQotCi1jbGVhbjoKLQlybSAtZiAkKFBST0dTKQotCXJtIC1mICoubwotCXJtIC1mIGdldHByb2NsaXN0LmgKLQotCiAjIGF1dG8gY29kZSBnZW5lcmF0aW9uCiBnZXRwcm9jYWRkcmVzczogZ2V0cHJvY2FkZHJlc3MuYyBnZXRwcm9jbGlzdC5oCiAKQEAgLTEzMSwzNyArMTM0LDM3IEBACiAJJChDQykgJChDRkxBR1MpIGFycmF5dGV4dHVyZS5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACiAKIGFycmF5dGV4dHVyZS5vOiBhcnJheXRleHR1cmUuYyByZWFkdGV4LmgKLQkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQAorCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpIGFycmF5dGV4dHVyZS5jIC1vICRACiAKIGFmc211bHRpYXJiOiBhZnNtdWx0aWFyYi5vIHJlYWR0ZXgubwotCSQoQ0MpICQoQ0ZMQUdTKSBhZnNtdWx0aWFyYi5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgYWZzbXVsdGlhcmIubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAogCiBhZnNtdWx0aWFyYi5vOiBhZnNtdWx0aWFyYi5jIHJlYWR0ZXguaAotCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACisJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgYWZzbXVsdGlhcmIuYyAtbyAkQAogCiBkcmF3YnVmZmVyczogZHJhd2J1ZmZlcnMubwotCSQoQ0MpICQoQ0ZMQUdTKSBkcmF3YnVmZmVycy5vICQoTElCUykgLW8gJEAKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSBkcmF3YnVmZmVycy5vICQoTElCUykgLW8gJEAKIAogZHJhd2J1ZmZlcnMubzogZHJhd2J1ZmZlcnMuYyBleHRmdW5jcy5oCi0JJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgJDwgLW8gJEAKKwkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSBkcmF3YnVmZmVycy5jIC1vICRACiAKIHRleHJlY3Q6IHRleHJlY3QubyByZWFkdGV4Lm8KLQkkKENDKSAkKENGTEFHUykgdGV4cmVjdC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgdGV4cmVjdC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACiAKIHRleHJlY3QubzogdGV4cmVjdC5jIHJlYWR0ZXguaAotCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACisJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgdGV4cmVjdC5jIC1vICRACiAKIGJ1Z18zMTk1OiBidWdfMzE5NS5vIHJlYWR0ZXgubwotCSQoQ0MpICQoQ0ZMQUdTKSBidWdfMzE5NS5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgYnVnXzMxOTUubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAogCiBidWdfMzE5NS5vOiBidWdfMzE5NS5jIHJlYWR0ZXguaAotCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACisJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgYnVnXzMxOTUuYyAtbyAkQAogCiBpbnZlcnQ6IGludmVydC5vIHJlYWR0ZXgubwotCSQoQ0MpICQoQ0ZMQUdTKSBpbnZlcnQubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIGludmVydC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACiAKIGludmVydC5vOiBpbnZlcnQuYyByZWFkdGV4LmgKLQkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQAorCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpIGludmVydC5jIC1vICRACiAKIG1pcG1hcF92aWV3OiBtaXBtYXBfdmlldy5vIHJlYWR0ZXgubwogCSQoQ0MpICQoQ0ZMQUdTKSBtaXBtYXBfdmlldy5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACkBAIC0xNzksNyArMTgyLDcgQEAKIAogCiByZWFkdGV4Lm86IHJlYWR0ZXguYwotCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACisJJChDQykgLWMgJChJTkNMVURFUykgJChDRkxBR1MpICQoREVGSU5FUykgcmVhZHRleC5jIC1vICRACiAKIAogcmVhZHRleC5oOiAkKFRPUCkvcHJvZ3MvdXRpbC9yZWFkdGV4LmgKZGlmZiAtLWdpdCBhL3Byb2dzL3Rlc3RzL2FudGlhbGlhcy5jIGIvcHJvZ3MvdGVzdHMvYW50aWFsaWFzLmMKaW5kZXggM2E4M2MzNC4uZjIzYjVhZiAxMDA2NDQKLS0tIGEvcHJvZ3MvdGVzdHMvYW50aWFsaWFzLmMKKysrIGIvcHJvZ3MvdGVzdHMvYW50aWFsaWFzLmMKQEAgLTE1LDYgKzE1LDcgQEAKIHN0YXRpYyBHTGZsb2F0IFpyb3QgPSAwOwogc3RhdGljIEdMYm9vbGVhbiBBbmltID0gR0xfVFJVRTsKIHN0YXRpYyBHTGJvb2xlYW4gSGF2ZU11bHRpc2FtcGxlID0gR0xfVFJVRTsKK3N0YXRpYyBHTGJvb2xlYW4gRG9NdWx0aXNhbXBsZSA9IEdMX1RSVUU7CiAKIAogc3RhdGljIHZvaWQKQEAgLTg1LDcgKzg2LDEwIEBACiAgICBnbENvbG9yM2YoMSwgMSwgMSk7CiAgICBpZiAoSGF2ZU11bHRpc2FtcGxlKSB7CiAgICAgICBnbFJhc3RlclBvczJmKC0zLjEsIC0xLjYpOwotICAgICAgUHJpbnRTdHJpbmcoIk1VTFRJU0FNUExFIik7CisgICAgICBpZiAoRG9NdWx0aXNhbXBsZSkKKyAgICAgICAgIFByaW50U3RyaW5nKCJNVUxUSVNBTVBMRSIpOworICAgICAgZWxzZQorICAgICAgICAgUHJpbnRTdHJpbmcoIk1VTFRJU0FNUExFIChvZmYpIik7CiAgICB9CiAgICBnbFJhc3RlclBvczJmKC0wLjgsIC0xLjYpOwogICAgUHJpbnRTdHJpbmcoIk5vIGFudGlhbGlhc2luZyIpOwpAQCAtOTUsNyArOTksOCBAQAogICAgLyogbXVsdGlzYW1wbGUgKi8KICAgIGlmIChIYXZlTXVsdGlzYW1wbGUpIHsKICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgICAgZ2xFbmFibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKKyAgICAgIGlmIChEb011bHRpc2FtcGxlKQorICAgICAgICAgZ2xFbmFibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKICAgICAgIGdsUHVzaE1hdHJpeCgpOwogICAgICAgZ2xUcmFuc2xhdGVmKC0yLjUsIDAsIDApOwogICAgICAgZ2xQdXNoTWF0cml4KCk7CkBAIC0xNzIsNiArMTc3LDkgQEAKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGdsdXRJZGxlRnVuYyhOVUxMKTsKICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbSc6CisgICAgICAgICBEb011bHRpc2FtcGxlID0gIURvTXVsdGlzYW1wbGU7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgJ3onOgogICAgICAgICAgWnJvdCA9IChpbnQpIChacm90IC0gc3RlcCk7CiAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3Byb2dzL3Rlc3RzL2N2YS5jIGIvcHJvZ3MvdGVzdHMvY3ZhLmMKaW5kZXggYTQ3YjJhOS4uYTkzOTNhZSAxMDA2NDQKLS0tIGEvcHJvZ3MvdGVzdHMvY3ZhLmMKKysrIGIvcHJvZ3MvdGVzdHMvY3ZhLmMKQEAgLTEwLDE3ICsxMCwxMyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgX19WTVMKLSMgaW5jbHVkZSA8c3RkZGVmLmg+CS8qIGZvciBwdHJkaWZmX3QsIHJlZmVyZW5jZWQgYnkgR0wuaCB3aGVuIEdMX0dMRVhUX0xFR0FDWSBkZWZpbmVkICovCi0jZWxzZQotIyBpbmNsdWRlIDxtYWxsb2MuaD4JLyogZm9yIHB0cmRpZmZfdCwgcmVmZXJlbmNlZCBieSBHTC5oIHdoZW4gR0xfR0xFWFRfTEVHQUNZIGRlZmluZWQgKi8KLSNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPgkvKiBmb3IgcHRyZGlmZl90LCByZWZlcmVuY2VkIGJ5IEdMLmggd2hlbiBHTF9HTEVYVF9MRUdBQ1kgZGVmaW5lZCAqLwogI2lmZGVmIF9XSU4zMgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNlbmRpZgogI2RlZmluZSBHTF9HTEVYVF9MRUdBQ1kKICNpbmNsdWRlIDxHTC9nbHV0Lmg+Ci0KKyNpbmNsdWRlIDxHTC9nbGV4dC5oPgogCiBHTGZsb2F0IHZlcnRzW11bNF0gPSB7CiAgICB7IC0wLjUsIC0wLjUsIC0yLjAsIDAuMCB9LApkaWZmIC0tZ2l0IGEvcHJvZ3MvdGVzdHMvZGlub3NoYWRlLmMgYi9wcm9ncy90ZXN0cy9kaW5vc2hhZGUuYwppbmRleCBlZDdiODc5Li41MDRiNGFmIDEwMDY0NAotLS0gYS9wcm9ncy90ZXN0cy9kaW5vc2hhZGUuYworKysgYi9wcm9ncy90ZXN0cy9kaW5vc2hhZGUuYwpAQCAtMzgsMTEgKzM4LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxtYXRoLmg+ICAgICAgIC8qIGZvciBjb3MoKSwgc2luKCksIGFuZCBzcXJ0KCkgKi8KLSNpZmRlZiBfX1ZNUwotIyBpbmNsdWRlIDxzdGRkZWYuaD4JLyogZm9yIHB0cmRpZmZfdCwgcmVmZXJlbmNlZCBieSBHTC5oIHdoZW4gR0xfR0xFWFRfTEVHQUNZIGRlZmluZWQgKi8KLSNlbHNlCi0jIGluY2x1ZGUgPG1hbGxvYy5oPgkvKiBmb3IgcHRyZGlmZl90LCByZWZlcmVuY2VkIGJ5IEdMLmggd2hlbiBHTF9HTEVYVF9MRUdBQ1kgZGVmaW5lZCAqLwotI2VuZGlmCisjaW5jbHVkZSA8c3RkZGVmLmg+CS8qIGZvciBwdHJkaWZmX3QsIHJlZmVyZW5jZWQgYnkgR0wuaCB3aGVuIEdMX0dMRVhUX0xFR0FDWSBkZWZpbmVkICovCiAjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy9leGFjdHJhc3QuYyBiL3Byb2dzL3Rlc3RzL2V4YWN0cmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzBjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy90ZXN0cy9leGFjdHJhc3QuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiBUZXN0IGZvciBleGFjdCBwb2ludC9saW5lL3BvbHlnb24gcmFzdGVyaXphdGlvbiwgb3IgYXQgbGVhc3QgcmFzdGVyaXphdGlvbgorICogdGhhdCBmaXRzIHRoZSB0b2xlcmFuY2Ugb2YgdGhlIE9wZW5HTCBzcGVjLgorICoKKyAqIEJyaWFuIFBhdWwKKyAqIDkgTm92IDIwMDcKKyAqLworCisvKgorICogTm90ZXM6CisgKiAtICdtJyB0byBjeWNsZSB0aHJvdWdoIHBvaW50LCBobGluZSwgdmxpbmUgYW5kIHF1YWQgZHJhd2luZworICogLSBVc2UgY3Vyc29yIGtleXMgdG8gdHJhbnNsYXRlIGNvb3JkaW5hdGVzICh6IHRvIHJlc2V0KQorICogLSBSZXNpemUgd2luZG93IHRvIGNoZWNrIGZvciBwcm9wZXIgcmFzdGVyaXphdGlvbgorICogLSBNYWtlIHN1cmUgeW91ciBMQ0QgaXMgcnVubmluZyBpbiBpdHMgbmF0aXZlIHJlc29sdXRpb24KKyAqICAgCisgKiBJZiB0cmFuc2xhdGlvbiBpcyAoMCwwKToKKyAqICBhIHBvaW50IHdpbGwgYmUgZHJhd24gd2hlcmUgeCUyPT0wIGFuZCB5JTI9PTAsCisgKiAgYSBob3Jpem9udGFsIGxpbmUgd2lsbCBiZSBkcmF3biB3aGVyZSB4JTI9PTAsCisgKiAgYSB2ZXJ0aWNhbCBsaW5lIHdpbGwgYmUgZHJhd24gd2hlcmUgeSUyPT0wLAorICogIGZvciBxdWFkcywgcGl4ZWxzIHdpbGwgYmUgc2V0IHdoZXJlICh4JTQpIT0zIGFuZCAoeSU0KSE9MworICoKKyAqIFhYWCB0b2RvOiBkbyBnbFJlYWRQaXhlbHMgYW5kIHRlc3QgdGhhdCB0aGUgcmVzdWx0cyBhcmUgd2hhdCdzIGV4cGVjdGVkLgorICogVXBvbiBmYWlsdXJlLCBpdGVyYXRlIG92ZXIgc3ViLXBpeGVsIHRyYW5zbGF0aW9ucyB0byBmaW5kIHRoZSBpZGVhbCBvZmZzZXQuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxHTC9nbHV0Lmg+CisKK3N0YXRpYyBpbnQgV2lkdGggPSA0MDAsIEhlaWdodCA9IDQwMDsKK3N0YXRpYyBpbnQgV2luOworc3RhdGljIGZsb2F0IFh0cmFucyA9IDAsIFl0cmFucyA9IDA7CitzdGF0aWMgZmxvYXQgU3RlcCA9IDAuMTI1OworCitlbnVtIHsKKyAgIFBPSU5UUywKKyAgIEhMSU5FUywKKyAgIFZMSU5FUywKKyAgIFFVQURTLAorICAgTlVNX01PREVTCit9OworCitzdGF0aWMgaW50IE1vZGUgPSBQT0lOVFM7CisKKworc3RhdGljIHZvaWQKK0RyYXcodm9pZCkKK3sKKyAgIC8qIFNlZSB0aGUgT3BlbkdMIFByb2dyYW1taW5nIEd1aWRlLCBBcHBlbmRpeCBILCAiT3BlbkdMIENvcnJlY3RuZXNzIFRpcHMiCisgICAgKiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIDAuMzc1IHRyYW5zbGF0aW9uIGZhY3Rvci4KKyAgICAqLworICAgZmxvYXQgdHggPSAwLjM3NSwgdHkgPSAwLjM3NTsKKyAgIGludCBpLCBqOworCisgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFRyYW5zbGF0ZWYodHggKyBYdHJhbnMsIHR5ICsgWXRyYW5zLCAwKTsKKworICAgaWYgKE1vZGUgPT0gUE9JTlRTKSB7CisgICAgICBnbEJlZ2luKEdMX1BPSU5UUyk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgSGVpZ2h0OyBqICs9IDIpIHsKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBXaWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBnbFZlcnRleDJmKGksIGopOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZ2xFbmQoKTsKKyAgIH0KKyAgIGVsc2UgaWYgKE1vZGUgPT0gSExJTkVTKSB7CisgICAgICBnbEJlZ2luKEdMX0xJTkVTKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBIZWlnaHQ7IGkgKz0gMikgeworICAgICAgICAgZ2xWZXJ0ZXgyZigwLCAgICAgaSk7CisgICAgICAgICBnbFZlcnRleDJmKFdpZHRoLCBpKTsKKyAgICAgIH0KKyAgICAgIGdsRW5kKCk7CisgICB9CisgICBlbHNlIGlmIChNb2RlID09IFZMSU5FUykgeworICAgICAgZ2xCZWdpbihHTF9MSU5FUyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgV2lkdGg7IGkgKz0gMikgeworICAgICAgICAgZ2xWZXJ0ZXgyZihpLCAwICAgICApOworICAgICAgICAgZ2xWZXJ0ZXgyZihpLCBIZWlnaHQpOworICAgICAgfQorICAgICAgZ2xFbmQoKTsKKyAgIH0KKyAgIGVsc2UgaWYgKE1vZGUgPT0gUVVBRFMpIHsKKyAgICAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgICAgZm9yIChqID0gMDsgaiA8IEhlaWdodDsgaiArPSA0KSB7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgV2lkdGg7IGkgKz0gNCkgeworICAgICAgICAgICAgZ2xWZXJ0ZXgyZihpLCAgICAgaiAgICApOworICAgICAgICAgICAgZ2xWZXJ0ZXgyZihpICsgMywgaiAgICApOworICAgICAgICAgICAgZ2xWZXJ0ZXgyZihpICsgMywgaiArIDMpOworICAgICAgICAgICAgZ2xWZXJ0ZXgyZihpLCAgICAgaiArIDMpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZ2xFbmQoKTsKKyAgIH0KKworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisKKworc3RhdGljIHZvaWQKK1Jlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgV2lkdGggPSB3aWR0aDsKKyAgIEhlaWdodCA9IGhlaWdodDsKKyAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xPcnRobygwLCB3aWR0aCwgMCwgaGVpZ2h0LCAtMSwgMSk7CisgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgIGdsTG9hZElkZW50aXR5KCk7Cit9CisKKworc3RhdGljIHZvaWQKK0tleSh1bnNpZ25lZCBjaGFyIGtleSwgaW50IHgsIGludCB5KQoreworICAgKHZvaWQpIHg7CisgICAodm9pZCkgeTsKKyAgIHN3aXRjaCAoa2V5KSB7CisgICBjYXNlICdtJzoKKyAgIGNhc2UgJ00nOgorICAgICAgTW9kZSA9IChNb2RlICsgMSkgJSBOVU1fTU9ERVM7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3onOgorICAgY2FzZSAnWic6CisgICAgICBYdHJhbnMgPSBZdHJhbnMgPSAwOworICAgICAgcHJpbnRmKCJUcmFuc2xhdGlvbjogJWYsICVmXG4iLCBYdHJhbnMsIFl0cmFucyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgMjc6CisgICAgICBnbHV0RGVzdHJveVdpbmRvdyhXaW4pOworICAgICAgZXhpdCgwKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZAorU3BlY2lhbEtleShpbnQga2V5LCBpbnQgeCwgaW50IHkpCit7CisgICAodm9pZCkgeDsKKyAgICh2b2lkKSB5OworICAgc3dpdGNoIChrZXkpIHsKKyAgIGNhc2UgR0xVVF9LRVlfVVA6CisgICAgICBZdHJhbnMgKz0gU3RlcDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFVUX0tFWV9ET1dOOgorICAgICAgWXRyYW5zIC09IFN0ZXA7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xVVF9LRVlfTEVGVDoKKyAgICAgIFh0cmFucyAtPSBTdGVwOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMVVRfS0VZX1JJR0hUOgorICAgICAgWHRyYW5zICs9IFN0ZXA7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CisgICBwcmludGYoIlRyYW5zbGF0aW9uOiAlZiwgJWZcbiIsIFh0cmFucywgWXRyYW5zKTsKK30KKworCitzdGF0aWMgdm9pZAorSW5pdCh2b2lkKQoreworfQorCisKK3N0YXRpYyB2b2lkCitVc2FnZSh2b2lkKQoreworICAgcHJpbnRmKCJLZXlzOlxuIik7CisgICBwcmludGYoIiAgdXAvZG93bi9sZWZ0L3JpZ2h0IC0gdHJhbnNsYXRlIGJ5ICVmXG4iLCBTdGVwKTsKKyAgIHByaW50ZigiICB6IC0gcmVzZXQgdHJhbnNsYXRpb24gdG8gemVyb1xuIik7CisgICBwcmludGYoIiAgbSAtIGNoYW5nZSByZW5kZXJpbmcgbW9kZSAocG9pbnRzLCBobGluZXMsIHZsaW5lcywgcXVhZHMpXG4iKTsKKyAgIHByaW50ZigiICBFc2MgLSBleGl0XG4iKTsKK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKyAgIGdsdXRJbml0V2luZG93UG9zaXRpb24oMCwgMCk7CisgICBnbHV0SW5pdFdpbmRvd1NpemUoV2lkdGgsIEhlaWdodCk7CisgICBnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCIHwgR0xVVF9ET1VCTEUpOworICAgV2luID0gZ2x1dENyZWF0ZVdpbmRvdyhhcmd2WzBdKTsKKyAgIGdsdXRSZXNoYXBlRnVuYyhSZXNoYXBlKTsKKyAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKKyAgIGdsdXRTcGVjaWFsRnVuYyhTcGVjaWFsS2V5KTsKKyAgIGdsdXREaXNwbGF5RnVuYyhEcmF3KTsKKyAgIEluaXQoKTsKKyAgIFVzYWdlKCk7CisgICBnbHV0TWFpbkxvb3AoKTsKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3MvdGVzdHMvZmJvdGV4dHVyZS5jIGIvcHJvZ3MvdGVzdHMvZmJvdGV4dHVyZS5jCmluZGV4IGFhOWY2MTcuLjg4ZDA1NDkgMTAwNjQ0Ci0tLSBhL3Byb2dzL3Rlc3RzL2Zib3RleHR1cmUuYworKysgYi9wcm9ncy90ZXN0cy9mYm90ZXh0dXJlLmMKQEAgLTM4LDYgKzM4LDggQEAKIHN0YXRpYyBHTGJvb2xlYW4gVXNlUGFja2VkRGVwdGhTdGVuY2lsID0gR0xfRkFMU0U7CiBzdGF0aWMgR0x1aW50IFRleHR1cmVMZXZlbCA9IDE7ICAvKiB3aGljaCB0ZXh0dXJlIGxldmVsIHRvIHJlbmRlciB0byAqLwogc3RhdGljIEdMZW51bSBUZXhJbnRGb3JtYXQgPSBHTF9SR0I7IC8qIGVpdGhlciBHTF9SR0Igb3IgR0xfUkdCQSAqLworc3RhdGljIEdMYm9vbGVhbiBDdWxsID0gR0xfRkFMU0U7CitzdGF0aWMgR0xib29sZWFuIFdpcmVmcmFtZSA9IEdMX0ZBTFNFOwogCiAKIHN0YXRpYyB2b2lkCkBAIC0xMTUsNiArMTE3LDIyIEBACiAKICAgIENoZWNrRXJyb3IoX19MSU5FX18pOwogCisgICBpZiAoV2lyZWZyYW1lKSB7CisgICAgICBnbFBvbHlnb25Nb2RlKEdMX0ZST05ULCBHTF9MSU5FKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZ2xQb2x5Z29uTW9kZShHTF9GUk9OVCwgR0xfRklMTCk7CisgICB9CisKKyAgIGlmIChDdWxsKSB7CisgICAgICAvKiBjdWxsIGJhY2sgKi8KKyAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgfQorICAgZWxzZSB7CisgICAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgIH0KKwogI2lmIDAKICAgIGdsQmVnaW4oR0xfUE9MWUdPTik7CiAgICBnbENvbG9yM2YoMSwgMCwgMCk7CkBAIC0xMjksNyArMTQ3LDkgQEAKICAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CiAgICBnbFB1c2hNYXRyaXgoKTsKICAgIGdsUm90YXRlZigwLjUgKiBSb3QsIDEuMCwgMC4wLCAwLjApOworICAgZ2xGcm9udEZhY2UoR0xfQ1cpOyAvKiBUZWFwb3QgcGF0Y2hlcyBiYWNrd2FyZCAqLwogICAgZ2x1dFNvbGlkVGVhcG90KDAuNSk7CisgICBnbEZyb250RmFjZShHTF9DQ1cpOwogICAgZ2xQb3BNYXRyaXgoKTsKICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiAgICAvKgpAQCAtMTM5LDYgKzE1OSw4IEBACiAKICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKICAgIGdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1QpOworICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9GSUxMKTsKIAogI2lmIERSQVcKICAgIC8qIEJpbmQgbm9ybWFsIGZyYW1lYnVmZmVyICovCkBAIC0yNDUsMjUgKzI2Nyw0NiBAQAogICAgKHZvaWQpIHg7CiAgICAodm9pZCkgeTsKICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgICBjYXNlICdhJzoKLSAgICAgICAgIEFuaW0gPSAhQW5pbTsKLSAgICAgICAgIGlmIChBbmltKQotICAgICAgICAgICAgZ2x1dElkbGVGdW5jKElkbGUpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2x1dElkbGVGdW5jKE5VTEwpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzoKLSAgICAgICAgIFJvdCArPSAyLjA7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjc6Ci0gICAgICAgICBDbGVhblVwKCk7Ci0gICAgICAgICBicmVhazsKKyAgIGNhc2UgJ2EnOgorICAgICAgQW5pbSA9ICFBbmltOworICAgICAgaWYgKEFuaW0pCisgICAgICAgICBnbHV0SWRsZUZ1bmMoSWRsZSk7CisgICAgICBlbHNlCisgICAgICAgICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ2MnOgorICAgICAgQ3VsbCA9ICFDdWxsOworICAgICAgYnJlYWs7CisgICBjYXNlICd3JzoKKyAgICAgIFdpcmVmcmFtZSA9ICFXaXJlZnJhbWU7CisgICAgICBicmVhazsKKyAgIGNhc2UgJ3MnOgorICAgICAgUm90ICs9IDIuMDsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnUyc6CisgICAgICBSb3QgLT0gMi4wOworICAgICAgYnJlYWs7CisgICBjYXNlIDI3OgorICAgICAgQ2xlYW5VcCgpOworICAgICAgYnJlYWs7CiAgICB9CiAgICBnbHV0UG9zdFJlZGlzcGxheSgpOwogfQogCiAKIHN0YXRpYyB2b2lkCitVc2FnZSh2b2lkKQoreworICAgcHJpbnRmKCJVc2FnZTpcbiIpOworICAgcHJpbnRmKCIgIGEgICAgVG9nZ2xlIGFuaW1hdGlvblxuIik7CisgICBwcmludGYoIiAgcy9zICBTdGVwL3JvdGF0ZVxuIik7CisgICBwcmludGYoIiAgYyAgICBUb2dnbGUgYmFjay1mYWNlIGN1bGxpbmdcbiIpOworICAgcHJpbnRmKCIgIHcgICAgVG9nZ2xlIHdpcmVmcmFtZSBtb2RlIChmcm9udC1mYWNlIG9ubHkpXG4iKTsKKyAgIHByaW50ZigiICBFc2MgIEV4aXRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCiBJbml0KGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAgICBzdGF0aWMgY29uc3QgR0xmbG9hdCBtYXRbNF0gPSB7IDEuMCwgMC41LCAwLjUsIDEuMCB9OwpAQCAtNDAyLDYgKzQ0NSw3IEBACiAgICBpZiAoQW5pbSkKICAgICAgIGdsdXRJZGxlRnVuYyhJZGxlKTsKICAgIEluaXQoYXJnYywgYXJndik7CisgICBVc2FnZSgpOwogICAgZ2x1dE1haW5Mb29wKCk7CiAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Byb2dzL3Rlc3RzL2xpbmVjbGlwLmMgYi9wcm9ncy90ZXN0cy9saW5lY2xpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OGY1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy90ZXN0cy9saW5lY2xpcC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxHTC9nbHV0Lmg+CisKK3N0YXRpYyBpbnQgd2luX3dpZHRoLCB3aW5faGVpZ2h0OworCitzdGF0aWMgdm9pZAorbGluZShHTGZsb2F0IHgxLCBHTGZsb2F0IHkxLCBHTGZsb2F0IHgyLCBHTGZsb2F0IHkyKQoreworCWdsQmVnaW4oR0xfTElORVMpOworCWdsVmVydGV4MmYoeDEsIHkxKTsKKwlnbFZlcnRleDJmKHgyLCB5Mik7CisJZ2xFbmQoKTsKK30KKworc3RhdGljIHZvaWQKK2xpbmUzKEdMZmxvYXQgeDEsIEdMZmxvYXQgeTEsIEdMZmxvYXQgejEsIEdMZmxvYXQgeDIsIEdMZmxvYXQgeTIsIEdMZmxvYXQgejIpCit7CisJZ2xCZWdpbihHTF9MSU5FUyk7CisJZ2xWZXJ0ZXgzZih4MSwgeTEsIHoxKTsKKwlnbFZlcnRleDNmKHgyLCB5MiwgejIpOworCWdsRW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5KHZvaWQpCit7CisJZ2xDbGVhckNvbG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7CisJZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworCWdsQ29sb3IzZigxLjAsIDAuMCwgMC4wKTsKKwkvKiAyIGxpbmVzIGNsaXBwZWQgYWxvbmcgeG1pbiAqLworCWxpbmUoLTIwLCB3aW5faGVpZ2h0IC8gMiAtIDIwLAorCSAgICAgIDIwLCB3aW5faGVpZ2h0IC8gMiAtIDIwKTsKKwlsaW5lKCAyMCwgd2luX2hlaWdodCAvIDIgKyAyMCwKKwkgICAgIC0yMCwgd2luX2hlaWdodCAvIDIgKyAyMCk7CisKKwlnbENvbG9yM2YoMC4wLCAxLjAsIDAuMCk7CisJLyogMiBsaW5lcyBjbGlwcGVkIGFsb25nIHltYXggKi8KKwlsaW5lKHdpbl93aWR0aCAvIDIgLSAyMCwgd2luX2hlaWdodCArIDIwLAorCSAgICAgd2luX3dpZHRoIC8gMiAtIDIwLCB3aW5faGVpZ2h0IC0gMjApOworCWxpbmUod2luX3dpZHRoIC8gMiArIDIwLCB3aW5faGVpZ2h0IC0gMjAsCisJICAgICB3aW5fd2lkdGggLyAyICsgMjAsIHdpbl9oZWlnaHQgKyAyMCk7CisKKwlnbENvbG9yM2YoMC4wLCAwLjAsIDEuMCk7CisJLyogMiBsaW5lcyBjbGlwcGVkIGFsb25nIHhtYXggKi8KKwlsaW5lKHdpbl93aWR0aCAtIDIwLCB3aW5faGVpZ2h0IC8gMiAtIDIwLAorCSAgICAgd2luX3dpZHRoICsgMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjApOworCWxpbmUod2luX3dpZHRoICsgMjAsIHdpbl9oZWlnaHQgLyAyICsgMjAsCisJICAgICB3aW5fd2lkdGggLSAyMCwgd2luX2hlaWdodCAvIDIgKyAyMCk7CisKKwlnbENvbG9yM2YoMS4wLCAxLjAsIDEuMCk7CisJLyogMiBsaW5lcyBjbGlwcGVkIGFsb25nIHltaW4gKi8KKwlsaW5lKHdpbl93aWR0aCAvIDIgLSAyMCwgIDIwLAorCSAgICAgd2luX3dpZHRoIC8gMiAtIDIwLCAtMjApOworCWxpbmUod2luX3dpZHRoIC8gMiArIDIwLCAtMjAsCisJICAgICB3aW5fd2lkdGggLyAyICsgMjAsICAyMCk7CisKKwkvKiAyIGxpbmVzIGNsaXBwZWQgYWxvbmcgbmVhciAqLworCWdsQ29sb3IzZigxLjAsIDAuMCwgMS4wKTsKKwlsaW5lMyh3aW5fd2lkdGggLyAyIC0gMjAgLSAyMCwgd2luX2hlaWdodCAvIDIsICAgICAgIDAuNSwKKwkgICAgICB3aW5fd2lkdGggLyAyIC0gMjAgKyAyMCwgd2luX2hlaWdodCAvIDIsICAgICAgLTAuNSk7CisJbGluZTMod2luX3dpZHRoIC8gMiAtIDIwLCAgICAgIHdpbl9oZWlnaHQgLyAyIC0gMjAsIC0wLjUsCisJICAgICAgd2luX3dpZHRoIC8gMiAtIDIwLCAgICAgIHdpbl9oZWlnaHQgLyAyICsgMjAsICAwLjUpOworCisJLyogMiBsaW5lcyBjbGlwcGVkIGFsb25nIGZhciAqLworCWdsQ29sb3IzZigwLjAsIDEuMCwgMS4wKTsKKwlsaW5lMyh3aW5fd2lkdGggLyAyICsgMjAgLSAyMCwgd2luX2hlaWdodCAvIDIsICAgICAgMS41LAorCSAgICAgIHdpbl93aWR0aCAvIDIgKyAyMCArIDIwLCB3aW5faGVpZ2h0IC8gMiwgICAgICAwLjUpOworCWxpbmUzKHdpbl93aWR0aCAvIDIgKyAyMCwgICAgICB3aW5faGVpZ2h0IC8gMiAtIDIwLCAwLjUsCisJICAgICAgd2luX3dpZHRoIC8gMiArIDIwLCAgICAgIHdpbl9oZWlnaHQgLyAyICsgMjAsIDEuNSk7CisKKwkvKiBlbnRpcmVseSBjbGlwcGVkIGFsb25nIG5lYXIvZmFyICovCisJZ2xDb2xvcjNmKC41LCAuNSwgLjUpOworCWxpbmUzKHdpbl93aWR0aCAvIDIsIHdpbl9oZWlnaHQgLyAyIC0gMjAsIC0wLjUsCisJICAgICAgd2luX3dpZHRoIC8gMiwgd2luX2hlaWdodCAvIDIgKyAyMCwgLTAuNSk7CisJZ2xDb2xvcjNmKC41LCAuNSwgLjUpOworCWxpbmUzKHdpbl93aWR0aCAvIDIsIHdpbl9oZWlnaHQgLyAyIC0gMjAsIDEuNSwKKwkgICAgICB3aW5fd2lkdGggLyAyLCB3aW5faGVpZ2h0IC8gMiArIDIwLCAxLjUpOworCisJZ2xDb2xvcjNmKDEuMCwgMS4wLCAwLjApOworCS8qIGxpbmVzIGNsaXBwZWQgYWxvbmcgYm90aCB4IGFuZCB5IGxpbWl0cyAqLworCWxpbmUoLTUsIDIwLAorCSAgICAgMjAsIC01KTsgLyogeG1pbiwgeW1pbiAqLworCWxpbmUoLTUsIHdpbl9oZWlnaHQgLSAyMCwKKwkgICAgIDIwLCB3aW5faGVpZ2h0ICsgNSk7IC8qIHhtaW4sIHltYXggKi8KKwlsaW5lKHdpbl93aWR0aCAtIDIwLCAtNSwKKwkgICAgIHdpbl93aWR0aCArIDUsICAyMCk7IC8qIHhtYXgsIHltaW4gKi8KKwlsaW5lKHdpbl93aWR0aCAtIDIwLCB3aW5faGVpZ2h0ICsgNSwKKwkgICAgIHdpbl93aWR0aCArIDUsICB3aW5faGVpZ2h0IC0gMjApOyAvKiB4bWF4LCB5bWF4ICovCisKKwlnbHV0U3dhcEJ1ZmZlcnMoKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXdpbl93aWR0aCA9IHdpZHRoOworCXdpbl9oZWlnaHQgPSBoZWlnaHQ7CisJZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworCWdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKwlnbExvYWRJZGVudGl0eSgpOworCWdsT3J0aG8oMCwgd2luX3dpZHRoLCAwLCB3aW5faGVpZ2h0LCAwLjAsIC0xLjApOworCisJZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisJZ2xMb2FkSWRlbnRpdHkoKTsKKwlnbFRyYW5zbGF0ZWYoLjI1LCAuMjUsIDApOworfQorCitzdGF0aWMgdm9pZCBrZXkoIHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkgKQoreworCSh2b2lkKSB4OworCSh2b2lkKSB5OworCisJc3dpdGNoIChrZXkpIHsKKwljYXNlIDI3OiAvKiBlc2MgKi8KKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJfQorCisJZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworc3RhdGljIHZvaWQKK2luaXQodm9pZCkKK3sKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJd2luX3dpZHRoID0gMjAwOworCXdpbl9oZWlnaHQgPSAyMDA7CisKKwlnbHV0SW5pdCgmYXJnYywgYXJndik7CisJZ2x1dEluaXRXaW5kb3dQb3NpdGlvbigwLCAwKTsKKwlnbHV0SW5pdFdpbmRvd1NpemUod2luX3dpZHRoLCB3aW5faGVpZ2h0KTsKKwlnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCIHwgR0xVVF9ET1VCTEUgfCBHTFVUX0RFUFRIKTsKKwlnbHV0Q3JlYXRlV2luZG93KGFyZ3ZbMF0pOworCWdsdXRSZXNoYXBlRnVuYyhyZXNoYXBlKTsKKwlnbHV0S2V5Ym9hcmRGdW5jKGtleSk7CisJZ2x1dERpc3BsYXlGdW5jKGRpc3BsYXkpOworCisJaW5pdCgpOworCisJZ2x1dE1haW5Mb29wKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy9tdWx0aXBhbC5jIGIvcHJvZ3MvdGVzdHMvbXVsdGlwYWwuYwppbmRleCA1MjgxOGZjLi43YmQ0NDczIDEwMDY0NAotLS0gYS9wcm9ncy90ZXN0cy9tdWx0aXBhbC5jCisrKyBiL3Byb2dzL3Rlc3RzL211bHRpcGFsLmMKQEAgLTgsMTEgKzgsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgX19WTVMKLSMgaW5jbHVkZSA8c3RkZGVmLmg+CS8qIGZvciBwdHJkaWZmX3QsIHJlZmVyZW5jZWQgYnkgR0wuaCB3aGVuIEdMX0dMRVhUX0xFR0FDWSBkZWZpbmVkICovCi0jZWxzZQotIyBpbmNsdWRlIDxtYWxsb2MuaD4JLyogZm9yIHB0cmRpZmZfdCwgcmVmZXJlbmNlZCBieSBHTC5oIHdoZW4gR0xfR0xFWFRfTEVHQUNZIGRlZmluZWQgKi8KLSNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPgkvKiBmb3IgcHRyZGlmZl90LCByZWZlcmVuY2VkIGJ5IEdMLmggd2hlbiBHTF9HTEVYVF9MRUdBQ1kgZGVmaW5lZCAqLwogI2lmZGVmIF9XSU4zMgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvcHJvZ3MvdGVzdHMvc2hhZGVyX2FwaS5jIGIvcHJvZ3MvdGVzdHMvc2hhZGVyX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGYwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy90ZXN0cy9zaGFkZXJfYXBpLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qIFRlc3RzIHRvIHZhbGlkYXRlIGZpeGVzIHRvIHZhcmlvdXMgYnVncyBpbiBzcmMvbWVzYS9zaGFkZXIvc2hhZGVyX2FwaS5jCisgKgorICogV3JpdHRlbiBieSBCcnVjZSBNZXJyeQorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUworI2luY2x1ZGUgPEdML2dsdXQuaD4KKworc3RhdGljIHZvaWQgYXNzZXJ0X3Rlc3QoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb25kLCBjb25zdCBjaGFyICptc2cpCit7CisgICBpZiAoIWNvbmQpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkIGFzc2VydGlvbiBcIiVzXCIgZmFpbGVkXG4iLCBmaWxlLCBsaW5lLCBtc2cpOworfQorCisjdW5kZWYgYXNzZXJ0CisjZGVmaW5lIGFzc2VydCh4KSBhc3NlcnRfdGVzdChfX0ZJTEVfXywgX19MSU5FX18sICh4KSwgI3gpCisKK3N0YXRpYyB2b2lkIGFzc2VydF9ub19lcnJvcl90ZXN0KGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgR0xlbnVtIGVycjsKKworICAgZXJyID0gZ2xHZXRFcnJvcigpOworICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQgcmVjZWl2ZWQgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGdsdUVycm9yU3RyaW5nKGVycikpOworfQorCisjZGVmaW5lIGFzc2VydF9ub19lcnJvcigpIGFzc2VydF9ub19lcnJvcl90ZXN0KF9fRklMRV9fLCBfX0xJTkVfXykKKworc3RhdGljIHZvaWQgYXNzZXJ0X2Vycm9yX3Rlc3QoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIEdMZW51bSBleHBlY3QpCit7CisgICBHTGVudW0gZXJyOworCisgICBlcnIgPSBnbEdldEVycm9yKCk7CisgICBpZiAoZXJyICE9IGV4cGVjdCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQgZXhwZWN0ZWQgJXMgYnV0IHJlY2VpdmVkICVzXG4iLAorICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBnbHVFcnJvclN0cmluZyhleHBlY3QpLCBnbHVFcnJvclN0cmluZyhlcnIpKTsKKyAgIHdoaWxlIChnbEdldEVycm9yKCkpOyAvKiBjb25zdW1lIGFueSBmb2xsb3dpbmcgZXJyb3JzICovCit9CisKKyNkZWZpbmUgYXNzZXJ0X2Vycm9yKGVycikgYXNzZXJ0X2Vycm9yX3Rlc3QoX19GSUxFX18sIF9fTElORV9fLCAoZXJyKSkKKworc3RhdGljIHZvaWQgY2hlY2tfc3RhdHVzKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCB2b2lkICgqcXVlcnkpKEdMdWludCwgR0xlbnVtLCBHTGludCAqKSkKK3sKKyAgICBHTGludCBzdGF0dXM7CisKKyAgICBxdWVyeShpZCwgcG5hbWUsICZzdGF0dXMpOworICAgIGlmICghc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2hhciBpbmZvWzY1NTM2XTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbXBpbGF0aW9uL2xpbmsgZmFpbHVyZTpcbiIpOworICAgICAgICBnbEdldEluZm9Mb2dBUkIoaWQsIHNpemVvZihpbmZvKSwgTlVMTCwgaW5mbyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGluZm8pOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29tcGlsZV9zdGF0dXMoR0x1aW50IGlkKQoreworICAgY2hlY2tfc3RhdHVzKGlkLCBHTF9DT01QSUxFX1NUQVRVUywgZ2xHZXRTaGFkZXJpdik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xpbmtfc3RhdHVzKEdMdWludCBpZCkKK3sKKyAgIGNoZWNrX3N0YXR1cyhpZCwgR0xfTElOS19TVEFUVVMsIGdsR2V0UHJvZ3JhbWl2KTsKK30KKworc3RhdGljIEdMdWludCBtYWtlX3NoYWRlcihHTGVudW0gdHlwZSwgY29uc3QgY2hhciAqc3JjKQoreworICAgR0x1aW50IGlkOworCisgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgIGlkID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICBnbFNoYWRlclNvdXJjZShpZCwgMSwgJnNyYywgTlVMTCk7CisgICBnbENvbXBpbGVTaGFkZXIoaWQpOworICAgY2hlY2tfY29tcGlsZV9zdGF0dXMoaWQpOworICAgYXNzZXJ0X25vX2Vycm9yKCk7CisgICByZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBHTHVpbnQgbWFrZV9wcm9ncmFtKGNvbnN0IGNoYXIgKnZzX3NyYywgY29uc3QgY2hhciAqZnNfc3JjKQoreworICAgR0x1aW50IGlkLCB2cywgZnM7CisKKyAgIGFzc2VydF9ub19lcnJvcigpOworICAgaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgIGlmICh2c19zcmMpIHsKKyAgICAgIHZzID0gbWFrZV9zaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgdnNfc3JjKTsKKyAgICAgIGdsQXR0YWNoU2hhZGVyKGlkLCB2cyk7CisgICAgICBnbERlbGV0ZVNoYWRlcih2cyk7CisgICB9CisgICBpZiAoZnNfc3JjKSB7CisgICAgICBmcyA9IG1ha2Vfc2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgZnNfc3JjKTsKKyAgICAgIGdsQXR0YWNoU2hhZGVyKGlkLCBmcyk7CisgICAgICBnbERlbGV0ZVNoYWRlcihmcyk7CisgICB9CisgICBnbExpbmtQcm9ncmFtKGlkKTsKKyAgIGNoZWNrX2xpbmtfc3RhdHVzKGlkKTsKKyAgIGdsVXNlUHJvZ3JhbShpZCk7CisgICBnbERlbGV0ZVByb2dyYW0oaWQpOworICAgYXNzZXJ0X25vX2Vycm9yKCk7CisgICByZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKGNvbnN0IGNoYXIgKmdsc2xUeXBlLCBHTGVudW0gZ2xUeXBlLCBjb25zdCBjaGFyICplbCkKK3sKKyAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgR0x1aW50IHByb2dyYW07CisgICBHTGludCBhY3RpdmUsIGk7CisgICBHTGVudW0gdHlwZTsKKyAgIEdMaW50IHNpemU7CisKKyAgIHByaW50ZigiICBSdW5uaW5nIHN1YnRlc3QgJXNcbiIsIGdsc2xUeXBlKTsgZmZsdXNoKHN0ZG91dCk7CisgICBzcHJpbnRmKGJ1ZmZlciwgIiN2ZXJzaW9uIDEyMFxudW5pZm9ybSAlcyBtWzYwXTtcbnZvaWQgbWFpbigpIHsgZ2xfUG9zaXRpb25bMF0gPSBtWzU5XSVzOyB9XG4iLAorICAgICAgICAgICBnbHNsVHlwZSwgZWwpOworCisgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKGJ1ZmZlciwgTlVMTCk7CisgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9BQ1RJVkVfVU5JRk9STVMsICZhY3RpdmUpOworICAgYXNzZXJ0X25vX2Vycm9yKCk7CisgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlOyBpKyspIHsKKyAgICAgIHNpemUgPSAtMTsKKyAgICAgIHR5cGUgPSAwOworICAgICAgZ2xHZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGksIHNpemVvZihidWZmZXIpLCBOVUxMLCAmc2l6ZSwgJnR5cGUsIGJ1ZmZlcik7CisgICAgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgICAgIGlmIChzdHJuY21wKGJ1ZmZlciwgIm0iLCAxKSA9PSAwKQorICAgICAgICAgYnJlYWs7CisgICB9CisgICBhc3NlcnQoaSA8IGFjdGl2ZSk7IC8qIE90aGVyd2lzZSB0aGUgY29tcGlsZXIgb3B0aW1pc2VkIGl0IG91dCAqLworICAgYXNzZXJ0KHR5cGUgPT0gZ2xUeXBlKTsKKyAgIGFzc2VydChzaXplID09IDYwKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF91bmlmb3JtX3NpemVfdHlwZSh2b2lkKQoreworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoImZsb2F0IiwgR0xfRkxPQVQsICIiKTsKKyAgIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKCJ2ZWMyIiwgR0xfRkxPQVRfVkVDMiwgIlswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoInZlYzMiLCBHTF9GTE9BVF9WRUMzLCAiWzBdIik7CisgICB0ZXN0X3VuaWZvcm1fc2l6ZV90eXBlMSgidmVjNCIsIEdMX0ZMT0FUX1ZFQzQsICJbMF0iKTsKKworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoImJvb2wiLCBHTF9CT09MLCAiID8gMS4wIDogMC4wIik7CisgICB0ZXN0X3VuaWZvcm1fc2l6ZV90eXBlMSgiYnZlYzIiLCBHTF9CT09MX1ZFQzIsICJbMF0gPyAxLjAgOiAwLjAiKTsKKyAgIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKCJidmVjMyIsIEdMX0JPT0xfVkVDMywgIlswXSA/IDEuMCA6IDAuMCIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoImJ2ZWM0IiwgR0xfQk9PTF9WRUM0LCAiWzBdID8gMS4wIDogMC4wIik7CisKKyAgIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKCJpbnQiLCBHTF9JTlQsICIiKTsKKyAgIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKCJpdmVjMiIsIEdMX0lOVF9WRUMyLCAiWzBdIik7CisgICB0ZXN0X3VuaWZvcm1fc2l6ZV90eXBlMSgiaXZlYzMiLCBHTF9JTlRfVkVDMywgIlswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIml2ZWM0IiwgR0xfSU5UX1ZFQzQsICJbMF0iKTsKKworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDIiLCBHTF9GTE9BVF9NQVQyLCAiWzBdWzBdIik7CisgICB0ZXN0X3VuaWZvcm1fc2l6ZV90eXBlMSgibWF0MyIsIEdMX0ZMT0FUX01BVDMsICJbMF1bMF0iKTsKKyAgIHRlc3RfdW5pZm9ybV9zaXplX3R5cGUxKCJtYXQ0IiwgR0xfRkxPQVRfTUFUNCwgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDJ4MyIsIEdMX0ZMT0FUX01BVDJ4MywgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDJ4NCIsIEdMX0ZMT0FUX01BVDJ4NCwgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDN4MiIsIEdMX0ZMT0FUX01BVDN4MiwgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDN4NCIsIEdMX0ZMT0FUX01BVDN4NCwgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDR4MiIsIEdMX0ZMT0FUX01BVDR4MiwgIlswXVswXSIpOworICAgdGVzdF91bmlmb3JtX3NpemVfdHlwZTEoIm1hdDR4MyIsIEdMX0ZMT0FUX01BVDR4MywgIlswXVswXSIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2F0dHJpYl9zaXplX3R5cGUxKGNvbnN0IGNoYXIgKmdsc2xUeXBlLCBHTGVudW0gZ2xUeXBlLCBjb25zdCBjaGFyICplbCkKK3sKKyAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgR0x1aW50IHByb2dyYW07CisgICBHTGludCBhY3RpdmUsIGk7CisgICBHTGVudW0gdHlwZTsKKyAgIEdMaW50IHNpemU7CisKKyAgIHByaW50ZigiICBSdW5uaW5nIHN1YnRlc3QgJXNcbiIsIGdsc2xUeXBlKTsgZmZsdXNoKHN0ZG91dCk7CisgICBzcHJpbnRmKGJ1ZmZlciwgIiN2ZXJzaW9uIDEyMFxuYXR0cmlidXRlICVzIG07XG52b2lkIG1haW4oKSB7IGdsX1Bvc2l0aW9uWzBdID0gbSVzOyB9XG4iLAorICAgICAgICAgICBnbHNsVHlwZSwgZWwpOworCisgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKGJ1ZmZlciwgTlVMTCk7CisgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9BQ1RJVkVfQVRUUklCVVRFUywgJmFjdGl2ZSk7CisgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBhY3RpdmU7IGkrKykgeworICAgICAgc2l6ZSA9IC0xOworICAgICAgdHlwZSA9IC0xOworICAgICAgZ2xHZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSwgc2l6ZW9mKGJ1ZmZlciksIE5VTEwsICZzaXplLCAmdHlwZSwgYnVmZmVyKTsKKyAgICAgIGFzc2VydF9ub19lcnJvcigpOworICAgICAgaWYgKHN0cm5jbXAoYnVmZmVyLCAibSIsIDEpID09IDApCisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIGFzc2VydChpIDwgYWN0aXZlKTsgLyogT3RoZXJ3aXNlIHRoZSBjb21waWxlciBvcHRpbWlzZWQgaXQgb3V0ICovCisgICBhc3NlcnQodHlwZSA9PSBnbFR5cGUpOworICAgYXNzZXJ0KHNpemUgPT0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXR0cmliX3NpemVfdHlwZSh2b2lkKQoreworICAgdGVzdF9hdHRyaWJfc2l6ZV90eXBlMSgiZmxvYXQiLCBHTF9GTE9BVCwgIiIpOworICAgdGVzdF9hdHRyaWJfc2l6ZV90eXBlMSgidmVjMiIsIEdMX0ZMT0FUX1ZFQzIsICJbMF0iKTsKKyAgIHRlc3RfYXR0cmliX3NpemVfdHlwZTEoInZlYzMiLCBHTF9GTE9BVF9WRUMzLCAiWzBdIik7CisgICB0ZXN0X2F0dHJpYl9zaXplX3R5cGUxKCJ2ZWM0IiwgR0xfRkxPQVRfVkVDNCwgIlswXSIpOworCisgICB0ZXN0X2F0dHJpYl9zaXplX3R5cGUxKCJtYXQyIiwgR0xfRkxPQVRfTUFUMiwgIlswXVswXSIpOworICAgdGVzdF9hdHRyaWJfc2l6ZV90eXBlMSgibWF0MyIsIEdMX0ZMT0FUX01BVDMsICJbMF1bMF0iKTsKKyAgIHRlc3RfYXR0cmliX3NpemVfdHlwZTEoIm1hdDQiLCBHTF9GTE9BVF9NQVQ0LCAiWzBdWzBdIik7CisgICB0ZXN0X2F0dHJpYl9zaXplX3R5cGUxKCJtYXQyeDMiLCBHTF9GTE9BVF9NQVQyeDMsICJbMF1bMF0iKTsKKyAgIHRlc3RfYXR0cmliX3NpemVfdHlwZTEoIm1hdDJ4NCIsIEdMX0ZMT0FUX01BVDJ4NCwgIlswXVswXSIpOworICAgdGVzdF9hdHRyaWJfc2l6ZV90eXBlMSgibWF0M3gyIiwgR0xfRkxPQVRfTUFUM3gyLCAiWzBdWzBdIik7CisgICB0ZXN0X2F0dHJpYl9zaXplX3R5cGUxKCJtYXQzeDQiLCBHTF9GTE9BVF9NQVQzeDQsICJbMF1bMF0iKTsKKyAgIHRlc3RfYXR0cmliX3NpemVfdHlwZTEoIm1hdDR4MiIsIEdMX0ZMT0FUX01BVDR4MiwgIlswXVswXSIpOworICAgdGVzdF9hdHRyaWJfc2l6ZV90eXBlMSgibWF0NHgzIiwgR0xfRkxPQVRfTUFUNHgzLCAiWzBdWzBdIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdW5pZm9ybV9hcnJheV9vdmVyZmxvdyh2b2lkKQoreworICAgR0x1aW50IHByb2dyYW07CisgICBHTGludCBsb2NhdGlvbjsKKyAgIEdMZmxvYXQgZGF0YVsxMjhdOworCisgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKCIjdmVyc2lvbiAxMjBcbnVuaWZvcm0gdmVjMiB4WzEwXTtcbnZvaWQgbWFpbigpIHsgZ2xfUG9zaXRpb24ueHkgPSB4WzldOyB9XG4iLCBOVUxMKTsKKyAgIGxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgIngiKTsKKyAgIGFzc2VydF9ub19lcnJvcigpOworICAgZ2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCA2NCwgZGF0YSk7CisgICBhc3NlcnRfbm9fZXJyb3IoKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF91bmlmb3JtX3NjYWxhcl9jb3VudCh2b2lkKQoreworICAgR0x1aW50IHByb2dyYW07CisgICBHTGludCBsb2NhdGlvbjsKKyAgIEdMZmxvYXQgZGF0YVsxMjhdOworCisgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKCIjdmVyc2lvbiAxMTBcbnVuaWZvcm0gdmVjMiB4O1xudm9pZCBtYWluKCkgeyBnbF9Qb3NpdGlvbi54eSA9IHg7IH1cbiIsIE5VTEwpOworICAgbG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAieCIpOworICAgYXNzZXJ0X25vX2Vycm9yKCk7CisgICBnbFVuaWZvcm0yZnYobG9jYXRpb24sIDY0LCBkYXRhKTsKKyAgIGFzc2VydF9lcnJvcihHTF9JTlZBTElEX09QRVJBVElPTik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdW5pZm9ybV9xdWVyeV9tYXRyaXgodm9pZCkKK3sKKyAgIEdMdWludCBwcm9ncmFtOworICAgR0xmbG9hdCBkYXRhWzE4XTsKKyAgIEdMaW50IGksIHIsIGM7CisgICBHTGludCBsb2NhdGlvbjsKKworICAgcHJvZ3JhbSA9IG1ha2VfcHJvZ3JhbSgiI3ZlcnNpb24gMTEwXG51bmlmb3JtIG1hdDMgbVsyXTtcbnZvaWQgbWFpbigpIHsgZ2xfUG9zaXRpb24ueHl6ID0gbVsxXVsyXTsgfVxuIiwgTlVMTCk7CisgICBsb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJtIik7CisgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgZGF0YVtpXSA9IGk7CisgICBmb3IgKGkgPSA5OyBpIDwgMTg7IGkrKykKKyAgICAgIGRhdGFbaV0gPSAzMjEuMDsKKyAgIGdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgMSwgR0xfVFJVRSwgZGF0YSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorICAgICAgZGF0YVtpXSA9IDEyMy4wOworICAgZ2xHZXRVbmlmb3JtZnYocHJvZ3JhbSwgbG9jYXRpb24sIGRhdGEpOworICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykKKyAgICAgIGZvciAociA9IDA7IHIgPCAzOyByKyspCisgICAgICAgICBhc3NlcnQoZGF0YVtjICogMyArIHJdID09IHIgKiAzICsgYyk7CisgICBmb3IgKGkgPSA5OyBpIDwgMTg7IGkrKykKKyAgICAgIGFzc2VydChkYXRhW2ldID09IDEyMy4wKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF91bmlmb3JtX25lZ19sb2NhdGlvbih2b2lkKQoreworICAgR0x1aW50IHByb2dyYW07CisgICBHTGZsb2F0IGRhdGFbNF07CisKKyAgIHByb2dyYW0gPSBtYWtlX3Byb2dyYW0oIiN2ZXJzaW9uIDExMFxudm9pZCBtYWluKCkgeyBnbF9Qb3NpdGlvbiA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTsgfVxuIiwgTlVMTCk7CisgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgIGdsVW5pZm9ybTFpKC0xLCAxKTsKKyAgIGFzc2VydF9ub19lcnJvcigpOworICAgZ2xVbmlmb3JtMWkoLTIwMCwgMSk7CisgICBhc3NlcnRfZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgZ2xVbmlmb3JtTWF0cml4MmZ2KC0xLCAxLCBHTF9GQUxTRSwgZGF0YSk7CisgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgIGdsVW5pZm9ybU1hdHJpeDJmdigtMjAwLCAxLCBHTF9GQUxTRSwgZGF0YSk7CisgICBhc3NlcnRfZXJyb3IoR0xfSU5WQUxJRF9PUEVSQVRJT04pOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3VuaWZvcm1fYm9vbF9jb252ZXJzaW9uKHZvaWQpCit7CisgICAgR0x1aW50IHByb2dyYW07CisgICAgR0xpbnQgbG9jYXRpb247CisgICAgR0xpbnQgdmFsdWVbMTZdOyAgLyogaW4gY2FzZSBnbEdldFVuaWZvcm1pdiBnb2VzIG51dHMgb24gdGhlIHN0YWNrICovCisKKyAgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKCJ1bmlmb3JtIGJvb2wgYjtcbnZvaWQgbWFpbigpIHsgZ2xfUG9zaXRpb24ueCA9IGIgPyAxLjUgOiAwLjU7IH1cbiIsIE5VTEwpOworICAgIGxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgImIiKTsKKyAgICBhc3NlcnQobG9jYXRpb24gIT0gLTEpOworICAgIGFzc2VydF9ub19lcnJvcigpOworICAgIGdsVW5pZm9ybTFpKGxvY2F0aW9uLCA1KTsKKyAgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgICBnbEdldFVuaWZvcm1pdihwcm9ncmFtLCBsb2NhdGlvbiwgJnZhbHVlWzBdKTsKKyAgICBhc3NlcnRfbm9fZXJyb3IoKTsKKyAgICBhc3NlcnQodmFsdWVbMF0gPT0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdW5pZm9ybV9tdWx0aXBsZV9zYW1wbGVycyh2b2lkKQoreworICAgR0x1aW50IHByb2dyYW07CisgICBHTGludCBsb2NhdGlvbjsKKyAgIEdMaW50IHZhbHVlc1syXSA9IHswLCAxfTsKKworICAgYXNzZXJ0X25vX2Vycm9yKCk7CisgICBwcm9ncmFtID0gbWFrZV9wcm9ncmFtKE5VTEwsICJ1bmlmb3JtIHNhbXBsZXIyRCBzWzJdO1xudm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc1sxXSwgdmVjMigwLjAsIDAuMCkpOyB9XG4iKTsKKyAgIGxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInNbMF0iKTsKKyAgIGlmIChsb2NhdGlvbiA9PSAtMSkgIC8qIE1lc2EgZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCBpbmRleGluZyAqLworICAgICAgbG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAicyIpOworICAgYXNzZXJ0KGxvY2F0aW9uICE9IC0xKTsKKyAgIGFzc2VydF9ub19lcnJvcigpOworICAgZ2xVbmlmb3JtMWl2KGxvY2F0aW9uLCAyLCB2YWx1ZXMpOworICAgYXNzZXJ0X25vX2Vycm9yKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl90ZXN0KGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpCit7CisgICBwcmludGYoIlJ1bm5pbmcgJXNcbiIsIG5hbWUpOworICAgZmZsdXNoKHN0ZG91dCk7CisgICBjYWxsYmFjaygpOworfQorCisjZGVmaW5lIFJVTl9URVNUKG5hbWUpIHJ1bl90ZXN0KCNuYW1lLCAobmFtZSkpCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGdsdXRJbml0KCZhcmdjLCBhcmd2KTsKKyAgIGdsdXRDcmVhdGVXaW5kb3coIk1lc2EgYnVnIGRlbW8iKTsKKworICAgUlVOX1RFU1QodGVzdF91bmlmb3JtX3NpemVfdHlwZSk7CisgICBSVU5fVEVTVCh0ZXN0X2F0dHJpYl9zaXplX3R5cGUpOworICAgUlVOX1RFU1QodGVzdF91bmlmb3JtX2FycmF5X292ZXJmbG93KTsKKyAgIFJVTl9URVNUKHRlc3RfdW5pZm9ybV9zY2FsYXJfY291bnQpOworICAgUlVOX1RFU1QodGVzdF91bmlmb3JtX3F1ZXJ5X21hdHJpeCk7CisgICBSVU5fVEVTVCh0ZXN0X3VuaWZvcm1fbmVnX2xvY2F0aW9uKTsKKyAgIFJVTl9URVNUKHRlc3RfdW5pZm9ybV9ib29sX2NvbnZlcnNpb24pOworICAgLyogTGVhdmUgdGhpcyBvbmUgYXQgdGhlIGVuZCwgc2luY2UgaXQgY3Jhc2hlcyBNZXNhJ3Mgc2hhZGVyIGNvbXBpbGVyICovCisgICBSVU5fVEVTVCh0ZXN0X3VuaWZvcm1fbXVsdGlwbGVfc2FtcGxlcnMpOworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy9zdGVuY2lsX3R3b3NpZGUuYyBiL3Byb2dzL3Rlc3RzL3N0ZW5jaWxfdHdvc2lkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWQ5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy90ZXN0cy9zdGVuY2lsX3R3b3NpZGUuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiBvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCisgKiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNLCBJQk0gQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHN0ZW5jaWxfdHdvc2lkZS5jCisgKiAKKyAqIFNpbXBsZSB0ZXN0IG9mIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIChvciB0aGUgT0dMIDIuMCBlcXVpdmFsZW50KSBmdW5jdGlvbmFsaXR5LgorICogRm91ciBzcXVhcmVzIGFyZSBkcmF3bgorICogd2l0aCBkaWZmZXJlbnQgc3RlbmNpbCBtb2RlcywgYnV0IGFsbCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc2FtZQorICogZmluYWwgY29sb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorCitzdGF0aWMgaW50IHVzZTIwc3ludGF4ID0gMTsKK3N0YXRpYyBpbnQgV2lkdGggPSA1NTA7CitzdGF0aWMgaW50IEhlaWdodCA9IDIwMDsKK3N0YXRpYyBjb25zdCBHTGZsb2F0IE5lYXIgPSA1LjAsIEZhciA9IDI1LjA7CisKKworc3RhdGljIFBGTkdMU1RFTkNJTEZVTkNTRVBBUkFURVBST0Mgc3RlbmNpbF9mdW5jX3NlcGFyYXRlID0gTlVMTDsKK3N0YXRpYyBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVBVElQUk9DIHN0ZW5jaWxfZnVuY19zZXBhcmF0ZV9hdGkgPSBOVUxMOworc3RhdGljIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVQUk9DIHN0ZW5jaWxfb3Bfc2VwYXJhdGUgPSBOVUxMOworCitzdGF0aWMgdm9pZCBEaXNwbGF5KCB2b2lkICkKK3sKKyAgIEdMaW50ICBtYXhfc3RlbmNpbDsKKyAgIEdMaW50ICBzdGVuY2lsX2JpdHM7CisgICB1bnNpZ25lZCBpOworCisKKyAgIGdsR2V0SW50ZWdlcnYoIEdMX1NURU5DSUxfQklUUywgJiBzdGVuY2lsX2JpdHMgKTsKKyAgIG1heF9zdGVuY2lsID0gKDFVIDw8IHN0ZW5jaWxfYml0cykgLSAxOworICAgcHJpbnRmKCAiU3RlbmNpbCBiaXRzID0gJXUsIG1heGltdW0gc3RlbmNpbCB2YWx1ZSA9IDB4JTA4eFxuIiwKKwkgICBzdGVuY2lsX2JpdHMsIG1heF9zdGVuY2lsICk7CisKKyAgIGdsQ2xlYXJTdGVuY2lsKCAxICk7CisgICBnbENsZWFyQ29sb3IoIDAuMiwgMC4yLCAwLjgsIDAgKTsKKyAgIGdsQ2xlYXIoIEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUIAorCSAgICB8IEdMX1NURU5DSUxfQlVGRkVSX0JJVCApOworCisKKyAgIGdsUHVzaE1hdHJpeCgpOworCisgICAvKiBUaGlzIGlzIHRoZSAicmVmZXJlbmNlIiBzcXVhcmUuCisgICAgKi8KKworICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7CisgICBnbFRyYW5zbGF0ZWYoLTYuMCwgMCwgMCk7CisgICBnbEJlZ2luKEdMX1FVQURTKTsKKyAgIGdsQ29sb3IzZiggMC41LCAwLjUsIDAuNSApOworICAgZ2xWZXJ0ZXgyZigtMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgIDEpOworICAgZ2xWZXJ0ZXgyZigtMSwgIDEpOworICAgZ2xFbmQoKTsKKworCisgICBnbEVuYWJsZShHTF9TVEVOQ0lMX1RFU1QpOworCisgICAvKiBEcmF3IHRoZSBmaXJzdCB0d28gc3F1YXJlcyB1c2luZyBpbmNyIGZvciB0aGUgYWZmZWN0ZWQgZmFjZQorICAgICovCisKKyAgIGlmICh1c2UyMHN5bnRheCkgeworICAgICAgc3RlbmNpbF9mdW5jX3NlcGFyYXRlKEdMX0ZST05ULCBHTF9BTFdBWVMsIDAsIH4wKTsKKyAgICAgIHN0ZW5jaWxfZnVuY19zZXBhcmF0ZShHTF9CQUNLLCBHTF9BTFdBWVMsIDAsIH4wKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc3RlbmNpbF9mdW5jX3NlcGFyYXRlX2F0aShHTF9BTFdBWVMsIEdMX0FMV0FZUywgMCwgfjApOworICAgfQorICAgc3RlbmNpbF9vcF9zZXBhcmF0ZShHTF9GUk9OVCwgR0xfS0VFUCwgR0xfS0VFUCwgR0xfSU5DUik7CisgICBzdGVuY2lsX29wX3NlcGFyYXRlKEdMX0JBQ0ssIEdMX0tFRVAsIEdMX0tFRVAsIEdMX0RFQ1IpOworCisgICBnbFRyYW5zbGF0ZWYoMy4wLCAwLCAwKTsKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xDb2xvcjNmKCAwLjksIDAuOSwgMC45ICk7CisgICAvKiB0aGlzIHNob3VsZCBiZSBmcm9udCBmYWNpbmcgKi8KKyAgIGZvciAoIGkgPSAwIDsgaSA8IChtYXhfc3RlbmNpbCArIDUpIDsgaSsrICkgeworICAgICAgZ2xWZXJ0ZXgyZigtMSwgLTEpOworICAgICAgZ2xWZXJ0ZXgyZiggMSwgLTEpOworICAgICAgZ2xWZXJ0ZXgyZiggMSwgIDEpOworICAgICAgZ2xWZXJ0ZXgyZigtMSwgIDEpOworICAgfQorICAgZ2xFbmQoKTsKKworICAgZ2xTdGVuY2lsRnVuYyhHTF9FUVVBTCwgbWF4X3N0ZW5jaWwsIH4wKTsKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xDb2xvcjNmKCAwLjUsIDAuNSwgMC41ICk7CisgICBnbFZlcnRleDJmKC0xLCAtMSk7CisgICBnbFZlcnRleDJmKCAxLCAtMSk7CisgICBnbFZlcnRleDJmKCAxLCAgMSk7CisgICBnbFZlcnRleDJmKC0xLCAgMSk7CisgICBnbEVuZCgpOworCisKKyAgIGlmICh1c2UyMHN5bnRheCkgeworICAgICAgc3RlbmNpbF9mdW5jX3NlcGFyYXRlKEdMX0ZST05ULCBHTF9BTFdBWVMsIDAsIH4wKTsKKyAgICAgIHN0ZW5jaWxfZnVuY19zZXBhcmF0ZShHTF9CQUNLLCBHTF9BTFdBWVMsIDAsIH4wKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc3RlbmNpbF9mdW5jX3NlcGFyYXRlX2F0aShHTF9BTFdBWVMsIEdMX0FMV0FZUywgMCwgfjApOworICAgfQorICAgc3RlbmNpbF9vcF9zZXBhcmF0ZShHTF9GUk9OVCwgR0xfS0VFUCwgR0xfS0VFUCwgR0xfREVDUik7CisgICBzdGVuY2lsX29wX3NlcGFyYXRlKEdMX0JBQ0ssIEdMX0tFRVAsIEdMX0tFRVAsIEdMX0lOQ1IpOworCisgICBnbFRyYW5zbGF0ZWYoMy4wLCAwLCAwKTsKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xDb2xvcjNmKCAwLjksIDAuOSwgMC45ICk7CisKKyAgIC8qIHRoaXMgc2hvdWxkIGJlIGJhY2sgZmFjaW5nICovCisgICBmb3IgKCBpID0gMCA7IGkgPCAobWF4X3N0ZW5jaWwgKyA1KSA7IGkrKyApIHsKKyAgICAgIGdsVmVydGV4MmYoLTEsIC0xKTsKKyAgICAgIGdsVmVydGV4MmYoLTEsICAxKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsICAxKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsIC0xKTsKKyAgIH0KKyAgIGdsRW5kKCk7CisKKyAgIGdsU3RlbmNpbEZ1bmMoR0xfRVFVQUwsIG1heF9zdGVuY2lsLCB+MCk7CisgICBnbEJlZ2luKEdMX1FVQURTKTsKKyAgIGdsQ29sb3IzZiggMC41LCAwLjUsIDAuNSApOworICAgZ2xWZXJ0ZXgyZigtMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgIDEpOworICAgZ2xWZXJ0ZXgyZigtMSwgIDEpOworICAgZ2xFbmQoKTsKKworICAgaWYgKHVzZTIwc3ludGF4KSB7CisgICAgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGUoR0xfRlJPTlQsIEdMX05FVkVSLCAwLCB+MCk7CisgICAgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGUoR0xfQkFDSywgR0xfQUxXQVlTLCAwLCB+MCk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHN0ZW5jaWxfZnVuY19zZXBhcmF0ZV9hdGkoR0xfTkVWRVIsIEdMX0FMV0FZUywgMCwgfjApOworICAgfQorICAgc3RlbmNpbF9vcF9zZXBhcmF0ZShHTF9GUk9OVCwgR0xfS0VFUCwgR0xfS0VFUCwgR0xfREVDUik7CisgICBzdGVuY2lsX29wX3NlcGFyYXRlKEdMX0JBQ0ssIEdMX0tFRVAsIEdMX0tFRVAsIEdMX0lOQ1IpOworCisgICBnbFRyYW5zbGF0ZWYoMy4wLCAwLCAwKTsKKyAgIGdsQmVnaW4oR0xfUVVBRFMpOworICAgZ2xDb2xvcjNmKCAwLjksIDAuOSwgMC45ICk7CisKKyAgIC8qIHRoaXMgc2hvdWxkIGJlIGJhY2sgZmFjaW5nICovCisgICBmb3IgKCBpID0gMCA7IGkgPCAobWF4X3N0ZW5jaWwgKyA1KSA7IGkrKyApIHsKKyAgIC8qIHRoaXMgc2hvdWxkIGJlIGJhY2sgZmFjaW5nICovCisgICAgICBnbFZlcnRleDJmKC0xLCAtMSk7CisgICAgICBnbFZlcnRleDJmKC0xLCAgMSk7CisgICAgICBnbFZlcnRleDJmKCAxLCAgMSk7CisgICAgICBnbFZlcnRleDJmKCAxLCAtMSk7CisgICAvKiB0aGlzIHNob3VsZCBiZSBmcm9udCBmYWNpbmcgKi8KKyAgICAgIGdsVmVydGV4MmYoLTEsIC0xKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsIC0xKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsICAxKTsKKyAgICAgIGdsVmVydGV4MmYoLTEsICAxKTsKKyAgIH0KKyAgIGdsRW5kKCk7CisKKyAgIGdsU3RlbmNpbEZ1bmMoR0xfRVFVQUwsIG1heF9zdGVuY2lsLCB+MCk7CisgICBnbEJlZ2luKEdMX1FVQURTKTsKKyAgIGdsQ29sb3IzZiggMC41LCAwLjUsIDAuNSApOworICAgZ2xWZXJ0ZXgyZigtMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgLTEpOworICAgZ2xWZXJ0ZXgyZiggMSwgIDEpOworICAgZ2xWZXJ0ZXgyZigtMSwgIDEpOworICAgZ2xFbmQoKTsKKworICAgaWYgKHVzZTIwc3ludGF4KSB7CisgICAgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGUoR0xfRlJPTlQsIEdMX0FMV0FZUywgMCwgfjApOworICAgICAgc3RlbmNpbF9mdW5jX3NlcGFyYXRlKEdMX0JBQ0ssIEdMX0FMV0FZUywgMCwgfjApOworICAgfQorICAgZWxzZSB7CisgICAgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGVfYXRpKEdMX0FMV0FZUywgR0xfQUxXQVlTLCAwLCB+MCk7CisgICB9CisgICBzdGVuY2lsX29wX3NlcGFyYXRlKEdMX0ZST05ULCBHTF9LRUVQLCBHTF9LRUVQLCBHTF9ERUNSKTsKKyAgIHN0ZW5jaWxfb3Bfc2VwYXJhdGUoR0xfQkFDSywgR0xfS0VFUCwgR0xfS0VFUCwgR0xfSU5DUik7CisKKyAgIGdsVHJhbnNsYXRlZigzLjAsIDAsIDApOworICAgZ2xCZWdpbihHTF9RVUFEUyk7CisgICBnbENvbG9yM2YoIDAuOSwgMC45LCAwLjkgKTsKKworICAgLyogdGhpcyBzaG91bGQgYmUgYmFjayBmYWNpbmcgKi8KKyAgIGZvciAoIGkgPSAwIDsgaSA8IChtYXhfc3RlbmNpbCArIDUpIDsgaSsrICkgeworICAgLyogdGhpcyBzaG91bGQgYmUgYmFjayBmYWNpbmcgKi8KKyAgICAgIGdsVmVydGV4MmYoLTEsIC0xKTsKKyAgICAgIGdsVmVydGV4MmYoLTEsICAxKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsICAxKTsKKyAgICAgIGdsVmVydGV4MmYoIDEsIC0xKTsKKyAgIC8qIHRoaXMgc2hvdWxkIGJlIGZyb250IGZhY2luZyAqLworICAgICAgZ2xWZXJ0ZXgyZigtMSwgLTEpOworICAgICAgZ2xWZXJ0ZXgyZiggMSwgLTEpOworICAgICAgZ2xWZXJ0ZXgyZiggMSwgIDEpOworICAgICAgZ2xWZXJ0ZXgyZigtMSwgIDEpOworICAgfQorICAgZ2xFbmQoKTsKKworICAgZ2xTdGVuY2lsRnVuYyhHTF9FUVVBTCwgMSwgfjApOworICAgZ2xCZWdpbihHTF9RVUFEUyk7CisgICBnbENvbG9yM2YoIDAuNSwgMC41LCAwLjUgKTsKKyAgIGdsVmVydGV4MmYoLTEsIC0xKTsKKyAgIGdsVmVydGV4MmYoIDEsIC0xKTsKKyAgIGdsVmVydGV4MmYoIDEsICAxKTsKKyAgIGdsVmVydGV4MmYoLTEsICAxKTsKKyAgIGdsRW5kKCk7CisKKyAgIGdsUG9wTWF0cml4KCk7CisKKyAgIGdsdXRTd2FwQnVmZmVycygpOworfQorCisKK3N0YXRpYyB2b2lkIFJlc2hhcGUoIGludCB3aWR0aCwgaW50IGhlaWdodCApCit7CisgICBHTGZsb2F0IGFyID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OworICAgV2lkdGggPSB3aWR0aDsKKyAgIEhlaWdodCA9IGhlaWdodDsKKyAgIGdsVmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKyAgIGdsTWF0cml4TW9kZSggR0xfUFJPSkVDVElPTiApOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsRnJ1c3R1bSggLWFyLCBhciwgLTEuMCwgMS4wLCBOZWFyLCBGYXIgKTsKKyAgIGdsTWF0cml4TW9kZSggR0xfTU9ERUxWSUVXICk7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xUcmFuc2xhdGVmKCAwLjAsIDAuMCwgLTE1LjAgKTsKK30KKworCitzdGF0aWMgdm9pZCBLZXkoIHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkgKQoreworICAgKHZvaWQpIHg7CisgICAodm9pZCkgeTsKKyAgIHN3aXRjaCAoa2V5KSB7CisgICAgICBjYXNlIDI3OgorICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKK30KKworCitzdGF0aWMgdm9pZCBJbml0KCB2b2lkICkKK3sKKyAgIGNvbnN0IGNoYXIgKiBjb25zdCB2ZXJfc3RyaW5nID0gKGNvbnN0IGNoYXIgKiBjb25zdCkKKyAgICAgICBnbEdldFN0cmluZyggR0xfVkVSU0lPTiApOworCisgICBwcmludGYoIkdMX1JFTkRFUkVSID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSk7CisgICBwcmludGYoIkdMX1ZFUlNJT04gPSAlc1xuIiwgdmVyX3N0cmluZyk7CisKKyAgIGlmICggIWdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIikgCisJJiYgKGF0b2YoIHZlcl9zdHJpbmcgKSA8IDIuMCkgKSB7CisgICAgICBwcmludGYoIlNvcnJ5LCB0aGlzIHByb2dyYW0gcmVxdWlyZXMgZWl0aGVyIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIG9yIE9wZW5HTCAyLjAuXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisgICBpZiAoYXRvZiggdmVyX3N0cmluZyApIDwgMi4wKSB7CisgICAgICB1c2UyMHN5bnRheCA9IDA7CisgICB9CisgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGUgPSBnbHV0R2V0UHJvY0FkZHJlc3MoICJnbFN0ZW5jaWxGdW5jU2VwYXJhdGUiICk7CisgICBzdGVuY2lsX2Z1bmNfc2VwYXJhdGVfYXRpID0gZ2x1dEdldFByb2NBZGRyZXNzKCAiZ2xTdGVuY2lsRnVuY1NlcGFyYXRlQVRJIiApOworICAgc3RlbmNpbF9vcF9zZXBhcmF0ZSA9IGdsdXRHZXRQcm9jQWRkcmVzcyggImdsU3RlbmNpbE9wU2VwYXJhdGUiICk7CisKKyAgIHByaW50ZigiXG5BbGwgNSBzcXVhcmVzIHNob3VsZCBiZSB0aGUgc2FtZSBjb2xvci5cbiIpOworICAgZ2xFbmFibGUoIEdMX0JMRU5EICk7Cit9CisKKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworICAgZ2x1dEluaXQoICZhcmdjLCBhcmd2ICk7CisgICBnbHV0SW5pdFdpbmRvd1Bvc2l0aW9uKCAwLCAwICk7CisgICBnbHV0SW5pdFdpbmRvd1NpemUoIFdpZHRoLCBIZWlnaHQgKTsKKyAgIGdsdXRJbml0RGlzcGxheU1vZGUoIEdMVVRfUkdCIHwgR0xVVF9ET1VCTEUgfCBHTFVUX0RFUFRIIHwgR0xVVF9TVEVOQ0lMICk7CisgICBnbHV0Q3JlYXRlV2luZG93KCAiR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWwgdGVzdCIgKTsKKyAgIGdsdXRSZXNoYXBlRnVuYyggUmVzaGFwZSApOworICAgZ2x1dEtleWJvYXJkRnVuYyggS2V5ICk7CisgICBnbHV0RGlzcGxheUZ1bmMoIERpc3BsYXkgKTsKKyAgIEluaXQoKTsKKyAgIGdsdXRNYWluTG9vcCgpOworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy90ZXhsaW5lLmMgYi9wcm9ncy90ZXN0cy90ZXhsaW5lLmMKaW5kZXggZWUxNmVkNC4uNzZkZmNjZCAxMDA2NDQKLS0tIGEvcHJvZ3MvdGVzdHMvdGV4bGluZS5jCisrKyBiL3Byb2dzL3Rlc3RzL3RleGxpbmUuYwpAQCAtNiw3ICs2LDYgQEAKICAqIFNlcHRlbWJlciAyMDAwCiAgKi8KIAotCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxtYXRoLmg+CkBAIC0yMTAsNyArMjA5LDkgQEAKIAogc3RhdGljIHZvaWQgSW5pdCggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7CisgICBHTGZsb2F0IHJbMl07CiAgICBHTHVpbnQgdTsKKwogICAgZm9yICh1ID0gMDsgdSA8IDI7IHUrKykgewogICAgICAgZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIHUpOwogICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAxMCt1KTsKQEAgLTI0MSw2ICsyNDIsMTUgQEAKICAgICAgIHByaW50ZigiR0xfVkVORE9SICAgICA9ICVzXG4iLCAoY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKICAgICAgIHByaW50ZigiR0xfRVhURU5TSU9OUyA9ICVzXG4iLCAoY2hhciAqKSBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CiAgICB9CisKKyAgIGdsR2V0RmxvYXR2KEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSwgcik7CisgICBwcmludGYoIk5vbi1zbW9vdGggcG9pbnQgc2l6ZSByYW5nZTogJWcgLi4gJWdcbiIsIHJbMF0sIHJbMV0pOworICAgZ2xHZXRGbG9hdHYoR0xfUE9JTlRfU0laRV9SQU5HRSwgcik7CisgICBwcmludGYoIlNtb290aGVkIHBvaW50IHNpemUgcmFuZ2U6ICVnIC4uICVnXG4iLCByWzBdLCByWzFdKTsKKyAgIGdsR2V0RmxvYXR2KEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSwgcik7CisgICBwcmludGYoIk5vbi1zbW9vdGggbGluZSB3aWR0aCByYW5nZTogJWcgLi4gJWdcbiIsIHJbMF0sIHJbMV0pOworICAgZ2xHZXRGbG9hdHYoR0xfTElORV9XSURUSF9SQU5HRSwgcik7CisgICBwcmludGYoIlNtb290aGVkIGxpbmUgd2lkdGggcmFuZ2U6ICVnIC4uICVnXG4iLCByWzBdLCByWzFdKTsKIH0KIAogCmRpZmYgLS1naXQgYS9wcm9ncy90ZXN0cy91bmZpbGxlZGNsaXAuYyBiL3Byb2dzL3Rlc3RzL3VuZmlsbGVkY2xpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWU1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy90ZXN0cy91bmZpbGxlZGNsaXAuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorCitzdGF0aWMgaW50IHdpbl93aWR0aCwgd2luX2hlaWdodDsKKworc3RhdGljIHZvaWQKK2xpbmUoR0xmbG9hdCB4MSwgR0xmbG9hdCB5MSwgR0xmbG9hdCB4MiwgR0xmbG9hdCB5MikKK3sKKwlnbEJlZ2luKEdMX0xJTkVTKTsKKwlnbFZlcnRleDJmKHgxLCB5MSk7CisJZ2xWZXJ0ZXgyZih4MiwgeTIpOworCWdsRW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkCitsaW5lMyhHTGZsb2F0IHgxLCBHTGZsb2F0IHkxLCBHTGZsb2F0IHoxLCBHTGZsb2F0IHgyLCBHTGZsb2F0IHkyLCBHTGZsb2F0IHoyKQoreworCWdsQmVnaW4oR0xfTElORVMpOworCWdsVmVydGV4M2YoeDEsIHkxLCB6MSk7CisJZ2xWZXJ0ZXgzZih4MiwgeTIsIHoyKTsKKwlnbEVuZCgpOworfQorCitzdGF0aWMgdm9pZAorZGlzcGxheSh2b2lkKQoreworCWdsUG9seWdvbk1vZGUoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0xJTkUpOworCisJZ2xDbGVhckNvbG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7CisJZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworCWdsQ29sb3IzZigxLjAsIDAuMCwgMC4wKTsKKwkvKiBjbGlwcGVkIGFsb25nIHhtaW4gKi8KKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7CisJZ2xWZXJ0ZXgyZigtMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjApOworCWdsVmVydGV4MmYoMjAsIHdpbl9oZWlnaHQgLyAyKTsKKwlnbFZlcnRleDJmKC0yMCwgd2luX2hlaWdodCAvIDIgKyAyMCk7CisJZ2xFbmQoKTsKKworCWdsQ29sb3IzZigwLjAsIDEuMCwgMC4wKTsKKwkvKiBjbGlwcGVkIGFsb25nIHltYXggKi8KKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7CisJZ2xWZXJ0ZXgyZih3aW5faGVpZ2h0IC8gMiAtIDIwLCB3aW5faGVpZ2h0ICsgMjApOworCWdsVmVydGV4MmYod2luX2hlaWdodCAvIDIsICAgICAgd2luX2hlaWdodCAtIDIwKTsKKwlnbFZlcnRleDJmKHdpbl9oZWlnaHQgLyAyICsgMjAsIHdpbl9oZWlnaHQgKyAyMCk7CisJZ2xFbmQoKTsKKworCWdsQ29sb3IzZigwLjAsIDAuMCwgMS4wKTsKKwkvKiBjbGlwcGVkIGFsb25nIHhtYXggKi8KKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7CisJZ2xWZXJ0ZXgyZih3aW5faGVpZ2h0ICsgMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjApOworCWdsVmVydGV4MmYod2luX2hlaWdodCAtIDIwLCB3aW5faGVpZ2h0IC8gMik7CisJZ2xWZXJ0ZXgyZih3aW5faGVpZ2h0ICsgMjAsIHdpbl9oZWlnaHQgLyAyICsgMjApOworCWdsRW5kKCk7CisKKwlnbENvbG9yM2YoMS4wLCAxLjAsIDEuMCk7CisJLyogY2xpcHBlZCBhbG9uZyB5bWluICovCisJZ2xCZWdpbihHTF9UUklBTkdMRVMpOworCWdsVmVydGV4MmYod2luX2hlaWdodCAvIDIgLSAyMCwgLTIwKTsKKwlnbFZlcnRleDJmKHdpbl9oZWlnaHQgLyAyLCAgICAgICAyMCk7CisJZ2xWZXJ0ZXgyZih3aW5faGVpZ2h0IC8gMiArIDIwLCAtMjApOworCWdsRW5kKCk7CisKKwkvKiBjbGlwcGVkIGFsb25nIG5lYXIgKi8KKwlnbENvbG9yM2YoMS4wLCAwLjAsIDEuMCk7CisJZ2xCZWdpbihHTF9UUklBTkdMRVMpOworCWdsVmVydGV4M2Yod2luX3dpZHRoIC8gMiAtIDIwLCB3aW5faGVpZ2h0IC8gMiAtIDIwLCAgMC41KTsKKwlnbFZlcnRleDNmKHdpbl93aWR0aCAvIDIgLSA0MCwgd2luX2hlaWdodCAvIDIsICAgICAgLTAuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyIC0gMjAsIHdpbl9oZWlnaHQgLyAyICsgMjAsICAwLjUpOworCWdsRW5kKCk7CisKKwkvKiBjbGlwcGVkIGFsb25nIGZhciAqLworCWdsQ29sb3IzZigwLjAsIDEuMCwgMS4wKTsKKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyICsgMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjAsIDAuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyICsgNDAsIHdpbl9oZWlnaHQgLyAyLCAgICAgIDEuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyICsgMjAsIHdpbl9oZWlnaHQgLyAyICsgMjAsIDAuNSk7CisJZ2xFbmQoKTsKKworCS8qIGVudGlyZWx5IGNsaXBwZWQgYWxvbmcgbmVhci9mYXIgKi8KKwlnbENvbG9yM2YoLjUsIC41LCAuNSk7CisJZ2xCZWdpbihHTF9UUklBTkdMRVMpOworCWdsVmVydGV4M2Yod2luX3dpZHRoIC8gMiAtIDIwLCB3aW5faGVpZ2h0IC8gMiArIDIwLCAtMC41KTsKKwlnbFZlcnRleDNmKHdpbl93aWR0aCAvIDIsICAgICAgd2luX2hlaWdodCAvIDIgKyA0MCwgLTAuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyICsgMjAsIHdpbl9oZWlnaHQgLyAyICsgMjAsIC0wLjUpOworCWdsRW5kKCk7CisKKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyIC0gMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjAsIDEuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyLCAgICAgIHdpbl9oZWlnaHQgLyAyIC0gNDAsIDEuNSk7CisJZ2xWZXJ0ZXgzZih3aW5fd2lkdGggLyAyICsgMjAsIHdpbl9oZWlnaHQgLyAyIC0gMjAsIDEuNSk7CisJZ2xFbmQoKTsKKworCWdsQ29sb3IzZiguNSwgLjUsIC41KTsKKwlsaW5lMyh3aW5fd2lkdGggLyAyLCB3aW5faGVpZ2h0IC8gMiAtIDIwLCAxLjUsCisJICAgICAgd2luX3dpZHRoIC8gMiwgd2luX2hlaWdodCAvIDIgKyAyMCwgMS41KTsKKworCWdsQ29sb3IzZigxLjAsIDEuMCwgMC4wKTsKKwkvKiBjbGlwcGVkIGFsb25nIGJvdGggeCBhbmQgeSBsaW1pdHMgKi8KKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7IC8qIHhtaW4sIHltaW4gKi8KKwlnbFZlcnRleDJmKC01LCAyMCk7CisJZ2xWZXJ0ZXgyZigyMCwgMjApOworCWdsVmVydGV4MmYoMjAsIC01KTsKKwlnbEVuZCgpOworCWdsQmVnaW4oR0xfVFJJQU5HTEVTKTsgLyogeG1pbiwgeW1heCAqLworCWdsVmVydGV4MmYoLTUsIHdpbl9oZWlnaHQgLSAyMCk7CisJZ2xWZXJ0ZXgyZigyMCwgd2luX2hlaWdodCAtIDIwKTsKKwlnbFZlcnRleDJmKDIwLCB3aW5faGVpZ2h0ICsgNSk7CisJZ2xFbmQoKTsKKwlnbEJlZ2luKEdMX1RSSUFOR0xFUyk7IC8qIHhtYXgsIHltYXggKi8KKwlnbFZlcnRleDJmKHdpbl93aWR0aCAtIDIwLCB3aW5faGVpZ2h0ICsgNSk7CisJZ2xWZXJ0ZXgyZih3aW5fd2lkdGggLSAyMCwgd2luX2hlaWdodCAtIDIwKTsKKwlnbFZlcnRleDJmKHdpbl93aWR0aCArIDUsICB3aW5faGVpZ2h0IC0gMjApOworCWdsRW5kKCk7CisJZ2xCZWdpbihHTF9UUklBTkdMRVMpOyAvKiB4bWF4LCB5bWluICovCisJZ2xWZXJ0ZXgyZih3aW5fd2lkdGggKyA1LCAyMCk7CisJZ2xWZXJ0ZXgyZih3aW5fd2lkdGggLSAyMCwgMjApOworCWdsVmVydGV4MmYod2luX3dpZHRoIC0gMjAsIC01KTsKKwlnbEVuZCgpOworCisJZ2x1dFN3YXBCdWZmZXJzKCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwl3aW5fd2lkdGggPSB3aWR0aDsKKwl3aW5faGVpZ2h0ID0gaGVpZ2h0OworCWdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKwlnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisJZ2xMb2FkSWRlbnRpdHkoKTsKKwlnbE9ydGhvKDAsIHdpbl93aWR0aCwgMCwgd2luX2hlaWdodCwgMC4wLCAtMS4wKTsKKworCWdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCWdsTG9hZElkZW50aXR5KCk7CisJZ2xUcmFuc2xhdGVmKC4yNSwgLjI1LCAwKTsKK30KKworc3RhdGljIHZvaWQga2V5KCB1bnNpZ25lZCBjaGFyIGtleSwgaW50IHgsIGludCB5ICkKK3sKKwkodm9pZCkgeDsKKwkodm9pZCkgeTsKKworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSAyNzogLyogZXNjICovCisJCWV4aXQoMCk7CisJCWJyZWFrOworCX0KKworCWdsdXRQb3N0UmVkaXNwbGF5KCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0KHZvaWQpCit7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXdpbl93aWR0aCA9IDIwMDsKKwl3aW5faGVpZ2h0ID0gMjAwOworCisJZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworCWdsdXRJbml0V2luZG93UG9zaXRpb24oMCwgMCk7CisJZ2x1dEluaXRXaW5kb3dTaXplKHdpbl93aWR0aCwgd2luX2hlaWdodCk7CisJZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX1JHQiB8IEdMVVRfRE9VQkxFIHwgR0xVVF9ERVBUSCk7CisJZ2x1dENyZWF0ZVdpbmRvdyhhcmd2WzBdKTsKKwlnbHV0UmVzaGFwZUZ1bmMocmVzaGFwZSk7CisJZ2x1dEtleWJvYXJkRnVuYyhrZXkpOworCWdsdXREaXNwbGF5RnVuYyhkaXNwbGF5KTsKKworCWluaXQoKTsKKworCWdsdXRNYWluTG9vcCgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3MvdG9vbHMvdHJhY2UvTWFrZWZpbGUgYi9wcm9ncy90b29scy90cmFjZS9NYWtlZmlsZQppbmRleCAzZjdiZGNiLi44MjJlNDY2IDEwMDY0NAotLS0gYS9wcm9ncy90b29scy90cmFjZS9NYWtlZmlsZQorKysgYi9wcm9ncy90b29scy90cmFjZS9NYWtlZmlsZQpAQCAtMTYsOCArMTYsOCBAQAogZGVmYXVsdDogJChUUkFDRVIpCiAKICQoVFJBQ0VSKTogJChPQkpFQ1RTKQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gJChUUkFDRVIpIC1ub3ByZWZpeCAtY3BsdXNwbHVzIFwKLQkJJChNS0xJQl9PUFRJT05TKSAkKE9CSkVDVFMpCisJJChNS0xJQikgLW8gJChUUkFDRVIpIC1ub3ByZWZpeCAtY3BsdXNwbHVzIC1saW5rZXIgJyQoQ1hYKScgXAorCQktbGRmbGFncyAnJChMREZMQUdTKScgJChNS0xJQl9PUFRJT05TKSAkKE9CSkVDVFMpCiAKIGdsdHJhY2UuY2M6IGdsdHJhY2UucHkKIAlQWVRIT05QQVRIPSQoVE9QKS9zcmMvbWVzYS9nbGFwaSBweXRob24gZ2x0cmFjZS5weSAtZiAkKFRPUCkvc3JjL21lc2EvZ2xhcGkvZ2xfQVBJLnhtbCAgPiBnbHRyYWNlLmNjCmRpZmYgLS1naXQgYS9wcm9ncy90b29scy90cmFjZS9nbHRyYWNlX3N1cHBvcnQuY2MgYi9wcm9ncy90b29scy90cmFjZS9nbHRyYWNlX3N1cHBvcnQuY2MKaW5kZXggYjE4OGU3My4uMGI3NmQzMiAxMDA2NDQKLS0tIGEvcHJvZ3MvdG9vbHMvdHJhY2UvZ2x0cmFjZV9zdXBwb3J0LmNjCisrKyBiL3Byb2dzL3Rvb2xzL3RyYWNlL2dsdHJhY2Vfc3VwcG9ydC5jYwpAQCAtMjAsNiArMjAsOCBAQAogICovCiAKICNpbmNsdWRlICJnbHRyYWNlX3N1cHBvcnQuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxmc3RyZWFtPgpAQCAtMTM2LDcgKzEzOCw3IEBACiAKICAgICBzdHJ1Y3QgdGltZXZhbCBub3c7CiAgICAgc3RydWN0IHRtIHQ7Ci0gICAgc3RhdGljIGNoYXIgKm1vbnRoc1sxMl0gPSAKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqbW9udGhzWzEyXSA9IAogICAgICAgeyAKIAkiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAKIAkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIApkaWZmIC0tZ2l0IGEvcHJvZ3MvdHJpdmlhbC9NYWtlZmlsZSBiL3Byb2dzL3RyaXZpYWwvTWFrZWZpbGUKaW5kZXggNzg2NTc2Yy4uMDE0NzVmOSAxMDA2NDQKLS0tIGEvcHJvZ3MvdHJpdmlhbC9NYWtlZmlsZQorKysgYi9wcm9ncy90cml2aWFsL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogaW5jbHVkZSAkKFRPUCkvY29uZmlncy9jdXJyZW50CiAKIAotTElCUyA9ICQoQVBQX0xJQl9ERVBTKQorTElCUyA9IC1MJChUT1ApLyQoTElCX0RJUikgLWwkKEdMVVRfTElCKSAtbCQoR0xVX0xJQikgLWwkKEdMX0xJQikgJChBUFBfTElCX0RFUFMpCiAKIFNPVVJDRVMgPSBcCiAJY2xlYXItZmJvLXRleC5jIFwKQEAgLTEzOCw3ICsxMzgsNyBAQAogLlNVRkZJWEVTOiAuYwogCiAuYzoKLQkkKENDKSAkKElOQ0xVREVTKSAkKENGTEFHUykgJDwgJChMSUJTKSAtbyAkQAorCSQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQ8ICQoTElCUykgLW8gJEAKIAogLmMubzoKIAkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQApAQCAtMTUyLDkgKzE1Miw5IEBACiBkZWZhdWx0OiAkKFVUSUxfRklMRVMpICQoUFJPR1MpCiAKIGNsZWFuOgotCXJtIC1mICQoUFJPR1MpCi0Jcm0gLWYgKi5vCi0Jcm0gLWYgZ2V0cHJvY2xpc3QuaAorCS1ybSAtZiAkKFBST0dTKQorCS1ybSAtZiAqLm8KKwktcm0gLWYgZ2V0cHJvY2xpc3QuaAogCiAKICMgYXV0byBjb2RlIGdlbmVyYXRpb24KQEAgLTE2NSwxMyArMTY1LDEzIEBACiAKIAogdGV4cmVjdDogdGV4cmVjdC5vIHJlYWR0ZXgubwotCSQoQ0MpIHRleHJlY3QubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHRleHJlY3QubyByZWFkdGV4Lm8gJChMSUJTKSAtbyAkQAogCiB0ZXhyZWN0Lm86IHRleHJlY3QuYyByZWFkdGV4LmgKIAkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQAogCiBpbnZlcnQ6IGludmVydC5vIHJlYWR0ZXgubwotCSQoQ0MpIGludmVydC5vIHJlYWR0ZXgubyAkKExJQlMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgaW52ZXJ0Lm8gcmVhZHRleC5vICQoTElCUykgLW8gJEAKIAogaW52ZXJ0Lm86IGludmVydC5jIHJlYWR0ZXguaAogCSQoQ0MpIC1jICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKERFRklORVMpICQ8IC1vICRACmRpZmYgLS1naXQgYS9wcm9ncy90cml2aWFsL3BvaW50LXBhcmFtLmMgYi9wcm9ncy90cml2aWFsL3BvaW50LXBhcmFtLmMKaW5kZXggYmU0MzI4ZC4uOTY1NDRhMCAxMDA2NDQKLS0tIGEvcHJvZ3MvdHJpdmlhbC9wb2ludC1wYXJhbS5jCisrKyBiL3Byb2dzL3RyaXZpYWwvcG9pbnQtcGFyYW0uYwpAQCAtMjIsMTUgKzIyLDE0IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPEdML2dsdXQuaD4KIAogCi0jZGVmaW5lIENJX09GRlNFVF8xIDE2Ci0jZGVmaW5lIENJX09GRlNFVF8yIDMyCi0KIAogR0xlbnVtIGRvdWJsZUJ1ZmZlcjsKIApAQCAtNDAsNTMgKzM5LDYzIEBACiAgICBmcHJpbnRmKHN0ZGVyciwgIkdMX1ZFUlNJT04gICAgPSAlc1xuIiwgKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTikpOwogICAgZnByaW50ZihzdGRlcnIsICJHTF9WRU5ET1IgICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOwogCi0gICAgZ2xDbGVhckNvbG9yKDAuMCwgMC4wLCAxLjAsIDAuMCk7CisgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDEuMCwgMC4wKTsKIH0KIAogc3RhdGljIHZvaWQgUmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0KICAgICBnbFZpZXdwb3J0KDAsIDAsIChHTGludCl3aWR0aCwgKEdMaW50KWhlaWdodCk7CiAKICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBnbE9ydGhvKC0xLjAsIDEuMCwgLTEuMCwgMS4wLCAtMC41LCAxMDAwLjApOworICAgIGdsT3J0aG8oLTEuMCwgMS4wLCAtMS4wLCAxLjAsIDAsIDEwMC4wKTsKICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKIH0KIAogc3RhdGljIHZvaWQgS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgeCwgaW50IHkpCiB7Ci0KICAgICBzd2l0Y2ggKGtleSkgewotICAgICAgY2FzZSAyNzoKKyAgICBjYXNlIDI3OgogCWV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgorICAgIGRlZmF1bHQ6CiAJcmV0dXJuOwogICAgIH0KLQogICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CiB9CiAKKworc3RhdGljIGZsb2F0CitleHBlY3RlZChmbG9hdCB6LCBmbG9hdCBzaXplLCBjb25zdCBmbG9hdCBhdHRlblszXSkKK3sKKyAgIGZsb2F0IGRpc3QgPSBmYWJzKHopOworICAgY29uc3QgR0xmbG9hdCBxID0gYXR0ZW5bMF0gKyBkaXN0ICogKGF0dGVuWzFdICsgZGlzdCAqIGF0dGVuWzJdKTsKKyAgIGNvbnN0IEdMZmxvYXQgYSA9IHNxcnQoMS4wIC8gcSk7CisgICByZXR1cm4gc2l6ZSAqIGE7Cit9CisKKwogc3RhdGljIHZvaWQgRHJhdyh2b2lkKQogewotICAgc3RhdGljIEdMZmxvYXQgdGhlUXVhZFszXSA9IHsgMC4yNSwgMC4wLCAxLzYwLjAgfTsKKyAgIHN0YXRpYyBHTGZsb2F0IGF0dGVuWzNdID0geyAwLjAsIDAuMSwgLjAxIH07CisgICBmbG9hdCBzaXplID0gNDAuMDsKKyAgIGludCBpOwogCiAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOyAKIAogICAgZ2xCbGVuZEZ1bmMoR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgIGdsUG9pbnRTaXplKDguMCk7Ci0gICBnbFBvaW50UGFyYW1ldGVyZnZBUkIoR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCB0aGVRdWFkKTsgCisgICBnbFBvaW50U2l6ZShzaXplKTsKKyAgIGdsUG9pbnRQYXJhbWV0ZXJmdkFSQihHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIGF0dGVuKTsgCiAKLQotICAgZ2xCZWdpbihHTF9QT0lOVFMpOwogICAgZ2xDb2xvcjNmKDEsMCwwKTsgCi0gICBnbFZlcnRleDNmKCAwLjksIC0wLjksIC0xMC4wKTsKLSAgIGdsQ29sb3IzZigxLDEsMCk7IAotICAgZ2xWZXJ0ZXgzZiggMC45LCAgMC45LCAtNS4wKTsKLSAgIGdsQ29sb3IzZigxLDAsMSk7IAotICAgZ2xWZXJ0ZXgzZigtMC45LCAgMC45LCAtMzAuMCk7Ci0gICBnbENvbG9yM2YoMCwxLDEpOyAKLSAgIGdsVmVydGV4M2YoLTAuOSwgIC0wLjksIC0yMC4wKTsKKworICAgcHJpbnRmKCJFeHBlY3RlZCBwb2ludCBzaXplczpcbiIpOworICAgZ2xCZWdpbihHTF9QT0lOVFMpOworICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgZmxvYXQgeCA9IC0wLjggKyBpICogMC40OworICAgICAgZmxvYXQgeiA9IC1pICogMjAgLSAxMDsKKyAgICAgIGdsVmVydGV4M2YoIHgsIDAuMCwgeik7CisgICAgICBwcmludGYoIiAlZlxuIiwgZXhwZWN0ZWQoeiwgc2l6ZSwgYXR0ZW4pKTsKKyAgIH0KICAgIGdsRW5kKCk7CiAKICAgIGdsRmx1c2goKTsKQEAgLTk2LDYgKzEwNSw3IEBACiAgICB9CiB9CiAKKwogc3RhdGljIEdMZW51bSBBcmdzKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKICAgICBHTGludCBpOwpAQCAtMTE1LDYgKzEyNSw3IEBACiAgICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIEdMZW51bSB0eXBlOwpAQCAtMTMxLDcgKzE0Miw3IEBACiAgICAgdHlwZSB8PSAoZG91YmxlQnVmZmVyKSA/IEdMVVRfRE9VQkxFIDogR0xVVF9TSU5HTEU7CiAgICAgZ2x1dEluaXREaXNwbGF5TW9kZSh0eXBlKTsKIAotICAgIGlmIChnbHV0Q3JlYXRlV2luZG93KCJGaXJzdCBUcmkiKSA9PSBHTF9GQUxTRSkgeworICAgIGlmIChnbHV0Q3JlYXRlV2luZG93KGFyZ3ZbMF0pID09IEdMX0ZBTFNFKSB7CiAJZXhpdCgxKTsKICAgICB9CiAKQEAgLTE0MSw1ICsxNTIsNSBAQAogICAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKICAgICBnbHV0RGlzcGxheUZ1bmMoRHJhdyk7CiAgICAgZ2x1dE1haW5Mb29wKCk7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9wcm9ncy90cml2aWFsL3F1YWQtY2xpcC1uZWFycGxhbmUuYyBiL3Byb2dzL3RyaXZpYWwvcXVhZC1jbGlwLW5lYXJwbGFuZS5jCmluZGV4IGU3NmViMjkuLjFlODA1NmMgMTAwNjQ0Ci0tLSBhL3Byb2dzL3RyaXZpYWwvcXVhZC1jbGlwLW5lYXJwbGFuZS5jCisrKyBiL3Byb2dzL3RyaXZpYWwvcXVhZC1jbGlwLW5lYXJwbGFuZS5jCkBAIC0zMyw2ICszMyw3IEBACiAKIAogR0xlbnVtIGRvdWJsZUJ1ZmZlcjsKK2Zsb2F0IFogPSAtNjsKIAogc3RhdGljIHZvaWQgSW5pdCh2b2lkKQogewpAQCAtNDAsMzAgKzQxLDM2IEBACiAgICBmcHJpbnRmKHN0ZGVyciwgIkdMX1ZFUlNJT04gICAgPSAlc1xuIiwgKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTikpOwogICAgZnByaW50ZihzdGRlcnIsICJHTF9WRU5ET1IgICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOwogCi0gICAgZ2xDbGVhckNvbG9yKDAuMCwgMC4wLCAxLjAsIDAuMCk7CisgICBmcHJpbnRmKHN0ZGVyciwgIlByZXNzIHovWiB0byB0cmFuc2xhdGUgcXVhZFxuIik7CisKKyAgIGdsQ2xlYXJDb2xvcigwLjAsIDAuMCwgMS4wLCAwLjApOwogfQogCiBzdGF0aWMgdm9pZCBSZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKLQogICAgIGdsVmlld3BvcnQoMCwgMCwgKEdMaW50KXdpZHRoLCAoR0xpbnQpaGVpZ2h0KTsKIAogICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKICAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsT3J0aG8oLTEuMCwgMS4wLCAtMS4wLCAxLjAsIC0wLjUsIDEwMDAuMCk7CisgICAgZ2xGcnVzdHVtKC0xLjAsIDEuMCwgLTEuMCwgMS4wLCA1LCAxMDAuMCk7CiAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiB9CiAKIHN0YXRpYyB2b2lkIEtleSh1bnNpZ25lZCBjaGFyIGtleSwgaW50IHgsIGludCB5KQogewotCiAgICAgc3dpdGNoIChrZXkpIHsKLSAgICAgIGNhc2UgMjc6Ci0JZXhpdCgxKTsKLSAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuOworICAgIGNhc2UgJ3onOgorICAgICAgIFogKz0gMC41OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1onOgorICAgICAgIFogLT0gMC41OworICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6CisgICAgICAgZXhpdCgxKTsKKyAgICBkZWZhdWx0OgorICAgICAgIHJldHVybjsKICAgICB9Ci0KKyAgICBwcmludGYoIlogPSAlZlxuIiwgWik7CiAgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKIH0KIApAQCAtNzEsMTcgKzc4LDIyIEBACiB7CiAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOyAKIAorICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFRyYW5zbGF0ZWYoMCwgLTAuNSwgWik7CisKICAgIGdsQmVnaW4oR0xfUVVBRFMpOwogICAgZ2xDb2xvcjNmKDEsMCwwKTsgCi0gICBnbFZlcnRleDNmKCAwLjksIC0wLjksIDMwLjApOworICAgZ2xWZXJ0ZXgzZiggLTAuOCwgMCwgLTQuMCk7CiAgICBnbENvbG9yM2YoMSwxLDApOyAKLSAgIGdsVmVydGV4M2YoIDAuOSwgIDAuOSwgMzAuMCk7CisgICBnbFZlcnRleDNmKCAgMC44LCAwLCAtNC4wKTsKICAgIGdsQ29sb3IzZigxLDAsMSk7IAotICAgZ2xWZXJ0ZXgzZigtMS45LCAgMC45LCAzMC4wKTsKKyAgIGdsVmVydGV4M2YoICAwLjgsIDAsICA0LjApOwogICAgZ2xDb2xvcjNmKDAsMSwxKTsgCi0gICBnbFZlcnRleDNmKC0xLjksICAtMC45LCAtMzAuMCk7CisgICBnbFZlcnRleDNmKCAtMC44LCAwLCAgNC4wKTsKICAgIGdsRW5kKCk7CiAKKyAgIGdsUG9wTWF0cml4KCk7CisKICAgIGdsRmx1c2goKTsKIAogICAgaWYgKGRvdWJsZUJ1ZmZlcikgewpAQCAtMTE4LDcgKzEzMCw4IEBACiAJZXhpdCgxKTsKICAgICB9CiAKLSAgICBnbHV0SW5pdFdpbmRvd1Bvc2l0aW9uKDAsIDApOyBnbHV0SW5pdFdpbmRvd1NpemUoIDI1MCwgMjUwKTsKKyAgICBnbHV0SW5pdFdpbmRvd1Bvc2l0aW9uKDAsIDApOworICAgIGdsdXRJbml0V2luZG93U2l6ZSggMjUwLCAyNTApOwogCiAgICAgdHlwZSA9IEdMVVRfUkdCIHwgR0xVVF9BTFBIQTsKICAgICB0eXBlIHw9IChkb3VibGVCdWZmZXIpID8gR0xVVF9ET1VCTEUgOiBHTFVUX1NJTkdMRTsKQEAgLTEzNCw1ICsxNDcsNSBAQAogICAgIGdsdXRLZXlib2FyZEZ1bmMoS2V5KTsKICAgICBnbHV0RGlzcGxheUZ1bmMoRHJhdyk7CiAgICAgZ2x1dE1haW5Mb29wKCk7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9wcm9ncy90cml2aWFsL3RyaS5jIGIvcHJvZ3MvdHJpdmlhbC90cmkuYwppbmRleCAxMmZhOGQxLi5jNzVhY2IzIDEwMDY0NAotLS0gYS9wcm9ncy90cml2aWFsL3RyaS5jCisrKyBiL3Byb2dzL3RyaXZpYWwvdHJpLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogCiBHTGVudW0gZG91YmxlQnVmZmVyID0gMTsKK2ludCB3aW47CiAKIHN0YXRpYyB2b2lkIEluaXQodm9pZCkKIHsKQEAgLTU5LDYgKzYwLDEwIEBACiAKICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgY2FzZSAyNzoKKzw8PDw8PDwgSEVBRDpwcm9ncy90cml2aWFsL3RyaS5jCisgICAgICAgICBnbHV0RGVzdHJveVdpbmRvdyh3aW4pOworPT09PT09PQorPj4+Pj4+PiBnYWxsaXVtLTAuMTpwcm9ncy90cml2aWFsL3RyaS5jCiAJZXhpdCgwKTsKICAgICAgIGRlZmF1bHQ6CiAJcmV0dXJuOwpAQCAtMTIwLDcgKzEyNSw4IEBACiAgICAgdHlwZSB8PSAoZG91YmxlQnVmZmVyKSA/IEdMVVRfRE9VQkxFIDogR0xVVF9TSU5HTEU7CiAgICAgZ2x1dEluaXREaXNwbGF5TW9kZSh0eXBlKTsKIAotICAgIGlmIChnbHV0Q3JlYXRlV2luZG93KCJGaXJzdCBUcmkiKSA9PSBHTF9GQUxTRSkgeworICAgIHdpbiA9IGdsdXRDcmVhdGVXaW5kb3coIkZpcnN0IFRyaSIpOworICAgIGlmICghd2luKSB7CiAJZXhpdCgxKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Byb2dzL3V0aWwvc2hhZGVydXRpbC5jIGIvcHJvZ3MvdXRpbC9zaGFkZXJ1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxN2RkNwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dzL3V0aWwvc2hhZGVydXRpbC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKioKKyAqIFV0aWxpdGllcyBmb3IgT3BlbkdMIHNoYWRpbmcgbGFuZ3VhZ2UKKyAqCisgKiBCcmlhbiBQYXVsCisgKiA5IEFwcmlsIDIwMDgKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPEdML2dsdXQuaD4KKyNpbmNsdWRlICJleHRmdW5jcy5oIgorI2luY2x1ZGUgInNoYWRlcnV0aWwuaCIKKworCitzdGF0aWMgdm9pZAorSW5pdCh2b2lkKQoreworICAgc3RhdGljIEdMYm9vbGVhbiBmaXJzdENhbGwgPSBHTF9UUlVFOworICAgaWYgKGZpcnN0Q2FsbCkgeworICAgICAgR2V0RXh0ZW5zaW9uRnVuY3MoKTsKKyAgICAgIGZpcnN0Q2FsbCA9IEdMX0ZBTFNFOworICAgfQorfQorCisKK0dMYm9vbGVhbgorU2hhZGVyc1N1cHBvcnRlZCh2b2lkKQoreworICAgY29uc3QgY2hhciAqdmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOworICAgaWYgKHZlcnNpb25bMF0gPT0gJzInICYmIHZlcnNpb25bMV0gPT0gJy4nKSB7CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIH0KKyAgIGVsc2UgaWYgKGdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FSQl92ZXJ0ZXhfc2hhZGVyIikKKyAgICAgICAgICAgICYmIGdsdXRFeHRlbnNpb25TdXBwb3J0ZWQoIkdMX0FSQl9mcmFnbWVudF9zaGFkZXIiKQorICAgICAgICAgICAgJiYgZ2x1dEV4dGVuc2lvblN1cHBvcnRlZCgiR0xfQVJCX3NoYWRlcl9vYmplY3RzIikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogVHJ5aW5nIEFSQiBHTFNMIGluc3RlYWQgb2YgT3BlbkdMIDIueC4gIFRoaXMgbWF5IG5vdCB3b3JrLlxuIik7CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIH0KKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKK0dMdWludAorQ29tcGlsZVNoYWRlclRleHQoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIgKnRleHQpCit7CisgICBHTHVpbnQgc2hhZGVyOworICAgR0xpbnQgc3RhdDsKKworICAgSW5pdCgpOworCisgICBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcl9mdW5jKHNoYWRlclR5cGUpOworICAgZ2xTaGFkZXJTb3VyY2VfZnVuYyhzaGFkZXIsIDEsIChjb25zdCBHTGNoYXIgKiopICZ0ZXh0LCBOVUxMKTsKKyAgIGdsQ29tcGlsZVNoYWRlcl9mdW5jKHNoYWRlcik7CisgICBnbEdldFNoYWRlcml2X2Z1bmMoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXQpOworICAgaWYgKCFzdGF0KSB7CisgICAgICBHTGNoYXIgbG9nWzEwMDBdOworICAgICAgR0xzaXplaSBsZW47CisgICAgICBnbEdldFNoYWRlckluZm9Mb2dfZnVuYyhzaGFkZXIsIDEwMDAsICZsZW4sIGxvZyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyBzaGFkZXI6ICVzXG4iLCBsb2cpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLypwcmludGYoIlNoYWRlciBjb21waWxlZCBPS1xuIik7Ki8KKyAgIH0KKyAgIHJldHVybiBzaGFkZXI7Cit9CisKKworLyoqCisgKiBSZWFkIGEgc2hhZGVyIGZyb20gYSBmaWxlLgorICovCitHTHVpbnQKK0NvbXBpbGVTaGFkZXJGaWxlKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgIGNvbnN0IGludCBtYXggPSAxMDAqMTAwMDsKKyAgIGludCBuOworICAgY2hhciAqYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MobWF4KTsKKyAgIEdMdWludCBzaGFkZXI7CisKKyAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgIGlmICghZikgeworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIG4gPSBmcmVhZChidWZmZXIsIDEsIG1heCwgZik7CisgICAvKnByaW50ZigicmVhZCAlZCBieXRlcyBmcm9tIHNoYWRlciBmaWxlICVzXG4iLCBuLCBmaWxlbmFtZSk7Ki8KKyAgIGlmIChuID4gMCkgeworICAgICAgYnVmZmVyW25dID0gMDsKKyAgICAgIHNoYWRlciA9IENvbXBpbGVTaGFkZXJUZXh0KHNoYWRlclR5cGUsIGJ1ZmZlcik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBmY2xvc2UoZik7CisgICBmcmVlKGJ1ZmZlcik7CisKKyAgIHJldHVybiBzaGFkZXI7Cit9CisKKworR0x1aW50CitMaW5rU2hhZGVycyhHTHVpbnQgdmVydFNoYWRlciwgR0x1aW50IGZyYWdTaGFkZXIpCit7CisgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbV9mdW5jKCk7CisKKyAgIGdsQXR0YWNoU2hhZGVyX2Z1bmMocHJvZ3JhbSwgZnJhZ1NoYWRlcik7CisgICBnbEF0dGFjaFNoYWRlcl9mdW5jKHByb2dyYW0sIHZlcnRTaGFkZXIpOworICAgZ2xMaW5rUHJvZ3JhbV9mdW5jKHByb2dyYW0pOworCisgICAvKiBjaGVjayBsaW5rICovCisgICB7CisgICAgICBHTGludCBzdGF0OworICAgICAgZ2xHZXRQcm9ncmFtaXZfZnVuYyhwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJnN0YXQpOworICAgICAgaWYgKCFzdGF0KSB7CisgICAgICAgICBHTGNoYXIgbG9nWzEwMDBdOworICAgICAgICAgR0xzaXplaSBsZW47CisgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nX2Z1bmMocHJvZ3JhbSwgMTAwMCwgJmxlbiwgbG9nKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2hhZGVyIGxpbmsgZXJyb3I6XG4lc1xuIiwgbG9nKTsKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gcHJvZ3JhbTsKK30KKworCit2b2lkCitJbml0VW5pZm9ybXMoR0x1aW50IHByb2dyYW0sIHN0cnVjdCB1bmlmb3JtX2luZm8gdW5pZm9ybXNbXSkKK3sKKyAgIEdMdWludCBpOworCisgICBmb3IgKGkgPSAwOyB1bmlmb3Jtc1tpXS5uYW1lOyBpKyspIHsKKyAgICAgIHVuaWZvcm1zW2ldLmxvY2F0aW9uCisgICAgICAgICA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uX2Z1bmMocHJvZ3JhbSwgdW5pZm9ybXNbaV0ubmFtZSk7CisKKyAgICAgIHByaW50ZigiVW5pZm9ybSAlcyBsb2NhdGlvbjogJWRcbiIsIHVuaWZvcm1zW2ldLm5hbWUsCisgICAgICAgICAgICAgdW5pZm9ybXNbaV0ubG9jYXRpb24pOworCisgICAgICBzd2l0Y2ggKHVuaWZvcm1zW2ldLnNpemUpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIGlmICh1bmlmb3Jtc1tpXS50eXBlID09IEdMX0lOVCkKKyAgICAgICAgICAgIGdsVW5pZm9ybTFpX2Z1bmModW5pZm9ybXNbaV0ubG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHTGludCkgdW5pZm9ybXNbaV0udmFsdWVbMF0pOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2X2Z1bmModW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIHVuaWZvcm1zW2ldLnZhbHVlKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICAgZ2xVbmlmb3JtMmZ2X2Z1bmModW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIHVuaWZvcm1zW2ldLnZhbHVlKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICAgZ2xVbmlmb3JtM2Z2X2Z1bmModW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIHVuaWZvcm1zW2ldLnZhbHVlKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICAgZ2xVbmlmb3JtNGZ2X2Z1bmModW5pZm9ybXNbaV0ubG9jYXRpb24sIDEsIHVuaWZvcm1zW2ldLnZhbHVlKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFib3J0KCk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS9wcm9ncy91dGlsL3NoYWRlcnV0aWwuaCBiL3Byb2dzL3V0aWwvc2hhZGVydXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYjhjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy91dGlsL3NoYWRlcnV0aWwuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIFNIQURFUl9VVElMX0gKKyNkZWZpbmUgU0hBREVSX1VUSUxfSAorCisKKworc3RydWN0IHVuaWZvcm1faW5mbworeworICAgY29uc3QgY2hhciAqbmFtZTsKKyAgIEdMdWludCBzaXplOworICAgR0xlbnVtIHR5cGU7ICAvKio8IEdMX0ZMT0FUIG9yIEdMX0lOVCAqLworICAgR0xmbG9hdCB2YWx1ZVs0XTsKKyAgIEdMaW50IGxvY2F0aW9uOyAgLyoqPCBmaWxsZWQgaW4gYnkgSW5pdFVuaWZvcm1zKCkgKi8KK307CisKKyNkZWZpbmUgRU5EX09GX1VOSUZPUk1TICAgeyBOVUxMLCAwLCBHTF9OT05FLCB7IDAsIDAsIDAsIDAgfSwgLTEgfQorCisKK2V4dGVybiBHTGJvb2xlYW4KK1NoYWRlcnNTdXBwb3J0ZWQodm9pZCk7CisKK2V4dGVybiBHTHVpbnQKK0NvbXBpbGVTaGFkZXJUZXh0KEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyICp0ZXh0KTsKKworZXh0ZXJuIEdMdWludAorQ29tcGlsZVNoYWRlckZpbGUoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworZXh0ZXJuIEdMdWludAorTGlua1NoYWRlcnMoR0x1aW50IHZlcnRTaGFkZXIsIEdMdWludCBmcmFnU2hhZGVyKTsKKworZXh0ZXJuIHZvaWQKK0luaXRVbmlmb3JtcyhHTHVpbnQgcHJvZ3JhbSwgc3RydWN0IHVuaWZvcm1faW5mbyB1bmlmb3Jtc1tdKTsKKworCisjZW5kaWYgLyogU0hBREVSX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvcHJvZ3MvdnAvTWFrZWZpbGUgYi9wcm9ncy92cC9NYWtlZmlsZQppbmRleCBjM2ZhZWI1Li4yOGQ2MzIzIDEwMDY0NAotLS0gYS9wcm9ncy92cC9NYWtlZmlsZQorKysgYi9wcm9ncy92cC9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIGluY2x1ZGUgJChUT1ApL2NvbmZpZ3MvY3VycmVudAogCiAKLUxJQlMgPSAkKEFQUF9MSUJfREVQUykKK0xJQlMgPSAtTCQoVE9QKS8kKExJQl9ESVIpIC1sJChHTFVUX0xJQikgLWwkKEdMVV9MSUIpIC1sJChHTF9MSUIpICQoQVBQX0xJQl9ERVBTKQogCiBTT1VSQ0VTID0gXAogCXZwLXRyaXMuYwpAQCAtMjYsNyArMjYsNyBAQAogLlNVRkZJWEVTOiAuYwogCiAuYzoKLQkkKENDKSAkKElOQ0xVREVTKSAkKENGTEFHUykgJDwgJChMSUJTKSAtbyAkQAorCSQoQ0MpICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQ8ICQoTElCUykgLW8gJEAKIAogLmMubzoKIAkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZJTkVTKSAkPCAtbyAkQApAQCAtNDAsOSArNDAsOSBAQAogZGVmYXVsdDogJChQUk9HUykKIAogY2xlYW46Ci0Jcm0gLWYgJChQUk9HUykKLQlybSAtZiAqLm8KLQlybSAtZiBnZXRwcm9jbGlzdC5oCisJLXJtIC1mICQoUFJPR1MpCisJLXJtIC1mICoubworCS1ybSAtZiBnZXRwcm9jbGlzdC5oCiAKIAogCmRpZmYgLS1naXQgYS9wcm9ncy94ZGVtb3MvLmdpdGlnbm9yZSBiL3Byb2dzL3hkZW1vcy8uZ2l0aWdub3JlCmluZGV4IDM0NTUxMTAuLjg2ODI0OWQgMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy8uZ2l0aWdub3JlCisrKyBiL3Byb2dzL3hkZW1vcy8uZ2l0aWdub3JlCkBAIC0xLDEyICsxLDE1IEBACitjb3JlbmRlcgogZ2x0aHJlYWRzCiBnbHhjb250ZXh0cwogZ2x4ZGVtbwogZ2x4Z2VhcnMKIGdseGdlYXJzX2ZiY29uZmlnCitnbHhnZWFyc19waXhtYXAKIGdseGhlYWRzCiBnbHhpbmZvCiBnbHhwYmRlbW8KIGdseHBpeG1hcAorZ2x4c25vb3AKIGdseHN3YXBjb250cm9sCiBtYW55d2luCiBvZmZzZXQKZGlmZiAtLWdpdCBhL3Byb2dzL3hkZW1vcy9NYWtlZmlsZSBiL3Byb2dzL3hkZW1vcy9NYWtlZmlsZQppbmRleCA4OTZiMTYwLi5iMjU5NjcxIDEwMDY0NAotLS0gYS9wcm9ncy94ZGVtb3MvTWFrZWZpbGUKKysrIGIvcHJvZ3MveGRlbW9zL01ha2VmaWxlCkBAIC02LDE3ICs2LDIzIEBACiAKIElOQ0RJUiA9ICQoVE9QKS9pbmNsdWRlCiAKLUxJQl9ERVAgPSAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkKK0xJQl9ERVAgPSAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKQogCi1QUk9HUyA9IGdsdGhyZWFkcyBcCitMSUJTID0gLUwkKFRPUCkvJChMSUJfRElSKSAtbCQoR0xfTElCKSAkKEFQUF9MSUJfREVQUykKKworUFJPR1MgPSBcCisJY29yZW5kZXIgXAorCWdsdGhyZWFkcyBcCiAJZ2x4ZGVtbyBcCiAJZ2x4Z2VhcnMgXAogCWdseGdlYXJzX2ZiY29uZmlnIFwKKwlnbHhnZWFyc19waXhtYXAgXAogCWdseGNvbnRleHRzIFwKIAlnbHhoZWFkcyBcCiAJZ2x4aW5mbyBcCiAJZ2x4cGl4bWFwIFwKIAlnbHhwYmRlbW8gXAorCWdseHNub29wIFwKIAlnbHhzd2FwY29udHJvbCBcCiAJbWFueXdpbiBcCiAJb2Zmc2V0IFwKQEAgLTI3LDEwICszMywxNCBAQAogCXRleHR1cmVfZnJvbV9waXhtYXAgXAogCXdpbmNvcHkgXAogCXhmb250IFwKLQl4cm90Zm9udGRlbW8gXAotCXl1dnJlY3RfY2xpZW50CisJeHJvdGZvbnRkZW1vCiAKLSMgb21pdCB0aGlzIFhNZXNhIEFQSSBkZW1vOgl4ZGVtbworIyBEb24ndCBidWlsZCB0aGVzZSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgZXh0cmEgbGlicmFyeSBkZXBlbmRlbmNpZXMKK0VYVFJBX1BST0dTID0gXAorCXNoYXBlIFwKKwl5dXZyZWN0X2NsaWVudCBcCisJeGRlbW8KKwogCiAKICMjIyMjIFJVTEVTICMjIyMjCkBAIC0zOSw3ICs0OSw3IEBACiAuU1VGRklYRVM6IC5jCiAKIC5jOiAkKExJQl9ERVApCi0JJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpICQ8ICQoQVBQX0xJQl9ERVBTKSAtbyAkQAorCSQoQ0MpIC1JJChJTkNESVIpICQoWDExX0lOQ0xVREVTKSAkKENGTEFHUykgJChMREZMQUdTKSAkPCAkKExJQlMpIC1vICRACiAKIAogIyMjIyMgVEFSR0VUUyAjIyMjIwpAQCAtNDcsMzkgKzU3LDU0IEBACiBkZWZhdWx0OiAkKFBST0dTKQogCiAKK2V4dHJhOiAkKEVYVFJBX1BST0dTKQorCisKIGNsZWFuOgotCS1ybSAtZiAkKFBST0dTKQorCS1ybSAtZiAkKFBST0dTKSAkKEVYVFJBX1BST0dTKQogCS1ybSAtZiAqLm8gKn4KIAogCiAjIHNwZWNpYWwgY2FzZXMKIHBiaW5mbzogcGJpbmZvLm8gcGJ1dGlsLm8KLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgcGJpbmZvLm8gcGJ1dGlsLm8gJChBUFBfTElCX0RFUFMpIC1vICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgcGJpbmZvLm8gcGJ1dGlsLm8gJChMSUJTKSAtbyAkQAogCiBwYmRlbW86IHBiZGVtby5vIHBidXRpbC5vCi0JJChDQykgLUkkKElOQ0RJUikgJChDRkxBR1MpIHBiZGVtby5vIHBidXRpbC5vICQoQVBQX0xJQl9ERVBTKSAtbyAkQAorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBiZGVtby5vIHBidXRpbC5vICQoTElCUykgLW8gJEAKIAogcGJpbmZvLm86IHBiaW5mby5jIHBidXRpbC5oCi0JJChDQykgLWMgLUkuIC1JJChJTkNESVIpICQoQ0ZMQUdTKSBwYmluZm8uYworCSQoQ0MpIC1jIC1JLiAtSSQoSU5DRElSKSAkKFgxMV9JTkNMVURFUykgJChDRkxBR1MpIHBiaW5mby5jCiAKIHBiZGVtby5vOiBwYmRlbW8uYyBwYnV0aWwuaAotCSQoQ0MpIC1jIC1JLiAtSSQoSU5DRElSKSAkKENGTEFHUykgcGJkZW1vLmMKKwkkKENDKSAtYyAtSS4gLUkkKElOQ0RJUikgJChYMTFfSU5DTFVERVMpICQoQ0ZMQUdTKSBwYmRlbW8uYwogCiBwYnV0aWwubzogcGJ1dGlsLmMgcGJ1dGlsLmgKLQkkKENDKSAtYyAtSS4gLUkkKElOQ0RJUikgJChDRkxBR1MpIHBidXRpbC5jCisJJChDQykgLWMgLUkuIC1JJChJTkNESVIpICQoWDExX0lOQ0xVREVTKSAkKENGTEFHUykgcGJ1dGlsLmMKIAogZ2x4Z2VhcnNfZmJjb25maWc6IGdseGdlYXJzX2ZiY29uZmlnLm8gcGJ1dGlsLm8KLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgZ2x4Z2VhcnNfZmJjb25maWcubyBwYnV0aWwubyAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSBnbHhnZWFyc19mYmNvbmZpZy5vIHBidXRpbC5vICQoTElCUykgLW8gJEAKIAogZ2x4Z2VhcnNfZmJjb25maWcubzogZ2x4Z2VhcnNfZmJjb25maWcuYyBwYnV0aWwuaAotCSQoQ0MpIC1JJChJTkNESVIpICQoQ0ZMQUdTKSAtYyAtSS4gJChDRkxBR1MpIGdseGdlYXJzX2ZiY29uZmlnLmMKKwkkKENDKSAtSSQoSU5DRElSKSAkKFgxMV9JTkNMVURFUykgJChDRkxBR1MpIC1jIC1JLiAkKENGTEFHUykgZ2x4Z2VhcnNfZmJjb25maWcuYwogCiB4cm90Zm9udGRlbW86IHhyb3Rmb250ZGVtby5vIHh1c2Vyb3Rmb250Lm8KLQkkKENDKSAtSSQoSU5DRElSKSAkKENGTEFHUykgeHJvdGZvbnRkZW1vLm8geHVzZXJvdGZvbnQubyAkKEFQUF9MSUJfREVQUykgLW8gJEAKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSB4cm90Zm9udGRlbW8ubyB4dXNlcm90Zm9udC5vICQoTElCUykgLW8gJEAKIAogeHVzZXJvdGZvbnQubzogeHVzZXJvdGZvbnQuYyB4dXNlcm90Zm9udC5oCi0JJChDQykgLWMgLUkuIC1JJChJTkNESVIpICQoQ0ZMQUdTKSB4dXNlcm90Zm9udC5jCisJJChDQykgLWMgLUkuIC1JJChJTkNESVIpICQoWDExX0lOQ0xVREVTKSAkKENGTEFHUykgeHVzZXJvdGZvbnQuYwogCiB4cm90Zm9udGRlbW8ubzogeHJvdGZvbnRkZW1vLmMgeHVzZXJvdGZvbnQuaAotCSQoQ0MpIC1jIC1JLiAtSSQoSU5DRElSKSAkKENGTEFHUykgeHJvdGZvbnRkZW1vLmMKKwkkKENDKSAtYyAtSS4gLUkkKElOQ0RJUikgJChYMTFfSU5DTFVERVMpICQoQ0ZMQUdTKSB4cm90Zm9udGRlbW8uYworCitjb3JlbmRlcjogY29yZW5kZXIubyBpcGMubworCSQoQ0MpICQoQ0ZMQUdTKSBjb3JlbmRlci5vIGlwYy5vICQoTElCUykgLW8gJEAKKworY29yZW5kZXIubzogY29yZW5kZXIuYyBpcGMuaAorCSQoQ0MpIC1jIC1JLiAtSSQoSU5DRElSKSAkKFgxMV9JTkNMVURFUykgJChDRkxBR1MpIGNvcmVuZGVyLmMKKworaXBjLm86IGlwYy5jIGlwYy5oCisJJChDQykgLWMgLUkuIC1JJChJTkNESVIpICQoWDExX0lOQ0xVREVTKSAkKENGTEFHUykgaXBjLmMKKworeXV2cmVjdF9jbGllbnQ6IHl1dnJlY3RfY2xpZW50LmMKKwkkKENDKSAtSSQoSU5DRElSKSAkKFgxMV9JTkNMVURFUykgJChDRkxBR1MpICQ8ICQoTERGTEFHUykgJChMSUJTKSAtbCQoR0xVX0xJQikgLW8gJEAKIApkaWZmIC0tZ2l0IGEvcHJvZ3MveGRlbW9zL2NvcmVuZGVyLmMgYi9wcm9ncy94ZGVtb3MvY29yZW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI4MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MveGRlbW9zL2NvcmVuZGVyLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qKgorICogRXhhbXBsZSBvZiBjb29wZXJhdGl2ZSByZW5kZXJpbmcgaW50byBvbmUgd2luZG93IGJ5IHR3byBwcm9jZXNzZXMuCisgKiBUaGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHByb2dyYW0gY3JlYXRlcyB0aGUgR0xYIHdpbmRvdy4KKyAqIFRoZSBzZWNvbmQgaW5zdGFuY2Ugb2YgdGhlIHByb2dyYW0gZ2V0cyB0aGUgd2luZG93IElEIGZyb20gdGhlIGZpcnN0CisgKiBhbmQgZHJhd3MgaW50byBpdC4KKyAqIFNvY2tldCBJUEMgaXMgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uLgorICoKKyAqIFVzYWdlOgorICogMS4gcnVuICdjb3JlbmRlciAmJworICogMi4gcnVuICdjb3JlbmRlciAyJyAgKGFueSBhcmcgd2lsbCBkbykKKyAqCisgKiBCcmlhbiBQYXVsCisgKiAxMSBPY3QgMjAwNworICovCisKKworI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8R0wvZ2x4Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImlwYy5oIgorCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCitzdGF0aWMgaW50IE15SUQgPSAwOyAgLyogMCBvciAxICovCitzdGF0aWMgaW50IFdpbmRvd0lEID0gMDsKK3N0YXRpYyBHTFhDb250ZXh0IENvbnRleHQgPSAwOworc3RhdGljIGludCBXaWR0aCA9IDcwMCwgSGVpZ2h0ID0gMzUwOworc3RhdGljIGludCBSb3QgPSAwOworc3RhdGljIGludCBTb2NrID0gMDsKKworc3RhdGljIEdMZmxvYXQgUmVkWzRdID0gezEuMCwgMC4yLCAwLjIsIDEuMH07CitzdGF0aWMgR0xmbG9hdCBCbHVlWzRdID0gezAuMiwgMC4yLCAxLjAsIDEuMH07CisKK3N0YXRpYyBpbnQgU3luYyA9IDE7ICAvKiogc3luY2hyb25pemVkIHJlbmRlcmluZz8gKi8KKworCitzdGF0aWMgdm9pZAorc2V0dXBfaXBjKHZvaWQpCit7CisgICBpbnQgaywgcG9ydCA9IDEwMDAxOworCisgICBpZiAoTXlJRCA9PSAwKSB7CisgICAgICAvKiBJJ20gdGhlIGZpcnN0IG9uZSwgd2FpdCBmb3IgY29ubmVjdGlvbiBmcm9tIHNlY29uZCAqLworICAgICAgayA9IENyZWF0ZVBvcnQoJnBvcnQpOworICAgICAgYXNzZXJ0KGsgIT0gLTEpOworCisgICAgICBwcmludGYoIldhaXRpbmcgZm9yIGNvbm5lY3Rpb24gZnJvbSBhbm90aGVyICdjb3JlbmRlcidcbiIpOworICAgICAgU29jayA9IEFjY2VwdENvbm5lY3Rpb24oayk7CisKKyAgICAgIHByaW50ZigiR290IGNvbm5lY3Rpb24sIHNlbmRpbmcgd2luZG93SURcbiIpOworCisgICAgICAvKiBzZW5kIHdpbmRvd0lEICovCisgICAgICBTZW5kRGF0YShTb2NrLCAmV2luZG93SUQsIHNpemVvZihXaW5kb3dJRCkpOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBJJ20gdGhlIHNlY29uZCBvbmUsIGNvbm5lY3QgdG8gZmlyc3QgKi8KKyAgICAgIGNoYXIgaG9zdG5hbWVbMTAwMF07CisKKyAgICAgIE15SG9zdE5hbWUoaG9zdG5hbWUsIDEwMDApOworICAgICAgU29jayA9IENvbm5lY3QoaG9zdG5hbWUsIHBvcnQpOworICAgICAgYXNzZXJ0KFNvY2sgIT0gLTEpOworCisgICAgICAvKiBnZXQgd2luZG93SUQgKi8KKyAgICAgIFJlY2VpdmVEYXRhKFNvY2ssICZXaW5kb3dJRCwgc2l6ZW9mKFdpbmRvd0lEKSk7CisgICAgICBwcmludGYoIkNvbnRhY3RlZCBmaXJzdCAnY29yZW5kZXInLCBnZXR0aW5nIFdpbmRvd0lEXG4iKTsKKyAgIH0KK30KKworCisKKy8qKiBmcm9tIEdMVVQgKi8KK3N0YXRpYyB2b2lkCitkb3VnaG51dChHTGZsb2F0IHIsIEdMZmxvYXQgUiwgR0xpbnQgbnNpZGVzLCBHTGludCByaW5ncykKK3sKKyAgaW50IGksIGo7CisgIEdMZmxvYXQgdGhldGEsIHBoaSwgdGhldGExOworICBHTGZsb2F0IGNvc1RoZXRhLCBzaW5UaGV0YTsKKyAgR0xmbG9hdCBjb3NUaGV0YTEsIHNpblRoZXRhMTsKKyAgR0xmbG9hdCByaW5nRGVsdGEsIHNpZGVEZWx0YTsKKworICByaW5nRGVsdGEgPSAyLjAgKiBNX1BJIC8gcmluZ3M7CisgIHNpZGVEZWx0YSA9IDIuMCAqIE1fUEkgLyBuc2lkZXM7CisKKyAgdGhldGEgPSAwLjA7CisgIGNvc1RoZXRhID0gMS4wOworICBzaW5UaGV0YSA9IDAuMDsKKyAgZm9yIChpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgeworICAgIHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOworICAgIGNvc1RoZXRhMSA9IGNvcyh0aGV0YTEpOworICAgIHNpblRoZXRhMSA9IHNpbih0aGV0YTEpOworICAgIGdsQmVnaW4oR0xfUVVBRF9TVFJJUCk7CisgICAgcGhpID0gMC4wOworICAgIGZvciAoaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKKyAgICAgIEdMZmxvYXQgY29zUGhpLCBzaW5QaGksIGRpc3Q7CisKKyAgICAgIHBoaSArPSBzaWRlRGVsdGE7CisgICAgICBjb3NQaGkgPSBjb3MocGhpKTsKKyAgICAgIHNpblBoaSA9IHNpbihwaGkpOworICAgICAgZGlzdCA9IFIgKyByICogY29zUGhpOworCisgICAgICBnbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKKyAgICAgIGdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOworICAgICAgZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOworICAgICAgZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsICByICogc2luUGhpKTsKKyAgICB9CisgICAgZ2xFbmQoKTsKKyAgICB0aGV0YSA9IHRoZXRhMTsKKyAgICBjb3NUaGV0YSA9IGNvc1RoZXRhMTsKKyAgICBzaW5UaGV0YSA9IHNpblRoZXRhMTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWRyYXcoRGlzcGxheSAqZHB5KQoreworICAgaW50IGRiZyA9IDA7CisKKyAgIGdsWE1ha2VDdXJyZW50KGRweSwgV2luZG93SUQsIENvbnRleHQpOworICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKKyAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgZ2xDbGVhckNvbG9yKDAuNSwgMC41LCAwLjUsIDAuMCk7CisKKyAgIGlmIChNeUlEID09IDApIHsKKyAgICAgIC8qIEZpcnN0IHByb2Nlc3MgKi8KKworICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgZ2xUcmFuc2xhdGVmKC0xLCAwLCAwKTsKKyAgICAgIGdsUm90YXRlZihSb3QsIDEsIDAsIDApOworICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCBSZWQpOworICAgICAgZG91Z2hudXQoMC41LCAyLjAsIDIwLCAzMCk7CisgICAgICBnbFBvcE1hdHJpeCgpOworCisgICAgICBnbEZpbmlzaCgpOworICAgICAgaWYgKCFTeW5jKSB7CisgICAgICAgICB1c2xlZXAoMTAwMCoxMCk7CisgICAgICB9CisKKyAgICAgIC8qIHNpZ25hbCBzZWNvbmQgcHJvY2VzcyB0byByZW5kZXIgKi8KKyAgICAgIGlmIChTeW5jKSB7CisgICAgICAgICBpbnQgY29kZSA9IDE7CisgICAgICAgICBpZiAoZGJnKSBwcmludGYoIjA6IHNlbmQgc2lnbmFsXG4iKTsKKyAgICAgICAgIFNlbmREYXRhKFNvY2ssICZjb2RlLCBzaXplb2YoY29kZSkpOworICAgICAgICAgU2VuZERhdGEoU29jaywgJlJvdCwgc2l6ZW9mKFJvdCkpOworICAgICAgfQorCisgICAgICAvKiB3YWl0IGZvciBzZWNvbmQgcHJvY2VzcyB0byBmaW5pc2ggcmVuZGVyaW5nICovCisgICAgICBpZiAoU3luYykgeworICAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICAgaWYgKGRiZykgcHJpbnRmKCIwOiB3YWl0IHNpZ25hbFxuIik7CisgICAgICAgICBSZWNlaXZlRGF0YShTb2NrLCAmY29kZSwgc2l6ZW9mKGNvZGUpKTsKKyAgICAgICAgIGlmIChkYmcpIHByaW50ZigiMDogZ290IHNpZ25hbFxuIik7CisgICAgICAgICBhc3NlcnQoY29kZSA9PSAyKTsKKyAgICAgIH0KKworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBTZWNvbmQgcHJvY2VzcyAqLworCisgICAgICAvKiB3YWl0IGZvciBmaXJzdCBwcm9jZXNzJ3Mgc2lnbmFsIGZvciBtZSB0byByZW5kZXIgKi8KKyAgICAgIGlmIChTeW5jKSB7CisgICAgICAgICBpbnQgY29kZSA9IDA7CisgICAgICAgICBpZiAoZGJnKSBwcmludGYoIjE6IHdhaXQgc2lnbmFsXG4iKTsKKyAgICAgICAgIFJlY2VpdmVEYXRhKFNvY2ssICZjb2RlLCBzaXplb2YoY29kZSkpOworICAgICAgICAgUmVjZWl2ZURhdGEoU29jaywgJlJvdCwgc2l6ZW9mKFJvdCkpOworCisgICAgICAgICBpZiAoZGJnKSBwcmludGYoIjE6IGdvdCBzaWduYWxcbiIpOworICAgICAgICAgYXNzZXJ0KGNvZGUgPT0gMSk7CisgICAgICB9CisKKyAgICAgIC8qIFhYWCB0aGlzIGNsZWFyIHNob3VsZCBub3QgYmUgaGVyZSwgYnV0IGZvciBzb21lIHJlYXNvbiwgaXQKKyAgICAgICAqIG1ha2VzIHRoaW5ncyBfbW9zdGx5XyB3b3JrIGNvcnJlY3RseSB3LyBOVklESUEncyBkcml2ZXIuCisgICAgICAgKiBUaGVyZSdzIG9ubHkgb2NjYXNpb25hbCBnbGl0Y2hlcy4KKyAgICAgICAqIFdpdGhvdXQgdGhpcyBnbENsZWFyKCksIGRlcHRoIGJ1ZmZlciBmb3IgdGhlIHNlY29uZCBwcm9jZXNzCisgICAgICAgKiBpcyBwcmV0dHkgbXVjaCBicm9rZW4uCisgICAgICAgKi8KKyAgICAgIC8vZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICBnbFRyYW5zbGF0ZWYoMSwgMCwgMCk7CisgICAgICBnbFJvdGF0ZWYoUm90ICsgOTAgLCAxLCAwLCAwKTsKKyAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwgQmx1ZSk7CisgICAgICBkb3VnaG51dCgwLjUsIDIuMCwgMjAsIDMwKTsKKyAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgICBnbEZpbmlzaCgpOworCisgICAgICBnbFhTd2FwQnVmZmVycyhkcHksIFdpbmRvd0lEKTsKKyAgICAgIHVzbGVlcCgxMDAwKjEwKTsKKworICAgICAgLyogc2lnbmFsIGZpcnN0IHByb2Nlc3MgdGhhdCBJJ20gZG9uZSByZW5kZXJpbmcgKi8KKyAgICAgIGlmIChTeW5jKSB7CisgICAgICAgICBpbnQgY29kZSA9IDI7CisgICAgICAgICBpZiAoZGJnKSBwcmludGYoIjE6IHNlbmQgc2lnbmFsXG4iKTsKKyAgICAgICAgIFNlbmREYXRhKFNvY2ssICZjb2RlLCBzaXplb2YoY29kZSkpOworICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZXNpemUoRGlzcGxheSAqZHB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBmbG9hdCBhciA9IChmbG9hdCkgd2lkdGggLyBoZWlnaHQ7CisKKyAgIGdsWE1ha2VDdXJyZW50KGRweSwgV2luZG93SUQsIENvbnRleHQpOworCisgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsRnJ1c3R1bSgtYXIsIGFyLCAxLjAsIC0xLjAsIDUuMCwgMjAwLjApOworICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xUcmFuc2xhdGVmKDAsIDAsIC0xNSk7CisKKyAgIFdpZHRoID0gd2lkdGg7CisgICBIZWlnaHQgPSBoZWlnaHQ7Cit9CisKKworCitzdGF0aWMgdm9pZAorc2V0X3dpbmRvd190aXRsZShEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4sIGNvbnN0IGNoYXIgKnRpdGxlKQoreworICAgWFNpemVIaW50cyBzaXplaGludHM7CisgICBzaXplaGludHMuZmxhZ3MgPSAwOworICAgWFNldFN0YW5kYXJkUHJvcGVydGllcyhkcHksIHdpbiwgdGl0bGUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAoY2hhciAqKilOVUxMLCAwLCAmc2l6ZWhpbnRzKTsKK30KKworCitzdGF0aWMgV2luZG93CittYWtlX2dsX3dpbmRvdyhEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXNpbmZvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBpbnQgc2NybnVtOworICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKKyAgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgIFdpbmRvdyByb290OworICAgV2luZG93IHdpbjsKKyAgIGludCB4ID0gMCwgeSA9IDA7CisgICBjaGFyICpuYW1lID0gTlVMTDsKKworICAgc2NybnVtID0gRGVmYXVsdFNjcmVlbiggZHB5ICk7CisgICByb290ID0gUm9vdFdpbmRvdyggZHB5LCBzY3JudW0gKTsKKworICAgLyogd2luZG93IGF0dHJpYnV0ZXMgKi8KKyAgIGF0dHIuYmFja2dyb3VuZF9waXhlbCA9IDA7CisgICBhdHRyLmJvcmRlcl9waXhlbCA9IDA7CisgICBhdHRyLmNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKCBkcHksIHJvb3QsIHZpc2luZm8tPnZpc3VhbCwgQWxsb2NOb25lKTsKKyAgIGF0dHIuZXZlbnRfbWFzayA9IFN0cnVjdHVyZU5vdGlmeU1hc2sgfCBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2s7CisgICBtYXNrID0gQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsIHwgQ1dDb2xvcm1hcCB8IENXRXZlbnRNYXNrOworCisgICB3aW4gPSBYQ3JlYXRlV2luZG93KCBkcHksIHJvb3QsIHgsIHksIHdpZHRoLCBoZWlnaHQsCisJCSAgICAgICAgMCwgdmlzaW5mby0+ZGVwdGgsIElucHV0T3V0cHV0LAorCQkgICAgICAgIHZpc2luZm8tPnZpc3VhbCwgbWFzaywgJmF0dHIgKTsKKworICAgLyogc2V0IGhpbnRzIGFuZCBwcm9wZXJ0aWVzICovCisgICB7CisgICAgICBYU2l6ZUhpbnRzIHNpemVoaW50czsKKyAgICAgIHNpemVoaW50cy54ID0geDsKKyAgICAgIHNpemVoaW50cy55ID0geTsKKyAgICAgIHNpemVoaW50cy53aWR0aCAgPSB3aWR0aDsKKyAgICAgIHNpemVoaW50cy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICBzaXplaGludHMuZmxhZ3MgPSBVU1NpemUgfCBVU1Bvc2l0aW9uOworICAgICAgWFNldE5vcm1hbEhpbnRzKGRweSwgd2luLCAmc2l6ZWhpbnRzKTsKKyAgICAgIFhTZXRTdGFuZGFyZFByb3BlcnRpZXMoZHB5LCB3aW4sIG5hbWUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAoY2hhciAqKilOVUxMLCAwLCAmc2l6ZWhpbnRzKTsKKyAgIH0KKworICAgcmV0dXJuIHdpbjsKK30KKworCitzdGF0aWMgdm9pZAorc2V0X2V2ZW50X21hc2soRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luKQoreworICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKKyAgIGF0dHIuZXZlbnRfbWFzayA9IFN0cnVjdHVyZU5vdGlmeU1hc2sgfCBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2s7CisgICBYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhkcHksIHdpbiwgQ1dFdmVudE1hc2ssICZhdHRyKTsKK30KKworCitzdGF0aWMgdm9pZAorZXZlbnRfbG9vcChEaXNwbGF5ICpkcHkpCit7CisgICB3aGlsZSAoMSkgeworICAgICAgd2hpbGUgKFhQZW5kaW5nKGRweSkgPiAwKSB7CisgICAgICAgICBYRXZlbnQgZXZlbnQ7CisgICAgICAgICBYTmV4dEV2ZW50KGRweSwgJmV2ZW50KTsKKworICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CisgICAgICAgICBjYXNlIEV4cG9zZToKKyAgICAgICAgICAgIHJlZHJhdyhkcHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIENvbmZpZ3VyZU5vdGlmeToKKyAgICAgICAgICAgIHJlc2l6ZShkcHksIGV2ZW50Lnhjb25maWd1cmUud2lkdGgsIGV2ZW50Lnhjb25maWd1cmUuaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBLZXlQcmVzczoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwXTsKKyAgICAgICAgICAgICAgIGludCByLCBjb2RlOworICAgICAgICAgICAgICAgY29kZSA9IFhMb29rdXBLZXlzeW0oJmV2ZW50LnhrZXksIDApOworICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gWEtfTGVmdCkgeworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICByID0gWExvb2t1cFN0cmluZygmZXZlbnQueGtleSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclswXSA9PSAyNykgeworICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBub3RoaW5nICovCisgICAgICAgICAgICA7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChNeUlEID09IDAgfHwgIVN5bmMpCisgICAgICAgICBSb3QgKz0gMTsKKyAgICAgIHJlZHJhdyhkcHkpOworICAgfQorfQorCisKK3N0YXRpYyBYVmlzdWFsSW5mbyAqCitjaG9vc2VfdmlzdWFsKERpc3BsYXkgKmRweSkKK3sKKyAgIGludCBhdHRyaWJzW10gPSB7IEdMWF9SR0JBLAorICAgICAgICAgICAgICAgICAgICAgR0xYX1JFRF9TSVpFLCAxLAorICAgICAgICAgICAgICAgICAgICAgR0xYX0dSRUVOX1NJWkUsIDEsCisgICAgICAgICAgICAgICAgICAgICBHTFhfQkxVRV9TSVpFLCAxLAorICAgICAgICAgICAgICAgICAgICAgR0xYX0RPVUJMRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgIEdMWF9ERVBUSF9TSVpFLCAxLAorICAgICAgICAgICAgICAgICAgICAgTm9uZSB9OworICAgaW50IHNjcm51bSA9IERlZmF1bHRTY3JlZW4oIGRweSApOworICAgcmV0dXJuIGdsWENob29zZVZpc3VhbChkcHksIHNjcm51bSwgYXR0cmlicyk7Cit9CisKKworc3RhdGljIHZvaWQKK3BhcnNlX29wdHMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgIGlmIChhcmdjID4gMSkgeworICAgICAgTXlJRCA9IDE7CisgICB9Cit9CisKKworaW50CittYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3sKKyAgIERpc3BsYXkgKmRweTsKKyAgIFhWaXN1YWxJbmZvICp2aXNpbmZvOworCisgICBwYXJzZV9vcHRzKGFyZ2MsIGFyZ3YpOworCisgICBkcHkgPSBYT3BlbkRpc3BsYXkoTlVMTCk7CisKKyAgIHZpc2luZm8gPSBjaG9vc2VfdmlzdWFsKGRweSk7CisKKyAgIENvbnRleHQgPSBnbFhDcmVhdGVDb250ZXh0KCBkcHksIHZpc2luZm8sIE5VTEwsIFRydWUgKTsKKyAgIGlmICghQ29udGV4dCkgeworICAgICAgcHJpbnRmKCJFcnJvcjogZ2xYQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOworICAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgaWYgKE15SUQgPT0gMCkgeworICAgICAgV2luZG93SUQgPSBtYWtlX2dsX3dpbmRvdyhkcHksIHZpc2luZm8sIFdpZHRoLCBIZWlnaHQpOworICAgICAgc2V0X3dpbmRvd190aXRsZShkcHksIFdpbmRvd0lELCAiY29yZW5kZXIiKTsKKyAgICAgIFhNYXBXaW5kb3coZHB5LCBXaW5kb3dJRCk7CisgICAgICAvKnByaW50ZigiV2luZG93SUQgMHgleFxuIiwgKGludCkgV2luZG93SUQpOyovCisgICB9CisKKyAgIC8qIGRvIGlwYyBoYW5kLXNoYWtlIGhlcmUgKi8KKyAgIHNldHVwX2lwYygpOworICAgYXNzZXJ0KFNvY2spOworICAgYXNzZXJ0KFdpbmRvd0lEKTsKKworICAgaWYgKE15SUQgPT0gMSkgeworICAgICAgc2V0X2V2ZW50X21hc2soZHB5LCBXaW5kb3dJRCk7CisgICB9CisKKyAgIHJlc2l6ZShkcHksIFdpZHRoLCBIZWlnaHQpOworCisgICBldmVudF9sb29wKGRweSk7CisKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3MveGRlbW9zL2dseGdlYXJzX3BpeG1hcC5jIGIvcHJvZ3MveGRlbW9zL2dseGdlYXJzX3BpeG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MWQxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy94ZGVtb3MvZ2x4Z2VhcnNfcGl4bWFwLmMKQEAgLTAsMCArMSw1NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFJlZCBIYXQsIEluYyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGdseGdlYXJzX3BpeG1hcC5jCisgKiBZZXQtYW5vdGhlci12ZXJzaW9uIG9mIGdlYXJzLiAgT3JpZ2luYWxseSBwb3J0ZWQgdG8gR0xYIGJ5IEJyaWFuIFBhdWwgb24KKyAqIDIzIE1hcmNoIDIwMDEuICBNb2RpZmllZCB0byB1c2UgZmJjb25maWdzIGJ5IElhbiBSb21hbmljayBvbiAxMCBGZWIgMjAwNC4KKyAqCisgKiBDb21tYW5kIGxpbmUgb3B0aW9uczoKKyAqICAgIC1pbmZvICAgICAgcHJpbnQgR0wgaW1wbGVtZW50YXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBcYXV0aG9yIEJyaWFuIFBhdWwKKyAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpZHJAdXMuaWJtLmNvbT4KKyAqIFxhdXRob3IgS3Jpc3RpYW4gSG9lZ3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KKyAqLworCisKKyNkZWZpbmUgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKyNpbmNsdWRlIDxHTC9nbC5oPgorI2luY2x1ZGUgPEdML2dseC5oPgorI2luY2x1ZGUgPEdML2dseGV4dC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInBidXRpbC5oIgorCisjZGVmaW5lIEJFTkNITUFSSworCisjaWZkZWYgQkVOQ0hNQVJLCisKKy8qIFhYWCB0aGlzIHByb2JhYmx5IGlzbid0IHZlcnkgcG9ydGFibGUgKi8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIHJldHVybiBjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpICovCitzdGF0aWMgaW50CitjdXJyZW50X3RpbWUodm9pZCkKK3sKKyAgIHN0cnVjdCB0aW1ldmFsIHR2OworI2lmZGVmIF9fVk1TCisgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCApOworI2Vsc2UKKyAgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworI2VuZGlmCisgICByZXR1cm4gKGludCkgdHYudHZfc2VjOworfQorCisjZWxzZSAvKkJFTkNITUFSSyovCisKKy8qIGR1bW15ICovCitzdGF0aWMgaW50CitjdXJyZW50X3RpbWUodm9pZCkKK3sKKyAgIHJldHVybiAwOworfQorCisjZW5kaWYgLypCRU5DSE1BUksqLworCisKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NQorI2VuZGlmCisKKworc3RhdGljIEdMZmxvYXQgdmlld19yb3R4ID0gMjAuMCwgdmlld19yb3R5ID0gMzAuMCwgdmlld19yb3R6ID0gMC4wOworc3RhdGljIEdMaW50IGdlYXIxLCBnZWFyMiwgZ2VhcjM7CitzdGF0aWMgR0xmbG9hdCBhbmdsZSA9IDAuMDsKKworCisvKgorICoKKyAqICBEcmF3IGEgZ2VhciB3aGVlbC4gIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuCisgKiAgYnVpbGRpbmcgYSBkaXNwbGF5IGxpc3Qgc2luY2Ugd2UgZG8gYSBsb3Qgb2YgdHJpZyBoZXJlLgorICogCisgKiAgSW5wdXQ6ICBpbm5lcl9yYWRpdXMgLSByYWRpdXMgb2YgaG9sZSBhdCBjZW50ZXIKKyAqICAgICAgICAgIG91dGVyX3JhZGl1cyAtIHJhZGl1cyBhdCBjZW50ZXIgb2YgdGVldGgKKyAqICAgICAgICAgIHdpZHRoIC0gd2lkdGggb2YgZ2VhcgorICogICAgICAgICAgdGVldGggLSBudW1iZXIgb2YgdGVldGgKKyAqICAgICAgICAgIHRvb3RoX2RlcHRoIC0gZGVwdGggb2YgdG9vdGgKKyAqLworc3RhdGljIHZvaWQKK2dlYXIoR0xmbG9hdCBpbm5lcl9yYWRpdXMsIEdMZmxvYXQgb3V0ZXJfcmFkaXVzLCBHTGZsb2F0IHdpZHRoLAorICAgICBHTGludCB0ZWV0aCwgR0xmbG9hdCB0b290aF9kZXB0aCkKK3sKKyAgIEdMaW50IGk7CisgICBHTGZsb2F0IHIwLCByMSwgcjI7CisgICBHTGZsb2F0IGFuZ2xlLCBkYTsKKyAgIEdMZmxvYXQgdSwgdiwgbGVuOworCisgICByMCA9IGlubmVyX3JhZGl1czsKKyAgIHIxID0gb3V0ZXJfcmFkaXVzIC0gdG9vdGhfZGVwdGggLyAyLjA7CisgICByMiA9IG91dGVyX3JhZGl1cyArIHRvb3RoX2RlcHRoIC8gMi4wOworCisgICBkYSA9IDIuMCAqIE1fUEkgLyB0ZWV0aCAvIDQuMDsKKworICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICBnbE5vcm1hbDNmKDAuMCwgMC4wLCAxLjApOworCisgICAvKiBkcmF3IGZyb250IGZhY2UgKi8KKyAgIGdsQmVnaW4oR0xfUVVBRF9TVFJJUCk7CisgICBmb3IgKGkgPSAwOyBpIDw9IHRlZXRoOyBpKyspIHsKKyAgICAgIGFuZ2xlID0gaSAqIDIuMCAqIE1fUEkgLyB0ZWV0aDsKKyAgICAgIGdsVmVydGV4M2YocjAgKiBjb3MoYW5nbGUpLCByMCAqIHNpbihhbmdsZSksIHdpZHRoICogMC41KTsKKyAgICAgIGdsVmVydGV4M2YocjEgKiBjb3MoYW5nbGUpLCByMSAqIHNpbihhbmdsZSksIHdpZHRoICogMC41KTsKKyAgICAgIGlmIChpIDwgdGVldGgpIHsKKwkgZ2xWZXJ0ZXgzZihyMCAqIGNvcyhhbmdsZSksIHIwICogc2luKGFuZ2xlKSwgd2lkdGggKiAwLjUpOworCSBnbFZlcnRleDNmKHIxICogY29zKGFuZ2xlICsgMyAqIGRhKSwgcjEgKiBzaW4oYW5nbGUgKyAzICogZGEpLAorCQkgICAgd2lkdGggKiAwLjUpOworICAgICAgfQorICAgfQorICAgZ2xFbmQoKTsKKworICAgLyogZHJhdyBmcm9udCBzaWRlcyBvZiB0ZWV0aCAqLworICAgZ2xCZWdpbihHTF9RVUFEUyk7CisgICBkYSA9IDIuMCAqIE1fUEkgLyB0ZWV0aCAvIDQuMDsKKyAgIGZvciAoaSA9IDA7IGkgPCB0ZWV0aDsgaSsrKSB7CisgICAgICBhbmdsZSA9IGkgKiAyLjAgKiBNX1BJIC8gdGVldGg7CisKKyAgICAgIGdsVmVydGV4M2YocjEgKiBjb3MoYW5nbGUpLCByMSAqIHNpbihhbmdsZSksIHdpZHRoICogMC41KTsKKyAgICAgIGdsVmVydGV4M2YocjIgKiBjb3MoYW5nbGUgKyBkYSksIHIyICogc2luKGFuZ2xlICsgZGEpLCB3aWR0aCAqIDAuNSk7CisgICAgICBnbFZlcnRleDNmKHIyICogY29zKGFuZ2xlICsgMiAqIGRhKSwgcjIgKiBzaW4oYW5nbGUgKyAyICogZGEpLAorCQkgd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMSAqIGNvcyhhbmdsZSArIDMgKiBkYSksIHIxICogc2luKGFuZ2xlICsgMyAqIGRhKSwKKwkJIHdpZHRoICogMC41KTsKKyAgIH0KKyAgIGdsRW5kKCk7CisKKyAgIGdsTm9ybWFsM2YoMC4wLCAwLjAsIC0xLjApOworCisgICAvKiBkcmF3IGJhY2sgZmFjZSAqLworICAgZ2xCZWdpbihHTF9RVUFEX1NUUklQKTsKKyAgIGZvciAoaSA9IDA7IGkgPD0gdGVldGg7IGkrKykgeworICAgICAgYW5nbGUgPSBpICogMi4wICogTV9QSSAvIHRlZXRoOworICAgICAgZ2xWZXJ0ZXgzZihyMSAqIGNvcyhhbmdsZSksIHIxICogc2luKGFuZ2xlKSwgLXdpZHRoICogMC41KTsKKyAgICAgIGdsVmVydGV4M2YocjAgKiBjb3MoYW5nbGUpLCByMCAqIHNpbihhbmdsZSksIC13aWR0aCAqIDAuNSk7CisgICAgICBpZiAoaSA8IHRlZXRoKSB7CisJIGdsVmVydGV4M2YocjEgKiBjb3MoYW5nbGUgKyAzICogZGEpLCByMSAqIHNpbihhbmdsZSArIDMgKiBkYSksCisJCSAgICAtd2lkdGggKiAwLjUpOworCSBnbFZlcnRleDNmKHIwICogY29zKGFuZ2xlKSwgcjAgKiBzaW4oYW5nbGUpLCAtd2lkdGggKiAwLjUpOworICAgICAgfQorICAgfQorICAgZ2xFbmQoKTsKKworICAgLyogZHJhdyBiYWNrIHNpZGVzIG9mIHRlZXRoICovCisgICBnbEJlZ2luKEdMX1FVQURTKTsKKyAgIGRhID0gMi4wICogTV9QSSAvIHRlZXRoIC8gNC4wOworICAgZm9yIChpID0gMDsgaSA8IHRlZXRoOyBpKyspIHsKKyAgICAgIGFuZ2xlID0gaSAqIDIuMCAqIE1fUEkgLyB0ZWV0aDsKKworICAgICAgZ2xWZXJ0ZXgzZihyMSAqIGNvcyhhbmdsZSArIDMgKiBkYSksIHIxICogc2luKGFuZ2xlICsgMyAqIGRhKSwKKwkJIC13aWR0aCAqIDAuNSk7CisgICAgICBnbFZlcnRleDNmKHIyICogY29zKGFuZ2xlICsgMiAqIGRhKSwgcjIgKiBzaW4oYW5nbGUgKyAyICogZGEpLAorCQkgLXdpZHRoICogMC41KTsKKyAgICAgIGdsVmVydGV4M2YocjIgKiBjb3MoYW5nbGUgKyBkYSksIHIyICogc2luKGFuZ2xlICsgZGEpLCAtd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMSAqIGNvcyhhbmdsZSksIHIxICogc2luKGFuZ2xlKSwgLXdpZHRoICogMC41KTsKKyAgIH0KKyAgIGdsRW5kKCk7CisKKyAgIC8qIGRyYXcgb3V0d2FyZCBmYWNlcyBvZiB0ZWV0aCAqLworICAgZ2xCZWdpbihHTF9RVUFEX1NUUklQKTsKKyAgIGZvciAoaSA9IDA7IGkgPCB0ZWV0aDsgaSsrKSB7CisgICAgICBhbmdsZSA9IGkgKiAyLjAgKiBNX1BJIC8gdGVldGg7CisKKyAgICAgIGdsVmVydGV4M2YocjEgKiBjb3MoYW5nbGUpLCByMSAqIHNpbihhbmdsZSksIHdpZHRoICogMC41KTsKKyAgICAgIGdsVmVydGV4M2YocjEgKiBjb3MoYW5nbGUpLCByMSAqIHNpbihhbmdsZSksIC13aWR0aCAqIDAuNSk7CisgICAgICB1ID0gcjIgKiBjb3MoYW5nbGUgKyBkYSkgLSByMSAqIGNvcyhhbmdsZSk7CisgICAgICB2ID0gcjIgKiBzaW4oYW5nbGUgKyBkYSkgLSByMSAqIHNpbihhbmdsZSk7CisgICAgICBsZW4gPSBzcXJ0KHUgKiB1ICsgdiAqIHYpOworICAgICAgdSAvPSBsZW47CisgICAgICB2IC89IGxlbjsKKyAgICAgIGdsTm9ybWFsM2YodiwgLXUsIDAuMCk7CisgICAgICBnbFZlcnRleDNmKHIyICogY29zKGFuZ2xlICsgZGEpLCByMiAqIHNpbihhbmdsZSArIGRhKSwgd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMiAqIGNvcyhhbmdsZSArIGRhKSwgcjIgKiBzaW4oYW5nbGUgKyBkYSksIC13aWR0aCAqIDAuNSk7CisgICAgICBnbE5vcm1hbDNmKGNvcyhhbmdsZSksIHNpbihhbmdsZSksIDAuMCk7CisgICAgICBnbFZlcnRleDNmKHIyICogY29zKGFuZ2xlICsgMiAqIGRhKSwgcjIgKiBzaW4oYW5nbGUgKyAyICogZGEpLAorCQkgd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMiAqIGNvcyhhbmdsZSArIDIgKiBkYSksIHIyICogc2luKGFuZ2xlICsgMiAqIGRhKSwKKwkJIC13aWR0aCAqIDAuNSk7CisgICAgICB1ID0gcjEgKiBjb3MoYW5nbGUgKyAzICogZGEpIC0gcjIgKiBjb3MoYW5nbGUgKyAyICogZGEpOworICAgICAgdiA9IHIxICogc2luKGFuZ2xlICsgMyAqIGRhKSAtIHIyICogc2luKGFuZ2xlICsgMiAqIGRhKTsKKyAgICAgIGdsTm9ybWFsM2YodiwgLXUsIDAuMCk7CisgICAgICBnbFZlcnRleDNmKHIxICogY29zKGFuZ2xlICsgMyAqIGRhKSwgcjEgKiBzaW4oYW5nbGUgKyAzICogZGEpLAorCQkgd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMSAqIGNvcyhhbmdsZSArIDMgKiBkYSksIHIxICogc2luKGFuZ2xlICsgMyAqIGRhKSwKKwkJIC13aWR0aCAqIDAuNSk7CisgICAgICBnbE5vcm1hbDNmKGNvcyhhbmdsZSksIHNpbihhbmdsZSksIDAuMCk7CisgICB9CisKKyAgIGdsVmVydGV4M2YocjEgKiBjb3MoMCksIHIxICogc2luKDApLCB3aWR0aCAqIDAuNSk7CisgICBnbFZlcnRleDNmKHIxICogY29zKDApLCByMSAqIHNpbigwKSwgLXdpZHRoICogMC41KTsKKworICAgZ2xFbmQoKTsKKworICAgZ2xTaGFkZU1vZGVsKEdMX1NNT09USCk7CisKKyAgIC8qIGRyYXcgaW5zaWRlIHJhZGl1cyBjeWxpbmRlciAqLworICAgZ2xCZWdpbihHTF9RVUFEX1NUUklQKTsKKyAgIGZvciAoaSA9IDA7IGkgPD0gdGVldGg7IGkrKykgeworICAgICAgYW5nbGUgPSBpICogMi4wICogTV9QSSAvIHRlZXRoOworICAgICAgZ2xOb3JtYWwzZigtY29zKGFuZ2xlKSwgLXNpbihhbmdsZSksIDAuMCk7CisgICAgICBnbFZlcnRleDNmKHIwICogY29zKGFuZ2xlKSwgcjAgKiBzaW4oYW5nbGUpLCAtd2lkdGggKiAwLjUpOworICAgICAgZ2xWZXJ0ZXgzZihyMCAqIGNvcyhhbmdsZSksIHIwICogc2luKGFuZ2xlKSwgd2lkdGggKiAwLjUpOworICAgfQorICAgZ2xFbmQoKTsKK30KKworCitzdGF0aWMgdm9pZAorZHJhdyh2b2lkKQoreworICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgIGdsUHVzaE1hdHJpeCgpOworICAgZ2xSb3RhdGVmKHZpZXdfcm90eCwgMS4wLCAwLjAsIDAuMCk7CisgICBnbFJvdGF0ZWYodmlld19yb3R5LCAwLjAsIDEuMCwgMC4wKTsKKyAgIGdsUm90YXRlZih2aWV3X3JvdHosIDAuMCwgMC4wLCAxLjApOworCisgICBnbFB1c2hNYXRyaXgoKTsKKyAgIGdsVHJhbnNsYXRlZigtMy4wLCAtMi4wLCAwLjApOworICAgZ2xSb3RhdGVmKGFuZ2xlLCAwLjAsIDAuMCwgMS4wKTsKKyAgIGdsQ2FsbExpc3QoZ2VhcjEpOworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2xQdXNoTWF0cml4KCk7CisgICBnbFRyYW5zbGF0ZWYoMy4xLCAtMi4wLCAwLjApOworICAgZ2xSb3RhdGVmKC0yLjAgKiBhbmdsZSAtIDkuMCwgMC4wLCAwLjAsIDEuMCk7CisgICBnbENhbGxMaXN0KGdlYXIyKTsKKyAgIGdsUG9wTWF0cml4KCk7CisKKyAgIGdsUHVzaE1hdHJpeCgpOworICAgZ2xUcmFuc2xhdGVmKC0zLjEsIDQuMiwgMC4wKTsKKyAgIGdsUm90YXRlZigtMi4wICogYW5nbGUgLSAyNS4wLCAwLjAsIDAuMCwgMS4wKTsKKyAgIGdsQ2FsbExpc3QoZ2VhcjMpOworICAgZ2xQb3BNYXRyaXgoKTsKKworICAgZ2xQb3BNYXRyaXgoKTsKK30KKworCitzdHJ1Y3QgZ2VhcnMgeworICAgV2luZG93IHdpbjsKKyAgIEdMWENvbnRleHQgY3R4OworICAgUGl4bWFwIHBpeG1hcDsKKyAgIEdMWFBpeG1hcCBnbHhwaXhtYXA7CisgICBHQyBnYzsKKyAgIGludCB3aWR0aCwgaGVpZ2h0OworfTsKKworCisvKiBuZXcgd2luZG93IHNpemUgb3IgZXhwb3N1cmUgKi8KK3N0YXRpYyB2b2lkCityZXNoYXBlKHN0cnVjdCBnZWFycyAqZ2VhcnMsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgIGdlYXJzLT53aWR0aCA9IHdpZHRoOworICAgZ2VhcnMtPmhlaWdodCA9IGhlaWdodDsKK30KKworCitzdGF0aWMgdm9pZAoraW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICBzdGF0aWMgR0xmbG9hdCBwb3NbNF0gPSB7IDUuMCwgNS4wLCAxMC4wLCAwLjAgfTsKKyAgIHN0YXRpYyBHTGZsb2F0IHJlZFs0XSA9IHsgMC44LCAwLjEsIDAuMCwgMS4wIH07CisgICBzdGF0aWMgR0xmbG9hdCBncmVlbls0XSA9IHsgMC4wLCAwLjgsIDAuMiwgMS4wIH07CisgICBzdGF0aWMgR0xmbG9hdCBibHVlWzRdID0geyAwLjIsIDAuMiwgMS4wLCAxLjAgfTsKKyAgIEdMZmxvYXQgaCA9IChHTGZsb2F0KSBoZWlnaHQgLyAoR0xmbG9hdCkgd2lkdGg7CisKKyAgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBwb3MpOworICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKworICAgLyogbWFrZSB0aGUgZ2VhcnMgKi8KKyAgIGdlYXIxID0gZ2xHZW5MaXN0cygxKTsKKyAgIGdsTmV3TGlzdChnZWFyMSwgR0xfQ09NUElMRSk7CisgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlQsIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UsIHJlZCk7CisgICBnZWFyKDEuMCwgNC4wLCAxLjAsIDIwLCAwLjcpOworICAgZ2xFbmRMaXN0KCk7CisKKyAgIGdlYXIyID0gZ2xHZW5MaXN0cygxKTsKKyAgIGdsTmV3TGlzdChnZWFyMiwgR0xfQ09NUElMRSk7CisgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlQsIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UsIGdyZWVuKTsKKyAgIGdlYXIoMC41LCAyLjAsIDIuMCwgMTAsIDAuNyk7CisgICBnbEVuZExpc3QoKTsKKworICAgZ2VhcjMgPSBnbEdlbkxpc3RzKDEpOworICAgZ2xOZXdMaXN0KGdlYXIzLCBHTF9DT01QSUxFKTsKKyAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVCwgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwgYmx1ZSk7CisgICBnZWFyKDEuMywgMi4wLCAwLjUsIDEwLCAwLjcpOworICAgZ2xFbmRMaXN0KCk7CisKKyAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisKKyAgIGdsVmlld3BvcnQoMCwgMCwgKEdMaW50KSB3aWR0aCwgKEdMaW50KSBoZWlnaHQpOworICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgIGdsRnJ1c3R1bSgtMS4wLCAxLjAsIC1oLCBoLCA1LjAsIDYwLjApOworICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICBnbExvYWRJZGVudGl0eSgpOworICAgZ2xUcmFuc2xhdGVmKDAuMCwgMC4wLCAtNDAuMCk7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gUkdCLCBkb3VibGUtYnVmZmVyZWQgd2luZG93LgorICogUmV0dXJuIHRoZSB3aW5kb3cgYW5kIGNvbnRleHQgaGFuZGxlcy4KKyAqLworc3RhdGljIHZvaWQKK21ha2Vfd2luZG93KCBEaXNwbGF5ICpkcHksIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHN0cnVjdCBnZWFycyAqZ2VhcnMpCit7CisgICBpbnQgYXR0cmliW10gPSB7IEdMWF9EUkFXQUJMRV9UWVBFLCBHTFhfV0lORE9XX0JJVCwKKwkJICAgIEdMWF9SRU5ERVJfVFlQRSwgICBHTFhfUkdCQV9CSVQsCisJCSAgICBHTFhfUkVEX1NJWkUsICAgICAgMSwKKwkJICAgIEdMWF9HUkVFTl9TSVpFLCAgICAxLAorCQkgICAgR0xYX0JMVUVfU0laRSwgICAgIDEsCisJCSAgICBHTFhfRE9VQkxFQlVGRkVSLCAgR0xfRkFMU0UsCisJCSAgICBHTFhfREVQVEhfU0laRSwgICAgMSwKKwkJICAgIE5vbmUgfTsKKyAgIEdMWEZCQ29uZmlnICogZmJjb25maWc7CisgICBpbnQgbnVtX2NvbmZpZ3M7CisgICBpbnQgc2NybnVtOworICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKKyAgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgIFdpbmRvdyByb290OworICAgWFZpc3VhbEluZm8gKnZpc2luZm87CisKKyAgIGdlYXJzLT53aWR0aCA9IHdpZHRoOworICAgZ2VhcnMtPmhlaWdodCA9IGhlaWdodDsKKworICAgc2NybnVtID0gRGVmYXVsdFNjcmVlbiggZHB5ICk7CisgICByb290ID0gUm9vdFdpbmRvdyggZHB5LCBzY3JudW0gKTsKKworICAgZmJjb25maWcgPSBnbFhDaG9vc2VGQkNvbmZpZyhkcHksIHNjcm51bSwgYXR0cmliLCAmIG51bV9jb25maWdzKTsKKyAgIGlmIChmYmNvbmZpZyA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIkVycm9yOiBjb3VsZG4ndCBnZXQgYW4gUkdCLCBEb3VibGUtYnVmZmVyZWQgdmlzdWFsXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIC8qIHdpbmRvdyBhdHRyaWJ1dGVzICovCisgICB2aXNpbmZvID0gZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnKGRweSwgZmJjb25maWdbMF0pOworICAgYXNzZXJ0KHZpc2luZm8gIT0gTlVMTCk7CisgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOworICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAwOworICAgYXR0ci5jb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcCggZHB5LCByb290LCB2aXNpbmZvLT52aXN1YWwsIEFsbG9jTm9uZSk7CisgICBhdHRyLmV2ZW50X21hc2sgPSBTdHJ1Y3R1cmVOb3RpZnlNYXNrIHwgRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrOworICAgbWFzayA9IENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8IENXQ29sb3JtYXAgfCBDV0V2ZW50TWFzazsKKworICAgZ2VhcnMtPndpbiA9IFhDcmVhdGVXaW5kb3coIGRweSwgcm9vdCwgMCwgMCwgd2lkdGgsIGhlaWdodCwKKwkJCSAgICAgICAwLCB2aXNpbmZvLT5kZXB0aCwgSW5wdXRPdXRwdXQsCisJCQkgICAgICAgdmlzaW5mby0+dmlzdWFsLCBtYXNrLCAmYXR0ciApOworCisgICAvKiBzZXQgaGludHMgYW5kIHByb3BlcnRpZXMgKi8KKyAgIHsKKyAgICAgIFhTaXplSGludHMgc2l6ZWhpbnRzOworICAgICAgc2l6ZWhpbnRzLnggPSB4OworICAgICAgc2l6ZWhpbnRzLnkgPSB5OworICAgICAgc2l6ZWhpbnRzLndpZHRoICA9IHdpZHRoOworICAgICAgc2l6ZWhpbnRzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIHNpemVoaW50cy5mbGFncyA9IFVTU2l6ZSB8IFVTUG9zaXRpb247CisgICAgICBYU2V0Tm9ybWFsSGludHMoZHB5LCBnZWFycy0+d2luLCAmc2l6ZWhpbnRzKTsKKyAgICAgIFhTZXRTdGFuZGFyZFByb3BlcnRpZXMoZHB5LCBnZWFycy0+d2luLCBuYW1lLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgKGNoYXIgKiopTlVMTCwgMCwgJnNpemVoaW50cyk7CisgICB9CisKKyAgIGdlYXJzLT5nYyA9IFhDcmVhdGVHQyhkcHksIGdlYXJzLT53aW4sIDAsIE5VTEwpOworCisgICBnZWFycy0+cGl4bWFwID0gWENyZWF0ZVBpeG1hcChkcHksIGdlYXJzLT53aW4sCisJCQkJIHdpZHRoLCBoZWlnaHQsIHZpc2luZm8tPmRlcHRoKTsKKyAgIGlmICghZ2VhcnMtPnBpeG1hcCkgeworICAgICAgcHJpbnRmKCJFcnJvcjogWENyZWF0ZVBpeG1hcCBmYWlsZWRcbiIpOworICAgICAgZXhpdCgtMSk7CisgICB9CisKKyAgIGdlYXJzLT5nbHhwaXhtYXAgPSBnbFhDcmVhdGVQaXhtYXAoZHB5LCBmYmNvbmZpZ1swXSwgZ2VhcnMtPnBpeG1hcCwgTlVMTCk7CisgICBpZiAoIWdlYXJzLT5nbHhwaXhtYXApIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGdsWENyZWF0ZVBpeG1hcCBmYWlsZWRcbiIpOworICAgICAgZXhpdCgtMSk7CisgICB9CisKKyAgIGdlYXJzLT5jdHggPSBnbFhDcmVhdGVOZXdDb250ZXh0KGRweSwgZmJjb25maWdbMF0sCisJCQkJICAgIEdMWF9SR0JBX1RZUEUsIE5VTEwsIEdMX1RSVUUpOworICAgaWYgKCFnZWFycy0+Y3R4KSB7CisgICAgICBwcmludGYoIkVycm9yOiBnbFhDcmVhdGVOZXdDb250ZXh0IGZhaWxlZFxuIik7CisgICAgICBleGl0KDEpOworICAgfQorCisgICBYRnJlZShmYmNvbmZpZyk7Cit9CisKKworc3RhdGljIHZvaWQKK2V2ZW50X2xvb3AoRGlzcGxheSAqZHB5LCBzdHJ1Y3QgZ2VhcnMgKmdlYXJzKQoreworICAgaW50IHgsIHk7CisKKyAgIHdoaWxlICgxKSB7CisgICAgICB3aGlsZSAoWFBlbmRpbmcoZHB5KSA+IDApIHsKKyAgICAgICAgIFhFdmVudCBldmVudDsKKyAgICAgICAgIFhOZXh0RXZlbnQoZHB5LCAmZXZlbnQpOworICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CisJIGNhc2UgRXhwb3NlOgorICAgICAgICAgICAgLyogd2UnbGwgcmVkcmF3IGJlbG93ICovCisJICAgIGJyZWFrOworCSBjYXNlIENvbmZpZ3VyZU5vdGlmeToKKwkgICAgcmVzaGFwZShnZWFycywgZXZlbnQueGNvbmZpZ3VyZS53aWR0aCwgZXZlbnQueGNvbmZpZ3VyZS5oZWlnaHQpOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgS2V5UHJlc3M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMF07CisgICAgICAgICAgICAgICBpbnQgciwgY29kZTsKKyAgICAgICAgICAgICAgIGNvZGUgPSBYTG9va3VwS2V5c3ltKCZldmVudC54a2V5LCAwKTsKKyAgICAgICAgICAgICAgIGlmIChjb2RlID09IFhLX0xlZnQpIHsKKyAgICAgICAgICAgICAgICAgIHZpZXdfcm90eSArPSA1LjA7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09IFhLX1JpZ2h0KSB7CisgICAgICAgICAgICAgICAgICB2aWV3X3JvdHkgLT0gNS4wOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBYS19VcCkgeworICAgICAgICAgICAgICAgICAgdmlld19yb3R4ICs9IDUuMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gWEtfRG93bikgeworICAgICAgICAgICAgICAgICAgdmlld19yb3R4IC09IDUuMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgciA9IFhMb29rdXBTdHJpbmcoJmV2ZW50LnhrZXksIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbMF0gPT0gMjcpIHsKKyAgICAgICAgICAgICAgICAgICAgIC8qIGVzY2FwZSAqLworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBuZXh0IGZyYW1lICovCisgICAgICBhbmdsZSArPSAyLjA7CisKKyAgICAgIGRyYXcoKTsKKyAgICAgIGdsRmluaXNoKCk7CisKKyAgICAgIGZvciAoeCA9IDA7IHggPCBnZWFycy0+d2lkdGg7IHggKz0gMTAwKQorICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGdlYXJzLT53aWR0aDsgeSArPSAxMDApCisgICAgICAgICAgICBYQ29weUFyZWEoZHB5LCBnZWFycy0+cGl4bWFwLCBnZWFycy0+d2luLCBnZWFycy0+Z2MsCisJCSAgICAgIDUwLCA1MCwgMTAwLCAxMDAsIHgsIHkpOworCisgICAgICAvKiBjYWxjIGZyYW1lcmF0ZSAqLworICAgICAgeworICAgICAgICAgc3RhdGljIGludCB0MCA9IC0xOworICAgICAgICAgc3RhdGljIGludCBmcmFtZXMgPSAwOworICAgICAgICAgaW50IHQgPSBjdXJyZW50X3RpbWUoKTsKKworICAgICAgICAgaWYgKHQwIDwgMCkKKyAgICAgICAgICAgIHQwID0gdDsKKworICAgICAgICAgZnJhbWVzKys7CisKKyAgICAgICAgIGlmICh0IC0gdDAgPj0gNS4wKSB7CisgICAgICAgICAgICBHTGZsb2F0IHNlY29uZHMgPSB0IC0gdDA7CisgICAgICAgICAgICBHTGZsb2F0IGZwcyA9IGZyYW1lcyAvIHNlY29uZHM7CisgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBpbiAlMy4xZiBzZWNvbmRzID0gJTYuM2YgRlBTXG4iLCBmcmFtZXMsIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgZnBzKTsKKyAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgIGZyYW1lcyA9IDA7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICBEaXNwbGF5ICpkcHk7CisgICBjb25zdCBjaGFyICpkcHlOYW1lID0gTlVMTDsKKyAgIEdMYm9vbGVhbiBwcmludEluZm8gPSBHTF9GQUxTRTsKKyAgIHN0cnVjdCBnZWFycyBnZWFyczsKKyAgIGludCBpLCB3aWR0aCA9IDIwMCwgaGVpZ2h0ID0gMjAwOworCisgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZGlzcGxheSIpID09IDApIHsKKyAgICAgICAgIGRweU5hbWUgPSBhcmd2W2krMV07CisgICAgICAgICBpKys7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1pbmZvIikgPT0gMCkgeworICAgICAgICAgcHJpbnRJbmZvID0gR0xfVFJVRTsKKyAgICAgIH0KKyAgIH0KKworICAgZHB5ID0gWE9wZW5EaXNwbGF5KGRweU5hbWUpOworICAgaWYgKCFkcHkpIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGNvdWxkbid0IG9wZW4gZGlzcGxheSAlc1xuIiwgWERpc3BsYXlOYW1lKGRweU5hbWUpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgbWFrZV93aW5kb3coZHB5LCAiZ2x4Z2VhcnMiLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmZ2VhcnMpOworICAgWE1hcFdpbmRvdyhkcHksIGdlYXJzLndpbik7CisgICBnbFhNYWtlQ3VycmVudChkcHksIGdlYXJzLmdseHBpeG1hcCwgZ2VhcnMuY3R4KTsKKworICAgaWYgKHByaW50SW5mbykgeworICAgICAgcHJpbnRmKCJHTF9SRU5ERVJFUiAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSk7CisgICAgICBwcmludGYoIkdMX1ZFUlNJT04gICAgPSAlc1xuIiwgKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTikpOworICAgICAgcHJpbnRmKCJHTF9WRU5ET1IgICAgID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOworICAgICAgcHJpbnRmKCJHTF9FWFRFTlNJT05TID0gJXNcbiIsIChjaGFyICopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKyAgIH0KKworICAgaW5pdCh3aWR0aCwgaGVpZ2h0KTsKKworICAgZXZlbnRfbG9vcChkcHksICZnZWFycyk7CisKKyAgIGdsWERlc3Ryb3lDb250ZXh0KGRweSwgZ2VhcnMuY3R4KTsKKyAgIFhEZXN0cm95V2luZG93KGRweSwgZ2VhcnMud2luKTsKKyAgIGdsWERlc3Ryb3lQaXhtYXAoZHB5LCBnZWFycy5waXhtYXApOworICAgWEZyZWVQaXhtYXAoZHB5LCBnZWFycy5waXhtYXApOworICAgWENsb3NlRGlzcGxheShkcHkpOworCisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Byb2dzL3hkZW1vcy9nbHhpbmZvLmMgYi9wcm9ncy94ZGVtb3MvZ2x4aW5mby5jCmluZGV4IDNlOGUwYmUuLjZjZjEyN2EgMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy9nbHhpbmZvLmMKKysrIGIvcHJvZ3MveGRlbW9zL2dseGluZm8uYwpAQCAtNTIsNiArNTIsMTMgQEAKICNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JHQiAweDgwMDgKICNlbmRpZgogCisjaWZuZGVmIEdMWF9SR0JBX0JJVAorI2RlZmluZSBHTFhfUkdCQV9CSVQJCQkweDAwMDAwMDAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQ09MT1JfSU5ERVhfQklUCisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9CSVQJCTB4MDAwMDAwMDIKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0KIHsKQEAgLTgxLDcgKzg4LDcgQEAKICAgIGludCB0cmFuc3BhcmVudEluZGV4VmFsdWU7CiAgICBpbnQgYnVmZmVyU2l6ZTsKICAgIGludCBsZXZlbDsKLSAgIGludCByZ2JhOworICAgaW50IHJlbmRlcl90eXBlOwogICAgaW50IGRvdWJsZUJ1ZmZlcjsKICAgIGludCBzdGVyZW87CiAgICBpbnQgYXV4QnVmZmVyczsKQEAgLTM4OCwyMCArMzk1LDYxIEBACiAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwogICAgdW5zaWduZWQgbG9uZyBtYXNrOwogICAgV2luZG93IHJvb3Q7Ci0gICBHTFhDb250ZXh0IGN0eDsKKyAgIEdMWENvbnRleHQgY3R4ID0gTlVMTDsKICAgIFhWaXN1YWxJbmZvICp2aXNpbmZvOwogICAgaW50IHdpZHRoID0gMTAwLCBoZWlnaHQgPSAxMDA7CiAKICAgIHJvb3QgPSBSb290V2luZG93KGRweSwgc2NybnVtKTsKIAogICAgdmlzaW5mbyA9IGdsWENob29zZVZpc3VhbChkcHksIHNjcm51bSwgYXR0cmliU2luZ2xlKTsKLSAgIGlmICghdmlzaW5mbykgeworICAgaWYgKCF2aXNpbmZvKQogICAgICAgdmlzaW5mbyA9IGdsWENob29zZVZpc3VhbChkcHksIHNjcm51bSwgYXR0cmliRG91YmxlKTsKLSAgICAgIGlmICghdmlzaW5mbykgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogY291bGRuJ3QgZmluZCBSR0IgR0xYIHZpc3VhbFxuIik7Ci0gICAgICAgICByZXR1cm47CisKKyAgIGlmICh2aXNpbmZvKQorICAgICAgY3R4ID0gZ2xYQ3JlYXRlQ29udGV4dCggZHB5LCB2aXNpbmZvLCBOVUxMLCBhbGxvd0RpcmVjdCApOworCisjaWZkZWYgR0xYX1ZFUlNJT05fMV8zCisgICB7CisgICAgICBpbnQgZmJBdHRyaWJTaW5nbGVbXSA9IHsKKwkgR0xYX1JFTkRFUl9UWVBFLCAgIEdMWF9SR0JBX0JJVCwKKwkgR0xYX1JFRF9TSVpFLCAgICAgIDEsCisJIEdMWF9HUkVFTl9TSVpFLCAgICAxLAorCSBHTFhfQkxVRV9TSVpFLCAgICAgMSwKKwkgR0xYX0RPVUJMRUJVRkZFUiwgIEdMX1RSVUUsCisJIE5vbmUgfTsKKyAgICAgIGludCBmYkF0dHJpYkRvdWJsZVtdID0geworCSBHTFhfUkVOREVSX1RZUEUsICAgR0xYX1JHQkFfQklULAorCSBHTFhfUkVEX1NJWkUsICAgICAgMSwKKwkgR0xYX0dSRUVOX1NJWkUsICAgIDEsCisJIEdMWF9CTFVFX1NJWkUsICAgICAxLAorCSBOb25lIH07CisgICAgICBHTFhGQkNvbmZpZyAqY29uZmlncyA9IE5VTEw7CisgICAgICBpbnQgbkNvbmZpZ3M7CisKKyAgICAgIGlmICghdmlzaW5mbykKKwkgY29uZmlncyA9IGdsWENob29zZUZCQ29uZmlnKGRweSwgc2NybnVtLCBmYkF0dHJpYlNpbmdsZSwgJm5Db25maWdzKTsKKyAgICAgIGlmICghdmlzaW5mbykKKwkgY29uZmlncyA9IGdsWENob29zZUZCQ29uZmlnKGRweSwgc2NybnVtLCBmYkF0dHJpYkRvdWJsZSwgJm5Db25maWdzKTsKKworICAgICAgaWYgKGNvbmZpZ3MpIHsKKwkgdmlzaW5mbyA9IGdsWEdldFZpc3VhbEZyb21GQkNvbmZpZyhkcHksIGNvbmZpZ3NbMF0pOworCSBjdHggPSBnbFhDcmVhdGVOZXdDb250ZXh0KGRweSwgY29uZmlnc1swXSwgR0xYX1JHQkFfVFlQRSwgTlVMTCwgYWxsb3dEaXJlY3QpOworCSBYRnJlZShjb25maWdzKTsKICAgICAgIH0KICAgIH0KKyNlbmRpZgorCisgICBpZiAoIXZpc2luZm8pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGNvdWxkbid0IGZpbmQgUkdCIEdMWCB2aXN1YWwgb3IgZmJjb25maWdcbiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoIWN0eCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogZ2xYQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOworICAgICAgWEZyZWUodmlzaW5mbyk7CisgICAgICBYRGVzdHJveVdpbmRvdyhkcHksIHdpbik7CisgICAgICByZXR1cm47CisgICB9CiAKICAgIGF0dHIuYmFja2dyb3VuZF9waXhlbCA9IDA7CiAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDA7CkBAIC00MTIsMTQgKzQ2MCw2IEBACiAJCSAgICAgICAwLCB2aXNpbmZvLT5kZXB0aCwgSW5wdXRPdXRwdXQsCiAJCSAgICAgICB2aXNpbmZvLT52aXN1YWwsIG1hc2ssICZhdHRyKTsKIAotICAgY3R4ID0gZ2xYQ3JlYXRlQ29udGV4dCggZHB5LCB2aXNpbmZvLCBOVUxMLCBhbGxvd0RpcmVjdCApOwotICAgaWYgKCFjdHgpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGdsWENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKLSAgICAgIFhGcmVlKHZpc2luZm8pOwotICAgICAgWERlc3Ryb3lXaW5kb3coZHB5LCB3aW4pOwotICAgICAgcmV0dXJuOwotICAgfQotCiAgICBpZiAoZ2xYTWFrZUN1cnJlbnQoZHB5LCB3aW4sIGN0eCkpIHsKICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlclZlbmRvciA9IGdsWFF1ZXJ5U2VydmVyU3RyaW5nKGRweSwgc2NybnVtLCBHTFhfVkVORE9SKTsKICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlclZlcnNpb24gPSBnbFhRdWVyeVNlcnZlclN0cmluZyhkcHksIHNjcm51bSwgR0xYX1ZFUlNJT04pOwpAQCAtNDgzLDYgKzUyMywxMyBAQAogICAgICAgcHJpbnRmKCJPcGVuR0wgdmVuZG9yIHN0cmluZzogJXNcbiIsIGdsVmVuZG9yKTsKICAgICAgIHByaW50ZigiT3BlbkdMIHJlbmRlcmVyIHN0cmluZzogJXNcbiIsIGdsUmVuZGVyZXIpOwogICAgICAgcHJpbnRmKCJPcGVuR0wgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBnbFZlcnNpb24pOworI2lmZGVmIEdMX1ZFUlNJT05fMl8wCisgICAgICBpZiAoZ2xWZXJzaW9uWzBdID49ICcyJyAmJiBnbFZlcnNpb25bMV0gPT0gJy4nKSB7CisgICAgICAgICBjaGFyICp2ID0gKGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OKTsKKyAgICAgICAgIHByaW50ZigiT3BlbkdMIHNoYWRpbmcgbGFuZ3VhZ2UgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCB2KTsKKyAgICAgIH0KKyNlbmRpZgorCiAgICAgICBwcmludGYoIk9wZW5HTCBleHRlbnNpb25zOlxuIik7CiAgICAgICBwcmludF9leHRlbnNpb25fbGlzdChnbEV4dGVuc2lvbnMpOwogICAgICAgaWYgKGxpbWl0cykKQEAgLTU0MSwxMiArNTg4LDI3IEBACiAgICB9CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICoKK3Zpc3VhbF9yZW5kZXJfdHlwZV9uYW1lKGludCB0eXBlKQoreworICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEdMWF9SR0JBX0JJVDoKKyAgICAgICAgIHJldHVybiAicmdiYSI7CisgICAgICBjYXNlIEdMWF9DT0xPUl9JTkRFWF9CSVQ6CisgICAgICAgICByZXR1cm4gImNpIjsKKyAgICAgIGNhc2UgR0xYX1JHQkFfQklUIHwgR0xYX0NPTE9SX0lOREVYX0JJVDoKKyAgICAgICAgIHJldHVybiAicmdiYXxjaSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuICIiOworICAgICAgfQorfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIEdMYm9vbGVhbgogZ2V0X3Zpc3VhbF9hdHRyaWJzKERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZJbmZvLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aXN1YWxfYXR0cmlicyAqYXR0cmlicykKIHsKICAgIGNvbnN0IGNoYXIgKmV4dCA9IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhkcHksIHZJbmZvLT5zY3JlZW4pOworICAgaW50IHJnYmE7CiAKICAgIG1lbXNldChhdHRyaWJzLCAwLCBzaXplb2Yoc3RydWN0IHZpc3VhbF9hdHRyaWJzKSk7CiAKQEAgLTU2MywxMSArNjI1LDE3IEBACiAgICBhdHRyaWJzLT5jb2xvcm1hcFNpemUgPSB2SW5mby0+Y29sb3JtYXBfc2l6ZTsKICAgIGF0dHJpYnMtPmJpdHNQZXJSR0IgPSB2SW5mby0+Yml0c19wZXJfcmdiOwogCi0gICBpZiAoZ2xYR2V0Q29uZmlnKGRweSwgdkluZm8sIEdMWF9VU0VfR0wsICZhdHRyaWJzLT5zdXBwb3J0c0dMKSAhPSAwKQotICAgICAgcmV0dXJuOworICAgaWYgKGdsWEdldENvbmZpZyhkcHksIHZJbmZvLCBHTFhfVVNFX0dMLCAmYXR0cmlicy0+c3VwcG9ydHNHTCkgIT0gMCB8fAorICAgICAgICFhdHRyaWJzLT5zdXBwb3J0c0dMKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgZ2xYR2V0Q29uZmlnKGRweSwgdkluZm8sIEdMWF9CVUZGRVJfU0laRSwgJmF0dHJpYnMtPmJ1ZmZlclNpemUpOwogICAgZ2xYR2V0Q29uZmlnKGRweSwgdkluZm8sIEdMWF9MRVZFTCwgJmF0dHJpYnMtPmxldmVsKTsKLSAgIGdsWEdldENvbmZpZyhkcHksIHZJbmZvLCBHTFhfUkdCQSwgJmF0dHJpYnMtPnJnYmEpOworICAgZ2xYR2V0Q29uZmlnKGRweSwgdkluZm8sIEdMWF9SR0JBLCAmcmdiYSk7CisgICBpZiAocmdiYSkKKyAgICAgIGF0dHJpYnMtPnJlbmRlcl90eXBlID0gR0xYX1JHQkFfQklUOworICAgZWxzZQorICAgICAgYXR0cmlicy0+cmVuZGVyX3R5cGUgPSBHTFhfQ09MT1JfSU5ERVhfQklUOworICAgCiAgICBnbFhHZXRDb25maWcoZHB5LCB2SW5mbywgR0xYX0RPVUJMRUJVRkZFUiwgJmF0dHJpYnMtPmRvdWJsZUJ1ZmZlcik7CiAgICBnbFhHZXRDb25maWcoZHB5LCB2SW5mbywgR0xYX1NURVJFTywgJmF0dHJpYnMtPnN0ZXJlbyk7CiAgICBnbFhHZXRDb25maWcoZHB5LCB2SW5mbywgR0xYX0FVWF9CVUZGRVJTLCAmYXR0cmlicy0+YXV4QnVmZmVycyk7CkBAIC01OTYsNyArNjY0LDcgQEAKIAogICAgLyogbXVsdGlzYW1wbGUgYXR0cmlicyAqLwogI2lmZGVmIEdMWF9BUkJfbXVsdGlzYW1wbGUKLSAgIGlmIChleHQgJiYgc3Ryc3RyKGV4dCwgIkdMWF9BUkJfbXVsdGlzYW1wbGUiKSA9PSAwKSB7CisgICBpZiAoZXh0ICYmIHN0cnN0cihleHQsICJHTFhfQVJCX211bHRpc2FtcGxlIikpIHsKICAgICAgIGdsWEdldENvbmZpZyhkcHksIHZJbmZvLCBHTFhfU0FNUExFX0JVRkZFUlNfQVJCLCAmYXR0cmlicy0+bnVtTXVsdGlzYW1wbGUpOwogICAgICAgZ2xYR2V0Q29uZmlnKGRweSwgdkluZm8sIEdMWF9TQU1QTEVTX0FSQiwgJmF0dHJpYnMtPm51bVNhbXBsZXMpOwogICAgfQpAQCAtNjE2LDggKzY4NCw5NyBAQAogI2Vsc2UKICAgIGF0dHJpYnMtPnZpc3VhbENhdmVhdCA9IDA7CiAjZW5kaWYKKworICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKKyNpZmRlZiBHTFhfVkVSU0lPTl8xXzMKKworc3RhdGljIGludAorZ2x4X3Rva2VuX3RvX3Zpc3VhbF9jbGFzcyhpbnQgdmlzdWFsX3R5cGUpCit7CisgICBzd2l0Y2ggKHZpc3VhbF90eXBlKSB7CisgICBjYXNlIEdMWF9UUlVFX0NPTE9SOgorICAgICAgcmV0dXJuIFRydWVDb2xvcjsKKyAgIGNhc2UgR0xYX0RJUkVDVF9DT0xPUjoKKyAgICAgIHJldHVybiBEaXJlY3RDb2xvcjsKKyAgIGNhc2UgR0xYX1BTRVVET19DT0xPUjoKKyAgICAgIHJldHVybiBQc2V1ZG9Db2xvcjsKKyAgIGNhc2UgR0xYX1NUQVRJQ19DT0xPUjoKKyAgICAgIHJldHVybiBTdGF0aWNDb2xvcjsKKyAgIGNhc2UgR0xYX0dSQVlfU0NBTEU6CisgICAgICByZXR1cm4gR3JheVNjYWxlOworICAgY2FzZSBHTFhfU1RBVElDX0dSQVk6CisgICAgICByZXR1cm4gU3RhdGljR3JheTsKKyAgIGNhc2UgR0xYX05PTkU6CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5vbmU7CisgICB9Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2dldF9mYmNvbmZpZ19hdHRyaWJzKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgZmJjb25maWcsCisJCSAgICAgc3RydWN0IHZpc3VhbF9hdHRyaWJzICphdHRyaWJzKQoreworICAgaW50IHZpc3VhbF90eXBlOworCisgICBtZW1zZXQoYXR0cmlicywgMCwgc2l6ZW9mKHN0cnVjdCB2aXN1YWxfYXR0cmlicykpOworCisgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfRkJDT05GSUdfSUQsICZhdHRyaWJzLT5pZCk7CisKKyNpZiAwCisgICBhdHRyaWJzLT5kZXB0aCA9IHZJbmZvLT5kZXB0aDsKKyAgIGF0dHJpYnMtPnJlZE1hc2sgPSB2SW5mby0+cmVkX21hc2s7CisgICBhdHRyaWJzLT5ncmVlbk1hc2sgPSB2SW5mby0+Z3JlZW5fbWFzazsKKyAgIGF0dHJpYnMtPmJsdWVNYXNrID0gdkluZm8tPmJsdWVfbWFzazsKKyAgIGF0dHJpYnMtPmNvbG9ybWFwU2l6ZSA9IHZJbmZvLT5jb2xvcm1hcF9zaXplOworICAgYXR0cmlicy0+Yml0c1BlclJHQiA9IHZJbmZvLT5iaXRzX3Blcl9yZ2I7CisjZW5kaWYKKworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1hfVklTVUFMX1RZUEUsICZ2aXN1YWxfdHlwZSk7CisgICBhdHRyaWJzLT5rbGFzcyA9IGdseF90b2tlbl90b192aXN1YWxfY2xhc3ModmlzdWFsX3R5cGUpOworCisgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfQlVGRkVSX1NJWkUsICZhdHRyaWJzLT5idWZmZXJTaXplKTsKKyAgIGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZmJjb25maWcsIEdMWF9MRVZFTCwgJmF0dHJpYnMtPmxldmVsKTsKKyAgIGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZmJjb25maWcsIEdMWF9SRU5ERVJfVFlQRSwgJmF0dHJpYnMtPnJlbmRlcl90eXBlKTsKKyAgIGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZmJjb25maWcsIEdMWF9ET1VCTEVCVUZGRVIsICZhdHRyaWJzLT5kb3VibGVCdWZmZXIpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1NURVJFTywgJmF0dHJpYnMtPnN0ZXJlbyk7CisgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfQVVYX0JVRkZFUlMsICZhdHRyaWJzLT5hdXhCdWZmZXJzKTsKKworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1JFRF9TSVpFLCAmYXR0cmlicy0+cmVkU2l6ZSk7CisgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfR1JFRU5fU0laRSwgJmF0dHJpYnMtPmdyZWVuU2l6ZSk7CisgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfQkxVRV9TSVpFLCAmYXR0cmlicy0+Ymx1ZVNpemUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX0FMUEhBX1NJWkUsICZhdHRyaWJzLT5hbHBoYVNpemUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX0RFUFRIX1NJWkUsICZhdHRyaWJzLT5kZXB0aFNpemUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1NURU5DSUxfU0laRSwgJmF0dHJpYnMtPnN0ZW5jaWxTaXplKTsKKworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX0FDQ1VNX1JFRF9TSVpFLCAmYXR0cmlicy0+YWNjdW1SZWRTaXplKTsKKyAgIGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZmJjb25maWcsIEdMWF9BQ0NVTV9HUkVFTl9TSVpFLCAmYXR0cmlicy0+YWNjdW1HcmVlblNpemUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX0FDQ1VNX0JMVUVfU0laRSwgJmF0dHJpYnMtPmFjY3VtQmx1ZVNpemUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX0FDQ1VNX0FMUEhBX1NJWkUsICZhdHRyaWJzLT5hY2N1bUFscGhhU2l6ZSk7CisKKyAgIC8qIGdldCB0cmFuc3BhcmVudCBwaXhlbCBzdHVmZiAqLworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZyxHTFhfVFJBTlNQQVJFTlRfVFlQRSwgJmF0dHJpYnMtPnRyYW5zcGFyZW50VHlwZSk7CisgICBpZiAoYXR0cmlicy0+dHJhbnNwYXJlbnRUeXBlID09IEdMWF9UUkFOU1BBUkVOVF9SR0IpIHsKKyAgICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwgJmF0dHJpYnMtPnRyYW5zcGFyZW50UmVkVmFsdWUpOworICAgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICZhdHRyaWJzLT50cmFuc3BhcmVudEdyZWVuVmFsdWUpOworICAgICBnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZiY29uZmlnLCBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwgJmF0dHJpYnMtPnRyYW5zcGFyZW50Qmx1ZVZhbHVlKTsKKyAgICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFLCAmYXR0cmlicy0+dHJhbnNwYXJlbnRBbHBoYVZhbHVlKTsKKyAgIH0KKyAgIGVsc2UgaWYgKGF0dHJpYnMtPnRyYW5zcGFyZW50VHlwZSA9PSBHTFhfVFJBTlNQQVJFTlRfSU5ERVgpIHsKKyAgICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFLCAmYXR0cmlicy0+dHJhbnNwYXJlbnRJbmRleFZhbHVlKTsKKyAgIH0KKworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1NBTVBMRV9CVUZGRVJTLCAmYXR0cmlicy0+bnVtTXVsdGlzYW1wbGUpOworICAgZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmYmNvbmZpZywgR0xYX1NBTVBMRVMsICZhdHRyaWJzLT5udW1TYW1wbGVzKTsKKyAgIGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZmJjb25maWcsIEdMWF9DT05GSUdfQ0FWRUFULCAmYXR0cmlicy0+dmlzdWFsQ2F2ZWF0KTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKyNlbmRpZgorCisKIAogc3RhdGljIHZvaWQKIHByaW50X3Zpc3VhbF9hdHRyaWJzX3ZlcmJvc2UoY29uc3Qgc3RydWN0IHZpc3VhbF9hdHRyaWJzICphdHRyaWJzKQpAQCAtNjI1LDcgKzc4Miw4IEBACiAgICBwcmludGYoIlZpc3VhbCBJRDogJXggIGRlcHRoPSVkICBjbGFzcz0lc1xuIiwKICAgICAgICAgICBhdHRyaWJzLT5pZCwgYXR0cmlicy0+ZGVwdGgsIHZpc3VhbF9jbGFzc19uYW1lKGF0dHJpYnMtPmtsYXNzKSk7CiAgICBwcmludGYoIiAgICBidWZmZXJTaXplPSVkIGxldmVsPSVkIHJlbmRlclR5cGU9JXMgZG91YmxlQnVmZmVyPSVkIHN0ZXJlbz0lZFxuIiwKLSAgICAgICAgICBhdHRyaWJzLT5idWZmZXJTaXplLCBhdHRyaWJzLT5sZXZlbCwgYXR0cmlicy0+cmdiYSA/ICJyZ2JhIiA6ICJjaSIsCisgICAgICAgICAgYXR0cmlicy0+YnVmZmVyU2l6ZSwgYXR0cmlicy0+bGV2ZWwsCisJICB2aXN1YWxfcmVuZGVyX3R5cGVfbmFtZShhdHRyaWJzLT5yZW5kZXJfdHlwZSksCiAgICAgICAgICAgYXR0cmlicy0+ZG91YmxlQnVmZmVyLCBhdHRyaWJzLT5zdGVyZW8pOwogICAgcHJpbnRmKCIgICAgcmdiYTogcmVkU2l6ZT0lZCBncmVlblNpemU9JWQgYmx1ZVNpemU9JWQgYWxwaGFTaXplPSVkXG4iLAogICAgICAgICAgIGF0dHJpYnMtPnJlZFNpemUsIGF0dHJpYnMtPmdyZWVuU2l6ZSwKQEAgLTY4MywxNiArODQxLDE3IEBACiAgICBjYXZlYXQgPSAiTm9uZSI7CiAjZW5kaWYgCiAKLSAgIHByaW50ZigiMHglMnggJTJkICUycyAlMmQgJTJkICUyZCAlMXMgJTJzICUycyAlMmQgJTJkICUyZCAlMmQgJTJkICUyZCAlMmQiLAorICAgcHJpbnRmKCIweCUwMnggJTJkICUycyAlMmQgJTJkICUyZCAlYyVjICVjICAlYyAlMmQgJTJkICUyZCAlMmQgJTJkICUyZCAlMmQiLAogICAgICAgICAgIGF0dHJpYnMtPmlkLAogICAgICAgICAgIGF0dHJpYnMtPmRlcHRoLAogICAgICAgICAgIHZpc3VhbF9jbGFzc19hYmJyZXYoYXR0cmlicy0+a2xhc3MpLAogICAgICAgICAgIGF0dHJpYnMtPnRyYW5zcGFyZW50VHlwZSAhPSBHTFhfTk9ORSwKICAgICAgICAgICBhdHRyaWJzLT5idWZmZXJTaXplLAogICAgICAgICAgIGF0dHJpYnMtPmxldmVsLAotICAgICAgICAgIGF0dHJpYnMtPnJnYmEgPyAiciIgOiAiYyIsCi0gICAgICAgICAgYXR0cmlicy0+ZG91YmxlQnVmZmVyID8gInkiIDogIi4iLAotICAgICAgICAgIGF0dHJpYnMtPnN0ZXJlbyA/ICJ5IiA6ICIuIiwKKyAgICAgICAgICAoYXR0cmlicy0+cmVuZGVyX3R5cGUgJiBHTFhfUkdCQV9CSVQpID8gJ3InIDogJyAnLAorICAgICAgICAgIChhdHRyaWJzLT5yZW5kZXJfdHlwZSAmIEdMWF9DT0xPUl9JTkRFWF9CSVQpID8gJ2MnIDogJyAnLAorICAgICAgICAgIGF0dHJpYnMtPmRvdWJsZUJ1ZmZlciA/ICd5JyA6ICcuJywKKyAgICAgICAgICBhdHRyaWJzLT5zdGVyZW8gPyAneScgOiAnLicsCiAgICAgICAgICAgYXR0cmlicy0+cmVkU2l6ZSwgYXR0cmlicy0+Z3JlZW5TaXplLAogICAgICAgICAgIGF0dHJpYnMtPmJsdWVTaXplLCBhdHRyaWJzLT5hbHBoYVNpemUsCiAgICAgICAgICAgYXR0cmlicy0+YXV4QnVmZmVycywKQEAgLTcyOCw3ICs4ODcsNyBAQAogICAgICAgICAgIGF0dHJpYnMtPnRyYW5zcGFyZW50VHlwZSAhPSBHTFhfTk9ORSwKICAgICAgICAgICBhdHRyaWJzLT5idWZmZXJTaXplLAogICAgICAgICAgIGF0dHJpYnMtPmxldmVsLAotICAgICAgICAgIGF0dHJpYnMtPnJnYmEgPyAicmdiYSIgOiAiY2kgICIsCisgICAgICAgICAgdmlzdWFsX3JlbmRlcl90eXBlX25hbWUoYXR0cmlicy0+cmVuZGVyX3R5cGUpLAogICAgICAgICAgIGF0dHJpYnMtPmRvdWJsZUJ1ZmZlciwKICAgICAgICAgICBhdHRyaWJzLT5zdGVyZW8sCiAgICAgICAgICAgYXR0cmlicy0+cmVkU2l6ZSwgYXR0cmlicy0+Z3JlZW5TaXplLApAQCAtNzUxLDQyICs5MTAsODYgQEAKIHsKICAgIFhWaXN1YWxJbmZvIHRoZVRlbXBsYXRlOwogICAgWFZpc3VhbEluZm8gKnZpc3VhbHM7Ci0gICBpbnQgbnVtVmlzdWFsczsKKyAgIGludCBudW1WaXN1YWxzLCBudW1HbHhWaXN1YWxzOwogICAgbG9uZyBtYXNrOwogICAgaW50IGk7CisgICBzdHJ1Y3QgdmlzdWFsX2F0dHJpYnMgYXR0cmliczsKIAogICAgLyogZ2V0IGxpc3Qgb2YgYWxsIHZpc3VhbHMgb24gdGhpcyBzY3JlZW4gKi8KICAgIHRoZVRlbXBsYXRlLnNjcmVlbiA9IHNjcm51bTsKICAgIG1hc2sgPSBWaXN1YWxTY3JlZW5NYXNrOwogICAgdmlzdWFscyA9IFhHZXRWaXN1YWxJbmZvKGRweSwgbWFzaywgJnRoZVRlbXBsYXRlLCAmbnVtVmlzdWFscyk7CiAKLSAgIGlmIChtb2RlID09IFZlcmJvc2UpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1WaXN1YWxzOyBpKyspIHsKLSAgICAgICAgIHN0cnVjdCB2aXN1YWxfYXR0cmlicyBhdHRyaWJzOwotICAgICAgICAgZ2V0X3Zpc3VhbF9hdHRyaWJzKGRweSwgJnZpc3VhbHNbaV0sICZhdHRyaWJzKTsKLSAgICAgICAgIHByaW50X3Zpc3VhbF9hdHRyaWJzX3ZlcmJvc2UoJmF0dHJpYnMpOwotICAgICAgfQorICAgbnVtR2x4VmlzdWFscyA9IDA7CisgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlzdWFsczsgaSsrKSB7CisgICAgICBpZiAoZ2V0X3Zpc3VhbF9hdHRyaWJzKGRweSwgJnZpc3VhbHNbaV0sICZhdHRyaWJzKSkKKwkgbnVtR2x4VmlzdWFscysrOwogICAgfQotICAgZWxzZSBpZiAobW9kZSA9PSBOb3JtYWwpIHsKKworICAgaWYgKG51bUdseFZpc3VhbHMgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcHJpbnRmKCIlZCBHTFggVmlzdWFsc1xuIiwgbnVtR2x4VmlzdWFscyk7CisKKyAgIGlmIChtb2RlID09IE5vcm1hbCkKICAgICAgIHByaW50X3Zpc3VhbF9hdHRyaWJzX3Nob3J0X2hlYWRlcigpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZpc3VhbHM7IGkrKykgewotICAgICAgICAgc3RydWN0IHZpc3VhbF9hdHRyaWJzIGF0dHJpYnM7Ci0gICAgICAgICBnZXRfdmlzdWFsX2F0dHJpYnMoZHB5LCAmdmlzdWFsc1tpXSwgJmF0dHJpYnMpOwotICAgICAgICAgcHJpbnRfdmlzdWFsX2F0dHJpYnNfc2hvcnQoJmF0dHJpYnMpOwotICAgICAgfQotICAgfQotICAgZWxzZSBpZiAobW9kZSA9PSBXaWRlKSB7CisgICBlbHNlIGlmIChtb2RlID09IFdpZGUpCiAgICAgICBwcmludF92aXN1YWxfYXR0cmlic19sb25nX2hlYWRlcigpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZpc3VhbHM7IGkrKykgewotICAgICAgICAgc3RydWN0IHZpc3VhbF9hdHRyaWJzIGF0dHJpYnM7Ci0gICAgICAgICBnZXRfdmlzdWFsX2F0dHJpYnMoZHB5LCAmdmlzdWFsc1tpXSwgJmF0dHJpYnMpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlzdWFsczsgaSsrKSB7CisgICAgICBpZiAoIWdldF92aXN1YWxfYXR0cmlicyhkcHksICZ2aXN1YWxzW2ldLCAmYXR0cmlicykpCisJIGNvbnRpbnVlOworCisgICAgICBpZiAobW9kZSA9PSBWZXJib3NlKQorCSBwcmludF92aXN1YWxfYXR0cmlic192ZXJib3NlKCZhdHRyaWJzKTsKKyAgICAgIGVsc2UgaWYgKG1vZGUgPT0gTm9ybWFsKQorICAgICAgICAgcHJpbnRfdmlzdWFsX2F0dHJpYnNfc2hvcnQoJmF0dHJpYnMpOworICAgICAgZWxzZSBpZiAobW9kZSA9PSBXaWRlKSAKICAgICAgICAgIHByaW50X3Zpc3VhbF9hdHRyaWJzX2xvbmcoJmF0dHJpYnMpOwotICAgICAgfQogICAgfQorICAgcHJpbnRmKCJcbiIpOwogCiAgICBYRnJlZSh2aXN1YWxzKTsKIH0KIAorI2lmZGVmIEdMWF9WRVJTSU9OXzFfMworCitzdGF0aWMgdm9pZAorcHJpbnRfZmJjb25maWdfaW5mbyhEaXNwbGF5ICpkcHksIGludCBzY3JudW0sIEluZm9Nb2RlIG1vZGUpCit7CisgICBpbnQgbnVtRkJDb25maWdzOworICAgc3RydWN0IHZpc3VhbF9hdHRyaWJzIGF0dHJpYnM7CisgICBHTFhGQkNvbmZpZyAqZmJjb25maWdzOworICAgaW50IGk7CisKKyAgIC8qIGdldCBsaXN0IG9mIGFsbCBmYmNvbmZpZ3Mgb24gdGhpcyBzY3JlZW4gKi8KKyAgIGZiY29uZmlncyA9IGdsWEdldEZCQ29uZmlncyhkcHksIHNjcm51bSwgJm51bUZCQ29uZmlncyk7CisKKyAgIGlmIChudW1GQkNvbmZpZ3MgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgcHJpbnRmKCIlZCBHTFhGQkNvbmZpZ3M6XG4iLCBudW1GQkNvbmZpZ3MpOworICAgaWYgKG1vZGUgPT0gTm9ybWFsKQorICAgICAgcHJpbnRfdmlzdWFsX2F0dHJpYnNfc2hvcnRfaGVhZGVyKCk7CisgICBlbHNlIGlmIChtb2RlID09IFdpZGUpCisgICAgICBwcmludF92aXN1YWxfYXR0cmlic19sb25nX2hlYWRlcigpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtRkJDb25maWdzOyBpKyspIHsKKyAgICAgIGdldF9mYmNvbmZpZ19hdHRyaWJzKGRweSwgZmJjb25maWdzW2ldLCAmYXR0cmlicyk7CisKKyAgICAgIGlmIChtb2RlID09IFZlcmJvc2UpIAorICAgICAgICAgcHJpbnRfdmlzdWFsX2F0dHJpYnNfdmVyYm9zZSgmYXR0cmlicyk7CisgICAgICBlbHNlIGlmIChtb2RlID09IE5vcm1hbCkKKwkgcHJpbnRfdmlzdWFsX2F0dHJpYnNfc2hvcnQoJmF0dHJpYnMpOworICAgICAgZWxzZSBpZiAobW9kZSA9PSBXaWRlKQorICAgICAgICAgcHJpbnRfdmlzdWFsX2F0dHJpYnNfbG9uZygmYXR0cmlicyk7CisgICB9CisgICBwcmludGYoIlxuIik7CisKKyAgIFhGcmVlKGZiY29uZmlncyk7Cit9CisKKyNlbmRpZgogCiAvKgogICogU3RhbmQtYWxvbmUgTWVzYSBkb2Vzbid0IHJlYWxseSBpbXBsZW1lbnQgdGhlIEdMWCBwcm90b2NvbCBzbyBpdApAQCAtODYwLDcgKzEwNjMsNyBAQAogICAgICAgLyogc2VlIGlmIHRoaXMgdmlzIGlzIGJldHRlciB0aGFuIGJlc3RWaXMgKi8KICAgICAgIGlmICgoIWJlc3RWaXMuc3VwcG9ydHNHTCAmJiB2aXMuc3VwcG9ydHNHTCkgfHwKICAgICAgICAgICAoYmVzdFZpcy52aXN1YWxDYXZlYXQgIT0gR0xYX05PTkVfRVhUKSB8fAotICAgICAgICAgICghYmVzdFZpcy5yZ2JhICYmIHZpcy5yZ2JhKSB8fAorICAgICAgICAgICghKGJlc3RWaXMucmVuZGVyX3R5cGUgJiBHTFhfUkdCQV9CSVQpICYmICh2aXMucmVuZGVyX3R5cGUgJiBHTFhfUkdCQV9CSVQpKSB8fAogICAgICAgICAgICghYmVzdFZpcy5kb3VibGVCdWZmZXIgJiYgdmlzLmRvdWJsZUJ1ZmZlcikgfHwKICAgICAgICAgICAoYmVzdFZpcy5yZWRTaXplIDwgdmlzLnJlZFNpemUpIHx8CiAgICAgICAgICAgKGJlc3RWaXMuZ3JlZW5TaXplIDwgdmlzLmdyZWVuU2l6ZSkgfHwKQEAgLTk1Nyw2ICsxMTYwLDkgQEAKICAgICAgICAgIHByaW50X3NjcmVlbl9pbmZvKGRweSwgc2NybnVtLCBhbGxvd0RpcmVjdCwgbGltaXRzKTsKICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgIHByaW50X3Zpc3VhbF9pbmZvKGRweSwgc2NybnVtLCBtb2RlKTsKKyNpZmRlZiBHTFhfVkVSU0lPTl8xXzMKKyAgICAgICAgIHByaW50X2ZiY29uZmlnX2luZm8oZHB5LCBzY3JudW0sIG1vZGUpOworI2VuZGlmCiAgICAgICAgICBpZiAoc2NybnVtICsgMSA8IG51bVNjcmVlbnMpCiAgICAgICAgICAgICBwcmludGYoIlxuXG4iKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3Byb2dzL3hkZW1vcy9nbHhzbm9vcC5jIGIvcHJvZ3MveGRlbW9zL2dseHNub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5NTEzNAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dzL3hkZW1vcy9nbHhzbm9vcC5jCkBAIC0wLDAgKzEsMzc3IEBACisvKioKKyAqIERpc3BsYXkvc25vb3AgdGhlIHovc3RlbmNpbC9iYWNrL2Zyb250IGJ1ZmZlcnMgb2YgYW5vdGhlciBhcHAncyB3aW5kb3cuCisgKiBBbHNvLCBhbiBleGFtcGxlIG9mIHRoZSBuZWVkIGZvciBzaGFyZWQgYW5jaWxsYXJ5IHJlbmRlcmJ1ZmZlcnMuCisgKgorICogSGludDogdXNlICd4d2luaW5mbycgdG8gZ2V0IGEgd2luZG93J3MgSUQuCisgKgorICogQnJpYW4gUGF1bAorICogMTEgT2N0IDIwMDcKKyAqLworCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8R0wvZ2x4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisKKworI2RlZmluZSBaX0JVRkZFUiAxCisjZGVmaW5lIFNURU5DSUxfQlVGRkVSIDIKKyNkZWZpbmUgQkFDS19CVUZGRVIgMworI2RlZmluZSBGUk9OVF9CVUZGRVIgNAorCisKK3N0YXRpYyBpbnQgQnVmZmVyID0gQkFDS19CVUZGRVI7CitzdGF0aWMgaW50IFdpbmRvd0lEID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpEaXNwbGF5TmFtZSA9IE5VTEw7CitzdGF0aWMgR0xYQ29udGV4dCBDb250ZXh0ID0gMDsKK3N0YXRpYyBpbnQgV2lkdGgsIEhlaWdodDsKKworCisvKioKKyAqIEdyYWIgdGhlIHovc3RlbmNpbC9iYWNrL2Zyb250IGltYWdlIGZyb20gdGhlIHNyY1dpbiBhbmQgZGlzcGxheSBpdAorICogKHBvc3NpYmx5IGNvbnZlcnRlZCB0byBncmF5c2NhbGUpIGluIHRoZSBkc3RXaW4uCisgKi8KK3N0YXRpYyB2b2lkCityZWRyYXcoRGlzcGxheSAqZHB5LCBXaW5kb3cgc3JjV2luLCBXaW5kb3cgZHN0V2luICkKK3sKKyAgIEdMdWJ5dGUgKmltYWdlID0gbWFsbG9jKFdpZHRoICogSGVpZ2h0ICogNCk7CisKKyAgIGdsWE1ha2VDdXJyZW50KGRweSwgc3JjV2luLCBDb250ZXh0KTsKKyAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDEpOworICAgaWYgKEJ1ZmZlciA9PSBCQUNLX0JVRkZFUikgeworICAgICAgZ2xSZWFkQnVmZmVyKEdMX0JBQ0spOworICAgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIFdpZHRoLCBIZWlnaHQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGltYWdlKTsKKyAgIH0KKyAgIGVsc2UgaWYgKEJ1ZmZlciA9PSBGUk9OVF9CVUZGRVIpIHsKKyAgICAgIGdsUmVhZEJ1ZmZlcihHTF9GUk9OVCk7CisgICAgICBnbFJlYWRQaXhlbHMoMCwgMCwgV2lkdGgsIEhlaWdodCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgaW1hZ2UpOworICAgfQorICAgZWxzZSBpZiAoQnVmZmVyID09IFpfQlVGRkVSKSB7CisgICAgICBHTGZsb2F0ICp6ID0gbWFsbG9jKFdpZHRoICogSGVpZ2h0ICogc2l6ZW9mKEdMZmxvYXQpKTsKKyAgICAgIGludCBpOworICAgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIFdpZHRoLCBIZWlnaHQsIEdMX0RFUFRIX0NPTVBPTkVOVCwgR0xfRkxPQVQsIHopOworICAgICAgZm9yIChpID0gMDsgaSA8IFdpZHRoICogSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgIGltYWdlW2kqNCswXSA9CisgICAgICAgICBpbWFnZVtpKjQrMV0gPQorICAgICAgICAgaW1hZ2VbaSo0KzJdID0gKEdMaW50KSAoMjU1LjAgKiB6W2ldKTsKKyAgICAgICAgIGltYWdlW2kqNCszXSA9IDI1NTsKKyAgICAgIH0KKyAgICAgIGZyZWUoeik7CisgICB9CisgICBlbHNlIGlmIChCdWZmZXIgPT0gU1RFTkNJTF9CVUZGRVIpIHsKKyAgICAgIEdMdWJ5dGUgKnN0ZW4gPSBtYWxsb2MoV2lkdGggKiBIZWlnaHQgKiBzaXplb2YoR0x1Ynl0ZSkpOworICAgICAgaW50IGksIG1pbiA9IDEwMCwgbWF4ID0gLTE7CisgICAgICBmbG9hdCBzdGVwOworICAgICAgaW50IHN6OworICAgICAgZ2xHZXRJbnRlZ2VydihHTF9TVEVOQ0lMX0JJVFMsICZzeik7CisgICAgICBnbFJlYWRQaXhlbHMoMCwgMCwgV2lkdGgsIEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBHTF9TVEVOQ0lMX0lOREVYLCBHTF9VTlNJR05FRF9CWVRFLCBzdGVuKTsKKyAgICAgIC8qIGZpbmQgbWluL21heCBmb3IgY29udmVydGluZyBzdGVuY2lsIHRvIGdyYXlzY2FsZSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IFdpZHRoICogSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgIGlmIChzdGVuW2ldIDwgbWluKQorICAgICAgICAgICAgbWluID0gc3RlbltpXTsKKyAgICAgICAgIGlmIChzdGVuW2ldID4gbWF4KQorICAgICAgICAgICAgbWF4ID0gc3RlbltpXTsKKyAgICAgIH0KKyAgICAgIGlmIChtaW4gPT0gbWF4KQorICAgICAgICAgc3RlcCA9IDA7CisgICAgICBlbHNlCisgICAgICAgICBzdGVwID0gMjU1LjAgLyAoZmxvYXQpIChtYXggLSBtaW4pOworICAgICAgZm9yIChpID0gMDsgaSA8IFdpZHRoICogSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgIGltYWdlW2kqNCswXSA9CisgICAgICAgICBpbWFnZVtpKjQrMV0gPQorICAgICAgICAgaW1hZ2VbaSo0KzJdID0gKEdMaW50KSAoKHN0ZW5baV0gLSBtaW4pICogc3RlcCk7CisgICAgICAgICBpbWFnZVtpKjQrM10gPSAyNTU7CisgICAgICB9CisgICAgICBmcmVlKHN0ZW4pOworICAgfQorCisgICBnbFhNYWtlQ3VycmVudChkcHksIGRzdFdpbiwgQ29udGV4dCk7CisgICBnbFdpbmRvd1BvczJpQVJCKDAsIDApOworICAgZ2xEcmF3QnVmZmVyKEdMX0ZST05UKTsKKyAgIGdsRHJhd1BpeGVscyhXaWR0aCwgSGVpZ2h0LCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBpbWFnZSk7CisgICBnbEZsdXNoKCk7CisKKyAgIGZyZWUoaW1hZ2UpOworfQorCisKK3N0YXRpYyB2b2lkCitzZXRfd2luZG93X3RpdGxlKERpc3BsYXkgKmRweSwgV2luZG93IHdpbiwgY29uc3QgY2hhciAqdGl0bGUpCit7CisgICBYU2l6ZUhpbnRzIHNpemVoaW50czsKKyAgIHNpemVoaW50cy5mbGFncyA9IDA7CisgICBYU2V0U3RhbmRhcmRQcm9wZXJ0aWVzKGRweSwgd2luLCB0aXRsZSwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIChjaGFyICoqKU5VTEwsIDAsICZzaXplaGludHMpOworfQorCisKK3N0YXRpYyBXaW5kb3cKK21ha2VfZ2xfd2luZG93KERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpc2luZm8sIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgIGludCBzY3JudW07CisgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOworICAgdW5zaWduZWQgbG9uZyBtYXNrOworICAgV2luZG93IHJvb3Q7CisgICBXaW5kb3cgd2luOworICAgaW50IHggPSAwLCB5ID0gMDsKKyAgIGNoYXIgKm5hbWUgPSBOVUxMOworCisgICBzY3JudW0gPSBEZWZhdWx0U2NyZWVuKCBkcHkgKTsKKyAgIHJvb3QgPSBSb290V2luZG93KCBkcHksIHNjcm51bSApOworCisgICAvKiB3aW5kb3cgYXR0cmlidXRlcyAqLworICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKKyAgIGF0dHIuYm9yZGVyX3BpeGVsID0gMDsKKyAgIGF0dHIuY29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoIGRweSwgcm9vdCwgdmlzaW5mby0+dmlzdWFsLCBBbGxvY05vbmUpOworICAgYXR0ci5ldmVudF9tYXNrID0gU3RydWN0dXJlTm90aWZ5TWFzayB8IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzazsKKyAgIG1hc2sgPSBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwgfCBDV0NvbG9ybWFwIHwgQ1dFdmVudE1hc2s7CisKKyAgIHdpbiA9IFhDcmVhdGVXaW5kb3coIGRweSwgcm9vdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwKKwkJICAgICAgICAwLCB2aXNpbmZvLT5kZXB0aCwgSW5wdXRPdXRwdXQsCisJCSAgICAgICAgdmlzaW5mby0+dmlzdWFsLCBtYXNrLCAmYXR0ciApOworCisgICAvKiBzZXQgaGludHMgYW5kIHByb3BlcnRpZXMgKi8KKyAgIHsKKyAgICAgIFhTaXplSGludHMgc2l6ZWhpbnRzOworICAgICAgc2l6ZWhpbnRzLnggPSB4OworICAgICAgc2l6ZWhpbnRzLnkgPSB5OworICAgICAgc2l6ZWhpbnRzLndpZHRoICA9IHdpZHRoOworICAgICAgc2l6ZWhpbnRzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIHNpemVoaW50cy5mbGFncyA9IFVTU2l6ZSB8IFVTUG9zaXRpb247CisgICAgICBYU2V0Tm9ybWFsSGludHMoZHB5LCB3aW4sICZzaXplaGludHMpOworICAgICAgWFNldFN0YW5kYXJkUHJvcGVydGllcyhkcHksIHdpbiwgbmFtZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIChjaGFyICoqKU5VTEwsIDAsICZzaXplaGludHMpOworICAgfQorCisgICByZXR1cm4gd2luOworfQorCisKK3N0YXRpYyB2b2lkCit1cGRhdGVfd2luZG93X3RpdGxlKERpc3BsYXkgKmRweSwgV2luZG93IHdpbikKK3sKKyAgIGNoYXIgdGl0bGVbMTAwMF0sICpidWY7CisKKyAgIHN3aXRjaCAoQnVmZmVyKSB7CisgICBjYXNlIFpfQlVGRkVSOgorICAgICAgYnVmID0gIloiOworICAgICAgYnJlYWs7CisgICBjYXNlIFNURU5DSUxfQlVGRkVSOgorICAgICAgYnVmID0gIlN0ZW5jaWwiOworICAgICAgYnJlYWs7CisgICBjYXNlIEJBQ0tfQlVGRkVSOgorICAgICAgYnVmID0gIkJhY2siOworICAgICAgYnJlYWs7CisgICBjYXNlIEZST05UX0JVRkZFUjoKKyAgICAgIGJ1ZiA9ICJGcm9udCI7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBidWYgPSAiIjsKKyAgIH0KKworICAgc3ByaW50Zih0aXRsZSwgImdseHNub29wIHdpbmRvdyAweCV4ICglcyBidWZmZXIpIiwgKGludCkgV2luZG93SUQsIGJ1Zik7CisKKyAgIHNldF93aW5kb3dfdGl0bGUoZHB5LCB3aW4sIHRpdGxlKTsKK30KKworCitzdGF0aWMgdm9pZAora2V5cHJlc3MoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luLCBjaGFyIGtleSkKK3sKKyAgIHN3aXRjaCAoa2V5KSB7CisgICBjYXNlIDI3OgorICAgICAgLyogZXNjYXBlICovCisgICAgICBleGl0KDApOworICAgICAgYnJlYWs7CisgICBjYXNlICdzJzoKKyAgICAgIEJ1ZmZlciA9IFNURU5DSUxfQlVGRkVSOworICAgICAgYnJlYWs7CisgICBjYXNlICd6JzoKKyAgICAgIEJ1ZmZlciA9IFpfQlVGRkVSOworICAgICAgYnJlYWs7CisgICBjYXNlICdmJzoKKyAgICAgIEJ1ZmZlciA9IEZST05UX0JVRkZFUjsKKyAgICAgIGJyZWFrOworICAgY2FzZSAnYic6CisgICAgICBCdWZmZXIgPSBCQUNLX0JVRkZFUjsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgdXBkYXRlX3dpbmRvd190aXRsZShkcHksIHdpbik7CisgICByZWRyYXcoZHB5LCBXaW5kb3dJRCwgd2luKTsKK30KKworCitzdGF0aWMgdm9pZAorZXZlbnRfbG9vcChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4pCit7CisgICBYRXZlbnQgZXZlbnQ7CisKKyAgIHdoaWxlICgxKSB7CisgICAgICBYTmV4dEV2ZW50KCBkcHksICZldmVudCApOworCisgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgIGNhc2UgRXhwb3NlOgorICAgICAgICAgcmVkcmF3KGRweSwgV2luZG93SUQsIHdpbik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ29uZmlndXJlTm90aWZ5OgorICAgICAgICAgLypyZXNpemUoIGV2ZW50Lnhjb25maWd1cmUud2lkdGgsIGV2ZW50Lnhjb25maWd1cmUuaGVpZ2h0ICk7Ki8KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBLZXlQcmVzczoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwXTsKKyAgICAgICAgICAgIGludCByLCBjb2RlOworICAgICAgICAgICAgY29kZSA9IFhMb29rdXBLZXlzeW0oJmV2ZW50LnhrZXksIDApOworICAgICAgICAgICAgaWYgKGNvZGUgPT0gWEtfTGVmdCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICByID0gWExvb2t1cFN0cmluZygmZXZlbnQueGtleSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAga2V5cHJlc3MoZHB5LCB3aW4sIGJ1ZmZlclswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgLyogbm90aGluZyAqLworICAgICAgICAgOworICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyBWaXN1YWxJRAorZ2V0X3dpbmRvd192aXN1YWxpZChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4pCit7CisgICBYV2luZG93QXR0cmlidXRlcyBhdHRyOworCisgICBpZiAoWEdldFdpbmRvd0F0dHJpYnV0ZXMoZHB5LCB3aW4sICZhdHRyKSkgeworICAgICAgcmV0dXJuIGF0dHIudmlzdWFsLT52aXN1YWxpZDsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dldF93aW5kb3dfc2l6ZShEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4sIGludCAqdywgaW50ICpoKQoreworICAgWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKKworICAgaWYgKFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGRweSwgd2luLCAmYXR0cikpIHsKKyAgICAgICp3ID0gYXR0ci53aWR0aDsKKyAgICAgICpoID0gYXR0ci5oZWlnaHQ7CisgICB9CisgICBlbHNlIHsKKyAgICAgICp3ID0gKmggPSAwOworICAgfQorfQorCisKK3N0YXRpYyBYVmlzdWFsSW5mbyAqCit2aXN1YWxpZF90b192aXN1YWxpbmZvKERpc3BsYXkgKmRweSwgVmlzdWFsSUQgdmlkKQoreworICAgWFZpc3VhbEluZm8gKnZpbmZvLCB0ZW1wbDsKKyAgIGxvbmcgbWFzazsKKyAgIGludCBuOworCisgICB0ZW1wbC52aXN1YWxpZCA9IHZpZDsKKyAgIG1hc2sgPSBWaXN1YWxJRE1hc2s7CisKKyAgIHZpbmZvID0gWEdldFZpc3VhbEluZm8oZHB5LCBtYXNrLCAmdGVtcGwsICZuKTsKKyAgIHJldHVybiB2aW5mbzsKK30KKworCitzdGF0aWMgdm9pZAora2V5X3VzYWdlKHZvaWQpCit7CisgICBwcmludGYoIktleWJvYXJkOlxuIik7CisgICBwcmludGYoIiAgeiAtIGRpc3BsYXkgWiBidWZmZXJcbiIpOworICAgcHJpbnRmKCIgIHMgLSBkaXNwbGF5IHN0ZW5jaWwgYnVmZmVyXG4iKTsKKyAgIHByaW50ZigiICBmIC0gZGlzcGxheSBmcm9udCBjb2xvciBidWZmZXJcbiIpOworICAgcHJpbnRmKCIgIGIgLSBkaXNwbGF5IGJhY2sgYnVmZmVyXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKyAgIHByaW50ZigiVXNhZ2U6IGdseHNub29wIFstZGlzcGxheSBkcHldIHdpbmRvd0lEXG4iKTsKKyAgIGtleV91c2FnZSgpOworfQorCisKK3N0YXRpYyB2b2lkCitwYXJzZV9vcHRzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICBpbnQgaTsKKworICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWgiKSA9PSAwKSB7CisgICAgICAgICB1c2FnZSgpOworICAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWRpc3BsYXkiKSA9PSAwKSB7CisgICAgICAgICBEaXNwbGF5TmFtZSA9IGFyZ3ZbaSArIDFdOworICAgICAgICAgaSsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBpZiAoYXJndltpXVswXSA9PSAnMCcgJiYgYXJndltpXVsxXSA9PSAneCcpIHsKKyAgICAgICAgICAgIC8qIGhleCAqLworICAgICAgICAgICAgV2luZG93SUQgPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMTYpOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXaW5kb3dJRCA9IGF0b2koYXJndltpXSk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCFXaW5kb3dJRCkgeworICAgICAgdXNhZ2UoKTsKKyAgICAgIGV4aXQoMCk7CisgICB9Cit9CisKKworaW50CittYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3sKKyAgIERpc3BsYXkgKmRweTsKKyAgIFZpc3VhbElEIHZpZDsKKyAgIFhWaXN1YWxJbmZvICp2aXNpbmZvOworICAgV2luZG93IHdpbjsKKworICAgcGFyc2Vfb3B0cyhhcmdjLCBhcmd2KTsKKworICAga2V5X3VzYWdlKCk7CisKKyAgIGRweSA9IFhPcGVuRGlzcGxheShEaXNwbGF5TmFtZSk7CisKKyAgIC8qIGZpbmQgdGhlIFZpc3VhbElEIGZvciB0aGUgbmFtZWQgd2luZG93ICovCisgICB2aWQgPSBnZXRfd2luZG93X3Zpc3VhbGlkKGRweSwgV2luZG93SUQpOworICAgZ2V0X3dpbmRvd19zaXplKGRweSwgV2luZG93SUQsICZXaWR0aCwgJkhlaWdodCk7CisKKyAgIHZpc2luZm8gPSB2aXN1YWxpZF90b192aXN1YWxpbmZvKGRweSwgdmlkKTsKKworICAgQ29udGV4dCA9IGdsWENyZWF0ZUNvbnRleHQoIGRweSwgdmlzaW5mbywgTlVMTCwgVHJ1ZSApOworICAgaWYgKCFDb250ZXh0KSB7CisgICAgICBwcmludGYoIkVycm9yOiBnbFhDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7CisgICAgICBleGl0KDEpOworICAgfQorCisgICB3aW4gPSBtYWtlX2dsX3dpbmRvdyhkcHksIHZpc2luZm8sIFdpZHRoLCBIZWlnaHQpOworICAgWE1hcFdpbmRvdyhkcHksIHdpbik7CisgICB1cGRhdGVfd2luZG93X3RpdGxlKGRweSwgd2luKTsKKworICAgZXZlbnRfbG9vcCggZHB5LCB3aW4gKTsKKworICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcm9ncy94ZGVtb3MvZ2x4c3dhcGNvbnRyb2wuYyBiL3Byb2dzL3hkZW1vcy9nbHhzd2FwY29udHJvbC5jCmluZGV4IGQ5YmU5ODQuLmU0MjlkNTggMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy9nbHhzd2FwY29udHJvbC5jCisrKyBiL3Byb2dzL3hkZW1vcy9nbHhzd2FwY29udHJvbC5jCkBAIC04MTQsNiArODE0LDExIEBACiAKICAgIGluaXQoKTsKIAorICAgLyogU2V0IGluaXRpYWwgcHJvamVjdGlvbi92aWV3aW5nIHRyYW5zZm9ybWF0aW9uLgorICAgICogc2FtZSBhcyBnbHhnZWFycy5jCisgICAgKi8KKyAgIHJlc2hhcGUoMzAwLCAzMDApOworCiAgICBldmVudF9sb29wKGRweSwgd2luKTsKIAogICAgZ2xYRGVzdHJveUNvbnRleHQoZHB5LCBjdHgpOwpkaWZmIC0tZ2l0IGEvcHJvZ3MveGRlbW9zL2lwYy5jIGIvcHJvZ3MveGRlbW9zL2lwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzJkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncy94ZGVtb3MvaXBjLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKCJ0aGUKKyAqIFNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGUgVHVuZ3N0ZW4KKyAqIEdyYXBoaWNzIHNwbGFzaCBzY3JlZW4sIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gIFRIRSBTT0ZUV0FSRQorICogSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELAorICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBTaW1wbGUgSVBDIEFQSQorICogQnJpYW4gUGF1bAorICovCisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSAiaXBjLmgiCisKKyNpZiBkZWZpbmVkKElSSVgpIHx8IGRlZmluZWQoaXJpeCkKK3R5cGVkZWYgaW50IHNvY2tsZW5fdDsKKyNlbmRpZgorCisjZGVmaW5lIE5PX0RFTEFZIDEKKworI2RlZmluZSBERUZBVUxUX01BU1RFUl9QT1JUIDcwMTEKKworCisvKgorICogUmV0dXJuIG15IGhvc3RuYW1lIGluIDxuYW1lT3V0Pi4KKyAqIFJldHVybiAxIGZvciBzdWNjZXNzLCAwIGZvciBlcnJvci4KKyAqLworaW50CitNeUhvc3ROYW1lKGNoYXIgKm5hbWVPdXQsIGludCBtYXhOYW1lTGVuZ3RoKQoreworICAgIGludCBrID0gZ2V0aG9zdG5hbWUobmFtZU91dCwgbWF4TmFtZUxlbmd0aCk7CisgICAgcmV0dXJuIGs9PTA7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHNvY2tldCBhdHRhY2hlZCB0byBhIHBvcnQuICBMYXRlciwgd2UgY2FuIGNhbGwgQWNjZXB0Q29ubmVjdGlvbgorICogb24gdGhlIHNvY2tldCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24uCisgKiBSZXR1cm4gdGhlIG5ldyBzb2NrZXQgbnVtYmVyIG9yIC0xIGlmIGVycm9yLgorICovCitpbnQKK0NyZWF0ZVBvcnQoaW50ICpwb3J0KQoreworICAgIGNoYXIgaG9zdG5hbWVbMTAwMF07CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZhZGRyOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKyAgICBpbnQgc29fcmV1c2VhZGRyID0gMTsKKyAgICBpbnQgdGNwX25vZGVsYXkgPSAxOworICAgIGludCBzb2NrLCBrOworCisgICAgLyogY3JlYXRlIHNvY2tldCAqLworICAgIHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGFzc2VydChzb2NrID4gMik7CisKKyAgICAvKiBnZXQgbXkgaG9zdCBuYW1lICovCisgICAgayA9IGdldGhvc3RuYW1lKGhvc3RuYW1lLCAxMDAwKTsKKyAgICBhc3NlcnQoayA9PSAwKTsKKworICAgIC8qIGdldCBob3N0ZW50IGluZm8gKi8KKyAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworICAgIGFzc2VydChocCk7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBzZXJ2YWRkciBzdHJ1Y3QgKi8KKyAgICBtZW1zZXQoJnNlcnZhZGRyLCAwLCBzaXplb2Yoc2VydmFkZHIpICk7CisgICAgc2VydmFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2VydmFkZHIuc2luX3BvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpICgqcG9ydCkpOworICAgIG1lbWNweSgoY2hhciAqKSAmc2VydmFkZHIuc2luX2FkZHIsIGhwLT5oX2FkZHIsCisJICAgc2l6ZW9mKHNlcnZhZGRyLnNpbl9hZGRyKSk7CisKKyAgICAvKiBkZWFsbG9jYXRlIHdoZW4gd2UgZXhpdCAqLworICAgIGsgPSBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKwkJICAgKGNoYXIgKikgJnNvX3JldXNlYWRkciwgc2l6ZW9mKHNvX3JldXNlYWRkcikpOworICAgIGFzc2VydChrPT0wKTsKKworICAgIC8qIHNlbmQgcGFja2V0cyBpbW1lZGlhdGVseSAqLworI2lmIE5PX0RFTEFZCisgICAgayA9IHNldHNvY2tvcHQoc29jaywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLAorCQkgICAoY2hhciAqKSAmdGNwX25vZGVsYXksIHNpemVvZih0Y3Bfbm9kZWxheSkpOworICAgIGFzc2VydChrPT0wKTsKKyNlbmRpZgorCisgICAgaWYgKCpwb3J0ID09IDApCisgICAgICAgICpwb3J0ID0gREVGQVVMVF9NQVNURVJfUE9SVDsKKworICAgIGsgPSAxOworICAgIHdoaWxlIChrICYmICgqcG9ydCA8IDY1NTM0KSkgeworICAgIAkvKiBiaW5kIG91ciBhZGRyZXNzIHRvIHRoZSBzb2NrZXQgKi8KKyAgICAJc2VydmFkZHIuc2luX3BvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpICgqcG9ydCkpOworICAgIAlrID0gYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2YWRkciwgc2l6ZW9mKHNlcnZhZGRyKSk7CisgICAgICAgIGlmIChrKQorICAgICAgICAgICAqcG9ydCA9ICpwb3J0ICsgMTsKKyAgICB9CisKKyNpZiAwCisgICAgcHJpbnRmKCIjIyMjIyMgUmVhbCBQb3J0OiAlZFxuIiwgKnBvcnQpOworI2VuZGlmCisKKyAgICAvKiBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zICovCisgICAgayA9IGxpc3Rlbihzb2NrLCAxMDApOworICAgIGFzc2VydChrID09IDApOworCisgICAgcmV0dXJuIHNvY2s7Cit9CisKKworLyoKKyAqIEFjY2VwdCBhIGNvbm5lY3Rpb24gb24gdGhlIG5hbWVkIHNvY2tldC4KKyAqIFJldHVybiBhIG5ldyBzb2NrZXQgZm9yIHRoZSBuZXcgY29ubmVjdGlvbiwgb3IgLTEgaWYgZXJyb3IuCisgKi8KK2ludAorQWNjZXB0Q29ubmVjdGlvbihpbnQgc29ja2V0KQoreworICAgIHN0cnVjdCBzb2NrYWRkciBhZGRyOworICAgIHNvY2tsZW5fdCBhZGRyTGVuOworICAgIGludCBuZXdTb2NrOworCisgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKKyAgICBuZXdTb2NrID0gYWNjZXB0KHNvY2tldCwgJmFkZHIsICZhZGRyTGVuKTsKKyAgICBpZiAobmV3U29jayA9PSAxKQorCXJldHVybiAtMTsKKyAgICBlbHNlCisJcmV0dXJuIG5ld1NvY2s7Cit9CisKKworLyoKKyAqIENvbnRhY3QgdGhlIHNlcnZlciBydW5uaW5nIG9uIHRoZSBnaXZlbiBob3N0IG9uIHRoZSBuYW1lZCBwb3J0LgorICogUmV0dXJuIHNvY2tldCBudW1iZXIgb3IgLTEgaWYgZXJyb3IuCisgKi8KK2ludAorQ29ubmVjdChjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZhZGRyOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKyAgICBpbnQgc29jaywgazsKKyAgICBpbnQgdGNwX25vZGVsYXkgPSAxOworCisgICAgYXNzZXJ0KHBvcnQpOworCisgICAgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgYXNzZXJ0KHNvY2sgPj0gMCk7CisKKyAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworICAgIGFzc2VydChocCk7CisKKyAgICBtZW1zZXQoJnNlcnZhZGRyLCAwLCBzaXplb2Yoc2VydmFkZHIpKTsKKyAgICBzZXJ2YWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzZXJ2YWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCk7CisgICAgbWVtY3B5KChjaGFyICopICZzZXJ2YWRkci5zaW5fYWRkciwgaHAtPmhfYWRkciwgc2l6ZW9mKHNlcnZhZGRyLnNpbl9hZGRyKSk7CisKKyAgICBrID0gY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2YWRkciwgc2l6ZW9mKHNlcnZhZGRyKSk7CisgICAgaWYgKGsgIT0gMCkgeworICAgICAgIHBlcnJvcigiQ29ubmVjdDoiKTsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjaWYgTk9fREVMQVkKKyAgICAvKiBzZW5kIHBhY2tldHMgaW1tZWRpYXRlbHkgKi8KKyAgICBrID0gc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCisJCSAgIChjaGFyICopICZ0Y3Bfbm9kZWxheSwgc2l6ZW9mKHRjcF9ub2RlbGF5KSk7CisgICAgYXNzZXJ0KGs9PTApOworI2VuZGlmCisKKyAgICByZXR1cm4gc29jazsKK30KKworCit2b2lkCitDbG9zZVNvY2tldChpbnQgc29ja2V0KQoreworICAgIGNsb3NlKHNvY2tldCk7Cit9CisKKworaW50CitTZW5kRGF0YShpbnQgc29ja2V0LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgYnl0ZXMpCit7CisgICAgaW50IHNlbnQgPSAwOworICAgIGludCBiOworCisgICAgd2hpbGUgKHNlbnQgPCBieXRlcykgeworICAgICAgICBiID0gd3JpdGUoc29ja2V0LCAoY2hhciAqKSBkYXRhICsgc2VudCwgYnl0ZXMgLSBzZW50KTsKKyAgICAgICAgaWYgKGIgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsgLyogc29tZXRoaW5nIGJyb2tlICovCisgICAgICAgIHNlbnQgKz0gYjsKKyAgICB9CisgICAgcmV0dXJuIHNlbnQ7Cit9CisKKworaW50CitSZWNlaXZlRGF0YShpbnQgc29ja2V0LCB2b2lkICpkYXRhLCBpbnQgYnl0ZXMpCit7CisgICAgaW50IHJlY2VpdmVkID0gMCwgYjsKKworICAgIHdoaWxlIChyZWNlaXZlZCA8IGJ5dGVzKSB7CisgICAgICAgIGIgPSByZWFkKHNvY2tldCwgKGNoYXIgKikgZGF0YSArIHJlY2VpdmVkLCBieXRlcyAtIHJlY2VpdmVkKTsKKyAgICAgICAgaWYgKGIgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVjZWl2ZWQgKz0gYjsKKyAgICB9CisgICAgcmV0dXJuIHJlY2VpdmVkOworfQorCisKK2ludAorU2VuZFN0cmluZyhpbnQgc29ja2V0LCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgaW50IGxlbiA9IHN0cmxlbihzdHIpOworICAgIGludCBzZW50LCBiOworCisgICAgLyogZmlyc3QsIHNlbmQgYSA0LWJ5dGUgbGVuZ3RoIGluZGljYXRvciAqLworICAgIGIgPSB3cml0ZShzb2NrZXQsICZsZW4sIHNpemVvZihsZW4pKTsKKyAgICBpZiAoYiA8PSAwKQorCXJldHVybiAtMTsKKworICAgIHNlbnQgPSBTZW5kRGF0YShzb2NrZXQsIHN0ciwgbGVuKTsKKyAgICBhc3NlcnQoc2VudCA9PSBsZW4pOworICAgIHJldHVybiBzZW50OworfQorCisKK2ludAorUmVjZWl2ZVN0cmluZyhpbnQgc29ja2V0LCBjaGFyICpzdHIsIGludCBtYXhMZW4pCit7CisgICAgaW50IGxlbiwgcmVjZWl2ZWQsIGI7CisKKyAgICAvKiBmaXJzdCwgcmVhZCA0IGJ5dGVzIHRvIHNlZSBob3cgbG9uZyBvZiBzdHJpbmcgdG8gcmVjZWl2ZSAqLworICAgIGIgPSByZWFkKHNvY2tldCwgJmxlbiwgc2l6ZW9mKGxlbikpOworICAgIGlmIChiIDw9IDApCisJcmV0dXJuIC0xOworCisgICAgYXNzZXJ0KGxlbiA8PSBtYXhMZW4pOyAgLyogWFhYIGZpeCBzb21lZGF5ICovCisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKKyAgICByZWNlaXZlZCA9IFJlY2VpdmVEYXRhKHNvY2tldCwgc3RyLCBsZW4pOworICAgIGFzc2VydChyZWNlaXZlZCAhPSAtMSk7CisgICAgYXNzZXJ0KHJlY2VpdmVkID09IGxlbik7CisgICAgc3RyW2xlbl0gPSAwOworICAgIHJldHVybiByZWNlaXZlZDsKK30KZGlmZiAtLWdpdCBhL3Byb2dzL3hkZW1vcy9pcGMuaCBiL3Byb2dzL3hkZW1vcy9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQzNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3MveGRlbW9zL2lwYy5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgSVBDX0gKKyNkZWZpbmUgSVBDX0gKKworCitleHRlcm4gaW50IE15SG9zdE5hbWUoY2hhciAqbmFtZU91dCwgaW50IG1heE5hbWVMZW5ndGgpOworZXh0ZXJuIGludCBDcmVhdGVQb3J0KGludCAqcG9ydCk7CitleHRlcm4gaW50IEFjY2VwdENvbm5lY3Rpb24oaW50IHNvY2tldCk7CitleHRlcm4gaW50IENvbm5lY3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBwb3J0KTsKK2V4dGVybiB2b2lkIENsb3NlU29ja2V0KGludCBzb2NrZXQpOworZXh0ZXJuIGludCBTZW5kRGF0YShpbnQgc29ja2V0LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgYnl0ZXMpOworZXh0ZXJuIGludCBSZWNlaXZlRGF0YShpbnQgc29ja2V0LCB2b2lkICpkYXRhLCBpbnQgYnl0ZXMpOworZXh0ZXJuIGludCBTZW5kU3RyaW5nKGludCBzb2NrZXQsIGNvbnN0IGNoYXIgKnN0cik7CitleHRlcm4gaW50IFJlY2VpdmVTdHJpbmcoaW50IHNvY2tldCwgY2hhciAqc3RyLCBpbnQgbWF4TGVuKTsKKworCisjZW5kaWYgLyogSVBDX0ggKi8KZGlmZiAtLWdpdCBhL3Byb2dzL3hkZW1vcy9vZmZzZXQuYyBiL3Byb2dzL3hkZW1vcy9vZmZzZXQuYwppbmRleCAwYWQ5MTQ3Li42YzVhYmYzIDEwMDY0NAotLS0gYS9wcm9ncy94ZGVtb3Mvb2Zmc2V0LmMKKysrIGIvcHJvZ3MveGRlbW9zL29mZnNldC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAKIAogI2luY2x1ZGUgPEdML2dseC5oPgotI2luY2x1ZGUgPEdML2dsdS5oPgogI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMTM1LDcgKzEzNCw3IEBACiAKICAgICAvKiBzZXQgdXAgdmlld2luZyBwYXJhbWV0ZXJzICovCiAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsdVBlcnNwZWN0aXZlKDIwLCAxLCAxMCwgMjApOworICAgIGdsRnJ1c3R1bSgtMSwgMSwgLTEsIDEsIDYsIDIwKTsKICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKICAgICBnbFRyYW5zbGF0ZWYoMCwgMCwgLTE1KTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3MveGRlbW9zL3BidXRpbC5jIGIvcHJvZ3MveGRlbW9zL3BidXRpbC5jCmluZGV4IGQwYmJkMWIuLmNlMTMzZDAgMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy9wYnV0aWwuYworKysgYi9wcm9ncy94ZGVtb3MvcGJ1dGlsLmMKQEAgLTE4LDEyICsxOCwxMiBAQAogICogVGVzdCBpZiB3ZSBwaXhlbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgZm9yIGEgcGFydGljdWxhciBYIHNjcmVlbi4KICAqIElucHV0OiAgZHB5IC0gdGhlIFggZGlzcGxheQogICogICAgICAgICBzY3JlZW4gLSBzY3JlZW4gbnVtYmVyCi0gKiBSZXR1cm46ICAwID0gcGl4ZWwgYnVmZmVycyBub3QgYXZhaWxhYmxlLgotICogICAgICAgICAgMSA9IHBpeGVsIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSB2aWEgR0xYIDEuMy4KLSAqICAgICAgICAgIDIgPSBwaXhlbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgdmlhIEdMWF9TR0lYX2ZiY29uZmlnL3BidWZmZXIuCisgKiBSZXR1cm46ICAwID0gZmJjb25maWdzIG5vdCBhdmFpbGFibGUuCisgKiAgICAgICAgICAxID0gZmJjb25maWdzIGFyZSBhdmFpbGFibGUgdmlhIEdMWCAxLjMuCisgKiAgICAgICAgICAyID0gZmJjb25maWdzIGFuZCBwYnVmZmVycyBhcmUgYXZhaWxhYmxlIHZpYSBHTFhfU0dJWF9mYmNvbmZpZwogICovCiBpbnQKLVF1ZXJ5UGJ1ZmZlcnMoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuKQorUXVlcnlGQkNvbmZpZyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pCiB7CiAjaWYgZGVmaW5lZChHTFhfVkVSU0lPTl8xXzMpCiAgICB7CkBAIC00MCwzNiArNDAsNTUgQEAKICAgIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChHTFhfU0dJWF9mYmNvbmZpZykgJiYgZGVmaW5lZChHTFhfU0dJWF9wYnVmZmVyKQogICAgLyogVHJ5IHRoZSBTR0lYIGV4dGVuc2lvbnMgKi8KICAgIHsKICAgICAgIGNoYXIgKmV4dGVuc2lvbnM7CiAgICAgICBleHRlbnNpb25zID0gKGNoYXIgKikgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoZHB5LCBzY3JlZW4sIEdMWF9FWFRFTlNJT05TKTsKLSAgICAgIGlmICghZXh0ZW5zaW9ucyB8fAotICAgICAgICAgICFzdHJzdHIoZXh0ZW5zaW9ucywiR0xYX1NHSVhfZmJjb25maWciKSB8fAotICAgICAgICAgICFzdHJzdHIoZXh0ZW5zaW9ucywiR0xYX1NHSVhfcGJ1ZmZlciIpKSB7Ci0gICAgICAgICByZXR1cm4gMDsKKyAgICAgIGlmIChleHRlbnNpb25zICYmIHN0cnN0cihleHRlbnNpb25zLCJHTFhfU0dJWF9mYmNvbmZpZyIpKSB7CisJIHJldHVybiAyOwogICAgICAgfQotICAgICAgcmV0dXJuIDI7CiAgICB9Ci0jZW5kaWYKIAogICAgcmV0dXJuIDA7CiB9CiAKKy8qKgorICogVGVzdCBpZiB3ZSBwaXhlbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgZm9yIGEgcGFydGljdWxhciBYIHNjcmVlbi4KKyAqIElucHV0OiAgZHB5IC0gdGhlIFggZGlzcGxheQorICogICAgICAgICBzY3JlZW4gLSBzY3JlZW4gbnVtYmVyCisgKiBSZXR1cm46ICAwID0gcGl4ZWwgYnVmZmVycyBub3QgYXZhaWxhYmxlLgorICogICAgICAgICAgMSA9IHBpeGVsIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSB2aWEgR0xYIDEuMy4KKyAqICAgICAgICAgIDIgPSBwaXhlbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgdmlhIEdMWF9TR0lYX2ZiY29uZmlnL3BidWZmZXIuCisgKi8KK2ludAorUXVlcnlQYnVmZmVycyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pCit7CisgICBpbnQgcmV0OwogCisgICByZXQgPSBRdWVyeUZCQ29uZmlnKGRweSwgc2NyZWVuKTsKKyAgIGlmIChyZXQgPT0gMikgeworICAgICAgY2hhciAqZXh0ZW5zaW9uczsKKyAgICAgIGV4dGVuc2lvbnMgPSAoY2hhciAqKSBnbFhRdWVyeVNlcnZlclN0cmluZyhkcHksIHNjcmVlbiwgR0xYX0VYVEVOU0lPTlMpOworICAgICAgaWYgKGV4dGVuc2lvbnMgJiYgc3Ryc3RyKGV4dGVuc2lvbnMsICJHTFhfU0dJWF9wYnVmZmVyIikpCisJIHJldHVybiAyOworICAgICAgZWxzZQorCSByZXR1cm4gMDsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIHJldHVybiByZXQ7Cit9CiAKIEZCQ09ORklHICoKIENob29zZUZCQ29uZmlnKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgY29uc3QgaW50IGF0dHJpYnNbXSwgaW50ICpuQ29uZmlncykKIHsKLSAgIGludCBwYlN1cHBvcnQgPSBRdWVyeVBidWZmZXJzKGRweSwgc2NyZWVuKTsKKyAgIGludCBmYmNTdXBwb3J0ID0gUXVlcnlQYnVmZmVycyhkcHksIHNjcmVlbik7CiAjaWYgZGVmaW5lZChHTFhfVkVSU0lPTl8xXzMpCi0gICBpZiAocGJTdXBwb3J0ID09IDEpIHsKKyAgIGlmIChmYmNTdXBwb3J0ID09IDEpIHsKICAgICAgIHJldHVybiBnbFhDaG9vc2VGQkNvbmZpZyhkcHksIHNjcmVlbiwgYXR0cmlicywgbkNvbmZpZ3MpOwogICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChHTFhfU0dJWF9mYmNvbmZpZykgJiYgZGVmaW5lZChHTFhfU0dJWF9wYnVmZmVyKQotICAgaWYgKHBiU3VwcG9ydCA9PSAyKSB7CisgICBpZiAoZmJjU3VwcG9ydCA9PSAyKSB7CiAgICAgICByZXR1cm4gZ2xYQ2hvb3NlRkJDb25maWdTR0lYKGRweSwgc2NyZWVuLCAoaW50ICopIGF0dHJpYnMsIG5Db25maWdzKTsKICAgIH0KICNlbmRpZgpAQCAtODAsMTQgKzk5LDE0IEBACiBGQkNPTkZJRyAqCiBHZXRBbGxGQkNvbmZpZ3MoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5Db25maWdzKQogewotICAgaW50IHBiU3VwcG9ydCA9IFF1ZXJ5UGJ1ZmZlcnMoZHB5LCBzY3JlZW4pOworICAgaW50IGZiY1N1cHBvcnQgPSBRdWVyeUZCQ29uZmlnKGRweSwgc2NyZWVuKTsKICNpZiBkZWZpbmVkKEdMWF9WRVJTSU9OXzFfMykKLSAgIGlmIChwYlN1cHBvcnQgPT0gMSkgeworICAgaWYgKGZiY1N1cHBvcnQgPT0gMSkgewogICAgICAgcmV0dXJuIGdsWEdldEZCQ29uZmlncyhkcHksIHNjcmVlbiwgbkNvbmZpZ3MpOwogICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChHTFhfU0dJWF9mYmNvbmZpZykgJiYgZGVmaW5lZChHTFhfU0dJWF9wYnVmZmVyKQotICAgaWYgKHBiU3VwcG9ydCA9PSAyKSB7CisgICBpZiAoZmJjU3VwcG9ydCA9PSAyKSB7CiAgICAgICAvKiBUaGUgR0xYX1NHSVhfZmJjb25maWcgZXh0ZW5zaW9ucyBzYXlzIHRvIHBhc3MgTlVMTCB0byBnZXQgbGlzdAogICAgICAgICogb2YgYWxsIGF2YWlsYWJsZSBjb25maWd1cmF0aW9ucy4KICAgICAgICAqLwpAQCAtMTAxLDE0ICsxMjAsMTQgQEAKIFhWaXN1YWxJbmZvICoKIEdldFZpc3VhbEZyb21GQkNvbmZpZyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEZCQ09ORklHIGNvbmZpZykKIHsKLSAgIGludCBwYlN1cHBvcnQgPSBRdWVyeVBidWZmZXJzKGRweSwgc2NyZWVuKTsKKyAgIGludCBmYmNTdXBwb3J0ID0gUXVlcnlGQkNvbmZpZyhkcHksIHNjcmVlbik7CiAjaWYgZGVmaW5lZChHTFhfVkVSU0lPTl8xXzMpCi0gICBpZiAocGJTdXBwb3J0ID09IDEpIHsKKyAgIGlmIChmYmNTdXBwb3J0ID09IDEpIHsKICAgICAgIHJldHVybiBnbFhHZXRWaXN1YWxGcm9tRkJDb25maWcoZHB5LCBjb25maWcpOwogICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChHTFhfU0dJWF9mYmNvbmZpZykgJiYgZGVmaW5lZChHTFhfU0dJWF9wYnVmZmVyKQotICAgaWYgKHBiU3VwcG9ydCA9PSAyKSB7CisgICBpZiAoZmJjU3VwcG9ydCA9PSAyKSB7CiAgICAgICByZXR1cm4gZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnU0dJWChkcHksIGNvbmZpZyk7CiAgICB9CiAjZW5kaWYKQEAgLTEzMCwxMSArMTQ5LDExIEBACiAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmliCiAgICAgICAgICAgICAgICAgICApCiB7Ci0gICBpbnQgcGJTdXBwb3J0ID0gUXVlcnlQYnVmZmVycyhkcHksIHNjcmVlbik7CisgICBpbnQgZmJjU3VwcG9ydCA9IFF1ZXJ5RkJDb25maWcoZHB5LCBzY3JlZW4pOwogICAgaW50IHZhbHVlID0gMDsKIAogI2lmIGRlZmluZWQoR0xYX1ZFUlNJT05fMV8zKQotICAgaWYgKHBiU3VwcG9ydCA9PSAxKSB7CisgICBpZiAoZmJjU3VwcG9ydCA9PSAxKSB7CiAgICAgICAvKiBvayAqLwogICAgICAgaWYgKGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBhdHRyaWIsICZ2YWx1ZSkgIT0gMCkgewogICAgICAgICAgdmFsdWUgPSAwOwpAQCAtMTQ1LDcgKzE2NCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoR0xYX1NHSVhfZmJjb25maWcpICYmIGRlZmluZWQoR0xYX1NHSVhfcGJ1ZmZlcikKLSAgIGlmIChwYlN1cHBvcnQgPT0gMikgeworICAgaWYgKGZiY1N1cHBvcnQgPT0gMikgewogICAgICAgaWYgKGdsWEdldEZCQ29uZmlnQXR0cmliU0dJWChkcHksIGNvbmZpZywgYXR0cmliLCAmdmFsdWUpICE9IDApIHsKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgIH0KQEAgLTI5NSw5ICszMTQsOSBAQAogR0xYQ29udGV4dAogQ3JlYXRlQ29udGV4dChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEZCQ09ORklHIGNvbmZpZykKIHsKLSAgIGludCBwYlN1cHBvcnQgPSBRdWVyeVBidWZmZXJzKGRweSwgc2NyZWVuKTsKKyAgIGludCBmYmNTdXBwb3J0ID0gUXVlcnlGQkNvbmZpZyhkcHksIHNjcmVlbik7CiAjaWYgZGVmaW5lZChHTFhfVkVSU0lPTl8xXzMpCi0gICBpZiAocGJTdXBwb3J0ID09IDEpIHsKKyAgIGlmIChmYmNTdXBwb3J0ID09IDEpIHsKICAgICAgIC8qIEdMWCAxLjMgKi8KICAgICAgIEdMWENvbnRleHQgYzsKICAgICAgIGMgPSBnbFhDcmVhdGVOZXdDb250ZXh0KGRweSwgY29uZmlnLCBHTFhfUkdCQV9UWVBFLCBOVUxMLCBUcnVlKTsKQEAgLTMwOSw3ICszMjgsNyBAQAogICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChHTFhfU0dJWF9mYmNvbmZpZykgJiYgZGVmaW5lZChHTFhfU0dJWF9wYnVmZmVyKQotICAgaWYgKHBiU3VwcG9ydCA9PSAyKSB7CisgICBpZiAoZmJjU3VwcG9ydCA9PSAyKSB7CiAgICAgICBHTFhDb250ZXh0IGM7CiAgICAgICBjID0gZ2xYQ3JlYXRlQ29udGV4dFdpdGhDb25maWdTR0lYKGRweSwgY29uZmlnLCBHTFhfUkdCQV9UWVBFX1NHSVgsIE5VTEwsIFRydWUpOwogICAgICAgaWYgKCFjKSB7CkBAIC0zOTMsNiArNDEyLDcgQEAKICAgICAgIHBCdWZmZXIgPSBOb25lOwogICAgfQogCisgICBYU3luYyhkcHksIEZhbHNlKTsKICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgWCBlcnJvciBoYW5kbGVyICovCiAgICAodm9pZCkgWFNldEVycm9ySGFuZGxlcihvbGRIYW5kbGVyKTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3MveGRlbW9zL3BidXRpbC5oIGIvcHJvZ3MveGRlbW9zL3BidXRpbC5oCmluZGV4IGU5NWIyNTYuLmQ0MjA1MjIgMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy9wYnV0aWwuaAorKysgYi9wcm9ncy94ZGVtb3MvcGJ1dGlsLmgKQEAgLTI3LDYgKzI3LDkgQEAKIAogCiBleHRlcm4gaW50CitRdWVyeUZCQ29uZmlnKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbik7CisKK2V4dGVybiBpbnQKIFF1ZXJ5UGJ1ZmZlcnMoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuKTsKIAogCmRpZmYgLS1naXQgYS9wcm9ncy94ZGVtb3Mvc2hhcGUuYyBiL3Byb2dzL3hkZW1vcy9zaGFwZS5jCmluZGV4IGRiYmMwYjQuLjVmZjA5NzAgMTAwNjQ0Ci0tLSBhL3Byb2dzL3hkZW1vcy9zaGFwZS5jCisrKyBiL3Byb2dzL3hkZW1vcy9zaGFwZS5jCkBAIC0zNCw3ICszNCw2IEBACiBzdGF0aWMgaW50IFdpZHRoPTUwMCwgSGVpZ2h0PTUwMDsKIAogc3RhdGljIGZsb2F0IFhhbmdsZSA9IDAuMCwgWWFuZ2xlID0gMC4wOwotc3RhdGljIGludCBSZWRyYXcgPSAwOwogc3RhdGljIGludCBTaWRlcyA9IDU7CiBzdGF0aWMgaW50IE1pblNpZGVzID0gMzsKIHN0YXRpYyBpbnQgTWF4U2lkZXMgPSAyMDsKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCBmYWIwMDY5Li40ZjY1ZGEwIDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC0zMyw3ICszMyw3IEBACiAKIAogY2xlYW46Ci0JQGZvciBkaXIgaW4gJChTVUJESVJTKSA7IGRvIFwKKwktQGZvciBkaXIgaW4gJChTVUJESVJTKSA7IGRvIFwKIAkJaWYgWyAtZCAkJGRpciBdIDsgdGhlbiBcCiAJCQkoY2QgJCRkaXIgJiYgJChNQUtFKSBjbGVhbikgOyBcCiAJCWZpIFwKZGlmZiAtLWdpdCBhL3NyYy9lZ2wvTWFrZWZpbGUgYi9zcmMvZWdsL01ha2VmaWxlCmluZGV4IDA4MmQ3NjIuLjAyNDQ1M2YgMTAwNjQ0Ci0tLSBhL3NyYy9lZ2wvTWFrZWZpbGUKKysrIGIvc3JjL2VnbC9NYWtlZmlsZQpAQCAtMTEsMTQgKzExLDE0IEBACiBzdWJkaXJzOgogCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCiAJCWlmIFsgLWQgJCRkaXIgXSA7IHRoZW4gXAotCQkJKGNkICQkZGlyIDsgJChNQUtFKSkgfHwgZXhpdCAxIDsgXAorCQkJKGNkICQkZGlyICYmICQoTUFLRSkpIHx8IGV4aXQgMSA7IFwKIAkJZmkgXAogCWRvbmUKIAogCiBjbGVhbjoKLQlAZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCS1AZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAogCQlpZiBbIC1kICQkZGlyIF0gOyB0aGVuIFwKLQkJCShjZCAkJGRpciA7ICQoTUFLRSkgY2xlYW4pIDsgXAorCQkJKGNkICQkZGlyICYmICQoTUFLRSkgY2xlYW4pIDsgXAogCQlmaSBcCiAJZG9uZQpkaWZmIC0tZ2l0IGEvc3JjL2VnbC9kcml2ZXJzL2RlbW8vTWFrZWZpbGUgYi9zcmMvZWdsL2RyaXZlcnMvZGVtby9NYWtlZmlsZQppbmRleCBlNWE3YmUyLi42Y2EyNWFhIDEwMDY0NAotLS0gYS9zcmMvZWdsL2RyaXZlcnMvZGVtby9NYWtlZmlsZQorKysgYi9zcmMvZWdsL2RyaXZlcnMvZGVtby9NYWtlZmlsZQpAQCAtMjEsMTAgKzIxLDEyIEBACiAKIAogJChUT1ApLyQoTElCX0RJUikvZGVtb2RyaXZlci5zbzogJChPQkpFQ1RTKQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gZGVtb2RyaXZlci5zbyAtbm9wcmVmaXggJChPQkpFQ1RTKQorCSQoTUtMSUIpIC1vIGRlbW9kcml2ZXIuc28gLW5vcHJlZml4IC1saW5rZXIgJyQoQ0MpJyBcCisJCS1sZGZsYWdzICckKExERkxBR1MpJyAtaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSBcCisJCSQoT0JKRUNUUykKIAogCiAKIGNsZWFuOgotCXJtIC1mICoubwotCXJtIC1mICouc28KKwktcm0gLWYgKi5vCisJLXJtIC1mICouc28KZGlmZiAtLWdpdCBhL3NyYy9lZ2wvZHJpdmVycy9kcmkvTWFrZWZpbGUgYi9zcmMvZWdsL2RyaXZlcnMvZHJpL01ha2VmaWxlCmluZGV4IGJkYzY4M2EuLjNiZDZiNTIgMTAwNjQ0Ci0tLSBhL3NyYy9lZ2wvZHJpdmVycy9kcmkvTWFrZWZpbGUKKysrIGIvc3JjL2VnbC9kcml2ZXJzL2RyaS9NYWtlZmlsZQpAQCAtNDQsMTMgKzQ0LDE0IEBACiBsaWJyYXJ5OiAkKFRPUCkvJChMSUJfRElSKS9saWJFR0xkcmkuc28KIAogJChUT1ApLyQoTElCX0RJUikvbGliRUdMZHJpLnNvOiAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyBFR0xkcmkgLW1ham9yIDEgLW1pbm9yIDAgXAotCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAtbGRsICQoT0JKRUNUUykgJChEUk1fTElCKQorCSQoTUtMSUIpIC1vIEVHTGRyaSAtbGlua2VyICckKENDKScgLWxkZmxhZ3MgJyQoTERGTEFHUyknIFwKKwkJLW1ham9yIDEgLW1pbm9yIDAgXAorCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAtbGRsICQoT0JKRUNUUykgJChMSUJTKQogCiAKIGNsZWFuOgotCXJtIC1mICoubwotCXJtIC1mICouc28KKwktcm0gLWYgKi5vCisJLXJtIC1mICouc28KIAogZGVwZW5kOiAkKFNPVVJDRVMpICQoSEVBREVSUykKIAlAIGVjaG8gInJ1bm5pbmcgJChNS0RFUCkiCmRpZmYgLS1naXQgYS9zcmMvZWdsL21haW4vTWFrZWZpbGUgYi9zcmMvZWdsL21haW4vTWFrZWZpbGUKaW5kZXggOTY3NDJiYi4uOGVhNjBjMCAxMDA2NDQKLS0tIGEvc3JjL2VnbC9tYWluL01ha2VmaWxlCisrKyBiL3NyYy9lZ2wvbWFpbi9NYWtlZmlsZQpAQCAtNjEsMTQgKzYxLDE1IEBACiBsaWJyYXJ5OiAkKFRPUCkvJChMSUJfRElSKS9saWJFR0wuc28KIAogJChUT1ApLyQoTElCX0RJUikvbGliRUdMLnNvOiAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyBFR0wgLW1ham9yIDEgLW1pbm9yIDAgXAorCSQoTUtMSUIpIC1vIEVHTCAtbGlua2VyICckKENDKScgLWxkZmxhZ3MgJyQoTERGTEFHUyknIFwKKwkJLW1ham9yIDEgLW1pbm9yIDAgXAogCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAtbGRsICQoT0JKRUNUUykgJChMSUJTKQogCiAKIAogY2xlYW46Ci0Jcm0gLWYgKi5vICouc28qCi0Jcm0gLWYgY29yZS4qCisJLXJtIC1mICoubyAqLnNvKgorCS1ybSAtZiBjb3JlLioKIAogCiBkZXBlbmQ6ICQoU09VUkNFUykgJChIRUFERVJTKQpkaWZmIC0tZ2l0IGEvc3JjL2dsdS9NYWtlZmlsZSBiL3NyYy9nbHUvTWFrZWZpbGUKaW5kZXggYjhjNTVkYi4uYjAyNWE5MCAxMDA2NDQKLS0tIGEvc3JjL2dsdS9NYWtlZmlsZQorKysgYi9zcmMvZ2x1L01ha2VmaWxlCkBAIC0xMCwxNCArMTAsMjYgQEAKIAogZGVmYXVsdDogJChUT1ApL2NvbmZpZ3MvY3VycmVudAogCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCi0JCShjZCAkJGRpciA7ICQoTUFLRSkpIDsgXAorCQkoY2QgJCRkaXIgJiYgJChNQUtFKSkgfHwgZXhpdCAxIDsgXAogCWRvbmUKIAotaW5zdGFsbDoKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCi0JJChJTlNUQUxMKSAkKFRPUCkvJChMSUJfRElSKS9saWJHTFUuKiAkKERFU1RESVIpJChJTlNUQUxMX0RJUikvJChMSUJfRElSKQorIyBHTFUgcGtnLWNvbmZpZyBmaWxlCitwY2VkaXQgPSBzZWQgXAorCS1lICdzLEBJTlNUQUxMX0RJUkAsJChJTlNUQUxMX0RJUiksJyBcCisJLWUgJ3MsQElOU1RBTExfTElCX0RJUkAsJChJTlNUQUxMX0xJQl9ESVIpLCcgXAorCS1lICdzLEBJTlNUQUxMX0lOQ19ESVJALCQoSU5TVEFMTF9JTkNfRElSKSwnIFwKKwktZSAncyxAVkVSU0lPTkAsJChNRVNBX01BSk9SKS4kKE1FU0FfTUlOT1IpLiQoTUVTQV9USU5ZKSwnCitnbHUucGM6IGdsdS5wYy5pbgorCSQocGNlZGl0KSAkPCA+ICRACisKK2luc3RhbGw6IGdsdS5wYworCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKQorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKS9wa2djb25maWcKKwkkKElOU1RBTEwpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVX0xJQl9HTE9CKSAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtbSA2NDQgZ2x1LnBjICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikvcGtnY29uZmlnCiAKIGNsZWFuOgotCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCi0JCShjZCAkJGRpciA7ICQoTUFLRSkgY2xlYW4pIDsgXAorCS1AZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCQkoY2QgJCRkaXIgJiYgJChNQUtFKSBjbGVhbikgOyBcCiAJZG9uZQorCS1ybSAtZiAqLnBjCmRpZmYgLS1naXQgYS9zcmMvZ2x1L2dsdS5wYy5pbiBiL3NyYy9nbHUvZ2x1LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x1L2dsdS5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QElOU1RBTExfRElSQAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9QElOU1RBTExfTElCX0RJUkAKK2luY2x1ZGVkaXI9QElOU1RBTExfSU5DX0RJUkAKKworTmFtZTogZ2x1CitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgVXRpbGl0eSBsaWJyYXJ5CitSZXF1aXJlczogZ2wKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxHTFUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zcmMvZ2x1L21lc2EvTWFrZWZpbGUgYi9zcmMvZ2x1L21lc2EvTWFrZWZpbGUKaW5kZXggNDdmOTVlZi4uYzQ2OGNlNiAxMDA2NDQKLS0tIGEvc3JjL2dsdS9tZXNhL01ha2VmaWxlCisrKyBiL3NyYy9nbHUvbWVzYS9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQAogCiBPQkpFQ1RTID0gJChDX1NPVVJDRVM6LmM9Lm8pCiAKLUlOQ0xVREVTID0gLUkuIC1JLSAtSSQoVE9QKS9pbmNsdWRlCitJTkNMVURFUyA9IC1JLiAtSSQoVE9QKS9pbmNsdWRlCiAKICMjIyMjIFJVTEVTICMjIyMjCiAKQEAgLTM3LDcgKzM3LDcgQEAKIAkJZWNobyAiJChHTFVfTElCX05BTUUpIG5vdCBidWlsZCB1bmRlciBCZU9TLCBidXQgaW50ZWdyYXRlZCBpbnRvICR7R0xfTElCX05BTUV9LiIgOyBcCiAJCWV4aXQgMCA7IFwKIAllbHNlIFwKLQkJJChNQUtFKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkgOyBcCisJCSQoTUFLRSkgJChUT1ApLyQoTElCX0RJUikvJChHTFVfTElCX05BTUUpIHx8IGV4aXQgMSA7IFwKIAlmaQogCiAkKFRPUCkvJChMSUJfRElSKToKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogIyBNYWtlIHRoZSBsaWJyYXJ5OgogJChUT1ApLyQoTElCX0RJUikvJChHTFVfTElCX05BTUUpOiAkKE9CSkVDVFMpCi0JQCAkKFRPUCkvYmluL21rbGliIC1vICQoR0xVX0xJQikgLWxpbmtlciAnJChDQyknIFwKKwlAICQoTUtMSUIpIC1vICQoR0xVX0xJQikgLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCiAJCS1tYWpvciAkKEdMVV9NQUpPUikgLW1pbm9yICQoR0xVX01JTk9SKSAtcGF0Y2ggJChHTFVfVElOWSkgXAogCQkkKE1LTElCX09QVElPTlMpIC1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKIAkJJChHTFVfTElCX0RFUFMpICQoT0JKRUNUUykKZGlmZiAtLWdpdCBhL3NyYy9nbHUvbWVzYS9wcm9qZWN0LmMgYi9zcmMvZ2x1L21lc2EvcHJvamVjdC5jCmluZGV4IDZmYTAzMjYuLjJlNzljZGYgMTAwNjQ0Ci0tLSBhL3NyYy9nbHUvbWVzYS9wcm9qZWN0LmMKKysrIGIvc3JjL2dsdS9tZXNhL3Byb2plY3QuYwpAQCAtMzQ2LDcgKzM0Niw4IEBACiAKICAgIC8qIGNhbGN1bCB0cmFuc2Zvcm1hdGlvbiBpbnZlcnNlICovCiAgICBtYXRtdWwoQSwgcHJvaiwgbW9kZWwpOwotICAgaW52ZXJ0X21hdHJpeChBLCBtKTsKKyAgIGlmICghaW52ZXJ0X21hdHJpeChBLCBtKSkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKIAogICAgLyogZCdvdSBsZXMgY29vcmRvbm5lZXMgb2JqZXRzICovCiAgICB0cmFuc2Zvcm1fcG9pbnQob3V0LCBtLCBpbik7CkBAIC0zODYsNyArMzg3LDggQEAKIAogICAgLyogY2FsY3VsIHRyYW5zZm9ybWF0aW9uIGludmVyc2UgKi8KICAgIG1hdG11bChBLCBwcm9qTWF0cml4LCBtb2RlbE1hdHJpeCk7Ci0gICBpbnZlcnRfbWF0cml4KEEsIG0pOworICAgaWYgKCFpbnZlcnRfbWF0cml4KEEsIG0pKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogCiAgICAvKiBkJ291IGxlcyBjb29yZG9ubmVlcyBvYmpldHMgKi8KICAgIHRyYW5zZm9ybV9wb2ludChvdXQsIG0sIGluKTsKZGlmZiAtLWdpdCBhL3NyYy9nbHUvbWluaS9wcm9qZWN0LmMgYi9zcmMvZ2x1L21pbmkvcHJvamVjdC5jCmluZGV4IDZmYTAzMjYuLjJlNzljZGYgMTAwNjQ0Ci0tLSBhL3NyYy9nbHUvbWluaS9wcm9qZWN0LmMKKysrIGIvc3JjL2dsdS9taW5pL3Byb2plY3QuYwpAQCAtMzQ2LDcgKzM0Niw4IEBACiAKICAgIC8qIGNhbGN1bCB0cmFuc2Zvcm1hdGlvbiBpbnZlcnNlICovCiAgICBtYXRtdWwoQSwgcHJvaiwgbW9kZWwpOwotICAgaW52ZXJ0X21hdHJpeChBLCBtKTsKKyAgIGlmICghaW52ZXJ0X21hdHJpeChBLCBtKSkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKIAogICAgLyogZCdvdSBsZXMgY29vcmRvbm5lZXMgb2JqZXRzICovCiAgICB0cmFuc2Zvcm1fcG9pbnQob3V0LCBtLCBpbik7CkBAIC0zODYsNyArMzg3LDggQEAKIAogICAgLyogY2FsY3VsIHRyYW5zZm9ybWF0aW9uIGludmVyc2UgKi8KICAgIG1hdG11bChBLCBwcm9qTWF0cml4LCBtb2RlbE1hdHJpeCk7Ci0gICBpbnZlcnRfbWF0cml4KEEsIG0pOworICAgaWYgKCFpbnZlcnRfbWF0cml4KEEsIG0pKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogCiAgICAvKiBkJ291IGxlcyBjb29yZG9ubmVlcyBvYmpldHMgKi8KICAgIHRyYW5zZm9ybV9wb2ludChvdXQsIG0sIGluKTsKZGlmZiAtLWdpdCBhL3NyYy9nbHUvc2dpL01ha2VmaWxlIGIvc3JjL2dsdS9zZ2kvTWFrZWZpbGUKaW5kZXggY2RkMjY3YS4uMjBjM2JlZCAxMDA2NDQKLS0tIGEvc3JjL2dsdS9zZ2kvTWFrZWZpbGUKKysrIGIvc3JjL2dsdS9zZ2kvTWFrZWZpbGUKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQllY2hvICIkKEdMVV9MSUJfTkFNRSkgbm90IGJ1aWxkIHVuZGVyIEJlT1MsIGJ1dCBpbnRlZ3JhdGVkIGludG8gJHtHTF9MSUJfTkFNRX0uIiA7IFwKIAkJZXhpdCAwIDsgXAogCWVsc2UgXAotCQkkKE1BS0UpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVX0xJQl9OQU1FKSA7IFwKKwkJJChNQUtFKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVV9MSUJfTkFNRSkgfHwgZXhpdCAxIDsgXAogCWZpCiAKICQoVE9QKS8kKExJQl9ESVIpOgpAQCAtMTM2LDEwICsxMzYsMTAgQEAKIAogIyBNYWtlIHRoZSBsaWJyYXJ5OgogJChUT1ApLyQoTElCX0RJUikvJChHTFVfTElCX05BTUUpOiAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMVV9MSUIpIC1saW5rZXIgJyQoQ1hYKScgXAorCSQoTUtMSUIpIC1vICQoR0xVX0xJQikgLWxpbmtlciAnJChDWFgpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChHTFVfTUFKT1IpIC1taW5vciAkKEdMVV9NSU5PUikgLXBhdGNoICQoR0xVX1RJTlkpIFwKIAkJLWNwbHVzcGx1cyAkKE1LTElCX09QVElPTlMpIC1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKLQkJLWV4cG9ydHMgZ2x1LmV4cG9ydHMgXAorCQktZXhwb3J0cyBnbHUuZXhwb3J0cyAtaWQgJChJTlNUQUxMX0xJQl9ESVIpL2xpYiQoR0xVX0xJQikuJChHTFVfTUFKT1IpLmR5bGliIFwKIAkJJChHTFVfTElCX0RFUFMpICQoT0JKRUNUUykKIAogCmRpZmYgLS1naXQgYS9zcmMvZ2x1L3NnaS9NYWtlZmlsZS5tZ3cgYi9zcmMvZ2x1L3NnaS9NYWtlZmlsZS5tZ3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwZDk3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHUvc2dpL01ha2VmaWxlLm1ndwpAQCAtMCwwICsxLDIzMCBAQAorIyBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisjIFZlcnNpb246ICA1LjEKKyMgCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDAzICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIyAKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjIAorIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyMgTWluR1cgY29yZSBtYWtlZmlsZSB2MS40IGZvciBNZXNhCisjCisjICBDb3B5cmlnaHQgKEMpIDIwMDIgLSBEYW5pZWwgQm9yY2EKKyMgIEVtYWlsIDogZGJvcmNhQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorIyAgV2ViICAgOiBodHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vZGJvcmNhCisKKyMgTWluR1cgY29yZS1nbHUgbWFrZWZpbGUgdXBkYXRlZCBmb3IgTWVzYSA3LjAKKyMKKyMgIFVwZGF0ZWQgOiBieSBIZXJvbXl0aCwgb24gMjAwNy03LTIxCisjICBFbWFpbCAgIDogenhwbXl0aEB5YWhvby5jb20uY24KKyMgIEJ1Z3MgICAgOiAxKSBBbGwgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgd29yayBmaW5lLiBCdXQgdGhlIHNldHRpbmcgWDg2PTEgY2FuJ3Qgd29yay4gCisjICAgICAgICAgICAgVGhlIG90aGVycyBoYXZuJ3QgYmVlbiB0ZXN0ZWQgeWV0LgorIyAgICAgICAgICAgIDIpIFRoZSBnZW5lcmF0ZWQgRExMcyBhcmUgKm5vdCogY29tcGF0aWJsZSB3aXRoIHRoZSBvbmVzIGJ1aWx0CisjICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgY29tcGlsZXJzIGxpa2UgVkM4LCBlc3BlY2lhbGx5IGZvciBHTFVULiAKKyMgICAgICAgICAgICAzKSBBbHRob3VnaCBtb3JlIHRlc3RzIGFyZSBuZWVkZWQsIGl0IGNhbiBiZSB1c2VkIGluZGl2aWR1YWxseSEKKworIworIyAgQXZhaWxhYmxlIG9wdGlvbnM6CisjCisjICAgIEVudmlyb25tZW50IHZhcmlhYmxlczoKKyMJQ0ZMQUdTCisjCisjCUdMSURFCQlwYXRoIHRvIEdsaWRlMyBTREs7IHVzZWQgd2l0aCBGWC4KKyMJCQlkZWZhdWx0ID0gJChUT1ApL2dsaWRlMworIwlGWD0xCQlidWlsZCBmb3IgM2RmeCBHbGlkZTMuIE5vdGUgdGhhdCB0aGlzIGRpc2FibGVzCisjCQkJY29tcGlsYXRpb24gb2YgbW9zdCBXTWVzYSBjb2RlIGFuZCByZXF1aXJlcyBmeE1lc2EuCisjCQkJQXMgYSBjb25zZXF1ZW5jZSwgeW91J2xsIG5lZWQgdGhlIFdpbjMyIEdsaWRlMworIwkJCWxpYnJhcnkgdG8gYnVpbGQgYW55IGFwcGxpY2F0aW9uLgorIwkJCWRlZmF1bHQgPSBubworIwlJQ0Q9MQkJYnVpbGQgdGhlIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgaW50ZXJmYWNlCisjCQkJKHdpbmRvd3Mgb3BlbmdsIGRyaXZlciBpbnRlcmZhY2UpCisjCQkJZGVmYXVsdCA9IG5vCisjCVg4Nj0xCQlvcHRpbWl6ZSBmb3IgeDg2IChpZiBwb3NzaWJsZSwgdXNlIE1NWCwgU1NFLCAzRE5vdykuCisjCQkJZGVmYXVsdCA9IG5vCisjCisjICAgIFRhcmdldHM6CisjCWFsbDoJCWJ1aWxkIEdMCisjCWNsZWFuOgkJcmVtb3ZlIG9iamVjdCBmaWxlcworIworCisKKworLlBIT05ZOiBhbGwgY2xlYW4KKy5JTlRFUk1FRElBVEU6IHg4Ni9nZW5fbWF0eXBlcy5leGUKKy5TVUZGSVhFUzogLnJjIC5yZXMKKworIyBTZXQgdGhpcyB0byB0aGUgcHJlZml4IG9mIHlvdXIgYnVpbGQgdG9vbHMsIGkuZS4gbWluZ3czMi0KK1RPT0xTX1BSRUZJWCA9IG1pbmd3MzItCisKK1RPUCA9IC4uLy4uLy4uCitMSUJESVIgPSAkKFRPUCkvbGliCisKK0xJQl9OQU1FID0gZ2x1MzIKK0RMTF9FWFQgPSAuZGxsCitJTVBfRVhUID0gLmEKK0xJQl9QUkUgPSBsaWIKK1NUUklQID0gLXMKKworQVIgPSBhcgorQVJGTEFHUyA9IGNydXMKK0RMTFRPT0wgPSBkbGx0b29sCisKK0dMVV9ETEwgPSAkKExJQl9OQU1FKSQoRExMX0VYVCkKK0dMVV9JTVAgPSAkKExJQl9QUkUpJChMSUJfTkFNRSkkKElNUF9FWFQpCitHTFVfREVGID0gJChMSUJfTkFNRSkuZGVmCisKK0xETElCUyA9IC1MJChMSUJESVIpIC1sb3BlbmdsMzIKK0xERkxBR1MgPSAkKFNUUklQKSAtc2hhcmVkIC1mUElDIC1XbCwtLWtpbGwtYXQKKworQ0ZMQUdTICs9IC1EQlVJTERfR0xVMzIgLURfRExMCisKKworQ0MgPSAkKFRPT0xTX1BSRUZJWClnY2MKK0NGTEFHUyArPSAtRE5ERUJVRyAtRExJQlJBUllCVUlMRCAtSSQoVE9QKS9pbmNsdWRlIC1JaW5jbHVkZQorQ1hYID0gJChUT09MU19QUkVGSVgpZysrCitDWFhGTEFHUyA9ICQoQ0ZMQUdTKSAtSWxpYm51cmJzL2ludGVybmFscyAtSWxpYm51cmJzL2ludGVyZmFjZSAtSWxpYm51cmJzL251cmJ0ZXNzCisKK0FSID0gYXIKK0FSRkxBR1MgPSBjcnVzCisKK1VOTElOSyA9IGRlbCAkKHN1YnN0IC8sXCwkKDEpKQoraWZuZXEgKCQod2lsZGNhcmQgJChhZGRzdWZmaXggL3JtLmV4ZSwkKHN1YnN0IDssICwkKFBBVEgpKSkpLCkKK1VOTElOSyA9ICQoUk0pICQoMSkKK2VuZGlmCitpZm5lcSAoJCh3aWxkY2FyZCAkKGFkZHN1ZmZpeCAvcm0sJChzdWJzdCA6LCAsJChQQVRIKSkpKSwpCitVTkxJTksgPSAkKFJNKSAkKDEpCitlbmRpZgorCitDX1NPVVJDRVMgPSBcCisJbGlidXRpbC9lcnJvci5jIFwKKwlsaWJ1dGlsL2dsdWUuYyBcCisJbGlidXRpbC9taXBtYXAuYyBcCisJbGlidXRpbC9wcm9qZWN0LmMgXAorCWxpYnV0aWwvcXVhZC5jIFwKKwlsaWJ1dGlsL3JlZ2lzdHJ5LmMgXAorCWxpYnRlc3MvZGljdC5jIFwKKwlsaWJ0ZXNzL2dlb20uYyBcCisJbGlidGVzcy9tZW1hbGxvYy5jIFwKKwlsaWJ0ZXNzL21lc2guYyBcCisJbGlidGVzcy9ub3JtYWwuYyBcCisJbGlidGVzcy9wcmlvcml0eXEuYyBcCisJbGlidGVzcy9yZW5kZXIuYyBcCisJbGlidGVzcy9zd2VlcC5jIFwKKwlsaWJ0ZXNzL3Rlc3MuYyBcCisJbGlidGVzcy90ZXNzbW9uby5jCisKK0NDX1NPVVJDRVMgPSBcCisJbGlibnVyYnMvaW50ZXJmYWNlL2JlemllckV2YWwuY2MgXAorCWxpYm51cmJzL2ludGVyZmFjZS9iZXppZXJQYXRjaC5jYyBcCisJbGlibnVyYnMvaW50ZXJmYWNlL2JlemllclBhdGNoTWVzaC5jYyBcCisJbGlibnVyYnMvaW50ZXJmYWNlL2dsY3VydmV2YWwuY2MgXAorCWxpYm51cmJzL2ludGVyZmFjZS9nbGludGVyZmFjZS5jYyBcCisJbGlibnVyYnMvaW50ZXJmYWNlL2dscmVuZGVyZXIuY2MgXAorCWxpYm51cmJzL2ludGVyZmFjZS9nbHN1cmZldmFsLmNjIFwKKwlsaWJudXJicy9pbnRlcmZhY2UvaW5jdXJ2ZWV2YWwuY2MgXAorCWxpYm51cmJzL2ludGVyZmFjZS9pbnN1cmZldmFsLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvYXJjLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvYXJjc29ydGVyLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvYXJjdGVzcy5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL2JhY2tlbmQuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9iYXNpY2NydmV2YWwuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9iYXNpY3N1cmZldmFsLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvYmluLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvYnVmcG9vbC5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL2NhY2hpbmdldmFsLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvY2N3LmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvY292ZWFuZHRpbGVyLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvY3VydmUuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9jdXJ2ZWxpc3QuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9jdXJ2ZXN1Yi5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL2RhdGFUcmFuc2Zvcm0uY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9kaXNwbGF5bGlzdC5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL2ZsaXN0LmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvZmxpc3Rzb3J0ZXIuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9odWxsLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvaW50ZXJzZWN0LmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMva25vdHZlY3Rvci5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL21hcGRlc2MuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9tYXBkZXNjdi5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL21hcGxpc3QuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9tZXNoZXIuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9tb25vVHJpYW5ndWxhdGlvbkJhY2tlbmQuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9tb25vdG9uaXplci5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL215Y29kZS5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL251cmJzaW50ZXJmYWMuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9udXJic3Rlc3MuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9wYXRjaC5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL3BhdGNobGlzdC5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL3F1aWx0LmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvcmVhZGVyLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvcmVuZGVyaGludHMuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9zbGljZXIuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9zb3J0ZXIuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9zcGxpdGFyY3MuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy9zdWJkaXZpZGVyLmNjIFwKKwlsaWJudXJicy9pbnRlcm5hbHMvdG9iZXppZXIuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy90cmltbGluZS5jYyBcCisJbGlibnVyYnMvaW50ZXJuYWxzL3RyaW1yZWdpb24uY2MgXAorCWxpYm51cmJzL2ludGVybmFscy90cmltdmVydHBvb2wuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy91YXJyYXkuY2MgXAorCWxpYm51cmJzL2ludGVybmFscy92YXJyYXkuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL2RpcmVjdGVkTGluZS5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvZ3JpZFdyYXAuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL21vbm9DaGFpbi5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvbW9ub1BvbHlQYXJ0LmNjIFwKKwlsaWJudXJicy9udXJidGVzcy9tb25vVHJpYW5ndWxhdGlvbi5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvcGFydGl0aW9uWC5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvcGFydGl0aW9uWS5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvcG9seURCRy5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvcG9seVV0aWwuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL3ByaW1pdGl2ZVN0cmVhbS5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3MvcXVpY2tzb3J0LmNjIFwKKwlsaWJudXJicy9udXJidGVzcy9yZWN0QmxvY2suY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL3NhbXBsZUNvbXAuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL3NhbXBsZUNvbXBCb3QuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL3NhbXBsZUNvbXBSaWdodC5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3Mvc2FtcGxlQ29tcFRvcC5jYyBcCisJbGlibnVyYnMvbnVyYnRlc3Mvc2FtcGxlTW9ub1BvbHkuY2MgXAorCWxpYm51cmJzL251cmJ0ZXNzL3NhbXBsZWRMaW5lLmNjIFwKKwlsaWJudXJicy9udXJidGVzcy9zZWFyY2hUcmVlLmNjCisKK1NPVVJDRVMgPSAkKENfU09VUkNFUykgJChDQ19TT1VSQ0VTKQorCitPQkpFQ1RTID0gJChhZGRzdWZmaXggLm8sJChiYXNlbmFtZSAkKFNPVVJDRVMpKSkKKworLmMubzoKKwkkKENDKSAtbyAkQCAkKENGTEFHUykgLWMgJDwKKy5jYy5vOgorCSQoQ1hYKSAtbyAkQCAkKENYWEZMQUdTKSAtYyAkPAorCisKK2FsbDogJChMSUJESVIpICQoTElCRElSKS8kKEdMVV9ETEwpICQoTElCRElSKS8kKEdMVV9JTVApCisKKyQoTElCRElSKToKKwlta2RpciAtcCAkKExJQkRJUikKKworJChMSUJESVIpLyQoR0xVX0RMTCkgJChMSUJESVIpLyQoR0xVX0lNUCk6ICQoT0JKRUNUUykKKwkkKENYWCkgJChMREZMQUdTKSAtbyAkKExJQkRJUikvJChHTFVfRExMKSAkXiAkKExETElCUykKKwkkKERMTFRPT0wpIC0tYXM9YXMgLS1kbGxuYW1lICQoTElCX05BTUUpIC0tb3V0cHV0LWRlZiAkKExJQkRJUikvJChHTFVfREVGKSAkXgorCSQoRExMVE9PTCkgLS1hcz1hcyAtayAtLWRsbG5hbWUgJChMSUJfTkFNRSkgLS1vdXRwdXQtbGliICQoTElCRElSKS8kKEdMVV9JTVApIC0tZGVmICQoTElCRElSKS8kKEdMVV9ERUYpCisKKworY2xlYW46CisJLSQoY2FsbCBVTkxJTkssbGlidXRpbC8qLm8pCisJLSQoY2FsbCBVTkxJTkssbGlidGVzcy8qLm8pCisJLSQoY2FsbCBVTkxJTkssbGlibnVyYnMvaW50ZXJmYWNlLyoubykKKwktJChjYWxsIFVOTElOSyxsaWJudXJicy9pbnRlcm5hbHMvKi5vKQorCS0kKGNhbGwgVU5MSU5LLGxpYm51cmJzL251cmJ0ZXNzLyoubykKZGlmZiAtLWdpdCBhL3NyYy9nbHUvc2dpL2dsdS5leHBvcnRzLmRhcndpbiBiL3NyYy9nbHUvc2dpL2dsdS5leHBvcnRzLmRhcndpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQyMGFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsdS9zZ2kvZ2x1LmV4cG9ydHMuZGFyd2luCkBAIC0wLDAgKzEsNTkgQEAKK19nbHVCZWdpbkN1cnZlCitfZ2x1QmVnaW5Qb2x5Z29uCitfZ2x1QmVnaW5TdXJmYWNlCitfZ2x1QmVnaW5UcmltCitfZ2x1QnVpbGQxRE1pcG1hcExldmVscworX2dsdUJ1aWxkMURNaXBtYXBzCitfZ2x1QnVpbGQyRE1pcG1hcExldmVscworX2dsdUJ1aWxkMkRNaXBtYXBzCitfZ2x1QnVpbGQzRE1pcG1hcExldmVscworX2dsdUJ1aWxkM0RNaXBtYXBzCitfZ2x1Q2hlY2tFeHRlbnNpb24KK19nbHVDeWxpbmRlcgorX2dsdURlbGV0ZU51cmJzUmVuZGVyZXIKK19nbHVEZWxldGVRdWFkcmljCitfZ2x1RGVsZXRlVGVzcworX2dsdURpc2sKK19nbHVFbmRDdXJ2ZQorX2dsdUVuZFBvbHlnb24KK19nbHVFbmRTdXJmYWNlCitfZ2x1RW5kVHJpbQorX2dsdUVycm9yU3RyaW5nCitfZ2x1R2V0TnVyYnNQcm9wZXJ0eQorX2dsdUdldFN0cmluZworX2dsdUdldFRlc3NQcm9wZXJ0eQorX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzCitfZ2x1TG9va0F0CitfZ2x1TmV3TnVyYnNSZW5kZXJlcgorX2dsdU5ld1F1YWRyaWMKK19nbHVOZXdUZXNzCitfZ2x1TmV4dENvbnRvdXIKK19nbHVOdXJic0NhbGxiYWNrCitfZ2x1TnVyYnNDYWxsYmFja0RhdGEKK19nbHVOdXJic0NhbGxiYWNrRGF0YUVYVAorX2dsdU51cmJzQ3VydmUKK19nbHVOdXJic1Byb3BlcnR5CitfZ2x1TnVyYnNTdXJmYWNlCitfZ2x1T3J0aG8yRAorX2dsdVBhcnRpYWxEaXNrCitfZ2x1UGVyc3BlY3RpdmUKK19nbHVQaWNrTWF0cml4CitfZ2x1UHJvamVjdAorX2dsdVB3bEN1cnZlCitfZ2x1UXVhZHJpY0NhbGxiYWNrCitfZ2x1UXVhZHJpY0RyYXdTdHlsZQorX2dsdVF1YWRyaWNOb3JtYWxzCitfZ2x1UXVhZHJpY09yaWVudGF0aW9uCitfZ2x1UXVhZHJpY1RleHR1cmUKK19nbHVTY2FsZUltYWdlCitfZ2x1U3BoZXJlCitfZ2x1VGVzc0JlZ2luQ29udG91cgorX2dsdVRlc3NCZWdpblBvbHlnb24KK19nbHVUZXNzQ2FsbGJhY2sKK19nbHVUZXNzRW5kQ29udG91cgorX2dsdVRlc3NFbmRQb2x5Z29uCitfZ2x1VGVzc05vcm1hbAorX2dsdVRlc3NQcm9wZXJ0eQorX2dsdVRlc3NWZXJ0ZXgKK19nbHVVblByb2plY3QKK19nbHVVblByb2plY3Q0CmRpZmYgLS1naXQgYS9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcmZhY2UvYmV6aWVyUGF0Y2guY2MgYi9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcmZhY2UvYmV6aWVyUGF0Y2guY2MKaW5kZXggZmExZGFlZC4uZGJhYjNhMSAxMDA2NDQKLS0tIGEvc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJmYWNlL2JlemllclBhdGNoLmNjCisrKyBiL3NyYy9nbHUvc2dpL2xpYm51cmJzL2ludGVyZmFjZS9iZXppZXJQYXRjaC5jYwpAQCAtMTA5LDggKzEwOSwxMSBAQAogdm9pZCBiZXppZXJQYXRjaERlbGV0ZUxpc3QoYmV6aWVyUGF0Y2ggKmIpCiB7CiAgIGJlemllclBhdGNoICp0ZW1wOwotICBmb3IodGVtcCA9IGI7IHRlbXAgIT0gTlVMTDsgdGVtcCA9IHRlbXAtPm5leHQpCi0gICAgYmV6aWVyUGF0Y2hEZWxldGUodGVtcCk7CisgIHdoaWxlIChiICE9IE5VTEwpIHsKKyAgICB0ZW1wID0gYjsKKyAgICBiID0gYi0+bmV4dDsKKyAgICBiZXppZXJQYXRjaERlbGV0ZSh0ZW1wKTsgICAgCisgIH0KIH0KIAogYmV6aWVyUGF0Y2gqIGJlemllclBhdGNoSW5zZXJ0KGJlemllclBhdGNoICpsaXN0LCBiZXppZXJQYXRjaCAqYikKZGlmZiAtLWdpdCBhL3NyYy9nbHUvc2dpL2xpYm51cmJzL2ludGVyZmFjZS9pbnN1cmZldmFsLmNjIGIvc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJmYWNlL2luc3VyZmV2YWwuY2MKaW5kZXggNzhkOGJlYy4uOWQwYzgyYSAxMDA2NDQKLS0tIGEvc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJmYWNlL2luc3VyZmV2YWwuY2MKKysrIGIvc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJmYWNlL2luc3VyZmV2YWwuY2MKQEAgLTE1MzEsOCArMTUzMSw4IEBACiAgICAgfQogICAvL2NsZWFuIHVwIAogICBmcmVlKGxlZnRYWVopOwotICBmcmVlKGxlZnRYWVopOwotICBmcmVlKHJpZ2h0Tm9ybWFsKTsKKyAgZnJlZShyaWdodFhZWik7CisgIGZyZWUobGVmdE5vcm1hbCk7CiAgIGZyZWUocmlnaHROb3JtYWwpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvZ2x1L3NnaS9saWJ1dGlsL2Vycm9yLmMgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL2Vycm9yLmMKaW5kZXggMjRkOGI3MC4uNGUwNWYyYSAxMDA2NDQKLS0tIGEvc3JjL2dsdS9zZ2kvbGlidXRpbC9lcnJvci5jCisrKyBiL3NyYy9nbHUvc2dpL2xpYnV0aWwvZXJyb3IuYwpAQCAtODAsNyArODAsNyBAQAogICAgIGlmICgoZXJyb3JDb2RlID49IEdMVV9OVVJCU19FUlJPUjEpICYmIChlcnJvckNvZGUgPD0gR0xVX05VUkJTX0VSUk9SMzcpKSB7CiAJcmV0dXJuIChjb25zdCBHTHVieXRlICopIF9fZ2x1TlVSQlNFcnJvclN0cmluZyhlcnJvckNvZGUgLSAoR0xVX05VUkJTX0VSUk9SMSAtIDEpKTsKICAgICB9Ci0gICAgaWYgKChlcnJvckNvZGUgPj0gR0xVX1RFU1NfRVJST1IxKSAmJiAoZXJyb3JDb2RlIDw9IEdMVV9URVNTX0VSUk9SOCkpIHsKKyAgICBpZiAoKGVycm9yQ29kZSA+PSBHTFVfVEVTU19FUlJPUjEpICYmIChlcnJvckNvZGUgPD0gR0xVX1RFU1NfRVJST1I2KSkgewogCXJldHVybiAoY29uc3QgR0x1Ynl0ZSAqKSBfX2dsdVRlc3NFcnJvclN0cmluZyhlcnJvckNvZGUgLSAoR0xVX1RFU1NfRVJST1IxIC0gMSkpOwogICAgIH0KICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUgKikgMDsKZGlmZiAtLWdpdCBhL3NyYy9nbHUvc2dpL2xpYnV0aWwvbWlwbWFwLmMgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL21pcG1hcC5jCmluZGV4IDQ0ZjUxOWEuLmQ2NWI3ZjYgMTAwNjQ0Ci0tLSBhL3NyYy9nbHUvc2dpL2xpYnV0aWwvbWlwbWFwLmMKKysrIGIvc3JjL2dsdS9zZ2kvbGlidXRpbC9taXBtYXAuYwpAQCAtNjYyNyw3ICs2NjI3LDcgQEAKIAogc3RhdGljIFRleEltYWdlM0Rwcm9jIHBUZXhJbWFnZTNEID0gMDsKIAotI2lmbmRlZiBfV0lOMzIKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fV0lOMzJfXykKICMgIGluY2x1ZGUgPGRsZmNuLmg+CiAjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNlbHNlCkBAIC02NjQyLDcgKzY2NDIsNyBAQAogCQkJICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKQogewogICAgaWYgKCFwVGV4SW1hZ2UzRCkgewotI2lmZGVmIF9XSU4zMgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKICAgICAgIHBUZXhJbWFnZTNEID0gKFRleEltYWdlM0Rwcm9jKSB3Z2xHZXRQcm9jQWRkcmVzcygiZ2xUZXhJbWFnZTNEIik7CiAgICAgICBpZiAoIXBUZXhJbWFnZTNEKQogCSBwVGV4SW1hZ2UzRCA9IChUZXhJbWFnZTNEcHJvYykgd2dsR2V0UHJvY0FkZHJlc3MoImdsVGV4SW1hZ2UzREVYVCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2dsdS9zZ2kvbGlidXRpbC9wcm9qZWN0LmMgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL3Byb2plY3QuYwppbmRleCA1YmEzOTZjLi43ZDc4NjAzIDEwMDY0NAotLS0gYS9zcmMvZ2x1L3NnaS9saWJ1dGlsL3Byb2plY3QuYworKysgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL3Byb2plY3QuYwpAQCAtMTY2LDc0ICsxNjYsNTcgQEAKIH0KIAogLyoKLSoqIGludmVyc2UgPSBpbnZlcnQoc3JjKQotKiogTmV3LCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gYnkgU2hhbiBIYW8gQm8sIEFwcmlsIDIwMDYuCisqKiBJbnZlcnQgNHg0IG1hdHJpeC4KKyoqIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vb3JlIChTZWUgTWVzYSBidWcgIzY3NDgpCiAqLwotc3RhdGljIGludCBfX2dsdUludmVydE1hdHJpeGQoY29uc3QgR0xkb3VibGUgc3JjWzE2XSwgR0xkb3VibGUgaW52ZXJzZVsxNl0pCitzdGF0aWMgaW50IF9fZ2x1SW52ZXJ0TWF0cml4ZChjb25zdCBHTGRvdWJsZSBtWzE2XSwgR0xkb3VibGUgaW52T3V0WzE2XSkKIHsKLQlpbnQgaSwgaiwgazsKLQlkb3VibGUgdDsKLQlHTGRvdWJsZSB0ZW1wWzRdWzRdOwotCSAKLQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKLQkJZm9yIChqPTA7IGo8NDsgaisrKSB7Ci0JCSAgICB0ZW1wW2ldW2pdID0gc3JjW2kqNCtqXTsKLQkJfQotCX0KLQlfX2dsdU1ha2VJZGVudGl0eWQoaW52ZXJzZSk7Ci0JCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpZiAodGVtcFtpXVtpXSA9PSAwLjBmKSB7Ci0JCSAgICAvKgotCQkgICAgKiogTG9vayBmb3Igbm9uLXplcm8gZWxlbWVudCBpbiBjb2x1bW4KLQkJICAgICovCi0JCSAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7IGorKykgewotCQkJCWlmICh0ZW1wW2pdW2ldICE9IDAuMGYpIHsKLQkJCQkgICAgYnJlYWs7Ci0JCQkJfQotCQkgICAgfQotCQkKLQkJICAgIGlmIChqICE9IDQpIHsKLQkJCQkvKgotCQkJCSAqKiBTd2FwIHJvd3MuCi0JCQkJICovCi0JCQkJZm9yIChrID0gMDsgayA8IDQ7IGsrKykgewotCQkJCSAgICB0ID0gdGVtcFtpXVtrXTsKLQkJCQkgICAgdGVtcFtpXVtrXSA9IHRlbXBbal1ba107Ci0JCQkJICAgIHRlbXBbal1ba10gPSB0OwotCQkJCi0JCQkJICAgIHQgPSBpbnZlcnNlW2kqNCtrXTsKLQkJCQkgICAgaW52ZXJzZVtpKjQra10gPSBpbnZlcnNlW2oqNCtrXTsKLQkJCQkgICAgaW52ZXJzZVtqKjQra10gPSB0OwotCQkJCX0KLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJCS8qCi0JCQkJKiogTm8gbm9uLXplcm8gcGl2b3QuICBUaGUgbWF0cml4IGlzIHNpbmd1bGFyLCAKLXdoaWNoIHNob3VsZG4ndAotCQkJCSoqIGhhcHBlbi4gIFRoaXMgbWVhbnMgdGhlIHVzZXIgZ2F2ZSB1cyBhIGJhZCAKLW1hdHJpeC4KLQkJCQkqLwotCQkJCXJldHVybiBHTF9GQUxTRTsKLQkJICAgIH0KLQkJfQotCQkKLQkJdCA9IDEuMGYgLyB0ZW1wW2ldW2ldOwotCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCSAgICB0ZW1wW2ldW2tdICo9IHQ7Ci0JCSAgICBpbnZlcnNlW2kqNCtrXSAqPSB0OwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJICAgIGlmIChqICE9IGkpIHsKLQkJCQl0ID0gdGVtcFtqXVtpXTsKLQkJCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCQkJCSAgICB0ZW1wW2pdW2tdIC09IHRlbXBbaV1ba10qdDsKLQkJCQkJICAgIGludmVyc2Vbaio0K2tdIC09IGludmVyc2VbaSo0K2tdKnQ7Ci0JCQkJfQotCQkgICAgfQotCQl9Ci0JfQotCXJldHVybiBHTF9UUlVFOworICAgIGRvdWJsZSBpbnZbMTZdLCBkZXQ7CisgICAgaW50IGk7CisKKyAgICBpbnZbMF0gPSAgIG1bNV0qbVsxMF0qbVsxNV0gLSBtWzVdKm1bMTFdKm1bMTRdIC0gbVs5XSptWzZdKm1bMTVdCisgICAgICAgICAgICAgKyBtWzldKm1bN10qbVsxNF0gKyBtWzEzXSptWzZdKm1bMTFdIC0gbVsxM10qbVs3XSptWzEwXTsKKyAgICBpbnZbNF0gPSAgLW1bNF0qbVsxMF0qbVsxNV0gKyBtWzRdKm1bMTFdKm1bMTRdICsgbVs4XSptWzZdKm1bMTVdCisgICAgICAgICAgICAgLSBtWzhdKm1bN10qbVsxNF0gLSBtWzEyXSptWzZdKm1bMTFdICsgbVsxMl0qbVs3XSptWzEwXTsKKyAgICBpbnZbOF0gPSAgIG1bNF0qbVs5XSptWzE1XSAtIG1bNF0qbVsxMV0qbVsxM10gLSBtWzhdKm1bNV0qbVsxNV0KKyAgICAgICAgICAgICArIG1bOF0qbVs3XSptWzEzXSArIG1bMTJdKm1bNV0qbVsxMV0gLSBtWzEyXSptWzddKm1bOV07CisgICAgaW52WzEyXSA9IC1tWzRdKm1bOV0qbVsxNF0gKyBtWzRdKm1bMTBdKm1bMTNdICsgbVs4XSptWzVdKm1bMTRdCisgICAgICAgICAgICAgLSBtWzhdKm1bNl0qbVsxM10gLSBtWzEyXSptWzVdKm1bMTBdICsgbVsxMl0qbVs2XSptWzldOworICAgIGludlsxXSA9ICAtbVsxXSptWzEwXSptWzE1XSArIG1bMV0qbVsxMV0qbVsxNF0gKyBtWzldKm1bMl0qbVsxNV0KKyAgICAgICAgICAgICAtIG1bOV0qbVszXSptWzE0XSAtIG1bMTNdKm1bMl0qbVsxMV0gKyBtWzEzXSptWzNdKm1bMTBdOworICAgIGludls1XSA9ICAgbVswXSptWzEwXSptWzE1XSAtIG1bMF0qbVsxMV0qbVsxNF0gLSBtWzhdKm1bMl0qbVsxNV0KKyAgICAgICAgICAgICArIG1bOF0qbVszXSptWzE0XSArIG1bMTJdKm1bMl0qbVsxMV0gLSBtWzEyXSptWzNdKm1bMTBdOworICAgIGludls5XSA9ICAtbVswXSptWzldKm1bMTVdICsgbVswXSptWzExXSptWzEzXSArIG1bOF0qbVsxXSptWzE1XQorICAgICAgICAgICAgIC0gbVs4XSptWzNdKm1bMTNdIC0gbVsxMl0qbVsxXSptWzExXSArIG1bMTJdKm1bM10qbVs5XTsKKyAgICBpbnZbMTNdID0gIG1bMF0qbVs5XSptWzE0XSAtIG1bMF0qbVsxMF0qbVsxM10gLSBtWzhdKm1bMV0qbVsxNF0KKyAgICAgICAgICAgICArIG1bOF0qbVsyXSptWzEzXSArIG1bMTJdKm1bMV0qbVsxMF0gLSBtWzEyXSptWzJdKm1bOV07CisgICAgaW52WzJdID0gICBtWzFdKm1bNl0qbVsxNV0gLSBtWzFdKm1bN10qbVsxNF0gLSBtWzVdKm1bMl0qbVsxNV0KKyAgICAgICAgICAgICArIG1bNV0qbVszXSptWzE0XSArIG1bMTNdKm1bMl0qbVs3XSAtIG1bMTNdKm1bM10qbVs2XTsKKyAgICBpbnZbNl0gPSAgLW1bMF0qbVs2XSptWzE1XSArIG1bMF0qbVs3XSptWzE0XSArIG1bNF0qbVsyXSptWzE1XQorICAgICAgICAgICAgIC0gbVs0XSptWzNdKm1bMTRdIC0gbVsxMl0qbVsyXSptWzddICsgbVsxMl0qbVszXSptWzZdOworICAgIGludlsxMF0gPSAgbVswXSptWzVdKm1bMTVdIC0gbVswXSptWzddKm1bMTNdIC0gbVs0XSptWzFdKm1bMTVdCisgICAgICAgICAgICAgKyBtWzRdKm1bM10qbVsxM10gKyBtWzEyXSptWzFdKm1bN10gLSBtWzEyXSptWzNdKm1bNV07CisgICAgaW52WzE0XSA9IC1tWzBdKm1bNV0qbVsxNF0gKyBtWzBdKm1bNl0qbVsxM10gKyBtWzRdKm1bMV0qbVsxNF0KKyAgICAgICAgICAgICAtIG1bNF0qbVsyXSptWzEzXSAtIG1bMTJdKm1bMV0qbVs2XSArIG1bMTJdKm1bMl0qbVs1XTsKKyAgICBpbnZbM10gPSAgLW1bMV0qbVs2XSptWzExXSArIG1bMV0qbVs3XSptWzEwXSArIG1bNV0qbVsyXSptWzExXQorICAgICAgICAgICAgIC0gbVs1XSptWzNdKm1bMTBdIC0gbVs5XSptWzJdKm1bN10gKyBtWzldKm1bM10qbVs2XTsKKyAgICBpbnZbN10gPSAgIG1bMF0qbVs2XSptWzExXSAtIG1bMF0qbVs3XSptWzEwXSAtIG1bNF0qbVsyXSptWzExXQorICAgICAgICAgICAgICsgbVs0XSptWzNdKm1bMTBdICsgbVs4XSptWzJdKm1bN10gLSBtWzhdKm1bM10qbVs2XTsKKyAgICBpbnZbMTFdID0gLW1bMF0qbVs1XSptWzExXSArIG1bMF0qbVs3XSptWzldICsgbVs0XSptWzFdKm1bMTFdCisgICAgICAgICAgICAgLSBtWzRdKm1bM10qbVs5XSAtIG1bOF0qbVsxXSptWzddICsgbVs4XSptWzNdKm1bNV07CisgICAgaW52WzE1XSA9ICBtWzBdKm1bNV0qbVsxMF0gLSBtWzBdKm1bNl0qbVs5XSAtIG1bNF0qbVsxXSptWzEwXQorICAgICAgICAgICAgICsgbVs0XSptWzJdKm1bOV0gKyBtWzhdKm1bMV0qbVs2XSAtIG1bOF0qbVsyXSptWzVdOworCisgICAgZGV0ID0gbVswXSppbnZbMF0gKyBtWzFdKmludls0XSArIG1bMl0qaW52WzhdICsgbVszXSppbnZbMTJdOworICAgIGlmIChkZXQgPT0gMCkKKyAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICAgZGV0ID0gMS4wIC8gZGV0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGludk91dFtpXSA9IGludltpXSAqIGRldDsKKworICAgIHJldHVybiBHTF9UUlVFOwogfQogCiBzdGF0aWMgdm9pZCBfX2dsdU11bHRNYXRyaWNlc2QoY29uc3QgR0xkb3VibGUgYVsxNl0sIGNvbnN0IEdMZG91YmxlIGJbMTZdLApkaWZmIC0tZ2l0IGEvc3JjL2dsdS9zZ2kvbGlidXRpbC9xdWFkLmMgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL3F1YWQuYwppbmRleCBlNjA0NTM5Li4xYWU3NDQyIDEwMDY0NAotLS0gYS9zcmMvZ2x1L3NnaS9saWJ1dGlsL3F1YWQuYworKysgYi9zcmMvZ2x1L3NnaS9saWJ1dGlsL3F1YWQuYwpAQCAtNzEzLDggKzcxMyw4IEBACiAgICAgR0xmbG9hdCBjb3NDYWNoZTNiW0NBQ0hFX1NJWkVdOwogICAgIEdMZmxvYXQgYW5nbGU7CiAgICAgR0xmbG9hdCB6TG93LCB6SGlnaDsKLSAgICBHTGZsb2F0IHNpbnRlbXAxLCBzaW50ZW1wMiwgc2ludGVtcDMgPSAwLjAsIHNpbnRlbXA0ID0gMC4wOwotICAgIEdMZmxvYXQgY29zdGVtcDEsIGNvc3RlbXAyID0gMC4wLCBjb3N0ZW1wMyA9IDAuMCwgY29zdGVtcDQgPSAwLjA7CisgICAgR0xmbG9hdCBzaW50ZW1wMSA9IDAuMCwgc2ludGVtcDIgPSAwLjAsIHNpbnRlbXAzID0gMC4wLCBzaW50ZW1wNCA9IDAuMDsKKyAgICBHTGZsb2F0IGNvc3RlbXAxID0gMC4wLCBjb3N0ZW1wMiA9IDAuMCwgY29zdGVtcDMgPSAwLjAsIGNvc3RlbXA0ID0gMC4wOwogICAgIEdMYm9vbGVhbiBuZWVkQ2FjaGUyLCBuZWVkQ2FjaGUzOwogICAgIEdMaW50IHN0YXJ0LCBmaW5pc2g7CiAKZGlmZiAtLWdpdCBhL3NyYy9nbHV0L2Jlb3MvTWFrZWZpbGUgYi9zcmMvZ2x1dC9iZW9zL01ha2VmaWxlCmluZGV4IGE3YmE1MTIuLmE5Zjg2ODQgMTAwNjQ0Ci0tLSBhL3NyYy9nbHV0L2Jlb3MvTWFrZWZpbGUKKysrIGIvc3JjL2dsdXQvYmVvcy9NYWtlZmlsZQpAQCAtODMsOSArODMsMTAgQEAKIAogIyBNYWtlIHRoZSBsaWJyYXJ5CiAkKFRPUCkvJChMSUJfRElSKS8kKEdMVVRfTElCX05BTUUpOiBkZXBlbmQgJChPQkpFQ1RTKQotCUAkKFRPUCkvYmluL21rbGliIC1vICQoR0xVVF9MSUIpIC1tYWpvciAkKEdMVVRfTUFKT1IpIC1taW5vciAkKEdMVVRfTUlOT1IpIC1wYXRjaCAkKEdMVVRfVElOWSkgXAotCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAkKE1LTElCX09QVElPTlMpICQoR0xVVF9MSUJfREVQUykgXAotCQkkKE9CSkVDVFMpCisJQCQoTUtMSUIpIC1vICQoR0xVVF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAorCQktbWFqb3IgJChHTFVUX01BSk9SKSAtbWlub3IgJChHTFVUX01JTk9SKSAtcGF0Y2ggJChHTFVUX1RJTlkpIFwKKwkJLWluc3RhbGwgJChUT1ApLyQoTElCX0RJUikgJChNS0xJQl9PUFRJT05TKSBcCisJCSQoR0xVVF9MSUJfREVQUykgJChPQkpFQ1RTKQogCiBjbGVhbjoKIAktcm0gLWYgKi5vCmRpZmYgLS1naXQgYS9zcmMvZ2x1dC9kaXJlY3RmYi9NYWtlZmlsZSBiL3NyYy9nbHV0L2RpcmVjdGZiL01ha2VmaWxlCmluZGV4IGU4ODFiOGEuLmJmOTNkNjMgMTAwNjQ0Ci0tLSBhL3NyYy9nbHV0L2RpcmVjdGZiL01ha2VmaWxlCisrKyBiL3NyYy9nbHV0L2RpcmVjdGZiL01ha2VmaWxlCkBAIC02MSw3ICs2MSw3IEBACiAKICMgTWFrZSB0aGUgbGlicmFyeQogJChUT1ApLyQoTElCX0RJUikvJChHTFVUX0xJQl9OQU1FKTogZGVwZW5kICQoT0JKRUNUUykKLQkkKFRPUCkvYmluL21rbGliIC1vICQoR0xVVF9MSUIpIC1saW5rZXIgJyQoQ0MpJyBcCisJJChNS0xJQikgLW8gJChHTFVUX0xJQikgLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCiAJCS1tYWpvciAkKEdMVVRfTUFKT1IpIC1taW5vciAkKEdMVVRfTUlOT1IpIC1wYXRjaCAkKEdMVVRfVElOWSkgXAogCQkkKEdMVVRfTElCX0RFUFMpIC1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKIAkJJChNS0xJQl9PUFRJT05TKSAkKE9CSkVDVFMpCkBAIC04MSw3ICs4MSw3IEBACiAKICMgUmVtb3ZlIC5vIGFuZCBiYWNrdXAgZmlsZXMKIGNsZWFuOiBkZXBlbmQKLQktcm0gLWYgZGVwZW5kCisJLXJtIC1mIGRlcGVuZCBkZXBlbmQuYmFrCiAJLXJtIC1mICoubyAqfiAqLm8gKn4gKi5zbyBsaWJnbHV0LnNvLjMuNwogCiBpbmNsdWRlIGRlcGVuZApkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZGlyZWN0ZmIvY2FsbGJhY2suYyBiL3NyYy9nbHV0L2RpcmVjdGZiL2NhbGxiYWNrLmMKaW5kZXggNGYyMzQ0MS4uN2M5NzY4YSAxMDA2NDQKLS0tIGEvc3JjL2dsdXQvZGlyZWN0ZmIvY2FsbGJhY2suYworKysgYi9zcmMvZ2x1dC9kaXJlY3RmYi9jYWxsYmFjay5jCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICAgZ2V0dGltZW9mZGF5KCAmbm93LCBOVUxMICk7CiAgICAgIAogICAgICAqcmV0X21zZWMgPSAodGltZS0+dHZfc2VjICAtIG5vdy50dl9zZWMpICogMTAwMCArCi0gICAgICAgICAgICAgICAgICh0aW1lLT50dl91c2VjIC0gbm93LnR2X3VzZWMgKyA1MDApIC8gMTAwMDsKKyAgICAgICAgICAgICAgICAgKHRpbWUtPnR2X3VzZWMgLSBub3cudHZfdXNlYyArIDk5OSkgLyAxMDAwOwogICAgICAgICAgICAgICAgICAKICAgICAgcmV0dXJuIEdMX1RSVUU7CiB9CmRpZmYgLS1naXQgYS9zcmMvZ2x1dC9kaXJlY3RmYi9pbnRlcm5hbC5oIGIvc3JjL2dsdXQvZGlyZWN0ZmIvaW50ZXJuYWwuaAppbmRleCA0NzMxMWM5Li41NWM0YjVjIDEwMDY0NAotLS0gYS9zcmMvZ2x1dC9kaXJlY3RmYi9pbnRlcm5hbC5oCisrKyBiL3NyYy9nbHV0L2RpcmVjdGZiL2ludGVybmFsLmgKQEAgLTYyLDYgKzYyLDkgQEAKICAgICAgSURpcmVjdEZCU3VyZmFjZSAgICAgICpzdXJmYWNlOwogICAgICBJRGlyZWN0RkJHTCAgICAgICAgICAgKmdsOwogCisgICAgIC8qIGRpc3BsYXkgbW9kZSAqLworICAgICBHTGVudW0gICAgICAgICAgICAgICAgIG1vZGU7CisKICAgICAgLyogY3Vyc29yIHBvc2l0aW9uIGluIGZ1bGxzY3JlZW4gbW9kZSAqLwogICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGN4OwogICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGN5OwpkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZGlyZWN0ZmIvd2luZG93LmMgYi9zcmMvZ2x1dC9kaXJlY3RmYi93aW5kb3cuYwppbmRleCBjODE3NGQ3Li42MmNmOGJiIDEwMDY0NAotLS0gYS9zcmMvZ2x1dC9kaXJlY3RmYi93aW5kb3cuYworKysgYi9zcmMvZ2x1dC9kaXJlY3RmYi93aW5kb3cuYwpAQCAtNjYsNiArNjYsOSBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBpeGVsZm9ybWF0ID0gRFNQRl9SR0IzMzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBpeGVsZm9ybWF0ID0gRFNQRl9BUkdCNDQ0NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGl4ZWxmb3JtYXQgPSBEU1BGX0FSR0IxNTU1OwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA5LDcgKzExMiw3IEBACiAgICAgICAgICAgaWYgKGpveXN0aWNrKQogICAgICAgICAgICAgICAgam95c3RpY2stPkF0dGFjaEV2ZW50QnVmZmVyKCBqb3lzdGljaywgZXZlbnRzICk7CiAgICAgICAgICAgICAgICAKLSAgICAgICAgICBuZXctPnZpc2libGUgPSBHTF9UUlVFOyAgICAgICAgCisgICAgICAgICAgbmV3LT52aXNpYmxlID0gR0xfVFJVRTsgICAgCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgICAgREZCV2luZG93RGVzY3JpcHRpb24gZHNjOwpAQCAtMTYwLDExICsxNjMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdFVF9CVVRUT05ET1dOIHwgRFdFVF9CVVRUT05VUCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXRVRfRU5URVIgICAgICB8IERXRVRfTEVBVkUgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV0VUX01PVElPTiAgICAgfCBEV0VUX1NJWkUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgCiAgICAgICAgICAgbmV3LT5yZXEuZmxhZ3MgfD0gV0lORE9XX1JFUVVFU1RfU0hPVzsKICAgICAgfQogCisgICAgIG5ldy0+bW9kZSA9IGdfZGlzcGxheV9tb2RlOworICAgICAKICAgICAgbmV3LT5yZXNoYXBlICAgID0gR0xfVFJVRTsKICAgICAgbmV3LT52aXNpYmlsaXR5ID0gR0xfVFJVRTsKICAgICAgbmV3LT5yZWRpc3BsYXkgID0gR0xfVFJVRTsKQEAgLTIyMCw3ICsyMjQsOCBAQAogICAgICBfX0dsdXRXaW5kb3cgKmN1ciA9IGdfc3RhY2s7CiAgICAgIAogICAgICB3aGlsZSAoY3VyKSB7Ci0gICAgICAgICAgX19HbHV0V2luZG93ICpuZXh0ID0gY3VyLT5uZXh0OworICAgICAgICAgIF9fR2x1dFdpbmRvdyAqbmV4dCAgICAgID0gY3VyLT5uZXh0OworICAgICAgICAgIEdMYm9vbGVhbiAgICAgZGlzcGxheWVkID0gR0xfRkFMU0U7CiAgICAgICAgICAgCiAgICAgICAgICAgaWYgKGN1ci0+d2luZG93ICYmIGN1ci0+cmVxLmZsYWdzKSB7CiAgICAgICAgICAgICAgICBpZiAoY3VyID09IGdfY3VycmVudCkKQEAgLTI5MSwxOCArMjk2LDI5IEBACiAgICAgICAgICAgICAgICBjdXItPnN1cmZhY2UtPkdldFNpemUoIGN1ci0+c3VyZmFjZSwgJncsICZoICk7IAogICAgICAgICAgICAgICAgX19nbHV0U2V0V2luZG93KCBjdXIgKTsKICAgICAgICAgICAgICAgIHJlc2hhcGVfZnVuYyggdywgaCApOworICAgICAgICAgICAgICAgZGlzcGxheWVkID0gR0xfVFJVRTsKICAgICAgICAgICB9CiAgICAgICAgICAgCiAgICAgICAgICAgaWYgKGN1ci0+dmlzaWJpbGl0eSAmJiB2aXNpYmlsaXR5X2Z1bmMpIHsKICAgICAgICAgICAgICAgIGdfaWRsZSA9IEdMX0ZBTFNFOwogICAgICAgICAgICAgICAgX19nbHV0U2V0V2luZG93KCBjdXIgKTsKICAgICAgICAgICAgICAgIHZpc2liaWxpdHlfZnVuYyggY3VyLT52aXNpYmxlID8gR0xVVF9WSVNJQkxFIDogR0xVVF9OT1RfVklTSUJMRSApOworICAgICAgICAgICAgICAgZGlzcGxheWVkID0gR0xfVFJVRTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBpZiAoY3VyLT5yZWRpc3BsYXkgJiYgZGlzcGxheV9mdW5jKSB7CiAgICAgICAgICAgICAgICBnX2lkbGUgPSBHTF9GQUxTRTsKICAgICAgICAgICAgICAgIF9fZ2x1dFNldFdpbmRvdyggY3VyICk7CiAgICAgICAgICAgICAgICBkaXNwbGF5X2Z1bmMoKTsKKyAgICAgICAgICAgICAgIGRpc3BsYXllZCA9IEdMX1RSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChkaXNwbGF5ZWQgJiYgY3VyLT53aW5kb3cgJiYgY3VyLT52aXNpYmxlKSB7CisgICAgICAgICAgICAgICBpZiAoIShjdXItPm1vZGUgJiBHTFVUX0RPVUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyLT5nbC0+VW5sb2NrKCBjdXItPmdsICk7CisgICAgICAgICAgICAgICAgICAgIGN1ci0+c3VyZmFjZS0+RmxpcCggY3VyLT5zdXJmYWNlLCBOVUxMLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGN1ci0+Z2wtPkxvY2soIGN1ci0+Z2wgKTsKKyAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICBjdXItPnJlc2hhcGUgICAgPSBHTF9GQUxTRTsKZGlmZiAtLWdpdCBhL3NyYy9nbHV0L2ZiZGV2L01ha2VmaWxlIGIvc3JjL2dsdXQvZmJkZXYvTWFrZWZpbGUKaW5kZXggYjMyYjQxNC4uMTk5ZDhjMyAxMDA2NDQKLS0tIGEvc3JjL2dsdXQvZmJkZXYvTWFrZWZpbGUKKysrIGIvc3JjL2dsdXQvZmJkZXYvTWFrZWZpbGUKQEAgLTYzLDE2ICs2MywxNiBAQAogCiAjIE1ha2UgdGhlIGxpYnJhcnkKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVVF9MSUJfTkFNRSk6IGRlcGVuZCAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMVVRfTElCKSAtbGlua2VyICckKENDKScgXAorCSQoTUtMSUIpIC1vICQoR0xVVF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChHTFVUX01BSk9SKSAtbWlub3IgJChHTFVUX01JTk9SKSAtcGF0Y2ggJChHTFVUX1RJTlkpIFwKIAkJJChHTFVUX0xJQl9ERVBTKSAtaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSBcCiAJCSQoTUtMSUJfT1BUSU9OUykgJChPQkpFQ1RTKQogCiBpbnN0YWxsOgotCSQoSU5TVEFMTCkgLWQgJChJTlNUQUxMX0RJUikvaW5jbHVkZS9HTAotCSQoSU5TVEFMTCkgLWQgJChJTlNUQUxMX0RJUikvJChMSUJfRElSKQotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoVE9QKS9pbmNsdWRlL0dML2dsdXQuaCAkKElOU1RBTExfRElSKS9pbmNsdWRlL0dMCi0JJChJTlNUQUxMKSAkKFRPUCkvJChMSUJfRElSKS9saWJnbHV0KiAkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0lOQ19ESVIpL0dMCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtbSA2NDQgJChUT1ApL2luY2x1ZGUvR0wvZ2x1dC5oICQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wKKwkkKElOU1RBTEwpICQoVE9QKS8kKExJQl9ESVIpL2xpYmdsdXQqICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikKIAogIyBSdW4gJ21ha2UgLWYgTWFrZWZpbGUuc29sbyBkZXAnIHRvIHVwZGF0ZSB0aGUgZGVwZW5kZW5jaWVzIGlmIHlvdSBjaGFuZ2UKICMgd2hhdCdzIGluY2x1ZGVkIGJ5IGFueSBzb3VyY2UgZmlsZS4KQEAgLTg4LDcgKzg4LDcgQEAKIAogIyBSZW1vdmUgLm8gYW5kIGJhY2t1cCBmaWxlcwogY2xlYW46IGRlcGVuZAotCS1ybSAtZiBkZXBlbmQKKwktcm0gLWYgZGVwZW5kIGRlcGVuZC5iYWsKIAktcm0gLWYgKi5vICp+ICoubyAqfiAqLnNvIGxpYmdsdXQuc28uMy43CiAKIGluY2x1ZGUgZGVwZW5kCmRpZmYgLS1naXQgYS9zcmMvZ2x1dC9nZ2kvTWFrZWZpbGUgYi9zcmMvZ2x1dC9nZ2kvTWFrZWZpbGUKaW5kZXggNzQ4YzgzYy4uYzIzZGZjYSAxMDA2NDQKLS0tIGEvc3JjL2dsdXQvZ2dpL01ha2VmaWxlCisrKyBiL3NyYy9nbHV0L2dnaS9NYWtlZmlsZQpAQCAtMzIsNyArMzIsNyBAQAogCiAjIE1ha2UgdGhlIGxpYnJhcnkKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVVF9MSUJfTkFNRSk6IGRlcGVuZCAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMVVRfTElCKSAtbGlua2VyICckKENDKScgXAorCSQoTUtMSUIpIC1vICQoR0xVVF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChHTFVUX01BSk9SKSAtbWlub3IgJChHTFVUX01JTk9SKSBcCiAJCS1wYXRjaCAkKEdMVVRfVElOWSkgJChNS0xJQl9PUFRJT05TKSAtaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSBcCiAJCSQoR0xVVF9MSUJfREVQUykgJChPQkpFQ1RTKQpkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZ2x4L01ha2VmaWxlIGIvc3JjL2dsdXQvZ2x4L01ha2VmaWxlCmluZGV4IDkxMGM2ZmEuLmI2MWQ1YjAgMTAwNjQ0Ci0tLSBhL3NyYy9nbHV0L2dseC9NYWtlZmlsZQorKysgYi9zcmMvZ2x1dC9nbHgvTWFrZWZpbGUKQEAgLTM2LDYgKzM2LDcgQEAKIAlnbHV0X2RzdHIuYyBcCiAJZ2x1dF9ldmVudC5jIFwKIAlnbHV0X2V4dC5jIFwKKwlnbHV0X2ZjYi5jIFwKIAlnbHV0X2Z1bGxzY3JuLmMgXAogCWdsdXRfZ2FtZW1vZGUuYyBcCiAJZ2x1dF9nZXQuYyBcCkBAIC05MCwyNSArOTEsMzggQEAKIAogIyBNYWtlIHRoZSBsaWJyYXJ5CiAkKFRPUCkvJChMSUJfRElSKS8kKEdMVVRfTElCX05BTUUpOiBkZXBlbmQgJChPQkpFQ1RTKQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gJChHTFVUX0xJQikgLWxpbmtlciAnJChDQyknIFwKKwkkKE1LTElCKSAtbyAkKEdMVVRfTElCKSAtbGlua2VyICckKENDKScgLWxkZmxhZ3MgJyQoTERGTEFHUyknIFwKIAkJLW1ham9yICQoR0xVVF9NQUpPUikgLW1pbm9yICQoR0xVVF9NSU5PUikgLXBhdGNoICQoR0xVVF9USU5ZKSBcCiAJCSQoTUtMSUJfT1BUSU9OUykgLWluc3RhbGwgJChUT1ApLyQoTElCX0RJUikgXAorCQktaWQgJChJTlNUQUxMX0xJQl9ESVIpL2xpYiQoR0xVVF9MSUIpLiQoR0xVVF9NQUpPUikuZHlsaWIgXAogCQkkKEdMVVRfTElCX0RFUFMpICQoT0JKRUNUUykKIAogCi1pbnN0YWxsOgotCSQoSU5TVEFMTCkgLWQgJChJTlNUQUxMX0RJUikvaW5jbHVkZS9HTAotCSQoSU5TVEFMTCkgLWQgJChJTlNUQUxMX0RJUikvJChMSUJfRElSKQotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoVE9QKS9pbmNsdWRlL0dML2dsdXQuaCAkKElOU1RBTExfRElSKS9pbmNsdWRlL0dMCi0JJChJTlNUQUxMKSAkKFRPUCkvJChMSUJfRElSKS9saWJnbHV0KiAkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCisjIGdsdXQgcGtnY29uZmlnIGZpbGUKK3BjZWRpdCA9IHNlZCBcCisJLWUgJ3MsQElOU1RBTExfRElSQCwkKElOU1RBTExfRElSKSwnIFwKKwktZSAncyxASU5TVEFMTF9MSUJfRElSQCwkKElOU1RBTExfTElCX0RJUiksJyBcCisJLWUgJ3MsQElOU1RBTExfSU5DX0RJUkAsJChJTlNUQUxMX0lOQ19ESVIpLCcgXAorCS1lICdzLEBWRVJTSU9OQCwkKEdMVVRfTUFKT1IpLiQoR0xVVF9NSU5PUikuJChHTFVUX1RJTlkpLCcKK2dsdXQucGM6IGdsdXQucGMuaW4KKwkkKHBjZWRpdCkgJDwgPiAkQAorCitpbnN0YWxsOiBnbHV0LnBjCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0lOQ19ESVIpL0dMCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpL3BrZ2NvbmZpZworCSQoSU5TVEFMTCkgLW0gNjQ0ICQoVE9QKS9pbmNsdWRlL0dML2dsdXQuaCAkKERFU1RESVIpJChJTlNUQUxMX0lOQ19ESVIpL0dMCisJJChJTlNUQUxMKSAkKFRPUCkvJChMSUJfRElSKS8kKEdMVVRfTElCX0dMT0IpICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikKKwkkKElOU1RBTEwpIC1tIDY0NCBnbHV0LnBjICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikvcGtnY29uZmlnCiAKIAogY2xlYW46CiAJLXJtIC1mICoubyAqfgogCS1ybSAtZiAqLmxvCiAJLXJtIC1mICoubGEKKwktcm0gLWYgKi5wYwogCS1ybSAtcmYgLmxpYnMKLQktcm0gLXJmIGRlcGVuZCBkZXBlbmQuYmFrCisJLXJtIC1mIGRlcGVuZCBkZXBlbmQuYmFrCiAKIAogZGVwZW5kOiAkKFNPVVJDRVMpCkBAIC0xMTYsNiArMTMwLDYgQEAKIAlAIHJtIC1mIGRlcGVuZAogCUAgdG91Y2ggZGVwZW5kCiAJQCAkKE1LREVQKSAkKE1LREVQX09QVElPTlMpIC1JJChUT1ApL2luY2x1ZGUgJChTT1VSQ0VTKSBcCi0JCT4gL2Rldi9udWxsIAorCQkkKFgxMV9JTkNMVURFUykgPiAvZGV2L251bGwgCiAKIGluY2x1ZGUgZGVwZW5kCmRpZmYgLS1naXQgYS9zcmMvZ2x1dC9nbHgvTWFrZWZpbGUubWd3IGIvc3JjL2dsdXQvZ2x4L01ha2VmaWxlLm1ndwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZmMmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsdXQvZ2x4L01ha2VmaWxlLm1ndwpAQCAtMCwwICsxLDE5MSBAQAorIyBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisjIFZlcnNpb246ICA1LjEKKyMgCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDAzICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIyAKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjIAorIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyMgTWluR1cgY29yZSBtYWtlZmlsZSB2MS40IGZvciBNZXNhCisjCisjICBDb3B5cmlnaHQgKEMpIDIwMDIgLSBEYW5pZWwgQm9yY2EKKyMgIEVtYWlsIDogZGJvcmNhQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorIyAgV2ViICAgOiBodHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vZGJvcmNhCisKKyMgTWluR1cgY29yZS1nbHV0IG1ha2VmaWxlIHVwZGF0ZWQgZm9yIE1lc2EgNy4wCisjCisjICBVcGRhdGVkIDogYnkgSGVyb215dGgsIG9uIDIwMDctNy0yMQorIyAgRW1haWwgICA6IHp4cG15dGhAeWFob28uY29tLmNuCisjICBCdWdzICAgIDogMSkgQWxsIHRoZSBkZWZhdWx0IHNldHRpbmdzIHdvcmsgZmluZS4gQnV0IHRoZSBzZXR0aW5nIFg4Nj0xIGNhbid0IHdvcmsuIAorIyAgICAgICAgICAgIFRoZSBvdGhlcnMgaGF2bid0IGJlZW4gdGVzdGVkIHlldC4KKyMgICAgICAgICAgICAyKSBUaGUgZ2VuZXJhdGVkIERMTHMgYXJlICpub3QqIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyBidWlsdAorIyAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGNvbXBpbGVycyBsaWtlIFZDOCwgZXNwZWNpYWxseSBmb3IgR0xVVC4gCisjICAgICAgICAgICAgMykgQWx0aG91Z2ggbW9yZSB0ZXN0cyBhcmUgbmVlZGVkLCBpdCBjYW4gYmUgdXNlZCBpbmRpdmlkdWFsbHkhCisKKworIworIyAgQXZhaWxhYmxlIG9wdGlvbnM6CisjCisjICAgIEVudmlyb25tZW50IHZhcmlhYmxlczoKKyMJQ0ZMQUdTCisjCisjCUdMSURFCQlwYXRoIHRvIEdsaWRlMyBTREs7IHVzZWQgd2l0aCBGWC4KKyMJCQlkZWZhdWx0ID0gJChUT1ApL2dsaWRlMworIwlGWD0xCQlidWlsZCBmb3IgM2RmeCBHbGlkZTMuIE5vdGUgdGhhdCB0aGlzIGRpc2FibGVzCisjCQkJY29tcGlsYXRpb24gb2YgbW9zdCBXTWVzYSBjb2RlIGFuZCByZXF1aXJlcyBmeE1lc2EuCisjCQkJQXMgYSBjb25zZXF1ZW5jZSwgeW91J2xsIG5lZWQgdGhlIFdpbjMyIEdsaWRlMworIwkJCWxpYnJhcnkgdG8gYnVpbGQgYW55IGFwcGxpY2F0aW9uLgorIwkJCWRlZmF1bHQgPSBubworIwlJQ0Q9MQkJYnVpbGQgdGhlIGluc3RhbGxhYmxlIGNsaWVudCBkcml2ZXIgaW50ZXJmYWNlCisjCQkJKHdpbmRvd3Mgb3BlbmdsIGRyaXZlciBpbnRlcmZhY2UpCisjCQkJZGVmYXVsdCA9IG5vCisjCVg4Nj0xCQlvcHRpbWl6ZSBmb3IgeDg2IChpZiBwb3NzaWJsZSwgdXNlIE1NWCwgU1NFLCAzRE5vdykuCisjCQkJZGVmYXVsdCA9IG5vCisjCisjICAgIFRhcmdldHM6CisjCWFsbDoJCWJ1aWxkIEdMCisjCWNsZWFuOgkJcmVtb3ZlIG9iamVjdCBmaWxlcworIworCisKKworLlBIT05ZOiBhbGwgY2xlYW4KKy5JTlRFUk1FRElBVEU6IHg4Ni9nZW5fbWF0eXBlcy5leGUKKy5TVUZGSVhFUzogLnJjIC5yZXMKKworIyBTZXQgdGhpcyB0byB0aGUgcHJlZml4IG9mIHlvdXIgYnVpbGQgdG9vbHMsIGkuZS4gbWluZ3czMi0KK1RPT0xTX1BSRUZJWCA9IG1pbmd3MzItCisKK1RPUCA9IC4uLy4uLy4uCisKK0xJQkRJUiA9ICQoVE9QKS9saWIKKworTElCX05BTUUgPSBnbHV0MzIKKworRExMX0VYVCA9IC5kbGwKK0lNUF9FWFQgPSAuYQorTElCX1BSRSA9IGxpYgorU1RSSVAgPSAtcworCitBUiA9IGFyCitBUkZMQUdTID0gY3J1cworRExMVE9PTCA9IGRsbHRvb2wKKworR0xVVF9ETEwgPSAkKExJQl9OQU1FKSQoRExMX0VYVCkKK0dMVVRfSU1QID0gJChMSUJfUFJFKSQoTElCX05BTUUpJChJTVBfRVhUKQorR0xVVF9ERUYgPSAkKExJQl9OQU1FKS5kZWYKKworTERMSUJTID0gLUwkKExJQkRJUikgLWx3aW5tbSAtbGdkaTMyIC1sdXNlcjMyIC1sb3BlbmdsMzIgLWxnbHUzMiAKK0xERkxBR1MgPSAkKFNUUklQKSAtc2hhcmVkIC1mUElDIC1XbCwtLWtpbGwtYXQKKworQ0ZMQUdTICs9IC1EQlVJTERfR0xVVDMyIC1ER0xVVF9CVUlMRElOR19MSUIgLURNRVNBIC1EX0RMTAorQ0ZMQUdTICs9IC1ETkRFQlVHIC1ETElCUkFSWUJVSUxEIC1JJChUT1ApL2luY2x1ZGUgCisKK0NDID0gJChUT09MU19QUkVGSVgpZ2NjCitDWFggPSAkKFRPT0xTX1BSRUZJWClnKysKK0NYWEZMQUdTID0gJChDRkxBR1MpCisKK0FSID0gYXIKK0FSRkxBR1MgPSBjcnVzCisKK1VOTElOSyA9IGRlbCAkKHN1YnN0IC8sXCwkKDEpKQoraWZuZXEgKCQod2lsZGNhcmQgJChhZGRzdWZmaXggL3JtLmV4ZSwkKHN1YnN0IDssICwkKFBBVEgpKSkpLCkKK1VOTElOSyA9ICQoUk0pICQoMSkKK2VuZGlmCitpZm5lcSAoJCh3aWxkY2FyZCAkKGFkZHN1ZmZpeCAvcm0sJChzdWJzdCA6LCAsJChQQVRIKSkpKSwpCitVTkxJTksgPSAkKFJNKSAkKDEpCitlbmRpZgorCitIRFJTID0gZ2x1dGludC5oIGdsdXRzdHJva2UuaCBnbHV0Yml0bWFwLmggZ2x1dHdpbjMyLmggc3Ryb2tlLmggd2luMzJfZ2x4Lmggd2luMzJfeDExLmgKKworU1JDUyA9IFwKKwlnbHV0X2JpdG1hcC5jIFwKKwlnbHV0X2J3aWR0aC5jIFwKKwlnbHV0X2NpbmRleC5jIFwKKwlnbHV0X2NtYXAuYyBcCisJZ2x1dF9jdXJzb3IuYyBcCisJZ2x1dF9kaWFscy5jIFwKKwlnbHV0X2RzdHIuYyBcCisJZ2x1dF9ldmVudC5jIFwKKwlnbHV0X2V4dC5jIFwKKwlnbHV0X2ZiYy5jIFwKKwlnbHV0X2Z1bGxzY3JuLmMgXAorCWdsdXRfZ2FtZW1vZGUuYyBcCisJZ2x1dF9nZXQuYyBcCisJZ2x1dF9pbml0LmMgXAorCWdsdXRfaW5wdXQuYyBcCisJZ2x1dF9qb3kuYyBcCisJZ2x1dF9rZXkuYyBcCisJZ2x1dF9rZXljdHJsLmMgXAorCWdsdXRfa2V5dXAuYyBcCisJZ2x1dF9tZXNhLmMgXAorCWdsdXRfbW9kaWZpZXIuYyBcCisJZ2x1dF9vdmVybGF5LmMgXAorCWdsdXRfc2hhcGVzLmMgXAorCWdsdXRfc3BhY2UuYyBcCisJZ2x1dF9zdHJva2UuYyBcCisJZ2x1dF9zd2FwLmMgXAorCWdsdXRfc3dpZHRoLmMgXAorCWdsdXRfdGFibGV0LmMgXAorCWdsdXRfdGVhcG90LmMgXAorCWdsdXRfdXRpbC5jIFwKKwlnbHV0X3ZpZHJlc2l6ZS5jIFwKKwlnbHV0X3dhcnAuYyBcCisJZ2x1dF93aW4uYyBcCisJZ2x1dF93aW5taXNjLmMgXAorCXdpbjMyX2dseC5jIFwKKwl3aW4zMl9tZW51LmMgXAorCXdpbjMyX3V0aWwuYyBcCisJd2luMzJfd2lucHJvYy5jIFwKKwl3aW4zMl94MTEuYworCQorCitTUkNTU0VNSUdFTlMgPSBcCisJZ2x1dF84eDEzLmMgXAorCWdsdXRfOXgxNS5jIFwKKwlnbHV0X2hlbDEwLmMgXAorCWdsdXRfaGVsMTIuYyBcCisJZ2x1dF9oZWwxOC5jIFwKKwlnbHV0X21yb21hbi5jIFwKKwlnbHV0X3JvbWFuLmMgXAorCWdsdXRfdHIxMC5jIFwKKwlnbHV0X3RyMjQuYworCisKKworU09VUkNFUyA9ICQoU1JDUykgJChTUkNTU0VNSUdFTlMpCisKK09CSkVDVFMgPSAkKGFkZHN1ZmZpeCAubywkKGJhc2VuYW1lICQoU09VUkNFUykpKQorCisuYy5vOgorCSQoQ0MpIC1vICRAICQoQ0ZMQUdTKSAtYyAkPAorLmNjLm86CisJJChDWFgpIC1vICRAICQoQ1hYRkxBR1MpIC1jICQ8CisKKworYWxsOiAkKExJQkRJUikgJChMSUJESVIpLyQoR0xVVF9ETEwpICQoTElCRElSKS8kKEdMVVRfSU1QKQorCiskKExJQkRJUik6CisJbWtkaXIgLXAgJChMSUJESVIpCisKKyQoTElCRElSKS8kKEdMVVRfRExMKSAkKExJQkRJUikvJChHTFVUX0lNUCk6ICQoT0JKRUNUUykKKwkkKENYWCkgJChMREZMQUdTKSAtbyAkKExJQkRJUikvJChHTFVUX0RMTCkgJF4gJChMRExJQlMpCisJJChETExUT09MKSAtLWFzPWFzIC0tZGxsbmFtZSAkKExJQl9OQU1FKSAtLW91dHB1dC1kZWYgJChMSUJESVIpLyQoR0xVVF9ERUYpICReCisJJChETExUT09MKSAtLWFzPWFzIC1rIC0tZGxsbmFtZSAkKExJQl9OQU1FKSAtLW91dHB1dC1saWIgJChMSUJESVIpLyQoR0xVVF9JTVApIC0tZGVmICQoTElCRElSKS8kKEdMVVRfREVGKSAKKworY2xlYW46CisJLSQoY2FsbCBVTkxJTkssKi5vKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9nbHV0L2dseC9nbHV0LnBjLmluIGIvc3JjL2dsdXQvZ2x4L2dsdXQucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2MzhmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHV0L2dseC9nbHV0LnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1ASU5TVEFMTF9ESVJACitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj1ASU5TVEFMTF9MSUJfRElSQAoraW5jbHVkZWRpcj1ASU5TVEFMTF9JTkNfRElSQAorCitOYW1lOiBnbHV0CitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgVXRpbGl0eSBUb29sa2l0IGxpYnJhcnkKK1JlcXVpcmVzOiBnbCBnbHUKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxnbHV0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZ2x4L2dsdXRfZHN0ci5jIGIvc3JjL2dsdXQvZ2x4L2dsdXRfZHN0ci5jCmluZGV4IGVjOTM4NmYuLjI1MTNhZjQgMTAwNjQ0Ci0tLSBhL3NyYy9nbHV0L2dseC9nbHV0X2RzdHIuYworKysgYi9zcmMvZ2x1dC9nbHgvZ2x1dF9kc3RyLmMKQEAgLTI5MSw2ICsyOTEsNyBAQAogICBmYm1vZGVzID0gKEZyYW1lQnVmZmVyTW9kZSAqKSBtYWxsb2MobiAqIHNpemVvZihGcmFtZUJ1ZmZlck1vZGUpKTsKICAgaWYgKGZibW9kZXMgPT0gTlVMTCkgewogICAgICpuaXRlbXNfcmV0dXJuID0gLTE7CisgICAgZnJlZSh2bGlzdCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZ2x4L2dsdXRfZXZlbnQuYyBiL3NyYy9nbHV0L2dseC9nbHV0X2V2ZW50LmMKaW5kZXggNGU2N2RhNi4uYjVkZjdiMiAxMDA2NDQKLS0tIGEvc3JjL2dsdXQvZ2x4L2dsdXRfZXZlbnQuYworKysgYi9zcmMvZ2x1dC9nbHgvZ2x1dF9ldmVudC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjIGlmZGVmIF9fc2dpCiAjICBpbmNsdWRlIDxic3RyaW5nLmg+ICAgIC8qIHByb3RvdHlwZSBmb3IgYnplcm8gdXNlZCBieSBGRF9aRVJPICovCiAjIGVuZGlmCi0jIGlmIChkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoQ1JBWSkgfHwgZGVmaW5lZChBSVhWMykpICYmICFkZWZpbmVkKEZEX1NFVFNJWkUpCisjIGlmIChkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoQ1JBWSkgfHwgZGVmaW5lZChBSVhWMykpICYmICFkZWZpbmVkKEZEX1NFVFNJWkUpCiAjICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+IC8qIHNlbGVjdCBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UgKi8KICMgIGlmZGVmIGx1bmEKICMgICBpbmNsdWRlIDxzeXNlbnQuaD4KQEAgLTE3MiwxMCArMTcyLDE0IEBACiAgIEdFVFRJTUVPRkRBWSgmbm93KTsKICAgd2hpbGUgKElTX0FUX09SX0FGVEVSKF9fZ2x1dFRpbWVyTGlzdC0+dGltZW91dCwgbm93KSkgewogICAgIHRpbWVyID0gX19nbHV0VGltZXJMaXN0OwotICAgIF9fZ2x1dFRpbWVyTGlzdCA9IHRpbWVyLT5uZXh0OworICAgIC8qIGNhbGwgdGhlIHRpbWVyIGZ1bmN0aW9uICovCiAgICAgdGltZXItPmZ1bmModGltZXItPnZhbHVlKTsKKyAgICAvKiByZW1vdmUgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICBfX2dsdXRUaW1lckxpc3QgPSB0aW1lci0+bmV4dDsKKyAgICAvKiBwdXQgdGhpcyB0aW1lciBvbiB0aGUgImZyZWUiIGxpc3QgKi8KICAgICB0aW1lci0+bmV4dCA9IGZyZWVUaW1lckxpc3Q7CiAgICAgZnJlZVRpbWVyTGlzdCA9IHRpbWVyOworCiAgICAgaWYgKCFfX2dsdXRUaW1lckxpc3QpCiAgICAgICBicmVhazsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2dsdXQvZ2x4L2dsdXRfZmJjLmMgYi9zcmMvZ2x1dC9nbHgvZ2x1dF9mY2IuYwpzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBzcmMvZ2x1dC9nbHgvZ2x1dF9mYmMuYwpyZW5hbWUgdG8gc3JjL2dsdXQvZ2x4L2dsdXRfZmNiLmMKaW5kZXggZTkzMTg4Yi4uYzhhMzQyMiAxMDA2NDQKLS0tIGEvc3JjL2dsdXQvZ2x4L2dsdXRfZmJjLmMKKysrIGIvc3JjL2dsdXQvZ2x4L2dsdXRfZmNiLmMKQEAgLTE5LDcgKzE5LDcgQEAKIC8qIFNldCBhIEZvcnRyYW4gY2FsbGJhY2sgZnVuY3Rpb24uICovCiAKIHZvaWQgQVBJRU5UUlkKLV9fZ2x1dFNldEZDQihpbnQgd2hpY2gsIHZvaWQgKmZ1bmMpCitfX2dsdXRTZXRGQ0IoaW50IHdoaWNoLCBHTFVUcHJvYyBmdW5jKQogewogI2lmZGVmIFNVUFBPUlRfRk9SVFJBTgogICBzd2l0Y2ggKHdoaWNoKSB7CkBAIC0xMDAsNjEgKzEwMCw2MSBAQAogCiAvKiBHZXQgYSBGb3J0cmFuIGNhbGxiYWNrIGZ1bmN0aW9uLiAqLwogCi12b2lkKiBBUElFTlRSWQorR0xVVHByb2MgQVBJRU5UUlkKIF9fZ2x1dEdldEZDQihpbnQgd2hpY2gpCiB7CiAjaWZkZWYgU1VQUE9SVF9GT1JUUkFOCiAgIHN3aXRjaCAod2hpY2gpIHsKICAgY2FzZSBHTFVUX0ZDQl9ESVNQTEFZOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mZGlzcGxheTsKKyAgICByZXR1cm4gX19nbHV0Q3VycmVudFdpbmRvdy0+ZmRpc3BsYXk7CiAgIGNhc2UgR0xVVF9GQ0JfUkVTSEFQRToKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+ZnJlc2hhcGU7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZyZXNoYXBlOwogICBjYXNlIEdMVVRfRkNCX01PVVNFOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mbW91c2U7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZtb3VzZTsKICAgY2FzZSBHTFVUX0ZDQl9NT1RJT046Ci0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZtb3Rpb247CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZtb3Rpb247CiAgIGNhc2UgR0xVVF9GQ0JfUEFTU0lWRToKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+ZnBhc3NpdmU7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZwYXNzaXZlOwogICBjYXNlIEdMVVRfRkNCX0VOVFJZOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mZW50cnk7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZlbnRyeTsKICAgY2FzZSBHTFVUX0ZDQl9LRVlCT0FSRDoKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+ZmtleWJvYXJkOworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5ma2V5Ym9hcmQ7CiAgIGNhc2UgR0xVVF9GQ0JfS0VZQk9BUkRfVVA6Ci0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZrZXlib2FyZFVwOworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5ma2V5Ym9hcmRVcDsKICAgY2FzZSBHTFVUX0ZDQl9XSU5ET1dfU1RBVFVTOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5md2luZG93U3RhdHVzOworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5md2luZG93U3RhdHVzOwogICBjYXNlIEdMVVRfRkNCX1ZJU0lCSUxJVFk6Ci0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZ2aXNpYmlsaXR5OworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5mdmlzaWJpbGl0eTsKICAgY2FzZSBHTFVUX0ZDQl9TUEVDSUFMOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mc3BlY2lhbDsKKyAgICByZXR1cm4gX19nbHV0Q3VycmVudFdpbmRvdy0+ZnNwZWNpYWw7CiAgIGNhc2UgR0xVVF9GQ0JfU1BFQ0lBTF9VUDoKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+ZnNwZWNpYWxVcDsKKyAgICByZXR1cm4gX19nbHV0Q3VycmVudFdpbmRvdy0+ZnNwZWNpYWxVcDsKICAgY2FzZSBHTFVUX0ZDQl9CVVRUT05fQk9YOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mYnV0dG9uQm94OworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5mYnV0dG9uQm94OwogICBjYXNlIEdMVVRfRkNCX0RJQUxTOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mZGlhbHM7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZkaWFsczsKICAgY2FzZSBHTFVUX0ZDQl9TUEFDRV9NT1RJT046Ci0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZzcGFjZU1vdGlvbjsKKyAgICByZXR1cm4gX19nbHV0Q3VycmVudFdpbmRvdy0+ZnNwYWNlTW90aW9uOwogICBjYXNlIEdMVVRfRkNCX1NQQUNFX1JPVEFURToKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+ZnNwYWNlUm90YXRlOworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5mc3BhY2VSb3RhdGU7CiAgIGNhc2UgR0xVVF9GQ0JfU1BBQ0VfQlVUVE9OOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mc3BhY2VCdXR0b247CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZzcGFjZUJ1dHRvbjsKICAgY2FzZSBHTFVUX0ZDQl9UQUJMRVRfTU9USU9OOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRDdXJyZW50V2luZG93LT5mdGFibGV0TW90aW9uOworICAgIHJldHVybiBfX2dsdXRDdXJyZW50V2luZG93LT5mdGFibGV0TW90aW9uOwogICBjYXNlIEdMVVRfRkNCX1RBQkxFVF9CVVRUT046Ci0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZ0YWJsZXRCdXR0b247CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZ0YWJsZXRCdXR0b247CiAgIGNhc2UgR0xVVF9GQ0JfSk9ZU1RJQ0s6CiAjaWZkZWYgX1dJTjMyCi0gICAgcmV0dXJuICh2b2lkICopIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPmZqb3lzdGljazsKKyAgICByZXR1cm4gX19nbHV0Q3VycmVudFdpbmRvdy0+ZmpveXN0aWNrOwogI2Vsc2UKICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogICBjYXNlIEdMVVRfRkNCX09WRVJMQVlfRElTUExBWToKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudFdpbmRvdy0+b3ZlcmxheS0+ZmRpc3BsYXk7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRXaW5kb3ctPm92ZXJsYXktPmZkaXNwbGF5OwogICBjYXNlIEdMVVRfRkNCX1NFTEVDVDoKLSAgICByZXR1cm4gKHZvaWQgKikgX19nbHV0Q3VycmVudE1lbnUtPmZzZWxlY3Q7CisgICAgcmV0dXJuIF9fZ2x1dEN1cnJlbnRNZW51LT5mc2VsZWN0OwogICBjYXNlIEdMVVRfRkNCX1RJTUVSOgotICAgIHJldHVybiAodm9pZCAqKSBfX2dsdXRUaW1lckxpc3QtPmZmdW5jOworICAgICByZXR1cm4gX19nbHV0VGltZXJMaXN0ID8gX19nbHV0VGltZXJMaXN0LT5mZnVuYyA6IE5VTEw7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9nbHV0L21pbmkvTWFrZWZpbGUgYi9zcmMvZ2x1dC9taW5pL01ha2VmaWxlCmluZGV4IDk4MDMwNmQuLjdlN2FmYzMgMTAwNjQ0Ci0tLSBhL3NyYy9nbHV0L21pbmkvTWFrZWZpbGUKKysrIGIvc3JjL2dsdXQvbWluaS9NYWtlZmlsZQpAQCAtNTUsNyArNTUsNyBAQAogCiAjIE1ha2UgdGhlIGxpYnJhcnkKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xVVF9MSUJfTkFNRSk6IGRlcGVuZCAkKE9CSkVDVFMpCi0JJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMVVRfTElCKSAtbGlua2VyICckKENDKScgXAorCSQoTUtMSUIpIC1vICQoR0xVVF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChHTFVUX01BSk9SKSAtbWlub3IgJChHTFVUX01JTk9SKSAtcGF0Y2ggJChHTFVUX1RJTlkpIFwKIAkJJChHTFVUX0xJQl9ERVBTKSAtaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSBcCiAJCSQoTUtMSUJfT1BUSU9OUykgJChPQkpFQ1RTKQpAQCAtNzMsOSArNzMsMjcgQEAKIAlldGFncyBgZmluZCAuIC1uYW1lIFwqLltjaF1gIGBmaW5kIC4uL2luY2x1ZGVgCiAKIAorIyBnbHV0IHBrZ2NvbmZpZyBmaWxlCitwY2VkaXQgPSBzZWQgXAorCS1lICdzLEBJTlNUQUxMX0RJUkAsJChJTlNUQUxMX0RJUiksJyBcCisJLWUgJ3MsQElOU1RBTExfTElCX0RJUkAsJChJTlNUQUxMX0xJQl9ESVIpLCcgXAorCS1lICdzLEBJTlNUQUxMX0lOQ19ESVJALCQoSU5TVEFMTF9JTkNfRElSKSwnIFwKKwktZSAncyxAVkVSU0lPTkAsJChHTFVUX01BSk9SKS4kKEdMVVRfTUlOT1IpLiQoR0xVVF9USU5ZKSwnCitnbHV0LnBjOiBnbHV0LnBjLmluCisJJChwY2VkaXQpICQ8ID4gJEAKKworaW5zdGFsbDogZ2x1dC5wYworCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9JTkNfRElSKS9HTAorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKQorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKS9wa2djb25maWcKKwkkKElOU1RBTEwpIC1tIDY0NCAkKFRPUCkvaW5jbHVkZS9HTC9nbHV0LmggJChERVNURElSKSQoSU5TVEFMTF9JTkNfRElSKS9HTAorCSQoSU5TVEFMTCkgJChUT1ApLyQoTElCX0RJUikvbGliZ2x1dCogJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKQorCSQoSU5TVEFMTCkgLW0gNjQ0IGdsdXQucGMgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKS9wa2djb25maWcKKworCiAjIFJlbW92ZSAubyBhbmQgYmFja3VwIGZpbGVzCiBjbGVhbjogZGVwZW5kCi0JLXJtIC1mIGRlcGVuZAotCS1ybSAtZiAqLm8gKn4gKi5vICp+ICouc28gbGliZ2x1dC5zby4zLjcKKwktcm0gLWYgZGVwZW5kIGRlcGVuZC5iYWsKKwktcm0gLWYgKi5vICp+ICoubyAqfiAqLnNvICoucGMgbGliZ2x1dC5zby4zLjcKIAogaW5jbHVkZSBkZXBlbmQKZGlmZiAtLWdpdCBhL3NyYy9nbHV0L21pbmkvZ2x1dC5wYy5pbiBiL3NyYy9nbHV0L21pbmkvZ2x1dC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODYzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsdXQvbWluaS9nbHV0LnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1ASU5TVEFMTF9ESVJACitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj1ASU5TVEFMTF9MSUJfRElSQAoraW5jbHVkZWRpcj1ASU5TVEFMTF9JTkNfRElSQAorCitOYW1lOiBnbHV0CitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgVXRpbGl0eSBUb29sa2l0IGxpYnJhcnkKK1JlcXVpcmVzOiBnbCBnbHUKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxnbHV0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3JjL2dsdy9NYWtlZmlsZSBiL3NyYy9nbHcvTWFrZWZpbGUKaW5kZXggODZhMGJiYS4uYzJlOGUzMCAxMDA2NDQKLS0tIGEvc3JjL2dsdy9NYWtlZmlsZQorKysgYi9zcmMvZ2x3L01ha2VmaWxlCkBAIC03LDcgKzcsNyBAQAogTUlOT1IgPSAwCiBUSU5ZID0gMAogCi1JTkNESVJTID0gLUkkKFRPUCkvaW5jbHVkZSAtSS91c3IvaW5jbHVkZS9Nb3RpZjEuMiAkKFgxMV9JTkNMVURFUykKK0lOQ0RJUlMgPSAtSSQoVE9QKS9pbmNsdWRlICQoTU9USUZfQ0ZMQUdTKSAkKFgxMV9JTkNMVURFUykKIAogCiBPQkpFQ1RTID0gJChHTFdfU09VUkNFUzouYz0ubykKQEAgLTI1LDIyICsyNSwzNCBAQAogCiBkZWZhdWx0OiAkKFRPUCkvJChMSUJfRElSKS8kKEdMV19MSUJfTkFNRSkKIAotaW5zdGFsbDoKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfRElSKS9pbmNsdWRlL0dMCi0JJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0RJUikvJChMSUJfRElSKQotCSQoSU5TVEFMTCkgLW0gNjQ0ICouaCAkKERFU1RESVIpJChJTlNUQUxMX0RJUikvaW5jbHVkZS9HTAotCSQoSU5TVEFMTCkgJChUT1ApLyQoTElCX0RJUikvbGliR0x3LiogJChERVNURElSKSQoSU5TVEFMTF9ESVIpLyQoTElCX0RJUikKKyMgR0xVIHBrZy1jb25maWcgZmlsZQorcGNlZGl0ID0gc2VkIFwKKwktZSAncyxASU5TVEFMTF9ESVJALCQoSU5TVEFMTF9ESVIpLCcgXAorCS1lICdzLEBJTlNUQUxMX0xJQl9ESVJALCQoSU5TVEFMTF9MSUJfRElSKSwnIFwKKwktZSAncyxASU5TVEFMTF9JTkNfRElSQCwkKElOU1RBTExfSU5DX0RJUiksJyBcCisJLWUgJ3MsQFZFUlNJT05ALCQoTUFKT1IpLiQoTUlOT1IpLiQoVElOWSksJworZ2x3LnBjOiBnbHcucGMuaW4KKwkkKHBjZWRpdCkgJDwgPiAkQAorCitpbnN0YWxsOiBnbHcucGMKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikvcGtnY29uZmlnCisJJChJTlNUQUxMKSAtbSA2NDQgKi5oICQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wKKwkkKElOU1RBTEwpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xXX0xJQl9HTE9CKSAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtbSA2NDQgZ2x3LnBjICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikvcGtnY29uZmlnCiAKIGNsZWFuOgotCS1ybSBkZXBlbmQgZGVwZW5kLmJhawotCS1ybSAtZiAqLm8gKn4KKwktcm0gLWYgZGVwZW5kIGRlcGVuZC5iYWsKKwktcm0gLWYgKi5vICoucGMgKn4KIAogCiAjIE1ha2UgdGhlIGxpYnJhcnkKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xXX0xJQl9OQU1FKTogJChPQkpFQ1RTKQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gJChHTFdfTElCKSAtbGlua2VyICckKENDKScgXAorCSQoTUtMSUIpIC1vICQoR0xXX0xJQikgLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCiAJCS1tYWpvciAkKE1BSk9SKSAtbWlub3IgJChNSU5PUikgLXBhdGNoICQoVElOWSkgXAogCQkkKE1LTElCX09QVElPTlMpIC1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKKwkJLWlkICQoSU5TVEFMTF9MSUJfRElSKS9saWIkKEdMV19MSUIpLiQoTUFKT1IpLmR5bGliIFwKIAkJJChHTFdfTElCX0RFUFMpICQoT0JKRUNUUykKIAogCkBAIC01Miw3ICs2NCw3IEBACiAJcm0gLWYgZGVwZW5kCiAJdG91Y2ggZGVwZW5kCiAJJChNS0RFUCkgJChNS0RFUF9PUFRJT05TKSAtSSQoVE9QKS9pbmNsdWRlICQoR0xXX1NPVVJDRVMpIFwKLQkJPiAvZGV2L251bGwgCisJCSQoWDExX0lOQ0xVREVTKSA+IC9kZXYvbnVsbAogCiAKIGluY2x1ZGUgZGVwZW5kCmRpZmYgLS1naXQgYS9zcmMvZ2x3L2dsdy5wYy5pbiBiL3NyYy9nbHcvZ2x3LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x3L2dsdy5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QElOU1RBTExfRElSQAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9QElOU1RBTExfTElCX0RJUkAKK2luY2x1ZGVkaXI9QElOU1RBTExfSU5DX0RJUkAKKworTmFtZTogZ2x3CitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgd2lkZ2V0IGxpYnJhcnkKK1JlcXVpcmVzOiBnbAorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbEdMdworQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NyYy9nbHgvTWFrZWZpbGUgYi9zcmMvZ2x4L01ha2VmaWxlCmluZGV4IGJkNDg2Y2YuLmUwYWI0YTAgMTAwNjQ0Ci0tLSBhL3NyYy9nbHgvTWFrZWZpbGUKKysrIGIvc3JjL2dseC9NYWtlZmlsZQpAQCAtNCw5ICs0LDkgQEAKIAogCiBkZWZhdWx0OgotCWNkIG1pbmkgOyAkKE1BS0UpCisJY2QgbWluaSAmJiAkKE1BS0UpCiAKIAogY2xlYW46Ci0JY2QgbWluaSA7ICQoTUFLRSkgY2xlYW4KKwktQGNkIG1pbmkgJiYgJChNQUtFKSBjbGVhbgogCmRpZmYgLS1naXQgYS9zcmMvZ2x4L21pbmkvTWFrZWZpbGUgYi9zcmMvZ2x4L21pbmkvTWFrZWZpbGUKaW5kZXggOTU0NTUwNS4uNmI1YTNjNyAxMDA2NDQKLS0tIGEvc3JjL2dseC9taW5pL01ha2VmaWxlCisrKyBiL3NyYy9nbHgvbWluaS9NYWtlZmlsZQpAQCAtNDksNyArNDksNyBAQAogCiAjIE1ha2UgbGliR0wKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpOiAgJChPQkpFQ1RTKSBNYWtlZmlsZQotCUAgJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMX0xJQikgLWxpbmtlciAnJChDQyknIFwKKwlAICQoTUtMSUIpIC1vICQoR0xfTElCKSAtbGlua2VyICckKENDKScgLWxkZmxhZ3MgJyQoTERGTEFHUyknIFwKIAkJLW1ham9yIDEgLW1pbm9yIDIgJChNS0xJQl9PUFRJT05TKSBcCiAJCS1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpICQoR0xfTElCX0RFUFMpICQoT0JKRUNUUykgXAogCQkkKExJQkRSTV9MSUIpICQoUENJQUNDRVNTX0xJQikKQEAgLTc2LDEwICs3NiwxNCBAQAogCWV0YWdzIGBmaW5kIC4gLW5hbWUgXCouW2NoXWAgYGZpbmQgLi4vaW5jbHVkZWAKIAogCisjIER1bW15IGluc3RhbGwgdGFyZ2V0CitpbnN0YWxsOgorCisKICMgUmVtb3ZlIC5vIGFuZCBiYWNrdXAgZmlsZXMKIGNsZWFuOgogCS1ybSAtZiBkcm10ZXN0ICQoVE9QKS8kKExJQl9ESVIpL2xpYkdMLnNvKgogCS1ybSAtZiAqLm8gKn4KLQktcm0gLWYgZGVwZW5kCisJLXJtIC1mIGRlcGVuZCBkZXBlbmQuYmFrCiAKIGluY2x1ZGUgZGVwZW5kCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS8uZ2l0aWdub3JlIGIvc3JjL2dseC94MTEvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMTRhYi4uMDAwMDAwMAotLS0gYS9zcmMvZ2x4L3gxMS8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZ2xjb250ZXh0bW9kZXMuYwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvTWFrZWZpbGUgYi9zcmMvZ2x4L3gxMS9NYWtlZmlsZQppbmRleCBjOTliY2YyLi44ZDQ5YTE3IDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9NYWtlZmlsZQorKysgYi9zcmMvZ2x4L3gxMS9NYWtlZmlsZQpAQCAtMTAsMTIgKzEwLDE0IEBACiAJICBjb21wc2l6ZS5jIFwKIAkgIGV2YWwuYyBcCiAJICBnbHhjbWRzLmMgXAorCSAgZ2x4Y3VycmVudC5jIFwKIAkgIGdseGV4dC5jIFwKIAkgIGdseGV4dGVuc2lvbnMuYyBcCiAJICBpbmRpcmVjdC5jIFwKIAkgIGluZGlyZWN0X2luaXQuYyBcCiAJICBpbmRpcmVjdF9zaXplLmMgXAogCSAgaW5kaXJlY3Rfd2luZG93X3Bvcy5jIFwKKwkgIGluZGlyZWN0X3RleHR1cmVfY29tcHJlc3Npb24uYyBcCiAJICBpbmRpcmVjdF90cmFuc3Bvc2VfbWF0cml4LmMgXAogCSAgaW5kaXJlY3RfdmVydGV4X2FycmF5LmMgXAogCSAgaW5kaXJlY3RfdmVydGV4X3Byb2dyYW0uYyBcCkBAIC0yOSw5ICszMSwxMyBAQAogCSAgeGZvbnQuYyBcCiAJICBnbHhfcGJ1ZmZlci5jIFwKIAkgIGdseF9xdWVyeS5jIFwKLQkgIGdseF90ZXh0dXJlX2NvbXByZXNzaW9uLmMgXAorCSAgZHJpc3dfZ2x4LmMgXAorCSAgZHJpX2NvbW1vbi5jIFwKIAkgIGRyaV9nbHguYyBcCi0JICBYRjg2ZHJpLmMKKwkgIFhGODZkcmkuYyBcCisJICBnbHhoYXNoLmMgXAorCSAgZHJpMl9nbHguYyBcCisJICBkcmkyLmMKIAogaW5jbHVkZSAkKFRPUCkvc3JjL21lc2Evc291cmNlcy5tYWsKIApAQCAtNDgsNiArNTQsNyBAQAogCS1JJChUT1ApL3NyYy9tZXNhL21haW4gXAogCS1JJChUT1ApL3NyYy9tZXNhL2dsYXBpIFwKIAkkKExJQkRSTV9DRkxBR1MpIFwKKwkkKERSSTJQUk9UT19DRkxBR1MpIFwKIAkkKFgxMV9JTkNMVURFUykKIAogCkBAIC02NSw5ICs3MiwxMCBAQAogCiAjIE1ha2UgbGliR0wKICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpOiAgJChPQkpFQ1RTKSBNYWtlZmlsZQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyBcCisJJChNS0xJQikgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgMSAtbWlub3IgMiAkKE1LTElCX09QVElPTlMpIFwKLQkJLWluc3RhbGwgJChUT1ApLyQoTElCX0RJUikgJChHTF9MSUJfREVQUykgJChPQkpFQ1RTKQorCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAtaWQgJChJTlNUQUxMX0xJQl9ESVIpL2xpYiQoR0xfTElCKS4xLmR5bGliIFwKKwkJJChHTF9MSUJfREVQUykgJChPQkpFQ1RTKQogCiAKIGRlcGVuZDogJChTT1VSQ0VTKSAkKE1FU0FfR0xBUElfU09VUkNFUykgJChNRVNBX0dMQVBJX0FTTV9TT1VSQ0VTKSBNYWtlZmlsZQpAQCAtODEsMTMgKzg5LDEzIEBACiB0YWdzOgogCWV0YWdzIGBmaW5kIC4gLW5hbWUgXCouW2NoXWAgYGZpbmQgJChUT1ApL2luY2x1ZGVgCiAKLSMgRHVtbXkgaW5zdGFsbCB0YXJnZXQKLWluc3RhbGw6CitpbnN0YWxsOiAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKQorCSQoTUFLRSkgLUMgJChUT1ApL3NyYy9tZXNhIGluc3RhbGwtbGliZ2wKIAogIyBSZW1vdmUgLm8gYW5kIGJhY2t1cCBmaWxlcwogY2xlYW46CiAJLXJtIC1mICQoVE9QKS8kKExJQl9ESVIpL2xpYkdMLnNvKgogCS1ybSAtZiAqLm8gKn4KLQktcm0gLWYgZGVwZW5kCisJLXJtIC1mIGRlcGVuZCBkZXBlbmQuYmFrCiAKLWluY2x1ZGUgZGVwZW5kCistaW5jbHVkZSBkZXBlbmQKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL1hGODZkcmkuYyBiL3NyYy9nbHgveDExL1hGODZkcmkuYwppbmRleCA5OTE5YTQwLi5iYTM4OTQ5IDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9YRjg2ZHJpLmMKKysrIGIvc3JjL2dseC94MTEvWEY4NmRyaS5jCkBAIC0zNzQsMTAgKzM3NCw5IEBACiAJCQkJCSAgIGNvbnRleHQsIGhIV0NvbnRleHQgKTsKIH0KIAotUFVCTElDIEdMYm9vbGVhbiBYRjg2RFJJRGVzdHJveUNvbnRleHQoIF9fRFJJbmF0aXZlRGlzcGxheSAqIG5kcHksIGludCBzY3JlZW4sIAotICAgIF9fRFJJaWQgY29udGV4dCApCitQVUJMSUMgR0xib29sZWFuIFhGODZEUklEZXN0cm95Q29udGV4dChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIAorICAgIFhJRCBjb250ZXh0ICkKIHsKLSAgICBEaXNwbGF5ICogY29uc3QgZHB5ID0gKERpc3BsYXkgKikgbmRweTsKICAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CiAgICAgeFhGODZEUklEZXN0cm95Q29udGV4dFJlcSAqcmVxOwogCkBAIC0zOTYsMTAgKzM5NSw5IEBACiAgICAgcmV0dXJuIFRydWU7CiB9CiAKLVBVQkxJQyBHTGJvb2xlYW4gWEY4NkRSSUNyZWF0ZURyYXdhYmxlKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBuZHB5LCBpbnQgc2NyZWVuLCAKLSAgICBfX0RSSWlkIGRyYXdhYmxlLCBkcm1fZHJhd2FibGVfdCAqIGhIV0RyYXdhYmxlICkKK1BVQkxJQyBHTGJvb2xlYW4gWEY4NkRSSUNyZWF0ZURyYXdhYmxlKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgCisgICAgWElEIGRyYXdhYmxlLCBkcm1fZHJhd2FibGVfdCAqIGhIV0RyYXdhYmxlICkKIHsKLSAgICBEaXNwbGF5ICogY29uc3QgZHB5ID0gKERpc3BsYXkgKikgbmRweTsKICAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkgKGRweSk7CiAgICAgeFhGODZEUklDcmVhdGVEcmF3YWJsZVJlcGx5IHJlcDsKICAgICB4WEY4NkRSSUNyZWF0ZURyYXdhYmxlUmVxICpyZXE7CkBAIC00MjYsMTYgKzQyNCwzNiBAQAogICAgIHJldHVybiBUcnVlOwogfQogCi1QVUJMSUMgR0xib29sZWFuIFhGODZEUklEZXN0cm95RHJhd2FibGUoIF9fRFJJbmF0aXZlRGlzcGxheSAqIG5kcHksIGludCBzY3JlZW4sCi0gICAgX19EUklpZCBkcmF3YWJsZSApCitzdGF0aWMgaW50IG5vb3BFcnJvckhhbmRsZXIoRGlzcGxheSAqZHB5LCBYRXJyb3JFdmVudCAqeGVycikKIHsKLSAgICBEaXNwbGF5ICogY29uc3QgZHB5ID0gKERpc3BsYXkgKikgbmRweTsKKyAgICByZXR1cm4gMDsKK30KKworUFVCTElDIEdMYm9vbGVhbiBYRjg2RFJJRGVzdHJveURyYXdhYmxlKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwKKyAgICBYSUQgZHJhd2FibGUgKQorewogICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheSAoZHB5KTsKICAgICB4WEY4NkRSSURlc3Ryb3lEcmF3YWJsZVJlcSAqcmVxOworICAgIGludCAoKm9sZFhFcnJvckhhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKik7CiAKICAgICBUUkFDRSgiRGVzdHJveURyYXdhYmxlLi4uIik7CiAgICAgWEY4NkRSSUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIEZhbHNlKTsKIAorICAgIC8qIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIERSSSBkcml2ZXIsIHdoaWNoIHVzZWQgY2FsbCBpdCBsaWtlIHRoaXMKKyAgICAgKgorICAgICAqICAgaWYgKHdpbmRvd0V4aXN0cyhkcmF3YWJsZSkpCisgICAgICogICAgIGRlc3Ryb3lEcmF3YWJsZShkcmF3YWJsZSk7CisgICAgICoKKyAgICAgKiB3aGljaCBpcyBhIHRleHRib29rIHJhY2UgY29uZGl0aW9uIC0gdGhlIHdpbmRvdyBtYXkgZGlzYXBwZWFyCisgICAgICogZnJvbSB0aGUgc2VydmVyIGJldHdlZW4gY2hlY2tpbmcgZm9yIGl0cyBleGlzdGFuY2UgYW5kCisgICAgICogZGVzdHJveWluZyBpdC4gIEluc3RlYWQgd2UgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YKKyAgICAgKiBfX0RSSWludGVyZmFjZU1ldGhvZHNSZWM6OmRlc3Ryb3lEcmF3YWJsZSgpIHRvIHN1Y2NlZWQgZXZlbiBpZgorICAgICAqIHRoZSB3aW5kb3dzIGlzIGdvbmUsIGJ5IHdyYXBwaW5nIHRoZSBkZXN0cm95IGNhbGwgaW4gYW4gZXJyb3IKKyAgICAgKiBoYW5kbGVyLiAqLworCisgICAgWFN5bmMoZHB5LCBHTF9GQUxTRSk7CisgICAgb2xkWEVycm9ySGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIobm9vcEVycm9ySGFuZGxlcik7CisKICAgICBMb2NrRGlzcGxheShkcHkpOwogICAgIEdldFJlcShYRjg2RFJJRGVzdHJveURyYXdhYmxlLCByZXEpOwogICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CkBAIC00NDQsNiArNDYyLDkgQEAKICAgICByZXEtPmRyYXdhYmxlID0gZHJhd2FibGU7CiAgICAgVW5sb2NrRGlzcGxheShkcHkpOwogICAgIFN5bmNIYW5kbGUoKTsKKworICAgIFhTZXRFcnJvckhhbmRsZXIob2xkWEVycm9ySGFuZGxlcik7CisKICAgICBUUkFDRSgiRGVzdHJveURyYXdhYmxlLi4uIHJldHVybiBUcnVlIik7CiAgICAgcmV0dXJuIFRydWU7CiB9CmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9kcmkyLmMgYi9zcmMvZ2x4L3gxMS9kcmkyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNDRhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHgveDExL2RyaTIuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdC0KKyAqIHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQKKyAqIGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnQtCisgKiB3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbgorICogbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMLQorICogSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZCisgKiBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4KKyAqIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRS0KKyAqIFFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUi0KKyAqIE1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsCisgKiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCisgKiBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mCisgKiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKyAqCisgKiBBdXRob3JzOgorICogICBLcmlzdGlhbiBIw7hnc2JlcmcgKGtyaEByZWRoYXQuY29tKQorICovCisKKworI2RlZmluZSBORUVEX1JFUExJRVMKKyNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hleHQuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZHJpMnByb3RvLmg+CisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAiZHJpMi5oIgorCitzdGF0aWMgY2hhciBkcmkyRXh0ZW5zaW9uTmFtZVtdID0gRFJJMl9OQU1FOworc3RhdGljIFhFeHRlbnNpb25JbmZvICpkcmkySW5mbzsKK3N0YXRpYyBYRVhUX0dFTkVSQVRFX0NMT1NFX0RJU1BMQVkgKERSSTJDbG9zZURpc3BsYXksIGRyaTJJbmZvKQorc3RhdGljIC8qIGNvbnN0ICovIFhFeHRlbnNpb25Ib29rcyBkcmkyRXh0ZW5zaW9uSG9va3MgPSB7CisgICAgTlVMTCwJCQkJLyogY3JlYXRlX2djICovCisgICAgTlVMTCwJCQkJLyogY29weV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGZsdXNoX2djICovCisgICAgTlVMTCwJCQkJLyogZnJlZV9nYyAqLworICAgIE5VTEwsCQkJCS8qIGNyZWF0ZV9mb250ICovCisgICAgTlVMTCwJCQkJLyogZnJlZV9mb250ICovCisgICAgRFJJMkNsb3NlRGlzcGxheSwJCQkvKiBjbG9zZV9kaXNwbGF5ICovCisgICAgTlVMTCwJCQkJLyogd2lyZV90b19ldmVudCAqLworICAgIE5VTEwsCQkJCS8qIGV2ZW50X3RvX3dpcmUgKi8KKyAgICBOVUxMLAkJCQkvKiBlcnJvciAqLworICAgIE5VTEwsCQkJCS8qIGVycm9yX3N0cmluZyAqLworfTsKKworc3RhdGljIFhFWFRfR0VORVJBVEVfRklORF9ESVNQTEFZIChEUkkyRmluZERpc3BsYXksIGRyaTJJbmZvLCAKKwkJCQkgICBkcmkyRXh0ZW5zaW9uTmFtZSwgCisJCQkJICAgJmRyaTJFeHRlbnNpb25Ib29rcywgCisJCQkJICAgMCwgTlVMTCkKKworQm9vbCBEUkkyUXVlcnlFeHRlbnNpb24oRGlzcGxheSAqZHB5LCBpbnQgKmV2ZW50QmFzZSwgaW50ICplcnJvckJhc2UpCit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gRFJJMkZpbmREaXNwbGF5KGRweSk7CisKKyAgICBpZiAoWGV4dEhhc0V4dGVuc2lvbihpbmZvKSkgeworCSpldmVudEJhc2UgPSBpbmZvLT5jb2Rlcy0+Zmlyc3RfZXZlbnQ7CisJKmVycm9yQmFzZSA9IGluZm8tPmNvZGVzLT5maXJzdF9lcnJvcjsKKwlyZXR1cm4gVHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gRmFsc2U7Cit9CisKK0Jvb2wgRFJJMlF1ZXJ5VmVyc2lvbihEaXNwbGF5ICpkcHksIGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gRFJJMkZpbmREaXNwbGF5IChkcHkpOworICAgIHhEUkkyUXVlcnlWZXJzaW9uUmVwbHkgcmVwOworICAgIHhEUkkyUXVlcnlWZXJzaW9uUmVxICpyZXE7CisKKyAgICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgZHJpMkV4dGVuc2lvbk5hbWUsIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKERSSTJRdWVyeVZlcnNpb24sIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaTJSZXFUeXBlID0gWF9EUkkyUXVlcnlWZXJzaW9uOworICAgIHJlcS0+bWFqb3JWZXJzaW9uID0gRFJJMl9NQUpPUjsKKyAgICByZXEtPm1pbm9yVmVyc2lvbiA9IERSSTJfTUlOT1I7CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgKm1ham9yID0gcmVwLm1ham9yVmVyc2lvbjsKKyAgICAqbWlub3IgPSByZXAubWlub3JWZXJzaW9uOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbCBEUkkyQ29ubmVjdChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCisJCSBjaGFyICoqZHJpdmVyTmFtZSwgY2hhciAqKmJ1c0lkLCB1bnNpZ25lZCBpbnQgKnNhcmVhSGFuZGxlKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IERSSTJGaW5kRGlzcGxheShkcHkpOworICAgIHhEUkkyQ29ubmVjdFJlcGx5IHJlcDsKKyAgICB4RFJJMkNvbm5lY3RSZXEgKnJlcTsKKworICAgIFhleHRDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBkcmkyRXh0ZW5zaW9uTmFtZSwgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoRFJJMkNvbm5lY3QsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaTJSZXFUeXBlID0gWF9EUkkyQ29ubmVjdDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgICpzYXJlYUhhbmRsZSA9IHJlcC5zYXJlYUhhbmRsZTsKKworICAgICpkcml2ZXJOYW1lID0gWG1hbGxvYyhyZXAuZHJpdmVyTmFtZUxlbmd0aCArIDEpOworICAgIGlmICgqZHJpdmVyTmFtZSA9PSBOVUxMKSB7CisJX1hFYXREYXRhKGRweSwgCisJCSAgKChyZXAuZHJpdmVyTmFtZUxlbmd0aCArIDMpICYgfjMpICsKKwkJICAoKHJlcC5idXNJZExlbmd0aCArIDMpICYgfjMpKTsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgX1hSZWFkUGFkKGRweSwgKmRyaXZlck5hbWUsIHJlcC5kcml2ZXJOYW1lTGVuZ3RoKTsKKyAgICAoKmRyaXZlck5hbWUpW3JlcC5kcml2ZXJOYW1lTGVuZ3RoXSA9ICdcMCc7CisKKyAgICAqYnVzSWQgPSBYbWFsbG9jKHJlcC5idXNJZExlbmd0aCArIDEpOworICAgIGlmICgqYnVzSWQgPT0gTlVMTCkgeworCVhmcmVlKCpkcml2ZXJOYW1lKTsKKwlfWEVhdERhdGEoZHB5LCAoKHJlcC5idXNJZExlbmd0aCArIDMpICYgfjMpKTsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgX1hSZWFkUGFkKGRweSwgKmJ1c0lkLCByZXAuYnVzSWRMZW5ndGgpOworICAgICgqYnVzSWQpW3JlcC5idXNJZExlbmd0aF0gPSAnXDAnOworCisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKworICAgIHJldHVybiByZXAuc2FyZWFIYW5kbGUgIT0gMDsKK30KKworQm9vbCBEUkkyQXV0aENvbm5lY3Rpb24oRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBkcm1fbWFnaWNfdCBtYWdpYykKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBEUkkyRmluZERpc3BsYXkoZHB5KTsKKyAgICB4RFJJMkF1dGhDb25uZWN0aW9uUmVxICpyZXE7CisgICAgeERSSTJBdXRoQ29ubmVjdGlvblJlcGx5IHJlcDsKKworICAgIFhleHRDaGVja0V4dGVuc2lvbiAoZHB5LCBpbmZvLCBkcmkyRXh0ZW5zaW9uTmFtZSwgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoRFJJMkF1dGhDb25uZWN0aW9uLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kcmkyUmVxVHlwZSA9IFhfRFJJMkF1dGhDb25uZWN0aW9uOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+bWFnaWMgPSBtYWdpYzsKKyAgICByZXAuYXV0aGVudGljYXRlZCA9IDA7CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKwlVbmxvY2tEaXNwbGF5KGRweSk7CisJU3luY0hhbmRsZSgpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKworICAgIHJldHVybiByZXAuYXV0aGVudGljYXRlZDsKK30KKworQm9vbCBEUkkyQ3JlYXRlRHJhd2FibGUoRGlzcGxheSAqZHB5LCBYSUQgZHJhd2FibGUsCisJCQl1bnNpZ25lZCBpbnQgKmhhbmRsZSwgdW5zaWduZWQgaW50ICpoZWFkKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IERSSTJGaW5kRGlzcGxheShkcHkpOworICAgIHhEUkkyQ3JlYXRlRHJhd2FibGVSZXBseSByZXA7CisgICAgeERSSTJDcmVhdGVEcmF3YWJsZVJlcSAqcmVxOworCisgICAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIGRyaTJFeHRlbnNpb25OYW1lLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShEUkkyQ3JlYXRlRHJhd2FibGUsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaTJSZXFUeXBlID0gWF9EUkkyQ3JlYXRlRHJhd2FibGU7CisgICAgcmVxLT5kcmF3YWJsZSA9IGRyYXdhYmxlOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisKKyAgICAqaGFuZGxlID0gcmVwLmhhbmRsZTsKKyAgICAqaGVhZCA9IHJlcC5oZWFkOworCisgICAgcmV0dXJuIFRydWU7Cit9CisKK3ZvaWQgRFJJMkRlc3Ryb3lEcmF3YWJsZShEaXNwbGF5ICpkcHksIFhJRCBkcmF3YWJsZSkKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBEUkkyRmluZERpc3BsYXkoZHB5KTsKKyAgICB4RFJJMkRlc3Ryb3lEcmF3YWJsZVJlcSAqcmVxOworCisgICAgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uIChkcHksIGluZm8sIGRyaTJFeHRlbnNpb25OYW1lKTsKKworICAgIFhTeW5jKGRweSwgR0xfRkFMU0UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoRFJJMkRlc3Ryb3lEcmF3YWJsZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpMlJlcVR5cGUgPSBYX0RSSTJEZXN0cm95RHJhd2FibGU7CisgICAgcmVxLT5kcmF3YWJsZSA9IGRyYXdhYmxlOworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7Cit9CisKK0Jvb2wgRFJJMlJlZW1pdERyYXdhYmxlSW5mbyhEaXNwbGF5ICpkcHksIFhJRCBkcmF3YWJsZSwgdW5zaWduZWQgaW50ICpoZWFkKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IERSSTJGaW5kRGlzcGxheShkcHkpOworICAgIHhEUkkyUmVlbWl0RHJhd2FibGVJbmZvUmVwbHkgcmVwOworICAgIHhEUkkyUmVlbWl0RHJhd2FibGVJbmZvUmVxICpyZXE7CisKKyAgICBYZXh0Q2hlY2tFeHRlbnNpb24gKGRweSwgaW5mbywgZHJpMkV4dGVuc2lvbk5hbWUsIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKERSSTJSZWVtaXREcmF3YWJsZUluZm8sIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaTJSZXFUeXBlID0gWF9EUkkyUmVlbWl0RHJhd2FibGVJbmZvOworICAgIHJlcS0+ZHJhd2FibGUgPSBkcmF3YWJsZTsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworCisgICAgKmhlYWQgPSByZXAuaGVhZDsKKworICAgIHJldHVybiBUcnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZHJpMi5oIGIvc3JjL2dseC94MTEvZHJpMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmQwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x4L3gxMS9kcmkyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3LDIwMDggUmVkIEhhdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0LQorICogd2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dAorICogbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdC0KKyAqIHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uCisgKiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUwtCisgKiBJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkKKyAqIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTgorICogVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFLQorICogUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9SLQorICogTUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBhIGNvcHlyaWdodCBob2xkZXIgc2hhbGwKKyAqIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKKyAqIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YKKyAqIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorICoKKyAqIEF1dGhvcnM6CisgKiAgIEtyaXN0aWFuIEjDuGdzYmVyZyAoa3JoQHJlZGhhdC5jb20pCisgKi8KKworI2lmbmRlZiBfRFJJMl9IXworI2RlZmluZSBfRFJJMl9IXworCitleHRlcm4gQm9vbAorRFJJMlF1ZXJ5RXh0ZW5zaW9uKERpc3BsYXkgKmRpc3BsYXksIGludCAqZXZlbnRCYXNlLCBpbnQgKmVycm9yQmFzZSk7CitleHRlcm4gQm9vbAorRFJJMlF1ZXJ5VmVyc2lvbihEaXNwbGF5ICpkaXNwbGF5LCBpbnQgKm1ham9yLCBpbnQgKm1pbm9yKTsKK2V4dGVybiBCb29sCitEUkkyQ29ubmVjdChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLAorCSAgICBjaGFyICoqZHJpdmVyTmFtZSwgY2hhciAqKmJ1c0lkLCB1bnNpZ25lZCBpbnQgKnNhcmVhSGFuZGxlKTsKK2V4dGVybiBCb29sCitEUkkyQXV0aENvbm5lY3Rpb24oRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgZHJtX21hZ2ljX3QgbWFnaWMpOworZXh0ZXJuIEJvb2wKK0RSSTJDcmVhdGVEcmF3YWJsZShEaXNwbGF5ICpkaXNwbGF5LCBYSUQgZHJhd2FibGUsCisJCSAgIHVuc2lnbmVkIGludCAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgKmhlYWQpOworZXh0ZXJuIHZvaWQKK0RSSTJEZXN0cm95RHJhd2FibGUoRGlzcGxheSAqZGlzcGxheSwgWElEIGhhbmRsZSk7CitleHRlcm4gQm9vbAorRFJJMlJlZW1pdERyYXdhYmxlSW5mbyhEaXNwbGF5ICpkcHksIFhJRCBoYW5kbGUsIHVuc2lnbmVkIGludCAqaGVhZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZHJpMl9nbHguYyBiL3NyYy9nbHgveDExL2RyaTJfZ2x4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlNjViYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHgveDExL2RyaTJfZ2x4LmMKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBSZWQgSGF0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnQtCisgKiB3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0CisgKiBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0LQorICogd2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24KKyAqIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTC0KKyAqIElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWQorICogUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOCisgKiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0UtCisgKiBRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1ItCisgKiBNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbAorICogbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorICogb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZgorICogdGhlIGNvcHlyaWdodCBob2xkZXIuCisgKgorICogQXV0aG9yczoKKyAqICAgS3Jpc3RpYW4gSMO4Z3NiZXJnIChrcmhAcmVkaGF0LmNvbSkKKyAqLworCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGZpeGVzLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGRhbWFnZS5oPgorI2luY2x1ZGUgImdsaGVhZGVyLmgiCisjaW5jbHVkZSAiZ2x4Y2xpZW50LmgiCisjaW5jbHVkZSAiZ2xjb250ZXh0bW9kZXMuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJpLmgiCisjaW5jbHVkZSAic2FyZWEuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImRyaTIuaCIKKyNpbmNsdWRlICJkcmlfY29tbW9uLmgiCisKK3R5cGVkZWYgc3RydWN0IF9fR0xYRFJJZGlzcGxheVByaXZhdGVSZWMgX19HTFhEUklkaXNwbGF5UHJpdmF0ZTsKK3R5cGVkZWYgc3RydWN0IF9fR0xYRFJJY29udGV4dFByaXZhdGVSZWMgX19HTFhEUkljb250ZXh0UHJpdmF0ZTsKKworc3RydWN0IF9fR0xYRFJJZGlzcGxheVByaXZhdGVSZWMgeworICAgIF9fR0xYRFJJZGlzcGxheSBiYXNlOworCisgICAgLyoKKyAgICAqKiBYRnJlZTg2LURSSSB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICAgKi8KKyAgICBpbnQgZHJpTWFqb3I7CisgICAgaW50IGRyaU1pbm9yOworICAgIGludCBkcmlQYXRjaDsKK307CisKK3N0cnVjdCBfX0dMWERSSWNvbnRleHRQcml2YXRlUmVjIHsKKyAgICBfX0dMWERSSWNvbnRleHQgYmFzZTsKKyAgICBfX0RSSWNvbnRleHQgKmRyaUNvbnRleHQ7CisgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2M7Cit9OworCitzdGF0aWMgdm9pZCBkcmkyRGVzdHJveUNvbnRleHQoX19HTFhEUkljb250ZXh0ICpjb250ZXh0LAorCQkJICAgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2MsIERpc3BsYXkgKmRweSkKK3sKKyAgICBfX0dMWERSSWNvbnRleHRQcml2YXRlICpwY3AgPSAoX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqKSBjb250ZXh0OworICAgIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSA9IHBjcC0+cHNjLT5jb3JlOworCisgICAgKCpjb3JlLT5kZXN0cm95Q29udGV4dCkocGNwLT5kcmlDb250ZXh0KTsKKworICAgIFhmcmVlKHBjcCk7Cit9CisKK3N0YXRpYyBCb29sIGRyaTJCaW5kQ29udGV4dChfX0dMWERSSWNvbnRleHQgKmNvbnRleHQsCisJCQkgICBfX0dMWERSSWRyYXdhYmxlICpkcmF3LCBfX0dMWERSSWRyYXdhYmxlICpyZWFkKQoreworICAgIF9fR0xYRFJJY29udGV4dFByaXZhdGUgKnBjcCA9IChfX0dMWERSSWNvbnRleHRQcml2YXRlICopIGNvbnRleHQ7CisgICAgY29uc3QgX19EUkljb3JlRXh0ZW5zaW9uICpjb3JlID0gcGNwLT5wc2MtPmNvcmU7CisKKyAgICByZXR1cm4gKCpjb3JlLT5iaW5kQ29udGV4dCkocGNwLT5kcmlDb250ZXh0LAorCQkJCWRyYXctPmRyaURyYXdhYmxlLAorCQkJCXJlYWQtPmRyaURyYXdhYmxlKTsKK30KKworc3RhdGljIHZvaWQgZHJpMlVuYmluZENvbnRleHQoX19HTFhEUkljb250ZXh0ICpjb250ZXh0KQoreworICAgIF9fR0xYRFJJY29udGV4dFByaXZhdGUgKnBjcCA9IChfX0dMWERSSWNvbnRleHRQcml2YXRlICopIGNvbnRleHQ7CisgICAgY29uc3QgX19EUkljb3JlRXh0ZW5zaW9uICpjb3JlID0gcGNwLT5wc2MtPmNvcmU7CisKKyAgICAoKmNvcmUtPnVuYmluZENvbnRleHQpKHBjcC0+ZHJpQ29udGV4dCk7Cit9CisKK3N0YXRpYyBfX0dMWERSSWNvbnRleHQgKmRyaTJDcmVhdGVDb250ZXh0KF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLAorCQkJCQkgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZSwKKwkJCQkJIEdMWENvbnRleHQgZ2MsCisJCQkJCSBHTFhDb250ZXh0IHNoYXJlTGlzdCwgaW50IHJlbmRlclR5cGUpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwLCAqcGNwX3NoYXJlZDsKKyAgICBfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKmNvbmZpZyA9IChfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKikgbW9kZTsKKyAgICBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUgPSBwc2MtPmNvcmU7CisgICAgX19EUkljb250ZXh0ICpzaGFyZWQgPSBOVUxMOworCisgICAgaWYgKHNoYXJlTGlzdCkgeworCXBjcF9zaGFyZWQgPSAoX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqKSBzaGFyZUxpc3QtPmRyaUNvbnRleHQ7CisJc2hhcmVkID0gcGNwX3NoYXJlZC0+ZHJpQ29udGV4dDsKKyAgICB9CisKKyAgICBwY3AgPSBYbWFsbG9jKHNpemVvZiAqcGNwKTsKKyAgICBpZiAocGNwID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBwY3AtPnBzYyA9IHBzYzsKKyAgICBwY3AtPmRyaUNvbnRleHQgPSAKKwkoKmNvcmUtPmNyZWF0ZU5ld0NvbnRleHQpKHBzYy0+X19kcmlTY3JlZW4sCisJCQkJICBjb25maWctPmRyaUNvbmZpZywgc2hhcmVkLCBwY3ApOworICAgIGdjLT5fX2RyaUNvbnRleHQgPSBwY3AtPmRyaUNvbnRleHQ7CisKKyAgICBpZiAocGNwLT5kcmlDb250ZXh0ID09IE5VTEwpIHsKKwlYZnJlZShwY3ApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHBjcC0+YmFzZS5kZXN0cm95Q29udGV4dCA9IGRyaTJEZXN0cm95Q29udGV4dDsKKyAgICBwY3AtPmJhc2UuYmluZENvbnRleHQgPSBkcmkyQmluZENvbnRleHQ7CisgICAgcGNwLT5iYXNlLnVuYmluZENvbnRleHQgPSBkcmkyVW5iaW5kQ29udGV4dDsKKworICAgIHJldHVybiAmcGNwLT5iYXNlOworfQorCitzdGF0aWMgdm9pZCBkcmkyRGVzdHJveURyYXdhYmxlKF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3KQoreworICAgIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSA9IHBkcmF3LT5wc2MtPmNvcmU7CisKKyAgICAoKmNvcmUtPmRlc3Ryb3lEcmF3YWJsZSkocGRyYXctPmRyaURyYXdhYmxlKTsKKyAgICBEUkkyRGVzdHJveURyYXdhYmxlKHBkcmF3LT5wc2MtPmRweSwgcGRyYXctPmRyYXdhYmxlKTsKKyAgICBYZnJlZShwZHJhdyk7Cit9CisKK3N0YXRpYyBfX0dMWERSSWRyYXdhYmxlICpkcmkyQ3JlYXRlRHJhd2FibGUoX19HTFhzY3JlZW5Db25maWdzICpwc2MsCisJCQkJCSAgICBYSUQgeERyYXdhYmxlLAorCQkJCQkgICAgR0xYRHJhd2FibGUgZHJhd2FibGUsCisJCQkJCSAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICptb2RlcykKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdzsKKyAgICBfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKmNvbmZpZyA9IChfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKikgbW9kZXM7CisgICAgdW5zaWduZWQgaW50IGhhbmRsZSwgaGVhZDsKKyAgICBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUgPSBwc2MtPmNvcmU7CisKKyAgICBwZHJhdyA9IFhtYWxsb2Moc2l6ZW9mKCpwZHJhdykpOworICAgIGlmICghcGRyYXcpCisJcmV0dXJuIE5VTEw7CisKKyAgICBwZHJhdy0+ZGVzdHJveURyYXdhYmxlID0gZHJpMkRlc3Ryb3lEcmF3YWJsZTsKKyAgICBwZHJhdy0+eERyYXdhYmxlID0geERyYXdhYmxlOworICAgIHBkcmF3LT5kcmF3YWJsZSA9IGRyYXdhYmxlOworICAgIHBkcmF3LT5wc2MgPSBwc2M7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgRFJJMkNyZWF0ZURyYXdhYmxlLCBYSUQgMHglbHgsIEdMWCBJRCAweCVseFxuIiwKKwkgICAgeERyYXdhYmxlLCBkcmF3YWJsZSk7CisKKyAgICBpZiAoIURSSTJDcmVhdGVEcmF3YWJsZShwc2MtPmRweSwgeERyYXdhYmxlLCAmaGFuZGxlLCAmaGVhZCkpIHsKKwlYZnJlZShwZHJhdyk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsICJzdWNjZXNzLCBoZWFkIDB4JXgsIGhhbmRsZSAweCV4XG4iLCBoZWFkLCBoYW5kbGUpOworCisgICAgLyogQ3JlYXRlIGEgbmV3IGRyYXdhYmxlICovCisgICAgcGRyYXctPmRyaURyYXdhYmxlID0KKwkoKmNvcmUtPmNyZWF0ZU5ld0RyYXdhYmxlKShwc2MtPl9fZHJpU2NyZWVuLAorCQkJCSAgIGNvbmZpZy0+ZHJpQ29uZmlnLAorCQkJCSAgIGhhbmRsZSwKKwkJCQkgICBoZWFkLAorCQkJCSAgIHBkcmF3KTsKKworICAgIGlmICghcGRyYXctPmRyaURyYXdhYmxlKSB7CisJRFJJMkRlc3Ryb3lEcmF3YWJsZShwc2MtPmRweSwgZHJhd2FibGUpOworCVhmcmVlKHBkcmF3KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGRyYXc7Cit9CisKK3N0YXRpYyB2b2lkIGRyaTJEZXN0cm95U2NyZWVuKF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjKQoreworICAgIC8qIEZyZWUgdGhlIGRpcmVjdCByZW5kZXJpbmcgcGVyIHNjcmVlbiBkYXRhICovCisgICAgKCpwc2MtPmNvcmUtPmRlc3Ryb3lTY3JlZW4pKHBzYy0+X19kcmlTY3JlZW4pOworICAgIGRybUNsb3NlKHBzYy0+ZmQpOworICAgIHBzYy0+X19kcmlTY3JlZW4gPSBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGRyaTJSZWVtaXREcmF3YWJsZUluZm8oX19EUklkcmF3YWJsZSAqZHJhdywgdW5zaWduZWQgaW50ICp0YWlsLAorCQkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKQoreworICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gbG9hZGVyUHJpdmF0ZTsKKworICAgIERSSTJSZWVtaXREcmF3YWJsZUluZm8ocGRyYXctPnBzYy0+ZHB5LCBwZHJhdy0+ZHJhd2FibGUsIHRhaWwpOworfQorCitzdGF0aWMgdm9pZCBkcmkyUG9zdERhbWFnZShfX0RSSWRyYXdhYmxlICpkcmF3LAorCQkJICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzLAorCQkJICAgaW50IG51bVJlY3RzLCB2b2lkICpsb2FkZXJQcml2YXRlKQoreyAKKyAgICBYUmVjdGFuZ2xlICp4cmVjdHM7CisgICAgWHNlcnZlclJlZ2lvbiByZWdpb247CisgICAgX19HTFhEUklkcmF3YWJsZSAqZ2x4RHJhdyA9IGxvYWRlclByaXZhdGU7CisgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2MgPSBnbHhEcmF3LT5wc2M7CisgICAgRGlzcGxheSAqZHB5ID0gcHNjLT5kcHk7CisgICAgaW50IGk7CisKKyAgICB4cmVjdHMgPSBtYWxsb2Moc2l6ZW9mKFhSZWN0YW5nbGUpICogbnVtUmVjdHMpOworICAgIGlmICh4cmVjdHMgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdHM7IGkrKykgeworCXhyZWN0c1tpXS54ID0gcmVjdHNbaV0ueDE7CisJeHJlY3RzW2ldLnkgPSByZWN0c1tpXS55MTsKKwl4cmVjdHNbaV0ud2lkdGggPSByZWN0c1tpXS54MiAtIHJlY3RzW2ldLngxOworCXhyZWN0c1tpXS5oZWlnaHQgPSByZWN0c1tpXS55MiAtIHJlY3RzW2ldLnkxOworICAgIH0KKyAgICByZWdpb24gPSBYRml4ZXNDcmVhdGVSZWdpb24oZHB5LCB4cmVjdHMsIG51bVJlY3RzKTsKKyAgICBmcmVlKHhyZWN0cyk7CisgICAgWERhbWFnZUFkZChkcHksIGdseERyYXctPnhEcmF3YWJsZSwgcmVnaW9uKTsKKyAgICBYRml4ZXNEZXN0cm95UmVnaW9uKGRweSwgcmVnaW9uKTsKK30KKworc3RhdGljIGNvbnN0IF9fRFJJbG9hZGVyRXh0ZW5zaW9uIGRyaTJMb2FkZXJFeHRlbnNpb24gPSB7CisgICAgeyBfX0RSSV9MT0FERVIsIF9fRFJJX0xPQURFUl9WRVJTSU9OIH0sCisgICAgZHJpMlJlZW1pdERyYXdhYmxlSW5mbywKKyAgICBkcmkyUG9zdERhbWFnZQorfTsKKworc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpsb2FkZXJfZXh0ZW5zaW9uc1tdID0geworICAgICZkcmkyTG9hZGVyRXh0ZW5zaW9uLmJhc2UsCisgICAgJnN5c3RlbVRpbWVFeHRlbnNpb24uYmFzZSwKKyAgICBOVUxMCit9OworCitzdGF0aWMgX19HTFhEUklzY3JlZW4gKmRyaTJDcmVhdGVTY3JlZW4oX19HTFhzY3JlZW5Db25maWdzICpwc2MsIGludCBzY3JlZW4sCisJCQkJCV9fR0xYZGlzcGxheVByaXZhdGUgKnByaXYpCit7CisgICAgY29uc3QgX19EUkljb25maWcgKipkcml2ZXJfY29uZmlnczsKKyAgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnM7CisgICAgX19HTFhEUklzY3JlZW4gKnBzcDsKKyAgICB1bnNpZ25lZCBpbnQgc2FyZWFIYW5kbGU7CisgICAgY2hhciAqZHJpdmVyTmFtZSwgKmJ1c0lEOworICAgIGRybV9tYWdpY190IG1hZ2ljOworICAgIGludCBpOworCisgICAgcHNwID0gWG1hbGxvYyhzaXplb2YgKnBzcCk7CisgICAgaWYgKHBzcCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgLyogSW5pdGlhbGl6ZSBwZXIgc2NyZWVuIGR5bmFtaWMgY2xpZW50IEdMWCBleHRlbnNpb25zICovCisgICAgcHNjLT5leHRfbGlzdF9maXJzdF90aW1lID0gR0xfVFJVRTsKKworICAgIGlmICghRFJJMkNvbm5lY3QocHNjLT5kcHksIHNjcmVlbiwgJmRyaXZlck5hbWUsICZidXNJRCwgJnNhcmVhSGFuZGxlKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIHBzYy0+ZHJpdmVyID0gZHJpT3BlbkRyaXZlcihkcml2ZXJOYW1lKTsKKyAgICBpZiAocHNjLT5kcml2ZXIgPT0gTlVMTCkKKwlnb3RvIGhhbmRsZV9lcnJvcjsKKworICAgIGV4dGVuc2lvbnMgPSBkbHN5bShwc2MtPmRyaXZlciwgX19EUklfRFJJVkVSX0VYVEVOU0lPTlMpOworICAgIGlmIChleHRlbnNpb25zID09IE5VTEwpIHsKKwlFcnJvck1lc3NhZ2VGKCJkcml2ZXIgZXhwb3J0cyBubyBleHRlbnNpb25zICglcylcbiIsIGRsZXJyb3IoKSk7CisJZ290byBoYW5kbGVfZXJyb3I7CisgICAgfQorICAgIAorICAgIGZvciAoaSA9IDA7IGV4dGVuc2lvbnNbaV07IGkrKykgeworCWlmIChzdHJjbXAoZXh0ZW5zaW9uc1tpXS0+bmFtZSwgX19EUklfQ09SRSkgPT0gMCkKKwkgICAgcHNjLT5jb3JlID0gKF9fRFJJY29yZUV4dGVuc2lvbiAqKSBleHRlbnNpb25zW2ldOworICAgIH0KKworICAgIGlmIChwc2MtPmNvcmUgPT0gTlVMTCkgeworCUVycm9yTWVzc2FnZUYoImNvcmUgZHJpIGV4dGVuc2lvbiBub3QgZm91bmRcbiIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIHBzYy0+ZmQgPSBkcm1PcGVuKE5VTEwsIGJ1c0lEKTsKKyAgICBpZiAocHNjLT5mZCA8IDApIHsKKwlFcnJvck1lc3NhZ2VGKCJmYWlsZWQgdG8gb3BlbiBkcm0gZGV2aWNlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZHJtR2V0TWFnaWMocHNjLT5mZCwgJm1hZ2ljKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghRFJJMkF1dGhDb25uZWN0aW9uKHBzYy0+ZHB5LCBzY3JlZW4sIG1hZ2ljKSkgeworCUVycm9yTWVzc2FnZUYoImZhaWxlZCB0byBhdXRoZW50aWNhdGUgZHJtIGFjY2Vzc1xuIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHNjLT5fX2RyaVNjcmVlbiA9IAorCXBzYy0+Y29yZS0+Y3JlYXRlTmV3U2NyZWVuKHNjcmVlbiwgcHNjLT5mZCwgc2FyZWFIYW5kbGUsCisJCQkJICAgbG9hZGVyX2V4dGVuc2lvbnMsICZkcml2ZXJfY29uZmlncywgcHNjKTsKKyAgICBpZiAocHNjLT5fX2RyaVNjcmVlbiA9PSBOVUxMKSB7CisJRXJyb3JNZXNzYWdlRigiZmFpbGVkIHRvIGNyZWF0ZSBkcmkgc2NyZWVuXG4iKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkcmlCaW5kRXh0ZW5zaW9ucyhwc2MsIDEpOworCisgICAgcHNjLT5jb25maWdzID0gZHJpQ29udmVydENvbmZpZ3MocHNjLT5jb3JlLCBwc2MtPmNvbmZpZ3MsIGRyaXZlcl9jb25maWdzKTsKKyAgICBwc2MtPnZpc3VhbHMgPSBkcmlDb252ZXJ0Q29uZmlncyhwc2MtPmNvcmUsIHBzYy0+dmlzdWFscywgZHJpdmVyX2NvbmZpZ3MpOworCisgICAgcHNwLT5kZXN0cm95U2NyZWVuID0gZHJpMkRlc3Ryb3lTY3JlZW47CisgICAgcHNwLT5jcmVhdGVDb250ZXh0ID0gZHJpMkNyZWF0ZUNvbnRleHQ7CisgICAgcHNwLT5jcmVhdGVEcmF3YWJsZSA9IGRyaTJDcmVhdGVEcmF3YWJsZTsKKworICAgIFhmcmVlKGRyaXZlck5hbWUpOworICAgIFhmcmVlKGJ1c0lEKTsKKworICAgIHJldHVybiBwc3A7CisKKyBoYW5kbGVfZXJyb3I6CisgICAgWGZyZWUoZHJpdmVyTmFtZSk7CisgICAgWGZyZWUoYnVzSUQpOworCisgICAgLyogRklYTUU6IGNsZWFuIHVwIGhlcmUgKi8KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiBDYWxsZWQgZnJvbSBfX2dsWEZyZWVEaXNwbGF5UHJpdmF0ZS4KKyAqLworc3RhdGljIHZvaWQgZHJpMkRlc3Ryb3lEaXNwbGF5KF9fR0xYRFJJZGlzcGxheSAqZHB5KQoreworICAgIFhmcmVlKGRweSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSwgaW5pdGlhbGl6ZSBhbmQgcmV0dXJuIGEgX19EUklkaXNwbGF5UHJpdmF0ZSBvYmplY3QuCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIF9fZ2xYSW5pdGlhbGl6ZSgpIHdoZW4gd2UgYXJlIGdpdmVuIGEgbmV3CisgKiBkaXNwbGF5IHBvaW50ZXIuCisgKi8KK19YX0hJRERFTiBfX0dMWERSSWRpc3BsYXkgKmRyaTJDcmVhdGVEaXNwbGF5KERpc3BsYXkgKmRweSkKK3sKKyAgICBfX0dMWERSSWRpc3BsYXlQcml2YXRlICpwZHA7CisgICAgaW50IGV2ZW50QmFzZSwgZXJyb3JCYXNlOworCisgICAgaWYgKCFEUkkyUXVlcnlFeHRlbnNpb24oZHB5LCAmZXZlbnRCYXNlLCAmZXJyb3JCYXNlKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIHBkcCA9IFhtYWxsb2Moc2l6ZW9mICpwZHApOworICAgIGlmIChwZHAgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghRFJJMlF1ZXJ5VmVyc2lvbihkcHksICZwZHAtPmRyaU1ham9yLCAmcGRwLT5kcmlNaW5vcikpIHsKKwlYZnJlZShwZHApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHBkcC0+ZHJpUGF0Y2ggPSAwOworCisgICAgcGRwLT5iYXNlLmRlc3Ryb3lEaXNwbGF5ID0gZHJpMkRlc3Ryb3lEaXNwbGF5OworICAgIHBkcC0+YmFzZS5jcmVhdGVTY3JlZW4gPSBkcmkyQ3JlYXRlU2NyZWVuOworCisgICAgcmV0dXJuICZwZHAtPmJhc2U7Cit9CisKKyNlbmRpZiAvKiBHTFhfRElSRUNUX1JFTkRFUklORyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZHJpX2NvbW1vbi5jIGIvc3JjL2dseC94MTEvZHJpX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzVmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x4L3gxMS9kcmlfY29tbW9uLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0xOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCDCqSAyMDA4IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdC0KKyAqIHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQKKyAqIGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnQtCisgKiB3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbgorICogbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMLQorICogSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZCisgKiBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4KKyAqIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRS0KKyAqIFFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUi0KKyAqIE1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsCisgKiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCisgKiBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mCisgKiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKyAqCisgKiBBdXRob3JzOgorICogICBLZXZpbiBFLiBNYXJ0aW4gPGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tPgorICogICBCcmlhbiBQYXVsIDxicmlhbkBwcmVjaXNpb25pbnNpZ2h0LmNvbT4KKyAqICAgS3Jpc3RpYW4gSMO4Z3NiZXJnIChrcmhAcmVkaGF0LmNvbSkKKyAqLworCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJnbHhjbGllbnQuaCIKKyNpbmNsdWRlICJnbGNvbnRleHRtb2Rlcy5oIgorI2luY2x1ZGUgImRyaV9jb21tb24uaCIKKworI2lmbmRlZiBSVExEX05PVworI2RlZmluZSBSVExEX05PVyAwCisjZW5kaWYKKyNpZm5kZWYgUlRMRF9HTE9CQUwKKyNkZWZpbmUgUlRMRF9HTE9CQUwgMAorI2VuZGlmCisKK19YX0hJRERFTiB2b2lkIEluZm9NZXNzYWdlRihjb25zdCBjaGFyICpmLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGNvbnN0IGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCJMSUJHTF9ERUJVRyIpKSAmJiBzdHJzdHIoZW52LCAidmVyYm9zZSIpKSB7CisJZnByaW50ZihzdGRlcnIsICJsaWJHTDogIik7CisJdmFfc3RhcnQoYXJncywgZik7CisJdmZwcmludGYoc3RkZXJyLCBmLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisgICAgfQorfQorCisvKioKKyAqIFByaW50IGVycm9yIHRvIHN0ZGVyciwgdW5sZXNzIExJQkdMX0RFQlVHPT0icXVpZXQiLgorICovCitfWF9ISURERU4gdm9pZCBFcnJvck1lc3NhZ2VGKGNvbnN0IGNoYXIgKmYsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgY29uc3QgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoIkxJQkdMX0RFQlVHIikpICYmICFzdHJzdHIoZW52LCAicXVpZXQiKSkgeworCWZwcmludGYoc3RkZXJyLCAibGliR0wgZXJyb3I6ICIpOworCXZhX3N0YXJ0KGFyZ3MsIGYpOworCXZmcHJpbnRmKHN0ZGVyciwgZiwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworICAgIH0KK30KKworI2lmbmRlZiBERUZBVUxUX0RSSVZFUl9ESVIKKy8qIHRoaXMgaXMgbm9ybWFsbHkgZGVmaW5lZCBpbiBNZXNhL2NvbmZpZ3MvZGVmYXVsdCB3aXRoIERSSV9EUklWRVJfU0VBUkNIX1BBVEggKi8KKyNkZWZpbmUgREVGQVVMVF9EUklWRVJfRElSICIvdXNyL2xvY2FsL2xpYi9kcmkiCisjZW5kaWYKKworLyoqCisgKiBUcnkgdG8gXGMgZGxvcGVuIHRoZSBuYW1lZCBkcml2ZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSAiX2RyaS5zbyIgc3VmZml4IHRvIHRoZSBkcml2ZXIgbmFtZSBhbmQgc2VhcmNoZXMgdGhlCisgKiBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgdGhlIFxjIExJQkdMX0RSSVZFUlNfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbgorICogb3JkZXIgdG8gZmluZCB0aGUgZHJpdmVyLgorICoKKyAqIFxwYXJhbSBkcml2ZXJOYW1lIC0gYSBuYW1lIGxpa2UgInRkZngiLCAiaTgxMCIsICJtZ2EiLCBldGMuCisgKgorICogXHJldHVybnMKKyAqIEEgaGFuZGxlIGZyb20gXGMgZGxvcGVuLCBvciBcYyBOVUxMIGlmIGRyaXZlciBmaWxlIG5vdCBmb3VuZC4KKyAqLworX1hfSElEREVOIHZvaWQgKmRyaU9wZW5Ecml2ZXIoY29uc3QgY2hhciAqZHJpdmVyTmFtZSkKK3sKKyAgIHZvaWQgKmdsaGFuZGxlLCAqaGFuZGxlOworICAgY29uc3QgY2hhciAqbGliUGF0aHMsICpwLCAqbmV4dDsKKyAgIGNoYXIgcmVhbERyaXZlck5hbWVbMjAwXTsKKyAgIGludCBsZW47CisKKyAgIC8qIEF0dGVtcHQgdG8gbWFrZSBzdXJlIGxpYkdMIHN5bWJvbHMgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBkcml2ZXIgKi8KKyAgIGdsaGFuZGxlID0gZGxvcGVuKCJsaWJHTC5zby4xIiwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCk7CisKKyAgIGxpYlBhdGhzID0gTlVMTDsKKyAgIGlmIChnZXRldWlkKCkgPT0gZ2V0dWlkKCkpIHsKKyAgICAgIC8qIGRvbid0IGFsbG93IHNldHVpZCBhcHBzIHRvIHVzZSBMSUJHTF9EUklWRVJTX1BBVEggKi8KKyAgICAgIGxpYlBhdGhzID0gZ2V0ZW52KCJMSUJHTF9EUklWRVJTX1BBVEgiKTsKKyAgICAgIGlmICghbGliUGF0aHMpCisgICAgICAgICBsaWJQYXRocyA9IGdldGVudigiTElCR0xfRFJJVkVSU19ESVIiKTsgLyogZGVwcmVjYXRlZCAqLworICAgfQorICAgaWYgKGxpYlBhdGhzID09IE5VTEwpCisgICAgICAgbGliUGF0aHMgPSBERUZBVUxUX0RSSVZFUl9ESVI7CisKKyAgIGhhbmRsZSA9IE5VTEw7CisgICBmb3IgKHAgPSBsaWJQYXRoczsgKnA7IHAgPSBuZXh0KSB7CisgICAgICAgbmV4dCA9IHN0cmNocihwLCAnOicpOworICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKwkgICBsZW4gPSBzdHJsZW4ocCk7CisJICAgbmV4dCA9IHAgKyBsZW47CisgICAgICAgfSBlbHNlIHsKKwkgICBsZW4gPSBuZXh0IC0gcDsKKwkgICBuZXh0Kys7CisgICAgICAgfQorCisjaWZkZWYgR0xYX1VTRV9UTFMKKyAgICAgIHNucHJpbnRmKHJlYWxEcml2ZXJOYW1lLCBzaXplb2YgcmVhbERyaXZlck5hbWUsCisJICAgICAgICIlLipzL3Rscy8lc19kcmkuc28iLCBsZW4sIHAsIGRyaXZlck5hbWUpOworICAgICAgSW5mb01lc3NhZ2VGKCJPcGVuRHJpdmVyOiB0cnlpbmcgJXNcbiIsIHJlYWxEcml2ZXJOYW1lKTsKKyAgICAgIGhhbmRsZSA9IGRsb3BlbihyZWFsRHJpdmVyTmFtZSwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCk7CisjZW5kaWYKKworICAgICAgaWYgKCBoYW5kbGUgPT0gTlVMTCApIHsKKwkgc25wcmludGYocmVhbERyaXZlck5hbWUsIHNpemVvZiByZWFsRHJpdmVyTmFtZSwKKwkJICAiJS4qcy8lc19kcmkuc28iLCBsZW4sIHAsIGRyaXZlck5hbWUpOworCSBJbmZvTWVzc2FnZUYoIk9wZW5Ecml2ZXI6IHRyeWluZyAlc1xuIiwgcmVhbERyaXZlck5hbWUpOworCSBoYW5kbGUgPSBkbG9wZW4ocmVhbERyaXZlck5hbWUsIFJUTERfTk9XIHwgUlRMRF9HTE9CQUwpOworICAgICAgfQorCisgICAgICBpZiAoIGhhbmRsZSAhPSBOVUxMICkKKwkgIGJyZWFrOworICAgICAgZWxzZQorCSBFcnJvck1lc3NhZ2VGKCJkbG9wZW4gJXMgZmFpbGVkICglcylcbiIsIHJlYWxEcml2ZXJOYW1lLCBkbGVycm9yKCkpOworICAgfQorCisgICBpZiAoIWhhbmRsZSkKKyAgICAgIEVycm9yTWVzc2FnZUYoInVuYWJsZSB0byBsb2FkIGRyaXZlcjogJXNfZHJpLnNvXG4iLCBkcml2ZXJOYW1lKTsKKworICAgaWYgKGdsaGFuZGxlKQorICAgICAgZGxjbG9zZShnbGhhbmRsZSk7CisKKyAgIHJldHVybiBoYW5kbGU7Cit9CisKK19YX0hJRERFTiBjb25zdCBfX0RSSXN5c3RlbVRpbWVFeHRlbnNpb24gc3lzdGVtVGltZUV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX1NZU1RFTV9USU1FLCBfX0RSSV9TWVNURU1fVElNRV9WRVJTSU9OIH0sCisgICAgX19nbFhHZXRVU1QsCisgICAgX19kcmlHZXRNc2NSYXRlT01MCit9OworCisjZGVmaW5lIF9fQVRUUklCKGF0dHJpYiwgZmllbGQpIFwKKyAgICB7IGF0dHJpYiwgb2Zmc2V0b2YoX19HTGNvbnRleHRNb2RlcywgZmllbGQpIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IHVuc2lnbmVkIGludCBhdHRyaWIsIG9mZnNldDsgfSBhdHRyaWJNYXBbXSA9IHsKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQlVGRkVSX1NJWkUsCQkJcmdiQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0xFVkVMLAkJCWxldmVsKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfUkVEX1NJWkUsCQkJcmVkQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0dSRUVOX1NJWkUsCQkJZ3JlZW5CaXRzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQkxVRV9TSVpFLAkJCWJsdWVCaXRzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQUxQSEFfU0laRSwJCQlhbHBoYUJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9ERVBUSF9TSVpFLAkJCWRlcHRoQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1NURU5DSUxfU0laRSwJCQlzdGVuY2lsQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FDQ1VNX1JFRF9TSVpFLAkJYWNjdW1SZWRCaXRzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQUNDVU1fR1JFRU5fU0laRSwJCWFjY3VtR3JlZW5CaXRzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQUNDVU1fQkxVRV9TSVpFLAkJYWNjdW1CbHVlQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FDQ1VNX0FMUEhBX1NJWkUsCQlhY2N1bUFscGhhQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1NBTVBMRV9CVUZGRVJTLAkJc2FtcGxlQnVmZmVycyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1NBTVBMRVMsCQkJc2FtcGxlcyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0RPVUJMRV9CVUZGRVIsCQlkb3VibGVCdWZmZXJNb2RlKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfU1RFUkVPLAkJCXN0ZXJlb01vZGUpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9BVVhfQlVGRkVSUywJCQludW1BdXhCdWZmZXJzKSwKKyNpZiAwCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1RZUEUsCQl0cmFuc3BhcmVudFBpeGVsKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUsCXRyYW5zcGFyZW50SW5kZXgpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCXRyYW5zcGFyZW50UmVkKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCXRyYW5zcGFyZW50R3JlZW4pLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAl0cmFuc3BhcmVudEJsdWUpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRSwJdHJhbnNwYXJlbnRBbHBoYSksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1JFRF9NQVNLLAkJCXJlZE1hc2spLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9HUkVFTl9NQVNLLAkJCWdyZWVuTWFzayksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0JMVUVfTUFTSywJCQlibHVlTWFzayksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FMUEhBX01BU0ssCQkJYWxwaGFNYXNrKSwKKyNlbmRpZgorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9XSURUSCwJCW1heFBidWZmZXJXaWR0aCksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX01BWF9QQlVGRkVSX0hFSUdIVCwJCW1heFBidWZmZXJIZWlnaHQpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9QSVhFTFMsCQltYXhQYnVmZmVyUGl4ZWxzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfT1BUSU1BTF9QQlVGRkVSX1dJRFRILAlvcHRpbWFsUGJ1ZmZlcldpZHRoKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfT1BUSU1BTF9QQlVGRkVSX0hFSUdIVCwJb3B0aW1hbFBidWZmZXJIZWlnaHQpLAorI2lmIDAKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfU1dBUF9NRVRIT0QsCQkJc3dhcE1ldGhvZCksCisjZW5kaWYKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQklORF9UT19URVhUVVJFX1JHQiwJCWJpbmRUb1RleHR1cmVSZ2IpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfUkdCQSwJCWJpbmRUb1RleHR1cmVSZ2JhKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQklORF9UT19NSVBNQVBfVEVYVFVSRSwJYmluZFRvTWlwbWFwVGV4dHVyZSksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1lJTlZFUlRFRCwJCQl5SW52ZXJ0ZWQpLAorfTsKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mICgoYSlbMF0pKQorCitzdGF0aWMgaW50CitzY2FsYXJFcXVhbChfX0dMY29udGV4dE1vZGVzICptb2RlLCB1bnNpZ25lZCBpbnQgYXR0cmliLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisgICAgdW5zaWduZWQgaW50IGdseFZhbHVlOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXR0cmliTWFwKTsgaSsrKQorCWlmIChhdHRyaWJNYXBbaV0uYXR0cmliID09IGF0dHJpYikgeworCSAgICBnbHhWYWx1ZSA9ICoodW5zaWduZWQgaW50ICopICgoY2hhciAqKSBtb2RlICsgYXR0cmliTWFwW2ldLm9mZnNldCk7CisJICAgIHJldHVybiBnbHhWYWx1ZSA9PSBHTFhfRE9OVF9DQVJFIHx8IGdseFZhbHVlID09IHZhbHVlOworCX0KKworICAgIHJldHVybiBHTF9UUlVFOyAvKiBJcyBhIG5vbi1leGlzdGluZyBhdHRyaWJ1dGUgZXF1YWwgdG8gdmFsdWU/ICovCit9CisKK3N0YXRpYyBpbnQKK2RyaUNvbmZpZ0VxdWFsKGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSwKKwkgICAgICAgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsIGNvbnN0IF9fRFJJY29uZmlnICpkcmlDb25maWcpCit7CisgICAgdW5zaWduZWQgaW50IGF0dHJpYiwgdmFsdWUsIGdseFZhbHVlOworICAgIGludCBpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKGNvcmUtPmluZGV4Q29uZmlnQXR0cmliKGRyaUNvbmZpZywgaSsrLCAmYXR0cmliLCAmdmFsdWUpKSB7CisJc3dpdGNoIChhdHRyaWIpIHsKKwljYXNlIF9fRFJJX0FUVFJJQl9SRU5ERVJfVFlQRToKKwkgICAgZ2x4VmFsdWUgPSAwOworCSAgICBpZiAodmFsdWUgJiBfX0RSSV9BVFRSSUJfUkdCQV9CSVQpIHsKKwkJZ2x4VmFsdWUgfD0gR0xYX1JHQkFfQklUOworCSAgICB9IGVsc2UgaWYgKHZhbHVlICYgX19EUklfQVRUUklCX0NPTE9SX0lOREVYX0JJVCkgeworCQlnbHhWYWx1ZSB8PSBHTFhfQ09MT1JfSU5ERVhfQklUOworCSAgICB9CisJICAgIGlmIChnbHhWYWx1ZSAhPSBtb2Rlcy0+cmVuZGVyVHlwZSkKKwkJcmV0dXJuIEdMX0ZBTFNFOworCSAgICBicmVhazsKKworCWNhc2UgX19EUklfQVRUUklCX0NPTkZJR19DQVZFQVQ6CisJICAgIGlmICh2YWx1ZSAmIF9fRFJJX0FUVFJJQl9OT05fQ09ORk9STUFOVF9DT05GSUcpCisJCWdseFZhbHVlID0gR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRzsKKwkgICAgZWxzZSBpZiAodmFsdWUgJiBfX0RSSV9BVFRSSUJfU0xPV19CSVQpCisJCWdseFZhbHVlID0gR0xYX1NMT1dfQ09ORklHOworCSAgICBlbHNlCisJCWdseFZhbHVlID0gR0xYX05PTkU7CisJICAgIGlmIChnbHhWYWx1ZSAhPSBtb2Rlcy0+dmlzdWFsUmF0aW5nKQorCQlyZXR1cm4gR0xfRkFMU0U7CisJICAgIGJyZWFrOworCisJY2FzZSBfX0RSSV9BVFRSSUJfQklORF9UT19URVhUVVJFX1RBUkdFVFM6CisJICAgIGdseFZhbHVlID0gMDsKKwkgICAgaWYgKHZhbHVlICYgX19EUklfQVRUUklCX1RFWFRVUkVfMURfQklUKQorCQlnbHhWYWx1ZSB8PSBHTFhfVEVYVFVSRV8xRF9CSVRfRVhUOworCSAgICBpZiAodmFsdWUgJiBfX0RSSV9BVFRSSUJfVEVYVFVSRV8yRF9CSVQpCisJCWdseFZhbHVlIHw9IEdMWF9URVhUVVJFXzJEX0JJVF9FWFQ7CisJICAgIGlmICh2YWx1ZSAmIF9fRFJJX0FUVFJJQl9URVhUVVJFX1JFQ1RBTkdMRV9CSVQpCisJCWdseFZhbHVlIHw9IEdMWF9URVhUVVJFX1JFQ1RBTkdMRV9CSVRfRVhUOworCSAgICBpZiAobW9kZXMtPmJpbmRUb1RleHR1cmVUYXJnZXRzICE9IEdMWF9ET05UX0NBUkUgJiYKKwkJZ2x4VmFsdWUgIT0gbW9kZXMtPmJpbmRUb1RleHR1cmVUYXJnZXRzKQorCQlyZXR1cm4gR0xfRkFMU0U7CisJICAgIGJyZWFrOwkKKworCWRlZmF1bHQ6CisJICAgIGlmICghc2NhbGFyRXF1YWwobW9kZXMsIGF0dHJpYiwgdmFsdWUpKQorCQlyZXR1cm4gR0xfRkFMU0U7CisJfQorICAgIH0KKworICAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCitjcmVhdGVEcmlNb2RlKGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSwKKwkgICAgICBfX0dMY29udGV4dE1vZGVzICptb2RlcywgY29uc3QgX19EUkljb25maWcgKipkcmlDb25maWdzKQoreworICAgIF9fR0xYRFJJY29uZmlnUHJpdmF0ZSAqY29uZmlnOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZHJpQ29uZmlnc1tpXTsgaSsrKSB7CisJaWYgKGRyaUNvbmZpZ0VxdWFsKGNvcmUsIG1vZGVzLCBkcmlDb25maWdzW2ldKSkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGRyaUNvbmZpZ3NbaV0gPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGNvbmZpZyA9IFhtYWxsb2Moc2l6ZW9mICpjb25maWcpOworICAgIGlmIChjb25maWcgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGNvbmZpZy0+bW9kZXMgPSAqbW9kZXM7CisgICAgY29uZmlnLT5kcmlDb25maWcgPSBkcmlDb25maWdzW2ldOworCisgICAgcmV0dXJuICZjb25maWctPm1vZGVzOworfQorCitfWF9ISURERU4gX19HTGNvbnRleHRNb2RlcyAqCitkcmlDb252ZXJ0Q29uZmlncyhjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUsCisJCSAgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsIGNvbnN0IF9fRFJJY29uZmlnICoqY29uZmlncykKK3sKKyAgICBfX0dMY29udGV4dE1vZGVzIGhlYWQsICp0YWlsLCAqbTsKKworICAgIHRhaWwgPSAmaGVhZDsKKyAgICBoZWFkLm5leHQgPSBOVUxMOworICAgIGZvciAobSA9IG1vZGVzOyBtOyBtID0gbS0+bmV4dCkgeworCXRhaWwtPm5leHQgPSBjcmVhdGVEcmlNb2RlKGNvcmUsIG0sIGNvbmZpZ3MpOworCWlmICh0YWlsLT5uZXh0ID09IE5VTEwpIHsKKwkgICAgLyogbm8gbWF0Y2hpbmcgZHJpIGNvbmZpZyBmb3IgbSAqLworCSAgICBjb250aW51ZTsKKwl9CisKKworCXRhaWwgPSB0YWlsLT5uZXh0OworICAgIH0KKworICAgIF9nbF9jb250ZXh0X21vZGVzX2Rlc3Ryb3kobW9kZXMpOworCisgICAgcmV0dXJuIGhlYWQubmV4dDsKK30KKworX1hfSElEREVOIHZvaWQKK2RyaUJpbmRFeHRlbnNpb25zKF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLCBpbnQgZHJpMikKK3sKKyAgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnM7CisgICAgaW50IGk7CisKKyAgICBleHRlbnNpb25zID0gcHNjLT5jb3JlLT5nZXRFeHRlbnNpb25zKHBzYy0+X19kcmlTY3JlZW4pOworCisgICAgZm9yIChpID0gMDsgZXh0ZW5zaW9uc1tpXTsgaSsrKSB7CisjaWZkZWYgX19EUklfQ09QWV9TVUJfQlVGRkVSCisJaWYgKHN0cmNtcChleHRlbnNpb25zW2ldLT5uYW1lLCBfX0RSSV9DT1BZX1NVQl9CVUZGRVIpID09IDApIHsKKwkgICAgcHNjLT5jb3B5U3ViQnVmZmVyID0gKF9fRFJJY29weVN1YkJ1ZmZlckV4dGVuc2lvbiAqKSBleHRlbnNpb25zW2ldOworCSAgICBfX2dsWEVuYWJsZURpcmVjdEV4dGVuc2lvbihwc2MsICJHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXJfYml0Iik7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfX0RSSV9TV0FQX0NPTlRST0wKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX1NXQVBfQ09OVFJPTCkgPT0gMCkgeworCSAgICBwc2MtPnN3YXBDb250cm9sID0gKF9fRFJJc3dhcENvbnRyb2xFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwkgICAgX19nbFhFbmFibGVEaXJlY3RFeHRlbnNpb24ocHNjLCAiR0xYX1NHSV9zd2FwX2NvbnRyb2wiKTsKKwkgICAgX19nbFhFbmFibGVEaXJlY3RFeHRlbnNpb24ocHNjLCAiR0xYX01FU0Ffc3dhcF9jb250cm9sIik7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfX0RSSV9BTExPQ0FURQorCWlmIChzdHJjbXAoZXh0ZW5zaW9uc1tpXS0+bmFtZSwgX19EUklfQUxMT0NBVEUpID09IDApIHsKKwkgICAgcHNjLT5hbGxvY2F0ZSA9IChfX0RSSWFsbG9jYXRlRXh0ZW5zaW9uICopIGV4dGVuc2lvbnNbaV07CisJICAgIF9fZ2xYRW5hYmxlRGlyZWN0RXh0ZW5zaW9uKHBzYywgIkdMWF9NRVNBX2FsbG9jYXRlX21lbW9yeSIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgX19EUklfRlJBTUVfVFJBQ0tJTkcKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX0ZSQU1FX1RSQUNLSU5HKSA9PSAwKSB7CisJICAgIHBzYy0+ZnJhbWVUcmFja2luZyA9IChfX0RSSWZyYW1lVHJhY2tpbmdFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwkgICAgX19nbFhFbmFibGVEaXJlY3RFeHRlbnNpb24ocHNjLCAiR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgX19EUklfTUVESUFfU1RSRUFNX0NPVU5URVIKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX01FRElBX1NUUkVBTV9DT1VOVEVSKSA9PSAwKSB7CisJICAgIHBzYy0+bXNjID0gKF9fRFJJbWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uICopIGV4dGVuc2lvbnNbaV07CisJICAgIF9fZ2xYRW5hYmxlRGlyZWN0RXh0ZW5zaW9uKHBzYywgIkdMWF9TR0lfdmlkZW9fc3luYyIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgX19EUklfU1dBUF9CVUZGRVJfQ09VTlRFUgorCS8qIE5vIGRyaXZlciBzdXBwb3J0cyB0aGlzIGF0IHRoaXMgdGltZSBhbmQgdGhlIGV4dGVuc2lvbiBpcworCSAqIG5vdCBkZWZpbmVkIGluIGRyaV9pbnRlcmZhY2UuaC4gIFdpbGwgZW5hYmxlCisJICogR0xYX09NTF9zeW5jX2NvbnRyb2wgaWYgaW1wbGVtZW50ZWQuICovCisjZW5kaWYKKworI2lmZGVmIF9fRFJJX1JFQURfRFJBV0FCTEUKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX1JFQURfRFJBV0FCTEUpID09IDApIHsKKwkgICAgX19nbFhFbmFibGVEaXJlY3RFeHRlbnNpb24ocHNjLCAiR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZCIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgX19EUklfVEVYX0JVRkZFUgorCWlmICgoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX1RFWF9CVUZGRVIpID09IDApICYmIGRyaTIpIHsKKwkgICAgcHNjLT50ZXhCdWZmZXIgPSAoX19EUkl0ZXhCdWZmZXJFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwkgICAgX19nbFhFbmFibGVEaXJlY3RFeHRlbnNpb24ocHNjLCAiR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIik7CisJfQorI2VuZGlmCisKKwkvKiBJZ25vcmUgdW5rbm93biBleHRlbnNpb25zICovCisgICAgfQorfQorCisjZW5kaWYgLyogR0xYX0RJUkVDVF9SRU5ERVJJTkcgKi8KZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL2RyaV9jb21tb24uaCBiL3NyYy9nbHgveDExL2RyaV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dseC94MTEvZHJpX2NvbW1vbi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0xOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCDCqSAyMDA4IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdC0KKyAqIHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQKKyAqIGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnQtCisgKiB3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbgorICogbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMLQorICogSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZCisgKiBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4KKyAqIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRS0KKyAqIFFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUi0KKyAqIE1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsCisgKiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCisgKiBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mCisgKiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKyAqCisgKiBBdXRob3JzOgorICogICBLZXZpbiBFLiBNYXJ0aW4gPGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tPgorICogICBCcmlhbiBQYXVsIDxicmlhbkBwcmVjaXNpb25pbnNpZ2h0LmNvbT4KKyAqICAgS3Jpc3RpYW4gSMO4Z3NiZXJnIChrcmhAcmVkaGF0LmNvbSkKKyAqLworCisjaWZuZGVmIF9EUklfQ09NTU9OX0gKKyNkZWZpbmUgX0RSSV9DT01NT05fSAorCit0eXBlZGVmIHN0cnVjdCBfX0dMWERSSWNvbmZpZ1ByaXZhdGVSZWMgIF9fR0xYRFJJY29uZmlnUHJpdmF0ZTsKKworc3RydWN0IF9fR0xYRFJJY29uZmlnUHJpdmF0ZVJlYyB7CisgICAgX19HTGNvbnRleHRNb2RlcyBtb2RlczsKKyAgICBjb25zdCBfX0RSSWNvbmZpZyAqZHJpQ29uZmlnOworfTsKKworZXh0ZXJuIF9fR0xjb250ZXh0TW9kZXMgKgorZHJpQ29udmVydENvbmZpZ3MoY29uc3QgX19EUkljb3JlRXh0ZW5zaW9uICpjb3JlLAorCQkgIF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLCBjb25zdCBfX0RSSWNvbmZpZyAqKmNvbmZpZ3MpOworCitleHRlcm4gY29uc3QgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uIHN5c3RlbVRpbWVFeHRlbnNpb247CisKK2V4dGVybiB2b2lkIEluZm9NZXNzYWdlRihjb25zdCBjaGFyICpmLCAuLi4pOworCitleHRlcm4gdm9pZCBFcnJvck1lc3NhZ2VGKGNvbnN0IGNoYXIgKmYsIC4uLik7CisKK2V4dGVybiB2b2lkICpkcmlPcGVuRHJpdmVyKGNvbnN0IGNoYXIgKmRyaXZlck5hbWUpOworCitleHRlcm4gdm9pZCBkcmlCaW5kRXh0ZW5zaW9ucyhfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywgaW50IGRyaTIpOworCisjZW5kaWYgLyogX0RSSV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZHJpX2dseC5jIGIvc3JjL2dseC94MTEvZHJpX2dseC5jCmluZGV4IGU2MzdjOTYuLjA4YzgzYTIgMTAwNjQ0Ci0tLSBhL3NyYy9nbHgveDExL2RyaV9nbHguYworKysgYi9zcmMvZ2x4L3gxMS9kcmlfZ2x4LmMKQEAgLTM0LDI5NCArMzQsNDcgQEAKIAogI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hleHQuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZGFtYWdlLmg+CiAjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKICNpbmNsdWRlICJnbHhjbGllbnQuaCIKKyNpbmNsdWRlICJnbGNvbnRleHRtb2Rlcy5oIgogI2luY2x1ZGUgInhmODZkcmkuaCIKICNpbmNsdWRlICJzYXJlYS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlICJkcmlfZ2x4LmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAiZHJpX2NvbW1vbi5oIgogCi0jaWZuZGVmIFJUTERfTk9XCi0jZGVmaW5lIFJUTERfTk9XIDAKLSNlbmRpZgotI2lmbmRlZiBSVExEX0dMT0JBTAotI2RlZmluZSBSVExEX0dMT0JBTCAwCi0jZW5kaWYKK3R5cGVkZWYgc3RydWN0IF9fR0xYRFJJZGlzcGxheVByaXZhdGVSZWMgX19HTFhEUklkaXNwbGF5UHJpdmF0ZTsKK3R5cGVkZWYgc3RydWN0IF9fR0xYRFJJY29udGV4dFByaXZhdGVSZWMgX19HTFhEUkljb250ZXh0UHJpdmF0ZTsKIAorc3RydWN0IF9fR0xYRFJJZGlzcGxheVByaXZhdGVSZWMgeworICAgIF9fR0xYRFJJZGlzcGxheSBiYXNlOwogCi0jaWZuZGVmIERFRkFVTFRfRFJJVkVSX0RJUgotLyogdGhpcyBpcyBub3JtYWxseSBkZWZpbmVkIGluIE1lc2EvY29uZmlncy9kZWZhdWx0IHdpdGggRFJJX0RSSVZFUl9TRUFSQ0hfUEFUSCAqLwotI2RlZmluZSBERUZBVUxUX0RSSVZFUl9ESVIgIi91c3IvWDExUjYvbGliL21vZHVsZXMvZHJpIgotI2VuZGlmCisgICAgLyoKKyAgICAqKiBYRnJlZTg2LURSSSB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICAgKi8KKyAgICBpbnQgZHJpTWFqb3I7CisgICAgaW50IGRyaU1pbm9yOworICAgIGludCBkcmlQYXRjaDsKK307CiAKLXN0YXRpYyBfX0RSSWRyaXZlciAqRHJpdmVycyA9IE5VTEw7Ci0KLQotLyoqIElmIG5vbi16ZXJvLCBwcmVmZXIgYW4gImVnbF9mb29fZHJpLnNvIiBkcml2ZXIgb3ZlciAiZm9vX2RyaS5zbyIgKi8KLXN0YXRpYyBpbnQgUHJlZmVyRUdMID0gMDsKLQotCi0vKioKLSAqIFRoaXMgbWF5IGJlIGNhbGxlZCBieSBsaWJFR0wuc28gdG8gdGVsbCBsaWJHTCB0byBwcmVmZXIgImVnbF8iIGRyaXZlcnMKLSAqIG92ZXIgcmVndWxhciBEUkkgZHJpdmVycyIuCi0gKi8KLXZvaWQgX19nbFhQcmVmZXJFR0woaW50IHN0YXRlKQotewotICAgUHJlZmVyRUdMID0gc3RhdGU7Ci19Ci0KLQotLyoKLSAqIHByaW50ZiB3cmFwcGVycwotICovCi0KLXN0YXRpYyB2b2lkIEluZm9NZXNzYWdlRihjb25zdCBjaGFyICpmLCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGNvbnN0IGNoYXIgKmVudjsKLQotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJMSUJHTF9ERUJVRyIpKSAmJiBzdHJzdHIoZW52LCAidmVyYm9zZSIpKSB7Ci0JZnByaW50ZihzdGRlcnIsICJsaWJHTDogIik7Ci0JdmFfc3RhcnQoYXJncywgZik7Ci0JdmZwcmludGYoc3RkZXJyLCBmLCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0gICAgfQotfQotCi0vKioKLSAqIFByaW50IGVycm9yIHRvIHN0ZGVyciwgdW5sZXNzIExJQkdMX0RFQlVHPT0icXVpZXQiLgotICovCi1zdGF0aWMgdm9pZCBFcnJvck1lc3NhZ2VGKGNvbnN0IGNoYXIgKmYsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgY29uc3QgY2hhciAqZW52OwotCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIkxJQkdMX0RFQlVHIikpICYmICFzdHJzdHIoZW52LCAicXVpZXQiKSkgewotCWZwcmludGYoc3RkZXJyLCAibGliR0wgZXJyb3I6ICIpOwotCXZhX3N0YXJ0KGFyZ3MsIGYpOwotCXZmcHJpbnRmKHN0ZGVyciwgZiwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotICAgIH0KLX0KLQotCi0vKioKLSAqIEV4dHJhY3QgdGhlIGl0aCBkaXJlY3RvcnkgcGF0aCBvdXQgb2YgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBwYXRocy4gIE5vCi0gKiBtb3JlIHRoYW4gXGMgZGlyTGVuIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgXGMgTlVMLCB3aWxsIGJlCi0gKiB3cml0dGVuIHRvIFxjIGRpci4KLSAqCi0gKiBccGFyYW0gaW5kZXggIEluZGV4IG9mIHBhdGggdG8gZXh0cmFjdCAoc3RhcnRpbmcgYXQgemVybykKLSAqIFxwYXJhbSBwYXRocyAgVGhlIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdGhzCi0gKiBccGFyYW0gZGlyTGVuIE1heGltdW0gbGVuZ3RoIG9mIHJlc3VsdCB0byBzdG9yZSBpbiBcYyBkaXIKLSAqIFxwYXJhbSBkaXIgICAgQnVmZmVyIHRvIGhvbGQgdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgcGF0aAotICoKLSAqIFxyZXR1cm5zCi0gKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiB0byBcYyBkaXIgaGFkIHRoZXJlCi0gKiBiZWVuIGVub3VnaCByb29tLiAgVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyBcYyBOVUwuICBXaGVuCi0gKiBleHRyYWN0aW9uIGZhaWxzLCB6ZXJvIHdpbGwgYmUgcmV0dXJuZWQuCi0gKiAKLSAqIFx0b2RvCi0gKiBJdCBzZWVtcyBsaWtlIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgcmV3cml0dGVuIHRvIHVzZSBcYyBzdHJjaHIuCi0gKi8KLXN0YXRpYyBzaXplX3QKLUV4dHJhY3REaXIoaW50IGluZGV4LCBjb25zdCBjaGFyICpwYXRocywgaW50IGRpckxlbiwgY2hhciAqZGlyKQotewotICAgaW50IGksIGxlbjsKLSAgIGNvbnN0IGNoYXIgKnN0YXJ0LCAqZW5kOwotCi0gICAvKiBmaW5kIGl0aCBjb2xvbiAqLwotICAgc3RhcnQgPSBwYXRoczsKLSAgIGkgPSAwOwotICAgd2hpbGUgKGkgPCBpbmRleCkgewotICAgICAgaWYgKCpzdGFydCA9PSAnOicpIHsKLSAgICAgICAgIGkrKzsKLSAgICAgICAgIHN0YXJ0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgqc3RhcnQgPT0gMCkgewotICAgICAgICAgLyogZW5kIG9mIHN0cmluZyBhbmQgY291bGRuJ3QgZmluZCBpdGggY29sb24gKi8KLSAgICAgICAgIGRpclswXSA9IDA7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgc3RhcnQrKzsKLSAgICAgIH0KLSAgIH0KLQotICAgd2hpbGUgKCpzdGFydCA9PSAnOicpCi0gICAgICBzdGFydCsrOwotCi0gICAvKiBmaW5kIG5leHQgY29sb24sIG9yIGVuZCBvZiBzdHJpbmcgKi8KLSAgIGVuZCA9IHN0YXJ0ICsgMTsKLSAgIHdoaWxlICgqZW5kICE9ICc6JyAmJiAqZW5kICE9IDApIHsKLSAgICAgIGVuZCsrOwotICAgfQotCi0gICAvKiBjb3B5IHN0cmluZyBiZXR3ZWVuIDxzdGFydD4gYW5kIDxlbmQ+IGludG8gcmVzdWx0IHN0cmluZyAqLwotICAgbGVuID0gZW5kIC0gc3RhcnQ7Ci0gICBpZiAobGVuID4gZGlyTGVuIC0gMSkKLSAgICAgIGxlbiA9IGRpckxlbiAtIDE7Ci0gICBzdHJuY3B5KGRpciwgc3RhcnQsIGxlbik7Ci0gICBkaXJbbGVuXSA9IDA7Ci0KLSAgIHJldHVybiggZW5kIC0gc3RhcnQgKTsKLX0KLQotCi0vKioKLSAqIFRyeSB0byBkbG9wZW4oKSBhIGRyaXZlci4KLSAqIFxwYXJhbSBsaWJEaXIgIHRoZSBkaXJlY3RvcnkgdG8gc2VhcmNoCi0gKiBccGFyYW0gZHJpdmVyTmFtZSAgdGhlIG5hbWUgb2YgdGhlIGRyaXZlciAoc3VjaCBhcyAicjMwMCIpLgotICogXHBhcmFtIHRscyAgaWYgdHJ1ZSwgdHJ5IHRvIGZpbmQgVExTIHZlcnNpb24gb2YgZHJpdmVyCi0gKiBccGFyYW0gcHJlZmVyRUdMICBpZiB0cnVlLCB0cnkgdG8gZmluZCBFR0wtc3BlY2lmaWMgZHJpdmVyCi0gKiBccmV0dXJuICBoYW5kbGUgZnJvbSBkbG9wZW4oKSwgd2lsbCBiZSBOVUxMIGlmIGZhaWxzLgotICovCi1zdGF0aWMgdm9pZCAqCi10cnlfb3Blbihjb25zdCBjaGFyICpsaWJEaXIsIGNvbnN0IGNoYXIgKmRyaXZlck5hbWUsCi0gICAgICAgICBHTGJvb2xlYW4gdGxzLCBHTGJvb2xlYW4gcHJlZmVyRUdMKQotewotICAgY29uc3QgY2hhciAqdGxzRGlyID0gdGxzID8gIi90bHMvIiA6ICIiOwotICAgY29uc3QgY2hhciAqZWdsUHJlZml4ID0gcHJlZmVyRUdMID8gImVnbF8iIDogIiI7Ci0gICBjaGFyIGZ1bGxQYXRoTmFtZVsyMDBdOwotICAgdm9pZCAqaGFuZGxlID0gTlVMTDsKLQotICAgc25wcmludGYoZnVsbFBhdGhOYW1lLCAyMDAsICIlcyVzLyVzJXNfZHJpLnNvIiwKLSAgICAgICAgICAgIGxpYkRpciwgdGxzRGlyLCBlZ2xQcmVmaXgsIGRyaXZlck5hbWUpOwotICAgSW5mb01lc3NhZ2VGKCJPcGVuRHJpdmVyOiB0cnlpbmcgJXNcbiIsIGZ1bGxQYXRoTmFtZSk7Ci0gICBoYW5kbGUgPSBkbG9wZW4oZnVsbFBhdGhOYW1lLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKLQotICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotCi0KLS8qKgotICogVmVyc2lvbmVkIG5hbWUgb2YgdGhlIGV4cGVjdGVkIFxjIF9fZHJpQ3JlYXRlTmV3U2NyZWVuIGZ1bmN0aW9uLgotICogCi0gKiBUaGUgdmVyc2lvbiBvZiB0aGUgbGFzdCBpbmNvbXBhdGlibGUgbG9hZGVyL2RyaXZlciBpbnRlZmFjZSBjaGFuZ2UgaXMKLSAqIGFwcGVuZGVkIHRvIHRoZSBuYW1lIG9mIHRoZSBcYyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jdGlvbi4gIFRoaXMKLSAqIHByZXZlbnRzIGxvYWRlcnMgZnJvbSB0cnlpbmcgdG8gbG9hZCBkcml2ZXJzIHRoYXQgYXJlIHRvbyBvbGQuCi0gKiAKLSAqIFx0b2RvCi0gKiBDcmVhdGUgYSBtYWNybyBvciBzb21ldGhpbmcgc28gdGhhdCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgY3JlYXRlTmV3U2NyZWVuTmFtZVtdID0gIl9fZHJpQ3JlYXRlTmV3U2NyZWVuXzIwMDUwNzI3IjsKLQotCi0vKioKLSAqIFRyeSB0byBcYyBkbG9wZW4gdGhlIG5hbWVkIGRyaXZlci4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlICJfZHJpLnNvIiBzdWZmaXggdG8gdGhlIGRyaXZlciBuYW1lIGFuZCBzZWFyY2hlcyB0aGUKLSAqIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSB0aGUgXGMgTElCR0xfRFJJVkVSU19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGluCi0gKiBvcmRlciB0byBmaW5kIHRoZSBkcml2ZXIuCi0gKgotICogXHBhcmFtIGRyaXZlck5hbWUgLSBhIG5hbWUgbGlrZSAidGRmeCIsICJpODEwIiwgIm1nYSIsIGV0Yy4KLSAqCi0gKiBccmV0dXJucwotICogQSBoYW5kbGUgZnJvbSBcYyBkbG9wZW4sIG9yIFxjIE5VTEwgaWYgZHJpdmVyIGZpbGUgbm90IGZvdW5kLgotICovCi1zdGF0aWMgX19EUklkcml2ZXIgKk9wZW5Ecml2ZXIoY29uc3QgY2hhciAqZHJpdmVyTmFtZSkKLXsKLSAgIHZvaWQgKmdsaGFuZGxlID0gTlVMTDsKLSAgIGNoYXIgKmxpYlBhdGhzID0gTlVMTDsKLSAgIGNoYXIgbGliRGlyWzEwMDBdOwotICAgaW50IGk7Ci0gICBfX0RSSWRyaXZlciAqZHJpdmVyOwotCi0gICAvKiBGaXJzdCwgc2VhcmNoIERyaXZlcnMgbGlzdCB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSBvcGVuZWQgdGhpcyBkcml2ZXIgKi8KLSAgIGZvciAoZHJpdmVyID0gRHJpdmVyczsgZHJpdmVyOyBkcml2ZXIgPSBkcml2ZXItPm5leHQpIHsKLSAgICAgIGlmIChzdHJjbXAoZHJpdmVyLT5uYW1lLCBkcml2ZXJOYW1lKSA9PSAwKSB7Ci0gICAgICAgICAvKiBmb3VuZCBpdCAqLwotICAgICAgICAgcmV0dXJuIGRyaXZlcjsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogQXR0ZW1wdCB0byBtYWtlIHN1cmUgbGliR0wgc3ltYm9scyB3aWxsIGJlIHZpc2libGUgdG8gdGhlIGRyaXZlciAqLwotICAgZ2xoYW5kbGUgPSBkbG9wZW4oImxpYkdMLnNvLjEiLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKLQotICAgaWYgKGdldGV1aWQoKSA9PSBnZXR1aWQoKSkgewotICAgICAgLyogZG9uJ3QgYWxsb3cgc2V0dWlkIGFwcHMgdG8gdXNlIExJQkdMX0RSSVZFUlNfUEFUSCAqLwotICAgICAgbGliUGF0aHMgPSBnZXRlbnYoIkxJQkdMX0RSSVZFUlNfUEFUSCIpOwotICAgICAgaWYgKCFsaWJQYXRocykKLSAgICAgICAgIGxpYlBhdGhzID0gZ2V0ZW52KCJMSUJHTF9EUklWRVJTX0RJUiIpOyAvKiBkZXByZWNhdGVkICovCi0gICB9Ci0gICBpZiAoIWxpYlBhdGhzKQotICAgICAgbGliUGF0aHMgPSBERUZBVUxUX0RSSVZFUl9ESVI7Ci0KLSAgIGZvciAoIGkgPSAwIDsgRXh0cmFjdERpcihpLCBsaWJQYXRocywgMTAwMCwgbGliRGlyKSAhPSAwIDsgaSsrICkgewotICAgICAgdm9pZCAqaGFuZGxlID0gTlVMTDsKLQotICAgICAgaWYgKFByZWZlckVHTCkKLSAgICAgICAgIGhhbmRsZSA9IHRyeV9vcGVuKGxpYkRpciwgZHJpdmVyTmFtZSwgR0xfRkFMU0UsIEdMX1RSVUUpOwotI2lmZGVmIEdMWF9VU0VfVExTCi0gICAgICBpZiAoIWhhbmRsZSkKLSAgICAgICAgIGhhbmRsZSA9IHRyeV9vcGVuKGxpYkRpciwgZHJpdmVyTmFtZSwgR0xfVFJVRSwgR0xfRkFMU0UpOwotI2VuZGlmCi0gICAgICBpZiAoIWhhbmRsZSkKLSAgICAgICAgIGhhbmRsZSA9IHRyeV9vcGVuKGxpYkRpciwgZHJpdmVyTmFtZSwgR0xfRkFMU0UsIEdMX0ZBTFNFKTsKLQotICAgICAgaWYgKCBoYW5kbGUgIT0gTlVMTCApIHsKLSAgICAgICAgIC8qIGFsbG9jYXRlIF9fRFJJZHJpdmVyIHN0cnVjdCAqLwotICAgICAgICAgZHJpdmVyID0gKF9fRFJJZHJpdmVyICopIFhtYWxsb2Moc2l6ZW9mKF9fRFJJZHJpdmVyKSk7Ci0gICAgICAgICBpZiAoIWRyaXZlcikKLSAgICAgICAgICAgIGJyZWFrOyAvKiBvdXQgb2YgbWVtb3J5ISAqLwotICAgICAgICAgLyogaW5pdCB0aGUgc3RydWN0ICovCi0gICAgICAgICBkcml2ZXItPm5hbWUgPSBfX2dsWHN0cmR1cChkcml2ZXJOYW1lKTsKLSAgICAgICAgIGlmICghZHJpdmVyLT5uYW1lKSB7Ci0gICAgICAgICAgICBYZnJlZShkcml2ZXIpOwotICAgICAgICAgICAgZHJpdmVyID0gTlVMTDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBvdXQgb2YgbWVtb3J5ISAqLwotICAgICAgICAgfQotCi0gICAgICAgICBkcml2ZXItPmNyZWF0ZU5ld1NjcmVlbkZ1bmMgPSAoUEZOQ1JFQVRFTkVXU0NSRUVORlVOQykKLSAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgY3JlYXRlTmV3U2NyZWVuTmFtZSk7Ci0KLSAgICAgICAgIGlmICggZHJpdmVyLT5jcmVhdGVOZXdTY3JlZW5GdW5jID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGUgZHJpdmVyIGRvZXNuJ3QgaGF2ZSB0aGlzIHN5bWJvbCB0aGVuIHNvbWV0aGluZydzCi0gICAgICAgICAgICAgKiByZWFsbHksIHJlYWxseSB3cm9uZy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRXJyb3JNZXNzYWdlRigiJXMgbm90IGRlZmluZWQgaW4gJXNfZHJpLnNvIVxuIgotCQkJICAiWW91ciBkcml2ZXIgbWF5IGJlIHRvbyBvbGQgZm9yIHRoaXMgbGliR0wuXG4iLAotCQkJICBjcmVhdGVOZXdTY3JlZW5OYW1lLCBkcml2ZXJOYW1lKTsKLSAgICAgICAgICAgIFhmcmVlKGRyaXZlcik7Ci0gICAgICAgICAgICBkcml2ZXIgPSBOVUxMOwotICAgICAgICAgICAgZGxjbG9zZShoYW5kbGUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0gICAgICAgICBkcml2ZXItPmhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgIC8qIHB1dCBhdCBoZWFkIG9mIGxpbmtlZCBsaXN0ICovCi0gICAgICAgICBkcml2ZXItPm5leHQgPSBEcml2ZXJzOwotICAgICAgICAgRHJpdmVycyA9IGRyaXZlcjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIEVycm9yTWVzc2FnZUYoIlVuYWJsZSB0byBmaW5kL29wZW4gZHJpdmVyIGZvciAlcyAoJXMpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJOYW1lLCBkbGVycm9yKCkpOwotICAgICAgfQotICAgfQotCi0gICBpZiAoIWRyaXZlcikKLSAgICAgIEVycm9yTWVzc2FnZUYoInVuYWJsZSB0byBsb2FkIGRyaXZlcjogJXNfZHJpLnNvXG4iLCBkcml2ZXJOYW1lKTsKLQotICAgaWYgKGdsaGFuZGxlKQotICAgICAgZGxjbG9zZShnbGhhbmRsZSk7Ci0KLSAgIHJldHVybiBkcml2ZXI7Ci19Ci0KK3N0cnVjdCBfX0dMWERSSWNvbnRleHRQcml2YXRlUmVjIHsKKyAgICBfX0dMWERSSWNvbnRleHQgYmFzZTsKKyAgICBfX0RSSWNvbnRleHQgKmRyaUNvbnRleHQ7CisgICAgWElEIGh3Q29udGV4dElEOworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOworfTsKIAogLyoKICAqIEdpdmVuIGEgZGlzcGxheSBwb2ludGVyIGFuZCBzY3JlZW4gbnVtYmVyLCBkZXRlcm1pbmUgdGhlIG5hbWUgb2YKICAqIHRoZSBEUkkgZHJpdmVyIGZvciB0aGUgc2NyZWVuLiAoSS5lLiAicjEyOCIsICJ0ZGZ4IiwgZXRjKS4KICAqIFJldHVybiBUcnVlIGZvciBzdWNjZXNzLCBGYWxzZSBmb3IgZmFpbHVyZS4KICAqLwotc3RhdGljIEJvb2wgR2V0RHJpdmVyTmFtZShEaXNwbGF5ICpkcHksIGludCBzY3JOdW0sIGNoYXIgKipkcml2ZXJOYW1lKQorc3RhdGljIEJvb2wgZHJpR2V0RHJpdmVyTmFtZShEaXNwbGF5ICpkcHksIGludCBzY3JOdW0sIGNoYXIgKipkcml2ZXJOYW1lKQogewogICAgaW50IGRpcmVjdENhcGFibGU7CiAgICBCb29sIGI7CkBAIC0zNTEsMjUgKzEwNCw2IEBACiAgICByZXR1cm4gVHJ1ZTsKIH0KIAotCi0vKgotICogR2l2ZW4gYSBkaXNwbGF5IHBvaW50ZXIgYW5kIHNjcmVlbiBudW1iZXIsIHJldHVybiBhIF9fRFJJZHJpdmVyIGhhbmRsZS4KLSAqIFJldHVybiBOVUxMIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCi0gKi8KLV9fRFJJZHJpdmVyICpkcmlHZXREcml2ZXIoRGlzcGxheSAqZHB5LCBpbnQgc2NyTnVtKQotewotICAgY2hhciAqZHJpdmVyTmFtZTsKLSAgIGlmIChHZXREcml2ZXJOYW1lKGRweSwgc2NyTnVtLCAmZHJpdmVyTmFtZSkpIHsKLSAgICAgIF9fRFJJZHJpdmVyICpyZXQ7Ci0gICAgICByZXQgPSBPcGVuRHJpdmVyKGRyaXZlck5hbWUpOwotICAgICAgaWYgKGRyaXZlck5hbWUpCi0gICAgIAkgWGZyZWUoZHJpdmVyTmFtZSk7Ci0gICAgICByZXR1cm4gcmV0OwotICAgfQotICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9uIGZvciBxdWVyeWluZyB0aGUgRFJJIGRyaXZlciBmb3IgYSBnaXZlbiBzY3JlZW4uCiAgKgpAQCAtMzc5LDcgKzExMyw3IEBACiBQVUJMSUMgY29uc3QgY2hhciAqZ2xYR2V0U2NyZWVuRHJpdmVyIChEaXNwbGF5ICpkcHksIGludCBzY3JOdW0pIHsKICAgIHN0YXRpYyBjaGFyIHJldFszMl07CiAgICBjaGFyICpkcml2ZXJOYW1lOwotICAgaWYgKEdldERyaXZlck5hbWUoZHB5LCBzY3JOdW0sICZkcml2ZXJOYW1lKSkgeworICAgaWYgKGRyaUdldERyaXZlck5hbWUoZHB5LCBzY3JOdW0sICZkcml2ZXJOYW1lKSkgewogICAgICAgaW50IGxlbjsKICAgICAgIGlmICghZHJpdmVyTmFtZSkKIAkgcmV0dXJuIE5VTEw7CkBAIC0zOTMsNyArMTI3LDYgQEAKICAgIHJldHVybiBOVUxMOwogfQogCi0KIC8qCiAgKiBFeHBvcnRlZCBmdW5jdGlvbiBmb3Igb2J0YWluaW5nIGEgZHJpdmVyJ3Mgb3B0aW9uIGxpc3QgKFVURi04IGVuY29kZWQgWE1MKS4KICAqCkBAIC00MDUsNzEgKzEzOCw1MzAgQEAKICAqCiAgKiBOb3RlOiBUaGUgZHJpdmVyIHJlbWFpbnMgb3BlbmVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotUFVCTElDIGNvbnN0IGNoYXIgKmdsWEdldERyaXZlckNvbmZpZyAoY29uc3QgY2hhciAqZHJpdmVyTmFtZSkgewotICAgX19EUklkcml2ZXIgKmRyaXZlciA9IE9wZW5Ecml2ZXIgKGRyaXZlck5hbWUpOwotICAgaWYgKGRyaXZlcikKLSAgICAgIHJldHVybiBkbHN5bSAoZHJpdmVyLT5oYW5kbGUsICJfX2RyaUNvbmZpZ09wdGlvbnMiKTsKK1BVQkxJQyBjb25zdCBjaGFyICpnbFhHZXREcml2ZXJDb25maWcgKGNvbnN0IGNoYXIgKmRyaXZlck5hbWUpCit7CisgICB2b2lkICpoYW5kbGUgPSBkcmlPcGVuRHJpdmVyIChkcml2ZXJOYW1lKTsKKyAgIGlmIChoYW5kbGUpCisgICAgICByZXR1cm4gZGxzeW0gKGhhbmRsZSwgIl9fZHJpQ29uZmlnT3B0aW9ucyIpOwogICAgZWxzZQogICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKyNpZmRlZiBYREFNQUdFXzFfMV9JTlRFUkZBQ0UKKworc3RhdGljIEdMYm9vbGVhbiBoYXNfZGFtYWdlX3Bvc3QoRGlzcGxheSAqZHB5KQoreworICAgIHN0YXRpYyBHTGJvb2xlYW4gaW5pdGVkID0gR0xfRkFMU0U7CisgICAgc3RhdGljIEdMYm9vbGVhbiBoYXNfZGFtYWdlOworCisgICAgaWYgKCFpbml0ZWQpIHsKKwlpbnQgbWFqb3IsIG1pbm9yOworCisJaWYgKFhEYW1hZ2VRdWVyeVZlcnNpb24oZHB5LCAmbWFqb3IsICZtaW5vcikgJiYKKwkgICAgbWFqb3IgPT0gMSAmJiBtaW5vciA+PSAxKQorCXsKKwkgICAgaGFzX2RhbWFnZSA9IEdMX1RSVUU7CisJfSBlbHNlIHsKKwkgICAgaGFzX2RhbWFnZSA9IEdMX0ZBTFNFOworCX0KKwlpbml0ZWQgPSBHTF9UUlVFOworICAgIH0KKworICAgIHJldHVybiBoYXNfZGFtYWdlOworfQorCitzdGF0aWMgdm9pZCBfX2dsWFJlcG9ydERhbWFnZShfX0RSSWRyYXdhYmxlICpkcmlEcmF3LAorCQkJICAgICAgaW50IHgsIGludCB5LAorCQkJICAgICAgZHJtX2NsaXBfcmVjdF90ICpyZWN0cywgaW50IG51bV9yZWN0cywKKwkJCSAgICAgIEdMYm9vbGVhbiBmcm9udF9idWZmZXIsCisJCQkgICAgICB2b2lkICpsb2FkZXJQcml2YXRlKQoreworICAgIFhSZWN0YW5nbGUgKnhyZWN0czsKKyAgICBYc2VydmVyUmVnaW9uIHJlZ2lvbjsKKyAgICBpbnQgaTsKKyAgICBpbnQgeF9vZmYsIHlfb2ZmOworICAgIF9fR0xYRFJJZHJhd2FibGUgKmdseERyYXcgPSBsb2FkZXJQcml2YXRlOworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjID0gZ2x4RHJhdy0+cHNjOworICAgIERpc3BsYXkgKmRweSA9IHBzYy0+ZHB5OworICAgIERyYXdhYmxlIGRyYXdhYmxlOworCisgICAgaWYgKCFoYXNfZGFtYWdlX3Bvc3QoZHB5KSkKKwlyZXR1cm47CisKKyAgICBpZiAoZnJvbnRfYnVmZmVyKSB7CisJeF9vZmYgPSB4OworCXlfb2ZmID0geTsKKwlkcmF3YWJsZSA9IFJvb3RXaW5kb3coZHB5LCBwc2MtPnNjcik7CisgICAgfSBlbHNleworCXhfb2ZmID0gMDsKKwl5X29mZiA9IDA7CisJZHJhd2FibGUgPSBnbHhEcmF3LT54RHJhd2FibGU7CisgICAgfQorCisgICAgeHJlY3RzID0gbWFsbG9jKHNpemVvZihYUmVjdGFuZ2xlKSAqIG51bV9yZWN0cyk7CisgICAgaWYgKHhyZWN0cyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcmVjdHM7IGkrKykgeworCXhyZWN0c1tpXS54ID0gcmVjdHNbaV0ueDEgKyB4X29mZjsKKwl4cmVjdHNbaV0ueSA9IHJlY3RzW2ldLnkxICsgeV9vZmY7CisJeHJlY3RzW2ldLndpZHRoID0gcmVjdHNbaV0ueDIgLSByZWN0c1tpXS54MTsKKwl4cmVjdHNbaV0uaGVpZ2h0ID0gcmVjdHNbaV0ueTIgLSByZWN0c1tpXS55MTsKKyAgICB9CisgICAgcmVnaW9uID0gWEZpeGVzQ3JlYXRlUmVnaW9uKGRweSwgeHJlY3RzLCBudW1fcmVjdHMpOworICAgIGZyZWUoeHJlY3RzKTsKKyAgICBYRGFtYWdlQWRkKGRweSwgZHJhd2FibGUsIHJlZ2lvbik7CisgICAgWEZpeGVzRGVzdHJveVJlZ2lvbihkcHksIHJlZ2lvbik7Cit9CisKK3N0YXRpYyBjb25zdCBfX0RSSWRhbWFnZUV4dGVuc2lvbiBkYW1hZ2VFeHRlbnNpb24gPSB7CisgICAgeyBfX0RSSV9EQU1BR0UsIF9fRFJJX0RBTUFHRV9WRVJTSU9OIH0sCisgICAgX19nbFhSZXBvcnREYW1hZ2UsCit9OworCisjZW5kaWYKKworc3RhdGljIEdMYm9vbGVhbgorX19nbFhEUklHZXREcmF3YWJsZUluZm8oX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCQl1bnNpZ25lZCBpbnQgKmluZGV4LCB1bnNpZ25lZCBpbnQgKnN0YW1wLCAKKwkJCWludCAqWCwgaW50ICpZLCBpbnQgKlcsIGludCAqSCwKKwkJCWludCAqbnVtQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcENsaXBSZWN0cywKKwkJCWludCAqYmFja1gsIGludCAqYmFja1ksCisJCQlpbnQgKm51bUJhY2tDbGlwUmVjdHMsIGRybV9jbGlwX3JlY3RfdCAqKnBCYWNrQ2xpcFJlY3RzLAorCQkJdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlICpnbHhEcmF3ID0gbG9hZGVyUHJpdmF0ZTsKKyAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYyA9IGdseERyYXctPnBzYzsKKyAgICBEaXNwbGF5ICpkcHkgPSBwc2MtPmRweTsKKworICAgIHJldHVybiBYRjg2RFJJR2V0RHJhd2FibGVJbmZvKGRweSwgcHNjLT5zY3IsIGdseERyYXctPmRyYXdhYmxlLAorCQkJCSAgaW5kZXgsIHN0YW1wLCBYLCBZLCBXLCBILAorCQkJCSAgbnVtQ2xpcFJlY3RzLCBwQ2xpcFJlY3RzLAorCQkJCSAgYmFja1gsIGJhY2tZLAorCQkJCSAgbnVtQmFja0NsaXBSZWN0cywgcEJhY2tDbGlwUmVjdHMpOworfQorCitzdGF0aWMgY29uc3QgX19EUklnZXREcmF3YWJsZUluZm9FeHRlbnNpb24gZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uID0geworICAgIHsgX19EUklfR0VUX0RSQVdBQkxFX0lORk8sIF9fRFJJX0dFVF9EUkFXQUJMRV9JTkZPX1ZFUlNJT04gfSwKKyAgICBfX2dsWERSSUdldERyYXdhYmxlSW5mbworfTsKKworc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpsb2FkZXJfZXh0ZW5zaW9uc1tdID0geworICAgICZzeXN0ZW1UaW1lRXh0ZW5zaW9uLmJhc2UsCisgICAgJmdldERyYXdhYmxlSW5mb0V4dGVuc2lvbi5iYXNlLAorI2lmZGVmIFhEQU1BR0VfMV8xX0lOVEVSRkFDRQorICAgICZkYW1hZ2VFeHRlbnNpb24uYmFzZSwKKyNlbmRpZgorICAgIE5VTEwKK307CisKKyNpZm5kZWYgR0xYX1VTRV9BUFBMRUdMCisKKy8qKgorICogUGVyZm9ybSB0aGUgcmVxdWlyZWQgbGliR0wtc2lkZSBpbml0aWFsaXphdGlvbiBhbmQgY2FsbCB0aGUgY2xpZW50LXNpZGUKKyAqIGRyaXZlcidzIFxjIF9fZHJpQ3JlYXRlTmV3U2NyZWVuIGZ1bmN0aW9uLgorICogCisgKiBccGFyYW0gZHB5ICAgIERpc3BsYXkgcG9pbnRlci4KKyAqIFxwYXJhbSBzY3JuICAgU2NyZWVuIG51bWJlciBvbiB0aGUgZGlzcGxheS4KKyAqIFxwYXJhbSBwc2MgICAgRFJJIHNjcmVlbiBpbmZvcm1hdGlvbi4KKyAqIFxwYXJhbSBkcmlEcHkgRFJJIGRpc3BsYXkgaW5mb3JtYXRpb24uCisgKiBccGFyYW0gY3JlYXRlTmV3U2NyZWVuICBQb2ludGVyIHRvIHRoZSBjbGllbnQtc2lkZSBkcml2ZXIncworICogICAgICAgICAgICAgICBcYyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jdGlvbi4KKyAqIFxyZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgXGMgX19EUklzY3JlZW5Qcml2YXRlIHN0cnVjdHVyZSByZXR1cm5lZCBieQorICogICAgICAgICAgdGhlIGNsaWVudC1zaWRlIGRyaXZlciBvbiBzdWNjZXNzLCBvciBcYyBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkICoKK0NhbGxDcmVhdGVOZXdTY3JlZW4oRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgX19HTFhzY3JlZW5Db25maWdzICpwc2MsCisJCSAgICBfX0dMWERSSWRpc3BsYXlQcml2YXRlICogZHJpRHB5KQoreworICAgIHZvaWQgKnBzcCA9IE5VTEw7CisgICAgZHJtX2hhbmRsZV90IGhTQVJFQTsKKyAgICBkcm1BZGRyZXNzIHBTQVJFQSA9IE1BUF9GQUlMRUQ7CisgICAgY2hhciAqQnVzSUQ7CisgICAgX19EUkl2ZXJzaW9uICAgZGR4X3ZlcnNpb247CisgICAgX19EUkl2ZXJzaW9uICAgZHJpX3ZlcnNpb247CisgICAgX19EUkl2ZXJzaW9uICAgZHJtX3ZlcnNpb247CisgICAgX19EUklmcmFtZWJ1ZmZlciAgZnJhbWVidWZmZXI7CisgICAgaW50ICAgZmQgPSAtMTsKKyAgICBpbnQgICBzdGF0dXM7CisKKyAgICBkcm1fbWFnaWNfdCBtYWdpYzsKKyAgICBkcm1WZXJzaW9uUHRyIHZlcnNpb247CisgICAgaW50IG5ld2x5b3BlbmVkOworICAgIGNoYXIgKmRyaXZlck5hbWU7CisgICAgZHJtX2hhbmRsZV90ICBoRkI7CisgICAgaW50ICAgICAgICBqdW5rOworICAgIGNvbnN0IF9fRFJJY29uZmlnICoqZHJpdmVyX2NvbmZpZ3M7CisKKyAgICAvKiBEUkkgcHJvdG9jb2wgdmVyc2lvbi4gKi8KKyAgICBkcmlfdmVyc2lvbi5tYWpvciA9IGRyaURweS0+ZHJpTWFqb3I7CisgICAgZHJpX3ZlcnNpb24ubWlub3IgPSBkcmlEcHktPmRyaU1pbm9yOworICAgIGRyaV92ZXJzaW9uLnBhdGNoID0gZHJpRHB5LT5kcmlQYXRjaDsKKworICAgIGZyYW1lYnVmZmVyLmJhc2UgPSBNQVBfRkFJTEVEOworICAgIGZyYW1lYnVmZmVyLmRldl9wcml2ID0gTlVMTDsKKworICAgIGlmICghWEY4NkRSSU9wZW5Db25uZWN0aW9uKGRweSwgc2NybiwgJmhTQVJFQSwgJkJ1c0lEKSkgeworCUVycm9yTWVzc2FnZUYoIlhGODZEUklPcGVuQ29ubmVjdGlvbiBmYWlsZWRcbiIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIGZkID0gZHJtT3Blbk9uY2UoTlVMTCwgQnVzSUQsICZuZXdseW9wZW5lZCk7CisKKyAgICBYZnJlZShCdXNJRCk7IC8qIE5vIGxvbmdlciBuZWVkZWQgKi8KKworICAgIGlmIChmZCA8IDApIHsKKwlFcnJvck1lc3NhZ2VGKCJkcm1PcGVuT25jZSBmYWlsZWQgKCVzKVxuIiwgc3RyZXJyb3IoLWZkKSk7CisJZ290byBoYW5kbGVfZXJyb3I7CisgICAgfQorCisgICAgaWYgKGRybUdldE1hZ2ljKGZkLCAmbWFnaWMpKSB7CisJRXJyb3JNZXNzYWdlRigiZHJtR2V0TWFnaWMgZmFpbGVkXG4iKTsKKwlnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCk7CisgICAgaWYgKHZlcnNpb24pIHsKKwlkcm1fdmVyc2lvbi5tYWpvciA9IHZlcnNpb24tPnZlcnNpb25fbWFqb3I7CisJZHJtX3ZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yOworCWRybV92ZXJzaW9uLnBhdGNoID0gdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsOworCWRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworICAgIH0KKyAgICBlbHNlIHsKKwlkcm1fdmVyc2lvbi5tYWpvciA9IC0xOworCWRybV92ZXJzaW9uLm1pbm9yID0gLTE7CisJZHJtX3ZlcnNpb24ucGF0Y2ggPSAtMTsKKyAgICB9CisKKyAgICBpZiAobmV3bHlvcGVuZWQgJiYgIVhGODZEUklBdXRoQ29ubmVjdGlvbihkcHksIHNjcm4sIG1hZ2ljKSkgeworCUVycm9yTWVzc2FnZUYoIlhGODZEUklBdXRoQ29ubmVjdGlvbiBmYWlsZWRcbiIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIC8qIEdldCBkZXZpY2UgbmFtZSAobGlrZSAidGRmeCIpIGFuZCB0aGUgZGR4IHZlcnNpb24gbnVtYmVycy4KKyAgICAgKiBXZSdsbCBjaGVjayB0aGUgdmVyc2lvbiBpbiBlYWNoIERSSSBkcml2ZXIncyAiY3JlYXRlTmV3U2NyZWVuIgorICAgICAqIGZ1bmN0aW9uLiAqLworICAgIGlmICghWEY4NkRSSUdldENsaWVudERyaXZlck5hbWUoZHB5LCBzY3JuLAorCQkJCSAgICAmZGR4X3ZlcnNpb24ubWFqb3IsCisJCQkJICAgICZkZHhfdmVyc2lvbi5taW5vciwKKwkJCQkgICAgJmRkeF92ZXJzaW9uLnBhdGNoLAorCQkJCSAgICAmZHJpdmVyTmFtZSkpIHsKKwlFcnJvck1lc3NhZ2VGKCJYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZSBmYWlsZWRcbiIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIFhmcmVlKGRyaXZlck5hbWUpOyAvKiBObyBsb25nZXIgbmVlZGVkLiAqLworCisgICAgLyoKKyAgICAgKiBHZXQgZGV2aWNlLXNwZWNpZmljIGluZm8uICBwRGV2UHJpdiB3aWxsIHBvaW50IHRvIGEgc3RydWN0CisgICAgICogKHN1Y2ggYXMgRFJJUkFERU9OUmVjIGluIHhmcmVlODYvZHJpdmVyL2F0aS9yYWRlb25fZHJpLmgpIHRoYXQKKyAgICAgKiBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmVlbiBzaXplLCBkZXB0aCwgcGl0Y2gsIGFuY2lsbGlhcnkKKyAgICAgKiBidWZmZXJzLCBEUk0gbW1hcCBoYW5kbGVzLCBldGMuCisgICAgICovCisgICAgaWYgKCFYRjg2RFJJR2V0RGV2aWNlSW5mbyhkcHksIHNjcm4sICZoRkIsICZqdW5rLAorCQkJICAgICAgJmZyYW1lYnVmZmVyLnNpemUsICZmcmFtZWJ1ZmZlci5zdHJpZGUsCisJCQkgICAgICAmZnJhbWVidWZmZXIuZGV2X3ByaXZfc2l6ZSwgJmZyYW1lYnVmZmVyLmRldl9wcml2KSkgeworCUVycm9yTWVzc2FnZUYoIlhGODZEUklHZXREZXZpY2VJbmZvIGZhaWxlZCIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIGZyYW1lYnVmZmVyLndpZHRoID0gRGlzcGxheVdpZHRoKGRweSwgc2Nybik7CisgICAgZnJhbWVidWZmZXIuaGVpZ2h0ID0gRGlzcGxheUhlaWdodChkcHksIHNjcm4pOworCisgICAgLyogTWFwIHRoZSBmcmFtZWJ1ZmZlciByZWdpb24uICovCisgICAgc3RhdHVzID0gZHJtTWFwKGZkLCBoRkIsIGZyYW1lYnVmZmVyLnNpemUsIAorCQkgICAgKGRybUFkZHJlc3NQdHIpJmZyYW1lYnVmZmVyLmJhc2UpOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworCUVycm9yTWVzc2FnZUYoImRybU1hcCBvZiBmcmFtZWJ1ZmZlciBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKC1zdGF0dXMpKTsKKwlnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICB9CisKKyAgICAvKiBNYXAgdGhlIFNBUkVBIHJlZ2lvbi4gIEZ1cnRoZXIgbW1hcCByZWdpb25zIG1heSBiZSBzZXR1cCBpbgorICAgICAqIGVhY2ggRFJJIGRyaXZlcidzICJjcmVhdGVOZXdTY3JlZW4iIGZ1bmN0aW9uLgorICAgICAqLworICAgIHN0YXR1cyA9IGRybU1hcChmZCwgaFNBUkVBLCBTQVJFQV9NQVgsICZwU0FSRUEpOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworCUVycm9yTWVzc2FnZUYoImRybU1hcCBvZiBTQVJFQSBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKC1zdGF0dXMpKTsKKwlnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICB9CisKKyAgICBwc3AgPSAoKnBzYy0+bGVnYWN5LT5jcmVhdGVOZXdTY3JlZW4pKHNjcm4sCisJCQkJCSAgJmRkeF92ZXJzaW9uLAorCQkJCQkgICZkcmlfdmVyc2lvbiwKKwkJCQkJICAmZHJtX3ZlcnNpb24sCisJCQkJCSAgJmZyYW1lYnVmZmVyLAorCQkJCQkgIHBTQVJFQSwKKwkJCQkJICBmZCwKKwkJCQkJICBsb2FkZXJfZXh0ZW5zaW9ucywKKwkJCQkJICAmZHJpdmVyX2NvbmZpZ3MsCisJCQkJCSAgcHNjKTsKKworICAgIGlmIChwc3AgPT0gTlVMTCkgeworCUVycm9yTWVzc2FnZUYoIkNhbGxpbmcgZHJpdmVyIGVudHJ5IHBvaW50IGZhaWxlZCIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIHBzYy0+Y29uZmlncyA9IGRyaUNvbnZlcnRDb25maWdzKHBzYy0+Y29yZSwgcHNjLT5jb25maWdzLCBkcml2ZXJfY29uZmlncyk7CisgICAgcHNjLT52aXN1YWxzID0gZHJpQ29udmVydENvbmZpZ3MocHNjLT5jb3JlLCBwc2MtPnZpc3VhbHMsIGRyaXZlcl9jb25maWdzKTsKKworICAgIHJldHVybiBwc3A7CisKKyBoYW5kbGVfZXJyb3I6CisgICAgaWYgKHBTQVJFQSAhPSBNQVBfRkFJTEVEKQorCWRybVVubWFwKHBTQVJFQSwgU0FSRUFfTUFYKTsKKworICAgIGlmIChmcmFtZWJ1ZmZlci5iYXNlICE9IE1BUF9GQUlMRUQpCisJZHJtVW5tYXAoKGRybUFkZHJlc3MpZnJhbWVidWZmZXIuYmFzZSwgZnJhbWVidWZmZXIuc2l6ZSk7CisKKyAgICBpZiAoZnJhbWVidWZmZXIuZGV2X3ByaXYgIT0gTlVMTCkKKwlYZnJlZShmcmFtZWJ1ZmZlci5kZXZfcHJpdik7CisKKyAgICBpZiAoZmQgPj0gMCkKKwlkcm1DbG9zZU9uY2UoZmQpOworCisgICAgWEY4NkRSSUNsb3NlQ29ubmVjdGlvbihkcHksIHNjcm4pOworCisgICAgRXJyb3JNZXNzYWdlRigicmV2ZXJ0aW5nIHRvIHNvZnR3YXJlIGRpcmVjdCByZW5kZXJpbmdcbiIpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlIC8qICFHTFhfVVNFX0FQUExFR0wgKi8KKworc3RhdGljIHZvaWQgKgorQ2FsbENyZWF0ZU5ld1NjcmVlbihEaXNwbGF5ICpkcHksIGludCBzY3JuLCBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywKKwkJICAgIF9fR0xYRFJJZGlzcGxheVByaXZhdGUgKiBkcmlEcHkpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZiAvKiAhR0xYX1VTRV9BUFBMRUdMICovCisKK3N0YXRpYyB2b2lkIGRyaURlc3Ryb3lDb250ZXh0KF9fR0xYRFJJY29udGV4dCAqY29udGV4dCwKKwkJCSAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLCBEaXNwbGF5ICpkcHkpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwID0gKF9fR0xYRFJJY29udGV4dFByaXZhdGUgKikgY29udGV4dDsKKwkJCQorICAgICgqcHNjLT5jb3JlLT5kZXN0cm95Q29udGV4dCkocGNwLT5kcmlDb250ZXh0KTsKKworICAgIFhGODZEUklEZXN0cm95Q29udGV4dChwc2MtPmRweSwgcHNjLT5zY3IsIHBjcC0+aHdDb250ZXh0SUQpOworICAgIFhmcmVlKHBjcCk7Cit9CisKK3N0YXRpYyBCb29sIGRyaUJpbmRDb250ZXh0KF9fR0xYRFJJY29udGV4dCAqY29udGV4dCwKKwkJCSAgIF9fR0xYRFJJZHJhd2FibGUgKmRyYXcsIF9fR0xYRFJJZHJhd2FibGUgKnJlYWQpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwID0gKF9fR0xYRFJJY29udGV4dFByaXZhdGUgKikgY29udGV4dDsKKyAgICBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUgPSBwY3AtPnBzYy0+Y29yZTsKKworICAgIHJldHVybiAoKmNvcmUtPmJpbmRDb250ZXh0KShwY3AtPmRyaUNvbnRleHQsCisJCQkJZHJhdy0+ZHJpRHJhd2FibGUsCisJCQkJcmVhZC0+ZHJpRHJhd2FibGUpOworfQorCitzdGF0aWMgdm9pZCBkcmlVbmJpbmRDb250ZXh0KF9fR0xYRFJJY29udGV4dCAqY29udGV4dCkKK3sKKyAgICBfX0dMWERSSWNvbnRleHRQcml2YXRlICpwY3AgPSAoX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqKSBjb250ZXh0OworICAgIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSA9IHBjcC0+cHNjLT5jb3JlOworCisgICAgKCpjb3JlLT51bmJpbmRDb250ZXh0KShwY3AtPmRyaUNvbnRleHQpOworfQorCitzdGF0aWMgX19HTFhEUkljb250ZXh0ICpkcmlDcmVhdGVDb250ZXh0KF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLAorCQkJCQkgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZSwKKwkJCQkJIEdMWENvbnRleHQgZ2MsCisJCQkJCSBHTFhDb250ZXh0IHNoYXJlTGlzdCwgaW50IHJlbmRlclR5cGUpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwLCAqcGNwX3NoYXJlZDsKKyAgICBkcm1fY29udGV4dF90IGh3Q29udGV4dDsKKyAgICBfX0RSSWNvbnRleHQgKnNoYXJlZCA9IE5VTEw7CisgICAgX19HTFhEUkljb25maWdQcml2YXRlICpjb25maWcgPSAoX19HTFhEUkljb25maWdQcml2YXRlICopIG1vZGU7CisKKyAgICBpZiAoIXBzYyB8fCAhcHNjLT5kcmlTY3JlZW4pCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc2hhcmVMaXN0KSB7CisJcGNwX3NoYXJlZCA9IChfX0dMWERSSWNvbnRleHRQcml2YXRlICopIHNoYXJlTGlzdC0+ZHJpQ29udGV4dDsKKwlzaGFyZWQgPSBwY3Bfc2hhcmVkLT5kcmlDb250ZXh0OworICAgIH0KKworICAgIHBjcCA9IFhtYWxsb2Moc2l6ZW9mICpwY3ApOworICAgIGlmIChwY3AgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHBjcC0+cHNjID0gcHNjOworICAgIGlmICghWEY4NkRSSUNyZWF0ZUNvbnRleHRXaXRoQ29uZmlnKHBzYy0+ZHB5LCBwc2MtPnNjciwKKwkJCQkJbW9kZS0+dmlzdWFsSUQsCisJCQkJCSZwY3AtPmh3Q29udGV4dElELCAmaHdDb250ZXh0KSkgeworCVhmcmVlKHBjcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGNwLT5kcmlDb250ZXh0ID0KKyAgICAgICAgKCpwc2MtPmxlZ2FjeS0+Y3JlYXRlTmV3Q29udGV4dCkocHNjLT5fX2RyaVNjcmVlbiwKKwkJCQkJIGNvbmZpZy0+ZHJpQ29uZmlnLAorCQkJCQkgcmVuZGVyVHlwZSwKKwkJCQkJIHNoYXJlZCwKKwkJCQkJIGh3Q29udGV4dCwKKwkJCQkJIHBjcCk7CisgICAgaWYgKHBjcC0+ZHJpQ29udGV4dCA9PSBOVUxMKSB7CisJWEY4NkRSSURlc3Ryb3lDb250ZXh0KHBzYy0+ZHB5LCBwc2MtPnNjciwgcGNwLT5od0NvbnRleHRJRCk7CisJWGZyZWUocGNwKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwY3AtPmJhc2UuZGVzdHJveUNvbnRleHQgPSBkcmlEZXN0cm95Q29udGV4dDsKKyAgICBwY3AtPmJhc2UuYmluZENvbnRleHQgPSBkcmlCaW5kQ29udGV4dDsKKyAgICBwY3AtPmJhc2UudW5iaW5kQ29udGV4dCA9IGRyaVVuYmluZENvbnRleHQ7CisKKyAgICByZXR1cm4gJnBjcC0+YmFzZTsKK30KKworc3RhdGljIHZvaWQgZHJpRGVzdHJveURyYXdhYmxlKF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3KQoreworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjID0gcGRyYXctPnBzYzsKKworICAgICgqcHNjLT5jb3JlLT5kZXN0cm95RHJhd2FibGUpKHBkcmF3LT5kcmlEcmF3YWJsZSk7CisgICAgWEY4NkRSSURlc3Ryb3lEcmF3YWJsZShwc2MtPmRweSwgcHNjLT5zY3IsIHBkcmF3LT5kcmF3YWJsZSk7CisgICAgWGZyZWUocGRyYXcpOworfQorCitzdGF0aWMgX19HTFhEUklkcmF3YWJsZSAqZHJpQ3JlYXRlRHJhd2FibGUoX19HTFhzY3JlZW5Db25maWdzICpwc2MsCisJCQkJCSAgIFhJRCB4RHJhd2FibGUsCisJCQkJCSAgIEdMWERyYXdhYmxlIGRyYXdhYmxlLAorCQkJCQkgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICptb2RlcykKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdzsKKyAgICBkcm1fZHJhd2FibGVfdCBod0RyYXdhYmxlOworICAgIHZvaWQgKmVtcHR5X2F0dHJpYnV0ZV9saXN0ID0gTlVMTDsKKyAgICBfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKmNvbmZpZyA9IChfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKikgbW9kZXM7CisKKyAgICAvKiBPbGQgZHJpIGNhbid0IGhhbmRsZSBHTFggMS4zKyBkcmF3YWJsZSBjb25zdHJ1Y3RvcnMuICovCisgICAgaWYgKHhEcmF3YWJsZSAhPSBkcmF3YWJsZSkKKwlyZXR1cm4gTlVMTDsKKworICAgIHBkcmF3ID0gWG1hbGxvYyhzaXplb2YoKnBkcmF3KSk7CisgICAgaWYgKCFwZHJhdykKKwlyZXR1cm4gTlVMTDsKKworICAgIHBkcmF3LT5kcmF3YWJsZSA9IGRyYXdhYmxlOworICAgIHBkcmF3LT5wc2MgPSBwc2M7CisKKyAgICBpZiAoIVhGODZEUklDcmVhdGVEcmF3YWJsZShwc2MtPmRweSwgcHNjLT5zY3IsIGRyYXdhYmxlLCAmaHdEcmF3YWJsZSkpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgKi8KKyAgICBwZHJhdy0+ZHJpRHJhd2FibGUgPQorCSgqcHNjLT5sZWdhY3ktPmNyZWF0ZU5ld0RyYXdhYmxlKShwc2MtPl9fZHJpU2NyZWVuLAorCQkJCQkgIGNvbmZpZy0+ZHJpQ29uZmlnLAorCQkJCQkgIGh3RHJhd2FibGUsCisJCQkJCSAgR0xYX1dJTkRPV19CSVQsCisJCQkJCSAgZW1wdHlfYXR0cmlidXRlX2xpc3QsCisJCQkJCSAgcGRyYXcpOworCisgICAgaWYgKCFwZHJhdy0+ZHJpRHJhd2FibGUpIHsKKwlYRjg2RFJJRGVzdHJveURyYXdhYmxlKHBzYy0+ZHB5LCBwc2MtPnNjciwgZHJhd2FibGUpOworCVhmcmVlKHBkcmF3KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwZHJhdy0+ZGVzdHJveURyYXdhYmxlID0gZHJpRGVzdHJveURyYXdhYmxlOworCisgICAgcmV0dXJuIHBkcmF3OworfQorCitzdGF0aWMgdm9pZCBkcmlEZXN0cm95U2NyZWVuKF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjKQoreworICAgIC8qIEZyZWUgdGhlIGRpcmVjdCByZW5kZXJpbmcgcGVyIHNjcmVlbiBkYXRhICovCisgICAgaWYgKHBzYy0+X19kcmlTY3JlZW4pCisJKCpwc2MtPmNvcmUtPmRlc3Ryb3lTY3JlZW4pKHBzYy0+X19kcmlTY3JlZW4pOworICAgIHBzYy0+X19kcmlTY3JlZW4gPSBOVUxMOworICAgIGlmIChwc2MtPmRyaXZlcikKKwlkbGNsb3NlKHBzYy0+ZHJpdmVyKTsKK30KKworc3RhdGljIF9fR0xYRFJJc2NyZWVuICpkcmlDcmVhdGVTY3JlZW4oX19HTFhzY3JlZW5Db25maWdzICpwc2MsIGludCBzY3JlZW4sCisJCQkJICAgICAgIF9fR0xYZGlzcGxheVByaXZhdGUgKnByaXYpCit7CisgICAgX19HTFhEUklkaXNwbGF5UHJpdmF0ZSAqcGRwOworICAgIF9fR0xYRFJJc2NyZWVuICpwc3A7CisgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zOworICAgIGNoYXIgKmRyaXZlck5hbWU7CisgICAgaW50IGk7CisKKyAgICBwc3AgPSBYbWFsbG9jKHNpemVvZiAqcHNwKTsKKyAgICBpZiAocHNwID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBJbml0aWFsaXplIHBlciBzY3JlZW4gZHluYW1pYyBjbGllbnQgR0xYIGV4dGVuc2lvbnMgKi8KKyAgICBwc2MtPmV4dF9saXN0X2ZpcnN0X3RpbWUgPSBHTF9UUlVFOworCisgICAgaWYgKCFkcmlHZXREcml2ZXJOYW1lKHByaXYtPmRweSwgc2NyZWVuLCAmZHJpdmVyTmFtZSkpIHsKKwlYZnJlZShwc3ApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHBzYy0+ZHJpdmVyID0gZHJpT3BlbkRyaXZlcihkcml2ZXJOYW1lKTsKKyAgICBYZnJlZShkcml2ZXJOYW1lKTsKKyAgICBpZiAocHNjLT5kcml2ZXIgPT0gTlVMTCkgeworCVhmcmVlKHBzcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXh0ZW5zaW9ucyA9IGRsc3ltKHBzYy0+ZHJpdmVyLCBfX0RSSV9EUklWRVJfRVhURU5TSU9OUyk7CisgICAgaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkgeworIAlFcnJvck1lc3NhZ2VGKCJkcml2ZXIgZXhwb3J0cyBubyBleHRlbnNpb25zICglcylcbiIsIGRsZXJyb3IoKSk7CisJWGZyZWUocHNwKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBleHRlbnNpb25zW2ldOyBpKyspIHsKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX0NPUkUpID09IDApCisJICAgIHBzYy0+Y29yZSA9IChfX0RSSWNvcmVFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX0xFR0FDWSkgPT0gMCkKKwkgICAgcHNjLT5sZWdhY3kgPSAoX19EUklsZWdhY3lFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKyAgICB9CisKKyAgICBpZiAocHNjLT5jb3JlID09IE5VTEwgfHwgcHNjLT5sZWdhY3kgPT0gTlVMTCkgeworCVhmcmVlKHBzcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgICBwZHAgPSAoX19HTFhEUklkaXNwbGF5UHJpdmF0ZSAqKSBwcml2LT5kcmlEaXNwbGF5OworICAgIHBzYy0+X19kcmlTY3JlZW4gPQorIAlDYWxsQ3JlYXRlTmV3U2NyZWVuKHBzYy0+ZHB5LCBzY3JlZW4sIHBzYywgcGRwKTsKKyAgICBpZiAocHNjLT5fX2RyaVNjcmVlbiA9PSBOVUxMKSB7CisgCWRsY2xvc2UocHNjLT5kcml2ZXIpOworIAlYZnJlZShwc3ApOworIAlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkcmlCaW5kRXh0ZW5zaW9ucyhwc2MsIDApOworCisgICAgcHNwLT5kZXN0cm95U2NyZWVuID0gZHJpRGVzdHJveVNjcmVlbjsKKyAgICBwc3AtPmNyZWF0ZUNvbnRleHQgPSBkcmlDcmVhdGVDb250ZXh0OworICAgIHBzcC0+Y3JlYXRlRHJhd2FibGUgPSBkcmlDcmVhdGVEcmF3YWJsZTsKKworICAgIHJldHVybiBwc3A7Cit9CiAKIC8qIENhbGxlZCBmcm9tIF9fZ2xYRnJlZURpc3BsYXlQcml2YXRlLgogICovCi1zdGF0aWMgdm9pZCBkcmlEZXN0cm95RGlzcGxheShEaXNwbGF5ICpkcHksIHZvaWQgKnByaXZhdGUpCitzdGF0aWMgdm9pZCBkcmlEZXN0cm95RGlzcGxheShfX0dMWERSSWRpc3BsYXkgKmRweSkKIHsKLSAgICBfX0RSSWRpc3BsYXlQcml2YXRlICpwZHB5cCA9IChfX0RSSWRpc3BsYXlQcml2YXRlICopcHJpdmF0ZTsKLQotICAgIGlmIChwZHB5cCkgewotICAgICAgICBjb25zdCBpbnQgbnVtU2NyZWVucyA9IFNjcmVlbkNvdW50KGRweSk7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2NyZWVuczsgaSsrKSB7Ci0JICAgaWYgKHBkcHlwLT5saWJyYXJ5SGFuZGxlc1tpXSkgewotCSAgICAgIF9fRFJJZHJpdmVyICpkcml2ZXIsICpwcmV2OwotCi0JICAgICAgLyogUmVtb3ZlIGRyaXZlciBmcm9tIERyaXZlcnMgbGlzdCAqLwotCSAgICAgIGZvciAocHJldiA9IE5VTEwsIGRyaXZlciA9IERyaXZlcnM7IGRyaXZlcjsKLQkJICAgcHJldiA9IGRyaXZlciwgZHJpdmVyID0gZHJpdmVyLT5uZXh0KSB7Ci0JCSBpZiAoZHJpdmVyLT5oYW5kbGUgPT0gcGRweXAtPmxpYnJhcnlIYW5kbGVzW2ldKSB7Ci0JCSAgICBpZiAocHJldikKLQkJICAgICAgIHByZXYtPm5leHQgPSBkcml2ZXItPm5leHQ7Ci0JCSAgICBlbHNlCi0JCSAgICAgICBEcml2ZXJzID0gZHJpdmVyLT5uZXh0OwotCi0JCSAgICBYZnJlZSgodm9pZCAqKSBkcml2ZXItPm5hbWUpOwotCQkgICAgWGZyZWUoZHJpdmVyKTsKLQkJICAgIGJyZWFrOwotCQkgfQotCSAgICAgIH0KLQotCSAgICAgIGRsY2xvc2UocGRweXAtPmxpYnJhcnlIYW5kbGVzW2ldKTsKLQkgICB9Ci0gICAgICAgIH0KLSAgICAgICAgWGZyZWUocGRweXAtPmxpYnJhcnlIYW5kbGVzKTsKLQlYZnJlZShwZHB5cCk7Ci0gICAgfQorICAgIFhmcmVlKGRweSk7CiB9CiAKLQogLyoKICAqIEFsbG9jYXRlLCBpbml0aWFsaXplIGFuZCByZXR1cm4gYSBfX0RSSWRpc3BsYXlQcml2YXRlIG9iamVjdC4KICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gX19nbFhJbml0aWFsaXplKCkgd2hlbiB3ZSBhcmUgZ2l2ZW4gYSBuZXcKICAqIGRpc3BsYXkgcG9pbnRlci4KICAqLwotdm9pZCAqZHJpQ3JlYXRlRGlzcGxheShEaXNwbGF5ICpkcHksIF9fRFJJZGlzcGxheSAqcGRpc3ApCitfWF9ISURERU4gX19HTFhEUklkaXNwbGF5ICpkcmlDcmVhdGVEaXNwbGF5KERpc3BsYXkgKmRweSkKIHsKLSAgICBjb25zdCBpbnQgbnVtU2NyZWVucyA9IFNjcmVlbkNvdW50KGRweSk7Ci0gICAgX19EUklkaXNwbGF5UHJpdmF0ZSAqcGRweXA7CisgICAgX19HTFhEUklkaXNwbGF5UHJpdmF0ZSAqcGRweXA7CiAgICAgaW50IGV2ZW50QmFzZSwgZXJyb3JCYXNlOwogICAgIGludCBtYWpvciwgbWlub3IsIHBhdGNoOwotICAgIGludCBzY3JuOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGVzZSBmaWVsZHMgdG8gTlVMTCBpbiBjYXNlIHdlIGZhaWwuCi0gICAgICogSWYgd2UgZG9uJ3QgZG8gdGhpcyB3ZSBtYXkgbGF0ZXIgZ2V0IHNlZ2ZhdWx0cyB0cnlpbmcgdG8gZnJlZSByYW5kb20KLSAgICAgKiBhZGRyZXNzZXMgd2hlbiB0aGUgZGlzcGxheSBpcyBjbG9zZWQuCi0gICAgICovCi0gICAgcGRpc3AtPnByaXZhdGUgPSBOVUxMOwotICAgIHBkaXNwLT5kZXN0cm95RGlzcGxheSA9IE5VTEw7CiAKICAgICBpZiAoIVhGODZEUklRdWVyeUV4dGVuc2lvbihkcHksICZldmVudEJhc2UsICZlcnJvckJhc2UpKSB7CiAJcmV0dXJuIE5VTEw7CkBAIC00NzksNyArNjcxLDcgQEAKIAlyZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBwZHB5cCA9IChfX0RSSWRpc3BsYXlQcml2YXRlICopWG1hbGxvYyhzaXplb2YoX19EUklkaXNwbGF5UHJpdmF0ZSkpOworICAgIHBkcHlwID0gWG1hbGxvYyhzaXplb2YgKnBkcHlwKTsKICAgICBpZiAoIXBkcHlwKSB7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDg4LDQxICs2ODAsMTAgQEAKICAgICBwZHB5cC0+ZHJpTWlub3IgPSBtaW5vcjsKICAgICBwZHB5cC0+ZHJpUGF0Y2ggPSBwYXRjaDsKIAotICAgIHBkaXNwLT5kZXN0cm95RGlzcGxheSA9IGRyaURlc3Ryb3lEaXNwbGF5OworICAgIHBkcHlwLT5iYXNlLmRlc3Ryb3lEaXNwbGF5ID0gZHJpRGVzdHJveURpc3BsYXk7CisgICAgcGRweXAtPmJhc2UuY3JlYXRlU2NyZWVuID0gZHJpQ3JlYXRlU2NyZWVuOwogCi0gICAgLyogYWxsb2NhdGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gY3JlYXRlTmV3U2NyZWVuIGZ1bmNzICovCi0gICAgcGRpc3AtPmNyZWF0ZU5ld1NjcmVlbiA9IChQRk5DUkVBVEVORVdTQ1JFRU5GVU5DICopCi0gICAgICBYbWFsbG9jKG51bVNjcmVlbnMgKiBzaXplb2Yodm9pZCAqKSk7Ci0gICAgaWYgKCFwZGlzcC0+Y3JlYXRlTmV3U2NyZWVuKSB7Ci0gICAgICAgWGZyZWUocGRweXApOwotICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIGFycmF5IG9mIGxpYnJhcnkgaGFuZGxlcyAqLwotICAgIHBkcHlwLT5saWJyYXJ5SGFuZGxlcyA9ICh2b2lkICoqKSBYbWFsbG9jKG51bVNjcmVlbnMgKiBzaXplb2Yodm9pZCopKTsKLSAgICBpZiAoIXBkcHlwLT5saWJyYXJ5SGFuZGxlcykgewotICAgICAgIFhmcmVlKHBkaXNwLT5jcmVhdGVOZXdTY3JlZW4pOwotICAgICAgIFhmcmVlKHBkcHlwKTsKLSAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBkeW5hbWljYWxseSBkaXNjb3ZlciBEUkkgZHJpdmVycyBmb3IgYWxsIHNjcmVlbnMsIHNhdmluZyBlYWNoCi0gICAgICogZHJpdmVyJ3MgIl9fZHJpQ3JlYXRlU2NyZWVuIiBmdW5jdGlvbiBwb2ludGVyLiAgVGhhdCdzIHRoZSBib290c3RyYXAKLSAgICAgKiBlbnRyeXBvaW50IGZvciBhbGwgRFJJIGRyaXZlcnMuCi0gICAgICovCi0gICAgZm9yIChzY3JuID0gMDsgc2NybiA8IG51bVNjcmVlbnM7IHNjcm4rKykgewotICAgICAgICBfX0RSSWRyaXZlciAqZHJpdmVyID0gZHJpR2V0RHJpdmVyKGRweSwgc2Nybik7Ci0gICAgICAgIGlmIChkcml2ZXIpIHsKLSAgICAgICAgICAgcGRpc3AtPmNyZWF0ZU5ld1NjcmVlbltzY3JuXSA9IGRyaXZlci0+Y3JlYXRlTmV3U2NyZWVuRnVuYzsKLSAgICAgICAgICAgcGRweXAtPmxpYnJhcnlIYW5kbGVzW3Njcm5dID0gZHJpdmVyLT5oYW5kbGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgIHBkaXNwLT5jcmVhdGVOZXdTY3JlZW5bc2Nybl0gPSBOVUxMOwotICAgICAgICAgICBwZHB5cC0+bGlicmFyeUhhbmRsZXNbc2Nybl0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkICopcGRweXA7CisgICAgcmV0dXJuICZwZHB5cC0+YmFzZTsKIH0KIAogI2VuZGlmIC8qIEdMWF9ESVJFQ1RfUkVOREVSSU5HICovCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9kcmlfZ2x4LmggYi9zcmMvZ2x4L3gxMS9kcmlfZ2x4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTYxNjguLjAwMDAwMDAKLS0tIGEvc3JjL2dseC94MTEvZHJpX2dseC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAxOTk4LTE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLW9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLU9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi1JTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi1BTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLVRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi1TT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBBdXRob3JzOgotICogICBLZXZpbiBFLiBNYXJ0aW4gPGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tPgotICogICBCcmlhbiBQYXVsIDxicmlhbkBwcmVjaXNpb25pbnNpZ2h0LmNvbT4KLSAqCi0gKi8KLQotI2lmbmRlZiBfRFJJX0dMWF9IXwotI2RlZmluZSBfRFJJX0dMWF9IXwotCi0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLQotc3RydWN0IF9fRFJJZGlzcGxheVByaXZhdGVSZWMgewotICAgIC8qCi0gICAgKiogWEZyZWU4Ni1EUkkgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgICovCi0gICAgaW50IGRyaU1ham9yOwotICAgIGludCBkcmlNaW5vcjsKLSAgICBpbnQgZHJpUGF0Y2g7Ci0KLSAgICAvKgotICAgICoqIEFycmF5IG9mIGxpYnJhcnkgaGFuZGxlcyBbaW5kZXhlZCBieSBzY3JlZW4gbnVtYmVyXQotICAgICovCi0gICAgdm9pZCAqKmxpYnJhcnlIYW5kbGVzOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX19EUklkaXNwbGF5UHJpdmF0ZVJlYyAgX19EUklkaXNwbGF5UHJpdmF0ZTsKLXR5cGVkZWYgc3RydWN0IF9fRFJJc2NyZWVuUHJpdmF0ZVJlYyAgIF9fRFJJc2NyZWVuUHJpdmF0ZTsKLXR5cGVkZWYgc3RydWN0IF9fRFJJdmlzdWFsUHJpdmF0ZVJlYyAgIF9fRFJJdmlzdWFsUHJpdmF0ZTsKLXR5cGVkZWYgc3RydWN0IF9fRFJJY29udGV4dFByaXZhdGVSZWMgIF9fRFJJY29udGV4dFByaXZhdGU7Ci10eXBlZGVmIHN0cnVjdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZVJlYyBfX0RSSWRyYXdhYmxlUHJpdmF0ZTsKLQotI2VuZGlmCi0jZW5kaWYgLyogX0RSSV9HTFhfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL2RyaXN3X2dseC5jIGIvc3JjL2dseC94MTEvZHJpc3dfZ2x4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmN2UxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHgveDExL2RyaXN3X2dseC5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggR2VvcmdlIFNhcG91bnR6aXMKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgImdsaGVhZGVyLmgiCisjaW5jbHVkZSAiZ2x4Y2xpZW50LmgiCisjaW5jbHVkZSAiZ2xjb250ZXh0bW9kZXMuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgImRyaV9jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUklkaXNwbGF5UHJpdmF0ZVJlYyBfX0dMWERSSWRpc3BsYXlQcml2YXRlOwordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUkljb250ZXh0UHJpdmF0ZVJlYyBfX0dMWERSSWNvbnRleHRQcml2YXRlOwordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUklkcmF3YWJsZVByaXZhdGVSZWMgX19HTFhEUklkcmF3YWJsZVByaXZhdGU7CisKK3N0cnVjdCBfX0dMWERSSWRpc3BsYXlQcml2YXRlUmVjIHsKKyAgICBfX0dMWERSSWRpc3BsYXkgYmFzZTsKK307CisKK3N0cnVjdCBfX0dMWERSSWNvbnRleHRQcml2YXRlUmVjIHsKKyAgICBfX0dMWERSSWNvbnRleHQgYmFzZTsKKyAgICBfX0RSSWNvbnRleHQgKmRyaUNvbnRleHQ7CisgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2M7Cit9OworCitzdHJ1Y3QgX19HTFhEUklkcmF3YWJsZVByaXZhdGVSZWMgeworICAgIF9fR0xYRFJJZHJhd2FibGUgYmFzZTsKKworICAgIEdDIGdjOworICAgIEdDIHN3YXBnYzsKKworICAgIFhWaXN1YWxJbmZvICp2aXNpbmZvOworICAgIFhJbWFnZSAqeGltYWdlOworICAgIGludCBicHA7Cit9OworCisvKioKKyAqIHN3cmFzdCBsb2FkZXIgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIEJvb2wgWENyZWF0ZURyYXdhYmxlKF9fR0xYRFJJZHJhd2FibGVQcml2YXRlICpwZHAsCisJCQkgICAgRGlzcGxheSAqZHB5LCBYSUQgZHJhd2FibGUsIGludCB2aXN1YWxpZCkKK3sKKyAgICBYR0NWYWx1ZXMgZ2N2YWx1ZXM7CisgICAgbG9uZyB2aXNNYXNrOworICAgIFhWaXN1YWxJbmZvIHZpc1RlbXA7CisgICAgaW50IG51bV92aXN1YWxzOworCisgICAgLyogY3JlYXRlIEdDJ3MgKi8KKyAgICBwZHAtPmdjID0gWENyZWF0ZUdDKGRweSwgZHJhd2FibGUsIDAsIE5VTEwpOworICAgIHBkcC0+c3dhcGdjID0gWENyZWF0ZUdDKGRweSwgZHJhd2FibGUsIDAsIE5VTEwpOworCisgICAgZ2N2YWx1ZXMuZnVuY3Rpb24gPSBHWGNvcHk7CisgICAgZ2N2YWx1ZXMuZ3JhcGhpY3NfZXhwb3N1cmVzID0gRmFsc2U7CisgICAgWENoYW5nZUdDKGRweSwgcGRwLT5nYywgR0NGdW5jdGlvbiwgJmdjdmFsdWVzKTsKKyAgICBYQ2hhbmdlR0MoZHB5LCBwZHAtPnN3YXBnYywgR0NGdW5jdGlvbiwgJmdjdmFsdWVzKTsKKyAgICBYQ2hhbmdlR0MoZHB5LCBwZHAtPnN3YXBnYywgR0NHcmFwaGljc0V4cG9zdXJlcywgJmdjdmFsdWVzKTsKKworICAgIC8qIGNyZWF0ZSBYSW1hZ2UgICovCisgICAgdmlzVGVtcC5zY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRweSk7CisgICAgdmlzVGVtcC52aXN1YWxpZCA9IHZpc3VhbGlkOworICAgIHZpc01hc2sgPSAoVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbElETWFzayk7CisgICAgcGRwLT52aXNpbmZvID0gWEdldFZpc3VhbEluZm8oZHB5LCB2aXNNYXNrLCAmdmlzVGVtcCwgJm51bV92aXN1YWxzKTsKKworICAgIHBkcC0+eGltYWdlID0gWENyZWF0ZUltYWdlKGRweSwKKwkJCSAgICAgICBwZHAtPnZpc2luZm8tPnZpc3VhbCwKKwkJCSAgICAgICBwZHAtPnZpc2luZm8tPmRlcHRoLAorCQkJICAgICAgIFpQaXhtYXAsIDAsICAgLyogZm9ybWF0LCBvZmZzZXQgKi8KKwkJCSAgICAgICBOVUxMLCAgICAgICAgIC8qIGRhdGEgKi8KKwkJCSAgICAgICAwLCAwLCAgICAgICAgIC8qIHNpemUgKi8KKwkJCSAgICAgICAzMiwgICAgICAgICAgIC8qIGJpdG1hcF9wYWQgKi8KKwkJCSAgICAgICAwKTsgICAgICAgICAgIC8qIGJ5dGVzX3Blcl9saW5lICovCisKKyAgICAvKiBnZXQgdGhlIHRydWUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICovCisgICAgcGRwLT5icHAgPSBwZHAtPnhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CisKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworc3RhdGljIHZvaWQgWERlc3Ryb3lEcmF3YWJsZShfX0dMWERSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwLAorCQkJICAgICBEaXNwbGF5ICpkcHksIFhJRCBkcmF3YWJsZSkKK3sKKyAgICBYRGVzdHJveUltYWdlKHBkcC0+eGltYWdlKTsKKyAgICBYRnJlZShwZHAtPnZpc2luZm8pOworCisgICAgWEZyZWVHQyhkcHksIHBkcC0+Z2MpOworICAgIFhGcmVlR0MoZHB5LCBwZHAtPnN3YXBnYyk7Cit9CisKK3N0YXRpYyB2b2lkCitzd3Jhc3RHZXREcmF3YWJsZUluZm8oX19EUklkcmF3YWJsZSAqZHJhdywKKwkJICAgICAgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoLAorCQkgICAgICB2b2lkICpsb2FkZXJQcml2YXRlKQoreworICAgIF9fR0xYRFJJZHJhd2FibGVQcml2YXRlICpwZHAgPSBsb2FkZXJQcml2YXRlOworICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gJihwZHAtPmJhc2UpOzsKKyAgICBEaXNwbGF5ICpkcHkgPSBwZHJhdy0+cHNjLT5kcHk7CisgICAgRHJhd2FibGUgZHJhd2FibGU7CisKKyAgICBXaW5kb3cgcm9vdDsKKyAgICBTdGF0dXMgc3RhdDsKKyAgICB1bnNpZ25lZCBpbnQgYncsIGRlcHRoOworCisgICAgZHJhd2FibGUgPSBwZHJhdy0+eERyYXdhYmxlOworCisgICAgc3RhdCA9IFhHZXRHZW9tZXRyeShkcHksIGRyYXdhYmxlLCAmcm9vdCwKKwkJCXgsIHksICh1bnNpZ25lZCBpbnQgKil3LCAodW5zaWduZWQgaW50ICopaCwKKwkJCSZidywgJmRlcHRoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2J5dGVzX3Blcl9saW5lKGludCB3LCBpbnQgYnBwLCB1bnNpZ25lZCBtdWwpCit7CisgICAgdW5zaWduZWQgbWFzayA9IG11bCAtIDE7CisKKyAgICByZXR1cm4gKCh3ICogYnBwICsgbWFzaykgJiB+bWFzaykgLyA4OworfQorCitzdGF0aWMgdm9pZAorc3dyYXN0UHV0SW1hZ2UoX19EUklkcmF3YWJsZSAqZHJhdywgaW50IG9wLAorCSAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgY2hhciAqZGF0YSwKKwkgICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwID0gbG9hZGVyUHJpdmF0ZTsKKyAgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9ICYocGRwLT5iYXNlKTs7CisgICAgRGlzcGxheSAqZHB5ID0gcGRyYXctPnBzYy0+ZHB5OworICAgIERyYXdhYmxlIGRyYXdhYmxlOworICAgIFhJbWFnZSAqeGltYWdlOworICAgIEdDIGdjOworCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgX19EUklfU1dSQVNUX0lNQUdFX09QX0RSQVc6CisJZ2MgPSBwZHAtPmdjOworCWJyZWFrOworICAgIGNhc2UgX19EUklfU1dSQVNUX0lNQUdFX09QX1NXQVA6CisJZ2MgPSBwZHAtPnN3YXBnYzsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJldHVybjsKKyAgICB9CisKKyAgICBkcmF3YWJsZSA9IHBkcmF3LT54RHJhd2FibGU7CisKKyAgICB4aW1hZ2UgPSBwZHAtPnhpbWFnZTsKKyAgICB4aW1hZ2UtPmRhdGEgPSBkYXRhOworICAgIHhpbWFnZS0+d2lkdGggPSB3OworICAgIHhpbWFnZS0+aGVpZ2h0ID0gaDsKKyAgICB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lID0gYnl0ZXNfcGVyX2xpbmUodywgcGRwLT5icHAsIDMyKTsKKworICAgIFhQdXRJbWFnZShkcHksIGRyYXdhYmxlLCBnYywgeGltYWdlLCAwLCAwLCB4LCB5LCB3LCBoKTsKKworICAgIHhpbWFnZS0+ZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzd3Jhc3RHZXRJbWFnZShfX0RSSWRyYXdhYmxlICpkcmF3LAorCSAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgY2hhciAqZGF0YSwKKwkgICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwID0gbG9hZGVyUHJpdmF0ZTsKKyAgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9ICYocGRwLT5iYXNlKTs7CisgICAgRGlzcGxheSAqZHB5ID0gcGRyYXctPnBzYy0+ZHB5OworICAgIERyYXdhYmxlIGRyYXdhYmxlOworICAgIFhJbWFnZSAqeGltYWdlOworCisgICAgZHJhd2FibGUgPSBwZHJhdy0+eERyYXdhYmxlOworCisgICAgeGltYWdlID0gcGRwLT54aW1hZ2U7CisgICAgeGltYWdlLT5kYXRhID0gZGF0YTsKKyAgICB4aW1hZ2UtPndpZHRoID0gdzsKKyAgICB4aW1hZ2UtPmhlaWdodCA9IGg7CisgICAgeGltYWdlLT5ieXRlc19wZXJfbGluZSA9IGJ5dGVzX3Blcl9saW5lKHcsIHBkcC0+YnBwLCAzMik7CisKKyAgICBYR2V0U3ViSW1hZ2UoZHB5LCBkcmF3YWJsZSwgeCwgeSwgdywgaCwgfjBMLCBaUGl4bWFwLCB4aW1hZ2UsIDAsIDApOworCisgICAgeGltYWdlLT5kYXRhID0gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uIHN3cmFzdExvYWRlckV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX1NXUkFTVF9MT0FERVIsIF9fRFJJX1NXUkFTVF9MT0FERVJfVkVSU0lPTiB9LAorICAgIHN3cmFzdEdldERyYXdhYmxlSW5mbywKKyAgICBzd3Jhc3RQdXRJbWFnZSwKKyAgICBzd3Jhc3RHZXRJbWFnZQorfTsKKworc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpsb2FkZXJfZXh0ZW5zaW9uc1tdID0geworICAgICZzeXN0ZW1UaW1lRXh0ZW5zaW9uLmJhc2UsCisgICAgJnN3cmFzdExvYWRlckV4dGVuc2lvbi5iYXNlLAorICAgIE5VTEwKK307CisKKy8qKgorICogR0xYRFJJIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGRyaURlc3Ryb3lDb250ZXh0KF9fR0xYRFJJY29udGV4dCAqY29udGV4dCwKKwkJCSAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLCBEaXNwbGF5ICpkcHkpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwID0gKF9fR0xYRFJJY29udGV4dFByaXZhdGUgKikgY29udGV4dDsKKyAgICBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUgPSBwY3AtPnBzYy0+Y29yZTsKKworICAgICgqY29yZS0+ZGVzdHJveUNvbnRleHQpKHBjcC0+ZHJpQ29udGV4dCk7CisKKyAgICBYZnJlZShwY3ApOworfQorCitzdGF0aWMgQm9vbCBkcmlCaW5kQ29udGV4dChfX0dMWERSSWNvbnRleHQgKmNvbnRleHQsCisJCQkgICBfX0dMWERSSWRyYXdhYmxlICpkcmF3LCBfX0dMWERSSWRyYXdhYmxlICpyZWFkKQoreworICAgIF9fR0xYRFJJY29udGV4dFByaXZhdGUgKnBjcCA9IChfX0dMWERSSWNvbnRleHRQcml2YXRlICopIGNvbnRleHQ7CisgICAgY29uc3QgX19EUkljb3JlRXh0ZW5zaW9uICpjb3JlID0gcGNwLT5wc2MtPmNvcmU7CisKKyAgICByZXR1cm4gKCpjb3JlLT5iaW5kQ29udGV4dCkocGNwLT5kcmlDb250ZXh0LAorCQkJCWRyYXctPmRyaURyYXdhYmxlLAorCQkJCXJlYWQtPmRyaURyYXdhYmxlKTsKK30KKworc3RhdGljIHZvaWQgZHJpVW5iaW5kQ29udGV4dChfX0dMWERSSWNvbnRleHQgKmNvbnRleHQpCit7CisgICAgX19HTFhEUkljb250ZXh0UHJpdmF0ZSAqcGNwID0gKF9fR0xYRFJJY29udGV4dFByaXZhdGUgKikgY29udGV4dDsKKyAgICBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gKmNvcmUgPSBwY3AtPnBzYy0+Y29yZTsKKworICAgICgqY29yZS0+dW5iaW5kQ29udGV4dCkocGNwLT5kcmlDb250ZXh0KTsKK30KKworc3RhdGljIF9fR0xYRFJJY29udGV4dCAqZHJpQ3JlYXRlQ29udGV4dChfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywKKwkJCQkJIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKm1vZGUsCisJCQkJCSBHTFhDb250ZXh0IGdjLAorCQkJCQkgR0xYQ29udGV4dCBzaGFyZUxpc3QsIGludCByZW5kZXJUeXBlKQoreworICAgIF9fR0xYRFJJY29udGV4dFByaXZhdGUgKnBjcCwgKnBjcF9zaGFyZWQ7CisgICAgX19HTFhEUkljb25maWdQcml2YXRlICpjb25maWcgPSAoX19HTFhEUkljb25maWdQcml2YXRlICopIG1vZGU7CisgICAgY29uc3QgX19EUkljb3JlRXh0ZW5zaW9uICpjb3JlID0gcHNjLT5jb3JlOworICAgIF9fRFJJY29udGV4dCAqc2hhcmVkID0gTlVMTDsKKworICAgIGlmICghcHNjIHx8ICFwc2MtPmRyaVNjcmVlbikKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChzaGFyZUxpc3QpIHsKKwlwY3Bfc2hhcmVkID0gKF9fR0xYRFJJY29udGV4dFByaXZhdGUgKikgc2hhcmVMaXN0LT5kcmlDb250ZXh0OworCXNoYXJlZCA9IHBjcF9zaGFyZWQtPmRyaUNvbnRleHQ7CisgICAgfQorCisgICAgcGNwID0gWG1hbGxvYyhzaXplb2YgKnBjcCk7CisgICAgaWYgKHBjcCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgcGNwLT5wc2MgPSBwc2M7CisgICAgcGNwLT5kcmlDb250ZXh0ID0KKwkoKmNvcmUtPmNyZWF0ZU5ld0NvbnRleHQpKHBzYy0+X19kcmlTY3JlZW4sCisJCQkJICBjb25maWctPmRyaUNvbmZpZywgc2hhcmVkLCBwY3ApOworICAgIGlmIChwY3AtPmRyaUNvbnRleHQgPT0gTlVMTCkgeworCVhmcmVlKHBjcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGNwLT5iYXNlLmRlc3Ryb3lDb250ZXh0ID0gZHJpRGVzdHJveUNvbnRleHQ7CisgICAgcGNwLT5iYXNlLmJpbmRDb250ZXh0ID0gZHJpQmluZENvbnRleHQ7CisgICAgcGNwLT5iYXNlLnVuYmluZENvbnRleHQgPSBkcmlVbmJpbmRDb250ZXh0OworCisgICAgcmV0dXJuICZwY3AtPmJhc2U7Cit9CisKK3N0YXRpYyB2b2lkIGRyaURlc3Ryb3lEcmF3YWJsZShfX0dMWERSSWRyYXdhYmxlICpwZHJhdykKK3sKKyAgICBfX0dMWERSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwID0gKF9fR0xYRFJJZHJhd2FibGVQcml2YXRlICopIHBkcmF3OworICAgIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZSA9IHBkcmF3LT5wc2MtPmNvcmU7CisKKyAgICAoKmNvcmUtPmRlc3Ryb3lEcmF3YWJsZSkocGRyYXctPmRyaURyYXdhYmxlKTsKKworICAgIFhEZXN0cm95RHJhd2FibGUocGRwLCBwZHJhdy0+cHNjLT5kcHksIHBkcmF3LT5kcmF3YWJsZSk7CisgICAgWGZyZWUocGRwKTsKK30KKworc3RhdGljIF9fR0xYRFJJZHJhd2FibGUgKmRyaUNyZWF0ZURyYXdhYmxlKF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLAorCQkJCQkgICBYSUQgeERyYXdhYmxlLAorCQkJCQkgICBHTFhEcmF3YWJsZSBkcmF3YWJsZSwKKwkJCQkJICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMpCit7CisgICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXc7CisgICAgX19HTFhEUklkcmF3YWJsZVByaXZhdGUgKnBkcDsKKyAgICBfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKmNvbmZpZyA9IChfX0dMWERSSWNvbmZpZ1ByaXZhdGUgKikgbW9kZXM7CisgICAgY29uc3QgX19EUklzd3Jhc3RFeHRlbnNpb24gKnN3cmFzdCA9IHBzYy0+c3dyYXN0OworCisgICAgLyogT2xkIGRyaSBjYW4ndCBoYW5kbGUgR0xYIDEuMysgZHJhd2FibGUgY29uc3RydWN0b3JzLiAqLworICAgIGlmICh4RHJhd2FibGUgIT0gZHJhd2FibGUpCisJcmV0dXJuIE5VTEw7CisKKyAgICBwZHAgPSBYbWFsbG9jKHNpemVvZigqcGRwKSk7CisgICAgaWYgKCFwZHApCisJcmV0dXJuIE5VTEw7CisKKyAgICBwZHJhdyA9ICYocGRwLT5iYXNlKTsKKyAgICBwZHJhdy0+eERyYXdhYmxlID0geERyYXdhYmxlOworICAgIHBkcmF3LT5kcmF3YWJsZSA9IGRyYXdhYmxlOworICAgIHBkcmF3LT5wc2MgPSBwc2M7CisKKyAgICBYQ3JlYXRlRHJhd2FibGUocGRwLCBwc2MtPmRweSwgeERyYXdhYmxlLCBtb2Rlcy0+dmlzdWFsSUQpOworCisgICAgLyogQ3JlYXRlIGEgbmV3IGRyYXdhYmxlICovCisgICAgcGRyYXctPmRyaURyYXdhYmxlID0KKwkoKnN3cmFzdC0+Y3JlYXRlTmV3RHJhd2FibGUpKHBzYy0+X19kcmlTY3JlZW4sCisJCQkJICAgICBjb25maWctPmRyaUNvbmZpZywKKwkJCQkgICAgIHBkcCk7CisKKyAgICBpZiAoIXBkcmF3LT5kcmlEcmF3YWJsZSkgeworCVhEZXN0cm95RHJhd2FibGUocGRwLCBwc2MtPmRweSwgeERyYXdhYmxlKTsKKwlYZnJlZShwZHApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHBkcmF3LT5kZXN0cm95RHJhd2FibGUgPSBkcmlEZXN0cm95RHJhd2FibGU7CisKKyAgICByZXR1cm4gcGRyYXc7Cit9CisKK3N0YXRpYyB2b2lkIGRyaURlc3Ryb3lTY3JlZW4oX19HTFhzY3JlZW5Db25maWdzICpwc2MpCit7CisgICAgLyogRnJlZSB0aGUgZGlyZWN0IHJlbmRlcmluZyBwZXIgc2NyZWVuIGRhdGEgKi8KKyAgICAoKnBzYy0+Y29yZS0+ZGVzdHJveVNjcmVlbikocHNjLT5fX2RyaVNjcmVlbik7CisgICAgcHNjLT5fX2RyaVNjcmVlbiA9IE5VTEw7CisgICAgaWYgKHBzYy0+ZHJpdmVyKQorCWRsY2xvc2UocHNjLT5kcml2ZXIpOworfQorCitzdGF0aWMgX19HTFhEUklzY3JlZW4gKmRyaUNyZWF0ZVNjcmVlbihfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywgaW50IHNjcmVlbiwKKwkJCQkgICAgICAgX19HTFhkaXNwbGF5UHJpdmF0ZSAqcHJpdikKK3sKKyAgICBfX0dMWERSSXNjcmVlbiAqcHNwOworICAgIGNvbnN0IF9fRFJJY29uZmlnICoqZHJpdmVyX2NvbmZpZ3M7CisgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zOworICAgIGNvbnN0IGNoYXIgKmRyaXZlck5hbWUgPSAic3dyYXN0IjsKKyAgICBpbnQgaTsKKworICAgIHBzcCA9IFhtYWxsb2Moc2l6ZW9mICpwc3ApOworICAgIGlmIChwc3AgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIEluaXRpYWxpemUgcGVyIHNjcmVlbiBkeW5hbWljIGNsaWVudCBHTFggZXh0ZW5zaW9ucyAqLworICAgIHBzYy0+ZXh0X2xpc3RfZmlyc3RfdGltZSA9IEdMX1RSVUU7CisKKyAgICBwc2MtPmRyaXZlciA9IGRyaU9wZW5Ecml2ZXIoZHJpdmVyTmFtZSk7CisgICAgaWYgKHBzYy0+ZHJpdmVyID09IE5VTEwpCisJZ290byBoYW5kbGVfZXJyb3I7CisKKyAgICBleHRlbnNpb25zID0gZGxzeW0ocHNjLT5kcml2ZXIsIF9fRFJJX0RSSVZFUl9FWFRFTlNJT05TKTsKKyAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7CisJRXJyb3JNZXNzYWdlRigiZHJpdmVyIGV4cG9ydHMgbm8gZXh0ZW5zaW9ucyAoJXMpXG4iLCBkbGVycm9yKCkpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGV4dGVuc2lvbnNbaV07IGkrKykgeworCWlmIChzdHJjbXAoZXh0ZW5zaW9uc1tpXS0+bmFtZSwgX19EUklfQ09SRSkgPT0gMCkKKwkgICAgcHNjLT5jb3JlID0gKF9fRFJJY29yZUV4dGVuc2lvbiAqKSBleHRlbnNpb25zW2ldOworCWlmIChzdHJjbXAoZXh0ZW5zaW9uc1tpXS0+bmFtZSwgX19EUklfU1dSQVNUKSA9PSAwKQorCSAgICBwc2MtPnN3cmFzdCA9IChfX0RSSXN3cmFzdEV4dGVuc2lvbiAqKSBleHRlbnNpb25zW2ldOworICAgIH0KKworICAgIGlmIChwc2MtPmNvcmUgPT0gTlVMTCB8fCBwc2MtPnN3cmFzdCA9PSBOVUxMKSB7CisJRXJyb3JNZXNzYWdlRigiY29yZSBkcmkgZXh0ZW5zaW9uIG5vdCBmb3VuZFxuIik7CisJZ290byBoYW5kbGVfZXJyb3I7CisgICAgfQorCisgICAgcHNjLT5fX2RyaVNjcmVlbiA9CisJcHNjLT5zd3Jhc3QtPmNyZWF0ZU5ld1NjcmVlbihzY3JlZW4sCisJCQkJICAgICBsb2FkZXJfZXh0ZW5zaW9ucywgJmRyaXZlcl9jb25maWdzLCBwc2MpOworICAgIGlmIChwc2MtPl9fZHJpU2NyZWVuID09IE5VTEwpIHsKKwlFcnJvck1lc3NhZ2VGKCJmYWlsZWQgdG8gY3JlYXRlIGRyaSBzY3JlZW5cbiIpOworCWdvdG8gaGFuZGxlX2Vycm9yOworICAgIH0KKworICAgIGRyaUJpbmRFeHRlbnNpb25zKHBzYywgMCk7CisKKyAgICBwc2MtPmNvbmZpZ3MgPSBkcmlDb252ZXJ0Q29uZmlncyhwc2MtPmNvcmUsIHBzYy0+Y29uZmlncywgZHJpdmVyX2NvbmZpZ3MpOworICAgIHBzYy0+dmlzdWFscyA9IGRyaUNvbnZlcnRDb25maWdzKHBzYy0+Y29yZSwgcHNjLT52aXN1YWxzLCBkcml2ZXJfY29uZmlncyk7CisKKyAgICBwc3AtPmRlc3Ryb3lTY3JlZW4gPSBkcmlEZXN0cm95U2NyZWVuOworICAgIHBzcC0+Y3JlYXRlQ29udGV4dCA9IGRyaUNyZWF0ZUNvbnRleHQ7CisgICAgcHNwLT5jcmVhdGVEcmF3YWJsZSA9IGRyaUNyZWF0ZURyYXdhYmxlOworCisgICAgcmV0dXJuIHBzcDsKKworIGhhbmRsZV9lcnJvcjoKKyAgICBYZnJlZShwc3ApOworCisgICAgaWYgKHBzYy0+ZHJpdmVyKQorCWRsY2xvc2UocHNjLT5kcml2ZXIpOworCisgICAgRXJyb3JNZXNzYWdlRigicmV2ZXJ0aW5nIHRvIGluZGlyZWN0IHJlbmRlcmluZ1xuIik7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIGZyb20gX19nbFhGcmVlRGlzcGxheVByaXZhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGRyaURlc3Ryb3lEaXNwbGF5KF9fR0xYRFJJZGlzcGxheSAqZHB5KQoreworICAgIFhmcmVlKGRweSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSwgaW5pdGlhbGl6ZSBhbmQgcmV0dXJuIGEgX19EUklkaXNwbGF5UHJpdmF0ZSBvYmplY3QuCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIF9fZ2xYSW5pdGlhbGl6ZSgpIHdoZW4gd2UgYXJlIGdpdmVuIGEgbmV3CisgKiBkaXNwbGF5IHBvaW50ZXIuCisgKi8KK19YX0hJRERFTiBfX0dMWERSSWRpc3BsYXkgKmRyaXN3Q3JlYXRlRGlzcGxheShEaXNwbGF5ICpkcHkpCit7CisgICAgX19HTFhEUklkaXNwbGF5UHJpdmF0ZSAqcGRweXA7CisKKyAgICBwZHB5cCA9IFhtYWxsb2Moc2l6ZW9mICpwZHB5cCk7CisgICAgaWYgKHBkcHlwID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBwZHB5cC0+YmFzZS5kZXN0cm95RGlzcGxheSA9IGRyaURlc3Ryb3lEaXNwbGF5OworICAgIHBkcHlwLT5iYXNlLmNyZWF0ZVNjcmVlbiA9IGRyaUNyZWF0ZVNjcmVlbjsKKworICAgIHJldHVybiAmcGRweXAtPmJhc2U7Cit9CisKKyNlbmRpZiAvKiBHTFhfRElSRUNUX1JFTkRFUklORyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2xjb250ZXh0bW9kZXMuYyBiL3NyYy9nbHgveDExL2dsY29udGV4dG1vZGVzLmMKaW5kZXggNzg4ZWNmNi4uMzI2YzhiMiAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvZ2xjb250ZXh0bW9kZXMuYworKysgYi9zcmMvZ2x4L3gxMS9nbGNvbnRleHRtb2Rlcy5jCkBAIC0zMzYsNyArMzM2LDggQEAKIAkqdmFsdWVfcmV0dXJuID0gbW9kZS0+YmluZFRvVGV4dHVyZVJnYmE7CiAJcmV0dXJuIDA7CiAgICAgICBjYXNlIEdMWF9CSU5EX1RPX01JUE1BUF9URVhUVVJFX0VYVDoKLQkqdmFsdWVfcmV0dXJuID0gbW9kZS0+YmluZFRvTWlwbWFwVGV4dHVyZTsKKwkqdmFsdWVfcmV0dXJuID0gbW9kZS0+YmluZFRvTWlwbWFwVGV4dHVyZSA9PSBHTF9UUlVFID8gR0xfVFJVRSA6CisJICAgIEdMX0ZBTFNFOwogCXJldHVybiAwOwogICAgICAgY2FzZSBHTFhfQklORF9UT19URVhUVVJFX1RBUkdFVFNfRVhUOgogCSp2YWx1ZV9yZXR1cm4gPSBtb2RlLT5iaW5kVG9UZXh0dXJlVGFyZ2V0czsKQEAgLTQxNyw3ICs0MTgsNyBAQAogICAgICAgKCpuZXh0KS0+YmluZFRvVGV4dHVyZVJnYiA9IEdMWF9ET05UX0NBUkU7CiAgICAgICAoKm5leHQpLT5iaW5kVG9UZXh0dXJlUmdiYSA9IEdMWF9ET05UX0NBUkU7CiAgICAgICAoKm5leHQpLT5iaW5kVG9NaXBtYXBUZXh0dXJlID0gR0xYX0RPTlRfQ0FSRTsKLSAgICAgICgqbmV4dCktPmJpbmRUb1RleHR1cmVUYXJnZXRzID0gMDsKKyAgICAgICgqbmV4dCktPmJpbmRUb1RleHR1cmVUYXJnZXRzID0gR0xYX0RPTlRfQ0FSRTsKICAgICAgICgqbmV4dCktPnlJbnZlcnRlZCA9IEdMWF9ET05UX0NBUkU7CiAKICAgICAgIG5leHQgPSAmICgoKm5leHQpLT5uZXh0KTsKQEAgLTQ1NiwxOSArNDU3LDI4IEBACiAgKi8KIAogX19HTGNvbnRleHRNb2RlcyAqCi1fZ2xfY29udGV4dF9tb2Rlc19maW5kX3Zpc3VhbCggX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLCBpbnQgdmlkICkKK19nbF9jb250ZXh0X21vZGVzX2ZpbmRfdmlzdWFsKF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLCBpbnQgdmlkKQogewotICAgIHdoaWxlICggbW9kZXMgIT0gTlVMTCApIHsKLQlpZiAoIG1vZGVzLT52aXN1YWxJRCA9PSB2aWQgKSB7Ci0JICAgIGJyZWFrOwotCX0KKyAgICBfX0dMY29udGV4dE1vZGVzICptOwogCi0JbW9kZXMgPSBtb2Rlcy0+bmV4dDsKLSAgICB9CisgICAgZm9yIChtID0gbW9kZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCisJaWYgKG0tPnZpc3VhbElEID09IHZpZCkKKwkgICAgcmV0dXJuIG07CiAKLSAgICByZXR1cm4gbW9kZXM7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKK19fR0xjb250ZXh0TW9kZXMgKgorX2dsX2NvbnRleHRfbW9kZXNfZmluZF9mYmNvbmZpZyhfX0dMY29udGV4dE1vZGVzICptb2RlcywgaW50IGZiaWQpCit7CisgICAgX19HTGNvbnRleHRNb2RlcyAqbTsKKworICAgIGZvciAobSA9IG1vZGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorCWlmIChtLT5mYmNvbmZpZ0lEID09IGZiaWQpCisJICAgIHJldHVybiBtOworCisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIC8qKgogICogRGV0ZXJtaW5lIGlmIHR3byBjb250ZXh0LW1vZGVzIGFyZSB0aGUgc2FtZS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2xjb250ZXh0bW9kZXMuaCBiL3NyYy9nbHgveDExL2dsY29udGV4dG1vZGVzLmgKaW5kZXggNGI1YzZmNi4uYWZkMDljZCAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvZ2xjb250ZXh0bW9kZXMuaAorKysgYi9zcmMvZ2x4L3gxMS9nbGNvbnRleHRtb2Rlcy5oCkBAIC00NCw4ICs0NCwxMCBAQAogZXh0ZXJuIF9fR0xjb250ZXh0TW9kZXMgKiBfZ2xfY29udGV4dF9tb2Rlc19jcmVhdGUoIHVuc2lnbmVkIGNvdW50LAogICAgIHNpemVfdCBtaW5pbXVtX3NpemUgKTsKIGV4dGVybiB2b2lkIF9nbF9jb250ZXh0X21vZGVzX2Rlc3Ryb3koIF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlcyApOwotZXh0ZXJuICBfX0dMY29udGV4dE1vZGVzICogX2dsX2NvbnRleHRfbW9kZXNfZmluZF92aXN1YWwoCi0gICAgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLCBpbnQgdmlkICk7CitleHRlcm4gIF9fR0xjb250ZXh0TW9kZXMgKgorICAgIF9nbF9jb250ZXh0X21vZGVzX2ZpbmRfdmlzdWFsKF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLCBpbnQgdmlkKTsKK2V4dGVybiBfX0dMY29udGV4dE1vZGVzICoKKyAgICBfZ2xfY29udGV4dF9tb2Rlc19maW5kX2ZiY29uZmlnKF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLCBpbnQgZmJpZCk7CiBleHRlcm4gR0xib29sZWFuIF9nbF9jb250ZXh0X21vZGVzX2FyZV9zYW1lKCBjb25zdCBfX0dMY29udGV4dE1vZGVzICogYSwKICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICogYiApOwogCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9nbHhfcGJ1ZmZlci5jIGIvc3JjL2dseC94MTEvZ2x4X3BidWZmZXIuYwppbmRleCAxZGYyZDBmLi4wZjg3OGYyIDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9nbHhfcGJ1ZmZlci5jCisrKyBiL3NyYy9nbHgveDExL2dseF9wYnVmZmVyLmMKQEAgLTE2NCw2ICsxNjQsMzMgQEAKIH0KIAogCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKK2V4dGVybiBfX0dMWERSSWRyYXdhYmxlICoKK0dldEdMWERSSURyYXdhYmxlKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCAqIGNvbnN0IHNjcm5fbnVtKTsKKworc3RhdGljIEdMZW51bQorZGV0ZXJtaW5lVGV4dHVyZVRhcmdldChjb25zdCBpbnQgKmF0dHJpYnMsIGludCBudW1BdHRyaWJzKQoreworICAgIEdMZW51bSB0YXJnZXQgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bUF0dHJpYnM7IGkrKykgeworCWlmIChhdHRyaWJzWzIgKiBpXSA9PSBHTFhfVEVYVFVSRV9UQVJHRVRfRVhUKSB7CisJICAgIHN3aXRjaCAoYXR0cmlic1syICogaSArIDFdKSB7CisJICAgIGNhc2UgR0xYX1RFWFRVUkVfMkRfRVhUOgorCQl0YXJnZXQgPSBHTF9URVhUVVJFXzJEOworCQlicmVhazsKKwkgICAgY2FzZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfRVhUOgorCQl0YXJnZXQgPSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkI7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAKKyAgICByZXR1cm4gdGFyZ2V0OworfQorI2VuZGlmCisKIC8qKgogICogR2V0IGEgZHJhd2FibGUncyBhdHRyaWJ1dGUuCiAgKgpAQCAtMjYxLDYgKzI4OCwxNiBAQAogCSAgICAgICB9CiAJICAgfQogCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKwkgICB7CisJCV9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0R0xYRFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgTlVMTCk7CisKKwkJaWYgKHBkcmF3ICE9IE5VTEwgJiYgIXBkcmF3LT50ZXh0dXJlVGFyZ2V0KQorCQkgICAgcGRyYXctPnRleHR1cmVUYXJnZXQgPSBkZXRlcm1pbmVUZXh0dXJlVGFyZ2V0KChjb25zdCBpbnQgKilkYXRhLAorCQkJCQkJCQkgIG51bV9hdHRyaWJ1dGVzKTsKKwkgICB9CisjZW5kaWYKKwogCSAgIFhmcmVlKCBkYXRhICk7CiAgICAgICAgfQogICAgfQpAQCAtMjcxLDcgKzMwOCw2IEBACiAgICByZXR1cm4gMDsKIH0KIAotCiAvKioKICAqIENyZWF0ZSBhIG5vbi1wYnVmZmVyIEdMWCBkcmF3YWJsZS4KICAqCkBAIC0zMDYsNyArMzQyLDcgQEAKICAgIHJlcS0+Z2x4Q29kZSA9IGdseENvZGU7CiAgICByZXEtPnNjcmVlbiA9IChDQVJEMzIpIGZiY29uZmlnLT5zY3JlZW47CiAgICByZXEtPmZiY29uZmlnID0gZmJjb25maWctPmZiY29uZmlnSUQ7Ci0gICByZXEtPndpbmRvdyA9IChHTFhQYnVmZmVyKSBkcmF3YWJsZTsKKyAgIHJlcS0+d2luZG93ID0gKENBUkQzMikgZHJhd2FibGU7CiAgICByZXEtPmdseHdpbmRvdyA9IChHTFhXaW5kb3cpIFhBbGxvY0lEKGRweSk7CiAgICByZXEtPm51bUF0dHJpYnMgPSAoQ0FSRDMyKSBpOwogCkBAIC0zMTUsNiArMzUxLDM0IEBACiAgICBVbmxvY2tEaXNwbGF5KGRweSk7CiAgICBTeW5jSGFuZGxlKCk7CiAgICAKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgZG8geworICAgICAgIC8qIEZJWE1FOiBNYXliZSBkZWxheSBfX0RSSWRyYXdhYmxlIGNyZWF0aW9uIHVudGlsIHRoZSBkcmF3YWJsZQorCSogaXMgYWN0dWFsbHkgYm91bmQgdG8gYSBjb250ZXh0Li4uICovCisKKyAgICAgICBfX0dMWGRpc3BsYXlQcml2YXRlICogY29uc3QgcHJpdiA9IF9fZ2xYSW5pdGlhbGl6ZShkcHkpOworICAgICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3OworICAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOworCisgICAgICAgcHNjID0gJnByaXYtPnNjcmVlbkNvbmZpZ3NbZmJjb25maWctPnNjcmVlbl07CisgICAgICAgaWYgKHBzYy0+ZHJpU2NyZWVuID09IE5VTEwpCisJICAgYnJlYWs7CisgICAgICAgcGRyYXcgPSBwc2MtPmRyaVNjcmVlbi0+Y3JlYXRlRHJhd2FibGUocHNjLCBkcmF3YWJsZSwKKwkJCQkJICAgICAgcmVxLT5nbHh3aW5kb3csIGZiY29uZmlnKTsKKyAgICAgICBpZiAocGRyYXcgPT0gTlVMTCkgeworCSAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNyZWF0ZSBkcmF3YWJsZVxuIik7CisJICAgYnJlYWs7CisgICAgICAgfQorCSAgIAorICAgICAgIGlmIChfX2dseEhhc2hJbnNlcnQocHNjLT5kcmF3SGFzaCwgcmVxLT5nbHh3aW5kb3csIHBkcmF3KSkgeworCSAgICgqcGRyYXctPmRlc3Ryb3lEcmF3YWJsZSkocGRyYXcpOworCSAgIHJldHVybiBOb25lOyAvKiBGSVhNRTogQ2hlY2sgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyBoZXJlLi4uICovCisgICAgICAgfQorCisgICAgICAgcGRyYXctPnRleHR1cmVUYXJnZXQgPSBkZXRlcm1pbmVUZXh0dXJlVGFyZ2V0KGF0dHJpYl9saXN0LCBpKTsKKyAgIH0gd2hpbGUgKDApOworI2VuZGlmCisKICAgIHJldHVybiAoR0xYRHJhd2FibGUpcmVxLT5nbHh3aW5kb3c7CiB9CiAKQEAgLTM1MCw2ICs0MTQsMjAgQEAKICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKICAgIFN5bmNIYW5kbGUoKTsKIAorI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICB7CisgICAgICAgaW50IHNjcmVlbjsKKyAgICAgICBfX0dMWGRpc3BsYXlQcml2YXRlICogY29uc3QgcHJpdiA9IF9fZ2xYSW5pdGlhbGl6ZShkcHkpOworICAgICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0R0xYRFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgJnNjcmVlbik7CisgICAgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2MgPSAmcHJpdi0+c2NyZWVuQ29uZmlnc1tzY3JlZW5dOworCisgICAgICAgaWYgKHBkcmF3ICE9IE5VTEwpIHsKKwkgICAoKnBkcmF3LT5kZXN0cm95RHJhd2FibGUpKHBkcmF3KTsKKwkgICBfX2dseEhhc2hEZWxldGUocHNjLT5kcmF3SGFzaCwgZHJhd2FibGUpOworICAgICAgIH0KKyAgIH0KKyNlbmRpZgorCiAgICByZXR1cm47CiB9CiAKQEAgLTQ2MCw4ICs1MzgsMjQgQEAKIFBVQkxJQyBHTFhQYnVmZmVyCiBnbFhDcmVhdGVQYnVmZmVyKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KQogeworICAgaW50IGksIHdpZHRoLCBoZWlnaHQ7CisKKyAgIHdpZHRoID0gMDsKKyAgIGhlaWdodCA9IDA7CisKKyAgIGZvciAoaSA9IDA7IGF0dHJpYl9saXN0W2kgKiAyXTsgaSsrKSB7CisgICAgICBzd2l0Y2ggKGF0dHJpYl9saXN0W2kgKiAyXSkgeworICAgICAgY2FzZSBHTFhfUEJVRkZFUl9XSURUSDoKKwkgd2lkdGggPSBhdHRyaWJfbGlzdFtpICogMiArIDFdOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xYX1BCVUZGRVJfSEVJR0hUOgorCSBoZWlnaHQgPSBhdHRyaWJfbGlzdFtpICogMiArIDFdOworCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKwogICAgcmV0dXJuIChHTFhQYnVmZmVyKSBDcmVhdGVQYnVmZmVyKCBkcHksIChfX0dMY29udGV4dE1vZGVzICopIGNvbmZpZywKLQkJCQkgICAgICAwLCAwLAorCQkJCSAgICAgIHdpZHRoLCBoZWlnaHQsCiAJCQkJICAgICAgYXR0cmliX2xpc3QsIEdMX1RSVUUgKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2x4Y2xpZW50LmggYi9zcmMvZ2x4L3gxMS9nbHhjbGllbnQuaAppbmRleCBmOWQwNzZmLi44YWExM2RhIDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9nbHhjbGllbnQuaAorKysgYi9zcmMvZ2x4L3gxMS9nbHhjbGllbnQuaApAQCAtNTgsMTkgKzU4LDIzIEBACiAjaW5jbHVkZSAiR0wvZ2x4cHJvdG8uaCIKICNpbmNsdWRlICJHTC9pbnRlcm5hbC9nbGNvcmUuaCIKICNpbmNsdWRlICJnbGFwaXRhYmxlLmgiCi0jaW5jbHVkZSAiZ2x4ZXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgImdseGhhc2guaCIKICNpZiBkZWZpbmVkKCBVU0VfWFRIUkVBRFMgKQogIyBpbmNsdWRlIDxYMTEvWHRocmVhZHMuaD4KICNlbGlmIGRlZmluZWQoIFBUSFJFQURTICkKICMgaW5jbHVkZSA8cHRocmVhZC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJnbHhleHRlbnNpb25zLmgiCisKICNkZWZpbmUgR0xYX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLwogI2RlZmluZSBHTFhfTUlOT1JfVkVSU0lPTgk0CiAKICNkZWZpbmUgX19HTFhfTUFYX1RFWFRVUkVfVU5JVFMgMzIKIAordHlwZWRlZiBzdHJ1Y3QgX19HTFhzY3JlZW5Db25maWdzUmVjIF9fR0xYc2NyZWVuQ29uZmlnczsKIHR5cGVkZWYgc3RydWN0IF9fR0xYY29udGV4dFJlYyBfX0dMWGNvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfX0dMWGRyYXdhYmxlUmVjIF9fR0xYZHJhd2FibGU7CiB0eXBlZGVmIHN0cnVjdCBfX0dMWGRpc3BsYXlQcml2YXRlUmVjIF9fR0xYZGlzcGxheVByaXZhdGU7CiB0eXBlZGVmIHN0cnVjdCBfZ2xhcGlfdGFibGUgX19HTGFwaTsKIApAQCAtNzgsNiArODIsOSBAQAogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKIAorI2RlZmluZSBjb250YWluZXJPZihwdHIsIHR5cGUsIG1lbWJlcikJCQlcCisgICAgKHR5cGUgKikoIChjaGFyICopcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICkKKwogI2luY2x1ZGUgPEdML2ludGVybmFsL2RyaV9pbnRlcmZhY2UuaD4KIAogCkBAIC04NSw0MyArOTIsNjUgQEAKICAqIERpc3BsYXkgZGVwZW5kZW50IG1ldGhvZHMuICBUaGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBkdXJpbmcgdGhlCiAgKiBcYyBkcmlDcmVhdGVEaXNwbGF5IGNhbGwuCiAgKi8KLXN0cnVjdCBfX0RSSWRpc3BsYXlSZWMgewordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUklkaXNwbGF5UmVjIF9fR0xYRFJJZGlzcGxheTsKK3R5cGVkZWYgc3RydWN0IF9fR0xYRFJJc2NyZWVuUmVjIF9fR0xYRFJJc2NyZWVuOwordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUklkcmF3YWJsZVJlYyBfX0dMWERSSWRyYXdhYmxlOwordHlwZWRlZiBzdHJ1Y3QgX19HTFhEUkljb250ZXh0UmVjIF9fR0xYRFJJY29udGV4dDsKKworI2luY2x1ZGUgImdseGV4dGVuc2lvbnMuaCIKKworc3RydWN0IF9fR0xYRFJJZGlzcGxheVJlYyB7CiAgICAgLyoqCiAgICAgICogTWV0aG9kIHRvIGRlc3Ryb3kgdGhlIHByaXZhdGUgRFJJIGRpc3BsYXkgZGF0YS4KICAgICAgKi8KLSAgICB2b2lkICgqZGVzdHJveURpc3BsYXkpKERpc3BsYXkgKmRweSwgdm9pZCAqZGlzcGxheVByaXZhdGUpOworICAgIHZvaWQgKCpkZXN0cm95RGlzcGxheSkoX19HTFhEUklkaXNwbGF5ICpkaXNwbGF5KTsKIAotICAgIC8qKgotICAgICAqIE9wYXF1ZSBwb2ludGVyIHRvIHByaXZhdGUgcGVyIGRpc3BsYXkgZGlyZWN0IHJlbmRlcmluZyBkYXRhLgotICAgICAqIFxjIE5VTEwgaWYgZGlyZWN0IHJlbmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGlzcGxheS4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgX19EUklkaXNwbGF5UHJpdmF0ZVJlYyAqcHJpdmF0ZTsKLQotICAgIC8qKgotICAgICAqIEFycmF5IG9mIHBvaW50ZXJzIHRvIG1ldGhvZHMgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwcml2YXRlIERSSQotICAgICAqIHNjcmVlbiBkYXRhLgotICAgICAqLwotICAgIFBGTkNSRUFURU5FV1NDUkVFTkZVTkMgKiBjcmVhdGVOZXdTY3JlZW47CisgICAgX19HTFhEUklzY3JlZW4gKigqY3JlYXRlU2NyZWVuKShfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywgaW50IHNjcmVlbiwKKwkJCQkgICAgX19HTFhkaXNwbGF5UHJpdmF0ZSAqcHJpdik7CiB9OwogCitzdHJ1Y3QgX19HTFhEUklzY3JlZW5SZWMgewogCi0vKgotKiogV2Uga2VlcCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMsIG9uZSBwZXIgRFJJIGRldmljZSBkcml2ZXIuCi0qLwotc3RydWN0IF9fRFJJZHJpdmVyUmVjIHsKLSAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICB2b2lkICpoYW5kbGU7Ci0gICBQRk5DUkVBVEVORVdTQ1JFRU5GVU5DIGNyZWF0ZU5ld1NjcmVlbkZ1bmM7Ci0gICBzdHJ1Y3QgX19EUklkcml2ZXJSZWMgKm5leHQ7CisgICAgdm9pZCAoKmRlc3Ryb3lTY3JlZW4pKF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjKTsKKworICAgIF9fR0xYRFJJY29udGV4dCAqKCpjcmVhdGVDb250ZXh0KShfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywKKwkJCQkgICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICptb2RlLAorCQkJCSAgICAgIEdMWENvbnRleHQgZ2MsCisJCQkJICAgICAgR0xYQ29udGV4dCBzaGFyZUxpc3QsIGludCByZW5kZXJUeXBlKTsKKwkKKyAgICBfX0dMWERSSWRyYXdhYmxlICooKmNyZWF0ZURyYXdhYmxlKShfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywKKwkJCQkJWElEIGRyYXdhYmxlLAorCQkJCQlHTFhEcmF3YWJsZSBnbHhEcmF3YWJsZSwKKwkJCQkJY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMpOworfTsKKworc3RydWN0IF9fR0xYRFJJY29udGV4dFJlYyB7CisgICAgdm9pZCAoKmRlc3Ryb3lDb250ZXh0KShfX0dMWERSSWNvbnRleHQgKmNvbnRleHQsIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLAorCQkJICAgRGlzcGxheSAqZHB5KTsKKyAgICBCb29sICgqYmluZENvbnRleHQpKF9fR0xYRFJJY29udGV4dCAqY29udGV4dCwKKwkJCV9fR0xYRFJJZHJhd2FibGUgKnBkcmF3LAorCQkJX19HTFhEUklkcmF3YWJsZSAqcHJlYWQpOworICAgIAorICAgIHZvaWQgKCp1bmJpbmRDb250ZXh0KShfX0dMWERSSWNvbnRleHQgKmNvbnRleHQpOworfTsKKworc3RydWN0IF9fR0xYRFJJZHJhd2FibGVSZWMgeworICAgIHZvaWQgKCpkZXN0cm95RHJhd2FibGUpKF9fR0xYRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKKworICAgIFhJRCB4RHJhd2FibGU7CisgICAgWElEIGRyYXdhYmxlOworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOworICAgIF9fRFJJZHJhd2FibGUgKmRyaURyYXdhYmxlOworICAgIEdMZW51bSB0ZXh0dXJlVGFyZ2V0OwogfTsKIAogLyoKICoqIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgRFJJIGRpc3BsYXkgZGF0YSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGlzcGxheQogKiogZGVwZW5kZW50IG1ldGhvZHMuCiAqLwotZXh0ZXJuIHZvaWQgKmRyaUNyZWF0ZURpc3BsYXkoRGlzcGxheSAqZHB5LCBfX0RSSWRpc3BsYXkgKnBkaXNwKTsKLQotZXh0ZXJuICBfX0RSSWRyaXZlciAqZHJpR2V0RHJpdmVyKERpc3BsYXkgKmRweSwgaW50IHNjck51bSk7CitleHRlcm4gX19HTFhEUklkaXNwbGF5ICpkcmlzd0NyZWF0ZURpc3BsYXkoRGlzcGxheSAqZHB5KTsKK2V4dGVybiBfX0dMWERSSWRpc3BsYXkgKmRyaUNyZWF0ZURpc3BsYXkoRGlzcGxheSAqZHB5KTsKK2V4dGVybiBfX0dMWERSSWRpc3BsYXkgKmRyaTJDcmVhdGVEaXNwbGF5KERpc3BsYXkgKmRweSk7CiAKIGV4dGVybiB2b2lkIERSSV9nbFhVc2VYRm9udCggRm9udCBmb250LCBpbnQgZmlyc3QsIGludCBjb3VudCwgaW50IGxpc3RiYXNlICk7CiAKQEAgLTEzMyw4ICsxNjIsNiBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqZ2xYR2V0RHJpdmVyQ29uZmlnIChjb25zdCBjaGFyICpkcml2ZXJOYW1lKTsKIAotZXh0ZXJuIEJvb2wgX19nbFhXaW5kb3dFeGlzdHMoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3KTsKLQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjYsMTggKzI1MywxMCBAQAogICAgIFhJRCBzaGFyZV94aWQ7CiAKICAgICAvKioKLSAgICAgKiBWaXN1YWwgaWQuCi0gICAgICogCi0gICAgICogXGRlcHJlY2F0ZWQKLSAgICAgKiBUaGlzIGZpbGVkIGhhcyBiZWVuIGxhcmdlbHkgYmVlbiByZXBsYWNlZCBieSB0aGUgXGMgbW9kZSBmaWVsZCwgYnV0Ci0gICAgICogdGhlIHdvcmsgaXMgbm90IHF1aXRlIGRvbmUuCi0gICAgICovCi0gICAgVmlzdWFsSUQgdmlkOwotCi0gICAgLyoqCiAgICAgICogU2NyZWVuIG51bWJlci4KICAgICAgKi8KICAgICBHTGludCBzY3JlZW47CisgICAgX19HTFhzY3JlZW5Db25maWdzICpwc2M7CiAKICAgICAvKioKICAgICAgKiBcYyBHTF9UUlVFIGlmIHRoZSBjb250ZXh0IHdhcyBjcmVhdGVkIHdpdGggSW1wb3J0Q29udGV4dCwgd2hpY2gKQEAgLTM0MywyNCArMzYyLDE1IEBACiAgICAgICovCiAgICAgR0xpbnQgbWFqb3JPcGNvZGU7CiAKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIHRoZSBtb2RlIHVzZWQgdG8gY3JlYXRlIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICogbW9kZTsKKwogI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICAgLyoqCi0gICAgICogUGVyIGNvbnRleHQgZGlyZWN0IHJlbmRlcmluZyBpbnRlcmZhY2UgZnVuY3Rpb25zIGFuZCBkYXRhLgotICAgICAqLwotICAgIF9fRFJJY29udGV4dCBkcmlDb250ZXh0OworICAgIF9fR0xYRFJJY29udGV4dCAqZHJpQ29udGV4dDsKKyAgICBfX0RSSWNvbnRleHQgKl9fZHJpQ29udGV4dDsKICNlbmRpZgotICAgIAotICAgIC8qKgotICAgICAqIFxjIEdMWEZCQ29uZmlnSUQgdXNlZCB0byBjcmVhdGUgdGhpcyBjb250ZXh0LiAgTWF5IGJlIFxjIE5vbmUuICBUaGlzCi0gICAgICogZmllbGQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIFxjIG1vZGUgZmllbGQuCi0gICAgICoKLSAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzAzMTcuCi0gICAgICoKLSAgICAgKiBcZGVwcmVjYXRlZAotICAgICAqIFRoaXMgZmlsZWQgaGFzIGJlZW4gbGFyZ2VseSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBcYyBtb2RlIGZpZWxkLCBidXQKLSAgICAgKiB0aGUgd29yayBpcyBub3QgcXVpdGUgZG9uZS4KLSAgICAgKi8KLSAgICBHTFhGQkNvbmZpZ0lEICBmYmNvbmZpZ0lEOwogCiAgICAgLyoqCiAgICAgICogVGhlIGN1cnJlbnQgcmVhZC1kcmF3YWJsZSBmb3IgdGhpcyBjb250ZXh0LiAgV2lsbCBiZSBOb25lIGlmIHRoaXMKQEAgLTQzOCw3ICs0NDgsNyBAQAogICogT25lIG9mIHRoZXNlIHJlY29yZHMgZXhpc3RzIHBlciBzY3JlZW4gb2YgdGhlIGRpc3BsYXkuICBJdCBjb250YWlucwogICogYSBwb2ludGVyIHRvIHRoZSBjb25maWcgZGF0YSBmb3IgdGhhdCBzY3JlZW4gKGlmIHRoZSBzY3JlZW4gc3VwcG9ydHMgR0wpLgogICovCi10eXBlZGVmIHN0cnVjdCBfX0dMWHNjcmVlbkNvbmZpZ3NSZWMgeworc3RydWN0IF9fR0xYc2NyZWVuQ29uZmlnc1JlYyB7CiAgICAgLyoqCiAgICAgICogR0xYIGV4dGVuc2lvbiBzdHJpbmcgcmVwb3J0ZWQgYnkgdGhlIFgtc2VydmVyLgogICAgICAqLwpAQCAtNDU0LDEzICs0NjQsNDcgQEAKICAgICAvKioKICAgICAgKiBQZXIgc2NyZWVuIGRpcmVjdCByZW5kZXJpbmcgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhbmQgZGF0YS4KICAgICAgKi8KLSAgICBfX0RSSXNjcmVlbiBkcmlTY3JlZW47CisgICAgX19EUklzY3JlZW4gKl9fZHJpU2NyZWVuOworICAgIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiAqY29yZTsKKyAgICBjb25zdCBfX0RSSWxlZ2FjeUV4dGVuc2lvbiAqbGVnYWN5OworICAgIGNvbnN0IF9fRFJJc3dyYXN0RXh0ZW5zaW9uICpzd3Jhc3Q7CisgICAgX19nbHhIYXNoVGFibGUgKmRyYXdIYXNoOworICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyLCBmZDsKKyAgICB2b2lkICpkcml2ZXI7CisKKyAgICBfX0dMWERSSXNjcmVlbiAqZHJpU2NyZWVuOworCisjaWZkZWYgX19EUklfQ09QWV9TVUJfQlVGRkVSCisgICAgY29uc3QgX19EUkljb3B5U3ViQnVmZmVyRXh0ZW5zaW9uICpjb3B5U3ViQnVmZmVyOworI2VuZGlmCisKKyNpZmRlZiBfX0RSSV9TV0FQX0NPTlRST0wKKyAgICBjb25zdCBfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uICpzd2FwQ29udHJvbDsKKyNlbmRpZgorCisjaWZkZWYgX19EUklfQUxMT0NBVEUKKyAgICBjb25zdCBfX0RSSWFsbG9jYXRlRXh0ZW5zaW9uICphbGxvY2F0ZTsKKyNlbmRpZgorCisjaWZkZWYgX19EUklfRlJBTUVfVFJBQ0tJTkcKKyAgICBjb25zdCBfX0RSSWZyYW1lVHJhY2tpbmdFeHRlbnNpb24gKmZyYW1lVHJhY2tpbmc7CisjZW5kaWYKKworI2lmZGVmIF9fRFJJX01FRElBX1NUUkVBTV9DT1VOVEVSCisgICAgY29uc3QgX19EUkltZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb24gKm1zYzsKKyNlbmRpZgorCisjaWZkZWYgX19EUklfVEVYX0JVRkZFUgorICAgIGNvbnN0IF9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uICp0ZXhCdWZmZXI7CisjZW5kaWYKKwogI2VuZGlmCiAKICAgICAvKioKLSAgICAgKiBMaW5rZWQgbGlzdCBvZiBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBzY3JlZW4uCisgICAgICogTGlua2VkIGxpc3Qgb2YgZ2x4IHZpc3VhbHMgYW5kICBmYmNvbmZpZ3MgZm9yIHRoaXMgc2NyZWVuLgogICAgICAqLwotICAgIF9fR0xjb250ZXh0TW9kZXMgKmNvbmZpZ3M7CisgICAgX19HTGNvbnRleHRNb2RlcyAqdmlzdWFscywgKmNvbmZpZ3M7CiAKICAgICAvKioKICAgICAgKiBQZXItc2NyZWVuIGR5bmFtaWMgR0xYIGV4dGVuc2lvbiB0cmFja2luZy4gIFRoZSBcYyBkaXJlY3Rfc3VwcG9ydApAQCAtNDc0LDcgKzUxOCw3IEBACiAgICAgR0xib29sZWFuIGV4dF9saXN0X2ZpcnN0X3RpbWU7CiAgICAgLypAfSovCiAKLX0gX19HTFhzY3JlZW5Db25maWdzOworfTsKIAogLyoqCiAgKiBQZXIgZGlzcGxheSBwcml2YXRlIGRhdGEuICBPbmUgb2YgdGhlc2UgcmVjb3JkcyBleGlzdHMgZm9yIGVhY2ggZGlzcGxheQpAQCAtNTIzLDExICs1NjcsMTIgQEAKICAgICAvKioKICAgICAgKiBQZXIgZGlzcGxheSBkaXJlY3QgcmVuZGVyaW5nIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIGRhdGEuCiAgICAgICovCi0gICAgX19EUklkaXNwbGF5IGRyaURpc3BsYXk7CisgICAgX19HTFhEUklkaXNwbGF5ICpkcmlzd0Rpc3BsYXk7CisgICAgX19HTFhEUklkaXNwbGF5ICpkcmlEaXNwbGF5OworICAgIF9fR0xYRFJJZGlzcGxheSAqZHJpMkRpc3BsYXk7CiAjZW5kaWYKIH07CiAKLXZvaWQgX19nbFhGcmVlQ29udGV4dChfX0dMWGNvbnRleHQqKTsKIAogZXh0ZXJuIEdMdWJ5dGUgKl9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoX19HTFhjb250ZXh0KiwgR0x1Ynl0ZSopOwogCkBAIC01NzMsNiArNjE4LDEwIEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKCBVU0VfWFRIUkVBRFMgKSB8fCBkZWZpbmVkKCBQVEhSRUFEUyApICovCiAKK2V4dGVybiB2b2lkIF9fZ2xYU2V0Q3VycmVudENvbnRleHROdWxsKHZvaWQpOworCitleHRlcm4gdm9pZCBfX2dsWEZyZWVDb250ZXh0KF9fR0xYY29udGV4dCopOworCiAKIC8qCiAqKiBHbG9iYWwgbG9jayBmb3IgYWxsIHRocmVhZHMgaW4gdGhpcyBhZGRyZXNzIHNwYWNlIHVzaW5nIHRoZSBHTFgKQEAgLTY0Nyw5ICs2OTYsMTAgQEAKIAogCiAvKgotKiogQWxsb2NhdGUgYW5kIEluaXRpYWxpemUgVmVydGV4IEFycmF5IGNsaWVudCBzdGF0ZSAKKyoqIEFsbG9jYXRlIGFuZCBJbml0aWFsaXplIFZlcnRleCBBcnJheSBjbGllbnQgc3RhdGUsIGFuZCBmcmVlLgogKi8KLWV4dGVybiB2b2lkIF9fZ2xYSW5pdFZlcnRleEFycmF5U3RhdGUoX19HTFhjb250ZXh0Kik7CitleHRlcm4gdm9pZCBfX2dsWEluaXRWZXJ0ZXhBcnJheVN0YXRlKF9fR0xYY29udGV4dCAqKTsKK2V4dGVybiB2b2lkIF9fZ2xYRnJlZVZlcnRleEFycmF5U3RhdGUoX19HTFhjb250ZXh0ICopOwogCiAvKgogKiogSW5mb3JtIHRoZSBTZXJ2ZXIgb2YgdGhlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIGFuZCBvZiB0aGUgY2xpZW50CkBAIC02ODIsMTMgKzczMiwxNiBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgX19nbFhHTENsaWVudFZlcnNpb25bXTsKIGV4dGVybiBjb25zdCBjaGFyIF9fZ2xYR0xDbGllbnRFeHRlbnNpb25zW107CiAKLS8qIERldGVybWluZSB0aGUgaW50ZXJuYWwgQVBJIHZlcnNpb24gKi8KLWV4dGVybiBpbnQgX19nbFhHZXRJbnRlcm5hbFZlcnNpb24odm9pZCk7Ci0KIC8qIEdldCB0aGUgdW5hZGp1c3RlZCBzeXN0ZW0gdGltZSAqLwogZXh0ZXJuIGludCBfX2dsWEdldFVTVCggaW50NjRfdCAqIHVzdCApOwogCi1leHRlcm4gQm9vbCBfX2dsWEdldE1zY1JhdGVPTUwoRGlzcGxheSAqIGRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsCi0gICAgaW50MzJfdCAqIG51bWVyYXRvciwgaW50MzJfdCAqIGRlbm9taW5hdG9yKTsKK2V4dGVybiBHTGJvb2xlYW4gX19nbFhHZXRNc2NSYXRlT01MKERpc3BsYXkgKiBkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAorCQkJCSAgICBpbnQzMl90ICogbnVtZXJhdG9yLCBpbnQzMl90ICogZGVub21pbmF0b3IpOworCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKK0dMYm9vbGVhbgorX19kcmlHZXRNc2NSYXRlT01MKF9fRFJJZHJhd2FibGUgKmRyYXcsCisJCSAgIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IsIHZvaWQgKnByaXZhdGUpOworI2VuZGlmCiAKICNlbmRpZiAvKiAhX19HTFhfY2xpZW50X2hfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2x4Y21kcy5jIGIvc3JjL2dseC94MTEvZ2x4Y21kcy5jCmluZGV4IDgwMjgxODkuLmNkOTYwNWMgMTAwNjQ0Ci0tLSBhL3NyYy9nbHgveDExL2dseGNtZHMuYworKysgYi9zcmMvZ2x4L3gxMS9nbHhjbWRzLmMKQEAgLTM4LDYzICszOCwxMTAgQEAKICAqIENsaWVudC1zaWRlIEdMWCBpbnRlcmZhY2UuCiAgKi8KIAotI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSAiZ2x4Y2xpZW50LmgiCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZXh0dXRpbC5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hleHQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJnbGFwaS5oIgotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0jaW5jbHVkZSAiaW5kaXJlY3RfaW5pdC5oIgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3hmODZ2bW9kZS5oPgotI2luY2x1ZGUgInhmODZkcmkuaCIKLSNlbmRpZgogI2luY2x1ZGUgImdseGV4dGVuc2lvbnMuaCIKICNpbmNsdWRlICJnbGNvbnRleHRtb2Rlcy5oIgogI2luY2x1ZGUgImdsaGVhZGVyLmgiCisKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveGY4NnZtb2RlLmg+CisjaW5jbHVkZSAieGY4NmRyaS5oIgorI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBjaGFyIF9fZ2xYR0xYQ2xpZW50VmVuZG9yTmFtZVtdID0gIlNHSSI7CiBzdGF0aWMgY29uc3QgY2hhciBfX2dsWEdMWENsaWVudFZlcnNpb25bXSA9ICIxLjQiOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKworc3RhdGljIEJvb2wgd2luZG93RXhpc3RzRmxhZzsKK3N0YXRpYyBpbnQgd2luZG93RXhpc3RzRXJyb3JIYW5kbGVyKERpc3BsYXkgKmRweSwgWEVycm9yRXZlbnQgKnhlcnIpCit7CisgICAgaWYgKHhlcnItPmVycm9yX2NvZGUgPT0gQmFkV2luZG93KSB7CisJd2luZG93RXhpc3RzRmxhZyA9IEdMX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBGaW5kIGRyYXdhYmxlcyBpbiB0aGUgbG9jYWwgaGFzaCB0aGF0IGhhdmUgYmVlbiBkZXN0cm95ZWQgb24gdGhlCisgKiBzZXJ2ZXIuCisgKiAKKyAqIFxwYXJhbSBkcHkgICAgRGlzcGxheSB0byBkZXN0cm95IGRyYXdhYmxlcyBmb3IKKyAqIFxwYXJhbSBzY3JlZW4gU2NyZWVuIG51bWJlciB0byBkZXN0cm95IGRyYXdhYmxlcyBmb3IKKyAqLworc3RhdGljIHZvaWQgR2FyYmFnZUNvbGxlY3REUklEcmF3YWJsZXMoRGlzcGxheSAqZHB5LCBfX0dMWHNjcmVlbkNvbmZpZ3MgKnNjKQoreworICAgIFhJRCBkcmF3OworICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3OworICAgIFhXaW5kb3dBdHRyaWJ1dGVzIHh3YTsKKyAgICBpbnQgKCpvbGRYRXJyb3JIYW5kbGVyKShEaXNwbGF5ICosIFhFcnJvckV2ZW50ICopOworCisgICAgLyogU2V0IG5vLW9wIGVycm9yIGhhbmRsZXIgc28gWGxpYiBkb2Vzbid0IGJhaWwgb3V0IGlmIHRoZSB3aW5kb3dzCisgICAgICogaGFzIGFscmVheSBiZWVuIGRlc3Ryb3llZCBvbiB0aGUgc2VydmVyLiAqLworICAgIFhTeW5jKGRweSwgR0xfRkFMU0UpOworICAgIG9sZFhFcnJvckhhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHdpbmRvd0V4aXN0c0Vycm9ySGFuZGxlcik7CisKKyAgICBpZiAoX19nbHhIYXNoRmlyc3Qoc2MtPmRyYXdIYXNoLCAmZHJhdywgKHZvaWQgKikmcGRyYXcpID09IDEpIHsKKwlkbyB7CisJICAgIHdpbmRvd0V4aXN0c0ZsYWcgPSBHTF9UUlVFOworCSAgICBYR2V0V2luZG93QXR0cmlidXRlcyhkcHksIGRyYXcsICZ4d2EpOyAvKiBkdW1teSByZXF1ZXN0ICovCisJICAgIGlmICghd2luZG93RXhpc3RzRmxhZykgeworCQkvKiBEZXN0cm95IHRoZSBsb2NhbCBkcmF3YWJsZSBkYXRhLCBpZiB0aGUgZHJhd2FibGUgbm8KKwkJICAgbG9uZ2VyIGV4aXN0cyBpbiB0aGUgWHNlcnZlciAqLworCQkoKnBkcmF3LT5kZXN0cm95RHJhd2FibGUpKHBkcmF3KTsKKyAgICAgICAgICAgICAgICBfX2dseEhhc2hEZWxldGUoc2MtPmRyYXdIYXNoLCBkcmF3KTsKKwkgICAgfQorCX0gd2hpbGUgKF9fZ2x4SGFzaE5leHQoc2MtPmRyYXdIYXNoLCAmZHJhdywgKHZvaWQgKikmcGRyYXcpID09IDEpOworICAgIH0KKworICAgIFhTeW5jKGRweSwgR0xfRkFMU0UpOworICAgIFhTZXRFcnJvckhhbmRsZXIob2xkWEVycm9ySGFuZGxlcik7Cit9CisKK2V4dGVybiBfX0dMWERSSWRyYXdhYmxlICoKK0dldEdMWERSSURyYXdhYmxlKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCAqIGNvbnN0IHNjcm5fbnVtKTsKKwogLyoqCiAgKiBHZXQgdGhlIF9fRFJJZHJhd2FibGUgZm9yIHRoZSBkcmF3YWJsZSBhc3NvY2lhdGVkIHdpdGggYSBHTFhDb250ZXh0CiAgKiAKICAqIFxwYXJhbSBkcHkgICAgICAgVGhlIGRpc3BsYXkgYXNzb2NpYXRlZCB3aXRoIFxjIGRyYXdhYmxlLgogICogXHBhcmFtIGRyYXdhYmxlICBHTFhEcmF3YWJsZSB3aG9zZSBfX0RSSWRyYXdhYmxlIHBhcnQgaXMgdG8gYmUgcmV0cmlldmVkLgorICogXHBhcmFtIHNjcm5fbnVtICBJZiBub24tTlVMTCwgdGhlIGRyYXdhYmxlcyBzY3JlZW4gaXMgc3RvcmVkIHRoZXJlCiAgKiBccmV0dXJucyAgQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0J3MgX19EUklkcmF3YWJsZSBvbiBzdWNjZXNzLCBvciBOVUxMIGlmCiAgKiAgICAgICAgICAgdGhlIGRyYXdhYmxlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBkaXJlY3QtcmVuZGVyaW5nIGNvbnRleHQuCiAgKi8KLQotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi1zdGF0aWMgX19EUklkcmF3YWJsZSAqCi1HZXREUklEcmF3YWJsZSggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50ICogY29uc3Qgc2Nybl9udW0gKQorX1hfSElEREVOIF9fR0xYRFJJZHJhd2FibGUgKgorR2V0R0xYRFJJRHJhd2FibGUoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50ICogY29uc3Qgc2Nybl9udW0pCiB7Ci0gICAgX19HTFhkaXNwbGF5UHJpdmF0ZSAqIGNvbnN0IHByaXYgPSBfX2dsWEluaXRpYWxpemUoZHB5KTsKKyAgICBfX0dMWGRpc3BsYXlQcml2YXRlICpwcml2ID0gX19nbFhJbml0aWFsaXplKGRweSk7CisgICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXc7CisgICAgY29uc3QgdW5zaWduZWQgIHNjcmVlbl9jb3VudCA9IFNjcmVlbkNvdW50KGRweSk7CisgICAgdW5zaWduZWQgICBpOworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOwogCi0gICAgaWYgKCAocHJpdiAhPSBOVUxMKSAmJiAocHJpdi0+ZHJpRGlzcGxheS5wcml2YXRlICE9IE5VTEwpICkgewotCWNvbnN0IHVuc2lnbmVkICBzY3JlZW5fY291bnQgPSBTY3JlZW5Db3VudChkcHkpOwotCXVuc2lnbmVkICAgaTsKKyAgICBpZiAocHJpdiA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBzY3JlZW5fY291bnQ7IGkrKykgeworCXBzYyA9ICZwcml2LT5zY3JlZW5Db25maWdzW2ldOworCWlmIChwc2MtPmRyYXdIYXNoID09IE5VTEwpCisJICAgIGNvbnRpbnVlOwogCi0JZm9yICggaSA9IDAgOyBpIDwgc2NyZWVuX2NvdW50IDsgaSsrICkgewotCSAgICBfX0RSSXNjcmVlbiAqIGNvbnN0IHBzYyA9ICZwcml2LT5zY3JlZW5Db25maWdzW2ldLmRyaVNjcmVlbjsKLQkgICAgX19EUklkcmF3YWJsZSAqIGNvbnN0IHBkcmF3ID0gKHBzYy0+cHJpdmF0ZSAhPSBOVUxMKQotCSAgICAgICA/ICgqcHNjLT5nZXREcmF3YWJsZSkoZHB5LCBkcmF3YWJsZSwgcHNjLT5wcml2YXRlKSA6IE5VTEw7Ci0KLQkgICAgaWYgKCBwZHJhdyAhPSBOVUxMICkgewotCQlpZiAoIHNjcm5fbnVtICE9IE5VTEwgKSB7Ci0JCSAgICAqc2Nybl9udW0gPSBpOwotCQl9Ci0JCXJldHVybiBwZHJhdzsKLQkgICAgfQorCWlmIChfX2dseEhhc2hMb29rdXAocHNjLT5kcmF3SGFzaCwgZHJhd2FibGUsICh2b2lkICopICZwZHJhdykgPT0gMCkgeworCSAgICBpZiAoc2Nybl9udW0gIT0gTlVMTCkKKwkJKnNjcm5fbnVtID0gaTsKKwkgICAgcmV0dXJuIHBkcmF3OwogCX0KICAgICB9CiAKICAgICByZXR1cm4gTlVMTDsKIH0KKwogI2VuZGlmCiAKIApAQCAtMjY0LDkgKzMxMSw5IEBACiAgICAgKi8KICAgICBnYy0+ZmFzdEltYWdlVW5wYWNrID0gR0xfRkFMU0U7CiAgICAgZ2MtPmZpbGxJbWFnZSA9IF9fZ2xGaWxsSW1hZ2U7Ci0gICAgZ2MtPmlzRGlyZWN0ID0gR0xfRkFMU0U7CiAgICAgZ2MtPnBjID0gZ2MtPmJ1ZjsKICAgICBnYy0+YnVmRW5kID0gZ2MtPmJ1ZiArIGJ1ZlNpemU7CisgICAgZ2MtPmlzRGlyZWN0ID0gR0xfRkFMU0U7CiAgICAgaWYgKF9fZ2xYRGVidWcpIHsKIAkvKgogCSoqIFNldCBsaW1pdCByZWdpc3RlciBzbyB0aGF0IHRoZXJlIHdpbGwgYmUgb25lIGNvbW1hbmQgcGVyIHBhY2tldApAQCAtMzEyLDYgKzM1OSwxMCBAQAogCSAgICAgIEJvb2wgdXNlX2dseF8xXzMsIGludCByZW5kZXJUeXBlKQogewogICAgIEdMWENvbnRleHQgZ2M7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBpbnQgc2NyZWVuID0gKGZiY29uZmlnID09IE5VTEwpID8gdmlzLT5zY3JlZW4gOiBmYmNvbmZpZy0+c2NyZWVuOworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoZHB5LCBzY3JlZW4pOworI2VuZGlmCiAKICAgICBpZiAoIGRweSA9PSBOVUxMICkKICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMyNSw0MSArMzc2LDM2IEBACiAJICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLQlpZiAoYWxsb3dEaXJlY3QpIHsKLQkgICAgaW50IHNjcmVlbiA9IChmYmNvbmZpZyA9PSBOVUxMKSA/IHZpcy0+c2NyZWVuIDogZmJjb25maWctPnNjcmVlbjsKLQkgICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyhkcHksIHNjcmVlbik7CisJaWYgKGFsbG93RGlyZWN0ICYmIHBzYy0+ZHJpU2NyZWVuKSB7CiAJICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlOwogCi0JICAgIC8qIFRoZSB2YWx1ZSBvZiBmYmNvbmZpZyBjYW5ub3QgY2hhbmdlIGJlY2F1c2UgaXQgaXMgdGVzdGVkCi0JICAgICAqIGxhdGVyIGluIHRoZSBmdW5jdGlvbi4KLQkgICAgICovCi0JICAgIGlmICggZmJjb25maWcgPT0gTlVMTCApIHsKLQkJLyogRklYTUU6IElzIGl0IHBvc3NpYmxlIGZvciB0aGUgX19HTGNvbnRleHRNb2RlcyBzdHJ1Y3R1cmUKLQkJICogRklYTUU6IHRvIG5vdCBiZSBmb3VuZD8KLQkJICovCi0JCW1vZGUgPSBfZ2xfY29udGV4dF9tb2Rlc19maW5kX3Zpc3VhbCggcHNjLT5jb25maWdzLAotCQkJCQkJICAgICAgdmlzLT52aXN1YWxpZCApOwotCQlhc3NlcnQoIG1vZGUgIT0gTlVMTCApOwotCQlhc3NlcnQoIG1vZGUtPnNjcmVlbiA9PSBzY3JlZW4gKTsKKwkgICAgaWYgKGZiY29uZmlnID09IE5VTEwpIHsKKwkJbW9kZSA9IF9nbF9jb250ZXh0X21vZGVzX2ZpbmRfdmlzdWFsKHBzYy0+dmlzdWFscywgdmlzLT52aXN1YWxpZCk7CisJCWlmIChtb2RlID09IE5VTEwpIHsKKwkJICAgeEVycm9yIGVycm9yOworCisJCSAgIGVycm9yLmVycm9yQ29kZSA9IEJhZFZhbHVlOworCQkgICBlcnJvci5yZXNvdXJjZUlEID0gdmlzLT52aXN1YWxpZDsKKwkJICAgZXJyb3Iuc2VxdWVuY2VOdW1iZXIgPSBkcHktPnJlcXVlc3Q7CisJCSAgIGVycm9yLnR5cGUgPSBYX0Vycm9yOworCQkgICBlcnJvci5tYWpvckNvZGUgPSBnYy0+bWFqb3JPcGNvZGU7CisJCSAgIGVycm9yLm1pbm9yQ29kZSA9IFhfR0xYQ3JlYXRlQ29udGV4dDsKKwkJICAgX1hFcnJvcihkcHksICZlcnJvcik7CisJCSAgIHJldHVybiBOb25lOworCQl9CiAJICAgIH0KIAkgICAgZWxzZSB7CiAJCW1vZGUgPSBmYmNvbmZpZzsKIAkgICAgfQogCi0JICAgIGlmIChwc2MgJiYgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSkgewotCQl2b2lkICogY29uc3Qgc2hhcmVkID0gKHNoYXJlTGlzdCAhPSBOVUxMKQotCQkgICAgPyBzaGFyZUxpc3QtPmRyaUNvbnRleHQucHJpdmF0ZSA6IE5VTEw7Ci0JCWdjLT5kcmlDb250ZXh0LnByaXZhdGUgPSAKLQkJICAoKnBzYy0+ZHJpU2NyZWVuLmNyZWF0ZU5ld0NvbnRleHQpKCBkcHksIG1vZGUsIHJlbmRlclR5cGUsCi0JCQkJCQkgICAgICBzaGFyZWQsCi0JCQkJCQkgICAgICAmZ2MtPmRyaUNvbnRleHQgKTsKLQkJaWYgKGdjLT5kcmlDb250ZXh0LnByaXZhdGUpIHsKLQkJICAgIGdjLT5pc0RpcmVjdCA9IEdMX1RSVUU7Ci0JCSAgICBnYy0+c2NyZWVuID0gbW9kZS0+c2NyZWVuOwotCQkgICAgZ2MtPnZpZCA9IG1vZGUtPnZpc3VhbElEOwotCQkgICAgZ2MtPmZiY29uZmlnSUQgPSBtb2RlLT5mYmNvbmZpZ0lEOwotCQkgICAgZ2MtPmRyaUNvbnRleHQubW9kZSA9IG1vZGU7Ci0JCX0KKwkgICAgZ2MtPmRyaUNvbnRleHQgPSBwc2MtPmRyaVNjcmVlbi0+Y3JlYXRlQ29udGV4dChwc2MsIG1vZGUsIGdjLAorCQkJCQkJCSAgIHNoYXJlTGlzdCwKKwkJCQkJCQkgICByZW5kZXJUeXBlKTsKKwkgICAgaWYgKGdjLT5kcmlDb250ZXh0ICE9IE5VTEwpIHsKKwkJZ2MtPnNjcmVlbiA9IG1vZGUtPnNjcmVlbjsKKwkJZ2MtPnBzYyA9IHBzYzsKKwkJZ2MtPm1vZGUgPSBtb2RlOworCQlnYy0+aXNEaXJlY3QgPSBHTF9UUlVFOwogCSAgICB9CiAJfQogI2VuZGlmCkBAIC0zNzYsNyArNDIyLDExIEBACiAJICAgIHJlcS0+dmlzdWFsID0gdmlzLT52aXN1YWxpZDsKIAkgICAgcmVxLT5zY3JlZW4gPSB2aXMtPnNjcmVlbjsKIAkgICAgcmVxLT5zaGFyZUxpc3QgPSBzaGFyZUxpc3QgPyBzaGFyZUxpc3QtPnhpZCA6IE5vbmU7Ci0JICAgIHJlcS0+aXNEaXJlY3QgPSBnYy0+aXNEaXJlY3Q7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKwkgICAgcmVxLT5pc0RpcmVjdCA9IGdjLT5kcmlDb250ZXh0ICE9IE5VTEw7CisjZWxzZQorCSAgICByZXEtPmlzRGlyZWN0ID0gMDsKKyNlbmRpZgogCX0KIAllbHNlIGlmICggdXNlX2dseF8xXzMgKSB7CiAJICAgIHhHTFhDcmVhdGVOZXdDb250ZXh0UmVxICpyZXE7CkBAIC0zOTAsNyArNDQwLDExIEBACiAJICAgIHJlcS0+c2NyZWVuID0gZmJjb25maWctPnNjcmVlbjsKIAkgICAgcmVxLT5yZW5kZXJUeXBlID0gcmVuZGVyVHlwZTsKIAkgICAgcmVxLT5zaGFyZUxpc3QgPSBzaGFyZUxpc3QgPyBzaGFyZUxpc3QtPnhpZCA6IE5vbmU7Ci0JICAgIHJlcS0+aXNEaXJlY3QgPSBnYy0+aXNEaXJlY3Q7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKwkgICAgcmVxLT5pc0RpcmVjdCA9IGdjLT5kcmlDb250ZXh0ICE9IE5VTEw7CisjZWxzZQorCSAgICByZXEtPmlzRGlyZWN0ID0gMDsKKyNlbmRpZgogCX0KIAllbHNlIHsKIAkgICAgeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEgKnZwcmVxOwpAQCAtNDA4LDcgKzQ2MiwxMSBAQAogCSAgICByZXEtPnNjcmVlbiA9IGZiY29uZmlnLT5zY3JlZW47CiAJICAgIHJlcS0+cmVuZGVyVHlwZSA9IHJlbmRlclR5cGU7CiAJICAgIHJlcS0+c2hhcmVMaXN0ID0gc2hhcmVMaXN0ID8gc2hhcmVMaXN0LT54aWQgOiBOb25lOwotCSAgICByZXEtPmlzRGlyZWN0ID0gZ2MtPmlzRGlyZWN0OworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisJICAgIHJlcS0+aXNEaXJlY3QgPSBnYy0+ZHJpQ29udGV4dCAhPSBOVUxMOworI2Vsc2UKKwkgICAgcmVxLT5pc0RpcmVjdCA9IDA7CisjZW5kaWYKIAl9CiAKIAlVbmxvY2tEaXNwbGF5KGRweSk7CkBAIC00MzAsNyArNDg4LDcgQEAKIAkJCUZhbHNlLCAwKTsKIH0KIAotdm9pZCBfX2dsWEZyZWVDb250ZXh0KF9fR0xYY29udGV4dCAqZ2MpCitfWF9ISURERU4gdm9pZCBfX2dsWEZyZWVDb250ZXh0KF9fR0xYY29udGV4dCAqZ2MpCiB7CiAgICAgaWYgKGdjLT52ZW5kb3IpIFhGcmVlKChjaGFyICopIGdjLT52ZW5kb3IpOwogICAgIGlmIChnYy0+cmVuZGVyZXIpIFhGcmVlKChjaGFyICopIGdjLT5yZW5kZXJlcik7CkBAIC00NjYsMTUgKzUyNCwxNSBAQAogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKICAgICAvKiBEZXN0cm95IHRoZSBkaXJlY3QgcmVuZGVyaW5nIGNvbnRleHQgKi8KLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7Ci0JaWYgKGdjLT5kcmlDb250ZXh0LnByaXZhdGUpIHsKLQkgICAgKCpnYy0+ZHJpQ29udGV4dC5kZXN0cm95Q29udGV4dCkoZHB5LCBnYy0+c2NyZWVuLAotCQkJCQkgICAgIGdjLT5kcmlDb250ZXh0LnByaXZhdGUpOwotCSAgICBnYy0+ZHJpQ29udGV4dC5wcml2YXRlID0gTlVMTDsKLQl9CisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CisJKCpnYy0+ZHJpQ29udGV4dC0+ZGVzdHJveUNvbnRleHQpKGdjLT5kcmlDb250ZXh0LCBnYy0+cHNjLCBkcHkpOworCWdjLT5kcmlDb250ZXh0ID0gTlVMTDsKKwlHYXJiYWdlQ29sbGVjdERSSURyYXdhYmxlcyhkcHksIGdjLT5wc2MpOwogICAgIH0KICNlbmRpZgogCisgICAgX19nbFhGcmVlVmVydGV4QXJyYXlTdGF0ZShnYyk7CisKICAgICBpZiAoZ2MtPmN1cnJlbnREcHkpIHsKIAkvKiBIYXZlIHRvIGZyZWUgbGF0ZXIgY3V6IGl0J3MgaW4gdXNlIG5vdyAqLwogCV9fZ2xYVW5sb2NrKCk7CkBAIC01NTIsNyArNjEwLDcgQEAKICAgICBfX2dsWEZsdXNoUmVuZGVyQnVmZmVyKGdjLCBnYy0+cGMpOwogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7CisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAvKiBUaGlzIGJpdCBvZiB1Z2xpbmVzcyB1bndyYXBzIHRoZSBnbEZpbmlzaCBmdW5jdGlvbiAqLwogI2lmZGVmIGdsRmluaXNoCiAjdW5kZWYgZ2xGaW5pc2gKQEAgLTU4OCw3ICs2NDYsNyBAQAogICAgIF9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoZ2MsIGdjLT5wYyk7CiAKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKIAlYU3luYyhkcHksIEZhbHNlKTsKIAlyZXR1cm47CiAgICAgfQpAQCAtNjE4LDcgKzY3Niw3IEBACiAgICAgKHZvaWQpIF9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoZ2MsIGdjLT5wYyk7CiAKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgIERSSV9nbFhVc2VYRm9udChmb250LCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC02NTgsNyArNzE2LDcgQEAKICAgICB9CiAKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKIAkvKiBOT1RfRE9ORTogVGhpcyBkb2VzIG5vdCB3b3JrIHlldCAqLwogICAgIH0KICNlbmRpZgpAQCAtNzMwLDcgKzc4OCw3IEBACiAgICAgaWYgKCFnYykgewogCXJldHVybiBHTF9GQUxTRTsKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgIH0gZWxzZSBpZiAoZ2MtPmlzRGlyZWN0KSB7CisgICAgfSBlbHNlIGlmIChnYy0+ZHJpQ29udGV4dCkgewogCXJldHVybiBHTF9UUlVFOwogI2VuZGlmCiAgICAgfQpAQCAtNzkzLDEwICs4NTEsMTAgQEAKICAgICBHTFhDb250ZXh0VGFnIHRhZzsKICAgICBDQVJEOCBvcGNvZGU7CiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLSAgICBfX0RSSWRyYXdhYmxlICpwZHJhdyA9IEdldERSSURyYXdhYmxlKCBkcHksIGRyYXdhYmxlLCBOVUxMICk7CisgICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCBOVUxMKTsKIAotICAgIGlmICggcGRyYXcgIT0gTlVMTCApIHsKLQkoKnBkcmF3LT5zd2FwQnVmZmVycykoZHB5LCBwZHJhdy0+cHJpdmF0ZSk7CisgICAgaWYgKHBkcmF3ICE9IE5VTEwpIHsKKwkoKnBkcmF3LT5wc2MtPmNvcmUtPnN3YXBCdWZmZXJzKShwZHJhdy0+ZHJpRHJhd2FibGUpOwogCXJldHVybjsKICAgICB9CiAjZW5kaWYKQEAgLTg0MCwxMiArODk4LDEyIEBACiB7CiAgICAgX19HTFhkaXNwbGF5UHJpdmF0ZSAqcHJpdjsKICAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYzsKKyAgICBfX0dMY29udGV4dE1vZGVzICptb2RlczsKICAgICBpbnQgICBzdGF0dXM7CiAKICAgICBzdGF0dXMgPSBHZXRHTFhQcml2U2NyZWVuQ29uZmlnKCBkcHksIHZpcy0+c2NyZWVuLCAmIHByaXYsICYgcHNjICk7CiAgICAgaWYgKCBzdGF0dXMgPT0gU3VjY2VzcyApIHsKLQljb25zdCBfX0dMY29udGV4dE1vZGVzICogY29uc3QgbW9kZXMgPSBfZ2xfY29udGV4dF9tb2Rlc19maW5kX3Zpc3VhbCgKLQkJCQkJICAgICBwc2MtPmNvbmZpZ3MsIHZpcy0+dmlzdWFsaWQgKTsKKwltb2RlcyA9IF9nbF9jb250ZXh0X21vZGVzX2ZpbmRfdmlzdWFsKHBzYy0+dmlzdWFscywgdmlzLT52aXN1YWxpZCk7CiAKIAkvKiBMb29rdXAgYXR0cmlidXRlIGFmdGVyIGZpcnN0IGZpbmRpbmcgYSBtYXRjaCBvbiB0aGUgdmlzdWFsICovCiAJaWYgKCBtb2RlcyAhPSBOVUxMICkgewpAQCAtMTIyMyw3ICsxMjgxLDcgQEAKICAgICAqKiBDb21wdXRlIGEgc2NvcmUgZm9yIHRob3NlIHRoYXQgZG8KICAgICAqKiBSZW1lbWJlciB3aGljaCB2aXN1YWwsIGlmIGFueSwgZ290IHRoZSBoaWdoZXN0IHNjb3JlCiAgICAgKi8KLSAgICBmb3IgKCBtb2RlcyA9IHBzYy0+Y29uZmlncyA7IG1vZGVzICE9IE5VTEwgOyBtb2RlcyA9IG1vZGVzLT5uZXh0ICkgeworICAgIGZvciAoIG1vZGVzID0gcHNjLT52aXN1YWxzIDsgbW9kZXMgIT0gTlVMTCA7IG1vZGVzID0gbW9kZXMtPm5leHQgKSB7CiAJaWYgKCBmYmNvbmZpZ3NfY29tcGF0aWJsZSggJiB0ZXN0X2NvbmZpZywgbW9kZXMgKQogCSAgICAgJiYgKChiZXN0X2NvbmZpZyA9PSBOVUxMKQogCQkgfHwgKGZiY29uZmlnX2NvbXBhcmUoIChjb25zdCBfX0dMY29udGV4dE1vZGVzICogY29uc3QgKiBjb25zdCkmbW9kZXMsICZiZXN0X2NvbmZpZyApIDwgMCkpICkgewpAQCAtMTI2OCw3ICsxMzI2LDcgQEAKIAogCV9fZ2xYQ2FsY3VsYXRlVXNhYmxlRXh0ZW5zaW9ucyhwc2MsCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLQkJCQkgICAgICAgKHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUgIT0gTlVMTCksCisJCQkJICAgICAgIChwc2MtPmRyaVNjcmVlbiAhPSBOVUxMKSwKICNlbHNlCiAJCQkJICAgICAgIEdMX0ZBTFNFLAogI2VuZGlmCkBAIC0xNDQ3LDEzICsxNTA1LDE1IEBACiAJCSAgICBjdHgtPnNoYXJlX3hpZCA9ICpwUHJvcCsrOwogCQkgICAgYnJlYWs7CiAJCWNhc2UgR0xYX1ZJU1VBTF9JRF9FWFQ6Ci0JCSAgICBjdHgtPnZpZCA9ICpwUHJvcCsrOworCQkgICAgY3R4LT5tb2RlID0KKwkJCV9nbF9jb250ZXh0X21vZGVzX2ZpbmRfdmlzdWFsKGN0eC0+cHNjLT52aXN1YWxzLCAqcFByb3ArKyk7CiAJCSAgICBicmVhazsKIAkJY2FzZSBHTFhfU0NSRUVOOgogCQkgICAgY3R4LT5zY3JlZW4gPSAqcFByb3ArKzsKIAkJICAgIGJyZWFrOwogCQljYXNlIEdMWF9GQkNPTkZJR19JRDoKLQkJICAgIGN0eC0+ZmJjb25maWdJRCA9ICpwUHJvcCsrOworCQkgICAgY3R4LT5tb2RlID0KKwkJCV9nbF9jb250ZXh0X21vZGVzX2ZpbmRfZmJjb25maWcoY3R4LT5wc2MtPmNvbmZpZ3MsICpwUHJvcCsrKTsKIAkJICAgIGJyZWFrOwogCQljYXNlIEdMWF9SRU5ERVJfVFlQRToKIAkJICAgIGN0eC0+cmVuZGVyVHlwZSA9ICpwUHJvcCsrOwpAQCAtMTQ3OCw3ICsxNTM4LDExIEBACiAgICAgaW50IHJldFZhbDsKIAogICAgIC8qIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeSAqLwotICAgIGlmICghY3R4LT5pc0RpcmVjdCAmJiAoY3R4LT52aWQgPT0gTm9uZSkpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmICghY3R4LT5kcmlDb250ZXh0ICYmIChjdHgtPm1vZGUgPT0gTlVMTCkpIHsKKyNlbHNlCisgICAgaWYgKGN0eC0+bW9kZSA9PSBOVUxMKSB7CisjZW5kaWYKIAlyZXRWYWwgPSBfX2dsWFF1ZXJ5Q29udGV4dEluZm8oZHB5LCBjdHgpOwogCWlmIChTdWNjZXNzICE9IHJldFZhbCkgcmV0dXJuIHJldFZhbDsKICAgICB9CkBAIC0xNDg3LDEzICsxNTUxLDEzIEBACiAJKnZhbHVlID0gKGludCkoY3R4LT5zaGFyZV94aWQpOwogCWJyZWFrOwogICAgIGNhc2UgR0xYX1ZJU1VBTF9JRF9FWFQ6Ci0JKnZhbHVlID0gKGludCkoY3R4LT52aWQpOworCSp2YWx1ZSA9IGN0eC0+bW9kZSA/IGN0eC0+bW9kZS0+dmlzdWFsSUQgOiBOb25lOwogCWJyZWFrOwogICAgIGNhc2UgR0xYX1NDUkVFTjoKIAkqdmFsdWUgPSAoaW50KShjdHgtPnNjcmVlbik7CiAJYnJlYWs7CiAgICAgY2FzZSBHTFhfRkJDT05GSUdfSUQ6Ci0JKnZhbHVlID0gKGludCkoY3R4LT5mYmNvbmZpZ0lEKTsKKwkqdmFsdWUgPSBjdHgtPm1vZGUgPyBjdHgtPm1vZGUtPmZiY29uZmlnSUQgOiBOb25lOwogCWJyZWFrOwogICAgIGNhc2UgR0xYX1JFTkRFUl9UWVBFOgogCSp2YWx1ZSA9IChpbnQpKGN0eC0+cmVuZGVyVHlwZSk7CkBAIC0xNTkxLDYgKzE2NTUsNyBAQAogICAgIF9fR0xjb250ZXh0TW9kZXMgKiogY29uZmlnID0gTlVMTDsKICAgICBpbnQgICBpOwogCisgICAgKm5lbGVtZW50cyA9IDA7CiAgICAgaWYgKCAocHJpdi0+c2NyZWVuQ29uZmlncyAhPSBOVUxMKQogCSAmJiAoc2NyZWVuID49IDApICYmIChzY3JlZW4gPD0gU2NyZWVuQ291bnQoZHB5KSkKIAkgJiYgKHByaXYtPnNjcmVlbkNvbmZpZ3Nbc2NyZWVuXS5jb25maWdzICE9IE5VTEwpCkBAIC0xNjE1LDggKzE2ODAsMTAgQEAKIAkgICAgZm9yICggbW9kZXMgPSBwcml2LT5zY3JlZW5Db25maWdzW3NjcmVlbl0uY29uZmlncwogCQkgIDsgbW9kZXMgIT0gTlVMTAogCQkgIDsgbW9kZXMgPSBtb2Rlcy0+bmV4dCApIHsKLQkJY29uZmlnW2ldID0gbW9kZXM7Ci0JCWkrKzsKKwkJaWYgKCBtb2Rlcy0+ZmJjb25maWdJRCAhPSBHTFhfRE9OVF9DQVJFICkgeworCQkgICAgY29uZmlnW2ldID0gbW9kZXM7CisJCSAgICBpKys7CisJCX0KIAkgICAgfQogCX0KICAgICB9CkBAIC0xNjY4LDE2ICsxNzM1LDE1IEBACiAgICAgICByZXR1cm4gR0xYX0JBRF9WQUxVRTsKICAgIH0KIAotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICBpZiAoIGdjLT5pc0RpcmVjdCApIHsKKyNpZmRlZiBfX0RSSV9TV0FQX0NPTlRST0wKKyAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoIGdjLT5jdXJyZW50RHB5LAogCQkJCQkJCSAgICAgZ2MtPnNjcmVlbiApOwotICAgICAgIF9fRFJJZHJhd2FibGUgKiBjb25zdCBwZHJhdyA9IEdldERSSURyYXdhYmxlKCBnYy0+Y3VycmVudERweSwKLQkJCQkJCSAgICAgZ2MtPmN1cnJlbnREcmF3YWJsZSwKLQkJCQkJCSAgICAgTlVMTCApOwotICAgICAgIGlmICggX19nbFhFeHRlbnNpb25CaXRJc0VuYWJsZWQoIHBzYywgU0dJX3N3YXBfY29udHJvbF9iaXQgKQotCSAgICAmJiAocGRyYXcgIT0gTlVMTCkgKSB7Ci0JICAgcGRyYXctPnN3YXBfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICAgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IEdldEdMWERSSURyYXdhYmxlKGdjLT5jdXJyZW50RHB5LAorCQkJCQkJICAgZ2MtPmN1cnJlbnREcmF3YWJsZSwKKwkJCQkJCSAgIE5VTEwpOworICAgICAgIGlmIChwc2MtPnN3YXBDb250cm9sICE9IE5VTEwgJiYgcGRyYXcgIT0gTlVMTCkgeworCSAgIHBzYy0+c3dhcENvbnRyb2wtPnNldFN3YXBJbnRlcnZhbChwZHJhdy0+ZHJpRHJhd2FibGUsIGludGVydmFsKTsKIAkgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CkBAIC0xNzE1LDI1ICsxNzgxLDIyIEBACiAqLwogc3RhdGljIGludCBfX2dsWFN3YXBJbnRlcnZhbE1FU0EodW5zaWduZWQgaW50IGludGVydmFsKQogewotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfU1dBUF9DT05UUk9MCiAgICBHTFhDb250ZXh0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCiAgICBpZiAoIGludGVydmFsIDwgMCApIHsKICAgICAgIHJldHVybiBHTFhfQkFEX1ZBTFVFOwogICAgfQogCi0gICBpZiAoIChnYyAhPSBOVUxMKSAmJiBnYy0+aXNEaXJlY3QgKSB7CisgICBpZiAoZ2MgIT0gTlVMTCAmJiBnYy0+ZHJpQ29udGV4dCkgewogICAgICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZ2MtPmN1cnJlbnREcHksCiAJCQkJCQkJICAgIGdjLT5zY3JlZW4gKTsKICAgICAgIAotICAgICAgaWYgKCAocHNjICE9IE5VTEwpICYmIChwc2MtPmRyaVNjcmVlbi5wcml2YXRlICE9IE5VTEwpCi0JICAgJiYgX19nbFhFeHRlbnNpb25CaXRJc0VuYWJsZWQoIHBzYywgTUVTQV9zd2FwX2NvbnRyb2xfYml0ICkgKSB7Ci0JIF9fRFJJZHJhd2FibGUgKiBjb25zdCBwZHJhdyA9IAotCSAgICAgKCpwc2MtPmRyaVNjcmVlbi5nZXREcmF3YWJsZSkoZ2MtPmN1cnJlbnREcHksCi0JCQkJCSAgIGdjLT5jdXJyZW50RHJhd2FibGUsCi0JCQkJCSAgIHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUpOwotCSBpZiAoIHBkcmF3ICE9IE5VTEwgKSB7Ci0JICAgIHBkcmF3LT5zd2FwX2ludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICBpZiAoIChwc2MgIT0gTlVMTCkgJiYgKHBzYy0+ZHJpU2NyZWVuICE9IE5VTEwpICkgeworCSBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IAorCSAgICAgR2V0R0xYRFJJRHJhd2FibGUoZ2MtPmN1cnJlbnREcHksIGdjLT5jdXJyZW50RHJhd2FibGUsIE5VTEwpOworCSBpZiAocHNjLT5zd2FwQ29udHJvbCAhPSBOVUxMICYmIHBkcmF3ICE9IE5VTEwpIHsKKwkgICAgcHNjLT5zd2FwQ29udHJvbC0+c2V0U3dhcEludGVydmFsKHBkcmF3LT5kcmlEcmF3YWJsZSwgaW50ZXJ2YWwpOwogCSAgICByZXR1cm4gMDsKIAkgfQogICAgICAgfQpAQCAtMTc0OCwyMSArMTgxMSwxOCBAQAogCiBzdGF0aWMgaW50IF9fZ2xYR2V0U3dhcEludGVydmFsTUVTQSh2b2lkKQogewotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfU1dBUF9DT05UUk9MCiAgICBHTFhDb250ZXh0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICBpZiAoIChnYyAhPSBOVUxMKSAmJiBnYy0+aXNEaXJlY3QgKSB7CisgICBpZiAoZ2MgIT0gTlVMTCAmJiBnYy0+ZHJpQ29udGV4dCkgewogICAgICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZ2MtPmN1cnJlbnREcHksCiAJCQkJCQkJICAgIGdjLT5zY3JlZW4gKTsKICAgICAgIAotICAgICAgaWYgKCAocHNjICE9IE5VTEwpICYmIChwc2MtPmRyaVNjcmVlbi5wcml2YXRlICE9IE5VTEwpCi0JICAgJiYgX19nbFhFeHRlbnNpb25CaXRJc0VuYWJsZWQoIHBzYywgTUVTQV9zd2FwX2NvbnRyb2xfYml0ICkgKSB7Ci0JIF9fRFJJZHJhd2FibGUgKiBjb25zdCBwZHJhdyA9IAotCSAgICAgKCpwc2MtPmRyaVNjcmVlbi5nZXREcmF3YWJsZSkoZ2MtPmN1cnJlbnREcHksCi0JCQkJCSAgIGdjLT5jdXJyZW50RHJhd2FibGUsCi0JCQkJCSAgIHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUpOwotCSBpZiAoIHBkcmF3ICE9IE5VTEwgKSB7Ci0JICAgIHJldHVybiBwZHJhdy0+c3dhcF9pbnRlcnZhbDsKKyAgICAgIGlmICggKHBzYyAhPSBOVUxMKSAmJiAocHNjLT5kcmlTY3JlZW4gIT0gTlVMTCkgKSB7CisJIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gCisJICAgICBHZXRHTFhEUklEcmF3YWJsZShnYy0+Y3VycmVudERweSwgZ2MtPmN1cnJlbnREcmF3YWJsZSwgTlVMTCk7CisJIGlmIChwc2MtPnN3YXBDb250cm9sICE9IE5VTEwgJiYgcGRyYXcgIT0gTlVMTCkgeworCSAgICByZXR1cm4gcHNjLT5zd2FwQ29udHJvbC0+Z2V0U3dhcEludGVydmFsKHBkcmF3LT5kcmlEcmF3YWJsZSk7CiAJIH0KICAgICAgIH0KICAgIH0KQEAgLTE3NzksMTUgKzE4MzksMTMgQEAKIHN0YXRpYyBHTGludCBfX2dsWEJlZ2luRnJhbWVUcmFja2luZ01FU0EoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSkKIHsKICAgIGludCAgIHN0YXR1cyA9IEdMWF9CQURfQ09OVEVYVDsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworI2lmZGVmIF9fRFJJX0ZSQU1FX1RSQUNLSU5HCiAgICBpbnQgc2NyZWVuOwotICAgX19EUklkcmF3YWJsZSAqIGNvbnN0IHBkcmF3ID0gR2V0RFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgJiBzY3JlZW4pOworICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmc2NyZWVuKTsKICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoZHB5LCBzY3JlZW4pOwogCi0gICBpZiAoIChwZHJhdyAhPSBOVUxMKSAmJiAocGRyYXctPmZyYW1lVHJhY2tpbmcgIT0gTlVMTCkKLQkmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBNRVNBX3N3YXBfZnJhbWVfdXNhZ2VfYml0ICkgKSB7Ci0gICAgICBzdGF0dXMgPSBwZHJhdy0+ZnJhbWVUcmFja2luZyggZHB5LCBwZHJhdy0+cHJpdmF0ZSwgR0xfVFJVRSApOwotICAgfQorICAgaWYgKHBkcmF3ICE9IE5VTEwgJiYgcHNjLT5mcmFtZVRyYWNraW5nICE9IE5VTEwpCisgICAgICAgc3RhdHVzID0gcHNjLT5mcmFtZVRyYWNraW5nLT5mcmFtZVRyYWNraW5nKHBkcmF3LT5kcmlEcmF3YWJsZSwgR0xfVFJVRSk7CiAjZWxzZQogICAgKHZvaWQpIGRweTsKICAgICh2b2lkKSBkcmF3YWJsZTsKQEAgLTE3OTksMTUgKzE4NTcsMTQgQEAKIHN0YXRpYyBHTGludCBfX2dsWEVuZEZyYW1lVHJhY2tpbmdNRVNBKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpCiB7CiAgICBpbnQgICBzdGF0dXMgPSBHTFhfQkFEX0NPTlRFWFQ7Ci0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyNpZmRlZiBfX0RSSV9GUkFNRV9UUkFDS0lORwogICAgaW50IHNjcmVlbjsKLSAgIF9fRFJJZHJhd2FibGUgKiBjb25zdCBwZHJhdyA9IEdldERSSURyYXdhYmxlKGRweSwgZHJhd2FibGUsICYgc2NyZWVuKTsKLSAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoZHB5LCBzY3JlZW4pOworICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmIHNjcmVlbik7CisgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoZHB5LCBzY3JlZW4pOwogCi0gICBpZiAoIChwZHJhdyAhPSBOVUxMKSAmJiAocGRyYXctPmZyYW1lVHJhY2tpbmcgIT0gTlVMTCkKLQkmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBNRVNBX3N3YXBfZnJhbWVfdXNhZ2VfYml0ICkgKSB7Ci0gICAgICBzdGF0dXMgPSBwZHJhdy0+ZnJhbWVUcmFja2luZyggZHB5LCBwZHJhdy0+cHJpdmF0ZSwgR0xfRkFMU0UgKTsKLSAgIH0KKyAgIGlmIChwZHJhdyAhPSBOVUxMICYmIHBzYy0+ZnJhbWVUcmFja2luZyAhPSBOVUxMKQorICAgICAgIHN0YXR1cyA9IHBzYy0+ZnJhbWVUcmFja2luZy0+ZnJhbWVUcmFja2luZyhwZHJhdy0+ZHJpRHJhd2FibGUsCisJCQkJCQkgIEdMX0ZBTFNFKTsKICNlbHNlCiAgICAodm9pZCkgZHB5OwogICAgKHZvaWQpIGRyYXdhYmxlOwpAQCAtMTgyMCwxOSArMTg3NywyMCBAQAogCQkJCSAgICBHTGZsb2F0ICp1c2FnZSkKIHsKICAgIGludCAgIHN0YXR1cyA9IEdMWF9CQURfQ09OVEVYVDsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworI2lmZGVmIF9fRFJJX0ZSQU1FX1RSQUNLSU5HCiAgICBpbnQgc2NyZWVuOwotICAgX19EUklkcmF3YWJsZSAqIGNvbnN0IHBkcmF3ID0gR2V0RFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgJiBzY3JlZW4pOworICAgX19HTFhEUklkcmF3YWJsZSAqIGNvbnN0IHBkcmF3ID0gR2V0R0xYRFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgJiBzY3JlZW4pOwogICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyhkcHksIHNjcmVlbik7CiAKLSAgIGlmICggKHBkcmF3ICE9IE5VTEwgKSAmJiAocGRyYXctPnF1ZXJ5RnJhbWVUcmFja2luZyAhPSBOVUxMKQotCSYmIF9fZ2xYRXh0ZW5zaW9uQml0SXNFbmFibGVkKCBwc2MsIE1FU0Ffc3dhcF9mcmFtZV91c2FnZV9iaXQgKSApIHsKLSAgICAgIGludDY0X3Qgc2JjLCBtaXNzZWRGcmFtZXM7Ci0gICAgICBmbG9hdCAgIGxhc3RNaXNzZWRVc2FnZTsKKyAgIGlmIChwZHJhdyAhPSBOVUxMICYmIHBzYy0+ZnJhbWVUcmFja2luZyAhPSBOVUxMKSB7CisgICAgICAgaW50NjRfdCBzYmMsIG1pc3NlZEZyYW1lczsKKyAgICAgICBmbG9hdCAgIGxhc3RNaXNzZWRVc2FnZTsKIAotICAgICAgc3RhdHVzID0gcGRyYXctPnF1ZXJ5RnJhbWVUcmFja2luZyggZHB5LCBwZHJhdy0+cHJpdmF0ZSwgJnNiYywKLQkJCQkJICAmbWlzc2VkRnJhbWVzLCAmbGFzdE1pc3NlZFVzYWdlLAotCQkJCQkgIHVzYWdlICk7CisgICAgICAgc3RhdHVzID0gcHNjLT5mcmFtZVRyYWNraW5nLT5xdWVyeUZyYW1lVHJhY2tpbmcocGRyYXctPmRyaURyYXdhYmxlLAorCQkJCQkJICAgICAgICZzYmMsCisJCQkJCQkgICAgICAgJm1pc3NlZEZyYW1lcywKKwkJCQkJCSAgICAgICAmbGFzdE1pc3NlZFVzYWdlLAorCQkJCQkJICAgICAgIHVzYWdlKTsKICAgIH0KICNlbHNlCiAgICAodm9pZCkgZHB5OwpAQCAtMTg0OCwxOCArMTkwNiwxNyBAQAogCQkJCQkgR0xmbG9hdCAqbGFzdE1pc3NlZFVzYWdlKQogewogICAgaW50ICAgc3RhdHVzID0gR0xYX0JBRF9DT05URVhUOwotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfRlJBTUVfVFJBQ0tJTkcKICAgIGludCBzY3JlZW47Ci0gICBfX0RSSWRyYXdhYmxlICogY29uc3QgcGRyYXcgPSBHZXREUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmIHNjcmVlbik7CisgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IEdldEdMWERSSURyYXdhYmxlKGRweSwgZHJhd2FibGUsICYgc2NyZWVuKTsKICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoZHB5LCBzY3JlZW4pOwogCi0gICBpZiAoIChwZHJhdyAhPSBOVUxMICkgJiYgKHBkcmF3LT5xdWVyeUZyYW1lVHJhY2tpbmcgIT0gTlVMTCkKLQkmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBNRVNBX3N3YXBfZnJhbWVfdXNhZ2VfYml0ICkgKSB7CisgICBpZiAocGRyYXcgIT0gTlVMTCAmJiBwc2MtPmZyYW1lVHJhY2tpbmcgIT0gTlVMTCkgewogICAgICAgZmxvYXQgICB1c2FnZTsKIAotICAgICAgc3RhdHVzID0gcGRyYXctPnF1ZXJ5RnJhbWVUcmFja2luZyggZHB5LCBwZHJhdy0+cHJpdmF0ZSwgc2JjLAotCQkJCQkgIG1pc3NlZEZyYW1lcywgbGFzdE1pc3NlZFVzYWdlLAotCQkJCQkgICYgdXNhZ2UgKTsKKyAgICAgIHN0YXR1cyA9IHBzYy0+ZnJhbWVUcmFja2luZy0+cXVlcnlGcmFtZVRyYWNraW5nKHBkcmF3LT5kcmlEcmF3YWJsZSwKKwkJCQkJCSAgICAgIHNiYywgbWlzc2VkRnJhbWVzLAorCQkJCQkJICAgICAgbGFzdE1pc3NlZFVzYWdlLCAmdXNhZ2UpOwogICAgfQogI2Vsc2UKICAgICh2b2lkKSBkcHk7CkBAIC0xODgxLDIxICsxOTM4LDI0IEBACiAgICAgKiBGSVhNRTogdGhlcmUgc2hvdWxkIGJlIGEgR0xYIGVuY29kaW5nIGZvciB0aGlzIGNhbGwuICBJIGNhbiBmaW5kIG5vCiAgICAgKiBGSVhNRTogZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEdMWCBlbmNvZGluZy4KICAgICAqLwotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfTUVESUFfU1RSRUFNX0NPVU5URVIKICAgIEdMWENvbnRleHQgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKIAotICAgaWYgKCAoZ2MgIT0gTlVMTCkgJiYgZ2MtPmlzRGlyZWN0ICkgeworICAgaWYgKGdjICE9IE5VTEwgJiYgZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoIGdjLT5jdXJyZW50RHB5LAogCQkJCQkJCSAgICBnYy0+c2NyZWVuICk7Ci0gICAgICBpZiAoIF9fZ2xYRXh0ZW5zaW9uQml0SXNFbmFibGVkKCBwc2MsIFNHSV92aWRlb19zeW5jX2JpdCApCi0JICAgJiYgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSAmJiBwc2MtPmRyaVNjcmVlbi5nZXRNU0MpIHsKLQkgaW50ICAgICAgIHJldDsKLQkgaW50NjRfdCAgIHRlbXA7CisgICAgICBpZiAoIHBzYy0+bXNjICYmIHBzYy0+ZHJpU2NyZWVuICkgeworICAgICAgICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gCisgICAgICAgICAgICAgIEdldEdMWERSSURyYXdhYmxlKGdjLT5jdXJyZW50RHB5LCBnYy0+Y3VycmVudERyYXdhYmxlLCBOVUxMKTsKKwkgIGludDY0X3QgdGVtcDsgCisJICBpbnQgcmV0OworIAorCSAgcmV0ID0gKCpwc2MtPm1zYy0+Z2V0RHJhd2FibGVNU0MpKHBzYy0+X19kcmlTY3JlZW4sCisJCQkJCSAgICBwZHJhdy0+ZHJpRHJhd2FibGUsICZ0ZW1wKTsKKwkgICpjb3VudCA9ICh1bnNpZ25lZCkgdGVtcDsKIAotCSByZXQgPSBwc2MtPmRyaVNjcmVlbi5nZXRNU0MoIHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUsICYgdGVtcCApOwotCSAqY291bnQgPSAodW5zaWduZWQpIHRlbXA7Ci0JIHJldHVybiAocmV0ID09IDApID8gMCA6IEdMWF9CQURfQ09OVEVYVDsKKwkgIHJldHVybiAocmV0ID09IDApID8gMCA6IEdMWF9CQURfQ09OVEVYVDsKICAgICAgIH0KICAgIH0KICNlbHNlCkBAIC0xOTA2LDMyICsxOTY2LDI2IEBACiAKIHN0YXRpYyBpbnQgX19nbFhXYWl0VmlkZW9TeW5jU0dJKGludCBkaXZpc29yLCBpbnQgcmVtYWluZGVyLCB1bnNpZ25lZCBpbnQgKmNvdW50KQogewotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfTUVESUFfU1RSRUFNX0NPVU5URVIKICAgIEdMWENvbnRleHQgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKICAgIGlmICggZGl2aXNvciA8PSAwIHx8IHJlbWFpbmRlciA8IDAgKQogICAgICByZXR1cm4gR0xYX0JBRF9WQUxVRTsKIAotICAgaWYgKCAoZ2MgIT0gTlVMTCkgJiYgZ2MtPmlzRGlyZWN0ICkgeworICAgaWYgKGdjICE9IE5VTEwgJiYgZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoIGdjLT5jdXJyZW50RHB5LAogCQkJCQkJCSAgICBnYy0+c2NyZWVuICk7Ci0gICAgICBpZiAoIF9fZ2xYRXh0ZW5zaW9uQml0SXNFbmFibGVkKCBwc2MsIFNHSV92aWRlb19zeW5jX2JpdCApCi0JICAgJiYgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSApIHsKLQkgX19EUklkcmF3YWJsZSAqIGNvbnN0IHBkcmF3ID0gCi0JICAgICAoKnBzYy0+ZHJpU2NyZWVuLmdldERyYXdhYmxlKShnYy0+Y3VycmVudERweSwKLQkJCQkJICAgZ2MtPmN1cnJlbnREcmF3YWJsZSwKLQkJCQkJICAgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSk7Ci0JIGlmICggKHBkcmF3ICE9IE5VTEwpICYmIChwZHJhdy0+d2FpdEZvck1TQyAhPSBOVUxMKSApIHsKLQkgICAgaW50ICAgICAgIHJldDsKLQkgICAgaW50NjRfdCAgIG1zYzsKLQkgICAgaW50NjRfdCAgIHNiYzsKKyAgICAgIGlmIChwc2MtPm1zYyAhPSBOVUxMICYmIHBzYy0+ZHJpU2NyZWVuICkgeworCSBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IAorCSAgICAgR2V0R0xYRFJJRHJhd2FibGUoZ2MtPmN1cnJlbnREcHksIGdjLT5jdXJyZW50RHJhd2FibGUsIE5VTEwpOworCSBpbnQgICAgICAgcmV0OworCSBpbnQ2NF90ICAgbXNjOworCSBpbnQ2NF90ICAgc2JjOwogCi0JICAgIHJldCA9ICgqcGRyYXctPndhaXRGb3JNU0MpKCBnYy0+Y3VycmVudERweSwgcGRyYXctPnByaXZhdGUsCi0JCQkJCTAsIGRpdmlzb3IsIHJlbWFpbmRlciwKLQkJCQkJJiBtc2MsICYgc2JjICk7Ci0JICAgICpjb3VudCA9ICh1bnNpZ25lZCkgbXNjOwotCSAgICByZXR1cm4gKHJldCA9PSAwKSA/IDAgOiBHTFhfQkFEX0NPTlRFWFQ7Ci0JIH0KKwkgcmV0ID0gKCpwc2MtPm1zYy0+d2FpdEZvck1TQykocGRyYXctPmRyaURyYXdhYmxlLCAwLAorCQkJCSAgICAgICBkaXZpc29yLCByZW1haW5kZXIsICZtc2MsICZzYmMpOworCSAqY291bnQgPSAodW5zaWduZWQpIG1zYzsKKwkgcmV0dXJuIChyZXQgPT0gMCkgPyAwIDogR0xYX0JBRF9DT05URVhUOwogICAgICAgfQogICAgfQogI2Vsc2UKQEAgLTIwODMsMjAgKzIxMzcsMTkgQEAKIHN0YXRpYyBCb29sIF9fZ2xYR2V0U3luY1ZhbHVlc09NTChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAogCQkJCSAgaW50NjRfdCAqdXN0LCBpbnQ2NF90ICptc2MsIGludDY0X3QgKnNiYykKIHsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworI2lmIGRlZmluZWQoX19EUklfU1dBUF9CVUZGRVJfQ09VTlRFUikgJiYgZGVmaW5lZChfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUikKICAgICBfX0dMWGRpc3BsYXlQcml2YXRlICogY29uc3QgcHJpdiA9IF9fZ2xYSW5pdGlhbGl6ZShkcHkpOwogCiAgICAgaWYgKCBwcml2ICE9IE5VTEwgKSB7CiAJaW50ICAgaTsKLQlfX0RSSWRyYXdhYmxlICogY29uc3QgcGRyYXcgPSBHZXREUklEcmF3YWJsZSggZHB5LCBkcmF3YWJsZSwgJiBpICk7CisJX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmaSk7CiAJX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gJnByaXYtPnNjcmVlbkNvbmZpZ3NbaV07CiAKIAlhc3NlcnQoIChwZHJhdyA9PSBOVUxMKSB8fCAoaSAhPSAtMSkgKTsKLQlyZXR1cm4gKCAocGRyYXcgJiYgcGRyYXctPmdldFNCQyAmJiBwc2MtPmRyaVNjcmVlbi5nZXRNU0MpCi0JCSAmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBPTUxfc3luY19jb250cm9sX2JpdCApCi0JCSAmJiAoKCpwc2MtPmRyaVNjcmVlbi5nZXRNU0MpKCBwc2MtPmRyaVNjcmVlbi5wcml2YXRlLCBtc2MgKSA9PSAwKQotCQkgJiYgKCgqcGRyYXctPmdldFNCQykoIGRweSwgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSwgc2JjICkgPT0gMCkKLQkJICYmIChfX2dsWEdldFVTVCggdXN0ICkgPT0gMCkgKTsKKwlyZXR1cm4gKCAocGRyYXcgJiYgcHNjLT5zYmMgJiYgcHNjLT5tc2MpCisJCSAmJiAoKCpwc2MtPm1zYy0+Z2V0TVNDKShwc2MtPmRyaVNjcmVlbiwgbXNjKSA9PSAwKQorCQkgJiYgKCgqcHNjLT5zYmMtPmdldFNCQykocGRyYXctPmRyaURyYXdhYmxlLCBzYmMpID09IDApCisJCSAmJiAoX19nbFhHZXRVU1QodXN0KSA9PSAwKSApOwogICAgIH0KICNlbHNlCiAgICAodm9pZCkgZHB5OwpAQCAtMjEwOCw2ICsyMTYxLDY4IEBACiAgICByZXR1cm4gRmFsc2U7CiB9CiAKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworX1hfSElEREVOIEdMYm9vbGVhbgorX19kcmlHZXRNc2NSYXRlT01MKF9fRFJJZHJhd2FibGUgKmRyYXcsCisJCSAgIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IsIHZvaWQgKnByaXZhdGUpCit7CisjaWZkZWYgWEY4NlZJRE1PREUKKyAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYzsKKyAgICBYRjg2VmlkTW9kZU1vZGVMaW5lICAgbW9kZV9saW5lOworICAgIGludCAgIGRvdF9jbG9jazsKKyAgICBpbnQgICBpOworICAgIF9fR0xYRFJJZHJhd2FibGUgKmdseERyYXcgPSBwcml2YXRlOworCisgICAgcHNjID0gZ2x4RHJhdy0+cHNjOworICAgIGlmIChYRjg2VmlkTW9kZVF1ZXJ5VmVyc2lvbihwc2MtPmRweSwgJmksICZpKSAmJgorCVhGODZWaWRNb2RlR2V0TW9kZUxpbmUocHNjLT5kcHksIHBzYy0+c2NyLCAmZG90X2Nsb2NrLCAmbW9kZV9saW5lKSApIHsKKwl1bnNpZ25lZCAgIG4gPSBkb3RfY2xvY2sgKiAxMDAwOworCXVuc2lnbmVkICAgZCA9IG1vZGVfbGluZS52dG90YWwgKiBtb2RlX2xpbmUuaHRvdGFsOworCQorIyBkZWZpbmUgVl9JTlRFUkxBQ0UgMHgwMTAKKyMgZGVmaW5lIFZfREJMU0NBTiAgIDB4MDIwCisKKwlpZiAobW9kZV9saW5lLmZsYWdzICYgVl9JTlRFUkxBQ0UpCisJICAgIG4gKj0gMjsKKwllbHNlIGlmIChtb2RlX2xpbmUuZmxhZ3MgJiBWX0RCTFNDQU4pCisJICAgIGQgKj0gMjsKKworCS8qIFRoZSBPTUxfc3luY19jb250cm9sIHNwZWMgcmVxdWlyZXMgdGhhdCBpZiB0aGUgcmVmcmVzaCByYXRlIGlzIGEKKwkgKiB3aG9sZSBudW1iZXIsIHRoYXQgdGhlIHJldHVybmVkIG51bWVyYXRvciBiZSBlcXVhbCB0byB0aGUgcmVmcmVzaAorCSAqIHJhdGUgYW5kIHRoZSBkZW5vbWluYXRvciBiZSAxLgorCSAqLworCisJaWYgKG4gJSBkID09IDApIHsKKwkgICAgbiAvPSBkOworCSAgICBkID0gMTsKKwl9CisJZWxzZSB7CisJICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBmW10gPSB7IDEzLCAxMSwgNywgNSwgMywgMiwgMCB9OworCisJICAgIC8qIFRoaXMgaXMgYSBwb29yIG1hbidzIHdheSB0byByZWR1Y2UgYSBmcmFjdGlvbi4gIEl0J3MgZmFyIGZyb20KKwkgICAgICogcGVyZmVjdCwgYnV0IGl0IHdpbGwgd29yayB3ZWxsIGVub3VnaCBmb3IgdGhpcyBzaXR1YXRpb24uCisJICAgICAqLworCisJICAgIGZvciAoaSA9IDA7IGZbaV0gIT0gMDsgaSsrKSB7CisJCXdoaWxlIChuICUgZltpXSA9PSAwICYmIGQgJSBmW2ldID09IDApIHsKKwkJICAgIGQgLz0gZltpXTsKKwkJICAgIG4gLz0gZltpXTsKKwkJfQorCSAgICB9CisJfQorCisJKm51bWVyYXRvciA9IG47CisJKmRlbm9taW5hdG9yID0gZDsKKworCXJldHVybiBUcnVlOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIEZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gRmFsc2U7CisjZW5kaWYKK30KKyNlbmRpZgogCiAvKioKICAqIERldGVybWluZSB0aGUgcmVmcmVzaCByYXRlIG9mIHRoZSBzcGVjaWZpZWQgZHJhd2FibGUgYW5kIGRpc3BsYXkuCkBAIC0yMTI1LDcwICsyMjQwLDE3IEBACiAgKiAgICAgICB3aGVuIEdMWF9PTUxfc3luY19jb250cm9sIGFwcGVhcnMgaW4gdGhlIGNsaWVudCBleHRlbnNpb24gc3RyaW5nLgogICovCiAKLUJvb2wgX19nbFhHZXRNc2NSYXRlT01MKERpc3BsYXkgKiBkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAotCQkJaW50MzJfdCAqIG51bWVyYXRvciwgaW50MzJfdCAqIGRlbm9taW5hdG9yKQorX1hfSElEREVOIEdMYm9vbGVhbiBfX2dsWEdldE1zY1JhdGVPTUwoRGlzcGxheSAqIGRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsCisJCQkJICAgICAgIGludDMyX3QgKiBudW1lcmF0b3IsCisJCQkJICAgICAgIGludDMyX3QgKiBkZW5vbWluYXRvcikKIHsKICNpZiBkZWZpbmVkKCBHTFhfRElSRUNUX1JFTkRFUklORyApICYmIGRlZmluZWQoIFhGODZWSURNT0RFICkKLSAgIF9fR0xYZGlzcGxheVByaXZhdGUgKiBjb25zdCBwcml2ID0gX19nbFhJbml0aWFsaXplKGRweSk7CisgICAgX19HTFhEUklkcmF3YWJsZSAqZHJhdyA9IEdldEdMWERSSURyYXdhYmxlKGRweSwgZHJhd2FibGUsIE5VTEwpOwogCisgICAgaWYgKGRyYXcgPT0gTlVMTCkKKwlyZXR1cm4gRmFsc2U7CiAKLSAgIGlmICggcHJpdiAhPSBOVUxMICkgewotICAgICAgWEY4NlZpZE1vZGVNb2RlTGluZSAgIG1vZGVfbGluZTsKLSAgICAgIGludCAgIGRvdF9jbG9jazsKLSAgICAgIGludCAgIHNjcmVlbl9udW07Ci0gICAgICBpbnQgICBpOwotCi0KLSAgICAgIEdldERSSURyYXdhYmxlKCBkcHksIGRyYXdhYmxlLCAmIHNjcmVlbl9udW0gKTsKLSAgICAgIGlmICggKHNjcmVlbl9udW0gIT0gLTEpCi0JICAgJiYgWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24oIGRweSwgJiBpLCAmIGkgKQotCSAgICYmIFhGODZWaWRNb2RlR2V0TW9kZUxpbmUoIGRweSwgc2NyZWVuX251bSwgJiBkb3RfY2xvY2ssCi0JCQkJICAgICAgJiBtb2RlX2xpbmUgKSApIHsKLQkgdW5zaWduZWQgICBuID0gZG90X2Nsb2NrICogMTAwMDsKLQkgdW5zaWduZWQgICBkID0gbW9kZV9saW5lLnZ0b3RhbCAqIG1vZGVfbGluZS5odG90YWw7Ci0KLSMgZGVmaW5lIFZfSU5URVJMQUNFIDB4MDEwCi0jIGRlZmluZSBWX0RCTFNDQU4gICAweDAyMAotCi0JIGlmICggKG1vZGVfbGluZS5mbGFncyAmIFZfSU5URVJMQUNFKSApIHsKLQkgICAgbiAqPSAyOwotCSB9Ci0JIGVsc2UgaWYgKCAobW9kZV9saW5lLmZsYWdzICYgVl9EQkxTQ0FOKSApIHsKLQkgICAgZCAqPSAyOwotCSB9Ci0KLQkgLyogVGhlIE9NTF9zeW5jX2NvbnRyb2wgc3BlYyByZXF1aXJlcyB0aGF0IGlmIHRoZSByZWZyZXNoIHJhdGUgaXMgYQotCSAgKiB3aG9sZSBudW1iZXIsIHRoYXQgdGhlIHJldHVybmVkIG51bWVyYXRvciBiZSBlcXVhbCB0byB0aGUgcmVmcmVzaAotCSAgKiByYXRlIGFuZCB0aGUgZGVub21pbmF0b3IgYmUgMS4KLQkgICovCi0KLQkgaWYgKCAobiAlIGQpID09IDAgKSB7Ci0JICAgIG4gLz0gZDsKLQkgICAgZCA9IDE7Ci0JIH0KLQkgZWxzZSB7Ci0JICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBmW10gPSB7IDEzLCAxMSwgNywgNSwgMywgMiwgMCB9OwotCi0KLQkgICAgLyogVGhpcyBpcyBhIHBvb3IgbWFuJ3Mgd2F5IHRvIHJlZHVjZSBhIGZyYWN0aW9uLiAgSXQncyBmYXIgZnJvbQotCSAgICAgKiBwZXJmZWN0LCBidXQgaXQgd2lsbCB3b3JrIHdlbGwgZW5vdWdoIGZvciB0aGlzIHNpdHVhdGlvbi4KLQkgICAgICovCi0KLQkgICAgZm9yICggaSA9IDAgOyBmW2ldICE9IDAgOyBpKysgKSB7Ci0JICAgICAgIHdoaWxlICggKChuICUgZltpXSkgPT0gMCkgJiYgKChkICUgZltpXSkgPT0gMCkgKSB7Ci0JCSAgZCAvPSBmW2ldOwotCQkgIG4gLz0gZltpXTsKLQkgICAgICAgfQotCSAgICB9Ci0JIH0KLQotCSAqbnVtZXJhdG9yID0gbjsKLQkgKmRlbm9taW5hdG9yID0gZDsKLQotCSAodm9pZCkgZHJhd2FibGU7Ci0JIHJldHVybiBUcnVlOwotICAgICAgfQotICAgfQorICAgIHJldHVybiBfX2RyaUdldE1zY1JhdGVPTUwoZHJhdy0+ZHJpRHJhd2FibGUsIG51bWVyYXRvciwgZGVub21pbmF0b3IsIGRyYXcpOwogI2Vsc2UKICAgICh2b2lkKSBkcHk7CiAgICAodm9pZCkgZHJhd2FibGU7CkBAIC0yMjAzLDkgKzIyNjUsOSBAQAogCQkJCSAgICAgIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLAogCQkJCSAgICAgIGludDY0X3QgcmVtYWluZGVyKQogewotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaWZkZWYgX19EUklfU1dBUF9CVUZGRVJfQ09VTlRFUgogICAgaW50IHNjcmVlbjsKLSAgIF9fRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0RFJJRHJhd2FibGUoIGRweSwgZHJhd2FibGUsICYgc2NyZWVuICk7CisgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IEdldEdMWERSSURyYXdhYmxlKGRweSwgZHJhd2FibGUsICZzY3JlZW4pOwogICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZHB5LCBzY3JlZW4gKTsKIAogICAgLyogVGhlIE9NTF9zeW5jX2NvbnRyb2wgc3BlYyBzYXlzIHRoZXNlIHNob3VsZCAiZ2VuZXJhdGUgYSBHTFhfQkFEX1ZBTFVFCkBAIC0yMjE4LDExICsyMjgwLDEwIEBACiAgICBpZiAoIGRpdmlzb3IgPiAwICYmIHJlbWFpbmRlciA+PSBkaXZpc29yICkKICAgICAgIHJldHVybiAtMTsKIAotICAgaWYgKCAocGRyYXcgIT0gTlVMTCkgJiYgKHBkcmF3LT5zd2FwQnVmZmVyc01TQyAhPSBOVUxMKQotICAgICAgICYmIF9fZ2xYRXh0ZW5zaW9uQml0SXNFbmFibGVkKCBwc2MsIE9NTF9zeW5jX2NvbnRyb2xfYml0ICkgKSB7Ci0gICAgICByZXR1cm4gKCpwZHJhdy0+c3dhcEJ1ZmZlcnNNU0MpKGRweSwgcGRyYXctPnByaXZhdGUsIHRhcmdldF9tc2MsCi0JCQkJICAgICAgZGl2aXNvciwgcmVtYWluZGVyKTsKLSAgIH0KKyAgIGlmIChwZHJhdyAhPSBOVUxMICYmIHBzYy0+Y291bnRlcnMgIT0gTlVMTCkKKyAgICAgIHJldHVybiAoKnBzYy0+c2JjLT5zd2FwQnVmZmVyc01TQykocGRyYXctPmRyaURyYXdhYmxlLCB0YXJnZXRfbXNjLAorCQkJCQkgZGl2aXNvciwgcmVtYWluZGVyKTsKKwogI2Vsc2UKICAgICh2b2lkKSBkcHk7CiAgICAodm9pZCkgZHJhd2FibGU7CkBAIC0yMjM5LDkgKzIzMDAsOSBAQAogCQkJICAgICAgIGludDY0X3QgcmVtYWluZGVyLCBpbnQ2NF90ICp1c3QsCiAJCQkgICAgICAgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpCiB7Ci0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyNpZmRlZiBfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUgogICAgaW50IHNjcmVlbjsKLSAgIF9fRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0RFJJRHJhd2FibGUoIGRweSwgZHJhd2FibGUsICYgc2NyZWVuICk7CisgICBfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IEdldEdMWERSSURyYXdhYmxlKGRweSwgZHJhd2FibGUsICZzY3JlZW4pOwogICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZHB5LCBzY3JlZW4gKTsKICAgIGludCAgcmV0OwogCkBAIC0yMjUzLDEwICsyMzE0LDkgQEAKICAgIGlmICggZGl2aXNvciA+IDAgJiYgcmVtYWluZGVyID49IGRpdmlzb3IgKQogICAgICAgcmV0dXJuIEZhbHNlOwogCi0gICBpZiAoIChwZHJhdyAhPSBOVUxMKSAmJiAocGRyYXctPndhaXRGb3JNU0MgIT0gTlVMTCkKLQkmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBPTUxfc3luY19jb250cm9sX2JpdCApICkgewotICAgICAgcmV0ID0gKCpwZHJhdy0+d2FpdEZvck1TQykoIGRweSwgcGRyYXctPnByaXZhdGUsIHRhcmdldF9tc2MsCi0JCQkJICBkaXZpc29yLCByZW1haW5kZXIsIG1zYywgc2JjICk7CisgICBpZiAocGRyYXcgIT0gTlVMTCAmJiBwc2MtPm1zYyAhPSBOVUxMKSB7CisgICAgICByZXQgPSAoKnBzYy0+bXNjLT53YWl0Rm9yTVNDKShwZHJhdy0+ZHJpRHJhd2FibGUsIHRhcmdldF9tc2MsCisJCQkJICAgIGRpdmlzb3IsIHJlbWFpbmRlciwgbXNjLCBzYmMpOwogCiAgICAgICAvKiBfX2dsWEdldFVTVCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KICAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUcnVlIG9uIHN1Y2Nlc3MgYW5kIEZhbHNlIG9uIGZhaWx1cmUuCkBAIC0yMjgxLDkgKzIzNDEsOSBAQAogCQkJICAgICAgIGludDY0X3QgdGFyZ2V0X3NiYywgaW50NjRfdCAqdXN0LAogCQkJICAgICAgIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjICkKIHsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworI2lmZGVmIF9fRFJJX1NXQVBfQlVGRkVSX0NPVU5URVIKICAgIGludCBzY3JlZW47Ci0gICBfX0RSSWRyYXdhYmxlICpwZHJhdyA9IEdldERSSURyYXdhYmxlKCBkcHksIGRyYXdhYmxlLCAmIHNjcmVlbiApOworICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmc2NyZWVuKTsKICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqIGNvbnN0IHBzYyA9IEdldEdMWFNjcmVlbkNvbmZpZ3MoIGRweSwgc2NyZWVuICk7CiAgICBpbnQgIHJldDsKIApAQCAtMjI5Myw5ICsyMzUzLDggQEAKICAgIGlmICggdGFyZ2V0X3NiYyA8IDAgKQogICAgICAgcmV0dXJuIEZhbHNlOwogCi0gICBpZiAoIChwZHJhdyAhPSBOVUxMKSAmJiAocGRyYXctPndhaXRGb3JTQkMgIT0gTlVMTCkKLQkmJiBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBPTUxfc3luY19jb250cm9sX2JpdCApKSB7Ci0gICAgICByZXQgPSAoKnBkcmF3LT53YWl0Rm9yU0JDKSggZHB5LCBwZHJhdy0+cHJpdmF0ZSwgdGFyZ2V0X3NiYywgbXNjLCBzYmMgKTsKKyAgIGlmIChwZHJhdyAhPSBOVUxMICYmIHBzYy0+c2JjICE9IE5VTEwpIHsKKyAgICAgIHJldCA9ICgqcHNjLT5zYmMtPndhaXRGb3JTQkMpKHBkcmF3LT5kcmlEcmF3YWJsZSwgdGFyZ2V0X3NiYywgbXNjLCBzYmMpOwogCiAgICAgICAvKiBfX2dsWEdldFVTVCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KICAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUcnVlIG9uIHN1Y2Nlc3MgYW5kIEZhbHNlIG9uIGZhaWx1cmUuCkBAIC0yMzIzLDE2ICsyMzgyLDEzIEBACiAJCQkJICAgc2l6ZV90IHNpemUsIGZsb2F0IHJlYWRGcmVxLAogCQkJCSAgIGZsb2F0IHdyaXRlRnJlcSwgZmxvYXQgcHJpb3JpdHkpCiB7Ci0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyNpZmRlZiBfX0RSSV9BTExPQ0FURQogICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZHB5LCBzY3JuICk7CiAKLSAgIGlmICggX19nbFhFeHRlbnNpb25CaXRJc0VuYWJsZWQoIHBzYywgTUVTQV9hbGxvY2F0ZV9tZW1vcnlfYml0ICkgKSB7Ci0gICAgICBpZiAocHNjICYmIHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUgJiYgcHNjLT5kcmlTY3JlZW4uYWxsb2NhdGVNZW1vcnkpIHsKLQkgcmV0dXJuICgqcHNjLT5kcmlTY3JlZW4uYWxsb2NhdGVNZW1vcnkpKCBkcHksIHNjcm4sIHNpemUsCi0JCQkJCQkgIHJlYWRGcmVxLCB3cml0ZUZyZXEsCi0JCQkJCQkgIHByaW9yaXR5ICk7Ci0gICAgICB9Ci0gICB9CisgICBpZiAocHNjICYmIHBzYy0+YWxsb2NhdGUpCisgICAgICAgcmV0dXJuICgqcHNjLT5hbGxvY2F0ZS0+YWxsb2NhdGVNZW1vcnkpKHBzYy0+X19kcmlTY3JlZW4sIHNpemUsCisJCQkJCSAgICAgICByZWFkRnJlcSwgd3JpdGVGcmVxLCBwcmlvcml0eSk7CisKICNlbHNlCiAgICAodm9pZCkgZHB5OwogICAgKHZvaWQpIHNjcm47CkBAIC0yMzQ4LDE0ICsyNDA0LDEyIEBACiAKIFBVQkxJQyB2b2lkIGdsWEZyZWVNZW1vcnlNRVNBKERpc3BsYXkgKmRweSwgaW50IHNjcm4sIHZvaWQgKnBvaW50ZXIpCiB7Ci0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyNpZmRlZiBfX0RSSV9BTExPQ0FURQogICAgX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZHB5LCBzY3JuICk7CiAKLSAgIGlmICggX19nbFhFeHRlbnNpb25CaXRJc0VuYWJsZWQoIHBzYywgTUVTQV9hbGxvY2F0ZV9tZW1vcnlfYml0ICkgKSB7Ci0gICAgICBpZiAocHNjICYmIHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUgJiYgcHNjLT5kcmlTY3JlZW4uZnJlZU1lbW9yeSkgewotCSAoKnBzYy0+ZHJpU2NyZWVuLmZyZWVNZW1vcnkpKCBkcHksIHNjcm4sIHBvaW50ZXIgKTsKLSAgICAgIH0KLSAgIH0KKyAgIGlmIChwc2MgJiYgcHNjLT5hbGxvY2F0ZSkKKwkgKCpwc2MtPmFsbG9jYXRlLT5mcmVlTWVtb3J5KShwc2MtPl9fZHJpU2NyZWVuLCBwb2ludGVyKTsKKwogI2Vsc2UKICAgICh2b2lkKSBkcHk7CiAgICAodm9pZCkgc2NybjsKQEAgLTIzNjcsMTQgKzI0MjEsMTIgQEAKIFBVQkxJQyBHTHVpbnQgZ2xYR2V0TWVtb3J5T2Zmc2V0TUVTQSggRGlzcGxheSAqZHB5LCBpbnQgc2NybiwKIAkJCQkgICAgICBjb25zdCB2b2lkICpwb2ludGVyICkKIHsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworI2lmZGVmIF9fRFJJX0FMTE9DQVRFCiAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKiBjb25zdCBwc2MgPSBHZXRHTFhTY3JlZW5Db25maWdzKCBkcHksIHNjcm4gKTsKIAotICAgaWYgKCBfX2dsWEV4dGVuc2lvbkJpdElzRW5hYmxlZCggcHNjLCBNRVNBX2FsbG9jYXRlX21lbW9yeV9iaXQgKSApIHsKLSAgICAgIGlmIChwc2MgJiYgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSAmJiBwc2MtPmRyaVNjcmVlbi5tZW1vcnlPZmZzZXQpIHsKLQkgcmV0dXJuICgqcHNjLT5kcmlTY3JlZW4ubWVtb3J5T2Zmc2V0KSggZHB5LCBzY3JuLCBwb2ludGVyICk7Ci0gICAgICB9Ci0gICB9CisgICBpZiAocHNjICYmIHBzYy0+YWxsb2NhdGUpCisgICAgICAgcmV0dXJuICgqcHNjLT5hbGxvY2F0ZS0+bWVtb3J5T2Zmc2V0KShwc2MtPl9fZHJpU2NyZWVuLCBwb2ludGVyKTsKKwogI2Vsc2UKICAgICh2b2lkKSBkcHk7CiAgICAodm9pZCkgc2NybjsKQEAgLTI0NDcsMTMgKzI0OTksMTQgQEAKICAgICBJTlQzMiAqeF9wdHIsICp5X3B0ciwgKndfcHRyLCAqaF9wdHI7CiAgICAgQ0FSRDggb3Bjb2RlOwogCi0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyNpZmRlZiBfX0RSSV9DT1BZX1NVQl9CVUZGRVIKICAgICBpbnQgc2NyZWVuOwotICAgIF9fRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0RFJJRHJhd2FibGUoIGRweSwgZHJhd2FibGUsICYgc2NyZWVuICk7CisgICAgX19HTFhEUklkcmF3YWJsZSAqcGRyYXcgPSBHZXRHTFhEUklEcmF3YWJsZShkcHksIGRyYXdhYmxlLCAmc2NyZWVuKTsKICAgICBpZiAoIHBkcmF3ICE9IE5VTEwgKSB7CiAJX19HTFhzY3JlZW5Db25maWdzICogY29uc3QgcHNjID0gR2V0R0xYU2NyZWVuQ29uZmlncyggZHB5LCBzY3JlZW4gKTsKLQlpZiAoIF9fZ2xYRXh0ZW5zaW9uQml0SXNFbmFibGVkKCBwc2MsIE1FU0FfY29weV9zdWJfYnVmZmVyX2JpdCApICkgewotCSAgICAoKnBkcmF3LT5jb3B5U3ViQnVmZmVyKShkcHksIHBkcmF3LT5wcml2YXRlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAocHNjLT5jb3B5U3ViQnVmZmVyICE9IE5VTEwpIHsKKwkgICAgKCpwc2MtPmNvcHlTdWJCdWZmZXItPmNvcHlTdWJCdWZmZXIpKHBkcmF3LT5kcmlEcmF3YWJsZSwKKwkJCQkJCSB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKIAl9CiAKIAlyZXR1cm47CkBAIC0yNTI5LDggKzI1ODIsMTYgQEAKICAgICB9CiAgCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KQorICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgeworCV9fR0xYRFJJZHJhd2FibGUgKnBkcmF3ID0gR2V0R0xYRFJJRHJhd2FibGUoZHB5LCBkcmF3YWJsZSwgTlVMTCk7CisKKwlpZiAocGRyYXcgIT0gTlVMTCkKKwkgICAgKCpwZHJhdy0+cHNjLT50ZXhCdWZmZXItPnNldFRleEJ1ZmZlcikoZ2MtPl9fZHJpQ29udGV4dCwKKwkJCQkJCSAgIHBkcmF3LT50ZXh0dXJlVGFyZ2V0LAorCQkJCQkJICAgcGRyYXctPmRyaURyYXdhYmxlKTsKKwogCXJldHVybjsKKyAgICB9CiAjZW5kaWYKIAogICAgIG9wY29kZSA9IF9fZ2xYU2V0dXBGb3JDb21tYW5kKGRweSk7CkBAIC0yNTgxLDcgKzI2NDIsNyBAQAogCXJldHVybjsKIAogI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpCiAJcmV0dXJuOwogI2VuZGlmCiAKQEAgLTI2MTMsNyArMjY3NCw3IEBACiAgKiAKICAqIFxzYSBzdHJkdXAKICAqLwotY2hhciAqCitfWF9ISURERU4gY2hhciAqCiBfX2dsWHN0cmR1cChjb25zdCBjaGFyICpzdHIpCiB7CiAgICBjaGFyICpjb3B5OwpAQCAtMjg0MSw5OCArMjkwMiw2IEBACiAKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwogLyoqCi0gKiBSZXRyaWV2ZXMgdGhlIHZlcmlvbiBvZiB0aGUgaW50ZXJuYWwgbGliR0wgQVBJIGluIFlZWVlNTUREIGZvcm1hdC4gIFRoaXMKLSAqIG1pZ2h0IGJlIHVzZWQgYnkgdGhlIERSSSBkcml2ZXJzIHRvIGRldGVybWluZSBob3cgbmV3IGxpYkdMIGlzIGF0IHJ1bnRpbWUuCi0gKiBEcml2ZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgaW5zdGVhZCB1c2UKLSAqIFxjIGdsWEdldFByb2NBZGRyZXNzIHRvIG9idGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLgotICogCi0gKiBccmV0dXJucyBBbiA4LWRpZ2l0IGRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgaW50ZXJuYWwgbGliR0wgQVBJIGluCi0gKiAgICAgICAgICBZWVlZTU1ERCBmb3JtYXQuCi0gKiAKLSAqIFxzYSBnbFhHZXRQcm9jQWRkcmVzcywgUEZOR0xYR0VUSU5URVJOQUxWRVJTSU9OUFJPQwotICoKLSAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDAyMTEyMS4KLSAqLwotaW50IF9fZ2xYR2V0SW50ZXJuYWxWZXJzaW9uKHZvaWQpCi17Ci0gICAgLyogSGlzdG9yeToKLSAgICAgKiAyMDAyMTEyMSAtIEluaXRpYWwgdmVyc2lvbgotICAgICAqIDIwMDIxMTI4IC0gQWRkZWQgX19nbFhXaW5kb3dFeGlzdHMoKSBmdW5jdGlvbgotICAgICAqIDIwMDIxMjA3IC0gQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBHTFggZXh0ZW5zaW9ucywKLSAgICAgKiAgICAgICAgICAgIEdMWF9TR0lfc3dhcF9jb250cm9sLCBHTFhfU0dJX3ZpZGVvX3N5bmMsCi0gICAgICogICAgICAgICAgICBHTFhfT01MX3N5bmNfY29udHJvbCwgYW5kIEdMWF9NRVNBX3N3YXBfY29udHJvbC4KLSAgICAgKiAgICAgICAgICAgIE5ldmVyIG9mZmljaWFsbHkgcmVsZWFzZWQuICBEbyBOT1QgdGVzdCBhZ2FpbnN0Ci0gICAgICogICAgICAgICAgICB0aGlzIHZlcnNpb24uICBVc2UgMjAwMzAzMTcgaW5zdGVhZC4KLSAgICAgKiAyMDAzMDMxNyAtIEFkZGVkIHN1cHBvcnQgR0xYX1NHSVhfZmJjb25maWcsCi0gICAgICogICAgICAgICAgICBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlLCBHTFhfT01MX3N3YXBfbWV0aG9kLAotICAgICAqICAgICAgICAgICAgR0xYX3tBUkIsU0dJU31fbXVsdGlzYW1wbGUsIGFuZAotICAgICAqICAgICAgICAgICAgR0xYX1NHSVhfdmlzdWFsX3NlbGVjdF9ncm91cC4KLSAgICAgKiAyMDAzMDYwNiAtIEFkZGVkIHN1cHBvcnQgZm9yIEdMWF9TR0lfbWFrZV9jdXJyZW50X3JlYWQuCi0gICAgICogMjAwMzA4MTMgLSBNYWRlIHN1cHBvcnQgZm9yIGR5bmFtaWMgZXh0ZW5zaW9ucyBtdWx0aS1oZWFkIGF3YXJlLgotICAgICAqIDIwMDMwODE4IC0gQWRkZWQgc3VwcG9ydCBmb3IgR0xYX01FU0FfYWxsb2NhdGVfbWVtb3J5IGluIHBsYWNlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgZGVwcmVjYXRlZCBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlICYgR0xYX01FU0FfYWdwX29mZnNldAotICAgICAqICAgICAgICAgICAgaW50ZXJmYWNlcy4KLSAgICAgKiAyMDAzMTIwMSAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBmaXJzdCByb3VuZCBvZiBEUkkgaW50ZXJmYWNlIGNoYW5nZXMuCi0gICAgICogICAgICAgICAgICBEbyBOT1QgdGVzdCBhZ2FpbnN0IHRoaXMgdmVyc2lvbiEgIEl0IGhhcyBiaW5hcnkKLSAgICAgKiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgYnVncywgdXNlIDIwMDQwMzE3IGluc3RlYWQuCi0gICAgICogMjAwNDAzMTcgLSBBZGRlZCB0aGUgJ21vZGUnIGZpZWxkIHRvIF9fRFJJY29udGV4dFJlYy4KLSAgICAgKiAyMDA0MDQxNSAtIEFkZGVkIHN1cHBvcnQgZm9yIGJpbmRDb250ZXh0MyBhbmQgdW5iaW5kQ29udGV4dDMuCi0gICAgICogMjAwNDA2MDIgLSBBZGQgX19nbFhHZXREcmF3YWJsZUluZm8uICBJIHRob3VnaCB0aGF0IHdhcyB0aGVyZQotICAgICAqICAgICAgICAgICAgbW9udGhzIGFnby4gOigKLSAgICAgKiAyMDA1MDcyNyAtIEd1dCBhbGwgdGhlIG9sZCBpbnRlcmZhY2VzLiAgVGhpcyBicmVha3MgY29tcGF0YWJpbGl0eSB3aXRoCi0gICAgICogICAgICAgICAgICBhbnkgRFJJIGRyaXZlciBidWlsdCB0byBhbnkgcHJldmlvdXMgdmVyc2lvbi4KLSAgICAgKiAyMDA2MDMxNCAtIEFkZGVkIHN1cHBvcnQgZm9yIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlci4KLSAgICAgKiAyMDA3MDEwNSAtIEFkZGVkIHN1cHBvcnQgZm9yIGRhbWFnZSByZXBvcnRpbmcuCi0gICAgICovCi0gICAgcmV0dXJuIDIwMDcwMTA1OwotfQotCi0KLQotc3RhdGljIEJvb2wgd2luZG93RXhpc3RzRmxhZzsKLQotc3RhdGljIGludCB3aW5kb3dFeGlzdHNFcnJvckhhbmRsZXIoRGlzcGxheSAqZHB5LCBYRXJyb3JFdmVudCAqeGVycikKLXsKLSAgICBpZiAoeGVyci0+ZXJyb3JfY29kZSA9PSBCYWRXaW5kb3cpIHsKLSAgICAgICAgd2luZG93RXhpc3RzRmxhZyA9IEdMX0ZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBEZXRlcm1pbmUgaWYgYSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIGEgXGMgR0xYRHJhd2FibGUgZXhpc3RzIG9uIHRoZQotICogWC1zZXJ2ZXIuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGludGVybmFsbHkgYnkgbGliR0wuICBJdCBpcyBwcm92aWRlZAotICogYXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBEUkkgZHJpdmVycy4KLSAqIERyaXZlcnMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuICBUaGV5IHNob3VsZCBpbnN0ZWFkIHVzZQotICogXGMgZ2xYR2V0UHJvY0FkZHJlc3MgdG8gb2J0YWluIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uCi0gKgotICogXHBhcmFtIGRweSAgRGlzcGxheSBhc3NvY2lhdGVkIHdpdGggdGhlIGRyYXdhYmxlIHRvIGJlIHF1ZXJpZWQuCi0gKiBccGFyYW0gZHJhdyBcYyBHTFhEcmF3YWJsZSB0byB0ZXN0LgotICogCi0gKiBccmV0dXJucyBcYyBHTF9UUlVFIGlmIGEgd2luZG93IGV4aXN0cyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBcYyBkcmF3LAotICogICAgICAgICAgb3RoZXJ3aXNlIFxjIEdMX0ZBTFNFIGlzIHJldHVybmVkLgotICogCi0gKiBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgdGhyZWFkLXNhZmUuCi0gKgotICogXHNhIGdsWEdldFByb2NBZGRyZXNzCi0gKgotICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDIxMTI4LgotICovCi1Cb29sIF9fZ2xYV2luZG93RXhpc3RzKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdykKLXsKLSAgICBYV2luZG93QXR0cmlidXRlcyB4d2E7Ci0gICAgaW50ICgqb2xkWEVycm9ySGFuZGxlcikoRGlzcGxheSAqLCBYRXJyb3JFdmVudCAqKTsKLQotICAgIFhTeW5jKGRweSwgR0xfRkFMU0UpOwotICAgIHdpbmRvd0V4aXN0c0ZsYWcgPSBHTF9UUlVFOwotICAgIG9sZFhFcnJvckhhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHdpbmRvd0V4aXN0c0Vycm9ySGFuZGxlcik7Ci0gICAgWEdldFdpbmRvd0F0dHJpYnV0ZXMoZHB5LCBkcmF3LCAmeHdhKTsgLyogZHVtbXkgcmVxdWVzdCAqLwotICAgIFhTZXRFcnJvckhhbmRsZXIob2xkWEVycm9ySGFuZGxlcik7Ci0gICAgcmV0dXJuIHdpbmRvd0V4aXN0c0ZsYWc7Ci19Ci0KLQotLyoqCiAgKiBHZXQgdGhlIHVuYWRqdXN0ZWQgc3lzdGVtIHRpbWUgKFVTVCkuICBDdXJyZW50bHksIHRoZSBVU1QgaXMgbWVhc3VyZWQgaW4KICAqIG1pY3Jvc2Vjb25kcyBzaW5jZSBFcG9jLiAgVGhlIGFjdHVhbCByZXNvbHV0aW9uIG9mIHRoZSBVU1QgbWF5IHZhcnkgZnJvbQogICogc3lzdGVtIHRvIHN5c3RlbSwgYW5kIHRoZSB1bml0cyBtYXkgdmFyeSBmcm9tIHJlbGVhc2UgdG8gcmVsZWFzZS4KQEAgLTI5NDYsNyArMjkxNSw3IEBACiAgKgogICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgogICovCi1pbnQgX19nbFhHZXRVU1QoIGludDY0X3QgKiB1c3QgKQorX1hfSElEREVOIGludCBfX2dsWEdldFVTVCggaW50NjRfdCAqIHVzdCApCiB7CiAgICAgc3RydWN0IHRpbWV2YWwgIHR2OwogICAgIApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2x4Y3VycmVudC5jIGIvc3JjL2dseC94MTEvZ2x4Y3VycmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x4L3gxMS9nbHhjdXJyZW50LmMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKiAKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKiogCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKiAKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqIAorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKioKKyovCisKKy8qKgorICogXGZpbGUgZ2x4Y3VycmVudC5jCisgKiBDbGllbnQtc2lkZSBHTFggaW50ZXJmYWNlIGZvciBjdXJyZW50IGNvbnRleHQgbWFuYWdlbWVudC4KKyAqLworCisjaW5jbHVkZSAiZ2x4Y2xpZW50LmgiCisjaW5jbHVkZSAiZ2xhcGkuaCIKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgImluZGlyZWN0X2luaXQuaCIKKworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisjaW5jbHVkZSAieGY4NmRyaS5oIgorI2VuZGlmCisKKy8qCisqKiBXZSBzZXR1cCBzb21lIGR1bW15IHN0cnVjdHVyZXMgaGVyZSBzbyB0aGF0IHRoZSBBUEkgY2FuIGJlIHVzZWQKKyoqIGV2ZW4gaWYgbm8gY29udGV4dCBpcyBjdXJyZW50LgorKi8KKworc3RhdGljIEdMdWJ5dGUgZHVtbXlCdWZmZXJbX19HTFhfQlVGRkVSX0xJTUlUX1NJWkVdOworCisvKgorKiogRHVtbXkgY29udGV4dCB1c2VkIGJ5IHNtYWxsIGNvbW1hbmRzIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudCBjb250ZXh0LgorKiogQWxsIHRoZQorKiogZ2wgYW5kIGdseCBlbnRyeSBwb2ludHMgYXJlIGRlc2lnbmVkIHRvIG9wZXJhdGUgYXMgbm9wJ3Mgd2hlbiB1c2luZworKiogdGhlIGR1bW15IGNvbnRleHQgc3RydWN0dXJlLgorKi8KK3N0YXRpYyBfX0dMWGNvbnRleHQgZHVtbXlDb250ZXh0ID0geworICAgICZkdW1teUJ1ZmZlclswXSwKKyAgICAmZHVtbXlCdWZmZXJbMF0sCisgICAgJmR1bW15QnVmZmVyWzBdLAorICAgICZkdW1teUJ1ZmZlcltfX0dMWF9CVUZGRVJfTElNSVRfU0laRV0sCisgICAgc2l6ZW9mKGR1bW15QnVmZmVyKSwKK307CisKKworLyoKKyoqIEFsbCBpbmRpcmVjdCByZW5kZXJpbmcgY29udGV4dHMgd2lsbCBzaGFyZSB0aGUgc2FtZSBpbmRpcmVjdCBkaXNwYXRjaCB0YWJsZS4KKyovCitzdGF0aWMgX19HTGFwaSAqSW5kaXJlY3RBUEkgPSBOVUxMOworCisKKy8qCisgKiBDdXJyZW50IGNvbnRleHQgbWFuYWdlbWVudCBhbmQgbG9ja2luZworICovCisKKyNpZiBkZWZpbmVkKCBVU0VfWFRIUkVBRFMgKQorCisvKiB0aHJlYWQgc2FmZSAqLworc3RhdGljIEdMYm9vbGVhbiBUU0Rpbml0aWFsaXplZCA9IEdMX0ZBTFNFOworc3RhdGljIHh0aHJlYWRfa2V5X3QgQ29udGV4dFRTRDsKKworX1hfSElEREVOIF9fR0xYY29udGV4dCAqX19nbFhHZXRDdXJyZW50Q29udGV4dCh2b2lkKQoreworICAgaWYgKCFUU0Rpbml0aWFsaXplZCkgeworICAgICAgeHRocmVhZF9rZXlfY3JlYXRlKCZDb250ZXh0VFNELCBOVUxMKTsKKyAgICAgIFRTRGluaXRpYWxpemVkID0gR0xfVFJVRTsKKyAgICAgIHJldHVybiAmZHVtbXlDb250ZXh0OworICAgfQorICAgZWxzZSB7CisgICAgICB2b2lkICpwOworICAgICAgeHRocmVhZF9nZXRfc3BlY2lmaWMoQ29udGV4dFRTRCwgJnApOworICAgICAgaWYgKCFwKQorICAgICAgICAgcmV0dXJuICZkdW1teUNvbnRleHQ7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gKF9fR0xYY29udGV4dCAqKSBwOworICAgfQorfQorCitfWF9ISURERU4gdm9pZCBfX2dsWFNldEN1cnJlbnRDb250ZXh0KF9fR0xYY29udGV4dCAqYykKK3sKKyAgIGlmICghVFNEaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHh0aHJlYWRfa2V5X2NyZWF0ZSgmQ29udGV4dFRTRCwgTlVMTCk7CisgICAgICBUU0Rpbml0aWFsaXplZCA9IEdMX1RSVUU7CisgICB9CisgICB4dGhyZWFkX3NldF9zcGVjaWZpYyhDb250ZXh0VFNELCBjKTsKK30KKworCisvKiBVc2VkIGJ5IHRoZSBfX2dsWExvY2soKSBhbmQgX19nbFhVbmxvY2soKSBtYWNyb3MgKi8KK19YX0hJRERFTiB4bXV0ZXhfcmVjIF9fZ2xYbXV0ZXg7CisKKyNlbGlmIGRlZmluZWQoIFBUSFJFQURTICkKKworX1hfSElEREVOIHB0aHJlYWRfbXV0ZXhfdCBfX2dsWG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworIyBpZiBkZWZpbmVkKCBHTFhfVVNFX1RMUyApCisKKy8qKgorICogUGVyLXRocmVhZCBHTFggY29udGV4dCBwb2ludGVyLgorICogCisgKiBcYyBfX2dsWFNldEN1cnJlbnRDb250ZXh0IGlzIHdyaXR0ZW4gaXMgc3VjaCBhIHdheSB0aGF0IHRoaXMgcG9pbnRlciBjYW4KKyAqIFxiIG5ldmVyIGJlIFxjIE5VTEwuICBUaGlzIGlzIGltcG9ydGFudCEgIEJlY2F1c2Ugb2YgdGhpcworICogXGMgX19nbFhHZXRDdXJyZW50Q29udGV4dCBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgdHJpdmlhbCBtYWNyby4KKyAqLworX190aHJlYWQgdm9pZCAqIF9fZ2xYX3Rsc19Db250ZXh0IF9fYXR0cmlidXRlX18oKHRsc19tb2RlbCgiaW5pdGlhbC1leGVjIikpKQorICAgID0gJmR1bW15Q29udGV4dDsKKworX1hfSElEREVOIHZvaWQgX19nbFhTZXRDdXJyZW50Q29udGV4dCggX19HTFhjb250ZXh0ICogYyApCit7CisgICAgX19nbFhfdGxzX0NvbnRleHQgPSAoYyAhPSBOVUxMKSA/IGMgOiAmZHVtbXlDb250ZXh0OworfQorCisjIGVsc2UKKworc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworCisvKioKKyAqIFBlci10aHJlYWQgZGF0YSBrZXkuCisgKiAKKyAqIE9uY2UgXGMgaW5pdF90aHJlYWRfZGF0YSBoYXMgYmVlbiBjYWxsZWQsIHRoZSBwZXItdGhyZWFkIGRhdGEga2V5IHdpbGwKKyAqIHRha2UgYSB2YWx1ZSBvZiBcYyBOVUxMLiAgQXMgZWFjaCBuZXcgdGhyZWFkIGlzIGNyZWF0ZWQgdGhlIGRlZmF1bHQKKyAqIHZhbHVlLCBpbiB0aGF0IHRocmVhZCwgd2lsbCBiZSBcYyBOVUxMLgorICovCitzdGF0aWMgcHRocmVhZF9rZXlfdCBDb250ZXh0VFNEOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHBlci10aHJlYWQgZGF0YSBrZXkuCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIFxiIGV4YWN0bHkgb25jZSBwZXItcHJvY2VzcyAobm90IHBlci10aHJlYWQhKSB0bworICogaW5pdGlhbGl6ZSB0aGUgcGVyLXRocmVhZCBkYXRhIGtleS4gIFRoaXMgaXMgaWRlYWxseSBkb25lIHVzaW5nIHRoZQorICogXGMgcHRocmVhZF9vbmNlIG1lY2hhbmlzbS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF90aHJlYWRfZGF0YSggdm9pZCApCit7CisgICAgaWYgKCBwdGhyZWFkX2tleV9jcmVhdGUoICYgQ29udGV4dFRTRCwgTlVMTCApICE9IDAgKSB7CisJcGVycm9yKCAicHRocmVhZF9rZXlfY3JlYXRlIiApOworCWV4aXQoIC0xICk7CisgICAgfQorfQorCitfWF9ISURERU4gdm9pZCBfX2dsWFNldEN1cnJlbnRDb250ZXh0KCBfX0dMWGNvbnRleHQgKiBjICkKK3sKKyAgICBwdGhyZWFkX29uY2UoICYgb25jZV9jb250cm9sLCBpbml0X3RocmVhZF9kYXRhICk7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyggQ29udGV4dFRTRCwgYyApOworfQorCitfWF9ISURERU4gX19HTFhjb250ZXh0ICogX19nbFhHZXRDdXJyZW50Q29udGV4dCggdm9pZCApCit7CisgICAgdm9pZCAqIHY7CisKKyAgICBwdGhyZWFkX29uY2UoICYgb25jZV9jb250cm9sLCBpbml0X3RocmVhZF9kYXRhICk7CisKKyAgICB2ID0gcHRocmVhZF9nZXRzcGVjaWZpYyggQ29udGV4dFRTRCApOworICAgIHJldHVybiAodiA9PSBOVUxMKSA/ICYgZHVtbXlDb250ZXh0IDogKF9fR0xYY29udGV4dCAqKSB2OworfQorCisjIGVuZGlmIC8qIGRlZmluZWQoIEdMWF9VU0VfVExTICkgKi8KKworI2VsaWYgZGVmaW5lZCggVEhSRUFEUyApCisKKyNlcnJvciBVbmtub3duIHRocmVhZGluZyBtZXRob2Qgc3BlY2lmaWVkLgorCisjZWxzZQorCisvKiBub3QgdGhyZWFkIHNhZmUgKi8KK19YX0hJRERFTiBfX0dMWGNvbnRleHQgKl9fZ2xYY3VycmVudENvbnRleHQgPSAmZHVtbXlDb250ZXh0OworCisjZW5kaWYKKworCitfWF9ISURERU4gdm9pZCBfX2dsWFNldEN1cnJlbnRDb250ZXh0TnVsbCh2b2lkKQoreworICAgIF9fZ2xYU2V0Q3VycmVudENvbnRleHQoJmR1bW15Q29udGV4dCk7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBfZ2xhcGlfc2V0X2Rpc3BhdGNoKE5VTEwpOyAgLyogbm8tb3AgZnVuY3Rpb25zICovCisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgR0xYQ29udGV4dCBnbFhHZXRDdXJyZW50Q29udGV4dCh2b2lkKQoreworICAgIEdMWENvbnRleHQgY3ggPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgCisgICAgaWYgKGN4ID09ICZkdW1teUNvbnRleHQpIHsKKwlyZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworCXJldHVybiBjeDsKKyAgICB9Cit9CisKK1BVQkxJQyBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50RHJhd2FibGUodm9pZCkKK3sKKyAgICBHTFhDb250ZXh0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOworICAgIHJldHVybiBnYy0+Y3VycmVudERyYXdhYmxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU2VuZHMgYSBHTFggcHJvdG9jb2wgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGRpc3BsYXkgdG8gbWFrZSB0aGUgY29udGV4dAorICogYW5kIHRoZSBkcmF3YWJsZXMgY3VycmVudC4KKyAqCisgKiBccGFyYW0gZHB5ICAgICBEaXNwbGF5IHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8uCisgKiBccGFyYW0gb3Bjb2RlICBNYWpvciBvcGNvZGUgdmFsdWUgZm9yIHRoZSBkaXNwbGF5LgorICogXHBhcmFtIGdjX2lkICAgQ29udGV4dCB0YWcgZm9yIHRoZSBjb250ZXh0IHRvIGJlIG1hZGUgY3VycmVudC4KKyAqIFxwYXJhbSBkcmF3ICAgIERyYXdhYmxlIElEIGZvciB0aGUgImRyYXciIGRyYXdhYmxlLgorICogXHBhcmFtIHJlYWQgICAgRHJhd2FibGUgSUQgZm9yIHRoZSAicmVhZCIgZHJhd2FibGUuCisgKiBccGFyYW0gcmVwbHkgICBTcGFjZSB0byBzdG9yZSB0aGUgWC1zZXJ2ZXIncyByZXBseS4KKyAqCisgKiBcd2FybmluZworICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXGMgZHB5IGlzIGxvY2tlZCB3aXRoIFxjIExvY2tEaXNwbGF5IG9uIGVudHJ5LgorICovCitzdGF0aWMgQm9vbCBTZW5kTWFrZUN1cnJlbnRSZXF1ZXN0KERpc3BsYXkgKmRweSwgQ0FSRDggb3Bjb2RlLAorCQkJCSAgIEdMWENvbnRleHRJRCBnY19pZCwgR0xYQ29udGV4dFRhZyBnY190YWcsCisJCQkJICAgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwKKwkJCQkgICB4R0xYTWFrZUN1cnJlbnRSZXBseSAqcmVwbHkpCit7CisgICAgQm9vbCByZXQ7CisKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisKKyAgICBpZiAoZHJhdyA9PSByZWFkKSB7CisJeEdMWE1ha2VDdXJyZW50UmVxICpyZXE7CisKKwlHZXRSZXEoR0xYTWFrZUN1cnJlbnQscmVxKTsKKwlyZXEtPnJlcVR5cGUgPSBvcGNvZGU7CisJcmVxLT5nbHhDb2RlID0gWF9HTFhNYWtlQ3VycmVudDsKKwlyZXEtPmRyYXdhYmxlID0gZHJhdzsKKwlyZXEtPmNvbnRleHQgPSBnY19pZDsKKwlyZXEtPm9sZENvbnRleHRUYWcgPSBnY190YWc7CisgICAgfQorICAgIGVsc2UgeworCV9fR0xYZGlzcGxheVByaXZhdGUgKnByaXYgPSBfX2dsWEluaXRpYWxpemUoZHB5KTsKKworCS8qIElmIHRoZSBzZXJ2ZXIgY2FuIHN1cHBvcnQgdGhlIEdMWCAxLjMgdmVyc2lvbiwgd2Ugc2hvdWxkCisJICogcGVyZmVyIHRoYXQuICBOb3Qgb25seSB0aGF0LCBzb21lIHNlcnZlcnMgc3VwcG9ydCBHTFggMS4zIGJ1dAorCSAqIG5vdCB0aGUgU0dJIGV4dGVuc2lvbi4KKwkgKi8KKworCWlmICgocHJpdi0+bWFqb3JWZXJzaW9uID4gMSkgfHwgKHByaXYtPm1pbm9yVmVyc2lvbiA+PSAzKSkgeworCSAgICB4R0xYTWFrZUNvbnRleHRDdXJyZW50UmVxICpyZXE7CisKKwkgICAgR2V0UmVxKEdMWE1ha2VDb250ZXh0Q3VycmVudCxyZXEpOworCSAgICByZXEtPnJlcVR5cGUgPSBvcGNvZGU7CisJICAgIHJlcS0+Z2x4Q29kZSA9IFhfR0xYTWFrZUNvbnRleHRDdXJyZW50OworCSAgICByZXEtPmRyYXdhYmxlID0gZHJhdzsKKwkgICAgcmVxLT5yZWFkZHJhd2FibGUgPSByZWFkOworCSAgICByZXEtPmNvbnRleHQgPSBnY19pZDsKKwkgICAgcmVxLT5vbGRDb250ZXh0VGFnID0gZ2NfdGFnOworCX0KKwllbHNlIHsKKwkgICAgeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEgKnZwcmVxOworCSAgICB4R0xYTWFrZUN1cnJlbnRSZWFkU0dJUmVxICpyZXE7CisKKwkgICAgR2V0UmVxRXh0cmEoR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKKwkJCXN6X3hHTFhNYWtlQ3VycmVudFJlYWRTR0lSZXEtc3pfeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEsdnByZXEpOworCSAgICByZXEgPSAoeEdMWE1ha2VDdXJyZW50UmVhZFNHSVJlcSAqKXZwcmVxOworCSAgICByZXEtPnJlcVR5cGUgPSBvcGNvZGU7CisJICAgIHJlcS0+Z2x4Q29kZSA9IFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseTsKKwkgICAgcmVxLT52ZW5kb3JDb2RlID0gWF9HTFh2b3BfTWFrZUN1cnJlbnRSZWFkU0dJOworCSAgICByZXEtPmRyYXdhYmxlID0gZHJhdzsKKwkgICAgcmVxLT5yZWFkYWJsZSA9IHJlYWQ7CisJICAgIHJlcS0+Y29udGV4dCA9IGdjX2lkOworCSAgICByZXEtPm9sZENvbnRleHRUYWcgPSBnY190YWc7CisJfQorICAgIH0KKworICAgIHJldCA9IF9YUmVwbHkoZHB5LCAoeFJlcGx5KikgcmVwbHksIDAsIEZhbHNlKTsKKworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworc3RhdGljIF9fR0xYRFJJZHJhd2FibGUgKgorRmV0Y2hEUklEcmF3YWJsZShEaXNwbGF5ICpkcHksCisJCSBHTFhEcmF3YWJsZSBnbHhEcmF3YWJsZSwgR0xYQ29udGV4dCBnYywgQm9vbCBwcmUxMykKK3sKKyAgICBfX0dMWGRpc3BsYXlQcml2YXRlICogY29uc3QgcHJpdiA9IF9fZ2xYSW5pdGlhbGl6ZShkcHkpOworICAgIF9fR0xYRFJJZHJhd2FibGUgKnBkcmF3OworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOworICAgIFhJRCBkcmF3YWJsZTsKKworICAgIGlmIChwcml2ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgCisgICAgcHNjID0gJnByaXYtPnNjcmVlbkNvbmZpZ3NbZ2MtPnNjcmVlbl07CisgICAgaWYgKHBzYy0+ZHJhd0hhc2ggPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChfX2dseEhhc2hMb29rdXAocHNjLT5kcmF3SGFzaCwgZ2x4RHJhd2FibGUsICh2b2lkICopICZwZHJhdykgPT0gMCkKKwlyZXR1cm4gcGRyYXc7CisKKyAgICAvKiBJZiB0aGlzIGlzIGdsWE1ha2VDdXJyZW50IChwcmUgR0xYIDEuMykgd2UgYWxsb3cgY3JlYXRpbmcgdGhlCisgICAgICogR0xYIGRyYXdhYmxlIG9uIHRoZSBmbHkuICBPdGhlcndpc2Ugd2UgcGFzcyBOb25lIGFzIHRoZSBYCisgICAgICogZHJhd2FibGUgKi8KKyAgICBpZiAocHJlMTMpCisJZHJhd2FibGUgPSBnbHhEcmF3YWJsZTsKKyAgICBlbHNlCisJZHJhd2FibGUgPSBOb25lOworCisgICAgcGRyYXcgPSBwc2MtPmRyaVNjcmVlbi0+Y3JlYXRlRHJhd2FibGUocHNjLCBkcmF3YWJsZSwKKwkJCQkJICAgZ2x4RHJhd2FibGUsIGdjLT5tb2RlKTsKKyAgICBpZiAoX19nbHhIYXNoSW5zZXJ0KHBzYy0+ZHJhd0hhc2gsIGdseERyYXdhYmxlLCBwZHJhdykpIHsKKwkoKnBkcmF3LT5kZXN0cm95RHJhd2FibGUpKHBkcmF3KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGRyYXc7Cit9CisjZW5kaWYgLyogR0xYX0RJUkVDVF9SRU5ERVJJTkcgKi8KKworCisvKioKKyAqIE1ha2UgYSBwYXJ0aWN1bGFyIGNvbnRleHQgY3VycmVudC4KKyAqIAorICogXG5vdGUgVGhpcyBpcyBpbiB0aGlzIGZpbGUgc28gdGhhdCBpdCBjYW4gYWNjZXNzIGR1bW15Q29udGV4dC4KKyAqLworc3RhdGljIEJvb2wgTWFrZUNvbnRleHRDdXJyZW50KERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywKKwkJCSAgICAgICBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGdjLAorCQkJICAgICAgIEJvb2wgcHJlMTMpCit7CisgICAgeEdMWE1ha2VDdXJyZW50UmVwbHkgcmVwbHk7CisgICAgY29uc3QgR0xYQ29udGV4dCBvbGRHQyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBjb25zdCBDQVJEOCBvcGNvZGUgPSBfX2dsWFNldHVwRm9yQ29tbWFuZChkcHkpOworICAgIGNvbnN0IENBUkQ4IG9sZE9wY29kZSA9ICgoZ2MgPT0gb2xkR0MpIHx8IChvbGRHQyA9PSAmZHVtbXlDb250ZXh0KSkKKyAgICAgID8gb3Bjb2RlIDogX19nbFhTZXR1cEZvckNvbW1hbmQob2xkR0MtPmN1cnJlbnREcHkpOworICAgIEJvb2wgYmluZFJldHVyblZhbHVlOworCisKKyAgICBpZiAoIW9wY29kZSB8fCAhb2xkT3Bjb2RlKSB7CisJcmV0dXJuIEdMX0ZBTFNFOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgY29udGV4dCBoYXMgYSBub256ZXJvIElELiAgSW4gdGhlIHJlcXVlc3QsCisgICAgICogYSB6ZXJvIGNvbnRleHQgSUQgaXMgdXNlZCBvbmx5IHRvIG1lYW4gdGhhdCB3ZSBiaW5kIHRvIG5vIGN1cnJlbnQKKyAgICAgKiBjb250ZXh0LgorICAgICAqLworICAgIGlmICgoZ2MgIT0gTlVMTCkgJiYgKGdjLT54aWQgPT0gTm9uZSkpIHsKKwlyZXR1cm4gR0xfRkFMU0U7CisgICAgfQorCisgICAgX2dsYXBpX2NoZWNrX211bHRpdGhyZWFkKCk7CisKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIC8qIEJpbmQgdGhlIGRpcmVjdCByZW5kZXJpbmcgY29udGV4dCB0byB0aGUgZHJhd2FibGUgKi8KKyAgICBpZiAoZ2MgJiYgZ2MtPmRyaUNvbnRleHQpIHsKKwlfX0dMWERSSWRyYXdhYmxlICpwZHJhdyA9IEZldGNoRFJJRHJhd2FibGUoZHB5LCBkcmF3LCBnYywgcHJlMTMpOworCV9fR0xYRFJJZHJhd2FibGUgKnByZWFkID0gRmV0Y2hEUklEcmF3YWJsZShkcHksIHJlYWQsIGdjLCBwcmUxMyk7CisKKwliaW5kUmV0dXJuVmFsdWUgPQorCSAgICAoZ2MtPmRyaUNvbnRleHQtPmJpbmRDb250ZXh0KSAoZ2MtPmRyaUNvbnRleHQsIHBkcmF3LCBwcmVhZCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisJLyogU2VuZCBhIGdsWE1ha2VDdXJyZW50IHJlcXVlc3QgdG8gYmluZCB0aGUgbmV3IGNvbnRleHQuICovCisJYmluZFJldHVyblZhbHVlID0gCisJICBTZW5kTWFrZUN1cnJlbnRSZXF1ZXN0KGRweSwgb3Bjb2RlLCBnYyA/IGdjLT54aWQgOiBOb25lLAorCQkJCSAoKGRweSAhPSBvbGRHQy0+Y3VycmVudERweSkgfHwgb2xkR0MtPmlzRGlyZWN0KQorCQkJCSA/IE5vbmUgOiBvbGRHQy0+Y3VycmVudENvbnRleHRUYWcsCisJCQkJIGRyYXcsIHJlYWQsICZyZXBseSk7CisgICAgfQorCisKKyAgICBpZiAoIWJpbmRSZXR1cm5WYWx1ZSkgeworCXJldHVybiBGYWxzZTsKKyAgICB9CisKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmICgoZHB5ICE9IG9sZEdDLT5jdXJyZW50RHB5IHx8IChnYyAmJiBnYy0+ZHJpQ29udGV4dCkpICYmCisJIW9sZEdDLT5pc0RpcmVjdCAmJiBvbGRHQyAhPSAmZHVtbXlDb250ZXh0KSB7CisjZWxzZQorICAgIGlmICgoZHB5ICE9IG9sZEdDLT5jdXJyZW50RHB5KSAmJiBvbGRHQyAhPSAmZHVtbXlDb250ZXh0KSB7CisjZW5kaWYKKwl4R0xYTWFrZUN1cnJlbnRSZXBseSBkdW1teV9yZXBseTsKKworCS8qIFdlIGFyZSBlaXRoZXIgc3dpdGNoaW5nIGZyb20gb25lIGRweSB0byBhbm90aGVyIGFuZCBoYXZlIHRvCisJICogc2VuZCBhIHJlcXVlc3QgdG8gdGhlIHByZXZpb3VzIGRweSB0byB1bmJpbmQgdGhlIHByZXZpb3VzCisJICogY29udGV4dCwgb3Igd2UgYXJlIHN3aXRjaGluZyBhd2F5IGZyb20gYSBpbmRpcmVjdCBjb250ZXh0IHRvCisJICogYSBkaXJlY3QgY29udGV4dCBhbmQgaGF2ZSB0byBzZW5kIGEgcmVxdWVzdCB0byB0aGUgZHB5IHRvCisJICogdW5iaW5kIHRoZSBwcmV2aW91cyBjb250ZXh0LgorCSAqLworCSh2b2lkKSBTZW5kTWFrZUN1cnJlbnRSZXF1ZXN0KG9sZEdDLT5jdXJyZW50RHB5LCBvbGRPcGNvZGUsIE5vbmUsCisJCQkJICAgICAgb2xkR0MtPmN1cnJlbnRDb250ZXh0VGFnLCBOb25lLCBOb25lLAorCQkJCSAgICAgICYgZHVtbXlfcmVwbHkpOworICAgIH0KKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGVsc2UgaWYgKG9sZEdDLT5kcmlDb250ZXh0KSB7CisJb2xkR0MtPmRyaUNvbnRleHQtPnVuYmluZENvbnRleHQob2xkR0MtPmRyaUNvbnRleHQpOworICAgIH0KKyNlbmRpZgorCisKKyAgICAvKiBVcGRhdGUgb3VyIG5vdGlvbiBvZiB3aGF0IGlzIGN1cnJlbnQgKi8KKyAgICBfX2dsWExvY2soKTsKKyAgICBpZiAoZ2MgPT0gb2xkR0MpIHsKKwkvKiBFdmVuIHRob3VnaCB0aGUgY29udGV4dHMgYXJlIHRoZSBzYW1lIHRoZSBkcmF3YWJsZSBtaWdodCBoYXZlCisJICogY2hhbmdlZC4gIE5vdGUgdGhhdCBnYyBjYW5ub3QgYmUgdGhlIGR1bW15LCBhbmQgdGhhdCBvbGRHQworCSAqIGNhbm5vdCBiZSBOVUxMLCB0aGVyZWZvcmUgaWYgdGhleSBhcmUgdGhlIHNhbWUsIGdjIGlzIG5vdAorCSAqIE5VTEwgYW5kIG5vdCB0aGUgZHVtbXkuCisJICovCisJZ2MtPmN1cnJlbnREcmF3YWJsZSA9IGRyYXc7CisJZ2MtPmN1cnJlbnRSZWFkYWJsZSA9IHJlYWQ7CisgICAgfSBlbHNlIHsKKwlpZiAob2xkR0MgIT0gJmR1bW15Q29udGV4dCkgeworCSAgICAvKiBPbGQgY3VycmVudCBjb250ZXh0IGlzIG5vIGxvbmdlciBjdXJyZW50IHRvIGFueWJvZHkgKi8KKwkgICAgb2xkR0MtPmN1cnJlbnREcHkgPSAwOworCSAgICBvbGRHQy0+Y3VycmVudERyYXdhYmxlID0gTm9uZTsKKwkgICAgb2xkR0MtPmN1cnJlbnRSZWFkYWJsZSA9IE5vbmU7CisJICAgIG9sZEdDLT5jdXJyZW50Q29udGV4dFRhZyA9IDA7CisKKwkgICAgaWYgKG9sZEdDLT54aWQgPT0gTm9uZSkgeworCQkvKiBXZSBhcmUgc3dpdGNoaW5nIGF3YXkgZnJvbSBhIGNvbnRleHQgdGhhdCB3YXMKKwkJICogcHJldmlvdXNseSBkZXN0cm95ZWQsIHNvIHdlIG5lZWQgdG8gZnJlZSB0aGUgbWVtb3J5CisJCSAqIGZvciB0aGUgb2xkIGhhbmRsZS4KKwkJICovCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKwkJLyogRGVzdHJveSB0aGUgb2xkIGRpcmVjdCByZW5kZXJpbmcgY29udGV4dCAqLworCQlpZiAob2xkR0MtPmRyaUNvbnRleHQpIHsKKwkJICAgIG9sZEdDLT5kcmlDb250ZXh0LT5kZXN0cm95Q29udGV4dChvbGRHQy0+ZHJpQ29udGV4dCwKKwkJCQkJCSAgICAgIG9sZEdDLT5wc2MsCisJCQkJCQkgICAgICBvbGRHQy0+Y3JlYXRlRHB5KTsKKwkJICAgIG9sZEdDLT5kcmlDb250ZXh0ID0gTlVMTDsKKwkJfQorI2VuZGlmCisJCV9fZ2xYRnJlZUNvbnRleHQob2xkR0MpOworCSAgICB9CisJfQorCWlmIChnYykgeworCSAgICBfX2dsWFNldEN1cnJlbnRDb250ZXh0KGdjKTsKKworCSAgICBnYy0+Y3VycmVudERweSA9IGRweTsKKwkgICAgZ2MtPmN1cnJlbnREcmF3YWJsZSA9IGRyYXc7CisJICAgIGdjLT5jdXJyZW50UmVhZGFibGUgPSByZWFkOworCisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcgICAgCisgICAgICAgICAgICBpZiAoIWdjLT5kcmlDb250ZXh0KSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgIGlmICghSW5kaXJlY3RBUEkpCisgICAgICAgICAgICAgICAgICBJbmRpcmVjdEFQSSA9IF9fZ2xYTmV3SW5kaXJlY3RBUEkoKTsKKyAgICAgICAgICAgICAgIF9nbGFwaV9zZXRfZGlzcGF0Y2goSW5kaXJlY3RBUEkpOworCisjaWZkZWYgR0xYX1VTRV9BUFBMRUdMCisgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgWEFwcGxlRFJJVXNlSW5kaXJlY3REaXNwYXRjaCh2b2lkKTsKKyAgICAgICAgICAgICAgICAgICBYQXBwbGVEUklVc2VJbmRpcmVjdERpc3BhdGNoKCk7CisgICAgICAgICAgICAgICB9IHdoaWxlICgwKTsKKyNlbmRpZgorCisJCV9fR0xYYXR0cmlidXRlICpzdGF0ZSA9IAorCQkgIChfX0dMWGF0dHJpYnV0ZSAqKShnYy0+Y2xpZW50X3N0YXRlX3ByaXZhdGUpOworCisJCWdjLT5jdXJyZW50Q29udGV4dFRhZyA9IHJlcGx5LmNvbnRleHRUYWc7CisJCWlmIChzdGF0ZS0+YXJyYXlfc3RhdGUgPT0gTlVMTCkgeworCQkgICAgKHZvaWQpIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOworCQkgICAgKHZvaWQpIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOworCQkgICAgX19nbFhJbml0VmVydGV4QXJyYXlTdGF0ZShnYyk7CisJCX0KKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORyAgICAKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJZ2MtPmN1cnJlbnRDb250ZXh0VGFnID0gLTE7CisJICAgIH0KKyNlbmRpZgorCX0gZWxzZSB7CisJICAgIF9fZ2xYU2V0Q3VycmVudENvbnRleHROdWxsKCk7CisJfQorICAgIH0KKyAgICBfX2dsWFVubG9jaygpOworICAgIHJldHVybiBHTF9UUlVFOworfQorCisKK1BVQkxJQyBCb29sIGdsWE1ha2VDdXJyZW50KERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYQ29udGV4dCBnYykKK3sKKyAgICByZXR1cm4gTWFrZUNvbnRleHRDdXJyZW50KGRweSwgZHJhdywgZHJhdywgZ2MsIFRydWUpOworfQorCitQVUJMSUMgR0xYX0FMSUFTKEJvb2wsIGdsWE1ha2VDdXJyZW50UmVhZFNHSSwKKwkgIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGQsIEdMWERyYXdhYmxlIHIsIEdMWENvbnRleHQgY3R4KSwKKwkgIChkcHksIGQsIHIsIGN0eCwgRmFsc2UpLCBNYWtlQ29udGV4dEN1cnJlbnQpCisKK1BVQkxJQyBHTFhfQUxJQVMoQm9vbCwgZ2xYTWFrZUNvbnRleHRDdXJyZW50LAorCSAgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZCwgR0xYRHJhd2FibGUgciwgR0xYQ29udGV4dCBjdHgpLAorCSAgKGRweSwgZCwgciwgY3R4LCBGYWxzZSksIE1ha2VDb250ZXh0Q3VycmVudCkKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL2dseGV4dC5jIGIvc3JjL2dseC94MTEvZ2x4ZXh0LmMKaW5kZXggNjQwM2NiZC4uYzUzMjJmNiAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvZ2x4ZXh0LmMKKysrIGIvc3JjL2dseC94MTEvZ2x4ZXh0LmMKQEAgLTQ0LDU3ICs0NCwyNSBAQAogICovICAgICAKIAogI2luY2x1ZGUgImdseGNsaWVudC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGV4dC5oPgogI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2V4dHV0aWwuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZGFtYWdlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSAiaW5kaXJlY3RfaW5pdC5oIgogI2luY2x1ZGUgImdsYXBpLmgiCiAjaW5jbHVkZSAiZ2x4ZXh0ZW5zaW9ucy5oIgogI2luY2x1ZGUgImdsY29udGV4dG1vZGVzLmgiCiAjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKIAotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgInhmODZkcmkuaCIKLSNpbmNsdWRlICJzYXJlYS5oIgotI2luY2x1ZGUgImRyaV9nbHguaCIKLSNlbmRpZgotCiAjaWZkZWYgVVNFX1hDQgogI2luY2x1ZGUgPFgxMS9YbGliLXhjYi5oPgogI2luY2x1ZGUgPHhjYi94Y2IuaD4KICNpbmNsdWRlIDx4Y2IvZ2x4Lmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaWZkZWYgREVCVUcKIHZvaWQgX19nbFhEdW1wRHJhd0J1ZmZlcihfX0dMWGNvbnRleHQgKmN0eCk7CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9TUEFSQ19BU00KLS8qCi0gKiBUaGlzIGlzIHdoZXJlIG91ciBkaXNwYXRjaCB0YWJsZSdzIGJvdW5kcyBhcmUuCi0gKiBBbmQgdGhlIHN0YXRpYyBtZXNhX2luaXQgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbQotICogTWVzYSdzICdzcGFyYy5jJyBpbml0aWFsaXplci4KLSAqCi0gKiBXZSBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMgaGVyZSwgYmVjYXVzZSB0aGlzIHZlcnNpb24KLSAqIG9mIG9wZW5HTC9nbHggbmV2ZXIgaW5pdGlhbGl6ZXMgYSBNZXNhIGNvbnRleHQsIGFuZCBzbwotICogdGhlIGFkZHJlc3Mgb2YgdGhlIGRpc3BhdGNoIHRhYmxlIHBvaW50ZXIgbmV2ZXIgZ2V0cyBzdHVmZmVkCi0gKiBpbnRvIHRoZSBkaXNwYXRjaCBqdW1wIHRhYmxlIG90aGVyd2lzZS4KLSAqCi0gKiBJdCBtYXR0ZXJzIG9ubHkgb24gU1BBUkMsIGFuZCBvbmx5IGlmIHlvdSBhcmUgdXNpbmcgYXNzZW1ibGVyCi0gKiBjb2RlIGluc3RlYWQgb2YgQy1jb2RlIGluZGlyZWN0IGRpc3BhdGNoLgotICoKLSAqIC0tIEZFTSwgMDQueGlpLjAzCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX21lc2Ffc3BhcmNfZ2xhcGlfYmVnaW47Ci1leHRlcm4gdW5zaWduZWQgaW50IF9tZXNhX3NwYXJjX2dsYXBpX2VuZDsKLWV4dGVybiB2b2lkIF9fZ2xhcGlfc3BhcmNfaWNhY2hlX2ZsdXNoKHVuc2lnbmVkIGludCAqKTsKIHN0YXRpYyB2b2lkIF9nbHhfbWVzYV9pbml0X3NwYXJjX2dsYXBpX3JlbG9jcyh2b2lkKTsKIHN0YXRpYyBpbnQgX21lc2Ffc3BhcmNfbmVlZHNfaW5pdCA9IDE7CiAjZGVmaW5lIElOSVRfTUVTQV9TUEFSQyB7IFwKQEAgLTEwNywxNzMgKzc1LDExIEBACiAjZGVmaW5lIElOSVRfTUVTQV9TUEFSQwogI2VuZGlmCiAKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotc3RhdGljIF9fRFJJc2NyZWVuICpfX2dsWEZpbmREUklTY3JlZW4oX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuKTsKLSNlbmRpZiAvKiBHTFhfRElSRUNUX1JFTkRFUklORyAqLwotCi1zdGF0aWMgQm9vbCBNYWtlQ29udGV4dEN1cnJlbnQoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LAotICAgIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgZ2MpOwotCi0vKgotKiogV2Ugc2V0dXAgc29tZSBkdW1teSBzdHJ1Y3R1cmVzIGhlcmUgc28gdGhhdCB0aGUgQVBJIGNhbiBiZSB1c2VkCi0qKiBldmVuIGlmIG5vIGNvbnRleHQgaXMgY3VycmVudC4KLSovCi0KLXN0YXRpYyBHTHVieXRlIGR1bW15QnVmZmVyW19fR0xYX0JVRkZFUl9MSU1JVF9TSVpFXTsKLQotLyoKLSoqIER1bW15IGNvbnRleHQgdXNlZCBieSBzbWFsbCBjb21tYW5kcyB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgY29udGV4dC4KLSoqIEFsbCB0aGUKLSoqIGdsIGFuZCBnbHggZW50cnkgcG9pbnRzIGFyZSBkZXNpZ25lZCB0byBvcGVyYXRlIGFzIG5vcCdzIHdoZW4gdXNpbmcKLSoqIHRoZSBkdW1teSBjb250ZXh0IHN0cnVjdHVyZS4KLSovCi1zdGF0aWMgX19HTFhjb250ZXh0IGR1bW15Q29udGV4dCA9IHsKLSAgICAmZHVtbXlCdWZmZXJbMF0sCi0gICAgJmR1bW15QnVmZmVyWzBdLAotICAgICZkdW1teUJ1ZmZlclswXSwKLSAgICAmZHVtbXlCdWZmZXJbX19HTFhfQlVGRkVSX0xJTUlUX1NJWkVdLAotICAgIHNpemVvZihkdW1teUJ1ZmZlciksCi19OwotCi0KLS8qCi0qKiBBbGwgaW5kaXJlY3QgcmVuZGVyaW5nIGNvbnRleHRzIHdpbGwgc2hhcmUgdGhlIHNhbWUgaW5kaXJlY3QgZGlzcGF0Y2ggdGFibGUuCi0qLwotc3RhdGljIF9fR0xhcGkgKkluZGlyZWN0QVBJID0gTlVMTDsKLQotCi0vKgotICogQ3VycmVudCBjb250ZXh0IG1hbmFnZW1lbnQgYW5kIGxvY2tpbmcKLSAqLwotCi0jaWYgZGVmaW5lZCggVVNFX1hUSFJFQURTICkKLQotLyogdGhyZWFkIHNhZmUgKi8KLXN0YXRpYyBHTGJvb2xlYW4gVFNEaW5pdGlhbGl6ZWQgPSBHTF9GQUxTRTsKLXN0YXRpYyB4dGhyZWFkX2tleV90IENvbnRleHRUU0Q7Ci0KLV9fR0xYY29udGV4dCAqX19nbFhHZXRDdXJyZW50Q29udGV4dCh2b2lkKQotewotICAgaWYgKCFUU0Rpbml0aWFsaXplZCkgewotICAgICAgeHRocmVhZF9rZXlfY3JlYXRlKCZDb250ZXh0VFNELCBOVUxMKTsKLSAgICAgIFRTRGluaXRpYWxpemVkID0gR0xfVFJVRTsKLSAgICAgIHJldHVybiAmZHVtbXlDb250ZXh0OwotICAgfQotICAgZWxzZSB7Ci0gICAgICB2b2lkICpwOwotICAgICAgeHRocmVhZF9nZXRfc3BlY2lmaWMoQ29udGV4dFRTRCwgJnApOwotICAgICAgaWYgKCFwKQotICAgICAgICAgcmV0dXJuICZkdW1teUNvbnRleHQ7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gKF9fR0xYY29udGV4dCAqKSBwOwotICAgfQotfQotCi12b2lkIF9fZ2xYU2V0Q3VycmVudENvbnRleHQoX19HTFhjb250ZXh0ICpjKQotewotICAgaWYgKCFUU0Rpbml0aWFsaXplZCkgewotICAgICAgeHRocmVhZF9rZXlfY3JlYXRlKCZDb250ZXh0VFNELCBOVUxMKTsKLSAgICAgIFRTRGluaXRpYWxpemVkID0gR0xfVFJVRTsKLSAgIH0KLSAgIHh0aHJlYWRfc2V0X3NwZWNpZmljKENvbnRleHRUU0QsIGMpOwotfQotCi0KLS8qIFVzZWQgYnkgdGhlIF9fZ2xYTG9jaygpIGFuZCBfX2dsWFVubG9jaygpIG1hY3JvcyAqLwoteG11dGV4X3JlYyBfX2dsWG11dGV4OwotCi0jZWxpZiBkZWZpbmVkKCBQVEhSRUFEUyApCi0KLXB0aHJlYWRfbXV0ZXhfdCBfX2dsWG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLQotIyBpZiBkZWZpbmVkKCBHTFhfVVNFX1RMUyApCi0KLS8qKgotICogUGVyLXRocmVhZCBHTFggY29udGV4dCBwb2ludGVyLgotICogCi0gKiBcYyBfX2dsWFNldEN1cnJlbnRDb250ZXh0IGlzIHdyaXR0ZW4gaXMgc3VjaCBhIHdheSB0aGF0IHRoaXMgcG9pbnRlciBjYW4KLSAqIFxiIG5ldmVyIGJlIFxjIE5VTEwuICBUaGlzIGlzIGltcG9ydGFudCEgIEJlY2F1c2Ugb2YgdGhpcwotICogXGMgX19nbFhHZXRDdXJyZW50Q29udGV4dCBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgdHJpdmlhbCBtYWNyby4KLSAqLwotX190aHJlYWQgdm9pZCAqIF9fZ2xYX3Rsc19Db250ZXh0IF9fYXR0cmlidXRlX18oKHRsc19tb2RlbCgiaW5pdGlhbC1leGVjIikpKQotICAgID0gJmR1bW15Q29udGV4dDsKLQotdm9pZCBfX2dsWFNldEN1cnJlbnRDb250ZXh0KCBfX0dMWGNvbnRleHQgKiBjICkKLXsKLSAgICBfX2dsWF90bHNfQ29udGV4dCA9IChjICE9IE5VTEwpID8gYyA6ICZkdW1teUNvbnRleHQ7Ci19Ci0KLSMgZWxzZQotCi1zdGF0aWMgcHRocmVhZF9vbmNlX3Qgb25jZV9jb250cm9sID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci0KLS8qKgotICogUGVyLXRocmVhZCBkYXRhIGtleS4KLSAqIAotICogT25jZSBcYyBpbml0X3RocmVhZF9kYXRhIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHBlci10aHJlYWQgZGF0YSBrZXkgd2lsbAotICogdGFrZSBhIHZhbHVlIG9mIFxjIE5VTEwuICBBcyBlYWNoIG5ldyB0aHJlYWQgaXMgY3JlYXRlZCB0aGUgZGVmYXVsdAotICogdmFsdWUsIGluIHRoYXQgdGhyZWFkLCB3aWxsIGJlIFxjIE5VTEwuCi0gKi8KLXN0YXRpYyBwdGhyZWFkX2tleV90IENvbnRleHRUU0Q7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgcGVyLXRocmVhZCBkYXRhIGtleS4KLSAqIAotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgXGIgZXhhY3RseSBvbmNlIHBlci1wcm9jZXNzIChub3QgcGVyLXRocmVhZCEpIHRvCi0gKiBpbml0aWFsaXplIHRoZSBwZXItdGhyZWFkIGRhdGEga2V5LiAgVGhpcyBpcyBpZGVhbGx5IGRvbmUgdXNpbmcgdGhlCi0gKiBcYyBwdGhyZWFkX29uY2UgbWVjaGFuaXNtLgotICovCi1zdGF0aWMgdm9pZCBpbml0X3RocmVhZF9kYXRhKCB2b2lkICkKLXsKLSAgICBpZiAoIHB0aHJlYWRfa2V5X2NyZWF0ZSggJiBDb250ZXh0VFNELCBOVUxMICkgIT0gMCApIHsKLQlwZXJyb3IoICJwdGhyZWFkX2tleV9jcmVhdGUiICk7Ci0JZXhpdCggLTEgKTsKLSAgICB9Ci19Ci0KLXZvaWQgX19nbFhTZXRDdXJyZW50Q29udGV4dCggX19HTFhjb250ZXh0ICogYyApCi17Ci0gICAgcHRocmVhZF9vbmNlKCAmIG9uY2VfY29udHJvbCwgaW5pdF90aHJlYWRfZGF0YSApOwotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoIENvbnRleHRUU0QsIGMgKTsKLX0KLQotX19HTFhjb250ZXh0ICogX19nbFhHZXRDdXJyZW50Q29udGV4dCggdm9pZCApCi17Ci0gICAgdm9pZCAqIHY7Ci0KLSAgICBwdGhyZWFkX29uY2UoICYgb25jZV9jb250cm9sLCBpbml0X3RocmVhZF9kYXRhICk7Ci0KLSAgICB2ID0gcHRocmVhZF9nZXRzcGVjaWZpYyggQ29udGV4dFRTRCApOwotICAgIHJldHVybiAodiA9PSBOVUxMKSA/ICYgZHVtbXlDb250ZXh0IDogKF9fR0xYY29udGV4dCAqKSB2OwotfQotCi0jIGVuZGlmIC8qIGRlZmluZWQoIEdMWF9VU0VfVExTICkgKi8KLQotI2VsaWYgZGVmaW5lZCggVEhSRUFEUyApCi0KLSNlcnJvciBVbmtub3duIHRocmVhZGluZyBtZXRob2Qgc3BlY2lmaWVkLgotCi0jZWxzZQotCi0vKiBub3QgdGhyZWFkIHNhZmUgKi8KLV9fR0xYY29udGV4dCAqX19nbFhjdXJyZW50Q29udGV4dCA9ICZkdW1teUNvbnRleHQ7Ci0KLSNlbmRpZgotCi0KIC8qCiAqKiBZb3UgY2FuIHNldCB0aGlzIGNlbGwgdG8gMSB0byBmb3JjZSB0aGUgZ2wgZHJhd2luZyBzdHVmZiB0byBiZQogKiogb25lIGNvbW1hbmQgcGVyIHBhY2tldAogKi8KLWludCBfX2dsWERlYnVnID0gMDsKLQotLyoKLSoqIGZvcndhcmQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucwotKi8KLWludCBfX2dsWENsb3NlRGlzcGxheShEaXNwbGF5ICpkcHksIFhFeHRDb2RlcyAqY29kZXMpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitfWF9ISURERU4gaW50IF9fZ2xYRGVidWcgPSAwOwogCiAvKiBFeHRlbnNpb24gcmVxdWlyZWQgYm9pbGVyIHBsYXRlICovCiAKQEAgLTI5NiwxNiArMTAyLDEzIEBACiAgICAgIkdMWEJhZFdpbmRvdyIsCiB9OwogCi1pbnQgX19nbFhDbG9zZURpc3BsYXkoRGlzcGxheSAqZHB5LCBYRXh0Q29kZXMgKmNvZGVzKQorc3RhdGljIGludCBfX2dsWENsb3NlRGlzcGxheShEaXNwbGF5ICpkcHksIFhFeHRDb2RlcyAqY29kZXMpCiB7CiAgIEdMWENvbnRleHQgZ2M7CiAKICAgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgIGlmIChkcHkgPT0gZ2MtPmN1cnJlbnREcHkpIHsKLSAgICBfX2dsWFNldEN1cnJlbnRDb250ZXh0KCZkdW1teUNvbnRleHQpOwotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICAgX2dsYXBpX3NldF9kaXNwYXRjaChOVUxMKTsgIC8qIG5vLW9wIGZ1bmN0aW9ucyAqLwotI2VuZGlmCisgICAgX19nbFhTZXRDdXJyZW50Q29udGV4dE51bGwoKTsKICAgICBfX2dsWEZyZWVDb250ZXh0KGdjKTsKICAgfQogCkBAIC0zNTIsMjIgKzE1NSwyNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzY3JlZW5zOyBpKyssIHBzYysrKSB7CiAJaWYgKHBzYy0+Y29uZmlncykgewogCSAgICBfZ2xfY29udGV4dF9tb2Rlc19kZXN0cm95KCBwc2MtPmNvbmZpZ3MgKTsKLQkgICAgaWYocHNjLT5lZmZlY3RpdmVHTFhleHRzKQorCSAgICBpZiAocHNjLT5lZmZlY3RpdmVHTFhleHRzKQogCQlYZnJlZShwc2MtPmVmZmVjdGl2ZUdMWGV4dHMpOwotCiAJICAgIHBzYy0+Y29uZmlncyA9IE5VTEw7CS8qIE5PVEU6IGp1c3QgZm9yIHBhcmFub2lhICovCiAJfQotCVhmcmVlKChjaGFyKikgcHNjLT5zZXJ2ZXJHTFhleHRzKTsKKyAgICAgICAgaWYgKHBzYy0+dmlzdWFscykgeworICAgICAgICAgICAgX2dsX2NvbnRleHRfbW9kZXNfZGVzdHJveSggcHNjLT52aXN1YWxzICk7CisgICAgICAgICAgICBwc2MtPnZpc3VhbHMgPSBOVUxMOyAgLyogTk9URToganVzdCBmb3IgcGFyYW5vaWEgKi8KKyAgICAgICAgfQorIAlYZnJlZSgoY2hhciopIHBzYy0+c2VydmVyR0xYZXh0cyk7CiAKICNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotCS8qIEZyZWUgdGhlIGRpcmVjdCByZW5kZXJpbmcgcGVyIHNjcmVlbiBkYXRhICovCi0JaWYgKHBzYy0+ZHJpU2NyZWVuLnByaXZhdGUpCi0JICAgICgqcHNjLT5kcmlTY3JlZW4uZGVzdHJveVNjcmVlbikocHJpdi0+ZHB5LCBpLAotCQkJCQkgICAgcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSk7Ci0JcHNjLT5kcmlTY3JlZW4ucHJpdmF0ZSA9IE5VTEw7CisJaWYgKHBzYy0+ZHJpU2NyZWVuKSB7CisJICAgIHBzYy0+ZHJpU2NyZWVuLT5kZXN0cm95U2NyZWVuKHBzYyk7CisJICAgIF9fZ2x4SGFzaERlc3Ryb3kocHNjLT5kcmF3SGFzaCk7CisgICAgICAgICAgICBYRnJlZShwc2MtPmRyaVNjcmVlbik7CisgICAgICAgICAgICBwc2MtPmRyaVNjcmVlbiA9IE5VTEw7CisJfQogI2VuZGlmCiAgICAgfQogICAgIFhGcmVlKChjaGFyKikgcHJpdi0+c2NyZWVuQ29uZmlncyk7CisgICAgcHJpdi0+c2NyZWVuQ29uZmlncyA9IE5VTEw7CiB9CiAKIC8qCkBAIC0zOTEsMTQgKzE5OSwxNyBAQAogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKICAgICAvKiBGcmVlIHRoZSBkaXJlY3QgcmVuZGVyaW5nIHBlciBkaXNwbGF5IGRhdGEgKi8KLSAgICBpZiAocHJpdi0+ZHJpRGlzcGxheS5wcml2YXRlKQotCSgqcHJpdi0+ZHJpRGlzcGxheS5kZXN0cm95RGlzcGxheSkocHJpdi0+ZHB5LAotCQkJCQkgICBwcml2LT5kcmlEaXNwbGF5LnByaXZhdGUpOwotICAgIHByaXYtPmRyaURpc3BsYXkucHJpdmF0ZSA9IE5VTEw7Ci0gICAgaWYgKHByaXYtPmRyaURpc3BsYXkuY3JlYXRlTmV3U2NyZWVuKSB7Ci0gICAgICAgIFhmcmVlKHByaXYtPmRyaURpc3BsYXkuY3JlYXRlTmV3U2NyZWVuKTsgLyogZnJlZSBhcnJheSBvZiBwdHJzICovCi0gICAgICAgIHByaXYtPmRyaURpc3BsYXkuY3JlYXRlTmV3U2NyZWVuID0gTlVMTDsKLSAgICB9CisgICAgaWYgKHByaXYtPmRyaXN3RGlzcGxheSkKKwkoKnByaXYtPmRyaXN3RGlzcGxheS0+ZGVzdHJveURpc3BsYXkpKHByaXYtPmRyaXN3RGlzcGxheSk7CisgICAgcHJpdi0+ZHJpc3dEaXNwbGF5ID0gTlVMTDsKKworICAgIGlmIChwcml2LT5kcmlEaXNwbGF5KQorCSgqcHJpdi0+ZHJpRGlzcGxheS0+ZGVzdHJveURpc3BsYXkpKHByaXYtPmRyaURpc3BsYXkpOworICAgIHByaXYtPmRyaURpc3BsYXkgPSBOVUxMOworCisgICAgaWYgKHByaXYtPmRyaTJEaXNwbGF5KQorCSgqcHJpdi0+ZHJpMkRpc3BsYXktPmRlc3Ryb3lEaXNwbGF5KShwcml2LT5kcmkyRGlzcGxheSk7CisgICAgcHJpdi0+ZHJpMkRpc3BsYXkgPSBOVUxMOwogI2VuZGlmCiAKICAgICBYZnJlZSgoY2hhciopIHByaXYpOwpAQCAtNDQwLDcgKzI1MSw3IEBACiB9CiAKIAotdm9pZCAKK19YX0hJRERFTiB2b2lkIAogX19nbFhJbml0aWFsaXplVmlzdWFsQ29uZmlnRnJvbVRhZ3MoIF9fR0xjb250ZXh0TW9kZXMgKmNvbmZpZywgaW50IGNvdW50LCAKIAkJCQkgICAgIGNvbnN0IElOVDMyICpicCwgQm9vbCB0YWdnZWRfb25seSwKIAkJCQkgICAgIEJvb2wgZmJjb25maWdfc3R5bGVfdGFncyApCkBAIC02MzQsMzcxICs0NDUsMTI4IEBACiAgICAgY29uZmlnLT5oYXZlU3RlbmNpbEJ1ZmZlciA9IChjb25maWctPnN0ZW5jaWxCaXRzID4gMCk7CiB9CiAKLQotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi1zdGF0aWMgdW5zaWduZWQKLWZpbHRlcl9tb2RlcyggX19HTGNvbnRleHRNb2RlcyAqKiBzZXJ2ZXJfbW9kZXMsCi0JICAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIGRyaXZlcl9tb2RlcyApCitzdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCitjcmVhdGVDb25maWdzRnJvbVByb3BlcnRpZXMoRGlzcGxheSAqZHB5LCBpbnQgbnZpc3VhbHMsIGludCBucHJvcHMsCisJCQkgICAgaW50IHNjcmVlbiwgR0xib29sZWFuIHRhZ2dlZF9vbmx5KQogewotICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtOwotICAgIF9fR0xjb250ZXh0TW9kZXMgKiogcHJldl9uZXh0OwotICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBjaGVjazsKLSAgICB1bnNpZ25lZCBtb2Rlc19jb3VudCA9IDA7Ci0KLSAgICBpZiAoIGRyaXZlcl9tb2RlcyA9PSBOVUxMICkgewotCWZwcmludGYoc3RkZXJyLCAibGliR0wgd2FybmluZzogM0QgZHJpdmVyIHJldHVybmVkIG5vIGZiY29uZmlncy5cbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEZvciBlYWNoIG1vZGUgaW4gc2VydmVyX21vZGVzLCBjaGVjayB0byBzZWUgaWYgYSBtYXRjaGluZyBtb2RlIGV4aXN0cwotICAgICAqIGluIGRyaXZlcl9tb2Rlcy4gIElmIG5vdCwgdGhlbiB0aGUgbW9kZSBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotCi0gICAgcHJldl9uZXh0ID0gc2VydmVyX21vZGVzOwotICAgIGZvciAoIG0gPSAqcHJldl9uZXh0IDsgbSAhPSBOVUxMIDsgbSA9ICpwcmV2X25leHQgKSB7Ci0JR0xib29sZWFuIGRvX2RlbGV0ZSA9IEdMX1RSVUU7Ci0KLQlmb3IgKCBjaGVjayA9IGRyaXZlcl9tb2RlcyA7IGNoZWNrICE9IE5VTEwgOyBjaGVjayA9IGNoZWNrLT5uZXh0ICkgewotCSAgICBpZiAoIF9nbF9jb250ZXh0X21vZGVzX2FyZV9zYW1lKCBtLCBjaGVjayApICkgewotCQlkb19kZWxldGUgPSBHTF9GQUxTRTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkvKiBUaGUgM0QgaGFzIHRvIHN1cHBvcnQgYWxsIHRoZSBtb2RlcyB0aGF0IG1hdGNoIHRoZSBHTFggdmlzdWFscwotCSAqIHNlbnQgZnJvbSB0aGUgWCBzZXJ2ZXIuCi0JICovCi0JaWYgKCBkb19kZWxldGUgJiYgKG0tPnZpc3VhbElEICE9IDApICkgewotCSAgICBkb19kZWxldGUgPSBHTF9GQUxTRTsKLQotICAgICAgICAgICAgaWYgKGdldGVudigiTElCR0xfREVCVUciKSkgewotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJHTCB3YXJuaW5nOiAzRCBkcml2ZXIgY2xhaW1zIHRvIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgInZpc3VhbCAweCUwMnhcbiIsIG0tPnZpc3VhbElEKTsKLSAgICAgICAgICAgIH0KLQl9Ci0KLQlpZiAoIGRvX2RlbGV0ZSApIHsKLQkgICAgKnByZXZfbmV4dCA9IG0tPm5leHQ7Ci0KLQkgICAgbS0+bmV4dCA9IE5VTEw7Ci0JICAgIF9nbF9jb250ZXh0X21vZGVzX2Rlc3Ryb3koIG0gKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIG1vZGVzX2NvdW50Kys7Ci0JICAgIHByZXZfbmV4dCA9ICYgbS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGVzX2NvdW50OwotfQotCi0KLS8qKgotICogSW1wbGVtZW50IFxjIF9fRFJJaW50ZXJmYWNlTWV0aG9kczo6Z2V0UHJvY0FkZHJlc3MuCi0gKi8KLXN0YXRpYyBfX0RSSWZ1bmNQdHIgZ2V0X3Byb2NfYWRkcmVzcyggY29uc3QgY2hhciAqIHByb2NfbmFtZSApCi17Ci0gICAgaWYgKHN0cmNtcCggcHJvY19uYW1lLCAiZ2x4RW5hYmxlRXh0ZW5zaW9uIiApID09IDApIHsKLQlyZXR1cm4gKF9fRFJJZnVuY1B0cikgX19nbFhTY3JFbmFibGVFeHRlbnNpb247Ci0gICAgfQotICAgIAotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgWERBTUFHRV8xXzFfSU5URVJGQUNFCi1zdGF0aWMgR0xib29sZWFuIGhhc19kYW1hZ2VfcG9zdChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSkKLXsKLSAgICBzdGF0aWMgR0xib29sZWFuIGluaXRlZCA9IEdMX0ZBTFNFOwotICAgIHN0YXRpYyBHTGJvb2xlYW4gaGFzX2RhbWFnZTsKLQotICAgIGlmICghaW5pdGVkKSB7Ci0JaW50IG1ham9yLCBtaW5vcjsKLQotCWlmIChYRGFtYWdlUXVlcnlWZXJzaW9uKGRweSwgJm1ham9yLCAmbWlub3IpICYmCi0JICAgIG1ham9yID09IDEgJiYgbWlub3IgPj0gMSkKLQl7Ci0JICAgIGhhc19kYW1hZ2UgPSBHTF9UUlVFOwotCX0gZWxzZSB7Ci0JICAgIGhhc19kYW1hZ2UgPSBHTF9GQUxTRTsKLQl9Ci0JaW5pdGVkID0gR0xfVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzX2RhbWFnZTsKLX0KLSNlbmRpZiAvKiBYREFNQUdFXzFfMV9JTlRFUkZBQ0UgKi8KLQotc3RhdGljIHZvaWQgX19nbFhSZXBvcnREYW1hZ2UoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCi0JCQkgICAgICBfX0RSSWlkIGRyYXdhYmxlLAotCQkJICAgICAgaW50IHgsIGludCB5LAotCQkJICAgICAgZHJtX2NsaXBfcmVjdF90ICpyZWN0cywgaW50IG51bV9yZWN0cywKLQkJCSAgICAgIEdMYm9vbGVhbiBmcm9udF9idWZmZXIpCi17Ci0jaWZkZWYgWERBTUFHRV8xXzFfSU5URVJGQUNFCi0gICAgWFJlY3RhbmdsZSAqeHJlY3RzOwotICAgIFhzZXJ2ZXJSZWdpb24gcmVnaW9uOworICAgIElOVDMyIGJ1ZltfX0dMWF9UT1RBTF9DT05GSUddLCAqcHJvcHM7CisgICAgdW5zaWduZWQgcHJvcF9zaXplOworICAgIF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLCAqbTsKICAgICBpbnQgaTsKLSAgICBpbnQgeF9vZmYsIHlfb2ZmOwogCi0gICAgaWYgKCFoYXNfZGFtYWdlX3Bvc3QoZHB5KSkKLQlyZXR1cm47CisgICAgaWYgKG5wcm9wcyA9PSAwKQorCXJldHVybiBOVUxMOwogCi0gICAgaWYgKGZyb250X2J1ZmZlcikgewotCXhfb2ZmID0geDsKLQl5X29mZiA9IHk7Ci0JZHJhd2FibGUgPSBSb290V2luZG93KGRweSwgc2NyZWVuKTsKLSAgICB9IGVsc2V7Ci0JeF9vZmYgPSAwOwotCXlfb2ZmID0gMDsKKyAgICAvKiBGSVhNRTogSXMgdGhlIF9fR0xYX01JTl9DT05GSUdfUFJPUFMgdGVzdCBjb3JyZWN0IGZvciBGQmNvbmZpZ3M/ICovCisKKyAgICAvKiBDaGVjayBudW1iZXIgb2YgcHJvcGVydGllcyAqLworICAgIGlmIChucHJvcHMgPCBfX0dMWF9NSU5fQ09ORklHX1BST1BTIHx8IG5wcm9wcyA+IF9fR0xYX01BWF9DT05GSUdfUFJPUFMpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBjb25maWcgc3RydWN0dXJlICovCisgICAgbW9kZXMgPSBfZ2xfY29udGV4dF9tb2Rlc19jcmVhdGUobnZpc3VhbHMsIHNpemVvZihfX0dMY29udGV4dE1vZGVzKSk7CisgICAgaWYgKCFtb2RlcykKKwlyZXR1cm4gTlVMTDsKKworICAgIHByb3Bfc2l6ZSA9IG5wcm9wcyAqIF9fR0xYX1NJWkVfSU5UMzI7CisgICAgaWYgKHByb3Bfc2l6ZSA8PSBzaXplb2YoYnVmKSkKKwlwcm9wcyA9IGJ1ZjsKKyAgICBlbHNlCisJcHJvcHMgPSBYbWFsbG9jKHByb3Bfc2l6ZSk7CisKKyAgICAvKiBSZWFkIGVhY2ggY29uZmlnIHN0cnVjdHVyZSBhbmQgY29udmVydCBpdCBpbnRvIG91ciBmb3JtYXQgKi8KKyAgICBtID0gbW9kZXM7CisgICAgZm9yIChpID0gMDsgaSA8IG52aXN1YWxzOyBpKyspIHsKKwlfWFJlYWQoZHB5LCAoY2hhciAqKXByb3BzLCBwcm9wX3NpemUpOworCS8qIE9sZGVyIFggc2VydmVycyBkb24ndCBzZW5kIHRoaXMgc28gd2UgZGVmYXVsdCBpdCBoZXJlLiAqLworCW0tPmRyYXdhYmxlVHlwZSA9IEdMWF9XSU5ET1dfQklUOworCV9fZ2xYSW5pdGlhbGl6ZVZpc3VhbENvbmZpZ0Zyb21UYWdzKG0sIG5wcm9wcywgcHJvcHMsCisJCQkJCSAgICB0YWdnZWRfb25seSwgR0xfVFJVRSk7CisJbS0+c2NyZWVuID0gc2NyZWVuOworCW0gPSBtLT5uZXh0OwogICAgIH0KIAotICAgIHhyZWN0cyA9IG1hbGxvYyhzaXplb2YoWFJlY3RhbmdsZSkgKiBudW1fcmVjdHMpOwotICAgIGlmICh4cmVjdHMgPT0gTlVMTCkKLQlyZXR1cm47CisgICAgaWYgKHByb3BzICE9IGJ1ZikKKwlYZnJlZShwcm9wcyk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlY3RzOyBpKyspIHsKLQl4cmVjdHNbaV0ueCA9IHJlY3RzW2ldLngxICsgeF9vZmY7Ci0JeHJlY3RzW2ldLnkgPSByZWN0c1tpXS55MSArIHlfb2ZmOwotCXhyZWN0c1tpXS53aWR0aCA9IHJlY3RzW2ldLngyIC0gcmVjdHNbaV0ueDE7Ci0JeHJlY3RzW2ldLmhlaWdodCA9IHJlY3RzW2ldLnkyIC0gcmVjdHNbaV0ueTE7Ci0gICAgfQotICAgIHJlZ2lvbiA9IFhGaXhlc0NyZWF0ZVJlZ2lvbihkcHksIHhyZWN0cywgbnVtX3JlY3RzKTsKLSAgICBmcmVlKHhyZWN0cyk7Ci0gICAgWERhbWFnZUFkZChkcHksIGRyYXdhYmxlLCByZWdpb24pOwotICAgIFhGaXhlc0Rlc3Ryb3lSZWdpb24oZHB5LCByZWdpb24pOwotI2VuZGlmCisgICAgcmV0dXJuIG1vZGVzOwogfQogCi0vKioKLSAqIFRhYmxlIG9mIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUgbG9hZGVyIHRvIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyBjb25zdCBfX0RSSWludGVyZmFjZU1ldGhvZHMgaW50ZXJmYWNlX21ldGhvZHMgPSB7Ci0gICAgZ2V0X3Byb2NfYWRkcmVzcywKLQotICAgIF9nbF9jb250ZXh0X21vZGVzX2NyZWF0ZSwKLSAgICBfZ2xfY29udGV4dF9tb2Rlc19kZXN0cm95LAotICAgICAgCi0gICAgX19nbFhGaW5kRFJJU2NyZWVuLAotICAgIF9fZ2xYV2luZG93RXhpc3RzLAotICAgICAgCi0gICAgWEY4NkRSSUNyZWF0ZUNvbnRleHRXaXRoQ29uZmlnLAotICAgIFhGODZEUklEZXN0cm95Q29udGV4dCwKLQotICAgIFhGODZEUklDcmVhdGVEcmF3YWJsZSwKLSAgICBYRjg2RFJJRGVzdHJveURyYXdhYmxlLAotICAgIFhGODZEUklHZXREcmF3YWJsZUluZm8sCi0KLSAgICBfX2dsWEdldFVTVCwKLSAgICBfX2dsWEdldE1zY1JhdGVPTUwsCi0KLSAgICBfX2dsWFJlcG9ydERhbWFnZSwKLX07Ci0KLQotCi0vKioKLSAqIFBlcmZvcm0gdGhlIHJlcXVpcmVkIGxpYkdMLXNpZGUgaW5pdGlhbGl6YXRpb24gYW5kIGNhbGwgdGhlIGNsaWVudC1zaWRlCi0gKiBkcml2ZXIncyBcYyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jdGlvbi4KLSAqIAotICogXHBhcmFtIGRweSAgICBEaXNwbGF5IHBvaW50ZXIuCi0gKiBccGFyYW0gc2NybiAgIFNjcmVlbiBudW1iZXIgb24gdGhlIGRpc3BsYXkuCi0gKiBccGFyYW0gcHNjICAgIERSSSBzY3JlZW4gaW5mb3JtYXRpb24uCi0gKiBccGFyYW0gZHJpRHB5IERSSSBkaXNwbGF5IGluZm9ybWF0aW9uLgotICogXHBhcmFtIGNyZWF0ZU5ld1NjcmVlbiAgUG9pbnRlciB0byB0aGUgY2xpZW50LXNpZGUgZHJpdmVyJ3MKLSAqICAgICAgICAgICAgICAgXGMgX19kcmlDcmVhdGVOZXdTY3JlZW4gZnVuY3Rpb24uCi0gKiBccmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIFxjIF9fRFJJc2NyZWVuUHJpdmF0ZSBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkKLSAqICAgICAgICAgIHRoZSBjbGllbnQtc2lkZSBkcml2ZXIgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiBmYWlsdXJlLgotICogCi0gKiBcdG9kbyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIHJlbW92ZSBjb250ZXh0LW1vZGVzIGZyb20gdGhlCi0gKiAgICAgICBsaXN0IHN0b3JlZCBpbiB0aGUgXGMgX19HTFhzY3JlZW5Db25maWdzUmVjIHRvIG1hdGNoIHRoZSBsaXN0Ci0gKiAgICAgICByZXR1cm5lZCBieSB0aGUgY2xpZW50LXNpZGUgZHJpdmVyLgotICovCi1zdGF0aWMgdm9pZCAqCi1DYWxsQ3JlYXRlTmV3U2NyZWVuKERpc3BsYXkgKmRweSwgaW50IHNjcm4sIF9fRFJJc2NyZWVuICpwc2MsCi0JCSAgICBfX0RSSWRpc3BsYXkgKiBkcmlEcHksCi0JCSAgICBQRk5DUkVBVEVORVdTQ1JFRU5GVU5DIGNyZWF0ZU5ld1NjcmVlbikKK3N0YXRpYyBHTGJvb2xlYW4KK2dldFZpc3VhbENvbmZpZ3MoRGlzcGxheSAqZHB5LCBfX0dMWGRpc3BsYXlQcml2YXRlICpwcml2LCBpbnQgc2NyZWVuKQogewotICAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwID0gTlVMTDsKLSNpZm5kZWYgR0xYX1VTRV9BUFBMRUdMCi0gICAgZHJtX2hhbmRsZV90IGhTQVJFQTsKLSAgICBkcm1BZGRyZXNzIHBTQVJFQSA9IE1BUF9GQUlMRUQ7Ci0gICAgY2hhciAqQnVzSUQ7Ci0gICAgX19EUkl2ZXJzaW9uICAgZGR4X3ZlcnNpb247Ci0gICAgX19EUkl2ZXJzaW9uICAgZHJpX3ZlcnNpb247Ci0gICAgX19EUkl2ZXJzaW9uICAgZHJtX3ZlcnNpb247Ci0gICAgX19EUklmcmFtZWJ1ZmZlciAgZnJhbWVidWZmZXI7Ci0gICAgaW50ICAgZmQgPSAtMTsKLSAgICBpbnQgICBzdGF0dXM7Ci0gICAgY29uc3QgY2hhciAqIGVycl9tc2c7Ci0gICAgY29uc3QgY2hhciAqIGVycl9leHRyYTsKLSAgICBpbnQgYXBpX3ZlciA9IF9fZ2xYR2V0SW50ZXJuYWxWZXJzaW9uKCk7CisgICAgeEdMWEdldFZpc3VhbENvbmZpZ3NSZXEgKnJlcTsKKyAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYzsKKyAgICB4R0xYR2V0VmlzdWFsQ29uZmlnc1JlcGx5IHJlcGx5OworICAgIAorICAgIExvY2tEaXNwbGF5KGRweSk7CiAKKyAgICBwc2MgPSBwcml2LT5zY3JlZW5Db25maWdzICsgc2NyZWVuOworICAgIHBzYy0+dmlzdWFscyA9IE5VTEw7CisgICAgR2V0UmVxKEdMWEdldFZpc3VhbENvbmZpZ3MsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gcHJpdi0+bWFqb3JPcGNvZGU7CisgICAgcmVxLT5nbHhDb2RlID0gWF9HTFhHZXRWaXN1YWxDb25maWdzOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOwogCi0gICAgZHJpX3ZlcnNpb24ubWFqb3IgPSBkcmlEcHktPnByaXZhdGUtPmRyaU1ham9yOwotICAgIGRyaV92ZXJzaW9uLm1pbm9yID0gZHJpRHB5LT5wcml2YXRlLT5kcmlNaW5vcjsKLSAgICBkcmlfdmVyc2lvbi5wYXRjaCA9IGRyaURweS0+cHJpdmF0ZS0+ZHJpUGF0Y2g7CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSopICZyZXBseSwgMCwgRmFsc2UpKQorCWdvdG8gb3V0OwogCisgICAgcHNjLT52aXN1YWxzID0gY3JlYXRlQ29uZmlnc0Zyb21Qcm9wZXJ0aWVzKGRweSwKKwkJCQkJICAgICAgIHJlcGx5Lm51bVZpc3VhbHMsCisJCQkJCSAgICAgICByZXBseS5udW1Qcm9wcywKKwkJCQkJICAgICAgIHNjcmVlbiwgR0xfRkFMU0UpOwogCi0gICAgZXJyX21zZyA9ICJYRjg2RFJJT3BlbkNvbm5lY3Rpb24iOwotICAgIGVycl9leHRyYSA9IE5VTEw7Ci0KLSAgICBmcmFtZWJ1ZmZlci5iYXNlID0gTUFQX0ZBSUxFRDsKLSAgICBmcmFtZWJ1ZmZlci5kZXZfcHJpdiA9IE5VTEw7Ci0KLSAgICBpZiAoWEY4NkRSSU9wZW5Db25uZWN0aW9uKGRweSwgc2NybiwgJmhTQVJFQSwgJkJ1c0lEKSkgewotICAgICAgICBpbnQgbmV3bHlvcGVuZWQ7Ci0JZmQgPSBkcm1PcGVuT25jZShOVUxMLEJ1c0lELCAmbmV3bHlvcGVuZWQpOwotCVhmcmVlKEJ1c0lEKTsgLyogTm8gbG9uZ2VyIG5lZWRlZCAqLwotCi0JZXJyX21zZyA9ICJvcGVuIERSTSI7Ci0JZXJyX2V4dHJhID0gc3RyZXJyb3IoIC1mZCApOwotCi0JaWYgKGZkID49IDApIHsKLQkgICAgZHJtX21hZ2ljX3QgbWFnaWM7Ci0KLQkgICAgZXJyX21zZyA9ICJkcm1HZXRNYWdpYyI7Ci0JICAgIGVycl9leHRyYSA9IE5VTEw7Ci0KLQkgICAgaWYgKCFkcm1HZXRNYWdpYyhmZCwgJm1hZ2ljKSkgewotCQlkcm1WZXJzaW9uUHRyIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGZkKTsKLQkJaWYgKHZlcnNpb24pIHsKLQkJICAgIGRybV92ZXJzaW9uLm1ham9yID0gdmVyc2lvbi0+dmVyc2lvbl9tYWpvcjsKLQkJICAgIGRybV92ZXJzaW9uLm1pbm9yID0gdmVyc2lvbi0+dmVyc2lvbl9taW5vcjsKLQkJICAgIGRybV92ZXJzaW9uLnBhdGNoID0gdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsOwotCQkgICAgZHJtRnJlZVZlcnNpb24odmVyc2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBkcm1fdmVyc2lvbi5tYWpvciA9IC0xOwotCQkgICAgZHJtX3ZlcnNpb24ubWlub3IgPSAtMTsKLQkJICAgIGRybV92ZXJzaW9uLnBhdGNoID0gLTE7Ci0JCX0KLQotCQllcnJfbXNnID0gIlhGODZEUklBdXRoQ29ubmVjdGlvbiI7Ci0JCWlmICghbmV3bHlvcGVuZWQgfHwgWEY4NkRSSUF1dGhDb25uZWN0aW9uKGRweSwgc2NybiwgbWFnaWMpKSB7Ci0JCSAgICBjaGFyICpkcml2ZXJOYW1lOwotCi0JCSAgICAvKgotCQkgICAgICogR2V0IGRldmljZSBuYW1lIChsaWtlICJ0ZGZ4IikgYW5kIHRoZSBkZHggdmVyc2lvbgotCQkgICAgICogbnVtYmVycy4gIFdlJ2xsIGNoZWNrIHRoZSB2ZXJzaW9uIGluIGVhY2ggRFJJIGRyaXZlcidzCi0JCSAgICAgKiAiY3JlYXRlTmV3U2NyZWVuIiBmdW5jdGlvbi4KLQkJICAgICAqLwotCQkgICAgZXJyX21zZyA9ICJYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZSI7Ci0JCSAgICBpZiAoWEY4NkRSSUdldENsaWVudERyaXZlck5hbWUoZHB5LCBzY3JuLAotCQkJCQkJICAgJmRkeF92ZXJzaW9uLm1ham9yLAotCQkJCQkJICAgJmRkeF92ZXJzaW9uLm1pbm9yLAotCQkJCQkJICAgJmRkeF92ZXJzaW9uLnBhdGNoLAotCQkJCQkJICAgJmRyaXZlck5hbWUpKSB7Ci0JCQlkcm1faGFuZGxlX3QgIGhGQjsKLQkJCWludCAgICAgICAganVuazsKLQotCQkJLyogTm8gbG9uZ2VyIG5lZWRlZC4gKi8KLQkJCVhmcmVlKCBkcml2ZXJOYW1lICk7Ci0KLQotCQkJLyoKLQkJCSAqIEdldCBkZXZpY2Utc3BlY2lmaWMgaW5mby4gIHBEZXZQcml2IHdpbGwgcG9pbnQgdG8gYSBzdHJ1Y3QKLQkJCSAqIChzdWNoIGFzIERSSVJBREVPTlJlYyBpbiB4ZnJlZTg2L2RyaXZlci9hdGkvcmFkZW9uX2RyaS5oKQotCQkJICogdGhhdCBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmVlbiBzaXplLCBkZXB0aCwgcGl0Y2gsCi0JCQkgKiBhbmNpbGxpYXJ5IGJ1ZmZlcnMsIERSTSBtbWFwIGhhbmRsZXMsIGV0Yy4KLQkJCSAqLwotCQkJZXJyX21zZyA9ICJYRjg2RFJJR2V0RGV2aWNlSW5mbyI7Ci0JCQlpZiAoWEY4NkRSSUdldERldmljZUluZm8oZHB5LCBzY3JuLAotCQkJCQkJICZoRkIsCi0JCQkJCQkgJmp1bmssCi0JCQkJCQkgJmZyYW1lYnVmZmVyLnNpemUsCi0JCQkJCQkgJmZyYW1lYnVmZmVyLnN0cmlkZSwKLQkJCQkJCSAmZnJhbWVidWZmZXIuZGV2X3ByaXZfc2l6ZSwKLQkJCQkJCSAmZnJhbWVidWZmZXIuZGV2X3ByaXYpKSB7Ci0JCQkgICAgZnJhbWVidWZmZXIud2lkdGggPSBEaXNwbGF5V2lkdGgoZHB5LCBzY3JuKTsKLQkJCSAgICBmcmFtZWJ1ZmZlci5oZWlnaHQgPSBEaXNwbGF5SGVpZ2h0KGRweSwgc2Nybik7Ci0KLQkJCSAgICAvKgotCQkJICAgICAqIE1hcCB0aGUgZnJhbWVidWZmZXIgcmVnaW9uLgotCQkJICAgICAqLwotCQkJICAgIHN0YXR1cyA9IGRybU1hcChmZCwgaEZCLCBmcmFtZWJ1ZmZlci5zaXplLCAKLQkJCQkJICAgIChkcm1BZGRyZXNzUHRyKSZmcmFtZWJ1ZmZlci5iYXNlKTsKLQotCQkJICAgIGVycl9tc2cgPSAiZHJtTWFwIG9mIGZyYW1lYnVmZmVyIjsKLQkJCSAgICBlcnJfZXh0cmEgPSBzdHJlcnJvciggLXN0YXR1cyApOwotCi0JCQkgICAgaWYgKCBzdGF0dXMgPT0gMCApIHsKLQkJCQkvKgotCQkJCSAqIE1hcCB0aGUgU0FSRUEgcmVnaW9uLiAgRnVydGhlciBtbWFwIHJlZ2lvbnMKLQkJCQkgKiBtYXkgYmUgc2V0dXAgaW4gZWFjaCBEUkkgZHJpdmVyJ3MKLQkJCQkgKiAiY3JlYXRlTmV3U2NyZWVuIiBmdW5jdGlvbi4KLQkJCQkgKi8KLQkJCQlzdGF0dXMgPSBkcm1NYXAoZmQsIGhTQVJFQSwgU0FSRUFfTUFYLCAKLQkJCQkJCSZwU0FSRUEpOwotCi0JCQkJZXJyX21zZyA9ICJkcm1NYXAgb2Ygc2FyZWEiOwotCQkJCWVycl9leHRyYSA9IHN0cmVycm9yKCAtc3RhdHVzICk7Ci0KLQkJCQlpZiAoIHN0YXR1cyA9PSAwICkgewotCQkJCSAgICBfX0dMY29udGV4dE1vZGVzICogZHJpdmVyX21vZGVzID0gTlVMTDsKLQkJCQkgICAgX19HTFhzY3JlZW5Db25maWdzICpjb25maWdzID0gcHNjLT5zY3JlZW5Db25maWdzOwotCi0JCQkJICAgIGVycl9tc2cgPSAiSW5pdERyaXZlciI7Ci0JCQkJICAgIGVycl9leHRyYSA9IE5VTEw7Ci0JCQkJICAgIHBzcCA9ICgqY3JlYXRlTmV3U2NyZWVuKShkcHksIHNjcm4sCi0JCQkJCQkJICAgICBwc2MsCi0JCQkJCQkJICAgICBjb25maWdzLT5jb25maWdzLAotCQkJCQkJCSAgICAgJiBkZHhfdmVyc2lvbiwKLQkJCQkJCQkgICAgICYgZHJpX3ZlcnNpb24sCi0JCQkJCQkJICAgICAmIGRybV92ZXJzaW9uLAotCQkJCQkJCSAgICAgJiBmcmFtZWJ1ZmZlciwKLQkJCQkJCQkgICAgIHBTQVJFQSwKLQkJCQkJCQkgICAgIGZkLAotCQkJCQkJCSAgICAgYXBpX3ZlciwKLQkJCQkJCQkgICAgICYgaW50ZXJmYWNlX21ldGhvZHMsCi0JCQkJCQkJICAgICAmIGRyaXZlcl9tb2RlcyApOwotCi0JCQkJICAgIGZpbHRlcl9tb2RlcyggJiBjb25maWdzLT5jb25maWdzLAotCQkJCQkJICBkcml2ZXJfbW9kZXMgKTsKLQkJCQkgICAgX2dsX2NvbnRleHRfbW9kZXNfZGVzdHJveSggZHJpdmVyX21vZGVzICk7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGlmICggcHNwID09IE5VTEwgKSB7Ci0JaWYgKCBwU0FSRUEgIT0gTUFQX0ZBSUxFRCApIHsKLQkgICAgKHZvaWQpZHJtVW5tYXAocFNBUkVBLCBTQVJFQV9NQVgpOwotCX0KLQotCWlmICggZnJhbWVidWZmZXIuYmFzZSAhPSBNQVBfRkFJTEVEICkgewotCSAgICAodm9pZClkcm1Vbm1hcCgoZHJtQWRkcmVzcylmcmFtZWJ1ZmZlci5iYXNlLCBmcmFtZWJ1ZmZlci5zaXplKTsKLQl9Ci0KLQlpZiAoIGZyYW1lYnVmZmVyLmRldl9wcml2ICE9IE5VTEwgKSB7Ci0JICAgIFhmcmVlKGZyYW1lYnVmZmVyLmRldl9wcml2KTsKLQl9Ci0KLQlpZiAoIGZkID49IDAgKSB7Ci0JICAgICh2b2lkKWRybUNsb3NlT25jZShmZCk7Ci0JfQotCi0JKHZvaWQpWEY4NkRSSUNsb3NlQ29ubmVjdGlvbihkcHksIHNjcm4pOwotCi0JaWYgKCBlcnJfZXh0cmEgIT0gTlVMTCApIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJsaWJHTCBlcnJvcjogJXMgZmFpbGVkICglcylcbiIsIGVycl9tc2csCi0JCSAgICBlcnJfZXh0cmEpOwotCX0KLQllbHNlIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJsaWJHTCBlcnJvcjogJXMgZmFpbGVkXG4iLCBlcnJfbXNnICk7Ci0JfQotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGliR0wgZXJyb3I6IHJldmVydGluZyB0byAoc2xvdykgaW5kaXJlY3QgcmVuZGVyaW5nXG4iKTsKLSAgICB9Ci0jZW5kaWYgLyogIUdMWF9VU0VfQVBQTEVHTCAqLwotCi0gICAgcmV0dXJuIHBzcDsKKyBvdXQ6CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIHJldHVybiBwc2MtPnZpc3VhbHMgIT0gTlVMTDsKIH0KLSNlbmRpZiAvKiBHTFhfRElSRUNUX1JFTkRFUklORyAqLwogCitzdGF0aWMgR0xib29sZWFuCitnZXRGQkNvbmZpZ3MoRGlzcGxheSAqZHB5LCBfX0dMWGRpc3BsYXlQcml2YXRlICpwcml2LCBpbnQgc2NyZWVuKQoreworICAgIHhHTFhHZXRGQkNvbmZpZ3NSZXEgKmZiX3JlcTsKKyAgICB4R0xYR2V0RkJDb25maWdzU0dJWFJlcSAqc2dpX3JlcTsKKyAgICB4R0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseVJlcSAqdnByZXE7CisgICAgeEdMWEdldEZCQ29uZmlnc1JlcGx5IHJlcGx5OworICAgIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjOworCisgICAgcHNjID0gcHJpdi0+c2NyZWVuQ29uZmlncyArIHNjcmVlbjsKKyAgICBwc2MtPnNlcnZlckdMWGV4dHMgPSBfX2dsWEdldFN0cmluZ0Zyb21TZXJ2ZXIoZHB5LCBwcml2LT5tYWpvck9wY29kZSwKKwkJCQkJCSAgWF9HTFhRdWVyeVNlcnZlclN0cmluZywKKwkJCQkJCSAgc2NyZWVuLCBHTFhfRVhURU5TSU9OUyk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworCisgICAgcHNjLT5jb25maWdzID0gTlVMTDsKKyAgICBpZiAoYXRvZihwcml2LT5zZXJ2ZXJHTFh2ZXJzaW9uKSA+PSAxLjMpIHsKKwlHZXRSZXEoR0xYR2V0RkJDb25maWdzLCBmYl9yZXEpOworCWZiX3JlcS0+cmVxVHlwZSA9IHByaXYtPm1ham9yT3Bjb2RlOworCWZiX3JlcS0+Z2x4Q29kZSA9IFhfR0xYR2V0RkJDb25maWdzOworCWZiX3JlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHBzYy0+c2VydmVyR0xYZXh0cywgIkdMWF9TR0lYX2ZiY29uZmlnIikgIT0gTlVMTCkgeworCUdldFJlcUV4dHJhKEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHksCisJCSAgICBzel94R0xYR2V0RkJDb25maWdzU0dJWFJlcSArCisJCSAgICBzel94R0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseVJlcSwgdnByZXEpOworCXNnaV9yZXEgPSAoeEdMWEdldEZCQ29uZmlnc1NHSVhSZXEgKikgdnByZXE7CisJc2dpX3JlcS0+cmVxVHlwZSA9IHByaXYtPm1ham9yT3Bjb2RlOworCXNnaV9yZXEtPmdseENvZGUgPSBYX0dMWFZlbmRvclByaXZhdGVXaXRoUmVwbHk7CisJc2dpX3JlcS0+dmVuZG9yQ29kZSA9IFhfR0xYdm9wX0dldEZCQ29uZmlnc1NHSVg7CisJc2dpX3JlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIH0gZWxzZQorCWdvdG8gb3V0OworCisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSopICZyZXBseSwgMCwgRmFsc2UpKQorCWdvdG8gb3V0OworCisgICAgcHNjLT5jb25maWdzID0gY3JlYXRlQ29uZmlnc0Zyb21Qcm9wZXJ0aWVzKGRweSwKKwkJCQkJICAgICAgIHJlcGx5Lm51bUZCQ29uZmlncywKKwkJCQkJICAgICAgIHJlcGx5Lm51bUF0dHJpYnMgKiAyLAorCQkJCQkgICAgICAgc2NyZWVuLCBHTF9UUlVFKTsKKworIG91dDoKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgcmV0dXJuIHBzYy0+Y29uZmlncyAhPSBOVUxMOworfQogCiAvKgogKiogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHBlciBzY3JlZW4gY29uZmlncyBmb3IgZWFjaCBzY3JlZW4uCkBAIC0xMDA2LDE3ICs1NzQsOCBAQAogKi8KIHN0YXRpYyBCb29sIEFsbG9jQW5kRmV0Y2hTY3JlZW5Db25maWdzKERpc3BsYXkgKmRweSwgX19HTFhkaXNwbGF5UHJpdmF0ZSAqcHJpdikKIHsKLSAgICB4R0xYR2V0VmlzdWFsQ29uZmlnc1JlcSAqcmVxOwotICAgIHhHTFhHZXRGQkNvbmZpZ3NSZXEgKmZiX3JlcTsKLSAgICB4R0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseVJlcSAqdnByZXE7Ci0gICAgeEdMWEdldEZCQ29uZmlnc1NHSVhSZXEgKnNnaV9yZXE7Ci0gICAgeEdMWEdldFZpc3VhbENvbmZpZ3NSZXBseSByZXBseTsKICAgICBfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYzsKLSAgICBfX0dMY29udGV4dE1vZGVzICpjb25maWc7Ci0gICAgR0xpbnQgaSwgaiwgbnByb3BzLCBzY3JlZW5zOwotICAgIElOVDMyIGJ1ZltfX0dMWF9UT1RBTF9DT05GSUddLCAqcHJvcHM7Ci0gICAgdW5zaWduZWQgc3VwcG9ydGVkX3JlcXVlc3QgPSAwOwotICAgIHVuc2lnbmVkIHByb3Bfc2l6ZTsKKyAgICBHTGludCBpLCBzY3JlZW5zOwogCiAgICAgLyoKICAgICAqKiBGaXJzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhcnJheSBvZiBwZXIgc2NyZWVuIGNvbmZpZ3MuCkBAIC0xMDMwLDE1OSArNTg5LDM2IEBACiAgICAgcHJpdi0+c2NyZWVuQ29uZmlncyA9IHBzYzsKICAgICAKICAgICBwcml2LT5zZXJ2ZXJHTFh2ZXJzaW9uID0gX19nbFhHZXRTdHJpbmdGcm9tU2VydmVyKGRweSwgcHJpdi0+bWFqb3JPcGNvZGUsCi0JCQkJCSBYX0dMWFF1ZXJ5U2VydmVyU3RyaW5nLAotCQkJCQkgMCwgR0xYX1ZFUlNJT04pOworCQkJCQkJICAgICAgWF9HTFhRdWVyeVNlcnZlclN0cmluZywKKwkJCQkJCSAgICAgIDAsIEdMWF9WRVJTSU9OKTsKICAgICBpZiAoIHByaXYtPnNlcnZlckdMWHZlcnNpb24gPT0gTlVMTCApIHsKIAlGcmVlU2NyZWVuQ29uZmlncyhwcml2KTsKIAlyZXR1cm4gR0xfRkFMU0U7CiAgICAgfQogCi0gICAgaWYgKCBhdG9mKCBwcml2LT5zZXJ2ZXJHTFh2ZXJzaW9uICkgPj0gMS4zICkgewotCXN1cHBvcnRlZF9yZXF1ZXN0ID0gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIE5vdyBmZXRjaCBlYWNoIHNjcmVlbnMgY29uZmlncyBzdHJ1Y3R1cmVzLiAgSWYgYSBzY3JlZW4gc3VwcG9ydHMKLSAgICAqKiBHTCAoYnkgcmV0dXJuaW5nIGEgbnVtVmlzdWFscyA+IDApIHRoZW4gYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIKLSAgICAqKiBjb25maWcgc3RydWN0dXJlIGFuZCB0aGVuIGZpbGwgaXQgaW4uCi0gICAgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgc2NyZWVuczsgaSsrLCBwc2MrKykgewotCWlmICggc3VwcG9ydGVkX3JlcXVlc3QgIT0gMSApIHsKLQkgICAgcHNjLT5zZXJ2ZXJHTFhleHRzID0gX19nbFhHZXRTdHJpbmdGcm9tU2VydmVyKGRweSwgcHJpdi0+bWFqb3JPcGNvZGUsCi0JCQkJCQkJICBYX0dMWFF1ZXJ5U2VydmVyU3RyaW5nLAotCQkJCQkJCSAgaSwgR0xYX0VYVEVOU0lPTlMpOwotCSAgICBpZiAoIHN0cnN0ciggcHNjLT5zZXJ2ZXJHTFhleHRzLCAiR0xYX1NHSVhfZmJjb25maWciICkgIT0gTlVMTCApIHsKLQkJc3VwcG9ydGVkX3JlcXVlc3QgPSAyOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlzdXBwb3J0ZWRfcmVxdWVzdCA9IDM7Ci0JICAgIH0KLQl9Ci0KLQotCUxvY2tEaXNwbGF5KGRweSk7Ci0Jc3dpdGNoKCBzdXBwb3J0ZWRfcmVxdWVzdCApIHsKLQkgICAgY2FzZSAxOgotCSAgICBHZXRSZXEoR0xYR2V0RkJDb25maWdzLGZiX3JlcSk7Ci0JICAgIGZiX3JlcS0+cmVxVHlwZSA9IHByaXYtPm1ham9yT3Bjb2RlOwotCSAgICBmYl9yZXEtPmdseENvZGUgPSBYX0dMWEdldEZCQ29uZmlnczsKLQkgICAgZmJfcmVxLT5zY3JlZW4gPSBpOwotCSAgICBicmVhazsKLQkgICAKLQkgICAgY2FzZSAyOgotCSAgICBHZXRSZXFFeHRyYShHTFhWZW5kb3JQcml2YXRlV2l0aFJlcGx5LAotCQkJc3pfeEdMWEdldEZCQ29uZmlnc1NHSVhSZXEtc3pfeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEsdnByZXEpOwotCSAgICBzZ2lfcmVxID0gKHhHTFhHZXRGQkNvbmZpZ3NTR0lYUmVxICopIHZwcmVxOwotCSAgICBzZ2lfcmVxLT5yZXFUeXBlID0gcHJpdi0+bWFqb3JPcGNvZGU7Ci0JICAgIHNnaV9yZXEtPmdseENvZGUgPSBYX0dMWFZlbmRvclByaXZhdGVXaXRoUmVwbHk7Ci0JICAgIHNnaV9yZXEtPnZlbmRvckNvZGUgPSBYX0dMWHZvcF9HZXRGQkNvbmZpZ3NTR0lYOwotCSAgICBzZ2lfcmVxLT5zY3JlZW4gPSBpOwotCSAgICBicmVhazsKLQotCSAgICBjYXNlIDM6Ci0JICAgIEdldFJlcShHTFhHZXRWaXN1YWxDb25maWdzLHJlcSk7Ci0JICAgIHJlcS0+cmVxVHlwZSA9IHByaXYtPm1ham9yT3Bjb2RlOwotCSAgICByZXEtPmdseENvZGUgPSBYX0dMWEdldFZpc3VhbENvbmZpZ3M7Ci0JICAgIHJlcS0+c2NyZWVuID0gaTsKLQkgICAgYnJlYWs7Ci0gCX0KLQotCWlmICghX1hSZXBseShkcHksICh4UmVwbHkqKSAmcmVwbHksIDAsIEZhbHNlKSkgewotCSAgICAvKiBTb21ldGhpbmcgaXMgYnVzdGVkLiBQdW50LiAqLwotCSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0JICAgIFN5bmNIYW5kbGUoKTsKLQkgICAgRnJlZVNjcmVlbkNvbmZpZ3MocHJpdik7Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQl9Ci0KLQlpZiAoIXJlcGx5Lm51bVZpc3VhbHMpIHsKLQkgICAgLyogVGhpcyBzY3JlZW4gZG9lcyBub3Qgc3VwcG9ydCBHTCByZW5kZXJpbmcgKi8KLQkgICAgVW5sb2NrRGlzcGxheShkcHkpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQkvKiBGSVhNRTogSXMgdGhlIF9fR0xYX01JTl9DT05GSUdfUFJPUFMgdGVzdCBjb3JyZWN0IGZvcgotCSAqIEZJWE1FOiBGQmNvbmZpZ3M/IAotCSAqLwotCS8qIENoZWNrIG51bWJlciBvZiBwcm9wZXJ0aWVzICovCi0JbnByb3BzID0gcmVwbHkubnVtUHJvcHM7Ci0JaWYgKChucHJvcHMgPCBfX0dMWF9NSU5fQ09ORklHX1BST1BTKSB8fAotCSAgICAobnByb3BzID4gX19HTFhfTUFYX0NPTkZJR19QUk9QUykpIHsKLQkgICAgLyogSHVoPyAgTm90IGluIHByb3RvY29sIGRlZmluZWQgbGltaXRzLiAgUHVudCAqLwotCSAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0JICAgIFN5bmNIYW5kbGUoKTsKLQkgICAgRnJlZVNjcmVlbkNvbmZpZ3MocHJpdik7Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBjb25maWcgc3RydWN0dXJlICovCi0JcHNjLT5jb25maWdzID0gX2dsX2NvbnRleHRfbW9kZXNfY3JlYXRlKHJlcGx5Lm51bVZpc3VhbHMsCi0JCQkJCQlzaXplb2YoX19HTGNvbnRleHRNb2RlcykpOwotCWlmICghcHNjLT5jb25maWdzKSB7Ci0JICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLQkgICAgU3luY0hhbmRsZSgpOwotCSAgICBGcmVlU2NyZWVuQ29uZmlncyhwcml2KTsKLQkgICAgcmV0dXJuIEdMX0ZBTFNFOwotCX0KLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHByb3BlcnRpZXMsIGlmIG5lZWRlZCAqLwotCWlmICggc3VwcG9ydGVkX3JlcXVlc3QgIT0gMyApIHsKLQkgICAgbnByb3BzICo9IDI7Ci0JfQotCi0JcHJvcF9zaXplID0gbnByb3BzICogX19HTFhfU0laRV9JTlQzMjsKLQotCWlmIChwcm9wX3NpemUgPD0gc2l6ZW9mKGJ1ZikpIHsKLSAJICAgIHByb3BzID0gYnVmOwotIAl9IGVsc2UgewotCSAgICBwcm9wcyA9IChJTlQzMiAqKSBYbWFsbG9jKHByb3Bfc2l6ZSk7Ci0gCX0gCi0KLQkvKiBSZWFkIGVhY2ggY29uZmlnIHN0cnVjdHVyZSBhbmQgY29udmVydCBpdCBpbnRvIG91ciBmb3JtYXQgKi8KLSAgICAgICAgY29uZmlnID0gcHNjLT5jb25maWdzOwotCWZvciAoaiA9IDA7IGogPCByZXBseS5udW1WaXN1YWxzOyBqKyspIHsKLQkgICAgYXNzZXJ0KCBjb25maWcgIT0gTlVMTCApOwotCSAgICBfWFJlYWQoZHB5LCAoY2hhciAqKXByb3BzLCBwcm9wX3NpemUpOwotCi0JICAgIGlmICggc3VwcG9ydGVkX3JlcXVlc3QgIT0gMyApIHsKLQkJY29uZmlnLT5yZ2JNb2RlID0gR0xfVFJVRTsKLQkJY29uZmlnLT5kcmF3YWJsZVR5cGUgPSBHTFhfV0lORE9XX0JJVDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJY29uZmlnLT5kcmF3YWJsZVR5cGUgPSBHTFhfV0lORE9XX0JJVCB8IEdMWF9QSVhNQVBfQklUOwotCSAgICB9Ci0KLQkgICAgX19nbFhJbml0aWFsaXplVmlzdWFsQ29uZmlnRnJvbVRhZ3MoIGNvbmZpZywgbnByb3BzLCBwcm9wcywKLQkJCQkJCSAoc3VwcG9ydGVkX3JlcXVlc3QgIT0gMyksCi0JCQkJCQkgR0xfVFJVRSApOwotCSAgICBpZiAoIGNvbmZpZy0+ZmJjb25maWdJRCA9PSBHTFhfRE9OVF9DQVJFICkgewotCQljb25maWctPmZiY29uZmlnSUQgPSBjb25maWctPnZpc3VhbElEOwotCSAgICB9Ci0JICAgIGNvbmZpZy0+c2NyZWVuID0gaTsKLQkgICAgY29uZmlnID0gY29uZmlnLT5uZXh0OwotCX0KLQlpZiAocHJvcHMgIT0gYnVmKSB7Ci0JICAgIFhmcmVlKChjaGFyICopcHJvcHMpOwotCX0KLQlVbmxvY2tEaXNwbGF5KGRweSk7CisJZ2V0VmlzdWFsQ29uZmlncyhkcHksIHByaXYsIGkpOworCWdldEZCQ29uZmlncyhkcHksIHByaXYsIGkpOwogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLSAgICAgICAgLyogSW5pdGlhbGl6ZSBwZXIgc2NyZWVuIGR5bmFtaWMgY2xpZW50IEdMWCBleHRlbnNpb25zICovCi0JcHNjLT5leHRfbGlzdF9maXJzdF90aW1lID0gR0xfVFJVRTsKLQkvKiBJbml0aWFsaXplIHRoZSBkaXJlY3QgcmVuZGVyaW5nIHBlciBzY3JlZW4gZGF0YSBhbmQgZnVuY3Rpb25zICovCi0JaWYgKHByaXYtPmRyaURpc3BsYXkucHJpdmF0ZSAhPSBOVUxMKSB7Ci0JICAgIC8qIEZJWE1FOiBTaG91bGQgaXQgYmUgc29tZSBzb3J0IG9mIGFuIGVycm9yIGlmIGNyZWF0ZU5ld1NjcmVlbltpXQotCSAgICAgKiBGSVhNRTogaXMgTlVMTD8KLQkgICAgICovCi0JICAgIGlmIChwcml2LT5kcmlEaXNwbGF5LmNyZWF0ZU5ld1NjcmVlbiAmJgotCQlwcml2LT5kcmlEaXNwbGF5LmNyZWF0ZU5ld1NjcmVlbltpXSkgeworCXBzYy0+c2NyID0gaTsKKwlwc2MtPmRweSA9IGRweTsKKwlwc2MtPmRyYXdIYXNoID0gX19nbHhIYXNoQ3JlYXRlKCk7CisJaWYgKHBzYy0+ZHJhd0hhc2ggPT0gTlVMTCkKKwkgICAgY29udGludWU7CiAKLQkJcHNjLT5kcmlTY3JlZW4uc2NyZWVuQ29uZmlncyA9ICh2b2lkICopcHNjOwotCQlwc2MtPmRyaVNjcmVlbi5wcml2YXRlID0KLQkJICAgIENhbGxDcmVhdGVOZXdTY3JlZW4oZHB5LCBpLCAmIHBzYy0+ZHJpU2NyZWVuLAotCQkJCQkmIHByaXYtPmRyaURpc3BsYXksCi0JCQkJCXByaXYtPmRyaURpc3BsYXkuY3JlYXRlTmV3U2NyZWVuW2ldICk7Ci0JICAgIH0KKwlpZiAocHJpdi0+ZHJpMkRpc3BsYXkpCisJICAgIHBzYy0+ZHJpU2NyZWVuID0gKCpwcml2LT5kcmkyRGlzcGxheS0+Y3JlYXRlU2NyZWVuKShwc2MsIGksIHByaXYpOworCisJaWYgKHBzYy0+ZHJpU2NyZWVuID09IE5VTEwgJiYgcHJpdi0+ZHJpRGlzcGxheSkKKwkgICAgcHNjLT5kcmlTY3JlZW4gPSAoKnByaXYtPmRyaURpc3BsYXktPmNyZWF0ZVNjcmVlbikocHNjLCBpLCBwcml2KTsKKworCWlmIChwc2MtPmRyaVNjcmVlbiA9PSBOVUxMICYmIHByaXYtPmRyaXN3RGlzcGxheSkKKwkgICAgcHNjLT5kcmlTY3JlZW4gPSAoKnByaXYtPmRyaXN3RGlzcGxheS0+Y3JlYXRlU2NyZWVuKShwc2MsIGksIHByaXYpOworCisJaWYgKHBzYy0+ZHJpU2NyZWVuID09IE5VTEwpIHsKKwkgICAgX19nbHhIYXNoRGVzdHJveShwc2MtPmRyYXdIYXNoKTsKKwkgICAgcHNjLT5kcmF3SGFzaCA9IE5VTEw7CiAJfQogI2VuZGlmCiAgICAgfQpAQCAtMTE5MywxMyArNjI5LDE2IEBACiAvKgogKiogSW5pdGlhbGl6ZSB0aGUgY2xpZW50IHNpZGUgZXh0ZW5zaW9uIGNvZGUuCiAqLwotX19HTFhkaXNwbGF5UHJpdmF0ZSAqX19nbFhJbml0aWFsaXplKERpc3BsYXkqIGRweSkKK19YX0hJRERFTiBfX0dMWGRpc3BsYXlQcml2YXRlICpfX2dsWEluaXRpYWxpemUoRGlzcGxheSogZHB5KQogewogICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IF9fZ2xYRmluZERpc3BsYXkoZHB5KTsKICAgICBYRXh0RGF0YSAqKnByaXZMaXN0LCAqcHJpdmF0ZSwgKmZvdW5kOwogICAgIF9fR0xYZGlzcGxheVByaXZhdGUgKmRweVByaXY7CiAgICAgWEVEYXRhT2JqZWN0IGRhdGFPYmo7CiAgICAgaW50IG1ham9yLCBtaW5vcjsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIEJvb2wgZ2x4X2RpcmVjdCwgZ2x4X2FjY2VsOworI2VuZGlmCiAKICNpZiBkZWZpbmVkKFVTRV9YVEhSRUFEUykKICAgICB7CkBAIC0xMjY3LDE1ICs3MDYsMjAgQEAKICAgICBkcHlQcml2LT5zZXJ2ZXJHTFh2ZXJzaW9uID0gMHgwOwogCiAjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBnbHhfZGlyZWN0ID0gKGdldGVudigiTElCR0xfQUxXQVlTX0lORElSRUNUIikgPT0gTlVMTCk7CisgICAgZ2x4X2FjY2VsID0gKGdldGVudigiTElCR0xfQUxXQVlTX1NPRlRXQVJFIikgPT0gTlVMTCk7CisKICAgICAvKgogICAgICoqIEluaXRpYWxpemUgdGhlIGRpcmVjdCByZW5kZXJpbmcgcGVyIGRpc3BsYXkgZGF0YSBhbmQgZnVuY3Rpb25zLgogICAgICoqIE5vdGU6IFRoaXMgX211c3RfIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIERSSSByb3V0aW5lcwogICAgICoqIChlLmcuLCB0aG9zZSBjYWxsZWQgaW4gQWxsb2NBbmRGZXRjaFNjcmVlbkNvbmZpZ3MpLgogICAgICovCi0gICAgaWYgKGdldGVudigiTElCR0xfQUxXQVlTX0lORElSRUNUIikgPT0gTlVMTCkgewotICAgICAgICBkcHlQcml2LT5kcmlEaXNwbGF5LnByaXZhdGUgPQotICAgICAgICAgICAgZHJpQ3JlYXRlRGlzcGxheShkcHksICZkcHlQcml2LT5kcmlEaXNwbGF5KTsKKyAgICBpZiAoZ2x4X2RpcmVjdCAmJiBnbHhfYWNjZWwpIHsKKwlkcHlQcml2LT5kcmkyRGlzcGxheSA9IGRyaTJDcmVhdGVEaXNwbGF5KGRweSk7CisJZHB5UHJpdi0+ZHJpRGlzcGxheSA9IGRyaUNyZWF0ZURpc3BsYXkoZHB5KTsKICAgICB9CisgICAgaWYgKGdseF9kaXJlY3QpCisJZHB5UHJpdi0+ZHJpc3dEaXNwbGF5ID0gZHJpc3dDcmVhdGVEaXNwbGF5KGRweSk7CiAjZW5kaWYKIAogICAgIGlmICghQWxsb2NBbmRGZXRjaFNjcmVlbkNvbmZpZ3MoZHB5LCBkcHlQcml2KSkgewpAQCAtMTMwOCw3ICs3NTIsNyBAQAogKiogU2V0dXAgZm9yIHNlbmRpbmcgYSBHTFggY29tbWFuZCBvbiBkcHkuICBNYWtlIHN1cmUgdGhlIGV4dGVuc2lvbiBpcwogKiogaW5pdGlhbGl6ZWQuICBUcnkgdG8gYXZvaWQgY2FsbGluZyBfX2dsWEluaXRpYWxpemUgYXMgaXRzIGtpbmRhIHNsb3cuCiAqLwotQ0FSRDggX19nbFhTZXR1cEZvckNvbW1hbmQoRGlzcGxheSAqZHB5KQorX1hfSElEREVOIENBUkQ4IF9fZ2xYU2V0dXBGb3JDb21tYW5kKERpc3BsYXkgKmRweSkKIHsKICAgICBHTFhDb250ZXh0IGdjOwogICAgIF9fR0xYZGlzcGxheVByaXZhdGUgKnByaXY7CkBAIC0xMzQ5LDcgKzc5Myw3IEBACiAgKiBNb2RpZnkgdGhpcyBmdW5jdGlvbiB0byB1c2UgXGMgY3R4LT5wYyBpbnN0ZWFkIG9mIHRoZSBleHBsaWNpdAogICogXGMgcGMgcGFyYW1ldGVyLgogICovCi1HTHVieXRlICpfX2dsWEZsdXNoUmVuZGVyQnVmZmVyKF9fR0xYY29udGV4dCAqY3R4LCBHTHVieXRlICpwYykKK19YX0hJRERFTiBHTHVieXRlICpfX2dsWEZsdXNoUmVuZGVyQnVmZmVyKF9fR0xYY29udGV4dCAqY3R4LCBHTHVieXRlICpwYykKIHsKICAgICBEaXNwbGF5ICogY29uc3QgZHB5ID0gY3R4LT5jdXJyZW50RHB5OwogI2lmZGVmIFVTRV9YQ0IKQEAgLTEzNjEsNyArODA1LDggQEAKIAogICAgIGlmICggKGRweSAhPSBOVUxMKSAmJiAoc2l6ZSA+IDApICkgewogI2lmZGVmIFVTRV9YQ0IKLQl4Y2JfZ2x4X3JlbmRlcihjLCBjdHgtPmN1cnJlbnRDb250ZXh0VGFnLCBzaXplLCAoY2hhciAqKWN0eC0+YnVmKTsKKwl4Y2JfZ2x4X3JlbmRlcihjLCBjdHgtPmN1cnJlbnRDb250ZXh0VGFnLCBzaXplLAorCQkgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiljdHgtPmJ1Zik7CiAjZWxzZQogCS8qIFNlbmQgdGhlIGVudGlyZSBidWZmZXIgYXMgYW4gWCByZXF1ZXN0ICovCiAJTG9ja0Rpc3BsYXkoZHB5KTsKQEAgLTEzOTgsOSArODQzLDkgQEAKICAqIFxwYXJhbSBkYXRhICAgICAgICAgICBDb21tYW5kIGRhdGEuCiAgKiBccGFyYW0gZGF0YUxlbiAgICAgICAgU2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBjb21tYW5kIGRhdGEuCiAgKi8KLXZvaWQgX19nbFhTZW5kTGFyZ2VDaHVuayhfX0dMWGNvbnRleHQgKmdjLCBHTGludCByZXF1ZXN0TnVtYmVyLCAKLQkJCSBHTGludCB0b3RhbFJlcXVlc3RzLAotCQkJIGNvbnN0IEdMdm9pZCAqIGRhdGEsIEdMaW50IGRhdGFMZW4pCitfWF9ISURERU4gdm9pZCBfX2dsWFNlbmRMYXJnZUNodW5rKF9fR0xYY29udGV4dCAqZ2MsIEdMaW50IHJlcXVlc3ROdW1iZXIsIAorCQkJCSAgIEdMaW50IHRvdGFsUmVxdWVzdHMsCisJCQkJICAgY29uc3QgR0x2b2lkICogZGF0YSwgR0xpbnQgZGF0YUxlbikKIHsKICAgICBEaXNwbGF5ICpkcHkgPSBnYy0+Y3VycmVudERweTsKICNpZmRlZiBVU0VfWENCCkBAIC0xNDQ2LDkgKzg5MSw5IEBACiAgKiBccGFyYW0gZGF0YSAgICAgICBDb21tYW5kIGRhdGEuCiAgKiBccGFyYW0gZGF0YUxlbiAgICBTaXplLCBpbiBieXRlcywgb2YgdGhlIGNvbW1hbmQgZGF0YS4KICAqLwotdm9pZCBfX2dsWFNlbmRMYXJnZUNvbW1hbmQoX19HTFhjb250ZXh0ICpjdHgsCi0JCQkgICBjb25zdCBHTHZvaWQgKmhlYWRlciwgR0xpbnQgaGVhZGVyTGVuLAotCQkJICAgY29uc3QgR0x2b2lkICpkYXRhLCBHTGludCBkYXRhTGVuKQorX1hfSElEREVOIHZvaWQgX19nbFhTZW5kTGFyZ2VDb21tYW5kKF9fR0xYY29udGV4dCAqY3R4LAorCQkJCSAgICAgY29uc3QgR0x2b2lkICpoZWFkZXIsIEdMaW50IGhlYWRlckxlbiwKKwkJCQkgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xpbnQgZGF0YUxlbikKIHsKICAgICBHTGludCBtYXhTaXplOwogICAgIEdMaW50IHRvdGFsUmVxdWVzdHMsIHJlcXVlc3ROdW1iZXI7CkBAIC0xNDg0LDMzMCArOTI5LDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotUFVCTElDIEdMWENvbnRleHQgZ2xYR2V0Q3VycmVudENvbnRleHQodm9pZCkKLXsKLSAgICBHTFhDb250ZXh0IGN4ID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwotICAgIAotICAgIGlmIChjeCA9PSAmZHVtbXlDb250ZXh0KSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfSBlbHNlIHsKLQlyZXR1cm4gY3g7Ci0gICAgfQotfQotCi1QVUJMSUMgR0xYRHJhd2FibGUgZ2xYR2V0Q3VycmVudERyYXdhYmxlKHZvaWQpCi17Ci0gICAgR0xYQ29udGV4dCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLSAgICByZXR1cm4gZ2MtPmN1cnJlbnREcmF3YWJsZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLS8qIFJldHVybiB0aGUgRFJJIHBlciBzY3JlZW4gc3RydWN0dXJlICovCi1fX0RSSXNjcmVlbiAqX19nbFhGaW5kRFJJU2NyZWVuKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybikKLXsKLSAgICBfX0RSSXNjcmVlbiAqcERSSVNjcmVlbiA9IE5VTEw7Ci0gICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gX19nbFhGaW5kRGlzcGxheShkcHkpOwotICAgIFhFeHREYXRhICoqcHJpdkxpc3QsICpmb3VuZDsKLSAgICBfX0dMWGRpc3BsYXlQcml2YXRlICpkcHlQcml2OwotICAgIFhFRGF0YU9iamVjdCBkYXRhT2JqOwotCi0gICAgX19nbFhMb2NrKCk7Ci0gICAgZGF0YU9iai5kaXNwbGF5ID0gZHB5OwotICAgIHByaXZMaXN0ID0gWEVIZWFkT2ZFeHRlbnNpb25MaXN0KGRhdGFPYmopOwotICAgIGZvdW5kID0gWEZpbmRPbkV4dGVuc2lvbkxpc3QocHJpdkxpc3QsIGluZm8tPmNvZGVzLT5leHRlbnNpb24pOwotICAgIF9fZ2xYVW5sb2NrKCk7Ci0KLSAgICBpZiAoZm91bmQpIHsKLQlkcHlQcml2ID0gKF9fR0xYZGlzcGxheVByaXZhdGUgKilmb3VuZC0+cHJpdmF0ZV9kYXRhOwotCXBEUklTY3JlZW4gPSAmZHB5UHJpdi0+c2NyZWVuQ29uZmlnc1tzY3JuXS5kcmlTY3JlZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHBEUklTY3JlZW47Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIEJvb2wgU2VuZE1ha2VDdXJyZW50UmVxdWVzdCggRGlzcGxheSAqZHB5LCBDQVJEOCBvcGNvZGUsCi0gICAgR0xYQ29udGV4dElEIGdjLCBHTFhDb250ZXh0VGFnIG9sZF9nYywgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwKLSAgICB4R0xYTWFrZUN1cnJlbnRSZXBseSAqIHJlcGx5ICk7Ci0KLS8qKgotICogU2VuZHMgYSBHTFggcHJvdG9jb2wgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGRpc3BsYXkgdG8gbWFrZSB0aGUgY29udGV4dAotICogYW5kIHRoZSBkcmF3YWJsZXMgY3VycmVudC4KLSAqCi0gKiBccGFyYW0gZHB5ICAgICBEaXNwbGF5IHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8uCi0gKiBccGFyYW0gb3Bjb2RlICBNYWpvciBvcGNvZGUgdmFsdWUgZm9yIHRoZSBkaXNwbGF5LgotICogXHBhcmFtIGdjX2lkICAgQ29udGV4dCB0YWcgZm9yIHRoZSBjb250ZXh0IHRvIGJlIG1hZGUgY3VycmVudC4KLSAqIFxwYXJhbSBkcmF3ICAgIERyYXdhYmxlIElEIGZvciB0aGUgImRyYXciIGRyYXdhYmxlLgotICogXHBhcmFtIHJlYWQgICAgRHJhd2FibGUgSUQgZm9yIHRoZSAicmVhZCIgZHJhd2FibGUuCi0gKiBccGFyYW0gcmVwbHkgICBTcGFjZSB0byBzdG9yZSB0aGUgWC1zZXJ2ZXIncyByZXBseS4KLSAqCi0gKiBcd2FybmluZwotICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXGMgZHB5IGlzIGxvY2tlZCB3aXRoIFxjIExvY2tEaXNwbGF5IG9uIGVudHJ5LgotICovCi1zdGF0aWMgQm9vbCBTZW5kTWFrZUN1cnJlbnRSZXF1ZXN0KERpc3BsYXkgKmRweSwgQ0FSRDggb3Bjb2RlLAotCQkJCSAgIEdMWENvbnRleHRJRCBnY19pZCwgR0xYQ29udGV4dFRhZyBnY190YWcsCi0JCQkJICAgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwKLQkJCQkgICB4R0xYTWFrZUN1cnJlbnRSZXBseSAqcmVwbHkpCi17Ci0gICAgQm9vbCByZXQ7Ci0KLQotICAgIExvY2tEaXNwbGF5KGRweSk7Ci0KLSAgICBpZiAoZHJhdyA9PSByZWFkKSB7Ci0JeEdMWE1ha2VDdXJyZW50UmVxICpyZXE7Ci0KLQlHZXRSZXEoR0xYTWFrZUN1cnJlbnQscmVxKTsKLQlyZXEtPnJlcVR5cGUgPSBvcGNvZGU7Ci0JcmVxLT5nbHhDb2RlID0gWF9HTFhNYWtlQ3VycmVudDsKLQlyZXEtPmRyYXdhYmxlID0gZHJhdzsKLQlyZXEtPmNvbnRleHQgPSBnY19pZDsKLQlyZXEtPm9sZENvbnRleHRUYWcgPSBnY190YWc7Ci0gICAgfQotICAgIGVsc2UgewotCV9fR0xYZGlzcGxheVByaXZhdGUgKnByaXYgPSBfX2dsWEluaXRpYWxpemUoZHB5KTsKLQotCS8qIElmIHRoZSBzZXJ2ZXIgY2FuIHN1cHBvcnQgdGhlIEdMWCAxLjMgdmVyc2lvbiwgd2Ugc2hvdWxkCi0JICogcGVyZmVyIHRoYXQuICBOb3Qgb25seSB0aGF0LCBzb21lIHNlcnZlcnMgc3VwcG9ydCBHTFggMS4zIGJ1dAotCSAqIG5vdCB0aGUgU0dJIGV4dGVuc2lvbi4KLQkgKi8KLQotCWlmICgocHJpdi0+bWFqb3JWZXJzaW9uID4gMSkgfHwgKHByaXYtPm1pbm9yVmVyc2lvbiA+PSAzKSkgewotCSAgICB4R0xYTWFrZUNvbnRleHRDdXJyZW50UmVxICpyZXE7Ci0KLQkgICAgR2V0UmVxKEdMWE1ha2VDb250ZXh0Q3VycmVudCxyZXEpOwotCSAgICByZXEtPnJlcVR5cGUgPSBvcGNvZGU7Ci0JICAgIHJlcS0+Z2x4Q29kZSA9IFhfR0xYTWFrZUNvbnRleHRDdXJyZW50OwotCSAgICByZXEtPmRyYXdhYmxlID0gZHJhdzsKLQkgICAgcmVxLT5yZWFkZHJhd2FibGUgPSByZWFkOwotCSAgICByZXEtPmNvbnRleHQgPSBnY19pZDsKLQkgICAgcmVxLT5vbGRDb250ZXh0VGFnID0gZ2NfdGFnOwotCX0KLQllbHNlIHsKLQkgICAgeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEgKnZwcmVxOwotCSAgICB4R0xYTWFrZUN1cnJlbnRSZWFkU0dJUmVxICpyZXE7Ci0KLQkgICAgR2V0UmVxRXh0cmEoR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKLQkJCXN6X3hHTFhNYWtlQ3VycmVudFJlYWRTR0lSZXEtc3pfeEdMWFZlbmRvclByaXZhdGVXaXRoUmVwbHlSZXEsdnByZXEpOwotCSAgICByZXEgPSAoeEdMWE1ha2VDdXJyZW50UmVhZFNHSVJlcSAqKXZwcmVxOwotCSAgICByZXEtPnJlcVR5cGUgPSBvcGNvZGU7Ci0JICAgIHJlcS0+Z2x4Q29kZSA9IFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseTsKLQkgICAgcmVxLT52ZW5kb3JDb2RlID0gWF9HTFh2b3BfTWFrZUN1cnJlbnRSZWFkU0dJOwotCSAgICByZXEtPmRyYXdhYmxlID0gZHJhdzsKLQkgICAgcmVxLT5yZWFkYWJsZSA9IHJlYWQ7Ci0JICAgIHJlcS0+Y29udGV4dCA9IGdjX2lkOwotCSAgICByZXEtPm9sZENvbnRleHRUYWcgPSBnY190YWc7Ci0JfQotICAgIH0KLQotICAgIHJldCA9IF9YUmVwbHkoZHB5LCAoeFJlcGx5KikgcmVwbHksIDAsIEZhbHNlKTsKLQotICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKLSAgICBTeW5jSGFuZGxlKCk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotc3RhdGljIEJvb2wgQmluZENvbnRleHRXcmFwcGVyKCBEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgZ2MsCi0JCQkJR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCApCi17Ci0gICAgcmV0dXJuICgqZ2MtPmRyaUNvbnRleHQuYmluZENvbnRleHQpKGRweSwgZ2MtPnNjcmVlbiwgZHJhdywgcmVhZCwKLQkJCQkJICYgZ2MtPmRyaUNvbnRleHQpOwotfQotCi0KLXN0YXRpYyBCb29sIFVuYmluZENvbnRleHRXcmFwcGVyKCBHTFhDb250ZXh0IGdjICkKLXsKLSAgICByZXR1cm4gKCpnYy0+ZHJpQ29udGV4dC51bmJpbmRDb250ZXh0KShnYy0+Y3VycmVudERweSwgZ2MtPnNjcmVlbiwgCi0JCQkJCSAgIGdjLT5jdXJyZW50RHJhd2FibGUsCi0JCQkJCSAgIGdjLT5jdXJyZW50UmVhZGFibGUsCi0JCQkJCSAgICYgZ2MtPmRyaUNvbnRleHQgKTsKLX0KLSNlbmRpZiAvKiBHTFhfRElSRUNUX1JFTkRFUklORyAqLwotCi0KLS8qKgotICogTWFrZSBhIHBhcnRpY3VsYXIgY29udGV4dCBjdXJyZW50LgotICogCi0gKiBcbm90ZSBUaGlzIGlzIGluIHRoaXMgZmlsZSBzbyB0aGF0IGl0IGNhbiBhY2Nlc3MgZHVtbXlDb250ZXh0LgotICovCi1VU0VEIHN0YXRpYyBCb29sIE1ha2VDb250ZXh0Q3VycmVudChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGdjKQotewotICAgIHhHTFhNYWtlQ3VycmVudFJlcGx5IHJlcGx5OwotICAgIGNvbnN0IEdMWENvbnRleHQgb2xkR0MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgY29uc3QgQ0FSRDggb3Bjb2RlID0gX19nbFhTZXR1cEZvckNvbW1hbmQoZHB5KTsKLSAgICBjb25zdCBDQVJEOCBvbGRPcGNvZGUgPSAoKGdjID09IG9sZEdDKSB8fCAob2xkR0MgPT0gJmR1bW15Q29udGV4dCkpCi0gICAgICA/IG9wY29kZSA6IF9fZ2xYU2V0dXBGb3JDb21tYW5kKG9sZEdDLT5jdXJyZW50RHB5KTsKLSAgICBCb29sIGJpbmRSZXR1cm5WYWx1ZTsKLQotCi0gICAgaWYgKCFvcGNvZGUgfHwgIW9sZE9wY29kZSkgewotCXJldHVybiBHTF9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbmV3IGNvbnRleHQgaGFzIGEgbm9uemVybyBJRC4gIEluIHRoZSByZXF1ZXN0LAotICAgICAqIGEgemVybyBjb250ZXh0IElEIGlzIHVzZWQgb25seSB0byBtZWFuIHRoYXQgd2UgYmluZCB0byBubyBjdXJyZW50Ci0gICAgICogY29udGV4dC4KLSAgICAgKi8KLSAgICBpZiAoKGdjICE9IE5VTEwpICYmIChnYy0+eGlkID09IE5vbmUpKSB7Ci0JcmV0dXJuIEdMX0ZBTFNFOwotICAgIH0KLQotI2lmbmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgIGlmIChnYyAmJiBnYy0+aXNEaXJlY3QpIHsKLQlyZXR1cm4gR0xfRkFMU0U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBfZ2xhcGlfY2hlY2tfbXVsdGl0aHJlYWQoKTsKLQotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICAgLyogQmluZCB0aGUgZGlyZWN0IHJlbmRlcmluZyBjb250ZXh0IHRvIHRoZSBkcmF3YWJsZSAqLwotICAgIGlmIChnYyAmJiBnYy0+aXNEaXJlY3QpIHsKLQliaW5kUmV0dXJuVmFsdWUgPSAoZ2MtPmRyaUNvbnRleHQucHJpdmF0ZSkgCi0JICA/IEJpbmRDb250ZXh0V3JhcHBlcihkcHksIGdjLCBkcmF3LCByZWFkKQotCSAgOiBGYWxzZTsKLSAgICB9IGVsc2UKLSNlbmRpZgotICAgIHsKLQkvKiBTZW5kIGEgZ2xYTWFrZUN1cnJlbnQgcmVxdWVzdCB0byBiaW5kIHRoZSBuZXcgY29udGV4dC4gKi8KLQliaW5kUmV0dXJuVmFsdWUgPSAKLQkgIFNlbmRNYWtlQ3VycmVudFJlcXVlc3QoZHB5LCBvcGNvZGUsIGdjID8gZ2MtPnhpZCA6IE5vbmUsCi0JCQkJICgoZHB5ICE9IG9sZEdDLT5jdXJyZW50RHB5KSB8fCBvbGRHQy0+aXNEaXJlY3QpCi0JCQkJID8gTm9uZSA6IG9sZEdDLT5jdXJyZW50Q29udGV4dFRhZywKLQkJCQkgZHJhdywgcmVhZCwgJnJlcGx5KTsKLSAgICB9Ci0KLQotICAgIGlmICghYmluZFJldHVyblZhbHVlKSB7Ci0JcmV0dXJuIEZhbHNlOwotICAgIH0KLQotICAgIGlmICgoZHB5ICE9IG9sZEdDLT5jdXJyZW50RHB5IHx8IChnYyAmJiBnYy0+aXNEaXJlY3QpKSAmJgotCSFvbGRHQy0+aXNEaXJlY3QgJiYgb2xkR0MgIT0gJmR1bW15Q29udGV4dCkgewotCXhHTFhNYWtlQ3VycmVudFJlcGx5IGR1bW15X3JlcGx5OwotCi0JLyogV2UgYXJlIGVpdGhlciBzd2l0Y2hpbmcgZnJvbSBvbmUgZHB5IHRvIGFub3RoZXIgYW5kIGhhdmUgdG8KLQkgKiBzZW5kIGEgcmVxdWVzdCB0byB0aGUgcHJldmlvdXMgZHB5IHRvIHVuYmluZCB0aGUgcHJldmlvdXMKLQkgKiBjb250ZXh0LCBvciB3ZSBhcmUgc3dpdGNoaW5nIGF3YXkgZnJvbSBhIGluZGlyZWN0IGNvbnRleHQgdG8KLQkgKiBhIGRpcmVjdCBjb250ZXh0IGFuZCBoYXZlIHRvIHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBkcHkgdG8KLQkgKiB1bmJpbmQgdGhlIHByZXZpb3VzIGNvbnRleHQuCi0JICovCi0JKHZvaWQpIFNlbmRNYWtlQ3VycmVudFJlcXVlc3Qob2xkR0MtPmN1cnJlbnREcHksIG9sZE9wY29kZSwgTm9uZSwKLQkJCQkgICAgICBvbGRHQy0+Y3VycmVudENvbnRleHRUYWcsIE5vbmUsIE5vbmUsCi0JCQkJICAgICAgJiBkdW1teV9yZXBseSk7Ci0gICAgfQotI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCi0gICAgZWxzZSBpZiAob2xkR0MtPmlzRGlyZWN0ICYmIG9sZEdDLT5kcmlDb250ZXh0LnByaXZhdGUpIHsKLQkodm9pZCkgVW5iaW5kQ29udGV4dFdyYXBwZXIob2xkR0MpOwotICAgIH0KLSNlbmRpZgotCi0KLSAgICAvKiBVcGRhdGUgb3VyIG5vdGlvbiBvZiB3aGF0IGlzIGN1cnJlbnQgKi8KLSAgICBfX2dsWExvY2soKTsKLSAgICBpZiAoZ2MgPT0gb2xkR0MpIHsKLQkvKiBFdmVuIHRob3VnaCB0aGUgY29udGV4dHMgYXJlIHRoZSBzYW1lIHRoZSBkcmF3YWJsZSBtaWdodCBoYXZlCi0JICogY2hhbmdlZC4gIE5vdGUgdGhhdCBnYyBjYW5ub3QgYmUgdGhlIGR1bW15LCBhbmQgdGhhdCBvbGRHQwotCSAqIGNhbm5vdCBiZSBOVUxMLCB0aGVyZWZvcmUgaWYgdGhleSBhcmUgdGhlIHNhbWUsIGdjIGlzIG5vdAotCSAqIE5VTEwgYW5kIG5vdCB0aGUgZHVtbXkuCi0JICovCi0JZ2MtPmN1cnJlbnREcmF3YWJsZSA9IGRyYXc7Ci0JZ2MtPmN1cnJlbnRSZWFkYWJsZSA9IHJlYWQ7Ci0gICAgfSBlbHNlIHsKLQlpZiAob2xkR0MgIT0gJmR1bW15Q29udGV4dCkgewotCSAgICAvKiBPbGQgY3VycmVudCBjb250ZXh0IGlzIG5vIGxvbmdlciBjdXJyZW50IHRvIGFueWJvZHkgKi8KLQkgICAgb2xkR0MtPmN1cnJlbnREcHkgPSAwOwotCSAgICBvbGRHQy0+Y3VycmVudERyYXdhYmxlID0gTm9uZTsKLQkgICAgb2xkR0MtPmN1cnJlbnRSZWFkYWJsZSA9IE5vbmU7Ci0JICAgIG9sZEdDLT5jdXJyZW50Q29udGV4dFRhZyA9IDA7Ci0KLQkgICAgaWYgKG9sZEdDLT54aWQgPT0gTm9uZSkgewotCQkvKiBXZSBhcmUgc3dpdGNoaW5nIGF3YXkgZnJvbSBhIGNvbnRleHQgdGhhdCB3YXMKLQkJICogcHJldmlvdXNseSBkZXN0cm95ZWQsIHNvIHdlIG5lZWQgdG8gZnJlZSB0aGUgbWVtb3J5Ci0JCSAqIGZvciB0aGUgb2xkIGhhbmRsZS4KLQkJICovCi0jaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKLQkJLyogRGVzdHJveSB0aGUgb2xkIGRpcmVjdCByZW5kZXJpbmcgY29udGV4dCAqLwotCQlpZiAob2xkR0MtPmlzRGlyZWN0KSB7Ci0JCSAgICBpZiAob2xkR0MtPmRyaUNvbnRleHQucHJpdmF0ZSkgewotCQkJKCpvbGRHQy0+ZHJpQ29udGV4dC5kZXN0cm95Q29udGV4dCkKLQkJCSAgICAoZHB5LCBvbGRHQy0+c2NyZWVuLCBvbGRHQy0+ZHJpQ29udGV4dC5wcml2YXRlKTsKLQkJCW9sZEdDLT5kcmlDb250ZXh0LnByaXZhdGUgPSBOVUxMOwotCQkgICAgfQotCQl9Ci0jZW5kaWYKLQkJX19nbFhGcmVlQ29udGV4dChvbGRHQyk7Ci0JICAgIH0KLQl9Ci0JaWYgKGdjKSB7Ci0JICAgIF9fZ2xYU2V0Q3VycmVudENvbnRleHQoZ2MpOwotCi0JICAgIGdjLT5jdXJyZW50RHB5ID0gZHB5OwotCSAgICBnYy0+Y3VycmVudERyYXdhYmxlID0gZHJhdzsKLQkgICAgZ2MtPmN1cnJlbnRSZWFkYWJsZSA9IHJlYWQ7Ci0KLSAgICAgICAgICAgIGlmICghZ2MtPmlzRGlyZWN0KSB7Ci0gICAgICAgICAgICAgICBpZiAoIUluZGlyZWN0QVBJKQotICAgICAgICAgICAgICAgICAgSW5kaXJlY3RBUEkgPSBfX2dsWE5ld0luZGlyZWN0QVBJKCk7Ci0gICAgICAgICAgICAgICBfZ2xhcGlfc2V0X2Rpc3BhdGNoKEluZGlyZWN0QVBJKTsKLQotI2lmZGVmIEdMWF9VU0VfQVBQTEVHTAotICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgIGV4dGVybiB2b2lkIFhBcHBsZURSSVVzZUluZGlyZWN0RGlzcGF0Y2godm9pZCk7Ci0gICAgICAgICAgICAgICAgICAgWEFwcGxlRFJJVXNlSW5kaXJlY3REaXNwYXRjaCgpOwotICAgICAgICAgICAgICAgfSB3aGlsZSAoMCk7Ci0jZW5kaWYKLQotCQlfX0dMWGF0dHJpYnV0ZSAqc3RhdGUgPSAKLQkJICAoX19HTFhhdHRyaWJ1dGUgKikoZ2MtPmNsaWVudF9zdGF0ZV9wcml2YXRlKTsKLQotCQlnYy0+Y3VycmVudENvbnRleHRUYWcgPSByZXBseS5jb250ZXh0VGFnOwotCQlpZiAoc3RhdGUtPmFycmF5X3N0YXRlID09IE5VTEwpIHsKLQkJICAgICh2b2lkKSBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKLQkJICAgICh2b2lkKSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKLQkJICAgIF9fZ2xYSW5pdFZlcnRleEFycmF5U3RhdGUoZ2MpOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWdjLT5jdXJyZW50Q29udGV4dFRhZyA9IC0xOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgX19nbFhTZXRDdXJyZW50Q29udGV4dCgmZHVtbXlDb250ZXh0KTsKLSNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORwotICAgICAgICAgICAgX2dsYXBpX3NldF9kaXNwYXRjaChOVUxMKTsgIC8qIG5vLW9wIGZ1bmN0aW9ucyAqLwotI2VuZGlmCi0JfQotICAgIH0KLSAgICBfX2dsWFVubG9jaygpOwotICAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KLVBVQkxJQyBCb29sIGdsWE1ha2VDdXJyZW50KERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYQ29udGV4dCBnYykKLXsKLSAgICByZXR1cm4gTWFrZUNvbnRleHRDdXJyZW50KCBkcHksIGRyYXcsIGRyYXcsIGdjICk7Ci19Ci0KLVBVQkxJQyBHTFhfQUxJQVMoQm9vbCwgZ2xYTWFrZUN1cnJlbnRSZWFkU0dJLAotCSAgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZCwgR0xYRHJhd2FibGUgciwgR0xYQ29udGV4dCBjdHgpLAotCSAgKGRweSwgZCwgciwgY3R4KSwgTWFrZUNvbnRleHRDdXJyZW50KQotCi1QVUJMSUMgR0xYX0FMSUFTKEJvb2wsIGdsWE1ha2VDb250ZXh0Q3VycmVudCwKLQkgIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGQsIEdMWERyYXdhYmxlIHIsIEdMWENvbnRleHQgY3R4KSwKLQkgIChkcHksIGQsIHIsIGN0eCksIE1ha2VDb250ZXh0Q3VycmVudCkKLQotCiAjaWZkZWYgREVCVUcKLXZvaWQgX19nbFhEdW1wRHJhd0J1ZmZlcihfX0dMWGNvbnRleHQgKmN0eCkKK19YX0hJRERFTiB2b2lkIF9fZ2xYRHVtcERyYXdCdWZmZXIoX19HTFhjb250ZXh0ICpjdHgpCiB7CiAgICAgR0x1Ynl0ZSAqcCA9IGN0eC0+YnVmOwogICAgIEdMdWJ5dGUgKmVuZCA9IGN0eC0+cGM7CkBAIC0xODMyLDkgKzk1NSwyMyBAQAogCiAjaWZkZWYgIFVTRV9TUEFSQ19BU00KIC8qCi0gKiBVc2VkIG9ubHkgd2hlbiB3ZSBhcmUgc3BhcmMsIHVzaW5nIHNwYXJjIGFzc2VtYmxlci4KKyAqIFRoaXMgaXMgd2hlcmUgb3VyIGRpc3BhdGNoIHRhYmxlJ3MgYm91bmRzIGFyZS4KKyAqIEFuZCB0aGUgc3RhdGljIG1lc2FfaW5pdCBpcyB0YWtlbiBkaXJlY3RseSBmcm9tCisgKiBNZXNhJ3MgJ3NwYXJjLmMnIGluaXRpYWxpemVyLgogICoKKyAqIFdlIG5lZWQgc29tZXRoaW5nIGxpa2UgdGhpcyBoZXJlLCBiZWNhdXNlIHRoaXMgdmVyc2lvbgorICogb2Ygb3BlbkdML2dseCBuZXZlciBpbml0aWFsaXplcyBhIE1lc2EgY29udGV4dCwgYW5kIHNvCisgKiB0aGUgYWRkcmVzcyBvZiB0aGUgZGlzcGF0Y2ggdGFibGUgcG9pbnRlciBuZXZlciBnZXRzIHN0dWZmZWQKKyAqIGludG8gdGhlIGRpc3BhdGNoIGp1bXAgdGFibGUgb3RoZXJ3aXNlLgorICoKKyAqIEl0IG1hdHRlcnMgb25seSBvbiBTUEFSQywgYW5kIG9ubHkgaWYgeW91IGFyZSB1c2luZyBhc3NlbWJsZXIKKyAqIGNvZGUgaW5zdGVhZCBvZiBDLWNvZGUgaW5kaXJlY3QgZGlzcGF0Y2guCisgKgorICogLS0gRkVNLCAwNC54aWkuMDMKICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfbWVzYV9zcGFyY19nbGFwaV9iZWdpbjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgX21lc2Ffc3BhcmNfZ2xhcGlfZW5kOworZXh0ZXJuIHZvaWQgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2godW5zaWduZWQgaW50ICopOwogCiBzdGF0aWMgdm9pZAogX2dseF9tZXNhX2luaXRfc3BhcmNfZ2xhcGlfcmVsb2NzKHZvaWQpCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9nbHhleHRlbnNpb25zLmMgYi9zcmMvZ2x4L3gxMS9nbHhleHRlbnNpb25zLmMKaW5kZXggMWQ5OWI2MS4uZTg0MzcxOCAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvZ2x4ZXh0ZW5zaW9ucy5jCisrKyBiL3NyYy9nbHgveDExL2dseGV4dGVuc2lvbnMuYwpAQCAtMzU2LDI4ICszNTYsMTUgQEAKICAgIH0KIH0KIAotCi0vKioKLSAqIEVuYWJsZSBhIG5hbWVkIEdMWCBleHRlbnNpb24gb24gYSBnaXZlbiBzY3JlZW4uCi0gKiBEcml2ZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgaW5zdGVhZCB1c2UKLSAqIFxjIGdsWEdldFByb2NBZGRyZXNzIHRvIG9idGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLgotICoKLSAqIFxwYXJhbSBwc2MgICBQb2ludGVyIHRvIEdMWCBwZXItc2NyZWVuIHJlY29yZC4KLSAqIFxwYXJhbSBuYW1lICBOYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gZW5hYmxlLgotICoKLSAqIFxzYSBnbFhHZXRQcm9jQWRkcmVzcwotICoKLSAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDAzMDgxMy4KLSAqLwogdm9pZAotX19nbFhTY3JFbmFibGVFeHRlbnNpb24oIF9fR0xYc2NyZWVuQ29uZmlncyAqcHNjLCBjb25zdCBjaGFyICogbmFtZSApCitfX2dsWEVuYWJsZURpcmVjdEV4dGVuc2lvbihfX0dMWHNjcmVlbkNvbmZpZ3MgKnBzYywgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgIF9fZ2xYRXh0ZW5zaW9uc0N0cigpOwotICAgX19nbFhFeHRlbnNpb25zQ3RyU2NyZWVuKHBzYyk7Ci0gICBzZXRfZ2x4X2V4dGVuc2lvbigga25vd25fZ2x4X2V4dGVuc2lvbnMsIG5hbWUsIHN0cmxlbiggbmFtZSApLCBHTF9UUlVFLAotCQkgICAgICBwc2MtPmRpcmVjdF9zdXBwb3J0ICk7Ci19CisgICAgX19nbFhFeHRlbnNpb25zQ3RyKCk7CisgICAgX19nbFhFeHRlbnNpb25zQ3RyU2NyZWVuKHBzYyk7CiAKKyAgICBzZXRfZ2x4X2V4dGVuc2lvbihrbm93bl9nbHhfZXh0ZW5zaW9ucywKKwkJICAgICAgbmFtZSwgc3RybGVuKG5hbWUpLCBHTF9UUlVFLCBwc2MtPmRpcmVjdF9zdXBwb3J0KTsKK30KIAogLyoqCiAgKiBJbml0aWFsaXplIGdsb2JhbCBleHRlbnNpb24gc3VwcG9ydCB0YWJsZXMuCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9nbHhleHRlbnNpb25zLmggYi9zcmMvZ2x4L3gxMS9nbHhleHRlbnNpb25zLmgKaW5kZXggYTQyNDFiNi4uYjk5Y2ViYiAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvZ2x4ZXh0ZW5zaW9ucy5oCisrKyBiL3NyYy9nbHgveDExL2dseGV4dGVuc2lvbnMuaApAQCAtMjM0LDcgKzIzNCw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqIF9fZ2xYR2V0Q2xpZW50RXh0ZW5zaW9ucyggdm9pZCApOwogZXh0ZXJuIHZvaWQgX19nbFhDYWxjdWxhdGVVc2FibGVFeHRlbnNpb25zKCBzdHJ1Y3QgX19HTFhzY3JlZW5Db25maWdzUmVjICpwc2MsCiAgICAgR0xib29sZWFuIGRpc3BsYXlfaXNfZGlyZWN0X2NhcGFibGUsIGludCBzZXJ2ZXJfbWlub3JfdmVyc2lvbiApOwotZXh0ZXJuIHZvaWQgX19nbFhTY3JFbmFibGVFeHRlbnNpb24oIHN0cnVjdCBfX0dMWHNjcmVlbkNvbmZpZ3NSZWMgKnBzYywgY29uc3QgY2hhciAqIG5hbWUgKTsKKwogZXh0ZXJuIHZvaWQgX19nbFhDYWxjdWxhdGVVc2FibGVHTEV4dGVuc2lvbnMoIHN0cnVjdCBfX0dMWGNvbnRleHRSZWMgKiBnYywKICAgICBjb25zdCBjaGFyICogc2VydmVyX3N0cmluZywgaW50IG1ham9yX3ZlcnNpb24sIGludCBtaW5vcl92ZXJzaW9uICk7CiBleHRlcm4gdm9pZCBfX2dsWEdldEdMVmVyc2lvbiggaW50ICogbWFqb3JfdmVyc2lvbiwgaW50ICogbWlub3JfdmVyc2lvbiApOwpAQCAtMjQzLDYgKzI0Myw4IEBACiBleHRlcm4gR0xib29sZWFuIF9fZ2xFeHRlbnNpb25CaXRJc0VuYWJsZWQoIGNvbnN0IHN0cnVjdCBfX0dMWGNvbnRleHRSZWMgKiBnYywgCiAgICAgdW5zaWduZWQgYml0ICk7CiAKK2V4dGVybiB2b2lkCitfX2dsWEVuYWJsZURpcmVjdEV4dGVuc2lvbihzdHJ1Y3QgX19HTFhzY3JlZW5Db25maWdzUmVjICpwc2MsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAvKiBTb3VyY2UtbGV2ZWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZHJpdmVycy4gVGhleSB3b24ndAogICogZmluZCB0aGUgcmVzcGVjdGl2ZSBmdW5jdGlvbnMsIHRob3VnaC4gCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9nbHhoYXNoLmMgYi9zcmMvZ2x4L3gxMS9nbHhoYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiOGZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9nbHgveDExL2dseGhhc2guYwpAQCAtMCwwICsxLDQxNCBAQAorLyogZ2x4aGFzaC5jIC0tIFNtYWxsIGhhc2ggdGFibGUgc3VwcG9ydCBmb3IgaW50ZWdlciAtPiBpbnRlZ2VyIG1hcHBpbmcKKyAqIFRha2VuIGZyb20gbGliZHJtLgorICoKKyAqIENyZWF0ZWQ6IFN1biBBcHIgMTggMDk6MzU6NDUgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIGEgZml4ZWQtc2l6ZWQKKyAqIGhhc2ggdGFibGUgdXNpbmcgc2VsZi1vcmdhbml6aW5nIGxpbmtlZCBsaXN0cyBbS251dGg3MywgcHAuIDM5OC0zOTldIGZvcgorICogY29sbGlzaW9uIHJlc29sdXRpb24uICBUaGVyZSBhcmUgdHdvIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIHRoaW5ncworICogYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbjoKKyAqCisgKiAxKSBUaGUgdGFibGUgaXMgcG93ZXItb2YtdHdvIHNpemVkLiAgUHJpbWUgc2l6ZWQgdGFibGVzIGFyZSBtb3JlCisgKiB0cmFkaXRpb25hbCwgYnV0IGRvIG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG92ZXIgcG93ZXItb2YtdHdvCisgKiBzaXplZCB0YWJsZSwgZXNwZWNpYWxseSB3aGVuIGRvdWJsZSBoYXNoaW5nIGlzIG5vdCB1c2VkIGZvciBjb2xsaXNpb24KKyAqIHJlc29sdXRpb24uCisgKgorICogMikgVGhlIGhhc2ggY29tcHV0YXRpb24gdXNlcyBhIHRhYmxlIG9mIHJhbmRvbSBpbnRlZ2VycyBbSGFuc29uOTcsCisgKiBwcC4gMzktNDFdLgorICoKKyAqIEZVVFVSRSBFTkhBTkNFTUVOVFMKKyAqCisgKiBXaXRoIGEgdGFibGUgc2l6ZSBvZiA1MTIsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHN1ZmZpY2llbnQgZm9yIGEKKyAqIGZldyBodW5kcmVkIGtleXMuICBTaW5jZSB0aGlzIGlzIHdlbGwgYWJvdmUgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlCisgKiB0YWJsZXMgZm9yIHdoaWNoIHRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGRlc2lnbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIGR5bmFtaWMgaGFzaCB0YWJsZXMgd2FzIHBvc3Rwb25lZCB1bnRpbCB0aGUgbmVlZCBhcmlzZXMuICBBIGNvbW1vbiAoYW5kCisgKiBuYWl2ZSkgYXBwcm9hY2ggdG8gZHluYW1pYyBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIHNpbXBseSBjcmVhdGVzIGEKKyAqIG5ldyBoYXNoIHRhYmxlIHdoZW4gbmVjZXNzYXJ5LCByZWhhc2hlcyBhbGwgdGhlIGRhdGEgaW50byB0aGUgbmV3IHRhYmxlLAorICogYW5kIGRlc3Ryb3lzIHRoZSBvbGQgdGFibGUuICBUaGUgYXBwcm9hY2ggaW4gW0xhcnNvbjg4XSBpcyBzdXBlcmlvciBpbgorICogdHdvIHdheXM6IDEpIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSB0YWJsZSBpcyBleHBhbmRlZCB3aGVuIG5lZWRlZCwKKyAqIGRpc3RyaWJ1dGluZyB0aGUgZXhwYW5zaW9uIGNvc3Qgb3ZlciBzZXZlcmFsIGluc2VydGlvbnMsIGFuZCAyKSBwb3J0aW9ucworICogb2YgdGhlIHRhYmxlIGNhbiBiZSBsb2NrZWQsIGVuYWJsaW5nIGEgc2NhbGFibGUgdGhyZWFkLXNhZmUKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFJFRkVSRU5DRVMKKyAqCisgKiBbSGFuc29uOTddIERhdmlkIFIuIEhhbnNvbi4gIEMgSW50ZXJmYWNlcyBhbmQgSW1wbGVtZW50YXRpb25zOgorICogVGVjaG5pcXVlcyBmb3IgQ3JlYXRpbmcgUmV1c2FibGUgU29mdHdhcmUuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOgorICogQWRkaXNvbi1XZXNsZXksIDE5OTcuCisgKgorICogW0tudXRoNzNdIERvbmFsZCBFLiBLbnV0aC4gVGhlIEFydCBvZiBDb21wdXRlciBQcm9ncmFtbWluZy4gIFZvbHVtZSAzOgorICogU29ydGluZyBhbmQgU2VhcmNoaW5nLiAgUmVhZGluZywgTWFzc2FjaHVzZXR0czogQWRkaXNvbi1XZXNsZXksIDE5NzMuCisgKgorICogW0xhcnNvbjg4XSBQZXItQWtlIExhcnNvbi4gIkR5bmFtaWMgSGFzaCBUYWJsZXMiLiAgQ0FDTSAzMSg0KSwgQXByaWwKKyAqIDE5ODgsIHBwLiA0NDYtNDU3LgorICoKKyAqLworCisjaW5jbHVkZSAiZ2x4aGFzaC5oIgorI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKKyNkZWZpbmUgSEFTSF9NQUlOIDAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgSEFTSF9NQUdJQyAweGRlYWRiZWVmCisjZGVmaW5lIEhBU0hfREVCVUcgMAorI2RlZmluZSBIQVNIX1NJWkUgIDUxMgkJLyogR29vZCBmb3IgYWJvdXQgMTAwIGVudHJpZXMgKi8KKwkJCQkvKiBJZiB5b3UgY2hhbmdlIHRoaXMgdmFsdWUsIHlvdSBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGNoYW5nZSB0aGUgSGFzaEhhc2ggaGFzaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiEgKi8KKworI2RlZmluZSBIQVNIX0FMTE9DIG1hbGxvYworI2RlZmluZSBIQVNIX0ZSRUUgIGZyZWUKKyNkZWZpbmUgSEFTSF9SQU5ET01fREVDTAorI2RlZmluZSBIQVNIX1JBTkRPTV9JTklUKHNlZWQpICBzcmFuZG9tKHNlZWQpCisjZGVmaW5lIEhBU0hfUkFORE9NICAgICAgICAgICAgIHJhbmRvbSgpCisjZGVmaW5lIEhBU0hfUkFORE9NX0RFU1RST1kKKwordHlwZWRlZiBzdHJ1Y3QgX19nbHhIYXNoQnVja2V0IHsKKyAgICB1bnNpZ25lZCBsb25nICAgICBrZXk7CisgICAgdm9pZCAgICAgICAgICAgICAgKnZhbHVlOworICAgIHN0cnVjdCBfX2dseEhhc2hCdWNrZXQgKm5leHQ7Cit9IF9fZ2x4SGFzaEJ1Y2tldCwgKl9fZ2x4SGFzaEJ1Y2tldFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX19nbHhIYXNoVGFibGUgKl9fZ2x4SGFzaFRhYmxlUHRyOworc3RydWN0IF9fZ2x4SGFzaFRhYmxlIHsKKyAgICB1bnNpZ25lZCBsb25nICAgIG1hZ2ljOworICAgIHVuc2lnbmVkIGxvbmcgICAgaGl0czsJLyogQXQgdG9wIG9mIGxpbmtlZCBsaXN0ICovCisgICAgdW5zaWduZWQgbG9uZyAgICBwYXJ0aWFsczsJLyogTm90IGF0IHRvcCBvZiBsaW5rZWQgbGlzdCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgbWlzc2VzOwkvKiBOb3QgaW4gdGFibGUgKi8KKyAgICBfX2dseEhhc2hCdWNrZXRQdHIgICAgYnVja2V0c1tIQVNIX1NJWkVdOworICAgIGludCAgICAgICAgICAgICAgcDA7CisgICAgX19nbHhIYXNoQnVja2V0UHRyICAgIHAxOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgSGFzaEhhc2godW5zaWduZWQgbG9uZyBrZXkpCit7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgaGFzaCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgdG1wICA9IGtleTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICBpbml0ID0gMDsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzY2F0dGVyWzI1Nl07CisgICAgaW50ICAgICAgICAgICAgICAgICAgaTsKKworICAgIGlmICghaW5pdCkgeworCUhBU0hfUkFORE9NX0RFQ0w7CisJSEFTSF9SQU5ET01fSU5JVCgzNyk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBzY2F0dGVyW2ldID0gSEFTSF9SQU5ET007CisJSEFTSF9SQU5ET01fREVTVFJPWTsKKwkrK2luaXQ7CisgICAgfQorCisgICAgd2hpbGUgKHRtcCkgeworCWhhc2ggPSAoaGFzaCA8PCAxKSArIHNjYXR0ZXJbdG1wICYgMHhmZl07CisJdG1wID4+PSA4OworICAgIH0KKworICAgIGhhc2ggJT0gSEFTSF9TSVpFOworI2lmIEhBU0hfREVCVUcKKyAgICBwcmludGYoICJIYXNoKCVkKSA9ICVkXG4iLCBrZXksIGhhc2gpOworI2VuZGlmCisgICAgcmV0dXJuIGhhc2g7Cit9CisKK19YX0hJRERFTiBfX2dseEhhc2hUYWJsZSAqX19nbHhIYXNoQ3JlYXRlKHZvaWQpCit7CisgICAgX19nbHhIYXNoVGFibGVQdHIgdGFibGU7CisgICAgaW50ICAgICAgICAgIGk7CisKKyAgICB0YWJsZSAgICAgICAgICAgPSBIQVNIX0FMTE9DKHNpemVvZigqdGFibGUpKTsKKyAgICBpZiAoIXRhYmxlKSByZXR1cm4gTlVMTDsKKyAgICB0YWJsZS0+bWFnaWMgICAgPSBIQVNIX01BR0lDOworICAgIHRhYmxlLT5oaXRzICAgICA9IDA7CisgICAgdGFibGUtPnBhcnRpYWxzID0gMDsKKyAgICB0YWJsZS0+bWlzc2VzICAgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKSB0YWJsZS0+YnVja2V0c1tpXSA9IE5VTEw7CisgICAgcmV0dXJuIHRhYmxlOworfQorCitfWF9ISURERU4gaW50IF9fZ2x4SGFzaERlc3Ryb3koX19nbHhIYXNoVGFibGUgKnQpCit7CisgICAgX19nbHhIYXNoVGFibGVQdHIgIHRhYmxlID0gKF9fZ2x4SGFzaFRhYmxlUHRyKXQ7CisgICAgX19nbHhIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKyAgICBfX2dseEhhc2hCdWNrZXRQdHIgbmV4dDsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBpZiAodGFibGUtPm1hZ2ljICE9IEhBU0hfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyBpKyspIHsKKwlmb3IgKGJ1Y2tldCA9IHRhYmxlLT5idWNrZXRzW2ldOyBidWNrZXQ7KSB7CisJICAgIG5leHQgPSBidWNrZXQtPm5leHQ7CisJICAgIEhBU0hfRlJFRShidWNrZXQpOworCSAgICBidWNrZXQgPSBuZXh0OworCX0KKyAgICB9CisgICAgSEFTSF9GUkVFKHRhYmxlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogRmluZCB0aGUgYnVja2V0IGFuZCBvcmdhbml6ZSB0aGUgbGlzdCBzbyB0aGF0IHRoaXMgYnVja2V0IGlzIGF0IHRoZQorICAgdG9wLiAqLworCitzdGF0aWMgX19nbHhIYXNoQnVja2V0UHRyIEhhc2hGaW5kKF9fZ2x4SGFzaFRhYmxlUHRyIHRhYmxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGxvbmcgKmgpCit7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoID0gSGFzaEhhc2goa2V5KTsKKyAgICBfX2dseEhhc2hCdWNrZXRQdHIgcHJldiA9IE5VTEw7CisgICAgX19nbHhIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKworICAgIGlmIChoKSAqaCA9IGhhc2g7CisKKyAgICBmb3IgKGJ1Y2tldCA9IHRhYmxlLT5idWNrZXRzW2hhc2hdOyBidWNrZXQ7IGJ1Y2tldCA9IGJ1Y2tldC0+bmV4dCkgeworCWlmIChidWNrZXQtPmtleSA9PSBrZXkpIHsKKwkgICAgaWYgKHByZXYpIHsKKwkJCQkvKiBPcmdhbml6ZSAqLworCQlwcmV2LT5uZXh0ICAgICAgICAgICA9IGJ1Y2tldC0+bmV4dDsKKwkJYnVja2V0LT5uZXh0ICAgICAgICAgPSB0YWJsZS0+YnVja2V0c1toYXNoXTsKKwkJdGFibGUtPmJ1Y2tldHNbaGFzaF0gPSBidWNrZXQ7CisJCSsrdGFibGUtPnBhcnRpYWxzOworCSAgICB9IGVsc2UgeworCQkrK3RhYmxlLT5oaXRzOworCSAgICB9CisJICAgIHJldHVybiBidWNrZXQ7CisJfQorCXByZXYgPSBidWNrZXQ7CisgICAgfQorICAgICsrdGFibGUtPm1pc3NlczsKKyAgICByZXR1cm4gTlVMTDsKK30KKworX1hfSElEREVOIGludCBfX2dseEhhc2hMb29rdXAoX19nbHhIYXNoVGFibGUgKnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIF9fZ2x4SGFzaFRhYmxlUHRyICB0YWJsZSA9IChfX2dseEhhc2hUYWJsZVB0cil0OworICAgIF9fZ2x4SGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisKKyAgICBpZiAoIXRhYmxlIHx8IHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgYnVja2V0ID0gSGFzaEZpbmQodGFibGUsIGtleSwgTlVMTCk7CisgICAgaWYgKCFidWNrZXQpIHJldHVybiAxOwkvKiBOb3QgZm91bmQgKi8KKyAgICAqdmFsdWUgPSBidWNrZXQtPnZhbHVlOworICAgIHJldHVybiAwOwkJCS8qIEZvdW5kICovCit9CisKK19YX0hJRERFTiBpbnQgX19nbHhIYXNoSW5zZXJ0KF9fZ2x4SGFzaFRhYmxlICp0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKnZhbHVlKQoreworICAgIF9fZ2x4SGFzaFRhYmxlUHRyICB0YWJsZSA9IChfX2dseEhhc2hUYWJsZVB0cil0OworICAgIF9fZ2x4SGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoOworCisgICAgaWYgKHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgaWYgKEhhc2hGaW5kKHRhYmxlLCBrZXksICZoYXNoKSkgcmV0dXJuIDE7IC8qIEFscmVhZHkgaW4gdGFibGUgKi8KKworICAgIGJ1Y2tldCAgICAgICAgICAgICAgID0gSEFTSF9BTExPQyhzaXplb2YoKmJ1Y2tldCkpOworICAgIGlmICghYnVja2V0KSByZXR1cm4gLTE7CS8qIEVycm9yICovCisgICAgYnVja2V0LT5rZXkgICAgICAgICAgPSBrZXk7CisgICAgYnVja2V0LT52YWx1ZSAgICAgICAgPSB2YWx1ZTsKKyAgICBidWNrZXQtPm5leHQgICAgICAgICA9IHRhYmxlLT5idWNrZXRzW2hhc2hdOworICAgIHRhYmxlLT5idWNrZXRzW2hhc2hdID0gYnVja2V0OworI2lmIEhBU0hfREVCVUcKKyAgICBwcmludGYoIkluc2VydGVkICVkIGF0ICVkLyVwXG4iLCBrZXksIGhhc2gsIGJ1Y2tldCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsJCQkvKiBBZGRlZCB0byB0YWJsZSAqLworfQorCitfWF9ISURERU4gaW50IF9fZ2x4SGFzaERlbGV0ZShfX2dseEhhc2hUYWJsZSAqdCwgdW5zaWduZWQgbG9uZyBrZXkpCit7CisgICAgX19nbHhIYXNoVGFibGVQdHIgIHRhYmxlID0gKF9fZ2x4SGFzaFRhYmxlUHRyKXQ7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoOworICAgIF9fZ2x4SGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisKKyAgICBpZiAodGFibGUtPm1hZ2ljICE9IEhBU0hfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICBidWNrZXQgPSBIYXNoRmluZCh0YWJsZSwga2V5LCAmaGFzaCk7CisKKyAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIDE7CS8qIE5vdCBmb3VuZCAqLworCisgICAgdGFibGUtPmJ1Y2tldHNbaGFzaF0gPSBidWNrZXQtPm5leHQ7CisgICAgSEFTSF9GUkVFKGJ1Y2tldCk7CisgICAgcmV0dXJuIDA7Cit9CisKK19YX0hJRERFTiBpbnQgX19nbHhIYXNoTmV4dChfX2dseEhhc2hUYWJsZSAqdCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSkKK3sKKyAgICBfX2dseEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoX19nbHhIYXNoVGFibGVQdHIpdDsKKworICAgIHdoaWxlICh0YWJsZS0+cDAgPCBIQVNIX1NJWkUpIHsKKwlpZiAodGFibGUtPnAxKSB7CisJICAgICprZXkgICAgICAgPSB0YWJsZS0+cDEtPmtleTsKKwkgICAgKnZhbHVlICAgICA9IHRhYmxlLT5wMS0+dmFsdWU7CisJICAgIHRhYmxlLT5wMSAgPSB0YWJsZS0+cDEtPm5leHQ7CisJICAgIHJldHVybiAxOworCX0KKwl0YWJsZS0+cDEgPSB0YWJsZS0+YnVja2V0c1t0YWJsZS0+cDBdOworCSsrdGFibGUtPnAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworX1hfSElEREVOIGludCBfX2dseEhhc2hGaXJzdChfX2dseEhhc2hUYWJsZSAqdCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpCit7CisgICAgX19nbHhIYXNoVGFibGVQdHIgIHRhYmxlID0gKF9fZ2x4SGFzaFRhYmxlUHRyKXQ7CisKKyAgICBpZiAodGFibGUtPm1hZ2ljICE9IEhBU0hfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICB0YWJsZS0+cDAgPSAwOworICAgIHRhYmxlLT5wMSA9IHRhYmxlLT5idWNrZXRzWzBdOworICAgIHJldHVybiBfX2dseEhhc2hOZXh0KHRhYmxlLCBrZXksIHZhbHVlKTsKK30KKworI2lmIEhBU0hfTUFJTgorI2RlZmluZSBESVNUX0xJTUlUIDEwCitzdGF0aWMgaW50IGRpc3RbRElTVF9MSU1JVF07CisKK3N0YXRpYyB2b2lkIGNsZWFyX2Rpc3Qodm9pZCkgeworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IERJU1RfTElNSVQ7IGkrKykgZGlzdFtpXSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfZW50cmllcyhfX2dseEhhc2hCdWNrZXRQdHIgYnVja2V0KQoreworICAgIGludCBjb3VudCA9IDA7CisKKyAgICBmb3IgKDsgYnVja2V0OyBidWNrZXQgPSBidWNrZXQtPm5leHQpICsrY291bnQ7CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZGlzdChpbnQgY291bnQpCit7CisgICAgaWYgKGNvdW50ID49IERJU1RfTElNSVQpICsrZGlzdFtESVNUX0xJTUlULTFdOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICArK2Rpc3RbY291bnRdOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2Rpc3QoX19nbHhIYXNoVGFibGVQdHIgdGFibGUpCit7CisgICAgaW50ICAgICAgICAgICBpOworICAgIF9fZ2x4SGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisKKyAgICBwcmludGYoIkhpdHMgPSAlbGQsIHBhcnRpYWxzID0gJWxkLCBtaXNzZXMgPSAlbGRcbiIsCisJICAgdGFibGUtPmhpdHMsIHRhYmxlLT5wYXJ0aWFscywgdGFibGUtPm1pc3Nlcyk7CisgICAgY2xlYXJfZGlzdCgpOworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykgeworCWJ1Y2tldCA9IHRhYmxlLT5idWNrZXRzW2ldOworCXVwZGF0ZV9kaXN0KGNvdW50X2VudHJpZXMoYnVja2V0KSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0xJTUlUOyBpKyspIHsKKwlpZiAoaSAhPSBESVNUX0xJTUlULTEpIHByaW50ZigiJTVkICUxMGRcbiIsIGksIGRpc3RbaV0pOworCWVsc2UgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdGhlciAlMTBkXG4iLCBkaXN0W2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3RhYmxlKF9fZ2x4SGFzaFRhYmxlUHRyIHRhYmxlLAorCQkJdW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisgICAgdW5zaWduZWQgbG9uZyByZXR2YWwgID0gMDsKKyAgICBpbnQgICAgICAgICAgIHJldGNvZGUgPSBfX2dseEhhc2hMb29rdXAodGFibGUsIGtleSwgJnJldHZhbCk7CisKKyAgICBzd2l0Y2ggKHJldGNvZGUpIHsKKyAgICBjYXNlIC0xOgorCXByaW50ZigiQmFkIG1hZ2ljID0gMHglMDhseDoiCisJICAgICAgICIga2V5ID0gJWx1LCBleHBlY3RlZCA9ICVsdSwgcmV0dXJuZWQgPSAlbHVcbiIsCisJICAgICAgIHRhYmxlLT5tYWdpYywga2V5LCB2YWx1ZSwgcmV0dmFsKTsKKwlicmVhazsKKyAgICBjYXNlIDE6CisJcHJpbnRmKCJOb3QgZm91bmQ6IGtleSA9ICVsdSwgZXhwZWN0ZWQgPSAlbHUgcmV0dXJuZWQgPSAlbHVcbiIsCisJICAgICAgIGtleSwgdmFsdWUsIHJldHZhbCk7CisJYnJlYWs7CisgICAgY2FzZSAwOgorCWlmICh2YWx1ZSAhPSByZXR2YWwpCisJICAgIHByaW50ZigiQmFkIHZhbHVlOiBrZXkgPSAlbHUsIGV4cGVjdGVkID0gJWx1LCByZXR1cm5lZCA9ICVsdVxuIiwKKwkJICAga2V5LCB2YWx1ZSwgcmV0dmFsKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ZigiQmFkIHJldGNvZGUgPSAlZDoga2V5ID0gJWx1LCBleHBlY3RlZCA9ICVsdSwgcmV0dXJuZWQgPSAlbHVcbiIsCisJICAgICAgIHJldGNvZGUsIGtleSwgdmFsdWUsIHJldHZhbCk7CisJYnJlYWs7CisgICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIF9fZ2x4SGFzaFRhYmxlUHRyIHRhYmxlOworICAgIGludCAgICAgICAgICBpOworCisgICAgcHJpbnRmKCJcbioqKioqIDI1NiBjb25zZWN1dGl2ZSBpbnRlZ2VycyAqKioqXG4iKTsKKyAgICB0YWJsZSA9IF9fZ2x4SGFzaENyZWF0ZSgpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgX19nbHhIYXNoSW5zZXJ0KHRhYmxlLCBpLCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIGNoZWNrX3RhYmxlKHRhYmxlLCBpLCBpKTsKKyAgICBmb3IgKGkgPSAyNTY7IGkgPj0gMDsgaS0tKSBjaGVja190YWJsZSh0YWJsZSwgaSwgaSk7CisgICAgY29tcHV0ZV9kaXN0KHRhYmxlKTsKKyAgICBfX2dseEhhc2hEZXN0cm95KHRhYmxlKTsKKworICAgIHByaW50ZigiXG4qKioqKiAxMDI0IGNvbnNlY3V0aXZlIGludGVnZXJzICoqKipcbiIpOworICAgIHRhYmxlID0gX19nbHhIYXNoQ3JlYXRlKCk7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgX19nbHhIYXNoSW5zZXJ0KHRhYmxlLCBpLCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSBjaGVja190YWJsZSh0YWJsZSwgaSwgaSk7CisgICAgZm9yIChpID0gMTAyNDsgaSA+PSAwOyBpLS0pIGNoZWNrX3RhYmxlKHRhYmxlLCBpLCBpKTsKKyAgICBjb21wdXRlX2Rpc3QodGFibGUpOworICAgIF9fZ2x4SGFzaERlc3Ryb3kodGFibGUpOworCisgICAgcHJpbnRmKCJcbioqKioqIDEwMjQgY29uc2VjdXRpdmUgcGFnZSBhZGRyZXNzZXMgKDRrIHBhZ2VzKSAqKioqXG4iKTsKKyAgICB0YWJsZSA9IF9fZ2x4SGFzaENyZWF0ZSgpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspIF9fZ2x4SGFzaEluc2VydCh0YWJsZSwgaSo0MDk2LCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSBjaGVja190YWJsZSh0YWJsZSwgaSo0MDk2LCBpKTsKKyAgICBmb3IgKGkgPSAxMDI0OyBpID49IDA7IGktLSkgY2hlY2tfdGFibGUodGFibGUsIGkqNDA5NiwgaSk7CisgICAgY29tcHV0ZV9kaXN0KHRhYmxlKTsKKyAgICBfX2dseEhhc2hEZXN0cm95KHRhYmxlKTsKKworICAgIHByaW50ZigiXG4qKioqKiAxMDI0IHJhbmRvbSBpbnRlZ2VycyAqKioqXG4iKTsKKyAgICB0YWJsZSA9IF9fZ2x4SGFzaENyZWF0ZSgpOworICAgIHNyYW5kb20oMHhiZWVmYmVlZik7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgX19nbHhIYXNoSW5zZXJ0KHRhYmxlLCByYW5kb20oKSwgaSk7CisgICAgc3JhbmRvbSgweGJlZWZiZWVmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSBjaGVja190YWJsZSh0YWJsZSwgcmFuZG9tKCksIGkpOworICAgIHNyYW5kb20oMHhiZWVmYmVlZik7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgY2hlY2tfdGFibGUodGFibGUsIHJhbmRvbSgpLCBpKTsKKyAgICBjb21wdXRlX2Rpc3QodGFibGUpOworICAgIF9fZ2x4SGFzaERlc3Ryb3kodGFibGUpOworCisgICAgcHJpbnRmKCJcbioqKioqIDUwMDAgcmFuZG9tIGludGVnZXJzICoqKipcbiIpOworICAgIHRhYmxlID0gX19nbHhIYXNoQ3JlYXRlKCk7CisgICAgc3JhbmRvbSgweGJlZWZiZWVmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKSBfX2dseEhhc2hJbnNlcnQodGFibGUsIHJhbmRvbSgpLCBpKTsKKyAgICBzcmFuZG9tKDB4YmVlZmJlZWYpOworICAgIGZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspIGNoZWNrX3RhYmxlKHRhYmxlLCByYW5kb20oKSwgaSk7CisgICAgc3JhbmRvbSgweGJlZWZiZWVmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKSBjaGVja190YWJsZSh0YWJsZSwgcmFuZG9tKCksIGkpOworICAgIGNvbXB1dGVfZGlzdCh0YWJsZSk7CisgICAgX19nbHhIYXNoRGVzdHJveSh0YWJsZSk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvZ2x4aGFzaC5oIGIvc3JjL2dseC94MTEvZ2x4aGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDEyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2x4L3gxMS9nbHhoYXNoLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfR0xYX0hBU0hfSF8KKyNkZWZpbmUgX0dMWF9IQVNIX0hfCisKKwordHlwZWRlZiBzdHJ1Y3QgX19nbHhIYXNoVGFibGUgX19nbHhIYXNoVGFibGU7CisKKy8qIEhhc2ggdGFibGUgcm91dGluZXMgKi8KK2V4dGVybiBfX2dseEhhc2hUYWJsZSAqX19nbHhIYXNoQ3JlYXRlKHZvaWQpOworZXh0ZXJuIGludCAgX19nbHhIYXNoRGVzdHJveShfX2dseEhhc2hUYWJsZSAqdCk7CitleHRlcm4gaW50ICBfX2dseEhhc2hMb29rdXAoX19nbHhIYXNoVGFibGUgKnQsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICoqdmFsdWUpOworZXh0ZXJuIGludCAgX19nbHhIYXNoSW5zZXJ0KF9fZ2x4SGFzaFRhYmxlICp0LCB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqdmFsdWUpOworZXh0ZXJuIGludCAgX19nbHhIYXNoRGVsZXRlKF9fZ2x4SGFzaFRhYmxlICp0LCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50ICBfX2dseEhhc2hGaXJzdChfX2dseEhhc2hUYWJsZSAqdCwgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpOworZXh0ZXJuIGludCAgX19nbHhIYXNoTmV4dChfX2dseEhhc2hUYWJsZSAqdCwgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpOworCisjZW5kaWYgLyogX0dMWF9IQVNIX0hfICovCmRpZmYgLS1naXQgYS9zcmMvZ2x4L3gxMS9pbmRpcmVjdC5jIGIvc3JjL2dseC94MTEvaW5kaXJlY3QuYwppbmRleCBmYmIyYTkxLi44MmUxYjJlIDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9pbmRpcmVjdC5jCisrKyBiL3NyYy9nbHgveDExL2luZGlyZWN0LmMKQEAgLTMwMCw3ICszMDAsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC0zMjQsNyArMzI2LDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDA7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtMzYwLDYgKzM2NCwxMCBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNvbXBzaXplID0gX19nbENhbGxMaXN0c19zaXplKHR5cGUpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgoY29tcHNpemUgKiBuKSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KChuID49IDApICYmIChnYy0+Y3VycmVudERweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgaWYgKGNtZGxlbiA8PSBnYy0+bWF4U21hbGxSZW5kZXJDb21tYW5kU2l6ZSkgewogICAgICAgICAgICAgaWYgKChnYy0+cGMgKyBjbWRsZW4pID4gZ2MtPmJ1ZkVuZCkgewpAQCAtMzkzLDcgKzQwMSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQxOCw3ICs0MjgsOSBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgR0x1aW50IHJldHZhbCA9IChHTHVpbnQpIDA7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC0zNTgyLDYgKzM1OTQsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobWFwc2l6ZSAqIDQpKTsKKyAgICBpZiAobWFwc2l6ZSA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG1hcHNpemUgPj0gMCkgJiYgKGdjLT5jdXJyZW50RHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICBpZiAoY21kbGVuIDw9IGdjLT5tYXhTbWFsbFJlbmRlckNvbW1hbmRTaXplKSB7CiAgICAgICAgICAgICBpZiAoKGdjLT5wYyArIGNtZGxlbikgPiBnYy0+YnVmRW5kKSB7CkBAIC0zNjE1LDYgKzM2MzEsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobWFwc2l6ZSAqIDQpKTsKKyAgICBpZiAobWFwc2l6ZSA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG1hcHNpemUgPj0gMCkgJiYgKGdjLT5jdXJyZW50RHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICBpZiAoY21kbGVuIDw9IGdjLT5tYXhTbWFsbFJlbmRlckNvbW1hbmRTaXplKSB7CiAgICAgICAgICAgICBpZiAoKGdjLT5wYyArIGNtZGxlbikgPiBnYy0+YnVmRW5kKSB7CkBAIC0zNjQ4LDYgKzM2NjgsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobWFwc2l6ZSAqIDIpKTsKKyAgICBpZiAobWFwc2l6ZSA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG1hcHNpemUgPj0gMCkgJiYgKGdjLT5jdXJyZW50RHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICBpZiAoY21kbGVuIDw9IGdjLT5tYXhTbWFsbFJlbmRlckNvbW1hbmRTaXplKSB7CiAgICAgICAgICAgICBpZiAoKGdjLT5wYyArIGNtZGxlbikgPiBnYy0+YnVmRW5kKSB7CkBAIC0zNzE2LDcgKzM3NDAsOSBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgX19HTFhhdHRyaWJ1dGUgKmNvbnN0IHN0YXRlID0gZ2MtPmNsaWVudF9zdGF0ZV9wcml2YXRlOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDI4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM4MDgsNyArMzgzNCw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM4NDEsNyArMzg2OSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM4NzksNyArMzkwOSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM5MTcsNyArMzk0OSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM5NTMsNyArMzk4Nyw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTM5ODksNyArNDAyNSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQwMjUsNyArNDA2Myw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQwNjMsNyArNDEwMyw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQxMDEsNyArNDE0Myw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQxMzcsNyArNDE4MSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQxNzQsNyArNDIyMCw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQyMTAsOSArNDI1OCwxMCBAQAogX19pbmRpcmVjdF9nbEdldFBvbHlnb25TdGlwcGxlKEdMdWJ5dGUgKm1hc2spCiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLSAgICBjb25zdCBfX0dMWGF0dHJpYnV0ZSAqY29uc3Qgc3RhdGUgPSBnYy0+Y2xpZW50X3N0YXRlX3ByaXZhdGU7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00MjQ3LDcgKzQyOTYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00Mjg1LDcgKzQzMzYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00MzIzLDcgKzQzNzYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00MzYxLDcgKzQ0MTYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00Mzk5LDcgKzQ0NTYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00NDM5LDcgKzQ0OTgsOSBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgX19HTFhhdHRyaWJ1dGUgKmNvbnN0IHN0YXRlID0gZ2MtPmNsaWVudF9zdGF0ZV9wcml2YXRlOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDIwOworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQ0ODMsNyArNDU0NCw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQ1MjIsNyArNDU4NSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTQ1NjIsNyArNDYyNyw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMjsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC00NjAzLDcgKzQ2NzAsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTI7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNDY0NCw3ICs0NzEzLDkgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgIEdMYm9vbGVhbiByZXR2YWwgPSAoR0xib29sZWFuKSAwOworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDQ7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNTAxMiw3ICs1MDgzLDEzIEBACiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICBHTGJvb2xlYW4gcmV0dmFsID0gKEdMYm9vbGVhbikgMDsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworI2VuZGlmCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNTA0NywxNCArNTEyNCwyMSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgICAgcmV0dXJuIENBTExfQXJlVGV4dHVyZXNSZXNpZGVudChHRVRfRElTUEFUQ0goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiwgdGV4dHVyZXMsIHJlc2lkZW5jZXMpKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZQorI2VuZGlmCisgICAgewogICAgICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICAgICAgR0xib29sZWFuIHJldHZhbCA9IChHTGJvb2xlYW4pIDA7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QgKnBjID0KICAgICAgICAgICAgICAgICBfX2dsWFNldHVwVmVuZG9yUmVxdWVzdChnYywgWF9HTFhWZW5kb3JQcml2YXRlV2l0aFJlcGx5LApAQCAtNTE2Myw3ICs1MjQ3LDEzIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworI2VuZGlmCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KChuID49IDApICYmIChkcHkgIT0gTlVMTCksIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTUxODcsMTIgKzUyNzcsMTkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfRGVsZXRlVGV4dHVyZXMoR0VUX0RJU1BBVENIKCksIChuLCB0ZXh0dXJlcykpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CiAgICAgICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNCArIF9fR0xYX1BBRCgobiAqIDQpKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobiA+PSAwKSAmJiAoZHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICAgICAgR0x1Ynl0ZSBjb25zdCAqcGMgPQogICAgICAgICAgICAgICAgIF9fZ2xYU2V0dXBWZW5kb3JSZXF1ZXN0KGdjLCBYX0dMWFZlbmRvclByaXZhdGUsCkBAIC01MjEyLDcgKzUzMDksMTMgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDQ7CisjZW5kaWYKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNTI0NSwxMiArNTM0OCwxOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgICAgQ0FMTF9HZW5UZXh0dXJlcyhHRVRfRElTUEFUQ0goKSwgKG4sIHRleHR1cmVzKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KChuID49IDApICYmIChkcHkgIT0gTlVMTCksIDEpKSB7CiAgICAgICAgICAgICBHTHVieXRlIGNvbnN0ICpwYyA9CiAgICAgICAgICAgICAgICAgX19nbFhTZXR1cFZlbmRvclJlcXVlc3QoZ2MsIFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKQEAgLTUyNzEsNyArNTM4MSw5IEBACiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICBHTGJvb2xlYW4gcmV0dmFsID0gKEdMYm9vbGVhbikgMDsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTUzMDEsOSArNTQxMywxMiBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgICAgcmV0dXJuIENBTExfSXNUZXh0dXJlKEdFVF9ESVNQQVRDSCgpLCAodGV4dHVyZSkpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CiAgICAgICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgICAgICBHTGJvb2xlYW4gcmV0dmFsID0gKEdMYm9vbGVhbikgMDsKQEAgLTUzMjgsNiArNTQ0MywxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDggKyBfX0dMWF9QQUQoKG4gKiA0KSkgKyBfX0dMWF9QQUQoKG4gKiA0KSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1ByaW9yaXRpemVUZXh0dXJlcywgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmbiksIDQpOwpAQCAtNTU2NSw3ICs1Njg0LDkgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IF9fR0xYYXR0cmlidXRlICpjb25zdCBzdGF0ZSA9IGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxNjsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC01NjA5LDkgKzU3MzAsMTIgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfR2V0Q29sb3JUYWJsZShHRVRfRElTUEFUQ0goKSwgKHRhcmdldCwgZm9ybWF0LCB0eXBlLCB0YWJsZSkpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CiAgICAgICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgICAgIGNvbnN0IF9fR0xYYXR0cmlidXRlICpjb25zdCBzdGF0ZSA9IGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CkBAIC01NjQxLDcgKzU3NjUsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC01NjgwLDEwICs1ODA2LDEzIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldENvbG9yVGFibGVQYXJhbWV0ZXJmdihHRVRfRElTUEFUQ0goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CiAgICAgICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKQEAgLTU3MDksNyArNTgzOCw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTU3NDgsMTAgKzU4NzksMTMgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2KEdFVF9ESVNQQVRDSCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OwpAQCAtNjAyOSw3ICs2MTYzLDkgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IF9fR0xYYXR0cmlidXRlICpjb25zdCBzdGF0ZSA9IGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxNjsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC02MDY5LDEwICs2MjA1LDEzIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldENvbnZvbHV0aW9uRmlsdGVyKEdFVF9ESVNQQVRDSCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQsIGZvcm1hdCwgdHlwZSwgaW1hZ2UpKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZQorI2VuZGlmCisgICAgewogICAgICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgICAgICBjb25zdCBfX0dMWGF0dHJpYnV0ZSAqY29uc3Qgc3RhdGUgPSBnYy0+Y2xpZW50X3N0YXRlX3ByaXZhdGU7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwpAQCAtNjEwMyw3ICs2MjQyLDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNjE0MiwxMCArNjI4MywxMyBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAKLSAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7CisjaWZkZWYgR0xYX0RJUkVDVF9SRU5ERVJJTkcKKyAgICBpZiAoZ2MtPmRyaUNvbnRleHQpIHsKICAgICAgICAgQ0FMTF9HZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2KEdFVF9ESVNQQVRDSCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CiAgICAgICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKQEAgLTYxNzEsNyArNjMxNSw5IEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTYyMTAsMTAgKzYzNTYsMTMgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdihHRVRfRElTUEFUQ0goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZQorI2VuZGlmCisgICAgewogICAgICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CkBAIC02MjQwLDcgKzYzODksOSBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgX19HTFhhdHRyaWJ1dGUgKmNvbnN0IHN0YXRlID0gZ2MtPmNsaWVudF9zdGF0ZV9wcml2YXRlOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDE2OworI2VuZGlmCiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoZHB5ICE9IE5VTEwsIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTYyODUsMTAgKzY0MzYsMTMgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfR2V0SGlzdG9ncmFtKEdFVF9ESVNQQVRDSCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LCByZXNldCwgZm9ybWF0LCB0eXBlLCB2YWx1ZXMpKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZQorI2VuZGlmCisgICAgewogICAgICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgICAgICBjb25zdCBfX0dMWGF0dHJpYnV0ZSAqY29uc3Qgc3RhdGUgPSBnYy0+Y2xpZW50X3N0YXRlX3ByaXZhdGU7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwpAQCAtNjMxOSw3ICs2NDczLDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNjM1Nyw5ICs2NTEzLDEyIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2KEdFVF9ESVNQQVRDSCgpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OwpAQCAtNjM4NSw3ICs2NTQ0LDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNjQyMyw5ICs2NTg0LDEyIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldEhpc3RvZ3JhbVBhcmFtZXRlcml2KEdFVF9ESVNQQVRDSCgpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OwpAQCAtNjQ1Miw3ICs2NjE2LDkgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IF9fR0xYYXR0cmlidXRlICpjb25zdCBzdGF0ZSA9IGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxNjsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC02NDkzLDkgKzY2NTksMTIgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAgICAgICAgIENBTExfR2V0TWlubWF4KEdFVF9ESVNQQVRDSCgpLCAodGFyZ2V0LCByZXNldCwgZm9ybWF0LCB0eXBlLCB2YWx1ZXMpKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZQorI2VuZGlmCisgICAgewogICAgICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgICAgICBjb25zdCBfX0dMWGF0dHJpYnV0ZSAqY29uc3Qgc3RhdGUgPSBnYy0+Y2xpZW50X3N0YXRlX3ByaXZhdGU7CiAgICAgICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwpAQCAtNjUyNiw3ICs2Njk1LDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNjU2Miw5ICs2NzMzLDEyIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldE1pbm1heFBhcmFtZXRlcmZ2KEdFVF9ESVNQQVRDSCgpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OwpAQCAtNjU4OSw3ICs2NzYzLDkgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OworI2lmbmRlZiBVU0VfWENCCiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDg7CisjZW5kaWYKICAgICBpZiAoX19idWlsdGluX2V4cGVjdChkcHkgIT0gTlVMTCwgMSkpIHsKICNpZmRlZiBVU0VfWENCCiAgICAgICAgIHhjYl9jb25uZWN0aW9uX3QgKmMgPSBYR2V0WENCQ29ubmVjdGlvbihkcHkpOwpAQCAtNjYyNSw5ICs2ODAxLDEyIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKIAotICAgIGlmIChnYy0+aXNEaXJlY3QpIHsKKyNpZmRlZiBHTFhfRElSRUNUX1JFTkRFUklORworICAgIGlmIChnYy0+ZHJpQ29udGV4dCkgewogICAgICAgICBDQUxMX0dldE1pbm1heFBhcmFtZXRlcml2KEdFVF9ESVNQQVRDSCgpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKICAgICAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4OwpAQCAtNzU4NSw2ICs3NzY0LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTYgKyBfX0dMWF9QQUQobGVuKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobGVuID49IDApICYmIChnYy0+Y3VycmVudERweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgaWYgKGNtZGxlbiA8PSBnYy0+bWF4U21hbGxSZW5kZXJDb21tYW5kU2l6ZSkgewogICAgICAgICAgICAgaWYgKChnYy0+cGMgKyBjbWRsZW4pID4gZ2MtPmJ1ZkVuZCkgewpAQCAtODIwMCw3ICs4MzgzLDEzIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKKyNpZm5kZWYgVVNFX1hDQgogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworI2VuZGlmCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KChuID49IDApICYmIChkcHkgIT0gTlVMTCksIDEpKSB7CiAjaWZkZWYgVVNFX1hDQgogICAgICAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gWEdldFhDQkNvbm5lY3Rpb24oZHB5KTsKQEAgLTgyMzgsNyArODQyNywxMyBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyNlbmRpZgorICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobiA+PSAwKSAmJiAoZHB5ICE9IE5VTEwpLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC04MjcxLDcgKzg0NjYsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC04MzA3LDcgKzg1MDQsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC04MzQzLDcgKzg1NDIsOSBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gODsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC04MzgzLDcgKzg1ODQsOSBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgR0xib29sZWFuIHJldHZhbCA9IChHTGJvb2xlYW4pIDA7CisjaWZuZGVmIFVTRV9YQ0IKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyNlbmRpZgogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRweSAhPSBOVUxMLCAxKSkgewogI2lmZGVmIFVTRV9YQ0IKICAgICAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IFhHZXRYQ0JDb25uZWN0aW9uKGRweSk7CkBAIC04NDE0LDYgKzg2MTcsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4ICsgX19HTFhfUEFEKChuICogNCkpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobiA+PSAwKSAmJiAoZ2MtPmN1cnJlbnREcHkgIT0gTlVMTCksIDEpKSB7CiAgICAgICAgIGlmIChjbWRsZW4gPD0gZ2MtPm1heFNtYWxsUmVuZGVyQ29tbWFuZFNpemUpIHsKICAgICAgICAgICAgIGlmICgoZ2MtPnBjICsgY21kbGVuKSA+IGdjLT5idWZFbmQpIHsKQEAgLTg3NzQsNiArODk4MSwxMCBAQAogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgIEdMYm9vbGVhbiByZXR2YWwgPSAoR0xib29sZWFuKSAwOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KChuID49IDApICYmIChkcHkgIT0gTlVMTCksIDEpKSB7CiAgICAgICAgIEdMdWJ5dGUgY29uc3QgKnBjID0KICAgICAgICAgICAgIF9fZ2xYU2V0dXBWZW5kb3JSZXF1ZXN0KGdjLCBYX0dMWFZlbmRvclByaXZhdGVXaXRoUmVwbHksCkBAIC04ODA5LDYgKzkwMjAsMTAgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA0ICsgX19HTFhfUEFEKChuICogNCkpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobiA+PSAwKSAmJiAoZHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICBHTHVieXRlIGNvbnN0ICpwYyA9CiAgICAgICAgICAgICBfX2dsWFNldHVwVmVuZG9yUmVxdWVzdChnYywgWF9HTFhWZW5kb3JQcml2YXRlLApAQCAtODg0NSw2ICs5MDYwLDEwIEBACiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgR0x1Ynl0ZSBjb25zdCAqcGMgPQogICAgICAgICAgICAgX19nbFhTZXR1cFZlbmRvclJlcXVlc3QoZ2MsIFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKQEAgLTkwNTEsNiArOTI3MCwxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDE2ICsgX19HTFhfUEFEKGxlbik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobGVuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9Mb2FkUHJvZ3JhbU5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZ0YXJnZXQpLCA0KTsKQEAgLTkwNzEsNiArOTI5NCwxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDE2ICsgX19HTFhfUEFEKChudW0gKiAzMikpOworICAgIGlmIChudW0gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG51bSA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfUHJvZ3JhbVBhcmFtZXRlcnM0ZHZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmdGFyZ2V0KSwgNCk7CkBAIC05MDkxLDYgKzkzMTgsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxNiArIF9fR0xYX1BBRCgobnVtICogMTYpKTsKKyAgICBpZiAobnVtIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChudW0gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1Byb2dyYW1QYXJhbWV0ZXJzNGZ2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJnRhcmdldCksIDQpOwpAQCAtOTExMCw2ICs5MzQxLDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gOCArIF9fR0xYX1BBRCgobiAqIDQpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfUmVxdWVzdFJlc2lkZW50UHJvZ3JhbXNOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmbiksIDQpOwpAQCAtOTU2MSw2ICs5Nzk2LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiA4KSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1ZlcnRleEF0dHJpYnMxZHZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmaW5kZXgpLCA0KTsKQEAgLTk1NzksNiArOTgxOCwxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDEyICsgX19HTFhfUEFEKChuICogNCkpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9WZXJ0ZXhBdHRyaWJzMWZ2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJmluZGV4KSwgNCk7CkBAIC05NTk3LDYgKzk4NDAsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobiAqIDIpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfVmVydGV4QXR0cmliczFzdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZpbmRleCksIDQpOwpAQCAtOTYxNSw2ICs5ODYyLDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiAxNikpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9WZXJ0ZXhBdHRyaWJzMmR2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJmluZGV4KSwgNCk7CkBAIC05NjMzLDYgKzk4ODQsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobiAqIDgpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfVmVydGV4QXR0cmliczJmdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZpbmRleCksIDQpOwpAQCAtOTY1MSw2ICs5OTA2LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiA0KSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1ZlcnRleEF0dHJpYnMyc3ZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmaW5kZXgpLCA0KTsKQEAgLTk2NjksNiArOTkyOCwxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDEyICsgX19HTFhfUEFEKChuICogMjQpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfVmVydGV4QXR0cmliczNkdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZpbmRleCksIDQpOwpAQCAtOTY4Nyw2ICs5OTUwLDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiAxMikpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9WZXJ0ZXhBdHRyaWJzM2Z2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJmluZGV4KSwgNCk7CkBAIC05NzA1LDYgKzk5NzIsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobiAqIDYpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfVmVydGV4QXR0cmliczNzdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZpbmRleCksIDQpOwpAQCAtOTcyMyw2ICs5OTk0LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiAzMikpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9WZXJ0ZXhBdHRyaWJzNGR2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJmluZGV4KSwgNCk7CkBAIC05NzQxLDYgKzEwMDE2LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiAxNikpOworICAgIGlmIChuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9WZXJ0ZXhBdHRyaWJzNGZ2TlYsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJmluZGV4KSwgNCk7CkBAIC05NzU5LDYgKzEwMDM4LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMTIgKyBfX0dMWF9QQUQoKG4gKiA4KSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1ZlcnRleEF0dHJpYnM0c3ZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmaW5kZXgpLCA0KTsKQEAgLTk3NzcsNiArMTAwNjAsMTAgQEAKIHsKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSAxMiArIF9fR0xYX1BBRCgobiAqIDQpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfVmVydGV4QXR0cmliczR1YnZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmaW5kZXgpLCA0KTsKQEAgLTk4NDMsNiArMTAxMzAsMTAgQEAKICAgICBfX0dMWGNvbnRleHQgKmNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IGdjLT5jdXJyZW50RHB5OwogICAgIGNvbnN0IEdMdWludCBjbWRsZW4gPSA4ICsgX19HTFhfUEFEKGxlbik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKGxlbiA+PSAwKSAmJiAoZHB5ICE9IE5VTEwpLCAxKSkgewogICAgICAgICBHTHVieXRlIGNvbnN0ICpwYyA9CiAgICAgICAgICAgICBfX2dsWFNldHVwVmVuZG9yUmVxdWVzdChnYywgWF9HTFhWZW5kb3JQcml2YXRlV2l0aFJlcGx5LApAQCAtOTg2Nyw2ICsxMDE1OCwxMCBAQAogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgRGlzcGxheSAqY29uc3QgZHB5ID0gZ2MtPmN1cnJlbnREcHk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDggKyBfX0dMWF9QQUQobGVuKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdCgobGVuID49IDApICYmIChkcHkgIT0gTlVMTCksIDEpKSB7CiAgICAgICAgIEdMdWJ5dGUgY29uc3QgKnBjID0KICAgICAgICAgICAgIF9fZ2xYU2V0dXBWZW5kb3JSZXF1ZXN0KGdjLCBYX0dMWFZlbmRvclByaXZhdGVXaXRoUmVwbHksCkBAIC05ODkwLDYgKzEwMTg1LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDQgKyBfX0dMWF9QQUQobGVuKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChsZW4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1Byb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZ4KSwgOCk7CkBAIC05OTE0LDYgKzEwMjEzLDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDQgKyBfX0dMWF9QQUQobGVuKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChsZW4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1Byb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKHYpLCAzMik7CkBAIC05OTM1LDYgKzEwMjM4LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gMjggKyBfX0dMWF9QQUQobGVuKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoX19idWlsdGluX2V4cGVjdChsZW4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX1Byb2dyYW1OYW1lZFBhcmFtZXRlcjRmdk5WLCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZpZCksIDQpOwpAQCAtOTk1OSw2ICsxMDI2NiwxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDI4ICsgX19HTFhfUEFEKGxlbik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobGVuID49IDAsIDEpKSB7CiAgICAgICAgIGVtaXRfaGVhZGVyKGdjLT5wYywgWF9HTHJvcF9Qcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZnZOViwgY21kbGVuKTsKICAgICAgICAgKHZvaWQpIG1lbWNweSgodm9pZCAqKSAoZ2MtPnBjICsgNCksICh2b2lkICopICgmaWQpLCA0KTsKQEAgLTEwMDQ0LDYgKzEwMzU1LDEwIEBACiB7CiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gOCArIF9fR0xYX1BBRCgobiAqIDQpKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QobiA+PSAwLCAxKSkgewogICAgICAgICBlbWl0X2hlYWRlcihnYy0+cGMsIFhfR0xyb3BfRGVsZXRlRnJhbWVidWZmZXJzRVhULCBjbWRsZW4pOwogICAgICAgICAodm9pZCkgbWVtY3B5KCh2b2lkICopIChnYy0+cGMgKyA0KSwgKHZvaWQgKikgKCZuKSwgNCk7CkBAIC0xMDA2Miw2ICsxMDM3NywxMCBAQAogewogICAgIF9fR0xYY29udGV4dCAqY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgY29uc3QgR0x1aW50IGNtZGxlbiA9IDggKyBfX0dMWF9QQUQoKG4gKiA0KSk7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIF9fZ2xYU2V0RXJyb3IoZ2MsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG4gPj0gMCwgMSkpIHsKICAgICAgICAgZW1pdF9oZWFkZXIoZ2MtPnBjLCBYX0dMcm9wX0RlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQsIGNtZGxlbik7CiAgICAgICAgICh2b2lkKSBtZW1jcHkoKHZvaWQgKikgKGdjLT5wYyArIDQpLCAodm9pZCAqKSAoJm4pLCA0KTsKQEAgLTEwMTYxLDYgKzEwNDgwLDEwIEBACiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgR0x1Ynl0ZSBjb25zdCAqcGMgPQogICAgICAgICAgICAgX19nbFhTZXR1cFZlbmRvclJlcXVlc3QoZ2MsIFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKQEAgLTEwMTgwLDYgKzEwNTAzLDEwIEBACiAgICAgX19HTFhjb250ZXh0ICpjb25zdCBnYyA9IF9fZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKICAgICBjb25zdCBHTHVpbnQgY21kbGVuID0gNDsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgX19nbFhTZXRFcnJvcihnYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKG4gPj0gMCkgJiYgKGRweSAhPSBOVUxMKSwgMSkpIHsKICAgICAgICAgR0x1Ynl0ZSBjb25zdCAqcGMgPQogICAgICAgICAgICAgX19nbFhTZXR1cFZlbmRvclJlcXVlc3QoZ2MsIFhfR0xYVmVuZG9yUHJpdmF0ZVdpdGhSZXBseSwKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL2dseF90ZXh0dXJlX2NvbXByZXNzaW9uLmMgYi9zcmMvZ2x4L3gxMS9pbmRpcmVjdF90ZXh0dXJlX2NvbXByZXNzaW9uLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nbHgveDExL2dseF90ZXh0dXJlX2NvbXByZXNzaW9uLmMKcmVuYW1lIHRvIHNyYy9nbHgveDExL2luZGlyZWN0X3RleHR1cmVfY29tcHJlc3Npb24uYwpkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvaW5kaXJlY3RfdmVydGV4X2FycmF5LmMgYi9zcmMvZ2x4L3gxMS9pbmRpcmVjdF92ZXJ0ZXhfYXJyYXkuYwppbmRleCA5MGVjMjc3Li5jN2EyMGUyIDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9pbmRpcmVjdF92ZXJ0ZXhfYXJyYXkuYworKysgYi9zcmMvZ2x4L3gxMS9pbmRpcmVjdF92ZXJ0ZXhfYXJyYXkuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPEdML2dseHByb3RvLmg+CiAjaW5jbHVkZSAiZ2x4ZXh0ZW5zaW9ucy5oIgogI2luY2x1ZGUgImluZGlyZWN0X3ZlcnRleF9hcnJheS5oIgotI2luY2x1ZGUgImluZGlyZWN0X3ZhX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJpbmRpcmVjdF92ZXJ0ZXhfYXJyYXlfcHJpdi5oIgogCiAjZGVmaW5lIF9fR0xYX1BBRChuKSAoKChuKSszKSAmIH4zKQogCkBAIC02Miw3ICs2Miw3IEBACiAgKiAidmJvIiwgdG8gc3VwcG9ydCBtdWx0aXBsZSB0ZXh0dXJlIGNvb3JkaW5hdGUgYXJyYXlzLCBnZW5lcmljIGF0dHJpYnV0ZXMsCiAgKiBhbmQgdmVydGV4IGJ1ZmZlciBvYmplY3RzLgogICoKLSAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpZHJAdXMuaWJtLmNvbT4KKyAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpYW4uZC5yb21hbmlja0BpbnRlbC5jb20+CiAgKi8KIAogc3RhdGljIHZvaWQgZW1pdF9EcmF3QXJyYXlzX25vbmUoIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCApOwpAQCAtMTAxLDYgKzEwMSwzMSBAQAogfTsKIAogCisvKioKKyAqIEZyZWUgdGhlIHBlci1jb250ZXh0IGFycmF5IHN0YXRlIHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoCisgKiBfX2dsWEluaXRWZXJ0ZXhBcnJheVN0YXRlKCkuCisgKi8KK3ZvaWQKK19fZ2xYRnJlZVZlcnRleEFycmF5U3RhdGUoIF9fR0xYY29udGV4dCAqIGdjICkKK3sKKyAgICBfX0dMWGF0dHJpYnV0ZSAqIHN0YXRlID0gKF9fR0xYYXR0cmlidXRlICopKGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZSk7CisgICAgc3RydWN0IGFycmF5X3N0YXRlX3ZlY3RvciogYXJyYXlzID0gc3RhdGUtPmFycmF5X3N0YXRlOworCisgICAgaWYgKGFycmF5cykgeworICAgICAgICBpZiAoYXJyYXlzLT5zdGFjaykgeworICAgICAgICAgICAgZnJlZShhcnJheXMtPnN0YWNrKTsKKyAgICAgICAgICAgIGFycmF5cy0+c3RhY2sgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChhcnJheXMtPmFycmF5cykgeworICAgICAgICAgICAgZnJlZShhcnJheXMtPmFycmF5cyk7CisgICAgICAgICAgICBhcnJheXMtPmFycmF5cyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShhcnJheXMpOworICAgICAgICBhcnJheXMgPSBOVUxMOworICAgICAgICBzdGF0ZS0+YXJyYXlfc3RhdGUgPSBOVUxMOworICAgIH0KK30KKwogCiAvKioKICAqIEluaXRpYWxpemUgdmVydGV4IGFycmF5IHN0YXRlIG9mIGEgR0xYIGNvbnRleHQuCkBAIC00ODUsMTQgKzUxMCwxNCBAQAogCiAgICAgZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CiAJaWYgKCAocGMgKyBzaW5nbGVfdmVydGV4X3NpemUpID49IGdjLT5idWZFbmQgKSB7Ci0JICAgIHBjID0gX19nbFhGbHVzaFJlbmRlckJ1ZmZlcihnYywgZ2MtPnBjKTsKKwkgICAgcGMgPSBfX2dsWEZsdXNoUmVuZGVyQnVmZmVyKGdjLCBwYyk7CiAJfQogCiAJcGMgPSBlbWl0X2VsZW1lbnRfbm9uZSggcGMsIGFycmF5cywgZmlyc3QgKyBpICk7CiAgICAgfQogCiAgICAgaWYgKCAocGMgKyA0KSA+PSBnYy0+YnVmRW5kICkgewotCXBjID0gX19nbFhGbHVzaFJlbmRlckJ1ZmZlcihnYywgZ2MtPnBjKTsKKwlwYyA9IF9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoZ2MsIHBjKTsKICAgICB9CiAKICAgICAodm9pZCkgbWVtY3B5KCBwYywgZW5kX2NtZCwgNCApOwpAQCAtNTI3LDcgKzU1Miw3IEBACiBlbWl0X0RyYXdBcnJheXNfaGVhZGVyX29sZCggX19HTFhjb250ZXh0ICogZ2MsCiAJCQkgICAgc3RydWN0IGFycmF5X3N0YXRlX3ZlY3RvciAqIGFycmF5cywKIAkJCSAgICBzaXplX3QgKiBlbGVtZW50c19wZXJfcmVxdWVzdCwKLQkJCSAgICBzaXplX3QgKiB0b3RhbF9yZXF1ZXN0cywKKwkJCSAgICB1bnNpZ25lZCBpbnQgKiB0b3RhbF9yZXF1ZXN0cywKIAkJCSAgICBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCApCiB7CiAgICAgc2l6ZV90IGNvbW1hbmRfc2l6ZTsKQEAgLTY0MCw3ICs2NjUsNyBAQAogCiAgICAgR0x1Ynl0ZSAqIHBjOwogICAgIHNpemVfdCBlbGVtZW50c19wZXJfcmVxdWVzdDsKLSAgICBzaXplX3QgdG90YWxfcmVxdWVzdHMgPSAwOworICAgIHVuc2lnbmVkIHRvdGFsX3JlcXVlc3RzID0gMDsKICAgICB1bnNpZ25lZCBpOwogICAgIHNpemVfdCB0b3RhbF9zZW50ID0gMDsKIApAQCAtNzI2LDcgKzc1MSw3IEBACiAJdW5zaWduZWQgIGluZGV4ID0gMDsKIAogCWlmICggKHBjICsgc2luZ2xlX3ZlcnRleF9zaXplKSA+PSBnYy0+YnVmRW5kICkgewotCSAgICBwYyA9IF9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoZ2MsIGdjLT5wYyk7CisJICAgIHBjID0gX19nbFhGbHVzaFJlbmRlckJ1ZmZlcihnYywgcGMpOwogCX0KIAogCXN3aXRjaCggdHlwZSApIHsKQEAgLTc0NCw3ICs3NjksNyBAQAogICAgIH0KIAogICAgIGlmICggKHBjICsgNCkgPj0gZ2MtPmJ1ZkVuZCApIHsKLQlwYyA9IF9fZ2xYRmx1c2hSZW5kZXJCdWZmZXIoZ2MsIGdjLT5wYyk7CisJcGMgPSBfX2dsWEZsdXNoUmVuZGVyQnVmZmVyKGdjLCBwYyk7CiAgICAgfQogCiAgICAgKHZvaWQpIG1lbWNweSggcGMsIGVuZF9jbWQsIDQgKTsKQEAgLTc3MCw5ICs3OTUsMTAgQEAKIAogICAgIEdMdWJ5dGUgKiBwYzsKICAgICBzaXplX3QgZWxlbWVudHNfcGVyX3JlcXVlc3Q7Ci0gICAgc2l6ZV90IHRvdGFsX3JlcXVlc3RzID0gMDsKKyAgICB1bnNpZ25lZCB0b3RhbF9yZXF1ZXN0cyA9IDA7CiAgICAgdW5zaWduZWQgaTsKICAgICB1bnNpZ25lZCByZXE7CisgICAgdW5zaWduZWQgcmVxX2VsZW1lbnQ9MDsKIAogCiAgICAgcGMgPSBlbWl0X0RyYXdBcnJheXNfaGVhZGVyX29sZCggZ2MsIGFycmF5cywgJiBlbGVtZW50c19wZXJfcmVxdWVzdCwKQEAgLTc5MCw3ICs4MTYsNyBAQAogCiAJc3dpdGNoKCB0eXBlICkgewogCWNhc2UgR0xfVU5TSUdORURfSU5UOiB7Ci0JICAgIGNvbnN0IEdMdWludCAgICogdWlfcHRyID0gKGNvbnN0IEdMdWludCAgICopIGluZGljZXM7CisJICAgIGNvbnN0IEdMdWludCAgICogdWlfcHRyID0gKGNvbnN0IEdMdWludCAgICopIGluZGljZXMgKyByZXFfZWxlbWVudDsKIAogCSAgICBmb3IgKCBpID0gMCA7IGkgPCBlbGVtZW50c19wZXJfcmVxdWVzdCA7IGkrKyApIHsKIAkJY29uc3QgR0xpbnQgaW5kZXggPSAoR0xpbnQpICoodWlfcHRyKyspOwpAQCAtNzk5LDcgKzgyNSw3IEBACiAJICAgIGJyZWFrOwogCX0KIAljYXNlIEdMX1VOU0lHTkVEX1NIT1JUOiB7Ci0JICAgIGNvbnN0IEdMdXNob3J0ICogdXNfcHRyID0gKGNvbnN0IEdMdXNob3J0ICopIGluZGljZXM7CisJICAgIGNvbnN0IEdMdXNob3J0ICogdXNfcHRyID0gKGNvbnN0IEdMdXNob3J0ICopIGluZGljZXMgKyByZXFfZWxlbWVudDsKIAogCSAgICBmb3IgKCBpID0gMCA7IGkgPCBlbGVtZW50c19wZXJfcmVxdWVzdCA7IGkrKyApIHsKIAkJY29uc3QgR0xpbnQgaW5kZXggPSAoR0xpbnQpICoodXNfcHRyKyspOwpAQCAtODA4LDcgKzgzNCw3IEBACiAJICAgIGJyZWFrOwogCX0KIAljYXNlIEdMX1VOU0lHTkVEX0JZVEU6IHsKLQkgICAgY29uc3QgR0x1Ynl0ZSAgKiB1Yl9wdHIgPSAoY29uc3QgR0x1Ynl0ZSAgKikgaW5kaWNlczsKKwkgICAgY29uc3QgR0x1Ynl0ZSAgKiB1Yl9wdHIgPSAoY29uc3QgR0x1Ynl0ZSAgKikgaW5kaWNlcyArIHJlcV9lbGVtZW50OwogCiAJICAgIGZvciAoIGkgPSAwIDsgaSA8IGVsZW1lbnRzX3Blcl9yZXF1ZXN0IDsgaSsrICkgewogCQljb25zdCBHTGludCBpbmRleCA9IChHTGludCkgKih1Yl9wdHIrKyk7CkBAIC04MjYsNiArODUyLDcgQEAKIAl9CiAKIAljb3VudCAtPSBlbGVtZW50c19wZXJfcmVxdWVzdDsKKwlyZXFfZWxlbWVudCArPSBlbGVtZW50c19wZXJfcmVxdWVzdDsKICAgICB9CiAKIApAQCAtMTU5OSwxNyArMTYyNiwyMSBAQAogCiAKIC8qKgorICogTW9kaWZ5IHRoZSBlbmFibGUgc3RhdGUgZm9yIHRoZSBzZWxlY3RlZCBhcnJheQogICovCiBHTGJvb2xlYW4KLV9fZ2xYU2V0QXJyYXlFbmFibGUoIF9fR0xYYXR0cmlidXRlICogc3RhdGUsCi0JCSAgICAgR0xlbnVtIGtleSwgdW5zaWduZWQgaW5kZXgsIEdMYm9vbGVhbiBlbmFibGUgKQorX19nbFhTZXRBcnJheUVuYWJsZShfX0dMWGF0dHJpYnV0ZSAqc3RhdGUsIEdMZW51bSBrZXksIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gZW5hYmxlKQogewogICAgIHN0cnVjdCBhcnJheV9zdGF0ZV92ZWN0b3IgKiBhcnJheXMgPSBzdGF0ZS0+YXJyYXlfc3RhdGU7CiAgICAgc3RydWN0IGFycmF5X3N0YXRlICogYTsKICAgICAKIAotICAgIGlmICgga2V5ID09IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgKSB7Ci0JaW5kZXggPSBhcnJheXMtPmFjdGl2ZV90ZXh0dXJlX3VuaXQ7CisgICAgLyogVGV4dHVyZSBjb29yZGluYXRlIGFycmF5cyBoYXZlIGFuIGltcGxpY3QgaW5kZXggc2V0IHdoZW4gdGhlCisgICAgICogYXBwbGljYXRpb24gY2FsbHMgZ2xDbGllbnRBY3RpdmVUZXh0dXJlLgorICAgICAqLworICAgIGlmIChrZXkgPT0gR0xfVEVYVFVSRV9DT09SRF9BUlJBWSkgeworICAgICAgICBpbmRleCA9IGFycmF5cy0+YWN0aXZlX3RleHR1cmVfdW5pdDsKICAgICB9CiAKICAgICBhID0gZ2V0X2FycmF5X2VudHJ5KCBhcnJheXMsIGtleSwgaW5kZXggKTsKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL2luZGlyZWN0X3ZhX3ByaXZhdGUuaCBiL3NyYy9nbHgveDExL2luZGlyZWN0X3ZlcnRleF9hcnJheV9wcml2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nbHgveDExL2luZGlyZWN0X3ZhX3ByaXZhdGUuaApyZW5hbWUgdG8gc3JjL2dseC94MTEvaW5kaXJlY3RfdmVydGV4X2FycmF5X3ByaXYuaApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvaW5kaXJlY3RfdmVydGV4X3Byb2dyYW0uYyBiL3NyYy9nbHgveDExL2luZGlyZWN0X3ZlcnRleF9wcm9ncmFtLmMKaW5kZXggNTM4M2RjYy4uOGQ3Y2VjOSAxMDA2NDQKLS0tIGEvc3JjL2dseC94MTEvaW5kaXJlY3RfdmVydGV4X3Byb2dyYW0uYworKysgYi9zcmMvZ2x4L3gxMS9pbmRpcmVjdF92ZXJ0ZXhfcHJvZ3JhbS5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPEdML2dsLmg+CiAjaW5jbHVkZSAiaW5kaXJlY3QuaCIKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL3BpeGVsc3RvcmUuYyBiL3NyYy9nbHgveDExL3BpeGVsc3RvcmUuYwppbmRleCA2ZjI1ZWQ3Li44MmEwMTUxIDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9waXhlbHN0b3JlLmMKKysrIGIvc3JjL2dseC94MTEvcGl4ZWxzdG9yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAqKgogKi8KIAorI2luY2x1ZGUgImdsaGVhZGVyLmgiCiAjaW5jbHVkZSAiZ2x4Y2xpZW50LmgiCiAjaW5jbHVkZSAiaW5kaXJlY3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEvc2luZ2xlcGl4LmMgYi9zcmMvZ2x4L3gxMS9zaW5nbGVwaXguYwppbmRleCBjZDg4Njg0Li45Yzk4NGM3IDEwMDY0NAotLS0gYS9zcmMvZ2x4L3gxMS9zaW5nbGVwaXguYworKysgYi9zcmMvZ2x4L3gxMS9zaW5nbGVwaXguYwpAQCAtMzMsNiArMzMsNyBAQAogKioKICovCiAKKyNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgInBhY2tzaW5nbGUuaCIKICNpbmNsdWRlICJpbmRpcmVjdC5oIgogI2luY2x1ZGUgImRpc3BhdGNoLmgiCkBAIC0xMTcsMTIgKzExOCwxNCBAQAogewogICAgIF9fR0xYY29udGV4dCAqIGNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOwogCi0gICAgaWYgKGdjLT5pc0RpcmVjdCkgeworI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCisgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7CiAJQ0FMTF9HZXRTZXBhcmFibGVGaWx0ZXIoR0VUX0RJU1BBVENIKCksCiAJCQkJKHRhcmdldCwgZm9ybWF0LCB0eXBlLCByb3csIGNvbHVtbiwgc3BhbikpOwogCXJldHVybjsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIAorI2VuZGlmCisgICAgewogICAgICAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSBnYy0+Y3VycmVudERweTsKIAljb25zdCBHTHVpbnQgY21kbGVuID0gX19HTFhfUEFEKDEzKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2dseC94MTEveGY4NmRyaS5oIGIvc3JjL2dseC94MTEveGY4NmRyaS5oCmluZGV4IGM4Yzg3OGYuLmE2YTU3YzMgMTAwNjQ0Ci0tLSBhL3NyYy9nbHgveDExL3hmODZkcmkuaAorKysgYi9zcmMvZ2x4L3gxMS94Zjg2ZHJpLmgKQEAgLTY0LDggKzY0LDYgQEAKIAogI2lmbmRlZiBfWEY4NkRSSV9TRVJWRVJfCiAKLSNpbmNsdWRlIDxHTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmg+Ci0KIF9YRlVOQ1BST1RPQkVHSU4KIAogQm9vbCBYRjg2RFJJUXVlcnlFeHRlbnNpb24oIERpc3BsYXkgKmRweSwgaW50ICpldmVudF9iYXNlLCBpbnQgKmVycm9yX2Jhc2UgKTsKQEAgLTkzLDE0ICs5MSwxNCBAQAogQm9vbCBYRjg2RFJJQ3JlYXRlQ29udGV4dFdpdGhDb25maWcoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IGNvbmZpZ0lELAogICAgIFhJRCAqcHRyX3RvX3JldHVybmVkX2NvbnRleHRfaWQsIGRybV9jb250ZXh0X3QgKmhIV0NvbnRleHQgKTsKIAotZXh0ZXJuIEdMYm9vbGVhbiBYRjg2RFJJRGVzdHJveUNvbnRleHQoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLAotICAgIF9fRFJJaWQgY29udGV4dF9pZCApOworZXh0ZXJuIEdMYm9vbGVhbiBYRjg2RFJJRGVzdHJveUNvbnRleHQoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwKKyAgICBYSUQgY29udGV4dF9pZCApOwogCi1leHRlcm4gR0xib29sZWFuIFhGODZEUklDcmVhdGVEcmF3YWJsZSggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCi0gICAgX19EUklpZCBkcmF3YWJsZSwgZHJtX2RyYXdhYmxlX3QgKmhIV0RyYXdhYmxlICk7CitleHRlcm4gR0xib29sZWFuIFhGODZEUklDcmVhdGVEcmF3YWJsZSggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLAorICAgIFhJRCBkcmF3YWJsZSwgZHJtX2RyYXdhYmxlX3QgKmhIV0RyYXdhYmxlICk7CiAKLWV4dGVybiBHTGJvb2xlYW4gWEY4NkRSSURlc3Ryb3lEcmF3YWJsZSggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIAotICAgIF9fRFJJaWQgZHJhd2FibGUpOworZXh0ZXJuIEdMYm9vbGVhbiBYRjg2RFJJRGVzdHJveURyYXdhYmxlKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIAorICAgIFhJRCBkcmF3YWJsZSk7CiAKIEJvb2wgWEY4NkRSSUdldERyYXdhYmxlSW5mbyggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBEcmF3YWJsZSBkcmF3YWJsZSwKICAgICB1bnNpZ25lZCBpbnQgKmluZGV4LCB1bnNpZ25lZCBpbnQgKnN0YW1wLCAKZGlmZiAtLWdpdCBhL3NyYy9nbHgveDExL3hmb250LmMgYi9zcmMvZ2x4L3gxMS94Zm9udC5jCmluZGV4IGYzZTNkYTMuLjZlYzhjMmQgMTAwNjQ0Ci0tLSBhL3NyYy9nbHgveDExL3hmb250LmMKKysrIGIvc3JjL2dseC94MTEveGZvbnQuYwpAQCAtMzMsNiArMzMsNyBAQAogICBjYWxsZWQgYnkgdGhhdCByb3V0aW5lIHdoZW4gZGlyZWN0IHJlbmRlcmluZyBpcyBlbmFibGVkLgogKi8KIAorI2lmZGVmIEdMWF9ESVJFQ1RfUkVOREVSSU5HCiAKICNpbmNsdWRlICJnbHhjbGllbnQuaCIKIApAQCAtMjA4LDggKzIwOSw3IEBACiAgIHJldHVybihOVUxMKTsKIH0KIAotCi12b2lkIERSSV9nbFhVc2VYRm9udCggRm9udCBmb250LCBpbnQgZmlyc3QsIGludCBjb3VudCwgaW50IGxpc3RiYXNlICkKK19YX0hJRERFTiB2b2lkIERSSV9nbFhVc2VYRm9udCggRm9udCBmb250LCBpbnQgZmlyc3QsIGludCBjb3VudCwgaW50IGxpc3RiYXNlICkKIHsKICAgR0xYQ29udGV4dCBDQzsKICAgRGlzcGxheSAqZHB5OwpAQCAtMzczLDQgKzM3Myw0IEBACiAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgYWxpZ25tZW50KTsKIH0KIAotLyogVGhlIEVuZC4gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvTWFrZWZpbGUgYi9zcmMvbWVzYS9NYWtlZmlsZQppbmRleCBjZDQyY2Q2Li4wNjhkOWIzIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9NYWtlZmlsZQpAQCAtMyw4ICszLDcgQEAKIFRPUCA9IC4uLy4uCiBpbmNsdWRlICQoVE9QKS9jb25maWdzL2N1cnJlbnQKIAotaW5jbHVkZSBzb3VyY2VzLm1hawotCitpbmNsdWRlIHNvdXJjZXMKIAogLlNVRkZJWEVTIDogLmNwcAogCkBAIC0xOSwyMSArMTgsMjUgQEAKIAogCiAKLUdMQVBJX0xJQiA9IGxpYmdsYXBpLmEKKyMgRGVmYXVsdDogYnVpbGQgZGVwZW5kZW5jaWVzLCB0aGVuIGFzbV9zdWJkaXJzLCB0aGVuIGNvbnZlbmllbmNlCisjIGxpYnMgKC5hKSBhbmQgZmluYWxseSB0aGUgZGV2aWNlIGRyaXZlcnM6CitkZWZhdWx0OiBkZXBlbmQgYXNtX3N1YmRpcnMgbGlibWVzYS5hIGxpYmdsYXBpLmEgZHJpdmVyX3N1YmRpcnMKIAogCiAjIERlZmF1bHQ6IGJ1aWxkIGRlcGVuZGVuY2llcywgdGhlbiBhc21fc3ViZGlycywgdGhlbiBjb252ZW5pZW5jZQogIyBsaWJzICguYSkgYW5kIGZpbmFsbHkgdGhlIGRldmljZSBkcml2ZXJzOgogZGVmYXVsdDogZGVwZW5kIGFzbV9zdWJkaXJzIGxpYm1lc2EuYSAkKEdMQVBJX0xJQikgZHJpdmVyX3N1YmRpcnMKIAotCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgSGVscGVyIGxpYnJhcmllcyB1c2VkIGJ5IG1hbnkgZHJpdmVyczoKIAogIyBNYWtlIGFyY2hpdmUgb2YgY29yZSBtZXNhIG9iamVjdCBmaWxlcwogbGlibWVzYS5hOiAkKE1FU0FfT0JKRUNUUykKLQlAICQoVE9QKS9iaW4vbWtsaWIgLW8gbWVzYSAtc3RhdGljICQoTUVTQV9PQkpFQ1RTKQorCUAgJChNS0xJQikgLW8gbWVzYSAtc3RhdGljICQoTUVTQV9PQkpFQ1RTKQorCisjIE1ha2UgYXJjaGl2ZSBvZiBnbCogQVBJIGRpc3BhdGNoZXIgZnVuY3Rpb25zIG9ubHkKK2xpYmdsYXBpLmE6ICQoR0xBUElfT0JKRUNUUykKKwlAICQoTUtMSUIpIC1vIGdsYXBpIC1zdGF0aWMgJChHTEFQSV9PQkpFQ1RTKQogCiAjIE1ha2UgYXJjaGl2ZSBvZiBnbCogQVBJIGRpc3BhdGNoZXIgZnVuY3Rpb25zIG9ubHkKICQoR0xBUElfTElCKTogJChHTEFQSV9PQkpFQ1RTKQpAQCAtNDMsMTAgKzQ2LDkgQEAKIAkJJChUT1ApL2Jpbi9ta2xpYiAtbyBnbGFwaSAtc3RhdGljICQoR0xBUElfT0JKRUNUUykgOyBcCiAJZmkKIAotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIERldmljZSBkcml2ZXJzCi1kcml2ZXJfc3ViZGlyczogbGlibWVzYS5hICQoR0xBUElfTElCKQorZHJpdmVyX3N1YmRpcnM6IGxpYm1lc2EuYSBsaWJnbGFwaS5hCiAJKGNkIGRyaXZlcnMgJiYgJChNQUtFKSkKIAogCkBAIC05NywyOCArOTksMjkgQEAKIAogcGNlZGl0ID0gc2VkIFwKIAktZSAncyxASU5TVEFMTF9ESVJALCQoSU5TVEFMTF9ESVIpLCcgXAotCS1lICdzLEBMSUJfRElSQCwkKExJQl9ESVIpLCcgXAorCS1lICdzLEBJTlNUQUxMX0xJQl9ESVJALCQoSU5TVEFMTF9MSUJfRElSKSwnIFwKKwktZSAncyxASU5TVEFMTF9JTkNfRElSQCwkKElOU1RBTExfSU5DX0RJUiksJyBcCiAJLWUgJ3MsQFZFUlNJT05ALCQoTUVTQV9NQUpPUikuJChNRVNBX01JTk9SKS4kKE1FU0FfVElOWSksJwogCiBnbC5wYzogZ2wucGMuaW4KIAkkKHBjZWRpdCkgJDwgPiAkQAogCiBpbnN0YWxsLWhlYWRlcnM6Ci0JJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0RJUikvaW5jbHVkZS9HTAorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9JTkNfRElSKS9HTAogCSQoSU5TVEFMTCkgLW0gNjQ0ICQoVE9QKS9pbmNsdWRlL0dMLyouaCBcCi0JCSQoREVTVERJUikkKElOU1RBTExfRElSKS9pbmNsdWRlL0dMCisJCSQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wKIAogaW5zdGFsbC1saWJnbDogZGVmYXVsdCBnbC5wYyBpbnN0YWxsLWhlYWRlcnMKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCi0JJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0RJUikvJChMSUJfRElSKS9wa2djb25maWcKLQkkKElOU1RBTEwpICQoVE9QKS8kKExJQl9ESVIpLyQoR0xfTElCX05BTUUpKiBcCi0JCSQoREVTVERJUikkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCi0JJChJTlNUQUxMKSAtbSA2NDQgZ2wucGMgJChERVNURElSKSQoSU5TVEFMTF9ESVIpLyQoTElCX0RJUikvcGtnY29uZmlnCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpL3BrZ2NvbmZpZworCSQoSU5TVEFMTCkgJChUT1ApLyQoTElCX0RJUikvJChHTF9MSUJfR0xPQikgXAorCQkkKERFU1RESVIpJChJTlNUQUxMX0xJQl9ESVIpCisJJChJTlNUQUxMKSAtbSA2NDQgZ2wucGMgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKS9wa2djb25maWcKIAogaW5zdGFsbC1vc21lc2E6IGRlZmF1bHQKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfRElSKS8kKExJQl9ESVIpCi0JJChJTlNUQUxMKSAkKFRPUCkvJChMSUJfRElSKS8kKE9TTUVTQV9MSUJfTkFNRSkqIFwKLQkJJChERVNURElSKSQoSU5TVEFMTF9ESVIpLyQoTElCX0RJUikKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikKKwkkKElOU1RBTEwpICQoVE9QKS8kKExJQl9ESVIpLyQoT1NNRVNBX0xJQl9HTE9CKSBcCisJCSQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikKIAogaW5zdGFsbC1kcmk6IGRlZmF1bHQKIAljZCBkcml2ZXJzL2RyaSAmJiAkKE1BS0UpIGluc3RhbGwKQEAgLTEzMywxMCArMTM2LDEwIEBACiBjbGVhbjoKIAktcm0gLWYgKi8qLm8KIAktcm0gLWYgKi8qLyoubwotCS1ybSAtZiBkZXBlbmQgZGVwZW5kLmJhayBsaWJtZXNhLmEgJChHTEFQSV9MSUIpCisJLXJtIC1mIGRlcGVuZCBkZXBlbmQuYmFrIGxpYm1lc2EuYSBsaWJnbGFwaS5hCiAJLXJtIC1mIGRyaXZlcnMvKi8qLm8KKwktcm0gLWYgKi5wYwogCS1AY2QgZHJpdmVycy9kcmkgJiYgJChNQUtFKSBjbGVhbgotCS1AY2QgZHJpdmVycy94b3JnICYmICQoTUFLRSkgY2xlYW4KIAktQGNkIGRyaXZlcnMveDExICYmICQoTUFLRSkgY2xlYW4KIAktQGNkIGRyaXZlcnMvb3NtZXNhICYmICQoTUFLRSkgY2xlYW4KIAktQGNkIHg4NiAmJiAkKE1BS0UpIGNsZWFuCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9NYWtlZmlsZS5tZ3cgYi9zcmMvbWVzYS9NYWtlZmlsZS5tZ3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0NGRlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL01ha2VmaWxlLm1ndwpAQCAtMCwwICsxLDIzNSBAQAorIyBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisjIFZlcnNpb246ICA3LjAKKyMgCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDAzICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIyAKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjIAorIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyMgTWluR1cgY29yZSBtYWtlZmlsZSB2MS40IGZvciBNZXNhCisjCisjICBDb3B5cmlnaHQgKEMpIDIwMDIgLSBEYW5pZWwgQm9yY2EKKyMgIEVtYWlsIDogZGJvcmNhQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorIyAgV2ViICAgOiBodHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vZGJvcmNhCisKKyMgTWluR1cgY29yZS1nbCBtYWtlZmlsZSB1cGRhdGVkIGZvciBNZXNhIDcuMAorIworIyAgdXBkYXRlZCA6IGJ5IEhlcm9teXRoLCBvbiAyMDA3LTctMjEKKyMgIEVtYWlsICAgOiB6eHBteXRoQHlhaG9vLmNvbS5jbgorIyAgQnVncyAgICA6IDEpIEFsbCB0aGUgZGVmYXVsdCBzZXR0aW5ncyB3b3JrIGZpbmUuIEJ1dCB0aGUgc2V0dGluZyBYODY9MSBjYW4ndCB3b3JrLiAKKyMgICAgICAgICAgICBUaGUgb3RoZXJzIGhhdm4ndCBiZWVuIHRlc3RlZCB5ZXQuCisjICAgICAgICAgICAgMikgVGhlIGdlbmVyYXRlZCBETExzIGFyZSAqbm90KiBjb21wYXRpYmxlIHdpdGggdGhlIG9uZXMgYnVpbHQKKyMgICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBjb21waWxlcnMgbGlrZSBWQzgsIGVzcGVjaWFsbHkgZm9yIEdMVVQuIAorIyAgICAgICAgICAgIDMpIEFsdGhvdWdoIG1vcmUgdGVzdHMgYXJlIG5lZWRlZCwgaXQgY2FuIGJlIHVzZWQgaW5kaXZpZHVhbGx5IQorCisKKyMKKyMgIEF2YWlsYWJsZSBvcHRpb25zOgorIworIyAgICBFbnZpcm9ubWVudCB2YXJpYWJsZXM6CisjCUNGTEFHUworIworIwlHTElERQkJcGF0aCB0byBHbGlkZTMgU0RLOyB1c2VkIHdpdGggRlguCisjCQkJZGVmYXVsdCA9ICQoVE9QKS9nbGlkZTMKKyMJRlg9MQkJYnVpbGQgZm9yIDNkZnggR2xpZGUzLiBOb3RlIHRoYXQgdGhpcyBkaXNhYmxlcworIwkJCWNvbXBpbGF0aW9uIG9mIG1vc3QgV01lc2EgY29kZSBhbmQgcmVxdWlyZXMgZnhNZXNhLgorIwkJCUFzIGEgY29uc2VxdWVuY2UsIHlvdSdsbCBuZWVkIHRoZSBXaW4zMiBHbGlkZTMKKyMJCQlsaWJyYXJ5IHRvIGJ1aWxkIGFueSBhcHBsaWNhdGlvbi4KKyMJCQlkZWZhdWx0ID0gbm8KKyMJSUNEPTEJCWJ1aWxkIHRoZSBpbnN0YWxsYWJsZSBjbGllbnQgZHJpdmVyIGludGVyZmFjZQorIwkJCSh3aW5kb3dzIG9wZW5nbCBkcml2ZXIgaW50ZXJmYWNlKQorIwkJCWRlZmF1bHQgPSBubworIwlYODY9MQkJb3B0aW1pemUgZm9yIHg4NiAoaWYgcG9zc2libGUsIHVzZSBNTVgsIFNTRSwgM0ROb3cpLgorIwkJCWRlZmF1bHQgPSBubworIworIyAgICBUYXJnZXRzOgorIwlhbGw6CQlidWlsZCBHTAorIwljbGVhbjoJCXJlbW92ZSBvYmplY3QgZmlsZXMKKyMKKworCisuUEhPTlk6IGFsbCBjbGVhbgorLklOVEVSTUVESUFURTogeDg2L2dlbl9tYXR5cGVzLmV4ZQorLlNVRkZJWEVTOiAucmMgLnJlcworCisjIFNldCB0aGlzIHRvIHRoZSBwcmVmaXggb2YgeW91ciBidWlsZCB0b29scywgaS5lLiBtaW5ndzMyLQorVE9PTFNfUFJFRklYID0gbWluZ3czMi0KKworaWZlcSAoJChJQ0QpLDEpCisgIExJQl9OQU1FID0gbWVzYTMyCitlbHNlCisgIExJQl9OQU1FID0gb3BlbmdsMzIKK2VuZGlmCisKK0RMTF9FWFQgPSAuZGxsCitJTVBfRVhUID0gLmEKK0xJQl9QUkUgPSBsaWIKK1NUUklQID0gLXMKKworQVIgPSBhcgorQVJGTEFHUyA9IGNydXMKK0RMTFRPT0wgPSBkbGx0b29sCisKK1RPUCA9IC4uLy4uCitHTElERSA/PSAkKFRPUCkvZ2xpZGUzCitMSUJESVIgPSAkKFRPUCkvbGliCisKK0dMX0RMTCA9ICQoTElCX05BTUUpJChETExfRVhUKQorR0xfSU1QID0gJChMSUJfUFJFKSQoTElCX05BTUUpJChJTVBfRVhUKQorCitNRVNBX0xJQiA9IGxpYm1lc2EuYQorQ0MgPSAkKFRPT0xTX1BSRUZJWClnY2MKKworTERMSUJTID0gLWxnZGkzMiAtbHVzZXIzMiAtbGliZXJ0eQorTERGTEFHUyA9ICQoU1RSSVApIC1zaGFyZWQgLWZQSUMgLVdsLC0ta2lsbC1hdAorCitDRkxBR1MgKz0gLURCVUlMRF9HTDMyIC1EX0RMTCAtRE1FU0FfTUlOV0FSTgorQ0ZMQUdTICs9IC1ETkRFQlVHIC1EVVNFX0VYVEVSTkFMX0RYVE5fTElCPTEKKworaWZlcSAoJChGWCksMSkKKyAgQ0ZMQUdTICs9IC1JJChHTElERSkvaW5jbHVkZSAtREZYCisgIExETElCUyArPSAtTCQoR0xJREUpL2xpYiAtbGdsaWRlM3gKKyAgR0xfREVGID0gZHJpdmVycy93aW5kb3dzL2Z4L2Z4b3BlbmdsLmRlZgorICBHTF9SRVMgPSBkcml2ZXJzL3dpbmRvd3MvZngvZngucmMKK2Vsc2UKKyAgaWZlcSAoJChJQ0QpLDEpCisgICAgQ0ZMQUdTICs9IC1EVVNFX01HTF9OQU1FU1BBQ0UKKyAgICBHTF9ERUYgPSBkcml2ZXJzL3dpbmRvd3MvaWNkL21lc2EuZGVmCisgIGVsc2UgICAgCisgICAgR0xfREVGID0gJChMSUJfTkFNRSkuZGVmCisgIGVuZGlmCitlbmRpZgorCisKKworVU5MSU5LID0gZGVsICQoc3Vic3QgLyxcLCQoMSkpCitpZm5lcSAoJCh3aWxkY2FyZCAkKGFkZHN1ZmZpeCAvcm0uZXhlLCQoc3Vic3QgOywgLCQoUEFUSCkpKSksKQorVU5MSU5LID0gJChSTSkgJCgxKQorZW5kaWYKK2lmbmVxICgkKHdpbGRjYXJkICQoYWRkc3VmZml4IC9ybSwkKHN1YnN0IDosICwkKFBBVEgpKSkpLCkKK1VOTElOSyA9ICQoUk0pICQoMSkKK2VuZGlmCisKK2luY2x1ZGUgc291cmNlcworCitDRkxBR1MgKz0gJChJTkNMVURFX0RJUlMpIAorCitpZmVxICgkKFg4NiksMSkKK0NGTEFHUyArPSAtRFVTRV9YODZfQVNNCitDRkxBR1MgKz0gLURVU0VfTU1YX0FTTQorQ0ZMQUdTICs9IC1EVVNFX1NTRV9BU00KK0NGTEFHUyArPSAtRFVTRV8zRE5PV19BU00KK1g4Nl9TT1VSQ0VTICs9ICQoWDg2X0FQSSkKK2Vsc2UKK1g4Nl9TT1VSQ0VTID0KK2VuZGlmCisKK2lmZXEgKCQoRlgpLDEpCitEUklWRVJfU09VUkNFUyA9IFwKKwkkKEdMSURFX0RSSVZFUl9TT1VSQ0VTKSBcCisJZHJpdmVycy93aW5kb3dzL2Z4L2Z4d2dsLmMKK2Vsc2UKK2lmZXEgKCQoSUNEKSwxKQorRFJJVkVSX1NPVVJDRVMgPSBcCisJZHJpdmVycy93aW5kb3dzL2dkaS93bWVzYS5jIFwKKwlkcml2ZXJzL3dpbmRvd3MvaWNkL2ljZC5jCitlbHNlCitEUklWRVJfU09VUkNFUyA9IFwKKwlkcml2ZXJzL3dpbmRvd3MvZ2RpL3dtZXNhLmMgXAorCWRyaXZlcnMvd2luZG93cy9nZGkvd2dsLmMKK2VuZGlmCitlbmRpZgorCitTT1VSQ0VTID0gJChDT1JFX1NPVVJDRVMpICQoWDg2X1NPVVJDRVMpICQoQ09NTU9OX0RSSVZFUl9TT1VSQ0VTKSAkKERSSVZFUl9TT1VSQ0VTKQorCitPQkpFQ1RTID0gJChhZGRzdWZmaXggLm8sJChiYXNlbmFtZSAkKFNPVVJDRVMpKSkKKworWDg2X09CSkVDVFMgPSAkKGFkZHN1ZmZpeCAubywkKGJhc2VuYW1lICQoWDg2X1NPVVJDRVMpKSkKKworUkVTT1VSQ0UgPSAkKEdMX1JFUzoucmM9LnJlcykKKworLmMubzoKKwkkKENDKSAtbyAkQCAkKENGTEFHUykgLWMgJDwKKy5zLm86CisJJChDQykgLW8gJEAgJChDRkxBR1MpIC14IGFzc2VtYmxlci13aXRoLWNwcCAtYyAkPAorCisucmMucmVzOgorCXdpbmRyZXMgLW8gJEAgLUlyYyAtT2NvZmYgJDwKKworCithbGw6ICQoTElCRElSKSAkKExJQkRJUikvJChHTF9ETEwpICQoTElCRElSKS8kKEdMX0lNUCkKKworJChMSUJESVIpOgorCW1rZGlyIC1wICQoTElCRElSKQorCiskKExJQkRJUikvJChHTF9ETEwpICQoTElCRElSKS8kKEdMX0lNUCk6ICQoT0JKRUNUUykgJChSRVNPVVJDRSkKKwkkKENDKSAkKExERkxBR1MpIC1vICQoTElCRElSKS8kKEdMX0RMTCkgJF4gJChMRExJQlMpCisJJChETExUT09MKSAtLWFzPWFzIC0tZGxsbmFtZSAkKExJQl9OQU1FKSAtLW91dHB1dC1kZWYgJChMSUJESVIpLyQoR0xfREVGKSAkXgorCSQoRExMVE9PTCkgLS1hcz1hcyAtayAtLWRsbG5hbWUgJChMSUJfTkFNRSkgLS1vdXRwdXQtbGliICQoTElCRElSKS8kKEdMX0lNUCkgLS1kZWYgJChMSUJESVIpLyQoR0xfREVGKQorCisKKyQoWDg2X09CSkVDVFMpOiB4ODYvbWF0eXBlcy5oCisKK3g4Ni9tYXR5cGVzLmg6IHg4Ni9nZW5fbWF0eXBlcy5leGUKKwkkKHN1YnN0IC8sXCwkPCA+ICRAKQorCit4ODYvZ2VuX21hdHlwZXMuZXhlOiB4ODYvZ2VuX21hdHlwZXMuYworCSQoQ0MpIC1vICRAICQoQ0ZMQUdTKSAtcyAkPAorCisjIFtkQm9yY2FdCisjIGdsYXBpX3g4Ni5TIG5lZWRzIHNvbWUgYWRqdXN0bWVudHMKKyMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgY29ycmVjdCBlbnRyeXBvaW50cworIyBUcmljazogY2hhbmdlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIHRvCisjIGJlIGFsd2F5cyBmYWxzZSBpZiB5b3UgbmVlZCBDIGVudHJ5cG9pbnRzCisjIHdpdGggVVNFX1g4Nl9BU00gKHVzZWZ1bCBmb3IgdHJhY2UvZGVidWcpCitpZmVxICgxLDEpCit4ODYvZ2xhcGlfeDg2Lm86IHg4Ni9nbGFwaV94ODYuUworCSQoQ0MpIC1vICRAICQoQ0ZMQUdTKSAtRFNURENBTExfQVBJIC1jICQ8CitlbHNlCittYWluL2Rpc3BhdGNoLm86IG1haW4vZGlzcGF0Y2guYworCSQoQ0MpIC1vICRAICQoQ0ZMQUdTKSAtVVVTRV9YODZfQVNNIC1jICQ8CitnbGFwaS9nbGFwaS5vOiBnbGFwaS9nbGFwaS5jCisJJChDQykgLW8gJEAgJChDRkxBR1MpIC1VVVNFX1g4Nl9BU00gLWMgJDwKK2VuZGlmCisKKyMgW2RCb3JjYV0KKyMgaWYgd2Ugd2FudCBjb2RlZ2VuLCB3ZSBoYXZlIHRvIHN0ZGNhbGwKK3RubC90X3Z0eF94ODZfZ2NjLm86IHRubC90X3Z0eF94ODZfZ2NjLlMKKwkkKENDKSAtbyAkQCAkKENGTEFHUykgLURTVERDQUxMX0FQSSAtYyAkPAorCitjbGVhbjoKKwktJChjYWxsIFVOTElOSyxnbGFwaS8qLm8pCisJLSQoY2FsbCBVTkxJTkssbWFpbi8qLm8pCisJLSQoY2FsbCBVTkxJTkssbWF0aC8qLm8pCisJLSQoY2FsbCBVTkxJTkssdmJvLyoubykKKwktJChjYWxsIFVOTElOSyxzaGFkZXIvKi5vKQorCS0kKGNhbGwgVU5MSU5LLHNoYWRlci9zbGFuZy8qLm8pCisJLSQoY2FsbCBVTkxJTkssc2hhZGVyL2dyYW1tYXIvKi5vKQorCS0kKGNhbGwgVU5MSU5LLHNwYXJjLyoubykKKwktJChjYWxsIFVOTElOSyxwcGMvKi5vKQorCS0kKGNhbGwgVU5MSU5LLHN3cmFzdC8qLm8pCisJLSQoY2FsbCBVTkxJTkssc3dyYXN0X3NldHVwLyoubykKKwktJChjYWxsIFVOTElOSyx0bmwvKi5vKQorCS0kKGNhbGwgVU5MSU5LLHg4Ni8qLm8pCisJLSQoY2FsbCBVTkxJTksseDg2L3J0YXNtLyoubykKKwktJChjYWxsIFVOTElOSyx4ODYtNjQvKi5vKQorCS0kKGNhbGwgVU5MSU5LLGRyaXZlcnMvY29tbW9uLyoubykKKwktJChjYWxsIFVOTElOSyxkcml2ZXJzL2dsaWRlLyoubykKKwktJChjYWxsIFVOTElOSyxkcml2ZXJzL3dpbmRvd3MvZngvKi5vKQorCS0kKGNhbGwgVU5MSU5LLGRyaXZlcnMvd2luZG93cy9meC8qLnJlcykKKwktJChjYWxsIFVOTElOSyxkcml2ZXJzL3dpbmRvd3MvZ2RpLyoubykKKwktJChjYWxsIFVOTElOSyxkcml2ZXJzL3dpbmRvd3MvaWNkLyoubykKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2Rlc2NyaXAubW1zIGIvc3JjL21lc2EvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmYTMzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsMjcgQEAKKyMgTWFrZWZpbGUgZm9yIE1lc2EgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgRGF0ZSBsYXN0IHJldmlzaW9uIDogNyBNYXJjaCAyMDA3CisKK2FsbCA6CisJc2V0IGRlZmF1bHQgWy5tYWluXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmYXVsdCBbLS5nbGFwaV0KKwkkKE1NUykkKE1NU1FVQUxJRklFUlMpCisJc2V0IGRlZmF1bHQgWy0uc2hhZGVyXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmYXVsdCBbLS5kcml2ZXJzLmNvbW1vbl0KKwkkKE1NUykkKE1NU1FVQUxJRklFUlMpCisJc2V0IGRlZmF1bHQgWy0ueDExXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmYXVsdCBbLS5vc21lc2FdCisJJChNTVMpJChNTVNRVUFMSUZJRVJTKQorCXNldCBkZWZhdWx0IFstLS5tYXRoXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmYXVsdCBbLS50bmxdCisJJChNTVMpJChNTVNRVUFMSUZJRVJTKQorCXNldCBkZWZhdWx0IFstLnN3cmFzdF0KKwkkKE1NUykkKE1NU1FVQUxJRklFUlMpCisJc2V0IGRlZmF1bHQgWy0uc3dyYXN0X3NldHVwXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmYXVsdCBbLS52Ym9dCisJJChNTVMpJChNTVNRVUFMSUZJRVJTKQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9iZW9zL01ha2VmaWxlIGIvc3JjL21lc2EvZHJpdmVycy9iZW9zL01ha2VmaWxlCmluZGV4IDM0MmQ3Y2UuLmM3OWRkMjQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvYmVvcy9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2Jlb3MvTWFrZWZpbGUKQEAgLTE4MSw5ICsxODEsMTAgQEAKIAlta2RpciAkKFRPUCkvJChMSUJfRElSKQogCiAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKTogJChPQkpFQ1RTKSAkKE1FU0FfTU9EVUxFUykgJChHTFVfTU9EVUxFUykKLQlAJChUT1ApL2Jpbi9ta2xpYiAtbyAkKEdMX0xJQikgLWxkZmxhZ3MgJyQoTERGTEFHUyknIC1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKKwlAJChNS0xJQikgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChNRVNBX01BSk9SKSAtbWlub3IgJChNRVNBX01JTk9SKSAtcGF0Y2ggJChNRVNBX1RJTlkpIFwKLQkJJChNS0xJQl9PUFRJT05TKSAkKEdMX0xJQl9ERVBTKSAkKE9CSkVDVFMpICQoTUVTQV9NT0RVTEVTKSAkKEdMVV9NT0RVTEVTKQorCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAkKE1LTElCX09QVElPTlMpICQoR0xfTElCX0RFUFMpIFwKKwkJJChPQkpFQ1RTKSAkKE1FU0FfTU9EVUxFUykgJChHTFVfTU9EVUxFUykKIAogIyAkKEdMVV9PQkpFQ1RTKToKICMJY2QgJChHTFVfRElSKSAmJiAkKE1BS0UpICQ8IDsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL2Rlc2NyaXAubW1zIGIvc3JjL21lc2EvZHJpdmVycy9jb21tb24vZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhMmFlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsNDEgQEAKKyMgTWFrZWZpbGUgZm9yIGNvcmUgbGlicmFyeSBmb3IgVk1TCisjIGNvbnRyaWJ1dGVkIGJ5IEpvdWsgSmFuc2VuICBqb3VrakBocmVtLm5hbm8udHVkZWxmdC5ubAorIyBMYXN0IHJldmlzaW9uIDogMyBPY3RvYmVyIDIwMDcKKworLmZpcnN0CisJZGVmaW5lIGdsIFstLS0tLmluY2x1ZGUuZ2xdCisJZGVmaW5lIG1hdGggWy0tLm1hdGhdCisJZGVmaW5lIHRubCBbLS0udG5sXQorCWRlZmluZSBzd3Jhc3QgWy0tLnN3cmFzdF0KKwlkZWZpbmUgZ2xhcGkgWy0tLmdsYXBpXQorCWRlZmluZSBzaGFkZXIgWy0tLnNoYWRlcl0KKwlkZWZpbmUgbWFpbiBbLS0ubWFpbl0KKworLmluY2x1ZGUgWy0tLS1dbW1zLWNvbmZpZy4KKworIyMjIyMgTUFDUk9TICMjIyMjCisKK1ZQQVRIID0gUkNTCisKK0lOQ0RJUiA9IFstLS0tLmluY2x1ZGVdLFstLS5tYWluXSxbLS0uZ2xhcGldLFstLS5zaGFkZXJdCitMSUJESVIgPSBbLS0tLS5saWJdCitDRkxBR1MgPSAvaW5jbHVkZT0oJChJTkNESVIpLFtdKS9kZWZpbmU9KFBUSFJFQURTPTEpL25hbWU9KGFzX2lzLHNob3J0KS9mbG9hdD1pZWVlL2llZWU9ZGVub3JtCisKK1NPVVJDRVMgPSBkcml2ZXJmdW5jcy5jCisKK09CSkVDVFMgPWRyaXZlcmZ1bmNzLm9iagorCisjIyMjIyBSVUxFUyAjIyMjIworCitWRVJTSU9OPU1lc2EgVjMuNAorCisjIyMjIyBUQVJHRVRTICMjIyMjCisjIE1ha2UgdGhlIGxpYnJhcnkKKyQoTElCRElSKSQoR0xfTElCKSA6ICQoT0JKRUNUUykKKyAgQCBsaWJyYXJ5ICQoTElCRElSKSQoR0xfTElCKSAkKE9CSkVDVFMpCisKK2NsZWFuIDoKKwlwdXJnZQorCWRlbGV0ZSAqLm9iajsqCisKK2RyaXZlcmZ1bmNzLm9iaiA6IGRyaXZlcmZ1bmNzLmMKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL2RyaXZlcmZ1bmNzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5jCmluZGV4IGI1YjM4M2IuLjdkNmU2ZWYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL2RyaXZlcmZ1bmNzLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9jb21tb24vZHJpdmVyZnVuY3MuYwpAQCAtMjUsMTIgKzI1LDExIEBACiAKICNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgImltcG9ydHMuaCIKKyNpbmNsdWRlICJhcnJheW9iai5oIgogI2luY2x1ZGUgImJ1ZmZlcnMuaCIKICNpbmNsdWRlICJjb250ZXh0LmgiCiAjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKICNpbmNsdWRlICJtaXBtYXAuaCIKLSNpbmNsdWRlICJwcm9ncmFtLmgiCi0jaW5jbHVkZSAicHJvZ19leGVjdXRlLmgiCiAjaW5jbHVkZSAicXVlcnlvYmouaCIKICNpbmNsdWRlICJyZW5kZXJidWZmZXIuaCIKICNpbmNsdWRlICJ0ZXhjb21wcmVzcy5oIgpAQCAtNDUsOSArNDQsMTAgQEAKICNpbmNsdWRlICJmYm9iamVjdC5oIgogI2luY2x1ZGUgInRleHJlbmRlci5oIgogI2VuZGlmCi0jaW5jbHVkZSAic2hhZGVyX2FwaS5oIgotI2luY2x1ZGUgImFycmF5b2JqLmgiCiAKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ3JhbS5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9nX2V4ZWN1dGUuaCIKKyNpbmNsdWRlICJzaGFkZXIvc2hhZGVyX2FwaS5oIgogI2luY2x1ZGUgImRyaXZlcmZ1bmNzLmgiCiAjaW5jbHVkZSAidG5sL3RubC5oIgogI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKQEAgLTExNSw2ICsxMTUsOCBAQAogICAgZHJpdmVyLT5EZWxldGVUZXh0dXJlID0gX21lc2FfZGVsZXRlX3RleHR1cmVfb2JqZWN0OwogICAgZHJpdmVyLT5OZXdUZXh0dXJlSW1hZ2UgPSBfbWVzYV9uZXdfdGV4dHVyZV9pbWFnZTsKICAgIGRyaXZlci0+RnJlZVRleEltYWdlRGF0YSA9IF9tZXNhX2ZyZWVfdGV4dHVyZV9pbWFnZV9kYXRhOyAKKyAgIGRyaXZlci0+TWFwVGV4dHVyZSA9IE5VTEw7CisgICBkcml2ZXItPlVubWFwVGV4dHVyZSA9IE5VTEw7CiAgICBkcml2ZXItPlRleHR1cmVNZW1DcHkgPSBfbWVzYV9tZW1jcHk7IAogICAgZHJpdmVyLT5Jc1RleHR1cmVSZXNpZGVudCA9IE5VTEw7CiAgICBkcml2ZXItPlByaW9yaXRpemVUZXh0dXJlID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL3NvdXJjZXMgYi9zcmMvbWVzYS9kcml2ZXJzL2NvbW1vbi9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGUyOWQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvY29tbW9uL3NvdXJjZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1FU0FfRFJJVkVSX0NPTU1PTl9TT1VSQ0VTID0gXAotZHJpdmVyZnVuY3MuYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9NYWtlZmlsZSBiL3NyYy9tZXNhL2RyaXZlcnMvZGlyZWN0ZmIvTWFrZWZpbGUKaW5kZXggZWNlMDQ1Ny4uOTRjODJhMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RpcmVjdGZiL01ha2VmaWxlCkBAIC0zNyw3ICszNyw3IEBACiAKICMgWFhYIHRoaXMgdXNlZCB0byBiZSBpbiBzcmMvbWVzYS9NYWtlZmlsZSBhbmQgaXMgcHJvYmFibHkgYnJva2VuIG5vdwogZGlyZWN0ZmItbGliZ2w6ICQoTElCUykKLQlAICQoVE9QKS9iaW4vbWtsaWIgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAorCUAgJChNS0xJQikgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChNRVNBX01BSk9SKSAtbWlub3IgJChNRVNBX01JTk9SKSAtcGF0Y2ggJChNRVNBX1RJTlkpIFwKIAkJLWluc3RhbGwgJChUT1ApLyQoTElCX0RJUikgJChNS0xJQl9PUFRJT05TKSAkKExJQlMpIFwKIAkJJChHTF9MSUJfREVQUykKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZGlyZWN0ZmIvaWRpcmVjdGZiZ2xfbWVzYS5jIGIvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9pZGlyZWN0ZmJnbF9tZXNhLmMKaW5kZXggNjk0ZWViMC4uYTM2NGFkYSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9pZGlyZWN0ZmJnbF9tZXNhLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kaXJlY3RmYi9pZGlyZWN0ZmJnbF9tZXNhLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnbG9iYWxfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiBzdGF0aWMgdW5zaWduZWQgaW50ICAgIGdsb2JhbF9yZWYgID0gMDsKIAotc3RhdGljIGlubGluZSBpbnQgZGlyZWN0ZmJnbF9pbml0KCB2b2lkICkKK3N0YXRpYyBJTkxJTkUgaW50IGRpcmVjdGZiZ2xfaW5pdCggdm9pZCApCiB7CiAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKICAgICAgaW50ICAgICAgICAgICAgICAgICByZXQ7CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpcmVjdGZiZ2xfZmluaXNoKCB2b2lkICkKK3N0YXRpYyBJTkxJTkUgdm9pZCBkaXJlY3RmYmdsX2ZpbmlzaCggdm9pZCApCiB7CiAgICAgIGlmICgtLWdsb2JhbF9yZWYgPT0gMCkKICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZnbG9iYWxfbG9jayApOwpAQCAtNTAzLDEwICs1MDMsMzEgQEAKICAgICAgICAgICAoKChTW0dDT01QXSkgJiAweGYwKSAgICAgKSB8IFwKICAgICAgICAgICAoKChTW0JDT01QXSkgJiAweGYwKSA+PiA0KSApCiAjZGVmaW5lIEZFVENIX1BJWEVMKEQsIFApIFwKLSAgIERbUkNPTVBdID0gKCgqUCAmIDB4MGYwMCkgPj4gNCk7IFwKLSAgIERbR0NPTVBdID0gKCgqUCAmIDB4MDBmMCkgICAgICk7IFwKLSAgIERbQkNPTVBdID0gKCgqUCAmIDB4MDAwZikgPDwgNCk7IFwKLSAgIERbQUNPTVBdID0gKCgqUCAmIDB4ZjAwMCkgPj4gOCkKKyAgIERbUkNPTVBdID0gKCgqUCAmIDB4MGYwMCkgPj4gNCkgfCAoKCpQICYgMHgwZjAwKSA+PiAgOCk7IFwKKyAgIERbR0NPTVBdID0gKCgqUCAmIDB4MDBmMCkgICAgICkgfCAoKCpQICYgMHgwMGYwKSA+PiAgNCk7IFwKKyAgIERbQkNPTVBdID0gKCgqUCAmIDB4MDAwZikgPDwgNCkgfCAoKCpQICYgMHgwMDBmKSAgICAgICk7IFwKKyAgIERbQUNPTVBdID0gKCgqUCAmIDB4ZjAwMCkgPj4gOCkgfCAoKCpQICYgMHhmMDAwKSA+PiAxMikKKworI2luY2x1ZGUgInN3cmFzdC9zX3NwYW50ZW1wLmgiCisKKy8qIFJHQjQ0NCAqLworI2RlZmluZSBOQU1FKFBSRUZJWCkgUFJFRklYIyNfUkdCNDQ0CisjZGVmaW5lIEZPUk1BVCBHTF9SR0JBOAorI2RlZmluZSBSQl9UWVBFIEdMdWJ5dGUKKyNkZWZpbmUgU1BBTl9WQVJTIFwKKyAgIElEaXJlY3RGQkdMX2RhdGEgKmRhdGEgPSAoSURpcmVjdEZCR0xfZGF0YSopIGN0eC0+RHJpdmVyQ3R4OworI2RlZmluZSBJTklUX1BJWEVMX1BUUihQLCBYLCBZKSBcCisgICBHTHVzaG9ydCAqUCA9IChHTHVzaG9ydCAqKSAoZGF0YS0+dmlkZW8uZW5kIC0gKFkpICogZGF0YS0+dmlkZW8ucGl0Y2ggKyAoWCkgKiAyKTsKKyNkZWZpbmUgSU5DX1BJWEVMX1BUUihQKSBQICs9IDEKKyNkZWZpbmUgU1RPUkVfUElYRUwoUCwgWCwgWSwgUykgXAorICAgKlAgPSAoICgoKFNbUkNPTVBdKSAmIDB4ZjApIDw8IDQpIHwgXAorICAgICAgICAgICgoKFNbR0NPTVBdKSAmIDB4ZjApICAgICApIHwgXAorICAgICAgICAgICgoKFNbQkNPTVBdKSAmIDB4ZjApID4+IDQpICkKKyNkZWZpbmUgRkVUQ0hfUElYRUwoRCwgUCkgXAorICAgRFtSQ09NUF0gPSAoKCpQICYgMHgwZjAwKSA+PiA0KSB8ICgoKlAgJiAweDBmMDApID4+IDgpOyBcCisgICBEW0dDT01QXSA9ICgoKlAgJiAweDAwZjApICAgICApIHwgKCgqUCAmIDB4MDBmMCkgPj4gNCk7IFwKKyAgIERbQkNPTVBdID0gKCgqUCAmIDB4MDAwZikgPDwgNCkgfCAoKCpQICYgMHgwMDBmKSAgICAgKTsgXAorICAgRFtBQ09NUF0gPSAweGZmCiAKICNpbmNsdWRlICJzd3Jhc3Qvc19zcGFudGVtcC5oIgogCkBAIC01NTcsMTMgKzU3OCwzNCBAQAogICAgICAgICAgICgoKFNbR0NPTVBdKSAmIDB4ZjgpIDw8ICAyKSB8IFwKICAgICAgICAgICAoKChTW0JDT01QXSkgICAgICAgKSA+PiAgMykgKQogI2RlZmluZSBGRVRDSF9QSVhFTChELCBQKSBcCi0gICBEW1JDT01QXSA9ICgoKlAgJiAweDdjMDApID4+IDcpOyBcCi0gICBEW0dDT01QXSA9ICgoKlAgJiAweDAzZTApID4+IDIpOyBcCi0gICBEW0JDT01QXSA9ICgoKlAgJiAweDAwMWYpIDw8IDMpOyBcCisgICBEW1JDT01QXSA9ICgoKlAgJiAweDdjMDApID4+IDcpIHwgKCgqUCAmIDB4N2MwMCkgPj4gMTIpOyBcCisgICBEW0dDT01QXSA9ICgoKlAgJiAweDAzZTApID4+IDIpIHwgKCgqUCAmIDB4MDNlMCkgPj4gIDcpOyBcCisgICBEW0JDT01QXSA9ICgoKlAgJiAweDAwMWYpIDw8IDMpIHwgKCgqUCAmIDB4MDAxZikgPDwgIDIpOyBcCiAgICBEW0FDT01QXSA9ICgoKlAgJiAweDgwMDApID8gMHhmZiA6IDApCiAKICNpbmNsdWRlICJzd3Jhc3Qvc19zcGFudGVtcC5oIgogCisvKiBSR0I1NTUgKi8KKyNkZWZpbmUgTkFNRShQUkVGSVgpIFBSRUZJWCMjX1JHQjU1NQorI2RlZmluZSBGT1JNQVQgR0xfUkdCQTgKKyNkZWZpbmUgUkJfVFlQRSBHTHVieXRlCisjZGVmaW5lIFNQQU5fVkFSUyBcCisgICBJRGlyZWN0RkJHTF9kYXRhICpkYXRhID0gKElEaXJlY3RGQkdMX2RhdGEqKSBjdHgtPkRyaXZlckN0eDsKKyNkZWZpbmUgSU5JVF9QSVhFTF9QVFIoUCwgWCwgWSkgXAorICAgR0x1c2hvcnQgKlAgPSAoR0x1c2hvcnQgKikgKGRhdGEtPnZpZGVvLmVuZCAtIChZKSAqIGRhdGEtPnZpZGVvLnBpdGNoICsgKFgpICogMik7CisjZGVmaW5lIElOQ19QSVhFTF9QVFIoUCkgUCArPSAxCisjZGVmaW5lIFNUT1JFX1BJWEVMKFAsIFgsIFksIFMpIFwKKyAgICpQID0gKCAoKChTW1JDT01QXSkgJiAweGY4KSA8PCAgNykgfCBcCisgICAgICAgICAgKCgoU1tHQ09NUF0pICYgMHhmOCkgPDwgIDIpIHwgXAorICAgICAgICAgICgoKFNbQkNPTVBdKSAgICAgICApID4+ICAzKSApCisjZGVmaW5lIEZFVENIX1BJWEVMKEQsIFApIFwKKyAgIERbUkNPTVBdID0gKCgqUCAmIDB4N2MwMCkgPj4gNykgfCAoKCpQICYgMHg3YzAwKSA+PiAxMik7IFwKKyAgIERbR0NPTVBdID0gKCgqUCAmIDB4MDNlMCkgPj4gMikgfCAoKCpQICYgMHgwM2UwKSA+PiAgNyk7IFwKKyAgIERbQkNPTVBdID0gKCgqUCAmIDB4MDAxZikgPDwgMykgfCAoKCpQICYgMHgwMDFmKSA8PCAgMik7IFwKKyAgIERbQUNPTVBdID0gMHhmZgorCisjaW5jbHVkZSAic3dyYXN0L3Nfc3BhbnRlbXAuaCIKKwogLyogUkdCMTYgKi8KICNkZWZpbmUgTkFNRShQUkVGSVgpIFBSRUZJWCMjX1JHQjE2CiAjZGVmaW5lIEZPUk1BVCBHTF9SR0JBOApAQCAtNTc4LDkgKzYyMCw5IEBACiAgICAgICAgICAgKCgoU1tHQ09NUF0pICYgMHhmYykgPDwgMykgfCBcCiAgICAgICAgICAgKCgoU1tCQ09NUF0pICAgICAgICkgPj4gMykgKQogI2RlZmluZSBGRVRDSF9QSVhFTChELCBQKSBcCi0gICBEW1JDT01QXSA9ICgoKlAgJiAweGY4MDApID4+IDgpOyBcCi0gICBEW0dDT01QXSA9ICgoKlAgJiAweDA3ZTApID4+IDMpOyBcCi0gICBEW0JDT01QXSA9ICgoKlAgJiAweDAwMWYpIDw8IDMpOyBcCisgICBEW1JDT01QXSA9ICgoKlAgJiAweGY4MDApID4+IDgpIHwgKCgqUCAmIDB4ZjgwMCkgPj4gMTMpOyBcCisgICBEW0dDT01QXSA9ICgoKlAgJiAweDA3ZTApID4+IDMpIHwgKCgqUCAmIDB4MDdlMCkgPj4gIDkpOyBcCisgICBEW0JDT01QXSA9ICgoKlAgJiAweDAwMWYpIDw8IDMpIHwgKCgqUCAmIDB4MDAxZikgPj4gIDIpOyBcCiAgICBEW0FDT01QXSA9IDB4ZmYKIAogI2luY2x1ZGUgInN3cmFzdC9zX3NwYW50ZW1wLmgiCkBAIC03MDYsMjIgKzc0OCwyNCBAQAogICAgICAgICAgICAgICAgYmx1ZUJpdHMgID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgRFNQRl9BUkdCNDQ0NDoKKyAgICAgICAgICAgICAgIGFscGhhQml0cyA9IDQ7CisgICAgICAgICAgY2FzZSBEU1BGX1JHQjQ0NDoKICAgICAgICAgICAgICAgIHJlZEJpdHMgICA9IDQ7CiAgICAgICAgICAgICAgICBncmVlbkJpdHMgPSA0OwogICAgICAgICAgICAgICAgYmx1ZUJpdHMgID0gNDsKLSAgICAgICAgICAgICAgIGFscGhhQml0cyA9IDQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIERTUEZfQVJHQjI1NTQ6CisgICAgICAgICAgICAgICBhbHBoYUJpdHMgPSAyOwogICAgICAgICAgICAgICAgcmVkQml0cyAgID0gNTsKICAgICAgICAgICAgICAgIGdyZWVuQml0cyA9IDU7CiAgICAgICAgICAgICAgICBibHVlQml0cyAgPSA0OwotICAgICAgICAgICAgICAgYWxwaGFCaXRzID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgRFNQRl9BUkdCMTU1NToKKyAgICAgICAgICAgICAgIGFscGhhQml0cyA9IDE7CisgICAgICAgICAgY2FzZSBEU1BGX1JHQjU1NToKICAgICAgICAgICAgICAgIHJlZEJpdHMgICA9IDU7CiAgICAgICAgICAgICAgICBncmVlbkJpdHMgPSA1OwogICAgICAgICAgICAgICAgYmx1ZUJpdHMgID0gNTsKLSAgICAgICAgICAgICAgIGFscGhhQml0cyA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIERTUEZfUkdCMTY6CiAgICAgICAgICAgICAgICByZWRCaXRzICAgPSA1OwpAQCAtODE4LDYgKzg2MiwxNSBAQAogICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLlB1dFZhbHVlcyAgICAgPSBwdXRfdmFsdWVzX0FSR0I0NDQ0OwogICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLlB1dE1vbm9WYWx1ZXMgPSBwdXRfbW9ub192YWx1ZXNfQVJHQjQ0NDQ7CiAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERTUEZfUkdCNDQ0OiAKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5HZXRSb3cgICAgICAgID0gZ2V0X3Jvd19SR0I0NDQ7CisgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0VmFsdWVzICAgICA9IGdldF92YWx1ZXNfUkdCNDQ0OworICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLlB1dFJvdyAgICAgICAgPSBwdXRfcm93X1JHQjQ0NDsKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5QdXRSb3dSR0IgICAgID0gcHV0X3Jvd19yZ2JfUkdCNDQ0OworICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLlB1dE1vbm9Sb3cgICAgPSBwdXRfbW9ub19yb3dfUkdCNDQ0OworICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLlB1dFZhbHVlcyAgICAgPSBwdXRfdmFsdWVzX1JHQjQ0NDsKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5QdXRNb25vVmFsdWVzID0gcHV0X21vbm9fdmFsdWVzX1JHQjQ0NDsKKyAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgRFNQRl9BUkdCMjU1NDogCiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0Um93ICAgICAgICA9IGdldF9yb3dfQVJHQjI1NTQ7CiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0VmFsdWVzICAgICA9IGdldF92YWx1ZXNfQVJHQjI1NTQ7CkBAIC04MzYsNiArODg5LDE1IEBACiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuUHV0VmFsdWVzICAgICA9IHB1dF92YWx1ZXNfQVJHQjE1NTU7CiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuUHV0TW9ub1ZhbHVlcyA9IHB1dF9tb25vX3ZhbHVlc19BUkdCMTU1NTsKICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRFNQRl9SR0I1NTU6CisgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0Um93ICAgICAgICA9IGdldF9yb3dfUkdCNTU1OworICAgICAgICAgICAgICAgZGF0YS0+cmVuZGVyLkdldFZhbHVlcyAgICAgPSBnZXRfdmFsdWVzX1JHQjU1NTsKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5QdXRSb3cgICAgICAgID0gcHV0X3Jvd19SR0I1NTU7CisgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuUHV0Um93UkdCICAgICA9IHB1dF9yb3dfcmdiX1JHQjU1NTsKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5QdXRNb25vUm93ICAgID0gcHV0X21vbm9fcm93X1JHQjU1NTsKKyAgICAgICAgICAgICAgIGRhdGEtPnJlbmRlci5QdXRWYWx1ZXMgICAgID0gcHV0X3ZhbHVlc19SR0I1NTU7CisgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuUHV0TW9ub1ZhbHVlcyA9IHB1dF9tb25vX3ZhbHVlc19SR0I1NTU7CisgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIERTUEZfUkdCMTY6CiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0Um93ICAgICAgICA9IGdldF9yb3dfUkdCMTY7CiAgICAgICAgICAgICAgICBkYXRhLT5yZW5kZXIuR2V0VmFsdWVzICAgICA9IGdldF92YWx1ZXNfUkdCMTY7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9NYWtlZmlsZSBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlCmluZGV4IGY0NjZjZTYuLjNiM2ZjZjEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlCkBAIC0yMCwxOSArMjAsMzcgQEAKIAkJZmkgXAogCWRvbmUKIAorcGNlZGl0ID0gc2VkIFwKKwktZSAncyxASU5TVEFMTF9ESVJALCQoSU5TVEFMTF9ESVIpLCcgXAorCS1lICdzLEBJTlNUQUxMX0xJQl9ESVJALCQoSU5TVEFMTF9MSUJfRElSKSwnIFwKKwktZSAncyxASU5TVEFMTF9JTkNfRElSQCwkKElOU1RBTExfSU5DX0RJUiksJyBcCisJLWUgJ3MsQFZFUlNJT05ALCQoTUVTQV9NQUpPUikuJChNRVNBX01JTk9SKS4kKE1FU0FfVElOWSksJyBcCisJLWUgJ3MsQERSSV9EUklWRVJfRElSQCwkKERSSV9EUklWRVJfU0VBUkNIX0RJUiksJwogCi1pbnN0YWxsOgorZHJpLnBjOiBkcmkucGMuaW4KKwkkKHBjZWRpdCkgJDwgPiAkQAorCisKK2luc3RhbGw6IGRyaS5wYwogCUBmb3IgZGlyIGluICQoRFJJX0RJUlMpIDsgZG8gXAogCQlpZiBbIC1kICQkZGlyIF0gOyB0aGVuIFwKIAkJCShjZCAkJGRpciAmJiAkKE1BS0UpIGluc3RhbGwpIHx8IGV4aXQgMSA7IFwKIAkJZmkgXAogCWRvbmUKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wvaW50ZXJuYWwKKwkkKElOU1RBTEwpIC1tIDA2NDQgJChUT1ApL2luY2x1ZGUvR0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oIFwKKwkgICQoREVTVERJUikkKElOU1RBTExfSU5DX0RJUikvR0wvaW50ZXJuYWwKKwkkKElOU1RBTEwpIC1tIDA2NDQgJChUT1ApL2luY2x1ZGUvR0wvaW50ZXJuYWwvZHJpX3NhcmVhLmggXAorCSAgJChERVNURElSKSQoSU5TVEFMTF9JTkNfRElSKS9HTC9pbnRlcm5hbAorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoSU5TVEFMTF9MSUJfRElSKS9wa2djb25maWcKKwkkKElOU1RBTEwpIC1tIDA2NDQgZHJpLnBjICQoREVTVERJUikkKElOU1RBTExfTElCX0RJUikvcGtnY29uZmlnCiAKIAogY2xlYW46Ci0JQGZvciBkaXIgaW4gJChEUklfRElSUykgOyBkbyBcCisJLUBmb3IgZGlyIGluICQoRFJJX0RJUlMpIDsgZG8gXAogCQlpZiBbIC1kICQkZGlyIF0gOyB0aGVuIFwKIAkJCShjZCAkJGRpciAmJiAkKE1BS0UpIGNsZWFuKSA7IFwKIAkJZmkgXAogCWRvbmUKIAktcm0gLWYgY29tbW9uLyoubworCS1ybSAtZiAqLnBjCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9NYWtlZmlsZS50ZW1wbGF0ZSBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlLnRlbXBsYXRlCmluZGV4IDNlN2U1MjcuLjE2NjYyMWMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlLnRlbXBsYXRlCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlLnRlbXBsYXRlCkBAIC0xMywxMSArMTMsNiBAQAogICAgICAgICAuLi9jb21tb24vdGV4bWVtLmMgXAogICAgICAgICAuLi9jb21tb24vZHJpcmVuZGVyYnVmZmVyLmMKIAotQ09NTU9OX0JNX1NPVVJDRVMgPSBcCi0JLi4vY29tbW9uL2RyaV9idWZtZ3IuYyBcCi0JLi4vY29tbW9uL2RyaV9kcm1wb29sLmMKLQotCiBpZmVxICgkKFdJTkRPV19TWVNURU0pLGRyaSkKIFdJTk9CSj0KIFdJTkxJQj0KQEAgLTUxLDExICs0Niw2IEBACiAJLUkkKFRPUCkvc3JjL21lc2EgXAogCS1JJChUT1ApL3NyYy9tZXNhL21haW4gXAogCS1JJChUT1ApL3NyYy9tZXNhL2dsYXBpIFwKLQktSSQoVE9QKS9zcmMvbWVzYS9tYXRoIFwKLQktSSQoVE9QKS9zcmMvbWVzYS90cmFuc2Zvcm0gXAotCS1JJChUT1ApL3NyYy9tZXNhL3NoYWRlciBcCi0JLUkkKFRPUCkvc3JjL21lc2Evc3dyYXN0IFwKLQktSSQoVE9QKS9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAgXAogCS1JJChUT1ApL3NyYy9lZ2wvbWFpbiBcCiAJLUkkKFRPUCkvc3JjL2VnbC9kcml2ZXJzL2RyaSBcCiAJJChMSUJEUk1fQ0ZMQUdTKQpAQCAtNzIsMTIgKzYyLDEyIEBACiAKICMjIyMjIFRBUkdFVFMgIyMjIyMKIAotZGVmYXVsdDogZGVwZW5kIHN5bWxpbmtzICQoTElCTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChMSUJOQU1FKQorZGVmYXVsdDogc3ltbGlua3MgZGVwZW5kICQoTElCTkFNRSkgJChUT1ApLyQoTElCX0RJUikvJChMSUJOQU1FKQogCiAKICQoTElCTkFNRSk6ICQoT0JKRUNUUykgJChNRVNBX01PRFVMRVMpICQoUElQRV9EUklWRVJTKSAkKFdJTk9CSikgTWFrZWZpbGUgJChUT1ApL3NyYy9tZXNhL2RyaXZlcnMvZHJpL01ha2VmaWxlLnRlbXBsYXRlCi0JJChUT1ApL2Jpbi9ta2xpYiAtbm9wcmVmaXggLW8gJEAgXAotCQkkKE9CSkVDVFMpICQoUElQRV9EUklWRVJTKSAkKE1FU0FfTU9EVUxFUykgICQoV0lOT0JKKSAkKERSSV9MSUJfREVQUykKKwkkKE1LTElCKSAtbyAkQCAtbm9wcmVmaXggLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCisJCSQoT0JKRUNUUykgJChQSVBFX0RSSVZFUlMpICQoTUVTQV9NT0RVTEVTKSAkKFdJTk9CSikgJChEUklfTElCX0RFUFMpCiAKIAogJChUT1ApLyQoTElCX0RJUikvJChMSUJOQU1FKTogJChMSUJOQU1FKQpAQCAtODgsNyArNzgsNyBAQAogCXJtIC1mIGRlcGVuZAogCXRvdWNoIGRlcGVuZAogCSQoTUtERVApICQoTUtERVBfT1BUSU9OUykgJChEUklWRVJfREVGSU5FUykgJChJTkNMVURFUykgJChDX1NPVVJDRVMpIFwKLQkJJChBU01fU09VUkNFUykgMj4gL2Rldi9udWxsCisJCSQoQVNNX1NPVVJDRVMpCiAKIAogIyBFbWFjcyB0YWdzCkBAIC0xMDMsOCArOTMsOCBAQAogCiAKIGluc3RhbGw6ICQoTElCTkFNRSkKLQkkKElOU1RBTEwpIC1kICQoRFJJX0RSSVZFUl9JTlNUQUxMX0RJUikKLQkkKElOU1RBTEwpIC1tIDc1NSAkKExJQk5BTUUpICQoRFJJX0RSSVZFUl9JTlNUQUxMX0RJUikKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKERSSV9EUklWRVJfSU5TVEFMTF9ESVIpCisJJChJTlNUQUxMKSAtbSA3NTUgJChMSUJOQU1FKSAkKERFU1RESVIpJChEUklfRFJJVkVSX0lOU1RBTExfRElSKQogCiAKLWluY2x1ZGUgZGVwZW5kCistaW5jbHVkZSBkZXBlbmQKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kZXB0aHRtcC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RlcHRodG1wLmgKaW5kZXggNTUxOTlhYi4uZmQyZGFiMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RlcHRodG1wLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RlcHRodG1wLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHsKICAgIEhXX1dSSVRFX0xPQ0soKQogICAgICAgewotICAgICAgICAgY29uc3QgR0x1aW50ICpkZXB0aCA9IChjb25zdCBHTHVpbnQgKikgdmFsdWVzOworICAgICAgICAgY29uc3QgVkFMVUVfVFlQRSAqZGVwdGggPSAoY29uc3QgVkFMVUVfVFlQRSAqKSB2YWx1ZXM7CiAJIEdMaW50IHgxOwogCSBHTGludCBuMTsKIAkgTE9DQUxfREVQVEhfVkFSUzsKQEAgLTEzNCw3ICsxMzQsNyBAQAogewogICAgSFdfV1JJVEVfTE9DSygpCiAgICAgICB7Ci0gICAgICAgICBjb25zdCBHTHVpbnQgKmRlcHRoID0gKGNvbnN0IEdMdWludCAqKSB2YWx1ZXM7CisgICAgICAgICBjb25zdCBWQUxVRV9UWVBFICpkZXB0aCA9IChjb25zdCBWQUxVRV9UWVBFICopIHZhbHVlczsKIAkgR0x1aW50IGk7CiAJIExPQ0FMX0RFUFRIX1ZBUlM7CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogewogICAgSFdfUkVBRF9MT0NLKCkKICAgICAgIHsKLSAgICAgICAgIEdMdWludCAqZGVwdGggPSAoR0x1aW50ICopIHZhbHVlczsKKyAgICAgICAgIFZBTFVFX1RZUEUgKmRlcHRoID0gKFZBTFVFX1RZUEUgKikgdmFsdWVzOwogCSBHTGludCB4MSwgbjE7CiAJIExPQ0FMX0RFUFRIX1ZBUlM7CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogewogICAgSFdfUkVBRF9MT0NLKCkKICAgICAgIHsKLSAgICAgICAgIEdMdWludCAqZGVwdGggPSAoR0x1aW50ICopIHZhbHVlczsKKyAgICAgICAgIFZBTFVFX1RZUEUgKmRlcHRoID0gKFZBTFVFX1RZUEUgKikgdmFsdWVzOwogCSBHTHVpbnQgaTsKIAkgTE9DQUxfREVQVEhfVkFSUzsKIApAQCAtMjY3LDMgKzI2Nyw0IEBACiAjdW5kZWYgUkVBRF9ERVBUSAogI2VuZGlmCiAjdW5kZWYgVEFHCisjdW5kZWYgVkFMVUVfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RyaV9idWZwb29sLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZHJpX2J1ZnBvb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmYjJjMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZHJpX2J1ZnBvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiwgVVNBCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAotICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKLSAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+Ci0gKi8KLQotI2lmbmRlZiBfRFJJX0JVRlBPT0xfSF8KLSNkZWZpbmUgX0RSSV9CVUZQT09MX0hfCi0KLSNpbmNsdWRlIDx4Zjg2ZHJtLmg+Ci1zdHJ1Y3QgX0RyaUZlbmNlT2JqZWN0OwotCi10eXBlZGVmIHN0cnVjdCBfRHJpQnVmZmVyUG9vbAotewotICAgaW50IGZkOwotICAgaW50ICgqbWFwKSAoc3RydWN0IF9EcmlCdWZmZXJQb29sICogcG9vbCwgdm9pZCAqcHJpdmF0ZSwKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLCBpbnQgaGludCwgdm9pZCAqKnZpcnR1YWwpOwotICAgaW50ICgqdW5tYXApIChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKiBwb29sLCB2b2lkICpwcml2YXRlKTsKLSAgIGludCAoKmRlc3Ryb3kpIChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKiBwb29sLCB2b2lkICpwcml2YXRlKTsKLSAgIHVuc2lnbmVkIGxvbmcgKCpvZmZzZXQpIChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKiBwb29sLCB2b2lkICpwcml2YXRlKTsKLSAgIHVuc2lnbmVkICgqZmxhZ3MpIChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKiBwb29sLCB2b2lkICpwcml2YXRlKTsKLSAgIHVuc2lnbmVkIGxvbmcgKCpzaXplKSAoc3RydWN0IF9EcmlCdWZmZXJQb29sICogcG9vbCwgdm9pZCAqcHJpdmF0ZSk7Ci0gICB2b2lkICooKmNyZWF0ZSkgKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqIHBvb2wsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MsIHVuc2lnbmVkIGhpbnQsIHVuc2lnbmVkIGFsaWdubWVudCk7Ci0gICBpbnQgKCpmZW5jZSkgKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqIHBvb2wsIHZvaWQgKnByaXZhdGUsCi0gICAgICAgICAgICAgICAgIHN0cnVjdCBfRHJpRmVuY2VPYmplY3QgKiBmZW5jZSk7Ci0gICBkcm1CTyAqKCprZXJuZWwpIChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKiBwb29sLCB2b2lkICpwcml2YXRlKTsKLSAgIGludCAoKnZhbGlkYXRlKSAoc3RydWN0IF9EcmlCdWZmZXJQb29sICogcG9vbCwgdm9pZCAqcHJpdmF0ZSk7Ci0gICB2b2lkICooKnNldHN0YXRpYykgKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqIHBvb2wsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKnZpcnR1YWwsIHVuc2lnbmVkIGZsYWdzKTsKLSAgIGludCAoKndhaXRJZGxlKSAoc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB2b2lkICpwcml2YXRlLAotCQkgICAgaW50IGxhenkpOwotICAgdm9pZCAoKnRha2VEb3duKSAoc3RydWN0IF9EcmlCdWZmZXJQb29sICogcG9vbCk7Ci0gICB2b2lkICpkYXRhOwotfSBEcmlCdWZmZXJQb29sOwotCi1leHRlcm4gdm9pZCBibUVycm9yKGludCB2YWwsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7Ci0jZGVmaW5lIEJNX0NLRkFUQUwodmFsKQkJCQkJICAgICAgIFwKLSAgZG97CQkJCQkJCSAgICAgICBcCi0gICAgaW50IHRzdFZhbCA9ICh2YWwpOwkJCQkJICAgICAgIFwKLSAgICBpZiAodHN0VmFsKSAJCQkJCSAgICAgICBcCi0gICAgICBibUVycm9yKHRzdFZhbCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyAgICAgICBcCi0gIH0gd2hpbGUoMCk7Ci0KLQotCi0KLQotLyoKLSAqIEJ1aWx0aW4gcG9vbHMuCi0gKi8KLQotLyoKLSAqIEtlcm5lbCBidWZmZXIgb2JqZWN0cy4gU2l6ZSBpbiBtdWx0aXBsZXMgb2YgcGFnZSBzaXplLiBQYWdlIHNpemUgYWxpZ25lZC4KLSAqLwotCi1leHRlcm4gc3RydWN0IF9EcmlCdWZmZXJQb29sICpkcmlEUk1Qb29sSW5pdChpbnQgZmQpOwotZXh0ZXJuIHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqZHJpRFJNU3RhdGljUG9vbEluaXQoaW50IGZkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZHJpX2RybXBvb2wuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfZHJtcG9vbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhhMTQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfZHJtcG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiwgVVNBCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAotICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKLSAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+Ci0gKi8KLQotI2luY2x1ZGUgPHhmODZkcm0uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJkcmlfYnVmcG9vbC5oIgotCi0vKgotICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24gdXNpbmcgRFJNIGJ1ZmZlciBvYmplY3RzIGFzIERSSSBidWZmZXIgb2JqZWN0cy4KLSAqLwotCi1zdGF0aWMgdm9pZCAqCi1wb29sX2NyZWF0ZShzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKnBvb2wsCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBoaW50LAotICAgICAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50KQotewotICAgZHJtQk8gKmJ1ZiA9IChkcm1CTyAqKSBtYWxsb2Moc2l6ZW9mKCpidWYpKTsKLSAgIGludCByZXQ7Ci0gICB1bnNpZ25lZCBwYWdlU2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLSAgIGlmICghYnVmKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgIGlmICgoYWxpZ25tZW50ID4gcGFnZVNpemUpICYmIChhbGlnbm1lbnQgJSBwYWdlU2l6ZSkpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotCi0gICByZXQgPSBkcm1CT0NyZWF0ZShwb29sLT5mZCwgMCwgc2l6ZSwgYWxpZ25tZW50IC8gcGFnZVNpemUsCi0JCSAgICAgTlVMTCwgZHJtX2JvX3R5cGVfZGMsCi0gICAgICAgICAgICAgICAgICAgICBmbGFncywgaGludCwgYnVmKTsKLSAgIGlmIChyZXQpIHsKLSAgICAgIGZyZWUoYnVmKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotCi0gICByZXR1cm4gKHZvaWQgKikgYnVmOwotfQotCi1zdGF0aWMgaW50Ci1wb29sX2Rlc3Ryb3koc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB2b2lkICpwcml2YXRlKQotewotICAgaW50IHJldDsKLSAgIGRybUJPICpidWYgPSAoZHJtQk8gKikgcHJpdmF0ZTsKLSAgIHJldCA9IGRybUJPRGVzdHJveShwb29sLT5mZCwgYnVmKTsKLSAgIGZyZWUoYnVmKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXBvb2xfbWFwKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqcG9vbCwgdm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgZmxhZ3MsCi0gICAgICAgICBpbnQgaGludCwgdm9pZCAqKnZpcnR1YWwpCi17Ci0gICBkcm1CTyAqYnVmID0gKGRybUJPICopIHByaXZhdGU7Ci0KLSAgIHJldHVybiBkcm1CT01hcChwb29sLT5mZCwgYnVmLCBmbGFncywgaGludCwgdmlydHVhbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBvb2xfdW5tYXAoc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB2b2lkICpwcml2YXRlKQotewotICAgZHJtQk8gKmJ1ZiA9IChkcm1CTyAqKSBwcml2YXRlOwotICAgcmV0dXJuIGRybUJPVW5tYXAocG9vbC0+ZmQsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wb29sX29mZnNldChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKnBvb2wsIHZvaWQgKnByaXZhdGUpCi17Ci0gICBkcm1CTyAqYnVmID0gKGRybUJPICopIHByaXZhdGU7Ci0gICByZXR1cm4gYnVmLT5vZmZzZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZAotcG9vbF9mbGFncyhzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKnBvb2wsIHZvaWQgKnByaXZhdGUpCi17Ci0gICBkcm1CTyAqYnVmID0gKGRybUJPICopIHByaXZhdGU7Ci0gICByZXR1cm4gYnVmLT5mbGFnczsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotcG9vbF9zaXplKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqcG9vbCwgdm9pZCAqcHJpdmF0ZSkKLXsKLSAgIGRybUJPICpidWYgPSAoZHJtQk8gKikgcHJpdmF0ZTsKLSAgIHJldHVybiBidWYtPnNpemU7Ci19Ci0KLXN0YXRpYyBpbnQKLXBvb2xfZmVuY2Uoc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB2b2lkICpwcml2YXRlLAotICAgICAgICAgICBzdHJ1Y3QgX0RyaUZlbmNlT2JqZWN0ICpmZW5jZSkKLXsKLSAgIC8qCi0gICAgKiBOb29wLiBUaGUga2VybmVsIGhhbmRsZXMgYWxsIGZlbmNpbmcuCi0gICAgKi8KLQotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBkcm1CTyAqCi1wb29sX2tlcm5lbChzdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKnBvb2wsIHZvaWQgKnByaXZhdGUpCi17Ci0gICByZXR1cm4gKGRybUJPICopIHByaXZhdGU7Ci19Ci0KLXN0YXRpYyBpbnQKLXBvb2xfd2FpdElkbGUoc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB2b2lkICpwcml2YXRlLCBpbnQgbGF6eSkKLXsKLSAgIGRybUJPICpidWYgPSAoZHJtQk8gKikgcHJpdmF0ZTsKLSAgIHJldHVybiBkcm1CT1dhaXRJZGxlKHBvb2wtPmZkLCBidWYsIChsYXp5KSA/IERSTV9CT19ISU5UX1dBSVRfTEFaWTowKTsKLX0KLQotICAgIAotc3RhdGljIHZvaWQKLXBvb2xfdGFrZWRvd24oc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sKQotewotICAgZnJlZShwb29sKTsKLX0KLQotCi1zdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKgotZHJpRFJNUG9vbEluaXQoaW50IGZkKQotewotICAgc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sOwotCi0gICBwb29sID0gKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqKSBtYWxsb2Moc2l6ZW9mKCpwb29sKSk7Ci0KLSAgIGlmICghcG9vbCkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICBwb29sLT5mZCA9IGZkOwotICAgcG9vbC0+bWFwID0gJnBvb2xfbWFwOwotICAgcG9vbC0+dW5tYXAgPSAmcG9vbF91bm1hcDsKLSAgIHBvb2wtPmRlc3Ryb3kgPSAmcG9vbF9kZXN0cm95OwotICAgcG9vbC0+b2Zmc2V0ID0gJnBvb2xfb2Zmc2V0OwotICAgcG9vbC0+ZmxhZ3MgPSAmcG9vbF9mbGFnczsKLSAgIHBvb2wtPnNpemUgPSAmcG9vbF9zaXplOwotICAgcG9vbC0+Y3JlYXRlID0gJnBvb2xfY3JlYXRlOwotICAgcG9vbC0+ZmVuY2UgPSAmcG9vbF9mZW5jZTsKLSAgIHBvb2wtPmtlcm5lbCA9ICZwb29sX2tlcm5lbDsKLSAgIHBvb2wtPnZhbGlkYXRlID0gTlVMTDsKLSAgIHBvb2wtPnNldHN0YXRpYyA9IE5VTEw7Ci0gICBwb29sLT53YWl0SWRsZSA9ICZwb29sX3dhaXRJZGxlOwotICAgcG9vbC0+dGFrZURvd24gPSAmcG9vbF90YWtlZG93bjsKLSAgIHBvb2wtPmRhdGEgPSBOVUxMOwotICAgcmV0dXJuIHBvb2w7Ci19Ci0KLQotc3RhdGljIHZvaWQgKgotcG9vbF9zZXRzdGF0aWMoc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqdmlydHVhbCwgdW5zaWduZWQgZmxhZ3MpCi17Ci0gICBkcm1CTyAqYnVmID0gKGRybUJPICopIG1hbGxvYyhzaXplb2YoKmJ1ZikpOwotICAgaW50IHJldDsKLQotICAgaWYgKCFidWYpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgcmV0ID0gZHJtQk9DcmVhdGUocG9vbC0+ZmQsIG9mZnNldCwgc2l6ZSwgMCwgTlVMTCwgZHJtX2JvX3R5cGVfZmFrZSwKLSAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBEUk1fQk9fSElOVF9ET05UX0ZFTkNFLCBidWYpOwotCi0gICBpZiAocmV0KSB7Ci0gICAgICBmcmVlKGJ1Zik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgYnVmLT52aXJ0dWFsID0gdmlydHVhbDsKLQotICAgcmV0dXJuICh2b2lkICopIGJ1ZjsKLX0KLQotCi1zdHJ1Y3QgX0RyaUJ1ZmZlclBvb2wgKgotZHJpRFJNU3RhdGljUG9vbEluaXQoaW50IGZkKQotewotICAgc3RydWN0IF9EcmlCdWZmZXJQb29sICpwb29sOwotCi0gICBwb29sID0gKHN0cnVjdCBfRHJpQnVmZmVyUG9vbCAqKSBtYWxsb2Moc2l6ZW9mKCpwb29sKSk7Ci0KLSAgIGlmICghcG9vbCkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICBwb29sLT5mZCA9IGZkOwotICAgcG9vbC0+bWFwID0gJnBvb2xfbWFwOwotICAgcG9vbC0+dW5tYXAgPSAmcG9vbF91bm1hcDsKLSAgIHBvb2wtPmRlc3Ryb3kgPSAmcG9vbF9kZXN0cm95OwotICAgcG9vbC0+b2Zmc2V0ID0gJnBvb2xfb2Zmc2V0OwotICAgcG9vbC0+ZmxhZ3MgPSAmcG9vbF9mbGFnczsKLSAgIHBvb2wtPnNpemUgPSAmcG9vbF9zaXplOwotICAgcG9vbC0+Y3JlYXRlID0gTlVMTDsKLSAgIHBvb2wtPmZlbmNlID0gJnBvb2xfZmVuY2U7Ci0gICBwb29sLT5rZXJuZWwgPSAmcG9vbF9rZXJuZWw7Ci0gICBwb29sLT52YWxpZGF0ZSA9IE5VTEw7Ci0gICBwb29sLT5zZXRzdGF0aWMgPSAmcG9vbF9zZXRzdGF0aWM7Ci0gICBwb29sLT53YWl0SWRsZSA9ICZwb29sX3dhaXRJZGxlOwotICAgcG9vbC0+dGFrZURvd24gPSAmcG9vbF90YWtlZG93bjsKLSAgIHBvb2wtPmRhdGEgPSBOVUxMOwotICAgcmV0dXJuIHBvb2w7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZHJpX3V0aWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfdXRpbC5jCmluZGV4IGZmZjc5YzMuLmU2OGZhYTMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfdXRpbC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfdXRpbC5jCkBAIC01NSwzOSArNTUsMTkgQEAKIAogI2luY2x1ZGUgImRyaV91dGlsLmgiCiAjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKIAogI2lmbmRlZiBHTFhfT01MX3N5bmNfY29udHJvbAotdHlwZWRlZiBHTGJvb2xlYW4gKCAqIFBGTkdMWEdFVE1TQ1JBVEVPTUxQUk9DKSAoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIF9fRFJJaWQgZHJhd2FibGUsIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IpOwordHlwZWRlZiBHTGJvb2xlYW4gKCAqIFBGTkdMWEdFVE1TQ1JBVEVPTUxQUk9DKSAoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IpOwogI2VuZGlmCiAKLS8qIFRoaXMgcG9pbnRlciAqbXVzdCogYmUgc2V0IGJ5IHRoZSBkcml2ZXIncyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jaXRvbiEKLSAqLwotY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogZHJpX2ludGVyZmFjZSA9IE5VTEw7Ci0KIC8qKgotICogVGhpcyBpcyB1c2VkIGluIGEgY291cGxlIG9mIHBsYWNlcyB0aGF0IGNhbGwgXGMgZHJpQ3JlYXRlTmV3RHJhd2FibGUuCisgKiBUaGlzIGlzIGp1c3QgYSB0b2tlbiBleHRlbnNpb24gdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgZHJpdmVyCisgKiBzdXBwb3J0cyBzZXR0aW5nIGEgcmVhZCBkcmF3YWJsZS4KICAqLwotc3RhdGljIGNvbnN0IGludCBlbXB0eV9hdHRyaWJ1dGVfbGlzdFsxXSA9IHsgTm9uZSB9OwotCi0KLS8qKgotICogQ2FjaGVkIGNvcHkgb2YgdGhlIGludGVybmFsIEFQSSB2ZXJzaW9uIHVzZWQgYnkgbGliR0wgYW5kIHRoZSBjbGllbnQtc2lkZQotICogRFJJIGRyaXZlci4KLSAqLwotc3RhdGljIGludCBhcGlfdmVyID0gMDsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgZHJpUXVlcnlGcmFtZVRyYWNraW5nKCBfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgdm9pZCAqcHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpzYmMsIGludDY0X3QgKm1pc3NlZEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbGFzdE1pc3NlZFVzYWdlLCBmbG9hdCAqdXNhZ2UgKTsKLQotc3RhdGljIHZvaWQgKmRyaUNyZWF0ZU5ld0RyYXdhYmxlKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJaWQgZHJhdywgX19EUklkcmF3YWJsZSAqcGRyYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbmRlclR5cGUsIGNvbnN0IGludCAqYXR0cnMpOwotCi1zdGF0aWMgdm9pZCBkcmlEZXN0cm95RHJhd2FibGUoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSk7Ci0KK2NvbnN0IF9fRFJJZXh0ZW5zaW9uIGRyaVJlYWREcmF3YWJsZUV4dGVuc2lvbiA9IHsKKyAgICBfX0RSSV9SRUFEX0RSQVdBQkxFLCBfX0RSSV9SRUFEX0RSQVdBQkxFX1ZFUlNJT04KK307CiAKIC8qKgogICogUHJpbnQgbWVzc2FnZSB0byBcYyBzdGRlcnIgaWYgdGhlIFxjIExJQkdMX0RFQlVHIGVudmlyb25tZW50IHZhcmlhYmxlCkBAIC0xMTEsMjAgKzkxLDE3IEBACiAgICAgfQogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiBcbmFtZSBEcmF3YWJsZSBsaXN0IG1hbmFnZW1lbnQgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qQHsqLwotCi1zdGF0aWMgR0xib29sZWFuIF9fZHJpQWRkRHJhd2FibGUodm9pZCAqZHJhd0hhc2gsIF9fRFJJZHJhd2FibGUgKnBkcmF3KQorR0xpbnQKK2RyaUludGVyc2VjdEFyZWEoIGRybV9jbGlwX3JlY3RfdCByZWN0MSwgZHJtX2NsaXBfcmVjdF90IHJlY3QyICkKIHsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwID0gKF9fRFJJZHJhd2FibGVQcml2YXRlICopcGRyYXctPnByaXZhdGU7CisgICBpZiAocmVjdDIueDEgPiByZWN0MS54MSkgcmVjdDEueDEgPSByZWN0Mi54MTsKKyAgIGlmIChyZWN0Mi54MiA8IHJlY3QxLngyKSByZWN0MS54MiA9IHJlY3QyLngyOworICAgaWYgKHJlY3QyLnkxID4gcmVjdDEueTEpIHJlY3QxLnkxID0gcmVjdDIueTE7CisgICBpZiAocmVjdDIueTIgPCByZWN0MS55MikgcmVjdDEueTIgPSByZWN0Mi55MjsKIAotICAgIGlmIChkcm1IYXNoSW5zZXJ0KGRyYXdIYXNoLCBwZHAtPmRyYXcsIHBkcmF3KSkKLQlyZXR1cm4gR0xfRkFMU0U7CisgICBpZiAocmVjdDEueDEgPiByZWN0MS54MiB8fCByZWN0MS55MSA+IHJlY3QxLnkyKSByZXR1cm4gMDsKIAotICAgIHJldHVybiBHTF9UUlVFOworICAgcmV0dXJuIChyZWN0MS54MiAtIHJlY3QxLngxKSAqIChyZWN0MS55MiAtIHJlY3QxLnkxKTsKIH0KIAogc3RhdGljIF9fRFJJZHJhd2FibGUgKl9fZHJpRmluZERyYXdhYmxlKHZvaWQgKmRyYXdIYXNoLCBfX0RSSWlkIGRyYXcpCkBAIC0xNjYsOSArMTQzLDYgQEAKICAgICB9CiB9CiAKLS8qQH0qLwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKiBcbmFtZSBDb250ZXh0ICh1biliaW5kaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3NywxMCArMTUxLDcgQEAKIC8qKgogICogVW5iaW5kIGNvbnRleHQuCiAgKiAKLSAqIFxwYXJhbSBkcHkgdGhlIGRpc3BsYXkgaGFuZGxlLgotICogXHBhcmFtIHNjcm4gdGhlIHNjcmVlbiBudW1iZXIuCi0gKiBccGFyYW0gZHJhdyBkcmF3YWJsZS4KLSAqIFxwYXJhbSByZWFkIEN1cnJlbnQgcmVhZGluZyBkcmF3YWJsZS4KKyAqIFxwYXJhbSBzY3JuIHRoZSBzY3JlZW4uCiAgKiBccGFyYW0gZ2MgY29udGV4dC4KICAqCiAgKiBccmV0dXJuIFxjIEdMX1RSVUUgb24gc3VjY2Vzcywgb3IgXGMgR0xfRkFMU0Ugb24gZmFpbHVyZS4KQEAgLTE5Myw1NiArMTY0LDI3IEBACiAgKiBXaGlsZSBjYXN0aW5nIHRoZSBvcGFxdWUgcHJpdmF0ZSBwb2ludGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlcnMKICAqIGludG8gdGhlaXIgcmVzcGVjdGl2ZSByZWFsIHR5cGVzIGl0IGFsc28gYXNzdXJlcyB0aGV5IGFyZSBub3QgXGMgTlVMTC4gCiAgKi8KLXN0YXRpYyBHTGJvb2xlYW4gZHJpVW5iaW5kQ29udGV4dChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sCi0JCQkgICAgICBfX0RSSWlkIGRyYXcsIF9fRFJJaWQgcmVhZCwKLQkJCSAgICAgIF9fRFJJY29udGV4dCAqY3R4KQorc3RhdGljIGludCBkcmlVbmJpbmRDb250ZXh0KF9fRFJJY29udGV4dCAqcGNwKQogewotICAgIF9fRFJJc2NyZWVuICpwRFJJU2NyZWVuOwotICAgIF9fRFJJZHJhd2FibGUgKnBkcmF3OwotICAgIF9fRFJJZHJhd2FibGUgKnByZWFkOwotICAgIF9fRFJJY29udGV4dFByaXZhdGUgKnBjcDsKLSAgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwOwotICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcnA7CisgICAgX19EUklzY3JlZW4gKnBzcDsKKyAgICBfX0RSSWRyYXdhYmxlICpwZHA7CisgICAgX19EUklkcmF3YWJsZSAqcHJwOwogCiAgICAgLyoKICAgICAqKiBBc3N1bWUgZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSBwcm9wZXJseSBpbiBnbFhNYWtlQ3VycmVudCBiZWZvcmUKICAgICAqKiBjYWxsaW5nIGRyaVVuYmluZENvbnRleHQuCiAgICAgKi8KIAotICAgIGlmIChjdHggPT0gTlVMTCB8fCBkcmF3ID09IE5vbmUgfHwgcmVhZCA9PSBOb25lKSB7Ci0JLyogRVJST1IhISEgKi8KLQlyZXR1cm4gR0xfRkFMU0U7Ci0gICAgfQorICAgIGlmIChwY3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogCi0gICAgcERSSVNjcmVlbiA9ICgqZHJpX2ludGVyZmFjZS0+Z2V0U2NyZWVuKShkcHksIHNjcm4pOwotICAgIGlmICggKHBEUklTY3JlZW4gPT0gTlVMTCkgfHwgKHBEUklTY3JlZW4tPnByaXZhdGUgPT0gTlVMTCkgKSB7Ci0JLyogRVJST1IhISEgKi8KLQlyZXR1cm4gR0xfRkFMU0U7Ci0gICAgfQotCi0gICAgcHNwID0gKF9fRFJJc2NyZWVuUHJpdmF0ZSAqKXBEUklTY3JlZW4tPnByaXZhdGU7Ci0gICAgcGNwID0gKF9fRFJJY29udGV4dFByaXZhdGUgKiljdHgtPnByaXZhdGU7Ci0KLSAgICBwZHJhdyA9IF9fZHJpRmluZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIGRyYXcpOwotICAgIGlmICghcGRyYXcpIHsKLQkvKiBFUlJPUiEhISAqLwotCXJldHVybiBHTF9GQUxTRTsKLSAgICB9Ci0gICAgcGRwID0gKF9fRFJJZHJhd2FibGVQcml2YXRlICopcGRyYXctPnByaXZhdGU7Ci0KLSAgICBwcmVhZCA9IF9fZHJpRmluZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIHJlYWQpOwotICAgIGlmICghcHJlYWQpIHsKLQkvKiBFUlJPUiEhISAqLwotCXJldHVybiBHTF9GQUxTRTsKLSAgICB9Ci0gICAgcHJwID0gKF9fRFJJZHJhd2FibGVQcml2YXRlICopcHJlYWQtPnByaXZhdGU7Ci0KKyAgICBwc3AgPSBwY3AtPmRyaVNjcmVlblByaXY7CisgICAgcGRwID0gcGNwLT5kcmlEcmF3YWJsZVByaXY7CisgICAgcHJwID0gcGNwLT5kcmlSZWFkYWJsZVByaXY7CiAKICAgICAvKiBMZXQgZHJpdmVyIHVuYmluZCBkcmF3YWJsZSBmcm9tIGNvbnRleHQgKi8KICAgICAoKnBzcC0+RHJpdmVyQVBJLlVuYmluZENvbnRleHQpKHBjcCk7CiAKLQogICAgIGlmIChwZHAtPnJlZmNvdW50ID09IDApIHsKIAkvKiBFUlJPUiEhISAqLwogCXJldHVybiBHTF9GQUxTRTsKQEAgLTI4NCw3MiArMjI2LDIwIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGJvdGggYSByZWFkIGJ1ZmZlciBhbmQgYSBkcmF3IGJ1ZmZlci4gIFRoaXMgaXMgbmVlZGVkCiAgKiBmb3IgXGMgZ2xYTWFrZUN1cnJlbnRSZWFkU0dJIG9yIEdMWCAxLjMncyBcYyBnbFhNYWtlQ29udGV4dEN1cnJlbnQKICAqIGZ1bmN0aW9uLgotICogCi0gKiBcYnVnIFRoaXMgZnVuY3Rpb24gY2FsbHMgXGMgZHJpQ3JlYXRlTmV3RHJhd2FibGUgaW4gdHdvIHBsYWNlcyB3aXRoIHRoZQotICogICAgICBcYyByZW5kZXJUeXBlIGhhcmQtY29kZWQgdG8gXGMgR0xYX1dJTkRPV19CSVQuICBTb21lIGNoZWNraW5nIG1pZ2h0Ci0gKiAgICAgIGJlIG5lZWRlZCBpbiB0aG9zZSBwbGFjZXMgd2hlbiBzdXBwb3J0IGZvciBwYnVmZmVycyBhbmQgLyBvciBwaXhtYXBzCi0gKiAgICAgIGlzIGFkZGVkLiAgSXMgaXQgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgZHJhd2FibGUgaXMgYSB3aW5kb3c/CiAgKi8KLXN0YXRpYyBHTGJvb2xlYW4gRG9CaW5kQ29udGV4dChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwKLQkJCSAgX19EUklpZCBkcmF3LCBfX0RSSWlkIHJlYWQsCi0JCQkgIF9fRFJJY29udGV4dCAqY3R4LCBjb25zdCBfX0dMY29udGV4dE1vZGVzICogbW9kZXMsCi0JCQkgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwKQorc3RhdGljIGludCBkcmlCaW5kQ29udGV4dChfX0RSSWNvbnRleHQgKnBjcCwKKwkJCSAgX19EUklkcmF3YWJsZSAqcGRwLAorCQkJICBfX0RSSWRyYXdhYmxlICpwcnApCiB7Ci0gICAgX19EUklkcmF3YWJsZSAqcGRyYXc7Ci0gICAgX19EUklkcmF3YWJsZVByaXZhdGUgKnBkcDsKLSAgICBfX0RSSWRyYXdhYmxlICpwcmVhZDsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJwOwotICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBjb25zdCBwY3AgPSBjdHgtPnByaXZhdGU7CisgICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBwY3AtPmRyaVNjcmVlblByaXY7CiAKKyAgICAvKgorICAgICoqIEFzc3VtZSBlcnJvciBjaGVja2luZyBpcyBkb25lIHByb3Blcmx5IGluIGdsWE1ha2VDdXJyZW50IGJlZm9yZQorICAgICoqIGNhbGxpbmcgZHJpQmluZENvbnRleHQuCisgICAgKi8KIAotICAgIC8qIEZpbmQgdGhlIF9EUklkcmF3YWJsZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgd3JpdGluZyBkcmF3YWJsZS4gKi8KLSAgICBwZHJhdyA9IF9fZHJpRmluZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIGRyYXcpOwotICAgIGlmICghcGRyYXcpIHsKLQkvKiBBbGxvY2F0ZSBhIG5ldyBkcmF3YWJsZSAqLwotCXBkcmF3ID0gKF9fRFJJZHJhd2FibGUgKilfbWVzYV9tYWxsb2Moc2l6ZW9mKF9fRFJJZHJhd2FibGUpKTsKLQlpZiAoIXBkcmF3KSB7Ci0JICAgIC8qIEVSUk9SISEhICovCi0JICAgIHJldHVybiBHTF9GQUxTRTsKLQl9Ci0KLQkvKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgKi8KLQlkcmlDcmVhdGVOZXdEcmF3YWJsZShkcHksIG1vZGVzLCBkcmF3LCBwZHJhdywgR0xYX1dJTkRPV19CSVQsCi0JCQkgICAgIGVtcHR5X2F0dHJpYnV0ZV9saXN0KTsKLQlpZiAoIXBkcmF3LT5wcml2YXRlKSB7Ci0JICAgIC8qIEVSUk9SISEhICovCi0JICAgIF9tZXNhX2ZyZWUocGRyYXcpOwotCSAgICByZXR1cm4gR0xfRkFMU0U7Ci0JfQotCi0gICAgfQotICAgIHBkcCA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKSBwZHJhdy0+cHJpdmF0ZTsKLQotICAgIC8qIEZpbmQgdGhlIF9EUklkcmF3YWJsZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcmVhZGluZyBkcmF3YWJsZS4gKi8KLSAgICBpZiAocmVhZCA9PSBkcmF3KSB7Ci0gICAgICAgIC8qIHJlYWQgYnVmZmVyID09IGRyYXcgYnVmZmVyICovCi0gICAgICAgIHBycCA9IHBkcDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHByZWFkID0gX19kcmlGaW5kRHJhd2FibGUocHNwLT5kcmF3SGFzaCwgcmVhZCk7Ci0gICAgICAgIGlmICghcHJlYWQpIHsKLSAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGRyYXdhYmxlICovCi0gICAgICAgICAgICBwcmVhZCA9IChfX0RSSWRyYXdhYmxlICopX21lc2FfbWFsbG9jKHNpemVvZihfX0RSSWRyYXdhYmxlKSk7Ci0gICAgICAgICAgICBpZiAoIXByZWFkKSB7Ci0gICAgICAgICAgICAgICAgLyogRVJST1IhISEgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBkcmF3YWJsZSAqLwotCSAgICBkcmlDcmVhdGVOZXdEcmF3YWJsZShkcHksIG1vZGVzLCByZWFkLCBwcmVhZCwgR0xYX1dJTkRPV19CSVQsCi0JCQkJIGVtcHR5X2F0dHJpYnV0ZV9saXN0KTsKLSAgICAgICAgICAgIGlmICghcHJlYWQtPnByaXZhdGUpIHsKLSAgICAgICAgICAgICAgICAvKiBFUlJPUiEhISAqLwotICAgICAgICAgICAgICAgIF9tZXNhX2ZyZWUocHJlYWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcnAgPSAoX19EUklkcmF3YWJsZVByaXZhdGUgKikgcHJlYWQtPnByaXZhdGU7Ci0gICAgfQorICAgIGlmIChwY3AgPT0gTlVMTCB8fCBwZHAgPT0gTm9uZSB8fCBwcnAgPT0gTm9uZSkKKwlyZXR1cm4gR0xfRkFMU0U7CiAKICAgICAvKiBCaW5kIHRoZSBkcmF3YWJsZSB0byB0aGUgY29udGV4dCAqLwogICAgIHBjcC0+ZHJpRHJhd2FibGVQcml2ID0gcGRwOwpAQCAtMzY0LDE2ICsyNTQsMjIgQEAKICAgICAqKiBOb3cgdGhhdCB3ZSBoYXZlIGEgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkcmF3YWJsZSwgd2UgY2FuCiAgICAgKiogaW5pdGlhbGl6ZSB0aGUgZHJhd2FibGUgaW5mb3JtYXRpb24gaWYgaGFzIG5vdCBiZWVuIGRvbmUgYmVmb3JlLgogICAgICovCi0gICAgaWYgKCFwZHAtPnBTdGFtcCB8fCAqcGRwLT5wU3RhbXAgIT0gcGRwLT5sYXN0U3RhbXApIHsKLQlEUk1fU1BJTkxPQ0soJnBzcC0+cFNBUkVBLT5kcmF3YWJsZV9sb2NrLCBwc3AtPmRyYXdMb2NrSUQpOwotCV9fZHJpVXRpbFVwZGF0ZURyYXdhYmxlSW5mbyhwZHApOwotCURSTV9TUElOVU5MT0NLKCZwc3AtPnBTQVJFQS0+ZHJhd2FibGVfbG9jaywgcHNwLT5kcmF3TG9ja0lEKTsKLSAgICB9CiAKLSAgICBpZiAoKHBkcCAhPSBwcnApICYmICghcHJwLT5wU3RhbXAgfHwgKnBycC0+cFN0YW1wICE9IHBycC0+bGFzdFN0YW1wKSkgewotCURSTV9TUElOTE9DSygmcHNwLT5wU0FSRUEtPmRyYXdhYmxlX2xvY2ssIHBzcC0+ZHJhd0xvY2tJRCk7Ci0JX19kcmlVdGlsVXBkYXRlRHJhd2FibGVJbmZvKHBycCk7Ci0JRFJNX1NQSU5VTkxPQ0soJnBzcC0+cFNBUkVBLT5kcmF3YWJsZV9sb2NrLCBwc3AtPmRyYXdMb2NrSUQpOworICAgIGlmIChwc3AtPmRyaTIuZW5hYmxlZCkgeworICAgICAgIF9fZHJpUGFyc2VFdmVudHMocGNwLCBwZHApOworICAgICAgIF9fZHJpUGFyc2VFdmVudHMocGNwLCBwcnApOworICAgIH0gZWxzZSB7CisJaWYgKCFwZHAtPnBTdGFtcCB8fCAqcGRwLT5wU3RhbXAgIT0gcGRwLT5sYXN0U3RhbXApIHsKKwkgICAgRFJNX1NQSU5MT0NLKCZwc3AtPnBTQVJFQS0+ZHJhd2FibGVfbG9jaywgcHNwLT5kcmF3TG9ja0lEKTsKKwkgICAgX19kcmlVdGlsVXBkYXRlRHJhd2FibGVJbmZvKHBkcCk7CisJICAgIERSTV9TUElOVU5MT0NLKCZwc3AtPnBTQVJFQS0+ZHJhd2FibGVfbG9jaywgcHNwLT5kcmF3TG9ja0lEKTsKKwl9CisJCisJaWYgKChwZHAgIT0gcHJwKSAmJiAoIXBycC0+cFN0YW1wIHx8ICpwcnAtPnBTdGFtcCAhPSBwcnAtPmxhc3RTdGFtcCkpIHsKKwkgICAgRFJNX1NQSU5MT0NLKCZwc3AtPnBTQVJFQS0+ZHJhd2FibGVfbG9jaywgcHNwLT5kcmF3TG9ja0lEKTsKKwkgICAgX19kcmlVdGlsVXBkYXRlRHJhd2FibGVJbmZvKHBycCk7CisJICAgIERSTV9TUElOVU5MT0NLKCZwc3AtPnBTQVJFQS0+ZHJhd2FibGVfbG9jaywgcHNwLT5kcmF3TG9ja0lEKTsKKwl9CiAgICAgfQogCiAgICAgLyogQ2FsbCBkZXZpY2Utc3BlY2lmaWMgTWFrZUN1cnJlbnQgKi8KQEAgLTM4MiwzNyArMjc4LDYgQEAKICAgICByZXR1cm4gR0xfVFJVRTsKIH0KIAotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYm90aCBhIHJlYWQgYnVmZmVyIGFuZCBhIGRyYXcgYnVmZmVyLiAgVGhpcyBpcyBuZWVkZWQKLSAqIGZvciBcYyBnbFhNYWtlQ3VycmVudFJlYWRTR0kgb3IgR0xYIDEuMydzIFxjIGdsWE1ha2VDb250ZXh0Q3VycmVudAotICogZnVuY3Rpb24uCi0gKi8KLXN0YXRpYyBHTGJvb2xlYW4gZHJpQmluZENvbnRleHQoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJaWQgZHJhdywgX19EUklpZCByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dCAqIGN0eCkKLXsKLSAgICBfX0RSSXNjcmVlbiAqcERSSVNjcmVlbjsKLQotICAgIC8qCi0gICAgKiogQXNzdW1lIGVycm9yIGNoZWNraW5nIGlzIGRvbmUgcHJvcGVybHkgaW4gZ2xYTWFrZUN1cnJlbnQgYmVmb3JlCi0gICAgKiogY2FsbGluZyBkcmlCaW5kQ29udGV4dC4KLSAgICAqLwotCi0gICAgaWYgKGN0eCA9PSBOVUxMIHx8IGRyYXcgPT0gTm9uZSB8fCByZWFkID09IE5vbmUpIHsKLQkvKiBFUlJPUiEhISAqLwotCXJldHVybiBHTF9GQUxTRTsKLSAgICB9Ci0KLSAgICBwRFJJU2NyZWVuID0gKCpkcmlfaW50ZXJmYWNlLT5nZXRTY3JlZW4pKGRweSwgc2Nybik7Ci0gICAgaWYgKCAocERSSVNjcmVlbiA9PSBOVUxMKSB8fCAocERSSVNjcmVlbi0+cHJpdmF0ZSA9PSBOVUxMKSApIHsKLQkvKiBFUlJPUiEhISAqLwotCXJldHVybiBHTF9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRG9CaW5kQ29udGV4dCggZHB5LCBkcmF3LCByZWFkLCBjdHgsIGN0eC0+bW9kZSwKLQkJCSAgKF9fRFJJc2NyZWVuUHJpdmF0ZSAqKXBEUklTY3JlZW4tPnByaXZhdGUgKTsKLX0KIC8qQH0qLwogCiAKQEAgLTQzNiw3ICszMDEsNyBAQAogdm9pZAogX19kcmlVdGlsVXBkYXRlRHJhd2FibGVJbmZvKF9fRFJJZHJhd2FibGVQcml2YXRlICpwZHApCiB7Ci0gICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7CisgICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBwZHAtPmRyaVNjcmVlblByaXY7CiAgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqcGNwID0gcGRwLT5kcmlDb250ZXh0UHJpdjsKICAgICAKICAgICBpZiAoIXBjcCAKQEAgLTQ0NywxNSArMzEyLDYgQEAKIAkgKi8KICAgICB9CiAKLSAgICBwc3AgPSBwZHAtPmRyaVNjcmVlblByaXY7Ci0gICAgaWYgKCFwc3ApIHsKLQkvKiBFUlJPUiEhISAqLwotICAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgIldhcm5pbmchIFBvc3NpYmxlIGluZmluaXRlIGxvb3AgZHVlIHRvIGJ1ZyAiCi0JCSAgICAgImluIGZpbGUgJXMsIGxpbmUgJWRcbiIsCi0JCSAgICAgX19GSUxFX18sIF9fTElORV9fKTsKLQlyZXR1cm47Ci0gICAgfQotCiAgICAgaWYgKHBkcC0+cENsaXBSZWN0cykgewogCV9tZXNhX2ZyZWUocGRwLT5wQ2xpcFJlY3RzKTsgCiAJcGRwLT5wQ2xpcFJlY3RzID0gTlVMTDsKQEAgLTQ2OCwxNSArMzI0LDE1IEBACiAKICAgICBEUk1fU1BJTlVOTE9DSygmcHNwLT5wU0FSRUEtPmRyYXdhYmxlX2xvY2ssIHBzcC0+ZHJhd0xvY2tJRCk7CiAKLSAgICBpZiAoIV9fZHJpRmluZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIHBkcC0+ZHJhdykgfHwKLQkhICgqZHJpX2ludGVyZmFjZS0+Z2V0RHJhd2FibGVJbmZvKShwZHAtPmRpc3BsYXksIHBkcC0+c2NyZWVuLCBwZHAtPmRyYXcsCisgICAgaWYgKCEgKCpwc3AtPmdldERyYXdhYmxlSW5mby0+Z2V0RHJhd2FibGVJbmZvKShwZHAsCiAJCQkgICZwZHAtPmluZGV4LCAmcGRwLT5sYXN0U3RhbXAsCiAJCQkgICZwZHAtPngsICZwZHAtPnksICZwZHAtPncsICZwZHAtPmgsCiAJCQkgICZwZHAtPm51bUNsaXBSZWN0cywgJnBkcC0+cENsaXBSZWN0cywKIAkJCSAgJnBkcC0+YmFja1gsCiAJCQkgICZwZHAtPmJhY2tZLAogCQkJICAmcGRwLT5udW1CYWNrQ2xpcFJlY3RzLAotCQkJICAmcGRwLT5wQmFja0NsaXBSZWN0cyApKSB7CisJCQkgICZwZHAtPnBCYWNrQ2xpcFJlY3RzLAorCQkJICBwZHAtPmxvYWRlclByaXZhdGUpKSB7CiAJLyogRXJyb3IgLS0gZWcgdGhlIHdpbmRvdyBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZC4gIEtlZXAgZ29pbmcKIAkgKiB3aXRoIG5vIGNsaXByZWN0cy4KIAkgKi8KQEAgLTQ5MCw3ICszNDYsMTM5IEBACiAgICAgICAgcGRwLT5wU3RhbXAgPSAmKHBzcC0+cFNBUkVBLT5kcmF3YWJsZVRhYmxlW3BkcC0+aW5kZXhdLnN0YW1wKTsKIAogICAgIERSTV9TUElOTE9DSygmcHNwLT5wU0FSRUEtPmRyYXdhYmxlX2xvY2ssIHBzcC0+ZHJhd0xvY2tJRCk7Cit9CiAKKworaW50CitfX2RyaVBhcnNlRXZlbnRzKF9fRFJJY29udGV4dFByaXZhdGUgKnBjcCwgX19EUklkcmF3YWJsZVByaXZhdGUgKnBkcCkKK3sKKyAgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IHBkcC0+ZHJpU2NyZWVuUHJpdjsKKyAgICBfX0RSSURyYXdhYmxlQ29uZmlnRXZlbnQgKmRjLCAqbGFzdF9kYzsKKyAgICBfX0RSSUJ1ZmZlckF0dGFjaEV2ZW50ICpiYSwgKmxhc3RfYmE7CisgICAgdW5zaWduZWQgaW50IHRhaWwsIG1hc2ssICpwLCBlbmQsIHRvdGFsLCBzaXplLCBjaGFuZ2VkOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgc2l6ZV90IHJlY3Rfc2l6ZTsKKworICAgIC8qIENoZWNrIGZvciB3cmFwYXJvdW5kLiAqLworICAgIGlmIChwY3AgJiYgcHNwLT5kcmkyLmJ1ZmZlci0+cHJlYWxsb2MgLSBwZHAtPmRyaTIudGFpbCA+IHBzcC0+ZHJpMi5idWZmZXItPnNpemUpIHsKKyAgICAgICAvKiBJZiBwcmVhbGxvYyBvdmVybGFwcyBpbnRvIHdoYXQgd2UganVzdCBwYXJzZWQsIHRoZQorCSogc2VydmVyIG92ZXJ3cm90ZSBpdCBhbmQgd2UgaGF2ZSB0byByZXNldCBvdXIgdGFpbAorCSogcG9pbnRlci4gKi8KKwlEUk1fVU5MT0NLKHBzcC0+ZmQsIHBzcC0+bG9jaywgcGNwLT5oSFdDb250ZXh0KTsKKwkoKnBzcC0+ZHJpMi5sb2FkZXItPnJlZW1pdERyYXdhYmxlSW5mbykocGRwLCAmcGRwLT5kcmkyLnRhaWwsCisJCQkJCQlwZHAtPmxvYWRlclByaXZhdGUpOworCURSTV9MSUdIVF9MT0NLKHBzcC0+ZmQsIHBzcC0+bG9jaywgcGNwLT5oSFdDb250ZXh0KTsKKyAgICB9CisKKyAgICB0b3RhbCA9IHBzcC0+ZHJpMi5idWZmZXItPmhlYWQgLSBwZHAtPmRyaTIudGFpbDsKKyAgICBtYXNrID0gcHNwLT5kcmkyLmJ1ZmZlci0+c2l6ZSAtIDE7CisgICAgZW5kID0gcHNwLT5kcmkyLmJ1ZmZlci0+aGVhZDsKKyAgICBkYXRhID0gcHNwLT5kcmkyLmJ1ZmZlci0+ZGF0YTsKKworICAgIGNoYW5nZWQgPSAwOworICAgIGxhc3RfZGMgPSBOVUxMOworICAgIGxhc3RfYmEgPSBOVUxMOworCisgICAgZm9yICh0YWlsID0gcGRwLT5kcmkyLnRhaWw7IHRhaWwgIT0gZW5kOyB0YWlsICs9IHNpemUpIHsKKyAgICAgICBwID0gKHVuc2lnbmVkIGludCAqKSAoZGF0YSArICh0YWlsICYgbWFzaykpOworICAgICAgIHNpemUgPSBEUkkyX0VWRU5UX1NJWkUoKnApOworICAgICAgIGlmIChzaXplID4gdG90YWwgfHwgKHRhaWwgJiBtYXNrKSArIHNpemUgPiBwc3AtPmRyaTIuYnVmZmVyLT5zaXplKSB7CisJICAvKiBpbGxlZ2FsIGRhdGEsIGJhaWwgb3V0LiAqLworCSAgZnByaW50ZihzdGRlcnIsICJpbGxlZ2FsIGV2ZW50IHNpemVcbiIpOworCSAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgc3dpdGNoIChEUkkyX0VWRU5UX1RZUEUoKnApKSB7CisgICAgICAgY2FzZSBEUkkyX0VWRU5UX0RSQVdBQkxFX0NPTkZJRzoKKwkgIGRjID0gKF9fRFJJRHJhd2FibGVDb25maWdFdmVudCAqKSBwOworCSAgaWYgKGRjLT5kcmF3YWJsZSA9PSBwZHAtPmRyaTIuZHJhd2FibGVfaWQpCisJICAgICBsYXN0X2RjID0gZGM7CisJICBicmVhazsKKworICAgICAgIGNhc2UgRFJJMl9FVkVOVF9CVUZGRVJfQVRUQUNIOgorCSAgYmEgPSAoX19EUklCdWZmZXJBdHRhY2hFdmVudCAqKSBwOworCSAgaWYgKGJhLT5kcmF3YWJsZSA9PSBwZHAtPmRyaTIuZHJhd2FibGVfaWQgJiYgCisJICAgICAgYmEtPmJ1ZmZlci5hdHRhY2htZW50ID09IERSSV9EUkFXQUJMRV9CVUZGRVJfRlJPTlRfTEVGVCkKKwkgICAgIGxhc3RfYmEgPSBiYTsKKwkgIGJyZWFrOworICAgICAgIH0KKyAgICB9CisJICAKKyAgICBpZiAobGFzdF9kYykgeworICAgICAgIGlmIChwZHAtPncgIT0gbGFzdF9kYy0+d2lkdGggfHwgcGRwLT5oICE9IGxhc3RfZGMtPmhlaWdodCkKKwkgIGNoYW5nZWQgPSAxOworCisgICAgICAgcGRwLT54ID0gbGFzdF9kYy0+eDsKKyAgICAgICBwZHAtPnkgPSBsYXN0X2RjLT55OworICAgICAgIHBkcC0+dyA9IGxhc3RfZGMtPndpZHRoOworICAgICAgIHBkcC0+aCA9IGxhc3RfZGMtPmhlaWdodDsKKworICAgICAgIHBkcC0+YmFja1ggPSAwOworICAgICAgIHBkcC0+YmFja1kgPSAwOworICAgICAgIHBkcC0+bnVtQmFja0NsaXBSZWN0cyA9IDE7CisgICAgICAgcGRwLT5wQmFja0NsaXBSZWN0c1swXS54MSA9IDA7CisgICAgICAgcGRwLT5wQmFja0NsaXBSZWN0c1swXS55MSA9IDA7CisgICAgICAgcGRwLT5wQmFja0NsaXBSZWN0c1swXS54MiA9IHBkcC0+dzsKKyAgICAgICBwZHAtPnBCYWNrQ2xpcFJlY3RzWzBdLnkyID0gcGRwLT5oOworCisgICAgICAgcGRwLT5udW1DbGlwUmVjdHMgPSBsYXN0X2RjLT5udW1fcmVjdHM7CisgICAgICAgX21lc2FfZnJlZShwZHAtPnBDbGlwUmVjdHMpOworICAgICAgIHJlY3Rfc2l6ZSA9IGxhc3RfZGMtPm51bV9yZWN0cyAqIHNpemVvZiBsYXN0X2RjLT5yZWN0c1swXTsKKyAgICAgICBwZHAtPnBDbGlwUmVjdHMgPSBfbWVzYV9tYWxsb2MocmVjdF9zaXplKTsKKyAgICAgICBtZW1jcHkocGRwLT5wQ2xpcFJlY3RzLCBsYXN0X2RjLT5yZWN0cywgcmVjdF9zaXplKTsKKyAgICB9CisKKyAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIG1vc3QgcmVjZW50IGRyYXdhYmxlIGNvbmZpZy4gKi8KKyAgICBpZiAobGFzdF9kYyAmJiBjaGFuZ2VkKQorICAgICAgICgqcHNwLT5Ecml2ZXJBUEkuSGFuZGxlRHJhd2FibGVDb25maWcpKHBkcCwgcGNwLCBsYXN0X2RjKTsKKworICAgIC8qIEZyb250IGJ1ZmZlciBhdHRhY2htZW50cyBhcmUgc3BlY2lhbCwgdGhleSB0eXBpY2FsbHkgbWVhbiB0aGF0CisgICAgICogd2UncmUgcmVuZGVyaW5nIHRvIGEgcmVkaXJlY3RlZCB3aW5kb3cgKG9yIGEgY2hpbGQgd2luZG93IG9mIGEKKyAgICAgKiByZWRpcmVjdGVkIHdpbmRvdykgYW5kIHRoYXQgaXQgZ290IHJlc2l6ZWQuICBSZXNpemluZyB0aGUgcm9vdAorICAgICAqIHdpbmRvdyBvbiByYW5kciBldmVudHMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhpcy4gIE90aGVyIGNhdXNlcworICAgICAqIG1heSBiZSBhIHdpbmRvdyB0cmFuc2l0aW9uaW5nIGJldHdlZW4gcmVkaXJlY3RlZCBhbmQKKyAgICAgKiBub24tcmVkaXJlY3RlZCwgb3IgYSB3aW5kb3cgZ2V0dGluZyByZXBhcmVudGVkIGJldHdlZW4gcGFyZW50cworICAgICAqIHdpdGggZGlmZmVyZW50IHdpbmRvdyBwaXhtYXBzIChlZyB0d28gcmVkaXJlY3RlZCB3aW5kb3dzKS4KKyAgICAgKiBUaGVzZSBldmVudHMgYXJlIHNwZWNpYWwgaW4gdGhhdCB0aGUgWCBzZXJ2ZXIgYWxsb2NhdGVzIHRoZQorICAgICAqIGJ1ZmZlciBhbmQgdGhhdCB0aGUgYnVmZmVyIG1heSBiZSBzaGFyZWQgYnkgb3RoZXIgY2hpbGQKKyAgICAgKiB3aW5kb3dzLiAgV2hlbiBvdXIgd2luZG93IHNoYXJlIHRoZSB3aW5kb3cgcGl4bWFwIHdpdGggaXRzCisgICAgICogcGFyZW50LCBkcmF3YWJsZSBjb25maWcgZXZlbnRzIGRvZXNuJ3QgYWZmZWN0IHRoZSBmcm9udCBidWZmZXIuCisgICAgICogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBsYXN0IHN1Y2ggZXZlbnQgaW4gdGhlIGJ1ZmZlcjsgaW4gZmFjdCwKKyAgICAgKiBvbGRlciBldmVudHMgd2lsbCByZWZlciB0byBpbnZhbGlkIGJ1ZmZlciBvYmplY3RzLiovCisgICAgaWYgKGxhc3RfYmEpCisgICAgICAgKCpwc3AtPkRyaXZlckFQSS5IYW5kbGVCdWZmZXJBdHRhY2gpKHBkcCwgcGNwLCBsYXN0X2JhKTsKKworICAgIC8qIElmIHRoZXJlIHdhcyBhIGRyYXdhYmxlIGNvbmZpZyBldmVudCBpbiB0aGUgYnVmZmVyIGFuZCBpdAorICAgICAqIGNoYW5nZWQgdGhlIHNpemUgb2YgdGhlIHdpbmRvdywgYWxsIGJ1ZmZlciBhdXhpbGxhcnkgYnVmZmVyCisgICAgICogYXR0YWNobWVudHMgcHJpb3IgdG8gdGhhdCBhcmUgaW52YWxpZCAoYXMgb3Bwb3NlZCB0byB0aGUgZnJvbnQKKyAgICAgKiBidWZmZXIgY2FzZSBkaXNjdXNzZWQgYWJvdmUpLiAgSW4gdGhhdCBjYXNlIHdlIGNhbiBzdGFydAorICAgICAqIGxvb2tpbmcgZm9yIGJ1ZmZlciBhdHRhY2htZW50IGFmdGVyIHRoZSBsYXN0IGRyYXdhYmxlIGNvbmZpZworICAgICAqIGV2ZW50LiAgSWYgdGhlcmUgaXMgbm8gZHJhd2FibGUgY29uZmlnIGV2ZW50IGluIHRoaXMgYmF0Y2ggb2YKKyAgICAgKiBldmVudHMsIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIGxhc3QgYmF0Y2ggbWlnaHQgaGF2ZSBoYWQKKyAgICAgKiBvbmUgYW5kIHByb2Nlc3MgYWxsIGJ1ZmZlciBhdHRhY2ggZXZlbnRzLiovCisgICAgaWYgKGxhc3RfZGMgJiYgY2hhbmdlZCkKKyAgICAgICB0YWlsID0gKHVuc2lnbmVkIGNoYXIgKikgbGFzdF9kYyAtIGRhdGE7CisgICAgZWxzZQorICAgICAgIHRhaWwgPSBwZHAtPmRyaTIudGFpbDsKKworICAgIGZvciAoIDsgdGFpbCAhPSBlbmQ7IHRhaWwgKz0gc2l6ZSkgeworICAgICAgIGJhID0gKF9fRFJJQnVmZmVyQXR0YWNoRXZlbnQgKikgKGRhdGEgKyAodGFpbCAmIG1hc2spKTsKKyAgICAgICBzaXplID0gRFJJMl9FVkVOVF9TSVpFKGJhLT5ldmVudF9oZWFkZXIpOworCisgICAgICAgaWYgKERSSTJfRVZFTlRfVFlQRShiYS0+ZXZlbnRfaGVhZGVyKSAhPSBEUkkyX0VWRU5UX0JVRkZFUl9BVFRBQ0gpCisJICBjb250aW51ZTsKKyAgICAgICBpZiAoYmEtPmRyYXdhYmxlICE9IHBkcC0+ZHJpMi5kcmF3YWJsZV9pZCkKKwkgIGNvbnRpbnVlOworICAgICAgIGlmIChsYXN0X2JhID09IGJhKQorCSAgY29udGludWU7CisKKyAgICAgICAoKnBzcC0+RHJpdmVyQVBJLkhhbmRsZUJ1ZmZlckF0dGFjaCkocGRwLCBwY3AsIGJhKTsKKyAgICAgICBjaGFuZ2VkID0gMTsKKyAgICB9CisKKyAgICBwZHAtPmRyaTIudGFpbCA9IHRhaWw7CisKKyAgICByZXR1cm4gY2hhbmdlZCB8fCBsYXN0X2JhOwogfQogCiAvKkB9Ki8KQEAgLTUwMCwxMCArNDg4LDMzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKkB7Ki8KIAorc3RhdGljIHZvaWQgZHJpUmVwb3J0RGFtYWdlKF9fRFJJZHJhd2FibGUgKnBkcCwKKwkJCSAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcENsaXBSZWN0cywgaW50IG51bUNsaXBSZWN0cykKK3sKKyAgICBfX0RSSXNjcmVlbiAqcHNwID0gcGRwLT5kcmlTY3JlZW5Qcml2OworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHRoZSBuZXcgZGFtYWdlIHJlcG9ydCBtZXRob2QgKi8KKyAgICBpZiAocHNwLT5kcmkyLmVuYWJsZWQpIHsKKwkoKnBzcC0+ZHJpMi5sb2FkZXItPnBvc3REYW1hZ2UpKHBkcCwKKwkJCQkJcENsaXBSZWN0cywKKwkJCQkJbnVtQ2xpcFJlY3RzLAorCQkJCQlwZHAtPmxvYWRlclByaXZhdGUpOworICAgIH0gZWxzZSBpZiAocHNwLT5kYW1hZ2UpIHsKKwkvKiBSZXBvcnQgdGhlIGRhbWFnZS4gIEN1cnJlbnRseSwgYWxsIG91ciBkcml2ZXJzIGRyYXcKKwkgKiBkaXJlY3RseSB0byB0aGUgZnJvbnQgYnVmZmVyLCBzbyB3ZSByZXBvcnQgdGhlIGRhbWFnZSB0aGVyZQorCSAqIHJhdGhlciB0aGFuIHRvIHRoZSBiYWNraW5nIHN0b3JlaW4gKGlmIGFueSkuCisJICovCisJKCpwc3AtPmRhbWFnZS0+cmVwb3J0RGFtYWdlKShwZHAsCisJCQkJICAgICBwZHAtPngsIHBkcC0+eSwKKwkJCQkgICAgIHBDbGlwUmVjdHMsIG51bUNsaXBSZWN0cywKKwkJCQkgICAgIEdMX1RSVUUsIHBkcC0+bG9hZGVyUHJpdmF0ZSk7CisgICAgfQorfQorCisKIC8qKgogICogU3dhcCBidWZmZXJzLgogICoKLSAqIFxwYXJhbSBkcHkgdGhlIGRpc3BsYXkgaGFuZGxlLgogICogXHBhcmFtIGRyYXdhYmxlUHJpdmF0ZSBvcGFxdWUgcG9pbnRlciB0byB0aGUgcGVyLWRyYXdhYmxlIHByaXZhdGUgaW5mby4KICAqIAogICogXGludGVybmFsCkBAIC01MTEsNzggKzUyMiwzNSBAQAogICogCiAgKiBJcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSBnbFhTd2FwQnVmZmVycygpLgogICovCi1zdGF0aWMgdm9pZCBkcmlTd2FwQnVmZmVycyggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSApCitzdGF0aWMgdm9pZCBkcmlTd2FwQnVmZmVycyhfX0RSSWRyYXdhYmxlICpkUHJpdikKIHsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSAoX19EUklkcmF3YWJsZVByaXZhdGUgKikgZHJhd2FibGVQcml2YXRlOwotICAgIGRybV9jbGlwX3JlY3RfdCByZWN0OworICAgIF9fRFJJc2NyZWVuICpwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKIAotICAgIGRQcml2LT5zd2FwQnVmZmVycyhkUHJpdik7CisgICAgaWYgKCFkUHJpdi0+bnVtQ2xpcFJlY3RzKQorICAgICAgICByZXR1cm47CiAKLSAgICAvKiBDaGVjayB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgdGhlIG5ldyBkYW1hZ2UgcmVwb3J0IG1ldGhvZCAqLwotICAgIGlmIChhcGlfdmVyIDwgMjAwNzAxMDUgfHwgZHJpX2ludGVyZmFjZS0+cmVwb3J0RGFtYWdlID09IE5VTEwpCi0JcmV0dXJuOworICAgIGlmIChwc3AtPmRyaTIuZW5hYmxlZCkKKyAgICAgICBfX2RyaVBhcnNlRXZlbnRzKE5VTEwsIGRQcml2KTsKIAotICAgIC8qIEFzc3VtZSBpdCdzIGFmZmVjdGluZyB0aGUgd2hvbGUgZHJhd2FibGUgZm9yIG5vdyAqLwotICAgIHJlY3QueDEgPSAwOwotICAgIHJlY3QueTEgPSAwOwotICAgIHJlY3QueDIgPSByZWN0LngxICsgZFByaXYtPnc7Ci0gICAgcmVjdC55MiA9IHJlY3QueTEgKyBkUHJpdi0+aDsKKyAgICBwc3AtPkRyaXZlckFQSS5Td2FwQnVmZmVycyhkUHJpdik7CiAKLSAgICAvKiBSZXBvcnQgdGhlIGRhbWFnZS4gIEN1cnJlbnRseSwgYWxsIG91ciBkcml2ZXJzIGRyYXcgZGlyZWN0bHkgdG8gdGhlCi0gICAgICogZnJvbnQgYnVmZmVyLCBzbyB3ZSByZXBvcnQgdGhlIGRhbWFnZSB0aGVyZSByYXRoZXIgdGhhbiB0byB0aGUgYmFja2luZwotICAgICAqIHN0b3JlIChpZiBhbnkpLgotICAgICAqLwotICAgICgqZHJpX2ludGVyZmFjZS0+cmVwb3J0RGFtYWdlKShkcHksIGRQcml2LT5zY3JlZW4sIGRQcml2LT5kcmF3LAotCQkJCSAgIGRQcml2LT54LCBkUHJpdi0+eSwKLQkJCQkgICAmcmVjdCwgMSwgR0xfVFJVRSk7CisgICAgZHJpUmVwb3J0RGFtYWdlKGRQcml2LCBkUHJpdi0+cENsaXBSZWN0cywgZFByaXYtPm51bUNsaXBSZWN0cyk7CiB9CiAKLS8qKgotICogQ2FsbGVkIGRpcmVjdGx5IGZyb20gYSBudW1iZXIgb2YgaGlnaGVyLWxldmVsIEdMWCBmdW5jdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgZHJpR2V0TVNDKCB2b2lkICpzY3JlZW5Qcml2YXRlLCBpbnQ2NF90ICptc2MgKQorc3RhdGljIGludCBkcmlEcmF3YWJsZUdldE1TQyggX19EUklzY3JlZW4gKnNQcml2LCBfX0RSSWRyYXdhYmxlICpkUHJpdiwKKwkJCSAgICAgIGludDY0X3QgKm1zYyApCiB7Ci0gICAgX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdiA9IChfX0RSSXNjcmVlblByaXZhdGUgKikgc2NyZWVuUHJpdmF0ZTsKLQotICAgIHJldHVybiBzUHJpdi0+RHJpdmVyQVBJLkdldE1TQyggc1ByaXYsIG1zYyApOworICAgIHJldHVybiBzUHJpdi0+RHJpdmVyQVBJLkdldERyYXdhYmxlTVNDKHNQcml2LCBkUHJpdiwgbXNjKTsKIH0KIAotLyoqCi0gKiBDYWxsZWQgZGlyZWN0bHkgZnJvbSBhIG51bWJlciBvZiBoaWdoZXItbGV2ZWwgR0xYIGZ1bmN0aW9ucy4KLSAqLwotc3RhdGljIGludCBkcmlHZXRTQkMoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCB2b2lkICpkcmF3YWJsZVByaXZhdGUsIGludDY0X3QgKnNiYyApCisKK3N0YXRpYyBpbnQgZHJpV2FpdEZvck1TQyhfX0RSSWRyYXdhYmxlICpkUHJpdiwgaW50NjRfdCB0YXJnZXRfbXNjLAorCQkJIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIsCisJCQkgaW50NjRfdCAqIG1zYywgaW50NjRfdCAqIHNiYykKIHsKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKSBkcmF3YWJsZVByaXZhdGU7Ci0gICBfX0RSSXN3YXBJbmZvICBzSW5mbzsKLSAgIGludCAgc3RhdHVzOwotCi0KLSAgIHN0YXR1cyA9IGRQcml2LT5kcmlTY3JlZW5Qcml2LT5Ecml2ZXJBUEkuR2V0U3dhcEluZm8oIGRQcml2LCAmIHNJbmZvICk7Ci0gICAqc2JjID0gc0luZm8uc3dhcF9jb3VudDsKLQotICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBkcmlXYWl0Rm9yU0JDKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBkcHksIHZvaWQgKmRyYXdhYmxlUHJpdiwKLQkJCSAgaW50NjRfdCB0YXJnZXRfc2JjLAotCQkJICBpbnQ2NF90ICogbXNjLCBpbnQ2NF90ICogc2JjICkKLXsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSAoX19EUklkcmF3YWJsZVByaXZhdGUgKikgZHJhd2FibGVQcml2OwotCi0gICAgcmV0dXJuIGRQcml2LT5kcmlTY3JlZW5Qcml2LT5Ecml2ZXJBUEkuV2FpdEZvclNCQyggZFByaXYsIHRhcmdldF9zYmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNjLCBzYmMgKTsKLX0KLQotc3RhdGljIGludCBkcmlXYWl0Rm9yTVNDKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBkcHksIHZvaWQgKmRyYXdhYmxlUHJpdiwKLQkJCSAgaW50NjRfdCB0YXJnZXRfbXNjLAotCQkJICBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyLAotCQkJICBpbnQ2NF90ICogbXNjLCBpbnQ2NF90ICogc2JjICkKLXsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSAoX19EUklkcmF3YWJsZVByaXZhdGUgKikgZHJhd2FibGVQcml2OwogICAgIF9fRFJJc3dhcEluZm8gIHNJbmZvOwogICAgIGludCAgc3RhdHVzOwogCi0KICAgICBzdGF0dXMgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdi0+RHJpdmVyQVBJLldhaXRGb3JNU0MoIGRQcml2LCB0YXJnZXRfbXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvciwgcmVtYWluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNjICk7CkBAIC02MDAsNjMgKzU2OCw3MiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQ2NF90IGRyaVN3YXBCdWZmZXJzTVNDKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBkcHksIHZvaWQgKmRyYXdhYmxlUHJpdiwKLQkJCQkgIGludDY0X3QgdGFyZ2V0X21zYywKLQkJCQkgIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIgKQotewotICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKSBkcmF3YWJsZVByaXY7CiAKLSAgICByZXR1cm4gZFByaXYtPmRyaVNjcmVlblByaXYtPkRyaXZlckFQSS5Td2FwQnVmZmVyc01TQyggZFByaXYsIHRhcmdldF9tc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgKTsKLX0KK2NvbnN0IF9fRFJJbWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uIGRyaU1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX01FRElBX1NUUkVBTV9DT1VOVEVSLCBfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUl9WRVJTSU9OIH0sCisgICAgZHJpV2FpdEZvck1TQywKKyAgICBkcmlEcmF3YWJsZUdldE1TQywKK307CiAKLXN0YXRpYyB2b2lkIGRyaUNvcHlTdWJCdWZmZXIoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCB2b2lkICpkcmF3YWJsZVByaXZhdGUsCisKK3N0YXRpYyB2b2lkIGRyaUNvcHlTdWJCdWZmZXIoX19EUklkcmF3YWJsZSAqZFByaXYsCiAJCQkgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKIHsKLSAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSAoX19EUklkcmF3YWJsZVByaXZhdGUgKikgZHJhd2FibGVQcml2YXRlOworICAgIGRybV9jbGlwX3JlY3RfdCByZWN0OworCisgICAgcmVjdC54MSA9IHg7CisgICAgcmVjdC55MSA9IGRQcml2LT5oIC0geSAtIGg7CisgICAgcmVjdC54MiA9IHggKyB3OworICAgIHJlY3QueTIgPSByZWN0LnkxICsgaDsKKyAgICBkcmlSZXBvcnREYW1hZ2UoZFByaXYsICZyZWN0LCAxKTsKKwogICAgIGRQcml2LT5kcmlTY3JlZW5Qcml2LT5Ecml2ZXJBUEkuQ29weVN1YkJ1ZmZlcihkUHJpdiwgeCwgeSwgdywgaCk7Ci0gICAgKHZvaWQpIGRweTsKIH0KIAorY29uc3QgX19EUkljb3B5U3ViQnVmZmVyRXh0ZW5zaW9uIGRyaUNvcHlTdWJCdWZmZXJFeHRlbnNpb24gPSB7CisgICAgeyBfX0RSSV9DT1BZX1NVQl9CVUZGRVIsIF9fRFJJX0NPUFlfU1VCX0JVRkZFUl9WRVJTSU9OIH0sCisgICAgZHJpQ29weVN1YkJ1ZmZlcgorfTsKKworc3RhdGljIHZvaWQgZHJpU2V0U3dhcEludGVydmFsKF9fRFJJZHJhd2FibGUgKmRQcml2LCB1bnNpZ25lZCBpbnQgaW50ZXJ2YWwpCit7CisgICAgZFByaXYtPnN3YXBfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkcmlHZXRTd2FwSW50ZXJ2YWwoX19EUklkcmF3YWJsZSAqZFByaXYpCit7CisgICAgcmV0dXJuIGRQcml2LT5zd2FwX2ludGVydmFsOworfQorCitjb25zdCBfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uIGRyaVN3YXBDb250cm9sRXh0ZW5zaW9uID0geworICAgIHsgX19EUklfU1dBUF9DT05UUk9MLCBfX0RSSV9TV0FQX0NPTlRST0xfVkVSU0lPTiB9LAorICAgIGRyaVNldFN3YXBJbnRlcnZhbCwKKyAgICBkcmlHZXRTd2FwSW50ZXJ2YWwKK307CisKKwogLyoqCiAgKiBUaGlzIGlzIGNhbGxlZCB2aWEgX19EUklzY3JlZW5SZWMncyBjcmVhdGVOZXdEcmF3YWJsZSBwb2ludGVyLgogICovCi1zdGF0aWMgdm9pZCAqZHJpQ3JlYXRlTmV3RHJhd2FibGUoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksCi0JCQkJICBjb25zdCBfX0dMY29udGV4dE1vZGVzICptb2RlcywKLQkJCQkgIF9fRFJJaWQgZHJhdywKLQkJCQkgIF9fRFJJZHJhd2FibGUgKnBkcmF3LAotCQkJCSAgaW50IHJlbmRlclR5cGUsCi0JCQkJICBjb25zdCBpbnQgKmF0dHJzKQorc3RhdGljIF9fRFJJZHJhd2FibGUgKgorZHJpQ3JlYXRlTmV3RHJhd2FibGUoX19EUklzY3JlZW4gKnBzcCwgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJICAgICBkcm1fZHJhd2FibGVfdCBod0RyYXdhYmxlLCBpbnQgcmVuZGVyVHlwZSwKKwkJICAgICBjb25zdCBpbnQgKmF0dHJzLCB2b2lkICpkYXRhKQogewotICAgIF9fRFJJc2NyZWVuICogY29uc3QgcERSSVNjcmVlbiA9ICgqZHJpX2ludGVyZmFjZS0+Z2V0U2NyZWVuKShkcHksIG1vZGVzLT5zY3JlZW4pOwotICAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwOwotICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwZHA7Ci0KLQotICAgIHBkcmF3LT5wcml2YXRlID0gTlVMTDsKKyAgICBfX0RSSWRyYXdhYmxlICpwZHA7CiAKICAgICAvKiBTaW5jZSBwYnVmZmVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQsIG5vIGRyYXdhYmxlIGF0dHJpYnV0ZXMgYXJlCiAgICAgICogc3VwcG9ydGVkIGVpdGhlci4KICAgICAgKi8KICAgICAodm9pZCkgYXR0cnM7CiAKLSAgICBpZiAoIChwRFJJU2NyZWVuID09IE5VTEwpIHx8IChwRFJJU2NyZWVuLT5wcml2YXRlID09IE5VTEwpICkgewotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHBkcCA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKV9tZXNhX21hbGxvYyhzaXplb2YoX19EUklkcmF3YWJsZVByaXZhdGUpKTsKKyAgICBwZHAgPSBfbWVzYV9tYWxsb2Moc2l6ZW9mICpwZHApOwogICAgIGlmICghcGRwKSB7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKCEoKmRyaV9pbnRlcmZhY2UtPmNyZWF0ZURyYXdhYmxlKShkcHksIG1vZGVzLT5zY3JlZW4sIGRyYXcsICZwZHAtPmhIV0RyYXdhYmxlKSkgewotCV9tZXNhX2ZyZWUocGRwKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwZHAtPmRyYXcgPSBkcmF3OwotICAgIHBkcC0+cGRyYXcgPSBwZHJhdzsKKyAgICBwZHAtPmxvYWRlclByaXZhdGUgPSBkYXRhOworICAgIHBkcC0+aEhXRHJhd2FibGUgPSBod0RyYXdhYmxlOwogICAgIHBkcC0+cmVmY291bnQgPSAwOwogICAgIHBkcC0+cFN0YW1wID0gTlVMTDsKICAgICBwZHAtPmxhc3RTdGFtcCA9IDA7CkBAIC02NjksODAgKzY0Niw1NiBAQAogICAgIHBkcC0+bnVtQmFja0NsaXBSZWN0cyA9IDA7CiAgICAgcGRwLT5wQ2xpcFJlY3RzID0gTlVMTDsKICAgICBwZHAtPnBCYWNrQ2xpcFJlY3RzID0gTlVMTDsKLSAgICBwZHAtPmRpc3BsYXkgPSBkcHk7Ci0gICAgcGRwLT5zY3JlZW4gPSBtb2Rlcy0+c2NyZWVuOworICAgIHBkcC0+dmJsU2VxID0gMDsKKyAgICBwZHAtPnZibEZsYWdzID0gMDsKIAotICAgIHBzcCA9IChfX0RSSXNjcmVlblByaXZhdGUgKilwRFJJU2NyZWVuLT5wcml2YXRlOwogICAgIHBkcC0+ZHJpU2NyZWVuUHJpdiA9IHBzcDsKICAgICBwZHAtPmRyaUNvbnRleHRQcml2ID0gJnBzcC0+ZHVtbXlDb250ZXh0UHJpdjsKIAotICAgIGlmICghKCpwc3AtPkRyaXZlckFQSS5DcmVhdGVCdWZmZXIpKHBzcCwgcGRwLCBtb2RlcywKKyAgICBpZiAoISgqcHNwLT5Ecml2ZXJBUEkuQ3JlYXRlQnVmZmVyKShwc3AsIHBkcCwgJmNvbmZpZy0+bW9kZXMsCiAJCQkJCXJlbmRlclR5cGUgPT0gR0xYX1BJWE1BUF9CSVQpKSB7Ci0gICAgICAgKHZvaWQpKCpkcmlfaW50ZXJmYWNlLT5kZXN0cm95RHJhd2FibGUpKGRweSwgbW9kZXMtPnNjcmVlbiwgcGRwLT5kcmF3KTsKICAgICAgICBfbWVzYV9mcmVlKHBkcCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcGRyYXctPnByaXZhdGUgPSBwZHA7Ci0gICAgcGRyYXctPmRlc3Ryb3lEcmF3YWJsZSA9IGRyaURlc3Ryb3lEcmF3YWJsZTsKLSAgICBwZHJhdy0+c3dhcEJ1ZmZlcnMgPSBkcmlTd2FwQnVmZmVyczsgIC8qIGNhbGxlZCBieSBnbFhTd2FwQnVmZmVycygpICovCi0KLSAgICBwZHJhdy0+Z2V0U0JDID0gZHJpR2V0U0JDOwotICAgIHBkcmF3LT53YWl0Rm9yU0JDID0gZHJpV2FpdEZvclNCQzsKLSAgICBwZHJhdy0+d2FpdEZvck1TQyA9IGRyaVdhaXRGb3JNU0M7Ci0gICAgcGRyYXctPnN3YXBCdWZmZXJzTVNDID0gZHJpU3dhcEJ1ZmZlcnNNU0M7Ci0gICAgcGRyYXctPmZyYW1lVHJhY2tpbmcgPSBOVUxMOwotICAgIHBkcmF3LT5xdWVyeUZyYW1lVHJhY2tpbmcgPSBkcmlRdWVyeUZyYW1lVHJhY2tpbmc7Ci0KLSAgICBpZiAoZHJpQ29tcGFyZUdMWEFQSVZlcnNpb24gKDIwMDYwMzE0KSA+PSAwKQotCXBkcmF3LT5jb3B5U3ViQnVmZmVyID0gZHJpQ29weVN1YkJ1ZmZlcjsKKyAgICBwZHAtPm1zY19iYXNlID0gMDsKIAogICAgIC8qIFRoaXMgc3BlY2lhbCBkZWZhdWx0IHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvbmZpZ3VyZWQKICAgICAgKiBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGRyYXdhYmxlIGlzIGZpcnN0IGJvdW5kIHRvIGEgZGlyZWN0CiAgICAgICogcmVuZGVyaW5nIGNvbnRleHQuIAogICAgICAqLwotICAgIHBkcmF3LT5zd2FwX2ludGVydmFsID0gKHVuc2lnbmVkKS0xOworICAgIHBkcC0+c3dhcF9pbnRlcnZhbCA9ICh1bnNpZ25lZCktMTsKIAotICAgIHBkcC0+c3dhcEJ1ZmZlcnMgPSBwc3AtPkRyaXZlckFQSS5Td2FwQnVmZmVyczsKLQotICAgIC8qIEFkZCBwZHJhdyB0byBkcmF3YWJsZSBsaXN0ICovCi0gICAgaWYgKCFfX2RyaUFkZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIHBkcmF3KSkgewotCS8qIEVSUk9SISEhICovCi0JKCpwZHJhdy0+ZGVzdHJveURyYXdhYmxlKShkcHksIHBkcCk7Ci0JX21lc2FfZnJlZShwZHApOwotCXBkcCA9IE5VTEw7Ci0JcGRyYXctPnByaXZhdGUgPSBOVUxMOwotICAgIH0KLQotICAgcmV0dXJuICh2b2lkICopIHBkcDsKKyAgICByZXR1cm4gcGRwOwogfQogCisKIHN0YXRpYyBfX0RSSWRyYXdhYmxlICoKLWRyaUdldERyYXdhYmxlKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBfX0RSSWlkIGRyYXcsIHZvaWQgKnNjcmVlblByaXZhdGUpCitkcmkyQ3JlYXRlTmV3RHJhd2FibGUoX19EUklzY3JlZW4gKnNjcmVlbiwgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJICAgICAgdW5zaWduZWQgaW50IGRyYXdhYmxlX2lkLCB1bnNpZ25lZCBpbnQgaGVhZCwgdm9pZCAqZGF0YSkKIHsKLSAgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IChfX0RSSXNjcmVlblByaXZhdGUgKikgc2NyZWVuUHJpdmF0ZTsKKyAgICBfX0RSSWRyYXdhYmxlICpwZHJhdzsKIAotICAgIC8qCi0gICAgKiogTWFrZSBzdXJlIHRoaXMgcm91dGluZSByZXR1cm5zIE5VTEwgaWYgdGhlIGRyYXdhYmxlIGlzIG5vdCBib3VuZAotICAgICoqIHRvIGEgZGlyZWN0IHJlbmRlcmluZyBjb250ZXh0IQotICAgICovCi0gICAgcmV0dXJuIF9fZHJpRmluZERyYXdhYmxlKHBzcC0+ZHJhd0hhc2gsIGRyYXcpOworICAgIHBkcmF3ID0gZHJpQ3JlYXRlTmV3RHJhd2FibGUoc2NyZWVuLCBjb25maWcsIDAsIDAsIE5VTEwsIGRhdGEpOworICAgIGlmICghcGRyYXcpCisgICAgCXJldHVybiBOVUxMOworCisgICAgcGRyYXctPmRyaTIuZHJhd2FibGVfaWQgPSBkcmF3YWJsZV9pZDsKKyAgICBwZHJhdy0+ZHJpMi50YWlsID0gaGVhZDsKKyAgICBwZHJhdy0+cEJhY2tDbGlwUmVjdHMgPSBfbWVzYV9tYWxsb2Moc2l6ZW9mICpwZHJhdy0+cEJhY2tDbGlwUmVjdHMpOworCisgICAgcmV0dXJuIHBkcmF3OwogfQogCisKIHN0YXRpYyB2b2lkCi1kcmlEZXN0cm95RHJhd2FibGUoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIHZvaWQgKmRyYXdhYmxlUHJpdmF0ZSkKK2RyaURlc3Ryb3lEcmF3YWJsZShfX0RSSWRyYXdhYmxlICpwZHApCiB7Ci0gICAgX19EUklkcmF3YWJsZVByaXZhdGUgKnBkcCA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKSBkcmF3YWJsZVByaXZhdGU7CiAgICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7Ci0gICAgaW50IHNjcm47CiAKICAgICBpZiAocGRwKSB7CiAJcHNwID0gcGRwLT5kcmlTY3JlZW5Qcml2OwotCXNjcm4gPSBwc3AtPm15TnVtOwogICAgICAgICAoKnBzcC0+RHJpdmVyQVBJLkRlc3Ryb3lCdWZmZXIpKHBkcCk7Ci0JaWYgKCgqZHJpX2ludGVyZmFjZS0+d2luZG93RXhpc3RzKShkcHksIHBkcC0+ZHJhdykpCi0JICAgICh2b2lkKSgqZHJpX2ludGVyZmFjZS0+ZGVzdHJveURyYXdhYmxlKShkcHksIHNjcm4sIHBkcC0+ZHJhdyk7Ci0JZHJtSGFzaERlbGV0ZShwc3AtPmRyYXdIYXNoLCBwZHAtPmRyYXcpOwogCWlmIChwZHAtPnBDbGlwUmVjdHMpIHsKIAkgICAgX21lc2FfZnJlZShwZHAtPnBDbGlwUmVjdHMpOwogCSAgICBwZHAtPnBDbGlwUmVjdHMgPSBOVUxMOwpAQCAtNzY2LDIzICs3MTksMTUgQEAKIC8qKgogICogRGVzdHJveSB0aGUgcGVyLWNvbnRleHQgcHJpdmF0ZSBpbmZvcm1hdGlvbi4KICAqIAotICogXHBhcmFtIGRweSB0aGUgZGlzcGxheSBoYW5kbGUuCi0gKiBccGFyYW0gc2NybiB0aGUgc2NyZWVuIG51bWJlci4KLSAqIFxwYXJhbSBjb250ZXh0UHJpdmF0ZSBvcGFxdWUgcG9pbnRlciB0byB0aGUgcGVyLWRyYXdhYmxlIHByaXZhdGUgaW5mby4KLSAqCiAgKiBcaW50ZXJuYWwKICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgX19Ecml2ZXJBUElSZWM6OkRlc3Ryb3lDb250ZXh0IG9uIFxwIGNvbnRleHRQcml2YXRlLCBjYWxscwogICogZHJtRGVzdHJveUNvbnRleHQoKSwgYW5kIGZpbmFsbHkgZnJlZXMgXHAgY29udGV4dFByaXZhdGUuCiAgKi8KIHN0YXRpYyB2b2lkCi1kcmlEZXN0cm95Q29udGV4dChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIHZvaWQgKmNvbnRleHRQcml2YXRlKQorZHJpRGVzdHJveUNvbnRleHQoX19EUkljb250ZXh0ICpwY3ApCiB7Ci0gICAgX19EUkljb250ZXh0UHJpdmF0ZSAgKnBjcCAgID0gKF9fRFJJY29udGV4dFByaXZhdGUgKikgY29udGV4dFByaXZhdGU7Ci0KICAgICBpZiAocGNwKSB7CiAJKCpwY3AtPmRyaVNjcmVlblByaXYtPkRyaXZlckFQSS5EZXN0cm95Q29udGV4dCkocGNwKTsKLQlfX2RyaUdhcmJhZ2VDb2xsZWN0RHJhd2FibGVzKHBjcC0+ZHJpU2NyZWVuUHJpdi0+ZHJhd0hhc2gpOwotCSh2b2lkKSAoKmRyaV9pbnRlcmZhY2UtPmRlc3Ryb3lDb250ZXh0KShkcHksIHNjcm4sIHBjcC0+Y29udGV4dElEKTsKIAlfbWVzYV9mcmVlKHBjcCk7CiAgICAgfQogfQpAQCAtNzkxLDEzICs3MzYsOSBAQAogLyoqCiAgKiBDcmVhdGUgdGhlIHBlci1kcmF3YWJsZSBwcml2YXRlIGRyaXZlciBpbmZvcm1hdGlvbi4KICAqIAotICogXHBhcmFtIGRweSAgICAgICAgICAgVGhlIGRpc3BsYXkgaGFuZGxlLgotICogXHBhcmFtIG1vZGVzICAgICAgICAgTW9kZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IGNvbnRleHQuCiAgKiBccGFyYW0gcmVuZGVyX3R5cGUgICBUeXBlIG9mIHJlbmRlcmluZyB0YXJnZXQuICBcYyBHTFhfUkdCQSBpcyB0aGUgb25seQogICogICAgICAgICAgICAgICAgICAgICAgdHlwZSBsaWtlbHkgdG8gZXZlciBiZSBzdXBwb3J0ZWQgZm9yIGRpcmVjdC1yZW5kZXJpbmcuCi0gKiBccGFyYW0gc2hhcmVkUHJpdmF0ZSBUaGUgc2hhcmVkIGNvbnRleHQgZGVwZW5kZW50IG1ldGhvZHMgb3IgXGMgTlVMTCBpZgotICogICAgICAgICAgICAgICAgICAgICAgbm9uLWV4aXN0ZW50LgotICogXHBhcmFtIHBjdHggICAgICAgICAgRFJJIGNvbnRleHQgdG8gcmVjZWl2ZSB0aGUgY29udGV4dCBkZXBlbmRlbnQgbWV0aG9kcy4KKyAqIFxwYXJhbSBzaGFyZWQgICAgICAgIENvbnRleHQgd2l0aCB3aGljaCB0byBzaGFyZSB0ZXh0dXJlcywgZXRjLiBvciBOVUxMCiAgKgogICogXHJldHVybnMgQW4gb3BhcXVlIHBvaW50ZXIgdG8gdGhlIHBlci1jb250ZXh0IHByaXZhdGUgaW5mb3JtYXRpb24gb24KICAqICAgICAgICAgIHN1Y2Nlc3MsIG9yIFxjIE5VTEwgb24gZmFpbHVyZS4KQEAgLTgwOSwzNiArNzUwLDE4IEBACiAgKiBjb250ZXh0LgogICoKICAqLwotc3RhdGljIHZvaWQgKgotZHJpQ3JlYXRlTmV3Q29udGV4dChfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsCi0JCSAgICBpbnQgcmVuZGVyX3R5cGUsIHZvaWQgKnNoYXJlZFByaXZhdGUsIF9fRFJJY29udGV4dCAqcGN0eCkKK3N0YXRpYyBfX0RSSWNvbnRleHQgKgorZHJpQ3JlYXRlTmV3Q29udGV4dChfX0RSSXNjcmVlbiAqcHNwLCBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkgICAgaW50IHJlbmRlcl90eXBlLCBfX0RSSWNvbnRleHQgKnNoYXJlZCwgCisJCSAgICBkcm1fY29udGV4dF90IGh3Q29udGV4dCwgdm9pZCAqZGF0YSkKIHsKLSAgICBfX0RSSXNjcmVlbiAqcERSSVNjcmVlbjsKLSAgICBfX0RSSWNvbnRleHRQcml2YXRlICpwY3A7Ci0gICAgX19EUkljb250ZXh0UHJpdmF0ZSAqcHNoYXJlID0gKF9fRFJJY29udGV4dFByaXZhdGUgKikgc2hhcmVkUHJpdmF0ZTsKLSAgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKLSAgICB2b2lkICogY29uc3Qgc2hhcmVDdHggPSAocHNoYXJlICE9IE5VTEwpID8gcHNoYXJlLT5kcml2ZXJQcml2YXRlIDogTlVMTDsKKyAgICBfX0RSSWNvbnRleHQgKnBjcDsKKyAgICB2b2lkICogY29uc3Qgc2hhcmVDdHggPSAoc2hhcmVkICE9IE5VTEwpID8gc2hhcmVkLT5kcml2ZXJQcml2YXRlIDogTlVMTDsKIAotICAgIHBEUklTY3JlZW4gPSAoKmRyaV9pbnRlcmZhY2UtPmdldFNjcmVlbikoZHB5LCBtb2Rlcy0+c2NyZWVuKTsKLSAgICBpZiAoIChwRFJJU2NyZWVuID09IE5VTEwpIHx8IChwRFJJU2NyZWVuLT5wcml2YXRlID09IE5VTEwpICkgewotCS8qIEVSUk9SISEhICovCisgICAgcGNwID0gX21lc2FfbWFsbG9jKHNpemVvZiAqcGNwKTsKKyAgICBpZiAoIXBjcCkKIAlyZXR1cm4gTlVMTDsKLSAgICB9IAogCi0gICAgcHNwID0gKF9fRFJJc2NyZWVuUHJpdmF0ZSAqKXBEUklTY3JlZW4tPnByaXZhdGU7Ci0KLSAgICBwY3AgPSAoX19EUkljb250ZXh0UHJpdmF0ZSAqKV9tZXNhX21hbGxvYyhzaXplb2YoX19EUkljb250ZXh0UHJpdmF0ZSkpOwotICAgIGlmICghcGNwKSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCEgKCpkcmlfaW50ZXJmYWNlLT5jcmVhdGVDb250ZXh0KShkcHksIG1vZGVzLT5zY3JlZW4sIG1vZGVzLT5mYmNvbmZpZ0lELAotCQkJCQkmcGNwLT5jb250ZXh0SUQsICZwY3AtPmhIV0NvbnRleHQpKSB7Ci0JX21lc2FfZnJlZShwY3ApOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHBjcC0+ZGlzcGxheSA9IGRweTsKICAgICBwY3AtPmRyaVNjcmVlblByaXYgPSBwc3A7CiAgICAgcGNwLT5kcmlEcmF3YWJsZVByaXYgPSBOVUxMOwogCkBAIC04NDYsOCArNzY5LDcgQEAKICAgICAgKiBjb250ZXh0LgogICAgICAqLwogCi0gICAgaWYgKCFwc3AtPmR1bW15Q29udGV4dFByaXYuZHJpU2NyZWVuUHJpdikgewotICAgICAgICBwc3AtPmR1bW15Q29udGV4dFByaXYuY29udGV4dElEID0gMDsKKyAgICBpZiAoIXBzcC0+ZHJpMi5lbmFibGVkICYmICFwc3AtPmR1bW15Q29udGV4dFByaXYuZHJpU2NyZWVuUHJpdikgewogICAgICAgICBwc3AtPmR1bW15Q29udGV4dFByaXYuaEhXQ29udGV4dCA9IHBzcC0+cFNBUkVBLT5kdW1teV9jb250ZXh0OwogICAgICAgICBwc3AtPmR1bW15Q29udGV4dFByaXYuZHJpU2NyZWVuUHJpdiA9IHBzcDsKICAgICAgICAgcHNwLT5kdW1teUNvbnRleHRQcml2LmRyaURyYXdhYmxlUHJpdiA9IE5VTEw7CkBAIC04NTUsMjEgKzc3Nyw0MiBAQAogCS8qIE5vIG90aGVyIGZpZWxkcyBzaG91bGQgYmUgdXNlZCEgKi8KICAgICB9CiAKLSAgICBwY3R4LT5kZXN0cm95Q29udGV4dCA9IGRyaURlc3Ryb3lDb250ZXh0OwotICAgIHBjdHgtPmJpbmRDb250ZXh0ICAgID0gZHJpQmluZENvbnRleHQ7Ci0gICAgcGN0eC0+dW5iaW5kQ29udGV4dCAgPSBkcmlVbmJpbmRDb250ZXh0OworICAgIHBjcC0+aEhXQ29udGV4dCA9IGh3Q29udGV4dDsKIAotICAgIGlmICggISgqcHNwLT5Ecml2ZXJBUEkuQ3JlYXRlQ29udGV4dCkobW9kZXMsIHBjcCwgc2hhcmVDdHgpICkgewotICAgICAgICAodm9pZCkgKCpkcmlfaW50ZXJmYWNlLT5kZXN0cm95Q29udGV4dCkoZHB5LCBtb2Rlcy0+c2NyZWVuLAotCQkJCQkJcGNwLT5jb250ZXh0SUQpOworICAgIGlmICggISgqcHNwLT5Ecml2ZXJBUEkuQ3JlYXRlQ29udGV4dCkoJmNvbmZpZy0+bW9kZXMsIHBjcCwgc2hhcmVDdHgpICkgewogICAgICAgICBfbWVzYV9mcmVlKHBjcCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIF9fZHJpR2FyYmFnZUNvbGxlY3REcmF3YWJsZXMocGNwLT5kcmlTY3JlZW5Qcml2LT5kcmF3SGFzaCk7Ci0KICAgICByZXR1cm4gcGNwOwogfQorCisKK3N0YXRpYyBfX0RSSWNvbnRleHQgKgorZHJpMkNyZWF0ZU5ld0NvbnRleHQoX19EUklzY3JlZW4gKnNjcmVlbiwgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJICAgICAgX19EUkljb250ZXh0ICpzaGFyZWQsIHZvaWQgKmRhdGEpCit7CisgICAgZHJtX2NvbnRleHRfdCBod0NvbnRleHQ7CisgICAgRFJNX0NBU19SRVNVTFQocmV0KTsKKworICAgIC8qIERSSTIgZG9lc24ndCB1c2Uga2VybmVsIHdpdGggY29udGV4dCBJRHMsIHdlIGp1c3QgbmVlZCBhbiBJRCB0aGF0J3MKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUga2VybmVsIGNvbnRleHQgSUQgdG8gbWFrZSBkcm1Mb2NrKCkgaGFwcHkuICovCisKKyAgICBkbyB7CisJaHdDb250ZXh0ID0gc2NyZWVuLT5kcmkyLmxvY2stPm5leHRfaWQ7CisJRFJNX0NBUygmc2NyZWVuLT5kcmkyLmxvY2stPm5leHRfaWQsIGh3Q29udGV4dCwgaHdDb250ZXh0ICsgMSwgcmV0KTsKKyAgICB9IHdoaWxlIChyZXQpOworCisgICAgcmV0dXJuIGRyaUNyZWF0ZU5ld0NvbnRleHQoc2NyZWVuLCBjb25maWcsIDAsIHNoYXJlZCwgaHdDb250ZXh0LCBkYXRhKTsKK30KKworCitzdGF0aWMgaW50CitkcmlDb3B5Q29udGV4dChfX0RSSWNvbnRleHQgKmRlc3QsIF9fRFJJY29udGV4dCAqc3JjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisgICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCiAvKkB9Ki8KIAogCkBAIC04ODEsMTggKzgyNCwxMiBAQAogLyoqCiAgKiBEZXN0cm95IHRoZSBwZXItc2NyZWVuIHByaXZhdGUgaW5mb3JtYXRpb24uCiAgKiAKLSAqIFxwYXJhbSBkcHkgdGhlIGRpc3BsYXkgaGFuZGxlLgotICogXHBhcmFtIHNjcm4gdGhlIHNjcmVlbiBudW1iZXIuCi0gKiBccGFyYW0gc2NyZWVuUHJpdmF0ZSBvcGFxdWUgcG9pbnRlciB0byB0aGUgcGVyLXNjcmVlbiBwcml2YXRlIGluZm9ybWF0aW9uLgotICoKICAqIFxpbnRlcm5hbAogICogVGhpcyBmdW5jdGlvbiBjYWxscyBfX0RyaXZlckFQSVJlYzo6RGVzdHJveVNjcmVlbiBvbiBccCBzY3JlZW5Qcml2YXRlLCBjYWxscwogICogZHJtQ2xvc2UoKSwgYW5kIGZpbmFsbHkgZnJlZXMgXHAgc2NyZWVuUHJpdmF0ZS4KICAqLwotc3RhdGljIHZvaWQgZHJpRGVzdHJveVNjcmVlbihfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIHZvaWQgKnNjcmVlblByaXZhdGUpCitzdGF0aWMgdm9pZCBkcmlEZXN0cm95U2NyZWVuKF9fRFJJc2NyZWVuICpwc3ApCiB7Ci0gICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSAoX19EUklzY3JlZW5Qcml2YXRlICopIHNjcmVlblByaXZhdGU7Ci0KICAgICBpZiAocHNwKSB7CiAJLyogTm8gaW50ZXJhY3Rpb24gd2l0aCB0aGUgWC1zZXJ2ZXIgaXMgcG9zc2libGUgYXQgdGhpcyBwb2ludC4gIFRoaXMKIAkgKiByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBYQ2xvc2VEaXNwbGF5LCBzbyB0aGVyZSBpcyBubyBwcm90b2NvbApAQCAtOTAyLDM0ICs4MzksNDkgQEAKIAlpZiAocHNwLT5Ecml2ZXJBUEkuRGVzdHJveVNjcmVlbikKIAkgICAgKCpwc3AtPkRyaXZlckFQSS5EZXN0cm95U2NyZWVuKShwc3ApOwogCi0JKHZvaWQpZHJtVW5tYXAoKGRybUFkZHJlc3MpcHNwLT5wU0FSRUEsIFNBUkVBX01BWCk7Ci0JKHZvaWQpZHJtVW5tYXAoKGRybUFkZHJlc3MpcHNwLT5wRkIsIHBzcC0+ZmJTaXplKTsKLQlfbWVzYV9mcmVlKHBzcC0+cERldlByaXYpOwotCSh2b2lkKWRybUNsb3NlT25jZShwc3AtPmZkKTsKLQlpZiAoIHBzcC0+bW9kZXMgIT0gTlVMTCApIHsKLQkgICAgKCpkcmlfaW50ZXJmYWNlLT5kZXN0cm95Q29udGV4dE1vZGVzKSggcHNwLT5tb2RlcyApOworCWlmIChwc3AtPmRyaTIuZW5hYmxlZCkgeworI2lmZGVmIFRUTV9BUEkKKwkgICAgZHJtQk9Vbm1hcChwc3AtPmZkLCAmcHNwLT5kcmkyLnNhcmVhQk8pOworCSAgICBkcm1CT1VucmVmZXJlbmNlKHBzcC0+ZmQsICZwc3AtPmRyaTIuc2FyZWFCTyk7CisjZW5kaWYKKwl9IGVsc2UgeworCSAgICh2b2lkKWRybVVubWFwKChkcm1BZGRyZXNzKXBzcC0+cFNBUkVBLCBTQVJFQV9NQVgpOworCSAgICh2b2lkKWRybVVubWFwKChkcm1BZGRyZXNzKXBzcC0+cEZCLCBwc3AtPmZiU2l6ZSk7CisJICAgKHZvaWQpZHJtQ2xvc2VPbmNlKHBzcC0+ZmQpOwogCX0KIAotCWFzc2VydChwc3AtPmRyYXdIYXNoKTsKLQlkcm1IYXNoRGVzdHJveShwc3AtPmRyYXdIYXNoKTsKLQogCV9tZXNhX2ZyZWUocHNwKTsKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkCitzZXR1cExvYWRlckV4dGVuc2lvbnMoX19EUklzY3JlZW4gKnBzcCwKKwkJICAgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZXh0ZW5zaW9uc1tpXTsgaSsrKSB7CisJaWYgKHN0cmNtcChleHRlbnNpb25zW2ldLT5uYW1lLCBfX0RSSV9HRVRfRFJBV0FCTEVfSU5GTykgPT0gMCkKKwkgICAgcHNwLT5nZXREcmF3YWJsZUluZm8gPSAoX19EUklnZXREcmF3YWJsZUluZm9FeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX0RBTUFHRSkgPT0gMCkKKwkgICAgcHNwLT5kYW1hZ2UgPSAoX19EUklkYW1hZ2VFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKwlpZiAoc3RyY21wKGV4dGVuc2lvbnNbaV0tPm5hbWUsIF9fRFJJX1NZU1RFTV9USU1FKSA9PSAwKQorCSAgICBwc3AtPnN5c3RlbVRpbWUgPSAoX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uICopIGV4dGVuc2lvbnNbaV07CisJaWYgKHN0cmNtcChleHRlbnNpb25zW2ldLT5uYW1lLCBfX0RSSV9MT0FERVIpID09IDApCisJICAgIHBzcC0+ZHJpMi5sb2FkZXIgPSAoX19EUklsb2FkZXJFeHRlbnNpb24gKikgZXh0ZW5zaW9uc1tpXTsKKyAgICB9Cit9CiAKIC8qKgotICogVXRpbGl0eSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBkcml2ZXItcHJpdmF0ZSBzY3JlZW4gc3RydWN0dXJlLgorICogVGhpcyBpcyB0aGUgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciB0aGUgZHJpdmVyLiAgbGliR0wgc3VwcGxpZXMgYWxsIG9mIHRoZQorICogcmVxdWlzaXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0sIGFuZCB0aGUgZHJpdmVyIGluaXRpYWxpemVzIGl0c2VsZi4KKyAqIFRoaXMgcm91dGluZSBhbHNvIGZpbGxzIGluIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVkIHRvIGJ5IFxjIGRyaXZlcl9tb2RlcworICogd2l0aCB0aGUgXGMgX19HTGNvbnRleHRNb2RlcyB0aGF0IHRoZSBkcml2ZXIgY2FuIHN1cHBvcnQgZm9yIHdpbmRvd3Mgb3IKKyAqIHBidWZmZXJzLgorICoKKyAqIEZvciBsZWdhY3kgRFJJLgogICogCi0gKiBccGFyYW0gZHB5ICAgRGlzcGxheSBwb2ludGVyCiAgKiBccGFyYW0gc2NybiAgSW5kZXggb2YgdGhlIHNjcmVlbgotICogXHBhcmFtIHBzYyAgIERSSSBzY3JlZW4gZGF0YSAobm90IGRyaXZlciBwcml2YXRlKQotICogXHBhcmFtIG1vZGVzIExpbmtlZCBsaXN0IG9mIGtub3duIGRpc3BsYXkgbW9kZXMuICBUaGlzIGxpc3QgaXMsIGF0IGEKLSAqICAgICAgICAgICAgICBtaW5pbXVtLCBhIGxpc3Qgb2YgbW9kZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGlzcGxheSBtb2RlLgotICogICAgICAgICAgICAgIFRoZXNlIHJvdWdobHkgbWF0Y2ggdGhlIHNldCBvZiBhdmFpbGFibGUgWDExIHZpc3VhbHMsIGJ1dCBpdAotICogICAgICAgICAgICAgIG5lZWQgbm90IGJlIGxpbWl0ZWQgdG8gWDExISAgVGhlIGNhbGxpbmcgbGliR0wgc2hvdWxkIGNyZWF0ZQotICogICAgICAgICAgICAgIGEgbGlzdCB0aGF0IHdpbGwgaW5mb3JtIHRoZSBkcml2ZXIgb2YgdGhlIGN1cnJlbnQgZGlzcGxheQotICogICAgICAgICAgICAgIG1vZGUgKGkuZS4sIGNvbG9yIGJ1ZmZlciBkZXB0aCwgZGVwdGggYnVmZmVyIGRlcHRoLCBldGMuKS4KICAqIFxwYXJhbSBkZHhfdmVyc2lvbiBWZXJzaW9uIG9mIHRoZSAyRCBERFguICBUaGlzIG1heSBub3QgYmUgbWVhbmluZ2Z1bCBmb3IKICAqICAgICAgICAgICAgICAgICAgICBhbGwgZHJpdmVycy4KICAqIFxwYXJhbSBkcmlfdmVyc2lvbiBWZXJzaW9uIG9mIHRoZSAic2VydmVyLXNpZGUiIERSSS4KQEAgLTkzOCw0OCArODkwLDMzIEBACiAgKiAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLgogICogXHBhcmFtIHBTQVJFQSAgICAgICBQb2ludGVyIHRoZSB0aGUgU0FSRUEuCiAgKiBccGFyYW0gZmQgICAgICAgICAgIERldmljZSBoYW5kbGUgZm9yIHRoZSBEUk0uCi0gKiBccGFyYW0gaW50ZXJuYWxfYXBpX3ZlcnNpb24gIFZlcnNpb24gb2YgdGhlIGludGVybmFsIGludGVyZmFjZSBiZXR3ZWVuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgYW5kIGxpYkdMLgotICogXHBhcmFtIGRyaXZlckFQSSBEcml2ZXIgQVBJIGZ1bmN0aW9ucyB1c2VkIGJ5IG90aGVyIHJvdXRpbmVzIGluIGRyaV91dGlsLmMuCisgKiBccGFyYW0gZXh0ZW5zaW9ucyAgID8/CisgKiBccGFyYW0gZHJpdmVyX21vZGVzICBSZXR1cm5zIG1vZGVzIHN1cHBvdGVkIGJ5IHRoZSBkcml2ZXIKKyAqIFxwYXJhbSBsb2FkZXJQcml2YXRlICA/PwogICogCi0gKiBcbm90ZQotICogVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGUgbWluaW11bSBBUEkgdmVyc2lvbiBpbiB0aGlzIGZ1bmN0aW9uLiAgU2luY2UKLSAqIHRoZSBcYyBfX2RyaUNyZWF0ZU5ld1NjcmVlbiBmdW5jdGlvbiBpcyB2ZXJzaW9uZWQsIGl0IGlzIGltcG9zc2libGUgZm9yIGEKLSAqIGxvYWRlciB0aGF0IGlzIHRvbyBvbGQgdG8gZXZlbiBsb2FkIHRoaXMgZHJpdmVyLgorICogXG5vdGUgVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGUgbWluaW11bSBBUEkgdmVyc2lvbiBpbiB0aGlzCisgKiBmdW5jdGlvbi4gIFNpbmNlIHRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVyc2lvbmVkLCBpdCBpcworICogaW1wb3NzaWJsZSBmb3IgYSBsb2FkZXIgdGhhdCBpcyB0b28gb2xkIHRvIGV2ZW4gbG9hZCB0aGlzIGRyaXZlci4KICAqLwotX19EUklzY3JlZW5Qcml2YXRlICoKLV9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIF9fRFJJc2NyZWVuICpwc2MsCi0JCQkgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotCQkJIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRkeF92ZXJzaW9uLAotCQkJIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRyaV92ZXJzaW9uLAotCQkJIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLAotCQkJIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKiBmcmFtZV9idWZmZXIsCi0JCQkgZHJtX3NhcmVhX3QgKnBTQVJFQSwKLQkJCSBpbnQgZmQsCi0JCQkgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotCQkJIGNvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyAqZHJpdmVyQVBJKQorc3RhdGljIF9fRFJJc2NyZWVuICoKK2RyaUNyZWF0ZU5ld1NjcmVlbihpbnQgc2NybiwKKwkJICAgY29uc3QgX19EUkl2ZXJzaW9uICpkZHhfdmVyc2lvbiwKKwkJICAgY29uc3QgX19EUkl2ZXJzaW9uICpkcmlfdmVyc2lvbiwKKwkJICAgY29uc3QgX19EUkl2ZXJzaW9uICpkcm1fdmVyc2lvbiwKKwkJICAgY29uc3QgX19EUklmcmFtZWJ1ZmZlciAqZnJhbWVfYnVmZmVyLAorCQkgICBkcm1BZGRyZXNzIHBTQVJFQSwgaW50IGZkLCAKKwkJICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJfbW9kZXMsCisJCSAgIHZvaWQgKmxvYWRlclByaXZhdGUpCiB7Ci0gICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7CisgICAgc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICplbXB0eUV4dGVuc2lvbkxpc3RbXSA9IHsgTlVMTCB9OworICAgIF9fRFJJc2NyZWVuICpwc3A7CiAKLQotICAgIGFwaV92ZXIgPSBpbnRlcm5hbF9hcGlfdmVyc2lvbjsKLQotICAgIHBzcCA9IChfX0RSSXNjcmVlblByaXZhdGUgKilfbWVzYV9tYWxsb2Moc2l6ZW9mKF9fRFJJc2NyZWVuUHJpdmF0ZSkpOwotICAgIGlmICghcHNwKSB7CisgICAgcHNwID0gX21lc2FfbWFsbG9jKHNpemVvZiAqcHNwKTsKKyAgICBpZiAoIXBzcCkKIAlyZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICAvKiBDcmVhdGUgdGhlIGhhc2ggdGFibGUgKi8KLSAgICBwc3AtPmRyYXdIYXNoID0gZHJtSGFzaENyZWF0ZSgpOwotICAgIGlmICggcHNwLT5kcmF3SGFzaCA9PSBOVUxMICkgewotCV9tZXNhX2ZyZWUoIHBzcCApOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHBzcC0+ZGlzcGxheSA9IGRweTsKLSAgICBwc3AtPm15TnVtID0gc2NybjsKLSAgICBwc3AtPnBzYyA9IHBzYzsKLSAgICBwc3AtPm1vZGVzID0gbW9kZXM7CisgICAgc2V0dXBMb2FkZXJFeHRlbnNpb25zKHBzcCwgZXh0ZW5zaW9ucyk7CiAKICAgICAvKgogICAgICoqIE5PVF9ET05FOiBUaGlzIGlzIHVzZWQgYnkgdGhlIFggc2VydmVyIHRvIGRldGVjdCB3aGVuIHRoZSBjbGllbnQKQEAgLTk4OCwyMCArOTI1LDEyIEBACiAgICAgKi8KICAgICBwc3AtPmRyYXdMb2NrSUQgPSAxOwogCi0gICAgcHNwLT5kcm1NYWpvciA9IGRybV92ZXJzaW9uLT5tYWpvcjsKLSAgICBwc3AtPmRybU1pbm9yID0gZHJtX3ZlcnNpb24tPm1pbm9yOwotICAgIHBzcC0+ZHJtUGF0Y2ggPSBkcm1fdmVyc2lvbi0+cGF0Y2g7Ci0gICAgcHNwLT5kZHhNYWpvciA9IGRkeF92ZXJzaW9uLT5tYWpvcjsKLSAgICBwc3AtPmRkeE1pbm9yID0gZGR4X3ZlcnNpb24tPm1pbm9yOwotICAgIHBzcC0+ZGR4UGF0Y2ggPSBkZHhfdmVyc2lvbi0+cGF0Y2g7Ci0gICAgcHNwLT5kcmlNYWpvciA9IGRyaV92ZXJzaW9uLT5tYWpvcjsKLSAgICBwc3AtPmRyaU1pbm9yID0gZHJpX3ZlcnNpb24tPm1pbm9yOwotICAgIHBzcC0+ZHJpUGF0Y2ggPSBkcmlfdmVyc2lvbi0+cGF0Y2g7Ci0KLSAgICAvKiBpbnN0YWxsIGRyaXZlcidzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotICAgIG1lbWNweSggJnBzcC0+RHJpdmVyQVBJLCBkcml2ZXJBUEksIHNpemVvZihzdHJ1Y3QgX19Ecml2ZXJBUElSZWMpICk7CisgICAgcHNwLT5kcm1fdmVyc2lvbiA9ICpkcm1fdmVyc2lvbjsKKyAgICBwc3AtPmRkeF92ZXJzaW9uID0gKmRkeF92ZXJzaW9uOworICAgIHBzcC0+ZHJpX3ZlcnNpb24gPSAqZHJpX3ZlcnNpb247CiAKICAgICBwc3AtPnBTQVJFQSA9IHBTQVJFQTsKKyAgICBwc3AtPmxvY2sgPSAoZHJtTG9jayAqKSAmcHNwLT5wU0FSRUEtPmxvY2s7CiAKICAgICBwc3AtPnBGQiA9IGZyYW1lX2J1ZmZlci0+YmFzZTsKICAgICBwc3AtPmZiU2l6ZSA9IGZyYW1lX2J1ZmZlci0+c2l6ZTsKQEAgLTEwMTIsNyArOTQxLDEwIEBACiAgICAgcHNwLT5wRGV2UHJpdiA9IGZyYW1lX2J1ZmZlci0+ZGV2X3ByaXY7CiAgICAgcHNwLT5mYkJQUCA9IHBzcC0+ZmJTdHJpZGUgKiA4IC8gZnJhbWVfYnVmZmVyLT53aWR0aDsKIAorICAgIHBzcC0+ZXh0ZW5zaW9ucyA9IGVtcHR5RXh0ZW5zaW9uTGlzdDsKICAgICBwc3AtPmZkID0gZmQ7CisgICAgcHNwLT5teU51bSA9IHNjcm47CisgICAgcHNwLT5kcmkyLmVuYWJsZWQgPSBHTF9GQUxTRTsKIAogICAgIC8qCiAgICAgKiogRG8gbm90IGluaXQgZHVtbXkgY29udGV4dCBoZXJlOyBhY3R1YWwgaW5pdGlhbGl6YXRpb24gd2lsbCBiZQpAQCAtMTAyMSw2MyArOTUzLDE1MiBAQAogICAgICovCiAgICAgcHNwLT5kdW1teUNvbnRleHRQcml2LmRyaVNjcmVlblByaXYgPSBOVUxMOwogCi0gICAgcHNjLT5kZXN0cm95U2NyZWVuICAgICA9IGRyaURlc3Ryb3lTY3JlZW47Ci0gICAgcHNjLT5jcmVhdGVOZXdEcmF3YWJsZSA9IGRyaUNyZWF0ZU5ld0RyYXdhYmxlOwotICAgIHBzYy0+Z2V0RHJhd2FibGUgICAgICAgPSBkcmlHZXREcmF3YWJsZTsKLSAgICBwc2MtPmdldE1TQyAgICAgICAgICAgID0gZHJpR2V0TVNDOwotICAgIHBzYy0+Y3JlYXRlTmV3Q29udGV4dCAgPSBkcmlDcmVhdGVOZXdDb250ZXh0OworICAgIHBzcC0+RHJpdmVyQVBJID0gZHJpRHJpdmVyQVBJOwogCi0gICAgaWYgKGludGVybmFsX2FwaV92ZXJzaW9uID49IDIwMDcwMTIxKQotCXBzYy0+c2V0VGV4T2Zmc2V0ICA9IHBzcC0+RHJpdmVyQVBJLnNldFRleE9mZnNldDsKLQotICAgIGlmICggKHBzcC0+RHJpdmVyQVBJLkluaXREcml2ZXIgIT0gTlVMTCkKLQkgJiYgISgqcHNwLT5Ecml2ZXJBUEkuSW5pdERyaXZlcikocHNwKSApIHsKLQlfbWVzYV9mcmVlKCBwc3AgKTsKKyAgICAqZHJpdmVyX21vZGVzID0gZHJpRHJpdmVyQVBJLkluaXRTY3JlZW4ocHNwKTsKKyAgICBpZiAoKmRyaXZlcl9tb2RlcyA9PSBOVUxMKSB7CisJX21lc2FfZnJlZShwc3ApOwogCXJldHVybiBOVUxMOwogICAgIH0KIAotCiAgICAgcmV0dXJuIHBzcDsKIH0KIAogCiAvKioKLSAqIENvbXBhcmUgdGhlIGN1cnJlbnQgR0xYIEFQSSB2ZXJzaW9uIHdpdGggYSBkcml2ZXIgc3VwcGxpZWQgcmVxdWlyZWQgdmVyc2lvbi4KLSAqIAotICogVGhlIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBpcyBjb21wYXJlZCB3aXRoIHRoZSBBUEkgdmVyc2lvbiBleHBvcnRlZCBieQotICogdGhlIFxjIF9fZ2xYR2V0SW50ZXJuYWxWZXJzaW9uIGZ1bmN0aW9uIChpbiBsaWJHTC5zbykuCi0gKiAKLSAqIFxwYXJhbSAgIHJlcXVpcmVkX3ZlcnNpb24gTWluaW11bSByZXF1aXJlZCBpbnRlcm5hbCBHTFggQVBJIHZlcnNpb24uCi0gKiBccmV0dXJuICBBIHRyaS12YWx1ZSByZXR1cm4sIGFzIGZyb20gc3RyY21wIGlzIHJldHVybmVkLiAgQSB2YWx1ZSBsZXNzCi0gKiAgICAgICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUKLSAqICAgICAgICAgIGludGVybmFsIEdMWCBBUEkgdmVyc2lvbiBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyCi0gKiAgICAgICAgICB0aGFuIFxjIHJlcXVpcmVkX3ZlcnNpb24uCi0gKgotICogXHNhIF9fZ2xYR2V0SW50ZXJuYWxWZXJzaW9uKCkuCisgKiBEUkkyCiAgKi8KLWludCBkcmlDb21wYXJlR0xYQVBJVmVyc2lvbiggR0xpbnQgcmVxdWlyZWRfdmVyc2lvbiApCitzdGF0aWMgX19EUklzY3JlZW4gKgorZHJpMkNyZWF0ZU5ld1NjcmVlbihpbnQgc2NybiwgaW50IGZkLCB1bnNpZ25lZCBpbnQgc2FyZWFfaGFuZGxlLAorCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkgICAgY29uc3QgX19EUkljb25maWcgKioqZHJpdmVyX2NvbmZpZ3MsIHZvaWQgKmRhdGEpCiB7Ci0gICBpZiAoIGFwaV92ZXIgPiByZXF1aXJlZF92ZXJzaW9uICkgewotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICBlbHNlIGlmICggYXBpX3ZlciA9PSByZXF1aXJlZF92ZXJzaW9uICkgewotICAgICAgcmV0dXJuIDA7Ci0gICB9CisjaWZkZWYgVFRNX0FQSQorICAgIHN0YXRpYyBjb25zdCBfX0RSSWV4dGVuc2lvbiAqZW1wdHlFeHRlbnNpb25MaXN0W10gPSB7IE5VTEwgfTsKKyAgICBfX0RSSXNjcmVlbiAqcHNwOworICAgIHVuc2lnbmVkIGludCAqcDsKKyAgICBkcm1WZXJzaW9uUHRyIHZlcnNpb247CiAKLSAgIHJldHVybiAtMTsKKyAgICBpZiAoZHJpRHJpdmVyQVBJLkluaXRTY3JlZW4yID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcHNwID0gX21lc2FfbWFsbG9jKHNpemVvZigqcHNwKSk7CisgICAgaWYgKCFwc3ApCisJcmV0dXJuIE5VTEw7CisKKyAgICBzZXR1cExvYWRlckV4dGVuc2lvbnMocHNwLCBleHRlbnNpb25zKTsKKworICAgIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGZkKTsKKyAgICBpZiAodmVyc2lvbikgeworCXBzcC0+ZHJtX3ZlcnNpb24ubWFqb3IgPSB2ZXJzaW9uLT52ZXJzaW9uX21ham9yOworCXBzcC0+ZHJtX3ZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yOworCXBzcC0+ZHJtX3ZlcnNpb24ucGF0Y2ggPSB2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWw7CisJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisgICAgfQorCisgICAgcHNwLT5leHRlbnNpb25zID0gZW1wdHlFeHRlbnNpb25MaXN0OworICAgIHBzcC0+ZmQgPSBmZDsKKyAgICBwc3AtPm15TnVtID0gc2NybjsKKyAgICBwc3AtPmRyaTIuZW5hYmxlZCA9IEdMX1RSVUU7CisKKyAgICBpZiAoZHJtQk9SZWZlcmVuY2UocHNwLT5mZCwgc2FyZWFfaGFuZGxlLCAmcHNwLT5kcmkyLnNhcmVhQk8pKSB7CisJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVmZXJlbmNlIERSSTIgc2FyZWEgQk9cbiIpOworCV9tZXNhX2ZyZWUocHNwKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZHJtQk9NYXAocHNwLT5mZCwgJnBzcC0+ZHJpMi5zYXJlYUJPLAorCQkgRFJNX0JPX0ZMQUdfUkVBRCB8IERSTV9CT19GTEFHX1dSSVRFLCAwLCAmcHNwLT5kcmkyLnNhcmVhKSkgeworCWRybUJPVW5yZWZlcmVuY2UocHNwLT5mZCwgJnBzcC0+ZHJpMi5zYXJlYUJPKTsKKwlfbWVzYV9mcmVlKHBzcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcCA9IHBzcC0+ZHJpMi5zYXJlYTsKKyAgICB3aGlsZSAoRFJJMl9TQVJFQV9CTE9DS19UWVBFKCpwKSkgeworCXN3aXRjaCAoRFJJMl9TQVJFQV9CTE9DS19UWVBFKCpwKSkgeworCWNhc2UgRFJJMl9TQVJFQV9CTE9DS19MT0NLOgorCSAgICBwc3AtPmRyaTIubG9jayA9IChfX0RSSUxvY2sgKikgcDsKKwkgICAgYnJlYWs7CisJY2FzZSBEUkkyX1NBUkVBX0JMT0NLX0VWRU5UX0JVRkZFUjoKKwkgICAgcHNwLT5kcmkyLmJ1ZmZlciA9IChfX0RSSUV2ZW50QnVmZmVyICopIHA7CisJICAgIGJyZWFrOworCX0KKwlwID0gRFJJMl9TQVJFQV9CTE9DS19ORVhUKHApOworICAgIH0KKworICAgIHBzcC0+bG9jayA9IChkcm1Mb2NrICopICZwc3AtPmRyaTIubG9jay0+bG9jazsKKworICAgIHBzcC0+RHJpdmVyQVBJID0gZHJpRHJpdmVyQVBJOworICAgICpkcml2ZXJfY29uZmlncyA9IGRyaURyaXZlckFQSS5Jbml0U2NyZWVuMihwc3ApOworICAgIGlmICgqZHJpdmVyX2NvbmZpZ3MgPT0gTlVMTCkgeworCWRybUJPVW5tYXAocHNwLT5mZCwgJnBzcC0+ZHJpMi5zYXJlYUJPKTsKKwlkcm1CT1VucmVmZXJlbmNlKHBzcC0+ZmQsICZwc3AtPmRyaTIuc2FyZWFCTyk7CisJX21lc2FfZnJlZShwc3ApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHBzcC0+RHJpdmVyQVBJID0gZHJpRHJpdmVyQVBJOworCisgICAgcmV0dXJuIHBzcDsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKIH0KIAorc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZHJpR2V0RXh0ZW5zaW9ucyhfX0RSSXNjcmVlbiAqcHNwKQoreworICAgIHJldHVybiBwc3AtPmV4dGVuc2lvbnM7Cit9CisKKy8qKiBMZWdhY3kgRFJJIGludGVyZmFjZSAqLworY29uc3QgX19EUklsZWdhY3lFeHRlbnNpb24gZHJpTGVnYWN5RXh0ZW5zaW9uID0geworICAgIHsgX19EUklfTEVHQUNZLCBfX0RSSV9MRUdBQ1lfVkVSU0lPTiB9LAorICAgIGRyaUNyZWF0ZU5ld1NjcmVlbiwKKyAgICBkcmlDcmVhdGVOZXdEcmF3YWJsZSwKKyAgICBkcmlDcmVhdGVOZXdDb250ZXh0Cit9OworCisvKiogRFJJMiBpbnRlcmZhY2UgKi8KK2NvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiBkcmlDb3JlRXh0ZW5zaW9uID0geworICAgIHsgX19EUklfQ09SRSwgX19EUklfQ09SRV9WRVJTSU9OIH0sCisgICAgZHJpMkNyZWF0ZU5ld1NjcmVlbiwKKyAgICBkcmlEZXN0cm95U2NyZWVuLAorICAgIGRyaUdldEV4dGVuc2lvbnMsCisgICAgZHJpR2V0Q29uZmlnQXR0cmliLAorICAgIGRyaUluZGV4Q29uZmlnQXR0cmliLAorICAgIGRyaTJDcmVhdGVOZXdEcmF3YWJsZSwKKyAgICBkcmlEZXN0cm95RHJhd2FibGUsCisgICAgZHJpU3dhcEJ1ZmZlcnMsCisgICAgZHJpMkNyZWF0ZU5ld0NvbnRleHQsCisgICAgZHJpQ29weUNvbnRleHQsCisgICAgZHJpRGVzdHJveUNvbnRleHQsCisgICAgZHJpQmluZENvbnRleHQsCisgICAgZHJpVW5iaW5kQ29udGV4dAorfTsKKworLyogVGhpcyBpcyB0aGUgdGFibGUgb2YgZXh0ZW5zaW9ucyB0aGF0IHRoZSBsb2FkZXIgd2lsbCBkbHN5bSgpIGZvci4gKi8KK1BVQkxJQyBjb25zdCBfX0RSSWV4dGVuc2lvbiAqX19kcmlEcml2ZXJFeHRlbnNpb25zW10gPSB7CisgICAgJmRyaUNvcmVFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpTGVnYWN5RXh0ZW5zaW9uLmJhc2UsCisgICAgTlVMTAorfTsKIAogc3RhdGljIGludAotZHJpUXVlcnlGcmFtZVRyYWNraW5nKCBfX0RSSW5hdGl2ZURpc3BsYXkgKiBkcHksIHZvaWQgKiBwcml2LAotCQkgICAgICAgaW50NjRfdCAqIHNiYywgaW50NjRfdCAqIG1pc3NlZEZyYW1lcywKLQkJICAgICAgIGZsb2F0ICogbGFzdE1pc3NlZFVzYWdlLCBmbG9hdCAqIHVzYWdlICkKK2RyaUZyYW1lVHJhY2tpbmcoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIEdMYm9vbGVhbiBlbmFibGUpCit7CisgICAgcmV0dXJuIEdMWF9CQURfQ09OVEVYVDsKK30KKworc3RhdGljIGludAorZHJpUXVlcnlGcmFtZVRyYWNraW5nKF9fRFJJZHJhd2FibGUgKmRwcml2LAorCQkgICAgICBpbnQ2NF90ICogc2JjLCBpbnQ2NF90ICogbWlzc2VkRnJhbWVzLAorCQkgICAgICBmbG9hdCAqIGxhc3RNaXNzZWRVc2FnZSwgZmxvYXQgKiB1c2FnZSkKIHsKICAgIF9fRFJJc3dhcEluZm8gICBzSW5mbzsKICAgIGludCAgICAgICAgICAgICBzdGF0dXM7CiAgICBpbnQ2NF90ICAgICAgICAgdXN0OwotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKiBkcHJpdiA9IChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqKSBwcml2OwotCisgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IGRwcml2LT5kcmlTY3JlZW5Qcml2OwogCiAgICBzdGF0dXMgPSBkcHJpdi0+ZHJpU2NyZWVuUHJpdi0+RHJpdmVyQVBJLkdldFN3YXBJbmZvKCBkcHJpdiwgJiBzSW5mbyApOwogICAgaWYgKCBzdGF0dXMgPT0gMCApIHsKQEAgLTEwODUsMTMgKzExMDYsMTggQEAKICAgICAgICptaXNzZWRGcmFtZXMgPSBzSW5mby5zd2FwX21pc3NlZF9jb3VudDsKICAgICAgICpsYXN0TWlzc2VkVXNhZ2UgPSBzSW5mby5zd2FwX21pc3NlZF91c2FnZTsKIAotICAgICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmIHVzdCApOworICAgICAgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkoICYgdXN0ICk7CiAgICAgICAqdXNhZ2UgPSBkcmlDYWxjdWxhdGVTd2FwVXNhZ2UoIGRwcml2LCBzSW5mby5zd2FwX3VzdCwgdXN0ICk7CiAgICB9CiAKICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK2NvbnN0IF9fRFJJZnJhbWVUcmFja2luZ0V4dGVuc2lvbiBkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uID0geworICAgIHsgX19EUklfRlJBTUVfVFJBQ0tJTkcsIF9fRFJJX0ZSQU1FX1RSQUNLSU5HX1ZFUlNJT04gfSwKKyAgICBkcmlGcmFtZVRyYWNraW5nLAorICAgIGRyaVF1ZXJ5RnJhbWVUcmFja2luZyAgICAKK307CiAKIC8qKgogICogQ2FsY3VsYXRlIGFtb3VudCBvZiBzd2FwIGludGVydmFsIHVzZWQgYmV0d2VlbiBHTFggYnVmZmVyIHN3YXBzLgpAQCAtMTEyOSwxMSArMTE1NSwxMCBAQAogICAgaW50MzJfdCAgIGQ7CiAgICBpbnQgICAgICAgaW50ZXJ2YWw7CiAgICBmbG9hdCAgICAgdXNhZ2UgPSAxLjA7CisgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IGRQcml2LT5kcmlTY3JlZW5Qcml2OwogCi0KLSAgIGlmICggKCpkcmlfaW50ZXJmYWNlLT5nZXRNU0NSYXRlKSggZFByaXYtPmRpc3BsYXksIGRQcml2LT5kcmF3LCAmbiwgJmQgKSApIHsKLSAgICAgIGludGVydmFsID0gKGRQcml2LT5wZHJhdy0+c3dhcF9pbnRlcnZhbCAhPSAwKQotCSAgPyBkUHJpdi0+cGRyYXctPnN3YXBfaW50ZXJ2YWwgOiAxOworICAgaWYgKCAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0TVNDUmF0ZSkoZFByaXYsICZuLCAmZCwgZFByaXYtPmxvYWRlclByaXZhdGUpICkgeworICAgICAgaW50ZXJ2YWwgPSAoZFByaXYtPnN3YXBfaW50ZXJ2YWwgIT0gMCkgPyBkUHJpdi0+c3dhcF9pbnRlcnZhbCA6IDE7CiAKIAogICAgICAgLyogV2Ugd2FudCB0byBjYWxjdWxhdGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9kcmlfdXRpbC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RyaV91dGlsLmgKaW5kZXggYzBjZGE1ZC4uYWJkMTQ4MiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RyaV91dGlsLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2RyaV91dGlsLmgKQEAgLTQ4LDIxICs0OCwzMyBAQAogI2RlZmluZSBfRFJJX1VUSUxfSF8KIAogI2luY2x1ZGUgPEdML2dsLmg+Ci0jaW5jbHVkZSAiZHJtLmgiCi0jaW5jbHVkZSAiZHJtX3NhcmVhLmgiCi0jaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgPGRybS5oPgorI2luY2x1ZGUgPGRybV9zYXJlYS5oPgorI2luY2x1ZGUgPHhmODZkcm0uaD4KKyNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgIkdML2ludGVybmFsL2dsY29yZS5oIgogI2luY2x1ZGUgIkdML2ludGVybmFsL2RyaV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJHTC9pbnRlcm5hbC9kcmlfc2FyZWEuaCIKIAogI2RlZmluZSBHTFhfQkFEX0NPTlRFWFQgICAgICAgICAgICAgICAgICAgIDUKIAotdHlwZWRlZiBzdHJ1Y3QgX19EUklkaXNwbGF5UHJpdmF0ZVJlYyAgX19EUklkaXNwbGF5UHJpdmF0ZTsKLXR5cGVkZWYgc3RydWN0IF9fRFJJc2NyZWVuUHJpdmF0ZVJlYyAgIF9fRFJJc2NyZWVuUHJpdmF0ZTsKLXR5cGVkZWYgc3RydWN0IF9fRFJJY29udGV4dFByaXZhdGVSZWMgIF9fRFJJY29udGV4dFByaXZhdGU7Ci10eXBlZGVmIHN0cnVjdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZVJlYyBfX0RSSWRyYXdhYmxlUHJpdmF0ZTsKIHR5cGVkZWYgc3RydWN0IF9fRFJJc3dhcEluZm9SZWMgICAgICAgIF9fRFJJc3dhcEluZm87Ci10eXBlZGVmIHN0cnVjdCBfX0RSSXV0aWx2ZXJzaW9uUmVjMiAgICBfX0RSSXV0aWx2ZXJzaW9uMjsKIAorLyogVHlwZWRlZnMgdG8gYXZvaWQgcmV3cml0aW5nIHRoZSB3b3JsZC4gKi8KK3R5cGVkZWYgc3RydWN0IF9fRFJJc2NyZWVuUmVjCV9fRFJJc2NyZWVuUHJpdmF0ZTsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZHJhd2FibGVSZWMJX19EUklkcmF3YWJsZVByaXZhdGU7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWNvbnRleHRSZWMJX19EUkljb250ZXh0UHJpdmF0ZTsKKworLyoqCisgKiBFeHRlbnNpb25zLgorICovCitleHRlcm4gY29uc3QgX19EUklsZWdhY3lFeHRlbnNpb24gZHJpTGVnYWN5RXh0ZW5zaW9uOworZXh0ZXJuIGNvbnN0IF9fRFJJY29yZUV4dGVuc2lvbiBkcmlDb3JlRXh0ZW5zaW9uOworZXh0ZXJuIGNvbnN0IF9fRFJJZXh0ZW5zaW9uIGRyaVJlYWREcmF3YWJsZUV4dGVuc2lvbjsKK2V4dGVybiBjb25zdCBfX0RSSWNvcHlTdWJCdWZmZXJFeHRlbnNpb24gZHJpQ29weVN1YkJ1ZmZlckV4dGVuc2lvbjsKK2V4dGVybiBjb25zdCBfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uIGRyaVN3YXBDb250cm9sRXh0ZW5zaW9uOworZXh0ZXJuIGNvbnN0IF9fRFJJZnJhbWVUcmFja2luZ0V4dGVuc2lvbiBkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uOworZXh0ZXJuIGNvbnN0IF9fRFJJbWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uIGRyaU1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvbjsKIAogLyoqCiAgKiBVc2VkIGJ5IERSSV9WQUxJREFURV9EUkFXQUJMRV9JTkZPCkBAIC03OCw3ICs5MCw3IEBACiAvKioKICAqIFV0aWxpdHkgbWFjcm8gdG8gdmFsaWRhdGUgdGhlIGRyYXdhYmxlIGluZm9ybWF0aW9uLgogICoKLSAqIFNlZSBfX0RSSWRyYXdhYmxlUHJpdmF0ZTo6cFN0YW1wIGFuZCBfX0RSSWRyYXdhYmxlUHJpdmF0ZTo6bGFzdFN0YW1wLgorICogU2VlIF9fRFJJZHJhd2FibGU6OnBTdGFtcCBhbmQgX19EUklkcmF3YWJsZTo6bGFzdFN0YW1wLgogICovCiAjZGVmaW5lIERSSV9WQUxJREFURV9EUkFXQUJMRV9JTkZPKHBzcCwgcGRwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDcsOTQgKzExOSwxMDMgQEAKICAqIHRoaXMgc3RydWN0dXJlLgogICovCiBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgewotICAgIC8qKiAKLSAgICAgKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gY2FsbGJhY2sKLSAgICAgKi8KLSAgICBHTGJvb2xlYW4gKCpJbml0RHJpdmVyKShfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcm5Qcml2KTsKLSAgICAKKyAgICBjb25zdCBfX0RSSWNvbmZpZyAqKigqSW5pdFNjcmVlbikgKF9fRFJJc2NyZWVuICogcHJpdik7CisKICAgICAvKioKICAgICAgKiBTY3JlZW4gZGVzdHJ1Y3Rpb24gY2FsbGJhY2sKICAgICAgKi8KLSAgICB2b2lkICgqRGVzdHJveVNjcmVlbikoX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JuUHJpdik7CisgICAgdm9pZCAoKkRlc3Ryb3lTY3JlZW4pKF9fRFJJc2NyZWVuICpkcmlTY3JuUHJpdik7CiAKICAgICAvKioKICAgICAgKiBDb250ZXh0IGNyZWF0aW9uIGNhbGxiYWNrCiAgICAgICovCSAgICAJICAgIAogICAgIEdMYm9vbGVhbiAoKkNyZWF0ZUNvbnRleHQpKGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKmdsVmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dCAqZHJpQ29udGV4dFByaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpOwogCiAgICAgLyoqCiAgICAgICogQ29udGV4dCBkZXN0cnVjdGlvbiBjYWxsYmFjawogICAgICAqLwotICAgIHZvaWQgKCpEZXN0cm95Q29udGV4dCkoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYpOworICAgIHZvaWQgKCpEZXN0cm95Q29udGV4dCkoX19EUkljb250ZXh0ICpkcmlDb250ZXh0UHJpdik7CiAKICAgICAvKioKICAgICAgKiBCdWZmZXIgKGRyYXdhYmxlKSBjcmVhdGlvbiBjYWxsYmFjawogICAgICAqLwotICAgIEdMYm9vbGVhbiAoKkNyZWF0ZUJ1ZmZlcikoX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JuUHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3UHJpdiwKKyAgICBHTGJvb2xlYW4gKCpDcmVhdGVCdWZmZXIpKF9fRFJJc2NyZWVuICpkcmlTY3JuUHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKmRyaURyYXdQcml2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqZ2xWaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gcGl4bWFwQnVmZmVyKTsKICAgICAKICAgICAvKioKICAgICAgKiBCdWZmZXIgKGRyYXdhYmxlKSBkZXN0cnVjdGlvbiBjYWxsYmFjawogICAgICAqLwotICAgIHZvaWQgKCpEZXN0cm95QnVmZmVyKShfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd1ByaXYpOworICAgIHZvaWQgKCpEZXN0cm95QnVmZmVyKShfX0RSSWRyYXdhYmxlICpkcmlEcmF3UHJpdik7CiAKICAgICAvKioKICAgICAgKiBCdWZmZXIgc3dhcHBpbmcgY2FsbGJhY2sgCiAgICAgICovCi0gICAgdm9pZCAoKlN3YXBCdWZmZXJzKShfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd1ByaXYpOworICAgIHZvaWQgKCpTd2FwQnVmZmVycykoX19EUklkcmF3YWJsZSAqZHJpRHJhd1ByaXYpOwogCiAgICAgLyoqCiAgICAgICogQ29udGV4dCBhY3RpdmF0aW9uIGNhbGxiYWNrCiAgICAgICovCi0gICAgR0xib29sZWFuICgqTWFrZUN1cnJlbnQpKF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd1ByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlSZWFkUHJpdik7CisgICAgR0xib29sZWFuICgqTWFrZUN1cnJlbnQpKF9fRFJJY29udGV4dCAqZHJpQ29udGV4dFByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKmRyaURyYXdQcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlICpkcmlSZWFkUHJpdik7CiAKICAgICAvKioKICAgICAgKiBDb250ZXh0IHVuYmluZGluZyBjYWxsYmFjawogICAgICAqLwotICAgIEdMYm9vbGVhbiAoKlVuYmluZENvbnRleHQpKF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2KTsKKyAgICBHTGJvb2xlYW4gKCpVbmJpbmRDb250ZXh0KShfX0RSSWNvbnRleHQgKmRyaUNvbnRleHRQcml2KTsKICAgCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIHN0YXRpc3RpY3MgYWJvdXQgYnVmZmVyIHN3YXAgb3BlcmF0aW9ucy4gIFJlcXVpcmVkIGlmCiAgICAgICogR0xYX09NTF9zeW5jX2NvbnRyb2wgb3IgR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSBpcyBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgaW50ICgqR2V0U3dhcEluZm8pKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsIF9fRFJJc3dhcEluZm8gKiBzSW5mbyApOworICAgIGludCAoKkdldFN3YXBJbmZvKSggX19EUklkcmF3YWJsZSAqZFByaXYsIF9fRFJJc3dhcEluZm8gKiBzSW5mbyApOwogCiAKICAgICAvKioKLSAgICAgKiBSZXF1aXJlZCBpZiBHTFhfU0dJX3ZpZGVvX3N5bmMgb3IgR0xYX09NTF9zeW5jX2NvbnRyb2wgaXMKLSAgICAgKiBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgaW50ICgqR2V0TVNDKSggX19EUklzY3JlZW5Qcml2YXRlICogcHJpdiwgaW50NjRfdCAqIGNvdW50ICk7Ci0KLSAgICAvKioKICAgICAgKiBUaGVzZSBhcmUgcmVxdWlyZWQgaWYgR0xYX09NTF9zeW5jX2NvbnRyb2wgaXMgc3VwcG9ydGVkLgogICAgICAqLwogICAgIC8qQHsqLwotICAgIGludCAoKldhaXRGb3JNU0MpKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJpdiwgaW50NjRfdCB0YXJnZXRfbXNjLCAKKyAgICBpbnQgKCpXYWl0Rm9yTVNDKSggX19EUklkcmF3YWJsZSAqcHJpdiwgaW50NjRfdCB0YXJnZXRfbXNjLCAKIAkJICAgICAgIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIsCiAJCSAgICAgICBpbnQ2NF90ICogbXNjICk7Ci0gICAgaW50ICgqV2FpdEZvclNCQykoIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2LCBpbnQ2NF90IHRhcmdldF9zYmMsCisgICAgaW50ICgqV2FpdEZvclNCQykoIF9fRFJJZHJhd2FibGUgKnByaXYsIGludDY0X3QgdGFyZ2V0X3NiYywKIAkJICAgICAgIGludDY0X3QgKiBtc2MsIGludDY0X3QgKiBzYmMgKTsKIAotICAgIGludDY0X3QgKCpTd2FwQnVmZmVyc01TQykoIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2LCBpbnQ2NF90IHRhcmdldF9tc2MsCisgICAgaW50NjRfdCAoKlN3YXBCdWZmZXJzTVNDKSggX19EUklkcmF3YWJsZSAqcHJpdiwgaW50NjRfdCB0YXJnZXRfbXNjLAogCQkJICAgICAgIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIgKTsKICAgICAvKkB9Ki8KLSAgICB2b2lkICgqQ29weVN1YkJ1ZmZlcikoX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaURyYXdQcml2LAorICAgIHZvaWQgKCpDb3B5U3ViQnVmZmVyKShfX0RSSWRyYXdhYmxlICpkcmlEcmF3UHJpdiwKIAkJCSAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwogCiAgICAgLyoqCi0gICAgICogU2VlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gXGMgX19EUklzY3JlZW5SZWMuCisgICAgICogTmV3IHZlcnNpb24gb2YgR2V0TVNDIHNvIHdlIGNhbiBwYXNzIGRyYXdhYmxlIGRhdGEgdG8gdGhlIGxvdworICAgICAqIGxldmVsIERSTSBkcml2ZXIgKGUuZy4gcGlwZSBpbmZvKS4gIFJlcXVpcmVkIGlmCisgICAgICogR0xYX1NHSV92aWRlb19zeW5jIG9yIEdMWF9PTUxfc3luY19jb250cm9sIGlzIHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICB2b2lkICgqc2V0VGV4T2Zmc2V0KShfX0RSSWNvbnRleHQgKnBEUklDdHgsIEdMaW50IHRleG5hbWUsCi0JCQkgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgR0xpbnQgZGVwdGgsIEdMdWludCBwaXRjaCk7CisgICAgaW50ICgqR2V0RHJhd2FibGVNU0MpICggX19EUklzY3JlZW4gKiBwcml2LAorCQkJICAgIF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlUHJpdmF0ZSwKKwkJCSAgICBpbnQ2NF90ICpjb3VudCk7CisKKworCisgICAgLyogRFJJMiBFbnRyeSBwb2ludHMgKi8KKyAgICBjb25zdCBfX0RSSWNvbmZpZyAqKigqSW5pdFNjcmVlbjIpIChfX0RSSXNjcmVlbiAqIHByaXYpOworICAgIHZvaWQgKCpIYW5kbGVEcmF3YWJsZUNvbmZpZykoX19EUklkcmF3YWJsZSAqZFByaXYsCisJCQkJX19EUkljb250ZXh0ICpwY3AsCisJCQkJX19EUklEcmF3YWJsZUNvbmZpZ0V2ZW50ICpldmVudCk7CisKKyAgICB2b2lkICgqSGFuZGxlQnVmZmVyQXR0YWNoKShfX0RSSWRyYXdhYmxlICpkUHJpdiwKKwkJCSAgICAgICBfX0RSSWNvbnRleHQgKnBjcCwKKwkJCSAgICAgICBfX0RSSUJ1ZmZlckF0dGFjaEV2ZW50ICpiYSk7CisKIH07CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJOworCiAKIHN0cnVjdCBfX0RSSXN3YXBJbmZvUmVjIHsKICAgICAvKiogCkBAIC0yMzAsNyArMjUxLDcgQEAKIC8qKgogICogUGVyLWRyYXdhYmxlIHByaXZhdGUgRFJJIGRyaXZlciBpbmZvcm1hdGlvbi4KICAqLwotc3RydWN0IF9fRFJJZHJhd2FibGVQcml2YXRlUmVjIHsKK3N0cnVjdCBfX0RSSWRyYXdhYmxlUmVjIHsKICAgICAvKioKICAgICAgKiBLZXJuZWwgZHJhd2FibGUgaGFuZGxlCiAgICAgICovCkBAIC0yNDQsMTAgKzI2NSwxMCBAQAogICAgIHZvaWQgKmRyaXZlclByaXZhdGU7CiAKICAgICAvKioKLSAgICAgKiBYJ3MgZHJhd2FibGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJpdmF0ZSBkcmF3YWJsZS4KKyAgICAgKiBQcml2YXRlIGRhdGEgZnJvbSB0aGUgbG9hZGVyLiAgV2UganVzdCBob2xkIG9uIHRvIGl0IGFuZCBwYXNzCisgICAgICogaXQgYmFjayB3aGVuIGNhbGxpbmcgaW50byBsb2FkZXIgcHJvdmlkZWQgZnVuY3Rpb25zLgogICAgICAqLwotICAgIF9fRFJJaWQgZHJhdzsKLSAgICBfX0RSSWRyYXdhYmxlICpwZHJhdzsKKyAgICB2b2lkICpsb2FkZXJQcml2YXRlOwogCiAgICAgLyoqCiAgICAgICogUmVmZXJlbmNlIGNvdW50IGZvciBudW1iZXIgb2YgY29udGV4dCdzIGN1cnJlbnRseSBib3VuZCB0byB0aGlzCkBAIC0yNzIsNyArMjkzLDcgQEAKICAgICAvKioKICAgICAgKiBMYXN0IHZhbHVlIG9mIHRoZSBzdGFtcC4KICAgICAgKgotICAgICAqIElmIHRoaXMgZGlmZmVycyBmcm9tIHRoZSB2YWx1ZSBzdG9yZWQgYXQgX19EUklkcmF3YWJsZVByaXZhdGU6OnBTdGFtcCwKKyAgICAgKiBJZiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgdmFsdWUgc3RvcmVkIGF0IF9fRFJJZHJhd2FibGU6OnBTdGFtcCwKICAgICAgKiB0aGVuIHRoZSBkcmF3YWJsZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgWCBzZXJ2ZXIsIGFuZCB0aGUKICAgICAgKiBkcmF3YWJsZSBpbmZvcm1hdGlvbiAoYmVsb3cpIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgWCBzZXJ2ZXIuCiAgICAgICovCkBAIC0zMDYsNDEgKzMyNyw1NiBAQAogICAgIC8qQH0qLwogCiAgICAgLyoqCisgICAgICogXG5hbWUgVmVydGljYWwgYmxhbmsgdHJhY2tpbmcgaW5mb3JtYXRpb24KKyAgICAgKiBVc2VkIGZvciB3YWl0aW5nIG9uIHZlcnRpY2FsIGJsYW5rIGV2ZW50cy4KKyAgICAgKi8KKyAgICAvKkB7Ki8KKyAgICB1bnNpZ25lZCBpbnQgdmJsU2VxOworICAgIHVuc2lnbmVkIGludCB2YmxGbGFnczsKKyAgICAvKkB9Ki8KKworICAgIC8qKgorICAgICAqIFxuYW1lIE1vbm90b25pYyBNU0MgdHJhY2tpbmcKKyAgICAgKgorICAgICAqIExvdyBsZXZlbCBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIG1zY19iYXNlIGFuZAorICAgICAqIHZibFNlcSB2YWx1ZXMgc28gdGhhdCBoaWdoZXIgbGV2ZWwgY29kZSBjYW4gY2FsY3VsYXRlCisgICAgICogYSBuZXcgbXNjIHZhbHVlIG9yIG1zYyB0YXJnZXQgZm9yIGEgV2FpdE1TQyBjYWxsLiAgVGhlIG5ldyB2YWx1ZQorICAgICAqIHdpbGwgYmU6CisgICAgICogICBtc2MgPSBtc2NfYmFzZSArIGdldF92YmxhbmtfY291bnQoKSAtIHZibGFua19iYXNlOworICAgICAqCisgICAgICogQW5kIGZvciB3YWl0aW5nIG9uIGEgdmFsdWUsIGNvcmUgY29kZSB3aWxsIHVzZToKKyAgICAgKiAgIGFjdHVhbF90YXJnZXQgPSB0YXJnZXRfbXNjIC0gbXNjX2Jhc2UgKyB2YmxhbmtfYmFzZTsKKyAgICAgKi8KKyAgICAvKkB7Ki8KKyAgICBpbnQ2NF90IHZibGFua19iYXNlOworICAgIGludDY0X3QgbXNjX2Jhc2U7CisgICAgLypAfSovCisKKyAgICAvKioKICAgICAgKiBQb2ludGVyIHRvIGNvbnRleHQgdG8gd2hpY2ggdGhpcyBkcmF3YWJsZSBpcyBjdXJyZW50bHkgYm91bmQuCiAgICAgICovCi0gICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXY7CisgICAgX19EUkljb250ZXh0ICpkcmlDb250ZXh0UHJpdjsKIAogICAgIC8qKgogICAgICAqIFBvaW50ZXIgdG8gc2NyZWVuIG9uIHdoaWNoIHRoaXMgZHJhd2FibGUgd2FzIGNyZWF0ZWQuCiAgICAgICovCi0gICAgX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JlZW5Qcml2OworICAgIF9fRFJJc2NyZWVuICpkcmlTY3JlZW5Qcml2OwogCiAgICAgLyoqCi0gICAgICogXG5hbWUgRGlzcGxheSBhbmQgc2NyZWVuIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIEJhc2ljYWxseSBqdXN0IG5lZWQgdGhlc2UgZm9yIHdoZW4gdGhlIGxvY2tpbmcgY29kZSBuZWVkcyB0byBjYWxsCi0gICAgICogXGMgX19kcmlVdGlsVXBkYXRlRHJhd2FibGVJbmZvLgorICAgICAqIENvbnRyb2xzIHN3YXAgaW50ZXJ2YWwgYXMgdXNlZCBieSBHTFhfU0dJX3N3YXBfY29udHJvbCBhbmQKKyAgICAgKiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wuCiAgICAgICovCi0gICAgLypAeyovCi0gICAgX19EUkluYXRpdmVEaXNwbGF5ICpkaXNwbGF5OwotICAgIGludCBzY3JlZW47Ci0gICAgLypAfSovCi0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdmlhIGdsWFN3YXBCdWZmZXJzKCkuCi0gICAgICovCi0gICAgdm9pZCAoKnN3YXBCdWZmZXJzKSggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICk7CisgICAgdW5zaWduZWQgaW50IHN3YXBfaW50ZXJ2YWw7CisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGFpbDsKKwl1bnNpZ25lZCBpbnQgZHJhd2FibGVfaWQ7CisgICAgfSBkcmkyOwogfTsKIAogLyoqCiAgKiBQZXItY29udGV4dCBwcml2YXRlIGRyaXZlciBpbmZvcm1hdGlvbi4KICAqLwotc3RydWN0IF9fRFJJY29udGV4dFByaXZhdGVSZWMgewotICAgIC8qKgotICAgICAqIEtlcm5lbCBjb250ZXh0IGhhbmRsZSB1c2VkIHRvIGFjY2VzcyB0aGUgZGV2aWNlIGxvY2suCi0gICAgICovCi0gICAgX19EUklpZCBjb250ZXh0SUQ7Ci0KK3N0cnVjdCBfX0RSSWNvbnRleHRSZWMgewogICAgIC8qKgogICAgICAqIEtlcm5lbCBjb250ZXh0IGhhbmRsZSB1c2VkIHRvIGFjY2VzcyB0aGUgZGV2aWNlIGxvY2suCiAgICAgICovCkBAIC0zNTIsMzUgKzM4OCwzMCBAQAogICAgIHZvaWQgKmRyaXZlclByaXZhdGU7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGNvbnRleHQncyBkaXNwbGF5IHBvaW50ZXIuCisgICAgICogUG9pbnRlciBiYWNrIHRvIHRoZSBcYyBfX0RSSWNvbnRleHQgdGhhdCBjb250YWlucyB0aGlzIHN0cnVjdHVyZS4KICAgICAgKi8KLSAgICBfX0RSSW5hdGl2ZURpc3BsYXkgKmRpc3BsYXk7CisgICAgX19EUkljb250ZXh0ICpwY3R4OwogCiAgICAgLyoqCiAgICAgICogUG9pbnRlciB0byBkcmF3YWJsZSBjdXJyZW50bHkgYm91bmQgdG8gdGhpcyBjb250ZXh0IGZvciBkcmF3aW5nLgogICAgICAqLwotICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3YWJsZVByaXY7CisgICAgX19EUklkcmF3YWJsZSAqZHJpRHJhd2FibGVQcml2OwogCiAgICAgLyoqCiAgICAgICogUG9pbnRlciB0byBkcmF3YWJsZSBjdXJyZW50bHkgYm91bmQgdG8gdGhpcyBjb250ZXh0IGZvciByZWFkaW5nLgogICAgICAqLwotICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlSZWFkYWJsZVByaXY7CisgICAgX19EUklkcmF3YWJsZSAqZHJpUmVhZGFibGVQcml2OwogCiAgICAgLyoqCiAgICAgICogUG9pbnRlciB0byBzY3JlZW4gb24gd2hpY2ggdGhpcyBjb250ZXh0IHdhcyBjcmVhdGVkLgogICAgICAqLwotICAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqZHJpU2NyZWVuUHJpdjsKKyAgICBfX0RSSXNjcmVlbiAqZHJpU2NyZWVuUHJpdjsKIH07CiAKIC8qKgogICogUGVyLXNjcmVlbiBwcml2YXRlIGRyaXZlciBpbmZvcm1hdGlvbi4KICAqLwotc3RydWN0IF9fRFJJc2NyZWVuUHJpdmF0ZVJlYyB7Ci0gICAgLyoqCi0gICAgICogRGlzcGxheSBmb3IgdGhpcyBzY3JlZW4KLSAgICAgKi8KLSAgICBfX0RSSW5hdGl2ZURpc3BsYXkgKmRpc3BsYXk7Ci0KK3N0cnVjdCBfX0RSSXNjcmVlblJlYyB7CiAgICAgLyoqCiAgICAgICogQ3VycmVudCBzY3JlZW4ncyBudW1iZXIKICAgICAgKi8KQEAgLTM5MSwzOCArNDIyLDIxIEBACiAgICAgICovCiAgICAgc3RydWN0IF9fRHJpdmVyQVBJUmVjIERyaXZlckFQSTsKIAorICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZXh0ZW5zaW9uczsKICAgICAvKioKLSAgICAgKiBcbmFtZSBERFggdmVyc2lvbgogICAgICAqIEREWCAvIDJEIGRyaXZlciB2ZXJzaW9uIGluZm9ybWF0aW9uLgotICAgICAqIFx0b2RvIFJlcGxhY2UgdGhlc2UgZmllbGRzIHdpdGggYSBcYyBfX0RSSXZlcnNpb25SZWMuCiAgICAgICovCi0gICAgLypAeyovCi0gICAgaW50IGRkeE1ham9yOwotICAgIGludCBkZHhNaW5vcjsKLSAgICBpbnQgZGR4UGF0Y2g7Ci0gICAgLypAfSovCisgICAgX19EUkl2ZXJzaW9uIGRkeF92ZXJzaW9uOwogCiAgICAgLyoqCi0gICAgICogXG5hbWUgRFJJIHZlcnNpb24KICAgICAgKiBEUkkgWCBleHRlbnNpb24gdmVyc2lvbiBpbmZvcm1hdGlvbi4KLSAgICAgKiBcdG9kbyBSZXBsYWNlIHRoZXNlIGZpZWxkcyB3aXRoIGEgXGMgX19EUkl2ZXJzaW9uUmVjLgogICAgICAqLwotICAgIC8qQHsqLwotICAgIGludCBkcmlNYWpvcjsKLSAgICBpbnQgZHJpTWlub3I7Ci0gICAgaW50IGRyaVBhdGNoOwotICAgIC8qQH0qLworICAgIF9fRFJJdmVyc2lvbiBkcmlfdmVyc2lvbjsKIAogICAgIC8qKgotICAgICAqIFxuYW1lIERSTSB2ZXJzaW9uCiAgICAgICogRFJNIChrZXJuZWwgbW9kdWxlKSB2ZXJzaW9uIGluZm9ybWF0aW9uLgotICAgICAqIFx0b2RvIFJlcGxhY2UgdGhlc2UgZmllbGRzIHdpdGggYSBcYyBfX0RSSXZlcnNpb25SZWMuCiAgICAgICovCi0gICAgLypAeyovCi0gICAgaW50IGRybU1ham9yOwotICAgIGludCBkcm1NaW5vcjsKLSAgICBpbnQgZHJtUGF0Y2g7Ci0gICAgLypAfSovCisgICAgX19EUkl2ZXJzaW9uIGRybV92ZXJzaW9uOwogCiAgICAgLyoqCiAgICAgICogSUQgdXNlZCB3aGVuIHRoZSBjbGllbnQgc2V0cyB0aGUgZHJhd2FibGUgbG9jay4KQEAgLTQ4NSwxMiArNDk5LDcgQEAKICAgICAgKiBjb250ZXh0IGlzIGNyZWF0ZWQgd2hlbiB0aGUgZmlyc3QgInJlYWwiIGNvbnRleHQgaXMgY3JlYXRlZCBvbiB0aGlzCiAgICAgICogc2NyZWVuLgogICAgICAqLwotICAgIF9fRFJJY29udGV4dFByaXZhdGUgZHVtbXlDb250ZXh0UHJpdjsKLQotICAgIC8qKgotICAgICAqIEhhc2ggdGFibGUgdG8gaG9sZCB0aGUgZHJhd2FibGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc2NyZWVuLgotICAgICAqLwotICAgIHZvaWQgKmRyYXdIYXNoOworICAgIF9fRFJJY29udGV4dCBkdW1teUNvbnRleHRQcml2OwogCiAgICAgLyoqCiAgICAgICogRGV2aWNlLWRlcGVuZGVudCBwcml2YXRlIGluZm9ybWF0aW9uIChub3Qgc3RvcmVkIGluIHRoZSBTQVJFQSkuCkBAIC01MDAsNjUgKzUwOSw0NyBAQAogICAgIHZvaWQgKnByaXZhdGU7CiAKICAgICAvKioKLSAgICAgKiBHTFggdmlzdWFscyAvIEZCQ29uZmlncyBmb3IgdGhpcyBzY3JlZW4uICBUaGVzZSBhcmUgc3RvcmVkIGFzIGEKLSAgICAgKiBsaW5rZWQgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBcbm90ZQotICAgICAqIFRoaXMgZmllbGQgaXMgXGIgb25seSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9sZCBpbnRlcmZhY2VzLiAgSWYKLSAgICAgKiB0aGUgbmV3IGludGVyZmFjZXMgYXJlIHVzZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBzZXQgdG8gXGMgTlVMTCBhbmQgd2lsbAotICAgICAqIG5vdCBiZSBkZXJlZmVyZW5jZWQuCi0gICAgICovCi0gICAgX19HTGNvbnRleHRNb2RlcyAqbW9kZXM7Ci0KLSAgICAvKioKICAgICAgKiBQb2ludGVyIGJhY2sgdG8gdGhlIFxjIF9fRFJJc2NyZWVuIHRoYXQgY29udGFpbnMgdGhpcyBzdHJ1Y3R1cmUuCiAgICAgICovCi0KICAgICBfX0RSSXNjcmVlbiAqcHNjOworCisgICAgLyogRXh0ZW5zaW9ucyBwcm92aWRlZCBieSB0aGUgbG9hZGVyLiAqLworICAgIGNvbnN0IF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uICpnZXREcmF3YWJsZUluZm87CisgICAgY29uc3QgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uICpzeXN0ZW1UaW1lOworICAgIGNvbnN0IF9fRFJJZGFtYWdlRXh0ZW5zaW9uICpkYW1hZ2U7CisKKyAgICBzdHJ1Y3QgeworCS8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgRFJJMiBzY3JlZW4uICBNYW55IG9mIHRoZSBhYm92ZQorCSAqIGZpZWxkcyB3aWxsIG5vdCBiZSB2YWxpZCBvciBpbml0aWFsaXphZWQgaW4gdGhhdCBjYXNlLiAqLworCWludCBlbmFibGVkOworI2lmZGVmIFRUTV9BUEkKKwlkcm1CTyBzYXJlYUJPOworI2VuZGlmCisJdm9pZCAqc2FyZWE7CisJX19EUklFdmVudEJ1ZmZlciAqYnVmZmVyOworCV9fRFJJTG9jayAqbG9jazsKKwlfX0RSSWxvYWRlckV4dGVuc2lvbiAqbG9hZGVyOworICAgIH0gZHJpMjsKKworICAgIC8qIFRoZSBsb2NrIGFjdHVhbGx5IGluIHVzZSwgb2xkIHNhcmVhIG9yIERSSTIgKi8KKyAgICBkcm1Mb2NrICpsb2NrOwogfTsKIAotCi0vKioKLSAqIFVzZWQgdG8gc3RvcmUgYSB2ZXJzaW9uIHdoaWNoIGluY2x1ZGVzIGEgbWFqb3IgcmFuZ2UgaW5zdGVhZCBvZiBhIHNpbmdsZQotICogbWFqb3IgdmVyc2lvbiBudW1iZXIuCi0gKi8KLXN0cnVjdCBfX0RSSXV0aWx2ZXJzaW9uUmVjMiB7Ci0gICAgaW50ICAgIG1ham9yX21pbjsgICAgLyoqIG1pbiBhbGxvd2VkIE1ham9yIHZlcnNpb24gbnVtYmVyLiAqLwotICAgIGludCAgICBtYWpvcl9tYXg7ICAgIC8qKiBtYXggYWxsb3dlZCBNYWpvciB2ZXJzaW9uIG51bWJlci4gKi8KLSAgICBpbnQgICAgbWlub3I7ICAgICAgICAvKio8IE1pbm9yIHZlcnNpb24gbnVtYmVyLiAqLwotICAgIGludCAgICBwYXRjaDsgICAgICAgIC8qKjwgUGF0Y2gtbGV2ZWwuICovCi19OwotCi0KIGV4dGVybiB2b2lkCiBfX2RyaVV0aWxNZXNzYWdlKGNvbnN0IGNoYXIgKmYsIC4uLik7CiAKIAogZXh0ZXJuIHZvaWQKLV9fZHJpVXRpbFVwZGF0ZURyYXdhYmxlSW5mbyhfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcGRwKTsKK19fZHJpVXRpbFVwZGF0ZURyYXdhYmxlSW5mbyhfX0RSSWRyYXdhYmxlICpwZHApOwogCi0KLWV4dGVybiBfX0RSSXNjcmVlblByaXZhdGUgKiBfX2RyaVV0aWxDcmVhdGVOZXdTY3JlZW4oIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LAotICAgIGludCBzY3JuLCBfX0RSSXNjcmVlbiAqcHNjLCBfX0dMY29udGV4dE1vZGVzICogbW9kZXMsCi0gICAgY29uc3QgX19EUkl2ZXJzaW9uICogZGR4X3ZlcnNpb24sIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRyaV92ZXJzaW9uLAotICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLCBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICogZnJhbWVfYnVmZmVyLAotICAgIGRybV9zYXJlYV90ICpwU0FSRUEsIGludCBmZCwgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotICAgIGNvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyAqZHJpdmVyQVBJICk7Ci0KLS8qIFRlc3QgdGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIEdMWCBBUEkuICBSZXR1cm5zIGEgdmFsdWUgbGlrZSBzdHJjbXAuICovCiBleHRlcm4gaW50Ci1kcmlDb21wYXJlR0xYQVBJVmVyc2lvbiggR0xpbnQgcmVxdWlyZWRfdmVyc2lvbiApOworX19kcmlQYXJzZUV2ZW50cyhfX0RSSWNvbnRleHQgKnBzcCwgX19EUklkcmF3YWJsZSAqcGRwKTsKIAogZXh0ZXJuIGZsb2F0Ci1kcmlDYWxjdWxhdGVTd2FwVXNhZ2UoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiwKK2RyaUNhbGN1bGF0ZVN3YXBVc2FnZSggX19EUklkcmF3YWJsZSAqZFByaXYsCiAJCSAgICAgICBpbnQ2NF90IGxhc3Rfc3dhcF91c3QsIGludDY0X3QgY3VycmVudF91c3QgKTsKIAotLyoqCi0gKiBQb2ludGVyIHRvIHRoZSBcYyBfX0RSSWludGVyZmFjZU1ldGhvZHMgcGFzc2VkIHRvIHRoZSBkcml2ZXIgYnkgdGhlIGxvYWRlci4KLSAqIAotICogVGhpcyBwb2ludGVyIGlzIHNldCBpbiB0aGUgZHJpdmVyJ3MgXGMgX19kcmlDcmVhdGVOZXdTY3JlZW4gZnVuY3Rpb24gYW5kCi0gKiBpcyBkZWZpbmVkIGluIGRyaV91dGlsLmMuCi0gKi8KLWV4dGVybiBjb25zdCBfX0RSSWludGVyZmFjZU1ldGhvZHMgKiBkcmlfaW50ZXJmYWNlOworZXh0ZXJuIEdMaW50CitkcmlJbnRlcnNlY3RBcmVhKCBkcm1fY2xpcF9yZWN0X3QgcmVjdDEsIGRybV9jbGlwX3JlY3RfdCByZWN0MiApOwogCiAjZW5kaWYgLyogX0RSSV9VVElMX0hfICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZXh0ZW5zaW9uX2hlbHBlci5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL2V4dGVuc2lvbl9oZWxwZXIuaAppbmRleCA2NWU5NjY1Li5lYTViOTk3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vZXh0ZW5zaW9uX2hlbHBlci5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9leHRlbnNpb25faGVscGVyLmgKQEAgLTEwNzcsMTMgKzEwNzcsNiBAQAogICAgICIiOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKG5lZWRfR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCkKLXN0YXRpYyBjb25zdCBjaGFyIElzUmVuZGVyYnVmZmVyRVhUX25hbWVzW10gPSAKLSAgICAiaVwwIiAvKiBQYXJhbWV0ZXIgc2lnbmF0dXJlICovCi0gICAgImdsSXNSZW5kZXJidWZmZXJFWFRcMCIKLSAgICAiIjsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChuZWVkX0dMX1ZFUlNJT05fMl8wKSB8fCBkZWZpbmVkKG5lZWRfR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWwpCiBzdGF0aWMgY29uc3QgY2hhciBTdGVuY2lsT3BTZXBhcmF0ZV9uYW1lc1tdID0gCiAgICAgImlpaWlcMCIgLyogUGFyYW1ldGVyIHNpZ25hdHVyZSAqLwpAQCAtMTc2MywxMyArMTc1Niw2IEBACiAgICAgIiI7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQobmVlZF9HTF9TR0lYX3BvbHlub21pYWxfZmZkKQotc3RhdGljIGNvbnN0IGNoYXIgRGVmb3JtYXRpb25NYXAzZFNHSVhfbmFtZXNbXSA9IAotICAgICJpZGRpaWRkaWlkZGlpcFwwIiAvKiBQYXJhbWV0ZXIgc2lnbmF0dXJlICovCi0gICAgImdsRGVmb3JtYXRpb25NYXAzZFNHSVhcMCIKLSAgICAiIjsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChuZWVkX0dMX1ZFUlNJT05fMl8wKQogc3RhdGljIGNvbnN0IGNoYXIgSXNTaGFkZXJfbmFtZXNbXSA9IAogICAgICJpXDAiIC8qIFBhcmFtZXRlciBzaWduYXR1cmUgKi8KQEAgLTIwMTUsNiArMjAwMSwxMyBAQAogICAgICIiOwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKG5lZWRfR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCkKK3N0YXRpYyBjb25zdCBjaGFyIElzUmVuZGVyYnVmZmVyRVhUX25hbWVzW10gPSAKKyAgICAiaVwwIiAvKiBQYXJhbWV0ZXIgc2lnbmF0dXJlICovCisgICAgImdsSXNSZW5kZXJidWZmZXJFWFRcMCIKKyAgICAiIjsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChuZWVkX0dMX01FU0Ffd2luZG93X3BvcykKIHN0YXRpYyBjb25zdCBjaGFyIFdpbmRvd1BvczRmTUVTQV9uYW1lc1tdID0gCiAgICAgImZmZmZcMCIgLyogUGFyYW1ldGVyIHNpZ25hdHVyZSAqLwpAQCAtNDUzMCw2ICs0NTIzLDEzIEBACiAgICAgIiI7CiAjZW5kaWYKIAorI2lmIGRlZmluZWQobmVlZF9HTF9TR0lYX3BvbHlub21pYWxfZmZkKQorc3RhdGljIGNvbnN0IGNoYXIgRGVmb3JtYXRpb25NYXAzZFNHSVhfbmFtZXNbXSA9IAorICAgICJpZGRpaWRkaWlkZGlpcFwwIiAvKiBQYXJhbWV0ZXIgc2lnbmF0dXJlICovCisgICAgImdsRGVmb3JtYXRpb25NYXAzZFNHSVhcMCIKKyAgICAiIjsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChuZWVkX0dMX1ZFUlNJT05fMV80KSB8fCBkZWZpbmVkKG5lZWRfR0xfRVhUX2ZvZ19jb29yZCkKIHN0YXRpYyBjb25zdCBjaGFyIEZvZ0Nvb3JkZHZFWFRfbmFtZXNbXSA9IAogICAgICJwXDAiIC8qIFBhcmFtZXRlciBzaWduYXR1cmUgKi8KQEAgLTUzMTksMTMgKzUzMTksMTMgQEAKICNpZiBkZWZpbmVkKG5lZWRfR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCkKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbl9mdW5jdGlvbiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewogICAgIHsgR2VuZXJhdGVNaXBtYXBFWFRfbmFtZXMsIEdlbmVyYXRlTWlwbWFwRVhUX3JlbWFwX2luZGV4LCAtMSB9LAotICAgIHsgSXNSZW5kZXJidWZmZXJFWFRfbmFtZXMsIElzUmVuZGVyYnVmZmVyRVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgUmVuZGVyYnVmZmVyU3RvcmFnZUVYVF9uYW1lcywgUmVuZGVyYnVmZmVyU3RvcmFnZUVYVF9yZW1hcF9pbmRleCwgLTEgfSwKICAgICB7IENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFRfbmFtZXMsIENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFRfcmVtYXBfaW5kZXgsIC0xIH0sCiAgICAgeyBEZWxldGVSZW5kZXJidWZmZXJzRVhUX25hbWVzLCBEZWxldGVSZW5kZXJidWZmZXJzRVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgRnJhbWVidWZmZXJUZXh0dXJlM0RFWFRfbmFtZXMsIEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFRfbmFtZXMsIEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgRnJhbWVidWZmZXJUZXh0dXJlMURFWFRfbmFtZXMsIEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUX3JlbWFwX2luZGV4LCAtMSB9LAorICAgIHsgSXNSZW5kZXJidWZmZXJFWFRfbmFtZXMsIElzUmVuZGVyYnVmZmVyRVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgQmluZEZyYW1lYnVmZmVyRVhUX25hbWVzLCBCaW5kRnJhbWVidWZmZXJFWFRfcmVtYXBfaW5kZXgsIC0xIH0sCiAgICAgeyBHZW5SZW5kZXJidWZmZXJzRVhUX25hbWVzLCBHZW5SZW5kZXJidWZmZXJzRVhUX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgSXNGcmFtZWJ1ZmZlckVYVF9uYW1lcywgSXNGcmFtZWJ1ZmZlckVYVF9yZW1hcF9pbmRleCwgLTEgfSwKQEAgLTU5NjUsOSArNTk2NSw5IEBACiAjaWYgZGVmaW5lZChuZWVkX0dMX1NHSVhfcG9seW5vbWlhbF9mZmQpCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb25fZnVuY3Rpb24gR0xfU0dJWF9wb2x5bm9taWFsX2ZmZF9mdW5jdGlvbnNbXSA9IHsKICAgICB7IExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWF9uYW1lcywgTG9hZElkZW50aXR5RGVmb3JtYXRpb25NYXBTR0lYX3JlbWFwX2luZGV4LCAtMSB9LAotICAgIHsgRGVmb3JtYXRpb25NYXAzZFNHSVhfbmFtZXMsIERlZm9ybWF0aW9uTWFwM2RTR0lYX3JlbWFwX2luZGV4LCAtMSB9LAogICAgIHsgRGVmb3JtU0dJWF9uYW1lcywgRGVmb3JtU0dJWF9yZW1hcF9pbmRleCwgLTEgfSwKICAgICB7IERlZm9ybWF0aW9uTWFwM2ZTR0lYX25hbWVzLCBEZWZvcm1hdGlvbk1hcDNmU0dJWF9yZW1hcF9pbmRleCwgLTEgfSwKKyAgICB7IERlZm9ybWF0aW9uTWFwM2RTR0lYX25hbWVzLCBEZWZvcm1hdGlvbk1hcDNkU0dJWF9yZW1hcF9pbmRleCwgLTEgfSwKICAgICB7IE5VTEwsIDAsIDAgfQogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL21lbW9wcy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL21lbW9wcy5oCmluZGV4IDQ5NTJkNzguLjljZDFkOGUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9tZW1vcHMuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vbWVtb3BzLmgKQEAgLTQsNyArNCw3IEBACiAqIG1lbXNldCBhbiBhcmVhIGluIEkvTyBzcGFjZQogKiBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgdGhpcyBvbiBzb21lIGFyY2hzCiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBkcmltZW1zZXRpbyh2b2lkKiBhZGRyZXNzLCBpbnQgYywgaW50IHNpemUpCitzdGF0aWMgSU5MSU5FIHZvaWQgZHJpbWVtc2V0aW8odm9pZCogYWRkcmVzcywgaW50IGMsIGludCBzaXplKQogewogI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19pYTY0X18pCiAgICAgIGludCBpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL21taW8uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi9tbWlvLmgKaW5kZXggODkxMDU2ZS4uZGM0M2QxYyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL21taW8uaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vbW1pby5oCkBAIC0zNyw3ICszNyw3IEBACiAKICNpZiBkZWZpbmVkKCBfX3Bvd2VycGNfXyApCiAKLXN0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90CitzdGF0aWMgSU5MSU5FIHVpbnQzMl90CiByZWFkX01NSU9fTEUzMiggdm9sYXRpbGUgdm9pZCAqIGJhc2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICkKIHsKICAgIHVpbnQzMl90IHZhbDsKQEAgLTUwLDcgKzUwLDcgQEAKIAogI2Vsc2UKIAotc3RhdGljIF9faW5saW5lX18gdWludDMyX3QKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QKIHJlYWRfTU1JT19MRTMyKCB2b2xhdGlsZSB2b2lkICogYmFzZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQgKQogewogICAgdm9sYXRpbGUgdWludDMyX3QgKiBwID0gKHZvbGF0aWxlIHVpbnQzMl90ICopICgoKHZvbGF0aWxlIGNoYXIgKikgYmFzZSkgKyBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3NwYW50bXAyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vc3BhbnRtcDIuaAppbmRleCA1MGYzY2Y1Li5hMWU1NmViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vc3BhbnRtcDIuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vc3BhbnRtcDIuaApAQCAtNDgsMzYgKzQ4LDM0IEBACiAjZGVmaW5lIEhXX1dSSVRFX0NMSVBMT09QKCkJSFdfQ0xJUExPT1AoKQogI2VuZGlmCiAKLQogI2lmIChTUEFOVE1QX1BJWEVMX0ZNVCA9PSBHTF9SR0IpICAmJiAoU1BBTlRNUF9QSVhFTF9UWVBFID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81KQogCiAvKioKICAqKiBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81CiAgKiovCiAKKyNpZm5kZWYgR0VUX1ZBTFVFCiAjaWZuZGVmIEdFVF9QVFIKICNkZWZpbmUgR0VUX1BUUihfeCwgX3kpIChidWYgKyAoX3gpICogMiArIChfeSkgKiBwaXRjaCkKICNlbmRpZgogCisjZGVmaW5lIEdFVF9WQUxVRShfeCwgX3kpICoodm9sYXRpbGUgR0x1c2hvcnQgKikoR0VUX1BUUihfeCwgX3kpKQorI2RlZmluZSBQVVRfVkFMVUUoX3gsIF95LCBfdikgKih2b2xhdGlsZSBHTHVzaG9ydCAqKShHRVRfUFRSKF94LCBfeSkpID0gKF92KQorI2VuZGlmIC8qIEdFVF9WQUxVRSAqLworCiAjZGVmaW5lIElOSVRfTU9OT19QSVhFTChwLCBjb2xvcikgXAogICBwID0gUEFDS19DT0xPUl81NjUoIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0gKQogCiAjZGVmaW5lIFdSSVRFX1JHQkEoIF94LCBfeSwgciwgZywgYiwgYSApCQkJCVwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBHTHNob3J0ICogX3AgPSAoR0xzaG9ydCAqKSBHRVRfUFRSKF94LCBfeSk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfcFswXSA9ICgoKChpbnQpciAmIDB4ZjgpIDw8IDgpIHwgKCgoaW50KWcgJiAweGZjKSA8PCAzKSB8CVwKLQkJICAgKCgoaW50KWIgJiAweGY4KSA+PiAzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB9IHdoaWxlKDApCisgICBQVVRfVkFMVUUoX3gsIF95LCAoKCgoaW50KXIgJiAweGY4KSA8PCA4KSB8CQkJCVwKKwkJICAgICAgKCgoaW50KWcgJiAweGZjKSA8PCAzKSB8CQkJCVwKKwkJICAgICAgKCgoaW50KWIgJiAweGY4KSA+PiAzKSkpCQkJCVwKIAotI2RlZmluZSBXUklURV9QSVhFTCggX3gsIF95LCBwICkJCQkJCVwKLSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEdMdXNob3J0ICogX3AgPSAoR0x1c2hvcnQgKikgR0VUX1BUUihfeCwgX3kpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF9wWzBdID0gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfUElYRUwoIF94LCBfeSwgcCApIFBVVF9WQUxVRShfeCwgX3ksIHApCiAKICNkZWZpbmUgUkVBRF9SR0JBKCByZ2JhLCBfeCwgX3kgKQkJCQkJXAogICAgZG8gewkJCQkJCQkJCVwKLSAgICAgIEdMdXNob3J0IHAgPSAqKHZvbGF0aWxlIEdMc2hvcnQgKikgR0VUX1BUUihfeCwgX3kpOyAgICAgICAgICAgICAgIFwKKyAgICAgIEdMdXNob3J0IHAgPSBHRVRfVkFMVUUoX3gsIF95KTsJCQkJCVwKICAgICAgIHJnYmFbMF0gPSAoKHAgPj4gOCkgJiAweGY4KSAqIDI1NSAvIDB4Zjg7CQkJCVwKICAgICAgIHJnYmFbMV0gPSAoKHAgPj4gMykgJiAweGZjKSAqIDI1NSAvIDB4ZmM7CQkJCVwKICAgICAgIHJnYmFbMl0gPSAoKHAgPDwgMykgJiAweGY4KSAqIDI1NSAvIDB4Zjg7CQkJCVwKQEAgLTkwLDMxICs4OCwzMiBAQAogICoqIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgogICoqLwogCisjaWZuZGVmIEdFVF9WQUxVRQogI2lmbmRlZiBHRVRfUFRSCiAjZGVmaW5lIEdFVF9QVFIoX3gsIF95KSAoICAgICBidWYgKyAoX3gpICogNCArIChfeSkgKiBwaXRjaCkKICNlbmRpZgogCisjZGVmaW5lIEdFVF9WQUxVRShfeCwgX3kpICoodm9sYXRpbGUgR0x1aW50ICopKEdFVF9QVFIoX3gsIF95KSkKKyNkZWZpbmUgUFVUX1ZBTFVFKF94LCBfeSwgX3YpICoodm9sYXRpbGUgR0x1aW50ICopKEdFVF9QVFIoX3gsIF95KSkgPSAoX3YpCisjZW5kaWYgLyogR0VUX1ZBTFVFICovCisKICMgZGVmaW5lIElOSVRfTU9OT19QSVhFTChwLCBjb2xvcikgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgcCA9IFBBQ0tfQ09MT1JfODg4OChjb2xvclszXSwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSkgCiAKICMgZGVmaW5lIFdSSVRFX1JHQkEoX3gsIF95LCByLCBnLCBiLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBHTHVpbnQgKiBfcCA9IChHTHVpbnQgKikgR0VUX1BUUihfeCwgX3kpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfcFswXSA9ICgociA8PCAxNikgfCAoZyA8PCA4KSB8IChiIDw8IDApIHwgKGEgPDwgMjQpKTsgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCisgICBQVVRfVkFMVUUoX3gsIF95LCAoKHIgPDwgMTYpIHwJCQkJCVwKKwkJICAgICAgKGcgPDwgOCkgfAkJCQkJXAorCQkgICAgICAoYiA8PCAwKSB8CQkJCQlcCisJCSAgICAgIChhIDw8IDI0KSkpCiAKLSNkZWZpbmUgV1JJVEVfUElYRUwoX3gsIF95LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBHTHVpbnQgKiBfcCA9IChHTHVpbnQgKikgR0VUX1BUUihfeCwgX3kpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfcFswXSA9IHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX1BJWEVMKF94LCBfeSwgcCkgUFVUX1ZBTFVFKF94LCBfeSwgcCkKIAogIyBpZiBkZWZpbmVkKCBVU0VfWDg2X0FTTSApCiAjICBkZWZpbmUgUkVBRF9SR0JBKHJnYmEsIF94LCBfeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEdMdWludCBwID0gKih2b2xhdGlsZSBHTHVpbnQgKikgR0VUX1BUUihfeCwgX3kpOyAgICAgICAgICAgICAgICBcCisgICAgICAgR0x1aW50IHAgPSBHRVRfVkFMVUUoX3gsIF95KTsJCQkJCVwKICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyggImJzd2FwCSUwOyByb3JsICQ4LCAlMCIgICAgICAgICAgICAgICAgXAotCQkJCTogIj1yIiAocCkgOiAiciIgKHApICk7ICAgICAgICAgICAgICAgICBcCisJCQkJOiAiPXIiIChwKSA6ICIwIiAocCkgKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICAoKEdMdWludCAqKXJnYmEpWzBdID0gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogIyBlbGlmIGRlZmluZWQoIE1FU0FfQklHX0VORElBTiApCkBAIC0xMjMsMTQgKzEyMiwxNCBAQAogICAgICAqLwogIyAgZGVmaW5lIFJFQURfUkdCQSggcmdiYSwgX3gsIF95ICkJCQkJICAgICAgICBcCiAgICAgIGRvIHsJCQkJCQkJCVwKLSAgICAgICAgR0x1aW50IHAgPSAqKHZvbGF0aWxlIEdMdWludCAqKSBHRVRfUFRSKF94LCBfeSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0x1aW50IHAgPSBHRVRfVkFMVUUoX3gsIF95KTsJCQkJCVwKICAgICAgICAgR0x1aW50IHQgPSBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKigodWludDMyX3QgKikgcmdiYSkgPSAodCA+PiAyNCkgfCAocCA8PCA4KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoMCkKICMgZWxzZQogIyAgZGVmaW5lIFJFQURfUkdCQSggcmdiYSwgX3gsIF95ICkJCQkJICAgICAgICBcCiAgICAgIGRvIHsJCQkJCQkJCVwKLSAgICAgICAgR0x1aW50IHAgPSAqKHZvbGF0aWxlIEdMdWludCAqKSBHRVRfUFRSKF94LCBfeSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0x1aW50IHAgPSBHRVRfVkFMVUUoX3gsIF95KTsJCQkJCVwKIAlyZ2JhWzBdID0gKHAgPj4gMTYpICYgMHhmZjsJCQkJCVwKIAlyZ2JhWzFdID0gKHAgPj4gIDgpICYgMHhmZjsJCQkJCVwKIAlyZ2JhWzJdID0gKHAgPj4gIDApICYgMHhmZjsJCQkJCVwKQEAgLTM4OSw3ICszODgsOCBAQAogfQogCiAKLSNpZiBkZWZpbmVkKFVTRV9NTVhfQVNNKSAmJiBcCisjaWYgZGVmaW5lZChHRVRfUFRSKSAmJiBcCisgICBkZWZpbmVkKFVTRV9NTVhfQVNNKSAmJiBcCiAgICAoKChTUEFOVE1QX1BJWEVMX0ZNVCA9PSBHTF9CR1JBKSAmJiBcCiAJKFNQQU5UTVBfUElYRUxfVFlQRSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYpKSB8fCBcCiAgICAgKChTUEFOVE1QX1BJWEVMX0ZNVCA9PSBHTF9SR0IpICYmIFwKQEAgLTQ0MCw3ICs0NDAsOCBAQAogI2VuZGlmCiAKIAotI2lmIGRlZmluZWQoVVNFX1NTRV9BU00pICYmIFwKKyNpZiBkZWZpbmVkKEdFVF9QVFIpICYmCVwKKyAgIGRlZmluZWQoVVNFX1NTRV9BU00pICYmIFwKICAgIChTUEFOVE1QX1BJWEVMX0ZNVCA9PSBHTF9CR1JBKSAmJiBcCiAgICAgIChTUEFOVE1QX1BJWEVMX1RZUEUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWKQogc3RhdGljIHZvaWQgVEFHMihSZWFkUkdCQVNwYW4sX1NTRTIpKCBHTGNvbnRleHQgKmN0eCwKQEAgLTQ3NCw3ICs0NzUsOCBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKFVTRV9TU0VfQVNNKSAmJiBcCisjaWYgZGVmaW5lZChHRVRfUFRSKSAmJglcCisgICBkZWZpbmVkKFVTRV9TU0VfQVNNKSAmJiBcCiAgICAoU1BBTlRNUF9QSVhFTF9GTVQgPT0gR0xfQkdSQSkgJiYgXAogICAgICAoU1BBTlRNUF9QSVhFTF9UWVBFID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVikKIHN0YXRpYyB2b2lkIFRBRzIoUmVhZFJHQkFTcGFuLF9TU0UpKCBHTGNvbnRleHQgKmN0eCwKQEAgLTU2Nyw2ICs1NjksNyBAQAogICAgcmItPlB1dE1vbm9WYWx1ZXMgPSBUQUcoV3JpdGVNb25vUkdCQVBpeGVscyk7CiAgICByYi0+R2V0VmFsdWVzID0gVEFHKFJlYWRSR0JBUGl4ZWxzKTsKIAorI2lmIGRlZmluZWQoR0VUX1BUUikKICNpZiBkZWZpbmVkKFVTRV9TU0VfQVNNKSAmJiBcCiAgICAoU1BBTlRNUF9QSVhFTF9GTVQgPT0gR0xfQkdSQSkgJiYgXAogICAgICAoU1BBTlRNUF9QSVhFTF9UWVBFID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVikKQEAgLTU5Niw2ICs1OTksNyBAQAogICAgfQogICAgZWxzZQogI2VuZGlmCisjZW5kaWYgLyogR0VUX1BUUiAqLwogICAgewogICAgICAgaWYgKERCRykgZnByaW50Ziggc3RkZXJyLCAiVXNpbmcgJXMgdmVyc2lvbiBvZiBHZXRSb3dcbiIsICJDIiApOwogICAgICAgcmItPkdldFJvdyA9IFRBRyhSZWFkUkdCQVNwYW4pOwpAQCAtNjEwLDYgKzYxNCw4IEBACiAjdW5kZWYgUkVBRF9SR0JBCiAjdW5kZWYgVEFHCiAjdW5kZWYgVEFHMgorI3VuZGVmIEdFVF9WQUxVRQorI3VuZGVmIFBVVF9WQUxVRQogI3VuZGVmIEdFVF9QVFIKICN1bmRlZiBTUEFOVE1QX1BJWEVMX0ZNVAogI3VuZGVmIFNQQU5UTVBfUElYRUxfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3RleG1lbS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3RleG1lbS5jCmluZGV4IGE4MWNjMjQuLmI0YWY3YzkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi90ZXhtZW0uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vdGV4bWVtLmMKQEAgLTEyNzcsNiArMTI3Nyw3IEBACiAgICAgICBlbHNlIHsKIAkgZmlyc3RMZXZlbCA9IHRPYmotPkJhc2VMZXZlbCArIChHTGludCkodE9iai0+TWluTG9kICsgMC41KTsKIAkgZmlyc3RMZXZlbCA9IE1BWDIoZmlyc3RMZXZlbCwgdE9iai0+QmFzZUxldmVsKTsKKwkgZmlyc3RMZXZlbCA9IE1JTjIoZmlyc3RMZXZlbCwgdE9iai0+QmFzZUxldmVsICsgYmFzZUltYWdlLT5NYXhMb2cyKTsKIAkgbGFzdExldmVsID0gdE9iai0+QmFzZUxldmVsICsgKEdMaW50KSh0T2JqLT5NYXhMb2QgKyAwLjUpOwogCSBsYXN0TGV2ZWwgPSBNQVgyKGxhc3RMZXZlbCwgdC0+dE9iai0+QmFzZUxldmVsKTsKIAkgbGFzdExldmVsID0gTUlOMihsYXN0TGV2ZWwsIHQtPnRPYmotPkJhc2VMZXZlbCArIGJhc2VJbWFnZS0+TWF4TG9nMik7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vdXRpbHMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5jCmluZGV4IDY3Y2ZmZWEuLjQzMWMyNmEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5jCkBAIC00MjEsMjEgKzQyMSw2IEBACiAJCQkJZHJtQWN0dWFsLCBkcm1FeHBlY3RlZCk7CiB9CiAKLQotCi1HTGludAotZHJpSW50ZXJzZWN0QXJlYSggZHJtX2NsaXBfcmVjdF90IHJlY3QxLCBkcm1fY2xpcF9yZWN0X3QgcmVjdDIgKQotewotICAgaWYgKHJlY3QyLngxID4gcmVjdDEueDEpIHJlY3QxLngxID0gcmVjdDIueDE7Ci0gICBpZiAocmVjdDIueDIgPCByZWN0MS54MikgcmVjdDEueDIgPSByZWN0Mi54MjsKLSAgIGlmIChyZWN0Mi55MSA+IHJlY3QxLnkxKSByZWN0MS55MSA9IHJlY3QyLnkxOwotICAgaWYgKHJlY3QyLnkyIDwgcmVjdDEueTIpIHJlY3QxLnkyID0gcmVjdDIueTI7Ci0KLSAgIGlmIChyZWN0MS54MSA+IHJlY3QxLngyIHx8IHJlY3QxLnkxID4gcmVjdDEueTIpIHJldHVybiAwOwotCi0gICByZXR1cm4gKHJlY3QxLngyIC0gcmVjdDEueDEpICogKHJlY3QxLnkyIC0gcmVjdDEueTEpOwotfQotCiBHTGJvb2xlYW4gZHJpQ2xpcFJlY3RUb0ZyYW1lYnVmZmVyKCBjb25zdCBHTGZyYW1lYnVmZmVyICpidWZmZXIsCiAJCQkJICAgIEdMaW50ICp4LCBHTGludCAqeSwKIAkJCQkgICAgR0xzaXplaSAqd2lkdGgsIEdMc2l6ZWkgKmhlaWdodCApCkBAIC00NjksOCArNDU0LDYgQEAKICAgIHJldHVybiBHTF9UUlVFOwogfQogCi0KLQogLyoqCiAgKiBDcmVhdGVzIGEgc2V0IG9mIFxjIF9fR0xjb250ZXh0TW9kZXMgdGhhdCBhIGRyaXZlciB3aWxsIGV4cG9zZS4KICAqIApAQCAtNTQxLDg1ICs1MjQsMTAzIEBACiAgKiBcYyBHTF9VTlNJR05FRF8zQllURV84XzhfOCwgXGMgR0xfNEZMT0FUXzMyXzMyXzMyXzMyLCAKICAqIFxjIEdMXzRIQUxGXzE2XzE2XzE2XzE2LCBldGMuICBXZSBjYW4gY3Jvc3MgdGhhdCBicmlkZ2Ugd2hlbiB3ZSBjb21lIHRvIGl0LgogICovCi1HTGJvb2xlYW4KLWRyaUZpbGxJbk1vZGVzKCBfX0dMY29udGV4dE1vZGVzICoqIHB0cl90b19tb2RlcywKLQkJR0xlbnVtIGZiX2Zvcm1hdCwgR0xlbnVtIGZiX3R5cGUsCi0JCWNvbnN0IHVpbnQ4X3QgKiBkZXB0aF9iaXRzLCBjb25zdCB1aW50OF90ICogc3RlbmNpbF9iaXRzLAotCQl1bnNpZ25lZCBudW1fZGVwdGhfc3RlbmNpbF9iaXRzLAotCQljb25zdCBHTGVudW0gKiBkYl9tb2RlcywgdW5zaWduZWQgbnVtX2RiX21vZGVzLAotCQljb25zdCB1X2ludDhfdCAqIG1zYWFfc2FtcGxlcywgdW5zaWduZWQgbnVtX21zYWFfbW9kZXMsCi0JCWludCB2aXNUeXBlICkKKworLyogWFhYOiBuZWVkIHRvIHJlLWFkZCBtc2FhIHN1cHBvcnQgYWZ0ZXIgZ2FsbGl1bS0wLjEgbWVyZ2UKKyAqLworCitfX0RSSWNvbmZpZyAqKgorZHJpQ3JlYXRlQ29uZmlncyhHTGVudW0gZmJfZm9ybWF0LCBHTGVudW0gZmJfdHlwZSwKKwkJIGNvbnN0IHVfaW50OF90ICogZGVwdGhfYml0cywgY29uc3QgdV9pbnQ4X3QgKiBzdGVuY2lsX2JpdHMsCisJCSB1bnNpZ25lZCBudW1fZGVwdGhfc3RlbmNpbF9iaXRzLAorCQkgY29uc3QgR0xlbnVtICogZGJfbW9kZXMsIHVuc2lnbmVkIG51bV9kYl9tb2RlcykKIHsKLSAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJpdHNfdGFibGVbM11bNF0gPSB7CisgICBzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYml0c190YWJsZVs0XVs0XSA9IHsKICAgICAgLyogUiAgRyAgQiAgQSAqLworICAgICAgeyAzLCAzLCAyLCAwIH0sIC8qIEFueSBHTF9VTlNJR05FRF9CWVRFXzNfM18yICovCiAgICAgICB7IDUsIDYsIDUsIDAgfSwgLyogQW55IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICovCiAgICAgICB7IDgsIDgsIDgsIDAgfSwgLyogQW55IFJHQiB3aXRoIGFueSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCAqLwogICAgICAgeyA4LCA4LCA4LCA4IH0gIC8qIEFueSBSR0JBIHdpdGggYW55IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICovCiAgICB9OwogCi0gICAvKiBUaGUgZm9sbG93aW5nIGFycmF5cyBhcmUgYWxsIGluZGV4ZWQgYnkgdGhlIGZiX3R5cGUgbWFza2VkIHdpdGggMHgwNy4KLSAgICAqIEdpdmVuIHRoZSBmb3VyIHN1cHBvcnRlZCBmYl90eXBlIHZhbHVlcywgdGhpcyByZXN1bHRzIGluIHZhbGlkIGFycmF5Ci0gICAgKiBpbmRpY2VzIG9mIDMsIDQsIDUsIGFuZCA3LgotICAgICovCi0gICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFza3NfdGFibGVfcmdiWzhdWzRdID0gewotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgc3RhdGljIGNvbnN0IHVfaW50MzJfdCBtYXNrc190YWJsZV9yZ2JbNl1bNF0gPSB7CisgICAgICB7IDB4MDAwMDAwRTAsIDB4MDAwMDAwMUMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDAgfSwgLyogM18zXzIgICAgICAgKi8KKyAgICAgIHsgMHgwMDAwMDAwNywgMHgwMDAwMDAzOCwgMHgwMDAwMDBDMCwgMHgwMDAwMDAwMCB9LCAvKiAyXzNfM19SRVYgICAqLwogICAgICAgeyAweDAwMDBGODAwLCAweDAwMDAwN0UwLCAweDAwMDAwMDFGLCAweDAwMDAwMDAwIH0sIC8qIDVfNl81ICAgICAgICovCiAgICAgICB7IDB4MDAwMDAwMUYsIDB4MDAwMDA3RTAsIDB4MDAwMEY4MDAsIDB4MDAwMDAwMDAgfSwgLyogNV82XzVfUkVWICAgKi8KICAgICAgIHsgMHhGRjAwMDAwMCwgMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDAwMCB9LCAvKiA4XzhfOF84ICAgICAqLwotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCiAgICAgICB7IDB4MDAwMDAwRkYsIDB4MDAwMEZGMDAsIDB4MDBGRjAwMDAsIDB4MDAwMDAwMDAgfSAgLyogOF84XzhfOF9SRVYgKi8KICAgIH07CiAKLSAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBtYXNrc190YWJsZV9yZ2JhWzhdWzRdID0gewotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgc3RhdGljIGNvbnN0IHVfaW50MzJfdCBtYXNrc190YWJsZV9yZ2JhWzZdWzRdID0geworICAgICAgeyAweDAwMDAwMEUwLCAweDAwMDAwMDFDLCAweDAwMDAwMDAzLCAweDAwMDAwMDAwIH0sIC8qIDNfM18yICAgICAgICovCisgICAgICB7IDB4MDAwMDAwMDcsIDB4MDAwMDAwMzgsIDB4MDAwMDAwQzAsIDB4MDAwMDAwMDAgfSwgLyogMl8zXzNfUkVWICAgKi8KICAgICAgIHsgMHgwMDAwRjgwMCwgMHgwMDAwMDdFMCwgMHgwMDAwMDAxRiwgMHgwMDAwMDAwMCB9LCAvKiA1XzZfNSAgICAgICAqLwogICAgICAgeyAweDAwMDAwMDFGLCAweDAwMDAwN0UwLCAweDAwMDBGODAwLCAweDAwMDAwMDAwIH0sIC8qIDVfNl81X1JFViAgICovCiAgICAgICB7IDB4RkYwMDAwMDAsIDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYgfSwgLyogOF84XzhfOCAgICAgKi8KLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAogICAgICAgeyAweDAwMDAwMEZGLCAweDAwMDBGRjAwLCAweDAwRkYwMDAwLCAweEZGMDAwMDAwIH0sIC8qIDhfOF84XzhfUkVWICovCiAgICB9OwogCi0gICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFza3NfdGFibGVfYmdyWzhdWzRdID0gewotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgc3RhdGljIGNvbnN0IHVfaW50MzJfdCBtYXNrc190YWJsZV9iZ3JbNl1bNF0gPSB7CisgICAgICB7IDB4MDAwMDAwMDcsIDB4MDAwMDAwMzgsIDB4MDAwMDAwQzAsIDB4MDAwMDAwMDAgfSwgLyogM18zXzIgICAgICAgKi8KKyAgICAgIHsgMHgwMDAwMDBFMCwgMHgwMDAwMDAxQywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCB9LCAvKiAyXzNfM19SRVYgICAqLwogICAgICAgeyAweDAwMDAwMDFGLCAweDAwMDAwN0UwLCAweDAwMDBGODAwLCAweDAwMDAwMDAwIH0sIC8qIDVfNl81ICAgICAgICovCiAgICAgICB7IDB4MDAwMEY4MDAsIDB4MDAwMDA3RTAsIDB4MDAwMDAwMUYsIDB4MDAwMDAwMDAgfSwgLyogNV82XzVfUkVWICAgKi8KICAgICAgIHsgMHgwMDAwRkYwMCwgMHgwMEZGMDAwMCwgMHhGRjAwMDAwMCwgMHgwMDAwMDAwMCB9LCAvKiA4XzhfOF84ICAgICAqLwotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCiAgICAgICB7IDB4MDBGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDAwMDAwRkYsIDB4MDAwMDAwMDAgfSwgLyogOF84XzhfOF9SRVYgKi8KICAgIH07CiAKLSAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBtYXNrc190YWJsZV9iZ3JhWzhdWzRdID0gewotICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgc3RhdGljIGNvbnN0IHVfaW50MzJfdCBtYXNrc190YWJsZV9iZ3JhWzZdWzRdID0geworICAgICAgeyAweDAwMDAwMDA3LCAweDAwMDAwMDM4LCAweDAwMDAwMEMwLCAweDAwMDAwMDAwIH0sIC8qIDNfM18yICAgICAgICovCisgICAgICB7IDB4MDAwMDAwRTAsIDB4MDAwMDAwMUMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDAgfSwgLyogMl8zXzNfUkVWICAgKi8KICAgICAgIHsgMHgwMDAwMDAxRiwgMHgwMDAwMDdFMCwgMHgwMDAwRjgwMCwgMHgwMDAwMDAwMCB9LCAvKiA1XzZfNSAgICAgICAqLwogICAgICAgeyAweDAwMDBGODAwLCAweDAwMDAwN0UwLCAweDAwMDAwMDFGLCAweDAwMDAwMDAwIH0sIC8qIDVfNl81X1JFViAgICovCiAgICAgICB7IDB4MDAwMEZGMDAsIDB4MDBGRjAwMDAsIDB4RkYwMDAwMDAsIDB4MDAwMDAwRkYgfSwgLyogOF84XzhfOCAgICAgKi8KLSAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAogICAgICAgeyAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGLCAweEZGMDAwMDAwIH0sIC8qIDhfOF84XzhfUkVWICovCiAgICB9OwogCi0gICBzdGF0aWMgY29uc3QgdWludDhfdCBieXRlc19wZXJfcGl4ZWxbOF0gPSB7Ci0gICAgICAwLCAwLCAwLCAyLCAyLCA0LCAwLCA0CisgICBzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnl0ZXNfcGVyX3BpeGVsWzZdID0geworICAgICAgMSwgLyogM18zXzIgICAgICAgKi8KKyAgICAgIDEsIC8qIDJfM18zX1JFViAgICovCisgICAgICAyLCAvKiA1XzZfNSAgICAgICAqLworICAgICAgMiwgLyogNV82XzVfUkVWICAgKi8KKyAgICAgIDQsIC8qIDhfOF84XzggICAgICovCisgICAgICA0ICAvKiA4XzhfOF84X1JFViAqLwogICAgfTsKIAotICAgY29uc3QgdWludDhfdCAgKiBiaXRzOwotICAgY29uc3QgdWludDMyX3QgKiBtYXNrczsKLSAgIGNvbnN0IGludCBpbmRleCA9IGZiX3R5cGUgJiAweDA3OwotICAgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzID0gKnB0cl90b19tb2RlczsKLSAgIHVuc2lnbmVkIGksIGosIGssIGg7CisgICBjb25zdCB1X2ludDhfdCAgKiBiaXRzOworICAgY29uc3QgdV9pbnQzMl90ICogbWFza3M7CisgICBpbnQgaW5kZXg7CisgICBfX0RSSWNvbmZpZyAqKmNvbmZpZ3MsICoqYzsKKyAgIF9fR0xjb250ZXh0TW9kZXMgKm1vZGVzOworICAgdW5zaWduZWQgaTsKKyAgIHVuc2lnbmVkIGo7CisgICB1bnNpZ25lZCBrOworICAgdW5zaWduZWQgbnVtX21vZGVzOworICAgdW5zaWduZWQgbnVtX2FjY3VtX2JpdHMgPSAyOwogCi0KLSAgIGlmICggYnl0ZXNfcGVyX3BpeGVsWyBpbmRleCBdID09IDAgKSB7Ci0gICAgICBmcHJpbnRmKCBzdGRlcnIsICJbJXM6JXVdIEZyYW1lYnVmZmVyIHR5cGUgMHglMDR4IGhhcyAwIGJ5dGVzIHBlciBwaXhlbC5cbiIsCi0JICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGZiX3R5cGUgKTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIHN3aXRjaCAoIGZiX3R5cGUgKSB7CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEVfM18zXzI6CisJIGluZGV4ID0gMDsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWOgorCSBpbmRleCA9IDE7CisJIGJyZWFrOworICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNToKKwkgaW5kZXggPSAyOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWOgorCSBpbmRleCA9IDM7CisJIGJyZWFrOworICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfODoKKwkgaW5kZXggPSA0OworCSBicmVhazsKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOgorCSBpbmRleCA9IDU7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBVbmtub3duIGZyYW1lYnVmZmVyIHR5cGUgMHglMDR4LlxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGZiX3R5cGUgKTsKKwkgcmV0dXJuIE5VTEw7CiAgICB9CiAKIApAQCAtNjMxLDkwICs2MzIsMjU0IEBACiAKICAgIHN3aXRjaCAoIGZiX2Zvcm1hdCApIHsKICAgICAgIGNhc2UgR0xfUkdCOgotICAgICAgICAgYml0cyA9IChieXRlc19wZXJfcGl4ZWxbIGluZGV4IF0gPT0gMikKLQkgICAgID8gYml0c190YWJsZVswXSA6IGJpdHNfdGFibGVbMV07CiAgICAgICAgICBtYXNrcyA9IG1hc2tzX3RhYmxlX3JnYlsgaW5kZXggXTsKICAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIEdMX1JHQkE6Ci0gICAgICAgICBiaXRzID0gKGJ5dGVzX3Blcl9waXhlbFsgaW5kZXggXSA9PSAyKQotCSAgICAgPyBiaXRzX3RhYmxlWzBdIDogYml0c190YWJsZVsyXTsKICAgICAgICAgIG1hc2tzID0gbWFza3NfdGFibGVfcmdiYVsgaW5kZXggXTsKICAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIEdMX0JHUjoKLSAgICAgICAgIGJpdHMgPSAoYnl0ZXNfcGVyX3BpeGVsWyBpbmRleCBdID09IDIpCi0JICAgICA/IGJpdHNfdGFibGVbMF0gOiBiaXRzX3RhYmxlWzFdOwogICAgICAgICAgbWFza3MgPSBtYXNrc190YWJsZV9iZ3JbIGluZGV4IF07CiAgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBHTF9CR1JBOgotICAgICAgICAgYml0cyA9IChieXRlc19wZXJfcGl4ZWxbIGluZGV4IF0gPT0gMikKLQkgICAgID8gYml0c190YWJsZVswXSA6IGJpdHNfdGFibGVbMl07CiAgICAgICAgICBtYXNrcyA9IG1hc2tzX3RhYmxlX2JncmFbIGluZGV4IF07CiAgICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlslczoldV0gRnJhbWVidWZmZXIgZm9ybWF0IDB4JTA0eCBpcyBub3QgR0xfUkdCLCBHTF9SR0JBLCBHTF9CR1IsIG9yIEdMX0JHUkEuXG4iLAotCSAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBmYl9mb3JtYXQgKTsKLSAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlslczoldV0gVW5rbm93biBmcmFtZWJ1ZmZlciBmb3JtYXQgMHglMDR4LlxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGZiX2Zvcm1hdCApOworICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAKKyAgIHN3aXRjaCAoIGJ5dGVzX3Blcl9waXhlbFsgaW5kZXggXSApIHsKKyAgICAgIGNhc2UgMToKKwkgYml0cyA9IGJpdHNfdGFibGVbMF07CisJIGJyZWFrOworICAgICAgY2FzZSAyOgorCSBiaXRzID0gYml0c190YWJsZVsxXTsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBiaXRzID0gKChmYl9mb3JtYXQgPT0gR0xfUkdCKSB8fCAoZmJfZm9ybWF0ID09IEdMX0JHUikpCisJICAgID8gYml0c190YWJsZVsyXQorCSAgICA6IGJpdHNfdGFibGVbM107CisJIGJyZWFrOworICAgfQogCisgICBudW1fbW9kZXMgPSBudW1fZGVwdGhfc3RlbmNpbF9iaXRzICogbnVtX2RiX21vZGVzICogbnVtX2FjY3VtX2JpdHM7CisgICBjb25maWdzID0gX21lc2FfY2FsbG9jKChudW1fbW9kZXMgKyAxKSAqIHNpemVvZiAqY29uZmlncyk7CisgICBpZiAoY29uZmlncyA9PSBOVUxMKQorICAgICAgIHJldHVybiBOVUxMOworCisgICAgYyA9IGNvbmZpZ3M7CiAgICAgZm9yICggayA9IDAgOyBrIDwgbnVtX2RlcHRoX3N0ZW5jaWxfYml0cyA7IGsrKyApIHsKIAlmb3IgKCBpID0gMCA7IGkgPCBudW1fZGJfbW9kZXMgOyBpKysgKSB7Ci0JICAgIGZvciAoIGggPSAwIDsgaCA8IG51bV9tc2FhX21vZGVzOyBoKysgKSB7Ci0JCWZvciAoIGogPSAwIDsgaiA8IDIgOyBqKysgKSB7CisJICAgIGZvciAoIGogPSAwIDsgaiA8IG51bV9hY2N1bV9iaXRzIDsgaisrICkgeworCQkqYyA9IF9tZXNhX21hbGxvYyAoc2l6ZW9mICoqYyk7CisJCW1vZGVzID0gJigqYyktPm1vZGVzOworCQljKys7CiAKLQkJICAgIG1vZGVzLT5yZWRCaXRzICAgPSBiaXRzWzBdOwotCQkgICAgbW9kZXMtPmdyZWVuQml0cyA9IGJpdHNbMV07Ci0JCSAgICBtb2Rlcy0+Ymx1ZUJpdHMgID0gYml0c1syXTsKLQkJICAgIG1vZGVzLT5hbHBoYUJpdHMgPSBiaXRzWzNdOwotCQkgICAgbW9kZXMtPnJlZE1hc2sgICA9IG1hc2tzWzBdOwotCQkgICAgbW9kZXMtPmdyZWVuTWFzayA9IG1hc2tzWzFdOwotCQkgICAgbW9kZXMtPmJsdWVNYXNrICA9IG1hc2tzWzJdOwotCQkgICAgbW9kZXMtPmFscGhhTWFzayA9IG1hc2tzWzNdOwotCQkgICAgbW9kZXMtPnJnYkJpdHMgICA9IG1vZGVzLT5yZWRCaXRzICsgbW9kZXMtPmdyZWVuQml0cwotCQkJKyBtb2Rlcy0+Ymx1ZUJpdHMgKyBtb2Rlcy0+YWxwaGFCaXRzOworCQltZW1zZXQobW9kZXMsIDAsIHNpemVvZiAqbW9kZXMpOworCQltb2Rlcy0+cmVkQml0cyAgID0gYml0c1swXTsKKwkJbW9kZXMtPmdyZWVuQml0cyA9IGJpdHNbMV07CisJCW1vZGVzLT5ibHVlQml0cyAgPSBiaXRzWzJdOworCQltb2Rlcy0+YWxwaGFCaXRzID0gYml0c1szXTsKKwkJbW9kZXMtPnJlZE1hc2sgICA9IG1hc2tzWzBdOworCQltb2Rlcy0+Z3JlZW5NYXNrID0gbWFza3NbMV07CisJCW1vZGVzLT5ibHVlTWFzayAgPSBtYXNrc1syXTsKKwkJbW9kZXMtPmFscGhhTWFzayA9IG1hc2tzWzNdOworCQltb2Rlcy0+cmdiQml0cyAgID0gbW9kZXMtPnJlZEJpdHMgKyBtb2Rlcy0+Z3JlZW5CaXRzCisJCSAgICArIG1vZGVzLT5ibHVlQml0cyArIG1vZGVzLT5hbHBoYUJpdHM7CiAKLQkJICAgIG1vZGVzLT5hY2N1bVJlZEJpdHMgICA9IDE2ICogajsKLQkJICAgIG1vZGVzLT5hY2N1bUdyZWVuQml0cyA9IDE2ICogajsKLQkJICAgIG1vZGVzLT5hY2N1bUJsdWVCaXRzICA9IDE2ICogajsKLQkJICAgIG1vZGVzLT5hY2N1bUFscGhhQml0cyA9IChtYXNrc1szXSAhPSAwKSA/IDE2ICogaiA6IDA7Ci0JCSAgICBtb2Rlcy0+dmlzdWFsUmF0aW5nID0gKGogPT0gMCkgPyBHTFhfTk9ORSA6IEdMWF9TTE9XX0NPTkZJRzsKKwkJbW9kZXMtPmFjY3VtUmVkQml0cyAgID0gMTYgKiBqOworCQltb2Rlcy0+YWNjdW1HcmVlbkJpdHMgPSAxNiAqIGo7CisJCW1vZGVzLT5hY2N1bUJsdWVCaXRzICA9IDE2ICogajsKKwkJbW9kZXMtPmFjY3VtQWxwaGFCaXRzID0gKG1hc2tzWzNdICE9IDApID8gMTYgKiBqIDogMDsKKwkJbW9kZXMtPnZpc3VhbFJhdGluZyA9IChqID09IDApID8gR0xYX05PTkUgOiBHTFhfU0xPV19DT05GSUc7CiAKLQkJICAgIG1vZGVzLT5zdGVuY2lsQml0cyA9IHN0ZW5jaWxfYml0c1trXTsKLQkJICAgIG1vZGVzLT5kZXB0aEJpdHMgPSBkZXB0aF9iaXRzW2tdOworCQltb2Rlcy0+c3RlbmNpbEJpdHMgPSBzdGVuY2lsX2JpdHNba107CisJCW1vZGVzLT5kZXB0aEJpdHMgPSBkZXB0aF9iaXRzW2tdOwogCi0JCSAgICBtb2Rlcy0+dmlzdWFsVHlwZSA9IHZpc1R5cGU7Ci0JCSAgICBtb2Rlcy0+cmVuZGVyVHlwZSA9IEdMWF9SR0JBX0JJVDsKLQkJICAgIG1vZGVzLT5kcmF3YWJsZVR5cGUgPSBHTFhfV0lORE9XX0JJVDsKLQkJICAgIG1vZGVzLT5yZ2JNb2RlID0gR0xfVFJVRTsKKwkJbW9kZXMtPnRyYW5zcGFyZW50UGl4ZWwgPSBHTFhfTk9ORTsKKwkJbW9kZXMtPnRyYW5zcGFyZW50UmVkID0gR0xYX0RPTlRfQ0FSRTsKKwkJbW9kZXMtPnRyYW5zcGFyZW50R3JlZW4gPSBHTFhfRE9OVF9DQVJFOworCQltb2Rlcy0+dHJhbnNwYXJlbnRCbHVlID0gR0xYX0RPTlRfQ0FSRTsKKwkJbW9kZXMtPnRyYW5zcGFyZW50QWxwaGEgPSBHTFhfRE9OVF9DQVJFOworCQltb2Rlcy0+dHJhbnNwYXJlbnRJbmRleCA9IEdMWF9ET05UX0NBUkU7CisJCW1vZGVzLT52aXN1YWxUeXBlID0gR0xYX0RPTlRfQ0FSRTsKKwkJbW9kZXMtPnJlbmRlclR5cGUgPSBHTFhfUkdCQV9CSVQ7CisJCW1vZGVzLT5kcmF3YWJsZVR5cGUgPSBHTFhfV0lORE9XX0JJVDsKKwkJbW9kZXMtPnJnYk1vZGUgPSBHTF9UUlVFOwogCi0JCSAgICBpZiAoIGRiX21vZGVzW2ldID09IEdMWF9OT05FICkgewotCQkJbW9kZXMtPmRvdWJsZUJ1ZmZlck1vZGUgPSBHTF9GQUxTRTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJbW9kZXMtPmRvdWJsZUJ1ZmZlck1vZGUgPSBHTF9UUlVFOwotCQkJbW9kZXMtPnN3YXBNZXRob2QgPSBkYl9tb2Rlc1tpXTsKLQkJICAgIH0KLQotCQkgICAgbW9kZXMtPnNhbXBsZXMgPSBtc2FhX3NhbXBsZXNbaF07Ci0JCSAgICBtb2Rlcy0+c2FtcGxlQnVmZmVycyA9IG1vZGVzLT5zYW1wbGVzID8gMSA6IDA7Ci0KLQkJICAgIG1vZGVzLT5oYXZlQWNjdW1CdWZmZXIgPSAoKG1vZGVzLT5hY2N1bVJlZEJpdHMgKwotCQkJCQkgICAgICAgbW9kZXMtPmFjY3VtR3JlZW5CaXRzICsKLQkJCQkJICAgICAgIG1vZGVzLT5hY2N1bUJsdWVCaXRzICsKLQkJCQkJICAgICAgIG1vZGVzLT5hY2N1bUFscGhhQml0cykgPiAwKTsKLQkJICAgIG1vZGVzLT5oYXZlRGVwdGhCdWZmZXIgPSAobW9kZXMtPmRlcHRoQml0cyA+IDApOwotCQkgICAgbW9kZXMtPmhhdmVTdGVuY2lsQnVmZmVyID0gKG1vZGVzLT5zdGVuY2lsQml0cyA+IDApOwotCi0JCSAgICBtb2RlcyA9IG1vZGVzLT5uZXh0OworCQlpZiAoIGRiX21vZGVzW2ldID09IEdMWF9OT05FICkgeworCQkgICAgbW9kZXMtPmRvdWJsZUJ1ZmZlck1vZGUgPSBHTF9GQUxTRTsKIAkJfQorCQllbHNlIHsKKwkJICAgIG1vZGVzLT5kb3VibGVCdWZmZXJNb2RlID0gR0xfVFJVRTsKKwkJICAgIG1vZGVzLT5zd2FwTWV0aG9kID0gZGJfbW9kZXNbaV07CisJCX0KKworCQltb2Rlcy0+aGF2ZUFjY3VtQnVmZmVyID0gKChtb2Rlcy0+YWNjdW1SZWRCaXRzICsKKwkJCQkJICAgbW9kZXMtPmFjY3VtR3JlZW5CaXRzICsKKwkJCQkJICAgbW9kZXMtPmFjY3VtQmx1ZUJpdHMgKworCQkJCQkgICBtb2Rlcy0+YWNjdW1BbHBoYUJpdHMpID4gMCk7CisJCW1vZGVzLT5oYXZlRGVwdGhCdWZmZXIgPSAobW9kZXMtPmRlcHRoQml0cyA+IDApOworCQltb2Rlcy0+aGF2ZVN0ZW5jaWxCdWZmZXIgPSAobW9kZXMtPnN0ZW5jaWxCaXRzID4gMCk7CisKKwkJbW9kZXMtPmJpbmRUb1RleHR1cmVSZ2IgPSBHTF9UUlVFOworCQltb2Rlcy0+YmluZFRvVGV4dHVyZVJnYmEgPSBHTF9UUlVFOworCQltb2Rlcy0+YmluZFRvTWlwbWFwVGV4dHVyZSA9IEdMX0ZBTFNFOworCQltb2Rlcy0+YmluZFRvVGV4dHVyZVRhcmdldHMgPSBtb2Rlcy0+cmdiTW9kZSA/CisJCSAgICBfX0RSSV9BVFRSSUJfVEVYVFVSRV8xRF9CSVQgfAorCQkgICAgX19EUklfQVRUUklCX1RFWFRVUkVfMkRfQklUIHwKKwkJICAgIF9fRFJJX0FUVFJJQl9URVhUVVJFX1JFQ1RBTkdMRV9CSVQgOgorCQkgICAgMDsKIAkgICAgfQogCX0KICAgICB9CisgICAgKmMgPSBOVUxMOwogCi0gICAgKnB0cl90b19tb2RlcyA9IG1vZGVzOworICAgIHJldHVybiBjb25maWdzOworfQorCitjb25zdCBfX0RSSWNvbmZpZyAqKmRyaUNvbmNhdENvbmZpZ3MoX19EUkljb25maWcgKiphLCBfX0RSSWNvbmZpZyAqKmIpCit7CisgICAgY29uc3QgX19EUkljb25maWcgKiphbGw7CisgICAgaW50IGksIGosIGluZGV4OworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKGFbaV0gIT0gTlVMTCkKKwlpKys7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKGJbal0gIT0gTlVMTCkKKwlqKys7CisgICAKKyAgICBhbGwgPSBfbWVzYV9tYWxsb2MoKGkgKyBqICsgMSkgKiBzaXplb2YgKmFsbCk7CisgICAgaW5kZXggPSAwOworICAgIGZvciAoaSA9IDA7IGFbaV0gIT0gTlVMTDsgaSsrKQorCWFsbFtpbmRleCsrXSA9IGFbaV07CisgICAgZm9yIChqID0gMDsgYltqXSAhPSBOVUxMOyBqKyspCisJYWxsW2luZGV4KytdID0gYltqXTsKKyAgICBhbGxbaW5kZXgrK10gPSBOVUxMOworCisgICAgX21lc2FfZnJlZShhKTsKKyAgICBfbWVzYV9mcmVlKGIpOworCisgICAgcmV0dXJuIGFsbDsKK30KKworI2RlZmluZSBfX0FUVFJJQihhdHRyaWIsIGZpZWxkKSBcCisgICAgeyBhdHRyaWIsIG9mZnNldG9mKF9fR0xjb250ZXh0TW9kZXMsIGZpZWxkKSB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgYXR0cmliLCBvZmZzZXQ7IH0gYXR0cmliTWFwW10gPSB7CisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0JVRkZFUl9TSVpFLAkJCXJnYkJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9MRVZFTCwJCQlsZXZlbCksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1JFRF9TSVpFLAkJCXJlZEJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9HUkVFTl9TSVpFLAkJCWdyZWVuQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0JMVUVfU0laRSwJCQlibHVlQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FMUEhBX1NJWkUsCQkJYWxwaGFCaXRzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfREVQVEhfU0laRSwJCQlkZXB0aEJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9TVEVOQ0lMX1NJWkUsCQkJc3RlbmNpbEJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9BQ0NVTV9SRURfU0laRSwJCWFjY3VtUmVkQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FDQ1VNX0dSRUVOX1NJWkUsCQlhY2N1bUdyZWVuQml0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0FDQ1VNX0JMVUVfU0laRSwJCWFjY3VtQmx1ZUJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9BQ0NVTV9BTFBIQV9TSVpFLAkJYWNjdW1BbHBoYUJpdHMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9TQU1QTEVfQlVGRkVSUywJCXNhbXBsZUJ1ZmZlcnMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9TQU1QTEVTLAkJCXNhbXBsZXMpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9ET1VCTEVfQlVGRkVSLAkJZG91YmxlQnVmZmVyTW9kZSksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1NURVJFTywJCQlzdGVyZW9Nb2RlKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQVVYX0JVRkZFUlMsCQkJbnVtQXV4QnVmZmVycyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1RZUEUsCQl0cmFuc3BhcmVudFBpeGVsKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUsCXRyYW5zcGFyZW50UGl4ZWwpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCXRyYW5zcGFyZW50UmVkKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCXRyYW5zcGFyZW50R3JlZW4pLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAl0cmFuc3BhcmVudEJsdWUpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRSwJdHJhbnNwYXJlbnRBbHBoYSksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0ZMT0FUX01PREUsCQkJZmxvYXRNb2RlKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfUkVEX01BU0ssCQkJcmVkTWFzayksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0dSRUVOX01BU0ssCQkJZ3JlZW5NYXNrKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQkxVRV9NQVNLLAkJCWJsdWVNYXNrKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQUxQSEFfTUFTSywJCQlhbHBoYU1hc2spLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9XSURUSCwJCW1heFBidWZmZXJXaWR0aCksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX01BWF9QQlVGRkVSX0hFSUdIVCwJCW1heFBidWZmZXJIZWlnaHQpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9QSVhFTFMsCQltYXhQYnVmZmVyUGl4ZWxzKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfT1BUSU1BTF9QQlVGRkVSX1dJRFRILAlvcHRpbWFsUGJ1ZmZlcldpZHRoKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfT1BUSU1BTF9QQlVGRkVSX0hFSUdIVCwJb3B0aW1hbFBidWZmZXJIZWlnaHQpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9TV0FQX01FVEhPRCwJCQlzd2FwTWV0aG9kKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQklORF9UT19URVhUVVJFX1JHQiwJCWJpbmRUb1RleHR1cmVSZ2IpLAorICAgIF9fQVRUUklCKF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfUkdCQSwJCWJpbmRUb1RleHR1cmVSZ2JhKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQklORF9UT19NSVBNQVBfVEVYVFVSRSwJYmluZFRvTWlwbWFwVGV4dHVyZSksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTLAliaW5kVG9UZXh0dXJlVGFyZ2V0cyksCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1lJTlZFUlRFRCwJCQl5SW52ZXJ0ZWQpLAorCisgICAgLyogVGhlIHN0cnVjdCBmaWVsZCBkb2Vzbid0IG1hdHRlciBoZXJlLCB0aGVzZSBhcmUgaGFuZGxlZCBieSB0aGUKKyAgICAgKiBzd2l0Y2ggaW4gZHJpR2V0Q29uZmlnQXR0cmliSW5kZXguICBXZSBuZWVkIHRoZW0gaW4gdGhlIGFycmF5CisgICAgICogc28gdGhlIGl0ZXJhdG9yIGluY2x1ZGVzIHRoZW0gdGhvdWdoLiovCisgICAgX19BVFRSSUIoX19EUklfQVRUUklCX1JFTkRFUl9UWVBFLAkJCWxldmVsKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfQ09ORklHX0NBVkVBVCwJCWxldmVsKSwKKyAgICBfX0FUVFJJQihfX0RSSV9BVFRSSUJfU1dBUF9NRVRIT0QsCQkJbGV2ZWwpCit9OworCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZiAoYSkgLyBzaXplb2YgKChhKVswXSkpCisKK3N0YXRpYyBpbnQKK2RyaUdldENvbmZpZ0F0dHJpYkluZGV4KGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQl1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisgICAgc3dpdGNoIChhdHRyaWJNYXBbaW5kZXhdLmF0dHJpYikgeworICAgIGNhc2UgX19EUklfQVRUUklCX1JFTkRFUl9UWVBFOgorCWlmIChjb25maWctPm1vZGVzLnJnYk1vZGUpCisJICAgICp2YWx1ZSA9IF9fRFJJX0FUVFJJQl9SR0JBX0JJVDsKKwllbHNlCisJICAgICp2YWx1ZSA9IF9fRFJJX0FUVFJJQl9DT0xPUl9JTkRFWF9CSVQ7CisJYnJlYWs7CisgICAgY2FzZSBfX0RSSV9BVFRSSUJfQ09ORklHX0NBVkVBVDoKKwlpZiAoY29uZmlnLT5tb2Rlcy52aXN1YWxSYXRpbmcgPT0gR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRykKKwkgICAgKnZhbHVlID0gX19EUklfQVRUUklCX05PTl9DT05GT1JNQU5UX0NPTkZJRzsKKwllbHNlIGlmIChjb25maWctPm1vZGVzLnZpc3VhbFJhdGluZyA9PSBHTFhfU0xPV19DT05GSUcpCisJICAgICp2YWx1ZSA9IF9fRFJJX0FUVFJJQl9TTE9XX0JJVDsKKwllbHNlCisJICAgICp2YWx1ZSA9IDA7CisJYnJlYWs7CisgICAgY2FzZSBfX0RSSV9BVFRSSUJfU1dBUF9NRVRIT0Q6CisJYnJlYWs7CisKKyAgICBjYXNlIF9fRFJJX0FUVFJJQl9GTE9BVF9NT0RFOgorICAgICAgICAqdmFsdWUgPSBjb25maWctPm1vZGVzLmZsb2F0TW9kZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCSp2YWx1ZSA9ICoodW5zaWduZWQgaW50ICopCisJICAgICgoY2hhciAqKSAmY29uZmlnLT5tb2RlcyArIGF0dHJpYk1hcFtpbmRleF0ub2Zmc2V0KTsKKwkKKwlicmVhazsKKyAgICB9CisKICAgICByZXR1cm4gR0xfVFJVRTsKIH0KKworaW50CitkcmlHZXRDb25maWdBdHRyaWIoY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJICAgdW5zaWduZWQgaW50IGF0dHJpYiwgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0dHJpYk1hcCk7IGkrKykKKwlpZiAoYXR0cmliTWFwW2ldLmF0dHJpYiA9PSBhdHRyaWIpCisJICAgIHJldHVybiBkcmlHZXRDb25maWdBdHRyaWJJbmRleChjb25maWcsIGksIHZhbHVlKTsKKworICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworaW50CitkcmlJbmRleENvbmZpZ0F0dHJpYihjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLCBpbnQgaW5kZXgsCisJCSAgICAgdW5zaWduZWQgaW50ICphdHRyaWIsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBBUlJBWV9TSVpFKGF0dHJpYk1hcCkpIHsKKwkqYXR0cmliID0gYXR0cmliTWFwW2luZGV4XS5hdHRyaWI7CisJcmV0dXJuIGRyaUdldENvbmZpZ0F0dHJpYkluZGV4KGNvbmZpZywgaW5kZXgsIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gR0xfRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vdXRpbHMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5oCmluZGV4IDIwOTQwYzIuLjlhYzNiNTEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi91dGlscy5oCkBAIC0yOCw4ICsyOCwxMSBAQAogI2lmbmRlZiBEUklfREVCVUdfSAogI2RlZmluZSBEUklfREVCVUdfSAogCisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNpbmNsdWRlIDxHTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImRyaV91dGlsLmgiCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJdXRpbHZlcnNpb25SZWMyICAgIF9fRFJJdXRpbHZlcnNpb24yOwogCiBzdHJ1Y3QgZHJpX2RlYnVnX2NvbnRyb2wgewogICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7CkBAIC04Myw2ICs4NiwxNyBAQAogICAgIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uX2Z1bmN0aW9uICogZnVuY3Rpb25zOwogfTsKIAorLyoqCisgKiBVc2VkIHRvIHN0b3JlIGEgdmVyc2lvbiB3aGljaCBpbmNsdWRlcyBhIG1ham9yIHJhbmdlIGluc3RlYWQgb2YgYSBzaW5nbGUKKyAqIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICovCitzdHJ1Y3QgX19EUkl1dGlsdmVyc2lvblJlYzIgeworICAgIGludCAgICBtYWpvcl9taW47ICAgIC8qKiBtaW4gYWxsb3dlZCBNYWpvciB2ZXJzaW9uIG51bWJlci4gKi8KKyAgICBpbnQgICAgbWFqb3JfbWF4OyAgICAvKiogbWF4IGFsbG93ZWQgTWFqb3IgdmVyc2lvbiBudW1iZXIuICovCisgICAgaW50ICAgIG1pbm9yOyAgICAgICAgLyoqPCBNaW5vciB2ZXJzaW9uIG51bWJlci4gKi8KKyAgICBpbnQgICAgcGF0Y2g7ICAgICAgICAvKio8IFBhdGNoLWxldmVsLiAqLworfTsKKwogZXh0ZXJuIHVuc2lnbmVkIGRyaVBhcnNlRGVidWdTdHJpbmcoIGNvbnN0IGNoYXIgKiBkZWJ1ZywKICAgICBjb25zdCBzdHJ1Y3QgZHJpX2RlYnVnX2NvbnRyb2wgKiBjb250cm9sICk7CiAKQEAgLTEwNSwxNyArMTE5LDI3IEBACiAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZGR4QWN0dWFsLCBjb25zdCBfX0RSSXV0aWx2ZXJzaW9uMiAqIGRkeEV4cGVjdGVkLAogICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybUFjdHVhbCwgY29uc3QgX19EUkl2ZXJzaW9uICogZHJtRXhwZWN0ZWQpOwogCi1leHRlcm4gR0xpbnQgZHJpSW50ZXJzZWN0QXJlYSggZHJtX2NsaXBfcmVjdF90IHJlY3QxLCBkcm1fY2xpcF9yZWN0X3QgcmVjdDIgKTsKLQogZXh0ZXJuIEdMYm9vbGVhbiBkcmlDbGlwUmVjdFRvRnJhbWVidWZmZXIoIGNvbnN0IEdMZnJhbWVidWZmZXIgKmJ1ZmZlciwKIAkJCQkJICAgR0xpbnQgKngsIEdMaW50ICp5LAogCQkJCQkgICBHTHNpemVpICp3aWR0aCwgR0xzaXplaSAqaGVpZ2h0ICk7CiAKLWV4dGVybiBHTGJvb2xlYW4gZHJpRmlsbEluTW9kZXMoIF9fR0xjb250ZXh0TW9kZXMgKiogbW9kZXMsCi0gICAgR0xlbnVtIGZiX2Zvcm1hdCwgR0xlbnVtIGZiX3R5cGUsCi0gICAgY29uc3QgdWludDhfdCAqIGRlcHRoX2JpdHMsIGNvbnN0IHVpbnQ4X3QgKiBzdGVuY2lsX2JpdHMsCi0gICAgdW5zaWduZWQgbnVtX2RlcHRoX3N0ZW5jaWxfYml0cywKLSAgICBjb25zdCBHTGVudW0gKiBkYl9tb2RlcywgdW5zaWduZWQgbnVtX2RiX21vZGVzLAotICAgIGNvbnN0IHVfaW50OF90ICogbXNhYV9zYW1wbGVzLCB1bnNpZ25lZCBudW1fbXNhYV9tb2RlcywgaW50IHZpc1R5cGUgKTsKK3N0cnVjdCBfX0RSSWNvbmZpZ1JlYyB7CisgICAgX19HTGNvbnRleHRNb2RlcyBtb2RlczsKK307CisKK2V4dGVybiBfX0RSSWNvbmZpZyAqKgorZHJpQ3JlYXRlQ29uZmlncyhHTGVudW0gZmJfZm9ybWF0LCBHTGVudW0gZmJfdHlwZSwKKwkJIGNvbnN0IHVfaW50OF90ICogZGVwdGhfYml0cywgY29uc3QgdV9pbnQ4X3QgKiBzdGVuY2lsX2JpdHMsCisJCSB1bnNpZ25lZCBudW1fZGVwdGhfc3RlbmNpbF9iaXRzLAorCQkgY29uc3QgR0xlbnVtICogZGJfbW9kZXMsIHVuc2lnbmVkIG51bV9kYl9tb2Rlcyk7CisKK2NvbnN0IF9fRFJJY29uZmlnICoqZHJpQ29uY2F0Q29uZmlncyhfX0RSSWNvbmZpZyAqKmEsIF9fRFJJY29uZmlnICoqYik7CisKK2ludAorZHJpR2V0Q29uZmlnQXR0cmliKGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCSAgIHVuc2lnbmVkIGludCBhdHRyaWIsIHVuc2lnbmVkIGludCAqdmFsdWUpOworaW50CitkcmlJbmRleENvbmZpZ0F0dHJpYihjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLCBpbnQgaW5kZXgsCisJCSAgICAgdW5zaWduZWQgaW50ICphdHRyaWIsIHVuc2lnbmVkIGludCAqdmFsdWUpOwogCiAjZW5kaWYgLyogRFJJX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi92YmxhbmsuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi92YmxhbmsuYwppbmRleCAwOTQ5NTBkLi4wMDA4YWIxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vdmJsYW5rLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3ZibGFuay5jCkBAIC0zNCw2ICszNCwxNiBAQAogI2luY2x1ZGUgInZibGFuay5oIgogI2luY2x1ZGUgInhtbHBvb2wuaCIKIAorc3RhdGljIHVuc2lnbmVkIGludCBtc2NfdG9fdmJsYW5rKF9fRFJJZHJhd2FibGVQcml2YXRlICogZFByaXYsIGludDY0X3QgbXNjKQoreworICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKG1zYyAtIGRQcml2LT5tc2NfYmFzZSArIGRQcml2LT52YmxhbmtfYmFzZSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHZibGFua190b19tc2MoX19EUklkcmF3YWJsZVByaXZhdGUgKiBkUHJpdiwgdW5zaWduZWQgaW50IHZibGFuaykKK3sKKyAgIHJldHVybiAoaW50NjRfdCkodmJsYW5rIC0gZFByaXYtPnZibGFua19iYXNlICsgZFByaXYtPm1zY19iYXNlKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgpAQCAtNDEsNyArNTEsNyBAQAogICoKICAqIFN0b3JlcyB0aGUgNjQtYml0IGNvdW50IG9mIHZlcnRpY2FsIHJlZnJlc2hlcyBzaW5jZSBzb21lIChhcmJpdHJhcnkpCiAgKiBwb2ludCBpbiB0aW1lIGluIFxjIGNvdW50LiAgVW5sZXNzIHRoZSB2YWx1ZSB3cmFwcyBhcm91bmQsIHdoaWNoIGl0Ci0gKiBtYXksIGl0IHdpbGwgbmV2ZXIgZGVjcmVhc2UuCisgKiBtYXksIGl0IHdpbGwgbmV2ZXIgZGVjcmVhc2UgZm9yIGEgZ2l2ZW4gZHJhd2FibGUuCiAgKgogICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBcYyBnbFhHZXRWaWRlb1N5bmNTR0ksIHdoaWNoIGV4cGVjdHMKICAqIGEgXGMgY291bnQgb2YgdHlwZSBcYyB1bnNpZ25lZCAoMzItYml0KSwgYW5kIFxjIGdsWEdldFN5bmNWYWx1ZXNPTUwsIHdoaWNoIApAQCAtNDksMTEgKzU5LDE0IEBACiAgKiBjdXJyZW50bHkgYWx3YXlzIHJldHVybnMgYSBcYyBzZXF1ZW5jZSBvZiB0eXBlIFxjIHVuc2lnbmVkLgogICoKICAqIFxwYXJhbSBwcml2ICAgUG9pbnRlciB0byB0aGUgRFJJIHNjcmVlbiBwcml2YXRlIHN0cnVjdC4KKyAqIFxwYXJhbSBkUHJpdiAgUG9pbnRlciB0byB0aGUgRFJJIGRyYXdhYmxlIHByaXZhdGUgc3RydWN0CiAgKiBccGFyYW0gY291bnQgIFN0b3JhZ2UgdG8gaG9sZCBNU0MgY291bnRlci4KICAqIFxyZXR1cm4gICAgICAgWmVybyBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgQSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQogICogICAgICAgICAgICAgICBpcyByZXR1cm5lZCBvbiBmYWlsdXJlLgogICovCi1pbnQgZHJpR2V0TVNDMzIoIF9fRFJJc2NyZWVuUHJpdmF0ZSAqIHByaXYsIGludDY0X3QgKiBjb3VudCApCitpbnQgZHJpRHJhd2FibGVHZXRNU0MzMiggX19EUklzY3JlZW5Qcml2YXRlICogcHJpdiwKKwkJCSBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2LAorCQkJIGludDY0X3QgKiBjb3VudCkKIHsKICAgIGRybVZCbGFuayB2Ymw7CiAgICBpbnQgcmV0OwpAQCAtNjIsMTQgKzc1LDIxIEBACiAKICAgIHZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX1JFTEFUSVZFOwogICAgdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSAwOworICAgaWYgKCBkUHJpdiAmJiBkUHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKQorICAgICAgdmJsLnJlcXVlc3QudHlwZSB8PSBEUk1fVkJMQU5LX1NFQ09OREFSWTsKIAogICAgcmV0ID0gZHJtV2FpdFZCbGFuayggcHJpdi0+ZmQsICZ2YmwgKTsKLSAgICpjb3VudCA9IChpbnQ2NF90KXZibC5yZXBseS5zZXF1ZW5jZTsKKworICAgaWYgKGRQcml2KSB7CisgICAgICAqY291bnQgPSB2YmxhbmtfdG9fbXNjKGRQcml2LCB2YmwucmVwbHkuc2VxdWVuY2UpOworICAgfSBlbHNlIHsKKyAgICAgIC8qIE9sZCBkcml2ZXIgKG5vIGtub3dsZWRnZSBvZiBkcmF3YWJsZSBNU0MgY2FsbGJhY2spICovCisgICAgICAqY291bnQgPSB2YmwucmVwbHkuc2VxdWVuY2U7CisgICB9CiAKICAgIHJldHVybiByZXQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKICAqIFdhaXQgZm9yIGEgc3BlY2lmaWVkIHJlZnJlc2ggY291bnQuICBUaGlzIGltcGxlbWVudHMgbW9zdCBvZiB0aGUKQEAgLTEyMiw3ICsxNDIsOSBAQAogICAgICAgICAgICovCiAgICAgICAgICB2YmwucmVxdWVzdC50eXBlID0gZG9udF93YWl0ID8gRFJNX1ZCTEFOS19SRUxBVElWRSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJNX1ZCTEFOS19BQlNPTFVURTsKLSAgICAgICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gbmV4dDsKKyAgICAgICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gbmV4dCA/IG1zY190b192YmxhbmsocHJpdiwgbmV4dCkgOiAwOworCSBpZiAoIHByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkKKwkgICAgdmJsLnJlcXVlc3QudHlwZSB8PSBEUk1fVkJMQU5LX1NFQ09OREFSWTsKIAogCSBpZiAoIGRybVdhaXRWQmxhbmsoIHByaXYtPmRyaVNjcmVlblByaXYtPmZkLCAmdmJsICkgIT0gMCApIHsKIAkgICAgLyogRklYTUU6IFRoaXMgZG9lc24ndCBzZWVtIGxpa2UgdGhlIHJpZ2h0IHRoaW5nIHRvIHJldHVybiBoZXJlLgpAQCAtMTMwLDggKzE1MiwxMCBAQAogCSAgICByZXR1cm4gR0xYX0JBRF9DT05URVhUOwogCSB9CiAKKwkgKm1zYyA9IHZibGFua190b19tc2MocHJpdiwgdmJsLnJlcGx5LnNlcXVlbmNlKTsKKwogICAgICAgICAgZG9udF93YWl0ID0gMDsKLSAgICAgICAgIGlmICh0YXJnZXRfbXNjICE9IDAgJiYgdmJsLnJlcGx5LnNlcXVlbmNlID09IHRhcmdldCkKKyAgICAgICAgIGlmICh0YXJnZXRfbXNjICE9IDAgJiYgKm1zYyA9PSB0YXJnZXQpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgLyogQXNzdW1pbmcgdGhlIHdhaXQtZG9uZSB0ZXN0IGZhaWxzLCB0aGUgbmV4dCByZWZyZXNoIHRvIHdhaXQgZm9yCkBAIC0xNDEsOSArMTY1LDkgQEAKICAgICAgICAgICAqIElmIHRoaXMgcmVmcmVzaCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwgd2UgYWRkIGRpdmlzb3IgdG8gb2J0YWluIAogICAgICAgICAgICogdGhlIG5leHQgcmVmcmVzaCBhZnRlciB0aGUgY3VycmVudCBvbmUgdGhhdCB3aWxsIHNhdGlzZnkgaXQuCiAgICAgICAgICAgKi8KLSAgICAgICAgIHIgPSAodmJsLnJlcGx5LnNlcXVlbmNlICUgKHVuc2lnbmVkIGludClkaXZpc29yKTsKLSAgICAgICAgIG5leHQgPSAodmJsLnJlcGx5LnNlcXVlbmNlIC0gciArICh1bnNpZ25lZCBpbnQpcmVtYWluZGVyKTsKLSAgICAgICAgIGlmIChuZXh0IDw9IHZibC5yZXBseS5zZXF1ZW5jZSkgbmV4dCArPSAodW5zaWduZWQgaW50KWRpdmlzb3I7CisgICAgICAgICByID0gKCptc2MgJSAodW5zaWduZWQgaW50KWRpdmlzb3IpOworICAgICAgICAgbmV4dCA9ICgqbXNjIC0gciArICh1bnNpZ25lZCBpbnQpcmVtYWluZGVyKTsKKyAgICAgICAgIGlmIChuZXh0IDw9ICptc2MpIG5leHQgKz0gKHVuc2lnbmVkIGludClkaXZpc29yOwogCiAgICAgICB9IHdoaWxlICggciAhPSAodW5zaWduZWQgaW50KXJlbWFpbmRlciApOwogICAgfQpAQCAtMTUzLDcgKzE3NywxMCBAQAogICAgICAgICovCiAKICAgICAgIHZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX0FCU09MVVRFOwotICAgICAgdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSB0YXJnZXRfbXNjOworICAgICAgdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSB0YXJnZXRfbXNjID8gbXNjX3RvX3ZibGFuayhwcml2LCB0YXJnZXRfbXNjKSA6IDA7CisKKyAgICAgIGlmICggcHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKQorCSB2YmwucmVxdWVzdC50eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOwogCiAgICAgICBpZiAoIGRybVdhaXRWQmxhbmsoIHByaXYtPmRyaVNjcmVlblByaXYtPmZkLCAmdmJsICkgIT0gMCApIHsKIAkgLyogRklYTUU6IFRoaXMgZG9lc24ndCBzZWVtIGxpa2UgdGhlIHJpZ2h0IHRoaW5nIHRvIHJldHVybiBoZXJlLgpAQCAtMTYyLDggKzE4OSw4IEBACiAgICAgICB9CiAgICB9CiAKLSAgICptc2MgID0gKHRhcmdldF9tc2MgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCk7Ci0gICAqbXNjIHw9IHZibC5yZXBseS5zZXF1ZW5jZTsKKyAgICptc2MgPSB2YmxhbmtfdG9fbXNjKHByaXYsIHZibC5yZXBseS5zZXF1ZW5jZSk7CisKICAgIGlmICggKm1zYyA8IHRhcmdldF9tc2MgKSB7CiAgICAgICAqbXNjICs9IDB4MDAwMDAwMDEwMDAwMDAwMExMOwogICAgfQpAQCAtMjMyLDggKzI1OSw4IEBACiAgICAgICBpZiAoIGZpcnN0X3RpbWUgKSB7CiAJIGZwcmludGYoc3RkZXJyLCAKIAkJICIlczogZHJtV2FpdFZCbGFuayByZXR1cm5lZCAlZCwgSVJRcyBkb24ndCBzZWVtIHRvIGJlIgotCQkgIiB3b3JraW5nIGNvcnJlY3RseS5cblRyeSBydW5uaW5nIHdpdGggTElCR0xfVEhST1RUTEVfUkVGUkVTSCIKLQkJICIgYW5kIExJQkxfU1lOQ19SRUZSRVNIIHVuc2V0LlxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCQkgIiB3b3JraW5nIGNvcnJlY3RseS5cblRyeSBhZGp1c3RpbmcgdGhlIHZibGFua19tb2RlIgorCQkgIiBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKIAkgZmlyc3RfdGltZSA9IEdMX0ZBTFNFOwogICAgICAgfQogCkBAIC0yNDcsNDAgKzI3NCwxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgotICogU2V0cyB0aGUgZGVmYXVsdCBzd2FwIGludGVydmFsIHdoZW4gdGhlIGRyYXdhYmxlIGlzIGZpcnN0IGJvdW5kIHRvIGEKLSAqIGRpcmVjdCByZW5kZXJpbmcgY29udGV4dC4KKyAqIFJldHVybnMgdGhlIGRlZmF1bHQgc3dhcCBpbnRlcnZhbCBvZiB0aGUgZ2l2ZW4gZHJhd2FibGUuCiAgKi8KIAotdm9pZCBkcmlEcmF3YWJsZUluaXRWQmxhbmsoIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2LCBHTHVpbnQgZmxhZ3MsCi0JCQkgICAgR0x1aW50ICp2Ymxfc2VxICkKK3N0YXRpYyB1bnNpZ25lZAorZHJpR2V0RGVmYXVsdFZCbGFua0ludGVydmFsKCBjb25zdCAgX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYgKQogewotICAgaWYgKCBwcml2LT5wZHJhdy0+c3dhcF9pbnRlcnZhbCA9PSAodW5zaWduZWQpLTEgKSB7Ci0gICAgICAvKiBHZXQgY3VycmVudCB2ZXJ0aWNhbCBibGFuayBzZXF1ZW5jZSAqLwotICAgICAgZHJtVkJsYW5rIHZibCA9IHsgLnJlcXVlc3Q9eyAudHlwZSA9IERSTV9WQkxBTktfUkVMQVRJVkUsIC5zZXF1ZW5jZSA9IDAgfSB9OwotICAgICAgZG9fd2FpdCggJnZibCwgdmJsX3NlcSwgcHJpdi0+ZHJpU2NyZWVuUHJpdi0+ZmQgKTsKLQotICAgICAgcHJpdi0+cGRyYXctPnN3YXBfaW50ZXJ2YWwgPSAoZmxhZ3MgJiAoVkJMQU5LX0ZMQUdfVEhST1RUTEUgfAotCQkJCQkgICAgIFZCTEFOS19GTEFHX1NZTkMpKSAhPSAwID8gMSA6IDA7Ci0gICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3dhcCBpbnRlcnZhbCBvZiB0aGUgZ2l2ZW4gZHJhd2FibGUuCi0gKi8KLQotdW5zaWduZWQKLWRyaUdldFZCbGFua0ludGVydmFsKCBjb25zdCAgX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYsIEdMdWludCBmbGFncyApCi17Ci0gICBpZiAoIChmbGFncyAmIFZCTEFOS19GTEFHX0lOVEVSVkFMKSAhPSAwICkgewotICAgICAgLyogdGhpcyBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aGVuIHRoZSBkcmF3YWJsZSB3YXMgZmlyc3QgYm91bmQKLSAgICAgICAqIHRvIGEgZGlyZWN0IHJlbmRlcmluZyBjb250ZXh0LiAqLwotICAgICAgYXNzZXJ0ICggcHJpdi0+cGRyYXctPnN3YXBfaW50ZXJ2YWwgIT0gKHVuc2lnbmVkKS0xICk7Ci0KLSAgICAgIHJldHVybiBwcml2LT5wZHJhdy0+c3dhcF9pbnRlcnZhbDsKLSAgIH0KLSAgIGVsc2UgaWYgKCAoZmxhZ3MgJiAoVkJMQU5LX0ZMQUdfVEhST1RUTEUgfCBWQkxBTktfRkxBR19TWU5DKSkgIT0gMCApIHsKKyAgIGlmICggKHByaXYtPnZibEZsYWdzICYgKFZCTEFOS19GTEFHX1RIUk9UVExFIHwgVkJMQU5LX0ZMQUdfU1lOQykpICE9IDAgKSB7CiAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewpAQCAtMjkxLDIyICsyOTEsNjYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKKyAqIFNldHMgdGhlIGRlZmF1bHQgc3dhcCBpbnRlcnZhbCB3aGVuIHRoZSBkcmF3YWJsZSBpcyBmaXJzdCBib3VuZCB0byBhCisgKiBkaXJlY3QgcmVuZGVyaW5nIGNvbnRleHQuCisgKi8KKwordm9pZCBkcmlEcmF3YWJsZUluaXRWQmxhbmsoIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2ICkKK3sKKyAgIGlmICggcHJpdi0+c3dhcF9pbnRlcnZhbCA9PSAodW5zaWduZWQpLTEgJiYKKwkhKCBwcml2LT52YmxGbGFncyAmIFZCTEFOS19GTEFHX05PX0lSUSApICkgeworICAgICAgLyogR2V0IGN1cnJlbnQgdmVydGljYWwgYmxhbmsgc2VxdWVuY2UgKi8KKyAgICAgIGRybVZCbGFuayB2Ymw7CisgCisgICAgICB2YmwucmVxdWVzdC50eXBlID0gRFJNX1ZCTEFOS19SRUxBVElWRTsKKyAgICAgIGlmICggcHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKQorIAkgdmJsLnJlcXVlc3QudHlwZSB8PSBEUk1fVkJMQU5LX1NFQ09OREFSWTsKKyAgICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gMDsKKyAgICAgIGRvX3dhaXQoICZ2YmwsICZwcml2LT52YmxTZXEsIHByaXYtPmRyaVNjcmVlblByaXYtPmZkICk7CisgICAgICBwcml2LT52YmxhbmtfYmFzZSA9IHByaXYtPnZibFNlcTsKKworICAgICAgcHJpdi0+c3dhcF9pbnRlcnZhbCA9IGRyaUdldERlZmF1bHRWQmxhbmtJbnRlcnZhbCggcHJpdiApOworICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN3YXAgaW50ZXJ2YWwgb2YgdGhlIGdpdmVuIGRyYXdhYmxlLgorICovCisKK3Vuc2lnbmVkCitkcmlHZXRWQmxhbmtJbnRlcnZhbCggY29uc3QgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2ICkKK3sKKyAgIGlmICggKHByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfSU5URVJWQUwpICE9IDAgKSB7CisgICAgICAvKiB0aGlzIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdoZW4gdGhlIGRyYXdhYmxlIHdhcyBmaXJzdCBib3VuZAorICAgICAgICogdG8gYSBkaXJlY3QgcmVuZGVyaW5nIGNvbnRleHQuICovCisgICAgICBhc3NlcnQgKCBwcml2LT5zd2FwX2ludGVydmFsICE9ICh1bnNpZ25lZCktMSApOworCisgICAgICByZXR1cm4gcHJpdi0+c3dhcF9pbnRlcnZhbDsKKyAgIH0KKyAgIGVsc2UgCisgICAgICByZXR1cm4gZHJpR2V0RGVmYXVsdFZCbGFua0ludGVydmFsKCBwcml2ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVydGljYWwgYmxhbmsgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBnaXZlbiBkcmF3YWJsZS4KICAqLwogCiB2b2lkCi1kcmlHZXRDdXJyZW50VkJsYW5rKCBjb25zdCAgX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYsIEdMdWludCBmbGFncywKLQkJICAgICBHTHVpbnQgKnZibF9zZXEgKQorZHJpR2V0Q3VycmVudFZCbGFuayggX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYgKQogewogICAgZHJtVkJsYW5rIHZibDsKIAogICAgdmJsLnJlcXVlc3QudHlwZSA9IERSTV9WQkxBTktfUkVMQVRJVkU7Ci0gICBpZiAoIGZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkgeworICAgaWYgKCBwcml2LT52YmxGbGFncyAmIFZCTEFOS19GTEFHX1NFQ09OREFSWSApIHsKICAgICAgIHZibC5yZXF1ZXN0LnR5cGUgfD0gRFJNX1ZCTEFOS19TRUNPTkRBUlk7CiAgICB9CiAgICB2YmwucmVxdWVzdC5zZXF1ZW5jZSA9IDA7CiAKLSAgICh2b2lkKSBkb193YWl0KCAmdmJsLCB2Ymxfc2VxLCBwcml2LT5kcmlTY3JlZW5Qcml2LT5mZCApOworICAgKHZvaWQpIGRvX3dhaXQoICZ2YmwsICZwcml2LT52YmxTZXEsIHByaXYtPmRyaVNjcmVlblByaXYtPmZkICk7CiB9CiAKIApAQCAtMzE0LDE5ICszNTgsMTUgQEAKIC8qKgogICogV2FpdHMgZm9yIHRoZSB2ZXJ0aWNhbCBibGFuayBmb3IgdXNlIHdpdGggZ2xYU3dhcEJ1ZmZlcnMuCiAgKiAKLSAqIFxwYXJhbSB2Ymxfc2VxICBWZXJ0aWNhbCBibGFuayBzZXF1ZW5jZSBudW1iZXIgKE1TQykgYWZ0ZXIgdGhlIGxhc3QgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgc3dhcC4gIFVwZGF0ZWQgYWZ0ZXIgdGhpcyB3YWl0LgotICogXHBhcmFtIGZsYWdzICAgIFxjIFZCTEFOS19GTEFHIGJpdHMgdGhhdCBjb250cm9sIGhvdyBsb25nIHRvIHdhaXQuCiAgKiBccGFyYW0gbWlzc2VkX2RlYWRsaW5lICBTZXQgdG8gXGMgR0xfVFJVRSBpZiB0aGUgTVNDIGFmdGVyIHdhaXRpbmcgaXMgbGF0ZXIKLSAqICAgICAgICAgICAgICAgICB0aGFuIHRoZSAidGFyZ2V0IiBiYXNlZCBvbiBcYyBmbGFncy4gIFRoZSBpZGVhIGlzIHRoYXQgaWYKLSAqICAgICAgICAgICAgICAgICBcYyBtaXNzZWRfZGVhZGxpbmUgaXMgc2V0LCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgCi0gKiAgICAgICAgICAgICAgICAgYWNoaWV2aW5nIGl0cyBkZXNpcmVkIGZyYW1lcmF0ZS4KKyAqICAgICAgICAgICAgICAgICB0aGFuIHRoZSAidGFyZ2V0IiBiYXNlZCBvbiBcYyBwcml2LT52YmxGbGFncy4gIFRoZSBpZGVhIGlzCisgKiAgICAgICAgICAgICAgICAgdGhhdCBpZiBcYyBtaXNzZWRfZGVhZGxpbmUgaXMgc2V0LCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBpcworICogICAgICAgICAgICAgICAgIG5vdCBhY2hpZXZpbmcgaXRzIGRlc2lyZWQgZnJhbWVyYXRlLgogICogXHJldHVybiAgICAgICAgIFplcm8gb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCiAgKi8KIAogaW50Ci1kcmlXYWl0Rm9yVkJsYW5rKCBjb25zdCAgX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYsIEdMdWludCAqIHZibF9zZXEsCi0JCSAgR0x1aW50IGZsYWdzLCBHTGJvb2xlYW4gKiBtaXNzZWRfZGVhZGxpbmUgKQorZHJpV2FpdEZvclZCbGFuayggX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYsIEdMYm9vbGVhbiAqIG1pc3NlZF9kZWFkbGluZSApCiB7CiAgICBkcm1WQmxhbmsgdmJsOwogICAgdW5zaWduZWQgICBvcmlnaW5hbF9zZXE7CkBAIC0zMzUsMTAgKzM3NSwxMCBAQAogICAgdW5zaWduZWQgICBkaWZmOwogCiAgICAqbWlzc2VkX2RlYWRsaW5lID0gR0xfRkFMU0U7Ci0gICBpZiAoIChmbGFncyAmIChWQkxBTktfRkxBR19JTlRFUlZBTCB8Ci0JCSAgVkJMQU5LX0ZMQUdfVEhST1RUTEUgfAotCQkgIFZCTEFOS19GTEFHX1NZTkMpKSA9PSAwIHx8Ci0JKGZsYWdzICYgVkJMQU5LX0ZMQUdfTk9fSVJRKSAhPSAwICkgeworICAgaWYgKCAocHJpdi0+dmJsRmxhZ3MgJiAoVkJMQU5LX0ZMQUdfSU5URVJWQUwgfAorCQkJICAgVkJMQU5LX0ZMQUdfVEhST1RUTEUgfAorCQkJICAgVkJMQU5LX0ZMQUdfU1lOQykpID09IDAgfHwKKwkocHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19OT19JUlEpICE9IDAgKSB7CiAgICAgICByZXR1cm4gMDsKICAgIH0KIApAQCAtMzQ5LDQ0ICszODksNDUgQEAKICAgICAqCiAgICAgKiBWQkxBTktfRkxBR19JTlRFUlZBTCBhbmQgVkJMQU5LX0ZMQUdfVEhST1RUTEUgbWVhbiB0byB3YWl0IGZvciBhdAogICAgICogbGVhc3Qgb25lIHZlcnRpY2FsIGJsYW5rIHNpbmNlIHRoZSBsYXN0IHdhaXQuICBTaW5jZSBkb193YWl0IG1vZGlmaWVzCi0gICAgKiB2Ymxfc2VxLCB3ZSBoYXZlIHRvIHNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHZibF9zZXEgZm9yIHRoZQorICAgICogcHJpdi0+dmJsU2VxLCB3ZSBoYXZlIHRvIHNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHByaXYtPnZibFNlcSBmb3IgdGhlCiAgICAgKiBWQkxBTktfRkxBR19JTlRFUlZBTCAvIFZCTEFOS19GTEFHX1RIUk9UVExFIGNhbGN1bGF0aW9uIGxhdGVyLgogICAgICovCiAKLSAgIG9yaWdpbmFsX3NlcSA9ICp2Ymxfc2VxOwotICAgaW50ZXJ2YWwgPSBkcmlHZXRWQmxhbmtJbnRlcnZhbChwcml2LCBmbGFncyk7CisgICBvcmlnaW5hbF9zZXEgPSBwcml2LT52YmxTZXE7CisgICBpbnRlcnZhbCA9IGRyaUdldFZCbGFua0ludGVydmFsKHByaXYpOwogICAgZGVhZGxpbmUgPSBvcmlnaW5hbF9zZXEgKyBpbnRlcnZhbDsKIAogICAgdmJsLnJlcXVlc3QudHlwZSA9IERSTV9WQkxBTktfUkVMQVRJVkU7Ci0gICBpZiAoIGZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkgeworICAgaWYgKCBwcml2LT52YmxGbGFncyAmIFZCTEFOS19GTEFHX1NFQ09OREFSWSApIHsKICAgICAgIHZibC5yZXF1ZXN0LnR5cGUgfD0gRFJNX1ZCTEFOS19TRUNPTkRBUlk7CiAgICB9Ci0gICB2YmwucmVxdWVzdC5zZXF1ZW5jZSA9ICgoZmxhZ3MgJiBWQkxBTktfRkxBR19TWU5DKSAhPSAwKSA/IDEgOiAwOworICAgdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSAoKHByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfU1lOQykgIT0gMCkgPyAxIDogMDsKIAotICAgaWYgKCBkb193YWl0KCAmIHZibCwgdmJsX3NlcSwgcHJpdi0+ZHJpU2NyZWVuUHJpdi0+ZmQgKSAhPSAwICkgeworICAgaWYgKCBkb193YWl0KCAmIHZibCwgJnByaXYtPnZibFNlcSwgcHJpdi0+ZHJpU2NyZWVuUHJpdi0+ZmQgKSAhPSAwICkgewogICAgICAgcmV0dXJuIC0xOwogICAgfQogCi0gICBkaWZmID0gKnZibF9zZXEgLSBkZWFkbGluZTsKKyAgIGRpZmYgPSBwcml2LT52YmxTZXEgLSBkZWFkbGluZTsKIAogICAgLyogTm8gbmVlZCB0byB3YWl0IGFnYWluIGlmIHdlJ3ZlIGFscmVhZHkgcmVhY2hlZCB0aGUgdGFyZ2V0ICovCiAgICBpZiAoZGlmZiA8PSAoMSA8PCAyMykpIHsKLSAgICAgICptaXNzZWRfZGVhZGxpbmUgPSAoZmxhZ3MgJiBWQkxBTktfRkxBR19TWU5DKSA/IChkaWZmID4gMCkgOiBHTF9UUlVFOworICAgICAgKm1pc3NlZF9kZWFkbGluZSA9IChwcml2LT52YmxGbGFncyAmIFZCTEFOS19GTEFHX1NZTkMpID8gKGRpZmYgPiAwKSA6CisJCQkgR0xfVFJVRTsKICAgICAgIHJldHVybiAwOwogICAgfQogCiAgICAvKiBXYWl0IHVudGlsIHRoZSB0YXJnZXQgdmVydGljYWwgYmxhbmsuICovCiAgICB2YmwucmVxdWVzdC50eXBlID0gRFJNX1ZCTEFOS19BQlNPTFVURTsKLSAgIGlmICggZmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKSB7CisgICBpZiAoIHByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkgewogICAgICAgdmJsLnJlcXVlc3QudHlwZSB8PSBEUk1fVkJMQU5LX1NFQ09OREFSWTsKICAgIH0KICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gZGVhZGxpbmU7CiAKLSAgIGlmICggZG9fd2FpdCggJiB2YmwsIHZibF9zZXEsIHByaXYtPmRyaVNjcmVlblByaXYtPmZkICkgIT0gMCApIHsKKyAgIGlmICggZG9fd2FpdCggJiB2YmwsICZwcml2LT52YmxTZXEsIHByaXYtPmRyaVNjcmVlblByaXYtPmZkICkgIT0gMCApIHsKICAgICAgIHJldHVybiAtMTsKICAgIH0KIAotICAgZGlmZiA9ICp2Ymxfc2VxIC0gZGVhZGxpbmU7CisgICBkaWZmID0gcHJpdi0+dmJsU2VxIC0gZGVhZGxpbmU7CiAgICAqbWlzc2VkX2RlYWRsaW5lID0gZGlmZiA+IDAgJiYgZGlmZiA8PSAoMSA8PCAyMyk7CiAKICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3ZibGFuay5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3ZibGFuay5oCmluZGV4IDUyYzE5MzMuLmIzYTBkYWQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi92YmxhbmsuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24vdmJsYW5rLmgKQEAgLTQ1LDE3ICs0NSwxNyBAQAogCQkJCQkgICovCiAKIGV4dGVybiBpbnQgZHJpR2V0TVNDMzIoIF9fRFJJc2NyZWVuUHJpdmF0ZSAqIHByaXYsIGludDY0X3QgKiBjb3VudCApOworZXh0ZXJuIGludCBkcmlEcmF3YWJsZUdldE1TQzMyKCBfX0RSSXNjcmVlblByaXZhdGUgKiBwcml2LAorCQkJCV9fRFJJZHJhd2FibGVQcml2YXRlICogZHJhd2FibGVQcml2YXRlLAorCQkJCWludDY0X3QgKiBjb3VudCk7CiBleHRlcm4gaW50IGRyaVdhaXRGb3JNU0MzMiggX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYsCiAgICAgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyLCBpbnQ2NF90ICogbXNjICk7CiBleHRlcm4gR0x1aW50IGRyaUdldERlZmF1bHRWQmxhbmtGbGFncyggY29uc3QgZHJpT3B0aW9uQ2FjaGUgKm9wdGlvbkNhY2hlICk7Ci1leHRlcm4gdm9pZCBkcmlEcmF3YWJsZUluaXRWQmxhbmsgKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJpdiwgR0x1aW50IGZsYWdzLAotCQkJCSAgICBHTHVpbnQgKnZibF9zZXEgKTsKLWV4dGVybiB1bnNpZ25lZCBkcmlHZXRWQmxhbmtJbnRlcnZhbCggY29uc3QgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2LAotCQkJCSAgICAgIEdMdWludCBmbGFncyApOwotZXh0ZXJuIHZvaWQgZHJpR2V0Q3VycmVudFZCbGFuayggY29uc3QgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2LAotCQkJCSBHTHVpbnQgZmxhZ3MsIEdMdWludCAqdmJsX3NlcSApOwotZXh0ZXJuIGludCBkcmlXYWl0Rm9yVkJsYW5rKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJpdiwKLSAgICBHTHVpbnQgKiB2Ymxfc2VxLCBHTHVpbnQgZmxhZ3MsIEdMYm9vbGVhbiAqIG1pc3NlZF9kZWFkbGluZSApOworZXh0ZXJuIHZvaWQgZHJpRHJhd2FibGVJbml0VkJsYW5rICggX19EUklkcmF3YWJsZVByaXZhdGUgKnByaXYgKTsKK2V4dGVybiB1bnNpZ25lZCBkcmlHZXRWQmxhbmtJbnRlcnZhbCggY29uc3QgIF9fRFJJZHJhd2FibGVQcml2YXRlICpwcml2ICk7CitleHRlcm4gdm9pZCBkcmlHZXRDdXJyZW50VkJsYW5rKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJpdiApOworZXh0ZXJuIGludCBkcmlXYWl0Rm9yVkJsYW5rKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqcHJpdiwKKwkJCSAgICAgR0xib29sZWFuICogbWlzc2VkX2RlYWRsaW5lICk7CiAKICN1bmRlZiB1c2xlZXAKICNpbmNsdWRlIDx1bmlzdGQuaD4gIC8qIGZvciB1c2xlZXAoKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3htbGNvbmZpZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3htbGNvbmZpZy5jCmluZGV4IGI2MzU4OTQuLmY2YWU3NTUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2NvbW1vbi94bWxjb25maWcuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24veG1sY29uZmlnLmMKQEAgLTYzLDYgKzYzLDEyIEBACiAjZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pICYmIGRlZmluZWQoX19OZXRCU0RfVmVyc2lvbikgJiYgKF9fTmV0QlNEX1ZlcnNpb24gPj0gMTA2MDAwMTAwKQogIyAgICBpbmNsdWRlIDxzdGRsaWIuaD4KICMgICAgZGVmaW5lIEdFVF9QUk9HUkFNX05BTUUoKSBnZXRwcm9nbmFtZSgpCisjZWxpZiBkZWZpbmVkKF9fc3VuKQorLyogU29sYXJpcyBoYXMgZ2V0ZXhlY25hbWUoKSB3aGljaCByZXR1cm5zIHRoZSBmdWxsIHBhdGggLSByZXR1cm4ganVzdAorICAgdGhlIGJhc2VuYW1lIHRvIG1hdGNoIEJTRCBnZXRwcm9nbmFtZSgpICovCisjICAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgICBpbmNsdWRlIDxsaWJnZW4uaD4KKyMgICAgZGVmaW5lIEdFVF9QUk9HUkFNX05BTUUoKSBiYXNlbmFtZShnZXRleGVjbmFtZSgpKQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChHRVRfUFJPR1JBTV9OQU1FKQpAQCAtMjc5LDcgKzI4NSw3IEBACiAvKiogXGJyaWVmIFBhcnNlIGEgdmFsdWUgb2YgYSBnaXZlbiB0eXBlLiAqLwogc3RhdGljIEdMYm9vbGVhbiBwYXJzZVZhbHVlIChkcmlPcHRpb25WYWx1ZSAqdiwgZHJpT3B0aW9uVHlwZSB0eXBlLAogCQkJICAgICBjb25zdCBYTUxfQ2hhciAqc3RyaW5nKSB7Ci0gICAgY29uc3QgWE1MX0NoYXIgKnRhaWw7CisgICAgY29uc3QgWE1MX0NoYXIgKnRhaWwgPSBOVUxMOwogICAvKiBza2lwIGxlYWRpbmcgd2hpdGUtc3BhY2UgKi8KICAgICBzdHJpbmcgKz0gc3Ryc3BuIChzdHJpbmcsICIgXGZcblxyXHRcdiIpOwogICAgIHN3aXRjaCAodHlwZSkgewpAQCAtNDAzLDQwICs0MDksNDAgQEAKIC8qKiBcYnJpZWYgT3V0cHV0IGEgd2FybmluZyBtZXNzYWdlLiAqLwogI2RlZmluZSBYTUxfV0FSTklORzEobXNnKSBkbyB7XAogICAgIF9fZHJpVXRpbE1lc3NhZ2UgKCJXYXJuaW5nIGluICVzIGxpbmUgJWQsIGNvbHVtbiAlZDogIm1zZywgZGF0YS0+bmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihkYXRhLT5wYXJzZXIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoZGF0YS0+cGFyc2VyKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoZGF0YS0+cGFyc2VyKSwgXAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKGRhdGEtPnBhcnNlcikpOyBcCiB9IHdoaWxlICgwKQogI2RlZmluZSBYTUxfV0FSTklORyhtc2csYXJncy4uLikgZG8geyBcCiAgICAgX19kcmlVdGlsTWVzc2FnZSAoIldhcm5pbmcgaW4gJXMgbGluZSAlZCwgY29sdW1uICVkOiAibXNnLCBkYXRhLT5uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKGRhdGEtPnBhcnNlciksIFwKLSAgICAgICAgICAgICAgICAgICAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihkYXRhLT5wYXJzZXIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgKGludCkgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKGRhdGEtPnBhcnNlciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihkYXRhLT5wYXJzZXIpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgYXJncyk7IFwKIH0gd2hpbGUgKDApCiAvKiogXGJyaWVmIE91dHB1dCBhbiBlcnJvciBtZXNzYWdlLiAqLwogI2RlZmluZSBYTUxfRVJST1IxKG1zZykgZG8geyBcCiAgICAgX19kcmlVdGlsTWVzc2FnZSAoIkVycm9yIGluICVzIGxpbmUgJWQsIGNvbHVtbiAlZDogIm1zZywgZGF0YS0+bmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihkYXRhLT5wYXJzZXIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoZGF0YS0+cGFyc2VyKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoZGF0YS0+cGFyc2VyKSwgXAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKGRhdGEtPnBhcnNlcikpOyBcCiB9IHdoaWxlICgwKQogI2RlZmluZSBYTUxfRVJST1IobXNnLGFyZ3MuLi4pIGRvIHsgXAogICAgIF9fZHJpVXRpbE1lc3NhZ2UgKCJFcnJvciBpbiAlcyBsaW5lICVkLCBjb2x1bW4gJWQ6ICJtc2csIGRhdGEtPm5hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoZGF0YS0+cGFyc2VyKSwgXAotICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKGRhdGEtPnBhcnNlciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoZGF0YS0+cGFyc2VyKSwgXAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKGRhdGEtPnBhcnNlciksIFwKICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsgXAogfSB3aGlsZSAoMCkKIC8qKiBcYnJpZWYgT3V0cHV0IGEgZmF0YWwgZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQuICovCiAjZGVmaW5lIFhNTF9GQVRBTDEobXNnKSBkbyB7IFwKICAgICBmcHJpbnRmIChzdGRlcnIsICJGYXRhbCBlcnJvciBpbiAlcyBsaW5lICVkLCBjb2x1bW4gJWQ6ICJtc2ciXG4iLCBcCiAgICAgICAgICAgICAgZGF0YS0+bmFtZSwgXAotICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihkYXRhLT5wYXJzZXIpLCBcCi0gICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoZGF0YS0+cGFyc2VyKSk7IFwKKyAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoZGF0YS0+cGFyc2VyKSwJXAorICAgICAgICAgICAgIChpbnQpIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKGRhdGEtPnBhcnNlcikpOyBcCiAgICAgYWJvcnQoKTtcCiB9IHdoaWxlICgwKQogI2RlZmluZSBYTUxfRkFUQUwobXNnLGFyZ3MuLi4pIGRvIHsgXAogICAgIGZwcmludGYgKHN0ZGVyciwgIkZhdGFsIGVycm9yIGluICVzIGxpbmUgJWQsIGNvbHVtbiAlZDogIm1zZyJcbiIsIFwKICAgICAgICAgICAgICBkYXRhLT5uYW1lLCBcCi0gICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKGRhdGEtPnBhcnNlciksIFwKLSAgICAgICAgICAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihkYXRhLT5wYXJzZXIpLCBcCisgICAgICAgICAgICAgKGludCkgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKGRhdGEtPnBhcnNlciksCVwKKyAgICAgICAgICAgICAoaW50KSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihkYXRhLT5wYXJzZXIpLAkJXAogICAgICAgICAgICAgIGFyZ3MpOyBcCiAgICAgYWJvcnQoKTtcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvY29tbW9uL3htbHBvb2wvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24veG1scG9vbC9NYWtlZmlsZQppbmRleCBiMDc3ODA5Li42MmVjOTE5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24veG1scG9vbC9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9jb21tb24veG1scG9vbC9NYWtlZmlsZQpAQCAtNTcsOCArNTcsOCBAQAogIyBPbmx5IGludGVybWVkaWF0ZSBmaWxlcyBhcmUgY2xlYW5lZCB1cC4gb3B0aW9ucy5oIGlzIG5vdCBkZWxldGVkIGJlY2F1c2UKICMgaXQncyBpbiBDVlMuIAogY2xlYW46Ci0Jcm0gLWYgJChQT1QpICp+Ci0Jcm0gLXJmICQoTEFOR1MpCisJLXJtIC1mICQoUE9UKSAqfgorCS1ybSAtcmYgJChMQU5HUykKIAogIyBEZWZhdWx0IHRhcmdldCBvcHRpb25zLmgKIG9wdGlvbnMuaDogdF9vcHRpb25zLmggbW8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2RyaS5wYy5pbiBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2RyaS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdlZTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvZHJpLnBjLmluCkBAIC0wLDAgKzEsMTAgQEAKK3ByZWZpeD1ASU5TVEFMTF9ESVJACitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj1ASU5TVEFMTF9MSUJfRElSQAoraW5jbHVkZWRpcj1ASU5TVEFMTF9JTkNfRElSQAorZHJpZHJpdmVyZGlyPUBEUklfRFJJVkVSX0RJUkAKKworTmFtZTogZHJpCitEZXNjcmlwdGlvbjogRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZQorVmVyc2lvbjogQFZFUlNJT05ACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZmIvZmJfZHJpLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mYi9mYl9kcmkuYwppbmRleCA1MjNhMGMwLi5kM2E5MzZkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mYi9mYl9kcmkuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mYi9mYl9kcmkuYwpAQCAtNjU3LDggKzY1Nyw5IEBACiB9OwogCiBzdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi1mYkZpbGxJbk1vZGVzKCB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyICkKK2ZiRmlsbEluTW9kZXMoIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwLAorCSAgICAgICB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAorCSAgICAgICB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyICkKIHsKICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlczsKICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtOwpAQCAtNzA1LDcgKzcwNiw3IEBACiAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwogICAgfQogCi0gICBtb2RlcyA9ICgqZHJpX2ludGVyZmFjZS0+Y3JlYXRlQ29udGV4dE1vZGVzKSggbnVtX21vZGVzLCBzaXplb2YoIF9fR0xjb250ZXh0TW9kZXMgKSApOworICAgbW9kZXMgPSAoKnBzcC0+Y29udGV4dE1vZGVzLT5jcmVhdGVDb250ZXh0TW9kZXMpKCBudW1fbW9kZXMsIHNpemVvZiggX19HTGNvbnRleHRNb2RlcyApICk7CiAgICBtID0gbW9kZXM7CiAgICBpZiAoICEgZHJpRmlsbEluTW9kZXMoICYgbSwgZmJfZm9ybWF0LCBmYl90eXBlLAogICAgICAgICAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwgZGVwdGhfYnVmZmVyX2ZhY3RvciwKQEAgLTc3Niw3ICs3NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2FwaV92ZXJzaW9uLCAmZmJBUEkpOwogICAgICAgICAgIGlmICggcHNwICE9IE5VTEwgKSB7Ci0JICAgICAqZHJpdmVyX21vZGVzID0gZmJGaWxsSW5Nb2RlcyggcHNwLT5mYkJQUCwKKwkgICAgICpkcml2ZXJfbW9kZXMgPSBmYkZpbGxJbk1vZGVzKCBwc3AsIHBzcC0+ZmJCUFAsCiAJCQkJCSAgICAocHNwLT5mYkJQUCA9PSAxNikgPyAxNiA6IDI0LAogCQkJCQkgICAgKHBzcC0+ZmJCUFAgPT0gMTYpID8gMCAgOiA4LAogCQkJCQkgICAgMSk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX2NsZWFyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX2NsZWFyLmMKaW5kZXggN2RlMDViNS4uMTA0MGY0MiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl9jbGVhci5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ZmYi9mZmJfY2xlYXIuYwpAQCAtNzksNyArNzksNyBAQAogLyogQ29tcHV0ZSBmaXh1cHMgb2Ygbm9uLXBhZ2UgYWxpZ25lZCBhcmVhcyBhZnRlciBhIHBhZ2UgZmlsbC4KICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpeHVwcyBuZWVkZWQuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludAorc3RhdGljIElOTElORSBpbnQKIENyZWF0b3JDb21wdXRlUGFnZUZpbGxGaXh1cHMoc3RydWN0IGZmX2ZpeHVwcyAqZml4dXBzLAogCQkJICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKIAkJCSAgICAgaW50IHBhbGlnbmVkX3gsIGludCBwYWxpZ25lZF95LApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl9saW5ldG1wLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX2xpbmV0bXAuaAppbmRleCBlOWQ4MjYwLi4xMGUxMzc1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX2xpbmV0bXAuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX2xpbmV0bXAuaApAQCAtMSw1ICsxLDUgQEAKIAotc3RhdGljIF9faW5saW5lIHZvaWQgVEFHKGZmYl9saW5lKShHTGNvbnRleHQgKmN0eCwgZmZiX3ZlcnRleCAqdjAsIAorc3RhdGljIElOTElORSB2b2lkIFRBRyhmZmJfbGluZSkoR0xjb250ZXh0ICpjdHgsIGZmYl92ZXJ0ZXggKnYwLCAKIAkJCQkgICBmZmJfdmVydGV4ICp2MSApCiB7CiAJZmZiQ29udGV4dFB0ciBmbWVzYSA9IEZGQl9DT05URVhUKGN0eCk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX3BvaW50dG1wLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX3BvaW50dG1wLmgKaW5kZXggMmM5MTQyNi4uMzAwM2RlNyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl9wb2ludHRtcC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ZmYi9mZmJfcG9pbnR0bXAuaApAQCAtMSw1ICsxLDUgQEAKIAotc3RhdGljIF9faW5saW5lIHZvaWQgVEFHKGZmYl9kcmF3X3BvaW50KShHTGNvbnRleHQgKmN0eCwgZmZiX3ZlcnRleCAqdG1wICkKK3N0YXRpYyBJTkxJTkUgdm9pZCBUQUcoZmZiX2RyYXdfcG9pbnQpKEdMY29udGV4dCAqY3R4LCBmZmJfdmVydGV4ICp0bXAgKQogewogCWZmYkNvbnRleHRQdHIgZm1lc2EgPSBGRkJfQ09OVEVYVChjdHgpOwogCWZmYl9mYmNQdHIgZmZiID0gZm1lc2EtPnJlZ3M7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX3Z0eGZtdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl92dHhmbXQuYwppbmRleCA4YjYwZjA5Li4xZjlmZWNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX3Z0eGZtdC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ZmYi9mZmJfdnR4Zm10LmMKQEAgLTQyLDEwICs0Miw2IEBACiAKICNpbmNsdWRlICJmZmJfdnR4Zm10LmgiCiAKLSNpZm5kZWYgX19HTlVDX18KLSNkZWZpbmUgX19pbmxpbmUgIC8qKi8KLSNlbmRpZgotCiAjZGVmaW5lIFROTF9WRVJURVgJCQlmZmJUbmxWZXJ0ZXgKIAogI2RlZmluZSBJTlRFUlBfUkdCQSh0LCBvdXQsIGEsIGIpCQlcCkBAIC02MCw3ICs1Niw3IEBACiAKIC8qIENvbG9yIGZ1bmN0aW9uczogKi8KIAotc3RhdGljIF9faW5saW5lIHZvaWQgZmZiX3JlY2FsY19iYXNlX2NvbG9yKEdMY29udGV4dCAqY3R4KQorc3RhdGljIElOTElORSB2b2lkIGZmYl9yZWNhbGNfYmFzZV9jb2xvcihHTGNvbnRleHQgKmN0eCkKIHsKIAlmZmJDb250ZXh0UHRyIGZtZXNhID0gRkZCX0NPTlRFWFQoY3R4KTsKIAlzdHJ1Y3QgZ2xfbGlnaHQgKmxpZ2h0OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl94bWVzYS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvZmZiL2ZmYl94bWVzYS5jCmluZGV4IGEzMWNkNTcuLjNiN2FhNDUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ZmYi9mZmJfeG1lc2EuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9mZmIvZmZiX3htZXNhLmMKQEAgLTYwNCwzNSArNjA0LDE4IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGZmYkFQSSA9IHsKLSAgIC5Jbml0RHJpdmVyICAgICAgPSBmZmJJbml0RHJpdmVyLAotICAgLkRlc3Ryb3lTY3JlZW4gICA9IGZmYkRlc3Ryb3lTY3JlZW4sCi0gICAuQ3JlYXRlQ29udGV4dCAgID0gZmZiQ3JlYXRlQ29udGV4dCwKLSAgIC5EZXN0cm95Q29udGV4dCAgPSBmZmJEZXN0cm95Q29udGV4dCwKLSAgIC5DcmVhdGVCdWZmZXIgICAgPSBmZmJDcmVhdGVCdWZmZXIsCi0gICAuRGVzdHJveUJ1ZmZlciAgID0gZmZiRGVzdHJveUJ1ZmZlciwKLSAgIC5Td2FwQnVmZmVycyAgICAgPSBmZmJTd2FwQnVmZmVycywKLSAgIC5NYWtlQ3VycmVudCAgICAgPSBmZmJNYWtlQ3VycmVudCwKLSAgIC5VbmJpbmRDb250ZXh0ICAgPSBmZmJVbmJpbmRDb250ZXh0LAotICAgLkdldFN3YXBJbmZvICAgICA9IE5VTEwsCi0gICAuR2V0TVNDICAgICAgICAgID0gTlVMTCwKLSAgIC5XYWl0Rm9yTVNDICAgICAgPSBOVUxMLAotICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCi0gICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAotfTsKLQotCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi1mZmJGaWxsSW5Nb2RlcyggdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKLQkJIHVuc2lnbmVkIHN0ZW5jaWxfYml0cywgR0xib29sZWFuIGhhdmVfYmFja19idWZmZXIgKQorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCitmZmJGaWxsSW5Nb2RlcyggX19EUklzY3JlZW5Qcml2YXRlICpwc3AsCisJCXVuc2lnbmVkIHBpeGVsX2JpdHMsIHVuc2lnbmVkIGRlcHRoX2JpdHMsCisJCXVuc2lnbmVkIHN0ZW5jaWxfYml0cywgR0xib29sZWFuIGhhdmVfYmFja19idWZmZXIgKQogewotICAgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzOwotICAgX19HTGNvbnRleHRNb2RlcyAqIG07Ci0gICB1bnNpZ25lZCBudW1fbW9kZXM7CisgICBfX0RSSWNvbmZpZyAqKmNvbmZpZ3M7CisgICBfX0dMY29udGV4dE1vZGVzICptOwogICAgdW5zaWduZWQgZGVwdGhfYnVmZmVyX2ZhY3RvcjsKICAgIHVuc2lnbmVkIGJhY2tfYnVmZmVyX2ZhY3RvcjsKICAgIEdMZW51bSBmYl9mb3JtYXQ7CiAgICBHTGVudW0gZmJfdHlwZTsKKyAgIGludCBpOwogCiAgICAvKiBHTFhfU1dBUF9DT1BZX09NTCBpcyBvbmx5IHN1cHBvcnRlZCBiZWNhdXNlIHRoZSBGRkIgZHJpdmVyIGRvZXNuJ3QKICAgICAqIHN1cHBvcnQgcGFnZWZsaXBwaW5nIGF0IGFsbC4KQEAgLTY0NCw3ICs2MjcsNiBAQAogICAgdWludDhfdCBkZXB0aF9iaXRzX2FycmF5WzNdOwogICAgdWludDhfdCBzdGVuY2lsX2JpdHNfYXJyYXlbM107CiAKLQogICAgZGVwdGhfYml0c19hcnJheVswXSA9IDA7CiAgICBkZXB0aF9iaXRzX2FycmF5WzFdID0gZGVwdGhfYml0czsKICAgIGRlcHRoX2JpdHNfYXJyYXlbMl0gPSBkZXB0aF9iaXRzOwpAQCAtNjYwLDggKzY0Miw2IEBACiAgICBkZXB0aF9idWZmZXJfZmFjdG9yID0gKChkZXB0aF9iaXRzICE9IDApIHx8IChzdGVuY2lsX2JpdHMgIT0gMCkpID8gMyA6IDE7CiAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgID0gKGhhdmVfYmFja19idWZmZXIpID8gMyA6IDE7CiAKLSAgIG51bV9tb2RlcyA9IGRlcHRoX2J1ZmZlcl9mYWN0b3IgKiBiYWNrX2J1ZmZlcl9mYWN0b3IgKiA0OwotCiAgICAgaWYgKCBwaXhlbF9iaXRzID09IDE2ICkgewogICAgICAgICBmYl9mb3JtYXQgPSBHTF9SR0I7CiAgICAgICAgIGZiX3R5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKQEAgLTY3MSw4MiArNjUxLDY4IEBACiAgICAgICAgIGZiX3R5cGUgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY7CiAgICAgfQogCi0gICBtb2RlcyA9ICgqZHJpX2ludGVyZmFjZS0+Y3JlYXRlQ29udGV4dE1vZGVzKSggbnVtX21vZGVzLCBzaXplb2YoIF9fR0xjb250ZXh0TW9kZXMgKSApOwotICAgbSA9IG1vZGVzOwotICAgaWYgKCAhIGRyaUZpbGxJbk1vZGVzKCAmIG0sIGZiX2Zvcm1hdCwgZmJfdHlwZSwKLQkJCSAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICBHTFhfVFJVRV9DT0xPUiApICkgewotCWZwcmludGYoIHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLAotCQkgX19mdW5jX18sIF9fTElORV9fICk7Ci0JcmV0dXJuIE5VTEw7CisgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsCisJCQkgICAgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksCisJCQkgICAgICBkZXB0aF9idWZmZXJfZmFjdG9yLCBiYWNrX2J1ZmZlcl9tb2RlcywKKwkJCSAgICAgIGJhY2tfYnVmZmVyX2ZhY3Rvcik7CisgICBpZiAoY29uZmlncyA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBOVUxMOwogICAgfQotICAgaWYgKCAhIGRyaUZpbGxJbk1vZGVzKCAmIG0sIGZiX2Zvcm1hdCwgZmJfdHlwZSwKLQkJCSAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICBHTFhfRElSRUNUX0NPTE9SICkgKSB7Ci0JZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCi0JCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKLQlyZXR1cm4gTlVMTDsKLSAgIH0KLQogCiAgICAvKiBNYXJrIHRoZSB2aXN1YWwgYXMgc2xvdyBpZiB0aGVyZSBhcmUgImZha2UiIHN0ZW5jaWwgYml0cy4KICAgICAqLwotICAgZm9yICggbSA9IG1vZGVzIDsgbSAhPSBOVUxMIDsgbSA9IG0tPm5leHQgKSB7Ci0gICAgICBpZiAoIChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSApIHsKLQkgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOworICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisgICAgICBtID0gJmNvbmZpZ3NbaV0tPm1vZGVzOworICAgICAgaWYgKChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSkgeworICAgICAgICAgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOwogICAgICAgfQogICAgfQogCi0gICByZXR1cm4gbW9kZXM7CisgICByZXR1cm4gKGNvbnN0IF9fRFJJY29uZmlnICoqKSBjb25maWdzOwogfQogCiAKIC8qKgotICogVGhpcyBpcyB0aGUgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciB0aGUgZHJpdmVyLiAgbGliR0wgc3VwcGxpZXMgYWxsIG9mIHRoZQotICogcmVxdWlzaXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0sIGFuZCB0aGUgZHJpdmVyIGluaXRpYWxpemVzIGl0c2VsZi4KLSAqIFRoaXMgcm91dGluZSBhbHNvIGZpbGxzIGluIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVkIHRvIGJ5IFxjIGRyaXZlcl9tb2RlcwotICogd2l0aCB0aGUgXGMgX19HTGNvbnRleHRNb2RlcyB0aGF0IHRoZSBkcml2ZXIgY2FuIHN1cHBvcnQgZm9yIHdpbmRvd3Mgb3IKLSAqIHBidWZmZXJzLgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KICAqIAotICogXHJldHVybiBBIHBvaW50ZXIgdG8gYSBcYyBfX0RSSXNjcmVlblByaXZhdGUgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiAKLSAqICAgICAgICAgZmFpbHVyZS4KKyAqIFx0b2RvIG1heWJlIGZvbGQgdGhpcyBpbnRvIGludGVsSW5pdERyaXZlcgorICoKKyAqIFxyZXR1cm4gdGhlIF9fR0xjb250ZXh0TW9kZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCiAgKi8KLVBVQkxJQwotdm9pZCAqIF9fZHJpQ3JlYXRlTmV3U2NyZWVuXzIwMDUwNzI3KCBfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIF9fRFJJc2NyZWVuICpwc2MsCi0JCQkgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlcywKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZGR4X3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRyaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcm1fdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklmcmFtZWJ1ZmZlciAqIGZyYW1lX2J1ZmZlciwKLQkJCSAgICAgZHJtQWRkcmVzcyBwU0FSRUEsIGludCBmZCwgCi0JCQkgICAgIGludCBpbnRlcm5hbF9hcGlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotCQkJICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCi0JCQkgICAgIAorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCitmZmJJbml0U2NyZWVuKF9fRFJJc2NyZWVuICpwc3ApCiB7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0geyAwLCAxLCAxIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRyaV9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OwogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcm1fZXhwZWN0ZWQgPSB7IDAsIDAsIDEgfTsKIAotICAgZHJpX2ludGVyZmFjZSA9IGludGVyZmFjZTsKLQogICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiZmZiIiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgeworCQkJCSAgICAgICZwc3AtPmRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKQogICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9CiAKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJmZmYkFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgKmRyaXZlcl9tb2RlcyA9IGZmYkZpbGxJbk1vZGVzKCAzMiwgMTYsIDAsIEdMX1RSVUUgKTsKLSAgIH0KKyAgIGlmICghZmZiSW5pdERyaXZlcihwc3ApKQorICAgICAgIHJldHVybiBOVUxMOwogCi0gICByZXR1cm4gKHZvaWQgKikgcHNwOworICAgcmV0dXJuIGZmYkZpbGxJbk1vZGVzKCBwc3AsIDMyLCAxNiwgMCwgR0xfVFJVRSApOwogfQorCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4gICAgICA9IGZmYkluaXRTY3JlZW4sCisgICAuRGVzdHJveVNjcmVlbiAgID0gZmZiRGVzdHJveVNjcmVlbiwKKyAgIC5DcmVhdGVDb250ZXh0ICAgPSBmZmJDcmVhdGVDb250ZXh0LAorICAgLkRlc3Ryb3lDb250ZXh0ICA9IGZmYkRlc3Ryb3lDb250ZXh0LAorICAgLkNyZWF0ZUJ1ZmZlciAgICA9IGZmYkNyZWF0ZUJ1ZmZlciwKKyAgIC5EZXN0cm95QnVmZmVyICAgPSBmZmJEZXN0cm95QnVmZmVyLAorICAgLlN3YXBCdWZmZXJzICAgICA9IGZmYlN3YXBCdWZmZXJzLAorICAgLk1ha2VDdXJyZW50ICAgICA9IGZmYk1ha2VDdXJyZW50LAorICAgLlVuYmluZENvbnRleHQgICA9IGZmYlVuYmluZENvbnRleHQsCisgICAuR2V0U3dhcEluZm8gICAgID0gTlVMTCwKKyAgIC5HZXREcmF3YWJsZU1TQyAgPSBOVUxMLAorICAgLldhaXRGb3JNU0MgICAgICA9IE5VTEwsCisgICAuV2FpdEZvclNCQyAgICAgID0gTlVMTCwKKyAgIC5Td2FwQnVmZmVyc01TQyAgPSBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2FtbWEvZ2FtbWFfY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2FtbWEvZ2FtbWFfY29udGV4dC5oCmluZGV4IDg2YWY2NzQuLjVmNGNlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2dhbW1hL2dhbW1hX2NvbnRleHQuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9jb250ZXh0LmgKQEAgLTM4Myw3ICszODMsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgVGV4dHVyZUNvdW50OwogfTsKIAotc3RhdGljIF9faW5saW5lIEdMdWludCBnYW1tYVBhY2tDb2xvciggR0x1aW50IGNwcCwKK3N0YXRpYyBJTkxJTkUgR0x1aW50IGdhbW1hUGFja0NvbG9yKCBHTHVpbnQgY3BwLAogCQkJCQlHTHVieXRlIHIsIEdMdWJ5dGUgZywKIAkJCQkJR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQogewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2FtbWEvZ2FtbWFfcmVuZGVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9yZW5kZXIuYwppbmRleCA5MTgwZWY5Li4yMTFkNzc4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9yZW5kZXIuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9yZW5kZXIuYwpAQCAtMTI5LDEzICsxMjksMTMgQEAKICAgIEJfUHJpbVR5cGVfUG9seWdvbgogfTsKIAotc3RhdGljIF9faW5saW5lIHZvaWQgZ2FtbWFTdGFydFByaW1pdGl2ZSggZ2FtbWFDb250ZXh0UHRyIGdtZXNhLCBHTGVudW0gcHJpbSApCitzdGF0aWMgSU5MSU5FIHZvaWQgZ2FtbWFTdGFydFByaW1pdGl2ZSggZ2FtbWFDb250ZXh0UHRyIGdtZXNhLCBHTGVudW0gcHJpbSApCiB7CiAgICBDSEVDS19ETUFfQlVGRkVSKGdtZXNhLCAxKTsKICAgIFdSSVRFKGdtZXNhLT5idWYsIEJlZ2luLCBnbWVzYS0+QmVnaW4gfCBod19wcmltW3ByaW1dKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgZ2FtbWFFbmRQcmltaXRpdmUoIGdhbW1hQ29udGV4dFB0ciBnbWVzYSApCitzdGF0aWMgSU5MSU5FIHZvaWQgZ2FtbWFFbmRQcmltaXRpdmUoIGdhbW1hQ29udGV4dFB0ciBnbWVzYSApCiB7CiAgICBHTGNvbnRleHQgKmN0eCA9IGdtZXNhLT5nbEN0eDsKIApAQCAtMTkzLDcgKzE5Myw3IEBACiAKICAgIGZvciAoaSA9IDAgOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50IDsgaSsrKQogICAgewotICAgICAgR0x1aW50IHByaW0gPSBWQi0+UHJpbWl0aXZlW2ldLm1vZGU7CisgICAgICBHTHVpbnQgcHJpbSA9IF90bmxfdHJhbnNsYXRlX3ByaW0oJlZCLT5QcmltaXRpdmVbaV0pOwogICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgIEdMdWludCBsZW5ndGggPSBWQi0+UHJpbWl0aXZlW2ldLmNvdW50OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9zcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV9zcGFuLmMKaW5kZXggZWE5YTIwNS4uODFiNDYzMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2FtbWEvZ2FtbWFfc3Bhbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2dhbW1hL2dhbW1hX3NwYW4uYwpAQCAtMTExLDYgKzExMSw4IEBACiAKIC8qIDE2IGJpdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVzaG9ydAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKQlcCiAgICAqKEdMdXNob3J0ICopKGJ1ZiArIChfeCkqMiArIChfeSkqcGl0Y2gpID0gZDsKIApAQCAtMTI0LDYgKzEyNiw4IEBACiAjaWYgMCAvKiBVbnVzZWQgKi8KIC8qIDMyIGJpdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJXAogICAgKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgPSBkOwogCkBAIC0xMzcsNiArMTQxLDggQEAKIAogLyogMjQvOCBiaXQgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSB7CQkJXAogICAgR0x1aW50IHRtcCA9ICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpOwlcCiAgICB0bXAgJj0gMHhmZjsJCQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV94bWVzYS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2FtbWEvZ2FtbWFfeG1lc2EuYwppbmRleCA0YzBlYmUxLi40M2UzM2I2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9nYW1tYS9nYW1tYV94bWVzYS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2dhbW1hL2dhbW1hX3htZXNhLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZ2FtbWFBUEkgPSB7Citjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0gewogICAgZ2FtbWFJbml0RHJpdmVyLAogICAgZ2FtbWFEZXN0cm95U2NyZWVuLAogICAgZ2FtbWFDcmVhdGVDb250ZXh0LApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2xjb3JlL2dsY29yZV9kcml2ZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2dsY29yZS9nbGNvcmVfZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Nzc4MTYuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvZ2xjb3JlL2dsY29yZV9kcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgUmVkIEhhdCwgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotICogbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLSAqIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgotICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIFRoaXMgaW1wbGVtZW50cyBhIHNvZnR3YXJlLW9ubHkgIkRSSSIgZHJpdmVyLiAgSXQgZG9lc24ndCBhY3R1YWxseSBzcGVhawotICogYW55IERSSSBwcm90b2NvbCBvciB0YWxrIHRvIHRoZSBEUk0sIGl0IGp1c3QgbG9va3MgZW5vdWdoIGxpa2UgYSBEUkkgZHJpdmVyCi0gKiB0aGF0IGxpYmdseCBpbiB0aGUgc2VydmVyIGNhbiBsb2FkIGl0IGZvciBzb2Z0d2FyZSByZW5kZXJpbmcgaW4gdGhlCi0gKiB1bmFjY2VsZXJhdGVkIGNhc2UuCi0gKi8KLQotc3RhdGljIEdMYm9vbGVhbgotZ2xjb3JlSW5pdERyaXZlcihfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcmVlblByaXYpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGNvcmVEZXN0cm95U2NyZWVuKF9fRFJJU2NyZWVuUHJpdmF0ZSAqZHJpU2NyZWVuUHJpdikKLXsKLX0KLQotc3RhdGljIEdMYm9vbGVhbgotZ2xjb3JlQ3JlYXRlQ29udGV4dChjb25zdCBfX0dMY29udGV4dE1vZGVzICpnbFZpc3VhbCwKLSAgICAgICAgICAgICAgICAgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnNoYXJlZF9jb250ZXh0KQotewotfQotCi1zdGF0aWMgdm9pZAotZ2xjb3JlRGVzdHJveUNvbnRleHQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYpCi17Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLWdsY29yZUNyZWF0ZUJ1ZmZlcihfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcmVlblByaXYsCi0gICAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaURyYXdhYmxlUHJpdiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICptZXNhVmlzdWFsLAotICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBpc1BpeG1hcCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLWdsY29yZURlc3Ryb3lCdWZmZXIoX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaURyYXdhYmxlUHJpdikKLXsKLX0KLQotc3RhdGljIHZvaWQKLWdsY29yZVN3YXBCdWZmZXJzKF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3YWJsZVByaXYpCi17Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLWdsY29yZU1ha2VDdXJyZW50KF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2LAotICAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaURyYXdhYmxlUHJpdiwKLSAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlSZWFkYWJsZVByaXYpCi17Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLWdsY29yZVVuYmluZENvbnRleHQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZ2xjb3JlX2FwaSA9IHsKLSAgICAuSW5pdERyaXZlciAgICAgPSBnbGNvcmVJbml0RHJpdmVyLAotICAgIC5EZXN0cm95U2NyZWVuICA9IGdsY29yZURlc3Ryb3lTY3JlZW4sCi0gICAgLkNyZWF0ZUNvbnRleHQgID0gZ2xjb3JlQ3JlYXRlQ29udGV4dCwKLSAgICAuRGVzdHJveUNvbnRleHQgPSBnbGNvcmVEZXN0cm95Q29udGV4dCwKLSAgICAuQ3JlYXRlQnVmZmVyICAgPSBnbGNvcmVDcmVhdGVCdWZmZXIsCi0gICAgLkRlc3Ryb3lCdWZmZXIgID0gZ2xjb3JlRGVzdHJveUJ1ZmZlciwKLSAgICAuU3dhcEJ1ZmZlcnMgICAgPSBnbGNvcmVTd2FwQnVmZmVycywKLSAgICAuTWFrZUN1cnJlbnQgICAgPSBnbGNvcmVNYWtlQ3VycmVudCwKLSAgICAuVW5iaW5kQ29udGV4dCAgPSBnbGNvcmVVbmJpbmRDb250ZXh0LAotfTsgIAotCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi1nbGNvcmVGaWxsSW5Nb2Rlcyh1bnNpZ25lZCBwaXhlbF9iaXRzKQotewotfQotCi1QVUJMSUMgdm9pZCAqCi1fX2RyaUNyZWF0ZU5ld1NjcmVlbl8yMDA1MDcyNyhfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSXNjcmVlbiAqcHNjLCBjb25zdCBfX0dMY29udGV4dE1vZGVzICptb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqZGR4X3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRyaV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19EUkl2ZXJzaW9uICpkcm1fdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKmZiLCBkcm1BZGRyZXNzIHBTYXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19fRFJJaW50ZXJmYWNlTWV0aG9kcyAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19HTGNvbnRleHRNb2RlcyAqKmRyaXZlcl9tb2RlcykKLXsKLSAgICBfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcmVlblByaXY7Ci0gICAgZ2xjb3JlRHJpdmVyUHJpdmF0ZSAqZ2xjb3JlRHJpdmVyUHJpdjsKLSAgICAKLSAgICAvKiB3b3VsZCBub3JtYWxseSBjaGVjayBkZHgvZHJpL2RybSB2ZXJzaW9ucyBoZXJlICovCi0KLSAgICBkcmlTY3JlZW5Qcml2ID0gX19kcmlVdGlsQ3JlYXRlTmV3U2NyZWVuKGRweSwgc2NybiwgcHNjLCBOVUxMLCBkZHhfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaV92ZXJzaW9uLCBkcm1fdmVyc2lvbiwgZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJmdsY29yZV9hcGkpOwotICAgIGlmICghZHJpU2NyZWVuUHJpdikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBnbGNvcmVEcml2ZXJQcml2ID0gZHJpU2NyZWVuUHJpdi0+cERydlByaXY7Ci0KLSAgICAqZHJpdmVyX21vZGVzID0gZ2xjb3JlRmlsbEluTW9kZXMoZ2xjb3JlRHJpdmVyUHJpdi0+YnBwKTsKLQotICAgIGRyaUluaXRFeHRlbnNpb25zKE5VTEwsIE5VTEwsIEdMX0ZBTFNFKTsKLQotICAgIHJldHVybiBkcmlTY3JlZW5Qcml2OwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwY29udGV4dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwY29udGV4dC5jCmluZGV4IGY5MGIzNjguLmMxM2IyMWEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMGNvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBjb250ZXh0LmMKQEAgLTQyMywxMSArNDIzLDExIEBACiBzdGF0aWMgdm9pZCBpODEwWE1lc2FXaW5kb3dNb3ZlZCggaTgxMENvbnRleHRQdHIgaW1lc2EgKQogewogICAgLyogRGV0ZXJtaW5lIGN1cnJlbnQgY29sb3IgZHJhd2luZyBidWZmZXIgKi8KLSAgIHN3aXRjaCAoaW1lc2EtPmdsQ3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6CisgICBzd2l0Y2ggKGltZXNhLT5nbEN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0pIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICBpODEwWE1lc2FTZXRGcm9udENsaXBSZWN0cyggaW1lc2EgKTsKICAgICAgIGJyZWFrOwotICAgY2FzZSBCVUZGRVJfQklUX0JBQ0tfTEVGVDoKKyAgIGNhc2UgQlVGRkVSX0JBQ0tfTEVGVDoKICAgICAgIGk4MTBYTWVzYVNldEJhY2tDbGlwUmVjdHMoIGltZXNhICk7CiAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CkBAIC00ODUsMTEgKzQ4NSwxMSBAQAogICAgaW50IGZyb250ID0gMDsKIAogICAgLyogRGV0ZXJtaW5lIGN1cnJlbnQgY29sb3IgZHJhd2luZyBidWZmZXIgKi8KLSAgIHN3aXRjaCAoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6CisgICBzd2l0Y2ggKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0pIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICBmcm9udCA9IDE7CiAgICAgICBicmVhazsKLSAgIGNhc2UgQlVGRkVSX0JJVF9CQUNLX0xFRlQ6CisgICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6CiAgICAgICBmcm9udCA9IDA7CiAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBpb2N0bC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwaW9jdGwuaAppbmRleCA3NDhkMjlhLi5kZmQ2ZTIxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBpb2N0bC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMGlvY3RsLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgIH0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBfX2lubGluZSBHTHVpbnQgKmk4MTBBbGxvY0RtYUxvdyggaTgxMENvbnRleHRQdHIgaW1lc2EsIGludCBieXRlcyApCitzdGF0aWMgSU5MSU5FIEdMdWludCAqaTgxMEFsbG9jRG1hTG93KCBpODEwQ29udGV4dFB0ciBpbWVzYSwgaW50IGJ5dGVzICkKIHsKICAgIGlmIChpbWVzYS0+dmVydGV4X2xvdyArIGJ5dGVzID4gaW1lc2EtPnZlcnRleF9oaWdoKSAKICAgICAgIGk4MTBGbHVzaFByaW1zR2V0QnVmZmVyKCBpbWVzYSApOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwcmVuZGVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTByZW5kZXIuYwppbmRleCBhMzFkNTQyLi5kMDIyNTk2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTByZW5kZXIuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTByZW5kZXIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgIGZvciAoaSA9IDAgOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50IDsgaSsrKQogICAgewotICAgICAgR0x1aW50IHByaW0gPSBWQi0+UHJpbWl0aXZlW2ldLm1vZGU7CisgICAgICBHTHVpbnQgcHJpbSA9IF90bmxfdHJhbnNsYXRlX3ByaW0oJlZCLT5QcmltaXRpdmVbaV0pOwogICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgIEdMdWludCBsZW5ndGggPSBWQi0+UHJpbWl0aXZlW2ldLmNvdW50OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBzY3JlZW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHNjcmVlbi5jCmluZGV4IDczM2M5N2IuLmVhMjZlNzIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHNjcmVlbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHNjcmVlbi5jCkBAIC01NSw3NyArNTUsMTMgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNhcmRfZXh0ZW5zaW9uc1tdOwogCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqZmlsbF9pbl9tb2RlcyggX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsCi0JCQkJICAgICAgIHVuc2lnbmVkIHBpeGVsX2JpdHMsCi0JCQkJICAgICAgIHVuc2lnbmVkIGRlcHRoX2JpdHMsCi0JCQkJICAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfYml0cywKLQkJCQkgICAgICAgY29uc3QgR0xlbnVtICogZGJfbW9kZXMsCi0JCQkJICAgICAgIHVuc2lnbmVkIG51bV9kYl9tb2RlcywKLQkJCQkgICAgICAgaW50IHZpc1R5cGUgKQotewotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJpdHNbMV1bNF0gPSB7Ci0JeyAgICAgICAgICA1LCAgICAgICAgICA2LCAgICAgICAgICA1LCAgICAgICAgICAwIH0KLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1hc2tzWzFdWzRdID0gewotCXsgMHgwMDAwRjgwMCwgMHgwMDAwMDdFMCwgMHgwMDAwMDAxRiwgMHgwMDAwMDAwMCB9Ci0gICAgfTsKLQotICAgIHVuc2lnbmVkICAgaTsKLSAgICB1bnNpZ25lZCAgIGo7Ci0gICAgY29uc3QgdW5zaWduZWQgaW5kZXggPSAwOwotCi0gICAgZm9yICggaSA9IDAgOyBpIDwgbnVtX2RiX21vZGVzIDsgaSsrICkgewotCWZvciAoIGogPSAwIDsgaiA8IDIgOyBqKysgKSB7Ci0KLQkgICAgbW9kZXMtPnJlZEJpdHMgICA9IGJpdHNbaW5kZXhdWzBdOwotCSAgICBtb2Rlcy0+Z3JlZW5CaXRzID0gYml0c1tpbmRleF1bMV07Ci0JICAgIG1vZGVzLT5ibHVlQml0cyAgPSBiaXRzW2luZGV4XVsyXTsKLQkgICAgbW9kZXMtPmFscGhhQml0cyA9IGJpdHNbaW5kZXhdWzNdOwotCSAgICBtb2Rlcy0+cmVkTWFzayAgID0gbWFza3NbaW5kZXhdWzBdOwotCSAgICBtb2Rlcy0+Z3JlZW5NYXNrID0gbWFza3NbaW5kZXhdWzFdOwotCSAgICBtb2Rlcy0+Ymx1ZU1hc2sgID0gbWFza3NbaW5kZXhdWzJdOwotCSAgICBtb2Rlcy0+YWxwaGFNYXNrID0gbWFza3NbaW5kZXhdWzNdOwotCSAgICBtb2Rlcy0+cmdiQml0cyAgID0gbW9kZXMtPnJlZEJpdHMgKyBtb2Rlcy0+Z3JlZW5CaXRzCi0JCSsgbW9kZXMtPmJsdWVCaXRzICsgbW9kZXMtPmFscGhhQml0czsKLQotCSAgICBtb2Rlcy0+YWNjdW1SZWRCaXRzICAgPSAxNiAqIGo7Ci0JICAgIG1vZGVzLT5hY2N1bUdyZWVuQml0cyA9IDE2ICogajsKLQkgICAgbW9kZXMtPmFjY3VtQmx1ZUJpdHMgID0gMTYgKiBqOwotCSAgICBtb2Rlcy0+YWNjdW1BbHBoYUJpdHMgPSAobWFza3NbaW5kZXhdWzNdICE9IDApID8gMTYgKiBqIDogMDsKLQkgICAgbW9kZXMtPnZpc3VhbFJhdGluZyA9IChqID09IDApID8gR0xYX05PTkUgOiBHTFhfU0xPV19DT05GSUc7Ci0KLQkgICAgbW9kZXMtPnN0ZW5jaWxCaXRzID0gc3RlbmNpbF9iaXRzOwotCSAgICBtb2Rlcy0+ZGVwdGhCaXRzID0gZGVwdGhfYml0czsKLQotCSAgICBtb2Rlcy0+dmlzdWFsVHlwZSA9IHZpc1R5cGU7Ci0JICAgIG1vZGVzLT5yZW5kZXJUeXBlID0gR0xYX1JHQkFfQklUOwotCSAgICBtb2Rlcy0+ZHJhd2FibGVUeXBlID0gR0xYX1dJTkRPV19CSVQ7Ci0JICAgIG1vZGVzLT5yZ2JNb2RlID0gR0xfVFJVRTsKLQotCSAgICBpZiAoIGRiX21vZGVzW2ldID09IEdMWF9OT05FICkgewotCQltb2Rlcy0+ZG91YmxlQnVmZmVyTW9kZSA9IEdMX0ZBTFNFOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQltb2Rlcy0+ZG91YmxlQnVmZmVyTW9kZSA9IEdMX1RSVUU7Ci0JCW1vZGVzLT5zd2FwTWV0aG9kID0gZGJfbW9kZXNbaV07Ci0JICAgIH0KLQotCSAgICBtb2RlcyA9IG1vZGVzLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kZXM7Ci0KLX0KLQotCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi1pODEwRmlsbEluTW9kZXMoIHVuc2lnbmVkIHBpeGVsX2JpdHMsIHVuc2lnbmVkIGRlcHRoX2JpdHMsCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK2k4MTBGaWxsSW5Nb2RlcyggX19EUklzY3JlZW5Qcml2YXRlICpwc3AsCisJCSB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAogCQkgdW5zaWduZWQgc3RlbmNpbF9iaXRzLCBHTGJvb2xlYW4gaGF2ZV9iYWNrX2J1ZmZlciApCi17ICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlczsKK3sKKyAgICBfX0RSSWNvbmZpZyAqKmNvbmZpZ3M7CiAgICAgX19HTGNvbnRleHRNb2RlcyAqIG07Ci0gICAgdW5zaWduZWQgbnVtX21vZGVzOwogICAgIHVuc2lnbmVkIGRlcHRoX2J1ZmZlcl9mYWN0b3I7CiAgICAgdW5zaWduZWQgYmFja19idWZmZXJfZmFjdG9yOwogICAgIHVuc2lnbmVkIGk7CkBAIC0xMzksNTAgKzc1LDQyIEBACiAJR0xYX05PTkUsIEdMWF9TV0FQX1VOREVGSU5FRF9PTUwgLyosIEdMWF9TV0FQX0NPUFlfT01MICovCiAgICAgfTsKIAotICAgIGludCBkZXB0aF9idWZmZXJfbW9kZXNbMl1bMl07CisgICAgdV9pbnQ4X3QgZGVwdGhfYml0c19hcnJheVsyXTsKKyAgICB1X2ludDhfdCBzdGVuY2lsX2JpdHNfYXJyYXlbMl07CiAKLQotICAgIGRlcHRoX2J1ZmZlcl9tb2Rlc1swXVswXSA9IGRlcHRoX2JpdHM7Ci0gICAgZGVwdGhfYnVmZmVyX21vZGVzWzFdWzBdID0gZGVwdGhfYml0czsKKyAgICBkZXB0aF9iaXRzX2FycmF5WzBdID0gZGVwdGhfYml0czsKKyAgICBkZXB0aF9iaXRzX2FycmF5WzFdID0gZGVwdGhfYml0czsKIAogICAgIC8qIEp1c3QgbGlrZSB3aXRoIHRoZSBhY2N1bXVsYXRpb24gYnVmZmVyLCBhbHdheXMgcHJvdmlkZSBzb21lIG1vZGVzCiAgICAgICogd2l0aCBhIHN0ZW5jaWwgYnVmZmVyLiAgSXQgd2lsbCBiZSBhIHN3IGZhbGxiYWNrLCBidXQgc29tZSBhcHBzIHdvbid0CiAgICAgICogY2FyZSBhYm91dCB0aGF0LgogICAgICAqLwotICAgIGRlcHRoX2J1ZmZlcl9tb2Rlc1swXVsxXSA9IDA7Ci0gICAgZGVwdGhfYnVmZmVyX21vZGVzWzFdWzFdID0gKHN0ZW5jaWxfYml0cyA9PSAwKSA/IDggOiBzdGVuY2lsX2JpdHM7CisgICAgc3RlbmNpbF9iaXRzX2FycmF5WzBdID0gMDsKKyAgICBzdGVuY2lsX2JpdHNfYXJyYXlbMV0gPSAoc3RlbmNpbF9iaXRzID09IDApID8gOCA6IHN0ZW5jaWxfYml0czsKIAogICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IgPSAoKGRlcHRoX2JpdHMgIT0gMCkgfHwgKHN0ZW5jaWxfYml0cyAhPSAwKSkgPyAyIDogMTsKICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgID0gKGhhdmVfYmFja19idWZmZXIpID8gMiA6IDE7CiAKLSAgICBudW1fbW9kZXMgPSBkZXB0aF9idWZmZXJfZmFjdG9yICogYmFja19idWZmZXJfZmFjdG9yICogNDsKLQotICAgIG1vZGVzID0gKCpkcmlfaW50ZXJmYWNlLT5jcmVhdGVDb250ZXh0TW9kZXMpKCBudW1fbW9kZXMsIHNpemVvZiggX19HTGNvbnRleHRNb2RlcyApICk7Ci0gICAgbSA9IG1vZGVzOwotICAgIGZvciAoIGkgPSAwIDsgaSA8IGRlcHRoX2J1ZmZlcl9mYWN0b3IgOyBpKysgKSB7Ci0JbSA9IGZpbGxfaW5fbW9kZXMoIG0sIHBpeGVsX2JpdHMsCi0JCQkgICBkZXB0aF9idWZmZXJfbW9kZXNbaV1bMF0sIGRlcHRoX2J1ZmZlcl9tb2Rlc1tpXVsxXSwKLQkJCSAgIGJhY2tfYnVmZmVyX21vZGVzLCBiYWNrX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBHTFhfVFJVRV9DT0xPUiApOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwIDsgaSA8IGRlcHRoX2J1ZmZlcl9mYWN0b3IgOyBpKysgKSB7Ci0JbSA9IGZpbGxfaW5fbW9kZXMoIG0sIHBpeGVsX2JpdHMsCi0JCQkgICBkZXB0aF9idWZmZXJfbW9kZXNbaV1bMF0sIGRlcHRoX2J1ZmZlcl9tb2Rlc1tpXVsxXSwKLQkJCSAgIGJhY2tfYnVmZmVyX21vZGVzLCBiYWNrX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBHTFhfRElSRUNUX0NPTE9SICk7CisgICAgY29uZmlncyA9IGRyaUNyZWF0ZUNvbmZpZ3MoR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwKKwkJCSAgICAgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksCisJCQkgICAgICAgZGVwdGhfYnVmZmVyX2ZhY3RvciwKKwkJCSAgICAgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yKTsKKyAgICBpZiAoY29uZmlncyA9PSBOVUxMKSB7CisJZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKKwlyZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYXJrIHRoZSB2aXN1YWwgYXMgc2xvdyBpZiB0aGVyZSBhcmUgImZha2UiIHN0ZW5jaWwgYml0cy4KICAgICAgKi8KLSAgICBmb3IgKCBtID0gbW9kZXMgOyBtICE9IE5VTEwgOyBtID0gbS0+bmV4dCApIHsKLQlpZiAoIChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSApIHsKKyAgICBmb3IgKGkgPSAwOyBjb25maWdzW2ldOyBpKyspIHsKKwltID0gJmNvbmZpZ3NbaV0tPm1vZGVzOworCWlmICgobS0+c3RlbmNpbEJpdHMgIT0gMCkgJiYgKG0tPnN0ZW5jaWxCaXRzICE9IHN0ZW5jaWxfYml0cykpIHsKIAkgICAgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOwogCX0KICAgICB9CiAKLSAgICByZXR1cm4gbW9kZXM7Ci0KKyAgICByZXR1cm4gKGNvbnN0IF9fRFJJY29uZmlnICoqKSBjb25maWdzOwogfQogCiAgICAgIApAQCAtMjE4LDEyICsxNDYsMjQgQEAKIH0KIAogCi1zdGF0aWMgR0xib29sZWFuCi1pODEwSW5pdERyaXZlcihfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2KQorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCitpODEwSW5pdFNjcmVlbihfX0RSSXNjcmVlbiAqc1ByaXYpCiB7CisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRkeF9leHBlY3RlZCA9IHsgMSwgMCwgMCB9OworICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7IDQsIDAsIDAgfTsKKyAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJtX2V4cGVjdGVkID0geyAxLCAyLCAwIH07CiAgICBpODEwU2NyZWVuUHJpdmF0ZSAqaTgxMFNjcmVlbjsKICAgIEk4MTBEUklQdHIgICAgICAgICBnRFJJUHJpdiA9IChJODEwRFJJUHRyKXNQcml2LT5wRGV2UHJpdjsKIAorICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiaTgxMCIsCisJCQkJICAgICAgJnNQcml2LT5kcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCisJCQkJICAgICAgJnNQcml2LT5kZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCisJCQkJICAgICAgJnNQcml2LT5kcm1fdmVyc2lvbiwgJiBkcm1fZXhwZWN0ZWQgKSApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9UUlVFICk7CisKICAgIGlmIChzUHJpdi0+ZGV2UHJpdlNpemUgIT0gc2l6ZW9mKEk4MTBEUklSZWMpKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5FUlJPUiEgIHNpemVvZihJODEwRFJJUmVjKSBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgc2l6ZSBmcm9tIGRldmljZSBkcml2ZXJcbiIpOwogICAgICAgcmV0dXJuIEdMX0ZBTFNFOwpAQCAtMjg3LDggKzIyNyw4IEBACiAJICAgICAgaTgxMFNjcmVlbi0+ZGVwdGguaGFuZGxlLAogCSAgICAgIGk4MTBTY3JlZW4tPmRlcHRoLnNpemUsCiAJICAgICAgKGRybUFkZHJlc3MgKikmaTgxMFNjcmVlbi0+ZGVwdGgubWFwKSAhPSAwKSB7Ci0gICAgICBGUkVFKGk4MTBTY3JlZW4pOwogICAgICAgZHJtVW5tYXAoaTgxMFNjcmVlbi0+YmFjay5tYXAsIGk4MTBTY3JlZW4tPmJhY2suc2l6ZSk7CisgICAgICBGUkVFKGk4MTBTY3JlZW4pOwogICAgICAgc1ByaXYtPnByaXZhdGUgPSBOVUxMOwogICAgICAgX19kcmlVdGlsTWVzc2FnZSgiaTgxMEluaXREcml2ZXI6IGRybU1hcCAoMikgZmFpbGVkIik7CiAgICAgICByZXR1cm4gR0xfRkFMU0U7CkBAIC0zMTEsNyArMjUxLDcgQEAKIAogICAgaTgxMFNjcmVlbi0+c2FyZWFfcHJpdl9vZmZzZXQgPSBnRFJJUHJpdi0+c2FyZWFfcHJpdl9vZmZzZXQ7CiAKLSAgIHJldHVybiBHTF9UUlVFOworICAgcmV0dXJuIGk4MTBGaWxsSW5Nb2RlcyhzUHJpdiwgMTYsIDE2LCAwLCAxKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTQwMCw5ICszNDAsOCBAQAogICAgIF9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKChHTGZyYW1lYnVmZmVyICoqKSgmKGRyaURyYXdQcml2LT5kcml2ZXJQcml2YXRlKSkpOwogfQogCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgaTgxMEFQSSA9IHsKLSAgIC5Jbml0RHJpdmVyICAgICAgPSBpODEwSW5pdERyaXZlciwKK2NvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyBkcmlEcml2ZXJBUEkgPSB7CisgICAuSW5pdFNjcmVlbiAgICAgID0gaTgxMEluaXRTY3JlZW4sCiAgICAuRGVzdHJveVNjcmVlbiAgID0gaTgxMERlc3Ryb3lTY3JlZW4sCiAgICAuQ3JlYXRlQ29udGV4dCAgID0gaTgxMENyZWF0ZUNvbnRleHQsCiAgICAuRGVzdHJveUNvbnRleHQgID0gaTgxMERlc3Ryb3lDb250ZXh0LApAQCAtNDEyLDYwICszNTEsOCBAQAogICAgLk1ha2VDdXJyZW50ICAgICA9IGk4MTBNYWtlQ3VycmVudCwKICAgIC5VbmJpbmRDb250ZXh0ICAgPSBpODEwVW5iaW5kQ29udGV4dCwKICAgIC5HZXRTd2FwSW5mbyAgICAgPSBOVUxMLAotICAgLkdldE1TQyAgICAgICAgICA9IE5VTEwsCisgICAuR2V0RHJhd2FibGVNU0MgID0gTlVMTCwKICAgIC5XYWl0Rm9yTVNDICAgICAgPSBOVUxMLAogICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCiAgICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAogfTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJvb3RzdHJhcCBmdW5jdGlvbiBmb3IgdGhlIGRyaXZlci4gIGxpYkdMIHN1cHBsaWVzIGFsbCBvZiB0aGUKLSAqIHJlcXVpc2l0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLCBhbmQgdGhlIGRyaXZlciBpbml0aWFsaXplcyBpdHNlbGYuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBmaWxscyBpbiB0aGUgbGlua2VkIGxpc3QgcG9pbnRlZCB0byBieSBcYyBkcml2ZXJfbW9kZXMKLSAqIHdpdGggdGhlIFxjIF9fR0xjb250ZXh0TW9kZXMgdGhhdCB0aGUgZHJpdmVyIGNhbiBzdXBwb3J0IGZvciB3aW5kb3dzIG9yCi0gKiBwYnVmZmVycy4KLSAqCi0gKiBccmV0dXJuIEEgcG9pbnRlciB0byBhIFxjIF9fRFJJc2NyZWVuUHJpdmF0ZSBvbiBzdWNjZXNzLCBvciBcYyBOVUxMIG9uIAotICogICAgICAgICBmYWlsdXJlLgotICovCi1QVUJMSUMKLXZvaWQgKiBfX2RyaUNyZWF0ZU5ld1NjcmVlbl8yMDA1MDcyNyggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBfX0RSSXNjcmVlbiAqcHNjLAotCQkJICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICogbW9kZXMsCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRkeF92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcmlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJtX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKiBmcmFtZV9idWZmZXIsCi0JCQkgICAgIGRybUFkZHJlc3MgcFNBUkVBLCBpbnQgZmQsCi0JCQkgICAgIGludCBpbnRlcm5hbF9hcGlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotCQkJICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCi0KLXsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwOwotICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkZHhfZXhwZWN0ZWQgPSB7IDEsIDAsIDAgfTsKLSAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJpX2V4cGVjdGVkID0geyA0LCAwLCAwIH07Ci0gICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsgMSwgMiwgMCB9OwotCi0gICBkcmlfaW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCi0gICBpZiAoICEgZHJpQ2hlY2tEcmlEZHhEcm1WZXJzaW9uczIoICJpODEwIiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0KLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJmk4MTBBUEkpOwotICAgaWYgKCBwc3AgIT0gTlVMTCApIHsKLSAgICAgICpkcml2ZXJfbW9kZXMgPSBpODEwRmlsbEluTW9kZXMoIDE2LAotCQkJCSAgICAgICAxNiwgMCwKLQkJCQkgICAgICAgMSk7Ci0gICAgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9UUlVFICk7Ci0gICB9Ci0KLSAgIHJldHVybiAodm9pZCAqKSBwc3A7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBzcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBzcGFuLmMKaW5kZXggMjExMjgwMC4uNTk1MTFkZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwc3Bhbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHNwYW4uYwpAQCAtNjcsNiArNjcsOCBAQAogCiAvKiAxNiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgXAogICAgKihHTHVzaG9ydCAqKShidWYgKyAoX3gpKjIgKyAoX3kpKnBpdGNoKSAgPSBkOwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBzdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwc3RhdGUuYwppbmRleCBlMjAzYzc0Li4xNDQ2MzI0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTBzdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHN0YXRlLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCiAKLXN0YXRpYyBfX2lubGluZV9fIEdMdWludCBpODEwUGFja0NvbG9yKEdMdWludCBmb3JtYXQsCitzdGF0aWMgSU5MSU5FIEdMdWludCBpODEwUGFja0NvbG9yKEdMdWludCBmb3JtYXQsCiAJCQkJICAgICAgIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLAogCQkJCSAgICAgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSkKIHsKQEAgLTI5MSwxOCArMjkxLDIwIEBACiAgICBpODEwQ29udGV4dFB0ciBpbWVzYSA9IEk4MTBfQ09OVEVYVChjdHgpOwogICAgaW50IGZyb250ID0gMDsKICAgCi0gICAvKgotICAgICogX0RyYXdEZXN0TWFzayBpcyBlYXNpZXIgdG8gY29wZSB3aXRoIHRoYW4gPG1vZGU+LgotICAgICovCi0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzICE9IDEpIHsKKyAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLworICAgICAgRkFMTEJBQ0soIGltZXNhLCBJODEwX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0pIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgIGZyb250ID0gMTsKICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOgogICAgICBmcm9udCA9IDA7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLwogICAgICAgRkFMTEJBQ0soIGltZXNhLCBJODEwX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CiAgICAgICByZXR1cm47CiAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTB0ZXhtZW0uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHRleG1lbS5jCmluZGV4IDA4OTAwY2MuLjljMjRmY2QgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHRleG1lbS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHRleG1lbS5jCkBAIC02NCw3ICs2NCw3IEBACiAvKiBGcm9tIGxpbnV4IGtlcm5lbCBpMzg2IGhlYWRlciBmaWxlcywgY29wZXMgd2l0aCBvZGQgc2l6ZXMgYmV0dGVyCiAgKiB0aGFuIENPUFlfRFdPUkRTIHdvdWxkOgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkICogX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCitzdGF0aWMgSU5MSU5FIHZvaWQgKiBfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKIHsKIGludCBkMCwgZDEsIGQyOwogX19hc21fXyBfX3ZvbGF0aWxlX18oCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTB0cmlzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pODEwL2k4MTB0cmlzLmMKaW5kZXggNDBhYjQzNi4uMGQ1ZjVkOSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTgxMC9pODEwdHJpcy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k4MTAvaTgxMHRyaXMuYwpAQCAtNzQsNyArNzQsNyBAQAogfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGk4MTBfZHJhd190cmlhbmdsZSggaTgxMENvbnRleHRQdHIgaW1lc2EsCitzdGF0aWMgSU5MSU5FIHZvaWQgaTgxMF9kcmF3X3RyaWFuZ2xlKCBpODEwQ29udGV4dFB0ciBpbWVzYSwKIAkJCQkJICAgaTgxMFZlcnRleFB0ciB2MCwKIAkJCQkJICAgaTgxMFZlcnRleFB0ciB2MSwKIAkJCQkJICAgaTgxMFZlcnRleFB0ciB2MiApCkBAIC04OSw3ICs4OSw3IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBpODEwX2RyYXdfcXVhZCggaTgxMENvbnRleHRQdHIgaW1lc2EsCitzdGF0aWMgSU5MSU5FIHZvaWQgaTgxMF9kcmF3X3F1YWQoIGk4MTBDb250ZXh0UHRyIGltZXNhLAogCQkJCSAgICAgICBpODEwVmVydGV4UHRyIHYwLAogCQkJCSAgICAgICBpODEwVmVydGV4UHRyIHYxLAogCQkJCSAgICAgICBpODEwVmVydGV4UHRyIHYyLApAQCAtMTA4LDcgKzEwOCw3IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBpODEwX2RyYXdfcG9pbnQoIGk4MTBDb250ZXh0UHRyIGltZXNhLAorc3RhdGljIElOTElORSB2b2lkIGk4MTBfZHJhd19wb2ludCggaTgxMENvbnRleHRQdHIgaW1lc2EsCiAJCQkJCWk4MTBWZXJ0ZXhQdHIgdG1wICkKIHsKICAgIEdMZmxvYXQgc3ogPSAwLjUgKiBDTEFNUChpbWVzYS0+Z2xDdHgtPlBvaW50LlNpemUsCkBAIC0xMzIsNyArMTMyLDcgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGk4MTBfZHJhd19saW5lKCBpODEwQ29udGV4dFB0ciBpbWVzYSwKK3N0YXRpYyBJTkxJTkUgdm9pZCBpODEwX2RyYXdfbGluZSggaTgxMENvbnRleHRQdHIgaW1lc2EsCiAJCQkJICAgICAgIGk4MTBWZXJ0ZXhQdHIgdjAsCiAJCQkJICAgICAgIGk4MTBWZXJ0ZXhQdHIgdjEgKQogewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9NYWtlZmlsZSBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvTWFrZWZpbGUKaW5kZXggODA1YWJmNy4uZmQ3Nzk4MCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L01ha2VmaWxlCkBAIC03LDE2ICs3LDYgQEAKIE1JTklHTFhfU09VUkNFUyA9IHNlcnZlci9pbnRlbF9kcmkuYwogCiBEUklWRVJfU09VUkNFUyA9IFwKLQlpOTE1X2NvbnRleHQuYyBcCi0JaTkxNV9kZWJ1Zy5jIFwKLQlpOTE1X2ZyYWdwcm9nLmMgXAotCWk5MTVfbWV0YW9wcy5jIFwKLQlpOTE1X3Byb2dyYW0uYyBcCi0JaTkxNV9zdGF0ZS5jIFwKLQlpOTE1X3RleC5jIFwKLQlpOTE1X3RleHByb2cuYyBcCi0JaTkxNV90ZXhzdGF0ZS5jIFwKLQlpOTE1X3Z0YmwuYyBcCiAJaTgzMF9jb250ZXh0LmMgXAogCWk4MzBfbWV0YW9wcy5jIFwKIAlpODMwX3N0YXRlLmMgXApAQCAtMjQsMTggKzE0LDQ1IEBACiAJaTgzMF90ZXguYyBcCiAJaTgzMF90ZXhzdGF0ZS5jIFwKIAlpODMwX3Z0YmwuYyBcCi0JaW50ZWxfYmF0Y2hidWZmZXIuYyBcCi0JaW50ZWxfY29udGV4dC5jIFwKLQlpbnRlbF9pb2N0bC5jIFwKLQlpbnRlbF9waXhlbC5jIFwKIAlpbnRlbF9yZW5kZXIuYyBcCi0JaW50ZWxfcm90YXRlLmMgXAorCWludGVsX3JlZ2lvbnMuYyBcCisJaW50ZWxfYnVmZmVyX29iamVjdHMuYyBcCisJaW50ZWxfYmF0Y2hidWZmZXIuYyBcCisJaW50ZWxfbWlwbWFwX3RyZWUuYyBcCisJaTkxNV90ZXhfbGF5b3V0LmMgXAorCWludGVsX3RleF9sYXlvdXQuYyBcCisJaW50ZWxfdGV4X2ltYWdlLmMgXAorCWludGVsX3RleF9zdWJpbWFnZS5jIFwKKwlpbnRlbF90ZXhfY29weS5jIFwKKwlpbnRlbF90ZXhfdmFsaWRhdGUuYyBcCisJaW50ZWxfdGV4X2Zvcm1hdC5jIFwKKwlpbnRlbF90ZXguYyBcCisJaW50ZWxfcGl4ZWwuYyBcCisJaW50ZWxfcGl4ZWxfYml0bWFwLmMgXAorCWludGVsX3BpeGVsX2NvcHkuYyBcCisJaW50ZWxfcGl4ZWxfZHJhdy5jIFwKKwlpbnRlbF9waXhlbF9yZWFkLmMgXAorCWludGVsX2J1ZmZlcnMuYyBcCisJaW50ZWxfYmxpdC5jIFwKKwlpOTE1X3RleC5jIFwKKwlpOTE1X3RleHN0YXRlLmMgXAorCWk5MTVfY29udGV4dC5jIFwKKwlpOTE1X2RlYnVnLmMgXAorCWk5MTVfZGVidWdfZnAuYyBcCisJaTkxNV9mcmFncHJvZy5jIFwKKwlpOTE1X21ldGFvcHMuYyBcCisJaTkxNV9wcm9ncmFtLmMgXAorCWk5MTVfc3RhdGUuYyBcCisJaTkxNV92dGJsLmMgXAorCWludGVsX2NvbnRleHQuYyBcCisJaW50ZWxfZGVjb2RlLmMgXAorCWludGVsX2lvY3RsLmMgXAogCWludGVsX3NjcmVlbi5jIFwKIAlpbnRlbF9zcGFuLmMgXAogCWludGVsX3N0YXRlLmMgXAotCWludGVsX3RleC5jIFwKLQlpbnRlbF90ZXhtZW0uYyBcCi0JaW50ZWxfdHJpcy5jIAorCWludGVsX3RyaXMuYyBcCisJaW50ZWxfZmJvLmMgXAorCWludGVsX2RlcHRoc3RlbmNpbC5jCiAKIENfU09VUkNFUyA9IFwKIAkkKENPTU1PTl9TT1VSQ0VTKSBcCkBAIC00Myw4ICs2MCwxNCBAQAogCiBBU01fU09VUkNFUyA9IAogCi0KK0RSSVZFUl9ERUZJTkVTID0gLUkuLi9pbnRlbCAtSS4uL2ludGVsL3NlcnZlciAtREk5MTUgXAorCSQoc2hlbGwgcGtnLWNvbmZpZyBsaWJkcm0gLS1hdGxlYXN0LXZlcnNpb249Mi4zLjEgXAorCQkJCSYmIGVjaG8gIi1ERFJNX1ZCTEFOS19GTElQPURSTV9WQkxBTktfRkxJUCIpCiAKIGluY2x1ZGUgLi4vTWFrZWZpbGUudGVtcGxhdGUKIAoraW50ZWxfZGVjb2RlLm86IC4uL2ludGVsL2ludGVsX2RlY29kZS5jCisKK2ludGVsX3RleF9sYXlvdXQubzogLi4vaW50ZWwvaW50ZWxfdGV4X2xheW91dC5jCisKIHN5bWxpbmtzOgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9jb250ZXh0LmMKaW5kZXggN2NhNjAxZS4uMTE2YjUyNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfY29udGV4dC5jCkBAIC0zMiw5MyArMzIsODEgQEAKICNpbmNsdWRlICJ0bmwvdG5sLmgiCiAjaW5jbHVkZSAidG5sL3RfdmVydGV4LmgiCiAjaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgorI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpbnRlbF9zcGFuLmgiCisjaW5jbHVkZSAiaW50ZWxfcGl4ZWwuaCIKKyNpbmNsdWRlICJpbnRlbF90cmlzLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1lc2EncyBEcml2ZXIgRnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gaTgzMF9leHRlbnNpb25zW10gPQorc3RhdGljIHZvaWQKK2k4MzBJbml0RHJpdmVyRnVuY3Rpb25zKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKQogewotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciIsICAgICAgIE5VTEwgfSwKLSAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH0KLX07Ci0KLQotc3RhdGljIHZvaWQgaTgzMEluaXREcml2ZXJGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLSAgIGludGVsSW5pdERyaXZlckZ1bmN0aW9ucyggZnVuY3Rpb25zICk7Ci0gICBpODMwSW5pdFN0YXRlRnVuY3MoIGZ1bmN0aW9ucyApOwotICAgaTgzMEluaXRUZXh0dXJlRnVuY3MoIGZ1bmN0aW9ucyApOworICAgaW50ZWxJbml0RHJpdmVyRnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisgICBpODMwSW5pdFN0YXRlRnVuY3MoZnVuY3Rpb25zKTsKKyAgIGk4MzBJbml0VGV4dHVyZUZ1bmNzKGZ1bmN0aW9ucyk7CiB9CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdG5sX3BpcGVsaW5lX3N0YWdlICppbnRlbF9waXBlbGluZVtdOwogCi1HTGJvb2xlYW4gaTgzMENyZWF0ZUNvbnRleHQoIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKm1lc2FWaXMsCi0JCQkgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCQkgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpCitHTGJvb2xlYW4KK2k4MzBDcmVhdGVDb250ZXh0KGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqIGRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpCiB7CiAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgZnVuY3Rpb25zOwotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IChpODMwQ29udGV4dFB0cikgQ0FMTE9DX1NUUlVDVChpODMwX2NvbnRleHQpOwotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gJmk4MzAtPmludGVsOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IENBTExPQ19TVFJVQ1QoaTgzMF9jb250ZXh0KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZpODMwLT5pbnRlbDsKICAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0gICBHTHVpbnQgaTsKLSAgIGlmICghaTgzMCkgcmV0dXJuIEdMX0ZBTFNFOworICAgaWYgKCFpODMwKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogCi0gICBpODMwSW5pdFZ0YmwoIGk4MzAgKTsKLSAgIGk4MzBJbml0RHJpdmVyRnVuY3Rpb25zKCAmZnVuY3Rpb25zICk7CisgICBpODMwSW5pdFZ0YmwoaTgzMCk7CisgICBpODMwSW5pdERyaXZlckZ1bmN0aW9ucygmZnVuY3Rpb25zKTsKIAotICAgaWYgKCFpbnRlbEluaXRDb250ZXh0KCBpbnRlbCwgbWVzYVZpcywgZHJpQ29udGV4dFByaXYsCi0JCQkgIHNoYXJlZENvbnRleHRQcml2YXRlLCAmZnVuY3Rpb25zICkpIHsKKyAgIGlmICghaW50ZWxJbml0Q29udGV4dChpbnRlbCwgbWVzYVZpcywgZHJpQ29udGV4dFByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQ29udGV4dFByaXZhdGUsICZmdW5jdGlvbnMpKSB7CiAgICAgICBGUkVFKGk4MzApOwogICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgfQogCisgICAvKiBJbml0aWFsaXplIHN3cmFzdCwgdG5sIGRyaXZlciB0YWJsZXM6ICovCisgICBpbnRlbEluaXRTcGFuRnVuY3MoY3R4KTsKKyAgIGludGVsSW5pdFRyaUZ1bmNzKGN0eCk7CisKKyAgIC8qIEluc3RhbGwgdGhlIGN1c3RvbWl6ZWQgcGlwZWxpbmU6ICovCisgICBfdG5sX2Rlc3Ryb3lfcGlwZWxpbmUoY3R4KTsKKyAgIF90bmxfaW5zdGFsbF9waXBlbGluZShjdHgsIGludGVsX3BpcGVsaW5lKTsKKworICAgaWYgKGludGVsLT5ub19yYXN0KQorICAgICAgRkFMTEJBQ0soaW50ZWwsIElOVEVMX0ZBTExCQUNLX1VTRVIsIDEpOworCiAgICBpbnRlbC0+Y3R4LkNvbnN0Lk1heFRleHR1cmVVbml0cyA9IEk4MzBfVEVYX1VOSVRTOwogICAgaW50ZWwtPmN0eC5Db25zdC5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IEk4MzBfVEVYX1VOSVRTOwogICAgaW50ZWwtPmN0eC5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0cyA9IEk4MzBfVEVYX1VOSVRTOwogCi0gICBpbnRlbC0+bnJfaGVhcHMgPSAxOwotICAgaW50ZWwtPnRleHR1cmVfaGVhcHNbMF0gPSAKLSAgICAgIGRyaUNyZWF0ZVRleHR1cmVIZWFwKCAwLCBpbnRlbCwKLQkJCSAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPnRleC5zaXplLAotCQkJICAgIDEyLAotCQkJICAgIEk4MzBfTlJfVEVYX1JFR0lPTlMsCi0JCQkgICAgaW50ZWwtPnNhcmVhLT50ZXhMaXN0LAotCQkJICAgICh1bnNpZ25lZCAqKSAmIGludGVsLT5zYXJlYS0+dGV4QWdlLAotCQkJICAgICYgaW50ZWwtPnN3YXBwZWQsCi0JCQkgICAgc2l6ZW9mKCBzdHJ1Y3QgaTgzMF90ZXh0dXJlX29iamVjdCApLAotCQkJICAgIChkZXN0cm95X3RleHR1cmVfb2JqZWN0X3QgKilpbnRlbERlc3Ryb3lUZXhPYmogKTsKLQotICAgLyogRklYTUU6IGRyaUNhbGN1bGF0ZU1heFRleHR1cmVMZXZlbHMgYXNzdW1lcyB0aGF0IG1pcG1hcHMgYXJlIHRpZ2h0bHkKLSAgICAqIEZJWE1FOiBwYWNrZWQsIGJ1dCB0aGV5J3JlIG5vdCBpbiBJbnRlbCBncmFwaGljcyBoYXJkd2FyZS4KKyAgIC8qIEFkdmVydGlzZSB0aGUgZnVsbCBoYXJkd2FyZSBjYXBhYmlsaXRpZXMuICBUaGUgbmV3IG1lbW9yeQorICAgICogbWFuYWdlciBzaG91bGQgY29wZSBtdWNoIGJldHRlciB3aXRoIG92ZXJsb2FkIHNpdHVhdGlvbnM6CiAgICAgKi8KLSAgIGludGVsLT5jdHguQ29uc3QuTWF4VGV4dHVyZVVuaXRzID0gSTgzMF9URVhfVU5JVFM7Ci0gICBpID0gZHJpUXVlcnlPcHRpb25pKCAmaW50ZWwtPm9wdGlvbkNhY2hlLCAiYWxsb3dfbGFyZ2VfdGV4dHVyZXMiKTsKLSAgIGRyaUNhbGN1bGF0ZU1heFRleHR1cmVMZXZlbHMoIGludGVsLT50ZXh0dXJlX2hlYXBzLAotCQkJCSBpbnRlbC0+bnJfaGVhcHMsCi0JCQkJICZpbnRlbC0+Y3R4LkNvbnN0LAotCQkJCSA0LAotCQkJCSAxMSwgLyogbWF4IDJEIHRleHR1cmUgc2l6ZSBpcyAyMDQ4eDIwNDggKi8KLQkJCQkgOCwgIC8qIG1heCAzRCB0ZXh0dXJlIHNpemUgaXMgMjU2XjMgKi8KLQkJCQkgMTAsIC8qIG1heCBDVUJFIHRleHR1cmUgc2l6ZSBpcyAxMDI0eDEwMjQgKi8KLQkJCQkgMTEsIC8qIG1heCBSRUNULiBzdXBwb3J0ZWQgKi8KLQkJCQkgMTIsCi0JCQkJIEdMX0ZBTFNFLAotCQkJCSBpICk7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVMZXZlbHMgPSAxMjsKKyAgIGN0eC0+Q29uc3QuTWF4M0RUZXh0dXJlTGV2ZWxzID0gOTsKKyAgIGN0eC0+Q29uc3QuTWF4Q3ViZVRleHR1cmVMZXZlbHMgPSAxMTsKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZVJlY3RTaXplID0gKDEgPDwgMTEpOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHMgPSBJODMwX1RFWF9VTklUUzsKIAotICAgX3RubF9pbml0X3ZlcnRpY2VzKCBjdHgsIGN0eC0+Q29uc3QuTWF4QXJyYXlMb2NrU2l6ZSArIDEyLCAKLQkJICAgICAgIDE4ICogc2l6ZW9mKEdMZmxvYXQpICk7CisgICBfdG5sX2luaXRfdmVydGljZXMoY3R4LCBjdHgtPkNvbnN0Lk1heEFycmF5TG9ja1NpemUgKyAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAxOCAqIHNpemVvZihHTGZsb2F0KSk7CiAKICAgIGludGVsLT52ZXJ0cyA9IFROTF9DT05URVhUKGN0eCktPmNsaXBzcGFjZS52ZXJ0ZXhfYnVmOwogCi0gICBkcmlJbml0RXh0ZW5zaW9ucyggY3R4LCBpODMwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisgICBpODMwSW5pdFN0YXRlKGk4MzApOworICAgaTgzMEluaXRNZXRhRnVuY3MoaTgzMCk7CiAKLSAgIGk4MzBJbml0U3RhdGUoIGk4MzAgKTsKLQotCi0gICBfdG5sX2FsbG93X3ZlcnRleF9mb2coIGN0eCwgMSApOyAKLSAgIF90bmxfYWxsb3dfcGl4ZWxfZm9nKCBjdHgsIDAgKTsgCisgICBfdG5sX2FsbG93X3ZlcnRleF9mb2coY3R4LCAxKTsKKyAgIF90bmxfYWxsb3dfcGl4ZWxfZm9nKGN0eCwgMCk7CiAKICAgIHJldHVybiBHTF9UUlVFOwogfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX2NvbnRleHQuaAppbmRleCBiYWU3NzdkLi5hMjk4YzE0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9jb250ZXh0LmgKQEAgLTQ5LDE3ICs0OSwxNSBAQAogICovCiAjZGVmaW5lIEk4MzBfREVTVFJFR19DQlVGQUREUjAgMAogI2RlZmluZSBJODMwX0RFU1RSRUdfQ0JVRkFERFIxIDEKLSNkZWZpbmUgSTgzMF9ERVNUUkVHX0NCVUZBRERSMiAyCi0jZGVmaW5lIEk4MzBfREVTVFJFR19EQlVGQUREUjAgMwotI2RlZmluZSBJODMwX0RFU1RSRUdfREJVRkFERFIxIDQKLSNkZWZpbmUgSTgzMF9ERVNUUkVHX0RCVUZBRERSMiA1Ci0jZGVmaW5lIEk4MzBfREVTVFJFR19EVjAgNgotI2RlZmluZSBJODMwX0RFU1RSRUdfRFYxIDcKLSNkZWZpbmUgSTgzMF9ERVNUUkVHX1NFTkFCTEUgOAotI2RlZmluZSBJODMwX0RFU1RSRUdfU1IwIDkKLSNkZWZpbmUgSTgzMF9ERVNUUkVHX1NSMSAxMAotI2RlZmluZSBJODMwX0RFU1RSRUdfU1IyIDExCi0jZGVmaW5lIEk4MzBfREVTVF9TRVRVUF9TSVpFIDEyCisjZGVmaW5lIEk4MzBfREVTVFJFR19EQlVGQUREUjAgMgorI2RlZmluZSBJODMwX0RFU1RSRUdfREJVRkFERFIxIDMKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RWMCA0CisjZGVmaW5lIEk4MzBfREVTVFJFR19EVjEgNQorI2RlZmluZSBJODMwX0RFU1RSRUdfU0VOQUJMRSA2CisjZGVmaW5lIEk4MzBfREVTVFJFR19TUjAgNworI2RlZmluZSBJODMwX0RFU1RSRUdfU1IxIDgKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX1NSMiA5CisjZGVmaW5lIEk4MzBfREVTVF9TRVRVUF9TSVpFIDEwCiAKICNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEUxCQkwCiAjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFMgkJMQpAQCAtNzMsNyArNzEsNyBAQAogI2RlZmluZSBJODMwX0NUWFJFR19BQQkJCTkKICNkZWZpbmUgSTgzMF9DVFhSRUdfRk9HQ09MT1IJCTEwCiAjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MT1IwCQkxMQotI2RlZmluZSBJODMwX0NUWFJFR19CTEVORENPTE9SMQkJMTIgCisjZGVmaW5lIEk4MzBfQ1RYUkVHX0JMRU5EQ09MT1IxCQkxMgogI2RlZmluZSBJODMwX0NUWFJFR19WRgkJCTEzCiAjZGVmaW5lIEk4MzBfQ1RYUkVHX1ZGMgkJCTE0CiAjZGVmaW5lIEk4MzBfQ1RYUkVHX01DU0IwCQkxNQpAQCAtODQsMTcgKzgyLDE2IEBACiAjZGVmaW5lIEk4MzBfU1RQUkVHX1NUMSAgICAgICAgMQogI2RlZmluZSBJODMwX1NUUF9TRVRVUF9TSVpFICAgIDIKIAotI2RlZmluZSBJODMwX1RFWFJFR19UTTBMSSAgICAgIDAgLyogbG9hZCBpbW1lZGlhdGUgMiB0ZXh0dXJlIG1hcCBuICovCi0jZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMwICAgICAgMQotI2RlZmluZSBJODMwX1RFWFJFR19UTTBTMSAgICAgIDIKLSNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzIgICAgICAzCi0jZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMzICAgICAgNAotI2RlZmluZSBJODMwX1RFWFJFR19UTTBTNCAgICAgIDUKLSNkZWZpbmUgSTgzMF9URVhSRUdfTUNTCSAgICAgICA2CS8qIF8zRFNUQVRFX01BUF9DT09SRF9TRVRTICovCi0jZGVmaW5lIEk4MzBfVEVYUkVHX0NVQkUgICAgICAgNwkvKiBfM0RTVEFURV9NQVBfU1VCRSAqLwotI2RlZmluZSBJODMwX1RFWF9TRVRVUF9TSVpFICAgIDgKKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wTEkgICAgICAwICAgICAgICAvKiBsb2FkIGltbWVkaWF0ZSAyIHRleHR1cmUgbWFwIG4gKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzEgICAgICAxCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMyICAgICAgMgorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTMyAgICAgIDMKKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzQgICAgICA0CisjZGVmaW5lIEk4MzBfVEVYUkVHX01DUwkgICAgICAgNSAgICAgICAgLyogXzNEU1RBVEVfTUFQX0NPT1JEX1NFVFMgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfQ1VCRSAgICAgICA2ICAgICAgICAvKiBfM0RTVEFURV9NQVBfU1VCRSAqLworI2RlZmluZSBJODMwX1RFWF9TRVRVUF9TSVpFICAgIDcKIAotI2RlZmluZSBJODMwX1RFWEJMRU5EX1NJWkUJMTIJLyogKDQgYXJncyArIG9wKSAqIDIgKyBDT0xPUl9GQUNUT1IgKi8KKyNkZWZpbmUgSTgzMF9URVhCTEVORF9TSVpFCTEyICAgICAgLyogKDQgYXJncyArIG9wKSAqIDIgKyBDT0xPUl9GQUNUT1IgKi8KIAogc3RydWN0IGk4MzBfdGV4dHVyZV9vYmplY3QKIHsKQEAgLTEwNCwzMCArMTAxLDM5IEBACiAKICNkZWZpbmUgSTgzMF9URVhfVU5JVFMgNAogCi1zdHJ1Y3QgaTgzMF9od19zdGF0ZSB7CitzdHJ1Y3QgaTgzMF9od19zdGF0ZQorewogICAgR0x1aW50IEN0eFtJODMwX0NUWF9TRVRVUF9TSVpFXTsKICAgIEdMdWludCBCdWZmZXJbSTgzMF9ERVNUX1NFVFVQX1NJWkVdOwogICAgR0x1aW50IFN0aXBwbGVbSTgzMF9TVFBfU0VUVVBfU0laRV07CiAgICBHTHVpbnQgVGV4W0k4MzBfVEVYX1VOSVRTXVtJODMwX1RFWF9TRVRVUF9TSVpFXTsKICAgIEdMdWludCBUZXhCbGVuZFtJODMwX1RFWF9VTklUU11bSTgzMF9URVhCTEVORF9TSVpFXTsKICAgIEdMdWludCBUZXhCbGVuZFdvcmRzVXNlZFtJODMwX1RFWF9VTklUU107Ci0gICBHTHVpbnQgZW1pdHRlZDsJCS8qIEk4MTBfVVBMT0FEXyogKi8KKworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHJhd19yZWdpb247CisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb247CisKKyAgIC8qIFJlZ2lvbnMgYXJlbid0IGFjdHVhbGx5IHRoYXQgYXBwcm9wcmlhdGUgaGVyZSBhcyB0aGUgbWVtb3J5IG1heQorICAgICogYmUgZnJvbSBhIFBCTyBvciBGQk8uICBXaWxsIGhhdmUgdG8gZG8gdGhpcyBmb3IgZHJhdyBhbmQgZGVwdGggZm9yCisgICAgKiBGQk8ncy4uLgorICAgICovCisgICBkcmlfYm8gKnRleF9idWZmZXJbSTgzMF9URVhfVU5JVFNdOworICAgR0x1aW50IHRleF9vZmZzZXRbSTgzMF9URVhfVU5JVFNdOworCisgICBHTHVpbnQgZW1pdHRlZDsgICAgICAgICAgICAgIC8qIEk4MTBfVVBMT0FEXyogKi8KICAgIEdMdWludCBhY3RpdmU7CiB9OwogCi1zdHJ1Y3QgaTgzMF9jb250ZXh0IAorc3RydWN0IGk4MzBfY29udGV4dAogewogICAgc3RydWN0IGludGVsX2NvbnRleHQgaW50ZWw7Ci0gICAKLSAgIERFQ0xBUkVfUkVOREVSSU5QVVRTKGxhc3RfaW5kZXhfYml0c2V0KTsKKworICAgR0x1aW50IGxvZGJpYXNfdG0wczNbTUFYX1RFWFRVUkVfVU5JVFNdOworICAgICBERUNMQVJFX1JFTkRFUklOUFVUUyhsYXN0X2luZGV4X2JpdHNldCk7CiAKICAgIHN0cnVjdCBpODMwX2h3X3N0YXRlIG1ldGEsIGluaXRpYWwsIHN0YXRlLCAqY3VycmVudDsKIH07CiAKLXR5cGVkZWYgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMENvbnRleHRQdHI7Ci10eXBlZGVmIHN0cnVjdCBpODMwX3RleHR1cmVfb2JqZWN0ICppODMwVGV4dHVyZU9iamVjdFB0cjsKLQotI2RlZmluZSBJODMwX0NPTlRFWFQoY3R4KQkoKGk4MzBDb250ZXh0UHRyKShjdHgpKQogCiAKIApAQCAtMTQ4LDcxICsxNTQsNTYgQEAKIAogLyogaTgzMF92dGJsLmMKICAqLwotZXh0ZXJuIHZvaWQgCi1pODMwSW5pdFZ0YmwoIGk4MzBDb250ZXh0UHRyIGk4MzAgKTsKK2V4dGVybiB2b2lkIGk4MzBJbml0VnRibChzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKTsKIAorZXh0ZXJuIHZvaWQKK2k4MzBfc3RhdGVfZHJhd19yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaTgzMF9od19zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmNvbG9yX3JlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVwdGhfcmVnaW9uKTsKIC8qIGk4MzBfY29udGV4dC5jCiAgKi8KLWV4dGVybiBHTGJvb2xlYW4gCi1pODMwQ3JlYXRlQ29udGV4dCggY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbWVzYVZpcywKLQkJICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCSAgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlKTsKK2V4dGVybiBHTGJvb2xlYW4KK2k4MzBDcmVhdGVDb250ZXh0KGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqIGRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpOwogCiAvKiBpODMwX3RleC5jLCBpODMwX3RleHN0YXRlLmMKICAqLwotZXh0ZXJuIHZvaWQgCi1pODMwVXBkYXRlVGV4dHVyZVN0YXRlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKTsKK2V4dGVybiB2b2lkIGk4MzBVcGRhdGVUZXh0dXJlU3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKIAotZXh0ZXJuIHZvaWQgCi1pODMwSW5pdFRleHR1cmVGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLQotZXh0ZXJuIGludGVsVGV4dHVyZU9iamVjdFB0cgotaTgzMEFsbG9jVGV4T2JqKCBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogKTsKK2V4dGVybiB2b2lkIGk4MzBJbml0VGV4dHVyZUZ1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKTsKIAogLyogaTgzMF90ZXhibGVuZC5jCiAgKi8KLWV4dGVybiBHTHVpbnQgaTgzMFNldFRleEVudkNvbWJpbmUoaTgzMENvbnRleHRQdHIgaTgzMCwKLSAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4X2Vudl9jb21iaW5lX3N0YXRlICogY29tYmluZSwgR0xpbnQgYmxlbmRVbml0LAotICAgICBHTHVpbnQgdGV4ZWxfb3AsIEdMdWludCAqc3RhdGUsIGNvbnN0IEdMZmxvYXQgKmZhY3RvciApOworZXh0ZXJuIEdMdWludCBpODMwU2V0VGV4RW52Q29tYmluZShzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4X2Vudl9jb21iaW5lX3N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb21iaW5lLCBHTGludCBibGVuZFVuaXQsIEdMdWludCB0ZXhlbF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50ICogc3RhdGUsIGNvbnN0IEdMZmxvYXQgKiBmYWN0b3IpOwogCi1leHRlcm4gdm9pZCAKLWk4MzBFbWl0VGV4dHVyZUJsZW5kKCBpODMwQ29udGV4dFB0ciBpODMwICk7CitleHRlcm4gdm9pZCBpODMwRW1pdFRleHR1cmVCbGVuZChzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKTsKIAogCiAvKiBpODMwX3N0YXRlLmMKICAqLwotZXh0ZXJuIHZvaWQgCi1pODMwSW5pdFN0YXRlRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7CitleHRlcm4gdm9pZCBpODMwSW5pdFN0YXRlRnVuY3Moc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMpOwogCi1leHRlcm4gdm9pZCAKLWk4MzBFbWl0U3RhdGUoIGk4MzBDb250ZXh0UHRyIGk4MzAgKTsKK2V4dGVybiB2b2lkIGk4MzBFbWl0U3RhdGUoc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCk7CiAKLWV4dGVybiB2b2lkIAotaTgzMEluaXRTdGF0ZSggaTgzMENvbnRleHRQdHIgaTgzMCApOworZXh0ZXJuIHZvaWQgaTgzMEluaXRTdGF0ZShzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKTsKIAogLyogaTgzMF9tZXRhb3BzLmMKICAqLwotZXh0ZXJuIEdMYm9vbGVhbgotaTgzMFRyeVRleHR1cmVSZWFkUGl4ZWxzKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCQkgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotCQkJICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssCi0JCQkgIEdMdm9pZCAqcGl4ZWxzICk7CitleHRlcm4gdm9pZCBpODMwSW5pdE1ldGFGdW5jcyhzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKTsKIAotZXh0ZXJuIEdMYm9vbGVhbgotaTgzMFRyeVRleHR1cmVEcmF3UGl4ZWxzKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCQkgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotCQkJICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKLQkJCSAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKLQotZXh0ZXJuIHZvaWQgCi1pODMwQ2xlYXJXaXRoVHJpcyggaW50ZWxDb250ZXh0UHRyIGludGVsLCBHTGJpdGZpZWxkIG1hc2ssCi0JCSAgIEdMYm9vbGVhbiBhbGwsIEdMaW50IGN4LCBHTGludCBjeSwgR0xpbnQgY3csIEdMaW50IGNoKTsKLQotZXh0ZXJuIHZvaWQKLWk4MzBSb3RhdGVXaW5kb3coaW50ZWxDb250ZXh0UHRyIGludGVsLCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0gICAgICAgICAgICAgICAgIEdMdWludCBzcmNCdWYpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbmxpbmUgY29udmVyc2lvbiBmdW5jdGlvbnMuICBUaGVzZSBhcmUgYmV0dGVyLXR5cGVkIHRoYW4gdGhlCisgKiBtYWNyb3MgdXNlZCBwcmV2aW91c2x5OgorICovCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBpODMwX2NvbnRleHQgKgoraTgzMF9jb250ZXh0KEdMY29udGV4dCAqIGN0eCkKK3sKKyAgIHJldHVybiAoc3RydWN0IGk4MzBfY29udGV4dCAqKSBjdHg7Cit9CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfbWV0YW9wcy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX21ldGFvcHMuYwppbmRleCBjMWQ3ZmUzLi4xM2U0YWIzIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfbWV0YW9wcy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9tZXRhb3BzLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgogCiAjaW5jbHVkZSAiaTgzMF9jb250ZXh0LmgiCiAjaW5jbHVkZSAiaTgzMF9yZWcuaCIKQEAgLTQxLDM0ICs0MiwyNiBAQAogLyogQSBsYXJnZSBhbW91bnQgb2Ygc3RhdGUgZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkLgogICovCiAjZGVmaW5lIEFDVElWRSAoSTgzMF9VUExPQURfSU5WQVJJRU5UIHwgICAgICAgICBcCi0JCUk4MzBfVVBMT0FEX1RFWEJMRU5EKDApIHwJXAotCQlJODMwX1VQTE9BRF9TVElQUExFIHwJCVwKIAkJSTgzMF9VUExPQURfQ1RYIHwJCVwKIAkJSTgzMF9VUExPQURfQlVGRkVSUyB8CQlcCi0JCUk4MzBfVVBMT0FEX1RFWCgwKSkJCQorCQlJODMwX1VQTE9BRF9TVElQUExFIHwJCVwKKwkJSTgzMF9VUExPQURfVEVYQkxFTkQoMCkgfAlcCisJCUk4MzBfVVBMT0FEX1RFWCgwKSkKIAogCiAjZGVmaW5lIFNFVF9TVEFURSggaTgzMCwgU1RBVEUgKQkJXAogZG8gewkJCQkJCVwKLSAgIGk4MzAtPmN1cnJlbnQtPmVtaXR0ZWQgPSAwOwkJCVwKKyAgIGk4MzAtPmN1cnJlbnQtPmVtaXR0ZWQgJj0gfkFDVElWRTsJCQlcCiAgICBpODMwLT5jdXJyZW50ID0gJmk4MzAtPlNUQVRFOwkJXAotICAgaTgzMC0+Y3VycmVudC0+ZW1pdHRlZCA9IDA7CQkJXAorICAgaTgzMC0+Y3VycmVudC0+ZW1pdHRlZCAmPSB+QUNUSVZFOwkJCVwKIH0gd2hpbGUgKDApCiAKLS8qIE9wZXJhdGlvbnMgd2hlcmUgdGhlIDNEIGVuZ2luZSBpcyBkZWNvdXBsZWQgdGVtcG9yYXJpbHkgZnJvbSB0aGUKLSAqIGN1cnJlbnQgR0wgc3RhdGUgYW5kIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIHRoYW4gc2ltcGx5IHJlbmRlcmluZwotICogaW5jb21pbmcgdHJpYW5nbGVzLgotICovCi1zdGF0aWMgdm9pZCBzZXRfaW5pdGlhbF9zdGF0ZSggaTgzMENvbnRleHRQdHIgaTgzMCApCi17Ci0gICBtZW1jcHkoJmk4MzAtPm1ldGEsICZpODMwLT5pbml0aWFsLCBzaXplb2YoaTgzMC0+bWV0YSkgKTsKLSAgIGk4MzAtPm1ldGEuYWN0aXZlID0gQUNUSVZFOwotICAgaTgzMC0+bWV0YS5lbWl0dGVkID0gMDsKLX0KIAotCi1zdGF0aWMgdm9pZCBzZXRfbm9fZGVwdGhfc3RlbmNpbF93cml0ZSggaTgzMENvbnRleHRQdHIgaTgzMCApCitzdGF0aWMgdm9pZAorc2V0X25vX3N0ZW5jaWxfd3JpdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogeworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisKICAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9TVEVOQ0lMX1RFU1QsIEdMX0ZBTFNFICkKICAgICAqLwogICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSAmPSB+RU5BQkxFX1NURU5DSUxfVEVTVDsKQEAgLTc2LDYgKzY5LDEzIEBACiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfU1RFTkNJTF9URVNUOwogICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSB8PSBESVNBQkxFX1NURU5DSUxfV1JJVEU7CiAKKyAgIGk4MzAtPm1ldGEuZW1pdHRlZCAmPSB+STgzMF9VUExPQURfQ1RYOworfQorCitzdGF0aWMgdm9pZAorc2V0X25vX2RlcHRoX3dyaXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOwogCiAgICAvKiBjdHgtPkRyaXZlci5FbmFibGUoIGN0eCwgR0xfREVQVEhfVEVTVCwgR0xfRkFMU0UgKQogICAgICovCkBAIC04NywzNSArODcsNTYgQEAKICAgIGk4MzAtPm1ldGEuZW1pdHRlZCAmPSB+STgzMF9VUExPQURfQ1RYOwogfQogCisvKiBTZXQgZGVwdGggdW5pdCB0byByZXBsYWNlLgorICovCitzdGF0aWMgdm9pZAorc2V0X2RlcHRoX3JlcGxhY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisKKyAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9ERVBUSF9URVNULCBHTF9GQUxTRSApCisgICAgKiBjdHgtPkRyaXZlci5EZXB0aE1hc2soIGN0eCwgR0xfVFJVRSApCisgICAgKi8KKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gJj0gfkVOQUJMRV9ESVNfREVQVEhfVEVTVF9NQVNLOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSAmPSB+RU5BQkxFX0RJU19ERVBUSF9XUklURV9NQVNLOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBFTkFCTEVfREVQVEhfVEVTVDsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gfD0gRU5BQkxFX0RFUFRIX1dSSVRFOworCisgICAvKiBjdHgtPkRyaXZlci5EZXB0aEZ1bmMoIGN0eCwgR0xfQUxXQVlTICkKKyAgICAqLworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSAmPSB+REVQVEhfVEVTVF9GVU5DX01BU0s7CisgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19TVEFURTNdIHw9IChFTkFCTEVfREVQVEhfVEVTVF9GVU5DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUFRIX1RFU1RfRlVOQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENPTVBBUkVGVU5DX0FMV0FZUykpOworCisgICBpODMwLT5tZXRhLmVtaXR0ZWQgJj0gfkk4MzBfVVBMT0FEX0NUWDsKK30KKworCiAvKiBTZXQgc3RlbmNpbCB1bml0IHRvIHJlcGxhY2UgYWx3YXlzIHdpdGggdGhlIHJlZmVyZW5jZSB2YWx1ZS4KICAqLwotc3RhdGljIHZvaWQgc2V0X3N0ZW5jaWxfcmVwbGFjZSggaTgzMENvbnRleHRQdHIgaTgzMCwKLQkJCQkgR0x1aW50IHNfbWFzaywKLQkJCQkgR0x1aW50IHNfY2xlYXIpCitzdGF0aWMgdm9pZAorc2V0X3N0ZW5jaWxfcmVwbGFjZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgIEdMdWludCBzX21hc2ssIEdMdWludCBzX2NsZWFyKQogeworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisKICAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9TVEVOQ0lMX1RFU1QsIEdMX1RSVUUgKQogICAgICovCiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IEVOQUJMRV9TVEVOQ0lMX1RFU1Q7CiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IEVOQUJMRV9TVEVOQ0lMX1dSSVRFOwogCi0KLSAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9ERVBUSF9URVNULCBHTF9GQUxTRSApCi0gICAgKi8KLSAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gJj0gfkVOQUJMRV9ESVNfREVQVEhfVEVTVF9NQVNLOwotICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSAmPSB+RU5BQkxFX0RJU19ERVBUSF9XUklURV9NQVNLOwotICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBESVNBQkxFX0RFUFRIX1RFU1Q7Ci0gICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IERJU0FCTEVfREVQVEhfV1JJVEU7Ci0KICAgIC8qIGN0eC0+RHJpdmVyLlN0ZW5jaWxNYXNrKCBjdHgsIHNfbWFzayApCiAgICAgKi8KICAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNF0gJj0gfk1PREU0X0VOQUJMRV9TVEVOQ0lMX1dSSVRFX01BU0s7CiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19TVEFURTRdIHw9IChFTkFCTEVfU1RFTkNJTF9XUklURV9NQVNLIHwKLQkJCQkJICAgU1RFTkNJTF9XUklURV9NQVNLKChzX21hc2smMHhmZikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURU5DSUxfV1JJVEVfTUFTSygoc19tYXNrICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZikpKTsKIAogICAgLyogY3R4LT5Ecml2ZXIuU3RlbmNpbE9wKCBjdHgsIEdMX1JFUExBQ0UsIEdMX1JFUExBQ0UsIEdMX1JFUExBQ0UgKQogICAgICovCiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19TVEVOQ0lMVFNUXSAmPSB+KFNURU5DSUxfT1BTX01BU0spOwotICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RFTkNJTFRTVF0gfD0gCisgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19TVEVOQ0lMVFNUXSB8PQogICAgICAgKEVOQUJMRV9TVEVOQ0lMX1BBUk1TIHwKICAgICAgICBTVEVOQ0lMX0ZBSUxfT1AoU1RFTkNJTE9QX1JFUExBQ0UpIHwKICAgICAgICBTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTF9PUChTVEVOQ0lMT1BfUkVQTEFDRSkgfApAQCAtMTI1LDE0ICsxNDYsMTQgQEAKICAgICAqLwogICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XSAmPSB+TU9ERTRfRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLOwogICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XSB8PSAoRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLIHwKLQkJCQkJICAgU1RFTkNJTF9URVNUX01BU0soMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9URVNUX01BU0soMHhmZikpOwogCiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19TVEVOQ0lMVFNUXSAmPSB+KFNURU5DSUxfUkVGX1ZBTFVFX01BU0sgfAotCQkJCQkJRU5BQkxFX1NURU5DSUxfVEVTVF9GVU5DX01BU0spOwotICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RFTkNJTFRTVF0gfD0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9TVEVOQ0lMX1RFU1RfRlVOQ19NQVNLKTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NURU5DSUxUU1RdIHw9CiAgICAgICAoRU5BQkxFX1NURU5DSUxfUkVGX1ZBTFVFIHwKICAgICAgICBFTkFCTEVfU1RFTkNJTF9URVNUX0ZVTkMgfAotICAgICAgIFNURU5DSUxfUkVGX1ZBTFVFKChzX2NsZWFyJjB4ZmYpKSB8CisgICAgICAgU1RFTkNJTF9SRUZfVkFMVUUoKHNfY2xlYXIgJiAweGZmKSkgfAogICAgICAgIFNURU5DSUxfVEVTVF9GVU5DKENPTVBBUkVGVU5DX0FMV0FZUykpOwogCiAKQEAgLTE0MSwzOCArMTYyLDQzIEBACiB9CiAKIAotc3RhdGljIHZvaWQgc2V0X2NvbG9yX21hc2soIGk4MzBDb250ZXh0UHRyIGk4MzAsIEdMYm9vbGVhbiBzdGF0ZSApCitzdGF0aWMgdm9pZAorc2V0X2NvbG9yX21hc2soc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGJvb2xlYW4gc3RhdGUpCiB7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKwogICAgY29uc3QgR0x1aW50IG1hc2sgPSAoKDEgPDwgV1JJVEVNQVNLX1JFRF9TSElGVCkgfAotCQkJKDEgPDwgV1JJVEVNQVNLX0dSRUVOX1NISUZUKSB8Ci0JCQkoMSA8PCBXUklURU1BU0tfQkxVRV9TSElGVCkgfAotCQkJKDEgPDwgV1JJVEVNQVNLX0FMUEhBX1NISUZUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBXUklURU1BU0tfR1JFRU5fU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFdSSVRFTUFTS19CTFVFX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBXUklURU1BU0tfQUxQSEFfU0hJRlQpKTsKIAogICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSAmPSB+bWFzazsKIAogICAgaWYgKHN0YXRlKSB7Ci0gICAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IAotCSAoaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gJiBtYXNrKTsKKyAgICAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gfD0KKyAgICAgICAgIChpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSAmIG1hc2spOwogICAgfQotICAgICAgCisKICAgIGk4MzAtPm1ldGEuZW1pdHRlZCAmPSB+STgzMF9VUExPQURfQ1RYOwogfQogCiAvKiBJbnN0YWxscyBhIG9uZS1zdGFnZSBwYXNzdGhyb3VnaCB0ZXh0dXJlIGJsZW5kIHBpcGVsaW5lLiAgSXMgdGhlcmUKICAqIG1vcmUgdGhhdCBjYW4gYmUgZG9uZSB0byB0dXJuIG9mZiB0ZXh0dXJpbmc/CiAgKi8KLXN0YXRpYyB2b2lkIHNldF9ub190ZXh0dXJlKCBpODMwQ29udGV4dFB0ciBpODMwICkKK3N0YXRpYyB2b2lkCitzZXRfbm9fdGV4dHVyZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCiB7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfdGV4X2Vudl9jb21iaW5lX3N0YXRlIGNvbWIgPSB7CiAgICAgICBHTF9OT05FLCBHTF9OT05FLAotICAgICAgeyBHTF9URVhUVVJFLCAwLCAwLCB9LCB7IEdMX1RFWFRVUkUsIDAsIDAsIH0sCi0gICAgICB7IEdMX1NSQ19DT0xPUiwgMCwgMCB9LCB7IEdMX1NSQ19BTFBIQSwgMCwgMCB9LAorICAgICAge0dMX1RFWFRVUkUsIDAsIDAsfSwge0dMX1RFWFRVUkUsIDAsIDAsfSwKKyAgICAgIHtHTF9TUkNfQ09MT1IsIDAsIDB9LCB7R0xfU1JDX0FMUEhBLCAwLCAwfSwKICAgICAgIDAsIDAsIDAsIDAKICAgIH07CiAKICAgIGk4MzAtPm1ldGEuVGV4QmxlbmRXb3Jkc1VzZWRbMF0gPQotICAgICBpODMwU2V0VGV4RW52Q29tYmluZSggaTgzMCwgJiBjb21iLCAwLCBURVhCTEVOREFSR19URVhFTDAsCi0JCQkgICBpODMwLT5tZXRhLlRleEJsZW5kWzBdLCBOVUxMKTsKKyAgICAgIGk4MzBTZXRUZXhFbnZDb21iaW5lKGk4MzAsICZjb21iLCAwLCBURVhCTEVOREFSR19URVhFTDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpODMwLT5tZXRhLlRleEJsZW5kWzBdLCBOVUxMKTsKIAogICAgaTgzMC0+bWV0YS5UZXhCbGVuZFswXVswXSB8PSBURVhPUF9MQVNUX1NUQUdFOwogICAgaTgzMC0+bWV0YS5lbWl0dGVkICY9IH5JODMwX1VQTE9BRF9URVhCTEVORCgwKTsKQEAgLTE4MSwxOCArMjA3LDIyIEBACiAvKiBTZXQgdXAgYSBzaW5nbGUgZWxlbWVudCBibGVuZCBzdGFnZSBmb3IgJ3JlcGxhY2UnIHRleHR1cmluZyB3aXRoIG5vCiAgKiBmdW5ueSBvcHMuCiAgKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV90ZXh0dXJlX2JsZW5kX3JlcGxhY2UoIGk4MzBDb250ZXh0UHRyIGk4MzAgKQorc3RhdGljIHZvaWQKK3NldF90ZXh0dXJlX2JsZW5kX3JlcGxhY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogeworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CiAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGdsX3RleF9lbnZfY29tYmluZV9zdGF0ZSBjb21iID0gewogICAgICAgR0xfUkVQTEFDRSwgR0xfUkVQTEFDRSwKLSAgICAgIHsgR0xfVEVYVFVSRSwgR0xfVEVYVFVSRSwgR0xfVEVYVFVSRSB9LCB7IEdMX1RFWFRVUkUsIEdMX1RFWFRVUkUsIEdMX1RFWFRVUkUsIH0sCi0gICAgICB7IEdMX1NSQ19DT0xPUiwgR0xfU1JDX0NPTE9SLCBHTF9TUkNfQ09MT1IgfSwgeyBHTF9TUkNfQUxQSEEsIEdMX1NSQ19BTFBIQSwgR0xfU1JDX0FMUEhBIH0sCisgICAgICB7R0xfVEVYVFVSRSwgR0xfVEVYVFVSRSwgR0xfVEVYVFVSRSx9LCB7R0xfVEVYVFVSRSwgR0xfVEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFLH0sCisgICAgICB7R0xfU1JDX0NPTE9SLCBHTF9TUkNfQ09MT1IsIEdMX1NSQ19DT0xPUn0sIHtHTF9TUkNfQUxQSEEsIEdMX1NSQ19BTFBIQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1NSQ19BTFBIQX0sCiAgICAgICAwLCAwLCAxLCAxCiAgICB9OwogCiAgICBpODMwLT5tZXRhLlRleEJsZW5kV29yZHNVc2VkWzBdID0KLSAgICAgaTgzMFNldFRleEVudkNvbWJpbmUoIGk4MzAsICYgY29tYiwgMCwgVEVYQkxFTkRBUkdfVEVYRUwwLAotCQkJICAgaTgzMC0+bWV0YS5UZXhCbGVuZFswXSwgTlVMTCk7CisgICAgICBpODMwU2V0VGV4RW52Q29tYmluZShpODMwLCAmY29tYiwgMCwgVEVYQkxFTkRBUkdfVEVYRUwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaTgzMC0+bWV0YS5UZXhCbGVuZFswXSwgTlVMTCk7CiAKICAgIGk4MzAtPm1ldGEuVGV4QmxlbmRbMF1bMF0gfD0gVEVYT1BfTEFTVF9TVEFHRTsKICAgIGk4MzAtPm1ldGEuZW1pdHRlZCAmPSB+STgzMF9VUExPQURfVEVYQkxFTkQoMCk7CkBAIC0yMDYsNzE3ICsyMzYsMjIyIEBACiAvKiBTZXQgdXAgYW4gYXJiaXRhcnkgcGllY2Ugb2YgbWVtb3J5IGFzIGEgcmVjdGFuZ3VsYXIgdGV4dHVyZQogICogKGluY2x1ZGluZyB0aGUgZnJvbnQgb3IgYmFjayBidWZmZXIpLgogICovCi1zdGF0aWMgdm9pZCBzZXRfdGV4X3JlY3Rfc291cmNlKCBpODMwQ29udGV4dFB0ciBpODMwLAotCQkJCSBHTHVpbnQgb2Zmc2V0LAotCQkJCSBHTHVpbnQgd2lkdGgsIAotCQkJCSBHTHVpbnQgaGVpZ2h0LAotCQkJCSBHTHVpbnQgcGl0Y2gsIC8qIGluIGJ5dGVzICovCi0JCQkJIEdMdWludCB0ZXh0dXJlRm9ybWF0ICkKK3N0YXRpYyBHTGJvb2xlYW4KK3NldF90ZXhfcmVjdF9zb3VyY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICBkcmlfYm8gKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgR0x1aW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgR0x1aW50IHBpdGNoLCBHTHVpbnQgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSkKIHsKLSAgIEdMaW50IG51bUxldmVscyA9IDE7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKICAgIEdMdWludCAqc2V0dXAgPSBpODMwLT5tZXRhLlRleFswXTsKKyAgIEdMaW50IG51bUxldmVscyA9IDE7CisgICBHTHVpbnQgdGV4dHVyZUZvcm1hdDsKKyAgIEdMdWludCBjcHA7CiAKLS8qICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9mZnNldDogJXggdzogJWQgaDogJWQgcGl0Y2ggJWQgZm9ybWF0ICV4XG4iLCAqLwotLyogCSAgIF9fRlVOQ1RJT05fXywgb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgdGV4dHVyZUZvcm1hdCApOyAqLworICAgLyogQSBmdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgd291bGQgZG8gdGhlIHVwbG9hZCB0aHJvdWdoCisgICAgKiBnbFRleEltYWdlMmQsIGFuZCBnZXQgYWxsIHRoZSBjb252ZXJzaW9uIG9wZXJhdGlvbnMgYXQgdGhhdAorICAgICogcG9pbnQuICBXZSBhcmUgcmVzdHJpY3RlZCwgYnV0IHN0aWxsIGF0IGxlYXN0IGhhdmUgYWNjZXNzIHRvIHRoZQorICAgICogZnJhZ21lbnQgcHJvZ3JhbSBzd2l6emxlLgorICAgICovCisgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgY2FzZSBHTF9CR1JBOgorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVjoKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl8zMkJJVCB8IE1UXzMyQklUX0FSR0I4ODg4KTsKKyAgICAgICAgIGNwcCA9IDQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfUkdCQToKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY6CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9BQkdSODg4OCk7CisgICAgICAgICBjcHAgPSA0OworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0JHUjoKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVY6CisgICAgICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9SR0I1NjUpOworICAgICAgICAgY3BwID0gMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9SR0I6CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6CisgICAgICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9SR0I1NjUpOworICAgICAgICAgY3BwID0gMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gICBzZXR1cFtJODMwX1RFWFJFR19UTTBMSV0gPSAoXzNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMiB8IAotCQkJICAgICAgIChMT0FEX1RFWFRVUkVfTUFQMCA8PCAwKSB8IDQpOwotICAgc2V0dXBbSTgzMF9URVhSRUdfVE0wUzBdID0gKFRNMFMwX1VTRV9GRU5DRSB8IG9mZnNldCk7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpODMwLT5tZXRhLnRleF9idWZmZXJbMF0gPSBidWZmZXI7CisgICBpODMwLT5tZXRhLnRleF9vZmZzZXRbMF0gPSBvZmZzZXQ7CisKKyAgIHNldHVwW0k4MzBfVEVYUkVHX1RNMExJXSA9IChfM0RTVEFURV9MT0FEX1NUQVRFX0lNTUVESUFURV8yIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE9BRF9URVhUVVJFX01BUDAgPDwgMCkgfCA0KTsKICAgIHNldHVwW0k4MzBfVEVYUkVHX1RNMFMxXSA9ICgoKGhlaWdodCAtIDEpIDw8IFRNMFMxX0hFSUdIVF9TSElGVCkgfAotCQkJICAgICAgICgod2lkdGggLSAxKSA8PCBUTTBTMV9XSURUSF9TSElGVCkgfAotCQkJICAgICAgIHRleHR1cmVGb3JtYXQpOwotICAgc2V0dXBbSTgzMF9URVhSRUdfVE0wUzJdID0gKCgoKHBpdGNoIC8gNCkgLSAxKSA8PCBUTTBTMl9QSVRDSF9TSElGVCkpOyAgIAotICAgc2V0dXBbSTgzMF9URVhSRUdfVE0wUzNdICY9IH5UTTBTM19NQVhfTUlQX01BU0s7Ci0gICBzZXR1cFtJODMwX1RFWFJFR19UTTBTM10gJj0gflRNMFMzX01JTl9NSVBfTUFTSzsKLSAgIHNldHVwW0k4MzBfVEVYUkVHX1RNMFMzXSB8PSAoKG51bUxldmVscyAtIDEpKjQpIDw8IFRNMFMzX01JTl9NSVBfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwaXRjaCAtIDEpIDw8IFRNMFMxX1dJRFRIX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZvcm1hdCk7CisgICBzZXR1cFtJODMwX1RFWFJFR19UTTBTMl0gPQorICAgICAgKCgoKChwaXRjaCAqIGNwcCkgLyA0KSAtCisgICAgICAgICAxKSA8PCBUTTBTMl9QSVRDSF9TSElGVCkgfCBUTTBTMl9DVUJFX0ZBQ0VfRU5BX01BU0spOworCisgICBzZXR1cFtJODMwX1RFWFJFR19UTTBTM10gPQorICAgICAgKCgoKG51bUxldmVscyAtCisgICAgICAgICAgMSkgKgorICAgICAgICAgNCkgPDwgVE0wUzNfTUlOX01JUF9TSElGVCkgfCAoRklMVEVSX05FQVJFU1QgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNMFMzX01JTl9GSUxURVJfU0hJRlQpIHwKKyAgICAgICAoTUlQRklMVEVSX05PTkUgPDwgVE0wUzNfTUlQX0ZJTFRFUl9TSElGVCkgfCAoRklMVEVSX05FQVJFU1QgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE0wUzNfTUFHX0ZJTFRFUl9TSElGVCkpOworCisgICBzZXR1cFtJODMwX1RFWFJFR19DVUJFXSA9IChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKDApKTsKIAogICAgc2V0dXBbSTgzMF9URVhSRUdfTUNTXSA9IChfM0RTVEFURV9NQVBfQ09PUkRfU0VUX0NNRCB8Ci0JCQkgICAgIE1BUF9VTklUKDApIHwKLQkJCSAgICAgRU5BQkxFX1RFWENPT1JEX1BBUkFNUyB8Ci0JCQkgICAgIFRFWENPT1JEU19BUkVfSU5fVEVYRUxVTklUUyB8Ci0JCQkgICAgIFRFWENPT1JEVFlQRV9DQVJURVNJQU4gfAotCQkJICAgICBFTkFCTEVfQUREUl9WX0NOVEwgfAotCQkJICAgICBURVhDT09SRF9BRERSX1ZfTU9ERShURVhDT09SRE1PREVfV1JBUCkgfAotCQkJICAgICBFTkFCTEVfQUREUl9VX0NOVEwgfAotCQkJICAgICBURVhDT09SRF9BRERSX1VfTU9ERShURVhDT09SRE1PREVfV1JBUCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfVU5JVCgwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9URVhDT09SRF9QQVJBTVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhDT09SRFNfQVJFX0lOX1RFWEVMVU5JVFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhDT09SRFRZUEVfQ0FSVEVTSUFOIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0FERFJfVl9DTlRMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYQ09PUkRfQUREUl9WX01PREUoVEVYQ09PUkRNT0RFX1dSQVApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0FERFJfVV9DTlRMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYQ09PUkRfQUREUl9VX01PREUoVEVYQ09PUkRNT0RFX1dSQVApKTsKIAogICAgaTgzMC0+bWV0YS5lbWl0dGVkICY9IH5JODMwX1VQTE9BRF9URVgoMCk7CisgICByZXR1cm4gR0xfVFJVRTsKIH0KIAogCi0vKiBTZWxlY3QgYmV0d2VlbiBmcm9udCBhbmQgYmFjayBkcmF3IGJ1ZmZlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9kcmF3X3JlZ2lvbiggaTgzMENvbnRleHRQdHIgaTgzMCwKLQkJCSAgICAgIGNvbnN0IGludGVsUmVnaW9uICpyZWdpb24gKQorc3RhdGljIHZvaWQKK3NldF92ZXJ0ZXhfZm9ybWF0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKLSAgIGk4MzAtPm1ldGEuQnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjFdID0KLSAgICAgIChCVUZfM0RfSURfQ09MT1JfQkFDSyB8IEJVRl8zRF9QSVRDSChyZWdpb24tPnBpdGNoKSB8IEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgaTgzMC0+bWV0YS5CdWZmZXJbSTgzMF9ERVNUUkVHX0NCVUZBRERSMl0gPSByZWdpb24tPm9mZnNldDsKLSAgIGk4MzAtPm1ldGEuZW1pdHRlZCAmPSB+STgzMF9VUExPQURfQlVGRkVSUzsKLX0KLQotLyogU2V0dXAgYW4gYXJiaXRhcnkgZHJhdyBmb3JtYXQsIHVzZWZ1bCBmb3IgdGFyZ2V0aW5nCi0gKiB0ZXh0dXJlIG9yIGFncCBtZW1vcnkuCi0gKi8KLSNpZiAwCi1zdGF0aWMgdm9pZCBzZXRfZHJhd19mb3JtYXQoIGk4MzBDb250ZXh0UHRyIGk4MzAsCi0JCQkgICAgIEdMdWludCBmb3JtYXQsCi0JCQkgICAgIEdMdWludCBkZXB0aF9mb3JtYXQpCi17Ci0gICBpODMwLT5tZXRhLkJ1ZmZlcltJODMwX0RFU1RSRUdfRFYxXSA9IChEU1RPUkdfSE9SVF9CSUFTKDB4OCkgfCAvKiAuNSAqLwotCQkJCQkgIERTVE9SR19WRVJUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCSAgZm9ybWF0IHwKLQkJCQkJICBERVBUSF9JU19aIHwKLQkJCQkJICBkZXB0aF9mb3JtYXQpOwotfQotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgc2V0X3ZlcnRleF9mb3JtYXQoIGk4MzBDb250ZXh0UHRyIGk4MzAgKQotewotICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfVkZdID0gIChfM0RTVEFURV9WRlQwX0NNRCB8Ci0JCQkJICAgICAgVkZUMF9URVhfQ09VTlQoMSkgfAotCQkJCSAgICAgIFZGVDBfRElGRlVTRSB8Ci0JCQkJICAgICAgVkZUMF9TUEVDIHwKLQkJCQkgICAgICBWRlQwX1hZWlcpOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19WRl0gPSAoXzNEU1RBVEVfVkZUMF9DTUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGVDBfVEVYX0NPVU5UKDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRlQwX0RJRkZVU0UgfCBWRlQwX1hZWik7CiAgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19WRjJdID0gKF8zRFNUQVRFX1ZGVDFfQ01EIHwKLQkJCQkgICAgICBWRlQxX1RFWDBfRk1UKFRFWENPT1JERk1UXzJEKSB8Ci0JCQkJICAgICAgVkZUMV9URVgxX0ZNVChURVhDT09SREZNVF8yRCkgfCAKLQkJCQkgICAgICBWRlQxX1RFWDJfRk1UKFRFWENPT1JERk1UXzJEKSB8Ci0JCQkJICAgICAgVkZUMV9URVgzX0ZNVChURVhDT09SREZNVF8yRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRlQxX1RFWDBfRk1UKFRFWENPT1JERk1UXzJEKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGVDFfVEVYMV9GTVQoVEVYQ09PUkRGTVRfMkQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkZUMV9URVgyX0ZNVChURVhDT09SREZNVF8yRCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRlQxX1RFWDNfRk1UKFRFWENPT1JERk1UXzJEKSk7CiAgICBpODMwLT5tZXRhLmVtaXR0ZWQgJj0gfkk4MzBfVVBMT0FEX0NUWDsKIH0KIAogCi1zdGF0aWMgdm9pZCBkcmF3X3F1YWQoaTgzMENvbnRleHRQdHIgaTgzMCwgCi0JCSAgICAgIEdMZmxvYXQgeDAsIEdMZmxvYXQgeDEsCi0JCSAgICAgIEdMZmxvYXQgeTAsIEdMZmxvYXQgeTEsIAotCQkgICAgICBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwKLQkJICAgICAgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhLAotCQkgICAgICBHTGZsb2F0IHMwLCBHTGZsb2F0IHMxLAotCQkgICAgICBHTGZsb2F0IHQwLCBHTGZsb2F0IHQxICkKK3N0YXRpYyB2b2lkCittZXRhX2ltcG9ydF9waXhlbF9zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCiB7Ci0gICBHTHVpbnQgdmVydGV4X3NpemUgPSA4OwotICAgR0x1aW50ICp2YiA9IGludGVsRW1pdElubGluZVByaW1pdGl2ZUxvY2tlZCggJmk4MzAtPmludGVsLCAKLQkJCQkJCVBSSU0zRF9UUklGQU4sIAotCQkJCQkJNCp2ZXJ0ZXhfc2l6ZSwKLQkJCQkJCXZlcnRleF9zaXplICk7Ci0gICBpbnRlbFZlcnRleCB0bXA7Ci0gICBpbnQgaTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOwogCi0gICAKLS8qICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVmLCVmLSVmLCVmIDB4JXgleCV4JXggJWYsJWYtJWYsJWZcbiIsICovCi0vKiAJICAgX19GVU5DVElPTl9fLCAqLwotLyogCSAgIHgwLHkwLHgxLHkxLHJlZCxncmVlbixibHVlLGFscGhhLHMwLHQwLHMxLHQxKTsgKi8KKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFMV0gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUxXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFMl0gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUyXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFM10gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNF0gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNV0gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU1XTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0lBTFBIQUJdID0gaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0lBTFBIQUJdOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RFTkNJTFRTVF0gPQorICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NURU5DSUxUU1RdOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSA9CisgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gPQorICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl07CisgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19BQV0gPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfQUFdOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfRk9HQ09MT1JdID0KKyAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19GT0dDT0xPUl07CisgICBpODMwLT5tZXRhLkN0eFtJODMwX0NUWFJFR19CTEVORENPTE9SMF0gPQorICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0JMRU5EQ09MT1IwXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX0JMRU5EQ09MT1IxXSA9CisgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfQkxFTkRDT0xPUjFdOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfTUNTQjBdID0gaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX01DU0IwXTsKKyAgIGk4MzAtPm1ldGEuQ3R4W0k4MzBfQ1RYUkVHX01DU0IxXSA9IGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19NQ1NCMV07CiAKIAotICAgLyogaW5pdGlhbCB2ZXJ0ZXgsIGxlZnQgYm90dG9tICovCi0gICB0bXAudi54ID0geDA7Ci0gICB0bXAudi55ID0geTA7Ci0gICB0bXAudi56ID0gMS4wOwotICAgdG1wLnYudyA9IDEuMDsKLSAgIHRtcC52LmNvbG9yLnJlZCA9IHJlZDsKLSAgIHRtcC52LmNvbG9yLmdyZWVuID0gZ3JlZW47Ci0gICB0bXAudi5jb2xvci5ibHVlID0gYmx1ZTsKLSAgIHRtcC52LmNvbG9yLmFscGhhID0gYWxwaGE7Ci0gICB0bXAudi5zcGVjdWxhci5yZWQgPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuZ3JlZW4gPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuYmx1ZSA9IDA7Ci0gICB0bXAudi5zcGVjdWxhci5hbHBoYSA9IDA7Ci0gICB0bXAudi51MCA9IHMwOwotICAgdG1wLnYudjAgPSB0MDsKLSAgIGZvciAoaSA9IDAgOyBpIDwgOCA7IGkrKykKLSAgICAgIHZiW2ldID0gdG1wLnVpW2ldOworICAgaTgzMC0+bWV0YS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSAmPSB+Q1VMTE1PREVfTUFTSzsKKyAgIGk4MzAtPm1ldGEuU3RpcHBsZVtJODMwX1NUUFJFR19TVDFdICY9IH5TVDFfRU5BQkxFOworICAgaTgzMC0+bWV0YS5lbWl0dGVkICY9IH5JODMwX1VQTE9BRF9DVFg7CiAKLSAgIC8qIHJpZ2h0IGJvdHRvbSAqLwotICAgdmIgKz0gODsKLSAgIHRtcC52LnggPSB4MTsKLSAgIHRtcC52LnUwID0gczE7Ci0gICBmb3IgKGkgPSAwIDsgaSA8IDggOyBpKyspCi0gICAgICB2YltpXSA9IHRtcC51aVtpXTsKIAotICAgLyogcmlnaHQgdG9wICovCi0gICB2YiArPSA4OwotICAgdG1wLnYueSA9IHkxOwotICAgdG1wLnYudjAgPSB0MTsKLSAgIGZvciAoaSA9IDAgOyBpIDwgOCA7IGkrKykKLSAgICAgIHZiW2ldID0gdG1wLnVpW2ldOwotCi0gICAvKiBsZWZ0IHRvcCAqLwotICAgdmIgKz0gODsKLSAgIHRtcC52LnggPSB4MDsKLSAgIHRtcC52LnUwID0gczA7Ci0gICBmb3IgKGkgPSAwIDsgaSA8IDggOyBpKyspCi0gICAgICB2YltpXSA9IHRtcC51aVtpXTsKLQotLyogICAgZnByaW50ZihzdGRlcnIsICIlczogRFYxOiAleFxuIiwgICovCi0vKiAJICAgX19GVU5DVElPTl9fLCBpODMwLT5tZXRhLkJ1ZmZlcltJODMwX0RFU1RSRUdfRFYxXSk7ICovCi19Ci0KLXN0YXRpYyB2b2lkIGRyYXdfcG9seShpODMwQ29udGV4dFB0ciBpODMwLCAKLQkJICAgICAgR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbnVtVmVydHMsCi0gICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB2ZXJ0c1tdWzJdLAotICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgdGV4Y29vcmRzW11bMl0pCi17Ci0gICBHTHVpbnQgdmVydGV4X3NpemUgPSA4OwotICAgR0x1aW50ICp2YiA9IGludGVsRW1pdElubGluZVByaW1pdGl2ZUxvY2tlZCggJmk4MzAtPmludGVsLCAKLQkJCQkJCVBSSU0zRF9UUklGQU4sIAotCQkJCQkJbnVtVmVydHMgKiB2ZXJ0ZXhfc2l6ZSwKLQkJCQkJCXZlcnRleF9zaXplICk7Ci0gICBpbnRlbFZlcnRleCB0bXA7Ci0gICBpbnQgaSwgazsKLQotICAgLyogaW5pdGlhbCBjb25zdGFudCB2ZXJ0ZXggZmllbGRzICovCi0gICB0bXAudi56ID0gMS4wOwotICAgdG1wLnYudyA9IDEuMDsgCi0gICB0bXAudi5jb2xvci5yZWQgPSByZWQ7Ci0gICB0bXAudi5jb2xvci5ncmVlbiA9IGdyZWVuOwotICAgdG1wLnYuY29sb3IuYmx1ZSA9IGJsdWU7Ci0gICB0bXAudi5jb2xvci5hbHBoYSA9IGFscGhhOwotICAgdG1wLnYuc3BlY3VsYXIucmVkID0gMDsKLSAgIHRtcC52LnNwZWN1bGFyLmdyZWVuID0gMDsKLSAgIHRtcC52LnNwZWN1bGFyLmJsdWUgPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuYWxwaGEgPSAwOwotCi0gICBmb3IgKGsgPSAwOyBrIDwgbnVtVmVydHM7IGsrKykgewotICAgICAgdG1wLnYueCA9IHZlcnRzW2tdWzBdOwotICAgICAgdG1wLnYueSA9IHZlcnRzW2tdWzFdOwotICAgICAgdG1wLnYudTAgPSB0ZXhjb29yZHNba11bMF07Ci0gICAgICB0bXAudi52MCA9IHRleGNvb3Jkc1trXVsxXTsKLQotICAgICAgZm9yIChpID0gMCA7IGkgPCB2ZXJ0ZXhfc2l6ZSA7IGkrKykKLSAgICAgICAgIHZiW2ldID0gdG1wLnVpW2ldOwotCi0gICAgICB2YiArPSB2ZXJ0ZXhfc2l6ZTsKLSAgIH0KLX0KLQotdm9pZCAKLWk4MzBDbGVhcldpdGhUcmlzKGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0xiaXRmaWVsZCBtYXNrLAotCQkgIEdMYm9vbGVhbiBhbGxGb28sCi0JCSAgR0xpbnQgY3hGb28sIEdMaW50IGN5Rm9vLCBHTGludCBjd0ZvbywgR0xpbnQgY2hGb28pCi17Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKCBpbnRlbCApOwotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICpzY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47Ci0gICBpbnQgeDAsIHkwLCB4MSwgeTE7Ci0gICBHTGludCBjeCwgY3ksIGN3LCBjaDsKLSAgIEdMYm9vbGVhbiBhbGw7Ci0KLSAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7Ci0gICBTRVRfU1RBVEUoIGk4MzAsIG1ldGEgKTsKLSAgIHNldF9pbml0aWFsX3N0YXRlKCBpODMwICk7Ci0vKiAgICBzZXRfbm9fdGV4dHVyZSggaTgzMCApOyAqLwotICAgc2V0X3ZlcnRleF9mb3JtYXQoIGk4MzAgKTsgCi0KLSAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCi0gICAvKiBnZXQgY2xlYXIgYm91bmRzIGFmdGVyIGxvY2tpbmcgKi8KLSAgIGN4ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1pbjsKLSAgIGN5ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWW1pbjsKLSAgIGN3ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1heCAtIGN4OwotICAgY2ggPSBpbnRlbC0+Y3R4LkRyYXdCdWZmZXItPl9ZbWF4IC0gY3k7Ci0gICBhbGwgPSAoY3cgPT0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5XaWR0aCAmJgotICAgICAgICAgIGNoID09IGludGVsLT5jdHguRHJhd0J1ZmZlci0+SGVpZ2h0KTsKLQotICAgaWYoIWFsbCkgewotICAgICAgeDAgPSBjeDsKLSAgICAgIHkwID0gY3k7Ci0gICAgICB4MSA9IHgwICsgY3c7Ci0gICAgICB5MSA9IHkwICsgY2g7Ci0gICB9IGVsc2UgewotICAgICAgeDAgPSAwOwotICAgICAgeTAgPSAwOwotICAgICAgeDEgPSB4MCArIGRQcml2LT53OwotICAgICAgeTEgPSB5MCArIGRQcml2LT5oOwotICAgfQotCi0gICAvKiBEb24ndCBkbyBhbnkgY2xpcHBpbmcgdG8gc2NyZWVuIC0gdGhlc2UgYXJlIHdpbmRvdyBjb29yZGluYXRlcy4KLSAgICAqIFRoZSBhY3RpdmUgY2xpcHJlY3RzIHdpbGwgYmUgYXBwbGllZCBhcyBmb3IgYW55IG90aGVyIGdlb21ldHJ5LgotICAgICovCi0KLSAgIGlmKG1hc2sgJiBCVUZGRVJfQklUX0ZST05UX0xFRlQpIHsKLSAgICAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpODMwICk7Ci0gICAgICBzZXRfY29sb3JfbWFzayggaTgzMCwgR0xfVFJVRSApOwotICAgICAgc2V0X2RyYXdfcmVnaW9uKCBpODMwLCAmc2NyZWVuLT5mcm9udCApOwotICAgICAgZHJhd19xdWFkKGk4MzAsIHgwLCB4MSwgeTAsIHkxLAotCQlpbnRlbC0+Y2xlYXJfcmVkLCBpbnRlbC0+Y2xlYXJfZ3JlZW4sCi0JCWludGVsLT5jbGVhcl9ibHVlLCBpbnRlbC0+Y2xlYXJfYWxwaGEsCi0JCTAsIDAsIDAsIDApOwotICAgfQotCi0gICBpZihtYXNrICYgQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKLSAgICAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpODMwICk7Ci0gICAgICBzZXRfY29sb3JfbWFzayggaTgzMCwgR0xfVFJVRSApOwotICAgICAgc2V0X2RyYXdfcmVnaW9uKCBpODMwLCAmc2NyZWVuLT5iYWNrICk7Ci0KLSAgICAgIGRyYXdfcXVhZChpODMwLCB4MCwgeDEsIHkwLCB5MSwKLQkJaW50ZWwtPmNsZWFyX3JlZCwgaW50ZWwtPmNsZWFyX2dyZWVuLAotCQlpbnRlbC0+Y2xlYXJfYmx1ZSwgaW50ZWwtPmNsZWFyX2FscGhhLAotCQkwLCAwLCAwLCAwKTsKLSAgIH0KLQotICAgaWYobWFzayAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgewotICAgICAgc2V0X3N0ZW5jaWxfcmVwbGFjZSggaTgzMCwgCi0JCQkgICBpbnRlbC0+Y3R4LlN0ZW5jaWwuV3JpdGVNYXNrWzBdLCAKLQkJCSAgIGludGVsLT5jdHguU3RlbmNpbC5DbGVhcik7Ci0KLSAgICAgIHNldF9jb2xvcl9tYXNrKCBpODMwLCBHTF9GQUxTRSApOwotICAgICAgc2V0X2RyYXdfcmVnaW9uKCBpODMwLCAmc2NyZWVuLT5mcm9udCApOwotICAgICAgZHJhd19xdWFkKCBpODMwLCB4MCwgeDEsIHkwLCB5MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCApOwotICAgfQotCi0gICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCi0gICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOwotICAgU0VUX1NUQVRFKCBpODMwLCBzdGF0ZSApOworICAgaTgzMC0+bWV0YS5CdWZmZXJbSTgzMF9ERVNUUkVHX1NFTkFCTEVdID0KKyAgICAgIGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfU0VOQUJMRV07CisgICBpODMwLT5tZXRhLkJ1ZmZlcltJODMwX0RFU1RSRUdfU1IxXSA9IGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfU1IxXTsKKyAgIGk4MzAtPm1ldGEuQnVmZmVyW0k4MzBfREVTVFJFR19TUjJdID0gaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19TUjJdOworICAgaTgzMC0+bWV0YS5lbWl0dGVkICY9IH5JODMwX1VQTE9BRF9CVUZGRVJTOwogfQogCiAKLSNpZiAwCiAKLUdMYm9vbGVhbgotaTgzMFRyeVRleHR1cmVSZWFkUGl4ZWxzKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCQkgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotCQkJICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssCi0JCQkgIEdMdm9pZCAqcGl4ZWxzICkKLXsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLSAgIGludGVsU2NyZWVuUHJpdmF0ZSAqc2NyZWVuID0gaTgzMC0+aW50ZWwuaW50ZWxTY3JlZW47Ci0gICBHTGludCBwaXRjaCA9IHBhY2stPlJvd0xlbmd0aCA/IHBhY2stPlJvd0xlbmd0aCA6IHdpZHRoOwotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaTgzMC0+aW50ZWwuZHJpRHJhd2FibGU7Ci0gICBpbnQgdGV4dHVyZUZvcm1hdDsKLSAgIEdMZW51bSBnbFRleHR1cmVGb3JtYXQ7Ci0gICBpbnQgc3JjX29mZnNldCA9IGk4MzAtPm1ldGEuQnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjJdOwotICAgaW50IGRlc3RPZmZzZXQgPSBpbnRlbEFncE9mZnNldEZyb21WaXJ0dWFsKCAmaTgzMC0+aW50ZWwsIHBpeGVscyk7Ci0gICBpbnQgZGVzdEZvcm1hdCwgZGVwdGhGb3JtYXQsIGRlc3RQaXRjaDsKLSAgIGRybV9jbGlwX3JlY3RfdCB0bXA7Ci0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotCi0gICBpZiAoCWN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSB8fAotCXBhY2stPlN3YXBCeXRlcyB8fAotCXBhY2stPkxzYkZpcnN0IHx8Ci0JIXBhY2stPkludmVydCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2hlY2tfY29sb3IgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICBzd2l0Y2ggKHNjcmVlbi0+ZmJGb3JtYXQpIHsKLSAgIGNhc2UgRFZfUEZfNTY1OgotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9SR0I1NjU7Ci0gICAgICBnbFRleHR1cmVGb3JtYXQgPSBHTF9SR0I7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRFZfUEZfNTU1OgotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BUkdCMTU1NTsKLSAgICAgIGdsVGV4dHVyZUZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRFZfUEZfODg4ODoKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfQVJHQjg4ODg7Ci0gICAgICBnbFRleHR1cmVGb3JtYXQgPSBHTF9SR0JBOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogdGV4dHVyZUZvcm1hdCBmYWlsZWQgJXhcbiIsIF9fRlVOQ1RJT05fXywKLQkgICAgICBzY3JlZW4tPmZiRm9ybWF0KTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLQotCi0gICBzd2l0Y2ggKHR5cGUpIHsKLSAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6IAotICAgICAgaWYgKGZvcm1hdCAhPSBHTF9SR0IpIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIGRlc3RGb3JtYXQgPSBDT0xSX0JVRl9SR0I1NjU7IAotICAgICAgZGVwdGhGb3JtYXQgPSBERVBUSF9GUk1UXzE2X0ZJWEVEOwotICAgICAgZGVzdFBpdGNoID0gcGl0Y2ggKiAyOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVjogCi0gICAgICBpZiAoZm9ybWF0ICE9IEdMX0JHUkEpIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIGRlc3RGb3JtYXQgPSBDT0xSX0JVRl9BUkdCODg4ODsgCi0gICAgICBkZXB0aEZvcm1hdCA9IERFUFRIX0ZSTVRfMjRfRklYRURfOF9PVEhFUjsKLSAgICAgIGRlc3RQaXRjaCA9IHBpdGNoICogNDsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGRlc3RGb3JtYXQgZmFpbGVkICVzXG4iLCBfX0ZVTkNUSU9OX18sCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodHlwZSkpOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICBkZXN0Rm9ybWF0IHw9ICgweDAyPDwyNCk7Ci0KLS8qICAgIGZwcmludGYoc3RkZXJyLCAidHlwZTogJXMgZGVzdEZvcm1hdDogJXhcbiIsICovCi0vKiAJICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodHlwZSksICovCi0vKiAJICAgZGVzdEZvcm1hdCk7ICovCi0KLSAgIGludGVsRmx1c2goIGN0eCApOwotCi0gICBTRVRfU1RBVEUoIGk4MzAsIG1ldGEgKTsKLSAgIHNldF9pbml0aWFsX3N0YXRlKCBpODMwICk7Ci0gICBzZXRfbm9fZGVwdGhfc3RlbmNpbF93cml0ZSggaTgzMCApOwotCi0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgewotICAgICAgaW50ZWxXYWl0Rm9ySWRsZSggaW50ZWwgKTsgLyogcmVxdWlyZWQgYnkgR0wgKi8KLQotICAgICAgaWYgKCFkcmlDbGlwUmVjdFRvRnJhbWVidWZmZXIoY3R4LT5SZWFkQnVmZmVyLCAmeCwgJnksICZ3aWR0aCwgJmhlaWdodCkpIHsKLQkgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotCSBTRVRfU1RBVEUoaTgzMCwgc3RhdGUpOwotCSBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjbGlwcmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JIHJldHVybiBHTF9UUlVFOwotICAgICAgfQotCi0jaWYgMAotICAgICAgLyogRklYTUUgLS0gSnVzdCBlbWl0IHRoZSBjb3JyZWN0IHN0YXRlCi0gICAgICAgKi8KLSAgICAgIGlmIChpODMwU2V0UGFyYW0oaTgzMC0+ZHJpRmQsIEk4MzBfU0VUUEFSQU1fQ0JVRkZFUl9QSVRDSCwgCi0JCSAgICAgIGRlc3RQaXRjaCkgIT0gMCkgewotCSBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0JIFNFVF9TVEFURShpODMwLCBzdGF0ZSk7Ci0JIGZwcmludGYoc3RkZXJyLCAiJXM6IHNldHBhcmFtIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgfQotI2VuZGlmCi0KLQotICAgICAgeSA9IGRQcml2LT5oIC0geSAtIGhlaWdodDsKLSAgICAgIHggKz0gZFByaXYtPng7Ci0gICAgICB5ICs9IGRQcml2LT55OwotCi0KLSAgICAgIC8qIFNldCB0aGUgZnJvbnRidWZmZXIgdXAgYXMgYSBsYXJnZSByZWN0YW5ndWxhciB0ZXh0dXJlLgotICAgICAgICovCi0gICAgICBzZXRfdGV4X3JlY3Rfc291cmNlKCBpODMwLCAKLQkJCSAgIHNyY19vZmZzZXQsIAotCQkJICAgc2NyZWVuLT53aWR0aCwgCi0JCQkgICBzY3JlZW4tPmhlaWdodCwgCi0JCQkgICBzY3JlZW4tPmZyb250LnBpdGNoLCAKLQkJCSAgIHRleHR1cmVGb3JtYXQgKTsgCi0gICAKLSAgIAotICAgICAgZW5hYmxlX3RleHR1cmVfYmxlbmRfcmVwbGFjZSggaTgzMCApOyAKLQotCi0gICAgICAvKiBTZXQgdGhlIDNkIGVuZ2luZSB0byBkcmF3IGludG8gdGhlIGFncCBtZW1vcnkKLSAgICAgICAqLwotCi0gICAgICBzZXRfZHJhd19yZWdpb24oIGk4MzAsIGRlc3RPZmZzZXQgKTsgCi0gICAgICBzZXRfZHJhd19mb3JtYXQoIGk4MzAsIGRlc3RGb3JtYXQsIGRlcHRoRm9ybWF0ICk7ICAKLQotCi0gICAgICAvKiBEcmF3IGEgc2luZ2xlIHF1YWQsIG5vIGNsaXByZWN0czoKLSAgICAgICAqLwotICAgICAgaTgzMC0+aW50ZWwubnVtQ2xpcFJlY3RzID0gMTsKLSAgICAgIGk4MzAtPmludGVsLnBDbGlwUmVjdHMgPSAmdG1wOwotICAgICAgaTgzMC0+aW50ZWwucENsaXBSZWN0c1swXS54MSA9IDA7Ci0gICAgICBpODMwLT5pbnRlbC5wQ2xpcFJlY3RzWzBdLnkxID0gMDsKLSAgICAgIGk4MzAtPmludGVsLnBDbGlwUmVjdHNbMF0ueDIgPSB3aWR0aDsKLSAgICAgIGk4MzAtPmludGVsLnBDbGlwUmVjdHNbMF0ueTIgPSBoZWlnaHQ7Ci0KLSAgICAgIGRyYXdfcXVhZCggaTgzMCwgCi0JCSAwLCB3aWR0aCwgMCwgaGVpZ2h0LCAKLQkJIDAsIDI1NSwgMCwgMCwgCi0JCSB4LCB4K3dpZHRoLCB5LCB5K2hlaWdodCApOwotCi0gICAgICBpbnRlbFdpbmRvd01vdmVkKCBpbnRlbCApOwotICAgfQotICAgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgaW50ZWxGaW5pc2goIGN0eCApOyAvKiByZXF1aXJlZCBieSBHTCAqLwotCi0gICBTRVRfU1RBVEUoIGk4MzAsIHN0YXRlICk7Ci0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotCi1HTGJvb2xlYW4KLWk4MzBUcnlUZXh0dXJlRHJhd1BpeGVscyggR0xjb250ZXh0ICpjdHgsCi0JCQkgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotCQkJICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLQkJCSAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCi0JCQkgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKLSAgIEdMaW50IHBpdGNoID0gdW5wYWNrLT5Sb3dMZW5ndGggPyB1bnBhY2stPlJvd0xlbmd0aCA6IHdpZHRoOwotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotICAgaW50IHRleHR1cmVGb3JtYXQ7Ci0gICBHTGVudW0gZ2xUZXh0dXJlRm9ybWF0OwotICAgaW50IGRzdF9vZmZzZXQgPSBpODMwLT5tZXRhLkJ1ZmZlcltJODMwX0RFU1RSRUdfQ0JVRkFERFIyXTsKLSAgIGludCBzcmNfb2Zmc2V0ID0gaW50ZWxBZ3BPZmZzZXRGcm9tVmlydHVhbCggaW50ZWwsIHBpeGVscyApOwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIC8qIFRvZG8gLS0gdXBsb2FkIGltYWdlcyB0aGF0IGFyZW4ndCBpbiBhZ3Agc3BhY2UsIHRoZW4gdGV4dHVyZQotICAgICogZnJvbSB0aGVtLiAgCi0gICAgKi8KLQotICAgaWYgKCAhaW50ZWxJc0FncE1lbW9yeSggaW50ZWwsIHBpeGVscywgcGl0Y2gqaGVpZ2h0ICkgKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnRlbElzQWdwTWVtb3J5IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLQotICAgLyogVG9kbyAtLSBkb24ndCB3YW50IHRvIGNsb2JiZXIgYWxsIHRoZSBkcmF3aW5nIHN0YXRlIGxpa2Ugd2UgZG8KLSAgICAqIGZvciByZWFkcGl4ZWxzIC0tIG1vc3Qgb2YgdGhpcyBzdGF0ZSBjYW4gYmUgaGFuZGxlZCBqdXN0IGZpbmUuCi0gICAgKi8KLSAgIGlmICgJY3R4LT5fSW1hZ2VUcmFuc2ZlclN0YXRlIHx8Ci0JdW5wYWNrLT5Td2FwQnl0ZXMgfHwKLQl1bnBhY2stPkxzYkZpcnN0IHx8Ci0JY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQgfHwgCi0JY3R4LT5EZXB0aC5UZXN0IHx8Ci0JY3R4LT5Gb2cuRW5hYmxlZCB8fAotCWN0eC0+U2Npc3Nvci5FbmFibGVkIHx8Ci0JY3R4LT5TdGVuY2lsLkVuYWJsZWQgfHwKLQkhY3R4LT5Db2xvci5Db2xvck1hc2tbMF0gfHwKLQkhY3R4LT5Db2xvci5Db2xvck1hc2tbMV0gfHwKLQkhY3R4LT5Db2xvci5Db2xvck1hc2tbMl0gfHwKLQkhY3R4LT5Db2xvci5Db2xvck1hc2tbM10gfHwKLQljdHgtPkNvbG9yLkNvbG9yTG9naWNPcEVuYWJsZWQgfHwKLQljdHgtPlRleHR1cmUuX0VuYWJsZWRVbml0cyB8fAotCWN0eC0+RGVwdGguT2NjbHVzaW9uVGVzdCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3RoZXIgdGVzdHMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICAvKiBUb2RvIC0tIHJlbW92ZSB0aGVzZSByZXN0cmljdGlvbnM6Ci0gICAgKi8KLSAgIGlmIChjdHgtPlBpeGVsLlpvb21YICE9IDEuMEYgfHwKLSAgICAgICBjdHgtPlBpeGVsLlpvb21ZICE9IC0xLjBGKQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotCi0KLQotICAgc3dpdGNoICh0eXBlKSB7Ci0gICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWOgotICAgICAgaWYgKGZvcm1hdCAhPSBHTF9CR1JBKSByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FSR0IxNTU1OwotICAgICAgZ2xUZXh0dXJlRm9ybWF0ID0gR0xfUkdCQTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTogCi0gICAgICBpZiAoZm9ybWF0ICE9IEdMX1JHQikgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9SR0I1NjU7Ci0gICAgICBnbFRleHR1cmVGb3JtYXQgPSBHTF9SR0I7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0E6IAotICAgICAgaWYgKGZvcm1hdCAhPSBHTF9ZQ0JDUl9NRVNBKSByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfNDIyIHwgTVRfNDIyX1lDUkNCX1NXQVBZIAotLyogIAkJICAgICAgIHwgVE0wUzFfQ09MT1JTUEFDRV9DT05WRVJTSU9OICovCi0JICk7Ci0gICAgICBnbFRleHR1cmVGb3JtYXQgPSBHTF9ZQ0JDUl9NRVNBOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfTUVTQTogCi0gICAgICBpZiAoZm9ybWF0ICE9IEdMX1lDQkNSX01FU0EpIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfTk9STUFMIAotLyogCQkgICAgICAgfCBUTTBTMV9DT0xPUlNQQUNFX0NPTlZFUlNJT04gKi8KLQkgKTsKLSAgICAgIGdsVGV4dHVyZUZvcm1hdCA9IEdMX1lDQkNSX01FU0E7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOiAKLSAgICAgIGlmIChmb3JtYXQgIT0gR0xfQkdSQSkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9BUkdCODg4ODsKLSAgICAgIGdsVGV4dHVyZUZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBkZXN0Rm9ybWF0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLQotICAgaW50ZWxGbHVzaCggY3R4ICk7Ci0KLSAgIFNFVF9TVEFURSggaTgzMCwgbWV0YSApOwotCi0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgewotICAgICAgaW50ZWxXYWl0Rm9ySWRsZSggaW50ZWwgKTsgLyogcmVxdWlyZWQgYnkgR0wgKi8KLQotICAgICAgeSAtPSBoZWlnaHQ7CQkJLyogY29wZSB3aXRoIHBpeGVsIHpvb20gKi8KLQotICAgICAgaWYgKCFkcmlDbGlwUmVjdFRvRnJhbWVidWZmZXIoY3R4LT5SZWFkQnVmZmVyLCAmeCwgJnksICZ3aWR0aCwgJmhlaWdodCkpIHsKLQkgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotCSBTRVRfU1RBVEUoaTgzMCwgc3RhdGUpOwotCSBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjbGlwcmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JIHJldHVybiBHTF9UUlVFOwotICAgICAgfQotCi0KLSAgICAgIHkgPSBkUHJpdi0+aCAtIHkgLSBoZWlnaHQ7Ci0KLSAgICAgIHNldF9pbml0aWFsX3N0YXRlKCBpODMwICk7Ci0KLSAgICAgIC8qIFNldCB0aGUgcGl4ZWwgaW1hZ2UgdXAgYXMgYSByZWN0YW5ndWxhciB0ZXh0dXJlLgotICAgICAgICovCi0gICAgICBzZXRfdGV4X3JlY3Rfc291cmNlKCBpODMwLCAKLQkJCSAgIHNyY19vZmZzZXQsIAotCQkJICAgd2lkdGgsIAotCQkJICAgaGVpZ2h0LCAKLQkJCSAgIHBpdGNoLCAvKiBYWFhYISEhISAtLSAvMiBzb21ldGltZXMgKi8KLQkJCSAgIHRleHR1cmVGb3JtYXQgKTsgCi0gICAKLSAgIAotICAgICAgZW5hYmxlX3RleHR1cmVfYmxlbmRfcmVwbGFjZSggaTgzMCApOyAKLQotICAgCi0gICAgICAvKiBEcmF3IHRvIHRoZSBjdXJyZW50IGRyYXcgYnVmZmVyOgotICAgICAgICovCi0gICAgICBzZXRfZHJhd19vZmZzZXQoIGk4MzAsIGRzdF9vZmZzZXQgKTsKLQotICAgICAgLyogRHJhdyBhIHF1YWQsIHVzZSByZWd1bGFyIGNsaXByZWN0cwotICAgICAgICovCi0vKiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIng6ICVkIHk6ICVkIHdpZHRoICVkIGhlaWdodCAlZFxuIiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7ICovCi0KLSAgICAgIGRyYXdfcXVhZCggaTgzMCwgCi0JCSB4LCB4K3dpZHRoLCB5LCB5K2hlaWdodCwKLQkJIDAsIDI1NSwgMCwgMCwgCi0JCSAwLCB3aWR0aCwgMCwgaGVpZ2h0ICk7Ci0KLSAgICAgIGludGVsV2luZG93TW92ZWQoIGludGVsICk7Ci0gICB9Ci0gICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICBpbnRlbEZpbmlzaCggY3R4ICk7IC8qIHJlcXVpcmVkIGJ5IEdMICovCi0gICAKLSAgIFNFVF9TVEFURShpODMwLCBzdGF0ZSk7Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0jZW5kaWYKLQotLyoqCi0gKiBDb3B5IHRoZSB3aW5kb3cgY29udGVudHMgbmFtZWQgYnkgZFByaXYgdG8gdGhlIHJvdGF0ZWQgKG9yIHJlZmxlY3RlZCkKLSAqIGNvbG9yIGJ1ZmZlci4KLSAqIHNyY0J1ZiBpcyBCVUZGRVJfQklUX0ZST05UX0xFRlQgb3IgQlVGRkVSX0JJVF9CQUNLX0xFRlQgdG8gaW5kaWNhdGUgdGhlIHNvdXJjZS4KKy8qIFNlbGVjdCBiZXR3ZWVuIGZyb250IGFuZCBiYWNrIGRyYXcgYnVmZmVycy4KICAqLwotdm9pZAotaTgzMFJvdGF0ZVdpbmRvdyhpbnRlbENvbnRleHRQdHIgaW50ZWwsIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiwKLSAgICAgICAgICAgICAgICAgR0x1aW50IHNyY0J1ZikKK3N0YXRpYyB2b2lkCittZXRhX2RyYXdfcmVnaW9uKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqY29sb3JfcmVnaW9uLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb24pCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKCBpbnRlbCApOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICpzY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47Ci0gICBjb25zdCBHTHVpbnQgY3BwID0gc2NyZWVuLT5jcHA7Ci0gICBkcm1fY2xpcF9yZWN0X3QgZnVsbFJlY3Q7Ci0gICBHTHVpbnQgdGV4dHVyZUZvcm1hdCwgc3JjT2Zmc2V0LCBzcmNQaXRjaDsKLSAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqY2xpcFJlY3RzOwotICAgaW50IG51bUNsaXBSZWN0czsKLSAgIGludCBpOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CiAKLSAgIGludCB4T3JpZywgeU9yaWc7Ci0gICBpbnQgb3JpZ051bUNsaXBSZWN0czsKLSAgIGRybV9jbGlwX3JlY3RfdCAqb3JpZ1JlY3RzOwotCi0gICAvKgotICAgICogc2V0IHVwIGhhcmR3YXJlIHN0YXRlCi0gICAgKi8KLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0KLSAgIFNFVF9TVEFURSggaTgzMCwgbWV0YSApOyAKLSAgIHNldF9pbml0aWFsX3N0YXRlKCBpODMwICk7IAotICAgc2V0X25vX3RleHR1cmUoIGk4MzAgKTsgCi0gICBzZXRfdmVydGV4X2Zvcm1hdCggaTgzMCApOyAKLSAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpODMwICk7Ci0gICBzZXRfY29sb3JfbWFzayggaTgzMCwgR0xfRkFMU0UgKTsKLQotICAgTE9DS19IQVJEV0FSRShpbnRlbCk7Ci0KLSAgIC8qIHNhdmUgY3VycmVudCBkcmF3aW5nIG9yaWdpbiBhbmQgY2xpcHJlY3RzIChyZXN0b3JlZCBhdCBlbmQpICovCi0gICB4T3JpZyA9IGludGVsLT5kcmF3WDsKLSAgIHlPcmlnID0gaW50ZWwtPmRyYXdZOwotICAgb3JpZ051bUNsaXBSZWN0cyA9IGludGVsLT5udW1DbGlwUmVjdHM7Ci0gICBvcmlnUmVjdHMgPSBpbnRlbC0+cENsaXBSZWN0czsKLQotICAgaWYgKCFpbnRlbC0+bnVtQ2xpcFJlY3RzKQotICAgICAgZ290byBkb25lOwotCi0gICAvKgotICAgICogc2V0IGRyYXdpbmcgb3JpZ2luLCBjbGlwcmVjdHMgZm9yIGZ1bGwtc2NyZWVuIGFjY2VzcyB0byByb3RhdGVkIHNjcmVlbgotICAgICovCi0gICBmdWxsUmVjdC54MSA9IDA7Ci0gICBmdWxsUmVjdC55MSA9IDA7Ci0gICBmdWxsUmVjdC54MiA9IHNjcmVlbi0+cm90YXRlZFdpZHRoOwotICAgZnVsbFJlY3QueTIgPSBzY3JlZW4tPnJvdGF0ZWRIZWlnaHQ7Ci0gICBpbnRlbC0+ZHJhd1ggPSAwOwotICAgaW50ZWwtPmRyYXdZID0gMDsKLSAgIGludGVsLT5udW1DbGlwUmVjdHMgPSAxOwotICAgaW50ZWwtPnBDbGlwUmVjdHMgPSAmZnVsbFJlY3Q7Ci0KLSAgIHNldF9kcmF3X3JlZ2lvbiggaTgzMCwgJnNjcmVlbi0+cm90YXRlZCApOwotCi0gICBpZiAoY3BwID09IDQpCi0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl8zMkJJVCB8IE1UXzMyQklUX0FSR0I4ODg4OwotICAgZWxzZQotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9SR0I1NjU7Ci0KLSAgIGlmIChzcmNCdWYgPT0gQlVGRkVSX0JJVF9GUk9OVF9MRUZUKSB7Ci0gICAgICBzcmNQaXRjaCA9IHNjcmVlbi0+ZnJvbnQucGl0Y2g7ICAgLyogaW4gYnl0ZXMgKi8KLSAgICAgIHNyY09mZnNldCA9IHNjcmVlbi0+ZnJvbnQub2Zmc2V0OyAvKiBieXRlcyAqLwotICAgICAgY2xpcFJlY3RzID0gZFByaXYtPnBDbGlwUmVjdHM7Ci0gICAgICBudW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBzcmNQaXRjaCA9IHNjcmVlbi0+YmFjay5waXRjaDsgICAvKiBpbiBieXRlcyAqLwotICAgICAgc3JjT2Zmc2V0ID0gc2NyZWVuLT5iYWNrLm9mZnNldDsgLyogYnl0ZXMgKi8KLSAgICAgIGNsaXBSZWN0cyA9IGRQcml2LT5wQmFja0NsaXBSZWN0czsKLSAgICAgIG51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1CYWNrQ2xpcFJlY3RzOwotICAgfQotCi0gICAvKiBzZXQgdGhlIHdob2xlIHNjcmVlbiB1cCBhcyBhIHRleHR1cmUgdG8gYXZvaWQgYWxpZ25tZW50IGlzc3VlcyAqLwotICAgc2V0X3RleF9yZWN0X3NvdXJjZShpODMwLAotICAgICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi0+d2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZvcm1hdCk7Ci0KLSAgIGVuYWJsZV90ZXh0dXJlX2JsZW5kX3JlcGxhY2UoaTgzMCk7Ci0KLSAgIC8qCi0gICAgKiBsb29wIG92ZXIgdGhlIHNvdXJjZSB3aW5kb3cncyBjbGlwcmVjdHMKLSAgICAqLwotICAgZm9yIChpID0gMDsgaSA8IG51bUNsaXBSZWN0czsgaSsrKSB7Ci0gICAgICBpbnQgc3JjWDAgPSBjbGlwUmVjdHNbaV0ueDE7Ci0gICAgICBpbnQgc3JjWTAgPSBjbGlwUmVjdHNbaV0ueTE7Ci0gICAgICBpbnQgc3JjWDEgPSBjbGlwUmVjdHNbaV0ueDI7Ci0gICAgICBpbnQgc3JjWTEgPSBjbGlwUmVjdHNbaV0ueTI7Ci0gICAgICBHTGZsb2F0IHZlcnRzWzRdWzJdLCB0ZXhbNF1bMl07Ci0gICAgICBpbnQgajsKLQotICAgICAgLyogYnVpbGQgdmVydGljZXMgZm9yIGZvdXIgY29ybmVycyBvZiBjbGlwIHJlY3QgKi8KLSAgICAgIHZlcnRzWzBdWzBdID0gc3JjWDA7ICB2ZXJ0c1swXVsxXSA9IHNyY1kwOwotICAgICAgdmVydHNbMV1bMF0gPSBzcmNYMTsgIHZlcnRzWzFdWzFdID0gc3JjWTA7Ci0gICAgICB2ZXJ0c1syXVswXSA9IHNyY1gxOyAgdmVydHNbMl1bMV0gPSBzcmNZMTsKLSAgICAgIHZlcnRzWzNdWzBdID0gc3JjWDA7ICB2ZXJ0c1szXVsxXSA9IHNyY1kxOwotCi0gICAgICAvKiAuLiBhbmQgdGV4Y29vcmRzICovCi0gICAgICB0ZXhbMF1bMF0gPSBzcmNYMDsgIHRleFswXVsxXSA9IHNyY1kwOwotICAgICAgdGV4WzFdWzBdID0gc3JjWDE7ICB0ZXhbMV1bMV0gPSBzcmNZMDsKLSAgICAgIHRleFsyXVswXSA9IHNyY1gxOyAgdGV4WzJdWzFdID0gc3JjWTE7Ci0gICAgICB0ZXhbM11bMF0gPSBzcmNYMDsgIHRleFszXVsxXSA9IHNyY1kxOwotCi0gICAgICAvKiB0cmFuc2Zvcm0gY29vcmRzIHRvIHJvdGF0ZWQgc2NyZWVuIGNvb3JkcyAqLwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICAgICBtYXRyaXgyM1RyYW5zZm9ybUNvb3JkZigmc2NyZWVuLT5yb3RNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydHNbal1bMF0sICZ2ZXJ0c1tqXVsxXSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGRyYXcgcG9seWdvbiB0byBtYXAgc291cmNlIGltYWdlIHRvIGRlc3QgcmVnaW9uICovCi0gICAgICBkcmF3X3BvbHkoaTgzMCwgMjU1LCAyNTUsIDI1NSwgMjU1LCA0LCB2ZXJ0cywgdGV4KTsKLQotICAgfSAvKiBjbGlwcmVjdCBsb29wICovCi0KLSAgIGludGVsRmx1c2hCYXRjaExvY2tlZCggaW50ZWwsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UgKTsKLQotIGRvbmU6Ci0gICAvKiByZXN0b3JlIG9yaWdpbmFsIGRyYXdpbmcgb3JpZ2luIGFuZCBjbGlwcmVjdHMgKi8KLSAgIGludGVsLT5kcmF3WCA9IHhPcmlnOwotICAgaW50ZWwtPmRyYXdZID0geU9yaWc7Ci0gICBpbnRlbC0+bnVtQ2xpcFJlY3RzID0gb3JpZ051bUNsaXBSZWN0czsKLSAgIGludGVsLT5wQ2xpcFJlY3RzID0gb3JpZ1JlY3RzOwotCi0gICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCi0gICBTRVRfU1RBVEUoIGk4MzAsIHN0YXRlICk7CisgICBpODMwX3N0YXRlX2RyYXdfcmVnaW9uKGludGVsLCAmaTgzMC0+bWV0YSwgY29sb3JfcmVnaW9uLCBkZXB0aF9yZWdpb24pOwogfQogCisKKy8qIE9wZXJhdGlvbnMgd2hlcmUgdGhlIDNEIGVuZ2luZSBpcyBkZWNvdXBsZWQgdGVtcG9yYXJpbHkgZnJvbSB0aGUKKyAqIGN1cnJlbnQgR0wgc3RhdGUgYW5kIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIHRoYW4gc2ltcGx5IHJlbmRlcmluZworICogaW5jb21pbmcgdHJpYW5nbGVzLgorICovCitzdGF0aWMgdm9pZAoraW5zdGFsbF9tZXRhX3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOworICAgbWVtY3B5KCZpODMwLT5tZXRhLCAmaTgzMC0+aW5pdGlhbCwgc2l6ZW9mKGk4MzAtPm1ldGEpKTsKKworICAgaTgzMC0+bWV0YS5hY3RpdmUgPSBBQ1RJVkU7CisgICBpODMwLT5tZXRhLmVtaXR0ZWQgPSAwOworCisgICBTRVRfU1RBVEUoaTgzMCwgbWV0YSk7CisgICBzZXRfdmVydGV4X2Zvcm1hdChpbnRlbCk7CisgICBzZXRfbm9fdGV4dHVyZShpbnRlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitsZWF2ZV9tZXRhX3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOworICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJmk4MzAtPm1ldGEuZHJhd19yZWdpb24pOworICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJmk4MzAtPm1ldGEuZGVwdGhfcmVnaW9uKTsKKy8qICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKGludGVsLCAmaTgzMC0+bWV0YS50ZXhfcmVnaW9uWzBdKTsgKi8KKyAgIFNFVF9TVEFURShpODMwLCBzdGF0ZSk7Cit9CisKKworCit2b2lkCitpODMwSW5pdE1ldGFGdW5jcyhzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKQoreworICAgaTgzMC0+aW50ZWwudnRibC5pbnN0YWxsX21ldGFfc3RhdGUgPSBpbnN0YWxsX21ldGFfc3RhdGU7CisgICBpODMwLT5pbnRlbC52dGJsLmxlYXZlX21ldGFfc3RhdGUgPSBsZWF2ZV9tZXRhX3N0YXRlOworICAgaTgzMC0+aW50ZWwudnRibC5tZXRhX25vX2RlcHRoX3dyaXRlID0gc2V0X25vX2RlcHRoX3dyaXRlOworICAgaTgzMC0+aW50ZWwudnRibC5tZXRhX25vX3N0ZW5jaWxfd3JpdGUgPSBzZXRfbm9fc3RlbmNpbF93cml0ZTsKKyAgIGk4MzAtPmludGVsLnZ0YmwubWV0YV9zdGVuY2lsX3JlcGxhY2UgPSBzZXRfc3RlbmNpbF9yZXBsYWNlOworICAgaTgzMC0+aW50ZWwudnRibC5tZXRhX2RlcHRoX3JlcGxhY2UgPSBzZXRfZGVwdGhfcmVwbGFjZTsKKyAgIGk4MzAtPmludGVsLnZ0YmwubWV0YV9jb2xvcl9tYXNrID0gc2V0X2NvbG9yX21hc2s7CisgICBpODMwLT5pbnRlbC52dGJsLm1ldGFfbm9fdGV4dHVyZSA9IHNldF9ub190ZXh0dXJlOworICAgaTgzMC0+aW50ZWwudnRibC5tZXRhX3RleHR1cmVfYmxlbmRfcmVwbGFjZSA9IHNldF90ZXh0dXJlX2JsZW5kX3JlcGxhY2U7CisgICBpODMwLT5pbnRlbC52dGJsLm1ldGFfdGV4X3JlY3Rfc291cmNlID0gc2V0X3RleF9yZWN0X3NvdXJjZTsKKyAgIGk4MzAtPmludGVsLnZ0YmwubWV0YV9kcmF3X3JlZ2lvbiA9IG1ldGFfZHJhd19yZWdpb247CisgICBpODMwLT5pbnRlbC52dGJsLm1ldGFfaW1wb3J0X3BpeGVsX3N0YXRlID0gbWV0YV9pbXBvcnRfcGl4ZWxfc3RhdGU7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfcmVnLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfcmVnLmgKaW5kZXggOThjZWUyZi4uZDIxMGMyZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX3JlZy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9yZWcuaApAQCAtNDA3LDcgKzQwNyw3IEBACiAjZGVmaW5lIExPR0lDT1BfU0VUCQkJMHhmCiAjZGVmaW5lIE1PREU0X0VOQUJMRV9TVEVOQ0lMX1RFU1RfTUFTSwkoKDE8PDE3KXwoMHhmZjAwKSkKICNkZWZpbmUgRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLCSgxPDwxNykKLSNkZWZpbmUgU1RFTkNJTF9URVNUX01BU0soeCkJCSgoeCk8PDgpCisjZGVmaW5lIFNURU5DSUxfVEVTVF9NQVNLKHgpCQkoKCh4KSYweGZmKTw8OCkKICNkZWZpbmUgTU9ERTRfRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSwkoKDE8PDE2KXwoMHgwMGZmKSkKICNkZWZpbmUgRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSwkoMTw8MTYpCiAjZGVmaW5lIFNURU5DSUxfV1JJVEVfTUFTSyh4KQkJKCh4KSYweGZmKQpAQCAtNDk0LDEwICs0OTQsNiBAQAogI2RlZmluZSBWRlQxX1RFWDBfRk1UKHgpCSh4KQogI2RlZmluZSBWRlQxX1RFWDBfTUFTSyAgICAgICAgICAzCiAjZGVmaW5lIFZGVDFfVEVYMV9TSElGVCAgICAgICAgIDIKLSNkZWZpbmUgVEVYQ09PUkRGTVRfMkQJCTAKLSNkZWZpbmUgVEVYQ09PUkRGTVRfM0QJCTEKLSNkZWZpbmUgVEVYQ09PUkRGTVRfNEQJCTIKLSNkZWZpbmUgVEVYQ09PUkRGTVRfMUQJCTMKIAogLypOZXcgc3R1ZmYgcGlja2VkIHVwIGFsb25nIHRoZSB3YXkgKi8KIApAQCAtNTU0LDggKzU1MCw4IEBACiAjZGVmaW5lICAgIE1BUFNVUkZfNEJJVF9JTkRFWEVECQkgICAoNzw8NikKICNkZWZpbmUgVE0wUzFfTVRfRk9STUFUX01BU0sgICAgICAgICAoMHg3IDw8IDMpCiAjZGVmaW5lIFRNMFMxX01UX0ZPUk1BVF9TSElGVCAgICAgICAgMwotI2RlZmluZSAgICBNVF80QklUX0lEWF9BUkdCODg4OAkgICAgICAgICAgICg3PDwzKSAvKiBTVVJGQUNFXzRCSVRfSU5ERVhFRCAqLwotI2RlZmluZSAgICBNVF84QklUX0lEWF9SR0I1NjUJICAgICAgICAgICAoMDw8MykgLyogU1VSRkFDRV84QklUX0lOREVYRUQgKi8KKyNkZWZpbmUgICAgTVRfNEJJVF9JRFhfQVJHQjg4ODgJICAgICAgICAgICAoNzw8MykgICAgICAgLyogU1VSRkFDRV80QklUX0lOREVYRUQgKi8KKyNkZWZpbmUgICAgTVRfOEJJVF9JRFhfUkdCNTY1CSAgICAgICAgICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfOEJJVF9JTkRFWEVEICovCiAjZGVmaW5lICAgIE1UXzhCSVRfSURYX0FSR0IxNTU1CSAgICAgICAgICAgKDE8PDMpCiAjZGVmaW5lICAgIE1UXzhCSVRfSURYX0FSR0I0NDQ0CSAgICAgICAgICAgKDI8PDMpCiAjZGVmaW5lICAgIE1UXzhCSVRfSURYX0FZODgJCSAgICgzPDwzKQpAQCAtNTYzLDkgKzU1OSw5IEBACiAjZGVmaW5lICAgIE1UXzhCSVRfSURYX0JVTVBfODhEVkRVIAkgICAoNTw8MykKICNkZWZpbmUgICAgTVRfOEJJVF9JRFhfQlVNUF82NTVMRFZEVQkgICAoNjw8MykKICNkZWZpbmUgICAgTVRfOEJJVF9JRFhfQVJHQjg4ODgJICAgICAgICAgICAoNzw8MykKLSNkZWZpbmUgICAgTVRfOEJJVF9JOAkJICAgICAgICAgICAoMDw8MykgLyogU1VSRkFDRV84QklUICovCisjZGVmaW5lICAgIE1UXzhCSVRfSTgJCSAgICAgICAgICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfOEJJVCAqLwogI2RlZmluZSAgICBNVF84QklUX0w4CQkgICAgICAgICAgICgxPDwzKQotI2RlZmluZSAgICBNVF8xNkJJVF9SR0I1NjUgCQkgICAoMDw8MykgLyogU1VSRkFDRV8xNkJJVCAqLworI2RlZmluZSAgICBNVF8xNkJJVF9SR0I1NjUgCQkgICAoMDw8MykgICAgICAgLyogU1VSRkFDRV8xNkJJVCAqLwogI2RlZmluZSAgICBNVF8xNkJJVF9BUkdCMTU1NQkJICAgKDE8PDMpCiAjZGVmaW5lICAgIE1UXzE2QklUX0FSR0I0NDQ0CQkgICAoMjw8MykKICNkZWZpbmUgICAgTVRfMTZCSVRfQVk4OAkJICAgKDM8PDMpCkBAIC01NzMsMTYgKzU2OSwxNyBAQAogI2RlZmluZSAgICBNVF8xNkJJVF9CVU1QXzg4RFZEVQkgICAgICAgICAgICg1PDwzKQogI2RlZmluZSAgICBNVF8xNkJJVF9CVU1QXzY1NUxEVkRVCSAgICg2PDwzKQogI2RlZmluZSAgICBNVF8xNkJJVF9ESUJfUkdCNTY1Xzg4ODgJICAgKDc8PDMpCi0jZGVmaW5lICAgIE1UXzMyQklUX0FSR0I4ODg4CQkgICAoMDw8MykgLyogU1VSRkFDRV8zMkJJVCAqLworI2RlZmluZSAgICBNVF8zMkJJVF9BUkdCODg4OAkJICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfMzJCSVQgKi8KICNkZWZpbmUgICAgTVRfMzJCSVRfQUJHUjg4ODgJCSAgICgxPDwzKQorI2RlZmluZSAgICBNVF8zMkJJVF9YUkdCODg4OAkJICAgKDI8PDMpICAgICAgIC8qIFhYWDogR3Vlc3MgZnJvbSBpOTE1X3JlZy5oICovCiAjZGVmaW5lICAgIE1UXzMyQklUX0JVTVBfWExEVkRVXzg4ODgJICAgKDY8PDMpCiAjZGVmaW5lICAgIE1UXzMyQklUX0RJQl84ODg4CQkgICAoNzw8MykKLSNkZWZpbmUgICAgTVRfNDExX1lVVjQxMQkJICAgKDA8PDMpIC8qIFNVUkZBQ0VfNDExICovCi0jZGVmaW5lICAgIE1UXzQyMl9ZQ1JDQl9TV0FQWQkgICAgICAgICAgICgwPDwzKSAvKiBTVVJGQUNFXzQyMiAqLworI2RlZmluZSAgICBNVF80MTFfWVVWNDExCQkgICAoMDw8MykgICAgICAgLyogU1VSRkFDRV80MTEgKi8KKyNkZWZpbmUgICAgTVRfNDIyX1lDUkNCX1NXQVBZCSAgICAgICAgICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfNDIyICovCiAjZGVmaW5lICAgIE1UXzQyMl9ZQ1JDQl9OT1JNQUwJICAgICAgICAgICAoMTw8MykKICNkZWZpbmUgICAgTVRfNDIyX1lDUkNCX1NXQVBVVgkgICAgICAgICAgICgyPDwzKQogI2RlZmluZSAgICBNVF80MjJfWUNSQ0JfU1dBUFVWWQkgICAgICAgICAgICgzPDwzKQotI2RlZmluZSAgICBNVF9DT01QUkVTU19EWFQxCQkgICAoMDw8MykgLyogU1VSRkFDRV9DT01QUkVTU0VEICovCisjZGVmaW5lICAgIE1UX0NPTVBSRVNTX0RYVDEJCSAgICgwPDwzKSAgICAgICAvKiBTVVJGQUNFX0NPTVBSRVNTRUQgKi8KICNkZWZpbmUgICAgTVRfQ09NUFJFU1NfRFhUMl8zCSAgICAgICAgICAgKDE8PDMpCiAjZGVmaW5lICAgIE1UX0NPTVBSRVNTX0RYVDRfNQkgICAgICAgICAgICgyPDwzKQogI2RlZmluZSAgICBNVF9DT01QUkVTU19GWFQxCQkgICAoMzw8MykKQEAgLTYzNCw4ICs2MzEsNCBAQAogI2RlZmluZSBFTkFCTEVfVEVYX1NUUkVBTV9NQVBfSURYCSgxPDwzKQogI2RlZmluZSBURVhfU1RSRUFNX01BUF9JRFgoeCkJCSh4KQogCi0KLSNkZWZpbmUgTUlfRkxVU0ggICAgICAgICAgICgoMDw8MjkpfCg0PDwyMykpCi0jZGVmaW5lIEZMVVNIX01BUF9DQUNIRSAgICAoMTw8MCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9zdGF0ZS5jCmluZGV4IGY3OTgwMjAuLmU0NGE3ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF9zdGF0ZS5jCkBAIC0zOCwxNDkgKzM4LDE1MSBAQAogCiAjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKIAogI2luY2x1ZGUgImk4MzBfY29udGV4dC5oIgogI2luY2x1ZGUgImk4MzBfcmVnLmgiCiAKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX1NUQVRFCisKIHN0YXRpYyB2b2lkCi1pODMwU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsCitpODMwU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG1hc2spCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBpbnQgdGVzdCA9IGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoZnVuYyk7CiAKICAgIG1hc2sgPSBtYXNrICYgMHhmZjsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgOiBmdW5jOiAlcywgcmVmIDogMHgleCwgbWFzazogMHgleFxuIiwgX19GVU5DVElPTl9fLAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGZ1bmMpLCByZWYsIG1hc2spOworICAgREJHKCIlcyA6IGZ1bmM6ICVzLCByZWYgOiAweCV4LCBtYXNrOiAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoZnVuYyksIHJlZiwgbWFzayk7CiAKIAogICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNF0gJj0gfk1PREU0X0VOQUJMRV9TVEVOQ0lMX1RFU1RfTUFTSzsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTRdIHw9IChFTkFCTEVfU1RFTkNJTF9URVNUX01BU0sgfAotCQkJCQlTVEVOQ0lMX1RFU1RfTUFTSyhtYXNrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9URVNUX01BU0sobWFzaykpOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NURU5DSUxUU1RdICY9IH4oU1RFTkNJTF9SRUZfVkFMVUVfTUFTSyB8Ci0JCQkJCSAgICAgRU5BQkxFX1NURU5DSUxfVEVTVF9GVU5DX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1NURU5DSUxfVEVTVF9GVU5DX01BU0spOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NURU5DSUxUU1RdIHw9IChFTkFCTEVfU1RFTkNJTF9SRUZfVkFMVUUgfAotCQkJCQkgICAgRU5BQkxFX1NURU5DSUxfVEVTVF9GVU5DIHwKLQkJCQkJICAgIFNURU5DSUxfUkVGX1ZBTFVFKHJlZikgfAotCQkJCQkgICAgU1RFTkNJTF9URVNUX0ZVTkModGVzdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfU1RFTkNJTF9URVNUX0ZVTkMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1JFRl9WQUxVRShyZWYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9URVNUX0ZVTkModGVzdCkpOwogfQogCiBzdGF0aWMgdm9pZAotaTgzMFN0ZW5jaWxNYXNrU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykKK2k4MzBTdGVuY2lsTWFza1NlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQogewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dChjdHgpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyA6IG1hc2sgMHgleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKLQorICAgREJHKCIlcyA6IG1hc2sgMHgleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKKyAgIAogICAgbWFzayA9IG1hc2sgJiAweGZmOwogCiAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX0NUWCk7CiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XSAmPSB+TU9ERTRfRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSzsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTRdIHw9IChFTkFCTEVfU1RFTkNJTF9XUklURV9NQVNLIHwKLQkJCQkJU1RFTkNJTF9XUklURV9NQVNLKG1hc2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1dSSVRFX01BU0sobWFzaykpOwogfQogCiBzdGF0aWMgdm9pZAotaTgzMFN0ZW5jaWxPcFNlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwKK2k4MzBTdGVuY2lsT3BTZXBhcmF0ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLAogICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB6cGFzcykKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKICAgIGludCBmb3AsIGRmb3AsIGRwb3A7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmYWlsIDogJXMsIHpmYWlsOiAlcywgenBhc3MgOiAlc1xuIiwgX19GVU5DVElPTl9fLAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGZhaWwpLAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHpmYWlsKSwKLQkgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucih6cGFzcykpOworICAgREJHKCIlczogZmFpbCA6ICVzLCB6ZmFpbDogJXMsIHpwYXNzIDogJXNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihmYWlsKSwKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucih6ZmFpbCksIAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHpwYXNzKSk7CiAKLSAgIGZvcCA9IDA7IGRmb3AgPSAwOyBkcG9wID0gMDsKKyAgIGZvcCA9IDA7CisgICBkZm9wID0gMDsKKyAgIGRwb3AgPSAwOwogCi0gICBzd2l0Y2goZmFpbCkgewotICAgY2FzZSBHTF9LRUVQOiAKLSAgICAgIGZvcCA9IFNURU5DSUxPUF9LRUVQOyAKKyAgIHN3aXRjaCAoZmFpbCkgeworICAgY2FzZSBHTF9LRUVQOgorICAgICAgZm9wID0gU1RFTkNJTE9QX0tFRVA7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfWkVSTzogCi0gICAgICBmb3AgPSBTVEVOQ0lMT1BfWkVSTzsgCisgICBjYXNlIEdMX1pFUk86CisgICAgICBmb3AgPSBTVEVOQ0lMT1BfWkVSTzsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9SRVBMQUNFOiAKLSAgICAgIGZvcCA9IFNURU5DSUxPUF9SRVBMQUNFOyAKKyAgIGNhc2UgR0xfUkVQTEFDRToKKyAgICAgIGZvcCA9IFNURU5DSUxPUF9SRVBMQUNFOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0lOQ1I6IAorICAgY2FzZSBHTF9JTkNSOgogICAgICAgZm9wID0gU1RFTkNJTE9QX0lOQ1JTQVQ7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfREVDUjogCisgICBjYXNlIEdMX0RFQ1I6CiAgICAgICBmb3AgPSBTVEVOQ0lMT1BfREVDUlNBVDsKICAgICAgIGJyZWFrOwogICAgY2FzZSBHTF9JTkNSX1dSQVA6Ci0gICAgICBmb3AgPSBTVEVOQ0lMT1BfSU5DUjsgCisgICAgICBmb3AgPSBTVEVOQ0lMT1BfSU5DUjsKICAgICAgIGJyZWFrOwogICAgY2FzZSBHTF9ERUNSX1dSQVA6Ci0gICAgICBmb3AgPSBTVEVOQ0lMT1BfREVDUjsgCisgICAgICBmb3AgPSBTVEVOQ0lMT1BfREVDUjsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9JTlZFUlQ6IAotICAgICAgZm9wID0gU1RFTkNJTE9QX0lOVkVSVDsgCisgICBjYXNlIEdMX0lOVkVSVDoKKyAgICAgIGZvcCA9IFNURU5DSUxPUF9JTlZFUlQ7CiAgICAgICBicmVhazsKLSAgIGRlZmF1bHQ6IAorICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICAgfQotICAgc3dpdGNoKHpmYWlsKSB7Ci0gICBjYXNlIEdMX0tFRVA6IAotICAgICAgZGZvcCA9IFNURU5DSUxPUF9LRUVQOyAKKyAgIHN3aXRjaCAoemZhaWwpIHsKKyAgIGNhc2UgR0xfS0VFUDoKKyAgICAgIGRmb3AgPSBTVEVOQ0lMT1BfS0VFUDsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9aRVJPOiAKLSAgICAgIGRmb3AgPSBTVEVOQ0lMT1BfWkVSTzsgCisgICBjYXNlIEdMX1pFUk86CisgICAgICBkZm9wID0gU1RFTkNJTE9QX1pFUk87CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfUkVQTEFDRTogCi0gICAgICBkZm9wID0gU1RFTkNJTE9QX1JFUExBQ0U7IAorICAgY2FzZSBHTF9SRVBMQUNFOgorICAgICAgZGZvcCA9IFNURU5DSUxPUF9SRVBMQUNFOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0lOQ1I6IAorICAgY2FzZSBHTF9JTkNSOgogICAgICAgZGZvcCA9IFNURU5DSUxPUF9JTkNSU0FUOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0RFQ1I6IAorICAgY2FzZSBHTF9ERUNSOgogICAgICAgZGZvcCA9IFNURU5DSUxPUF9ERUNSU0FUOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0lOQ1JfV1JBUDoKLSAgICAgIGRmb3AgPSBTVEVOQ0lMT1BfSU5DUjsgCisgICAgICBkZm9wID0gU1RFTkNJTE9QX0lOQ1I7CiAgICAgICBicmVhazsKICAgIGNhc2UgR0xfREVDUl9XUkFQOgotICAgICAgZGZvcCA9IFNURU5DSUxPUF9ERUNSOyAKKyAgICAgIGRmb3AgPSBTVEVOQ0lMT1BfREVDUjsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9JTlZFUlQ6IAotICAgICAgZGZvcCA9IFNURU5DSUxPUF9JTlZFUlQ7IAorICAgY2FzZSBHTF9JTlZFUlQ6CisgICAgICBkZm9wID0gU1RFTkNJTE9QX0lOVkVSVDsKICAgICAgIGJyZWFrOwotICAgZGVmYXVsdDogCisgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgICB9Ci0gICBzd2l0Y2goenBhc3MpIHsKLSAgIGNhc2UgR0xfS0VFUDogCi0gICAgICBkcG9wID0gU1RFTkNJTE9QX0tFRVA7IAorICAgc3dpdGNoICh6cGFzcykgeworICAgY2FzZSBHTF9LRUVQOgorICAgICAgZHBvcCA9IFNURU5DSUxPUF9LRUVQOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX1pFUk86IAotICAgICAgZHBvcCA9IFNURU5DSUxPUF9aRVJPOyAKKyAgIGNhc2UgR0xfWkVSTzoKKyAgICAgIGRwb3AgPSBTVEVOQ0lMT1BfWkVSTzsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9SRVBMQUNFOiAKLSAgICAgIGRwb3AgPSBTVEVOQ0lMT1BfUkVQTEFDRTsgCisgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICBkcG9wID0gU1RFTkNJTE9QX1JFUExBQ0U7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfSU5DUjogCisgICBjYXNlIEdMX0lOQ1I6CiAgICAgICBkcG9wID0gU1RFTkNJTE9QX0lOQ1JTQVQ7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfREVDUjogCisgICBjYXNlIEdMX0RFQ1I6CiAgICAgICBkcG9wID0gU1RFTkNJTE9QX0RFQ1JTQVQ7CiAgICAgICBicmVhazsKICAgIGNhc2UgR0xfSU5DUl9XUkFQOgotICAgICAgZHBvcCA9IFNURU5DSUxPUF9JTkNSOyAKKyAgICAgIGRwb3AgPSBTVEVOQ0lMT1BfSU5DUjsKICAgICAgIGJyZWFrOwogICAgY2FzZSBHTF9ERUNSX1dSQVA6Ci0gICAgICBkcG9wID0gU1RFTkNJTE9QX0RFQ1I7IAorICAgICAgZHBvcCA9IFNURU5DSUxPUF9ERUNSOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0lOVkVSVDogCi0gICAgICBkcG9wID0gU1RFTkNJTE9QX0lOVkVSVDsgCisgICBjYXNlIEdMX0lOVkVSVDoKKyAgICAgIGRwb3AgPSBTVEVOQ0lMT1BfSU5WRVJUOwogICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OiAKKyAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgIH0KIApAQCAtMTg4LDI3ICsxOTAsMzAgQEAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEVOQ0lMVFNUXSAmPSB+KFNURU5DSUxfT1BTX01BU0spOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NURU5DSUxUU1RdIHw9IChFTkFCTEVfU1RFTkNJTF9QQVJNUyB8Ci0JCQkJCSAgICBTVEVOQ0lMX0ZBSUxfT1AoZm9wKSB8Ci0JCQkJCSAgICBTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTF9PUChkZm9wKSB8Ci0JCQkJCSAgICBTVEVOQ0lMX1BBU1NfREVQVEhfUEFTU19PUChkcG9wKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURU5DSUxfRkFJTF9PUChmb3ApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUxfT1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRmb3ApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1NfT1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRwb3ApKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEFscGhhRnVuYyhHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZ1bmMsIEdMZmxvYXQgcmVmKQorc3RhdGljIHZvaWQKK2k4MzBBbHBoYUZ1bmMoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBpbnQgdGVzdCA9IGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoZnVuYyk7CiAgICBHTHVieXRlIHJlZkJ5dGU7CiAgICBHTHVpbnQgcmVmSW50OwogCiAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUocmVmQnl0ZSwgcmVmKTsKLSAgIHJlZkludCA9IChHTHVpbnQpcmVmQnl0ZTsKKyAgIHJlZkludCA9IChHTHVpbnQpIHJlZkJ5dGU7CiAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTJdICY9IH5BTFBIQV9URVNUX1JFRl9NQVNLOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFMl0gfD0gKEVOQUJMRV9BTFBIQV9URVNUX0ZVTkMgfAotCQkJCQlFTkFCTEVfQUxQSEFfUkVGX1ZBTFVFIHwKLQkJCQkJQUxQSEFfVEVTVF9GVU5DKHRlc3QpIHwKLQkJCQkJQUxQSEFfUkVGX1ZBTFVFKHJlZkludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9BTFBIQV9SRUZfVkFMVUUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX1RFU1RfRlVOQyh0ZXN0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfUkVGX1ZBTFVFKHJlZkludCkpOwogfQogCiAvKioKQEAgLTIyMSw0NSArMjI2LDQ5IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBpODMwLXNwZWNpZmljIGRyaXZlci4KICAqIEknbSBub3Qgc3VyZSB3aGljaCBpcyBjb3JyZWN0LgogICovCi1zdGF0aWMgdm9pZCBpODMwRXZhbExvZ2ljT3BCbGVuZFN0YXRlKEdMY29udGV4dCAqY3R4KQorc3RhdGljIHZvaWQKK2k4MzBFdmFsTG9naWNPcEJsZW5kU3RhdGUoR0xjb250ZXh0ICogY3R4KQogewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dChjdHgpOwogCiAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX0NUWCk7CiAKICAgIGlmIChSR0JBX0xPR0lDT1BfRU5BQkxFRChjdHgpKSB7CiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSAmPSB+KEVOQUJMRV9DT0xPUl9CTEVORCB8Ci0JCQkJCSAgICAgICBFTkFCTEVfTE9HSUNfT1BfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9MT0dJQ19PUF9NQVNLKTsKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IChESVNBQkxFX0NPTE9SX0JMRU5EIHwKLQkJCQkJICAgICAgRU5BQkxFX0xPR0lDX09QKTsKLSAgIH0gZWxzZSBpZiAoY3R4LT5Db2xvci5CbGVuZEVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfTE9HSUNfT1ApOworICAgfQorICAgZWxzZSBpZiAoY3R4LT5Db2xvci5CbGVuZEVuYWJsZWQpIHsKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdICY9IH4oRU5BQkxFX0NPTE9SX0JMRU5EIHwKLQkJCQkJICAgICAgIEVOQUJMRV9MT0dJQ19PUF9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0xPR0lDX09QX01BU0spOwogICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gKEVOQUJMRV9DT0xPUl9CTEVORCB8Ci0JCQkJCSAgICAgIERJU0FCTEVfTE9HSUNfT1ApOwotICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX0xPR0lDX09QKTsKKyAgIH0KKyAgIGVsc2UgewogICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gJj0gfihFTkFCTEVfQ09MT1JfQkxFTkQgfAotCQkJCQkgICAgICAgRU5BQkxFX0xPR0lDX09QX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfTE9HSUNfT1BfTUFTSyk7CiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSAoRElTQUJMRV9DT0xPUl9CTEVORCB8Ci0JCQkJCSAgICAgIERJU0FCTEVfTE9HSUNfT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfTE9HSUNfT1ApOwogICAgfQogfQogCi1zdGF0aWMgdm9pZCBpODMwQmxlbmRDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKK3N0YXRpYyB2b2lkCitpODMwQmxlbmRDb2xvcihHTGNvbnRleHQgKiBjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBHTHVieXRlIHIsIGcsIGIsIGE7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgCiAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUociwgY29sb3JbUkNPTVBdKTsKICAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShnLCBjb2xvcltHQ09NUF0pOwogICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGIsIGNvbG9yW0JDT01QXSk7CiAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoYSwgY29sb3JbQUNPTVBdKTsKIAogICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOwotICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0JMRU5EQ09MT1IxXSA9IChhPDwyNCkgfCAocjw8MTYpIHwgKGc8PDgpIHwgYjsKKyAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19CTEVORENPTE9SMV0gPQorICAgICAgKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOwogfQogCiAvKioKQEAgLTI2OCw5ICsyNzcsMTAgQEAKICAqIGZ1bmN0aW9uIGJlY2F1c2Ugc29tZSBibGVuZCBlcXVhdGlvbnMgKGkuZS4sIFxjIEdMX01JTiBhbmQgXGMgR0xfTUFYKQogICogY2hhbmdlIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYmxlbmQgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBfc2V0X2JsZW5kX3N0YXRlKCBHTGNvbnRleHQgKiBjdHggKQorc3RhdGljIHZvaWQKK2k4MzBfc2V0X2JsZW5kX3N0YXRlKEdMY29udGV4dCAqIGN0eCkKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKICAgIGludCBmdW5jQTsKICAgIGludCBmdW5jUkdCOwogICAgaW50IGVxbkE7CkBAIC0yNzksNzEgKzI4OSw3MiBAQAogICAgaW50IHMxOwogCiAKLSAgIGZ1bmNSR0IgPSBTUkNfQkxORF9GQUNUKCBpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKCBjdHgtPkNvbG9yLkJsZW5kU3JjUkdCICkgKQotICAgICAgIHwgRFNUX0JMTkRfRkFDVCggaW50ZWxfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvciggY3R4LT5Db2xvci5CbGVuZERzdFJHQiApICk7CisgICBmdW5jUkdCID0KKyAgICAgIFNSQ19CTE5EX0ZBQ1QoaW50ZWxfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvcihjdHgtPkNvbG9yLkJsZW5kU3JjUkdCKSkKKyAgICAgIHwgRFNUX0JMTkRfRkFDVChpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKGN0eC0+Q29sb3IuQmxlbmREc3RSR0IpKTsKIAotICAgc3dpdGNoKGN0eC0+Q29sb3IuQmxlbmRFcXVhdGlvblJHQikgeworICAgc3dpdGNoIChjdHgtPkNvbG9yLkJsZW5kRXF1YXRpb25SR0IpIHsKICAgIGNhc2UgR0xfRlVOQ19BREQ6Ci0gICAgICBlcW5SR0IgPSBCTEVOREZVTkNfQUREOyAKKyAgICAgIGVxblJHQiA9IEJMRU5ERlVOQ19BREQ7CiAgICAgICBicmVhazsKICAgIGNhc2UgR0xfTUlOOgogICAgICAgZXFuUkdCID0gQkxFTkRGVU5DX01JTjsKICAgICAgIGZ1bmNSR0IgPSBTUkNfQkxORF9GQUNUKEJMRU5ERkFDVF9PTkUpIHwgRFNUX0JMTkRfRkFDVChCTEVOREZBQ1RfT05FKTsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NQVg6IAorICAgY2FzZSBHTF9NQVg6CiAgICAgICBlcW5SR0IgPSBCTEVOREZVTkNfTUFYOwogICAgICAgZnVuY1JHQiA9IFNSQ19CTE5EX0ZBQ1QoQkxFTkRGQUNUX09ORSkgfCBEU1RfQkxORF9GQUNUKEJMRU5ERkFDVF9PTkUpOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0ZVTkNfU1VCVFJBQ1Q6IAotICAgICAgZXFuUkdCID0gQkxFTkRGVU5DX1NVQjsgCisgICBjYXNlIEdMX0ZVTkNfU1VCVFJBQ1Q6CisgICAgICBlcW5SR0IgPSBCTEVOREZVTkNfU1VCOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVDoKLSAgICAgIGVxblJHQiA9IEJMRU5ERlVOQ19SVlJTRV9TVUI7IAorICAgICAgZXFuUkdCID0gQkxFTkRGVU5DX1JWUlNFX1NVQjsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoIHN0ZGVyciwgIlslczoldV0gSW52YWxpZCBSR0IgYmxlbmQgZXF1YXRpb24gKDB4JTA0eCkuXG4iLAotCSAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBjdHgtPkNvbG9yLkJsZW5kRXF1YXRpb25SR0IgKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzOiV1XSBJbnZhbGlkIFJHQiBibGVuZCBlcXVhdGlvbiAoMHglMDR4KS5cbiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGN0eC0+Q29sb3IuQmxlbmRFcXVhdGlvblJHQik7CiAgICAgICByZXR1cm47CiAgICB9CiAKIAotICAgZnVuY0EgPSBTUkNfQUJMRU5EX0ZBQ1QoIGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoIGN0eC0+Q29sb3IuQmxlbmRTcmNBICkgKQotICAgICAgIHwgRFNUX0FCTEVORF9GQUNUKCBpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKCBjdHgtPkNvbG9yLkJsZW5kRHN0QSApICk7CisgICBmdW5jQSA9IFNSQ19BQkxFTkRfRkFDVChpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKGN0eC0+Q29sb3IuQmxlbmRTcmNBKSkKKyAgICAgIHwgRFNUX0FCTEVORF9GQUNUKGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoY3R4LT5Db2xvci5CbGVuZERzdEEpKTsKIAotICAgc3dpdGNoKGN0eC0+Q29sb3IuQmxlbmRFcXVhdGlvbkEpIHsKKyAgIHN3aXRjaCAoY3R4LT5Db2xvci5CbGVuZEVxdWF0aW9uQSkgewogICAgY2FzZSBHTF9GVU5DX0FERDoKLSAgICAgIGVxbkEgPSBCTEVOREZVTkNfQUREOyAKKyAgICAgIGVxbkEgPSBCTEVOREZVTkNfQUREOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX01JTjogCisgICBjYXNlIEdMX01JTjoKICAgICAgIGVxbkEgPSBCTEVOREZVTkNfTUlOOwogICAgICAgZnVuY0EgPSBTUkNfQkxORF9GQUNUKEJMRU5ERkFDVF9PTkUpIHwgRFNUX0JMTkRfRkFDVChCTEVOREZBQ1RfT05FKTsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NQVg6IAorICAgY2FzZSBHTF9NQVg6CiAgICAgICBlcW5BID0gQkxFTkRGVU5DX01BWDsKICAgICAgIGZ1bmNBID0gU1JDX0JMTkRfRkFDVChCTEVOREZBQ1RfT05FKSB8IERTVF9CTE5EX0ZBQ1QoQkxFTkRGQUNUX09ORSk7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfRlVOQ19TVUJUUkFDVDogCi0gICAgICBlcW5BID0gQkxFTkRGVU5DX1NVQjsgCisgICBjYXNlIEdMX0ZVTkNfU1VCVFJBQ1Q6CisgICAgICBlcW5BID0gQkxFTkRGVU5DX1NVQjsKICAgICAgIGJyZWFrOwogICAgY2FzZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6Ci0gICAgICBlcW5BID0gQkxFTkRGVU5DX1JWUlNFX1NVQjsgCisgICAgICBlcW5BID0gQkxFTkRGVU5DX1JWUlNFX1NVQjsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoIHN0ZGVyciwgIlslczoldV0gSW52YWxpZCBhbHBoYSBibGVuZCBlcXVhdGlvbiAoMHglMDR4KS5cbiIsCi0JICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGN0eC0+Q29sb3IuQmxlbmRFcXVhdGlvbkEgKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzOiV1XSBJbnZhbGlkIGFscGhhIGJsZW5kIGVxdWF0aW9uICgweCUwNHgpLlxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY3R4LT5Db2xvci5CbGVuZEVxdWF0aW9uQSk7CiAgICAgICByZXR1cm47CiAgICB9CiAKICAgIGlhYiA9IGVxbkEgfCBmdW5jQQotICAgICAgIHwgXzNEU1RBVEVfSU5EUFRfQUxQSEFfQkxFTkRfQ01ECi0gICAgICAgfCBFTkFCTEVfU1JDX0FCTEVORF9GQUNUT1IgfCBFTkFCTEVfRFNUX0FCTEVORF9GQUNUT1IKLSAgICAgICB8IEVOQUJMRV9BTFBIQV9CTEVOREZVTkM7CisgICAgICB8IF8zRFNUQVRFX0lORFBUX0FMUEhBX0JMRU5EX0NNRAorICAgICAgfCBFTkFCTEVfU1JDX0FCTEVORF9GQUNUT1IgfCBFTkFCTEVfRFNUX0FCTEVORF9GQUNUT1IKKyAgICAgIHwgRU5BQkxFX0FMUEhBX0JMRU5ERlVOQzsKICAgIHMxID0gZXFuUkdCIHwgZnVuY1JHQgotICAgICAgIHwgXzNEU1RBVEVfTU9ERVNfMV9DTUQKLSAgICAgICB8IEVOQUJMRV9TUkNfQkxORF9GQUNUT1IgfCBFTkFCTEVfRFNUX0JMTkRfRkFDVE9SCi0gICAgICAgfCBFTkFCTEVfQ09MUl9CTE5EX0ZVTkM7CisgICAgICB8IF8zRFNUQVRFX01PREVTXzFfQ01ECisgICAgICB8IEVOQUJMRV9TUkNfQkxORF9GQUNUT1IgfCBFTkFCTEVfRFNUX0JMTkRfRkFDVE9SCisgICAgICB8IEVOQUJMRV9DT0xSX0JMTkRfRlVOQzsKIAotICAgaWYgKCAoZXFuQSB8IGZ1bmNBKSAhPSAoZXFuUkdCIHwgZnVuY1JHQikgKQorICAgaWYgKChlcW5BIHwgZnVuY0EpICE9IChlcW5SR0IgfCBmdW5jUkdCKSkKICAgICAgIGlhYiB8PSBFTkFCTEVfSU5EUFRfQUxQSEFfQkxFTkQ7CiAgICBlbHNlCiAgICAgICBpYWIgfD0gRElTQUJMRV9JTkRQVF9BTFBIQV9CTEVORDsKQEAgLTM2Myw3MCArMzc0LDY4IEBACiAgICBpODMwRXZhbExvZ2ljT3BCbGVuZFN0YXRlKGN0eCk7CiAKICAgIGlmICgwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlslczoldV0gU1RBVEUxOiAweCUwOHggSUFMUEhBQjogMHglMDh4IGJsZW5kIGlzICVzYWJsZWRcbiIsCi0JICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKLQkgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUxXSwKLQkgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfSUFMUEhBQl0sCi0JICAgICAgKGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkKSA/ICJlbiIgOiAiZGlzIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgIlslczoldV0gU1RBVEUxOiAweCUwOHggSUFMUEhBQjogMHglMDh4IGJsZW5kIGlzICVzYWJsZWRcbiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTFdLAorICAgICAgICAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfSUFMUEhBQl0sCisgICAgICAgICAgICAgIChjdHgtPkNvbG9yLkJsZW5kRW5hYmxlZCkgPyAiZW4iIDogImRpcyIpOwogICAgfQogfQogCiAKLXN0YXRpYyB2b2lkIGk4MzBCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlUkdCLAotCQkJCSAgICAgIEdMZW51bSBtb2RlQSkgCitzdGF0aWMgdm9pZAoraTgzMEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEpCiB7Ci0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIC0+ICVzLCAlc1xuIiwgX19GVU5DVElPTl9fLAotCSAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIobW9kZVJHQiksCi0JICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihtb2RlQSkpOworICAgREJHKCIlcyAtPiAlcywgJXNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihtb2RlUkdCKSwKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihtb2RlQSkpOwogCiAgICAodm9pZCkgbW9kZVJHQjsKICAgICh2b2lkKSBtb2RlQTsKLSAgIGk4MzBfc2V0X2JsZW5kX3N0YXRlKCBjdHggKTsKKyAgIGk4MzBfc2V0X2JsZW5kX3N0YXRlKGN0eCk7CiB9CiAKIAotc3RhdGljIHZvaWQgaTgzMEJsZW5kRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gc2ZhY3RvclJHQiwgCi0JCQkJICBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBLAotCQkJCSAgR0xlbnVtIGRmYWN0b3JBICkKK3N0YXRpYyB2b2lkCitpODMwQmxlbmRGdW5jU2VwYXJhdGUoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gc2ZhY3RvclJHQiwKKyAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBLCBHTGVudW0gZGZhY3RvckEpCiB7Ci0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIC0+IFJHQiglcywgJXMpIEEoJXMsICVzKVxuIiwgX19GVU5DVElPTl9fLAotCSAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoc2ZhY3RvclJHQiksCi0JICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihkZmFjdG9yUkdCKSwKLQkgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHNmYWN0b3JBKSwKLQkgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGRmYWN0b3JBKSk7CisgICBEQkcoIiVzIC0+IFJHQiglcywgJXMpIEEoJXMsICVzKVxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHNmYWN0b3JSR0IpLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGRmYWN0b3JSR0IpLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHNmYWN0b3JBKSwKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihkZmFjdG9yQSkpOwogCiAgICAodm9pZCkgc2ZhY3RvclJHQjsKICAgICh2b2lkKSBkZmFjdG9yUkdCOwogICAgKHZvaWQpIHNmYWN0b3JBOwogICAgKHZvaWQpIGRmYWN0b3JBOwotICAgaTgzMF9zZXRfYmxlbmRfc3RhdGUoIGN0eCApOworICAgaTgzMF9zZXRfYmxlbmRfc3RhdGUoY3R4KTsKIH0KIAogCiAKLXN0YXRpYyB2b2lkIGk4MzBEZXB0aEZ1bmMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKQorc3RhdGljIHZvaWQKK2k4MzBEZXB0aEZ1bmMoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gZnVuYykKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKICAgIGludCB0ZXN0ID0gaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhmdW5jKTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTNdICY9IH5ERVBUSF9URVNUX0ZVTkNfTUFTSzsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTNdIHw9IChFTkFCTEVfREVQVEhfVEVTVF9GVU5DIHwKLQkJCQkgICAgICAgREVQVEhfVEVTVF9GVU5DKHRlc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVBUSF9URVNUX0ZVTkModGVzdCkpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRGVwdGhNYXNrKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gZmxhZykKK3N0YXRpYyB2b2lkCitpODMwRGVwdGhNYXNrKEdMY29udGV4dCAqIGN0eCwgR0xib29sZWFuIGZsYWcpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGZsYWcgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBmbGFnKTsKLQorICAgREJHKCIlcyBmbGFnICglZClcbiIsIF9fRlVOQ1RJT05fXywgZmxhZyk7CisgICAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKIAogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gJj0gfkVOQUJMRV9ESVNfREVQVEhfV1JJVEVfTUFTSzsKQEAgLTQ0MywxNCArNDUyLDE1IEBACiAgKiBUaGUgaTgzMCBzdXBwb3J0cyBhIDR4NCBzdGlwcGxlIG5hdGl2ZWx5LCBHTCB3YW50cyAzMngzMi4KICAqIEZvcnR1bmF0ZWx5IHN0aXBwbGUgaXMgdXN1YWxseSBhIHJlcGVhdGluZyBwYXR0ZXJuLgogICovCi1zdGF0aWMgdm9pZCBpODMwUG9seWdvblN0aXBwbGUoIEdMY29udGV4dCAqY3R4LCBjb25zdCBHTHVieXRlICptYXNrICkKK3N0YXRpYyB2b2lkCitpODMwUG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICogY3R4LCBjb25zdCBHTHVieXRlICogbWFzaykKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKICAgIGNvbnN0IEdMdWJ5dGUgKm0gPSBtYXNrOwogICAgR0x1Ynl0ZSBwWzRdOwotICAgaW50IGksaixrOworICAgaW50IGksIGosIGs7CiAgICBpbnQgYWN0aXZlID0gKGN0eC0+UG9seWdvbi5TdGlwcGxlRmxhZyAmJgotCQkgaTgzMC0+aW50ZWwucmVkdWNlZF9wcmltaXRpdmUgPT0gR0xfVFJJQU5HTEVTKTsKKyAgICAgICAgICAgICAgICAgaTgzMC0+aW50ZWwucmVkdWNlZF9wcmltaXRpdmUgPT0gR0xfVFJJQU5HTEVTKTsKICAgIEdMdWludCBuZXdNYXNrOwogCiAgICBpZiAoYWN0aXZlKSB7CkBAIC00NTgsMjMgKzQ2OCwyNiBAQAogICAgICAgaTgzMC0+c3RhdGUuU3RpcHBsZVtJODMwX1NUUFJFR19TVDFdICY9IH5TVDFfRU5BQkxFOwogICAgfQogCi0gICBwWzBdID0gbWFza1sxMl0gJiAweGY7IHBbMF0gfD0gcFswXSA8PCA0OwotICAgcFsxXSA9IG1hc2tbOF0gJiAweGY7IHBbMV0gfD0gcFsxXSA8PCA0OwotICAgcFsyXSA9IG1hc2tbNF0gJiAweGY7IHBbMl0gfD0gcFsyXSA8PCA0OwotICAgcFszXSA9IG1hc2tbMF0gJiAweGY7IHBbM10gfD0gcFszXSA8PCA0OworICAgcFswXSA9IG1hc2tbMTJdICYgMHhmOworICAgcFswXSB8PSBwWzBdIDw8IDQ7CisgICBwWzFdID0gbWFza1s4XSAmIDB4ZjsKKyAgIHBbMV0gfD0gcFsxXSA8PCA0OworICAgcFsyXSA9IG1hc2tbNF0gJiAweGY7CisgICBwWzJdIHw9IHBbMl0gPDwgNDsKKyAgIHBbM10gPSBtYXNrWzBdICYgMHhmOworICAgcFszXSB8PSBwWzNdIDw8IDQ7CiAKLSAgIGZvciAoayA9IDAgOyBrIDwgOCA7IGsrKykKLSAgICAgIGZvciAoaiA9IDMgOyBqID49IDA7IGotLSkKLQkgZm9yIChpID0gMCA7IGkgPCA0IDsgaSsrLCBtKyspCi0JICAgIGlmICgqbSAhPSBwW2pdKSB7Ci0JICAgICAgIGk4MzAtPmludGVsLmh3X3N0aXBwbGUgPSAwOwotCSAgICAgICByZXR1cm47Ci0JICAgIH0KKyAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICBmb3IgKGogPSAzOyBqID49IDA7IGotLSkKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIG0rKykKKyAgICAgICAgICAgIGlmICgqbSAhPSBwW2pdKSB7CisgICAgICAgICAgICAgICBpODMwLT5pbnRlbC5od19zdGlwcGxlID0gMDsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgbmV3TWFzayA9ICgoKHBbMF0gJiAweGYpIDw8IDApIHwKLQkgICAgICAoKHBbMV0gJiAweGYpIDw8IDQpIHwKLQkgICAgICAoKHBbMl0gJiAweGYpIDw8IDgpIHwKLQkgICAgICAoKHBbM10gJiAweGYpIDw8IDEyKSk7CisgICAgICAgICAgICAgICgocFsxXSAmIDB4ZikgPDwgNCkgfAorICAgICAgICAgICAgICAoKHBbMl0gJiAweGYpIDw8IDgpIHwgKChwWzNdICYgMHhmKSA8PCAxMikpOwogCiAKICAgIGlmIChuZXdNYXNrID09IDB4ZmZmZiB8fCBuZXdNYXNrID09IDB4MCkgewpAQCAtNDk1LDQ5ICs1MDgsNTQgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEhhcmR3YXJlIGNsaXBwaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBTY2lzc29yKEdMY29udGV4dCAqY3R4LCBHTGludCB4LCBHTGludCB5LCAKLQkJCUdMc2l6ZWkgdywgR0xzaXplaSBoKQorc3RhdGljIHZvaWQKK2k4MzBTY2lzc29yKEdMY29udGV4dCAqIGN0eCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGk4MzAtPmludGVsLmludGVsU2NyZWVuOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dChjdHgpOwogICAgaW50IHgxLCB5MSwgeDIsIHkyOwogCi0gICBpZiAoIWk4MzAtPmludGVsLmRyaURyYXdhYmxlKQorICAgaWYgKCFjdHgtPkRyYXdCdWZmZXIpCiAgICAgICByZXR1cm47CiAKLSAgIHgxID0geDsKLSAgIHkxID0gaTgzMC0+aW50ZWwuZHJpRHJhd2FibGUtPmggLSAoeSArIGgpOwotICAgeDIgPSB4ICsgdyAtIDE7Ci0gICB5MiA9IHkxICsgaCAtIDE7CisgICBEQkcoIiVzICVkLCVkICVkeCVkXG4iLCBfX0ZVTkNUSU9OX18sIHgsIHksIHcsIGgpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdIHgoJWQpIHkoJWQpIHcoJWQpIGgoJWQpXG4iLCBfX0ZVTkNUSU9OX18sCi0JICAgICAgeCwgeSwgdywgaCk7CisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5OYW1lID09IDApIHsKKyAgICAgIHgxID0geDsKKyAgICAgIHkxID0gY3R4LT5EcmF3QnVmZmVyLT5IZWlnaHQgLSAoeSArIGgpOworICAgICAgeDIgPSB4ICsgdyAtIDE7CisgICAgICB5MiA9IHkxICsgaCAtIDE7CisgICAgICBEQkcoIiVzICVkLi4lZCwlZC4uJWQgKGludmVydGVkKVxuIiwgX19GVU5DVElPTl9fLCB4MSwgeDIsIHkxLCB5Mik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIEZCTyAtIG5vdCBpbnZlcnRlZAorICAgICAgICovCisgICAgICB4MSA9IHg7CisgICAgICB5MSA9IHk7CisgICAgICB4MiA9IHggKyB3IC0gMTsKKyAgICAgIHkyID0geSArIGggLSAxOworICAgICAgREJHKCIlcyAlZC4uJWQsJWQuLiVkIChub3QgaW52ZXJ0ZWQpXG4iLCBfX0ZVTkNUSU9OX18sIHgxLCB4MiwgeTEsIHkyKTsKKyAgIH0KIAotICAgaWYgKHgxIDwgMCkgeDEgPSAwOwotICAgaWYgKHkxIDwgMCkgeTEgPSAwOwotICAgaWYgKHgyIDwgMCkgeDIgPSAwOwotICAgaWYgKHkyIDwgMCkgeTIgPSAwOwotCi0gICBpZiAoeDIgPj0gc2NyZWVuLT53aWR0aCkgeDIgPSBzY3JlZW4tPndpZHRoLTE7Ci0gICBpZiAoeTIgPj0gc2NyZWVuLT5oZWlnaHQpIHkyID0gc2NyZWVuLT5oZWlnaHQtMTsKLSAgIGlmICh4MSA+PSBzY3JlZW4tPndpZHRoKSB4MSA9IHNjcmVlbi0+d2lkdGgtMTsKLSAgIGlmICh5MSA+PSBzY3JlZW4tPmhlaWdodCkgeTEgPSBzY3JlZW4tPmhlaWdodC0xOwotCisgICB4MSA9IENMQU1QKHgxLCAwLCBjdHgtPkRyYXdCdWZmZXItPldpZHRoIC0gMSk7CisgICB5MSA9IENMQU1QKHkxLCAwLCBjdHgtPkRyYXdCdWZmZXItPkhlaWdodCAtIDEpOworICAgeDIgPSBDTEFNUCh4MiwgMCwgY3R4LT5EcmF3QnVmZmVyLT5XaWR0aCAtIDEpOworICAgeTIgPSBDTEFNUCh5MiwgMCwgY3R4LT5EcmF3QnVmZmVyLT5IZWlnaHQgLSAxKTsKKyAgIAorICAgREJHKCIlcyAlZC4uJWQsJWQuLiVkIChjbGFtcGVkKVxuIiwgX19GVU5DVElPTl9fLCB4MSwgeDIsIHkxLCB5Mik7CiAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQlVGRkVSUyk7CiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX1NSMV0gPSAoeTEgPDwgMTYpIHwgKHgxICYgMHhmZmZmKTsKICAgIGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfU1IyXSA9ICh5MiA8PCAxNikgfCAoeDIgJiAweGZmZmYpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwTG9naWNPcChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG9wY29kZSkKK3N0YXRpYyB2b2lkCitpODMwTG9naWNPcChHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBvcGNvZGUpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7Ci0gICBpbnQgdG1wID0gaW50ZWxfdHJhbnNsYXRlX2xvZ2ljX29wKCBvcGNvZGUgKTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKKyAgIGludCB0bXAgPSBpbnRlbF90cmFuc2xhdGVfbG9naWNfb3Aob3Bjb2RlKTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTRdICY9IH5MT0dJQ09QX01BU0s7CiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XSB8PSBMT0dJQ19PUF9GVU5DKHRtcCk7CkBAIC01NDUsMTQgKzU2MywxNCBAQAogCiAKIAotc3RhdGljIHZvaWQgaTgzMEN1bGxGYWNlRnJvbnRGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdW51c2VkKQorc3RhdGljIHZvaWQKK2k4MzBDdWxsRmFjZUZyb250RmFjZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB1bnVzZWQpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBHTHVpbnQgbW9kZTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIGlmICghY3R4LT5Qb2x5Z29uLkN1bGxGbGFnKSB7CiAgICAgICBtb2RlID0gQ1VMTE1PREVfTk9ORTsKICAgIH0KQEAgLTU2MCw5ICs1NzgsOSBAQAogICAgICAgbW9kZSA9IENVTExNT0RFX0NXOwogCiAgICAgICBpZiAoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZSA9PSBHTF9GUk9OVCkKLQkgbW9kZSBePSAoQ1VMTE1PREVfQ1cgXiBDVUxMTU9ERV9DQ1cpOworICAgICAgICAgbW9kZSBePSAoQ1VMTE1PREVfQ1cgXiBDVUxMTU9ERV9DQ1cpOwogICAgICAgaWYgKGN0eC0+UG9seWdvbi5Gcm9udEZhY2UgIT0gR0xfQ0NXKQotCSBtb2RlIF49IChDVUxMTU9ERV9DVyBeIENVTExNT0RFX0NDVyk7CisgICAgICAgICBtb2RlIF49IChDVUxMTU9ERV9DVyBeIENVTExNT0RFX0NDVyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgIG1vZGUgPSBDVUxMTU9ERV9CT1RIOwpAQCAtNTczLDE4ICs1OTEsMTggQEAKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTNdIHw9IEVOQUJMRV9DVUxMX01PREUgfCBtb2RlOwogfQogCi1zdGF0aWMgdm9pZCBpODMwTGluZVdpZHRoKCBHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCB3aWR0aGYgKQorc3RhdGljIHZvaWQKK2k4MzBMaW5lV2lkdGgoR0xjb250ZXh0ICogY3R4LCBHTGZsb2F0IHdpZHRoZikKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoIGN0eCApOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dChjdHgpOwogICAgaW50IHdpZHRoOwogICAgaW50IHN0YXRlNTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIHdpZHRoID0gKGludCkod2lkdGhmICogMik7Ci0gICBDTEFNUF9TRUxGKHdpZHRoLCAxLCAxNSk7CisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogICAgCisgICB3aWR0aCA9IChpbnQpICh3aWR0aGYgKiAyKTsKKyAgIENMQU1QX1NFTEYod2lkdGgsIDEsIDE1KTsKKwogICAgc3RhdGU1ID0gaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNV0gJiB+RklYRURfTElORV9XSURUSF9NQVNLOwogICAgc3RhdGU1IHw9IChFTkFCTEVfRklYRURfTElORV9XSURUSCB8IEZJWEVEX0xJTkVfV0lEVEgod2lkdGgpKTsKIApAQCAtNTk0LDE5ICs2MTIsMTkgQEAKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaTgzMFBvaW50U2l6ZShHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBzaXplKQorc3RhdGljIHZvaWQKK2k4MzBQb2ludFNpemUoR0xjb250ZXh0ICogY3R4LCBHTGZsb2F0IHNpemUpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7Ci0gICBHTGludCBwb2ludF9zaXplID0gKGludClzaXplOworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dChjdHgpOworICAgR0xpbnQgcG9pbnRfc2l6ZSA9IChpbnQpIHNpemU7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIENMQU1QX1NFTEYocG9pbnRfc2l6ZSwgMSwgMjU2KTsKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTVdICY9IH5GSVhFRF9QT0lOVF9XSURUSF9NQVNLOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNV0gfD0gKEVOQUJMRV9GSVhFRF9QT0lOVF9XSURUSCB8Ci0JCQkJICAgICAgIEZJWEVEX1BPSU5UX1dJRFRIKHBvaW50X3NpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhFRF9QT0lOVF9XSURUSChwb2ludF9zaXplKSk7CiB9CiAKIApAQCAtNjE0LDIzICs2MzIsMjEgQEAKICAqIENvbG9yIG1hc2tzCiAgKi8KIAotc3RhdGljIHZvaWQgaTgzMENvbG9yTWFzayhHTGNvbnRleHQgKmN0eCwKLQkJCSAgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLAotCQkJICBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpCitzdGF0aWMgdm9pZAoraTgzMENvbG9yTWFzayhHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKQogewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVCggY3R4ICk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBHTHVpbnQgdG1wID0gMDsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgciglZCkgZyglZCkgYiglZCkgYSglZClcbiIsIF9fRlVOQ1RJT05fXywgciwgZywgYiwgYSk7CisgICBEQkcoIiVzIHIoJWQpIGcoJWQpIGIoJWQpIGEoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHIsIGcsIGIsIGEpOwogCiAgICB0bXAgPSAoKGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdICYgfldSSVRFTUFTS19NQVNLKSB8Ci0JICBFTkFCTEVfQ09MT1JfTUFTSyB8Ci0JICBFTkFCTEVfQ09MT1JfV1JJVEUgfAotCSAgKCghcikgPDwgV1JJVEVNQVNLX1JFRF9TSElGVCkgfAotCSAgKCghZykgPDwgV1JJVEVNQVNLX0dSRUVOX1NISUZUKSB8Ci0JICAoKCFiKSA8PCBXUklURU1BU0tfQkxVRV9TSElGVCkgfAotCSAgKCghYSkgPDwgV1JJVEVNQVNLX0FMUEhBX1NISUZUKSk7CisgICAgICAgICAgRU5BQkxFX0NPTE9SX01BU0sgfAorICAgICAgICAgIEVOQUJMRV9DT0xPUl9XUklURSB8CisgICAgICAgICAgKCghcikgPDwgV1JJVEVNQVNLX1JFRF9TSElGVCkgfAorICAgICAgICAgICgoIWcpIDw8IFdSSVRFTUFTS19HUkVFTl9TSElGVCkgfAorICAgICAgICAgICgoIWIpIDw8IFdSSVRFTUFTS19CTFVFX1NISUZUKSB8ICgoIWEpIDw8IFdSSVRFTUFTS19BTFBIQV9TSElGVCkpOwogCiAgICBpZiAodG1wICE9IGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdKSB7CiAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX0NUWCk7CkBAIC02MzgsOSArNjU0LDEwIEBACiAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zcGVjdWxhciggR0xjb250ZXh0ICpjdHggKQorc3RhdGljIHZvaWQKK3VwZGF0ZV9zcGVjdWxhcihHTGNvbnRleHQgKiBjdHgpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKCBjdHggKTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKIAogICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gJj0gfkVOQUJMRV9TUEVDX0FERF9NQVNLOwpAQCAtNjUxLDIyICs2NjgsMjIgQEAKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfU1BFQ19BREQ7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBMaWdodE1vZGVsZnYoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgCi0JCQkgICAgIGNvbnN0IEdMZmxvYXQgKnBhcmFtKQorc3RhdGljIHZvaWQKK2k4MzBMaWdodE1vZGVsZnYoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbSkKIHsKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgCiAgICBpZiAocG5hbWUgPT0gR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCkgewotICAgICAgdXBkYXRlX3NwZWN1bGFyKCBjdHggKTsKKyAgICAgIHVwZGF0ZV9zcGVjdWxhcihjdHgpOwogICAgfQogfQogCiAvKiBJbiBNZXNhIDMuNSB3ZSBjYW4gcmVsaWFibHkgZG8gbmF0aXZlIGZsYXRzaGFkaW5nLgogICovCi1zdGF0aWMgdm9pZCBpODMwU2hhZGVNb2RlbChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUpCitzdGF0aWMgdm9pZAoraTgzMFNoYWRlTW9kZWwoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gbW9kZSkKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKIAogCkBAIC02NzUsNTggKzY5Miw2MiBAQAogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFM10gJj0gflNIQURFX01PREVfTUFTSzsKIAogICAgaWYgKG1vZGUgPT0gR0xfRkxBVCkgewotICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSB8PSAoQUxQSEFfU0hBREVfTU9ERShTSEFERV9NT0RFX0ZMQVQpIHwKLQkJCQkJICBGT0dfU0hBREVfTU9ERShTSEFERV9NT0RFX0ZMQVQpIHwKLQkJCQkJICBTUEVDX1NIQURFX01PREUoU0hBREVfTU9ERV9GTEFUKSB8Ci0JCQkJCSAgQ09MT1JfU0hBREVfTU9ERShTSEFERV9NT0RFX0ZMQVQpKTsKLSAgIH0gZWxzZSB7Ci0gICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTNdIHw9IChBTFBIQV9TSEFERV9NT0RFKFNIQURFX01PREVfTElORUFSKSB8Ci0JCQkJCSAgRk9HX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpIHwKLQkJCQkJICBTUEVDX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpIHwKLQkJCQkJICBDT0xPUl9TSEFERV9NT0RFKFNIQURFX01PREVfTElORUFSKSk7CisgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSB8PQorICAgICAgICAgKEFMUEhBX1NIQURFX01PREUoU0hBREVfTU9ERV9GTEFUKSB8IEZPR19TSEFERV9NT0RFKFNIQURFX01PREVfRkxBVCkKKyAgICAgICAgICB8IFNQRUNfU0hBREVfTU9ERShTSEFERV9NT0RFX0ZMQVQpIHwKKyAgICAgICAgICBDT0xPUl9TSEFERV9NT0RFKFNIQURFX01PREVfRkxBVCkpOworICAgfQorICAgZWxzZSB7CisgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSB8PQorICAgICAgICAgKEFMUEhBX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpIHwKKyAgICAgICAgICBGT0dfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikgfAorICAgICAgICAgIFNQRUNfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikgfAorICAgICAgICAgIENPTE9SX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpKTsKICAgIH0KIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRm9nCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBGb2dmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSkKK3N0YXRpYyB2b2lkCitpODMwRm9nZnYoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbSkKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGlmIChwbmFtZSA9PSBHTF9GT0dfQ09MT1IpIHsgICAgICAKLSAgICAgIEdMdWludCBjb2xvciA9ICgoKEdMdWJ5dGUpKGN0eC0+Rm9nLkNvbG9yWzBdKjI1NS4wRikgPDwgMTYpIHwKLQkJICAgICAgKChHTHVieXRlKShjdHgtPkZvZy5Db2xvclsxXSoyNTUuMEYpIDw8IDgpIHwKLQkJICAgICAgKChHTHVieXRlKShjdHgtPkZvZy5Db2xvclsyXSoyNTUuMEYpIDw8IDApKTsKKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKKyAgIGlmIChwbmFtZSA9PSBHTF9GT0dfQ09MT1IpIHsKKyAgICAgIEdMdWludCBjb2xvciA9ICgoKEdMdWJ5dGUpIChjdHgtPkZvZy5Db2xvclswXSAqIDI1NS4wRikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKEdMdWJ5dGUpIChjdHgtPkZvZy5Db2xvclsxXSAqIDI1NS4wRikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICgoR0x1Ynl0ZSkgKGN0eC0+Rm9nLkNvbG9yWzJdICogMjU1LjBGKSA8PCAwKSk7CiAKICAgICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKLSAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19GT0dDT0xPUl0gPSAoXzNEU1RBVEVfRk9HX0NPTE9SX0NNRCB8IGNvbG9yKTsKKyAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19GT0dDT0xPUl0gPQorICAgICAgICAgKF8zRFNUQVRFX0ZPR19DT0xPUl9DTUQgfCBjb2xvcik7CiAgICB9CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi1zdGF0aWMgdm9pZCBpODMwRW5hYmxlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gY2FwLCBHTGJvb2xlYW4gc3RhdGUpCitzdGF0aWMgdm9pZAoraTgzMEVuYWJsZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBjYXAsIEdMYm9vbGVhbiBzdGF0ZSkKIHsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKIAotICAgc3dpdGNoKGNhcCkgeworICAgc3dpdGNoIChjYXApIHsKICAgIGNhc2UgR0xfTElHSFRJTkc6CiAgICBjYXNlIEdMX0NPTE9SX1NVTToKLSAgICAgIHVwZGF0ZV9zcGVjdWxhciggY3R4ICk7CisgICAgICB1cGRhdGVfc3BlY3VsYXIoY3R4KTsKICAgICAgIGJyZWFrOwogCiAgICBjYXNlIEdMX0FMUEhBX1RFU1Q6CiAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX0NUWCk7CiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSAmPSB+RU5BQkxFX0RJU19BTFBIQV9URVNUX01BU0s7CiAgICAgICBpZiAoc3RhdGUpCi0JIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IEVOQUJMRV9BTFBIQV9URVNUOworICAgICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gRU5BQkxFX0FMUEhBX1RFU1Q7CiAgICAgICBlbHNlCi0JIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfQUxQSEFfVEVTVDsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfQUxQSEFfVEVTVDsKIAogICAgICAgYnJlYWs7CiAKQEAgLTczOSwxOCArNzYwLDE4IEBACiAKICAgICAgIC8qIExvZ2ljb3AgZG9lc24ndCBzZWVtIHRvIHdvcmsgYXQgMTZicHA6CiAgICAgICAgKi8KLSAgICAgIGlmIChpODMwLT5pbnRlbC5pbnRlbFNjcmVlbi0+Y3BwID09IDIpCi0JIEZBTExCQUNLKCAmaTgzMC0+aW50ZWwsIEk4MzBfRkFMTEJBQ0tfTE9HSUNPUCwgc3RhdGUgKTsKKyAgICAgIGlmIChpODMwLT5pbnRlbC5jdHguVmlzdWFsLnJnYkJpdHMgPT0gMTYpCisgICAgICAgICBGQUxMQkFDSygmaTgzMC0+aW50ZWwsIEk4MzBfRkFMTEJBQ0tfTE9HSUNPUCwgc3RhdGUpOwogICAgICAgYnJlYWs7Ci0gCisKICAgIGNhc2UgR0xfRElUSEVSOgogICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOwogICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gJj0gfkVOQUJMRV9ESVRIRVI7CiAKICAgICAgIGlmIChzdGF0ZSkKLQkgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gfD0gRU5BQkxFX0RJVEhFUjsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IEVOQUJMRV9ESVRIRVI7CiAgICAgICBlbHNlCi0JIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IERJU0FCTEVfRElUSEVSOworICAgICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gfD0gRElTQUJMRV9ESVRIRVI7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9ERVBUSF9URVNUOgpAQCAtNzU4LDQ2ICs3NzksNDQgQEAKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdICY9IH5FTkFCTEVfRElTX0RFUFRIX1RFU1RfTUFTSzsKIAogICAgICAgaWYgKHN0YXRlKQotCSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBFTkFCTEVfREVQVEhfVEVTVDsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IEVOQUJMRV9ERVBUSF9URVNUOwogICAgICAgZWxzZQotCSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBESVNBQkxFX0RFUFRIX1RFU1Q7CisgICAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBESVNBQkxFX0RFUFRIX1RFU1Q7CiAKICAgICAgIC8qIEFsc28gdHVybiBvZmYgZGVwdGggd3JpdGVzIHdoZW4gR0xfREVQVEhfVEVTVCBpcyBkaXNhYmxlZDoKICAgICAgICAqLwotICAgICAgaTgzMERlcHRoTWFzayggY3R4LCBjdHgtPkRlcHRoLk1hc2sgKTsKKyAgICAgIGk4MzBEZXB0aE1hc2soY3R4LCBjdHgtPkRlcHRoLk1hc2spOwogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgogICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9CVUZGRVJTKTsKLSAgICAgIAorCiAgICAgICBpZiAoc3RhdGUpCi0JIGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfU0VOQUJMRV0gPSAKLQkgICAgKF8zRFNUQVRFX1NDSVNTT1JfRU5BQkxFX0NNRCB8Ci0JICAgICBFTkFCTEVfU0NJU1NPUl9SRUNUKTsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfU0VOQUJMRV0gPQorICAgICAgICAgICAgKF8zRFNUQVRFX1NDSVNTT1JfRU5BQkxFX0NNRCB8IEVOQUJMRV9TQ0lTU09SX1JFQ1QpOwogICAgICAgZWxzZQotCSBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX1NFTkFCTEVdID0gCi0JICAgIChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfAotCSAgICAgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOworICAgICAgICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19TRU5BQkxFXSA9CisgICAgICAgICAgICAoXzNEU1RBVEVfU0NJU1NPUl9FTkFCTEVfQ01EIHwgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOwogCiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9MSU5FX1NNT09USDoKICAgICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKLSAgICAgIAorCiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfQUFdICY9IH5BQV9MSU5FX0VOQUJMRTsKICAgICAgIGlmIChzdGF0ZSkKLQkgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0FBXSB8PSBBQV9MSU5FX0VOQUJMRTsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19BQV0gfD0gQUFfTElORV9FTkFCTEU7CiAgICAgICBlbHNlCi0JIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19BQV0gfD0gQUFfTElORV9ESVNBQkxFOworICAgICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0FBXSB8PSBBQV9MSU5FX0RJU0FCTEU7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9GT0c6CiAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX0NUWCk7CiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSAmPSB+RU5BQkxFX0RJU19GT0dfTUFTSzsKICAgICAgIGlmIChzdGF0ZSkKLQkgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gRU5BQkxFX0ZPRzsKKyAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IEVOQUJMRV9GT0c7CiAgICAgICBlbHNlCi0JIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfRk9HOworICAgICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gRElTQUJMRV9GT0c7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9DVUxMX0ZBQ0U6CkBAIC04MDgsMjAgKzgyNywzMiBAQAogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgotICAgICAgaWYgKGk4MzAtPmludGVsLmh3X3N0ZW5jaWwpIHsKLQkgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOworICAgICAgeworICAgICAgICAgR0xib29sZWFuIGh3X3N0ZW5jaWwgPSBHTF9GQUxTRTsKKyAgICAgICAgIGlmIChjdHgtPkRyYXdCdWZmZXIpIHsKKyAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYlN0ZW5jaWwKKyAgICAgICAgICAgICAgID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihjdHgtPkRyYXdCdWZmZXIsIEJVRkZFUl9TVEVOQ0lMKTsKKyAgICAgICAgICAgIGh3X3N0ZW5jaWwgPSAoaXJiU3RlbmNpbCAmJiBpcmJTdGVuY2lsLT5yZWdpb24pOworICAgICAgICAgfQorICAgICAgICAgaWYgKGh3X3N0ZW5jaWwpIHsKKyAgICAgICAgICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQ1RYKTsKIAotCSBpZiAoc3RhdGUpIHsKLQkgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gRU5BQkxFX1NURU5DSUxfVEVTVDsKLQkgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gfD0gRU5BQkxFX1NURU5DSUxfV1JJVEU7Ci0JIH0gZWxzZSB7Ci0JICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdICY9IH5FTkFCTEVfU1RFTkNJTF9URVNUOwotCSAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSAmPSB+RU5BQkxFX1NURU5DSUxfV1JJVEU7Ci0JICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdIHw9IERJU0FCTEVfU1RFTkNJTF9URVNUOwotCSAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18yXSB8PSBESVNBQkxFX1NURU5DSUxfV1JJVEU7Ci0JIH0KLSAgICAgIH0gZWxzZSB7Ci0JIEZBTExCQUNLKCAmaTgzMC0+aW50ZWwsIEk4MzBfRkFMTEJBQ0tfU1RFTkNJTCwgc3RhdGUgKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSkgeworICAgICAgICAgICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMV0gfD0gRU5BQkxFX1NURU5DSUxfVEVTVDsKKyAgICAgICAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9IEVOQUJMRV9TVEVOQ0lMX1dSSVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSAmPSB+RU5BQkxFX1NURU5DSUxfVEVTVDsKKyAgICAgICAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdICY9CisgICAgICAgICAgICAgICAgICB+RU5BQkxFX1NURU5DSUxfV1JJVEU7CisgICAgICAgICAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRU5BQkxFU18xXSB8PSBESVNBQkxFX1NURU5DSUxfVEVTVDsKKyAgICAgICAgICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzJdIHw9CisgICAgICAgICAgICAgICAgICBESVNBQkxFX1NURU5DSUxfV1JJVEU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZBTExCQUNLKCZpODMwLT5pbnRlbCwgSTgzMF9GQUxMQkFDS19TVEVOQ0lMLCBzdGF0ZSk7CisgICAgICAgICB9CiAgICAgICB9CiAgICAgICBicmVhazsKIApAQCAtODMwLDEzICs4NjEsMTIgQEAKICAgICAgICAqIEknbGwgZG8gbW9yZSB0ZXN0aW5nIGxhdGVyIHRvIGZpbmQgb3V0IGV4YWN0bHkgd2hpY2ggaGFyZHdhcmUKICAgICAgICAqIHN1cHBvcnRzIGl0LiAgRGlzYWJsZWQgZm9yIG5vdy4KICAgICAgICAqLwotICAgICAgaWYgKGk4MzAtPmludGVsLmh3X3N0aXBwbGUgJiYgCi0JICBpODMwLT5pbnRlbC5yZWR1Y2VkX3ByaW1pdGl2ZSA9PSBHTF9UUklBTkdMRVMpCi0gICAgICB7Ci0JIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfU1RJUFBMRSk7Ci0JIGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXSAmPSB+U1QxX0VOQUJMRTsKLQkgaWYgKHN0YXRlKQotCSAgICBpODMwLT5zdGF0ZS5TdGlwcGxlW0k4MzBfU1RQUkVHX1NUMV0gfD0gU1QxX0VOQUJMRTsKKyAgICAgIGlmIChpODMwLT5pbnRlbC5od19zdGlwcGxlICYmCisgICAgICAgICAgaTgzMC0+aW50ZWwucmVkdWNlZF9wcmltaXRpdmUgPT0gR0xfVFJJQU5HTEVTKSB7CisgICAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1NUSVBQTEUpOworICAgICAgICAgaTgzMC0+c3RhdGUuU3RpcHBsZVtJODMwX1NUUFJFR19TVDFdICY9IH5TVDFfRU5BQkxFOworICAgICAgICAgaWYgKHN0YXRlKQorICAgICAgICAgICAgaTgzMC0+c3RhdGUuU3RpcHBsZVtJODMwX1NUUFJFR19TVDFdIHw9IFNUMV9FTkFCTEU7CiAgICAgICB9CiAgICAgICBicmVhazsKIApAQCAtODQ2LDIwNiArODc2LDE3MiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGk4MzBfaW5pdF9wYWNrZXRzKCBpODMwQ29udGV4dFB0ciBpODMwICkKK3N0YXRpYyB2b2lkCitpODMwX2luaXRfcGFja2V0cyhzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKQogewotICAgaW50ZWxTY3JlZW5Qcml2YXRlICpzY3JlZW4gPSBpODMwLT5pbnRlbC5pbnRlbFNjcmVlbjsKLQogICAgLyogWmVybyBhbGwgc3RhdGUgKi8KICAgIG1lbXNldCgmaTgzMC0+c3RhdGUsIDAsIHNpemVvZihpODMwLT5zdGF0ZSkpOwogCiAgICAvKiBTZXQgZGVmYXVsdCBibGVuZCBzdGF0ZSAqLwogICAgaTgzMC0+c3RhdGUuVGV4QmxlbmRbMF1bMF0gPSAoXzNEU1RBVEVfTUFQX0JMRU5EX09QX0NNRCgwKSB8Ci0JCQkJICBURVhQSVBFX0NPTE9SIHwKLQkJCQkgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8Ci0JCQkJICBURVhPUF9PVVRQVVRfQ1VSUkVOVCB8Ci0JCQkJICBESVNBQkxFX1RFWF9DTlRSTF9TVEFHRSB8Ci0JCQkJICBURVhPUF9TQ0FMRV8xWCB8Ci0JCQkJICBURVhPUF9NT0RJRllfUEFSTVMgfAotCQkJCSAgVEVYT1BfTEFTVF9TVEFHRSB8Ci0JCQkJICBURVhCTEVORE9QX0FSRzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYUElQRV9DT0xPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfVEVYT1VUUFVUX1dSVF9TRUwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYT1BfT1VUUFVUX0NVUlJFTlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRV9URVhfQ05UUkxfU1RBR0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYT1BfU0NBTEVfMVggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYT1BfTU9ESUZZX1BBUk1TIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWE9QX0xBU1RfU1RBR0UgfCBURVhCTEVORE9QX0FSRzEpOwogICAgaTgzMC0+c3RhdGUuVGV4QmxlbmRbMF1bMV0gPSAoXzNEU1RBVEVfTUFQX0JMRU5EX09QX0NNRCgwKSB8Ci0JCQkJICBURVhQSVBFX0FMUEhBIHwKLQkJCQkgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8Ci0JCQkJICBURVhPUF9PVVRQVVRfQ1VSUkVOVCB8Ci0JCQkJICBURVhPUF9TQ0FMRV8xWCB8Ci0JCQkJICBURVhPUF9NT0RJRllfUEFSTVMgfAotCQkJCSAgVEVYQkxFTkRPUF9BUkcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFBJUEVfQUxQSEEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1RFWE9VVFBVVF9XUlRfU0VMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWE9QX09VVFBVVF9DVVJSRU5UIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWE9QX1NDQUxFXzFYIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWE9QX01PRElGWV9QQVJNUyB8IFRFWEJMRU5ET1BfQVJHMSk7CiAgICBpODMwLT5zdGF0ZS5UZXhCbGVuZFswXVsyXSA9IChfM0RTVEFURV9NQVBfQkxFTkRfQVJHX0NNRCgwKSB8Ci0JCQkJICBURVhQSVBFX0NPTE9SIHwKLQkJCQkgIFRFWEJMRU5EX0FSRzEgfAotCQkJCSAgVEVYQkxFTkRBUkdfTU9ESUZZX1BBUk1TIHwKLQkJCQkgIFRFWEJMRU5EQVJHX0RJRkZVU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYUElQRV9DT0xPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhCTEVORF9BUkcxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWEJMRU5EQVJHX01PRElGWV9QQVJNUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhCTEVOREFSR19ESUZGVVNFKTsKICAgIGk4MzAtPnN0YXRlLlRleEJsZW5kWzBdWzNdID0gKF8zRFNUQVRFX01BUF9CTEVORF9BUkdfQ01EKDApIHwKLQkJCQkgIFRFWFBJUEVfQUxQSEEgfAotCQkJCSAgVEVYQkxFTkRfQVJHMSB8Ci0JCQkJICBURVhCTEVOREFSR19NT0RJRllfUEFSTVMgfAotCQkJCSAgVEVYQkxFTkRBUkdfRElGRlVTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhQSVBFX0FMUEhBIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWEJMRU5EX0FSRzEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYQkxFTkRBUkdfTU9ESUZZX1BBUk1TIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWEJMRU5EQVJHX0RJRkZVU0UpOwogCiAgICBpODMwLT5zdGF0ZS5UZXhCbGVuZFdvcmRzVXNlZFswXSA9IDQ7CiAKIAotICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1ZGXSA9ICAwOworICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1ZGXSA9IDA7CiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfVkYyXSA9IDA7CiAKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19BQV0gPSAoXzNEU1RBVEVfQUFfQ01EIHwKLQkJCQkgICAgICBBQV9MSU5FX0VDQUFSX1dJRFRIX0VOQUJMRSB8Ci0JCQkJICAgICAgQUFfTElORV9FQ0FBUl9XSURUSF8xXzAgfAotCQkJCSAgICAgIEFBX0xJTkVfUkVHSU9OX1dJRFRIX0VOQUJMRSB8Ci0JCQkJICAgICAgQUFfTElORV9SRUdJT05fV0lEVEhfMV8wIHwgCi0JCQkJICAgICAgQUFfTElORV9ESVNBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFfTElORV9FQ0FBUl9XSURUSF9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQV9MSU5FX0VDQUFSX1dJRFRIXzFfMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBX0xJTkVfUkVHSU9OX1dJRFRIX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBX0xJTkVfUkVHSU9OX1dJRFRIXzFfMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBX0xJTkVfRElTQUJMRSk7CiAKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19FTkFCTEVTXzFdID0gKF8zRFNUQVRFX0VOQUJMRVNfMV9DTUQgfAotCQkJCQkgICAgIERJU0FCTEVfTE9HSUNfT1AgfAotCQkJCQkgICAgIERJU0FCTEVfU1RFTkNJTF9URVNUIHwKLQkJCQkJICAgICBESVNBQkxFX0RFUFRIX0JJQVMgfAotCQkJCQkgICAgIERJU0FCTEVfU1BFQ19BREQgfAotCQkJCQkgICAgIERJU0FCTEVfRk9HIHwKLQkJCQkJICAgICBESVNBQkxFX0FMUEhBX1RFU1QgfAotCQkJCQkgICAgIERJU0FCTEVfQ09MT1JfQkxFTkQgfAotCQkJCQkgICAgIERJU0FCTEVfREVQVEhfVEVTVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX0xPR0lDX09QIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfU1RFTkNJTF9URVNUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfREVQVEhfQklBUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX1NQRUNfQUREIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfRk9HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfQUxQSEFfVEVTVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX0NPTE9SX0JMRU5EIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfREVQVEhfVEVTVCk7CiAKKyNpZiAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYIGFsbCB0aGUgc3RlbmNpbCBlbmFibGUgc3RhdGUgaXMgc2V0IGluIGk4MzBFbmFibGUoKSwgcmlnaHQ/ICovCiAgICBpZiAoaTgzMC0+aW50ZWwuaHdfc3RlbmNpbCkgewogICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gPSAoXzNEU1RBVEVfRU5BQkxFU18yX0NNRCB8Ci0JCQkJCQlFTkFCTEVfU1RFTkNJTF9XUklURSB8Ci0JCQkJCQlFTkFCTEVfVEVYX0NBQ0hFIHwKLQkJCQkJCUVOQUJMRV9ESVRIRVIgfAotCQkJCQkJRU5BQkxFX0NPTE9SX01BU0sgfAotCQkJCQkJLyogc2V0IG5vIGNvbG9yIGNvbXBzIGRpc2FibGVkICovCi0JCQkJCQlFTkFCTEVfQ09MT1JfV1JJVEUgfAotCQkJCQkJRU5BQkxFX0RFUFRIX1dSSVRFKTsKLSAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfU1RFTkNJTF9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfVEVYX0NBQ0hFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9ESVRIRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0NPTE9SX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG5vIGNvbG9yIGNvbXBzIGRpc2FibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfQ09MT1JfV1JJVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0RFUFRIX1dSSVRFKTsKKyAgIH0KKyAgIGVsc2UKKyNlbmRpZgorICAgewogICAgICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0VOQUJMRVNfMl0gPSAoXzNEU1RBVEVfRU5BQkxFU18yX0NNRCB8Ci0JCQkJCQlESVNBQkxFX1NURU5DSUxfV1JJVEUgfAotCQkJCQkJRU5BQkxFX1RFWF9DQUNIRSB8Ci0JCQkJCQlFTkFCTEVfRElUSEVSIHwKLQkJCQkJCUVOQUJMRV9DT0xPUl9NQVNLIHwKLQkJCQkJCS8qIHNldCBubyBjb2xvciBjb21wcyBkaXNhYmxlZCAqLwotCQkJCQkJRU5BQkxFX0NPTE9SX1dSSVRFIHwKLQkJCQkJCUVOQUJMRV9ERVBUSF9XUklURSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX1NURU5DSUxfV1JJVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1RFWF9DQUNIRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfRElUSEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9DT0xPUl9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBubyBjb2xvciBjb21wcyBkaXNhYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0NPTE9SX1dSSVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9ERVBUSF9XUklURSk7CiAgICB9CiAKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19TVEFURTFdID0gKF8zRFNUQVRFX01PREVTXzFfQ01EIHwKLQkJCQkJICBFTkFCTEVfQ09MUl9CTE5EX0ZVTkMgfAotCQkJCQkgIEJMRU5ERlVOQ19BREQgfAotCQkJCQkgIEVOQUJMRV9TUkNfQkxORF9GQUNUT1IgfAotCQkJCQkgIFNSQ19CTE5EX0ZBQ1QoQkxFTkRGQUNUX09ORSkgfCAKLQkJCQkJICBFTkFCTEVfRFNUX0JMTkRfRkFDVE9SIHwKLQkJCQkJICBEU1RfQkxORF9GQUNUKEJMRU5ERkFDVF9aRVJPKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0NPTFJfQkxORF9GVU5DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMRU5ERlVOQ19BREQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1NSQ19CTE5EX0ZBQ1RPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUkNfQkxORF9GQUNUKEJMRU5ERkFDVF9PTkUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9EU1RfQkxORF9GQUNUT1IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUX0JMTkRfRkFDVChCTEVOREZBQ1RfWkVSTykpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUyXSA9IChfM0RTVEFURV9NT0RFU18yX0NNRCB8Ci0JCQkJCSAgRU5BQkxFX0dMT0JBTF9ERVBUSF9CSUFTIHwgCi0JCQkJCSAgR0xPQkFMX0RFUFRIX0JJQVMoMCkgfAotCQkJCQkgIEVOQUJMRV9BTFBIQV9URVNUX0ZVTkMgfCAKLQkJCQkJICBBTFBIQV9URVNUX0ZVTkMoQ09NUEFSRUZVTkNfQUxXQVlTKSB8Ci0JCQkJCSAgQUxQSEFfUkVGX1ZBTFVFKDApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfR0xPQkFMX0RFUFRIX0JJQVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0RFUFRIX0JJQVMoMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0FMUEhBX1RFU1RfRlVOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9URVNUX0ZVTkMoQ09NUEFSRUZVTkNfQUxXQVlTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBTFBIQV9SRUZfVkFMVUUoMCkpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEUzXSA9IChfM0RTVEFURV9NT0RFU18zX0NNRCB8Ci0JCQkJCSAgRU5BQkxFX0RFUFRIX1RFU1RfRlVOQyB8Ci0JCQkJCSAgREVQVEhfVEVTVF9GVU5DKENPTVBBUkVGVU5DX0xFU1MpIHwKLQkJCQkJICBFTkFCTEVfQUxQSEFfU0hBREVfTU9ERSB8Ci0JCQkJCSAgQUxQSEFfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikgfAotCQkJCQkgIEVOQUJMRV9GT0dfU0hBREVfTU9ERSB8Ci0JCQkJCSAgRk9HX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpIHwKLQkJCQkJICBFTkFCTEVfU1BFQ19TSEFERV9NT0RFIHwKLQkJCQkJICBTUEVDX1NIQURFX01PREUoU0hBREVfTU9ERV9MSU5FQVIpIHwKLQkJCQkJICBFTkFCTEVfQ09MT1JfU0hBREVfTU9ERSB8Ci0JCQkJCSAgQ09MT1JfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikgfAotCQkJCQkgIEVOQUJMRV9DVUxMX01PREUgfAotCQkJCQkgIENVTExNT0RFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0RFUFRIX1RFU1RfRlVOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVBUSF9URVNUX0ZVTkMoQ09NUEFSRUZVTkNfTEVTUykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0FMUEhBX1NIQURFX01PREUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRU5BQkxFX0ZPR19TSEFERV9NT0RFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPR19TSEFERV9NT0RFKFNIQURFX01PREVfTElORUFSKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfU1BFQ19TSEFERV9NT0RFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0NPTE9SX1NIQURFX01PREUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfU0hBREVfTU9ERShTSEFERV9NT0RFX0xJTkVBUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRU5BQkxFX0NVTExfTU9ERSB8IENVTExNT0RFX05PTkUpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU0XSA9IChfM0RTVEFURV9NT0RFU180X0NNRCB8Ci0JCQkJCSAgRU5BQkxFX0xPR0lDX09QX0ZVTkMgfAotCQkJCQkgIExPR0lDX09QX0ZVTkMoTE9HSUNPUF9DT1BZKSB8Ci0JCQkJCSAgRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLIHwKLQkJCQkJICBTVEVOQ0lMX1RFU1RfTUFTSygweGZmKSB8Ci0JCQkJCSAgRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSyB8Ci0JCQkJCSAgU1RFTkNJTF9XUklURV9NQVNLKDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9MT0dJQ19PUF9GVU5DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0lDX09QX0ZVTkMoTE9HSUNPUF9DT1BZKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfU1RFTkNJTF9URVNUX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9URVNUX01BU0soMHhmZikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1dSSVRFX01BU0soMHhmZikpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RFTkNJTFRTVF0gPSAoXzNEU1RBVEVfU1RFTkNJTF9URVNUX0NNRCB8Ci0JCQkJCSAgICAgIEVOQUJMRV9TVEVOQ0lMX1BBUk1TIHwKLQkJCQkJICAgICAgU1RFTkNJTF9GQUlMX09QKFNURU5DSUxPUF9LRUVQKSB8Ci0JCQkJCSAgICAgIFNURU5DSUxfUEFTU19ERVBUSF9GQUlMX09QKFNURU5DSUxPUF9LRUVQKSB8Ci0JCQkJCSAgICAgIFNURU5DSUxfUEFTU19ERVBUSF9QQVNTX09QKFNURU5DSUxPUF9LRUVQKSB8Ci0JCQkJCSAgICAgIEVOQUJMRV9TVEVOQ0lMX1RFU1RfRlVOQyB8Ci0JCQkJCSAgICAgIFNURU5DSUxfVEVTVF9GVU5DKENPTVBBUkVGVU5DX0FMV0FZUykgfAotCQkJCQkgICAgICBFTkFCTEVfU1RFTkNJTF9SRUZfVkFMVUUgfAotCQkJCQkgICAgICBTVEVOQ0lMX1JFRl9WQUxVRSgwKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9TVEVOQ0lMX1BBUk1TIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX0ZBSUxfT1AoU1RFTkNJTE9QX0tFRVApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURU5DSUxfUEFTU19ERVBUSF9GQUlMX09QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNURU5DSUxPUF9LRUVQKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1NfT1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1RFTkNJTE9QX0tFRVApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfU1RFTkNJTF9URVNUX0ZVTkMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURU5DSUxfVEVTVF9GVU5DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENPTVBBUkVGVU5DX0FMV0FZUykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9TVEVOQ0lMX1JFRl9WQUxVRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9SRUZfVkFMVUUoMCkpOwogCi0gICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfU1RBVEU1XSA9IChfM0RTVEFURV9NT0RFU181X0NNRCB8Ci0JCQkJCSAgRkxVU0hfVEVYVFVSRV9DQUNIRSB8Ci0JCQkJCSAgRU5BQkxFX1NQUklURV9QT0lOVF9URVggfAotCQkJCQkgIFNQUklURV9QT0lOVF9URVhfT0ZGIHwKLQkJCQkJICBFTkFCTEVfRklYRURfTElORV9XSURUSCB8Ci0JCQkJCSAgRklYRURfTElORV9XSURUSCgweDIpIHwgLyogMS4wICovCi0JCQkJCSAgRU5BQkxFX0ZJWEVEX1BPSU5UX1dJRFRIIHwKLQkJCQkJICBGSVhFRF9QT0lOVF9XSURUSCgxKSApOworICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1NUQVRFNV0gPSAoXzNEU1RBVEVfTU9ERVNfNV9DTUQgfCBGTFVTSF9URVhUVVJFX0NBQ0hFIHwgRU5BQkxFX1NQUklURV9QT0lOVF9URVggfCBTUFJJVEVfUE9JTlRfVEVYX09GRiB8IEVOQUJMRV9GSVhFRF9MSU5FX1dJRFRIIHwgRklYRURfTElORV9XSURUSCgweDIpIHwgICAgICAgLyogMS4wICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfRklYRURfUE9JTlRfV0lEVEggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYRURfUE9JTlRfV0lEVEgoMSkpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfSUFMUEhBQl0gPSAoXzNEU1RBVEVfSU5EUFRfQUxQSEFfQkxFTkRfQ01EIHwKLQkJCQkJICAgRElTQUJMRV9JTkRQVF9BTFBIQV9CTEVORCB8Ci0JCQkJCSAgIEVOQUJMRV9BTFBIQV9CTEVOREZVTkMgfAotCQkJCQkgICBBQkxFTkRGVU5DX0FERCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRV9JTkRQVF9BTFBIQV9CTEVORCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX0FMUEhBX0JMRU5ERlVOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJMRU5ERlVOQ19BREQpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfRk9HQ09MT1JdID0gKF8zRFNUQVRFX0ZPR19DT0xPUl9DTUQgfAotCQkJCQkgICAgRk9HX0NPTE9SX1JFRCgwKSB8Ci0JCQkJCSAgICBGT0dfQ09MT1JfR1JFRU4oMCkgfAotCQkJCQkgICAgRk9HX0NPTE9SX0JMVUUoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT0dfQ09MT1JfUkVEKDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9HX0NPTE9SX0dSRUVOKDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9HX0NPTE9SX0JMVUUoMCkpOwogCiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfQkxFTkRDT0xPUjBdID0gXzNEU1RBVEVfQ09OU1RfQkxFTkRfQ09MT1JfQ01EOwogICAgaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX0JMRU5EQ09MT1IxXSA9IDA7CiAKICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19NQ1NCMF0gPSBfM0RTVEFURV9NQVBfQ09PUkRfU0VUQklORF9DTUQ7CiAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfTUNTQjFdID0gKFRFWEJJTkRfU0VUMyhURVhDT09SRFNSQ19WVFhTRVRfMykgfAotCQkJCQkgVEVYQklORF9TRVQyKFRFWENPT1JEU1JDX1ZUWFNFVF8yKSB8Ci0JCQkJCSBURVhCSU5EX1NFVDEoVEVYQ09PUkRTUkNfVlRYU0VUXzEpIHwKLQkJCQkJIFRFWEJJTkRfU0VUMChURVhDT09SRFNSQ19WVFhTRVRfMCkpOwotCQkJCQkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWEJJTkRfU0VUMihURVhDT09SRFNSQ19WVFhTRVRfMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhCSU5EX1NFVDEoVEVYQ09PUkRTUkNfVlRYU0VUXzEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYQklORF9TRVQwKFRFWENPT1JEU1JDX1ZUWFNFVF8wKSk7CisKIAogICAgaTgzMC0+c3RhdGUuU3RpcHBsZVtJODMwX1NUUFJFR19TVDBdID0gXzNEU1RBVEVfU1RJUFBMRTsKIAotICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjBdID0gXzNEU1RBVEVfQlVGX0lORk9fQ01EOwotICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjFdID0gCi0gICAgICAoQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCAKLSAgICAgICBCVUZfM0RfUElUQ0goc2NyZWVuLT5mcm9udC5waXRjaCkgfCAgLyogcGl0Y2ggaW4gYnl0ZXMgKi8KLSAgICAgICBCVUZfM0RfVVNFX0ZFTkNFKTsKLQotCi0gICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0RCVUZBRERSMF0gPSBfM0RTVEFURV9CVUZfSU5GT19DTUQ7Ci0gICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0RCVUZBRERSMV0gPSAKLSAgICAgIChCVUZfM0RfSURfREVQVEggfAotICAgICAgIEJVRl8zRF9QSVRDSChzY3JlZW4tPmRlcHRoLnBpdGNoKSB8ICAvKiBwaXRjaCBpbiBieXRlcyAqLwotICAgICAgIEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19EQlVGQUREUjJdID0gc2NyZWVuLT5kZXB0aC5vZmZzZXQ7Ci0KLQogICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19EVjBdID0gXzNEU1RBVEVfRFNUX0JVRl9WQVJTX0NNRDsKLQotICAgc3dpdGNoIChzY3JlZW4tPmZiRm9ybWF0KSB7Ci0gICBjYXNlIERWX1BGXzU1NToKLSAgIGNhc2UgRFZfUEZfNTY1OgotICAgICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19EVjFdID0gKERTVE9SR19IT1JUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCSAgICAgIERTVE9SR19WRVJUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCSAgICAgIHNjcmVlbi0+ZmJGb3JtYXQgfAotCQkJCQkgICAgICBERVBUSF9JU19aIHwKLQkJCQkJICAgICAgREVQVEhfRlJNVF8xNl9GSVhFRCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRFZfUEZfODg4ODoKLSAgICAgIGk4MzAtPnN0YXRlLkJ1ZmZlcltJODMwX0RFU1RSRUdfRFYxXSA9IChEU1RPUkdfSE9SVF9CSUFTKDB4OCkgfCAvKiAuNSAqLwotCQkJCQkgICAgICBEU1RPUkdfVkVSVF9CSUFTKDB4OCkgfCAvKiAuNSAqLwotCQkJCQkgICAgICBzY3JlZW4tPmZiRm9ybWF0IHwKLQkJCQkJICAgICAgREVQVEhfSVNfWiB8Ci0JCQkJCSAgICAgIERFUFRIX0ZSTVRfMjRfRklYRURfOF9PVEhFUik7Ci0gICAgICBicmVhazsKLSAgIH0KLQogICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19TRU5BQkxFXSA9IChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfAotCQkJCQkgICAgICAgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFX1NDSVNTT1JfUkVDVCk7CiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX1NSMF0gPSBfM0RTVEFURV9TQ0lTU09SX1JFQ1RfMF9DTUQ7CiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX1NSMV0gPSAwOwogICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19TUjJdID0gMDsKIH0KIAogCi12b2lkIGk4MzBJbml0U3RhdGVGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKQordm9pZAoraTgzMEluaXRTdGF0ZUZ1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKQogewogICAgZnVuY3Rpb25zLT5BbHBoYUZ1bmMgPSBpODMwQWxwaGFGdW5jOwogICAgZnVuY3Rpb25zLT5CbGVuZENvbG9yID0gaTgzMEJsZW5kQ29sb3I7CkBAIC0xMDcwLDIwICsxMDY2LDIxIEBACiAgICBmdW5jdGlvbnMtPlN0ZW5jaWxPcFNlcGFyYXRlID0gaTgzMFN0ZW5jaWxPcFNlcGFyYXRlOwogfQogCi12b2lkIGk4MzBJbml0U3RhdGUoIGk4MzBDb250ZXh0UHRyIGk4MzAgKQordm9pZAoraTgzMEluaXRTdGF0ZShzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwKQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaTgzMC0+aW50ZWwuY3R4OwogCi0gICBpODMwX2luaXRfcGFja2V0cyggaTgzMCApOworICAgaTgzMF9pbml0X3BhY2tldHMoaTgzMCk7CiAKICAgIF9tZXNhX2luaXRfZHJpdmVyX3N0YXRlKGN0eCk7CiAKLSAgIG1lbWNweSggJmk4MzAtPmluaXRpYWwsICZpODMwLT5zdGF0ZSwgc2l6ZW9mKGk4MzAtPnN0YXRlKSApOworICAgbWVtY3B5KCZpODMwLT5pbml0aWFsLCAmaTgzMC0+c3RhdGUsIHNpemVvZihpODMwLT5zdGF0ZSkpOwogCiAgICBpODMwLT5jdXJyZW50ID0gJmk4MzAtPnN0YXRlOwogICAgaTgzMC0+c3RhdGUuZW1pdHRlZCA9IDA7Ci0gICBpODMwLT5zdGF0ZS5hY3RpdmUgPSAoSTgzMF9VUExPQURfVEVYQkxFTkQoMCkgfAotCQkJIEk4MzBfVVBMT0FEX1NUSVBQTEUgfAotCQkJIEk4MzBfVVBMT0FEX0NUWCB8Ci0JCQkgSTgzMF9VUExPQURfQlVGRkVSUyk7CisgICBpODMwLT5zdGF0ZS5hY3RpdmUgPSAoSTgzMF9VUExPQURfSU5WQVJJRU5UIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJODMwX1VQTE9BRF9URVhCTEVORCgwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgSTgzMF9VUExPQURfU1RJUFBMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgSTgzMF9VUExPQURfQ1RYIHwgSTgzMF9VUExPQURfQlVGRkVSUyk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfdGV4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfdGV4LmMKaW5kZXggM2M0YWVkYi4uNzliMGZjZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX3RleC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXguYwpAQCAtNDUsMjYxICs0NSwxMyBAQAogCiAKIAotCi0vKioKLSAqIFNldCB0aGUgdGV4dHVyZSB3cmFwIG1vZGVzLgotICogCi0gKiBUaGUgaTgzME0gKGFuZCByZWxhdGVkIGdyYXBoaWNzIGNvcmVzKSBkbyBub3Qgc3VwcG9ydCBHTF9DTEFNUC4gIFRoZSBJbnRlbAotICogZHJpdmVycyBmb3IgIm90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIiBpbXBsZW1lbnQgR0xfQ0xBTVAgYXMKLSAqIEdMX0NMQU1QX1RPX0VER0UsIHNvIHRoZSBzYW1lIGlzIGRvbmUgaGVyZS4KLSAqIAotICogXHBhcmFtIHQgVGV4dHVyZSBvYmplY3Qgd2hvc2Ugd3JhcCBtb2RlcyBhcmUgdG8gYmUgc2V0Ci0gKiBccGFyYW0gc3dyYXAgV3JhcCBtb2RlIGZvciB0aGUgXGEgcyB0ZXh0dXJlIGNvb3JkaW5hdGUKLSAqIFxwYXJhbSB0d3JhcCBXcmFwIG1vZGUgZm9yIHRoZSBcYSB0IHRleHR1cmUgY29vcmRpbmF0ZQotICovCi1zdGF0aWMgdm9pZCBpODMwU2V0VGV4V3JhcHBpbmcoaTgzMFRleHR1cmVPYmplY3RQdHIgdGV4LAotCQkJICAgICAgIEdMZW51bSBzd3JhcCwgCi0JCQkgICAgICAgR0xlbnVtIHR3cmFwKQorc3RhdGljIHZvaWQKK2k4MzBUZXhFbnYoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbSkKIHsKLSAgIHRleC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSAmPSB+KFRFWENPT1JEX0FERFJfVV9NQVNLfFRFWENPT1JEX0FERFJfVl9NQVNLKTsKLQotICAgc3dpdGNoKCBzd3JhcCApIHsKLSAgIGNhc2UgR0xfUkVQRUFUOgotICAgICAgdGV4LT5TZXR1cFtJODMwX1RFWFJFR19NQ1NdIHw9IFRFWENPT1JEX0FERFJfVV9NT0RFKFRFWENPT1JETU9ERV9XUkFQKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9DTEFNUDoKLSAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKLSAgICAgIHRleC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSB8PSBURVhDT09SRF9BRERSX1VfTU9ERShURVhDT09SRE1PREVfQ0xBTVApOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX0NMQU1QX1RPX0JPUkRFUjoKLSAgICAgIHRleC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSB8PSAKLQkJCVRFWENPT1JEX0FERFJfVV9NT0RFKFRFWENPT1JETU9ERV9DTEFNUF9CT1JERVIpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKLSAgICAgIHRleC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSB8PSAKLQkJCVRFWENPT1JEX0FERFJfVV9NT0RFKFRFWENPT1JETU9ERV9NSVJST1IpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHN3aXRjaCggdHdyYXAgKSB7Ci0gICBjYXNlIEdMX1JFUEVBVDoKLSAgICAgIHRleC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSB8PSBURVhDT09SRF9BRERSX1ZfTU9ERShURVhDT09SRE1PREVfV1JBUCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfQ0xBTVA6Ci0gICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6Ci0gICAgICB0ZXgtPlNldHVwW0k4MzBfVEVYUkVHX01DU10gfD0gVEVYQ09PUkRfQUREUl9WX01PREUoVEVYQ09PUkRNT0RFX0NMQU1QKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9DTEFNUF9UT19CT1JERVI6Ci0gICAgICB0ZXgtPlNldHVwW0k4MzBfVEVYUkVHX01DU10gfD0gCi0JCQlURVhDT09SRF9BRERSX1ZfTU9ERShURVhDT09SRE1PREVfQ0xBTVBfQk9SREVSKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6Ci0gICAgICB0ZXgtPlNldHVwW0k4MzBfVEVYUkVHX01DU10gfD0KLQkJCVRFWENPT1JEX0FERFJfVl9NT0RFKFRFWENPT1JETU9ERV9NSVJST1IpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLQotLyoqCi0gKiBTZXQgdGhlIHRleHR1cmUgbWFnbmlmaWNhdGlvbiBhbmQgbWluaWZpY2F0aW9uIG1vZGVzLgotICogCi0gKiBccGFyYW0gdCBUZXh0dXJlIHdob3NlIGZpbHRlciBtb2RlcyBhcmUgdG8gYmUgc2V0Ci0gKiBccGFyYW0gbWluZiBUZXh0dXJlIG1pbmlmaWNhdGlvbiBtb2RlCi0gKiBccGFyYW0gbWFnZiBUZXh0dXJlIG1hZ25pZmljYXRpb24gbW9kZQotICogXHBhcmFtIGJpYXMgTE9EIGJpYXMgZm9yIHRoaXMgdGV4dHVyZSB1bml0LgotICovCi0KLXN0YXRpYyB2b2lkIGk4MzBTZXRUZXhGaWx0ZXIoIGk4MzBUZXh0dXJlT2JqZWN0UHRyIHQsIEdMZW51bSBtaW5mLCBHTGVudW0gbWFnZiwKLQkJCSAgICAgIEdMZmxvYXQgbWF4YW5pc290cm9weSApCi17Ci0gICBpbnQgbWluRmlsdCA9IDAsIG1pcEZpbHQgPSAwLCBtYWdGaWx0ID0gMDsKLQotICAgaWYoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgaWYgKCBtYXhhbmlzb3Ryb3B5ID4gMS4wICkgewotICAgICAgbWluRmlsdCA9IEZJTFRFUl9BTklTT1RST1BJQzsKLSAgICAgIG1hZ0ZpbHQgPSBGSUxURVJfQU5JU09UUk9QSUM7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHN3aXRjaCAobWluZikgewotICAgICAgY2FzZSBHTF9ORUFSRVNUOgotCSBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7Ci0JIG1pcEZpbHQgPSBNSVBGSUxURVJfTk9ORTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX0xJTkVBUjoKLQkgbWluRmlsdCA9IEZJTFRFUl9MSU5FQVI7Ci0JIG1pcEZpbHQgPSBNSVBGSUxURVJfTk9ORTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q6Ci0JIG1pbkZpbHQgPSBGSUxURVJfTkVBUkVTVDsKLQkgbWlwRmlsdCA9IE1JUEZJTFRFUl9ORUFSRVNUOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUOgotCSBtaW5GaWx0ID0gRklMVEVSX0xJTkVBUjsKLQkgbWlwRmlsdCA9IE1JUEZJTFRFUl9ORUFSRVNUOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgotCSBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7Ci0JIG1pcEZpbHQgPSBNSVBGSUxURVJfTElORUFSOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9MSU5FQVI6Ci0JIG1pbkZpbHQgPSBGSUxURVJfTElORUFSOwotCSBtaXBGaWx0ID0gTUlQRklMVEVSX0xJTkVBUjsKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBicmVhazsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChtYWdmKSB7Ci0gICAgICBjYXNlIEdMX05FQVJFU1Q6Ci0JIG1hZ0ZpbHQgPSBGSUxURVJfTkVBUkVTVDsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX0xJTkVBUjoKLQkgbWFnRmlsdCA9IEZJTFRFUl9MSU5FQVI7Ci0JIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkgYnJlYWs7Ci0gICAgICB9ICAKLSAgIH0KLQotICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzNdICY9IH5UTTBTM19NSU5fRklMVEVSX01BU0s7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTM10gJj0gflRNMFMzX01JUF9GSUxURVJfTUFTSzsKLSAgIHQtPlNldHVwW0k4MzBfVEVYUkVHX1RNMFMzXSAmPSB+VE0wUzNfTUFHX0ZJTFRFUl9NQVNLOwotICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzNdIHw9ICgobWluRmlsdCA8PCBUTTBTM19NSU5fRklMVEVSX1NISUZUKSB8Ci0JCQkJICAgKG1pcEZpbHQgPDwgVE0wUzNfTUlQX0ZJTFRFUl9TSElGVCkgfAotCQkJCSAgIChtYWdGaWx0IDw8IFRNMFMzX01BR19GSUxURVJfU0hJRlQpKTsKLX0KLQotc3RhdGljIHZvaWQgaTgzMFNldFRleEJvcmRlckNvbG9yKGk4MzBUZXh0dXJlT2JqZWN0UHRyIHQsIEdMdWJ5dGUgY29sb3JbNF0pCi17Ci0gICBpZihJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzRdID0gCi0gICAgICAgIElOVEVMX1BBQ0tDT0xPUjg4ODgoY29sb3JbMF0sY29sb3JbMV0sY29sb3JbMl0sY29sb3JbM10pOwotfQotCi0KLS8qKgotICogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBsb2FkIHRoZSBtZXNhIGltYWdlcyBpbnRvIHRoZSB0ZXh0dXJlIG1lbW9yeSBibG9jay4KLSAqIFRoaXMgd2lsbCBoYXBwZW4gYmVmb3JlIGRyYXdpbmcgd2l0aCBhIG5ldyB0ZXh0dXJlLCBvciBkcmF3aW5nIHdpdGggYQotICogdGV4dHVyZSBhZnRlciBpdCB3YXMgc3dhcHBlZCBvdXQgb3IgdGV4aW1hZ2VkIGFnYWluLgotICovCi0KLWludGVsVGV4dHVyZU9iamVjdFB0ciBpODMwQWxsb2NUZXhPYmooIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqICkKLXsKLSAgIGk4MzBUZXh0dXJlT2JqZWN0UHRyIHQgPSBDQUxMT0NfU1RSVUNUKCBpODMwX3RleHR1cmVfb2JqZWN0ICk7Ci0gICBpZiAoICF0ICkgCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgdGV4T2JqLT5Ecml2ZXJEYXRhID0gdDsKLSAgIHQtPmludGVsLmJhc2UudE9iaiA9IHRleE9iajsKLSAgIHQtPmludGVsLmRpcnR5ID0gSTgzMF9VUExPQURfVEVYX0FMTDsKLSAgIG1ha2VfZW1wdHlfbGlzdCggJnQtPmludGVsLmJhc2UgKTsKLQotICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wTEldID0gMDsgLyogbm90IHVzZWQgKi8KLSAgIHQtPlNldHVwW0k4MzBfVEVYUkVHX1RNMFMwXSA9IDA7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTMV0gPSAwOwotICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzJdID0gMDsKLSAgIHQtPlNldHVwW0k4MzBfVEVYUkVHX1RNMFMzXSA9IDA7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19NQ1NdID0gKF8zRFNUQVRFX01BUF9DT09SRF9TRVRfQ01EIHwKLQkJCQlNQVBfVU5JVCgwKSB8Ci0JCQkJRU5BQkxFX1RFWENPT1JEX1BBUkFNUyB8Ci0JCQkJVEVYQ09PUkRTX0FSRV9OT1JNQUwgfAotCQkJCVRFWENPT1JEVFlQRV9DQVJURVNJQU4gfAotCQkJCUVOQUJMRV9BRERSX1ZfQ05UTCB8Ci0JCQkJVEVYQ09PUkRfQUREUl9WX01PREUoVEVYQ09PUkRNT0RFX1dSQVApIHwKLQkJCQlFTkFCTEVfQUREUl9VX0NOVEwgfAotCQkJCVRFWENPT1JEX0FERFJfVV9NT0RFKFRFWENPT1JETU9ERV9XUkFQKSk7Ci0KLSAgIAotICAgaTgzMFNldFRleFdyYXBwaW5nKCB0LCB0ZXhPYmotPldyYXBTLCB0ZXhPYmotPldyYXBUICk7Ci0gICBpODMwU2V0VGV4RmlsdGVyKCB0LCB0ZXhPYmotPk1pbkZpbHRlciwgdGV4T2JqLT5NYWdGaWx0ZXIsIAotCQkgICAgIHRleE9iai0+TWF4QW5pc290cm9weSApOwotICAgaTgzMFNldFRleEJvcmRlckNvbG9yKCB0LCB0ZXhPYmotPl9Cb3JkZXJDaGFuICk7Ci0KLSAgIHJldHVybiAmdC0+aW50ZWw7Ci19Ci0KLQotc3RhdGljIHZvaWQgaTgzMFRleFBhcmFtZXRlciggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCi0JCQkgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmosCi0JCQkgICAgICBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi17Ci0gICBpODMwVGV4dHVyZU9iamVjdFB0ciB0ID0gKGk4MzBUZXh0dXJlT2JqZWN0UHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwotICAgaWYgKCF0KQotICAgICAgcmV0dXJuOwogCiAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgotICAgY2FzZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDoKLSAgICAgIGk4MzBTZXRUZXhGaWx0ZXIoIHQsIHRPYmotPk1pbkZpbHRlciwgdE9iai0+TWFnRmlsdGVyLAotCQkJdE9iai0+TWF4QW5pc290cm9weSk7Ci0gICAgICBicmVhazsKLQotICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKLSAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6Ci0gICAgICBpODMwU2V0VGV4V3JhcHBpbmcoIHQsIHRPYmotPldyYXBTLCB0T2JqLT5XcmFwVCApOwotICAgICAgYnJlYWs7Ci0gIAotICAgY2FzZSBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUjoKLSAgICAgIGk4MzBTZXRUZXhCb3JkZXJDb2xvciggdCwgdE9iai0+X0JvcmRlckNoYW4gKTsKLSAgICAgIGJyZWFrOwotCi0gICBjYXNlIEdMX1RFWFRVUkVfQkFTRV9MRVZFTDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9NQVhfTEVWRUw6Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUlOX0xPRDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9NQVhfTE9EOgotICAgICAgLyogVGhlIGk4MzAgYW5kIGl0cyBzdWNjZXNzb3JzIGNhbiBkbyBhIGxvdCBvZiB0aGlzIHdpdGhvdXQKLSAgICAgICAqIHJlbG9hZGluZyB0aGUgdGV4dHVyZXMuICBBIHByb2plY3QgZm9yIHNvbWVvbmU/Ci0gICAgICAgKi8KLSAgICAgIGludGVsRmx1c2goIGN0eCApOwotICAgICAgZHJpU3dhcE91dFRleHR1cmVPYmplY3QoIChkcmlUZXh0dXJlT2JqZWN0ICopIHQgKTsKLSAgICAgIGJyZWFrOwotCi0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICAgfQotCi0gICB0LT5pbnRlbC5kaXJ0eSA9IEk4MzBfVVBMT0FEX1RFWF9BTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQgaTgzMFRleEVudiggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIAotCQkJR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSApCi17Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKCBjdHggKTsKLSAgIEdMdWludCB1bml0ID0gY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0OwotCi0gICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOiAKLSNpZiAwCi0gICB7Ci0gICAgICBHTHVieXRlIHIsIGcsIGIsIGE7Ci0gICAgICBHTHVpbnQgY29sOwotICAgICAgCi0gICAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUociwgcGFyYW1bUkNPTVBdKTsKLSAgICAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShnLCBwYXJhbVtHQ09NUF0pOwotICAgICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGIsIHBhcmFtW0JDT01QXSk7Ci0gICAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoYSwgcGFyYW1bQUNPTVBdKTsKLQotICAgICAgY29sID0gKChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYik7Ci0KLSAgICAgIGlmIChjb2wgIT0gaTgzMC0+c3RhdGUuVGV4RW52W3VuaXRdW0k4MzBfVEVYRU5WUkVHX0NPTDFdKSB7Ci0JIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfVEVYRU5WKTsKLQkgaTgzMC0+c3RhdGUuVGV4RW52W3VuaXRdW0k4MzBfVEVYRU5WUkVHX0NPTDFdID0gY29sOwotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgIH0KLSNlbmRpZgorICAgY2FzZSBHTF9URVhUVVJFX0VOVl9DT0xPUjoKICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKICAgIGNhc2UgR0xfQ09NQklORV9SR0I6CiAgICBjYXNlIEdMX0NPTUJJTkVfQUxQSEE6CkBAIC0zMTksMzggKzcxLDMyIEBACiAgICBjYXNlIEdMX0FMUEhBX1NDQUxFOgogICAgICAgYnJlYWs7CiAKLSAgIGNhc2UgR0xfVEVYVFVSRV9MT0RfQklBUzogewotICAgICAgaW50IGIgPSAoaW50KSAoKCpwYXJhbSkgKiAxNi4wKTsKLSAgICAgIGlmIChiID4gNjMpIGIgPSA2MzsKLSAgICAgIGlmIChiIDwgLTY0KSBiID0gLTY0OwotICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9URVgodW5pdCkpOwotICAgICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX1RNMFMzXSAmPSB+VE0wUzNfTE9EX0JJQVNfTUFTSzsKLSAgICAgIGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19UTTBTM10gfD0gCi0JICgoYiA8PCBUTTBTM19MT0RfQklBU19TSElGVCkgJiBUTTBTM19MT0RfQklBU19NQVNLKTsKLSAgICAgIGJyZWFrOwotICAgfQorICAgY2FzZSBHTF9URVhUVVJFX0xPRF9CSUFTOnsKKyAgICAgICAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKKyAgICAgICAgIEdMdWludCB1bml0ID0gY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0OworICAgICAgICAgaW50IGIgPSAoaW50KSAoKCpwYXJhbSkgKiAxNi4wKTsKKyAgICAgICAgIGlmIChiID4gNjMpCisgICAgICAgICAgICBiID0gNjM7CisgICAgICAgICBpZiAoYiA8IC02NCkKKyAgICAgICAgICAgIGIgPSAtNjQ7CisgICAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWCh1bml0KSk7CisgICAgICAgICBpODMwLT5sb2RiaWFzX3RtMHMzW3VuaXRdID0KKyAgICAgICAgICAgICgoYiA8PCBUTTBTM19MT0RfQklBU19TSElGVCkgJiBUTTBTM19MT0RfQklBU19NQVNLKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQogCiAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBCaW5kVGV4dHVyZSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogKQorCisKKwordm9pZAoraTgzMEluaXRUZXh0dXJlRnVuY3Moc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMpCiB7Ci0gICBpODMwVGV4dHVyZU9iamVjdFB0ciB0ZXg7Ci0gICAKLSAgIGlmICghdGV4T2JqLT5Ecml2ZXJEYXRhKQotICAgICAgaTgzMEFsbG9jVGV4T2JqKCB0ZXhPYmogKTsKLSAgIAotICAgdGV4ID0gKGk4MzBUZXh0dXJlT2JqZWN0UHRyKXRleE9iai0+RHJpdmVyRGF0YTsKLX0KLQotCi0KLXZvaWQgaTgzMEluaXRUZXh0dXJlRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLSAgIGZ1bmN0aW9ucy0+QmluZFRleHR1cmUgCQk9IGk4MzBCaW5kVGV4dHVyZTsKLSAgIGZ1bmN0aW9ucy0+VGV4RW52ICAgICAgICAgICAgICAgICAgICA9IGk4MzBUZXhFbnY7Ci0gICBmdW5jdGlvbnMtPlRleFBhcmFtZXRlciAgICAgICAgICAgICAgPSBpODMwVGV4UGFyYW1ldGVyOworLyoKKyAgIGZ1bmN0aW9ucy0+VGV4RW52ID0gaTgzMFRleEVudjsKKyovCiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfdGV4YmxlbmQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhibGVuZC5jCmluZGV4IDQ5ZTAzNDcuLjU4ZjIyMGUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhibGVuZC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhibGVuZC5jCkBAIC00Niw0NiArNDYsNDIgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFRleHR1cmUgY29tYmluZSBmdW5jdGlvbnMKICAqLwotc3RhdGljIEdMdWludCBwYXNzX3Rocm91Z2goIEdMdWludCAqc3RhdGUsIEdMdWludCBibGVuZFVuaXQgKQorc3RhdGljIEdMdWludAorcGFzc190aHJvdWdoKEdMdWludCAqIHN0YXRlLCBHTHVpbnQgYmxlbmRVbml0KQogewogICAgc3RhdGVbMF0gPSAoXzNEU1RBVEVfTUFQX0JMRU5EX09QX0NNRChibGVuZFVuaXQpIHwKLQkgICAgICAgVEVYUElQRV9DT0xPUiB8Ci0JICAgICAgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8Ci0JICAgICAgIFRFWE9QX09VVFBVVF9DVVJSRU5UIHwKLQkgICAgICAgRElTQUJMRV9URVhfQ05UUkxfU1RBR0UgfAotCSAgICAgICBURVhPUF9TQ0FMRV8xWCB8Ci0JICAgICAgIFRFWE9QX01PRElGWV9QQVJNUyB8Ci0JICAgICAgIFRFWEJMRU5ET1BfQVJHMSk7CisgICAgICAgICAgICAgICBURVhQSVBFX0NPTE9SIHwKKyAgICAgICAgICAgICAgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8CisgICAgICAgICAgICAgICBURVhPUF9PVVRQVVRfQ1VSUkVOVCB8CisgICAgICAgICAgICAgICBESVNBQkxFX1RFWF9DTlRSTF9TVEFHRSB8CisgICAgICAgICAgICAgICBURVhPUF9TQ0FMRV8xWCB8IFRFWE9QX01PRElGWV9QQVJNUyB8IFRFWEJMRU5ET1BfQVJHMSk7CiAgICBzdGF0ZVsxXSA9IChfM0RTVEFURV9NQVBfQkxFTkRfT1BfQ01EKGJsZW5kVW5pdCkgfAotCSAgICAgICBURVhQSVBFX0FMUEhBIHwKLQkgICAgICAgRU5BQkxFX1RFWE9VVFBVVF9XUlRfU0VMIHwKLQkgICAgICAgVEVYT1BfT1VUUFVUX0NVUlJFTlQgfAotCSAgICAgICBURVhPUF9TQ0FMRV8xWCB8Ci0JICAgICAgIFRFWE9QX01PRElGWV9QQVJNUyB8Ci0JICAgICAgIFRFWEJMRU5ET1BfQVJHMSk7CisgICAgICAgICAgICAgICBURVhQSVBFX0FMUEhBIHwKKyAgICAgICAgICAgICAgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8CisgICAgICAgICAgICAgICBURVhPUF9PVVRQVVRfQ1VSUkVOVCB8CisgICAgICAgICAgICAgICBURVhPUF9TQ0FMRV8xWCB8IFRFWE9QX01PRElGWV9QQVJNUyB8IFRFWEJMRU5ET1BfQVJHMSk7CiAgICBzdGF0ZVsyXSA9IChfM0RTVEFURV9NQVBfQkxFTkRfQVJHX0NNRChibGVuZFVuaXQpIHwKLQkgICAgICAgVEVYUElQRV9DT0xPUiB8Ci0JICAgICAgIFRFWEJMRU5EX0FSRzEgfAotCSAgICAgICBURVhCTEVOREFSR19NT0RJRllfUEFSTVMgfAotCSAgICAgICBURVhCTEVOREFSR19DVVJSRU5UKTsKKyAgICAgICAgICAgICAgIFRFWFBJUEVfQ09MT1IgfAorICAgICAgICAgICAgICAgVEVYQkxFTkRfQVJHMSB8CisgICAgICAgICAgICAgICBURVhCTEVOREFSR19NT0RJRllfUEFSTVMgfCBURVhCTEVOREFSR19DVVJSRU5UKTsKICAgIHN0YXRlWzNdID0gKF8zRFNUQVRFX01BUF9CTEVORF9BUkdfQ01EKGJsZW5kVW5pdCkgfAotCSAgICAgICBURVhQSVBFX0FMUEhBIHwKLQkgICAgICAgVEVYQkxFTkRfQVJHMSB8Ci0JICAgICAgIFRFWEJMRU5EQVJHX01PRElGWV9QQVJNUyB8Ci0JICAgICAgIFRFWEJMRU5EQVJHX0NVUlJFTlQpOworICAgICAgICAgICAgICAgVEVYUElQRV9BTFBIQSB8CisgICAgICAgICAgICAgICBURVhCTEVORF9BUkcxIHwKKyAgICAgICAgICAgICAgIFRFWEJMRU5EQVJHX01PRElGWV9QQVJNUyB8IFRFWEJMRU5EQVJHX0NVUlJFTlQpOwogCiAgICByZXR1cm4gNDsKIH0KIAotc3RhdGljIEdMdWludCBlbWl0X2ZhY3RvciggR0x1aW50IGJsZW5kVW5pdCwgR0x1aW50ICpzdGF0ZSwgR0x1aW50IGNvdW50LCAKLQkJCSAgIGNvbnN0IEdMZmxvYXQgKmZhY3RvciApCitzdGF0aWMgR0x1aW50CitlbWl0X2ZhY3RvcihHTHVpbnQgYmxlbmRVbml0LCBHTHVpbnQgKiBzdGF0ZSwgR0x1aW50IGNvdW50LAorICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqIGZhY3RvcikKIHsKICAgIEdMdWJ5dGUgciwgZywgYiwgYTsKICAgIEdMdWludCBjb2w7Ci0gICAgICAKKwogICAgaWYgKDApCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVtaXQgY29uc3RhbnQgJWQ6ICUuMmYgJS4yZiAlLjJmICUuMmZcbiIsCi0JICBibGVuZFVuaXQsIGZhY3RvclswXSwgZmFjdG9yWzFdLCBmYWN0b3JbMl0sIGZhY3RvclszXSk7CisgICAgICAgICAgICAgIGJsZW5kVW5pdCwgZmFjdG9yWzBdLCBmYWN0b3JbMV0sIGZhY3RvclsyXSwgZmFjdG9yWzNdKTsKIAogICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKHIsIGZhY3RvclswXSk7CiAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoZywgZmFjdG9yWzFdKTsKQEAgLTk0LDIxICs5MCwyNyBAQAogCiAgICBjb2wgPSAoKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKIAotICAgc3RhdGVbY291bnQrK10gPSBfM0RTVEFURV9DT0xPUl9GQUNUT1JfTl9DTUQoYmxlbmRVbml0KTsgCisgICBzdGF0ZVtjb3VudCsrXSA9IF8zRFNUQVRFX0NPTE9SX0ZBQ1RPUl9OX0NNRChibGVuZFVuaXQpOwogICAgc3RhdGVbY291bnQrK10gPSBjb2w7CiAKICAgIHJldHVybiBjb3VudDsKIH0KIAogCi1zdGF0aWMgX19pbmxpbmVfXyBHTHVpbnQgR2V0VGV4ZWxPcChHTGludCB1bml0KQorc3RhdGljIElOTElORSBHTHVpbnQKK0dldFRleGVsT3AoR0xpbnQgdW5pdCkKIHsKLSAgIHN3aXRjaCh1bml0KSB7Ci0gICBjYXNlIDA6IHJldHVybiBURVhCTEVOREFSR19URVhFTDA7Ci0gICBjYXNlIDE6IHJldHVybiBURVhCTEVOREFSR19URVhFTDE7Ci0gICBjYXNlIDI6IHJldHVybiBURVhCTEVOREFSR19URVhFTDI7Ci0gICBjYXNlIDM6IHJldHVybiBURVhCTEVOREFSR19URVhFTDM7Ci0gICBkZWZhdWx0OiByZXR1cm4gVEVYQkxFTkRBUkdfVEVYRUwwOworICAgc3dpdGNoICh1bml0KSB7CisgICBjYXNlIDA6CisgICAgICByZXR1cm4gVEVYQkxFTkRBUkdfVEVYRUwwOworICAgY2FzZSAxOgorICAgICAgcmV0dXJuIFRFWEJMRU5EQVJHX1RFWEVMMTsKKyAgIGNhc2UgMjoKKyAgICAgIHJldHVybiBURVhCTEVOREFSR19URVhFTDI7CisgICBjYXNlIDM6CisgICAgICByZXR1cm4gVEVYQkxFTkRBUkdfVEVYRUwzOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBURVhCTEVOREFSR19URVhFTDA7CiAgICB9CiB9CiAKQEAgLTEzMiwxMiArMTM0LDEwIEBACiAgKiBwYXJ0aWFsIHN1cHBvcnQgZm9yIHRoZSBleHRlbnNpb24/CiAgKi8KIEdMdWludAotaTgzMFNldFRleEVudkNvbWJpbmUoaTgzMENvbnRleHRQdHIgaTgzMCwKLQkJICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4X2Vudl9jb21iaW5lX3N0YXRlICogY29tYmluZSwKLQkJICAgICBHTGludCBibGVuZFVuaXQsCi0JCSAgICAgR0x1aW50IHRleGVsX29wLAotCQkgICAgIEdMdWludCAqc3RhdGUsCi0JCSAgICAgY29uc3QgR0xmbG9hdCAqZmFjdG9yICkKK2k4MzBTZXRUZXhFbnZDb21iaW5lKHN0cnVjdCBpODMwX2NvbnRleHQgKiBpODMwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleF9lbnZfY29tYmluZV9zdGF0ZSAqIGNvbWJpbmUsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBibGVuZFVuaXQsCisgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgdGV4ZWxfb3AsIEdMdWludCAqIHN0YXRlLCBjb25zdCBHTGZsb2F0ICogZmFjdG9yKQogewogICAgY29uc3QgR0x1aW50IG51bUNvbG9yQXJncyA9IGNvbWJpbmUtPl9OdW1BcmdzUkdCOwogICAgY29uc3QgR0x1aW50IG51bUFscGhhQXJncyA9IGNvbWJpbmUtPl9OdW1BcmdzQTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgVEVYUElQRV9BTFBIQSB8IFRFWEJMRU5EX0FSRzAgfCBURVhCTEVOREFSR19NT0RJRllfUEFSTVMsCiAgICB9OwogCi0gICBpZihJTlRFTF9ERUJVRyZERUJVR19URVhUVVJFKQorICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIApAQCAtMTg4LDIzICsxODgsMjMgQEAKICAgIH0KIAogCi0gICBzd2l0Y2goY29tYmluZS0+TW9kZVJHQikgewotICAgY2FzZSBHTF9SRVBMQUNFOiAKKyAgIHN3aXRjaCAoY29tYmluZS0+TW9kZVJHQikgeworICAgY2FzZSBHTF9SRVBMQUNFOgogICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfQVJHMTsKICAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NT0RVTEFURTogCisgICBjYXNlIEdMX01PRFVMQVRFOgogICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfTU9EVUxBVEU7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfQUREOiAKKyAgIGNhc2UgR0xfQUREOgogICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfQUREOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0FERF9TSUdORUQ6Ci0gICAgICBibGVuZG9wID0gVEVYQkxFTkRPUF9BRERTSUdORUQ7IAorICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfQUREU0lHTkVEOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0lOVEVSUE9MQVRFOgotICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfQkxFTkQ7IAorICAgICAgYmxlbmRvcCA9IFRFWEJMRU5ET1BfQkxFTkQ7CiAgICAgICBicmVhazsKLSAgIGNhc2UgR0xfU1VCVFJBQ1Q6IAorICAgY2FzZSBHTF9TVUJUUkFDVDoKICAgICAgIGJsZW5kb3AgPSBURVhCTEVORE9QX1NVQlRSQUNUOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0RPVDNfUkdCX0VYVDoKQEAgLTIxNSw1NSArMjE1LDU0IEBACiAgICBjYXNlIEdMX0RPVDNfUkdCQToKICAgICAgIGJsZW5kb3AgPSBURVhCTEVORE9QX0RPVDM7CiAgICAgICBicmVhazsKLSAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIHBhc3NfdGhyb3VnaCggc3RhdGUsIGJsZW5kVW5pdCApOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBwYXNzX3Rocm91Z2goc3RhdGUsIGJsZW5kVW5pdCk7CiAgICB9CiAKICAgIGJsZW5kb3AgfD0gKHJnYl9zaGlmdCA8PCBURVhPUF9TQ0FMRV9TSElGVCk7CiAKIAogICAgLyogSGFuZGxlIFJHQiBhcmdzICovCi0gICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgIHN3aXRjaChjb21iaW5lLT5Tb3VyY2VSR0JbaV0pIHsKLSAgICAgIGNhc2UgR0xfVEVYVFVSRTogCi0JIGFyZ3NfUkdCW2ldID0gdGV4ZWxfb3A7Ci0JIGJyZWFrOworICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgc3dpdGNoIChjb21iaW5lLT5Tb3VyY2VSR0JbaV0pIHsKKyAgICAgIGNhc2UgR0xfVEVYVFVSRToKKyAgICAgICAgIGFyZ3NfUkdCW2ldID0gdGV4ZWxfb3A7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfVEVYVFVSRTA6CiAgICAgICBjYXNlIEdMX1RFWFRVUkUxOgogICAgICAgY2FzZSBHTF9URVhUVVJFMjoKICAgICAgIGNhc2UgR0xfVEVYVFVSRTM6Ci0JIGFyZ3NfUkdCW2ldID0gR2V0VGV4ZWxPcCggY29tYmluZS0+U291cmNlUkdCW2ldIC0gR0xfVEVYVFVSRTAgKTsKLQkgYnJlYWs7CisgICAgICAgICBhcmdzX1JHQltpXSA9IEdldFRleGVsT3AoY29tYmluZS0+U291cmNlUkdCW2ldIC0gR0xfVEVYVFVSRTApOworICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX0NPTlNUQU5UOgotCSBhcmdzX1JHQltpXSA9IFRFWEJMRU5EQVJHX0ZBQ1RPUl9OOyAKLQkgbmVlZF9mYWN0b3IgPSAxOwotCSBicmVhazsKKyAgICAgICAgIGFyZ3NfUkdCW2ldID0gVEVYQkxFTkRBUkdfRkFDVE9SX047CisgICAgICAgICBuZWVkX2ZhY3RvciA9IDE7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfUFJJTUFSWV9DT0xPUjoKLQkgYXJnc19SR0JbaV0gPSBURVhCTEVOREFSR19ESUZGVVNFOwotCSBicmVhazsKKyAgICAgICAgIGFyZ3NfUkdCW2ldID0gVEVYQkxFTkRBUkdfRElGRlVTRTsKKyAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBHTF9QUkVWSU9VUzoKLQkgYXJnc19SR0JbaV0gPSBURVhCTEVOREFSR19DVVJSRU5UOyAKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAKLQkgcmV0dXJuIHBhc3NfdGhyb3VnaCggc3RhdGUsIGJsZW5kVW5pdCApOworICAgICAgICAgYXJnc19SR0JbaV0gPSBURVhCTEVOREFSR19DVVJSRU5UOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIHBhc3NfdGhyb3VnaChzdGF0ZSwgYmxlbmRVbml0KTsKICAgICAgIH0KIAotICAgICAgc3dpdGNoKGNvbWJpbmUtPk9wZXJhbmRSR0JbaV0pIHsKLSAgICAgIGNhc2UgR0xfU1JDX0NPTE9SOiAKLQkgYXJnc19SR0JbaV0gfD0gMDsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IAotCSBhcmdzX1JHQltpXSB8PSBURVhCTEVOREFSR19JTlZfQVJHOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiAKLQkgYXJnc19SR0JbaV0gfD0gVEVYQkxFTkRBUkdfUkVQTElDQVRFX0FMUEhBOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQTogCi0JIGFyZ3NfUkdCW2ldIHw9IChURVhCTEVOREFSR19SRVBMSUNBVEVfQUxQSEEgfCAKLQkJCSBURVhCTEVOREFSR19JTlZfQVJHKTsKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAKLQkgcmV0dXJuIHBhc3NfdGhyb3VnaCggc3RhdGUsIGJsZW5kVW5pdCApOworICAgICAgc3dpdGNoIChjb21iaW5lLT5PcGVyYW5kUkdCW2ldKSB7CisgICAgICBjYXNlIEdMX1NSQ19DT0xPUjoKKyAgICAgICAgIGFyZ3NfUkdCW2ldIHw9IDA7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgIGFyZ3NfUkdCW2ldIHw9IFRFWEJMRU5EQVJHX0lOVl9BUkc7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOgorICAgICAgICAgYXJnc19SR0JbaV0gfD0gVEVYQkxFTkRBUkdfUkVQTElDQVRFX0FMUEhBOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgICBhcmdzX1JHQltpXSB8PSAoVEVYQkxFTkRBUkdfUkVQTElDQVRFX0FMUEhBIHwgVEVYQkxFTkRBUkdfSU5WX0FSRyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gcGFzc190aHJvdWdoKHN0YXRlLCBibGVuZFVuaXQpOwogICAgICAgfQogICAgfQogCkBAIC0yNzUsNzYgKzI3NCw3NiBAQAogICAgICogTm90ZSAtIHRoZSBnbG9iYWwgZmFjdG9yIGlzIHNldCB1cCB3aXRoIGFscGhhID09IC41LCBzbyAKICAgICAqIHRoZSBhbHBoYSBwYXJ0IG9mIHRoZSBET1Q0IGNhbGN1bGF0aW9uIHNob3VsZCBiZSB6ZXJvLgogICAgICovCi0gICBpZiAoIGNvbWJpbmUtPk1vZGVSR0IgPT0gR0xfRE9UM19SR0JBX0VYVCB8fCAKLQljb21iaW5lLT5Nb2RlUkdCID09IEdMX0RPVDNfUkdCQSApIHsKKyAgIGlmIChjb21iaW5lLT5Nb2RlUkdCID09IEdMX0RPVDNfUkdCQV9FWFQgfHwKKyAgICAgICBjb21iaW5lLT5Nb2RlUkdCID09IEdMX0RPVDNfUkdCQSkgewogICAgICAgYWJsZW5kb3AgPSBURVhCTEVORE9QX0RPVDQ7Ci0gICAgICBhcmdzX0FbMF0gPSBURVhCTEVOREFSR19GQUNUT1I7IC8qIHRoZSBnbG9iYWwgZmFjdG9yICovCisgICAgICBhcmdzX0FbMF0gPSBURVhCTEVOREFSR19GQUNUT1I7ICAgLyogdGhlIGdsb2JhbCBmYWN0b3IgKi8KICAgICAgIGFyZ3NfQVsxXSA9IFRFWEJMRU5EQVJHX0ZBQ1RPUjsKICAgICAgIGFyZ3NfQVsyXSA9IFRFWEJMRU5EQVJHX0ZBQ1RPUjsKICAgIH0KICAgIGVsc2UgewotICAgICAgc3dpdGNoKGNvbWJpbmUtPk1vZGVBKSB7Ci0gICAgICBjYXNlIEdMX1JFUExBQ0U6IAotCSBhYmxlbmRvcCA9IFRFWEJMRU5ET1BfQVJHMTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX01PRFVMQVRFOiAKLQkgYWJsZW5kb3AgPSBURVhCTEVORE9QX01PRFVMQVRFOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfQUREOiAKLQkgYWJsZW5kb3AgPSBURVhCTEVORE9QX0FERDsKLQkgYnJlYWs7CisgICAgICBzd2l0Y2ggKGNvbWJpbmUtPk1vZGVBKSB7CisgICAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICAgICBhYmxlbmRvcCA9IFRFWEJMRU5ET1BfQVJHMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9NT0RVTEFURToKKyAgICAgICAgIGFibGVuZG9wID0gVEVYQkxFTkRPUF9NT0RVTEFURTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9BREQ6CisgICAgICAgICBhYmxlbmRvcCA9IFRFWEJMRU5ET1BfQUREOworICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX0FERF9TSUdORUQ6Ci0JIGFibGVuZG9wID0gVEVYQkxFTkRPUF9BRERTSUdORUQ7IAotCSBicmVhazsKKyAgICAgICAgIGFibGVuZG9wID0gVEVYQkxFTkRPUF9BRERTSUdORUQ7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfSU5URVJQT0xBVEU6Ci0JIGFibGVuZG9wID0gVEVYQkxFTkRPUF9CTEVORDsgCi0JIGJyZWFrOwotICAgICAgY2FzZSBHTF9TVUJUUkFDVDogCi0JIGFibGVuZG9wID0gVEVYQkxFTkRPUF9TVUJUUkFDVDsKLQkgYnJlYWs7CisgICAgICAgICBhYmxlbmRvcCA9IFRFWEJMRU5ET1BfQkxFTkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfU1VCVFJBQ1Q6CisgICAgICAgICBhYmxlbmRvcCA9IFRFWEJMRU5ET1BfU1VCVFJBQ1Q7CisgICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6Ci0JIHJldHVybiBwYXNzX3Rocm91Z2goIHN0YXRlLCBibGVuZFVuaXQgKTsKKyAgICAgICAgIHJldHVybiBwYXNzX3Rocm91Z2goc3RhdGUsIGJsZW5kVW5pdCk7CiAgICAgICB9CiAKIAogICAgICAgYWJsZW5kb3AgfD0gKGFscGhhX3NoaWZ0IDw8IFRFWE9QX1NDQUxFX1NISUZUKTsKIAogICAgICAgLyogSGFuZGxlIEEgYXJncyAqLwotICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JIHN3aXRjaChjb21iaW5lLT5Tb3VyY2VBW2ldKSB7Ci0JIGNhc2UgR0xfVEVYVFVSRTogCi0JICAgIGFyZ3NfQVtpXSA9IHRleGVsX29wOwotCSAgICBicmVhazsKLQkgY2FzZSBHTF9URVhUVVJFMDoKLQkgY2FzZSBHTF9URVhUVVJFMToKLQkgY2FzZSBHTF9URVhUVVJFMjoKLQkgY2FzZSBHTF9URVhUVVJFMzoKLQkgICAgYXJnc19BW2ldID0gR2V0VGV4ZWxPcCggY29tYmluZS0+U291cmNlQVtpXSAtIEdMX1RFWFRVUkUwICk7Ci0JICAgIGJyZWFrOwotCSBjYXNlIEdMX0NPTlNUQU5UOgotCSAgICBhcmdzX0FbaV0gPSBURVhCTEVOREFSR19GQUNUT1JfTjsgCi0JICAgIG5lZWRfZmFjdG9yID0gMTsKLQkgICAgYnJlYWs7Ci0JIGNhc2UgR0xfUFJJTUFSWV9DT0xPUjoKLQkgICAgYXJnc19BW2ldID0gVEVYQkxFTkRBUkdfRElGRlVTRTsgCi0JICAgIGJyZWFrOwotCSBjYXNlIEdMX1BSRVZJT1VTOgotCSAgICBhcmdzX0FbaV0gPSBURVhCTEVOREFSR19DVVJSRU5UOyAKLQkgICAgYnJlYWs7Ci0JIGRlZmF1bHQ6IAotCSAgICByZXR1cm4gcGFzc190aHJvdWdoKCBzdGF0ZSwgYmxlbmRVbml0ICk7Ci0JIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIHN3aXRjaCAoY29tYmluZS0+U291cmNlQVtpXSkgeworICAgICAgICAgY2FzZSBHTF9URVhUVVJFOgorICAgICAgICAgICAgYXJnc19BW2ldID0gdGV4ZWxfb3A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgR0xfVEVYVFVSRTA6CisgICAgICAgICBjYXNlIEdMX1RFWFRVUkUxOgorICAgICAgICAgY2FzZSBHTF9URVhUVVJFMjoKKyAgICAgICAgIGNhc2UgR0xfVEVYVFVSRTM6CisgICAgICAgICAgICBhcmdzX0FbaV0gPSBHZXRUZXhlbE9wKGNvbWJpbmUtPlNvdXJjZUFbaV0gLSBHTF9URVhUVVJFMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlQ6CisgICAgICAgICAgICBhcmdzX0FbaV0gPSBURVhCTEVOREFSR19GQUNUT1JfTjsKKyAgICAgICAgICAgIG5lZWRfZmFjdG9yID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBHTF9QUklNQVJZX0NPTE9SOgorICAgICAgICAgICAgYXJnc19BW2ldID0gVEVYQkxFTkRBUkdfRElGRlVTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBHTF9QUkVWSU9VUzoKKyAgICAgICAgICAgIGFyZ3NfQVtpXSA9IFRFWEJMRU5EQVJHX0NVUlJFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gcGFzc190aHJvdWdoKHN0YXRlLCBibGVuZFVuaXQpOworICAgICAgICAgfQogCi0JIHN3aXRjaChjb21iaW5lLT5PcGVyYW5kQVtpXSkgewotCSBjYXNlIEdMX1NSQ19BTFBIQTogCi0JICAgIGFyZ3NfQVtpXSB8PSAwOwotCSAgICBicmVhazsKLQkgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiAKLQkgICAgYXJnc19BW2ldIHw9IFRFWEJMRU5EQVJHX0lOVl9BUkc7Ci0JICAgIGJyZWFrOwotCSBkZWZhdWx0OiAKLQkgICAgcmV0dXJuIHBhc3NfdGhyb3VnaCggc3RhdGUsIGJsZW5kVW5pdCApOwotCSB9CisgICAgICAgICBzd2l0Y2ggKGNvbWJpbmUtPk9wZXJhbmRBW2ldKSB7CisgICAgICAgICBjYXNlIEdMX1NSQ19BTFBIQToKKyAgICAgICAgICAgIGFyZ3NfQVtpXSB8PSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgICAgICBhcmdzX0FbaV0gfD0gVEVYQkxFTkRBUkdfSU5WX0FSRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBwYXNzX3Rocm91Z2goc3RhdGUsIGJsZW5kVW5pdCk7CisgICAgICAgICB9CiAgICAgICB9CiAgICB9CiAKQEAgLTM2Myw4NiArMzYyLDg2IEBACiAKICAgIHVzZWQgPSAwOwogICAgc3RhdGVbdXNlZCsrXSA9IChfM0RTVEFURV9NQVBfQkxFTkRfT1BfQ01EKGJsZW5kVW5pdCkgfAotCQkgICAgVEVYUElQRV9DT0xPUiB8Ci0JCSAgICBFTkFCTEVfVEVYT1VUUFVUX1dSVF9TRUwgfAotCQkgICAgVEVYT1BfT1VUUFVUX0NVUlJFTlQgfAotCQkgICAgRElTQUJMRV9URVhfQ05UUkxfU1RBR0UgfAotCQkgICAgVEVYT1BfTU9ESUZZX1BBUk1TIHwKLQkJICAgIGJsZW5kb3ApOworICAgICAgICAgICAgICAgICAgICBURVhQSVBFX0NPTE9SIHwKKyAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1RFWE9VVFBVVF9XUlRfU0VMIHwKKyAgICAgICAgICAgICAgICAgICAgVEVYT1BfT1VUUFVUX0NVUlJFTlQgfAorICAgICAgICAgICAgICAgICAgICBESVNBQkxFX1RFWF9DTlRSTF9TVEFHRSB8IFRFWE9QX01PRElGWV9QQVJNUyB8IGJsZW5kb3ApOwogICAgc3RhdGVbdXNlZCsrXSA9IChfM0RTVEFURV9NQVBfQkxFTkRfT1BfQ01EKGJsZW5kVW5pdCkgfAotCQkgICAgVEVYUElQRV9BTFBIQSB8Ci0JCSAgICBFTkFCTEVfVEVYT1VUUFVUX1dSVF9TRUwgfAotCQkgICAgVEVYT1BfT1VUUFVUX0NVUlJFTlQgfAotCQkgICAgVEVYT1BfTU9ESUZZX1BBUk1TIHwKLQkJICAgIGFibGVuZG9wKTsKKyAgICAgICAgICAgICAgICAgICAgVEVYUElQRV9BTFBIQSB8CisgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9URVhPVVRQVVRfV1JUX1NFTCB8CisgICAgICAgICAgICAgICAgICAgIFRFWE9QX09VVFBVVF9DVVJSRU5UIHwgVEVYT1BfTU9ESUZZX1BBUk1TIHwgYWJsZW5kb3ApOwogCi0gICBmb3IgKCBpID0gMCA7IGkgPCBudW1Db2xvckFyZ3MgOyBpKysgKSB7CisgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29sb3JBcmdzOyBpKyspIHsKICAgICAgIHN0YXRlW3VzZWQrK10gPSAoXzNEU1RBVEVfTUFQX0JMRU5EX0FSR19DTUQoYmxlbmRVbml0KSB8Ci0JCSAgICAgICB0ZXhfYmxlbmRfcmdiW2ldIHwgYXJnc19SR0JbaV0pOworICAgICAgICAgICAgICAgICAgICAgICB0ZXhfYmxlbmRfcmdiW2ldIHwgYXJnc19SR0JbaV0pOwogICAgfQogCi0gICBmb3IgKCBpID0gMCA7IGkgPCBudW1BbHBoYUFyZ3MgOyBpKysgKSB7CisgICBmb3IgKGkgPSAwOyBpIDwgbnVtQWxwaGFBcmdzOyBpKyspIHsKICAgICAgIHN0YXRlW3VzZWQrK10gPSAoXzNEU1RBVEVfTUFQX0JMRU5EX0FSR19DTUQoYmxlbmRVbml0KSB8Ci0JCSAgICAgICB0ZXhfYmxlbmRfYVtpXSB8IGFyZ3NfQVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgIHRleF9ibGVuZF9hW2ldIHwgYXJnc19BW2ldKTsKICAgIH0KIAogCi0gICBpZiAobmVlZF9mYWN0b3IpIAotICAgICAgcmV0dXJuIGVtaXRfZmFjdG9yKCBibGVuZFVuaXQsIHN0YXRlLCB1c2VkLCBmYWN0b3IgKTsKLSAgIGVsc2UgCisgICBpZiAobmVlZF9mYWN0b3IpCisgICAgICByZXR1cm4gZW1pdF9mYWN0b3IoYmxlbmRVbml0LCBzdGF0ZSwgdXNlZCwgZmFjdG9yKTsKKyAgIGVsc2UKICAgICAgIHJldHVybiB1c2VkOwogfQogCiAKLXN0YXRpYyB2b2lkIGVtaXRfdGV4YmxlbmQoIGk4MzBDb250ZXh0UHRyIGk4MzAsIEdMdWludCB1bml0LCBHTHVpbnQgYmxlbmRVbml0LAotCQkJICAgR0xib29sZWFuIGxhc3Rfc3RhZ2UgKQorc3RhdGljIHZvaWQKK2VtaXRfdGV4YmxlbmQoc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCwgR0x1aW50IHVuaXQsIEdMdWludCBibGVuZFVuaXQsCisgICAgICAgICAgICAgIEdMYm9vbGVhbiBsYXN0X3N0YWdlKQogewogICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZpODMwLT5pbnRlbC5jdHguVGV4dHVyZS5Vbml0W3VuaXRdOwogICAgR0x1aW50IHRtcFtJODMwX1RFWEJMRU5EX1NJWkVdLCB0bXBfc3o7CiAKIAotICAgaWYgKDApIGZwcmludGYoc3RkZXJyLCAiJXMgdW5pdCAlZFxuIiwgX19GVU5DVElPTl9fLCB1bml0KTsKKyAgIGlmICgwKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyB1bml0ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHVuaXQpOwogCiAgICAvKiBVcGRhdGUgaTgzMC0+c3RhdGUuVGV4QmxlbmQKLSAgICAqLyAKLSAgIHRtcF9zeiA9IGk4MzBTZXRUZXhFbnZDb21iaW5lKGk4MzAsIHRleFVuaXQtPl9DdXJyZW50Q29tYmluZSwgYmxlbmRVbml0LCAKLQkJCQkgR2V0VGV4ZWxPcCh1bml0KSwgdG1wLAotCQkJCSB0ZXhVbml0LT5FbnZDb2xvciApOworICAgICovCisgICB0bXBfc3ogPSBpODMwU2V0VGV4RW52Q29tYmluZShpODMwLCB0ZXhVbml0LT5fQ3VycmVudENvbWJpbmUsIGJsZW5kVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRleGVsT3AodW5pdCksIHRtcCwgdGV4VW5pdC0+RW52Q29sb3IpOwogCi0gICBpZiAobGFzdF9zdGFnZSkgCisgICBpZiAobGFzdF9zdGFnZSkKICAgICAgIHRtcFswXSB8PSBURVhPUF9MQVNUX1NUQUdFOwogCiAgICBpZiAodG1wX3N6ICE9IGk4MzAtPnN0YXRlLlRleEJsZW5kV29yZHNVc2VkW2JsZW5kVW5pdF0gfHwKLSAgICAgICBtZW1jbXAoIHRtcCwgaTgzMC0+c3RhdGUuVGV4QmxlbmRbYmxlbmRVbml0XSwgdG1wX3N6ICogc2l6ZW9mKEdMdWludCkpKSB7Ci0gICAgICAKLSAgICAgIEk4MzBfU1RBVEVDSEFOR0UoIGk4MzAsIEk4MzBfVVBMT0FEX1RFWEJMRU5EKGJsZW5kVW5pdCkgKTsKLSAgICAgIG1lbWNweSggaTgzMC0+c3RhdGUuVGV4QmxlbmRbYmxlbmRVbml0XSwgdG1wLCB0bXBfc3ogKiBzaXplb2YoR0x1aW50KSk7CisgICAgICAgbWVtY21wKHRtcCwgaTgzMC0+c3RhdGUuVGV4QmxlbmRbYmxlbmRVbml0XSwKKyAgICAgICAgICAgICAgdG1wX3N6ICogc2l6ZW9mKEdMdWludCkpKSB7CisKKyAgICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfVEVYQkxFTkQoYmxlbmRVbml0KSk7CisgICAgICBtZW1jcHkoaTgzMC0+c3RhdGUuVGV4QmxlbmRbYmxlbmRVbml0XSwgdG1wLCB0bXBfc3ogKiBzaXplb2YoR0x1aW50KSk7CiAgICAgICBpODMwLT5zdGF0ZS5UZXhCbGVuZFdvcmRzVXNlZFtibGVuZFVuaXRdID0gdG1wX3N6OwogICAgfQogCiAgICBJODMwX0FDVElWRVNUQVRFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWEJMRU5EKGJsZW5kVW5pdCksIEdMX1RSVUUpOwogfQogCi1zdGF0aWMgdm9pZCBlbWl0X3Bhc3N0aHJvdWdoKCBpODMwQ29udGV4dFB0ciBpODMwICkKK3N0YXRpYyB2b2lkCitlbWl0X3Bhc3N0aHJvdWdoKHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzApCiB7CiAgICBHTHVpbnQgdG1wW0k4MzBfVEVYQkxFTkRfU0laRV0sIHRtcF9zejsKICAgIEdMdWludCB1bml0ID0gMDsKIAotICAgdG1wX3N6ID0gcGFzc190aHJvdWdoKCB0bXAsIHVuaXQgKTsKKyAgIHRtcF9zeiA9IHBhc3NfdGhyb3VnaCh0bXAsIHVuaXQpOwogICAgdG1wWzBdIHw9IFRFWE9QX0xBU1RfU1RBR0U7CiAKICAgIGlmICh0bXBfc3ogIT0gaTgzMC0+c3RhdGUuVGV4QmxlbmRXb3Jkc1VzZWRbdW5pdF0gfHwKLSAgICAgICBtZW1jbXAoIHRtcCwgaTgzMC0+c3RhdGUuVGV4QmxlbmRbdW5pdF0sIHRtcF9zeiAqIHNpemVvZihHTHVpbnQpKSkgewotICAgICAgCi0gICAgICBJODMwX1NUQVRFQ0hBTkdFKCBpODMwLCBJODMwX1VQTE9BRF9URVhCTEVORCh1bml0KSApOwotICAgICAgbWVtY3B5KCBpODMwLT5zdGF0ZS5UZXhCbGVuZFt1bml0XSwgdG1wLCB0bXBfc3ogKiBzaXplb2YoR0x1aW50KSk7CisgICAgICAgbWVtY21wKHRtcCwgaTgzMC0+c3RhdGUuVGV4QmxlbmRbdW5pdF0sIHRtcF9zeiAqIHNpemVvZihHTHVpbnQpKSkgeworCisgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWEJMRU5EKHVuaXQpKTsKKyAgICAgIG1lbWNweShpODMwLT5zdGF0ZS5UZXhCbGVuZFt1bml0XSwgdG1wLCB0bXBfc3ogKiBzaXplb2YoR0x1aW50KSk7CiAgICAgICBpODMwLT5zdGF0ZS5UZXhCbGVuZFdvcmRzVXNlZFt1bml0XSA9IHRtcF9zejsKICAgIH0KIAogICAgSTgzMF9BQ1RJVkVTVEFURShpODMwLCBJODMwX1VQTE9BRF9URVhCTEVORCh1bml0KSwgR0xfVFJVRSk7CiB9CiAKLXZvaWQgaTgzMEVtaXRUZXh0dXJlQmxlbmQoIGk4MzBDb250ZXh0UHRyIGk4MzAgKQordm9pZAoraTgzMEVtaXRUZXh0dXJlQmxlbmQoc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmk4MzAtPmludGVsLmN0eDsKICAgIEdMdWludCB1bml0LCBsYXN0X3N0YWdlID0gMCwgYmxlbmR1bml0ID0gMDsKQEAgLTQ1MCwxNiArNDQ5LDE1IEBACiAgICBJODMwX0FDVElWRVNUQVRFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWEJMRU5EX0FMTCwgR0xfRkFMU0UpOwogCiAgICBpZiAoY3R4LT5UZXh0dXJlLl9FbmFibGVkVW5pdHMpIHsKLSAgICAgIGZvciAodW5pdCA9IDAgOyB1bml0IDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHMgOyB1bml0KyspCi0JIGlmIChjdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fUmVhbGx5RW5hYmxlZCkgCi0JICAgIGxhc3Rfc3RhZ2UgPSB1bml0OworICAgICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1bml0KyspCisgICAgICAgICBpZiAoY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF0uX1JlYWxseUVuYWJsZWQpCisgICAgICAgICAgICBsYXN0X3N0YWdlID0gdW5pdDsKIAotICAgICAgZm9yICh1bml0ID0gMCA7IHVuaXQgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA7IHVuaXQrKykKLQkgaWYgKGN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdLl9SZWFsbHlFbmFibGVkKSAKLQkgICAgZW1pdF90ZXhibGVuZCggaTgzMCwgdW5pdCwgYmxlbmR1bml0KyssIGxhc3Rfc3RhZ2UgPT0gdW5pdCApOworICAgICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1bml0KyspCisgICAgICAgICBpZiAoY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF0uX1JlYWxseUVuYWJsZWQpCisgICAgICAgICAgICBlbWl0X3RleGJsZW5kKGk4MzAsIHVuaXQsIGJsZW5kdW5pdCsrLCBsYXN0X3N0YWdlID09IHVuaXQpOwogICAgfQogICAgZWxzZSB7Ci0gICAgICBlbWl0X3Bhc3N0aHJvdWdoKCBpODMwICk7CisgICAgICBlbWl0X3Bhc3N0aHJvdWdoKGk4MzApOwogICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfdGV4c3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhzdGF0ZS5jCmluZGV4IGJhOTcyZGEuLjRlOWIwMjIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhzdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF90ZXhzdGF0ZS5jCkBAIC0yNSw0NTkgKzI1LDMyNyBAQAogICogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgogI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgInNpbXBsZV9saXN0LmgiCiAjaW5jbHVkZSAiZW51bXMuaCIKICNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKLSNpbmNsdWRlICJ0ZXhzdG9yZS5oIgorI2luY2x1ZGUgImRyaV9idWZtZ3IuaCIKIAotI2luY2x1ZGUgIm1tLmgiCi0KLSNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKLSNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgorI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCiAjaW5jbHVkZSAiaW50ZWxfdGV4LmgiCiAKICNpbmNsdWRlICJpODMwX2NvbnRleHQuaCIKICNpbmNsdWRlICJpODMwX3JlZy5oIgogCi1zdGF0aWMgY29uc3QgR0xpbnQgaW5pdGlhbF9vZmZzZXRzWzZdWzJdID0geyB7MCwwfSwKLQkJCQkgICAgICAgezAsMn0sCi0JCQkJICAgICAgIHsxLDB9LAotCQkJCSAgICAgICB7MSwyfSwKLQkJCQkgICAgICAgezEsMX0sCi0JCQkJICAgICAgIHsxLDN9IH07CiAKLXN0YXRpYyBjb25zdCBHTGludCBzdGVwX29mZnNldHNbNl1bMl0gPSB7IHswLDJ9LAotCQkJCSAgICB7MCwyfSwKLQkJCQkgICAgey0xLDJ9LAotCQkJCSAgICB7LTEsMn0sCi0JCQkJICAgIHstMSwxfSwKLQkJCQkgICAgey0xLDF9IH07CiAKLSNkZWZpbmUgSTgzMF9URVhfVU5JVF9FTkFCTEVEKHVuaXQpCQkoMTw8dW5pdCkKLQotc3RhdGljIEdMYm9vbGVhbiBpODMwU2V0VGV4SW1hZ2VzKCBpODMwQ29udGV4dFB0ciBpODMwLCAKLQkJCQkgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiApCitzdGF0aWMgR0x1aW50Cit0cmFuc2xhdGVfdGV4dHVyZV9mb3JtYXQoR0x1aW50IG1lc2FfZm9ybWF0KQogewotICAgR0x1aW50IHRvdGFsX2hlaWdodCwgcGl0Y2gsIGksIHRleHR1cmVGb3JtYXQ7Ci0gICBpODMwVGV4dHVyZU9iamVjdFB0ciB0ID0gKGk4MzBUZXh0dXJlT2JqZWN0UHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwotICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmJhc2VJbWFnZSA9IHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF07Ci0gICBHTGludCBmaXJzdExldmVsLCBsYXN0TGV2ZWwsIG51bUxldmVsczsKLQotICAgc3dpdGNoKCBiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCApIHsKKyAgIHN3aXRjaCAobWVzYV9mb3JtYXQpIHsKICAgIGNhc2UgTUVTQV9GT1JNQVRfTDg6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMTsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzhCSVQgfCBNVF84QklUX0w4OwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiBNQVBTVVJGXzhCSVQgfCBNVF84QklUX0w4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9JODoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAxOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfOEJJVCB8IE1UXzhCSVRfSTg7Ci0gICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIE1BUFNVUkZfOEJJVCB8IE1UXzhCSVRfSTg7CiAgICBjYXNlIE1FU0FfRk9STUFUX0E4OgotICAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDE7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl84QklUIHwgTVRfOEJJVF9JODsgLyogS2x1ZGdlIC0tIGNoZWNrIHdpdGggY29uZm9ybSwgZ2xlYW4gKi8KLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl84QklUIHwgTVRfOEJJVF9JODsgLyogS2x1ZGdlISAqLwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BTDg4OgotICAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDI7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FZODg7Ci0gICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BWTg4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0I1NjU6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1OwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiBNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCMTU1NToKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BUkdCMTU1NTsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FSR0IxNTU1OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCNDQ0NDoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BUkdCNDQ0NDsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FSR0I0NDQ0OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCODg4ODoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9BUkdCODg4ODsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8zMkJJVCB8IE1UXzMyQklUX0FSR0I4ODg4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9ZQ0JDUl9SRVY6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfTk9STUFMIHwgCi0JCSAgICAgICBUTTBTMV9DT0xPUlNQQUNFX0NPTlZFUlNJT04pOwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfTk9STUFMKTsKICAgIGNhc2UgTUVTQV9GT1JNQVRfWUNCQ1I6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfU1dBUFkgfCAvKiA/Pz8gKi8KLQkJICAgICAgIFRNMFMxX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTik7Ci0gICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIChNQVBTVVJGXzQyMiB8IE1UXzQyMl9ZQ1JDQl9TV0FQWSk7CiAgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9GWFQxOgogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZYVDE6Ci0gICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl9DT01QUkVTU0VEIHwgTVRfQ09NUFJFU1NfRlhUMTsKLSAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiAoTUFQU1VSRl9DT01QUkVTU0VEIHwgTVRfQ09NUFJFU1NfRlhUMSk7CiAgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfRFhUMToKICAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX0RYVDE6Ci0gICAgIC8qIAotICAgICAgKiBEWFRuIHBpdGNoZXMgYXJlIFdpZHRoLzQgKiBibG9ja3NpemUgaW4gYnl0ZXMgCi0gICAgICAqIGZvciBEWFQxOiBibG9ja3NpemU9OCBzbyBXaWR0aC80KjggPSBXaWR0aCAqIDIgCi0gICAgICAqIGZvciBEWFQzLzU6IGJsb2Nrc2l6ZT0xNiBzbyBXaWR0aC80KjE2ID0gV2lkdGggKiA0Ci0gICAgICAqLwotICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgdGV4dHVyZUZvcm1hdCA9IChNQVBTVVJGX0NPTVBSRVNTRUQgfCBNVF9DT01QUkVTU19EWFQxKTsKLSAgICAgYnJlYWs7CisgICAgICByZXR1cm4gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDEpOwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDM6Ci0gICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDJfMyk7Ci0gICAgIGJyZWFrOworICAgICAgcmV0dXJuIChNQVBTVVJGX0NPTVBSRVNTRUQgfCBNVF9DT01QUkVTU19EWFQyXzMpOwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDU6Ci0gICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDRfNSk7Ci0gICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDRfNSk7CiAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogYmFkIGltYWdlIGZvcm1hdFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBpbWFnZSBmb3JtYXQgJXhcbiIsIF9fRlVOQ1RJT05fXywgbWVzYV9mb3JtYXQpOwogICAgICAgYWJvcnQoKTsKKyAgICAgIHJldHVybiAwOwogICAgfQotCi0gICAvKiBDb21wdXRlIHdoaWNoIG1pcG1hcCBsZXZlbHMgd2UgcmVhbGx5IHdhbnQgdG8gc2VuZCB0byB0aGUgaGFyZHdhcmUuCi0gICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIGJhc2UgaW1hZ2Ugc2l6ZSwgR0xfVEVYVFVSRV9NSU5fTE9ELAotICAgICogR0xfVEVYVFVSRV9NQVhfTE9ELCBHTF9URVhUVVJFX0JBU0VfTEVWRUwsIGFuZCBHTF9URVhUVVJFX01BWF9MRVZFTC4KLSAgICAqIFllcywgdGhpcyBsb29rcyBvdmVybHkgY29tcGxpY2F0ZWQsIGJ1dCBpdCdzIGFsbCBuZWVkZWQuCi0gICAgKi8KLSAgIGRyaUNhbGN1bGF0ZVRleHR1cmVGaXJzdExhc3RMZXZlbCggKGRyaVRleHR1cmVPYmplY3QgKikgdCApOworfQogCiAKLSAgIC8qIEZpZ3VyZSBvdXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBhbGwgdGhlIG1pcG1hcAotICAgICogbGV2ZWxzLiAgQ2hvb3NlIHRoZSBzbWFsbGVzdCBwaXRjaCB0byBhY2NvbW9kYXRlIHRoZSBsYXJnZXN0Ci0gICAgKiBtaXBtYXA6Ci0gICAgKi8KLSAgIGZpcnN0TGV2ZWwgPSB0LT5pbnRlbC5iYXNlLmZpcnN0TGV2ZWw7Ci0gICBsYXN0TGV2ZWwgPSB0LT5pbnRlbC5iYXNlLmxhc3RMZXZlbDsKLSAgIG51bUxldmVscyA9IGxhc3RMZXZlbCAtIGZpcnN0TGV2ZWwgKyAxOwogCiAKLSAgIC8qIEFsbCBpbWFnZXMgbXVzdCBiZSBsb2FkZWQgYXQgdGhpcyBwaXRjaC4gIENvdW50IHRoZSBudW1iZXIgb2YKLSAgICAqIGxpbmVzIHJlcXVpcmVkOgotICAgICovCi0gICBzd2l0Y2ggKHRPYmotPlRhcmdldCkgewotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQOiB7Ci0gICAgICBjb25zdCBHTHVpbnQgZGltID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbF0tPldpZHRoOwotICAgICAgR0x1aW50IGZhY2U7Ci0KLSAgICAgIHBpdGNoID0gZGltICogdC0+aW50ZWwudGV4ZWxCeXRlczsKLSAgICAgIHBpdGNoICo9IDI7CQkvKiBkb3VibGUgcGl0Y2ggZm9yIGN1YmUgbGF5b3V0cyAqLwotICAgICAgcGl0Y2ggPSAocGl0Y2ggKyAzKSAmIH4zOwotICAgICAgCi0gICAgICB0b3RhbF9oZWlnaHQgPSBkaW0gKiA0OwotCi0gICAgICBmb3IgKCBmYWNlID0gMCA7IGZhY2UgPCA2IDsgZmFjZSsrKSB7Ci0JIEdMdWludCB4ID0gaW5pdGlhbF9vZmZzZXRzW2ZhY2VdWzBdICogZGltOwotCSBHTHVpbnQgeSA9IGluaXRpYWxfb2Zmc2V0c1tmYWNlXVsxXSAqIGRpbTsKLQkgR0x1aW50IGQgPSBkaW07Ci0JIAotCSB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1tmYWNlXSA9IH4wOwotCi0JIGFzc2VydCh0T2JqLT5JbWFnZVtmYWNlXVtmaXJzdExldmVsXS0+V2lkdGggPT0gZGltKTsKLQkgYXNzZXJ0KHRPYmotPkltYWdlW2ZhY2VdW2ZpcnN0TGV2ZWxdLT5IZWlnaHQgPT0gZGltKTsKLQotCSBmb3IgKGkgPSAwOyBpIDwgbnVtTGV2ZWxzOyBpKyspIHsKLQkgICAgdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW1hZ2UgPSB0T2JqLT5JbWFnZVtmYWNlXVtmaXJzdExldmVsICsgaV07Ci0JICAgIGlmICghdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW1hZ2UpIHsKLQkgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBpbWFnZSAlZCAlZFxuIiwgZmFjZSwgaSk7Ci0JICAgICAgIGJyZWFrOwkJLyogY2FuJ3QgaGFwcGVuICovCi0JICAgIH0KLQkgCi0JICAgIHQtPmludGVsLmltYWdlW2ZhY2VdW2ldLm9mZnNldCA9IAotCSAgICAgICB5ICogcGl0Y2ggKyB4ICogdC0+aW50ZWwudGV4ZWxCeXRlczsKLQkgICAgdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW50ZXJuYWxGb3JtYXQgPSBiYXNlSW1hZ2UtPl9CYXNlRm9ybWF0OwotCi0JICAgIGQgPj49IDE7Ci0JICAgIHggKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzBdICogZDsKLQkgICAgeSArPSBzdGVwX29mZnNldHNbZmFjZV1bMV0gKiBkOwotCSB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIH0KKy8qIFRoZSBpOTE1IChhbmQgcmVsYXRlZCBncmFwaGljcyBjb3JlcykgZG8gbm90IHN1cHBvcnQgR0xfQ0xBTVAuICBUaGUKKyAqIEludGVsIGRyaXZlcnMgZm9yICJvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyIgaW1wbGVtZW50IEdMX0NMQU1QIGFzCisgKiBHTF9DTEFNUF9UT19FREdFLCBzbyB0aGUgc2FtZSBpcyBkb25lIGhlcmUuCisgKi8KK3N0YXRpYyBHTHVpbnQKK3RyYW5zbGF0ZV93cmFwX21vZGUoR0xlbnVtIHdyYXApCit7CisgICBzd2l0Y2ggKHdyYXApIHsKKyAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgcmV0dXJuIFRFWENPT1JETU9ERV9XUkFQOworICAgY2FzZSBHTF9DTEFNUDoKKyAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgIHJldHVybiBURVhDT09SRE1PREVfQ0xBTVA7ICAgICAgICAvKiBub3QgcmVhbGx5IGNvcnJlY3QgKi8KKyAgIGNhc2UgR0xfQ0xBTVBfVE9fQk9SREVSOgorICAgICAgcmV0dXJuIFRFWENPT1JETU9ERV9DTEFNUF9CT1JERVI7CisgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgIHJldHVybiBURVhDT09SRE1PREVfTUlSUk9SOwogICAgZGVmYXVsdDoKLSAgICAgIHBpdGNoID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbF0tPldpZHRoICogdC0+aW50ZWwudGV4ZWxCeXRlczsKLSAgICAgIHBpdGNoID0gKHBpdGNoICsgMykgJiB+MzsKLSAgICAgIHQtPmludGVsLmJhc2UuZGlydHlfaW1hZ2VzWzBdID0gfjA7CisgICAgICByZXR1cm4gVEVYQ09PUkRNT0RFX1dSQVA7CisgICB9Cit9CiAKLSAgICAgIGZvciAoIHRvdGFsX2hlaWdodCA9IGkgPSAwIDsgaSA8IG51bUxldmVscyA7IGkrKyApIHsKLQkgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UgPSB0T2JqLT5JbWFnZVswXVtmaXJzdExldmVsICsgaV07Ci0JIGlmICghdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UpIAotCSAgICBicmVhazsKLQkgCi0JIHQtPmludGVsLmltYWdlWzBdW2ldLm9mZnNldCA9IHRvdGFsX2hlaWdodCAqIHBpdGNoOwotCSB0LT5pbnRlbC5pbWFnZVswXVtpXS5pbnRlcm5hbEZvcm1hdCA9IGJhc2VJbWFnZS0+X0Jhc2VGb3JtYXQ7Ci0JIGlmICh0LT5pbnRlbC5pbWFnZVswXVtpXS5pbWFnZS0+SXNDb21wcmVzc2VkKQotCSB7Ci0JICAgaWYgKHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlLT5IZWlnaHQgPiA0KQotCSAgICAgdG90YWxfaGVpZ2h0ICs9IHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlLT5IZWlnaHQvNDsKLQkgICBlbHNlCi0JICAgICB0b3RhbF9oZWlnaHQgKz0gMTsKLQkgfQotCSBlbHNlCi0JICAgdG90YWxfaGVpZ2h0ICs9IE1BWDIoMiwgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UtPkhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKworLyogUmVjYWxjdWxhdGUgYWxsIHN0YXRlIGZyb20gc2NyYXRjaC4gIFBlcmhhcHMgbm90IHRoZSBtb3N0CisgKiBlZmZpY2llbnQsIGJ1dCB0aGlzIGhhcyBnb3R0ZW4gY29tcGxleCBlbm91Z2ggdGhhdCB3ZSBuZWVkCisgKiBzb21ldGhpbmcgd2hpY2ggaXMgdW5kZXJzdGFuZGFibGUgYW5kIHJlbGlhYmxlLgorICovCitzdGF0aWMgR0xib29sZWFuCitpODMwX3VwZGF0ZV90ZXhfdW5pdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMdWludCB1bml0LCBHTHVpbnQgc3MzKQoreworICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRVbml0ID0gJmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdOworICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gdFVuaXQtPl9DdXJyZW50OworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRPYmopOworICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmZpcnN0SW1hZ2U7CisgICBHTHVpbnQgKnN0YXRlID0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdLCBmb3JtYXQsIHBpdGNoOworICAgR0xpbnQgbG9kYmlhczsKKworICAgbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKworICAgLypXZSBuZWVkIHRvIHJlZmNvdW50IHRoZXNlLiAqLworCisgICBpZiAoaTgzMC0+c3RhdGUudGV4X2J1ZmZlclt1bml0XSAhPSBOVUxMKSB7CisgICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGk4MzAtPnN0YXRlLnRleF9idWZmZXJbdW5pdF0pOworICAgICAgIGk4MzAtPnN0YXRlLnRleF9idWZmZXJbdW5pdF0gPSBOVUxMOwogICAgfQogCi0gICB0LT5pbnRlbC5QaXRjaCA9IHBpdGNoOwotICAgdC0+aW50ZWwuYmFzZS50b3RhbFNpemUgPSB0b3RhbF9oZWlnaHQqcGl0Y2g7Ci0gICB0LT5pbnRlbC5tYXhfbGV2ZWwgPSBpLTE7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTMV0gPSAKLSAgICAgICgoKHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5IZWlnaHQgLSAxKSA8PCBUTTBTMV9IRUlHSFRfU0hJRlQpIHwKLSAgICAgICAoKHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5XaWR0aCAtIDEpIDw8IFRNMFMxX1dJRFRIX1NISUZUKSB8Ci0gICAgICAgdGV4dHVyZUZvcm1hdCk7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTMl0gPSAKLSAgICAgICgoKHBpdGNoIC8gNCkgLSAxKSA8PCBUTTBTMl9QSVRDSF9TSElGVCkgfAotICAgICAgVE0wUzJfQ1VCRV9GQUNFX0VOQV9NQVNLOwotICAgdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzNdICY9IH5UTTBTM19NQVhfTUlQX01BU0s7Ci0gICB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTM10gJj0gflRNMFMzX01JTl9NSVBfTUFTSzsKLSAgIHQtPlNldHVwW0k4MzBfVEVYUkVHX1RNMFMzXSB8PSAoKG51bUxldmVscyAtIDEpKjQpIDw8IFRNMFMzX01JTl9NSVBfU0hJRlQ7Ci0gICB0LT5pbnRlbC5kaXJ0eSA9IEk4MzBfVVBMT0FEX1RFWF9BTEw7Ci0KLSAgIHJldHVybiBpbnRlbFVwbG9hZFRleEltYWdlcyggJmk4MzAtPmludGVsLCAmdC0+aW50ZWwsIDAgKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpODMwX2ltcG9ydF90ZXhfdW5pdCggaTgzMENvbnRleHRQdHIgaTgzMCwgCi0JCQkgICBpODMwVGV4dHVyZU9iamVjdFB0ciB0LAotCQkJICAgR0x1aW50IHVuaXQgKQotewotICAgaWYoSU5URUxfREVCVUcmREVCVUdfVEVYVFVSRSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgdW5pdCglZClcbiIsIF9fRlVOQ1RJT05fXywgdW5pdCk7Ci0gICAKLSAgIGlmIChpODMwLT5pbnRlbC5DdXJyZW50VGV4T2JqW3VuaXRdKSAKLSAgICAgIGk4MzAtPmludGVsLkN1cnJlbnRUZXhPYmpbdW5pdF0tPmJhc2UuYm91bmQgJj0gfigxVSA8PCB1bml0KTsKLQotICAgaTgzMC0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XSA9IChpbnRlbFRleHR1cmVPYmplY3RQdHIpdDsKLSAgIHQtPmludGVsLmJhc2UuYm91bmQgfD0gKDEgPDwgdW5pdCk7Ci0KLSAgIEk4MzBfU1RBVEVDSEFOR0UoIGk4MzAsIEk4MzBfVVBMT0FEX1RFWCh1bml0KSApOwotCi0gICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfVE0wTEldID0gKF8zRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzIgfCAKLQkJCQkJICAgICAgIChMT0FEX1RFWFRVUkVfTUFQMCA8PCB1bml0KSB8IDQpOwotICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX1RNMFMwXSA9IChUTTBTMF9VU0VfRkVOQ0UgfAotCQkJCQkgICAgICAgdC0+aW50ZWwuVGV4dHVyZU9mZnNldCk7Ci0KLSAgIGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19UTTBTMV0gPSB0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTMV07Ci0gICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfVE0wUzJdID0gdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzJdOwotCi0gICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfVE0wUzNdICY9IFRNMFMzX0xPRF9CSUFTX01BU0s7Ci0gICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfVE0wUzNdIHw9ICh0LT5TZXR1cFtJODMwX1RFWFJFR19UTTBTM10gJgotCQkJCQkJflRNMFMzX0xPRF9CSUFTX01BU0spOwotCi0gICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfVE0wUzRdID0gdC0+U2V0dXBbSTgzMF9URVhSRUdfVE0wUzRdOwotICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10gPSAodC0+U2V0dXBbSTgzMF9URVhSRUdfTUNTXSAmIAotCQkJCQkgICAgIH5NQVBfVU5JVF9NQVNLKTsgICAKLSAgIGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19DVUJFXSA9IHQtPlNldHVwW0k4MzBfVEVYUkVHX0NVQkVdOwotICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10gfD0gTUFQX1VOSVQodW5pdCk7Ci0KLSAgIHQtPmludGVsLmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVgodW5pdCk7Ci19Ci0KLQotCi1zdGF0aWMgR0xib29sZWFuIGVuYWJsZV90ZXhfY29tbW9uKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQgKQotewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChjdHgpOwotICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9IHRleFVuaXQtPl9DdXJyZW50OwotICAgaTgzMFRleHR1cmVPYmplY3RQdHIgdCA9IChpODMwVGV4dHVyZU9iamVjdFB0cil0T2JqLT5Ecml2ZXJEYXRhOwotCi0gICBpZiAoMCkgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgLyogRmFsbGJhY2sgaWYgdGhlcmUncyBhIHRleHR1cmUgYm9yZGVyICovCi0gICBpZiAoIHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF0tPkJvcmRlciA+IDAgKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlRleHR1cmUgYm9yZGVyXG4iKTsKKyAgIGlmICghaW50ZWxPYmotPmltYWdlT3ZlcnJpZGUgJiYgIWludGVsX2ZpbmFsaXplX21pcG1hcF90cmVlKGludGVsLCB1bml0KSkKICAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KIAotICAgLyogVXBsb2FkIHRleGltYWdlcyAobm90IHBpcGVsaW5lZCkKKyAgIC8qIEdldCBmaXJzdCBpbWFnZSBoZXJlLCBzaW5jZSBpbnRlbE9iai0+Zmlyc3RMZXZlbCB3aWxsIGdldCBzZXQgaW4KKyAgICAqIHRoZSBpbnRlbF9maW5hbGl6ZV9taXBtYXBfdHJlZSgpIGNhbGwgYWJvdmUuCiAgICAgKi8KLSAgIGlmICh0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSkgewotICAgICAgaWYgKCFpODMwU2V0VGV4SW1hZ2VzKCBpODMwLCB0T2JqICkpIHsKLQkgcmV0dXJuIEdMX0ZBTFNFOworICAgZmlyc3RJbWFnZSA9IHRPYmotPkltYWdlWzBdW2ludGVsT2JqLT5maXJzdExldmVsXTsKKworICAgaWYgKGludGVsT2JqLT5pbWFnZU92ZXJyaWRlKSB7CisgICAgICBpODMwLT5zdGF0ZS50ZXhfYnVmZmVyW3VuaXRdID0gTlVMTDsKKyAgICAgIGk4MzAtPnN0YXRlLnRleF9vZmZzZXRbdW5pdF0gPSBpbnRlbE9iai0+dGV4dHVyZU9mZnNldDsKKworICAgICAgc3dpdGNoIChpbnRlbE9iai0+ZGVwdGhPdmVycmlkZSkgeworICAgICAgY2FzZSAzMjoKKwkgZm9ybWF0ID0gTUFQU1VSRl8zMkJJVCB8IE1UXzMyQklUX0FSR0I4ODg4OworCSBicmVhazsKKyAgICAgIGNhc2UgMjQ6CisgICAgICBkZWZhdWx0OgorCSBmb3JtYXQgPSBNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfWFJHQjg4ODg7CisJIGJyZWFrOworICAgICAgY2FzZSAxNjoKKwkgZm9ybWF0ID0gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX1JHQjU2NTsKKwkgYnJlYWs7CiAgICAgICB9CisKKyAgICAgIHBpdGNoID0gaW50ZWxPYmotPnBpdGNoT3ZlcnJpZGU7CisgICB9IGVsc2UgeworICAgICAgZHJpX2JvX3JlZmVyZW5jZShpbnRlbE9iai0+bXQtPnJlZ2lvbi0+YnVmZmVyKTsKKyAgICAgIGk4MzAtPnN0YXRlLnRleF9idWZmZXJbdW5pdF0gPSBpbnRlbE9iai0+bXQtPnJlZ2lvbi0+YnVmZmVyOworICAgICAgaTgzMC0+c3RhdGUudGV4X29mZnNldFt1bml0XSA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGludGVsT2JqLT5tdCwKKwkJCQkJCQkJMCwgaW50ZWxPYmotPgorCQkJCQkJCQlmaXJzdExldmVsKTsKKworICAgICAgZm9ybWF0ID0gdHJhbnNsYXRlX3RleHR1cmVfZm9ybWF0KGZpcnN0SW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICAgICBwaXRjaCA9IGludGVsT2JqLT5tdC0+cGl0Y2ggKiBpbnRlbE9iai0+bXQtPmNwcDsKICAgIH0KIAotICAgLyogVXBkYXRlIHN0YXRlIGlmIHRoaXMgaXMgYSBkaWZmZXJlbnQgdGV4dHVyZSBvYmplY3QgdG8gbGFzdAotICAgICogdGltZS4KLSAgICAqLwotICAgaWYgKGk4MzAtPmludGVsLkN1cnJlbnRUZXhPYmpbdW5pdF0gIT0gJnQtPmludGVsIHx8IAotICAgICAgICh0LT5pbnRlbC5kaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWCh1bml0KSkpIHsKLSAgICAgIGk4MzBfaW1wb3J0X3RleF91bml0KCBpODMwLCB0LCB1bml0KTsKKyAgIHN0YXRlW0k4MzBfVEVYUkVHX1RNMExJXSA9IChfM0RTVEFURV9MT0FEX1NUQVRFX0lNTUVESUFURV8yIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE9BRF9URVhUVVJFX01BUDAgPDwgdW5pdCkgfCA0KTsKKworLyogICAgc3RhdGVbSTgzMF9URVhSRUdfVE0wUzBdID0gKFRNMFMwX1VTRV9GRU5DRSB8ICovCisvKiAJCQkgICAgICAgdC0+aW50ZWwuVGV4dHVyZU9mZnNldCk7ICovCisKKworICAgc3RhdGVbSTgzMF9URVhSRUdfVE0wUzFdID0KKyAgICAgICgoKGZpcnN0SW1hZ2UtPkhlaWdodCAtIDEpIDw8IFRNMFMxX0hFSUdIVF9TSElGVCkgfAorICAgICAgICgoZmlyc3RJbWFnZS0+V2lkdGggLSAxKSA8PCBUTTBTMV9XSURUSF9TSElGVCkgfCBmb3JtYXQpOworCisgICBzdGF0ZVtJODMwX1RFWFJFR19UTTBTMl0gPQorICAgICAgKCgoKHBpdGNoIC8gNCkgLSAxKSA8PCBUTTBTMl9QSVRDSF9TSElGVCkgfCBUTTBTMl9DVUJFX0ZBQ0VfRU5BX01BU0spOworCisgICB7CisgICAgICBpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApCisgICAgICAgICBzdGF0ZVtJODMwX1RFWFJFR19DVUJFXSA9IChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKHVuaXQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVQkVfTkVHWF9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VCRV9QT1NYX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVUJFX05FR1lfRU5BQkxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVQkVfUE9TWV9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VCRV9ORUdaX0VOQUJMRSB8IENVQkVfUE9TWl9FTkFCTEUpOworICAgICAgZWxzZQorICAgICAgICAgc3RhdGVbSTgzMF9URVhSRUdfQ1VCRV0gPSAoXzNEU1RBVEVfTUFQX0NVQkUgfCBNQVBfVU5JVCh1bml0KSk7CiAgICB9CiAKKworCisKKyAgIHsKKyAgICAgIEdMdWludCBtaW5GaWx0LCBtaXBGaWx0LCBtYWdGaWx0OworCisgICAgICBzd2l0Y2ggKHRPYmotPk1pbkZpbHRlcikgeworICAgICAgY2FzZSBHTF9ORUFSRVNUOgorICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl9ORUFSRVNUOworICAgICAgICAgbWlwRmlsdCA9IE1JUEZJTFRFUl9OT05FOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0xJTkVBUjoKKyAgICAgICAgIG1pbkZpbHQgPSBGSUxURVJfTElORUFSOworICAgICAgICAgbWlwRmlsdCA9IE1JUEZJTFRFUl9OT05FOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q6CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7CisgICAgICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05FQVJFU1Q7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUOgorICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl9MSU5FQVI7CisgICAgICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05FQVJFU1Q7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgorICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl9ORUFSRVNUOworICAgICAgICAgbWlwRmlsdCA9IE1JUEZJTFRFUl9MSU5FQVI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9MSU5FQVI6CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX0xJTkVBUjsKKyAgICAgICAgIG1pcEZpbHQgPSBNSVBGSUxURVJfTElORUFSOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorCisgICAgICBpZiAodE9iai0+TWF4QW5pc290cm9weSA+IDEuMCkgeworICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl9BTklTT1RST1BJQzsKKyAgICAgICAgIG1hZ0ZpbHQgPSBGSUxURVJfQU5JU09UUk9QSUM7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIHN3aXRjaCAodE9iai0+TWFnRmlsdGVyKSB7CisgICAgICAgICBjYXNlIEdMX05FQVJFU1Q6CisgICAgICAgICAgICBtYWdGaWx0ID0gRklMVEVSX05FQVJFU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgR0xfTElORUFSOgorICAgICAgICAgICAgbWFnRmlsdCA9IEZJTFRFUl9MSU5FQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxvZGJpYXMgPSAoaW50KSAoKHRVbml0LT5Mb2RCaWFzICsgdE9iai0+TG9kQmlhcykgKiAxNi4wKTsKKyAgICAgIGlmIChsb2RiaWFzIDwgLTY0KQorICAgICAgICAgIGxvZGJpYXMgPSAtNjQ7CisgICAgICBpZiAobG9kYmlhcyA+IDYzKQorICAgICAgICAgIGxvZGJpYXMgPSA2MzsKKyAgICAgIAorICAgICAgc3RhdGVbSTgzMF9URVhSRUdfVE0wUzNdID0gKChsb2RiaWFzIDw8IFRNMFMzX0xPRF9CSUFTX1NISUZUKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNMFMzX0xPRF9CSUFTX01BU0spOworI2lmIDAKKyAgICAgIC8qIFlVViBjb252ZXJzaW9uOgorICAgICAgICovCisgICAgICBpZiAoZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ID09IE1FU0FfRk9STUFUX1lDQkNSIHx8CisgICAgICAgICAgZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ID09IE1FU0FfRk9STUFUX1lDQkNSX1JFVikKKyAgICAgICAgIHN0YXRlW0k4MzBfVEVYUkVHX1RNMFMzXSB8PSBTUzJfQ09MT1JTUEFDRV9DT05WRVJTSU9OOworI2VuZGlmCisKKyAgICAgIHN0YXRlW0k4MzBfVEVYUkVHX1RNMFMzXSB8PSAoKGludGVsT2JqLT5sYXN0TGV2ZWwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxPYmotPmZpcnN0TGV2ZWwpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkgPDwgVE0wUzNfTUlOX01JUF9TSElGVDsKKworICAgICAgc3RhdGVbSTgzMF9URVhSRUdfVE0wUzNdIHw9ICgobWluRmlsdCA8PCBUTTBTM19NSU5fRklMVEVSX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaXBGaWx0IDw8IFRNMFMzX01JUF9GSUxURVJfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hZ0ZpbHQgPDwgVE0wUzNfTUFHX0ZJTFRFUl9TSElGVCkpOworICAgfQorCisgICB7CisgICAgICBHTGVudW0gd3MgPSB0T2JqLT5XcmFwUzsKKyAgICAgIEdMZW51bSB3dCA9IHRPYmotPldyYXBUOworCisKKyAgICAgIC8qIDNEIHRleHR1cmVzIG5vdCBhdmFpbGFibGUgb24gaTgzMAorICAgICAgICovCisgICAgICBpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfM0QpCisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgICAgIHN0YXRlW0k4MzBfVEVYUkVHX01DU10gPSAoXzNEU1RBVEVfTUFQX0NPT1JEX1NFVF9DTUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfVU5JVCh1bml0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9URVhDT09SRF9QQVJBTVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzczMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfQUREUl9WX0NOVEwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhDT09SRF9BRERSX1ZfTU9ERSh0cmFuc2xhdGVfd3JhcF9tb2RlKHd0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFTkFCTEVfQUREUl9VX0NOVEwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhDT09SRF9BRERSX1VfTU9ERSh0cmFuc2xhdGVfd3JhcF9tb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cykpKTsKKyAgIH0KKworCisgICBzdGF0ZVtJODMwX1RFWFJFR19UTTBTNF0gPSBJTlRFTF9QQUNLQ09MT1I4ODg4KHRPYmotPl9Cb3JkZXJDaGFuWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0T2JqLT5fQm9yZGVyQ2hhblsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE9iai0+X0JvcmRlckNoYW5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRPYmotPl9Cb3JkZXJDaGFuWzNdKTsKKworCiAgICBJODMwX0FDVElWRVNUQVRFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWCh1bml0KSwgR0xfVFJVRSk7Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuIGVuYWJsZV90ZXhfcmVjdCggR0xjb250ZXh0ICpjdHgsIEdMdWludCB1bml0ICkKLXsKLSAgIGk4MzBDb250ZXh0UHRyIGk4MzAgPSBJODMwX0NPTlRFWFQoY3R4KTsKLSAgIEdMdWludCBtY3MgPSBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfTUNTXTsKLQotICAgbWNzICY9IH5URVhDT09SRFNfQVJFX05PUk1BTDsKLSAgIG1jcyB8PSBURVhDT09SRFNfQVJFX0lOX1RFWEVMVU5JVFM7Ci0KLSAgIGlmICgobWNzICE9IGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19NQ1NdKQotICAgICAgIHx8ICgwICE9IGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19DVUJFXSkpIHsKLSAgICAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfVEVYKHVuaXQpKTsKLSAgICAgIGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19NQ1NdID0gbWNzOwotICAgICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX0NVQkVdID0gMDsKLSAgIH0KLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLQotc3RhdGljIEdMYm9vbGVhbiBlbmFibGVfdGV4XzJkKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQgKQotewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChjdHgpOwotICAgR0x1aW50IG1jcyA9IGk4MzAtPnN0YXRlLlRleFt1bml0XVtJODMwX1RFWFJFR19NQ1NdOwotCi0gICBtY3MgJj0gflRFWENPT1JEU19BUkVfSU5fVEVYRUxVTklUUzsKLSAgIG1jcyB8PSBURVhDT09SRFNfQVJFX05PUk1BTDsKLQotICAgaWYgKChtY3MgIT0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10pCi0gICAgICAgfHwgKDAgIT0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX0NVQkVdKSkgewotICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9URVgodW5pdCkpOwotICAgICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10gPSBtY3M7Ci0gICAgICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfQ1VCRV0gPSAwOwotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotIAotc3RhdGljIEdMYm9vbGVhbiBlbmFibGVfdGV4X2N1YmUoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCApCi17Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdOwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gdGV4VW5pdC0+X0N1cnJlbnQ7Ci0gICBpODMwVGV4dHVyZU9iamVjdFB0ciB0ID0gKGk4MzBUZXh0dXJlT2JqZWN0UHRyKXRPYmotPkRyaXZlckRhdGE7Ci0gICBHTHVpbnQgbWNzID0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU107Ci0gICBjb25zdCBHTHVpbnQgY3ViZSA9IENVQkVfTkVHWF9FTkFCTEUgfCBDVUJFX1BPU1hfRU5BQkxFCi0gICAgIHwgQ1VCRV9ORUdZX0VOQUJMRSB8IENVQkVfUE9TWV9FTkFCTEUKLSAgICAgfCBDVUJFX05FR1pfRU5BQkxFIHwgQ1VCRV9QT1NaX0VOQUJMRTsKLSAgIEdMdWludCBmYWNlOwotCi0gICBtY3MgJj0gflRFWENPT1JEU19BUkVfSU5fVEVYRUxVTklUUzsKLSAgIG1jcyB8PSBURVhDT09SRFNfQVJFX05PUk1BTDsKLQotICAgaWYgKChtY3MgIT0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10pCi0gICAgICAgfHwgKGN1YmUgIT0gaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX0NVQkVdKSkgewotICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9URVgodW5pdCkpOwotICAgICAgaTgzMC0+c3RhdGUuVGV4W3VuaXRdW0k4MzBfVEVYUkVHX01DU10gPSBtY3M7Ci0gICAgICBpODMwLT5zdGF0ZS5UZXhbdW5pdF1bSTgzMF9URVhSRUdfQ1VCRV0gPSBjdWJlOwotICAgfQotCi0gICAvKiBVcGxvYWQgdGV4aW1hZ2VzIChub3QgcGlwZWxpbmVkKQorICAgLyogbWVtY21wIHdhcyBhbHJlYWR5IGRpc2FibGVkLCBidXQgZGVmaW5pdGVseSB3b24ndCB3b3JrIGFzIHRoZQorICAgICogcmVnaW9uIG1pZ2h0IG5vdyBjaGFuZ2UgYW5kIHRoYXQgd291bGRuJ3QgYmUgZGV0ZWN0ZWQ6CiAgICAgKi8KLSAgIGlmICggdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbMF0gfHwgdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbMV0gfHwKLSAgICAgICAgdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbMl0gfHwgdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbM10gfHwKLSAgICAgICAgdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbNF0gfHwgdC0+aW50ZWwuYmFzZS5kaXJ0eV9pbWFnZXNbNV0gKSB7Ci0gICAgICBpODMwU2V0VGV4SW1hZ2VzKCBpODMwLCB0T2JqICk7Ci0gICB9CisgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWCh1bml0KSk7CisgICByZXR1cm4gR0xfVFJVRTsKK30KIAotICAgLyogdXBsb2FkIChwZXIgZmFjZSkgKi8KLSAgIGZvciAoZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspIHsKLSAgICAgIGlmICh0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1tmYWNlXSkgewotCSBpZiAoIWludGVsVXBsb2FkVGV4SW1hZ2VzKCAmaTgzMC0+aW50ZWwsICZ0LT5pbnRlbCwgZmFjZSApKSB7Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKKworCisKK3ZvaWQKK2k4MzBVcGRhdGVUZXh0dXJlU3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBHTGJvb2xlYW4gb2sgPSBHTF9UUlVFOworICAgR0x1aW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBJODMwX1RFWF9VTklUUyAmJiBvazsgaSsrKSB7CisgICAgICBzd2l0Y2ggKGludGVsLT5jdHguVGV4dHVyZS5Vbml0W2ldLl9SZWFsbHlFbmFibGVkKSB7CisgICAgICBjYXNlIFRFWFRVUkVfMURfQklUOgorICAgICAgY2FzZSBURVhUVVJFXzJEX0JJVDoKKyAgICAgIGNhc2UgVEVYVFVSRV9DVUJFX0JJVDoKKyAgICAgICAgIG9rID0gaTgzMF91cGRhdGVfdGV4X3VuaXQoaW50ZWwsIGksIFRFWENPT1JEU19BUkVfTk9STUFMKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFX1JFQ1RfQklUOgorICAgICAgICAgb2sgPSBpODMwX3VwZGF0ZV90ZXhfdW5pdChpbnRlbCwgaSwgVEVYQ09PUkRTX0FSRV9JTl9URVhFTFVOSVRTKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOnsKKwkgc3RydWN0IGk4MzBfY29udGV4dCAqaTgzMCA9IGk4MzBfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICAgICAgICBpZiAoaTgzMC0+c3RhdGUuYWN0aXZlICYgSTgzMF9VUExPQURfVEVYKGkpKSAKKyAgICAgICAgICAgIEk4MzBfQUNUSVZFU1RBVEUoaTgzMCwgSTgzMF9VUExPQURfVEVYKGkpLCBHTF9GQUxTRSk7CisKKwkgaWYgKGk4MzAtPnN0YXRlLnRleF9idWZmZXJbaV0gIT0gTlVMTCkgeworCSAgICBkcmlfYm9fdW5yZWZlcmVuY2UoaTgzMC0+c3RhdGUudGV4X2J1ZmZlcltpXSk7CisJICAgIGk4MzAtPnN0YXRlLnRleF9idWZmZXJbaV0gPSBOVUxMOwogCSB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVEVYVFVSRV8zRF9CSVQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICAgb2sgPSBHTF9GQUxTRTsKKyAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgfQogCi0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KLXN0YXRpYyBHTGJvb2xlYW4gZGlzYWJsZV90ZXgoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCApCi17Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGN0eCk7Ci0KLSAgIC8qIFRoaXMgaXMgaGFwcGVuaW5nIHRvbyBvZnRlbi4gIEkgbmVlZCB0byBjb25kaXRpb25hbGx5IHNlbmQgZGlmZnVzZQotICAgICogc3RhdGUgdG8gdGhlIGNhcmQuICBQZXJoYXBzIGEgZGlmZnVzZSBkaXJ0eSBmbGFnIG9mIHNvbWUga2luZC4KLSAgICAqIFdpbGwgbmVlZCB0byBjaGFuZ2UgdGhpcyBsb2dpYyBpZiBtb3JlIHRoYW4gMiB0ZXh0dXJlIHVuaXRzIGFyZQotICAgICogdXNlZC4gIFdlIG5lZWQgdG8gb25seSBkbyB0aGlzIHVwIHRvIHRoZSBsYXN0IHVuaXQgZW5hYmxlZCwgb3IgdW5pdAotICAgICogb25lIGlmIG5vdGhpbmcgaXMgZW5hYmxlZC4KLSAgICAqLwotCi0gICBpZiAoIGk4MzAtPmludGVsLkN1cnJlbnRUZXhPYmpbdW5pdF0gIT0gTlVMTCApIHsKLSAgICAgIC8qIFRoZSBvbGQgdGV4dHVyZSBpcyBubyBsb25nZXIgYm91bmQgdG8gdGhpcyB0ZXh0dXJlIHVuaXQuCi0gICAgICAgKiBNYXJrIGl0IGFzIHN1Y2guCi0gICAgICAgKi8KLQotICAgICAgaTgzMC0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XS0+YmFzZS5ib3VuZCAmPSB+KDFVIDw8IDApOwotICAgICAgaTgzMC0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XSA9IE5VTEw7Ci0gICB9Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuIGk4MzBVcGRhdGVUZXhVbml0KCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQgKQotewotICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKLQotICAgaWYgKHRleFVuaXQtPl9SZWFsbHlFbmFibGVkICYmCi0gICAgICAgSU5URUxfQ09OVEVYVChjdHgpLT5pbnRlbFNjcmVlbi0+dGV4LnNpemUgPCAyMDQ4ICogMTAyNCkKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLQotICAgc3dpdGNoKHRleFVuaXQtPl9SZWFsbHlFbmFibGVkKSB7Ci0gICBjYXNlIFRFWFRVUkVfMURfQklUOgotICAgY2FzZSBURVhUVVJFXzJEX0JJVDoKLSAgICAgIHJldHVybiAoZW5hYmxlX3RleF9jb21tb24oIGN0eCwgdW5pdCApICYmCi0JICAgICAgZW5hYmxlX3RleF8yZCggY3R4LCB1bml0ICkpOwotICAgY2FzZSBURVhUVVJFX1JFQ1RfQklUOgotICAgICAgcmV0dXJuIChlbmFibGVfdGV4X2NvbW1vbiggY3R4LCB1bml0ICkgJiYKLQkgICAgICBlbmFibGVfdGV4X3JlY3QoIGN0eCwgdW5pdCApKTsKLSAgIGNhc2UgVEVYVFVSRV9DVUJFX0JJVDoKLSAgICAgIHJldHVybiAoZW5hYmxlX3RleF9jb21tb24oIGN0eCwgdW5pdCApICYmCi0JICAgICAgZW5hYmxlX3RleF9jdWJlKCBjdHgsIHVuaXQgKSk7Ci0gICBjYXNlIDA6Ci0gICAgICByZXR1cm4gZGlzYWJsZV90ZXgoIGN0eCwgdW5pdCApOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLX0KLQotCi12b2lkIGk4MzBVcGRhdGVUZXh0dXJlU3RhdGUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCi17Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGludGVsKTsKLSAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0gICBHTGJvb2xlYW4gb2s7Ci0KLSAgIGlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBJODMwX0FDVElWRVNUQVRFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWF9BTEwsIEdMX0ZBTFNFKTsKLQotICAgb2sgPSAoaTgzMFVwZGF0ZVRleFVuaXQoIGN0eCwgMCApICYmCi0JIGk4MzBVcGRhdGVUZXhVbml0KCBjdHgsIDEgKSAmJgotCSBpODMwVXBkYXRlVGV4VW5pdCggY3R4LCAyICkgJiYKLQkgaTgzMFVwZGF0ZVRleFVuaXQoIGN0eCwgMyApKTsKLQotICAgRkFMTEJBQ0soIGludGVsLCBJODMwX0ZBTExCQUNLX1RFWFRVUkUsICFvayApOworICAgRkFMTEJBQ0soaW50ZWwsIEk4MzBfRkFMTEJBQ0tfVEVYVFVSRSwgIW9rKTsKIAogICAgaWYgKG9rKQotICAgICAgaTgzMEVtaXRUZXh0dXJlQmxlbmQoIGk4MzAgKTsKKyAgICAgIGk4MzBFbWl0VGV4dHVyZUJsZW5kKGk4MzApOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX3Z0YmwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTgzMF92dGJsLmMKaW5kZXggZDQwY2Y3MC4uNDBhNTBmZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pODMwX3Z0YmwuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k4MzBfdnRibC5jCkBAIC0yNSwxNyArMjUsMjAgQEAKICAqIAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSAiZ2xhcGkuaCIKIAogI2luY2x1ZGUgImk4MzBfY29udGV4dC5oIgogI2luY2x1ZGUgImk4MzBfcmVnLmgiCi0KICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgotCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX3RyaXMuaCIKICNpbmNsdWRlICJ0bmwvdF9jb250ZXh0LmgiCiAjaW5jbHVkZSAidG5sL3RfdmVydGV4LmgiCiAKLXN0YXRpYyBHTGJvb2xlYW4gaTgzMF9jaGVja192ZXJ0ZXhfc2l6ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCQkgR0x1aW50IGV4cGVjdGVkICk7CisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19TVEFURQorCitzdGF0aWMgR0xib29sZWFuIGk4MzBfY2hlY2tfdmVydGV4X3NpemUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBleHBlY3RlZCk7CiAKICNkZWZpbmUgU1pfVE9fSFcoc3opICAoKHN6LTIpJjB4MykKICNkZWZpbmUgRU1JVF9TWihzeikgICAoRU1JVF8xRiArIChzeikgLSAxKQpAQCAtNTksMTAgKzYyLDE2IEBACiAjZGVmaW5lIFZSVFhfVEVYX1NFVF9GTVQobiwgeCkgICAgICAgICAgKCh4KTw8KChuKSoyKSkKICNkZWZpbmUgVEVYQklORF9TRVQobiwgeCkgCQkoKHgpPDwoKG4pKjQpKQogCi1zdGF0aWMgdm9pZCBpODMwX3JlbmRlcl9zdGFydCggaW50ZWxDb250ZXh0UHRyIGludGVsICkKK3N0YXRpYyB2b2lkCitpODMwX3JlbmRlcl9wcmV2YWxpZGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7Cit9CisKK3N0YXRpYyB2b2lkCitpODMwX3JlbmRlcl9zdGFydChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCiB7CiAgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChpbnRlbCk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KGN0eCk7CiAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwogICAgc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJnRubC0+dmI7CiAgICBERUNMQVJFX1JFTkRFUklOUFVUUyhpbmRleF9iaXRzZXQpOwpAQCAtNzAsNyArNzksNyBAQAogICAgR0x1aW50IHYyID0gXzNEU1RBVEVfVkZUMV9DTUQ7CiAgICBHTHVpbnQgbWNzYjEgPSAwOwogCi0gICBSRU5ERVJJTlBVVFNfQ09QWSggaW5kZXhfYml0c2V0LCB0bmwtPnJlbmRlcl9pbnB1dHNfYml0c2V0ICk7CisgICBSRU5ERVJJTlBVVFNfQ09QWShpbmRleF9iaXRzZXQsIHRubC0+cmVuZGVyX2lucHV0c19iaXRzZXQpOwogCiAgICAvKiBJbXBvcnRhbnQ6CiAgICAgKi8KQEAgLTgwLDE5NiArODksMjE1IEBACiAgICAvKiBFTUlUX0FUVFIncyBtdXN0IGJlIGluIG9yZGVyIGFzIHRoZXkgdGVsbCB0X3ZlcnRleC5jIGhvdyB0bwogICAgICogYnVpbGQgdXAgYSBoYXJkd2FyZSB2ZXJ0ZXguCiAgICAgKi8KLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVF9SQU5HRSggaW5kZXhfYml0c2V0LCBfVE5MX0ZJUlNUX1RFWCwgX1ROTF9MQVNUX1RFWCApKSB7Ci0gICAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF80Rl9WSUVXUE9SVCwgVkZUMF9YWVpXICk7CisgICBpZiAoUkVOREVSSU5QVVRTX1RFU1RfUkFOR0UoaW5kZXhfYml0c2V0LCBfVE5MX0ZJUlNUX1RFWCwgX1ROTF9MQVNUX1RFWCkpIHsKKyAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9QT1MsIEVNSVRfNEZfVklFV1BPUlQsIFZGVDBfWFlaVyk7CiAgICAgICBpbnRlbC0+Y29sb3JvZmZzZXQgPSA0OwogICAgfQogICAgZWxzZSB7Ci0gICAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF8zRl9WSUVXUE9SVCwgVkZUMF9YWVogKTsKKyAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9QT1MsIEVNSVRfM0ZfVklFV1BPUlQsIFZGVDBfWFlaKTsKICAgICAgIGludGVsLT5jb2xvcm9mZnNldCA9IDM7CiAgICB9CiAKLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUgKSkgewotICAgICAgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUsIEVNSVRfMUYsIFZGVDBfUE9JTlRfV0lEVEggKTsKKyAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX1BPSU5UU0laRSkpIHsKKyAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9QT0lOVFNJWkUsIEVNSVRfMUYsIFZGVDBfUE9JTlRfV0lEVEgpOwogICAgfQogCi0gICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0NPTE9SMCwgRU1JVF80VUJfNEZfQkdSQSwgVkZUMF9ESUZGVVNFICk7Ci0gICAgICAKKyAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9DT0xPUjAsIEVNSVRfNFVCXzRGX0JHUkEsIFZGVDBfRElGRlVTRSk7CisKICAgIGludGVsLT5zcGVjb2Zmc2V0ID0gMDsKLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9DT0xPUjEgKSB8fAotICAgICAgIFJFTkRFUklOUFVUU19URVNUKCBpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0ZPRyApKSB7Ci0gICAgICBpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfQ09MT1IxICkpIHsKKyAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0NPTE9SMSkgfHwKKyAgICAgICBSRU5ERVJJTlBVVFNfVEVTVChpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0ZPRykpIHsKKyAgICAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0NPTE9SMSkpIHsKICAgICAgICAgIGludGVsLT5zcGVjb2Zmc2V0ID0gaW50ZWwtPmNvbG9yb2Zmc2V0ICsgMTsKLSAgICAgICAgIEVNSVRfQVRUUiggX1ROTF9BVFRSSUJfQ09MT1IxLCBFTUlUXzNVQl8zRl9CR1IsIFZGVDBfU1BFQyApOworICAgICAgICAgRU1JVF9BVFRSKF9UTkxfQVRUUklCX0NPTE9SMSwgRU1JVF8zVUJfM0ZfQkdSLCBWRlQwX1NQRUMpOwogICAgICAgfQogICAgICAgZWxzZQotICAgICAgICAgRU1JVF9QQUQoIDMgKTsKKyAgICAgICAgIEVNSVRfUEFEKDMpOwogCi0gICAgICBpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfRk9HICkpCi0gICAgICAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0ZPRywgRU1JVF8xVUJfMUYsIFZGVDBfU1BFQyApOworICAgICAgaWYgKFJFTkRFUklOUFVUU19URVNUKGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfRk9HKSkKKyAgICAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9GT0csIEVNSVRfMVVCXzFGLCBWRlQwX1NQRUMpOwogICAgICAgZWxzZQotICAgICAgICAgRU1JVF9QQUQoIDEgKTsKKyAgICAgICAgIEVNSVRfUEFEKDEpOwogICAgfQogCi0gICBpZiAoUkVOREVSSU5QVVRTX1RFU1RfUkFOR0UoIGluZGV4X2JpdHNldCwgX1ROTF9GSVJTVF9URVgsIF9UTkxfTEFTVF9URVggKSkgeworICAgaWYgKFJFTkRFUklOUFVUU19URVNUX1JBTkdFKGluZGV4X2JpdHNldCwgX1ROTF9GSVJTVF9URVgsIF9UTkxfTEFTVF9URVgpKSB7CiAgICAgICBpbnQgaSwgY291bnQgPSAwOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgSTgzMF9URVhfVU5JVFM7IGkrKykgewotICAgICAgICAgaWYgKFJFTkRFUklOUFVUU19URVNUKCBpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX1RFWChpKSApKSB7CisgICAgICAgICBpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9URVgoaSkpKSB7CiAgICAgICAgICAgICBHTHVpbnQgc3ogPSBWQi0+VGV4Q29vcmRQdHJbaV0tPnNpemU7CiAgICAgICAgICAgICBHTHVpbnQgZW1pdDsKLSAgICAgICAgICAgIEdMdWludCBtY3MgPSAoaTgzMC0+c3RhdGUuVGV4W2ldW0k4MzBfVEVYUkVHX01DU10gJiAKKyAgICAgICAgICAgIEdMdWludCBtY3MgPSAoaTgzMC0+c3RhdGUuVGV4W2ldW0k4MzBfVEVYUkVHX01DU10gJgogICAgICAgICAgICAgICAgICAgICAgICAgICB+VEVYQ09PUkRUWVBFX01BU0spOwogCi0JICAgIHN3aXRjaCAoc3opIHsKLQkgICAgY2FzZSAxOiAKLQkgICAgY2FzZSAyOiAKLQkgICAgICAgZW1pdCA9IEVNSVRfMkY7IAotCSAgICAgICBzeiA9IDI7IAotCSAgICAgICBtY3MgfD0gVEVYQ09PUkRUWVBFX0NBUlRFU0lBTjsgCi0JICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgIGVtaXQgPSBFTUlUXzNGOyAKLQkgICAgICAgc3ogPSAzOwotCSAgICAgICBtY3MgfD0gVEVYQ09PUkRUWVBFX1ZFQ1RPUjsKLQkgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDogCi0JICAgICAgIGVtaXQgPSBFTUlUXzNGX1hZVzsgCi0JICAgICAgIHN6ID0gMzsgICAgIAotCSAgICAgICBtY3MgfD0gVEVYQ09PUkRUWVBFX0hPTU9HRU5FT1VTOwotCSAgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDogCi0JICAgICAgIGNvbnRpbnVlOwotCSAgICB9OwotCSAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChzeikgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgZW1pdCA9IEVNSVRfMkY7CisgICAgICAgICAgICAgICBzeiA9IDI7CisgICAgICAgICAgICAgICBtY3MgfD0gVEVYQ09PUkRUWVBFX0NBUlRFU0lBTjsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgZW1pdCA9IEVNSVRfM0Y7CisgICAgICAgICAgICAgICBzeiA9IDM7CisgICAgICAgICAgICAgICBtY3MgfD0gVEVYQ09PUkRUWVBFX1ZFQ1RPUjsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgZW1pdCA9IEVNSVRfM0ZfWFlXOworICAgICAgICAgICAgICAgc3ogPSAzOworICAgICAgICAgICAgICAgbWNzIHw9IFRFWENPT1JEVFlQRV9IT01PR0VORU9VUzsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfTsKIAotCSAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1RFWDAraSwgZW1pdCwgMCApOwkgICAgICAgCi0JICAgIHYyIHw9IFZSVFhfVEVYX1NFVF9GTVQoY291bnQsIFNaX1RPX0hXKHN6KSk7Ci0JICAgIG1jc2IxIHw9IChjb3VudCs4KTw8KGkqNCk7CiAKLQkgICAgaWYgKG1jcyAhPSBpODMwLT5zdGF0ZS5UZXhbaV1bSTgzMF9URVhSRUdfTUNTXSkgewotCSAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1RFWChpKSk7Ci0JICAgICAgIGk4MzAtPnN0YXRlLlRleFtpXVtJODMwX1RFWFJFR19NQ1NdID0gbWNzOwotCSAgICB9CisgICAgICAgICAgICBFTUlUX0FUVFIoX1ROTF9BVFRSSUJfVEVYMCArIGksIGVtaXQsIDApOworICAgICAgICAgICAgdjIgfD0gVlJUWF9URVhfU0VUX0ZNVChjb3VudCwgU1pfVE9fSFcoc3opKTsKKyAgICAgICAgICAgIG1jc2IxIHw9IChjb3VudCArIDgpIDw8IChpICogNCk7CiAKLQkgICAgY291bnQrKzsKLQkgfQorICAgICAgICAgICAgaWYgKG1jcyAhPSBpODMwLT5zdGF0ZS5UZXhbaV1bSTgzMF9URVhSRUdfTUNTXSkgeworICAgICAgICAgICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9URVgoaSkpOworICAgICAgICAgICAgICAgaTgzMC0+c3RhdGUuVGV4W2ldW0k4MzBfVEVYUkVHX01DU10gPSBtY3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIHYwIHw9IFZGVDBfVEVYX0NPVU5UKGNvdW50KTsKICAgIH0KLSAgIAorCiAgICAvKiBPbmx5IG5lZWQgdG8gY2hhbmdlIHRoZSB2ZXJ0ZXggZW1pdCBjb2RlIGlmIHRoZXJlIGhhcyBiZWVuIGEKICAgICAqIHN0YXRlY2hhbmdlIHRvIGEgbmV3IGhhcmR3YXJlIHZlcnRleCBmb3JtYXQ6CiAgICAgKi8KICAgIGlmICh2MCAhPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfVkZdIHx8CiAgICAgICAgdjIgIT0gaTgzMC0+c3RhdGUuQ3R4W0k4MzBfQ1RYUkVHX1ZGMl0gfHwKICAgICAgICBtY3NiMSAhPSBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfTUNTQjFdIHx8Ci0gICAgICAgIVJFTkRFUklOUFVUU19FUVVBTCggaW5kZXhfYml0c2V0LCBpODMwLT5sYXN0X2luZGV4X2JpdHNldCApKSB7Ci0gICAgCi0gICAgICBJODMwX1NUQVRFQ0hBTkdFKCBpODMwLCBJODMwX1VQTE9BRF9DVFggKTsKKyAgICAgICAhUkVOREVSSU5QVVRTX0VRVUFMKGluZGV4X2JpdHNldCwgaTgzMC0+bGFzdF9pbmRleF9iaXRzZXQpKSB7CisgICAgICBpbnQgazsKKworICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9DVFgpOwogCiAgICAgICAvKiBNdXN0IGRvIHRoaXMgKmFmdGVyKiBzdGF0ZWNoYW5nZSwgc28gYXMgbm90IHRvIGFmZmVjdAogICAgICAgICogYnVmZmVyZWQgdmVydGljZXMgcmVsaWFudCBvbiB0aGUgb2xkIHN0YXRlOgogICAgICAgICovCi0gICAgICBpbnRlbC0+dmVydGV4X3NpemUgPSAKLQkgX3RubF9pbnN0YWxsX2F0dHJzKCBjdHgsIAotCQkJICAgICBpbnRlbC0+dmVydGV4X2F0dHJzLCAKLQkJCSAgICAgaW50ZWwtPnZlcnRleF9hdHRyX2NvdW50LAotCQkJICAgICBpbnRlbC0+Vmlld3BvcnRNYXRyaXgubSwgMCApOworICAgICAgaW50ZWwtPnZlcnRleF9zaXplID0KKyAgICAgICAgIF90bmxfaW5zdGFsbF9hdHRycyhjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPnZlcnRleF9hdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+dmVydGV4X2F0dHJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPlZpZXdwb3J0TWF0cml4Lm0sIDApOwogCiAgICAgICBpbnRlbC0+dmVydGV4X3NpemUgPj49IDI7CiAKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19WRl0gPSB2MDsKICAgICAgIGk4MzAtPnN0YXRlLkN0eFtJODMwX0NUWFJFR19WRjJdID0gdjI7CiAgICAgICBpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfTUNTQjFdID0gbWNzYjE7Ci0gICAgICBSRU5ERVJJTlBVVFNfQ09QWSggaTgzMC0+bGFzdF9pbmRleF9iaXRzZXQsIGluZGV4X2JpdHNldCApOworICAgICAgUkVOREVSSU5QVVRTX0NPUFkoaTgzMC0+bGFzdF9pbmRleF9iaXRzZXQsIGluZGV4X2JpdHNldCk7CiAKLSAgICAgIGFzc2VydChpODMwX2NoZWNrX3ZlcnRleF9zaXplKCBpbnRlbCwgaW50ZWwtPnZlcnRleF9zaXplICkpOworICAgICAgayA9IGk4MzBfY2hlY2tfdmVydGV4X3NpemUoaW50ZWwsIGludGVsLT52ZXJ0ZXhfc2l6ZSk7CisgICAgICBhc3NlcnQoayk7CiAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfcmVkdWNlZF9wcmltaXRpdmVfc3RhdGUoIGludGVsQ29udGV4dFB0ciBpbnRlbCwKLQkJCQkJICBHTGVudW0gcnByaW0gKQorc3RhdGljIHZvaWQKK2k4MzBfcmVkdWNlZF9wcmltaXRpdmVfc3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGVudW0gcnByaW0pCiB7Ci0gICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChpbnRlbCk7Ci0gICAgR0x1aW50IHN0MSA9IGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOworICAgR0x1aW50IHN0MSA9IGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXTsKIAotICAgIHN0MSAmPSB+U1QxX0VOQUJMRTsKKyAgIHN0MSAmPSB+U1QxX0VOQUJMRTsKIAotICAgIHN3aXRjaCAocnByaW0pIHsKLSAgICBjYXNlIEdMX1RSSUFOR0xFUzoKLSAgICAgICBpZiAoaW50ZWwtPmN0eC5Qb2x5Z29uLlN0aXBwbGVGbGFnICYmCi0JICAgaW50ZWwtPmh3X3N0aXBwbGUpCi0JICBzdDEgfD0gU1QxX0VOQUJMRTsKLSAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJTkVTOgotICAgIGNhc2UgR0xfUE9JTlRTOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgYnJlYWs7Ci0gICAgfQorICAgc3dpdGNoIChycHJpbSkgeworICAgY2FzZSBHTF9UUklBTkdMRVM6CisgICAgICBpZiAoaW50ZWwtPmN0eC5Qb2x5Z29uLlN0aXBwbGVGbGFnICYmIGludGVsLT5od19zdGlwcGxlKQorICAgICAgICAgc3QxIHw9IFNUMV9FTkFCTEU7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfTElORVM6CisgICBjYXNlIEdMX1BPSU5UUzoKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KIAotICAgIGk4MzAtPmludGVsLnJlZHVjZWRfcHJpbWl0aXZlID0gcnByaW07CisgICBpODMwLT5pbnRlbC5yZWR1Y2VkX3ByaW1pdGl2ZSA9IHJwcmltOwogCi0gICAgaWYgKHN0MSAhPSBpODMwLT5zdGF0ZS5TdGlwcGxlW0k4MzBfU1RQUkVHX1NUMV0pIHsKLSAgICAgICBJODMwX1NUQVRFQ0hBTkdFKGk4MzAsIEk4MzBfVVBMT0FEX1NUSVBQTEUpOwotICAgICAgIGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXSA9IHN0MTsKLSAgICB9CisgICBpZiAoc3QxICE9IGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXSkgeworICAgICAgSU5URUxfRklSRVZFUlRJQ0VTKGludGVsKTsKKworICAgICAgSTgzMF9TVEFURUNIQU5HRShpODMwLCBJODMwX1VQTE9BRF9TVElQUExFKTsKKyAgICAgIGk4MzAtPnN0YXRlLlN0aXBwbGVbSTgzMF9TVFBSRUdfU1QxXSA9IHN0MTsKKyAgIH0KIH0KIAogLyogUHVsbCBhcGFydCB0aGUgdmVydGV4IGZvcm1hdCByZWdpc3RlcnMgYW5kIGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEKICAqIHZlcnRleCBpcyBzdXBwb3NlZCB0byBiZS4gCiAgKi8KLXN0YXRpYyBHTGJvb2xlYW4gaTgzMF9jaGVja192ZXJ0ZXhfc2l6ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCQkgR0x1aW50IGV4cGVjdGVkICkKK3N0YXRpYyBHTGJvb2xlYW4KK2k4MzBfY2hlY2tfdmVydGV4X3NpemUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgZXhwZWN0ZWQpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGludGVsKTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOwogICAgaW50IHZmdDAgPSBpODMwLT5jdXJyZW50LT5DdHhbSTgzMF9DVFhSRUdfVkZdOwogICAgaW50IHZmdDEgPSBpODMwLT5jdXJyZW50LT5DdHhbSTgzMF9DVFhSRUdfVkYyXTsKICAgIGludCBucnRleCA9ICh2ZnQwICYgVkZUMF9URVhfQ09VTlRfTUFTSykgPj4gVkZUMF9URVhfQ09VTlRfU0hJRlQ7CiAgICBpbnQgaSwgc3ogPSAwOwogCiAgICBzd2l0Y2ggKHZmdDAgJiBWRlQwX1hZWldfTUFTSykgewotICAgY2FzZSBWRlQwX1hZOiBzeiA9IDI7IGJyZWFrOwotICAgY2FzZSBWRlQwX1hZWjogc3ogPSAzOyBicmVhazsKLSAgIGNhc2UgVkZUMF9YWVc6IHN6ID0gMzsgYnJlYWs7Ci0gICBjYXNlIFZGVDBfWFlaVzogc3ogPSA0OyBicmVhazsKLSAgIGRlZmF1bHQ6IAorICAgY2FzZSBWRlQwX1hZOgorICAgICAgc3ogPSAyOworICAgICAgYnJlYWs7CisgICBjYXNlIFZGVDBfWFlaOgorICAgICAgc3ogPSAzOworICAgICAgYnJlYWs7CisgICBjYXNlIFZGVDBfWFlXOgorICAgICAgc3ogPSAzOworICAgICAgYnJlYWs7CisgICBjYXNlIFZGVDBfWFlaVzoKKyAgICAgIHN6ID0gNDsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8geHl6dyBzcGVjaWZpZWRcbiIpOwogICAgICAgcmV0dXJuIDA7CiAgICB9CiAKLSAgIGlmICh2ZnQwICYgVkZUMF9TUEVDKSBzeisrOwotICAgaWYgKHZmdDAgJiBWRlQwX0RJRkZVU0UpIHN6Kys7Ci0gICBpZiAodmZ0MCAmIFZGVDBfREVQVEhfT0ZGU0VUKSBzeisrOwotICAgaWYgKHZmdDAgJiBWRlQwX1BPSU5UX1dJRFRIKSBzeisrOwotCQotICAgZm9yIChpID0gMCA7IGkgPCBucnRleCA7IGkrKykgeyAKKyAgIGlmICh2ZnQwICYgVkZUMF9TUEVDKQorICAgICAgc3orKzsKKyAgIGlmICh2ZnQwICYgVkZUMF9ESUZGVVNFKQorICAgICAgc3orKzsKKyAgIGlmICh2ZnQwICYgVkZUMF9ERVBUSF9PRkZTRVQpCisgICAgICBzeisrOworICAgaWYgKHZmdDAgJiBWRlQwX1BPSU5UX1dJRFRIKQorICAgICAgc3orKzsKKworICAgZm9yIChpID0gMDsgaSA8IG5ydGV4OyBpKyspIHsKICAgICAgIHN3aXRjaCAodmZ0MSAmIFZGVDFfVEVYMF9NQVNLKSB7Ci0gICAgICBjYXNlIFRFWENPT1JERk1UXzJEOiBzeiArPSAyOyBicmVhazsKLSAgICAgIGNhc2UgVEVYQ09PUkRGTVRfM0Q6IHN6ICs9IDM7IGJyZWFrOwotICAgICAgY2FzZSBURVhDT09SREZNVF80RDogc3ogKz0gNDsgYnJlYWs7Ci0gICAgICBjYXNlIFRFWENPT1JERk1UXzFEOiBzeiArPSAxOyBicmVhazsKKyAgICAgIGNhc2UgVEVYQ09PUkRGTVRfMkQ6CisgICAgICAgICBzeiArPSAyOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRFWENPT1JERk1UXzNEOgorICAgICAgICAgc3ogKz0gMzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBURVhDT09SREZNVF80RDoKKyAgICAgICAgIHN6ICs9IDQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVYQ09PUkRGTVRfMUQ6CisgICAgICAgICBzeiArPSAxOworICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICB2ZnQxID4+PSBWRlQxX1RFWDFfU0hJRlQ7CiAgICB9Ci0JCi0gICBpZiAoc3ogIT0gZXhwZWN0ZWQpIAorCisgICBpZiAoc3ogIT0gZXhwZWN0ZWQpCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgInZlcnRleCBzaXplIG1pc21hdGNoICVkLyVkXG4iLCBzeiwgZXhwZWN0ZWQpOwotICAgCisKICAgIHJldHVybiBzeiA9PSBleHBlY3RlZDsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9lbWl0X2ludmFyaWVudF9zdGF0ZSggaW50ZWxDb250ZXh0UHRyIGludGVsICkKK3N0YXRpYyB2b2lkCitpODMwX2VtaXRfaW52YXJpZW50X3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKICAgIEJBVENIX0xPQ0FMUzsKIAotICAgQkVHSU5fQkFUQ0goIDQwICk7Ci0KLSAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKDApKTsKLSAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKDEpKTsKLSAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKDIpKTsKLSAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfQ1VCRSB8IE1BUF9VTklUKDMpKTsKKyAgIEJFR0lOX0JBVENIKDQwLCBJR05PUkVfQ0xJUFJFQ1RTKTsKIAogICAgT1VUX0JBVENIKF8zRFNUQVRFX0RGTFRfRElGRlVTRV9DTUQpOwogICAgT1VUX0JBVENIKDApOwpAQCAtMjgyLDM3ICszMTAsMzUgQEAKIAogICAgT1VUX0JBVENIKF8zRFNUQVRFX0ZPR19NT0RFX0NNRCk7CiAgICBPVVRfQkFUQ0goRk9HRlVOQ19FTkFCTEUgfAotCSAgICAgRk9HX0xJTkVBUl9DT05TVCB8IAotCSAgICAgRk9HU1JDX0lOREVYX1ogfCAKLQkgICAgIEVOQUJMRV9GT0dfREVOU0lUWSk7CisgICAgICAgICAgICAgRk9HX0xJTkVBUl9DT05TVCB8IEZPR1NSQ19JTkRFWF9aIHwgRU5BQkxFX0ZPR19ERU5TSVRZKTsKICAgIE9VVF9CQVRDSCgwKTsKICAgIE9VVF9CQVRDSCgwKTsKIAogCiAgICBPVVRfQkFUQ0goXzNEU1RBVEVfTUFQX1RFWF9TVFJFQU1fQ01EIHwKLQkgICAgIE1BUF9VTklUKDApIHwKLQkgICAgIERJU0FCTEVfVEVYX1NUUkVBTV9CVU1QIHwKLQkgICAgIEVOQUJMRV9URVhfU1RSRUFNX0NPT1JEX1NFVCB8Ci0JICAgICBURVhfU1RSRUFNX0NPT1JEX1NFVCgwKSB8Ci0JICAgICBFTkFCTEVfVEVYX1NUUkVBTV9NQVBfSURYIHwgVEVYX1NUUkVBTV9NQVBfSURYKDApKTsKKyAgICAgICAgICAgICBNQVBfVU5JVCgwKSB8CisgICAgICAgICAgICAgRElTQUJMRV9URVhfU1RSRUFNX0JVTVAgfAorICAgICAgICAgICAgIEVOQUJMRV9URVhfU1RSRUFNX0NPT1JEX1NFVCB8CisgICAgICAgICAgICAgVEVYX1NUUkVBTV9DT09SRF9TRVQoMCkgfAorICAgICAgICAgICAgIEVOQUJMRV9URVhfU1RSRUFNX01BUF9JRFggfCBURVhfU1RSRUFNX01BUF9JRFgoMCkpOwogICAgT1VUX0JBVENIKF8zRFNUQVRFX01BUF9URVhfU1RSRUFNX0NNRCB8Ci0JICAgICBNQVBfVU5JVCgxKSB8Ci0JICAgICBESVNBQkxFX1RFWF9TVFJFQU1fQlVNUCB8Ci0JICAgICBFTkFCTEVfVEVYX1NUUkVBTV9DT09SRF9TRVQgfAotCSAgICAgVEVYX1NUUkVBTV9DT09SRF9TRVQoMSkgfAotCSAgICAgRU5BQkxFX1RFWF9TVFJFQU1fTUFQX0lEWCB8IFRFWF9TVFJFQU1fTUFQX0lEWCgxKSk7CisgICAgICAgICAgICAgTUFQX1VOSVQoMSkgfAorICAgICAgICAgICAgIERJU0FCTEVfVEVYX1NUUkVBTV9CVU1QIHwKKyAgICAgICAgICAgICBFTkFCTEVfVEVYX1NUUkVBTV9DT09SRF9TRVQgfAorICAgICAgICAgICAgIFRFWF9TVFJFQU1fQ09PUkRfU0VUKDEpIHwKKyAgICAgICAgICAgICBFTkFCTEVfVEVYX1NUUkVBTV9NQVBfSURYIHwgVEVYX1NUUkVBTV9NQVBfSURYKDEpKTsKICAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfVEVYX1NUUkVBTV9DTUQgfAotCSAgICAgTUFQX1VOSVQoMikgfAotCSAgICAgRElTQUJMRV9URVhfU1RSRUFNX0JVTVAgfAotCSAgICAgRU5BQkxFX1RFWF9TVFJFQU1fQ09PUkRfU0VUIHwKLQkgICAgIFRFWF9TVFJFQU1fQ09PUkRfU0VUKDIpIHwKLQkgICAgIEVOQUJMRV9URVhfU1RSRUFNX01BUF9JRFggfCBURVhfU1RSRUFNX01BUF9JRFgoMikpOworICAgICAgICAgICAgIE1BUF9VTklUKDIpIHwKKyAgICAgICAgICAgICBESVNBQkxFX1RFWF9TVFJFQU1fQlVNUCB8CisgICAgICAgICAgICAgRU5BQkxFX1RFWF9TVFJFQU1fQ09PUkRfU0VUIHwKKyAgICAgICAgICAgICBURVhfU1RSRUFNX0NPT1JEX1NFVCgyKSB8CisgICAgICAgICAgICAgRU5BQkxFX1RFWF9TVFJFQU1fTUFQX0lEWCB8IFRFWF9TVFJFQU1fTUFQX0lEWCgyKSk7CiAgICBPVVRfQkFUQ0goXzNEU1RBVEVfTUFQX1RFWF9TVFJFQU1fQ01EIHwKLQkgICAgIE1BUF9VTklUKDMpIHwKLQkgICAgIERJU0FCTEVfVEVYX1NUUkVBTV9CVU1QIHwKLQkgICAgIEVOQUJMRV9URVhfU1RSRUFNX0NPT1JEX1NFVCB8Ci0JICAgICBURVhfU1RSRUFNX0NPT1JEX1NFVCgzKSB8Ci0JICAgICBFTkFCTEVfVEVYX1NUUkVBTV9NQVBfSURYIHwgVEVYX1NUUkVBTV9NQVBfSURYKDMpKTsKKyAgICAgICAgICAgICBNQVBfVU5JVCgzKSB8CisgICAgICAgICAgICAgRElTQUJMRV9URVhfU1RSRUFNX0JVTVAgfAorICAgICAgICAgICAgIEVOQUJMRV9URVhfU1RSRUFNX0NPT1JEX1NFVCB8CisgICAgICAgICAgICAgVEVYX1NUUkVBTV9DT09SRF9TRVQoMykgfAorICAgICAgICAgICAgIEVOQUJMRV9URVhfU1RSRUFNX01BUF9JRFggfCBURVhfU1RSRUFNX01BUF9JRFgoMykpOwogCiAgICBPVVRfQkFUQ0goXzNEU1RBVEVfTUFQX0NPT1JEX1RSQU5TRk9STSk7CiAgICBPVVRfQkFUQ0goRElTQUJMRV9URVhfVFJBTlNGT1JNIHwgVEVYVFVSRV9TRVQoMCkpOwpAQCAtMzI0LDIxICszNTAsMTMgQEAKICAgIE9VVF9CQVRDSChESVNBQkxFX1RFWF9UUkFOU0ZPUk0gfCBURVhUVVJFX1NFVCgzKSk7CiAKICAgIE9VVF9CQVRDSChfM0RTVEFURV9SQVNURVJfUlVMRVNfQ01EIHwKLQkgICAgIEVOQUJMRV9QT0lOVF9SQVNURVJfUlVMRSB8Ci0JICAgICBPR0xfUE9JTlRfUkFTVEVSX1JVTEUgfAotCSAgICAgRU5BQkxFX0xJTkVfU1RSSVBfUFJPVk9LRV9WUlRYIHwKLQkgICAgIEVOQUJMRV9UUklfRkFOX1BST1ZPS0VfVlJUWCB8Ci0JICAgICBFTkFCTEVfVFJJX1NUUklQX1BST1ZPS0VfVlJUWCB8Ci0JICAgICBMSU5FX1NUUklQX1BST1ZPS0VfVlJUWCgxKSB8Ci0JICAgICBUUklfRkFOX1BST1ZPS0VfVlJUWCgyKSB8IAotCSAgICAgVFJJX1NUUklQX1BST1ZPS0VfVlJUWCgyKSk7Ci0KLSAgIE9VVF9CQVRDSChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfCAKLQkgICAgIERJU0FCTEVfU0NJU1NPUl9SRUNUKTsKLQotICAgT1VUX0JBVENIKF8zRFNUQVRFX1NDSVNTT1JfUkVDVF8wX0NNRCk7Ci0gICBPVVRfQkFUQ0goMCk7Ci0gICBPVVRfQkFUQ0goMCk7CisgICAgICAgICAgICAgRU5BQkxFX1BPSU5UX1JBU1RFUl9SVUxFIHwKKyAgICAgICAgICAgICBPR0xfUE9JTlRfUkFTVEVSX1JVTEUgfAorICAgICAgICAgICAgIEVOQUJMRV9MSU5FX1NUUklQX1BST1ZPS0VfVlJUWCB8CisgICAgICAgICAgICAgRU5BQkxFX1RSSV9GQU5fUFJPVk9LRV9WUlRYIHwKKyAgICAgICAgICAgICBFTkFCTEVfVFJJX1NUUklQX1BST1ZPS0VfVlJUWCB8CisgICAgICAgICAgICAgTElORV9TVFJJUF9QUk9WT0tFX1ZSVFgoMSkgfAorICAgICAgICAgICAgIFRSSV9GQU5fUFJPVk9LRV9WUlRYKDIpIHwgVFJJX1NUUklQX1BST1ZPS0VfVlJUWCgyKSk7CiAKICAgIE9VVF9CQVRDSChfM0RTVEFURV9WRVJURVhfVFJBTlNGT1JNKTsKICAgIE9VVF9CQVRDSChESVNBQkxFX1ZJRVdQT1JUX1RSQU5TRk9STSB8IERJU0FCTEVfUEVSU1BFQ1RJVkVfRElWSURFKTsKQEAgLTM0OSw0NSArMzY3LDQ2IEBACiAKIAogICAgT1VUX0JBVENIKF8zRFNUQVRFX0NPTE9SX0ZBQ1RPUl9DTUQpOwotICAgT1VUX0JBVENIKDB4ODA4MDgwODApOwkvKiAuNSByZXF1aXJlZCBpbiBhbHBoYSBmb3IgR0xfRE9UM19SR0JBX0VYVCAqLworICAgT1VUX0JBVENIKDB4ODA4MDgwODApOyAgICAgICAvKiAuNSByZXF1aXJlZCBpbiBhbHBoYSBmb3IgR0xfRE9UM19SR0JBX0VYVCAqLwogCiAgICBBRFZBTkNFX0JBVENIKCk7CiB9CiAKIAogI2RlZmluZSBlbWl0KCBpbnRlbCwgc3RhdGUsIHNpemUgKQkJCVwKLWRvIHsJCQkJCQkJXAotICAgaW50IGs7CQkJCQkJXAotICAgQkVHSU5fQkFUQ0goIHNpemUgLyBzaXplb2YoR0x1aW50KSk7CQkJXAotICAgZm9yIChrID0gMCA7IGsgPCBzaXplIC8gc2l6ZW9mKEdMdWludCkgOyBrKyspCVwKLSAgICAgIE9VVF9CQVRDSChzdGF0ZVtrXSk7CQkJCVwKLSAgIEFEVkFOQ0VfQkFUQ0goKTsJCQkJCVwKLX0gd2hpbGUgKDApOworICAgaW50ZWxfYmF0Y2hidWZmZXJfZGF0YShpbnRlbC0+YmF0Y2gsIHN0YXRlLCBzaXplLCBJR05PUkVfQ0xJUFJFQ1RTICkKIAotc3RhdGljIEdMdWludCBnZXRfc3RhdGVfc2l6ZSggc3RydWN0IGk4MzBfaHdfc3RhdGUgKnN0YXRlICkKK3N0YXRpYyBHTHVpbnQKK2dldF9kaXJ0eShzdHJ1Y3QgaTgzMF9od19zdGF0ZSAqc3RhdGUpCiB7Ci0gICBHTHVpbnQgZGlydHkgPSBzdGF0ZS0+YWN0aXZlICYgfnN0YXRlLT5lbWl0dGVkOworICAgcmV0dXJuIHN0YXRlLT5hY3RpdmUgJiB+c3RhdGUtPmVtaXR0ZWQ7Cit9CisKK3N0YXRpYyBHTHVpbnQKK2dldF9zdGF0ZV9zaXplKHN0cnVjdCBpODMwX2h3X3N0YXRlICpzdGF0ZSkKK3sKKyAgIEdMdWludCBkaXJ0eSA9IGdldF9kaXJ0eShzdGF0ZSk7CiAgICBHTHVpbnQgc3ogPSAwOwogICAgR0x1aW50IGk7CiAKICAgIGlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0lOVkFSSUVOVCkKICAgICAgIHN6ICs9IDQwICogc2l6ZW9mKGludCk7CiAKLSAgIGlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0NUWCkgCisgICBpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9DVFgpCiAgICAgICBzeiArPSBzaXplb2Yoc3RhdGUtPkN0eCk7CiAKLSAgIGlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0JVRkZFUlMpIAorICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfQlVGRkVSUykKICAgICAgIHN6ICs9IHNpemVvZihzdGF0ZS0+QnVmZmVyKTsKIAotICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfU1RJUFBMRSkgCisgICBpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9TVElQUExFKQogICAgICAgc3ogKz0gc2l6ZW9mKHN0YXRlLT5TdGlwcGxlKTsKIAogICAgZm9yIChpID0gMDsgaSA8IEk4MzBfVEVYX1VOSVRTOyBpKyspIHsKLSAgICAgIGlmICgoZGlydHkgJiBJODMwX1VQTE9BRF9URVgoaSkpKSAgCi0JIHN6ICs9IHNpemVvZihzdGF0ZS0+VGV4W2ldKTsgCisgICAgICBpZiAoKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYKGkpKSkKKyAgICAgICAgIHN6ICs9IHNpemVvZihzdGF0ZS0+VGV4W2ldKTsKIAotICAgICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQoaSkpIAotCSBzeiArPSBzdGF0ZS0+VGV4QmxlbmRXb3Jkc1VzZWRbaV0gKiA0OworICAgICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQoaSkpCisgICAgICAgICBzeiArPSBzdGF0ZS0+VGV4QmxlbmRXb3Jkc1VzZWRbaV0gKiA0OwogICAgfQogCiAgICByZXR1cm4gc3o7CkBAIC0zOTYsMTM5ICs0MTUsMzEyIEBACiAKIC8qIFB1c2ggdGhlIHN0YXRlIGludG8gdGhlIHNhcmVhIGFuZC9vciB0ZXh0dXJlIG1lbW9yeS4KICAqLwotc3RhdGljIHZvaWQgaTgzMF9lbWl0X3N0YXRlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQorc3RhdGljIHZvaWQKK2k4MzBfZW1pdF9zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCiB7Ci0gICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGludGVsKTsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOwogICAgc3RydWN0IGk4MzBfaHdfc3RhdGUgKnN0YXRlID0gaTgzMC0+Y3VycmVudDsKLSAgIGludCBpOwotICAgR0x1aW50IGRpcnR5ID0gc3RhdGUtPmFjdGl2ZSAmIH5zdGF0ZS0+ZW1pdHRlZDsKLSAgIEdMdWludCBjb3VudGVyID0gaW50ZWwtPmJhdGNoLmNvdW50ZXI7CisgICBpbnQgaSwgY291bnQ7CisgICBHTHVpbnQgZGlydHk7CisgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CiAgICBCQVRDSF9MT0NBTFM7CisgICBkcmlfYm8gKmFwZXJfYXJyYXlbMyArIEk4MzBfVEVYX1VOSVRTXTsKKyAgIGludCBhcGVyX2NvdW50OwogCi0gICBpZiAoaW50ZWwtPmJhdGNoLnNwYWNlIDwgZ2V0X3N0YXRlX3NpemUoc3RhdGUpKSB7Ci0gICAgICBpbnRlbEZsdXNoQmF0Y2goaW50ZWwsIEdMX1RSVUUpOwotICAgICAgZGlydHkgPSBzdGF0ZS0+YWN0aXZlICYgfnN0YXRlLT5lbWl0dGVkOwotICAgICAgY291bnRlciA9IGludGVsLT5iYXRjaC5jb3VudGVyOworICAgLyogV2UgZG9uJ3QgaG9sZCB0aGUgbG9jayBhdCB0aGlzIHBvaW50LCBzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgKiB0aGVyZSB3b24ndCBiZSBhIGJ1ZmZlciB3cmFwIGJldHdlZW4gdGhlIHN0YXRlIGVtaXRzIGFuZCB0aGUgcHJpbWl0aXZlCisgICAgKiBlbWl0IGhlYWRlci4KKyAgICAqCisgICAgKiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gdGFsayBhYm91dCBleHBsaWNpdCBwbGFjZXMgd2hlcmUKKyAgICAqIHNjaGVkdWxpbmcgaXMgYWxsb3dlZCwgcmF0aGVyIHRoYW4gYXNzdW1lIHRoYXQgaXQgaXMgd2hlbmV2ZXIgYQorICAgICogYmF0Y2hidWZmZXIgZmlsbHMgdXAuCisgICAgKgorICAgICogU2V0IHRoZSBzcGFjZSBhcyBMT09QX0NMSVBSRUNUUyBub3csIHNpbmNlIHRoYXQncyB3aGF0IG91ciBwcmltaXRpdmVzCisgICAgKiB3aWxsIGJlIGVtaXR0ZWQgdW5kZXIuCisgICAgKi8KKyAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoaW50ZWwtPmJhdGNoLAorCQkJCSAgIGdldF9zdGF0ZV9zaXplKHN0YXRlKSArIElOVEVMX1BSSU1fRU1JVF9TSVpFLAorCQkJCSAgIExPT1BfQ0xJUFJFQ1RTKTsKKyAgIGNvdW50ID0gMDsKKyBhZ2FpbjoKKyAgIGFwZXJfY291bnQgPSAwOworICAgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOworCisgICBhcGVyX2FycmF5W2FwZXJfY291bnQrK10gPSBpbnRlbC0+YmF0Y2gtPmJ1ZjsKKyAgIGlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0JVRkZFUlMpIHsKKyAgICAgIGFwZXJfYXJyYXlbYXBlcl9jb3VudCsrXSA9IHN0YXRlLT5kcmF3X3JlZ2lvbi0+YnVmZmVyOworICAgICAgYXBlcl9hcnJheVthcGVyX2NvdW50KytdID0gc3RhdGUtPmRlcHRoX3JlZ2lvbi0+YnVmZmVyOwogICAgfQogCisgICBmb3IgKGkgPSAwOyBpIDwgSTgzMF9URVhfVU5JVFM7IGkrKykKKyAgICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYKGkpKSB7CisJaWYgKHN0YXRlLT50ZXhfYnVmZmVyW2ldKSB7CisJICAgYXBlcl9hcnJheVthcGVyX2NvdW50KytdID0gc3RhdGUtPnRleF9idWZmZXJbaV07CisJfQorICAgICB9CisKKyAgIGlmIChkcmlfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGFwZXJfYXJyYXksIGFwZXJfY291bnQpKSB7CisgICAgICAgaWYgKGNvdW50ID09IDApIHsKKwkgICBjb3VudCsrOworCSAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CisJICAgZ290byBhZ2FpbjsKKyAgICAgICB9IGVsc2UgeworCSAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImk4MzAgZW1pdCBzdGF0ZSIpOworCSAgIGFzc2VydCgwKTsKKyAgICAgICB9CisgICB9CisKKworICAgLyogRG8gdGhpcyBoZXJlIGFzIHdlIG1heSBoYXZlIGZsdXNoZWQgdGhlIGJhdGNoYnVmZmVyIGFib3ZlLAorICAgICogY2F1c2luZyBtb3JlIHN0YXRlIHRvIGJlIGRpcnR5IQorICAgICovCisgICBkaXJ0eSA9IGdldF9kaXJ0eShzdGF0ZSk7CisgICBzdGF0ZS0+ZW1pdHRlZCB8PSBkaXJ0eTsKKyAgIGFzc2VydChnZXRfZGlydHkoc3RhdGUpID09IDApOworCiAgICBpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9JTlZBUklFTlQpIHsKLSAgICAgIGlmIChWRVJCT1NFKSBmcHJpbnRmKHN0ZGVyciwgIkk4MzBfVVBMT0FEX0lOVkFSSUVOVDpcbiIpOyAKLSAgICAgIGk4MzBfZW1pdF9pbnZhcmllbnRfc3RhdGUoIGludGVsICk7CisgICAgICBEQkcoIkk4MzBfVVBMT0FEX0lOVkFSSUVOVDpcbiIpOworICAgICAgaTgzMF9lbWl0X2ludmFyaWVudF9zdGF0ZShpbnRlbCk7CiAgICB9CiAKICAgIGlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX0NUWCkgewotICAgICAgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTgzMF9VUExPQURfQ1RYOlxuIik7IAotICAgICAgZW1pdCggaTgzMCwgc3RhdGUtPkN0eCwgc2l6ZW9mKHN0YXRlLT5DdHgpICk7CisgICAgICBEQkcoIkk4MzBfVVBMT0FEX0NUWDpcbiIpOworICAgICAgZW1pdChpbnRlbCwgc3RhdGUtPkN0eCwgc2l6ZW9mKHN0YXRlLT5DdHgpKTsKKwogICAgfQogCiAgICBpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9CVUZGRVJTKSB7Ci0gICAgICBpZiAoVkVSQk9TRSkgZnByaW50ZihzdGRlcnIsICJJODMwX1VQTE9BRF9CVUZGRVJTOlxuIik7IAotICAgICAgZW1pdCggaTgzMCwgc3RhdGUtPkJ1ZmZlciwgc2l6ZW9mKHN0YXRlLT5CdWZmZXIpICk7Ci0gICB9CisgICAgICBEQkcoIkk4MzBfVVBMT0FEX0JVRkZFUlM6XG4iKTsKKyAgICAgIEJFR0lOX0JBVENIKEk4MzBfREVTVF9TRVRVUF9TSVpFICsgMiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJODMwX0RFU1RSRUdfQ0JVRkFERFIwXSk7CisgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJODMwX0RFU1RSRUdfQ0JVRkFERFIxXSk7CisgICAgICBPVVRfUkVMT0Moc3RhdGUtPmRyYXdfcmVnaW9uLT5idWZmZXIsCisJCUk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisgICAgICAgICAgICAgICAgc3RhdGUtPmRyYXdfcmVnaW9uLT5kcmF3X29mZnNldCk7CiAKKyAgICAgIGlmIChzdGF0ZS0+ZGVwdGhfcmVnaW9uKSB7CisgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJODMwX0RFU1RSRUdfREJVRkFERFIwXSk7CisgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJODMwX0RFU1RSRUdfREJVRkFERFIxXSk7CisgICAgICAgICBPVVRfUkVMT0Moc3RhdGUtPmRlcHRoX3JlZ2lvbi0+YnVmZmVyLAorCQkgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAorICAgICAgICAgICAgICAgICAgIHN0YXRlLT5kZXB0aF9yZWdpb24tPmRyYXdfb2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTgzMF9ERVNUUkVHX0RWMF0pOworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTgzMF9ERVNUUkVHX0RWMV0pOworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTgzMF9ERVNUUkVHX1NFTkFCTEVdKTsKKyAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19TUjBdKTsKKyAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19TUjFdKTsKKyAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19TUjJdKTsKKyAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKKyAgIH0KKyAgIAogICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfU1RJUFBMRSkgewotICAgICAgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTgzMF9VUExPQURfU1RJUFBMRTpcbiIpOyAKLSAgICAgIGVtaXQoIGk4MzAsIHN0YXRlLT5TdGlwcGxlLCBzaXplb2Yoc3RhdGUtPlN0aXBwbGUpICk7CisgICAgICBEQkcoIkk4MzBfVVBMT0FEX1NUSVBQTEU6XG4iKTsKKyAgICAgIGVtaXQoaW50ZWwsIHN0YXRlLT5TdGlwcGxlLCBzaXplb2Yoc3RhdGUtPlN0aXBwbGUpKTsKICAgIH0KIAogICAgZm9yIChpID0gMDsgaSA8IEk4MzBfVEVYX1VOSVRTOyBpKyspIHsKLSAgICAgIGlmICgoZGlydHkgJiBJODMwX1VQTE9BRF9URVgoaSkpKSB7IAotIAkgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTgzMF9VUExPQURfVEVYKCVkKTpcbiIsIGkpOyAKLQkgZW1pdCggaTgzMCwgc3RhdGUtPlRleFtpXSwgc2l6ZW9mKHN0YXRlLT5UZXhbaV0pKTsgCi0gICAgICB9IAorICAgICAgaWYgKChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWChpKSkpIHsKKyAgICAgICAgIERCRygiSTgzMF9VUExPQURfVEVYKCVkKTpcbiIsIGkpOworCisgICAgICAgICBCRUdJTl9CQVRDSChJODMwX1RFWF9TRVRVUF9TSVpFICsgMSwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJODMwX1RFWFJFR19UTTBMSV0pOworCisgICAgICAgICBpZiAoc3RhdGUtPnRleF9idWZmZXJbaV0pIHsKKyAgICAgICAgICAgIE9VVF9SRUxPQyhzdGF0ZS0+dGV4X2J1ZmZlcltpXSwKKwkJICAgICAgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnRleF9vZmZzZXRbaV0gfCBUTTBTMF9VU0VfRkVOQ0UpOworICAgICAgICAgfQorCSBlbHNlIGlmIChzdGF0ZSA9PSAmaTgzMC0+bWV0YSkgeworCSAgICBhc3NlcnQoaSA9PSAwKTsKKwkgICAgT1VUX0JBVENIKDApOworCSB9CisJIGVsc2UgeworCSAgICBPVVRfQkFUQ0goc3RhdGUtPnRleF9vZmZzZXRbaV0pOworCSB9CisKKyAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k4MzBfVEVYUkVHX1RNMFMxXSk7CisgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJODMwX1RFWFJFR19UTTBTMl0pOworICAgICAgICAgT1VUX0JBVENIKHN0YXRlLT5UZXhbaV1bSTgzMF9URVhSRUdfVE0wUzNdKTsKKyAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k4MzBfVEVYUkVHX1RNMFM0XSk7CisgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJODMwX1RFWFJFR19NQ1NdKTsKKyAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k4MzBfVEVYUkVHX0NVQkVdKTsKKyAgICAgIH0KIAogICAgICAgaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQoaSkpIHsKLQkgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTgzMF9VUExPQURfVEVYQkxFTkQoJWQpOlxuIiwgaSk7IAotCSBlbWl0KCBpODMwLCBzdGF0ZS0+VGV4QmxlbmRbaV0sIAotCSAgICAgICBzdGF0ZS0+VGV4QmxlbmRXb3Jkc1VzZWRbaV0gKiA0ICk7CisgICAgICAgICBEQkcoIkk4MzBfVVBMT0FEX1RFWEJMRU5EKCVkKTogJWQgd29yZHNcbiIsIGksCisgICAgICAgICAgICAgc3RhdGUtPlRleEJsZW5kV29yZHNVc2VkW2ldKTsKKyAgICAgICAgIGVtaXQoaW50ZWwsIHN0YXRlLT5UZXhCbGVuZFtpXSwgc3RhdGUtPlRleEJsZW5kV29yZHNVc2VkW2ldICogNCk7CiAgICAgICB9CiAgICB9CiAKLSAgIHN0YXRlLT5lbWl0dGVkIHw9IGRpcnR5OwotICAgaW50ZWwtPmJhdGNoLmxhc3RfZW1pdF9zdGF0ZSA9IGNvdW50ZXI7Ci0gICBhc3NlcnQoY291bnRlciA9PSBpbnRlbC0+YmF0Y2guY291bnRlcik7CisgICBpbnRlbC0+YmF0Y2gtPmRpcnR5X3N0YXRlICY9IH5kaXJ0eTsKKyAgIGFzc2VydChnZXRfZGlydHkoc3RhdGUpID09IDApOworICAgYXNzZXJ0KChpbnRlbC0+YmF0Y2gtPmRpcnR5X3N0YXRlICYgKDE8PDEpKSA9PSAwKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kZXN0cm95X2NvbnRleHQoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCitzdGF0aWMgdm9pZAoraTgzMF9kZXN0cm95X2NvbnRleHQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogeworICAgR0x1aW50IGk7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKworICAgZm9yIChpID0gMDsgaSA8IEk4MzBfVEVYX1VOSVRTOyBpKyspIHsKKyAgICAgIGlmIChpODMwLT5zdGF0ZS50ZXhfYnVmZmVyW2ldICE9IE5VTEwpIHsKKwkgZHJpX2JvX3VucmVmZXJlbmNlKGk4MzAtPnN0YXRlLnRleF9idWZmZXJbaV0pOworCSBpODMwLT5zdGF0ZS50ZXhfYnVmZmVyW2ldID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KKwogICAgX3RubF9mcmVlX3ZlcnRpY2VzKCZpbnRlbC0+Y3R4KTsKIH0KIAotc3RhdGljIHZvaWQKLWk4MzBfc2V0X2NvbG9yX3JlZ2lvbihpbnRlbENvbnRleHRQdHIgaW50ZWwsIGNvbnN0IGludGVsUmVnaW9uICpyZWdpb24pCisKK3ZvaWQKK2k4MzBfc3RhdGVfZHJhd19yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgICAgICAgc3RydWN0IGk4MzBfaHdfc3RhdGUgKnN0YXRlLAorCQkgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqY29sb3JfcmVnaW9uLAorCQkgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVwdGhfcmVnaW9uKQogewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChpbnRlbCk7Ci0gICBJODMwX1NUQVRFQ0hBTkdFKCBpODMwLCBJODMwX1VQTE9BRF9CVUZGRVJTICk7Ci0gICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0NCVUZBRERSMV0gPQotICAgICAgKEJVRl8zRF9JRF9DT0xPUl9CQUNLIHwgQlVGXzNEX1BJVENIKHJlZ2lvbi0+cGl0Y2gpIHwgQlVGXzNEX1VTRV9GRU5DRSk7Ci0gICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0NCVUZBRERSMl0gPSByZWdpb24tPm9mZnNldDsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOworICAgR0x1aW50IHZhbHVlOworCisgICBBU1NFUlQoc3RhdGUgPT0gJmk4MzAtPnN0YXRlIHx8IHN0YXRlID09ICZpODMwLT5tZXRhKTsKKworICAgaWYgKHN0YXRlLT5kcmF3X3JlZ2lvbiAhPSBjb2xvcl9yZWdpb24pIHsKKyAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKCZzdGF0ZS0+ZHJhd19yZWdpb24pOworICAgICAgaW50ZWxfcmVnaW9uX3JlZmVyZW5jZSgmc3RhdGUtPmRyYXdfcmVnaW9uLCBjb2xvcl9yZWdpb24pOworICAgfQorICAgaWYgKHN0YXRlLT5kZXB0aF9yZWdpb24gIT0gZGVwdGhfcmVnaW9uKSB7CisgICAgICBpbnRlbF9yZWdpb25fcmVsZWFzZSgmc3RhdGUtPmRlcHRoX3JlZ2lvbik7CisgICAgICBpbnRlbF9yZWdpb25fcmVmZXJlbmNlKCZzdGF0ZS0+ZGVwdGhfcmVnaW9uLCBkZXB0aF9yZWdpb24pOworICAgfQorCisgICAvKgorICAgICogU2V0IHN0cmlkZS9jcHAgdmFsdWVzCisgICAgKi8KKyAgIGlmIChjb2xvcl9yZWdpb24pIHsKKyAgICAgIHN0YXRlLT5CdWZmZXJbSTgzMF9ERVNUUkVHX0NCVUZBRERSMF0gPSBfM0RTVEFURV9CVUZfSU5GT19DTUQ7CisgICAgICBzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjFdID0KKyAgICAgICAgIChCVUZfM0RfSURfQ09MT1JfQkFDSyB8CisgICAgICAgICAgQlVGXzNEX1BJVENIKGNvbG9yX3JlZ2lvbi0+cGl0Y2ggKiBjb2xvcl9yZWdpb24tPmNwcCkgfAorICAgICAgICAgIEJVRl8zRF9VU0VfRkVOQ0UpOworICAgfQorCisgICBpZiAoZGVwdGhfcmVnaW9uKSB7CisgICAgICBzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19EQlVGQUREUjBdID0gXzNEU1RBVEVfQlVGX0lORk9fQ01EOworICAgICAgc3RhdGUtPkJ1ZmZlcltJODMwX0RFU1RSRUdfREJVRkFERFIxXSA9CisgICAgICAgICAoQlVGXzNEX0lEX0RFUFRIIHwKKyAgICAgICAgICBCVUZfM0RfUElUQ0goZGVwdGhfcmVnaW9uLT5waXRjaCAqIGRlcHRoX3JlZ2lvbi0+Y3BwKSB8CisgICAgICAgICAgQlVGXzNEX1VTRV9GRU5DRSk7CisgICB9CisKKyAgIC8qCisgICAgKiBDb21wdXRlL3NldCBJODMwX0RFU1RSRUdfRFYxIHZhbHVlCisgICAgKi8KKyAgIHZhbHVlID0gKERTVE9SR19IT1JUX0JJQVMoMHg4KSB8ICAgICAvKiAuNSAqLworICAgICAgICAgICAgRFNUT1JHX1ZFUlRfQklBUygweDgpIHwgREVQVEhfSVNfWik7ICAgIC8qIC41ICovCisgICAgICAgICAgICAKKyAgIGlmIChjb2xvcl9yZWdpb24gJiYgY29sb3JfcmVnaW9uLT5jcHAgPT0gNCkgeworICAgICAgdmFsdWUgfD0gRFZfUEZfODg4ODsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgdmFsdWUgfD0gRFZfUEZfNTY1OworICAgfQorICAgaWYgKGRlcHRoX3JlZ2lvbiAmJiBkZXB0aF9yZWdpb24tPmNwcCA9PSA0KSB7CisgICAgICB2YWx1ZSB8PSBERVBUSF9GUk1UXzI0X0ZJWEVEXzhfT1RIRVI7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHZhbHVlIHw9IERFUFRIX0ZSTVRfMTZfRklYRUQ7CisgICB9CisgICBzdGF0ZS0+QnVmZmVyW0k4MzBfREVTVFJFR19EVjFdID0gdmFsdWU7CisKKyAgIEk4MzBfU1RBVEVDSEFOR0UoaTgzMCwgSTgzMF9VUExPQURfQlVGRkVSUyk7CisKKwogfQogCiAKIHN0YXRpYyB2b2lkCi1pODMwX3NldF96X3JlZ2lvbihpbnRlbENvbnRleHRQdHIgaW50ZWwsIGNvbnN0IGludGVsUmVnaW9uICpyZWdpb24pCitpODMwX3NldF9kcmF3X3JlZ2lvbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpjb2xvcl9yZWdpb25zW10sCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb24sCisJCSAgICAgR0x1aW50IG51bV9yZWdpb25zKQogewotICAgaTgzMENvbnRleHRQdHIgaTgzMCA9IEk4MzBfQ09OVEVYVChpbnRlbCk7Ci0gICBJODMwX1NUQVRFQ0hBTkdFKCBpODMwLCBJODMwX1VQTE9BRF9CVUZGRVJTICk7Ci0gICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0RCVUZBRERSMV0gPQotICAgICAgKEJVRl8zRF9JRF9ERVBUSCB8IEJVRl8zRF9QSVRDSChyZWdpb24tPnBpdGNoKSB8IEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19EQlVGQUREUjJdID0gcmVnaW9uLT5vZmZzZXQ7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgIGk4MzBfc3RhdGVfZHJhd19yZWdpb24oaW50ZWwsICZpODMwLT5zdGF0ZSwgY29sb3JfcmVnaW9uc1swXSwgZGVwdGhfcmVnaW9uKTsKIH0KIAotCisjaWYgMAogc3RhdGljIHZvaWQKIGk4MzBfdXBkYXRlX2NvbG9yX3pfcmVnaW9ucyhpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZWxSZWdpb24gKmNvbG9yUmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVsUmVnaW9uICpkZXB0aFJlZ2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlbFJlZ2lvbiAqIGNvbG9yUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVsUmVnaW9uICogZGVwdGhSZWdpb24pCiB7CiAgICBpODMwQ29udGV4dFB0ciBpODMwID0gSTgzMF9DT05URVhUKGludGVsKTsKIAogICAgaTgzMC0+c3RhdGUuQnVmZmVyW0k4MzBfREVTVFJFR19DQlVGQUREUjFdID0KLSAgICAgIChCVUZfM0RfSURfQ09MT1JfQkFDSyB8IEJVRl8zRF9QSVRDSChjb2xvclJlZ2lvbi0+cGl0Y2gpIHwgQlVGXzNEX1VTRV9GRU5DRSk7CisgICAgICAoQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCBCVUZfM0RfUElUQ0goY29sb3JSZWdpb24tPnBpdGNoKSB8CisgICAgICAgQlVGXzNEX1VTRV9GRU5DRSk7CiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0NCVUZBRERSMl0gPSBjb2xvclJlZ2lvbi0+b2Zmc2V0OwogCiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0RCVUZBRERSMV0gPQogICAgICAgKEJVRl8zRF9JRF9ERVBUSCB8IEJVRl8zRF9QSVRDSChkZXB0aFJlZ2lvbi0+cGl0Y2gpIHwgQlVGXzNEX1VTRV9GRU5DRSk7CiAgICBpODMwLT5zdGF0ZS5CdWZmZXJbSTgzMF9ERVNUUkVHX0RCVUZBRERSMl0gPSBkZXB0aFJlZ2lvbi0+b2Zmc2V0OwogfQorI2VuZGlmCiAKIAogLyogVGhpcyBpc24ndCByZWFsbHkgaGFuZGxlZCBhdCB0aGUgbW9tZW50LgogICovCi1zdGF0aWMgdm9pZCBpODMwX2xvc3RfaGFyZHdhcmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCitzdGF0aWMgdm9pZAoraTgzMF9uZXdfYmF0Y2goc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogewotICAgSTgzMF9DT05URVhUKGludGVsKS0+c3RhdGUuZW1pdHRlZCA9IDA7CisgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgIGk4MzAtPnN0YXRlLmVtaXR0ZWQgPSAwOworCisgICAvKiBDaGVjayB0aGF0IHdlIGRpZG4ndCBqdXN0IHdyYXAgb3VyIGJhdGNoYnVmZmVyIGF0IGEgYmFkIHRpbWUuICovCisgICBhc3NlcnQoIWludGVsLT5ub19iYXRjaF93cmFwKTsKIH0KIAogCiAKLXN0YXRpYyB2b2lkIGk4MzBfZW1pdF9mbHVzaCggaW50ZWxDb250ZXh0UHRyIGludGVsICkKK3N0YXRpYyBHTHVpbnQKK2k4MzBfZmx1c2hfY21kKHZvaWQpCiB7Ci0gICBCQVRDSF9MT0NBTFM7Ci0KLSAgIEJFR0lOX0JBVENIKDIpOwotICAgT1VUX0JBVENIKCBNSV9GTFVTSCB8IEZMVVNIX01BUF9DQUNIRSApOyAKLSAgIE9VVF9CQVRDSCggMCApOwotICAgQURWQU5DRV9CQVRDSCgpOworICAgcmV0dXJuIE1JX0ZMVVNIIHwgRkxVU0hfTUFQX0NBQ0hFOwogfQogCiAKLQotCi12b2lkIGk4MzBJbml0VnRibCggaTgzMENvbnRleHRQdHIgaTgzMCApCitzdGF0aWMgdm9pZCAKK2k4MzBfYXNzZXJ0X25vdF9kaXJ0eSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKIHsKLSAgIGk4MzAtPmludGVsLnZ0YmwuYWxsb2NfdGV4X29iaiA9IGk4MzBBbGxvY1RleE9iajsKKyAgIHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzAgPSBpODMwX2NvbnRleHQoJmludGVsLT5jdHgpOworICAgc3RydWN0IGk4MzBfaHdfc3RhdGUgKnN0YXRlID0gaTgzMC0+Y3VycmVudDsKKyAgIGFzc2VydCghZ2V0X2RpcnR5KHN0YXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitpODMwX25vdGVfdW5sb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQoreworICAgIC8qIG5vdGhpbmcgKi8KK30KKwordm9pZAoraTgzMEluaXRWdGJsKHN0cnVjdCBpODMwX2NvbnRleHQgKmk4MzApCit7CiAgICBpODMwLT5pbnRlbC52dGJsLmNoZWNrX3ZlcnRleF9zaXplID0gaTgzMF9jaGVja192ZXJ0ZXhfc2l6ZTsKLSAgIGk4MzAtPmludGVsLnZ0YmwuY2xlYXJfd2l0aF90cmlzID0gaTgzMENsZWFyV2l0aFRyaXM7Ci0gICBpODMwLT5pbnRlbC52dGJsLnJvdGF0ZV93aW5kb3cgPSBpODMwUm90YXRlV2luZG93OwogICAgaTgzMC0+aW50ZWwudnRibC5kZXN0cm95ID0gaTgzMF9kZXN0cm95X2NvbnRleHQ7CiAgICBpODMwLT5pbnRlbC52dGJsLmVtaXRfc3RhdGUgPSBpODMwX2VtaXRfc3RhdGU7Ci0gICBpODMwLT5pbnRlbC52dGJsLmxvc3RfaGFyZHdhcmUgPSBpODMwX2xvc3RfaGFyZHdhcmU7CisgICBpODMwLT5pbnRlbC52dGJsLm5ld19iYXRjaCA9IGk4MzBfbmV3X2JhdGNoOwogICAgaTgzMC0+aW50ZWwudnRibC5yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZSA9IGk4MzBfcmVkdWNlZF9wcmltaXRpdmVfc3RhdGU7Ci0gICBpODMwLT5pbnRlbC52dGJsLnNldF9jb2xvcl9yZWdpb24gPSBpODMwX3NldF9jb2xvcl9yZWdpb247Ci0gICBpODMwLT5pbnRlbC52dGJsLnNldF96X3JlZ2lvbiA9IGk4MzBfc2V0X3pfcmVnaW9uOwotICAgaTgzMC0+aW50ZWwudnRibC51cGRhdGVfY29sb3Jfel9yZWdpb25zID0gaTgzMF91cGRhdGVfY29sb3Jfel9yZWdpb25zOworICAgaTgzMC0+aW50ZWwudnRibC5zZXRfZHJhd19yZWdpb24gPSBpODMwX3NldF9kcmF3X3JlZ2lvbjsKICAgIGk4MzAtPmludGVsLnZ0YmwudXBkYXRlX3RleHR1cmVfc3RhdGUgPSBpODMwVXBkYXRlVGV4dHVyZVN0YXRlOwotICAgaTgzMC0+aW50ZWwudnRibC5lbWl0X2ZsdXNoID0gaTgzMF9lbWl0X2ZsdXNoOworICAgaTgzMC0+aW50ZWwudnRibC5mbHVzaF9jbWQgPSBpODMwX2ZsdXNoX2NtZDsKICAgIGk4MzAtPmludGVsLnZ0YmwucmVuZGVyX3N0YXJ0ID0gaTgzMF9yZW5kZXJfc3RhcnQ7CisgICBpODMwLT5pbnRlbC52dGJsLnJlbmRlcl9wcmV2YWxpZGF0ZSA9IGk4MzBfcmVuZGVyX3ByZXZhbGlkYXRlOworICAgaTgzMC0+aW50ZWwudnRibC5hc3NlcnRfbm90X2RpcnR5ID0gaTgzMF9hc3NlcnRfbm90X2RpcnR5OworICAgaTgzMC0+aW50ZWwudnRibC5ub3RlX3VubG9jayA9IGk4MzBfbm90ZV91bmxvY2s7IAorICAgaTgzMC0+aW50ZWwudnRibC5maW5pc2hfYmF0Y2ggPSBpbnRlbF9maW5pc2hfdmI7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfY29udGV4dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2NvbnRleHQuYwppbmRleCAyYmMxY2FlLi45NDBiMDI1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9jb250ZXh0LmMKQEAgLTM2LDE1MSArMzYsMTUzIEBACiAjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgogI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKICNpbmNsdWRlICJ0bmwvdG5sLmgiCi0jaW5jbHVkZSAidmJvL3Ziby5oIgotCiAKICNpbmNsdWRlICJ1dGlscy5oIgogI2luY2x1ZGUgImk5MTVfcmVnLmgiCiAKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF90cmlzLmgiCisjaW5jbHVkZSAiaW50ZWxfc3Bhbi5oIgorI2luY2x1ZGUgImludGVsX3BpeGVsLmgiCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1lc2EncyBEcml2ZXIgRnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gaTkxNV9leHRlbnNpb25zW10gPQotewotICAgIHsgIkdMX0FSQl9kZXB0aF90ZXh0dXJlIiwgICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3NoYWRvdyIsICAgICAgICAgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciIsICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9FWFRfc2hhZG93X2Z1bmNzIiwgICAgICAgICAgICAgICBOVUxMIH0sCi0gICAgLyogQVJCIGV4dG4gd29uJ3Qgd29yayBpZiBub3QgZW5hYmxlZCAqLwotICAgIHsgIkdMX1NHSVhfZGVwdGhfdGV4dHVyZSIsICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBpOTE1X2V4dGVuc2lvbnNbXSA9IHsKKyAgIHsiR0xfQVJCX2RlcHRoX3RleHR1cmUiLCBOVUxMfSwKKyAgIHsiR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0iLCBOVUxMfSwKKyAgIHsiR0xfQVJCX3NoYWRvdyIsIE5VTEx9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIiwgTlVMTH0sCisgICB7IkdMX0VYVF9zaGFkb3dfZnVuY3MiLCBOVUxMfSwKKyAgIC8qIEFSQiBleHRuIHdvbid0IHdvcmsgaWYgbm90IGVuYWJsZWQgKi8KKyAgIHsiR0xfU0dJWF9kZXB0aF90ZXh0dXJlIiwgTlVMTH0sCisgICB7TlVMTCwgTlVMTH0KIH07CiAKIC8qIE92ZXJyaWRlIGludGVsIGRlZmF1bHQuCiAgKi8KLXN0YXRpYyB2b2lkIGk5MTVJbnZhbGlkYXRlU3RhdGUoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgbmV3X3N0YXRlICkKK3N0YXRpYyB2b2lkCitpOTE1SW52YWxpZGF0ZVN0YXRlKEdMY29udGV4dCAqIGN0eCwgR0x1aW50IG5ld19zdGF0ZSkKIHsKLSAgIF9zd3Jhc3RfSW52YWxpZGF0ZVN0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgX3N3c2V0dXBfSW52YWxpZGF0ZVN0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgX3Zib19JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Ci0gICBfdG5sX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgIF90bmxfaW52YWxpZGF0ZV92ZXJ0ZXhfc3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Ci0gICBJTlRFTF9DT05URVhUKGN0eCktPk5ld0dMU3RhdGUgfD0gbmV3X3N0YXRlOworICAgX3N3cmFzdF9JbnZhbGlkYXRlU3RhdGUoY3R4LCBuZXdfc3RhdGUpOworICAgX3N3c2V0dXBfSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF92Ym9fSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF90bmxfSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF90bmxfaW52YWxpZGF0ZV92ZXJ0ZXhfc3RhdGUoY3R4LCBuZXdfc3RhdGUpOworICAgaW50ZWxfY29udGV4dChjdHgpLT5OZXdHTFN0YXRlIHw9IG5ld19zdGF0ZTsKIAogICAgLyogVG9kbzogZ2F0aGVyIHN0YXRlIHZhbHVlcyB1bmRlciB3aGljaCB0cmFja2VkIHBhcmFtZXRlcnMgYmVjb21lCiAgICAgKiBpbnZhbGlkYXRlZCwgYWRkIGNhbGxiYWNrcyBmb3IgdGhpbmdzIGxpa2UKICAgICAqIFByb2dyYW1Mb2NhbFBhcmFtZXRlcnMsIGV0Yy4KICAgICAqLwogICAgewotICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9IAotCSAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqKWN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50OworICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9CisgICAgICAgICAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqKSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKICAgICAgIGlmIChwICYmIHAtPm5yX3BhcmFtcykKLQkgcC0+cGFyYW1zX3VwdG9kYXRlID0gMDsKKyAgICAgICAgIHAtPnBhcmFtc191cHRvZGF0ZSA9IDA7CiAgICB9CiAKLSAgIGlmIChuZXdfc3RhdGUgJiAoX05FV19GT0d8X05FV19ISU5UfF9ORVdfUFJPR1JBTSkpCisgICBpZiAobmV3X3N0YXRlICYgKF9ORVdfRk9HIHwgX05FV19ISU5UIHwgX05FV19QUk9HUkFNKSkKICAgICAgIGk5MTVfdXBkYXRlX2ZvZyhjdHgpOwogfQogCiAKLXN0YXRpYyB2b2lkIGk5MTVJbml0RHJpdmVyRnVuY3Rpb25zKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCitzdGF0aWMgdm9pZAoraTkxNUluaXREcml2ZXJGdW5jdGlvbnMoc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMpCiB7Ci0gICBpbnRlbEluaXREcml2ZXJGdW5jdGlvbnMoIGZ1bmN0aW9ucyApOwotICAgaTkxNUluaXRTdGF0ZUZ1bmN0aW9ucyggZnVuY3Rpb25zICk7Ci0gICBpOTE1SW5pdFRleHR1cmVGdW5jcyggZnVuY3Rpb25zICk7Ci0gICBpOTE1SW5pdEZyYWdQcm9nRnVuY3MoIGZ1bmN0aW9ucyApOworICAgaW50ZWxJbml0RHJpdmVyRnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisgICBpOTE1SW5pdFN0YXRlRnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisgICBpOTE1SW5pdFRleHR1cmVGdW5jcyhmdW5jdGlvbnMpOworICAgaTkxNUluaXRGcmFnUHJvZ0Z1bmNzKGZ1bmN0aW9ucyk7CiAgICBmdW5jdGlvbnMtPlVwZGF0ZVN0YXRlID0gaTkxNUludmFsaWRhdGVTdGF0ZTsKIH0KIAogCitleHRlcm4gY29uc3Qgc3RydWN0IHRubF9waXBlbGluZV9zdGFnZSAqaW50ZWxfcGlwZWxpbmVbXTsKIAotR0xib29sZWFuIGk5MTVDcmVhdGVDb250ZXh0KCBjb25zdCBfX0dMY29udGV4dE1vZGVzICptZXNhVmlzLAotCQkJICAgIF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2LAotCQkJICAgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlKQorR0xib29sZWFuCitpOTE1Q3JlYXRlQ29udGV4dChjb25zdCBfX0dMY29udGV4dE1vZGVzICogbWVzYVZpcywKKyAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlKQogewogICAgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlIGZ1bmN0aW9uczsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSAoaTkxNUNvbnRleHRQdHIpIENBTExPQ19TVFJVQ1QoaTkxNV9jb250ZXh0KTsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9ICZpOTE1LT5pbnRlbDsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPQorICAgICAgKHN0cnVjdCBpOTE1X2NvbnRleHQgKikgQ0FMTE9DX1NUUlVDVChpOTE1X2NvbnRleHQpOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gJmk5MTUtPmludGVsOwogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKLSAgIEdMdWludCBpOwogCi0gICBpZiAoIWk5MTUpIHJldHVybiBHTF9GQUxTRTsKKyAgIGlmICghaTkxNSkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKIAotICAgaTkxNUluaXRWdGJsKCBpOTE1ICk7CisgICBpZiAoMCkKKyAgICAgIF9tZXNhX3ByaW50ZigiXG50ZXhtZW0tMC0zIGJyYW5jaFxuXG4iKTsKIAotICAgaTkxNUluaXREcml2ZXJGdW5jdGlvbnMoICZmdW5jdGlvbnMgKTsKKyAgIGk5MTVJbml0VnRibChpOTE1KTsKKyAgIGk5MTVJbml0TWV0YUZ1bmNzKGk5MTUpOwogCi0gICBpZiAoIWludGVsSW5pdENvbnRleHQoIGludGVsLCBtZXNhVmlzLCBkcmlDb250ZXh0UHJpdiwKLQkJCSAgc2hhcmVkQ29udGV4dFByaXZhdGUsICZmdW5jdGlvbnMgKSkgeworICAgaTkxNUluaXREcml2ZXJGdW5jdGlvbnMoJmZ1bmN0aW9ucyk7CisKKyAgIGlmICghaW50ZWxJbml0Q29udGV4dChpbnRlbCwgbWVzYVZpcywgZHJpQ29udGV4dFByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQ29udGV4dFByaXZhdGUsICZmdW5jdGlvbnMpKSB7CiAgICAgICBGUkVFKGk5MTUpOwogICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgfQogCisgICAvKiBJbml0aWFsaXplIHN3cmFzdCwgdG5sIGRyaXZlciB0YWJsZXM6ICovCisgICBpbnRlbEluaXRTcGFuRnVuY3MoY3R4KTsKKyAgIGludGVsSW5pdFRyaUZ1bmNzKGN0eCk7CisKKyAgIC8qIEluc3RhbGwgdGhlIGN1c3RvbWl6ZWQgcGlwZWxpbmU6ICovCisgICBfdG5sX2Rlc3Ryb3lfcGlwZWxpbmUoY3R4KTsKKyAgIF90bmxfaW5zdGFsbF9waXBlbGluZShjdHgsIGludGVsX3BpcGVsaW5lKTsKKworICAgaWYgKGludGVsLT5ub19yYXN0KQorICAgICAgRkFMTEJBQ0soaW50ZWwsIElOVEVMX0ZBTExCQUNLX1VTRVIsIDEpOworCiAgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA9IEk5MTVfVEVYX1VOSVRTOwogICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IEk5MTVfVEVYX1VOSVRTOwogICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0cyA9IEk5MTVfVEVYX1VOSVRTOwogCi0gICBpbnRlbC0+bnJfaGVhcHMgPSAxOwotICAgaW50ZWwtPnRleHR1cmVfaGVhcHNbMF0gPSAKLSAgICAgIGRyaUNyZWF0ZVRleHR1cmVIZWFwKCAwLCBpbnRlbCwKLQkJCSAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPnRleC5zaXplLAotCQkJICAgIDEyLAotCQkJICAgIEk4MzBfTlJfVEVYX1JFR0lPTlMsCi0JCQkgICAgaW50ZWwtPnNhcmVhLT50ZXhMaXN0LAotCQkJICAgICh1bnNpZ25lZCAqKSAmIGludGVsLT5zYXJlYS0+dGV4QWdlLAotCQkJICAgICYgaW50ZWwtPnN3YXBwZWQsCi0JCQkgICAgc2l6ZW9mKCBzdHJ1Y3QgaTkxNV90ZXh0dXJlX29iamVjdCApLAotCQkJICAgIChkZXN0cm95X3RleHR1cmVfb2JqZWN0X3QgKilpbnRlbERlc3Ryb3lUZXhPYmogKTsKIAotICAgLyogRklYTUU6IGRyaUNhbGN1bGF0ZU1heFRleHR1cmVMZXZlbHMgYXNzdW1lcyB0aGF0IG1pcG1hcHMgYXJlCi0gICAgKiB0aWdodGx5IHBhY2tlZCwgYnV0IHRoZXkncmUgbm90IGluIEludGVsIGdyYXBoaWNzCi0gICAgKiBoYXJkd2FyZS4KKyAgIC8qIEFkdmVydGlzZSB0aGUgZnVsbCBoYXJkd2FyZSBjYXBhYmlsaXRpZXMuICBUaGUgbmV3IG1lbW9yeQorICAgICogbWFuYWdlciBzaG91bGQgY29wZSBtdWNoIGJldHRlciB3aXRoIG92ZXJsb2FkIHNpdHVhdGlvbnM6CiAgICAgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscyA9IDEyOworICAgY3R4LT5Db25zdC5NYXgzRFRleHR1cmVMZXZlbHMgPSA5OworICAgY3R4LT5Db25zdC5NYXhDdWJlVGV4dHVyZUxldmVscyA9IDEyOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlUmVjdFNpemUgPSAoMSA8PCAxMSk7CiAgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA9IEk5MTVfVEVYX1VOSVRTOwotICAgaSA9IGRyaVF1ZXJ5T3B0aW9uaSggJmludGVsLT5vcHRpb25DYWNoZSwgImFsbG93X2xhcmdlX3RleHR1cmVzIik7Ci0gICBkcmlDYWxjdWxhdGVNYXhUZXh0dXJlTGV2ZWxzKCBpbnRlbC0+dGV4dHVyZV9oZWFwcywKLQkJCQkgaW50ZWwtPm5yX2hlYXBzLAotCQkJCSAmaW50ZWwtPmN0eC5Db25zdCwKLQkJCQkgNCwKLQkJCQkgMTEsIC8qIG1heCAyRCB0ZXh0dXJlIHNpemUgaXMgMjA0OHgyMDQ4ICovCi0JCQkJIDgsICAvKiAzRCB0ZXh0dXJlICovCi0JCQkJIDExLCAvKiBjdWJlIHRleHR1cmUuICovCi0JCQkJIDExLCAvKiByZWN0IHRleHR1cmUgKi8KLQkJCQkgMTIsCi0JCQkJIEdMX0ZBTFNFLAotCQkJCSBpICk7CiAKICAgIC8qIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtIGxpbWl0cyAtIGRvbid0IHRoaW5rIE1lc2EgYWN0dWFsbHkKICAgICAqIHZhbGlkYXRlcyBwcm9ncmFtcyBhZ2FpbnN0IHRoZXNlLCBhbmQgaW4gYW55IGNhc2Ugb25lIEFSQgogICAgICogaW5zdHJ1Y3Rpb24gY2FuIHRyYW5zbGF0ZSB0byBtb3JlIHRoYW4gb25lIEhXIGluc3RydWN0aW9uLCBzbwogICAgICogd2UnbGwgc3RpbGwgaGF2ZSB0byBjaGVjayBhbmQgZmFsbGJhY2sgZWFjaCB0aW1lLgogICAgICovCi0gICAKICAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZVRlbXBzID0gSTkxNV9NQVhfVEVNUE9SQVJZOwotICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlQXR0cmlicyA9IDExOyAvKiA4IHRleCwgMiBjb2xvciwgZm9nICovCisgICBjdHgtPkNvbnN0LkZyYWdtZW50UHJvZ3JhbS5NYXhOYXRpdmVBdHRyaWJzID0gMTE7ICAgIC8qIDggdGV4LCAyIGNvbG9yLCBmb2cgKi8KICAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZVBhcmFtZXRlcnMgPSBJOTE1X01BWF9DT05TVEFOVDsKICAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IEk5MTVfTUFYX0FMVV9JTlNOOwogICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zID0gSTkxNV9NQVhfVEVYX0lOU047Ci0gICBjdHgtPkNvbnN0LkZyYWdtZW50UHJvZ3JhbS5NYXhOYXRpdmVJbnN0cnVjdGlvbnMgPSAoSTkxNV9NQVhfQUxVX0lOU04gKyAKLQkJCQkJCUk5MTVfTUFYX1RFWF9JTlNOKTsKLSAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZVRleEluZGlyZWN0aW9ucyA9IEk5MTVfTUFYX1RFWF9JTkRJUkVDVDsKKyAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZUluc3RydWN0aW9ucyA9IChJOTE1X01BWF9BTFVfSU5TTiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9NQVhfVEVYX0lOU04pOworICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlVGV4SW5kaXJlY3Rpb25zID0KKyAgICAgIEk5MTVfTUFYX1RFWF9JTkRJUkVDVDsKICAgIGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heE5hdGl2ZUFkZHJlc3NSZWdzID0gMDsgLyogSSBkb24ndCB0aGluayB3ZSBoYXZlIG9uZSAqLworCiAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fTWFpbnRhaW5UZXhFbnZQcm9ncmFtID0gR0xfVFJVRTsKICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9Vc2VUZXhFbnZQcm9ncmFtID0gR0xfVFJVRTsKIAotCi0gICBkcmlJbml0RXh0ZW5zaW9ucyggY3R4LCBpOTE1X2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisgICBkcmlJbml0RXh0ZW5zaW9ucyhjdHgsIGk5MTVfZXh0ZW5zaW9ucywgR0xfRkFMU0UpOwogCiAKLSAgIF90bmxfaW5pdF92ZXJ0aWNlcyggY3R4LCBjdHgtPkNvbnN0Lk1heEFycmF5TG9ja1NpemUgKyAxMiwgCi0JCSAgICAgICAzNiAqIHNpemVvZihHTGZsb2F0KSApOworICAgX3RubF9pbml0X3ZlcnRpY2VzKGN0eCwgY3R4LT5Db25zdC5NYXhBcnJheUxvY2tTaXplICsgMTIsCisgICAgICAgICAgICAgICAgICAgICAgMzYgKiBzaXplb2YoR0xmbG9hdCkpOwogCiAgICBpbnRlbC0+dmVydHMgPSBUTkxfQ09OVEVYVChjdHgpLT5jbGlwc3BhY2UudmVydGV4X2J1ZjsKIAotICAgaTkxNUluaXRTdGF0ZSggaTkxNSApOworICAgaTkxNUluaXRTdGF0ZShpOTE1KTsKIAogICAgcmV0dXJuIEdMX1RSVUU7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfY29udGV4dC5oCmluZGV4IGVjMTU1MDEuLmM2OTU4ZGQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2NvbnRleHQuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBJOTE1Q09OVEVYVF9JTkMKIAogI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpOTE1X3JlZy5oIgogCiAjZGVmaW5lIEk5MTVfRkFMTEJBQ0tfVEVYVFVSRQkJIDB4MTAwMAogI2RlZmluZSBJOTE1X0ZBTExCQUNLX0NPTE9STUFTSwkJIDB4MjAwMApAQCAtNDYsNiArNDcsNyBAQAogI2RlZmluZSBJOTE1X1VQTE9BRF9DT05TVEFOVFMgICAgICAgIDB4MTAKICNkZWZpbmUgSTkxNV9VUExPQURfRk9HICAgICAgICAgICAgICAweDIwCiAjZGVmaW5lIEk5MTVfVVBMT0FEX0lOVkFSSUVOVCAgICAgICAgMHg0MAorI2RlZmluZSBJOTE1X1VQTE9BRF9ERUZBVUxUUyAgICAgICAgIDB4ODAKICNkZWZpbmUgSTkxNV9VUExPQURfVEVYKGkpICAgICAgICAgICAoMHgwMDAxMDAwMDw8KGkpKQogI2RlZmluZSBJOTE1X1VQTE9BRF9URVhfQUxMICAgICAgICAgICgweDAwZmYwMDAwKQogI2RlZmluZSBJOTE1X1VQTE9BRF9URVhfMF9TSElGVCAgICAgIDE2CkBAIC01NSwxMCArNTcsOCBAQAogICovCiAjZGVmaW5lIEk5MTVfREVTVFJFR19DQlVGQUREUjAgMAogI2RlZmluZSBJOTE1X0RFU1RSRUdfQ0JVRkFERFIxIDEKLSNkZWZpbmUgSTkxNV9ERVNUUkVHX0NCVUZBRERSMiAyCiAjZGVmaW5lIEk5MTVfREVTVFJFR19EQlVGQUREUjAgMwogI2RlZmluZSBJOTE1X0RFU1RSRUdfREJVRkFERFIxIDQKLSNkZWZpbmUgSTkxNV9ERVNUUkVHX0RCVUZBRERSMiA1CiAjZGVmaW5lIEk5MTVfREVTVFJFR19EVjAgNgogI2RlZmluZSBJOTE1X0RFU1RSRUdfRFYxIDcKICNkZWZpbmUgSTkxNV9ERVNUUkVHX1NFTkFCTEUgOApAQCAtODksNyArODksNiBAQAogI2RlZmluZSBJOTE1X1NUUFJFR19TVDEgICAgICAgIDEKICNkZWZpbmUgSTkxNV9TVFBfU0VUVVBfU0laRSAgICAyCiAKLSNkZWZpbmUgSTkxNV9URVhSRUdfTVMyICAgICAgICAwCiAjZGVmaW5lIEk5MTVfVEVYUkVHX01TMyAgICAgICAgMQogI2RlZmluZSBJOTE1X1RFWFJFR19NUzQgICAgICAgIDIKICNkZWZpbmUgSTkxNV9URVhSRUdfU1MyICAgICAgICAzCkBAIC05NywyMyArOTYsMzQgQEAKICNkZWZpbmUgSTkxNV9URVhSRUdfU1M0ICAgICAgICA1CiAjZGVmaW5lIEk5MTVfVEVYX1NFVFVQX1NJWkUgICAgNgogCisjZGVmaW5lIEk5MTVfREVGUkVHX0MwICAgIDAKKyNkZWZpbmUgSTkxNV9ERUZSRUdfQzEgICAgMQorI2RlZmluZSBJOTE1X0RFRlJFR19TMCAgICAyCisjZGVmaW5lIEk5MTVfREVGUkVHX1MxICAgIDMKKyNkZWZpbmUgSTkxNV9ERUZSRUdfWjAgICAgNAorI2RlZmluZSBJOTE1X0RFRlJFR19aMSAgICA1CisjZGVmaW5lIEk5MTVfREVGX1NFVFVQX1NJWkUgICAgNgorCisKICNkZWZpbmUgSTkxNV9NQVhfQ09OU1RBTlQgICAgICAzMgogI2RlZmluZSBJOTE1X0NPTlNUQU5UX1NJWkUgICAgICgyKyg0Kkk5MTVfTUFYX0NPTlNUQU5UKSkKIAogCiAjZGVmaW5lIEk5MTVfUFJPR1JBTV9TSVpFICAgICAgMTkyCiAKKyNkZWZpbmUgSTkxNV9NQVhfSU5TTiAgICAgICAgICAoSTkxNV9NQVhfVEVYX0lOU04rSTkxNV9NQVhfQUxVX0lOU04pCiAKIC8qIEhhcmR3YXJlIHZlcnNpb24gb2YgYSBwYXJzZWQgZnJhZ21lbnQgcHJvZ3JhbS4gICJEZXJpdmVkIiBmcm9tIHRoZQogICogbWVzYSBmcmFnbWVudF9wcm9ncmFtIHN0cnVjdC4KICAqLwotc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSB7CitzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtCit7CiAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSBGcmFnUHJvZzsKIAogICAgR0xib29sZWFuIHRyYW5zbGF0ZWQ7CiAgICBHTGJvb2xlYW4gcGFyYW1zX3VwdG9kYXRlOwogICAgR0xib29sZWFuIG9uX2hhcmR3YXJlOwotICAgR0xib29sZWFuIGVycm9yOwkJLyogSWYgcHJvZ3JhbSBpcyBtYWxmb3JtZWQgZm9yIGFueSByZWFzb24uICovCisgICBHTGJvb2xlYW4gZXJyb3I7ICAgICAgICAgICAgIC8qIElmIHByb2dyYW0gaXMgbWFsZm9ybWVkIGZvciBhbnkgcmVhc29uLiAqLwogCiAgICBHTHVpbnQgbnJfdGV4X2luZGlyZWN0OwogICAgR0x1aW50IG5yX3RleF9pbnNuOwpAQCAtMTM1LDUyICsxNDUsNDAgQEAKICAgIEdMdWludCBjb25zdGFudF9mbGFnc1tJOTE1X01BWF9DT05TVEFOVF07CiAgICBHTHVpbnQgbnJfY29uc3RhbnRzOwogCi0gICBHTHVpbnQgKmNzcjsJCQkvKiBDdXJzb3IsIHBvaW50cyBpbnRvIHByb2dyYW0uCi0JCQkJICovCisgICBHTHVpbnQgKmNzcjsgICAgICAgICAgICAgICAgIC8qIEN1cnNvciwgcG9pbnRzIGludG8gcHJvZ3JhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgIEdMdWludCAqZGVjbDsJCS8qIEN1cnNvciwgcG9pbnRzIGludG8gZGVjbGFyYXRpb25zLgotCQkJCSAqLwotICAgCi0gICBHTHVpbnQgZGVjbF9zOwkJLyogZmxhZ3MgZm9yIHdoaWNoIHMgcmVncyBuZWVkIHRvIGJlIGRlY2wnZCAqLwotICAgR0x1aW50IGRlY2xfdDsJCS8qIGZsYWdzIGZvciB3aGljaCB0IHJlZ3MgbmVlZCB0byBiZSBkZWNsJ2QgKi8KKyAgIEdMdWludCAqZGVjbDsgICAgICAgICAgICAgICAgLyogQ3Vyc29yLCBwb2ludHMgaW50byBkZWNsYXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICBHTHVpbnQgdGVtcF9mbGFnOwkJLyogVHJhY2tzIHRlbXBvcmFyeSByZWdzIHdoaWNoIGFyZSBpbgotCQkJCSAqIHVzZS4KLQkJCQkgKi8KKyAgIEdMdWludCBkZWNsX3M7ICAgICAgICAgICAgICAgLyogZmxhZ3MgZm9yIHdoaWNoIHMgcmVncyBuZWVkIHRvIGJlIGRlY2wnZCAqLworICAgR0x1aW50IGRlY2xfdDsgICAgICAgICAgICAgICAvKiBmbGFncyBmb3Igd2hpY2ggdCByZWdzIG5lZWQgdG8gYmUgZGVjbCdkICovCiAKLSAgIEdMdWludCB1dGVtcF9mbGFnOwkJLyogVHJhY2tzIFRZUEVfVSB0ZW1wb3JhcnkgcmVncyB3aGljaCBhcmUgaW4KLQkJCQkgKiB1c2UuCi0JCQkJICovCisgICBHTHVpbnQgdGVtcF9mbGFnOyAgICAgICAgICAgIC8qIFRyYWNrcyB0ZW1wb3JhcnkgcmVncyB3aGljaCBhcmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgR0x1aW50IHV0ZW1wX2ZsYWc7ICAgICAgICAgICAvKiBUcmFja3MgVFlQRV9VIHRlbXBvcmFyeSByZWdzIHdoaWNoIGFyZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAKKyAgIC8qIFRyYWNrIHdoaWNoIFIgcmVnaXN0ZXJzIGFyZSAibGl2ZSIgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCisgICAgKiBBIHJlZ2lzdGVyIGlzIGxpdmUgYmV0d2VlbiB0aGUgdGltZSBpdCdzIHdyaXR0ZW4gdG8gYW5kIHRoZSBsYXN0IHRpbWUKKyAgICAqIGl0J3MgcmVhZC4gKi8KKyAgIEdMdWludCB1c2VkUmVnc1tJOTE1X01BWF9JTlNOXTsKIAogICAgLyogSGVscGVycyBmb3IgaTkxNV9mcmFncHJvZy5jOgogICAgICovCiAgICBHTHVpbnQgd3Bvc190ZXg7CiAgICBHTGJvb2xlYW4gZGVwdGhfd3JpdHRlbjsKIAotICAgc3RydWN0IHsgCi0gICAgICBHTHVpbnQgcmVnOwkJLyogSGFyZHdhcmUgY29uc3RhbnQgaWR4ICovCi0gICAgICBjb25zdCBHTGZsb2F0ICp2YWx1ZXM7IAkvKiBQb2ludGVyIHRvIHRyYWNrZWQgdmFsdWVzICovCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIEdMdWludCByZWc7ICAgICAgICAgICAgICAgLyogSGFyZHdhcmUgY29uc3RhbnQgaWR4ICovCisgICAgICBjb25zdCBHTGZsb2F0ICp2YWx1ZXM7ICAgIC8qIFBvaW50ZXIgdG8gdHJhY2tlZCB2YWx1ZXMgKi8KICAgIH0gcGFyYW1bSTkxNV9NQVhfQ09OU1RBTlRdOwogICAgR0x1aW50IG5yX3BhcmFtczsKLSAgICAgIAotCi0KLQotICAgLyogSGVscGVycyBmb3IgaTkxNV90ZXhwcm9nLmM6Ci0gICAgKi8KLSAgIEdMdWludCBzcmNfdGV4dHVyZTsJCS8qIFJlZyBjb250YWluaW5nIHNhbXBsZWQgdGV4dHVyZSBjb2xvciwKLQkJCQkgKiBlbHNlIFVSRUdfQkFELgotCQkJCSAqLwotCi0gICBHTHVpbnQgc3JjX3ByZXZpb3VzOwkJLyogUmVnIGNvbnRhaW5pbmcgY29sb3IgZnJvbSBwcmV2aW91cyAKLQkJCQkgKiBzdGFnZS4gIE1heSBuZWVkIHRvIGJlIGRlY2wnZC4KLQkJCQkgKi8KLQotICAgR0x1aW50IGxhc3RfdGV4X3N0YWdlOwkvKiBOdW1iZXIgb2YgbGFzdCBlbmFibGVkIHRleHR1cmUgdW5pdCAqLwotCi0gICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkI7CiB9OwogCiAKQEAgLTE4OCw2NyArMTg2LDY4IEBACiAKIAogCi1zdHJ1Y3QgaTkxNV90ZXh0dXJlX29iamVjdAotewotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0IGludGVsOwotICAgR0xlbnVtIGxhc3RUYXJnZXQ7Ci0gICBHTGJvb2xlYW4gcmVmc19ib3JkZXJfY29sb3I7Ci0gICBHTHVpbnQgU2V0dXBbSTkxNV9URVhfU0VUVVBfU0laRV07Ci19OwogCiAjZGVmaW5lIEk5MTVfVEVYX1VOSVRTIDgKIAogCi1zdHJ1Y3QgaTkxNV9od19zdGF0ZSB7CitzdHJ1Y3QgaTkxNV9od19zdGF0ZQorewogICAgR0x1aW50IEN0eFtJOTE1X0NUWF9TRVRVUF9TSVpFXTsKICAgIEdMdWludCBCdWZmZXJbSTkxNV9ERVNUX1NFVFVQX1NJWkVdOwogICAgR0x1aW50IFN0aXBwbGVbSTkxNV9TVFBfU0VUVVBfU0laRV07CiAgICBHTHVpbnQgRm9nW0k5MTVfRk9HX1NFVFVQX1NJWkVdOworICAgR0x1aW50IERlZmF1bHRzW0k5MTVfREVGX1NFVFVQX1NJWkVdOwogICAgR0x1aW50IFRleFtJOTE1X1RFWF9VTklUU11bSTkxNV9URVhfU0VUVVBfU0laRV07CiAgICBHTHVpbnQgQ29uc3RhbnRbSTkxNV9DT05TVEFOVF9TSVpFXTsKICAgIEdMdWludCBDb25zdGFudFNpemU7CiAgICBHTHVpbnQgUHJvZ3JhbVtJOTE1X1BST0dSQU1fU0laRV07CiAgICBHTHVpbnQgUHJvZ3JhbVNpemU7Ci0gICBHTHVpbnQgYWN0aXZlOwkJLyogSTkxNV9VUExPQURfKiAqLwotICAgR0x1aW50IGVtaXR0ZWQ7CQkvKiBJOTE1X1VQTE9BRF8qICovCisKKyAgIC8qIFJlZ2lvbiBwb2ludGVycyBmb3IgcmVsb2NhdGlvbjogCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRyYXdfcmVnaW9uOworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVwdGhfcmVnaW9uOworLyogICAgc3RydWN0IGludGVsX3JlZ2lvbiAqdGV4X3JlZ2lvbltJOTE1X1RFWF9VTklUU107ICovCisKKyAgIC8qIFJlZ2lvbnMgYXJlbid0IGFjdHVhbGx5IHRoYXQgYXBwcm9wcmlhdGUgaGVyZSBhcyB0aGUgbWVtb3J5IG1heQorICAgICogYmUgZnJvbSBhIFBCTyBvciBGQk8uICBXaWxsIGhhdmUgdG8gZG8gdGhpcyBmb3IgZHJhdyBhbmQgZGVwdGggZm9yCisgICAgKiBGQk8ncy4uLgorICAgICovCisgICBkcmlfYm8gKnRleF9idWZmZXJbSTkxNV9URVhfVU5JVFNdOworICAgR0x1aW50IHRleF9vZmZzZXRbSTkxNV9URVhfVU5JVFNdOworCisKKyAgIEdMdWludCBhY3RpdmU7ICAgICAgICAgICAgICAgLyogSTkxNV9VUExPQURfKiAqLworICAgR0x1aW50IGVtaXR0ZWQ7ICAgICAgICAgICAgICAvKiBJOTE1X1VQTE9BRF8qICovCiB9OwogCiAjZGVmaW5lIEk5MTVfRk9HX1BJWEVMICAyCiAjZGVmaW5lIEk5MTVfRk9HX1ZFUlRFWCAxCiAjZGVmaW5lIEk5MTVfRk9HX05PTkUgICAwCiAKLXN0cnVjdCBpOTE1X2NvbnRleHQgCitzdHJ1Y3QgaTkxNV9jb250ZXh0CiB7CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCBpbnRlbDsKIAogICAgR0x1aW50IGxhc3RfUmVhbGx5RW5hYmxlZDsKICAgIEdMdWludCB2ZXJ0ZXhfZm9nOworICAgR0x1aW50IGxvZGJpYXNfc3MyW01BWF9URVhUVVJFX1VOSVRTXTsKIAotICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSB0ZXhfcHJvZ3JhbTsKKwogICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqY3VycmVudF9wcm9ncmFtOwogCiAgICBzdHJ1Y3QgaTkxNV9od19zdGF0ZSBtZXRhLCBpbml0aWFsLCBzdGF0ZSwgKmN1cnJlbnQ7CiB9OwogCiAKLXR5cGVkZWYgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNUNvbnRleHRQdHI7Ci10eXBlZGVmIHN0cnVjdCBpOTE1X3RleHR1cmVfb2JqZWN0ICppOTE1VGV4dHVyZU9iamVjdFB0cjsKLQotI2RlZmluZSBJOTE1X0NPTlRFWFQoY3R4KQkoKGk5MTVDb250ZXh0UHRyKShjdHgpKQotCi0KLQogI2RlZmluZSBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIGZsYWcpCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotICAgaWYgKDApIGZwcmludGYoc3RkZXJyLCAiSTkxNV9TVEFURUNIQU5HRSAleCBpbiAlc1xuIiwgZmxhZywgX19GVU5DVElPTl9fKTsJXAogICAgSU5URUxfRklSRVZFUlRJQ0VTKCAmKGk5MTUpLT5pbnRlbCApOwkJCQkJXAogICAgKGk5MTUpLT5zdGF0ZS5lbWl0dGVkICY9IH4oZmxhZyk7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEk5MTVfQUNUSVZFU1RBVEUoaTkxNSwgZmxhZywgbW9kZSkJCQlcCiBkbyB7CQkJCQkJCQlcCi0gICBpZiAoMCkgZnByaW50ZihzdGRlcnIsICJJOTE1X0FDVElWRVNUQVRFICV4ICVkIGluICVzXG4iLAlcCi0JCSAgZmxhZywgbW9kZSwgX19GVU5DVElPTl9fKTsJCQlcCiAgICBJTlRFTF9GSVJFVkVSVElDRVMoICYoaTkxNSktPmludGVsICk7CQkJCVwKICAgIGlmIChtb2RlKQkJCQkJCQlcCiAgICAgICAoaTkxNSktPnN0YXRlLmFjdGl2ZSB8PSAoZmxhZyk7CQkJCVwKQEAgLTI2MCw3ICsyNTksMTMgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogaTkxNV92dGJsLmMKICAqLwotZXh0ZXJuIHZvaWQgaTkxNUluaXRWdGJsKCBpOTE1Q29udGV4dFB0ciBpOTE1ICk7CitleHRlcm4gdm9pZCBpOTE1SW5pdFZ0Ymwoc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSk7CisKK2V4dGVybiB2b2lkCitpOTE1X3N0YXRlX2RyYXdfcmVnaW9uKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGk5MTVfaHdfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpjb2xvcl9yZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlcHRoX3JlZ2lvbik7CiAKIAogCkBAIC0yODksNzAgKzI5NCw1OCBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBpOTE1X2NvbnRleHQuYwogICovCi1leHRlcm4gR0xib29sZWFuIGk5MTVDcmVhdGVDb250ZXh0KCBjb25zdCBfX0dMY29udGV4dE1vZGVzICptZXNhVmlzLAotCQkJCSAgICBfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdiwKLQkJCQkgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogaTkxNV90ZXhwcm9nLmMKLSAqLwotZXh0ZXJuIHZvaWQgaTkxNVZhbGlkYXRlVGV4dHVyZVByb2dyYW0oIGk5MTVDb250ZXh0UHRyIGk5MTUgKTsKK2V4dGVybiBHTGJvb2xlYW4gaTkxNUNyZWF0ZUNvbnRleHQoY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1lc2FWaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpOwogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogaTkxNV9kZWJ1Zy5jCiAgKi8KLWV4dGVybiB2b2lkIGk5MTVfZGlzYXNzZW1ibGVfcHJvZ3JhbSggY29uc3QgR0x1aW50ICpwcm9ncmFtLCBHTHVpbnQgc3ogKTsKLWV4dGVybiB2b2lkIGk5MTVfcHJpbnRfdXJlZyggY29uc3QgY2hhciAqbXNnLCBHTHVpbnQgdXJlZyApOworZXh0ZXJuIHZvaWQgaTkxNV9kaXNhc3NlbWJsZV9wcm9ncmFtKGNvbnN0IEdMdWludCAqIHByb2dyYW0sIEdMdWludCBzeik7CitleHRlcm4gdm9pZCBpOTE1X3ByaW50X3VyZWcoY29uc3QgY2hhciAqbXNnLCBHTHVpbnQgdXJlZyk7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBpOTE1X3N0YXRlLmMKICAqLwotZXh0ZXJuIHZvaWQgaTkxNUluaXRTdGF0ZUZ1bmN0aW9ucyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLWV4dGVybiB2b2lkIGk5MTVJbml0U3RhdGUoIGk5MTVDb250ZXh0UHRyIGk5MTUgKTsKLWV4dGVybiB2b2lkIGk5MTVfdXBkYXRlX2ZvZyhHTGNvbnRleHQgKmN0eHgpOworZXh0ZXJuIHZvaWQgaTkxNUluaXRTdGF0ZUZ1bmN0aW9ucyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyk7CitleHRlcm4gdm9pZCBpOTE1SW5pdFN0YXRlKHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUpOworZXh0ZXJuIHZvaWQgaTkxNV91cGRhdGVfZm9nKEdMY29udGV4dCAqIGN0eCk7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBpOTE1X3RleC5jCiAgKi8KLWV4dGVybiB2b2lkIGk5MTVVcGRhdGVUZXh0dXJlU3RhdGUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApOwotZXh0ZXJuIHZvaWQgaTkxNUluaXRUZXh0dXJlRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci1leHRlcm4gaW50ZWxUZXh0dXJlT2JqZWN0UHRyIGk5MTVBbGxvY1RleE9iaiggc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogKTsKK2V4dGVybiB2b2lkIGk5MTVVcGRhdGVUZXh0dXJlU3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKK2V4dGVybiB2b2lkIGk5MTVJbml0VGV4dHVyZUZ1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBpOTE1X21ldGFvcHMuYwogICovCi1leHRlcm4gR0xib29sZWFuCi1pOTE1VHJ5VGV4dHVyZVJlYWRQaXhlbHMoIEdMY29udGV4dCAqY3R4LAotCQkJICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLQkJCSAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCi0JCQkgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFjaywKLQkJCSAgR0x2b2lkICpwaXhlbHMgKTsKK3ZvaWQgaTkxNUluaXRNZXRhRnVuY3Moc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSk7CiAKLWV4dGVybiBHTGJvb2xlYW4KLWk5MTVUcnlUZXh0dXJlRHJhd1BpeGVscyggR0xjb250ZXh0ICpjdHgsCi0JCQkgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotCQkJICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLQkJCSAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCi0JCQkgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7Ci0KLWV4dGVybiB2b2lkIAotaTkxNUNsZWFyV2l0aFRyaXMoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0xiaXRmaWVsZCBtYXNrLAotCQkgICBHTGJvb2xlYW4gYWxsLCBHTGludCBjeCwgR0xpbnQgY3ksIEdMaW50IGN3LCBHTGludCBjaCk7Ci0KLQotZXh0ZXJuIHZvaWQKLWk5MTVSb3RhdGVXaW5kb3coaW50ZWxDb250ZXh0UHRyIGludGVsLCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0gICAgICAgICAgICAgICAgIEdMdWludCBzcmNCdWYpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIGk5MTVfZnJhZ3Byb2cuYwogICovCi1leHRlcm4gdm9pZCBpOTE1VmFsaWRhdGVGcmFnbWVudFByb2dyYW0oIGk5MTVDb250ZXh0UHRyIGk5MTUgKTsKLWV4dGVybiB2b2lkIGk5MTVJbml0RnJhZ1Byb2dGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLQkKLSNlbmRpZgorZXh0ZXJuIHZvaWQgaTkxNVZhbGlkYXRlRnJhZ21lbnRQcm9ncmFtKHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUpOworZXh0ZXJuIHZvaWQgaTkxNUluaXRGcmFnUHJvZ0Z1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKTsKIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbmxpbmUgY29udmVyc2lvbiBmdW5jdGlvbnMuICBUaGVzZSBhcmUgYmV0dGVyLXR5cGVkIHRoYW4gdGhlCisgKiBtYWNyb3MgdXNlZCBwcmV2aW91c2x5OgorICovCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBpOTE1X2NvbnRleHQgKgoraTkxNV9jb250ZXh0KEdMY29udGV4dCAqIGN0eCkKK3sKKyAgIHJldHVybiAoc3RydWN0IGk5MTVfY29udGV4dCAqKSBjdHg7Cit9CisKKworCisjZGVmaW5lIEk5MTVfQ09OVEVYVChjdHgpCWk5MTVfY29udGV4dChjdHgpCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9kZWJ1Zy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2RlYnVnLmMKaW5kZXggMDU0YjU2MS4uOGViMWM1YiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2RlYnVnLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2RlYnVnLmMKQEAgLTI1LDI3NSArMjUsODI0IEBACiAgKiAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgImltcG9ydHMuaCIKKwogI2luY2x1ZGUgImk5MTVfcmVnLmgiCiAjaW5jbHVkZSAiaTkxNV9jb250ZXh0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJpOTE1X2RlYnVnLmgiCiAKKyNkZWZpbmUgUFJJTlRGKCAuLi4gKSBfbWVzYV9wcmludGYoIF9fVkFfQVJHU19fICkKIAotc3RhdGljIGNvbnN0IGNoYXIgKm9wY29kZXNbMHgyMF0gPSB7Ci0gICAiTk9QIiwKLSAgICJBREQiLAotICAgIk1PViIsCi0gICAiTVVMIiwKLSAgICJNQUQiLAotICAgIkRQMkFERCIsCi0gICAiRFAzIiwKLSAgICJEUDQiLAotICAgIkZSQyIsCi0gICAiUkNQIiwKLSAgICJSU1EiLAotICAgIkVYUCIsCi0gICAiTE9HIiwKLSAgICJDTVAiLAotICAgIk1JTiIsCi0gICAiTUFYIiwKLSAgICJGTFIiLAotICAgIk1PRCIsCi0gICAiVFJDIiwKLSAgICJTR0UiLAotICAgIlNMVCIsCi0gICAiVEVYTEQiLAotICAgIlRFWExEUCIsCi0gICAiVEVYTERCIiwKLSAgICJURVhLSUxMIiwKLSAgICJEQ0wiLAotICAgIjB4MWEiLAotICAgIjB4MWIiLAotICAgIjB4MWMiLAotICAgIjB4MWQiLAotICAgIjB4MWUiLAotICAgIjB4MWYiLAotfTsKLQotCi1zdGF0aWMgY29uc3QgaW50IGFyZ3NbMHgyMF0gPSB7Ci0gICAwLAkJCQkvKiAwIG5vcCAqLwotICAgMiwJCQkJLyogMSBhZGQgKi8KLSAgIDEsCQkJCS8qIDIgbW92ICovCi0gICAyLAkJCQkvKiAzIG0gdWwgKi8KLSAgIDMsIAkJCQkvKiA0IG1hZCAqLwotICAgMywJCQkJLyogNSBkcDJhZGQgKi8KLSAgIDIsCQkJCS8qIDYgZHAzICovCi0gICAyLAkJCQkvKiA3IGRwNCAqLwotICAgMSwJCQkJLyogOCBmcmMgKi8KLSAgIDEsCQkJCS8qIDkgcmNwICovCi0gICAxLAkJCQkvKiBhIHJzcSAqLwotICAgMSwJCQkJLyogYiBleHAgKi8KLSAgIDEsCQkJCS8qIGMgbG9nICovCi0gICAzLAkJCQkvKiBkIGNtcCAqLwotICAgMiwJCQkJLyogZSBtaW4gKi8KLSAgIDIsCQkJCS8qIGYgbWF4ICovCi0gICAxLAkJCQkvKiAxMCBmbHIgKi8KLSAgIDEsCQkJCS8qIDExIG1vZCAqLwotICAgMSwJCQkJLyogMTIgdHJjICovCi0gICAyLAkJCQkvKiAxMyBzZ2UgKi8KLSAgIDIsCQkJCS8qIDE0IHNsdCAqLwotICAgMSwKLSAgIDEsCi0gICAxLAotICAgMSwKLSAgIDAsCi0gICAwLAotICAgMCwKLSAgIDAsCi0gICAwLAotICAgMCwKLSAgIDAsCi19OwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpyZWduYW1lWzB4OF0gPSB7Ci0gICAiUiIsCi0gICAiVCIsCi0gICAiQ09OU1QiLAotICAgIlMiLAotICAgIk9DIiwKLSAgICJPRCIsCi0gICAiVSIsCi0gICAiVU5LTk9XTiIsCi19OwotCi1zdGF0aWMgdm9pZCBwcmludF9yZWdfdHlwZV9uciggR0x1aW50IHR5cGUsIEdMdWludCBuciApCitzdGF0aWMgR0xib29sZWFuIGRlYnVnKCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sIGNvbnN0IGNoYXIgKm5hbWUsIEdMdWludCBsZW4gKQogewotICAgc3dpdGNoICh0eXBlKSB7Ci0gICBjYXNlIFJFR19UWVBFX1Q6Ci0gICAgICBzd2l0Y2ggKG5yKSB7Ci0gICAgICBjYXNlIFRfRElGRlVTRTogZnByaW50ZihzdGRlcnIsICJUX0RJRkZVU0UiKTsgcmV0dXJuOwotICAgICAgY2FzZSBUX1NQRUNVTEFSOiBmcHJpbnRmKHN0ZGVyciwgIlRfU1BFQ1VMQVIiKTsgcmV0dXJuOwotICAgICAgY2FzZSBUX0ZPR19XOiBmcHJpbnRmKHN0ZGVyciwgIlRfRk9HX1ciKTsgcmV0dXJuOwotICAgICAgZGVmYXVsdDogZnByaW50ZihzdGRlcnIsICJUX1RFWCVkIiwgbnIpOyByZXR1cm47Ci0gICAgICB9Ci0gICBjYXNlIFJFR19UWVBFX09DOgotICAgICAgaWYgKG5yID09IDApIHsKLQkgZnByaW50ZihzdGRlcnIsICJvQyIpOwotCSByZXR1cm47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIGNhc2UgUkVHX1RZUEVfT0Q6Ci0gICAgICBpZiAobnIgPT0gMCkgewotCSBmcHJpbnRmKHN0ZGVyciwgIm9EIik7Ci0JIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgIiVzWyVkXSIsIHJlZ25hbWVbdHlwZV0sIG5yKTsKLX0KLQotI2RlZmluZSBSRUdfU1dJWlpMRV9NQVNLIDB4Nzc3NwotI2RlZmluZSBSRUdfTkVHQVRFX01BU0sgMHg4ODg4Ci0KLSNkZWZpbmUgUkVHX1NXSVpaTEVfWFlaVyAoKFNSQ19YIDw8IEEyX1NSQzJfQ0hBTk5FTF9YX1NISUZUKSB8CVwKLQkJICAgICAgKFNSQ19ZIDw8IEEyX1NSQzJfQ0hBTk5FTF9ZX1NISUZUKSB8CVwKLQkJICAgICAgKFNSQ19aIDw8IEEyX1NSQzJfQ0hBTk5FTF9aX1NISUZUKSB8CVwKLQkJICAgICAgKFNSQ19XIDw8IEEyX1NSQzJfQ0hBTk5FTF9XX1NISUZUKSkKLQotCi1zdGF0aWMgdm9pZCBwcmludF9yZWdfbmVnX3N3aXp6bGUoIEdMdWludCByZWcgKQotewotICAgaW50IGk7Ci0KLSAgIGlmICgocmVnICYgUkVHX1NXSVpaTEVfTUFTSykgPT0gUkVHX1NXSVpaTEVfWFlaVyAmJgotICAgICAgIChyZWcgJiBSRUdfTkVHQVRFX01BU0spID09IDApCi0gICAgICByZXR1cm47Ci0KLSAgIGZwcmludGYoc3RkZXJyLCAiLiIpOwotCi0gICBmb3IgKGkgPSAzIDsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIGlmIChyZWcgJiAoMTw8KChpKjQpKzMpKSkgCi0JIGZwcmludGYoc3RkZXJyLCAiLSIpOwotCSAKLSAgICAgIHN3aXRjaCAoKHJlZz4+KGkqNCkpICYgMHg3KSB7Ci0gICAgICBjYXNlIDA6IGZwcmludGYoc3RkZXJyLCAieCIpOyBicmVhazsKLSAgICAgIGNhc2UgMTogZnByaW50ZihzdGRlcnIsICJ5Iik7IGJyZWFrOwotICAgICAgY2FzZSAyOiBmcHJpbnRmKHN0ZGVyciwgInoiKTsgYnJlYWs7Ci0gICAgICBjYXNlIDM6IGZwcmludGYoc3RkZXJyLCAidyIpOyBicmVhazsKLSAgICAgIGNhc2UgNDogZnByaW50ZihzdGRlcnIsICIwIik7IGJyZWFrOwotICAgICAgY2FzZSA1OiBmcHJpbnRmKHN0ZGVyciwgIjEiKTsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiBmcHJpbnRmKHN0ZGVyciwgIj8iKTsgYnJlYWs7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgcHJpbnRfc3JjX3JlZyggR0x1aW50IGR3b3JkICkKLXsKLSAgIEdMdWludCBuciA9IChkd29yZCA+PiBBMl9TUkMyX05SX1NISUZUKSAmIFJFR19OUl9NQVNLOwotICAgR0x1aW50IHR5cGUgPSAoZHdvcmQgPj4gQTJfU1JDMl9UWVBFX1NISUZUKSAmIFJFR19UWVBFX01BU0s7Ci0gICBwcmludF9yZWdfdHlwZV9uciggdHlwZSwgbnIgKTsKLSAgIHByaW50X3JlZ19uZWdfc3dpenpsZSggZHdvcmQgKTsKLX0KLQotdm9pZCBpOTE1X3ByaW50X3VyZWcoIGNvbnN0IGNoYXIgKm1zZywgR0x1aW50IHVyZWcgKQotewotICAgZnByaW50ZihzdGRlcnIsICIlczogIiwgbXNnKTsKLSAgIHByaW50X3NyY19yZWcoIHVyZWcgPj4gOCApOwotICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9kZXN0X3JlZyggR0x1aW50IGR3b3JkICkKLXsKLSAgIEdMdWludCBuciA9IChkd29yZCA+PiBBMF9ERVNUX05SX1NISUZUKSAmIFJFR19OUl9NQVNLOwotICAgR0x1aW50IHR5cGUgPSAoZHdvcmQgPj4gQTBfREVTVF9UWVBFX1NISUZUKSAmIFJFR19UWVBFX01BU0s7Ci0gICBwcmludF9yZWdfdHlwZV9uciggdHlwZSwgbnIgKTsKLSAgIGlmICgoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfQUxMKSA9PSBBMF9ERVNUX0NIQU5ORUxfQUxMKQotICAgICAgcmV0dXJuOwotICAgZnByaW50ZihzdGRlcnIsICIuIik7Ci0gICBpZiAoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfWCkgZnByaW50ZihzdGRlcnIsICJ4Iik7Ci0gICBpZiAoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfWSkgZnByaW50ZihzdGRlcnIsICJ5Iik7Ci0gICBpZiAoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfWikgZnByaW50ZihzdGRlcnIsICJ6Iik7Ci0gICBpZiAoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfVykgZnByaW50ZihzdGRlcnIsICJ3Iik7Ci19Ci0KLQotI2RlZmluZSBHRVRfU1JDMF9SRUcocjAsIHIxKSAoKHIwPDwxNCl8KHIxPj5BMV9TUkMwX0NIQU5ORUxfV19TSElGVCkpCi0jZGVmaW5lIEdFVF9TUkMxX1JFRyhyMCwgcjEpICgocjA8PDgpfChyMT4+QTJfU1JDMV9DSEFOTkVMX1dfU0hJRlQpKQotI2RlZmluZSBHRVRfU1JDMl9SRUcocikgICAgICAocikKLQotCi1zdGF0aWMgdm9pZCBwcmludF9hcml0aF9vcCggR0x1aW50IG9wY29kZSwgY29uc3QgR0x1aW50ICpwcm9ncmFtICkKLXsKLSAgIGlmIChvcGNvZGUgIT0gQTBfTk9QKSB7Ci0gICAgICBwcmludF9kZXN0X3JlZyhwcm9ncmFtWzBdKTsKLSAgICAgIGlmIChwcm9ncmFtWzBdICYgQTBfREVTVF9TQVRVUkFURSkKLQkgZnByaW50ZihzdGRlcnIsICIgPSBTQVRVUkFURSAiKTsKLSAgICAgIGVsc2UKLQkgZnByaW50ZihzdGRlcnIsICIgPSAiKTsKLSAgIH0KLQotICAgZnByaW50ZihzdGRlcnIsICIlcyAiLCBvcGNvZGVzW29wY29kZV0pOwotCi0gICBwcmludF9zcmNfcmVnKEdFVF9TUkMwX1JFRyhwcm9ncmFtWzBdLCBwcm9ncmFtWzFdKSk7Ci0gICBpZiAoYXJnc1tvcGNvZGVdID09IDEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZnByaW50ZihzdGRlcnIsICIsICIpOwotICAgcHJpbnRfc3JjX3JlZyhHRVRfU1JDMV9SRUcocHJvZ3JhbVsxXSwgcHJvZ3JhbVsyXSkpOwotICAgaWYgKGFyZ3Nbb3Bjb2RlXSA9PSAyKSB7IAotICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgIiwgIik7Ci0gICBwcmludF9zcmNfcmVnKEdFVF9TUkMyX1JFRyhwcm9ncmFtWzJdKSk7Ci0gICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgcHJpbnRfdGV4X29wKCBHTHVpbnQgb3Bjb2RlLCBjb25zdCBHTHVpbnQgKnByb2dyYW0gKQotewotICAgcHJpbnRfZGVzdF9yZWcocHJvZ3JhbVswXSB8IEEwX0RFU1RfQ0hBTk5FTF9BTEwpOwotICAgZnByaW50ZihzdGRlcnIsICIgPSAiKTsKLQotICAgZnByaW50ZihzdGRlcnIsICIlcyAiLCBvcGNvZGVzW29wY29kZV0pOwotCi0gICBmcHJpbnRmKHN0ZGVyciwgIlNbJWRdLCIsIAotCSAgIHByb2dyYW1bMF0gJiBUMF9TQU1QTEVSX05SX01BU0spOwotCi0gICBwcmludF9yZWdfdHlwZV9uciggKHByb2dyYW1bMV0+PlQxX0FERFJFU1NfUkVHX1RZUEVfU0hJRlQpICYgUkVHX1RZUEVfTUFTSywKLQkJICAgICAgKHByb2dyYW1bMV0+PlQxX0FERFJFU1NfUkVHX05SX1NISUZUKSAmIFJFR19OUl9NQVNLICk7Ci0gICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2RjbF9vcCggR0x1aW50IG9wY29kZSwgY29uc3QgR0x1aW50ICpwcm9ncmFtICkKLXsKLSAgIGZwcmludGYoc3RkZXJyLCAiJXMgIiwgb3Bjb2Rlc1tvcGNvZGVdKTsKLSAgIHByaW50X2Rlc3RfcmVnKHByb2dyYW1bMF0gfCBBMF9ERVNUX0NIQU5ORUxfQUxMKTsKLSAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLQotCi12b2lkIGk5MTVfZGlzYXNzZW1ibGVfcHJvZ3JhbSggY29uc3QgR0x1aW50ICpwcm9ncmFtLCBHTHVpbnQgc3ogKQotewotICAgR0x1aW50IHNpemUgPSBwcm9ncmFtWzBdICYgMHgxZmY7Ci0gICBHTGludCBpOworICAgR0x1aW50IGk7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CiAgICAKLSAgIGZwcmludGYoc3RkZXJyLCAiQkVHSU5cbiIpOwotCi0gICBpZiAoc2l6ZSsyICE9IHN6KSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBwcm9ncmFtIHNpemUgbWlzbWF0Y2ggJWQvJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkgICAgICBzaXplKzIsIHN6KTsKLSAgICAgIGV4aXQoMSk7CisgICBpZiAobGVuID09IDApIHsKKyAgICAgIFBSSU5URigiRXJyb3IgLSB6ZXJvIGxlbmd0aCBwYWNrZXQgKDB4JTA4eClcbiIsIHN0cmVhbS0+cHRyWzBdKTsKKyAgICAgIGFzc2VydCgwKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKICAgIH0KIAotICAgcHJvZ3JhbSArKzsKLSAgIGZvciAoaSA9IDEgOyBpIDwgc3ogOyBpKz0zLCBwcm9ncmFtKz0zKSB7Ci0gICAgICBHTHVpbnQgb3Bjb2RlID0gcHJvZ3JhbVswXSAmICgweDFmPDwyNCk7CisgICBpZiAoc3RyZWFtLT5wcmludF9hZGRyZXNzZXMpCisgICAgICBQUklOVEYoIiUwOHg6ICAiLCBzdHJlYW0tPm9mZnNldCk7CiAKLSAgICAgIGlmICgoR0xpbnQpIG9wY29kZSA+PSBBMF9OT1AgJiYgb3Bjb2RlIDw9IEEwX1NMVCkKLQkgcHJpbnRfYXJpdGhfb3Aob3Bjb2RlID4+IDI0LCBwcm9ncmFtKTsKLSAgICAgIGVsc2UgaWYgKG9wY29kZSA+PSBUMF9URVhMRCAmJiBvcGNvZGUgPD0gVDBfVEVYS0lMTCkKLQkgcHJpbnRfdGV4X29wKG9wY29kZSA+PiAyNCwgcHJvZ3JhbSk7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUgPT0gRDBfRENMKQotCSBwcmludF9kY2xfb3Aob3Bjb2RlID4+IDI0LCBwcm9ncmFtKTsKLSAgICAgIGVsc2UgCi0JIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcGNvZGUgMHgleFxuIiwgb3Bjb2RlKTsKLSAgIH0KIAotICAgZnByaW50ZihzdGRlcnIsICJFTkRcblxuIik7CisgICBQUklOVEYoIiVzICglZCBkd29yZHMpOlxuIiwgbmFtZSwgbGVuKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaV0pOyAgIAorICAgUFJJTlRGKCJcbiIpOworCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIAorICAgcmV0dXJuIEdMX1RSVUU7CiB9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wcmltX25hbWUoIEdMdWludCB2YWwgKQoreworICAgc3dpdGNoICh2YWwgJiBQUklNM0RfTUFTSykgeworICAgY2FzZSBQUklNM0RfVFJJTElTVDogcmV0dXJuICJUUklMSVNUIjsgYnJlYWs7CisgICBjYXNlIFBSSU0zRF9UUklTVFJJUDogcmV0dXJuICJUUklTVFJJUCI7IGJyZWFrOworICAgY2FzZSBQUklNM0RfVFJJU1RSSVBfUlZSU0U6IHJldHVybiAiVFJJU1RSSVBfUlZSU0UiOyBicmVhazsKKyAgIGNhc2UgUFJJTTNEX1RSSUZBTjogcmV0dXJuICJUUklGQU4iOyBicmVhazsKKyAgIGNhc2UgUFJJTTNEX1BPTFk6IHJldHVybiAiUE9MWSI7IGJyZWFrOworICAgY2FzZSBQUklNM0RfTElORUxJU1Q6IHJldHVybiAiTElORUxJU1QiOyBicmVhazsKKyAgIGNhc2UgUFJJTTNEX0xJTkVTVFJJUDogcmV0dXJuICJMSU5FU1RSSVAiOyBicmVhazsKKyAgIGNhc2UgUFJJTTNEX1JFQ1RMSVNUOiByZXR1cm4gIlJFQ1RMSVNUIjsgYnJlYWs7CisgICBjYXNlIFBSSU0zRF9QT0lOVExJU1Q6IHJldHVybiAiUE9JTlRMSVNUIjsgYnJlYWs7CisgICBjYXNlIFBSSU0zRF9ESUI6IHJldHVybiAiRElCIjsgYnJlYWs7CisgICBjYXNlIFBSSU0zRF9DTEVBUl9SRUNUOiByZXR1cm4gIkNMRUFSX1JFQ1QiOyBicmVhazsKKyAgIGNhc2UgUFJJTTNEX1pPTkVfSU5JVDogcmV0dXJuICJaT05FX0lOSVQiOyBicmVhazsKKyAgIGRlZmF1bHQ6IHJldHVybiAiPz8/PyI7IGJyZWFrOworICAgfQorfQorCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX3ByaW0oIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSwgCisJCQkgICAgIEdMYm9vbGVhbiBkdW1wX2Zsb2F0cywKKwkJCSAgICAgR0x1aW50IGxlbiApCit7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CisgICBjb25zdCBjaGFyICpwcmltID0gZ2V0X3ByaW1fbmFtZSggcHRyWzBdICk7CisgICBHTHVpbnQgaTsKKyAgIAorCisKKyAgIFBSSU5URigiJXMgJXMgKCVkIGR3b3Jkcyk6XG4iLCBuYW1lLCBwcmltLCBsZW4pOworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHB0clswXSk7ICAgCisgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmIChkdW1wX2Zsb2F0cykKKwkgUFJJTlRGKCJcdDB4JTA4eCAvLyAlZlxuIiwgIHB0cltpXSwgKihHTGZsb2F0ICopJnB0cltpXSk7ICAgCisgICAgICBlbHNlCisJIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaV0pOyAgIAorICAgfQorCisgICAgICAKKyAgIFBSSU5URigiXG4iKTsKKworICAgc3RyZWFtLT5vZmZzZXQgKz0gbGVuICogc2l6ZW9mKEdMdWludCk7CisgICAKKyAgIHJldHVybiBHTF9UUlVFOworfQorICAgCisKKworCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX3Byb2dyYW0oIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSwgR0x1aW50IGxlbiApCit7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CisKKyAgIGlmIChsZW4gPT0gMCkgeworICAgICAgUFJJTlRGKCJFcnJvciAtIHplcm8gbGVuZ3RoIHBhY2tldCAoMHglMDh4KVxuIiwgc3RyZWFtLT5wdHJbMF0pOworICAgICAgYXNzZXJ0KDApOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoc3RyZWFtLT5wcmludF9hZGRyZXNzZXMpCisgICAgICBQUklOVEYoIiUwOHg6ICAiLCBzdHJlYW0tPm9mZnNldCk7CisKKyAgIFBSSU5URigiJXMgKCVkIGR3b3Jkcyk6XG4iLCBuYW1lLCBsZW4pOworICAgaTkxNV9kaXNhc3NlbWJsZV9wcm9ncmFtKCBwdHIsIGxlbiApOworCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKK3N0YXRpYyBHTGJvb2xlYW4gZGVidWdfY2hhaW4oIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwgY29uc3QgY2hhciAqbmFtZSwgR0x1aW50IGxlbiApCit7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CisgICBHTHVpbnQgb2xkX29mZnNldCA9IHN0cmVhbS0+b2Zmc2V0ICsgbGVuICogc2l6ZW9mKEdMdWludCk7CisgICBHTHVpbnQgaTsKKworICAgUFJJTlRGKCIlcyAoJWQgZHdvcmRzKTpcbiIsIG5hbWUsIGxlbik7CisgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2ldKTsKKworICAgc3RyZWFtLT5vZmZzZXQgPSBwdHJbMV0gJiB+MHgzOworICAgCisgICBpZiAoc3RyZWFtLT5vZmZzZXQgPCBvbGRfb2Zmc2V0KQorICAgICAgUFJJTlRGKCJcbi4uLiBza2lwcGluZyBiYWNrd2FyZHMgZnJvbSAweCV4IC0tPiAweCV4IC4uLlxuXG4iLCAKKwkJICAgb2xkX29mZnNldCwgc3RyZWFtLT5vZmZzZXQgKTsKKyAgIGVsc2UKKyAgICAgIFBSSU5URigiXG4uLi4gc2tpcHBpbmcgZnJvbSAweCV4IC0tPiAweCV4IC4uLlxuXG4iLCAKKwkJICAgb2xkX29mZnNldCwgc3RyZWFtLT5vZmZzZXQgKTsKKworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX3ZhcmlhYmxlX2xlbmd0aF9wcmltKCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgY29uc3QgY2hhciAqcHJpbSA9IGdldF9wcmltX25hbWUoIHB0clswXSApOworICAgR0x1aW50IGksIGxlbjsKKworICAgR0x1c2hvcnQgKmlkeCA9IChHTHVzaG9ydCAqKShwdHIrMSk7CisgICBmb3IgKGkgPSAwOyBpZHhbaV0gIT0gMHhmZmZmOyBpKyspCisgICAgICA7CisKKyAgIGxlbiA9IDErKGkrMikvMjsKKworICAgUFJJTlRGKCIzRFBSSU0sICVzIHZhcmlhYmxlIGxlbmd0aCAlZCBpbmRpY2llcyAoJWQgZHdvcmRzKTpcbiIsIHByaW0sIGksIGxlbik7CisgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2ldKTsKKyAgIFBSSU5URigiXG4iKTsKKworICAgc3RyZWFtLT5vZmZzZXQgKz0gbGVuICogc2l6ZW9mKEdMdWludCk7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisjZGVmaW5lIEJJVFMoIGR3LCBoaSwgbG8sIC4uLiApCQkJCVwKK2RvIHsJCQkJCQkJXAorICAgdW5zaWduZWQgaGltYXNrID0gfjBVTCA+PiAoMzEgLSAoaGkpKTsJCVwKKyAgIFBSSU5URigiXHRcdCAiKTsJCQkJXAorICAgUFJJTlRGKF9fVkFfQVJHU19fKTsJCQlcCisgICBQUklOVEYoIjogMHgleFxuIiwgKChkdykgJiBoaW1hc2spID4+IChsbykpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1CWiggZHcsIGhpLCBsbykgZG8gewkJCQkJCQlcCisgICB1bnNpZ25lZCB4ID0gKGR3KSA+PiAobG8pOwkJCQlcCisgICB1bnNpZ25lZCBsb21hc2sgPSAoMSA8PCAobG8pKSAtIDE7CQkJXAorICAgdW5zaWduZWQgaGltYXNrOwkJCQkJXAorICAgaGltYXNrID0gKDFVTCA8PCAoaGkpKSAtIDE7CQkJCVwKKyAgIGFzc2VydCAoKHggJiBoaW1hc2sgJiB+bG9tYXNrKSA9PSAwKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGTEFHKCBkdywgYml0LCAuLi4gKQkJCVwKK2RvIHsJCQkJCQkJXAorICAgaWYgKCgoZHcpID4+IChiaXQpKSAmIDEpIHsJCQkJXAorICAgICAgUFJJTlRGKCJcdFx0ICIpOwkJCQlcCisgICAgICBQUklOVEYoX19WQV9BUkdTX18pOwkJCVwKKyAgICAgIFBSSU5URigiXG4iKTsJCQkJXAorICAgfQkJCQkJCQlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX2xvYWRfaW1tZWRpYXRlKCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIEdMdWludCBsZW4gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgR0x1aW50IGJpdHMgPSAocHRyWzBdID4+IDQpICYgMHhmZjsKKyAgIEdMdWludCBqID0gMDsKKyAgIAorICAgUFJJTlRGKCIlcyAoJWQgZHdvcmRzLCBmbGFnczogJXgpOlxuIiwgbmFtZSwgbGVuLCBiaXRzKTsKKyAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaisrXSk7CisKKyAgIGlmIChiaXRzICYgKDE8PDApKSB7CisgICAgICBQUklOVEYoIlx0ICBMSVMwOiAweCUwOHhcbiIsIHB0cltqXSk7CisgICAgICBQUklOVEYoIlx0IHZiIGFkZHJlc3M6IDB4JTA4eFxuIiwgKHB0cltqXSAmIH4weDMpKTsKKyAgICAgIEJJVFMocHRyW2pdLCAwLCAwLCAidmIgaW52YWxpZGF0ZSBkaXNhYmxlIik7CisgICAgICBqKys7CisgICB9CisgICBpZiAoYml0cyAmICgxPDwxKSkgeworICAgICAgUFJJTlRGKCJcdCAgTElTMTogMHglMDh4XG4iLCBwdHJbal0pOworICAgICAgQklUUyhwdHJbal0sIDI5LCAyNCwgInZiIGR3b3JkIHdpZHRoIik7CisgICAgICBCSVRTKHB0cltqXSwgMjEsIDE2LCAidmIgZHdvcmQgcGl0Y2giKTsKKyAgICAgIEJJVFMocHRyW2pdLCAxNSwgMCwgInZiIG1heCBpbmRleCIpOworICAgICAgaisrOworICAgfQorICAgaWYgKGJpdHMgJiAoMTw8MikpIHsKKyAgICAgIGludCBpOworICAgICAgUFJJTlRGKCJcdCAgTElTMjogMHglMDh4XG4iLCBwdHJbal0pOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCSB1bnNpZ25lZCB0YyA9IChwdHJbal0gPj4gKGkgKiA0KSkgJiAweGY7CisJIGlmICh0YyAhPSAweGYpCisJICAgIEJJVFModGMsIDMsIDAsICJ0ZXggY29vcmQgJWQiLCBpKTsKKyAgICAgIH0KKyAgICAgIGorKzsKKyAgIH0KKyAgIGlmIChiaXRzICYgKDE8PDMpKSB7CisgICAgICBQUklOVEYoIlx0ICBMSVMzOiAweCUwOHhcbiIsIHB0cltqXSk7CisgICAgICBqKys7CisgICB9CisgICBpZiAoYml0cyAmICgxPDw0KSkgeworICAgICAgUFJJTlRGKCJcdCAgTElTNDogMHglMDh4XG4iLCBwdHJbal0pOworICAgICAgQklUUyhwdHJbal0sIDMxLCAyMywgInBvaW50IHdpZHRoIik7CisgICAgICBCSVRTKHB0cltqXSwgMjIsIDE5LCAibGluZSB3aWR0aCIpOworICAgICAgRkxBRyhwdHJbal0sIDE4LCAiYWxwaGEgZmxhdHNoYWRlIik7CisgICAgICBGTEFHKHB0cltqXSwgMTcsICJmb2cgZmxhdHNoYWRlIik7CisgICAgICBGTEFHKHB0cltqXSwgMTYsICJzcGVjIGZsYXRzaGFkZSIpOworICAgICAgRkxBRyhwdHJbal0sIDE1LCAicmdiIGZsYXRzaGFkZSIpOworICAgICAgQklUUyhwdHJbal0sIDE0LCAxMywgImN1bGwgbW9kZSIpOworICAgICAgRkxBRyhwdHJbal0sIDEyLCAidmZtdDogcG9pbnQgd2lkdGgiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAxMSwgInZmbXQ6IHNwZWN1bGFyL2ZvZyIpOworICAgICAgRkxBRyhwdHJbal0sIDEwLCAidmZtdDogcmdiYSIpOworICAgICAgRkxBRyhwdHJbal0sIDksICJ2Zm10OiBkZXB0aCBvZmZzZXQiKTsKKyAgICAgIEJJVFMocHRyW2pdLCA4LCA2LCAidmZtdDogcG9zaXRpb24gKDI9PXh5encpIik7CisgICAgICBGTEFHKHB0cltqXSwgNSwgImZvcmNlIGRmbHQgZGlmZnVzZSIpOworICAgICAgRkxBRyhwdHJbal0sIDQsICJmb3JjZSBkZmx0IHNwZWN1bGFyIik7CisgICAgICBGTEFHKHB0cltqXSwgMywgImxvY2FsIGRlcHRoIG9mZnNldCBlbmFibGUiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyLCAidmZtdDogZnAzMiBmb2cgY29vcmQiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAxLCAic3ByaXRlIHBvaW50Iik7CisgICAgICBGTEFHKHB0cltqXSwgMCwgImFudGlhbGlhc2luZyIpOworICAgICAgaisrOworICAgfQorICAgaWYgKGJpdHMgJiAoMTw8NSkpIHsKKyAgICAgIFBSSU5URigiXHQgIExJUzU6IDB4JTA4eFxuIiwgcHRyW2pdKTsKKyAgICAgIEJJVFMocHRyW2pdLCAzMSwgMjgsICJyZ2JhIHdyaXRlIGRpc2FibGVzIik7CisgICAgICBGTEFHKHB0cltqXSwgMjcsICAgICAiZm9yY2UgZGZsdCBwb2ludCB3aWR0aCIpOworICAgICAgRkxBRyhwdHJbal0sIDI2LCAgICAgImxhc3QgcGl4ZWwgZW5hYmxlIik7CisgICAgICBGTEFHKHB0cltqXSwgMjUsICAgICAiZ2xvYmFsIHogb2Zmc2V0IGVuYWJsZSIpOworICAgICAgRkxBRyhwdHJbal0sIDI0LCAgICAgImZvZyBlbmFibGUiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAyMywgMTYsICJzdGVuY2lsIHJlZiIpOworICAgICAgQklUUyhwdHJbal0sIDE1LCAxMywgInN0ZW5jaWwgdGVzdCIpOworICAgICAgQklUUyhwdHJbal0sIDEyLCAxMCwgInN0ZW5jaWwgZmFpbCBvcCIpOworICAgICAgQklUUyhwdHJbal0sIDksIDcsICAgInN0ZW5jaWwgcGFzcyB6IGZhaWwgb3AiKTsKKyAgICAgIEJJVFMocHRyW2pdLCA2LCA0LCAgICJzdGVuY2lsIHBhc3MgeiBwYXNzIG9wIik7CisgICAgICBGTEFHKHB0cltqXSwgMywgICAgICAic3RlbmNpbCB3cml0ZSBlbmFibGUiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyLCAgICAgICJzdGVuY2lsIHRlc3QgZW5hYmxlIik7CisgICAgICBGTEFHKHB0cltqXSwgMSwgICAgICAiY29sb3IgZGl0aGVyIGVuYWJsZSIpOworICAgICAgRkxBRyhwdHJbal0sIDAsICAgICAgImxvZ2lvcCBlbmFibGUiKTsKKyAgICAgIGorKzsKKyAgIH0KKyAgIGlmIChiaXRzICYgKDE8PDYpKSB7CisgICAgICBQUklOVEYoIlx0ICBMSVM2OiAweCUwOHhcbiIsIHB0cltqXSk7CisgICAgICBGTEFHKHB0cltqXSwgMzEsICAgICAgImFscGhhIHRlc3QgZW5hYmxlIik7CisgICAgICBCSVRTKHB0cltqXSwgMzAsIDI4LCAgImFscGhhIGZ1bmMiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAyNywgMjAsICAiYWxwaGEgcmVmIik7CisgICAgICBGTEFHKHB0cltqXSwgMTksICAgICAgImRlcHRoIHRlc3QgZW5hYmxlIik7CisgICAgICBCSVRTKHB0cltqXSwgMTgsIDE2LCAgImRlcHRoIGZ1bmMiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAxNSwgICAgICAiYmxlbmQgZW5hYmxlIik7CisgICAgICBCSVRTKHB0cltqXSwgMTQsIDEyLCAgImJsZW5kIGZ1bmMiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAxMSwgOCwgICAiYmxlbmQgc3JjIGZhY3RvciIpOworICAgICAgQklUUyhwdHJbal0sIDcsICA0LCAgICJibGVuZCBkc3QgZmFjdG9yIik7CisgICAgICBGTEFHKHB0cltqXSwgMywgICAgICAgImRlcHRoIHdyaXRlIGVuYWJsZSIpOworICAgICAgRkxBRyhwdHJbal0sIDIsICAgICAgICJjb2xvciB3cml0ZSBlbmFibGUiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAxLCAgMCwgICAicHJvdm9raW5nIHZlcnRleCIpOyAKKyAgICAgIGorKzsKKyAgIH0KKworCisgICBQUklOVEYoIlxuIik7CisKKyAgIGFzc2VydChqID09IGxlbik7CisKKyAgIHN0cmVhbS0+b2Zmc2V0ICs9IGxlbiAqIHNpemVvZihHTHVpbnQpOworICAgCisgICByZXR1cm4gR0xfVFJVRTsKK30KKyAKKworCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX2xvYWRfaW5kaXJlY3QoIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIEdMdWludCBsZW4gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgR0x1aW50IGJpdHMgPSAocHRyWzBdID4+IDgpICYgMHgzZjsKKyAgIEdMdWludCBpLCBqID0gMDsKKyAgIAorICAgUFJJTlRGKCIlcyAoJWQgZHdvcmRzKTpcbiIsIG5hbWUsIGxlbik7CisgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2orK10pOworCisgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBpZiAoYml0cyAmICgxPDxpKSkgeworCSBzd2l0Y2ggKDE8PCg4K2kpKSB7CisJIGNhc2UgTEkwX1NUQVRFX1NUQVRJQ19JTkRJUkVDVDoKKwkgICAgUFJJTlRGKCIgICAgICAgIFNUQVRJQzogMHglMDh4IHwgJXhcbiIsIHB0cltqXSZ+MywgcHRyW2pdJjMpOyBqKys7CisJICAgIFBSSU5URigiICAgICAgICAgICAgICAgIDB4JTA4eFxuIiwgcHRyW2orK10pOworCSAgICBicmVhazsKKwkgY2FzZSBMSTBfU1RBVEVfRFlOQU1JQ19JTkRJUkVDVDoKKwkgICAgUFJJTlRGKCIgICAgICAgRFlOQU1JQzogMHglMDh4IHwgJXhcbiIsIHB0cltqXSZ+MywgcHRyW2pdJjMpOyBqKys7CisJICAgIGJyZWFrOworCSBjYXNlIExJMF9TVEFURV9TQU1QTEVSOgorCSAgICBQUklOVEYoIiAgICAgICBTQU1QTEVSOiAweCUwOHggfCAleFxuIiwgcHRyW2pdJn4zLCBwdHJbal0mMyk7IGorKzsKKwkgICAgUFJJTlRGKCIgICAgICAgICAgICAgICAgMHglMDh4XG4iLCBwdHJbaisrXSk7CisJICAgIGJyZWFrOworCSBjYXNlIExJMF9TVEFURV9NQVA6CisJICAgIFBSSU5URigiICAgICAgICAgICBNQVA6IDB4JTA4eCB8ICV4XG4iLCBwdHJbal0mfjMsIHB0cltqXSYzKTsgaisrOworCSAgICBQUklOVEYoIiAgICAgICAgICAgICAgICAweCUwOHhcbiIsIHB0cltqKytdKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgTEkwX1NUQVRFX1BST0dSQU06CisJICAgIFBSSU5URigiICAgICAgIFBST0dSQU06IDB4JTA4eCB8ICV4XG4iLCBwdHJbal0mfjMsIHB0cltqXSYzKTsgaisrOworCSAgICBQUklOVEYoIiAgICAgICAgICAgICAgICAweCUwOHhcbiIsIHB0cltqKytdKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgTEkwX1NUQVRFX0NPTlNUQU5UUzoKKwkgICAgUFJJTlRGKCIgICAgIENPTlNUQU5UUzogMHglMDh4IHwgJXhcbiIsIHB0cltqXSZ+MywgcHRyW2pdJjMpOyBqKys7CisJICAgIFBSSU5URigiICAgICAgICAgICAgICAgIDB4JTA4eFxuIiwgcHRyW2orK10pOworCSAgICBicmVhazsKKwkgZGVmYXVsdDoKKwkgICAgYXNzZXJ0KDApOworCSAgICBicmVhazsKKwkgfQorICAgICAgfQorICAgfQorCisgICBpZiAoYml0cyA9PSAwKSB7CisgICAgICBQUklOVEYoIlx0ICBEVU1NWTogMHglMDh4XG4iLCBwdHJbaisrXSk7CisgICB9CisKKyAgIFBSSU5URigiXG4iKTsKKworCisgICBhc3NlcnQoaiA9PSBsZW4pOworCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIAorICAgcmV0dXJuIEdMX1RSVUU7Cit9CisgCQorc3RhdGljIHZvaWQgQlIxMyggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkgIEdMdWludCB2YWwgKQoreworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHZhbCk7CisgICBGTEFHKHZhbCwgMzAsICJjbGlwcGluZyBlbmFibGUiKTsKKyAgIEJJVFModmFsLCAyNSwgMjQsICJjb2xvciBkZXB0aCAoMz09MzJicHApIik7CisgICBCSVRTKHZhbCwgMjMsIDE2LCAicmFzdGVyIG9wIik7CisgICBCSVRTKHZhbCwgMTUsIDAsICAiZGVzdCBwaXRjaCIpOworfQorCisKK3N0YXRpYyB2b2lkIEJSMjIyMyggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkgICAgR0x1aW50IHZhbDIyLCBHTHVpbnQgdmFsMjMgKQoreworICAgdW5pb24geyBHTHVpbnQgdmFsOyBzaG9ydCBmaWVsZFsyXTsgfSBCUjIyLCBCUjIzOworCisgICBCUjIyLnZhbCA9IHZhbDIyOworICAgQlIyMy52YWwgPSB2YWwyMzsKKworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHZhbDIyKTsKKyAgIEJJVFModmFsMjIsIDMxLCAxNiwgImRlc3QgeTEiKTsKKyAgIEJJVFModmFsMjIsIDE1LCAwLCAgImRlc3QgeDEiKTsKKworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHZhbDIzKTsKKyAgIEJJVFModmFsMjMsIDMxLCAxNiwgImRlc3QgeTIiKTsKKyAgIEJJVFModmFsMjMsIDE1LCAwLCAgImRlc3QgeDIiKTsKKworICAgLyogVGhlIGJsaXQgZW5naW5lIG1heSBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aGVuIHRoZXNlIGFyZW4ndCBtZXQgKi8KKyAgIGFzc2VydChCUjIyLmZpZWxkWzBdIDwgQlIyMy5maWVsZFswXSk7CisgICBhc3NlcnQoQlIyMi5maWVsZFsxXSA8IEJSMjMuZmllbGRbMV0pOworfQorCitzdGF0aWMgdm9pZCBCUjA5KCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sCisJCSAgR0x1aW50IHZhbCApCit7CisgICBQUklOVEYoIlx0MHglMDh4IC0tIGRlc3QgYWRkcmVzc1xuIiwgIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIEJSMjYoIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwKKwkJICBHTHVpbnQgdmFsICkKK3sKKyAgIFBSSU5URigiXHQweCUwOHhcbiIsICB2YWwpOworICAgQklUUyh2YWwsIDMxLCAxNiwgInNyYyB5MSIpOworICAgQklUUyh2YWwsIDE1LCAwLCAgInNyYyB4MSIpOworfQorCitzdGF0aWMgdm9pZCBCUjExKCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sCisJCSAgR0x1aW50IHZhbCApCit7CisgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgdmFsKTsKKyAgIEJJVFModmFsLCAxNSwgMCwgICJzcmMgcGl0Y2giKTsKK30KKworc3RhdGljIHZvaWQgQlIxMiggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkgIEdMdWludCB2YWwgKQoreworICAgUFJJTlRGKCJcdDB4JTA4eCAtLSBzcmMgYWRkcmVzc1xuIiwgIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIEJSMTYoIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwKKwkJICBHTHVpbnQgdmFsICkKK3sKKyAgIFBSSU5URigiXHQweCUwOHggLS0gY29sb3JcbiIsICB2YWwpOworfQorICAgCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX2NvcHlfYmxpdCggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIEdMdWludCBsZW4gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgaW50IGogPSAwOworCisgICBQUklOVEYoIiVzICglZCBkd29yZHMpOlxuIiwgbmFtZSwgbGVuKTsKKyAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaisrXSk7CisgICAKKyAgIEJSMTMoc3RyZWFtLCBwdHJbaisrXSk7CisgICBCUjIyMjMoc3RyZWFtLCBwdHJbal0sIHB0cltqKzFdKTsKKyAgIGogKz0gMjsKKyAgIEJSMDkoc3RyZWFtLCBwdHJbaisrXSk7CisgICBCUjI2KHN0cmVhbSwgcHRyW2orK10pOworICAgQlIxMShzdHJlYW0sIHB0cltqKytdKTsKKyAgIEJSMTIoc3RyZWFtLCBwdHJbaisrXSk7CisKKyAgIHN0cmVhbS0+b2Zmc2V0ICs9IGxlbiAqIHNpemVvZihHTHVpbnQpOworICAgYXNzZXJ0KGogPT0gbGVuKTsKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX2NvbG9yX2JsaXQoIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBHTHVpbnQgbGVuICkKK3sKKyAgIEdMdWludCAqcHRyID0gKEdMdWludCAqKShzdHJlYW0tPnB0ciArIHN0cmVhbS0+b2Zmc2V0KTsKKyAgIGludCBqID0gMDsKKworICAgUFJJTlRGKCIlcyAoJWQgZHdvcmRzKTpcbiIsIG5hbWUsIGxlbik7CisgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2orK10pOworCisgICBCUjEzKHN0cmVhbSwgcHRyW2orK10pOworICAgQlIyMjIzKHN0cmVhbSwgcHRyW2pdLCBwdHJbaisxXSk7CisgICBqICs9IDI7CisgICBCUjA5KHN0cmVhbSwgcHRyW2orK10pOworICAgQlIxNihzdHJlYW0sIHB0cltqKytdKTsKKworICAgc3RyZWFtLT5vZmZzZXQgKz0gbGVuICogc2l6ZW9mKEdMdWludCk7CisgICBhc3NlcnQoaiA9PSBsZW4pOworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4gZGVidWdfbW9kZXM0KCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgR0x1aW50IGxlbiApCit7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CisgICBpbnQgaiA9IDA7CisKKyAgIFBSSU5URigiJXMgKCVkIGR3b3Jkcyk6XG4iLCBuYW1lLCBsZW4pOworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHB0cltqXSk7CisgICBCSVRTKHB0cltqXSwgMjEsIDE4LCAibG9naWNvcCBmdW5jIik7CisgICBGTEFHKHB0cltqXSwgMTcsICJzdGVuY2lsIHRlc3QgbWFzayBtb2RpZnktZW5hYmxlIik7CisgICBGTEFHKHB0cltqXSwgMTYsICJzdGVuY2lsIHdyaXRlIG1hc2sgbW9kaWZ5LWVuYWJsZSIpOworICAgQklUUyhwdHJbal0sIDE1LCA4LCAic3RlbmNpbCB0ZXN0IG1hc2siKTsKKyAgIEJJVFMocHRyW2pdLCA3LCAwLCAgInN0ZW5jaWwgd3JpdGUgbWFzayIpOworICAgaisrOworCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIGFzc2VydChqID09IGxlbik7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIEdMYm9vbGVhbiBkZWJ1Z19tYXBfc3RhdGUoIHN0cnVjdCBkZWJ1Z19zdHJlYW0gKnN0cmVhbSwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBHTHVpbnQgbGVuICkKK3sKKyAgIEdMdWludCAqcHRyID0gKEdMdWludCAqKShzdHJlYW0tPnB0ciArIHN0cmVhbS0+b2Zmc2V0KTsKKyAgIGludCBqID0gMDsKKworICAgUFJJTlRGKCIlcyAoJWQgZHdvcmRzKTpcbiIsIG5hbWUsIGxlbik7CisgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2orK10pOworICAgCisgICB7CisgICAgICBQUklOVEYoIlx0MHglMDh4XG4iLCAgcHRyW2pdKTsKKyAgICAgIEJJVFMocHRyW2pdLCAxNSwgMCwgICAibWFwIG1hc2siKTsKKyAgICAgIGorKzsKKyAgIH0KKworICAgd2hpbGUgKGogPCBsZW4pIHsKKyAgICAgIHsKKwkgUFJJTlRGKCJcdCAgVE1uLjA6IDB4JTA4eFxuIiwgcHRyW2pdKTsKKwkgUFJJTlRGKCJcdCBtYXAgYWRkcmVzczogMHglMDh4XG4iLCAocHRyW2pdICYgfjB4MykpOworCSBGTEFHKHB0cltqXSwgMSwgInZlcnRpY2FsIGxpbmUgc3RyaWRlIik7CisJIEZMQUcocHRyW2pdLCAwLCAidmVydGljYWwgbGluZSBzdHJpZGUgb2Zmc2V0Iik7CisJIGorKzsKKyAgICAgIH0KKworICAgICAgeworCSBQUklOVEYoIlx0ICBUTW4uMTogMHglMDh4XG4iLCBwdHJbal0pOworCSBCSVRTKHB0cltqXSwgMzEsIDIxLCAiaGVpZ2h0Iik7CisJIEJJVFMocHRyW2pdLCAyMCwgMTAsICJ3aWR0aCIpOworCSBCSVRTKHB0cltqXSwgOSwgNywgInN1cmZhY2UgZm9ybWF0Iik7CisJIEJJVFMocHRyW2pdLCA2LCAzLCAidGV4ZWwgZm9ybWF0Iik7CisJIEZMQUcocHRyW2pdLCAyLCAidXNlIGZlbmNlIHJlZ3MiKTsKKwkgRkxBRyhwdHJbal0sIDEsICJ0aWxlZCBzdXJmYWNlIik7CisJIEZMQUcocHRyW2pdLCAwLCAidGlsZSB3YWxrIHltYWpvciIpOworCSBqKys7CisgICAgICB9CisgICAgICB7CisJIFBSSU5URigiXHQgIFRNbi4yOiAweCUwOHhcbiIsIHB0cltqXSk7CisJIEJJVFMocHRyW2pdLCAzMSwgMjEsICJkd29yZCBwaXRjaCIpOworCSBCSVRTKHB0cltqXSwgMjAsIDE1LCAiY3ViZSBmYWNlIGVuYWJsZXMiKTsKKwkgQklUUyhwdHJbal0sIDE0LCA5LCAibWF4IGxvZCIpOworCSBGTEFHKHB0cltqXSwgOCwgICAgICJtaXAgbGF5b3V0IHJpZ2h0Iik7CisJIEJJVFMocHRyW2pdLCA3LCAwLCAiZGVwdGgiKTsKKwkgaisrOworICAgICAgfQorICAgfQorCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIGFzc2VydChqID09IGxlbik7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIEdMYm9vbGVhbiBkZWJ1Z19zYW1wbGVyX3N0YXRlKCBzdHJ1Y3QgZGVidWdfc3RyZWFtICpzdHJlYW0sCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgR0x1aW50IGxlbiApCit7CisgICBHTHVpbnQgKnB0ciA9IChHTHVpbnQgKikoc3RyZWFtLT5wdHIgKyBzdHJlYW0tPm9mZnNldCk7CisgICBpbnQgaiA9IDA7CisKKyAgIFBSSU5URigiJXMgKCVkIGR3b3Jkcyk6XG4iLCBuYW1lLCBsZW4pOworICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHB0cltqKytdKTsKKyAgIAorICAgeworICAgICAgUFJJTlRGKCJcdDB4JTA4eFxuIiwgIHB0cltqXSk7CisgICAgICBCSVRTKHB0cltqXSwgMTUsIDAsICAgInNhbXBsZXIgbWFzayIpOworICAgICAgaisrOworICAgfQorCisgICB3aGlsZSAoaiA8IGxlbikgeworICAgICAgeworCSBQUklOVEYoIlx0ICBUU24uMDogMHglMDh4XG4iLCBwdHJbal0pOworCSBGTEFHKHB0cltqXSwgMzEsICJyZXZlcnNlIGdhbW1hIik7CisJIEZMQUcocHRyW2pdLCAzMCwgInBsYW5hciB0byBwYWNrZWQiKTsKKwkgRkxBRyhwdHJbal0sIDI5LCAieXV2LT5yZ2IiKTsKKwkgQklUUyhwdHJbal0sIDI4LCAyNywgImNocm9tYWtleSBpbmRleCIpOworCSBCSVRTKHB0cltqXSwgMjYsIDIyLCAiYmFzZSBtaXAgbGV2ZWwiKTsKKwkgQklUUyhwdHJbal0sIDIxLCAyMCwgIm1pcCBtb2RlIGZpbHRlciIpOworCSBCSVRTKHB0cltqXSwgMTksIDE3LCAibWFnIG1vZGUgZmlsdGVyIik7CisJIEJJVFMocHRyW2pdLCAxNiwgMTQsICJtaW4gbW9kZSBmaWx0ZXIiKTsKKwkgQklUUyhwdHJbal0sIDEzLCA1LCAgImxvZCBiaWFzIChzNC40KSIpOworCSBGTEFHKHB0cltqXSwgNCwgICAgICAic2hhZG93IGVuYWJsZSIpOworCSBGTEFHKHB0cltqXSwgMywgICAgICAibWF4LWFuaXNvLTQiKTsKKwkgQklUUyhwdHJbal0sIDIsIDAsICAgInNoYWRvdyBmdW5jIik7CisJIGorKzsKKyAgICAgIH0KKworICAgICAgeworCSBQUklOVEYoIlx0ICBUU24uMTogMHglMDh4XG4iLCBwdHJbal0pOworCSBCSVRTKHB0cltqXSwgMzEsIDI0LCAibWluIGxvZCIpOworCSBNQlooIHB0cltqXSwgMjMsIDE4ICk7CisJIEZMQUcocHRyW2pdLCAxNywgICAgICJraWxsIHBpeGVsIGVuYWJsZSIpOworCSBGTEFHKHB0cltqXSwgMTYsICAgICAia2V5ZWQgdGV4IGZpbHRlciBtb2RlIik7CisJIEZMQUcocHRyW2pdLCAxNSwgICAgICJjaHJvbWFrZXkgZW5hYmxlIik7CisJIEJJVFMocHRyW2pdLCAxNCwgMTIsICJ0Y3ggd3JhcCBtb2RlIik7CisJIEJJVFMocHRyW2pdLCAxMSwgOSwgICJ0Y3kgd3JhcCBtb2RlIik7CisJIEJJVFMocHRyW2pdLCA4LCAgNiwgICJ0Y3ogd3JhcCBtb2RlIik7CisJIEZMQUcocHRyW2pdLCA1LCAgICAgICJub3JtYWxpemVkIGNvb3JkcyIpOworCSBCSVRTKHB0cltqXSwgNCwgIDEsICAibWFwIChzdXJmYWNlKSBpbmRleCIpOworCSBGTEFHKHB0cltqXSwgMCwgICAgICAiRUFTVCBkZWludGVybGFjZXIgZW5hYmxlIik7CisJIGorKzsKKyAgICAgIH0KKyAgICAgIHsKKwkgUFJJTlRGKCJcdCAgVFNuLjI6IDB4JTA4eCAgKGRlZmF1bHQgY29sb3IpXG4iLCBwdHJbal0pOworCSBqKys7CisgICAgICB9CisgICB9CisKKyAgIHN0cmVhbS0+b2Zmc2V0ICs9IGxlbiAqIHNpemVvZihHTHVpbnQpOworICAgYXNzZXJ0KGogPT0gbGVuKTsKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgR0xib29sZWFuIGRlYnVnX2Rlc3RfdmFycyggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIEdMdWludCBsZW4gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgaW50IGogPSAwOworCisgICBQUklOVEYoIiVzICglZCBkd29yZHMpOlxuIiwgbmFtZSwgbGVuKTsKKyAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaisrXSk7CisKKyAgIHsKKyAgICAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbal0pOworICAgICAgRkxBRyhwdHJbal0sIDMxLCAgICAgImVhcmx5IGNsYXNzaWMgenRlc3QiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAzMCwgICAgICJvcGVuZ2wgdGV4IGRlZmF1bHQgY29sb3IiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyOSwgICAgICJieXBhc3MgaXoiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyOCwgICAgICJsb2QgcHJlY2xhbXAiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAyNywgMjYsICJkaXRoZXIgcGF0dGVybiIpOworICAgICAgRkxBRyhwdHJbal0sIDI1LCAgICAgImxpbmVhciBnYW1tYSBibGVuZCIpOworICAgICAgRkxBRyhwdHJbal0sIDI0LCAgICAgImRlYnVnIGRpdGhlciIpOworICAgICAgQklUUyhwdHJbal0sIDIzLCAyMCwgImRzdG9yZyB4Iik7CisgICAgICBCSVRTKHB0cltqXSwgMTksIDE2LCAiZHN0b3JnIHkiKTsKKyAgICAgIE1CWiAocHRyW2pdLCAxNSwgMTUgKTsKKyAgICAgIEJJVFMocHRyW2pdLCAxNCwgMTIsICI0MjIgd3JpdGUgc2VsZWN0Iik7CisgICAgICBCSVRTKHB0cltqXSwgMTEsIDgsICAiY2J1ZiBmb3JtYXQiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAzLCAyLCAgICJ6YnVmIGZvcm1hdCIpOworICAgICAgRkxBRyhwdHJbal0sIDEsICAgICAgInZlcnQgbGluZSBzdHJpZGUiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAxLCAgICAgICJ2ZXJ0IGxpbmUgc3RyaWRlIG9mZnNldCIpOworICAgICAgaisrOworICAgfQorICAgCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIGFzc2VydChqID09IGxlbik7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIEdMYm9vbGVhbiBkZWJ1Z19idWZfaW5mbyggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIEdMdWludCBsZW4gKQoreworICAgR0x1aW50ICpwdHIgPSAoR0x1aW50ICopKHN0cmVhbS0+cHRyICsgc3RyZWFtLT5vZmZzZXQpOworICAgaW50IGogPSAwOworCisgICBQUklOVEYoIiVzICglZCBkd29yZHMpOlxuIiwgbmFtZSwgbGVuKTsKKyAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbaisrXSk7CisKKyAgIHsKKyAgICAgIFBSSU5URigiXHQweCUwOHhcbiIsICBwdHJbal0pOworICAgICAgQklUUyhwdHJbal0sIDI4LCAyOCwgImF1eCBidWZmZXIgaWQiKTsKKyAgICAgIEJJVFMocHRyW2pdLCAyNywgMjQsICJidWZmZXIgaWQgKDc9ZGVwdGgsIDM9YmFjaykiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyMywgICAgICJ1c2UgZmVuY2UgcmVncyIpOworICAgICAgRkxBRyhwdHJbal0sIDIyLCAgICAgInRpbGVkIHN1cmZhY2UiKTsKKyAgICAgIEZMQUcocHRyW2pdLCAyMSwgICAgICJ0aWxlIHdhbGsgeW1ham9yIik7CisgICAgICBNQlogKHB0cltqXSwgMjAsIDE0KTsKKyAgICAgIEJJVFMocHRyW2pdLCAxMywgMiwgICJkd29yZCBwaXRjaCIpOworICAgICAgTUJaIChwdHJbal0sIDIsICAwKTsKKyAgICAgIGorKzsKKyAgIH0KKyAgIAorICAgUFJJTlRGKCJcdDB4JTA4eCAtLSBidWZmZXIgYmFzZSBhZGRyZXNzXG4iLCAgcHRyW2orK10pOworCisgICBzdHJlYW0tPm9mZnNldCArPSBsZW4gKiBzaXplb2YoR0x1aW50KTsKKyAgIGFzc2VydChqID09IGxlbik7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIEdMYm9vbGVhbiBpOTE1X2RlYnVnX3BhY2tldCggc3RydWN0IGRlYnVnX3N0cmVhbSAqc3RyZWFtICkKK3sKKyAgIEdMdWludCAqcHRyID0gKEdMdWludCAqKShzdHJlYW0tPnB0ciArIHN0cmVhbS0+b2Zmc2V0KTsKKyAgIEdMdWludCBjbWQgPSAqcHRyOworICAgCisgICBzd2l0Y2ggKCgoY21kID4+IDI5KSAmIDB4NykpIHsKKyAgIGNhc2UgMHgwOgorICAgICAgc3dpdGNoICgoY21kID4+IDIzKSAmIDB4M2YpIHsKKyAgICAgIGNhc2UgMHgwOgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiTUlfTk9PUCIsIDEpOworICAgICAgY2FzZSAweDM6CisJIHJldHVybiBkZWJ1ZyhzdHJlYW0sICJNSV9XQUlUX0ZPUl9FVkVOVCIsIDEpOworICAgICAgY2FzZSAweDQ6CisJIHJldHVybiBkZWJ1ZyhzdHJlYW0sICJNSV9GTFVTSCIsIDEpOworICAgICAgY2FzZSAweEE6CisJIGRlYnVnKHN0cmVhbSwgIk1JX0JBVENIX0JVRkZFUl9FTkQiLCAxKTsKKwkgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgY2FzZSAweDIyOgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiTUlfTE9BRF9SRUdJU1RFUl9JTU0iLCAzKTsKKyAgICAgIGNhc2UgMHgzMToKKwkgcmV0dXJuIGRlYnVnX2NoYWluKHN0cmVhbSwgIk1JX0JBVENIX0JVRkZFUl9TVEFSVCIsIDIpOworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgMHgxOgorICAgICAgYnJlYWs7CisgICBjYXNlIDB4MjoKKyAgICAgIHN3aXRjaCAoKGNtZCA+PiAyMikgJiAweGZmKSB7CSAKKyAgICAgIGNhc2UgMHg1MDoKKwkgcmV0dXJuIGRlYnVnX2NvbG9yX2JsaXQoc3RyZWFtLCAiWFlfQ09MT1JfQkxUIiwgKGNtZCAmIDB4ZmYpICsgMik7CisgICAgICBjYXNlIDB4NTM6CisJIHJldHVybiBkZWJ1Z19jb3B5X2JsaXQoc3RyZWFtLCAiWFlfU1JDX0NPUFlfQkxUIiwgKGNtZCAmIDB4ZmYpICsgMik7CisgICAgICBkZWZhdWx0OgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiYmxpdCBjb21tYW5kIiwgKGNtZCAmIDB4ZmYpICsgMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgMHgzOgorICAgICAgc3dpdGNoICgoY21kID4+IDI0KSAmIDB4MWYpIHsJIAorICAgICAgY2FzZSAweDY6CisJIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0FOVElfQUxJQVNJTkciLCAxKTsKKyAgICAgIGNhc2UgMHg3OgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9SQVNURVJJWkFUSU9OX1JVTEVTIiwgMSk7CisgICAgICBjYXNlIDB4ODoKKwkgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfQkFDS0ZBQ0VfU1RFTkNJTF9PUFMiLCAyKTsKKyAgICAgIGNhc2UgMHg5OgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX01BU0tTIiwgMSk7CisgICAgICBjYXNlIDB4YjoKKwkgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfSU5ERVBFTkRFTlRfQUxQSEFfQkxFTkQiLCAxKTsKKyAgICAgIGNhc2UgMHhjOgorCSByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9NT0RFUzUiLCAxKTsJIAorICAgICAgY2FzZSAweGQ6CisJIHJldHVybiBkZWJ1Z19tb2RlczQoc3RyZWFtLCAiM0RTVEFURV9NT0RFUzQiLCAxKTsKKyAgICAgIGNhc2UgMHgxNToKKwkgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfRk9HX0NPTE9SIiwgMSk7CisgICAgICBjYXNlIDB4MTY6CisJIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0NPT1JEX1NFVF9CSU5ESU5HUyIsIDEpOworICAgICAgY2FzZSAweDFjOgorCSAvKiAzRFN0YXRlMTZOUCAqLworCSBzd2l0Y2goKGNtZCA+PiAxOSkgJiAweDFmKSB7CisJIGNhc2UgMHgxMDoKKwkgICAgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfU0NJU1NPUl9FTkFCTEUiLCAxKTsKKwkgY2FzZSAweDExOgorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9ERVBUSF9TVUJSRUNUQU5HTEVfRElTQUJMRSIsIDEpOworCSBkZWZhdWx0OgorCSAgICBicmVhazsKKwkgfQorCSBicmVhazsKKyAgICAgIGNhc2UgMHgxZDoKKwkgLyogM0RTdGF0ZU1XICovCisJIHN3aXRjaCAoKGNtZCA+PiAxNikgJiAweGZmKSB7CisJIGNhc2UgMHgwOgorCSAgICByZXR1cm4gZGVidWdfbWFwX3N0YXRlKHN0cmVhbSwgIjNEU1RBVEVfTUFQX1NUQVRFIiwgKGNtZCAmIDB4MWYpICsgMik7CisJIGNhc2UgMHgxOgorCSAgICByZXR1cm4gZGVidWdfc2FtcGxlcl9zdGF0ZShzdHJlYW0sICIzRFNUQVRFX1NBTVBMRVJfU1RBVEUiLCAoY21kICYgMHgxZikgKyAyKTsKKwkgY2FzZSAweDQ6CisJICAgIHJldHVybiBkZWJ1Z19sb2FkX2ltbWVkaWF0ZShzdHJlYW0sICIzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFIiwgKGNtZCAmIDB4ZikgKyAyKTsKKwkgY2FzZSAweDU6CisJICAgIHJldHVybiBkZWJ1Z19wcm9ncmFtKHN0cmVhbSwgIjNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU0iLCAoY21kICYgMHgxZmYpICsgMik7CisJIGNhc2UgMHg2OgorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9QSVhFTF9TSEFERVJfQ09OU1RBTlRTIiwgKGNtZCAmIDB4ZmYpICsgMik7CisJIGNhc2UgMHg3OgorCSAgICByZXR1cm4gZGVidWdfbG9hZF9pbmRpcmVjdChzdHJlYW0sICIzRFNUQVRFX0xPQURfSU5ESVJFQ1QiLCAoY21kICYgMHhmZikgKyAyKTsKKwkgY2FzZSAweDgwOgorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRSIsIChjbWQgJiAweGZmZmYpICsgMik7CisJIGNhc2UgMHg4MToKKwkgICAgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfU0NJU1NPUl9SRUNUQU5HTEUiLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBjYXNlIDB4ODM6CisJICAgIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX1NQQU5fU1RJUFBMRSIsIChjbWQgJiAweGZmZmYpICsgMik7CisJIGNhc2UgMHg4NToKKwkgICAgcmV0dXJuIGRlYnVnX2Rlc3RfdmFycyhzdHJlYW0sICIzRFNUQVRFX0RFU1RfQlVGRkVSX1ZBUlMiLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBjYXNlIDB4ODg6CisJICAgIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0NPTlNUQU5UX0JMRU5EX0NPTE9SIiwgKGNtZCAmIDB4ZmZmZikgKyAyKTsKKwkgY2FzZSAweDg5OgorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9GT0dfTU9ERSIsIChjbWQgJiAweGZmZmYpICsgMik7CisJIGNhc2UgMHg4ZToKKwkgICAgcmV0dXJuIGRlYnVnX2J1Zl9pbmZvKHN0cmVhbSwgIjNEU1RBVEVfQlVGRkVSX0lORk8iLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBjYXNlIDB4OTc6CisJICAgIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0RFUFRIX09GRlNFVF9TQ0FMRSIsIChjbWQgJiAweGZmZmYpICsgMik7CisJIGNhc2UgMHg5ODoKKwkgICAgcmV0dXJuIGRlYnVnKHN0cmVhbSwgIjNEU1RBVEVfREVGQVVMVF9aIiwgKGNtZCAmIDB4ZmZmZikgKyAyKTsKKwkgY2FzZSAweDk5OgorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiM0RTVEFURV9ERUZBVUxUX0RJRkZVU0UiLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBjYXNlIDB4OWE6CisJICAgIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0RFRkFVTFRfU1BFQ1VMQVIiLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBjYXNlIDB4OWM6CisJICAgIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIzRFNUQVRFX0NMRUFSX1BBUkFNRVRFUlMiLCAoY21kICYgMHhmZmZmKSArIDIpOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoMCk7CisJICAgIHJldHVybiAwOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSAweDFlOgorCSBpZiAoY21kICYgKDEgPDwgMjMpKQorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiPz8/IiwgKGNtZCAmIDB4ZmZmZikgKyAxKTsKKwkgZWxzZQorCSAgICByZXR1cm4gZGVidWcoc3RyZWFtLCAiIiwgMSk7CisJIGJyZWFrOworICAgICAgY2FzZSAweDFmOgorCSBpZiAoKGNtZCAmICgxIDw8IDIzKSkgPT0gMCkJCisJICAgIHJldHVybiBkZWJ1Z19wcmltKHN0cmVhbSwgIjNEUFJJTSAoaW5saW5lKSIsIDEsIChjbWQgJiAweDFmZmZmKSArIDIpOworCSBlbHNlIGlmIChjbWQgJiAoMSA8PCAxNykpIAorCSB7CisJICAgIGlmICgoY21kICYgMHhmZmZmKSA9PSAwKQorCSAgICAgICByZXR1cm4gZGVidWdfdmFyaWFibGVfbGVuZ3RoX3ByaW0oc3RyZWFtKTsKKwkgICAgZWxzZQorCSAgICAgICByZXR1cm4gZGVidWdfcHJpbShzdHJlYW0sICIzRFBSSU0gKGluZGV4ZWQpIiwgMCwgKCgoY21kICYgMHhmZmZmKSArIDEpIC8gMikgKyAxKTsKKwkgfQorCSBlbHNlCisJICAgIHJldHVybiBkZWJ1Z19wcmltKHN0cmVhbSwgIjNEUFJJTSAgKGluZGlyZWN0IHNlcXVlbnRpYWwpIiwgMCwgMik7IAorCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIHJldHVybiBkZWJ1ZyhzdHJlYW0sICIiLCAwKTsKKyAgICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgYXNzZXJ0KDApOworICAgcmV0dXJuIDA7Cit9CisKKworCit2b2lkCitpOTE1X2R1bXBfYmF0Y2hidWZmZXIoIEdMdWludCAqc3RhcnQsCisJCSAgICAgICBHTHVpbnQgKmVuZCApCit7CisgICBzdHJ1Y3QgZGVidWdfc3RyZWFtIHN0cmVhbTsKKyAgIEdMdWludCBieXRlcyA9IChlbmQgLSBzdGFydCkgKiA0OworICAgR0xib29sZWFuIGRvbmUgPSBHTF9GQUxTRTsKKworICAgUFJJTlRGKCJcblxuQkFUQ0g6ICglZClcbiIsIGJ5dGVzIC8gNCk7CisKKyAgIHN0cmVhbS5vZmZzZXQgPSAwOworICAgc3RyZWFtLnB0ciA9IChjaGFyICopc3RhcnQ7CisgICBzdHJlYW0ucHJpbnRfYWRkcmVzc2VzID0gMDsKKworICAgd2hpbGUgKCFkb25lICYmCisJICBzdHJlYW0ub2Zmc2V0IDwgYnl0ZXMgJiYKKwkgIHN0cmVhbS5vZmZzZXQgPj0gMCkKKyAgIHsKKyAgICAgIGlmICghaTkxNV9kZWJ1Z19wYWNrZXQoICZzdHJlYW0gKSkKKwkgYnJlYWs7CisKKyAgICAgIGFzc2VydChzdHJlYW0ub2Zmc2V0IDw9IGJ5dGVzICYmCisJICAgICBzdHJlYW0ub2Zmc2V0ID49IDApOworICAgfQorCisgICBQUklOVEYoIkVORC1CQVRDSFxuXG5cbiIpOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfZGVidWcuaApzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleC5oCnJlbmFtZSB0byBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfZGVidWcuaAppbmRleCA5YjdlNTUwLi4wNjQzYThjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9kZWJ1Zy5oCkBAIC0xLDggKzEsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDA3IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwpAQCAtMjUsMjEgKzI1LDMxIEBACiAgKiAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBJTlRFTFRFWF9JTkMKLSNkZWZpbmUgSU5URUxURVhfSU5DCisvKiBBdXRob3JzOiAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCiAKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAidGV4bWVtLmgiCisjaWZuZGVmIEk5MTVfREVCVUdfSAorI2RlZmluZSBJOTE1X0RFQlVHX0gKKworc3RydWN0IGk5MTVfY29udGV4dDsKKworc3RydWN0IGRlYnVnX3N0cmVhbSAKK3sKKyAgIHVuc2lnbmVkIG9mZnNldDsJCS8qIGN1cnJlbnQgZ3R0IG9mZnNldCAqLworICAgY2hhciAqcHRyOwkJLyogcG9pbnRlciB0byBndHQgb2Zmc2V0IHplcm8gKi8KKyAgIGNoYXIgKmVuZDsJCS8qIHBvaW50ZXIgdG8gZ3R0IG9mZnNldCB6ZXJvICovCisgICB1bnNpZ25lZCBwcmludF9hZGRyZXNzZXM7Cit9OwogCiAKLXZvaWQgaW50ZWxJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOwogCi12b2lkIGludGVsRGVzdHJveVRleE9iaiggaW50ZWxDb250ZXh0UHRyIGludGVsLCBpbnRlbFRleHR1cmVPYmplY3RQdHIgdCApOwotaW50IGludGVsVXBsb2FkVGV4SW1hZ2VzKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIGludGVsVGV4dHVyZU9iamVjdFB0ciB0LAotCQkJICBHTHVpbnQgZmFjZSApOworZXh0ZXJuIHZvaWQgaTkxNV9kaXNhc3NlbWJsZV9wcm9ncmFtKGNvbnN0IHVuc2lnbmVkICpwcm9ncmFtLCB1bnNpZ25lZCBzeik7CitleHRlcm4gdm9pZCBpOTE1X3ByaW50X3VyZWcoY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCB1cmVnKTsKIAotR0xib29sZWFuIAotaW50ZWxfZHJpUmVpbml0VGV4dHVyZUhlYXAoIGRyaVRleEhlYXAgKmhlYXAsCi0JCQkgICAgdW5zaWduZWQgc2l6ZSApOworCit2b2lkCitpOTE1X2R1bXBfYmF0Y2hidWZmZXIoIHVuc2lnbmVkICpzdGFydCwKKwkJICAgICAgIHVuc2lnbmVkICplbmQgKTsKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9kZWJ1Z19mcC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2RlYnVnX2ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzNDdhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9kZWJ1Z19mcC5jCkBAIC0wLDAgKzEsMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImk5MTVfcmVnLmgiCisjaW5jbHVkZSAiaTkxNV9kZWJ1Zy5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ19wcmludC5oIgorCisjZGVmaW5lIFBSSU5URiggLi4uICkgX21lc2FfcHJpbnRmKCBfX1ZBX0FSR1NfXyApCisKK3N0YXRpYyBjb25zdCBjaGFyICpvcGNvZGVzWzB4MjBdID0geworICAgIk5PUCIsCisgICAiQUREIiwKKyAgICJNT1YiLAorICAgIk1VTCIsCisgICAiTUFEIiwKKyAgICJEUDJBREQiLAorICAgIkRQMyIsCisgICAiRFA0IiwKKyAgICJGUkMiLAorICAgIlJDUCIsCisgICAiUlNRIiwKKyAgICJFWFAiLAorICAgIkxPRyIsCisgICAiQ01QIiwKKyAgICJNSU4iLAorICAgIk1BWCIsCisgICAiRkxSIiwKKyAgICJNT0QiLAorICAgIlRSQyIsCisgICAiU0dFIiwKKyAgICJTTFQiLAorICAgIlRFWExEIiwKKyAgICJURVhMRFAiLAorICAgIlRFWExEQiIsCisgICAiVEVYS0lMTCIsCisgICAiRENMIiwKKyAgICIweDFhIiwKKyAgICIweDFiIiwKKyAgICIweDFjIiwKKyAgICIweDFkIiwKKyAgICIweDFlIiwKKyAgICIweDFmIiwKK307CisKKworc3RhdGljIGNvbnN0IGludCBhcmdzWzB4MjBdID0geworICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIG5vcCAqLworICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIGFkZCAqLworICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIG1vdiAqLworICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzIG0gdWwgKi8KKyAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCBtYWQgKi8KKyAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNSBkcDJhZGQgKi8KKyAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiBkcDMgKi8KKyAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNyBkcDQgKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBmcmMgKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOSByY3AgKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYSByc3EgKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYiBleHAgKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYyBsb2cgKi8KKyAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZCBjbXAgKi8KKyAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZSBtaW4gKi8KKyAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZiBtYXggKi8KKyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgZmxyICovCisgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIG1vZCAqLworICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMiB0cmMgKi8KKyAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2dlICovCisgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNsdCAqLworICAgMSwKKyAgIDEsCisgICAxLAorICAgMSwKKyAgIDAsCisgICAwLAorICAgMCwKKyAgIDAsCisgICAwLAorICAgMCwKKyAgIDAsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWduYW1lWzB4OF0gPSB7CisgICAiUiIsCisgICAiVCIsCisgICAiQ09OU1QiLAorICAgIlMiLAorICAgIk9DIiwKKyAgICJPRCIsCisgICAiVSIsCisgICAiVU5LTk9XTiIsCit9OworCitzdGF0aWMgdm9pZAorcHJpbnRfcmVnX3R5cGVfbnIoR0x1aW50IHR5cGUsIEdMdWludCBucikKK3sKKyAgIHN3aXRjaCAodHlwZSkgeworICAgY2FzZSBSRUdfVFlQRV9UOgorICAgICAgc3dpdGNoIChucikgeworICAgICAgY2FzZSBUX0RJRkZVU0U6CisgICAgICAgICBQUklOVEYoIlRfRElGRlVTRSIpOworICAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBUX1NQRUNVTEFSOgorICAgICAgICAgUFJJTlRGKCJUX1NQRUNVTEFSIik7CisgICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFRfRk9HX1c6CisgICAgICAgICBQUklOVEYoIlRfRk9HX1ciKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBQUklOVEYoIlRfVEVYJWQiLCBucik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICBjYXNlIFJFR19UWVBFX09DOgorICAgICAgaWYgKG5yID09IDApIHsKKyAgICAgICAgIFBSSU5URigib0MiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBSRUdfVFlQRV9PRDoKKyAgICAgIGlmIChuciA9PSAwKSB7CisgICAgICAgICBQUklOVEYoIm9EIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KKworICAgUFJJTlRGKCIlc1slZF0iLCByZWduYW1lW3R5cGVdLCBucik7Cit9CisKKyNkZWZpbmUgUkVHX1NXSVpaTEVfTUFTSyAweDc3NzcKKyNkZWZpbmUgUkVHX05FR0FURV9NQVNLIDB4ODg4OAorCisjZGVmaW5lIFJFR19TV0laWkxFX1hZWlcgKChTUkNfWCA8PCBBMl9TUkMyX0NIQU5ORUxfWF9TSElGVCkgfAlcCisJCSAgICAgIChTUkNfWSA8PCBBMl9TUkMyX0NIQU5ORUxfWV9TSElGVCkgfAlcCisJCSAgICAgIChTUkNfWiA8PCBBMl9TUkMyX0NIQU5ORUxfWl9TSElGVCkgfAlcCisJCSAgICAgIChTUkNfVyA8PCBBMl9TUkMyX0NIQU5ORUxfV19TSElGVCkpCisKKworc3RhdGljIHZvaWQKK3ByaW50X3JlZ19uZWdfc3dpenpsZShHTHVpbnQgcmVnKQoreworICAgaW50IGk7CisKKyAgIGlmICgocmVnICYgUkVHX1NXSVpaTEVfTUFTSykgPT0gUkVHX1NXSVpaTEVfWFlaVyAmJgorICAgICAgIChyZWcgJiBSRUdfTkVHQVRFX01BU0spID09IDApCisgICAgICByZXR1cm47CisKKyAgIFBSSU5URigiLiIpOworCisgICBmb3IgKGkgPSAzOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKHJlZyAmICgxIDw8ICgoaSAqIDQpICsgMykpKQorICAgICAgICAgUFJJTlRGKCItIik7CisKKyAgICAgIHN3aXRjaCAoKHJlZyA+PiAoaSAqIDQpKSAmIDB4NykgeworICAgICAgY2FzZSAwOgorICAgICAgICAgUFJJTlRGKCJ4Iik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgIFBSSU5URigieSIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgICBQUklOVEYoInoiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICAgUFJJTlRGKCJ3Iik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIFBSSU5URigiMCIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgICBQUklOVEYoIjEiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIFBSSU5URigiPyIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X3NyY19yZWcoR0x1aW50IGR3b3JkKQoreworICAgR0x1aW50IG5yID0gKGR3b3JkID4+IEEyX1NSQzJfTlJfU0hJRlQpICYgUkVHX05SX01BU0s7CisgICBHTHVpbnQgdHlwZSA9IChkd29yZCA+PiBBMl9TUkMyX1RZUEVfU0hJRlQpICYgUkVHX1RZUEVfTUFTSzsKKyAgIHByaW50X3JlZ190eXBlX25yKHR5cGUsIG5yKTsKKyAgIHByaW50X3JlZ19uZWdfc3dpenpsZShkd29yZCk7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2Rlc3RfcmVnKEdMdWludCBkd29yZCkKK3sKKyAgIEdMdWludCBuciA9IChkd29yZCA+PiBBMF9ERVNUX05SX1NISUZUKSAmIFJFR19OUl9NQVNLOworICAgR0x1aW50IHR5cGUgPSAoZHdvcmQgPj4gQTBfREVTVF9UWVBFX1NISUZUKSAmIFJFR19UWVBFX01BU0s7CisgICBwcmludF9yZWdfdHlwZV9ucih0eXBlLCBucik7CisgICBpZiAoKGR3b3JkICYgQTBfREVTVF9DSEFOTkVMX0FMTCkgPT0gQTBfREVTVF9DSEFOTkVMX0FMTCkKKyAgICAgIHJldHVybjsKKyAgIFBSSU5URigiLiIpOworICAgaWYgKGR3b3JkICYgQTBfREVTVF9DSEFOTkVMX1gpCisgICAgICBQUklOVEYoIngiKTsKKyAgIGlmIChkd29yZCAmIEEwX0RFU1RfQ0hBTk5FTF9ZKQorICAgICAgUFJJTlRGKCJ5Iik7CisgICBpZiAoZHdvcmQgJiBBMF9ERVNUX0NIQU5ORUxfWikKKyAgICAgIFBSSU5URigieiIpOworICAgaWYgKGR3b3JkICYgQTBfREVTVF9DSEFOTkVMX1cpCisgICAgICBQUklOVEYoInciKTsKK30KKworCisjZGVmaW5lIEdFVF9TUkMwX1JFRyhyMCwgcjEpICgocjA8PDE0KXwocjE+PkExX1NSQzBfQ0hBTk5FTF9XX1NISUZUKSkKKyNkZWZpbmUgR0VUX1NSQzFfUkVHKHIwLCByMSkgKChyMDw8OCl8KHIxPj5BMl9TUkMxX0NIQU5ORUxfV19TSElGVCkpCisjZGVmaW5lIEdFVF9TUkMyX1JFRyhyKSAgICAgIChyKQorCisKK3N0YXRpYyB2b2lkCitwcmludF9hcml0aF9vcChHTHVpbnQgb3Bjb2RlLCBjb25zdCBHTHVpbnQgKiBwcm9ncmFtKQoreworICAgaWYgKG9wY29kZSAhPSBBMF9OT1ApIHsKKyAgICAgIHByaW50X2Rlc3RfcmVnKHByb2dyYW1bMF0pOworICAgICAgaWYgKHByb2dyYW1bMF0gJiBBMF9ERVNUX1NBVFVSQVRFKQorICAgICAgICAgUFJJTlRGKCIgPSBTQVRVUkFURSAiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIFBSSU5URigiID0gIik7CisgICB9CisKKyAgIFBSSU5URigiJXMgIiwgb3Bjb2Rlc1tvcGNvZGVdKTsKKworICAgcHJpbnRfc3JjX3JlZyhHRVRfU1JDMF9SRUcocHJvZ3JhbVswXSwgcHJvZ3JhbVsxXSkpOworICAgaWYgKGFyZ3Nbb3Bjb2RlXSA9PSAxKSB7CisgICAgICBQUklOVEYoIlxuIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIFBSSU5URigiLCAiKTsKKyAgIHByaW50X3NyY19yZWcoR0VUX1NSQzFfUkVHKHByb2dyYW1bMV0sIHByb2dyYW1bMl0pKTsKKyAgIGlmIChhcmdzW29wY29kZV0gPT0gMikgeworICAgICAgUFJJTlRGKCJcbiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBQUklOVEYoIiwgIik7CisgICBwcmludF9zcmNfcmVnKEdFVF9TUkMyX1JFRyhwcm9ncmFtWzJdKSk7CisgICBQUklOVEYoIlxuIik7CisgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X3RleF9vcChHTHVpbnQgb3Bjb2RlLCBjb25zdCBHTHVpbnQgKiBwcm9ncmFtKQoreworICAgcHJpbnRfZGVzdF9yZWcocHJvZ3JhbVswXSB8IEEwX0RFU1RfQ0hBTk5FTF9BTEwpOworICAgUFJJTlRGKCIgPSAiKTsKKworICAgUFJJTlRGKCIlcyAiLCBvcGNvZGVzW29wY29kZV0pOworCisgICBQUklOVEYoIlNbJWRdLCIsIHByb2dyYW1bMF0gJiBUMF9TQU1QTEVSX05SX01BU0spOworCisgICBwcmludF9yZWdfdHlwZV9ucigocHJvZ3JhbVsxXSA+PiBUMV9BRERSRVNTX1JFR19UWVBFX1NISUZUKSAmCisgICAgICAgICAgICAgICAgICAgICBSRUdfVFlQRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgKHByb2dyYW1bMV0gPj4gVDFfQUREUkVTU19SRUdfTlJfU0hJRlQpICYgUkVHX05SX01BU0spOworICAgUFJJTlRGKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZGNsX29wKEdMdWludCBvcGNvZGUsIGNvbnN0IEdMdWludCAqIHByb2dyYW0pCit7CisgICBQUklOVEYoIiVzICIsIG9wY29kZXNbb3Bjb2RlXSk7CisgICBwcmludF9kZXN0X3JlZyhwcm9ncmFtWzBdIHwgQTBfREVTVF9DSEFOTkVMX0FMTCk7CisgICBQUklOVEYoIlxuIik7Cit9CisKKwordm9pZAoraTkxNV9kaXNhc3NlbWJsZV9wcm9ncmFtKGNvbnN0IEdMdWludCAqIHByb2dyYW0sIEdMdWludCBzeikKK3sKKyAgIEdMdWludCBzaXplID0gcHJvZ3JhbVswXSAmIDB4MWZmOworICAgR0xpbnQgaTsKKworICAgUFJJTlRGKCJcdFx0QkVHSU5cbiIpOworCisgICBhc3NlcnQoc2l6ZSArIDIgPT0gc3opOworCisgICBwcm9ncmFtKys7CisgICBmb3IgKGkgPSAxOyBpIDwgc3o7IGkgKz0gMywgcHJvZ3JhbSArPSAzKSB7CisgICAgICBHTHVpbnQgb3Bjb2RlID0gcHJvZ3JhbVswXSAmICgweDFmIDw8IDI0KTsKKworICAgICAgUFJJTlRGKCJcdFx0Iik7CisKKyAgICAgIGlmICgoR0xpbnQpIG9wY29kZSA+PSBBMF9OT1AgJiYgb3Bjb2RlIDw9IEEwX1NMVCkKKyAgICAgICAgIHByaW50X2FyaXRoX29wKG9wY29kZSA+PiAyNCwgcHJvZ3JhbSk7CisgICAgICBlbHNlIGlmIChvcGNvZGUgPj0gVDBfVEVYTEQgJiYgb3Bjb2RlIDw9IFQwX1RFWEtJTEwpCisgICAgICAgICBwcmludF90ZXhfb3Aob3Bjb2RlID4+IDI0LCBwcm9ncmFtKTsKKyAgICAgIGVsc2UgaWYgKG9wY29kZSA9PSBEMF9EQ0wpCisgICAgICAgICBwcmludF9kY2xfb3Aob3Bjb2RlID4+IDI0LCBwcm9ncmFtKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIFBSSU5URigiVW5rbm93biBvcGNvZGUgMHgleFxuIiwgb3Bjb2RlKTsKKyAgIH0KKworICAgUFJJTlRGKCJcdFx0RU5EXG5cbiIpOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9mcmFncHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2ZyYWdwcm9nLmMKaW5kZXggNzAyYjg3OC4uMTg3NjIxOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2ZyYWdwcm9nLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X2ZyYWdwcm9nLmMKQEAgLTI5LDQwICsyOSw1NiBAQAogI2luY2x1ZGUgIm1hY3Jvcy5oIgogI2luY2x1ZGUgImVudW1zLmgiCiAKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ19pbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dyYW1vcHQuaCIKKwogI2luY2x1ZGUgInRubC90bmwuaCIKICNpbmNsdWRlICJ0bmwvdF9jb250ZXh0LmgiCisKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogCiAjaW5jbHVkZSAiaTkxNV9yZWcuaCIKICNpbmNsdWRlICJpOTE1X2NvbnRleHQuaCIKICNpbmNsdWRlICJpOTE1X3Byb2dyYW0uaCIKIAotI2luY2x1ZGUgInByb2dfaW5zdHJ1Y3Rpb24uaCIKLSNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgotI2luY2x1ZGUgInByb2dyYW0uaCIKLSNpbmNsdWRlICJwcm9ncmFtb3B0LmgiCitzdGF0aWMgY29uc3QgR0xmbG9hdCBzaW5fcXVhZF9jb25zdGFudHNbMl1bNF0gPSB7CisgICB7CisgICAgICAyLjAsCisgICAgICAtMS4wLAorICAgICAgLjUsCisgICAgICAuNzUKKyAgIH0sCisgICB7CisgICAgICA0LjAsCisgICAgICAtNC4wLAorICAgICAgMS4wIC8gKDIuMCAqIE1fUEkpLAorICAgICAgLjIyMjUKKyAgIH0KK307CiAKLQotCi0vKiAxLCAtMS8zISwgMS81ISwgLTEvNyEgKi8KLXN0YXRpYyBjb25zdCBHTGZsb2F0IHNpbl9jb25zdGFudHNbNF0gPSB7ICAxLjAsIAotCQkJCQkgICAtMS4wLygzKjIqMSksCi0JCQkJCSAgIDEuMC8oNSo0KjMqMioxKSwKLQkJCQkJICAgLTEuMC8oNyo2KjUqNCozKjIqMSkgfTsKK3N0YXRpYyBjb25zdCBHTGZsb2F0IHNpbl9jb25zdGFudHNbNF0gPSB7IDEuMCwKKyAgIC0xLjAgLyAoMyAqIDIgKiAxKSwKKyAgIDEuMCAvICg1ICogNCAqIDMgKiAyICogMSksCisgICAtMS4wIC8gKDcgKiA2ICogNSAqIDQgKiAzICogMiAqIDEpCit9OwogCiAvKiAxLCAtMS8yISwgMS80ISwgLTEvNiEgKi8KLXN0YXRpYyBjb25zdCBHTGZsb2F0IGNvc19jb25zdGFudHNbNF0gPSB7ICAxLjAsIAotCQkJCQkgICAtMS4wLygyKjEpLAotCQkJCQkgICAxLjAvKDQqMyoyKjEpLAotCQkJCQkgICAtMS4wLyg2KjUqNCozKjIqMSkgfTsKK3N0YXRpYyBjb25zdCBHTGZsb2F0IGNvc19jb25zdGFudHNbNF0gPSB7IDEuMCwKKyAgIC0xLjAgLyAoMiAqIDEpLAorICAgMS4wIC8gKDQgKiAzICogMiAqIDEpLAorICAgLTEuMCAvICg2ICogNSAqIDQgKiAzICogMiAqIDEpCit9OwogCiAvKioKICAqIFJldHJpZXZlIGEgdXJlZyBmb3IgdGhlIGdpdmVuIHNvdXJjZSByZWdpc3Rlci4gIFdpbGwgZW1pdAogICogY29uc3RhbnRzLCBhcHBseSBzd2l6emxpbmcgYW5kIG5lZ2F0aW9uIGFzIG5lZWRlZC4KICAqLwotc3RhdGljIEdMdWludCBzcmNfdmVjdG9yKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotCQkJICBjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNvdXJjZSwKLQkJCSAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2dyYW0gKQorc3RhdGljIEdMdWludAorc3JjX3ZlY3RvcihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNvdXJjZSwKKyAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2dyYW0pCiB7CiAgICBHTHVpbnQgc3JjOwogCkBAIC03MCwxMzYgKzg2LDE1MiBAQAogCiAgICAgICAvKiBSZWdpc3RlcnM6CiAgICAgICAgKi8KLSAgICAgIGNhc2UgUFJPR1JBTV9URU1QT1JBUlk6Ci0JIGlmIChzb3VyY2UtPkluZGV4ID49IEk5MTVfTUFYX1RFTVBPUkFSWSkgewotCSAgICBpOTE1X3Byb2dyYW1fZXJyb3IoIHAsICJFeGNlZWRlZCBtYXggdGVtcG9yYXJ5IHJlZyIgKTsKLQkgICAgcmV0dXJuIDA7Ci0JIH0KLQkgc3JjID0gVVJFRyggUkVHX1RZUEVfUiwgc291cmNlLT5JbmRleCApOworICAgY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKKyAgICAgIGlmIChzb3VyY2UtPkluZGV4ID49IEk5MTVfTUFYX1RFTVBPUkFSWSkgeworICAgICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJFeGNlZWRlZCBtYXggdGVtcG9yYXJ5IHJlZyIpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBzcmMgPSBVUkVHKFJFR19UWVBFX1IsIHNvdXJjZS0+SW5kZXgpOworICAgICAgYnJlYWs7CisgICBjYXNlIFBST0dSQU1fSU5QVVQ6CisgICAgICBzd2l0Y2ggKHNvdXJjZS0+SW5kZXgpIHsKKyAgICAgIGNhc2UgRlJBR19BVFRSSUJfV1BPUzoKKyAgICAgICAgIHNyYyA9IGk5MTVfZW1pdF9kZWNsKHAsIFJFR19UWVBFX1QsIHAtPndwb3NfdGV4LCBEMF9DSEFOTkVMX0FMTCk7CiAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUFJPR1JBTV9JTlBVVDoKLQkgc3dpdGNoIChzb3VyY2UtPkluZGV4KSB7Ci0JIGNhc2UgRlJBR19BVFRSSUJfV1BPUzoKLQkgICAgc3JjID0gaTkxNV9lbWl0X2RlY2woIHAsICBSRUdfVFlQRV9ULCBwLT53cG9zX3RleCwgRDBfQ0hBTk5FTF9BTEwgKTsgCi0JICAgIGJyZWFrOwotCSBjYXNlIEZSQUdfQVRUUklCX0NPTDA6Ci0JICAgIHNyYyA9IGk5MTVfZW1pdF9kZWNsKCBwLCAgUkVHX1RZUEVfVCwgVF9ESUZGVVNFLCBEMF9DSEFOTkVMX0FMTCApOyAKLQkgICAgYnJlYWs7Ci0JIGNhc2UgRlJBR19BVFRSSUJfQ09MMToKLQkgICAgc3JjID0gaTkxNV9lbWl0X2RlY2woIHAsICBSRUdfVFlQRV9ULCBUX1NQRUNVTEFSLCBEMF9DSEFOTkVMX1hZWiApOyAKLQkgICAgc3JjID0gc3dpenpsZSggc3JjLCBYLCBZLCBaLCBPTkUgKTsKLQkgICAgYnJlYWs7Ci0JIGNhc2UgRlJBR19BVFRSSUJfRk9HQzoKLQkgICAgc3JjID0gaTkxNV9lbWl0X2RlY2woIHAsICBSRUdfVFlQRV9ULCBUX0ZPR19XLCBEMF9DSEFOTkVMX1cgKTsgCi0JICAgIHNyYyA9IHN3aXp6bGUoIHNyYywgVywgVywgVywgVyApOwotCSAgICBicmVhazsKLQkgY2FzZSBGUkFHX0FUVFJJQl9URVgwOgotCSBjYXNlIEZSQUdfQVRUUklCX1RFWDE6Ci0JIGNhc2UgRlJBR19BVFRSSUJfVEVYMjoKLQkgY2FzZSBGUkFHX0FUVFJJQl9URVgzOgotCSBjYXNlIEZSQUdfQVRUUklCX1RFWDQ6Ci0JIGNhc2UgRlJBR19BVFRSSUJfVEVYNToKLQkgY2FzZSBGUkFHX0FUVFJJQl9URVg2OgotCSBjYXNlIEZSQUdfQVRUUklCX1RFWDc6Ci0JICAgIHNyYyA9IGk5MTVfZW1pdF9kZWNsKCBwLCAgUkVHX1RZUEVfVCwgCi0JCQkJIFRfVEVYMCArIChzb3VyY2UtPkluZGV4IC0gRlJBR19BVFRSSUJfVEVYMCksCi0JCQkJIEQwX0NIQU5ORUxfQUxMICk7IAotCSAgICBicmVhazsKLQotCSBkZWZhdWx0OgotCSAgICBpOTE1X3Byb2dyYW1fZXJyb3IoIHAsICJCYWQgc291cmNlLT5JbmRleCIgKTsgCi0JICAgIHJldHVybiAwOwotCSB9CisgICAgICBjYXNlIEZSQUdfQVRUUklCX0NPTDA6CisgICAgICAgICBzcmMgPSBpOTE1X2VtaXRfZGVjbChwLCBSRUdfVFlQRV9ULCBUX0RJRkZVU0UsIEQwX0NIQU5ORUxfQUxMKTsKICAgICAgICAgIGJyZWFrOwotCi0JIC8qIFZhcmlvdXMgcGFyYW10ZXJzIGFuZCBlbnYgdmFsdWVzLiAgQWxsIGVtaXR0ZWQgdG8KLQkgICogaGFyZHdhcmUgYXMgcHJvZ3JhbSBjb25zdGFudHMuCi0JICAqLwotICAgICAgY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgotICAgICAgICAgc3JjID0gaTkxNV9lbWl0X3BhcmFtNGZ2KCAKLQkgICAgcCwgcHJvZ3JhbS0+QmFzZS5Mb2NhbFBhcmFtc1tzb3VyY2UtPkluZGV4XSk7Ci0JIGJyZWFrOwotCi0gICAgICBjYXNlIFBST0dSQU1fRU5WX1BBUkFNOgotICAgICAgICAgc3JjID0gaTkxNV9lbWl0X3BhcmFtNGZ2KCAKLQkgICAgcCwgcC0+Y3R4LT5GcmFnbWVudFByb2dyYW0uUGFyYW1ldGVyc1tzb3VyY2UtPkluZGV4XSk7Ci0JIGJyZWFrOwotCi0gICAgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6Ci0gICAgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgotICAgICAgY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgotICAgICAgICAgc3JjID0gaTkxNV9lbWl0X3BhcmFtNGZ2KCAKLQkgICAgcCwgcHJvZ3JhbS0+QmFzZS5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJWYWx1ZXNbc291cmNlLT5JbmRleF0gKTsKLQkgYnJlYWs7CisgICAgICBjYXNlIEZSQUdfQVRUUklCX0NPTDE6CisgICAgICAgICBzcmMgPSBpOTE1X2VtaXRfZGVjbChwLCBSRUdfVFlQRV9ULCBUX1NQRUNVTEFSLCBEMF9DSEFOTkVMX1hZWik7CisgICAgICAgICBzcmMgPSBzd2l6emxlKHNyYywgWCwgWSwgWiwgT05FKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGUkFHX0FUVFJJQl9GT0dDOgorICAgICAgICAgc3JjID0gaTkxNV9lbWl0X2RlY2wocCwgUkVHX1RZUEVfVCwgVF9GT0dfVywgRDBfQ0hBTk5FTF9XKTsKKyAgICAgICAgIHNyYyA9IHN3aXp6bGUoc3JjLCBXLCBaRVJPLCBaRVJPLCBPTkUpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDA6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDE6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDI6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDM6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDQ6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDU6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDY6CisgICAgICBjYXNlIEZSQUdfQVRUUklCX1RFWDc6CisgICAgICAgICBzcmMgPSBpOTE1X2VtaXRfZGVjbChwLCBSRUdfVFlQRV9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVgwICsgKHNvdXJjZS0+SW5kZXggLSBGUkFHX0FUVFJJQl9URVgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQwX0NIQU5ORUxfQUxMKTsKKyAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotCSBpOTE1X3Byb2dyYW1fZXJyb3IoIHAsICJCYWQgc291cmNlLT5GaWxlIiApOyAKLQkgcmV0dXJuIDA7CisgICAgICAgICBpOTE1X3Byb2dyYW1fZXJyb3IocCwgIkJhZCBzb3VyY2UtPkluZGV4Iik7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBWYXJpb3VzIHBhcmFtdGVycyBhbmQgZW52IHZhbHVlcy4gIEFsbCBlbWl0dGVkIHRvCisgICAgICAgKiBoYXJkd2FyZSBhcyBwcm9ncmFtIGNvbnN0YW50cy4KKyAgICAgICAqLworICAgY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgorICAgICAgc3JjID0gaTkxNV9lbWl0X3BhcmFtNGZ2KHAsIHByb2dyYW0tPkJhc2UuTG9jYWxQYXJhbXNbc291cmNlLT5JbmRleF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUFJPR1JBTV9FTlZfUEFSQU06CisgICAgICBzcmMgPQorICAgICAgICAgaTkxNV9lbWl0X3BhcmFtNGZ2KHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Y3R4LT5GcmFnbWVudFByb2dyYW0uUGFyYW1ldGVyc1tzb3VyY2UtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6CisgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgorICAgY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgorICAgICAgc3JjID0KKyAgICAgICAgIGk5MTVfZW1pdF9wYXJhbTRmdihwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0tPkJhc2UuUGFyYW1ldGVycy0+UGFyYW1ldGVyVmFsdWVzW3NvdXJjZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhdKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJCYWQgc291cmNlLT5GaWxlIik7CisgICAgICByZXR1cm4gMDsKICAgIH0KIAotICAgc3JjID0gc3dpenpsZShzcmMsIAotCQkgR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDApLAotCQkgR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDEpLAotCQkgR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDIpLAotCQkgR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDMpKTsKKyAgIHNyYyA9IHN3aXp6bGUoc3JjLAorICAgICAgICAgICAgICAgICBHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgMCksCisgICAgICAgICAgICAgICAgIEdFVF9TV1ooc291cmNlLT5Td2l6emxlLCAxKSwKKyAgICAgICAgICAgICAgICAgR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDIpLCBHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgMykpOwogCiAgICBpZiAoc291cmNlLT5OZWdhdGVCYXNlKQotICAgICAgc3JjID0gbmVnYXRlKCBzcmMsIAotCQkgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDApLAotCQkgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDEpLAotCQkgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDIpLAotCQkgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDMpKTsKKyAgICAgIHNyYyA9IG5lZ2F0ZShzcmMsCisgICAgICAgICAgICAgICAgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDApLAorICAgICAgICAgICAgICAgICAgIEdFVF9CSVQoc291cmNlLT5OZWdhdGVCYXNlLCAxKSwKKyAgICAgICAgICAgICAgICAgICBHRVRfQklUKHNvdXJjZS0+TmVnYXRlQmFzZSwgMiksCisgICAgICAgICAgICAgICAgICAgR0VUX0JJVChzb3VyY2UtPk5lZ2F0ZUJhc2UsIDMpKTsKIAogICAgcmV0dXJuIHNyYzsKIH0KIAogCi1zdGF0aWMgR0x1aW50IGdldF9yZXN1bHRfdmVjdG9yKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotCQkJCSBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCApCitzdGF0aWMgR0x1aW50CitnZXRfcmVzdWx0X3ZlY3RvcihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCiB7CiAgICBzd2l0Y2ggKGluc3QtPkRzdFJlZy5GaWxlKSB7CiAgICBjYXNlIFBST0dSQU1fT1VUUFVUOgogICAgICAgc3dpdGNoIChpbnN0LT5Ec3RSZWcuSW5kZXgpIHsKLSAgICAgIGNhc2UgRlJBR19SRVNVTFRfQ09MUjogCi0JIHJldHVybiBVUkVHKFJFR19UWVBFX09DLCAwKTsKLSAgICAgIGNhc2UgRlJBR19SRVNVTFRfREVQUjogCi0JIHAtPmRlcHRoX3dyaXR0ZW4gPSAxOwotCSByZXR1cm4gVVJFRyhSRUdfVFlQRV9PRCwgMCk7Ci0gICAgICBkZWZhdWx0OiAKLQkgaTkxNV9wcm9ncmFtX2Vycm9yKCBwLCAiQmFkIGluc3QtPkRzdFJlZy5JbmRleCIgKTsgCi0JIHJldHVybiAwOworICAgICAgY2FzZSBGUkFHX1JFU1VMVF9DT0xSOgorICAgICAgICAgcmV0dXJuIFVSRUcoUkVHX1RZUEVfT0MsIDApOworICAgICAgY2FzZSBGUkFHX1JFU1VMVF9ERVBSOgorICAgICAgICAgcC0+ZGVwdGhfd3JpdHRlbiA9IDE7CisgICAgICAgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9PRCwgMCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJCYWQgaW5zdC0+RHN0UmVnLkluZGV4Iik7CisgICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgIGNhc2UgUFJPR1JBTV9URU1QT1JBUlk6CiAgICAgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9SLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOwogICAgZGVmYXVsdDoKLSAgICAgIGk5MTVfcHJvZ3JhbV9lcnJvciggcCwgIkJhZCBpbnN0LT5Ec3RSZWcuRmlsZSIgKTsgCisgICAgICBpOTE1X3Byb2dyYW1fZXJyb3IocCwgIkJhZCBpbnN0LT5Ec3RSZWcuRmlsZSIpOwogICAgICAgcmV0dXJuIDA7CiAgICB9CiB9Ci0gICAKLXN0YXRpYyBHTHVpbnQgZ2V0X3Jlc3VsdF9mbGFncyggY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgKQorCitzdGF0aWMgR0x1aW50CitnZXRfcmVzdWx0X2ZsYWdzKGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQogewogICAgR0x1aW50IGZsYWdzID0gMDsKIAotICAgaWYgKGluc3QtPlNhdHVyYXRlTW9kZSA9PSBTQVRVUkFURV9aRVJPX09ORSkgZmxhZ3MgfD0gQTBfREVTVF9TQVRVUkFURTsKLSAgIGlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1gpIGZsYWdzIHw9IEEwX0RFU1RfQ0hBTk5FTF9YOwotICAgaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWSkgZmxhZ3MgfD0gQTBfREVTVF9DSEFOTkVMX1k7Ci0gICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19aKSBmbGFncyB8PSBBMF9ERVNUX0NIQU5ORUxfWjsKLSAgIGlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1cpIGZsYWdzIHw9IEEwX0RFU1RfQ0hBTk5FTF9XOworICAgaWYgKGluc3QtPlNhdHVyYXRlTW9kZSA9PSBTQVRVUkFURV9aRVJPX09ORSkKKyAgICAgIGZsYWdzIHw9IEEwX0RFU1RfU0FUVVJBVEU7CisgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19YKQorICAgICAgZmxhZ3MgfD0gQTBfREVTVF9DSEFOTkVMX1g7CisgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19ZKQorICAgICAgZmxhZ3MgfD0gQTBfREVTVF9DSEFOTkVMX1k7CisgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19aKQorICAgICAgZmxhZ3MgfD0gQTBfREVTVF9DSEFOTkVMX1o7CisgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19XKQorICAgICAgZmxhZ3MgfD0gQTBfREVTVF9DSEFOTkVMX1c7CiAKICAgIHJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIEdMdWludCB0cmFuc2xhdGVfdGV4X3NyY190YXJnZXQoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCi0JCQkJICAgICBHTHVieXRlIGJpdCApCitzdGF0aWMgR0x1aW50Cit0cmFuc2xhdGVfdGV4X3NyY190YXJnZXQoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwgR0x1Ynl0ZSBiaXQpCiB7CiAgICBzd2l0Y2ggKGJpdCkgewotICAgY2FzZSBURVhUVVJFXzFEX0lOREVYOiAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV8yRDsKLSAgIGNhc2UgVEVYVFVSRV8yRF9JTkRFWDogICByZXR1cm4gRDBfU0FNUExFX1RZUEVfMkQ7Ci0gICBjYXNlIFRFWFRVUkVfUkVDVF9JTkRFWDogcmV0dXJuIEQwX1NBTVBMRV9UWVBFXzJEOwotICAgY2FzZSBURVhUVVJFXzNEX0lOREVYOiAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV9WT0xVTUU7Ci0gICBjYXNlIFRFWFRVUkVfQ1VCRV9JTkRFWDogcmV0dXJuIEQwX1NBTVBMRV9UWVBFX0NVQkU7Ci0gICBkZWZhdWx0OiBpOTE1X3Byb2dyYW1fZXJyb3IocCwgIlRleFNyY0JpdCIpOyByZXR1cm4gMDsKKyAgIGNhc2UgVEVYVFVSRV8xRF9JTkRFWDoKKyAgICAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV8yRDsKKyAgIGNhc2UgVEVYVFVSRV8yRF9JTkRFWDoKKyAgICAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV8yRDsKKyAgIGNhc2UgVEVYVFVSRV9SRUNUX0lOREVYOgorICAgICAgcmV0dXJuIEQwX1NBTVBMRV9UWVBFXzJEOworICAgY2FzZSBURVhUVVJFXzNEX0lOREVYOgorICAgICAgcmV0dXJuIEQwX1NBTVBMRV9UWVBFX1ZPTFVNRTsKKyAgIGNhc2UgVEVYVFVSRV9DVUJFX0lOREVYOgorICAgICAgcmV0dXJuIEQwX1NBTVBMRV9UWVBFX0NVQkU7CisgICBkZWZhdWx0OgorICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJUZXhTcmNCaXQiKTsKKyAgICAgIHJldHVybiAwOwogICAgfQogfQogCkBAIC0yMTEsNyArMjQzLDcgQEAKICAgIEdMdWludCBjb29yZCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwlcCiAgICAvKiBUZXhlbCBsb29rdXAgKi8JCQkJCQlcCiAJCQkJCQkJCVwKLSAgIGk5MTVfZW1pdF90ZXhsZCggcCwJCQkJCQlcCisgICBpOTE1X2VtaXRfdGV4bGQoIHAsIGdldF9saXZlX3JlZ3MocCwgaW5zdCksCQkJCQkJXAogCSAgICAgICBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLAkJCVwKIAkgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyggaW5zdCApLAkJCVwKIAkgICAgICAgc2FtcGxlciwJCQkJCQlcCkBAIC0yMzQsNiArMjY2LDQzIEBACiAjZGVmaW5lIEVNSVRfMkFSR19BUklUSCggT1AgKSBFTUlUX0FSSVRIKCBPUCwgMiApCiAjZGVmaW5lIEVNSVRfM0FSR19BUklUSCggT1AgKSBFTUlUX0FSSVRIKCBPUCwgMyApCiAKKy8qIAorICogVE9ETzogY29uc2lkZXIgbW92aW5nIHRoaXMgaW50byBjb3JlIAorICovCitzdGF0aWMgdm9pZCBjYWxjX2xpdmVfcmVncyggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCApCit7CisgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2dyYW0gPSBwLT5jdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKyAgICBHTHVpbnQgcmVnc1VzZWQgPSAweGZmZmYwMDAwOworICAgIEdMaW50IGk7CisgICAKKyAgICBmb3IgKGkgPSBwcm9ncmFtLT5CYXNlLk51bUluc3RydWN0aW9ucyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gJnByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zW2ldOworICAgICAgICBpbnQgb3BBcmdzID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKyAgICAgICAgaW50IGE7CisKKyAgICAgICAgLyogUmVnaXN0ZXIgaXMgd3JpdHRlbiB0bzogdW5tYXJrIGFzIGxpdmUgZm9yIHRoaXMgYW5kIHByZWNlZWRpbmcgb3BzICovIAorICAgICAgICBpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpCisgICAgICAgICAgICByZWdzVXNlZCAmPSB+KDEgPDwgaW5zdC0+RHN0UmVnLkluZGV4KTsKKworICAgICAgICBmb3IgKGEgPSAwOyBhIDwgb3BBcmdzOyBhKyspIHsKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGlzIHJlYWQgZnJvbTogbWFyayBhcyBsaXZlIGZvciB0aGlzIGFuZCBwcmVjZWVkaW5nIG9wcyAqLyAKKyAgICAgICAgICAgIGlmIChpbnN0LT5TcmNSZWdbYV0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSkKKyAgICAgICAgICAgICAgICByZWdzVXNlZCB8PSAxIDw8IGluc3QtPlNyY1JlZ1thXS5JbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHAtPnVzZWRSZWdzW2ldID0gcmVnc1VzZWQ7CisgICAgfQorfQorCitzdGF0aWMgR0x1aW50IGdldF9saXZlX3JlZ3MoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCApCit7CisgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2dyYW0gPSBwLT5jdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKyAgICBHTHVpbnQgbnIgPSBpbnN0IC0gcHJvZ3JhbS0+QmFzZS5JbnN0cnVjdGlvbnM7CisKKyAgICByZXR1cm4gcC0+dXNlZFJlZ3NbbnJdOworfQorIAogCiAvKiBQb3NzaWJsZSBjb25jZXJuczoKICAqCkBAIC0yNDYsOSArMzE1LDExIEBACiAgKiBjYW4gbGVhZCB0byBjb25mdXNpb24gLS0gaG9wZWZ1bGx5IHdlIGNvcGUgd2l0aCBpdCBvayBub3cuCiAgKgogICovCi1zdGF0aWMgdm9pZCB1cGxvYWRfcHJvZ3JhbSggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCApCitzdGF0aWMgdm9pZAordXBsb2FkX3Byb2dyYW0oc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKIHsKLSAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9ncmFtID0gcC0+Y3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQ7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqcHJvZ3JhbSA9CisgICAgICBwLT5jdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcHJvZ3JhbS0+QmFzZS5JbnN0cnVjdGlvbnM7CiAKIC8qICAgIF9tZXNhX2RlYnVnX2ZwX2luc3QocHJvZ3JhbS0+QmFzZS5OdW1JbnN0cnVjdGlvbnMsIGluc3QpOyAqLwpAQCAtMjU4LDUxMCArMzI5LDU1MSBAQAogICAgICogdGhpcyBiZWluZyB1cGxvYWRlZCB0byBoYXJkd2FyZS4KICAgICAqLwogICAgaWYgKGluc3RbMF0uT3Bjb2RlID09IE9QQ09ERV9FTkQpIHsKLSAgICAgIEdMdWludCB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOwotICAgICAgaTkxNV9lbWl0X2FyaXRoKCBwLAotCQkgICAgICBBMF9NT1YsCi0JCSAgICAgIFVSRUcoUkVHX1RZUEVfT0MsIDApLCAKLQkJICAgICAgQTBfREVTVF9DSEFOTkVMX0FMTCwgMCwKLQkJICAgICAgc3dpenpsZSh0bXAsT05FLFpFUk8sT05FLE9ORSksIDAsIDApOworICAgICAgR0x1aW50IHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKHApOworICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsCisgICAgICAgICAgICAgICAgICAgICAgQTBfTU9WLAorICAgICAgICAgICAgICAgICAgICAgIFVSRUcoUkVHX1RZUEVfT0MsIDApLAorICAgICAgICAgICAgICAgICAgICAgIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAsIE9ORSwgWkVSTywgT05FLCBPTkUpLCAwLCAwKTsKICAgICAgIHJldHVybjsKICAgIH0KIAorICAgaWYgKHByb2dyYW0tPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zID4gSTkxNV9NQVhfSU5TTikgeworICAgICAgIGk5MTVfcHJvZ3JhbV9lcnJvciggcCwgIkV4Y2VlZGVkIG1heCBpbnN0cnVjdGlvbnMiICk7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgLyogTm90IGFsd2F5cyBuZWVkZWQ6CisgICAgKi8KKyAgIGNhbGNfbGl2ZV9yZWdzKHApOworCiAgICB3aGlsZSAoMSkgewogICAgICAgR0x1aW50IHNyYzAsIHNyYzEsIHNyYzIsIGZsYWdzOwotICAgICAgR0x1aW50IHRtcCA9IDA7CisgICAgICBHTHVpbnQgdG1wID0gMCwgY29uc3RzMCA9IDAsIGNvbnN0czEgPSAwOwogCiAgICAgICBzd2l0Y2ggKGluc3QtPk9wY29kZSkgewotICAgICAgY2FzZSBPUENPREVfQUJTOiAKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01BWCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3JjMCwgbmVnYXRlKHNyYzAsIDEsMSwxLDEpLCAwKTsKLQkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9BQlM6CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAsIG5lZ2F0ZShzcmMwLCAxLCAxLCAxLCAxKSwgMCk7CisgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBPUENPREVfQUREOiAKLQkgRU1JVF8yQVJHX0FSSVRIKCBBMF9BREQgKTsKLQkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9BREQ6CisgICAgICAgICBFTUlUXzJBUkdfQVJJVEgoQTBfQUREKTsKKyAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9DTVA6IAotCSBzcmMwID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7Ci0JIHNyYzEgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzFdLCBwcm9ncmFtKTsKLQkgc3JjMiA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMl0sIHByb2dyYW0pOwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0NNUCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3JjMCwgc3JjMiwgc3JjMSk7CS8qIE5PVEU6IG9yZGVyIG9mIHNyYzIsIHNyYzEgKi8KLQkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9DTVA6CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzEgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOworICAgICAgICAgc3JjMiA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1syXSwgcHJvZ3JhbSk7CisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwgQTBfQ01QLCBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwgc3JjMCwgc3JjMiwgc3JjMSk7ICAgLyogTk9URTogb3JkZXIgb2Ygc3JjMiwgc3JjMSAqLworICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX0NPUzoKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOworICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKKwkgY29uc3RzMCA9IGk5MTVfZW1pdF9jb25zdDRmdihwLCBzaW5fcXVhZF9jb25zdGFudHNbMF0pOworCSBjb25zdHMxID0gaTkxNV9lbWl0X2NvbnN0NGZ2KHAsIHNpbl9xdWFkX2NvbnN0YW50c1sxXSk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NVUwsCisJIC8qIFJlZHVjZSByYW5nZSBmcm9tIHJlcGVhdGluZyBhYm91dCBbLXBpLHBpXSB0byBbLTEsMV0gKi8KKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAsCisJCQkgc3dpenpsZShjb25zdHMxLCBaLCBaRVJPLCBaRVJPLCBaRVJPKSwgLyogMS8oMnBpKSAqLworCQkJIHN3aXp6bGUoY29uc3RzMCwgVywgWkVSTywgWkVSTywgWkVSTykpOyAvKiAuNzUgKi8KKworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsIEEwX0ZSQywgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwgdG1wLCAwLCAwKTsKKworCSBpOTE1X2VtaXRfYXJpdGgocCwKKwkJCSBBMF9NQUQsCiAJCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKLQkJCSBzcmMwLCAKLQkJCSBpOTE1X2VtaXRfY29uc3QxZihwLCAxLjAvKE1fUEkgKiAyKSksCisJCQkgdG1wLAorCQkJIHN3aXp6bGUoY29uc3RzMCwgWCwgWkVSTywgWkVSTywgWkVSTyksIC8qIDIgKi8KKwkJCSBzd2l6emxlKGNvbnN0czAsIFksIFpFUk8sIFpFUk8sIFpFUk8pKTsgLyogLTEgKi8KKworCSAvKiBDb21wdXRlIENPUyB3aXRoIHRoZSBzYW1lIGNhbGN1bGF0aW9uIHVzZWQgZm9yIFNJTiwgYnV0IGEKKwkgICogZGlmZmVyZW50IHNvdXJjZSByYW5nZSBoYXMgYmVlbiBtYXBwZWQgdG8gWy0xLDFdIHRoaXMgdGltZS4KKwkgICovCisKKwkgLyogdG1wLnkgPSBhYnModG1wLngpOyB7eCwgYWJzKHgpLCAwLCAwfSAqLworCSBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NQVgsCisJCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWSwgMCwKKwkJCSBzd2l6emxlKHRtcCwgWkVSTywgWCwgWkVSTywgWkVSTyksCisJCQkgbmVnYXRlKHN3aXp6bGUodG1wLCBaRVJPLCBYLCBaRVJPLCBaRVJPKSwgMCwgMSwgMCwgMCksCiAJCQkgMCk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NT0QsCi0JCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKLQkJCSB0bXAsIAotCQkJIDAsIDAgKTsKLQotCSAvKiBCeSBjaG9vc2luZyBkaWZmZXJlbnQgdGF5bG9yIGNvbnN0YW50cywgY291bGQgZ2V0IHJpZCBvZiB0aGlzIG11bDoKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCisJIC8qIHRtcC55ID0gdG1wLnkgKiB0bXAueDsge3gsIHggKiBhYnMoeCksIDAsIDB9ICovCisJIGk5MTVfZW1pdF9hcml0aChwLAogCQkJIEEwX01VTCwKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLAotCQkJIHRtcCwgCi0JCQkgaTkxNV9lbWl0X2NvbnN0MWYocCwgKE1fUEkgKiAyKSksCisJCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWSwgMCwKKwkJCSBzd2l6emxlKHRtcCwgWkVSTywgWCwgWkVSTywgWkVSTyksCisJCQkgdG1wLAogCQkJIDApOwogCi0JIC8qIAotCSAgKiB0MC54eSA9IE1VTCB4Lnh4MTEsIHgueDExMTEgIDsgeF4yLCB4LCAxLCAxCi0JICAqIHQwID0gTVVMIHQwLnh5eHkgdDAueHgxMSA7IHheNCwgeF4zLCB4XjIsIDEKLQkgICogdDAgPSBNVUwgdDAueHh6MSB0MC56MTExICAgIDsgeF42IHheNCB4XjIgMQotCSAgKiByZXN1bHQgPSBEUDQgdDAsIGNvc19jb25zdGFudHMKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfTVVMLAotCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1hZLCAwLAotCQkJIHN3aXp6bGUodG1wLCBYLFgsT05FLE9ORSksIAotCQkJIHN3aXp6bGUodG1wLCBYLE9ORSxPTkUsT05FKSwgMCk7Ci0KLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NVUwsCi0JCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWFlaLCAwLAotCQkJIHN3aXp6bGUodG1wLCBYLFksWCxPTkUpLCAKLQkJCSBzd2l6emxlKHRtcCwgWCxYLE9ORSxPTkUpLCAwKTsKLQotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01VTCwKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YWVosIDAsCi0JCQkgc3dpenpsZSh0bXAsIFgsWCxaLE9ORSksIAotCQkJIHN3aXp6bGUodG1wLCBaLE9ORSxPTkUsT05FKSwgMCk7Ci0JICAgIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0RQNCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3dpenpsZSh0bXAsIE9ORSxaLFksWCksCi0JCQkgaTkxNV9lbWl0X2NvbnN0NGZ2KCBwLCBjb3NfY29uc3RhbnRzICksIDApOwotCi0JIGJyZWFrOwotCi0gICAgICBjYXNlIE9QQ09ERV9EUDM6IAotCSBFTUlUXzJBUkdfQVJJVEgoIEEwX0RQMyApOwotCSBicmVhazsKLQotICAgICAgY2FzZSBPUENPREVfRFA0OiAKLQkgRU1JVF8yQVJHX0FSSVRIKCBBMF9EUDQgKTsKLQkgYnJlYWs7Ci0KLSAgICAgIGNhc2UgT1BDT0RFX0RQSDogIAotCSBzcmMwID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7Ci0JIHNyYzEgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzFdLCBwcm9ncmFtKTsKLQotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0RQNCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3dpenpsZShzcmMwLCBYLFksWixPTkUpLCBzcmMxLCAwKTsKLQkgYnJlYWs7Ci0KLSAgICAgIGNhc2UgT1BDT0RFX0RTVDogCi0JIHNyYzAgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKLQkgc3JjMSA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOwotCi0JIC8qIHJlc3VsdFswXSA9IDEgICAgKiAxOwotCSAgKiByZXN1bHRbMV0gPSBhWzFdICogYlsxXTsKLQkgICogcmVzdWx0WzJdID0gYVsyXSAqIDE7Ci0JICAqIHJlc3VsdFszXSA9IDEgICAgKiBiWzNdOwotCSAgKi8KLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NVUwsCi0JCQkgZ2V0X3Jlc3VsdF92ZWN0b3IoIHAsIGluc3QgKSwgCi0JCQkgZ2V0X3Jlc3VsdF9mbGFncyggaW5zdCApLCAwLAotCQkJIHN3aXp6bGUoc3JjMCwgT05FLCBZLCBaLCAgIE9ORSksIAotCQkJIHN3aXp6bGUoc3JjMSwgT05FLCBZLCBPTkUsIFcgICksCisJIC8qIHRtcC54ID0gdG1wLnh5IERQIHNpbl9xdWFkX2NvbnN0YW50c1syXS54eSAqLworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQTBfRFAzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgQTBfREVTVF9DSEFOTkVMX1gsIDAsCisJCQkgdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUoY29uc3RzMSwgWCwgWSwgWkVSTywgWkVSTyksCiAJCQkgMCk7Ci0JIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9FWDI6IAotCSBzcmMwID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisJIC8qIHRtcC54IG5vdyBjb250YWlucyBhIGZpcnN0IGFwcHJveGltYXRpb24gKHkpLiAgTm93LCB3ZWlnaHQgaXQKKwkgICogYWdhaW5zdCB0bXAueSoqMiB0byBnZXQgY2xvc2VyLgorCSAgKi8KKwkgaTkxNV9lbWl0X2FyaXRoKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQTBfTUFYLAorCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisJCQkgc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLAorCQkJIG5lZ2F0ZShzd2l6emxlKHRtcCwgWkVSTywgWCwgWkVSTywgWkVSTyksIDAsIDEsIDAsIDApLAorCQkJIDApOwogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfRVhQLAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGdldF9yZXN1bHRfZmxhZ3MoIGluc3QgKSwgMCwKLQkJCSBzd2l6emxlKHNyYzAsWCxYLFgsWCksIDAsIDApOwotCSBicmVhazsKKwkgLyogdG1wLnkgPSB0bXAueCAqIHRtcC55IC0gdG1wLng7IHt5LCB5ICogYWJzKHkpIC0geSwgMCwgMH0gKi8KKwkgaTkxNV9lbWl0X2FyaXRoKHAsCisJCQkgQTBfTUFELAorCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisJCQkgc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLAorCQkJIHN3aXp6bGUodG1wLCBaRVJPLCBZLCBaRVJPLCBaRVJPKSwKKwkJCSBuZWdhdGUoc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLCAwLCAxLCAwLCAwKSk7CiAKLSAgICAgIGNhc2UgT1BDT0RFX0ZMUjogCi0JIEVNSVRfMUFSR19BUklUSCggQTBfRkxSICk7Ci0JIGJyZWFrOworCSAvKiByZXN1bHQgPSAuMjIyNSAqIHRtcC55ICsgdG1wLnggPS4yMjI1KHkgKiBhYnMoeSkgLSB5KSArIHk9ICovCisJIGk5MTVfZW1pdF9hcml0aChwLAorCQkJIEEwX01BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpLCAwLAorCQkJIHN3aXp6bGUoY29uc3RzMSwgVywgVywgVywgVyksCisJCQkgc3dpenpsZSh0bXAsIFksIFksIFksIFkpLAorCQkJIHN3aXp6bGUodG1wLCBYLCBYLCBYLCBYKSk7CisgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBPUENPREVfRlJDOiAKLQkgRU1JVF8xQVJHX0FSSVRIKCBBMF9GUkMgKTsKLQkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9EUDM6CisgICAgICAgICBFTUlUXzJBUkdfQVJJVEgoQTBfRFAzKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9EUDQ6CisgICAgICAgICBFTUlUXzJBUkdfQVJJVEgoQTBfRFA0KTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9EUEg6CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzEgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOworCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9EUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIFksIFosIE9ORSksIHNyYzEsIDApOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX0RTVDoKKyAgICAgICAgIHNyYzAgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOworICAgICAgICAgc3JjMSA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1sxXSwgcHJvZ3JhbSk7CisKKyAgICAgICAgIC8qIHJlc3VsdFswXSA9IDEgICAgKiAxOworICAgICAgICAgICogcmVzdWx0WzFdID0gYVsxXSAqIGJbMV07CisgICAgICAgICAgKiByZXN1bHRbMl0gPSBhWzJdICogMTsKKyAgICAgICAgICAqIHJlc3VsdFszXSA9IDEgICAgKiBiWzNdOworICAgICAgICAgICovCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NVUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIE9ORSwgWSwgWiwgT05FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzEsIE9ORSwgWSwgT05FLCBXKSwgMCk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfRVgyOgorICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX0VYUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUoc3JjMCwgWCwgWCwgWCwgWCksIDAsIDApOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX0ZMUjoKKyAgICAgICAgIEVNSVRfMUFSR19BUklUSChBMF9GTFIpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX0ZSQzoKKyAgICAgICAgIEVNSVRfMUFSR19BUklUSChBMF9GUkMpOworICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX0tJTDoKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOworICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKIAotCSBpOTE1X2VtaXRfdGV4bGQoIHAsCi0JCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAvKiB1c2UgYSBkdW1teSBkZXN0IHJlZyAqLwotCQkJIDAsCi0JCQkgc3JjMCwKLQkJCSBUMF9URVhLSUxMICk7Ci0JIGJyZWFrOworICAgICAgICAgaTkxNV9lbWl0X3RleGxkKHAsIGdldF9saXZlX3JlZ3MocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAgIC8qIHVzZSBhIGR1bW15IGRlc3QgcmVnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3JjMCwgVDBfVEVYS0lMTCk7CisgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBPUENPREVfTEcyOiAKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOworICAgICAgY2FzZSBPUENPREVfTEcyOgorICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9MT0csCi0JCQkgZ2V0X3Jlc3VsdF92ZWN0b3IoIHAsIGluc3QgKSwgCi0JCQkgZ2V0X3Jlc3VsdF9mbGFncyggaW5zdCApLCAwLAotCQkJIHN3aXp6bGUoc3JjMCxYLFgsWCxYKSwgMCwgMCk7Ci0JIGJyZWFrOworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQTBfTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZXN1bHRfdmVjdG9yKHAsIGluc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZXN1bHRfZmxhZ3MoaW5zdCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZShzcmMwLCBYLCBYLCBYLCBYKSwgMCwgMCk7CisgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBPUENPREVfTElUOiAKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOworICAgICAgY2FzZSBPUENPREVfTElUOgorICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKIAotCSAvKiB0bXAgPSBtYXgoIGEueHl6dywgYS4wMHp3ICkKLQkgICogWFhYOiBDbGFtcCB0bXAudyB0byAtMTI4Li4xMjgKLQkgICogdG1wLnkgPSBsb2codG1wLnkpCi0JICAqIHRtcC55ID0gdG1wLncgKiB0bXAueQotCSAgKiB0bXAueSA9IGV4cCh0bXAueSkKLQkgICogcmVzdWx0ID0gY21wIChhLjExLXgxLCBhLjF4MDEsIGEuMXh5MSApCi0JICAqLwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01BWCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLCAKLQkJCSBzcmMwLCBzd2l6emxlKHNyYzAsIFpFUk8sIFpFUk8sIFosIFcpLCAwICk7CisgICAgICAgICAvKiB0bXAgPSBtYXgoIGEueHl6dywgYS4wMHp3ICkKKyAgICAgICAgICAqIFhYWDogQ2xhbXAgdG1wLncgdG8gLTEyOC4uMTI4CisgICAgICAgICAgKiB0bXAueSA9IGxvZyh0bXAueSkKKyAgICAgICAgICAqIHRtcC55ID0gdG1wLncgKiB0bXAueQorICAgICAgICAgICogdG1wLnkgPSBleHAodG1wLnkpCisgICAgICAgICAgKiByZXN1bHQgPSBjbXAgKGEuMTEteDEsIGEuMXgwMSwgYS4xeHkxICkKKyAgICAgICAgICAqLworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsIEEwX01BWCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAsIHN3aXp6bGUoc3JjMCwgWkVSTywgWkVSTywgWiwgVyksIDApOwogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTE9HLCB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9ZLCAwLCAKLQkJCSBzd2l6emxlKHRtcCwgWSwgWSwgWSwgWSksIDAsIDAgKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLCBBMF9MT0csIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAsIFksIFksIFksIFkpLCAwLCAwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01VTCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWSwgMCwgCi0JCQkgc3dpenpsZSh0bXAsIFpFUk8sIFksIFpFUk8sIFpFUk8pLCAKLQkJCSBzd2l6emxlKHRtcCwgWkVSTywgVywgWkVSTywgWkVSTyksIDAgKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLCBBMF9NVUwsIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAsIFpFUk8sIFksIFpFUk8sIFpFUk8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBaRVJPLCBXLCBaRVJPLCBaRVJPKSwgMCk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9FWFAsIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsIAotCQkJIHN3aXp6bGUodG1wLCBZLCBZLCBZLCBZKSwgMCwgMCApOworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsIEEwX0VYUCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHRtcCwgWSwgWSwgWSwgWSksIDAsIDApOwogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfQ01QLAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGdldF9yZXN1bHRfZmxhZ3MoIGluc3QgKSwgMCwKLQkJCSBuZWdhdGUoc3dpenpsZSh0bXAsIE9ORSwgT05FLCBYLCBPTkUpLDAsMCwxLDApLAotCQkJIHN3aXp6bGUodG1wLCBPTkUsIFgsIFpFUk8sIE9ORSksCi0JCQkgc3dpenpsZSh0bXAsIE9ORSwgWCwgWSwgT05FKSk7Ci0JCSAgICAgCi0JIGJyZWFrOworICAgICAgICAgaTkxNV9lbWl0X2FyaXRoKHAsIEEwX0NNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZShzd2l6emxlKHRtcCwgT05FLCBPTkUsIFgsIE9ORSksIDAsIDAsIDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBPTkUsIFgsIFpFUk8sIE9ORSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAsIE9ORSwgWCwgWSwgT05FKSk7CiAKLSAgICAgIGNhc2UgT1BDT0RFX0xSUDogCi0JIHNyYzAgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKLQkgc3JjMSA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOwotCSBzcmMyID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1syXSwgcHJvZ3JhbSk7Ci0JIGZsYWdzID0gZ2V0X3Jlc3VsdF9mbGFncyggaW5zdCApOwotCSB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOworICAgICAgICAgYnJlYWs7CiAKLQkgLyogYiphICsgYyooMS1hKQotCSAgKgotCSAgKiBiKmEgKyBjIC0gY2EgCi0JICAqCi0JICAqIHRtcCA9IGIqYSArIGMsIAotCSAgKiByZXN1bHQgPSAoLWMpKmEgKyB0bXAgCi0JICAqLwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01BRCwgdG1wLCAKLQkJCSBmbGFncyAmIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgc3JjMSwgc3JjMCwgc3JjMiApOworICAgICAgY2FzZSBPUENPREVfTFJQOgorICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICBzcmMxID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzFdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzIgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMl0sIHByb2dyYW0pOworICAgICAgICAgZmxhZ3MgPSBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpOworICAgICAgICAgdG1wID0gaTkxNV9nZXRfdXRlbXAocCk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NQUQsIAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGZsYWdzLCAwLCAKLQkJCSBuZWdhdGUoc3JjMiwgMSwxLDEsMSksIHNyYzAsIHRtcCApOwotCSBicmVhazsKKyAgICAgICAgIC8qIGIqYSArIGMqKDEtYSkKKyAgICAgICAgICAqCisgICAgICAgICAgKiBiKmEgKyBjIC0gY2EgCisgICAgICAgICAgKgorICAgICAgICAgICogdG1wID0gYiphICsgYywgCisgICAgICAgICAgKiByZXN1bHQgPSAoLWMpKmEgKyB0bXAgCisgICAgICAgICAgKi8KKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLCBBMF9NQUQsIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsIHNyYzEsIHNyYzAsIHNyYzIpOworCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwgQTBfTUFELAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZXN1bHRfdmVjdG9yKHAsIGluc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAwLCBuZWdhdGUoc3JjMiwgMSwgMSwgMSwgMSksIHNyYzAsIHRtcCk7CisgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBPUENPREVfTUFEOgotCSBFTUlUXzNBUkdfQVJJVEgoIEEwX01BRCApOwotCSBicmVhazsKKyAgICAgICAgIEVNSVRfM0FSR19BUklUSChBMF9NQUQpOworICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX01BWDoKLQkgRU1JVF8yQVJHX0FSSVRIKCBBMF9NQVggKTsKLQkgYnJlYWs7CisgICAgICAgICBFTUlUXzJBUkdfQVJJVEgoQTBfTUFYKTsKKyAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9NSU46IAotCSBzcmMwID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7Ci0JIHNyYzEgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzFdLCBwcm9ncmFtKTsKLQkgdG1wID0gaTkxNV9nZXRfdXRlbXAoIHAgKTsKLQkgZmxhZ3MgPSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICk7CisgICAgICBjYXNlIE9QQ09ERV9NSU46CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzEgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOworICAgICAgICAgdG1wID0gaTkxNV9nZXRfdXRlbXAocCk7CisgICAgICAgICBmbGFncyA9IGdldF9yZXN1bHRfZmxhZ3MoaW5zdCk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NQVgsCi0JCQkgdG1wLCBmbGFncyAmIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgbmVnYXRlKHNyYzAsMSwxLDEsMSksIAotCQkJIG5lZ2F0ZShzcmMxLDEsMSwxLDEpLCAwKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIGZsYWdzICYgQTBfREVTVF9DSEFOTkVMX0FMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGUoc3JjMCwgMSwgMSwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRlKHNyYzEsIDEsIDEsIDEsIDEpLCAwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsCi0JCQkgQTBfTU9WLAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGZsYWdzLCAwLAotCQkJIG5lZ2F0ZSh0bXAsIDEsMSwxLDEpLCAwLCAwKTsKLQkgYnJlYWs7CisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NT1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIDAsIG5lZ2F0ZSh0bXAsIDEsIDEsIDEsIDEpLCAwLCAwKTsKKyAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9NT1Y6IAotCSBFTUlUXzFBUkdfQVJJVEgoIEEwX01PViApOwotCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX01PVjoKKyAgICAgICAgIEVNSVRfMUFSR19BUklUSChBMF9NT1YpOworICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgT1BDT0RFX01VTDogCi0JIEVNSVRfMkFSR19BUklUSCggQTBfTVVMICk7Ci0JIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfTVVMOgorICAgICAgICAgRU1JVF8yQVJHX0FSSVRIKEEwX01VTCk7CisgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBPUENPREVfUE9XOiAKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSBzcmMxID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1sxXSwgcHJvZ3JhbSk7Ci0JIHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKCBwICk7Ci0JIGZsYWdzID0gZ2V0X3Jlc3VsdF9mbGFncyggaW5zdCApOworICAgICAgY2FzZSBPUENPREVfUE9XOgorICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICBzcmMxID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzFdLCBwcm9ncmFtKTsKKyAgICAgICAgIHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKHApOworICAgICAgICAgZmxhZ3MgPSBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpOwogCi0JIC8qIFhYWDogbWFza2luZyBvbiBpbnRlcm1lZGlhdGUgdmFsdWVzLCBoZXJlIGFuZCBlbHNld2hlcmUuCi0JICAqLwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0xPRywKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLAotCQkJIHN3aXp6bGUoc3JjMCxYLFgsWCxYKSwgMCwgMCk7CisgICAgICAgICAvKiBYWFg6IG1hc2tpbmcgb24gaW50ZXJtZWRpYXRlIHZhbHVlcywgaGVyZSBhbmQgZWxzZXdoZXJlLgorICAgICAgICAgICovCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9MT0csCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIFgsIFgsIFgpLCAwLCAwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsCi0JCQkgQTBfTVVMLAotCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1gsIDAsCi0JCQkgdG1wLCBzcmMxLCAwKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLCBBMF9NVUwsIHRtcCwgQTBfREVTVF9DSEFOTkVMX1gsIDAsIHRtcCwgc3JjMSwgMCk7CiAKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsCi0JCQkgQTBfRVhQLAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGZsYWdzLCAwLAotCQkJIHN3aXp6bGUodG1wLFgsWCxYLFgpLCAwLCAwKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX0VYUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgMCwgc3dpenpsZSh0bXAsIFgsIFgsIFgsIFgpLCAwLCAwKTsKIAotCSBicmVhazsKKyAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9SQ1A6IAotCSBzcmMwID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICBjYXNlIE9QQ09ERV9SQ1A6CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX1JDUCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3dpenpsZShzcmMwLFgsWCxYLFgpLCAwLCAwKTsKLQkgYnJlYWs7CisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9SQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIFgsIFgsIFgpLCAwLCAwKTsKKyAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE9QQ09ERV9SU1E6IAorICAgICAgY2FzZSBPUENPREVfUlNROgogCi0JIHNyYzAgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzAgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfUlNRLAotCQkJIGdldF9yZXN1bHRfdmVjdG9yKCBwLCBpbnN0ICksIAotCQkJIGdldF9yZXN1bHRfZmxhZ3MoIGluc3QgKSwgMCwKLQkJCSBzd2l6emxlKHNyYzAsWCxYLFgsWCksIDAsIDApOwotCSBicmVhazsKLQkgCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9SU1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIFgsIFgsIFgpLCAwLCAwKTsKKyAgICAgICAgIGJyZWFrOworCiAgICAgICBjYXNlIE9QQ09ERV9TQ1M6Ci0JIHNyYzAgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKLQkgdG1wID0gaTkxNV9nZXRfdXRlbXAoIHAgKTsKKyAgICAgICAgIHNyYzAgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOworICAgICAgICAgdG1wID0gaTkxNV9nZXRfdXRlbXAocCk7CiAKLQkgLyogCi0JICAqIHQwLnh5ID0gTVVMIHgueHgxMSwgeC54MTExMSAgOyB4XjIsIHgsIDEsIDEKLQkgICogdDAgPSBNVUwgdDAueHl4eSB0MC54eDExIDsgeF40LCB4XjMsIHheMiwgeAotCSAgKiB0MSA9IE1VTCB0MC54eXl3IHQwLnl6MTEgICAgOyB4XjcgeF41IHheMyB4Ci0JICAqIHNjcy54ID0gRFA0IHQxLCBzaW5fY29uc3RhbnRzCi0JICAqIHQxID0gTVVMIHQwLnh4ejEgdDAuejExMSAgICA7IHheNiB4XjQgeF4yIDEKLQkgICogc2NzLnkgPSBEUDQgdDEsIGNvc19jb25zdGFudHMKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfTVVMLAotCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1hZLCAwLAotCQkJIHN3aXp6bGUoc3JjMCwgWCxYLE9ORSxPTkUpLCAKLQkJCSBzd2l6emxlKHNyYzAsIFgsT05FLE9ORSxPTkUpLCAwKTsKKyAgICAgICAgIC8qIAorICAgICAgICAgICogdDAueHkgPSBNVUwgeC54eDExLCB4LngxMTExICA7IHheMiwgeCwgMSwgMQorICAgICAgICAgICogdDAgPSBNVUwgdDAueHl4eSB0MC54eDExIDsgeF40LCB4XjMsIHheMiwgeAorICAgICAgICAgICogdDEgPSBNVUwgdDAueHl5dyB0MC55ejExICAgIDsgeF43IHheNSB4XjMgeAorICAgICAgICAgICogc2NzLnggPSBEUDQgdDEsIHNpbl9jb25zdGFudHMKKyAgICAgICAgICAqIHQxID0gTVVMIHQwLnh4ejEgdDAuejExMSAgICA7IHheNiB4XjQgeF4yIDEKKyAgICAgICAgICAqIHNjcy55ID0gRFA0IHQxLCBjb3NfY29uc3RhbnRzCisgICAgICAgICAgKi8KKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01VTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIFgsIE9ORSwgT05FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFgsIE9ORSwgT05FLCBPTkUpLCAwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01VTCwKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgc3dpenpsZSh0bXAsIFgsWSxYLFkpLCAKLQkJCSBzd2l6emxlKHRtcCwgWCxYLE9ORSxPTkUpLCAwKTsKKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01VTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAsIFgsIFksIFgsIFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBYLCBYLCBPTkUsIE9ORSksIDApOwogCi0JIGlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1kpIHsKLQkgICAgR0x1aW50IHRtcDE7Ci0JICAgIAotCSAgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19YKQotCSAgICAgICB0bXAxID0gaTkxNV9nZXRfdXRlbXAoIHAgKTsKLQkgICAgZWxzZQotCSAgICAgICB0bXAxID0gdG1wOworICAgICAgICAgaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWSkgeworICAgICAgICAgICAgR0x1aW50IHRtcDE7CiAKLQkgICAgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSAgICBBMF9NVUwsCi0JCQkgICAgdG1wMSwgQTBfREVTVF9DSEFOTkVMX0FMTCwgMCwKLQkJCSAgICBzd2l6emxlKHRtcCwgWCxZLFksVyksIAotCQkJICAgIHN3aXp6bGUodG1wLCBYLFosT05FLE9ORSksIDApOwotCSAgICAKLQkgICAgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSAgICBBMF9EUDQsCi0JCQkgICAgZ2V0X3Jlc3VsdF92ZWN0b3IoIHAsIGluc3QgKSwgCi0JCQkgICAgQTBfREVTVF9DSEFOTkVMX1ksIDAsCi0JCQkgICAgc3dpenpsZSh0bXAxLCBXLFosWSxYKSwKLQkJCSAgICBpOTE1X2VtaXRfY29uc3Q0ZnYoIHAsIHNpbl9jb25zdGFudHMgKSwgMCk7Ci0JIH0KKyAgICAgICAgICAgIGlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1gpCisgICAgICAgICAgICAgICB0bXAxID0gaTkxNV9nZXRfdXRlbXAocCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB0bXAxID0gdG1wOwogCi0JIGlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1gpIHsKLQkgICAgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSAgICBBMF9NVUwsCi0JCQkgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWFlaLCAwLAotCQkJICAgIHN3aXp6bGUodG1wLCBYLFgsWixPTkUpLCAKLQkJCSAgICBzd2l6emxlKHRtcCwgWixPTkUsT05FLE9ORSksIDApOwotCSAgICAKLQkgICAgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSAgICBBMF9EUDQsCi0JCQkgICAgZ2V0X3Jlc3VsdF92ZWN0b3IoIHAsIGluc3QgKSwgCi0JCQkgICAgQTBfREVTVF9DSEFOTkVMX1gsIDAsCi0JCQkgICAgc3dpenpsZSh0bXAsIE9ORSxaLFksWCksIAotCQkJICAgIGk5MTVfZW1pdF9jb25zdDRmdiggcCwgY29zX2NvbnN0YW50cyApLCAwKTsKLQkgfQotCSBicmVhazsKKyAgICAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01VTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAxLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBYLCBZLCBZLCBXKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHRtcCwgWCwgWiwgT05FLCBPTkUpLCAwKTsKIAotICAgICAgY2FzZSBPUENPREVfU0dFOiAKLQkgRU1JVF8yQVJHX0FSSVRIKCBBMF9TR0UgKTsKLQkgYnJlYWs7CisgICAgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMF9EUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZSh0bXAxLCBXLCBaLCBZLCBYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOTE1X2VtaXRfY29uc3Q0ZnYocCwgc2luX2NvbnN0YW50cyksIDApOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19YKSB7CisgICAgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NVUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWFlaLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBYLCBYLCBaLCBPTkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUodG1wLCBaLCBPTkUsIE9ORSwgT05FKSwgMCk7CisKKyAgICAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEwX0RQNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHRtcCwgT05FLCBaLCBZLCBYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOTE1X2VtaXRfY29uc3Q0ZnYocCwgY29zX2NvbnN0YW50cyksIDApOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX1NHRToKKyAgICAgICAgIEVNSVRfMkFSR19BUklUSChBMF9TR0UpOworICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX1NJTjoKLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSB0bXAgPSBpOTE1X2dldF91dGVtcCggcCApOworICAgICAgICAgc3JjMCA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1swXSwgcHJvZ3JhbSk7CisgICAgICAgICB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKKwkgY29uc3RzMCA9IGk5MTVfZW1pdF9jb25zdDRmdihwLCBzaW5fcXVhZF9jb25zdGFudHNbMF0pOworCSBjb25zdHMxID0gaTkxNV9lbWl0X2NvbnN0NGZ2KHAsIHNpbl9xdWFkX2NvbnN0YW50c1sxXSk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NVUwsCisJIC8qIFJlZHVjZSByYW5nZSBmcm9tIHJlcGVhdGluZyBhYm91dCBbLXBpLHBpXSB0byBbLTEsMV0gKi8KKyAgICAgICAgIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAsCisJCQkgc3dpenpsZShjb25zdHMxLCBaLCBaRVJPLCBaRVJPLCBaRVJPKSwgLyogMS8oMnBpKSAqLworCQkJIHN3aXp6bGUoY29uc3RzMCwgWiwgWkVSTywgWkVSTywgWkVSTykpOyAvKiAuNSAqLworCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwgQTBfRlJDLCB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLCB0bXAsIDAsIDApOworCisJIGk5MTVfZW1pdF9hcml0aChwLAorCQkJIEEwX01BRCwKIAkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9YLCAwLAotCQkJIHNyYzAsIAotCQkJIGk5MTVfZW1pdF9jb25zdDFmKHAsIDEuMC8oTV9QSSAqIDIpKSwKKwkJCSB0bXAsCisJCQkgc3dpenpsZShjb25zdHMwLCBYLCBaRVJPLCBaRVJPLCBaRVJPKSwgLyogMiAqLworCQkJIHN3aXp6bGUoY29uc3RzMCwgWSwgWkVSTywgWkVSTywgWkVSTykpOyAvKiAtMSAqLworCisJIC8qIENvbXB1dGUgc2luIHVzaW5nIGEgcXVhZHJhdGljIGFuZCBxdWFydGljLiAgSXQgZ2l2ZXMgY29udGludWl0eQorCSAgKiB0aGF0IHJlcGVhdGluZyB0aGUgVGF5bG9yIHNlcmllcyBsYWNrcyBldmVyeSAyKnBpLCBhbmQgaGFzCisJICAqIHJlZHVjZWQgZXJyb3IuCisJICAqCisJICAqIFRoZSBpZGVhIHdhcyBkZXNjcmliZWQgYXQ6CisJICAqIGh0dHA6Ly93d3cuZGV2bWFzdGVyLm5ldC9mb3J1bXMvc2hvd3RocmVhZC5waHA/dD01Nzg0CisJICAqLworCisJIC8qIHRtcC55ID0gYWJzKHRtcC54KTsge3gsIGFicyh4KSwgMCwgMH0gKi8KKwkgaTkxNV9lbWl0X2FyaXRoKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQTBfTUFYLAorCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisJCQkgc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLAorCQkJIG5lZ2F0ZShzd2l6emxlKHRtcCwgWkVSTywgWCwgWkVSTywgWkVSTyksIDAsIDEsIDAsIDApLAogCQkJIDApOwogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfTU9ELAotCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1gsIDAsCi0JCQkgdG1wLCAKLQkJCSAwLCAwICk7Ci0KLQkgLyogQnkgY2hvb3NpbmcgZGlmZmVyZW50IHRheWxvciBjb25zdGFudHMsIGNvdWxkIGdldCByaWQgb2YgdGhpcyBtdWw6Ci0JICAqLwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAorCSAvKiB0bXAueSA9IHRtcC55ICogdG1wLng7IHt4LCB4ICogYWJzKHgpLCAwLCAwfSAqLworCSBpOTE1X2VtaXRfYXJpdGgocCwKIAkJCSBBMF9NVUwsCi0JCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKLQkJCSB0bXAsIAotCQkJIGk5MTVfZW1pdF9jb25zdDFmKHAsIChNX1BJICogMikpLAorCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisJCQkgc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLAorCQkJIHRtcCwKIAkJCSAwKTsKIAotCSAvKiAKLQkgICogdDAueHkgPSBNVUwgeC54eDExLCB4LngxMTExICA7IHheMiwgeCwgMSwgMQotCSAgKiB0MCA9IE1VTCB0MC54eXh5IHQwLnh4MTEgOyB4XjQsIHheMywgeF4yLCB4Ci0JICAqIHQxID0gTVVMIHQwLnh5eXcgdDAueXoxMSAgICA7IHheNyB4XjUgeF4zIHgKLQkgICogcmVzdWx0ID0gRFA0IHQxLnd6eXgsIHNpbl9jb25zdGFudHMKKwkgLyogdG1wLnggPSB0bXAueHkgRFAgc2luX3F1YWRfY29uc3RhbnRzWzJdLnh5ICovCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9EUDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfWCwgMCwKKwkJCSB0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZShjb25zdHMxLCBYLCBZLCBaRVJPLCBaRVJPKSwKKwkJCSAwKTsKKworCSAvKiB0bXAueCBub3cgY29udGFpbnMgYSBmaXJzdCBhcHByb3hpbWF0aW9uICh5KS4gIE5vdywgd2VpZ2h0IGl0CisJICAqIGFnYWluc3QgdG1wLnkqKjIgdG8gZ2V0IGNsb3Nlci4KIAkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCQkgQTBfTVVMLAotCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1hZLCAwLAotCQkJIHN3aXp6bGUodG1wLCBYLFgsT05FLE9ORSksIAotCQkJIHN3aXp6bGUodG1wLCBYLE9ORSxPTkUsT05FKSwgMCk7CisJIGk5MTVfZW1pdF9hcml0aChwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEEwX01BWCwKKwkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9ZLCAwLAorCQkJIHN3aXp6bGUodG1wLCBaRVJPLCBYLCBaRVJPLCBaRVJPKSwKKwkJCSBuZWdhdGUoc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLCAwLCAxLCAwLCAwKSwKKwkJCSAwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01VTCwKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgc3dpenpsZSh0bXAsIFgsWSxYLFkpLCAKLQkJCSBzd2l6emxlKHRtcCwgWCxYLE9ORSxPTkUpLCAwKTsKKwkgLyogdG1wLnkgPSB0bXAueCAqIHRtcC55IC0gdG1wLng7IHt5LCB5ICogYWJzKHkpIC0geSwgMCwgMH0gKi8KKwkgaTkxNV9lbWl0X2FyaXRoKHAsCisJCQkgQTBfTUFELAorCQkJIHRtcCwgQTBfREVTVF9DSEFOTkVMX1ksIDAsCisJCQkgc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLAorCQkJIHN3aXp6bGUodG1wLCBaRVJPLCBZLCBaRVJPLCBaRVJPKSwKKwkJCSBuZWdhdGUoc3dpenpsZSh0bXAsIFpFUk8sIFgsIFpFUk8sIFpFUk8pLCAwLCAxLCAwLCAwKSk7CiAKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCAKLQkJCSBBMF9NVUwsCi0JCQkgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLAotCQkJIHN3aXp6bGUodG1wLCBYLFksWSxXKSwgCi0JCQkgc3dpenpsZSh0bXAsIFgsWixPTkUsT05FKSwgMCk7Ci0JICAgIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0RQNCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3dpenpsZSh0bXAsIFcsIFosIFksIFggKSwKLQkJCSBpOTE1X2VtaXRfY29uc3Q0ZnYoIHAsIHNpbl9jb25zdGFudHMgKSwgMCk7Ci0JIGJyZWFrOworCSAvKiByZXN1bHQgPSAuMjIyNSAqIHRtcC55ICsgdG1wLnggPS4yMjI1KHkgKiBhYnMoeSkgLSB5KSArIHk9ICovCisJIGk5MTVfZW1pdF9hcml0aChwLAorCQkJIEEwX01BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X3ZlY3RvcihwLCBpbnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0X2ZsYWdzKGluc3QpLCAwLAorCQkJIHN3aXp6bGUoY29uc3RzMSwgVywgVywgVywgVyksCisJCQkgc3dpenpsZSh0bXAsIFksIFksIFksIFkpLAorCQkJIHN3aXp6bGUodG1wLCBYLCBYLCBYLCBYKSk7CiAKLSAgICAgIGNhc2UgT1BDT0RFX1NMVDogCi0JIEVNSVRfMkFSR19BUklUSCggQTBfU0xUICk7Ci0JIGJyZWFrOworICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgT1BDT0RFX1NVQjogCi0JIHNyYzAgPSBzcmNfdmVjdG9yKCBwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKLQkgc3JjMSA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOworICAgICAgY2FzZSBPUENPREVfU0xUOgorICAgICAgICAgRU1JVF8yQVJHX0FSSVRIKEEwX1NMVCk7CisgICAgICAgICBicmVhazsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX0FERCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3JjMCwgbmVnYXRlKHNyYzEsIDEsMSwxLDEpLCAwKTsKLQkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TVUI6CisgICAgICAgICBzcmMwID0gc3JjX3ZlY3RvcihwLCAmaW5zdC0+U3JjUmVnWzBdLCBwcm9ncmFtKTsKKyAgICAgICAgIHNyYzEgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMV0sIHByb2dyYW0pOwogCi0gICAgICBjYXNlIE9QQ09ERV9TV1o6IAotCSBFTUlUXzFBUkdfQVJJVEgoIEEwX01PViApOyAvKiBleHRlbmRlZCBzd2l6emxlIGhhbmRsZWQgbmF0aXZlbHkgKi8KLQkgYnJlYWs7CisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9BREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwLCBuZWdhdGUoc3JjMSwgMSwgMSwgMSwgMSksIDApOworICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgT1BDT0RFX1RFWDogCi0JIEVNSVRfVEVYKCBUMF9URVhMRCApOwotCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1NXWjoKKyAgICAgICAgIEVNSVRfMUFSR19BUklUSChBMF9NT1YpOyAgICAgICAvKiBleHRlbmRlZCBzd2l6emxlIGhhbmRsZWQgbmF0aXZlbHkgKi8KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9URVg6CisgICAgICAgICBFTUlUX1RFWChUMF9URVhMRCk7CisgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBPUENPREVfVFhCOgotCSBFTUlUX1RFWCggVDBfVEVYTERCICk7Ci0JIGJyZWFrOworICAgICAgICAgRU1JVF9URVgoVDBfVEVYTERCKTsKKyAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIE9QQ09ERV9UWFA6Ci0JIEVNSVRfVEVYKCBUMF9URVhMRFAgKTsKLQkgYnJlYWs7CisgICAgICAgICBFTUlUX1RFWChUMF9URVhMRFApOworICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX1hQRDoKLQkgLyogQ3Jvc3MgcHJvZHVjdDoKLQkgICogICAgICByZXN1bHQueCA9IHNyYzAueSAqIHNyYzEueiAtIHNyYzAueiAqIHNyYzEueTsKLQkgICogICAgICByZXN1bHQueSA9IHNyYzAueiAqIHNyYzEueCAtIHNyYzAueCAqIHNyYzEuejsKLQkgICogICAgICByZXN1bHQueiA9IHNyYzAueCAqIHNyYzEueSAtIHNyYzAueSAqIHNyYzEueDsKLQkgICogICAgICByZXN1bHQudyA9IHVuZGVmOwotCSAgKi8KLQkgc3JjMCA9IHNyY192ZWN0b3IoIHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOwotCSBzcmMxID0gc3JjX3ZlY3RvciggcCwgJmluc3QtPlNyY1JlZ1sxXSwgcHJvZ3JhbSk7Ci0JIHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKCBwICk7Ci0JIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01VTCwKLQkJCSB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgc3dpenpsZShzcmMwLFosWCxZLE9ORSksIAotCQkJIHN3aXp6bGUoc3JjMSxZLFosWCxPTkUpLCAwKTsKKyAgICAgICAgIC8qIENyb3NzIHByb2R1Y3Q6CisgICAgICAgICAgKiAgICAgIHJlc3VsdC54ID0gc3JjMC55ICogc3JjMS56IC0gc3JjMC56ICogc3JjMS55OworICAgICAgICAgICogICAgICByZXN1bHQueSA9IHNyYzAueiAqIHNyYzEueCAtIHNyYzAueCAqIHNyYzEuejsKKyAgICAgICAgICAqICAgICAgcmVzdWx0LnogPSBzcmMwLnggKiBzcmMxLnkgLSBzcmMwLnkgKiBzcmMxLng7CisgICAgICAgICAgKiAgICAgIHJlc3VsdC53ID0gdW5kZWY7CisgICAgICAgICAgKi8KKyAgICAgICAgIHNyYzAgPSBzcmNfdmVjdG9yKHAsICZpbnN0LT5TcmNSZWdbMF0sIHByb2dyYW0pOworICAgICAgICAgc3JjMSA9IHNyY192ZWN0b3IocCwgJmluc3QtPlNyY1JlZ1sxXSwgcHJvZ3JhbSk7CisgICAgICAgICB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIAotCQkJIEEwX01BRCwKLQkJCSBnZXRfcmVzdWx0X3ZlY3RvciggcCwgaW5zdCApLCAKLQkJCSBnZXRfcmVzdWx0X2ZsYWdzKCBpbnN0ICksIDAsCi0JCQkgc3dpenpsZShzcmMwLFksWixYLE9ORSksIAotCQkJIHN3aXp6bGUoc3JjMSxaLFgsWSxPTkUpLCAKLQkJCSBuZWdhdGUodG1wLDEsMSwxLDApKTsKLQkgYnJlYWs7CisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NVUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUoc3JjMCwgWiwgWCwgWSwgT05FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzEsIFksIFosIFgsIE9ORSksIDApOworCisgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBMF9NQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF92ZWN0b3IocCwgaW5zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jlc3VsdF9mbGFncyhpbnN0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKHNyYzAsIFksIFosIFgsIE9ORSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZShzcmMxLCBaLCBYLCBZLCBPTkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZSh0bXAsIDEsIDEsIDEsIDApKTsKKyAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIE9QQ09ERV9FTkQ6Ci0JIHJldHVybjsKLQkgCisgICAgICAgICByZXR1cm47CisKICAgICAgIGRlZmF1bHQ6Ci0JIGk5MTVfcHJvZ3JhbV9lcnJvciggcCwgImJhZCBvcGNvZGUiICk7Ci0JIHJldHVybjsKKyAgICAgICAgIGk5MTVfcHJvZ3JhbV9lcnJvcihwLCAiYmFkIG9wY29kZSIpOworICAgICAgICAgcmV0dXJuOwogICAgICAgfQogCiAgICAgICBpbnN0Kys7Ci0gICAgICBpOTE1X3JlbGVhc2VfdXRlbXBzKCBwICk7IAorICAgICAgaTkxNV9yZWxlYXNlX3V0ZW1wcyhwKTsKICAgIH0KIH0KIApAQCAtNzY5LDIxICs4ODEsMjIgQEAKICAqIGVtaXQsIGp1c3QgbW92ZSB0aGUgdmFsdWUgaW50byBpdHMgY29ycmVjdCBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mCiAgKiB0aGUgcHJvZ3JhbToKICAqLwotc3RhdGljIHZvaWQgZml4dXBfZGVwdGhfd3JpdGUoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKQorc3RhdGljIHZvaWQKK2ZpeHVwX2RlcHRoX3dyaXRlKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApCiB7CiAgICBpZiAocC0+ZGVwdGhfd3JpdHRlbikgewogICAgICAgR0x1aW50IGRlcHRoID0gVVJFRyhSRUdfVFlQRV9PRCwgMCk7CiAKLSAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgCi0JCSAgICAgIEEwX01PViwKLQkJICAgICAgZGVwdGgsIEEwX0RFU1RfQ0hBTk5FTF9XLCAwLAotCQkgICAgICBzd2l6emxlKGRlcHRoLFgsWSxaLFopLCAKLQkJICAgICAgMCwgMCk7CisgICAgICBpOTE1X2VtaXRfYXJpdGgocCwKKyAgICAgICAgICAgICAgICAgICAgICBBMF9NT1YsCisgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsIEEwX0RFU1RfQ0hBTk5FTF9XLCAwLAorICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGUoZGVwdGgsIFgsIFksIFosIFopLCAwLCAwKTsKICAgIH0KIH0KIAogCi1zdGF0aWMgdm9pZCBjaGVja193cG9zKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICkKK3N0YXRpYyB2b2lkCitjaGVja193cG9zKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApCiB7CiAgICBHTHVpbnQgaW5wdXRzID0gcC0+RnJhZ1Byb2cuQmFzZS5JbnB1dHNSZWFkOwogICAgR0xpbnQgaTsKQEAgLTc5MSwxMiArOTA0LDEyIEBACiAgICBwLT53cG9zX3RleCA9IC0xOwogCiAgICBmb3IgKGkgPSAwOyBpIDwgcC0+Y3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0czsgaSsrKSB7Ci0gICAgICBpZiAoaW5wdXRzICYgRlJBR19CSVRfVEVYKGkpKSAKLQkgY29udGludWU7CisgICAgICBpZiAoaW5wdXRzICYgRlJBR19CSVRfVEVYKGkpKQorICAgICAgICAgY29udGludWU7CiAgICAgICBlbHNlIGlmIChpbnB1dHMgJiBGUkFHX0JJVF9XUE9TKSB7Ci0JIHAtPndwb3NfdGV4ID0gaTsKLQkgaW5wdXRzICY9IH5GUkFHX0JJVF9XUE9TOwotICAgICAgfSAgIAorICAgICAgICAgcC0+d3Bvc190ZXggPSBpOworICAgICAgICAgaW5wdXRzICY9IH5GUkFHX0JJVF9XUE9TOworICAgICAgfQogICAgfQogCiAgICBpZiAoaW5wdXRzICYgRlJBR19CSVRfV1BPUykgewpAQCAtODA1LDUzICs5MTgsNTQgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB0cmFuc2xhdGVfcHJvZ3JhbSggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCApCitzdGF0aWMgdm9pZAordHJhbnNsYXRlX3Byb2dyYW0oc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQocC0+Y3R4KTsKLSAgIAotICAgaTkxNV9pbml0X3Byb2dyYW0oIGk5MTUsIHAgKTsKLSAgIGNoZWNrX3dwb3MoIHAgKTsgCi0gICB1cGxvYWRfcHJvZ3JhbSggcCApOwotICAgZml4dXBfZGVwdGhfd3JpdGUoIHAgKTsKLSAgIGk5MTVfZmluaV9wcm9ncmFtKCBwICk7IAotICAgCisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gSTkxNV9DT05URVhUKHAtPmN0eCk7CisKKyAgIGk5MTVfaW5pdF9wcm9ncmFtKGk5MTUsIHApOworICAgY2hlY2tfd3BvcyhwKTsKKyAgIHVwbG9hZF9wcm9ncmFtKHApOworICAgZml4dXBfZGVwdGhfd3JpdGUocCk7CisgICBpOTE1X2ZpbmlfcHJvZ3JhbShwKTsKKwogICAgcC0+dHJhbnNsYXRlZCA9IDE7CiB9CiAKIAotc3RhdGljIHZvaWQgdHJhY2tfcGFyYW1zKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICkKK3N0YXRpYyB2b2lkCit0cmFja19wYXJhbXMoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKIHsKICAgIEdMaW50IGk7CiAKICAgIGlmIChwLT5ucl9wYXJhbXMpCi0gICAgICBfbWVzYV9sb2FkX3N0YXRlX3BhcmFtZXRlcnMocC0+Y3R4LCBwLT5GcmFnUHJvZy5CYXNlLlBhcmFtZXRlcnMpOyAKKyAgICAgIF9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhwLT5jdHgsIHAtPkZyYWdQcm9nLkJhc2UuUGFyYW1ldGVycyk7CiAKICAgIGZvciAoaSA9IDA7IGkgPCBwLT5ucl9wYXJhbXM7IGkrKykgewogICAgICAgR0xpbnQgcmVnID0gcC0+cGFyYW1baV0ucmVnOwotICAgICAgQ09QWV80ViggcC0+Y29uc3RhbnRbcmVnXSwgcC0+cGFyYW1baV0udmFsdWVzICk7CisgICAgICBDT1BZXzRWKHAtPmNvbnN0YW50W3JlZ10sIHAtPnBhcmFtW2ldLnZhbHVlcyk7CiAgICB9Ci0gICAKKwogICAgcC0+cGFyYW1zX3VwdG9kYXRlID0gMTsKLSAgIHAtPm9uX2hhcmR3YXJlID0gMDsJCS8qIG92ZXJraWxsICovCisgICBwLT5vbl9oYXJkd2FyZSA9IDA7ICAgICAgICAgIC8qIG92ZXJraWxsICovCiB9CiAKIAotc3RhdGljIHZvaWQgaTkxNUJpbmRQcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgICBHTGVudW0gdGFyZ2V0LCAKLQkJCSAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyApCitzdGF0aWMgdm9pZAoraTkxNUJpbmRQcm9ncmFtKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCiB7CiAgICBpZiAodGFyZ2V0ID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKSB7Ci0gICAgICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0gICAgICBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwID0gKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKilwcm9nOworICAgICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9IChzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7CiAKLSAgICAgIGlmIChpOTE1LT5jdXJyZW50X3Byb2dyYW0gPT0gcCkgCi0JIHJldHVybjsKLSAgICAgIAorICAgICAgaWYgKGk5MTUtPmN1cnJlbnRfcHJvZ3JhbSA9PSBwKQorICAgICAgICAgcmV0dXJuOworCiAgICAgICBpZiAoaTkxNS0+Y3VycmVudF9wcm9ncmFtKSB7Ci0JIGk5MTUtPmN1cnJlbnRfcHJvZ3JhbS0+b25faGFyZHdhcmUgPSAwOwotCSBpOTE1LT5jdXJyZW50X3Byb2dyYW0tPnBhcmFtc191cHRvZGF0ZSA9IDA7CisgICAgICAgICBpOTE1LT5jdXJyZW50X3Byb2dyYW0tPm9uX2hhcmR3YXJlID0gMDsKKyAgICAgICAgIGk5MTUtPmN1cnJlbnRfcHJvZ3JhbS0+cGFyYW1zX3VwdG9kYXRlID0gMDsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBpOTE1LT5jdXJyZW50X3Byb2dyYW0gPSBwOwogCiAgICAgICBhc3NlcnQocC0+b25faGFyZHdhcmUgPT0gMCk7CkBAIC04NjAsNzEgKzk3NCw3MCBAQAogICAgfQogfQogCi1zdGF0aWMgc3RydWN0IGdsX3Byb2dyYW0gKmk5MTVOZXdQcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwKLQkJCQkgICAgICBHTGVudW0gdGFyZ2V0LCAKLQkJCQkgICAgICBHTHVpbnQgaWQgKQorc3RhdGljIHN0cnVjdCBnbF9wcm9ncmFtICoKK2k5MTVOZXdQcm9ncmFtKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQogewogICAgc3dpdGNoICh0YXJnZXQpIHsKICAgIGNhc2UgR0xfVkVSVEVYX1BST0dSQU1fQVJCOgotICAgICAgcmV0dXJuIF9tZXNhX2luaXRfdmVydGV4X3Byb2dyYW0oIGN0eCwgQ0FMTE9DX1NUUlVDVChnbF92ZXJ0ZXhfcHJvZ3JhbSksCi0JCQkJCXRhcmdldCwgaWQgKTsKKyAgICAgIHJldHVybiBfbWVzYV9pbml0X3ZlcnRleF9wcm9ncmFtKGN0eCwgQ0FMTE9DX1NUUlVDVChnbF92ZXJ0ZXhfcHJvZ3JhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGlkKTsKIAotICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjogewotICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcHJvZyA9IENBTExPQ19TVFJVQ1QoaTkxNV9mcmFnbWVudF9wcm9ncmFtKTsKLSAgICAgIGlmIChwcm9nKSB7Ci0JIGk5MTVfaW5pdF9wcm9ncmFtKCBJOTE1X0NPTlRFWFQoY3R4KSwgcHJvZyApOworICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjp7CisgICAgICAgICBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwcm9nID0KKyAgICAgICAgICAgIENBTExPQ19TVFJVQ1QoaTkxNV9mcmFnbWVudF9wcm9ncmFtKTsKKyAgICAgICAgIGlmIChwcm9nKSB7CisgICAgICAgICAgICBpOTE1X2luaXRfcHJvZ3JhbShJOTE1X0NPTlRFWFQoY3R4KSwgcHJvZyk7CiAKLQkgcmV0dXJuIF9tZXNhX2luaXRfZnJhZ21lbnRfcHJvZ3JhbSggY3R4LCAmcHJvZy0+RnJhZ1Byb2csCi0JCQkJCSAgICAgdGFyZ2V0LCBpZCApOworICAgICAgICAgICAgcmV0dXJuIF9tZXNhX2luaXRfZnJhZ21lbnRfcHJvZ3JhbShjdHgsICZwcm9nLT5GcmFnUHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBpZCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgIH0KLSAgICAgIGVsc2UKLQkgcmV0dXJuIE5VTEw7Ci0gICB9CiAKICAgIGRlZmF1bHQ6CiAgICAgICAvKiBKdXN0IGZhbGxiYWNrOgogICAgICAgICovCi0gICAgICByZXR1cm4gX21lc2FfbmV3X3Byb2dyYW0oIGN0eCwgdGFyZ2V0LCBpZCApOworICAgICAgcmV0dXJuIF9tZXNhX25ld19wcm9ncmFtKGN0eCwgdGFyZ2V0LCBpZCk7CiAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVEZWxldGVQcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nICkKK3N0YXRpYyB2b2lkCitpOTE1RGVsZXRlUHJvZ3JhbShHTGNvbnRleHQgKiBjdHgsIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQogewogICAgaWYgKHByb2ctPlRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQikgewotICAgICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwotICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9IChzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICopcHJvZzsKLSAgICAgIAotICAgICAgaWYgKGk5MTUtPmN1cnJlbnRfcHJvZ3JhbSA9PSBwKSAKLQkgaTkxNS0+Y3VycmVudF9wcm9ncmFtID0gMDsKKyAgICAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgICAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgPSAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqKSBwcm9nOworCisgICAgICBpZiAoaTkxNS0+Y3VycmVudF9wcm9ncmFtID09IHApCisgICAgICAgICBpOTE1LT5jdXJyZW50X3Byb2dyYW0gPSAwOwogICAgfQogCi0gICBfbWVzYV9kZWxldGVfcHJvZ3JhbSggY3R4LCBwcm9nICk7CisgICBfbWVzYV9kZWxldGVfcHJvZ3JhbShjdHgsIHByb2cpOwogfQogCiAKLXN0YXRpYyBHTGJvb2xlYW4gaTkxNUlzUHJvZ3JhbU5hdGl2ZSggR0xjb250ZXh0ICpjdHgsCi0JCQkJICAgICBHTGVudW0gdGFyZ2V0LCAKLQkJCQkgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nICkKK3N0YXRpYyBHTGJvb2xlYW4KK2k5MTVJc1Byb2dyYW1OYXRpdmUoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKIHsKICAgIGlmICh0YXJnZXQgPT0gR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIpIHsKLSAgICAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgPSAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqKXByb2c7CisgICAgICBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwID0gKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKikgcHJvZzsKIAogICAgICAgaWYgKCFwLT50cmFuc2xhdGVkKQotCSB0cmFuc2xhdGVfcHJvZ3JhbSggcCApOwotICAgICAgCisgICAgICAgICB0cmFuc2xhdGVfcHJvZ3JhbShwKTsKKwogICAgICAgcmV0dXJuICFwLT5lcnJvcjsKICAgIH0KICAgIGVsc2UKICAgICAgIHJldHVybiBHTF9UUlVFOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1UHJvZ3JhbVN0cmluZ05vdGlmeSggR0xjb250ZXh0ICpjdHgsCi0JCQkJICAgIEdMZW51bSB0YXJnZXQsCi0JCQkJICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nICkKK3N0YXRpYyB2b2lkCitpOTE1UHJvZ3JhbVN0cmluZ05vdGlmeShHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKIHsKICAgIGlmICh0YXJnZXQgPT0gR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIpIHsKLSAgICAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgPSAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqKXByb2c7CisgICAgICBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwID0gKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKikgcHJvZzsKICAgICAgIHAtPnRyYW5zbGF0ZWQgPSAwOwogCiAgICAgICAvKiBIYWNrOiBtYWtlIHN1cmUgZm9nIGlzIGNvcnJlY3RseSBlbmFibGVkIGFjY29yZGluZyB0byB0aGlzCkBAIC05NDEsMjggKzEwNTQsMjggQEAKIH0KIAogCi12b2lkIGk5MTVWYWxpZGF0ZUZyYWdtZW50UHJvZ3JhbSggaTkxNUNvbnRleHRQdHIgaTkxNSApCit2b2lkCitpOTE1VmFsaWRhdGVGcmFnbWVudFByb2dyYW0oc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmk5MTUtPmludGVsLmN0eDsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmdG5sLT52YjsKIAotICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9IAotICAgICAgKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKyAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgPQorICAgICAgKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKikgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQ7CiAKICAgIGNvbnN0IEdMdWludCBpbnB1dHNSZWFkID0gcC0+RnJhZ1Byb2cuQmFzZS5JbnB1dHNSZWFkOwogICAgR0x1aW50IHM0ID0gaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdICYgflM0X1ZGTVRfTUFTSzsKICAgIEdMdWludCBzMiA9IFMyX1RFWENPT1JEX05PTkU7CiAgICBpbnQgaSwgb2Zmc2V0ID0gMDsKIAotICAgaWYgKGk5MTUtPmN1cnJlbnRfcHJvZ3JhbSAhPSBwKSAKLSAgIHsKKyAgIGlmIChpOTE1LT5jdXJyZW50X3Byb2dyYW0gIT0gcCkgewogICAgICAgaWYgKGk5MTUtPmN1cnJlbnRfcHJvZ3JhbSkgewotCSBpOTE1LT5jdXJyZW50X3Byb2dyYW0tPm9uX2hhcmR3YXJlID0gMDsKLQkgaTkxNS0+Y3VycmVudF9wcm9ncmFtLT5wYXJhbXNfdXB0b2RhdGUgPSAwOworICAgICAgICAgaTkxNS0+Y3VycmVudF9wcm9ncmFtLT5vbl9oYXJkd2FyZSA9IDA7CisgICAgICAgICBpOTE1LT5jdXJyZW50X3Byb2dyYW0tPnBhcmFtc191cHRvZGF0ZSA9IDA7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaTkxNS0+Y3VycmVudF9wcm9ncmFtID0gcDsKICAgIH0KIApAQCAtOTcxLDggKzEwODQsOCBAQAogICAgICovCiAgICBWQi0+QXR0cmliUHRyW1ZFUlRfQVRUUklCX1BPU10gPSBWQi0+TmRjUHRyOwogCi0gICBpZiAoIXAtPnRyYW5zbGF0ZWQpIAotICAgICAgdHJhbnNsYXRlX3Byb2dyYW0oIHAgKTsKKyAgIGlmICghcC0+dHJhbnNsYXRlZCkKKyAgICAgIHRyYW5zbGF0ZV9wcm9ncmFtKHApOwogCiAgICBpbnRlbC0+dmVydGV4X2F0dHJfY291bnQgPSAwOwogICAgaW50ZWwtPndwb3Nfb2Zmc2V0ID0gMDsKQEAgLTk4MSwzMSArMTA5NCwzMSBAQAogICAgaW50ZWwtPnNwZWNvZmZzZXQgPSAwOwogCiAgICBpZiAoaW5wdXRzUmVhZCAmIEZSQUdfQklUU19URVhfQU5ZKSB7Ci0gICAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF80Rl9WSUVXUE9SVCwgUzRfVkZNVF9YWVpXLCAxNiApOworICAgICAgRU1JVF9BVFRSKF9UTkxfQVRUUklCX1BPUywgRU1JVF80Rl9WSUVXUE9SVCwgUzRfVkZNVF9YWVpXLCAxNik7CiAgICB9CiAgICBlbHNlIHsKLSAgICAgIEVNSVRfQVRUUiggX1ROTF9BVFRSSUJfUE9TLCBFTUlUXzNGX1ZJRVdQT1JULCBTNF9WRk1UX1hZWiwgMTIgKTsKKyAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9QT1MsIEVNSVRfM0ZfVklFV1BPUlQsIFM0X1ZGTVRfWFlaLCAxMik7CiAgICB9CiAKICAgIGlmIChpbnB1dHNSZWFkICYgRlJBR19CSVRfQ09MMCkgewogICAgICAgaW50ZWwtPmNvbG9yb2Zmc2V0ID0gb2Zmc2V0IC8gNDsKLSAgICAgIEVNSVRfQVRUUiggX1ROTF9BVFRSSUJfQ09MT1IwLCBFTUlUXzRVQl80Rl9CR1JBLCBTNF9WRk1UX0NPTE9SLCA0ICk7CisgICAgICBFTUlUX0FUVFIoX1ROTF9BVFRSSUJfQ09MT1IwLCBFTUlUXzRVQl80Rl9CR1JBLCBTNF9WRk1UX0NPTE9SLCA0KTsKICAgIH0KLSAgIAotICAgaWYgKChpbnB1dHNSZWFkICYgKEZSQUdfQklUX0NPTDF8RlJBR19CSVRfRk9HQykpIHx8IAorCisgICBpZiAoKGlucHV0c1JlYWQgJiAoRlJBR19CSVRfQ09MMSB8IEZSQUdfQklUX0ZPR0MpKSB8fAogICAgICAgIGk5MTUtPnZlcnRleF9mb2cgIT0gSTkxNV9GT0dfTk9ORSkgewogCiAgICAgICBpZiAoaW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDEpIHsKLQkgaW50ZWwtPnNwZWNvZmZzZXQgPSBvZmZzZXQgLyA0OwotCSBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0NPTE9SMSwgRU1JVF8zVUJfM0ZfQkdSLCBTNF9WRk1UX1NQRUNfRk9HLCAzICk7CisgICAgICAgICBpbnRlbC0+c3BlY29mZnNldCA9IG9mZnNldCAvIDQ7CisgICAgICAgICBFTUlUX0FUVFIoX1ROTF9BVFRSSUJfQ09MT1IxLCBFTUlUXzNVQl8zRl9CR1IsIFM0X1ZGTVRfU1BFQ19GT0csIDMpOwogICAgICAgfQogICAgICAgZWxzZQotCSBFTUlUX1BBRCgzKTsKKyAgICAgICAgIEVNSVRfUEFEKDMpOwogCi0gICAgICBpZiAoKGlucHV0c1JlYWQgJiBGUkFHX0JJVF9GT0dDKSB8fCBpOTE1LT52ZXJ0ZXhfZm9nICE9IEk5MTVfRk9HX05PTkUpIAotCSBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0ZPRywgRU1JVF8xVUJfMUYsIFM0X1ZGTVRfU1BFQ19GT0csIDEgKTsKKyAgICAgIGlmICgoaW5wdXRzUmVhZCAmIEZSQUdfQklUX0ZPR0MpIHx8IGk5MTUtPnZlcnRleF9mb2cgIT0gSTkxNV9GT0dfTk9ORSkKKyAgICAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9GT0csIEVNSVRfMVVCXzFGLCBTNF9WRk1UX1NQRUNfRk9HLCAxKTsKICAgICAgIGVsc2UKLQkgRU1JVF9QQUQoIDEgKTsKKyAgICAgICAgIEVNSVRfUEFEKDEpOwogICAgfQogCiAgICAvKiBYWFggdGhpcyB3YXMgZGlzYWJsZWQsIGJ1dCBlbmFibGluZyB0aGlzIGNvZGUgaGVscGVkIGZpeCB0aGUgR2xlYW4KQEAgLTEwMTMsNjMgKzExMjYsNjYgQEAKICAgICAqLwogI2lmIDEKICAgIGlmICgoaW5wdXRzUmVhZCAmIEZSQUdfQklUX0ZPR0MpIHx8IGk5MTUtPnZlcnRleF9mb2cgIT0gSTkxNV9GT0dfTk9ORSkgewotICAgICAgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9GT0csIEVNSVRfMUYsIFM0X1ZGTVRfRk9HX1BBUkFNLCA0ICk7CisgICAgICBFTUlUX0FUVFIoX1ROTF9BVFRSSUJfRk9HLCBFTUlUXzFGLCBTNF9WRk1UX0ZPR19QQVJBTSwgNCk7CiAgICB9CiAjZW5kaWYKIAogICAgZm9yIChpID0gMDsgaSA8IHAtPmN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHM7IGkrKykgewogICAgICAgaWYgKGlucHV0c1JlYWQgJiBGUkFHX0JJVF9URVgoaSkpIHsKLQkgaW50IHN6ID0gVkItPlRleENvb3JkUHRyW2ldLT5zaXplOwotCSAgICAKLQkgczIgJj0gflMyX1RFWENPT1JEX0ZNVChpLCBTMl9URVhDT09SRF9GTVQwX01BU0spOwotCSBzMiB8PSBTMl9URVhDT09SRF9GTVQoaSwgU1pfVE9fSFcoc3opKTsKKyAgICAgICAgIGludCBzeiA9IFZCLT5UZXhDb29yZFB0cltpXS0+c2l6ZTsKIAotCSBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1RFWDAraSwgRU1JVF9TWihzeiksIDAsIHN6ICogNCApOworICAgICAgICAgczIgJj0gflMyX1RFWENPT1JEX0ZNVChpLCBTMl9URVhDT09SRF9GTVQwX01BU0spOworICAgICAgICAgczIgfD0gUzJfVEVYQ09PUkRfRk1UKGksIFNaX1RPX0hXKHN6KSk7CisKKyAgICAgICAgIEVNSVRfQVRUUihfVE5MX0FUVFJJQl9URVgwICsgaSwgRU1JVF9TWihzeiksIDAsIHN6ICogNCk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChpID09IHAtPndwb3NfdGV4KSB7Ci0JCi0JIC8qIElmIFdQT1MgaXMgcmVxdWlyZWQsIGR1cGxpY2F0ZSB0aGUgWFlaIHBvc2l0aW9uIGRhdGEgaW4gYW4KLQkgICogdW51c2VkIHRleHR1cmUgY29vcmRpbmF0ZToKLQkgICovCi0JIHMyICY9IH5TMl9URVhDT09SRF9GTVQoaSwgUzJfVEVYQ09PUkRfRk1UMF9NQVNLKTsKLQkgczIgfD0gUzJfVEVYQ09PUkRfRk1UKGksIFNaX1RPX0hXKDMpKTsKIAotCSBpbnRlbC0+d3Bvc19vZmZzZXQgPSBvZmZzZXQ7Ci0JIGludGVsLT53cG9zX3NpemUgPSAzICogc2l6ZW9mKEdMdWludCk7CisgICAgICAgICAvKiBJZiBXUE9TIGlzIHJlcXVpcmVkLCBkdXBsaWNhdGUgdGhlIFhZWiBwb3NpdGlvbiBkYXRhIGluIGFuCisgICAgICAgICAgKiB1bnVzZWQgdGV4dHVyZSBjb29yZGluYXRlOgorICAgICAgICAgICovCisgICAgICAgICBzMiAmPSB+UzJfVEVYQ09PUkRfRk1UKGksIFMyX1RFWENPT1JEX0ZNVDBfTUFTSyk7CisgICAgICAgICBzMiB8PSBTMl9URVhDT09SRF9GTVQoaSwgU1pfVE9fSFcoMykpOwogCi0JIEVNSVRfUEFEKCBpbnRlbC0+d3Bvc19zaXplICk7Ci0gICAgICB9ICAgCisgICAgICAgICBpbnRlbC0+d3Bvc19vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICBpbnRlbC0+d3Bvc19zaXplID0gMyAqIHNpemVvZihHTHVpbnQpOworCisgICAgICAgICBFTUlUX1BBRChpbnRlbC0+d3Bvc19zaXplKTsKKyAgICAgIH0KICAgIH0KIAogICAgaWYgKHMyICE9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVMyXSB8fAogICAgICAgIHM0ICE9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSkgewotICAgIAotICAgICAgSTkxNV9TVEFURUNIQU5HRSggaTkxNSwgSTkxNV9VUExPQURfQ1RYICk7CisgICAgICBpbnQgazsKKworICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9DVFgpOwogCiAgICAgICAvKiBNdXN0IGRvIHRoaXMgKmFmdGVyKiBzdGF0ZWNoYW5nZSwgc28gYXMgbm90IHRvIGFmZmVjdAogICAgICAgICogYnVmZmVyZWQgdmVydGljZXMgcmVsaWFudCBvbiB0aGUgb2xkIHN0YXRlOgogICAgICAgICovCi0gICAgICBpbnRlbC0+dmVydGV4X3NpemUgPSBfdG5sX2luc3RhbGxfYXR0cnMoICZpbnRlbC0+Y3R4LCAKLQkJCQkJICAgICAgIGludGVsLT52ZXJ0ZXhfYXR0cnMsIAotCQkJCQkgICAgICAgaW50ZWwtPnZlcnRleF9hdHRyX2NvdW50LAotCQkJCQkgICAgICAgaW50ZWwtPlZpZXdwb3J0TWF0cml4Lm0sIDAgKTsgCisgICAgICBpbnRlbC0+dmVydGV4X3NpemUgPSBfdG5sX2luc3RhbGxfYXR0cnMoJmludGVsLT5jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPnZlcnRleF9hdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+dmVydGV4X2F0dHJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPlZpZXdwb3J0TWF0cml4Lm0sIDApOwogCiAgICAgICBpbnRlbC0+dmVydGV4X3NpemUgPj49IDI7CiAKICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVMyXSA9IHMyOwogICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdID0gczQ7CiAKLSAgICAgIGFzc2VydChpbnRlbC0+dnRibC5jaGVja192ZXJ0ZXhfc2l6ZSggaW50ZWwsIGludGVsLT52ZXJ0ZXhfc2l6ZSApKTsKKyAgICAgIGsgPSBpbnRlbC0+dnRibC5jaGVja192ZXJ0ZXhfc2l6ZShpbnRlbCwgaW50ZWwtPnZlcnRleF9zaXplKTsKKyAgICAgIGFzc2VydChrKTsKICAgIH0KIAotICAgaWYgKCFwLT5wYXJhbXNfdXB0b2RhdGUpIAotICAgICAgdHJhY2tfcGFyYW1zKCBwICk7CisgICBpZiAoIXAtPnBhcmFtc191cHRvZGF0ZSkKKyAgICAgIHRyYWNrX3BhcmFtcyhwKTsKIAotICAgaWYgKCFwLT5vbl9oYXJkd2FyZSkgCi0gICAgICBpOTE1X3VwbG9hZF9wcm9ncmFtKCBpOTE1LCBwICk7CisgICBpZiAoIXAtPm9uX2hhcmR3YXJlKQorICAgICAgaTkxNV91cGxvYWRfcHJvZ3JhbShpOTE1LCBwKTsKIH0KIAotdm9pZCBpOTE1SW5pdEZyYWdQcm9nRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKK3ZvaWQKK2k5MTVJbml0RnJhZ1Byb2dGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKIHsKICAgIGZ1bmN0aW9ucy0+QmluZFByb2dyYW0gPSBpOTE1QmluZFByb2dyYW07CiAgICBmdW5jdGlvbnMtPk5ld1Byb2dyYW0gPSBpOTE1TmV3UHJvZ3JhbTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9tZXRhb3BzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfbWV0YW9wcy5jCmluZGV4IDFiZTdhYzQuLjczYWE2MzQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9tZXRhb3BzLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X21ldGFvcHMuYwpAQCAtMzQsMTI4ICszNCwxNjkgQEAKICNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0jaW5jbHVkZSAiaW50ZWxfcm90YXRlLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgogCiAjaW5jbHVkZSAiaTkxNV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiaTkxNV9yZWcuaCIKIAotLyogQSBsYXJnZSBhbW91bnQgb2Ygc3RhdGUgZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkLgorLyogV2UgdG91Y2ggYWxtb3N0IGV2ZXJ5dGhpbmc6CiAgKi8KLSNkZWZpbmUgQUNUSVZFIChJOTE1X1VQTE9BRF9JTlZBUklFTlQgfCAgICAgICAgIFwKLQkJSTkxNV9VUExPQURfUFJPR1JBTSB8IAkJXAotCQlJOTE1X1VQTE9BRF9TVElQUExFIHwJCVwKKyNkZWZpbmUgQUNUSVZFIChJOTE1X1VQTE9BRF9JTlZBUklFTlQgfCAJXAogCQlJOTE1X1VQTE9BRF9DVFggfAkJXAogCQlJOTE1X1VQTE9BRF9CVUZGRVJTIHwJCVwKLQkJSTkxNV9VUExPQURfVEVYKDApKQkJCisJCUk5MTVfVVBMT0FEX1NUSVBQTEUgfAkJXAorICAgICAgICAgICAgICAgIEk5MTVfVVBMT0FEX1BST0dSQU0gfCAJCVwKKyAgICAgICAgICAgICAgICBJOTE1X1VQTE9BRF9GT0cgfCAJCVwKKwkJSTkxNV9VUExPQURfVEVYKDApKQogCi0jZGVmaW5lIFNFVF9TVEFURSggaTkxNSwgU1RBVEUgKQkJCVwKKyNkZWZpbmUgU0VUX1NUQVRFKCBpOTE1LCBTVEFURSApCQlcCiBkbyB7CQkJCQkJXAogICAgaTkxNS0+Y3VycmVudC0+ZW1pdHRlZCAmPSB+QUNUSVZFOwkJXAotICAgaTkxNS0+Y3VycmVudCA9ICZpOTE1LT5TVEFURTsJCQlcCisgICBpOTE1LT5jdXJyZW50ID0gJmk5MTUtPlNUQVRFOwkJXAogICAgaTkxNS0+Y3VycmVudC0+ZW1pdHRlZCAmPSB+QUNUSVZFOwkJXAogfSB3aGlsZSAoMCkKIAotLyogT3BlcmF0aW9ucyB3aGVyZSB0aGUgM0QgZW5naW5lIGlzIGRlY291cGxlZCB0ZW1wb3JhcmlseSBmcm9tIHRoZQotICogY3VycmVudCBHTCBzdGF0ZSBhbmQgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgdGhhbiBzaW1wbHkgcmVuZGVyaW5nCi0gKiBpbmNvbWluZyB0cmlhbmdsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9pbml0aWFsX3N0YXRlKCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKLXsKLSAgIG1lbWNweSgmaTkxNS0+bWV0YSwgJmk5MTUtPmluaXRpYWwsIHNpemVvZihpOTE1LT5tZXRhKSApOwotICAgaTkxNS0+bWV0YS5hY3RpdmUgPSBBQ1RJVkU7Ci0gICBpOTE1LT5tZXRhLmVtaXR0ZWQgPSAwOwotfQogCi0KLXN0YXRpYyB2b2lkIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKK3N0YXRpYyB2b2lkCittZXRhX25vX3N0ZW5jaWxfd3JpdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogeworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisKICAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9TVEVOQ0lMX1RFU1QsIEdMX0ZBTFNFICkKICAgICAqLwotICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gJj0gfihTNV9TVEVOQ0lMX1RFU1RfRU5BQkxFIHwgCi0JCQkJICAgICAgIFM1X1NURU5DSUxfV1JJVEVfRU5BQkxFKTsKLQotICAgLyogY3R4LT5Ecml2ZXIuRW5hYmxlKCBjdHgsIEdMX0RFUFRIX1RFU1QsIEdMX0ZBTFNFICkKLSAgICAqLwotICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gJj0gfihTNl9ERVBUSF9URVNUX0VOQUJMRSB8Ci0JCQkJICAgICAgIFM2X0RFUFRIX1dSSVRFX0VOQUJMRSk7CisgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSAmPSB+KFM1X1NURU5DSUxfVEVTVF9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1dSSVRFX0VOQUJMRSk7CiAKICAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfQ1RYOwogfQogCitzdGF0aWMgdm9pZAorbWV0YV9ub19kZXB0aF93cml0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKworICAgLyogY3R4LT5Ecml2ZXIuRW5hYmxlKCBjdHgsIEdMX0RFUFRIX1RFU1QsIEdMX0ZBTFNFICkKKyAgICAqLworICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gJj0gfihTNl9ERVBUSF9URVNUX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM2X0RFUFRIX1dSSVRFX0VOQUJMRSk7CisKKyAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfQ1RYOworfQorCitzdGF0aWMgdm9pZAorbWV0YV9kZXB0aF9yZXBsYWNlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOworCisgICAvKiBjdHgtPkRyaXZlci5FbmFibGUoIGN0eCwgR0xfREVQVEhfVEVTVCwgR0xfVFJVRSApCisgICAgKiBjdHgtPkRyaXZlci5EZXB0aE1hc2soIGN0eCwgR0xfVFJVRSApCisgICAgKi8KKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdIHw9IChTNl9ERVBUSF9URVNUX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzZfREVQVEhfV1JJVEVfRU5BQkxFKTsKKworICAgLyogY3R4LT5Ecml2ZXIuRGVwdGhGdW5jKCBjdHgsIEdMX0FMV0FZUyApCisgICAgKi8KKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdICY9IH5TNl9ERVBUSF9URVNUX0ZVTkNfTUFTSzsKKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdIHw9CisgICAgICBDT01QQVJFRlVOQ19BTFdBWVMgPDwgUzZfREVQVEhfVEVTVF9GVU5DX1NISUZUOworCisgICBpOTE1LT5tZXRhLmVtaXR0ZWQgJj0gfkk5MTVfVVBMT0FEX0NUWDsKK30KKworCiAvKiBTZXQgc3RlbmNpbCB1bml0IHRvIHJlcGxhY2UgYWx3YXlzIHdpdGggdGhlIHJlZmVyZW5jZSB2YWx1ZS4KICAqLwotc3RhdGljIHZvaWQgc2V0X3N0ZW5jaWxfcmVwbGFjZSggaTkxNUNvbnRleHRQdHIgaTkxNSwKLQkJCQkgR0x1aW50IHNfbWFzaywKLQkJCQkgR0x1aW50IHNfY2xlYXIpCitzdGF0aWMgdm9pZAorbWV0YV9zdGVuY2lsX3JlcGxhY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHNfbWFzaywgR0x1aW50IHNfY2xlYXIpCiB7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKICAgIEdMdWludCBvcCA9IFNURU5DSUxPUF9SRVBMQUNFOwogICAgR0x1aW50IGZ1bmMgPSBDT01QQVJFRlVOQ19BTFdBWVM7CiAKICAgIC8qIGN0eC0+RHJpdmVyLkVuYWJsZSggY3R4LCBHTF9TVEVOQ0lMX1RFU1QsIEdMX1RSVUUgKQogICAgICovCi0gICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSB8PSAoUzVfU1RFTkNJTF9URVNUX0VOQUJMRSB8IAotCQkJCSAgICAgIFM1X1NURU5DSUxfV1JJVEVfRU5BQkxFKTsKLQotCi0gICAvKiBjdHgtPkRyaXZlci5FbmFibGUoIGN0eCwgR0xfREVQVEhfVEVTVCwgR0xfRkFMU0UgKQotICAgICovCi0gICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmPSB+KFM2X0RFUFRIX1RFU1RfRU5BQkxFIHwKLQkJCQkgICAgICAgUzZfREVQVEhfV1JJVEVfRU5BQkxFKTsKLQorICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gKFM1X1NURU5DSUxfVEVTVF9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM1X1NURU5DSUxfV1JJVEVfRU5BQkxFKTsKIAogICAgLyogY3R4LT5Ecml2ZXIuU3RlbmNpbE1hc2soIGN0eCwgc19tYXNrICkKICAgICAqLwogICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XSAmPSB+TU9ERTRfRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSzsKIAogICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XSB8PSAoRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSyB8Ci0JCQkJCVNURU5DSUxfV1JJVEVfTUFTSyhzX21hc2spKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9XUklURV9NQVNLKHNfbWFzaykpOwogCiAgICAvKiBjdHgtPkRyaXZlci5TdGVuY2lsT3AoIGN0eCwgR0xfUkVQTEFDRSwgR0xfUkVQTEFDRSwgR0xfUkVQTEFDRSApCiAgICAgKi8KICAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH4oUzVfU1RFTkNJTF9GQUlMX01BU0sgfAotCQkJCSAgICAgICBTNV9TVEVOQ0lMX1BBU1NfWl9GQUlMX01BU0sgfAotCQkJCSAgICAgICBTNV9TVEVOQ0lMX1BBU1NfWl9QQVNTX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1BBU1NfWl9GQUlMX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1BBU1NfWl9QQVNTX01BU0spOwogCiAgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSB8PSAoKG9wIDw8IFM1X1NURU5DSUxfRkFJTF9TSElGVCkgfAotCQkJCSAgICAgIChvcCA8PCBTNV9TVEVOQ0lMX1BBU1NfWl9GQUlMX1NISUZUKSB8Ci0JCQkJICAgICAgKG9wIDw8IFM1X1NURU5DSUxfUEFTU19aX1BBU1NfU0hJRlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3AgPDwgUzVfU1RFTkNJTF9QQVNTX1pfRkFJTF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcCA8PCBTNV9TVEVOQ0lMX1BBU1NfWl9QQVNTX1NISUZUKSk7CiAKIAogICAgLyogY3R4LT5Ecml2ZXIuU3RlbmNpbEZ1bmMoIGN0eCwgR0xfQUxXQVlTLCBzX3JlZiwgfjAgKQogICAgICovCiAgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19TVEFURTRdICY9IH5NT0RFNF9FTkFCTEVfU1RFTkNJTF9URVNUX01BU0s7CiAgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19TVEFURTRdIHw9IChFTkFCTEVfU1RFTkNJTF9URVNUX01BU0sgfAotCQkJCQlTVEVOQ0lMX1RFU1RfTUFTSygweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1RFU1RfTUFTSygweGZmKSk7CiAKICAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH4oUzVfU1RFTkNJTF9SRUZfTUFTSyB8Ci0JCQkJICAgICAgIFM1X1NURU5DSUxfVEVTVF9GVU5DX01BU0spOwotCQkJCQkKLSAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdIHw9ICgoc19jbGVhciA8PCBTNV9TVEVOQ0lMX1JFRl9TSElGVCkgfCAgCi0JCQkJICAgICAgKGZ1bmMgPDwgUzVfU1RFTkNJTF9URVNUX0ZVTkNfU0hJRlQpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM1X1NURU5DSUxfVEVTVF9GVU5DX01BU0spOworCisgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSB8PSAoKHNfY2xlYXIgPDwgUzVfU1RFTkNJTF9SRUZfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuYyA8PCBTNV9TVEVOQ0lMX1RFU1RfRlVOQ19TSElGVCkpOwogCiAKICAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfQ1RYOwogfQogCiAKLXN0YXRpYyB2b2lkIHNldF9jb2xvcl9tYXNrKCBpOTE1Q29udGV4dFB0ciBpOTE1LCBHTGJvb2xlYW4gc3RhdGUgKQorc3RhdGljIHZvaWQKK21ldGFfY29sb3JfbWFzayhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMYm9vbGVhbiBzdGF0ZSkKIHsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOwogICAgY29uc3QgR0x1aW50IG1hc2sgPSAoUzVfV1JJVEVESVNBQkxFX1JFRCB8Ci0JCQlTNV9XUklURURJU0FCTEVfR1JFRU4gfAotCQkJUzVfV1JJVEVESVNBQkxFX0JMVUUgfAotCQkJUzVfV1JJVEVESVNBQkxFX0FMUEhBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFM1X1dSSVRFRElTQUJMRV9HUkVFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICBTNV9XUklURURJU0FCTEVfQkxVRSB8IFM1X1dSSVRFRElTQUJMRV9BTFBIQSk7CiAKICAgIC8qIENvcHkgY29sb3JtYXNrIHN0YXRlIGZyb20gInJlZ3VsYXIiIGh3IGNvbnRleHQuCiAgICAgKi8KICAgIGlmIChzdGF0ZSkgewogICAgICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gJj0gfm1hc2s7Ci0gICAgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSB8PSAKLQkgKGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM1XSAmIG1hc2spOworICAgICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0KKyAgICAgICAgIChpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gJiBtYXNrKTsKICAgIH0KLSAgIGVsc2UgCisgICBlbHNlCiAgICAgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM1XSB8PSBtYXNrOwotICAgICAgCisKKyAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfQ1RYOworfQorCisKKworc3RhdGljIHZvaWQKK21ldGFfaW1wb3J0X3BpeGVsX3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOworICAgbWVtY3B5KGk5MTUtPm1ldGEuRm9nLCBpOTE1LT5zdGF0ZS5Gb2csIEk5MTVfRk9HX1NFVFVQX1NJWkUgKiA0KTsKKworICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gPSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV07CisgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVM2XSA9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XTsKKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX1NUQVRFNF0gPSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XTsKKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0JMRU5EQ09MT1IxXSA9CisgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfQkxFTkRDT0xPUjFdOworICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfSUFCXSA9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19JQUJdOworCisgICBpOTE1LT5tZXRhLkJ1ZmZlcltJOTE1X0RFU1RSRUdfU0VOQUJMRV0gPQorICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXTsKKyAgIGk5MTUtPm1ldGEuQnVmZmVyW0k5MTVfREVTVFJFR19TUjFdID0gaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TUjFdOworICAgaTkxNS0+bWV0YS5CdWZmZXJbSTkxNV9ERVNUUkVHX1NSMl0gPSBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX1NSMl07CisKKyAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfRk9HOworICAgaTkxNS0+bWV0YS5lbWl0dGVkICY9IH5JOTE1X1VQTE9BRF9CVUZGRVJTOwogICAgaTkxNS0+bWV0YS5lbWl0dGVkICY9IH5JOTE1X1VQTE9BRF9DVFg7CiB9CiAKQEAgLTIxMiw2OSArMjUzLDY0IEBACiAKIAogCi1zdGF0aWMgdm9pZCBzZXRfbm9fdGV4dHVyZSggaTkxNUNvbnRleHRQdHIgaTkxNSApCitzdGF0aWMgdm9pZAorbWV0YV9ub190ZXh0dXJlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOworCiAgICBzdGF0aWMgY29uc3QgR0x1aW50IHByb2dbXSA9IHsKICAgICAgIF8zRFNUQVRFX1BJWEVMX1NIQURFUl9QUk9HUkFNLAogCiAgICAgICAvKiBEZWNsYXJlIGluY29taW5nIGRpZmZ1c2UgY29sb3I6CiAgICAgICAgKi8KLSAgICAgIChEMF9EQ0wgfAotICAgICAgIEQwX0RFQ0xfUkVHKCBSRUdfVF9ESUZGVVNFICkgfAotICAgICAgIEQwX0NIQU5ORUxfQUxMKSwKKyAgICAgIChEMF9EQ0wgfCBEMF9ERUNMX1JFRyhSRUdfVF9ESUZGVVNFKSB8IEQwX0NIQU5ORUxfQUxMKSwKICAgICAgIEQxX01CWiwKICAgICAgIEQyX01CWiwKIAogICAgICAgLyogb3V0cHV0LWNvbG9yID0gbW92KHRfZGlmZnVzZSkKICAgICAgICAqLwogICAgICAgKEEwX01PViB8Ci0gICAgICAgQTBfREVTVF9SRUcoIFJFR19PQyApIHwKLSAgICAgICBBMF9ERVNUX0NIQU5ORUxfQUxMIHwKLSAgICAgICBBMF9TUkMwX1JFRyggUkVHX1RfRElGRlVTRSApKSwKKyAgICAgICBBMF9ERVNUX1JFRyhSRUdfT0MpIHwKKyAgICAgICBBMF9ERVNUX0NIQU5ORUxfQUxMIHwgQTBfU1JDMF9SRUcoUkVHX1RfRElGRlVTRSkpLAogICAgICAgKEExX1NSQzBfWFlaVyksCiAgICAgICAwLAogICAgfTsKIAotICAgCi0gICBtZW1jcHkoIGk5MTUtPm1ldGEuUHJvZ3JhbSwgcHJvZywgc2l6ZW9mKHByb2cpICk7CisKKyAgIG1lbWNweShpOTE1LT5tZXRhLlByb2dyYW0sIHByb2csIHNpemVvZihwcm9nKSk7CiAgICBpOTE1LT5tZXRhLlByb2dyYW1TaXplID0gc2l6ZW9mKHByb2cpIC8gc2l6ZW9mKCpwcm9nKTsKICAgIGk5MTUtPm1ldGEuUHJvZ3JhbVswXSB8PSBpOTE1LT5tZXRhLlByb2dyYW1TaXplIC0gMjsKICAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfUFJPR1JBTTsKIH0KIAotCi1zdGF0aWMgdm9pZCBlbmFibGVfdGV4dHVyZV9ibGVuZF9yZXBsYWNlKCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKK3N0YXRpYyB2b2lkCittZXRhX3RleHR1cmVfYmxlbmRfcmVwbGFjZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCiB7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKwogICAgc3RhdGljIGNvbnN0IEdMdWludCBwcm9nW10gPSB7CiAgICAgICBfM0RTVEFURV9QSVhFTF9TSEFERVJfUFJPR1JBTSwKIAogICAgICAgLyogRGVjbGFyZSB0aGUgc2FtcGxlcjoKICAgICAgICAqLwotICAgICAgKEQwX0RDTCB8Ci0gICAgICAgRDBfREVDTF9SRUcoIFJFR19TKDApICkgfAotICAgICAgIEQwX1NBTVBMRV9UWVBFXzJEIHwKLSAgICAgICBEMF9DSEFOTkVMX05PTkUpLAorICAgICAgKEQwX0RDTCB8IEQwX0RFQ0xfUkVHKFJFR19TKDApKSB8IEQwX1NBTVBMRV9UWVBFXzJEIHwgRDBfQ0hBTk5FTF9OT05FKSwKICAgICAgIEQxX01CWiwKICAgICAgIEQyX01CWiwKIAogICAgICAgLyogRGVjbGFyZSB0aGUgaW50ZXJwb2xhdGVkIHRleHR1cmUgY29vcmRpbmF0ZToKICAgICAgICAqLwotICAgICAgKEQwX0RDTCB8Ci0gICAgICAgRDBfREVDTF9SRUcoIFJFR19UX1RFWCgwKSApIHwKLSAgICAgICBEMF9DSEFOTkVMX0FMTCksCisgICAgICAoRDBfRENMIHwgRDBfREVDTF9SRUcoUkVHX1RfVEVYKDApKSB8IEQwX0NIQU5ORUxfQUxMKSwKICAgICAgIEQxX01CWiwKICAgICAgIEQyX01CWiwKIAogICAgICAgLyogb3V0cHV0LWNvbG9yID0gdGV4bGQoc2FtcGxlMCwgdGV4Y29vcmQwKSAKICAgICAgICAqLwotICAgICAgKFQwX1RFWExEIHwgCi0gICAgICAgVDBfREVTVF9SRUcoIFJFR19PQyApIHwKLSAgICAgICBUMF9TQU1QTEVSKCAwICkpLAorICAgICAgKFQwX1RFWExEIHwgVDBfREVTVF9SRUcoUkVHX09DKSB8IFQwX1NBTVBMRVIoMCkpLAogICAgICAgVDFfQUREUkVTU19SRUcoUkVHX1RZUEVfVCwgMCksCiAgICAgICBUMl9NQloKICAgIH07CiAKLSAgIG1lbWNweSggaTkxNS0+bWV0YS5Qcm9ncmFtLCBwcm9nLCBzaXplb2YocHJvZykgKTsKKyAgIG1lbWNweShpOTE1LT5tZXRhLlByb2dyYW0sIHByb2csIHNpemVvZihwcm9nKSk7CiAgICBpOTE1LT5tZXRhLlByb2dyYW1TaXplID0gc2l6ZW9mKHByb2cpIC8gc2l6ZW9mKCpwcm9nKTsKICAgIGk5MTUtPm1ldGEuUHJvZ3JhbVswXSB8PSBpOTE1LT5tZXRhLlByb2dyYW1TaXplIC0gMjsKICAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfUFJPR1JBTTsKQEAgLTI4Nyw0MjUgKzMyMywxODYgQEAKIC8qIFNldCB1cCBhbiBhcmJpdGFyeSBwaWVjZSBvZiBtZW1vcnkgYXMgYSByZWN0YW5ndWxhciB0ZXh0dXJlCiAgKiAoaW5jbHVkaW5nIHRoZSBmcm9udCBvciBiYWNrIGJ1ZmZlcikuCiAgKi8KLXN0YXRpYyB2b2lkIHNldF90ZXhfcmVjdF9zb3VyY2UoIGk5MTVDb250ZXh0UHRyIGk5MTUsCi0JCQkJIEdMdWludCBvZmZzZXQsCi0JCQkJIEdMdWludCB3aWR0aCwgCi0JCQkJIEdMdWludCBoZWlnaHQsCi0JCQkJIEdMdWludCBwaXRjaCwgLyogaW4gYnl0ZXMhICovCi0JCQkJIEdMdWludCB0ZXh0dXJlRm9ybWF0ICkKK3N0YXRpYyBHTGJvb2xlYW4KK21ldGFfdGV4X3JlY3Rfc291cmNlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgIGRyaV9ibyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIEdMdWludCBwaXRjaCwgR0x1aW50IGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCiB7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKICAgIEdMdWludCB1bml0ID0gMDsKICAgIEdMaW50IG51bUxldmVscyA9IDE7CiAgICBHTHVpbnQgKnN0YXRlID0gaTkxNS0+bWV0YS5UZXhbMF07CisgICBHTHVpbnQgdGV4dHVyZUZvcm1hdDsKKyAgIEdMdWludCBjcHA7CiAKLSNpZiAwCi0gICBwcmludGYoIlRleFJlY3Qgc291cmNlIG9mZnNldCAweCV4ICBwaXRjaCAlZFxuIiwgb2Zmc2V0LCBwaXRjaCk7Ci0jZW5kaWYKKyAgIC8qIEEgZnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHdvdWxkIGRvIHRoZSB1cGxvYWQgdGhyb3VnaAorICAgICogZ2xUZXhJbWFnZTJkLCBhbmQgZ2V0IGFsbCB0aGUgY29udmVyc2lvbiBvcGVyYXRpb25zIGF0IHRoYXQKKyAgICAqIHBvaW50LiAgV2UgYXJlIHJlc3RyaWN0ZWQsIGJ1dCBzdGlsbCBhdCBsZWFzdCBoYXZlIGFjY2VzcyB0byB0aGUKKyAgICAqIGZyYWdtZW50IHByb2dyYW0gc3dpenpsZS4KKyAgICAqLworICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgIGNhc2UgR0xfQkdSQToKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY6CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9BUkdCODg4OCk7CisgICAgICAgICBjcHAgPSA0OworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1JHQkE6CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOgorICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgdGV4dHVyZUZvcm1hdCA9IChNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfQUJHUjg4ODgpOworICAgICAgICAgY3BwID0gNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9CR1I6CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWOgorICAgICAgICAgdGV4dHVyZUZvcm1hdCA9IChNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1KTsKKyAgICAgICAgIGNwcCA9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfUkdCOgorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OgorICAgICAgICAgdGV4dHVyZUZvcm1hdCA9IChNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1KTsKKyAgICAgICAgIGNwcCA9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKIAotLyogICAgZnByaW50ZihzdGRlcnIsICIlczogb2Zmc2V0OiAleCB3OiAlZCBoOiAlZCBwaXRjaCAlZCBmb3JtYXQgJXhcbiIsICovCi0vKiAJICAgX19GVU5DVElPTl9fLCBvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIHBpdGNoLCB0ZXh0dXJlRm9ybWF0ICk7ICovCisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQogCi0gICBzdGF0ZVtJOTE1X1RFWFJFR19NUzJdID0gb2Zmc2V0OworCisgICBpZiAoKHBpdGNoICogY3BwKSAmIDMpIHsKKyAgICAgIF9tZXNhX3ByaW50ZigiJXM6IHRleHR1cmUgaXMgbm90IGR3b3JkIHBpdGNoXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisvKiAgICBpbnRlbF9yZWdpb25fcmVsZWFzZSgmaTkxNS0+bWV0YS50ZXhfcmVnaW9uWzBdKTsgKi8KKy8qICAgIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoJmk5MTUtPm1ldGEudGV4X3JlZ2lvblswXSwgcmVnaW9uKTsgKi8KKyAgIGk5MTUtPm1ldGEudGV4X2J1ZmZlclswXSA9IGJ1ZmZlcjsKKyAgIGk5MTUtPm1ldGEudGV4X29mZnNldFswXSA9IG9mZnNldDsKKwogICAgc3RhdGVbSTkxNV9URVhSRUdfTVMzXSA9ICgoKGhlaWdodCAtIDEpIDw8IE1TM19IRUlHSFRfU0hJRlQpIHwKLQkJCSAgICAoKHdpZHRoIC0gMSkgPDwgTVMzX1dJRFRIX1NISUZUKSB8Ci0JCQkgICAgdGV4dHVyZUZvcm1hdCB8Ci0JCQkgICAgTVMzX1VTRV9GRU5DRV9SRUdTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwaXRjaCAtIDEpIDw8IE1TM19XSURUSF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlRm9ybWF0IHwgTVMzX1VTRV9GRU5DRV9SRUdTKTsKIAotICAgc3RhdGVbSTkxNV9URVhSRUdfTVM0XSA9ICgoKChwaXRjaCAvIDQpIC0gMSkgPDwgTVM0X1BJVENIX1NISUZUKSB8IAotCQkJICAgICgoKChudW1MZXZlbHMtMSkgKiA0KSkgPDwgTVM0X01BWF9MT0RfU0hJRlQpKTsKKyAgIHN0YXRlW0k5MTVfVEVYUkVHX01TNF0gPSAoKCgoKHBpdGNoICogY3BwKSAvIDQpIC0gMSkgPDwgTVM0X1BJVENIX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TNF9DVUJFX0ZBQ0VfRU5BX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgobnVtTGV2ZWxzIC0gMSkgKiA0KSkgPDwgTVM0X01BWF9MT0RfU0hJRlQpKTsKIAogICAgc3RhdGVbSTkxNV9URVhSRUdfU1MyXSA9ICgoRklMVEVSX05FQVJFU1QgPDwgU1MyX01JTl9GSUxURVJfU0hJRlQpIHwKLQkJCSAgICAoTUlQRklMVEVSX05PTkUgPDwgU1MyX01JUF9GSUxURVJfU0hJRlQpIHwKLQkJCSAgICAoRklMVEVSX05FQVJFU1QgPDwgU1MyX01BR19GSUxURVJfU0hJRlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1JUEZJTFRFUl9OT05FIDw8IFNTMl9NSVBfRklMVEVSX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSUxURVJfTkVBUkVTVCA8PCBTUzJfTUFHX0ZJTFRFUl9TSElGVCkpOworCiAgICBzdGF0ZVtJOTE1X1RFWFJFR19TUzNdID0gKChURVhDT09SRE1PREVfV1JBUCA8PCBTUzNfVENYX0FERFJfTU9ERV9TSElGVCkgfAotCQkJICAgIChURVhDT09SRE1PREVfV1JBUCA8PCBTUzNfVENZX0FERFJfTU9ERV9TSElGVCkgfAotCQkJICAgIChURVhDT09SRE1PREVfV1JBUCA8PCBTUzNfVENaX0FERFJfTU9ERV9TSElGVCkgfAotCQkJICAgICh1bml0PDxTUzNfVEVYVFVSRU1BUF9JTkRFWF9TSElGVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEVYQ09PUkRNT0RFX1dSQVAgPDwgU1MzX1RDWV9BRERSX01PREVfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRFWENPT1JETU9ERV9XUkFQIDw8IFNTM19UQ1pfQUREUl9NT0RFX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0IDw8IFNTM19URVhUVVJFTUFQX0lOREVYX1NISUZUKSk7CiAKICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTNF0gPSAwOwogCiAgICBpOTE1LT5tZXRhLmVtaXR0ZWQgJj0gfkk5MTVfVVBMT0FEX1RFWCgwKTsKKyAgIHJldHVybiBHTF9UUlVFOwogfQogCiAKLS8qIFNlbGVjdCBiZXR3ZWVuIGZyb250IGFuZCBiYWNrIGRyYXcgYnVmZmVycy4KKy8qKgorICogU2V0IHRoZSBjb2xvciBhbmQgZGVwdGggZHJhd2luZyByZWdpb24gZm9yIG1ldGEgb3BzLgogICovCi1zdGF0aWMgdm9pZCBzZXRfZHJhd19yZWdpb24oIGk5MTVDb250ZXh0UHRyIGk5MTUsIGNvbnN0IGludGVsUmVnaW9uICpyZWdpb24gKQorc3RhdGljIHZvaWQKK21ldGFfZHJhd19yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpjb2xvcl9yZWdpb24sCisgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlcHRoX3JlZ2lvbikKIHsKLSNpZiAwCi0gICBwcmludGYoIlJvdGF0ZSBpbnRvIHJlZ2lvbjogb2Zmc2V0IDB4JXggIHBpdGNoICVkXG4iLAotICAgICAgICAgIHJlZ2lvbi0+b2Zmc2V0LCByZWdpb24tPnBpdGNoKTsKLSNlbmRpZgotICAgaTkxNS0+bWV0YS5CdWZmZXJbSTkxNV9ERVNUUkVHX0NCVUZBRERSMV0gPQotICAgICAgKEJVRl8zRF9JRF9DT0xPUl9CQUNLIHwgQlVGXzNEX1BJVENIKHJlZ2lvbi0+cGl0Y2gpIHwgQlVGXzNEX1VTRV9GRU5DRSk7Ci0gICBpOTE1LT5tZXRhLkJ1ZmZlcltJOTE1X0RFU1RSRUdfQ0JVRkFERFIyXSA9IHJlZ2lvbi0+b2Zmc2V0OwotICAgaTkxNS0+bWV0YS5lbWl0dGVkICY9IH5JOTE1X1VQTE9BRF9CVUZGRVJTOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBpOTE1X3N0YXRlX2RyYXdfcmVnaW9uKGludGVsLCAmaTkxNS0+bWV0YSwgY29sb3JfcmVnaW9uLCBkZXB0aF9yZWdpb24pOwogfQogCiAKLSNpZiAwCi0vKiBTZXR1cCBhbiBhcmJpdGFyeSBkcmF3IGZvcm1hdCwgdXNlZnVsIGZvciB0YXJnZXRpbmcgdGV4dHVyZSBvciBhZ3AKLSAqIG1lbW9yeS4KLSAqLwotc3RhdGljIHZvaWQgc2V0X2RyYXdfZm9ybWF0KCBpOTE1Q29udGV4dFB0ciBpOTE1LAotCQkJICAgICBHTHVpbnQgZm9ybWF0LAotCQkJICAgICBHTHVpbnQgZGVwdGhfZm9ybWF0KQorc3RhdGljIHZvaWQKK3NldF92ZXJ0ZXhfZm9ybWF0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKLSAgIGk5MTUtPm1ldGEuQnVmZmVyW0k5MTVfREVTVFJFR19EVjFdID0gKERTVE9SR19IT1JUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCURTVE9SR19WRVJUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCWZvcm1hdCB8Ci0JCQkJCUxPRF9QUkVDTEFNUF9PR0wgfAotCQkJCQlURVhfREVGQVVMVF9DT0xPUl9PR0wgfAotCQkJCQlkZXB0aF9mb3JtYXQpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CiAKLSAgIGk5MTUtPm1ldGEuZW1pdHRlZCAmPSB+STkxNV9VUExPQURfQlVGRkVSUzsKLS8qICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IERWMTogJXhcbiIsICAqLwotLyogCSAgIF9fRlVOQ1RJT05fXywgaTkxNS0+bWV0YS5CdWZmZXJbSTkxNV9ERVNUUkVHX0RWMV0pOyAqLwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHNldF92ZXJ0ZXhfZm9ybWF0KCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKLXsKLSAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzJdID0gCisgICBpOTE1LT5tZXRhLkN0eFtJOTE1X0NUWFJFR19MSVMyXSA9CiAgICAgICAoUzJfVEVYQ09PUkRfRk1UKDAsIFRFWENPT1JERk1UXzJEKSB8Ci0gICAgICAgUzJfVEVYQ09PUkRfRk1UKDEsIFRFWENPT1JERk1UX05PVF9QUkVTRU5UKSB8IAorICAgICAgIFMyX1RFWENPT1JEX0ZNVCgxLCBURVhDT09SREZNVF9OT1RfUFJFU0VOVCkgfAogICAgICAgIFMyX1RFWENPT1JEX0ZNVCgyLCBURVhDT09SREZNVF9OT1RfUFJFU0VOVCkgfAogICAgICAgIFMyX1RFWENPT1JEX0ZNVCgzLCBURVhDT09SREZNVF9OT1RfUFJFU0VOVCkgfAogICAgICAgIFMyX1RFWENPT1JEX0ZNVCg0LCBURVhDT09SREZNVF9OT1RfUFJFU0VOVCkgfAotICAgICAgIFMyX1RFWENPT1JEX0ZNVCg1LCBURVhDT09SREZNVF9OT1RfUFJFU0VOVCkgfCAKKyAgICAgICBTMl9URVhDT09SRF9GTVQoNSwgVEVYQ09PUkRGTVRfTk9UX1BSRVNFTlQpIHwKICAgICAgICBTMl9URVhDT09SRF9GTVQoNiwgVEVYQ09PUkRGTVRfTk9UX1BSRVNFTlQpIHwKICAgICAgICBTMl9URVhDT09SRF9GTVQoNywgVEVYQ09PUkRGTVRfTk9UX1BSRVNFTlQpKTsKIAogICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gJj0gflM0X1ZGTVRfTUFTSzsKIAotICAgaTkxNS0+bWV0YS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gfD0gCi0gICAgICAoUzRfVkZNVF9DT0xPUiB8Ci0gICAgICAgUzRfVkZNVF9TUEVDX0ZPRyB8Ci0gICAgICAgUzRfVkZNVF9YWVpXKTsKKyAgIGk5MTUtPm1ldGEuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdIHw9IChTNF9WRk1UX0NPTE9SIHwgUzRfVkZNVF9YWVopOwogCiAgICBpOTE1LT5tZXRhLmVtaXR0ZWQgJj0gfkk5MTVfVVBMT0FEX0NUWDsKLQogfQogCiAKLXN0YXRpYyB2b2lkIGRyYXdfcXVhZChpOTE1Q29udGV4dFB0ciBpOTE1LCAKLQkJICAgICAgR0xmbG9hdCB4MCwgR0xmbG9hdCB4MSwKLQkJICAgICAgR0xmbG9hdCB5MCwgR0xmbG9hdCB5MSwgCi0JCSAgICAgIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLAotCQkgICAgICBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEsCi0JCSAgICAgIEdMZmxvYXQgczAsIEdMZmxvYXQgczEsCi0JCSAgICAgIEdMZmxvYXQgdDAsIEdMZmxvYXQgdDEgKQotewotICAgR0x1aW50IHZlcnRleF9zaXplID0gODsKLSAgIEdMdWludCAqdmIgPSBpbnRlbEVtaXRJbmxpbmVQcmltaXRpdmVMb2NrZWQoICZpOTE1LT5pbnRlbCwgCi0JCQkJCQlQUklNM0RfVFJJRkFOLCAKLQkJCQkJCTQgKiB2ZXJ0ZXhfc2l6ZSwKLQkJCQkJCXZlcnRleF9zaXplICk7Ci0gICBpbnRlbFZlcnRleCB0bXA7Ci0gICBpbnQgaTsKIAotICAgaWYgKDApCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlZiwlZi0lZiwlZiAweCV4JXgleCV4ICVmLCVmLSVmLCVmXG4iLAotCSAgICAgIF9fRlVOQ1RJT05fXywKLQkgICAgICB4MCx5MCx4MSx5MSxyZWQsZ3JlZW4sYmx1ZSxhbHBoYSxzMCx0MCxzMSx0MSk7Ci0KLQotICAgLyogaW5pdGlhbCB2ZXJ0ZXgsIGxlZnQgYm90dG9tICovCi0gICB0bXAudi54ID0geDA7Ci0gICB0bXAudi55ID0geTA7Ci0gICB0bXAudi56ID0gMS4wOwotICAgdG1wLnYudyA9IDEuMDsgCi0gICB0bXAudi5jb2xvci5yZWQgPSByZWQ7Ci0gICB0bXAudi5jb2xvci5ncmVlbiA9IGdyZWVuOwotICAgdG1wLnYuY29sb3IuYmx1ZSA9IGJsdWU7Ci0gICB0bXAudi5jb2xvci5hbHBoYSA9IGFscGhhOwotICAgdG1wLnYuc3BlY3VsYXIucmVkID0gMDsKLSAgIHRtcC52LnNwZWN1bGFyLmdyZWVuID0gMDsKLSAgIHRtcC52LnNwZWN1bGFyLmJsdWUgPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuYWxwaGEgPSAwOwotICAgdG1wLnYudTAgPSBzMDsKLSAgIHRtcC52LnYwID0gdDA7Ci0KLSAgIGZvciAoaSA9IDAgOyBpIDwgdmVydGV4X3NpemUgOyBpKyspCi0gICAgICB2YltpXSA9IHRtcC51aVtpXTsKLQotICAgLyogcmlnaHQgYm90dG9tICovCi0gICB2YiArPSB2ZXJ0ZXhfc2l6ZTsKLSAgIHRtcC52LnggPSB4MTsKLSAgIHRtcC52LnUwID0gczE7Ci0gICBmb3IgKGkgPSAwIDsgaSA8IHZlcnRleF9zaXplIDsgaSsrKQotICAgICAgdmJbaV0gPSB0bXAudWlbaV07Ci0KLSAgIC8qIHJpZ2h0IHRvcCAqLwotICAgdmIgKz0gdmVydGV4X3NpemU7Ci0gICB0bXAudi55ID0geTE7Ci0gICB0bXAudi52MCA9IHQxOwotICAgZm9yIChpID0gMCA7IGkgPCB2ZXJ0ZXhfc2l6ZSA7IGkrKykKLSAgICAgIHZiW2ldID0gdG1wLnVpW2ldOwotCi0gICAvKiBsZWZ0IHRvcCAqLwotICAgdmIgKz0gdmVydGV4X3NpemU7Ci0gICB0bXAudi54ID0geDA7Ci0gICB0bXAudi51MCA9IHMwOwotICAgZm9yIChpID0gMCA7IGkgPCB2ZXJ0ZXhfc2l6ZSA7IGkrKykKLSAgICAgIHZiW2ldID0gdG1wLnVpW2ldOwotfQotCi0KLXN0YXRpYyB2b2lkIGRyYXdfcG9seShpOTE1Q29udGV4dFB0ciBpOTE1LCAKLQkJICAgICAgR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbnVtVmVydHMsCi0gICAgICAgICAgICAgICAgICAgICAgLypjb25zdCovIEdMZmxvYXQgdmVydHNbXVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAvKmNvbnN0Ki8gR0xmbG9hdCB0ZXhjb29yZHNbXVsyXSkKLXsKLSAgIEdMdWludCB2ZXJ0ZXhfc2l6ZSA9IDg7Ci0gICBHTHVpbnQgKnZiID0gaW50ZWxFbWl0SW5saW5lUHJpbWl0aXZlTG9ja2VkKCAmaTkxNS0+aW50ZWwsIAotCQkJCQkJUFJJTTNEX1RSSUZBTiwgCi0JCQkJCQludW1WZXJ0cyAqIHZlcnRleF9zaXplLAotCQkJCQkJdmVydGV4X3NpemUgKTsKLSAgIGludGVsVmVydGV4IHRtcDsKLSAgIGludCBpLCBrOwotCi0gICAvKiBpbml0aWFsIGNvbnN0YW50IHZlcnRleCBmaWVsZHMgKi8KLSAgIHRtcC52LnogPSAxLjA7Ci0gICB0bXAudi53ID0gMS4wOyAKLSAgIHRtcC52LmNvbG9yLnJlZCA9IHJlZDsKLSAgIHRtcC52LmNvbG9yLmdyZWVuID0gZ3JlZW47Ci0gICB0bXAudi5jb2xvci5ibHVlID0gYmx1ZTsKLSAgIHRtcC52LmNvbG9yLmFscGhhID0gYWxwaGE7Ci0gICB0bXAudi5zcGVjdWxhci5yZWQgPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuZ3JlZW4gPSAwOwotICAgdG1wLnYuc3BlY3VsYXIuYmx1ZSA9IDA7Ci0gICB0bXAudi5zcGVjdWxhci5hbHBoYSA9IDA7Ci0KLSAgIGZvciAoayA9IDA7IGsgPCBudW1WZXJ0czsgaysrKSB7Ci0gICAgICB0bXAudi54ID0gdmVydHNba11bMF07Ci0gICAgICB0bXAudi55ID0gdmVydHNba11bMV07Ci0gICAgICB0bXAudi51MCA9IHRleGNvb3Jkc1trXVswXTsKLSAgICAgIHRtcC52LnYwID0gdGV4Y29vcmRzW2tdWzFdOwotCi0gICAgICBmb3IgKGkgPSAwIDsgaSA8IHZlcnRleF9zaXplIDsgaSsrKQotICAgICAgICAgdmJbaV0gPSB0bXAudWlbaV07Ci0KLSAgICAgIHZiICs9IHZlcnRleF9zaXplOwotICAgfQotfQotCi0KLXZvaWQgCi1pOTE1Q2xlYXJXaXRoVHJpcyhpbnRlbENvbnRleHRQdHIgaW50ZWwsIEdMYml0ZmllbGQgYnVmZmVycywKLQkJICBHTGJvb2xlYW4gYWxsRm9vLAotCQkgIEdMaW50IGN4Rm9vLCBHTGludCBjeUZvbywgR0xpbnQgY3dGb28sIEdMaW50IGNoRm9vKQotewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVCggaW50ZWwgKTsKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKLSAgIGludGVsU2NyZWVuUHJpdmF0ZSAqc2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOwotICAgaW50IHgwLCB5MCwgeDEsIHkxOwotICAgR0xpbnQgY3gsIGN5LCBjdywgY2g7Ci0gICBHTGJvb2xlYW4gYWxsOwotCi0gICBTRVRfU1RBVEUoIGk5MTUsIG1ldGEgKTsgCi0gICBzZXRfaW5pdGlhbF9zdGF0ZSggaTkxNSApOyAKLSAgIHNldF9ub190ZXh0dXJlKCBpOTE1ICk7IAotICAgc2V0X3ZlcnRleF9mb3JtYXQoIGk5MTUgKTsgCi0KLSAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCi0gICAvKiBnZXQgY2xlYXIgYm91bmRzIGFmdGVyIGxvY2tpbmcgKi8KLSAgIGN4ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1pbjsKLSAgIGN5ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWW1pbjsKLSAgIGN3ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1heCAtIGN4OwotICAgY2ggPSBpbnRlbC0+Y3R4LkRyYXdCdWZmZXItPl9ZbWF4IC0gY3k7Ci0gICBhbGwgPSAoY3cgPT0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5XaWR0aCAmJgotICAgICAgICAgIGNoID09IGludGVsLT5jdHguRHJhd0J1ZmZlci0+SGVpZ2h0KTsKLQotICAgaWYgKCFhbGwpIHsKLSAgICAgIHgwID0gY3g7Ci0gICAgICB5MCA9IGN5OwotICAgICAgeDEgPSB4MCArIGN3OwotICAgICAgeTEgPSB5MCArIGNoOwotICAgfSBlbHNlIHsKLSAgICAgIHgwID0gMDsKLSAgICAgIHkwID0gMDsKLSAgICAgIHgxID0geDAgKyBkUHJpdi0+dzsKLSAgICAgIHkxID0geTAgKyBkUHJpdi0+aDsKLSAgIH0KLQotICAgLyogRG9uJ3QgZG8gYW55IGNsaXBwaW5nIHRvIHNjcmVlbiAtIHRoZXNlIGFyZSB3aW5kb3cgY29vcmRpbmF0ZXMuCi0gICAgKiBUaGUgYWN0aXZlIGNsaXByZWN0cyB3aWxsIGJlIGFwcGxpZWQgYXMgZm9yIGFueSBvdGhlciBnZW9tZXRyeS4KLSAgICAqLwotCi0gICBpZiAoYnVmZmVycyAmIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkgeyAKLSAgICAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpOTE1ICk7Ci0gICAgICBzZXRfY29sb3JfbWFzayggaTkxNSwgR0xfVFJVRSApOwotICAgICAgc2V0X2RyYXdfcmVnaW9uKCBpOTE1LCAmc2NyZWVuLT5mcm9udCApOwotCi0gICAgICBkcmF3X3F1YWQoaTkxNSwgeDAsIHgxLCB5MCwgeTEsCi0JCWludGVsLT5jbGVhcl9yZWQsIGludGVsLT5jbGVhcl9ncmVlbiwgCi0gCQlpbnRlbC0+Y2xlYXJfYmx1ZSwgaW50ZWwtPmNsZWFyX2FscGhhLCAKLQkJMCwgMCwgMCwgMCk7Ci0gICB9Ci0KLSAgIGlmIChidWZmZXJzICYgQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKLSAgICAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpOTE1ICk7Ci0gICAgICBzZXRfY29sb3JfbWFzayggaTkxNSwgR0xfVFJVRSApOwotICAgICAgc2V0X2RyYXdfcmVnaW9uKCBpOTE1LCAmc2NyZWVuLT5iYWNrICk7Ci0KLSAgICAgIGRyYXdfcXVhZChpOTE1LCB4MCwgeDEsIHkwLCB5MSwKLQkJaW50ZWwtPmNsZWFyX3JlZCwgaW50ZWwtPmNsZWFyX2dyZWVuLAotCQlpbnRlbC0+Y2xlYXJfYmx1ZSwgaW50ZWwtPmNsZWFyX2FscGhhLAotCQkwLCAwLCAwLCAwKTsKLSAgIH0KLQotICAgaWYgKGJ1ZmZlcnMgJiBCVUZGRVJfQklUX1NURU5DSUwpIHsKLSAgICAgIHNldF9zdGVuY2lsX3JlcGxhY2UoIGk5MTUsIAotCQkJICAgaW50ZWwtPmN0eC5TdGVuY2lsLldyaXRlTWFza1swXSwgCi0JCQkgICBpbnRlbC0+Y3R4LlN0ZW5jaWwuQ2xlYXIpOwotICAgICAgCi0gICAgICBzZXRfY29sb3JfbWFzayggaTkxNSwgR0xfRkFMU0UgKTsKLSAgICAgIHNldF9kcmF3X3JlZ2lvbiggaTkxNSwgJnNjcmVlbi0+ZnJvbnQgKTsgLyogY291bGQgYmUgZWl0aGVyPyAqLwotCi0gICAgICBkcmF3X3F1YWQoIGk5MTUsIHgwLCB4MSwgeTAsIHkxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICk7Ci0gICB9Ci0KLSAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Ci0KLSAgIFNFVF9TVEFURSggaTkxNSwgc3RhdGUgKTsKLX0KLQotCi0vKioKLSAqIENvcHkgdGhlIHdpbmRvdyBjb250ZW50cyBuYW1lZCBieSBkUHJpdiB0byB0aGUgcm90YXRlZCAob3IgcmVmbGVjdGVkKQotICogY29sb3IgYnVmZmVyLgotICogc3JjQnVmIGlzIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCBvciBCVUZGRVJfQklUX0JBQ0tfTEVGVCB0byBpbmRpY2F0ZSB0aGUgc291cmNlLgorLyogT3BlcmF0aW9ucyB3aGVyZSB0aGUgM0QgZW5naW5lIGlzIGRlY291cGxlZCB0ZW1wb3JhcmlseSBmcm9tIHRoZQorICogY3VycmVudCBHTCBzdGF0ZSBhbmQgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgdGhhbiBzaW1wbHkgcmVuZGVyaW5nCisgKiBpbmNvbWluZyB0cmlhbmdsZXMuCiAgKi8KLXZvaWQKLWk5MTVSb3RhdGVXaW5kb3coaW50ZWxDb250ZXh0UHRyIGludGVsLCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0gICAgICAgICAgICAgICAgIEdMdWludCBzcmNCdWYpCitzdGF0aWMgdm9pZAoraW5zdGFsbF9tZXRhX3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoIGludGVsICk7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLSAgIGNvbnN0IEdMdWludCBjcHAgPSBzY3JlZW4tPmNwcDsKLSAgIGRybV9jbGlwX3JlY3RfdCBmdWxsUmVjdDsKLSAgIEdMdWludCB0ZXh0dXJlRm9ybWF0LCBzcmNPZmZzZXQsIHNyY1BpdGNoOwotICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpjbGlwUmVjdHM7Ci0gICBpbnQgbnVtQ2xpcFJlY3RzOwotICAgaW50IGk7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgIG1lbWNweSgmaTkxNS0+bWV0YSwgJmk5MTUtPmluaXRpYWwsIHNpemVvZihpOTE1LT5tZXRhKSk7CisgICBpOTE1LT5tZXRhLmFjdGl2ZSA9IEFDVElWRTsKKyAgIGk5MTUtPm1ldGEuZW1pdHRlZCA9IDA7CiAKLSAgIGludCB4T3JpZywgeU9yaWc7Ci0gICBpbnQgb3JpZ051bUNsaXBSZWN0czsKLSAgIGRybV9jbGlwX3JlY3RfdCAqb3JpZ1JlY3RzOwotCi0gICAvKgotICAgICogc2V0IHVwIGhhcmR3YXJlIHN0YXRlCi0gICAgKi8KLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0KLSAgIFNFVF9TVEFURSggaTkxNSwgbWV0YSApOyAKLSAgIHNldF9pbml0aWFsX3N0YXRlKCBpOTE1ICk7IAotICAgc2V0X25vX3RleHR1cmUoIGk5MTUgKTsgCi0gICBzZXRfdmVydGV4X2Zvcm1hdCggaTkxNSApOyAKLSAgIHNldF9ub19kZXB0aF9zdGVuY2lsX3dyaXRlKCBpOTE1ICk7Ci0gICBzZXRfY29sb3JfbWFzayggaTkxNSwgR0xfVFJVRSApOwotCi0gICBMT0NLX0hBUkRXQVJFKGludGVsKTsKLQotICAgLyogc2F2ZSBjdXJyZW50IGRyYXdpbmcgb3JpZ2luIGFuZCBjbGlwcmVjdHMgKHJlc3RvcmVkIGF0IGVuZCkgKi8KLSAgIHhPcmlnID0gaW50ZWwtPmRyYXdYOwotICAgeU9yaWcgPSBpbnRlbC0+ZHJhd1k7Ci0gICBvcmlnTnVtQ2xpcFJlY3RzID0gaW50ZWwtPm51bUNsaXBSZWN0czsKLSAgIG9yaWdSZWN0cyA9IGludGVsLT5wQ2xpcFJlY3RzOwotCi0gICBpZiAoIWludGVsLT5udW1DbGlwUmVjdHMpCi0gICAgICBnb3RvIGRvbmU7Ci0KLSAgIC8qCi0gICAgKiBzZXQgZHJhd2luZyBvcmlnaW4sIGNsaXByZWN0cyBmb3IgZnVsbC1zY3JlZW4gYWNjZXNzIHRvIHJvdGF0ZWQgc2NyZWVuCi0gICAgKi8KLSAgIGZ1bGxSZWN0LngxID0gMDsKLSAgIGZ1bGxSZWN0LnkxID0gMDsKLSAgIGZ1bGxSZWN0LngyID0gc2NyZWVuLT5yb3RhdGVkV2lkdGg7Ci0gICBmdWxsUmVjdC55MiA9IHNjcmVlbi0+cm90YXRlZEhlaWdodDsKLSAgIGludGVsLT5kcmF3WCA9IDA7Ci0gICBpbnRlbC0+ZHJhd1kgPSAwOwotICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IDE7Ci0gICBpbnRlbC0+cENsaXBSZWN0cyA9ICZmdWxsUmVjdDsKLQotICAgc2V0X2RyYXdfcmVnaW9uKCBpOTE1LCAmc2NyZWVuLT5yb3RhdGVkICk7Ci0KLSAgIGlmIChjcHAgPT0gNCkKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfQVJHQjg4ODg7Ci0gICBlbHNlCi0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX1JHQjU2NTsKLQotICAgaWYgKHNyY0J1ZiA9PSBCVUZGRVJfQklUX0ZST05UX0xFRlQpIHsKLSAgICAgIHNyY1BpdGNoID0gc2NyZWVuLT5mcm9udC5waXRjaDsgICAvKiBpbiBieXRlcyAqLwotICAgICAgc3JjT2Zmc2V0ID0gc2NyZWVuLT5mcm9udC5vZmZzZXQ7IC8qIGJ5dGVzICovCi0gICAgICBjbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgICAgIG51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1DbGlwUmVjdHM7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHNyY1BpdGNoID0gc2NyZWVuLT5iYWNrLnBpdGNoOyAgIC8qIGluIGJ5dGVzICovCi0gICAgICBzcmNPZmZzZXQgPSBzY3JlZW4tPmJhY2sub2Zmc2V0OyAvKiBieXRlcyAqLwotICAgICAgY2xpcFJlY3RzID0gZFByaXYtPnBCYWNrQ2xpcFJlY3RzOwotICAgICAgbnVtQ2xpcFJlY3RzID0gZFByaXYtPm51bUJhY2tDbGlwUmVjdHM7Ci0gICB9Ci0KLSAgIC8qIHNldCB0aGUgd2hvbGUgc2NyZWVuIHVwIGFzIGEgdGV4dHVyZSB0byBhdm9pZCBhbGlnbm1lbnQgaXNzdWVzICovCi0gICBzZXRfdGV4X3JlY3Rfc291cmNlKGk5MTUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLT53aWR0aCwKLQkJICAgICAgIHNjcmVlbi0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZvcm1hdCk7Ci0KLSAgIGVuYWJsZV90ZXh0dXJlX2JsZW5kX3JlcGxhY2UoaTkxNSk7Ci0KLSAgIC8qCi0gICAgKiBsb29wIG92ZXIgdGhlIHNvdXJjZSB3aW5kb3cncyBjbGlwcmVjdHMKLSAgICAqLwotICAgZm9yIChpID0gMDsgaSA8IG51bUNsaXBSZWN0czsgaSsrKSB7Ci0gICAgICBpbnQgc3JjWDAgPSBjbGlwUmVjdHNbaV0ueDE7Ci0gICAgICBpbnQgc3JjWTAgPSBjbGlwUmVjdHNbaV0ueTE7Ci0gICAgICBpbnQgc3JjWDEgPSBjbGlwUmVjdHNbaV0ueDI7Ci0gICAgICBpbnQgc3JjWTEgPSBjbGlwUmVjdHNbaV0ueTI7Ci0gICAgICBHTGZsb2F0IHZlcnRzWzRdWzJdLCB0ZXhbNF1bMl07Ci0gICAgICBpbnQgajsKLQotICAgICAgLyogYnVpbGQgdmVydGljZXMgZm9yIGZvdXIgY29ybmVycyBvZiBjbGlwIHJlY3QgKi8KLSAgICAgIHZlcnRzWzBdWzBdID0gc3JjWDA7ICB2ZXJ0c1swXVsxXSA9IHNyY1kwOwotICAgICAgdmVydHNbMV1bMF0gPSBzcmNYMTsgIHZlcnRzWzFdWzFdID0gc3JjWTA7Ci0gICAgICB2ZXJ0c1syXVswXSA9IHNyY1gxOyAgdmVydHNbMl1bMV0gPSBzcmNZMTsKLSAgICAgIHZlcnRzWzNdWzBdID0gc3JjWDA7ICB2ZXJ0c1szXVsxXSA9IHNyY1kxOwotCi0gICAgICAvKiAuLiBhbmQgdGV4Y29vcmRzICovCi0gICAgICB0ZXhbMF1bMF0gPSBzcmNYMDsgIHRleFswXVsxXSA9IHNyY1kwOwotICAgICAgdGV4WzFdWzBdID0gc3JjWDE7ICB0ZXhbMV1bMV0gPSBzcmNZMDsKLSAgICAgIHRleFsyXVswXSA9IHNyY1gxOyAgdGV4WzJdWzFdID0gc3JjWTE7Ci0gICAgICB0ZXhbM11bMF0gPSBzcmNYMDsgIHRleFszXVsxXSA9IHNyY1kxOwotCi0gICAgICAvKiB0cmFuc2Zvcm0gY29vcmRzIHRvIHJvdGF0ZWQgc2NyZWVuIGNvb3JkcyAqLwotICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotICAgICAgICAgbWF0cml4MjNUcmFuc2Zvcm1Db29yZGYoJnNjcmVlbi0+cm90TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnRzW2pdWzBdLCAmdmVydHNbal1bMV0pOwotICAgICAgfQotCi0gICAgICAvKiBkcmF3IHBvbHlnb24gdG8gbWFwIHNvdXJjZSBpbWFnZSB0byBkZXN0IHJlZ2lvbiAqLwotICAgICAgZHJhd19wb2x5KGk5MTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgNCwgdmVydHMsIHRleCk7Ci0KLSAgIH0gLyogY2xpcHJlY3QgbG9vcCAqLwotCi0gICBpbnRlbEZsdXNoQmF0Y2hMb2NrZWQoIGludGVsLCBHTF9GQUxTRSwgR0xfRkFMU0UsIEdMX0ZBTFNFICk7Ci0KLSBkb25lOgotICAgLyogcmVzdG9yZSBvcmlnaW5hbCBkcmF3aW5nIG9yaWdpbiBhbmQgY2xpcHJlY3RzICovCi0gICBpbnRlbC0+ZHJhd1ggPSB4T3JpZzsKLSAgIGludGVsLT5kcmF3WSA9IHlPcmlnOwotICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IG9yaWdOdW1DbGlwUmVjdHM7Ci0gICBpbnRlbC0+cENsaXBSZWN0cyA9IG9yaWdSZWN0czsKLQotICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKLQotICAgU0VUX1NUQVRFKCBpOTE1LCBzdGF0ZSApOworICAgU0VUX1NUQVRFKGk5MTUsIG1ldGEpOworICAgc2V0X3ZlcnRleF9mb3JtYXQoaW50ZWwpOworICAgbWV0YV9ub190ZXh0dXJlKGludGVsKTsKIH0KIAorc3RhdGljIHZvaWQKK2xlYXZlX21ldGFfc3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBpbnRlbF9yZWdpb25fcmVsZWFzZSgmaTkxNS0+bWV0YS5kcmF3X3JlZ2lvbik7CisgICBpbnRlbF9yZWdpb25fcmVsZWFzZSgmaTkxNS0+bWV0YS5kZXB0aF9yZWdpb24pOworLyogICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJmk5MTUtPm1ldGEudGV4X3JlZ2lvblswXSk7ICovCisgICBTRVRfU1RBVEUoaTkxNSwgc3RhdGUpOworfQorCisKKwordm9pZAoraTkxNUluaXRNZXRhRnVuY3Moc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSkKK3sKKyAgIGk5MTUtPmludGVsLnZ0YmwuaW5zdGFsbF9tZXRhX3N0YXRlID0gaW5zdGFsbF9tZXRhX3N0YXRlOworICAgaTkxNS0+aW50ZWwudnRibC5sZWF2ZV9tZXRhX3N0YXRlID0gbGVhdmVfbWV0YV9zdGF0ZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV9ub19kZXB0aF93cml0ZSA9IG1ldGFfbm9fZGVwdGhfd3JpdGU7CisgICBpOTE1LT5pbnRlbC52dGJsLm1ldGFfbm9fc3RlbmNpbF93cml0ZSA9IG1ldGFfbm9fc3RlbmNpbF93cml0ZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV9zdGVuY2lsX3JlcGxhY2UgPSBtZXRhX3N0ZW5jaWxfcmVwbGFjZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV9kZXB0aF9yZXBsYWNlID0gbWV0YV9kZXB0aF9yZXBsYWNlOworICAgaTkxNS0+aW50ZWwudnRibC5tZXRhX2NvbG9yX21hc2sgPSBtZXRhX2NvbG9yX21hc2s7CisgICBpOTE1LT5pbnRlbC52dGJsLm1ldGFfbm9fdGV4dHVyZSA9IG1ldGFfbm9fdGV4dHVyZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV90ZXh0dXJlX2JsZW5kX3JlcGxhY2UgPSBtZXRhX3RleHR1cmVfYmxlbmRfcmVwbGFjZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV90ZXhfcmVjdF9zb3VyY2UgPSBtZXRhX3RleF9yZWN0X3NvdXJjZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubWV0YV9kcmF3X3JlZ2lvbiA9IG1ldGFfZHJhd19yZWdpb247CisgICBpOTE1LT5pbnRlbC52dGJsLm1ldGFfaW1wb3J0X3BpeGVsX3N0YXRlID0gbWV0YV9pbXBvcnRfcGl4ZWxfc3RhdGU7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfcHJvZ3JhbS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3Byb2dyYW0uYwppbmRleCA2ODQ5MTEyLi5mNzlkMDBkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfcHJvZ3JhbS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9wcm9ncmFtLmMKQEAgLTcyLDU4ICs3Miw2MiBAQAogCiAjZGVmaW5lIEk5MTVfQ09OU1RGTEFHX1BBUkFNIDB4MWYKIAotR0x1aW50IGk5MTVfZ2V0X3RlbXAoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKQorR0x1aW50CitpOTE1X2dldF90ZW1wKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApCiB7Ci0gICBpbnQgYml0ID0gZmZzKCB+cC0+dGVtcF9mbGFnICk7CisgICBpbnQgYml0ID0gZmZzKH5wLT50ZW1wX2ZsYWcpOwogICAgaWYgKCFiaXQpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG91dCBvZiB0ZW1wb3Jhcmllc1xuIiwgX19GSUxFX18pOwogICAgICAgZXhpdCgxKTsKICAgIH0KIAotICAgcC0+dGVtcF9mbGFnIHw9IDE8PChiaXQtMSk7Ci0gICByZXR1cm4gVVJFRyhSRUdfVFlQRV9SLCAoYml0LTEpKTsKKyAgIHAtPnRlbXBfZmxhZyB8PSAxIDw8IChiaXQgLSAxKTsKKyAgIHJldHVybiBVUkVHKFJFR19UWVBFX1IsIChiaXQgLSAxKSk7CiB9CiAKIAotR0x1aW50IGk5MTVfZ2V0X3V0ZW1wKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICkKK0dMdWludAoraTkxNV9nZXRfdXRlbXAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqIHApCiB7Ci0gICBpbnQgYml0ID0gZmZzKCB+cC0+dXRlbXBfZmxhZyApOworICAgaW50IGJpdCA9IGZmcyh+cC0+dXRlbXBfZmxhZyk7CiAgICBpZiAoIWJpdCkgewogICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3V0IG9mIHRlbXBvcmFyaWVzXG4iLCBfX0ZJTEVfXyk7CiAgICAgICBleGl0KDEpOwogICAgfQogCi0gICBwLT51dGVtcF9mbGFnIHw9IDE8PChiaXQtMSk7Ci0gICByZXR1cm4gVVJFRyhSRUdfVFlQRV9VLCAoYml0LTEpKTsKKyAgIHAtPnV0ZW1wX2ZsYWcgfD0gMSA8PCAoYml0IC0gMSk7CisgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9VLCAoYml0IC0gMSkpOwogfQogCi12b2lkIGk5MTVfcmVsZWFzZV91dGVtcHMoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKQordm9pZAoraTkxNV9yZWxlYXNlX3V0ZW1wcyhzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwKQogewogICAgcC0+dXRlbXBfZmxhZyA9IH4weDc7CiB9CiAKIAotR0x1aW50IGk5MTVfZW1pdF9kZWNsKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotCQkgICAgICBHTHVpbnQgdHlwZSwgR0x1aW50IG5yLCBHTHVpbnQgZDBfZmxhZ3MgKQorR0x1aW50CitpOTE1X2VtaXRfZGVjbChzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAorICAgICAgICAgICAgICAgR0x1aW50IHR5cGUsIEdMdWludCBuciwgR0x1aW50IGQwX2ZsYWdzKQogewogICAgR0x1aW50IHJlZyA9IFVSRUcodHlwZSwgbnIpOwogCiAgICBpZiAodHlwZSA9PSBSRUdfVFlQRV9UKSB7Ci0gICAgICBpZiAocC0+ZGVjbF90ICYgKDE8PG5yKSkKLQkgcmV0dXJuIHJlZzsKKyAgICAgIGlmIChwLT5kZWNsX3QgJiAoMSA8PCBucikpCisgICAgICAgICByZXR1cm4gcmVnOwogCi0gICAgICBwLT5kZWNsX3QgfD0gKDE8PG5yKTsKKyAgICAgIHAtPmRlY2xfdCB8PSAoMSA8PCBucik7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlID09IFJFR19UWVBFX1MpIHsKLSAgICAgIGlmIChwLT5kZWNsX3MgJiAoMTw8bnIpKQotCSByZXR1cm4gcmVnOworICAgICAgaWYgKHAtPmRlY2xfcyAmICgxIDw8IG5yKSkKKyAgICAgICAgIHJldHVybiByZWc7CiAKLSAgICAgIHAtPmRlY2xfcyB8PSAoMTw8bnIpOworICAgICAgcC0+ZGVjbF9zIHw9ICgxIDw8IG5yKTsKICAgIH0KLSAgIGVsc2UgCisgICBlbHNlCiAgICAgICByZXR1cm4gcmVnOwogCi0gICAqKHAtPmRlY2wrKykgPSAoRDBfRENMIHwgRDBfREVTVCggcmVnICkgfCBkMF9mbGFncyk7CisgICAqKHAtPmRlY2wrKykgPSAoRDBfRENMIHwgRDBfREVTVChyZWcpIHwgZDBfZmxhZ3MpOwogICAgKihwLT5kZWNsKyspID0gRDFfTUJaOwogICAgKihwLT5kZWNsKyspID0gRDJfTUJaOwogCkBAIC0xMzEsMjQgKzEzNSwyNiBAQAogICAgcmV0dXJuIHJlZzsKIH0KIAotR0x1aW50IGk5MTVfZW1pdF9hcml0aCggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKLQkJICAgICAgIEdMdWludCBvcCwKLQkJICAgICAgIEdMdWludCBkZXN0LAotCQkgICAgICAgR0x1aW50IG1hc2ssCi0JCSAgICAgICBHTHVpbnQgc2F0dXJhdGUsCi0JCSAgICAgICBHTHVpbnQgc3JjMCwKLQkJICAgICAgIEdMdWludCBzcmMxLAotCQkgICAgICAgR0x1aW50IHNyYzIgKQorR0x1aW50CitpOTE1X2VtaXRfYXJpdGgoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqIHAsCisgICAgICAgICAgICAgICAgR0x1aW50IG9wLAorICAgICAgICAgICAgICAgIEdMdWludCBkZXN0LAorICAgICAgICAgICAgICAgIEdMdWludCBtYXNrLAorICAgICAgICAgICAgICAgIEdMdWludCBzYXR1cmF0ZSwgR0x1aW50IHNyYzAsIEdMdWludCBzcmMxLCBHTHVpbnQgc3JjMikKIHsKICAgIEdMdWludCBjWzNdOwogICAgR0x1aW50IG5yX2NvbnN0ID0gMDsKIAogICAgYXNzZXJ0KEdFVF9VUkVHX1RZUEUoZGVzdCkgIT0gUkVHX1RZUEVfQ09OU1QpOwotICAgYXNzZXJ0KGRlc3QgPSBVUkVHKEdFVF9VUkVHX1RZUEUoZGVzdCksIEdFVF9VUkVHX05SKGRlc3QpKSk7CisgICBkZXN0ID0gVVJFRyhHRVRfVVJFR19UWVBFKGRlc3QpLCBHRVRfVVJFR19OUihkZXN0KSk7CisgICBhc3NlcnQoZGVzdCk7CiAKLSAgIGlmIChHRVRfVVJFR19UWVBFKHNyYzApID09IFJFR19UWVBFX0NPTlNUKSBjW25yX2NvbnN0KytdID0gMDsKLSAgIGlmIChHRVRfVVJFR19UWVBFKHNyYzEpID09IFJFR19UWVBFX0NPTlNUKSBjW25yX2NvbnN0KytdID0gMTsKLSAgIGlmIChHRVRfVVJFR19UWVBFKHNyYzIpID09IFJFR19UWVBFX0NPTlNUKSBjW25yX2NvbnN0KytdID0gMjsKKyAgIGlmIChHRVRfVVJFR19UWVBFKHNyYzApID09IFJFR19UWVBFX0NPTlNUKQorICAgICAgY1tucl9jb25zdCsrXSA9IDA7CisgICBpZiAoR0VUX1VSRUdfVFlQRShzcmMxKSA9PSBSRUdfVFlQRV9DT05TVCkKKyAgICAgIGNbbnJfY29uc3QrK10gPSAxOworICAgaWYgKEdFVF9VUkVHX1RZUEUoc3JjMikgPT0gUkVHX1RZUEVfQ09OU1QpCisgICAgICBjW25yX2NvbnN0KytdID0gMjsKIAogICAgLyogUmVjdXJzaXZlbHkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIE1PViBhZGRpdGlvbmFsIGNvbnN0IHZhbHVlcwogICAgICogaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXJzLiAgVXNlIHV0ZW1wIHJlZ2lzdGVycyBmb3IgdGhpcyAtCkBAIC0xNjQsNTcgKzE3MCw2NyBAQAogICAgICAgb2xkX3V0ZW1wX2ZsYWcgPSBwLT51dGVtcF9mbGFnOwogCiAgICAgICBmaXJzdCA9IEdFVF9VUkVHX05SKHNbY1swXV0pOwotICAgICAgZm9yIChpID0gMSA7IGkgPCBucl9jb25zdCA7IGkrKykgewotCSBpZiAoR0VUX1VSRUdfTlIoc1tjW2ldXSkgIT0gZmlyc3QpIHsKLQkgICAgR0x1aW50IHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKHApOworICAgICAgZm9yIChpID0gMTsgaSA8IG5yX2NvbnN0OyBpKyspIHsKKyAgICAgICAgIGlmIChHRVRfVVJFR19OUihzW2NbaV1dKSAhPSBmaXJzdCkgeworICAgICAgICAgICAgR0x1aW50IHRtcCA9IGk5MTVfZ2V0X3V0ZW1wKHApOwogCi0JICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTU9WLCB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgICAgc1tjW2ldXSwgMCwgMCApOwotCSAgICBzW2NbaV1dID0gdG1wOwotCSB9CisgICAgICAgICAgICBpOTE1X2VtaXRfYXJpdGgocCwgQTBfTU9WLCB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tjW2ldXSwgMCwgMCk7CisgICAgICAgICAgICBzW2NbaV1dID0gdG1wOworICAgICAgICAgfQogICAgICAgfQogCiAgICAgICBzcmMwID0gc1swXTsKICAgICAgIHNyYzEgPSBzWzFdOwogICAgICAgc3JjMiA9IHNbMl07Ci0gICAgICBwLT51dGVtcF9mbGFnID0gb2xkX3V0ZW1wX2ZsYWc7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHAtPnV0ZW1wX2ZsYWcgPSBvbGRfdXRlbXBfZmxhZzsgICAvKiByZXN0b3JlICovCiAgICB9CiAKLSAgICoocC0+Y3NyKyspID0gKG9wIHwgCi0JCSAgQTBfREVTVCggZGVzdCApIHwKLQkJICBtYXNrIHwgCi0JCSAgc2F0dXJhdGUgfAotCQkgIEEwX1NSQzAoIHNyYzAgKSk7Ci0gICAqKHAtPmNzcisrKSA9IChBMV9TUkMwKCBzcmMwICkgfAotCQkgIEExX1NSQzEoIHNyYzEgKSk7Ci0gICAqKHAtPmNzcisrKSA9IChBMl9TUkMxKCBzcmMxICkgfAotCQkgIEEyX1NSQzIoIHNyYzIgKSk7CisgICAqKHAtPmNzcisrKSA9IChvcCB8IEEwX0RFU1QoZGVzdCkgfCBtYXNrIHwgc2F0dXJhdGUgfCBBMF9TUkMwKHNyYzApKTsKKyAgICoocC0+Y3NyKyspID0gKEExX1NSQzAoc3JjMCkgfCBBMV9TUkMxKHNyYzEpKTsKKyAgICoocC0+Y3NyKyspID0gKEEyX1NSQzEoc3JjMSkgfCBBMl9TUkMyKHNyYzIpKTsKIAogICAgcC0+bnJfYWx1X2luc24rKzsKICAgIHJldHVybiBkZXN0OwogfQogCitzdGF0aWMgR0x1aW50IGdldF9mcmVlX3JyZWcgKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGl2ZV9yZWdzKQoreworICAgIGludCBiaXQgPSBmZnMofmxpdmVfcmVncyk7CisgICAgaWYgKCFiaXQpIHsKKyAgICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJDYW4ndCBmaW5kIGZyZWUgUiByZWciKTsKKyAgICAgICAgcmV0dXJuIFVSRUdfQkFEOworICAgIH0KKyAgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9SLCBiaXQgLSAxKTsKK30KKwogR0x1aW50IGk5MTVfZW1pdF90ZXhsZCggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKKwkJCUdMdWludCBsaXZlX3JlZ3MsICAgICAgICAgICAgICAgCiAJCQlHTHVpbnQgZGVzdCwKIAkJCUdMdWludCBkZXN0bWFzaywKIAkJCUdMdWludCBzYW1wbGVyLAogCQkJR0x1aW50IGNvb3JkLAogCQkJR0x1aW50IG9wICkKIHsKLSAgIGlmIChjb29yZCAhPSBVUkVHKEdFVF9VUkVHX1RZUEUoY29vcmQpLCBHRVRfVVJFR19OUihjb29yZCkpKSB7Ci0gICAgICAvKiBObyByZWFsIHdheSB0byB3b3JrIGFyb3VuZCB0aGlzIGluIHRoZSBnZW5lcmFsIGNhc2UgLSBuZWVkIHRvCi0gICAgICAgKiBhbGxvY2F0ZSBhbmQgZGVjbGFyZSBhIG5ldyB0ZW1wb3JhcnkgcmVnaXN0ZXIgKGEgdXRlbXAgd29uJ3QKLSAgICAgICAqIGRvKS4gIFdpbGwgZmFsbGJhY2sgZm9yIG5vdy4KLSAgICAgICAqLwotICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJDYW4ndCAoeWV0KSBzd2l6emxlIFRFWCBhcmd1bWVudHMiKTsKLSAgICAgIHJldHVybiAwOwotICAgfQorICAgIGlmIChjb29yZCAhPSBVUkVHKEdFVF9VUkVHX1RZUEUoY29vcmQpLCBHRVRfVVJFR19OUihjb29yZCkpKSB7CisgICAgICAgIC8qIFdpdGggdGhlIGhlbHAgb2YgdGhlICJuZWVkZWQgcmVnaXN0ZXJzIiB0YWJsZSBjcmVhdGVkIGVhcmxpZXIsIHBpY2sKKyAgICAgICAgICogYSByZWdpc3RlciB3ZSBjYW4gTU9WIHRoZSBzd2l6emxlZCBUQyB0byAoc2luY2UgVEVYIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAgKiBzd2l6emxlZCBzb3VyY2VzKSAqLworICAgICAgICBHTHVpbnQgc3dpekNvb3JkID0gZ2V0X2ZyZWVfcnJlZyhwLCBsaXZlX3JlZ3MpOworICAgICAgICBpZiAoc3dpekNvb3JkID09IFVSRUdfQkFEKSAKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAvKiBEb24ndCB3b3JyeSBhYm91dCBzYXR1cmF0ZSBhcyB3ZSBvbmx5IHN1cHBvcnQgIAorICAgICAgICBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01PViwgc3dpekNvb3JkLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLCBjb29yZCwgMCwgMCApOworICAgICAgICBjb29yZCA9IHN3aXpDb29yZDsKKyAgICB9CisKKyAgIC8qIERvbid0IHdvcnJ5IGFib3V0IHNhdHVyYXRlIGFzIHdlIG9ubHkgc3VwcG9ydCB0ZXh0dXJlIGZvcm1hdHMKKyAgICAqIHRoYXQgYXJlIGFsd2F5cyBpbiB0aGUgMC4uMSByYW5nZS4KICAgICAqLwogICAgaWYgKGRlc3RtYXNrICE9IEEwX0RFU1RfQ0hBTk5FTF9BTEwpIHsKICAgICAgIEdMdWludCB0bXAgPSBpOTE1X2dldF91dGVtcChwKTsKLSAgICAgIGk5MTVfZW1pdF90ZXhsZCggcCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCBzYW1wbGVyLCBjb29yZCwgb3AgKTsKKyAgICAgIGk5MTVfZW1pdF90ZXhsZCggcCwgMCwgdG1wLCBBMF9ERVNUX0NIQU5ORUxfQUxMLCBzYW1wbGVyLCBjb29yZCwgb3AgKTsKICAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTU9WLCBkZXN0LCBkZXN0bWFzaywgMCwgdG1wLCAwLCAwICk7CiAgICAgICByZXR1cm4gZGVzdDsKICAgIH0KQEAgLTIzOSwyNCArMjU1LDI4IEBACiB9CiAKIAotR0x1aW50IGk5MTVfZW1pdF9jb25zdDFmKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBHTGZsb2F0IGMwICkKK0dMdWludAoraTkxNV9lbWl0X2NvbnN0MWYoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqIHAsIEdMZmxvYXQgYzApCiB7CiAgICBHTGludCByZWcsIGlkeDsKIAotICAgaWYgKGMwID09IDAuMCkgcmV0dXJuIHN3aXp6bGUoVVJFRyhSRUdfVFlQRV9SLCAwKSwgWkVSTywgWkVSTywgWkVSTywgWkVSTyk7Ci0gICBpZiAoYzAgPT0gMS4wKSByZXR1cm4gc3dpenpsZShVUkVHKFJFR19UWVBFX1IsIDApLCBPTkUsICBPTkUsICBPTkUsICBPTkUgKTsKKyAgIGlmIChjMCA9PSAwLjApCisgICAgICByZXR1cm4gc3dpenpsZShVUkVHKFJFR19UWVBFX1IsIDApLCBaRVJPLCBaRVJPLCBaRVJPLCBaRVJPKTsKKyAgIGlmIChjMCA9PSAxLjApCisgICAgICByZXR1cm4gc3dpenpsZShVUkVHKFJFR19UWVBFX1IsIDApLCBPTkUsIE9ORSwgT05FLCBPTkUpOwogCiAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IEk5MTVfTUFYX0NPTlNUQU5UOyByZWcrKykgewogICAgICAgaWYgKHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gPT0gSTkxNV9DT05TVEZMQUdfUEFSQU0pCi0JIGNvbnRpbnVlOworICAgICAgICAgY29udGludWU7CiAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKSB7Ci0JIGlmICghKHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gJiAoMTw8aWR4KSkgfHwKLQkgICAgIHAtPmNvbnN0YW50W3JlZ11baWR4XSA9PSBjMCkgewotCSAgICBwLT5jb25zdGFudFtyZWddW2lkeF0gPSBjMDsKLQkgICAgcC0+Y29uc3RhbnRfZmxhZ3NbcmVnXSB8PSAxPDxpZHg7Ci0JICAgIGlmIChyZWcrMSA+IHAtPm5yX2NvbnN0YW50cykgcC0+bnJfY29uc3RhbnRzID0gcmVnKzE7Ci0JICAgIHJldHVybiBzd2l6emxlKFVSRUcoUkVHX1RZUEVfQ09OU1QsIHJlZyksaWR4LFpFUk8sWkVSTyxPTkUpOwotCSB9CisgICAgICAgICBpZiAoIShwLT5jb25zdGFudF9mbGFnc1tyZWddICYgKDEgPDwgaWR4KSkgfHwKKyAgICAgICAgICAgICBwLT5jb25zdGFudFtyZWddW2lkeF0gPT0gYzApIHsKKyAgICAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11baWR4XSA9IGMwOworICAgICAgICAgICAgcC0+Y29uc3RhbnRfZmxhZ3NbcmVnXSB8PSAxIDw8IGlkeDsKKyAgICAgICAgICAgIGlmIChyZWcgKyAxID4gcC0+bnJfY29uc3RhbnRzKQorICAgICAgICAgICAgICAgcC0+bnJfY29uc3RhbnRzID0gcmVnICsgMTsKKyAgICAgICAgICAgIHJldHVybiBzd2l6emxlKFVSRUcoUkVHX1RZUEVfQ09OU1QsIHJlZyksIGlkeCwgWkVSTywgWkVSTywgT05FKTsKKyAgICAgICAgIH0KICAgICAgIH0KICAgIH0KIApAQCAtMjY1LDI5ICsyODUsMzUgQEAKICAgIHJldHVybiAwOwogfQogCi1HTHVpbnQgaTkxNV9lbWl0X2NvbnN0MmYoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAotCQkJIEdMZmxvYXQgYzAsIEdMZmxvYXQgYzEgKQorR0x1aW50CitpOTE1X2VtaXRfY29uc3QyZihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICogcCwgR0xmbG9hdCBjMCwgR0xmbG9hdCBjMSkKIHsKICAgIEdMaW50IHJlZywgaWR4OwogCi0gICBpZiAoYzAgPT0gMC4wKSByZXR1cm4gc3dpenpsZShpOTE1X2VtaXRfY29uc3QxZihwLCBjMSksIFpFUk8sIFgsIFosIFcpOwotICAgaWYgKGMwID09IDEuMCkgcmV0dXJuIHN3aXp6bGUoaTkxNV9lbWl0X2NvbnN0MWYocCwgYzEpLCBPTkUsICBYLCBaLCBXKTsgCisgICBpZiAoYzAgPT0gMC4wKQorICAgICAgcmV0dXJuIHN3aXp6bGUoaTkxNV9lbWl0X2NvbnN0MWYocCwgYzEpLCBaRVJPLCBYLCBaLCBXKTsKKyAgIGlmIChjMCA9PSAxLjApCisgICAgICByZXR1cm4gc3dpenpsZShpOTE1X2VtaXRfY29uc3QxZihwLCBjMSksIE9ORSwgWCwgWiwgVyk7CiAKLSAgIGlmIChjMSA9PSAwLjApIHJldHVybiBzd2l6emxlKGk5MTVfZW1pdF9jb25zdDFmKHAsIGMwKSwgWCwgWkVSTywgWiwgVyk7Ci0gICBpZiAoYzEgPT0gMS4wKSByZXR1cm4gc3dpenpsZShpOTE1X2VtaXRfY29uc3QxZihwLCBjMCksIFgsIE9ORSwgIFosIFcpOworICAgaWYgKGMxID09IDAuMCkKKyAgICAgIHJldHVybiBzd2l6emxlKGk5MTVfZW1pdF9jb25zdDFmKHAsIGMwKSwgWCwgWkVSTywgWiwgVyk7CisgICBpZiAoYzEgPT0gMS4wKQorICAgICAgcmV0dXJuIHN3aXp6bGUoaTkxNV9lbWl0X2NvbnN0MWYocCwgYzApLCBYLCBPTkUsIFosIFcpOwogCiAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IEk5MTVfTUFYX0NPTlNUQU5UOyByZWcrKykgewogICAgICAgaWYgKHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gPT0gMHhmIHx8Ci0JICBwLT5jb25zdGFudF9mbGFnc1tyZWddID09IEk5MTVfQ09OU1RGTEFHX1BBUkFNKQotCSBjb250aW51ZTsKKyAgICAgICAgICBwLT5jb25zdGFudF9mbGFnc1tyZWddID09IEk5MTVfQ09OU1RGTEFHX1BBUkFNKQorICAgICAgICAgY29udGludWU7CiAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDM7IGlkeCsrKSB7Ci0JIGlmICghKHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gJiAoMzw8aWR4KSkpIHsKLQkgICAgcC0+Y29uc3RhbnRbcmVnXVtpZHhdID0gYzA7Ci0JICAgIHAtPmNvbnN0YW50W3JlZ11baWR4KzFdID0gYzE7Ci0JICAgIHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gfD0gMzw8aWR4OwotCSAgICBpZiAocmVnKzEgPiBwLT5ucl9jb25zdGFudHMpIHAtPm5yX2NvbnN0YW50cyA9IHJlZysxOwotCSAgICByZXR1cm4gc3dpenpsZShVUkVHKFJFR19UWVBFX0NPTlNULCByZWcpLGlkeCxpZHgrMSxaRVJPLE9ORSk7Ci0JIH0KKyAgICAgICAgIGlmICghKHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gJiAoMyA8PCBpZHgpKSkgeworICAgICAgICAgICAgcC0+Y29uc3RhbnRbcmVnXVtpZHhdID0gYzA7CisgICAgICAgICAgICBwLT5jb25zdGFudFtyZWddW2lkeCArIDFdID0gYzE7CisgICAgICAgICAgICBwLT5jb25zdGFudF9mbGFnc1tyZWddIHw9IDMgPDwgaWR4OworICAgICAgICAgICAgaWYgKHJlZyArIDEgPiBwLT5ucl9jb25zdGFudHMpCisgICAgICAgICAgICAgICBwLT5ucl9jb25zdGFudHMgPSByZWcgKyAxOworICAgICAgICAgICAgcmV0dXJuIHN3aXp6bGUoVVJFRyhSRUdfVFlQRV9DT05TVCwgcmVnKSwgaWR4LCBpZHggKyAxLCBaRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FKTsKKyAgICAgICAgIH0KICAgICAgIH0KICAgIH0KIApAQCAtMjk4LDI3ICszMjQsMjggQEAKIAogCiAKLUdMdWludCBpOTE1X2VtaXRfY29uc3Q0Ziggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwgCi0JCQkgR0xmbG9hdCBjMCwgR0xmbG9hdCBjMSwgR0xmbG9hdCBjMiwgR0xmbG9hdCBjMyApCitHTHVpbnQKK2k5MTVfZW1pdF9jb25zdDRmKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKiBwLAorICAgICAgICAgICAgICAgICAgR0xmbG9hdCBjMCwgR0xmbG9hdCBjMSwgR0xmbG9hdCBjMiwgR0xmbG9hdCBjMykKIHsKICAgIEdMaW50IHJlZzsKIAogICAgZm9yIChyZWcgPSAwOyByZWcgPCBJOTE1X01BWF9DT05TVEFOVDsgcmVnKyspIHsKICAgICAgIGlmIChwLT5jb25zdGFudF9mbGFnc1tyZWddID09IDB4ZiAmJgotCSAgcC0+Y29uc3RhbnRbcmVnXVswXSA9PSBjMCAmJgotCSAgcC0+Y29uc3RhbnRbcmVnXVsxXSA9PSBjMSAmJgotCSAgcC0+Y29uc3RhbnRbcmVnXVsyXSA9PSBjMiAmJgotCSAgcC0+Y29uc3RhbnRbcmVnXVszXSA9PSBjMykgewotCSByZXR1cm4gVVJFRyhSRUdfVFlQRV9DT05TVCwgcmVnKTsKKyAgICAgICAgICBwLT5jb25zdGFudFtyZWddWzBdID09IGMwICYmCisgICAgICAgICAgcC0+Y29uc3RhbnRbcmVnXVsxXSA9PSBjMSAmJgorICAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11bMl0gPT0gYzIgJiYgcC0+Y29uc3RhbnRbcmVnXVszXSA9PSBjMykgeworICAgICAgICAgcmV0dXJuIFVSRUcoUkVHX1RZUEVfQ09OU1QsIHJlZyk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChwLT5jb25zdGFudF9mbGFnc1tyZWddID09IDApIHsKLQkgcC0+Y29uc3RhbnRbcmVnXVswXSA9IGMwOwotCSBwLT5jb25zdGFudFtyZWddWzFdID0gYzE7Ci0JIHAtPmNvbnN0YW50W3JlZ11bMl0gPSBjMjsKLQkgcC0+Y29uc3RhbnRbcmVnXVszXSA9IGMzOwotCSBwLT5jb25zdGFudF9mbGFnc1tyZWddID0gMHhmOwotCSBpZiAocmVnKzEgPiBwLT5ucl9jb25zdGFudHMpIHAtPm5yX2NvbnN0YW50cyA9IHJlZysxOwotCSByZXR1cm4gVVJFRyhSRUdfVFlQRV9DT05TVCwgcmVnKTsKKyAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11bMF0gPSBjMDsKKyAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11bMV0gPSBjMTsKKyAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11bMl0gPSBjMjsKKyAgICAgICAgIHAtPmNvbnN0YW50W3JlZ11bM10gPSBjMzsKKyAgICAgICAgIHAtPmNvbnN0YW50X2ZsYWdzW3JlZ10gPSAweGY7CisgICAgICAgICBpZiAocmVnICsgMSA+IHAtPm5yX2NvbnN0YW50cykKKyAgICAgICAgICAgIHAtPm5yX2NvbnN0YW50cyA9IHJlZyArIDE7CisgICAgICAgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9DT05TVCwgcmVnKTsKICAgICAgIH0KICAgIH0KIApAQCAtMzI4LDM0ICszNTUsMzYgQEAKIH0KIAogCi1HTHVpbnQgaTkxNV9lbWl0X2NvbnN0NGZ2KCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBjb25zdCBHTGZsb2F0ICpjICkKK0dMdWludAoraTkxNV9lbWl0X2NvbnN0NGZ2KHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKiBwLCBjb25zdCBHTGZsb2F0ICogYykKIHsKLSAgIHJldHVybiBpOTE1X2VtaXRfY29uc3Q0ZiggcCwgY1swXSwgY1sxXSwgY1syXSwgY1szXSApOworICAgcmV0dXJuIGk5MTVfZW1pdF9jb25zdDRmKHAsIGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pOwogfQogCiAKLUdMdWludCBpOTE1X2VtaXRfcGFyYW00ZnYoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAotCQkJICBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKQorR0x1aW50CitpOTE1X2VtaXRfcGFyYW00ZnYoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqIHAsIGNvbnN0IEdMZmxvYXQgKiB2YWx1ZXMpCiB7CiAgICBHTGludCByZWcsIGk7CiAKICAgIGZvciAoaSA9IDA7IGkgPCBwLT5ucl9wYXJhbXM7IGkrKykgewogICAgICAgaWYgKHAtPnBhcmFtW2ldLnZhbHVlcyA9PSB2YWx1ZXMpCi0JIHJldHVybiBVUkVHKFJFR19UWVBFX0NPTlNULCBwLT5wYXJhbVtpXS5yZWcpOworICAgICAgICAgcmV0dXJuIFVSRUcoUkVHX1RZUEVfQ09OU1QsIHAtPnBhcmFtW2ldLnJlZyk7CiAgICB9CiAKIAogICAgZm9yIChyZWcgPSAwOyByZWcgPCBJOTE1X01BWF9DT05TVEFOVDsgcmVnKyspIHsKICAgICAgIGlmIChwLT5jb25zdGFudF9mbGFnc1tyZWddID09IDApIHsKLQkgcC0+Y29uc3RhbnRfZmxhZ3NbcmVnXSA9IEk5MTVfQ09OU1RGTEFHX1BBUkFNOwotCSBpID0gcC0+bnJfcGFyYW1zKys7CisgICAgICAgICBwLT5jb25zdGFudF9mbGFnc1tyZWddID0gSTkxNV9DT05TVEZMQUdfUEFSQU07CisgICAgICAgICBpID0gcC0+bnJfcGFyYW1zKys7CiAKLQkgcC0+cGFyYW1baV0udmFsdWVzID0gdmFsdWVzOwotCSBwLT5wYXJhbVtpXS5yZWcgPSByZWc7Ci0JIHAtPnBhcmFtc191cHRvZGF0ZSA9IDA7CisgICAgICAgICBwLT5wYXJhbVtpXS52YWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgICBwLT5wYXJhbVtpXS5yZWcgPSByZWc7CisgICAgICAgICBwLT5wYXJhbXNfdXB0b2RhdGUgPSAwOwogCi0JIGlmIChyZWcrMSA+IHAtPm5yX2NvbnN0YW50cykgcC0+bnJfY29uc3RhbnRzID0gcmVnKzE7Ci0JIHJldHVybiBVUkVHKFJFR19UWVBFX0NPTlNULCByZWcpOworICAgICAgICAgaWYgKHJlZyArIDEgPiBwLT5ucl9jb25zdGFudHMpCisgICAgICAgICAgICBwLT5ucl9jb25zdGFudHMgPSByZWcgKyAxOworICAgICAgICAgcmV0dXJuIFVSRUcoUkVHX1RZUEVfQ09OU1QsIHJlZyk7CiAgICAgICB9CiAgICB9CiAKQEAgLTM2NiwzMCArMzk1LDMxIEBACiAKIAogCi0KLXZvaWQgaTkxNV9wcm9ncmFtX2Vycm9yKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBjb25zdCBjaGFyICptc2cgKQordm9pZAoraTkxNV9wcm9ncmFtX2Vycm9yKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIGNvbnN0IGNoYXIgKm1zZykKIHsKICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgImk5MTVfcHJvZ3JhbV9lcnJvcjogJXMiLCBtc2cpOwogICAgcC0+ZXJyb3IgPSAxOwogfQogCi12b2lkIGk5MTVfaW5pdF9wcm9ncmFtKCBpOTE1Q29udGV4dFB0ciBpOTE1LCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICkKKwordm9pZAoraTkxNV9pbml0X3Byb2dyYW0oc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSwgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmk5MTUtPmludGVsLmN0eDsKLSAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKCBjdHggKTsKLSAgIAorCiAgICBwLT50cmFuc2xhdGVkID0gMDsKICAgIHAtPnBhcmFtc191cHRvZGF0ZSA9IDA7CiAgICBwLT5vbl9oYXJkd2FyZSA9IDA7CiAgICBwLT5lcnJvciA9IDA7CiAKLSAgIHAtPm5yX3RleF9pbmRpcmVjdCA9IDE7CS8qIGNvcnJlY3Q/ICovCisgICBwLT5ucl90ZXhfaW5kaXJlY3QgPSAxOyAgICAgIC8qIGNvcnJlY3Q/ICovCiAgICBwLT5ucl90ZXhfaW5zbiA9IDA7CiAgICBwLT5ucl9hbHVfaW5zbiA9IDA7CiAgICBwLT5ucl9kZWNsX2luc24gPSAwOwogCi0gICBwLT5jdHggPSBjdHg7ICAKLSAgIG1lbXNldCggcC0+Y29uc3RhbnRfZmxhZ3MsIDAsIHNpemVvZihwLT5jb25zdGFudF9mbGFncykgKTsKKyAgIHAtPmN0eCA9IGN0eDsKKyAgIG1lbXNldChwLT5jb25zdGFudF9mbGFncywgMCwgc2l6ZW9mKHAtPmNvbnN0YW50X2ZsYWdzKSk7CiAKICAgIHAtPm5yX2NvbnN0YW50cyA9IDA7CiAgICBwLT5jc3IgPSBwLT5wcm9ncmFtOwpAQCAtNDAyLDIxICs0MzIsMTcgQEAKICAgIHAtPmRlcHRoX3dyaXR0ZW4gPSAwOwogICAgcC0+bnJfcGFyYW1zID0gMDsKIAotICAgcC0+c3JjX3RleHR1cmUgPSBVUkVHX0JBRDsKLSAgIHAtPnNyY19wcmV2aW91cyA9IFVSRUcoUkVHX1RZUEVfVCwgVF9ESUZGVVNFKTsKLSAgIHAtPmxhc3RfdGV4X3N0YWdlID0gMDsKLSAgIHAtPlZCID0gJnRubC0+dmI7Ci0KICAgICoocC0+ZGVjbCsrKSA9IF8zRFNUQVRFX1BJWEVMX1NIQURFUl9QUk9HUkFNOwogfQogCiAKLXZvaWQgaTkxNV9maW5pX3Byb2dyYW0oIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKQordm9pZAoraTkxNV9maW5pX3Byb2dyYW0oc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKIHsKICAgIEdMdWludCBwcm9ncmFtX3NpemUgPSBwLT5jc3IgLSBwLT5wcm9ncmFtOwogICAgR0x1aW50IGRlY2xfc2l6ZSA9IHAtPmRlY2wgLSBwLT5kZWNsYXJhdGlvbnM7Ci0gICAKLSAgIGlmIChwLT5ucl90ZXhfaW5kaXJlY3QgPiBJOTE1X01BWF9URVhfSU5ESVJFQ1QpIAorCisgICBpZiAocC0+bnJfdGV4X2luZGlyZWN0ID4gSTkxNV9NQVhfVEVYX0lORElSRUNUKQogICAgICAgaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJFeGNlZWRlZCBtYXggbnIgaW5kaXJlY3QgdGV4dHVyZSBsb29rdXBzIik7CiAKICAgIGlmIChwLT5ucl90ZXhfaW5zbiA+IEk5MTVfTUFYX1RFWF9JTlNOKQpAQCAtNDQ2LDIyICs0NzIsMjQgQEAKICAgIHAtPmRlY2xhcmF0aW9uc1swXSB8PSBwcm9ncmFtX3NpemUgKyBkZWNsX3NpemUgLSAyOwogfQogCi12b2lkIGk5MTVfdXBsb2FkX3Byb2dyYW0oIGk5MTVDb250ZXh0UHRyIGk5MTUsIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKQordm9pZAoraTkxNV91cGxvYWRfcHJvZ3JhbShzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwKQogewogICAgR0x1aW50IHByb2dyYW1fc2l6ZSA9IHAtPmNzciAtIHAtPnByb2dyYW07CiAgICBHTHVpbnQgZGVjbF9zaXplID0gcC0+ZGVjbCAtIHAtPmRlY2xhcmF0aW9uczsKIAotICAgRkFMTEJBQ0soICZpOTE1LT5pbnRlbCwgSTkxNV9GQUxMQkFDS19QUk9HUkFNLCBwLT5lcnJvciApOworICAgRkFMTEJBQ0soJmk5MTUtPmludGVsLCBJOTE1X0ZBTExCQUNLX1BST0dSQU0sIHAtPmVycm9yKTsKIAogICAgLyogQ291bGQganVzdCBnbyBzdHJhaWdodCB0byB0aGUgYmF0Y2hidWZmZXIgZnJvbSBoZXJlOgogICAgICovCiAgICBpZiAoaTkxNS0+c3RhdGUuUHJvZ3JhbVNpemUgIT0gKHByb2dyYW1fc2l6ZSArIGRlY2xfc2l6ZSkgfHwKLSAgICAgICBtZW1jbXAoaTkxNS0+c3RhdGUuUHJvZ3JhbSArIGRlY2xfc2l6ZSwgcC0+cHJvZ3JhbSwgCi0JICAgICAgcHJvZ3JhbV9zaXplKnNpemVvZihpbnQpKSAhPSAwKSB7Ci0gICAgICBJOTE1X1NUQVRFQ0hBTkdFKCBpOTE1LCBJOTE1X1VQTE9BRF9QUk9HUkFNICk7Ci0gICAgICBtZW1jcHkoaTkxNS0+c3RhdGUuUHJvZ3JhbSwgcC0+ZGVjbGFyYXRpb25zLCBkZWNsX3NpemUqc2l6ZW9mKGludCkpOworICAgICAgIG1lbWNtcChpOTE1LT5zdGF0ZS5Qcm9ncmFtICsgZGVjbF9zaXplLCBwLT5wcm9ncmFtLAorICAgICAgICAgICAgICBwcm9ncmFtX3NpemUgKiBzaXplb2YoaW50KSkgIT0gMCkgeworICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9QUk9HUkFNKTsKKyAgICAgIG1lbWNweShpOTE1LT5zdGF0ZS5Qcm9ncmFtLCBwLT5kZWNsYXJhdGlvbnMsIGRlY2xfc2l6ZSAqIHNpemVvZihpbnQpKTsKICAgICAgIG1lbWNweShpOTE1LT5zdGF0ZS5Qcm9ncmFtICsgZGVjbF9zaXplLCBwLT5wcm9ncmFtLAotCSAgICAgcHJvZ3JhbV9zaXplKnNpemVvZihpbnQpKTsKKyAgICAgICAgICAgICBwcm9ncmFtX3NpemUgKiBzaXplb2YoaW50KSk7CiAgICAgICBpOTE1LT5zdGF0ZS5Qcm9ncmFtU2l6ZSA9IGRlY2xfc2l6ZSArIHByb2dyYW1fc2l6ZTsKICAgIH0KIApAQCAtNDcwLDMwICs0OTgsMjggQEAKICAgICAqLwogICAgaWYgKHAtPm5yX2NvbnN0YW50cykgewogICAgICAgR0x1aW50IG5yID0gcC0+bnJfY29uc3RhbnRzOwotICAgICAgCi0gICAgICBJOTE1X0FDVElWRVNUQVRFKCBpOTE1LCBJOTE1X1VQTE9BRF9DT05TVEFOVFMsIDEgKTsKLSAgICAgIEk5MTVfU1RBVEVDSEFOR0UoIGk5MTUsIEk5MTVfVVBMT0FEX0NPTlNUQU5UUyApOworCisgICAgICBJOTE1X0FDVElWRVNUQVRFKGk5MTUsIEk5MTVfVVBMT0FEX0NPTlNUQU5UUywgMSk7CisgICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NPTlNUQU5UUyk7CiAKICAgICAgIGk5MTUtPnN0YXRlLkNvbnN0YW50WzBdID0gXzNEU1RBVEVfUElYRUxfU0hBREVSX0NPTlNUQU5UUyB8ICgobnIpICogNCk7Ci0gICAgICBpOTE1LT5zdGF0ZS5Db25zdGFudFsxXSA9ICgxPDwobnItMSkpIHwgKCgxPDwobnItMSkpLTEpOwotICAgICAgCi0gICAgICBtZW1jcHkoJmk5MTUtPnN0YXRlLkNvbnN0YW50WzJdLCBwLT5jb25zdGFudCwgNCpzaXplb2YoaW50KSoobnIpKTsKKyAgICAgIGk5MTUtPnN0YXRlLkNvbnN0YW50WzFdID0gKDEgPDwgKG5yIC0gMSkpIHwgKCgxIDw8IChuciAtIDEpKSAtIDEpOworCisgICAgICBtZW1jcHkoJmk5MTUtPnN0YXRlLkNvbnN0YW50WzJdLCBwLT5jb25zdGFudCwgNCAqIHNpemVvZihpbnQpICogKG5yKSk7CiAgICAgICBpOTE1LT5zdGF0ZS5Db25zdGFudFNpemUgPSAyICsgKG5yKSAqIDQ7CiAKICAgICAgIGlmICgwKSB7Ci0JIEdMdWludCBpOwotCSBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgImNvbnN0WyVkXTogJWYgJWYgJWYgJWZcbiIsIGksIAotCQkgICAgcC0+Y29uc3RhbnRbaV1bMF0sCi0JCSAgICBwLT5jb25zdGFudFtpXVsxXSwKLQkJICAgIHAtPmNvbnN0YW50W2ldWzJdLAotCQkgICAgcC0+Y29uc3RhbnRbaV1bM10pOwotCSB9CisgICAgICAgICBHTHVpbnQgaTsKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvbnN0WyVkXTogJWYgJWYgJWYgJWZcbiIsIGksCisgICAgICAgICAgICAgICAgICAgIHAtPmNvbnN0YW50W2ldWzBdLAorICAgICAgICAgICAgICAgICAgICBwLT5jb25zdGFudFtpXVsxXSwgcC0+Y29uc3RhbnRbaV1bMl0sIHAtPmNvbnN0YW50W2ldWzNdKTsKKyAgICAgICAgIH0KICAgICAgIH0KICAgIH0KICAgIGVsc2UgewotICAgICAgSTkxNV9BQ1RJVkVTVEFURSggaTkxNSwgSTkxNV9VUExPQURfQ09OU1RBTlRTLCAwICk7Ci0gICB9ICAKKyAgICAgIEk5MTVfQUNUSVZFU1RBVEUoaTkxNSwgSTkxNV9VUExPQURfQ09OU1RBTlRTLCAwKTsKKyAgIH0KIAogICAgcC0+b25faGFyZHdhcmUgPSAxOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3Byb2dyYW0uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9wcm9ncmFtLmgKaW5kZXggODg5MWExNy4uMTRhM2YwOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3Byb2dyYW0uaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfcHJvZ3JhbS5oCkBAIC00OCwxMSArNDgsMTEgQEAKICNkZWZpbmUgVVJFR19DSEFOTkVMX1dfTkVHQVRFX1NISUZUICAgMTEKICNkZWZpbmUgVVJFR19DSEFOTkVMX1dfU0hJRlQgICAgICAgICAgOAogI2RlZmluZSBVUkVHX0NIQU5ORUxfWkVST19ORUdBVEVfTUJaICA1Ci0jZGVmaW5lIFVSRUdfQ0hBTk5FTF9aRVJPX1NISUZUICAgICAgIDQgICAgICAKKyNkZWZpbmUgVVJFR19DSEFOTkVMX1pFUk9fU0hJRlQgICAgICAgNAogI2RlZmluZSBVUkVHX0NIQU5ORUxfT05FX05FR0FURV9NQlogICAxCi0jZGVmaW5lIFVSRUdfQ0hBTk5FTF9PTkVfU0hJRlQgICAgICAgIDAgICAgICAKKyNkZWZpbmUgVVJFR19DSEFOTkVMX09ORV9TSElGVCAgICAgICAgMAogCi0jZGVmaW5lIFVSRUdfQkFEICAgICAgICAgIDB4ZmZmZmZmZmYgLyogbm90IGEgdmFsaWQgdXJlZyAqLworI2RlZmluZSBVUkVHX0JBRCAgICAgICAgICAweGZmZmZmZmZmICAgIC8qIG5vdCBhIHZhbGlkIHVyZWcgKi8KIAogI2RlZmluZSBYICAgIFNSQ19YCiAjZGVmaW5lIFkgICAgU1JDX1kKQEAgLTg0LDc4ICs4NCw3NiBAQAogCiAvKiBPbmUgbmVhdCB0aGluZyBhYm91dCB0aGUgVVJFRyByZXByZXNlbnRhdGlvbjogIAogICovCi1zdGF0aWMgX19pbmxpbmUgaW50IHN3aXp6bGUoIGludCByZWcsIGludCB4LCBpbnQgeSwgaW50IHosIGludCB3ICkKK3N0YXRpYyBJTkxJTkUgaW50Citzd2l6emxlKGludCByZWcsIGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KQogewogICAgcmV0dXJuICgocmVnICYgflVSRUdfWFlaV19DSEFOTkVMX01BU0spIHwKLQkgICBDSEFOTkVMX1NSQyggR0VUX0NIQU5ORUxfU1JDKCByZWcsIHggKSwgMCApIHwKLQkgICBDSEFOTkVMX1NSQyggR0VUX0NIQU5ORUxfU1JDKCByZWcsIHkgKSwgMSApIHwKLQkgICBDSEFOTkVMX1NSQyggR0VUX0NIQU5ORUxfU1JDKCByZWcsIHogKSwgMiApIHwKLQkgICBDSEFOTkVMX1NSQyggR0VUX0NIQU5ORUxfU1JDKCByZWcsIHcgKSwgMyApKTsKKyAgICAgICAgICAgQ0hBTk5FTF9TUkMoR0VUX0NIQU5ORUxfU1JDKHJlZywgeCksIDApIHwKKyAgICAgICAgICAgQ0hBTk5FTF9TUkMoR0VUX0NIQU5ORUxfU1JDKHJlZywgeSksIDEpIHwKKyAgICAgICAgICAgQ0hBTk5FTF9TUkMoR0VUX0NIQU5ORUxfU1JDKHJlZywgeiksIDIpIHwKKyAgICAgICAgICAgQ0hBTk5FTF9TUkMoR0VUX0NIQU5ORUxfU1JDKHJlZywgdyksIDMpKTsKIH0KIAogLyogQW5vdGhlciBuZWF0IHRoaW5nIGFib3V0IHRoZSBVUkVHIHJlcHJlc2VudGF0aW9uOiAgCiAgKi8KLXN0YXRpYyBfX2lubGluZSBpbnQgbmVnYXRlKCBpbnQgcmVnLCBpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyApCitzdGF0aWMgSU5MSU5FIGludAorbmVnYXRlKGludCByZWcsIGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KQogewotICAgcmV0dXJuIHJlZyBeICgoKHgmMSk8PFVSRUdfQ0hBTk5FTF9YX05FR0FURV9TSElGVCl8Ci0JCSAoKHkmMSk8PFVSRUdfQ0hBTk5FTF9ZX05FR0FURV9TSElGVCl8Ci0JCSAoKHomMSk8PFVSRUdfQ0hBTk5FTF9aX05FR0FURV9TSElGVCl8Ci0JCSAoKHcmMSk8PFVSRUdfQ0hBTk5FTF9XX05FR0FURV9TSElGVCkpOworICAgcmV0dXJuIHJlZyBeICgoKHggJiAxKSA8PCBVUkVHX0NIQU5ORUxfWF9ORUdBVEVfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgKCh5ICYgMSkgPDwgVVJFR19DSEFOTkVMX1lfTkVHQVRFX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICgoeiAmIDEpIDw8IFVSRUdfQ0hBTk5FTF9aX05FR0FURV9TSElGVCkgfAorICAgICAgICAgICAgICAgICAoKHcgJiAxKSA8PCBVUkVHX0NIQU5ORUxfV19ORUdBVEVfU0hJRlQpKTsKIH0KIAogCi1leHRlcm4gR0x1aW50IGk5MTVfZ2V0X3RlbXAoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKTsKLWV4dGVybiBHTHVpbnQgaTkxNV9nZXRfdXRlbXAoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKTsKLWV4dGVybiB2b2lkIGk5MTVfcmVsZWFzZV91dGVtcHMoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAgKTsKK2V4dGVybiBHTHVpbnQgaTkxNV9nZXRfdGVtcChzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwKTsKK2V4dGVybiBHTHVpbnQgaTkxNV9nZXRfdXRlbXAoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCk7CitleHRlcm4gdm9pZCBpOTE1X3JlbGVhc2VfdXRlbXBzKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApOwogCiAKLWV4dGVybiBHTHVpbnQgaTkxNV9lbWl0X3RleGxkKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotCQkJICAgICAgR0x1aW50IGRlc3QsCi0JCQkgICAgICBHTHVpbnQgZGVzdG1hc2ssCi0JCQkgICAgICBHTHVpbnQgc2FtcGxlciwKLQkJCSAgICAgIEdMdWludCBjb29yZCwKLQkJCSAgICAgIEdMdWludCBvcCApOworZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfdGV4bGQoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsaXZlX3JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXN0bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBzYW1wbGVyLCBHTHVpbnQgY29vcmQsIEdMdWludCBvcCk7CiAKLWV4dGVybiBHTHVpbnQgaTkxNV9lbWl0X2FyaXRoKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotCQkJICAgICAgR0x1aW50IG9wLAotCQkJICAgICAgR0x1aW50IGRlc3QsCi0JCQkgICAgICBHTHVpbnQgbWFzaywKLQkJCSAgICAgIEdMdWludCBzYXR1cmF0ZSwKLQkJCSAgICAgIEdMdWludCBzcmMwLAotCQkJICAgICAgR0x1aW50IHNyYzEsCi0JCQkgICAgICBHTHVpbnQgc3JjMiApOworZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfYXJpdGgoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgc2F0dXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgc3JjMCwgR0x1aW50IHNyYzEsIEdMdWludCBzcmMyKTsKIAotZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfZGVjbCggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKLQkJCSAgICAgR0x1aW50IHR5cGUsIEdMdWludCBuciwgR0x1aW50IGQwX2ZsYWdzICk7CitleHRlcm4gR0x1aW50IGk5MTVfZW1pdF9kZWNsKHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB0eXBlLCBHTHVpbnQgbnIsIEdMdWludCBkMF9mbGFncyk7CiAKIAotZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfY29uc3QxZiggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwgCi0JCQkJR0xmbG9hdCBjMCApOworZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfY29uc3QxZihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBHTGZsb2F0IGMwKTsKIAotZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfY29uc3QyZiggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwgCi0JCQkJR0xmbG9hdCBjMCwgR0xmbG9hdCBjMSApOworZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfY29uc3QyZihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IGMwLCBHTGZsb2F0IGMxKTsKIAotZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfY29uc3Q0ZnYoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCi0JCQkJIGNvbnN0IEdMZmxvYXQgKmMgKTsKK2V4dGVybiBHTHVpbnQgaTkxNV9lbWl0X2NvbnN0NGZ2KHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICogYyk7CiAKLWV4dGVybiBHTHVpbnQgaTkxNV9lbWl0X2NvbnN0NGYoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAotCQkJCUdMZmxvYXQgYzAsIEdMZmxvYXQgYzEsIAotCQkJCUdMZmxvYXQgYzIsIEdMZmxvYXQgYzMgKTsKK2V4dGVybiBHTHVpbnQgaTkxNV9lbWl0X2NvbnN0NGYoc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCBjMCwgR0xmbG9hdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCBjMiwgR0xmbG9hdCBjMyk7CiAKIAotZXh0ZXJuIEdMdWludCBpOTE1X2VtaXRfcGFyYW00ZnYoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAotCQkJCSBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKTsKK2V4dGVybiBHTHVpbnQgaTkxNV9lbWl0X3BhcmFtNGZ2KHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICogdmFsdWVzKTsKIAotZXh0ZXJuIHZvaWQgaTkxNV9wcm9ncmFtX2Vycm9yKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2cgKTsKK2V4dGVybiB2b2lkIGk5MTVfcHJvZ3JhbV9lcnJvcihzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZyk7CiAKLWV4dGVybiB2b2lkIGk5MTVfaW5pdF9wcm9ncmFtKCBpOTE1Q29udGV4dFB0ciBpOTE1LAotCQkJICAgICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCApOworZXh0ZXJuIHZvaWQgaTkxNV9pbml0X3Byb2dyYW0oc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApOwogCi1leHRlcm4gdm9pZCBpOTE1X3VwbG9hZF9wcm9ncmFtKCBpOTE1Q29udGV4dFB0ciBpOTE1LCAKLQkJCQlzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICk7CitleHRlcm4gdm9pZCBpOTE1X3VwbG9hZF9wcm9ncmFtKHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnApOwogCi1leHRlcm4gdm9pZCBpOTE1X2ZpbmlfcHJvZ3JhbSggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCApOworZXh0ZXJuIHZvaWQgaTkxNV9maW5pX3Byb2dyYW0oc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCk7CiAKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfcmVnLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfcmVnLmgKaW5kZXggNjk0Y2Q0Yy4uODg5MWUxMSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3JlZy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV9yZWcuaApAQCAtMzQsOCArMzQsNiBAQAogCiAjZGVmaW5lIEk5MTVfU0VUX0ZJRUxEKCB2YXIsIG1hc2ssIHZhbHVlICkgKHZhciAmPSB+KG1hc2spLCB2YXIgfD0gdmFsdWUpCiAKLSNkZWZpbmUgQ01EXzNEICgweDM8PDI5KQotCiAjZGVmaW5lIFBSSU0zRF9JTkxJTkUJCShDTURfM0QgfCAoMHgxZjw8MjQpKQogI2RlZmluZSBQUklNM0RfVFJJTElTVAkJKDB4MDw8MTgpCiAjZGVmaW5lIFBSSU0zRF9UUklTVFJJUCAJKDB4MTw8MTgpCkBAIC0xMTIsNiArMTEwLDIwIEBACiAvKiAzRFNUQVRFX0NIUk9NQV9LRVkgKi8KIAogLyogM0RTVEFURV9DTEVBUl9QQVJBTUVURVJTLCBwMTUwICovCisvKiAKKyAqIFNldHMgdGhlIGNvbG9yLCBkZXB0aCBhbmQgc3RlbmNpbCBjbGVhciB2YWx1ZXMgdXNlZCBieSB0aGUKKyAqIENMRUFSX1JFQ1QgYW5kIFpPTkVfSU5JVCBwcmltaXRpdmUgdHlwZXMsIHJlc3BlY3RpdmVseS4gIFRoZXNlCisgKiBwcmltaXRpdmVzIHNldCBvdmVycmlkZSBtb3N0IDNkIHN0YXRlIGFuZCBvbmx5IHRha2UgYSBtaW5pbWFsIHgveQorICogdmVydGV4LiAgVGhlIGNvbG9yL3ovc3RlbmNpbCBpbmZvcm1hdGlvbiBpcyBzdXBwbGllZCBoZXJlIGFuZAorICogdGhlcmVmb3JlIGNhbm5vdCB2YXJ5IHBlciB2ZXJ0ZXguCisgKi8KKyNkZWZpbmUgXzNEU1RBVEVfQ0xFQVJfUEFSQU1FVEVSUwkoQ01EXzNEIHwgKDB4MWQ8PDI0KSB8ICgweDljPDwxNikgfCA1KQorLyogRHdvcmQgMSAqLworI2RlZmluZSBDTEVBUlBBUkFNX0NMRUFSX1JFQ1QJCSgxIDw8IDE2KQorI2RlZmluZSBDTEVBUlBBUkFNX1pPTkVfSU5JVAkJKDAgPDwgMTYpCisjZGVmaW5lIENMRUFSUEFSQU1fV1JJVEVfQ09MT1IJCSgxIDw8IDIpCisjZGVmaW5lIENMRUFSUEFSQU1fV1JJVEVfREVQVEgJCSgxIDw8IDEpCisjZGVmaW5lIENMRUFSUEFSQU1fV1JJVEVfU1RFTkNJTAkoMSA8PCAwKQogCiAvKiAzRFNUQVRFX0NPTlNUQU5UX0JMRU5EX0NPTE9SLCBwMTUzICovCiAjZGVmaW5lIF8zRFNUQVRFX0NPTlNUX0JMRU5EX0NPTE9SX0NNRAkoQ01EXzNEIHwgKDB4MWQ8PDI0KSB8ICgweDg4PDwxNikpCkBAIC0zMTMsMTIwICszMjUsMjEgQEAKICNkZWZpbmUgU0NJU1NPUl9SRUNUXzBfWU1BWCh4KQkJKCh4KTw8MTYpCiAjZGVmaW5lIFNDSVNTT1JfUkVDVF8wX1hNQVgoeCkJCSh4KQogCi0vKiBwMTg5ICovCi0jZGVmaW5lIF8zRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzEgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MDQ8PDE2KSkKLSNkZWZpbmUgSTFfTE9BRF9TKG4pICAgICAgICAgICAgICAgICAgICAgICgxPDwoNCtuKSkKLQotI2RlZmluZSBTMF9WQl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgMHhmZmZmZmZjCi0jZGVmaW5lIFMwX0FVVE9fQ0FDSEVfSU5WX0RJU0FCTEUgICAgICAoMTw8MCkKLQotI2RlZmluZSBTMV9WRVJURVhfV0lEVEhfU0hJRlQgICAgICAgICAgMjQKLSNkZWZpbmUgUzFfVkVSVEVYX1dJRFRIX01BU0sgICAgICAgICAgICgweDNmPDwyNCkKLSNkZWZpbmUgUzFfVkVSVEVYX1BJVENIX1NISUZUICAgICAgICAgIDE2Ci0jZGVmaW5lIFMxX1ZFUlRFWF9QSVRDSF9NQVNLICAgICAgICAgICAoMHgzZjw8MTYpCi0KLSNkZWZpbmUgVEVYQ09PUkRGTVRfMkQgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBURVhDT09SREZNVF8zRCAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFRFWENPT1JERk1UXzREICAgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgVEVYQ09PUkRGTVRfMUQgICAgICAgICAgICAgICAgIDB4MwotI2RlZmluZSBURVhDT09SREZNVF8yRF8xNiAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFRFWENPT1JERk1UXzREXzE2ICAgICAgICAgICAgICAweDUKLSNkZWZpbmUgVEVYQ09PUkRGTVRfTk9UX1BSRVNFTlQgICAgICAgIDB4ZgotI2RlZmluZSBTMl9URVhDT09SRF9GTVQwX01BU0sgICAgICAgICAgICAweGYKLSNkZWZpbmUgUzJfVEVYQ09PUkRfRk1UMV9TSElGVCAgICAgICAgICAgNAotI2RlZmluZSBTMl9URVhDT09SRF9GTVQodW5pdCwgdHlwZSkgICAgKCh0eXBlKTw8KHVuaXQqNCkpCi0jZGVmaW5lIFMyX1RFWENPT1JEX05PTkUgICAgICAgICAgICAgICAofjApCi0KLS8qIFMzIG5vdCBpbnRlcmVzdGluZyAqLwotCi0jZGVmaW5lIFM0X1BPSU5UX1dJRFRIX1NISUZUICAgICAgICAgICAyMwotI2RlZmluZSBTNF9QT0lOVF9XSURUSF9NQVNLICAgICAgICAgICAgKDB4MWZmPDwyMykKLSNkZWZpbmUgUzRfTElORV9XSURUSF9TSElGVCAgICAgICAgICAgIDE5Ci0jZGVmaW5lIFM0X0xJTkVfV0lEVEhfT05FICAgICAgICAgICAgICAoMHgyPDwxOSkKLSNkZWZpbmUgUzRfTElORV9XSURUSF9NQVNLICAgICAgICAgICAgICgweGY8PDE5KQotI2RlZmluZSBTNF9GTEFUU0hBREVfQUxQSEEgICAgICAgICAgICAgKDE8PDE4KQotI2RlZmluZSBTNF9GTEFUU0hBREVfRk9HICAgICAgICAgICAgICAgKDE8PDE3KQotI2RlZmluZSBTNF9GTEFUU0hBREVfU1BFQ1VMQVIgICAgICAgICAgKDE8PDE2KQotI2RlZmluZSBTNF9GTEFUU0hBREVfQ09MT1IgICAgICAgICAgICAgKDE8PDE1KQotI2RlZmluZSBTNF9DVUxMTU9ERV9CT1RICSAgICAgICAoMDw8MTMpCi0jZGVmaW5lIFM0X0NVTExNT0RFX05PTkUJICAgICAgICgxPDwxMykKLSNkZWZpbmUgUzRfQ1VMTE1PREVfQ1cJCSAgICAgICAoMjw8MTMpCi0jZGVmaW5lIFM0X0NVTExNT0RFX0NDVwkJICAgICAgICgzPDwxMykKLSNkZWZpbmUgUzRfQ1VMTE1PREVfTUFTSwkgICAgICAgKDM8PDEzKQotI2RlZmluZSBTNF9WRk1UX1BPSU5UX1dJRFRIICAgICAgICAgICAgKDE8PDEyKQotI2RlZmluZSBTNF9WRk1UX1NQRUNfRk9HICAgICAgICAgICAgICAgKDE8PDExKQotI2RlZmluZSBTNF9WRk1UX0NPTE9SICAgICAgICAgICAgICAgICAgKDE8PDEwKQotI2RlZmluZSBTNF9WRk1UX0RFUFRIX09GRlNFVCAgICAgICAgICAgKDE8PDkpCi0jZGVmaW5lIFM0X1ZGTVRfWFlaICAgICAJICAgICAgICgxPDw2KQotI2RlZmluZSBTNF9WRk1UX1hZWlcgICAgIAkgICAgICAgKDI8PDYpCi0jZGVmaW5lIFM0X1ZGTVRfWFkgICAgIAkJICAgICAgICgzPDw2KQotI2RlZmluZSBTNF9WRk1UX1hZVyAgICAgCSAgICAgICAoNDw8NikKLSNkZWZpbmUgUzRfVkZNVF9YWVpXX01BU0sgICAgICAgICAgICAgICg3PDw2KQotI2RlZmluZSBTNF9GT1JDRV9ERUZBVUxUX0RJRkZVU0UgICAgICAgKDE8PDUpCi0jZGVmaW5lIFM0X0ZPUkNFX0RFRkFVTFRfU1BFQ1VMQVIgICAgICAoMTw8NCkKLSNkZWZpbmUgUzRfTE9DQUxfREVQVEhfT0ZGU0VUX0VOQUJMRSAgICgxPDwzKQotI2RlZmluZSBTNF9WRk1UX0ZPR19QQVJBTSAgICAgICAgICAgICAgKDE8PDIpCi0jZGVmaW5lIFM0X1NQUklURV9QT0lOVF9FTkFCTEUgICAgICAgICAoMTw8MSkKLSNkZWZpbmUgUzRfTElORV9BTlRJQUxJQVNfRU5BQkxFICAgICAgICgxPDwwKQotCi0jZGVmaW5lIFM0X1ZGTVRfTUFTSyAoUzRfVkZNVF9QT0lOVF9XSURUSCAgIHwgCVwKLQkJICAgICAgUzRfVkZNVF9TUEVDX0ZPRyAgICAgIHwJXAotCQkgICAgICBTNF9WRk1UX0NPTE9SICAgICAgICAgfAlcCi0JCSAgICAgIFM0X1ZGTVRfREVQVEhfT0ZGU0VUICB8CVwKLQkJICAgICAgUzRfVkZNVF9YWVpXX01BU0sgICAgIHwJXAotCQkgICAgICBTNF9WRk1UX0ZPR19QQVJBTSkKKy8qIEhlbHBlciBtYWNyb3MgZm9yIGJsZW5kIGZhY3RvcnMKKyAqLworI2RlZmluZSBEU1RfQkxORF9GQUNUKGYpICgoZik8PFM2X0NCVUZfRFNUX0JMRU5EX0ZBQ1RfU0hJRlQpCisjZGVmaW5lIFNSQ19CTE5EX0ZBQ1QoZikgKChmKTw8UzZfQ0JVRl9TUkNfQkxFTkRfRkFDVF9TSElGVCkKKyNkZWZpbmUgRFNUX0FCTE5EX0ZBQ1QoZikgKChmKTw8SUFCX0RTVF9GQUNUT1JfU0hJRlQpCisjZGVmaW5lIFNSQ19BQkxORF9GQUNUKGYpICgoZik8PElBQl9TUkNfRkFDVE9SX1NISUZUKQogCiAKLSNkZWZpbmUgUzVfV1JJVEVESVNBQkxFX0FMUEhBICAgICAgICAgICgxPDwzMSkKLSNkZWZpbmUgUzVfV1JJVEVESVNBQkxFX1JFRCAgICAgICAgICAgICgxPDwzMCkKLSNkZWZpbmUgUzVfV1JJVEVESVNBQkxFX0dSRUVOICAgICAgICAgICgxPDwyOSkKLSNkZWZpbmUgUzVfV1JJVEVESVNBQkxFX0JMVUUgICAgICAgICAgICgxPDwyOCkKLSNkZWZpbmUgUzVfV1JJVEVESVNBQkxFX01BU0sgICAgICAgICAgICgweGY8PDI4KQotI2RlZmluZSBTNV9GT1JDRV9ERUZBVUxUX1BPSU5UX1NJWkUgICAgKDE8PDI3KQotI2RlZmluZSBTNV9MQVNUX1BJWEVMX0VOQUJMRSAgICAgICAgICAgKDE8PDI2KQotI2RlZmluZSBTNV9HTE9CQUxfREVQVEhfT0ZGU0VUX0VOQUJMRSAgKDE8PDI1KQotI2RlZmluZSBTNV9GT0dfRU5BQkxFICAgICAgICAgICAgICAgICAgKDE8PDI0KQotI2RlZmluZSBTNV9TVEVOQ0lMX1JFRl9TSElGVCAgICAgICAgICAgMTYKLSNkZWZpbmUgUzVfU1RFTkNJTF9SRUZfTUFTSyAgICAgICAgICAgICgweGZmPDwxNikKLSNkZWZpbmUgUzVfU1RFTkNJTF9URVNUX0ZVTkNfU0hJRlQgICAgIDEzCi0jZGVmaW5lIFM1X1NURU5DSUxfVEVTVF9GVU5DX01BU0sgICAgICAoMHg3PDwxMykKLSNkZWZpbmUgUzVfU1RFTkNJTF9GQUlMX1NISUZUICAgICAgICAgIDEwCi0jZGVmaW5lIFM1X1NURU5DSUxfRkFJTF9NQVNLICAgICAgICAgICAoMHg3PDwxMCkKLSNkZWZpbmUgUzVfU1RFTkNJTF9QQVNTX1pfRkFJTF9TSElGVCAgIDcKLSNkZWZpbmUgUzVfU1RFTkNJTF9QQVNTX1pfRkFJTF9NQVNLICAgICgweDc8PDcpCi0jZGVmaW5lIFM1X1NURU5DSUxfUEFTU19aX1BBU1NfU0hJRlQgICA0Ci0jZGVmaW5lIFM1X1NURU5DSUxfUEFTU19aX1BBU1NfTUFTSyAgICAoMHg3PDw0KQotI2RlZmluZSBTNV9TVEVOQ0lMX1dSSVRFX0VOQUJMRSAgICAgICAgKDE8PDMpCi0jZGVmaW5lIFM1X1NURU5DSUxfVEVTVF9FTkFCTEUgICAgICAgICAoMTw8MikKLSNkZWZpbmUgUzVfQ09MT1JfRElUSEVSX0VOQUJMRSAgICAgICAgICgxPDwxKQotI2RlZmluZSBTNV9MT0dJQ09QX0VOQUJMRSAgICAgICAgICAgICAgKDE8PDApCiAKIAotI2RlZmluZSBTNl9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgKDE8PDMxKQotI2RlZmluZSBTNl9BTFBIQV9URVNUX0ZVTkNfU0hJRlQgICAgICAgMjgKLSNkZWZpbmUgUzZfQUxQSEFfVEVTVF9GVU5DX01BU0sgICAgICAgICgweDc8PDI4KQotI2RlZmluZSBTNl9BTFBIQV9SRUZfU0hJRlQgICAgICAgICAgICAgMjAKLSNkZWZpbmUgUzZfQUxQSEFfUkVGX01BU0sgICAgICAgICAgICAgICgweGZmPDwyMCkKLSNkZWZpbmUgUzZfREVQVEhfVEVTVF9FTkFCTEUgICAgICAgICAgICgxPDwxOSkKLSNkZWZpbmUgUzZfREVQVEhfVEVTVF9GVU5DX1NISUZUICAgICAgIDE2Ci0jZGVmaW5lIFM2X0RFUFRIX1RFU1RfRlVOQ19NQVNLICAgICAgICAoMHg3PDwxNikKLSNkZWZpbmUgUzZfQ0JVRl9CTEVORF9FTkFCTEUgICAgICAgICAgICgxPDwxNSkKLSNkZWZpbmUgUzZfQ0JVRl9CTEVORF9GVU5DX1NISUZUICAgICAgIDEyCi0jZGVmaW5lIFM2X0NCVUZfQkxFTkRfRlVOQ19NQVNLICAgICAgICAoMHg3PDwxMikKLSNkZWZpbmUgUzZfQ0JVRl9TUkNfQkxFTkRfRkFDVF9TSElGVCAgIDgKLSNkZWZpbmUgUzZfQ0JVRl9TUkNfQkxFTkRfRkFDVF9NQVNLICAgICgweGY8PDgpCi0jZGVmaW5lIFM2X0NCVUZfRFNUX0JMRU5EX0ZBQ1RfU0hJRlQgICA0Ci0jZGVmaW5lIFM2X0NCVUZfRFNUX0JMRU5EX0ZBQ1RfTUFTSyAgICAoMHhmPDw0KQotI2RlZmluZSBTNl9ERVBUSF9XUklURV9FTkFCTEUgICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIFM2X0NPTE9SX1dSSVRFX0VOQUJMRSAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgUzZfVFJJU1RSSVBfUFZfU0hJRlQgICAgICAgICAgIDAKLSNkZWZpbmUgUzZfVFJJU1RSSVBfUFZfTUFTSyAgICAgICAgICAgICgweDM8PDApCi0KLSNkZWZpbmUgUzdfREVQVEhfT0ZGU0VUX0NPTlNUX01BU0sgICAgIH4wCi0KIC8qIDNEU1RBVEVfTUFQX0RFSU5URVJMQUNFUl9QQVJBTUVURVJTICovCi0vKiAzRFNUQVRFX01BUF9QQUxFVFRFX0xPQURfMzIsIHAyMDYgKi8KIAorLyogM0RTVEFURV9NQVBfUEFMRVRURV9MT0FEXzMyLCBwMjA2ICovCisjZGVmaW5lIF8zRFNUQVRFX01BUF9QQUxFVFRFX0xPQURfMzIgICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDhmPDwxNikpCisvKiBzdWJzZXF1ZW50IGR3b3JkcyB1cCB0byBsZW5ndGggKG1heCAxNikgYXJlIEFSR0I4ODg4IGNvbG9yIHZhbHVlcyAqLwogCiAvKiBfM0RTVEFURV9NT0RFU180LCBwMjE4ICovCiAjZGVmaW5lIF8zRFNUQVRFX01PREVTXzRfQ01ECQkoQ01EXzNEfCgweDBkPDwyNCkpCkBAIC00MzUsNyArMzQ4LDcgQEAKICNkZWZpbmUgTE9HSUNPUF9NQVNLCQkJKDB4Zjw8MTgpCiAjZGVmaW5lIE1PREU0X0VOQUJMRV9TVEVOQ0lMX1RFU1RfTUFTSwkoKDE8PDE3KXwoMHhmZjAwKSkKICNkZWZpbmUgRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLCSgxPDwxNykKLSNkZWZpbmUgU1RFTkNJTF9URVNUX01BU0soeCkJCSgoeCk8PDgpCisjZGVmaW5lIFNURU5DSUxfVEVTVF9NQVNLKHgpCQkoKCh4KSYweGZmKTw8OCkKICNkZWZpbmUgTU9ERTRfRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSwkoKDE8PDE2KXwoMHgwMGZmKSkKICNkZWZpbmUgRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSwkoMTw8MTYpCiAjZGVmaW5lIFNURU5DSUxfV1JJVEVfTUFTSyh4KQkJKCh4KSYweGZmKQpAQCAtNDU4LDcgKzM3MSw3IEBACiAKIAogI2RlZmluZSBJOTE1X01BWF9URVhfSU5ESVJFQ1QgNAotI2RlZmluZSBJOTE1X01BWF9URVhfSU5TTiAgICAgMzIgICAgIAorI2RlZmluZSBJOTE1X01BWF9URVhfSU5TTiAgICAgMzIKICNkZWZpbmUgSTkxNV9NQVhfQUxVX0lOU04gICAgIDY0CiAjZGVmaW5lIEk5MTVfTUFYX0RFQ0xfSU5TTiAgICAyNwogI2RlZmluZSBJOTE1X01BWF9URU1QT1JBUlkgICAgMTYKQEAgLTQ3MCwzMyArMzgzLDMzIEBACiAgKi8KICNkZWZpbmUgXzNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU0gICAgKENNRF8zRHwoMHgxZDw8MjQpfCgweDU8PDE2KSkKIAotI2RlZmluZSBSRUdfVFlQRV9SICAgICAgICAgICAgICAgICAwIC8qIHRlbXBvcmFyeSByZWdzLCBubyBuZWVkIHRvCi0JCQkJICAgICAgKiBkY2wsIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUKLQkJCQkgICAgICAqIHJlYWQgLS0gUHJlc2VydmVkIGJldHdlZW4KLQkJCQkgICAgICAqIHBoYXNlcy4gCi0JCQkJICAgICAgKi8KLSNkZWZpbmUgUkVHX1RZUEVfVCAgICAgICAgICAgICAgICAgMSAvKiBJbnRlcnBvbGF0ZWQgdmFsdWVzLCBtdXN0IGJlCi0JCQkJICAgICAgKiBkY2wnZWQgYmVmb3JlIHVzZS4KLQkJCQkgICAgICAqCi0JCQkJICAgICAgKiAwLi43OiB0ZXh0dXJlIGNvb3JkLAotCQkJCSAgICAgICogODogZGlmZnVzZSBzcGVjLAotCQkJCSAgICAgICogOTogc3BlY3VsYXIgY29sb3IsCi0JCQkJICAgICAgKiAxMDogZm9nIHBhcmFtZXRlciBpbiB3LgotCQkJCSAgICAgICovCi0jZGVmaW5lIFJFR19UWVBFX0NPTlNUICAgICAgICAgICAgIDIgLyogUmVzdHJpY3Rpb246IG9ubHkgb25lIGNvbnN0Ci0JCQkJICAgICAgKiBjYW4gYmUgcmVmZXJlbmNlZCBwZXIKLQkJCQkgICAgICAqIGluc3RydWN0aW9uLCB0aG91Z2ggaXQgbWF5IGJlCi0JCQkJICAgICAgKiBzZWxlY3RlZCBmb3IgbXVsdGlwbGUgaW5wdXRzLgotCQkJCSAgICAgICogQ29uc3RhbnRzIG5vdCBpbml0aWFsaXplZAotCQkJCSAgICAgICogZGVmYXVsdCB0byB6ZXJvLgotCQkJCSAgICAgICovCi0jZGVmaW5lIFJFR19UWVBFX1MgICAgICAgICAgICAgICAgIDMgLyogc2FtcGxlciAqLwotI2RlZmluZSBSRUdfVFlQRV9PQyAgICAgICAgICAgICAgICA0IC8qIG91dHB1dCBjb2xvciAocmdiYSkgKi8KLSNkZWZpbmUgUkVHX1RZUEVfT0QgICAgICAgICAgICAgICAgNSAvKiBvdXRwdXQgZGVwdGggKHcpLCB4eXogYXJlCi0JCQkJICAgICAgKiB0ZW1wb3Jhcmllcy4gIElmIG5vdCB3cml0dGVuLAotCQkJCSAgICAgICogaW50ZXJwb2xhdGVkIGRlcHRoIGlzIHVzZWQ/Ci0JCQkJICAgICAgKi8KLSNkZWZpbmUgUkVHX1RZUEVfVSAgICAgICAgICAgICAgICAgNiAvKiB1bnByZXNlcnZlZCB0ZW1wb3JhcmllcyAqLworI2RlZmluZSBSRUdfVFlQRV9SICAgICAgICAgICAgICAgICAwICAgIC8qIHRlbXBvcmFyeSByZWdzLCBubyBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGNsLCBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhZCAtLSBQcmVzZXJ2ZWQgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBoYXNlcy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJFR19UWVBFX1QgICAgICAgICAgICAgICAgIDEgICAgLyogSW50ZXJwb2xhdGVkIHZhbHVlcywgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRjbCdlZCBiZWZvcmUgdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMC4uNzogdGV4dHVyZSBjb29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA4OiBkaWZmdXNlIHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogOTogc3BlY3VsYXIgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTA6IGZvZyBwYXJhbWV0ZXIgaW4gdy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkVHX1RZUEVfQ09OU1QgICAgICAgICAgICAgMiAgICAvKiBSZXN0cmljdGlvbjogb25seSBvbmUgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYW4gYmUgcmVmZXJlbmNlZCBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiwgdGhvdWdoIGl0IG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbGVjdGVkIGZvciBtdWx0aXBsZSBpbnB1dHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ29uc3RhbnRzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHQgdG8gemVyby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkVHX1RZUEVfUyAgICAgICAgICAgICAgICAgMyAgICAvKiBzYW1wbGVyICovCisjZGVmaW5lIFJFR19UWVBFX09DICAgICAgICAgICAgICAgIDQgICAgLyogb3V0cHV0IGNvbG9yIChyZ2JhKSAqLworI2RlZmluZSBSRUdfVFlQRV9PRCAgICAgICAgICAgICAgICA1ICAgIC8qIG91dHB1dCBkZXB0aCAodyksIHh5eiBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0ZW1wb3Jhcmllcy4gIElmIG5vdCB3cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludGVycG9sYXRlZCBkZXB0aCBpcyB1c2VkPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRUdfVFlQRV9VICAgICAgICAgICAgICAgICA2ICAgIC8qIHVucHJlc2VydmVkIHRlbXBvcmFyaWVzICovCiAjZGVmaW5lIFJFR19UWVBFX01BU0sgICAgICAgICAgICAgIDB4NwogI2RlZmluZSBSRUdfTlJfTUFTSyAgICAgICAgICAgICAgICAweGYKIApAQCAtNTEzLDM0ICs0MjYsMzQgQEAKICNkZWZpbmUgVF9URVg3ICAgICA3CiAjZGVmaW5lIFRfRElGRlVTRSAgOAogI2RlZmluZSBUX1NQRUNVTEFSIDkKLSNkZWZpbmUgVF9GT0dfVyAgICAxMAkJLyogaW50ZXJwb2xhdGVkIGZvZyBpcyBpbiBXIGNvb3JkICovCisjZGVmaW5lIFRfRk9HX1cgICAgMTAgICAgICAgICAgIC8qIGludGVycG9sYXRlZCBmb2cgaXMgaW4gVyBjb29yZCAqLwogCiAvKiBBcml0aG1ldGljIGluc3RydWN0aW9ucyAqLwogCiAvKiAucmVwbGljYXRlX3N3aXp6bGUgPT0gc2VsZWN0aW9uIGFuZCByZXBsaWNhdGlvbiBvZiBhIHBhcnRpY3VsYXIKICAqIHNjYWxhciBjaGFubmVsLCBpZS4sIC54eHh4LCAueXl5eSwgLnp6enogb3IgLnd3d3cgCiAgKi8KLSNkZWZpbmUgQTBfTk9QICAgICgweDA8PDI0KQkJLyogbm8gb3BlcmF0aW9uICovCi0jZGVmaW5lIEEwX0FERCAgICAoMHgxPDwyNCkJCS8qIGRzdCA9IHNyYzAgKyBzcmMxICovCi0jZGVmaW5lIEEwX01PViAgICAoMHgyPDwyNCkJCS8qIGRzdCA9IHNyYzAgKi8KLSNkZWZpbmUgQTBfTVVMICAgICgweDM8PDI0KQkJLyogZHN0ID0gc3JjMCAqIHNyYzEgKi8KLSNkZWZpbmUgQTBfTUFEICAgICgweDQ8PDI0KQkJLyogZHN0ID0gc3JjMCAqIHNyYzEgKyBzcmMyICovCi0jZGVmaW5lIEEwX0RQMkFERCAoMHg1PDwyNCkJCS8qIGRzdC54eXp3ID0gc3JjMC54eSBkb3Qgc3JjMS54eSArIHNyYzIucmVwbGljYXRlX3N3aXp6bGUgKi8KLSNkZWZpbmUgQTBfRFAzICAgICgweDY8PDI0KQkJLyogZHN0Lnh5encgPSBzcmMwLnh5eiBkb3Qgc3JjMS54eXogKi8KLSNkZWZpbmUgQTBfRFA0ICAgICgweDc8PDI0KQkJLyogZHN0Lnh5encgPSBzcmMwLnh5encgZG90IHNyYzEueHl6dyAqLwotI2RlZmluZSBBMF9GUkMgICAgKDB4ODw8MjQpCQkvKiBkc3QgPSBzcmMwIC0gZmxvb3Ioc3JjMCkgKi8KLSNkZWZpbmUgQTBfUkNQICAgICgweDk8PDI0KQkJLyogZHN0Lnh5encgPSAxLyhzcmMwLnJlcGxpY2F0ZV9zd2l6emxlKSAqLwotI2RlZmluZSBBMF9SU1EgICAgKDB4YTw8MjQpCQkvKiBkc3QueHl6dyA9IDEvKHNxcnQoYWJzKHNyYzAucmVwbGljYXRlX3N3aXp6bGUpKSkgKi8KLSNkZWZpbmUgQTBfRVhQICAgICgweGI8PDI0KQkJLyogZHN0Lnh5encgPSBleHAyKHNyYzAucmVwbGljYXRlX3N3aXp6bGUpICovCi0jZGVmaW5lIEEwX0xPRyAgICAoMHhjPDwyNCkJCS8qIGRzdC54eXp3ID0gbG9nMihhYnMoc3JjMC5yZXBsaWNhdGVfc3dpenpsZSkpICovCi0jZGVmaW5lIEEwX0NNUCAgICAoMHhkPDwyNCkJCS8qIGRzdCA9IChzcmMwID49IDAuMCkgPyBzcmMxIDogc3JjMiAqLwotI2RlZmluZSBBMF9NSU4gICAgKDB4ZTw8MjQpCQkvKiBkc3QgPSAoc3JjMCA8IHNyYzEpID8gc3JjMCA6IHNyYzEgKi8KLSNkZWZpbmUgQTBfTUFYICAgICgweGY8PDI0KQkJLyogZHN0ID0gKHNyYzAgPj0gc3JjMSkgPyBzcmMwIDogc3JjMSAqLwotI2RlZmluZSBBMF9GTFIgICAgKDB4MTA8PDI0KQkJLyogZHN0ID0gZmxvb3Ioc3JjMCkgKi8KLSNkZWZpbmUgQTBfTU9EICAgICgweDExPDwyNCkJCS8qIGRzdCA9IHNyYzAgZm1vZCAxLjAgKi8KLSNkZWZpbmUgQTBfVFJDICAgICgweDEyPDwyNCkJCS8qIGRzdCA9IGludChzcmMwKSAqLwotI2RlZmluZSBBMF9TR0UgICAgKDB4MTM8PDI0KQkJLyogZHN0ID0gc3JjMCA+PSBzcmMxID8gMS4wIDogMC4wICovCi0jZGVmaW5lIEEwX1NMVCAgICAoMHgxNDw8MjQpCQkvKiBkc3QgPSBzcmMwIDwgc3JjMSA/IDEuMCA6IDAuMCAqLworI2RlZmluZSBBMF9OT1AgICAgKDB4MDw8MjQpICAgICAvKiBubyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgQTBfQUREICAgICgweDE8PDI0KSAgICAgLyogZHN0ID0gc3JjMCArIHNyYzEgKi8KKyNkZWZpbmUgQTBfTU9WICAgICgweDI8PDI0KSAgICAgLyogZHN0ID0gc3JjMCAqLworI2RlZmluZSBBMF9NVUwgICAgKDB4Mzw8MjQpICAgICAvKiBkc3QgPSBzcmMwICogc3JjMSAqLworI2RlZmluZSBBMF9NQUQgICAgKDB4NDw8MjQpICAgICAvKiBkc3QgPSBzcmMwICogc3JjMSArIHNyYzIgKi8KKyNkZWZpbmUgQTBfRFAyQUREICgweDU8PDI0KSAgICAgLyogZHN0Lnh5encgPSBzcmMwLnh5IGRvdCBzcmMxLnh5ICsgc3JjMi5yZXBsaWNhdGVfc3dpenpsZSAqLworI2RlZmluZSBBMF9EUDMgICAgKDB4Njw8MjQpICAgICAvKiBkc3QueHl6dyA9IHNyYzAueHl6IGRvdCBzcmMxLnh5eiAqLworI2RlZmluZSBBMF9EUDQgICAgKDB4Nzw8MjQpICAgICAvKiBkc3QueHl6dyA9IHNyYzAueHl6dyBkb3Qgc3JjMS54eXp3ICovCisjZGVmaW5lIEEwX0ZSQyAgICAoMHg4PDwyNCkgICAgIC8qIGRzdCA9IHNyYzAgLSBmbG9vcihzcmMwKSAqLworI2RlZmluZSBBMF9SQ1AgICAgKDB4OTw8MjQpICAgICAvKiBkc3QueHl6dyA9IDEvKHNyYzAucmVwbGljYXRlX3N3aXp6bGUpICovCisjZGVmaW5lIEEwX1JTUSAgICAoMHhhPDwyNCkgICAgIC8qIGRzdC54eXp3ID0gMS8oc3FydChhYnMoc3JjMC5yZXBsaWNhdGVfc3dpenpsZSkpKSAqLworI2RlZmluZSBBMF9FWFAgICAgKDB4Yjw8MjQpICAgICAvKiBkc3QueHl6dyA9IGV4cDIoc3JjMC5yZXBsaWNhdGVfc3dpenpsZSkgKi8KKyNkZWZpbmUgQTBfTE9HICAgICgweGM8PDI0KSAgICAgLyogZHN0Lnh5encgPSBsb2cyKGFicyhzcmMwLnJlcGxpY2F0ZV9zd2l6emxlKSkgKi8KKyNkZWZpbmUgQTBfQ01QICAgICgweGQ8PDI0KSAgICAgLyogZHN0ID0gKHNyYzAgPj0gMC4wKSA/IHNyYzEgOiBzcmMyICovCisjZGVmaW5lIEEwX01JTiAgICAoMHhlPDwyNCkgICAgIC8qIGRzdCA9IChzcmMwIDwgc3JjMSkgPyBzcmMwIDogc3JjMSAqLworI2RlZmluZSBBMF9NQVggICAgKDB4Zjw8MjQpICAgICAvKiBkc3QgPSAoc3JjMCA+PSBzcmMxKSA/IHNyYzAgOiBzcmMxICovCisjZGVmaW5lIEEwX0ZMUiAgICAoMHgxMDw8MjQpICAgIC8qIGRzdCA9IGZsb29yKHNyYzApICovCisjZGVmaW5lIEEwX01PRCAgICAoMHgxMTw8MjQpICAgIC8qIGRzdCA9IHNyYzAgZm1vZCAxLjAgKi8KKyNkZWZpbmUgQTBfVFJDICAgICgweDEyPDwyNCkgICAgLyogZHN0ID0gaW50KHNyYzApICovCisjZGVmaW5lIEEwX1NHRSAgICAoMHgxMzw8MjQpICAgIC8qIGRzdCA9IHNyYzAgPj0gc3JjMSA/IDEuMCA6IDAuMCAqLworI2RlZmluZSBBMF9TTFQgICAgKDB4MTQ8PDI0KSAgICAvKiBkc3QgPSBzcmMwIDwgc3JjMSA/IDEuMCA6IDAuMCAqLwogI2RlZmluZSBBMF9ERVNUX1NBVFVSQVRFICAgICAgICAgICAgICAgICAoMTw8MjIpCiAjZGVmaW5lIEEwX0RFU1RfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAxOQogLyogQWxsb3c6IFIsIE9DLCBPRCwgVSAqLwpAQCAtNTk5LDIzICs1MTIsMjMgQEAKIAogCiAvKiBUZXh0dXJlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBUMF9URVhMRCAgICAgKDB4MTU8PDI0KQkvKiBTYW1wbGUgdGV4dHVyZSB1c2luZyBwcmVkZWNsYXJlZAotCQkJCSAqIHNhbXBsZXIgYW5kIGFkZHJlc3MsIGFuZCBvdXRwdXQKLQkJCQkgKiBmaWx0ZXJlZCB0ZXhlbCBkYXRhIHRvIGRlc3RpbmF0aW9uCi0JCQkJICogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVDBfVEVYTERQICAgICgweDE2PDwyNCkJLyogU2FtZSBhcyB0ZXhsZCBidXQgcGVyZm9ybXMgYQotCQkJCSAqIHBlcnNwZWN0aXZlIGRpdmlkZSBvZiB0aGUgdGV4dHVyZQotCQkJCSAqIGNvb3JkaW5hdGUgLnh5eiB2YWx1ZXMgYnkgLncgYmVmb3JlCi0JCQkJICogc2FtcGxpbmcuICovCi0jZGVmaW5lIFQwX1RFWExEQiAgICAoMHgxNzw8MjQpCS8qIFNhbWUgYXMgdGV4bGQgYnV0IGJpYXNlcyB0aGUKLQkJCQkgKiBjb21wdXRlZCBMT0QgYnkgdy4gIE9ubHkgUzQuNiB0d28ncwotCQkJCSAqIGNvbXAgaXMgdXNlZC4gIFRoaXMgaW1wbGllcyB0aGF0IGEKLQkJCQkgKiBmbG9hdCB0byBmaXhlZCBjb252ZXJzaW9uIGlzCi0JCQkJICogZG9uZS4gKi8KLSNkZWZpbmUgVDBfVEVYS0lMTCAgICgweDE4PDwyNCkJLyogRG9lcyBub3QgcGVyZm9ybSBhIHNhbXBsaW5nCi0JCQkJICogb3BlcmF0aW9uLiAgU2ltcGx5IGtpbGxzIHRoZSBwaXhlbAotCQkJCSAqIGlmIGFueSBjaGFubmVsIG9mIHRoZSBhZGRyZXNzCi0JCQkJICogcmVnaXN0ZXIgaXMgPCAwLjAuICovCisjZGVmaW5lIFQwX1RFWExEICAgICAoMHgxNTw8MjQpIC8qIFNhbXBsZSB0ZXh0dXJlIHVzaW5nIHByZWRlY2xhcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNhbXBsZXIgYW5kIGFkZHJlc3MsIGFuZCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsdGVyZWQgdGV4ZWwgZGF0YSB0byBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWdpc3RlciAqLworI2RlZmluZSBUMF9URVhMRFAgICAgKDB4MTY8PDI0KSAvKiBTYW1lIGFzIHRleGxkIGJ1dCBwZXJmb3JtcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBlcnNwZWN0aXZlIGRpdmlkZSBvZiB0aGUgdGV4dHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb29yZGluYXRlIC54eXogdmFsdWVzIGJ5IC53IGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1wbGluZy4gKi8KKyNkZWZpbmUgVDBfVEVYTERCICAgICgweDE3PDwyNCkgLyogU2FtZSBhcyB0ZXhsZCBidXQgYmlhc2VzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wdXRlZCBMT0QgYnkgdy4gIE9ubHkgUzQuNiB0d28ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wIGlzIHVzZWQuICBUaGlzIGltcGxpZXMgdGhhdCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZsb2F0IHRvIGZpeGVkIGNvbnZlcnNpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZG9uZS4gKi8KKyNkZWZpbmUgVDBfVEVYS0lMTCAgICgweDE4PDwyNCkgLyogRG9lcyBub3QgcGVyZm9ybSBhIHNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9wZXJhdGlvbi4gIFNpbXBseSBraWxscyB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgYW55IGNoYW5uZWwgb2YgdGhlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVnaXN0ZXIgaXMgPCAwLjAuICovCiAjZGVmaW5lIFQwX0RFU1RfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAxOQogLyogQWxsb3c6IFIsIE9DLCBPRCwgVSAqLwogLyogTm90ZTogVSAodW5wcmVzZXJ2ZWQpIHJlZ3MgZG8gbm90IHJldGFpbiB0aGVpciB2YWx1ZXMgYmV0d2VlbgpAQCAtNjI3LDE4ICs1NDAsMTggQEAKICAqLwogI2RlZmluZSBUMF9ERVNUX05SX1NISUZUICAgICAgICAgICAgICAgICAxNAogLyogQWxsb3cgUjogMC4uMTUsIE9DLE9EOiAwLi4wLCBVOiAwLi4yICovCi0jZGVmaW5lIFQwX1NBTVBMRVJfTlJfU0hJRlQgICAgICAgICAgICAgIDAgLyogVGhpcyBmaWVsZCBpZ25vcmVkIGZvciBURVhLSUxMICovCisjZGVmaW5lIFQwX1NBTVBMRVJfTlJfU0hJRlQgICAgICAgICAgICAgIDAgICAgICAvKiBUaGlzIGZpZWxkIGlnbm9yZWQgZm9yIFRFWEtJTEwgKi8KICNkZWZpbmUgVDBfU0FNUExFUl9OUl9NQVNLICAgICAgICAgICAgICAgKDB4Zjw8MCkKIAotI2RlZmluZSBUMV9BRERSRVNTX1JFR19UWVBFX1NISUZUICAgICAgICAyNCAvKiBSZWcgdG8gdXNlIGFzIHRleHR1cmUgY29vcmQgKi8KKyNkZWZpbmUgVDFfQUREUkVTU19SRUdfVFlQRV9TSElGVCAgICAgICAgMjQgICAgIC8qIFJlZyB0byB1c2UgYXMgdGV4dHVyZSBjb29yZCAqLwogLyogQWxsb3cgUiwgVCwgT0MsIE9EIC0tIFIsIE9DLCBPRCBhcmUgJ2RlcGVuZGVudCcgcmVhZHMsIG5ldyBwcm9ncmFtIHBoYXNlICovCiAjZGVmaW5lIFQxX0FERFJFU1NfUkVHX05SX1NISUZUICAgICAgICAgIDE3CiAjZGVmaW5lIFQyX01CWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKIAogLyogRGVjbGFyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEQwX0RDTCAgICAgICAoMHgxOTw8MjQpCS8qIERlY2xhcmUgYSB0IChpbnRlcnBvbGF0ZWQgYXR0cmliKQotCQkJCSAqIHJlZ2lzdGVyIG9yIGFuIHMgKHNhbXBsZXIpCi0JCQkJICogcmVnaXN0ZXIuICovCisjZGVmaW5lIEQwX0RDTCAgICAgICAoMHgxOTw8MjQpIC8qIERlY2xhcmUgYSB0IChpbnRlcnBvbGF0ZWQgYXR0cmliKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWdpc3RlciBvciBhbiBzIChzYW1wbGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWdpc3Rlci4gKi8KICNkZWZpbmUgRDBfU0FNUExFX1RZUEVfU0hJRlQgICAgICAgICAgICAgIDIyCiAjZGVmaW5lIEQwX1NBTVBMRV9UWVBFXzJEICAgICAgICAgICAgICAgICAoMHgwPDwyMikKICNkZWZpbmUgRDBfU0FNUExFX1RZUEVfQ1VCRSAgICAgICAgICAgICAgICgweDE8PDIyKQpAQCAtNjk1LDEyICs2MDgsMTIgQEAKICNkZWZpbmUgICAgTUFQU1VSRl80QklUX0lOREVYRUQJCSAgICg3PDw3KQogI2RlZmluZSBNUzNfTVRfRk9STUFUX01BU0sgICAgICAgICAoMHg3IDw8IDMpCiAjZGVmaW5lIE1TM19NVF9GT1JNQVRfU0hJRlQgICAgICAgIDMKLSNkZWZpbmUgICAgTVRfNEJJVF9JRFhfQVJHQjg4ODgJICAgICAgICAgICAoNzw8MykgLyogU1VSRkFDRV80QklUX0lOREVYRUQgKi8KLSNkZWZpbmUgICAgTVRfOEJJVF9JOAkJICAgICAgICAgICAoMDw8MykgLyogU1VSRkFDRV84QklUICovCisjZGVmaW5lICAgIE1UXzRCSVRfSURYX0FSR0I4ODg4CSAgICAgICAgICAgKDc8PDMpICAgICAgIC8qIFNVUkZBQ0VfNEJJVF9JTkRFWEVEICovCisjZGVmaW5lICAgIE1UXzhCSVRfSTgJCSAgICAgICAgICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfOEJJVCAqLwogI2RlZmluZSAgICBNVF84QklUX0w4CQkgICAgICAgICAgICgxPDwzKQogI2RlZmluZSAgICBNVF84QklUX0E4CQkgICAgICAgICAgICg0PDwzKQogI2RlZmluZSAgICBNVF84QklUX01PTk84CSAgICAgICAgICAgKDU8PDMpCi0jZGVmaW5lICAgIE1UXzE2QklUX1JHQjU2NSAJCSAgICgwPDwzKSAvKiBTVVJGQUNFXzE2QklUICovCisjZGVmaW5lICAgIE1UXzE2QklUX1JHQjU2NSAJCSAgICgwPDwzKSAgICAgICAvKiBTVVJGQUNFXzE2QklUICovCiAjZGVmaW5lICAgIE1UXzE2QklUX0FSR0IxNTU1CQkgICAoMTw8MykKICNkZWZpbmUgICAgTVRfMTZCSVRfQVJHQjQ0NDQJCSAgICgyPDwzKQogI2RlZmluZSAgICBNVF8xNkJJVF9BWTg4CQkgICAoMzw8MykKQEAgLTcwOSw3ICs2MjIsNyBAQAogI2RlZmluZSAgICBNVF8xNkJJVF9JMTYJICAgICAgICAgICAgICAgICAgICg3PDwzKQogI2RlZmluZSAgICBNVF8xNkJJVF9MMTYJICAgICAgICAgICAgICAgICAgICg4PDwzKQogI2RlZmluZSAgICBNVF8xNkJJVF9BMTYJICAgICAgICAgICAgICAgICAgICg5PDwzKQotI2RlZmluZSAgICBNVF8zMkJJVF9BUkdCODg4OAkJICAgKDA8PDMpIC8qIFNVUkZBQ0VfMzJCSVQgKi8KKyNkZWZpbmUgICAgTVRfMzJCSVRfQVJHQjg4ODgJCSAgICgwPDwzKSAgICAgICAvKiBTVVJGQUNFXzMyQklUICovCiAjZGVmaW5lICAgIE1UXzMyQklUX0FCR1I4ODg4CQkgICAoMTw8MykKICNkZWZpbmUgICAgTVRfMzJCSVRfWFJHQjg4ODgJCSAgICgyPDwzKQogI2RlZmluZSAgICBNVF8zMkJJVF9YQkdSODg4OAkJICAgKDM8PDMpCkBAIC03MjUsMTEgKzYzOCwxMSBAQAogI2RlZmluZSAgICBNVF8zMkJJVF94STgyNAkgICAgICAgICAgICgweEQ8PDMpCiAjZGVmaW5lICAgIE1UXzMyQklUX3hBODI0CSAgICAgICAgICAgKDB4RTw8MykKICNkZWZpbmUgICAgTVRfMzJCSVRfeEw4MjQJICAgICAgICAgICAoMHhGPDwzKQotI2RlZmluZSAgICBNVF80MjJfWUNSQ0JfU1dBUFkJICAgICAgICAgICAoMDw8MykgLyogU1VSRkFDRV80MjIgKi8KKyNkZWZpbmUgICAgTVRfNDIyX1lDUkNCX1NXQVBZCSAgICAgICAgICAgKDA8PDMpICAgICAgIC8qIFNVUkZBQ0VfNDIyICovCiAjZGVmaW5lICAgIE1UXzQyMl9ZQ1JDQl9OT1JNQUwJICAgICAgICAgICAoMTw8MykKICNkZWZpbmUgICAgTVRfNDIyX1lDUkNCX1NXQVBVVgkgICAgICAgICAgICgyPDwzKQogI2RlZmluZSAgICBNVF80MjJfWUNSQ0JfU1dBUFVWWQkgICAgICAgICAgICgzPDwzKQotI2RlZmluZSAgICBNVF9DT01QUkVTU19EWFQxCQkgICAoMDw8MykgLyogU1VSRkFDRV9DT01QUkVTU0VEICovCisjZGVmaW5lICAgIE1UX0NPTVBSRVNTX0RYVDEJCSAgICgwPDwzKSAgICAgICAvKiBTVVJGQUNFX0NPTVBSRVNTRUQgKi8KICNkZWZpbmUgICAgTVRfQ09NUFJFU1NfRFhUMl8zCSAgICAgICAgICAgKDE8PDMpCiAjZGVmaW5lICAgIE1UX0NPTVBSRVNTX0RYVDRfNQkgICAgICAgICAgICgyPDwzKQogI2RlZmluZSAgICBNVF9DT01QUkVTU19GWFQxCQkgICAoMzw8MykKQEAgLTc1MSw3ICs2NjQsNyBAQAogI2RlZmluZSBNUzRfTUlQX0xBWU9VVF9MRUdBQ1kgICAgICAgICAgICgwPDw4KQogI2RlZmluZSBNUzRfTUlQX0xBWU9VVF9CRUxPV19MUFQgICAgICAgICgwPDw4KQogI2RlZmluZSBNUzRfTUlQX0xBWU9VVF9SSUdIVF9MUFQgICAgICAgICgxPDw4KQotI2RlZmluZSBNUzRfVk9MVU1FX0RFUFRIX1NISUZUICAgICAgICAgIDAgICAgCisjZGVmaW5lIE1TNF9WT0xVTUVfREVQVEhfU0hJRlQgICAgICAgICAgMAogI2RlZmluZSBNUzRfVk9MVU1FX0RFUFRIX01BU0sgICAgICAgICAgICgweGZmPDwwKQogCiAvKiBwMjQ0ICovCkBAIC03NzksNyArNjkyLDcgQEAKICNkZWZpbmUgICBGSUxURVJfNFg0XzEgICAgCTMKICNkZWZpbmUgICBGSUxURVJfNFg0XzIgICAgCTQKICNkZWZpbmUgICBGSUxURVJfNFg0X0ZMQVQgCTUKLSNkZWZpbmUgICBGSUxURVJfNlg1X01PTk8gICAJNiAvKiBYWFggLSBjaGVjayAqLworI2RlZmluZSAgIEZJTFRFUl82WDVfTU9OTyAgIAk2ICAgICAgIC8qIFhYWCAtIGNoZWNrICovCiAjZGVmaW5lIFNTMl9NSU5fRklMVEVSX1NISUZUICAgICAgICAgIDE0CiAjZGVmaW5lIFNTMl9NSU5fRklMVEVSX01BU0sgICAgICAgICAgICgweDc8PDE0KQogI2RlZmluZSBTUzJfTE9EX0JJQVNfU0hJRlQgICAgICAgICAgICA1CkBAIC04MjYsMTAgKzczOSw4IEBACiAjZGVmaW5lIFNUMV9FTkFCTEUgICAgICAgICAgICAgICAoMTw8MTYpCiAjZGVmaW5lIFNUMV9NQVNLICAgICAgICAgICAgICAgICAoMHhmZmZmKQogCi0KLSNkZWZpbmUgTUlfRkxVU0ggICAgICAgICAgICgoMDw8MjkpfCg0PDwyMykpCi0jZGVmaW5lIEZMVVNIX01BUF9DQUNIRSAgICAoMTw8MCkKLSNkZWZpbmUgRkxVU0hfUkVOREVSX0NBQ0hFICgxPDwxKQotCisjZGVmaW5lIF8zRFNUQVRFX0RFRkFVTFRfWiAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4OTg8PDE2KSkKKyNkZWZpbmUgXzNEU1RBVEVfREVGQVVMVF9ESUZGVVNFICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg5OTw8MTYpKQorI2RlZmluZSBfM0RTVEFURV9ERUZBVUxUX1NQRUNVTEFSICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDlhPDwxNikpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfc3RhdGUuYwppbmRleCAxYzRlYzc0Li5jODE0ZjhkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfc3RhdGUuYwpAQCAtMzgsOTcgKzM4LDk5IEBACiAKICNpbmNsdWRlICJkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5oIgogCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCiAjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKIAogI2luY2x1ZGUgImk5MTVfY29udGV4dC5oIgogI2luY2x1ZGUgImk5MTVfcmVnLmgiCiAKLQorI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfU1RBVEUKIAogc3RhdGljIHZvaWQKLWk5MTVTdGVuY2lsRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwKK2k5MTVTdGVuY2lsRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbWFzaykKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKLSAgIGludCB0ZXN0ID0gaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyggZnVuYyApOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgaW50IHRlc3QgPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGZ1bmMpOwogCiAgICBtYXNrID0gbWFzayAmIDB4ZmY7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIDogZnVuYzogJXMsIHJlZiA6IDB4JXgsIG1hc2s6IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywKLQkgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihmdW5jKSwgcmVmLCBtYXNrKTsKKyAgIERCRygiJXMgOiBmdW5jOiAlcywgcmVmIDogMHgleCwgbWFzazogMHgleFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGZ1bmMpLCByZWYsIG1hc2spOwogCiAKICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19TVEFURTRdICY9IH5NT0RFNF9FTkFCTEVfU1RFTkNJTF9URVNUX01BU0s7CiAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XSB8PSAoRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLIHwKLQkJCQkJIFNURU5DSUxfVEVTVF9NQVNLKG1hc2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1RFU1RfTUFTSyhtYXNrKSk7CiAKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM1XSAmPSB+KFM1X1NURU5DSUxfUkVGX01BU0sgfAotCQkJCQlTNV9TVEVOQ0lMX1RFU1RfRlVOQ19NQVNLKTsKLQkJCQkJCi0gICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gKChyZWYgPDwgUzVfU1RFTkNJTF9SRUZfU0hJRlQpIHwgIAotIAkJCQkgICAgICAgKHRlc3QgPDwgUzVfU1RFTkNJTF9URVNUX0ZVTkNfU0hJRlQpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1RFU1RfRlVOQ19NQVNLKTsKKworICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdIHw9ICgocmVmIDw8IFM1X1NURU5DSUxfUkVGX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0IDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1RFU1RfRlVOQ19TSElGVCkpOwogfQogCiBzdGF0aWMgdm9pZAotaTkxNVN0ZW5jaWxNYXNrU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykKK2k5MTVTdGVuY2lsTWFza1NlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyA6IG1hc2sgMHgleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKLQorICAgREJHKCIlcyA6IG1hc2sgMHgleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKKyAgIAogICAgbWFzayA9IG1hc2sgJiAweGZmOwogCiAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7CiAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XSAmPSB+TU9ERTRfRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSzsKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19TVEFURTRdIHw9IChFTkFCTEVfU1RFTkNJTF9XUklURV9NQVNLIHwKLQkJCQkJU1RFTkNJTF9XUklURV9NQVNLKG1hc2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVOQ0lMX1dSSVRFX01BU0sobWFzaykpOwogfQogCiAKIHN0YXRpYyB2b2lkCi1pOTE1U3RlbmNpbE9wU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLAoraTkxNVN0ZW5jaWxPcFNlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHpwYXNzKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwotICAgaW50IGZvcCA9IGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKGZhaWwpOyAKLSAgIGludCBkZm9wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoemZhaWwpOyAKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIGludCBmb3AgPSBpbnRlbF90cmFuc2xhdGVfc3RlbmNpbF9vcChmYWlsKTsKKyAgIGludCBkZm9wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoemZhaWwpOwogICAgaW50IGRwb3AgPSBpbnRlbF90cmFuc2xhdGVfc3RlbmNpbF9vcCh6cGFzcyk7CiAKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGZhaWwgOiAlcywgemZhaWw6ICVzLCB6cGFzcyA6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoZmFpbCksCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoemZhaWwpLAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHpwYXNzKSk7CisgICBEQkcoIiVzOiBmYWlsIDogJXMsIHpmYWlsOiAlcywgenBhc3MgOiAlc1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGZhaWwpLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHpmYWlsKSwgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoenBhc3MpKTsKIAogICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9DVFgpOwogCiAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gJj0gfihTNV9TVEVOQ0lMX0ZBSUxfTUFTSyB8Ci0JCQkJCVM1X1NURU5DSUxfUEFTU19aX0ZBSUxfTUFTSyB8Ci0JCQkJCVM1X1NURU5DSUxfUEFTU19aX1BBU1NfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1BBU1NfWl9GQUlMX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzVfU1RFTkNJTF9QQVNTX1pfUEFTU19NQVNLKTsKIAogICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdIHw9ICgoZm9wIDw8IFM1X1NURU5DSUxfRkFJTF9TSElGVCkgfAotCQkJCSAgICAgICAoZGZvcCA8PCBTNV9TVEVOQ0lMX1BBU1NfWl9GQUlMX1NISUZUKSB8Ci0JCQkJICAgICAgIChkcG9wIDw8IFM1X1NURU5DSUxfUEFTU19aX1BBU1NfU0hJRlQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRmb3AgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM1X1NURU5DSUxfUEFTU19aX0ZBSUxfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRwb3AgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM1X1NURU5DSUxfUEFTU19aX1BBU1NfU0hJRlQpKTsKIH0KIAotc3RhdGljIHZvaWQgaTkxNUFscGhhRnVuYyhHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZ1bmMsIEdMZmxvYXQgcmVmKQorc3RhdGljIHZvaWQKK2k5MTVBbHBoYUZ1bmMoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0gICBpbnQgdGVzdCA9IGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoIGZ1bmMgKTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIGludCB0ZXN0ID0gaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhmdW5jKTsKICAgIEdMdWJ5dGUgcmVmQnl0ZTsKIAogICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKHJlZkJ5dGUsIHJlZik7CiAKICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmPSB+KFM2X0FMUEhBX1RFU1RfRlVOQ19NQVNLIHwKLQkJCQkJUzZfQUxQSEFfUkVGX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzZfQUxQSEFfUkVGX01BU0spOwogICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdIHw9ICgodGVzdCA8PCBTNl9BTFBIQV9URVNUX0ZVTkNfU0hJRlQpIHwKLQkJCQkgICAgICAgKCgoR0x1aW50KXJlZkJ5dGUpIDw8IFM2X0FMUEhBX1JFRl9TSElGVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChHTHVpbnQpIHJlZkJ5dGUpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNl9BTFBIQV9SRUZfU0hJRlQpKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIHByb3BlciBlbmFibGVzIGFyZQpAQCAtMTM3LDQxICsxMzksNDUgQEAKICAqIGNvdWxkIGNoYW5nZSB0aGUgTG9naWNPcCBvciBJbmRlcGVuZGFudCBBbHBoYSBCbGVuZCB3aXRob3V0IHN1YnNlcXVlbnQKICAqIGNhbGxzIHRvIGdsRW5hYmxlLgogICovCi1zdGF0aWMgdm9pZCBpOTE1RXZhbExvZ2ljT3BCbGVuZFN0YXRlKEdMY29udGV4dCAqY3R4KQorc3RhdGljIHZvaWQKK2k5MTVFdmFsTG9naWNPcEJsZW5kU3RhdGUoR0xjb250ZXh0ICogY3R4KQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogCiAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7CiAKICAgIGlmIChSR0JBX0xPR0lDT1BfRU5BQkxFRChjdHgpKSB7CiAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gUzVfTE9HSUNPUF9FTkFCTEU7CiAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gJj0gflM2X0NCVUZfQkxFTkRfRU5BQkxFOwotICAgfSBlbHNlIHsKKyAgIH0KKyAgIGVsc2UgewogICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH5TNV9MT0dJQ09QX0VOQUJMRTsKIAogICAgICAgaWYgKGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkKSB7Ci0JIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSB8PSBTNl9DQlVGX0JMRU5EX0VOQUJMRTsKLSAgICAgIH0gZWxzZSB7Ci0JIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmPSB+UzZfQ0JVRl9CTEVORF9FTkFCTEU7CisgICAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gfD0gUzZfQ0JVRl9CTEVORF9FTkFCTEU7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmPSB+UzZfQ0JVRl9CTEVORF9FTkFCTEU7CiAgICAgICB9CiAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVCbGVuZENvbG9yKEdMY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IGNvbG9yWzRdKQorc3RhdGljIHZvaWQKK2k5MTVCbGVuZENvbG9yKEdMY29udGV4dCAqIGN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKICAgIEdMdWJ5dGUgciwgZywgYiwgYTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShyLCBjb2xvcltSQ09NUF0pOwogICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGcsIGNvbG9yW0dDT01QXSk7CiAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoYiwgY29sb3JbQkNPTVBdKTsKICAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShhLCBjb2xvcltBQ09NUF0pOwogCiAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7Ci0gICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfQkxFTkRDT0xPUjFdID0gKGE8PDI0KSB8IChyPDwxNikgfCAoZzw8OCkgfCBiOworICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0JMRU5EQ09MT1IxXSA9CisgICAgICAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CiB9CiAKIApAQCAtMTgyLDMxICsxODgsMzcgQEAKIAogCiAKLXN0YXRpYyBHTHVpbnQgdHJhbnNsYXRlX2JsZW5kX2VxdWF0aW9uKCBHTGVudW0gbW9kZSApCitzdGF0aWMgR0x1aW50Cit0cmFuc2xhdGVfYmxlbmRfZXF1YXRpb24oR0xlbnVtIG1vZGUpCiB7CiAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgIGNhc2UgR0xfRlVOQ19BREQ6IHJldHVybiBCTEVOREZVTkNfQUREOyAKLSAgIGNhc2UgR0xfTUlOOiByZXR1cm4gQkxFTkRGVU5DX01JTjsgCi0gICBjYXNlIEdMX01BWDogcmV0dXJuIEJMRU5ERlVOQ19NQVg7IAotICAgY2FzZSBHTF9GVU5DX1NVQlRSQUNUOiByZXR1cm4gQkxFTkRGVU5DX1NVQlRSQUNUOyAKLSAgIGNhc2UgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUOiByZXR1cm4gQkxFTkRGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q7IAotICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICBjYXNlIEdMX0ZVTkNfQUREOgorICAgICAgcmV0dXJuIEJMRU5ERlVOQ19BREQ7CisgICBjYXNlIEdMX01JTjoKKyAgICAgIHJldHVybiBCTEVOREZVTkNfTUlOOworICAgY2FzZSBHTF9NQVg6CisgICAgICByZXR1cm4gQkxFTkRGVU5DX01BWDsKKyAgIGNhc2UgR0xfRlVOQ19TVUJUUkFDVDoKKyAgICAgIHJldHVybiBCTEVOREZVTkNfU1VCVFJBQ1Q7CisgICBjYXNlIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVDoKKyAgICAgIHJldHVybiBCTEVOREZVTkNfUkVWRVJTRV9TVUJUUkFDVDsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaTkxNVVwZGF0ZUJsZW5kU3RhdGUoIEdMY29udGV4dCAqY3R4ICkKK3N0YXRpYyB2b2lkCitpOTE1VXBkYXRlQmxlbmRTdGF0ZShHTGNvbnRleHQgKiBjdHgpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0gICBHTHVpbnQgaWFiID0gKGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19JQUJdICYgCi0JCSB+KElBQl9TUkNfRkFDVE9SX01BU0sgfAotCQkgICBJQUJfRFNUX0ZBQ1RPUl9NQVNLIHwKLQkJICAgKEJMRU5ERlVOQ19NQVNLIDw8IElBQl9GVU5DX1NISUZUKSB8Ci0JCSAgIElBQl9FTkFCTEUpKTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIEdMdWludCBpYWIgPSAoaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0lBQl0gJgorICAgICAgICAgICAgICAgICB+KElBQl9TUkNfRkFDVE9SX01BU0sgfAorICAgICAgICAgICAgICAgICAgIElBQl9EU1RfRkFDVE9SX01BU0sgfAorICAgICAgICAgICAgICAgICAgIChCTEVOREZVTkNfTUFTSyA8PCBJQUJfRlVOQ19TSElGVCkgfCBJQUJfRU5BQkxFKSk7CiAKLSAgIEdMdWludCBsaXM2ID0gKGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmIAotCQkgIH4oUzZfQ0JVRl9TUkNfQkxFTkRfRkFDVF9NQVNLIHwKLQkJICAgIFM2X0NCVUZfRFNUX0JMRU5EX0ZBQ1RfTUFTSyB8Ci0JCSAgICBTNl9DQlVGX0JMRU5EX0ZVTkNfTUFTSykpOworICAgR0x1aW50IGxpczYgPSAoaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdICYKKyAgICAgICAgICAgICAgICAgIH4oUzZfQ0JVRl9TUkNfQkxFTkRfRkFDVF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgUzZfQ0JVRl9EU1RfQkxFTkRfRkFDVF9NQVNLIHwgUzZfQ0JVRl9CTEVORF9GVU5DX01BU0spKTsKIAogICAgR0x1aW50IGVxUkdCID0gY3R4LT5Db2xvci5CbGVuZEVxdWF0aW9uUkdCOwogICAgR0x1aW50IGVxQSA9IGN0eC0+Q29sb3IuQmxlbmRFcXVhdGlvbkE7CkBAIC0yMjMsMTUgKzIzNSwxNSBAQAogICAgICAgc3JjQSA9IGRzdEEgPSBHTF9PTkU7CiAgICB9CiAKLSAgIGxpczYgfD0gU1JDX0JMTkRfRkFDVChpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKHNyY1JHQikpOyAKLSAgIGxpczYgfD0gRFNUX0JMTkRfRkFDVChpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKGRzdFJHQikpOyAKLSAgIGxpczYgfD0gdHJhbnNsYXRlX2JsZW5kX2VxdWF0aW9uKCBlcVJHQiApIDw8IFM2X0NCVUZfQkxFTkRfRlVOQ19TSElGVDsKKyAgIGxpczYgfD0gU1JDX0JMTkRfRkFDVChpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKHNyY1JHQikpOworICAgbGlzNiB8PSBEU1RfQkxORF9GQUNUKGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoZHN0UkdCKSk7CisgICBsaXM2IHw9IHRyYW5zbGF0ZV9ibGVuZF9lcXVhdGlvbihlcVJHQikgPDwgUzZfQ0JVRl9CTEVORF9GVU5DX1NISUZUOwogCi0gICBpYWIgfD0gU1JDX0FCTE5EX0ZBQ1QoaW50ZWxfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvcihzcmNBKSk7IAotICAgaWFiIHw9IERTVF9BQkxORF9GQUNUKGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoZHN0QSkpOyAKLSAgIGlhYiB8PSB0cmFuc2xhdGVfYmxlbmRfZXF1YXRpb24oIGVxQSApIDw8IElBQl9GVU5DX1NISUZUOworICAgaWFiIHw9IFNSQ19BQkxORF9GQUNUKGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3Ioc3JjQSkpOworICAgaWFiIHw9IERTVF9BQkxORF9GQUNUKGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoZHN0QSkpOworICAgaWFiIHw9IHRyYW5zbGF0ZV9ibGVuZF9lcXVhdGlvbihlcUEpIDw8IElBQl9GVU5DX1NISUZUOwogCi0gICBpZiAoc3JjQSAhPSBzcmNSR0IgfHwgZHN0QSAhPSBkc3RSR0IgfHwgZXFBICE9IGVxUkdCKSAKKyAgIGlmIChzcmNBICE9IHNyY1JHQiB8fCBkc3RBICE9IGRzdFJHQiB8fCBlcUEgIT0gZXFSR0IpCiAgICAgICBpYWIgfD0gSUFCX0VOQUJMRTsKIAogICAgaWYgKGlhYiAhPSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfSUFCXSB8fApAQCAtMjQ2LDQxICsyNTgsNDEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpOTE1QmxlbmRGdW5jU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBzcmNSR0IsIAotCQkJCSBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQSwKLQkJCQkgR0xlbnVtIGRzdEEgKQoteyAgCi0gICBpOTE1VXBkYXRlQmxlbmRTdGF0ZSggY3R4ICk7CitzdGF0aWMgdm9pZAoraTkxNUJsZW5kRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHNyY1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQSwgR0xlbnVtIGRzdEEpCit7CisgICBpOTE1VXBkYXRlQmxlbmRTdGF0ZShjdHgpOwogfQogCiAKLXN0YXRpYyB2b2lkIGk5MTVCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBlcVJHQiwKLQkJCQkgICAgIEdMZW51bSBlcUEpIAorc3RhdGljIHZvaWQKK2k5MTVCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gZXFSR0IsIEdMZW51bSBlcUEpCiB7Ci0gICBpOTE1VXBkYXRlQmxlbmRTdGF0ZSggY3R4ICk7CisgICBpOTE1VXBkYXRlQmxlbmRTdGF0ZShjdHgpOwogfQogCiAKLXN0YXRpYyB2b2lkIGk5MTVEZXB0aEZ1bmMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKQorc3RhdGljIHZvaWQKK2k5MTVEZXB0aEZ1bmMoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gZnVuYykKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKLSAgIGludCB0ZXN0ID0gaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyggZnVuYyApOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgaW50IHRlc3QgPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGZ1bmMpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQorICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgIAogICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9DVFgpOwogICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdICY9IH5TNl9ERVBUSF9URVNUX0ZVTkNfTUFTSzsKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSB8PSB0ZXN0IDw8IFM2X0RFUFRIX1RFU1RfRlVOQ19TSElGVDsKIH0KIAotc3RhdGljIHZvaWQgaTkxNURlcHRoTWFzayhHTGNvbnRleHQgKmN0eCwgR0xib29sZWFuIGZsYWcpCitzdGF0aWMgdm9pZAoraTkxNURlcHRoTWFzayhHTGNvbnRleHQgKiBjdHgsIEdMYm9vbGVhbiBmbGFnKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBmbGFnICglZClcbiIsIF9fRlVOQ1RJT05fXywgZmxhZyk7Ci0KKyAgIERCRygiJXMgZmxhZyAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZsYWcpOworICAgCiAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7CiAKICAgIGlmIChmbGFnICYmIGN0eC0+RGVwdGguVGVzdCkKQEAgLTI5NSwxNCArMzA3LDE1IEBACiAgKiBUaGUgaTkxNSBzdXBwb3J0cyBhIDR4NCBzdGlwcGxlIG5hdGl2ZWx5LCBHTCB3YW50cyAzMngzMi4KICAqIEZvcnR1bmF0ZWx5IHN0aXBwbGUgaXMgdXN1YWxseSBhIHJlcGVhdGluZyBwYXR0ZXJuLgogICovCi1zdGF0aWMgdm9pZCBpOTE1UG9seWdvblN0aXBwbGUoIEdMY29udGV4dCAqY3R4LCBjb25zdCBHTHVieXRlICptYXNrICkKK3N0YXRpYyB2b2lkCitpOTE1UG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICogY3R4LCBjb25zdCBHTHVieXRlICogbWFzaykKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKLSAgIGNvbnN0IEdMdWJ5dGUgKm0gPSBtYXNrOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgY29uc3QgR0x1Ynl0ZSAqbTsKICAgIEdMdWJ5dGUgcFs0XTsKLSAgIGludCBpLGosazsKKyAgIGludCBpLCBqLCBrOwogICAgaW50IGFjdGl2ZSA9IChjdHgtPlBvbHlnb24uU3RpcHBsZUZsYWcgJiYKLQkJIGk5MTUtPmludGVsLnJlZHVjZWRfcHJpbWl0aXZlID09IEdMX1RSSUFOR0xFUyk7CisgICAgICAgICAgICAgICAgIGk5MTUtPmludGVsLnJlZHVjZWRfcHJpbWl0aXZlID09IEdMX1RSSUFOR0xFUyk7CiAgICBHTHVpbnQgbmV3TWFzazsKIAogICAgaWYgKGFjdGl2ZSkgewpAQCAtMzEwLDIzICszMjMsMzIgQEAKICAgICAgIGk5MTUtPnN0YXRlLlN0aXBwbGVbSTkxNV9TVFBSRUdfU1QxXSAmPSB+U1QxX0VOQUJMRTsKICAgIH0KIAotICAgcFswXSA9IG1hc2tbMTJdICYgMHhmOyBwWzBdIHw9IHBbMF0gPDwgNDsKLSAgIHBbMV0gPSBtYXNrWzhdICYgMHhmOyBwWzFdIHw9IHBbMV0gPDwgNDsKLSAgIHBbMl0gPSBtYXNrWzRdICYgMHhmOyBwWzJdIHw9IHBbMl0gPDwgNDsKLSAgIHBbM10gPSBtYXNrWzBdICYgMHhmOyBwWzNdIHw9IHBbM10gPDwgNDsKKyAgIC8qIFVzZSB0aGUgYWxyZWFkeSB1bnBhY2tlZCBzdGlwcGxlIGRhdGEgZnJvbSB0aGUgY29udGV4dCByYXRoZXIgdGhhbiB0aGUKKyAgICAqIHVuaW50ZXJwcmV0ZWQgbWFzayBwYXNzZWQgaW4uCisgICAgKi8KKyAgIG1hc2sgPSAoY29uc3QgR0x1Ynl0ZSAqKWN0eC0+UG9seWdvblN0aXBwbGU7CisgICBtID0gbWFzazsKIAotICAgZm9yIChrID0gMCA7IGsgPCA4IDsgaysrKQotICAgICAgZm9yIChqID0gMyA7IGogPj0gMDsgai0tKQotCSBmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyssIG0rKykKLQkgICAgaWYgKCptICE9IHBbal0pIHsKLQkgICAgICAgaTkxNS0+aW50ZWwuaHdfc3RpcHBsZSA9IDA7Ci0JICAgICAgIHJldHVybjsKLQkgICAgfQorICAgcFswXSA9IG1hc2tbMTJdICYgMHhmOworICAgcFswXSB8PSBwWzBdIDw8IDQ7CisgICBwWzFdID0gbWFza1s4XSAmIDB4ZjsKKyAgIHBbMV0gfD0gcFsxXSA8PCA0OworICAgcFsyXSA9IG1hc2tbNF0gJiAweGY7CisgICBwWzJdIHw9IHBbMl0gPDwgNDsKKyAgIHBbM10gPSBtYXNrWzBdICYgMHhmOworICAgcFszXSB8PSBwWzNdIDw8IDQ7CisKKyAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICBmb3IgKGogPSAzOyBqID49IDA7IGotLSkKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIG0rKykKKyAgICAgICAgICAgIGlmICgqbSAhPSBwW2pdKSB7CisgICAgICAgICAgICAgICBpOTE1LT5pbnRlbC5od19zdGlwcGxlID0gMDsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgbmV3TWFzayA9ICgoKHBbMF0gJiAweGYpIDw8IDApIHwKLQkgICAgICAoKHBbMV0gJiAweGYpIDw8IDQpIHwKLQkgICAgICAoKHBbMl0gJiAweGYpIDw8IDgpIHwKLQkgICAgICAoKHBbM10gJiAweGYpIDw8IDEyKSk7CisgICAgICAgICAgICAgICgocFsxXSAmIDB4ZikgPDwgNCkgfAorICAgICAgICAgICAgICAoKHBbMl0gJiAweGYpIDw8IDgpIHwgKChwWzNdICYgMHhmKSA8PCAxMikpOwogCiAKICAgIGlmIChuZXdNYXNrID09IDB4ZmZmZiB8fCBuZXdNYXNrID09IDB4MCkgewpAQCAtMzQ3LDQ5ICszNjksNTQgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEhhcmR3YXJlIGNsaXBwaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGk5MTVTY2lzc29yKEdMY29udGV4dCAqY3R4LCBHTGludCB4LCBHTGludCB5LCAKLQkJCUdMc2l6ZWkgdywgR0xzaXplaSBoKQorc3RhdGljIHZvaWQKK2k5MTVTY2lzc29yKEdMY29udGV4dCAqIGN0eCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGk5MTUtPmludGVsLmludGVsU2NyZWVuOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogICAgaW50IHgxLCB5MSwgeDIsIHkyOwogCi0gICBpZiAoIWk5MTUtPmludGVsLmRyaURyYXdhYmxlKQorICAgaWYgKCFjdHgtPkRyYXdCdWZmZXIpCiAgICAgICByZXR1cm47CiAKLSAgIHgxID0geDsKLSAgIHkxID0gaTkxNS0+aW50ZWwuZHJpRHJhd2FibGUtPmggLSAoeSArIGgpOwotICAgeDIgPSB4ICsgdyAtIDE7Ci0gICB5MiA9IHkxICsgaCAtIDE7CisgICBEQkcoIiVzICVkLCVkICVkeCVkXG4iLCBfX0ZVTkNUSU9OX18sIHgsIHksIHcsIGgpOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdIHgoJWQpIHkoJWQpIHcoJWQpIGgoJWQpXG4iLCBfX0ZVTkNUSU9OX18sCi0JICAgICAgeCwgeSwgdywgaCk7Ci0KLSAgIGlmICh4MSA8IDApIHgxID0gMDsKLSAgIGlmICh5MSA8IDApIHkxID0gMDsKLSAgIGlmICh4MiA8IDApIHgyID0gMDsKLSAgIGlmICh5MiA8IDApIHkyID0gMDsKLQotICAgaWYgKHgyID49IHNjcmVlbi0+d2lkdGgpIHgyID0gc2NyZWVuLT53aWR0aC0xOwotICAgaWYgKHkyID49IHNjcmVlbi0+aGVpZ2h0KSB5MiA9IHNjcmVlbi0+aGVpZ2h0LTE7Ci0gICBpZiAoeDEgPj0gc2NyZWVuLT53aWR0aCkgeDEgPSBzY3JlZW4tPndpZHRoLTE7Ci0gICBpZiAoeTEgPj0gc2NyZWVuLT5oZWlnaHQpIHkxID0gc2NyZWVuLT5oZWlnaHQtMTsKLQorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+TmFtZSA9PSAwKSB7CisgICAgICB4MSA9IHg7CisgICAgICB5MSA9IGN0eC0+RHJhd0J1ZmZlci0+SGVpZ2h0IC0gKHkgKyBoKTsKKyAgICAgIHgyID0geCArIHcgLSAxOworICAgICAgeTIgPSB5MSArIGggLSAxOworICAgICAgREJHKCIlcyAlZC4uJWQsJWQuLiVkIChpbnZlcnRlZClcbiIsIF9fRlVOQ1RJT05fXywgeDEsIHgyLCB5MSwgeTIpOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBGQk8gLSBub3QgaW52ZXJ0ZWQKKyAgICAgICAqLworICAgICAgeDEgPSB4OworICAgICAgeTEgPSB5OworICAgICAgeDIgPSB4ICsgdyAtIDE7CisgICAgICB5MiA9IHkgKyBoIC0gMTsKKyAgICAgIERCRygiJXMgJWQuLiVkLCVkLi4lZCAobm90IGludmVydGVkKVxuIiwgX19GVU5DVElPTl9fLCB4MSwgeDIsIHkxLCB5Mik7CisgICB9CisgICAKKyAgIHgxID0gQ0xBTVAoeDEsIDAsIGN0eC0+RHJhd0J1ZmZlci0+V2lkdGggLSAxKTsKKyAgIHkxID0gQ0xBTVAoeTEsIDAsIGN0eC0+RHJhd0J1ZmZlci0+SGVpZ2h0IC0gMSk7CisgICB4MiA9IENMQU1QKHgyLCAwLCBjdHgtPkRyYXdCdWZmZXItPldpZHRoIC0gMSk7CisgICB5MiA9IENMQU1QKHkyLCAwLCBjdHgtPkRyYXdCdWZmZXItPkhlaWdodCAtIDEpOworICAgCisgICBEQkcoIiVzICVkLi4lZCwlZC4uJWQgKGNsYW1wZWQpXG4iLCBfX0ZVTkNUSU9OX18sIHgxLCB4MiwgeTEsIHkyKTsKIAogICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9CVUZGRVJTKTsKICAgIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfU1IxXSA9ICh5MSA8PCAxNikgfCAoeDEgJiAweGZmZmYpOwogICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TUjJdID0gKHkyIDw8IDE2KSB8ICh4MiAmIDB4ZmZmZik7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVMb2dpY09wKEdMY29udGV4dCAqY3R4LCBHTGVudW0gb3Bjb2RlKQorc3RhdGljIHZvaWQKK2k5MTVMb2dpY09wKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIG9wY29kZSkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKICAgIGludCB0bXAgPSBpbnRlbF90cmFuc2xhdGVfbG9naWNfb3Aob3Bjb2RlKTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19TVEFURTRdICY9IH5MT0dJQ09QX01BU0s7CiAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfU1RBVEU0XSB8PSBMT0dJQ19PUF9GVU5DKHRtcCk7CkBAIC0zOTcsMTMgKzQyNCwxNCBAQAogCiAKIAotc3RhdGljIHZvaWQgaTkxNUN1bGxGYWNlRnJvbnRGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdW51c2VkKQorc3RhdGljIHZvaWQKK2k5MTVDdWxsRmFjZUZyb250RmFjZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB1bnVzZWQpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7CiAgICBHTHVpbnQgbW9kZTsKIAotICAgaWYgKElOVEVMX0RFQlVHJkRFQlVHX0RSSSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICBEQkcoIiVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgY3R4LT5EcmF3QnVmZmVyID8gY3R4LT5EcmF3QnVmZmVyLT5OYW1lIDogMCk7CiAKICAgIGlmICghY3R4LT5Qb2x5Z29uLkN1bGxGbGFnKSB7CiAgICAgICBtb2RlID0gUzRfQ1VMTE1PREVfTk9ORTsKQEAgLTQxMSwxMCArNDM5LDEyIEBACiAgICBlbHNlIGlmIChjdHgtPlBvbHlnb24uQ3VsbEZhY2VNb2RlICE9IEdMX0ZST05UX0FORF9CQUNLKSB7CiAgICAgICBtb2RlID0gUzRfQ1VMTE1PREVfQ1c7CiAKKyAgICAgIGlmIChjdHgtPkRyYXdCdWZmZXIgJiYgY3R4LT5EcmF3QnVmZmVyLT5OYW1lICE9IDApCisgICAgICAgICBtb2RlIF49IChTNF9DVUxMTU9ERV9DVyBeIFM0X0NVTExNT0RFX0NDVyk7CiAgICAgICBpZiAoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZSA9PSBHTF9GUk9OVCkKLQkgbW9kZSBePSAoUzRfQ1VMTE1PREVfQ1cgXiBTNF9DVUxMTU9ERV9DQ1cpOworICAgICAgICAgbW9kZSBePSAoUzRfQ1VMTE1PREVfQ1cgXiBTNF9DVUxMTU9ERV9DQ1cpOwogICAgICAgaWYgKGN0eC0+UG9seWdvbi5Gcm9udEZhY2UgIT0gR0xfQ0NXKQotCSBtb2RlIF49IChTNF9DVUxMTU9ERV9DVyBeIFM0X0NVTExNT0RFX0NDVyk7CisgICAgICAgICBtb2RlIF49IChTNF9DVUxMTU9ERV9DVyBeIFM0X0NVTExNT0RFX0NDVyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgIG1vZGUgPSBTNF9DVUxMTU9ERV9CT1RIOwpAQCAtNDI1LDE2ICs0NTUsMTYgQEAKICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSB8PSBtb2RlOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1TGluZVdpZHRoKCBHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCB3aWR0aGYgKQorc3RhdGljIHZvaWQKK2k5MTVMaW5lV2lkdGgoR0xjb250ZXh0ICogY3R4LCBHTGZsb2F0IHdpZHRoZikKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoIGN0eCApOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogICAgaW50IGxpczQgPSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gJiB+UzRfTElORV9XSURUSF9NQVNLOwogICAgaW50IHdpZHRoOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgd2lkdGggPSAoaW50KSh3aWR0aGYgKiAyKTsKKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAKKyAgIHdpZHRoID0gKGludCkgKHdpZHRoZiAqIDIpOwogICAgQ0xBTVBfU0VMRih3aWR0aCwgMSwgMHhmKTsKICAgIGxpczQgfD0gd2lkdGggPDwgUzRfTElORV9XSURUSF9TSElGVDsKIApAQCAtNDQ0LDE1ICs0NzQsMTUgQEAKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaTkxNVBvaW50U2l6ZShHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBzaXplKQorc3RhdGljIHZvaWQKK2k5MTVQb2ludFNpemUoR0xjb250ZXh0ICogY3R4LCBHTGZsb2F0IHNpemUpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7CiAgICBpbnQgbGlzNCA9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSAmIH5TNF9QT0lOVF9XSURUSF9NQVNLOwotICAgR0xpbnQgcG9pbnRfc2l6ZSA9IChpbnQpc2l6ZTsKKyAgIEdMaW50IHBvaW50X3NpemUgPSAoaW50KSBzaXplOwogCi0gICBpZiAoSU5URUxfREVCVUcmREVCVUdfRFJJKQotICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgCiAgICBDTEFNUF9TRUxGKHBvaW50X3NpemUsIDEsIDI1NSk7CiAgICBsaXM0IHw9IHBvaW50X3NpemUgPDwgUzRfUE9JTlRfV0lEVEhfU0hJRlQ7CiAKQEAgLTQ2NywyMCArNDk3LDI0IEBACiAgKiBDb2xvciBtYXNrcwogICovCiAKLXN0YXRpYyB2b2lkIGk5MTVDb2xvck1hc2soR0xjb250ZXh0ICpjdHgsCi0JCQkgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLAotCQkJIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkKK3N0YXRpYyB2b2lkCitpOTE1Q29sb3JNYXNrKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKCBjdHggKTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKICAgIEdMdWludCB0bXAgPSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gJiB+UzVfV1JJVEVESVNBQkxFX01BU0s7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIHIoJWQpIGcoJWQpIGIoJWQpIGEoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHIsIGcsIGIsIGEpOworICAgREJHKCIlcyByKCVkKSBnKCVkKSBiKCVkKSBhKCVkKVxuIiwgX19GVU5DVElPTl9fLCByLCBnLCBiLAorICAgICAgIGEpOwogCi0gICBpZiAoIXIpIHRtcCB8PSBTNV9XUklURURJU0FCTEVfUkVEOwotICAgaWYgKCFnKSB0bXAgfD0gUzVfV1JJVEVESVNBQkxFX0dSRUVOOwotICAgaWYgKCFiKSB0bXAgfD0gUzVfV1JJVEVESVNBQkxFX0JMVUU7Ci0gICBpZiAoIWEpIHRtcCB8PSBTNV9XUklURURJU0FCTEVfQUxQSEE7CisgICBpZiAoIXIpCisgICAgICB0bXAgfD0gUzVfV1JJVEVESVNBQkxFX1JFRDsKKyAgIGlmICghZykKKyAgICAgIHRtcCB8PSBTNV9XUklURURJU0FCTEVfR1JFRU47CisgICBpZiAoIWIpCisgICAgICB0bXAgfD0gUzVfV1JJVEVESVNBQkxFX0JMVUU7CisgICBpZiAoIWEpCisgICAgICB0bXAgfD0gUzVfV1JJVEVESVNBQkxFX0FMUEhBOwogCiAgICBpZiAodG1wICE9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM1XSkgewogICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9DVFgpOwpAQCAtNDg4LDU0ICs1MjIsNTUgQEAKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3NwZWN1bGFyKCBHTGNvbnRleHQgKmN0eCApCitzdGF0aWMgdm9pZAordXBkYXRlX3NwZWN1bGFyKEdMY29udGV4dCAqIGN0eCkKIHsKICAgIC8qIEEgaGFjayB0byB0cmlnZ2VyIHRoZSByZWJ1aWxkIG9mIHRoZSBmcmFnbWVudCBwcm9ncmFtLgogICAgICovCi0gICBJTlRFTF9DT05URVhUKGN0eCktPk5ld0dMU3RhdGUgfD0gX05FV19URVhUVVJFOwotICAgSTkxNV9DT05URVhUKGN0eCktPnRleF9wcm9ncmFtLnRyYW5zbGF0ZWQgPSAwOyAKKyAgIGludGVsX2NvbnRleHQoY3R4KS0+TmV3R0xTdGF0ZSB8PSBfTkVXX1RFWFRVUkU7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVMaWdodE1vZGVsZnYoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgCi0JCQkgICAgIGNvbnN0IEdMZmxvYXQgKnBhcmFtKQorc3RhdGljIHZvaWQKK2k5MTVMaWdodE1vZGVsZnYoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbSkKIHsKLSAgIGlmIChJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgCiAgICBpZiAocG5hbWUgPT0gR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCkgewotICAgICAgdXBkYXRlX3NwZWN1bGFyKCBjdHggKTsKKyAgICAgIHVwZGF0ZV9zcGVjdWxhcihjdHgpOwogICAgfQogfQogCi1zdGF0aWMgdm9pZCBpOTE1U2hhZGVNb2RlbChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUpCitzdGF0aWMgdm9pZAoraTkxNVNoYWRlTW9kZWwoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gbW9kZSkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKIAogICAgaWYgKG1vZGUgPT0gR0xfU01PT1RIKSB7Ci0gICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSAmPSB+KFM0X0ZMQVRTSEFERV9BTFBIQSB8IAotCQkJCQkgIFM0X0ZMQVRTSEFERV9DT0xPUiB8IAotCQkJCQkgIFM0X0ZMQVRTSEFERV9TUEVDVUxBUik7Ci0gICB9IGVsc2UgewotICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gfD0gKFM0X0ZMQVRTSEFERV9BTFBIQSB8IAotCQkJCQkgUzRfRkxBVFNIQURFX0NPTE9SIHwgCi0JCQkJCSBTNF9GTEFUU0hBREVfU1BFQ1VMQVIpOworICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdICY9IH4oUzRfRkxBVFNIQURFX0FMUEhBIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0X0ZMQVRTSEFERV9DT0xPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNF9GTEFUU0hBREVfU1BFQ1VMQVIpOworICAgfQorICAgZWxzZSB7CisgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gfD0gKFM0X0ZMQVRTSEFERV9BTFBIQSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0X0ZMQVRTSEFERV9DT0xPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0X0ZMQVRTSEFERV9TUEVDVUxBUik7CiAgICB9CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZvZwogICovCi12b2lkIGk5MTVfdXBkYXRlX2ZvZyggR0xjb250ZXh0ICpjdHggKQordm9pZAoraTkxNV91cGRhdGVfZm9nKEdMY29udGV4dCAqIGN0eCkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKICAgIEdMZW51bSBtb2RlOwogICAgR0xib29sZWFuIGVuYWJsZWQ7CiAgICBHTGJvb2xlYW4gdHJ5X3BpeGVsX2ZvZzsKLSAgIAorCiAgICBpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0FjdGl2ZSkgewogICAgICAgLyogUHVsbCBpbiBzdGF0aWMgZm9nIHN0YXRlIGZyb20gcHJvZ3JhbSAqLwotICAgICAgCiAgICAgICBtb2RlID0gY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQtPkZvZ09wdGlvbjsKICAgICAgIGVuYWJsZWQgPSAobW9kZSAhPSBHTF9OT05FKTsKICAgICAgIHRyeV9waXhlbF9mb2cgPSAwOwpAQCAtNTQ2LDcgKzU4MSw3IEBACiAjaWYgMAogICAgICAgLyogWFhYIC0gRElTQUJMRUQgLS0gTmVlZCBvcnRobyBmYWxsYmFjayAqLwogICAgICAgdHJ5X3BpeGVsX2ZvZyA9IChjdHgtPkZvZy5Gb2dDb29yZGluYXRlU291cmNlID09IEdMX0ZSQUdNRU5UX0RFUFRIX0VYVAotICAgICAgICAgICAgICAgICAgICAgICAmJmN0eC0+SGludC5Gb2cgPT0gR0xfTklDRVNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgY3R4LT5IaW50LkZvZyA9PSBHTF9OSUNFU1QpOwogI2Vsc2UKICAgICAgIHRyeV9waXhlbF9mb2cgPSAwOwogI2VuZGlmCkBAIC01NTksNDggKzU5NCw0OSBAQAogICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9GT0cpOwogICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSAmPSB+Rk1DMV9GT0dGVU5DX01BU0s7CiAgICAgICBpOTE1LT52ZXJ0ZXhfZm9nID0gSTkxNV9GT0dfUElYRUw7Ci0JIAorCiAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgIGNhc2UgR0xfTElORUFSOgotCSBpZiAoY3R4LT5Gb2cuRW5kIDw9IGN0eC0+Rm9nLlN0YXJ0KSB7Ci0JICAgIC8qIFhYWCAtIHRoaXMgd29uJ3Qgd29yayB3aXRoIGZyYWdtZW50IHByb2dyYW1zLiAgTmVlZCB0bwotCSAgICAgKiBlaXRoZXIgZmFsbGJhY2sgb3IgYXBwZW5kIGZvZyBpbnN0cnVjdGlvbnMgdG8gZW5kIG9mCi0JICAgICAqIHByb2dyYW0gaW4gdGhlIGNhc2Ugb2YgbGluZWFyIGZvZy4KLQkgICAgICovCi0JICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gfD0gRk1DMV9GT0dGVU5DX1ZFUlRFWDsKLQkgICAgaTkxNS0+dmVydGV4X2ZvZyA9IEk5MTVfRk9HX1ZFUlRFWDsKLQkgfQotCSBlbHNlIHsKKyAgICAgICAgIGlmIChjdHgtPkZvZy5FbmQgPD0gY3R4LT5Gb2cuU3RhcnQpIHsKKyAgICAgICAgICAgIC8qIFhYWCAtIHRoaXMgd29uJ3Qgd29yayB3aXRoIGZyYWdtZW50IHByb2dyYW1zLiAgTmVlZCB0bworICAgICAgICAgICAgICogZWl0aGVyIGZhbGxiYWNrIG9yIGFwcGVuZCBmb2cgaW5zdHJ1Y3Rpb25zIHRvIGVuZCBvZgorICAgICAgICAgICAgICogcHJvZ3JhbSBpbiB0aGUgY2FzZSBvZiBsaW5lYXIgZm9nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcmludGYoInZlcnRleCBmb2chXG4iKTsKKyAgICAgICAgICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gfD0gRk1DMV9GT0dGVU5DX1ZFUlRFWDsKKyAgICAgICAgICAgIGk5MTUtPnZlcnRleF9mb2cgPSBJOTE1X0ZPR19WRVJURVg7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIEdMZmxvYXQgYzIgPSAxLjAgLyAoY3R4LT5Gb2cuRW5kIC0gY3R4LT5Gb2cuU3RhcnQpOwogICAgICAgICAgICAgR0xmbG9hdCBjMSA9IGN0eC0+Rm9nLkVuZCAqIGMyOwogCi0JICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gJj0gfkZNQzFfQzFfTUFTSzsKLQkgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSB8PSBGTUMxX0ZPR0ZVTkNfUElYRUxfTElORUFSOwotCSAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTFdIHw9IAotCSAgICAgICAoKEdMdWludCkoYzEgKiBGTUMxX0MxX09ORSkpICYgRk1DMV9DMV9NQVNLOworICAgICAgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSAmPSB+Rk1DMV9DMV9NQVNLOworICAgICAgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSB8PSBGTUMxX0ZPR0ZVTkNfUElYRUxfTElORUFSOworICAgICAgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSB8PQorICAgICAgICAgICAgICAgKChHTHVpbnQpIChjMSAqIEZNQzFfQzFfT05FKSkgJiBGTUMxX0MxX01BU0s7CiAKLQkgICAgaWYgKGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gJiBGTUMxX0ZPR0lOREVYX1opIHsKLQkgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUyXQotICAgICAgICAgICAgICAgICAgPSAoR0x1aW50KShjMiAqIEZNQzJfQzJfT05FKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICAgZmlfdHlwZSBmaTsKLQkgICAgICAgZmkuZiA9IGMyOyAKLQkgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUyXSA9IGZpLmk7IAotCSAgICB9Ci0JIH0KLQkgYnJlYWs7CisgICAgICAgICAgICBpZiAoaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSAmIEZNQzFfRk9HSU5ERVhfWikgeworICAgICAgICAgICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUyXQorICAgICAgICAgICAgICAgICAgPSAoR0x1aW50KSAoYzIgKiBGTUMyX0MyX09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIGZpX3R5cGUgZmk7CisgICAgICAgICAgICAgICBmaS5mID0gYzI7CisgICAgICAgICAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTJdID0gZmkuaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBHTF9FWFA6Ci0JIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gfD0gRk1DMV9GT0dGVU5DX1BJWEVMX0VYUDsKLQkgYnJlYWs7CisgICAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTFdIHw9IEZNQzFfRk9HRlVOQ19QSVhFTF9FWFA7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfRVhQMjoKLQkgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUxXSB8PSBGTUMxX0ZPR0ZVTkNfUElYRUxfRVhQMjsKLQkgYnJlYWs7CisgICAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTFdIHw9IEZNQzFfRk9HRlVOQ19QSVhFTF9FWFAyOworICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotCSBicmVhazsKKyAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgfQotICAgZWxzZSAvKiBpZiAoaTkxNS0+dmVydGV4X2ZvZyAhPSBJOTE1X0ZPR19WRVJURVgpICovIHsgICAgICAKKyAgIGVsc2UgeyAvKiBpZiAoaTkxNS0+dmVydGV4X2ZvZyAhPSBJOTE1X0ZPR19WRVJURVgpICovCiAgICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0ZPRyk7CiAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTFdICY9IH5GTUMxX0ZPR0ZVTkNfTUFTSzsKICAgICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gfD0gRk1DMV9GT0dGVU5DX1ZFUlRFWDsKQEAgLTYyMiwzOCArNjU4LDM4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pOTE1Rm9nZnYoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW0pCitpOTE1Rm9nZnYoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbSkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKIAogICAgc3dpdGNoIChwbmFtZSkgewotICAgY2FzZSBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhUOiAKKyAgIGNhc2UgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVDoKICAgIGNhc2UgR0xfRk9HX01PREU6CiAgICBjYXNlIEdMX0ZPR19TVEFSVDoKLSAgIGNhc2UgR0xfRk9HX0VORDogCisgICBjYXNlIEdMX0ZPR19FTkQ6CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9GT0dfREVOU0lUWToKICAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfRk9HKTsKIAogICAgICAgaWYgKGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gJiBGTUMxX0ZPR0lOREVYX1opIHsKLQkgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUzXQotICAgICAgICAgICAgPSAoR0x1aW50KShjdHgtPkZvZy5EZW5zaXR5ICogRk1DM19EX09ORSk7CisgICAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTNdID0KKyAgICAgICAgICAgIChHTHVpbnQpIChjdHgtPkZvZy5EZW5zaXR5ICogRk1DM19EX09ORSk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKLQkgdW5pb24geyBmbG9hdCBmOyBpbnQgaTsgfSBmaTsKLQkgZmkuZiA9IGN0eC0+Rm9nLkRlbnNpdHk7IAotCSBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTNdID0gZmkuaTsgCisgICAgICAgICBmaV90eXBlIGZpOworICAgICAgICAgZmkuZiA9IGN0eC0+Rm9nLkRlbnNpdHk7CisgICAgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfTU9ERTNdID0gZmkuaTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogCi0gICBjYXNlIEdMX0ZPR19DT0xPUjogCisgICBjYXNlIEdMX0ZPR19DT0xPUjoKICAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfRk9HKTsKLSAgICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19DT0xPUl0gPSAKLQkgKF8zRFNUQVRFX0ZPR19DT0xPUl9DTUQgfCAKLQkgICgoR0x1Ynl0ZSkoY3R4LT5Gb2cuQ29sb3JbMF0qMjU1LjBGKSA8PCAxNikgfAotCSAgKChHTHVieXRlKShjdHgtPkZvZy5Db2xvclsxXSoyNTUuMEYpIDw8IDgpIHwKLQkgICgoR0x1Ynl0ZSkoY3R4LT5Gb2cuQ29sb3JbMl0qMjU1LjBGKSA8PCAwKSk7CisgICAgICBpOTE1LT5zdGF0ZS5Gb2dbSTkxNV9GT0dSRUdfQ09MT1JdID0KKyAgICAgICAgIChfM0RTVEFURV9GT0dfQ09MT1JfQ01EIHwKKyAgICAgICAgICAoKEdMdWJ5dGUpIChjdHgtPkZvZy5Db2xvclswXSAqIDI1NS4wRikgPDwgMTYpIHwKKyAgICAgICAgICAoKEdMdWJ5dGUpIChjdHgtPkZvZy5Db2xvclsxXSAqIDI1NS4wRikgPDwgOCkgfAorICAgICAgICAgICgoR0x1Ynl0ZSkgKGN0eC0+Rm9nLkNvbG9yWzJdICogMjU1LjBGKSA8PCAwKSk7CiAgICAgICBicmVhazsKIAogICAgZGVmYXVsdDoKQEAgLTY2MSw3ICs2OTcsOCBAQAogICAgfQogfQogCi1zdGF0aWMgdm9pZCBpOTE1SGludChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHN0YXRlKQorc3RhdGljIHZvaWQKK2k5MTVIaW50KEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHN0YXRlKQogewogICAgc3dpdGNoICh0YXJnZXQpIHsKICAgIGNhc2UgR0xfRk9HX0hJTlQ6CkBAIC02NzQsMjUgKzcxMSwyNiBAQAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLXN0YXRpYyB2b2lkIGk5MTVFbmFibGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBjYXAsIEdMYm9vbGVhbiBzdGF0ZSkKK3N0YXRpYyB2b2lkCitpOTE1RW5hYmxlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwogCi0gICBzd2l0Y2goY2FwKSB7CisgICBzd2l0Y2ggKGNhcCkgewogICAgY2FzZSBHTF9URVhUVVJFXzJEOgogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfTElHSFRJTkc6CiAgICBjYXNlIEdMX0NPTE9SX1NVTToKLSAgICAgIHVwZGF0ZV9zcGVjdWxhciggY3R4ICk7CisgICAgICB1cGRhdGVfc3BlY3VsYXIoY3R4KTsKICAgICAgIGJyZWFrOwogCiAgICBjYXNlIEdMX0FMUEhBX1RFU1Q6CiAgICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7CiAgICAgICBpZiAoc3RhdGUpCi0JIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSB8PSBTNl9BTFBIQV9URVNUX0VOQUJMRTsKKyAgICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSB8PSBTNl9BTFBIQV9URVNUX0VOQUJMRTsKICAgICAgIGVsc2UKLQkgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdICY9IH5TNl9BTFBIQV9URVNUX0VOQUJMRTsKKyAgICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM2XSAmPSB+UzZfQUxQSEFfVEVTVF9FTkFCTEU7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9CTEVORDoKQEAgLTcwNCw4ICs3NDIsOCBAQAogCiAgICAgICAvKiBMb2dpY29wIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGF0IDE2YnBwOgogICAgICAgICovCi0gICAgICBpZiAoaTkxNS0+aW50ZWwuaW50ZWxTY3JlZW4tPmNwcCA9PSAyKQotCSBGQUxMQkFDSyggJmk5MTUtPmludGVsLCBJOTE1X0ZBTExCQUNLX0xPR0lDT1AsIHN0YXRlICk7CisgICAgICBpZiAoY3R4LT5WaXN1YWwucmdiQml0cyA9PSAxNikKKyAgICAgICAgIEZBTExCQUNLKCZpOTE1LT5pbnRlbCwgSTkxNV9GQUxMQkFDS19MT0dJQ09QLCBzdGF0ZSk7CiAgICAgICBicmVhazsKIAogICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjoKQEAgLTcxNCwzNyArNzUyLDM3IEBACiAgICBjYXNlIEdMX0RJVEhFUjoKICAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKICAgICAgIGlmIChzdGF0ZSkKLQkgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdIHw9IFM1X0NPTE9SX0RJVEhFUl9FTkFCTEU7CisgICAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gUzVfQ09MT1JfRElUSEVSX0VOQUJMRTsKICAgICAgIGVsc2UKLQkgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH5TNV9DT0xPUl9ESVRIRVJfRU5BQkxFOworICAgICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH5TNV9DT0xPUl9ESVRIRVJfRU5BQkxFOwogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfREVQVEhfVEVTVDoKICAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKICAgICAgIGlmIChzdGF0ZSkKLQkgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdIHw9IFM2X0RFUFRIX1RFU1RfRU5BQkxFOworICAgICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdIHw9IFM2X0RFUFRIX1RFU1RfRU5BQkxFOwogICAgICAgZWxzZQotCSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gJj0gflM2X0RFUFRIX1RFU1RfRU5BQkxFOworICAgICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzZdICY9IH5TNl9ERVBUSF9URVNUX0VOQUJMRTsKIAotICAgICAgaTkxNURlcHRoTWFzayggY3R4LCBjdHgtPkRlcHRoLk1hc2sgKTsKKyAgICAgIGk5MTVEZXB0aE1hc2soY3R4LCBjdHgtPkRlcHRoLk1hc2spOwogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgogICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9CVUZGRVJTKTsKICAgICAgIGlmIChzdGF0ZSkKLQkgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXSA9IChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfAotCQkJCQkJICAgRU5BQkxFX1NDSVNTT1JfUkVDVCk7CisgICAgICAgICBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX1NFTkFCTEVdID0KKyAgICAgICAgICAgIChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfCBFTkFCTEVfU0NJU1NPUl9SRUNUKTsKICAgICAgIGVsc2UKLQkgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXSA9IChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfAotCQkJCQkJICAgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOworICAgICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXSA9CisgICAgICAgICAgICAoXzNEU1RBVEVfU0NJU1NPUl9FTkFCTEVfQ01EIHwgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOwogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfTElORV9TTU9PVEg6CiAgICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0NUWCk7CiAgICAgICBpZiAoc3RhdGUpCi0JIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSB8PSBTNF9MSU5FX0FOVElBTElBU19FTkFCTEU7CisgICAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gfD0gUzRfTElORV9BTlRJQUxJQVNfRU5BQkxFOwogICAgICAgZWxzZQotCSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gJj0gflM0X0xJTkVfQU5USUFMSUFTX0VOQUJMRTsKKyAgICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSAmPSB+UzRfTElORV9BTlRJQUxJQVNfRU5BQkxFOwogICAgICAgYnJlYWs7CiAKICAgIGNhc2UgR0xfRk9HOgpAQCAtNzU1LDE2ICs3OTMsMjUgQEAKICAgICAgIGJyZWFrOwogCiAgICBjYXNlIEdMX1NURU5DSUxfVEVTVDoKLSAgICAgIGlmIChpOTE1LT5pbnRlbC5od19zdGVuY2lsKSB7Ci0JIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQ1RYKTsKLQkgaWYgKHN0YXRlKQotCSAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gKFM1X1NURU5DSUxfVEVTVF9FTkFCTEUgfAotCQkJCQkJUzVfU1RFTkNJTF9XUklURV9FTkFCTEUpOwotCSBlbHNlCi0JICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM1XSAmPSB+KFM1X1NURU5DSUxfVEVTVF9FTkFCTEUgfCAKLQkJCQkJCSBTNV9TVEVOQ0lMX1dSSVRFX0VOQUJMRSk7Ci0gICAgICB9IGVsc2UgewotCSBGQUxMQkFDSyggJmk5MTUtPmludGVsLCBJOTE1X0ZBTExCQUNLX1NURU5DSUwsIHN0YXRlICk7CisgICAgICB7CisgICAgICAgICBHTGJvb2xlYW4gaHdfc3RlbmNpbCA9IEdMX0ZBTFNFOworICAgICAgICAgaWYgKGN0eC0+RHJhd0J1ZmZlcikgeworICAgICAgICAgICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiU3RlbmNpbAorICAgICAgICAgICAgICAgPSBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlciwgQlVGRkVSX1NURU5DSUwpOworICAgICAgICAgICAgaHdfc3RlbmNpbCA9IChpcmJTdGVuY2lsICYmIGlyYlN0ZW5jaWwtPnJlZ2lvbik7CisgICAgICAgICB9CisgICAgICAgICBpZiAoaHdfc3RlbmNpbCkgeworICAgICAgICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9DVFgpOworICAgICAgICAgICAgaWYgKHN0YXRlKQorICAgICAgICAgICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdIHw9IChTNV9TVEVOQ0lMX1RFU1RfRU5BQkxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzVfU1RFTkNJTF9XUklURV9FTkFCTEUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzVdICY9IH4oUzVfU1RFTkNJTF9URVNUX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNV9TVEVOQ0lMX1dSSVRFX0VOQUJMRSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZBTExCQUNLKCZpOTE1LT5pbnRlbCwgSTkxNV9GQUxMQkFDS19TVEVOQ0lMLCBzdGF0ZSk7CisgICAgICAgICB9CiAgICAgICB9CiAgICAgICBicmVhazsKIApAQCAtNzczLDIzICs4MjAsMjAgQEAKICAgICAgICAqIEknbGwgZG8gbW9yZSB0ZXN0aW5nIGxhdGVyIHRvIGZpbmQgb3V0IGV4YWN0bHkgd2hpY2ggaGFyZHdhcmUKICAgICAgICAqIHN1cHBvcnRzIGl0LiAgRGlzYWJsZWQgZm9yIG5vdy4KICAgICAgICAqLwotICAgICAgaWYgKGk5MTUtPmludGVsLmh3X3N0aXBwbGUgJiYgCi0JICBpOTE1LT5pbnRlbC5yZWR1Y2VkX3ByaW1pdGl2ZSA9PSBHTF9UUklBTkdMRVMpCi0gICAgICB7Ci0JIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfU1RJUFBMRSk7Ci0JIGlmIChzdGF0ZSkKLQkgICAgaTkxNS0+c3RhdGUuU3RpcHBsZVtJOTE1X1NUUFJFR19TVDFdIHw9IFNUMV9FTkFCTEU7Ci0JIGVsc2UKLQkgICAgaTkxNS0+c3RhdGUuU3RpcHBsZVtJOTE1X1NUUFJFR19TVDFdICY9IH5TVDFfRU5BQkxFOworICAgICAgaWYgKGk5MTUtPmludGVsLmh3X3N0aXBwbGUgJiYKKyAgICAgICAgICBpOTE1LT5pbnRlbC5yZWR1Y2VkX3ByaW1pdGl2ZSA9PSBHTF9UUklBTkdMRVMpIHsKKyAgICAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfU1RJUFBMRSk7CisgICAgICAgICBpZiAoc3RhdGUpCisgICAgICAgICAgICBpOTE1LT5zdGF0ZS5TdGlwcGxlW0k5MTVfU1RQUkVHX1NUMV0gfD0gU1QxX0VOQUJMRTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGk5MTUtPnN0YXRlLlN0aXBwbGVbSTkxNV9TVFBSRUdfU1QxXSAmPSB+U1QxX0VOQUJMRTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogCiAgICBjYXNlIEdMX1BPTFlHT05fU01PT1RIOgotICAgICAgRkFMTEJBQ0soICZpOTE1LT5pbnRlbCwgSTkxNV9GQUxMQkFDS19QT0xZR09OX1NNT09USCwgc3RhdGUgKTsKICAgICAgIGJyZWFrOwogCiAgICBjYXNlIEdMX1BPSU5UX1NNT09USDoKLSAgICAgIEZBTExCQUNLKCAmaTkxNS0+aW50ZWwsIEk5MTVfRkFMTEJBQ0tfUE9JTlRfU01PT1RILCBzdGF0ZSApOwogICAgICAgYnJlYWs7CiAKICAgIGRlZmF1bHQ6CkBAIC03OTgsMTAgKzg0Miw5IEBACiB9CiAKIAotc3RhdGljIHZvaWQgaTkxNV9pbml0X3BhY2tldHMoIGk5MTVDb250ZXh0UHRyIGk5MTUgKQorc3RhdGljIHZvaWQKK2k5MTVfaW5pdF9wYWNrZXRzKHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUpCiB7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGk5MTUtPmludGVsLmludGVsU2NyZWVuOwotCiAgICAvKiBaZXJvIGFsbCBzdGF0ZSAqLwogICAgbWVtc2V0KCZpOTE1LT5zdGF0ZSwgMCwgc2l6ZW9mKGk5MTUtPnN0YXRlKSk7CiAKQEAgLTgxMSwzOSArODU0LDM1IEBACiAgICAgICAvKiBQcm9iYWJseSBkb24ndCB3YW50IHRvIHVwbG9hZCBhbGwgdGhpcyBzdHVmZiBldmVyeSB0aW1lIG9uZSAKICAgICAgICAqIHBpZWNlIGNoYW5nZXMuCiAgICAgICAgKi8KLSAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSV0gPSAoXzNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMSB8IAotCQkJCSAgICAgICBJMV9MT0FEX1MoMikgfAotCQkJCSAgICAgICBJMV9MT0FEX1MoNCkgfAotCQkJCSAgICAgICBJMV9MT0FEX1MoNSkgfAotCQkJCSAgICAgICBJMV9MT0FEX1MoNikgfCAKLQkJCQkgICAgICAgKDMpKTsKKyAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSV0gPSAoXzNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkxX0xPQURfUygyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkxX0xPQURfUyg0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkxX0xPQURfUyg1KSB8IEkxX0xPQURfUyg2KSB8ICgzKSk7CiAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTMl0gPSAwOwogICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdID0gMDsKICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM1XSA9IDA7CiAKLSAgICAgIGlmIChzY3JlZW4tPmNwcCA9PSAyKQotCSBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gUzVfQ09MT1JfRElUSEVSX0VOQUJMRTsKKyAgICAgIGlmIChpOTE1LT5pbnRlbC5jdHguVmlzdWFsLnJnYkJpdHMgPT0gMTYpCisgICAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNV0gfD0gUzVfQ09MT1JfRElUSEVSX0VOQUJMRTsKIAogCiAgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNl0gPSAoUzZfQ09MT1JfV1JJVEVfRU5BQkxFIHwKLQkJCQkJICgyIDw8IFM2X1RSSVNUUklQX1BWX1NISUZUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgUzZfVFJJU1RSSVBfUFZfU0hJRlQpKTsKIAogICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX1NUQVRFNF0gPSAoXzNEU1RBVEVfTU9ERVNfNF9DTUQgfAotCQkJCQkgICBFTkFCTEVfTE9HSUNfT1BfRlVOQyB8Ci0JCQkJCSAgIExPR0lDX09QX0ZVTkMoTE9HSUNPUF9DT1BZKSB8Ci0JCQkJCSAgIEVOQUJMRV9TVEVOQ0lMX1RFU1RfTUFTSyB8Ci0JCQkJCSAgIFNURU5DSUxfVEVTVF9NQVNLKDB4ZmYpIHwKLQkJCQkJICAgRU5BQkxFX1NURU5DSUxfV1JJVEVfTUFTSyB8Ci0JCQkJCSAgIFNURU5DSUxfV1JJVEVfTUFTSygweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVfTE9HSUNfT1BfRlVOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJQ19PUF9GVU5DKExPR0lDT1BfQ09QWSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFX1NURU5DSUxfVEVTVF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURU5DSUxfVEVTVF9NQVNLKDB4ZmYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRV9TVEVOQ0lMX1dSSVRFX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RFTkNJTF9XUklURV9NQVNLKDB4ZmYpKTsKIAorICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0lBQl0gPQorICAgICAgICAgKF8zRFNUQVRFX0lOREVQRU5ERU5UX0FMUEhBX0JMRU5EX0NNRCB8IElBQl9NT0RJRllfRU5BQkxFIHwKKyAgICAgICAgICBJQUJfTU9ESUZZX0ZVTkMgfCBJQUJfTU9ESUZZX1NSQ19GQUNUT1IgfCBJQUJfTU9ESUZZX0RTVF9GQUNUT1IpOwogCi0gICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfSUFCXSA9IChfM0RTVEFURV9JTkRFUEVOREVOVF9BTFBIQV9CTEVORF9DTUQgfAotCQkJCQlJQUJfTU9ESUZZX0VOQUJMRSB8Ci0JCQkJCUlBQl9NT0RJRllfRlVOQyB8Ci0JCQkJCUlBQl9NT0RJRllfU1JDX0ZBQ1RPUiB8Ci0JCQkJCUlBQl9NT0RJRllfRFNUX0ZBQ1RPUik7Ci0KLSAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19CTEVORENPTE9SMF0gPSBfM0RTVEFURV9DT05TVF9CTEVORF9DT0xPUl9DTUQ7CisgICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfQkxFTkRDT0xPUjBdID0KKyAgICAgICAgIF8zRFNUQVRFX0NPTlNUX0JMRU5EX0NPTE9SX0NNRDsKICAgICAgIGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19CTEVORENPTE9SMV0gPSAwOwogCiAgICB9CkBAIC04NTgsNzkgKzg5Nyw1MCBAQAogICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9GT0cpOwogICAgICAgaTkxNS0+c3RhdGUuRm9nW0k5MTVfRk9HUkVHX01PREUwXSA9IF8zRFNUQVRFX0ZPR19NT0RFX0NNRDsKICAgICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19NT0RFMV0gPSAoRk1DMV9GT0dGVU5DX01PRElGWV9FTkFCTEUgfAotCQkJCQkgIEZNQzFfRk9HRlVOQ19WRVJURVggfAotCQkJCQkgIEZNQzFfRk9HSU5ERVhfTU9ESUZZX0VOQUJMRSB8Ci0JCQkJCSAgRk1DMV9GT0dJTkRFWF9XIHwKLQkJCQkJICBGTUMxX0MxX0MyX01PRElGWV9FTkFCTEUgfAotCQkJCQkgIEZNQzFfREVOU0lUWV9NT0RJRllfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1DMV9GT0dGVU5DX1ZFUlRFWCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQzFfRk9HSU5ERVhfTU9ESUZZX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQzFfRk9HSU5ERVhfVyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQzFfQzFfQzJfTU9ESUZZX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNQzFfREVOU0lUWV9NT0RJRllfRU5BQkxFKTsKICAgICAgIGk5MTUtPnN0YXRlLkZvZ1tJOTE1X0ZPR1JFR19DT0xPUl0gPSBfM0RTVEFURV9GT0dfQ09MT1JfQ01EOwogICAgfQogCi0KICAgIHsKLSAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfQlVGRkVSUyk7Ci0gICAgICAvKiBjb2xvciBidWZmZXIgb2Zmc2V0L3N0cmlkZSAqLwotICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjBdID0gXzNEU1RBVEVfQlVGX0lORk9fQ01EOwotICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjFdID0gCi0JIChCVUZfM0RfSURfQ09MT1JfQkFDSyB8IAotCSAgQlVGXzNEX1BJVENIKHNjcmVlbi0+ZnJvbnQucGl0Y2gpIHwgIC8qIHBpdGNoIGluIGJ5dGVzICovCi0JICBCVUZfM0RfVVNFX0ZFTkNFKTsKLSAgICAgIC8qaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjJdIGlzIHRoZSBvZmZzZXQgKi8KLQotCi0gICAgICAvKiBkZXB0aC9aIGJ1ZmZlciBvZmZzZXQvc3RyaWRlICovCi0gICAgICBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX0RCVUZBRERSMF0gPSBfM0RTVEFURV9CVUZfSU5GT19DTUQ7Ci0gICAgICBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX0RCVUZBRERSMV0gPSAKLQkgKEJVRl8zRF9JRF9ERVBUSCB8Ci0JICBCVUZfM0RfUElUQ0goc2NyZWVuLT5kZXB0aC5waXRjaCkgfCAgLyogcGl0Y2ggaW4gYnl0ZXMgKi8KLQkgIEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjJdID0gc2NyZWVuLT5kZXB0aC5vZmZzZXQ7Ci0KLQogICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19EVjBdID0gXzNEU1RBVEVfRFNUX0JVRl9WQVJTX0NNRDsKIAotICAgICAgLyogY29sb3IvZGVwdGggcGl4ZWwgZm9ybWF0ICovCi0gICAgICBzd2l0Y2ggKHNjcmVlbi0+ZmJGb3JtYXQpIHsKLSAgICAgIGNhc2UgRFZfUEZfNTU1OgotICAgICAgY2FzZSBEVl9QRl81NjU6Ci0JIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfRFYxXSA9IChEU1RPUkdfSE9SVF9CSUFTKDB4OCkgfCAvKiAuNSAqLwotCQkJCQkgICAgICAgRFNUT1JHX1ZFUlRfQklBUygweDgpIHwgLyogLjUgKi8KLQkJCQkJICAgICAgIExPRF9QUkVDTEFNUF9PR0wgfAotCQkJCQkgICAgICAgVEVYX0RFRkFVTFRfQ09MT1JfT0dMIHwKLQkJCQkJICAgICAgIERJVEhFUl9GVUxMX0FMV0FZUyB8Ci0JCQkJCSAgICAgICBzY3JlZW4tPmZiRm9ybWF0IHwKLQkJCQkJICAgICAgIERFUFRIX0ZSTVRfMTZfRklYRUQpOwotCSBicmVhazsKLSAgICAgIGNhc2UgRFZfUEZfODg4ODoKLQkgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19EVjFdID0gKERTVE9SR19IT1JUX0JJQVMoMHg4KSB8IC8qIC41ICovCi0JCQkJCSAgICAgICBEU1RPUkdfVkVSVF9CSUFTKDB4OCkgfCAvKiAuNSAqLwotCQkJCQkgICAgICAgTE9EX1BSRUNMQU1QX09HTCB8Ci0JCQkJCSAgICAgICBURVhfREVGQVVMVF9DT0xPUl9PR0wgfAotCQkJCQkgICAgICAgc2NyZWVuLT5mYkZvcm1hdCB8Ci0JCQkJCSAgICAgICBERVBUSF9GUk1UXzI0X0ZJWEVEXzhfT1RIRVIpOwotCSBicmVhazsKLSAgICAgIH0KLQogICAgICAgLyogc2Npc3NvciAqLwotICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXSA9IChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfAotCQkJCQkJRElTQUJMRV9TQ0lTU09SX1JFQ1QpOworICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TRU5BQkxFXSA9CisgICAgICAgICAoXzNEU1RBVEVfU0NJU1NPUl9FTkFCTEVfQ01EIHwgRElTQUJMRV9TQ0lTU09SX1JFQ1QpOwogICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TUjBdID0gXzNEU1RBVEVfU0NJU1NPUl9SRUNUXzBfQ01EOwogICAgICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19TUjFdID0gMDsKICAgICAgIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfU1IyXSA9IDA7CiAgICB9CiAKIAorI2lmIDAKKyAgIHsKKyAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfREVGQVVMVFMpOworICAgICAgaTkxNS0+c3RhdGUuRGVmYXVsdFtJOTE1X0RFRlJFR19DMF0gPSBfM0RTVEFURV9ERUZBVUxUX0RJRkZVU0U7CisgICAgICBpOTE1LT5zdGF0ZS5EZWZhdWx0W0k5MTVfREVGUkVHX0MxXSA9IDA7CisgICAgICBpOTE1LT5zdGF0ZS5EZWZhdWx0W0k5MTVfREVGUkVHX1MwXSA9IF8zRFNUQVRFX0RFRkFVTFRfU1BFQ1VMQVI7CisgICAgICBpOTE1LT5zdGF0ZS5EZWZhdWx0W0k5MTVfREVGUkVHX1MxXSA9IDA7CisgICAgICBpOTE1LT5zdGF0ZS5EZWZhdWx0W0k5MTVfREVGUkVHX1owXSA9IF8zRFNUQVRFX0RFRkFVTFRfWjsKKyAgICAgIGk5MTUtPnN0YXRlLkRlZmF1bHRbSTkxNV9ERUZSRUdfWjFdID0gMDsKKyAgIH0KKyNlbmRpZgorCisKICAgIC8qIFRoZXNlIHdpbGwgYmUgZW1pdHRlZCBldmVyeSBhdCB0aGUgaGVhZCBvZiBldmVyeSBidWZmZXIsIHVubGVzcwogICAgICogd2UgZ2V0IGhhcmR3YXJlIGNvbnRleHRzIHdvcmtpbmcuCiAgICAgKi8KLSAgIGk5MTUtPnN0YXRlLmFjdGl2ZSA9IChJOTE1X1VQTE9BRF9QUk9HUkFNIHwgCi0JCQkgSTkxNV9VUExPQURfU1RJUFBMRSB8IAotCQkJIEk5MTVfVVBMT0FEX0NUWCB8IAotCQkJIEk5MTVfVVBMT0FEX0JVRkZFUlMgfCAKLQkJCSBJOTE1X1VQTE9BRF9JTlZBUklFTlQpOworICAgaTkxNS0+c3RhdGUuYWN0aXZlID0gKEk5MTVfVVBMT0FEX1BST0dSQU0gfAorICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfVVBMT0FEX1NUSVBQTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfVVBMT0FEX0NUWCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9VUExPQURfQlVGRkVSUyB8IEk5MTVfVVBMT0FEX0lOVkFSSUVOVCk7CiB9CiAKLXZvaWQgaTkxNUluaXRTdGF0ZUZ1bmN0aW9ucyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKQordm9pZAoraTkxNUluaXRTdGF0ZUZ1bmN0aW9ucyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKIHsKICAgIGZ1bmN0aW9ucy0+QWxwaGFGdW5jID0gaTkxNUFscGhhRnVuYzsKICAgIGZ1bmN0aW9ucy0+QmxlbmRDb2xvciA9IGk5MTVCbGVuZENvbG9yOwpAQCAtOTU3LDE0ICs5NjcsMTUgQEAKIH0KIAogCi12b2lkIGk5MTVJbml0U3RhdGUoIGk5MTVDb250ZXh0UHRyIGk5MTUgKQordm9pZAoraTkxNUluaXRTdGF0ZShzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1KQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaTkxNS0+aW50ZWwuY3R4OwogCi0gICBpOTE1X2luaXRfcGFja2V0cyggaTkxNSApOworICAgaTkxNV9pbml0X3BhY2tldHMoaTkxNSk7CiAKICAgIF9tZXNhX2luaXRfZHJpdmVyX3N0YXRlKGN0eCk7CiAKLSAgIG1lbWNweSggJmk5MTUtPmluaXRpYWwsICZpOTE1LT5zdGF0ZSwgc2l6ZW9mKGk5MTUtPnN0YXRlKSApOworICAgbWVtY3B5KCZpOTE1LT5pbml0aWFsLCAmaTkxNS0+c3RhdGUsIHNpemVvZihpOTE1LT5zdGF0ZSkpOwogICAgaTkxNS0+Y3VycmVudCA9ICZpOTE1LT5zdGF0ZTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV90ZXguYwppbmRleCBkOTYwOWQzLi4zODY2MTdhIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleC5jCkBAIC00NSwxMDkgKzQ1LDI1IEBACiAKIAogCi0KLQotCi0vKioKLSAqIEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgbG9hZCB0aGUgbWVzYSBpbWFnZXMgaW50byB0aGUgdGV4dHVyZSBtZW1vcnkgYmxvY2suCi0gKiBUaGlzIHdpbGwgaGFwcGVuIGJlZm9yZSBkcmF3aW5nIHdpdGggYSBuZXcgdGV4dHVyZSwgb3IgZHJhd2luZyB3aXRoIGEKLSAqIHRleHR1cmUgYWZ0ZXIgaXQgd2FzIHN3YXBwZWQgb3V0IG9yIHRleGltYWdlZCBhZ2Fpbi4KLSAqLwotCi1pbnRlbFRleHR1cmVPYmplY3RQdHIgaTkxNUFsbG9jVGV4T2JqKCBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiApCitzdGF0aWMgdm9pZAoraTkxNVRleEVudihHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqIHBhcmFtKQogewotICAgaTkxNVRleHR1cmVPYmplY3RQdHIgdCA9IENBTExPQ19TVFJVQ1QoIGk5MTVfdGV4dHVyZV9vYmplY3QgKTsKLSAgIGlmICggIXQgKSAKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICB0ZXhPYmotPkRyaXZlckRhdGEgPSB0OwotICAgdC0+aW50ZWwuYmFzZS50T2JqID0gdGV4T2JqOwotICAgdC0+aW50ZWwuZGlydHkgPSBJOTE1X1VQTE9BRF9URVhfQUxMOwotICAgbWFrZV9lbXB0eV9saXN0KCAmdC0+aW50ZWwuYmFzZSApOwotICAgcmV0dXJuICZ0LT5pbnRlbDsKLX0KLQotCi1zdGF0aWMgdm9pZCBpOTE1VGV4UGFyYW1ldGVyKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKLQkJCSAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqLAotCQkJICAgICBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi17Ci0gICBpOTE1VGV4dHVyZU9iamVjdFB0ciB0ID0gKGk5MTVUZXh0dXJlT2JqZWN0UHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwotIAotICAgc3dpdGNoIChwbmFtZSkgewotICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQ6Ci0gICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9TOgotICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfVDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1I6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SOgotICAgICAgdC0+aW50ZWwuZGlydHkgPSBJOTE1X1VQTE9BRF9URVhfQUxMOwotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgR0xfVEVYVFVSRV9DT01QQVJFX01PREU6Ci0gICAgICB0LT5pbnRlbC5kaXJ0eSA9IEk5MTVfVVBMT0FEX1RFWF9BTEw7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkM6Ci0gICAgICB0LT5pbnRlbC5kaXJ0eSA9IEk5MTVfVVBMT0FEX1RFWF9BTEw7Ci0gICAgICBicmVhazsKLQotICAgY2FzZSBHTF9URVhUVVJFX0JBU0VfTEVWRUw6Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUFYX0xFVkVMOgotICAgY2FzZSBHTF9URVhUVVJFX01JTl9MT0Q6Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUFYX0xPRDoKLSAgICAgIC8qIFRoZSBpOTE1IGFuZCBpdHMgc3VjY2Vzc29ycyBjYW4gZG8gYSBsb3Qgb2YgdGhpcyB3aXRob3V0Ci0gICAgICAgKiByZWxvYWRpbmcgdGhlIHRleHR1cmVzLiAgQSBwcm9qZWN0IGZvciBzb21lb25lPwotICAgICAgICovCi0gICAgICBpbnRlbEZsdXNoKCBjdHggKTsKLSAgICAgIGRyaVN3YXBPdXRUZXh0dXJlT2JqZWN0KCAoZHJpVGV4dHVyZU9iamVjdCAqKSB0ICk7Ci0gICAgICB0LT5pbnRlbC5kaXJ0eSA9IEk5MTVfVVBMT0FEX1RFWF9BTEw7Ci0gICAgICBicmVhazsKLQotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCBpOTE1VGV4RW52KCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgCi0JCQlHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtICkKLXsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoIGN0eCApOwotICAgR0x1aW50IHVuaXQgPSBjdHgtPlRleHR1cmUuQ3VycmVudFVuaXQ7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7CiAKICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfQ09MT1I6IAkvKiBTaG91bGQgYmUgYSB0cmFja2VkIHBhcmFtICovCi0gICBjYXNlIEdMX1RFWFRVUkVfRU5WX01PREU6Ci0gICBjYXNlIEdMX0NPTUJJTkVfUkdCOgotICAgY2FzZSBHTF9DT01CSU5FX0FMUEhBOgotICAgY2FzZSBHTF9TT1VSQ0UwX1JHQjoKLSAgIGNhc2UgR0xfU09VUkNFMV9SR0I6Ci0gICBjYXNlIEdMX1NPVVJDRTJfUkdCOgotICAgY2FzZSBHTF9TT1VSQ0UwX0FMUEhBOgotICAgY2FzZSBHTF9TT1VSQ0UxX0FMUEhBOgotICAgY2FzZSBHTF9TT1VSQ0UyX0FMUEhBOgotICAgY2FzZSBHTF9PUEVSQU5EMF9SR0I6Ci0gICBjYXNlIEdMX09QRVJBTkQxX1JHQjoKLSAgIGNhc2UgR0xfT1BFUkFORDJfUkdCOgotICAgY2FzZSBHTF9PUEVSQU5EMF9BTFBIQToKLSAgIGNhc2UgR0xfT1BFUkFORDFfQUxQSEE6Ci0gICBjYXNlIEdMX09QRVJBTkQyX0FMUEhBOgotICAgY2FzZSBHTF9SR0JfU0NBTEU6Ci0gICBjYXNlIEdMX0FMUEhBX1NDQUxFOgotICAgICAgaTkxNS0+dGV4X3Byb2dyYW0udHJhbnNsYXRlZCA9IDA7IAotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgR0xfVEVYVFVSRV9MT0RfQklBUzogewotICAgICAgaW50IGIgPSAoaW50KSAoKCpwYXJhbSkgKiAxNi4wKTsKLSAgICAgIGlmIChiID4gMjU1KSBiID0gMjU1OwotICAgICAgaWYgKGIgPCAtMjU2KSBiID0gLTI1NjsKLSAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfVEVYKHVuaXQpKTsKLSAgICAgIGk5MTUtPnN0YXRlLlRleFt1bml0XVtJOTE1X1RFWFJFR19TUzJdICY9IH5TUzJfTE9EX0JJQVNfTUFTSzsKLSAgICAgIGk5MTUtPnN0YXRlLlRleFt1bml0XVtJOTE1X1RFWFJFR19TUzJdIHw9IAotCSAoKGIgPDwgU1MyX0xPRF9CSUFTX1NISUZUKSAmIFNTMl9MT0RfQklBU19NQVNLKTsKLSAgICAgIGJyZWFrOwotICAgfQorICAgY2FzZSBHTF9URVhUVVJFX0xPRF9CSUFTOnsKKyAgICAgICAgIEdMdWludCB1bml0ID0gY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0OworICAgICAgICAgR0xpbnQgYiA9IChpbnQpICgoKnBhcmFtKSAqIDE2LjApOworICAgICAgICAgaWYgKGIgPiAyNTUpCisgICAgICAgICAgICBiID0gMjU1OworICAgICAgICAgaWYgKGIgPCAtMjU2KQorICAgICAgICAgICAgYiA9IC0yNTY7CisgICAgICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX1RFWCh1bml0KSk7CisgICAgICAgICBpOTE1LT5sb2RiaWFzX3NzMlt1bml0XSA9CisgICAgICAgICAgICAoKGIgPDwgU1MyX0xPRF9CSUFTX1NISUZUKSAmIFNTMl9MT0RfQklBU19NQVNLKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQogCiAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CkBAIC0xNTUsMzMgKzcxLDEwIEBACiB9CiAKIAotc3RhdGljIHZvaWQgaTkxNUJpbmRUZXh0dXJlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKLQkJCSAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiApCit2b2lkCitpOTE1SW5pdFRleHR1cmVGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKIHsKLSAgIGk5MTVUZXh0dXJlT2JqZWN0UHRyIHRleDsKLSAgIAotICAgaWYgKCF0ZXhPYmotPkRyaXZlckRhdGEpCi0gICAgICBpOTE1QWxsb2NUZXhPYmooIHRleE9iaiApOwotICAgCi0gICB0ZXggPSAoaTkxNVRleHR1cmVPYmplY3RQdHIpdGV4T2JqLT5Ecml2ZXJEYXRhOwotCi0gICBpZiAodGV4LT5sYXN0VGFyZ2V0ICE9IHRleE9iai0+VGFyZ2V0KSB7Ci0gICAgICB0ZXgtPmludGVsLmRpcnR5ID0gSTkxNV9VUExPQURfVEVYX0FMTDsKLSAgICAgIHRleC0+bGFzdFRhcmdldCA9IHRleE9iai0+VGFyZ2V0OwotICAgfQotCi0gICAvKiBOZWVkIHRoaXMgaWYgaW1hZ2UgZm9ybWF0IGNoYW5nZXMgYmV0d2VlbiBib3VuZCB0ZXh0dXJlcy4KLSAgICAqIENvdWxkIHRyeSBhbmQgc2hvcnRjaXJjdWl0IGJ5IGNoZWNraW5nIGZvciBkaWZmZXJlbmNlcyBpbgotICAgICogc3RhdGUgYmV0d2VlbiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgdGV4dHVyZXM6Ci0gICAgKi8KLSAgIEk5MTVfQ09OVEVYVChjdHgpLT50ZXhfcHJvZ3JhbS50cmFuc2xhdGVkID0gMDsgCi19Ci0KLQotCi12b2lkIGk5MTVJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBmdW5jdGlvbnMtPkJpbmRUZXh0dXJlID0gaTkxNUJpbmRUZXh0dXJlOworLyoKICAgIGZ1bmN0aW9ucy0+VGV4RW52ID0gaTkxNVRleEVudjsKLSAgIGZ1bmN0aW9ucy0+VGV4UGFyYW1ldGVyID0gaTkxNVRleFBhcmFtZXRlcjsKKyovCiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdGV4X2xheW91dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleF9sYXlvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA4NWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleF9sYXlvdXQuYwpAQCAtMCwwICsxLDQ3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBmaWxlIGk5MTVfdGV4X2xheW91dC5jCisgKiBDb2RlIHRvIGxheW91dCBpbWFnZXMgaW4gYSBtaXBtYXAgdHJlZSBmb3IgaTgzME0tR005MTUgYW5kIEc5NDUgYW5kIGJleW9uZC4KKyAqLworCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXhfbGF5b3V0LmgiCisjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorCisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19URVhUVVJFCisKK3N0YXRpYyBHTGludCBpbml0aWFsX29mZnNldHNbNl1bMl0gPSB7CisgICBbRkFDRV9QT1NfWF0gPSB7MCwgMH0sCisgICBbRkFDRV9QT1NfWV0gPSB7MSwgMH0sCisgICBbRkFDRV9QT1NfWl0gPSB7MSwgMX0sCisgICBbRkFDRV9ORUdfWF0gPSB7MCwgMn0sCisgICBbRkFDRV9ORUdfWV0gPSB7MSwgMn0sCisgICBbRkFDRV9ORUdfWl0gPSB7MSwgM30sCit9OworCisKK3N0YXRpYyBHTGludCBzdGVwX29mZnNldHNbNl1bMl0gPSB7CisgICBbRkFDRV9QT1NfWF0gPSB7MCwgMn0sCisgICBbRkFDRV9QT1NfWV0gPSB7LTEsIDJ9LAorICAgW0ZBQ0VfUE9TX1pdID0gey0xLCAxfSwKKyAgIFtGQUNFX05FR19YXSA9IHswLCAyfSwKKyAgIFtGQUNFX05FR19ZXSA9IHstMSwgMn0sCisgICBbRkFDRV9ORUdfWl0gPSB7LTEsIDF9LAorfTsKKworLyoqCisgKiBDdWJlIHRleHR1cmUgbWFwIGxheW91dCBmb3IgaTgzME0tR005MTUuCisgKgorICogSGFyZHdhcmUgbGF5b3V0IGxvb2tzIGxpa2U6CisgKgorICogKy0tLS0tLS0rLS0tLS0tLSsKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICt4ICAgfCAgK3kgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogKy0tLSstLS0rLS0tLS0tLSsKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiB8ICt4fCAreXwgICAgICAgfAorICogfCAgIHwgICB8ICAgICAgIHwKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiArLSstKy0tLSsgICt6ICAgfAorICogfCB8IHwgICB8ICAgICAgIHwKKyAqICstKy0rICt6fCAgICAgICB8CisgKiAgIHwgfCAgIHwgICAgICAgfAorICogKy0rLSstLS0rLS0tLS0tLSsKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgIC14ICAgfCAgLXkgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogKy0tLSstLS0rLS0tLS0tLSsKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiB8IC14fCAteXwgICAgICAgfAorICogfCAgIHwgICB8ICAgICAgIHwKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiArLSstKy0tLSsgIC16ICAgfAorICogfCB8IHwgICB8ICAgICAgIHwKKyAqICstKy0rIC16fCAgICAgICB8CisgKiAgIHwgfCAgIHwgICAgICAgfAorICogICArLSstLS0rLS0tLS0tLSsKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitpOTE1X21pcHRyZWVfbGF5b3V0X2N1YmUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqIG10KQoreworICAgY29uc3QgR0x1aW50IGRpbSA9IG10LT53aWR0aDA7CisgICBHTHVpbnQgZmFjZTsKKyAgIEdMdWludCBsdmxXaWR0aCA9IG10LT53aWR0aDAsIGx2bEhlaWdodCA9IG10LT5oZWlnaHQwOworICAgR0xpbnQgbGV2ZWw7CisKKyAgIGFzc2VydChsdmxXaWR0aCA9PSBsdmxIZWlnaHQpOyAvKiBjdWJlbWFwIGltYWdlcyBhcmUgc3F1YXJlICovCisKKyAgIC8qIGRvdWJsZSBwaXRjaCBmb3IgY3ViZSBsYXlvdXRzICovCisgICBtdC0+cGl0Y2ggPSBpbnRlbF9taXB0cmVlX3BpdGNoX2FsaWduIChpbnRlbCwgbXQsIGRpbSAqIDIpOworICAgbXQtPnRvdGFsX2hlaWdodCA9IGRpbSAqIDQ7CisKKyAgIGZvciAobGV2ZWwgPSBtdC0+Zmlyc3RfbGV2ZWw7IGxldmVsIDw9IG10LT5sYXN0X2xldmVsOyBsZXZlbCsrKSB7CisgICAgICBpbnRlbF9taXB0cmVlX3NldF9sZXZlbF9pbmZvKG10LCBsZXZlbCwgNiwKKwkJCQkgICAwLCAwLAorCQkJCSAgIC8qT0xEOiBtdC0+cGl0Y2gsIG10LT50b3RhbF9oZWlnaHQsKi8KKwkJCQkgICBsdmxXaWR0aCwgbHZsSGVpZ2h0LAorCQkJCSAgIDEpOworICAgICAgbHZsV2lkdGggLz0gMjsKKyAgICAgIGx2bEhlaWdodCAvPSAyOworICAgfQorCisgICBmb3IgKGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKSB7CisgICAgICBHTHVpbnQgeCA9IGluaXRpYWxfb2Zmc2V0c1tmYWNlXVswXSAqIGRpbTsKKyAgICAgIEdMdWludCB5ID0gaW5pdGlhbF9vZmZzZXRzW2ZhY2VdWzFdICogZGltOworICAgICAgR0x1aW50IGQgPSBkaW07CisKKyAgICAgIGZvciAobGV2ZWwgPSBtdC0+Zmlyc3RfbGV2ZWw7IGxldmVsIDw9IG10LT5sYXN0X2xldmVsOyBsZXZlbCsrKSB7CisJIGludGVsX21pcHRyZWVfc2V0X2ltYWdlX29mZnNldChtdCwgbGV2ZWwsIGZhY2UsIHgsIHkpOworCisJIGlmIChkID09IDApCisJICAgIF9tZXNhX3ByaW50ZigiY3ViZSBtaXBtYXAgJWQvJWQgKCVkLi4lZCkgaXMgMHgwXG4iLAorCQkJIGZhY2UsIGxldmVsLCBtdC0+Zmlyc3RfbGV2ZWwsIG10LT5sYXN0X2xldmVsKTsKKworCSBkID4+PSAxOworCSB4ICs9IHN0ZXBfb2Zmc2V0c1tmYWNlXVswXSAqIGQ7CisJIHkgKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzFdICogZDsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2k5MTVfbWlwdHJlZV9sYXlvdXRfM2Qoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICogbXQpCit7CisgICBHTHVpbnQgd2lkdGggPSBtdC0+d2lkdGgwOworICAgR0x1aW50IGhlaWdodCA9IG10LT5oZWlnaHQwOworICAgR0x1aW50IGRlcHRoID0gbXQtPmRlcHRoMDsKKyAgIEdMdWludCBzdGFja19oZWlnaHQgPSAwOworICAgR0xpbnQgbGV2ZWw7CisKKyAgIC8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBzbGljZS4gKi8KKyAgIG10LT5waXRjaCA9IGludGVsX21pcHRyZWVfcGl0Y2hfYWxpZ24gKGludGVsLCBtdCwgbXQtPndpZHRoMCk7CisKKyAgIC8qIFhYWDogaGFyZHdhcmUgZXhwZWN0cy9yZXF1aXJlcyA5IGxldmVscyBhdCBtaW5pbXVtLiAqLworICAgZm9yIChsZXZlbCA9IG10LT5maXJzdF9sZXZlbDsgbGV2ZWwgPD0gTUFYMig4LCBtdC0+bGFzdF9sZXZlbCk7IGxldmVsKyspIHsKKyAgICAgIGludGVsX21pcHRyZWVfc2V0X2xldmVsX2luZm8obXQsIGxldmVsLCBkZXB0aCwgMCwgbXQtPnRvdGFsX2hlaWdodCwKKwkJCQkgICB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CisKKyAgICAgIHN0YWNrX2hlaWdodCArPSBNQVgyKDIsIGhlaWdodCk7CisKKyAgICAgIHdpZHRoID0gbWluaWZ5KHdpZHRoKTsKKyAgICAgIGhlaWdodCA9IG1pbmlmeShoZWlnaHQpOworICAgICAgZGVwdGggPSBtaW5pZnkoZGVwdGgpOworICAgfQorCisgICAvKiBGaXh1cCBkZXB0aCBpbWFnZV9vZmZzZXRzOiAqLworICAgZGVwdGggPSBtdC0+ZGVwdGgwOworICAgZm9yIChsZXZlbCA9IG10LT5maXJzdF9sZXZlbDsgbGV2ZWwgPD0gbXQtPmxhc3RfbGV2ZWw7IGxldmVsKyspIHsKKyAgICAgIEdMdWludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKwkgaW50ZWxfbWlwdHJlZV9zZXRfaW1hZ2Vfb2Zmc2V0KG10LCBsZXZlbCwgaSwKKwkJCQkJMCwgaSAqIHN0YWNrX2hlaWdodCk7CisgICAgICB9CisKKyAgICAgIGRlcHRoID0gbWluaWZ5KGRlcHRoKTsKKyAgIH0KKworICAgLyogTXVsdGlwbHkgc2xpY2Ugc2l6ZSBieSB0ZXh0dXJlIGRlcHRoIGZvciB0b3RhbCBzaXplLiAgSXQncworICAgICogcmVtYXJrYWJsZSBob3cgd2FzdGVmdWwgb2YgbWVtb3J5IHRoZSBpOTE1IHRleHR1cmUgbGF5b3V0cworICAgICogYXJlLiAgVGhleSBhcmUgbGFyZ2VseSBmaXhlZCBpbiB0aGUgaTk0NS4KKyAgICAqLworICAgbXQtPnRvdGFsX2hlaWdodCA9IHN0YWNrX2hlaWdodCAqIG10LT5kZXB0aDA7Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X21pcHRyZWVfbGF5b3V0XzJkKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqIG10KQoreworICAgR0x1aW50IHdpZHRoID0gbXQtPndpZHRoMDsKKyAgIEdMdWludCBoZWlnaHQgPSBtdC0+aGVpZ2h0MDsKKyAgIEdMdWludCBpbWdfaGVpZ2h0OworICAgR0xpbnQgbGV2ZWw7CisKKyAgIG10LT5waXRjaCA9IGludGVsX21pcHRyZWVfcGl0Y2hfYWxpZ24gKGludGVsLCBtdCwgbXQtPndpZHRoMCk7CisgICBtdC0+dG90YWxfaGVpZ2h0ID0gMDsKKworICAgZm9yIChsZXZlbCA9IG10LT5maXJzdF9sZXZlbDsgbGV2ZWwgPD0gbXQtPmxhc3RfbGV2ZWw7IGxldmVsKyspIHsKKyAgICAgIGludGVsX21pcHRyZWVfc2V0X2xldmVsX2luZm8obXQsIGxldmVsLCAxLAorCQkJCSAgIDAsIG10LT50b3RhbF9oZWlnaHQsCisJCQkJICAgd2lkdGgsIGhlaWdodCwgMSk7CisKKyAgICAgIGlmIChtdC0+Y29tcHJlc3NlZCkKKwkgaW1nX2hlaWdodCA9IE1BWDIoMSwgaGVpZ2h0IC8gNCk7CisgICAgICBlbHNlCisJIGltZ19oZWlnaHQgPSAoTUFYMigyLCBoZWlnaHQpICsgMSkgJiB+MTsKKworICAgICAgbXQtPnRvdGFsX2hlaWdodCArPSBpbWdfaGVpZ2h0OworCisgICAgICB3aWR0aCA9IG1pbmlmeSh3aWR0aCk7CisgICAgICBoZWlnaHQgPSBtaW5pZnkoaGVpZ2h0KTsKKyAgIH0KK30KKworR0xib29sZWFuCitpOTE1X21pcHRyZWVfbGF5b3V0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX21pcG1hcF90cmVlICogbXQpCit7CisgICBzd2l0Y2ggKG10LT50YXJnZXQpIHsKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICAgIGk5MTVfbWlwdHJlZV9sYXlvdXRfY3ViZShpbnRlbCwgbXQpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1RFWFRVUkVfM0Q6CisgICAgICBpOTE1X21pcHRyZWVfbGF5b3V0XzNkKGludGVsLCBtdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfVEVYVFVSRV8xRDoKKyAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgIGNhc2UgR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCOgorICAgICAgaTkxNV9taXB0cmVlX2xheW91dF8yZChpbnRlbCwgbXQpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiVW5leHBlY3RlZCB0ZXggdGFyZ2V0IGluIGk5MTVfbWlwdHJlZV9sYXlvdXQoKSIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIERCRygiJXM6ICVkeCVkeCVkIC0gc3ogMHgleFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIG10LT5waXRjaCwKKyAgICAgICBtdC0+dG90YWxfaGVpZ2h0LCBtdC0+Y3BwLCBtdC0+cGl0Y2ggKiBtdC0+dG90YWxfaGVpZ2h0ICogbXQtPmNwcCk7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKy8qKgorICogQ3ViZSB0ZXh0dXJlIG1hcCBsYXlvdXQgZm9yIEdNOTQ1IGFuZCBsYXRlci4KKyAqCisgKiBUaGUgaGFyZHdhcmUgbGF5b3V0IGxvb2tzIGxpa2UgdGhlIDgzMC05MTUgbGF5b3V0LCBleGNlcHQgZm9yIHRoZSBzbWFsbAorICogc2l6ZXMuICBBIHpvb21lZCBpbiB2aWV3IG9mIHRoZSBsYXlvdXQgZm9yIDk0NSBpczoKKyAqCisgKiArLS0tLS0tLSstLS0tLS0tKworICogfCAgOHg4ICB8ICA4eDggIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgK3ggICB8ICAreSAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiArLS0tKy0tLSstLS0tLS0tKworICogfDR4NHwgICB8ICA4eDggIHwKKyAqIHwgK3h8ICAgfCAgICAgICB8CisgKiB8ICAgfCAgIHwgICAgICAgfAorICogfCAgIHwgICB8ICAgICAgIHwKKyAqICstLS0rICAgfCAgK3ogICB8CisgKiB8NHg0fCAgIHwgICAgICAgfAorICogfCAreXwgICB8ICAgICAgIHwKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiArLS0tKyAgICstLS0tLS0tKworICoKKyAqIC4uLgorICoKKyAqICstLS0tLS0tKy0tLS0tLS0rCisgKiB8ICA4eDggIHwgIDh4OCAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAteCAgIHwgIC15ICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqIHwgICAgICAgfCAgICAgICB8CisgKiB8ICAgICAgIHwgICAgICAgfAorICogfCAgICAgICB8ICAgICAgIHwKKyAqICstLS0rLS0tKy0tLS0tLS0rCisgKiB8NHg0fCAgIHwgIDh4OCAgfAorICogfCAteHwgICB8ICAgICAgIHwKKyAqIHwgICB8ICAgfCAgICAgICB8CisgKiB8ICAgfCAgIHwgICAgICAgfAorICogKy0tLSsgICB8ICAteiAgIHwKKyAqIHw0eDR8ICAgfCAgICAgICB8CisgKiB8IC15fCAgIHwgICAgICAgfAorICogfCAgIHwgICB8ICAgICAgIHwKKyAqICstLS0rICAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworICogfDR4NHwgICB8NHg0fCAgIHwyeDJ8ICAgfDJ4MnwgICB8MngyfCAgIHwyeDJ8CisgKiB8ICt6fCAgIHwgLXp8ICAgfCAreHwgICB8ICt5fCAgIHwgK3p8ICAgfCAteHwgLi4uCisgKiB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwKKyAqICstLS0rICAgKy0tLSsgICArLS0tKyAgICstLS0rICAgKy0tLSsgICArLS0tKworICoKKyAqIFRoZSBib3R0b20gcm93IGNvbnRpbnVlcyB3aXRoIHRoZSByZW1haW5pbmcgMngyIHRoZW4gdGhlIDF4MSBtaXAgY29udGVudHMKKyAqIGluIG9yZGVyLCB3aXRoIGVhY2ggb2YgdGhlbSBhbGlnbmVkIHRvIGEgNHg0IGJsb2NrIGJvdW5kYXJ5LiAgVGh1cywgZm9yCisgKiAzMngzMiBjdWJlIG1hcHMgYW5kIHNtYWxsZXIsIHRoZSBib3R0b20gcm93IGxheW91dCBpcyBnb2luZyB0byBkaWN0YXRlIHRoZQorICogcGl0Y2ggb2YgdGhlIHRyZWUuICBGb3IgYSB0cmVlIHdpdGggNHg0IGltYWdlcywgdGhlIHBpdGNoIGlzIGF0IGxlYXN0CisgKiAxNCAqIDggPSAxMTIgdGV4ZWxzLCBmb3IgMngyIGl0IGlzIGF0IGxlYXN0IDEyICogOCB0ZXhlbHMsIGFuZCBmb3IgMXgxCisgKiBpdCBpcyA2ICogOCB0ZXhlbHMuCisgKi8KKworc3RhdGljIHZvaWQKK2k5NDVfbWlwdHJlZV9sYXlvdXRfY3ViZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgc3RydWN0IGludGVsX21pcG1hcF90cmVlICogbXQpCit7CisgICBjb25zdCBHTHVpbnQgZGltID0gbXQtPndpZHRoMDsKKyAgIEdMdWludCBmYWNlOworICAgR0x1aW50IGx2bFdpZHRoID0gbXQtPndpZHRoMCwgbHZsSGVpZ2h0ID0gbXQtPmhlaWdodDA7CisgICBHTGludCBsZXZlbDsKKworICAgYXNzZXJ0KGx2bFdpZHRoID09IGx2bEhlaWdodCk7IC8qIGN1YmVtYXAgaW1hZ2VzIGFyZSBzcXVhcmUgKi8KKworICAgLyogRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGltYWdlcywgcGl0Y2ggY2FuIGJlCisgICAgKiBkZXRlcm1pbmVkIGVpdGhlciBieSB0aGUgb2xkLXN0eWxlIHBhY2tpbmcgb2YgY3ViZW1hcCBmYWNlcywKKyAgICAqIG9yIHRoZSBmaW5hbCByb3cgb2YgNHg0LCAyeDIgYW5kIDF4MSBmYWNlcyBiZWxvdyB0aGlzLgorICAgICovCisgICBpZiAoZGltID4gMzIpCisgICAgICBtdC0+cGl0Y2ggPSBpbnRlbF9taXB0cmVlX3BpdGNoX2FsaWduIChpbnRlbCwgbXQsIGRpbSAqIDIpOworICAgZWxzZQorICAgICAgbXQtPnBpdGNoID0gaW50ZWxfbWlwdHJlZV9waXRjaF9hbGlnbiAoaW50ZWwsIG10LCAxNCAqIDgpOworCisgICBpZiAoZGltID49IDQpCisgICAgICBtdC0+dG90YWxfaGVpZ2h0ID0gZGltICogNCArIDQ7CisgICBlbHNlCisgICAgICBtdC0+dG90YWxfaGVpZ2h0ID0gNDsKKworICAgLyogU2V0IGFsbCB0aGUgbGV2ZWxzIHRvIGVmZmVjdGl2ZWx5IG9jY3VweSB0aGUgd2hvbGUgcmVjdGFuZ3VsYXIgcmVnaW9uLiAqLworICAgZm9yIChsZXZlbCA9IG10LT5maXJzdF9sZXZlbDsgbGV2ZWwgPD0gbXQtPmxhc3RfbGV2ZWw7IGxldmVsKyspIHsKKyAgICAgIGludGVsX21pcHRyZWVfc2V0X2xldmVsX2luZm8obXQsIGxldmVsLCA2LAorCQkJCSAgIDAsIDAsCisJCQkJICAgbHZsV2lkdGgsIGx2bEhlaWdodCwgMSk7CisgICAgICBsdmxXaWR0aCAvPSAyOworICAgICAgbHZsSGVpZ2h0IC89IDI7CisgICB9CisKKyAgIGZvciAoZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspIHsKKyAgICAgIEdMdWludCB4ID0gaW5pdGlhbF9vZmZzZXRzW2ZhY2VdWzBdICogZGltOworICAgICAgR0x1aW50IHkgPSBpbml0aWFsX29mZnNldHNbZmFjZV1bMV0gKiBkaW07CisgICAgICBHTHVpbnQgZCA9IGRpbTsKKworICAgICAgaWYgKGRpbSA9PSA0ICYmIGZhY2UgPj0gNCkgeworCSB5ID0gbXQtPnRvdGFsX2hlaWdodCAtIDQ7CisJIHggPSAoZmFjZSAtIDQpICogODsKKyAgICAgIH0gZWxzZSBpZiAoZGltIDwgNCAmJiAoZmFjZSA+IDAgfHwgbXQtPmZpcnN0X2xldmVsID4gMCkpIHsKKwkgeSA9IG10LT50b3RhbF9oZWlnaHQgLSA0OworCSB4ID0gZmFjZSAqIDg7CisgICAgICB9CisKKyAgICAgIGZvciAobGV2ZWwgPSBtdC0+Zmlyc3RfbGV2ZWw7IGxldmVsIDw9IG10LT5sYXN0X2xldmVsOyBsZXZlbCsrKSB7CisJIGludGVsX21pcHRyZWVfc2V0X2ltYWdlX29mZnNldChtdCwgbGV2ZWwsIGZhY2UsIHgsIHkpOworCisJIGQgPj49IDE7CisKKwkgc3dpdGNoIChkKSB7CisJIGNhc2UgNDoKKwkgICAgc3dpdGNoIChmYWNlKSB7CisJICAgIGNhc2UgRkFDRV9QT1NfWDoKKwkgICAgY2FzZSBGQUNFX05FR19YOgorCSAgICAgICB4ICs9IHN0ZXBfb2Zmc2V0c1tmYWNlXVswXSAqIGQ7CisJICAgICAgIHkgKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzFdICogZDsKKwkgICAgICAgYnJlYWs7CisJICAgIGNhc2UgRkFDRV9QT1NfWToKKwkgICAgY2FzZSBGQUNFX05FR19ZOgorCSAgICAgICB5ICs9IDEyOworCSAgICAgICB4IC09IDg7CisJICAgICAgIGJyZWFrOworCSAgICBjYXNlIEZBQ0VfUE9TX1o6CisJICAgIGNhc2UgRkFDRV9ORUdfWjoKKwkgICAgICAgeSA9IG10LT50b3RhbF9oZWlnaHQgLSA0OworCSAgICAgICB4ID0gKGZhY2UgLSA0KSAqIDg7CisJICAgICAgIGJyZWFrOworCSAgICB9CisKKwkgY2FzZSAyOgorCSAgICB5ID0gbXQtPnRvdGFsX2hlaWdodCAtIDQ7CisJICAgIHggPSAxNiArIGZhY2UgKiA4OworCSAgICBicmVhazsKKworCSBjYXNlIDE6CisJICAgIHggKz0gNDg7CisJICAgIGJyZWFrOworCisJIGRlZmF1bHQ6CisJICAgIHggKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzBdICogZDsKKwkgICAgeSArPSBzdGVwX29mZnNldHNbZmFjZV1bMV0gKiBkOworCSAgICBicmVhazsKKwkgfQorICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZAoraTk0NV9taXB0cmVlX2xheW91dF8zZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCSAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKiBtdCkKK3sKKyAgIEdMdWludCB3aWR0aCA9IG10LT53aWR0aDA7CisgICBHTHVpbnQgaGVpZ2h0ID0gbXQtPmhlaWdodDA7CisgICBHTHVpbnQgZGVwdGggPSBtdC0+ZGVwdGgwOworICAgR0x1aW50IHBhY2tfeF9waXRjaCwgcGFja194X25yOworICAgR0x1aW50IHBhY2tfeV9waXRjaDsKKyAgIEdMdWludCBsZXZlbDsKKworICAgbXQtPnBpdGNoID0gaW50ZWxfbWlwdHJlZV9waXRjaF9hbGlnbiAoaW50ZWwsIG10LCBtdC0+d2lkdGgwKTsKKyAgIG10LT50b3RhbF9oZWlnaHQgPSAwOworCisgICBwYWNrX3lfcGl0Y2ggPSBNQVgyKG10LT5oZWlnaHQwLCAyKTsKKyAgIHBhY2tfeF9waXRjaCA9IG10LT5waXRjaDsKKyAgIHBhY2tfeF9uciA9IDE7CisKKyAgIGZvciAobGV2ZWwgPSBtdC0+Zmlyc3RfbGV2ZWw7IGxldmVsIDw9IG10LT5sYXN0X2xldmVsOyBsZXZlbCsrKSB7CisgICAgICBHTGludCB4ID0gMDsKKyAgICAgIEdMaW50IHkgPSAwOworICAgICAgR0xpbnQgcSwgajsKKworICAgICAgaW50ZWxfbWlwdHJlZV9zZXRfbGV2ZWxfaW5mbyhtdCwgbGV2ZWwsIGRlcHRoLAorCQkJCSAgIDAsIG10LT50b3RhbF9oZWlnaHQsCisJCQkJICAgd2lkdGgsIGhlaWdodCwgZGVwdGgpOworCisgICAgICBmb3IgKHEgPSAwOyBxIDwgZGVwdGg7KSB7CisJIGZvciAoaiA9IDA7IGogPCBwYWNrX3hfbnIgJiYgcSA8IGRlcHRoOyBqKyssIHErKykgeworCSAgICBpbnRlbF9taXB0cmVlX3NldF9pbWFnZV9vZmZzZXQobXQsIGxldmVsLCBxLCB4LCB5KTsKKwkgICAgeCArPSBwYWNrX3hfcGl0Y2g7CisJIH0KKworCSB4ID0gMDsKKwkgeSArPSBwYWNrX3lfcGl0Y2g7CisgICAgICB9CisKKyAgICAgIG10LT50b3RhbF9oZWlnaHQgKz0geTsKKworICAgICAgaWYgKHBhY2tfeF9waXRjaCA+IDQpIHsKKwkgcGFja194X3BpdGNoID4+PSAxOworCSBwYWNrX3hfbnIgPDw9IDE7CisJIGFzc2VydChwYWNrX3hfcGl0Y2ggKiBwYWNrX3hfbnIgPD0gbXQtPnBpdGNoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhY2tfeV9waXRjaCA+IDIpIHsKKwkgcGFja195X3BpdGNoID4+PSAxOworICAgICAgfQorCisgICAgICB3aWR0aCA9IG1pbmlmeSh3aWR0aCk7CisgICAgICBoZWlnaHQgPSBtaW5pZnkoaGVpZ2h0KTsKKyAgICAgIGRlcHRoID0gbWluaWZ5KGRlcHRoKTsKKyAgIH0KK30KKworR0xib29sZWFuCitpOTQ1X21pcHRyZWVfbGF5b3V0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX21pcG1hcF90cmVlICogbXQpCit7CisgICBzd2l0Y2ggKG10LT50YXJnZXQpIHsKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICAgIGk5NDVfbWlwdHJlZV9sYXlvdXRfY3ViZShpbnRlbCwgbXQpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1RFWFRVUkVfM0Q6CisgICAgICBpOTQ1X21pcHRyZWVfbGF5b3V0XzNkKGludGVsLCBtdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfVEVYVFVSRV8xRDoKKyAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgIGNhc2UgR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCOgorICAgICAgaTk0NV9taXB0cmVlX2xheW91dF8yZChpbnRlbCwgbXQpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiVW5leHBlY3RlZCB0ZXggdGFyZ2V0IGluIGk5NDVfbWlwdHJlZV9sYXlvdXQoKSIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIERCRygiJXM6ICVkeCVkeCVkIC0gc3ogMHgleFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIG10LT5waXRjaCwKKyAgICAgICBtdC0+dG90YWxfaGVpZ2h0LCBtdC0+Y3BwLCBtdC0+cGl0Y2ggKiBtdC0+dG90YWxfaGVpZ2h0ICogbXQtPmNwcCk7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleHByb2cuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV90ZXhwcm9nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YThiMDIuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleHByb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotCi0jaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCi0KLSNpbmNsdWRlICJpOTE1X3JlZy5oIgotI2luY2x1ZGUgImk5MTVfY29udGV4dC5oIgotI2luY2x1ZGUgImk5MTVfcHJvZ3JhbS5oIgotCi1zdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV90ZXhfc3JjX2JpdCggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwKLQkJCQkgICAgIEdMdWJ5dGUgYml0ICkKLXsKLSAgIHN3aXRjaCAoYml0KSB7Ci0gICBjYXNlIFRFWFRVUkVfMURfQklUOiAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV8yRDsKLSAgIGNhc2UgVEVYVFVSRV8yRF9CSVQ6ICAgcmV0dXJuIEQwX1NBTVBMRV9UWVBFXzJEOwotICAgY2FzZSBURVhUVVJFX1JFQ1RfQklUOiByZXR1cm4gRDBfU0FNUExFX1RZUEVfMkQ7Ci0gICBjYXNlIFRFWFRVUkVfM0RfQklUOiAgIHJldHVybiBEMF9TQU1QTEVfVFlQRV9WT0xVTUU7Ci0gICBjYXNlIFRFWFRVUkVfQ1VCRV9CSVQ6IHJldHVybiBEMF9TQU1QTEVfVFlQRV9DVUJFOwotICAgZGVmYXVsdDogaTkxNV9wcm9ncmFtX2Vycm9yKHAsICJUZXhTcmNCaXQiKTsgcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLXN0YXRpYyBHTHVpbnQgZ2V0X3NvdXJjZSggc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCwgCi0JCQkgIEdMZW51bSBzcmMsIEdMdWludCB1bml0ICkKLXsKLSAgIHN3aXRjaCAoc3JjKSB7Ci0gICBjYXNlIEdMX1RFWFRVUkU6IAotICAgICAgaWYgKHAtPnNyY190ZXh0dXJlID09IFVSRUdfQkFEKSB7Ci0KLQkgLyogVE9ETzogVXNlIEQwX0NIQU5ORUxfWFkgd2hlcmUgcG9zc2libGUuCi0JICAqLwotCSBHTHVpbnQgZGltID0gdHJhbnNsYXRlX3RleF9zcmNfYml0KCBwLCBwLT5jdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fUmVhbGx5RW5hYmxlZCk7Ci0JIEdMdWludCBzYW1wbGVyID0gaTkxNV9lbWl0X2RlY2wocCwgUkVHX1RZUEVfUywgdW5pdCwgZGltKTsKLQkgR0x1aW50IHRleGNvb3JkID0gaTkxNV9lbWl0X2RlY2wocCwgUkVHX1RZUEVfVCwgdW5pdCwgRDBfQ0hBTk5FTF9BTEwpOwotCSBHTHVpbnQgdG1wID0gaTkxNV9nZXRfdGVtcCggcCApOwotCSBHTHVpbnQgb3AgPSBUMF9URVhMRDsKLQotCSBpZiAocC0+VkItPlRleENvb3JkUHRyW3VuaXRdLT5zaXplID09IDQpCi0JICAgIG9wID0gVDBfVEVYTERQOwotCi0JIHAtPnNyY190ZXh0dXJlID0gaTkxNV9lbWl0X3RleGxkKCBwLCB0bXAsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIAotCQkJCQkgIHNhbXBsZXIsIHRleGNvb3JkLCBvcCApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcC0+c3JjX3RleHR1cmU7Ci0KLSAgICAgIC8qIENyb3NzYmFyOiAqLwotICAgY2FzZSBHTF9URVhUVVJFMDoKLSAgIGNhc2UgR0xfVEVYVFVSRTE6Ci0gICBjYXNlIEdMX1RFWFRVUkUyOgotICAgY2FzZSBHTF9URVhUVVJFMzoKLSAgIGNhc2UgR0xfVEVYVFVSRTQ6Ci0gICBjYXNlIEdMX1RFWFRVUkU1OgotICAgY2FzZSBHTF9URVhUVVJFNjoKLSAgIGNhc2UgR0xfVEVYVFVSRTc6IHsKLSAgICAgIHJldHVybiBVUkVHX0JBRDsKLSAgIH0KLQotICAgY2FzZSBHTF9DT05TVEFOVDoKLSAgICAgIHJldHVybiBpOTE1X2VtaXRfY29uc3Q0ZnYoIHAsIHAtPmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdLkVudkNvbG9yICk7Ci0gICBjYXNlIEdMX1BSSU1BUllfQ09MT1I6Ci0gICAgICByZXR1cm4gaTkxNV9lbWl0X2RlY2wocCwgUkVHX1RZUEVfVCwgVF9ESUZGVVNFLCBEMF9DSEFOTkVMX0FMTCk7Ci0gICBjYXNlIEdMX1BSRVZJT1VTOgotICAgZGVmYXVsdDogCi0gICAgICBpOTE1X2VtaXRfZGVjbChwLCAKLQkJR0VUX1VSRUdfVFlQRShwLT5zcmNfcHJldmlvdXMpLAotCQlHRVRfVVJFR19OUihwLT5zcmNfcHJldmlvdXMpLCBEMF9DSEFOTkVMX0FMTCk7IAotICAgICAgcmV0dXJuIHAtPnNyY19wcmV2aW91czsKLSAgIH0KLX0KLQkJCQotCi1zdGF0aWMgR0x1aW50IGVtaXRfY29tYmluZV9zb3VyY2UoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsIAotCQkJCSAgIEdMdWludCBtYXNrLAotCQkJCSAgIEdMdWludCB1bml0LAotCQkJCSAgIEdMZW51bSBzb3VyY2UsIAotCQkJCSAgIEdMZW51bSBvcGVyYW5kICkKLXsKLSAgIEdMdWludCBhcmcsIHNyYzsKLQotICAgc3JjID0gZ2V0X3NvdXJjZShwLCBzb3VyY2UsIHVuaXQpOwotCi0gICBzd2l0Y2ggKG9wZXJhbmQpIHsKLSAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogCi0gICAgICAvKiBHZXQgdW51c2VkIHRtcCwKLSAgICAgICAqIEVtaXQgdG1wID0gMS4wICsgYXJnLi14LXktei13Ci0gICAgICAgKi8KLSAgICAgIGFyZyA9IGk5MTVfZ2V0X3RlbXAoIHAgKTsKLSAgICAgIHJldHVybiBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX0FERCwgYXJnLCBtYXNrLCAwLAotCQkgIHN3aXp6bGUoc3JjLCBPTkUsIE9ORSwgT05FLCBPTkUgKSwKLQkJICBuZWdhdGUoc3JjLCAxLDEsMSwxKSwgMCk7Ci0KLSAgIGNhc2UgR0xfU1JDX0FMUEhBOiAKLSAgICAgIGlmIChtYXNrID09IEEwX0RFU1RfQ0hBTk5FTF9XKQotCSByZXR1cm4gc3JjOwotICAgICAgZWxzZQotCSByZXR1cm4gc3dpenpsZSggc3JjLCBXLCBXLCBXLCBXICk7Ci0gICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6IAotICAgICAgLyogR2V0IHVudXNlZCB0bXAsCi0gICAgICAgKiBFbWl0IHRtcCA9IDEuMCArIGFyZy4tdy13LXctdwotICAgICAgICovCi0gICAgICBhcmcgPSBpOTE1X2dldF90ZW1wKCBwICk7Ci0gICAgICByZXR1cm4gaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9BREQsIGFyZywgbWFzaywgMCwKLQkJCSBzd2l6emxlKHNyYywgT05FLCBPTkUsIE9ORSwgT05FICksCi0JCQkgbmVnYXRlKCBzd2l6emxlKHNyYyxXLFcsVyxXKSwgMSwxLDEsMSksIDApOwotICAgY2FzZSBHTF9TUkNfQ09MT1I6IAotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzcmM7Ci0gICB9Ci19Ci0KLQotCi1zdGF0aWMgaW50IG5yX2FyZ3MoIEdMZW51bSBtb2RlICkKLXsKLSAgIHN3aXRjaCAobW9kZSkgewotICAgY2FzZSBHTF9SRVBMQUNFOiByZXR1cm4gMTsgCi0gICBjYXNlIEdMX01PRFVMQVRFOiByZXR1cm4gMjsKLSAgIGNhc2UgR0xfQUREOiByZXR1cm4gMjsKLSAgIGNhc2UgR0xfQUREX1NJR05FRDogcmV0dXJuIDI7Ci0gICBjYXNlIEdMX0lOVEVSUE9MQVRFOglyZXR1cm4gMzsKLSAgIGNhc2UgR0xfU1VCVFJBQ1Q6IHJldHVybiAyOwotICAgY2FzZSBHTF9ET1QzX1JHQl9FWFQ6IHJldHVybiAyOwotICAgY2FzZSBHTF9ET1QzX1JHQkFfRVhUOiByZXR1cm4gMjsKLSAgIGNhc2UgR0xfRE9UM19SR0I6IHJldHVybiAyOwotICAgY2FzZSBHTF9ET1QzX1JHQkE6IHJldHVybiAyOwotICAgZGVmYXVsdDogcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLQotc3RhdGljIEdMYm9vbGVhbiBhcmdzX21hdGNoKCBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ICkKLXsKLSAgIGludCBpLCBuciA9IG5yX2FyZ3ModGV4VW5pdC0+Q29tYmluZS5Nb2RlUkdCKTsKLQotICAgZm9yIChpID0gMCA7IGkgPCBuciA7IGkrKykgewotICAgICAgaWYgKHRleFVuaXQtPkNvbWJpbmUuU291cmNlQVtpXSAhPSB0ZXhVbml0LT5Db21iaW5lLlNvdXJjZVJHQltpXSkgCi0JIHJldHVybiBHTF9GQUxTRTsKLQotICAgICAgc3dpdGNoKHRleFVuaXQtPkNvbWJpbmUuT3BlcmFuZEFbaV0pIHsKLSAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiAKLQkgc3dpdGNoKHRleFVuaXQtPkNvbWJpbmUuT3BlcmFuZFJHQltpXSkgewotCSBjYXNlIEdMX1NSQ19DT0xPUjogCi0JIGNhc2UgR0xfU1JDX0FMUEhBOiAKLQkgICAgYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQkgfQotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQTogCi0JIHN3aXRjaCh0ZXhVbml0LT5Db21iaW5lLk9wZXJhbmRSR0JbaV0pIHsKLQkgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOiAKLQkgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiAKLQkgICAgYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQkgfQotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6IAotCSByZXR1cm4gR0xfRkFMU0U7CS8qIGltcG9zc2libGUgKi8KLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLQotc3RhdGljIEdMdWludCBlbWl0X2NvbWJpbmUoIHN0cnVjdCBpOTE1X2ZyYWdtZW50X3Byb2dyYW0gKnAsCi0JCQkgICAgR0x1aW50IGRlc3QsCi0JCQkgICAgR0x1aW50IG1hc2ssCi0JCQkgICAgR0x1aW50IHNhdHVyYXRlLAotCQkJICAgIEdMdWludCB1bml0LAotCQkJICAgIEdMZW51bSBtb2RlLAotCQkJICAgIGNvbnN0IEdMZW51bSAqc291cmNlLAotCQkJICAgIGNvbnN0IEdMZW51bSAqb3BlcmFuZCkKLXsKLSAgIGludCB0bXAsIHNyY1szXSwgbnIgPSBucl9hcmdzKG1vZGUpOwotICAgaW50IGk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQotICAgICAgc3JjW2ldID0gZW1pdF9jb21iaW5lX3NvdXJjZSggcCwgbWFzaywgdW5pdCwgc291cmNlW2ldLCBvcGVyYW5kW2ldICk7Ci0KLSAgIHN3aXRjaCAobW9kZSkgewotICAgY2FzZSBHTF9SRVBMQUNFOiAKLSAgICAgIGlmIChtYXNrID09IEEwX0RFU1RfQ0hBTk5FTF9BTEwgJiYgIXNhdHVyYXRlKQotCSByZXR1cm4gc3JjWzBdOwotICAgICAgZWxzZQotCSByZXR1cm4gaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NT1YsIGRlc3QsIG1hc2ssIHNhdHVyYXRlLCBzcmNbMF0sIDAsIDAgKTsKLSAgIGNhc2UgR0xfTU9EVUxBVEU6IAotICAgICAgcmV0dXJuIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTVVMLCBkZXN0LCBtYXNrLCBzYXR1cmF0ZSwKLQkJCSAgICAgc3JjWzBdLCBzcmNbMV0sIDAgKTsKLSAgIGNhc2UgR0xfQUREOiAKLSAgICAgIHJldHVybiBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX0FERCwgZGVzdCwgbWFzaywgc2F0dXJhdGUsIAotCQkJICAgICBzcmNbMF0sIHNyY1sxXSwgMCApOwotICAgY2FzZSBHTF9BRERfU0lHTkVEOgotICAgICAgLyogdG1wID0gYXJnMCArIGFyZzEKLSAgICAgICAqIHJlc3VsdCA9IHRtcCArIC0uNQotICAgICAgICovCi0gICAgICB0bXAgPSBpOTE1X2VtaXRfY29uc3QxZihwLCAuNSk7Ci0gICAgICB0bXAgPSBuZWdhdGUoc3dpenpsZSh0bXAsWCxYLFgsWCksMSwxLDEsMSk7Ci0gICAgICBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX0FERCwgZGVzdCwgbWFzaywgMCwgc3JjWzBdLCBzcmNbMV0sIDAgKTsKLSAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfQURELCBkZXN0LCBtYXNrLCBzYXR1cmF0ZSwgZGVzdCwgdG1wLCAwICk7Ci0gICAgICByZXR1cm4gZGVzdDsKLSAgIGNhc2UgR0xfSU5URVJQT0xBVEU6CQkvKiBUV08gSU5TVFJVQ1RJT05TICovCi0gICAgICAvKiBBcmcwICogKEFyZzIpICsgQXJnMSAqICgxLUFyZzIpCi0gICAgICAgKgotICAgICAgICogQXJnMCpBcmcyICsgQXJnMSAtIEFyZzFBcmcyIAotICAgICAgICoKLSAgICAgICAqIHRtcCA9IEFyZzAqQXJnMiArIEFyZzEsIAotICAgICAgICogcmVzdWx0ID0gKC1BcmcxKUFyZzIgKyB0bXAgCi0gICAgICAgKi8KLSAgICAgIHRtcCA9IGk5MTVfZ2V0X3RlbXAoIHAgKTsKLSAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCB0bXAsIG1hc2ssIDAsIHNyY1swXSwgc3JjWzJdLCBzcmNbMV0gKTsKLSAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCBkZXN0LCBtYXNrLCBzYXR1cmF0ZSwgCi0JCSAgICAgIG5lZ2F0ZShzcmNbMV0sIDEsMSwxLDEpLCBzcmNbMl0sIHRtcCApOwotICAgICAgcmV0dXJuIGRlc3Q7Ci0gICBjYXNlIEdMX1NVQlRSQUNUOiAKLSAgICAgIC8qIG5lZ2F0ZSBzcmNbMV0gKi8KLSAgICAgIHJldHVybiBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX0FERCwgZGVzdCwgbWFzaywgc2F0dXJhdGUsIHNyY1swXSwKLQkJCSBuZWdhdGUoc3JjWzFdLDEsMSwxLDEpLCAwICk7Ci0KLSAgIGNhc2UgR0xfRE9UM19SR0JBOgotICAgY2FzZSBHTF9ET1QzX1JHQkFfRVhUOiAKLSAgIGNhc2UgR0xfRE9UM19SR0JfRVhUOgotICAgY2FzZSBHTF9ET1QzX1JHQjogewotICAgICAgR0x1aW50IHRtcDAgPSBpOTE1X2dldF90ZW1wKCBwICk7Ci0gICAgICBHTHVpbnQgdG1wMSA9IGk5MTVfZ2V0X3RlbXAoIHAgKTsKLSAgICAgIEdMdWludCBuZWcxID0gbmVnYXRlKHN3aXp6bGUoaTkxNV9lbWl0X2NvbnN0MWYocCwgMSksWCxYLFgsWCksIDEsMSwxLDEpOwotICAgICAgR0x1aW50IHR3byA9IHN3aXp6bGUoaTkxNV9lbWl0X2NvbnN0MWYocCwgMiksWCxYLFgsWCk7Ci0gICAgICBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01BRCwgdG1wMCwgQTBfREVTVF9DSEFOTkVMX0FMTCwgMCwgCi0JCSAgICAgIHR3bywgc3JjWzBdLCBuZWcxKTsKLSAgICAgIGlmIChzcmNbMF0gPT0gc3JjWzFdKQotCSB0bXAxID0gdG1wMDsKLSAgICAgIGVsc2UKLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NQUQsIHRtcDEsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsIAotCQkJIHR3bywgc3JjWzFdLCBuZWcxKTsKLSAgICAgIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfRFAzLCBkZXN0LCBtYXNrLCBzYXR1cmF0ZSwgdG1wMCwgdG1wMSwgMCk7Ci0gICAgICByZXR1cm4gZGVzdDsKLSAgIH0KLQotICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gc3JjWzBdOwotICAgfQotfQotCi1zdGF0aWMgR0x1aW50IGdldF9kZXN0KCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBpbnQgdW5pdCApCi17Ci0gICBpZiAocC0+Y3R4LT5fVHJpYW5nbGVDYXBzICYgRERfU0VQQVJBVEVfU1BFQ1VMQVIpCi0gICAgICByZXR1cm4gaTkxNV9nZXRfdGVtcCggcCApOwotICAgZWxzZSBpZiAodW5pdCAhPSBwLT5sYXN0X3RleF9zdGFnZSkKLSAgICAgIHJldHVybiBpOTE1X2dldF90ZW1wKCBwICk7Ci0gICBlbHNlCi0gICAgICByZXR1cm4gVVJFRyhSRUdfVFlQRV9PQywgMCk7Ci19Ci0gICAgICAKLQotCi1zdGF0aWMgR0x1aW50IGVtaXRfdGV4ZW52KCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwLCBpbnQgdW5pdCApCi17Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJnAtPmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdOwotICAgR0xlbnVtIGVudk1vZGUgPSB0ZXhVbml0LT5FbnZNb2RlOwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gdGV4VW5pdC0+X0N1cnJlbnQ7Ci0gICBHTGVudW0gZm9ybWF0ID0gdE9iai0+SW1hZ2VbMF1bdE9iai0+QmFzZUxldmVsXS0+X0Jhc2VGb3JtYXQ7Ci0gICBHTHVpbnQgc2F0dXJhdGUgPSB1bml0IDwgcC0+bGFzdF90ZXhfc3RhZ2UgPyBBMF9ERVNUX1NBVFVSQVRFIDogMDsKLQotICAgc3dpdGNoKGVudk1vZGUpIHsKLSAgIGNhc2UgR0xfQkxFTkQ6IHsKLSAgICAgIGNvbnN0IGludCBjZiA9IGdldF9zb3VyY2UocCwgR0xfUFJFVklPVVMsIHVuaXQpOwotICAgICAgY29uc3QgaW50IGNjID0gZ2V0X3NvdXJjZShwLCBHTF9DT05TVEFOVCwgdW5pdCk7Ci0gICAgICBjb25zdCBpbnQgY3MgPSBnZXRfc291cmNlKHAsIEdMX1RFWFRVUkUsIHVuaXQpOwotICAgICAgY29uc3QgaW50IG91dCA9IGdldF9kZXN0KHAsIHVuaXQpOwotCi0gICAgICBpZiAoZm9ybWF0ID09IEdMX0lOVEVOU0lUWSkgewotCSAvKiBjdiA9IGNmKDEgLSBjcykgKyBjYy5jcwotCSAgKiBjdiA9IGNmIC0gY2YuY3MgKyBjYy5jcwotCSAgKi8KLQkgLyogdVsyXSA9IE1BRCggLWNmICogY3MgKyBjZiApCi0JICAqIGN2ICAgPSBNQUQoIGNjICogY3MgKyB1WzJdICkKLQkgICovCi0JIAotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01BRCwgb3V0LCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLCAKLQkJCSBuZWdhdGUoY2YsMSwxLDEsMSksIGNzLCBjZiApOwotCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIHNhdHVyYXRlLCAKLQkJCSBjYywgY3MsIG91dCApOwotCi0JIHJldHVybiBvdXQ7Ci0gICAgICB9IGVsc2UgewotCSAvKiBjdiA9IGNmKDEgLSBjcykgKyBjYy5jcwotCSAgKiBjdiA9IGNmIC0gY2YuY3MgKyBjYy5jcwotCSAgKiBhdiA9ICAgICAgYWYuYXMKLQkgICovCi0JIC8qIHVbMl0gPSBNQUQoIGNmLi14LXktencgKiBjcy54eXp3ICsgY2YueHl6MCApCi0JICAqIG9DICAgPSBNQUQoIGNjLnh5ejAgKiBjcy54eXowICsgdVsyXS54eXp3ICkKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgbmVnYXRlKGNmLDEsMSwxLDApLCAgCi0JCQkgY3MsCi0JCQkgc3dpenpsZShjZixYLFksWixaRVJPKSApOwotCi0KLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NQUQsIG91dCwgQTBfREVTVF9DSEFOTkVMX0FMTCwgc2F0dXJhdGUsCi0JCQkgc3dpenpsZShjYyxYLFksWixaRVJPKSwgIAotCQkJIHN3aXp6bGUoY3MsWCxZLFosWkVSTyksCi0JCQkgb3V0ICk7Ci0KLQkgcmV0dXJuIG91dDsKLSAgICAgIH0KLSAgIH0KLQotICAgY2FzZSBHTF9ERUNBTDogewotICAgICAgaWYgKGZvcm1hdCA9PSBHTF9SR0IgfHwKLQkgIGZvcm1hdCA9PSBHTF9SR0JBKSB7Ci0JIGludCBjZiA9IGdldF9zb3VyY2UoIHAsIEdMX1BSRVZJT1VTLCB1bml0ICk7Ci0JIGludCBjcyA9IGdldF9zb3VyY2UoIHAsIEdMX1RFWFRVUkUsIHVuaXQgKTsKLQkgaW50IG91dCA9IGdldF9kZXN0KHAsIHVuaXQpOwotCSAKLQkgLyogY3YgPSBjZigxLWFzKSArIGNzLmFzCi0JICAqIGN2ID0gY2YuKC1hcykgKyBjZiArIGNzLmFzCi0JICAqIGF2ID0gYWYKLQkgICovIAotCSAKLQkgLyogdVsyXSA9IG1hZCggY2YueHl6dyAqIGNzLi13LXctdzEgKyBjZi54eXowICkKLQkgICogb2MgPSBtYWQoIGNzLnh5ejAgKiBjcy53d3cwICsgdVsyXS54eXp3ICkKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIDAsCi0JCQkgY2YsICAKLQkJCSBuZWdhdGUoc3dpenpsZShjcyxXLFcsVyxPTkUpLDEsMSwxLDApLAotCQkJIHN3aXp6bGUoY2YsWCxZLFosWkVSTykgKTsKLQkgCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTUFELCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIHNhdHVyYXRlLAotCQkJIHN3aXp6bGUoY3MsWCxZLFosWkVSTyksICAKLQkJCSBzd2l6emxlKGNzLFcsVyxXLFpFUk8pLAotCQkJIG91dCApOwotCSByZXR1cm4gb3V0OwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIHJldHVybiBnZXRfc291cmNlKCBwLCBHTF9QUkVWSU9VUywgdW5pdCApOwotICAgICAgfQotICAgfQotCi0gICBjYXNlIEdMX1JFUExBQ0U6IHsKLSAgICAgIGNvbnN0IGludCBjcyA9IGdldF9zb3VyY2UoIHAsIEdMX1RFWFRVUkUsIHVuaXQgKTsJLyogc2F0dXJhdGVkICovCi0gICAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgY2FzZSBHTF9BTFBIQTogewotCSBjb25zdCBpbnQgY2YgPSBnZXRfc291cmNlKCBwLCBHTF9QUkVWSU9VUywgdW5pdCApOyAvKiBzYXR1cmF0ZWQgKi8KLQkgaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NT1YsIGNzLCBBMF9ERVNUX0NIQU5ORUxfWFlaLCAwLCBjZiwgMCwgMCApOwotCSByZXR1cm4gY3M7Ci0gICAgICB9Ci0gICAgICBjYXNlIEdMX1JHQjoKLSAgICAgIGNhc2UgR0xfTFVNSU5BTkNFOiB7Ci0JIGNvbnN0IGludCBjZiA9IGdldF9zb3VyY2UoIHAsIEdMX1BSRVZJT1VTLCB1bml0ICk7IC8qIHNhdHVyYXRlZCAqLwotCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01PViwgY3MsIEEwX0RFU1RfQ0hBTk5FTF9XLCAwLCBjZiwgMCwgMCApOwotCSByZXR1cm4gY3M7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotCSByZXR1cm4gY3M7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGNhc2UgR0xfTU9EVUxBVEU6IHsKLSAgICAgIGNvbnN0IGludCBjZiA9IGdldF9zb3VyY2UoIHAsIEdMX1BSRVZJT1VTLCB1bml0ICk7Ci0gICAgICBjb25zdCBpbnQgY3MgPSBnZXRfc291cmNlKCBwLCBHTF9URVhUVVJFLCB1bml0ICk7Ci0gICAgICBjb25zdCBpbnQgb3V0ID0gZ2V0X2Rlc3QocCwgdW5pdCk7Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgY2FzZSBHTF9BTFBIQTogCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTVVMLCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIHNhdHVyYXRlLAotCQkJIHN3aXp6bGUoY3MsIE9ORSwgT05FLCBPTkUsIFcpLCBjZiwgMCApOwotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfTVVMLCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIHNhdHVyYXRlLCAKLQkJCSBjcywgY2YsIDAgKTsKLQkgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb3V0OwotICAgfQotICAgY2FzZSBHTF9BREQ6IHsKLSAgICAgIGludCBjZiA9IGdldF9zb3VyY2UoIHAsIEdMX1BSRVZJT1VTLCB1bml0ICk7Ci0gICAgICBpbnQgY3MgPSBnZXRfc291cmNlKCBwLCBHTF9URVhUVVJFLCB1bml0ICk7Ci0gICAgICBjb25zdCBpbnQgb3V0ID0gZ2V0X2Rlc3QoIHAsIHVuaXQgKTsKLQotICAgICAgaWYgKGZvcm1hdCA9PSBHTF9JTlRFTlNJVFkpIHsKLQkgLyogb3V0cHV0LWNvbG9yLnJnYmEgPSBhZGQoIGluY29taW5nLCB1WzFdICkKLQkgICovCi0JIGk5MTVfZW1pdF9hcml0aCggcCwgQTBfQURELCBvdXQsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIHNhdHVyYXRlLCAKLQkJCSBjcywgY2YsIDAgKTsKLQkgcmV0dXJuIG91dDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCSAvKiBjdi54eXogPSBjZi54eXogKyBjcy54eXoKLQkgICogY3YudyAgID0gY2YudyAqIGNzLncKLQkgICoKLQkgICogY3YueHl6dyA9IE1BRCggY2YuMTExdyAqIGNzLnh5encgKyBjZi54eXowICkKLQkgICovCi0gCSBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01BRCwgb3V0LCBBMF9ERVNUX0NIQU5ORUxfQUxMLCBzYXR1cmF0ZSwKLQkJCSBzd2l6emxlKGNmLE9ORSxPTkUsT05FLFcpLCAKLQkJCSBjcywgIAotCQkJIHN3aXp6bGUoY2YsWCxZLFosWkVSTykgKTsgCi0JIHJldHVybiBvdXQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIH0KLSAgIGNhc2UgR0xfQ09NQklORTogewotICAgICAgR0x1aW50IHJnYl9zaGlmdCwgYWxwaGFfc2hpZnQsIG91dCwgc2hpZnQ7Ci0gICAgICBHTHVpbnQgZGVzdCA9IGdldF9kZXN0KHAsIHVuaXQpOwotCi0gICAgICAvKiBUaGUgRVhUIHZlcnNpb24gb2YgdGhlIERPVDMgZXh0ZW5zaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gICAgICAgKiBzY2FsZSBmYWN0b3IsIGJ1dCB0aGUgQVJCIHZlcnNpb24gKGFuZCB0aGUgdmVyc2lvbiBpbiBPcGVuR0wKLSAgICAgICAqIDEuMykgZG9lcy4KLSAgICAgICAqLwotICAgICAgc3dpdGNoICh0ZXhVbml0LT5Db21iaW5lLk1vZGVSR0IpIHsKLSAgICAgIGNhc2UgR0xfRE9UM19SR0JfRVhUOgotCSBhbHBoYV9zaGlmdCA9IHRleFVuaXQtPkNvbWJpbmUuU2NhbGVTaGlmdEE7Ci0JIHJnYl9zaGlmdCA9IDA7Ci0JIGJyZWFrOwotCi0gICAgICBjYXNlIEdMX0RPVDNfUkdCQV9FWFQ6Ci0JIGFscGhhX3NoaWZ0ID0gMDsKLQkgcmdiX3NoaWZ0ID0gMDsKLQkgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JIHJnYl9zaGlmdCA9IHRleFVuaXQtPkNvbWJpbmUuU2NhbGVTaGlmdFJHQjsKLQkgYWxwaGFfc2hpZnQgPSB0ZXhVbml0LT5Db21iaW5lLlNjYWxlU2hpZnRBOwotCSBicmVhazsKLSAgICAgIH0KLQotCi0gICAgICAvKiBFbWl0IHRoZSBSR0IgYW5kIEEgY29tYmluZSBvcHMKLSAgICAgICAqLwotICAgICAgaWYgKHRleFVuaXQtPkNvbWJpbmUuTW9kZVJHQiA9PSB0ZXhVbml0LT5Db21iaW5lLk1vZGVBICYmIAotCSAgYXJnc19tYXRjaCggdGV4VW5pdCApKSB7Ci0JIG91dCA9IGVtaXRfY29tYmluZSggcCwgZGVzdCwgQTBfREVTVF9DSEFOTkVMX0FMTCwgc2F0dXJhdGUsCi0JCQkgICAgIHVuaXQsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuTW9kZVJHQiwKLQkJCSAgICAgdGV4VW5pdC0+Q29tYmluZS5Tb3VyY2VSR0IsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuT3BlcmFuZFJHQiApOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGV4VW5pdC0+Q29tYmluZS5Nb2RlUkdCID09IEdMX0RPVDNfUkdCQV9FWFQgfHwKLQkgICAgICAgdGV4VW5pdC0+Q29tYmluZS5Nb2RlUkdCID09IEdMX0RPVDNfUkdCQSkgewotCi0JIG91dCA9IGVtaXRfY29tYmluZSggcCwgZGVzdCwgQTBfREVTVF9DSEFOTkVMX0FMTCwgc2F0dXJhdGUsCi0JCQkgICAgIHVuaXQsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuTW9kZVJHQiwKLQkJCSAgICAgdGV4VW5pdC0+Q29tYmluZS5Tb3VyY2VSR0IsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuT3BlcmFuZFJHQiApOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIC8qIE5lZWQgdG8gZG8gc29tZXRoaW5nIHRvIHN0b3AgZnJvbSByZS1lbWl0dGluZyBpZGVudGljYWwKLQkgICogYXJndW1lbnQgY2FsY3VsYXRpb25zIGhlcmU6Ci0JICAqLwotCSBvdXQgPSBlbWl0X2NvbWJpbmUoIHAsIGRlc3QsIEEwX0RFU1RfQ0hBTk5FTF9YWVosIHNhdHVyYXRlLAotCQkJICAgICB1bml0LAotCQkJICAgICB0ZXhVbml0LT5Db21iaW5lLk1vZGVSR0IsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuU291cmNlUkdCLAotCQkJICAgICB0ZXhVbml0LT5Db21iaW5lLk9wZXJhbmRSR0IgKTsKLQkgb3V0ID0gZW1pdF9jb21iaW5lKCBwLCBkZXN0LCBBMF9ERVNUX0NIQU5ORUxfVywgc2F0dXJhdGUsCi0JCQkgICAgIHVuaXQsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuTW9kZUEsCi0JCQkgICAgIHRleFVuaXQtPkNvbWJpbmUuU291cmNlQSwKLQkJCSAgICAgdGV4VW5pdC0+Q29tYmluZS5PcGVyYW5kQSApOwotICAgICAgfQotCi0gICAgICAvKiBEZWFsIHdpdGggdGhlIGZpbmFsIHNoaWZ0OgotICAgICAgICovCi0gICAgICBpZiAoYWxwaGFfc2hpZnQgfHwgcmdiX3NoaWZ0KSB7Ci0JIGlmIChyZ2Jfc2hpZnQgPT0gYWxwaGFfc2hpZnQpIHsKLQkgICAgc2hpZnQgPSBpOTE1X2VtaXRfY29uc3QxZihwLCAxPDxyZ2Jfc2hpZnQpOwotCSAgICBzaGlmdCA9IHN3aXp6bGUoc2hpZnQsWCxYLFgsWCk7Ci0JIH0KLQkgZWxzZSB7Ci0JICAgIHNoaWZ0ID0gaTkxNV9lbWl0X2NvbnN0MmYocCwgMTw8cmdiX3NoaWZ0LCAxPDxhbHBoYV9zaGlmdCk7Ci0JICAgIHNoaWZ0ID0gc3dpenpsZShzaGlmdCxYLFgsWCxZKTsKLQkgfQotCSByZXR1cm4gaTkxNV9lbWl0X2FyaXRoKCBwLCBBMF9NVUwsIGRlc3QsIEEwX0RFU1RfQ0hBTk5FTF9BTEwsIAotCQkJCXNhdHVyYXRlLCBvdXQsIHNoaWZ0LCAwICk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBvdXQ7Ci0gICB9Ci0KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZ2V0X3NvdXJjZShwLCBHTF9QUkVWSU9VUywgMCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGVtaXRfcHJvZ3JhbV9maW5pKCBzdHJ1Y3QgaTkxNV9mcmFnbWVudF9wcm9ncmFtICpwICkKLXsKLSAgIGludCBjZiA9IGdldF9zb3VyY2UoIHAsIEdMX1BSRVZJT1VTLCAwICk7Ci0gICBpbnQgb3V0ID0gVVJFRyggUkVHX1RZUEVfT0MsIDAgKTsKLQotICAgaWYgKHAtPmN0eC0+X1RyaWFuZ2xlQ2FwcyAmIEREX1NFUEFSQVRFX1NQRUNVTEFSKSB7Ci0gICAgICAvKiBFbWl0IHNwZWN1bGFyIGFkZC4KLSAgICAgICAqLwotICAgICAgR0x1aW50IHMgPSBpOTE1X2VtaXRfZGVjbChwLCBSRUdfVFlQRV9ULCBUX1NQRUNVTEFSLCBEMF9DSEFOTkVMX0FMTCk7Ci0gICAgICBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX0FERCwgb3V0LCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLCBjZiwgCi0JCSAgc3dpenpsZShzLCBYLFksWixaRVJPKSwgMCApOwotICAgfQotICAgZWxzZSBpZiAoY2YgIT0gb3V0KSB7Ci0gICAgICAvKiBXaWxsIHdpbmQgdXAgaW4gaGVyZSBpZiBubyB0ZXh0dXJlIGVuYWJsZWQgb3IgYSBjb3VwbGUgb2YKLSAgICAgICAqIG90aGVyIHNjZW5hcmlvcyAoR0xfUkVQTEFDRSBmb3IgaW5zdGFuY2UpLgotICAgICAgICovCi0gICAgICBpOTE1X2VtaXRfYXJpdGgoIHAsIEEwX01PViwgb3V0LCBBMF9ERVNUX0NIQU5ORUxfQUxMLCAwLCBjZiwgMCwgMCApOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGk5MTVFbWl0VGV4dHVyZVByb2dyYW0oIGk5MTVDb250ZXh0UHRyIGk5MTUgKQotewotICAgR0xjb250ZXh0ICpjdHggPSAmaTkxNS0+aW50ZWwuY3R4OwotICAgc3RydWN0IGk5MTVfZnJhZ21lbnRfcHJvZ3JhbSAqcCA9ICZpOTE1LT50ZXhfcHJvZ3JhbTsKLSAgIEdMdWludCB1bml0OwotCi0gICBpZiAoMCkgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgaTkxNV9pbml0X3Byb2dyYW0oIGk5MTUsIHAgKTsKLQotICAgaWYgKGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzKSB7Ci0gICAgICBmb3IgKHVuaXQgPSAwIDsgdW5pdCA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzIDsgdW5pdCsrKQotCSBpZiAoY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF0uX1JlYWxseUVuYWJsZWQpIHsKLQkgICAgcC0+bGFzdF90ZXhfc3RhZ2UgPSB1bml0OwotCSB9Ci0KLSAgICAgIGZvciAodW5pdCA9IDAgOyB1bml0IDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IHVuaXQrKykKLQkgaWYgKGN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdLl9SZWFsbHlFbmFibGVkKSB7Ci0JICAgIHAtPnNyY19wcmV2aW91cyA9IGVtaXRfdGV4ZW52KCBwLCB1bml0ICk7Ci0JICAgIHAtPnNyY190ZXh0dXJlID0gVVJFR19CQUQ7Ci0JICAgIHAtPnRlbXBfZmxhZyA9IDB4ZmZmZjAwMDsKLQkgICAgcC0+dGVtcF9mbGFnIHw9IDEgPDwgR0VUX1VSRUdfTlIocC0+c3JjX3ByZXZpb3VzKTsKLQkgfQotICAgfQotCi0gICBlbWl0X3Byb2dyYW1fZmluaSggcCApOwotCi0gICBpOTE1X2ZpbmlfcHJvZ3JhbSggcCApOwotICAgaTkxNV91cGxvYWRfcHJvZ3JhbSggaTkxNSwgcCApOwotCi0gICBwLT50cmFuc2xhdGVkID0gMTsKLX0KLQotCi12b2lkIGk5MTVWYWxpZGF0ZVRleHR1cmVQcm9ncmFtKCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9ICZpOTE1LT5pbnRlbDsKLSAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0gICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwotICAgc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJnRubC0+dmI7Ci0gICBERUNMQVJFX1JFTkRFUklOUFVUUyhpbmRleF9iaXRzZXQpOwotICAgaW50IGksIG9mZnNldDsKLSAgIEdMdWludCBzNCA9IGk5MTUtPnN0YXRlLkN0eFtJOTE1X0NUWFJFR19MSVM0XSAmIH5TNF9WRk1UX01BU0s7Ci0gICBHTHVpbnQgczIgPSBTMl9URVhDT09SRF9OT05FOwotCi0gICBSRU5ERVJJTlBVVFNfQ09QWSggaW5kZXhfYml0c2V0LCB0bmwtPnJlbmRlcl9pbnB1dHNfYml0c2V0ICk7Ci0KLSAgIC8qIEltcG9ydGFudDoKLSAgICAqLwotICAgVkItPkF0dHJpYlB0cltWRVJUX0FUVFJJQl9QT1NdID0gVkItPk5kY1B0cjsKLSAgIGludGVsLT52ZXJ0ZXhfYXR0cl9jb3VudCA9IDA7Ci0gICBpbnRlbC0+Y29sb3JvZmZzZXQgPSAwOwotICAgaW50ZWwtPnNwZWNvZmZzZXQgPSAwOwotICAgb2Zmc2V0ID0gMDsKLQotICAgaWYgKGk5MTUtPmN1cnJlbnRfcHJvZ3JhbSkgewotICAgICAgaTkxNS0+Y3VycmVudF9wcm9ncmFtLT5vbl9oYXJkd2FyZSA9IDA7Ci0gICAgICBpOTE1LT5jdXJyZW50X3Byb2dyYW0tPnBhcmFtc191cHRvZGF0ZSA9IDA7Ci0gICB9Ci0KLSAgIGlmIChpOTE1LT52ZXJ0ZXhfZm9nID09IEk5MTVfRk9HX1BJWEVMKSB7Ci0gICAgICBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF80Rl9WSUVXUE9SVCwgUzRfVkZNVF9YWVpXLCAxNiApOwotICAgICAgUkVOREVSSU5QVVRTX0NMRUFSKCBpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0ZPRyApOwotICAgfQotICAgZWxzZSBpZiAoUkVOREVSSU5QVVRTX1RFU1RfUkFOR0UoIGluZGV4X2JpdHNldCwgX1ROTF9GSVJTVF9URVgsIF9UTkxfTEFTVF9URVggKSkgewotICAgICAgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9QT1MsIEVNSVRfNEZfVklFV1BPUlQsIFM0X1ZGTVRfWFlaVywgMTYgKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9QT1MsIEVNSVRfM0ZfVklFV1BPUlQsIFM0X1ZGTVRfWFlaLCAxMiApOwotICAgfQotCi0gICAvKiBIb3cgdW5kZWZpbmVkIGlzIHVuZGVmaW5lZD8gKi8KLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUgKSkgewotICAgICAgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUsIEVNSVRfMUYsIFM0X1ZGTVRfUE9JTlRfV0lEVEgsIDQgKTsKLSAgIH0KLSAgICAgIAotICAgaW50ZWwtPmNvbG9yb2Zmc2V0ID0gb2Zmc2V0IC8gNDsKLSAgIEVNSVRfQVRUUiggX1ROTF9BVFRSSUJfQ09MT1IwLCBFTUlUXzRVQl80Rl9CR1JBLCBTNF9WRk1UX0NPTE9SLCA0ICk7Ci0gICAgICAgICAgICAKLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9DT0xPUjEgKSB8fAotICAgICAgIFJFTkRFUklOUFVUU19URVNUKCBpbmRleF9iaXRzZXQsIF9UTkxfQVRUUklCX0ZPRyApKSB7Ci0gICAgICBpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfQ09MT1IxICkpIHsKLQkgaW50ZWwtPnNwZWNvZmZzZXQgPSBvZmZzZXQgLyA0OwotCSBFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0NPTE9SMSwgRU1JVF8zVUJfM0ZfQkdSLCBTNF9WRk1UX1NQRUNfRk9HLCAzICk7Ci0gICAgICB9IGVsc2UgCi0JIEVNSVRfUEFEKCAzICk7Ci0gICAgICAKLSAgICAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9GT0cgKSkKLQkgRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9GT0csIEVNSVRfMVVCXzFGLCBTNF9WRk1UX1NQRUNfRk9HLCAxICk7Ci0gICAgICBlbHNlCi0JIEVNSVRfUEFEKCAxICk7Ci0gICB9Ci0KLSAgIGlmIChSRU5ERVJJTlBVVFNfVEVTVF9SQU5HRSggaW5kZXhfYml0c2V0LCBfVE5MX0ZJUlNUX1RFWCwgX1ROTF9MQVNUX1RFWCApKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JIGlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9URVgoaSkgKSkgewotCSAgICBpbnQgc3ogPSBWQi0+VGV4Q29vcmRQdHJbaV0tPnNpemU7Ci0JICAgIAotCSAgICBzMiAmPSB+UzJfVEVYQ09PUkRfRk1UKGksIFMyX1RFWENPT1JEX0ZNVDBfTUFTSyk7Ci0JICAgIHMyIHw9IFMyX1RFWENPT1JEX0ZNVChpLCBTWl9UT19IVyhzeikpOwotCi0JICAgIEVNSVRfQVRUUiggX1ROTF9BVFRSSUJfVEVYMCtpLCBFTUlUX1NaKHN6KSwgMCwgc3ogKiA0ICk7Ci0JIH0KLSAgICAgIH0KLSAgIH0KLQotICAgLyogT25seSBuZWVkIHRvIGNoYW5nZSB0aGUgdmVydGV4IGVtaXQgY29kZSBpZiB0aGVyZSBoYXMgYmVlbiBhCi0gICAgKiBzdGF0ZWNoYW5nZSB0byBhIG5ldyBoYXJkd2FyZSB2ZXJ0ZXggZm9ybWF0OgotICAgICovCi0gICBpZiAoczIgIT0gaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzJdIHx8Ci0gICAgICAgczQgIT0gaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzRdKSB7Ci0gICAgCi0gICAgICBJOTE1X1NUQVRFQ0hBTkdFKCBpOTE1LCBJOTE1X1VQTE9BRF9DVFggKTsKLQotICAgICAgaTkxNS0+dGV4X3Byb2dyYW0udHJhbnNsYXRlZCA9IDA7Ci0KLSAgICAgIC8qIE11c3QgZG8gdGhpcyAqYWZ0ZXIqIHN0YXRlY2hhbmdlLCBzbyBhcyBub3QgdG8gYWZmZWN0Ci0gICAgICAgKiBidWZmZXJlZCB2ZXJ0aWNlcyByZWxpYW50IG9uIHRoZSBvbGQgc3RhdGU6Ci0gICAgICAgKi8KLSAgICAgIGludGVsLT52ZXJ0ZXhfc2l6ZSA9IF90bmxfaW5zdGFsbF9hdHRycyggY3R4LCAKLQkJCQkJICAgICAgIGludGVsLT52ZXJ0ZXhfYXR0cnMsIAotCQkJCQkgICAgICAgaW50ZWwtPnZlcnRleF9hdHRyX2NvdW50LAotCQkJCQkgICAgICAgaW50ZWwtPlZpZXdwb3J0TWF0cml4Lm0sIDAgKTsgCi0KLSAgICAgIGludGVsLT52ZXJ0ZXhfc2l6ZSA+Pj0gMjsKLQotICAgICAgaTkxNS0+c3RhdGUuQ3R4W0k5MTVfQ1RYUkVHX0xJUzJdID0gczI7Ci0gICAgICBpOTE1LT5zdGF0ZS5DdHhbSTkxNV9DVFhSRUdfTElTNF0gPSBzNDsKLQotICAgICAgYXNzZXJ0KGludGVsLT52dGJsLmNoZWNrX3ZlcnRleF9zaXplKCBpbnRlbCwgaW50ZWwtPnZlcnRleF9zaXplICkpOwotICAgfQotCi0gICBpZiAoIWk5MTUtPnRleF9wcm9ncmFtLnRyYW5zbGF0ZWQgfHwKLSAgICAgICBpOTE1LT5sYXN0X1JlYWxseUVuYWJsZWQgIT0gY3R4LT5UZXh0dXJlLl9FbmFibGVkVW5pdHMpIHsKLSAgICAgIGk5MTVFbWl0VGV4dHVyZVByb2dyYW0oIGk5MTUgKTsgICAgICAKLSAgICAgIGk5MTUtPmxhc3RfUmVhbGx5RW5hYmxlZCA9IGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3RleHN0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdGV4c3RhdGUuYwppbmRleCBhMTlkNGI2Li42OWMxZTA3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdGV4c3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdGV4c3RhdGUuYwpAQCAtMjUsOTAyICsyNSwzNTEgQEAKICAqIAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKICNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJzaW1wbGVfbGlzdC5oIgogI2luY2x1ZGUgImVudW1zLmgiCiAjaW5jbHVkZSAidGV4Zm9ybWF0LmgiCi0jaW5jbHVkZSAidGV4c3RvcmUuaCIKKyNpbmNsdWRlICJkcmlfYnVmbWdyLmgiCiAKLSNpbmNsdWRlICJtbS5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCi0jaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKKyNpbmNsdWRlICJpbnRlbF9taXBtYXBfdHJlZS5oIgogI2luY2x1ZGUgImludGVsX3RleC5oIgogCiAjaW5jbHVkZSAiaTkxNV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiaTkxNV9yZWcuaCIKIAotc3RhdGljIEdMaW50IGluaXRpYWxfb2Zmc2V0c1s2XVsyXSA9IHsgezAsMH0sCi0JCQkJICAgICAgIHswLDJ9LAotCQkJCSAgICAgICB7MSwwfSwKLQkJCQkgICAgICAgezEsMn0sCi0JCQkJICAgICAgIHsxLDF9LAotCQkJCSAgICAgICB7MSwzfSB9OwogCi0KLXN0YXRpYyBHTGludCBzdGVwX29mZnNldHNbNl1bMl0gPSB7IHswLDJ9LAotCQkJCSAgICB7MCwyfSwKLQkJCQkgICAgey0xLDJ9LAotCQkJCSAgICB7LTEsMn0sCi0JCQkJICAgIHstMSwxfSwKLQkJCQkgICAgey0xLDF9IH07Ci0KLQotI2RlZmluZSBJOTE1X1RFWF9VTklUX0VOQUJMRUQodW5pdCkJCSgxPDx1bml0KQotCi1zdGF0aWMgdm9pZCBpOTE1TGF5b3V0VGV4dHVyZUltYWdlcyggaTkxNUNvbnRleHRQdHIgaTkxNSwKLQkJCQkgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiApCitzdGF0aWMgR0x1aW50Cit0cmFuc2xhdGVfdGV4dHVyZV9mb3JtYXQoR0x1aW50IG1lc2FfZm9ybWF0LCBHTGVudW0gRGVwdGhNb2RlKQogewotICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmJhc2VJbWFnZSA9IHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF07Ci0gICBpOTE1VGV4dHVyZU9iamVjdFB0ciB0ID0gKGk5MTVUZXh0dXJlT2JqZWN0UHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwotICAgR0xpbnQgZmlyc3RMZXZlbCwgbGFzdExldmVsLCBudW1MZXZlbHM7Ci0gICBHTGludCBpLCB0b3RhbF9oZWlnaHQsIHBpdGNoOwotCi0gICAvKiBDb21wdXRlIHdoaWNoIG1pcG1hcCBsZXZlbHMgd2UgcmVhbGx5IHdhbnQgdG8gc2VuZCB0byB0aGUgaGFyZHdhcmUuCi0gICAgKi8KLSAgIGRyaUNhbGN1bGF0ZVRleHR1cmVGaXJzdExhc3RMZXZlbCggKGRyaVRleHR1cmVPYmplY3QgKikgdCApOwotCi0gICAvKiBGaWd1cmUgb3V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgYWxsIHRoZSBtaXBtYXAKLSAgICAqIGxldmVscy4gIENob29zZSB0aGUgc21hbGxlc3QgcGl0Y2ggdG8gYWNjb21vZGF0ZSB0aGUgbGFyZ2VzdAotICAgICogbWlwbWFwOgotICAgICovCi0gICBmaXJzdExldmVsID0gdC0+aW50ZWwuYmFzZS5maXJzdExldmVsOwotICAgbGFzdExldmVsID0gdC0+aW50ZWwuYmFzZS5sYXN0TGV2ZWw7Ci0gICBudW1MZXZlbHMgPSBsYXN0TGV2ZWwgLSBmaXJzdExldmVsICsgMTsKLQotCi0KLSAgIC8qIEFsbCBpbWFnZXMgbXVzdCBiZSBsb2FkZWQgYXQgdGhpcyBwaXRjaC4gIENvdW50IHRoZSBudW1iZXIgb2YKLSAgICAqIGxpbmVzIHJlcXVpcmVkOgotICAgICovCi0gICBzd2l0Y2ggKHRPYmotPlRhcmdldCkgewotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQOiB7Ci0gICAgICBjb25zdCBHTHVpbnQgZGltID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbF0tPldpZHRoOwotICAgICAgR0x1aW50IGZhY2U7Ci0KLSAgICAgIHBpdGNoID0gZGltICogdC0+aW50ZWwudGV4ZWxCeXRlczsKLSAgICAgIHBpdGNoICo9IDI7CQkvKiBkb3VibGUgcGl0Y2ggZm9yIGN1YmUgbGF5b3V0cyAqLwotICAgICAgcGl0Y2ggPSAocGl0Y2ggKyAzKSAmIH4zOwotICAgICAgCi0gICAgICB0b3RhbF9oZWlnaHQgPSBkaW0gKiA0OwotCi0gICAgICBmb3IgKCBmYWNlID0gMCA7IGZhY2UgPCA2IDsgZmFjZSsrKSB7Ci0JIEdMdWludCB4ID0gaW5pdGlhbF9vZmZzZXRzW2ZhY2VdWzBdICogZGltOwotCSBHTHVpbnQgeSA9IGluaXRpYWxfb2Zmc2V0c1tmYWNlXVsxXSAqIGRpbTsKLQkgR0x1aW50IGQgPSBkaW07Ci0JIAotCSB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1tmYWNlXSA9IH4wOwotCi0JIGFzc2VydCh0T2JqLT5JbWFnZVtmYWNlXVtmaXJzdExldmVsXS0+V2lkdGggPT0gZGltKTsKLQkgYXNzZXJ0KHRPYmotPkltYWdlW2ZhY2VdW2ZpcnN0TGV2ZWxdLT5IZWlnaHQgPT0gZGltKTsKLQotCSBmb3IgKGkgPSAwOyBpIDwgbnVtTGV2ZWxzOyBpKyspIHsKLQkgICAgdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW1hZ2UgPSB0T2JqLT5JbWFnZVtmYWNlXVtmaXJzdExldmVsICsgaV07Ci0JICAgIGlmICghdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW1hZ2UpIHsKLQkgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBpbWFnZSAlZCAlZFxuIiwgZmFjZSwgaSk7Ci0JICAgICAgIGJyZWFrOwkJLyogY2FuJ3QgaGFwcGVuICovCi0JICAgIH0KLQkgCi0JICAgIHQtPmludGVsLmltYWdlW2ZhY2VdW2ldLm9mZnNldCA9IAotCSAgICAgICB5ICogcGl0Y2ggKyB4ICogdC0+aW50ZWwudGV4ZWxCeXRlczsKLQkgICAgdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW50ZXJuYWxGb3JtYXQgPSBiYXNlSW1hZ2UtPl9CYXNlRm9ybWF0OwotCi0JICAgIGQgPj49IDE7Ci0JICAgIHggKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzBdICogZDsKLQkgICAgeSArPSBzdGVwX29mZnNldHNbZmFjZV1bMV0gKiBkOwotCSB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIH0KLSAgIGNhc2UgR0xfVEVYVFVSRV8zRDogewotICAgICAgR0x1aW50IHZpcnR1YWxfaGVpZ2h0OwotICAgICAgR0x1aW50IHRtcF9udW1MZXZlbHMgPSBudW1MZXZlbHM7Ci0gICAgICBwaXRjaCA9IHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5XaWR0aCAqIHQtPmludGVsLnRleGVsQnl0ZXM7Ci0gICAgICBwaXRjaCA9IChwaXRjaCArIDMpICYgfjM7Ci0gICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSA9IH4wOwotCi0gICAgICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBzaW5nbGUgc2xpY2UuICBIYXJkd2FyZSBkZW1hbmRzIGEKLSAgICAgICAqIG1pbmltdW0gb2YgOCBtaXBtYXBzLCBzb21lIG9mIHdoaWNoIG1pZ2h0IHVsdGltYXRlbHkgbm90IGJlCi0gICAgICAgKiB1c2VkOgotICAgICAgICovCi0gICAgICBpZiAodG1wX251bUxldmVscyA8IDkpCi0JIHRtcF9udW1MZXZlbHMgPSA5OwotCi0gICAgICB2aXJ0dWFsX2hlaWdodCA9IHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5IZWlnaHQ7Ci0KLSAgICAgIGZvciAoIHRvdGFsX2hlaWdodCA9IGkgPSAwIDsgaSA8IHRtcF9udW1MZXZlbHMgOyBpKysgKSB7Ci0JIHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbCArIGldOwotCSBpZiAodC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UpIHsKLQkgICAgdC0+aW50ZWwuaW1hZ2VbMF1baV0ub2Zmc2V0ID0gdG90YWxfaGVpZ2h0ICogcGl0Y2g7Ci0JICAgIHQtPmludGVsLmltYWdlWzBdW2ldLmludGVybmFsRm9ybWF0ID0gYmFzZUltYWdlLT5fQmFzZUZvcm1hdDsKLQkgfQotCi0JIHRvdGFsX2hlaWdodCArPSBNQVgyKDIsIHZpcnR1YWxfaGVpZ2h0KTsKLQkgdmlydHVhbF9oZWlnaHQgPj49IDE7Ci0gICAgICB9Ci0KLSAgICAgIHQtPmludGVsLmRlcHRoX3BpdGNoID0gdG90YWxfaGVpZ2h0ICogcGl0Y2g7Ci0KLSAgICAgIC8qIE11bHRpcGx5IHNsaWNlIHNpemUgYnkgdGV4dHVyZSBkZXB0aCBmb3IgdG90YWwgc2l6ZS4gIEl0J3MKLSAgICAgICAqIHJlbWFya2FibGUgaG93IHdhc3RlZnVsIG9mIG1lbW9yeSBhbGwgdGhlIGk4eDAgdGV4dHVyZQotICAgICAgICogbGF5b3V0cyBhcmUuCi0gICAgICAgKi8KLSAgICAgIHRvdGFsX2hlaWdodCAqPSB0LT5pbnRlbC5pbWFnZVswXVswXS5pbWFnZS0+RGVwdGg7Ci0gICAgICBicmVhazsKLSAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgICBwaXRjaCA9IHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5XaWR0aCAqIHQtPmludGVsLnRleGVsQnl0ZXM7Ci0gICAgICBwaXRjaCA9IChwaXRjaCArIDMpICYgfjM7Ci0gICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSA9IH4wOwotCi0gICAgICBmb3IgKCB0b3RhbF9oZWlnaHQgPSBpID0gMCA7IGkgPCBudW1MZXZlbHMgOyBpKysgKSB7Ci0JIHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbCArIGldOwotCSBpZiAoIXQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlKSAKLQkgICAgYnJlYWs7Ci0JIAotCSB0LT5pbnRlbC5pbWFnZVswXVtpXS5vZmZzZXQgPSB0b3RhbF9oZWlnaHQgKiBwaXRjaDsKLQkgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW50ZXJuYWxGb3JtYXQgPSBiYXNlSW1hZ2UtPl9CYXNlRm9ybWF0OwotCSBpZiAodC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UtPklzQ29tcHJlc3NlZCkgewotCSAgICB0b3RhbF9oZWlnaHQgKz0gKHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlLT5IZWlnaHQgKyAzKSAvIDQ7Ci0JIH0KLQkgZWxzZQotCSAgIHRvdGFsX2hlaWdodCArPSBNQVgyKDIsIHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlLT5IZWlnaHQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHQtPmludGVsLlBpdGNoID0gcGl0Y2g7Ci0gICB0LT5pbnRlbC5iYXNlLnRvdGFsU2l6ZSA9IHRvdGFsX2hlaWdodCpwaXRjaDsKLSAgIHQtPmludGVsLm1heF9sZXZlbCA9IG51bUxldmVscy0xOwotfQotCi0KLXN0YXRpYyB2b2lkIGk5NDVMYXlvdXRUZXh0dXJlSW1hZ2VzKCBpOTE1Q29udGV4dFB0ciBpOTE1LAotCQkJCSAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogKQotewotICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmJhc2VJbWFnZSA9IHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF07Ci0gICBpOTE1VGV4dHVyZU9iamVjdFB0ciB0ID0gKGk5MTVUZXh0dXJlT2JqZWN0UHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwotICAgR0xpbnQgZmlyc3RMZXZlbCwgbGFzdExldmVsLCBudW1MZXZlbHM7Ci0gICBHTGludCBpLCB0b3RhbF9oZWlnaHQsIHBpdGNoLCBzeiwgbWF4X29mZnNldCA9IDAsIG9mZnNldDsKLQotCi0gICAvKiBDb21wdXRlIHdoaWNoIG1pcG1hcCBsZXZlbHMgd2UgcmVhbGx5IHdhbnQgdG8gc2VuZCB0byB0aGUgaGFyZHdhcmUuCi0gICAgKi8KLSAgIGRyaUNhbGN1bGF0ZVRleHR1cmVGaXJzdExhc3RMZXZlbCggKGRyaVRleHR1cmVPYmplY3QgKikgdCApOwotCi0gICAvKiBGaWd1cmUgb3V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgYWxsIHRoZSBtaXBtYXAKLSAgICAqIGxldmVscy4gIENob29zZSB0aGUgc21hbGxlc3QgcGl0Y2ggdG8gYWNjb21vZGF0ZSB0aGUgbGFyZ2VzdAotICAgICogbWlwbWFwOgotICAgICovCi0gICBmaXJzdExldmVsID0gdC0+aW50ZWwuYmFzZS5maXJzdExldmVsOwotICAgbGFzdExldmVsID0gdC0+aW50ZWwuYmFzZS5sYXN0TGV2ZWw7Ci0gICBudW1MZXZlbHMgPSBsYXN0TGV2ZWwgLSBmaXJzdExldmVsICsgMTsKLQotCi0KLSAgIC8qIEFsbCBpbWFnZXMgbXVzdCBiZSBsb2FkZWQgYXQgdGhpcyBwaXRjaC4gIENvdW50IHRoZSBudW1iZXIgb2YKLSAgICAqIGxpbmVzIHJlcXVpcmVkOgotICAgICovCi0gICBzd2l0Y2ggKHRPYmotPlRhcmdldCkgewotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQOiB7Ci0gICAgICBjb25zdCBHTHVpbnQgZGltID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbF0tPldpZHRoOwotICAgICAgR0x1aW50IGZhY2U7Ci0KLSAgICAgIC8qIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBpbWFnZXMsIHBpdGNoIGNhbiBiZQotICAgICAgICogZGV0ZXJtaW5lZCBlaXRoZXIgYnkgdGhlIG9sZC1zdHlsZSBwYWNraW5nIG9mIGN1YmVtYXAgZmFjZXMsCi0gICAgICAgKiBvciB0aGUgZmluYWwgcm93IG9mIDR4NCwgMngyIGFuZCAxeDEgZmFjZXMgYmVsb3cgdGhpcy4gCi0gICAgICAgKi8KLSAgICAgIGlmIChkaW0gPiAzMikgewotCSBwaXRjaCA9IGRpbSAqIHQtPmludGVsLnRleGVsQnl0ZXM7Ci0JIHBpdGNoICo9IDI7CQkvKiBkb3VibGUgcGl0Y2ggZm9yIGN1YmUgbGF5b3V0cyAqLwotCSBwaXRjaCA9IChwaXRjaCArIDMpICYgfjM7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgcGl0Y2ggPSAxNCAqIDggKiB0LT5pbnRlbC50ZXhlbEJ5dGVzOyAvKiBkZXRlcm1pbmVkIGJ5IHJvdyBvZgotCQkJCQkJKiBsaXR0bGUgbWFwcyBhdAotCQkJCQkJKiBib3R0b20gKi8KLSAgICAgIH0KLSAgICAgIAotICAgICAgdG90YWxfaGVpZ2h0ID0gZGltICogNCArIDQ7Ci0KLSAgICAgIGZvciAoIGZhY2UgPSAwIDsgZmFjZSA8IDYgOyBmYWNlKyspIHsKLQkgR0x1aW50IHggPSBpbml0aWFsX29mZnNldHNbZmFjZV1bMF0gKiBkaW07Ci0JIEdMdWludCB5ID0gaW5pdGlhbF9vZmZzZXRzW2ZhY2VdWzFdICogZGltOwotCSBHTHVpbnQgZCA9IGRpbTsKLQkgCi0JIGlmIChkaW0gPT0gNCAmJiBmYWNlID49IDQpIHsKLQkgICAgeSA9IHRvdGFsX2hlaWdodCAtIDQ7Ci0JICAgIHggPSAoZmFjZSAtIDQpICogODsKLQkgfQotCSBlbHNlIGlmIChkaW0gPCA0KSB7Ci0JICAgIHkgPSB0b3RhbF9oZWlnaHQgLSA0OwotCSAgICB4ID0gZmFjZSAqIDg7Ci0JIH0KLQotCSB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1tmYWNlXSA9IH4wOwotCi0JIGFzc2VydCh0T2JqLT5JbWFnZVtmYWNlXVtmaXJzdExldmVsXS0+V2lkdGggPT0gZGltKTsKLQkgYXNzZXJ0KHRPYmotPkltYWdlW2ZhY2VdW2ZpcnN0TGV2ZWxdLT5IZWlnaHQgPT0gZGltKTsKLQotCSBmb3IgKGkgPSAwOyBpIDwgbnVtTGV2ZWxzOyBpKyspIHsKLQotCi0JICAgIHQtPmludGVsLmltYWdlW2ZhY2VdW2ldLmltYWdlID0gdE9iai0+SW1hZ2VbZmFjZV1bZmlyc3RMZXZlbCArIGldOwotCSAgICBhc3NlcnQodC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0uaW1hZ2UpOwotCSAKLQkgICAgdC0+aW50ZWwuaW1hZ2VbZmFjZV1baV0ub2Zmc2V0ID0gCi0JICAgICAgIHkgKiBwaXRjaCArIHggKiB0LT5pbnRlbC50ZXhlbEJ5dGVzOwotCSAgICB0LT5pbnRlbC5pbWFnZVtmYWNlXVtpXS5pbnRlcm5hbEZvcm1hdCA9IGJhc2VJbWFnZS0+X0Jhc2VGb3JtYXQ7Ci0KLQkgICAgZCA+Pj0gMTsKLQkgICAgCi0JICAgIHN3aXRjaCAoZCkgewotCSAgICBjYXNlIDQ6Ci0JICAgICAgIHN3aXRjaCAoZmFjZSkgewotCSAgICAgICBjYXNlIEZBQ0VfUE9TX1g6Ci0JICAgICAgIGNhc2UgRkFDRV9ORUdfWDoKLQkJICB4ICs9IHN0ZXBfb2Zmc2V0c1tmYWNlXVswXSAqIGQ7Ci0JCSAgeSArPSBzdGVwX29mZnNldHNbZmFjZV1bMV0gKiBkOwotCQkgIGJyZWFrOwotCSAgICAgICBjYXNlIEZBQ0VfUE9TX1k6Ci0JICAgICAgIGNhc2UgRkFDRV9ORUdfWToKLQkJICB5ICs9IDEyOwotCQkgIHggLT0gODsKLQkJICBicmVhazsKLQkgICAgICAgY2FzZSBGQUNFX1BPU19aOgotCSAgICAgICBjYXNlIEZBQ0VfTkVHX1o6Ci0JCSAgeSA9IHRvdGFsX2hlaWdodCAtIDQ7Ci0JCSAgeCA9IChmYWNlIC0gNCkgKiA4OwotCQkgIGJyZWFrOwotCSAgICAgICB9Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgICB5ID0gdG90YWxfaGVpZ2h0IC0gNDsKLQkgICAgICAgeCA9IDE2ICsgZmFjZSAqIDg7Ci0JICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICAgeCArPSA0ODsKLQkgICAgICAgYnJlYWs7Ci0JICAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgICB4ICs9IHN0ZXBfb2Zmc2V0c1tmYWNlXVswXSAqIGQ7Ci0JICAgICAgIHkgKz0gc3RlcF9vZmZzZXRzW2ZhY2VdWzFdICogZDsKLQkgICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgfQotICAgICAgfQotICAgICAgbWF4X29mZnNldCA9IHRvdGFsX2hlaWdodCAqIHBpdGNoOwotICAgICAgYnJlYWs7Ci0gICB9Ci0gICBjYXNlIEdMX1RFWFRVUkVfM0Q6IHsKLSAgICAgIEdMdWludCBkZXB0aF9wYWNraW5nID0gMCwgZGVwdGhfcGFja19waXRjaDsKLSAgICAgIEdMdWludCB0bXBfbnVtTGV2ZWxzID0gbnVtTGV2ZWxzOwotICAgICAgcGl0Y2ggPSB0T2JqLT5JbWFnZVswXVtmaXJzdExldmVsXS0+V2lkdGggKiB0LT5pbnRlbC50ZXhlbEJ5dGVzOwotICAgICAgcGl0Y2ggPSAocGl0Y2ggKyAzKSAmIH4zOwotICAgICAgZGVwdGhfcGFja19waXRjaCA9IHBpdGNoOwotICAgICAgCi0gICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSA9IH4wOwotCi0KLSAgICAgIGZvciAoIHRvdGFsX2hlaWdodCA9IGkgPSAwIDsgaSA8IHRtcF9udW1MZXZlbHMgOyBpKysgKSB7Ci0JIHQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlID0gdE9iai0+SW1hZ2VbMF1bZmlyc3RMZXZlbCArIGldOwotCSBpZiAoIXQtPmludGVsLmltYWdlWzBdW2ldLmltYWdlKSAKLQkgICAgYnJlYWs7Ci0KLQkgCi0JIHQtPmludGVsLmltYWdlWzBdW2ldLm9mZnNldCA9IHRvdGFsX2hlaWdodCAqIHBpdGNoOwotCSB0LT5pbnRlbC5pbWFnZVswXVtpXS5pbnRlcm5hbEZvcm1hdCA9IGJhc2VJbWFnZS0+X0Jhc2VGb3JtYXQ7Ci0JIAotCi0KLQkgdG90YWxfaGVpZ2h0ICs9IE1BWDIoMiwgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UtPkhlaWdodCkgKiAKLQkgICAgTUFYMigodC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UtPkRlcHRoID4+IGRlcHRoX3BhY2tpbmcpLCAxKTsKLQotCSAvKiBXaGVuIGFsaWdubWVudCBkb21pbmF0ZXMsIGNhbid0IGluY3JlYXNlIGRlcHRoIHBhY2tpbmc/Ci0JICAqIE9yIGRvZXMgcGl0Y2ggZ3Jvdz8/PyAgV2hhdCBhcmUgdGhlIGFsaWdubWVudCBjb25zdHJhaW50cywKLQkgICogYW55d2F5PwotCSAgKi8KLQkgaWYgKGRlcHRoX3BhY2tfcGl0Y2ggPiA0KSB7Ci0JICAgIGRlcHRoX3BhY2tpbmcrKzsKLQkgICAgZGVwdGhfcGFja19waXRjaCA8PD0gMjsKLQkgfQotICAgICAgfQotCi0gICAgICBtYXhfb2Zmc2V0ID0gdG90YWxfaGVpZ2h0ICogcGl0Y2g7Ci0gICAgICBicmVhazsKLSAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgICBwaXRjaCA9IHRPYmotPkltYWdlWzBdW2ZpcnN0TGV2ZWxdLT5XaWR0aCAqIHQtPmludGVsLnRleGVsQnl0ZXM7Ci0gICAgICBwaXRjaCA9IChwaXRjaCArIDMpICYgfjM7Ci0gICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSA9IH4wOwotICAgICAgbWF4X29mZnNldCA9IDA7Ci0KLSAgICAgIGZvciAoIG9mZnNldCA9IGkgPSAwIDsgaSA8IG51bUxldmVscyA7IGkrKyApIHsKLQkgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UgPSB0T2JqLT5JbWFnZVswXVtmaXJzdExldmVsICsgaV07Ci0JIGlmICghdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UpIAotCSAgICBicmVhazsKLQkgCi0JIHQtPmludGVsLmltYWdlWzBdW2ldLm9mZnNldCA9IG9mZnNldDsKLQkgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW50ZXJuYWxGb3JtYXQgPSBiYXNlSW1hZ2UtPl9CYXNlRm9ybWF0OwotCi0JIGlmICh0LT5pbnRlbC5pbWFnZVswXVtpXS5pbWFnZS0+SXNDb21wcmVzc2VkKQotCSAgICBzeiA9IE1BWDIoMSwgdC0+aW50ZWwuaW1hZ2VbMF1baV0uaW1hZ2UtPkhlaWdodC80KSAqIHBpdGNoOwotCSBlbHNlCi0JICAgIHN6ID0gTUFYMigyLCB0LT5pbnRlbC5pbWFnZVswXVtpXS5pbWFnZS0+SGVpZ2h0KSAqIHBpdGNoOwotCSAKLQkgLyogQmVjYXVzZSB0aGUgaW1hZ2VzIGFyZSBwYWNrZWQgYmV0dGVyLCB0aGUgZmluYWwgb2Zmc2V0Ci0JICAqIG1pZ2h0IG5vdCBiZSB0aGUgbWF4aW1hbCBvbmU6Ci0JICAqLwotCSBtYXhfb2Zmc2V0ID0gTUFYMihtYXhfb2Zmc2V0LCBvZmZzZXQgKyBzeik7Ci0KLQkgLyogTFBUIGNoYW5nZTogc3RlcCByaWdodCBhZnRlciBzZWNvbmQgbWlwbWFwLgotCSAgKi8KLQkgaWYgKGkgPT0gMSkgCi0JICAgIG9mZnNldCArPSBwaXRjaCAvIDI7Ci0JIGVsc2UgCi0JICAgIG9mZnNldCArPSBzejsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHQtPmludGVsLlBpdGNoID0gcGl0Y2g7Ci0gICB0LT5pbnRlbC5iYXNlLnRvdGFsU2l6ZSA9IG1heF9vZmZzZXQ7Ci0gICB0LT5pbnRlbC5tYXhfbGV2ZWwgPSBudW1MZXZlbHMtMTsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgaTkxNVNldFRleEltYWdlcyggaTkxNUNvbnRleHRQdHIgaTkxNSwgCi0JCQkgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiApCi17Ci0gICBHTHVpbnQgdGV4dHVyZUZvcm1hdDsKLSAgIGk5MTVUZXh0dXJlT2JqZWN0UHRyIHQgPSAoaTkxNVRleHR1cmVPYmplY3RQdHIpIHRPYmotPkRyaXZlckRhdGE7Ci0gICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqYmFzZUltYWdlID0gdE9iai0+SW1hZ2VbMF1bdE9iai0+QmFzZUxldmVsXTsKLSAgIEdMaW50IHNzMiA9IDA7Ci0KLSAgIHN3aXRjaCggYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgKSB7CisgICBzd2l0Y2ggKG1lc2FfZm9ybWF0KSB7CiAgICBjYXNlIE1FU0FfRk9STUFUX0w4OgotICAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDE7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl84QklUIHwgTVRfOEJJVF9MODsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl84QklUIHwgTVRfOEJJVF9MODsKICAgIGNhc2UgTUVTQV9GT1JNQVRfSTg6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMTsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzhCSVQgfCBNVF84QklUX0k4OwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiBNQVBTVVJGXzhCSVQgfCBNVF84QklUX0k4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BODoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAxOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfOEJJVCB8IE1UXzhCSVRfQTg7IAotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiBNQVBTVVJGXzhCSVQgfCBNVF84QklUX0E4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BTDg4OgotICAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDI7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FZODg7Ci0gICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BWTg4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0I1NjU6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSBNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1OwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiBNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCMTU1NToKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BUkdCMTU1NTsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FSR0IxNTU1OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCNDQ0NDoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9BUkdCNDQ0NDsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8xNkJJVCB8IE1UXzE2QklUX0FSR0I0NDQ0OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCODg4ODoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICAgdGV4dHVyZUZvcm1hdCA9IE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9BUkdCODg4ODsKLSAgICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gTUFQU1VSRl8zMkJJVCB8IE1UXzMyQklUX0FSR0I4ODg4OwogICAgY2FzZSBNRVNBX0ZPUk1BVF9ZQ0JDUl9SRVY6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfTk9STUFMKTsKLSAgICAgIHNzMiB8PSBTUzJfQ09MT1JTUEFDRV9DT05WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0KKyAgICAgIHJldHVybiAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfTk9STUFMKTsKICAgIGNhc2UgTUVTQV9GT1JNQVRfWUNCQ1I6Ci0gICAgICB0LT5pbnRlbC50ZXhlbEJ5dGVzID0gMjsKLSAgICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl80MjIgfCBNVF80MjJfWUNSQ0JfU1dBUFkpOwotICAgICAgc3MyIHw9IFNTMl9DT0xPUlNQQUNFX0NPTlZFUlNJT047Ci0gICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIChNQVBTVVJGXzQyMiB8IE1UXzQyMl9ZQ1JDQl9TV0FQWSk7CiAgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9GWFQxOgogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZYVDE6Ci0gICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSAyOwotICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0ZYVDEpOwotICAgICBicmVhazsKLQorICAgICAgcmV0dXJuIChNQVBTVVJGX0NPTVBSRVNTRUQgfCBNVF9DT01QUkVTU19GWFQxKTsKICAgIGNhc2UgTUVTQV9GT1JNQVRfWjE2OgotICAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDI7Ci0gICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9MMTYpOwotICAgICAgYnJlYWs7Ci0KKyAgICAgIGlmIChEZXB0aE1vZGUgPT0gR0xfQUxQSEEpCisgICAgICAgICAgcmV0dXJuIChNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfQTE2KTsKKyAgICAgIGVsc2UgaWYgKERlcHRoTW9kZSA9PSBHTF9JTlRFTlNJVFkpCisgICAgICAgICAgcmV0dXJuIChNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfSTE2KTsKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKE1BUFNVUkZfMTZCSVQgfCBNVF8xNkJJVF9MMTYpOwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDE6CiAgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9EWFQxOgotICAgICAvKiAKLSAgICAgICogRFhUbiBwaXRjaGVzIGFyZSBXaWR0aC80ICogYmxvY2tzaXplIGluIGJ5dGVzIAotICAgICAgKiBmb3IgRFhUMTogYmxvY2tzaXplPTggc28gV2lkdGgvNCo4ID0gV2lkdGggKiAyIAotICAgICAgKiBmb3IgRFhUMy81OiBibG9ja3NpemU9MTYgc28gV2lkdGgvNCoxNiA9IFdpZHRoICogNAotICAgICAgKi8KLSAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDI7Ci0gICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl9DT01QUkVTU0VEIHwgTVRfQ09NUFJFU1NfRFhUMSk7Ci0gICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDEpOwogICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDM6Ci0gICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICB0ZXh0dXJlRm9ybWF0ID0gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDJfMyk7Ci0gICAgIGJyZWFrOwotCisgICAgICByZXR1cm4gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDJfMyk7CiAgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfRFhUNToKLSAgICAgdC0+aW50ZWwudGV4ZWxCeXRlcyA9IDQ7Ci0gICAgIHRleHR1cmVGb3JtYXQgPSAoTUFQU1VSRl9DT01QUkVTU0VEIHwgTVRfQ09NUFJFU1NfRFhUNF81KTsKLSAgICAgYnJlYWs7Ci0KLSNpZiAwCisgICAgICByZXR1cm4gKE1BUFNVUkZfQ09NUFJFU1NFRCB8IE1UX0NPTVBSRVNTX0RYVDRfNSk7CiAgICBjYXNlIE1FU0FfRk9STUFUX1oyNF9TODoKLSAgICAgIHQtPmludGVsLnRleGVsQnl0ZXMgPSA0OwotICAgICAgdGV4dHVyZUZvcm1hdCA9IChNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfeEw4MjQpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQorICAgICAgcmV0dXJuIChNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfeEk4MjQpOwogICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBpbWFnZSBmb3JtYXQgJXhcbiIsIF9fRlVOQ1RJT05fXywKLQkgICAgICBiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgaW1hZ2UgZm9ybWF0ICV4XG4iLCBfX0ZVTkNUSU9OX18sIG1lc2FfZm9ybWF0KTsKICAgICAgIGFib3J0KCk7CisgICAgICByZXR1cm4gMDsKICAgIH0KLQotICAgc3dpdGNoIChpOTE1LT5pbnRlbC5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpIHsKLSAgIGNhc2UgUENJX0NISVBfSTk0NV9HOgotICAgY2FzZSBQQ0lfQ0hJUF9JOTQ1X0dNOgotICAgY2FzZSBQQ0lfQ0hJUF9JOTQ1X0dNRToKLSAgIGNhc2UgUENJX0NISVBfRzMzX0c6Ci0gICBjYXNlIFBDSV9DSElQX1EzM19HOgotICAgY2FzZSBQQ0lfQ0hJUF9RMzVfRzoKLSAgICAgICBpOTQ1TGF5b3V0VGV4dHVyZUltYWdlcyggaTkxNSwgdE9iaiApOwotICAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgICBpOTE1TGF5b3V0VGV4dHVyZUltYWdlcyggaTkxNSwgdE9iaiApOwotICAgICAgIGJyZWFrOwotICAgfQotCi0gICB0LT5TZXR1cFtJOTE1X1RFWFJFR19NUzNdID0gCi0gICAgICAoKCh0T2JqLT5JbWFnZVswXVt0LT5pbnRlbC5iYXNlLmZpcnN0TGV2ZWxdLT5IZWlnaHQgLSAxKSA8PCBNUzNfSEVJR0hUX1NISUZUKSB8Ci0gICAgICAgKCh0T2JqLT5JbWFnZVswXVt0LT5pbnRlbC5iYXNlLmZpcnN0TGV2ZWxdLT5XaWR0aCAtIDEpIDw8IE1TM19XSURUSF9TSElGVCkgfAotICAgICAgIHRleHR1cmVGb3JtYXQgfAotICAgICAgIE1TM19VU0VfRkVOQ0VfUkVHUyk7Ci0KLSAgIHQtPlNldHVwW0k5MTVfVEVYUkVHX01TNF0gPSAKLSAgICAgICgoKCh0LT5pbnRlbC5QaXRjaCAvIDQpIC0gMSkgPDwgTVM0X1BJVENIX1NISUZUKSB8IAotICAgICAgIE1TNF9DVUJFX0ZBQ0VfRU5BX01BU0sgfAotICAgICAgICgoKHQtPmludGVsLm1heF9sZXZlbCAqIDQpKSA8PCBNUzRfTUFYX0xPRF9TSElGVCkgfAotICAgICAgICgodE9iai0+SW1hZ2VbMF1bdC0+aW50ZWwuYmFzZS5maXJzdExldmVsXS0+RGVwdGggLSAxKSA8PCBNUzRfVk9MVU1FX0RFUFRIX1NISUZUKSk7Ci0KLSAgIHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTMl0gJj0gfihTUzJfQ09MT1JTUEFDRV9DT05WRVJTSU9OKTsKLSAgIHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTMl0gfD0gc3MyOwotCi0gICB0LT5pbnRlbC5kaXJ0eSA9IEk5MTVfVVBMT0FEX1RFWF9BTEw7Ci0KIH0KIAogCisKKwogLyogVGhlIGk5MTUgKGFuZCByZWxhdGVkIGdyYXBoaWNzIGNvcmVzKSBkbyBub3Qgc3VwcG9ydCBHTF9DTEFNUC4gIFRoZQogICogSW50ZWwgZHJpdmVycyBmb3IgIm90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIiBpbXBsZW1lbnQgR0xfQ0xBTVAgYXMKICAqIEdMX0NMQU1QX1RPX0VER0UsIHNvIHRoZSBzYW1lIGlzIGRvbmUgaGVyZS4KICAqLwotc3RhdGljIEdMdWludCB0cmFuc2xhdGVfd3JhcF9tb2RlKCBHTGVudW0gd3JhcCApCitzdGF0aWMgR0x1aW50Cit0cmFuc2xhdGVfd3JhcF9tb2RlKEdMZW51bSB3cmFwKQogewotICAgc3dpdGNoKCB3cmFwICkgewotICAgY2FzZSBHTF9SRVBFQVQ6IHJldHVybiBURVhDT09SRE1PREVfV1JBUDsKLSAgIGNhc2UgR0xfQ0xBTVA6ICByZXR1cm4gVEVYQ09PUkRNT0RFX0NMQU1QX0VER0U7IC8qIG5vdCBxdWl0ZSBjb3JyZWN0ICovCi0gICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6IHJldHVybiBURVhDT09SRE1PREVfQ0xBTVBfRURHRTsKLSAgIGNhc2UgR0xfQ0xBTVBfVE9fQk9SREVSOiByZXR1cm4gVEVYQ09PUkRNT0RFX0NMQU1QX0JPUkRFUjsKLSAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOiByZXR1cm4gVEVYQ09PUkRNT0RFX01JUlJPUjsKLSAgIGRlZmF1bHQ6IHJldHVybiBURVhDT09SRE1PREVfV1JBUDsKKyAgIHN3aXRjaCAod3JhcCkgeworICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICByZXR1cm4gVEVYQ09PUkRNT0RFX1dSQVA7CisgICBjYXNlIEdMX0NMQU1QOgorICAgICAgcmV0dXJuIFRFWENPT1JETU9ERV9DTEFNUF9FREdFOyAgIC8qIG5vdCBxdWl0ZSBjb3JyZWN0ICovCisgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CisgICAgICByZXR1cm4gVEVYQ09PUkRNT0RFX0NMQU1QX0VER0U7CisgICBjYXNlIEdMX0NMQU1QX1RPX0JPUkRFUjoKKyAgICAgIHJldHVybiBURVhDT09SRE1PREVfQ0xBTVBfQk9SREVSOworICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICByZXR1cm4gVEVYQ09PUkRNT0RFX01JUlJPUjsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gVEVYQ09PUkRNT0RFX1dSQVA7CiAgICB9CiB9CiAKIAotLyoqCisKKy8qIFJlY2FsY3VsYXRlIGFsbCBzdGF0ZSBmcm9tIHNjcmF0Y2guICBQZXJoYXBzIG5vdCB0aGUgbW9zdAorICogZWZmaWNpZW50LCBidXQgdGhpcyBoYXMgZ290dGVuIGNvbXBsZXggZW5vdWdoIHRoYXQgd2UgbmVlZAorICogc29tZXRoaW5nIHdoaWNoIGlzIHVuZGVyc3RhbmRhYmxlIGFuZCByZWxpYWJsZS4KICAqLwotc3RhdGljIHZvaWQgaTkxNUltcG9ydFRleE9ialN0YXRlKCBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiApCi17ICAgCi0gICBpOTE1VGV4dHVyZU9iamVjdFB0ciB0ID0gKGk5MTVUZXh0dXJlT2JqZWN0UHRyKXRleE9iai0+RHJpdmVyRGF0YTsKLSAgIGludCBtaW5GaWx0ID0gMCwgbWlwRmlsdCA9IDAsIG1hZ0ZpbHQgPSAwLCBzaGFkb3cgPSAwOwotCi0gICBpZihJTlRFTF9ERUJVRyZERUJVR19EUkkpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBzd2l0Y2ggKHRleE9iai0+TWluRmlsdGVyKSB7Ci0gICBjYXNlIEdMX05FQVJFU1Q6Ci0gICAgICBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7Ci0gICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05PTkU7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfTElORUFSOgotICAgICAgbWluRmlsdCA9IEZJTFRFUl9MSU5FQVI7Ci0gICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05PTkU7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDoKLSAgICAgIG1pbkZpbHQgPSBGSUxURVJfTkVBUkVTVDsKLSAgICAgIG1pcEZpbHQgPSBNSVBGSUxURVJfTkVBUkVTVDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1Q6Ci0gICAgICBtaW5GaWx0ID0gRklMVEVSX0xJTkVBUjsKLSAgICAgIG1pcEZpbHQgPSBNSVBGSUxURVJfTkVBUkVTVDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVI6Ci0gICAgICBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7Ci0gICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX0xJTkVBUjsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUjoKLSAgICAgIG1pbkZpbHQgPSBGSUxURVJfTElORUFSOwotICAgICAgbWlwRmlsdCA9IE1JUEZJTFRFUl9MSU5FQVI7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgaWYgKCB0ZXhPYmotPk1heEFuaXNvdHJvcHkgPiAxLjAgKSB7Ci0gICAgICBtaW5GaWx0ID0gRklMVEVSX0FOSVNPVFJPUElDOyAKLSAgICAgIG1hZ0ZpbHQgPSBGSUxURVJfQU5JU09UUk9QSUM7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHN3aXRjaCAodGV4T2JqLT5NYWdGaWx0ZXIpIHsKLSAgICAgIGNhc2UgR0xfTkVBUkVTVDoKLQkgbWFnRmlsdCA9IEZJTFRFUl9ORUFSRVNUOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfTElORUFSOgotCSBtYWdGaWx0ID0gRklMVEVSX0xJTkVBUjsKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBicmVhazsKLSAgICAgIH0gIAotICAgfQotCi0gICBpZiAodGV4T2JqLT5Db21wYXJlTW9kZSA9PSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgJiYgCi0gICAgICAgdGV4T2JqLT5UYXJnZXQgIT0gR0xfVEVYVFVSRV8zRCkgewotCi0gICAgICBzaGFkb3cgPSBTUzJfU0hBRE9XX0VOQUJMRTsKLSAgICAgIHNoYWRvdyB8PSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKCB0ZXhPYmotPkNvbXBhcmVGdW5jICk7Ci0gICAgICAKLSAgICAgIG1pbkZpbHQgPSBGSUxURVJfNFg0X0ZMQVQ7Ci0gICAgICBtYWdGaWx0ID0gRklMVEVSXzRYNF9GTEFUOwotICAgfQotCi0KLSAgIHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTMl0gJj0gfihTUzJfTUlOX0ZJTFRFUl9NQVNLIHwKLQkJCQkgU1MyX01JUF9GSUxURVJfTUFTSyB8Ci0JCQkJIFNTMl9NQUdfRklMVEVSX01BU0sgfAotCQkJCSBTUzJfU0hBRE9XX0VOQUJMRSB8Ci0JCQkJIFNTMl9TSEFET1dfRlVOQ19NQVNLKTsKLSAgIHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTMl0gfD0gKChtaW5GaWx0IDw8IFNTMl9NSU5fRklMVEVSX1NISUZUKSB8Ci0JCQkJKG1pcEZpbHQgPDwgU1MyX01JUF9GSUxURVJfU0hJRlQpIHwKLQkJCQkobWFnRmlsdCA8PCBTUzJfTUFHX0ZJTFRFUl9TSElGVCkgfAotCQkJCXNoYWRvdyk7Ci0KLSAgIHsKLSAgICAgIEdMdWludCBzczMgPSB0LT5TZXR1cFtJOTE1X1RFWFJFR19TUzNdICYgfihTUzNfVENYX0FERFJfTU9ERV9NQVNLIHwKLQkJCQkJCVNTM19UQ1lfQUREUl9NT0RFX01BU0sgfAotCQkJCQkJU1MzX1RDWl9BRERSX01PREVfTUFTSyk7Ci0gICAgICBHTGVudW0gd3MgPSB0ZXhPYmotPldyYXBTOwotICAgICAgR0xlbnVtIHd0ID0gdGV4T2JqLT5XcmFwVDsKLSAgICAgIEdMZW51bSB3ciA9IHRleE9iai0+V3JhcFI7Ci0gICAgICAKLSAgICAgIHQtPnJlZnNfYm9yZGVyX2NvbG9yID0gMDsKLQotICAgICAgaWYgKHRleE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfM0QgJiYKLQkgICh0ZXhPYmotPk1pbkZpbHRlciAhPSBHTF9ORUFSRVNUIHx8Ci0JICAgdGV4T2JqLT5NYWdGaWx0ZXIgIT0gR0xfTkVBUkVTVCkpIHsKLQkgCi0JIC8qIFRyeSB0byBtaW1pYyBHTF9DTEFNUCBmdW5jdGlvbmFsaXR5IGEgbGl0dGxlIGJldHRlciAtCi0JICAqIHN3aXRjaCB0byBDTEFNUF9UT19CT1JERVIgd2hlbmV2ZXIgYSBub24tTkVBUkVTVCBmaWx0ZXIgaXMKLQkgICogaW4gdXNlLiAgT25seSBkbyB0aGlzIGZvciAzRCB0ZXh0dXJlcyBhdCB0aGUgbW9tZW50IC0tCi0JICAqIGRvaW5nIGl0IHVuaXZlcnNhbGx5IHdvdWxkIGZpeCB0aGUgY29uZm9ybSB0ZXhiYy5jCi0JICAqIGZhaWx1cmUsIHRob3VnaC4KLQkgICovCi0JIGlmICh3cyA9PSBHTF9DTEFNUCkgd3MgPSBHTF9DTEFNUF9UT19CT1JERVI7Ci0JIGlmICh3dCA9PSBHTF9DTEFNUCkgd3QgPSBHTF9DTEFNUF9UT19CT1JERVI7Ci0JIGlmICh3ciA9PSBHTF9DTEFNUCkgd3IgPSBHTF9DTEFNUF9UT19CT1JERVI7Ci0KLQkgLyogM0QgdGV4dHVyZXMgZG9uJ3Qgc2VlbSB0byByZXNwZWN0IHRoZSBib3JkZXIgY29sb3IuCi0JICAqIEZhbGxiYWNrIGlmIHRoZXJlJ3MgZXZlciBhIGRhbmdlciB0aGF0IHRoZXkgbWlnaHQgcmVmZXIgdG8KLQkgICogaXQuCi0JICAqLwotCSBpZiAod3MgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSB0LT5yZWZzX2JvcmRlcl9jb2xvciA9IDE7Ci0JIGlmICh3dCA9PSBHTF9DTEFNUF9UT19CT1JERVIpIHQtPnJlZnNfYm9yZGVyX2NvbG9yID0gMTsKLQkgaWYgKHdyID09IEdMX0NMQU1QX1RPX0JPUkRFUikgdC0+cmVmc19ib3JkZXJfY29sb3IgPSAxOwotICAgICAgfQotCi0gICAgICBzczMgfD0gdHJhbnNsYXRlX3dyYXBfbW9kZSh3cykgPDwgU1MzX1RDWF9BRERSX01PREVfU0hJRlQ7Ci0gICAgICBzczMgfD0gdHJhbnNsYXRlX3dyYXBfbW9kZSh3dCkgPDwgU1MzX1RDWV9BRERSX01PREVfU0hJRlQ7Ci0gICAgICBzczMgfD0gdHJhbnNsYXRlX3dyYXBfbW9kZSh3cikgPDwgU1MzX1RDWl9BRERSX01PREVfU0hJRlQ7Ci0gICAKLSAgICAgIGlmIChzczMgIT0gdC0+U2V0dXBbSTkxNV9URVhSRUdfU1MzXSkgewotCSB0LT5pbnRlbC5kaXJ0eSA9IEk5MTVfVVBMT0FEX1RFWF9BTEw7Ci0JIHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTM10gPSBzczM7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHsgICAKLSAgICAgIGNvbnN0IEdMdWJ5dGUgKmNvbG9yID0gdGV4T2JqLT5fQm9yZGVyQ2hhbjsKLQotICAgICAgdC0+U2V0dXBbSTkxNV9URVhSRUdfU1M0XSA9IElOVEVMX1BBQ0tDT0xPUjg4ODgoY29sb3JbMF0sY29sb3JbMV0sCi0JCQkJCQkgICAgIGNvbG9yWzJdLGNvbG9yWzNdKTsKLSAgIH0KLX0KLQotCi0KLXN0YXRpYyB2b2lkIGk5MTVfaW1wb3J0X3RleF91bml0KCBpOTE1Q29udGV4dFB0ciBpOTE1LCAKLQkJCQkgaTkxNVRleHR1cmVPYmplY3RQdHIgdCwKLQkJCQkgR0x1aW50IHVuaXQgKQotewotICAgR0x1aW50IHN0YXRlW0k5MTVfVEVYX1NFVFVQX1NJWkVdOwotCi0gICBpZihJTlRFTF9ERUJVRyZERUJVR19URVhUVVJFKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyB1bml0KCVkKVxuIiwgX19GVU5DVElPTl9fLCB1bml0KTsKLSAgIAotICAgaWYgKGk5MTUtPmludGVsLkN1cnJlbnRUZXhPYmpbdW5pdF0pIAotICAgICAgaTkxNS0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XS0+YmFzZS5ib3VuZCAmPSB+KDFVIDw8IHVuaXQpOwotCi0gICBpOTE1LT5pbnRlbC5DdXJyZW50VGV4T2JqW3VuaXRdID0gKGludGVsVGV4dHVyZU9iamVjdFB0cil0OwotICAgdC0+aW50ZWwuYmFzZS5ib3VuZCB8PSAoMSA8PCB1bml0KTsKLQotICAgaWYgKHQtPmludGVsLmRpcnR5ICYgSTkxNV9VUExPQURfVEVYKHVuaXQpKSB7Ci0gICAgICBpOTE1SW1wb3J0VGV4T2JqU3RhdGUoIHQtPmludGVsLmJhc2UudE9iaiApOwotICAgICAgdC0+aW50ZWwuZGlydHkgJj0gfkk5MTVfVVBMT0FEX1RFWCh1bml0KTsKLSAgIH0KLQotICAgc3RhdGVbSTkxNV9URVhSRUdfTVMyXSA9IHQtPmludGVsLlRleHR1cmVPZmZzZXQ7Ci0gICBzdGF0ZVtJOTE1X1RFWFJFR19NUzNdID0gdC0+U2V0dXBbSTkxNV9URVhSRUdfTVMzXTsKLSAgIHN0YXRlW0k5MTVfVEVYUkVHX01TNF0gPSB0LT5TZXR1cFtJOTE1X1RFWFJFR19NUzRdOwotCi0gICBzdGF0ZVtJOTE1X1RFWFJFR19TUzJdID0gKGk5MTUtPnN0YXRlLlRleFt1bml0XVtJOTE1X1RFWFJFR19TUzJdICYKLQkJCSAgICBTUzJfTE9EX0JJQVNfTUFTSyk7Ci0gICBzdGF0ZVtJOTE1X1RFWFJFR19TUzJdIHw9ICh0LT5TZXR1cFtJOTE1X1RFWFJFR19TUzJdICYgflNTMl9MT0RfQklBU19NQVNLKTsKLQotICAgc3RhdGVbSTkxNV9URVhSRUdfU1MzXSA9IChpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXSAmCi0JCQkgICAgU1MzX05PUk1BTElaRURfQ09PUkRTKTsKLSAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTM10gfD0gKHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTM10gJgotCQkJICAgICB+KFNTM19OT1JNQUxJWkVEX0NPT1JEU3wKLQkJCSAgICAgICBTUzNfVEVYVFVSRU1BUF9JTkRFWF9NQVNLKSk7Ci0KLSAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTM10gfD0gKHVuaXQ8PFNTM19URVhUVVJFTUFQX0lOREVYX1NISUZUKTsKLQotICAgc3RhdGVbSTkxNV9URVhSRUdfU1M0XSA9IHQtPlNldHVwW0k5MTVfVEVYUkVHX1NTNF07Ci0KLQotICAgaWYgKG1lbWNtcChzdGF0ZSwgaTkxNS0+c3RhdGUuVGV4W3VuaXRdLCBzaXplb2Yoc3RhdGUpKSAhPSAwKSB7Ci0gICAgICBJOTE1X1NUQVRFQ0hBTkdFKCBpOTE1LCBJOTE1X1VQTE9BRF9URVgodW5pdCkgKTsKLSAgICAgIG1lbWNweShpOTE1LT5zdGF0ZS5UZXhbdW5pdF0sIHN0YXRlLCBzaXplb2Yoc3RhdGUpKTsKLSAgIH0KLX0KLQotCi0KLXN0YXRpYyBHTGJvb2xlYW4gZW5hYmxlX3RleF9jb21tb24oIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCApCi17Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdOwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gdGV4VW5pdC0+X0N1cnJlbnQ7Ci0gICBpOTE1VGV4dHVyZU9iamVjdFB0ciB0ID0gKGk5MTVUZXh0dXJlT2JqZWN0UHRyKXRPYmotPkRyaXZlckRhdGE7Ci0KLSAgIGlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHVuaXQpOwotCi0gICBpZiAoIShpOTE1LT5zdGF0ZS5hY3RpdmUgJiBJOTE1X1VQTE9BRF9URVgodW5pdCkpKSB7Ci0gICAgICBJOTE1X0FDVElWRVNUQVRFKGk5MTUsIEk5MTVfVVBMT0FEX1RFWCh1bml0KSwgR0xfVFJVRSk7Ci0gICB9Ci0KLSAgIC8qIEZhbGxiYWNrIGlmIHRoZXJlJ3MgYSB0ZXh0dXJlIGJvcmRlciAqLwotICAgaWYgKCB0T2JqLT5JbWFnZVswXVt0T2JqLT5CYXNlTGV2ZWxdLT5Cb3JkZXIgPiAwICkgewotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0KLSAgIC8qIFVwZGF0ZSBzdGF0ZSBpZiB0aGlzIGlzIGEgZGlmZmVyZW50IHRleHR1cmUgb2JqZWN0IHRvIGxhc3QKLSAgICAqIHRpbWUuCi0gICAgKi8KLSAgIGlmIChpOTE1LT5pbnRlbC5DdXJyZW50VGV4T2JqW3VuaXRdICE9ICZ0LT5pbnRlbCB8fCAKLSAgICAgICAodC0+aW50ZWwuZGlydHkgJiBJOTE1X1VQTE9BRF9URVgodW5pdCkpKSB7Ci0gICAgICBpOTE1X2ltcG9ydF90ZXhfdW5pdCggaTkxNSwgdCwgdW5pdCk7Ci0gICAgICBpOTE1LT50ZXhfcHJvZ3JhbS50cmFuc2xhdGVkID0gMDsKLSAgIH0KLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gZW5hYmxlX3RleF9yZWN0KCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQgKQotewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChjdHgpOwotICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9IHRleFVuaXQtPl9DdXJyZW50OwotICAgaTkxNVRleHR1cmVPYmplY3RQdHIgdCA9IChpOTE1VGV4dHVyZU9iamVjdFB0cil0T2JqLT5Ecml2ZXJEYXRhOwotICAgR0x1aW50IHNzMyA9IGk5MTUtPnN0YXRlLlRleFt1bml0XVtJOTE1X1RFWFJFR19TUzNdOwotCi0gICBzczMgJj0gflNTM19OT1JNQUxJWkVEX0NPT1JEUzsKLQotICAgaWYgKHNzMyAhPSBpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXSkgewotICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9URVgodW5pdCkpOwotICAgICAgaTkxNS0+c3RhdGUuVGV4W3VuaXRdW0k5MTVfVEVYUkVHX1NTM10gPSBzczM7Ci0gICB9Ci0KLSAgIC8qIFVwbG9hZCB0ZXhpbWFnZXMgKG5vdCBwaXBlbGluZWQpCi0gICAgKi8KLSAgIGlmICh0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSkgewotICAgICAgaTkxNVNldFRleEltYWdlcyggaTkxNSwgdE9iaiApOwotICAgICAgaWYgKCFpbnRlbFVwbG9hZFRleEltYWdlcyggJmk5MTUtPmludGVsLCAmdC0+aW50ZWwsIDAgKSkgewotCSByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KLXN0YXRpYyBHTGJvb2xlYW4gZW5hYmxlX3RleF8yZCggR0xjb250ZXh0ICpjdHgsIEdMdWludCB1bml0ICkKLXsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRleFVuaXQgPSAmY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF07Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPSB0ZXhVbml0LT5fQ3VycmVudDsKLSAgIGk5MTVUZXh0dXJlT2JqZWN0UHRyIHQgPSAoaTkxNVRleHR1cmVPYmplY3RQdHIpdE9iai0+RHJpdmVyRGF0YTsKLSAgIEdMdWludCBzczMgPSBpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXTsKLQotICAgc3MzIHw9IFNTM19OT1JNQUxJWkVEX0NPT1JEUzsKLQotICAgaWYgKHNzMyAhPSBpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXSkgewotICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9URVgodW5pdCkpOwotICAgICAgaTkxNS0+c3RhdGUuVGV4W3VuaXRdW0k5MTVfVEVYUkVHX1NTM10gPSBzczM7Ci0gICB9Ci0KLSAgIC8qIFVwbG9hZCB0ZXhpbWFnZXMgKG5vdCBwaXBlbGluZWQpCi0gICAgKi8KLSAgIGlmICh0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSkgewotICAgICAgaTkxNVNldFRleEltYWdlcyggaTkxNSwgdE9iaiApOwotICAgICAgaWYgKCFpbnRlbFVwbG9hZFRleEltYWdlcyggJmk5MTUtPmludGVsLCAmdC0+aW50ZWwsIDAgKSkgewotCSByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuIGVuYWJsZV90ZXhfY3ViZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCB1bml0ICkKLXsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoY3R4KTsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRleFVuaXQgPSAmY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF07Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPSB0ZXhVbml0LT5fQ3VycmVudDsKLSAgIGk5MTVUZXh0dXJlT2JqZWN0UHRyIHQgPSAoaTkxNVRleHR1cmVPYmplY3RQdHIpdE9iai0+RHJpdmVyRGF0YTsKLSAgIEdMdWludCBzczMgPSBpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXTsKLSAgIEdMdWludCBmYWNlOwotCi0gICBzczMgfD0gU1MzX05PUk1BTElaRURfQ09PUkRTOwotCi0gICBpZiAoc3MzICE9IGk5MTUtPnN0YXRlLlRleFt1bml0XVtJOTE1X1RFWFJFR19TUzNdKSB7Ci0gICAgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX1RFWCh1bml0KSk7Ci0gICAgICBpOTE1LT5zdGF0ZS5UZXhbdW5pdF1bSTkxNV9URVhSRUdfU1MzXSA9IHNzMzsKLSAgIH0KLQotICAgLyogVXBsb2FkIHRleGltYWdlcyAobm90IHBpcGVsaW5lZCkKLSAgICAqLwotICAgaWYgKCB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1swXSB8fCB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1sxXSB8fAotICAgICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1syXSB8fCB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1szXSB8fAotICAgICAgICB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1s0XSB8fCB0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1s1XSApIHsKLSAgICAgIGk5MTVTZXRUZXhJbWFnZXMoIGk5MTUsIHRPYmogKTsKLSAgIH0KLQotICAgLyogdXBsb2FkIChwZXIgZmFjZSkgKi8KLSAgIGZvciAoZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspIHsKLSAgICAgIGlmICh0LT5pbnRlbC5iYXNlLmRpcnR5X2ltYWdlc1tmYWNlXSkgewotCSBpZiAoIWludGVsVXBsb2FkVGV4SW1hZ2VzKCAmaTkxNS0+aW50ZWwsICZ0LT5pbnRlbCwgZmFjZSApKSB7Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQkgfQotICAgICAgfQotICAgfQotCi0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuIGVuYWJsZV90ZXhfM2QoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCApCi17Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPSBjdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fQ3VycmVudDsKLSAgIGk5MTVUZXh0dXJlT2JqZWN0UHRyIHQgPSAoaTkxNVRleHR1cmVPYmplY3RQdHIpdE9iai0+RHJpdmVyRGF0YTsKLQotICAgLyogM0QgdGV4dHVyZXMgb24gSTkxNSBzZWVtIHRvIGdldCBib2d1cyBib3JkZXIgY29sb3JzLCBoZW5jZSB0aGlzCi0gICAgKiBmYWxsYmFjazoKLSAgICAqLwotICAgaWYgKHQtPnJlZnNfYm9yZGVyX2NvbG9yKQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotCi0KLSAKLXN0YXRpYyBHTGJvb2xlYW4gZGlzYWJsZV90ZXgoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCApCi17Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGN0eCk7Ci0KLSAgIGlmIChpOTE1LT5zdGF0ZS5hY3RpdmUgJiBJOTE1X1VQTE9BRF9URVgodW5pdCkpIHsKLSAgICAgIEk5MTVfQUNUSVZFU1RBVEUoaTkxNSwgSTkxNV9VUExPQURfVEVYKHVuaXQpLCBHTF9GQUxTRSk7Ci0gICB9Ci0KLSAgIC8qIFRoZSBvbGQgdGV4dHVyZSBpcyBubyBsb25nZXIgYm91bmQgdG8gdGhpcyB0ZXh0dXJlIHVuaXQuCi0gICAgKiBNYXJrIGl0IGFzIHN1Y2guCi0gICAgKi8KLSAgIGlmICggaTkxNS0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XSAhPSBOVUxMICkgewotICAgICAgaTkxNS0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XS0+YmFzZS5ib3VuZCAmPSB+KDFVIDw8IDApOwotICAgICAgaTkxNS0+aW50ZWwuQ3VycmVudFRleE9ialt1bml0XSA9IE5VTEw7Ci0gICB9Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuIGk5MTVVcGRhdGVUZXhVbml0KCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQgKQotewotICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKLQotICAgaWYgKHRleFVuaXQtPl9SZWFsbHlFbmFibGVkICYmCi0gICAgICAgSU5URUxfQ09OVEVYVChjdHgpLT5pbnRlbFNjcmVlbi0+dGV4LnNpemUgPCAyMDQ4ICogMTAyNCkKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLQotICAgc3dpdGNoICh0ZXhVbml0LT5fUmVhbGx5RW5hYmxlZCkgewotICAgY2FzZSBURVhUVVJFXzFEX0JJVDoKLSAgIGNhc2UgVEVYVFVSRV8yRF9CSVQ6Ci0gICAgICByZXR1cm4gKGVuYWJsZV90ZXhfMmQoIGN0eCwgdW5pdCApICYmCi0JICAgICAgZW5hYmxlX3RleF9jb21tb24oIGN0eCwgdW5pdCApKTsKLSAgIGNhc2UgVEVYVFVSRV9SRUNUX0JJVDoKLSAgICAgIHJldHVybiAoZW5hYmxlX3RleF9yZWN0KCBjdHgsIHVuaXQgKSAmJgotCSAgICAgIGVuYWJsZV90ZXhfY29tbW9uKCBjdHgsIHVuaXQgKSk7Ci0gICBjYXNlIFRFWFRVUkVfQ1VCRV9CSVQ6Ci0gICAgICByZXR1cm4gKGVuYWJsZV90ZXhfY3ViZSggY3R4LCB1bml0ICkgJiYKLQkgICAgICBlbmFibGVfdGV4X2NvbW1vbiggY3R4LCB1bml0ICkpOwotICAgY2FzZSBURVhUVVJFXzNEX0JJVDoKLSAgICAgICByZXR1cm4gKGVuYWJsZV90ZXhfMmQoIGN0eCwgdW5pdCApICYmIAotCSAgICAgICBlbmFibGVfdGV4X2NvbW1vbiggY3R4LCB1bml0ICkgJiYKLQkgICAgICAgZW5hYmxlX3RleF8zZCggY3R4LCB1bml0KSk7IAotICAgY2FzZSAwOgotICAgICAgcmV0dXJuIGRpc2FibGVfdGV4KCBjdHgsIHVuaXQgKTsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICB9Ci19Ci0KLQotdm9pZCBpOTE1VXBkYXRlVGV4dHVyZVN0YXRlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQorc3RhdGljIEdMYm9vbGVhbgoraTkxNV91cGRhdGVfdGV4X3VuaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgdW5pdCwgR0x1aW50IHNzMykKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KGN0eCk7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9IHRVbml0LT5fQ3VycmVudDsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0T2JqKTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICpmaXJzdEltYWdlOworICAgR0x1aW50ICpzdGF0ZSA9IGk5MTUtPnN0YXRlLlRleFt1bml0XSwgZm9ybWF0LCBwaXRjaDsKKyAgIEdMaW50IGxvZGJpYXM7CisKKyAgIG1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisKKyAgIC8qV2UgbmVlZCB0byByZWZjb3VudCB0aGVzZS4gKi8KKworICAgaWYgKGk5MTUtPnN0YXRlLnRleF9idWZmZXJbdW5pdF0gIT0gTlVMTCkgeworICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShpOTE1LT5zdGF0ZS50ZXhfYnVmZmVyW3VuaXRdKTsKKyAgICAgICBpOTE1LT5zdGF0ZS50ZXhfYnVmZmVyW3VuaXRdID0gTlVMTDsKKyAgIH0KKworICAgaWYgKCFpbnRlbE9iai0+aW1hZ2VPdmVycmlkZSAmJiAhaW50ZWxfZmluYWxpemVfbWlwbWFwX3RyZWUoaW50ZWwsIHVuaXQpKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICAvKiBHZXQgZmlyc3QgaW1hZ2UgaGVyZSwgc2luY2UgaW50ZWxPYmotPmZpcnN0TGV2ZWwgd2lsbCBnZXQgc2V0IGluCisgICAgKiB0aGUgaW50ZWxfZmluYWxpemVfbWlwbWFwX3RyZWUoKSBjYWxsIGFib3ZlLgorICAgICovCisgICBmaXJzdEltYWdlID0gdE9iai0+SW1hZ2VbMF1baW50ZWxPYmotPmZpcnN0TGV2ZWxdOworCisgICBpZiAoaW50ZWxPYmotPmltYWdlT3ZlcnJpZGUpIHsKKyAgICAgIGk5MTUtPnN0YXRlLnRleF9idWZmZXJbdW5pdF0gPSBOVUxMOworICAgICAgaTkxNS0+c3RhdGUudGV4X29mZnNldFt1bml0XSA9IGludGVsT2JqLT50ZXh0dXJlT2Zmc2V0OworCisgICAgICBzd2l0Y2ggKGludGVsT2JqLT5kZXB0aE92ZXJyaWRlKSB7CisgICAgICBjYXNlIDMyOgorCSBmb3JtYXQgPSBNQVBTVVJGXzMyQklUIHwgTVRfMzJCSVRfQVJHQjg4ODg7CisJIGJyZWFrOworICAgICAgY2FzZSAyNDoKKyAgICAgIGRlZmF1bHQ6CisJIGZvcm1hdCA9IE1BUFNVUkZfMzJCSVQgfCBNVF8zMkJJVF9YUkdCODg4ODsKKwkgYnJlYWs7CisgICAgICBjYXNlIDE2OgorCSBmb3JtYXQgPSBNQVBTVVJGXzE2QklUIHwgTVRfMTZCSVRfUkdCNTY1OworCSBicmVhazsKKyAgICAgIH0KKworICAgICAgcGl0Y2ggPSBpbnRlbE9iai0+cGl0Y2hPdmVycmlkZTsKKyAgIH0gZWxzZSB7CisgICAgICBkcmlfYm9fcmVmZXJlbmNlKGludGVsT2JqLT5tdC0+cmVnaW9uLT5idWZmZXIpOworICAgICAgaTkxNS0+c3RhdGUudGV4X2J1ZmZlclt1bml0XSA9IGludGVsT2JqLT5tdC0+cmVnaW9uLT5idWZmZXI7CisgICAgICBpOTE1LT5zdGF0ZS50ZXhfb2Zmc2V0W3VuaXRdID0gIGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGludGVsT2JqLT5tdCwKKwkJCQkJCQkJIDAsIGludGVsT2JqLT4KKwkJCQkJCQkJIGZpcnN0TGV2ZWwpOworCisgICAgICBmb3JtYXQgPSB0cmFuc2xhdGVfdGV4dHVyZV9mb3JtYXQoZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0LCAKKwkJdE9iai0+RGVwdGhNb2RlKTsKKyAgICAgIHBpdGNoID0gaW50ZWxPYmotPm10LT5waXRjaCAqIGludGVsT2JqLT5tdC0+Y3BwOworICAgfQorCisgICBzdGF0ZVtJOTE1X1RFWFJFR19NUzNdID0KKyAgICAgICgoKGZpcnN0SW1hZ2UtPkhlaWdodCAtIDEpIDw8IE1TM19IRUlHSFRfU0hJRlQpIHwKKyAgICAgICAoKGZpcnN0SW1hZ2UtPldpZHRoIC0gMSkgPDwgTVMzX1dJRFRIX1NISUZUKSB8IGZvcm1hdCB8CisgICAgICAgTVMzX1VTRV9GRU5DRV9SRUdTKTsKKworICAgc3RhdGVbSTkxNV9URVhSRUdfTVM0XSA9CisgICAgICgoKChwaXRjaCAvIDQpIC0gMSkgPDwgTVM0X1BJVENIX1NISUZUKSB8IE1TNF9DVUJFX0ZBQ0VfRU5BX01BU0sgfAorICAgICAgICgoKChpbnRlbE9iai0+bGFzdExldmVsIC0gaW50ZWxPYmotPmZpcnN0TGV2ZWwpICogNCkpIDw8CisJTVM0X01BWF9MT0RfU0hJRlQpIHwgKChmaXJzdEltYWdlLT5EZXB0aCAtIDEpIDw8CisJCQkgICAgICBNUzRfVk9MVU1FX0RFUFRIX1NISUZUKSk7CisKKworICAgeworICAgICAgR0x1aW50IG1pbkZpbHQsIG1pcEZpbHQsIG1hZ0ZpbHQ7CisKKyAgICAgIHN3aXRjaCAodE9iai0+TWluRmlsdGVyKSB7CisgICAgICBjYXNlIEdMX05FQVJFU1Q6CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7CisgICAgICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05PTkU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTElORUFSOgorICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl9MSU5FQVI7CisgICAgICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX05PTkU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDoKKyAgICAgICAgIG1pbkZpbHQgPSBGSUxURVJfTkVBUkVTVDsKKyAgICAgICAgIG1pcEZpbHQgPSBNSVBGSUxURVJfTkVBUkVTVDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1Q6CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX0xJTkVBUjsKKyAgICAgICAgIG1pcEZpbHQgPSBNSVBGSUxURVJfTkVBUkVTVDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVI6CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX05FQVJFU1Q7CisgICAgICAgICBtaXBGaWx0ID0gTUlQRklMVEVSX0xJTkVBUjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUjoKKyAgICAgICAgIG1pbkZpbHQgPSBGSUxURVJfTElORUFSOworICAgICAgICAgbWlwRmlsdCA9IE1JUEZJTFRFUl9MSU5FQVI7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmICh0T2JqLT5NYXhBbmlzb3Ryb3B5ID4gMS4wKSB7CisgICAgICAgICBtaW5GaWx0ID0gRklMVEVSX0FOSVNPVFJPUElDOworICAgICAgICAgbWFnRmlsdCA9IEZJTFRFUl9BTklTT1RST1BJQzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgc3dpdGNoICh0T2JqLT5NYWdGaWx0ZXIpIHsKKyAgICAgICAgIGNhc2UgR0xfTkVBUkVTVDoKKyAgICAgICAgICAgIG1hZ0ZpbHQgPSBGSUxURVJfTkVBUkVTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgICAgICAgICBtYWdGaWx0ID0gRklMVEVSX0xJTkVBUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbG9kYmlhcyA9IChpbnQpICgodFVuaXQtPkxvZEJpYXMgKyB0T2JqLT5Mb2RCaWFzKSAqIDE2LjApOworICAgICAgaWYgKGxvZGJpYXMgPCAtMjU2KQorICAgICAgICAgIGxvZGJpYXMgPSAtMjU2OworICAgICAgaWYgKGxvZGJpYXMgPiAyNTUpCisgICAgICAgICAgbG9kYmlhcyA9IDI1NTsKKyAgICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTMl0gPSAoKGxvZGJpYXMgPDwgU1MyX0xPRF9CSUFTX1NISUZUKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUzJfTE9EX0JJQVNfTUFTSyk7CisKKyAgICAgIC8qIFlVViBjb252ZXJzaW9uOgorICAgICAgICovCisgICAgICBpZiAoZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ID09IE1FU0FfRk9STUFUX1lDQkNSIHx8CisgICAgICAgICAgZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ID09IE1FU0FfRk9STUFUX1lDQkNSX1JFVikKKyAgICAgICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTMl0gfD0gU1MyX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTjsKKworICAgICAgLyogU2hhZG93OgorICAgICAgICovCisgICAgICBpZiAodE9iai0+Q29tcGFyZU1vZGUgPT0gR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkVfQVJCICYmCisgICAgICAgICAgdE9iai0+VGFyZ2V0ICE9IEdMX1RFWFRVUkVfM0QpIHsKKyAgICAgICAgIGlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV8xRCkgCisgICAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgICAgICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTMl0gfD0KKyAgICAgICAgICAgIChTUzJfU0hBRE9XX0VOQUJMRSB8CisgICAgICAgICAgICAgaW50ZWxfdHJhbnNsYXRlX3NoYWRvd19jb21wYXJlX2Z1bmModE9iai0+Q29tcGFyZUZ1bmMpKTsKKworICAgICAgICAgbWluRmlsdCA9IEZJTFRFUl80WDRfRkxBVDsKKyAgICAgICAgIG1hZ0ZpbHQgPSBGSUxURVJfNFg0X0ZMQVQ7CisgICAgICB9CisKKyAgICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTMl0gfD0gKChtaW5GaWx0IDw8IFNTMl9NSU5fRklMVEVSX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlwRmlsdCA8PCBTUzJfTUlQX0ZJTFRFUl9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hZ0ZpbHQgPDwgU1MyX01BR19GSUxURVJfU0hJRlQpKTsKKyAgIH0KKworICAgeworICAgICAgR0xlbnVtIHdzID0gdE9iai0+V3JhcFM7CisgICAgICBHTGVudW0gd3QgPSB0T2JqLT5XcmFwVDsKKyAgICAgIEdMZW51bSB3ciA9IHRPYmotPldyYXBSOworCisKKyAgICAgIC8qIDNEIHRleHR1cmVzIGRvbid0IHNlZW0gdG8gcmVzcGVjdCB0aGUgYm9yZGVyIGNvbG9yLgorICAgICAgICogRmFsbGJhY2sgaWYgdGhlcmUncyBldmVyIGEgZGFuZ2VyIHRoYXQgdGhleSBtaWdodCByZWZlciB0bworICAgICAgICogaXQuICAKKyAgICAgICAqIAorICAgICAgICogRWZmZWN0aXZlbHkgdGhpcyBtZWFucyBmYWxsYmFjayBvbiAzRCBjbGFtcCBvcgorICAgICAgICogY2xhbXBfdG9fYm9yZGVyLgorICAgICAgICovCisgICAgICBpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfM0QgJiYKKyAgICAgICAgICAodE9iai0+TWluRmlsdGVyICE9IEdMX05FQVJFU1QgfHwKKyAgICAgICAgICAgdE9iai0+TWFnRmlsdGVyICE9IEdMX05FQVJFU1QpICYmCisgICAgICAgICAgKHdzID09IEdMX0NMQU1QIHx8CisgICAgICAgICAgIHd0ID09IEdMX0NMQU1QIHx8CisgICAgICAgICAgIHdyID09IEdMX0NMQU1QIHx8CisgICAgICAgICAgIHdzID09IEdMX0NMQU1QX1RPX0JPUkRFUiB8fAorICAgICAgICAgICB3dCA9PSBHTF9DTEFNUF9UT19CT1JERVIgfHwgd3IgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSkKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKworCisgICAgICBzdGF0ZVtJOTE1X1RFWFJFR19TUzNdID0gc3MzOyAgICAgLyogU1MzX05PUk1BTElaRURfQ09PUkRTICovCisKKyAgICAgIHN0YXRlW0k5MTVfVEVYUkVHX1NTM10gfD0KKyAgICAgICAgICgodHJhbnNsYXRlX3dyYXBfbW9kZSh3cykgPDwgU1MzX1RDWF9BRERSX01PREVfU0hJRlQpIHwKKyAgICAgICAgICAodHJhbnNsYXRlX3dyYXBfbW9kZSh3dCkgPDwgU1MzX1RDWV9BRERSX01PREVfU0hJRlQpIHwKKyAgICAgICAgICAodHJhbnNsYXRlX3dyYXBfbW9kZSh3cikgPDwgU1MzX1RDWl9BRERSX01PREVfU0hJRlQpKTsKKworICAgICAgc3RhdGVbSTkxNV9URVhSRUdfU1MzXSB8PSAodW5pdCA8PCBTUzNfVEVYVFVSRU1BUF9JTkRFWF9TSElGVCk7CisgICB9CisKKworICAgc3RhdGVbSTkxNV9URVhSRUdfU1M0XSA9IElOVEVMX1BBQ0tDT0xPUjg4ODgodE9iai0+X0JvcmRlckNoYW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0T2JqLT5fQm9yZGVyQ2hhblsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRPYmotPl9Cb3JkZXJDaGFuWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE9iai0+X0JvcmRlckNoYW5bM10pOworCisKKyAgIEk5MTVfQUNUSVZFU1RBVEUoaTkxNSwgSTkxNV9VUExPQURfVEVYKHVuaXQpLCBHTF9UUlVFKTsKKyAgIC8qIG1lbWNtcCB3YXMgYWxyZWFkeSBkaXNhYmxlZCwgYnV0IGRlZmluaXRlbHkgd29uJ3Qgd29yayBhcyB0aGUKKyAgICAqIHJlZ2lvbiBtaWdodCBub3cgY2hhbmdlIGFuZCB0aGF0IHdvdWxkbid0IGJlIGRldGVjdGVkOgorICAgICovCisgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX1RFWCh1bml0KSk7CisKKworI2lmIDAKKyAgIERCRyhURVhUVVJFLCAic3RhdGVbSTkxNV9URVhSRUdfU1MyXSA9IDB4JXhcbiIsIHN0YXRlW0k5MTVfVEVYUkVHX1NTMl0pOworICAgREJHKFRFWFRVUkUsICJzdGF0ZVtJOTE1X1RFWFJFR19TUzNdID0gMHgleFxuIiwgc3RhdGVbSTkxNV9URVhSRUdfU1MzXSk7CisgICBEQkcoVEVYVFVSRSwgInN0YXRlW0k5MTVfVEVYUkVHX1NTNF0gPSAweCV4XG4iLCBzdGF0ZVtJOTE1X1RFWFJFR19TUzRdKTsKKyAgIERCRyhURVhUVVJFLCAic3RhdGVbSTkxNV9URVhSRUdfTVMyXSA9IDB4JXhcbiIsIHN0YXRlW0k5MTVfVEVYUkVHX01TMl0pOworICAgREJHKFRFWFRVUkUsICJzdGF0ZVtJOTE1X1RFWFJFR19NUzNdID0gMHgleFxuIiwgc3RhdGVbSTkxNV9URVhSRUdfTVMzXSk7CisgICBEQkcoVEVYVFVSRSwgInN0YXRlW0k5MTVfVEVYUkVHX01TNF0gPSAweCV4XG4iLCBzdGF0ZVtJOTE1X1RFWFJFR19NUzRdKTsKKyNlbmRpZgorCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisKKwordm9pZAoraTkxNVVwZGF0ZVRleHR1cmVTdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CiAgICBHTGJvb2xlYW4gb2sgPSBHTF9UUlVFOwogICAgR0x1aW50IGk7CiAKLSAgIGZvciAoaSA9IDAgOyBpIDwgSTkxNV9URVhfVU5JVFMgJiYgb2sgOyBpKyspIHsKLSAgICAgIG9rID0gaTkxNVVwZGF0ZVRleFVuaXQoIGN0eCwgaSApOworICAgZm9yIChpID0gMDsgaSA8IEk5MTVfVEVYX1VOSVRTICYmIG9rOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoaW50ZWwtPmN0eC5UZXh0dXJlLlVuaXRbaV0uX1JlYWxseUVuYWJsZWQpIHsKKyAgICAgIGNhc2UgVEVYVFVSRV8xRF9CSVQ6CisgICAgICBjYXNlIFRFWFRVUkVfMkRfQklUOgorICAgICAgY2FzZSBURVhUVVJFX0NVQkVfQklUOgorICAgICAgY2FzZSBURVhUVVJFXzNEX0JJVDoKKyAgICAgICAgIG9rID0gaTkxNV91cGRhdGVfdGV4X3VuaXQoaW50ZWwsIGksIFNTM19OT1JNQUxJWkVEX0NPT1JEUyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVYVFVSRV9SRUNUX0JJVDoKKyAgICAgICAgIG9rID0gaTkxNV91cGRhdGVfdGV4X3VuaXQoaW50ZWwsIGksIDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDA6eworICAgICAgICAgICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICAgICAgICAgICBpZiAoaTkxNS0+c3RhdGUuYWN0aXZlICYgSTkxNV9VUExPQURfVEVYKGkpKQorICAgICAgICAgICAgICAgSTkxNV9BQ1RJVkVTVEFURShpOTE1LCBJOTE1X1VQTE9BRF9URVgoaSksIEdMX0ZBTFNFKTsKKworCSAgICBpZiAoaTkxNS0+c3RhdGUudGV4X2J1ZmZlcltpXSAhPSBOVUxMKSB7CisJICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShpOTE1LT5zdGF0ZS50ZXhfYnVmZmVyW2ldKTsKKwkgICAgICAgaTkxNS0+c3RhdGUudGV4X2J1ZmZlcltpXSA9IE5VTEw7CisJICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgb2sgPSBHTF9GQUxTRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQogICAgfQogCi0gICBGQUxMQkFDSyggaW50ZWwsIEk5MTVfRkFMTEJBQ0tfVEVYVFVSRSwgIW9rICk7CisgICBGQUxMQkFDSyhpbnRlbCwgSTkxNV9GQUxMQkFDS19URVhUVVJFLCAhb2spOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3Z0YmwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaTkxNV92dGJsLmMKaW5kZXggY2M4YTYwNS4uMTlmMjIwNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pOTE1X3Z0YmwuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2k5MTVfdnRibC5jCkBAIC0zNywxMTUgKzM3LDE0OCBAQAogI2luY2x1ZGUgInRubC90X3ZlcnRleC5oIgogCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfdHJpcy5oIgogCiAjaW5jbHVkZSAiaTkxNV9yZWcuaCIKICNpbmNsdWRlICJpOTE1X2NvbnRleHQuaCIKIAotc3RhdGljIHZvaWQgaTkxNV9yZW5kZXJfc3RhcnQoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCi17Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChpbnRlbCk7CisjaW5jbHVkZSAiZ2xhcGkuaCIKIAotICAgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9BY3RpdmUpIAotICAgICAgaTkxNVZhbGlkYXRlRnJhZ21lbnRQcm9ncmFtKCBpOTE1ICk7Ci0gICBlbHNlIHsKLSAgICAgIGFzc2VydCghY3R4LT5GcmFnbWVudFByb2dyYW0uX01haW50YWluVGV4RW52UHJvZ3JhbSk7Ci0gICAgICBpOTE1VmFsaWRhdGVUZXh0dXJlUHJvZ3JhbSggaTkxNSApOwotICAgfQorc3RhdGljIHZvaWQKK2k5MTVfcmVuZGVyX3ByZXZhbGlkYXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOworCisgICBpZiAoIWludGVsLT5GYWxsYmFjaykKKyAgICAgICBpOTE1VmFsaWRhdGVGcmFnbWVudFByb2dyYW0oaTkxNSk7Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X3JlbmRlcl9zdGFydChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CiB9CiAKIAotc3RhdGljIHZvaWQgaTkxNV9yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCQkgIEdMZW51bSBycHJpbSApCitzdGF0aWMgdm9pZAoraTkxNV9yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMZW51bSBycHJpbSkKIHsKLSAgICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGludGVsKTsKLSAgICBHTHVpbnQgc3QxID0gaTkxNS0+c3RhdGUuU3RpcHBsZVtJOTE1X1NUUFJFR19TVDFdOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBHTHVpbnQgc3QxID0gaTkxNS0+c3RhdGUuU3RpcHBsZVtJOTE1X1NUUFJFR19TVDFdOwogCi0gICAgc3QxICY9IH5TVDFfRU5BQkxFOworICAgc3QxICY9IH5TVDFfRU5BQkxFOwogCi0gICAgc3dpdGNoIChycHJpbSkgewotICAgIGNhc2UgR0xfUVVBRFM6IC8qIGZyb20gUkFTVEVSSVpFKEdMX1FVQURTKSBpbiB0X2RkX3RyaXRlbXAuaCAqLwotICAgIGNhc2UgR0xfVFJJQU5HTEVTOgotICAgICAgIGlmIChpbnRlbC0+Y3R4LlBvbHlnb24uU3RpcHBsZUZsYWcgJiYKLQkgICBpbnRlbC0+aHdfc3RpcHBsZSkKLQkgIHN0MSB8PSBTVDFfRU5BQkxFOwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTElORVM6Ci0gICAgY2FzZSBHTF9QT0lOVFM6Ci0gICAgZGVmYXVsdDoKLSAgICAgICBicmVhazsKLSAgICB9CisgICBzd2l0Y2ggKHJwcmltKSB7CisgICBjYXNlIEdMX1FVQURTOiAvKiBmcm9tIFJBU1RFUklaRShHTF9RVUFEUykgaW4gdF9kZF90cml0ZW1wLmggKi8KKyAgIGNhc2UgR0xfVFJJQU5HTEVTOgorICAgICAgaWYgKGludGVsLT5jdHguUG9seWdvbi5TdGlwcGxlRmxhZyAmJiBpbnRlbC0+aHdfc3RpcHBsZSkKKyAgICAgICAgIHN0MSB8PSBTVDFfRU5BQkxFOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0xJTkVTOgorICAgY2FzZSBHTF9QT0lOVFM6CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CiAKLSAgICBpOTE1LT5pbnRlbC5yZWR1Y2VkX3ByaW1pdGl2ZSA9IHJwcmltOworICAgaTkxNS0+aW50ZWwucmVkdWNlZF9wcmltaXRpdmUgPSBycHJpbTsKIAotICAgIGlmIChzdDEgIT0gaTkxNS0+c3RhdGUuU3RpcHBsZVtJOTE1X1NUUFJFR19TVDFdKSB7Ci0gICAgICAgSTkxNV9TVEFURUNIQU5HRShpOTE1LCBJOTE1X1VQTE9BRF9TVElQUExFKTsKLSAgICAgICBpOTE1LT5zdGF0ZS5TdGlwcGxlW0k5MTVfU1RQUkVHX1NUMV0gPSBzdDE7Ci0gICAgfQorICAgaWYgKHN0MSAhPSBpOTE1LT5zdGF0ZS5TdGlwcGxlW0k5MTVfU1RQUkVHX1NUMV0pIHsKKyAgICAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7CisKKyAgICAgIEk5MTVfU1RBVEVDSEFOR0UoaTkxNSwgSTkxNV9VUExPQURfU1RJUFBMRSk7CisgICAgICBpOTE1LT5zdGF0ZS5TdGlwcGxlW0k5MTVfU1RQUkVHX1NUMV0gPSBzdDE7CisgICB9CiB9CiAKIAogLyogUHVsbCBhcGFydCB0aGUgdmVydGV4IGZvcm1hdCByZWdpc3RlcnMgYW5kIGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEKICAqIHZlcnRleCBpcyBzdXBwb3NlZCB0byBiZS4gCiAgKi8KLXN0YXRpYyBHTGJvb2xlYW4gaTkxNV9jaGVja192ZXJ0ZXhfc2l6ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCQkgR0x1aW50IGV4cGVjdGVkICkKK3N0YXRpYyBHTGJvb2xlYW4KK2k5MTVfY2hlY2tfdmVydGV4X3NpemUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgZXhwZWN0ZWQpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGludGVsKTsKKyAgIHN0cnVjdCBpOTE1X2NvbnRleHQgKmk5MTUgPSBpOTE1X2NvbnRleHQoJmludGVsLT5jdHgpOwogICAgaW50IGxpczIgPSBpOTE1LT5jdXJyZW50LT5DdHhbSTkxNV9DVFhSRUdfTElTMl07CiAgICBpbnQgbGlzNCA9IGk5MTUtPmN1cnJlbnQtPkN0eFtJOTE1X0NUWFJFR19MSVM0XTsKICAgIGludCBpLCBzeiA9IDA7CiAKICAgIHN3aXRjaCAobGlzNCAmIFM0X1ZGTVRfWFlaV19NQVNLKSB7Ci0gICBjYXNlIFM0X1ZGTVRfWFk6IHN6ID0gMjsgYnJlYWs7Ci0gICBjYXNlIFM0X1ZGTVRfWFlaOiBzeiA9IDM7IGJyZWFrOwotICAgY2FzZSBTNF9WRk1UX1hZVzogc3ogPSAzOyBicmVhazsKLSAgIGNhc2UgUzRfVkZNVF9YWVpXOiBzeiA9IDQ7IGJyZWFrOwotICAgZGVmYXVsdDogCisgICBjYXNlIFM0X1ZGTVRfWFk6CisgICAgICBzeiA9IDI7CisgICAgICBicmVhazsKKyAgIGNhc2UgUzRfVkZNVF9YWVo6CisgICAgICBzeiA9IDM7CisgICAgICBicmVhazsKKyAgIGNhc2UgUzRfVkZNVF9YWVc6CisgICAgICBzeiA9IDM7CisgICAgICBicmVhazsKKyAgIGNhc2UgUzRfVkZNVF9YWVpXOgorICAgICAgc3ogPSA0OworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgogICAgICAgZnByaW50ZihzdGRlcnIsICJubyB4eXp3IHNwZWNpZmllZFxuIik7CiAgICAgICByZXR1cm4gMDsKICAgIH0KIAotICAgaWYgKGxpczQgJiBTNF9WRk1UX1NQRUNfRk9HKSBzeisrOwotICAgaWYgKGxpczQgJiBTNF9WRk1UX0NPTE9SKSBzeisrOwotICAgaWYgKGxpczQgJiBTNF9WRk1UX0RFUFRIX09GRlNFVCkgc3orKzsKLSAgIGlmIChsaXM0ICYgUzRfVkZNVF9QT0lOVF9XSURUSCkgc3orKzsKLSAgIGlmIChsaXM0ICYgUzRfVkZNVF9GT0dfUEFSQU0pIHN6Kys7Ci0JCi0gICBmb3IgKGkgPSAwIDsgaSA8IDggOyBpKyspIHsgCisgICBpZiAobGlzNCAmIFM0X1ZGTVRfU1BFQ19GT0cpCisgICAgICBzeisrOworICAgaWYgKGxpczQgJiBTNF9WRk1UX0NPTE9SKQorICAgICAgc3orKzsKKyAgIGlmIChsaXM0ICYgUzRfVkZNVF9ERVBUSF9PRkZTRVQpCisgICAgICBzeisrOworICAgaWYgKGxpczQgJiBTNF9WRk1UX1BPSU5UX1dJRFRIKQorICAgICAgc3orKzsKKyAgIGlmIChsaXM0ICYgUzRfVkZNVF9GT0dfUEFSQU0pCisgICAgICBzeisrOworCisgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICBzd2l0Y2ggKGxpczIgJiBTMl9URVhDT09SRF9GTVQwX01BU0spIHsKLSAgICAgIGNhc2UgVEVYQ09PUkRGTVRfMkQ6IHN6ICs9IDI7IGJyZWFrOwotICAgICAgY2FzZSBURVhDT09SREZNVF8zRDogc3ogKz0gMzsgYnJlYWs7Ci0gICAgICBjYXNlIFRFWENPT1JERk1UXzREOiBzeiArPSA0OyBicmVhazsKLSAgICAgIGNhc2UgVEVYQ09PUkRGTVRfMUQ6IHN6ICs9IDE7IGJyZWFrOwotICAgICAgY2FzZSBURVhDT09SREZNVF8yRF8xNjogc3ogKz0gMTsgYnJlYWs7Ci0gICAgICBjYXNlIFRFWENPT1JERk1UXzREXzE2OiBzeiArPSAyOyBicmVhazsKLSAgICAgIGNhc2UgVEVYQ09PUkRGTVRfTk9UX1BSRVNFTlQ6IGJyZWFrOworICAgICAgY2FzZSBURVhDT09SREZNVF8yRDoKKyAgICAgICAgIHN6ICs9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVYQ09PUkRGTVRfM0Q6CisgICAgICAgICBzeiArPSAzOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRFWENPT1JERk1UXzREOgorICAgICAgICAgc3ogKz0gNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBURVhDT09SREZNVF8xRDoKKyAgICAgICAgIHN6ICs9IDE7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVYQ09PUkRGTVRfMkRfMTY6CisgICAgICAgICBzeiArPSAxOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRFWENPT1JERk1UXzREXzE2OgorICAgICAgICAgc3ogKz0gMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBURVhDT09SREZNVF9OT1RfUFJFU0VOVDoKKyAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKLQkgZnByaW50ZihzdGRlcnIsICJiYWQgdGV4Y29vcmQgZm10ICVkXG4iLCBpKTsKLQkgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgdGV4Y29vcmQgZm10ICVkXG4iLCBpKTsKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKICAgICAgIH0KICAgICAgIGxpczIgPj49IFMyX1RFWENPT1JEX0ZNVDFfU0hJRlQ7CiAgICB9Ci0JCi0gICBpZiAoc3ogIT0gZXhwZWN0ZWQpIAorCisgICBpZiAoc3ogIT0gZXhwZWN0ZWQpCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgInZlcnRleCBzaXplIG1pc21hdGNoICVkLyVkXG4iLCBzeiwgZXhwZWN0ZWQpOwotICAgCisKICAgIHJldHVybiBzeiA9PSBleHBlY3RlZDsKIH0KIAogCi1zdGF0aWMgdm9pZCBpOTE1X2VtaXRfaW52YXJpZW50X3N0YXRlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQorc3RhdGljIHZvaWQKK2k5MTVfZW1pdF9pbnZhcmllbnRfc3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogewogICAgQkFUQ0hfTE9DQUxTOwogCi0gICBCRUdJTl9CQVRDSCggMjAgKTsKKyAgIEJFR0lOX0JBVENIKDIwMCwgSUdOT1JFX0NMSVBSRUNUUyk7CiAKICAgIE9VVF9CQVRDSChfM0RTVEFURV9BQV9DTUQgfAotCSAgICAgQUFfTElORV9FQ0FBUl9XSURUSF9FTkFCTEUgfAotCSAgICAgQUFfTElORV9FQ0FBUl9XSURUSF8xXzAgfAotCSAgICAgQUFfTElORV9SRUdJT05fV0lEVEhfRU5BQkxFIHwKLQkgICAgIEFBX0xJTkVfUkVHSU9OX1dJRFRIXzFfMCk7CisgICAgICAgICAgICAgQUFfTElORV9FQ0FBUl9XSURUSF9FTkFCTEUgfAorICAgICAgICAgICAgIEFBX0xJTkVfRUNBQVJfV0lEVEhfMV8wIHwKKyAgICAgICAgICAgICBBQV9MSU5FX1JFR0lPTl9XSURUSF9FTkFCTEUgfCBBQV9MSU5FX1JFR0lPTl9XSURUSF8xXzApOwogCiAgICBPVVRfQkFUQ0goXzNEU1RBVEVfREZMVF9ESUZGVVNFX0NNRCk7CiAgICBPVVRfQkFUQ0goMCk7CkBAIC0xNTgsMzUgKzE5MSwyNyBAQAogCiAgICAvKiBEb24ndCBzdXBwb3J0IHRleHR1cmUgY3Jvc3NiYXIgeWV0ICovCiAgICBPVVRfQkFUQ0goXzNEU1RBVEVfQ09PUkRfU0VUX0JJTkRJTkdTIHwKLQkgICAgIENTQl9UQ0IoMCwgMCkgfAotCSAgICAgQ1NCX1RDQigxLCAxKSB8Ci0JICAgICBDU0JfVENCKDIsIDIpIHwKLQkgICAgIENTQl9UQ0IoMywgMykgfAotCSAgICAgQ1NCX1RDQig0LCA0KSB8Ci0JICAgICBDU0JfVENCKDUsIDUpIHwKLQkgICAgIENTQl9UQ0IoNiwgNikgfAotCSAgICAgQ1NCX1RDQig3LCA3KSk7CisgICAgICAgICAgICAgQ1NCX1RDQigwLCAwKSB8CisgICAgICAgICAgICAgQ1NCX1RDQigxLCAxKSB8CisgICAgICAgICAgICAgQ1NCX1RDQigyLCAyKSB8CisgICAgICAgICAgICAgQ1NCX1RDQigzLCAzKSB8CisgICAgICAgICAgICAgQ1NCX1RDQig0LCA0KSB8IENTQl9UQ0IoNSwgNSkgfCBDU0JfVENCKDYsIDYpIHwgQ1NCX1RDQig3LCA3KSk7CiAKICAgIE9VVF9CQVRDSChfM0RTVEFURV9SQVNURVJfUlVMRVNfQ01EIHwKLQkgICAgIEVOQUJMRV9QT0lOVF9SQVNURVJfUlVMRSB8Ci0JICAgICBPR0xfUE9JTlRfUkFTVEVSX1JVTEUgfAotCSAgICAgRU5BQkxFX0xJTkVfU1RSSVBfUFJPVk9LRV9WUlRYIHwKLQkgICAgIEVOQUJMRV9UUklfRkFOX1BST1ZPS0VfVlJUWCB8Ci0JICAgICBMSU5FX1NUUklQX1BST1ZPS0VfVlJUWCgxKSB8Ci0JICAgICBUUklfRkFOX1BST1ZPS0VfVlJUWCgyKSB8IAotCSAgICAgRU5BQkxFX1RFWEtJTExfM0RfNEQgfAotCSAgICAgVEVYS0lMTF80RCk7CisgICAgICAgICAgICAgRU5BQkxFX1BPSU5UX1JBU1RFUl9SVUxFIHwKKyAgICAgICAgICAgICBPR0xfUE9JTlRfUkFTVEVSX1JVTEUgfAorICAgICAgICAgICAgIEVOQUJMRV9MSU5FX1NUUklQX1BST1ZPS0VfVlJUWCB8CisgICAgICAgICAgICAgRU5BQkxFX1RSSV9GQU5fUFJPVk9LRV9WUlRYIHwKKyAgICAgICAgICAgICBMSU5FX1NUUklQX1BST1ZPS0VfVlJUWCgxKSB8CisgICAgICAgICAgICAgVFJJX0ZBTl9QUk9WT0tFX1ZSVFgoMikgfCBFTkFCTEVfVEVYS0lMTF8zRF80RCB8IFRFWEtJTExfNEQpOwogCiAgICAvKiBOZWVkIHRvIGluaXRpYWxpemUgdGhpcyB0byB6ZXJvLgogICAgICovCi0gICBPVVRfQkFUQ0goXzNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMSB8IAotCSAgICAgSTFfTE9BRF9TKDMpIHwKLQkgICAgICgwKSk7CisgICBPVVRfQkFUQ0goXzNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMSB8IEkxX0xPQURfUygzKSB8ICgwKSk7CiAgICBPVVRfQkFUQ0goMCk7Ci0gCisKICAgIC8qIFhYWDogVXNlIHRoaXMgKi8KLSAgIE9VVF9CQVRDSChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfCAKLQkgICAgIERJU0FCTEVfU0NJU1NPUl9SRUNUKTsKKyAgIE9VVF9CQVRDSChfM0RTVEFURV9TQ0lTU09SX0VOQUJMRV9DTUQgfCBESVNBQkxFX1NDSVNTT1JfUkVDVCk7CiAKICAgIE9VVF9CQVRDSChfM0RTVEFURV9TQ0lTU09SX1JFQ1RfMF9DTUQpOwogICAgT1VUX0JBVENIKDApOwpAQCAtMTk0LDI5ICsyMTksMjMgQEAKIAogICAgT1VUX0JBVENIKF8zRFNUQVRFX0RFUFRIX1NVQlJFQ1RfRElTQUJMRSk7CiAKLSAgIE9VVF9CQVRDSChfM0RTVEFURV9MT0FEX0lORElSRUNUIHwgMCk7IC8qIGRpc2FibGUgaW5kaXJlY3Qgc3RhdGUgKi8KKyAgIE9VVF9CQVRDSChfM0RTVEFURV9MT0FEX0lORElSRUNUIHwgMCk7ICAgICAgIC8qIGRpc2FibGUgaW5kaXJlY3Qgc3RhdGUgKi8KICAgIE9VVF9CQVRDSCgwKTsKIAogCiAgICAvKiBEb24ndCBzdXBwb3J0IHR3b3NpZGVkIHN0ZW5jaWwgeWV0ICovCi0gICBPVVRfQkFUQ0goXzNEU1RBVEVfQkFDS0ZBQ0VfU1RFTkNJTF9PUFMgfAotCSAgICAgQkZPX0VOQUJMRV9TVEVOQ0lMX1RXT19TSURFIHwKLQkgICAgIDAgKTsKLSAgIAorICAgT1VUX0JBVENIKF8zRFNUQVRFX0JBQ0tGQUNFX1NURU5DSUxfT1BTIHwgQkZPX0VOQUJMRV9TVEVOQ0lMX1RXT19TSURFIHwgMCk7CisgICBPVVRfQkFUQ0goMCk7CisKICAgIEFEVkFOQ0VfQkFUQ0goKTsKIH0KIAogCi0jZGVmaW5lIGVtaXQoIGludGVsLCBzdGF0ZSwgc2l6ZSApCQkJXAotZG8gewkJCQkJCQlcCi0gICBpbnQgazsJCQkJCQlcCi0gICBCRUdJTl9CQVRDSCggKHNpemUpIC8gc2l6ZW9mKEdMdWludCkpOwkJXAotICAgZm9yIChrID0gMCA7IGsgPCAoc2l6ZSkgLyBzaXplb2YoR0x1aW50KSA7IGsrKykJXAotICAgICAgT1VUX0JBVENIKChzdGF0ZSlba10pOwkJCQlcCi0gICBBRFZBTkNFX0JBVENIKCk7CQkJCQlcCi19IHdoaWxlICgwKTsKKyNkZWZpbmUgZW1pdChpbnRlbCwgc3RhdGUsIHNpemUgKQkJICAgICBcCisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKGludGVsLT5iYXRjaCwgc3RhdGUsIHNpemUsIElHTk9SRV9DTElQUkVDVFMgKQogCi1zdGF0aWMgR0x1aW50IGdldF9kaXJ0eSggc3RydWN0IGk5MTVfaHdfc3RhdGUgKnN0YXRlICkKK3N0YXRpYyBHTHVpbnQKK2dldF9kaXJ0eShzdHJ1Y3QgaTkxNV9od19zdGF0ZSAqc3RhdGUpCiB7CiAgICBHTHVpbnQgZGlydHk7CiAKQEAgLTIyNyw5NCArMjQ2LDE3MiBAQAogICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYX0FMTCkKICAgICAgIHN0YXRlLT5lbWl0dGVkICY9IH5JOTE1X1VQTE9BRF9URVhfQUxMOwogICAgZGlydHkgPSBzdGF0ZS0+YWN0aXZlICYgfnN0YXRlLT5lbWl0dGVkOwotCiAgICByZXR1cm4gZGlydHk7CiB9CiAKIAotc3RhdGljIEdMdWludCBnZXRfc3RhdGVfc2l6ZSggc3RydWN0IGk5MTVfaHdfc3RhdGUgKnN0YXRlICkKK3N0YXRpYyBHTHVpbnQKK2dldF9zdGF0ZV9zaXplKHN0cnVjdCBpOTE1X2h3X3N0YXRlICpzdGF0ZSkKIHsKICAgIEdMdWludCBkaXJ0eSA9IGdldF9kaXJ0eShzdGF0ZSk7CiAgICBHTHVpbnQgaTsKICAgIEdMdWludCBzeiA9IDA7CiAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0lOVkFSSUVOVCkKLSAgICAgIHN6ICs9IDIwICogc2l6ZW9mKGludCk7CisgICAgICBzeiArPSAzMCAqIDQ7CiAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0NUWCkKICAgICAgIHN6ICs9IHNpemVvZihzdGF0ZS0+Q3R4KTsKIAotICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfQlVGRkVSUykgCisgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9CVUZGRVJTKQogICAgICAgc3ogKz0gc2l6ZW9mKHN0YXRlLT5CdWZmZXIpOwogCiAgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9TVElQUExFKQogICAgICAgc3ogKz0gc2l6ZW9mKHN0YXRlLT5TdGlwcGxlKTsKIAotICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfRk9HKSAKKyAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0ZPRykKICAgICAgIHN6ICs9IHNpemVvZihzdGF0ZS0+Rm9nKTsKIAogICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYX0FMTCkgewogICAgICAgaW50IG5yID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBJOTE1X1RFWF9VTklUUzsgaSsrKSAKLQkgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYKGkpKSAKLQkgICAgbnIrKzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBJOTE1X1RFWF9VTklUUzsgaSsrKQorICAgICAgICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYKGkpKQorICAgICAgICAgICAgbnIrKzsKIAotICAgICAgc3ogKz0gKDIrbnIqMykgKiBzaXplb2YoR0x1aW50KSAqIDI7CisgICAgICBzeiArPSAoMiArIG5yICogMykgKiBzaXplb2YoR0x1aW50KSAqIDI7CiAgICB9CiAKLSAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0NPTlNUQU5UUykgCisgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9DT05TVEFOVFMpCiAgICAgICBzeiArPSBzdGF0ZS0+Q29uc3RhbnRTaXplICogc2l6ZW9mKEdMdWludCk7CiAKLSAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1BST0dSQU0pIAorICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfUFJPR1JBTSkKICAgICAgIHN6ICs9IHN0YXRlLT5Qcm9ncmFtU2l6ZSAqIHNpemVvZihHTHVpbnQpOwogCiAgICByZXR1cm4gc3o7CiB9CiAKLQogLyogUHVzaCB0aGUgc3RhdGUgaW50byB0aGUgc2FyZWEgYW5kL29yIHRleHR1cmUgbWVtb3J5LgogICovCi1zdGF0aWMgdm9pZCBpOTE1X2VtaXRfc3RhdGUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCitzdGF0aWMgdm9pZAoraTkxNV9lbWl0X3N0YXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKIHsKLSAgIGk5MTVDb250ZXh0UHRyIGk5MTUgPSBJOTE1X0NPTlRFWFQoaW50ZWwpOworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CiAgICBzdHJ1Y3QgaTkxNV9od19zdGF0ZSAqc3RhdGUgPSBpOTE1LT5jdXJyZW50OwotICAgaW50IGk7Ci0gICBHTHVpbnQgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOwotICAgR0x1aW50IGNvdW50ZXIgPSBpbnRlbC0+YmF0Y2guY291bnRlcjsKKyAgIGludCBpLCBjb3VudCwgYXBlcl9jb3VudDsKKyAgIEdMdWludCBkaXJ0eTsKKyAgIGRyaV9ibyAqYXBlcl9hcnJheVszICsgSTkxNV9URVhfVU5JVFNdOworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOwogICAgQkFUQ0hfTE9DQUxTOwogCi0gICBpZiAoaW50ZWwtPmJhdGNoLnNwYWNlIDwgZ2V0X3N0YXRlX3NpemUoc3RhdGUpKSB7Ci0gICAgICBpbnRlbEZsdXNoQmF0Y2goaW50ZWwsIEdMX1RSVUUpOwotICAgICAgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOwotICAgICAgY291bnRlciA9IGludGVsLT5iYXRjaC5jb3VudGVyOworICAgLyogV2UgZG9uJ3QgaG9sZCB0aGUgbG9jayBhdCB0aGlzIHBvaW50LCBzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgKiB0aGVyZSB3b24ndCBiZSBhIGJ1ZmZlciB3cmFwIGJldHdlZW4gdGhlIHN0YXRlIGVtaXRzIGFuZCB0aGUgcHJpbWl0aXZlCisgICAgKiBlbWl0IGhlYWRlci4KKyAgICAqCisgICAgKiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gdGFsayBhYm91dCBleHBsaWNpdCBwbGFjZXMgd2hlcmUKKyAgICAqIHNjaGVkdWxpbmcgaXMgYWxsb3dlZCwgcmF0aGVyIHRoYW4gYXNzdW1lIHRoYXQgaXQgaXMgd2hlbmV2ZXIgYQorICAgICogYmF0Y2hidWZmZXIgZmlsbHMgdXAuCisgICAgKgorICAgICogU2V0IHRoZSBzcGFjZSBhcyBMT09QX0NMSVBSRUNUUyBub3csIHNpbmNlIHRoYXQncyB3aGF0IG91ciBwcmltaXRpdmVzCisgICAgKiB3aWxsIGJlIGVtaXR0ZWQgdW5kZXIuCisgICAgKi8KKyAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoaW50ZWwtPmJhdGNoLAorCQkJCSAgIGdldF9zdGF0ZV9zaXplKHN0YXRlKSArIElOVEVMX1BSSU1fRU1JVF9TSVpFLAorCQkJCSAgIExPT1BfQ0xJUFJFQ1RTKTsKKyAgIGNvdW50ID0gMDsKKyBhZ2FpbjoKKyAgIGFwZXJfY291bnQgPSAwOworICAgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOworCisgICBhcGVyX2FycmF5W2FwZXJfY291bnQrK10gPSBpbnRlbC0+YmF0Y2gtPmJ1ZjsKKyAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0JVRkZFUlMpIHsKKyAgICAgIGFwZXJfYXJyYXlbYXBlcl9jb3VudCsrXSA9IHN0YXRlLT5kcmF3X3JlZ2lvbi0+YnVmZmVyOworICAgICAgaWYgKHN0YXRlLT5kZXB0aF9yZWdpb24pCisJIGFwZXJfYXJyYXlbYXBlcl9jb3VudCsrXSA9IHN0YXRlLT5kZXB0aF9yZWdpb24tPmJ1ZmZlcjsKICAgIH0KIAotICAgaWYgKFZFUkJPU0UpIAorICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYX0FMTCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IEk5MTVfVEVYX1VOSVRTOyBpKyspIHsKKwkgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYKGkpKSB7CisJICAgIGlmIChzdGF0ZS0+dGV4X2J1ZmZlcltpXSkgeworCSAgICAgICBhcGVyX2FycmF5W2FwZXJfY291bnQrK10gPSBzdGF0ZS0+dGV4X2J1ZmZlcltpXTsKKwkgICAgfQorCSB9CisgICAgICB9CisgICB9CisKKyAgIGlmIChkcmlfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGFwZXJfYXJyYXksIGFwZXJfY291bnQpKSB7CisgICAgICAgaWYgKGNvdW50ID09IDApIHsKKwkgICBjb3VudCsrOworCSAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CisJICAgZ290byBhZ2FpbjsKKyAgICAgICB9IGVsc2UgeworCSAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImk5MTUgZW1pdCBzdGF0ZSIpOworCSAgIGFzc2VydCgwKTsKKyAgICAgICB9CisgICB9CisKKyAgIC8qIHdvcmsgb3V0IGxpc3Qgb2YgYnVmZmVycyB0byBlbWl0ICovCisgICAKKyAgIC8qIERvIHRoaXMgaGVyZSBhcyB3ZSBtYXkgaGF2ZSBmbHVzaGVkIHRoZSBiYXRjaGJ1ZmZlciBhYm92ZSwKKyAgICAqIGNhdXNpbmcgbW9yZSBzdGF0ZSB0byBiZSBkaXJ0eSEKKyAgICAqLworICAgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOworICAgc3RhdGUtPmVtaXR0ZWQgfD0gZGlydHk7CisgICBhc3NlcnQoZ2V0X2RpcnR5KHN0YXRlKSA9PSAwKTsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVEUpCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGRpcnR5OiAleFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSk7CiAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0lOVkFSSUVOVCkgewotICAgICAgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfSU5WQVJJRU5UOlxuIik7IAotICAgICAgaTkxNV9lbWl0X2ludmFyaWVudF9zdGF0ZSggaW50ZWwgKTsKKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NUQVRFKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJOTE1X1VQTE9BRF9JTlZBUklFTlQ6XG4iKTsKKyAgICAgIGk5MTVfZW1pdF9pbnZhcmllbnRfc3RhdGUoaW50ZWwpOwogICAgfQogCiAgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9DVFgpIHsKLSAgICAgIGlmIChWRVJCT1NFKSBmcHJpbnRmKHN0ZGVyciwgIkk5MTVfVVBMT0FEX0NUWDpcbiIpOyAKLSAgICAgIGVtaXQoIGk5MTUsIHN0YXRlLT5DdHgsIHNpemVvZihzdGF0ZS0+Q3R4KSApOworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVEUpCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkk5MTVfVVBMT0FEX0NUWDpcbiIpOworCisgICAgICBlbWl0KGludGVsLCBzdGF0ZS0+Q3R4LCBzaXplb2Yoc3RhdGUtPkN0eCkpOwogICAgfQogCiAgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9CVUZGRVJTKSB7Ci0gICAgICBpZiAoVkVSQk9TRSkgZnByaW50ZihzdGRlcnIsICJJOTE1X1VQTE9BRF9CVUZGRVJTOlxuIik7IAotICAgICAgZW1pdCggaTkxNSwgc3RhdGUtPkJ1ZmZlciwgc2l6ZW9mKHN0YXRlLT5CdWZmZXIpICk7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfQlVGRkVSUzpcbiIpOworICAgICAgQkVHSU5fQkFUQ0goSTkxNV9ERVNUX1NFVFVQX1NJWkUgKyAyLCBJR05PUkVfQ0xJUFJFQ1RTKTsKKyAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjBdKTsKKyAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjFdKTsKKyAgICAgIE9VVF9SRUxPQyhzdGF0ZS0+ZHJhd19yZWdpb24tPmJ1ZmZlciwKKwkJSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+ZHJhd19yZWdpb24tPmRyYXdfb2Zmc2V0KTsKKworICAgICAgaWYgKHN0YXRlLT5kZXB0aF9yZWdpb24pIHsKKyAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjBdKTsKKyAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+QnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjFdKTsKKyAgICAgICAgIE9VVF9SRUxPQyhzdGF0ZS0+ZGVwdGhfcmVnaW9uLT5idWZmZXIsCisJCSAgIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPmRlcHRoX3JlZ2lvbi0+ZHJhd19vZmZzZXQpOworICAgICAgfQorCisgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJOTE1X0RFU1RSRUdfRFYwXSk7CisgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJOTE1X0RFU1RSRUdfRFYxXSk7CisgICAgICBPVVRfQkFUQ0goc3RhdGUtPkJ1ZmZlcltJOTE1X0RFU1RSRUdfU0VOQUJMRV0pOworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTkxNV9ERVNUUkVHX1NSMF0pOworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTkxNV9ERVNUUkVHX1NSMV0pOworICAgICAgT1VUX0JBVENIKHN0YXRlLT5CdWZmZXJbSTkxNV9ERVNUUkVHX1NSMl0pOworICAgICAgQURWQU5DRV9CQVRDSCgpOwogICAgfQogCiAgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9TVElQUExFKSB7Ci0gICAgICBpZiAoVkVSQk9TRSkgZnByaW50ZihzdGRlcnIsICJJOTE1X1VQTE9BRF9TVElQUExFOlxuIik7IAotICAgICAgZW1pdCggaTkxNSwgc3RhdGUtPlN0aXBwbGUsIHNpemVvZihzdGF0ZS0+U3RpcHBsZSkgKTsKKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NUQVRFKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJOTE1X1VQTE9BRF9TVElQUExFOlxuIik7CisgICAgICBlbWl0KGludGVsLCBzdGF0ZS0+U3RpcHBsZSwgc2l6ZW9mKHN0YXRlLT5TdGlwcGxlKSk7CiAgICB9CiAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX0ZPRykgewotICAgICAgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfRk9HOlxuIik7IAotICAgICAgZW1pdCggaTkxNSwgc3RhdGUtPkZvZywgc2l6ZW9mKHN0YXRlLT5Gb2cpICk7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfRk9HOlxuIik7CisgICAgICBlbWl0KGludGVsLCBzdGF0ZS0+Rm9nLCBzaXplb2Yoc3RhdGUtPkZvZykpOwogICAgfQogCiAgICAvKiBDb21iaW5lIGFsbCB0aGUgZGlydHkgdGV4dHVyZSBzdGF0ZSBpbnRvIGEgc2luZ2xlIGNvbW1hbmQgdG8KQEAgLTMyMywxNDEgKzQyMCwyMTkgQEAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWF9BTEwpIHsKICAgICAgIGludCBuciA9IDA7CiAKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBJOTE1X1RFWF9VTklUUzsgaSsrKSAKLQkgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYKGkpKSAKLQkgICAgbnIrKzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBJOTE1X1RFWF9VTklUUzsgaSsrKQorICAgICAgICAgaWYgKGRpcnR5ICYgSTkxNV9VUExPQURfVEVYKGkpKQorICAgICAgICAgICAgbnIrKzsKIAotICAgICAgQkVHSU5fQkFUQ0goMituciozKTsKLSAgICAgIE9VVF9CQVRDSChfM0RTVEFURV9NQVBfU1RBVEUgfCAoMypucikpOworICAgICAgQkVHSU5fQkFUQ0goMiArIG5yICogMywgSUdOT1JFX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goXzNEU1RBVEVfTUFQX1NUQVRFIHwgKDMgKiBucikpOwogICAgICAgT1VUX0JBVENIKChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWF9BTEwpID4+IEk5MTVfVVBMT0FEX1RFWF8wX1NISUZUKTsKLSAgICAgIGZvciAoaSA9IDAgOyBpIDwgSTkxNV9URVhfVU5JVFMgOyBpKyspCi0JIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWChpKSkgewotCSAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJOTE1X1RFWFJFR19NUzJdKTsKLQkgICAgT1VUX0JBVENIKHN0YXRlLT5UZXhbaV1bSTkxNV9URVhSRUdfTVMzXSk7Ci0JICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k5MTVfVEVYUkVHX01TNF0pOwotCSB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgSTkxNV9URVhfVU5JVFM7IGkrKykKKyAgICAgICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWChpKSkgeworCisgICAgICAgICAgICBpZiAoc3RhdGUtPnRleF9idWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgIE9VVF9SRUxPQyhzdGF0ZS0+dGV4X2J1ZmZlcltpXSwKKwkJCSBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+dGV4X29mZnNldFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAmaTkxNS0+bWV0YSkgeworICAgICAgICAgICAgICAgYXNzZXJ0KGkgPT0gMCk7CisgICAgICAgICAgICAgICBPVVRfQkFUQ0goMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+dGV4X29mZnNldFtpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k5MTVfVEVYUkVHX01TM10pOworICAgICAgICAgICAgT1VUX0JBVENIKHN0YXRlLT5UZXhbaV1bSTkxNV9URVhSRUdfTVM0XSk7CisgICAgICAgICB9CiAgICAgICBBRFZBTkNFX0JBVENIKCk7CiAKLSAgICAgIEJFR0lOX0JBVENIKDIrbnIqMyk7Ci0gICAgICBPVVRfQkFUQ0goXzNEU1RBVEVfU0FNUExFUl9TVEFURSB8ICgzKm5yKSk7CisgICAgICBCRUdJTl9CQVRDSCgyICsgbnIgKiAzLCBJR05PUkVfQ0xJUFJFQ1RTKTsKKyAgICAgIE9VVF9CQVRDSChfM0RTVEFURV9TQU1QTEVSX1NUQVRFIHwgKDMgKiBucikpOwogICAgICAgT1VUX0JBVENIKChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWF9BTEwpID4+IEk5MTVfVVBMT0FEX1RFWF8wX1NISUZUKTsKLSAgICAgIGZvciAoaSA9IDAgOyBpIDwgSTkxNV9URVhfVU5JVFMgOyBpKyspCi0JIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWChpKSkgewotCSAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJOTE1X1RFWFJFR19TUzJdKTsKLQkgICAgT1VUX0JBVENIKHN0YXRlLT5UZXhbaV1bSTkxNV9URVhSRUdfU1MzXSk7Ci0JICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k5MTVfVEVYUkVHX1NTNF0pOwotCSB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgSTkxNV9URVhfVU5JVFM7IGkrKykKKyAgICAgICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1RFWChpKSkgeworICAgICAgICAgICAgT1VUX0JBVENIKHN0YXRlLT5UZXhbaV1bSTkxNV9URVhSRUdfU1MyXSk7CisgICAgICAgICAgICBPVVRfQkFUQ0goc3RhdGUtPlRleFtpXVtJOTE1X1RFWFJFR19TUzNdKTsKKyAgICAgICAgICAgIE9VVF9CQVRDSChzdGF0ZS0+VGV4W2ldW0k5MTVfVEVYUkVHX1NTNF0pOworICAgICAgICAgfQogICAgICAgQURWQU5DRV9CQVRDSCgpOwogICAgfQogCiAgICBpZiAoZGlydHkgJiBJOTE1X1VQTE9BRF9DT05TVEFOVFMpIHsKLSAgICAgIGlmIChWRVJCT1NFKSBmcHJpbnRmKHN0ZGVyciwgIkk5MTVfVVBMT0FEX0NPTlNUQU5UUzpcbiIpOyAKLSAgICAgIGVtaXQoIGk5MTUsIHN0YXRlLT5Db25zdGFudCwgc3RhdGUtPkNvbnN0YW50U2l6ZSAqIHNpemVvZihHTHVpbnQpICk7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfQ09OU1RBTlRTOlxuIik7CisgICAgICBlbWl0KGludGVsLCBzdGF0ZS0+Q29uc3RhbnQsIHN0YXRlLT5Db25zdGFudFNpemUgKiBzaXplb2YoR0x1aW50KSk7CiAgICB9CiAKICAgIGlmIChkaXJ0eSAmIEk5MTVfVVBMT0FEX1BST0dSQU0pIHsKLSAgICAgIGlmIChWRVJCT1NFKSBmcHJpbnRmKHN0ZGVyciwgIkk5MTVfVVBMT0FEX1BST0dSQU06XG4iKTsgCisgICAgICBpZiAoc3RhdGUtPlByb2dyYW1TaXplKSB7CisgICAgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSTkxNV9VUExPQURfUFJPR1JBTTpcbiIpOwogCi0gICAgICBhc3NlcnQoKHN0YXRlLT5Qcm9ncmFtWzBdICYgMHgxZmYpKzIgPT0gc3RhdGUtPlByb2dyYW1TaXplKTsKLSAgICAgIAotICAgICAgZW1pdCggaTkxNSwgc3RhdGUtPlByb2dyYW0sIHN0YXRlLT5Qcm9ncmFtU2l6ZSAqIHNpemVvZihHTHVpbnQpICk7Ci0gICAgICBpZiAoVkVSQk9TRSkKLQkgaTkxNV9kaXNhc3NlbWJsZV9wcm9ncmFtKCBzdGF0ZS0+UHJvZ3JhbSwgc3RhdGUtPlByb2dyYW1TaXplICk7CisgICAgICAgICBhc3NlcnQoKHN0YXRlLT5Qcm9ncmFtWzBdICYgMHgxZmYpICsgMiA9PSBzdGF0ZS0+UHJvZ3JhbVNpemUpOworCisgICAgICAgICBlbWl0KGludGVsLCBzdGF0ZS0+UHJvZ3JhbSwgc3RhdGUtPlByb2dyYW1TaXplICogc2l6ZW9mKEdMdWludCkpOworICAgICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVEUpCisgICAgICAgICAgICBpOTE1X2Rpc2Fzc2VtYmxlX3Byb2dyYW0oc3RhdGUtPlByb2dyYW0sIHN0YXRlLT5Qcm9ncmFtU2l6ZSk7CisgICAgICB9CiAgICB9CiAKLSAgIHN0YXRlLT5lbWl0dGVkIHw9IGRpcnR5OwotICAgaW50ZWwtPmJhdGNoLmxhc3RfZW1pdF9zdGF0ZSA9IGNvdW50ZXI7Ci0gICBhc3NlcnQoY291bnRlciA9PSBpbnRlbC0+YmF0Y2guY291bnRlcik7CisgICBpbnRlbC0+YmF0Y2gtPmRpcnR5X3N0YXRlICY9IH5kaXJ0eTsKKyAgIGFzc2VydChnZXRfZGlydHkoc3RhdGUpID09IDApOworICAgYXNzZXJ0KChpbnRlbC0+YmF0Y2gtPmRpcnR5X3N0YXRlICYgKDE8PDEpKSA9PSAwKTsKIH0KIAotc3RhdGljIHZvaWQgaTkxNV9kZXN0cm95X2NvbnRleHQoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCitzdGF0aWMgdm9pZAoraTkxNV9kZXN0cm95X2NvbnRleHQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogeworICAgR0x1aW50IGk7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKworICAgZm9yIChpID0gMDsgaSA8IEk5MTVfVEVYX1VOSVRTOyBpKyspIHsKKyAgICAgIGlmIChpOTE1LT5zdGF0ZS50ZXhfYnVmZmVyW2ldICE9IE5VTEwpIHsKKwkgZHJpX2JvX3VucmVmZXJlbmNlKGk5MTUtPnN0YXRlLnRleF9idWZmZXJbaV0pOworCSBpOTE1LT5zdGF0ZS50ZXhfYnVmZmVyW2ldID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KKwogICAgX3RubF9mcmVlX3ZlcnRpY2VzKCZpbnRlbC0+Y3R4KTsKIH0KIAogCiAvKioKLSAqIFNldCB0aGUgY29sb3IgYnVmZmVyIGRyYXdpbmcgcmVnaW9uLgorICogU2V0IHRoZSBkcmF3aW5nIHJlZ2lvbnMgZm9yIHRoZSBjb2xvciBhbmQgZGVwdGgvc3RlbmNpbCBidWZmZXJzLgorICogVGhpcyBpbnZvbHZlcyBzZXR0aW5nIHRoZSBwaXRjaCwgY3BwIGFuZCBidWZmZXIgSUQvbG9jYXRpb24uCisgKiBBbHNvIHNldCBwaXhlbCBmb3JtYXQgZm9yIGNvbG9yIGFuZCBaIHJlbmRlcmluZworICogVXNlZCBmb3Igc2V0dGluZyBib3RoIHJlZ3VsYXIgYW5kIG1ldGEgc3RhdGUuCiAgKi8KK3ZvaWQKK2k5MTVfc3RhdGVfZHJhd19yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaTkxNV9od19zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmNvbG9yX3JlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVwdGhfcmVnaW9uKQoreworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBHTHVpbnQgdmFsdWU7CisKKyAgIEFTU0VSVChzdGF0ZSA9PSAmaTkxNS0+c3RhdGUgfHwgc3RhdGUgPT0gJmk5MTUtPm1ldGEpOworCisgICBpZiAoc3RhdGUtPmRyYXdfcmVnaW9uICE9IGNvbG9yX3JlZ2lvbikgeworICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJnN0YXRlLT5kcmF3X3JlZ2lvbik7CisgICAgICBpbnRlbF9yZWdpb25fcmVmZXJlbmNlKCZzdGF0ZS0+ZHJhd19yZWdpb24sIGNvbG9yX3JlZ2lvbik7CisgICB9CisgICBpZiAoc3RhdGUtPmRlcHRoX3JlZ2lvbiAhPSBkZXB0aF9yZWdpb24pIHsKKyAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKCZzdGF0ZS0+ZGVwdGhfcmVnaW9uKTsKKyAgICAgIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoJnN0YXRlLT5kZXB0aF9yZWdpb24sIGRlcHRoX3JlZ2lvbik7CisgICB9CisKKyAgIC8qCisgICAgKiBTZXQgc3RyaWRlL2NwcCB2YWx1ZXMKKyAgICAqLworICAgaWYgKGNvbG9yX3JlZ2lvbikgeworICAgICAgc3RhdGUtPkJ1ZmZlcltJOTE1X0RFU1RSRUdfQ0JVRkFERFIwXSA9IF8zRFNUQVRFX0JVRl9JTkZPX0NNRDsKKyAgICAgIHN0YXRlLT5CdWZmZXJbSTkxNV9ERVNUUkVHX0NCVUZBRERSMV0gPQorICAgICAgICAgKEJVRl8zRF9JRF9DT0xPUl9CQUNLIHwKKyAgICAgICAgICBCVUZfM0RfUElUQ0goY29sb3JfcmVnaW9uLT5waXRjaCAqIGNvbG9yX3JlZ2lvbi0+Y3BwKSB8CisgICAgICAgICAgQlVGXzNEX1VTRV9GRU5DRSk7CisgICB9CisKKyAgIGlmIChkZXB0aF9yZWdpb24pIHsKKyAgICAgIHN0YXRlLT5CdWZmZXJbSTkxNV9ERVNUUkVHX0RCVUZBRERSMF0gPSBfM0RTVEFURV9CVUZfSU5GT19DTUQ7CisgICAgICBzdGF0ZS0+QnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjFdID0KKyAgICAgICAgIChCVUZfM0RfSURfREVQVEggfAorICAgICAgICAgIEJVRl8zRF9QSVRDSChkZXB0aF9yZWdpb24tPnBpdGNoICogZGVwdGhfcmVnaW9uLT5jcHApIHwKKyAgICAgICAgICBCVUZfM0RfVVNFX0ZFTkNFKTsKKyAgIH0KKworICAgLyoKKyAgICAqIENvbXB1dGUvc2V0IEk5MTVfREVTVFJFR19EVjEgdmFsdWUKKyAgICAqLworICAgdmFsdWUgPSAoRFNUT1JHX0hPUlRfQklBUygweDgpIHwgICAgIC8qIC41ICovCisgICAgICAgICAgICBEU1RPUkdfVkVSVF9CSUFTKDB4OCkgfCAgICAgLyogLjUgKi8KKyAgICAgICAgICAgIExPRF9QUkVDTEFNUF9PR0wgfCBURVhfREVGQVVMVF9DT0xPUl9PR0wpOworICAgaWYgKGNvbG9yX3JlZ2lvbiAmJiBjb2xvcl9yZWdpb24tPmNwcCA9PSA0KSB7CisgICAgICB2YWx1ZSB8PSBEVl9QRl84ODg4OworICAgfQorICAgZWxzZSB7CisgICAgICB2YWx1ZSB8PSAoRElUSEVSX0ZVTExfQUxXQVlTIHwgRFZfUEZfNTY1KTsKKyAgIH0KKyAgIGlmIChkZXB0aF9yZWdpb24gJiYgZGVwdGhfcmVnaW9uLT5jcHAgPT0gNCkgeworICAgICAgdmFsdWUgfD0gREVQVEhfRlJNVF8yNF9GSVhFRF84X09USEVSOworICAgfQorICAgZWxzZSB7CisgICAgICB2YWx1ZSB8PSBERVBUSF9GUk1UXzE2X0ZJWEVEOworICAgfQorICAgc3RhdGUtPkJ1ZmZlcltJOTE1X0RFU1RSRUdfRFYxXSA9IHZhbHVlOworCisgICBJOTE1X1NUQVRFQ0hBTkdFKGk5MTUsIEk5MTVfVVBMT0FEX0JVRkZFUlMpOworfQorCisKIHN0YXRpYyB2b2lkCi1pOTE1X3NldF9jb2xvcl9yZWdpb24oIGludGVsQ29udGV4dFB0ciBpbnRlbCwgY29uc3QgaW50ZWxSZWdpb24gKnJlZ2lvbikKK2k5MTVfc2V0X2RyYXdfcmVnaW9uKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmNvbG9yX3JlZ2lvbnNbXSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlcHRoX3JlZ2lvbiwKKwkJICAgICBHTHVpbnQgbnVtX3JlZ2lvbnMpCiB7Ci0gICBpOTE1Q29udGV4dFB0ciBpOTE1ID0gSTkxNV9DT05URVhUKGludGVsKTsKLSAgIEk5MTVfU1RBVEVDSEFOR0UoIGk5MTUsIEk5MTVfVVBMT0FEX0JVRkZFUlMgKTsKLSAgIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfQ0JVRkFERFIxXSA9Ci0gICAgICAoQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCBCVUZfM0RfUElUQ0gocmVnaW9uLT5waXRjaCkgfCBCVUZfM0RfVVNFX0ZFTkNFKTsKLSAgIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfQ0JVRkFERFIyXSA9IHJlZ2lvbi0+b2Zmc2V0OworICAgc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSA9IGk5MTVfY29udGV4dCgmaW50ZWwtPmN0eCk7CisgICBpOTE1X3N0YXRlX2RyYXdfcmVnaW9uKGludGVsLCAmaTkxNS0+c3RhdGUsIGNvbG9yX3JlZ2lvbnNbMF0sIGRlcHRoX3JlZ2lvbik7CiB9CiAKIAotLyoqCi0gKiBzcGVjaWZ5IHRoZSB6LWJ1ZmZlci9zdGVuY2lsIHJlZ2lvbgotICovCisKIHN0YXRpYyB2b2lkCi1pOTE1X3NldF96X3JlZ2lvbiggaW50ZWxDb250ZXh0UHRyIGludGVsLCBjb25zdCBpbnRlbFJlZ2lvbiAqcmVnaW9uKQoraTkxNV9uZXdfYmF0Y2goc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChpbnRlbCk7Ci0gICBJOTE1X1NUQVRFQ0hBTkdFKCBpOTE1LCBJOTE1X1VQTE9BRF9CVUZGRVJTICk7Ci0gICBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX0RCVUZBRERSMV0gPQotICAgICAgKEJVRl8zRF9JRF9ERVBUSCB8IEJVRl8zRF9QSVRDSChyZWdpb24tPnBpdGNoKSB8IEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjJdID0gcmVnaW9uLT5vZmZzZXQ7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKworICAgLyogTWFyayBhbGwgc3RhdGUgYXMgbmVlZGluZyB0byBiZSBlbWl0dGVkIHdoZW4gc3RhcnRpbmcgYSBuZXcgYmF0Y2hidWZmZXIuCisgICAgKiBVc2luZyBoYXJkd2FyZSBjb250ZXh0cyB3b3VsZCBiZSBhbiBhbHRlcm5hdGl2ZSwgYnV0IHRoZXkgaGF2ZSBzb21lCisgICAgKiBkaWZmaWN1bHRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0gKHBoeXNpY2FsIGFkZHJlc3MgcmVxdWlyZW1lbnRzKS4KKyAgICAqLworICAgaTkxNS0+c3RhdGUuZW1pdHRlZCA9IDA7CisKKyAgIC8qIENoZWNrIHRoYXQgd2UgZGlkbid0IGp1c3Qgd3JhcCBvdXIgYmF0Y2hidWZmZXIgYXQgYSBiYWQgdGltZS4gKi8KKyAgIGFzc2VydCghaW50ZWwtPm5vX2JhdGNoX3dyYXApOwogfQogCitzdGF0aWMgR0x1aW50CitpOTE1X2ZsdXNoX2NtZCh2b2lkKQoreworICAgcmV0dXJuIE1JX0ZMVVNIIHwgRkxVU0hfTUFQX0NBQ0hFOworfQogCi0vKioKLSAqIFNldCBib3RoIHRoZSBjb2xvciBhbmQgWi9zdGVuY2lsIGRyYXdpbmcgcmVnaW9ucy4KLSAqIFNpbWlsYXIgdG8gdHdvIHByZXZpb3VzIGZ1bmN0aW9ucywgYnV0IGRvbid0IHVzZSBJOTE1X1NUQVRFQ0hBTkdFKCkKLSAqLworc3RhdGljIHZvaWQgCitpOTE1X2Fzc2VydF9ub3RfZGlydHkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCit7CisgICBzdHJ1Y3QgaTkxNV9jb250ZXh0ICppOTE1ID0gaTkxNV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgIHN0cnVjdCBpOTE1X2h3X3N0YXRlICpzdGF0ZSA9IGk5MTUtPmN1cnJlbnQ7CisgICBHTHVpbnQgZGlydHkgPSBnZXRfZGlydHkoc3RhdGUpOworICAgYXNzZXJ0KCFkaXJ0eSk7Cit9CisKIHN0YXRpYyB2b2lkCi1pOTE1X3VwZGF0ZV9jb2xvcl96X3JlZ2lvbnMoaW50ZWxDb250ZXh0UHRyIGludGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVsUmVnaW9uICpjb2xvclJlZ2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlbFJlZ2lvbiAqZGVwdGhSZWdpb24pCitpOTE1X25vdGVfdW5sb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQogewotICAgaTkxNUNvbnRleHRQdHIgaTkxNSA9IEk5MTVfQ09OVEVYVChpbnRlbCk7Ci0KLSAgIGk5MTUtPnN0YXRlLkJ1ZmZlcltJOTE1X0RFU1RSRUdfQ0JVRkFERFIxXSA9Ci0gICAgICAoQlVGXzNEX0lEX0NPTE9SX0JBQ0sgfCBCVUZfM0RfUElUQ0goY29sb3JSZWdpb24tPnBpdGNoKSB8IEJVRl8zRF9VU0VfRkVOQ0UpOwotICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19DQlVGQUREUjJdID0gY29sb3JSZWdpb24tPm9mZnNldDsKLQotICAgaTkxNS0+c3RhdGUuQnVmZmVyW0k5MTVfREVTVFJFR19EQlVGQUREUjFdID0KLSAgICAgIChCVUZfM0RfSURfREVQVEggfAotICAgICAgIEJVRl8zRF9QSVRDSChkZXB0aFJlZ2lvbi0+cGl0Y2gpIHwgIC8qIHBpdGNoIGluIGJ5dGVzICovCi0gICAgICAgQlVGXzNEX1VTRV9GRU5DRSk7Ci0gICBpOTE1LT5zdGF0ZS5CdWZmZXJbSTkxNV9ERVNUUkVHX0RCVUZBRERSMl0gPSBkZXB0aFJlZ2lvbi0+b2Zmc2V0OworICAgIC8qIG5vdGhpbmcgKi8KIH0KIAogCi1zdGF0aWMgdm9pZCBpOTE1X2xvc3RfaGFyZHdhcmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCit2b2lkCitpOTE1SW5pdFZ0Ymwoc3RydWN0IGk5MTVfY29udGV4dCAqaTkxNSkKIHsKLSAgIEk5MTVfQ09OVEVYVChpbnRlbCktPnN0YXRlLmVtaXR0ZWQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2VtaXRfZmx1c2goIGludGVsQ29udGV4dFB0ciBpbnRlbCApCi17Ci0gICBCQVRDSF9MT0NBTFM7Ci0KLSAgIEJFR0lOX0JBVENIKDIpOwotICAgT1VUX0JBVENIKCBNSV9GTFVTSCB8IEZMVVNIX01BUF9DQUNIRSB8IEZMVVNIX1JFTkRFUl9DQUNIRSApOyAKLSAgIE9VVF9CQVRDSCggMCApOwotICAgQURWQU5DRV9CQVRDSCgpOwotfQotCi0KLXZvaWQgaTkxNUluaXRWdGJsKCBpOTE1Q29udGV4dFB0ciBpOTE1ICkKLXsKLSAgIGk5MTUtPmludGVsLnZ0YmwuYWxsb2NfdGV4X29iaiA9IGk5MTVBbGxvY1RleE9iajsKICAgIGk5MTUtPmludGVsLnZ0YmwuY2hlY2tfdmVydGV4X3NpemUgPSBpOTE1X2NoZWNrX3ZlcnRleF9zaXplOwotICAgaTkxNS0+aW50ZWwudnRibC5jbGVhcl93aXRoX3RyaXMgPSBpOTE1Q2xlYXJXaXRoVHJpczsKLSAgIGk5MTUtPmludGVsLnZ0Ymwucm90YXRlX3dpbmRvdyA9IGk5MTVSb3RhdGVXaW5kb3c7CiAgICBpOTE1LT5pbnRlbC52dGJsLmRlc3Ryb3kgPSBpOTE1X2Rlc3Ryb3lfY29udGV4dDsKICAgIGk5MTUtPmludGVsLnZ0YmwuZW1pdF9zdGF0ZSA9IGk5MTVfZW1pdF9zdGF0ZTsKLSAgIGk5MTUtPmludGVsLnZ0YmwubG9zdF9oYXJkd2FyZSA9IGk5MTVfbG9zdF9oYXJkd2FyZTsKKyAgIGk5MTUtPmludGVsLnZ0YmwubmV3X2JhdGNoID0gaTkxNV9uZXdfYmF0Y2g7CiAgICBpOTE1LT5pbnRlbC52dGJsLnJlZHVjZWRfcHJpbWl0aXZlX3N0YXRlID0gaTkxNV9yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZTsKICAgIGk5MTUtPmludGVsLnZ0YmwucmVuZGVyX3N0YXJ0ID0gaTkxNV9yZW5kZXJfc3RhcnQ7Ci0gICBpOTE1LT5pbnRlbC52dGJsLnNldF9jb2xvcl9yZWdpb24gPSBpOTE1X3NldF9jb2xvcl9yZWdpb247Ci0gICBpOTE1LT5pbnRlbC52dGJsLnNldF96X3JlZ2lvbiA9IGk5MTVfc2V0X3pfcmVnaW9uOwotICAgaTkxNS0+aW50ZWwudnRibC51cGRhdGVfY29sb3Jfel9yZWdpb25zID0gaTkxNV91cGRhdGVfY29sb3Jfel9yZWdpb25zOworICAgaTkxNS0+aW50ZWwudnRibC5yZW5kZXJfcHJldmFsaWRhdGUgPSBpOTE1X3JlbmRlcl9wcmV2YWxpZGF0ZTsKKyAgIGk5MTUtPmludGVsLnZ0Ymwuc2V0X2RyYXdfcmVnaW9uID0gaTkxNV9zZXRfZHJhd19yZWdpb247CiAgICBpOTE1LT5pbnRlbC52dGJsLnVwZGF0ZV90ZXh0dXJlX3N0YXRlID0gaTkxNVVwZGF0ZVRleHR1cmVTdGF0ZTsKLSAgIGk5MTUtPmludGVsLnZ0YmwuZW1pdF9mbHVzaCA9IGk5MTVfZW1pdF9mbHVzaDsKKyAgIGk5MTUtPmludGVsLnZ0YmwuZmx1c2hfY21kID0gaTkxNV9mbHVzaF9jbWQ7CisgICBpOTE1LT5pbnRlbC52dGJsLmFzc2VydF9ub3RfZGlydHkgPSBpOTE1X2Fzc2VydF9ub3RfZGlydHk7CisgICBpOTE1LT5pbnRlbC52dGJsLm5vdGVfdW5sb2NrID0gaTkxNV9ub3RlX3VubG9jazsgCisgICBpOTE1LT5pbnRlbC52dGJsLmZpbmlzaF9iYXRjaCA9IGludGVsX2ZpbmlzaF92YjsKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9iYXRjaGJ1ZmZlci5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9iYXRjaGJ1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNiNDFiLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfYmF0Y2hidWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAiZW51bXMuaCIKLSNpbmNsdWRlICJ2YmxhbmsuaCIKLQotI2luY2x1ZGUgImludGVsX3JlZy5oIgotI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyB2b2lkIGludGVsX2ZpbGxfYm94KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkgICAgR0xzaG9ydCB4LCBHTHNob3J0IHksCi0JCQkgICAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQkgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiApCi17Ci0gICB4ICs9IGludGVsLT5kcmF3WDsKLSAgIHkgKz0gaW50ZWwtPmRyYXdZOwotCi0gICBpZiAoeCA+PSAwICYmIHkgPj0gMCAmJgotICAgICAgIHgrdyA8IGludGVsLT5pbnRlbFNjcmVlbi0+d2lkdGggJiYKLSAgICAgICB5K2ggPCBpbnRlbC0+aW50ZWxTY3JlZW4tPmhlaWdodCkKLSAgICAgIGludGVsRW1pdEZpbGxCbGl0TG9ja2VkKCBpbnRlbCwgCi0JCQkgICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT5jcHAsCi0JCQkgICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT5iYWNrLnBpdGNoLAotCQkJICAgICAgIGludGVsLT5pbnRlbFNjcmVlbi0+YmFjay5vZmZzZXQsCi0JCQkgICAgICAgeCwgeSwgdywgaCwKLQkJCSAgICAgICBJTlRFTF9QQUNLQ09MT1IoaW50ZWwtPmludGVsU2NyZWVuLT5mYkZvcm1hdCwKLQkJCQkJICAgICAgIHIsZyxiLDB4ZmYpKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfZHJhd19wZXJmb3JtYW5jZV9ib3hlcyggaW50ZWxDb250ZXh0UHRyIGludGVsICkKLXsKLSAgIC8qIFB1cnBsZSBib3ggZm9yIHBhZ2UgZmxpcHBpbmcKLSAgICAqLwotICAgaWYgKCBpbnRlbC0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX0ZMSVAgKSAKLSAgICAgIGludGVsX2ZpbGxfYm94KCBpbnRlbCwgNCwgNCwgOCwgOCwgMjU1LCAwLCAyNTUgKTsKLQotICAgLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50Ci0gICAgKi8KLSAgIGlmICggaW50ZWwtPnBlcmZfYm94ZXMgJiBJODMwX0JPWF9XQUlUICkgCi0gICAgICBpbnRlbF9maWxsX2JveCggaW50ZWwsIDE2LCA0LCA4LCA4LCAyNTUsIDAsIDAgKTsKLQotICAgLyogQmx1ZSBib3g6IGxvc3QgY29udGV4dD8KLSAgICAqLwotICAgaWYgKCBpbnRlbC0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX0xPU1RfQ09OVEVYVCApIAotICAgICAgaW50ZWxfZmlsbF9ib3goIGludGVsLCAyOCwgNCwgOCwgOCwgMCwgMCwgMjU1ICk7Ci0KLSAgIC8qIFllbGxvdyBib3ggZm9yIHRleHR1cmUgc3dhcHMKLSAgICAqLwotICAgaWYgKCBpbnRlbC0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1RFWFRVUkVfTE9BRCApIAotICAgICAgaW50ZWxfZmlsbF9ib3goIGludGVsLCA0MCwgNCwgOCwgOCwgMjU1LCAyNTUsIDAgKTsKLQotICAgLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCi0gICAgKi8KLSAgIGlmICggIShpbnRlbC0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX1JJTkdfRU1QVFkpICkgCi0gICAgICBpbnRlbF9maWxsX2JveCggaW50ZWwsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDAgKTsKLQotCi0gICAvKiBEcmF3IGJhcnMgaW5kaWNhdGluZyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgCi0gICAgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQotICAgICovCi0jaWYgMAotICAgaWYgKGludGVsLT5kbWFfdXNlZCkgewotICAgICAgaW50IGJhciA9IGludGVsLT5kbWFfdXNlZCAvIDEwMjQwOwotICAgICAgaWYgKGJhciA+IDEwMCkgYmFyID0gMTAwOwotICAgICAgaWYgKGJhciA8IDEpIGJhciA9IDE7Ci0gICAgICBpbnRlbF9maWxsX2JveCggaW50ZWwsIDQsIDE2LCBiYXIsIDQsIDE5NiwgMTI4LCAxMjggKTsKLSAgICAgIGludGVsLT5kbWFfdXNlZCA9IDA7Ci0gICB9Ci0jZW5kaWYKLQotICAgaW50ZWwtPnBlcmZfYm94ZXMgPSAwOwotfQotCi0KLQotCi0KLQotc3RhdGljIGludCBiYWRfcHJpbV92ZXJ0ZXhfbnIoIGludCBwcmltaXRpdmUsIGludCBuciApCi17Ci0gICBzd2l0Y2ggKHByaW1pdGl2ZSAmIFBSSU0zRF9NQVNLKSB7Ci0gICBjYXNlIFBSSU0zRF9QT0lOVExJU1Q6Ci0gICAgICByZXR1cm4gbnIgPCAxOwotICAgY2FzZSBQUklNM0RfTElORUxJU1Q6Ci0gICAgICByZXR1cm4gKG5yICYgMSkgfHwgbnIgPT0gMDsKLSAgIGNhc2UgUFJJTTNEX0xJTkVTVFJJUDoKLSAgICAgIHJldHVybiBuciA8IDI7Ci0gICBjYXNlIFBSSU0zRF9UUklMSVNUOgotICAgY2FzZSBQUklNM0RfUkVDVExJU1Q6Ci0gICAgICByZXR1cm4gbnIgJSAzIHx8IG5yID09IDA7Ci0gICBjYXNlIFBSSU0zRF9QT0xZOgotICAgY2FzZSBQUklNM0RfVFJJRkFOOgotICAgY2FzZSBQUklNM0RfVFJJU1RSSVA6Ci0gICBjYXNlIFBSSU0zRF9UUklTVFJJUF9SVlJTRToKLSAgICAgIHJldHVybiBuciA8IDM7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDE7Ci0gICB9CQotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9mbHVzaF9pbmxpbmVfcHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKCBjdHggKTsKLSAgIEdMdWludCB1c2VkID0gaW50ZWwtPmJhdGNoLnB0ciAtIGludGVsLT5wcmltLnN0YXJ0X3B0cjsKLSAgIEdMdWludCB2ZXJ0Y291bnQ7Ci0KLSAgIGFzc2VydChpbnRlbC0+cHJpbS5wcmltaXRpdmUgIT0gfjApOwotCi0gICBpZiAoMSkgewotICAgICAgLyogQ2hlY2sgdmVydGV4IHNpemUgYWdhaW5zdCB0aGUgdmVydGV4IHdlJ3JlIHNwZWNpZnlpbmcgdG8KLSAgICAgICAqIGhhcmR3YXJlLiAgSWYgaXQncyB3cm9uZywgZGl0Y2ggdGhlIHByaW1pdGl2ZS4KLSAgICAgICAqLyAKLSAgICAgIGlmICghaW50ZWwtPnZ0YmwuY2hlY2tfdmVydGV4X3NpemUoIGludGVsLCBpbnRlbC0+dmVydGV4X3NpemUgKSkgCi0JIGdvdG8gZG9fZGlzY2FyZDsKLQotICAgICAgdmVydGNvdW50ID0gKHVzZWQgLSA0KS8gKGludGVsLT52ZXJ0ZXhfc2l6ZSAqIDQpOwotCi0gICAgICBpZiAoIXZlcnRjb3VudCkKLQkgZ290byBkb19kaXNjYXJkOwotICAgICAgCi0gICAgICBpZiAodmVydGNvdW50ICogaW50ZWwtPnZlcnRleF9zaXplICogNCAhPSB1c2VkIC0gNCkgewotCSBmcHJpbnRmKHN0ZGVyciwgInZlcnRleCBzaXplIGNvbmZ1c2lvbiAlZCAlZFxuIiwgdXNlZCwgCi0JCSBpbnRlbC0+dmVydGV4X3NpemUgKiB2ZXJ0Y291bnQgKiA0KTsKLQkgZ290byBkb19kaXNjYXJkOwotICAgICAgfQotCi0gICAgICBpZiAoYmFkX3ByaW1fdmVydGV4X25yKCBpbnRlbC0+cHJpbS5wcmltaXRpdmUsIHZlcnRjb3VudCApKSB7Ci0JIGZwcmludGYoc3RkZXJyLCAiYmFkX3ByaW1fdmVydGV4X25yICV4ICVkXG4iLCBpbnRlbC0+cHJpbS5wcmltaXRpdmUsCi0JCSB2ZXJ0Y291bnQpOwotCSBnb3RvIGRvX2Rpc2NhcmQ7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmICh1c2VkIDwgOCkKLSAgICAgIGdvdG8gZG9fZGlzY2FyZDsKLQotICAgKihpbnQgKilpbnRlbC0+cHJpbS5zdGFydF9wdHIgPSAoXzNEUFJJTUlUSVZFIHwgCi0JCQkJICAgIGludGVsLT5wcmltLnByaW1pdGl2ZSB8Ci0JCQkJICAgICh1c2VkLzQtMikpOwotCi0gICBnb3RvIGZpbmlzaGVkOwotICAgCi0gZG9fZGlzY2FyZDoKLSAgIGludGVsLT5iYXRjaC5wdHIgLT0gdXNlZDsKLSAgIGludGVsLT5iYXRjaC5zcGFjZSArPSB1c2VkOwotICAgYXNzZXJ0KGludGVsLT5iYXRjaC5zcGFjZSA+PSAwKTsKLQotIGZpbmlzaGVkOgotICAgaW50ZWwtPnByaW0ucHJpbWl0aXZlID0gfjA7Ci0gICBpbnRlbC0+cHJpbS5zdGFydF9wdHIgPSAwOwotICAgaW50ZWwtPnByaW0uZmx1c2ggPSAwOwotfQotCi0KLS8qIEVtaXQgYSBwcmltaXRpdmUgcmVmZXJlbmNpbmcgdmVydGljZXMgaW4gYSB2ZXJ0ZXggYnVmZmVyLgotICovCi12b2lkIGludGVsU3RhcnRJbmxpbmVQcmltaXRpdmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0x1aW50IHByaW0gKQotewotICAgQkFUQ0hfTE9DQUxTOwotCi0gICBpZiAoMCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgcHJpbSk7Ci0KLQotICAgLyogRmluaXNoIGFueSBpbi1wcm9ncmVzcyBwcmltaXRpdmU6Ci0gICAgKi8KLSAgIElOVEVMX0ZJUkVWRVJUSUNFUyggaW50ZWwgKTsKLSAgIAotICAgLyogRW1pdCBvdXRzdGFuZGluZyBzdGF0ZToKLSAgICAqLwotICAgaW50ZWwtPnZ0YmwuZW1pdF9zdGF0ZSggaW50ZWwgKTsKLSAgIAotICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWUgc3BhY2UgaW4gdGhpcyBidWZmZXI6Ci0gICAgKi8KLSAgIGlmIChpbnRlbC0+dmVydGV4X3NpemUgKiAxMCAqIHNpemVvZihHTHVpbnQpID49IGludGVsLT5iYXRjaC5zcGFjZSkgewotICAgICAgaW50ZWxGbHVzaEJhdGNoKGludGVsLCBHTF9UUlVFKTsgCi0gICAgICBpbnRlbC0+dnRibC5lbWl0X3N0YXRlKCBpbnRlbCApOwotICAgfQotCi0jaWYgMQotICAgaWYgKCgodW5zaWduZWQgbG9uZylpbnRlbC0+YmF0Y2gucHRyKSAmIDB4NCkgewotICAgICAgQkVHSU5fQkFUQ0goMSk7Ci0gICAgICBPVVRfQkFUQ0goMCk7Ci0gICAgICBBRFZBTkNFX0JBVENIKCk7Ci0gICB9Ci0jZW5kaWYKLQotICAgLyogRW1pdCBhIHNsb3Qgd2hpY2ggd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgaW5saW5lIHByaW1pdGl2ZQotICAgICogY29tbWFuZCBsYXRlci4KLSAgICAqLwotICAgQkVHSU5fQkFUQ0goMik7Ci0gICBPVVRfQkFUQ0goIDAgKTsKLQotICAgaW50ZWwtPnByaW0uc3RhcnRfcHRyID0gYmF0Y2hfcHRyOwotICAgaW50ZWwtPnByaW0ucHJpbWl0aXZlID0gcHJpbTsKLSAgIGludGVsLT5wcmltLmZsdXNoID0gaW50ZWxfZmx1c2hfaW5saW5lX3ByaW1pdGl2ZTsKLSAgIGludGVsLT5iYXRjaC5jb250YWluc19nZW9tZXRyeSA9IDE7Ci0KLSAgIE9VVF9CQVRDSCggMCApOwotICAgQURWQU5DRV9CQVRDSCgpOwotfQotCi0KLXZvaWQgaW50ZWxSZXN0YXJ0SW5saW5lUHJpbWl0aXZlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQotewotICAgR0x1aW50IHByaW0gPSBpbnRlbC0+cHJpbS5wcmltaXRpdmU7Ci0KLSAgIGludGVsX2ZsdXNoX2lubGluZV9wcmltaXRpdmUoICZpbnRlbC0+Y3R4ICk7Ci0gICBpZiAoMSkgaW50ZWxGbHVzaEJhdGNoKGludGVsLCBHTF9UUlVFKTsgLyogR0xfVFJVRSAtIGlzIGNyaXRpY2FsICovCi0gICBpbnRlbFN0YXJ0SW5saW5lUHJpbWl0aXZlKCBpbnRlbCwgcHJpbSApOwotfQotCi0KLQotdm9pZCBpbnRlbFdyYXBJbmxpbmVQcmltaXRpdmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCi17Ci0gICBHTHVpbnQgcHJpbSA9IGludGVsLT5wcmltLnByaW1pdGl2ZTsKLQotICAgaWYgKDApCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgaW50ZWxfZmx1c2hfaW5saW5lX3ByaW1pdGl2ZSggJmludGVsLT5jdHggKTsKLSAgIGludGVsRmx1c2hCYXRjaChpbnRlbCwgR0xfVFJVRSk7Ci0gICBpbnRlbFN0YXJ0SW5saW5lUHJpbWl0aXZlKCBpbnRlbCwgcHJpbSApOwotfQotCi0KLS8qIEVtaXQgYSBwcmltaXRpdmUgd2l0aCBzcGFjZSBmb3IgaW5saW5lIHZlcnRpY2VzLgotICovCi1HTHVpbnQgKmludGVsRW1pdElubGluZVByaW1pdGl2ZUxvY2tlZChpbnRlbENvbnRleHRQdHIgaW50ZWwsIAotCQkJCSAgICAgICBpbnQgcHJpbWl0aXZlLAotCQkJCSAgICAgICBpbnQgZHdvcmRzLAotCQkJCSAgICAgICBpbnQgdmVydGV4X3NpemUgKQotewotICAgR0x1aW50ICp0bXAgPSAwOwotICAgQkFUQ0hfTE9DQUxTOwotCi0gICBpZiAoMCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgMHgleCAlZFxuIiwgX19GVU5DVElPTl9fLCBwcmltaXRpdmUsIGR3b3Jkcyk7Ci0KLSAgIC8qIEVtaXQgb3V0c3RhbmRpbmcgc3RhdGU6Ci0gICAgKi8KLSAgIGludGVsLT52dGJsLmVtaXRfc3RhdGUoIGludGVsICk7Ci0KLSAgIGlmICgoMStkd29yZHMpKjQgPj0gaW50ZWwtPmJhdGNoLnNwYWNlKSB7Ci0gICAgICBpbnRlbEZsdXNoQmF0Y2goaW50ZWwsIEdMX1RSVUUpOyAKLSAgICAgIGludGVsLT52dGJsLmVtaXRfc3RhdGUoIGludGVsICk7Ci0gICB9Ci0KLQotICAgaWYgKDEpIHsKLSAgICAgIGludCB1c2VkID0gZHdvcmRzICogNDsKLSAgICAgIGludCB2ZXJ0Y291bnQ7Ci0KLSAgICAgIC8qIENoZWNrIHZlcnRleCBzaXplIGFnYWluc3QgdGhlIHZlcnRleCB3ZSdyZSBzcGVjaWZ5aW5nIHRvCi0gICAgICAgKiBoYXJkd2FyZS4gIElmIGl0J3Mgd3JvbmcsIGRpdGNoIHRoZSBwcmltaXRpdmUuCi0gICAgICAgKi8gCi0gICAgICBpZiAoIWludGVsLT52dGJsLmNoZWNrX3ZlcnRleF9zaXplKCBpbnRlbCwgdmVydGV4X3NpemUgKSkgCi0JIGdvdG8gZG9fZGlzY2FyZDsKLQotICAgICAgdmVydGNvdW50ID0gZHdvcmRzIC8gdmVydGV4X3NpemU7Ci0gICAgICAKLSAgICAgIGlmIChkd29yZHMgJSB2ZXJ0ZXhfc2l6ZSkgewotCSBmcHJpbnRmKHN0ZGVyciwgImRpZCBub3QgcmVxdWVzdCBhIHdob2xlIG51bWJlciBvZiB2ZXJ0aWNlc1xuIik7Ci0JIGdvdG8gZG9fZGlzY2FyZDsKLSAgICAgIH0KLQotICAgICAgaWYgKGJhZF9wcmltX3ZlcnRleF9uciggcHJpbWl0aXZlLCB2ZXJ0Y291bnQgKSkgewotCSBmcHJpbnRmKHN0ZGVyciwgImJhZF9wcmltX3ZlcnRleF9uciAleCAlZFxuIiwgcHJpbWl0aXZlLCB2ZXJ0Y291bnQpOwotCSBnb3RvIGRvX2Rpc2NhcmQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1c2VkIDwgOCkKLQkgZ290byBkb19kaXNjYXJkOwotICAgfQotCi0gICAvKiBFbWl0IDNEX1BSSU1JVElWRSBjb21tYW5kczoKLSAgICAqLwotICAgQkVHSU5fQkFUQ0goMSArIGR3b3Jkcyk7Ci0gICBPVVRfQkFUQ0goIF8zRFBSSU1JVElWRSB8IAotCSAgICAgIHByaW1pdGl2ZSB8Ci0JICAgICAgKGR3b3Jkcy0xKSApOwotCi0gICB0bXAgPSAoR0x1aW50ICopYmF0Y2hfcHRyOwotICAgYmF0Y2hfcHRyICs9IGR3b3JkcyAqIDQ7Ci0KLSAgIEFEVkFOQ0VfQkFUQ0goKTsKLQotICAgaW50ZWwtPmJhdGNoLmNvbnRhaW5zX2dlb21ldHJ5ID0gMTsKLQotIGRvX2Rpc2NhcmQ6Ci0gICByZXR1cm4gdG1wOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsV2FpdEZvckZyYW1lQ29tcGxldGlvbiggaW50ZWxDb250ZXh0UHRyIGludGVsICkKLXsKLSAgZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWEgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKWludGVsLT5zYXJlYTsKLQotICAgaWYgKGludGVsLT5kb19pcnFzKSB7Ci0gICAgICBpZiAoaW50ZWxHZXRMYXN0RnJhbWUoaW50ZWwpIDwgc2FyZWEtPmxhc3RfZGlzcGF0Y2gpIHsKLQkgaWYgKCFpbnRlbC0+aXJxc0VtaXR0ZWQpIHsKLQkgICAgd2hpbGUgKGludGVsR2V0TGFzdEZyYW1lIChpbnRlbCkgPCBzYXJlYS0+bGFzdF9kaXNwYXRjaCkKLQkgICAgICAgOwotCSB9Ci0JIGVsc2UgewotCSAgICBpbnRlbFdhaXRJcnEoIGludGVsLCBpbnRlbC0+YWxsb2MuaXJxX2VtaXR0ZWQgKTsJCi0JIH0KLQkgaW50ZWwtPmlycXNFbWl0dGVkID0gMTA7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnRlbC0+aXJxc0VtaXR0ZWQpIHsKLQkgTE9DS19IQVJEV0FSRSggaW50ZWwgKTsgCi0JIGludGVsRW1pdElycUxvY2tlZCggaW50ZWwgKTsKLQkgaW50ZWwtPmlycXNFbWl0dGVkLS07Ci0JIFVOTE9DS19IQVJEV0FSRSggaW50ZWwgKTsgCi0gICAgICB9Ci0gICB9IAotICAgZWxzZSB7Ci0gICAgICB3aGlsZSAoaW50ZWxHZXRMYXN0RnJhbWUgKGludGVsKSA8IHNhcmVhLT5sYXN0X2Rpc3BhdGNoKSB7Ci0JIGlmIChpbnRlbC0+ZG9fdXNsZWVwcykgCi0JICAgIERPX1VTTEVFUCggMSApOwotICAgICAgfQotICAgfQotfQotCi0vKgotICogQ29weSB0aGUgYmFjayBidWZmZXIgdG8gdGhlIGZyb250IGJ1ZmZlci4gCi0gKi8KLXZvaWQgaW50ZWxDb3B5QnVmZmVyKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0JCSAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdAkgKnJlY3QpCi17Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWw7Ci0gICBjb25zdCBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuOwotICAgR0xib29sZWFuICAgbWlzc2VkX3RhcmdldDsKLSAgIGludDY0X3QgdXN0OwotCi0gICBpZiAoMCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGFzc2VydChkUHJpdik7Ci0gICBhc3NlcnQoZFByaXYtPmRyaUNvbnRleHRQcml2KTsKLSAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpOwotCi0gICBpbnRlbCA9IChpbnRlbENvbnRleHRQdHIpIGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQotICAgaW50ZWxGbHVzaCggJmludGVsLT5jdHggKTsKLSAgIAotICAgaW50ZWxTY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47Ci0KLSAgIGlmICghcmVjdCAmJiAhaW50ZWwtPnN3YXBfc2NoZWR1bGVkICYmIGludGVsU2NyZWVuLT5kcm1NaW5vciA+PSA2ICYmCi0gICAgICAgIShpbnRlbC0+dmJsYW5rX2ZsYWdzICYgVkJMQU5LX0ZMQUdfTk9fSVJRKSAmJgotICAgICAgIGludGVsU2NyZWVuLT5jdXJyZW50X3JvdGF0aW9uID09IDApIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnRlcnZhbCA9IGRyaUdldFZCbGFua0ludGVydmFsKGRQcml2LCBpbnRlbC0+dmJsYW5rX2ZsYWdzKTsKLSAgICAgIHVuc2lnbmVkIGludCB0YXJnZXQ7Ci0gICAgICBkcm1faTkxNV92Ymxhbmtfc3dhcF90IHN3YXA7Ci0KLSAgICAgIHN3YXAuZHJhd2FibGUgPSBkUHJpdi0+aEhXRHJhd2FibGU7Ci0gICAgICBzd2FwLnNlcXR5cGUgPSBEUk1fVkJMQU5LX0FCU09MVVRFOwotICAgICAgdGFyZ2V0ID0gc3dhcC5zZXF1ZW5jZSA9IGludGVsLT52Ymxfc2VxICsgaW50ZXJ2YWw7Ci0KLSAgICAgIGlmIChpbnRlbC0+dmJsYW5rX2ZsYWdzICYgVkJMQU5LX0ZMQUdfU1lOQykgewotCSBzd2FwLnNlcXR5cGUgfD0gRFJNX1ZCTEFOS19ORVhUT05NSVNTOwotICAgICAgfSBlbHNlIGlmIChpbnRlcnZhbCA9PSAwKSB7Ci0JIGdvdG8gbm9zY2hlZHVsZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBpbnRlbC0+dmJsYW5rX2ZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkgewotCSBzd2FwLnNlcXR5cGUgfD0gRFJNX1ZCTEFOS19TRUNPTkRBUlk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZHJtQ29tbWFuZFdyaXRlUmVhZChpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X1ZCTEFOS19TV0FQLCAmc3dhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzd2FwKSkpIHsKLSAgICAgICAgaW50ZWwtPnN3YXBfc2NoZWR1bGVkID0gMTsKLSAgICAgICAgaW50ZWwtPnZibF9zZXEgPSBzd2FwLnNlcXVlbmNlOwotICAgICAgICBzd2FwLnNlcXVlbmNlIC09IHRhcmdldDsKLSAgICAgICAgbWlzc2VkX3RhcmdldCA9IHN3YXAuc2VxdWVuY2UgPiAwICYmIHN3YXAuc2VxdWVuY2UgPD0gKDEgPDwgMjMpOwotICAgICAgfQotICAgfSBlbHNlIHsKLSAgICAgIGludGVsLT5zd2FwX3NjaGVkdWxlZCA9IDA7Ci0gICB9Ci1ub3NjaGVkdWxlOgotCi0gICBpZiAoIWludGVsLT5zd2FwX3NjaGVkdWxlZCkgewotICAgICAgaW50ZWxXYWl0Rm9yRnJhbWVDb21wbGV0aW9uKCBpbnRlbCApOwotICAgICAgTE9DS19IQVJEV0FSRSggaW50ZWwgKTsKLQotICAgICAgaWYgKCFyZWN0KQotICAgICAgewotCSBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0JIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmaW50ZWwtPnZibF9zZXEsIGludGVsLT52YmxhbmtfZmxhZ3MsICYgbWlzc2VkX3RhcmdldCApOwotCSBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgICAgfQotICAgICAgewotCSBjb25zdCBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOwotCSBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0JIGNvbnN0IGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKLQkgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gZFByaXYtPnBDbGlwUmVjdHM7Ci0JIGRybV9jbGlwX3JlY3RfdCBib3g7Ci0JIGNvbnN0IGludCBjcHAgPSBpbnRlbFNjcmVlbi0+Y3BwOwotCSBjb25zdCBpbnQgcGl0Y2ggPSBpbnRlbFNjcmVlbi0+ZnJvbnQucGl0Y2g7IC8qIGluIGJ5dGVzICovCi0JIGludCBpOwotCSBHTHVpbnQgQ01ELCBCUjEzOwotCSBCQVRDSF9MT0NBTFM7Ci0KLQkgc3dpdGNoKGNwcCkgewotCSBjYXNlIDI6IAotCSAgICBCUjEzID0gKHBpdGNoKSB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCk7Ci0JICAgIENNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQ7Ci0JICAgIGJyZWFrOwotCSBjYXNlIDQ6Ci0JICAgIEJSMTMgPSAocGl0Y2gpIHwgKDB4Q0MgPDwgMTYpIHwgKDE8PDI0KSB8ICgxPDwyNSk7Ci0JICAgIENNRCA9IChYWV9TUkNfQ09QWV9CTFRfQ01EIHwgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBIHwKLQkJICAgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQik7Ci0JICAgIGJyZWFrOwotCSBkZWZhdWx0OgotCSAgICBCUjEzID0gKHBpdGNoKSB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCk7Ci0JICAgIENNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQ7Ci0JICAgIGJyZWFrOwotCSB9Ci0gICAKLQkgaWYgKDApIAotCSAgICBpbnRlbF9kcmF3X3BlcmZvcm1hbmNlX2JveGVzKCBpbnRlbCApOwotCi0JIGZvciAoaSA9IDAgOyBpIDwgbmJveDsgaSsrLCBwYm94KyspIAotCSB7Ci0JICAgIGlmIChwYm94LT54MSA+IHBib3gtPngyIHx8Ci0JCXBib3gtPnkxID4gcGJveC0+eTIgfHwKLQkJcGJveC0+eDIgPiBpbnRlbFNjcmVlbi0+d2lkdGggfHwKLQkJcGJveC0+eTIgPiBpbnRlbFNjcmVlbi0+aGVpZ2h0KSB7Ci0JICAgICAgIF9tZXNhX3dhcm5pbmcoJmludGVsLT5jdHgsICJCYWQgY2xpcHJlY3QgaW4gaW50ZWxDb3B5QnVmZmVyKCkiKTsKLQkgICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgICBib3ggPSAqcGJveDsKLQotCSAgICBpZiAocmVjdCkKLQkgICAgewotCSAgICAgICBpZiAocmVjdC0+eDEgPiBib3gueDEpCi0JCSAgYm94LngxID0gcmVjdC0+eDE7Ci0JICAgICAgIGlmIChyZWN0LT55MSA+IGJveC55MSkKLQkJICBib3gueTEgPSByZWN0LT55MTsKLQkgICAgICAgaWYgKHJlY3QtPngyIDwgYm94LngyKQotCQkgIGJveC54MiA9IHJlY3QtPngyOwotCSAgICAgICBpZiAocmVjdC0+eTIgPCBib3gueTIpCi0JCSAgYm94LnkyID0gcmVjdC0+eTI7Ci0KLQkgICAgICAgaWYgKGJveC54MSA+IGJveC54MiB8fCBib3gueTEgPiBib3gueTIpCi0JCSAgY29udGludWU7Ci0JICAgIH0KLQotCSAgICBCRUdJTl9CQVRDSCggOCk7Ci0JICAgIE9VVF9CQVRDSCggQ01EICk7Ci0JICAgIE9VVF9CQVRDSCggQlIxMyApOwotCSAgICBPVVRfQkFUQ0goIChib3gueTEgPDwgMTYpIHwgYm94LngxICk7Ci0JICAgIE9VVF9CQVRDSCggKGJveC55MiA8PCAxNikgfCBib3gueDIgKTsKLQotCSAgICBpZiAoaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPT0gMCkgCi0JICAgICAgIE9VVF9CQVRDSCggaW50ZWxTY3JlZW4tPmZyb250Lm9mZnNldCApOwotCSAgICBlbHNlCi0JICAgICAgIE9VVF9CQVRDSCggaW50ZWxTY3JlZW4tPmJhY2sub2Zmc2V0ICk7CQkJCi0KLQkgICAgT1VUX0JBVENIKCAoYm94LnkxIDw8IDE2KSB8IGJveC54MSApOwotCSAgICBPVVRfQkFUQ0goIEJSMTMgJiAweGZmZmYgKTsKLQotCSAgICBpZiAoaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPT0gMCkgCi0JICAgICAgIE9VVF9CQVRDSCggaW50ZWxTY3JlZW4tPmJhY2sub2Zmc2V0ICk7CQkJCi0JICAgIGVsc2UKLQkgICAgICAgT1VUX0JBVENIKCBpbnRlbFNjcmVlbi0+ZnJvbnQub2Zmc2V0ICk7Ci0KLQkgICAgQURWQU5DRV9CQVRDSCgpOwotCSB9Ci0gICAgICB9Ci0gICAgICBpbnRlbEZsdXNoQmF0Y2hMb2NrZWQoIGludGVsLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFICk7Ci0gICAgICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICB9Ci0KLSAgIGlmICghcmVjdCkKLSAgIHsKLSAgICAgICBpbnRlbC0+c3dhcF9jb3VudCsrOwotICAgICAgICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSgmdXN0KTsKLSAgICAgICBpZiAobWlzc2VkX3RhcmdldCkgewotCSAgIGludGVsLT5zd2FwX21pc3NlZF9jb3VudCsrOwotCSAgIGludGVsLT5zd2FwX21pc3NlZF91c3QgPSB1c3QgLSAgaW50ZWwtPnN3YXBfdXN0OwotICAgICAgIH0KLSAgIAotICAgICAgIGludGVsLT5zd2FwX3VzdCA9IHVzdDsKLSAgIH0KLX0KLQotCi0KLQotdm9pZCBpbnRlbEVtaXRGaWxsQmxpdExvY2tlZCggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJICAgICAgR0x1aW50IGNwcCwKLQkJCSAgICAgIEdMc2hvcnQgZHN0X3BpdGNoLCAgLyogaW4gYnl0ZXMgKi8KLQkJCSAgICAgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJICAgICAgR0xzaG9ydCB4LCBHTHNob3J0IHksIAotCQkJICAgICAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQkgICAgICBHTHVpbnQgY29sb3IgKQotewotICAgR0x1aW50IEJSMTMsIENNRDsKLSAgIEJBVENIX0xPQ0FMUzsKLQotICAgc3dpdGNoKGNwcCkgewotICAgY2FzZSAxOiAKLSAgIGNhc2UgMjogCi0gICBjYXNlIDM6IAotICAgICAgQlIxMyA9IGRzdF9waXRjaCB8ICgweEYwIDw8IDE2KSB8ICgxPDwyNCk7Ci0gICAgICBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDQ6Ci0gICAgICBCUjEzID0gZHN0X3BpdGNoIHwgKDB4RjAgPDwgMTYpIHwgKDE8PDI0KSB8ICgxPDwyNSk7Ci0gICAgICBDTUQgPSAoWFlfQ09MT1JfQkxUX0NNRCB8IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQSB8Ci0JICAgICBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgQkVHSU5fQkFUQ0goIDYpOwotICAgT1VUX0JBVENIKCBDTUQgKTsKLSAgIE9VVF9CQVRDSCggQlIxMyApOwotICAgT1VUX0JBVENIKCAoeSA8PCAxNikgfCB4ICk7Ci0gICBPVVRfQkFUQ0goICgoeStoKSA8PCAxNikgfCAoeCt3KSApOwotICAgT1VUX0JBVENIKCBkc3Rfb2Zmc2V0ICk7Ci0gICBPVVRfQkFUQ0goIGNvbG9yICk7Ci0gICBBRFZBTkNFX0JBVENIKCk7Ci19Ci0KLQotLyogQ29weSBCaXRCbHQKLSAqLwotdm9pZCBpbnRlbEVtaXRDb3B5QmxpdExvY2tlZCggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJICAgICAgR0x1aW50IGNwcCwKLQkJCSAgICAgIEdMc2hvcnQgc3JjX3BpdGNoLAotCQkJICAgICAgR0x1aW50ICBzcmNfb2Zmc2V0LAotCQkJICAgICAgR0xzaG9ydCBkc3RfcGl0Y2gsCi0JCQkgICAgICBHTHVpbnQgIGRzdF9vZmZzZXQsCi0JCQkgICAgICBHTHNob3J0IHNyY194LCBHTHNob3J0IHNyY195LAotCQkJICAgICAgR0xzaG9ydCBkc3RfeCwgR0xzaG9ydCBkc3RfeSwKLQkJCSAgICAgIEdMc2hvcnQgdywgR0xzaG9ydCBoICkKLXsKLSAgIEdMdWludCBDTUQsIEJSMTM7Ci0gICBpbnQgZHN0X3kyID0gZHN0X3kgKyBoOwotICAgaW50IGRzdF94MiA9IGRzdF94ICsgdzsKLSAgIEJBVENIX0xPQ0FMUzsKLQotICAgc3JjX3BpdGNoICo9IGNwcDsKLSAgIGRzdF9waXRjaCAqPSBjcHA7Ci0KLSAgIHN3aXRjaChjcHApIHsKLSAgIGNhc2UgMTogCi0gICBjYXNlIDI6IAotICAgY2FzZSAzOiAKLSAgICAgIEJSMTMgPSBkc3RfcGl0Y2ggfCAoMHhDQyA8PCAxNikgfCAoMTw8MjQpOwotICAgICAgQ01EID0gWFlfU1JDX0NPUFlfQkxUX0NNRDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSA0OgotICAgICAgQlIxMyA9IGRzdF9waXRjaCB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCkgfCAoMTw8MjUpOwotICAgICAgQ01EID0gKFhZX1NSQ19DT1BZX0JMVF9DTUQgfCBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgfAotCSAgICAgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQik7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChkc3RfeTIgPCBkc3RfeSB8fAotICAgICAgIGRzdF94MiA8IGRzdF94KSB7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIEJFR0lOX0JBVENIKCAxMik7Ci0gICBPVVRfQkFUQ0goIENNRCApOwotICAgT1VUX0JBVENIKCBCUjEzICk7Ci0gICBPVVRfQkFUQ0goIChkc3RfeSA8PCAxNikgfCBkc3RfeCApOwotICAgT1VUX0JBVENIKCAoZHN0X3kyIDw8IDE2KSB8IGRzdF94MiApOwotICAgT1VUX0JBVENIKCBkc3Rfb2Zmc2V0ICk7CQotICAgT1VUX0JBVENIKCAoc3JjX3kgPDwgMTYpIHwgc3JjX3ggKTsKLSAgIE9VVF9CQVRDSCggc3JjX3BpdGNoICk7Ci0gICBPVVRfQkFUQ0goIHNyY19vZmZzZXQgKTsgCi0gICBBRFZBTkNFX0JBVENIKCk7Ci19Ci0KLQotCi12b2lkIGludGVsQ2xlYXJXaXRoQmxpdChHTGNvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBidWZmZXJzLCBHTGJvb2xlYW4gYWxsRm9vLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgY3gxRm9vLCBHTGludCBjeTFGb28sIEdMaW50IGN3Rm9vLCBHTGludCBjaEZvbykKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoIGN0eCApOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLSAgIEdMdWludCBjbGVhcl9kZXB0aCwgY2xlYXJfY29sb3I7Ci0gICBHTGludCBjeCwgY3ksIGN3LCBjaDsKLSAgIEdMYm9vbGVhbiBhbGw7Ci0gICBHTGludCBwaXRjaDsKLSAgIEdMaW50IGNwcCA9IGludGVsU2NyZWVuLT5jcHA7Ci0gICBHTGludCBpOwotICAgR0x1aW50IEJSMTMsIENNRCwgRF9DTUQ7Ci0gICBCQVRDSF9MT0NBTFM7Ci0KLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotCi0gICAvKiBnZXQgY2xlYXIgYm91bmRzIGFmdGVyIGxvY2tpbmcgKi8KLSAgIGN4ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1pbjsKLSAgIGN5ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWW1pbjsKLSAgIGN3ID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fWG1heCAtIGN4OwotICAgY2ggPSBpbnRlbC0+Y3R4LkRyYXdCdWZmZXItPl9ZbWF4IC0gY3k7Ci0gICBhbGwgPSAoY3cgPT0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5XaWR0aCAmJgotICAgICAgICAgIGNoID09IGludGVsLT5jdHguRHJhd0J1ZmZlci0+SGVpZ2h0KTsKLQotICAgcGl0Y2ggPSBpbnRlbFNjcmVlbi0+ZnJvbnQucGl0Y2g7Ci0KLSAgIGNsZWFyX2NvbG9yID0gaW50ZWwtPkNsZWFyQ29sb3I7Ci0gICBjbGVhcl9kZXB0aCA9IDA7Ci0KLSAgIGlmIChidWZmZXJzICYgQlVGRkVSX0JJVF9ERVBUSCkgewotICAgICAgY2xlYXJfZGVwdGggPSAoR0x1aW50KShjdHgtPkRlcHRoLkNsZWFyICogaW50ZWwtPkNsZWFyRGVwdGgpOwotICAgfQotCi0gICBpZiAoYnVmZmVycyAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgewotICAgICAgY2xlYXJfZGVwdGggfD0gKGN0eC0+U3RlbmNpbC5DbGVhciAmIDB4ZmYpIDw8IDI0OwotICAgfQotCi0gICBzd2l0Y2goY3BwKSB7Ci0gICBjYXNlIDI6IAotICAgICAgQlIxMyA9ICgweEYwIDw8IDE2KSB8IChwaXRjaCkgfCAoMTw8MjQpOwotICAgICAgRF9DTUQgPSBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDQ6Ci0gICAgICBCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoKSB8ICgxPDwyNCkgfCAoMTw8MjUpOwotICAgICAgQ01EID0gKFhZX0NPTE9SX0JMVF9DTUQgfAotCSAgICAgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBIHwgCi0JICAgICBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKLSAgICAgIERfQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKLSAgICAgIGlmIChidWZmZXJzICYgQlVGRkVSX0JJVF9ERVBUSCkgRF9DTUQgfD0gWFlfQ09MT1JfQkxUX1dSSVRFX1JHQjsKLSAgICAgIGlmIChidWZmZXJzICYgQlVGRkVSX0JJVF9TVEVOQ0lMKSBEX0NNRCB8PSBYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEE7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBCUjEzID0gKDB4RjAgPDwgMTYpIHwgKHBpdGNoKSB8ICgxPDwyNCk7Ci0gICAgICBEX0NNRCA9IENNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgewotICAgICAgLyogZmxpcCB0b3AgdG8gYm90dG9tICovCi0gICAgICBjeSA9IGludGVsLT5kcmlEcmF3YWJsZS0+aCAtIGN5IC0gY2g7Ci0gICAgICBjeCA9IGN4ICsgaW50ZWwtPmRyYXdYOwotICAgICAgY3kgKz0gaW50ZWwtPmRyYXdZOwotCi0gICAgICAvKiBhZGp1c3QgZm9yIHBhZ2UgZmxpcHBpbmcgKi8KLSAgICAgIGlmICggaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPT0gMSApIHsKLQkgR0x1aW50IHRtcCA9IGJ1ZmZlcnM7Ci0KLQkgYnVmZmVycyAmPSB+KEJVRkZFUl9CSVRfRlJPTlRfTEVGVCB8IEJVRkZFUl9CSVRfQkFDS19MRUZUKTsKLQkgaWYgKCB0bXAgJiBCVUZGRVJfQklUX0ZST05UX0xFRlQgKSBidWZmZXJzIHw9IEJVRkZFUl9CSVRfQkFDS19MRUZUOwotCSBpZiAoIHRtcCAmIEJVRkZFUl9CSVRfQkFDS19MRUZUICkgIGJ1ZmZlcnMgfD0gQlVGRkVSX0JJVF9GUk9OVF9MRUZUOwotICAgICAgfQotCi0gICAgICBmb3IgKGkgPSAwIDsgaSA8IGludGVsLT5udW1DbGlwUmVjdHMgOyBpKyspIAotICAgICAgeyAJIAotCSBkcm1fY2xpcF9yZWN0X3QgKmJveCA9ICZpbnRlbC0+cENsaXBSZWN0c1tpXTsJIAotCSBkcm1fY2xpcF9yZWN0X3QgYjsKLQotCSBpZiAoIWFsbCkgewotCSAgICBHTGludCB4ID0gYm94LT54MTsKLQkgICAgR0xpbnQgeSA9IGJveC0+eTE7Ci0JICAgIEdMaW50IHcgPSBib3gtPngyIC0geDsKLQkgICAgR0xpbnQgaCA9IGJveC0+eTIgLSB5OwotCi0JICAgIGlmICh4IDwgY3gpIHcgLT0gY3ggLSB4LCB4ID0gY3g7IAotCSAgICBpZiAoeSA8IGN5KSBoIC09IGN5IC0geSwgeSA9IGN5OwotCSAgICBpZiAoeCArIHcgPiBjeCArIGN3KSB3ID0gY3ggKyBjdyAtIHg7Ci0JICAgIGlmICh5ICsgaCA+IGN5ICsgY2gpIGggPSBjeSArIGNoIC0geTsKLQkgICAgaWYgKHcgPD0gMCkgY29udGludWU7Ci0JICAgIGlmIChoIDw9IDApIGNvbnRpbnVlOwotCi0JICAgIGIueDEgPSB4OwotCSAgICBiLnkxID0geTsKLQkgICAgYi54MiA9IHggKyB3OwotCSAgICBiLnkyID0geSArIGg7ICAgICAgCi0JIH0gZWxzZSB7Ci0JICAgIGIgPSAqYm94OwotCSB9Ci0KLQotCSBpZiAoYi54MSA+IGIueDIgfHwKLQkgICAgIGIueTEgPiBiLnkyIHx8Ci0JICAgICBiLngyID4gaW50ZWxTY3JlZW4tPndpZHRoIHx8Ci0JICAgICBiLnkyID4gaW50ZWxTY3JlZW4tPmhlaWdodCkKLQkgICAgY29udGludWU7Ci0KLQkgaWYgKCBidWZmZXJzICYgQlVGRkVSX0JJVF9GUk9OVF9MRUZUICkgewkgICAgCi0JICAgIEJFR0lOX0JBVENIKCA2KTsJICAgIAotCSAgICBPVVRfQkFUQ0goIENNRCApOwotCSAgICBPVVRfQkFUQ0goIEJSMTMgKTsKLQkgICAgT1VUX0JBVENIKCAoYi55MSA8PCAxNikgfCBiLngxICk7Ci0JICAgIE9VVF9CQVRDSCggKGIueTIgPDwgMTYpIHwgYi54MiApOwotCSAgICBPVVRfQkFUQ0goIGludGVsU2NyZWVuLT5mcm9udC5vZmZzZXQgKTsKLQkgICAgT1VUX0JBVENIKCBjbGVhcl9jb2xvciApOwotCSAgICBBRFZBTkNFX0JBVENIKCk7Ci0JIH0KLQotCSBpZiAoIGJ1ZmZlcnMgJiBCVUZGRVJfQklUX0JBQ0tfTEVGVCApIHsKLQkgICAgQkVHSU5fQkFUQ0goIDYpOyAKLQkgICAgT1VUX0JBVENIKCBDTUQgKTsKLQkgICAgT1VUX0JBVENIKCBCUjEzICk7Ci0JICAgIE9VVF9CQVRDSCggKGIueTEgPDwgMTYpIHwgYi54MSApOwotCSAgICBPVVRfQkFUQ0goIChiLnkyIDw8IDE2KSB8IGIueDIgKTsKLQkgICAgT1VUX0JBVENIKCBpbnRlbFNjcmVlbi0+YmFjay5vZmZzZXQgKTsKLQkgICAgT1VUX0JBVENIKCBjbGVhcl9jb2xvciApOwotCSAgICBBRFZBTkNFX0JBVENIKCk7Ci0JIH0KLQotCSBpZiAoIGJ1ZmZlcnMgJiAoQlVGRkVSX0JJVF9TVEVOQ0lMIHwgQlVGRkVSX0JJVF9ERVBUSCkgKSB7Ci0JICAgIEJFR0lOX0JBVENIKCA2KTsKLQkgICAgT1VUX0JBVENIKCBEX0NNRCApOwotCSAgICBPVVRfQkFUQ0goIEJSMTMgKTsKLQkgICAgT1VUX0JBVENIKCAoYi55MSA8PCAxNikgfCBiLngxICk7Ci0JICAgIE9VVF9CQVRDSCggKGIueTIgPDwgMTYpIHwgYi54MiApOwotCSAgICBPVVRfQkFUQ0goIGludGVsU2NyZWVuLT5kZXB0aC5vZmZzZXQgKTsKLQkgICAgT1VUX0JBVENIKCBjbGVhcl9kZXB0aCApOwotCSAgICBBRFZBTkNFX0JBVENIKCk7Ci0JIH0gICAgICAKLSAgICAgIH0KLSAgIH0KLSAgIGludGVsRmx1c2hCYXRjaExvY2tlZCggaW50ZWwsIEdMX1RSVUUsIEdMX0ZBTFNFLCBHTF9UUlVFICk7Ci0gICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci19Ci0KLQotCi0KLXZvaWQgaW50ZWxEZXN0cm95QmF0Y2hCdWZmZXIoIEdMY29udGV4dCAqY3R4ICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLQotICAgaWYgKGludGVsLT5hbGxvYy5vZmZzZXQpIHsKLSAgICAgIGludGVsRnJlZUFHUCggaW50ZWwsIGludGVsLT5hbGxvYy5wdHIgKTsKLSAgICAgIGludGVsLT5hbGxvYy5wdHIgPSBOVUxMOwotICAgICAgaW50ZWwtPmFsbG9jLm9mZnNldCA9IDA7Ci0gICB9Ci0gICBlbHNlIGlmIChpbnRlbC0+YWxsb2MucHRyKSB7Ci0gICAgICBmcmVlKGludGVsLT5hbGxvYy5wdHIpOwotICAgICAgaW50ZWwtPmFsbG9jLnB0ciA9IE5VTEw7Ci0gICB9Ci0KLSAgIG1lbXNldCgmaW50ZWwtPmJhdGNoLCAwLCBzaXplb2YoaW50ZWwtPmJhdGNoKSk7Ci19Ci0KLQotdm9pZCBpbnRlbEluaXRCYXRjaEJ1ZmZlciggR0xjb250ZXh0ICpjdHggKQotewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOwotCi0gICAvKiBUaGlzIHBhdGggaXNuJ3QgcmVhbGx5IHNhZmUgd2l0aCByb3RhdGU6Ci0gICAgKi8KLSAgIGlmIChnZXRlbnYoIklOVEVMX0JBVENIIikgJiYgaW50ZWwtPmludGVsU2NyZWVuLT5hbGxvd19iYXRjaGJ1ZmZlcikgeyAgICAgIAotICAgICAgc3dpdGNoIChpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSB7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k4NjVfRzoKLQkgLyogSFcgYnVnPyAgU2VlbXMgdG8gY3Jhc2ggaWYgYmF0Y2hidWZmZXIgY3Jvc3NlcyA0ayBib3VuZGFyeS4KLQkgICovCi0JIGludGVsLT5hbGxvYy5zaXplID0gOCAqIDEwMjQ7IAotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JIC8qIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGFtb3VudCBvZiBtZW1vcnkgdGhlIGtlcm5lbCBkZWFscyB3aXRoLgotCSAgKiBXZSdkIGlkZWFsbHkgbGlrZSB0byBtYWtlIHRoaXMgc21hbGxlci4KLQkgICovCi0JIGludGVsLT5hbGxvYy5zaXplID0gMSA8PCBpbnRlbC0+aW50ZWxTY3JlZW4tPmxvZ1RleHR1cmVHcmFudWxhcml0eTsKLQkgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGludGVsLT5hbGxvYy5wdHIgPSBpbnRlbEFsbG9jYXRlQUdQKCBpbnRlbCwgaW50ZWwtPmFsbG9jLnNpemUgKTsKLSAgICAgIGlmIChpbnRlbC0+YWxsb2MucHRyKQotCSBpbnRlbC0+YWxsb2Mub2Zmc2V0ID0gCi0JICAgIGludGVsQWdwT2Zmc2V0RnJvbVZpcnR1YWwoIGludGVsLCBpbnRlbC0+YWxsb2MucHRyICk7Ci0gICAgICBlbHNlCi0gICAgICAgICBpbnRlbC0+YWxsb2Mub2Zmc2V0ID0gMDsgLyogT0s/ICovCi0gICB9Ci0KLSAgIC8qIFRoZSBkZWZhdWx0IGlzIG5vdyB0byB1c2UgYSBsb2NhbCBidWZmZXIgYW5kIHBhc3MgdGhhdCB0byB0aGUKLSAgICAqIGtlcm5lbC4gIFRoaXMgaXMgYWxzbyBhIGZhbGxiYWNrIGlmIGFsbG9jYXRpb24gZmFpbHMgb24gdGhlCi0gICAgKiBhYm92ZSBwYXRoOgotICAgICovCi0gICBpZiAoIWludGVsLT5hbGxvYy5wdHIpIHsKLSAgICAgIGludGVsLT5hbGxvYy5zaXplID0gOCAqIDEwMjQ7Ci0gICAgICBpbnRlbC0+YWxsb2MucHRyID0gbWFsbG9jKCBpbnRlbC0+YWxsb2Muc2l6ZSApOwotICAgICAgaW50ZWwtPmFsbG9jLm9mZnNldCA9IDA7Ci0gICB9Ci0KLSAgIGFzc2VydChpbnRlbC0+YWxsb2MucHRyKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfYmF0Y2hidWZmZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfYmF0Y2hidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kMzhjZGYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9iYXRjaGJ1ZmZlci5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX2JhdGNoYnVmZmVyLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2JhdGNoYnVmZmVyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2JhdGNoYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2QwNzEuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9iYXRjaGJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5URUxfQkFUQ0hCVUZGRVJfSAotI2RlZmluZSBJTlRFTF9CQVRDSEJVRkZFUl9ICi0KLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKLQotCi0jZGVmaW5lIEJBVENIX0xPQ0FMUwlHTHVieXRlICpiYXRjaF9wdHI7Ci0KLS8qICNkZWZpbmUgVkVSQk9TRSAwICovCi0jaWZuZGVmIFZFUkJPU0UKLWV4dGVybiBpbnQgVkVSQk9TRTsKLSNlbmRpZgotCi0KLSNkZWZpbmUgQkVHSU5fQkFUQ0gobikJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgIGlmIChWRVJCT1NFKSBmcHJpbnRmKHN0ZGVyciwgCQkJCQlcCi0JCQkiQkVHSU5fQkFUQ0goJWxkKSBpbiAlcywgJWQgZHdvcmRzIGZyZWVcbiIsCVwKLQkJCSgodW5zaWduZWQgbG9uZyluKSwgX19GVU5DVElPTl9fLAkJXAotCQkJaW50ZWwtPmJhdGNoLnNwYWNlLzQpOwkJCQlcCi0gICBpZiAoaW50ZWwtPmJhdGNoLnNwYWNlIDwgKG4pKjQpCQkJCQlcCi0gICAgICBpbnRlbEZsdXNoQmF0Y2goaW50ZWwsIEdMX1RSVUUpOwkJCQkJXAotICAgaWYgKGludGVsLT5iYXRjaC5zcGFjZSA9PSBpbnRlbC0+YmF0Y2guc2l6ZSkJaW50ZWwtPmJhdGNoLmZ1bmMgPSBfX0ZVTkNUSU9OX187CQkJXAotICAgYmF0Y2hfcHRyID0gaW50ZWwtPmJhdGNoLnB0cjsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgT1VUX0JBVENIKG4pCQkJCQlcCi1kbyB7CQkJCQkJCVwKLSAgICooR0x1aW50ICopYmF0Y2hfcHRyID0gKG4pOwkJCQlcCi0gICBpZiAoVkVSQk9TRSkgZnByaW50ZihzdGRlcnIsICIgLS0gJTA4eCBhdCAlcy8lZFxuIiwgKG4pLCBfX0ZJTEVfXywgX19MSU5FX18pOwlcCi0gICBiYXRjaF9wdHIgKz0gNDsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQURWQU5DRV9CQVRDSCgpCQkJCQkJXAotZG8gewkJCQkJCQkJXAotICAgaWYgKFZFUkJPU0UpIGZwcmludGYoc3RkZXJyLCAiQURWQU5DRV9CQVRDSCgpXG4iKTsJCVwKLSAgIGludGVsLT5iYXRjaC5zcGFjZSAtPSAoYmF0Y2hfcHRyIC0gaW50ZWwtPmJhdGNoLnB0cik7CVwKLSAgIGludGVsLT5iYXRjaC5wdHIgPSBiYXRjaF9wdHI7CQkJCVwKLSAgIGFzc2VydChpbnRlbC0+YmF0Y2guc3BhY2UgPj0gMCk7CQkJCVwKLX0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgaW50ZWxJbml0QmF0Y2hCdWZmZXIoIEdMY29udGV4dCAqY3R4ICk7Ci1leHRlcm4gdm9pZCBpbnRlbERlc3Ryb3lCYXRjaEJ1ZmZlciggR0xjb250ZXh0ICpjdHggKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxTdGFydElubGluZVByaW1pdGl2ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLCBHTHVpbnQgcHJpbSApOwotZXh0ZXJuIHZvaWQgaW50ZWxXcmFwSW5saW5lUHJpbWl0aXZlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKTsKLWV4dGVybiB2b2lkIGludGVsUmVzdGFydElubGluZVByaW1pdGl2ZSggaW50ZWxDb250ZXh0UHRyIGludGVsICk7Ci1leHRlcm4gR0x1aW50ICppbnRlbEVtaXRJbmxpbmVQcmltaXRpdmVMb2NrZWQoaW50ZWxDb250ZXh0UHRyIGludGVsLCAKLQkJCQkJICAgICAgaW50IHByaW1pdGl2ZSwgaW50IGR3b3JkcywKLQkJCQkJICAgICAgaW50IHZlcnRleF9zaXplKTsKLWV4dGVybiB2b2lkIGludGVsQ29weUJ1ZmZlciggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRwcml2LAotCQkJICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QJKnJlY3QpOwotZXh0ZXJuIHZvaWQgaW50ZWxDbGVhcldpdGhCbGl0KEdMY29udGV4dCAqY3R4LCBHTGJpdGZpZWxkIG1hc2ssIEdMYm9vbGVhbiBhbGwsCi0JCQkgICAgIEdMaW50IGN4MSwgR0xpbnQgY3kxLCBHTGludCBjdywgR0xpbnQgY2gpOwotCi1leHRlcm4gdm9pZCBpbnRlbEVtaXRDb3B5QmxpdExvY2tlZCggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCSAgICAgR0x1aW50IGNwcCwKLQkJCQkgICAgIEdMc2hvcnQgc3JjX3BpdGNoLAotCQkJCSAgICAgR0x1aW50ICBzcmNfb2Zmc2V0LAotCQkJCSAgICAgR0xzaG9ydCBkc3RfcGl0Y2gsCi0JCQkJICAgICBHTHVpbnQgIGRzdF9vZmZzZXQsCi0JCQkJICAgICBHTHNob3J0IHNyY3gsIEdMc2hvcnQgc3JjeSwKLQkJCQkgICAgIEdMc2hvcnQgZHN0eCwgR0xzaG9ydCBkc3R5LAotCQkJCSAgICAgR0xzaG9ydCB3LCBHTHNob3J0IGggKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxFbWl0RmlsbEJsaXRMb2NrZWQoIGludGVsQ29udGV4dFB0ciBpbnRlbCwKLQkJCQkgICAgIEdMdWludCBjcHAsCi0JCQkJICAgICBHTHNob3J0IGRzdF9waXRjaCwKLQkJCQkgICAgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJCSAgICAgR0xzaG9ydCB4LCBHTHNob3J0IHksIAotCQkJCSAgICAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQkJICAgICBHTHVpbnQgY29sb3IgKTsKLQotCi0KLQotc3RhdGljIF9faW5saW5lIEdMdWludCAqaW50ZWxFeHRlbmRJbmxpbmVQcmltaXRpdmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgCi0JCQkJCQlHTHVpbnQgZHdvcmRzICkKLXsKLSAgIEdMdWludCBzeiA9IGR3b3JkcyAqIHNpemVvZihHTHVpbnQpOwotICAgR0x1aW50ICpwdHI7Ci0KLSAgIGlmIChpbnRlbC0+YmF0Y2guc3BhY2UgPCBzeikgewotICAgICAgaW50ZWxXcmFwSW5saW5lUHJpbWl0aXZlKCBpbnRlbCApOwotLyogICAgICAgYXNzZXJ0KGludGVsLT5iYXRjaC5zcGFjZSA+PSBzeik7ICovCi0gICB9Ci0KLS8qICAgIGFzc2VydChpbnRlbC0+cHJpbS5wcmltaXRpdmUgIT0gfjApOyAqLwotICAgcHRyID0gKEdMdWludCAqKWludGVsLT5iYXRjaC5wdHI7Ci0gICBpbnRlbC0+YmF0Y2gucHRyICs9IHN6OwotICAgaW50ZWwtPmJhdGNoLnNwYWNlIC09IHN6OwotCi0gICByZXR1cm4gcHRyOwotfQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2JsaXQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfYmxpdC5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmRkNmM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2JsaXQuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9ibGl0LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTA2ZGQzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfYnVmZmVyX29iamVjdHMuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9idWZmZXJfb2JqZWN0cy5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9idWZmZXJzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2J1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jODZkYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9idWZmZXJzLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfYnVmZmVycy5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2NvbnRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjMjNmMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2NvbnRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDc3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLSNpbmNsdWRlICJzaW1wbGVfbGlzdC5oIgotI2luY2x1ZGUgImV4dGVuc2lvbnMuaCIKLSNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJwb2ludHMuaCIKLQotI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKLSNpbmNsdWRlICJzd3Jhc3Rfc2V0dXAvc3dyYXN0X3NldHVwLmgiCi0jaW5jbHVkZSAidG5sL3RubC5oIgotI2luY2x1ZGUgInZiby92Ym8uaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAidG5sL3RfdmVydGV4LmgiCi0KLSNpbmNsdWRlICJkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCi0KLSNpbmNsdWRlICJpODMwX2RyaS5oIgotI2luY2x1ZGUgImk4MzBfY29tbW9uLmgiCi0KLSNpbmNsdWRlICJpbnRlbF90ZXguaCIKLSNpbmNsdWRlICJpbnRlbF9zcGFuLmgiCi0jaW5jbHVkZSAiaW50ZWxfdHJpcy5oIgotI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0jaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKLQotI2luY2x1ZGUgInZibGFuay5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0jaW5jbHVkZSAieG1scG9vbC5oIiAvKiBmb3Igc3ltYm9saWMgdmFsdWVzIG9mIGVudW0tdHlwZSBvcHRpb25zICovCi0jaWZuZGVmIElOVEVMX0RFQlVHCi1pbnQgSU5URUxfREVCVUcgPSAoMCk7Ci0jZW5kaWYKLQotI2RlZmluZSBuZWVkX0dMX0FSQl9tdWx0aXNhbXBsZQotI2RlZmluZSBuZWVkX0dMX0FSQl9wb2ludF9wYXJhbWV0ZXJzCi0jZGVmaW5lIG5lZWRfR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24KLSNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKLSNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X3Byb2dyYW0KLSNkZWZpbmUgbmVlZF9HTF9BUkJfd2luZG93X3BvcwotI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9jb2xvcgotI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQotI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlCi0jZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX21pbm1heAotI2RlZmluZSBuZWVkX0dMX0VYVF9jdWxsX3ZlcnRleAotI2RlZmluZSBuZWVkX0dMX0VYVF9mb2dfY29vcmQKLSNkZWZpbmUgbmVlZF9HTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKLSNkZWZpbmUgbmVlZF9HTF9FWFRfc2Vjb25kYXJ5X2NvbG9yCi0jZGVmaW5lIG5lZWRfR0xfTlZfdmVydGV4X3Byb2dyYW0KLSNpbmNsdWRlICJleHRlbnNpb25faGVscGVyLmgiCi0KLSNpZm5kZWYgVkVSQk9TRQotaW50IFZFUkJPU0UgPSAwOwotI2VuZGlmCi0KLSNpZiBERUJVR19MT0NLSU5HCi1jaGFyICpwcmV2TG9ja0ZpbGU7Ci1pbnQgcHJldkxvY2tMaW5lOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1lc2EncyBEcml2ZXIgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIERSSVZFUl9EQVRFICIyMDA2MTAxNyIKLQotY29uc3QgR0x1Ynl0ZSAqaW50ZWxHZXRTdHJpbmcoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gbmFtZSApCi17Ci0gICBjb25zdCBjaGFyICogY2hpcHNldDsKLSAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMjhdOwotCi0gICBzd2l0Y2ggKG5hbWUpIHsKLSAgIGNhc2UgR0xfVkVORE9SOgotICAgICAgcmV0dXJuIChHTHVieXRlICopIlR1bmdzdGVuIEdyYXBoaWNzLCBJbmMiOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgIGNhc2UgR0xfUkVOREVSRVI6Ci0gICAgICBzd2l0Y2ggKElOVEVMX0NPTlRFWFQoY3R4KS0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSB7Ci0gICAgICBjYXNlIFBDSV9DSElQXzg0NV9HOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIDg0NUciOyBicmVhazsKLSAgICAgIGNhc2UgUENJX0NISVBfSTgzMF9NOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIDgzME0iOyBicmVhazsKLSAgICAgIGNhc2UgUENJX0NISVBfSTg1NV9HTToKLQkgY2hpcHNldCA9ICJJbnRlbChSKSA4NTJHTS84NTVHTSI7IGJyZWFrOwotICAgICAgY2FzZSBQQ0lfQ0hJUF9JODY1X0c6Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgODY1RyI7IGJyZWFrOwotICAgICAgY2FzZSBQQ0lfQ0hJUF9JOTE1X0c6Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgOTE1RyI7IGJyZWFrOwotICAgICAgY2FzZSBQQ0lfQ0hJUF9JOTE1X0dNOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIDkxNUdNIjsgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NDVfRzoKLQkgY2hpcHNldCA9ICJJbnRlbChSKSA5NDVHIjsgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NDVfR006Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgOTQ1R00iOyBicmVhazsKLSAgICAgIGNhc2UgUENJX0NISVBfSTk0NV9HTUU6Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgOTQ1R01FIjsgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0czM19HOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIEczMyI7IGJyZWFrOwotICAgICAgY2FzZSBQQ0lfQ0hJUF9RMzVfRzoKLQkgY2hpcHNldCA9ICJJbnRlbChSKSBRMzUiOyBicmVhazsKLSAgICAgIGNhc2UgUENJX0NISVBfUTMzX0c6Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgUTMzIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBjaGlwc2V0ID0gIlVua25vd24gSW50ZWwgQ2hpcHNldCI7IGJyZWFrOwotICAgICAgfQotCi0gICAgICAodm9pZCkgZHJpR2V0UmVuZGVyZXJTdHJpbmcoIGJ1ZmZlciwgY2hpcHNldCwgRFJJVkVSX0RBVEUsIDAgKTsKLSAgICAgIHJldHVybiAoR0x1Ynl0ZSAqKSBidWZmZXI7Ci0KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLX0KLQotCi0vKioKLSAqIEV4dGVuc2lvbiBzdHJpbmdzIGV4cG9ydGVkIGJ5IHRoZSBpbnRlbCBkcml2ZXIuCi0gKgotICogXG5vdGUKLSAqIEl0IGFwcGVhcnMgdGhhdCBBUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgaGFzICJkaXNhcHBlYXJlZCIgY29tcGFyZWQgdG8gdGhlCi0gKiBvbGQgaTgzMC1zcGVjaWZpYyBkcml2ZXIuCi0gKi8KLWNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNhcmRfZXh0ZW5zaW9uc1tdID0KLXsKLSAgICB7ICJHTF9BUkJfbXVsdGlzYW1wbGUiLCAgICAgICAgICAgICAgICBHTF9BUkJfbXVsdGlzYW1wbGVfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfQVJCX211bHRpdGV4dHVyZSIsICAgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzIiwgICAgICAgICAgIEdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcCIsICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiIsICAgICAgICBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9BUkJfdGV4dHVyZV9jdWJlX21hcCIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3RleHR1cmVfZW52X2FkZCIsICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lIiwgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdGV4dHVyZV9lbnZfZG90MyIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IiwgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSIsICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QiLCAgICAgICBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3RfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwgICAgICAgICAgICAgR0xfQVJCX3ZlcnRleF9wcm9ncmFtX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0FSQl93aW5kb3dfcG9zIiwgICAgICAgICAgICAgICAgIEdMX0FSQl93aW5kb3dfcG9zX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9ibGVuZF9jb2xvciIsICAgICAgICAgICAgICAgIEdMX0VYVF9ibGVuZF9jb2xvcl9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUiLCAgICBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGVfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUiLCAgICAgICAgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGVfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX2JsZW5kX21pbm1heCIsICAgICAgICAgICAgICAgR0xfRVhUX2JsZW5kX21pbm1heF9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfYmxlbmRfc3VidHJhY3QiLCAgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX2N1bGxfdmVydGV4IiwgICAgICAgICAgICAgICAgR0xfRVhUX2N1bGxfdmVydGV4X2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9mb2dfY29vcmQiLCAgICAgICAgICAgICAgICAgIEdMX0VYVF9mb2dfY29vcmRfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzIiwgICAgICAgICAgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9zZWNvbmRhcnlfY29sb3IiLCAgICAgICAgICAgIEdMX0VYVF9zZWNvbmRhcnlfY29sb3JfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX3N0ZW5jaWxfd3JhcCIsICAgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0VYVF90ZXh0dXJlX2VkZ2VfY2xhbXAiLCAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSIsICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX3RleHR1cmVfZW52X2RvdDMiLCAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIsIE5VTEwgfSwKLSAgICB7ICJHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEiLCAgTlVMTCB9LAotICAgIHsgIkdMX0FQUExFX2NsaWVudF9zdG9yYWdlIiwgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9NRVNBX3BhY2tfaW52ZXJ0IiwgICAgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfTUVTQV95Y2Jjcl90ZXh0dXJlIiwgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX05WX2JsZW5kX3NxdWFyZSIsICAgICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9OVl92ZXJ0ZXhfcHJvZ3JhbSIsICAgICAgICAgICAgICBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbV9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTFfMSIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAiLCAgICAgICAgICAgTlVMTCB9LAotICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgfQotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0bmxfcGlwZWxpbmVfc3RhZ2UgX2ludGVsX3JlbmRlcl9zdGFnZTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0bmxfcGlwZWxpbmVfc3RhZ2UgKmludGVsX3BpcGVsaW5lW10gPSB7Ci0gICAmX3RubF92ZXJ0ZXhfdHJhbnNmb3JtX3N0YWdlLAotICAgJl90bmxfdmVydGV4X2N1bGxfc3RhZ2UsCi0gICAmX3RubF9ub3JtYWxfdHJhbnNmb3JtX3N0YWdlLAotICAgJl90bmxfbGlnaHRpbmdfc3RhZ2UsCi0gICAmX3RubF9mb2dfY29vcmRpbmF0ZV9zdGFnZSwKLSAgICZfdG5sX3RleGdlbl9zdGFnZSwKLSAgICZfdG5sX3RleHR1cmVfdHJhbnNmb3JtX3N0YWdlLAotICAgJl90bmxfcG9pbnRfYXR0ZW51YXRpb25fc3RhZ2UsCi0gICAmX3RubF92ZXJ0ZXhfcHJvZ3JhbV9zdGFnZSwKLSNpZiAxCi0gICAmX2ludGVsX3JlbmRlcl9zdGFnZSwgICAgIC8qIEFERDogdW5jbGlwcGVkIHJhc3RlcnNldHVwLXRvLWRtYSAqLwotI2VuZGlmCi0gICAmX3RubF9yZW5kZXJfc3RhZ2UsCi0gICAwLAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9kZWJ1Z19jb250cm9sIGRlYnVnX2NvbnRyb2xbXSA9Ci17Ci0gICAgeyAiZmFsbCIsICBERUJVR19GQUxMQkFDS1MgfSwKLSAgICB7ICJ0ZXgiLCAgIERFQlVHX1RFWFRVUkUgfSwKLSAgICB7ICJpb2N0bCIsIERFQlVHX0lPQ1RMIH0sCi0gICAgeyAicHJpbSIsICBERUJVR19QUklNUyB9LAotICAgIHsgInZlcnQiLCAgREVCVUdfVkVSVFMgfSwKLSAgICB7ICJzdGF0ZSIsIERFQlVHX1NUQVRFIH0sCi0gICAgeyAidmVyYiIsICBERUJVR19WRVJCT1NFIH0sCi0gICAgeyAiZHJpIiwgICBERUJVR19EUkkgfSwKLSAgICB7ICJkbWEiLCAgIERFQlVHX0RNQSB9LAotICAgIHsgInNhbiIsICAgREVCVUdfU0FOSVRZIH0sCi0gICAgeyAic3luYyIsICBERUJVR19TWU5DIH0sCi0gICAgeyAic2xlZXAiLCBERUJVR19TTEVFUCB9LAotICAgIHsgInBpeCIsICAgREVCVUdfUElYRUwgfSwKLSAgICB7IE5VTEwsICAgIDAgfQotfTsKLQotCi1zdGF0aWMgdm9pZCBpbnRlbEludmFsaWRhdGVTdGF0ZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBuZXdfc3RhdGUgKQotewotICAgX3N3cmFzdF9JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Ci0gICBfc3dzZXR1cF9JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Ci0gICBfdmJvX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgIF90bmxfSW52YWxpZGF0ZVN0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgX3RubF9pbnZhbGlkYXRlX3ZlcnRleF9zdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgIElOVEVMX0NPTlRFWFQoY3R4KS0+TmV3R0xTdGF0ZSB8PSBuZXdfc3RhdGU7Ci19Ci0KLQotdm9pZCBpbnRlbEluaXREcml2ZXJGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLSAgIF9tZXNhX2luaXRfZHJpdmVyX2Z1bmN0aW9ucyggZnVuY3Rpb25zICk7Ci0KLSAgIGZ1bmN0aW9ucy0+Q2xlYXIgPSBpbnRlbENsZWFyOwotICAgZnVuY3Rpb25zLT5GbHVzaCA9IGludGVsZ2xGbHVzaDsKLSAgIGZ1bmN0aW9ucy0+RmluaXNoID0gaW50ZWxGaW5pc2g7Ci0gICBmdW5jdGlvbnMtPkdldFN0cmluZyA9IGludGVsR2V0U3RyaW5nOwotICAgZnVuY3Rpb25zLT5VcGRhdGVTdGF0ZSA9IGludGVsSW52YWxpZGF0ZVN0YXRlOwotCi0gICBpbnRlbEluaXRUZXh0dXJlRnVuY3MoIGZ1bmN0aW9ucyApOwotICAgaW50ZWxJbml0UGl4ZWxGdW5jcyggZnVuY3Rpb25zICk7Ci0gICBpbnRlbEluaXRTdGF0ZUZ1bmNzKCBmdW5jdGlvbnMgKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfZW1pdF9pbnZhcmllbnRfc3RhdGUoIEdMY29udGV4dCAqY3R4ICkKLXsKLX0KLQotCi0KLUdMYm9vbGVhbiBpbnRlbEluaXRDb250ZXh0KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbWVzYVZpcywKLQkJCSAgICBfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdiwKLQkJCSAgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSwKLQkJCSAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotICAgR0xjb250ZXh0ICpzaGFyZUN0eCA9IChHTGNvbnRleHQgKikgc2hhcmVkQ29udGV4dFByaXZhdGU7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2ID0gZHJpQ29udGV4dFByaXYtPmRyaVNjcmVlblByaXY7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gKGludGVsU2NyZWVuUHJpdmF0ZSAqKXNQcml2LT5wcml2YXRlOwotICAgZHJtSTgzMFNhcmVhICpzYVByaXYgPSAoZHJtSTgzMFNhcmVhICopCi0gICAgICAoKChHTHVieXRlICopc1ByaXYtPnBTQVJFQSkraW50ZWxTY3JlZW4tPnNhcmVhX3ByaXZfb2Zmc2V0KTsKLSAgIGludCBmdGhyb3R0bGVfbW9kZTsKLQotICAgaWYgKCFfbWVzYV9pbml0aWFsaXplX2NvbnRleHQoJmludGVsLT5jdHgsCi0JCQkJIG1lc2FWaXMsIHNoYXJlQ3R4LCAKLQkJCQkgZnVuY3Rpb25zLAotCQkJCSAodm9pZCopIGludGVsKSkKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLQotICAgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUgPSBpbnRlbDsKLSAgIGludGVsLT5pbnRlbFNjcmVlbiA9IGludGVsU2NyZWVuOwotICAgaW50ZWwtPmRyaVNjcmVlbiA9IHNQcml2OwotICAgaW50ZWwtPnNhcmVhID0gc2FQcml2OwotCi0KLSAgICh2b2lkKSBtZW1zZXQoIGludGVsLT50ZXh0dXJlX2hlYXBzLCAwLCBzaXplb2YoIGludGVsLT50ZXh0dXJlX2hlYXBzICkgKTsKLSAgIG1ha2VfZW1wdHlfbGlzdCggJiBpbnRlbC0+c3dhcHBlZCApOwotCi0gICBkcmlQYXJzZUNvbmZpZ0ZpbGVzICgmaW50ZWwtPm9wdGlvbkNhY2hlLCAmaW50ZWxTY3JlZW4tPm9wdGlvbkNhY2hlLAotCQkJaW50ZWwtPmRyaVNjcmVlbi0+bXlOdW0sICJpOTE1Iik7Ci0KLSAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZU1heEFuaXNvdHJvcHkgPSAyLjA7Ci0KLSAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoID0gMS4wOwotICAgY3R4LT5Db25zdC5NaW5MaW5lV2lkdGhBQSA9IDEuMDsKLSAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoID0gMy4wOwotICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGhBQSA9IDMuMDsKLSAgIGN0eC0+Q29uc3QuTGluZVdpZHRoR3JhbnVsYXJpdHkgPSAxLjA7Ci0KLSAgIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplID0gMS4wOwotICAgY3R4LT5Db25zdC5NaW5Qb2ludFNpemVBQSA9IDEuMDsKLSAgIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplID0gMjU1LjA7Ci0gICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZUFBID0gMy4wOwotICAgY3R4LT5Db25zdC5Qb2ludFNpemVHcmFudWxhcml0eSA9IDEuMDsKLQotICAgLyogcmVpbml0aWFsaXplIHRoZSBjb250ZXh0IHBvaW50IHN0YXRlLgotICAgICogSXQgZGVwZW5kIG9uIGNvbnN0YW50cyBpbiBfX0dMY29udGV4dFJlYzo6Q29uc3QKLSAgICAqLwotICAgX21lc2FfaW5pdF9wb2ludChjdHgpOwotCi0gICAvKiBJbml0aWFsaXplIHRoZSBzb2Z0d2FyZSByYXN0ZXJpemVyIGFuZCBoZWxwZXIgbW9kdWxlcy4gKi8KLSAgIF9zd3Jhc3RfQ3JlYXRlQ29udGV4dCggY3R4ICk7Ci0gICBfdmJvX0NyZWF0ZUNvbnRleHQoIGN0eCApOwotICAgX3RubF9DcmVhdGVDb250ZXh0KCBjdHggKTsKLSAgIF9zd3NldHVwX0NyZWF0ZUNvbnRleHQoIGN0eCApOwotCi0gICAvKiBJbnN0YWxsIHRoZSBjdXN0b21pemVkIHBpcGVsaW5lOiAqLwotICAgX3RubF9kZXN0cm95X3BpcGVsaW5lKCBjdHggKTsKLSAgIF90bmxfaW5zdGFsbF9waXBlbGluZSggY3R4LCBpbnRlbF9waXBlbGluZSApOwotCi0gICAvKiBDb25maWd1cmUgc3dyYXN0IHRvIG1hdGNoIGhhcmR3YXJlIGNoYXJhY3RlcmlzdGljczogKi8KLSAgIF9zd3Jhc3RfYWxsb3dfcGl4ZWxfZm9nKCBjdHgsIEdMX0ZBTFNFICk7Ci0gICBfc3dyYXN0X2FsbG93X3ZlcnRleF9mb2coIGN0eCwgR0xfVFJVRSApOwotCi0gICAvKiBEcmkgc3R1ZmYgKi8KLSAgIGludGVsLT5oSFdDb250ZXh0ID0gZHJpQ29udGV4dFByaXYtPmhIV0NvbnRleHQ7Ci0gICBpbnRlbC0+ZHJpRmQgPSBzUHJpdi0+ZmQ7Ci0gICBpbnRlbC0+ZHJpSHdMb2NrID0gKGRybUxvY2sgKikgJnNQcml2LT5wU0FSRUEtPmxvY2s7Ci0KLSAgIGludGVsLT5od19zdGVuY2lsID0gbWVzYVZpcy0+c3RlbmNpbEJpdHMgJiYgbWVzYVZpcy0+ZGVwdGhCaXRzID09IDI0OwotICAgaW50ZWwtPmh3X3N0aXBwbGUgPSAxOwotCi0gICBzd2l0Y2gobWVzYVZpcy0+ZGVwdGhCaXRzKSB7Ci0gICBjYXNlIDA6CQkJLyogd2hhdCB0byBkbyBpbiB0aGlzIGNhc2U/ICovCi0gICBjYXNlIDE2OgotICAgICAgaW50ZWwtPmRlcHRoX3NjYWxlID0gMS4wLzB4ZmZmZjsKLSAgICAgIGludGVsLT5wb2x5Z29uX29mZnNldF9zY2FsZSA9IDEuMC8weGZmZmY7Ci0gICAgICBpbnRlbC0+ZGVwdGhfY2xlYXJfbWFzayA9IH4wOwotICAgICAgaW50ZWwtPkNsZWFyRGVwdGggPSAweGZmZmY7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMjQ6Ci0gICAgICBpbnRlbC0+ZGVwdGhfc2NhbGUgPSAxLjAvMHhmZmZmZmY7Ci0gICAgICBpbnRlbC0+cG9seWdvbl9vZmZzZXRfc2NhbGUgPSAyLjAvMHhmZmZmZmY7IC8qIHJlcSdkIHRvIHBhc3MgZ2xlYW4gKi8KLSAgICAgIGludGVsLT5kZXB0aF9jbGVhcl9tYXNrID0gMHgwMGZmZmZmZjsKLSAgICAgIGludGVsLT5zdGVuY2lsX2NsZWFyX21hc2sgPSAweGZmMDAwMDAwOwotICAgICAgaW50ZWwtPkNsZWFyRGVwdGggPSAweDAwZmZmZmZmOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KDApOyAKLSAgICAgIGJyZWFrOwotICAgfQotCi0gICAvKiBJbml0aWFsaXplIHN3cmFzdCwgdG5sIGRyaXZlciB0YWJsZXM6ICovCi0gICBpbnRlbEluaXRTcGFuRnVuY3MoIGN0eCApOwotICAgaW50ZWxJbml0VHJpRnVuY3MoIGN0eCApOwotCi0KLSAgIGludGVsLT5SZW5kZXJJbmRleCA9IH4wOwotCi0gICBmdGhyb3R0bGVfbW9kZSA9IGRyaVF1ZXJ5T3B0aW9uaSgmaW50ZWwtPm9wdGlvbkNhY2hlLCAiZnRocm90dGxlX21vZGUiKTsKLSAgIGludGVsLT5pdy5pcnFfc2VxID0gLTE7Ci0gICBpbnRlbC0+aXJxc0VtaXR0ZWQgPSAwOwotCi0gICBpbnRlbC0+ZG9faXJxcyA9IChpbnRlbC0+aW50ZWxTY3JlZW4tPmlycV9hY3RpdmUgJiYKLQkJICAgICBmdGhyb3R0bGVfbW9kZSA9PSBEUklfQ09ORl9GVEhST1RUTEVfSVJRUyk7Ci0KLSAgIGludGVsLT5kb191c2xlZXBzID0gKGZ0aHJvdHRsZV9tb2RlID09IERSSV9DT05GX0ZUSFJPVFRMRV9VU0xFRVBTKTsKLQotICAgaW50ZWwtPnZibGFua19mbGFncyA9IChpbnRlbC0+aW50ZWxTY3JlZW4tPmlycV9hY3RpdmUgIT0gMCkKLSAgICAgICA/IGRyaUdldERlZmF1bHRWQmxhbmtGbGFncygmaW50ZWwtPm9wdGlvbkNhY2hlKSA6IFZCTEFOS19GTEFHX05PX0lSUTsKLQotICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCZpbnRlbC0+c3dhcF91c3QpOwotICAgX21hdGhfbWF0cml4X2N0ciAoJmludGVsLT5WaWV3cG9ydE1hdHJpeCk7Ci0KLSAgIGRyaUluaXRFeHRlbnNpb25zKCBjdHgsIGNhcmRfZXh0ZW5zaW9ucywgR0xfVFJVRSApOwotCi0gICBpZiAoaW50ZWwtPmN0eC5NZXNhX0RYVG4pIHsKLSAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbiggY3R4LCAiR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyIgKTsKLSAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbiggY3R4LCAiR0xfUzNfczN0YyIgKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGRyaVF1ZXJ5T3B0aW9uYiAoJmludGVsLT5vcHRpb25DYWNoZSwgImZvcmNlX3MzdGNfZW5hYmxlIikpIHsKLSAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbiggY3R4LCAiR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyIgKTsKLSAgIH0KLQotLyogICAgZHJpSW5pdFRleHR1cmVPYmplY3RzKCBjdHgsICYgaW50ZWwtPnN3YXBwZWQsICovCi0vKiAJCQkgIERSSV9URVhNR1JfRE9fVEVYVFVSRV8xRCB8ICovCi0vKiAJCQkgIERSSV9URVhNR1JfRE9fVEVYVFVSRV8yRCB8ICAqLwotLyogCQkJICBEUklfVEVYTUdSX0RPX1RFWFRVUkVfUkVDVCApOyAqLwotCi0KLSAgIGludGVsSW5pdEJhdGNoQnVmZmVyKCZpbnRlbC0+Y3R4KTsKLSAgIGludGVsLT5wcmltLmZsdXNoID0gaW50ZWxfZW1pdF9pbnZhcmllbnRfc3RhdGU7Ci0gICBpbnRlbC0+cHJpbS5wcmltaXRpdmUgPSB+MDsKLQotCi0jaWYgRE9fREVCVUcKLSAgIElOVEVMX0RFQlVHICA9IGRyaVBhcnNlRGVidWdTdHJpbmcoIGdldGVudiggIklOVEVMX0RFQlVHIiApLAotCQkJCSAgICAgICBkZWJ1Z19jb250cm9sICk7Ci0gICBJTlRFTF9ERUJVRyB8PSBkcmlQYXJzZURlYnVnU3RyaW5nKCBnZXRlbnYoICJJTlRFTF9ERUJVRyIgKSwKLQkJCQkgICAgICAgZGVidWdfY29udHJvbCApOwotI2VuZGlmCi0KLSNpZm5kZWYgVkVSQk9TRQotICAgaWYgKGdldGVudigiSU5URUxfVkVSQk9TRSIpKQotICAgICAgVkVSQk9TRT0xOwotI2VuZGlmCi0KLSAgIGlmIChnZXRlbnYoIklOVEVMX05PX1JBU1QiKSB8fCAKLSAgICAgICBnZXRlbnYoIklOVEVMX05PX1JBU1QiKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJkaXNhYmxpbmcgM0QgcmFzdGVyaXphdGlvblxuIik7Ci0gICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfVVNFUiwgMSk7IAotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotdm9pZCBpbnRlbERlc3Ryb3lDb250ZXh0KF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2KQotewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gKGludGVsQ29udGV4dFB0cikgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7Ci0KLSAgIGFzc2VydChpbnRlbCk7IC8qIHNob3VsZCBuZXZlciBiZSBudWxsICovCi0gICBpZiAoaW50ZWwpIHsKLSAgICAgIEdMYm9vbGVhbiAgIHJlbGVhc2VfdGV4dHVyZV9oZWFwczsKLQotICAgICAgSU5URUxfRklSRVZFUlRJQ0VTKCBpbnRlbCApOwotCi0gICAgICBpbnRlbC0+dnRibC5kZXN0cm95KCBpbnRlbCApOwotCi0gICAgICByZWxlYXNlX3RleHR1cmVfaGVhcHMgPSAoaW50ZWwtPmN0eC5TaGFyZWQtPlJlZkNvdW50ID09IDEpOwotICAgICAgX3N3c2V0dXBfRGVzdHJveUNvbnRleHQgKCZpbnRlbC0+Y3R4KTsKLSAgICAgIF90bmxfRGVzdHJveUNvbnRleHQgKCZpbnRlbC0+Y3R4KTsKLSAgICAgIF92Ym9fRGVzdHJveUNvbnRleHQgKCZpbnRlbC0+Y3R4KTsKLQotICAgICAgX3N3cmFzdF9EZXN0cm95Q29udGV4dCAoJmludGVsLT5jdHgpOwotICAgICAgaW50ZWwtPkZhbGxiYWNrID0gMDsJLyogZG9uJ3QgY2FsbCBfc3dyYXN0X0ZsdXNoIGxhdGVyICovCi0KLSAgICAgIGludGVsRGVzdHJveUJhdGNoQnVmZmVyKCZpbnRlbC0+Y3R4KTsKLSAgICAgIAotCi0gICAgICBpZiAoIHJlbGVhc2VfdGV4dHVyZV9oZWFwcyApIHsKLSAgICAgICAgIC8qIFRoaXMgc2hhcmUgZ3JvdXAgaXMgYWJvdXQgdG8gZ28gYXdheSwgZnJlZSBvdXIgcHJpdmF0ZQotICAgICAgICAgICogdGV4dHVyZSBvYmplY3QgZGF0YS4KLSAgICAgICAgICAqLwotICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGludGVsLT5ucl9oZWFwcyA7IGkrKyApIHsKLQkgICAgZHJpRGVzdHJveVRleHR1cmVIZWFwKCBpbnRlbC0+dGV4dHVyZV9oZWFwc1sgaSBdICk7Ci0JICAgIGludGVsLT50ZXh0dXJlX2hlYXBzWyBpIF0gPSBOVUxMOwotICAgICAgICAgfQotCi0JIGFzc2VydCggaXNfZW1wdHlfbGlzdCggJiBpbnRlbC0+c3dhcHBlZCApICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZyZWUgdGhlIE1lc2EgY29udGV4dCAqLwotICAgICAgX21lc2FfZGVzdHJveV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKLSAgIH0KLX0KLQotdm9pZCBpbnRlbFNldEZyb250Q2xpcFJlY3RzKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQotewotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotCi0gICBpZiAoIWRQcml2KSByZXR1cm47Ci0KLSAgIGludGVsLT5udW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwotICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgIGludGVsLT5kcmF3WCA9IGRQcml2LT54OwotICAgaW50ZWwtPmRyYXdZID0gZFByaXYtPnk7Ci19Ci0KLQotdm9pZCBpbnRlbFNldEJhY2tDbGlwUmVjdHMoIGludGVsQ29udGV4dFB0ciBpbnRlbCApCi17Ci0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0KLSAgIGlmICghZFByaXYpIHJldHVybjsKLQotICAgaWYgKGludGVsLT5zYXJlYS0+cGZfZW5hYmxlZCA9PSAwICYmIGRQcml2LT5udW1CYWNrQ2xpcFJlY3RzID09IDApIHsKLSAgICAgIGludGVsLT5udW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwotICAgICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgICAgIGludGVsLT5kcmF3WCA9IGRQcml2LT54OwotICAgICAgaW50ZWwtPmRyYXdZID0gZFByaXYtPnk7Ci0gICB9IGVsc2UgewotICAgICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1CYWNrQ2xpcFJlY3RzOwotICAgICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cEJhY2tDbGlwUmVjdHM7Ci0gICAgICBpbnRlbC0+ZHJhd1ggPSBkUHJpdi0+YmFja1g7Ci0gICAgICBpbnRlbC0+ZHJhd1kgPSBkUHJpdi0+YmFja1k7Ci0gICAgICAKLSAgICAgIGlmIChkUHJpdi0+bnVtQmFja0NsaXBSZWN0cyA9PSAxICYmCi0JICBkUHJpdi0+eCA9PSBkUHJpdi0+YmFja1ggJiYKLQkgIGRQcml2LT55ID09IGRQcml2LT5iYWNrWSkgewotICAgICAgCi0JIC8qIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJhY2sgY2xpcHJlY3QgZGltZW5zaW9ucyBoZXJlCi0JICAqIGFzIGVhcmx5IHZlcnNpb25zIG9mIGRyaS5hIGluIHRoZSBYc2VydmVyIGFyZSBpbmNvcnJlY3QuICBUcnkKLQkgICogdmVyeSBoYXJkIG5vdCB0byByZXN0cmljdCBmdXR1cmUgdmVyc2lvbnMgb2YgZHJpLmEgd2hpY2gKLQkgICogbWlnaHQgZWcuIGFsbG9jYXRlIHRydWx5IHByaXZhdGUgYmFjayBidWZmZXJzLgotCSAgKi8KLQkgaW50IHgxLCB5MTsKLQkgaW50IHgyLCB5MjsKLQkgCi0JIHgxID0gZFByaXYtPng7Ci0JIHkxID0gZFByaXYtPnk7ICAgICAgCi0JIHgyID0gZFByaXYtPnggKyBkUHJpdi0+dzsKLQkgeTIgPSBkUHJpdi0+eSArIGRQcml2LT5oOwotCSAKLQkgaWYgKHgxIDwgMCkgeDEgPSAwOwotCSBpZiAoeTEgPCAwKSB5MSA9IDA7Ci0JIGlmICh4MiA+IGludGVsLT5pbnRlbFNjcmVlbi0+d2lkdGgpIHgyID0gaW50ZWwtPmludGVsU2NyZWVuLT53aWR0aDsKLQkgaWYgKHkyID4gaW50ZWwtPmludGVsU2NyZWVuLT5oZWlnaHQpIHkyID0gaW50ZWwtPmludGVsU2NyZWVuLT5oZWlnaHQ7Ci0KLQkgaWYgKHgxID09IGRQcml2LT5wQmFja0NsaXBSZWN0c1swXS54MSAmJgotCSAgICAgeTEgPT0gZFByaXYtPnBCYWNrQ2xpcFJlY3RzWzBdLnkxKSB7Ci0KLQkgICAgZFByaXYtPnBCYWNrQ2xpcFJlY3RzWzBdLngyID0geDI7Ci0JICAgIGRQcml2LT5wQmFja0NsaXBSZWN0c1swXS55MiA9IHkyOwotCSB9Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotdm9pZCBpbnRlbFdpbmRvd01vdmVkKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKQotewotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotICAgR0xmcmFtZWJ1ZmZlciAqZHJhd0ZiID0gKEdMZnJhbWVidWZmZXIgKikgZFByaXYtPmRyaXZlclByaXZhdGU7Ci0KLSAgIGlmICghaW50ZWwtPmN0eC5EcmF3QnVmZmVyKSB7Ci0gICAgICBpbnRlbFNldEZyb250Q2xpcFJlY3RzKCBpbnRlbCApOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBkcmlVcGRhdGVGcmFtZWJ1ZmZlclNpemUoJmludGVsLT5jdHgsIGRQcml2KTsKLSAgICAgIHN3aXRjaCAoZHJhd0ZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSkgewotICAgICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6Ci0JIGludGVsU2V0RnJvbnRDbGlwUmVjdHMoIGludGVsICk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBCVUZGRVJfQklUX0JBQ0tfTEVGVDoKLQkgaW50ZWxTZXRCYWNrQ2xpcFJlY3RzKCBpbnRlbCApOwotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JIC8qIGdsRHJhd0J1ZmZlcihHTF9OT05FIG9yIEdMX0ZST05UX0FORF9CQUNLKTogc29mdHdhcmUgZmFsbGJhY2sgKi8KLQkgaW50ZWxTZXRGcm9udENsaXBSZWN0cyggaW50ZWwgKTsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKGRyYXdGYi0+V2lkdGggIT0gZFByaXYtPncgfHwgZHJhd0ZiLT5IZWlnaHQgIT0gZFByaXYtPmgpIHsKLSAgICAgIC8qIHVwZGF0ZSBNZXNhJ3Mgbm90aW9uIG9mIGZyYW1lYnVmZmVyL3dpbmRvdyBzaXplICovCi0gICAgICBfbWVzYV9yZXNpemVfZnJhbWVidWZmZXIoJmludGVsLT5jdHgsIGRyYXdGYiwgZFByaXYtPncsIGRQcml2LT5oKTsKLSAgICAgIGRyYXdGYi0+SW5pdGlhbGl6ZWQgPSBHTF9UUlVFOyAvKiBYWFggcmVtb3ZlIHNvbWVkYXkgKi8KLSAgIH0KLQotICAgLyogU2V0IHN0YXRlIHdlIGtub3cgZGVwZW5kcyBvbiBkcmF3YWJsZSBwYXJhbWV0ZXJzOgotICAgICovCi0gICB7Ci0gICAgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotCi0gICAgICBpZiAoaW50ZWwtPmludGVsU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZGR4TWlub3IgPj0gNykgewotCSBkcm1JODMwU2FyZWEgKnNhcmVhID0gaW50ZWwtPnNhcmVhOwotCSBkcm1fY2xpcF9yZWN0X3QgZHJ3X3JlY3QgPSB7IC54MSA9IGRQcml2LT54LCAueDIgPSBkUHJpdi0+eCArIGRQcml2LT53LAotCQkJCSAgICAgIC55MSA9IGRQcml2LT55LCAueTIgPSBkUHJpdi0+eSArIGRQcml2LT5oIH07Ci0JIGRybV9jbGlwX3JlY3RfdCBwaXBlQV9yZWN0ID0geyAueDEgPSBzYXJlYS0+cGlwZUFfeCwKLQkJCQkJLngyID0gc2FyZWEtPnBpcGVBX3ggKyBzYXJlYS0+cGlwZUFfdywKLQkJCQkJLnkxID0gc2FyZWEtPnBpcGVBX3ksCi0JCQkJCS55MiA9IHNhcmVhLT5waXBlQV95ICsgc2FyZWEtPnBpcGVBX2ggfTsKLQkgZHJtX2NsaXBfcmVjdF90IHBpcGVCX3JlY3QgPSB7IC54MSA9IHNhcmVhLT5waXBlQl94LAotCQkJCQkueDIgPSBzYXJlYS0+cGlwZUJfeCArIHNhcmVhLT5waXBlQl93LAotCQkJCQkueTEgPSBzYXJlYS0+cGlwZUJfeSwKLQkJCQkJLnkyID0gc2FyZWEtPnBpcGVCX3kgKyBzYXJlYS0+cGlwZUJfaCB9OwotCSBHTGludCBhcmVhQSA9IGRyaUludGVyc2VjdEFyZWEoIGRyd19yZWN0LCBwaXBlQV9yZWN0ICk7Ci0JIEdMaW50IGFyZWFCID0gZHJpSW50ZXJzZWN0QXJlYSggZHJ3X3JlY3QsIHBpcGVCX3JlY3QgKTsKLQkgR0x1aW50IGZsYWdzID0gaW50ZWwtPnZibGFua19mbGFnczsKLQotCSBpZiAoYXJlYUIgPiBhcmVhQSB8fCAoYXJlYUEgPT0gYXJlYUIgJiYgYXJlYUIgPiAwKSkgewotCSAgICBmbGFncyA9IGludGVsLT52YmxhbmtfZmxhZ3MgfCBWQkxBTktfRkxBR19TRUNPTkRBUlk7Ci0JIH0gZWxzZSB7Ci0JICAgIGZsYWdzID0gaW50ZWwtPnZibGFua19mbGFncyAmIH5WQkxBTktfRkxBR19TRUNPTkRBUlk7Ci0JIH0KLQotCSBpZiAoZmxhZ3MgIT0gaW50ZWwtPnZibGFua19mbGFncykgewotCSAgICBpbnRlbC0+dmJsYW5rX2ZsYWdzID0gZmxhZ3M7Ci0JICAgIGRyaUdldEN1cnJlbnRWQmxhbmsoZFByaXYsIGludGVsLT52YmxhbmtfZmxhZ3MsICZpbnRlbC0+dmJsX3NlcSk7Ci0JIH0KLSAgICAgIH0gZWxzZSB7Ci0JIGludGVsLT52YmxhbmtfZmxhZ3MgJj0gflZCTEFOS19GTEFHX1NFQ09OREFSWTsKLSAgICAgIH0KLQotICAgICAgY3R4LT5Ecml2ZXIuU2Npc3NvciggY3R4LCBjdHgtPlNjaXNzb3IuWCwgY3R4LT5TY2lzc29yLlksCi0JCQkgICBjdHgtPlNjaXNzb3IuV2lkdGgsIGN0eC0+U2Npc3Nvci5IZWlnaHQgKTsKLSAgICAgIAotICAgICAgY3R4LT5Ecml2ZXIuRGVwdGhSYW5nZSggY3R4LCAKLQkJCSAgICAgIGN0eC0+Vmlld3BvcnQuTmVhciwKLQkJCSAgICAgIGN0eC0+Vmlld3BvcnQuRmFyICk7Ci0gICB9Ci19Ci0KLUdMYm9vbGVhbiBpbnRlbFVuYmluZENvbnRleHQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYpCi17Ci0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotR0xib29sZWFuIGludGVsTWFrZUN1cnJlbnQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCQkgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3UHJpdiwKLQkJCSAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaVJlYWRQcml2KQotewotCi0gICBpZiAoZHJpQ29udGV4dFByaXYpIHsKLSAgICAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IChpbnRlbENvbnRleHRQdHIpIGRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOwotCi0gICAgICBpZiAoIGludGVsLT5kcmlEcmF3YWJsZSAhPSBkcmlEcmF3UHJpdiApIHsKLQkgLyogU2hvdWxkbid0IHRoZSByZWFkYnVmZmVyIGJlIHN0b3JlZCBhbHNvPyAqLwotCSBkcmlEcmF3YWJsZUluaXRWQmxhbmsoIGRyaURyYXdQcml2LCBpbnRlbC0+dmJsYW5rX2ZsYWdzLAotCQkJCSZpbnRlbC0+dmJsX3NlcSApOwotCi0JIGludGVsLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OwotCSBpbnRlbFdpbmRvd01vdmVkKCBpbnRlbCApOwotICAgICAgfQotCi0gICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoJmludGVsLT5jdHgsCi0JCQkgKEdMZnJhbWVidWZmZXIgKikgZHJpRHJhd1ByaXYtPmRyaXZlclByaXZhdGUsCi0JCQkgKEdMZnJhbWVidWZmZXIgKikgZHJpUmVhZFByaXYtPmRyaXZlclByaXZhdGUpOwotCi0gICAgICBpbnRlbC0+Y3R4LkRyaXZlci5EcmF3QnVmZmVyKCAmaW50ZWwtPmN0eCwgaW50ZWwtPmN0eC5Db2xvci5EcmF3QnVmZmVyWzBdICk7Ci0gICB9IGVsc2UgewotICAgICAgX21lc2FfbWFrZV9jdXJyZW50KE5VTEwsIE5VTEwsIE5VTEwpOwotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotLyoqCi0gKiBVc2UgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzYXJlYSB0byB1cGRhdGUgdGhlIHNjcmVlbiBwYXJhbWV0ZXJzCi0gKiByZWxhdGVkIHRvIHNjcmVlbiByb3RhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLWludGVsVXBkYXRlU2NyZWVuUm90YXRpb24oaW50ZWxDb250ZXh0UHRyIGludGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1JODMwU2FyZWEgKnNhcmVhKQotewotICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IChpbnRlbFNjcmVlblByaXZhdGUgKilzUHJpdi0+cHJpdmF0ZTsKLSAgIGludGVsUmVnaW9uICpjb2xvckJ1ZjsKLQotICAgaW50ZWxVbm1hcFNjcmVlblJlZ2lvbnMoaW50ZWxTY3JlZW4pOwotCi0gICBpbnRlbFVwZGF0ZVNjcmVlbkZyb21TQVJFQShpbnRlbFNjcmVlbiwgc2FyZWEpOwotCi0gICAvKiB1cGRhdGUgdGhlIGN1cnJlbnQgaHcgb2Zmc2V0cyBmb3IgdGhlIGNvbG9yIGFuZCBkZXB0aCBidWZmZXJzICovCi0gICBpZiAoaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0JBQ0tfTEVGVCkKLSAgICAgIGNvbG9yQnVmID0gJmludGVsU2NyZWVuLT5iYWNrOwotICAgZWxzZQotICAgICAgY29sb3JCdWYgPSAmaW50ZWxTY3JlZW4tPmZyb250OwotICAgaW50ZWwtPnZ0YmwudXBkYXRlX2NvbG9yX3pfcmVnaW9ucyhpbnRlbCwgY29sb3JCdWYsICZpbnRlbFNjcmVlbi0+ZGVwdGgpOwotCi0gICBpZiAoIWludGVsTWFwU2NyZWVuUmVnaW9ucyhzUHJpdikpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgUmVtYXBwaW5nIHNjcmVlbiByZWdpb25zISEhXG4iKTsKLSAgIH0KLX0KLQotdm9pZCBpbnRlbEdldExvY2soIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0x1aW50IGZsYWdzICkKLXsKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYgPSBpbnRlbC0+ZHJpU2NyZWVuOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IChpbnRlbFNjcmVlblByaXZhdGUgKilzUHJpdi0+cHJpdmF0ZTsKLSAgIGRybUk4MzBTYXJlYSAqIHNhcmVhID0gaW50ZWwtPnNhcmVhOwotICAgdW5zaWduZWQgICBpOwotCi0gICBkcm1HZXRMb2NrKGludGVsLT5kcmlGZCwgaW50ZWwtPmhIV0NvbnRleHQsIGZsYWdzKTsKLQotICAgLyogSWYgdGhlIHdpbmRvdyBtb3ZlZCwgbWF5IG5lZWQgdG8gc2V0IGEgbmV3IGNsaXByZWN0IG5vdy4KLSAgICAqCi0gICAgKiBOT1RFOiBUaGlzIHJlbGVhc2VzIGFuZCByZWdhaW5zIHRoZSBodyBsb2NrLCBzbyBhbGwgc3RhdGUKLSAgICAqIGNoZWNraW5nIG11c3QgYmUgZG9uZSAqYWZ0ZXIqIHRoaXMgY2FsbDoKLSAgICAqLwotICAgaWYgKGRQcml2KQotICAgICAgRFJJX1ZBTElEQVRFX0RSQVdBQkxFX0lORk8oc1ByaXYsIGRQcml2KTsKLQotICAgaWYgKGRQcml2ICYmIGludGVsLT5sYXN0U3RhbXAgIT0gZFByaXYtPmxhc3RTdGFtcCkgewotICAgICAgaW50ZWxXaW5kb3dNb3ZlZCggaW50ZWwgKTsKLSAgICAgIGludGVsLT5sYXN0U3RhbXAgPSBkUHJpdi0+bGFzdFN0YW1wOwotICAgfQotCi0gICAvKiBJZiB3ZSBsb3N0IGNvbnRleHQsIG5lZWQgdG8gZHVtcCBhbGwgcmVnaXN0ZXJzIHRvIGhhcmR3YXJlLgotICAgICogTm90ZSB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQgMmQgY29udGV4dHMsIGV2ZW4gaWYgdGhleSBwZXJmb3JtCi0gICAgKiBhY2NlbGVyYXRlZCBjb21tYW5kcywgc28gdGhlIERSSSBsb2NraW5nIGluIHRoZSBYIHNlcnZlciBpcyBldmVuCi0gICAgKiBtb3JlIGJyb2tlbiB0aGFuIHVzdWFsLgotICAgICovCi0KLSAgIGlmIChzYXJlYS0+d2lkdGggIT0gaW50ZWxTY3JlZW4tPndpZHRoIHx8Ci0gICAgICAgc2FyZWEtPmhlaWdodCAhPSBpbnRlbFNjcmVlbi0+aGVpZ2h0IHx8Ci0gICAgICAgc2FyZWEtPnJvdGF0aW9uICE9IGludGVsU2NyZWVuLT5jdXJyZW50X3JvdGF0aW9uKSB7Ci0gICAgICBpbnRlbFVwZGF0ZVNjcmVlblJvdGF0aW9uKGludGVsLCBzUHJpdiwgc2FyZWEpOwotCi0gICAgICAvKiBUaGlzIHdpbGwgZHJvcCB0aGUgb3V0c3RhbmRpbmcgYmF0Y2hidWZmZXIgb24gdGhlIGZsb29yICovCi0gICAgICBpbnRlbC0+YmF0Y2gucHRyIC09IChpbnRlbC0+YmF0Y2guc2l6ZSAtIGludGVsLT5iYXRjaC5zcGFjZSk7Ci0gICAgICBpbnRlbC0+YmF0Y2guc3BhY2UgPSBpbnRlbC0+YmF0Y2guc2l6ZTsKLSAgICAgIC8qIGxvc2UgYWxsIHByaW1pdGl2ZXMgKi8KLSAgICAgIGludGVsLT5wcmltLnByaW1pdGl2ZSA9IH4wOwotICAgICAgaW50ZWwtPnByaW0uc3RhcnRfcHRyID0gMDsKLSAgICAgIGludGVsLT5wcmltLmZsdXNoID0gMDsKLSAgICAgIGludGVsLT52dGJsLmxvc3RfaGFyZHdhcmUoIGludGVsICk7IAotCi0gICAgICBpbnRlbC0+bGFzdFN0YW1wID0gMDsgLyogZm9yY2Ugd2luZG93IHVwZGF0ZSAqLwotCi0gICAgICAvKiBSZWxlYXNlIGJhdGNoIGJ1ZmZlcgotICAgICAgICovCi0gICAgICBpbnRlbERlc3Ryb3lCYXRjaEJ1ZmZlcigmaW50ZWwtPmN0eCk7Ci0gICAgICBpbnRlbEluaXRCYXRjaEJ1ZmZlcigmaW50ZWwtPmN0eCk7Ci0gICAgICBpbnRlbC0+cHJpbS5mbHVzaCA9IGludGVsX2VtaXRfaW52YXJpZW50X3N0YXRlOwotCi0gICAgICAvKiBTdGlsbCBuZWVkIHRvIHJlc2V0IHRoZSBnbG9iYWwgTFJVPwotICAgICAgICovCi0gICAgICBpbnRlbF9kcmlSZWluaXRUZXh0dXJlSGVhcCggaW50ZWwtPnRleHR1cmVfaGVhcHNbMF0sIGludGVsLT5pbnRlbFNjcmVlbi0+dGV4LnNpemUgKTsKLSAgIH0KLQotICAgLyogU2hhcmVkIHRleHR1cmUgbWFuYWdtZW50IC0gaWYgYW5vdGhlciBjbGllbnQgaGFzIHBsYXllZCB3aXRoCi0gICAgKiB0ZXh0dXJlIHNwYWNlLCBmaWd1cmUgb3V0IHdoaWNoIGlmIGFueSBvZiBvdXIgdGV4dHVyZXMgaGF2ZSBiZWVuCi0gICAgKiBlamVjdGVkLCBhbmQgdXBkYXRlIG91ciBnbG9iYWwgTFJVLgotICAgICovCi0gICBmb3IgKCBpID0gMCA7IGkgPCBpbnRlbC0+bnJfaGVhcHMgOyBpKysgKSB7Ci0gICAgICBEUklfQUdFX1RFWFRVUkVTKCBpbnRlbC0+dGV4dHVyZV9oZWFwc1sgaSBdICk7Ci0gICB9Ci19Ci0KLQotdm9pZCBpbnRlbFN3YXBCdWZmZXJzKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKQotewotICAgaWYgKGRQcml2LT5kcmlDb250ZXh0UHJpdiAmJiBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpIHsKLSAgICAgIGludGVsQ29udGV4dFB0ciBpbnRlbDsKLSAgICAgIEdMY29udGV4dCAqY3R4OwotICAgICAgaW50ZWwgPSAoaW50ZWxDb250ZXh0UHRyKSBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7Ci0gICAgICBjdHggPSAmaW50ZWwtPmN0eDsKLSAgICAgIGlmIChjdHgtPlZpc3VhbC5kb3VibGVCdWZmZXJNb2RlKSB7Ci0gICAgICAgICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLQkgX21lc2Ffbm90aWZ5U3dhcEJ1ZmZlcnMoIGN0eCApOyAgLyogZmx1c2ggcGVuZGluZyByZW5kZXJpbmcgY29tYW5kcyAqLwotCSBpZiAoIDAgLyppbnRlbC0+ZG9QYWdlRmxpcCovICkgeyAvKiBkb1BhZ2VGbGlwIGlzIG5ldmVyIHNldCAhISEgKi8KLQkgICAgaW50ZWxQYWdlRmxpcCggZFByaXYgKTsKLQkgfSBlbHNlIHsKLQkgICAgIGludGVsQ29weUJ1ZmZlciggZFByaXYsIE5VTEwgKTsKLQkgfQotICAgICAgICAgaWYgKHNjcmVlbi0+Y3VycmVudF9yb3RhdGlvbiAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRlbFJvdGF0ZVdpbmRvdyhpbnRlbCwgZFByaXYsIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9IGVsc2UgewotICAgICAgLyogWFhYIHRoaXMgc2hvdWxkbid0IGJlIGFuIGVycm9yIGJ1dCB3ZSBjYW4ndCBoYW5kbGUgaXQgZm9yIG5vdyAqLwotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZHJhd2FibGUgaGFzIG5vIGNvbnRleHQhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgfQotfQotCi12b2lkIGludGVsQ29weVN1YkJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LAotCQkJIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoICkKLXsKLSAgIGlmIChkUHJpdi0+ZHJpQ29udGV4dFByaXYgJiYgZFByaXYtPmRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlKSB7Ci0gICAgICBpbnRlbENvbnRleHRQdHIgaW50ZWw7Ci0gICAgICBHTGNvbnRleHQgKmN0eDsKLSAgICAgIGludGVsID0gKGludGVsQ29udGV4dFB0cikgZFByaXYtPmRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOwotICAgICAgY3R4ID0gJmludGVsLT5jdHg7Ci0gICAgICBpZiAoY3R4LT5WaXN1YWwuZG91YmxlQnVmZmVyTW9kZSkgewotCSBkcm1fY2xpcF9yZWN0X3QgcmVjdDsKLQkgcmVjdC54MSA9IHggKyBkUHJpdi0+eDsKLQkgcmVjdC55MSA9IChkUHJpdi0+aCAtIHkgLSBoKSArIGRQcml2LT55OwotCSByZWN0LngyID0gcmVjdC54MSArIHc7Ci0JIHJlY3QueTIgPSByZWN0LnkxICsgaDsKLQkgX21lc2Ffbm90aWZ5U3dhcEJ1ZmZlcnMoIGN0eCApOyAgLyogZmx1c2ggcGVuZGluZyByZW5kZXJpbmcgY29tYW5kcyAqLwotCSBpbnRlbENvcHlCdWZmZXIoIGRQcml2LCAmcmVjdCApOwotICAgICAgfQotICAgfSBlbHNlIHsKLSAgICAgIC8qIFhYWCB0aGlzIHNob3VsZG4ndCBiZSBhbiBlcnJvciBidXQgd2UgY2FuJ3QgaGFuZGxlIGl0IGZvciBub3cgKi8KLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGRyYXdhYmxlIGhhcyBubyBjb250ZXh0IVxuIiwgX19GVU5DVElPTl9fKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfY29udGV4dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjdhMWNiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfY29udGV4dC5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX2NvbnRleHQuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9jb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTAxMDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9jb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBJTlRFTENPTlRFWFRfSU5DCi0jZGVmaW5lIElOVEVMQ09OVEVYVF9JTkMKLQotCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJkcm0uaCIKLSNpbmNsdWRlICJtbS5oIgotI2luY2x1ZGUgInRleG1lbS5oIgotI2luY2x1ZGUgInZibGFuay5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCi0jaW5jbHVkZSAiaTkxNV9kcm0uaCIKLSNpbmNsdWRlICJpODMwX2NvbW1vbi5oIgotI2luY2x1ZGUgInRubC90X3ZlcnRleC5oIgotCi0jZGVmaW5lIFRBRyh4KSBpbnRlbCMjeAotI2luY2x1ZGUgInRubF9kZC90X2RkX3ZlcnRleC5oIgotI3VuZGVmIFRBRwotCi0jZGVmaW5lIERWX1BGXzU1NSAgKDE8PDgpCi0jZGVmaW5lIERWX1BGXzU2NSAgKDI8PDgpCi0jZGVmaW5lIERWX1BGXzg4ODggKDM8PDgpCi0KLSNkZWZpbmUgSU5URUxfQ09OVEVYVChjdHgpCSgoaW50ZWxDb250ZXh0UHRyKShjdHgpKQotCi10eXBlZGVmIHN0cnVjdCBpbnRlbF9jb250ZXh0IGludGVsQ29udGV4dDsKLXR5cGVkZWYgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsQ29udGV4dFB0cjsKLXR5cGVkZWYgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbFRleHR1cmVPYmplY3RQdHI7Ci0KLXR5cGVkZWYgdm9pZCAoKmludGVsX3RyaV9mdW5jKShpbnRlbENvbnRleHRQdHIsIGludGVsVmVydGV4ICosIGludGVsVmVydGV4ICosCi0JCQkJCQkJICBpbnRlbFZlcnRleCAqKTsKLXR5cGVkZWYgdm9pZCAoKmludGVsX2xpbmVfZnVuYykoaW50ZWxDb250ZXh0UHRyLCBpbnRlbFZlcnRleCAqLCBpbnRlbFZlcnRleCAqKTsKLXR5cGVkZWYgdm9pZCAoKmludGVsX3BvaW50X2Z1bmMpKGludGVsQ29udGV4dFB0ciwgaW50ZWxWZXJ0ZXggKik7Ci0KLSNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIJIDB4MQotI2RlZmluZSBJTlRFTF9GQUxMQkFDS19SRUFEX0JVRkZFUgkgMHgyCi0jZGVmaW5lIElOVEVMX0ZBTExCQUNLX1VTRVIJCSAweDQKLSNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfTk9fQkFUQ0hCVUZGRVIJIDB4OAotI2RlZmluZSBJTlRFTF9GQUxMQkFDS19OT19URVhNRU0JIDB4MTAKLSNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfUkVOREVSTU9ERQkgMHgyMAotCi1leHRlcm4gdm9pZCBpbnRlbEZhbGxiYWNrKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIEdMdWludCBiaXQsIEdMYm9vbGVhbiBtb2RlICk7Ci0jZGVmaW5lIEZBTExCQUNLKCBpbnRlbCwgYml0LCBtb2RlICkgaW50ZWxGYWxsYmFjayggaW50ZWwsIGJpdCwgbW9kZSApCi0KLQotI2RlZmluZSBJTlRFTF9URVhfTUFYTEVWRUxTIDEwCi0KLQotc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0Ci17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICAgIGJhc2U7CS8qIHRoZSBwYXJlbnQgY2xhc3MgKi8KLQotICAgR0x1aW50IHRleGVsQnl0ZXM7Ci0gICBHTHVpbnQgYWdlOwotICAgR0x1aW50IFBpdGNoOwotICAgR0x1aW50IEhlaWdodDsKLSAgIEdMdWludCBUZXh0dXJlT2Zmc2V0OwotICAgR0x1Ynl0ZSAqQnVmQWRkcjsgICAKLQotICAgR0x1aW50IG1pbl9sZXZlbDsKLSAgIEdMdWludCBtYXhfbGV2ZWw7Ci0gICBHTHVpbnQgZGVwdGhfcGl0Y2g7Ci0KLSAgIHN0cnVjdCB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqaW1hZ2U7Ci0gICAgICBHTHVpbnQgb2Zmc2V0OyAgICAgICAvKiBpbnRvIEJ1ZkFkZHIgKi8KLSAgICAgIEdMdWludCBoZWlnaHQ7Ci0gICAgICBHTHVpbnQgaW50ZXJuYWxGb3JtYXQ7Ci0gICB9IGltYWdlWzZdW0lOVEVMX1RFWF9NQVhMRVZFTFNdOwotCi0gICBHTHVpbnQgZGlydHk7Ci0gICBHTHVpbnQgZmlyc3RMZXZlbCxsYXN0TGV2ZWw7Ci19OwotCi0KLXN0cnVjdCBpbnRlbF9jb250ZXh0Ci17Ci0gICBHTGNvbnRleHQgY3R4OwkJLyogdGhlIHBhcmVudCBjbGFzcyAqLwotCi0gICBzdHJ1Y3QgewotICAgICAgdm9pZCAoKmRlc3Ryb3kpKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKTsgCi0gICAgICB2b2lkICgqZW1pdF9zdGF0ZSkoIGludGVsQ29udGV4dFB0ciBpbnRlbCApOwotICAgICAgdm9pZCAoKmxvc3RfaGFyZHdhcmUpKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKTsKLSAgICAgIHZvaWQgKCp1cGRhdGVfdGV4dHVyZV9zdGF0ZSkoIGludGVsQ29udGV4dFB0ciBpbnRlbCApOwotCi0gICAgICB2b2lkICgqcmVuZGVyX3N0YXJ0KSggaW50ZWxDb250ZXh0UHRyIGludGVsICk7Ci0gICAgICB2b2lkICgqc2V0X2NvbG9yX3JlZ2lvbikoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgY29uc3QgaW50ZWxSZWdpb24gKnJlZyApOwotICAgICAgdm9pZCAoKnNldF96X3JlZ2lvbikoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgY29uc3QgaW50ZWxSZWdpb24gKnJlZyApOwotICAgICAgdm9pZCAoKnVwZGF0ZV9jb2xvcl96X3JlZ2lvbnMpKGludGVsQ29udGV4dFB0ciBpbnRlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlbFJlZ2lvbiAqY29sb3JSZWdpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZWxSZWdpb24gKmRlcHRoUmVnaW9uKTsKLSAgICAgIHZvaWQgKCplbWl0X2ZsdXNoKSggaW50ZWxDb250ZXh0UHRyIGludGVsICk7Ci0gICAgICB2b2lkICgqcmVkdWNlZF9wcmltaXRpdmVfc3RhdGUpKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIEdMZW51bSBycHJpbSApOwotCi0gICAgICBHTGJvb2xlYW4gKCpjaGVja192ZXJ0ZXhfc2l6ZSkoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0x1aW50IGV4cGVjdGVkICk7Ci0KLSAgICAgIHZvaWQgKCpjbGVhcl93aXRoX3RyaXMpKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIEdMYml0ZmllbGQgbWFzaywKLQkJCSAgICAgICBHTGJvb2xlYW4gYWxsLCAKLQkJCSAgICAgICBHTGludCBjeCwgR0xpbnQgY3ksIEdMaW50IGN3LCBHTGludCBjaCk7Ci0KLSAgICAgIHZvaWQgKCpyb3RhdGVfd2luZG93KSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsIEdMdWludCBzcmNCdWYpOwotCi0gICAgICBpbnRlbFRleHR1cmVPYmplY3RQdHIgKCphbGxvY190ZXhfb2JqKSggc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqICk7Ci0KLSAgIH0gdnRibDsKLQotICAgR0xpbnQgcmVmY291bnQ7ICAgCi0gICBHTHVpbnQgRmFsbGJhY2s7Ci0gICBHTHVpbnQgTmV3R0xTdGF0ZTsKLSAgIAotICAgc3RydWN0IHsKLSAgICAgIEdMdWludCBzdGFydF9vZmZzZXQ7Ci0gICAgICBHTGludCBzaXplOwotICAgICAgR0xpbnQgc3BhY2U7Ci0gICAgICBHTHVieXRlICpwdHI7Ci0gICAgICBHTHVpbnQgY291bnRlcjsKLSAgICAgIEdMdWludCBsYXN0X2VtaXRfc3RhdGU7Ci0gICAgICBHTGJvb2xlYW4gY29udGFpbnNfZ2VvbWV0cnk7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jOwotICAgICAgR0x1aW50IGxhc3Rfc3dhcDsKLSAgIH0gYmF0Y2g7Ci0gICAgICAKLSAgIHN0cnVjdCB7Ci0gICAgICB2b2lkICpwdHI7Ci0gICAgICBHTGludCBzaXplOwotICAgICAgR0x1aW50IG9mZnNldDsKLSAgICAgIEdMdWludCBhY3RpdmVfYnVmOwotICAgICAgR0x1aW50IGlycV9lbWl0dGVkOwotICAgfSBhbGxvYzsKLQotICAgc3RydWN0IHsKLSAgICAgIEdMdWludCBwcmltaXRpdmU7Ci0gICAgICBHTHVieXRlICpzdGFydF9wdHI7ICAgICAgCi0gICAgICB2b2lkICgqZmx1c2gpKCBHTGNvbnRleHQgKiApOwotICAgfSBwcmltOwotCi0gICBHTGJvb2xlYW4gbG9ja2VkOwotCi0gICBHTHVieXRlIGNsZWFyX3JlZDsKLSAgIEdMdWJ5dGUgY2xlYXJfZ3JlZW47Ci0gICBHTHVieXRlIGNsZWFyX2JsdWU7Ci0gICBHTHVieXRlIGNsZWFyX2FscGhhOwotICAgR0x1aW50IENsZWFyQ29sb3I7Ci0gICBHTHVpbnQgQ2xlYXJEZXB0aDsKLQotICAgR0x1aW50IGNvbG9yb2Zmc2V0OwotICAgR0x1aW50IHNwZWNvZmZzZXQ7Ci0KLSAgIC8qIFN1cHBvcnQgZm9yIGR1cGxpY2F0aW5nIFhZWlcgYXMgV1BPUyBwYXJhbWV0ZXIgKGNydXRjaCBmb3IgSTkxNSkuCi0gICAgKi8KLSAgIEdMdWludCB3cG9zX29mZnNldDsKLSAgIEdMdWludCB3cG9zX3NpemU7Ci0KLSAgIHN0cnVjdCB0bmxfYXR0cl9tYXAgdmVydGV4X2F0dHJzW1ZFUlRfQVRUUklCX01BWF07Ci0gICBHTHVpbnQgdmVydGV4X2F0dHJfY291bnQ7Ci0KLSAgIEdMZmxvYXQgZGVwdGhfc2NhbGU7Ci0gICBHTGZsb2F0IHBvbHlnb25fb2Zmc2V0X3NjYWxlOyAvKiBkZXBlbmRlbnQgb24gZGVwdGhfc2NhbGUsIGJwcCAqLwotICAgR0x1aW50IGRlcHRoX2NsZWFyX21hc2s7Ci0gICBHTHVpbnQgc3RlbmNpbF9jbGVhcl9tYXNrOwotCi0gICBHTGJvb2xlYW4gaHdfc3RlbmNpbDsKLSAgIEdMYm9vbGVhbiBod19zdGlwcGxlOwotICAgCi0gICAvKiBUZXh0dXJlIG9iamVjdCBib29ra2VlcGluZwotICAgICovCi0gICBHTHVpbnQgICAgICAgICAgICAgICAgbnJfaGVhcHM7Ci0gICBkcmlUZXhIZWFwICAgICAgICAgICogdGV4dHVyZV9oZWFwc1sxXTsKLSAgIGRyaVRleHR1cmVPYmplY3QgICAgICBzd2FwcGVkOwotICAgR0x1aW50ICAgICAgICAgICAgICAgIGxhc3RTdGFtcDsKLQotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICpDdXJyZW50VGV4T2JqW01BWF9URVhUVVJFX1VOSVRTXTsKLQotICAgLyogU3RhdGUgZm9yIGludGVsdmIuYyBhbmQgaW50ZWx0cmlzLmMuCi0gICAgKi8KLSAgIEdMdWludCBSZW5kZXJJbmRleDsKLSAgIEdMbWF0cml4IFZpZXdwb3J0TWF0cml4OwotICAgR0xlbnVtIHJlbmRlcl9wcmltaXRpdmU7Ci0gICBHTGVudW0gcmVkdWNlZF9wcmltaXRpdmU7Ci0gICBHTHVpbnQgdmVydGV4X3NpemU7Ci0gICB1bnNpZ25lZCBjaGFyICp2ZXJ0czsJICAgLyogcG9pbnRzIHRvIHRubC0+Y2xpcHNwYWNlLnZlcnRleF9idWYgKi8KLQotCi0gICAvKiBGYWxsYmFjayByYXN0ZXJpemF0aW9uIGZ1bmN0aW9ucyAKLSAgICAqLwotICAgaW50ZWxfcG9pbnRfZnVuYyBkcmF3X3BvaW50OwotICAgaW50ZWxfbGluZV9mdW5jIGRyYXdfbGluZTsKLSAgIGludGVsX3RyaV9mdW5jIGRyYXdfdHJpOwotCi0gICAvKiBEcmF3aW5nIGJ1ZmZlciBzdGF0ZQotICAgICovCi0gICBpbnRlbFJlZ2lvbiAqZHJhd1JlZ2lvbjsgIC8qIGN1cnJlbnQgZHJhd2luZyBidWZmZXIgKi8KLSAgIGludGVsUmVnaW9uICpyZWFkUmVnaW9uOyAgLyogY3VycmVudCByZWFkaW5nIGJ1ZmZlciAqLwotCi0gICBpbnQgZHJhd1g7CQkJLyogb3JpZ2luIG9mIGRyYXdhYmxlIGluIGRyYXcgYnVmZmVyICovCi0gICBpbnQgZHJhd1k7Ci0gICBHTHVpbnQgbnVtQ2xpcFJlY3RzOwkJLyogY2xpcHJlY3RzIGZvciB0aGF0IGJ1ZmZlciAqLwotICAgZHJtX2NsaXBfcmVjdF90ICpwQ2xpcFJlY3RzOwotCi0gICBpbnQgZGlydHlBZ2U7Ci0gICBpbnQgcGVyZl9ib3hlczsKLQotICAgR0x1aW50IGRvX3VzbGVlcHM7Ci0gICBpbnQgZG9faXJxczsKLSAgIEdMdWludCBpcnFzRW1pdHRlZDsKLSAgIGRybV9pOTE1X2lycV93YWl0X3QgaXc7Ci0KLSAgIEdMYm9vbGVhbiBzY2lzc29yOwotICAgZHJtX2NsaXBfcmVjdF90IGRyYXdfcmVjdDsKLSAgIGRybV9jbGlwX3JlY3RfdCBzY2lzc29yX3JlY3Q7Ci0KLSAgIGRybV9jb250ZXh0X3QgaEhXQ29udGV4dDsKLSAgIGRybUxvY2sgKmRyaUh3TG9jazsKLSAgIGludCBkcmlGZDsKLQotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaURyYXdhYmxlOwotICAgX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JlZW47Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuOyAKLSAgIGRybUk4MzBTYXJlYSAqc2FyZWE7IAotCi0gICAvKioKLSAgICAqIENvbmZpZ3VyYXRpb24gY2FjaGUKLSAgICAqLwotICAgZHJpT3B0aW9uQ2FjaGUgb3B0aW9uQ2FjaGU7Ci0KLSAgIC8qIFZCSQotICAgICovCi0gICBHTHVpbnQgdmJsX3NlcTsKLSAgIEdMdWludCB2YmxhbmtfZmxhZ3M7Ci0KLSAgIGludDY0X3Qgc3dhcF91c3Q7Ci0gICBpbnQ2NF90IHN3YXBfbWlzc2VkX3VzdDsKLQotICAgR0x1aW50IHN3YXBfY291bnQ7Ci0gICBHTHVpbnQgc3dhcF9taXNzZWRfY291bnQ7Ci0KLSAgIEdMdWludCBzd2FwX3NjaGVkdWxlZDsKLX07Ci0KLQotI2RlZmluZSBERUJVR19MT0NLSU5HCTEKLQotI2lmIERFQlVHX0xPQ0tJTkcKLWV4dGVybiBjaGFyICpwcmV2TG9ja0ZpbGU7Ci1leHRlcm4gaW50IHByZXZMb2NrTGluZTsKLQotI2RlZmluZSBERUJVR19MT0NLKCkJCQkJCQkJXAotICAgZG8gewkJCQkJCQkJCVwKLSAgICAgIHByZXZMb2NrRmlsZSA9IChfX0ZJTEVfXyk7CQkJCQlcCi0gICAgICBwcmV2TG9ja0xpbmUgPSAoX19MSU5FX18pOwkJCQkJXAotICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUJVR19SRVNFVCgpCQkJCQkJCVwKLSAgIGRvIHsJCQkJCQkJCQlcCi0gICAgICBwcmV2TG9ja0ZpbGUgPSAwOwkJCQkJCQlcCi0gICAgICBwcmV2TG9ja0xpbmUgPSAwOwkJCQkJCQlcCi0gICB9IHdoaWxlICgwKQotCi0vKiBTbGlnaHRseSBsZXNzIGJyb2tlbiB3YXkgb2YgZGV0ZWN0aW5nIHJlY3Vyc2l2ZSBsb2NraW5nIGluIGEKLSAqIHRocmVhZGVkIGVudmlyb25tZW50LiAgVGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIG1ha2UKLSAqIHByZXZMb2NrRmlsZSwgcHJldkxvY2tMaW5lIHRocmVhZC1sb2NhbC4KLSAqCi0gKiBUaGlzIHRlY2huaXF1ZSBpbnN0ZWFkIGNoZWNrcyB0byBzZWUgaWYgdGhlIHNhbWUgY29udGV4dCBpcwotICogcmVxdWVzdGluZyB0aGUgbG9jayB0d2ljZSAtLSB0aGlzIHdpbGwgbm90IGNhdGNoIGFwcGxpY2F0aW9uCi0gKiBicmVha2FnZXMgd2hlcmUgdGhlIHNhbWUgY29udGV4dCBpcyBhY3RpdmUgaW4gdHdvIGRpZmZlcmVudCB0aHJlYWRzCi0gKiBhdCBvbmNlLCBidXQgaXQgd2lsbCBjYXRjaCBkcml2ZXIgYnJlYWthZ2VzIChyZWN1cnNpdmUgbG9ja2luZykgaW4KLSAqIHRocmVhZGVkIGFwcHMuCi0gKi8KLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTE9DSygpCQkJCQkJXAotICAgZG8gewkJCQkJCQkJCVwKLSAgICAgIGlmICggKigodm9sYXRpbGUgaW50ICopaW50ZWwtPmRyaUh3TG9jaykgPT0gCQkJXAotCSAgIChEUk1fTE9DS19IRUxEIHwgaW50ZWwtPmhIV0NvbnRleHQpICkgewkJCVwKLQkgZnByaW50Ziggc3RkZXJyLAkJCQkJCVwKLQkJICAiTE9DSyBTRVQhXG5cdFByZXZpb3VzICVzOiVkXG5cdEN1cnJlbnQ6ICVzOiVkXG4iLAlcCi0JCSAgcHJldkxvY2tGaWxlLCBwcmV2TG9ja0xpbmUsIF9fRklMRV9fLCBfX0xJTkVfXyApOwlcCi0JIGFib3J0KCk7CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICB9IHdoaWxlICgwKQotCi0jZWxzZQotCi0jZGVmaW5lIERFQlVHX0xPQ0soKQotI2RlZmluZSBERUJVR19SRVNFVCgpCi0jZGVmaW5lIERFQlVHX0NIRUNLX0xPQ0soKQotCi0jZW5kaWYKLQotCi0KLQotLyogTG9jayB0aGUgaGFyZHdhcmUgYW5kIHZhbGlkYXRlIG91ciBzdGF0ZS4gIAotICovCi0jZGVmaW5lIExPQ0tfSEFSRFdBUkUoIGludGVsICkJCQkJXAotZG8gewkJCQkJCQlcCi0gICAgY2hhciBfX3JldD0wOwkJCQkJXAotICAgIERFQlVHX0NIRUNLX0xPQ0soKTsJCQkJCVwKLSAgICBhc3NlcnQoIShpbnRlbCktPmxvY2tlZCk7CQkJCVwKLSAgICBpZiAoKGludGVsKS0+c3dhcF9zY2hlZHVsZWQpIHsJCQlcCi0gICAgICAgIGRybVZCbGFuayB2Ymw7CQkJCQlcCi0gICAgICAgIHZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX0FCU09MVVRFOwkJXAotICAgICAgICBpZiAoKGludGVsKS0+dmJsYW5rX2ZsYWdzICYJCQlcCi0gICAgICAgICAgICBWQkxBTktfRkxBR19TRUNPTkRBUlkpIHsJCQlcCi0gICAgICAgICAgICB2YmwucmVxdWVzdC50eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOwlcCi0gICAgICAgIH0JCQkJCQlcCi0gICAgICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gKGludGVsKS0+dmJsX3NlcTsJXAotICAgICAgICBkcm1XYWl0VkJsYW5rKChpbnRlbCktPmRyaUZkLCAmdmJsKTsJCVwKLSAgICAgICAgKGludGVsKS0+c3dhcF9zY2hlZHVsZWQgPSAwOwkJCVwKLSAgICB9CQkJCQkJCVwKLSAgICBEUk1fQ0FTKChpbnRlbCktPmRyaUh3TG9jaywgKGludGVsKS0+aEhXQ29udGV4dCwJXAotICAgICAgICAoRFJNX0xPQ0tfSEVMRHwoaW50ZWwpLT5oSFdDb250ZXh0KSwgX19yZXQpOwlcCi0gICAgaWYgKF9fcmV0KQkJCQkJCVwKLSAgICAgICAgaW50ZWxHZXRMb2NrKCAoaW50ZWwpLCAwICk7CQkJXAotICAgICAgREVCVUdfTE9DSygpOwkJCQkJXAotICAgIChpbnRlbCktPmxvY2tlZCA9IDE7CQkJCVwKLX13aGlsZSAoMCkKLSAKLSAgCi0gIC8qIFVubG9jayB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGdsb2JhbCBjdXJyZW50IGNvbnRleHQgCi0gICAqLwotI2RlZmluZSBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgIGludGVsLT5sb2NrZWQgPSAwOwkJCQkJCQlcCi0gICBpZiAoMCkgeyAJCQkJCQkJCVwKLSAgICAgIGludGVsLT5wZXJmX2JveGVzIHw9IGludGVsLT5zYXJlYS0+cGVyZl9ib3hlczsgIAkJCVwKLSAgICAgIGludGVsLT5zYXJlYS0+cGVyZl9ib3hlcyA9IDA7CQkJCQlcCi0gICB9CQkJCQkJCQkJXAotICAgRFJNX1VOTE9DSygoaW50ZWwpLT5kcmlGZCwgKGludGVsKS0+ZHJpSHdMb2NrLCAoaW50ZWwpLT5oSFdDb250ZXh0KTsJXAotICAgREVCVUdfUkVTRVQoKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotCi0jZGVmaW5lIFNVQlBJWEVMX1ggMC4xMjUKLSNkZWZpbmUgU1VCUElYRUxfWSAwLjEyNQotCi0jZGVmaW5lIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCkJCVwKLWRvIHsJCQkJCQlcCi0gICBpZiAoKGludGVsKS0+cHJpbS5mbHVzaCkJCQlcCi0gICAgICAoaW50ZWwpLT5wcmltLmZsdXNoKCYoaW50ZWwpLT5jdHgpOwkJXAotfSB3aGlsZSAoMCkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29sb3IgcGFja2luZzoKLSAqLwotCi0jZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjQ0NDQocixnLGIsYSkgXAotICAoKCgoYSkgJiAweGYwKSA8PCA4KSB8ICgoKHIpICYgMHhmMCkgPDwgNCkgfCAoKGcpICYgMHhmMCkgfCAoKGIpID4+IDQpKQotCi0jZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjE1NTUocixnLGIsYSkgXAotICAoKCgocikgJiAweGY4KSA8PCA3KSB8ICgoKGcpICYgMHhmOCkgPDwgMikgfCAoKChiKSAmIDB4ZjgpID4+IDMpIHwgXAotICAgICgoYSkgPyAweDgwMDAgOiAwKSkKLQotI2RlZmluZSBJTlRFTF9QQUNLQ09MT1I1NjUocixnLGIpIFwKLSAgKCgoKHIpICYgMHhmOCkgPDwgOCkgfCAoKChnKSAmIDB4ZmMpIDw8IDMpIHwgKCgoYikgJiAweGY4KSA+PiAzKSkKLQotI2RlZmluZSBJTlRFTF9QQUNLQ09MT1I4ODg4KHIsZyxiLGEpIFwKLSAgKChhPDwyNCkgfCAocjw8MTYpIHwgKGc8PDgpIHwgYikKLQotCi0jZGVmaW5lIElOVEVMX1BBQ0tDT0xPUihmb3JtYXQsIHIsICBnLCAgYiwgYSkJCVwKLShmb3JtYXQgPT0gRFZfUEZfNTU1ID8gSU5URUxfUEFDS0NPTE9SMTU1NShyLGcsYixhKSA6CVwKLSAoZm9ybWF0ID09IERWX1BGXzU2NSA/IElOVEVMX1BBQ0tDT0xPUjU2NShyLGcsYikgOglcCi0gIChmb3JtYXQgPT0gRFZfUEZfODg4OCA/IElOVEVMX1BBQ0tDT0xPUjg4ODgocixnLGIsYSkgOglcCi0gICAwKSkpCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGcm9tIGxpbnV4IGtlcm5lbCBpMzg2IGhlYWRlciBmaWxlcywgY29wZXMgd2l0aCBvZGQgc2l6ZXMgYmV0dGVyCi0gKiB0aGFuIENPUFlfRFdPUkRTIHdvdWxkOgotICovCi0jaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQotc3RhdGljIF9faW5saW5lX18gdm9pZCAqIF9fbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQotewotICAgaW50IGQwLCBkMSwgZDI7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSAgICAgICJyZXAgOyBtb3ZzbFxuXHQiCi0gICAgICAidGVzdGIgJDIsJWI0XG5cdCIKLSAgICAgICJqZSAxZlxuXHQiCi0gICAgICAibW92c3dcbiIKLSAgICAgICIxOlx0dGVzdGIgJDEsJWI0XG5cdCIKLSAgICAgICJqZSAyZlxuXHQiCi0gICAgICAibW92c2JcbiIKLSAgICAgICIyOiIKLSAgICAgIDogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQotICAgICAgOiIwIiAobi80KSwgInEiIChuKSwiMSIgKChsb25nKSB0byksIjIiICgobG9uZykgZnJvbSkKLSAgICAgIDogIm1lbW9yeSIpOwotICAgcmV0dXJuICh0byk7Ci19Ci0jZWxzZQotI2RlZmluZSBfX21lbWNweShhLGIsYykgbWVtY3B5KGEsYixjKQotI2VuZGlmCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBEZWJ1Z2dpbmc6Ci0gKi8KLSNkZWZpbmUgRE9fREVCVUcJCTEKLSNpZiBET19ERUJVRwotZXh0ZXJuIGludCBJTlRFTF9ERUJVRzsKLSNlbHNlCi0jZGVmaW5lIElOVEVMX0RFQlVHCQkwCi0jZW5kaWYKLQotI2RlZmluZSBERUJVR19URVhUVVJFCTB4MQotI2RlZmluZSBERUJVR19TVEFURQkweDIKLSNkZWZpbmUgREVCVUdfSU9DVEwJMHg0Ci0jZGVmaW5lIERFQlVHX1BSSU1TCTB4OAotI2RlZmluZSBERUJVR19WRVJUUwkweDEwCi0jZGVmaW5lIERFQlVHX0ZBTExCQUNLUwkweDIwCi0jZGVmaW5lIERFQlVHX1ZFUkJPU0UJMHg0MAotI2RlZmluZSBERUJVR19EUkkgICAgICAgMHg4MAotI2RlZmluZSBERUJVR19ETUEgICAgICAgMHgxMDAKLSNkZWZpbmUgREVCVUdfU0FOSVRZICAgIDB4MjAwCi0jZGVmaW5lIERFQlVHX1NZTkMgICAgICAweDQwMAotI2RlZmluZSBERUJVR19TTEVFUCAgICAgMHg4MDAKLSNkZWZpbmUgREVCVUdfUElYRUwgICAgIDB4MTAwMAotCi0KLSNkZWZpbmUgUENJX0NISVBfODQ1X0cJCQkweDI1NjIKLSNkZWZpbmUgUENJX0NISVBfSTgzMF9NCQkJMHgzNTc3Ci0jZGVmaW5lIFBDSV9DSElQX0k4NTVfR00JCTB4MzU4MgotI2RlZmluZSBQQ0lfQ0hJUF9JODY1X0cJCQkweDI1NzIKLSNkZWZpbmUgUENJX0NISVBfSTkxNV9HCQkJMHgyNTgyCi0jZGVmaW5lIFBDSV9DSElQX0k5MTVfR00JCTB4MjU5MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0cJCQkweDI3NzIKLSNkZWZpbmUgUENJX0NISVBfSTk0NV9HTQkJMHgyN0EyCi0jZGVmaW5lIFBDSV9DSElQX0k5NDVfR01FCQkweDI3QUUKLSNkZWZpbmUgUENJX0NISVBfRzMzX0cJCQkweDI5QzIKLSNkZWZpbmUgUENJX0NISVBfUTM1X0cJCQkweDI5QjIKLSNkZWZpbmUgUENJX0NISVBfUTMzX0cJCQkweDI5RDIKLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBpbnRlbF9jb250ZXh0LmM6Ci0gKi8KLQotZXh0ZXJuIHZvaWQgaW50ZWxJbml0RHJpdmVyRnVuY3Rpb25zKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOwotCi1leHRlcm4gR0xib29sZWFuIGludGVsSW5pdENvbnRleHQoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgCi0JCQkJICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbWVzYVZpcywKLQkJCQkgICBfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdiwKLQkJCQkgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSwKLQkJCQkgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOwotCi1leHRlcm4gdm9pZCBpbnRlbEdldExvY2soaW50ZWxDb250ZXh0UHRyIGludGVsLCBHTHVpbnQgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaW50ZWxTZXRCYWNrQ2xpcFJlY3RzKGludGVsQ29udGV4dFB0ciBpbnRlbCk7Ci1leHRlcm4gdm9pZCBpbnRlbFNldEZyb250Q2xpcFJlY3RzKGludGVsQ29udGV4dFB0ciBpbnRlbCk7Ci1leHRlcm4gdm9pZCBpbnRlbFdpbmRvd01vdmVkKCBpbnRlbENvbnRleHRQdHIgaW50ZWwgKTsKLQotZXh0ZXJuIGNvbnN0IEdMdWJ5dGUgKmludGVsR2V0U3RyaW5nKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG5hbWUgKTsKLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBpbnRlbF9zdGF0ZS5jOgotICovCi1leHRlcm4gdm9pZCBpbnRlbEluaXRTdGF0ZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOwotCi0jZGVmaW5lIENPTVBBUkVGVU5DX0FMV0FZUwkJMAotI2RlZmluZSBDT01QQVJFRlVOQ19ORVZFUgkJMHgxCi0jZGVmaW5lIENPTVBBUkVGVU5DX0xFU1MJCTB4MgotI2RlZmluZSBDT01QQVJFRlVOQ19FUVVBTAkJMHgzCi0jZGVmaW5lIENPTVBBUkVGVU5DX0xFUVVBTAkJMHg0Ci0jZGVmaW5lIENPTVBBUkVGVU5DX0dSRUFURVIJCTB4NQotI2RlZmluZSBDT01QQVJFRlVOQ19OT1RFUVVBTAkJMHg2Ci0jZGVmaW5lIENPTVBBUkVGVU5DX0dFUVVBTAkJMHg3Ci0KLSNkZWZpbmUgU1RFTkNJTE9QX0tFRVAJCQkwCi0jZGVmaW5lIFNURU5DSUxPUF9aRVJPCQkJMHgxCi0jZGVmaW5lIFNURU5DSUxPUF9SRVBMQUNFCQkweDIKLSNkZWZpbmUgU1RFTkNJTE9QX0lOQ1JTQVQJCTB4MwotI2RlZmluZSBTVEVOQ0lMT1BfREVDUlNBVAkJMHg0Ci0jZGVmaW5lIFNURU5DSUxPUF9JTkNSCQkJMHg1Ci0jZGVmaW5lIFNURU5DSUxPUF9ERUNSCQkJMHg2Ci0jZGVmaW5lIFNURU5DSUxPUF9JTlZFUlQJCTB4NwotCi0jZGVmaW5lIExPR0lDT1BfQ0xFQVIJCQkwCi0jZGVmaW5lIExPR0lDT1BfTk9SCQkJMHgxCi0jZGVmaW5lIExPR0lDT1BfQU5EX0lOViAJCTB4MgotI2RlZmluZSBMT0dJQ09QX0NPUFlfSU5WCQkweDMKLSNkZWZpbmUgTE9HSUNPUF9BTkRfUlZSU0UJCTB4NAotI2RlZmluZSBMT0dJQ09QX0lOVgkJCTB4NQotI2RlZmluZSBMT0dJQ09QX1hPUgkJCTB4NgotI2RlZmluZSBMT0dJQ09QX05BTkQJCQkweDcKLSNkZWZpbmUgTE9HSUNPUF9BTkQJCQkweDgKLSNkZWZpbmUgTE9HSUNPUF9FUVVJVgkJCTB4OQotI2RlZmluZSBMT0dJQ09QX05PT1AJCQkweGEKLSNkZWZpbmUgTE9HSUNPUF9PUl9JTlYJCQkweGIKLSNkZWZpbmUgTE9HSUNPUF9DT1BZCQkJMHhjCi0jZGVmaW5lIExPR0lDT1BfT1JfUlZSU0UJCTB4ZAotI2RlZmluZSBMT0dJQ09QX09SCQkJMHhlCi0jZGVmaW5lIExPR0lDT1BfU0VUCQkJMHhmCi0KLSNkZWZpbmUgQkxFTkRGQUNUX1pFUk8JCQkweDAxCi0jZGVmaW5lIEJMRU5ERkFDVF9PTkUJCQkweDAyCi0jZGVmaW5lIEJMRU5ERkFDVF9TUkNfQ09MUgkJMHgwMwotI2RlZmluZSBCTEVOREZBQ1RfSU5WX1NSQ19DT0xSIAkJMHgwNAotI2RlZmluZSBCTEVOREZBQ1RfU1JDX0FMUEhBCQkweDA1Ci0jZGVmaW5lIEJMRU5ERkFDVF9JTlZfU1JDX0FMUEhBIAkweDA2Ci0jZGVmaW5lIEJMRU5ERkFDVF9EU1RfQUxQSEEJCTB4MDcKLSNkZWZpbmUgQkxFTkRGQUNUX0lOVl9EU1RfQUxQSEEgCTB4MDgKLSNkZWZpbmUgQkxFTkRGQUNUX0RTVF9DT0xSCQkweDA5Ci0jZGVmaW5lIEJMRU5ERkFDVF9JTlZfRFNUX0NPTFIJCTB4MGEKLSNkZWZpbmUgQkxFTkRGQUNUX1NSQ19BTFBIQV9TQVRVUkFURQkweDBiCi0jZGVmaW5lIEJMRU5ERkFDVF9DT05TVF9DT0xPUgkJMHgwYwotI2RlZmluZSBCTEVOREZBQ1RfSU5WX0NPTlNUX0NPTE9SCTB4MGQKLSNkZWZpbmUgQkxFTkRGQUNUX0NPTlNUX0FMUEhBCQkweDBlCi0jZGVmaW5lIEJMRU5ERkFDVF9JTlZfQ09OU1RfQUxQSEEJMHgwZgotI2RlZmluZSBCTEVOREZBQ1RfTUFTSyAgICAgICAgICAJMHgwZgotCi0KLWV4dGVybiBpbnQgaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyggR0xlbnVtIGZ1bmMgKTsKLWV4dGVybiBpbnQgaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoIEdMZW51bSBvcCApOwotZXh0ZXJuIGludCBpbnRlbF90cmFuc2xhdGVfYmxlbmRfZmFjdG9yKCBHTGVudW0gZmFjdG9yICk7Ci1leHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9sb2dpY19vcCggR0xlbnVtIG9wY29kZSApOwotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIGludGVsX2lvY3RsLmM6Ci0gKi8KLWV4dGVybiB2b2lkIGludGVsX2R1bXBfYmF0Y2hidWZmZXIoIGxvbmcgb2Zmc2V0LAotCQkJCSAgICBpbnQgKnB0ciwKLQkJCQkgICAgaW50IGNvdW50ICk7Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogaW50ZWxfcGl4ZWwuYzoKLSAqLwkKLWV4dGVybiB2b2lkIGludGVsSW5pdFBpeGVsRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci0KLQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9kZWNvZGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjY3MWI2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfZGVjb2RlLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfZGVjb2RlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2RlcHRoc3RlbmNpbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9kZXB0aHN0ZW5jaWwuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YWM0YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9kZXB0aHN0ZW5jaWwuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9kZXB0aHN0ZW5jaWwuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfZmJvLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2Ziby5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmExOWY4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX2Ziby5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX2Ziby5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9taXBtYXBfdHJlZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9taXBtYXBfdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI0MmZlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX21pcG1hcF90cmVlLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfbWlwbWFwX3RyZWUuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwMzBkNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAiZW51bXMuaCIKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCi0KLSNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKLSNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgotCi0KLQotc3RhdGljIEdMYm9vbGVhbgotY2hlY2tfY29sb3IoIGNvbnN0IEdMY29udGV4dCAqY3R4LCBHTGVudW0gdHlwZSwgR0xlbnVtIGZvcm1hdCwKLQkgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFja2luZywKLQkgICAgIGNvbnN0IHZvaWQgKnBpeGVscywgR0xpbnQgc3osIEdMaW50IHBpdGNoICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLSAgIEdMdWludCBjcHAgPSBpbnRlbC0+aW50ZWxTY3JlZW4tPmNwcDsKLQotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBpZiAoCShwaXRjaCAmIDYzKSB8fAotCWN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSB8fAotCXBhY2tpbmctPlN3YXBCeXRlcyB8fAotCXBhY2tpbmctPkxzYkZpcnN0KSB7Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLQkgZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIDFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICB9Ci0KLSAgIGlmICggdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgJiYgCi0JY3BwID09IDQgJiYgCi0JZm9ybWF0ID09IEdMX0JHUkEgKSB7Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLQkgZnByaW50ZihzdGRlcnIsICIlczogcGFzc2VkIDJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gR0xfVFJVRTsKLSAgIH0KLQotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIHJldHVybiBHTF9GQUxTRTsKLX0KLQotc3RhdGljIEdMYm9vbGVhbgotY2hlY2tfY29sb3JfcGVyX2ZyYWdtZW50X29wcyggY29uc3QgR0xjb250ZXh0ICpjdHggKQotewotICAgaW50IHJlc3VsdDsKLSAgIHJlc3VsdCA9ICghKCAgICAgY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQgfHwgCi0JCSAgICBjdHgtPkRlcHRoLlRlc3QgfHwKLQkJICAgIGN0eC0+Rm9nLkVuYWJsZWQgfHwKLQkJICAgIGN0eC0+U2Npc3Nvci5FbmFibGVkIHx8Ci0JCSAgICBjdHgtPlN0ZW5jaWwuRW5hYmxlZCB8fAotCQkgICAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrWzBdIHx8Ci0JCSAgICAhY3R4LT5Db2xvci5Db2xvck1hc2tbMV0gfHwKLQkJICAgICFjdHgtPkNvbG9yLkNvbG9yTWFza1syXSB8fAotCQkgICAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrWzNdIHx8Ci0JCSAgICBjdHgtPkNvbG9yLkNvbG9yTG9naWNPcEVuYWJsZWQgfHwKLQkJICAgIGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzCi0gICAgICAgICAgICkgJiYKLQkgICBjdHgtPkN1cnJlbnQuUmFzdGVyUG9zVmFsaWQpOwotICAgCi0gICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogQ2xpcCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIGFnYWluc3QgdGhlIGJ1ZmZlcidzIGJvdW5kcyAoaW5jbHVkaW5nIHNjaXNzb3IpLgotICogXHBhcmFtIHNpemUgcmV0dXJucyB0aGUgCi0gKiBccmV0dXJuIEdMX1RSVUUgaWYgYW55IHBpeGVscyByZW1haW4sIEdMX0ZBTFNFIGlmIHRvdGFsbHkgY2xpcHBlZC4KLSAqCi0gKiBYWFggUmVwbGFjZSB0aGlzIHdpdGggX21lc2FfY2xpcF9kcmF3cGl4ZWxzKCkgYW5kIF9tZXNhX2NsaXBfcmVhZHBpeGVscygpCi0gKiBmcm9tIE1lc2EgNi40LiAgV2Ugc2hvdWxkbid0IGFwcGx5IHNjaXNzb3IgZm9yIFJlYWRQaXhlbHMuCi0gKi8KLXN0YXRpYyBHTGJvb2xlYW4KLWNsaXBfcGl4ZWxyZWN0KCBjb25zdCBHTGNvbnRleHQgKmN0eCwKLQkJY29uc3QgR0xmcmFtZWJ1ZmZlciAqYnVmZmVyLAotCQlHTGludCAqeCwgR0xpbnQgKnksCi0JCUdMc2l6ZWkgKndpZHRoLCBHTHNpemVpICpoZWlnaHQpCi17Ci0gICAvKiBsZWZ0IGNsaXBwaW5nICovCi0gICBpZiAoKnggPCBidWZmZXItPl9YbWluKSB7Ci0gICAgICAqd2lkdGggLT0gKGJ1ZmZlci0+X1htaW4gLSAqeCk7Ci0gICAgICAqeCA9IGJ1ZmZlci0+X1htaW47Ci0gICB9Ci0KLSAgIC8qIHJpZ2h0IGNsaXBwaW5nICovCi0gICBpZiAoKnggKyAqd2lkdGggPiBidWZmZXItPl9YbWF4KQotICAgICAgKndpZHRoIC09ICgqeCArICp3aWR0aCAtIGJ1ZmZlci0+X1htYXggLSAxKTsKLQotICAgaWYgKCp3aWR0aCA8PSAwKQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotCi0gICAvKiBib3R0b20gY2xpcHBpbmcgKi8KLSAgIGlmICgqeSA8IGJ1ZmZlci0+X1ltaW4pIHsKLSAgICAgICpoZWlnaHQgLT0gKGJ1ZmZlci0+X1ltaW4gLSAqeSk7Ci0gICAgICAqeSA9IGJ1ZmZlci0+X1ltaW47Ci0gICB9Ci0KLSAgIC8qIHRvcCBjbGlwcGluZyAqLwotICAgaWYgKCp5ICsgKmhlaWdodCA+IGJ1ZmZlci0+X1ltYXgpCi0gICAgICAqaGVpZ2h0IC09ICgqeSArICpoZWlnaHQgLSBidWZmZXItPl9ZbWF4IC0gMSk7Ci0KLSAgIGlmICgqaGVpZ2h0IDw9IDApCi0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KLS8qKgotICogQ29tcHV0ZSBpbnRlcnNlY3Rpb24gb2YgYSBjbGlwcGluZyByZWN0YW5nbGUgYW5kIHBpeGVsIHJlY3RhbmdsZSwKLSAqIHJldHVybmluZyByZXN1bHRzIGluIHgveS93L2hPdXQgdmFycy4KLSAqIFxyZXR1cm4gR0xfVFJVRSBpZiB0aGVyZSdzIGludGVyc2VjdGlvbiwgR0xfRkFMU0UgaWYgZGlzam9pbnQuCi0gKi8KLXN0YXRpYyBJTkxJTkUgR0xib29sZWFuCi1pbnRlcnNlY3RfcmVnaW9uKGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94LAotCQkgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCSBHTGludCAqeE91dCwgR0xpbnQgKnlPdXQsIEdMaW50ICp3T3V0LCBHTGludCAqaE91dCkKLXsKLSAgIEdMaW50IGJ4ID0gYm94LT54MTsKLSAgIEdMaW50IGJ5ID0gYm94LT55MTsKLSAgIEdMaW50IGJ3ID0gYm94LT54MiAtIGJ4OwotICAgR0xpbnQgYmggPSBib3gtPnkyIC0gYnk7Ci0KLSAgIGlmIChieCA8IHgpIGJ3IC09IHggLSBieCwgYnggPSB4OwotICAgaWYgKGJ5IDwgeSkgYmggLT0geSAtIGJ5LCBieSA9IHk7Ci0gICBpZiAoYnggKyBidyA+IHggKyB3aWR0aCkgYncgPSB4ICsgd2lkdGggLSBieDsKLSAgIGlmIChieSArIGJoID4geSArIGhlaWdodCkgYmggPSB5ICsgaGVpZ2h0IC0gYnk7Ci0KLSAgICp4T3V0ID0gYng7Ci0gICAqeU91dCA9IGJ5OwotICAgKndPdXQgPSBidzsKLSAgICpoT3V0ID0gYmg7Ci0KLSAgIGlmIChidyA8PSAwKSByZXR1cm4gR0xfRkFMU0U7Ci0gICBpZiAoYmggPD0gMCkgcmV0dXJuIEdMX0ZBTFNFOwotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotCi0KLXN0YXRpYyBHTGJvb2xlYW4KLWludGVsVHJ5UmVhZFBpeGVscyggR0xjb250ZXh0ICpjdHgsCi0JCSAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCSAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCi0JCSAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNrLAotCQkgIEdMdm9pZCAqcGl4ZWxzICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLSAgIEdMaW50IHNpemUgPSAwOyAvKiBub3QgcmVhbGx5IHVzZWQgKi8KLSAgIEdMaW50IHBpdGNoID0gcGFjay0+Um93TGVuZ3RoID8gcGFjay0+Um93TGVuZ3RoIDogd2lkdGg7Ci0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgLyogT25seSBhY2NlbGVyYXRlIHJlYWRpbmcgdG8gYWdwIGJ1ZmZlcnMuCi0gICAgKi8KLSAgIGlmICggIWludGVsSXNBZ3BNZW1vcnkoaW50ZWwsIHBpeGVscywgCi0JCQlwaXRjaCAqIGhlaWdodCAqIGludGVsLT5pbnRlbFNjcmVlbi0+Y3BwICkgKSB7Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLQkgZnByaW50ZihzdGRlcnIsICIlczogZGVzdCBub3QgYWdwXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICAvKiBOZWVkIEdMX1BBQ0tfSU5WRVJUX01FU0EgdG8gY29wZSB3aXRoIHVwc2lkZWRvd24gcmVzdWx0cyBmcm9tCi0gICAgKiBibGl0dGVyOgotICAgICovCi0gICBpZiAoIXBhY2stPkludmVydCkgewotICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCi0JIGZwcmludGYoc3RkZXJyLCAiJXM6IE1FU0FfUEFDS19JTlZFUlQgbm90IHNldFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLQotICAgaWYgKCFjaGVja19jb2xvcihjdHgsIHR5cGUsIGZvcm1hdCwgcGFjaywgcGl4ZWxzLCBzaXplLCBwaXRjaCkpCi0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0KLSAgIHN3aXRjaCAoIGludGVsLT5pbnRlbFNjcmVlbi0+Y3BwICkgewotICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0KLSAgIC8qIEFsdGhvdWdoIHRoZSBibGl0cyBnbyBvbiB0aGUgY29tbWFuZCBidWZmZXIsIG5lZWQgdG8gZG8gdGhpcyBhbmQKLSAgICAqIGZpcmUgd2l0aCBsb2NrIGhlbGQgdG8gZ3VhcmVudGVlIGNsaXByZWN0cyBhbmQgZHJhd2luZyBvZmZzZXQgYXJlCi0gICAgKiBjb3JyZWN0LgotICAgICoKLSAgICAqIFRoaXMgaXMgYW4gdW51c3VhbCBzaXR1YXRpb24gaG93ZXZlciwgYXMgdGhlIGNvZGUgd2hpY2ggZmx1c2hlcwotICAgICogYSBmdWxsIGNvbW1hbmQgYnVmZmVyIGV4cGVjdHMgdG8gYmUgY2FsbGVkIHVubG9ja2VkLiAgQXMgYQotICAgICogd29ya2Fyb3VuZCwgaW1tZWRpYXRlbHkgZmx1c2ggdGhlIGJ1ZmZlciBvbiBhcXVpcmluZyB0aGUgbG9jay4KLSAgICAqLwotICAgaW50ZWxGbHVzaCggJmludGVsLT5jdHggKTsKLSAgIExPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICB7Ci0gICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0gICAgICBpbnQgbmJveCA9IGRQcml2LT5udW1DbGlwUmVjdHM7Ci0gICAgICBpbnQgc3JjX29mZnNldCA9IGludGVsLT5yZWFkUmVnaW9uLT5vZmZzZXQ7Ci0gICAgICBpbnQgc3JjX3BpdGNoID0gaW50ZWwtPmludGVsU2NyZWVuLT5mcm9udC5waXRjaDsKLSAgICAgIGludCBkc3Rfb2Zmc2V0ID0gaW50ZWxBZ3BPZmZzZXRGcm9tVmlydHVhbCggaW50ZWwsIHBpeGVscyk7Ci0gICAgICBkcm1fY2xpcF9yZWN0X3QgKmJveCA9IGRQcml2LT5wQ2xpcFJlY3RzOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGFzc2VydChkc3Rfb2Zmc2V0ICE9IH4wKTsgIC8qIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGFib3ZlICovCi0KLSAgICAgIGlmICghY2xpcF9waXhlbHJlY3QoY3R4LCBjdHgtPlJlYWRCdWZmZXIsICZ4LCAmeSwgJndpZHRoLCAmaGVpZ2h0KSkgewotCSBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0JIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIHRvdGFsbHkgY2xpcHBlZCAtLSBub3RoaW5nIHRvIGRvXG4iLAotCQkgICAgX19GVU5DVElPTl9fKTsKLQkgcmV0dXJuIEdMX1RSVUU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbnZlcnQgdG8gc2NyZWVuIGNvb3JkcyAoeT0wPXRvcCkgKi8KLSAgICAgIHkgPSBkUHJpdi0+aCAtIHkgLSBoZWlnaHQ7Ci0gICAgICB4ICs9IGRQcml2LT54OwotICAgICAgeSArPSBkUHJpdi0+eTsKLQotICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCi0JIGZwcmludGYoc3RkZXJyLCAicmVhZHBpeGVsIGJsaXQgc3JjX3BpdGNoICVkIGRzdF9waXRjaCAlZFxuIiwKLQkJIHNyY19waXRjaCwgcGl0Y2gpOwotCi0gICAgICAvKiBXZSBkb24ndCByZWFsbHkgaGF2ZSB0byBkbyB3aW5kb3cgY2xpcHBpbmcgZm9yIHJlYWRwaXhlbHMuCi0gICAgICAgKiBUaGUgT3BlbkdMIHNwZWMgc2F5cyB0aGF0IHBpeGVscyByZWFkIGZyb20gb3V0c2lkZSB0aGUKLSAgICAgICAqIHZpc2libGUgd2luZG93IHJlZ2lvbiAocGl4ZWwgb3duZXJzaGlwKSBoYXZlIHVuZGVmaW5lZCB2YWx1ZS4KLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMCA7IGkgPCBuYm94IDsgaSsrKQotICAgICAgewotICAgICAgICAgR0xpbnQgYngsIGJ5LCBidywgYmg7Ci0gICAgICAgICBpZiAoaW50ZXJzZWN0X3JlZ2lvbihib3graSwgeCwgeSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieCwgJmJ5LCAmYncsICZiaCkpIHsKLSAgICAgICAgICAgIGludGVsRW1pdENvcHlCbGl0TG9ja2VkKCBpbnRlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPmNwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGl0Y2gsIHNyY19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsIGRzdF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYngsIGJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4IC0geCwgYnkgLSB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LCBiaCApOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgaW50ZWxGaW5pc2goICZpbnRlbC0+Y3R4ICk7Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgdm9pZAotaW50ZWxSZWFkUGl4ZWxzKCBHTGNvbnRleHQgKmN0eCwKLQkJIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotCQkgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCi0JCSBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssCi0JCSBHTHZvaWQgKnBpeGVscyApCi17Ci0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGlmICghaW50ZWxUcnlSZWFkUGl4ZWxzKCBjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzKSkKLSAgICAgIF9zd3Jhc3RfUmVhZFBpeGVscyggY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBhY2ssIAotCQkJICBwaXhlbHMpOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBkb19kcmF3X3BpeCggR0xjb250ZXh0ICpjdHgsCi0JCQkgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCQkgR0xpbnQgcGl0Y2gsCi0JCQkgY29uc3Qgdm9pZCAqcGl4ZWxzLAotCQkJIEdMdWludCBkZXN0ICkKLXsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKLSAgIGRybV9jbGlwX3JlY3RfdCAqYm94ID0gZFByaXYtPnBDbGlwUmVjdHM7Ci0gICBpbnQgbmJveCA9IGRQcml2LT5udW1DbGlwUmVjdHM7Ci0gICBpbnQgaTsKLSAgIGludCBzcmNfb2Zmc2V0ID0gaW50ZWxBZ3BPZmZzZXRGcm9tVmlydHVhbCggaW50ZWwsIHBpeGVscyk7Ci0gICBpbnQgc3JjX3BpdGNoID0gcGl0Y2g7Ci0KLSAgIGFzc2VydChzcmNfb2Zmc2V0ICE9IH4wKTsgIC8qIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciAqLwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgaWYgKGN0eC0+RHJhd0J1ZmZlcikKLSAgIHsKLSAgICAgIHkgLT0gaGVpZ2h0OwkJCS8qIGNvcGUgd2l0aCBwaXhlbCB6b29tICovCi0gICAKLSAgICAgIGlmICghY2xpcF9waXhlbHJlY3QoY3R4LCBjdHgtPkRyYXdCdWZmZXIsCi0JCQkgICZ4LCAmeSwgJndpZHRoLCAmaGVpZ2h0KSkgewotCSBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0JIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgeSA9IGRQcml2LT5oIC0geSAtIGhlaWdodDsgCS8qIGNvbnZlcnQgZnJvbSBnbCB0byBoYXJkd2FyZSBjb29yZHMgKi8KLSAgICAgIHggKz0gZFByaXYtPng7Ci0gICAgICB5ICs9IGRQcml2LT55OwotCi0gICAgICBmb3IgKGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKQotICAgICAgewotCSBHTGludCBieCwgYnksIGJ3LCBiaDsKLQkgaWYgKGludGVyc2VjdF9yZWdpb24oYm94ICsgaSwgeCwgeSwgd2lkdGgsIGhlaWdodCwKLQkJCSAgICAgICZieCwgJmJ5LCAmYncsICZiaCkpIHsKLSAgICAgICAgICAgIGludGVsRW1pdENvcHlCbGl0TG9ja2VkKCBpbnRlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPmNwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGl0Y2gsIHNyY19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT5mcm9udC5waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+ZHJhd1JlZ2lvbi0+b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4IC0geCwgYnkgLSB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4LCBieSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidywgYmggKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIFVOTE9DS19IQVJEV0FSRSggaW50ZWwgKTsKLSAgIGludGVsRmluaXNoKCAmaW50ZWwtPmN0eCApOwotfQotCi0KLQotc3RhdGljIEdMYm9vbGVhbgotaW50ZWxUcnlEcmF3UGl4ZWxzKCBHTGNvbnRleHQgKmN0eCwKLQkJICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLQkJICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLQkJICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKLQkJICBjb25zdCBHTHZvaWQgKnBpeGVscyApCi17Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKGN0eCk7Ci0gICBHTGludCBwaXRjaCA9IHVucGFjay0+Um93TGVuZ3RoID8gdW5wYWNrLT5Sb3dMZW5ndGggOiB3aWR0aDsKLSAgIEdMdWludCBkZXN0OwotICAgR0x1aW50IGNwcCA9IGludGVsLT5pbnRlbFNjcmVlbi0+Y3BwOwotICAgR0xpbnQgc2l6ZSA9IHdpZHRoICogcGl0Y2ggKiBjcHA7Ci0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgIGNhc2UgR0xfUkdCOgotICAgY2FzZSBHTF9SR0JBOgotICAgY2FzZSBHTF9CR1JBOgotICAgICAgZGVzdCA9IGludGVsLT5kcmF3UmVnaW9uLT5vZmZzZXQ7Ci0KLSAgICAgIC8qIFBsYW5lbWFzayBkb2Vzbid0IGhhdmUgZnVsbCBzdXBwb3J0IGluIGJsaXRzLgotICAgICAgICovCi0gICAgICBpZiAoIWN0eC0+Q29sb3IuQ29sb3JNYXNrW1JDT01QXSB8fAotCSAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrW0dDT01QXSB8fAotCSAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrW0JDT01QXSB8fAotCSAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrW0FDT01QXSkgewotCSBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKLQkgICAgZnByaW50ZihzdGRlcnIsICIlczogcGxhbmVtYXNrXG4iLCBfX0ZVTkNUSU9OX18pOwotCSByZXR1cm4gR0xfRkFMU0U7CQotICAgICAgfQotCi0gICAgICAvKiBDYW4ndCBkbyBjb252ZXJzaW9ucyBvbiBhZ3AgcmVhZHMvZHJhd3MuIAotICAgICAgICovCi0gICAgICBpZiAoICFpbnRlbElzQWdwTWVtb3J5KCBpbnRlbCwgcGl4ZWxzLCBzaXplICkgKSB7Ci0JIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBub3QgYWdwIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKLQkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgfQotCi0gICAgICBpZiAoIWNoZWNrX2NvbG9yKGN0eCwgdHlwZSwgZm9ybWF0LCB1bnBhY2ssIHBpeGVscywgc2l6ZSwgcGl0Y2gpKSB7Ci0JIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIH0KLSAgICAgIGlmICghY2hlY2tfY29sb3JfcGVyX2ZyYWdtZW50X29wcyhjdHgpKSB7Ci0JIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIH0KLQotICAgICAgaWYgKGN0eC0+UGl4ZWwuWm9vbVggIT0gMS4wRiB8fAotCSAgY3R4LT5QaXhlbC5ab29tWSAhPSAtMS4wRikKLQkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgYnJlYWs7Ci0KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICB9Ci0KLSAgIGlmICggaW50ZWxJc0FncE1lbW9yeShpbnRlbCwgcGl4ZWxzLCBzaXplKSApCi0gICB7Ci0gICAgICBkb19kcmF3X3BpeCggY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgcGl4ZWxzLCBkZXN0ICk7Ci0gICAgICByZXR1cm4gR0xfVFJVRTsKLSAgIH0KLSAgIGVsc2UgaWYgKDApCi0gICB7Ci0gICAgICAvKiBQaXhlbHMgaXMgaW4gcmVndWxhciBtZW1vcnkgLS0gZ2V0IGRtYSBidWZmZXJzIGFuZCBwZXJmb3JtCi0gICAgICAgKiB1cGxvYWQgdGhyb3VnaCB0aGVtLiAgTm8gcG9pbnQgZG9pbmcgdGhpcyBmb3IgcmVndWxhciB1cGxvYWRzCi0gICAgICAgKiBidXQgb25jZSB3ZSByZW1vdmUgc29tZSBvZiB0aGUgcmVzdHJpY3Rpb25zIGFib3ZlIChjb2xvcm1hc2ssCi0gICAgICAgKiBwaXhlbGZvcm1hdCBjb252ZXJzaW9uLCB6b29tPywgZXRjKSwgdGhpcyBjb3VsZCBiZSBhIHdpbi4KLSAgICAgICAqLwotICAgfQotICAgZWxzZQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotCi0gICByZXR1cm4gR0xfRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnRlbERyYXdQaXhlbHMoIEdMY29udGV4dCAqY3R4LAotCQkgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCSBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLQkJIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAotCQkgY29uc3QgR0x2b2lkICpwaXhlbHMgKQotewotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBpZiAoaW50ZWxUcnlEcmF3UGl4ZWxzKCBjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFjaywgcGl4ZWxzICkpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCA9PSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fVGV4RW52UHJvZ3JhbSkgewotICAgICAgLyoKLSAgICAgICAqIFdlIGRvbid0IHdhbnQgdGhlIGk5MTUgdGV4ZW52IHByb2dyYW0gdG8gYmUgYXBwbGllZCB0byBEcmF3UGl4ZWxzLgotICAgICAgICogVGhpcyBpcyByZWFsbHkganVzdCBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiAobWVzYSB3aWxsIG90aGVyLQotICAgICAgICogd2lzZSBoYXBwaWx5IHJ1biB0aGUgZnJhZ21lbnQgcHJvZ3JhbSBvbiBlYWNoIHBpeGVsIGluIHRoZSBpbWFnZSkuCi0gICAgICAgKi8KLSAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcFNhdmUgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKLSAgIC8qIGNhbid0IGp1c3Qgc2V0IGN1cnJlbnQgZnJhZyBwcm9nIHRvIDAgaGVyZSBhcyBvbiBidWZmZXIgcmVzaXplCi0gICAgICB3ZSdsbCBnZXQgbmV3IHN0YXRlIGNoZWNrcyB3aGljaCB3aWxsIHNlZ2ZhdWx0LiBSZW1haW5zIGEgaGFjay4gKi8KLSAgICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50ID0gTlVMTDsKLSAgICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9Vc2VUZXhFbnZQcm9ncmFtID0gR0xfRkFMU0U7Ci0gICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQWN0aXZlID0gR0xfRkFMU0U7Ci0gICAgICBfc3dyYXN0X0RyYXdQaXhlbHMoIGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2ssIHBpeGVscyApOwotICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQgPSBmcFNhdmU7Ci0gICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fVXNlVGV4RW52UHJvZ3JhbSA9IEdMX1RSVUU7Ci0gICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQWN0aXZlID0gR0xfVFJVRTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgX3N3cmFzdF9EcmF3UGl4ZWxzKCBjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrLCBwaXhlbHMgKTsKLSAgIH0KLX0KLQotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnQgZ2xDb3B5UGl4ZWxzIGZvciB0aGUgZnJvbnQgY29sb3IgYnVmZmVyIChvciBiYWNrIGJ1ZmZlciBQaXhtYXApCi0gKiBmb3IgdGhlIGNvbG9yIGJ1ZmZlci4gIERvbid0IHN1cHBvcnQgem9vbWluZywgcGl4ZWwgdHJhbnNmZXIsIGV0Yy4KLSAqIFdlIGRvIHN1cHBvcnQgY29weWluZyBmcm9tIG9uZSB3aW5kb3cgdG8gYW5vdGhlciwgYWxhIGdsWE1ha2VDdXJyZW50UmVhZC4KLSAqLwotc3RhdGljIHZvaWQKLWludGVsQ29weVBpeGVscyggR0xjb250ZXh0ICpjdHgsCi0JCSBHTGludCBzcmN4LCBHTGludCBzcmN5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLQkJIEdMaW50IGRlc3R4LCBHTGludCBkZXN0eSwgR0xlbnVtIHR5cGUgKQotewotI2lmIDAKLSAgIGNvbnN0IFhNZXNhQ29udGV4dCB4bWVzYSA9IFhNRVNBX0NPTlRFWFQoY3R4KTsKLSAgIGNvbnN0IFNXY29udGV4dCAqc3dyYXN0ID0gU1dSQVNUX0NPTlRFWFQoIGN0eCApOwotICAgWE1lc2FEaXNwbGF5ICpkcHkgPSB4bWVzYS0+eG1fdmlzdWFsLT5kaXNwbGF5OwotICAgY29uc3QgWE1lc2FEcmF3YWJsZSBkcmF3QnVmZmVyID0geG1lc2EtPnhtX2RyYXdfYnVmZmVyLT5idWZmZXI7Ci0gICBjb25zdCBYTWVzYURyYXdhYmxlIHJlYWRCdWZmZXIgPSB4bWVzYS0+eG1fcmVhZF9idWZmZXItPmJ1ZmZlcjsKLSAgIGNvbnN0IFhNZXNhR0MgZ2MgPSB4bWVzYS0+eG1fZHJhd19idWZmZXItPmdjOwotCi0gICBBU1NFUlQoZHB5KTsKLSAgIEFTU0VSVChnYyk7Ci0KLSAgIGlmIChkcmF3QnVmZmVyICYmICAvKiBidWZmZXIgIT0gMCBtZWFucyBpdCdzIGEgV2luZG93IG9yIFBpeG1hcCAqLwotICAgICAgIHJlYWRCdWZmZXIgJiYKLSAgICAgICB0eXBlID09IEdMX0NPTE9SICYmCi0gICAgICAgKHN3cmFzdC0+X1Jhc3Rlck1hc2sgJiB+Q0xJUF9CSVQpID09IDAgJiYgLyogbm8gYmxlbmQsIHotdGVzdCwgZXRjICovCi0gICAgICAgY3R4LT5fSW1hZ2VUcmFuc2ZlclN0YXRlID09IDAgJiYgIC8qIG5vIGNvbG9yIHRhYmxlcywgc2NhbGUvYmlhcywgZXRjICovCi0gICAgICAgY3R4LT5QaXhlbC5ab29tWCA9PSAxLjAgJiYgICAgICAgIC8qIG5vIHpvb21pbmcgKi8KLSAgICAgICBjdHgtPlBpeGVsLlpvb21ZID09IDEuMCkgewotICAgICAgLyogTm90ZTogd2UgZG9uJ3QgZG8gYW55IHNwZWNpYWwgY2xpcHBpbmcgd29yayBoZXJlLiAgV2UgY291bGQsCi0gICAgICAgKiBidXQgWCB3aWxsIGRvIGl0IGZvciB1cy4KLSAgICAgICAqLwotICAgICAgc3JjeSA9IEZMSVAoeG1lc2EtPnhtX3JlYWRfYnVmZmVyLCBzcmN5KSAtIGhlaWdodCArIDE7Ci0gICAgICBkZXN0eSA9IEZMSVAoeG1lc2EtPnhtX2RyYXdfYnVmZmVyLCBkZXN0eSkgLSBoZWlnaHQgKyAxOwotICAgICAgWENvcHlBcmVhKGRweSwgcmVhZEJ1ZmZlciwgZHJhd0J1ZmZlciwgZ2MsCi0gICAgICAgICAgICAgICAgc3JjeCwgc3JjeSwgd2lkdGgsIGhlaWdodCwgZGVzdHgsIGRlc3R5KTsKLSAgIH0KLSNlbHNlCi0gICBfc3dyYXN0X0NvcHlQaXhlbHMoY3R4LCBzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0eCwgZGVzdHksIHR5cGUgKTsKLSNlbmRpZgotfQotCi0KLQotCi12b2lkIGludGVsSW5pdFBpeGVsRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLSAgIGZ1bmN0aW9ucy0+Q29weVBpeGVscyA9IGludGVsQ29weVBpeGVsczsKLSAgIGlmICghZ2V0ZW52KCJJTlRFTF9OT19CTElUUyIpKSB7Ci0gICAgICBmdW5jdGlvbnMtPlJlYWRQaXhlbHMgPSBpbnRlbFJlYWRQaXhlbHM7ICAKLSAgICAgIGZ1bmN0aW9ucy0+RHJhd1BpeGVscyA9IGludGVsRHJhd1BpeGVsczsgCi0gICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDczM2M1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWwuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9waXhlbC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9waXhlbF9iaXRtYXAuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWxfYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTA4NWM3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWxfYml0bWFwLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfcGl4ZWxfYml0bWFwLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX2NvcHkuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWxfY29weS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVlNDMzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX2NvcHkuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9waXhlbF9jb3B5LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX2RyYXcuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWxfZHJhdy5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjg0MzFhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX2RyYXcuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9waXhlbF9kcmF3LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX3JlYWQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcGl4ZWxfcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDk1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3BpeGVsX3JlYWQuYwpAQCAtMCwwICsxLDMwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImdsaGVhZGVyLmgiCisjaW5jbHVkZSAiZW51bXMuaCIKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJpbWFnZS5oIgorI2luY2x1ZGUgImJ1ZmZlcm9iai5oIgorI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKKworI2luY2x1ZGUgImludGVsX3NjcmVlbi5oIgorI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfcGl4ZWwuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgorCisvKiBGb3IgbWFueSBhcHBsaWNhdGlvbnMsIHRoZSBuZXcgYWJpbGl0eSB0byBwdWxsIHRoZSBzb3VyY2UgYnVmZmVycworICogYmFjayBvdXQgb2YgdGhlIEdUVCBhbmQgdGhlbiBkbyB0aGUgcGFja2luZy9jb252ZXJzaW9uIG9wZXJhdGlvbnMKKyAqIGluIHNvZnR3YXJlIHdpbGwgYmUgYXMgbXVjaCBvZiBhbiBpbXByb3ZlbWVudCBhcyB0cnlpbmcgdG8gZ2V0IHRoZQorICogYmxpdHRlciBhbmQvb3IgdGV4dHVyZSBlbmdpbmUgdG8gZG8gdGhlIHdvcmsuIAorICoKKyAqIFRoaXMgc3RlcCBpcyBnYXRlZCBvbiBwcml2YXRlIGJhY2tidWZmZXJzLgorICogCisgKiBPYnZpb3VzbHkgdGhlIGZyb250YnVmZmVyIGNhbid0IGJlIHB1bGxlZCBiYWNrLCBzbyB0aGF0IGlzIGVpdGhlcgorICogYW4gYXJndW1lbnQgZm9yIGJsaXQvdGV4dHVyZSByZWFkcGl4ZWxzLCBvciBmb3IgYmxpdHRpbmcgdG8gYQorICogdGVtcG9yYXJ5IGFuZCB0aGVuIHB1bGxpbmcgdGhhdCBiYWNrLgorICoKKyAqIFdoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIGEgcGJvLCBob3dldmVyLCBpdCdzIG5vdCBjbGVhciBpZiBpdCBpcworICogZXZlciBnb2luZyB0byBiZSBwdWxsZWQgdG8gbWFpbiBtZW1vcnkgKHRob3VnaCB0aGUgYWNjZXNzIHBhcmFtCisgKiB3aWxsIGJlIGEgZ29vZCBoaW50KS4gIFNvIGl0IHNvdW5kcyBsaWtlIHdlIGRvIHdhbnQgdG8gYmUgYWJsZSB0bworICogY2hvb3NlIGJldHdlZW4gYmxpdC90ZXh0dXJlIGltcGxlbWVudGF0aW9uIG9uIHRoZSBncHUgYW5kIHB1bGxiYWNrCisgKiBhbmQgY3B1LWJhc2VkIGNvcHlpbmcuCisgKgorICogVW5sZXNzIHlvdSBjYW4gbWFnaWNhbGx5IHR1cm4gY2xpZW50IG1lbW9yeSBpbnRvIGEgUEJPIGZvciB0aGUKKyAqIGR1cmF0aW9uIG9mIHRoaXMgY2FsbCwgdGhlcmUgd2lsbCBiZSBhIGNwdS1iYXNlZCBjb3B5aW5nIHN0ZXAgaW4KKyAqIGFueSBjYXNlLgorICovCisKKworc3RhdGljIEdMYm9vbGVhbgorZG9fdGV4dHVyZV9yZWFkcGl4ZWxzKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVzdF9yZWdpb24pCit7CisjaWYgMAorICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgaW50ZWxTY3JlZW5Qcml2YXRlICpzY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47CisgICBHTGludCBwaXRjaCA9IHBhY2stPlJvd0xlbmd0aCA/IHBhY2stPlJvd0xlbmd0aCA6IHdpZHRoOworICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOworICAgaW50IHRleHR1cmVGb3JtYXQ7CisgICBHTGVudW0gZ2xUZXh0dXJlRm9ybWF0OworICAgaW50IGRlc3RGb3JtYXQsIGRlcHRoRm9ybWF0LCBkZXN0UGl0Y2g7CisgICBkcm1fY2xpcF9yZWN0X3QgdG1wOworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKworICAgaWYgKGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSB8fAorICAgICAgIHBhY2stPlN3YXBCeXRlcyB8fCBwYWNrLT5Mc2JGaXJzdCB8fCAhcGFjay0+SW52ZXJ0KSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNoZWNrX2NvbG9yIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaW50ZWwtPnZ0YmwubWV0YV90ZXhyZWN0X3NvdXJjZShpbnRlbCwgaW50ZWxfcmVhZGJ1Zl9yZWdpb24oaW50ZWwpKTsKKworICAgaWYgKCFpbnRlbC0+dnRibC5tZXRhX3JlbmRlcl9kZXN0KGludGVsLCBkZXN0X3JlZ2lvbiwgdHlwZSwgZm9ybWF0KSkgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjb3VsZG4ndCBzZXQgZGVzdCAlcy8lc1xuIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucih0eXBlKSwKKyAgICAgICAgICAgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoZm9ybWF0KSk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlLT5udW1DbGlwUmVjdHMpIHsKKyAgICAgIGludGVsLT52dGJsLmluc3RhbGxfbWV0YV9zdGF0ZShpbnRlbCk7CisgICAgICBpbnRlbC0+dnRibC5tZXRhX25vX2RlcHRoX3dyaXRlKGludGVsKTsKKyAgICAgIGludGVsLT52dGJsLm1ldGFfbm9fc3RlbmNpbF93cml0ZShpbnRlbCk7CisKKyAgICAgIGlmICghZHJpQ2xpcFJlY3RUb0ZyYW1lYnVmZmVyKGN0eC0+UmVhZEJ1ZmZlciwgJngsICZ5LCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworICAgICAgICAgU0VUX1NUQVRFKGk4MzAsIHN0YXRlKTsKKyAgICAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2xpcHJlY3QgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICB9CisKKyAgICAgIHkgPSBkUHJpdi0+aCAtIHkgLSBoZWlnaHQ7CisgICAgICB4ICs9IGRQcml2LT54OworICAgICAgeSArPSBkUHJpdi0+eTsKKworCisgICAgICAvKiBTZXQgdGhlIGZyb250YnVmZmVyIHVwIGFzIGEgbGFyZ2UgcmVjdGFuZ3VsYXIgdGV4dHVyZS4KKyAgICAgICAqLworICAgICAgaW50ZWwtPnZ0YmwubWV0YV90ZXhfcmVjdF9zb3VyY2UoaW50ZWwsIHNyY19yZWdpb24sIHRleHR1cmVGb3JtYXQpOworCisKKyAgICAgIGludGVsLT52dGJsLm1ldGFfdGV4dHVyZV9ibGVuZF9yZXBsYWNlKGk4MzAsIGdsVGV4dHVyZUZvcm1hdCk7CisKKworICAgICAgLyogU2V0IHRoZSAzZCBlbmdpbmUgdG8gZHJhdyBpbnRvIHRoZSBkZXN0aW5hdGlvbiByZWdpb246CisgICAgICAgKi8KKworICAgICAgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X3JlZ2lvbihpbnRlbCwgZGVzdF9yZWdpb24pOworICAgICAgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X2Zvcm1hdChpbnRlbCwgZGVzdEZvcm1hdCwgZGVwdGhGb3JtYXQpOyAgICAgLyogPz8gKi8KKworCisgICAgICAvKiBEcmF3IGEgc2luZ2xlIHF1YWQsIG5vIGNsaXByZWN0czoKKyAgICAgICAqLworICAgICAgaW50ZWwtPnZ0YmwubWV0YV9kaXNhYmxlX2NsaXByZWN0cyhpbnRlbCk7CisKKyAgICAgIGludGVsLT52dGJsLmRyYXdfcXVhZChpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB3aWR0aCwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZjAwZmYsIHgsIHggKyB3aWR0aCwgeSwgeSArIGhlaWdodCk7CisKKyAgICAgIGludGVsLT52dGJsLmxlYXZlX21ldGFfc3RhdGUoaW50ZWwpOworICAgfQorICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaW50ZWxfcmVnaW9uX3dhaXRfZmVuY2UoY3R4LCBkZXN0X3JlZ2lvbik7ICAgLyogcmVxdWlyZWQgYnkgR0wgKi8KKyAgIHJldHVybiBHTF9UUlVFOworI2VuZGlmCisKKyAgIHJldHVybiBHTF9GQUxTRTsKK30KKworCisKKworc3RhdGljIEdMYm9vbGVhbgorZG9fYmxpdF9yZWFkcGl4ZWxzKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssIEdMdm9pZCAqIHBpeGVscykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnNyYyA9IGludGVsX3JlYWRidWZfcmVnaW9uKGludGVsKTsKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICpkc3QgPSBpbnRlbF9idWZmZXJfb2JqZWN0KHBhY2stPkJ1ZmZlck9iaik7CisgICBHTHVpbnQgZHN0X29mZnNldDsKKyAgIEdMdWludCByb3dMZW5ndGg7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorICAgICAgX21lc2FfcHJpbnRmKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKCFzcmMpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGlmIChkc3QpIHsKKyAgICAgIC8qIFhYWCBUaGlzIHZhbGlkYXRpb24gc2hvdWxkIGJlIGRvbmUgYnkgY29yZSBtZXNhOgorICAgICAgICovCisgICAgICBpZiAoIV9tZXNhX3ZhbGlkYXRlX3Bib19hY2Nlc3MoMiwgcGFjaywgd2lkdGgsIGhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscykpIHsKKyAgICAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICJnbERyYXdQaXhlbHMiKTsKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBQQk8gb25seSBmb3Igbm93OgorICAgICAgICovCisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBub3QgUEJPXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisKKyAgIGlmIChjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgfHwKKyAgICAgICAhaW50ZWxfY2hlY2tfYmxpdF9mb3JtYXQoc3JjLCBmb3JtYXQsIHR5cGUpKSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBiYWQgZm9ybWF0IGZvciBibGl0XG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAocGFjay0+QWxpZ25tZW50ICE9IDEgfHwgcGFjay0+U3dhcEJ5dGVzIHx8IHBhY2stPkxzYkZpcnN0KSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXM6IGJhZCBwYWNraW5nIHBhcmFtc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKHBhY2stPlJvd0xlbmd0aCA+IDApCisgICAgICByb3dMZW5ndGggPSBwYWNrLT5Sb3dMZW5ndGg7CisgICBlbHNlCisgICAgICByb3dMZW5ndGggPSB3aWR0aDsKKworICAgaWYgKHBhY2stPkludmVydCkgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICAgICBfbWVzYV9wcmludGYoIiVzOiBNRVNBX1BBQ0tfSU5WRVJUIG5vdCBkb25lIHlldFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgcm93TGVuZ3RoID0gLXJvd0xlbmd0aDsKKyAgIH0KKworICAgLyogWFhYIDY0LWJpdCBjYXN0PyAqLworICAgZHN0X29mZnNldCA9IChHTHVpbnQpIF9tZXNhX2ltYWdlX2FkZHJlc3MoMiwgcGFjaywgcGl4ZWxzLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCAwLCAwLCAwKTsKKworCisgICAvKiBBbHRob3VnaCB0aGUgYmxpdHMgZ28gb24gdGhlIGNvbW1hbmQgYnVmZmVyLCBuZWVkIHRvIGRvIHRoaXMgYW5kCisgICAgKiBmaXJlIHdpdGggbG9jayBoZWxkIHRvIGd1YXJlbnRlZSBjbGlwcmVjdHMgYXJlIGNvcnJlY3QuCisgICAgKi8KKyAgIGludGVsRmx1c2goJmludGVsLT5jdHgpOworICAgTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIGlmIChpbnRlbC0+ZHJpRHJhd2FibGUtPm51bUNsaXBSZWN0cykgeworICAgICAgR0xib29sZWFuIGFsbCA9ICh3aWR0aCAqIGhlaWdodCAqIHNyYy0+Y3BwID09IGRzdC0+QmFzZS5TaXplICYmCisgICAgICAgICAgICAgICAgICAgICAgIHggPT0gMCAmJiBkc3Rfb2Zmc2V0ID09IDApOworCisgICAgICBkcmlfYm8gKmRzdF9idWZmZXIgPSBpbnRlbF9idWZmZXJvYmpfYnVmZmVyKGludGVsLCBkc3QsCisJCQkJCQkgIGFsbCA/IElOVEVMX1dSSVRFX0ZVTEwgOgorCQkJCQkJICBJTlRFTF9XUklURV9QQVJUKTsKKyAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKyAgICAgIGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCAqYm94ID0gZFByaXYtPnBDbGlwUmVjdHM7CisgICAgICBkcm1fY2xpcF9yZWN0X3QgcmVjdDsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCBzcmNfcmVjdDsKKyAgICAgIGludCBpOworCisgICAgICBzcmNfcmVjdC54MSA9IGRQcml2LT54ICsgeDsKKyAgICAgIHNyY19yZWN0LnkxID0gZFByaXYtPnkgKyBkUHJpdi0+aCAtICh5ICsgaGVpZ2h0KTsKKyAgICAgIHNyY19yZWN0LngyID0gc3JjX3JlY3QueDEgKyB3aWR0aDsKKyAgICAgIHNyY19yZWN0LnkyID0gc3JjX3JlY3QueTEgKyBoZWlnaHQ7CisKKworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CisgICAgICAgICBpZiAoIWludGVsX2ludGVyc2VjdF9jbGlwcmVjdHMoJnJlY3QsICZzcmNfcmVjdCwgJmJveFtpXSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgaW50ZWxFbWl0Q29weUJsaXQoaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+cGl0Y2gsIHNyYy0+YnVmZmVyLCAwLCBzcmMtPnRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0xlbmd0aCwgZHN0X2J1ZmZlciwgZHN0X29mZnNldCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC55MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueDEgLSBzcmNfcmVjdC54MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueTIgLSBzcmNfcmVjdC55MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueDIgLSByZWN0LngxLCByZWN0LnkyIC0gcmVjdC55MSwKKwkJCSAgIEdMX0NPUFkpOworICAgICAgfQorICAgfQorICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICBfbWVzYV9wcmludGYoIiVzIC0gRE9ORVxuIiwgX19GVU5DVElPTl9fKTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3ZvaWQKK2ludGVsUmVhZFBpeGVscyhHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNrLCBHTHZvaWQgKiBwaXhlbHMpCit7CisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGludGVsRmx1c2goY3R4KTsKKworICAgaWYgKGRvX2JsaXRfcmVhZHBpeGVscworICAgICAgIChjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGFjaywgcGl4ZWxzKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGRvX3RleHR1cmVfcmVhZHBpeGVscworICAgICAgIChjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGFjaywgcGl4ZWxzKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICBfbWVzYV9wcmludGYoIiVzOiBmYWxsYmFjayB0byBzd3Jhc3RcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIF9zd3Jhc3RfUmVhZFBpeGVscyhjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGFjaywgcGl4ZWxzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVnLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMxNTMyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX0lOVEVMX1JFR19IXwotI2RlZmluZSBfSU5URUxfUkVHX0hfCi0KLQotCi0jZGVmaW5lIENNRF8zRCAoMHgzPDwyOSkKLQotCi0jZGVmaW5lIF8zRFBSSU1JVElWRSAgICAgICAgICgoMHgzPDwyOSl8KDB4MWY8PDI0KSkKLSNkZWZpbmUgUFJJTV9JTkRJUkVDVCAgICAgICAgICAgICgxPDwyMykKLSNkZWZpbmUgUFJJTV9JTkxJTkUgICAgICAgICAgICAgICgwPDwyMykKLSNkZWZpbmUgUFJJTV9JTkRJUkVDVF9TRVFVRU5USUFMICgwPDwxNykKLSNkZWZpbmUgUFJJTV9JTkRJUkVDVF9FTFRTICAgICAgICgxPDwxNykKLQotI2RlZmluZSBQUklNM0RfVFJJTElTVAkJKDB4MDw8MTgpCi0jZGVmaW5lIFBSSU0zRF9UUklTVFJJUCAJKDB4MTw8MTgpCi0jZGVmaW5lIFBSSU0zRF9UUklTVFJJUF9SVlJTRQkoMHgyPDwxOCkKLSNkZWZpbmUgUFJJTTNEX1RSSUZBTgkJKDB4Mzw8MTgpCi0jZGVmaW5lIFBSSU0zRF9QT0xZCQkoMHg0PDwxOCkKLSNkZWZpbmUgUFJJTTNEX0xJTkVMSVNUIAkoMHg1PDwxOCkKLSNkZWZpbmUgUFJJTTNEX0xJTkVTVFJJUAkoMHg2PDwxOCkKLSNkZWZpbmUgUFJJTTNEX1JFQ1RMSVNUIAkoMHg3PDwxOCkKLSNkZWZpbmUgUFJJTTNEX1BPSU5UTElTVAkoMHg4PDwxOCkKLSNkZWZpbmUgUFJJTTNEX0RJQgkJKDB4OTw8MTgpCi0jZGVmaW5lIFBSSU0zRF9NQVNLCQkoMHgxZjw8MTgpCi0KLSNkZWZpbmUgSTkxNVBBQ0tDT0xPUjQ0NDQocixnLGIsYSkgXAotICAoKCgoYSkgJiAweGYwKSA8PCA4KSB8ICgoKHIpICYgMHhmMCkgPDwgNCkgfCAoKGcpICYgMHhmMCkgfCAoKGIpID4+IDQpKQotCi0jZGVmaW5lIEk5MTVQQUNLQ09MT1IxNTU1KHIsZyxiLGEpIFwKLSAgKCgoKHIpICYgMHhmOCkgPDwgNykgfCAoKChnKSAmIDB4ZjgpIDw8IDIpIHwgKCgoYikgJiAweGY4KSA+PiAzKSB8IFwKLSAgICAoKGEpID8gMHg4MDAwIDogMCkpCi0KLSNkZWZpbmUgSTkxNVBBQ0tDT0xPUjU2NShyLGcsYikgXAotICAoKCgocikgJiAweGY4KSA8PCA4KSB8ICgoKGcpICYgMHhmYykgPDwgMykgfCAoKChiKSAmIDB4ZjgpID4+IDMpKQotCi0jZGVmaW5lIEk5MTVQQUNLQ09MT1I4ODg4KHIsZyxiLGEpIFwKLSAgKChhPDwyNCkgfCAocjw8MTYpIHwgKGc8PDgpIHwgYikKLQotCi0KLQotI2RlZmluZSBCUjAwX0JJVEJMVF9DTElFTlQgICAweDQwMDAwMDAwCi0jZGVmaW5lIEJSMDBfT1BfQ09MT1JfQkxUICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgQlIwMF9PUF9TUkNfQ09QWV9CTFQgMHgxMEMwMDAwMAotI2RlZmluZSBCUjEzX1NPTElEX1BBVFRFUk4gICAweDgwMDAwMDAwCi0KLSNkZWZpbmUgWFlfQ09MT1JfQkxUX0NNRAkJKCgyPDwyOSl8KDB4NTA8PDIyKXwweDQpCi0jZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQQkoMTw8MjEpCi0jZGVmaW5lIFhZX0NPTE9SX0JMVF9XUklURV9SR0IJCSgxPDwyMCkKLQotI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfQ01EICAgICAgICAgICAgICgoMjw8MjkpfCgweDUzPDwyMil8NikKLSNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBICAgICAoMTw8MjEpCi0jZGVmaW5lIFhZX1NSQ19DT1BZX0JMVF9XUklURV9SR0IgICAgICAgKDE8PDIwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVnaW9ucy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9yZWdpb25zLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODliMmYxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVnaW9ucy5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX3JlZ2lvbnMuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVuZGVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3JlbmRlci5jCmluZGV4IGQ5NDM4YmEuLjgzOGQ0NTAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcmVuZGVyLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9yZW5kZXIuYwpAQCAtMzksNiArMzksNyBAQAogCiAjaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgogI2luY2x1ZGUgInRubC90X3ZlcnRleC5oIgorI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCiAKICNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKICNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCkBAIC01MSwxNCArNTIsMTQgQEAKICAqIGRtYSBidWZmZXJzLiAgVXNlIHN0cmlwL2ZhbiBoYXJkd2FyZSBwcmltaXRpdmVzIHdoZXJlIHBvc3NpYmxlLgogICogVHJ5IHRvIHNpbXVsYXRlIG1pc3NpbmcgcHJpbWl0aXZlcyB3aXRoIGluZGV4ZWQgdmVydGljZXMuCiAgKi8KLSNkZWZpbmUgSEFWRV9QT0lOVFMgICAgICAwICAvKiBIYXMgaXQsIGJ1dCBjYW4ndCB1c2UgYmVjYXVzZSBzdWJwaXhlbCBoYXMgdG8KLQkJCSAgICAgKiBiZSBhZGp1c3RlZCBmb3IgcG9pbnRzIG9uIHRoZSBJTlRFTC9JODQ1RwotCQkJICAgICAqLworI2RlZmluZSBIQVZFX1BPSU5UUyAgICAgIDAgICAgICAvKiBIYXMgaXQsIGJ1dCBjYW4ndCB1c2UgYmVjYXVzZSBzdWJwaXhlbCBoYXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgYWRqdXN0ZWQgZm9yIHBvaW50cyBvbiB0aGUgSU5URUwvSTg0NUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfTElORVMgICAgICAgMQogI2RlZmluZSBIQVZFX0xJTkVfU1RSSVBTIDEKICNkZWZpbmUgSEFWRV9UUklBTkdMRVMgICAxCiAjZGVmaW5lIEhBVkVfVFJJX1NUUklQUyAgMQotI2RlZmluZSBIQVZFX1RSSV9TVFJJUF8xIDAgIC8qIGhhcyBpdCwgdGVtcGxhdGUgY2FuJ3QgdXNlIGl0IHlldCAqLworI2RlZmluZSBIQVZFX1RSSV9TVFJJUF8xIDAgICAgICAvKiBoYXMgaXQsIHRlbXBsYXRlIGNhbid0IHVzZSBpdCB5ZXQgKi8KICNkZWZpbmUgSEFWRV9UUklfRkFOUyAgICAxCiAjZGVmaW5lIEhBVkVfUE9MWUdPTlMgICAgMQogI2RlZmluZSBIQVZFX1FVQURTICAgICAgIDAKQEAgLTY2LDcgKzY3LDcgQEAKIAogI2RlZmluZSBIQVZFX0VMVFMgICAgICAgIDAKIAotc3RhdGljIEdMdWludCBod19wcmltW0dMX1BPTFlHT04rMV0gPSB7CitzdGF0aWMgdWludDMyX3QgaHdfcHJpbVtHTF9QT0xZR09OICsgMV0gPSB7CiAgICAwLAogICAgUFJJTTNEX0xJTkVMSVNULAogICAgUFJJTTNEX0xJTkVTVFJJUCwKQEAgLTc5LDcgKzgwLDcgQEAKICAgIFBSSU0zRF9QT0xZCiB9OwogCi1zdGF0aWMgY29uc3QgR0xlbnVtIHJlZHVjZWRfcHJpbVtHTF9QT0xZR09OKzFdID0geyAgCitzdGF0aWMgY29uc3QgR0xlbnVtIHJlZHVjZWRfcHJpbVtHTF9QT0xZR09OICsgMV0gPSB7CiAgICBHTF9QT0lOVFMsCiAgICBHTF9MSU5FUywKICAgIEdMX0xJTkVTLApAQCAtOTIsNTggKzkzLDYwIEBACiAgICBHTF9UUklBTkdMRVMKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfcHJpbVtHTF9QT0xZR09OKzFdID0geyAgCi0gICAwLAkJCQkvKiBmYWxsYmFjayBjYXNlICovCitzdGF0aWMgY29uc3QgaW50IHNjYWxlX3ByaW1bR0xfUE9MWUdPTiArIDFdID0geworICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsYmFjayBjYXNlICovCiAgICAxLAogICAgMiwKICAgIDIsCiAgICAxLAogICAgMywKICAgIDMsCi0gICAwLAkJCQkvKiBmYWxsYmFjayBjYXNlICovCi0gICAwLAkJCQkvKiBmYWxsYmFjayBjYXNlICovCisgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGxiYWNrIGNhc2UgKi8KKyAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbGJhY2sgY2FzZSAqLwogICAgMwogfTsKIAogCi1zdGF0aWMgdm9pZCBpbnRlbERtYVByaW1pdGl2ZSggaW50ZWxDb250ZXh0UHRyIGludGVsLCBHTGVudW0gcHJpbSApCitzdGF0aWMgdm9pZAoraW50ZWxEbWFQcmltaXRpdmUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGVudW0gcHJpbSkKIHsKLSAgIGlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIiVzICVzXG4iLCBfX0ZVTkNUSU9OX18sIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHByaW0pKTsKKyAgIGlmICgwKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihwcmltKSk7CiAgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOwotICAgaW50ZWwtPnZ0YmwucmVkdWNlZF9wcmltaXRpdmVfc3RhdGUoIGludGVsLCByZWR1Y2VkX3ByaW1bcHJpbV0gKTsKLSAgIGludGVsU3RhcnRJbmxpbmVQcmltaXRpdmUoIGludGVsLCBod19wcmltW3ByaW1dICk7CisgICBpbnRlbC0+dnRibC5yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZShpbnRlbCwgcmVkdWNlZF9wcmltW3ByaW1dKTsKKyAgIGludGVsX3NldF9wcmltKGludGVsLCBod19wcmltW3ByaW1dKTsKIH0KIAogCi0jZGVmaW5lIExPQ0FMX1ZBUlMgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpCisjZGVmaW5lIExPQ0FMX1ZBUlMgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpCiAjZGVmaW5lIElOSVQoIHByaW0gKSAJCQkJXAogZG8gewkJCQkJCVwKICAgIGludGVsRG1hUHJpbWl0aXZlKCBpbnRlbCwgcHJpbSApOwkJXAogfSB3aGlsZSAoMCkKLSNkZWZpbmUgRkxVU0goKSAgSU5URUxfRklSRVZFUlRJQ0VTKCBpbnRlbCApCiAKLSNkZWZpbmUgR0VUX1NVQlNFUVVFTlRfVkJfTUFYX1ZFUlRTKCkgXAotICAoKChpbnRlbC0+YWxsb2Muc2l6ZSAvIDIpIC0gMTUwMCkgLyAoaW50ZWwtPnZlcnRleF9zaXplKjQpKQotI2RlZmluZSBHRVRfQ1VSUkVOVF9WQl9NQVhfVkVSVFMoKSBHRVRfU1VCU0VRVUVOVF9WQl9NQVhfVkVSVFMoKQorI2RlZmluZSBGTFVTSCgpIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCkKIAotI2RlZmluZSBBTExPQ19WRVJUUyggbnIgKSBcCi0gICBpbnRlbEV4dGVuZElubGluZVByaW1pdGl2ZSggaW50ZWwsIChucikgKiBpbnRlbC0+dmVydGV4X3NpemUgKQotICAKKyNkZWZpbmUgR0VUX1NVQlNFUVVFTlRfVkJfTUFYX1ZFUlRTKCkgKElOVEVMX1ZCX1NJWkUgLyAoaW50ZWwtPnZlcnRleF9zaXplICogNCkpCisjZGVmaW5lIEdFVF9DVVJSRU5UX1ZCX01BWF9WRVJUUygpIFwKKyAgICgoSU5URUxfVkJfU0laRSAtIGludGVsLT5wcmltLmN1cnJlbnRfb2Zmc2V0KSAvIChpbnRlbC0+dmVydGV4X3NpemUgKiA0KSkKKworI2RlZmluZSBBTExPQ19WRVJUUyhucikgaW50ZWxfZ2V0X3ByaW1fc3BhY2UoaW50ZWwsIG5yKQorCiAjZGVmaW5lIEVNSVRfVkVSVFMoIGN0eCwgaiwgbnIsIGJ1ZiApIFwKLSAgX3RubF9lbWl0X3ZlcnRpY2VzX3RvX2J1ZmZlcihjdHgsIGosIChqKSsobnIpLCBidWYgKSAgCisgIF90bmxfZW1pdF92ZXJ0aWNlc190b19idWZmZXIoY3R4LCBqLCAoaikrKG5yKSwgYnVmICkKIAogI2RlZmluZSBUQUcoeCkgaW50ZWxfIyN4CiAjaW5jbHVkZSAidG5sX2RkL3RfZGRfZG1hdG1wLmgiCi0gIAotICAKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcGlwZWxpbmUgc3RhZ2UgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEhldXJpc3RpYyB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHJlbmRlciBwYXRoczogIAogICovCi1zdGF0aWMgR0xib29sZWFuIGNob29zZV9yZW5kZXIoIGludGVsQ29udGV4dFB0ciBpbnRlbCwKLQkJCQlzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgKQorc3RhdGljIEdMYm9vbGVhbgorY2hvb3NlX3JlbmRlcihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQikKIHsKICAgIGludCB2ZXJ0c3ogPSBpbnRlbC0+dmVydGV4X3NpemU7CiAgICBpbnQgY29zdF9yZW5kZXIgPSAwOwpAQCAtMTUzLDIwICsxNTYsMjAgQEAKICAgIGludCBucl9ydmVydHMgPSAwOwogICAgaW50IHJwcmltID0gaW50ZWwtPnJlZHVjZWRfcHJpbWl0aXZlOwogICAgaW50IGkgPSAwOwotICAgCi0gICBmb3IgKGkgPSAwIDsgaSA8IFZCLT5QcmltaXRpdmVDb3VudCA7IGkrKykgeworCisgICBmb3IgKGkgPSAwOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50OyBpKyspIHsKICAgICAgIEdMdWludCBwcmltID0gVkItPlByaW1pdGl2ZVtpXS5tb2RlOwogICAgICAgR0x1aW50IGxlbmd0aCA9IFZCLT5QcmltaXRpdmVbaV0uY291bnQ7CiAKICAgICAgIGlmICghbGVuZ3RoKQotCSBjb250aW51ZTsKKyAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICBucl9wcmltcysrOwogICAgICAgbnJfcnZlcnRzICs9IGxlbmd0aCAqIHNjYWxlX3ByaW1bcHJpbSAmIFBSSU1fTU9ERV9NQVNLXTsKIAogICAgICAgaWYgKHJlZHVjZWRfcHJpbVtwcmltICYgUFJJTV9NT0RFX01BU0tdICE9IHJwcmltKSB7Ci0JIG5yX3JwcmltcysrOwotCSBycHJpbSA9IHJlZHVjZWRfcHJpbVtwcmltICYgUFJJTV9NT0RFX01BU0tdOworICAgICAgICAgbnJfcnByaW1zKys7CisgICAgICAgICBycHJpbSA9IHJlZHVjZWRfcHJpbVtwcmltICYgUFJJTV9NT0RFX01BU0tdOwogICAgICAgfQogICAgfQogCkBAIC0xNzcsNjQgKzE4MCw4MiBAQAogCiAgICAvKiBPbmUgcG9pbnQgZm9yIGV2ZXJ5IDEwMjQgZHdvcmRzICg0aykgb2YgZG1hOgogICAgICovCi0gICBjb3N0X3JlbmRlciArPSAodmVydHN6ICogaSkgLyAxMDI0OyAKLSAgIGNvc3RfZmFsbGJhY2sgKz0gKHZlcnRzeiAqIG5yX3J2ZXJ0cykgLyAxMDI0OyAKKyAgIGNvc3RfcmVuZGVyICs9ICh2ZXJ0c3ogKiBpKSAvIDEwMjQ7CisgICBjb3N0X2ZhbGxiYWNrICs9ICh2ZXJ0c3ogKiBucl9ydmVydHMpIC8gMTAyNDsKIAogICAgaWYgKDApCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvc3QgcmVuZGVyOiAlZCBmYWxsYmFjazogJWRcbiIsCi0JICAgICAgY29zdF9yZW5kZXIsIGNvc3RfZmFsbGJhY2spOworICAgICAgICAgICAgICBjb3N0X3JlbmRlciwgY29zdF9mYWxsYmFjayk7CiAKLSAgIGlmIChjb3N0X3JlbmRlciA+IGNvc3RfZmFsbGJhY2spIAorICAgaWYgKGNvc3RfcmVuZGVyID4gY29zdF9mYWxsYmFjaykKICAgICAgIHJldHVybiBHTF9GQUxTRTsKIAogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKIAotc3RhdGljIEdMYm9vbGVhbiBpbnRlbF9ydW5fcmVuZGVyKCBHTGNvbnRleHQgKmN0eCwgCi0JCQkJIHN0cnVjdCB0bmxfcGlwZWxpbmVfc3RhZ2UgKnN0YWdlICkKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX3J1bl9yZW5kZXIoR0xjb250ZXh0ICogY3R4LCBzdHJ1Y3QgdG5sX3BpcGVsaW5lX3N0YWdlICpzdGFnZSkKIHsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmdG5sLT52YjsKICAgIEdMdWludCBpOwogCisgICBpbnRlbC0+dnRibC5yZW5kZXJfcHJldmFsaWRhdGUoIGludGVsICk7CisKICAgIC8qIERvbid0IGhhbmRsZSBjbGlwcGluZyBvciBpbmRleGVkIHZlcnRpY2VzLgogICAgICovCi0gICBpZiAoaW50ZWwtPlJlbmRlckluZGV4ICE9IDAgfHwgCi0gICAgICAgIWludGVsX3ZhbGlkYXRlX3JlbmRlciggY3R4LCBWQiApIHx8IAotICAgICAgICFjaG9vc2VfcmVuZGVyKCBpbnRlbCwgVkIgKSkgeworICAgaWYgKGludGVsLT5SZW5kZXJJbmRleCAhPSAwIHx8CisgICAgICAgIWludGVsX3ZhbGlkYXRlX3JlbmRlcihjdHgsIFZCKSB8fCAhY2hvb3NlX3JlbmRlcihpbnRlbCwgVkIpKSB7CiAgICAgICByZXR1cm4gR0xfVFJVRTsKICAgIH0KIAogICAgdG5sLT5jbGlwc3BhY2UubmV3X2lucHV0cyB8PSBWRVJUX0JJVF9QT1M7CiAKLSAgIHRubC0+RHJpdmVyLlJlbmRlci5TdGFydCggY3R4ICk7Ci0gICAKLSAgIGZvciAoaSA9IDAgOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50IDsgaSsrKQotICAgewotICAgICAgR0x1aW50IHByaW0gPSBWQi0+UHJpbWl0aXZlW2ldLm1vZGU7CisgICB0bmwtPkRyaXZlci5SZW5kZXIuU3RhcnQoY3R4KTsKKworICAgZm9yIChpID0gMDsgaSA8IFZCLT5QcmltaXRpdmVDb3VudDsgaSsrKSB7CisgICAgICBHTHVpbnQgcHJpbSA9IF90bmxfdHJhbnNsYXRlX3ByaW0oJlZCLT5QcmltaXRpdmVbaV0pOwogICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgIEdMdWludCBsZW5ndGggPSBWQi0+UHJpbWl0aXZlW2ldLmNvdW50OwogCiAgICAgICBpZiAoIWxlbmd0aCkKLQkgY29udGludWU7CisgICAgICAgICBjb250aW51ZTsKIAotICAgICAgaW50ZWxfcmVuZGVyX3RhYl92ZXJ0c1twcmltICYgUFJJTV9NT0RFX01BU0tdKCBjdHgsIHN0YXJ0LCBzdGFydCArIGxlbmd0aCwKLQkJCQkJCSAgICAgcHJpbSApOworICAgICAgaW50ZWxfcmVuZGVyX3RhYl92ZXJ0c1twcmltICYgUFJJTV9NT0RFX01BU0tdIChjdHgsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGxlbmd0aCwgcHJpbSk7CiAgICB9Ci0gICAgICAKLSAgIHRubC0+RHJpdmVyLlJlbmRlci5GaW5pc2goIGN0eCApOwogCi0gICByZXR1cm4gR0xfRkFMU0U7ICAgICAvKiBmaW5pc2hlZCB0aGUgcGlwZSAqLworICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkZpbmlzaChjdHgpOworCisgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOworCisgICByZXR1cm4gR0xfRkFMU0U7ICAgICAgICAgICAgIC8qIGZpbmlzaGVkIHRoZSBwaXBlICovCiB9CiAKLWNvbnN0IHN0cnVjdCB0bmxfcGlwZWxpbmVfc3RhZ2UgX2ludGVsX3JlbmRlcl9zdGFnZSA9Ci17CitzdGF0aWMgY29uc3Qgc3RydWN0IHRubF9waXBlbGluZV9zdGFnZSBfaW50ZWxfcmVuZGVyX3N0YWdlID0gewogICAgImludGVsIHJlbmRlciIsCiAgICBOVUxMLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBOVUxMLAotICAgaW50ZWxfcnVuX3JlbmRlcgkvKiBydW4gKi8KKyAgIGludGVsX3J1bl9yZW5kZXIgICAgICAgICAgICAgLyogcnVuICovCit9OworCitjb25zdCBzdHJ1Y3QgdG5sX3BpcGVsaW5lX3N0YWdlICppbnRlbF9waXBlbGluZVtdID0geworICAgJl90bmxfdmVydGV4X3RyYW5zZm9ybV9zdGFnZSwKKyAgICZfdG5sX3ZlcnRleF9jdWxsX3N0YWdlLAorICAgJl90bmxfbm9ybWFsX3RyYW5zZm9ybV9zdGFnZSwKKyAgICZfdG5sX2xpZ2h0aW5nX3N0YWdlLAorICAgJl90bmxfZm9nX2Nvb3JkaW5hdGVfc3RhZ2UsCisgICAmX3RubF90ZXhnZW5fc3RhZ2UsCisgICAmX3RubF90ZXh0dXJlX3RyYW5zZm9ybV9zdGFnZSwKKyAgICZfdG5sX3BvaW50X2F0dGVudWF0aW9uX3N0YWdlLAorICAgJl90bmxfdmVydGV4X3Byb2dyYW1fc3RhZ2UsCisjaWYgMQorICAgJl9pbnRlbF9yZW5kZXJfc3RhZ2UsICAgICAgICAvKiBBREQ6IHVuY2xpcHBlZCByYXN0ZXJzZXR1cC10by1kbWEgKi8KKyNlbmRpZgorICAgJl90bmxfcmVuZGVyX3N0YWdlLAorICAgMCwKIH07CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3JvdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9yb3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3NjQwZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3JvdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLQotLyoqCi0gKiBSb3V0aW5lcyBmb3Igc2ltcGxlIDJELT4yRCB0cmFuc2Zvcm1hdGlvbnMgZm9yIHJvdGF0ZWQsIGZsaXBwZWQgc2NyZWVucy4KLSAqCi0gKiBYWFggVGhpcyBjb2RlIGlzIG5vdCBpbnRlbC1zcGVjaWZpYy4gIE1vdmUgaXQgaW50byBhIGNvbW1vbi91dGlsaXR5Ci0gKiBzb21lZGF5LgotICovCi0KLSNpbmNsdWRlICJpbnRlbF9yb3RhdGUuaCIKLQotI2RlZmluZSBNSU4yKEEsIEIpICAgKCAoKEEpIDwgKEIpKSA/IChBKSA6IChCKSApCi0KLSNkZWZpbmUgQUJTKEEpICAoICgoQSkgPCAwKSA/IC0oQSkgOiAoQSkgKQotCi0KLXZvaWQKLW1hdHJpeDIzU2V0KHN0cnVjdCBtYXRyaXgyMyAqbSwKLSAgICAgICAgICAgIGludCBtMDAsIGludCBtMDEsIGludCBtMDIsCi0gICAgICAgICAgICBpbnQgbTEwLCBpbnQgbTExLCBpbnQgbTEyKQotewotICAgbS0+bTAwID0gbTAwOyAgIG0tPm0wMSA9IG0wMTsgICBtLT5tMDIgPSBtMDI7Ci0gICBtLT5tMTAgPSBtMTA7ICAgbS0+bTExID0gbTExOyAgIG0tPm0xMiA9IG0xMjsKLX0KLQotCi0vKgotICogVHJhbnNmb3JtICh4LHkpIGNvb3JkaW5hdGUgYnkgdGhlIGdpdmVuIG1hdHJpeC4KLSAqLwotdm9pZAotbWF0cml4MjNUcmFuc2Zvcm1Db29yZGYoY29uc3Qgc3RydWN0IG1hdHJpeDIzICptLCBmbG9hdCAqeCwgZmxvYXQgKnkpCi17Ci0gICBjb25zdCBmbG9hdCB4MCA9ICp4OwotICAgY29uc3QgZmxvYXQgeTAgPSAqeTsKLQotICAgKnggPSBtLT5tMDAgKiB4MCArIG0tPm0wMSAqIHkwICsgbS0+bTAyOwotICAgKnkgPSBtLT5tMTAgKiB4MCArIG0tPm0xMSAqIHkwICsgbS0+bTEyOwotfQotCi0KLXZvaWQKLW1hdHJpeDIzVHJhbnNmb3JtQ29vcmRpKGNvbnN0IHN0cnVjdCBtYXRyaXgyMyAqbSwgaW50ICp4LCBpbnQgKnkpCi17Ci0gICBjb25zdCBpbnQgeDAgPSAqeDsKLSAgIGNvbnN0IGludCB5MCA9ICp5OwotCi0gICAqeCA9IG0tPm0wMCAqIHgwICsgbS0+bTAxICogeTAgKyBtLT5tMDI7Ci0gICAqeSA9IG0tPm0xMCAqIHgwICsgbS0+bTExICogeTAgKyBtLT5tMTI7Ci19Ci0KLQotLyoKLSAqIFRyYW5zZm9ybSBhIHdpZHRoIGFuZCBoZWlnaHQgYnkgdGhlIGdpdmVuIG1hdHJpeC4KLSAqIFhYWCB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBxdWl0ZSBhIGJpdC4KLSAqLwotdm9pZAotbWF0cml4MjNUcmFuc2Zvcm1EaXN0YW5jZShjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKm0sIGludCAqeERpc3QsIGludCAqeURpc3QpCi17Ci0gICBpbnQgeDAgPSAwLCB5MCA9IDA7Ci0gICBpbnQgeDEgPSAqeERpc3QsIHkxID0gMDsKLSAgIGludCB4MiA9IDAsIHkyID0gKnlEaXN0OwotICAgbWF0cml4MjNUcmFuc2Zvcm1Db29yZGkobSwgJngwLCAmeTApOwotICAgbWF0cml4MjNUcmFuc2Zvcm1Db29yZGkobSwgJngxLCAmeTEpOwotICAgbWF0cml4MjNUcmFuc2Zvcm1Db29yZGkobSwgJngyLCAmeTIpOwotCi0gICAqeERpc3QgPSAoeDEgLSB4MCkgKyAoeDIgLSB4MCk7Ci0gICAqeURpc3QgPSAoeTEgLSB5MCkgKyAoeTIgLSB5MCk7Ci0KLSAgIGlmICgqeERpc3QgPCAwKQotICAgICAgICp4RGlzdCA9IC0qeERpc3Q7Ci0gICBpZiAoKnlEaXN0IDwgMCkKLSAgICAgICAqeURpc3QgPSAtKnlEaXN0OwotfQotCi0KLS8qKgotICogVHJhbnNmb3JtIHRoZSByZWN0IGRlZmluZWQgYnkgKHgsIHksIHcsIGgpIGJ5IG0uCi0gKi8KLXZvaWQKLW1hdHJpeDIzVHJhbnNmb3JtUmVjdChjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKm0sIGludCAqeCwgaW50ICp5LCBpbnQgKncsIGludCAqaCkKLXsKLSAgIGludCB4MCA9ICp4LCB5MCA9ICp5OwotICAgaW50IHgxID0gKnggKyAqdywgeTEgPSAqeTsKLSAgIGludCB4MiA9ICp4ICsgKncsIHkyID0gKnkgKyAqaDsKLSAgIGludCB4MyA9ICp4LCB5MyA9ICp5ICsgKmg7Ci0gICBtYXRyaXgyM1RyYW5zZm9ybUNvb3JkaShtLCAmeDAsICZ5MCk7Ci0gICBtYXRyaXgyM1RyYW5zZm9ybUNvb3JkaShtLCAmeDEsICZ5MSk7Ci0gICBtYXRyaXgyM1RyYW5zZm9ybUNvb3JkaShtLCAmeDIsICZ5Mik7Ci0gICBtYXRyaXgyM1RyYW5zZm9ybUNvb3JkaShtLCAmeDMsICZ5Myk7Ci0gICAqdyA9IEFCUyh4MSAtIHgwKSArIEFCUyh4MiAtIHgxKTsKLSAgIC8qKncgPSBBQlMoKncpOyovCi0gICAqaCA9IEFCUyh5MSAtIHkwKSArIEFCUyh5MiAtIHkxKTsKLSAgIC8qKmggPSBBQlMoKmgpOyovCi0gICAqeCA9IE1JTjIoeDAsIHgxKTsKLSAgICp4ID0gTUlOMigqeCwgeDIpOwotICAgKnkgPSBNSU4yKHkwLCB5MSk7Ci0gICAqeSA9IE1JTjIoKnksIHkyKTsKLX0KLQotCi0vKgotICogTWFrZSByb3RhdGlvbiBtYXRyaXggZm9yIHdpZHRoIFggaGVpZ2h0IHNjcmVlbi4KLSAqLwotdm9pZAotbWF0cml4MjNSb3RhdGUoc3RydWN0IG1hdHJpeDIzICptLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhbmdsZSkKLXsKLSAgIHN3aXRjaCAoYW5nbGUpIHsKLSAgIGNhc2UgMDoKLSAgICAgIG1hdHJpeDIzU2V0KG0sIDEsIDAsIDAsIDAsIDEsIDApOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDkwOgotICAgICAgbWF0cml4MjNTZXQobSwgMCwgMSwgMCwgIC0xLCAwLCB3aWR0aCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMTgwOgotICAgICAgbWF0cml4MjNTZXQobSwgLTEsIDAsIHdpZHRoLCAgMCwgLTEsIGhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMjcwOgotICAgICAgbWF0cml4MjNTZXQobSwgMCwgLTEsIGhlaWdodCwgIDEsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgLyphYm9ydCgpKi87Ci0gICB9Ci19Ci0KLQotLyoKLSAqIE1ha2UgZmxpcC9yZWZsZWN0aW9uIG1hdHJpeCBmb3Igd2lkdGggWCBoZWlnaHQgc2NyZWVuLgotICovCi12b2lkCi1tYXRyaXgyM0ZsaXAoc3RydWN0IG1hdHJpeDIzICptLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4ZmxpcCwgaW50IHlmbGlwKQotewotICAgaWYgKHhmbGlwKSB7Ci0gICAgICBtLT5tMDAgPSAtMTsgIG0tPm0wMSA9IDA7ICAgbS0+bTAyID0gd2lkdGggLSAxOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBtLT5tMDAgPSAxOyAgIG0tPm0wMSA9IDA7ICAgbS0+bTAyID0gMDsKLSAgIH0KLSAgIGlmICh5ZmxpcCkgewotICAgICAgbS0+bTEwID0gMDsgICBtLT5tMTEgPSAtMTsgIG0tPm0xMiA9IGhlaWdodCAtIDE7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIG0tPm0xMCA9IDA7ICAgbS0+bTExID0gMTsgICBtLT5tMTIgPSAwOwotICAgfQotfQotCi0KLS8qCi0gKiByZXN1bHQgPSBhICogYgotICovCi12b2lkCi1tYXRyaXgyM011bHRpcGx5KHN0cnVjdCBtYXRyaXgyMyAqcmVzdWx0LAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKmEsIGNvbnN0IHN0cnVjdCBtYXRyaXgyMyAqYikKLXsKLSAgIHJlc3VsdC0+bTAwID0gYS0+bTAwICogYi0+bTAwICsgYS0+bTAxICogYi0+bTEwOwotICAgcmVzdWx0LT5tMDEgPSBhLT5tMDAgKiBiLT5tMDEgKyBhLT5tMDEgKiBiLT5tMTE7Ci0gICByZXN1bHQtPm0wMiA9IGEtPm0wMCAqIGItPm0wMiArIGEtPm0wMSAqIGItPm0xMiArIGEtPm0wMjsKLQotICAgcmVzdWx0LT5tMTAgPSBhLT5tMTAgKiBiLT5tMDAgKyBhLT5tMTEgKiBiLT5tMTA7Ci0gICByZXN1bHQtPm0xMSA9IGEtPm0xMCAqIGItPm0wMSArIGEtPm0xMSAqIGItPm0xMTsKLSAgIHJlc3VsdC0+bTEyID0gYS0+bTEwICogYi0+bTAyICsgYS0+bTExICogYi0+bTEyICsgYS0+bTEyOwotfQotCi0KLSNpZiAwMDAKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgaW50IHdpZHRoID0gNTAwLCBoZWlnaHQgPSA0MDA7Ci0gICBpbnQgcm90OwotICAgaW50IGZ4ID0gMCwgZnkgPSAwOyAgLyogZmxpcCB4IGFuZC9vciB5ID8gKi8KLSAgIGludCBjb29yZHNbNF1bMl07Ci0KLSAgIC8qIGZvdXIgY29ybmVyIGNvb3JkcyB0byB0ZXN0IHdpdGggKi8KLSAgIGNvb3Jkc1swXVswXSA9IDA7ICBjb29yZHNbMF1bMV0gPSAwOwotICAgY29vcmRzWzFdWzBdID0gd2lkdGgtMTsgIGNvb3Jkc1sxXVsxXSA9IDA7Ci0gICBjb29yZHNbMl1bMF0gPSB3aWR0aC0xOyAgY29vcmRzWzJdWzFdID0gaGVpZ2h0LTE7Ci0gICBjb29yZHNbM11bMF0gPSAwOyAgY29vcmRzWzNdWzFdID0gaGVpZ2h0LTE7Ci0KLQotICAgZm9yIChyb3QgPSAwOyByb3QgPCAzNjA7IHJvdCArPSA5MCkgewotICAgICAgc3RydWN0IG1hdHJpeDIzIHJvdGF0ZSwgZmxpcCwgbTsKLSAgICAgIGludCBpOwotCi0gICAgICBwcmludGYoIlJvdCAlZCwgeEZsaXAgJWQsIHlGbGlwICVkOlxuIiwgcm90LCBmeCwgZnkpOwotCi0gICAgICAvKiBtYWtlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAnbScgKi8KLSAgICAgIG1hdHJpeDIzUm90YXRlKCZyb3RhdGUsIHdpZHRoLCBoZWlnaHQsIHJvdCk7Ci0gICAgICBtYXRyaXgyM0ZsaXAoJmZsaXAsIHdpZHRoLCBoZWlnaHQsIGZ4LCBmeSk7Ci0gICAgICBtYXRyaXgyM011bHRpcGx5KCZtLCAmcm90YXRlLCAmZmxpcCk7Ci0KLSAgICAgIC8qIHhmb3JtIGZvdXIgY29vcmRzICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICBpbnQgeCA9IGNvb3Jkc1tpXVswXTsKLSAgICAgICAgIGludCB5ID0gY29vcmRzW2ldWzFdOwotICAgICAgICAgbWF0cml4MjNUcmFuc2Zvcm1Db29yZGkoJm0sICZ4LCAmeSk7Ci0gICAgICAgICBwcmludGYoIiAgJWQsICVkICAtPiAlZCAlZFxuIiwgY29vcmRzW2ldWzBdLCBjb29yZHNbaV1bMV0sIHgsIHkpOwotICAgICAgfQotCi0gICAgICAvKiB4Zm9ybSB3aWR0aCwgaGVpZ2h0ICovCi0gICAgICB7Ci0gICAgICAgICBpbnQgeCA9IHdpZHRoOwotICAgICAgICAgaW50IHkgPSBoZWlnaHQ7Ci0gICAgICAgICBtYXRyaXgyM1RyYW5zZm9ybURpc3RhbmNlKCZtLCAmeCwgJnkpOwotICAgICAgICAgcHJpbnRmKCIgICVkIHggJWQgLT4gJWQgeCAlZFxuIiwgd2lkdGgsIGhlaWdodCwgeCwgeSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHhmb3JtIHJlY3QgKi8KLSAgICAgIHsKLSAgICAgICAgIGludCB4ID0gNTAsIHkgPSAxMCwgdyA9IDIwMCwgaCA9IDEwMDsKLSAgICAgICAgIG1hdHJpeDIzVHJhbnNmb3JtUmVjdCgmbSwgJngsICZ5LCAmdywgJmgpOwotICAgICAgICAgcHJpbnRmKCIgICVkLCVkICVkIHggJWQgLT4gJWQsICVkICVkIHggJWRcbiIsIDUwLCAxMCwgMjAwLCAxMDAsCi0gICAgICAgICAgICAgICAgeCwgeSwgdywgaCk7Ci0gICAgICB9Ci0KLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcm90YXRlLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3JvdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGE0NWQyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfcm90YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jaWZuZGVmIElOVEVMX1JPVEFURV9ICi0jZGVmaW5lIElOVEVMX1JPVEFURV9IIDEKLQotc3RydWN0IG1hdHJpeDIzCi17Ci0gICBpbnQgbTAwLCBtMDEsIG0wMjsKLSAgIGludCBtMTAsIG0xMSwgbTEyOwotfTsKLQotCi0KLWV4dGVybiB2b2lkCi1tYXRyaXgyM1NldChzdHJ1Y3QgbWF0cml4MjMgKm0sCi0gICAgICAgICAgICBpbnQgbTAwLCBpbnQgbTAxLCBpbnQgbTAyLAotICAgICAgICAgICAgaW50IG0xMCwgaW50IG0xMSwgaW50IG0xMik7Ci0KLWV4dGVybiB2b2lkCi1tYXRyaXgyM1RyYW5zZm9ybUNvb3JkaShjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKm0sIGludCAqeCwgaW50ICp5KTsKLQotZXh0ZXJuIHZvaWQKLW1hdHJpeDIzVHJhbnNmb3JtQ29vcmRmKGNvbnN0IHN0cnVjdCBtYXRyaXgyMyAqbSwgZmxvYXQgKngsIGZsb2F0ICp5KTsKLQotZXh0ZXJuIHZvaWQKLW1hdHJpeDIzVHJhbnNmb3JtRGlzdGFuY2UoY29uc3Qgc3RydWN0IG1hdHJpeDIzICptLCBpbnQgKnhEaXN0LCBpbnQgKnlEaXN0KTsKLQotZXh0ZXJuIHZvaWQKLW1hdHJpeDIzVHJhbnNmb3JtUmVjdChjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoKTsKLQotZXh0ZXJuIHZvaWQKLW1hdHJpeDIzUm90YXRlKHN0cnVjdCBtYXRyaXgyMyAqbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYW5nbGUpOwotCi1leHRlcm4gdm9pZAotbWF0cml4MjNGbGlwKHN0cnVjdCBtYXRyaXgyMyAqbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeGZsaXAsIGludCB5ZmxpcCk7Ci0KLWV4dGVybiB2b2lkCi1tYXRyaXgyM011bHRpcGx5KHN0cnVjdCBtYXRyaXgyMyAqcmVzdWx0LAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbWF0cml4MjMgKmEsIGNvbnN0IHN0cnVjdCBtYXRyaXgyMyAqYik7Ci0KLQotI2VuZGlmIC8qIElOVEVMX1JPVEFURV9IICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3NjcmVlbi5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zY3JlZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZmQ5Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3NjcmVlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0lOVEVMX0lOSVRfSF8KLSNkZWZpbmUgX0lOVEVMX0lOSVRfSF8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAieG1sY29uZmlnLmgiCi0jaW5jbHVkZSAiZHJpX3V0aWwuaCIKLSNpbmNsdWRlICJpbnRlbF9yb3RhdGUuaCIKLSNpbmNsdWRlICJpODMwX2NvbW1vbi5oIgotCi0KLS8qIFRoaXMgcm91Z2hseSBjb3JyZXNwb25kcyB0byBhIGdsX3JlbmRlcmJ1ZmZlciAoTWVzYSA2LjQpICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBkcm1faGFuZGxlX3QgaGFuZGxlOwotICAgZHJtU2l6ZSBzaXplOyAgICAgICAgLyogcmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgIGNoYXIgKm1hcDsgICAgICAgICAgIC8qIG1lbW9yeSBtYXAgKi8KLSAgIGludCBvZmZzZXQ7ICAgICAgICAgIC8qIGZyb20gc3RhcnQgb2YgdmlkZW8gbWVtLCBpbiBieXRlcyAqLwotICAgaW50IHBpdGNoOyAgICAgICAgICAgLyogcm93IHN0cmlkZSwgaW4gYnl0ZXMgKi8KLX0gaW50ZWxSZWdpb247Ci0KLXR5cGVkZWYgc3RydWN0IAotewotICAgaW50ZWxSZWdpb24gZnJvbnQ7Ci0gICBpbnRlbFJlZ2lvbiBiYWNrOwotICAgaW50ZWxSZWdpb24gcm90YXRlZDsKLSAgIGludGVsUmVnaW9uIGRlcHRoOwotICAgaW50ZWxSZWdpb24gdGV4OwotICAgCi0gICBpbnQgZGV2aWNlSUQ7Ci0gICBpbnQgd2lkdGg7Ci0gICBpbnQgaGVpZ2h0OwotICAgaW50IG1lbTsgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgIAotICAgaW50IGNwcDsgICAgICAgICAvKiBmb3IgZnJvbnQgYW5kIGJhY2sgYnVmZmVycyAqLwotICAgaW50IGZiRm9ybWF0OwotCi0gICBpbnQgbG9nVGV4dHVyZUdyYW51bGFyaXR5OwotICAgCi0gICBfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcm5Qcml2OwotICAgdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OwotCi0gICBpbnQgZHJtTWlub3I7Ci0KLSAgIGludCBpcnFfYWN0aXZlOwotICAgaW50IGFsbG93X2JhdGNoYnVmZmVyOwotCi0gICBzdHJ1Y3QgbWF0cml4MjMgcm90TWF0cml4OwotCi0gICBpbnQgY3VycmVudF9yb3RhdGlvbjsgIC8qIDAsIDkwLCAxODAgb3IgMjcwICovCi0gICBpbnQgcm90YXRlZFdpZHRoLCByb3RhdGVkSGVpZ2h0OwotCi0gICAvKioKLSAgICogQ29uZmlndXJhdGlvbiBjYWNoZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgY29udGV4dHMKLSAgICovCi0gICBkcmlPcHRpb25DYWNoZSBvcHRpb25DYWNoZTsKLX0gaW50ZWxTY3JlZW5Qcml2YXRlOwotCi0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsTWFwU2NyZWVuUmVnaW9ucyhfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2KTsKLQotZXh0ZXJuIHZvaWQKLWludGVsVW5tYXBTY3JlZW5SZWdpb25zKGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4pOwotCi1leHRlcm4gdm9pZAotaW50ZWxVcGRhdGVTY3JlZW5Gcm9tU0FSRUEoaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRybUk4MzBTYXJlYSAqc2FyZWEpOwotCi1leHRlcm4gdm9pZAotaW50ZWxEZXN0cm95Q29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdik7Ci0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsVW5iaW5kQ29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdik7Ci0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsTWFrZUN1cnJlbnQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0gICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3UHJpdiwKLSAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaVJlYWRQcml2KTsKLQotZXh0ZXJuIHZvaWQKLWludGVsU3dhcEJ1ZmZlcnMoX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2KTsKLQotZXh0ZXJuIHZvaWQKLWludGVsQ29weVN1YkJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCApOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zcGFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmZjNGIuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zcGFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAiY29sb3JtYWMuaCIKLQotI2luY2x1ZGUgImludGVsX3NjcmVlbi5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc3Bhbi5oIgotI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotCi0KLSNkZWZpbmUgREJHIDAKLQotI2RlZmluZSBMT0NBTF9WQVJTCQkJCQkJXAotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOwkJCVwKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsJCVwKLSAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsJCVwKLSAgIEdMdWludCBwaXRjaCA9IGRyYi0+cGl0Y2g7CQkJCQlcCi0gICBHTHVpbnQgaGVpZ2h0ID0gZFByaXYtPmg7CQkJCQlcCi0gICBjaGFyICpidWYgPSAoY2hhciAqKSBkcmItPkJhc2UuRGF0YSArCQkJXAotCQkJZFByaXYtPnggKiBkcmItPmNwcCArCQkJXAotCQkJZFByaXYtPnkgKiBwaXRjaDsJCQlcCi0gICBHTHVzaG9ydCBwOwkJCQkJCQlcCi0gICAodm9pZCkgYnVmOyAodm9pZCkgcAotCi0jZGVmaW5lIExPQ0FMX0RFUFRIX1ZBUlMJCQkJCVwKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsJCQlcCi0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7CQlcCi0gICBkcmlSZW5kZXJidWZmZXIgKmRyYiA9IChkcmlSZW5kZXJidWZmZXIgKikgcmI7CQlcCi0gICBHTHVpbnQgcGl0Y2ggPSBkcmItPnBpdGNoOwkJCQkJXAotICAgR0x1aW50IGhlaWdodCA9IGRQcml2LT5oOwkJCQkJXAotICAgY2hhciAqYnVmID0gKGNoYXIgKikgZHJiLT5CYXNlLkRhdGEgKwkJCVwKLQkJCWRQcml2LT54ICogZHJiLT5jcHAgKwkJCVwKLQkJCWRQcml2LT55ICogcGl0Y2gKLQotI2RlZmluZSBMT0NBTF9TVEVOQ0lMX1ZBUlMgTE9DQUxfREVQVEhfVkFSUyAKLQotI2RlZmluZSBJTklUX01PTk9fUElYRUwocCxjb2xvcilcCi0JIHAgPSBJTlRFTF9QQUNLQ09MT1I1NjUoY29sb3JbMF0sY29sb3JbMV0sY29sb3JbMl0pCi0KLSNkZWZpbmUgWV9GTElQKF95KSAoaGVpZ2h0IC0gX3kgLSAxKQotCi0jZGVmaW5lIEhXX0xPQ0soKQotCi0jZGVmaW5lIEhXX1VOTE9DSygpCi0KLS8qIDE2IGJpdCwgNTY1IHJnYiBjb2xvciBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCi0gKi8KLSNkZWZpbmUgV1JJVEVfUkdCQSggX3gsIF95LCByLCBnLCBiLCBhICkJCQkJXAotICAgKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpICA9ICggKCgoaW50KXIgJiAweGY4KSA8PCA4KSB8CVwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChpbnQpZyAmIDB4ZmMpIDw8IDMpIHwJXAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGludCliICYgMHhmOCkgPj4gMykpCi0jZGVmaW5lIFdSSVRFX1BJWEVMKCBfeCwgX3ksIHAgKSAgXAotICAgKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpID0gcAotCi0jZGVmaW5lIFJFQURfUkdCQSggcmdiYSwgX3gsIF95ICkJCQkJXAotZG8gewkJCQkJCQkJXAotICAgR0x1c2hvcnQgcCA9ICooR0x1c2hvcnQgKikoYnVmICsgX3gqMiArIF95KnBpdGNoKTsJCVwKLSAgIHJnYmFbMF0gPSAoKChwID4+IDExKSAmIDB4MWYpICogMjU1KSAvIDMxOwkJCVwKLSAgIHJnYmFbMV0gPSAoKChwID4+ICA1KSAmIDB4M2YpICogMjU1KSAvIDYzOwkJCVwKLSAgIHJnYmFbMl0gPSAoKChwID4+ICAwKSAmIDB4MWYpICogMjU1KSAvIDMxOwkJCVwKLSAgIHJnYmFbM10gPSAyNTU7CQkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjXzU2NQotI2luY2x1ZGUgInNwYW50bXAuaCIKLQotLyogMTUgYml0LCA1NTUgcmdiIGNvbG9yIHNwYW5saW5lIGFuZCBwaXhlbCBmdW5jdGlvbnMKLSAqLwotI2RlZmluZSBXUklURV9SR0JBKCBfeCwgX3ksIHIsIGcsIGIsIGEgKQkJCVwKLSAgICooR0x1c2hvcnQgKikoYnVmICsgX3gqMiArIF95KnBpdGNoKSAgPSAoKChyICYgMHhmOCkgPDwgNykgfAlcCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGcgJiAweGY4KSA8PCAzKSB8CVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAoKGIgJiAweGY4KSA+PiAzKSkKLQotI2RlZmluZSBXUklURV9QSVhFTCggX3gsIF95LCBwICkgIFwKLSAgICooR0x1c2hvcnQgKikoYnVmICsgX3gqMiArIF95KnBpdGNoKSAgPSBwCi0KLSNkZWZpbmUgUkVBRF9SR0JBKCByZ2JhLCBfeCwgX3kgKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gICBHTHVzaG9ydCBwID0gKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpOwkJXAotICAgcmdiYVswXSA9IChwID4+IDcpICYgMHhmODsJCQkJCVwKLSAgIHJnYmFbMV0gPSAocCA+PiAzKSAmIDB4Zjg7CQkJCQlcCi0gICByZ2JhWzJdID0gKHAgPDwgMykgJiAweGY4OwkJCQkJXAotICAgcmdiYVszXSA9IDI1NTsJCQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfNTU1Ci0jaW5jbHVkZSAic3BhbnRtcC5oIgotCi0vKiAxNiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgotICovCi0jZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSBcCi0gICAqKEdMdXNob3J0ICopKGJ1ZiArIChfeCkqMiArIChfeSkqcGl0Y2gpICA9IGQ7Ci0KLSNkZWZpbmUgUkVBRF9ERVBUSCggZCwgX3gsIF95ICkJXAotICAgZCA9ICooR0x1c2hvcnQgKikoYnVmICsgKF94KSoyICsgKF95KSpwaXRjaCk7CSAKLQotCi0jZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjX3oxNgotI2luY2x1ZGUgImRlcHRodG1wLmgiCi0KLQotI3VuZGVmIExPQ0FMX1ZBUlMKLSNkZWZpbmUgTE9DQUxfVkFSUwkJCQkJCVwKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsJCQlcCi0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7CQlcCi0gICBkcmlSZW5kZXJidWZmZXIgKmRyYiA9IChkcmlSZW5kZXJidWZmZXIgKikgcmI7CQlcCi0gICBHTHVpbnQgcGl0Y2ggPSBkcmItPnBpdGNoOwkJCQkJXAotICAgR0x1aW50IGhlaWdodCA9IGRQcml2LT5oOwkJCQkJXAotICAgY2hhciAqYnVmID0gKGNoYXIgKilkcmItPkJhc2UuRGF0YSArCQkJCVwKLQkJCWRQcml2LT54ICogZHJiLT5jcHAgKwkJCVwKLQkJCWRQcml2LT55ICogcGl0Y2g7CQkJXAotICAgR0x1aW50IHA7CQkJCQkJCVwKLSAgICh2b2lkKSBidWY7ICh2b2lkKSBwCi0KLSN1bmRlZiBJTklUX01PTk9fUElYRUwKLSNkZWZpbmUgSU5JVF9NT05PX1BJWEVMKHAsY29sb3IpXAotCSBwID0gSU5URUxfUEFDS0NPTE9SODg4OChjb2xvclswXSxjb2xvclsxXSxjb2xvclsyXSxjb2xvclszXSkKLQotLyogMzIgYml0LCA4ODg4IGFyZ2IgY29sb3Igc3BhbmxpbmUgYW5kIHBpeGVsIGZ1bmN0aW9ucwotICovCi0jZGVmaW5lIFdSSVRFX1JHQkEoX3gsIF95LCByLCBnLCBiLCBhKQkJCVwKLSAgICAqKEdMdWludCAqKShidWYgKyBfeCo0ICsgX3kqcGl0Y2gpID0gKChyIDw8IDE2KSB8CVwKLQkJCQkJICAoZyA8PCA4KSAgfAlcCi0JCQkJCSAgKGIgPDwgMCkgIHwJXAotCQkJCQkgIChhIDw8IDI0KSApCi0KLSNkZWZpbmUgV1JJVEVfUElYRUwoX3gsIF95LCBwKQkJCVwKLSAgICAqKEdMdWludCAqKShidWYgKyBfeCo0ICsgX3kqcGl0Y2gpID0gcAotCi0KLSNkZWZpbmUgUkVBRF9SR0JBKHJnYmEsIF94LCBfeSkJCQkJCVwKLSAgICBkbyB7CQkJCQkJCVwKLQlHTHVpbnQgcCA9ICooR0x1aW50ICopKGJ1ZiArIF94KjQgKyBfeSpwaXRjaCk7CQlcCi0JcmdiYVswXSA9IChwID4+IDE2KSAmIDB4ZmY7CQkJCVwKLQlyZ2JhWzFdID0gKHAgPj4gOCkgICYgMHhmZjsJCQkJXAotCXJnYmFbMl0gPSAocCA+PiAwKSAgJiAweGZmOwkJCQlcCi0JcmdiYVszXSA9IChwID4+IDI0KSAmIDB4ZmY7CQkJCVwKLSAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjXzg4ODgKLSNpbmNsdWRlICJzcGFudG1wLmgiCi0KLQotLyogMjQvOCBiaXQgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKLSAqLwotI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgewkJCVwKLSAgIEdMdWludCB0bXAgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKnBpdGNoKTsJXAotICAgdG1wICY9IDB4ZmYwMDAwMDA7CQkJCQlcCi0gICB0bXAgfD0gKGQpICYgMHhmZmZmZmY7CQkJCVwKLSAgICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpID0gdG1wOwkJXAotfQotCi0jZGVmaW5lIFJFQURfREVQVEgoIGQsIF94LCBfeSApCQlcCi0gICBkID0gKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgJiAweGZmZmZmZjsKLQotCi0jZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjX3oyNF9zOAotI2luY2x1ZGUgImRlcHRodG1wLmgiCi0KLSNkZWZpbmUgV1JJVEVfU1RFTkNJTCggX3gsIF95LCBkICkgewkJCVwKLSAgIEdMdWludCB0bXAgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKnBpdGNoKTsJXAotICAgdG1wICY9IDB4ZmZmZmZmOwkJCQkJXAotICAgdG1wIHw9ICgoZCk8PDI0KTsJCQkJCVwKLSAgICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpID0gdG1wOwkJXAotfQotCi0jZGVmaW5lIFJFQURfU1RFTkNJTCggZCwgX3gsIF95ICkJCQlcCi0gICBkID0gKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgPj4gMjQ7Ci0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfejI0X3M4Ci0jaW5jbHVkZSAic3RlbmNpbHRtcC5oIgotCi0KLS8qIE1vdmUgbG9ja2luZyBvdXQgdG8gZ2V0IHJlYXNvbmFibGUgc3BhbiBwZXJmb3JtYW5jZS4KLSAqLwotdm9pZCBpbnRlbFNwYW5SZW5kZXJTdGFydCggR0xjb250ZXh0ICpjdHggKQotewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOwotCi0gICBpbnRlbEZsdXNoKCZpbnRlbC0+Y3R4KTsKLSAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwotICAgaW50ZWxXYWl0Rm9ySWRsZShpbnRlbCk7Ci19Ci0KLXZvaWQgaW50ZWxTcGFuUmVuZGVyRmluaXNoKCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKCBjdHggKTsKLSAgIF9zd3Jhc3RfZmx1c2goIGN0eCApOwotICAgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotfQotCi12b2lkIGludGVsSW5pdFNwYW5GdW5jcyggR0xjb250ZXh0ICpjdHggKQotewotICAgc3RydWN0IHN3cmFzdF9kZXZpY2VfZHJpdmVyICpzd2RkID0gX3N3cmFzdF9HZXREZXZpY2VEcml2ZXJSZWZlcmVuY2UoY3R4KTsKLSAgIHN3ZGQtPlNwYW5SZW5kZXJTdGFydCA9IGludGVsU3BhblJlbmRlclN0YXJ0OwotICAgc3dkZC0+U3BhblJlbmRlckZpbmlzaCA9IGludGVsU3BhblJlbmRlckZpbmlzaDsgCi19Ci0KLQotLyoqCi0gKiBQbHVnIGluIHRoZSBHZXQvUHV0IHJvdXRpbmVzIGZvciB0aGUgZ2l2ZW4gZHJpUmVuZGVyYnVmZmVyLgotICovCi12b2lkCi1pbnRlbFNldFNwYW5GdW5jdGlvbnMoZHJpUmVuZGVyYnVmZmVyICpkcmIsIGNvbnN0IEdMdmlzdWFsICp2aXMpCi17Ci0gICBpZiAoZHJiLT5CYXNlLkludGVybmFsRm9ybWF0ID09IEdMX1JHQkEpIHsKLSAgICAgIGlmICh2aXMtPnJlZEJpdHMgPT0gNSAmJiB2aXMtPmdyZWVuQml0cyA9PSA1ICYmIHZpcy0+Ymx1ZUJpdHMgPT0gNSkgewotICAgICAgICAgaW50ZWxJbml0UG9pbnRlcnNfNTU1KCZkcmItPkJhc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodmlzLT5yZWRCaXRzID09IDUgJiYgdmlzLT5ncmVlbkJpdHMgPT0gNiAmJiB2aXMtPmJsdWVCaXRzID09IDUpIHsKLSAgICAgICAgIGludGVsSW5pdFBvaW50ZXJzXzU2NSgmZHJiLT5CYXNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgYXNzZXJ0KHZpcy0+cmVkQml0cyA9PSA4KTsKLSAgICAgICAgIGFzc2VydCh2aXMtPmdyZWVuQml0cyA9PSA4KTsKLSAgICAgICAgIGFzc2VydCh2aXMtPmJsdWVCaXRzID09IDgpOwotICAgICAgICAgaW50ZWxJbml0UG9pbnRlcnNfODg4OCgmZHJiLT5CYXNlKTsKLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UgaWYgKGRyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQxNikgewotICAgICAgaW50ZWxJbml0RGVwdGhQb2ludGVyc196MTYoJmRyYi0+QmFzZSk7Ci0gICB9Ci0gICBlbHNlIGlmIChkcmItPkJhc2UuSW50ZXJuYWxGb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UMjQpIHsKLSAgICAgIGludGVsSW5pdERlcHRoUG9pbnRlcnNfejI0X3M4KCZkcmItPkJhc2UpOwotICAgfQotICAgZWxzZSBpZiAoZHJiLT5CYXNlLkludGVybmFsRm9ybWF0ID09IEdMX1NURU5DSUxfSU5ERVg4X0VYVCkgewotICAgICAgaW50ZWxJbml0U3RlbmNpbFBvaW50ZXJzX3oyNF9zOCgmZHJiLT5CYXNlKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zcGFuLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDVlNWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3Bhbi5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX3NwYW4uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3RhdGUuYwppbmRleCBlNTk4OGE1Li5kMWNhMTFkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3N0YXRlLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zdGF0ZS5jCkBAIC0zMCwyNTIgKzMwLDI2NiBAQAogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJtYWNyb3MuaCIKICNpbmNsdWRlICJlbnVtcy5oIgorI2luY2x1ZGUgImNvbG9ybWFjLmgiCiAjaW5jbHVkZSAiZGQuaCIKIAogI2luY2x1ZGUgImludGVsX3NjcmVlbi5oIgogI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCiAjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgogCi1pbnQgaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyggR0xlbnVtIGZ1bmMgKQoraW50IAoraW50ZWxfdHJhbnNsYXRlX3NoYWRvd19jb21wYXJlX2Z1bmMoIEdMZW51bSBmdW5jICkKIHsKICAgIHN3aXRjaChmdW5jKSB7CiAgICBjYXNlIEdMX05FVkVSOiAKLSAgICAgIHJldHVybiBDT01QQVJFRlVOQ19ORVZFUjsgCisgICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0FMV0FZUzsgCiAgICBjYXNlIEdMX0xFU1M6IAotICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0xFU1M7IAorICAgICAgIHJldHVybiBDT01QQVJFRlVOQ19MRVFVQUw7IAogICAgY2FzZSBHTF9MRVFVQUw6IAotICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0xFUVVBTDsgCisgICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0xFU1M7CiAgICBjYXNlIEdMX0dSRUFURVI6IAotICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0dSRUFURVI7IAorICAgICAgIHJldHVybiBDT01QQVJFRlVOQ19HRVFVQUw7IAogICAgY2FzZSBHTF9HRVFVQUw6IAotICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0dFUVVBTDsgCisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfR1JFQVRFUjsgCiAgICBjYXNlIEdMX05PVEVRVUFMOiAKLSAgICAgIHJldHVybiBDT01QQVJFRlVOQ19OT1RFUVVBTDsgCi0gICBjYXNlIEdMX0VRVUFMOiAKICAgICAgIHJldHVybiBDT01QQVJFRlVOQ19FUVVBTDsgCisgICBjYXNlIEdMX0VRVUFMOiAKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19OT1RFUVVBTDsgCiAgICBjYXNlIEdMX0FMV0FZUzogCi0gICAgICByZXR1cm4gQ09NUEFSRUZVTkNfQUxXQVlTOyAKKyAgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfTkVWRVI7IAogICAgfQogCiAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdmFsdWUgaW4gJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGZ1bmMpOwotICAgcmV0dXJuIENPTVBBUkVGVU5DX0FMV0FZUzsgCisgICByZXR1cm4gQ09NUEFSRUZVTkNfTkVWRVI7IAogfQogCi1pbnQgaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoIEdMZW51bSBvcCApCitpbnQKK2ludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoR0xlbnVtIGZ1bmMpCiB7Ci0gICBzd2l0Y2gob3ApIHsKLSAgIGNhc2UgR0xfS0VFUDogCi0gICAgICByZXR1cm4gU1RFTkNJTE9QX0tFRVA7IAotICAgY2FzZSBHTF9aRVJPOiAKLSAgICAgIHJldHVybiBTVEVOQ0lMT1BfWkVSTzsgCi0gICBjYXNlIEdMX1JFUExBQ0U6IAotICAgICAgcmV0dXJuIFNURU5DSUxPUF9SRVBMQUNFOyAKLSAgIGNhc2UgR0xfSU5DUjogCisgICBzd2l0Y2ggKGZ1bmMpIHsKKyAgIGNhc2UgR0xfTkVWRVI6CisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfTkVWRVI7CisgICBjYXNlIEdMX0xFU1M6CisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfTEVTUzsKKyAgIGNhc2UgR0xfTEVRVUFMOgorICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0xFUVVBTDsKKyAgIGNhc2UgR0xfR1JFQVRFUjoKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19HUkVBVEVSOworICAgY2FzZSBHTF9HRVFVQUw6CisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfR0VRVUFMOworICAgY2FzZSBHTF9OT1RFUVVBTDoKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19OT1RFUVVBTDsKKyAgIGNhc2UgR0xfRVFVQUw6CisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfRVFVQUw7CisgICBjYXNlIEdMX0FMV0FZUzoKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19BTFdBWVM7CisgICB9CisKKyAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB2YWx1ZSBpbiAlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgZnVuYyk7CisgICByZXR1cm4gQ09NUEFSRUZVTkNfQUxXQVlTOworfQorCitpbnQKK2ludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKEdMZW51bSBvcCkKK3sKKyAgIHN3aXRjaCAob3ApIHsKKyAgIGNhc2UgR0xfS0VFUDoKKyAgICAgIHJldHVybiBTVEVOQ0lMT1BfS0VFUDsKKyAgIGNhc2UgR0xfWkVSTzoKKyAgICAgIHJldHVybiBTVEVOQ0lMT1BfWkVSTzsKKyAgIGNhc2UgR0xfUkVQTEFDRToKKyAgICAgIHJldHVybiBTVEVOQ0lMT1BfUkVQTEFDRTsKKyAgIGNhc2UgR0xfSU5DUjoKICAgICAgIHJldHVybiBTVEVOQ0lMT1BfSU5DUlNBVDsKLSAgIGNhc2UgR0xfREVDUjogCisgICBjYXNlIEdMX0RFQ1I6CiAgICAgICByZXR1cm4gU1RFTkNJTE9QX0RFQ1JTQVQ7CiAgICBjYXNlIEdMX0lOQ1JfV1JBUDoKLSAgICAgIHJldHVybiBTVEVOQ0lMT1BfSU5DUjsgCisgICAgICByZXR1cm4gU1RFTkNJTE9QX0lOQ1I7CiAgICBjYXNlIEdMX0RFQ1JfV1JBUDoKLSAgICAgIHJldHVybiBTVEVOQ0lMT1BfREVDUjsgCi0gICBjYXNlIEdMX0lOVkVSVDogCi0gICAgICByZXR1cm4gU1RFTkNJTE9QX0lOVkVSVDsgCi0gICBkZWZhdWx0OiAKKyAgICAgIHJldHVybiBTVEVOQ0lMT1BfREVDUjsKKyAgIGNhc2UgR0xfSU5WRVJUOgorICAgICAgcmV0dXJuIFNURU5DSUxPUF9JTlZFUlQ7CisgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIFNURU5DSUxPUF9aRVJPOwogICAgfQogfQogCi1pbnQgaW50ZWxfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvciggR0xlbnVtIGZhY3RvciApCitpbnQKK2ludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoR0xlbnVtIGZhY3RvcikKIHsKLSAgIHN3aXRjaChmYWN0b3IpIHsKLSAgIGNhc2UgR0xfWkVSTzogCi0gICAgICByZXR1cm4gQkxFTkRGQUNUX1pFUk87IAotICAgY2FzZSBHTF9TUkNfQUxQSEE6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9TUkNfQUxQSEE7IAotICAgY2FzZSBHTF9PTkU6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9PTkU7IAotICAgY2FzZSBHTF9TUkNfQ09MT1I6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9TUkNfQ09MUjsgCi0gICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9JTlZfU1JDX0NPTFI7IAotICAgY2FzZSBHTF9EU1RfQ09MT1I6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9EU1RfQ09MUjsgCi0gICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6IAotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9JTlZfRFNUX0NPTFI7IAorICAgc3dpdGNoIChmYWN0b3IpIHsKKyAgIGNhc2UgR0xfWkVSTzoKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfWkVSTzsKKyAgIGNhc2UgR0xfU1JDX0FMUEhBOgorICAgICAgcmV0dXJuIEJMRU5ERkFDVF9TUkNfQUxQSEE7CisgICBjYXNlIEdMX09ORToKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfT05FOworICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICAgICByZXR1cm4gQkxFTkRGQUNUX1NSQ19DT0xSOworICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOgorICAgICAgcmV0dXJuIEJMRU5ERkFDVF9JTlZfU1JDX0NPTFI7CisgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfRFNUX0NPTFI7CisgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICByZXR1cm4gQkxFTkRGQUNUX0lOVl9EU1RfQ09MUjsKICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgIHJldHVybiBCTEVOREZBQ1RfSU5WX1NSQ19BTFBIQTsgCi0gICBjYXNlIEdMX0RTVF9BTFBIQTogCi0gICAgICByZXR1cm4gQkxFTkRGQUNUX0RTVF9BTFBIQTsgCisgICAgICByZXR1cm4gQkxFTkRGQUNUX0lOVl9TUkNfQUxQSEE7CisgICBjYXNlIEdMX0RTVF9BTFBIQToKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfRFNUX0FMUEhBOwogICAgY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOgotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9JTlZfRFNUX0FMUEhBOyAKLSAgIGNhc2UgR0xfU1JDX0FMUEhBX1NBVFVSQVRFOiAKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfSU5WX0RTVF9BTFBIQTsKKyAgIGNhc2UgR0xfU1JDX0FMUEhBX1NBVFVSQVRFOgogICAgICAgcmV0dXJuIEJMRU5ERkFDVF9TUkNfQUxQSEFfU0FUVVJBVEU7CiAgICBjYXNlIEdMX0NPTlNUQU5UX0NPTE9SOgotICAgICAgcmV0dXJuIEJMRU5ERkFDVF9DT05TVF9DT0xPUjsgCisgICAgICByZXR1cm4gQkxFTkRGQUNUX0NPTlNUX0NPTE9SOwogICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I6CiAgICAgICByZXR1cm4gQkxFTkRGQUNUX0lOVl9DT05TVF9DT0xPUjsKICAgIGNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6Ci0gICAgICByZXR1cm4gQkxFTkRGQUNUX0NPTlNUX0FMUEhBOyAKKyAgICAgIHJldHVybiBCTEVOREZBQ1RfQ09OU1RfQUxQSEE7CiAgICBjYXNlIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQToKICAgICAgIHJldHVybiBCTEVOREZBQ1RfSU5WX0NPTlNUX0FMUEhBOwogICAgfQotICAgCisKICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB2YWx1ZSBpbiAlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgZmFjdG9yKTsKICAgIHJldHVybiBCTEVOREZBQ1RfWkVSTzsKIH0KIAotaW50IGludGVsX3RyYW5zbGF0ZV9sb2dpY19vcCggR0xlbnVtIG9wY29kZSApCitpbnQKK2ludGVsX3RyYW5zbGF0ZV9sb2dpY19vcChHTGVudW0gb3Bjb2RlKQogewotICAgc3dpdGNoKG9wY29kZSkgewotICAgY2FzZSBHTF9DTEVBUjogCi0gICAgICByZXR1cm4gTE9HSUNPUF9DTEVBUjsgCi0gICBjYXNlIEdMX0FORDogCi0gICAgICByZXR1cm4gTE9HSUNPUF9BTkQ7IAotICAgY2FzZSBHTF9BTkRfUkVWRVJTRTogCi0gICAgICByZXR1cm4gTE9HSUNPUF9BTkRfUlZSU0U7IAotICAgY2FzZSBHTF9DT1BZOiAKLSAgICAgIHJldHVybiBMT0dJQ09QX0NPUFk7IAotICAgY2FzZSBHTF9DT1BZX0lOVkVSVEVEOiAKLSAgICAgIHJldHVybiBMT0dJQ09QX0NPUFlfSU5WOyAKLSAgIGNhc2UgR0xfQU5EX0lOVkVSVEVEOiAKLSAgICAgIHJldHVybiBMT0dJQ09QX0FORF9JTlY7IAotICAgY2FzZSBHTF9OT09QOiAKLSAgICAgIHJldHVybiBMT0dJQ09QX05PT1A7IAotICAgY2FzZSBHTF9YT1I6IAotICAgICAgcmV0dXJuIExPR0lDT1BfWE9SOyAKLSAgIGNhc2UgR0xfT1I6IAotICAgICAgcmV0dXJuIExPR0lDT1BfT1I7IAotICAgY2FzZSBHTF9PUl9JTlZFUlRFRDogCi0gICAgICByZXR1cm4gTE9HSUNPUF9PUl9JTlY7IAotICAgY2FzZSBHTF9OT1I6IAotICAgICAgcmV0dXJuIExPR0lDT1BfTk9SOyAKLSAgIGNhc2UgR0xfRVFVSVY6IAotICAgICAgcmV0dXJuIExPR0lDT1BfRVFVSVY7IAotICAgY2FzZSBHTF9JTlZFUlQ6IAotICAgICAgcmV0dXJuIExPR0lDT1BfSU5WOyAKLSAgIGNhc2UgR0xfT1JfUkVWRVJTRTogCi0gICAgICByZXR1cm4gTE9HSUNPUF9PUl9SVlJTRTsgCi0gICBjYXNlIEdMX05BTkQ6IAotICAgICAgcmV0dXJuIExPR0lDT1BfTkFORDsgCi0gICBjYXNlIEdMX1NFVDogCi0gICAgICByZXR1cm4gTE9HSUNPUF9TRVQ7IAorICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgR0xfQ0xFQVI6CisgICAgICByZXR1cm4gTE9HSUNPUF9DTEVBUjsKKyAgIGNhc2UgR0xfQU5EOgorICAgICAgcmV0dXJuIExPR0lDT1BfQU5EOworICAgY2FzZSBHTF9BTkRfUkVWRVJTRToKKyAgICAgIHJldHVybiBMT0dJQ09QX0FORF9SVlJTRTsKKyAgIGNhc2UgR0xfQ09QWToKKyAgICAgIHJldHVybiBMT0dJQ09QX0NPUFk7CisgICBjYXNlIEdMX0NPUFlfSU5WRVJURUQ6CisgICAgICByZXR1cm4gTE9HSUNPUF9DT1BZX0lOVjsKKyAgIGNhc2UgR0xfQU5EX0lOVkVSVEVEOgorICAgICAgcmV0dXJuIExPR0lDT1BfQU5EX0lOVjsKKyAgIGNhc2UgR0xfTk9PUDoKKyAgICAgIHJldHVybiBMT0dJQ09QX05PT1A7CisgICBjYXNlIEdMX1hPUjoKKyAgICAgIHJldHVybiBMT0dJQ09QX1hPUjsKKyAgIGNhc2UgR0xfT1I6CisgICAgICByZXR1cm4gTE9HSUNPUF9PUjsKKyAgIGNhc2UgR0xfT1JfSU5WRVJURUQ6CisgICAgICByZXR1cm4gTE9HSUNPUF9PUl9JTlY7CisgICBjYXNlIEdMX05PUjoKKyAgICAgIHJldHVybiBMT0dJQ09QX05PUjsKKyAgIGNhc2UgR0xfRVFVSVY6CisgICAgICByZXR1cm4gTE9HSUNPUF9FUVVJVjsKKyAgIGNhc2UgR0xfSU5WRVJUOgorICAgICAgcmV0dXJuIExPR0lDT1BfSU5WOworICAgY2FzZSBHTF9PUl9SRVZFUlNFOgorICAgICAgcmV0dXJuIExPR0lDT1BfT1JfUlZSU0U7CisgICBjYXNlIEdMX05BTkQ6CisgICAgICByZXR1cm4gTE9HSUNPUF9OQU5EOworICAgY2FzZSBHTF9TRVQ6CisgICAgICByZXR1cm4gTE9HSUNPUF9TRVQ7CiAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIExPR0lDT1BfU0VUOwogICAgfQogfQogCi1zdGF0aWMgdm9pZCBpbnRlbERyYXdCdWZmZXIoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlICkKKworc3RhdGljIHZvaWQKK2ludGVsQ2xlYXJDb2xvcihHTGNvbnRleHQgKiBjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCiB7Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKGN0eCk7Ci0gICBpbnQgZnJvbnQgPSAwOwotIAotICAgaWYgKCFjdHgtPkRyYXdCdWZmZXIpCi0gICAgICByZXR1cm47CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBHTHVieXRlIGNsZWFyWzRdOwogCi0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6Ci0gICAgICBmcm9udCA9IDE7Ci0gICAgICBGQUxMQkFDSyggaW50ZWwsIElOVEVMX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9GQUxTRSApOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgotICAgICAgZnJvbnQgPSAwOwotICAgICAgRkFMTEJBQ0soIGludGVsLCBJTlRFTF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIEZBTExCQUNLKCBpbnRlbCwgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKLSAgICAgIHJldHVybjsKLSAgIH0KKyAgIENMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2xlYXJbMF0sIGNvbG9yWzBdKTsKKyAgIENMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2xlYXJbMV0sIGNvbG9yWzFdKTsKKyAgIENMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2xlYXJbMl0sIGNvbG9yWzJdKTsKKyAgIENMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2xlYXJbM10sIGNvbG9yWzNdKTsKIAotICAgaWYgKCBpbnRlbC0+c2FyZWEtPnBmX2N1cnJlbnRfcGFnZSA9PSAxICkgCi0gICAgICBmcm9udCBePSAxOwotICAgCi0gICBpbnRlbFNldEZyb250Q2xpcFJlY3RzKCBpbnRlbCApOwotCi0gICBpZiAoZnJvbnQpIHsKLSAgICAgIGludGVsLT5kcmF3UmVnaW9uID0gJmludGVsLT5pbnRlbFNjcmVlbi0+ZnJvbnQ7Ci0gICAgICBpbnRlbC0+cmVhZFJlZ2lvbiA9ICZpbnRlbC0+aW50ZWxTY3JlZW4tPmZyb250OwotICAgfSBlbHNlIHsKLSAgICAgIGludGVsLT5kcmF3UmVnaW9uID0gJmludGVsLT5pbnRlbFNjcmVlbi0+YmFjazsKLSAgICAgIGludGVsLT5yZWFkUmVnaW9uID0gJmludGVsLT5pbnRlbFNjcmVlbi0+YmFjazsKLSAgIH0KLQotICAgaW50ZWwtPnZ0Ymwuc2V0X2NvbG9yX3JlZ2lvbiggaW50ZWwsIGludGVsLT5kcmF3UmVnaW9uICk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsUmVhZEJ1ZmZlciggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlICkKLXsKLSAgIC8qIG5vdGhpbmcsIHVudGlsIHdlIGltcGxlbWVudCBoL3cgZ2xSZWFkL0NvcHlQaXhlbHMgb3IgQ29weVRleEltYWdlICovCisgICAvKiBjb21wdXRlIGJvdGggMzIgYW5kIDE2LWJpdCBjbGVhciB2YWx1ZXMgKi8KKyAgIGludGVsLT5DbGVhckNvbG9yODg4OCA9IElOVEVMX1BBQ0tDT0xPUjg4ODgoY2xlYXJbMF0sIGNsZWFyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclsyXSwgY2xlYXJbM10pOworICAgaW50ZWwtPkNsZWFyQ29sb3I1NjUgPSBJTlRFTF9QQUNLQ09MT1I1NjUoY2xlYXJbMF0sIGNsZWFyWzFdLCBjbGVhclsyXSk7CiB9CiAKIAotc3RhdGljIHZvaWQgaW50ZWxDbGVhckNvbG9yKEdMY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IGNvbG9yWzRdKQorLyoqCisgKiBVcGRhdGUgdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gIERlcGVuZHMgb246CisgKiAgLSB2aWV3cG9ydCBwb3Mvc2l6ZQorICogIC0gZGVwdGhyYW5nZQorICogIC0gd2luZG93IHBvcy9zaXplIG9yIEZCTyBzaXplCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbENhbGNWaWV3cG9ydChHTGNvbnRleHQgKiBjdHgpCiB7Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKGN0eCk7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLQotICAgQ0xBTVBFRF9GTE9BVF9UT19VQllURShpbnRlbC0+Y2xlYXJfcmVkLCBjb2xvclswXSk7Ci0gICBDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGludGVsLT5jbGVhcl9ncmVlbiwgY29sb3JbMV0pOwotICAgQ0xBTVBFRF9GTE9BVF9UT19VQllURShpbnRlbC0+Y2xlYXJfYmx1ZSwgY29sb3JbMl0pOwotICAgQ0xBTVBFRF9GTE9BVF9UT19VQllURShpbnRlbC0+Y2xlYXJfYWxwaGEsIGNvbG9yWzNdKTsKLQotICAgaW50ZWwtPkNsZWFyQ29sb3IgPSBJTlRFTF9QQUNLQ09MT1Ioc2NyZWVuLT5mYkZvcm1hdCwKLQkJCQkgICAgICAgaW50ZWwtPmNsZWFyX3JlZCwgCi0JCQkJICAgICAgIGludGVsLT5jbGVhcl9ncmVlbiwgCi0JCQkJICAgICAgIGludGVsLT5jbGVhcl9ibHVlLCAKLQkJCQkgICAgICAgaW50ZWwtPmNsZWFyX2FscGhhKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbnRlbENhbGNWaWV3cG9ydCggR0xjb250ZXh0ICpjdHggKQotewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwogICAgY29uc3QgR0xmbG9hdCAqdiA9IGN0eC0+Vmlld3BvcnQuX1dpbmRvd01hcC5tOworICAgY29uc3QgR0xmbG9hdCBkZXB0aFNjYWxlID0gMS4wRiAvIGN0eC0+RHJhd0J1ZmZlci0+X0RlcHRoTWF4RjsKICAgIEdMZmxvYXQgKm0gPSBpbnRlbC0+Vmlld3BvcnRNYXRyaXgubTsKLSAgIEdMaW50IGggPSAwOworICAgR0xmbG9hdCB5U2NhbGUsIHlCaWFzOwogCi0gICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlKSAKLSAgICAgIGggPSBpbnRlbC0+ZHJpRHJhd2FibGUtPmggKyBTVUJQSVhFTF9ZOworICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+TmFtZSkgeworICAgICAgLyogVXNlciBjcmVhdGVkIEZCTyAqLworICAgICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiCisgICAgICAgICA9IGludGVsX3JlbmRlcmJ1ZmZlcihjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdKTsKKyAgICAgIGlmIChpcmIgJiYgIWlyYi0+UmVuZGVyVG9UZXh0dXJlKSB7CisgICAgICAgICAvKiB5PTA9dG9wICovCisgICAgICAgICB5U2NhbGUgPSAtMS4wOworICAgICAgICAgeUJpYXMgPSBpcmItPkJhc2UuSGVpZ2h0OworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAvKiB5PTA9Ym90dG9tICovCisgICAgICAgICB5U2NhbGUgPSAxLjA7CisgICAgICAgICB5QmlhcyA9IDAuMDsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogd2luZG93IGJ1ZmZlciwgeT0wPXRvcCAqLworICAgICAgeVNjYWxlID0gLTEuMDsKKyAgICAgIHlCaWFzID0gKGludGVsLT5kcmlEcmF3YWJsZSkgPyBpbnRlbC0+ZHJpRHJhd2FibGUtPmggOiAwLjBGOworICAgfQogCi0gICAvKiBTZWUgYWxzbyBpbnRlbF90cmFuc2xhdGVfdmVydGV4LiAgU1VCUElYRUwgYWRqdXN0bWVudHMgY2FuIGJlIGRvbmUKLSAgICAqIHZpYSBzdGF0ZSB2YXJzLCB0b28uCi0gICAgKi8KLSAgIG1bTUFUX1NYXSA9ICAgdltNQVRfU1hdOwotICAgbVtNQVRfVFhdID0gICB2W01BVF9UWF0gKyBTVUJQSVhFTF9YOwotICAgbVtNQVRfU1ldID0gLSB2W01BVF9TWV07Ci0gICBtW01BVF9UWV0gPSAtIHZbTUFUX1RZXSArIGg7Ci0gICBtW01BVF9TWl0gPSAgIHZbTUFUX1NaXSAqIGludGVsLT5kZXB0aF9zY2FsZTsKLSAgIG1bTUFUX1RaXSA9ICAgdltNQVRfVFpdICogaW50ZWwtPmRlcHRoX3NjYWxlOworICAgbVtNQVRfU1hdID0gdltNQVRfU1hdOworICAgbVtNQVRfVFhdID0gdltNQVRfVFhdOworCisgICBtW01BVF9TWV0gPSB2W01BVF9TWV0gKiB5U2NhbGU7CisgICBtW01BVF9UWV0gPSB2W01BVF9UWV0gKiB5U2NhbGUgKyB5QmlhczsKKworICAgbVtNQVRfU1pdID0gdltNQVRfU1pdICogZGVwdGhTY2FsZTsKKyAgIG1bTUFUX1RaXSA9IHZbTUFUX1RaXSAqIGRlcHRoU2NhbGU7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsVmlld3BvcnQoIEdMY29udGV4dCAqY3R4LAotCQkJICBHTGludCB4LCBHTGludCB5LAotCQkJICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApCitzdGF0aWMgdm9pZAoraW50ZWxWaWV3cG9ydChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQogewotICAgaW50ZWxDYWxjVmlld3BvcnQoIGN0eCApOworICAgaW50ZWxDYWxjVmlld3BvcnQoY3R4KTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxEZXB0aFJhbmdlKCBHTGNvbnRleHQgKmN0eCwKLQkJCSAgICBHTGNsYW1wZCBuZWFydmFsLCBHTGNsYW1wZCBmYXJ2YWwgKQorc3RhdGljIHZvaWQKK2ludGVsRGVwdGhSYW5nZShHTGNvbnRleHQgKiBjdHgsIEdMY2xhbXBkIG5lYXJ2YWwsIEdMY2xhbXBkIGZhcnZhbCkKIHsKLSAgIGludGVsQ2FsY1ZpZXdwb3J0KCBjdHggKTsKKyAgIGludGVsQ2FsY1ZpZXdwb3J0KGN0eCk7CiB9CiAKIC8qIEZhbGxiYWNrIHRvIHN3cmFzdCBmb3Igc2VsZWN0IGFuZCBmZWVkYmFjay4KICAqLwotc3RhdGljIHZvaWQgaW50ZWxSZW5kZXJNb2RlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUgKQorc3RhdGljIHZvaWQKK2ludGVsUmVuZGVyTW9kZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBtb2RlKQogewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOwotICAgRkFMTEJBQ0soIGludGVsLCBJTlRFTF9GQUxMQkFDS19SRU5ERVJNT0RFLCAobW9kZSAhPSBHTF9SRU5ERVIpICk7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfUkVOREVSTU9ERSwgKG1vZGUgIT0gR0xfUkVOREVSKSk7CiB9CiAKIAotdm9pZCBpbnRlbEluaXRTdGF0ZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCit2b2lkCitpbnRlbEluaXRTdGF0ZUZ1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKQogewotICAgZnVuY3Rpb25zLT5EcmF3QnVmZmVyID0gaW50ZWxEcmF3QnVmZmVyOwotICAgZnVuY3Rpb25zLT5SZWFkQnVmZmVyID0gaW50ZWxSZWFkQnVmZmVyOwogICAgZnVuY3Rpb25zLT5SZW5kZXJNb2RlID0gaW50ZWxSZW5kZXJNb2RlOwogICAgZnVuY3Rpb25zLT5WaWV3cG9ydCA9IGludGVsVmlld3BvcnQ7CiAgICBmdW5jdGlvbnMtPkRlcHRoUmFuZ2UgPSBpbnRlbERlcHRoUmFuZ2U7CiAgICBmdW5jdGlvbnMtPkNsZWFyQ29sb3IgPSBpbnRlbENsZWFyQ29sb3I7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3RydWN0cy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF9zdHJ1Y3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyZTNiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3RydWN0cy5oCkBAIC0wLDAgKzEsMTMyIEBACisjaWZuZGVmIElOVEVMX1NUUlVDVFNfSAorI2RlZmluZSBJTlRFTF9TVFJVQ1RTX0gKKworc3RydWN0IGJyMCB7CisgICBHTHVpbnQgbGVuZ3RoOjg7CisgICBHTHVpbnQgcGFkMDozOworICAgR0x1aW50IGRzdF90aWxlZDoxOworICAgR0x1aW50IHBhZDE6ODsKKyAgIEdMdWludCB3cml0ZV9yZ2I6MTsKKyAgIEdMdWludCB3cml0ZV9hbHBoYToxOworICAgR0x1aW50IG9wY29kZTo3OworICAgR0x1aW50IGNsaWVudDozOworfTsKKworICAgCitzdHJ1Y3QgYnIxMyB7CisgICBHTGludCBkZXN0X3BpdGNoOjE2OworICAgR0x1aW50IHJvcDo4OworICAgR0x1aW50IGNvbG9yX2RlcHRoOjI7CisgICBHTHVpbnQgcGFkMTozOworICAgR0x1aW50IG1vbm9fc291cmNlX3RyYW5zcGFyZW5jeToxOworICAgR0x1aW50IGNsaXBwaW5nX2VuYWJsZToxOworICAgR0x1aW50IHBhZDA6MTsKK307CisKKworCisvKiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gbW92ZSBzb21lIG9mIHRoZSAyRCBpbnRlcmFjdGlvbiBpbiB0aGlzCisgKiBkcml2ZXIgdG8gdXNpbmcgc3RydWN0cyBmb3IgcGFja2V0cyByYXRoZXIgdGhhbiBhIGJ1bmNoIG9mICNkZWZpbmVzCisgKiBhbmQgZHdvcmRzLgorICovCitzdHJ1Y3QgeHlfY29sb3JfYmxpdCB7CisgICBzdHJ1Y3QgYnIwIGJyMDsKKyAgIHN0cnVjdCBicjEzIGJyMTM7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgZGVzdF94MToxNjsKKyAgICAgIEdMdWludCBkZXN0X3kxOjE2OworICAgfSBkdzI7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgZGVzdF94MjoxNjsKKyAgICAgIEdMdWludCBkZXN0X3kyOjE2OworICAgfSBkdzM7CisgICAKKyAgIEdMdWludCBkZXN0X2Jhc2VfYWRkcjsKKyAgIEdMdWludCBjb2xvcjsKK307CisKK3N0cnVjdCB4eV9zcmNfY29weV9ibGl0IHsKKyAgIHN0cnVjdCBicjAgYnIwOworICAgc3RydWN0IGJyMTMgYnIxMzsKKworICAgc3RydWN0IHsKKyAgICAgIEdMdWludCBkZXN0X3gxOjE2OworICAgICAgR0x1aW50IGRlc3RfeTE6MTY7CisgICB9IGR3MjsKKworICAgc3RydWN0IHsKKyAgICAgIEdMdWludCBkZXN0X3gyOjE2OworICAgICAgR0x1aW50IGRlc3RfeTI6MTY7CisgICB9IGR3MzsKKyAgIAorICAgR0x1aW50IGRlc3RfYmFzZV9hZGRyOworCisgICBzdHJ1Y3QgeworICAgICAgR0x1aW50IHNyY194MToxNjsKKyAgICAgIEdMdWludCBzcmNfeTE6MTY7CisgICB9IGR3NTsKKworICAgc3RydWN0IHsKKyAgICAgIEdMaW50IHNyY19waXRjaDoxNjsKKyAgICAgIEdMdWludCBwYWQ6MTY7CisgICB9IGR3NjsKKyAgIAorICAgR0x1aW50IHNyY19iYXNlX2FkZHI7Cit9OworCitzdHJ1Y3QgeHlfc2V0dXBfYmxpdCB7CisgICBzdHJ1Y3QgYnIwIGJyMDsKKyAgIHN0cnVjdCBicjEzIGJyMTM7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgY2xpcF94MToxNjsKKyAgICAgIEdMdWludCBjbGlwX3kxOjE2OworICAgfSBkdzI7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgY2xpcF94MjoxNjsKKyAgICAgIEdMdWludCBjbGlwX3kyOjE2OworICAgfSBkdzM7CisgICAgICAKKyAgIEdMdWludCBkZXN0X2Jhc2VfYWRkcjsKKyAgIEdMdWludCBiYWNrZ3JvdW5kX2NvbG9yOworICAgR0x1aW50IGZvcmVncm91bmRfY29sb3I7CisgICBHTHVpbnQgcGF0dGVybl9iYXNlX2FkZHI7Cit9OworCisKK3N0cnVjdCB4eV90ZXh0X2ltbWVkaWF0ZV9ibGl0IHsKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgbGVuZ3RoOjg7CisgICAgICBHTHVpbnQgcGFkMjozOworICAgICAgR0x1aW50IGRzdF90aWxlZDoxOworICAgICAgR0x1aW50IHBhZDE6NDsKKyAgICAgIEdMdWludCBieXRlX3BhY2tlZDoxOworICAgICAgR0x1aW50IHBhZDA6NTsKKyAgICAgIEdMdWludCBvcGNvZGU6NzsKKyAgICAgIEdMdWludCBjbGllbnQ6MzsKKyAgIH0gZHcwOworCisgICBzdHJ1Y3QgeworICAgICAgR0x1aW50IGRlc3RfeDE6MTY7CisgICAgICBHTHVpbnQgZGVzdF95MToxNjsKKyAgIH0gZHcxOworCisgICBzdHJ1Y3QgeworICAgICAgR0x1aW50IGRlc3RfeDI6MTY7CisgICAgICBHTHVpbnQgZGVzdF95MjoxNjsKKyAgIH0gZHcyOyAgIAorCisgICAvKiBTcmMgYml0bWFwIGRhdGEgZm9sbG93cyBhcyBpbmxpbmUgZHdvcmRzLgorICAgICovCit9OworCisKKyNkZWZpbmUgQ0xJRU5UXzJEIDB4MgorI2RlZmluZSBPUENPREVfWFlfU0VUVVBfQkxUIDB4MQorI2RlZmluZSBPUENPREVfWFlfQ09MT1JfQkxUIDB4NTAKKyNkZWZpbmUgT1BDT0RFX1hZX1RFWFRfSU1NRURJQVRFX0JMVCAweDMxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDI4MDYuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDg3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJpbXBvcnRzLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAic2ltcGxlX2xpc3QuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotI2luY2x1ZGUgImltYWdlLmgiCi0jaW5jbHVkZSAidGV4c3RvcmUuaCIKLSNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKLSNpbmNsdWRlICJ0ZXhpbWFnZS5oIgotI2luY2x1ZGUgInRleG1lbS5oIgotI2luY2x1ZGUgInRleG9iai5oIgotI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKLQotI2luY2x1ZGUgIm1tLmgiCi0KLSNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKLSNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgotI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKLSNpbmNsdWRlICJpbnRlbF90ZXguaCIKLSNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgotCi0KLQotc3RhdGljIEdMYm9vbGVhbgotaW50ZWxWYWxpZGF0ZUNsaWVudFN0b3JhZ2UoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0xlbnVtIHRhcmdldCwKLQkJCSAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKLQkJCSAgICBHTGludCBzcmNXaWR0aCwgR0xpbnQgc3JjSGVpZ2h0LCAKLQkJCSAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgIGNvbnN0IHZvaWQgKnBpeGVscywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQotCi17Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotICAgaW50IHRleGVsQnl0ZXM7Ci0KLSAgIGlmICgwKQotICAgICAgZnByaW50ZihzdGRlcnIsICJpbnRmb3JtYXQgJXMgZm9ybWF0ICVzIHR5cGUgJXNcbiIsCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoIGludGVybmFsRm9ybWF0ICksCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoIGZvcm1hdCApLAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKCB0eXBlICkpOwotCi0gICBpZiAoIWN0eC0+VW5wYWNrLkNsaWVudFN0b3JhZ2UpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSB8fAotICAgICAgIHRleEltYWdlLT5Jc0NvbXByZXNzZWQgfHwKLSAgICAgICB0ZXhPYmotPkdlbmVyYXRlTWlwbWFwKQotICAgICAgcmV0dXJuIDA7Ci0KLQotICAgLyogVGhpcyBsaXN0IGlzIGluY29tcGxldGUKLSAgICAqLwotICAgc3dpdGNoICggaW50ZXJuYWxGb3JtYXQgKSB7Ci0gICBjYXNlIEdMX1JHQkE6Ci0gICAgICBpZiAoIGZvcm1hdCA9PSBHTF9CR1JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWICkgewotCSB0ZXhJbWFnZS0+VGV4Rm9ybWF0ID0gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4ODsKLQkgdGV4ZWxCeXRlcyA9IDQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JIHJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgR0xfUkdCOgotICAgICAgaWYgKCBmb3JtYXQgPT0gR0xfUkdCICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgKSB7Ci0JIHRleEltYWdlLT5UZXhGb3JtYXQgPSAmX21lc2FfdGV4Zm9ybWF0X3JnYjU2NTsKLQkgdGV4ZWxCeXRlcyA9IDI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JIHJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgR0xfWUNCQ1JfTUVTQToKLSAgICAgIGlmICggZm9ybWF0ID09IEdMX1lDQkNSX01FU0EgJiYgCi0JICAgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX0FQUExFICkgewotCSB0ZXhJbWFnZS0+VGV4Rm9ybWF0ID0gJl9tZXNhX3RleGZvcm1hdF95Y2Jjcl9yZXY7Ci0JIHRleGVsQnl0ZXMgPSAyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGZvcm1hdCA9PSBHTF9ZQ0JDUl9NRVNBICYmIAotCQkodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgfHwgCi0JCSB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpKSB7Ci0JIHRleEltYWdlLT5UZXhGb3JtYXQgPSAmX21lc2FfdGV4Zm9ybWF0X3ljYmNyOwotCSB0ZXhlbEJ5dGVzID0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQkgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotCSAKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgLyogQ291bGQgZGVhbCB3aXRoIHRoZXNlIHBhY2tpbmcgaXNzdWVzLCBidXQgY3VycmVudGx5IGRvbid0OgotICAgICovCi0gICBpZiAocGFja2luZy0+U2tpcFBpeGVscyB8fCAKLSAgICAgICBwYWNraW5nLT5Ta2lwUm93cyB8fCAKLSAgICAgICBwYWNraW5nLT5Td2FwQnl0ZXMgfHwKLSAgICAgICBwYWNraW5nLT5Mc2JGaXJzdCkgewotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIHsgICAgICAKLSAgICAgIEdMaW50IHNyY1Jvd1N0cmlkZSA9IF9tZXNhX2ltYWdlX3Jvd19zdHJpZGUocGFja2luZywgc3JjV2lkdGgsCi0JCQkJCQkgIGZvcm1hdCwgdHlwZSk7Ci0KLSAgICAgIAotICAgICAgaWYgKDApCi0JIGZwcmludGYoc3RkZXJyLCAiJXM6IHNyY1Jvd1N0cmlkZSAlZC8leFxuIiwgCi0JCSBfX0ZVTkNUSU9OX18sIHNyY1Jvd1N0cmlkZSwgc3JjUm93U3RyaWRlKTsKLQotICAgICAgLyogQ291bGQgY2hlY2sgdGhpcyBsYXRlciBpbiB1cGxvYWQsIHBpdGNoIHJlc3RyaWN0aW9ucyBjb3VsZCBiZQotICAgICAgICogcmVsYXhlZCwgYnV0IHdvdWxkIG5lZWQgdG8gc3RvcmUgdGhlIGltYWdlIHBpdGNoIHNvbWV3aGVyZSwKLSAgICAgICAqIGFzIHBhY2tpbmcgZGV0YWlscyBtaWdodCBjaGFuZ2UgYmVmb3JlIGltYWdlIGlzIHVwbG9hZGVkOgotICAgICAgICovCi0gICAgICBpZiAoIWludGVsSXNBZ3BNZW1vcnkoIGludGVsLCBwaXhlbHMsIHNyY0hlaWdodCAqIHNyY1Jvd1N0cmlkZSApIHx8Ci0JICAoc3JjUm93U3RyaWRlICYgNjMpKQotCSByZXR1cm4gMDsKLQotCi0gICAgICAvKiBIYXZlIHZhbGlkYXRlZCB0aGF0IF9tZXNhX3RyYW5zZmVyX3RleGltYWdlIHdvdWxkIGJlIGEgc3RyYWlnaHQKLSAgICAgICAqIG1lbWNweSBhdCB0aGlzIHBvaW50LiAgTk9URTogZnV0dXJlIGNhbGxzIHRvIFRleFN1YkltYWdlIHdpbGwKLSAgICAgICAqIG92ZXJ3cml0ZSB0aGUgY2xpZW50IGRhdGEuICBUaGlzIGlzIGV4cGxpY2l0bHkgbWVudGlvbmVkIGluIHRoZQotICAgICAgICogZXh0ZW5zaW9uIHNwZWMuCi0gICAgICAgKi8KLSAgICAgIHRleEltYWdlLT5EYXRhID0gKHZvaWQgKilwaXhlbHM7Ci0gICAgICB0ZXhJbWFnZS0+SXNDbGllbnREYXRhID0gR0xfVFJVRTsKLSAgICAgIHRleEltYWdlLT5Sb3dTdHJpZGUgPSBzcmNSb3dTdHJpZGUgLyB0ZXhlbEJ5dGVzOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci19Ci0KLSAKLQotc3RhdGljIHZvaWQgaW50ZWxUZXhJbWFnZTFEKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCi0JCQkgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCi0JCQkgICAgR0xpbnQgd2lkdGgsIEdMaW50IGJvcmRlciwKLQkJCSAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMsCi0JCQkgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAotCQkJICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQkJICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICogdCA9IChkcmlUZXh0dXJlT2JqZWN0ICopIHRleE9iai0+RHJpdmVyRGF0YTsKLQotICAgYXNzZXJ0KHQpOwotICAgaW50ZWxGbHVzaCggY3R4ICk7Ci0gICBkcmlTd2FwT3V0VGV4dHVyZU9iamVjdCggdCApOwotCi0gICB0ZXhJbWFnZS0+SXNDbGllbnREYXRhID0gR0xfRkFMU0U7Ci0KLSAgIF9tZXNhX3N0b3JlX3RleGltYWdlMWQoIGN0eCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxGb3JtYXQsCi0JCQkgICB3aWR0aCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsCi0JCQkgICBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UgKTsKLQotICAgdC0+ZGlydHlfaW1hZ2VzWzBdIHw9ICgxIDw8IGxldmVsKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxUZXhTdWJJbWFnZTFEKCBHTGNvbnRleHQgKmN0eCwgCi0JCQkgICAgICAgR0xlbnVtIHRhcmdldCwKLQkJCSAgICAgICBHTGludCBsZXZlbCwJCi0JCQkgICAgICAgR0xpbnQgeG9mZnNldCwKLQkJCQlHTHNpemVpIHdpZHRoLAotCQkJICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotCQkJICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFja2luZywKLQkJCSAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLQkJCSAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgKQotewotICAgZHJpVGV4dHVyZU9iamVjdCAqIHQgPSAoZHJpVGV4dHVyZU9iamVjdCAqKSB0ZXhPYmotPkRyaXZlckRhdGE7Ci0KLSAgIGFzc2VydCh0KTsKLSAgIGludGVsRmx1c2goIGN0eCApOwotICAgZHJpU3dhcE91dFRleHR1cmVPYmplY3QoIHQgKTsKLQotICAgX21lc2Ffc3RvcmVfdGV4c3ViaW1hZ2UxZChjdHgsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHdpZHRoLCAKLQkJCSAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwKLQkJCSAgICAgdGV4SW1hZ2UpOwotfQotCi0KLS8qIEhhbmRsZXMgMkQsIENVQkUsIFJFQ1Q6Ci0gKi8KLXN0YXRpYyB2b2lkIGludGVsVGV4SW1hZ2UyRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAotCQkJICAgIEdMaW50IGludGVybmFsRm9ybWF0LAotCQkJICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciwKLQkJCSAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMsCi0JCQkgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAotCQkJICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQkJICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICogdCA9IChkcmlUZXh0dXJlT2JqZWN0ICopIHRleE9iai0+RHJpdmVyRGF0YTsKLSAgIEdMdWludCBmYWNlOwotCi0gICAvKiB3aGljaCBjdWJlIGZhY2Ugb3Igb3JkaW5hcnkgMkQgaW1hZ2UgKi8KLSAgIHN3aXRjaCAodGFyZ2V0KSB7Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6Ci0gICAgICBmYWNlID0gKEdMdWludCkgdGFyZ2V0IC0gKEdMdWludCkgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOwotICAgICAgQVNTRVJUKGZhY2UgPCA2KTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGZhY2UgPSAwOwotICAgfQotCi0gICBhc3NlcnQodCk7Ci0gICBpbnRlbEZsdXNoKCBjdHggKTsKLSAgIGRyaVN3YXBPdXRUZXh0dXJlT2JqZWN0KCB0ICk7Ci0gICB0ZXhJbWFnZS0+SXNDbGllbnREYXRhID0gR0xfRkFMU0U7Ci0KLSAgIGlmIChpbnRlbFZhbGlkYXRlQ2xpZW50U3RvcmFnZSggSU5URUxfQ09OVEVYVChjdHgpLCB0YXJnZXQsIAotCQkJCSAgIGludGVybmFsRm9ybWF0LCAKLQkJCQkgICB3aWR0aCwgaGVpZ2h0LCAKLQkJCQkgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgCi0JCQkJICAgcGFja2luZywgdGV4T2JqLCB0ZXhJbWFnZSkpIHsKLSAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCi0JIGZwcmludGYoc3RkZXJyLCAiJXM6IFVzaW5nIGNsaWVudCBzdG9yYWdlXG4iLCBfX0ZVTkNUSU9OX18pOyAKLSAgIH0KLSAgIGVsc2UgewotICAgICAgX21lc2Ffc3RvcmVfdGV4aW1hZ2UyZCggY3R4LCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbEZvcm1hdCwKLQkJCSAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLAotCQkJICAgICAgcGl4ZWxzLCBwYWNraW5nLCB0ZXhPYmosIHRleEltYWdlICk7Ci0KLSAgICAgIHQtPmRpcnR5X2ltYWdlc1tmYWNlXSB8PSAoMSA8PCBsZXZlbCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsVGV4U3ViSW1hZ2UyRCggR0xjb250ZXh0ICpjdHgsIAotCQkJICAgICAgIEdMZW51bSB0YXJnZXQsCi0JCQkgICAgICAgR0xpbnQgbGV2ZWwsCQotCQkJICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCi0JCQkgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0JCQkgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCi0JCQkgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAotCQkJICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQkJICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICogdCA9IChkcmlUZXh0dXJlT2JqZWN0ICopIHRleE9iai0+RHJpdmVyRGF0YTsKLSAgIEdMdWludCBmYWNlOwotCi0gICAvKiB3aGljaCBjdWJlIGZhY2Ugb3Igb3JkaW5hcnkgMkQgaW1hZ2UgKi8KLSAgIHN3aXRjaCAodGFyZ2V0KSB7Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6Ci0gICAgICBmYWNlID0gKEdMdWludCkgdGFyZ2V0IC0gKEdMdWludCkgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOwotICAgICAgQVNTRVJUKGZhY2UgPCA2KTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGZhY2UgPSAwOwotICAgfQotCi0gICBpZiAodGV4SW1hZ2UtPklzQ2xpZW50RGF0YSAmJgotICAgICAgIChjaGFyICopcGl4ZWxzID09IChjaGFyICopdGV4SW1hZ2UtPkRhdGEgKyAKLSAgICAgICAoKHhvZmZzZXQgKyB5b2Zmc2V0ICogdGV4SW1hZ2UtPlJvd1N0cmlkZSkgKiAKLQl0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5UZXhlbEJ5dGVzKSkgewotCi0gICAgICAvKiBOb3RpZmljYXRpb24gb25seSAtIG5vIHVwbG9hZCByZXF1aXJlZCAqLwotICAgfQotICAgZWxzZSB7Ci0gICAgICBhc3NlcnQoIHQgKTsgLyogdGhpcyBfc2hvdWxkXyBiZSB0cnVlICovCi0gICAgICBpbnRlbEZsdXNoKCBjdHggKTsKLSAgICAgIGRyaVN3YXBPdXRUZXh0dXJlT2JqZWN0KCB0ICk7Ci0KLSAgICAgIF9tZXNhX3N0b3JlX3RleHN1YmltYWdlMmQoY3R4LCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgCi0JCQkJaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscywgcGFja2luZywgdGV4T2JqLAotCQkJCXRleEltYWdlKTsKLQotICAgICAgdC0+ZGlydHlfaW1hZ2VzW2ZhY2VdIHw9ICgxIDw8IGxldmVsKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQgaW50ZWxDb21wcmVzc2VkVGV4SW1hZ2UyRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LCBHTGludCBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgKQotewotICAgZHJpVGV4dHVyZU9iamVjdCAqIHQgPSAoZHJpVGV4dHVyZU9iamVjdCAqKSB0ZXhPYmotPkRyaXZlckRhdGE7Ci0gICBHTHVpbnQgZmFjZTsKLQotICAgLyogd2hpY2ggY3ViZSBmYWNlIG9yIG9yZGluYXJ5IDJEIGltYWdlICovCi0gICBzd2l0Y2ggKHRhcmdldCkgewotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aOgotICAgICAgZmFjZSA9IChHTHVpbnQpIHRhcmdldCAtIChHTHVpbnQpIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDsKLSAgICAgIEFTU0VSVChmYWNlIDwgNik7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBmYWNlID0gMDsKLSAgIH0KLQotICAgYXNzZXJ0KHQpOwotICAgaW50ZWxGbHVzaCggY3R4ICk7Ci0gICAKLSAgIGRyaVN3YXBPdXRUZXh0dXJlT2JqZWN0KCB0ICk7Ci0gICB0ZXhJbWFnZS0+SXNDbGllbnREYXRhID0gR0xfRkFMU0U7Ci0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCi0gICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IFVzaW5nIG5vcm1hbCBzdG9yYWdlXG4iLCBfX0ZVTkNUSU9OX18pOyAKLSAgIAotICAgX21lc2Ffc3RvcmVfY29tcHJlc3NlZF90ZXhpbWFnZTJkKGN0eCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLAotCQkJCSAgICAgaGVpZ2h0LCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSwgdGV4T2JqLCB0ZXhJbWFnZSk7Ci0gICAKLSAgIHQtPmRpcnR5X2ltYWdlc1tmYWNlXSB8PSAoMSA8PCBsZXZlbCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgaW50ZWxDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICogdCA9IChkcmlUZXh0dXJlT2JqZWN0ICopIHRleE9iai0+RHJpdmVyRGF0YTsKLSAgIEdMdWludCBmYWNlOwotCi0KLSAgIC8qIHdoaWNoIGN1YmUgZmFjZSBvciBvcmRpbmFyeSAyRCBpbWFnZSAqLwotICAgc3dpdGNoICh0YXJnZXQpIHsKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKLSAgICAgIGZhY2UgPSAoR0x1aW50KSB0YXJnZXQgLSAoR0x1aW50KSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g7Ci0gICAgICBBU1NFUlQoZmFjZSA8IDYpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgZmFjZSA9IDA7Ci0gICB9Ci0KLSAgIGFzc2VydCggdCApOyAvKiB0aGlzIF9zaG91bGRfIGJlIHRydWUgKi8KLSAgIGludGVsRmx1c2goIGN0eCApOwotICAgZHJpU3dhcE91dFRleHR1cmVPYmplY3QoIHQgKTsKLSAgIAotICAgX21lc2Ffc3RvcmVfY29tcHJlc3NlZF90ZXhzdWJpbWFnZTJkKGN0eCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsCi0JCQkJCWhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEsIHRleE9iaiwgdGV4SW1hZ2UpOwotICAgCi0gICB0LT5kaXJ0eV9pbWFnZXNbZmFjZV0gfD0gKDEgPDwgbGV2ZWwpOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsVGV4SW1hZ2UzRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGRlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBkcmlUZXh0dXJlT2JqZWN0ICogdCA9IChkcmlUZXh0dXJlT2JqZWN0ICopIHRleE9iai0+RHJpdmVyRGF0YTsKLQotICAgYXNzZXJ0KHQpOwotICAgZHJpU3dhcE91dFRleHR1cmVPYmplY3QoIHQgKTsKLSAgIHRleEltYWdlLT5Jc0NsaWVudERhdGEgPSBHTF9GQUxTRTsKLQotICAgX21lc2Ffc3RvcmVfdGV4aW1hZ2UzZChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAotCQkJICB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLAotCQkJICBmb3JtYXQsIHR5cGUsIHBpeGVscywKLQkJCSAgJmN0eC0+VW5wYWNrLCB0ZXhPYmosIHRleEltYWdlKTsKLSAgIAotICAgdC0+ZGlydHlfaW1hZ2VzWzBdIHw9ICgxIDw8IGxldmVsKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotaW50ZWxUZXhTdWJJbWFnZTNEKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKLXsKLSAgIGRyaVRleHR1cmVPYmplY3QgKiB0ID0gKGRyaVRleHR1cmVPYmplY3QgKikgdGV4T2JqLT5Ecml2ZXJEYXRhOwotCi0gICBhc3NlcnQoIHQgKTsgLyogdGhpcyBfc2hvdWxkXyBiZSB0cnVlICovCi0gICBkcmlTd2FwT3V0VGV4dHVyZU9iamVjdCggdCApOwotCi0gICBfbWVzYV9zdG9yZV90ZXhzdWJpbWFnZTNkKGN0eCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgcGl4ZWxzLCBwYWNraW5nLCB0ZXhPYmosIHRleEltYWdlKTsKLQotICAgdC0+ZGlydHlfaW1hZ2VzWzBdIHw9ICgxIDw8IGxldmVsKTsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgaW50ZWxEZWxldGVUZXh0dXJlKCBHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqICkKLXsKLSAgIGRyaVRleHR1cmVPYmplY3QgKiB0ID0gKGRyaVRleHR1cmVPYmplY3QgKikgdE9iai0+RHJpdmVyRGF0YTsKLQotICAgaWYgKCB0ICE9IE5VTEwgKSB7Ci0gICAgICBpbnRlbEZsdXNoKCBjdHggKTsKLSAgICAgIGRyaURlc3Ryb3lUZXh0dXJlT2JqZWN0KCB0ICk7Ci0gICB9Ci0gICAKLSAgIC8qIEZyZWUgbWlwbWFwIGltYWdlcyBhbmQgdGhlIHRleHR1cmUgb2JqZWN0IGl0c2VsZiAqLwotICAgX21lc2FfZGVsZXRlX3RleHR1cmVfb2JqZWN0KGN0eCwgdE9iaik7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2Zvcm1hdCAqCi1pbnRlbENob29zZVRleHR1cmVGb3JtYXQoIEdMY29udGV4dCAqY3R4LCBHTGludCBpbnRlcm5hbEZvcm1hdCwKLQkJCSBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSApCi17Ci0gICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKCBjdHggKTsKLSAgIGNvbnN0IEdMYm9vbGVhbiBkbzMyYnB0ID0gKCBpbnRlbC0+aW50ZWxTY3JlZW4tPmNwcCA9PSA0ICYmCi0JCQkgICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT50ZXguc2l6ZSA+IDQqMTAyNCoxMDI0KTsKLQotICAgc3dpdGNoICggaW50ZXJuYWxGb3JtYXQgKSB7Ci0gICBjYXNlIDQ6Ci0gICBjYXNlIEdMX1JHQkE6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQToKLSAgICAgIGlmICggZm9ybWF0ID09IEdMX0JHUkEgKSB7Ci0JIGlmICggdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgKSB7Ci0JICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I4ODg4OwotCSB9Ci0gICAgICAgICBlbHNlIGlmICggdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViApIHsKLSAgICAgICAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I0NDQ0OwotCSB9Ci0gICAgICAgICBlbHNlIGlmICggdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViApIHsKLQkgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjE1NTU7Ci0JIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBkbzMyYnB0ID8gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4OCA6ICZfbWVzYV90ZXhmb3JtYXRfYXJnYjQ0NDQ7Ci0KLSAgIGNhc2UgMzoKLSAgIGNhc2UgR0xfUkdCOgotICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQjoKLSAgICAgIGlmICggZm9ybWF0ID09IEdMX1JHQiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICkgewotCSByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2I1NjU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZG8zMmJwdCA/ICZfbWVzYV90ZXhmb3JtYXRfYXJnYjg4ODggOiAmX21lc2FfdGV4Zm9ybWF0X3JnYjU2NTsKLQotICAgY2FzZSBHTF9SR0JBODoKLSAgIGNhc2UgR0xfUkdCMTBfQTI6Ci0gICBjYXNlIEdMX1JHQkExMjoKLSAgIGNhc2UgR0xfUkdCQTE2OgotICAgICAgcmV0dXJuIGRvMzJicHQgPyAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I4ODg4IDogJl9tZXNhX3RleGZvcm1hdF9hcmdiNDQ0NDsKLQotICAgY2FzZSBHTF9SR0JBNDoKLSAgIGNhc2UgR0xfUkdCQTI6Ci0gICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiNDQ0NDsKLQotICAgY2FzZSBHTF9SR0I1X0ExOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjE1NTU7Ci0KLSAgIGNhc2UgR0xfUkdCODoKLSAgIGNhc2UgR0xfUkdCMTA6Ci0gICBjYXNlIEdMX1JHQjEyOgotICAgY2FzZSBHTF9SR0IxNjoKLSAgICAgIHJldHVybiBkbzMyYnB0ID8gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4OCA6ICZfbWVzYV90ZXhmb3JtYXRfcmdiNTY1OwotCi0gICBjYXNlIEdMX1JHQjU6Ci0gICBjYXNlIEdMX1JHQjQ6Ci0gICBjYXNlIEdMX1IzX0czX0IyOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiNTY1OwotCi0gICBjYXNlIEdMX0FMUEhBOgotICAgY2FzZSBHTF9BTFBIQTQ6Ci0gICBjYXNlIEdMX0FMUEhBODoKLSAgIGNhc2UgR0xfQUxQSEExMjoKLSAgIGNhc2UgR0xfQUxQSEExNjoKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9BTFBIQToKLSAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2E4OwotCi0gICBjYXNlIDE6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRToKLSAgIGNhc2UgR0xfTFVNSU5BTkNFNDoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFODoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFMTI6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRTE2OgotICAgY2FzZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRToKLSAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2w4OwotCi0gICBjYXNlIDI6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKLSAgIGNhc2UgR0xfTFVNSU5BTkNFNF9BTFBIQTQ6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRTZfQUxQSEEyOgotICAgY2FzZSBHTF9MVU1JTkFOQ0U4X0FMUEhBODoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFMTJfQUxQSEE0OgotICAgY2FzZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyOgotICAgY2FzZSBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2OgotICAgY2FzZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQToKLSAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FsODg7Ci0KLSAgIGNhc2UgR0xfSU5URU5TSVRZOgotICAgY2FzZSBHTF9JTlRFTlNJVFk0OgotICAgY2FzZSBHTF9JTlRFTlNJVFk4OgotICAgY2FzZSBHTF9JTlRFTlNJVFkxMjoKLSAgIGNhc2UgR0xfSU5URU5TSVRZMTY6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfaTg7Ci0KLSAgIGNhc2UgR0xfWUNCQ1JfTUVTQToKLSAgICAgIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9NRVNBIHx8Ci0JICB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpCi0gICAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF95Y2JjcjsKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3ljYmNyX3JldjsKLQotICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQl9GWFQxXzNERlg6Ci0gICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3JnYl9meHQxOwotICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYOgotICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2Z4dDE7Ci0KLSAgIGNhc2UgR0xfUkdCX1MzVEM6Ci0gICBjYXNlIEdMX1JHQjRfUzNUQzoKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKLSAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiX2R4dDE7Ci0KLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6Ci0gICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3JnYmFfZHh0MTsKLQotICAgY2FzZSBHTF9SR0JBX1MzVEM6Ci0gICBjYXNlIEdMX1JHQkE0X1MzVEM6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOgotICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2R4dDM7Ci0KLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6Ci0gICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2R4dDU7Ci0KLSAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UOgotICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKLSAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMjQ6Ci0gICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfejE2OwotCi0gICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmV4cGVjdGVkIHRleHR1cmUgZm9ybWF0ICVzIGluICVzXG4iLCAKLQkgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihpbnRlcm5hbEZvcm1hdCksCi0JICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotCi0gICByZXR1cm4gTlVMTDsgLyogbmV2ZXIgZ2V0IGhlcmUgKi8KLX0KLQotCi0KLXZvaWQgaW50ZWxEZXN0cm95VGV4T2JqKGludGVsQ29udGV4dFB0ciBpbnRlbCwgaW50ZWxUZXh0dXJlT2JqZWN0UHRyIHQpCi17Ci0gICB1bnNpZ25lZCAgIGk7Ci0KLSAgIGlmICggaW50ZWwgPT0gTlVMTCApIAotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIHQtPmFnZSA+IGludGVsLT5kaXJ0eUFnZSApCi0gICAgICBpbnRlbC0+ZGlydHlBZ2UgPSB0LT5hZ2U7Ci0KLSAgIGZvciAoIGkgPSAwIDsgaSA8IE1BWF9URVhUVVJFX1VOSVRTIDsgaSsrICkgewotICAgICAgaWYgKCB0ID09IGludGVsLT5DdXJyZW50VGV4T2JqWyBpIF0gKSAKLQkgaW50ZWwtPkN1cnJlbnRUZXhPYmpbIGkgXSA9IE5VTEw7Ci0gICB9Ci19Ci0KLQotCi0vKiBVcGxvYWQgYW4gaW1hZ2UgZnJvbSBtZXNhJ3MgaW50ZXJuYWwgY29weS4gIEltYWdlIG1heSBiZSAxRCwgMkQgb3IKLSAqIDNELiAgQ3ViZW1hcHMgYXJlIGV4cGFuZGVkIGVsc2V3aGVyZS4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxVcGxvYWRUZXhJbWFnZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkJCSBpbnRlbFRleHR1cmVPYmplY3RQdHIgdCwKLQkJCQkgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltYWdlLAotCQkJCSBjb25zdCBHTHVpbnQgb2Zmc2V0ICkKLXsKLQotICAgaWYgKCFpbWFnZSB8fCAhaW1hZ2UtPkRhdGEpIAotICAgICAgcmV0dXJuOwotCi0gICBpZiAoaW1hZ2UtPkRlcHRoID09IDEgJiYgaW1hZ2UtPklzQ2xpZW50RGF0YSkgewotICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKLQkgZnByaW50ZihzdGRlcnIsICJCbGl0IHVwbG9hZGluZ1xuIik7Ci0KLSAgICAgIC8qIERvIGl0IHdpdGggYSBibGl0LgotICAgICAgICovCi0gICAgICBpbnRlbEVtaXRDb3B5QmxpdExvY2tlZCggaW50ZWwsCi0JCQkgICAgICAgaW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlcywKLQkJCSAgICAgICBpbWFnZS0+Um93U3RyaWRlLCAvKiA/ICovCi0JCQkgICAgICAgaW50ZWxHZXRNZW1vcnlPZmZzZXRNRVNBKCBOVUxMLCAwLCBpbWFnZS0+RGF0YSApLAotCQkJICAgICAgIHQtPlBpdGNoIC8gaW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlcywKLQkJCSAgICAgICBpbnRlbEdldE1lbW9yeU9mZnNldE1FU0EoIE5VTEwsIDAsIHQtPkJ1ZkFkZHIgKyBvZmZzZXQgKSwKLQkJCSAgICAgICAwLCAwLAotCQkJICAgICAgIDAsIDAsCi0JCQkgICAgICAgaW1hZ2UtPldpZHRoLAotCQkJICAgICAgIGltYWdlLT5IZWlnaHQpOwotICAgfQotICAgZWxzZSBpZiAoaW1hZ2UtPklzQ29tcHJlc3NlZCkgewotICAgICAgR0x1aW50IHJvd19sZW4gPSAwOwotICAgICAgR0x1Ynl0ZSAqZHN0ID0gKEdMdWJ5dGUgKikodC0+QnVmQWRkciArIG9mZnNldCk7Ci0gICAgICBHTHVieXRlICpzcmMgPSAoR0x1Ynl0ZSAqKWltYWdlLT5EYXRhOwotICAgICAgR0x1aW50IGo7Ci0KLSAgICAgIC8qIG11c3QgYWx3YXlzIGNvcHkgd2hvbGUgYmxvY2tzICg4LzE2IGJ5dGVzKSAqLwotICAgICAgc3dpdGNoIChpbWFnZS0+SW50ZXJuYWxGb3JtYXQpIHsKLQljYXNlIEdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWDoKLQljYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9GWFQxXzNERlg6Ci0JY2FzZSBHTF9SR0JfUzNUQzoKLQljYXNlIEdMX1JHQjRfUzNUQzoKLQljYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6Ci0JY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDoKLQkgIHJvd19sZW4gPSAoaW1hZ2UtPldpZHRoICogMiArIDcpICYgfjc7Ci0JICBicmVhazsKLQljYXNlIEdMX1JHQkFfUzNUQzoKLQljYXNlIEdMX1JHQkE0X1MzVEM6Ci0JY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDoKLQljYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOgotCSAgcm93X2xlbiA9IChpbWFnZS0+V2lkdGggKiA0ICsgMTUpICYgfjE1OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGZwcmludGYoc3RkZXJyLCJJbnRlcm5hbCBDb21wcmVzc2VkIGZvcm1hdCBub3Qgc3VwcG9ydGVkICVkXG4iLCBpbWFnZS0+SW50ZXJuYWxGb3JtYXQpOwotCSAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCi0JIGZwcmludGYoc3RkZXJyLCAKLQkJICJVcGxvYWQgaW1hZ2UgJWR4JWR4JWQgb2Zmc2V0ICV4bSByb3dfbGVuICV4ICIKLQkJICJwaXRjaCAleCBkZXB0aF9waXRjaCAleFxuIiwKLQkJIGltYWdlLT5XaWR0aCwgaW1hZ2UtPkhlaWdodCwgaW1hZ2UtPkRlcHRoLCBvZmZzZXQsCi0JCSByb3dfbGVuLCB0LT5QaXRjaCwgdC0+ZGVwdGhfcGl0Y2gpOwotCi0gICAgICBpZiAocm93X2xlbikgewotCSBmb3IgKGogPSAwIDsgaiA8IChpbWFnZS0+SGVpZ2h0ICsgMykvNCA7IGorKywgZHN0ICs9ICh0LT5QaXRjaCkpIHsKLQkgICBfX21lbWNweShkc3QsIHNyYywgcm93X2xlbiApOwotCSAgIHNyYyArPSByb3dfbGVuOwotCSB9Ci0gICAgICB9Ci0gICB9Ci0gICAvKiBUaW1lIGZvciBhbm90aGVyIHZ0YmwgZW50cnk6Ci0gICAgKi8KLSAgIGVsc2UgaWYgKGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPT0gUENJX0NISVBfSTk0NV9HIHx8Ci0gICAgICAgICAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEID09IFBDSV9DSElQX0k5NDVfR00gfHwKLSAgICAgICAgICAgIGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPT0gUENJX0NISVBfSTk0NV9HTUUgfHwKLSAgICAgICAgICAgIGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPT0gUENJX0NISVBfRzMzX0cgfHwKLSAgICAgICAgICAgIGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPT0gUENJX0NISVBfUTMzX0cgfHwKLSAgICAgICAgICAgIGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPT0gUENJX0NISVBfUTM1X0cpIHsKLSAgICAgIEdMdWludCByb3dfbGVuID0gaW1hZ2UtPldpZHRoICogaW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlczsKLSAgICAgIEdMdWJ5dGUgKmRzdCA9IChHTHVieXRlICopKHQtPkJ1ZkFkZHIgKyBvZmZzZXQpOwotICAgICAgR0x1Ynl0ZSAqc3JjID0gKEdMdWJ5dGUgKilpbWFnZS0+RGF0YTsKLSAgICAgIEdMdWludCBkLCBqOwotCi0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotCSBmcHJpbnRmKHN0ZGVyciwgCi0JCSAiVXBsb2FkIGltYWdlICVkeCVkeCVkIG9mZnNldCAleG0gcm93X2xlbiAleCAiCi0JCSAicGl0Y2ggJXggZGVwdGhfcGl0Y2ggJXhcbiIsCi0JCSBpbWFnZS0+V2lkdGgsIGltYWdlLT5IZWlnaHQsIGltYWdlLT5EZXB0aCwgb2Zmc2V0LAotCQkgcm93X2xlbiwgdC0+UGl0Y2gsIHQtPmRlcHRoX3BpdGNoKTsKLQotICAgICAgaWYgKHJvd19sZW4gPT0gdC0+UGl0Y2gpIHsKLQkgbWVtY3B5KCBkc3QsIHNyYywgcm93X2xlbiAqIGltYWdlLT5IZWlnaHQgKiBpbWFnZS0+RGVwdGggKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeyAKLQkgR0x1aW50IHggPSAwLCB5ID0gMDsKLQotCSBmb3IgKGQgPSAwIDsgZCA8IGltYWdlLT5EZXB0aCA7IGQrKykgewotCSAgICBHTHVieXRlICpkc3QwID0gZHN0ICsgeCArIHkgKiB0LT5QaXRjaDsKLQotCSAgICBmb3IgKGogPSAwIDsgaiA8IGltYWdlLT5IZWlnaHQgOyBqKyspIHsKLQkgICAgICAgX19tZW1jcHkoZHN0MCwgc3JjLCByb3dfbGVuICk7Ci0JICAgICAgIHNyYyArPSByb3dfbGVuOwotCSAgICAgICBkc3QwICs9IHQtPlBpdGNoOwotCSAgICB9Ci0KLQkgICAgeCArPSBNSU4yKDQsIHJvd19sZW4pOyAvKiBHdWVzczogNCBieXRlIG1pbmltdW0gYWxpZ25tZW50ICovCi0JICAgIGlmICh4ID4gdC0+UGl0Y2gpIHsKLQkgICAgICAgeCA9IDA7Ci0JICAgICAgIHkgKz0gaW1hZ2UtPkhlaWdodDsKLQkgICAgfQotCSB9Ci0gICAgICB9Ci0KLSAgIH0KLSAgIGVsc2UgewotICAgICAgR0x1aW50IHJvd19sZW4gPSBpbWFnZS0+V2lkdGggKiBpbWFnZS0+VGV4Rm9ybWF0LT5UZXhlbEJ5dGVzOwotICAgICAgR0x1Ynl0ZSAqZHN0ID0gKEdMdWJ5dGUgKikodC0+QnVmQWRkciArIG9mZnNldCk7Ci0gICAgICBHTHVieXRlICpzcmMgPSAoR0x1Ynl0ZSAqKWltYWdlLT5EYXRhOwotICAgICAgR0x1aW50IGQsIGo7Ci0KLSAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCi0JIGZwcmludGYoc3RkZXJyLCAKLQkJICJVcGxvYWQgaW1hZ2UgJWR4JWR4JWQgb2Zmc2V0ICV4bSByb3dfbGVuICV4ICIKLQkJICJwaXRjaCAleCBkZXB0aF9waXRjaCAleFxuIiwKLQkJIGltYWdlLT5XaWR0aCwgaW1hZ2UtPkhlaWdodCwgaW1hZ2UtPkRlcHRoLCBvZmZzZXQsCi0JCSByb3dfbGVuLCB0LT5QaXRjaCwgdC0+ZGVwdGhfcGl0Y2gpOwotCi0gICAgICBpZiAocm93X2xlbiA9PSB0LT5QaXRjaCkgewotCSBmb3IgKGQgPSAwOyBkIDwgaW1hZ2UtPkRlcHRoOyBkKyspIHsKLQkgICAgbWVtY3B5KCBkc3QsIHNyYywgdC0+UGl0Y2ggKiBpbWFnZS0+SGVpZ2h0ICk7Ci0JICAgIGRzdCArPSB0LT5kZXB0aF9waXRjaDsKLQkgICAgc3JjICs9IHJvd19sZW4gKiBpbWFnZS0+SGVpZ2h0OwotCSB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgCi0JIGZvciAoZCA9IDAgOyBkIDwgaW1hZ2UtPkRlcHRoIDsgZCsrKSB7Ci0JICAgIGZvciAoaiA9IDAgOyBqIDwgaW1hZ2UtPkhlaWdodCA7IGorKykgewotCSAgICAgICBfX21lbWNweShkc3QsIHNyYywgcm93X2xlbiApOwotCSAgICAgICBzcmMgKz0gcm93X2xlbjsKLQkgICAgICAgZHN0ICs9IHQtPlBpdGNoOwotCSAgICB9Ci0KLQkgICAgZHN0ICs9IHQtPmRlcHRoX3BpdGNoIC0gKHQtPlBpdGNoICogaW1hZ2UtPkhlaWdodCk7Ci0JIH0KLSAgICAgIH0KLSAgIH0KLX0KLQotCi0KLWludCBpbnRlbFVwbG9hZFRleEltYWdlcyggaW50ZWxDb250ZXh0UHRyIGludGVsLCAKLQkJCSAgaW50ZWxUZXh0dXJlT2JqZWN0UHRyIHQsCi0JCQkgIEdMdWludCBmYWNlKQotewotICAgY29uc3QgaW50IG51bUxldmVscyA9IHQtPmJhc2UubGFzdExldmVsIC0gdC0+YmFzZS5maXJzdExldmVsICsgMTsKLSAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICpmaXJzdEltYWdlID0gdC0+aW1hZ2VbZmFjZV1bdC0+YmFzZS5maXJzdExldmVsXS5pbWFnZTsKLSAgIGludCBwaXRjaCA9IGZpcnN0SW1hZ2UtPlJvd1N0cmlkZSAqIGZpcnN0SW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlczsKLQotICAgLyogQ2FuIHdlIHRleHR1cmUgb3V0IG9mIHRoZSBleGlzdGluZyBjbGllbnQgZGF0YT8gKi8KLSAgIGlmICggbnVtTGV2ZWxzID09IDEgJiYKLQlmaXJzdEltYWdlLT5Jc0NsaWVudERhdGEgJiYKLQkocGl0Y2ggJiAzKSA9PSAwKSB7Ci0KLSAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCi0JIGZwcmludGYoc3RkZXJyLCAiQUdQIHRleHR1cmluZyBmcm9tIGNsaWVudCBtZW1vcnlcbiIpOwotCi0gICAgICB0LT5UZXh0dXJlT2Zmc2V0ID0gaW50ZWxBZ3BPZmZzZXRGcm9tVmlydHVhbCggaW50ZWwsIGZpcnN0SW1hZ2UtPkRhdGEgKTsKLSAgICAgIHQtPkJ1ZkFkZHIgPSAwOwotICAgICAgdC0+ZGlydHkgPSB+MDsKLSAgICAgIHJldHVybiBHTF9UUlVFOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKSAKLQkgZnByaW50ZihzdGRlcnIsICJVcGxvYWRpbmcgY2xpZW50IGRhdGEgdG8gYWdwXG4iKTsKLQotICAgICAgSU5URUxfRklSRVZFUlRJQ0VTKCBpbnRlbCApOwotICAgICAgTE9DS19IQVJEV0FSRSggaW50ZWwgKTsKLQotICAgICAgaWYgKCB0LT5iYXNlLm1lbUJsb2NrID09IE5VTEwgKSB7Ci0JIGludCBoZWFwOwotCi0JIGhlYXAgPSBkcmlBbGxvY2F0ZVRleHR1cmUoIGludGVsLT50ZXh0dXJlX2hlYXBzLCBpbnRlbC0+bnJfaGVhcHMsCi0JCQkJICAgIChkcmlUZXh0dXJlT2JqZWN0ICopIHQgKTsKLQkgaWYgKCBoZWFwID09IC0xICkgewotCSAgICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0JICAgIHJldHVybiBHTF9GQUxTRTsKLQkgfQotCi0JIC8qIFNldCB0aGUgYmFzZSBvZmZzZXQgb2YgdGhlIHRleHR1cmUgaW1hZ2UgKi8KLQkgdC0+QnVmQWRkciA9IChHTHVieXRlICopIChpbnRlbC0+aW50ZWxTY3JlZW4tPnRleC5tYXAgKyAKLQkJCQkgICB0LT5iYXNlLm1lbUJsb2NrLT5vZnMpOwotCSB0LT5UZXh0dXJlT2Zmc2V0ID0gaW50ZWwtPmludGVsU2NyZWVuLT50ZXgub2Zmc2V0ICsgdC0+YmFzZS5tZW1CbG9jay0+b2ZzOwotCSB0LT5kaXJ0eSA9IH4wOwotICAgICAgfQotCi0KLSAgICAgIC8qIExldCB0aGUgd29ybGQga25vdyB3ZSd2ZSB1c2VkIHRoaXMgbWVtb3J5IHJlY2VudGx5LgotICAgICAgICovCi0gICAgICBkcmlVcGRhdGVUZXh0dXJlTFJVKCAoZHJpVGV4dHVyZU9iamVjdCAqKSB0ICk7Ci0KLQotICAgICAgLyogVXBsb2FkIGFueSBpbWFnZXMgdGhhdCBhcmUgbmV3ICovCi0gICAgICBpZiAodC0+YmFzZS5kaXJ0eV9pbWFnZXNbZmFjZV0pIHsKLQkgaW50IGk7Ci0KLSAJIGludGVsV2FpdEZvcklkbGUoIGludGVsICk7Ci0JICAgIAotCSBmb3IgKGkgPSAwIDsgaSA8IG51bUxldmVscyA7IGkrKykgeyAKLQkgICAgaW50IGxldmVsID0gaSArIHQtPmJhc2UuZmlyc3RMZXZlbDsKLQotCSAgICBpZiAodC0+YmFzZS5kaXJ0eV9pbWFnZXNbZmFjZV0gJiAoMTw8bGV2ZWwpKSB7Ci0KLQkgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltYWdlID0gdC0+aW1hZ2VbZmFjZV1baV0uaW1hZ2U7Ci0JICAgICAgIEdMdWludCBvZmZzZXQgPSB0LT5pbWFnZVtmYWNlXVtpXS5vZmZzZXQ7Ci0KLSAgICAgCSAgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotCSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVwbG9hZCBsZXZlbCAlZCwgb2Zmc2V0ICV4XG4iLCAKLQkJCSAgbGV2ZWwsIG9mZnNldCk7Ci0KLQkgICAgICAgaW50ZWxVcGxvYWRUZXhJbWFnZSggaW50ZWwsIHQsIGltYWdlLCBvZmZzZXQgKTsKLQkgICAgfQotCSB9Ci0JIHQtPmJhc2UuZGlydHlfaW1hZ2VzW2ZhY2VdID0gMDsKLQkgaW50ZWwtPnBlcmZfYm94ZXMgfD0gSTgzMF9CT1hfVEVYVFVSRV9MT0FEOwotICAgICAgfQotICAgICAgCi0gICAgICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICAgICByZXR1cm4gR0xfVFJVRTsKLSAgIH0KLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIG5ldyB0ZXh0dXJlIG9iamVjdC4KLSAqIENhbGxlZCB2aWEgY3R4LT5Ecml2ZXIuTmV3VGV4dHVyZU9iamVjdC4KLSAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGNvbnRleHQgY3JlYXRpb24gdG8KLSAqIGFsbG9jYXRlIHRoZSBkZWZhdWx0IHRleHR1cmUgb2JqZWN0cy4KLSAqIE5vdGU6IHdlIGNvdWxkIHVzZSBjb250YWlubWVudCBoZXJlIHRvICdkZXJpdmUnIHRoZSBkcml2ZXItc3BlY2lmaWMKLSAqIHRleHR1cmUgb2JqZWN0IGZyb20gdGhlIGNvcmUgbWVzYSBnbF90ZXh0dXJlX29iamVjdC4gIE5vdCBkb25lIGF0IHRoaXMgdGltZS4KLSAqLwotc3RhdGljIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqCi1pbnRlbE5ld1RleHR1cmVPYmplY3QoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgbmFtZSwgR0xlbnVtIHRhcmdldCApCi17Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKm9iaiA9IF9tZXNhX25ld190ZXh0dXJlX29iamVjdChjdHgsIG5hbWUsIHRhcmdldCk7Ci0gICBJTlRFTF9DT05URVhUKGN0eCktPnZ0YmwuYWxsb2NfdGV4X29iaiggb2JqICk7Ci0gICByZXR1cm4gb2JqOwotfQotCi0KLXZvaWQgaW50ZWxJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBmdW5jdGlvbnMtPk5ld1RleHR1cmVPYmplY3QgICAgICAgICAgPSBpbnRlbE5ld1RleHR1cmVPYmplY3Q7Ci0gICBmdW5jdGlvbnMtPkNob29zZVRleHR1cmVGb3JtYXQgICAgICAgPSBpbnRlbENob29zZVRleHR1cmVGb3JtYXQ7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlMUQgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlMUQ7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlMkQgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlM0QgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlM0Q7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlMUQgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlMUQ7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlMkQgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlM0QgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlM0Q7Ci0gICBmdW5jdGlvbnMtPkNvcHlUZXhJbWFnZTFEICAgICAgICAgICAgPSBfc3dyYXN0X2NvcHlfdGV4aW1hZ2UxZDsKLSAgIGZ1bmN0aW9ucy0+Q29weVRleEltYWdlMkQgICAgICAgICAgICA9IF9zd3Jhc3RfY29weV90ZXhpbWFnZTJkOwotICAgZnVuY3Rpb25zLT5Db3B5VGV4U3ViSW1hZ2UxRCAgICAgICAgID0gX3N3cmFzdF9jb3B5X3RleHN1YmltYWdlMWQ7Ci0gICBmdW5jdGlvbnMtPkNvcHlUZXhTdWJJbWFnZTJEICAgICAgICAgPSBfc3dyYXN0X2NvcHlfdGV4c3ViaW1hZ2UyZDsKLSAgIGZ1bmN0aW9ucy0+Q29weVRleFN1YkltYWdlM0QgICAgICAgICA9IF9zd3Jhc3RfY29weV90ZXhzdWJpbWFnZTNkOwotICAgZnVuY3Rpb25zLT5EZWxldGVUZXh0dXJlICAgICAgICAgICAgID0gaW50ZWxEZWxldGVUZXh0dXJlOwotICAgZnVuY3Rpb25zLT5VcGRhdGVUZXh0dXJlUGFsZXR0ZSAgICAgID0gTlVMTDsKLSAgIGZ1bmN0aW9ucy0+SXNUZXh0dXJlUmVzaWRlbnQgICAgICAgICA9IGRyaUlzVGV4dHVyZVJlc2lkZW50OwotICAgZnVuY3Rpb25zLT5UZXN0UHJveHlUZXhJbWFnZSAgICAgICAgID0gX21lc2FfdGVzdF9wcm94eV90ZXhpbWFnZTsKLSAgIGZ1bmN0aW9ucy0+RGVsZXRlVGV4dHVyZSAgICAgICAgICAgICA9IGludGVsRGVsZXRlVGV4dHVyZTsKLSAgIGZ1bmN0aW9ucy0+Q29tcHJlc3NlZFRleEltYWdlMkQgICAgICA9IGludGVsQ29tcHJlc3NlZFRleEltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPkNvbXByZXNzZWRUZXhTdWJJbWFnZTJEICAgPSBpbnRlbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4LmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDc3Y2U3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9jb3B5LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9jb3B5LmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODcxOTZjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4X2NvcHkuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfY29weS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhfZm9ybWF0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zNDE1Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhfZm9ybWF0LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4X2Zvcm1hdC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhfaW1hZ2UuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4X2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTY3YWJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4X2ltYWdlLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4X2ltYWdlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9sYXlvdXQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4X2xheW91dC5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZlNjFiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9sYXlvdXQuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfbGF5b3V0LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF9zdWJpbWFnZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iM2E4YTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4X3ZhbGlkYXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF92YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQxYTc1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleF92YWxpZGF0ZS5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX3RleF92YWxpZGF0ZS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhtZW0uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdGV4bWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YmVlYzkuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXhtZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSNpbmNsdWRlICJ0ZXhtZW0uaCIKLSNpbmNsdWRlICJzaW1wbGVfbGlzdC5oIgotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLQotI2luY2x1ZGUgImludGVsX3RleC5oIgotCi1zdGF0aWMgR0x1aW50Ci1kcmlMb2cyKCBHTHVpbnQgbiApCi17Ci0gICBHTHVpbnQgbG9nMjsKLQotICAgZm9yICggbG9nMiA9IDEgOyBuID4gMSA7IGxvZzIrKyApIHsKLSAgICAgIG4gPj49IDE7Ci0gICB9Ci0KLSAgIHJldHVybiBsb2cyOwotfQotCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfaGVhcF9zaXplKCBkcmlUZXhIZWFwICogaGVhcCwgdW5zaWduZWQgc2l6ZSwgCi0JCQkJIHVuc2lnbmVkIG5yX3JlZ2lvbnMsIHVuc2lnbmVkIGFsaWdubWVudFNoaWZ0ICkKLXsKLSAgIHVuc2lnbmVkICAgICBsOwotCi0gICBsID0gZHJpTG9nMiggKHNpemUgLSAxKSAvIG5yX3JlZ2lvbnMgKTsKLSAgIGlmICggbCA8IGFsaWdubWVudFNoaWZ0ICkKLSAgIHsKLSAgICAgIGwgPSBhbGlnbm1lbnRTaGlmdDsKLSAgIH0KLQotICAgaGVhcC0+bG9nR3JhbnVsYXJpdHkgPSBsOwotICAgaGVhcC0+c2l6ZSA9IHNpemUgJiB+KCgxTCA8PCBsKSAtIDEpOwotfQotCi0KLUdMYm9vbGVhbiAKLWludGVsX2RyaVJlaW5pdFRleHR1cmVIZWFwKCBkcmlUZXhIZWFwICpoZWFwLAotCQkJICAgIHVuc2lnbmVkIHNpemUgKQotewotICAgZHJpVGV4dHVyZU9iamVjdCAqdCwgKnRtcDsKLQotICAgLyogS2ljayBvdXQgZXZlcnl0aGluZzoKLSAgICAqLwotICAgZm9yZWFjaF9zICggdCwgdG1wLCAmIGhlYXAtPnRleHR1cmVfb2JqZWN0cyApIHsKLSAgICAgIGlmICggdC0+dE9iaiAhPSBOVUxMICkgewotCSBkcmlTd2FwT3V0VGV4dHVyZU9iamVjdCggdCApOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIGRyaURlc3Ryb3lUZXh0dXJlT2JqZWN0KCB0ICk7Ci0gICAgICB9Ci0gICB9Ci0gICAKLSAgIC8qIERlc3Ryb3kgdGhlIG1lbW9yeSBtYW5hZ2VyOgotICAgICovCi0gICBtbURlc3Ryb3koIGhlYXAtPm1lbW9yeV9oZWFwICk7Ci0gICAgICAKLSAgIC8qIFJlY3JlYXRlIHRoZSBtZW1vcnkgbWFuYWdlcjoKLSAgICAqLwotICAgY2FsY3VsYXRlX2hlYXBfc2l6ZShoZWFwLCBzaXplLCBoZWFwLT5uclJlZ2lvbnMsIGhlYXAtPmFsaWdubWVudFNoaWZ0KTsKLSAgIGhlYXAtPm1lbW9yeV9oZWFwID0gbW1Jbml0KCAwLCBoZWFwLT5zaXplICk7Ci0gICBpZiAoIGhlYXAtPm1lbW9yeV9oZWFwID09IE5VTEwgKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImRyaVJlaW5pdFRleHR1cmVIZWFwOiBjb3VsZG4ndCByZWNyZWF0ZSBtZW1vcnkgaGVhcFxuIik7Ci0gICAgICBGUkVFKCBoZWFwICk7Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICB9Ci0KLSAgIG1ha2VfZW1wdHlfbGlzdCggJiBoZWFwLT50ZXh0dXJlX29iamVjdHMgKTsKLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90cmlzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RyaXMuYwppbmRleCBiMjc4N2VlLi41ZjRiODUyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RyaXMuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RyaXMuYwpAQCAtMjUsMTAgKzI1LDE4IEBACiAgKiAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoqIEBmaWxlIGludGVsX3RyaXMuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSB2ZXJ0ZXggYnVmZmVyIGFuZCBlbWl0dGluZworICogcHJpbWl0aXZlcyBpbnRvIGl0LgorICovCisKICNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJtYWNyb3MuaCIKICNpbmNsdWRlICJlbnVtcy5oIgorI2luY2x1ZGUgInRleG9iai5oIgorI2luY2x1ZGUgInN0YXRlLmgiCiAjaW5jbHVkZSAiZGQuaCIKIAogI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKQEAgLTM4LDE5ICs0NiwxOTEgQEAKICNpbmNsdWRlICJ0bmwvdF92ZXJ0ZXguaCIKIAogI2luY2x1ZGUgImludGVsX3NjcmVlbi5oIgorI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKICNpbmNsdWRlICJpbnRlbF90cmlzLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJzLmgiCiAjaW5jbHVkZSAiaW50ZWxfcmVnLmgiCiAjaW5jbHVkZSAiaW50ZWxfc3Bhbi5oIgotCi0vKiBYWFggd2Ugc2hvdWxkbid0IGluY2x1ZGUgdGhlc2UgaGVhZGVycyBpbiB0aGlzIGZpbGUsIGJ1dCB3ZSBuZWVkIHRoZW0KLSAqIGZvciBmYWxsYmFja1N0cmluZ3MsIGJlbG93LgotICovCisjaW5jbHVkZSAiaW50ZWxfdGV4LmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgogI2luY2x1ZGUgImk4MzBfY29udGV4dC5oIgotI2luY2x1ZGUgImk5MTVfY29udGV4dC5oIgorI2luY2x1ZGUgImk4MzBfcmVnLmgiCiAKLXN0YXRpYyB2b2lkIGludGVsUmVuZGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHByaW0gKTsKLXN0YXRpYyB2b2lkIGludGVsUmFzdGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHJwcmltLCBHTHVpbnQgaHdwcmltICk7CitzdGF0aWMgdm9pZCBpbnRlbFJlbmRlclByaW1pdGl2ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBwcmltKTsKK3N0YXRpYyB2b2lkIGludGVsUmFzdGVyUHJpbWl0aXZlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHJwcmltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGh3cHJpbSk7CisKKy8qKiBTZXRzIHRoZSBwcmltaXRpdmUgdHlwZSBmb3IgYSBwcmltaXRpdmUgc2VxdWVuY2UsIGZsdXNoaW5nIGFzIG5lZWRlZC4gKi8KK3ZvaWQgaW50ZWxfc2V0X3ByaW0oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCB1aW50MzJfdCBwcmltKQoreworICAgaWYgKHByaW0gIT0gaW50ZWwtPnByaW0ucHJpbWl0aXZlKSB7CisgICAgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOworICAgICAgaW50ZWwtPnByaW0ucHJpbWl0aXZlID0gcHJpbTsKKyAgIH0KK30KKworLyoqIFJldHVybnMgbWFwcGVkIFZCIHNwYWNlIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHZlcnRpY2VzICovCit1aW50MzJfdCAqaW50ZWxfZ2V0X3ByaW1fc3BhY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICB1aW50MzJfdCAqYWRkcjsKKworICAgLyogQ2hlY2sgZm9yIHNwYWNlIGluIHRoZSBleGlzdGluZyBWQiAqLworICAgaWYgKGludGVsLT5wcmltLnZiX2JvID09IE5VTEwgfHwKKyAgICAgICAoaW50ZWwtPnByaW0uY3VycmVudF9vZmZzZXQgKworCWNvdW50ICogaW50ZWwtPnZlcnRleF9zaXplICogNCkgPiBJTlRFTF9WQl9TSVpFIHx8CisgICAgICAgKGludGVsLT5wcmltLmNvdW50ICsgY291bnQpID49ICgxIDw8IDE2KSkgeworICAgICAgLyogRmx1c2ggZXhpc3RpbmcgcHJpbSBpZiBhbnkgKi8KKyAgICAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7CisKKyAgICAgIGludGVsX2ZpbmlzaF92YihpbnRlbCk7CisKKyAgICAgIC8qIFN0YXJ0IGEgbmV3IFZCICovCisgICAgICBpZiAoaW50ZWwtPnByaW0udmIgPT0gTlVMTCkKKwkgaW50ZWwtPnByaW0udmIgPSBtYWxsb2MoSU5URUxfVkJfU0laRSk7CisgICAgICBpbnRlbC0+cHJpbS52Yl9ibyA9IGRyaV9ib19hbGxvYyhpbnRlbC0+YnVmbWdyLCAidmIiLAorCQkJCSAgICAgICBJTlRFTF9WQl9TSVpFLCA0KTsKKyAgICAgIGludGVsLT5wcmltLnN0YXJ0X29mZnNldCA9IDA7CisgICAgICBpbnRlbC0+cHJpbS5jdXJyZW50X29mZnNldCA9IDA7CisgICB9CisKKyAgIGludGVsLT5wcmltLmZsdXNoID0gaW50ZWxfZmx1c2hfcHJpbTsKKworICAgYWRkciA9ICh1aW50MzJfdCAqKShpbnRlbC0+cHJpbS52YiArIGludGVsLT5wcmltLmN1cnJlbnRfb2Zmc2V0KTsKKyAgIGludGVsLT5wcmltLmN1cnJlbnRfb2Zmc2V0ICs9IGludGVsLT52ZXJ0ZXhfc2l6ZSAqIDQgKiBjb3VudDsKKyAgIGludGVsLT5wcmltLmNvdW50ICs9IGNvdW50OworCisgICByZXR1cm4gYWRkcjsKK30KKworLyoqIERpc3BhdGNoZXMgdGhlIGFjY3VtdWxhdGVkIHByaW1pdGl2ZSB0byB0aGUgYmF0Y2hidWZmZXIuICovCit2b2lkIGludGVsX2ZsdXNoX3ByaW0oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgQkFUQ0hfTE9DQUxTOworICAgZHJpX2JvICphcGVyX2FycmF5WzJdOworICAgZHJpX2JvICp2Yl9ibzsKKworICAgLyogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW4gaW50ZWxfc3RhcnRfcHJpbS4gKi8KKyAgIGFzc2VydChpbnRlbC0+cHJpbS5wcmltaXRpdmUgIT0gfjApOworCisgICBpZiAoaW50ZWwtPnByaW0uY291bnQgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgLyogS2VlcCBhIHJlZmVyZW5jZSBvbiB0aGUgQk8gYXMgaXQgbWF5IGdldCBmaW5pc2hlZCBhcyB3ZSBzdGFydCB0aGUKKyAgICAqIGJhdGNoIGVtaXQuCisgICAgKi8KKyAgIHZiX2JvID0gaW50ZWwtPnByaW0udmJfYm87CisgICBkcmlfYm9fcmVmZXJlbmNlKHZiX2JvKTsKKworICAgaW50ZWxfd2FpdF9mbGlwcyhpbnRlbCk7CisKKyAgIGludGVsLT52dGJsLmVtaXRfc3RhdGUoaW50ZWwpOworCisgICBhcGVyX2FycmF5WzBdID0gaW50ZWwtPmJhdGNoLT5idWY7CisgICBhcGVyX2FycmF5WzFdID0gdmJfYm87CisgICBpZiAoZHJpX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZShhcGVyX2FycmF5LCAyKSkgeworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKKyAgICAgIGludGVsLT52dGJsLmVtaXRfc3RhdGUoaW50ZWwpOworICAgfQorCisgICAvKiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBzdGFydCBhIG5ldyBiYXRjaCBmb3IgdGhlIGZvbGxvd2luZyBlbWl0LCB3aGljaAorICAgICogZGVwZW5kcyBvbiB0aGUgc3RhdGUganVzdCBlbWl0dGVkLiBlbWl0X3N0YXRlIHNob3VsZCBiZSBtYWtpbmcgc3VyZSB3ZQorICAgICogaGF2ZSB0aGUgc3BhY2UgZm9yIHRoaXMuCisgICAgKi8KKyAgIGludGVsLT5ub19iYXRjaF93cmFwID0gR0xfVFJVRTsKKworICAgLyogQ2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBlbWl0dGVkIHRoZSBzdGF0ZSBpbnRvIHRoaXMgYmF0Y2gsIHVzaW5nIHRoZQorICAgICogVVBMT0FEX0NUWCBiaXQgYXMgdGhlIHNpZ25hbC4KKyAgICAqLworICAgYXNzZXJ0KChpbnRlbC0+YmF0Y2gtPmRpcnR5X3N0YXRlICYgKDE8PDEpKSA9PSAwKTsKKworI2lmIDAKKyAgIHByaW50ZigiZW1pdHRpbmcgJWQuLiVkPSVkIHZlcnRpY2VzIHNpemUgJWRcbiIsIGludGVsLT5wcmltLnN0YXJ0X29mZnNldCwKKwkgIGludGVsLT5wcmltLmN1cnJlbnRfb2Zmc2V0LCBpbnRlbC0+cHJpbS5jb3VudCwKKwkgIGludGVsLT52ZXJ0ZXhfc2l6ZSAqIDQpOworI2VuZGlmCisKKyAgIGlmIChJU185WFgoaW50ZWwtPmludGVsU2NyZWVuLT5kZXZpY2VJRCkpIHsKKyAgICAgIEJFR0lOX0JBVENIKDUsIExPT1BfQ0xJUFJFQ1RTKTsKKyAgICAgIE9VVF9CQVRDSChfM0RTVEFURV9MT0FEX1NUQVRFX0lNTUVESUFURV8xIHwKKwkJSTFfTE9BRF9TKDApIHwgSTFfTE9BRF9TKDEpIHwgMSk7CisgICAgICBhc3NlcnQoKGludGVsLT5wcmltLnN0YXJ0X29mZnNldCAmICFTMF9WQl9PRkZTRVRfTUFTSykgPT0gMCk7CisgICAgICBPVVRfUkVMT0ModmJfYm8sIEk5MTVfR0VNX0RPTUFJTl9WRVJURVgsIDAsCisJCWludGVsLT5wcmltLnN0YXJ0X29mZnNldCk7CisgICAgICBPVVRfQkFUQ0goKGludGVsLT52ZXJ0ZXhfc2l6ZSA8PCBTMV9WRVJURVhfV0lEVEhfU0hJRlQpIHwKKwkJKGludGVsLT52ZXJ0ZXhfc2l6ZSA8PCBTMV9WRVJURVhfUElUQ0hfU0hJRlQpKTsKKworICAgICAgT1VUX0JBVENIKF8zRFBSSU1JVElWRSB8CisJCVBSSU1fSU5ESVJFQ1QgfAorCQlQUklNX0lORElSRUNUX1NFUVVFTlRJQUwgfAorCQlpbnRlbC0+cHJpbS5wcmltaXRpdmUgfAorCQlpbnRlbC0+cHJpbS5jb3VudCk7CisgICAgICBPVVRfQkFUQ0goMCk7IC8qIEJlZ2lubmluZyB2ZXJ0ZXggaW5kZXggKi8KKyAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKKyAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgaTgzMF9jb250ZXh0ICppODMwID0gaTgzMF9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKworICAgICAgQkVHSU5fQkFUQ0goNSwgTE9PUF9DTElQUkVDVFMpOworICAgICAgT1VUX0JBVENIKF8zRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzEgfAorCQlJMV9MT0FEX1MoMCkgfCBJMV9MT0FEX1MoMikgfCAxKTsKKyAgICAgIC8qIFMwICovCisgICAgICBhc3NlcnQoKGludGVsLT5wcmltLnN0YXJ0X29mZnNldCAmICFTMF9WQl9PRkZTRVRfTUFTS184MzApID09IDApOworICAgICAgT1VUX1JFTE9DKHZiX2JvLCBJOTE1X0dFTV9ET01BSU5fVkVSVEVYLCAwLAorCQlpbnRlbC0+cHJpbS5zdGFydF9vZmZzZXQgfAorCQkoaW50ZWwtPnZlcnRleF9zaXplIDw8IFMwX1ZCX1BJVENIX1NISUZUXzgzMCkgfAorCQlTMF9WQl9FTkFCTEVfODMwKTsKKyAgICAgIC8qIFMxCisgICAgICAgKiBUaGlzIGlzIHNvbWV3aGF0IHVuZm9ydHVuYXRlIC0tIFZCIHdpZHRoIGlzIHRpZWQgdXAgd2l0aAorICAgICAgICogdmVydGV4IGZvcm1hdCBkYXRhIHRoYXQgd2UndmUgYWxyZWFkeSB1cGxvYWRlZCB0aHJvdWdoCisgICAgICAgKiBfM0RTVEFURV9WRlRbMDFdX0NNRC4gIFdlIG1heSB3YW50IHRvIHJlcGxhY2UgZW1pdHMgb2YgVkZUIHN0YXRlIHdpdGgKKyAgICAgICAqIFNUQVRFX0lNTUVESUFURV8xIGxpa2UgdGhpcyB0byBhdm9pZCBkdXBsaWNhdGlvbi4KKyAgICAgICAqLworICAgICAgT1VUX0JBVENIKChpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfVkZdICYgVkZUMF9URVhfQ09VTlRfTUFTSykgPj4KKwkJVkZUMF9URVhfQ09VTlRfU0hJRlQgPDwgUzJfVEVYX0NPVU5UX1NISUZUXzgzMCB8CisJCShpODMwLT5zdGF0ZS5DdHhbSTgzMF9DVFhSRUdfVkYyXSA8PCAxNikgfAorCQlpbnRlbC0+dmVydGV4X3NpemUgPDwgUzJfVkVSVEVYXzBfV0lEVEhfU0hJRlRfODMwKTsKKworICAgICAgT1VUX0JBVENIKF8zRFBSSU1JVElWRSB8CisJCVBSSU1fSU5ESVJFQ1QgfAorCQlQUklNX0lORElSRUNUX1NFUVVFTlRJQUwgfAorCQlpbnRlbC0+cHJpbS5wcmltaXRpdmUgfAorCQlpbnRlbC0+cHJpbS5jb3VudCk7CisgICAgICBPVVRfQkFUQ0goMCk7IC8qIEJlZ2lubmluZyB2ZXJ0ZXggaW5kZXggKi8KKyAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKKyAgIH0KKworICAgaW50ZWwtPm5vX2JhdGNoX3dyYXAgPSBHTF9GQUxTRTsKKworICAgaW50ZWwtPnByaW0uZmx1c2ggPSBOVUxMOworICAgaW50ZWwtPnByaW0uc3RhcnRfb2Zmc2V0ID0gaW50ZWwtPnByaW0uY3VycmVudF9vZmZzZXQ7CisgICBpZiAoIUlTXzlYWChpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSkKKyAgICAgIGludGVsLT5wcmltLnN0YXJ0X29mZnNldCA9IEFMSUdOKGludGVsLT5wcmltLnN0YXJ0X29mZnNldCwgMTI4KTsKKyAgIGludGVsLT5wcmltLmNvdW50ID0gMDsKKworICAgZHJpX2JvX3VucmVmZXJlbmNlKHZiX2JvKTsKK30KKworLyoqCisgKiBVcGxvYWRzIHRoZSBsb2NhbGx5LWFjY3VtdWxhdGVkIFZCIGludG8gdGhlIGJ1ZmZlciBvYmplY3QuCisgKgorICogVGhpcyBhdm9pZHMgdXMgdGhyYXNoaW5nIHRoZSBjYWNoZWxpbmVzIGluIGFuZCBvdXQgYXMgdGhlIGJ1ZmZlciBnZXRzCisgKiBmaWxsZWQsIGRpc3BhdGNoZWQsIHRoZW4gcmV1c2VkIGFzIHRoZSBoYXJkd2FyZSBjb21wbGV0ZXMgcmVuZGVyaW5nIGZyb20gaXQsCisgKiBhbmQgYWxzbyBsZXRzIHVzIGNsZmx1c2ggbGVzcyBpZiB3ZSBkaXNwYXRjaCB3aXRoIGEgcGFydGlhbGx5LWZpbGxlZCBWQi4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBub3JtYWxseSBmcm9tIGdldF9zcGFjZSB3aGVuIHdlJ3JlIGZpbmlzaGluZyBhIEJPLCBidXQgYWxzbworICogYXQgYmF0Y2ggZmx1c2ggdGltZSBzbyB0aGF0IHdlIGRvbid0IHRyeSBhY2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIGp1c3QtZGlzcGF0Y2hlZCBidWZmZXIuCisgKi8KK3ZvaWQgaW50ZWxfZmluaXNoX3ZiKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIGlmIChpbnRlbC0+cHJpbS52Yl9ibyA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBkcmlfYm9fc3ViZGF0YShpbnRlbC0+cHJpbS52Yl9ibywgMCwgaW50ZWwtPnByaW0uc3RhcnRfb2Zmc2V0LAorCQkgIGludGVsLT5wcmltLnZiKTsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShpbnRlbC0+cHJpbS52Yl9ibyk7CisgICBpbnRlbC0+cHJpbS52Yl9ibyA9IE5VTEw7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgIEVtaXQgcHJpbWl0aXZlcyBhcyBpbmxpbmUgdmVydGljZXMgICAgICAgICAgICAgICAqCkBAIC02OSw3NSArMjQ5LDgxIEBACiAjZWxzZQogI2RlZmluZSBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCB2ICkJXAogZG8gewkJCQkJCVwKLSAgIGlmICgwKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CVwKICAgIGZvciAoIGogPSAwIDsgaiA8IHZlcnRzaXplIDsgaisrICkgewkJXAotICAgICAgaWYgKDApIGZwcmludGYoc3RkZXJyLCAiICAgLS0gdiglZCk6ICV4LyVmXG4iLGosCVwKLQkgICAgICAoKEdMdWludCAqKXYpW2pdLAkJCVwKLQkgICAgICAoKEdMZmxvYXQgKil2KVtqXSk7CQlcCiAgICAgICB2YltqXSA9ICgoR0x1aW50ICopdilbal07CQkJXAogICAgfQkJCQkJCVwKICAgIHZiICs9IHZlcnRzaXplOwkJCQlcCiB9IHdoaWxlICgwKQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faW5saW5lX18gaW50ZWxfZHJhd19xdWFkKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkJCWludGVsVmVydGV4UHRyIHYwLAotCQkJCQlpbnRlbFZlcnRleFB0ciB2MSwKLQkJCQkJaW50ZWxWZXJ0ZXhQdHIgdjIsCi0JCQkJCWludGVsVmVydGV4UHRyIHYzICkKK3N0YXRpYyB2b2lkCitpbnRlbF9kcmF3X3F1YWQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgIGludGVsVmVydGV4UHRyIHYwLAorICAgICAgICAgICAgICAgIGludGVsVmVydGV4UHRyIHYxLCBpbnRlbFZlcnRleFB0ciB2MiwgaW50ZWxWZXJ0ZXhQdHIgdjMpCiB7CiAgICBHTHVpbnQgdmVydHNpemUgPSBpbnRlbC0+dmVydGV4X3NpemU7Ci0gICBHTHVpbnQgKnZiID0gaW50ZWxFeHRlbmRJbmxpbmVQcmltaXRpdmUoIGludGVsLCA2ICogdmVydHNpemUgKTsKKyAgIEdMdWludCAqdmIgPSBpbnRlbF9nZXRfcHJpbV9zcGFjZShpbnRlbCwgNik7CiAgICBpbnQgajsKIAotICAgQ09QWV9EV09SRFMoIGosIHZiLCB2ZXJ0c2l6ZSwgdjAgKTsKLSAgIENPUFlfRFdPUkRTKCBqLCB2YiwgdmVydHNpemUsIHYxICk7Ci0gICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCB2MyApOwotICAgQ09QWV9EV09SRFMoIGosIHZiLCB2ZXJ0c2l6ZSwgdjEgKTsKLSAgIENPUFlfRFdPUkRTKCBqLCB2YiwgdmVydHNpemUsIHYyICk7Ci0gICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCB2MyApOworICAgQ09QWV9EV09SRFMoaiwgdmIsIHZlcnRzaXplLCB2MCk7CisgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIHYxKTsKKworICAgLyogSWYgc21vb3RoIHNoYWRpbmcsIGRyYXcgbGlrZSBhIHRyaWZhbiB3aGljaCBnaXZlcyBiZXR0ZXIKKyAgICAqIHJhc3Rlcml6YXRpb24uICBPdGhlcndpc2UgZHJhdyBhcyB0d28gdHJpYW5nbGVzIHdpdGggcHJvdm9raW5nCisgICAgKiB2ZXJ0ZXggaW4gdGhpcmQgcG9zaXRpb24gYXMgcmVxdWlyZWQgZm9yIGZsYXQgc2hhZGluZy4KKyAgICAqLworICAgaWYgKGludGVsLT5jdHguTGlnaHQuU2hhZGVNb2RlbCA9PSBHTF9GTEFUKSB7CisgICAgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIHYzKTsKKyAgICAgIENPUFlfRFdPUkRTKGosIHZiLCB2ZXJ0c2l6ZSwgdjEpOworICAgfQorICAgZWxzZSB7CisgICAgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIHYyKTsKKyAgICAgIENPUFlfRFdPUkRTKGosIHZiLCB2ZXJ0c2l6ZSwgdjApOworICAgfQorCisgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIHYyKTsKKyAgIENPUFlfRFdPUkRTKGosIHZiLCB2ZXJ0c2l6ZSwgdjMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2lubGluZV9fIGludGVsX2RyYXdfdHJpYW5nbGUoIGludGVsQ29udGV4dFB0ciBpbnRlbCwKLQkJCQkJICAgIGludGVsVmVydGV4UHRyIHYwLAotCQkJCQkgICAgaW50ZWxWZXJ0ZXhQdHIgdjEsCi0JCQkJCSAgICBpbnRlbFZlcnRleFB0ciB2MiApCitzdGF0aWMgdm9pZAoraW50ZWxfZHJhd190cmlhbmdsZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgIGludGVsVmVydGV4UHRyIHYwLCBpbnRlbFZlcnRleFB0ciB2MSwgaW50ZWxWZXJ0ZXhQdHIgdjIpCiB7CiAgICBHTHVpbnQgdmVydHNpemUgPSBpbnRlbC0+dmVydGV4X3NpemU7Ci0gICBHTHVpbnQgKnZiID0gaW50ZWxFeHRlbmRJbmxpbmVQcmltaXRpdmUoIGludGVsLCAzICogdmVydHNpemUgKTsKKyAgIEdMdWludCAqdmIgPSBpbnRlbF9nZXRfcHJpbV9zcGFjZShpbnRlbCwgMyk7CiAgICBpbnQgajsKLSAgIAotICAgQ09QWV9EV09SRFMoIGosIHZiLCB2ZXJ0c2l6ZSwgdjAgKTsKLSAgIENPUFlfRFdPUkRTKCBqLCB2YiwgdmVydHNpemUsIHYxICk7Ci0gICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCB2MiApOworCisgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIHYwKTsKKyAgIENPUFlfRFdPUkRTKGosIHZiLCB2ZXJ0c2l6ZSwgdjEpOworICAgQ09QWV9EV09SRFMoaiwgdmIsIHZlcnRzaXplLCB2Mik7CiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBpbnRlbF9kcmF3X2xpbmUoIGludGVsQ29udGV4dFB0ciBpbnRlbCwKLQkJCQkJaW50ZWxWZXJ0ZXhQdHIgdjAsCi0JCQkJCWludGVsVmVydGV4UHRyIHYxICkKK3N0YXRpYyB2b2lkCitpbnRlbF9kcmF3X2xpbmUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgIGludGVsVmVydGV4UHRyIHYwLCBpbnRlbFZlcnRleFB0ciB2MSkKIHsKICAgIEdMdWludCB2ZXJ0c2l6ZSA9IGludGVsLT52ZXJ0ZXhfc2l6ZTsKLSAgIEdMdWludCAqdmIgPSBpbnRlbEV4dGVuZElubGluZVByaW1pdGl2ZSggaW50ZWwsIDIgKiB2ZXJ0c2l6ZSApOworICAgR0x1aW50ICp2YiA9IGludGVsX2dldF9wcmltX3NwYWNlKGludGVsLCAyKTsKICAgIGludCBqOwogCi0gICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCB2MCApOwotICAgQ09QWV9EV09SRFMoIGosIHZiLCB2ZXJ0c2l6ZSwgdjEgKTsKKyAgIENPUFlfRFdPUkRTKGosIHZiLCB2ZXJ0c2l6ZSwgdjApOworICAgQ09QWV9EV09SRFMoaiwgdmIsIHZlcnRzaXplLCB2MSk7CiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBpbnRlbF9kcmF3X3BvaW50KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkJCSBpbnRlbFZlcnRleFB0ciB2MCApCitzdGF0aWMgdm9pZAoraW50ZWxfZHJhd19wb2ludChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIGludGVsVmVydGV4UHRyIHYwKQogewogICAgR0x1aW50IHZlcnRzaXplID0gaW50ZWwtPnZlcnRleF9zaXplOwotICAgR0x1aW50ICp2YiA9IGludGVsRXh0ZW5kSW5saW5lUHJpbWl0aXZlKCBpbnRlbCwgdmVydHNpemUgKTsKKyAgIEdMdWludCAqdmIgPSBpbnRlbF9nZXRfcHJpbV9zcGFjZShpbnRlbCwgMSk7CiAgICBpbnQgajsKIAogICAgLyogQWRqdXN0IGZvciBzdWIgcGl4ZWwgcG9zaXRpb24gLS0gc3RpbGwgcmVxdWlyZWQgZm9yIGNvbmZvcm0uICovCi0gICAqKGZsb2F0ICopJnZiWzBdID0gdjAtPnYueCAtIDAuMTI1OwotICAgKihmbG9hdCAqKSZ2YlsxXSA9IHYwLT52LnkgLSAwLjEyNTsKLSAgIGZvciAoaiA9IDIgOyBqIDwgdmVydHNpemUgOyBqKyspCi0gICAgIHZiW2pdID0gdjAtPnVpW2pdOworICAgKihmbG9hdCAqKSAmdmJbMF0gPSB2MC0+di54OworICAgKihmbG9hdCAqKSAmdmJbMV0gPSB2MC0+di55OworICAgZm9yIChqID0gMjsgaiA8IHZlcnRzaXplOyBqKyspCisgICAgICB2YltqXSA9IHYwLT51aVtqXTsKIH0KIAogCkBAIC0xNDYsMTMgKzMzMiwxNyBAQAogICogICAgICAgICAgICAgICAgRml4dXAgZm9yIEFSQl9wb2ludF9wYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGludGVsX2F0dGVuX3BvaW50KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIGludGVsVmVydGV4UHRyIHYwICkKKy8qIEN1cnJlbnRseSBub3Qgd29ya2luZyAtIFZFUlRfQVRUUklCX1BPSU5UU0laRSBpc24ndCBjb3JyZWN0bHkKKyAqIHJlcHJlc2VudGVkIGluIHRoZSBmcmFnbWVudCBwcm9ncmFtIElucHV0c1JlYWQgZmllbGQuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9hdHRlbl9wb2ludChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIGludGVsVmVydGV4UHRyIHYwKQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIEdMZmxvYXQgcHN6WzRdLCBjb2xbNF0sIHJlc3RvcmVfcHN6LCByZXN0b3JlX2FscGhhOwogCi0gICBfdG5sX2dldF9hdHRyKCBjdHgsIHYwLCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUsIHBzeiApOwotICAgX3RubF9nZXRfYXR0ciggY3R4LCB2MCwgX1ROTF9BVFRSSUJfQ09MT1IwLCBjb2wgKTsKKyAgIF90bmxfZ2V0X2F0dHIoY3R4LCB2MCwgX1ROTF9BVFRSSUJfUE9JTlRTSVpFLCBwc3opOworICAgX3RubF9nZXRfYXR0cihjdHgsIHYwLCBfVE5MX0FUVFJJQl9DT0xPUjAsIGNvbCk7CiAKICAgIHJlc3RvcmVfcHN6ID0gcHN6WzBdOwogICAgcmVzdG9yZV9hbHBoYSA9IGNvbFszXTsKQEAgLTE3MCwxOSArMzYwLDE5IEBACiAgICAgICBwc3pbMF0gPSAxLjA7CiAKICAgIGlmIChyZXN0b3JlX3BzeiAhPSBwc3pbMF0gfHwgcmVzdG9yZV9hbHBoYSAhPSBjb2xbM10pIHsKLSAgICAgIF90bmxfc2V0X2F0dHIoIGN0eCwgdjAsIF9UTkxfQVRUUklCX1BPSU5UU0laRSwgcHN6KTsKLSAgICAgIF90bmxfc2V0X2F0dHIoIGN0eCwgdjAsIF9UTkxfQVRUUklCX0NPTE9SMCwgY29sKTsKLSAgIAotICAgICAgaW50ZWxfZHJhd19wb2ludCggaW50ZWwsIHYwICk7CisgICAgICBfdG5sX3NldF9hdHRyKGN0eCwgdjAsIF9UTkxfQVRUUklCX1BPSU5UU0laRSwgcHN6KTsKKyAgICAgIF90bmxfc2V0X2F0dHIoY3R4LCB2MCwgX1ROTF9BVFRSSUJfQ09MT1IwLCBjb2wpOworCisgICAgICBpbnRlbF9kcmF3X3BvaW50KGludGVsLCB2MCk7CiAKICAgICAgIHBzelswXSA9IHJlc3RvcmVfcHN6OwogICAgICAgY29sWzNdID0gcmVzdG9yZV9hbHBoYTsKIAotICAgICAgX3RubF9zZXRfYXR0ciggY3R4LCB2MCwgX1ROTF9BVFRSSUJfUE9JTlRTSVpFLCBwc3opOwotICAgICAgX3RubF9zZXRfYXR0ciggY3R4LCB2MCwgX1ROTF9BVFRSSUJfQ09MT1IwLCBjb2wpOworICAgICAgX3RubF9zZXRfYXR0cihjdHgsIHYwLCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUsIHBzeik7CisgICAgICBfdG5sX3NldF9hdHRyKGN0eCwgdjAsIF9UTkxfQVRUUklCX0NPTE9SMCwgY29sKTsKICAgIH0KICAgIGVsc2UKLSAgICAgIGludGVsX2RyYXdfcG9pbnQoIGludGVsLCB2MCApOworICAgICAgaW50ZWxfZHJhd19wb2ludChpbnRlbCwgdjApOwogfQogCiAKQEAgLTE5NSw0NSArMzg1LDU5IEBACiAKIAogCi1zdGF0aWMgdm9pZCBpbnRlbF93cG9zX3RyaWFuZ2xlKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkJIGludGVsVmVydGV4UHRyIHYwLAotCQkJCSBpbnRlbFZlcnRleFB0ciB2MSwKLQkJCQkgaW50ZWxWZXJ0ZXhQdHIgdjIgKQorc3RhdGljIHZvaWQKK2ludGVsX3dwb3NfdHJpYW5nbGUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICBpbnRlbFZlcnRleFB0ciB2MCwgaW50ZWxWZXJ0ZXhQdHIgdjEsIGludGVsVmVydGV4UHRyIHYyKQogewogICAgR0x1aW50IG9mZnNldCA9IGludGVsLT53cG9zX29mZnNldDsKICAgIEdMdWludCBzaXplID0gaW50ZWwtPndwb3Nfc2l6ZTsKLSAgIAotICAgX19tZW1jcHkoICgoY2hhciAqKXYwKSArIG9mZnNldCwgdjAsIHNpemUgKTsKLSAgIF9fbWVtY3B5KCAoKGNoYXIgKil2MSkgKyBvZmZzZXQsIHYxLCBzaXplICk7Ci0gICBfX21lbWNweSggKChjaGFyICopdjIpICsgb2Zmc2V0LCB2Miwgc2l6ZSApOworICAgR0xmbG9hdCAqdjBfd3BvcyA9IChHTGZsb2F0ICopKChjaGFyICopdjAgKyBvZmZzZXQpOworICAgR0xmbG9hdCAqdjFfd3BvcyA9IChHTGZsb2F0ICopKChjaGFyICopdjEgKyBvZmZzZXQpOworICAgR0xmbG9hdCAqdjJfd3BvcyA9IChHTGZsb2F0ICopKChjaGFyICopdjIgKyBvZmZzZXQpOwogCi0gICBpbnRlbF9kcmF3X3RyaWFuZ2xlKCBpbnRlbCwgdjAsIHYxLCB2MiApOworICAgX19tZW1jcHkodjBfd3BvcywgdjAsIHNpemUpOworICAgX19tZW1jcHkodjFfd3BvcywgdjEsIHNpemUpOworICAgX19tZW1jcHkodjJfd3BvcywgdjIsIHNpemUpOworCisgICB2MF93cG9zWzFdID0gLXYwX3dwb3NbMV0gKyBpbnRlbC0+ZHJpRHJhd2FibGUtPmg7CisgICB2MV93cG9zWzFdID0gLXYxX3dwb3NbMV0gKyBpbnRlbC0+ZHJpRHJhd2FibGUtPmg7CisgICB2Ml93cG9zWzFdID0gLXYyX3dwb3NbMV0gKyBpbnRlbC0+ZHJpRHJhd2FibGUtPmg7CisKKworICAgaW50ZWxfZHJhd190cmlhbmdsZShpbnRlbCwgdjAsIHYxLCB2Mik7CiB9CiAKIAotc3RhdGljIHZvaWQgaW50ZWxfd3Bvc19saW5lKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkgICAgIGludGVsVmVydGV4UHRyIHYwLAotCQkJICAgICBpbnRlbFZlcnRleFB0ciB2MSApCitzdGF0aWMgdm9pZAoraW50ZWxfd3Bvc19saW5lKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICBpbnRlbFZlcnRleFB0ciB2MCwgaW50ZWxWZXJ0ZXhQdHIgdjEpCiB7CiAgICBHTHVpbnQgb2Zmc2V0ID0gaW50ZWwtPndwb3Nfb2Zmc2V0OwogICAgR0x1aW50IHNpemUgPSBpbnRlbC0+d3Bvc19zaXplOworICAgR0xmbG9hdCAqdjBfd3BvcyA9IChHTGZsb2F0ICopKChjaGFyICopdjAgKyBvZmZzZXQpOworICAgR0xmbG9hdCAqdjFfd3BvcyA9IChHTGZsb2F0ICopKChjaGFyICopdjEgKyBvZmZzZXQpOwogCi0gICBfX21lbWNweSggKChjaGFyICopdjApICsgb2Zmc2V0LCB2MCwgc2l6ZSApOwotICAgX19tZW1jcHkoICgoY2hhciAqKXYxKSArIG9mZnNldCwgdjEsIHNpemUgKTsKKyAgIF9fbWVtY3B5KHYwX3dwb3MsIHYwLCBzaXplKTsKKyAgIF9fbWVtY3B5KHYxX3dwb3MsIHYxLCBzaXplKTsKIAotICAgaW50ZWxfZHJhd19saW5lKCBpbnRlbCwgdjAsIHYxICk7CisgICB2MF93cG9zWzFdID0gLXYwX3dwb3NbMV0gKyBpbnRlbC0+ZHJpRHJhd2FibGUtPmg7CisgICB2MV93cG9zWzFdID0gLXYxX3dwb3NbMV0gKyBpbnRlbC0+ZHJpRHJhd2FibGUtPmg7CisKKyAgIGludGVsX2RyYXdfbGluZShpbnRlbCwgdjAsIHYxKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBpbnRlbF93cG9zX3BvaW50KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCQkgICAgICBpbnRlbFZlcnRleFB0ciB2MCApCitzdGF0aWMgdm9pZAoraW50ZWxfd3Bvc19wb2ludChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIGludGVsVmVydGV4UHRyIHYwKQogewogICAgR0x1aW50IG9mZnNldCA9IGludGVsLT53cG9zX29mZnNldDsKICAgIEdMdWludCBzaXplID0gaW50ZWwtPndwb3Nfc2l6ZTsKKyAgIEdMZmxvYXQgKnYwX3dwb3MgPSAoR0xmbG9hdCAqKSgoY2hhciAqKXYwICsgb2Zmc2V0KTsKIAotICAgX19tZW1jcHkoICgoY2hhciAqKXYwKSArIG9mZnNldCwgdjAsIHNpemUgKTsKKyAgIF9fbWVtY3B5KHYwX3dwb3MsIHYwLCBzaXplKTsKKyAgIHYwX3dwb3NbMV0gPSAtdjBfd3Bvc1sxXSArIGludGVsLT5kcmlEcmF3YWJsZS0+aDsKIAotICAgaW50ZWxfZHJhd19wb2ludCggaW50ZWwsIHYwICk7CisgICBpbnRlbF9kcmF3X3BvaW50KGludGVsLCB2MCk7CiB9CiAKIApAQCAtMjkwLDExICs0OTQsMTIgQEAKICNkZWZpbmUgSU5URUxfTUFYX1RSSUZVTkMJMHgxMAogCiAKLXN0YXRpYyBzdHJ1Y3QgewotICAgdG5sX3BvaW50c19mdW5jCSAgICAgICAgcG9pbnRzOwotICAgdG5sX2xpbmVfZnVuYwkJbGluZTsKLSAgIHRubF90cmlhbmdsZV9mdW5jCXRyaWFuZ2xlOwotICAgdG5sX3F1YWRfZnVuYwkJcXVhZDsKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgIHRubF9wb2ludHNfZnVuYyBwb2ludHM7CisgICB0bmxfbGluZV9mdW5jIGxpbmU7CisgICB0bmxfdHJpYW5nbGVfZnVuYyB0cmlhbmdsZTsKKyAgIHRubF9xdWFkX2Z1bmMgcXVhZDsKIH0gcmFzdF90YWJbSU5URUxfTUFYX1RSSUZVTkNdOwogCiAKQEAgLTM1NSwxMCArNTYwLDEwIEBACiAjZGVmaW5lIFZFUlRfUkVTVE9SRV9TUEVDKCBpZHggKSBpZiAoc3BlY29mZnNldCkgdltpZHhdLT51aVtzcGVjb2Zmc2V0XSA9IHNwZWNbaWR4XQogCiAjZGVmaW5lIExPQ0FMX1ZBUlMobikJCQkJCQkJXAotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOwkJCQlcCi0gICBHTHVpbnQgY29sb3Jbbl0sIHNwZWNbbl07CQkJCQkJXAotICAgR0x1aW50IGNvbG9yb2Zmc2V0ID0gaW50ZWwtPmNvbG9yb2Zmc2V0OwkJXAotICAgR0xib29sZWFuIHNwZWNvZmZzZXQgPSBpbnRlbC0+c3BlY29mZnNldDsJCQlcCisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CQkJXAorICAgR0x1aW50IGNvbG9yW25dID0geyAwLCB9LCBzcGVjW25dID0geyAwLCB9OwkJCQlcCisgICBHTHVpbnQgY29sb3JvZmZzZXQgPSBpbnRlbC0+Y29sb3JvZmZzZXQ7CQkJCVwKKyAgIEdMYm9vbGVhbiBzcGVjb2Zmc2V0ID0gaW50ZWwtPnNwZWNvZmZzZXQ7CQkJCVwKICAgICh2b2lkKSBjb2xvcjsgKHZvaWQpIHNwZWM7ICh2b2lkKSBjb2xvcm9mZnNldDsgKHZvaWQpIHNwZWNvZmZzZXQ7CiAKIApAQCAtMzY2LDcgKzU3MSw3IEBACiAgKiAgICAgICAgICAgICAgICBIZWxwZXJzIGZvciByZW5kZXJpbmcgdW5maWxsZWQgcHJpbWl0aXZlcyAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IEdMdWludCBod19wcmltW0dMX1BPTFlHT04rMV0gPSB7CitzdGF0aWMgY29uc3QgR0x1aW50IGh3X3ByaW1bR0xfUE9MWUdPTiArIDFdID0gewogICAgUFJJTTNEX1BPSU5UTElTVCwKICAgIFBSSU0zRF9MSU5FTElTVCwKICAgIFBSSU0zRF9MSU5FTElTVCwKQEAgLTQ1Niw3ICs2NjEsOCBAQAogI2luY2x1ZGUgInRubF9kZC90X2RkX3RyaXRtcC5oIgogCiAKLXN0YXRpYyB2b2lkIGluaXRfcmFzdF90YWIoIHZvaWQgKQorc3RhdGljIHZvaWQKK2luaXRfcmFzdF90YWIodm9pZCkKIHsKICAgIGluaXQoKTsKICAgIGluaXRfb2Zmc2V0KCk7CkBAIC00ODcsMTAgKzY5Myw4IEBACiAgKiBwcmltaXRpdmVzLgogICovCiBzdGF0aWMgdm9pZAotaW50ZWxfZmFsbGJhY2tfdHJpKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCSAgIGludGVsVmVydGV4ICp2MCwKLQkJICAgaW50ZWxWZXJ0ZXggKnYxLAotCQkgICBpbnRlbFZlcnRleCAqdjIgKQoraW50ZWxfZmFsbGJhY2tfdHJpKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICBpbnRlbFZlcnRleCAqIHYwLCBpbnRlbFZlcnRleCAqIHYxLCBpbnRlbFZlcnRleCAqIHYyKQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIFNXdmVydGV4IHZbM107CkBAIC00OTgsMTkgKzcwMiwyMCBAQAogICAgaWYgKDApCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MCwgJnZbMF0gKTsKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MSwgJnZbMV0gKTsKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MiwgJnZbMl0gKTsKLSAgIGludGVsU3BhblJlbmRlclN0YXJ0KCBjdHggKTsKLSAgIF9zd3Jhc3RfVHJpYW5nbGUoIGN0eCwgJnZbMF0sICZ2WzFdLCAmdlsyXSApOwotICAgaW50ZWxTcGFuUmVuZGVyRmluaXNoKCBjdHggKTsKKyAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7CisKKyAgIF9zd3NldHVwX1RyYW5zbGF0ZShjdHgsIHYwLCAmdlswXSk7CisgICBfc3dzZXR1cF9UcmFuc2xhdGUoY3R4LCB2MSwgJnZbMV0pOworICAgX3N3c2V0dXBfVHJhbnNsYXRlKGN0eCwgdjIsICZ2WzJdKTsKKyAgIGludGVsU3BhblJlbmRlclN0YXJ0KGN0eCk7CisgICBfc3dyYXN0X1RyaWFuZ2xlKGN0eCwgJnZbMF0sICZ2WzFdLCAmdlsyXSk7CisgICBpbnRlbFNwYW5SZW5kZXJGaW5pc2goY3R4KTsKIH0KIAogCiBzdGF0aWMgdm9pZAotaW50ZWxfZmFsbGJhY2tfbGluZSggaW50ZWxDb250ZXh0UHRyIGludGVsLAotCQkgICAgaW50ZWxWZXJ0ZXggKnYwLAotCQkgICAgaW50ZWxWZXJ0ZXggKnYxICkKK2ludGVsX2ZhbGxiYWNrX2xpbmUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICBpbnRlbFZlcnRleCAqIHYwLCBpbnRlbFZlcnRleCAqIHYxKQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIFNXdmVydGV4IHZbMl07CkBAIC01MTgsMTcgKzcyMywxOCBAQAogICAgaWYgKDApCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MCwgJnZbMF0gKTsKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MSwgJnZbMV0gKTsKLSAgIGludGVsU3BhblJlbmRlclN0YXJ0KCBjdHggKTsKLSAgIF9zd3Jhc3RfTGluZSggY3R4LCAmdlswXSwgJnZbMV0gKTsKLSAgIGludGVsU3BhblJlbmRlckZpbmlzaCggY3R4ICk7CisgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOworCisgICBfc3dzZXR1cF9UcmFuc2xhdGUoY3R4LCB2MCwgJnZbMF0pOworICAgX3N3c2V0dXBfVHJhbnNsYXRlKGN0eCwgdjEsICZ2WzFdKTsKKyAgIGludGVsU3BhblJlbmRlclN0YXJ0KGN0eCk7CisgICBfc3dyYXN0X0xpbmUoY3R4LCAmdlswXSwgJnZbMV0pOworICAgaW50ZWxTcGFuUmVuZGVyRmluaXNoKGN0eCk7CiB9CiAKLQogc3RhdGljIHZvaWQKLWludGVsX2ZhbGxiYWNrX3BvaW50KCBpbnRlbENvbnRleHRQdHIgaW50ZWwsCi0JCSAgICAgaW50ZWxWZXJ0ZXggKnYwICkKK2ludGVsX2ZhbGxiYWNrX3BvaW50KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJICAgICBpbnRlbFZlcnRleCAqIHYwKQogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIFNXdmVydGV4IHZbMV07CkBAIC01MzYsMTIgKzc0MiwxMyBAQAogICAgaWYgKDApCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgIF9zd3NldHVwX1RyYW5zbGF0ZSggY3R4LCB2MCwgJnZbMF0gKTsKLSAgIGludGVsU3BhblJlbmRlclN0YXJ0KCBjdHggKTsKLSAgIF9zd3Jhc3RfUG9pbnQoIGN0eCwgJnZbMF0gKTsKLSAgIGludGVsU3BhblJlbmRlckZpbmlzaCggY3R4ICk7Ci19CisgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOwogCisgICBfc3dzZXR1cF9UcmFuc2xhdGUoY3R4LCB2MCwgJnZbMF0pOworICAgaW50ZWxTcGFuUmVuZGVyU3RhcnQoY3R4KTsKKyAgIF9zd3Jhc3RfUG9pbnQoY3R4LCAmdlswXSk7CisgICBpbnRlbFNwYW5SZW5kZXJGaW5pc2goY3R4KTsKK30KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU1OCw3ICs3NjUsNyBAQAogI2RlZmluZSBJTklUKHgpIGludGVsUmVuZGVyUHJpbWl0aXZlKCBjdHgsIHggKQogI3VuZGVmIExPQ0FMX1ZBUlMKICNkZWZpbmUgTE9DQUxfVkFSUwkJCQkJCVwKLSAgICBpbnRlbENvbnRleHRQdHIgaW50ZWwgPSBJTlRFTF9DT05URVhUKGN0eCk7CQkJXAorICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsJCQlcCiAgICAgR0x1Ynl0ZSAqdmVydHB0ciA9IChHTHVieXRlICopaW50ZWwtPnZlcnRzOwkJCVwKICAgICBjb25zdCBHTHVpbnQgdmVydHNpemUgPSBpbnRlbC0+dmVydGV4X3NpemU7ICAgICAgIAlcCiAgICAgY29uc3QgR0x1aW50ICogY29uc3QgZWx0ID0gVE5MX0NPTlRFWFQoY3R4KS0+dmIuRWx0czsJXApAQCAtNTgxLDEwICs3ODgsMTAgQEAKIAogCiAKLXN0YXRpYyB2b2lkIGludGVsUmVuZGVyQ2xpcHBlZFBvbHkoIEdMY29udGV4dCAqY3R4LCBjb25zdCBHTHVpbnQgKmVsdHMsCi0JCQkJICAgR0x1aW50IG4gKQorc3RhdGljIHZvaWQKK2ludGVsUmVuZGVyQ2xpcHBlZFBvbHkoR0xjb250ZXh0ICogY3R4LCBjb25zdCBHTHVpbnQgKiBlbHRzLCBHTHVpbnQgbikKIHsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmVE5MX0NPTlRFWFQoY3R4KS0+dmI7CiAgICBHTHVpbnQgcHJpbSA9IGludGVsLT5yZW5kZXJfcHJpbWl0aXZlOwpAQCAtNTkzLDM5ICs4MDAsNDAgQEAKICAgICAqLwogICAgewogICAgICAgR0x1aW50ICp0bXAgPSBWQi0+RWx0czsKLSAgICAgIFZCLT5FbHRzID0gKEdMdWludCAqKWVsdHM7Ci0gICAgICB0bmwtPkRyaXZlci5SZW5kZXIuUHJpbVRhYkVsdHNbR0xfUE9MWUdPTl0oIGN0eCwgMCwgbiwgCi0JCQkJCQkgIFBSSU1fQkVHSU58UFJJTV9FTkQgKTsKKyAgICAgIFZCLT5FbHRzID0gKEdMdWludCAqKSBlbHRzOworICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJFbHRzW0dMX1BPTFlHT05dIChjdHgsIDAsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU1fQkVHSU4gfCBQUklNX0VORCk7CiAgICAgICBWQi0+RWx0cyA9IHRtcDsKICAgIH0KIAogICAgLyogUmVzdG9yZSB0aGUgcmVuZGVyIHByaW1pdGl2ZQogICAgICovCiAgICBpZiAocHJpbSAhPSBHTF9QT0xZR09OKQotICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1pdGl2ZU5vdGlmeSggY3R4LCBwcmltICk7CisgICAgICB0bmwtPkRyaXZlci5SZW5kZXIuUHJpbWl0aXZlTm90aWZ5KGN0eCwgcHJpbSk7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsUmVuZGVyQ2xpcHBlZExpbmUoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgaWksIEdMdWludCBqaiApCitzdGF0aWMgdm9pZAoraW50ZWxSZW5kZXJDbGlwcGVkTGluZShHTGNvbnRleHQgKiBjdHgsIEdMdWludCBpaSwgR0x1aW50IGpqKQogewogICAgVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKIAotICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkxpbmUoIGN0eCwgaWksIGpqICk7CisgICB0bmwtPkRyaXZlci5SZW5kZXIuTGluZShjdHgsIGlpLCBqaik7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsRmFzdFJlbmRlckNsaXBwZWRQb2x5KCBHTGNvbnRleHQgKmN0eCwgY29uc3QgR0x1aW50ICplbHRzLAotCQkJCSAgICAgICBHTHVpbnQgbiApCitzdGF0aWMgdm9pZAoraW50ZWxGYXN0UmVuZGVyQ2xpcHBlZFBvbHkoR0xjb250ZXh0ICogY3R4LCBjb25zdCBHTHVpbnQgKiBlbHRzLCBHTHVpbnQgbikKIHsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoIGN0eCApOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwogICAgY29uc3QgR0x1aW50IHZlcnRzaXplID0gaW50ZWwtPnZlcnRleF9zaXplOwotICAgR0x1aW50ICp2YiA9IGludGVsRXh0ZW5kSW5saW5lUHJpbWl0aXZlKCBpbnRlbCwgKG4tMikgKiAzICogdmVydHNpemUgKTsKLSAgIEdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKWludGVsLT52ZXJ0czsKLSAgIGNvbnN0IEdMdWludCAqc3RhcnQgPSAoY29uc3QgR0x1aW50ICopVihlbHRzWzBdKTsKLSAgIGludCBpLGo7CisgICBHTHVpbnQgKnZiID0gaW50ZWxfZ2V0X3ByaW1fc3BhY2UoaW50ZWwsIChuIC0gMikgKiAzKTsKKyAgIEdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKSBpbnRlbC0+dmVydHM7CisgICBjb25zdCBHTHVpbnQgKnN0YXJ0ID0gKGNvbnN0IEdMdWludCAqKSBWKGVsdHNbMF0pOworICAgaW50IGksIGo7CiAKLSAgIGZvciAoaSA9IDIgOyBpIDwgbiA7IGkrKykgewotICAgICAgQ09QWV9EV09SRFMoIGosIHZiLCB2ZXJ0c2l6ZSwgVihlbHRzW2ktMV0pICk7Ci0gICAgICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCBWKGVsdHNbaV0pICk7Ci0gICAgICBDT1BZX0RXT1JEUyggaiwgdmIsIHZlcnRzaXplLCBzdGFydCApOworICAgZm9yIChpID0gMjsgaSA8IG47IGkrKykgeworICAgICAgQ09QWV9EV09SRFMoaiwgdmIsIHZlcnRzaXplLCBWKGVsdHNbaSAtIDFdKSk7CisgICAgICBDT1BZX0RXT1JEUyhqLCB2YiwgdmVydHNpemUsIFYoZWx0c1tpXSkpOworICAgICAgQ09QWV9EV09SRFMoaiwgdmIsIHZlcnRzaXplLCBzdGFydCk7CiAgICB9CiB9CiAKQEAgLTYzNiw2OCArODQ0LDc1IEBACiAKIAogCi0jZGVmaW5lIFBPSU5UX0ZBTExCQUNLICgwKQotI2RlZmluZSBMSU5FX0ZBTExCQUNLIChERF9MSU5FX1NUSVBQTEUpCi0jZGVmaW5lIFRSSV9GQUxMQkFDSyAoMCkKLSNkZWZpbmUgQU5ZX0ZBTExCQUNLX0ZMQUdTIChQT0lOVF9GQUxMQkFDS3xMSU5FX0ZBTExCQUNLfFRSSV9GQUxMQkFDS3xcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRERfVFJJX1NUSVBQTEV8RERfUE9JTlRfQVRURU4pCi0jZGVmaW5lIEFOWV9SQVNURVJfRkxBR1MgKEREX1RSSV9MSUdIVF9UV09TSURFfEREX1RSSV9PRkZTRVR8RERfVFJJX1VORklMTEVEKQorI2RlZmluZSBBTllfRkFMTEJBQ0tfRkxBR1MgKEREX0xJTkVfU1RJUFBMRSB8IEREX1RSSV9TVElQUExFIHwgRERfUE9JTlRfQVRURU4gfCBERF9QT0lOVF9TTU9PVEggfCBERF9UUklfU01PT1RIKQorI2RlZmluZSBBTllfUkFTVEVSX0ZMQUdTIChERF9UUklfTElHSFRfVFdPU0lERSB8IEREX1RSSV9PRkZTRVQgfCBERF9UUklfVU5GSUxMRUQpCiAKLXZvaWQgaW50ZWxDaG9vc2VSZW5kZXJTdGF0ZShHTGNvbnRleHQgKmN0eCkKK3ZvaWQKK2ludGVsQ2hvb3NlUmVuZGVyU3RhdGUoR0xjb250ZXh0ICogY3R4KQogewogICAgVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIEdMdWludCBmbGFncyA9IGN0eC0+X1RyaWFuZ2xlQ2FwczsKICAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZyA9IGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50OwogICAgR0xib29sZWFuIGhhdmVfd3BvcyA9IChmcHJvZyAmJiAoZnByb2ctPkJhc2UuSW5wdXRzUmVhZCAmIEZSQUdfQklUX1dQT1MpKTsKICAgIEdMdWludCBpbmRleCA9IDA7CiAKICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NUQVRFKQotICAgICBmcHJpbnRmKHN0ZGVyciwiXG4lc1xuIixfX0ZVTkNUSU9OX18pOworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0gICBpZiAoKGZsYWdzICYgKEFOWV9GQUxMQkFDS19GTEFHU3xBTllfUkFTVEVSX0ZMQUdTKSkgfHwgaGF2ZV93cG9zKSB7CisgICBpZiAoKGZsYWdzICYgKEFOWV9GQUxMQkFDS19GTEFHUyB8IEFOWV9SQVNURVJfRkxBR1MpKSB8fCBoYXZlX3dwb3MpIHsKIAogICAgICAgaWYgKGZsYWdzICYgQU5ZX1JBU1RFUl9GTEFHUykgewotCSBpZiAoZmxhZ3MgJiBERF9UUklfTElHSFRfVFdPU0lERSkgICAgaW5kZXggfD0gSU5URUxfVFdPU0lERV9CSVQ7Ci0JIGlmIChmbGFncyAmIEREX1RSSV9PRkZTRVQpCSAgICAgIGluZGV4IHw9IElOVEVMX09GRlNFVF9CSVQ7Ci0JIGlmIChmbGFncyAmIEREX1RSSV9VTkZJTExFRCkJICAgICAgaW5kZXggfD0gSU5URUxfVU5GSUxMRURfQklUOworICAgICAgICAgaWYgKGZsYWdzICYgRERfVFJJX0xJR0hUX1RXT1NJREUpCisgICAgICAgICAgICBpbmRleCB8PSBJTlRFTF9UV09TSURFX0JJVDsKKyAgICAgICAgIGlmIChmbGFncyAmIEREX1RSSV9PRkZTRVQpCisgICAgICAgICAgICBpbmRleCB8PSBJTlRFTF9PRkZTRVRfQklUOworICAgICAgICAgaWYgKGZsYWdzICYgRERfVFJJX1VORklMTEVEKQorICAgICAgICAgICAgaW5kZXggfD0gSU5URUxfVU5GSUxMRURfQklUOwogICAgICAgfQogCiAgICAgICBpZiAoaGF2ZV93cG9zKSB7Ci0JIGludGVsLT5kcmF3X3BvaW50ID0gaW50ZWxfd3Bvc19wb2ludDsKLQkgaW50ZWwtPmRyYXdfbGluZSA9IGludGVsX3dwb3NfbGluZTsKLQkgaW50ZWwtPmRyYXdfdHJpID0gaW50ZWxfd3Bvc190cmlhbmdsZTsKKyAgICAgICAgIGludGVsLT5kcmF3X3BvaW50ID0gaW50ZWxfd3Bvc19wb2ludDsKKyAgICAgICAgIGludGVsLT5kcmF3X2xpbmUgPSBpbnRlbF93cG9zX2xpbmU7CisgICAgICAgICBpbnRlbC0+ZHJhd190cmkgPSBpbnRlbF93cG9zX3RyaWFuZ2xlOwogCi0JIC8qIE1ha2Ugc3VyZSB0aGVzZSBnZXQgY2FsbGVkOgotCSAgKi8KLQkgaW5kZXggfD0gSU5URUxfRkFMTEJBQ0tfQklUOworICAgICAgICAgLyogTWFrZSBzdXJlIHRoZXNlIGdldCBjYWxsZWQ6CisgICAgICAgICAgKi8KKyAgICAgICAgIGluZGV4IHw9IElOVEVMX0ZBTExCQUNLX0JJVDsKICAgICAgIH0KICAgICAgIGVsc2UgewotCSBpbnRlbC0+ZHJhd19wb2ludCA9IGludGVsX2RyYXdfcG9pbnQ7Ci0JIGludGVsLT5kcmF3X2xpbmUgPSBpbnRlbF9kcmF3X2xpbmU7Ci0JIGludGVsLT5kcmF3X3RyaSA9IGludGVsX2RyYXdfdHJpYW5nbGU7CisgICAgICAgICBpbnRlbC0+ZHJhd19wb2ludCA9IGludGVsX2RyYXdfcG9pbnQ7CisgICAgICAgICBpbnRlbC0+ZHJhd19saW5lID0gaW50ZWxfZHJhd19saW5lOworICAgICAgICAgaW50ZWwtPmRyYXdfdHJpID0gaW50ZWxfZHJhd190cmlhbmdsZTsKICAgICAgIH0KIAogICAgICAgLyogSG9vayBpbiBmYWxsYmFja3MgZm9yIHNwZWNpZmljIHByaW1pdGl2ZXMuCiAgICAgICAgKi8KLSAgICAgIGlmIChmbGFncyAmIEFOWV9GQUxMQkFDS19GTEFHUykKLSAgICAgIHsKLQkgaWYgKGZsYWdzICYgUE9JTlRfRkFMTEJBQ0spCi0JICAgIGludGVsLT5kcmF3X3BvaW50ID0gaW50ZWxfZmFsbGJhY2tfcG9pbnQ7CisgICAgICBpZiAoZmxhZ3MgJiBBTllfRkFMTEJBQ0tfRkxBR1MpIHsKKyAgICAgICAgIGlmIChmbGFncyAmIEREX0xJTkVfU1RJUFBMRSkKKyAgICAgICAgICAgIGludGVsLT5kcmF3X2xpbmUgPSBpbnRlbF9mYWxsYmFja19saW5lOwogCi0JIGlmIChmbGFncyAmIExJTkVfRkFMTEJBQ0spCi0JICAgIGludGVsLT5kcmF3X2xpbmUgPSBpbnRlbF9mYWxsYmFja19saW5lOworICAgICAgICAgaWYgKChmbGFncyAmIEREX1RSSV9TVElQUExFKSAmJiAhaW50ZWwtPmh3X3N0aXBwbGUpCisgICAgICAgICAgICBpbnRlbC0+ZHJhd190cmkgPSBpbnRlbF9mYWxsYmFja190cmk7CiAKLQkgaWYgKGZsYWdzICYgVFJJX0ZBTExCQUNLKQotCSAgICBpbnRlbC0+ZHJhd190cmkgPSBpbnRlbF9mYWxsYmFja190cmk7CisgICAgICAgICBpZiAoZmxhZ3MgJiBERF9UUklfU01PT1RIKSB7CisJICAgIGlmIChpbnRlbC0+c3RyaWN0X2NvbmZvcm1hbmNlKQorCSAgICAgICBpbnRlbC0+ZHJhd190cmkgPSBpbnRlbF9mYWxsYmFja190cmk7CisJIH0KIAotCSBpZiAoKGZsYWdzICYgRERfVFJJX1NUSVBQTEUpICYmICFpbnRlbC0+aHdfc3RpcHBsZSkgCi0JICAgIGludGVsLT5kcmF3X3RyaSA9IGludGVsX2ZhbGxiYWNrX3RyaTsKKyAgICAgICAgIGlmIChmbGFncyAmIEREX1BPSU5UX0FUVEVOKSB7CisJICAgIGlmICgwKQorCSAgICAgICBpbnRlbC0+ZHJhd19wb2ludCA9IGludGVsX2F0dGVuX3BvaW50OworCSAgICBlbHNlCisJICAgICAgIGludGVsLT5kcmF3X3BvaW50ID0gaW50ZWxfZmFsbGJhY2tfcG9pbnQ7CisJIH0KIAotCSBpZiAoZmxhZ3MgJiBERF9QT0lOVF9BVFRFTikKLQkgICAgaW50ZWwtPmRyYXdfcG9pbnQgPSBpbnRlbF9hdHRlbl9wb2ludDsKKwkgaWYgKGZsYWdzICYgRERfUE9JTlRfU01PT1RIKSB7CisJICAgIGlmIChpbnRlbC0+c3RyaWN0X2NvbmZvcm1hbmNlKQorCSAgICAgICBpbnRlbC0+ZHJhd19wb2ludCA9IGludGVsX2ZhbGxiYWNrX3BvaW50OworCSB9CiAKLQkgaW5kZXggfD0gSU5URUxfRkFMTEJBQ0tfQklUOworICAgICAgICAgaW5kZXggfD0gSU5URUxfRkFMTEJBQ0tfQklUOwogICAgICAgfQogICAgfQogCkBAIC03MTAsMjAgKzkyNSwyMSBAQAogICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlF1YWQgPSByYXN0X3RhYltpbmRleF0ucXVhZDsKIAogICAgICAgaWYgKGluZGV4ID09IDApIHsKLQkgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJWZXJ0cyA9IGludGVsX3JlbmRlcl90YWJfdmVydHM7Ci0JIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiRWx0cyA9IGludGVsX3JlbmRlcl90YWJfZWx0czsKLQkgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRMaW5lID0gbGluZTsgLyogZnJvbSB0cml0bXAuaCAqLwotCSB0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZFBvbHlnb24gPSBpbnRlbEZhc3RSZW5kZXJDbGlwcGVkUG9seTsKLSAgICAgIH0gZWxzZSB7Ci0JIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiVmVydHMgPSBfdG5sX3JlbmRlcl90YWJfdmVydHM7Ci0JIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiRWx0cyA9IF90bmxfcmVuZGVyX3RhYl9lbHRzOwotCSB0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZExpbmUgPSBpbnRlbFJlbmRlckNsaXBwZWRMaW5lOwotCSB0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZFBvbHlnb24gPSBpbnRlbFJlbmRlckNsaXBwZWRQb2x5OworICAgICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJWZXJ0cyA9IGludGVsX3JlbmRlcl90YWJfdmVydHM7CisgICAgICAgICB0bmwtPkRyaXZlci5SZW5kZXIuUHJpbVRhYkVsdHMgPSBpbnRlbF9yZW5kZXJfdGFiX2VsdHM7CisgICAgICAgICB0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZExpbmUgPSBsaW5lOyAvKiBmcm9tIHRyaXRtcC5oICovCisgICAgICAgICB0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZFBvbHlnb24gPSBpbnRlbEZhc3RSZW5kZXJDbGlwcGVkUG9seTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJWZXJ0cyA9IF90bmxfcmVuZGVyX3RhYl92ZXJ0czsKKyAgICAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiRWx0cyA9IF90bmxfcmVuZGVyX3RhYl9lbHRzOworICAgICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRMaW5lID0gaW50ZWxSZW5kZXJDbGlwcGVkTGluZTsKKyAgICAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5DbGlwcGVkUG9seWdvbiA9IGludGVsUmVuZGVyQ2xpcHBlZFBvbHk7CiAgICAgICB9CiAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBHTGVudW0gcmVkdWNlZF9wcmltW0dMX1BPTFlHT04rMV0gPSB7CitzdGF0aWMgY29uc3QgR0xlbnVtIHJlZHVjZWRfcHJpbVtHTF9QT0xZR09OICsgMV0gPSB7CiAgICBHTF9QT0lOVFMsCiAgICBHTF9MSU5FUywKICAgIEdMX0xJTkVTLApAQCAtNzQ0LDM1ICs5NjAsNTIgQEAKIAogCiAKLXN0YXRpYyB2b2lkIGludGVsUnVuUGlwZWxpbmUoIEdMY29udGV4dCAqY3R4ICkKK3N0YXRpYyB2b2lkCitpbnRlbFJ1blBpcGVsaW5lKEdMY29udGV4dCAqIGN0eCkKIHsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKworICAgX21lc2FfbG9ja19jb250ZXh0X3RleHR1cmVzKGN0eCk7CisgICAKKyAgIGlmIChjdHgtPk5ld1N0YXRlKQorICAgICAgX21lc2FfdXBkYXRlX3N0YXRlX2xvY2tlZChjdHgpOwogCiAgICBpZiAoaW50ZWwtPk5ld0dMU3RhdGUpIHsKICAgICAgIGlmIChpbnRlbC0+TmV3R0xTdGF0ZSAmIF9ORVdfVEVYVFVSRSkgewotCSBpbnRlbC0+dnRibC51cGRhdGVfdGV4dHVyZV9zdGF0ZSggaW50ZWwgKTsgCisgICAgICAgICBpbnRlbC0+dnRibC51cGRhdGVfdGV4dHVyZV9zdGF0ZShpbnRlbCk7CiAgICAgICB9CiAKICAgICAgIGlmICghaW50ZWwtPkZhbGxiYWNrKSB7Ci0JIGlmIChpbnRlbC0+TmV3R0xTdGF0ZSAmIF9JTlRFTF9ORVdfUkVOREVSU1RBVEUpCi0JICAgIGludGVsQ2hvb3NlUmVuZGVyU3RhdGUoIGN0eCApOworICAgICAgICAgaWYgKGludGVsLT5OZXdHTFN0YXRlICYgX0lOVEVMX05FV19SRU5ERVJTVEFURSkKKyAgICAgICAgICAgIGludGVsQ2hvb3NlUmVuZGVyU3RhdGUoY3R4KTsKICAgICAgIH0KIAogICAgICAgaW50ZWwtPk5ld0dMU3RhdGUgPSAwOwogICAgfQogCi0gICBfdG5sX3J1bl9waXBlbGluZSggY3R4ICk7CisgICBfdG5sX3J1bl9waXBlbGluZShjdHgpOworCisgICBfbWVzYV91bmxvY2tfY29udGV4dF90ZXh0dXJlcyhjdHgpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbFJlbmRlclN0YXJ0KCBHTGNvbnRleHQgKmN0eCApCitzdGF0aWMgdm9pZAoraW50ZWxSZW5kZXJTdGFydChHTGNvbnRleHQgKiBjdHgpCiB7Ci0gICBJTlRFTF9DT05URVhUKGN0eCktPnZ0YmwucmVuZGVyX3N0YXJ0KCBJTlRFTF9DT05URVhUKGN0eCkgKTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKworICAgaW50ZWwtPnZ0YmwucmVuZGVyX3N0YXJ0KGludGVsX2NvbnRleHQoY3R4KSk7CisgICBpbnRlbC0+dnRibC5lbWl0X3N0YXRlKGludGVsKTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxSZW5kZXJGaW5pc2goIEdMY29udGV4dCAqY3R4ICkKK3N0YXRpYyB2b2lkCitpbnRlbFJlbmRlckZpbmlzaChHTGNvbnRleHQgKiBjdHgpCiB7Ci0gICBpZiAoSU5URUxfQ09OVEVYVChjdHgpLT5SZW5kZXJJbmRleCAmIElOVEVMX0ZBTExCQUNLX0JJVCkKLSAgICAgIF9zd3Jhc3RfZmx1c2goIGN0eCApOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworCisgICBpZiAoaW50ZWwtPlJlbmRlckluZGV4ICYgSU5URUxfRkFMTEJBQ0tfQklUKQorICAgICAgX3N3cmFzdF9mbHVzaChjdHgpOworCisgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOwogfQogCiAKQEAgLTc4MSwyOCArMTAxNCwzMyBAQAogIC8qIFN5c3RlbSB0byBmbHVzaCBkbWEgYW5kIGVtaXQgc3RhdGUgY2hhbmdlcyBiYXNlZCBvbiB0aGUgcmFzdGVyaXplZAogICAqIHByaW1pdGl2ZS4KICAgKi8KLXN0YXRpYyB2b2lkIGludGVsUmFzdGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHJwcmltLCBHTHVpbnQgaHdwcmltICkKK3N0YXRpYyB2b2lkCitpbnRlbFJhc3RlclByaW1pdGl2ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBycHJpbSwgR0x1aW50IGh3cHJpbSkKIHsKLSAgIGludGVsQ29udGV4dFB0ciBpbnRlbCA9IElOVEVMX0NPTlRFWFQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKIAogICAgaWYgKDApCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIAotCSAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHJwcmltKSwgaHdwcmltKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMgJXhcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIocnByaW0pLCBod3ByaW0pOwogCi0gICBpbnRlbC0+dnRibC5yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZSggaW50ZWwsIHJwcmltICk7Ci0gICAgCisgICBpbnRlbC0+dnRibC5yZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZShpbnRlbCwgcnByaW0pOworCiAgICAvKiBTdGFydCBhIG5ldyBwcmltaXRpdmUuICBBcnJhbmdlIHRvIGhhdmUgaXQgZmx1c2hlZCBsYXRlciBvbi4KICAgICAqLwotICAgaWYgKGh3cHJpbSAhPSBpbnRlbC0+cHJpbS5wcmltaXRpdmUpIAotICAgICAgaW50ZWxTdGFydElubGluZVByaW1pdGl2ZSggaW50ZWwsIGh3cHJpbSApOworICAgaWYgKGh3cHJpbSAhPSBpbnRlbC0+cHJpbS5wcmltaXRpdmUpIHsKKyAgICAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7CisKKyAgICAgIGludGVsX3NldF9wcmltKGludGVsLCBod3ByaW0pOworICAgfQogfQogCiAKLS8qIAotICovCi1zdGF0aWMgdm9pZCBpbnRlbFJlbmRlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwcmltICkKKyAvKiAKKyAgKi8KK3N0YXRpYyB2b2lkCitpbnRlbFJlbmRlclByaW1pdGl2ZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSBwcmltKQogewotICAgaW50ZWxDb250ZXh0UHRyIGludGVsID0gSU5URUxfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwogCiAgICBpZiAoMCkKICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywgX21lc2FfbG9va3VwX2VudW1fYnlfbnIocHJpbSkpOwpAQCAtODE3LDYzICsxMDU1LDU0IEBACiAgICAgKiBsb3dlciBsZXZlbCBmdW5jdGlvbnMgaW4gdGhhdCBjYXNlLCBwb3RlbnRpYWxseSBwaW5ncG9uZ2luZyB0aGUKICAgICAqIHN0YXRlOgogICAgICovCi0gICBpZiAocmVkdWNlZF9wcmltW3ByaW1dID09IEdMX1RSSUFOR0xFUyAmJiAKKyAgIGlmIChyZWR1Y2VkX3ByaW1bcHJpbV0gPT0gR0xfVFJJQU5HTEVTICYmCiAgICAgICAgKGN0eC0+X1RyaWFuZ2xlQ2FwcyAmIEREX1RSSV9VTkZJTExFRCkpCiAgICAgICByZXR1cm47CiAKICAgIC8qIFNldCBzb21lIHByaW1pdGl2ZS1kZXBlbmRlbnQgc3RhdGUgYW5kIFN0YXJ0PyBhIG5ldyBwcmltaXRpdmUuCiAgICAgKi8KLSAgIGludGVsUmFzdGVyUHJpbWl0aXZlKCBjdHgsIHJlZHVjZWRfcHJpbVtwcmltXSwgaHdfcHJpbVtwcmltXSApOworICAgaW50ZWxSYXN0ZXJQcmltaXRpdmUoY3R4LCByZWR1Y2VkX3ByaW1bcHJpbV0sIGh3X3ByaW1bcHJpbV0pOwogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgIFRyYW5zaXRpb24gdG8vZnJvbSBoYXJkd2FyZSByYXN0ZXJpemF0aW9uLiAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgVHJhbnNpdGlvbiB0by9mcm9tIGhhcmR3YXJlIHJhc3Rlcml6YXRpb24uICAgICAgICAgICAgICAgKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCB7Ci0gICBHTHVpbnQgYml0OwotICAgY29uc3QgY2hhciAqc3RyOwotfSBmYWxsYmFja1N0cmluZ3NbXSA9IHsKLSAgIHsgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIsICJEcmF3IGJ1ZmZlciIgfSwKLSAgIHsgSU5URUxfRkFMTEJBQ0tfUkVBRF9CVUZGRVIsICJSZWFkIGJ1ZmZlciIgfSwKLSAgIHsgSU5URUxfRkFMTEJBQ0tfVVNFUiwgIlVzZXIiIH0sCi0gICB7IElOVEVMX0ZBTExCQUNLX05PX0JBVENIQlVGRkVSLCAiTm8gQmF0Y2hidWZmZXIiIH0sCi0gICB7IElOVEVMX0ZBTExCQUNLX05PX1RFWE1FTSwgIk5vIFRleG1lbSIgfSwKLSAgIHsgSU5URUxfRkFMTEJBQ0tfUkVOREVSTU9ERSwgIlJlbmRlcm1vZGUiIH0sCitzdGF0aWMgY2hhciAqZmFsbGJhY2tTdHJpbmdzW10gPSB7CisgICBbMF0gPSAiRHJhdyBidWZmZXIiLAorICAgWzFdID0gIlJlYWQgYnVmZmVyIiwKKyAgIFsyXSA9ICJEZXB0aCBidWZmZXIiLAorICAgWzNdID0gIlN0ZW5jaWwgYnVmZmVyIiwKKyAgIFs0XSA9ICJVc2VyIGRpc2FibGUiLAorICAgWzVdID0gIlJlbmRlciBtb2RlIiwKIAotICAgeyBJODMwX0ZBTExCQUNLX1RFWFRVUkUsICJpODMwIHRleHR1cmUiIH0sCi0gICB7IEk4MzBfRkFMTEJBQ0tfQ09MT1JNQVNLLCAiaTgzMCBjb2xvcm1hc2siIH0sCi0gICB7IEk4MzBfRkFMTEJBQ0tfU1RFTkNJTCwgImk4MzAgc3RlbmNpbCIgfSwKLSAgIHsgSTgzMF9GQUxMQkFDS19TVElQUExFLCAiaTgzMCBzdGlwcGxlIiB9LAotICAgeyBJODMwX0ZBTExCQUNLX0xPR0lDT1AsICJpODMwIGxvZ2ljb3AiIH0sCi0KLSAgIHsgSTkxNV9GQUxMQkFDS19URVhUVVJFLCAiaTkxNSB0ZXh0dXJlIiB9LAotICAgeyBJOTE1X0ZBTExCQUNLX0NPTE9STUFTSywgImk5MTUgY29sb3JtYXNrIiB9LAotICAgeyBJOTE1X0ZBTExCQUNLX1NURU5DSUwsICJpOTE1IHN0ZW5jaWwiIH0sCi0gICB7IEk5MTVfRkFMTEJBQ0tfU1RJUFBMRSwgImk5MTUgc3RpcHBsZSIgfSwKLSAgIHsgSTkxNV9GQUxMQkFDS19QUk9HUkFNLCAiaTkxNSBwcm9ncmFtIiB9LAotICAgeyBJOTE1X0ZBTExCQUNLX0xPR0lDT1AsICJpOTE1IGxvZ2ljb3AiIH0sCi0gICB7IEk5MTVfRkFMTEJBQ0tfUE9MWUdPTl9TTU9PVEgsICJpOTE1IHBvbHlnb24gc21vb3RoIiB9LAotICAgeyBJOTE1X0ZBTExCQUNLX1BPSU5UX1NNT09USCwgImk5MTUgcG9pbnQgc21vb3RoIiB9LAotCi0gICB7IDAsIE5VTEwgfQorICAgWzEyXSA9ICJUZXh0dXJlIiwKKyAgIFsxM10gPSAiQ29sb3IgbWFzayIsCisgICBbMTRdID0gIlN0ZW5jaWwiLAorICAgWzE1XSA9ICJTdGlwcGxlIiwKKyAgIFsxNl0gPSAiUHJvZ3JhbSIsCisgICBbMTddID0gIkxvZ2ljIG9wIiwKKyAgIFsxOF0gPSAiU21vb3RoIHBvbHlnb24iLAorICAgWzE5XSA9ICJTbW9vdGggcG9pbnQiLAogfTsKIAogCi1zdGF0aWMgY29uc3QgY2hhciAqCitzdGF0aWMgY2hhciAqCiBnZXRGYWxsYmFja1N0cmluZyhHTHVpbnQgYml0KQogewotICAgaW50IGk7Ci0gICBmb3IgKGkgPSAwOyBmYWxsYmFja1N0cmluZ3NbaV0uYml0OyBpKyspIHsKLSAgICAgIGlmIChmYWxsYmFja1N0cmluZ3NbaV0uYml0ID09IGJpdCkKLSAgICAgICAgIHJldHVybiBmYWxsYmFja1N0cmluZ3NbaV0uc3RyOworICAgaW50IGkgPSAwOworICAgd2hpbGUgKGJpdCA+IDEpIHsKKyAgICAgIGkrKzsKKyAgICAgIGJpdCA+Pj0gMTsKICAgIH0KLSAgIHJldHVybiAidW5rbm93biBmYWxsYmFjayBiaXQiOworICAgcmV0dXJuIGZhbGxiYWNrU3RyaW5nc1tpXTsKIH0KIAogCi12b2lkIGludGVsRmFsbGJhY2soIGludGVsQ29udGV4dFB0ciBpbnRlbCwgR0x1aW50IGJpdCwgR0xib29sZWFuIG1vZGUgKQorCit2b2lkCitpbnRlbEZhbGxiYWNrKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGJpdCwgR0xib29sZWFuIG1vZGUpCiB7CiAgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwogICAgVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKQEAgLTg4MywyMCArMTExMiwxOSBAQAogICAgICAgaW50ZWwtPkZhbGxiYWNrIHw9IGJpdDsKICAgICAgIGlmIChvbGRmYWxsYmFjayA9PSAwKSB7CiAgICAgICAgICBpbnRlbEZsdXNoKGN0eCk7Ci0gICAgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19GQUxMQkFDS1MpIAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFTlRFUiBGQUxMQkFDSyAweCV4OiAlc1xuIiwKKyAgICAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0ZBTExCQUNLUykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRU5URVIgRkFMTEJBQ0sgJXg6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBiaXQsIGdldEZhbGxiYWNrU3RyaW5nKGJpdCkpOwotICAgICAgICAgX3N3c2V0dXBfV2FrZXVwKCBjdHggKTsKKyAgICAgICAgIF9zd3NldHVwX1dha2V1cChjdHgpOwogICAgICAgICAgaW50ZWwtPlJlbmRlckluZGV4ID0gfjA7CiAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgIGludGVsLT5GYWxsYmFjayAmPSB+Yml0OwogICAgICAgaWYgKG9sZGZhbGxiYWNrID09IGJpdCkgewotICAgICAgICAgX3N3cmFzdF9mbHVzaCggY3R4ICk7Ci0gICAgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19GQUxMQkFDS1MpIAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMRUFWRSBGQUxMQkFDSyAweCV4OiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgYml0LCBnZXRGYWxsYmFja1N0cmluZyhiaXQpKTsKKyAgICAgICAgIF9zd3Jhc3RfZmx1c2goY3R4KTsKKyAgICAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0ZBTExCQUNLUykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTEVBVkUgRkFMTEJBQ0sgJXNcbiIsIGdldEZhbGxiYWNrU3RyaW5nKGJpdCkpOwogICAgICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLlN0YXJ0ID0gaW50ZWxSZW5kZXJTdGFydDsKICAgICAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5QcmltaXRpdmVOb3RpZnkgPSBpbnRlbFJlbmRlclByaW1pdGl2ZTsKICAgICAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5GaW5pc2ggPSBpbnRlbFJlbmRlckZpbmlzaDsKQEAgLTkwNCwxOCArMTEzMiw5OSBAQAogICAgICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkNvcHlQViA9IF90bmxfY29weV9wdjsKICAgICAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5JbnRlcnAgPSBfdG5sX2ludGVycDsKIAotICAgICAgICAgX3RubF9pbnZhbGlkYXRlX3ZlcnRleF9zdGF0ZSggY3R4LCB+MCApOwotICAgICAgICAgX3RubF9pbnZhbGlkYXRlX3ZlcnRpY2VzKCBjdHgsIH4wICk7Ci0gICAgICAgICBfdG5sX2luc3RhbGxfYXR0cnMoIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsLT52ZXJ0ZXhfYXR0cnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+dmVydGV4X2F0dHJfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsLT5WaWV3cG9ydE1hdHJpeC5tLCAwICk7IAorICAgICAgICAgX3RubF9pbnZhbGlkYXRlX3ZlcnRleF9zdGF0ZShjdHgsIH4wKTsKKyAgICAgICAgIF90bmxfaW52YWxpZGF0ZV92ZXJ0aWNlcyhjdHgsIH4wKTsKKyAgICAgICAgIF90bmxfaW5zdGFsbF9hdHRycyhjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPnZlcnRleF9hdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbC0+dmVydGV4X2F0dHJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWwtPlZpZXdwb3J0TWF0cml4Lm0sIDApOwogCiAgICAgICAgICBpbnRlbC0+TmV3R0xTdGF0ZSB8PSBfSU5URUxfTkVXX1JFTkRFUlNUQVRFOwogICAgICAgfQogICAgfQogfQogCit1bmlvbiBmaQoreworICAgR0xmbG9hdCBmOworICAgR0xpbnQgaTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICBVc2VkIG9ubHkgd2l0aCB0aGUgbWV0YW9wcyBjYWxsYmFja3MuICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ludGVsX21ldGFfZHJhd19wb2x5KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgIEdMdWludCBuLAorICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB4eVtdWzJdLAorICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB6LCBHTHVpbnQgY29sb3IsIEdMZmxvYXQgdGV4W11bMl0pCit7CisgICB1bmlvbiBmaSAqdmI7CisgICBHTGludCBpOworICAgR0xib29sZWFuIHdhc19sb2NrZWQgPSBpbnRlbC0+bG9ja2VkOworICAgdW5zaWduZWQgaW50IHNhdmVkX3ZlcnRleF9zaXplID0gaW50ZWwtPnZlcnRleF9zaXplOworCisgICBpZiAoIXdhc19sb2NrZWQpCisgICAgICAgTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIGludGVsLT52ZXJ0ZXhfc2l6ZSA9IDY7CisKKyAgIC8qIEFsbCAzZCBwcmltaXRpdmVzIHNob3VsZCBiZSBlbWl0dGVkIHdpdGggTE9PUF9DTElQUkVDVFMsCisgICAgKiBvdGhlcndpc2UgdGhlIGRyYXdpbmcgb3JpZ2luIChEUjQpIG1pZ2h0IG5vdCBiZSBzZXQgY29ycmVjdGx5LgorICAgICovCisgICBpbnRlbF9zZXRfcHJpbShpbnRlbCwgUFJJTTNEX1RSSUZBTik7CisgICB2YiA9ICh1bmlvbiBmaSAqKSBpbnRlbF9nZXRfcHJpbV9zcGFjZShpbnRlbCwgbik7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIHZiWzBdLmYgPSB4eVtpXVswXTsKKyAgICAgIHZiWzFdLmYgPSB4eVtpXVsxXTsKKyAgICAgIHZiWzJdLmYgPSB6OworICAgICAgdmJbM10uaSA9IGNvbG9yOworICAgICAgdmJbNF0uZiA9IHRleFtpXVswXTsKKyAgICAgIHZiWzVdLmYgPSB0ZXhbaV1bMV07CisgICAgICB2YiArPSA2OworICAgfQorCisgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOworCisgICBpbnRlbC0+dmVydGV4X3NpemUgPSBzYXZlZF92ZXJ0ZXhfc2l6ZTsKKworICAgaWYgKCF3YXNfbG9ja2VkKQorICAgICAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9tZXRhX2RyYXdfcXVhZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHgwLCBHTGZsb2F0IHgxLAorICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB5MCwgR0xmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgeiwKKyAgICAgICAgICAgICAgICAgICAgIEdMdWludCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgczAsIEdMZmxvYXQgczEsIEdMZmxvYXQgdDAsIEdMZmxvYXQgdDEpCit7CisgICBHTGZsb2F0IHh5WzRdWzJdOworICAgR0xmbG9hdCB0ZXhbNF1bMl07CisKKyAgIHh5WzBdWzBdID0geDA7CisgICB4eVswXVsxXSA9IHkwOworICAgeHlbMV1bMF0gPSB4MTsKKyAgIHh5WzFdWzFdID0geTA7CisgICB4eVsyXVswXSA9IHgxOworICAgeHlbMl1bMV0gPSB5MTsKKyAgIHh5WzNdWzBdID0geDA7CisgICB4eVszXVsxXSA9IHkxOworCisgICB0ZXhbMF1bMF0gPSBzMDsKKyAgIHRleFswXVsxXSA9IHQwOworICAgdGV4WzFdWzBdID0gczE7CisgICB0ZXhbMV1bMV0gPSB0MDsKKyAgIHRleFsyXVswXSA9IHMxOworICAgdGV4WzJdWzFdID0gdDE7CisgICB0ZXhbM11bMF0gPSBzMDsKKyAgIHRleFszXVsxXSA9IHQxOworCisgICBpbnRlbF9tZXRhX2RyYXdfcG9seShpbnRlbCwgNCwgeHksIHosIGNvbG9yLCB0ZXgpOworfQogCiAKIApAQCAtOTI0LDggKzEyMzMsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLXZvaWQgaW50ZWxJbml0VHJpRnVuY3MoIEdMY29udGV4dCAqY3R4ICkKK3ZvaWQKK2ludGVsSW5pdFRyaUZ1bmNzKEdMY29udGV4dCAqIGN0eCkKIHsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CiAKQEAgLTk0Miw0ICsxMjUzLDYgQEAKICAgIHRubC0+RHJpdmVyLlJlbmRlci5CdWlsZFZlcnRpY2VzID0gX3RubF9idWlsZF92ZXJ0aWNlczsKICAgIHRubC0+RHJpdmVyLlJlbmRlci5Db3B5UFYgPSBfdG5sX2NvcHlfcHY7CiAgICB0bmwtPkRyaXZlci5SZW5kZXIuSW50ZXJwID0gX3RubF9pbnRlcnA7CisKKyAgIGludGVsLT52dGJsLm1ldGFfZHJhd19xdWFkID0gaW50ZWxfbWV0YV9kcmF3X3F1YWQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RyaXMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdHJpcy5oCmluZGV4IGQ3ZTM4MmYuLjBlMDg5ODYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdHJpcy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfdHJpcy5oCkBAIC0zMCw2ICszMCwxMCBAQAogCiAjaW5jbHVkZSAibXR5cGVzLmgiCiAKKyNkZWZpbmUgSU5URUxfVkJfU0laRQkJKDMyICogMTAyNCkKKy8qKiAzIGR3b3JkcyBvZiBzdGF0ZV9pbW1lZGlhdGUgYW5kIDIgb2YgM2RwcmltLCBpbiBpbnRlbF9mbHVzaF9wcmltICovCisjZGVmaW5lIElOVEVMX1BSSU1fRU1JVF9TSVpFCSg1ICogNCkKKwogI2RlZmluZSBfSU5URUxfTkVXX1JFTkRFUlNUQVRFIChfRERfTkVXX0xJTkVfU1RJUFBMRSB8CQlcCiAJCQkgICAgICAgX0REX05FV19UUklfVU5GSUxMRUQgfAkJXAogCQkJICAgICAgIF9ERF9ORVdfVFJJX0xJR0hUX1RXT1NJREUgfAlcCkBAIC0zOCw5ICs0MiwxMyBAQAogCQkJICAgICAgIF9ORVdfUFJPR1JBTSB8CQlcCiAJCQkgICAgICAgX05FV19QT0xZR09OU1RJUFBMRSkKIAotZXh0ZXJuIHZvaWQgaW50ZWxJbml0VHJpRnVuY3MoIEdMY29udGV4dCAqY3R4ICk7CitleHRlcm4gdm9pZCBpbnRlbEluaXRUcmlGdW5jcyhHTGNvbnRleHQgKiBjdHgpOwogCi1leHRlcm4gdm9pZCBpbnRlbFByaW50UmVuZGVyU3RhdGUoIGNvbnN0IGNoYXIgKm1zZywgR0x1aW50IHN0YXRlICk7Ci1leHRlcm4gdm9pZCBpbnRlbENob29zZVJlbmRlclN0YXRlKCBHTGNvbnRleHQgKmN0eCApOworZXh0ZXJuIHZvaWQgaW50ZWxDaG9vc2VSZW5kZXJTdGF0ZShHTGNvbnRleHQgKiBjdHgpOworCit2b2lkIGludGVsX3NldF9wcmltKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgdWludDMyX3QgcHJpbSk7CitHTHVpbnQgKmludGVsX2dldF9wcmltX3NwYWNlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgdW5zaWduZWQgaW50IGNvdW50KTsKK3ZvaWQgaW50ZWxfZmx1c2hfcHJpbShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpOwordm9pZCBpbnRlbF9maW5pc2hfdmIoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbF9kcmkuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvc2VydmVyL2ludGVsX2RyaS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVmZmRkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbF9kcmkuYwpAQCAtMCwwICsxIEBACisuLi8uLi9pbnRlbC9zZXJ2ZXIvaW50ZWxfZHJpLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L01ha2VmaWxlIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9NYWtlZmlsZQppbmRleCA5ZTRmZjExLi44ZmEyMDVlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L01ha2VmaWxlCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvTWFrZWZpbGUKQEAgLTUsMjUgKzUsMzAgQEAKIExJQk5BTUUgPSBpOTY1X2RyaS5zbwogCiBEUklWRVJfU09VUkNFUyA9IFwKLQlidWZtZ3JfZmFrZS5jIFwKIAlpbnRlbF9iYXRjaGJ1ZmZlci5jIFwKIAlpbnRlbF9ibGl0LmMgXAogCWludGVsX2J1ZmZlcl9vYmplY3RzLmMgXAogCWludGVsX2J1ZmZlcnMuYyBcCiAJaW50ZWxfY29udGV4dC5jIFwKKwlpbnRlbF9kZWNvZGUuYyBcCisJaW50ZWxfZGVwdGhzdGVuY2lsLmMgXAorCWludGVsX2Ziby5jIFwKIAlpbnRlbF9pb2N0bC5jIFwKIAlpbnRlbF9taXBtYXBfdHJlZS5jIFwKIAlpbnRlbF9yZWdpb25zLmMgXAogCWludGVsX3NjcmVlbi5jIFwKIAlpbnRlbF9zcGFuLmMgXAorCWludGVsX3BpeGVsLmMgXAogCWludGVsX3BpeGVsX2NvcHkuYyBcCiAJaW50ZWxfcGl4ZWxfYml0bWFwLmMgXAogCWludGVsX3N0YXRlLmMgXAogCWludGVsX3RleC5jIFwKKwlpbnRlbF90ZXhfY29weS5jIFwKKwlpbnRlbF90ZXhfZm9ybWF0LmMgXAorCWludGVsX3RleF9pbWFnZS5jIFwKIAlpbnRlbF90ZXhfbGF5b3V0LmMgXAorCWludGVsX3RleF9zdWJpbWFnZS5jIFwKIAlpbnRlbF90ZXhfdmFsaWRhdGUuYyBcCi0JYnJ3X2F1Yi5jIFwKLQlicndfYXViX3BsYXliYWNrLmMgXAogCWJyd19jYy5jIFwKIAlicndfY2xpcC5jIFwKIAlicndfY2xpcF9saW5lLmMgXApAQCAtNDQsNyArNDksNiBAQAogCWJyd19ncy5jIFwKIAlicndfZ3NfZW1pdC5jIFwKIAlicndfZ3Nfc3RhdGUuYyBcCi0JYnJ3X2hhbC5jIFwKIAlicndfbWV0YW9wcy5jIFwKIAlicndfbWlzY19zdGF0ZS5jIFwKIAlicndfcHJvZ3JhbS5jIFwKQEAgLTUzLDcgKzU3LDcgQEAKIAlicndfc2Zfc3RhdGUuYyBcCiAJYnJ3X3N0YXRlX2JhdGNoLmMgXAogCWJyd19zdGF0ZV9jYWNoZS5jIFwKLQlicndfc3RhdGVfcG9vbC5jIFwKKwlicndfc3RhdGVfZHVtcC5jIFwKIAlicndfc3RhdGVfdXBsb2FkLmMgXAogCWJyd190ZXguYyBcCiAJYnJ3X3RleF9sYXlvdXQuYyBcCkBAIC03MCw2ICs3NCw3IEBACiAJYnJ3X3dtX2VtaXQuYyBcCiAJYnJ3X3dtX2ZwLmMgXAogCWJyd193bV9pei5jIFwKKwlicndfd21fZ2xzbC5jIFwKIAlicndfd21fcGFzczAuYyBcCiAJYnJ3X3dtX3Bhc3MxLmMgXAogCWJyd193bV9wYXNzMi5jIFwKQEAgLTg0LDEwICs4OSwxMCBAQAogCiBBU01fU09VUkNFUyA9IAogCi1EUklWRVJfREVGSU5FUyA9IC1JLi4vaW50ZWwKK0RSSVZFUl9ERUZJTkVTID0gLUkuLi9pbnRlbCAtSS4uL2ludGVsL3NlcnZlcgogCiBpbmNsdWRlIC4uL01ha2VmaWxlLnRlbXBsYXRlCiAKLWludGVsX3RleF9sYXlvdXQubzogLi4vaW50ZWwvaW50ZWxfdGV4X2xheW91dC5jCi0KIHN5bWxpbmtzOgoraW50ZWxfZGVjb2RlLm86IC4uL2ludGVsL2ludGVsX2RlY29kZS5jCitpbnRlbF90ZXhfbGF5b3V0Lm86IC4uL2ludGVsL2ludGVsX3RleF9sYXlvdXQuYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfYXViLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19hdWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1MWE1Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19hdWIuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyAoaHR0cDovL3d3dy50dW5nc3RlbmdyYXBoaWNzLmNvbSkgdG8KLSBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgotIAotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAotIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKLSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKgotICAqIEF1dGhvcnM6Ci0gICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+Ci0gICovCi0KLSNpbmNsdWRlICJicndfY29udGV4dC5oIgotI2luY2x1ZGUgImJyd19hdWIuaCIKLSNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0KLQotLyogUmVnaXN0ZXJzIHRvIGNvbnRyb2wgcGFnZSB0YWJsZQotICovCi0jZGVmaW5lIFBHRVRCTF9DVEwgICAgICAgMHgyMDIwCi0jZGVmaW5lIFBHRVRCTF9FTkFCTEVEICAgMHgxCi0KLSNkZWZpbmUgTlJfR1RUX0VOVFJJRVMgIDY1NTM2CS8qIDI1NiBtYiAqLwotCi0jZGVmaW5lIEZBSUwJCQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCQkJXAotICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gd3JpdGUgYXViIGRhdGEgYXQgJXMvJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwlcCi0gICBleGl0KDEpOwkJCQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0KLS8qIEVtaXQgdGhlIGhlYWRlcnMgYXQgdGhlIHRvcCBvZiBlYWNoIGF1YmZpbGUuICBJbml0aWFsaXplIHRoZSBHVFQuCi0gKi8KLXN0YXRpYyB2b2lkIGluaXRfYXViZmlsZSggRklMRSAqYXViX2ZpbGUgKQoteyAgIAotICAgc3RydWN0IGF1Yl9maWxlX2hlYWRlciBmaDsKLSAgIHN0cnVjdCBhdWJfYmxvY2tfaGVhZGVyIGJoOwotICAgdW5zaWduZWQgaW50IGRhdGE7Ci0KLSAgIHN0YXRpYyBpbnQgbnI7Ci0gICAKLSAgIG5yKys7Ci0KLSAgIC8qIEVtaXQgdGhlIGF1YiBoZWFkZXI6Ci0gICAgKi8KLSAgIG1lbXNldCgmZmgsIDAsIHNpemVvZihmaCkpOwotCi0gICBmaC5pbnN0cnVjdGlvbl90eXBlID0gQVVCX0ZJTEVfSEVBREVSOwotICAgZmgubWlub3IgPSAweDA7Ci0gICBmaC5tYWpvciA9IDB4NzsKLSAgIG1lbWNweShmaC5hcHBsaWNhdGlvbiwgX19wcm9nbmFtZSwgc2l6ZW9mKGZoLmFwcGxpY2F0aW9uKSk7Ci0gICBmaC5kYXkgPSAobnI+PjI0KSAmIDB4ZmY7Ci0gICBmaC5tb250aCA9IDB4MDsKLSAgIGZoLnllYXIgPSAweDA7Ci0gICBmaC50aW1lem9uZSA9IDB4MDsKLSAgIGZoLnNlY29uZCA9IG5yICYgMHhmZjsKLSAgIGZoLm1pbnV0ZSA9IChucj4+OCkgJiAweGZmOwotICAgZmguaG91ciA9IChucj4+MTYpICYgMHhmZjsKLSAgIGZoLmNvbW1lbnRfbGVuZ3RoID0gMHgwOyAgIAotCi0gICBpZiAoZndyaXRlKCZmaCwgc2l6ZW9mKGZoKSwgMSwgYXViX2ZpbGUpIDwgMCkgCi0gICAgICBGQUlMOwotICAgICAgICAgCi0gICAvKiBTZXR1cCB0aGUgR1RUIHN0YXJ0aW5nIGF0IG1haW4gbWVtb3J5IGFkZHJlc3MgemVybyAoISk6Ci0gICAgKi8KLSAgIG1lbXNldCgmYmgsIDAsIHNpemVvZihiaCkpOwotICAgCi0gICBiaC5pbnN0cnVjdGlvbl90eXBlID0gQVVCX0JMT0NLX0hFQURFUjsKLSAgIGJoLm9wZXJhdGlvbiA9IEJIX01NSTBfV1JJVEUzMjsKLSAgIGJoLnR5cGUgPSAweDA7Ci0gICBiaC5hZGRyZXNzX3NwYWNlID0gQUREUl9HVFQ7CS8qID8/PyAqLwotICAgYmguZ2VuZXJhbF9zdGF0ZV90eXBlID0gMHgwOwotICAgYmguc3VyZmFjZV9zdGF0ZV90eXBlID0gMHgwOwotICAgYmguYWRkcmVzcyA9IFBHRVRCTF9DVEw7Ci0gICBiaC5sZW5ndGggPSAweDQ7Ci0KLSAgIGlmIChmd3JpdGUoJmJoLCBzaXplb2YoYmgpLCAxLCBhdWJfZmlsZSkgPCAwKSAKLSAgICAgIEZBSUw7Ci0KLSAgIGRhdGEgPSAweDAgfCBQR0VUQkxfRU5BQkxFRDsKLQotICAgaWYgKGZ3cml0ZSgmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxLCBhdWJfZmlsZSkgPCAwKSAKLSAgICAgIEZBSUw7Ci19Ci0KLQotc3RhdGljIHZvaWQgaW5pdF9hdWJfZ3R0KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKLQkJCSAgR0x1aW50IHN0YXJ0X29mZnNldCwgCi0JCQkgIEdMdWludCBzaXplICkKLXsKLSAgIEZJTEUgKmF1Yl9maWxlID0gYnJ3LT5pbnRlbC5hdWJfZmlsZTsKLSAgIHN0cnVjdCBhdWJfYmxvY2tfaGVhZGVyIGJoOwotICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgIGFzc2VydChzdGFydF9vZmZzZXQgKyBzaXplIDwgTlJfR1RUX0VOVFJJRVMgKiA0MDk2KTsKLQotCi0gICBtZW1zZXQoJmJoLCAwLCBzaXplb2YoYmgpKTsKLSAgIAotICAgYmguaW5zdHJ1Y3Rpb25fdHlwZSA9IEFVQl9CTE9DS19IRUFERVI7Ci0gICBiaC5vcGVyYXRpb24gPSBCSF9EQVRBX1dSSVRFOwotICAgYmgudHlwZSA9IDB4MDsKLSAgIGJoLmFkZHJlc3Nfc3BhY2UgPSBBRERSX01BSU47Ci0gICBiaC5nZW5lcmFsX3N0YXRlX3R5cGUgPSAweDA7Ci0gICBiaC5zdXJmYWNlX3N0YXRlX3R5cGUgPSAweDA7Ci0gICBiaC5hZGRyZXNzID0gIHN0YXJ0X29mZnNldCAvIDQwOTYgKiA0OwotICAgYmgubGVuZ3RoID0gc2l6ZSAvIDQwOTYgKiA0OwotCi0gICBpZiAoZndyaXRlKCZiaCwgc2l6ZW9mKGJoKSwgMSwgYXViX2ZpbGUpIDwgMCkgCi0gICAgICBGQUlMOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIDQwOTY7IGkrKykgewotICAgICAgR0x1aW50IGRhdGEgPSBicnctPm5leHRfZnJlZV9wYWdlIHwgMTsKLQotICAgICAgYnJ3LT5uZXh0X2ZyZWVfcGFnZSArPSA0MDk2OwotCi0gICAgICBpZiAoZndyaXRlKCZkYXRhLCBzaXplb2YoZGF0YSksIDEsIGF1Yl9maWxlKSA8IDApIAotCSBGQUlMOwotICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrX2hlYWRlciggRklMRSAqYXViX2ZpbGUsCi0JCQkJc3RydWN0IGF1Yl9ibG9ja19oZWFkZXIgKmJoLAotCQkJCWNvbnN0IEdMdWludCAqZGF0YSwKLQkJCQlHTHVpbnQgc3ogKQotewotICAgc3ogPSAoc3ogKyAzKSAmIH4zOwotCi0gICBpZiAoZndyaXRlKGJoLCBzaXplb2YoKmJoKSwgMSwgYXViX2ZpbGUpIDwgMCkgCi0gICAgICBGQUlMOwotCi0gICBpZiAoZndyaXRlKGRhdGEsIHN6LCAxLCBhdWJfZmlsZSkgPCAwKSAKLSAgICAgIEZBSUw7Ci0KLSAgIGZmbHVzaChhdWJfZmlsZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgd3JpdGVfZHVtcF9ibXAoIEZJTEUgKmF1Yl9maWxlLAotCQkJICAgIHN0cnVjdCBhdWJfZHVtcF9ibXAgKmRiICkKLXsKLSAgIGlmIChmd3JpdGUoZGIsIHNpemVvZigqZGIpLCAxLCBhdWJfZmlsZSkgPCAwKSAKLSAgICAgIEZBSUw7Ci0KLSAgIGZmbHVzaChhdWJfZmlsZSk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBicndfYXViX2d0dF9kYXRhKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkgICAgICBHTHVpbnQgb2Zmc2V0LAotCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgICAgIEdMdWludCBzeiwKLQkJCSAgICAgIEdMdWludCB0eXBlLAotCQkJICAgICAgR0x1aW50IHN0YXRlX3R5cGUgKQotewotICAgc3RydWN0IGF1Yl9ibG9ja19oZWFkZXIgYmg7Ci0KLSAgIGJoLmluc3RydWN0aW9uX3R5cGUgPSBBVUJfQkxPQ0tfSEVBREVSOwotICAgYmgub3BlcmF0aW9uID0gQkhfREFUQV9XUklURTsKLSAgIGJoLnR5cGUgPSB0eXBlOwotICAgYmguYWRkcmVzc19zcGFjZSA9IEFERFJfR1RUOwotICAgYmgucGFkMCA9IDA7Ci0KLSAgIGlmICh0eXBlID09IERXX0dFTkVSQUxfU1RBVEUpIHsKLSAgICAgIGJoLmdlbmVyYWxfc3RhdGVfdHlwZSA9IHN0YXRlX3R5cGU7Ci0gICAgICBiaC5zdXJmYWNlX3N0YXRlX3R5cGUgPSAwOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBiaC5nZW5lcmFsX3N0YXRlX3R5cGUgPSAwOwotICAgICAgYmguc3VyZmFjZV9zdGF0ZV90eXBlID0gc3RhdGVfdHlwZTsKLSAgIH0KLQotICAgYmgucGFkMSA9IDA7Ci0gICBiaC5hZGRyZXNzID0gb2Zmc2V0OwotICAgYmgubGVuZ3RoID0gc3o7Ci0KLSAgIHdyaXRlX2Jsb2NrX2hlYWRlcihpbnRlbC0+YXViX2ZpbGUsICZiaCwgZGF0YSwgc3opOwotfQotCi0KLQotc3RhdGljIHZvaWQgYnJ3X2F1Yl9ndHRfY21kcyggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgICAgR0x1aW50IG9mZnNldCwKLQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICAgICBHTHVpbnQgc3ogKQotewotICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dCgmaW50ZWwtPmN0eCk7Ci0gICBzdHJ1Y3QgYXViX2Jsb2NrX2hlYWRlciBiaDsgICAKLSAgIEdMdWludCB0eXBlID0gQ1dfUFJJTUFSWV9SSU5HX0E7Ci0gICAKLQotICAgYmguaW5zdHJ1Y3Rpb25fdHlwZSA9IEFVQl9CTE9DS19IRUFERVI7Ci0gICBiaC5vcGVyYXRpb24gPSBCSF9DT01NQU5EX1dSSVRFOwotICAgYmgudHlwZSA9IHR5cGU7Ci0gICBiaC5hZGRyZXNzX3NwYWNlID0gQUREUl9HVFQ7Ci0gICBiaC5wYWQwID0gMDsKLSAgIGJoLmdlbmVyYWxfc3RhdGVfdHlwZSA9IDA7Ci0gICBiaC5zdXJmYWNlX3N0YXRlX3R5cGUgPSAwOwotICAgYmgucGFkMSA9IDA7Ci0gICBiaC5hZGRyZXNzID0gb2Zmc2V0OwotICAgYmgubGVuZ3RoID0gc3o7Ci0KLSAgIHdyaXRlX2Jsb2NrX2hlYWRlcihicnctPmludGVsLmF1Yl9maWxlLCAmYmgsIGRhdGEsIHN6KTsKLX0KLQotc3RhdGljIHZvaWQgYnJ3X2F1Yl9kdW1wX2JtcCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgICAgR0x1aW50IGJ1ZmZlciApCi17Ci0gICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KCZpbnRlbC0+Y3R4KTsKLSAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4gPSBicnctPmludGVsLmludGVsU2NyZWVuOwotICAgc3RydWN0IGF1Yl9kdW1wX2JtcCBkYjsKLSAgIEdMdWludCBmb3JtYXQ7Ci0KLSAgIGlmIChpbnRlbFNjcmVlbi0+Y3BwID09IDQpCi0gICAgICBmb3JtYXQgPSAweDc7Ci0gICBlbHNlCi0gICAgICBmb3JtYXQgPSAweDM7Ci0KLQotICAgaWYgKGJ1ZmZlciA9PSAwKSB7Ci0gICAgICBkYi5pbnN0cnVjdGlvbl90eXBlID0gQVVCX0RVTVBfQk1QOwotICAgICAgZGIueG1pbiA9IDA7Ci0gICAgICBkYi55bWluID0gMDsKLSAgICAgIGRiLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgIGRiLmJwcCA9IGludGVsU2NyZWVuLT5jcHAgKiA4OwotICAgICAgZGIucGl0Y2ggPSBpbnRlbFNjcmVlbi0+ZnJvbnQucGl0Y2ggLyBpbnRlbFNjcmVlbi0+Y3BwOwotICAgICAgZGIueHNpemUgPSBpbnRlbFNjcmVlbi0+d2lkdGg7Ci0gICAgICBkYi55c2l6ZSA9IGludGVsU2NyZWVuLT5oZWlnaHQ7Ci0gICAgICBkYi5hZGRyID0gaW50ZWxTY3JlZW4tPmZyb250Lm9mZnNldDsKLSAgICAgIGRiLnVua25vd24gPSAweDA7CQkvKiA0OiB4bWFqb3IgdGlsZWQsIDA6IG5vdCB0aWxlZCAqLwotCi0gICAgICB3cml0ZV9kdW1wX2JtcChicnctPmludGVsLmF1Yl9maWxlLCAmZGIpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBkYi5pbnN0cnVjdGlvbl90eXBlID0gQVVCX0RVTVBfQk1QOwotICAgICAgZGIueG1pbiA9IDA7Ci0gICAgICBkYi55bWluID0gMDsKLSAgICAgIGRiLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgIGRiLmJwcCA9IGludGVsLT5iYWNrX3JlZ2lvbi0+Y3BwICogODsKLSAgICAgIGRiLnBpdGNoID0gaW50ZWwtPmJhY2tfcmVnaW9uLT5waXRjaDsKLSAgICAgIGRiLnhzaXplID0gaW50ZWwtPmJhY2tfcmVnaW9uLT5waXRjaDsKLSAgICAgIGRiLnlzaXplID0gaW50ZWwtPmJhY2tfcmVnaW9uLT5oZWlnaHQ7Ci0gICAgICBkYi5hZGRyID0gaW50ZWxTY3JlZW4tPmJhY2sub2Zmc2V0OwotICAgICAgZGIudW5rbm93biA9IGludGVsLT5iYWNrX3JlZ2lvbi0+dGlsZWQgPyAweDQgOiAweDA7Ci0KLSAgICAgIHdyaXRlX2R1bXBfYm1wKGJydy0+aW50ZWwuYXViX2ZpbGUsICZkYik7Ci0gICB9Ci19Ci0KLS8qIEF0dGVtcHQgdG8gcHJldmVudCBtb25zdGVyIGF1YmZpbGVzIGJ5IGNsb3NpbmcgYW5kIHJlb3BlbmluZyB3aGVuCi0gKiB0aGUgc3RhdGUgcG9vbHMgd3JhcC4KLSAqLwotc3RhdGljIHZvaWQgYnJ3X2F1Yl93cmFwKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dCgmaW50ZWwtPmN0eCk7ICAgCi0gICBpZiAoaW50ZWwtPmF1Yl9maWxlKSB7Ci0gICAgICBicndfYXViX2Rlc3Ryb3koYnJ3KTsKLSAgICAgIGJyd19hdWJfaW5pdChicncpOwotICAgfQotICAgYnJ3LT53cmFwID0gMTsJCS8qID8/PyAqLwotfQotCi0KLWludCBicndfYXViX2luaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZicnctPmludGVsOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLSAgIGNoYXIgZmlsZW5hbWVbODBdOwotICAgaW50IHZhbDsKLSAgIHN0YXRpYyBpbnQgaSA9IDA7Ci0KLSAgIGkrKzsKLQotICAgaWYgKF9tZXNhX2dldGVudigiSU5URUxfUkVQTEFZIikpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKF9tZXNhX2dldGVudigiSU5URUxfQVVCRklMRSIpKSB7Ci0gICAgICB2YWwgPSBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzJWQuYXViIiwgX21lc2FfZ2V0ZW52KCJJTlRFTF9BVUJGSUxFIiksIGklNCk7Ci0gICAgICBfbWVzYV9wcmludGYoIi0tPiBBdWIgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIGJydy0+aW50ZWwuYXViX2ZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKLSAgIH0KLSAgIGVsc2UgaWYgKF9tZXNhX2dldGVudigiSU5URUxfQVVCIikpIHsKLSAgICAgIHZhbCA9IHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMuYXViIiwgX19wcm9nbmFtZSk7Ci0gICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiBzaXplb2YoZmlsZW5hbWUpKSAKLQkgc3RyY3B5KGZpbGVuYW1lLCAiZGVmYXVsdC5hdWIiKTsgICAKLSAgIAotICAgICAgX21lc2FfcHJpbnRmKCItLT4gQXViIGZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICBicnctPmludGVsLmF1Yl9maWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBpZiAoIWJydy0+aW50ZWwuYXViX2ZpbGUpIHsKLSAgICAgIF9tZXNhX3ByaW50ZigiY291bGRuJ3Qgb3BlbiBhdWJmaWxlXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIGJydy0+aW50ZWwudnRibC5hdWJfY29tbWFuZHMgPSBicndfYXViX2d0dF9jbWRzOwotICAgYnJ3LT5pbnRlbC52dGJsLmF1Yl9kdW1wX2JtcCA9IGJyd19hdWJfZHVtcF9ibXA7Ci0gICBicnctPmludGVsLnZ0YmwuYXViX2d0dF9kYXRhID0gYnJ3X2F1Yl9ndHRfZGF0YTsKLSAgIGJydy0+aW50ZWwudnRibC5hdWJfd3JhcCA9IGJyd19hdWJfd3JhcDsKLSAgIAotICAgaW5pdF9hdWJmaWxlKGJydy0+aW50ZWwuYXViX2ZpbGUpOwotCi0gICAvKiBUaGUgR1RUIGlzIGxvY2F0ZWQgc3RhcnRpbmcgYWRkcmVzcyB6ZXJvIGluIG1haW4gbWVtb3J5LiAgUGFnZXMKLSAgICAqIHRvIHBvcHVsYXRlIHRoZSBndHQgc3RhcnQgYWZ0ZXIgdGhpcyBwb2ludC4KLSAgICAqLwotICAgYnJ3LT5uZXh0X2ZyZWVfcGFnZSA9IChOUl9HVFRfRU5UUklFUyAqIDQgKyA0MDk1KSAmIH40MDk1OwotCi0gICAvKiBNb3JlIG9yIGxlc3MgY29ycmVzcG9uZCB3aXRoIGFsbCB0aGUgYWdwIHJlZ2lvbnMgbWFwcGVkIGJ5IHRoZQotICAgICogZHJpdmVyOgotICAgICovCi0gICBpbml0X2F1Yl9ndHQoYnJ3LCAwLCA0MDk2KjQpOyAvKiBzbyBuZXcgZnVsc2ltIGRvZXNuJ3QgY3Jhc2ggKi8KLSAgIGluaXRfYXViX2d0dChicncsIGludGVsU2NyZWVuLT5mcm9udC5vZmZzZXQsIGludGVsU2NyZWVuLT5iYWNrLnNpemUpOwotICAgaW5pdF9hdWJfZ3R0KGJydywgaW50ZWxTY3JlZW4tPmJhY2sub2Zmc2V0LCBpbnRlbFNjcmVlbi0+YmFjay5zaXplKTsKLSAgIGluaXRfYXViX2d0dChicncsIGludGVsU2NyZWVuLT5kZXB0aC5vZmZzZXQsIGludGVsU2NyZWVuLT5iYWNrLnNpemUpOwotICAgaW5pdF9hdWJfZ3R0KGJydywgaW50ZWxTY3JlZW4tPnRleC5vZmZzZXQsIGludGVsU2NyZWVuLT50ZXguc2l6ZSk7Ci0KLSAgIHJldHVybiAwOwotfQotCi12b2lkIGJyd19hdWJfZGVzdHJveSggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQotewotICAgaWYgKGJydy0+aW50ZWwuYXViX2ZpbGUpIHsKLSAgICAgIGZjbG9zZShicnctPmludGVsLmF1Yl9maWxlKTsKLSAgICAgIGJydy0+aW50ZWwuYXViX2ZpbGUgPSBOVUxMOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfYXViLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19hdWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ZTM2ZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19hdWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyAoaHR0cDovL3d3dy50dW5nc3RlbmdyYXBoaWNzLmNvbSkgdG8KLSBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgotIAotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAotIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKLSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKgotICAqIEF1dGhvcnM6Ci0gICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+Ci0gICovCi0KLSNpZm5kZWYgQlJXX0FVQl9ICi0jZGVmaW5lIEJSV19BVUJfSAotCi1zdHJ1Y3QgYXViX2ZpbGVfaGVhZGVyIHsKLSAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl90eXBlOwotICAgdW5zaWduZWQgaW50IHBhZDA6MTY7Ci0gICB1bnNpZ25lZCBpbnQgbWlub3I6ODsKLSAgIHVuc2lnbmVkIGludCBtYWpvcjo4OwotICAgdW5zaWduZWQgY2hhciBhcHBsaWNhdGlvbls4KjRdOwotICAgdW5zaWduZWQgaW50IGRheTo4OwotICAgdW5zaWduZWQgaW50IG1vbnRoOjg7Ci0gICB1bnNpZ25lZCBpbnQgeWVhcjoxNjsKLSAgIHVuc2lnbmVkIGludCB0aW1lem9uZTo4OwotICAgdW5zaWduZWQgaW50IHNlY29uZDo4OwotICAgdW5zaWduZWQgaW50IG1pbnV0ZTo4OwotICAgdW5zaWduZWQgaW50IGhvdXI6ODsKLSAgIHVuc2lnbmVkIGludCBjb21tZW50X2xlbmd0aDoxNjsgICAKLSAgIHVuc2lnbmVkIGludCBwYWQxOjE2OwotfTsKLQotc3RydWN0IGF1Yl9ibG9ja19oZWFkZXIgewotICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3R5cGU7Ci0gICB1bnNpZ25lZCBpbnQgb3BlcmF0aW9uOjg7Ci0gICB1bnNpZ25lZCBpbnQgdHlwZTo4OwotICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc3BhY2U6ODsKLSAgIHVuc2lnbmVkIGludCBwYWQwOjg7Ci0gICB1bnNpZ25lZCBpbnQgZ2VuZXJhbF9zdGF0ZV90eXBlOjg7Ci0gICB1bnNpZ25lZCBpbnQgc3VyZmFjZV9zdGF0ZV90eXBlOjg7Ci0gICB1bnNpZ25lZCBpbnQgcGFkMToxNjsKLSAgIHVuc2lnbmVkIGludCBhZGRyZXNzOwotICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBhdWJfZHVtcF9ibXAgewotICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3R5cGU7Ci0gICB1bnNpZ25lZCBpbnQgeG1pbjoxNjsKLSAgIHVuc2lnbmVkIGludCB5bWluOjE2OwotICAgdW5zaWduZWQgaW50IHBpdGNoOjE2OwotICAgdW5zaWduZWQgaW50IGJwcDo4OwotICAgdW5zaWduZWQgaW50IGZvcm1hdDo4OwotICAgdW5zaWduZWQgaW50IHhzaXplOjE2OwotICAgdW5zaWduZWQgaW50IHlzaXplOjE2OwotICAgdW5zaWduZWQgaW50IGFkZHI7Ci0gICB1bnNpZ25lZCBpbnQgdW5rbm93bjsKLX07Ci0KLWVudW0gYmhfb3BlcmF0aW9uIHsKLSAgIEJIX0NPTU1FTlQsCi0gICBCSF9EQVRBX1dSSVRFLAotICAgQkhfQ09NTUFORF9XUklURSwKLSAgIEJIX01NSTBfV1JJVEUzMiwKLSAgIEJIX0VORF9TQ0VORSwKLSAgIEJIX0NPTkZJR19NRU1PUllfTUFQLAotICAgQkhfTUFYX09QRVJBVElPTgotfTsKLQotZW51bSBjb21tYW5kX3dyaXRlX3R5cGUgewotICAgQ1dfSFdCX1JJTkcgPSAxLAotICAgQ1dfUFJJTUFSWV9SSU5HX0EsCi0gICBDV19QUklNQVJZX1JJTkdfQiwJCS8qIFhYWCAtIGRpc2FncmVlbWVudCB3aXRoIGxpc3RhdWIhICovCi0gICBDV19QUklNQVJZX1JJTkdfQywKLSAgIENXX01BWF9UWVBFCi19OwotCi1lbnVtIGRhdGFfd3JpdGVfdHlwZSB7Ci0gICBEV19OT1RZUEUsCi0gICBEV19CQVRDSF9CVUZGRVIsCi0gICBEV19CSU5fQlVGRkVSLAotICAgRFdfQklOX1BPSU5URVJfTElTVCwKLSAgIERXX1NMT1dfU1RBVEVfQlVGRkVSLAotICAgRFdfVkVSVEVYX0JVRkZFUiwKLSAgIERXXzJEX01BUCwKLSAgIERXX0NVQkVfTUFQLAotICAgRFdfSU5ESVJFQ1RfU1RBVEVfQlVGRkVSLAotICAgRFdfVk9MVU1FX01BUCwKLSAgIERXXzFEX01BUCwKLSAgIERXX0NPTlNUQU5UX0JVRkZFUiwKLSAgIERXX0NPTlNUQU5UX1VSQl9FTlRSWSwKLSAgIERXX0lOREVYX0JVRkZFUiwKLSAgIERXX0dFTkVSQUxfU1RBVEUsCi0gICBEV19TVVJGQUNFX1NUQVRFLAotICAgRFdfTUVESUFfT0JKRUNUX0lORElSRUNUX0RBVEEsCi0gICBEV19NQVhfVFlQRQotfTsKLQotZW51bSBkYXRhX3dyaXRlX2dlbmVyYWxfc3RhdGVfdHlwZSB7Ci0gICBEV0dTX05PVFlQRSwKLSAgIERXR1NfVkVSVEVYX1NIQURFUl9TVEFURSwKLSAgIERXR1NfR0VPTUVUUllfU0hBREVSX1NUQVRFICwKLSAgIERXR1NfQ0xJUFBFUl9TVEFURSwKLSAgIERXR1NfU1RSSVBTX0ZBTlNfU1RBVEUsCi0gICBEV0dTX1dJTkRPV0VSX0laX1NUQVRFLAotICAgRFdHU19DT0xPUl9DQUxDX1NUQVRFLAotICAgRFdHU19DTElQUEVSX1ZJRVdQT1JUX1NUQVRFLAkvKiB3YXMgMHg3ICovCi0gICBEV0dTX1NUUklQU19GQU5TX1ZJRVdQT1JUX1NUQVRFLAotICAgRFdHU19DT0xPUl9DQUxDX1ZJRVdQT1JUX1NUQVRFLCAvKiB3YXMgMHg5ICovCi0gICBEV0dTX1NBTVBMRVJfU1RBVEUsCi0gICBEV0dTX0tFUk5FTF9JTlNUUlVDVElPTlMsCi0gICBEV0dTX1NDUkFUQ0hfU1BBQ0UsCi0gICBEV0dTX1NBTVBMRVJfREVGQVVMVF9DT0xPUiwKLSAgIERXR1NfSU5URVJGQUNFX0RFU0NSSVBUT1IsCi0gICBEV0dTX1ZMRF9TVEFURSwKLSAgIERXR1NfVkZFX1NUQVRFLAotICAgRFdHU19NQVhfVFlQRQotfTsKLQotZW51bSBkYXRhX3dyaXRlX3N1cmZhY2Vfc3RhdGVfdHlwZSB7Ci0gICBEV1NTX05PVFlQRSwKLSAgIERXU1NfQklORElOR19UQUJMRV9TVEFURSwKLSAgIERXU1NfU1VSRkFDRV9TVEFURSwKLSAgIERXU1NfTUFYX1RZUEUKLX07Ci0KLWVudW0gbWVtb3J5X21hcF90eXBlIHsKLSAgIE1NX0RFRkFVTFQsCi0gICBNTV9EWU5BTUlDLAotICAgTU1fTUFYX1RZUEUKLX07Ci0KLWVudW0gYWRkcmVzc19zcGFjZSB7Ci0gICBBRERSX0dUVCwKLSAgIEFERFJfTE9DQUwsCi0gICBBRERSX01BSU4sCi0gICBBRERSX01BWAotfTsKLQotCi0jZGVmaW5lIEFVQl9GSUxFX0hFQURFUiAweGUwODUwMDBiCi0jZGVmaW5lIEFVQl9CTE9DS19IRUFERVIgMHhlMGMxMDAwMwotI2RlZmluZSBBVUJfRFVNUF9CTVAgMHhlMDllMDAwNAotCi1zdHJ1Y3QgYnJ3X2NvbnRleHQ7Ci1zdHJ1Y3QgaW50ZWxfY29udGV4dDsKLQotaW50IGJyd19hdWJfaW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncgKTsKLXZvaWQgYnJ3X2F1Yl9kZXN0cm95KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwotCi1pbnQgYnJ3X3BsYXliYWNrX2F1YmZpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCQkgY29uc3QgY2hhciAqZmlsZW5hbWUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2F1Yl9wbGF5YmFjay5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfYXViX3BsYXliYWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzNkNTAuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfYXViX3BsYXliYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgImJyd19hdWIuaCIKLSNpbmNsdWRlICJicndfZGVmaW5lcy5oIgotI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKLSNpbmNsdWRlICJidWZtZ3IuaCIKLQotc3RydWN0IGF1Yl9zdGF0ZSB7Ci0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWw7Ci0gICBjb25zdCBjaGFyICptYXA7Ci0gICB1bnNpZ25lZCBpbnQgY3NyOwotICAgdW5zaWduZWQgaW50IHN6OwotfTsKLQotCi1zdGF0aWMgaW50IGdvYmJsZSggc3RydWN0IGF1Yl9zdGF0ZSAqcywgaW50IHNpemUgKQotewotICAgaWYgKHMtPmNzciArIHNpemUgPiBzLT5zeikgewotICAgICAgX21lc2FfcHJpbnRmKCJFT0YgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgcy0+Y3NyICs9IHNpemU7Ci0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZmx1c2hfYW5kX2ZlbmNlKCBzdHJ1Y3QgYXViX3N0YXRlICpzICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IHMtPmludGVsOwotICAgR0x1aW50IGJ1ZlsyXTsKLQotICAgYnVmWzBdID0gaW50ZWwtPnZ0YmwuZmx1c2hfY21kKCk7Ci0gICBidWZbMV0gPSAwOwotCi0gICBpbnRlbF9jbWRfaW9jdGwoaW50ZWwsIChjaGFyICopJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgCi0gICBpbnRlbFdhaXRJcnEoIGludGVsLCBpbnRlbEVtaXRJcnFMb2NrZWQoIGludGVsICkpOwotfQotCi1zdGF0aWMgdm9pZCBmbHVzaF9jbWRzKCBzdHJ1Y3QgYXViX3N0YXRlICpzLAotCQkJY29uc3Qgdm9pZCAqZGF0YSwKLQkJCWludCBsZW4gKQotewotICAgREJHKCIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOwotCi0gICBpZiAobGVuICYgMHg0KSB7Ci0gICAgICB1bnNpZ25lZCBpbnQgKnRtcCA9IG1hbGxvYyhsZW4gKyA0KTsKLSAgICAgIERCRygicGFkZGluZyB0byBvY3R3b3JkXG4iKTsKLSAgICAgIG1lbWNweSh0bXAsIGRhdGEsIGxlbik7Ci0gICAgICB0bXBbbGVuLzRdID0gTUlfTk9PUDsKLSAgICAgIGZsdXNoX2NtZHMocywgdG1wLCBsZW4rNCk7Ci0gICAgICBmcmVlKHRtcCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIEZvciByaW5nIGRhdGEsIGp1c3Qgc2VuZCBvZmYgaW1tZWRpYXRlbHkgdmlhIGFuIGlvY3RsLgotICAgICogVGhpcyBkaWZmZXJzIHNsaWdodGx5IGZyb20gaG93IHRoZSBzdHJlYW0gd2FzIGV4ZWN1dGVkCi0gICAgKiBpbml0aWFsbHkgYXMgdGhpcyB3b3VsZCBoYXZlIGJlZW4gYSBiYXRjaGJ1ZmZlci4KLSAgICAqLwotICAgaW50ZWxfY21kX2lvY3RsKHMtPmludGVsLCAodm9pZCAqKWRhdGEsIGxlbik7Ci0KLSAgIGlmICgxKQotICAgICAgZmx1c2hfYW5kX2ZlbmNlKHMpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqcHN0cmluZ3NbXSA9IHsKLSAgICJub25lIiwKLSAgICJQT0lOVExJU1QiLAotICAgIkxJTkVMSVNUIiwKLSAgICJMSU5FU1RSSVAiLAotICAgIlRSSUxJU1QiLAotICAgIlRSSVNUUklQIiwKLSAgICJUUklGQU4iLAotICAgIlFVQURMSVNUIiwKLSAgICJRVUFEU1RSSVAiLAotICAgIkxJTkVMSVNUX0FESiIsCi0gICAiTElORVNUUklQX0FESiIsCi0gICAiVFJJTElTVF9BREoiLAotICAgIlRSSVNUUklQX0FESiIsCi0gICAiVFJJU1RSSVBfUkVWRVJTRSIsCi0gICAiUE9MWUdPTiIsCi0gICAiUkVDVExJU1QiLAotICAgIkxJTkVMT09QIiwKLSAgICJQT0lOVExJU1RfQkYiLAotICAgIkxJTkVTVFJJUF9DT05UIiwKLSAgICJMSU5FU1RSSVBfQkYiLAotICAgIkxJTkVTVFJJUF9DT05UX0JGIiwKLSAgICJUUklGQU5fTk9TVElQUExFIiwKLX07Ci0KLXN0YXRpYyB2b2lkIGRvXzNkX3ByaW0oIHN0cnVjdCBhdWJfc3RhdGUgKnMsCi0JCQljb25zdCB2b2lkICpkYXRhLAotCQkJaW50IGxlbiApCi17Ci0gICBzdHJ1Y3QgYnJ3XzNkX3ByaW1pdGl2ZSBwcmltOwotICAgY29uc3Qgc3RydWN0IGJyd18zZF9wcmltaXRpdmUgKm9yaWcgPSBkYXRhOwotICAgaW50IGk7Ci0KLSAgIGFzc2VydChsZW4gPT0gc2l6ZW9mKHByaW0pKTsKLSAgIG1lbWNweSgmcHJpbSwgZGF0YSwgc2l6ZW9mKHByaW0pKTsKLQotI2RlZmluZSBTVEFSVCAwCi0jZGVmaW5lIEJMT0NLICgxMioyOCkKLQotICAgaWYgKG9yaWctPnZlcnRzX3Blcl9pbnN0YW5jZSA8IEJMT0NLKQotICAgICAgZmx1c2hfY21kcyhzLCAmcHJpbSwgc2l6ZW9mKHByaW0pKTsKLSAgIGVsc2UgewotICAgICAgZm9yIChpID0gU1RBUlQ7IGkgKyBCTE9DSyA8IG9yaWctPnZlcnRzX3Blcl9pbnN0YW5jZTsgaSArPSBCTE9DSy8yKSB7Ci0JIHByaW0uc3RhcnRfdmVydF9sb2NhdGlvbiA9IGk7Ci0JIHByaW0udmVydHNfcGVyX2luc3RhbmNlID0gQkxPQ0s7Ci0JIF9tZXNhX3ByaW50ZigiJXNwcmltICVkLyVzIHZlcnRzICVkLi4lZCAob2YgJWQpXG4iLCAKLQkJICAgICAgcHJpbS5oZWFkZXIuaW5kZXhlZCA/ICJJTkRFWEVEICIgOiAiIiwKLQkJICAgICAgcHJpbS5oZWFkZXIudG9wb2xvZ3ksIHBzdHJpbmdzW3ByaW0uaGVhZGVyLnRvcG9sb2d5JTE2XSwKLQkJICAgICAgcHJpbS5zdGFydF92ZXJ0X2xvY2F0aW9uLCAKLQkJICAgICAgcHJpbS5zdGFydF92ZXJ0X2xvY2F0aW9uICsgcHJpbS52ZXJ0c19wZXJfaW5zdGFuY2UsCi0JCSAgICAgIG9yaWctPnZlcnRzX3Blcl9pbnN0YW5jZSk7Ci0JIGZsdXNoX2NtZHMocywgJnByaW0sIHNpemVvZihwcmltKSk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotCi1zdGF0aWMgc3RydWN0IHsKLSAgIGludCBjbWQ7Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgaW50IGhhc19sZW5ndGg7Ci19IGNtZF9pbmZvW10gPSB7Ci0gICB7IDAsICJOT09QIiwgMCB9LAotICAgeyAweDU0MTAsICJYWV9DT0xPUl9CTFRfUkdCIiwgMSB9LAotICAgeyAweDU0MzAsICJYWV9DT0xPUl9CTFRfUkdCQSIsIDEgfSwKLSAgIHsgMHg1NGQwLCAiWFlfU1JDX0NPUFlfQkxUX1JHQiIsIDEgfSwKLSAgIHsgMHg1NGYwLCAiWFlfU1JDX0NPUFlfQkxUX1JHQkEiLCAxIH0sCi0gICB7IENNRF9VUkJfRkVOQ0UsICJVUkJfRkVOQ0UiLCAgMSB9LAotICAgeyBDTURfQ09OU1RfQlVGRkVSX1NUQVRFLCAiQ09OU1RfQlVGRkVSX1NUQVRFIiwgIDEgfSwKLSAgIHsgQ01EX0NPTlNUX0JVRkZFUiwgIkNPTlNUX0JVRkZFUiIsICAxIH0sCi0gICB7IENNRF9TVEFURV9CQVNFX0FERFJFU1MsICJTVEFURV9CQVNFX0FERFJFU1MiLCAgMSB9LAotICAgeyBDTURfU1RBVEVfSU5TTl9QT0lOVEVSLCAiU1RBVEVfSU5TTl9QT0lOVEVSIiwgIDEgfSwKLSAgIHsgQ01EX1BJUEVMSU5FX1NFTEVDVCwgIlBJUEVMSU5FX1NFTEVDVCIsIDAsIH0sCi0gICB7IENNRF9QSVBFTElORURfU1RBVEVfUE9JTlRFUlMsICJQSVBFTElORURfU1RBVEVfUE9JTlRFUlMiLCAxIH0sCi0gICB7IENNRF9CSU5ESU5HX1RBQkxFX1BUUlMsICJCSU5ESU5HX1RBQkxFX1BUUlMiLCAxIH0sCi0gICB7IENNRF9WRVJURVhfQlVGRkVSLCAiVkVSVEVYX0JVRkZFUiIsIDEgfSwKLSAgIHsgQ01EX1ZFUlRFWF9FTEVNRU5ULCAiVkVSVEVYX0VMRU1FTlQiLCAxIH0sCi0gICB7IENNRF9JTkRFWF9CVUZGRVIsICJJTkRFWF9CVUZGRVIiLCAxIH0sCi0gICB7IENNRF9WRl9TVEFUSVNUSUNTLCAiVkZfU1RBVElTVElDUyIsIDAgfSwKLSAgIHsgQ01EX0RSQVdfUkVDVCwgIkRSQVdfUkVDVCIsIDEgfSwKLSAgIHsgQ01EX0JMRU5EX0NPTlNUQU5UX0NPTE9SLCAiQkxFTkRfQ09OU1RBTlRfQ09MT1IiLCAxIH0sCi0gICB7IENNRF9DSFJPTUFfS0VZLCAiQ0hST01BX0tFWSIsIDEgfSwKLSAgIHsgQ01EX0RFUFRIX0JVRkZFUiwgIkRFUFRIX0JVRkZFUiIsIDEgfSwKLSAgIHsgQ01EX1BPTFlfU1RJUFBMRV9PRkZTRVQsICJQT0xZX1NUSVBQTEVfT0ZGU0VUIiwgMSB9LAotICAgeyBDTURfUE9MWV9TVElQUExFX1BBVFRFUk4sICJQT0xZX1NUSVBQTEVfUEFUVEVSTiIsIDEgfSwKLSAgIHsgQ01EX0xJTkVfU1RJUFBMRV9QQVRURVJOLCAiTElORV9TVElQUExFX1BBVFRFUk4iLCAxIH0sCi0gICB7IENNRF9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QLCAiR0xPQkFMX0RFUFRIX09GRlNFVF9DTEFNUCIsIDEgfSwKLSAgIHsgQ01EX1BJUEVfQ09OVFJPTCwgIlBJUEVfQ09OVFJPTCIsIDEgfSwKLSAgIHsgQ01EX01JX0ZMVVNILCAiTUlfRkxVU0giLCAwIH0sCi0gICB7IENNRF8zRF9QUklNLCAiM0RfUFJJTSIsIDEgfSwKLX07Ci0KLSNkZWZpbmUgTlJfQ01EUyAoc2l6ZW9mKGNtZF9pbmZvKS9zaXplb2YoY21kX2luZm9bMF0pKQotCi0KLXN0YXRpYyBpbnQgZmluZF9jb21tYW5kKCB1bnNpZ25lZCBpbnQgY21kICkKLXsKLSAgIGludCBpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgTlJfQ01EUzsgaSsrKSAKLSAgICAgIGlmIChjbWQgPT0gY21kX2luZm9baV0uY21kKSAKLQkgcmV0dXJuIGk7Ci0KLSAgIHJldHVybiAtMTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZHMoIHN0cnVjdCBhdWJfc3RhdGUgKnMsCi0JCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmRhdGEsCi0JCQkgICBpbnQgbGVuICkKLXsKLSAgIHdoaWxlIChsZW4pIHsKLSAgICAgIGludCBjbWQgPSBkYXRhWzBdID4+IDE2OwotICAgICAgaW50IGR3b3JkczsKLSAgICAgIGludCBpOwotCi0gICAgICBpID0gZmluZF9jb21tYW5kKGNtZCk7Ci0KLSAgICAgIGlmIChpIDwgMCkgewotCSBfbWVzYV9wcmludGYoImNvdWxkbid0IGZpbmQgaW5mbyBmb3IgY21kICV4XG4iLCBjbWQpOwotCSByZXR1cm4gMTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNtZF9pbmZvW2ldLmhhc19sZW5ndGgpCi0JIGR3b3JkcyA9IChkYXRhWzBdICYgMHhmZikgKyAyOwotICAgICAgZWxzZQotCSBkd29yZHMgPSAxOwotCi0gICAgICBfbWVzYV9wcmludGYoIiVzICglZCBkd29yZHMpIDB4JXhcbiIsIGNtZF9pbmZvW2ldLm5hbWUsIGR3b3JkcywgZGF0YVswXSk7Ci0KLSAgICAgIGlmIChsZW4gPCBkd29yZHMgKiA0KSB7Ci0JIF9tZXNhX3ByaW50ZigiRU9GIGluICVzICglZCBieXRlcylcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKLQkgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKDAgJiYgY21kID09IENNRF8zRF9QUklNKQotCSBkb18zZF9wcmltKHMsIGRhdGEsIGR3b3JkcyAqIDQpOwotICAgICAgZWxzZQotCSBmbHVzaF9jbWRzKHMsIGRhdGEsIGR3b3JkcyAqIDQpOwotCi0gICAgICBkYXRhICs9IGR3b3JkczsKLSAgICAgIGxlbiAtPSBkd29yZHMgKiA0OwotICAgfQotCi0gICByZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIHBhcnNlX2RhdGFfd3JpdGUoIHN0cnVjdCBhdWJfc3RhdGUgKnMsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhdWJfYmxvY2tfaGVhZGVyICpiaCwKLQkJCSAgICAgdm9pZCAqZGVzdCwKLQkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50ICpkYXRhLAotCQkJICAgICBpbnQgbGVuICkKLXsKLSAgIHN3aXRjaCAoYmgtPnR5cGUpIHsKLSAgIGNhc2UgRFdfR0VORVJBTF9TVEFURToKLSAgICAgIHN3aXRjaCAoYmgtPmdlbmVyYWxfc3RhdGVfdHlwZSkgewotICAgICAgY2FzZSBEV0dTX1ZFUlRFWF9TSEFERVJfU1RBVEU6IHsKLQkgc3RydWN0IGJyd192c191bml0X3N0YXRlIHZzOwotCSBhc3NlcnQobGVuID09IHNpemVvZih2cykpOwotCi0JIF9tZXNhX3ByaW50ZigiRFdHU19WRVJURVhfU0hBREVSX1NUQVRFXG4iKTsKLQkgbWVtY3B5KCZ2cywgZGF0YSwgc2l6ZW9mKHZzKSk7Ci0KLS8qIAkgdnMudnM2LnZlcnRfY2FjaGVfZGlzYWJsZSA9IDE7ICAqLwotLyogIAkgdnMudGhyZWFkNC5tYXhfdGhyZWFkcyA9IDQ7ICAqLwotCi0JIG1lbWNweShkZXN0LCAmdnMsIHNpemVvZih2cykpOwotCSByZXR1cm47Ci0gICAgICB9Ci0gICAgICBjYXNlIERXR1NfQ0xJUFBFUl9TVEFURTogewotCSBzdHJ1Y3QgYnJ3X2NsaXBfdW5pdF9zdGF0ZSBjbGlwOwotCSBhc3NlcnQobGVuID09IHNpemVvZihjbGlwKSk7Ci0KLQkgX21lc2FfcHJpbnRmKCJEV0dTX0NMSVBQRVJfU1RBVEVcbiIpOwotCSBtZW1jcHkoJmNsaXAsIGRhdGEsIHNpemVvZihjbGlwKSk7Ci0KLS8qIAkgY2xpcC50aHJlYWQ0Lm1heF90aHJlYWRzID0gMDsgKi8KLS8qICAgCSBjbGlwLmNsaXA1LmNsaXBfbW9kZSA9IEJSV19DTElQTU9ERV9SRUpFQ1RfQUxMOyAgICovCi0KLQkgbWVtY3B5KGRlc3QsICZjbGlwLCBzaXplb2YoY2xpcCkpOwotCSByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRFdHU19OT1RZUEU6Ci0gICAgICBjYXNlIERXR1NfR0VPTUVUUllfU0hBREVSX1NUQVRFOgotICAgICAgY2FzZSBEV0dTX1NUUklQU19GQU5TX1NUQVRFOgotCSBicmVhazsKLQotICAgICAgY2FzZSBEV0dTX1dJTkRPV0VSX0laX1NUQVRFOiB7Ci0JICAgIHN0cnVjdCBicndfd21fdW5pdF9zdGF0ZSB3bTsKLQkgICAgYXNzZXJ0KGxlbiA9PSBzaXplb2Yod20pKTsKLQotCSAgICBfbWVzYV9wcmludGYoIkRXR1NfV0lORE9XRVJfSVpfU1RBVEVcbiIpOwotCSAgICBtZW1jcHkoJndtLCBkYXRhLCBzaXplb2Yod20pKTsKLQotLyogCSAgICB3bS53bTUubWF4X3RocmVhZHMgPSAxMDsgKi8KLQotCSAgICBtZW1jcHkoZGVzdCwgJndtLCBzaXplb2Yod20pKTsKLQkgICAgcmV0dXJuOwotCSB9Ci0KLSAgICAgIGNhc2UgRFdHU19DT0xPUl9DQUxDX1NUQVRFOgotICAgICAgY2FzZSBEV0dTX0NMSVBQRVJfVklFV1BPUlRfU1RBVEU6Ci0gICAgICBjYXNlIERXR1NfU1RSSVBTX0ZBTlNfVklFV1BPUlRfU1RBVEU6Ci0gICAgICBjYXNlIERXR1NfQ09MT1JfQ0FMQ19WSUVXUE9SVF9TVEFURToKLSAgICAgIGNhc2UgRFdHU19TQU1QTEVSX1NUQVRFOgotICAgICAgY2FzZSBEV0dTX0tFUk5FTF9JTlNUUlVDVElPTlM6Ci0gICAgICBjYXNlIERXR1NfU0NSQVRDSF9TUEFDRToKLSAgICAgIGNhc2UgRFdHU19TQU1QTEVSX0RFRkFVTFRfQ09MT1I6Ci0gICAgICBjYXNlIERXR1NfSU5URVJGQUNFX0RFU0NSSVBUT1I6Ci0gICAgICBjYXNlIERXR1NfVkxEX1NUQVRFOgotICAgICAgY2FzZSBEV0dTX1ZGRV9TVEFURToKLSAgICAgIGRlZmF1bHQ6Ci0JIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICBjYXNlIERXX1NVUkZBQ0VfU1RBVEU6Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRFdfMURfTUFQOgotICAgY2FzZSBEV18yRF9NQVA6Ci0gICBjYXNlIERXX0NVQkVfTUFQOgotICAgY2FzZSBEV19WT0xVTUVfTUFQOgotICAgY2FzZSBEV19DT05TVEFOVF9CVUZGRVI6Ci0gICBjYXNlIERXX0NPTlNUQU5UX1VSQl9FTlRSWToKLSAgIGNhc2UgRFdfVkVSVEVYX0JVRkZFUjoKLSAgIGNhc2UgRFdfSU5ERVhfQlVGRkVSOgotICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgfQotCi0gICBtZW1jcHkoZGVzdCwgZGF0YSwgbGVuKTsKLX0KLQotCi0vKiBJbiBvcmRlciB0byB3b3JrLCB0aGUgbWVtb3J5IGxheW91dCBoYXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIFgKLSAqIHNlcnZlciB3aGljaCBjcmVhdGVkIHRoZSBhdWJmaWxlLgotICovCi1zdGF0aWMgaW50IHBhcnNlX2Jsb2NrX2hlYWRlciggc3RydWN0IGF1Yl9zdGF0ZSAqcyApCi17Ci0gICBzdHJ1Y3QgYXViX2Jsb2NrX2hlYWRlciAqYmggPSAoc3RydWN0IGF1Yl9ibG9ja19oZWFkZXIgKikocy0+bWFwICsgcy0+Y3NyKTsKLSAgIHZvaWQgKmRhdGEgPSAodm9pZCAqKShiaCArIDEpOwotICAgdW5zaWduZWQgaW50IGxlbiA9IChiaC0+bGVuZ3RoICsgMykgJiB+MzsKLQotICAgX21lc2FfcHJpbnRmKCJibG9jayBoZWFkZXIgYXQgMHgleFxuIiwgcy0+Y3NyKTsKLQotICAgaWYgKHMtPmNzciArIGxlbiArIHNpemVvZigqYmgpID4gcy0+c3opIHsKLSAgICAgIF9tZXNhX3ByaW50ZigiRU9GIGluIGRhdGEgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgaWYgKGJoLT5hZGRyZXNzX3NwYWNlID09IEFERFJfR1RUKSB7Ci0KLSAgICAgIHN3aXRjaCAoYmgtPm9wZXJhdGlvbikKLSAgICAgIHsKLSAgICAgIGNhc2UgQkhfREFUQV9XUklURTogewotCSB2b2lkICpkZXN0ID0gYm1GaW5kVmlydHVhbCggcy0+aW50ZWwsIGJoLT5hZGRyZXNzLCBsZW4gKTsKLQkgaWYgKGRlc3QgPT0gTlVMTCkgewotCSAgICBfbWVzYV9wcmludGYoIkNvdWxkbid0IGZpbmQgdmlydHVhbCBhZGRyZXNzIGZvciBvZmZzZXQgJXhcbiIsIGJoLT5hZGRyZXNzKTsKLQkgICAgcmV0dXJuIDE7Ci0JIH0KLQotI2lmIDEKLQkgcGFyc2VfZGF0YV93cml0ZShzLCBiaCwgZGVzdCwgZGF0YSwgbGVuKTsKLSNlbHNlCi0JIG1lbWNweShkZXN0LCBkYXRhLCBsZW4pOwotI2VuZGlmCi0JIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCSF9DT01NQU5EX1dSSVRFOgotI2lmIDAKLQkgaW50ZWxfY21kX2lvY3RsKHMtPmludGVsLCAodm9pZCAqKWRhdGEsIGxlbik7Ci0jZWxzZQotCSBpZiAocGFyc2VfY29tbWFuZHMocywgZGF0YSwgbGVuKSAhPSAwKQotCSAgICBfbWVzYV9wcmludGYoInBhcnNlX2NvbW1hbmRzIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBicmVhazsKLSAgICAgIH0KLSAgIH0KLQotICAgcy0+Y3NyICs9IHNpemVvZigqYmgpICsgbGVuOwotICAgcmV0dXJuIDA7Ci19Ci0KLQotI2RlZmluZSBBVUJfRklMRV9IRUFERVIgMHhlMDg1MDAwYgotI2RlZmluZSBBVUJfQkxPQ0tfSEVBREVSIDB4ZTBjMTAwMDMKLSNkZWZpbmUgQVVCX0RVTVBfQk1QIDB4ZTA5ZTAwMDQKLQotaW50IGJyd19wbGF5YmFja19hdWJmaWxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gJmJydy0+aW50ZWw7Ci0gICBzdHJ1Y3QgYXViX3N0YXRlIHN0YXRlOwotICAgc3RydWN0IHN0YXQgc2I7Ci0gICBpbnQgZmQ7Ci0gICBpbnQgcmV0dmFsID0gMDsKLQotICAgc3RhdGUuaW50ZWwgPSBpbnRlbDsKLQotICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7Ci0gICBpZiAoZmQgPCAwKSB7Ci0gICAgICBfbWVzYV9wcmludGYoImNvdWxkbid0IG9wZW4gYXViZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotCi0gICBpZiAoZnN0YXQoZmQsICZzYikgIT0gMCkgewotICAgICAgX21lc2FfcHJpbnRmKCJjb3VsZG4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgc3RhdGUuY3NyID0gMDsKLSAgIHN0YXRlLnN6ID0gc2Iuc3Rfc2l6ZTsKLSAgIHN0YXRlLm1hcCA9IG1tYXAoTlVMTCwgc2Iuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwotICAgCi0gICBpZiAoc3RhdGUubWFwID09IE5VTEwpIHsKLSAgICAgIF9tZXNhX3ByaW50ZigiY291bGRuJ3QgbW1hcCAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOyAKLSAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBjb25mdXNlIGFueXRoaW5nIHRoYXQgbWlnaHQgaGFwcGVuIHRvIGJlCi0gICAgICAgKiBnb2luZyBvbiB3aXRoIHRoZSBoYXJkd2FyZToKLSAgICAgICAqLwotLyogICAgICAgYm1FdmljdEFsbChpbnRlbCk7ICovCi0vKiAgICAgICBpbnRlbC0+dnRibC5sb3N0X2hhcmR3YXJlKGludGVsKTsgKi8KLSAgICAgIAotCi0gICAgICAvKiBSZXBsYXkgdGhlIGF1YmZpbGUgaXRlbSBieSBpdGVtOiAKLSAgICAgICAqLwotICAgICAgd2hpbGUgKHJldHZhbCA9PSAwICYmIAotCSAgICAgc3RhdGUuY3NyICE9IHN0YXRlLnN6KSB7Ci0JIHVuc2lnbmVkIGludCBpbnNuID0gKih1bnNpZ25lZCBpbnQgKikoc3RhdGUubWFwICsgc3RhdGUuY3NyKTsKLQotCSBzd2l0Y2ggKGluc24pIHsKLQkgY2FzZSBBVUJfRklMRV9IRUFERVI6Ci0JICAgIHJldHZhbCA9IGdvYmJsZSgmc3RhdGUsIHNpemVvZihzdHJ1Y3QgYXViX2ZpbGVfaGVhZGVyKSk7Ci0JICAgIGJyZWFrOwotCSAKLQkgY2FzZSBBVUJfQkxPQ0tfSEVBREVSOiAgIAotCSAgICByZXR2YWwgPSBwYXJzZV9ibG9ja19oZWFkZXIoJnN0YXRlKTsKLQkgICAgYnJlYWs7Ci0JIAotCSBjYXNlIEFVQl9EVU1QX0JNUDoKLQkgICAgcmV0dmFsID0gZ29iYmxlKCZzdGF0ZSwgc2l6ZW9mKHN0cnVjdCBhdWJfZHVtcF9ibXApKTsKLQkgICAgYnJlYWs7Ci0JIAotCSBkZWZhdWx0OgotCSAgICBfbWVzYV9wcmludGYoInVua25vd24gaW5zdHJ1Y3Rpb24gJXhcbiIsIGluc24pOwotCSAgICByZXR2YWwgPSAxOwotCSAgICBicmVhazsKLQkgfQotICAgICAgfQotICAgfQotICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKLSAgIHJldHVybiByZXR2YWw7Ci19Ci0KLQotCi0KLQotCi0JCSAgCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jYy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2MuYwppbmRleCA4YTFkMTUyLi5kNjYyY2Y3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jYy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NjLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJtYWNyb3MuaCIKICNpbmNsdWRlICJlbnVtcy5oIgogCi1zdGF0aWMgdm9pZCB1cGxvYWRfY2NfdnAoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfY2NfdnAoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKICAgIHN0cnVjdCBicndfY2Nfdmlld3BvcnQgY2N2OwogCkBAIC00Niw3ICs0Niw4IEBACiAgICBjY3YubWluX2RlcHRoID0gMC4wOwogICAgY2N2Lm1heF9kZXB0aCA9IDEuMDsKIAotICAgYnJ3LT5jYy52cF9nc19vZmZzZXQgPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGVbQlJXX0NDX1ZQXSwgJmNjdiApOworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+Y2MudnBfYm8pOworICAgYnJ3LT5jYy52cF9ibyA9IGJyd19jYWNoZV9kYXRhKCAmYnJ3LT5jYWNoZSwgQlJXX0NDX1ZQLCAmY2N2LCBOVUxMLCAwICk7CiB9CiAKIGNvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfY2NfdnAgPSB7CkBAIC01NSw1NyArNTYsMTQ4IEBACiAgICAgICAuYnJ3ID0gQlJXX05FV19DT05URVhULAogICAgICAgLmNhY2hlID0gMAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfY2NfdnAKKyAgIC5wcmVwYXJlID0gcHJlcGFyZV9jY192cAogfTsKIAorc3RydWN0IGJyd19jY191bml0X2tleSB7CisgICBHTGJvb2xlYW4gc3RlbmNpbCwgc3RlbmNpbF90d29fc2lkZSwgY29sb3JfYmxlbmQsIGFscGhhX2VuYWJsZWQ7CiAKLXN0YXRpYyB2b2lkIHVwbG9hZF9jY191bml0KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCisgICBHTGVudW0gc3RlbmNpbF9mdW5jWzJdLCBzdGVuY2lsX2ZhaWxfb3BbMl07CisgICBHTGVudW0gc3RlbmNpbF9wYXNzX2RlcHRoX2ZhaWxfb3BbMl0sIHN0ZW5jaWxfcGFzc19kZXB0aF9wYXNzX29wWzJdOworICAgR0x1Ynl0ZSBzdGVuY2lsX3JlZlsyXSwgc3RlbmNpbF93cml0ZV9tYXNrWzJdLCBzdGVuY2lsX3Rlc3RfbWFza1syXTsKKyAgIEdMZW51bSBsb2dpY19vcDsKKworICAgR0xlbnVtIGJsZW5kX2VxX3JnYiwgYmxlbmRfZXFfYTsKKyAgIEdMZW51bSBibGVuZF9zcmNfcmdiLCBibGVuZF9zcmNfYTsKKyAgIEdMZW51bSBibGVuZF9kc3RfcmdiLCBibGVuZF9kc3RfYTsKKworICAgR0xlbnVtIGFscGhhX2Z1bmM7CisgICBHTGNsYW1wZiBhbHBoYV9yZWY7CisKKyAgIEdMYm9vbGVhbiBkaXRoZXI7CisKKyAgIEdMYm9vbGVhbiBkZXB0aF90ZXN0LCBkZXB0aF93cml0ZTsKKyAgIEdMZW51bSBkZXB0aF9mdW5jOworfTsKKworc3RhdGljIHZvaWQKK2NjX3VuaXRfcG9wdWxhdGVfa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X2NjX3VuaXRfa2V5ICprZXkpCit7CisgICBzdHJ1Y3QgZ2xfc3RlbmNpbF9hdHRyaWIgKnN0ZW5jaWwgPSBicnctPmF0dHJpYnMuU3RlbmNpbDsKKworICAgbWVtc2V0KGtleSwgMCwgc2l6ZW9mKCprZXkpKTsKKworICAga2V5LT5zdGVuY2lsID0gc3RlbmNpbC0+RW5hYmxlZDsKKyAgIGtleS0+c3RlbmNpbF90d29fc2lkZSA9IHN0ZW5jaWwtPl9UZXN0VHdvU2lkZTsKKworICAgaWYgKGtleS0+c3RlbmNpbCkgeworICAgICAga2V5LT5zdGVuY2lsX2Z1bmNbMF0gPSBzdGVuY2lsLT5GdW5jdGlvblswXTsKKyAgICAgIGtleS0+c3RlbmNpbF9mYWlsX29wWzBdID0gc3RlbmNpbC0+RmFpbEZ1bmNbMF07CisgICAgICBrZXktPnN0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wWzBdID0gc3RlbmNpbC0+WkZhaWxGdW5jWzBdOworICAgICAga2V5LT5zdGVuY2lsX3Bhc3NfZGVwdGhfcGFzc19vcFswXSA9IHN0ZW5jaWwtPlpQYXNzRnVuY1swXTsKKyAgICAgIGtleS0+c3RlbmNpbF9yZWZbMF0gPSBzdGVuY2lsLT5SZWZbMF07CisgICAgICBrZXktPnN0ZW5jaWxfd3JpdGVfbWFza1swXSA9IHN0ZW5jaWwtPldyaXRlTWFza1swXTsKKyAgICAgIGtleS0+c3RlbmNpbF90ZXN0X21hc2tbMF0gPSBzdGVuY2lsLT5WYWx1ZU1hc2tbMF07CisgICB9CisgICBpZiAoa2V5LT5zdGVuY2lsX3R3b19zaWRlKSB7CisgICAgICBrZXktPnN0ZW5jaWxfZnVuY1sxXSA9IHN0ZW5jaWwtPkZ1bmN0aW9uWzFdOworICAgICAga2V5LT5zdGVuY2lsX2ZhaWxfb3BbMV0gPSBzdGVuY2lsLT5GYWlsRnVuY1sxXTsKKyAgICAgIGtleS0+c3RlbmNpbF9wYXNzX2RlcHRoX2ZhaWxfb3BbMV0gPSBzdGVuY2lsLT5aRmFpbEZ1bmNbMV07CisgICAgICBrZXktPnN0ZW5jaWxfcGFzc19kZXB0aF9wYXNzX29wWzFdID0gc3RlbmNpbC0+WlBhc3NGdW5jWzFdOworICAgICAga2V5LT5zdGVuY2lsX3JlZlsxXSA9IHN0ZW5jaWwtPlJlZlsxXTsKKyAgICAgIGtleS0+c3RlbmNpbF93cml0ZV9tYXNrWzFdID0gc3RlbmNpbC0+V3JpdGVNYXNrWzFdOworICAgICAga2V5LT5zdGVuY2lsX3Rlc3RfbWFza1sxXSA9IHN0ZW5jaWwtPlZhbHVlTWFza1sxXTsKKyAgIH0KKworICAgaWYgKGJydy0+YXR0cmlicy5Db2xvci0+X0xvZ2ljT3BFbmFibGVkKQorICAgICAga2V5LT5sb2dpY19vcCA9IGJydy0+YXR0cmlicy5Db2xvci0+TG9naWNPcDsKKyAgIGVsc2UKKyAgICAgIGtleS0+bG9naWNfb3AgPSBHTF9DT1BZOworCisgICBrZXktPmNvbG9yX2JsZW5kID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZEVuYWJsZWQ7CisgICBpZiAoa2V5LT5jb2xvcl9ibGVuZCkgeworICAgICAga2V5LT5ibGVuZF9lcV9yZ2IgPSBicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kRXF1YXRpb25SR0I7CisgICAgICBrZXktPmJsZW5kX2VxX2EgPSBicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kRXF1YXRpb25BOworICAgICAga2V5LT5ibGVuZF9zcmNfcmdiID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZFNyY1JHQjsKKyAgICAgIGtleS0+YmxlbmRfZHN0X3JnYiA9IGJydy0+YXR0cmlicy5Db2xvci0+QmxlbmREc3RSR0I7CisgICAgICBrZXktPmJsZW5kX3NyY19hID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZFNyY0E7CisgICAgICBrZXktPmJsZW5kX2RzdF9hID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZERzdEE7CisgICB9CisKKyAgIGtleS0+YWxwaGFfZW5hYmxlZCA9IGJydy0+YXR0cmlicy5Db2xvci0+QWxwaGFFbmFibGVkOworICAgaWYgKGtleS0+YWxwaGFfZW5hYmxlZCkgeworICAgICAga2V5LT5hbHBoYV9mdW5jID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5BbHBoYUZ1bmM7CisgICAgICBrZXktPmFscGhhX3JlZiA9IGJydy0+YXR0cmlicy5Db2xvci0+QWxwaGFSZWY7CisgICB9CisKKyAgIGtleS0+ZGl0aGVyID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5EaXRoZXJGbGFnOworCisgICBrZXktPmRlcHRoX3Rlc3QgPSBicnctPmF0dHJpYnMuRGVwdGgtPlRlc3Q7CisgICBpZiAoa2V5LT5kZXB0aF90ZXN0KSB7CisgICAgICBrZXktPmRlcHRoX2Z1bmMgPSBicnctPmF0dHJpYnMuRGVwdGgtPkZ1bmM7CisgICAgICBrZXktPmRlcHRoX3dyaXRlID0gYnJ3LT5hdHRyaWJzLkRlcHRoLT5NYXNrOworICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgdGhlIHN0YXRlIGNhY2hlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gQ0MgdW5pdCBrZXkuCisgKi8KK3N0YXRpYyBkcmlfYm8gKgorY2NfdW5pdF9jcmVhdGVfZnJvbV9rZXkoc3RydWN0IGJyd19jb250ZXh0ICpicncsIHN0cnVjdCBicndfY2NfdW5pdF9rZXkgKmtleSkKIHsKICAgIHN0cnVjdCBicndfY2NfdW5pdF9zdGF0ZSBjYzsKLSAgIAorICAgZHJpX2JvICpibzsKKwogICAgbWVtc2V0KCZjYywgMCwgc2l6ZW9mKGNjKSk7CiAKICAgIC8qIF9ORVdfU1RFTkNJTCAqLwotICAgaWYgKGJydy0+YXR0cmlicy5TdGVuY2lsLT5FbmFibGVkKSB7Ci0gICAgICBjYy5jYzAuc3RlbmNpbF9lbmFibGUgPSBicnctPmF0dHJpYnMuU3RlbmNpbC0+RW5hYmxlZDsKLSAgICAgIGNjLmNjMC5zdGVuY2lsX2Z1bmMgPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGJydy0+YXR0cmlicy5TdGVuY2lsLT5GdW5jdGlvblswXSk7Ci0gICAgICBjYy5jYzAuc3RlbmNpbF9mYWlsX29wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPkZhaWxGdW5jWzBdKTsKLSAgICAgIGNjLmNjMC5zdGVuY2lsX3Bhc3NfZGVwdGhfZmFpbF9vcCA9IGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKGJydy0+YXR0cmlicy5TdGVuY2lsLT5aRmFpbEZ1bmNbMF0pOwotICAgICAgY2MuY2MwLnN0ZW5jaWxfcGFzc19kZXB0aF9wYXNzX29wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlpQYXNzRnVuY1swXSk7Ci0gICAgICBjYy5jYzEuc3RlbmNpbF9yZWYgPSBicnctPmF0dHJpYnMuU3RlbmNpbC0+UmVmWzBdOwotICAgICAgY2MuY2MxLnN0ZW5jaWxfd3JpdGVfbWFzayA9IGJydy0+YXR0cmlicy5TdGVuY2lsLT5Xcml0ZU1hc2tbMF07Ci0gICAgICBjYy5jYzEuc3RlbmNpbF90ZXN0X21hc2sgPSBicnctPmF0dHJpYnMuU3RlbmNpbC0+VmFsdWVNYXNrWzBdOworICAgaWYgKGtleS0+c3RlbmNpbCkgeworICAgICAgY2MuY2MwLnN0ZW5jaWxfZW5hYmxlID0gMTsKKyAgICAgIGNjLmNjMC5zdGVuY2lsX2Z1bmMgPQorCSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGtleS0+c3RlbmNpbF9mdW5jWzBdKTsKKyAgICAgIGNjLmNjMC5zdGVuY2lsX2ZhaWxfb3AgPQorCSBpbnRlbF90cmFuc2xhdGVfc3RlbmNpbF9vcChrZXktPnN0ZW5jaWxfZmFpbF9vcFswXSk7CisgICAgICBjYy5jYzAuc3RlbmNpbF9wYXNzX2RlcHRoX2ZhaWxfb3AgPQorCSBpbnRlbF90cmFuc2xhdGVfc3RlbmNpbF9vcChrZXktPnN0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wWzBdKTsKKyAgICAgIGNjLmNjMC5zdGVuY2lsX3Bhc3NfZGVwdGhfcGFzc19vcCA9CisJIGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKGtleS0+c3RlbmNpbF9wYXNzX2RlcHRoX3Bhc3Nfb3BbMF0pOworICAgICAgY2MuY2MxLnN0ZW5jaWxfcmVmID0ga2V5LT5zdGVuY2lsX3JlZlswXTsKKyAgICAgIGNjLmNjMS5zdGVuY2lsX3dyaXRlX21hc2sgPSBrZXktPnN0ZW5jaWxfd3JpdGVfbWFza1swXTsKKyAgICAgIGNjLmNjMS5zdGVuY2lsX3Rlc3RfbWFzayA9IGtleS0+c3RlbmNpbF90ZXN0X21hc2tbMF07CiAKLSAgICAgIGlmIChicnctPmF0dHJpYnMuU3RlbmNpbC0+VGVzdFR3b1NpZGUpIHsKLQkgY2MuY2MwLmJmX3N0ZW5jaWxfZW5hYmxlID0gYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlRlc3RUd29TaWRlOwotCSBjYy5jYzAuYmZfc3RlbmNpbF9mdW5jID0gaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhicnctPmF0dHJpYnMuU3RlbmNpbC0+RnVuY3Rpb25bMV0pOwotCSBjYy5jYzAuYmZfc3RlbmNpbF9mYWlsX29wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPkZhaWxGdW5jWzFdKTsKLQkgY2MuY2MwLmJmX3N0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wID0gaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3AoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlpGYWlsRnVuY1sxXSk7Ci0JIGNjLmNjMC5iZl9zdGVuY2lsX3Bhc3NfZGVwdGhfcGFzc19vcCA9IGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKGJydy0+YXR0cmlicy5TdGVuY2lsLT5aUGFzc0Z1bmNbMV0pOwotCSBjYy5jYzEuYmZfc3RlbmNpbF9yZWYgPSBicnctPmF0dHJpYnMuU3RlbmNpbC0+UmVmWzFdOwotCSBjYy5jYzIuYmZfc3RlbmNpbF93cml0ZV9tYXNrID0gYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPldyaXRlTWFza1sxXTsKLQkgY2MuY2MyLmJmX3N0ZW5jaWxfdGVzdF9tYXNrID0gYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlZhbHVlTWFza1sxXTsKKyAgICAgIGlmIChrZXktPnN0ZW5jaWxfdHdvX3NpZGUpIHsKKwkgY2MuY2MwLmJmX3N0ZW5jaWxfZW5hYmxlID0gMTsKKwkgY2MuY2MwLmJmX3N0ZW5jaWxfZnVuYyA9CisJICAgIGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoa2V5LT5zdGVuY2lsX2Z1bmNbMV0pOworCSBjYy5jYzAuYmZfc3RlbmNpbF9mYWlsX29wID0KKwkgICAgaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3Aoa2V5LT5zdGVuY2lsX2ZhaWxfb3BbMV0pOworCSBjYy5jYzAuYmZfc3RlbmNpbF9wYXNzX2RlcHRoX2ZhaWxfb3AgPQorCSAgICBpbnRlbF90cmFuc2xhdGVfc3RlbmNpbF9vcChrZXktPnN0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wWzFdKTsKKwkgY2MuY2MwLmJmX3N0ZW5jaWxfcGFzc19kZXB0aF9wYXNzX29wID0KKwkgICAgaW50ZWxfdHJhbnNsYXRlX3N0ZW5jaWxfb3Aoa2V5LT5zdGVuY2lsX3Bhc3NfZGVwdGhfcGFzc19vcFsxXSk7CisJIGNjLmNjMS5iZl9zdGVuY2lsX3JlZiA9IGtleS0+c3RlbmNpbF9yZWZbMV07CisJIGNjLmNjMi5iZl9zdGVuY2lsX3dyaXRlX21hc2sgPSBrZXktPnN0ZW5jaWxfd3JpdGVfbWFza1sxXTsKKwkgY2MuY2MyLmJmX3N0ZW5jaWxfdGVzdF9tYXNrID0ga2V5LT5zdGVuY2lsX3Rlc3RfbWFza1sxXTsKICAgICAgIH0KIAogICAgICAgLyogTm90IHJlYWxseSBzdXJlIGFib3V0IHRoaXM6CiAgICAgICAgKi8KLSAgICAgIGlmIChicnctPmF0dHJpYnMuU3RlbmNpbC0+V3JpdGVNYXNrWzBdIHx8Ci0JICAoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlRlc3RUd29TaWRlICYmIGJydy0+YXR0cmlicy5TdGVuY2lsLT5Xcml0ZU1hc2tbMV0pKQorICAgICAgaWYgKGtleS0+c3RlbmNpbF93cml0ZV9tYXNrWzBdIHx8CisJICAoa2V5LT5zdGVuY2lsX3R3b19zaWRlICYmIGtleS0+c3RlbmNpbF93cml0ZV9tYXNrWzFdKSkKIAkgY2MuY2MwLnN0ZW5jaWxfd3JpdGVfZW5hYmxlID0gMTsKICAgIH0KIAogICAgLyogX05FV19DT0xPUiAqLwotICAgaWYgKGJydy0+YXR0cmlicy5Db2xvci0+X0xvZ2ljT3BFbmFibGVkKSB7CisgICBpZiAoa2V5LT5sb2dpY19vcCAhPSBHTF9DT1BZKSB7CiAgICAgICBjYy5jYzIubG9naWNvcF9lbmFibGUgPSAxOwotICAgICAgY2MuY2M1LmxvZ2ljb3BfZnVuYyA9IGludGVsX3RyYW5zbGF0ZV9sb2dpY19vcCggYnJ3LT5hdHRyaWJzLkNvbG9yLT5Mb2dpY09wICk7Ci0gICB9Ci0gICBlbHNlIGlmIChicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kRW5hYmxlZCkgewotICAgICAgR0xlbnVtIGVxUkdCID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZEVxdWF0aW9uUkdCOwotICAgICAgR0xlbnVtIGVxQSA9IGJydy0+YXR0cmlicy5Db2xvci0+QmxlbmRFcXVhdGlvbkE7Ci0gICAgICBHTGVudW0gc3JjUkdCID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZFNyY1JHQjsKLSAgICAgIEdMZW51bSBkc3RSR0IgPSBicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kRHN0UkdCOwotICAgICAgR0xlbnVtIHNyY0EgPSBicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kU3JjQTsKLSAgICAgIEdMZW51bSBkc3RBID0gYnJ3LT5hdHRyaWJzLkNvbG9yLT5CbGVuZERzdEE7CisgICAgICBjYy5jYzUubG9naWNvcF9mdW5jID0gaW50ZWxfdHJhbnNsYXRlX2xvZ2ljX29wKGtleS0+bG9naWNfb3ApOworICAgfSBlbHNlIGlmIChrZXktPmNvbG9yX2JsZW5kKSB7CisgICAgICBHTGVudW0gZXFSR0IgPSBrZXktPmJsZW5kX2VxX3JnYjsKKyAgICAgIEdMZW51bSBlcUEgPSBrZXktPmJsZW5kX2VxX2E7CisgICAgICBHTGVudW0gc3JjUkdCID0ga2V5LT5ibGVuZF9zcmNfcmdiOworICAgICAgR0xlbnVtIGRzdFJHQiA9IGtleS0+YmxlbmRfZHN0X3JnYjsKKyAgICAgIEdMZW51bSBzcmNBID0ga2V5LT5ibGVuZF9zcmNfYTsKKyAgICAgIEdMZW51bSBkc3RBID0ga2V5LT5ibGVuZF9kc3RfYTsKIAogICAgICAgaWYgKGVxUkdCID09IEdMX01JTiB8fCBlcVJHQiA9PSBHTF9NQVgpIHsKIAkgc3JjUkdCID0gZHN0UkdCID0gR0xfT05FOwpAQCAtMTE1LDQ5ICsyMDcsNzggQEAKIAkgc3JjQSA9IGRzdEEgPSBHTF9PTkU7CiAgICAgICB9CiAKLSAgICAgIGNjLmNjNi5kZXN0X2JsZW5kX2ZhY3RvciA9IGJyd190cmFuc2xhdGVfYmxlbmRfZmFjdG9yKGRzdFJHQik7IAotICAgICAgY2MuY2M2LnNyY19ibGVuZF9mYWN0b3IgPSBicndfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvcihzcmNSR0IpOyAKLSAgICAgIGNjLmNjNi5ibGVuZF9mdW5jdGlvbiA9IGJyd190cmFuc2xhdGVfYmxlbmRfZXF1YXRpb24oIGVxUkdCICk7CisgICAgICBjYy5jYzYuZGVzdF9ibGVuZF9mYWN0b3IgPSBicndfdHJhbnNsYXRlX2JsZW5kX2ZhY3Rvcihkc3RSR0IpOworICAgICAgY2MuY2M2LnNyY19ibGVuZF9mYWN0b3IgPSBicndfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvcihzcmNSR0IpOworICAgICAgY2MuY2M2LmJsZW5kX2Z1bmN0aW9uID0gYnJ3X3RyYW5zbGF0ZV9ibGVuZF9lcXVhdGlvbihlcVJHQik7CiAKLSAgICAgIGNjLmNjNS5pYV9kZXN0X2JsZW5kX2ZhY3RvciA9IGJyd190cmFuc2xhdGVfYmxlbmRfZmFjdG9yKGRzdEEpOyAKLSAgICAgIGNjLmNjNS5pYV9zcmNfYmxlbmRfZmFjdG9yID0gYnJ3X3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3Ioc3JjQSk7IAotICAgICAgY2MuY2M1LmlhX2JsZW5kX2Z1bmN0aW9uID0gYnJ3X3RyYW5zbGF0ZV9ibGVuZF9lcXVhdGlvbiggZXFBICk7CisgICAgICBjYy5jYzUuaWFfZGVzdF9ibGVuZF9mYWN0b3IgPSBicndfdHJhbnNsYXRlX2JsZW5kX2ZhY3Rvcihkc3RBKTsKKyAgICAgIGNjLmNjNS5pYV9zcmNfYmxlbmRfZmFjdG9yID0gYnJ3X3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3Ioc3JjQSk7CisgICAgICBjYy5jYzUuaWFfYmxlbmRfZnVuY3Rpb24gPSBicndfdHJhbnNsYXRlX2JsZW5kX2VxdWF0aW9uKGVxQSk7CiAKICAgICAgIGNjLmNjMy5ibGVuZF9lbmFibGUgPSAxOwotICAgICAgY2MuY2MzLmlhX2JsZW5kX2VuYWJsZSA9IChzcmNBICE9IHNyY1JHQiB8fCAKLQkJCQlkc3RBICE9IGRzdFJHQiB8fCAKKyAgICAgIGNjLmNjMy5pYV9ibGVuZF9lbmFibGUgPSAoc3JjQSAhPSBzcmNSR0IgfHwKKwkJCQlkc3RBICE9IGRzdFJHQiB8fAogCQkJCWVxQSAhPSBlcVJHQik7CiAgICB9CiAKLSAgIGlmIChicnctPmF0dHJpYnMuQ29sb3ItPkFscGhhRW5hYmxlZCkgeworICAgaWYgKGtleS0+YWxwaGFfZW5hYmxlZCkgewogICAgICAgY2MuY2MzLmFscGhhX3Rlc3QgPSAxOwotICAgICAgY2MuY2MzLmFscGhhX3Rlc3RfZnVuYyA9IGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoYnJ3LT5hdHRyaWJzLkNvbG9yLT5BbHBoYUZ1bmMpOwotCi0gICAgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2MuY2M3LmFscGhhX3JlZi51YlswXSwgYnJ3LT5hdHRyaWJzLkNvbG9yLT5BbHBoYVJlZik7Ci0KKyAgICAgIGNjLmNjMy5hbHBoYV90ZXN0X2Z1bmMgPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGtleS0+YWxwaGFfZnVuYyk7CiAgICAgICBjYy5jYzMuYWxwaGFfdGVzdF9mb3JtYXQgPSBCUldfQUxQSEFURVNUX0ZPUk1BVF9VTk9STTg7CisKKyAgICAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShjYy5jYzcuYWxwaGFfcmVmLnViWzBdLCBrZXktPmFscGhhX3JlZik7CiAgICB9CiAKLSAgIGlmIChicnctPmF0dHJpYnMuQ29sb3ItPkRpdGhlckZsYWcpIHsKKyAgIGlmIChrZXktPmRpdGhlcikgewogICAgICAgY2MuY2M1LmRpdGhlcl9lbmFibGUgPSAxOwotICAgICAgY2MuY2M2LnlfZGl0aGVyX29mZnNldCA9IDA7IAotICAgICAgY2MuY2M2LnhfZGl0aGVyX29mZnNldCA9IDA7ICAgICAKKyAgICAgIGNjLmNjNi55X2RpdGhlcl9vZmZzZXQgPSAwOworICAgICAgY2MuY2M2LnhfZGl0aGVyX29mZnNldCA9IDA7CiAgICB9CiAKICAgIC8qIF9ORVdfREVQVEggKi8KLSAgIGlmIChicnctPmF0dHJpYnMuRGVwdGgtPlRlc3QpIHsKLSAgICAgIGNjLmNjMi5kZXB0aF90ZXN0ID0gYnJ3LT5hdHRyaWJzLkRlcHRoLT5UZXN0OwotICAgICAgY2MuY2MyLmRlcHRoX3Rlc3RfZnVuY3Rpb24gPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGJydy0+YXR0cmlicy5EZXB0aC0+RnVuYyk7Ci0gICAgICBjYy5jYzIuZGVwdGhfd3JpdGVfZW5hYmxlID0gYnJ3LT5hdHRyaWJzLkRlcHRoLT5NYXNrOworICAgaWYgKGtleS0+ZGVwdGhfdGVzdCkgeworICAgICAgY2MuY2MyLmRlcHRoX3Rlc3QgPSAxOworICAgICAgY2MuY2MyLmRlcHRoX3Rlc3RfZnVuY3Rpb24gPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKGtleS0+ZGVwdGhfZnVuYyk7CisgICAgICBjYy5jYzIuZGVwdGhfd3JpdGVfZW5hYmxlID0ga2V5LT5kZXB0aF93cml0ZTsKICAgIH0KLSAKLSAgIC8qIENBQ0hFX05FV19DQ19WUCAqLwotICAgY2MuY2M0LmNjX3ZpZXdwb3J0X3N0YXRlX29mZnNldCA9ICBicnctPmNjLnZwX2dzX29mZnNldCA+PiA1OwotIAotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVFMpCi0gICAgICBjYy5jYzUuc3RhdGlzdGljc19lbmFibGUgPSAxOyAKIAotICAgYnJ3LT5jYy5zdGF0ZV9nc19vZmZzZXQgPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGVbQlJXX0NDX1VOSVRdLCAmY2MgKTsKKyAgIC8qIENBQ0hFX05FV19DQ19WUCAqLworICAgY2MuY2M0LmNjX3ZpZXdwb3J0X3N0YXRlX29mZnNldCA9IGJydy0+Y2MudnBfYm8tPm9mZnNldCA+PiA1OyAvKiByZWxvYyAqLworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKKyAgICAgIGNjLmNjNS5zdGF0aXN0aWNzX2VuYWJsZSA9IDE7CisKKyAgIGJvID0gYnJ3X3VwbG9hZF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX0NDX1VOSVQsCisJCQkga2V5LCBzaXplb2YoKmtleSksCisJCQkgJmJydy0+Y2MudnBfYm8sIDEsCisJCQkgJmNjLCBzaXplb2YoY2MpLAorCQkJIE5VTEwsIE5VTEwpOworCisgICAvKiBFbWl0IENDIHZpZXdwb3J0IHJlbG9jYXRpb24gKi8KKyAgIGludGVsX2JvX2VtaXRfcmVsb2MoYm8sCisJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sCisJCSAgICAgICAwLAorCQkgICAgICAgMCwKKwkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBicndfY2NfdW5pdF9zdGF0ZSwgY2M0KSwKKwkJICAgICAgIGJydy0+Y2MudnBfYm8pOworCisgICByZXR1cm4gYm87Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfY2NfdW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQoreworICAgc3RydWN0IGJyd19jY191bml0X2tleSBrZXk7CisKKyAgIGNjX3VuaXRfcG9wdWxhdGVfa2V5KGJydywgJmtleSk7CisKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPmNjLnN0YXRlX2JvKTsKKyAgIGJydy0+Y2Muc3RhdGVfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfQ0NfVU5JVCwKKwkJCQkgICAgICAgJmtleSwgc2l6ZW9mKGtleSksCisJCQkJICAgICAgICZicnctPmNjLnZwX2JvLCAxLAorCQkJCSAgICAgICBOVUxMKTsKKworICAgaWYgKGJydy0+Y2Muc3RhdGVfYm8gPT0gTlVMTCkKKyAgICAgIGJydy0+Y2Muc3RhdGVfYm8gPSBjY191bml0X2NyZWF0ZV9mcm9tX2tleShicncsICZrZXkpOwogfQogCiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2NjX3VuaXQgPSB7CkBAIC0xNjYsNyArMjg3LDcgQEAKICAgICAgIC5icncgPSAwLAogICAgICAgLmNhY2hlID0gQ0FDSEVfTkVXX0NDX1ZQCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9jY191bml0CisgICAucHJlcGFyZSA9IHByZXBhcmVfY2NfdW5pdCwKIH07CiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcC5jCmluZGV4IDNiZWMxNTMuLjIyOTgxZmQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXAuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwLmMKQEAgLTYwLDcgKzYwLDcgQEAKICAgIAogICAgLyogQmVnaW4gdGhlIGNvbXBpbGF0aW9uOgogICAgICovCi0gICBicndfaW5pdF9jb21waWxlKCZjLmZ1bmMpOworICAgYnJ3X2luaXRfY29tcGlsZShicncsICZjLmZ1bmMpOwogCiAgICBjLmZ1bmMuc2luZ2xlX3Byb2dyYW1fZmxvdyA9IDE7CiAKQEAgLTExOSwzMSArMTE5LDE5IEBACiAKICAgIC8qIFVwbG9hZAogICAgICovCi0gICBicnctPmNsaXAucHJvZ19nc19vZmZzZXQgPSBicndfdXBsb2FkX2NhY2hlKCAmYnJ3LT5jYWNoZVtCUldfQ0xJUF9QUk9HXSwKLQkJCQkJCSZjLmtleSwKLQkJCQkJCXNpemVvZihjLmtleSksCi0JCQkJCQlwcm9ncmFtLAotCQkJCQkJcHJvZ3JhbV9zaXplLAotCQkJCQkJJmMucHJvZ19kYXRhLAotCQkJCQkJJmJydy0+Y2xpcC5wcm9nX2RhdGEgKTsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPmNsaXAucHJvZ19ibyk7CisgICBicnctPmNsaXAucHJvZ19ibyA9IGJyd191cGxvYWRfY2FjaGUoICZicnctPmNhY2hlLAorCQkJCQkgQlJXX0NMSVBfUFJPRywKKwkJCQkJICZjLmtleSwgc2l6ZW9mKGMua2V5KSwKKwkJCQkJIE5VTEwsIDAsCisJCQkJCSBwcm9ncmFtLCBwcm9ncmFtX3NpemUsCisJCQkJCSAmYy5wcm9nX2RhdGEsCisJCQkJCSAmYnJ3LT5jbGlwLnByb2dfZGF0YSApOwogfQogCi0KLXN0YXRpYyBHTGJvb2xlYW4gc2VhcmNoX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgCi0JCQkgICAgICAgc3RydWN0IGJyd19jbGlwX3Byb2dfa2V5ICprZXkgKQotewotICAgcmV0dXJuIGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGVbQlJXX0NMSVBfUFJPR10sIAotCQkJICAga2V5LCBzaXplb2YoKmtleSksCi0JCQkgICAmYnJ3LT5jbGlwLnByb2dfZGF0YSwKLQkJCSAgICZicnctPmNsaXAucHJvZ19nc19vZmZzZXQpOwotfQotCi0KLQotCiAvKiBDYWxjdWxhdGUgaW50ZXJwb2xhbnRzIGZvciB0cmlhbmdsZSBhbmQgbGluZSByYXN0ZXJpemF0aW9uLgogICovCi1zdGF0aWMgdm9pZCB1cGxvYWRfY2xpcF9wcm9nKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCitzdGF0aWMgdm9pZCB1cGxvYWRfY2xpcF9wcm9nKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgR0xjb250ZXh0ICpjdHggPSAmYnJ3LT5pbnRlbC5jdHg7CiAgICBzdHJ1Y3QgYnJ3X2NsaXBfcHJvZ19rZXkga2V5OwpAQCAtMTgwLDEyICsxNjgsMTAgQEAKIAkgICAgICAgb2Zmc2V0X2Zyb250ID0gMDsKIAkgICAgICAgYnJlYWs7CiAJICAgIGNhc2UgR0xfTElORToKLQkgICAgICAga2V5LmRvX3VuZmlsbGVkID0gMTsKIAkgICAgICAgZmlsbF9mcm9udCA9IENMSVBfTElORTsKIAkgICAgICAgb2Zmc2V0X2Zyb250ID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPk9mZnNldExpbmU7CiAJICAgICAgIGJyZWFrOwogCSAgICBjYXNlIEdMX1BPSU5UOgotCSAgICAgICBrZXkuZG9fdW5maWxsZWQgPSAxOwogCSAgICAgICBmaWxsX2Zyb250ID0gQ0xJUF9QT0lOVDsKIAkgICAgICAgb2Zmc2V0X2Zyb250ID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPk9mZnNldFBvaW50OwogCSAgICAgICBicmVhazsKQEAgLTIwMCwyMiArMTg2LDIzIEBACiAJICAgICAgIG9mZnNldF9iYWNrID0gMDsKIAkgICAgICAgYnJlYWs7CiAJICAgIGNhc2UgR0xfTElORToKLQkgICAgICAga2V5LmRvX3VuZmlsbGVkID0gMTsKIAkgICAgICAgZmlsbF9iYWNrID0gQ0xJUF9MSU5FOwogCSAgICAgICBvZmZzZXRfYmFjayA9IGJydy0+YXR0cmlicy5Qb2x5Z29uLT5PZmZzZXRMaW5lOwogCSAgICAgICBicmVhazsKIAkgICAgY2FzZSBHTF9QT0lOVDoKLQkgICAgICAga2V5LmRvX3VuZmlsbGVkID0gMTsKIAkgICAgICAgZmlsbF9iYWNrID0gQ0xJUF9QT0lOVDsKIAkgICAgICAgb2Zmc2V0X2JhY2sgPSBicnctPmF0dHJpYnMuUG9seWdvbi0+T2Zmc2V0UG9pbnQ7CiAJICAgICAgIGJyZWFrOwogCSAgICB9CiAJIH0KIAotCSAvKiBNb3N0IGNhc2VzIHRoZSBmaXhlZCBmdW5jdGlvbiB1bml0cyB3aWxsIGhhbmRsZS4gIENhc2VzIHdoZXJlCi0JICAqIG9uZSBvciBtb3JlIHBvbHlnb24gZmFjZXMgYXJlIHVuZmlsbGVkIHdpbGwgcmVxdWlyZSBoZWxwOgotCSAgKi8KLQkgaWYgKGtleS5kb191bmZpbGxlZCkgeworCSBpZiAoYnJ3LT5hdHRyaWJzLlBvbHlnb24tPkJhY2tNb2RlICE9IEdMX0ZJTEwgfHwKKwkgICAgIGJydy0+YXR0cmlicy5Qb2x5Z29uLT5Gcm9udE1vZGUgIT0gR0xfRklMTCkgeworCSAgICBrZXkuZG9fdW5maWxsZWQgPSAxOworCisJICAgIC8qIE1vc3QgY2FzZXMgdGhlIGZpeGVkIGZ1bmN0aW9uIHVuaXRzIHdpbGwgaGFuZGxlLiAgQ2FzZXMgd2hlcmUKKwkgICAgICogb25lIG9yIG1vcmUgcG9seWdvbiBmYWNlcyBhcmUgdW5maWxsZWQgd2lsbCByZXF1aXJlIGhlbHA6CisJICAgICAqLwogCSAgICBrZXkuY2xpcF9tb2RlID0gQlJXX0NMSVBNT0RFX0NMSVBfTk9OX1JFSkVDVEVEOwogCiAJICAgIGlmIChvZmZzZXRfYmFjayB8fCBvZmZzZXRfZnJvbnQpIHsKQEAgLTI0OCw3ICsyMzUsMTIgQEAKICAgICAgIH0KICAgIH0KIAotICAgaWYgKCFzZWFyY2hfY2FjaGUoYnJ3LCAma2V5KSkKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPmNsaXAucHJvZ19ibyk7CisgICBicnctPmNsaXAucHJvZ19ibyA9IGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGUsIEJSV19DTElQX1BST0csCisJCQkJCSZrZXksIHNpemVvZihrZXkpLAorCQkJCQlOVUxMLCAwLAorCQkJCQkmYnJ3LT5jbGlwLnByb2dfZGF0YSk7CisgICBpZiAoYnJ3LT5jbGlwLnByb2dfYm8gPT0gTlVMTCkKICAgICAgIGNvbXBpbGVfY2xpcF9wcm9nKCBicncsICZrZXkgKTsKIH0KIApAQCAtMjYyLDUgKzI1NCw1IEBACiAgICAgICAuYnJ3ICAgPSAoQlJXX05FV19SRURVQ0VEX1BSSU1JVElWRSksCiAgICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfVlNfUFJPRwogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfY2xpcF9wcm9nCisgICAucHJlcGFyZSA9IHVwbG9hZF9jbGlwX3Byb2cKIH07CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwLmgKaW5kZXggNDliMjc3MC4uZTA2NzQ3OCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXAuaApAQCAtNDIsNyArNDIsNyBAQAogICogdXAgcG9seWdvbiBvZmZzZXQgYW5kIGZsYXRzaGFkaW5nIGF0IHRoaXMgcG9pbnQ6CiAgKi8KIHN0cnVjdCBicndfY2xpcF9wcm9nX2tleSB7Ci0gICBHTHVpbnQgYXR0cnM6MTY7CQkKKyAgIEdMdWludCBhdHRyczozMjsJCQogICAgR0x1aW50IHByaW1pdGl2ZTo0OwogICAgR0x1aW50IG5yX3VzZXJjbGlwOjM7CiAgICBHTHVpbnQgZG9fZmxhdF9zaGFkaW5nOjE7CkBAIC01MSw3ICs1MSw3IEBACiAgICBHTHVpbnQgZmlsbF9jY3c6MjsJCS8qIGluY2x1ZGVzIGN1bGwgaW5mb3JtYXRpb24gKi8KICAgIEdMdWludCBvZmZzZXRfY3c6MTsKICAgIEdMdWludCBvZmZzZXRfY2N3OjE7Ci0gICBHTHVpbnQgcGFkMDoxOworICAgR0x1aW50IHBhZDA6MTc7CiAKICAgIEdMdWludCBjb3B5X2JmY19jdzoxOwogICAgR0x1aW50IGNvcHlfYmZjX2NjdzoxOwpAQCAtMTY3LDQgKzE2Nyw5IEBACiAKIHZvaWQgYnJ3X2NsaXBfaW5pdF9jbGlwbWFzayggc3RydWN0IGJyd19jbGlwX2NvbXBpbGUgKmMgKTsKIAorc3RydWN0IGJyd19yZWcgZ2V0X3RtcCggc3RydWN0IGJyd19jbGlwX2NvbXBpbGUgKmMgKTsKKwordm9pZCBicndfY2xpcF9wcm9qZWN0X3Bvc2l0aW9uKHN0cnVjdCBicndfY2xpcF9jb21waWxlICpjLAorICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHBvcyApOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfbGluZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF9saW5lLmMKaW5kZXggODMxODIyNy4uMDkzMGU2YSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF9saW5lLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF9saW5lLmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqcGxhbmVfbG9vcDsKICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnBsYW5lX2FjdGl2ZTsKICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmlzX25lZ2F0aXZlOworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaXNfbmVnMjsKICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKm5vdF9jdWxsZWQ7CiAgICBzdHJ1Y3QgYnJ3X3JlZyB2MV9udWxsX3VkID0gcmV0eXBlKHZlYzEoYnJ3X251bGxfcmVnKCkpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CiAKQEAgLTE0Niw2ICsxNDcsMTYgQEAKICAgIGJyd19jbGlwX2luaXRfcGxhbmVzKGMpOwogICAgYnJ3X2NsaXBfaW5pdF9jbGlwbWFzayhjKTsKIAorICAgLyogLXZlIHJodyB3b3JrYXJvdW5kICovCisgICBpZiAoIShCUldfSVNfR000NShwLT5icncpIHx8IEJSV19JU19HNFgocC0+YnJ3KSkpIHsKKyAgICAgIGJyd19zZXRfY29uZGl0aW9uYWxtb2QocCwgQlJXX0NPTkRJVElPTkFMX05aKTsKKyAgICAgIGJyd19BTkQocCwgYnJ3X251bGxfcmVnKCksIGdldF9lbGVtZW50X3VkKGMtPnJlZy5SMCwgMiksCisgICAgICAgICAgICAgIGJyd19pbW1fdWQoMTw8MjApKTsKKyAgICAgIGJyd19PUihwLCBjLT5yZWcucGxhbmVtYXNrLCBjLT5yZWcucGxhbmVtYXNrLCBicndfaW1tX3VkKDB4M2YpKTsKKyAgIH0KKworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworCiAgICBwbGFuZV9sb29wID0gYnJ3X0RPKHAsIEJSV19FWEVDVVRFXzEpOwogICAgewogICAgICAgLyogaWYgKHBsYW5lbWFzayAmIDEpCkBAIC0xODMsMTMgKzE5NCwyMCBAQAogCSAgICAvKiBDb21pbmcgYmFjayBpbi4gIFdlIGtub3cgdGhhdCBib3RoIGNhbm5vdCBiZSBuZWdhdGl2ZQogCSAgICAgKiBiZWNhdXNlIHRoZSBsaW5lIHdvdWxkIGhhdmUgYmVlbiBjdWxsZWQgaW4gdGhhdCBjYXNlLgogCSAgICAgKi8KLQkgICAgYnJ3X0FERChwLCBjLT5yZWcudCwgYy0+cmVnLmRwMCwgbmVnYXRlKGMtPnJlZy5kcDEpKTsKLQkgICAgYnJ3X21hdGhfaW52ZXJ0KHAsIGMtPnJlZy50LCBjLT5yZWcudCk7Ci0JICAgIGJyd19NVUwocCwgYy0+cmVnLnQsIGMtPnJlZy50LCBjLT5yZWcuZHAwKTsKIAotCSAgICBicndfQ01QKHAsIHZlYzEoYnJ3X251bGxfcmVnKCkpLCBCUldfQ09ORElUSU9OQUxfRywgYy0+cmVnLnQsIGMtPnJlZy50MCApOwotCSAgICBicndfTU9WKHAsIGMtPnJlZy50MCwgYy0+cmVnLnQpOwotCSAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisJICAgIC8qIElmIGJvdGggYXJlIHBvc2l0aXZlLCBkbyBub3RoaW5nICovCisgICAgICAgICAgICAgYnJ3X0NNUChwLCB2ZWMxKGJyd19udWxsX3JlZygpKSwgQlJXX0NPTkRJVElPTkFMX0wsIGMtPnJlZy5kcDAsIGJyd19pbW1fZigwLjApKTsKKyAgICAgICAgICAgICBpc19uZWcyID0gYnJ3X0lGKHAsIEJSV19FWEVDVVRFXzEpOworICAgICAgICAgICAgIHsKKwkJYnJ3X0FERChwLCBjLT5yZWcudCwgYy0+cmVnLmRwMCwgbmVnYXRlKGMtPnJlZy5kcDEpKTsKKwkJYnJ3X21hdGhfaW52ZXJ0KHAsIGMtPnJlZy50LCBjLT5yZWcudCk7CisJCWJyd19NVUwocCwgYy0+cmVnLnQsIGMtPnJlZy50LCBjLT5yZWcuZHAwKTsKKworCQlicndfQ01QKHAsIHZlYzEoYnJ3X251bGxfcmVnKCkpLCBCUldfQ09ORElUSU9OQUxfRywgYy0+cmVnLnQsIGMtPnJlZy50MCApOworCQlicndfTU9WKHAsIGMtPnJlZy50MCwgYy0+cmVnLnQpOworCQlicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisJICAgICB9CisJICAgICBicndfRU5ESUYocCwgaXNfbmVnMik7CiAJIH0KIAkgYnJ3X0VORElGKHAsIGlzX25lZ2F0aXZlKTsJIAogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF9zdGF0ZS5jCmluZGV4IDFlNmQ2ZmEuLmFlOTA0YzYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwX3N0YXRlLmMKQEAgLTM0LDUzICszNCwxMTYgQEAKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgogCitzdHJ1Y3QgYnJ3X2NsaXBfdW5pdF9rZXkgeworICAgdW5zaWduZWQgaW50IHRvdGFsX2dyZjsKKyAgIHVuc2lnbmVkIGludCB1cmJfZW50cnlfcmVhZF9sZW5ndGg7CisgICB1bnNpZ25lZCBpbnQgY3VyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIHVuc2lnbmVkIGludCBjbGlwX21vZGU7CiAKKyAgIHVuc2lnbmVkIGludCBjdXJiZV9vZmZzZXQ7CiAKLXN0YXRpYyB2b2lkIHVwbG9hZF9jbGlwX3VuaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKKyAgIHVuc2lnbmVkIGludCBucl91cmJfZW50cmllcywgdXJiX3NpemU7Cit9OworCitzdGF0aWMgdm9pZAorY2xpcF91bml0X3BvcHVsYXRlX2tleShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd19jbGlwX3VuaXRfa2V5ICprZXkpCit7CisgICBtZW1zZXQoa2V5LCAwLCBzaXplb2YoKmtleSkpOworCisgICAvKiBDQUNIRV9ORVdfQ0xJUF9QUk9HICovCisgICBrZXktPnRvdGFsX2dyZiA9IGJydy0+Y2xpcC5wcm9nX2RhdGEtPnRvdGFsX2dyZjsKKyAgIGtleS0+dXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5jbGlwLnByb2dfZGF0YS0+dXJiX3JlYWRfbGVuZ3RoOworICAga2V5LT5jdXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5jbGlwLnByb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aDsKKyAgIGtleS0+Y2xpcF9tb2RlID0gYnJ3LT5jbGlwLnByb2dfZGF0YS0+Y2xpcF9tb2RlOworCisgICAvKiBCUldfTkVXX0NVUkJFX09GRlNFVFMgKi8KKyAgIGtleS0+Y3VyYmVfb2Zmc2V0ID0gYnJ3LT5jdXJiZS5jbGlwX3N0YXJ0OworCisgICAvKiBCUldfTkVXX1VSQl9GRU5DRSAqLworICAga2V5LT5ucl91cmJfZW50cmllcyA9IGJydy0+dXJiLm5yX2NsaXBfZW50cmllczsKKyAgIGtleS0+dXJiX3NpemUgPSBicnctPnVyYi52c2l6ZTsKK30KKworc3RhdGljIGRyaV9ibyAqCitjbGlwX3VuaXRfY3JlYXRlX2Zyb21fa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJICBzdHJ1Y3QgYnJ3X2NsaXBfdW5pdF9rZXkgKmtleSkKIHsKICAgIHN0cnVjdCBicndfY2xpcF91bml0X3N0YXRlIGNsaXA7CisgICBkcmlfYm8gKmJvOwogCiAgICBtZW1zZXQoJmNsaXAsIDAsIHNpemVvZihjbGlwKSk7CiAKLSAgIC8qIENBQ0hFX05FV19DTElQX1BST0cgKi8KLSAgIGNsaXAudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gKChicnctPmNsaXAucHJvZ19kYXRhLT50b3RhbF9ncmYtMSkgJiB+MTUpIC8gMTY7Ci0gICBjbGlwLnRocmVhZDAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSBicnctPmNsaXAucHJvZ19nc19vZmZzZXQgPj4gNjsKLSAgIGNsaXAudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPmNsaXAucHJvZ19kYXRhLT51cmJfcmVhZF9sZW5ndGg7Ci0gICBjbGlwLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5jbGlwLnByb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aDsKLSAgIGNsaXAuY2xpcDUuY2xpcF9tb2RlID0gYnJ3LT5jbGlwLnByb2dfZGF0YS0+Y2xpcF9tb2RlOworICAgY2xpcC50aHJlYWQwLmdyZl9yZWdfY291bnQgPSBBTElHTihrZXktPnRvdGFsX2dyZiwgMTYpIC8gMTYgLSAxOworICAgLyogcmVsb2MgKi8KKyAgIGNsaXAudGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IGJydy0+Y2xpcC5wcm9nX2JvLT5vZmZzZXQgPj4gNjsKIAotICAgLyogQlJXX05FV19DVVJCRV9PRkZTRVRTICovCi0gICBjbGlwLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gYnJ3LT5jdXJiZS5jbGlwX3N0YXJ0ICogMjsKLQotICAgLyogQlJXX05FV19VUkJfRkVOQ0UgKi8KLSAgIGNsaXAudGhyZWFkNC5ucl91cmJfZW50cmllcyA9IGJydy0+dXJiLm5yX2NsaXBfZW50cmllczsgCi0gICBjbGlwLnRocmVhZDQudXJiX2VudHJ5X2FsbG9jYXRpb25fc2l6ZSA9IGJydy0+dXJiLnZzaXplIC0gMTsKLSAgIGNsaXAudGhyZWFkNC5tYXhfdGhyZWFkcyA9IDA7IC8qIEhtbSwgbWF5YmUgdGhlIG1heCBpcyAxIG9yIDIgdGhyZWFkcyAqLwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKLSAgICAgIGNsaXAudGhyZWFkNC5zdGF0c19lbmFibGUgPSAxOyAKLQotICAgLyogQ09OU1RBTlQgKi8KICAgIGNsaXAudGhyZWFkMS5mbG9hdGluZ19wb2ludF9tb2RlID0gQlJXX0ZMT0FUSU5HX1BPSU5UX05PTl9JRUVFXzc1NDsKICAgIGNsaXAudGhyZWFkMS5zaW5nbGVfcHJvZ3JhbV9mbG93ID0gMTsKKworICAgY2xpcC50aHJlYWQzLnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGtleS0+dXJiX2VudHJ5X3JlYWRfbGVuZ3RoOworICAgY2xpcC50aHJlYWQzLmNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGtleS0+Y3VyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIGNsaXAudGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQgPSBrZXktPmN1cmJlX29mZnNldCAqIDI7CiAgICBjbGlwLnRocmVhZDMuZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IDE7CiAgICBjbGlwLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKKworICAgY2xpcC50aHJlYWQ0Lm5yX3VyYl9lbnRyaWVzID0ga2V5LT5ucl91cmJfZW50cmllczsKKyAgIGNsaXAudGhyZWFkNC51cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplID0ga2V5LT51cmJfc2l6ZSAtIDE7CisgICBjbGlwLnRocmVhZDQubWF4X3RocmVhZHMgPSAxOyAvKiAyIHRocmVhZHMgKi8KKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVFMpCisgICAgICBjbGlwLnRocmVhZDQuc3RhdHNfZW5hYmxlID0gMTsKKwogICAgY2xpcC5jbGlwNS51c2VyY2xpcF9lbmFibGVfZmxhZ3MgPSAweDdmOwogICAgY2xpcC5jbGlwNS51c2VyY2xpcF9tdXN0X2NsaXAgPSAxOwogICAgY2xpcC5jbGlwNS5ndWFyZF9iYW5kX2VuYWJsZSA9IDA7CiAgICBjbGlwLmNsaXA1LnZpZXdwb3J0X3pfY2xpcF9lbmFibGUgPSAxOwogICAgY2xpcC5jbGlwNS52aWV3cG9ydF94eV9jbGlwX2VuYWJsZSA9IDE7CiAgICBjbGlwLmNsaXA1LnZlcnRleF9wb3NpdGlvbl9zcGFjZSA9IEJSV19DTElQX05EQ1NQQUNFOwotICAgY2xpcC5jbGlwNS5hcGlfbW9kZSA9IEJSV19DTElQX0FQSV9PR0w7ICAgCisgICBjbGlwLmNsaXA1LmFwaV9tb2RlID0gQlJXX0NMSVBfQVBJX09HTDsKKyAgIGNsaXAuY2xpcDUuY2xpcF9tb2RlID0ga2V5LT5jbGlwX21vZGU7CisKKyAgIGlmIChCUldfSVNfR000NShicncpIHx8IEJSV19JU19HNFgoYnJ3KSkKKyAgICAgIGNsaXAuY2xpcDUubmVnYXRpdmVfd19jbGlwX3Rlc3QgPSAxOworCiAgICBjbGlwLmNsaXA2LmNsaXBwZXJfdmlld3BvcnRfc3RhdGVfcHRyID0gMDsKICAgIGNsaXAudmlld3BvcnRfeG1pbiA9IC0xOwogICAgY2xpcC52aWV3cG9ydF94bWF4ID0gMTsKICAgIGNsaXAudmlld3BvcnRfeW1pbiA9IC0xOwogICAgY2xpcC52aWV3cG9ydF95bWF4ID0gMTsKIAotICAgYnJ3LT5jbGlwLnN0YXRlX2dzX29mZnNldCA9IGJyd19jYWNoZV9kYXRhKCAmYnJ3LT5jYWNoZVtCUldfQ0xJUF9VTklUXSwgJmNsaXAgKTsKKyAgIGJvID0gYnJ3X3VwbG9hZF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX0NMSVBfVU5JVCwKKwkJCSBrZXksIHNpemVvZigqa2V5KSwKKwkJCSAmYnJ3LT5jbGlwLnByb2dfYm8sIDEsCisJCQkgJmNsaXAsIHNpemVvZihjbGlwKSwKKwkJCSBOVUxMLCBOVUxMKTsKKworICAgLyogRW1pdCBjbGlwIHByb2dyYW0gcmVsb2NhdGlvbiAqLworICAgYXNzZXJ0KGJydy0+Y2xpcC5wcm9nX2JvKTsKKyAgIGludGVsX2JvX2VtaXRfcmVsb2MoYm8sCisJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sCisJCSAgICAgICAwLAorCQkgICAgICAgY2xpcC50aHJlYWQwLmdyZl9yZWdfY291bnQgPDwgMSwKKwkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBicndfY2xpcF91bml0X3N0YXRlLCB0aHJlYWQwKSwKKwkJICAgICAgIGJydy0+Y2xpcC5wcm9nX2JvKTsKKworICAgcmV0dXJuIGJvOwogfQogCitzdGF0aWMgdm9pZCB1cGxvYWRfY2xpcF91bml0KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCit7CisgICBzdHJ1Y3QgYnJ3X2NsaXBfdW5pdF9rZXkga2V5OworCisgICBjbGlwX3VuaXRfcG9wdWxhdGVfa2V5KGJydywgJmtleSk7CisKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPmNsaXAuc3RhdGVfYm8pOworICAgYnJ3LT5jbGlwLnN0YXRlX2JvID0gYnJ3X3NlYXJjaF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX0NMSVBfVU5JVCwKKwkJCQkJICZrZXksIHNpemVvZihrZXkpLAorCQkJCQkgJmJydy0+Y2xpcC5wcm9nX2JvLCAxLAorCQkJCQkgTlVMTCk7CisgICBpZiAoYnJ3LT5jbGlwLnN0YXRlX2JvID09IE5VTEwpIHsKKyAgICAgIGJydy0+Y2xpcC5zdGF0ZV9ibyA9IGNsaXBfdW5pdF9jcmVhdGVfZnJvbV9rZXkoYnJ3LCAma2V5KTsKKyAgIH0KK30KIAogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19jbGlwX3VuaXQgPSB7CiAgICAuZGlydHkgPSB7CkBAIC04OSw1ICsxNTIsNSBAQAogCQlCUldfTkVXX1VSQl9GRU5DRSksCiAgICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfQ0xJUF9QUk9HCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9jbGlwX3VuaXQKKyAgIC5wcmVwYXJlID0gdXBsb2FkX2NsaXBfdW5pdCwKIH07CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwX3RyaS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF90cmkuYwppbmRleCBmNjJiMDJjLi4wMDAzOTAxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwX3RyaS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfdHJpLmMKQEAgLTQyLDYgKzQyLDEwIEBACiAjaW5jbHVkZSAiYnJ3X3V0aWwuaCIKICNpbmNsdWRlICJicndfY2xpcC5oIgogCitzdGF0aWMgdm9pZCByZWxlYXNlX3RtcHMoIHN0cnVjdCBicndfY2xpcF9jb21waWxlICpjICkKK3sKKyAgIGMtPmxhc3RfdG1wID0gYy0+Zmlyc3RfdG1wOworfQogCiAKIHZvaWQgYnJ3X2NsaXBfdHJpX2FsbG9jX3JlZ3MoIHN0cnVjdCBicndfY2xpcF9jb21waWxlICpjLCAKQEAgLTc4LDcgKzgyLDcgQEAKICAgIH0KIAogICAgYy0+cmVnLnQgICAgICAgICAgPSBicndfdmVjMV9ncmYoaSwgMCk7Ci0gICBjLT5yZWcubG9vcGNvdW50ICA9IHJldHlwZShicndfdmVjMV9ncmYoaSwgMSksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgIGMtPnJlZy5sb29wY291bnQgID0gcmV0eXBlKGJyd192ZWMxX2dyZihpLCAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCk7CiAgICBjLT5yZWcubnJfdmVydHMgICA9IHJldHlwZShicndfdmVjMV9ncmYoaSwgMiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKICAgIGMtPnJlZy5wbGFuZW1hc2sgID0gcmV0eXBlKGJyd192ZWMxX2dyZihpLCAzKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOwogICAgYy0+cmVnLnBsYW5lX2VxdWF0aW9uID0gYnJ3X3ZlYzRfZ3JmKGksIDQpOwpAQCAtNDM1LDE1ICs0MzksMTAzIEBACiAgICBicndfRU5ESUYocCwgZG9fY2xpcCk7CiB9CiAKK3N0YXRpYyB2b2lkIGJyd19jbGlwX3Rlc3QoIHN0cnVjdCBicndfY2xpcF9jb21waWxlICpjICkKK3sKKyAgICBzdHJ1Y3QgYnJ3X3JlZyB0ID0gcmV0eXBlKGdldF90bXAoYyksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyB0MSA9IHJldHlwZShnZXRfdG1wKGMpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgc3RydWN0IGJyd19yZWcgdDIgPSByZXR5cGUoZ2V0X3RtcChjKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgIHN0cnVjdCBicndfcmVnIHQzID0gcmV0eXBlKGdldF90bXAoYyksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKIAorICAgIHN0cnVjdCBicndfcmVnIHYwID0gZ2V0X3RtcChjKTsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyB2MSA9IGdldF90bXAoYyk7CisgICAgc3RydWN0IGJyd19yZWcgdjIgPSBnZXRfdG1wKGMpOworCisgICAgc3RydWN0IGJyd19pbmRpcmVjdCB2dDAgPSBicndfaW5kaXJlY3QoMCwgMCk7CisgICAgc3RydWN0IGJyd19pbmRpcmVjdCB2dDEgPSBicndfaW5kaXJlY3QoMSwgMCk7CisgICAgc3RydWN0IGJyd19pbmRpcmVjdCB2dDIgPSBicndfaW5kaXJlY3QoMiwgMCk7CisKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKworICAgIGJyd19NT1YocCwgZ2V0X2FkZHJfcmVnKHZ0MCksIGJyd19hZGRyZXNzKGMtPnJlZy52ZXJ0ZXhbMF0pKTsKKyAgICBicndfTU9WKHAsIGdldF9hZGRyX3JlZyh2dDEpLCBicndfYWRkcmVzcyhjLT5yZWcudmVydGV4WzFdKSk7CisgICAgYnJ3X01PVihwLCBnZXRfYWRkcl9yZWcodnQyKSwgYnJ3X2FkZHJlc3MoYy0+cmVnLnZlcnRleFsyXSkpOworICAgIGJyd19NT1YocCwgdjAsIGRlcmVmXzRmKHZ0MCwgYy0+b2Zmc2V0W1ZFUlRfUkVTVUxUX0hQT1NdKSk7CisgICAgYnJ3X01PVihwLCB2MSwgZGVyZWZfNGYodnQxLCBjLT5vZmZzZXRbVkVSVF9SRVNVTFRfSFBPU10pKTsKKyAgICBicndfTU9WKHAsIHYyLCBkZXJlZl80Zih2dDIsIGMtPm9mZnNldFtWRVJUX1JFU1VMVF9IUE9TXSkpOworCisgICAgLyogdGVzdCBuZWFyeiwgeG1pbiwgeW1pbiBwbGFuZSAqLworICAgIGJyd19DTVAocCwgdDEsIEJSV19DT05ESVRJT05BTF9MRSwgbmVnYXRlKHYwKSwgZ2V0X2VsZW1lbnQodjAsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19DTVAocCwgdDIsIEJSV19DT05ESVRJT05BTF9MRSwgbmVnYXRlKHYxKSwgZ2V0X2VsZW1lbnQodjEsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19DTVAocCwgdDMsIEJSV19DT05ESVRJT05BTF9MRSwgbmVnYXRlKHYyKSwgZ2V0X2VsZW1lbnQodjIsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19YT1IocCwgdCwgdDEsIHQyKTsKKyAgICBicndfWE9SKHAsIHQxLCB0MiwgdDMpOworICAgIGJyd19PUihwLCB0LCB0LCB0MSk7CisKKyAgICBicndfQ01QKHAsIGJyd19udWxsX3JlZygpLCBCUldfQ09ORElUSU9OQUxfTlosIAorCSAgICBnZXRfZWxlbWVudCh0LCAwKSwgYnJ3X2ltbV91ZCgwKSk7CisgICAgYnJ3X09SKHAsIGMtPnJlZy5wbGFuZW1hc2ssIGMtPnJlZy5wbGFuZW1hc2ssIGJyd19pbW1fdWQoKDE8PDUpKSk7CisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19DTVAocCwgYnJ3X251bGxfcmVnKCksIEJSV19DT05ESVRJT05BTF9OWiwgCisJICAgIGdldF9lbGVtZW50KHQsIDEpLCBicndfaW1tX3VkKDApKTsKKyAgICBicndfT1IocCwgYy0+cmVnLnBsYW5lbWFzaywgYy0+cmVnLnBsYW5lbWFzaywgYnJ3X2ltbV91ZCgoMTw8MykpKTsKKyAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisgICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX05aLCAKKwkgICAgZ2V0X2VsZW1lbnQodCwgMiksIGJyd19pbW1fdWQoMCkpOworICAgIGJyd19PUihwLCBjLT5yZWcucGxhbmVtYXNrLCBjLT5yZWcucGxhbmVtYXNrLCBicndfaW1tX3VkKCgxPDwxKSkpOworICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKKworICAgIC8qIHRlc3QgZmFyeiwgeG1heCwgeW1heCBwbGFuZSAqLworICAgIGJyd19DTVAocCwgdDEsIEJSV19DT05ESVRJT05BTF9MLCB2MCwgZ2V0X2VsZW1lbnQodjAsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19DTVAocCwgdDIsIEJSV19DT05ESVRJT05BTF9MLCB2MSwgZ2V0X2VsZW1lbnQodjEsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIGJyd19DTVAocCwgdDMsIEJSV19DT05ESVRJT05BTF9MLCB2MiwgZ2V0X2VsZW1lbnQodjIsIDMpKTsgCisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworCisgICAgYnJ3X1hPUihwLCB0LCB0MSwgdDIpOworICAgIGJyd19YT1IocCwgdDEsIHQyLCB0Myk7CisgICAgYnJ3X09SKHAsIHQsIHQsIHQxKTsKKworICAgIGJyd19DTVAocCwgYnJ3X251bGxfcmVnKCksIEJSV19DT05ESVRJT05BTF9OWiwgCisJICAgIGdldF9lbGVtZW50KHQsIDApLCBicndfaW1tX3VkKDApKTsKKyAgICBicndfT1IocCwgYy0+cmVnLnBsYW5lbWFzaywgYy0+cmVnLnBsYW5lbWFzaywgYnJ3X2ltbV91ZCgoMTw8NCkpKTsKKyAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisgICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX05aLCAKKwkgICAgZ2V0X2VsZW1lbnQodCwgMSksIGJyd19pbW1fdWQoMCkpOworICAgIGJyd19PUihwLCBjLT5yZWcucGxhbmVtYXNrLCBjLT5yZWcucGxhbmVtYXNrLCBicndfaW1tX3VkKCgxPDwyKSkpOworICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKKyAgICBicndfQ01QKHAsIGJyd19udWxsX3JlZygpLCBCUldfQ09ORElUSU9OQUxfTlosIAorCSAgICBnZXRfZWxlbWVudCh0LCAyKSwgYnJ3X2ltbV91ZCgwKSk7CisgICAgYnJ3X09SKHAsIGMtPnJlZy5wbGFuZW1hc2ssIGMtPnJlZy5wbGFuZW1hc2ssIGJyd19pbW1fdWQoKDE8PDApKSk7CisgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworCisgICAgcmVsZWFzZV90bXBzKGMpOworfQogCiAKIHZvaWQgYnJ3X2VtaXRfdHJpX2NsaXAoIHN0cnVjdCBicndfY2xpcF9jb21waWxlICpjICkKIHsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKm5lZ19yaHc7CisgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKICAgIGJyd19jbGlwX3RyaV9hbGxvY19yZWdzKGMsIDMgKyBjLT5rZXkubnJfdXNlcmNsaXAgKyA2KTsKICAgIGJyd19jbGlwX3RyaV9pbml0X3ZlcnRpY2VzKGMpOwogICAgYnJ3X2NsaXBfaW5pdF9jbGlwbWFzayhjKTsKIAorICAgLyogaWYgLXZlIHJodyB3b3JrYXJvdW5kIGJpdCBpcyBzZXQsIAorICAgICAgZG8gY2xpcHRlc3QgKi8KKyAgIGlmICghKEJSV19JU19HTTQ1KHAtPmJydykgfHwgQlJXX0lTX0c0WChwLT5icncpKSkgeworICAgICAgYnJ3X3NldF9jb25kaXRpb25hbG1vZChwLCBCUldfQ09ORElUSU9OQUxfTlopOworICAgICAgYnJ3X0FORChwLCBicndfbnVsbF9yZWcoKSwgZ2V0X2VsZW1lbnRfdWQoYy0+cmVnLlIwLCAyKSwgCisgICAgICAgICAgICAgIGJyd19pbW1fdWQoMTw8MjApKTsKKyAgICAgIG5lZ19yaHcgPSBicndfSUYocCwgQlJXX0VYRUNVVEVfMSk7IAorICAgICAgeworICAgICAgICAgYnJ3X2NsaXBfdGVzdChjKTsKKyAgICAgIH0KKyAgICAgIGJyd19FTkRJRihwLCBuZWdfcmh3KTsKKyAgIH0KICAgIC8qIENhbid0IHB1c2ggaW50byBkb19jbGlwX3RyaSBiZWNhdXNlIHdpdGggcG9seWdvbiAob3IgcXVhZCkKICAgICAqIGZsYXRzaGFkaW5nLCBuZWVkIHRvIGFwcGx5IHRoZSBmbGF0c2hhZGUgaGVyZSBiZWNhdXNlIHdlIGRvbid0CiAgICAgKiByZXNwZWN0IHRoZSBQViB3aGVuIGNvbnZlcnRpbmcgdG8gdHJpZmFuIGZvciBlbWl0OgpAQCAtNDYyLDYgKzU1NCwzIEBACiAgICAgKi8KICAgIGJyd19jbGlwX2tpbGxfdGhyZWFkKGMpOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF91bmZpbGxlZC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY2xpcF91bmZpbGxlZC5jCmluZGV4IDkxOGUwMDAuLjZmMjBkNzkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfdW5maWxsZWQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwX3VuZmlsbGVkLmMKQEAgLTU4LDEwICs1OCwzMCBAQAogICAgc3RydWN0IGJyd19yZWcgdjIgPSBieXRlX29mZnNldChjLT5yZWcudmVydGV4WzJdLCBjLT5vZmZzZXRbVkVSVF9SRVNVTFRfSFBPU10pOyAKIAogCisgICBzdHJ1Y3QgYnJ3X3JlZyB2MG4gPSBnZXRfdG1wKGMpOworICAgc3RydWN0IGJyd19yZWcgdjFuID0gZ2V0X3RtcChjKTsKKyAgIHN0cnVjdCBicndfcmVnIHYybiA9IGdldF90bXAoYyk7CisKKyAgIC8qIENvbnZlcnQgdG8gTkRDLgorICAgICogTk9URTogV2UgY2FuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCB2ZXJ0ZXggY29vcmRpbmF0ZXMsCisgICAgKiBhcyBpdCBtYXkgaW1wYWN0IGZ1cnRoZXIgb3BlcmF0aW9ucy4KKyAgICAqIFNvLCB3ZSBoYXZlIHRvIGtlZXAgbm9ybWFsaXplZCBjb29yZGluYXRlcyBpbiB0ZW1wIHJlZ2lzdGVycy4KKyAgICAqCisgICAgKiBUQkQtS0MKKyAgICAqIFRyeSB0byBvcHRpbWl6ZSB1bm5lY2Vzc2FyeSBNT1Yncy4KKyAgICAqLworICAgYnJ3X01PVihwLCB2MG4sIHYwKTsKKyAgIGJyd19NT1YocCwgdjFuLCB2MSk7CisgICBicndfTU9WKHAsIHYybiwgdjIpOworCisgICBicndfY2xpcF9wcm9qZWN0X3Bvc2l0aW9uKGMsIHYwbik7CisgICBicndfY2xpcF9wcm9qZWN0X3Bvc2l0aW9uKGMsIHYxbik7CisgICBicndfY2xpcF9wcm9qZWN0X3Bvc2l0aW9uKGMsIHYybik7CisKICAgIC8qIENhbGN1bGF0ZSB0aGUgdmVjdG9ycyBvZiB0d28gZWRnZXMgb2YgdGhlIHRyaWFuZ2xlOgogICAgICovCi0gICBicndfQUREKHAsIGUsIHYwLCBuZWdhdGUodjIpKTsgCi0gICBicndfQUREKHAsIGYsIHYxLCBuZWdhdGUodjIpKTsgCisgICBicndfQUREKHAsIGUsIHYwbiwgbmVnYXRlKHYybikpOyAKKyAgIGJyd19BREQocCwgZiwgdjFuLCBuZWdhdGUodjJuKSk7IAogCiAgICAvKiBUYWtlIHRoZWlyIGNyb3NzcHJvZHVjdDoKICAgICAqLwpAQCAtMjIwLDggKzI0MCw4IEBACiAJCQkgIHN0cnVjdCBicndfaW5kaXJlY3QgdmVydCApCiB7CiAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKLSAgIHN0cnVjdCBicndfcmVnIHBvcyA9IGRlcmVmXzRmKHZlcnQsIGMtPm9mZnNldFtWRVJUX1JFU1VMVF9IUE9TXSk7Ci0gICBzdHJ1Y3QgYnJ3X3JlZyB6ID0gZ2V0X2VsZW1lbnQocG9zLCAyKTsKKyAgIHN0cnVjdCBicndfcmVnIHogPSBkZXJlZl8xZih2ZXJ0LCBjLT5oZWFkZXJfcG9zaXRpb25fb2Zmc2V0ICsKKwkJCSAgICAgICAyICogdHlwZV9zeihCUldfUkVHSVNURVJfVFlQRV9GKSk7CiAKICAgIGJyd19BREQocCwgeiwgeiwgdmVjMShjLT5yZWcub2Zmc2V0KSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jbGlwX3V0aWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfdXRpbC5jCmluZGV4IDE5YmVmMTkuLmMzMmJkNGUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfdXRpbC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NsaXBfdXRpbC5jCkBAIC00Niw4ICs0Niw3IEBACiAKIAogCi0KLXN0YXRpYyBzdHJ1Y3QgYnJ3X3JlZyBnZXRfdG1wKCBzdHJ1Y3QgYnJ3X2NsaXBfY29tcGlsZSAqYyApCitzdHJ1Y3QgYnJ3X3JlZyBnZXRfdG1wKCBzdHJ1Y3QgYnJ3X2NsaXBfY29tcGlsZSAqYyApCiB7CiAgICBzdHJ1Y3QgYnJ3X3JlZyB0bXAgPSBicndfdmVjNF9ncmYoYy0+bGFzdF90bXAsIDApOwogCkBAIC05MCw3ICs4OSw3IEBACiAKIC8qIFByb2plY3QgJ3BvcycgdG8gc2NyZWVuIHNwYWNlIChvciBiYWNrIGFnYWluKSwgb3ZlcndyaXRlIHdpdGggcmVzdWx0czoKICAqLwotc3RhdGljIHZvaWQgYnJ3X2NsaXBfcHJvamVjdF9wb3NpdGlvbihzdHJ1Y3QgYnJ3X2NsaXBfY29tcGlsZSAqYywgc3RydWN0IGJyd19yZWcgcG9zICkKK3ZvaWQgYnJ3X2NsaXBfcHJvamVjdF9wb3NpdGlvbihzdHJ1Y3QgYnJ3X2NsaXBfY29tcGlsZSAqYywgc3RydWN0IGJyd19yZWcgcG9zICkKIHsKICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOwogCkBAIC0yNjIsNyArMjYxLDcgQEAKIAkJIGMtPnJlZy5SMCwKIAkJIDAsCQkvKiBhbGxvY2F0ZSAqLwogCQkgMCwJCS8qIHVzZWQgKi8KLQkJIDAsIAkJLyogbXNnIGxlbiAqLworCQkgMSwgCQkvKiBtc2cgbGVuICovCiAJCSAwLCAJCS8qIHJlc3BvbnNlIGxlbiAqLwogCQkgMSwgCQkvKiBlb3QgKi8KIAkJIDEsCQkvKiB3cml0ZXMgY29tcGxldGUgKi8KQEAgLTI3Miw2ICsyNzEsNyBAQAogCiAKIAorCiBzdHJ1Y3QgYnJ3X3JlZyBicndfY2xpcF9wbGFuZTBfYWRkcmVzcyggc3RydWN0IGJyd19jbGlwX2NvbXBpbGUgKmMgKQogewogICAgcmV0dXJuIGJyd19hZGRyZXNzKGMtPnJlZy5maXhlZF9wbGFuZXMpOwpAQCAtMzI3LDggKzMyNyw3IEBACiAgICAKICAgIC8qIFNoaWZ0IHNvIHRoYXQgbG93ZXN0IG91dGNvZGUgYml0IGlzIHJpZ2h0bW9zdDogCiAgICAgKi8KLSAgIGJyd19NT1YocCwgYy0+cmVnLnBsYW5lbWFzaywgaW5jb21pbmcpOwotICAgYnJ3X1NIUihwLCBjLT5yZWcucGxhbmVtYXNrLCBjLT5yZWcucGxhbmVtYXNrLCBicndfaW1tX3VkKDI2KSk7CisgICBicndfU0hSKHAsIGMtPnJlZy5wbGFuZW1hc2ssIGluY29taW5nLCBicndfaW1tX3VkKDI2KSk7CiAKICAgIGlmIChjLT5rZXkubnJfdXNlcmNsaXApIHsKICAgICAgIHN0cnVjdCBicndfcmVnIHRtcCA9IHJldHlwZSh2ZWMxKGdldF90bXAoYykpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CkBAIC0zNDIsMTMgKzM0MSw1IEBACiAgICAgICAKICAgICAgIHJlbGVhc2VfdG1wKGMsIHRtcCk7CiAgICB9Ci0KLSAgIC8qIFRlc3QgZm9yIC12ZSByaHcgd29ya2Fyb3VuZCAKLSAgICAqLwotICAgYnJ3X3NldF9jb25kaXRpb25hbG1vZChwLCBCUldfQ09ORElUSU9OQUxfTlopOwotICAgYnJ3X0FORChwLCB2ZWMxKGJyd19udWxsX3JlZygpKSwgaW5jb21pbmcsIGJyd19pbW1fdWQoMTw8MjApKTsKLSAgIGJyd19PUihwLCBjLT5yZWcucGxhbmVtYXNrLCBjLT5yZWcucGxhbmVtYXNrLCBicndfaW1tX3VkKDB4M2YpKTsKLSAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKLQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jb250ZXh0LmMKaW5kZXggMzk3YTliZC4uYjRlMjYxOSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NvbnRleHQuYwpAQCAtMzEsNyArMzEsNiBAQAogCiAKICNpbmNsdWRlICJicndfY29udGV4dC5oIgotI2luY2x1ZGUgImJyd19hdWIuaCIKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgImJyd19kcmF3LmgiCiAjaW5jbHVkZSAiYnJ3X3ZzLmgiCkBAIC0zOSwzMyArMzgsMzUgQEAKICNpbmNsdWRlICJpbnRlbF90ZXguaCIKICNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9waXhlbC5oIgorI2luY2x1ZGUgImludGVsX3NwYW4uaCIKKyNpbmNsdWRlICJ0bmwvdF9waXBlbGluZS5oIgogCiAjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJhcGlfbm9vcC5oIgogI2luY2x1ZGUgInZ0eGZtdC5oIgogCisjaW5jbHVkZSAic2hhZGVyL3NoYWRlcl9hcGkuaCIKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWVzYSdzIERyaXZlciBGdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBicndfZXh0ZW5zaW9uc1tdID0KK3N0YXRpYyB2b2lkIGJyd1VzZVByb2dyYW0oR0xjb250ZXh0ICpjdHgsIEdMdWludCBwcm9ncmFtKQogewotICAgIHsgIkdMX0FSQl9kZXB0aF90ZXh0dXJlIiwgICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3NoYWRvdyIsICAgICAgICAgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0VYVF9zaGFkb3dfZnVuY3MiLCAgICAgICAgICAgICAgIE5VTEwgfSwKLSAgICAvKiBBUkIgZXh0biB3b24ndCB3b3JrIGlmIG5vdCBlbmFibGVkICovCi0gICAgeyAiR0xfU0dJWF9kZXB0aF90ZXh0dXJlIiwgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciIsICAgICAgIE5VTEwgfSwKLSAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH0KLX07CisgICBfbWVzYV91c2VfcHJvZ3JhbShjdHgsIHByb2dyYW0pOworfQogCi0KK3N0YXRpYyB2b2lkIGJyd0luaXRQcm9nRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKK3sKKyAgIGZ1bmN0aW9ucy0+VXNlUHJvZ3JhbSA9IGJyd1VzZVByb2dyYW07Cit9CiBzdGF0aWMgdm9pZCBicndJbml0RHJpdmVyRnVuY3Rpb25zKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCiB7CiAgICBpbnRlbEluaXREcml2ZXJGdW5jdGlvbnMoIGZ1bmN0aW9ucyApOwotICAgYnJ3SW5pdFRleHR1cmVGdW5jcyggZnVuY3Rpb25zICk7CisKICAgIGJyd0luaXRGcmFnUHJvZ0Z1bmNzKCBmdW5jdGlvbnMgKTsKKyAgIGJyd0luaXRQcm9nRnVuY3MoIGZ1bmN0aW9ucyApOwogfQogCiAKQEAgLTExNiwxMCArMTE3LDE1IEBACiAgICAgICByZXR1cm4gR0xfRkFMU0U7CiAgICB9CiAKKyAgIC8qIEluaXRpYWxpemUgc3dyYXN0LCB0bmwgZHJpdmVyIHRhYmxlczogKi8KKyAgIGludGVsSW5pdFNwYW5GdW5jcyhjdHgpOworCisgICBUTkxfQ09OVEVYVChjdHgpLT5Ecml2ZXIuUnVuUGlwZWxpbmUgPSBfdG5sX3J1bl9waXBlbGluZTsKKwogICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHMgPSBCUldfTUFYX1RFWF9VTklUOwogICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IEJSV19NQVhfVEVYX1VOSVQ7CiAgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzID0gQlJXX01BWF9URVhfVU5JVDsKLQorICAgY3R4LT5Db25zdC5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyA9IDA7IC8qIG5vIHZlcnRleCBzaGFkZXIgdGV4dHVyZXMgKi8KIAogICAgLyogQWR2ZXJ0aXNlIHRoZSBmdWxsIGhhcmR3YXJlIGNhcGFiaWxpdGllcy4gIFRoZSBuZXcgbWVtb3J5CiAgICAgKiBtYW5hZ2VyIHNob3VsZCBjb3BlIG11Y2ggYmV0dGVyIHdpdGggb3ZlcmxvYWQgc2l0dWF0aW9uczoKQEAgLTEyOCwxNSArMTM0LDkgQEAKICAgIGN0eC0+Q29uc3QuTWF4M0RUZXh0dXJlTGV2ZWxzID0gOTsKICAgIGN0eC0+Q29uc3QuTWF4Q3ViZVRleHR1cmVMZXZlbHMgPSAxMjsKICAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZVJlY3RTaXplID0gKDE8PDExKTsKLSAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzID0gQlJXX01BWF9URVhfVU5JVDsKICAgIAogLyogICAgY3R4LT5Db25zdC5NYXhOYXRpdmVWZXJ0ZXhQcm9ncmFtVGVtcHMgPSAzMjsgKi8KIAotCi0gICBkcmlJbml0RXh0ZW5zaW9ucyggY3R4LCBicndfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLQotICAgYnJ3X2F1Yl9pbml0KCBicncgKTsKLQogICAgYnJ3X2luaXRfYXR0cmlicyggYnJ3ICk7CiAgICBicndfaW5pdF9tZXRhb3BzKCBicncgKTsKICAgIGJyd19pbml0X3N0YXRlKCBicncgKTsKQEAgLTE0NCw4ICsxNDQsNiBAQAogICAgYnJ3LT5zdGF0ZS5kaXJ0eS5tZXNhID0gfjA7CiAgICBicnctPnN0YXRlLmRpcnR5LmJydyA9IH4wOwogCi0gICBtZW1zZXQoJmJydy0+d20uYmluZCwgfjAsIHNpemVvZihicnctPndtLmJpbmQpKTsKLQogICAgYnJ3LT5lbWl0X3N0YXRlX2Fsd2F5cyA9IDA7CiAKICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9NYWludGFpblRleEVudlByb2dyYW0gPSAxOwpAQCAtMTU0LDE2ICsxNTIsNiBAQAogCiAgICBicndfUHJvZ3JhbUNhY2hlSW5pdCggY3R4ICk7CiAKLSAgIGJyd19GcmFtZUJ1ZmZlclRleEluaXQoIGJydyApOwotCi0gICB7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGdldGVudigiSU5URUxfUkVQTEFZIik7Ci0gICAgICBpZiAoZmlsZW5hbWUpIHsKLQkgYnJ3X3BsYXliYWNrX2F1YmZpbGUoYnJ3LCBmaWxlbmFtZSk7Ci0JIGV4aXQoMCk7Ci0gICAgICB9Ci0gICB9Ci0KICAgIHJldHVybiBHTF9UUlVFOwogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jb250ZXh0LmgKaW5kZXggMDhmZGM1NC4uMzMwZDU3MSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2NvbnRleHQuaApAQCAtMTM1LDEzICsxMzUsMjUgQEAKICNkZWZpbmUgQlJXX05FV19NRVRBT1BTICAgICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgQlJXX05FV19GRU5DRSAgICAgICAgICAgICAgICAgICAweDIwMDAKICNkZWZpbmUgQlJXX05FV19MT0NLICAgICAgICAgICAgICAgICAgICAweDQwMDAKLQotCisjZGVmaW5lIEJSV19ORVdfSU5ESUNFUwkJCTB4ODAwMAorI2RlZmluZSBCUldfTkVXX1ZFUlRJQ0VTCQkweDEwMDAwCisvKioKKyAqIFVzZWQgZm9yIGFueSBiYXRjaCBlbnRyeSB3aXRoIGEgcmVsb2NhdGVkIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHVzZWQKKyAqIGJ5IGFueSAzRCByZW5kZXJpbmcuCisgKi8KKyNkZWZpbmUgQlJXX05FV19CQVRDSAkJCTB4ODAwMAorLyoqIGJydy0+ZGVwdGhfcmVnaW9uIHVwZGF0ZWQgKi8KKyNkZWZpbmUgQlJXX05FV19ERVBUSF9CVUZGRVIJCTB4MTAwMDAKIAogc3RydWN0IGJyd19zdGF0ZV9mbGFncyB7CisgICAvKiogU3RhdGUgdXBkYXRlIGZsYWdzIHNpZ25hbGxlZCBieSBtZXNhIGludGVybmFscyAqLwogICAgR0x1aW50IG1lc2E7Ci0gICBHTHVpbnQgY2FjaGU7CisgICAvKioKKyAgICAqIFN0YXRlIHVwZGF0ZSBmbGFncyBzaWduYWxsZWQgYXMgdGhlIHJlc3VsdCBvZiBicndfdHJhY2tlZF9zdGF0ZSB1cGRhdGVzCisgICAgKi8KICAgIEdMdWludCBicnc7CisgICAvKiogU3RhdGUgdXBkYXRlIGZsYWdzIHNpZ25hbGxlZCBieSBicndfc3RhdGVfY2FjaGUuYyBzZWFyY2hlcyAqLworICAgR0x1aW50IGNhY2hlOwogfTsKIAogc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSB7CkBAIC0yMzAsMzIgKzI0Miw0NiBAQAogCiAKICNkZWZpbmUgQlJXX01BWF9URVhfVU5JVCA4Ci0jZGVmaW5lIEJSV19XTV9NQVhfU1VSRiBCUldfTUFYX1RFWF9VTklUICsgMQorI2RlZmluZSBCUldfV01fTUFYX1NVUkYgQlJXX01BWF9URVhfVU5JVCArIE1BWF9EUkFXX0JVRkZFUlMKIAotLyogQ3JlYXRlIGEgZml4ZWQgc2l6ZWQgc3RydWN0IGZvciBjYWNoaW5nIGJpbmRpbmcgdGFibGVzOgotICovCi1zdHJ1Y3QgYnJ3X3N1cmZhY2VfYmluZGluZ190YWJsZSB7Ci0gICBHTHVpbnQgc3VyZl9zc19vZmZzZXRbQlJXX1dNX01BWF9TVVJGXTsKLX07CitlbnVtIGJyd19jYWNoZV9pZCB7CisgICBCUldfQ0NfVlAsCisgICBCUldfQ0NfVU5JVCwKKyAgIEJSV19XTV9QUk9HLAorICAgQlJXX1NBTVBMRVJfREVGQVVMVF9DT0xPUiwKKyAgIEJSV19TQU1QTEVSLAorICAgQlJXX1dNX1VOSVQsCisgICBCUldfU0ZfUFJPRywKKyAgIEJSV19TRl9WUCwKKyAgIEJSV19TRl9VTklULAorICAgQlJXX1ZTX1VOSVQsCisgICBCUldfVlNfUFJPRywKKyAgIEJSV19HU19VTklULAorICAgQlJXX0dTX1BST0csCisgICBCUldfQ0xJUF9WUCwKKyAgIEJSV19DTElQX1VOSVQsCisgICBCUldfQ0xJUF9QUk9HLAorICAgQlJXX1NTX1NVUkZBQ0UsCisgICBCUldfU1NfU1VSRl9CSU5ELAogCi0KLXN0cnVjdCBicndfY2FjaGU7Ci0KLXN0cnVjdCBicndfbWVtX3Bvb2wgewotICAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyOwotCi0gICBHTHVpbnQgc2l6ZTsKLSAgIEdMdWludCBvZmZzZXQ7CQkvKiBvZmZzZXQgb2YgZmlyc3QgZnJlZSBieXRlICovCi0KLSAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3OworICAgQlJXX01BWF9DQUNIRQogfTsKIAogc3RydWN0IGJyd19jYWNoZV9pdGVtIHsKKyAgIC8qKgorICAgICogRWZmZWN0aXZlbHkgcGFydCBvZiB0aGUga2V5LCBjYWNoZV9pZCBpZGVudGlmaWVzIHdoYXQga2luZCBvZiBzdGF0ZQorICAgICogYnVmZmVyIGlzIGludm9sdmVkLCBhbmQgYWxzbyB3aGljaCBicnctPnN0YXRlLmRpcnR5LmNhY2hlIGZsYWcgc2hvdWxkCisgICAgKiBiZSBzZXQgd2hlbiB0aGlzIGNhY2hlIGl0ZW0gaXMgY2hvc2VuLgorICAgICovCisgICBlbnVtIGJyd19jYWNoZV9pZCBjYWNoZV9pZDsKKyAgIC8qKiAzMi1iaXQgaGFzaCBvZiB0aGUga2V5IGRhdGEgKi8KICAgIEdMdWludCBoYXNoOwogICAgR0x1aW50IGtleV9zaXplOwkJLyogZm9yIHZhcmlhYmxlLXNpemVkIGtleXMgKi8KICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgIGRyaV9ibyAqKnJlbG9jX2J1ZnM7CisgICBHTHVpbnQgbnJfcmVsb2NfYnVmczsKIAotICAgR0x1aW50IG9mZnNldDsJCS8qIG9mZnNldCB3aXRoaW4gcG9vbCdzIGJ1ZmZlciAqLworICAgZHJpX2JvICpibzsKICAgIEdMdWludCBkYXRhX3NpemU7CiAKICAgIHN0cnVjdCBicndfY2FjaGVfaXRlbSAqbmV4dDsKQEAgLTI2NCwyMyArMjkwLDE5IEBACiAKIAogc3RydWN0IGJyd19jYWNoZSB7Ci0gICBHTHVpbnQgaWQ7Ci0KLSAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3OwotICAgc3RydWN0IGJyd19tZW1fcG9vbCAqcG9vbDsKIAogICAgc3RydWN0IGJyd19jYWNoZV9pdGVtICoqaXRlbXM7CiAgICBHTHVpbnQgc2l6ZSwgbl9pdGVtczsKLSAgIAotICAgR0x1aW50IGtleV9zaXplOwkJLyogZm9yIGZpeGVkLXNpemUga2V5cyAqLwotICAgR0x1aW50IGF1eF9zaXplOwogCi0gICBHTHVpbnQgYXViX3R5cGU7Ci0gICBHTHVpbnQgYXViX3N1Yl90eXBlOwotICAgCi0gICBHTHVpbnQgbGFzdF9hZGRyOwkJCS8qIG9mZnNldCBvZiBhY3RpdmUgaXRlbSAqLworICAgR0x1aW50IGtleV9zaXplW0JSV19NQVhfQ0FDSEVdOwkJLyogZm9yIGZpeGVkLXNpemUga2V5cyAqLworICAgR0x1aW50IGF1eF9zaXplW0JSV19NQVhfQ0FDSEVdOworICAgY2hhciAqbmFtZVtCUldfTUFYX0NBQ0hFXTsKKworICAgLyogUmVjb3JkIG9mIHRoZSBsYXN0IEJPcyBjaG9zZW4gZm9yIGVhY2ggY2FjaGVfaWQuICBVc2VkIHRvIHNldAorICAgICogYnJ3LT5zdGF0ZS5kaXJ0eS5jYWNoZSB3aGVuIGEgbmV3IGNhY2hlIGl0ZW0gaXMgY2hvc2VuLgorICAgICovCisgICBkcmlfYm8gKmxhc3RfYm9bQlJXX01BWF9DQUNIRV07CiB9OwogCiAKQEAgLTMxMiwzNCArMzM0LDggQEAKICAqLwogc3RydWN0IGJyd190cmFja2VkX3N0YXRlIHsKICAgIHN0cnVjdCBicndfc3RhdGVfZmxhZ3MgZGlydHk7Ci0gICB2b2lkICgqdXBkYXRlKSggc3RydWN0IGJyd19jb250ZXh0ICpicncgKTsKLX07Ci0KLQotZW51bSBicndfY2FjaGVfaWQgewotICAgQlJXX0NDX1ZQLAotICAgQlJXX0NDX1VOSVQsCi0gICBCUldfV01fUFJPRywKLSAgIEJSV19TQU1QTEVSX0RFRkFVTFRfQ09MT1IsCi0gICBCUldfU0FNUExFUiwKLSAgIEJSV19XTV9VTklULAotICAgQlJXX1NGX1BST0csCi0gICBCUldfU0ZfVlAsCi0gICBCUldfU0ZfVU5JVCwKLSAgIEJSV19WU19VTklULAotICAgQlJXX1ZTX1BST0csCi0gICBCUldfR1NfVU5JVCwKLSAgIEJSV19HU19QUk9HLAotICAgQlJXX0NMSVBfVlAsCi0gICBCUldfQ0xJUF9VTklULAotICAgQlJXX0NMSVBfUFJPRywKLQotICAgLyogVGhlc2UgdHdvIGFyZSBpbiB0aGUgU1MgcG9vbDoKLSAgICAqLwotICAgQlJXX1NTX1NVUkZBQ0UsCi0gICBCUldfU1NfU1VSRl9CSU5ELAotCi0gICBCUldfTUFYX0NBQ0hFCisgICB2b2lkICgqcHJlcGFyZSkoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7CisgICB2b2lkICgqZW1pdCkoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7CiB9OwogCiAvKiBGbGFncyBmb3IgYnJ3LT5zdGF0ZS5jYWNoZS4KQEAgLTM2MywxNiArMzU5LDYgQEAKICNkZWZpbmUgQ0FDSEVfTkVXX1NVUkZBQ0UgICAgICAgICAgICAgICAgKDE8PEJSV19TU19TVVJGQUNFKQogI2RlZmluZSBDQUNIRV9ORVdfU1VSRl9CSU5EICAgICAgICAgICAgICAoMTw8QlJXX1NTX1NVUkZfQklORCkKIAotCi0KLQotZW51bSBicndfbWVtcG9vbF9pZCB7Ci0gICBCUldfR1NfUE9PTCwKLSAgIEJSV19TU19QT09MLAotICAgQlJXX01BWF9QT09MCi19OwotCi0KIHN0cnVjdCBicndfY2FjaGVkX2JhdGNoX2l0ZW0gewogICAgc3RydWN0IGhlYWRlciAqaGVhZGVyOwogICAgR0x1aW50IHN6OwpAQCAtMzg5LDEyICszNzUsMTYgQEAKIHN0cnVjdCBicndfdmVydGV4X2VsZW1lbnQgewogICAgY29uc3Qgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqZ2xhcnJheTsKIAotICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudF9zdGF0ZSAqdmVwOwotCi0gICBHTHVpbnQgaW5kZXg7CisgICAvKiogU2l6ZSBvZiBhIGNvbXBsZXRlIGVsZW1lbnQgKi8KICAgIEdMdWludCBlbGVtZW50X3NpemU7CisgICAvKiogTnVtYmVyIG9mIHVwbG9hZGVkIGVsZW1lbnRzIGZvciB0aGlzIGlucHV0LiAqLwogICAgR0x1aW50IGNvdW50OwotICAgR0x1aW50IHZib19yZWJhc2Vfb2Zmc2V0OworICAgLyoqIEJ5dGUgc3RyaWRlIGJldHdlZW4gZWxlbWVudHMgaW4gdGhlIHVwbG9hZGVkIGFycmF5ICovCisgICBHTHVpbnQgc3RyaWRlOworICAgLyoqIE9mZnNldCBvZiB0aGUgZmlyc3QgZWxlbWVudCB3aXRoaW4gdGhlIGJ1ZmZlciBvYmplY3QgKi8KKyAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAvKiogQnVmZmVyIG9iamVjdCBjb250YWluaW5nIHRoZSB1cGxvYWRlZCB2ZXJ0ZXggZGF0YSAqLworICAgZHJpX2JvICpibzsKIH07CiAKIApAQCAtNDMxLDQ5ICs0MjEsNTMgQEAKICAgIEdMYm9vbGVhbiBlbWl0X3N0YXRlX2Fsd2F5czsKICAgIEdMYm9vbGVhbiB3cmFwOwogICAgR0xib29sZWFuIHRtcF9mYWxsYmFjazsKKyAgIEdMYm9vbGVhbiBub19iYXRjaF93cmFwOwogCiAgICBzdHJ1Y3QgewogICAgICAgc3RydWN0IGJyd19zdGF0ZV9mbGFncyBkaXJ0eTsKICAgICAgIHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSAqKmF0b21zOwogICAgICAgR0x1aW50IG5yX2F0b21zOwogCi0KLSAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRyYXdfcmVnaW9uOworICAgICAgR0x1aW50IG5yX2RyYXdfcmVnaW9uczsKKyAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRyYXdfcmVnaW9uc1tNQVhfRFJBV19CVUZGRVJTXTsKICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlcHRoX3JlZ2lvbjsKICAgIH0gc3RhdGU7CiAKICAgIHN0cnVjdCBicndfc3RhdGVfcG9pbnRlcnMgYXR0cmliczsKLSAgIHN0cnVjdCBicndfbWVtX3Bvb2wgcG9vbFtCUldfTUFYX1BPT0xdOwotICAgc3RydWN0IGJyd19jYWNoZSBjYWNoZVtCUldfTUFYX0NBQ0hFXTsKKyAgIHN0cnVjdCBicndfY2FjaGUgY2FjaGU7CiAgICBzdHJ1Y3QgYnJ3X2NhY2hlZF9iYXRjaF9pdGVtICpjYWNoZWRfYmF0Y2hfaXRlbXM7CiAKICAgIHN0cnVjdCB7Ci0KLSAgICAgIC8qIEFycmF5cyB3aXRoIGJ1ZmZlciBvYmplY3RzIHRvIGNvcHkgbm9uLWJ1ZmZlcm9iaiBhcnJheXMgaW50bwotICAgICAgICogZm9yIHVwbG9hZDoKLSAgICAgICAqLwotICAgICAgc3RydWN0IGdsX2NsaWVudF9hcnJheSB2Ym9fYXJyYXlbVkVSVF9BVFRSSUJfTUFYXTsKLQogICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCBpbnB1dHNbVkVSVF9BVFRSSUJfTUFYXTsKIAogI2RlZmluZSBCUldfTlJfVVBMT0FEX0JVRlMgMTcKICNkZWZpbmUgQlJXX1VQTE9BRF9JTklUX1NJWkUgKDEyOCoxMDI0KQogCiAgICAgICBzdHJ1Y3QgewotCSBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqdmJvW0JSV19OUl9VUExPQURfQlVGU107Ci0JIEdMdWludCBidWY7CisJIGRyaV9ibyAqYm87CiAJIEdMdWludCBvZmZzZXQ7Ci0JIEdMdWludCBzaXplOwotCSBHTHVpbnQgd3JhcDsKICAgICAgIH0gdXBsb2FkOwogCiAgICAgICAvKiBTdW1tYXJ5IG9mIHNpemUgYW5kIHZhcnlpbmcgb2YgYWN0aXZlIGFycmF5cywgc28gd2UgY2FuIGNoZWNrCiAgICAgICAgKiBmb3IgY2hhbmdlcyB0byB0aGlzIHN0YXRlOgogICAgICAgICovCiAgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9pbmZvIGluZm87CisgICAgICB1bnNpZ25lZCBpbnQgbWluX2luZGV4LCBtYXhfaW5kZXg7CiAgICB9IHZiOwogCiAgICBzdHJ1Y3QgeworICAgICAgLyoqCisgICAgICAgKiBJbmRleCBidWZmZXIgZm9yIHRoaXMgZHJhd19wcmltcyBjYWxsLgorICAgICAgICoKKyAgICAgICAqIFVwZGF0ZXMgYXJlIHNpZ25hbGVkIGJ5IEJSV19ORVdfSU5ESUNFUy4KKyAgICAgICAqLworICAgICAgY29uc3Qgc3RydWN0IF9tZXNhX2luZGV4X2J1ZmZlciAqaWI7CisKKyAgICAgIGRyaV9ibyAqYm87CisgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgfSBpYjsKKworICAgc3RydWN0IHsKICAgICAgIC8qIFdpbGwgYmUgYWxsb2NhdGVkIG9uIGRlbWFuZCBpZiBuZWVkZWQuICAgCiAgICAgICAgKi8KICAgICAgIHN0cnVjdCBicndfc3RhdGVfcG9pbnRlcnMgYXR0cmliczsKQEAgLTQ4Myw5ICs0NzcsMTIgQEAKICAgICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICp2Ym87CiAKICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnNhdmVkX2RyYXdfcmVnaW9uOworICAgICAgR0x1aW50IHNhdmVkX25yX2RyYXdfcmVnaW9uczsKICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnNhdmVkX2RlcHRoX3JlZ2lvbjsKIAotICAgICAgR0x1aW50IHJlc3RvcmVfZHJhd19tYXNrOworICAgICAgR0x1aW50IHJlc3RvcmVfZHJhd19idWZmZXJzW01BWF9EUkFXX0JVRkZFUlNdOworICAgICAgR0x1aW50IHJlc3RvcmVfbnVtX2RyYXdfYnVmZmVyczsKKwogICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnJlc3RvcmVfZnA7CiAgICAgICAKICAgICAgIEdMYm9vbGVhbiBhY3RpdmU7CkBAIC01NTIsNyArNTQ5LDExIEBACiAgICAgICAgKi8KICAgICAgIHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSB0cmFja2VkX3N0YXRlOwogCi0gICAgICBHTHVpbnQgZ3Nfb2Zmc2V0OworICAgICAgZHJpX2JvICpjdXJiZV9ibzsKKyAgICAgIC8qKiBPZmZzZXQgd2l0aGluIGN1cmJlX2JvIG9mIHNwYWNlIGZvciBjdXJyZW50IGN1cmJlIGVudHJ5ICovCisgICAgICBHTHVpbnQgY3VyYmVfb2Zmc2V0OworICAgICAgLyoqIE9mZnNldCB3aXRoaW4gY3VyYmVfYm8gb2Ygc3BhY2UgZm9yIG5leHQgY3VyYmUgZW50cnkgKi8KKyAgICAgIEdMdWludCBjdXJiZV9uZXh0X29mZnNldDsKIAogICAgICAgR0xmbG9hdCAqbGFzdF9idWY7CiAgICAgICBHTHVpbnQgbGFzdF9idWZzejsKQEAgLTU2MSwzMyArNTYyLDMzIEBACiAgICBzdHJ1Y3QgewogICAgICAgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKnByb2dfZGF0YTsKIAotICAgICAgR0x1aW50IHByb2dfZ3Nfb2Zmc2V0OwotICAgICAgR0x1aW50IHN0YXRlX2dzX29mZnNldDsJCisgICAgICBkcmlfYm8gKnByb2dfYm87CisgICAgICBkcmlfYm8gKnN0YXRlX2JvOwogICAgfSB2czsKIAogICAgc3RydWN0IHsKICAgICAgIHN0cnVjdCBicndfZ3NfcHJvZ19kYXRhICpwcm9nX2RhdGE7CiAKICAgICAgIEdMYm9vbGVhbiBwcm9nX2FjdGl2ZTsKLSAgICAgIEdMdWludCBwcm9nX2dzX29mZnNldDsKLSAgICAgIEdMdWludCBzdGF0ZV9nc19vZmZzZXQ7CQorICAgICAgZHJpX2JvICpwcm9nX2JvOworICAgICAgZHJpX2JvICpzdGF0ZV9ibzsKICAgIH0gZ3M7CiAKICAgIHN0cnVjdCB7CiAgICAgICBzdHJ1Y3QgYnJ3X2NsaXBfcHJvZ19kYXRhICpwcm9nX2RhdGE7CiAKLSAgICAgIEdMdWludCBwcm9nX2dzX29mZnNldDsKLSAgICAgIEdMdWludCB2cF9nc19vZmZzZXQ7Ci0gICAgICBHTHVpbnQgc3RhdGVfZ3Nfb2Zmc2V0OwkKKyAgICAgIGRyaV9ibyAqcHJvZ19ibzsKKyAgICAgIGRyaV9ibyAqc3RhdGVfYm87CisgICAgICBkcmlfYm8gKnZwX2JvOwogICAgfSBjbGlwOwogCiAKICAgIHN0cnVjdCB7CiAgICAgICBzdHJ1Y3QgYnJ3X3NmX3Byb2dfZGF0YSAqcHJvZ19kYXRhOwogCi0gICAgICBHTHVpbnQgcHJvZ19nc19vZmZzZXQ7Ci0gICAgICBHTHVpbnQgdnBfZ3Nfb2Zmc2V0OwotICAgICAgR0x1aW50IHN0YXRlX2dzX29mZnNldDsKKyAgICAgIGRyaV9ibyAqcHJvZ19ibzsKKyAgICAgIGRyaV9ibyAqc3RhdGVfYm87CisgICAgICBkcmlfYm8gKnZwX2JvOwogICAgfSBzZjsKIAogICAgc3RydWN0IHsKQEAgLTU5OCwzMyArNTk5LDMxIEBACiAgICAgICAgKi8KICAgICAgIEdMdWludCBpbnB1dF9zaXplX21hc2tzWzRdOwogCi0KLSAgICAgIC8qIFN0YXRlIHN0cnVjdHMKLSAgICAgICAqLwotICAgICAgc3RydWN0IGJyd19zYW1wbGVyX2RlZmF1bHRfY29sb3Igc2RjW0JSV19NQVhfVEVYX1VOSVRdOwotICAgICAgc3RydWN0IGJyd19zYW1wbGVyX3N0YXRlIHNhbXBsZXJbQlJXX01BWF9URVhfVU5JVF07CisgICAgICAvKiogQXJyYXkgb2Ygc3VyZmFjZSBkZWZhdWx0IGNvbG9ycyAodGV4dHVyZSBib3JkZXIgY29sb3IpICovCisgICAgICBkcmlfYm8gKnNkY19ib1tCUldfTUFYX1RFWF9VTklUXTsKIAogICAgICAgR0x1aW50IHJlbmRlcl9zdXJmOwogICAgICAgR0x1aW50IG5yX3N1cmZhY2VzOyAgICAgIAogCiAgICAgICBHTHVpbnQgbWF4X3RocmVhZHM7Ci0gICAgICBzdHJ1Y3QgYnVmZmVyICpzY3JhdGNoX2J1ZmZlcjsKLSAgICAgIEdMdWludCBzY3JhdGNoX2J1ZmZlcl9zaXplOworICAgICAgZHJpX2JvICpzY3JhdGNoX2J1ZmZlcjsKIAogICAgICAgR0x1aW50IHNhbXBsZXJfY291bnQ7Ci0gICAgICBHTHVpbnQgc2FtcGxlcl9nc19vZmZzZXQ7CisgICAgICBkcmlfYm8gKnNhbXBsZXJfYm87CiAKLSAgICAgIHN0cnVjdCBicndfc3VyZmFjZV9iaW5kaW5nX3RhYmxlIGJpbmQ7Ci0gICAgICBHTHVpbnQgYmluZF9zc19vZmZzZXQ7CisgICAgICAvKiogQmluZGluZyB0YWJsZSBvZiBwb2ludGVycyB0byBzdXJmX2JvIGVudHJpZXMgKi8KKyAgICAgIGRyaV9ibyAqYmluZF9ibzsKKyAgICAgIGRyaV9ibyAqc3VyZl9ib1tCUldfV01fTUFYX1NVUkZdOwogCi0gICAgICBHTHVpbnQgcHJvZ19nc19vZmZzZXQ7Ci0gICAgICBHTHVpbnQgc3RhdGVfZ3Nfb2Zmc2V0OworICAgICAgZHJpX2JvICpwcm9nX2JvOworICAgICAgZHJpX2JvICpzdGF0ZV9ibzsKICAgIH0gd207CiAKIAogICAgc3RydWN0IHsKLSAgICAgIEdMdWludCB2cF9nc19vZmZzZXQ7Ci0gICAgICBHTHVpbnQgc3RhdGVfZ3Nfb2Zmc2V0OworICAgICAgZHJpX2JvICpwcm9nX2JvOworICAgICAgZHJpX2JvICpzdGF0ZV9ibzsKKyAgICAgIGRyaV9ibyAqdnBfYm87CiAgICB9IGNjOwogCiAgICAKQEAgLTY2MiwxNCArNjYxLDE5IEBACiB2b2lkIGJyd19kZXN0cm95X3N0YXRlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwogCiAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYnJ3X3N0YXRlX2R1bXAuYworICovCit2b2lkIGJyd19kZWJ1Z19iYXRjaChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIGJyd190ZXguYwogICovCiB2b2lkIGJyd1VwZGF0ZVRleHR1cmVTdGF0ZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci12b2lkIGJyd0luaXRUZXh0dXJlRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci12b2lkIGJyd19GcmFtZUJ1ZmZlclRleEluaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7Cit2b2lkIGJyd19GcmFtZUJ1ZmZlclRleEluaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24gKTsKIHZvaWQgYnJ3X0ZyYW1lQnVmZmVyVGV4RGVzdHJveSggc3RydWN0IGJyd19jb250ZXh0ICpicncgKTsKK3ZvaWQgYnJ3X3ZhbGlkYXRlX3RleHR1cmVzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIGJyd19tZXRhb3BzLmMKQEAgLTY5NiwxMSArNzAwLDEzIEBACiAgKiBJbmxpbmUgY29udmVyc2lvbiBmdW5jdGlvbnMuICBUaGVzZSBhcmUgYmV0dGVyLXR5cGVkIHRoYW4gdGhlCiAgKiBtYWNyb3MgdXNlZCBwcmV2aW91c2x5OgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBicndfY29udGV4dCAqCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfY29udGV4dCAqCiBicndfY29udGV4dCggR0xjb250ZXh0ICpjdHggKQogewogICAgcmV0dXJuIChzdHJ1Y3QgYnJ3X2NvbnRleHQgKiljdHg7CiB9CiAKKyNkZWZpbmUgRE9fU0VUVVBfQklUUyAoKDE8PChGUkFHX0FUVFJJQl9NQVgpKSAtIDEpCisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jdXJiZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfY3VyYmUuYwppbmRleCAzZjBhYWExLi4wYTM2MDAxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19jdXJiZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2N1cmJlLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgogI2luY2x1ZGUgImJyd191dGlsLmgiCi0jaW5jbHVkZSAiYnJ3X2F1Yi5oIgogCiAKIC8qIFBhcnRpdGlvbiB0aGUgQ1VSQkUgYmV0d2VlbiB0aGUgdmFyaW91cyB1c2VycyBvZiBjb25zdGFudCB2YWx1ZXM6CkBAIC05MCw3ICs4OSw3IEBACiAgICAgKi8KICAgIGlmIChucl9mcF9yZWdzID4gYnJ3LT5jdXJiZS53bV9zaXplIHx8CiAgICAgICAgbnJfdnBfcmVncyA+IGJydy0+Y3VyYmUudnNfc2l6ZSB8fAotICAgICAgIG5yX2NsaXBfcmVncyA+IGJydy0+Y3VyYmUuY2xpcF9zaXplIHx8CisgICAgICAgbnJfY2xpcF9yZWdzICE9IGJydy0+Y3VyYmUuY2xpcF9zaXplIHx8CiAgICAgICAgKHRvdGFsX3JlZ3MgPCBicnctPmN1cmJlLnRvdGFsX3NpemUgLyA0ICYmCiAJYnJ3LT5jdXJiZS50b3RhbF9zaXplID4gMTYpKSB7CiAKQEAgLTEyNyw3ICsxMjYsNyBAQAogICAgICAgLmJydyAgPSBCUldfTkVXX1ZFUlRFWF9QUk9HUkFNLAogICAgICAgLmNhY2hlID0gQ0FDSEVfTkVXX1dNX1BST0cKICAgIH0sCi0gICAudXBkYXRlID0gY2FsY3VsYXRlX2N1cmJlX29mZnNldHMKKyAgIC5wcmVwYXJlID0gY2FsY3VsYXRlX2N1cmJlX29mZnNldHMKIH07CiAKIApAQCAtMTU2LDE5ICsxNTUsNyBAQAogCiAgICBhc3NlcnQoYnJ3LT51cmIubnJfY3NfZW50cmllcyk7CiAgICBCUldfQ0FDSEVEX0JBVENIX1NUUlVDVChicncsICZjYnMpOwotfSAgICAgIAotCi0jaWYgMAotY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19jb25zdGFudF9idWZmZXJfc3RhdGUgPSB7Ci0gICAuZGlydHkgPSB7Ci0gICAgICAubWVzYSA9IDAsCi0gICAgICAuYnJ3ID0gQlJXX05FV19VUkJfRkVOQ0UsCi0gICAgICAuY2FjaGUgPSAwCi0gICB9LAotICAgLnVwZGF0ZSA9IGJyd191cGxvYWRfY29uc3RhbnRfYnVmZmVyX3N0YXRlCi19OwotI2VuZGlmCi0KK30KIAogc3RhdGljIEdMZmxvYXQgZml4ZWRfcGxhbmVbNl1bNF0gPSB7CiAgICB7IDAsICAgIDAsICAgLTEsIDEgfSwKQEAgLTE4MywxMiArMTcwLDExIEBACiAgKiBjYWNoZSBtZWNoYW5pc20sIGJ1dCBtYXliZSB3b3VsZCBiZW5lZml0IGZyb20gYSBjb21wYXJpc29uIGFnYWluc3QKICAqIHRoZSBjdXJyZW50IHVwbG9hZGVkIHNldCBvZiBjb25zdGFudHMuCiAgKi8KLXN0YXRpYyB2b2lkIHVwbG9hZF9jb25zdGFudF9idWZmZXIoc3RydWN0IGJyd19jb250ZXh0ICpicncpCitzdGF0aWMgdm9pZCBwcmVwYXJlX2NvbnN0YW50X2J1ZmZlcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OwogICAgc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqdnAgPSAoc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqKWJydy0+dmVydGV4X3Byb2dyYW07CiAgICBzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqKWJydy0+ZnJhZ21lbnRfcHJvZ3JhbTsKLSAgIHN0cnVjdCBicndfbWVtX3Bvb2wgKnBvb2wgPSAmYnJ3LT5wb29sW0JSV19HU19QT09MXTsKICAgIEdMdWludCBzeiA9IGJydy0+Y3VyYmUudG90YWxfc2l6ZTsKICAgIEdMdWludCBidWZzeiA9IHN6ICogMTYgKiBzaXplb2YoR0xmbG9hdCk7CiAgICBHTGZsb2F0ICpidWY7CkBAIC0yMDIsMjAgKzE4OCwxMyBAQAogICAgYnJ3LT5jdXJiZS50cmFja2VkX3N0YXRlLmRpcnR5Lm1lc2EgfD0gZnAtPnBhcmFtX3N0YXRlOwogCiAgICBpZiAoc3ogPT0gMCkgewotICAgICAgc3RydWN0IGJyd19jb25zdGFudF9idWZmZXIgY2I7Ci0gICAgICBjYi5oZWFkZXIub3Bjb2RlID0gQ01EX0NPTlNUX0JVRkZFUjsKLSAgICAgIGNiLmhlYWRlci5sZW5ndGggPSBzaXplb2YoY2IpLzQgLSAyOwotICAgICAgY2IuaGVhZGVyLnZhbGlkID0gMDsKLSAgICAgIGNiLmJpdHMwLmJ1ZmZlcl9sZW5ndGggPSAwOwotICAgICAgY2IuYml0czAuYnVmZmVyX2FkZHJlc3MgPSAwOwotICAgICAgQlJXX0JBVENIX1NUUlVDVChicncsICZjYik7CiAKICAgICAgIGlmIChicnctPmN1cmJlLmxhc3RfYnVmKSB7CiAJIGZyZWUoYnJ3LT5jdXJiZS5sYXN0X2J1Zik7CiAJIGJydy0+Y3VyYmUubGFzdF9idWYgPSBOVUxMOwogCSBicnctPmN1cmJlLmxhc3RfYnVmc3ogID0gMDsKICAgICAgIH0KLSAgICAgICAKKwogICAgICAgcmV0dXJuOwogICAgfQogCkBAIC0yOTAsMTEgKzI2OSwxMSBAQAogCQkgICBicnctPmN1cmJlLmxhc3RfYnVmID8gbWVtY21wKGJ1ZiwgYnJ3LT5jdXJiZS5sYXN0X2J1ZiwgYnVmc3opIDogLTEpOwogICAgfQogCi0gICBpZiAoYnJ3LT5jdXJiZS5sYXN0X2J1ZiAmJgorICAgaWYgKGJydy0+Y3VyYmUuY3VyYmVfYm8gIT0gTlVMTCAmJgorICAgICAgIGJydy0+Y3VyYmUubGFzdF9idWYgJiYKICAgICAgICBidWZzeiA9PSBicnctPmN1cmJlLmxhc3RfYnVmc3ogJiYKICAgICAgICBtZW1jbXAoYnVmLCBicnctPmN1cmJlLmxhc3RfYnVmLCBidWZzeikgPT0gMCkgewogICAgICAgZnJlZShidWYpOwotLyogICAgICAgcmV0dXJuOyAqLwogICAgfSAKICAgIGVsc2UgewogICAgICAgaWYgKGJydy0+Y3VyYmUubGFzdF9idWYpCkBAIC0zMDIsNjEgKzI4MSw3MSBAQAogICAgICAgYnJ3LT5jdXJiZS5sYXN0X2J1ZiA9IGJ1ZjsKICAgICAgIGJydy0+Y3VyYmUubGFzdF9idWZzeiA9IGJ1ZnN6OwogCi0gICAgICAKLSAgICAgIGlmICghYnJ3X3Bvb2xfYWxsb2MocG9vbCwgCi0JCQkgIGJ1ZnN6LAotCQkJICA2LAotCQkJICAmYnJ3LT5jdXJiZS5nc19vZmZzZXQpKSB7Ci0JIF9tZXNhX3ByaW50Zigib3V0IG9mIEdTIG1lbW9yeSBmb3IgY3VyYmVcbiIpOwotCSBhc3NlcnQoMCk7Ci0JIHJldHVybjsKKyAgICAgIGlmIChicnctPmN1cmJlLmN1cmJlX2JvICE9IE5VTEwgJiYKKwkgIGJydy0+Y3VyYmUuY3VyYmVfbmV4dF9vZmZzZXQgKyBidWZzeiA+IGJydy0+Y3VyYmUuY3VyYmVfYm8tPnNpemUpCisgICAgICB7CisJIGRyaV9ib191bnJlZmVyZW5jZShicnctPmN1cmJlLmN1cmJlX2JvKTsKKwkgYnJ3LT5jdXJiZS5jdXJiZV9ibyA9IE5VTEw7CiAgICAgICB9Ci0gICAgICAgICAgICAKKworICAgICAgaWYgKGJydy0+Y3VyYmUuY3VyYmVfYm8gPT0gTlVMTCkgeworCSAvKiBBbGxvY2F0ZSBhIHNpbmdsZSBwYWdlIGZvciBDVVJCRSBlbnRyaWVzIGZvciB0aGlzIGJhdGNoYnVmZmVyLgorCSAgKiBUaGV5J3JlIGdlbmVyYWxseSBhcm91bmQgNjRiLgorCSAgKi8KKwkgYnJ3LT5jdXJiZS5jdXJiZV9ibyA9IGRyaV9ib19hbGxvYyhicnctPmludGVsLmJ1Zm1nciwgIkNVUkJFIiwKKwkJCQkJICAgIDQwOTYsIDEgPDwgNik7CisJIGJydy0+Y3VyYmUuY3VyYmVfbmV4dF9vZmZzZXQgPSAwOworICAgICAgfQorCisgICAgICBicnctPmN1cmJlLmN1cmJlX29mZnNldCA9IGJydy0+Y3VyYmUuY3VyYmVfbmV4dF9vZmZzZXQ7CisgICAgICBicnctPmN1cmJlLmN1cmJlX25leHRfb2Zmc2V0ICs9IGJ1ZnN6OworICAgICAgYnJ3LT5jdXJiZS5jdXJiZV9uZXh0X29mZnNldCA9IEFMSUdOKGJydy0+Y3VyYmUuY3VyYmVfbmV4dF9vZmZzZXQsIDY0KTsKIAogICAgICAgLyogQ29weSBkYXRhIHRvIHRoZSBidWZmZXI6CiAgICAgICAgKi8KLSAgICAgIGJtQnVmZmVyU3ViRGF0YUFVQigmYnJ3LT5pbnRlbCwKLQkJCSBwb29sLT5idWZmZXIsCi0JCQkgYnJ3LT5jdXJiZS5nc19vZmZzZXQsIAotCQkJIGJ1ZnN6LCAKLQkJCSBidWYsCi0JCQkgRFdfQ09OU1RBTlRfQlVGRkVSLAotCQkJIDApOworICAgICAgZHJpX2JvX3N1YmRhdGEoYnJ3LT5jdXJiZS5jdXJiZV9ibywgYnJ3LT5jdXJiZS5jdXJiZV9vZmZzZXQsIGJ1ZnN6LCBidWYpOwogICAgfQogCi0gICAvKiBUT0RPOiBvbmx5IGVtaXQgdGhlIGNvbnN0YW50X2J1ZmZlciBwYWNrZXQgd2hlbiBuZWNlc3NhcnksIGllOgotICAgICAgLSBjb250ZW50cyBoYXZlIGNoYW5nZWQKLSAgICAgIC0gb2Zmc2V0IGhhcyBjaGFuZ2VkCi0gICAgICAtIGh3IHJlcXVpcmVtZW50cyBkdWUgdG8gb3RoZXIgcGFja2V0cyBlbWl0dGVkLgotICAgKi8KLSAgIHsKLSAgICAgIHN0cnVjdCBicndfY29uc3RhbnRfYnVmZmVyIGNiOwotICAgICAgCi0gICAgICBtZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKIAotICAgICAgY2IuaGVhZGVyLm9wY29kZSA9IENNRF9DT05TVF9CVUZGRVI7Ci0gICAgICBjYi5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKGNiKS80IC0gMjsKLSAgICAgIGNiLmhlYWRlci52YWxpZCA9IDE7Ci0gICAgICBjYi5iaXRzMC5idWZmZXJfbGVuZ3RoID0gc3ogLSAxOwotICAgICAgY2IuYml0czAuYnVmZmVyX2FkZHJlc3MgPSBicnctPmN1cmJlLmdzX29mZnNldCA+PiA2OwotICAgICAgCi0gICAgICAvKiBCZWNhdXNlIHRoaXMgcHJvdm9rZXMgYW4gYWN0aW9uIChpZSBjb3B5IHRoZSBjb25zdGFudHMgaW50byB0aGUKLSAgICAgICAqIFVSQiksIGl0IHNob3VsZG4ndCBiZSBzaG9ydGNpcmN1aXRlZCBpZiBpZGVudGljYWwgdG8gdGhlCi0gICAgICAgKiBwcmV2aW91cyB0aW1lIC0gYmVjYXVzZSBlZy4gdGhlIHVyYiBkZXN0aW5hdGlvbiBtYXkgaGF2ZQotICAgICAgICogY2hhbmdlZCwgb3IgdGhlIHVyYiBjb250ZW50cyBkaWZmZXJlbnQgdG8gbGFzdCB0aW1lLiAgCi0gICAgICAgKgotICAgICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHJlZmVycmVkIHRvIGlzIGFjdHVhbGx5IGNvcGllZCBpbnRlcm5hbGx5LAotICAgICAgICogbm90IGp1c3QgdXNlZCBpbiBwbGFjZSBhY2NvcmRpbmcgdG8gcGFzc2VkIHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSXQgYXBwZWFycyB0aGF0IHRoZSBDUyB1bml0IHRha2VzIGNhcmUgb2YgdXNpbmcgZWFjaCBhdmFpbGFibGUKLSAgICAgICAqIFVSQiBlbnRyeSAoQ29uc3QgVVJCIEVudHJ5ID09IENVUkJFKSBpbiB0dXJuLCBhbmQgaXNzdWluZwotICAgICAgICogZmx1c2hlcyBhcyBuZWNlc3Nhcnkgd2hlbiBkb3VibGVidWZmZXJpbmcgb2YgQ1VSQkVzIGlzbid0Ci0gICAgICAgKiBwb3NzaWJsZS4KLSAgICAgICAqLwotLyogICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfYWxpZ24oYnJ3LT5pbnRlbC5iYXRjaCwgNjQsIHNpemVvZihjYikpOyAqLwotICAgICAgQlJXX0JBVENIX1NUUlVDVChicncsICZjYik7Ci0vKiAgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9hbGlnbihicnctPmludGVsLmJhdGNoLCA2NCwgMCk7ICovCisgICAvKiBCZWNhdXNlIHRoaXMgcHJvdm9rZXMgYW4gYWN0aW9uIChpZSBjb3B5IHRoZSBjb25zdGFudHMgaW50byB0aGUKKyAgICAqIFVSQiksIGl0IHNob3VsZG4ndCBiZSBzaG9ydGNpcmN1aXRlZCBpZiBpZGVudGljYWwgdG8gdGhlCisgICAgKiBwcmV2aW91cyB0aW1lIC0gYmVjYXVzZSBlZy4gdGhlIHVyYiBkZXN0aW5hdGlvbiBtYXkgaGF2ZQorICAgICogY2hhbmdlZCwgb3IgdGhlIHVyYiBjb250ZW50cyBkaWZmZXJlbnQgdG8gbGFzdCB0aW1lLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCB0aGUgZGF0YSByZWZlcnJlZCB0byBpcyBhY3R1YWxseSBjb3BpZWQgaW50ZXJuYWxseSwKKyAgICAqIG5vdCBqdXN0IHVzZWQgaW4gcGxhY2UgYWNjb3JkaW5nIHRvIHBhc3NlZCBwb2ludGVyLgorICAgICoKKyAgICAqIEl0IGFwcGVhcnMgdGhhdCB0aGUgQ1MgdW5pdCB0YWtlcyBjYXJlIG9mIHVzaW5nIGVhY2ggYXZhaWxhYmxlCisgICAgKiBVUkIgZW50cnkgKENvbnN0IFVSQiBFbnRyeSA9PSBDVVJCRSkgaW4gdHVybiwgYW5kIGlzc3VpbmcKKyAgICAqIGZsdXNoZXMgYXMgbmVjZXNzYXJ5IHdoZW4gZG91YmxlYnVmZmVyaW5nIG9mIENVUkJFcyBpc24ndAorICAgICogcG9zc2libGUuCisgICAgKi8KK30KKworCitzdGF0aWMgdm9pZCBlbWl0X2NvbnN0YW50X2J1ZmZlcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZicnctPmludGVsOworICAgR0x1aW50IHN6ID0gYnJ3LT5jdXJiZS50b3RhbF9zaXplOworICAgZHJpX2JvICphcGVyX2FycmF5W10gPSB7CisgICAgICBicnctPmludGVsLmJhdGNoLT5idWYsCisgICAgICBicnctPmN1cmJlLmN1cmJlX2JvLAorICAgfTsKKworICAgaWYgKGRyaV9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoYXBlcl9hcnJheSwgQVJSQVlfU0laRShhcGVyX2FycmF5KSkpCisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChpbnRlbC0+YmF0Y2gpOworCisgICBCRUdJTl9CQVRDSCgyLCBJR05PUkVfQ0xJUFJFQ1RTKTsKKyAgIGlmIChzeiA9PSAwKSB7CisgICAgICBPVVRfQkFUQ0goKENNRF9DT05TVF9CVUZGRVIgPDwgMTYpIHwgKDIgLSAyKSk7CisgICAgICBPVVRfQkFUQ0goMCk7CisgICB9IGVsc2UgeworICAgICAgT1VUX0JBVENIKChDTURfQ09OU1RfQlVGRkVSIDw8IDE2KSB8ICgxIDw8IDgpIHwgKDIgLSAyKSk7CisgICAgICBPVVRfUkVMT0MoYnJ3LT5jdXJiZS5jdXJiZV9ibywKKwkJSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAorCQkoc3ogLSAxKSArIGJydy0+Y3VyYmUuY3VyYmVfb2Zmc2V0KTsKICAgIH0KKyAgIEFEVkFOQ0VfQkFUQ0goKTsKIH0KIAogLyogVGhpcyB0cmFja2VkIHN0YXRlIGlzIHVuaXF1ZSBpbiB0aGF0IHRoZSBzdGF0ZSBpdCBtb25pdG9ycyB2YXJpZXMKQEAgLTM3Miw5ICszNjEsMTEgQEAKIAkgICAgICAgQlJXX05FV19WRVJURVhfUFJPR1JBTSB8CiAJICAgICAgIEJSV19ORVdfVVJCX0ZFTkNFIHwgLyogSW1wbGljaXQgLSBoYXJkd2FyZSByZXF1aXJlcyB0aGlzLCBub3QgdXNlZCBhYm92ZSAqLwogCSAgICAgICBCUldfTkVXX1BTUCB8IC8qIEltcGxpY2l0IC0gaGFyZHdhcmUgcmVxdWlyZXMgdGhpcywgbm90IHVzZWQgYWJvdmUgKi8KLQkgICAgICAgQlJXX05FV19DVVJCRV9PRkZTRVRTKSwKKwkgICAgICAgQlJXX05FV19DVVJCRV9PRkZTRVRTIHwKKwkgICAgICAgQlJXX05FV19CQVRDSCksCiAgICAgICAuY2FjaGUgPSAoQ0FDSEVfTkVXX1dNX1BST0cpIAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfY29uc3RhbnRfYnVmZmVyCisgICAucHJlcGFyZSA9IHByZXBhcmVfY29uc3RhbnRfYnVmZmVyLAorICAgLmVtaXQgPSBlbWl0X2NvbnN0YW50X2J1ZmZlciwKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2RlZmluZXMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2RlZmluZXMuaAppbmRleCBlOGY4NzhhLi4wNTkzZThkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kZWZpbmVzLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZGVmaW5lcy5oCkBAIC0zMyw2OSArMzMsNiBAQAogI2lmbmRlZiBCUldfREVGSU5FU19ICiAjZGVmaW5lIEJSV19ERUZJTkVTX0gKIAotLyoKLSAqLwotI2RlZmluZSBNSV9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNSV9VU0VSX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBNSV9XQUlUX0ZPUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgMHgwMwotI2RlZmluZSBNSV9GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBNSV9SRVBPUlRfSEVBRCAgICAgICAgICAgICAgICAgICAgICAgMHgwNwotI2RlZmluZSBNSV9BUkJfT05fT0ZGICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5EICAgICAgICAgICAgICAgICAgMHgwQQotI2RlZmluZSBNSV9PVkVSTEFZX0ZMSVAgICAgICAgICAgICAgICAgICAgICAgMHgxMQotI2RlZmluZSBNSV9MT0FEX1NDQU5fTElORVNfSU5DTCAgICAgICAgICAgICAgMHgxMgotI2RlZmluZSBNSV9MT0FEX1NDQU5fTElORVNfRVhDTCAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBNSV9ESVNQTEFZX0JVRkZFUl9JTkZPICAgICAgICAgICAgICAgMHgxNAotI2RlZmluZSBNSV9TRVRfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBNSV9TVE9SRV9EQVRBX0lNTSAgICAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBNSV9TVE9SRV9EQVRBX0lOREVYICAgICAgICAgICAgICAgICAgMHgyMQotI2RlZmluZSBNSV9MT0FEX1JFR0lTVEVSX0lNTSAgICAgICAgICAgICAgICAgMHgyMgotI2RlZmluZSBNSV9TVE9SRV9SRUdJU1RFUl9NRU0gICAgICAgICAgICAgICAgMHgyNAotI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgICAgICAgICAgICAgICAgMHgzMQotCi0jZGVmaW5lIE1JX1NZTkNIUk9OT1VTX0ZMSVAgICAgICAgICAgICAgICAgICAweDAgCi0jZGVmaW5lIE1JX0FTWU5DSFJPTk9VU19GTElQICAgICAgICAgICAgICAgICAweDEKLQotI2RlZmluZSBNSV9CVUZGRVJfU0VDVVJFICAgICAgICAgICAgICAgICAgICAgMHgwIAotI2RlZmluZSBNSV9CVUZGRVJfTk9OU0VDVVJFICAgICAgICAgICAgICAgICAgMHgxCi0KLSNkZWZpbmUgTUlfQVJCSVRSQVRFX0FUX0NIQUlOX1BPSU5UUyAgICAgICAgIDB4MCAKLSNkZWZpbmUgTUlfQVJCSVRSQVRFX0JFVFdFRU5fSU5TVFMgICAgICAgICAgIDB4MQotI2RlZmluZSBNSV9OT19BUkJJVFJBVElPTiAgICAgICAgICAgICAgICAgICAgMHgzIAotCi0jZGVmaW5lIE1JX0NPTkRJVElPTl9DT0RFX1dBSVRfRElTQUJMRUQgICAgICAweDAKLSNkZWZpbmUgTUlfQ09ORElUSU9OX0NPREVfV0FJVF8wICAgICAgICAgICAgIDB4MQotI2RlZmluZSBNSV9DT05ESVRJT05fQ09ERV9XQUlUXzEgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIE1JX0NPTkRJVElPTl9DT0RFX1dBSVRfMiAgICAgICAgICAgICAweDMKLSNkZWZpbmUgTUlfQ09ORElUSU9OX0NPREVfV0FJVF8zICAgICAgICAgICAgIDB4NAotI2RlZmluZSBNSV9DT05ESVRJT05fQ09ERV9XQUlUXzQgICAgICAgICAgICAgMHg1Ci0KLSNkZWZpbmUgTUlfRElTUExBWV9QSVBFX0EgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBNSV9ESVNQTEFZX1BJUEVfQiAgICAgICAgICAgICAgICAgICAgMHgxCi0KLSNkZWZpbmUgTUlfRElTUExBWV9QTEFORV9BICAgICAgICAgICAgICAgICAgIDB4MCAKLSNkZWZpbmUgTUlfRElTUExBWV9QTEFORV9CICAgICAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBNSV9ESVNQTEFZX1BMQU5FX0MgICAgICAgICAgICAgICAgICAgMHgyCi0KLSNkZWZpbmUgTUlfU1RBTkRBUkRfRkxJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBNSV9FTlFVRVVFX0ZMSVBfUEVSRk9STV9CQVNFX0ZSQU1FX05VTUJFUl9MT0FEICAgMHgxCi0jZGVmaW5lIE1JX0VOUVVFVUVfRkxJUF9UQVJHRVRfRlJBTUVfTlVNQkVSX1JFTEFUSVZFICAgICAweDIKLSNkZWZpbmUgTUlfRU5RVUVVRV9GTElQX0FCU09MVVRFX1RBUkdFVF9GUkFNRV9OVU1CRVIgICAgIDB4MwotCi0jZGVmaW5lIE1JX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDAKLSNkZWZpbmUgTUlfVklSVFVBTF9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MQotCi0jZGVmaW5lIE1JX0JVRkZFUl9NRU1PUllfTUFJTiAgICAgICAgICAgICAgICAweDAgCi0jZGVmaW5lIE1JX0JVRkZFUl9NRU1PUllfR1RUICAgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgTUlfQlVGRkVSX01FTU9SWV9QRVJfUFJPQ0VTU19HVFQgICAgIDB4MyAKLQotI2RlZmluZSBNSV9GTElQX0NPTlRJTlVFICAgICAgICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIE1JX0ZMSVBfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgTUlfRkxJUF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgotCi0jZGVmaW5lIE1JX1VOVFJVU1RFRF9SRUdJU1RFUl9TUEFDRSAgICAgICAgICAweDAKLSNkZWZpbmUgTUlfVFJVU1RFRF9SRUdJU1RFUl9TUEFDRSAgICAgICAgICAgIDB4MQotCiAvKiAzRCBzdGF0ZToKICAqLwogI2RlZmluZSBfM0RPUF8zRFNUQVRFX1BJUEVMSU5FRCAgICAgICAweDAKQEAgLTExOSw3ICs1Niw2IEBACiAjZGVmaW5lIF8zRFNUQVRFX0xJTkVfU1RJUFBMRSAgICAgICAgICAgICAgICAgMHgwOAogI2RlZmluZSBfM0RTVEFURV9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QICAgIDB4MDkKICNkZWZpbmUgXzNEQ09OVFJPTCAgICAweDAwCi0jZGVmaW5lIF8zRFBSSU1JVElWRSAgMHgwMAogCiAjZGVmaW5lIFBJUEVfQ09OVFJPTF9OT1dSSVRFICAgICAgICAgIDB4MDAKICNkZWZpbmUgUElQRV9DT05UUk9MX1dSSVRFSU1NRURJQVRFICAgMHgwMQpAQCAtMjQwLDYgKzE3Niw4IEBACiAjZGVmaW5lIEJSV19GUk9OVFdJTkRJTkdfQ1cgICAgICAwCiAjZGVmaW5lIEJSV19GUk9OVFdJTkRJTkdfQ0NXICAgICAxCiAKKyNkZWZpbmUgQlJXX1NQUklURV9QT0lOVF9FTkFCTEUgIDE2CisKICNkZWZpbmUgQlJXX0lOREVYX0JZVEUgICAgIDAKICNkZWZpbmUgQlJXX0lOREVYX1dPUkQgICAgIDEKICNkZWZpbmUgQlJXX0lOREVYX0RXT1JEICAgIDIKQEAgLTQ4NSwyMCArNDIzLDYgQEAKICNkZWZpbmUgQlJXX1ZFUlRFWF9TVUJQSVhFTF9QUkVDSVNJT05fOEJJVFMgIDAKICNkZWZpbmUgQlJXX1ZFUlRFWF9TVUJQSVhFTF9QUkVDSVNJT05fNEJJVFMgIDEKIAotI2RlZmluZSBCUldfVkVSVEVYQlVGRkVSX0FDQ0VTU19WRVJURVhEQVRBICAgICAwCi0jZGVmaW5lIEJSV19WRVJURVhCVUZGRVJfQUNDRVNTX0lOU1RBTkNFREFUQSAgIDEKLQotI2RlZmluZSBCUldfVkZDT01QT05FTlRfTk9TVE9SRSAgICAgIDAKLSNkZWZpbmUgQlJXX1ZGQ09NUE9ORU5UX1NUT1JFX1NSQyAgICAxCi0jZGVmaW5lIEJSV19WRkNPTVBPTkVOVF9TVE9SRV8wICAgICAgMgotI2RlZmluZSBCUldfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgIDMKLSNkZWZpbmUgQlJXX1ZGQ09NUE9ORU5UX1NUT1JFXzFfSU5UICA0Ci0jZGVmaW5lIEJSV19WRkNPTVBPTkVOVF9TVE9SRV9WSUQgICAgNQotI2RlZmluZSBCUldfVkZDT01QT05FTlRfU1RPUkVfSUlEICAgIDYKLSNkZWZpbmUgQlJXX1ZGQ09NUE9ORU5UX1NUT1JFX1BJRCAgICA3Ci0KLQotCiAvKiBFeGVjdXRpb24gVW5pdCAoRVUpIGRlZmluZXMKICAqLwogCkBAIC04MTUsMTQgKzczOSw0MCBAQAogCiAjZGVmaW5lIENNRF9TVEFURV9CQVNFX0FERFJFU1MgICAgICAgIDB4NjEwMQogI2RlZmluZSBDTURfU1RBVEVfSU5TTl9QT0lOVEVSICAgICAgICAweDYxMDIKLSNkZWZpbmUgQ01EX1BJUEVMSU5FX1NFTEVDVCAgICAgICAgICAgMHg2MTA0CisjZGVmaW5lIENNRF9QSVBFTElORV9TRUxFQ1RfOTY1ICAgICAgIDB4NjEwNAorI2RlZmluZSBDTURfUElQRUxJTkVfU0VMRUNUX0dNNDUgICAgICAweDY5MDQKIAogI2RlZmluZSBDTURfUElQRUxJTkVEX1NUQVRFX1BPSU5URVJTICAweDc4MDAKICNkZWZpbmUgQ01EX0JJTkRJTkdfVEFCTEVfUFRSUyAgICAgICAgMHg3ODAxCisKICNkZWZpbmUgQ01EX1ZFUlRFWF9CVUZGRVIgICAgICAgICAgICAgMHg3ODA4CisjIGRlZmluZSBCUldfVkIwX0lOREVYX1NISUZUCQkyNworIyBkZWZpbmUgQlJXX1ZCMF9BQ0NFU1NfVkVSVEVYREFUQQkoMCA8PCAyNikKKyMgZGVmaW5lIEJSV19WQjBfQUNDRVNTX0lOU1RBTkNFREFUQQkoMSA8PCAyNikKKyMgZGVmaW5lIEJSV19WQjBfUElUQ0hfU0hJRlQJCTAKKwogI2RlZmluZSBDTURfVkVSVEVYX0VMRU1FTlQgICAgICAgICAgICAweDc4MDkKKyMgZGVmaW5lIEJSV19WRTBfSU5ERVhfU0hJRlQJCTI3CisjIGRlZmluZSBCUldfVkUwX0ZPUk1BVF9TSElGVAkJMTYKKyMgZGVmaW5lIEJSV19WRTBfVkFMSUQJCQkoMSA8PCAyNikKKyMgZGVmaW5lIEJSV19WRTBfU1JDX09GRlNFVF9TSElGVAkwCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9OT1NUT1JFCTAKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFX1NSQwkxCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV8wCTIKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFXzFfRkxUCTMKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFXzFfSU5UCTQKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFX1ZJRAk1CisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV9JSUQJNgorIyBkZWZpbmUgQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfUElECTcKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UXzBfU0hJRlQJMjgKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UXzFfU0hJRlQJMjQKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UXzJfU0hJRlQJMjAKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UXzNfU0hJRlQJMTYKKyMgZGVmaW5lIEJSV19WRTFfRFNUX09GRlNFVF9TSElGVAkwCisKICNkZWZpbmUgQ01EX0lOREVYX0JVRkZFUiAgICAgICAgICAgICAgMHg3ODBhCi0jZGVmaW5lIENNRF9WRl9TVEFUSVNUSUNTICAgICAgICAgICAgIDB4NzgwYgorI2RlZmluZSBDTURfVkZfU1RBVElTVElDU185NjUgICAgICAgICAweDc4MGIKKyNkZWZpbmUgQ01EX1ZGX1NUQVRJU1RJQ1NfR000NSAgICAgICAgMHg2ODBiCiAKICNkZWZpbmUgQ01EX0RSQVdfUkVDVCAgICAgICAgICAgICAgICAgMHg3OTAwCiAjZGVmaW5lIENNRF9CTEVORF9DT05TVEFOVF9DT0xPUiAgICAgIDB4NzkwMQpAQCAtODMyLDYgKzc4Miw3IEBACiAjZGVmaW5lIENNRF9QT0xZX1NUSVBQTEVfUEFUVEVSTiAgICAgIDB4NzkwNwogI2RlZmluZSBDTURfTElORV9TVElQUExFX1BBVFRFUk4gICAgICAweDc5MDgKICNkZWZpbmUgQ01EX0dMT0JBTF9ERVBUSF9PRkZTRVRfQ0xBTVAgMHg3OTA5CisjZGVmaW5lIENNRF9BQV9MSU5FX1BBUkFNRVRFUlMgICAgICAgIDB4NzkwYQogCiAjZGVmaW5lIENNRF9QSVBFX0NPTlRST0wgICAgICAgICAgICAgIDB4N2EwMAogCkBAIC04NDUsNiArNzk2LDEyIEBACiAjZGVmaW5lIFIwMl9QUklNX0VORCAgICAweDEKICNkZWZpbmUgUjAyX1BSSU1fU1RBUlQgIDB4MgogCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgogCisjZGVmaW5lIEJSV19JU19HTTQ1KGJydykgICAgICAgIChJU19HTTQ1X0dNKChicncpLT5pbnRlbC5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpKQorI2RlZmluZSBCUldfSVNfRzRYKGJydykgICAgICAgICAoSVNfRzRYKChicncpLT5pbnRlbC5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpKQorI2RlZmluZSBDTURfUElQRUxJTkVfU0VMRUNUKGJydykgICAgICAgICgoQlJXX0lTX0dNNDUoYnJ3KSB8fCBCUldfSVNfRzRYKGJydykpID8gQ01EX1BJUEVMSU5FX1NFTEVDVF9HTTQ1IDogQ01EX1BJUEVMSU5FX1NFTEVDVF85NjUpCisjZGVmaW5lIENNRF9WRl9TVEFUSVNUSUNTKGJydykgICAgICAgICAgKChCUldfSVNfR000NShicncpIHx8IEJSV19JU19HNFgoYnJ3KSkgPyBDTURfVkZfU1RBVElTVElDU19HTTQ1IDogQ01EX1ZGX1NUQVRJU1RJQ1NfOTY1KQorI2RlZmluZSBVUkJfU0laRVMoYnJ3KSAgICAgICAgICAgICAgICAgICgoQlJXX0lTX0dNNDUoYnJ3KSB8fCBCUldfSVNfRzRYKGJydykpID8gMzg0IDogMjU2KSAgLyogNTEyIGJpdCB1bml0ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZHJhdy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZHJhdy5jCmluZGV4IDBjNjRkN2UuLmQ0M2I1MmMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2RyYXcuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kcmF3LmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJicndfZHJhdy5oIgogI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCiAjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKLSNpbmNsdWRlICJicndfYXViLmgiCiAjaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCiAjaW5jbHVkZSAiYnJ3X2ZhbGxiYWNrLmgiCiAKQEAgLTQ5LDcgKzQ4LDcgQEAKICNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCiAjaW5jbHVkZSAic3dyYXN0X3NldHVwL3N3cmFzdF9zZXR1cC5oIgogCi0KKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX0JBVENICiAKIHN0YXRpYyBHTHVpbnQgaHdfcHJpbVtHTF9QT0xZR09OKzFdID0gewogICAgXzNEUFJJTV9QT0lOVExJU1QsCkBAIC0xMjQsMjUgKzEyMyw2IEBACiB9CiAKIAotc3RhdGljIHZvaWQgYnJ3X2VtaXRfY2xpcHJlY3QoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCAKLQkJCSAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKnJlY3QgKQotewotICAgc3RydWN0IGJyd19kcmF3cmVjdCBiZHI7Ci0KLSAgIGJkci5oZWFkZXIub3Bjb2RlID0gQ01EX0RSQVdfUkVDVDsKLSAgIGJkci5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKGJkcikvNCAtIDI7Ci0gICBiZHIueG1pbiA9IHJlY3QtPngxOwotICAgYmRyLnhtYXggPSByZWN0LT54MiAtIDE7Ci0gICBiZHIueW1pbiA9IHJlY3QtPnkxOwotICAgYmRyLnltYXggPSByZWN0LT55MiAtIDE7Ci0gICBiZHIueG9yZyA9IGJydy0+aW50ZWwuZHJhd1g7Ci0gICBiZHIueW9yZyA9IGJydy0+aW50ZWwuZHJhd1k7Ci0KLSAgIGludGVsX2JhdGNoYnVmZmVyX2RhdGEoIGJydy0+aW50ZWwuYmF0Y2gsICZiZHIsIHNpemVvZihiZHIpLCAKLQkJCSAgIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyk7Ci19Ci0KLQogc3RhdGljIHZvaWQgYnJ3X2VtaXRfcHJpbSggc3RydWN0IGJyd19jb250ZXh0ICpicncsIAogCQkJICAgY29uc3Qgc3RydWN0IF9tZXNhX3ByaW0gKnByaW0gKQogCkBAIC0xNjUsMTAgKzE0NSwxMyBAQAogICAgcHJpbV9wYWNrZXQuc3RhcnRfaW5zdGFuY2VfbG9jYXRpb24gPSAwOwogICAgcHJpbV9wYWNrZXQuYmFzZV92ZXJ0X2xvY2F0aW9uID0gMDsKIAorICAgLyogQ2FuJ3Qgd3JhcCBoZXJlLCBzaW5jZSB3ZSByZWx5IG9uIHRoZSB2YWxpZGF0ZWQgc3RhdGUuICovCisgICBicnctPm5vX2JhdGNoX3dyYXAgPSBHTF9UUlVFOwogICAgaWYgKHByaW1fcGFja2V0LnZlcnRzX3Blcl9pbnN0YW5jZSkgewotICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZGF0YSggYnJ3LT5pbnRlbC5iYXRjaCwgJnByaW1fcGFja2V0LCBzaXplb2YocHJpbV9wYWNrZXQpLCAKLQkJCSAgICAgIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyk7CisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKCBicnctPmludGVsLmJhdGNoLCAmcHJpbV9wYWNrZXQsCisJCQkgICAgICBzaXplb2YocHJpbV9wYWNrZXQpLCBMT09QX0NMSVBSRUNUUyk7CiAgICB9CisgICBicnctPm5vX2JhdGNoX3dyYXAgPSBHTF9GQUxTRTsKIH0KIAogc3RhdGljIHZvaWQgYnJ3X21lcmdlX2lucHV0cyggc3RydWN0IGJyd19jb250ZXh0ICpicncsCkBAIC0yNzEsMTUgKzI1NCwyMyBAQAogICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwogICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOwogICAgR0xib29sZWFuIHJldHZhbCA9IEdMX0ZBTFNFOwotICAgR0x1aW50IGksIGo7CisgICBHTHVpbnQgaTsKIAogICAgaWYgKGN0eC0+TmV3U3RhdGUpCiAgICAgICBfbWVzYV91cGRhdGVfc3RhdGUoIGN0eCApOwogCisgICBicndfdmFsaWRhdGVfdGV4dHVyZXMoIGJydyApOworCiAgICAvKiBCaW5kIGFsbCBpbnB1dHMsIGRlcml2ZSB2YXJ5aW5nIGFuZCBzaXplIGluZm9ybWF0aW9uOgogICAgICovCiAgICBicndfbWVyZ2VfaW5wdXRzKCBicncsIGFycmF5cyApOwotICAgICAgCisKKyAgIGJydy0+aWIuaWIgPSBpYjsKKyAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfSU5ESUNFUzsKKworICAgYnJ3LT52Yi5taW5faW5kZXggPSBtaW5faW5kZXg7CisgICBicnctPnZiLm1heF9pbmRleCA9IG1heF9pbmRleDsKKyAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfVkVSVElDRVM7CiAgICAvKiBIYXZlIHRvIHZhbGlkYXRlIHN0YXRlIHF1aXRlIGxhdGUuICBXaWxsIHJlYnVpbGQgdG5sX3Byb2dyYW0sCiAgICAgKiB3aGljaCBkZXBlbmRzIG9uIHZhcnlpbmcgaW5mb3JtYXRpb24uICAKICAgICAqIApAQCAtMjkwLDEyICsyODEsMjMgQEAKICAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwogCiAgICBpZiAoYnJ3LT5pbnRlbC5udW1DbGlwUmVjdHMgPT0gMCkgewotICAgICAgYXNzZXJ0KGludGVsLT5iYXRjaC0+cHRyID09IGludGVsLT5iYXRjaC0+bWFwICsgaW50ZWwtPmJhdGNoLT5vZmZzZXQpOwogICAgICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKICAgICAgIHJldHVybiBHTF9UUlVFOwogICAgfQogCiAgICB7CisgICAgICAvKiBGbHVzaCB0aGUgYmF0Y2ggaWYgaXQncyBhcHByb2FjaGluZyBmdWxsLCBzbyB0aGF0IHdlIGRvbid0IHdyYXAgd2hpbGUKKyAgICAgICAqIHdlJ3ZlIGdvdCB2YWxpZGF0ZWQgc3RhdGUgdGhhdCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBiYXRjaCBhcyB0aGUKKyAgICAgICAqIHByaW1pdGl2ZXMuICBUaGlzIGZyYWN0aW9uIGlzIGp1c3QgYSBndWVzcyAobWluaW1hbCBmdWxsIHN0YXRlIHBsdXMKKyAgICAgICAqIGEgcHJpbWl0aXZlIGlzIGFyb3VuZCA1MTIgYnl0ZXMpLCBhbmQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGhhZAorICAgICAgICogYW4gdXBwZXIgYm91bmQgb2YgaG93IG11Y2ggd2UgbWlnaHQgZW1pdCBpbiBhIHNpbmdsZQorICAgICAgICogYnJ3X3RyeV9kcmF3X3ByaW1zKCkuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnRlbC0+YmF0Y2gtPnB0ciAtIGludGVsLT5iYXRjaC0+bWFwID4gaW50ZWwtPmJhdGNoLT5zaXplICogMyAvIDQKKwkvKiBicndfZW1pdF9wcmltIG1heSBjaGFuZ2UgdGhlIGNsaXByZWN0X21vZGUgdG8gTE9PUF9DTElQUkVDVFMgKi8KKwkgIHx8IGludGVsLT5iYXRjaC0+Y2xpcHJlY3RfbW9kZSAhPSBMT09QX0NMSVBSRUNUUykKKwkgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChpbnRlbC0+YmF0Y2gpOworCiAgICAgICAvKiBTZXQgdGhlIGZpcnN0IHByaW1pdGl2ZSBlYXJseSwgYWhlYWQgb2YgdmFsaWRhdGVfc3RhdGU6CiAgICAgICAgKi8KICAgICAgIGJyd19zZXRfcHJpbShicncsIHByaW1bMF0ubW9kZSk7CkBAIC0zMTEsNzEgKzMxMywxNSBAQAogCiAgICAgICBpZiAoY2hlY2tfZmFsbGJhY2tzKCBicncsIHByaW0sIG5yX3ByaW1zICkpCiAJIGdvdG8gb3V0OwotCSAgCi0gICAgICAvKiBVcGxvYWQgaW5kZXgsIHZlcnRleCBkYXRhOiAKLSAgICAgICAqLwotICAgICAgaWYgKGliKQotCSBicndfdXBsb2FkX2luZGljZXMoIGJydywgaWIgKTsKIAotICAgICAgaWYgKCFicndfdXBsb2FkX3ZlcnRpY2VzKCBicncsIG1pbl9pbmRleCwgbWF4X2luZGV4KSkgewotCSBnb3RvIG91dDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9wcmltczsgaSsrKSB7CisJIGJyd19lbWl0X3ByaW0oYnJ3LCAmcHJpbVtpXSk7CiAgICAgICB9CiAKLSAgICAgIC8qIEZvciBzaW5nbGUgY2xpcHJlY3QsIHN0YXRlIGlzIGFscmVhZHkgZW1pdHRlZDogCi0gICAgICAgKi8KLSAgICAgIGlmIChicnctPmludGVsLm51bUNsaXBSZWN0cyA9PSAxKSB7Ci0JIGZvciAoaSA9IDA7IGkgPCBucl9wcmltczsgaSsrKSB7Ci0JICAgIGJyd19lbWl0X3ByaW0oYnJ3LCAmcHJpbVtpXSk7ICAgCi0JIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCSAvKiBPdGhlcndpc2UsIGV4cGxpY2l0bHkgZG8gdGhlIGNsaXByZWN0cyBhdCB0aGlzIHBvaW50OgotCSAgKi8KLQkgZm9yIChqID0gMDsgaiA8IGJydy0+aW50ZWwubnVtQ2xpcFJlY3RzOyBqKyspIHsKLQkgICAgYnJ3X2VtaXRfY2xpcHJlY3QoYnJ3LCAmYnJ3LT5pbnRlbC5wQ2xpcFJlY3RzW2pdKTsKLQotCSAgICAvKiBFbWl0IHByaW1zIHRvIGJhdGNoYnVmZmVyOiAKLQkgICAgICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBucl9wcmltczsgaSsrKSB7Ci0JICAgICAgIGJyd19lbWl0X3ByaW0oYnJ3LCAmcHJpbVtpXSk7ICAgCi0JICAgIH0KLQkgfQotICAgICAgfQotICAgICAgCi0gICAgICBpbnRlbC0+bmVlZF9mbHVzaCA9IEdMX1RSVUU7CiAgICAgICByZXR2YWwgPSBHTF9UUlVFOwogICAgfQogCiAgb3V0OgotCi0gICAvKiBDdXJyZW50bHkgaGF2ZSB0byBkbyB0aGlzIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIG1hcC91bm1hcCBvZgotICAgICogdGhlIHZlcnRleCBidWZmZXIgaW4gYnJ3X2V4ZWNfYXBpLmMuICBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhbnkKLSAgICAqIHdheSBhcm91bmQgdGhpcywgYXMgbm90IGV2ZXJ5IGZsdXNoIGlzIGR1ZSB0byBhIGJ1ZmZlciBmaWxsaW5nCi0gICAgKiB1cC4KLSAgICAqLwotICAgaWYgKCFpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaCggYnJ3LT5pbnRlbC5iYXRjaCApKSB7Ci0gICAgICBEQkcoIiVzIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHZhbCA9IEdMX0ZBTFNFOwotICAgfQotCi0gICBpZiAocmV0dmFsICYmIGludGVsLT50aHJhc2hpbmcpIHsKLSAgICAgIGJtU2V0RmVuY2UoaW50ZWwpOwotICAgfQotCi0gICAvKiBGcmVlIGFueSBvbGQgZGF0YSBzbyBpdCBkb2Vzbid0IGNsb2cgdXAgdGV4dHVyZSBtZW1vcnkgLSB3ZQotICAgICogd29uJ3QgYmUgcmVmZXJlbmNpbmcgaXQgYWdhaW4uCi0gICAgKi8KLSAgIHdoaWxlIChicnctPnZiLnVwbG9hZC53cmFwICE9IGJydy0+dmIudXBsb2FkLmJ1ZikgewotICAgICAgY3R4LT5Ecml2ZXIuQnVmZmVyRGF0YShjdHgsCi0JCQkgICAgIEdMX0FSUkFZX0JVRkZFUl9BUkIsCi0JCQkgICAgIEJSV19VUExPQURfSU5JVF9TSVpFLAotCQkJICAgICBOVUxMLAotCQkJICAgICBHTF9EWU5BTUlDX0RSQVdfQVJCLAotCQkJICAgICBicnctPnZiLnVwbG9hZC52Ym9bYnJ3LT52Yi51cGxvYWQud3JhcF0pOwotICAgICAgYnJ3LT52Yi51cGxvYWQud3JhcCsrOwotICAgICAgYnJ3LT52Yi51cGxvYWQud3JhcCAlPSBCUldfTlJfVVBMT0FEX0JVRlM7Ci0gICB9Ci0KICAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CiAKICAgIGlmICghcmV0dmFsKQpAQCAtNDIwLDcgKzM2Niw2IEBACiAJCSAgICAgR0x1aW50IG1pbl9pbmRleCwKIAkJICAgICBHTHVpbnQgbWF4X2luZGV4ICkKIHsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKICAgIEdMYm9vbGVhbiByZXR2YWw7CiAKICAgIC8qIERlY2lkZSBpZiB3ZSB3YW50IHRvIHJlYmFzZS4gIElmIHNvIHdlIGVuZCB1cCByZWN1cnNpbmcgb25jZQpAQCAtNDQwLDIwICszODUsNiBAQAogICAgICovCiAgICByZXR2YWwgPSBicndfdHJ5X2RyYXdfcHJpbXMoY3R4LCBhcnJheXMsIHByaW0sIG5yX3ByaW1zLCBpYiwgbWluX2luZGV4LCBtYXhfaW5kZXgpOwogCi0gICAKLSAgIC8qIFRoaXMgbG9va3MgbGlrZSBvdXQtb2YtbWVtb3J5IGJ1dCBwb3RlbnRpYWxseSB3ZSBoYXZlCi0gICAgKiBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSBidXQgaXQgaGFzIGJlY29tZQotICAgICogZnJhZ21lbnRlZC4gIENsZWFyIG91dCBhbGwgaGVhcHMgYW5kIHN0YXJ0IGZyb20gc2NyYXRjaCBieQotICAgICogZmFraW5nIGEgY29udGVuZGVkIGxvY2sgZXZlbnQ6ICAoZG9uZSBlbHNld2hlcmUpCi0gICAgKi8KLSAgIGlmICghcmV0dmFsICYmICFpbnRlbC0+RmFsbGJhY2sgJiYgYm1FcnJvcihpbnRlbCkpIHsKLSAgICAgIERCRygicmV0cnlpbmdcbiIpOwotICAgICAgLyogVGhlbiB0cnkgYSBzZWNvbmQgdGltZSBvbmx5IHRvIHVwbG9hZCB0ZXh0dXJlcyBhbmQgZHJhdyB0aGUKLSAgICAgICAqIHByaW1pdGl2ZXM6Ci0gICAgICAgKi8KLSAgICAgIHJldHZhbCA9IGJyd190cnlfZHJhd19wcmltcyhjdHgsIGFycmF5cywgcHJpbSwgbnJfcHJpbXMsIGliLCBtaW5faW5kZXgsIG1heF9pbmRleCk7Ci0gICB9Ci0KICAgIC8qIE90aGVyd2lzZSwgd2UgcmVhbGx5IGFyZSBvdXQgb2YgbWVtb3J5LiAgUGFzcyB0aGUgZHJhd2luZwogICAgICogY29tbWFuZCB0byB0aGUgc29mdHdhcmUgdG5sIG1vZHVsZSBhbmQgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwKICAgICAqIHN3cmFzdCB0byBkbyB0aGUgZHJhd2luZy4KQEAgLTQ2Miw1NyArMzkzLDIyIEBACiAgICAgICAgX3N3c2V0dXBfV2FrZXVwKGN0eCk7CiAgICAgICBfdG5sX2RyYXdfcHJpbXMoY3R4LCBhcnJheXMsIHByaW0sIG5yX3ByaW1zLCBpYiwgbWluX2luZGV4LCBtYXhfaW5kZXgpOwogICAgfQotCi0gICBpZiAoaW50ZWwtPmF1Yl9maWxlICYmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NZTkMpKSB7Ci0gICAgICBpbnRlbEZpbmlzaCggJmludGVsLT5jdHggKTsKLSAgICAgIGludGVsLT5hdWJfd3JhcCA9IDE7Ci0gICB9CiB9CiAKLQotc3RhdGljIHZvaWQgYnJ3X2ludmFsaWRhdGVfdmJvX2NiKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHZvaWQgKnB0ciApCi17Ci0gICAvKiBub3RoaW5nIHRvIGRvLCB3ZSBkb24ndCByZWx5IG9uIHRoZSBjb250ZW50cyBiZWluZyBwcmVzZXJ2ZWQgKi8KLX0KLQotCiB2b2lkIGJyd19kcmF3X2luaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OwogICAgc3RydWN0IHZib19jb250ZXh0ICp2Ym8gPSB2Ym9fY29udGV4dChjdHgpOwotICAgR0x1aW50IGk7Ci0gICAKKwogICAgLyogUmVnaXN0ZXIgb3VyIGRyYXdpbmcgZnVuY3Rpb246IAogICAgICovCiAgICB2Ym8tPmRyYXdfcHJpbXMgPSBicndfZHJhd19wcmltczsKLQotICAgYnJ3LT52Yi51cGxvYWQuc2l6ZSA9IEJSV19VUExPQURfSU5JVF9TSVpFOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgQlJXX05SX1VQTE9BRF9CVUZTOyBpKyspIHsKLSAgICAgIGJydy0+dmIudXBsb2FkLnZib1tpXSA9IGN0eC0+RHJpdmVyLk5ld0J1ZmZlck9iamVjdChjdHgsIDEsIEdMX0FSUkFZX0JVRkZFUl9BUkIpOwotICAgICAgCi0gICAgICAvKiBOT1RFOiAgVGhlc2UgYXJlIHNldCB0byBuby1iYWNraW5nLXN0b3JlLgotICAgICAgICovCi0gICAgICBibUJ1ZmZlclNldEludmFsaWRhdGVDQigmYnJ3LT5pbnRlbCwKLQkJCSAgICAgIGludGVsX2J1ZmZlcm9ial9idWZmZXIoaW50ZWxfYnVmZmVyX29iamVjdChicnctPnZiLnVwbG9hZC52Ym9baV0pKSwKLQkJCSAgICAgIGJyd19pbnZhbGlkYXRlX3Zib19jYiwKLQkJCSAgICAgICZicnctPmludGVsLAotCQkJICAgICAgR0xfVFJVRSk7Ci0gICB9Ci0KLSAgIGN0eC0+RHJpdmVyLkJ1ZmZlckRhdGEoIGN0eCwgCi0JCQkgICBHTF9BUlJBWV9CVUZGRVJfQVJCLCAKLQkJCSAgIEJSV19VUExPQURfSU5JVF9TSVpFLAotCQkJICAgTlVMTCwKLQkJCSAgIEdMX0RZTkFNSUNfRFJBV19BUkIsCi0JCQkgICBicnctPnZiLnVwbG9hZC52Ym9bMF0gKTsKIH0KIAogdm9pZCBicndfZHJhd19kZXN0cm95KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZicnctPmludGVsLmN0eDsKLSAgIEdMdWludCBpOwotICAgCi0gICBmb3IgKGkgPSAwOyBpIDwgQlJXX05SX1VQTE9BRF9CVUZTOyBpKyspCi0gICAgICBjdHgtPkRyaXZlci5EZWxldGVCdWZmZXIoY3R4LCBicnctPnZiLnVwbG9hZC52Ym9baV0pOworICAgaWYgKGJydy0+dmIudXBsb2FkLmJvICE9IE5VTEwpIHsKKyAgICAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPnZiLnVwbG9hZC5ibyk7CisgICAgICBicnctPnZiLnVwbG9hZC5ibyA9IE5VTEw7CisgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kcmF3LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kcmF3LmgKaW5kZXggMGY3YjczOC4uMmEzZTBjMSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZHJhdy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2RyYXcuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIm10eXBlcy5oIgkJLyogZm9yIEdMY29udGV4dC4uLiAqLwogI2luY2x1ZGUgInZiby92Ym8uaCIKIAorI2luY2x1ZGUgImRyaV9idWZtZ3IuaCIKIHN0cnVjdCBicndfY29udGV4dDsKIAogCkBAIC01MCwxNiArNTEsNCBAQAogdm9pZCBicndfaW5pdF9jdXJyZW50X3ZhbHVlcyhHTGNvbnRleHQgKmN0eCwKIAkJCSAgICAgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqYXJyYXlzKTsKIAotCi0vKiBicndfZHJhd191cGxvYWQuYwotICovCi12b2lkIGJyd191cGxvYWRfaW5kaWNlcyggc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCQkgY29uc3Qgc3RydWN0IF9tZXNhX2luZGV4X2J1ZmZlciAqaW5kZXhfYnVmZmVyKTsKLQotR0xib29sZWFuIGJyd191cGxvYWRfdmVydGljZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJICAgICAgIEdMdWludCBtaW5faW5kZXgsCi0JCQkgICAgICAgR0x1aW50IG1heF9pbmRleCApOwotCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kcmF3X3VwbG9hZC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZHJhd191cGxvYWQuYwppbmRleCA2MTUwY2FjLi4wMTIyZDE4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19kcmF3X3VwbG9hZC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2RyYXdfdXBsb2FkLmMKQEAgLTM2LDQzICszNiwxMyBAQAogI2luY2x1ZGUgImJyd19kcmF3LmgiCiAjaW5jbHVkZSAiYnJ3X2RlZmluZXMuaCIKICNpbmNsdWRlICJicndfY29udGV4dC5oIgotI2luY2x1ZGUgImJyd19hdWIuaCIKICNpbmNsdWRlICJicndfc3RhdGUuaCIKICNpbmNsdWRlICJicndfZmFsbGJhY2suaCIKIAogI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKICNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgotCi0KLXN0cnVjdCBicndfYXJyYXlfc3RhdGUgewotICAgdW5pb24gaGVhZGVyX3VuaW9uIGhlYWRlcjsKLQotICAgc3RydWN0IHsKLSAgICAgIHVuaW9uIHsKLQkgc3RydWN0IHsKLQkgICAgR0x1aW50IHBpdGNoOjExOyAKLQkgICAgR0x1aW50IHBhZDoxNTsKLQkgICAgR0x1aW50IGFjY2Vzc190eXBlOjE7IAotCSAgICBHTHVpbnQgdmJfaW5kZXg6NTsgCi0JIH0gYml0czsKLQkgR0x1aW50IGR3b3JkOwotICAgICAgfSB2YjA7Ci0gICAKLSAgICAgIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcjsKLSAgICAgIEdMdWludCBvZmZzZXQ7Ci0KLSAgICAgIEdMdWludCBtYXhfaW5kZXg7ICAgCi0gICAgICBHTHVpbnQgaW5zdGFuY2VfZGF0YV9zdGVwX3JhdGU7Ci0KLSAgIH0gdmJbQlJXX1ZCUF9NQVhdOwotfTsKLQotCi1zdGF0aWMgc3RydWN0IGJ1ZmZlciAqYXJyYXlfYnVmZmVyKCBjb25zdCBzdHJ1Y3QgZ2xfY2xpZW50X2FycmF5ICphcnJheSApCi17Ci0gICByZXR1cm4gaW50ZWxfYnVmZmVyb2JqX2J1ZmZlcihpbnRlbF9idWZmZXJfb2JqZWN0KGFycmF5LT5CdWZmZXJPYmopKTsKLX0KKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKIAogc3RhdGljIEdMdWludCBkb3VibGVfdHlwZXNbNV0gPSB7CiAgICAwLApAQCAtMjQ3LDE5NCArMjE3LDE2NSBAQAogICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5X3N0cmlkZWRfYXJyYXkoIEdMdWJ5dGUgKmRlc3QsIAotCQkJCWNvbnN0IEdMdWJ5dGUgKnNyYywgCi0JCQkJR0x1aW50IHNpemUsIAotCQkJCUdMdWludCBzdHJpZGUsCi0JCQkJR0x1aW50IGNvdW50ICkKLXsKLSAgIGlmIChzaXplID09IHN0cmlkZSkgCi0gICAgICBkb19tZW1jcHkoZGVzdCwgc3JjLCBjb3VudCAqIHNpemUpOwotICAgZWxzZSB7Ci0gICAgICBHTHVpbnQgaSxqOwotICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCSBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKQotCSAgICAqZGVzdCsrID0gKnNyYysrOwotCSBzcmMgKz0gKHN0cmlkZSAtIHNpemUpOwotICAgICAgfQotICAgfQotfQotCiBzdGF0aWMgdm9pZCB3cmFwX2J1ZmZlcnMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAogCQkJICBHTHVpbnQgc2l6ZSApCiB7Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZicnctPmludGVsLmN0eDsKLQogICAgaWYgKHNpemUgPCBCUldfVVBMT0FEX0lOSVRfU0laRSkKICAgICAgIHNpemUgPSBCUldfVVBMT0FEX0lOSVRfU0laRTsKIAotICAgYnJ3LT52Yi51cGxvYWQuYnVmKys7Ci0gICBicnctPnZiLnVwbG9hZC5idWYgJT0gQlJXX05SX1VQTE9BRF9CVUZTOwogICAgYnJ3LT52Yi51cGxvYWQub2Zmc2V0ID0gMDsKIAotICAgY3R4LT5Ecml2ZXIuQnVmZmVyRGF0YShjdHgsCi0JCQkgIEdMX0FSUkFZX0JVRkZFUl9BUkIsCi0JCQkgIHNpemUsCi0JCQkgIE5VTEwsCi0JCQkgIEdMX0RZTkFNSUNfRFJBV19BUkIsCi0JCQkgIGJydy0+dmIudXBsb2FkLnZib1ticnctPnZiLnVwbG9hZC5idWZdKTsKKyAgIGlmIChicnctPnZiLnVwbG9hZC5ibyAhPSBOVUxMKQorICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+dmIudXBsb2FkLmJvKTsKKyAgIGJydy0+dmIudXBsb2FkLmJvID0gZHJpX2JvX2FsbG9jKGJydy0+aW50ZWwuYnVmbWdyLCAidGVtcG9yYXJ5IFZCTyIsCisJCQkJICAgIHNpemUsIDEpOworCisgICAvKiBTZXQgdGhlIGludGVybmFsIFZCT1wgdG8gbm8tYmFja2luZy1zdG9yZS4gIFdlIG9ubHkgdXNlIHRoZW0gYXMgYQorICAgICogdGVtcG9yYXJ5IHdpdGhpbiBhIGJyd190cnlfZHJhd19wcmltcyB3aGlsZSB0aGUgbG9jayBpcyBoZWxkLgorICAgICovCisgICAvKiBET04nVCBETyBUSElTIEFTIElGIFdFIEhBVkUgVE8gUkUtT1JHIE1FTU9SWSBXRSBORUVEIFNPTUVXSEVSRSBXSVRICisgICAgICBGQUtFIFRPIFBVU0ggVEhJUyBTVFVGRiAqLworLy8gICBpZiAoIWJydy0+aW50ZWwudHRtKQorLy8gICAgICBkcmlfYm9fZmFrZV9kaXNhYmxlX2JhY2tpbmdfc3RvcmUoYnJ3LT52Yi51cGxvYWQuYm8sIE5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBnZXRfc3BhY2UoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAogCQkgICAgICAgR0x1aW50IHNpemUsCi0JCSAgICAgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqKnZib19yZXR1cm4sCisJCSAgICAgICBkcmlfYm8gKipib19yZXR1cm4sCiAJCSAgICAgICBHTHVpbnQgKm9mZnNldF9yZXR1cm4gKQogewotICAgc2l6ZSA9IChzaXplICsgNjMpICYgfjYzOwotICAgCi0gICBpZiAoYnJ3LT52Yi51cGxvYWQub2Zmc2V0ICsgc2l6ZSA+IEJSV19VUExPQURfSU5JVF9TSVpFKQotICAgICAgd3JhcF9idWZmZXJzKGJydywgc2l6ZSk7CisgICBzaXplID0gQUxJR04oc2l6ZSwgNjQpOwogCi0gICAqdmJvX3JldHVybiA9IGJydy0+dmIudXBsb2FkLnZib1ticnctPnZiLnVwbG9hZC5idWZdOworICAgaWYgKGJydy0+dmIudXBsb2FkLmJvID09IE5VTEwgfHwKKyAgICAgICBicnctPnZiLnVwbG9hZC5vZmZzZXQgKyBzaXplID4gYnJ3LT52Yi51cGxvYWQuYm8tPnNpemUpIHsKKyAgICAgIHdyYXBfYnVmZmVycyhicncsIHNpemUpOworICAgfQorCisgICBkcmlfYm9fcmVmZXJlbmNlKGJydy0+dmIudXBsb2FkLmJvKTsKKyAgICpib19yZXR1cm4gPSBicnctPnZiLnVwbG9hZC5ibzsKICAgICpvZmZzZXRfcmV0dXJuID0gYnJ3LT52Yi51cGxvYWQub2Zmc2V0OwogCiAgICBicnctPnZiLnVwbG9hZC5vZmZzZXQgKz0gc2l6ZTsKIH0KIAotCi0KLXN0YXRpYyBzdHJ1Y3QgZ2xfY2xpZW50X2FycmF5ICoKK3N0YXRpYyB2b2lkCiBjb3B5X2FycmF5X3RvX3Zib19hcnJheSggc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCQkgR0x1aW50IGksCi0JCQkgY29uc3Qgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqYXJyYXksCi0JCQkgR0x1aW50IGVsZW1lbnRfc2l6ZSwKLQkJCSBHTHVpbnQgY291bnQpCisJCQkgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqZWxlbWVudCwKKwkJCSBHTHVpbnQgZHN0X3N0cmlkZSkKIHsKLSAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OwotICAgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqdmJvX2FycmF5ID0gJmJydy0+dmIudmJvX2FycmF5W2ldOwotICAgR0x1aW50IHNpemUgPSBjb3VudCAqIGVsZW1lbnRfc2l6ZTsKLSAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICp2Ym87Ci0gICBHTHVpbnQgb2Zmc2V0OwotICAgR0x1aW50IG5ld19zdHJpZGU7CisgICBHTHVpbnQgc2l6ZSA9IGVsZW1lbnQtPmNvdW50ICogZHN0X3N0cmlkZTsKIAotICAgZ2V0X3NwYWNlKGJydywgc2l6ZSwgJnZibywgJm9mZnNldCk7CisgICBnZXRfc3BhY2UoYnJ3LCBzaXplLCAmZWxlbWVudC0+Ym8sICZlbGVtZW50LT5vZmZzZXQpOwogCi0gICBpZiAoYXJyYXktPlN0cmlkZUIgPT0gMCkgewotICAgICAgYXNzZXJ0KGNvdW50ID09IDEpOwotICAgICAgbmV3X3N0cmlkZSA9IDA7Ci0gICB9Ci0gICBlbHNlIAotICAgICAgbmV3X3N0cmlkZSA9IGVsZW1lbnRfc2l6ZTsKLQotICAgdmJvX2FycmF5LT5TaXplID0gYXJyYXktPlNpemU7Ci0gICB2Ym9fYXJyYXktPlR5cGUgPSBhcnJheS0+VHlwZTsKLSAgIHZib19hcnJheS0+U3RyaWRlID0gbmV3X3N0cmlkZTsKLSAgIHZib19hcnJheS0+U3RyaWRlQiA9IG5ld19zdHJpZGU7ICAgCi0gICB2Ym9fYXJyYXktPlB0ciA9IChjb25zdCB2b2lkICopb2Zmc2V0OwotICAgdmJvX2FycmF5LT5FbmFibGVkID0gMTsKLSAgIHZib19hcnJheS0+Tm9ybWFsaXplZCA9IGFycmF5LT5Ob3JtYWxpemVkOwotICAgdmJvX2FycmF5LT5fTWF4RWxlbWVudCA9IGFycmF5LT5fTWF4RWxlbWVudDsJLyogPyAqLwotICAgdmJvX2FycmF5LT5CdWZmZXJPYmogPSB2Ym87Ci0KLSAgIHsKLSAgICAgIEdMdWJ5dGUgKm1hcCA9IGN0eC0+RHJpdmVyLk1hcEJ1ZmZlcihjdHgsCi0JCQkJCSAgIEdMX0FSUkFZX0JVRkZFUl9BUkIsCi0JCQkJCSAgIEdMX0RZTkFNSUNfRFJBV19BUkIsCi0JCQkJCSAgIHZibyk7Ci0gICAKLSAgICAgIG1hcCArPSBvZmZzZXQ7Ci0KLSAgICAgIGNvcHlfc3RyaWRlZF9hcnJheSggbWFwLCAKLQkJCSAgYXJyYXktPlB0ciwKLQkJCSAgZWxlbWVudF9zaXplLAotCQkJICBhcnJheS0+U3RyaWRlQiwKLQkJCSAgY291bnQpOwotCi0gICAgICBjdHgtPkRyaXZlci5Vbm1hcEJ1ZmZlcihjdHgsIEdMX0FSUkFZX0JVRkZFUl9BUkIsIHZib19hcnJheS0+QnVmZmVyT2JqKTsKKyAgIGlmIChlbGVtZW50LT5nbGFycmF5LT5TdHJpZGVCID09IDApIHsKKyAgICAgIGFzc2VydChlbGVtZW50LT5jb3VudCA9PSAxKTsKKyAgICAgIGVsZW1lbnQtPnN0cmlkZSA9IDA7CisgICB9IGVsc2UgeworICAgICAgZWxlbWVudC0+c3RyaWRlID0gZHN0X3N0cmlkZTsKICAgIH0KIAotICAgcmV0dXJuIHZib19hcnJheTsKKyAgIGlmIChkc3Rfc3RyaWRlID09IGVsZW1lbnQtPmdsYXJyYXktPlN0cmlkZUIpIHsKKyAgICAgIGRyaV9ib19zdWJkYXRhKGVsZW1lbnQtPmJvLAorCQkgICAgIGVsZW1lbnQtPm9mZnNldCwKKwkJICAgICBzaXplLAorCQkgICAgIGVsZW1lbnQtPmdsYXJyYXktPlB0cik7CisgICB9IGVsc2UgeworICAgICAgdm9pZCAqZGF0YTsKKyAgICAgIGNoYXIgKmRlc3Q7CisgICAgICBjb25zdCBjaGFyICpzcmMgPSBlbGVtZW50LT5nbGFycmF5LT5QdHI7CisgICAgICBpbnQgaTsKKworICAgICAgZGF0YSA9IF9tZXNhX21hbGxvYyhkc3Rfc3RyaWRlICogZWxlbWVudC0+Y291bnQpOworICAgICAgZGVzdCA9IGRhdGE7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudC0+Y291bnQ7IGkrKykgeworCSBtZW1jcHkoZGVzdCwgc3JjLCBkc3Rfc3RyaWRlKTsKKwkgc3JjICs9IGVsZW1lbnQtPmdsYXJyYXktPlN0cmlkZUI7CisJIGRlc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgIH0KKworICAgICAgZHJpX2JvX3N1YmRhdGEoZWxlbWVudC0+Ym8sCisJCSAgICAgZWxlbWVudC0+b2Zmc2V0LAorCQkgICAgIHNpemUsCisJCSAgICAgZGF0YSk7CisgICAgICBfbWVzYV9mcmVlKGRhdGEpOworICAgfQogfQogCi0KLQotc3RhdGljIHN0cnVjdCBnbF9jbGllbnRfYXJyYXkgKgotaW50ZXJsZWF2ZWRfdmJvX2FycmF5KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKLQkJICAgICAgIEdMdWludCBpLAotCQkgICAgICAgY29uc3Qgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqdXBsb2FkZWRfYXJyYXksCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfY2xpZW50X2FycmF5ICphcnJheSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnB0cikKLXsKLSAgIHN0cnVjdCBnbF9jbGllbnRfYXJyYXkgKnZib19hcnJheSA9ICZicnctPnZiLnZib19hcnJheVtpXTsKLQotICAgdmJvX2FycmF5LT5TaXplID0gYXJyYXktPlNpemU7Ci0gICB2Ym9fYXJyYXktPlR5cGUgPSBhcnJheS0+VHlwZTsKLSAgIHZib19hcnJheS0+U3RyaWRlID0gYXJyYXktPlN0cmlkZTsKLSAgIHZib19hcnJheS0+U3RyaWRlQiA9IGFycmF5LT5TdHJpZGVCOyAgIAotICAgdmJvX2FycmF5LT5QdHIgPSAoY29uc3Qgdm9pZCAqKSgoY29uc3QgY2hhciAqKXVwbG9hZGVkX2FycmF5LT5QdHIgKyAKLQkJCQkgICAoKGNvbnN0IGNoYXIgKilhcnJheS0+UHRyIC0gcHRyKSk7Ci0gICB2Ym9fYXJyYXktPkVuYWJsZWQgPSAxOwotICAgdmJvX2FycmF5LT5Ob3JtYWxpemVkID0gYXJyYXktPk5vcm1hbGl6ZWQ7Ci0gICB2Ym9fYXJyYXktPl9NYXhFbGVtZW50ID0gYXJyYXktPl9NYXhFbGVtZW50OwkKLSAgIHZib19hcnJheS0+QnVmZmVyT2JqID0gdXBsb2FkZWRfYXJyYXktPkJ1ZmZlck9iajsKLQotICAgcmV0dXJuIHZib19hcnJheTsKLX0KLQotCi1HTGJvb2xlYW4gYnJ3X3VwbG9hZF92ZXJ0aWNlcyggc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCQkgICAgICAgR0x1aW50IG1pbl9pbmRleCwKLQkJCSAgICAgICBHTHVpbnQgbWF4X2luZGV4ICkKK3N0YXRpYyB2b2lkIGJyd19wcmVwYXJlX3ZlcnRpY2VzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgR0xjb250ZXh0ICpjdHggPSAmYnJ3LT5pbnRlbC5jdHg7CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CiAgICBHTHVpbnQgdG1wID0gYnJ3LT52cy5wcm9nX2RhdGEtPmlucHV0c19yZWFkOyAKLSAgIHN0cnVjdCBicndfdmVydGV4X2VsZW1lbnRfcGFja2V0IHZlcDsKLSAgIHN0cnVjdCBicndfYXJyYXlfc3RhdGUgdmJwOwogICAgR0x1aW50IGk7Ci0gICBjb25zdCB2b2lkICpwdHIgPSBOVUxMOworICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gTlVMTDsKICAgIEdMdWludCBpbnRlcmxlYXZlID0gMDsKKyAgIHVuc2lnbmVkIGludCBtaW5faW5kZXggPSBicnctPnZiLm1pbl9pbmRleDsKKyAgIHVuc2lnbmVkIGludCBtYXhfaW5kZXggPSBicnctPnZiLm1heF9pbmRleDsKIAogICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqZW5hYmxlZFtWRVJUX0FUVFJJQl9NQVhdOwogICAgR0x1aW50IG5yX2VuYWJsZWQgPSAwOwogCiAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50ICp1cGxvYWRbVkVSVF9BVFRSSUJfTUFYXTsKICAgIEdMdWludCBucl91cGxvYWRzID0gMDsKLSAgIAotCi0gICBtZW1zZXQoJnZicCwgMCwgc2l6ZW9mKHZicCkpOwotICAgbWVtc2V0KCZ2ZXAsIDAsIHNpemVvZih2ZXApKTsKIAogICAgLyogRmlyc3QgYnVpbGQgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmUncyBpbiB2Yi5pbnB1dHNfcmVhZAogICAgICovCiAgICBpZiAoMCkKICAgICAgIF9tZXNhX3ByaW50ZigiJXMgJWQuLiVkXG4iLCBfX0ZVTkNUSU9OX18sIG1pbl9pbmRleCwgbWF4X2luZGV4KTsKLSAgIAorCisgICAvKiBBY2N1bXVsYXRlIHRoZSBsaXN0IG9mIGVuYWJsZWQgYXJyYXlzLiAqLwogICAgd2hpbGUgKHRtcCkgewogICAgICAgR0x1aW50IGkgPSBfbWVzYV9mZnNsbCh0bXApLTE7CiAgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50ICppbnB1dCA9ICZicnctPnZiLmlucHV0c1tpXTsKIAogICAgICAgdG1wICY9IH4oMTw8aSk7CiAgICAgICBlbmFibGVkW25yX2VuYWJsZWQrK10gPSBpbnB1dDsKKyAgIH0KIAotICAgICAgaW5wdXQtPmluZGV4ID0gaTsKKyAgIC8qIFhYWDogSW4gdGhlIHJhcmUgY2FzZXMgd2hlcmUgdGhpcyBoYXBwZW5zIHdlIGZhbGxiYWNrIGFsbAorICAgICogdGhlIHdheSB0byBzb2Z0d2FyZSByYXN0ZXJpemF0aW9uLCBhbHRob3VnaCBhIHRubCBmYWxsYmFjaworICAgICogd291bGQgYmUgc3VmZmljaWVudC4gIEkgZG9uJ3Qga25vdyBvZiAqYW55KiByZWFsIHdvcmxkCisgICAgKiBjYXNlcyB3aXRoID4gMTcgdmVydGV4IGF0dHJpYnV0ZXMgZW5hYmxlZCwgc28gaXQgcHJvYmFibHkKKyAgICAqIGlzbid0IGFuIGlzc3VlIGF0IHRoaXMgcG9pbnQuCisgICAgKi8KKyAgIGlmIChucl9lbmFibGVkID49IEJSV19WRVBfTUFYKSB7CisgICAgICBpbnRlbC0+RmFsbGJhY2sgPSAxOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKGkgPSAwOyBpIDwgbnJfZW5hYmxlZDsgaSsrKSB7CisgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50ICppbnB1dCA9IGVuYWJsZWRbaV07CisKICAgICAgIGlucHV0LT5lbGVtZW50X3NpemUgPSBnZXRfc2l6ZShpbnB1dC0+Z2xhcnJheS0+VHlwZSkgKiBpbnB1dC0+Z2xhcnJheS0+U2l6ZTsKICAgICAgIGlucHV0LT5jb3VudCA9IGlucHV0LT5nbGFycmF5LT5TdHJpZGVCID8gbWF4X2luZGV4ICsgMSAtIG1pbl9pbmRleCA6IDE7CiAKLSAgICAgIGlmICghaW5wdXQtPmdsYXJyYXktPkJ1ZmZlck9iai0+TmFtZSkgeworICAgICAgaWYgKGlucHV0LT5nbGFycmF5LT5CdWZmZXJPYmotPk5hbWUgIT0gMCkgeworCSBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqaW50ZWxfYnVmZmVyID0KKwkgICAgaW50ZWxfYnVmZmVyX29iamVjdChpbnB1dC0+Z2xhcnJheS0+QnVmZmVyT2JqKTsKKworCSAvKiBOYW1lZCBidWZmZXIgb2JqZWN0OiBKdXN0IHJlZmVyZW5jZSBpdHMgY29udGVudHMgZGlyZWN0bHkuICovCisJIGlucHV0LT5ibyA9IGludGVsX2J1ZmZlcm9ial9idWZmZXIoaW50ZWwsIGludGVsX2J1ZmZlciwKKwkJCQkJICAgIElOVEVMX1JFQUQpOworCSBkcmlfYm9fcmVmZXJlbmNlKGlucHV0LT5ibyk7CisJIGlucHV0LT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZylpbnB1dC0+Z2xhcnJheS0+UHRyOworCSBpbnB1dC0+c3RyaWRlID0gaW5wdXQtPmdsYXJyYXktPlN0cmlkZUI7CisgICAgICB9IGVsc2UgeworCSAvKiBRdWV1ZSB0aGUgYnVmZmVyIG9iamVjdCB1cCB0byBiZSB1cGxvYWRlZCBpbiB0aGUgbmV4dCBwYXNzLAorCSAgKiB3aGVuIHdlJ3ZlIGRlY2lkZWQgaWYgd2UncmUgZG9pbmcgaW50ZXJsZWF2ZWQgb3Igbm90LgorCSAgKi8KIAkgaWYgKGkgPT0gMCkgewogCSAgICAvKiBQb3NpdGlvbiBhcnJheSBub3QgcHJvcGVybHkgZW5hYmxlZDoKIAkgICAgICovCiAJICAgIGlmIChpbnB1dC0+Z2xhcnJheS0+U3RyaWRlQiA9PSAwKQotCSAgICAgICByZXR1cm4gR0xfRkFMU0U7CisJICAgICAgcmV0dXJuOwogCiAJICAgIGludGVybGVhdmUgPSBpbnB1dC0+Z2xhcnJheS0+U3RyaWRlQjsKIAkgICAgcHRyID0gaW5wdXQtPmdsYXJyYXktPlB0cjsKIAkgfQogCSBlbHNlIGlmIChpbnRlcmxlYXZlICE9IGlucHV0LT5nbGFycmF5LT5TdHJpZGVCIHx8Ci0JCSAgKGNvbnN0IGNoYXIgKilpbnB1dC0+Z2xhcnJheS0+UHRyIC0gKGNvbnN0IGNoYXIgKilwdHIgPCAwIHx8Ci0JCSAgKGNvbnN0IGNoYXIgKilpbnB1dC0+Z2xhcnJheS0+UHRyIC0gKGNvbnN0IGNoYXIgKilwdHIgPiBpbnRlcmxlYXZlKSB7CisJCSAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbnB1dC0+Z2xhcnJheS0+UHRyIC0gcHRyIDwgMCB8fAorCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyICopaW5wdXQtPmdsYXJyYXktPlB0ciAtIHB0ciA+IGludGVybGVhdmUpCisJIHsKIAkgICAgaW50ZXJsZWF2ZSA9IDA7CiAJIH0KIApAQCAtNDUxLDEzMSArMzkyLDEzNyBAQAogICAgICAgfQogICAgfQogCi0gICAvKiBVcGxvYWQgaW50ZXJsZWF2ZWQgYXJyYXlzIGlmIGFsbCB1cGxvYWRzIGFyZSBpbnRlcmxlYXZlZAotICAgICovCi0gICBpZiAobnJfdXBsb2FkcyA+IDEgJiYgCi0gICAgICAgaW50ZXJsZWF2ZSAmJiAKLSAgICAgICBpbnRlcmxlYXZlIDw9IDI1NikgewotICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqaW5wdXQwID0gdXBsb2FkWzBdOwotCi0gICAgICBpbnB1dDAtPmdsYXJyYXkgPSBjb3B5X2FycmF5X3RvX3Zib19hcnJheShicncsIDAsCi0JCQkJCQlpbnB1dDAtPmdsYXJyYXksIAotCQkJCQkJaW50ZXJsZWF2ZSwKLQkJCQkJCWlucHV0MC0+Y291bnQpOworICAgLyogSGFuZGxlIGFueSBhcnJheXMgdG8gYmUgdXBsb2FkZWQuICovCisgICBpZiAobnJfdXBsb2FkcyA+IDEgJiYgaW50ZXJsZWF2ZSAmJiBpbnRlcmxlYXZlIDw9IDI1NikgeworICAgICAgLyogQWxsIHVwbG9hZHMgYXJlIGludGVybGVhdmVkLCBzbyB1cGxvYWQgdGhlIGFycmF5cyB0b2dldGhlciBhcworICAgICAgICogaW50ZXJsZWF2ZWQuICBGaXJzdCwgdXBsb2FkIHRoZSBjb250ZW50cyBhbmQgc2V0IHVwIHVwbG9hZFswXS4KKyAgICAgICAqLworICAgICAgY29weV9hcnJheV90b192Ym9fYXJyYXkoYnJ3LCB1cGxvYWRbMF0sIGludGVybGVhdmUpOwogCiAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnJfdXBsb2FkczsgaSsrKSB7Ci0JIHVwbG9hZFtpXS0+Z2xhcnJheSA9IGludGVybGVhdmVkX3Zib19hcnJheShicncsCi0JCQkJCQkgICAgaSwKLQkJCQkJCSAgICBpbnB1dDAtPmdsYXJyYXksCi0JCQkJCQkgICAgdXBsb2FkW2ldLT5nbGFycmF5LAotCQkJCQkJICAgIHB0cik7CisJIC8qIFRoZW4sIGp1c3QgcG9pbnQgdXBsb2FkW2ldIGF0IHVwbG9hZFswXSdzIGJ1ZmZlci4gKi8KKwkgdXBsb2FkW2ldLT5zdHJpZGUgPSBpbnRlcmxlYXZlOworCSB1cGxvYWRbaV0tPm9mZnNldCA9IHVwbG9hZFswXS0+b2Zmc2V0ICsKKwkgICAgKChjb25zdCB1bnNpZ25lZCBjaGFyICopdXBsb2FkW2ldLT5nbGFycmF5LT5QdHIgLSBwdHIpOworCSB1cGxvYWRbaV0tPmJvID0gdXBsb2FkWzBdLT5ibzsKKwkgZHJpX2JvX3JlZmVyZW5jZSh1cGxvYWRbaV0tPmJvKTsKICAgICAgIH0KICAgIH0KICAgIGVsc2UgeworICAgICAgLyogVXBsb2FkIG5vbi1pbnRlcmxlYXZlZCBhcnJheXMgKi8KICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl91cGxvYWRzOyBpKyspIHsKLQkgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqaW5wdXQgPSB1cGxvYWRbaV07Ci0KLQkgaW5wdXQtPmdsYXJyYXkgPSBjb3B5X2FycmF5X3RvX3Zib19hcnJheShicncsIGksIAotCQkJCQkJICBpbnB1dC0+Z2xhcnJheSwKLQkJCQkJCSAgaW5wdXQtPmVsZW1lbnRfc2l6ZSwKLQkJCQkJCSAgaW5wdXQtPmNvdW50KTsKLQorICAgICAgICAgIGNvcHlfYXJyYXlfdG9fdmJvX2FycmF5KGJydywgdXBsb2FkW2ldLCB1cGxvYWRbaV0tPmVsZW1lbnRfc2l6ZSk7CiAgICAgICB9CiAgICB9Cit9CiAKLSAgIC8qIFhYWDogSW4gdGhlIHJhcmUgY2FzZXMgd2hlcmUgdGhpcyBoYXBwZW5zIHdlIGZhbGxiYWNrIGFsbAotICAgICogdGhlIHdheSB0byBzb2Z0d2FyZSByYXN0ZXJpemF0aW9uLCBhbHRob3VnaCBhIHRubCBmYWxsYmFjawotICAgICogd291bGQgYmUgc3VmZmljaWVudC4gIEkgZG9uJ3Qga25vdyBvZiAqYW55KiByZWFsIHdvcmxkCi0gICAgKiBjYXNlcyB3aXRoID4gMTcgdmVydGV4IGF0dHJpYnV0ZXMgZW5hYmxlZCwgc28gaXQgcHJvYmFibHkKLSAgICAqIGlzbid0IGFuIGlzc3VlIGF0IHRoaXMgcG9pbnQuCi0gICAgKi8KLSAgIGlmIChucl9lbmFibGVkID49IEJSV19WRVBfTUFYKQotCSByZXR1cm4gR0xfRkFMU0U7CitzdGF0aWMgdm9pZCBicndfZW1pdF92ZXJ0aWNlcyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKK3sKKyAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgR0x1aW50IHRtcCA9IGJydy0+dnMucHJvZ19kYXRhLT5pbnB1dHNfcmVhZDsKKyAgIHN0cnVjdCBicndfdmVydGV4X2VsZW1lbnQgKmVuYWJsZWRbVkVSVF9BVFRSSUJfTUFYXTsKKyAgIEdMdWludCBpOworICAgR0x1aW50IG5yX2VuYWJsZWQgPSAwOwogCi0gICAvKiBUaGlzIHN0aWxsIGRlZmluZXMgYSBoYXJkd2FyZSBWQiBmb3IgZWFjaCBpbnB1dCwgZXZlbiBpZiB0aGV5CisgIC8qIEFjY3VtdWxhdGUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBhcnJheXMuICovCisgICB3aGlsZSAodG1wKSB7CisgICAgICBpID0gX21lc2FfZmZzbGwodG1wKS0xOworICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqaW5wdXQgPSAmYnJ3LT52Yi5pbnB1dHNbaV07CisKKyAgICAgIHRtcCAmPSB+KDE8PGkpOworICAgICAgZW5hYmxlZFtucl9lbmFibGVkKytdID0gaW5wdXQ7CisgICB9CisKKworICAgLyogTm93IGVtaXQgVkIgYW5kIFZFUCBzdGF0ZSBwYWNrZXRzLgorICAgICoKKyAgICAqIFRoaXMgc3RpbGwgZGVmaW5lcyBhIGhhcmR3YXJlIFZCIGZvciBlYWNoIGlucHV0LCBldmVuIGlmIHRoZXkKICAgICAqIGFyZSBpbnRlcmxlYXZlZCBvciBmcm9tIHRoZSBzYW1lIFZCTy4gIFRCRCBpZiB0aGlzIG1ha2VzIGEKICAgICAqIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UuCiAgICAgKi8KKyAgIEJFR0lOX0JBVENIKDEgKyBucl9lbmFibGVkICogNCwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0goKENNRF9WRVJURVhfQlVGRkVSIDw8IDE2KSB8CisJICAgICAoKDEgKyBucl9lbmFibGVkICogNCkgLSAyKSk7CisKICAgIGZvciAoaSA9IDA7IGkgPCBucl9lbmFibGVkOyBpKyspIHsKICAgICAgIHN0cnVjdCBicndfdmVydGV4X2VsZW1lbnQgKmlucHV0ID0gZW5hYmxlZFtpXTsKIAotICAgICAgaW5wdXQtPnZlcCA9ICZ2ZXAudmVbaV07Ci0gICAgICBpbnB1dC0+dmVwLT52ZTAuc3JjX2Zvcm1hdCA9IGdldF9zdXJmYWNlX3R5cGUoaW5wdXQtPmdsYXJyYXktPlR5cGUsIAotCQkJCQkJICAgIGlucHV0LT5nbGFycmF5LT5TaXplLAotCQkJCQkJICAgIGlucHV0LT5nbGFycmF5LT5Ob3JtYWxpemVkKTsKLSAgICAgIGlucHV0LT52ZXAtPnZlMC52YWxpZCA9IDE7Ci0gICAgICBpbnB1dC0+dmVwLT52ZTEuZHN0X29mZnNldCA9IChpKSAqIDQ7Ci0gICAgICBpbnB1dC0+dmVwLT52ZTEudmZjb21wb25lbnQzID0gQlJXX1ZGQ09NUE9ORU5UX1NUT1JFX1NSQzsKLSAgICAgIGlucHV0LT52ZXAtPnZlMS52ZmNvbXBvbmVudDIgPSBCUldfVkZDT01QT05FTlRfU1RPUkVfU1JDOwotICAgICAgaW5wdXQtPnZlcC0+dmUxLnZmY29tcG9uZW50MSA9IEJSV19WRkNPTVBPTkVOVF9TVE9SRV9TUkM7Ci0gICAgICBpbnB1dC0+dmVwLT52ZTEudmZjb21wb25lbnQwID0gQlJXX1ZGQ09NUE9ORU5UX1NUT1JFX1NSQzsKKyAgICAgIE9VVF9CQVRDSCgoaSA8PCBCUldfVkIwX0lOREVYX1NISUZUKSB8CisJCUJSV19WQjBfQUNDRVNTX1ZFUlRFWERBVEEgfAorCQkoaW5wdXQtPnN0cmlkZSA8PCBCUldfVkIwX1BJVENIX1NISUZUKSk7CisgICAgICBPVVRfUkVMT0MoaW5wdXQtPmJvLAorCQlJOTE1X0dFTV9ET01BSU5fVkVSVEVYLCAwLAorCQlpbnB1dC0+b2Zmc2V0KTsKKyAgICAgIE9VVF9CQVRDSChicnctPnZiLm1heF9pbmRleCk7CisgICAgICBPVVRfQkFUQ0goMCk7IC8qIEluc3RhbmNlIGRhdGEgc3RlcCByYXRlICovCiAKLSAgICAgIHN3aXRjaCAoaW5wdXQtPmdsYXJyYXktPlNpemUpIHsKLSAgICAgIGNhc2UgMDogaW5wdXQtPnZlcC0+dmUxLnZmY29tcG9uZW50MCA9IEJSV19WRkNPTVBPTkVOVF9TVE9SRV8wOwotICAgICAgY2FzZSAxOiBpbnB1dC0+dmVwLT52ZTEudmZjb21wb25lbnQxID0gQlJXX1ZGQ09NUE9ORU5UX1NUT1JFXzA7Ci0gICAgICBjYXNlIDI6IGlucHV0LT52ZXAtPnZlMS52ZmNvbXBvbmVudDIgPSBCUldfVkZDT01QT05FTlRfU1RPUkVfMDsKLSAgICAgIGNhc2UgMzogaW5wdXQtPnZlcC0+dmUxLnZmY29tcG9uZW50MyA9IEJSV19WRkNPTVBPTkVOVF9TVE9SRV8xX0ZMVDsKLQkgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlucHV0LT52ZXAtPnZlMC52ZXJ0ZXhfYnVmZmVyX2luZGV4ID0gaTsKLSAgICAgIGlucHV0LT52ZXAtPnZlMC5zcmNfb2Zmc2V0ID0gMDsKLQotICAgICAgdmJwLnZiW2ldLnZiMC5iaXRzLnBpdGNoID0gaW5wdXQtPmdsYXJyYXktPlN0cmlkZUI7Ci0gICAgICB2YnAudmJbaV0udmIwLmJpdHMucGFkID0gMDsKLSAgICAgIHZicC52YltpXS52YjAuYml0cy5hY2Nlc3NfdHlwZSA9IEJSV19WRVJURVhCVUZGRVJfQUNDRVNTX1ZFUlRFWERBVEE7Ci0gICAgICB2YnAudmJbaV0udmIwLmJpdHMudmJfaW5kZXggPSBpOwotICAgICAgdmJwLnZiW2ldLm9mZnNldCA9IChHTHVpbnQpaW5wdXQtPmdsYXJyYXktPlB0cjsKLSAgICAgIHZicC52YltpXS5idWZmZXIgPSBhcnJheV9idWZmZXIoaW5wdXQtPmdsYXJyYXkpOwotICAgICAgdmJwLnZiW2ldLm1heF9pbmRleCA9IG1heF9pbmRleDsKLSAgIH0KLQotCi0KLSAgIC8qIE5vdyBlbWl0IFZCIGFuZCBWRVAgc3RhdGUgcGFja2V0czoKLSAgICAqLwotICAgdmJwLmhlYWRlci5iaXRzLmxlbmd0aCA9ICgxICsgbnJfZW5hYmxlZCAqIDQpIC0gMjsKLSAgIHZicC5oZWFkZXIuYml0cy5vcGNvZGUgPSBDTURfVkVSVEVYX0JVRkZFUjsKLQotICAgQkVHSU5fQkFUQ0godmJwLmhlYWRlci5iaXRzLmxlbmd0aCsyLCAwKTsKLSAgIE9VVF9CQVRDSCggdmJwLmhlYWRlci5kd29yZCApOwotICAgCi0gICBmb3IgKGkgPSAwOyBpIDwgbnJfZW5hYmxlZDsgaSsrKSB7Ci0gICAgICBPVVRfQkFUQ0goIHZicC52YltpXS52YjAuZHdvcmQgKTsKLSAgICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoJmJydy0+aW50ZWwsIHZicC52YltpXS5idWZmZXIpICsgdmJwLnZiW2ldLm9mZnNldCk7Ci0gICAgICBPVVRfQkFUQ0goIHZicC52YltpXS5tYXhfaW5kZXggKTsKLSAgICAgIE9VVF9CQVRDSCggdmJwLnZiW2ldLmluc3RhbmNlX2RhdGFfc3RlcF9yYXRlICk7CisgICAgICAvKiBVbnJlZmVyZW5jZSB0aGUgYnVmZmVyIHNvIGl0IGNhbiBnZXQgZnJlZWQsIG5vdyB0aGF0IHdlIHdvbid0CisgICAgICAgKiB0b3VjaCBpdCBhbnkgbW9yZS4KKyAgICAgICAqLworICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGlucHV0LT5ibyk7CisgICAgICBpbnB1dC0+Ym8gPSBOVUxMOwogICAgfQogICAgQURWQU5DRV9CQVRDSCgpOwogCi0gICB2ZXAuaGVhZGVyLmxlbmd0aCA9ICgxICsgbnJfZW5hYmxlZCAqIHNpemVvZih2ZXAudmVbMF0pLzQpIC0gMjsKLSAgIHZlcC5oZWFkZXIub3Bjb2RlID0gQ01EX1ZFUlRFWF9FTEVNRU5UOwotICAgYnJ3X2NhY2hlZF9iYXRjaF9zdHJ1Y3QoYnJ3LCAmdmVwLCA0ICsgbnJfZW5hYmxlZCAqIHNpemVvZih2ZXAudmVbMF0pKTsKKyAgIEJFR0lOX0JBVENIKDEgKyBucl9lbmFibGVkICogMiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0goKENNRF9WRVJURVhfRUxFTUVOVCA8PCAxNikgfCAoKDEgKyBucl9lbmFibGVkICogMikgLSAyKSk7CisgICBmb3IgKGkgPSAwOyBpIDwgbnJfZW5hYmxlZDsgaSsrKSB7CisgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50ICppbnB1dCA9IGVuYWJsZWRbaV07CisgICAgICB1aW50MzJfdCBmb3JtYXQgPSBnZXRfc3VyZmFjZV90eXBlKGlucHV0LT5nbGFycmF5LT5UeXBlLAorCQkJCQkgaW5wdXQtPmdsYXJyYXktPlNpemUsCisJCQkJCSBpbnB1dC0+Z2xhcnJheS0+Tm9ybWFsaXplZCk7CisgICAgICB1aW50MzJfdCBjb21wMCA9IEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFX1NSQzsKKyAgICAgIHVpbnQzMl90IGNvbXAxID0gQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfU1JDOworICAgICAgdWludDMyX3QgY29tcDIgPSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV9TUkM7CisgICAgICB1aW50MzJfdCBjb21wMyA9IEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFX1NSQzsKIAotICAgcmV0dXJuIEdMX1RSVUU7Ci19CisgICAgICBzd2l0Y2ggKGlucHV0LT5nbGFycmF5LT5TaXplKSB7CisgICAgICBjYXNlIDA6IGNvbXAwID0gQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfMDsKKyAgICAgIGNhc2UgMTogY29tcDEgPSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV8wOworICAgICAgY2FzZSAyOiBjb21wMiA9IEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFXzA7CisgICAgICBjYXNlIDM6IGNvbXAzID0gQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfMV9GTFQ7CisJIGJyZWFrOworICAgICAgfQogCi0KLXN0YXRpYyBHTHVpbnQgZWxlbWVudF9zaXplKCBHTGVudW0gdHlwZSApCi17Ci0gICBzd2l0Y2godHlwZSkgewotICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6IHJldHVybiA0OwotICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDogcmV0dXJuIDI7Ci0gICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6IHJldHVybiAxOwotICAgZGVmYXVsdDogYXNzZXJ0KDApOyByZXR1cm4gMDsKKyAgICAgIE9VVF9CQVRDSCgoaSA8PCBCUldfVkUwX0lOREVYX1NISUZUKSB8CisJCUJSV19WRTBfVkFMSUQgfAorCQkoZm9ybWF0IDw8IEJSV19WRTBfRk9STUFUX1NISUZUKSB8CisJCSgwIDw8IEJSV19WRTBfU1JDX09GRlNFVF9TSElGVCkpOworICAgICAgT1VUX0JBVENIKChjb21wMCA8PCBCUldfVkUxX0NPTVBPTkVOVF8wX1NISUZUKSB8CisJCShjb21wMSA8PCBCUldfVkUxX0NPTVBPTkVOVF8xX1NISUZUKSB8CisJCShjb21wMiA8PCBCUldfVkUxX0NPTVBPTkVOVF8yX1NISUZUKSB8CisJCShjb21wMyA8PCBCUldfVkUxX0NPTVBPTkVOVF8zX1NISUZUKSB8CisJCSgoaSAqIDQpIDw8IEJSV19WRTFfRFNUX09GRlNFVF9TSElGVCkpOwogICAgfQorICAgQURWQU5DRV9CQVRDSCgpOwogfQogCitjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3ZlcnRpY2VzID0geworICAgLmRpcnR5ID0geworICAgICAgLm1lc2EgPSAwLAorICAgICAgLmJydyA9IEJSV19ORVdfQkFUQ0ggfCBCUldfTkVXX1ZFUlRJQ0VTLAorICAgICAgLmNhY2hlID0gMCwKKyAgIH0sCisgICAucHJlcGFyZSA9IGJyd19wcmVwYXJlX3ZlcnRpY2VzLAorICAgLmVtaXQgPSBicndfZW1pdF92ZXJ0aWNlcywKK307CiAKLQotdm9pZCBicndfdXBsb2FkX2luZGljZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJIGNvbnN0IHN0cnVjdCBfbWVzYV9pbmRleF9idWZmZXIgKmluZGV4X2J1ZmZlciApCitzdGF0aWMgdm9pZCBicndfcHJlcGFyZV9pbmRpY2VzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgR0xjb250ZXh0ICpjdHggPSAmYnJ3LT5pbnRlbC5jdHg7CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKLSAgIEdMdWludCBpYl9zaXplID0gZ2V0X3NpemUoaW5kZXhfYnVmZmVyLT50eXBlKSAqIGluZGV4X2J1ZmZlci0+Y291bnQ7Ci0gICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYnVmZmVyb2JqID0gaW5kZXhfYnVmZmVyLT5vYmo7Ci0gICBHTHVpbnQgb2Zmc2V0ID0gKEdMdWludClpbmRleF9idWZmZXItPnB0cjsKKyAgIGNvbnN0IHN0cnVjdCBfbWVzYV9pbmRleF9idWZmZXIgKmluZGV4X2J1ZmZlciA9IGJydy0+aWIuaWI7CisgICBHTHVpbnQgaWJfc2l6ZTsKKyAgIGRyaV9ibyAqYm87CisgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYnVmZmVyb2JqOworICAgR0x1aW50IG9mZnNldDsKKworICAgaWYgKGluZGV4X2J1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpYl9zaXplID0gZ2V0X3NpemUoaW5kZXhfYnVmZmVyLT50eXBlKSAqIGluZGV4X2J1ZmZlci0+Y291bnQ7CisgICBidWZmZXJvYmogPSBpbmRleF9idWZmZXItPm9iajs7CiAKICAgIC8qIFR1cm4gaW50byBhIHByb3BlciBWQk86CiAgICAgKi8KQEAgLTU4MywyMyArNTMwLDU2IEBACiAgICAgIAogICAgICAgLyogR2V0IG5ldyBidWZmZXJvYmosIG9mZnNldDoKICAgICAgICAqLwotICAgICAgZ2V0X3NwYWNlKGJydywgaWJfc2l6ZSwgJmJ1ZmZlcm9iaiwgJm9mZnNldCk7CisgICAgICBnZXRfc3BhY2UoYnJ3LCBpYl9zaXplLCAmYm8sICZvZmZzZXQpOwogCiAgICAgICAvKiBTdHJhaWdodCB1cGxvYWQKICAgICAgICAqLwotICAgICAgY3R4LT5Ecml2ZXIuQnVmZmVyU3ViRGF0YSggY3R4LAotCQkJCSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsCi0JCQkJIG9mZnNldCwgCi0JCQkJIGliX3NpemUsCi0JCQkJIGluZGV4X2J1ZmZlci0+cHRyLAotCQkJCSBidWZmZXJvYmopOworICAgICAgZHJpX2JvX3N1YmRhdGEoYm8sIG9mZnNldCwgaWJfc2l6ZSwgaW5kZXhfYnVmZmVyLT5wdHIpOworICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IChHTHVpbnQpaW5kZXhfYnVmZmVyLT5wdHI7CisKKyAgICAgIC8qIElmIHRoZSBpbmRleCBidWZmZXIgaXNuJ3QgYWxpZ25lZCB0byBpdHMgZWxlbWVudCBzaXplLCB3ZSBoYXZlIHRvCisgICAgICAgKiByZWJhc2UgaXQgaW50byBhIHRlbXBvcmFyeS4KKyAgICAgICAqLworICAgICAgIGlmICgoZ2V0X3NpemUoaW5kZXhfYnVmZmVyLT50eXBlKSAtIDEpICYgb2Zmc2V0KSB7CisgICAgICAgICAgIEdMdWJ5dGUgKm1hcCA9IGN0eC0+RHJpdmVyLk1hcEJ1ZmZlcihjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9EWU5BTUlDX0RSQVdfQVJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyb2JqKTsKKyAgICAgICAgICAgbWFwICs9IG9mZnNldDsKKworCSAgIGdldF9zcGFjZShicncsIGliX3NpemUsICZibywgJm9mZnNldCk7CisKKwkgICBkcmlfYm9fc3ViZGF0YShibywgb2Zmc2V0LCBpYl9zaXplLCBtYXApOworCisgICAgICAgICAgIGN0eC0+RHJpdmVyLlVubWFwQnVmZmVyKGN0eCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCLCBidWZmZXJvYmopOworICAgICAgIH0gZWxzZSB7CisJICBibyA9IGludGVsX2J1ZmZlcm9ial9idWZmZXIoaW50ZWwsIGludGVsX2J1ZmZlcl9vYmplY3QoYnVmZmVyb2JqKSwKKwkJCQkgICAgICBJTlRFTF9SRUFEKTsKKwkgIGRyaV9ib19yZWZlcmVuY2UoYm8pOworICAgICAgIH0KICAgIH0KIAorICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+aWIuYm8pOworICAgYnJ3LT5pYi5ibyA9IGJvOworICAgYnJ3LT5pYi5vZmZzZXQgPSBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJyd19lbWl0X2luZGljZXMoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKKyAgIGNvbnN0IHN0cnVjdCBfbWVzYV9pbmRleF9idWZmZXIgKmluZGV4X2J1ZmZlciA9IGJydy0+aWIuaWI7CisgICBHTHVpbnQgaWJfc2l6ZTsKKworICAgaWYgKGluZGV4X2J1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpYl9zaXplID0gZ2V0X3NpemUoaW5kZXhfYnVmZmVyLT50eXBlKSAqIGluZGV4X2J1ZmZlci0+Y291bnQ7CisKICAgIC8qIEVtaXQgdGhlIGluZGV4YnVmZmVyIHBhY2tldDoKICAgICAqLwogICAgewogICAgICAgc3RydWN0IGJyd19pbmRleGJ1ZmZlciBpYjsKLSAgICAgIHN0cnVjdCBidWZmZXIgKmJ1ZmZlciA9IGludGVsX2J1ZmZlcm9ial9idWZmZXIoaW50ZWxfYnVmZmVyX29iamVjdChidWZmZXJvYmopKTsKIAogICAgICAgbWVtc2V0KCZpYiwgMCwgc2l6ZW9mKGliKSk7CiAgICAKQEAgLTYwOSwxMSArNTg5LDI1IEBACiAgICAgICBpYi5oZWFkZXIuYml0cy5jdXRfaW5kZXhfZW5hYmxlID0gMDsKICAgIAogCi0gICAgICBCRUdJTl9CQVRDSCg0LCAwKTsKKyAgICAgIEJFR0lOX0JBVENIKDQsIElHTk9SRV9DTElQUkVDVFMpOwogICAgICAgT1VUX0JBVENIKCBpYi5oZWFkZXIuZHdvcmQgKTsKLSAgICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIGJ1ZmZlcikgKyBvZmZzZXQgKTsKLSAgICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIGJ1ZmZlcikgKyBvZmZzZXQgKyBpYl9zaXplICk7CisgICAgICBPVVRfUkVMT0MoYnJ3LT5pYi5ibywKKwkJSTkxNV9HRU1fRE9NQUlOX1ZFUlRFWCwgMCwKKwkJYnJ3LT5pYi5vZmZzZXQpOworICAgICAgT1VUX1JFTE9DKGJydy0+aWIuYm8sCisJCUk5MTVfR0VNX0RPTUFJTl9WRVJURVgsIDAsCisJCWJydy0+aWIub2Zmc2V0ICsgaWJfc2l6ZSk7CiAgICAgICBPVVRfQkFUQ0goIDAgKTsKICAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKICAgIH0KIH0KKworY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19pbmRpY2VzID0geworICAgLmRpcnR5ID0geworICAgICAgLm1lc2EgPSAwLAorICAgICAgLmJydyA9IEJSV19ORVdfQkFUQ0ggfCBCUldfTkVXX0lORElDRVMsCisgICAgICAuY2FjaGUgPSAwLAorICAgfSwKKyAgIC5wcmVwYXJlID0gYnJ3X3ByZXBhcmVfaW5kaWNlcywKKyAgIC5lbWl0ID0gYnJ3X2VtaXRfaW5kaWNlcywKK307CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ldS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZXUuYwppbmRleCBkMTI0NGJlLi5iM2FlNGVlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ldS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2V1LmMKQEAgLTEwMSw4ICsxMDEsOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwotdm9pZCBicndfaW5pdF9jb21waWxlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgKQordm9pZCBicndfaW5pdF9jb21waWxlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd19jb21waWxlICpwICkKIHsKKyAgIHAtPmJydyA9IGJydzsKICAgIHAtPm5yX2luc24gPSAwOwogICAgcC0+Y3VycmVudCA9IHAtPnN0YWNrOwogICAgbWVtc2V0KHAtPmN1cnJlbnQsIDAsIHNpemVvZihwLT5jdXJyZW50WzBdKSk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ldS5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZXUuaAppbmRleCA1MmY4OWQ1Li4yMDdiOGI3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ldS5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2V1LmgKQEAgLTEwNSwxMSArMTA1LDEyIEBACiAKICAgIEdMdWludCBmbGFnX3ZhbHVlOwogICAgR0xib29sZWFuIHNpbmdsZV9wcm9ncmFtX2Zsb3c7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydzsKIH07CiAKIAogCi1zdGF0aWMgX19pbmxpbmUgaW50IHR5cGVfc3ooIEdMdWludCB0eXBlICkKK3N0YXRpYyBJTkxJTkUgaW50IHR5cGVfc3ooIEdMdWludCB0eXBlICkKIHsKICAgIHN3aXRjaCggdHlwZSApIHsKICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CkBAIC0xMjgsNyArMTI5LDcgQEAKICAgIH0KIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19yZWcoIEdMdWludCBmaWxlLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfcmVnKCBHTHVpbnQgZmlsZSwKIAkJCQkJR0x1aW50IG5yLAogCQkJCQlHTHVpbnQgc3VibnIsCiAJCQkJCUdMdWludCB0eXBlLApAQCAtMTY1LDcgKzE2Niw3IEBACiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzE2X3JlZyggR0x1aW50IGZpbGUsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd192ZWMxNl9yZWcoIEdMdWludCBmaWxlLAogCQkJCQkgICAgICBHTHVpbnQgbnIsCiAJCQkJCSAgICAgIEdMdWludCBzdWJuciApCiB7CkBAIC0xODAsNyArMTgxLDcgQEAKIAkJICBXUklURU1BU0tfWFlaVyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjOF9yZWcoIEdMdWludCBmaWxlLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjOF9yZWcoIEdMdWludCBmaWxlLAogCQkJCQkgICAgIEdMdWludCBuciwKIAkJCQkJICAgICBHTHVpbnQgc3VibnIgKQogewpAQCAtMTk2LDcgKzE5Nyw3IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd192ZWM0X3JlZyggR0x1aW50IGZpbGUsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd192ZWM0X3JlZyggR0x1aW50IGZpbGUsCiAJCQkJCSAgICAgIEdMdWludCBuciwKIAkJCQkJICAgICAgR0x1aW50IHN1Ym5yICkKIHsKQEAgLTIxMiw3ICsyMTMsNyBAQAogfQogCiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjMl9yZWcoIEdMdWludCBmaWxlLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjMl9yZWcoIEdMdWludCBmaWxlLAogCQkJCQkgICAgICBHTHVpbnQgbnIsCiAJCQkJCSAgICAgIEdMdWludCBzdWJuciApCiB7CkBAIC0yMjcsNyArMjI4LDcgQEAKIAkJICBXUklURU1BU0tfWFkpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzFfcmVnKCBHTHVpbnQgZmlsZSwKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzFfcmVnKCBHTHVpbnQgZmlsZSwKIAkJCQkJICAgICBHTHVpbnQgbnIsCiAJCQkJCSAgICAgR0x1aW50IHN1Ym5yICkKIHsKQEAgLTI0MywxNCArMjQ0LDE0IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIHJldHlwZSggc3RydWN0IGJyd19yZWcgcmVnLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyByZXR5cGUoIHN0cnVjdCBicndfcmVnIHJlZywKIAkJCQkgICAgICAgR0x1aW50IHR5cGUgKQogewogICAgcmVnLnR5cGUgPSB0eXBlOwogICAgcmV0dXJuIHJlZzsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIHN1Ym9mZnNldCggc3RydWN0IGJyd19yZWcgcmVnLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBzdWJvZmZzZXQoIHN0cnVjdCBicndfcmVnIHJlZywKIAkJCQkJICBHTHVpbnQgZGVsdGEgKQogeyAgIAogICAgcmVnLnN1Ym5yICs9IGRlbHRhICogdHlwZV9zeihyZWcudHlwZSk7CkBAIC0yNTgsNyArMjU5LDcgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgb2Zmc2V0KCBzdHJ1Y3QgYnJ3X3JlZyByZWcsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIG9mZnNldCggc3RydWN0IGJyd19yZWcgcmVnLAogCQkJCSAgICAgICBHTHVpbnQgZGVsdGEgKQogewogICAgcmVnLm5yICs9IGRlbHRhOwpAQCAtMjY2LDcgKzI2Nyw3IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJ5dGVfb2Zmc2V0KCBzdHJ1Y3QgYnJ3X3JlZyByZWcsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJ5dGVfb2Zmc2V0KCBzdHJ1Y3QgYnJ3X3JlZyByZWcsCiAJCQkJCSAgICBHTHVpbnQgYnl0ZXMgKQogewogICAgR0x1aW50IG5ld29mZnNldCA9IHJlZy5uciAqIFJFR19TSVpFICsgcmVnLnN1Ym5yICsgYnl0ZXM7CkBAIC0yNzYsMjggKzI3NywyOCBAQAogfQogICAgCiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdXcxNl9yZWcoIEdMdWludCBmaWxlLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdXcxNl9yZWcoIEdMdWludCBmaWxlLAogCQkJCQkgICAgIEdMdWludCBuciwKIAkJCQkJICAgICBHTHVpbnQgc3VibnIgKQogewogICAgcmV0dXJuIHN1Ym9mZnNldChyZXR5cGUoYnJ3X3ZlYzE2X3JlZyhmaWxlLCBuciwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwgc3VibnIpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X3V3OF9yZWcoIEdMdWludCBmaWxlLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdXc4X3JlZyggR0x1aW50IGZpbGUsCiAJCQkJCSAgICBHTHVpbnQgbnIsCiAJCQkJCSAgICBHTHVpbnQgc3VibnIgKQogewogICAgcmV0dXJuIHN1Ym9mZnNldChyZXR5cGUoYnJ3X3ZlYzhfcmVnKGZpbGUsIG5yLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLCBzdWJucik7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdXcxX3JlZyggR0x1aW50IGZpbGUsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd191dzFfcmVnKCBHTHVpbnQgZmlsZSwKIAkJCQkJICAgIEdMdWludCBuciwKIAkJCQkJICAgIEdMdWludCBzdWJuciApCiB7CiAgICByZXR1cm4gc3Vib2Zmc2V0KHJldHlwZShicndfdmVjMV9yZWcoZmlsZSwgbnIsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VVyksIHN1Ym5yKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19pbW1fcmVnKCBHTHVpbnQgdHlwZSApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd19pbW1fcmVnKCBHTHVpbnQgdHlwZSApCiB7CiAgICByZXR1cm4gYnJ3X3JlZyggQlJXX0lNTUVESUFURV9WQUxVRSwKIAkJICAgMCwKQEAgLTMxMCwzOCArMzExLDM4IEBACiAJCSAgIDApOyAgICAgIAogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2ltbV9mKCBHTGZsb2F0IGYgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX2YoIEdMZmxvYXQgZiApCiB7CiAgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9GKTsKICAgIGltbS5kdzEuZiA9IGY7CiAgICByZXR1cm4gaW1tOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2ltbV9kKCBHTGludCBkICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2ltbV9kKCBHTGludCBkICkKIHsKICAgIHN0cnVjdCBicndfcmVnIGltbSA9IGJyd19pbW1fcmVnKEJSV19SRUdJU1RFUl9UWVBFX0QpOwogICAgaW1tLmR3MS5kID0gZDsKICAgIHJldHVybiBpbW07CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3VkKCBHTHVpbnQgdWQgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3VkKCBHTHVpbnQgdWQgKQogewogICAgc3RydWN0IGJyd19yZWcgaW1tID0gYnJ3X2ltbV9yZWcoQlJXX1JFR0lTVEVSX1RZUEVfVUQpOwogICAgaW1tLmR3MS51ZCA9IHVkOwogICAgcmV0dXJuIGltbTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19pbW1fdXcoIEdMdXNob3J0IHV3ICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2ltbV91dyggR0x1c2hvcnQgdXcgKQogewogICAgc3RydWN0IGJyd19yZWcgaW1tID0gYnJ3X2ltbV9yZWcoQlJXX1JFR0lTVEVSX1RZUEVfVVcpOwotICAgaW1tLmR3MS51ZCA9IHV3OworICAgaW1tLmR3MS51ZCA9IHV3IHwgKHV3IDw8IDE2KTsKICAgIHJldHVybiBpbW07CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3coIEdMc2hvcnQgdyApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd19pbW1fdyggR0xzaG9ydCB3ICkKIHsKICAgIHN0cnVjdCBicndfcmVnIGltbSA9IGJyd19pbW1fcmVnKEJSV19SRUdJU1RFUl9UWVBFX1cpOwotICAgaW1tLmR3MS5kID0gdzsKKyAgIGltbS5kdzEuZCA9IHcgfCAodyA8PCAxNik7CiAgICByZXR1cm4gaW1tOwogfQogCkBAIC0zNTEsNyArMzUyLDcgQEAKIAogLyogVmVjdG9yIG9mIGVpZ2h0IHNpZ25lZCBoYWxmLWJ5dGUgdmFsdWVzOiAKICAqLwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19pbW1fdiggR0x1aW50IHYgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3YoIEdMdWludCB2ICkKIHsKICAgIHN0cnVjdCBicndfcmVnIGltbSA9IGJyd19pbW1fcmVnKEJSV19SRUdJU1RFUl9UWVBFX1YpOwogICAgaW1tLnZzdHJpZGUgPSBCUldfVkVSVElDQUxfU1RSSURFXzA7CkBAIC0zNjMsNyArMzY0LDcgQEAKIAogLyogVmVjdG9yIG9mIGZvdXIgOC1iaXQgZmxvYXQgdmFsdWVzOgogICovCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2ltbV92ZiggR0x1aW50IHYgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3ZmKCBHTHVpbnQgdiApCiB7CiAgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9WRik7CiAgICBpbW0udnN0cmlkZSA9IEJSV19WRVJUSUNBTF9TVFJJREVfMDsKQEAgLTM3Nyw3ICszNzgsNyBAQAogI2RlZmluZSBWRl9PTkUgIDB4MzAKICNkZWZpbmUgVkZfTkVHICAoMTw8NykKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19pbW1fdmY0KCBHTHVpbnQgdjAsIAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfaW1tX3ZmNCggR0x1aW50IHYwLCAKIAkJCQkJICAgIEdMdWludCB2MSwgCiAJCQkJCSAgICBHTHVpbnQgdjIsCiAJCQkJCSAgICBHTHVpbnQgdjMpCkBAIC0zOTQsNTEgKzM5NSw1MSBAQAogfQogCiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfYWRkcmVzcyggc3RydWN0IGJyd19yZWcgcmVnICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2FkZHJlc3MoIHN0cnVjdCBicndfcmVnIHJlZyApCiB7CiAgICByZXR1cm4gYnJ3X2ltbV91dyhyZWcubnIgKiBSRUdfU0laRSArIHJlZy5zdWJucik7CiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd192ZWMxX2dyZiggR0x1aW50IG5yLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjMV9ncmYoIEdMdWludCBuciwKIAkJCQkJICAgICAgIEdMdWludCBzdWJuciApCiB7CiAgICByZXR1cm4gYnJ3X3ZlYzFfcmVnKEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUsIG5yLCBzdWJucik7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjOF9ncmYoIEdMdWludCBuciwKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzhfZ3JmKCBHTHVpbnQgbnIsCiAJCQkJCSAgICAgR0x1aW50IHN1Ym5yICkKIHsKICAgIHJldHVybiBicndfdmVjOF9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgbnIsIHN1Ym5yKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd192ZWM0X2dyZiggR0x1aW50IG5yLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjNF9ncmYoIEdMdWludCBuciwKIAkJCQkJICAgICBHTHVpbnQgc3VibnIgKQogewogICAgcmV0dXJuIGJyd192ZWM0X3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBuciwgc3VibnIpOwogfQogCiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfdmVjMl9ncmYoIEdMdWludCBuciwKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzJfZ3JmKCBHTHVpbnQgbnIsCiAJCQkJCSAgICAgR0x1aW50IHN1Ym5yICkKIHsKICAgIHJldHVybiBicndfdmVjMl9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgbnIsIHN1Ym5yKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd191dzhfZ3JmKCBHTHVpbnQgbnIsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd191dzhfZ3JmKCBHTHVpbnQgbnIsCiAJCQkJCSAgICBHTHVpbnQgc3VibnIgKQogewogICAgcmV0dXJuIGJyd191dzhfcmVnKEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUsIG5yLCBzdWJucik7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfbnVsbF9yZWcoIHZvaWQgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfbnVsbF9yZWcoIHZvaWQgKQogewogICAgcmV0dXJuIGJyd192ZWM4X3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsIAogCQkgICAgICAgQlJXX0FSRl9OVUxMLCAKIAkJICAgICAgIDApOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2FkZHJlc3NfcmVnKCBHTHVpbnQgc3VibnIgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfYWRkcmVzc19yZWcoIEdMdWludCBzdWJuciApCiB7CiAgICByZXR1cm4gYnJ3X3V3MV9yZWcoQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFLCAKIAkJICAgICAgQlJXX0FSRl9BRERSRVNTLCAKQEAgLTQ0OSw3ICs0NTAsNyBAQAogICogYXJlbid0IHh5encuICBUaGlzIGdvZXMgYWdhaW5zdCB0aGUgY29udmVudGlvbiBmb3Igb3RoZXIgc2NhbGFyCiAgKiByZWdzOgogICovCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2lwX3JlZyggdm9pZCApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd19pcF9yZWcoIHZvaWQgKQogewogICAgcmV0dXJuIGJyd19yZWcoQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFLCAKIAkJICBCUldfQVJGX0lQLCAKQEAgLTQ2Miw3ICs0NjMsNyBAQAogCQkgIFdSSVRFTUFTS19YWVpXKTsgLyogTk9URSEgKi8KIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19hY2NfcmVnKCB2b2lkICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2FjY19yZWcoIHZvaWQgKQogewogICAgcmV0dXJuIGJyd192ZWM4X3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsIAogCQkgICAgICAgQlJXX0FSRl9BQ0NVTVVMQVRPUiwgCkBAIC00NzAsNyArNDcxLDcgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2ZsYWdfcmVnKCB2b2lkICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2ZsYWdfcmVnKCB2b2lkICkKIHsKICAgIHJldHVybiBicndfdXcxX3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsCiAJCSAgICAgIEJSV19BUkZfRkxBRywKQEAgLTQ3OCwxNCArNDc5LDE0IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19tYXNrX3JlZyggR0x1aW50IHN1Ym5yICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X21hc2tfcmVnKCBHTHVpbnQgc3VibnIgKQogewogICAgcmV0dXJuIGJyd191dzFfcmVnKEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSwKIAkJICAgICAgQlJXX0FSRl9NQVNLLAogCQkgICAgICBzdWJucik7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfbWVzc2FnZV9yZWcoIEdMdWludCBuciApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd19tZXNzYWdlX3JlZyggR0x1aW50IG5yICkKIHsKICAgIHJldHVybiBicndfdmVjOF9yZWcoQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSwKIAkJICAgICAgIG5yLApAQCAtNDk4LDcgKzQ5OSw3IEBACiAvKiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY2FsbGVkIHdpdGggYSBudW1lcmljIGNvbnN0YW50IGFyZ3VtZW50LCBzbwogICogbWFrZSB0aGluZ3MgZWFzeSB0byBldmFsdWF0ZSBhdCBjb21waWxlIHRpbWU6CiAgKi8KLXN0YXRpYyBfX2lubGluZSBHTHVpbnQgY3Z0KCBHTHVpbnQgdmFsICkKK3N0YXRpYyBJTkxJTkUgR0x1aW50IGN2dCggR0x1aW50IHZhbCApCiB7CiAgICBzd2l0Y2ggKHZhbCkgewogICAgY2FzZSAwOiByZXR1cm4gMDsKQEAgLTUxMiw3ICs1MTMsNyBAQAogICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBzdHJpZGUoIHN0cnVjdCBicndfcmVnIHJlZywKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgc3RyaWRlKCBzdHJ1Y3QgYnJ3X3JlZyByZWcsCiAJCQkJICAgICAgIEdMdWludCB2c3RyaWRlLAogCQkJCSAgICAgICBHTHVpbnQgd2lkdGgsCiAJCQkJICAgICAgIEdMdWludCBoc3RyaWRlICkKQEAgLTUyNCw0MyArNTI1LDQzIEBACiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgdmVjMTYoIHN0cnVjdCBicndfcmVnIHJlZyApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIHZlYzE2KCBzdHJ1Y3QgYnJ3X3JlZyByZWcgKQogewogICAgcmV0dXJuIHN0cmlkZShyZWcsIDE2LDE2LDEpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgdmVjOCggc3RydWN0IGJyd19yZWcgcmVnICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgdmVjOCggc3RydWN0IGJyd19yZWcgcmVnICkKIHsKICAgIHJldHVybiBzdHJpZGUocmVnLCA4LDgsMSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyB2ZWM0KCBzdHJ1Y3QgYnJ3X3JlZyByZWcgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyB2ZWM0KCBzdHJ1Y3QgYnJ3X3JlZyByZWcgKQogewogICAgcmV0dXJuIHN0cmlkZShyZWcsIDQsNCwxKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIHZlYzIoIHN0cnVjdCBicndfcmVnIHJlZyApCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIHZlYzIoIHN0cnVjdCBicndfcmVnIHJlZyApCiB7CiAgICByZXR1cm4gc3RyaWRlKHJlZywgMiwyLDEpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgdmVjMSggc3RydWN0IGJyd19yZWcgcmVnICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgdmVjMSggc3RydWN0IGJyd19yZWcgcmVnICkKIHsKICAgIHJldHVybiBzdHJpZGUocmVnLCAwLDEsMCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBnZXRfZWxlbWVudCggc3RydWN0IGJyd19yZWcgcmVnLCBHTHVpbnQgZWx0ICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgZ2V0X2VsZW1lbnQoIHN0cnVjdCBicndfcmVnIHJlZywgR0x1aW50IGVsdCApCiB7CiAgICByZXR1cm4gdmVjMShzdWJvZmZzZXQocmVnLCBlbHQpKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGdldF9lbGVtZW50X3VkKCBzdHJ1Y3QgYnJ3X3JlZyByZWcsIEdMdWludCBlbHQgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBnZXRfZWxlbWVudF91ZCggc3RydWN0IGJyd19yZWcgcmVnLCBHTHVpbnQgZWx0ICkKIHsKICAgIHJldHVybiB2ZWMxKHN1Ym9mZnNldChyZXR5cGUocmVnLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIGVsdCkpOwogfQogCiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBicndfc3dpenpsZSggc3RydWN0IGJyd19yZWcgcmVnLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfc3dpenpsZSggc3RydWN0IGJyd19yZWcgcmVnLAogCQkJCQkgICAgR0x1aW50IHgsCiAJCQkJCSAgICBHTHVpbnQgeSwgCiAJCQkJCSAgICBHTHVpbnQgeiwKQEAgLTU3NCwzMyArNTc1LDMzIEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd19zd2l6emxlMSggc3RydWN0IGJyd19yZWcgcmVnLAorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBicndfc3dpenpsZTEoIHN0cnVjdCBicndfcmVnIHJlZywKIAkJCQkJICAgICBHTHVpbnQgeCApCiB7CiAgICByZXR1cm4gYnJ3X3N3aXp6bGUocmVnLCB4LCB4LCB4LCB4KTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd193cml0ZW1hc2soIHN0cnVjdCBicndfcmVnIHJlZywKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3dyaXRlbWFzayggc3RydWN0IGJyd19yZWcgcmVnLAogCQkJCQkgICAgICBHTHVpbnQgbWFzayApCiB7CiAgICByZWcuZHcxLmJpdHMud3JpdGVtYXNrICY9IG1hc2s7CiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X3NldF93cml0ZW1hc2soIHN0cnVjdCBicndfcmVnIHJlZywKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3NldF93cml0ZW1hc2soIHN0cnVjdCBicndfcmVnIHJlZywKIAkJCQkJCSAgR0x1aW50IG1hc2sgKQogewogICAgcmVnLmR3MS5iaXRzLndyaXRlbWFzayA9IG1hc2s7CiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgbmVnYXRlKCBzdHJ1Y3QgYnJ3X3JlZyByZWcgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBuZWdhdGUoIHN0cnVjdCBicndfcmVnIHJlZyApCiB7CiAgICByZWcubmVnYXRlIF49IDE7CiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X2Ficyggc3RydWN0IGJyd19yZWcgcmVnICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X2Ficyggc3RydWN0IGJyd19yZWcgcmVnICkKIHsKICAgIHJlZy5hYnMgPSAxOwogICAgcmV0dXJuIHJlZzsKQEAgLTYwOCw3ICs2MDksNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGJyd192ZWM0X2luZGlyZWN0KCBHTHVpbnQgc3VibnIsCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGJyd192ZWM0X2luZGlyZWN0KCBHTHVpbnQgc3VibnIsCiAJCQkJCQkgIEdMaW50IG9mZnNldCApCiB7CiAgICBzdHJ1Y3QgYnJ3X3JlZyByZWcgPSAgYnJ3X3ZlYzRfZ3JmKDAsIDApOwpAQCAtNjE4LDcgKzYxOSw3IEBACiAgICByZXR1cm4gcmVnOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzFfaW5kaXJlY3QoIEdMdWludCBzdWJuciwKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgYnJ3X3ZlYzFfaW5kaXJlY3QoIEdMdWludCBzdWJuciwKIAkJCQkJCSAgR0xpbnQgb2Zmc2V0ICkKIHsKICAgIHN0cnVjdCBicndfcmVnIHJlZyA9ICBicndfdmVjMV9ncmYoMCwgMCk7CkBAIC02MjgsMzggKzYyOSw0OCBAQAogICAgcmV0dXJuIHJlZzsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGRlcmVmXzRmKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBHTGludCBvZmZzZXQpCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGRlcmVmXzRmKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBHTGludCBvZmZzZXQpCiB7CiAgICByZXR1cm4gYnJ3X3ZlYzRfaW5kaXJlY3QocHRyLmFkZHJfc3VibnIsIHB0ci5hZGRyX29mZnNldCArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBkZXJlZl8xZihzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgR0xpbnQgb2Zmc2V0KQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBkZXJlZl8xZihzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgR0xpbnQgb2Zmc2V0KQogewogICAgcmV0dXJuIGJyd192ZWMxX2luZGlyZWN0KHB0ci5hZGRyX3N1Ym5yLCBwdHIuYWRkcl9vZmZzZXQgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgZGVyZWZfNGIoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIsIEdMaW50IG9mZnNldCkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgZGVyZWZfNGIoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIsIEdMaW50IG9mZnNldCkKIHsKICAgIHJldHVybiByZXR5cGUoZGVyZWZfNGYocHRyLCBvZmZzZXQpLCBCUldfUkVHSVNURVJfVFlQRV9CKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHN0cnVjdCBicndfcmVnIGRlcmVmXzF1dyhzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgR0xpbnQgb2Zmc2V0KQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X3JlZyBkZXJlZl8xdXcoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIsIEdMaW50IG9mZnNldCkKIHsKICAgIHJldHVybiByZXR5cGUoZGVyZWZfMWYocHRyLCBvZmZzZXQpLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYnJ3X3JlZyBnZXRfYWRkcl9yZWcoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIpCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGRlcmVmXzFkKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBHTGludCBvZmZzZXQpCit7CisgICByZXR1cm4gcmV0eXBlKGRlcmVmXzFmKHB0ciwgb2Zmc2V0KSwgQlJXX1JFR0lTVEVSX1RZUEVfRCk7Cit9CisKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgZGVyZWZfMXVkKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBHTGludCBvZmZzZXQpCit7CisgICByZXR1cm4gcmV0eXBlKGRlcmVmXzFmKHB0ciwgb2Zmc2V0KSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworfQorCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBicndfcmVnIGdldF9hZGRyX3JlZyhzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0cikKIHsKICAgIHJldHVybiBicndfYWRkcmVzc19yZWcocHRyLmFkZHJfc3VibnIpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19pbmRpcmVjdCBicndfaW5kaXJlY3Rfb2Zmc2V0KCBzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgR0xpbnQgb2Zmc2V0ICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19pbmRpcmVjdCBicndfaW5kaXJlY3Rfb2Zmc2V0KCBzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgR0xpbnQgb2Zmc2V0ICkKIHsKICAgIHB0ci5hZGRyX29mZnNldCArPSBvZmZzZXQ7CiAgICByZXR1cm4gcHRyOwogfQogCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19pbmRpcmVjdCBicndfaW5kaXJlY3QoIEdMdWludCBhZGRyX3N1Ym5yLCBHTGludCBvZmZzZXQgKQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X2luZGlyZWN0IGJyd19pbmRpcmVjdCggR0x1aW50IGFkZHJfc3VibnIsIEdMaW50IG9mZnNldCApCiB7CiAgICBzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0cjsKICAgIHB0ci5hZGRyX3N1Ym5yID0gYWRkcl9zdWJucjsKQEAgLTY2OCw3ICs2NzksMTAgQEAKICAgIHJldHVybiBwdHI7CiB9CiAKLQorc3RhdGljIElOTElORSBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpjdXJyZW50X2luc24oIHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKwlyZXR1cm4gJnAtPnN0b3JlW3AtPm5yX2luc25dOworfQogCiB2b2lkIGJyd19wb3BfaW5zbl9zdGF0ZSggc3RydWN0IGJyd19jb21waWxlICpwICk7CiB2b2lkIGJyd19wdXNoX2luc25fc3RhdGUoIHN0cnVjdCBicndfY29tcGlsZSAqcCApOwpAQCAtNjgwLDcgKzY5NCw3IEBACiB2b2lkIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2woIHN0cnVjdCBicndfY29tcGlsZSAqcCwgR0x1aW50IHBjICk7CiB2b2lkIGJyd19zZXRfY29uZGl0aW9uYWxtb2QoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgR0x1aW50IGNvbmRpdGlvbmFsICk7CiAKLXZvaWQgYnJ3X2luaXRfY29tcGlsZSggc3RydWN0IGJyd19jb21waWxlICpwICk7Cit2b2lkIGJyd19pbml0X2NvbXBpbGUoIHN0cnVjdCBicndfY29udGV4dCAqLCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgKTsKIGNvbnN0IEdMdWludCAqYnJ3X2dldF9wcm9ncmFtKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIEdMdWludCAqc3ogKTsKIAogCkBAIC04MDgsOSArODIyLDExIEBACiBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfRE8oc3RydWN0IGJyd19jb21waWxlICpwLAogCQkJICAgICAgIEdMdWludCBleGVjdXRlX3NpemUpOwogCi12b2lkIGJyd19XSElMRShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAorc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X1dISUxFKHN0cnVjdCBicndfY29tcGlsZSAqcCwgCiAJICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnBhdGNoX2luc24pOwogCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfQlJFQUsoc3RydWN0IGJyd19jb21waWxlICpwKTsKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19DT05UKHN0cnVjdCBicndfY29tcGlsZSAqcCk7CiAvKiBGb3J3YXJkIGp1bXBzOgogICovCiB2b2lkIGJyd19sYW5kX2Z3ZF9qdW1wKHN0cnVjdCBicndfY29tcGlsZSAqcCwgCkBAIC04NjAsNSArODc2LDYgQEAKIAkJICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAogCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOwogCi0KK3ZvaWQgYnJ3X3NldF9zcmMxKCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyByZWcgKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZXVfZW1pdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZXVfZW1pdC5jCmluZGV4IDk5OTJiNDcuLjZiOTdmOGIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2V1X2VtaXQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ldV9lbWl0LmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGJyd19zZXRfc3JjMSggc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKK3ZvaWQgYnJ3X3NldF9zcmMxKCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLAogCQkJICBzdHJ1Y3QgYnJ3X3JlZyByZWcgKQogewogICAgYXNzZXJ0KHJlZy5maWxlICE9IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgKiBpbiB0aGUgZnV0dXJlOgogICAgICAgICovCiAgICAgICBhc3NlcnQgKHJlZy5hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKTsKLSAgICAgIGFzc2VydCAocmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisgICAgICAvL2Fzc2VydCAocmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CiAKICAgICAgIGlmIChpbnNuLT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpIHsKIAkgaW5zbi0+Yml0czMuZGExLnNyYzFfc3VicmVnX25yID0gcmVnLnN1Ym5yOwpAQCAtMzE4LDcgKzMxOCw4IEBACiAgICBpbnNuLT5iaXRzMy5kcF9yZWFkLmVuZF9vZl90aHJlYWQgPSBlbmRfb2ZfdGhyZWFkOwogfQogCi1zdGF0aWMgdm9pZCBicndfc2V0X3NhbXBsZXJfbWVzc2FnZSggc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKK3N0YXRpYyB2b2lkIGJyd19zZXRfc2FtcGxlcl9tZXNzYWdlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLAogCQkJCSAgICAgR0x1aW50IGJpbmRpbmdfdGFibGVfaW5kZXgsCiAJCQkJICAgICBHTHVpbnQgc2FtcGxlciwKIAkJCQkgICAgIEdMdWludCBtc2dfdHlwZSwKQEAgLTMyOCwxNCArMzI5LDI0IEBACiB7CiAgICBicndfc2V0X3NyYzEoaW5zbiwgYnJ3X2ltbV9kKDApKTsKIAotICAgaW5zbi0+Yml0czMuc2FtcGxlci5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKLSAgIGluc24tPmJpdHMzLnNhbXBsZXIuc2FtcGxlciA9IHNhbXBsZXI7Ci0gICBpbnNuLT5iaXRzMy5zYW1wbGVyLm1zZ190eXBlID0gbXNnX3R5cGU7Ci0gICBpbnNuLT5iaXRzMy5zYW1wbGVyLnJldHVybl9mb3JtYXQgPSBCUldfU0FNUExFUl9SRVRVUk5fRk9STUFUX0ZMT0FUMzI7Ci0gICBpbnNuLT5iaXRzMy5zYW1wbGVyLnJlc3BvbnNlX2xlbmd0aCA9IHJlc3BvbnNlX2xlbmd0aDsKLSAgIGluc24tPmJpdHMzLnNhbXBsZXIubXNnX2xlbmd0aCA9IG1zZ19sZW5ndGg7Ci0gICBpbnNuLT5iaXRzMy5zYW1wbGVyLmVuZF9vZl90aHJlYWQgPSBlb3Q7Ci0gICBpbnNuLT5iaXRzMy5zYW1wbGVyLm1zZ190YXJnZXQgPSBCUldfTUVTU0FHRV9UQVJHRVRfU0FNUExFUjsKKyAgIGlmIChCUldfSVNfR000NShicncpIHx8IEJSV19JU19HNFgoYnJ3KSkgeworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlcl9nbTQ1X2c0eC5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ200NV9nNHguc2FtcGxlciA9IHNhbXBsZXI7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dtNDVfZzR4Lm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dtNDVfZzR4LnJlc3BvbnNlX2xlbmd0aCA9IHJlc3BvbnNlX2xlbmd0aDsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ200NV9nNHgubXNnX2xlbmd0aCA9IG1zZ19sZW5ndGg7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dtNDVfZzR4LmVuZF9vZl90aHJlYWQgPSBlb3Q7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dtNDVfZzR4Lm1zZ190YXJnZXQgPSBCUldfTUVTU0FHRV9UQVJHRVRfU0FNUExFUjsKKyAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyLmJpbmRpbmdfdGFibGVfaW5kZXggPSBiaW5kaW5nX3RhYmxlX2luZGV4OworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlci5zYW1wbGVyID0gc2FtcGxlcjsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIubXNnX3R5cGUgPSBtc2dfdHlwZTsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIucmV0dXJuX2Zvcm1hdCA9IEJSV19TQU1QTEVSX1JFVFVSTl9GT1JNQVRfRkxPQVQzMjsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIucmVzcG9uc2VfbGVuZ3RoID0gcmVzcG9uc2VfbGVuZ3RoOworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlci5tc2dfbGVuZ3RoID0gbXNnX2xlbmd0aDsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIuZW5kX29mX3RocmVhZCA9IGVvdDsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIubXNnX3RhcmdldCA9IEJSV19NRVNTQUdFX1RBUkdFVF9TQU1QTEVSOworICAgfQogfQogCiAKQEAgLTU5Nyw2ICs2MDgsMzQgQEAKICAgIH0KIH0KIAorc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X0JSRUFLKHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfQlJFQUspOworICAgYnJ3X3NldF9kZXN0KGluc24sIGJyd19pcF9yZWcoKSk7CisgICBicndfc2V0X3NyYzAoaW5zbiwgYnJ3X2lwX3JlZygpKTsKKyAgIGJyd19zZXRfc3JjMShpbnNuLCBicndfaW1tX2QoMHgwKSk7CisgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOworICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfODsKKyAgIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19ESVNBQkxFOworICAgaW5zbi0+Yml0czMuaWZfZWxzZS5wYWQwID0gMDsKKyAgIHJldHVybiBpbnNuOworfQorCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfQ09OVChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworICAgaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX0NPTlRJTlVFKTsKKyAgIGJyd19zZXRfZGVzdChpbnNuLCBicndfaXBfcmVnKCkpOworICAgYnJ3X3NldF9zcmMwKGluc24sIGJyd19pcF9yZWcoKSk7CisgICBicndfc2V0X3NyYzEoaW5zbiwgYnJ3X2ltbV9kKDB4MCkpOworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9IEJSV19FWEVDVVRFXzg7CisgICBpbnNuLT5oZWFkZXIubWFza19jb250cm9sID0gQlJXX01BU0tfRElTQUJMRTsKKyAgIGluc24tPmJpdHMzLmlmX2Vsc2UucGFkMCA9IDA7CisgICByZXR1cm4gaW5zbjsKK30KKwogLyogRE8vV0hJTEUgbG9vcDoKICAqLwogc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X0RPKHN0cnVjdCBicndfY29tcGlsZSAqcCwgR0x1aW50IGV4ZWN1dGVfc2l6ZSkKQEAgLTYwOCwxMyArNjQ3LDE1IEBACiAKICAgICAgIC8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0cyBmb3IgdGhpcyBpbnN0cnVjdGlvbjoKICAgICAgICAqLwotICAgICAgYnJ3X3NldF9kZXN0KGluc24sIHJldHlwZShicndfdmVjMV9ncmYoMCwwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKLSAgICAgIGJyd19zZXRfc3JjMChpbnNuLCByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDAsMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7Ci0gICAgICBicndfc2V0X3NyYzEoaW5zbiwgcmV0eXBlKGJyd192ZWMxX2dyZigwLDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgYnJ3X3NldF9kZXN0KGluc24sIGJyd19udWxsX3JlZygpKTsKKyAgICAgIGJyd19zZXRfc3JjMChpbnNuLCBicndfbnVsbF9yZWcoKSk7CisgICAgICBicndfc2V0X3NyYzEoaW5zbiwgYnJ3X251bGxfcmVnKCkpOwogCiAgICAgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOwogICAgICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gZXhlY3V0ZV9zaXplOworICAgICAgaW5zbi0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID0gQlJXX1BSRURJQ0FURV9OT05FOwogICAgICAgLyogaW5zbi0+aGVhZGVyLm1hc2tfY29udHJvbCA9IEJSV19NQVNLX0VOQUJMRTsgKi8KKyAgICAgIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19ESVNBQkxFOwogCiAgICAgICByZXR1cm4gaW5zbjsKICAgIH0KQEAgLTYyMiw3ICs2NjMsNyBAQAogCiAKIAotdm9pZCBicndfV0hJTEUoc3RydWN0IGJyd19jb21waWxlICpwLCAKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19XSElMRShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAogCSAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpkb19pbnNuKQogewogICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbjsKQEAgLTY0NiwxNCArNjg3LDE2IEBACiAgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBkb19pbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemU7CiAKICAgICAgIGFzc2VydChkb19pbnNuLT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfRE8pOwotICAgICAgaW5zbi0+Yml0czMuaWZfZWxzZS5qdW1wX2NvdW50ID0gZG9faW5zbiAtIGluc247CisgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLmp1bXBfY291bnQgPSBkb19pbnNuIC0gaW5zbiArIDE7CiAgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLnBvcF9jb3VudCA9IDA7CiAgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLnBhZDAgPSAwOwogICAgfQogCiAvKiAgICBpbnNuLT5oZWFkZXIubWFza19jb250cm9sID0gQlJXX01BU0tfRU5BQkxFOyAqLwogCisgICBpbnNuLT5oZWFkZXIubWFza19jb250cm9sID0gQlJXX01BU0tfRElTQUJMRTsKICAgIHAtPmN1cnJlbnQtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IEJSV19QUkVESUNBVEVfTk9ORTsgICAKKyAgIHJldHVybiBpbnNuOwogfQogCiAKQEAgLTk4NSw3ICsxMDI4LDcgQEAKIAogICAgICAgYnJ3X3NldF9kZXN0KGluc24sIGRlc3QpOwogICAgICAgYnJ3X3NldF9zcmMwKGluc24sIHNyYzApOwotICAgICAgYnJ3X3NldF9zYW1wbGVyX21lc3NhZ2UoaW5zbiwKKyAgICAgIGJyd19zZXRfc2FtcGxlcl9tZXNzYWdlKHAtPmJydywgaW5zbiwKIAkJCSAgICAgIGJpbmRpbmdfdGFibGVfaW5kZXgsCiAJCQkgICAgICBzYW1wbGVyLAogCQkJICAgICAgbXNnX3R5cGUsCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19leGVjX2dlbmVyaWMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2V4ZWNfZ2VuZXJpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQxZWY3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2V4ZWNfZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNCBUdW5nc3RlbiBHcmFwaGljcyBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLQotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUFUSSwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQotVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBBdXRob3JzOgotICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+Ci0gKi8KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgInZ0eGZtdC5oIgotI2luY2x1ZGUgImRsaXN0LmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJsaWdodC5oIgotI2luY2x1ZGUgImFwaV9hcnJheWVsdC5oIgotI2luY2x1ZGUgImFwaV9ub29wLmgiCi0KLSNpbmNsdWRlICJicndfZXhlYy5oIgotCi0KLS8qIFZlcnNpb25zIG9mIGFsbCB0aGUgZW50cnlwb2ludHMgZm9yIHNpdHVhdGlvbnMgd2hlcmUgY29kZWdlbiBpc24ndAotICogYXZhaWxhYmxlLiAgCi0gKgotICogTm90ZTogT25seSBvbmUgc2l6ZSBmb3IgZWFjaCBhdHRyaWJ1dGUgbWF5IGJlIGFjdGl2ZSBhdCBvbmNlLgotICogRWcuIGlmIENvbG9yM2YgaXMgaW5zdGFsbGVkL2FjdGl2ZSwgdGhlbiBDb2xvcjRmIG1heSBub3QgYmUsIGV2ZW4KLSAqIGlmIHRoZSB2ZXJ0ZXggYWN0dWFsbHkgY29udGFpbnMgNCBjb2xvciBjb29yZGluYXRlcy4gIFRoaXMgaXMKLSAqIGJlY2F1c2UgdGhlIDNmIHZlcnNpb24gd29uJ3Qgb3RoZXJ3aXNlIHNldCBjb2xvclszXSB0byAxLjAgLS0gdGhpcwotICogaXMgdGhlIGpvYiBvZiB0aGUgY2hvb3NlciBmdW5jdGlvbiB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIENvbG9yNGYKLSAqIGFuZCBDb2xvcjNmLgotICovCi0jZGVmaW5lIEFUVFJGViggQVRUUiwgTiApCQkJCVwKLXN0YXRpYyB2b2lkIGF0dHJpYl8jI0FUVFIjI18jI04oIGNvbnN0IEdMZmxvYXQgKnYgKQlcCi17CQkJCQkJCVwKLSAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoIGN0eCApOwkJCQlcCi0gICBzdHJ1Y3QgYnJ3X2V4ZWNfY29udGV4dCAqZXhlYyA9IElNTV9DT05URVhUKGN0eCktPmV4ZWM7CQkJXAotCQkJCQkJCVwKLSAgIGlmICgoQVRUUikgPT0gMCkgewkJCQkJXAotICAgICAgR0x1aW50IGk7CQkJCQkJXAotCQkJCQkJCVwKLSAgICAgIGlmIChOPjApIGV4ZWMtPnZ0eC52YnB0clswXSA9IHZbMF07CQlcCi0gICAgICBpZiAoTj4xKSBleGVjLT52dHgudmJwdHJbMV0gPSB2WzFdOwkJXAotICAgICAgaWYgKE4+MikgZXhlYy0+dnR4LnZicHRyWzJdID0gdlsyXTsJCVwKLSAgICAgIGlmIChOPjMpIGV4ZWMtPnZ0eC52YnB0clszXSA9IHZbM107CQlcCi0JCQkJCQkJXAotICAgICAgZm9yIChpID0gTjsgaSA8IGV4ZWMtPnZ0eC52ZXJ0ZXhfc2l6ZTsgaSsrKQlcCi0JIGV4ZWMtPnZ0eC52YnB0cltpXSA9IGV4ZWMtPnZ0eC52ZXJ0ZXhbaV07CVwKLQkJCQkJCQlcCi0gICAgICBleGVjLT52dHgudmJwdHIgKz0gZXhlYy0+dnR4LnZlcnRleF9zaXplOwkJXAotICAgICAgZXhlYy0+Y3R4LT5Ecml2ZXIuTmVlZEZsdXNoIHw9IEZMVVNIX1NUT1JFRF9WRVJUSUNFUzsgXAotCQkJCQkJCVwKLSAgICAgIGlmICgrK2V4ZWMtPnZ0eC52ZXJ0X2NvdW50ID49IGV4ZWMtPnZ0eC5tYXhfdmVydCkJXAotCSBicndfZXhlY192dHhfd3JhcCggZXhlYyApOwkJXAotICAgfQkJCQkJCQlcCi0gICBlbHNlIHsJCQkJCQlcCi0gICAgICBHTGZsb2F0ICpkZXN0ID0gZXhlYy0+dnR4LmF0dHJwdHJbQVRUUl07CQlcCi0gICAgICBpZiAoTj4wKSBkZXN0WzBdID0gdlswXTsJCQkJXAotICAgICAgaWYgKE4+MSkgZGVzdFsxXSA9IHZbMV07CQkJCVwKLSAgICAgIGlmIChOPjIpIGRlc3RbMl0gPSB2WzJdOwkJCQlcCi0gICAgICBpZiAoTj4zKSBkZXN0WzNdID0gdlszXTsJCQkJXAotICAgfQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgSU5JVChUQUIsIEFUVFIpCQkJCQkJXAotICAgVEFCW0FUVFJdWzBdID0gYXR0cmliXyMjQVRUUiMjXzE7CQkJCVwKLSAgIFRBQltBVFRSXVsxXSA9IGF0dHJpYl8jI0FUVFIjI18yOwkJCQlcCi0gICBUQUJbQVRUUl1bMl0gPSBhdHRyaWJfIyNBVFRSIyNfMzsJCQkJXAotICAgVEFCW0FUVFJdWzNdID0gYXR0cmliXyMjQVRUUiMjXzQ7Ci0KLQotI2RlZmluZSBBVFRSUyggQVRUUklCICkJCQkJXAotICAgQVRUUkZWKCBBVFRSSUIsIDEgKQkJCQlcCi0gICBBVFRSRlYoIEFUVFJJQiwgMiApCQkJCVwKLSAgIEFUVFJGViggQVRUUklCLCAzICkJCQkJXAotICAgQVRUUkZWKCBBVFRSSUIsIDQgKQkJCQotCi1BVFRSUyggMCApCi1BVFRSUyggMSApCi1BVFRSUyggMiApCi1BVFRSUyggMyApCi1BVFRSUyggNCApCi1BVFRSUyggNSApCi1BVFRSUyggNiApCi1BVFRSUyggNyApCi1BVFRSUyggOCApCi1BVFRSUyggOSApCi1BVFRSUyggMTAgKQotQVRUUlMoIDExICkKLUFUVFJTKCAxMiApCi1BVFRSUyggMTMgKQotQVRUUlMoIDE0ICkKLUFUVFJTKCAxNSApCi0KLXZvaWQgYnJ3X2V4ZWNfZ2VuZXJpY19hdHRyX3RhYmxlX2luaXQoIGJyd19hdHRyZnZfZnVuYyAoKnRhYilbNF0gKQotewotICAgSU5JVCggdGFiLCAwICk7Ci0gICBJTklUKCB0YWIsIDEgKTsKLSAgIElOSVQoIHRhYiwgMiApOwotICAgSU5JVCggdGFiLCAzICk7Ci0gICBJTklUKCB0YWIsIDQgKTsKLSAgIElOSVQoIHRhYiwgNSApOwotICAgSU5JVCggdGFiLCA2ICk7Ci0gICBJTklUKCB0YWIsIDcgKTsKLSAgIElOSVQoIHRhYiwgOCApOwotICAgSU5JVCggdGFiLCA5ICk7Ci0gICBJTklUKCB0YWIsIDEwICk7Ci0gICBJTklUKCB0YWIsIDExICk7Ci0gICBJTklUKCB0YWIsIDEyICk7Ci0gICBJTklUKCB0YWIsIDEzICk7Ci0gICBJTklUKCB0YWIsIDE0ICk7Ci0gICBJTklUKCB0YWIsIDE1ICk7Ci19Ci0KLS8qIFRoZXNlIGNhbiBiZSBtYWRlIGVmZmljaWVudCB3aXRoIGNvZGVnZW4uICBGdXJ0aGVyLCBieSBhZGRpbmcgbW9yZQotICogbG9naWMgdG8gZG9fY2hvb3NlKCksIHRoZSBkb3VibGUtZGlzcGF0Y2ggZm9yIGxlZ2FjeSBlbnRyeXBvaW50cwotICogbGlrZSBnbFZlcnRleDNmKCkgY2FuIGJlIHJlbW92ZWQuCi0gKi8KLSNkZWZpbmUgRElTUEFUQ0hfQVRUUkZWKCBBVFRSLCBDT1VOVCwgUCApCVwKLWRvIHsJCQkJCQlcCi0gICBHRVRfQ1VSUkVOVF9DT05URVhUKCBjdHggKTsgCQkJXAotICAgc3RydWN0IGJyd19leGVjX2NvbnRleHQgKmV4ZWMgPSBJTU1fQ09OVEVYVChjdHgpLT5leGVjOyAJCVwKLSAgIGV4ZWMtPnZ0eC50YWJmdltBVFRSXVtDT1VOVC0xXSggUCApOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBESVNQQVRDSF9BVFRSMUZWKCBBVFRSLCBWICkgRElTUEFUQ0hfQVRUUkZWKCBBVFRSLCAxLCBWICkKLSNkZWZpbmUgRElTUEFUQ0hfQVRUUjJGViggQVRUUiwgViApIERJU1BBVENIX0FUVFJGViggQVRUUiwgMiwgViApCi0jZGVmaW5lIERJU1BBVENIX0FUVFIzRlYoIEFUVFIsIFYgKSBESVNQQVRDSF9BVFRSRlYoIEFUVFIsIDMsIFYgKQotI2RlZmluZSBESVNQQVRDSF9BVFRSNEZWKCBBVFRSLCBWICkgRElTUEFUQ0hfQVRUUkZWKCBBVFRSLCA0LCBWICkKLQotI2RlZmluZSBESVNQQVRDSF9BVFRSMUYoIEFUVFIsIFMgKSBESVNQQVRDSF9BVFRSRlYoIEFUVFIsIDEsICYoUykgKQotCi0jZGVmaW5lIERJU1BBVENIX0FUVFIyRiggQVRUUiwgUyxUICkgCQlcCi1kbyB7IAkJCQkJCVwKLSAgIEdMZmxvYXQgdlsyXTsgCQkJCVwKLSAgIHZbMF0gPSBTOyB2WzFdID0gVDsJCQkJXAotICAgRElTUEFUQ0hfQVRUUjJGViggQVRUUiwgdiApOwkJCVwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIERJU1BBVENIX0FUVFIzRiggQVRUUiwgUyxULFIgKSAJCVwKLWRvIHsgCQkJCQkJXAotICAgR0xmbG9hdCB2WzNdOyAJCQkJXAotICAgdlswXSA9IFM7IHZbMV0gPSBUOyB2WzJdID0gUjsJCVwKLSAgIERJU1BBVENIX0FUVFIzRlYoIEFUVFIsIHYgKTsJCQlcCi19IHdoaWxlICgwKQotI2RlZmluZSBESVNQQVRDSF9BVFRSNEYoIEFUVFIsIFMsVCxSLFEgKQlcCi1kbyB7IAkJCQkJCVwKLSAgIEdMZmxvYXQgdls0XTsgCQkJCVwKLSAgIHZbMF0gPSBTOyB2WzFdID0gVDsgdlsyXSA9IFI7IHZbM10gPSBROwlcCi0gICBESVNQQVRDSF9BVFRSNEZWKCBBVFRSLCB2ICk7CQkJXAotfSB3aGlsZSAoMCkKLQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXgyZiggR0xmbG9hdCB4LCBHTGZsb2F0IHkgKQotewotICAgRElTUEFUQ0hfQVRUUjJGKCBCUldfQVRUUklCX1BPUywgeCwgeSApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXgyZnYoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjJGViggQlJXX0FUVFJJQl9QT1MsIHYgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVmVydGV4M2YoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQotewotICAgRElTUEFUQ0hfQVRUUjNGKCBCUldfQVRUUklCX1BPUywgeCwgeSwgeiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXgzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjNGViggQlJXX0FUVFJJQl9QT1MsIHYgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVmVydGV4NGYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIAotCQkJCSAgICAgIEdMZmxvYXQgdyApCi17Ci0gICBESVNQQVRDSF9BVFRSNEYoIEJSV19BVFRSSUJfUE9TLCB4LCB5LCB6LCB3ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleDRmdiggY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBESVNQQVRDSF9BVFRSNEZWKCBCUldfQVRUUklCX1BPUywgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19UZXhDb29yZDFmKCBHTGZsb2F0IHggKQotewotICAgRElTUEFUQ0hfQVRUUjFGKCBCUldfQVRUUklCX1RFWDAsIHggKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVGV4Q29vcmQxZnYoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjFGViggQlJXX0FUVFJJQl9URVgwLCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1RleENvb3JkMmYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5ICkKLXsKLSAgIERJU1BBVENIX0FUVFIyRiggQlJXX0FUVFJJQl9URVgwLCB4LCB5ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1RleENvb3JkMmZ2KCBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIERJU1BBVENIX0FUVFIyRlYoIEJSV19BVFRSSUJfVEVYMCwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19UZXhDb29yZDNmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRiggQlJXX0FUVFJJQl9URVgwLCB4LCB5LCB6ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1RleENvb3JkM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRlYoIEJSV19BVFRSSUJfVEVYMCwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19UZXhDb29yZDRmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LAotCQkJCQlHTGZsb2F0IHcgKQotewotICAgRElTUEFUQ0hfQVRUUjRGKCBCUldfQVRUUklCX1RFWDAsIHgsIHksIHosIHcgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVGV4Q29vcmQ0ZnYoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjRGViggQlJXX0FUVFJJQl9URVgwLCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X05vcm1hbDNmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRiggQlJXX0FUVFJJQl9OT1JNQUwsIHgsIHksIHogKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTm9ybWFsM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRlYoIEJSV19BVFRSSUJfTk9STUFMLCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X0ZvZ0Nvb3JkZkVYVCggR0xmbG9hdCB4ICkKLXsKLSAgIERJU1BBVENIX0FUVFIxRiggQlJXX0FUVFJJQl9GT0csIHggKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfRm9nQ29vcmRmdkVYVCggY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBESVNQQVRDSF9BVFRSMUZWKCBCUldfQVRUUklCX0ZPRywgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19Db2xvcjNmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRiggQlJXX0FUVFJJQl9DT0xPUjAsIHgsIHksIHogKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfQ29sb3IzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjNGViggQlJXX0FUVFJJQl9DT0xPUjAsIHYgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfQ29sb3I0ZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgCi0JCQkJICAgICBHTGZsb2F0IHcgKQotewotICAgRElTUEFUQ0hfQVRUUjRGKCBCUldfQVRUUklCX0NPTE9SMCwgeCwgeSwgeiwgdyApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19Db2xvcjRmdiggY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBESVNQQVRDSF9BVFRSNEZWKCBCUldfQVRUUklCX0NPTE9SMCwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19TZWNvbmRhcnlDb2xvcjNmRVhUKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgCi0JCQkJCQkgR0xmbG9hdCB6ICkKLXsKLSAgIERJU1BBVENIX0FUVFIzRiggQlJXX0FUVFJJQl9DT0xPUjEsIHgsIHksIHogKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfU2Vjb25kYXJ5Q29sb3IzZnZFWFQoIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgRElTUEFUQ0hfQVRUUjNGViggQlJXX0FUVFJJQl9DT0xPUjEsIHYgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTXVsdGlUZXhDb29yZDFmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHggICkKLXsKLSAgIEdMdWludCBhdHRyID0gKHRhcmdldCAmIDB4NykgKyBCUldfQVRUUklCX1RFWDA7Ci0gICBESVNQQVRDSF9BVFRSMUYoIGF0dHIsIHggKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTXVsdGlUZXhDb29yZDFmdiggR0xlbnVtIHRhcmdldCwKLQkJCQkJICAgICAgY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBHTHVpbnQgYXR0ciA9ICh0YXJnZXQgJiAweDcpICsgQlJXX0FUVFJJQl9URVgwOwotICAgRElTUEFUQ0hfQVRUUjFGViggYXR0ciwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19NdWx0aVRleENvb3JkMmYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgeCwgCi0JCQkJCSAgICAgR0xmbG9hdCB5ICkKLXsKLSAgIEdMdWludCBhdHRyID0gKHRhcmdldCAmIDB4NykgKyBCUldfQVRUUklCX1RFWDA7Ci0gICBESVNQQVRDSF9BVFRSMkYoIGF0dHIsIHgsIHkgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTXVsdGlUZXhDb29yZDJmdiggR0xlbnVtIHRhcmdldCwgCi0JCQkJCSAgICAgIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgR0x1aW50IGF0dHIgPSAodGFyZ2V0ICYgMHg3KSArIEJSV19BVFRSSUJfVEVYMDsKLSAgIERJU1BBVENIX0FUVFIyRlYoIGF0dHIsIHYgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTXVsdGlUZXhDb29yZDNmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHgsIAotCQkJCQkgICAgIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotewotICAgR0x1aW50IGF0dHIgPSAodGFyZ2V0ICYgMHg3KSArIEJSV19BVFRSSUJfVEVYMDsKLSAgIERJU1BBVENIX0FUVFIzRiggYXR0ciwgeCwgeSwgeiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19NdWx0aVRleENvb3JkM2Z2KCBHTGVudW0gdGFyZ2V0LCAKLQkJCQkJICAgICAgY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBHTHVpbnQgYXR0ciA9ICh0YXJnZXQgJiAweDcpICsgQlJXX0FUVFJJQl9URVgwOwotICAgRElTUEFUQ0hfQVRUUjNGViggYXR0ciwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19NdWx0aVRleENvb3JkNGYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgeCwgCi0JCQkJCSAgICAgR0xmbG9hdCB5LCBHTGZsb2F0IHosCi0JCQkJCSAgICAgR0xmbG9hdCB3ICkKLXsKLSAgIEdMdWludCBhdHRyID0gKHRhcmdldCAmIDB4NykgKyBCUldfQVRUUklCX1RFWDA7Ci0gICBESVNQQVRDSF9BVFRSNEYoIGF0dHIsIHgsIHksIHosIHcgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfTXVsdGlUZXhDb29yZDRmdiggR0xlbnVtIHRhcmdldCwgCi0JCQkJCSAgICAgIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgR0x1aW50IGF0dHIgPSAodGFyZ2V0ICYgMHg3KSArIEJSV19BVFRSSUJfVEVYMDsKLSAgIERJU1BBVENIX0FUVFI0RlYoIGF0dHIsIHYgKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXhBdHRyaWIxZk5WKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSMUYoIGluZGV4LCB4ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjFmdk5WKCBHTHVpbnQgaW5kZXgsIAotCQkJCQkgICAgICAgY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSMUZWKCBpbmRleCwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXhBdHRyaWIyZk5WKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgCi0JCQkJCSAgICAgIEdMZmxvYXQgeSApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSMkYoIGluZGV4LCB4LCB5ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjJmdk5WKCBHTHVpbnQgaW5kZXgsCi0JCQkJCSAgICAgICBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFIyRlYoIGluZGV4LCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjNmTlYoIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LAotCQkJCQkgICAgICBHTGZsb2F0IHksIEdMZmxvYXQgeiApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSM0YoIGluZGV4LCB4LCB5LCB6ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjNmdk5WKCBHTHVpbnQgaW5kZXgsCi0JCQkJCSAgICAgICBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFIzRlYoIGluZGV4LCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjRmTlYoIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LAotCQkJCQkgICAgICBHTGZsb2F0IHksIEdMZmxvYXQgeiwKLQkJCQkJICAgICAgR0xmbG9hdCB3ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFI0RiggaW5kZXgsIHgsIHksIHosIHcgKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVmVydGV4QXR0cmliNGZ2TlYoIEdMdWludCBpbmRleCwgCi0JCQkJCSAgICAgICBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFI0RlYoIGluZGV4LCB2ICk7Ci19Ci0KLQotLyoKLSAqIFhYWCBhZGp1c3QgaW5kZXgKLSAqLwotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXhBdHRyaWIxZkFSQiggR0x1aW50IGluZGV4LCBHTGZsb2F0IHggKQotewotICAgaWYgKGluZGV4ID49IEJSV19BVFRSSUJfRklSU1RfTUFURVJJQUwpIGluZGV4ID0gRVJST1JfQVRUUklCOwotICAgRElTUEFUQ0hfQVRUUjFGKCBpbmRleCwgeCApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXhBdHRyaWIxZnZBUkIoIEdMdWludCBpbmRleCwgCi0JCQkJCSAgICAgICBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFIxRlYoIGluZGV4LCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjJmQVJCKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgCi0JCQkJCSAgICAgIEdMZmxvYXQgeSApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSMkYoIGluZGV4LCB4LCB5ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjJmdkFSQiggR0x1aW50IGluZGV4LAotCQkJCQkgICAgICAgY29uc3QgR0xmbG9hdCAqdiApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSMkZWKCBpbmRleCwgdiApOwotfQotCi1zdGF0aWMgdm9pZCBHTEFQSUVOVFJZIGJyd19WZXJ0ZXhBdHRyaWIzZkFSQiggR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsCi0JCQkJCSAgICAgIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFIzRiggaW5kZXgsIHgsIHksIHogKTsKLX0KLQotc3RhdGljIHZvaWQgR0xBUElFTlRSWSBicndfVmVydGV4QXR0cmliM2Z2QVJCKCBHTHVpbnQgaW5kZXgsCi0JCQkJCSAgICAgICBjb25zdCBHTGZsb2F0ICp2ICkKLXsKLSAgIGlmIChpbmRleCA+PSBCUldfQVRUUklCX0ZJUlNUX01BVEVSSUFMKSBpbmRleCA9IEVSUk9SX0FUVFJJQjsKLSAgIERJU1BBVENIX0FUVFIzRlYoIGluZGV4LCB2ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjRmQVJCKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwKLQkJCQkJICAgICAgR0xmbG9hdCB5LCBHTGZsb2F0IHosCi0JCQkJCSAgICAgIEdMZmxvYXQgdyApCi17Ci0gICBpZiAoaW5kZXggPj0gQlJXX0FUVFJJQl9GSVJTVF9NQVRFUklBTCkgaW5kZXggPSBFUlJPUl9BVFRSSUI7Ci0gICBESVNQQVRDSF9BVFRSNEYoIGluZGV4LCB4LCB5LCB6LCB3ICk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdMQVBJRU5UUlkgYnJ3X1ZlcnRleEF0dHJpYjRmdkFSQiggR0x1aW50IGluZGV4LCAKLQkJCQkJICAgICAgIGNvbnN0IEdMZmxvYXQgKnYgKQotewotICAgaWYgKGluZGV4ID49IEJSV19BVFRSSUJfRklSU1RfTUFURVJJQUwpIGluZGV4ID0gRVJST1JfQVRUUklCOwotICAgRElTUEFUQ0hfQVRUUjRGViggaW5kZXgsIHYgKTsKLX0KLQotCi0vKiBJbnN0YWxsIHRoZSBnZW5lcmljIHZlcnNpb25zIG9mIHRoZSAybmQgbGV2ZWwgZGlzcGF0Y2gKLSAqIGZ1bmN0aW9ucy4gIFNvbWUgb2YgdGhlc2UgaGF2ZSBhIGNvZGVnZW4gYWx0ZXJuYXRpdmUuCi0gKi8KLXZvaWQgYnJ3X2V4ZWNfdnR4X2dlbmVyaWNfaW5pdCggc3RydWN0IGJyd19leGVjX2NvbnRleHQgKmV4ZWMgKQotewotICAgR0x2ZXJ0ZXhmb3JtYXQgKnZmbXQgPSAmZXhlYy0+dnR4Zm10OwotCi0gICB2Zm10LT5Db2xvcjNmID0gYnJ3X0NvbG9yM2Y7Ci0gICB2Zm10LT5Db2xvcjNmdiA9IGJyd19Db2xvcjNmdjsKLSAgIHZmbXQtPkNvbG9yNGYgPSBicndfQ29sb3I0ZjsKLSAgIHZmbXQtPkNvbG9yNGZ2ID0gYnJ3X0NvbG9yNGZ2OwotICAgdmZtdC0+Rm9nQ29vcmRmRVhUID0gYnJ3X0ZvZ0Nvb3JkZkVYVDsKLSAgIHZmbXQtPkZvZ0Nvb3JkZnZFWFQgPSBicndfRm9nQ29vcmRmdkVYVDsKLSAgIHZmbXQtPk11bHRpVGV4Q29vcmQxZkFSQiA9IGJyd19NdWx0aVRleENvb3JkMWY7Ci0gICB2Zm10LT5NdWx0aVRleENvb3JkMWZ2QVJCID0gYnJ3X011bHRpVGV4Q29vcmQxZnY7Ci0gICB2Zm10LT5NdWx0aVRleENvb3JkMmZBUkIgPSBicndfTXVsdGlUZXhDb29yZDJmOwotICAgdmZtdC0+TXVsdGlUZXhDb29yZDJmdkFSQiA9IGJyd19NdWx0aVRleENvb3JkMmZ2OwotICAgdmZtdC0+TXVsdGlUZXhDb29yZDNmQVJCID0gYnJ3X011bHRpVGV4Q29vcmQzZjsKLSAgIHZmbXQtPk11bHRpVGV4Q29vcmQzZnZBUkIgPSBicndfTXVsdGlUZXhDb29yZDNmdjsKLSAgIHZmbXQtPk11bHRpVGV4Q29vcmQ0ZkFSQiA9IGJyd19NdWx0aVRleENvb3JkNGY7Ci0gICB2Zm10LT5NdWx0aVRleENvb3JkNGZ2QVJCID0gYnJ3X011bHRpVGV4Q29vcmQ0ZnY7Ci0gICB2Zm10LT5Ob3JtYWwzZiA9IGJyd19Ob3JtYWwzZjsKLSAgIHZmbXQtPk5vcm1hbDNmdiA9IGJyd19Ob3JtYWwzZnY7Ci0gICB2Zm10LT5TZWNvbmRhcnlDb2xvcjNmRVhUID0gYnJ3X1NlY29uZGFyeUNvbG9yM2ZFWFQ7Ci0gICB2Zm10LT5TZWNvbmRhcnlDb2xvcjNmdkVYVCA9IGJyd19TZWNvbmRhcnlDb2xvcjNmdkVYVDsKLSAgIHZmbXQtPlRleENvb3JkMWYgPSBicndfVGV4Q29vcmQxZjsKLSAgIHZmbXQtPlRleENvb3JkMWZ2ID0gYnJ3X1RleENvb3JkMWZ2OwotICAgdmZtdC0+VGV4Q29vcmQyZiA9IGJyd19UZXhDb29yZDJmOwotICAgdmZtdC0+VGV4Q29vcmQyZnYgPSBicndfVGV4Q29vcmQyZnY7Ci0gICB2Zm10LT5UZXhDb29yZDNmID0gYnJ3X1RleENvb3JkM2Y7Ci0gICB2Zm10LT5UZXhDb29yZDNmdiA9IGJyd19UZXhDb29yZDNmdjsKLSAgIHZmbXQtPlRleENvb3JkNGYgPSBicndfVGV4Q29vcmQ0ZjsKLSAgIHZmbXQtPlRleENvb3JkNGZ2ID0gYnJ3X1RleENvb3JkNGZ2OwotICAgdmZtdC0+VmVydGV4MmYgPSBicndfVmVydGV4MmY7Ci0gICB2Zm10LT5WZXJ0ZXgyZnYgPSBicndfVmVydGV4MmZ2OwotICAgdmZtdC0+VmVydGV4M2YgPSBicndfVmVydGV4M2Y7Ci0gICB2Zm10LT5WZXJ0ZXgzZnYgPSBicndfVmVydGV4M2Z2OwotICAgdmZtdC0+VmVydGV4NGYgPSBicndfVmVydGV4NGY7Ci0gICB2Zm10LT5WZXJ0ZXg0ZnYgPSBicndfVmVydGV4NGZ2OwotICAgdmZtdC0+VmVydGV4QXR0cmliMWZOViA9IGJyd19WZXJ0ZXhBdHRyaWIxZk5WOwotICAgdmZtdC0+VmVydGV4QXR0cmliMWZ2TlYgPSBicndfVmVydGV4QXR0cmliMWZ2TlY7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWIyZk5WID0gYnJ3X1ZlcnRleEF0dHJpYjJmTlY7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWIyZnZOViA9IGJyd19WZXJ0ZXhBdHRyaWIyZnZOVjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjNmTlYgPSBicndfVmVydGV4QXR0cmliM2ZOVjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjNmdk5WID0gYnJ3X1ZlcnRleEF0dHJpYjNmdk5WOwotICAgdmZtdC0+VmVydGV4QXR0cmliNGZOViA9IGJyd19WZXJ0ZXhBdHRyaWI0Zk5WOwotICAgdmZtdC0+VmVydGV4QXR0cmliNGZ2TlYgPSBicndfVmVydGV4QXR0cmliNGZ2TlY7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWIxZkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIxZkFSQjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjFmdkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIxZnZBUkI7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWIyZkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIyZkFSQjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjJmdkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIyZnZBUkI7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWIzZkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIzZkFSQjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjNmdkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWIzZnZBUkI7Ci0gICB2Zm10LT5WZXJ0ZXhBdHRyaWI0ZkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWI0ZkFSQjsKLSAgIHZmbXQtPlZlcnRleEF0dHJpYjRmdkFSQiA9IGJyd19WZXJ0ZXhBdHRyaWI0ZnZBUkI7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19mYWxsYmFjay5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZmFsbGJhY2suYwppbmRleCA4NjQ2NGIyLi42OTNmNjhmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19mYWxsYmFjay5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2ZhbGxiYWNrLmMKQEAgLTM5LDM4ICszOSwzMiBAQAogI2luY2x1ZGUgIm1hY3Jvcy5oIgogI2luY2x1ZGUgIm10eXBlcy5oIgogCi0KLQotCi0KLQorI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfRkFMTEJBQ0tTCiAKIHN0YXRpYyBHTGJvb2xlYW4gZG9fY2hlY2tfZmFsbGJhY2soc3RydWN0IGJyd19jb250ZXh0ICpicncpCiB7CiAgICBHTGNvbnRleHQgKmN0eCA9ICZicnctPmludGVsLmN0eDsKICAgIEdMdWludCBpOwotICAgCisKICAgIC8qIEJSV19ORVdfTUVUQU9QUwogICAgICovCiAgICBpZiAoYnJ3LT5tZXRhb3BzLmFjdGl2ZSkKICAgICAgIHJldHVybiBHTF9GQUxTRTsKIAotICAgaWYgKGJydy0+aW50ZWwubm9fcmFzdCkKKyAgIGlmIChicnctPmludGVsLm5vX3Jhc3QpIHsKKyAgICAgIERCRygiRkFMTEJBQ0s6IHJhc3Rlcml6YXRpb24gZGlzYWJsZWRcbiIpOwogICAgICAgcmV0dXJuIEdMX1RSVUU7Ci0gICAKLSAgIC8qIF9ORVdfQlVGRkVSUwotICAgICovCi0gICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSAhPSBCVUZGRVJfQklUX0ZST05UX0xFRlQgJiYKLSAgICAgICBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICE9IEJVRkZFUl9CSVRfQkFDS19MRUZUKQotICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9CiAKICAgIC8qIF9ORVdfUkVOREVSTU9ERQogICAgICoKICAgICAqIFhYWDogbmVlZCB0byBzYXZlL3Jlc3RvcmUgUmVuZGVyTW9kZSBpbiBtZXRhb3BzIHN0YXRlLCBvcgogICAgICogc29tZWhvdyBtb3ZlIHRvIGEgbmV3IGF0dHJpYnMgcG9pbnRlcjoKICAgICAqLwotICAgaWYgKGN0eC0+UmVuZGVyTW9kZSAhPSBHTF9SRU5ERVIpCisgICBpZiAoY3R4LT5SZW5kZXJNb2RlICE9IEdMX1JFTkRFUikgeworICAgICAgREJHKCJGQUxMQkFDSzogcmVuZGVyIG1vZGVcbiIpOwogICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9CiAKICAgIC8qIF9ORVdfVEVYVFVSRToKICAgICAqLwpAQCAtNzksOCArNzMsMTMgQEAKICAgICAgIGlmICh0ZXhVbml0LT5fUmVhbGx5RW5hYmxlZCkgewogCSBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqID0gaW50ZWxfdGV4dHVyZV9vYmplY3QodGV4VW5pdC0+X0N1cnJlbnQpOwogCSBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgPSBpbnRlbE9iai0+YmFzZS5JbWFnZVswXVtpbnRlbE9iai0+Zmlyc3RMZXZlbF07Ci0JIGlmICh0ZXhJbWFnZS0+Qm9yZGVyKQorCSBpZiAodGV4SW1hZ2UtPkJvcmRlciB8fAorICAgICAgICAgKCh0ZXhJbWFnZS0+X0Jhc2VGb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UKSAmJgorICAgICAgICAgICgodGV4SW1hZ2UtPlRleE9iamVjdC0+V3JhcFMgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSB8fCAKKyAgICAgICAgICAgKHRleEltYWdlLT5UZXhPYmplY3QtPldyYXBUID09IEdMX0NMQU1QX1RPX0JPUkRFUikpKSkgeworCSAgICBEQkcoIkZBTExCQUNLOiB0ZXh0dXJlIGJvcmRlclxuIik7CiAJICAgIHJldHVybiBHTF9UUlVFOworCSB9CiAgICAgICB9CiAgICB9CiAgICAKQEAgLTg4LDYgKzg3LDcgQEAKICAgICAqLwogICAgaWYgKGJydy0+YXR0cmlicy5TdGVuY2lsLT5FbmFibGVkICYmIAogICAgICAgICFicnctPmludGVsLmh3X3N0ZW5jaWwpIHsKKyAgICAgIERCRygiRkFMTEJBQ0s6IHN0ZW5jaWxcbiIpOwogICAgICAgcmV0dXJuIEdMX1RSVUU7CiAgICB9CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgLmJydyAgPSBCUldfTkVXX01FVEFPUFMsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IGNoZWNrX2ZhbGxiYWNrCisgICAucHJlcGFyZSA9IGNoZWNrX2ZhbGxiYWNrCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2dzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ncy5jCmluZGV4IDczMjYzYTUuLjJkYWVmMDAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2dzLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZ3MuYwpAQCAtNjUsNyArNjUsNyBAQAogICAgCiAgICAvKiBCZWdpbiB0aGUgY29tcGlsYXRpb246CiAgICAgKi8KLSAgIGJyd19pbml0X2NvbXBpbGUoJmMuZnVuYyk7CisgICBicndfaW5pdF9jb21waWxlKGJydywgJmMuZnVuYyk7CiAKICAgIGMuZnVuYy5zaW5nbGVfcHJvZ3JhbV9mbG93ID0gMTsKIApAQCAtMTE5LDI2ICsxMTksMTUgQEAKIAogICAgLyogVXBsb2FkCiAgICAgKi8KLSAgIGJydy0+Z3MucHJvZ19nc19vZmZzZXQgPSBicndfdXBsb2FkX2NhY2hlKCAmYnJ3LT5jYWNoZVtCUldfR1NfUFJPR10sCi0JCQkJCSAgICAgICZjLmtleSwKLQkJCQkJICAgICAgc2l6ZW9mKGMua2V5KSwKLQkJCQkJICAgICAgcHJvZ3JhbSwKLQkJCQkJICAgICAgcHJvZ3JhbV9zaXplLAotCQkJCQkgICAgICAmYy5wcm9nX2RhdGEsCi0JCQkJCSAgICAgICZicnctPmdzLnByb2dfZGF0YSApOworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+Z3MucHJvZ19ibyk7CisgICBicnctPmdzLnByb2dfYm8gPSBicndfdXBsb2FkX2NhY2hlKCAmYnJ3LT5jYWNoZSwgQlJXX0dTX1BST0csCisJCQkJICAgICAgICZjLmtleSwgc2l6ZW9mKGMua2V5KSwKKwkJCQkgICAgICAgTlVMTCwgMCwKKwkJCQkgICAgICAgcHJvZ3JhbSwgcHJvZ3JhbV9zaXplLAorCQkJCSAgICAgICAmYy5wcm9nX2RhdGEsCisJCQkJICAgICAgICZicnctPmdzLnByb2dfZGF0YSApOwogfQogCi0KLXN0YXRpYyBHTGJvb2xlYW4gc2VhcmNoX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgCi0JCQkgICAgICAgc3RydWN0IGJyd19nc19wcm9nX2tleSAqa2V5ICkKLXsKLSAgIHJldHVybiBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlW0JSV19HU19QUk9HXSwgCi0JCQkgICBrZXksIHNpemVvZigqa2V5KSwKLQkJCSAgICZicnctPmdzLnByb2dfZGF0YSwKLQkJCSAgICZicnctPmdzLnByb2dfZ3Nfb2Zmc2V0KTsKLX0KLQotCiBzdGF0aWMgY29uc3QgR0xlbnVtIGdzX3ByaW1bR0xfUE9MWUdPTisxXSA9IHsgIAogICAgR0xfUE9JTlRTLAogICAgR0xfTElORVMsCkBAIC0xNzMsMTAgKzE2Miw5IEBACiAKIC8qIENhbGN1bGF0ZSBpbnRlcnBvbGFudHMgZm9yIHRyaWFuZ2xlIGFuZCBsaW5lIHJhc3Rlcml6YXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIHVwbG9hZF9nc19wcm9nKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCitzdGF0aWMgdm9pZCBwcmVwYXJlX2dzX3Byb2coc3RydWN0IGJyd19jb250ZXh0ICpicncpCiB7CiAgICBzdHJ1Y3QgYnJ3X2dzX3Byb2dfa2V5IGtleTsKLQogICAgLyogUG9wdWxhdGUgdGhlIGtleToKICAgICAqLwogICAgcG9wdWxhdGVfa2V5KGJydywgJmtleSk7CkBAIC0xODcsNyArMTc1LDEyIEBACiAgICB9CiAKICAgIGlmIChicnctPmdzLnByb2dfYWN0aXZlKSB7Ci0gICAgICBpZiAoIXNlYXJjaF9jYWNoZShicncsICZrZXkpKQorICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+Z3MucHJvZ19ibyk7CisgICAgICBicnctPmdzLnByb2dfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfR1NfUFJPRywKKwkJCQkJICZrZXksIHNpemVvZihrZXkpLAorCQkJCQkgTlVMTCwgMCwKKwkJCQkJICZicnctPmdzLnByb2dfZGF0YSk7CisgICAgICBpZiAoYnJ3LT5ncy5wcm9nX2JvID09IE5VTEwpCiAJIGNvbXBpbGVfZ3NfcHJvZyggYnJ3LCAma2V5ICk7CiAgICB9CiB9CkBAIC0xOTksNSArMTkyLDUgQEAKICAgICAgIC5icncgICA9IEJSV19ORVdfUFJJTUlUSVZFLAogICAgICAgLmNhY2hlID0gQ0FDSEVfTkVXX1ZTX1BST0cKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX2dzX3Byb2cKKyAgIC5wcmVwYXJlID0gcHJlcGFyZV9nc19wcm9nCiB9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZ3MuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2dzLmgKaW5kZXggMjlhNGU4MC4uMThhNDUzNyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZ3MuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19ncy5oCkBAIC00MCwxMSArNDAsMTEgQEAKICNkZWZpbmUgTUFYX0dTX1ZFUlRTICg0KQkgICAgIAogCiBzdHJ1Y3QgYnJ3X2dzX3Byb2dfa2V5IHsKKyAgIEdMdWludCBhdHRyczozMjsKICAgIEdMdWludCBwcmltaXRpdmU6NDsKLSAgIEdMdWludCBhdHRyczoxNjsJCQogICAgR0x1aW50IGhpbnRfZ3NfYWx3YXlzOjE7CiAgICBHTHVpbnQgbmVlZF9nc19wcm9nOjE7Ci0gICBHTHVpbnQgcGFkOjEwOworICAgR0x1aW50IHBhZDoyNjsKIH07CiAKIHN0cnVjdCBicndfZ3NfY29tcGlsZSB7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19nc19zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfZ3Nfc3RhdGUuYwppbmRleCA1ODI2YzAxLi5mZjJlM2FiIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19nc19zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2dzX3N0YXRlLmMKQEAgLTM2LDQ3ICszNiwxMDEgQEAKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgogCitzdHJ1Y3QgYnJ3X2dzX3VuaXRfa2V5IHsKKyAgIHVuc2lnbmVkIGludCB0b3RhbF9ncmY7CisgICB1bnNpZ25lZCBpbnQgdXJiX2VudHJ5X3JlYWRfbGVuZ3RoOwogCisgICB1bnNpZ25lZCBpbnQgY3VyYmVfb2Zmc2V0OwogCi1zdGF0aWMgdm9pZCB1cGxvYWRfZ3NfdW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQorICAgdW5zaWduZWQgaW50IG5yX3VyYl9lbnRyaWVzLCB1cmJfc2l6ZTsKKyAgIEdMYm9vbGVhbiBwcm9nX2FjdGl2ZTsKK307CisKK3N0YXRpYyB2b2lkCitnc191bml0X3BvcHVsYXRlX2tleShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd19nc191bml0X2tleSAqa2V5KQoreworICAgbWVtc2V0KGtleSwgMCwgc2l6ZW9mKCprZXkpKTsKKworICAgLyogQ0FDSEVfTkVXX0dTX1BST0cgKi8KKyAgIGtleS0+cHJvZ19hY3RpdmUgPSBicnctPmdzLnByb2dfYWN0aXZlOworICAgaWYgKGtleS0+cHJvZ19hY3RpdmUpIHsKKyAgICAgIGtleS0+dG90YWxfZ3JmID0gYnJ3LT5ncy5wcm9nX2RhdGEtPnRvdGFsX2dyZjsKKyAgICAgIGtleS0+dXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5ncy5wcm9nX2RhdGEtPnVyYl9yZWFkX2xlbmd0aDsKKyAgIH0gZWxzZSB7CisgICAgICBrZXktPnRvdGFsX2dyZiA9IDE7CisgICAgICBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IDE7CisgICB9CisKKyAgIC8qIEJSV19ORVdfQ1VSQkVfT0ZGU0VUUyAqLworICAga2V5LT5jdXJiZV9vZmZzZXQgPSBicnctPmN1cmJlLmNsaXBfc3RhcnQ7CisKKyAgIC8qIEJSV19ORVdfVVJCX0ZFTkNFICovCisgICBrZXktPm5yX3VyYl9lbnRyaWVzID0gYnJ3LT51cmIubnJfZ3NfZW50cmllczsKKyAgIGtleS0+dXJiX3NpemUgPSBicnctPnVyYi52c2l6ZTsKK30KKworc3RhdGljIGRyaV9ibyAqCitnc191bml0X2NyZWF0ZV9mcm9tX2tleShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd19nc191bml0X2tleSAqa2V5KQogewogICAgc3RydWN0IGJyd19nc191bml0X3N0YXRlIGdzOworICAgZHJpX2JvICpibzsKIAogICAgbWVtc2V0KCZncywgMCwgc2l6ZW9mKGdzKSk7CiAKLSAgIC8qIENBQ0hFX05FV19HU19QUk9HICovCi0gICBpZiAoYnJ3LT5ncy5wcm9nX2FjdGl2ZSkgewotICAgICAgZ3MudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gKChicnctPmdzLnByb2dfZGF0YS0+dG90YWxfZ3JmLTEpICYgfjE1KSAvIDE2OwotICAgICAgZ3MudGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IGJydy0+Z3MucHJvZ19nc19vZmZzZXQgPj4gNjsKLSAgICAgIGdzLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5ncy5wcm9nX2RhdGEtPnVyYl9yZWFkX2xlbmd0aDsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgZ3MudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gMDsKLSAgICAgIGdzLnRocmVhZDAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSAwOwotICAgICAgZ3MudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSAxOwotICAgfQorICAgZ3MudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gQUxJR04oa2V5LT50b3RhbF9ncmYsIDE2KSAvIDE2IC0gMTsKKyAgIGlmIChrZXktPnByb2dfYWN0aXZlKSAvKiByZWxvYyAqLworICAgICAgZ3MudGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IGJydy0+Z3MucHJvZ19iby0+b2Zmc2V0ID4+IDY7CiAKLSAgIC8qIEJSV19ORVdfVVJCX0ZFTkNFICovCi0gICBncy50aHJlYWQ0Lm5yX3VyYl9lbnRyaWVzID0gYnJ3LT51cmIubnJfZ3NfZW50cmllczsgCi0gICBncy50aHJlYWQ0LnVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemUgPSBicnctPnVyYi52c2l6ZSAtIDE7Ci0KLSAgIGdzLnRocmVhZDQubWF4X3RocmVhZHMgPSAwOyAvKiBIYXJkd2FyZSByZXF1aXJlbWVudCAqLwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKLSAgICAgIGdzLnRocmVhZDQuc3RhdHNfZW5hYmxlID0gMTsgCi0KLSAgIC8qIENPTlNUQU5UICovCiAgICBncy50aHJlYWQxLmZsb2F0aW5nX3BvaW50X21vZGUgPSBCUldfRkxPQVRJTkdfUE9JTlRfTk9OX0lFRUVfNzU0OwogICAgZ3MudGhyZWFkMS5zaW5nbGVfcHJvZ3JhbV9mbG93ID0gMTsKKwogICAgZ3MudGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMTsKICAgIGdzLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKICAgIGdzLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gMDsKICAgIGdzLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKLSAgIAorICAgZ3MudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aDsKIAotICAgYnJ3LT5ncy5zdGF0ZV9nc19vZmZzZXQgPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGVbQlJXX0dTX1VOSVRdLCAmZ3MgKTsKKyAgIGdzLnRocmVhZDQubnJfdXJiX2VudHJpZXMgPSBrZXktPm5yX3VyYl9lbnRyaWVzOworICAgZ3MudGhyZWFkNC51cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplID0ga2V5LT51cmJfc2l6ZSAtIDE7CisKKyAgIGdzLnRocmVhZDQubWF4X3RocmVhZHMgPSAwOyAvKiBIYXJkd2FyZSByZXF1aXJlbWVudCAqLworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKKyAgICAgIGdzLnRocmVhZDQuc3RhdHNfZW5hYmxlID0gMTsKKworICAgYm8gPSBicndfdXBsb2FkX2NhY2hlKCZicnctPmNhY2hlLCBCUldfR1NfVU5JVCwKKwkJCSBrZXksIHNpemVvZigqa2V5KSwKKwkJCSAmYnJ3LT5ncy5wcm9nX2JvLCAxLAorCQkJICZncywgc2l6ZW9mKGdzKSwKKwkJCSBOVUxMLCBOVUxMKTsKKworICAgaWYgKGtleS0+cHJvZ19hY3RpdmUpIHsKKyAgICAgIC8qIEVtaXQgR1MgcHJvZ3JhbSByZWxvY2F0aW9uICovCisgICAgICBpbnRlbF9ib19lbWl0X3JlbG9jKGJvLAorCQkJICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCisJCQkgIGdzLnRocmVhZDAuZ3JmX3JlZ19jb3VudCA8PCAxLAorCQkJICBvZmZzZXRvZihzdHJ1Y3QgYnJ3X2dzX3VuaXRfc3RhdGUsIHRocmVhZDApLAorCQkJICBicnctPmdzLnByb2dfYm8pOworICAgfQorCisgICByZXR1cm4gYm87CiB9CiAKK3N0YXRpYyB2b2lkIHByZXBhcmVfZ3NfdW5pdChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKK3sKKyAgIHN0cnVjdCBicndfZ3NfdW5pdF9rZXkga2V5OworCisgICBnc191bml0X3BvcHVsYXRlX2tleShicncsICZrZXkpOworCisgICBkcmlfYm9fdW5yZWZlcmVuY2UoYnJ3LT5ncy5zdGF0ZV9ibyk7CisgICBicnctPmdzLnN0YXRlX2JvID0gYnJ3X3NlYXJjaF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX0dTX1VOSVQsCisJCQkJICAgICAgICZrZXksIHNpemVvZihrZXkpLAorCQkJCSAgICAgICAmYnJ3LT5ncy5wcm9nX2JvLCAxLAorCQkJCSAgICAgICBOVUxMKTsKKyAgIGlmIChicnctPmdzLnN0YXRlX2JvID09IE5VTEwpIHsKKyAgICAgIGJydy0+Z3Muc3RhdGVfYm8gPSBnc191bml0X2NyZWF0ZV9mcm9tX2tleShicncsICZrZXkpOworICAgfQorfQogCiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2dzX3VuaXQgPSB7CiAgICAuZGlydHkgPSB7CkBAIC04NSw1ICsxMzksNSBAQAogCQlCUldfTkVXX1VSQl9GRU5DRSksCiAgICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfR1NfUFJPRwogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfZ3NfdW5pdAorICAgLnByZXBhcmUgPSBwcmVwYXJlX2dzX3VuaXQsCiB9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfaGFsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19oYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNjEwMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19oYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gQ29weXJpZ2h0IChDKSBJbnRlbCBDb3JwLiAgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gCi0gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gCi0gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAotIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAKLSBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLSBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKLSNpbmNsdWRlICJicndfY29udGV4dC5oIgotI2luY2x1ZGUgImJyd19zdGF0ZS5oIgotI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCi0jaW5jbHVkZSAiYnJ3X2hhbC5oIgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLXN0YXRpYyB2b2lkICpicndfaGFsX2xpYjsKLXN0YXRpYyBHTGJvb2xlYW4gYnJ3X2hhbF90cmllZDsKLQotdm9pZCAqCi1icndfaGFsX2ZpbmRfc3ltYm9sIChjaGFyICpzeW1ib2wpCi17Ci0gICAgaWYgKCFicndfaGFsX3RyaWVkKQotICAgIHsKLQljaGFyICpicndfaGFsX25hbWUgPSBnZXRlbnYgKCJJTlRFTF9IQUwiKTsKLSAgICAKLQlpZiAoIWJyd19oYWxfbmFtZSkKLQkgICAgYnJ3X2hhbF9uYW1lID0gIi91c3IvbGliL3hvcmcvbW9kdWxlcy9kcml2ZXJzL2ludGVsX2hhbC5zbyI7Ci0KLQlicndfaGFsX2xpYiA9IGRsb3BlbiAoYnJ3X2hhbF9uYW1lLCBSVExEX0xBWll8UlRMRF9MT0NBTCk7Ci0JYnJ3X2hhbF90cmllZCA9IDE7Ci0gICAgfQotICAgIGlmICghYnJ3X2hhbF9saWIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIGRsc3ltIChicndfaGFsX2xpYiwgc3ltYm9sKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X2hhbC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfaGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODZlMzkuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfaGFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIAotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAotIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKLSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAqCi1icndfaGFsX2ZpbmRfc3ltYm9sIChjaGFyICpzeW1ib2wpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfbWV0YW9wcy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfbWV0YW9wcy5jCmluZGV4IDZlMDMwZjEuLjI1MmE4OTkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X21ldGFvcHMuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19tZXRhb3BzLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJzLmgiCiAKICNpbmNsdWRlICJicndfY29udGV4dC5oIgogI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCkBAIC0xNTYsNyArMTU3LDcgQEAKICAqICAgRnJhZ21lbnRQcm9ncmFtLT5fQ3VycmVudAogICogICBWZXJ0ZXhQcm9ncmFtLT5fRW5hYmxlZAogICogICBicnctPnZlcnRleF9wcm9ncmFtCi0gKiAgIERyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdCisgKiAgIERyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdCiAgKiAKICAqCiAgKiBNb3JlIGlmIGRyYXdwaXhlbHMtdGhyb3VnaC10ZXh0dXJlIGlzIGFkZGVkLiAgCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkJCQkgIHZwX3Byb2csIHN0cmxlbih2cF9wcm9nKSwKIAkJCQkgIGJydy0+bWV0YW9wcy52cCk7CiAKLSAgIGJydy0+bWV0YW9wcy5hdHRyaWJzLlZlcnRleFByb2dyYW0tPkN1cnJlbnQgPSBicnctPm1ldGFvcHMudnA7CisgICBicnctPm1ldGFvcHMuYXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5fQ3VycmVudCA9IGJydy0+bWV0YW9wcy52cDsKICAgIGJydy0+bWV0YW9wcy5hdHRyaWJzLlZlcnRleFByb2dyYW0tPl9FbmFibGVkID0gR0xfVFJVRTsKIAogICAgYnJ3LT5tZXRhb3BzLmF0dHJpYnMuRnJhZ21lbnRQcm9ncmFtLT5fQ3VycmVudCA9IGJydy0+bWV0YW9wcy5mcDsKQEAgLTM2MSwxMyArMzYyLDIxIEBACiAgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KCZpbnRlbC0+Y3R4KTsKIAogICAgaWYgKCFicnctPm1ldGFvcHMuc2F2ZWRfZHJhd19yZWdpb24pIHsKLSAgICAgIGJydy0+bWV0YW9wcy5zYXZlZF9kcmF3X3JlZ2lvbiA9IGJydy0+c3RhdGUuZHJhd19yZWdpb247CisgICAgICBicnctPm1ldGFvcHMuc2F2ZWRfZHJhd19yZWdpb24gPSBicnctPnN0YXRlLmRyYXdfcmVnaW9uc1swXTsKKyAgICAgIGJydy0+bWV0YW9wcy5zYXZlZF9ucl9kcmF3X3JlZ2lvbnMgPSBicnctPnN0YXRlLm5yX2RyYXdfcmVnaW9uczsKICAgICAgIGJydy0+bWV0YW9wcy5zYXZlZF9kZXB0aF9yZWdpb24gPSBicnctPnN0YXRlLmRlcHRoX3JlZ2lvbjsKICAgIH0KIAotICAgYnJ3LT5zdGF0ZS5kcmF3X3JlZ2lvbiA9IGRyYXdfcmVnaW9uOworICAgYnJ3LT5zdGF0ZS5kcmF3X3JlZ2lvbnNbMF0gPSBkcmF3X3JlZ2lvbjsKKyAgIGJydy0+c3RhdGUubnJfZHJhd19yZWdpb25zID0gMTsKICAgIGJydy0+c3RhdGUuZGVwdGhfcmVnaW9uID0gZGVwdGhfcmVnaW9uOwogCisgICBpZiAoaW50ZWwtPmZyYW1lX2J1ZmZlcl90ZXhvYmogIT0gTlVMTCkKKyAgICAgIGJyd19GcmFtZUJ1ZmZlclRleERlc3Ryb3koYnJ3KTsKKworICAgaWYgKGRyYXdfcmVnaW9uKQorICAgICAgIGJyd19GcmFtZUJ1ZmZlclRleEluaXQoYnJ3LCBkcmF3X3JlZ2lvbik7CisKICAgIGJydy0+c3RhdGUuZGlydHkubWVzYSB8PSBfTkVXX0JVRkZFUlM7CiB9CiAKQEAgLTM3Niw4ICszODUsNyBAQAogCQkJICAgR0xmbG9hdCB4MCwgR0xmbG9hdCB4MSwKIAkJCSAgIEdMZmxvYXQgeTAsIEdMZmxvYXQgeTEsIAogCQkJICAgR0xmbG9hdCB6LAotCQkJICAgR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sCi0JCQkgICBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEsCisJCQkgICBHTHVpbnQgY29sb3IsCiAJCQkgICBHTGZsb2F0IHMwLCBHTGZsb2F0IHMxLAogCQkJICAgR0xmbG9hdCB0MCwgR0xmbG9hdCB0MSkKIHsKQEAgLTM4OCw3ICszOTYsNiBAQAogICAgc3RydWN0IGdsX2NsaWVudF9hcnJheSAqYXR0cmlic1tWRVJUX0FUVFJJQl9NQVhdOwogICAgc3RydWN0IF9tZXNhX3ByaW0gcHJpbVsxXTsKICAgIEdMZmxvYXQgcG9zWzRdWzNdOwotICAgR0x1Ynl0ZSBjb2xvcls0XTsKIAogICAgY3R4LT5Ecml2ZXIuQnVmZmVyRGF0YShjdHgsCiAJCQkgIEdMX0FSUkFZX0JVRkZFUl9BUkIsCkBAIC00MTMsNyArNDIwLDYgQEAKICAgIHBvc1szXVsxXSA9IHkxOwogICAgcG9zWzNdWzJdID0gejsKIAotCiAgICBjdHgtPkRyaXZlci5CdWZmZXJTdWJEYXRhKGN0eCwKIAkJCSAgICAgR0xfQVJSQVlfQlVGRkVSX0FSQiwKIAkJCSAgICAgMCwKQEAgLTQyMSwxNiArNDI3LDE1IEBACiAJCQkgICAgIHBvcywKIAkJCSAgICAgYnJ3LT5tZXRhb3BzLnZibyk7CiAKLSAgIGNvbG9yWzBdID0gcmVkOwotICAgY29sb3JbMV0gPSBncmVlbjsKLSAgIGNvbG9yWzJdID0gYmx1ZTsKLSAgIGNvbG9yWzNdID0gYWxwaGE7CisgICAvKiBDb252ZXJ0IGluY29taW5nIEFSR0IgdG8gcmVxdWlyZWQgUkdCQSAqLworICAgLyogTm90ZSB0aGlzIGNvbG9yIGlzIHN0b3JlZCBhcyBHTF9VTlNJR05FRF9CWVRFICovCisgICBjb2xvciA9IChjb2xvciAmIDB4ZmYwMGZmMDApIHwgKCgoY29sb3IgPj4gMTYpIHwgKGNvbG9yIDw8IDE2KSkgJiAweGZmMDBmZik7CiAKICAgIGN0eC0+RHJpdmVyLkJ1ZmZlclN1YkRhdGEoY3R4LAogCQkJICAgICBHTF9BUlJBWV9CVUZGRVJfQVJCLAogCQkJICAgICBzaXplb2YocG9zKSwKIAkJCSAgICAgc2l6ZW9mKGNvbG9yKSwKLQkJCSAgICAgY29sb3IsCisJCQkgICAgICZjb2xvciwKIAkJCSAgICAgYnJ3LT5tZXRhb3BzLnZibyk7CiAKICAgIC8qIElnbm9yaW5nIHRleHR1cmUgY29vcmRzLiAKQEAgLTQ4Niw2ICs0OTEsNyBAQAogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKyAgIEdMdWludCBpOwogCiAgICBpZiAoIWJydy0+bWV0YW9wcy52Ym8pIHsKICAgICAgIGluaXRfbWV0YW9wc19zdGF0ZShicncpOwpAQCAtNDk1LDEyICs1MDEsMTggQEAKICAgIAogICAgbWV0YV9ub190ZXh0dXJlKCZicnctPmludGVsKTsKICAgIG1ldGFfZmxhdF9zaGFkZSgmYnJ3LT5pbnRlbCk7Ci0gICBicnctPm1ldGFvcHMucmVzdG9yZV9kcmF3X21hc2sgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdOworICAgZm9yIChpID0gMDsgaSA8IGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnM7IGkrKykgeworICAgICAgYnJ3LT5tZXRhb3BzLnJlc3RvcmVfZHJhd19idWZmZXJzW2ldCisgICAgICAgICA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbaV07CisgICB9CisgICBicnctPm1ldGFvcHMucmVzdG9yZV9udW1fZHJhd19idWZmZXJzID0gY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsKKwogICAgYnJ3LT5tZXRhb3BzLnJlc3RvcmVfZnAgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50OwogCiAgICAvKiBUaGlzIHdvcmtzIHdpdGhvdXQgYWRqdXN0aW5nIHJlZmNvdW50cy4gIEZpeCBsYXRlcj8gCiAgICAgKi8KLSAgIGJydy0+bWV0YW9wcy5zYXZlZF9kcmF3X3JlZ2lvbiA9IGJydy0+c3RhdGUuZHJhd19yZWdpb247CisgICBicnctPm1ldGFvcHMuc2F2ZWRfZHJhd19yZWdpb24gPSBicnctPnN0YXRlLmRyYXdfcmVnaW9uc1swXTsKKyAgIGJydy0+bWV0YW9wcy5zYXZlZF9ucl9kcmF3X3JlZ2lvbnMgPSBicnctPnN0YXRlLm5yX2RyYXdfcmVnaW9uczsKICAgIGJydy0+bWV0YW9wcy5zYXZlZF9kZXB0aF9yZWdpb24gPSBicnctPnN0YXRlLmRlcHRoX3JlZ2lvbjsKICAgIGJydy0+bWV0YW9wcy5hY3RpdmUgPSAxOwogICAgCkBAIC01MTEsMTMgKzUyMywyMCBAQAogewogICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKyAgIEdMdWludCBpOwogCiAgICByZXN0b3JlX2F0dHJpYnMoYnJ3KTsKIAotICAgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9IGJydy0+bWV0YW9wcy5yZXN0b3JlX2RyYXdfbWFzazsKKyAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOyBpKyspIHsKKyAgICAgIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbaV0KKyAgICAgICAgID0gYnJ3LT5tZXRhb3BzLnJlc3RvcmVfZHJhd19idWZmZXJzW2ldOworICAgfQorICAgY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA9IGJydy0+bWV0YW9wcy5yZXN0b3JlX251bV9kcmF3X2J1ZmZlcnM7CisKICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLkN1cnJlbnQgPSBicnctPm1ldGFvcHMucmVzdG9yZV9mcDsKIAotICAgYnJ3LT5zdGF0ZS5kcmF3X3JlZ2lvbiA9IGJydy0+bWV0YW9wcy5zYXZlZF9kcmF3X3JlZ2lvbjsKKyAgIGJydy0+c3RhdGUuZHJhd19yZWdpb25zWzBdID0gYnJ3LT5tZXRhb3BzLnNhdmVkX2RyYXdfcmVnaW9uOworICAgYnJ3LT5zdGF0ZS5ucl9kcmF3X3JlZ2lvbnMgPSBicnctPm1ldGFvcHMuc2F2ZWRfbnJfZHJhd19yZWdpb25zOwogICAgYnJ3LT5zdGF0ZS5kZXB0aF9yZWdpb24gPSBicnctPm1ldGFvcHMuc2F2ZWRfZGVwdGhfcmVnaW9uOwogICAgYnJ3LT5tZXRhb3BzLnNhdmVkX2RyYXdfcmVnaW9uID0gTlVMTDsKICAgIGJydy0+bWV0YW9wcy5zYXZlZF9kZXB0aF9yZWdpb24gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfbWlzY19zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfbWlzY19zdGF0ZS5jCmluZGV4IGQ1Nzc5NjguLjQ4N2M2MzggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X21pc2Nfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19taXNjX3N0YXRlLmMKQEAgLTY4LDE2MCArNjgsMTAyIEBACiAgICAgICAuYnJ3ID0gMCwKICAgICAgIC5jYWNoZSA9IDAKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX2JsZW5kX2NvbnN0YW50X2NvbG9yCisgICAuZW1pdCA9IHVwbG9hZF9ibGVuZF9jb25zdGFudF9jb2xvcgogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEcmF3aW5nIHJlY3RhbmdsZSAtLSBOZWVkIGZvciBBVUIgZmlsZSBvbmx5LgorLyoqCisgKiBVcGxvYWQgdGhlIGJpbmRpbmcgdGFibGUgcG9pbnRlcnMsIHdoaWNoIHBvaW50IGVhY2ggc3RhZ2UncyBhcnJheSBvZiBzdXJmYWNlCisgKiBzdGF0ZSBwb2ludGVycy4KKyAqCisgKiBUaGUgYmluZGluZyB0YWJsZSBwb2ludGVycyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN1cmZhY2Ugc3RhdGUgYmFzZSBhZGRyZXNzLAorICogd2hpY2ggaXMgMC4KICAqLwotc3RhdGljIHZvaWQgdXBsb2FkX2RyYXdpbmdfcmVjdChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZicnctPmludGVsOwotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotICAgc3RydWN0IGJyd19kcmF3cmVjdCBiZHI7Ci0gICBpbnQgeDEsIHkxOwotICAgaW50IHgyLCB5MjsKLQotICAgLyogSWYgdGhlcmUgaXMgYSBzaW5nbGUgY2xpcHJlY3QsIHNldCBpdCBoZXJlLiAgT3RoZXJ3aXNlIGl0ZXJhdGUKLSAgICAqIG92ZXIgdGhlbSBpbiBicndfZHJhd19wcmltKCkuCi0gICAgKi8KLSAgIGlmIChicnctPmludGVsLm51bUNsaXBSZWN0cyA+IDEpIAotICAgICAgcmV0dXJuOyAKLSAKLSAgIHgxID0gYnJ3LT5pbnRlbC5wQ2xpcFJlY3RzWzBdLngxOwotICAgeTEgPSBicnctPmludGVsLnBDbGlwUmVjdHNbMF0ueTE7Ci0gICB4MiA9IGJydy0+aW50ZWwucENsaXBSZWN0c1swXS54MjsKLSAgIHkyID0gYnJ3LT5pbnRlbC5wQ2xpcFJlY3RzWzBdLnkyOwotCSAKLSAgIGlmICh4MSA8IDApIHgxID0gMDsKLSAgIGlmICh5MSA8IDApIHkxID0gMDsKLSAgIGlmICh4MiA+IGludGVsLT5pbnRlbFNjcmVlbi0+d2lkdGgpIHgyID0gaW50ZWwtPmludGVsU2NyZWVuLT53aWR0aDsKLSAgIGlmICh5MiA+IGludGVsLT5pbnRlbFNjcmVlbi0+aGVpZ2h0KSB5MiA9IGludGVsLT5pbnRlbFNjcmVlbi0+aGVpZ2h0OwotCi0gICBtZW1zZXQoJmJkciwgMCwgc2l6ZW9mKGJkcikpOwotICAgYmRyLmhlYWRlci5vcGNvZGUgPSBDTURfRFJBV19SRUNUOwotICAgYmRyLmhlYWRlci5sZW5ndGggPSBzaXplb2YoYmRyKS80IC0gMjsKLSAgIGJkci54bWluID0geDE7Ci0gICBiZHIueW1pbiA9IHkxOwotICAgYmRyLnhtYXggPSB4MjsKLSAgIGJkci55bWF4ID0geTI7Ci0gICBiZHIueG9yZyA9IGRQcml2LT54OwotICAgYmRyLnlvcmcgPSBkUHJpdi0+eTsKLQotICAgLyogQ2FuJ3QgdXNlIEJSV19DQUNIRURfQkFUQ0hfU1RSVUNUIGJlY2F1c2UgdGhpcyBpcyBhbHNvIGVtaXR0ZWQKLSAgICAqIHVuY2FjaGVkIGluIGJyd19kcmF3LmM6Ci0gICAgKi8KLSAgIEJSV19CQVRDSF9TVFJVQ1QoYnJ3LCAmYmRyKTsKLX0KLQotY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19kcmF3aW5nX3JlY3QgPSB7Ci0gICAuZGlydHkgPSB7Ci0gICAgICAubWVzYSA9IF9ORVdfV0lORE9XX1BPUywKLSAgICAgIC5icncgPSAwLAotICAgICAgLmNhY2hlID0gMAotICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfZHJhd2luZ19yZWN0Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJpbmRpbmcgdGFibGUgcG9pbnRlcnMKLSAqLwotCiBzdGF0aWMgdm9pZCB1cGxvYWRfYmluZGluZ190YWJsZV9wb2ludGVycyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKIHsKLSAgIHN0cnVjdCBicndfYmluZGluZ190YWJsZV9wb2ludGVycyBidHA7Ci0gICBtZW1zZXQoJmJ0cCwgMCwgc2l6ZW9mKGJ0cCkpOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gJmJydy0+aW50ZWw7CisgICBkcmlfYm8gKmFwZXJfYXJyYXlbXSA9IHsKKyAgICAgIGludGVsLT5iYXRjaC0+YnVmLAorICAgICAgYnJ3LT53bS5iaW5kX2JvLAorICAgfTsKIAotICAgLyogVGhlIGJpbmRpbmcgdGFibGUgaGFzIGJlZW4gZW1pdHRlZCB0byB0aGUgU1MgcG9vbCBhbHJlYWR5LCBzbyB3ZQotICAgICoga25vdyB3aGF0IGl0cyBvZmZzZXQgaXMuICBXaGVuIHRoZSBiYXRjaCBidWZmZXIgaXMgZmlyZWQsIHRoZQotICAgICogYmluZGluZyB0YWJsZSBhbmQgc3VyZmFjZSBzdHJ1Y3RzIHdpbGwgZ2V0IGZpeGVkIHVwIHRvIHBvaW50IHRvCi0gICAgKiB3aGVyZSB0aGUgdGV4dHVyZXMgYWN0dWFsbHkgbGFuZGVkLCBidXQgdGhhdCB3b24ndCBjaGFuZ2UgdGhlCi0gICAgKiB2YWx1ZSBvZiB0aGUgb2Zmc2V0cyBoZXJlOgotICAgICovCi0gICBidHAuaGVhZGVyLm9wY29kZSA9IENNRF9CSU5ESU5HX1RBQkxFX1BUUlM7Ci0gICBidHAuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihidHApLzQgLSAyOwotICAgYnRwLnZzID0gMDsKLSAgIGJ0cC5ncyA9IDA7Ci0gICBidHAuY2xwID0gMDsKLSAgIGJ0cC5zZiA9IDA7Ci0gICBidHAud20gPSBicnctPndtLmJpbmRfc3Nfb2Zmc2V0OworICAgaWYgKGRyaV9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoYXBlcl9hcnJheSwgQVJSQVlfU0laRShhcGVyX2FycmF5KSkpCisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChpbnRlbC0+YmF0Y2gpOwogCi0gICBCUldfQ0FDSEVEX0JBVENIX1NUUlVDVChicncsICZidHApOworICAgQkVHSU5fQkFUQ0goNiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0goQ01EX0JJTkRJTkdfVEFCTEVfUFRSUyA8PCAxNiB8ICg2IC0gMikpOworICAgT1VUX0JBVENIKDApOyAvKiB2cyAqLworICAgT1VUX0JBVENIKDApOyAvKiBncyAqLworICAgT1VUX0JBVENIKDApOyAvKiBjbGlwICovCisgICBPVVRfQkFUQ0goMCk7IC8qIHNmICovCisgICBPVVRfUkVMT0MoYnJ3LT53bS5iaW5kX2JvLAorCSAgICAgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIsIDAsCisJICAgICAwKTsKKyAgIEFEVkFOQ0VfQkFUQ0goKTsKIH0KIAogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19iaW5kaW5nX3RhYmxlX3BvaW50ZXJzID0gewogICAgLmRpcnR5ID0gewogICAgICAgLm1lc2EgPSAwLAotICAgICAgLmJydyA9IDAsCi0gICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfU1VSRl9CSU5EIAorICAgICAgLmJydyA9IEJSV19ORVdfQkFUQ0gsCisgICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfU1VSRl9CSU5ELAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfYmluZGluZ190YWJsZV9wb2ludGVycworICAgLmVtaXQgPSB1cGxvYWRfYmluZGluZ190YWJsZV9wb2ludGVycywKIH07CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQaXBlbGluZWQgc3RhdGUgcG9pbnRlcnMuICBUaGlzIGlzIHRoZSBrZXkgc3RhdGUgcGFja2V0IGZyb20gd2hpY2gKLSAqIHRoZSBoYXJkd2FyZSBjaGFzZXMgcG9pbnRlcnMgdG8gYWxsIHRoZSB1cGxvYWRlZCBzdGF0ZSBpbiBWUkFNLgorLyoqCisgKiBVcGxvYWQgcG9pbnRlcnMgdG8gdGhlIHBlci1zdGFnZSBzdGF0ZS4KKyAqCisgKiBUaGUgc3RhdGUgcG9pbnRlcnMgaW4gdGhpcyBwYWNrZXQgYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUgZ2VuZXJhbCBzdGF0ZQorICogYmFzZSBhZGRyZXNzIHNldCBieSBDTURfU1RBVEVfQkFTRV9BRERSRVNTLCB3aGljaCBpcyAwLgogICovCi0gICAKIHN0YXRpYyB2b2lkIHVwbG9hZF9waXBlbGluZWRfc3RhdGVfcG9pbnRlcnMoc3RydWN0IGJyd19jb250ZXh0ICpicncgKQogewotICAgc3RydWN0IGJyd19waXBlbGluZWRfc3RhdGVfcG9pbnRlcnMgcHNwOwotICAgbWVtc2V0KCZwc3AsIDAsIHNpemVvZihwc3ApKTsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZicnctPmludGVsOwogCi0gICBwc3AuaGVhZGVyLm9wY29kZSA9IENNRF9QSVBFTElORURfU1RBVEVfUE9JTlRFUlM7Ci0gICBwc3AuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihwc3ApLzQgLSAyOworICAgQkVHSU5fQkFUQ0goNywgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0goQ01EX1BJUEVMSU5FRF9TVEFURV9QT0lOVEVSUyA8PCAxNiB8ICg3IC0gMikpOworICAgT1VUX1JFTE9DKGJydy0+dnMuc3RhdGVfYm8sIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwgMCk7CisgICBpZiAoYnJ3LT5ncy5wcm9nX2FjdGl2ZSkKKyAgICAgIE9VVF9SRUxPQyhicnctPmdzLnN0YXRlX2JvLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDEpOworICAgZWxzZQorICAgICAgT1VUX0JBVENIKDApOworICAgaWYgKCFicnctPm1ldGFvcHMuYWN0aXZlKQorICAgICAgT1VUX1JFTE9DKGJydy0+Y2xpcC5zdGF0ZV9ibywgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLCAxKTsKKyAgIGVsc2UKKyAgICAgIE9VVF9CQVRDSCgwKTsKKyAgIE9VVF9SRUxPQyhicnctPnNmLnN0YXRlX2JvLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDApOworICAgT1VUX1JFTE9DKGJydy0+d20uc3RhdGVfYm8sIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwgMCk7CisgICBPVVRfUkVMT0MoYnJ3LT5jYy5zdGF0ZV9ibywgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLCAwKTsKKyAgIEFEVkFOQ0VfQkFUQ0goKTsKIAotICAgcHNwLnZzLm9mZnNldCA9IGJydy0+dnMuc3RhdGVfZ3Nfb2Zmc2V0ID4+IDU7Ci0gICBwc3Auc2Yub2Zmc2V0ID0gYnJ3LT5zZi5zdGF0ZV9nc19vZmZzZXQgPj4gNTsKLSAgIHBzcC53bS5vZmZzZXQgPSBicnctPndtLnN0YXRlX2dzX29mZnNldCA+PiA1OwotICAgcHNwLmNjLm9mZnNldCA9IGJydy0+Y2Muc3RhdGVfZ3Nfb2Zmc2V0ID4+IDU7Ci0KLSAgIC8qIEdTIGdldHMgdHVybmVkIG9uIGFuZCBvZmYgcmVndWxhcmx5LiAgTmVlZCB0byByZS1lbWl0IFVSQiBmZW5jZQotICAgICogYWZ0ZXIgdGhpcyBvY2N1cnMuICAKLSAgICAqLwotICAgaWYgKGJydy0+Z3MucHJvZ19hY3RpdmUpIHsKLSAgICAgIHBzcC5ncy5vZmZzZXQgPSBicnctPmdzLnN0YXRlX2dzX29mZnNldCA+PiA1OwotICAgICAgcHNwLmdzLmVuYWJsZSA9IDE7Ci0gICB9Ci0KLSAgIGlmICghYnJ3LT5tZXRhb3BzLmFjdGl2ZSkgewotICAgICAgcHNwLmNscC5vZmZzZXQgPSBicnctPmNsaXAuc3RhdGVfZ3Nfb2Zmc2V0ID4+IDU7Ci0gICAgICBwc3AuY2xwLmVuYWJsZSA9IDE7Ci0gICB9Ci0KLQotICAgaWYgKEJSV19DQUNIRURfQkFUQ0hfU1RSVUNUKGJydywgJnBzcCkpCi0gICAgICBicnctPnN0YXRlLmRpcnR5LmJydyB8PSBCUldfTkVXX1BTUDsKKyAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfUFNQOwogfQogCi1jb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3BpcGVsaW5lZF9zdGF0ZV9wb2ludGVycyA9IHsKLSAgIC5kaXJ0eSA9IHsKLSAgICAgIC5tZXNhID0gMCwKLSAgICAgIC5icncgPSBCUldfTkVXX01FVEFPUFMsCi0gICAgICAuY2FjaGUgPSAoQ0FDSEVfTkVXX1ZTX1VOSVQgfCAKLQkJQ0FDSEVfTkVXX0dTX1VOSVQgfCAKLQkJQ0FDSEVfTkVXX0dTX1BST0cgfCAKLQkJQ0FDSEVfTkVXX0NMSVBfVU5JVCB8IAotCQlDQUNIRV9ORVdfU0ZfVU5JVCB8IAotCQlDQUNIRV9ORVdfV01fVU5JVCB8IAotCQlDQUNIRV9ORVdfQ0NfVU5JVCkKLSAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3BpcGVsaW5lZF9zdGF0ZV9wb2ludGVycwotfTsKLQogc3RhdGljIHZvaWQgdXBsb2FkX3BzcF91cmJfY2JzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9ICZicnctPmludGVsOworICAgZHJpX2JvICphcGVyX2FycmF5W10gPSB7CisgICAgICBpbnRlbC0+YmF0Y2gtPmJ1ZiwKKyAgICAgIGJydy0+dnMuc3RhdGVfYm8sCisgICAgICBicnctPmdzLnN0YXRlX2JvLAorICAgICAgYnJ3LT5jbGlwLnN0YXRlX2JvLAorICAgICAgYnJ3LT53bS5zdGF0ZV9ibywKKyAgICAgIGJydy0+Y2Muc3RhdGVfYm8sCisgICB9OworCisgICBpZiAoZHJpX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZShhcGVyX2FycmF5LCBBUlJBWV9TSVpFKGFwZXJfYXJyYXkpKSkKKyAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CisKICAgIHVwbG9hZF9waXBlbGluZWRfc3RhdGVfcG9pbnRlcnMoYnJ3KTsKICAgIGJyd191cGxvYWRfdXJiX2ZlbmNlKGJydyk7CiAgICBicndfdXBsb2FkX2NvbnN0YW50X2J1ZmZlcl9zdGF0ZShicncpOwogfQogCi0KIGNvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfcHNwX3VyYl9jYnMgPSB7CiAgICAuZGlydHkgPSB7CiAgICAgICAubWVzYSA9IDAsCi0gICAgICAuYnJ3ID0gQlJXX05FV19VUkJfRkVOQ0UgfCBCUldfTkVXX01FVEFPUFMsCisgICAgICAuYnJ3ID0gQlJXX05FV19VUkJfRkVOQ0UgfCBCUldfTkVXX01FVEFPUFMgfCBCUldfTkVXX0JBVENILAogICAgICAgLmNhY2hlID0gKENBQ0hFX05FV19WU19VTklUIHwgCiAJCUNBQ0hFX05FV19HU19VTklUIHwgCiAJCUNBQ0hFX05FV19HU19QUk9HIHwgCkBAIC0yMzAsNzQgKzE3Miw4MiBAQAogCQlDQUNIRV9ORVdfV01fVU5JVCB8IAogCQlDQUNIRV9ORVdfQ0NfVU5JVCkKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3BzcF91cmJfY2JzCisgICAuZW1pdCA9IHVwbG9hZF9wc3BfdXJiX2NicywKIH07CiAKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVwdGhidWZmZXIgLSBjdXJyZW50bHkgY29uc3RhbnQsIGJ1dCByb3RhdGlvbiB3b3VsZCBjaGFuZ2UgdGhhdC4KLSAqLwotCi1zdGF0aWMgdm9pZCB1cGxvYWRfZGVwdGhidWZmZXIoc3RydWN0IGJyd19jb250ZXh0ICpicncpCitzdGF0aWMgdm9pZCBlbWl0X2RlcHRoYnVmZmVyKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewotICAgLyogMHg3OTA1MDAwMyAgRGVwdGggQnVmZmVyICovCiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbiA9IGJydy0+c3RhdGUuZGVwdGhfcmVnaW9uOwotICAgc3RydWN0IGJyd19kZXB0aGJ1ZmZlciBiZDsKLSAgIG1lbXNldCgmYmQsIDAsIHNpemVvZihiZCkpOworICAgdW5zaWduZWQgaW50IGxlbiA9IChCUldfSVNfR000NShicncpIHx8IEJSV19JU19HNFgoYnJ3KSkgPyBzaXplb2Yoc3RydWN0IGJyd19kZXB0aGJ1ZmZlcl9nbTQ1X2c0eCkgLyA0IDogc2l6ZW9mKHN0cnVjdCBicndfZGVwdGhidWZmZXIpIC8gNDsKIAotICAgYmQuaGVhZGVyLmJpdHMub3Bjb2RlID0gQ01EX0RFUFRIX0JVRkZFUjsKLSAgIGJkLmhlYWRlci5iaXRzLmxlbmd0aCA9IHNpemVvZihiZCkvNC0yOwotICAgYmQuZHdvcmQxLmJpdHMucGl0Y2ggPSAocmVnaW9uLT5waXRjaCAqIHJlZ2lvbi0+Y3BwKSAtIDE7Ci0gICAKLSAgIHN3aXRjaCAocmVnaW9uLT5jcHApIHsKLSAgIGNhc2UgMjoKLSAgICAgIGJkLmR3b3JkMS5iaXRzLmZvcm1hdCA9IEJSV19ERVBUSEZPUk1BVF9EMTZfVU5PUk07Ci0gICAgICBicmVhazsKLSAgIGNhc2UgNDoKLSAgICAgIGlmIChpbnRlbC0+ZGVwdGhfYnVmZmVyX2lzX2Zsb2F0KQotCSBiZC5kd29yZDEuYml0cy5mb3JtYXQgPSBCUldfREVQVEhGT1JNQVRfRDMyX0ZMT0FUOwotICAgICAgZWxzZQotCSBiZC5kd29yZDEuYml0cy5mb3JtYXQgPSBCUldfREVQVEhGT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoMCk7Ci0gICAgICByZXR1cm47CisgICBpZiAocmVnaW9uID09IE5VTEwpIHsKKyAgICAgIEJFR0lOX0JBVENIKGxlbiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goQ01EX0RFUFRIX0JVRkZFUiA8PCAxNiB8IChsZW4gLSAyKSk7CisgICAgICBPVVRfQkFUQ0goKEJSV19ERVBUSEZPUk1BVF9EMzJfRkxPQVQgPDwgMTgpIHwKKwkJKEJSV19TVVJGQUNFX05VTEwgPDwgMjkpKTsKKyAgICAgIE9VVF9CQVRDSCgwKTsKKyAgICAgIE9VVF9CQVRDSCgwKTsKKyAgICAgIE9VVF9CQVRDSCgwKTsKKworICAgICAgaWYgKEJSV19JU19HTTQ1KGJydykgfHwgQlJXX0lTX0c0WChicncpKQorICAgICAgICAgT1VUX0JBVENIKDApOworCisgICAgICBBRFZBTkNFX0JBVENIKCk7CisgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgaW50IGZvcm1hdDsKKyAgICAgIGRyaV9ibyAqYXBlcl9hcnJheVtdID0geworCSBpbnRlbC0+YmF0Y2gtPmJ1ZiwKKwkgcmVnaW9uLT5idWZmZXIKKyAgICAgIH07CisKKyAgICAgIHN3aXRjaCAocmVnaW9uLT5jcHApIHsKKyAgICAgIGNhc2UgMjoKKwkgZm9ybWF0ID0gQlJXX0RFUFRIRk9STUFUX0QxNl9VTk9STTsKKwkgYnJlYWs7CisgICAgICBjYXNlIDQ6CisJIGlmIChpbnRlbC0+ZGVwdGhfYnVmZmVyX2lzX2Zsb2F0KQorCSAgICBmb3JtYXQgPSBCUldfREVQVEhGT1JNQVRfRDMyX0ZMT0FUOworCSBlbHNlCisJICAgIGZvcm1hdCA9IEJSV19ERVBUSEZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoMCk7CisJIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGRyaV9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoYXBlcl9hcnJheSwgQVJSQVlfU0laRShhcGVyX2FycmF5KSkpCisJIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CisKKyAgICAgIEJFR0lOX0JBVENIKGxlbiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goQ01EX0RFUFRIX0JVRkZFUiA8PCAxNiB8IChsZW4gLSAyKSk7CisgICAgICBPVVRfQkFUQ0goKChyZWdpb24tPnBpdGNoICogcmVnaW9uLT5jcHApIC0gMSkgfAorCQkoZm9ybWF0IDw8IDE4KSB8CisJCShCUldfVElMRVdBTEtfWU1BSk9SIDw8IDI2KSB8CisJCSgocmVnaW9uLT50aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkgPDwgMjcpIHwKKwkJKEJSV19TVVJGQUNFXzJEIDw8IDI5KSk7CisgICAgICBPVVRfUkVMT0MocmVnaW9uLT5idWZmZXIsCisJCUk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisJCTApOworICAgICAgT1VUX0JBVENIKChCUldfU1VSRkFDRV9NSVBNQVBMQVlPVVRfQkVMT1cgPDwgMSkgfAorCQkoKHJlZ2lvbi0+cGl0Y2ggLSAxKSA8PCA2KSB8CisJCSgocmVnaW9uLT5oZWlnaHQgLSAxKSA8PCAxOSkpOworICAgICAgT1VUX0JBVENIKDApOworCisgICAgICBpZiAoQlJXX0lTX0dNNDUoYnJ3KSB8fCBCUldfSVNfRzRYKGJydykpCisgICAgICAgICBPVVRfQkFUQ0goMCk7CisKKyAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKICAgIH0KLQotICAgYmQuZHdvcmQxLmJpdHMuZGVwdGhfb2Zmc2V0X2Rpc2FibGUgPSAwOyAvKiBjb29yZGluYXRlIG9mZnNldCAqLwotCi0gICAvKiBUaGUgZGVwdGhidWZmZXIgY2FuIG9ubHkgdXNlIFlNQUpPUiB0aWxpbmcuLi4gIFRoaXMgaXMgYSBiaXQgb2YKLSAgICAqIGEgc2hhbWUgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZSAyZCBibGl0dGVyIHdoaWNoIG9ubHkgc3VwcG9ydHMKLSAgICAqIFhNQUpPUiB0aWxpbmcuLi4gIAotICAgICovCi0gICBiZC5kd29yZDEuYml0cy50aWxlX3dhbGsgPSBCUldfVElMRVdBTEtfWU1BSk9SOwotICAgYmQuZHdvcmQxLmJpdHMudGlsZWRfc3VyZmFjZSA9IGludGVsLT5kZXB0aF9yZWdpb24tPnRpbGVkOwotICAgYmQuZHdvcmQxLmJpdHMuc3VyZmFjZV90eXBlID0gQlJXX1NVUkZBQ0VfMkQ7Ci0KLSAgIC8qIEJSV19ORVdfTE9DSyAqLwotICAgYmQuZHdvcmQyX2Jhc2VfYWRkciA9IGJtQnVmZmVyT2Zmc2V0KGludGVsLCByZWdpb24tPmJ1ZmZlcik7ICAgIAotCi0gICBiZC5kd29yZDMuYml0cy5taXBtYXBfbGF5b3V0ID0gQlJXX1NVUkZBQ0VfTUlQTUFQTEFZT1VUX0JFTE9XOwotICAgYmQuZHdvcmQzLmJpdHMubG9kID0gMDsKLSAgIGJkLmR3b3JkMy5iaXRzLndpZHRoID0gcmVnaW9uLT5waXRjaCAtIDE7IC8qIFhYWDogd2lkdGggPyAqLwotICAgYmQuZHdvcmQzLmJpdHMuaGVpZ2h0ID0gcmVnaW9uLT5oZWlnaHQgLSAxOwotCi0gICBiZC5kd29yZDQuYml0cy5taW5fYXJyYXlfZWxlbWVudCA9IDA7Ci0gICBiZC5kd29yZDQuYml0cy5kZXB0aCA9IDA7Ci0gICAgICAKLSAgIEJSV19DQUNIRURfQkFUQ0hfU1RSVUNUKGJydywgJmJkKTsKIH0KIAogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19kZXB0aGJ1ZmZlciA9IHsKICAgIC5kaXJ0eSA9IHsKICAgICAgIC5tZXNhID0gMCwKLSAgICAgIC5icncgPSBCUldfTkVXX0NPTlRFWFQgfCBCUldfTkVXX0xPQ0ssCi0gICAgICAuY2FjaGUgPSAwCisgICAgICAuYnJ3ID0gQlJXX05FV19ERVBUSF9CVUZGRVIgfCBCUldfTkVXX0JBVENILAorICAgICAgLmNhY2hlID0gMCwKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX2RlcHRoYnVmZmVyCisgICAuZW1pdCA9IGVtaXRfZGVwdGhidWZmZXIsCiB9OwogCiAKQEAgLTMyNyw3ICsyNzcsNyBAQAogICAgICAgLmJydyA9IDAsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9wb2x5Z29uX3N0aXBwbGUKKyAgIC5lbWl0ID0gdXBsb2FkX3BvbHlnb25fc3RpcHBsZQogfTsKIAogCkBAIC0zNTAsMTMgKzMwMCw0MiBAQAogICAgQlJXX0NBQ0hFRF9CQVRDSF9TVFJVQ1QoYnJ3LCAmYnBzbyk7CiB9CiAKKyNkZWZpbmUgX05FV19XSU5ET1dfUE9TIDB4NDAwMDAwMDAKKwogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19wb2x5Z29uX3N0aXBwbGVfb2Zmc2V0ID0gewogICAgLmRpcnR5ID0gewogICAgICAgLm1lc2EgPSBfTkVXX1dJTkRPV19QT1MsCiAgICAgICAuYnJ3ID0gMCwKICAgICAgIC5jYWNoZSA9IDAKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3BvbHlnb25fc3RpcHBsZV9vZmZzZXQKKyAgIC5lbWl0ID0gdXBsb2FkX3BvbHlnb25fc3RpcHBsZV9vZmZzZXQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQSBMaW5lIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIHZvaWQgdXBsb2FkX2FhX2xpbmVfcGFyYW1ldGVycyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKK3sKKyAgIHN0cnVjdCBicndfYWFfbGluZV9wYXJhbWV0ZXJzIGJhbHA7CisgICAKKyAgIGlmICghKEJSV19JU19HTTQ1KGJydykgfHwgQlJXX0lTX0c0WChicncpKSkKKyAgICAgIHJldHVybjsKKworICAgLyogdXNlIGxlZ2FjeSBhYSBsaW5lIGNvdmVyYWdlIGNvbXB1dGF0aW9uICovCisgICBtZW1zZXQoJmJhbHAsIDAsIHNpemVvZihiYWxwKSk7CisgICBiYWxwLmhlYWRlci5vcGNvZGUgPSBDTURfQUFfTElORV9QQVJBTUVURVJTOworICAgYmFscC5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKGJhbHApIC8gNCAtIDI7CisgICAKKyAgIEJSV19DQUNIRURfQkFUQ0hfU1RSVUNUKGJydywgJmJhbHApOworfQorCitjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2FhX2xpbmVfcGFyYW1ldGVycyA9IHsKKyAgIC5kaXJ0eSA9IHsKKyAgICAgIC5tZXNhID0gMCwKKyAgICAgIC5icncgPSBCUldfTkVXX0NPTlRFWFQsCisgICAgICAuY2FjaGUgPSAwCisgICB9LAorICAgLmVtaXQgPSB1cGxvYWRfYWFfbGluZV9wYXJhbWV0ZXJzCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM5MSw0MSArMzcwLDcgQEAKICAgICAgIC5icncgPSAwLAogICAgICAgLmNhY2hlID0gMAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfbGluZV9zdGlwcGxlCi19OwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNaXNjIGNvbnN0YW50IHN0YXRlIHBhY2tldHMKLSAqLwotCi1zdGF0aWMgdm9pZCB1cGxvYWRfcGlwZV9jb250cm9sKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQotewotICAgc3RydWN0IGJyd19waXBlX2NvbnRyb2wgcGM7Ci0KLSAgIHJldHVybjsKLQotICAgbWVtc2V0KCZwYywgMCwgc2l6ZW9mKHBjKSk7Ci0KLSAgIHBjLmhlYWRlci5vcGNvZGUgPSBDTURfUElQRV9DT05UUk9MOwotICAgcGMuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihwYykvNCAtIDI7Ci0gICBwYy5oZWFkZXIucG9zdF9zeW5jX29wZXJhdGlvbiA9IFBJUEVfQ09OVFJPTF9OT1dSSVRFOwotCi0gICBwYy5oZWFkZXIuaW5zdHJ1Y3Rpb25fc3RhdGVfY2FjaGVfZmx1c2hfZW5hYmxlID0gMTsKLQotICAgcGMuYml0czEuZGVzdF9hZGRyX3R5cGUgPSBQSVBFX0NPTlRST0xfR1RUV1JJVEVfR0xPQkFMOwotCi0gICBCUldfQkFUQ0hfU1RSVUNUKGJydywgJnBjKTsKLX0KLQotY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19waXBlX2NvbnRyb2wgPSB7Ci0gICAuZGlydHkgPSB7Ci0gICAgICAubWVzYSA9IDAsCi0gICAgICAuYnJ3ID0gQlJXX05FV19DT05URVhULAotICAgICAgLmNhY2hlID0gMAotICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfcGlwZV9jb250cm9sCisgICAuZW1pdCA9IHVwbG9hZF9saW5lX3N0aXBwbGUKIH07CiAKIApAQCAtNDQxLDcgKzM4Niw3IEBACiAgICAgICBzdHJ1Y3QgYnJ3X3BpcGVsaW5lX3NlbGVjdCBwczsKIAogICAgICAgbWVtc2V0KCZwcywgMCwgc2l6ZW9mKHBzKSk7Ci0gICAgICBwcy5oZWFkZXIub3Bjb2RlID0gQ01EX1BJUEVMSU5FX1NFTEVDVDsKKyAgICAgIHBzLmhlYWRlci5vcGNvZGUgPSBDTURfUElQRUxJTkVfU0VMRUNUKGJydyk7CiAgICAgICBwcy5oZWFkZXIucGlwZWxpbmVfc2VsZWN0ID0gMDsKICAgICAgIEJSV19CQVRDSF9TVFJVQ1QoYnJ3LCAmcHMpOwogICAgfQpAQCAtNDc3LDcgKzQyMiw3IEBACiAgICAgICBzdHJ1Y3QgYnJ3X3ZmX3N0YXRpc3RpY3MgdmZzOwogICAgICAgbWVtc2V0KCZ2ZnMsIDAsIHNpemVvZih2ZnMpKTsKIAotICAgICAgdmZzLm9wY29kZSA9IENNRF9WRl9TVEFUSVNUSUNTOworICAgICAgdmZzLm9wY29kZSA9IENNRF9WRl9TVEFUSVNUSUNTKGJydyk7CiAgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKIAkgdmZzLnN0YXRpc3RpY3NfZW5hYmxlID0gMTsgCiAKQEAgLTQ5MSw0MyArNDM2LDM5IEBACiAgICAgICAuYnJ3ID0gQlJXX05FV19DT05URVhULAogICAgICAgLmNhY2hlID0gMAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfaW52YXJpZW50X3N0YXRlCisgICAuZW1pdCA9IHVwbG9hZF9pbnZhcmllbnRfc3RhdGUKIH07CiAKLQotLyogU3RhdGUgcG9vbCBhZGRyZXNzZXM6CisvKioKKyAqIERlZmluZSB0aGUgYmFzZSBhZGRyZXNzZXMgd2hpY2ggc29tZSBzdGF0ZSBpcyByZWZlcmVuY2VkIGZyb20uCisgKgorICogVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgaGF2aW5nIHRvIGVtaXQgcmVsb2NhdGlvbnMgaW4gbWFueSBwbGFjZXMgZm9yCisgKiBjYWNoZWQgc3RhdGUsIGFuZCBpbnN0ZWFkIGVtaXQgcG9pbnRlcnMgaW5zaWRlIG9mIGxhcmdlLCBtb3N0bHktc3RhdGljCisgKiBzdGF0ZSBwb29scy4gIFRoaXMgY29tZXMgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5LCBhbmQgbW9yZSBleHBlbnNpdmUgY2FjaGUKKyAqIG1pc3Nlcy4KICAqLwogc3RhdGljIHZvaWQgdXBsb2FkX3N0YXRlX2Jhc2VfYWRkcmVzcyggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQogewogICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gJmJydy0+aW50ZWw7Ci0gICBzdHJ1Y3QgYnJ3X3N0YXRlX2Jhc2VfYWRkcmVzcyBzYmE7Ci0gICAgICAKLSAgIG1lbXNldCgmc2JhLCAwLCBzaXplb2Yoc2JhKSk7CiAKLSAgIHNiYS5oZWFkZXIub3Bjb2RlID0gQ01EX1NUQVRFX0JBU0VfQUREUkVTUzsKLSAgIHNiYS5oZWFkZXIubGVuZ3RoID0gMHg0OwotCi0gICAvKiBCUldfTkVXX0xPQ0sgKi8KLSAgIHNiYS5iaXRzMC5nZW5lcmFsX3N0YXRlX2FkZHJlc3MgPSBibUJ1ZmZlck9mZnNldChpbnRlbCwgYnJ3LT5wb29sW0JSV19HU19QT09MXS5idWZmZXIpID4+IDU7Ci0gICBzYmEuYml0czAubW9kaWZ5X2VuYWJsZSA9IDE7Ci0KLSAgIC8qIEJSV19ORVdfTE9DSyAqLwotICAgc2JhLmJpdHMxLnN1cmZhY2Vfc3RhdGVfYWRkcmVzcyA9IGJtQnVmZmVyT2Zmc2V0KGludGVsLCBicnctPnBvb2xbQlJXX1NTX1BPT0xdLmJ1ZmZlcikgPj4gNTsKLSAgIHNiYS5iaXRzMS5tb2RpZnlfZW5hYmxlID0gMTsKLQotICAgc2JhLmJpdHMyLm1vZGlmeV9lbmFibGUgPSAxOwotICAgc2JhLmJpdHMzLm1vZGlmeV9lbmFibGUgPSAxOwotICAgc2JhLmJpdHM0Lm1vZGlmeV9lbmFibGUgPSAxOwotCi0gICBCUldfQ0FDSEVEX0JBVENIX1NUUlVDVChicncsICZzYmEpOworICAgLyogT3V0cHV0IHRoZSBzdHJ1Y3R1cmUgKGJyd19zdGF0ZV9iYXNlX2FkZHJlc3MpIGRpcmVjdGx5IHRvIHRoZQorICAgICogYmF0Y2hidWZmZXIsIHNvIHdlIGNhbiBlbWl0IHJlbG9jYXRpb25zIGlubGluZS4KKyAgICAqLworICAgQkVHSU5fQkFUQ0goNiwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0goQ01EX1NUQVRFX0JBU0VfQUREUkVTUyA8PCAxNiB8ICg2IC0gMikpOworICAgT1VUX0JBVENIKDEpOyAvKiBHZW5lcmFsIHN0YXRlIGJhc2UgYWRkcmVzcyAqLworICAgT1VUX0JBVENIKDEpOyAvKiBTdXJmYWNlIHN0YXRlIGJhc2UgYWRkcmVzcyAqLworICAgT1VUX0JBVENIKDEpOyAvKiBJbmRpcmVjdCBvYmplY3QgYmFzZSBhZGRyZXNzICovCisgICBPVVRfQkFUQ0goMSk7IC8qIEdlbmVyYWwgc3RhdGUgdXBwZXIgYm91bmQgKi8KKyAgIE9VVF9CQVRDSCgxKTsgLyogSW5kaXJlY3Qgb2JqZWN0IHVwcGVyIGJvdW5kICovCisgICBBRFZBTkNFX0JBVENIKCk7CiB9CiAKLQogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19zdGF0ZV9iYXNlX2FkZHJlc3MgPSB7CiAgICAuZGlydHkgPSB7CiAgICAgICAubWVzYSA9IDAsCi0gICAgICAuYnJ3ID0gQlJXX05FV19DT05URVhUIHwgQlJXX05FV19MT0NLLAotICAgICAgLmNhY2hlID0gMAorICAgICAgLmJydyA9IEJSV19ORVdfQ09OVEVYVCwKKyAgICAgIC5jYWNoZSA9IDAsCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9zdGF0ZV9iYXNlX2FkZHJlc3MKKyAgIC5lbWl0ID0gdXBsb2FkX3N0YXRlX2Jhc2VfYWRkcmVzcwogfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3Byb2dyYW0uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3Byb2dyYW0uYwppbmRleCA3NTJmZTQ5Li5jMzg2MTBiIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19wcm9ncmFtLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfcHJvZ3JhbS5jCkBAIC0yOSwxNSArMjksMTUgQEAKICAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KICAgKi8KICAgCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAibWFpbi9lbnVtcy5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgotI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCi0jaW5jbHVkZSAiYnJ3X2F1Yi5oIgotI2luY2x1ZGUgImJyd191dGlsLmgiCi0jaW5jbHVkZSAicHJvZ3JhbS5oIgotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dyYW1vcHQuaCIKICNpbmNsdWRlICJ0bmwvdG5sLmgiCiAKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd191dGlsLmgiCiAKIHN0YXRpYyB2b2lkIGJyd0JpbmRQcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwKIAkJCSAgICBHTGVudW0gdGFyZ2V0LCAKQEAgLTEyNSw2ICsxMjUsOSBAQAogICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqdnAgPSAoc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqKWJydy0+dmVydGV4X3Byb2dyYW07CiAgICAgICBpZiAocCA9PSB2cCkKIAkgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gQlJXX05FV19WRVJURVhfUFJPR1JBTTsKKyAgICAgIGlmIChwLT5wcm9ncmFtLklzUG9zaXRpb25JbnZhcmlhbnQpIHsKKwkgX21lc2FfaW5zZXJ0X212cF9jb2RlKGN0eCwgJnAtPnByb2dyYW0pOworICAgICAgfQogICAgICAgcC0+aWQgPSBicnctPnByb2dyYW1faWQrKzsgICAgICAKICAgICAgIHAtPnBhcmFtX3N0YXRlID0gcC0+cHJvZ3JhbS5CYXNlLlBhcmFtZXRlcnMtPlN0YXRlRmxhZ3M7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3NmLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zZi5jCmluZGV4IGQ1MTc1MzkuLjViYjllMTEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3NmLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2YuYwpAQCAtNDMsOCArNDMsNiBAQAogI2luY2x1ZGUgImJyd19zZi5oIgogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgogCi0jZGVmaW5lIERPX1NFVFVQX0JJVFMgKCgxPDxGUkFHX0FUVFJJQl9NQVgpLTEpCi0KIHN0YXRpYyB2b2lkIGNvbXBpbGVfc2ZfcHJvZyggc3RydWN0IGJyd19jb250ZXh0ICpicncsCiAJCQkgICAgIHN0cnVjdCBicndfc2ZfcHJvZ19rZXkgKmtleSApCiB7CkBAIC01Nyw3ICs1NSw3IEBACiAKICAgIC8qIEJlZ2luIHRoZSBjb21waWxhdGlvbjoKICAgICAqLwotICAgYnJ3X2luaXRfY29tcGlsZSgmYy5mdW5jKTsKKyAgIGJyd19pbml0X2NvbXBpbGUoYnJ3LCAmYy5mdW5jKTsKIAogICAgYy5rZXkgPSAqa2V5OwogICAgYy5ucl9hdHRycyA9IGJyd19jb3VudF9iaXRzKGMua2V5LmF0dHJzKTsKQEAgLTc0LDYgKzcyLDExIEBACiAgICAgICBpZiAoYy5rZXkuYXR0cnMgJiAoMTw8aSkpIHsKIAkgYy5hdHRyX3RvX2lkeFtpXSA9IGlkeDsKIAkgYy5pZHhfdG9fYXR0cltpZHhdID0gaTsKKwkgaWYgKGkgPj0gVkVSVF9SRVNVTFRfVEVYMCAmJiBpIDw9IFZFUlRfUkVTVUxUX1RFWDcpIHsKKwkJIGMucG9pbnRfYXR0cnNbaV0uQ29vcmRSZXBsYWNlID0gCisJCQlicnctPmF0dHJpYnMuUG9pbnQtPkNvb3JkUmVwbGFjZVtpIC0gVkVSVF9SRVNVTFRfVEVYMF07CisJIH0gZWxzZQorCQkgYy5wb2ludF9hdHRyc1tpXS5Db29yZFJlcGxhY2UgPSBHTF9GQUxTRTsKIAkgaWR4Kys7CiAgICAgICB9CiAgICAKQEAgLTgyLDE1ICs4NSwxOCBAQAogICAgc3dpdGNoIChrZXktPnByaW1pdGl2ZSkgewogICAgY2FzZSBTRl9UUklBTkdMRVM6CiAgICAgICBjLm5yX3ZlcnRzID0gMzsKLSAgICAgIGJyd19lbWl0X3RyaV9zZXR1cCggJmMgKTsKKyAgICAgIGJyd19lbWl0X3RyaV9zZXR1cCggJmMsIEdMX1RSVUUgKTsKICAgICAgIGJyZWFrOwogICAgY2FzZSBTRl9MSU5FUzoKICAgICAgIGMubnJfdmVydHMgPSAyOwotICAgICAgYnJ3X2VtaXRfbGluZV9zZXR1cCggJmMgKTsKKyAgICAgIGJyd19lbWl0X2xpbmVfc2V0dXAoICZjLCBHTF9UUlVFICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgU0ZfUE9JTlRTOgogICAgICAgYy5ucl92ZXJ0cyA9IDE7Ci0gICAgICBicndfZW1pdF9wb2ludF9zZXR1cCggJmMgKTsKKyAgICAgIGlmIChrZXktPmRvX3BvaW50X3Nwcml0ZSkKKwkgIGJyd19lbWl0X3BvaW50X3Nwcml0ZV9zZXR1cCggJmMsIEdMX1RSVUUgKTsKKyAgICAgIGVsc2UKKwkgIGJyd19lbWl0X3BvaW50X3NldHVwKCAmYywgR0xfVFJVRSApOwogICAgICAgYnJlYWs7CiAgICBjYXNlIFNGX1VORklMTEVEX1RSSVM6CiAgICAgICBjLm5yX3ZlcnRzID0gMzsKQEAgLTEwOCwyOSArMTE0LDE4IEBACiAKICAgIC8qIFVwbG9hZAogICAgICovCi0gICBicnctPnNmLnByb2dfZ3Nfb2Zmc2V0ID0gYnJ3X3VwbG9hZF9jYWNoZSggJmJydy0+Y2FjaGVbQlJXX1NGX1BST0ddLAotCQkJCQkgICAgICAmYy5rZXksCi0JCQkJCSAgICAgIHNpemVvZihjLmtleSksCi0JCQkJCSAgICAgIHByb2dyYW0sCi0JCQkJCSAgICAgIHByb2dyYW1fc2l6ZSwKLQkJCQkJICAgICAgJmMucHJvZ19kYXRhLAotCQkJCQkgICAgICAmYnJ3LT5zZi5wcm9nX2RhdGEgKTsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPnNmLnByb2dfYm8pOworICAgYnJ3LT5zZi5wcm9nX2JvID0gYnJ3X3VwbG9hZF9jYWNoZSggJmJydy0+Y2FjaGUsIEJSV19TRl9QUk9HLAorCQkJCSAgICAgICAmYy5rZXksIHNpemVvZihjLmtleSksCisJCQkJICAgICAgIE5VTEwsIDAsCisJCQkJICAgICAgIHByb2dyYW0sIHByb2dyYW1fc2l6ZSwKKwkJCQkgICAgICAgJmMucHJvZ19kYXRhLAorCQkJCSAgICAgICAmYnJ3LT5zZi5wcm9nX2RhdGEgKTsKIH0KIAotCi1zdGF0aWMgR0xib29sZWFuIHNlYXJjaF9jYWNoZSggc3RydWN0IGJyd19jb250ZXh0ICpicncsIAotCQkJICAgICAgIHN0cnVjdCBicndfc2ZfcHJvZ19rZXkgKmtleSApCi17Ci0gICByZXR1cm4gYnJ3X3NlYXJjaF9jYWNoZSgmYnJ3LT5jYWNoZVtCUldfU0ZfUFJPR10sIAotCQkJICAga2V5LCBzaXplb2YoKmtleSksCi0JCQkgICAmYnJ3LT5zZi5wcm9nX2RhdGEsCi0JCQkgICAmYnJ3LT5zZi5wcm9nX2dzX29mZnNldCk7Ci19Ci0KLQogLyogQ2FsY3VsYXRlIGludGVycG9sYW50cyBmb3IgdHJpYW5nbGUgYW5kIGxpbmUgcmFzdGVyaXphdGlvbi4KICAqLwotc3RhdGljIHZvaWQgdXBsb2FkX3NmX3Byb2coIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3N0YXRpYyB2b2lkIHVwbG9hZF9zZl9wcm9nKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgc3RydWN0IGJyd19zZl9wcm9nX2tleSBrZXk7CiAKQEAgLTE2Miw3ICsxNTcsOCBAQAogICAgICAgYnJlYWs7CiAgICB9CiAKLQorICAga2V5LmRvX3BvaW50X3Nwcml0ZSA9IGJydy0+YXR0cmlicy5Qb2ludC0+UG9pbnRTcHJpdGU7CisgICBrZXkuU3ByaXRlT3JpZ2luID0gYnJ3LT5hdHRyaWJzLlBvaW50LT5TcHJpdGVPcmlnaW47CiAgICAvKiBfTkVXX0xJR0hUICovCiAgICBrZXkuZG9fZmxhdF9zaGFkaW5nID0gKGJydy0+YXR0cmlicy5MaWdodC0+U2hhZGVNb2RlbCA9PSBHTF9GTEFUKTsKICAgIGtleS5kb190d29zaWRlX2NvbG9yID0gKGJydy0+YXR0cmlicy5MaWdodC0+RW5hYmxlZCAmJiBicnctPmF0dHJpYnMuTGlnaHQtPk1vZGVsLlR3b1NpZGUpOwpAQCAtMTcxLDE4ICsxNjcsMjIgQEAKICAgIGlmIChrZXkuZG9fdHdvc2lkZV9jb2xvcikKICAgICAgIGtleS5mcm9udGZhY2VfY2N3ID0gKGJydy0+YXR0cmlicy5Qb2x5Z29uLT5Gcm9udEZhY2UgPT0gR0xfQ0NXKTsKIAotCi0gICBpZiAoIXNlYXJjaF9jYWNoZShicncsICZrZXkpKQorICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+c2YucHJvZ19ibyk7CisgICBicnctPnNmLnByb2dfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfU0ZfUFJPRywKKwkJCQkgICAgICAma2V5LCBzaXplb2Yoa2V5KSwKKwkJCQkgICAgICBOVUxMLCAwLAorCQkJCSAgICAgICZicnctPnNmLnByb2dfZGF0YSk7CisgICBpZiAoYnJ3LT5zZi5wcm9nX2JvID09IE5VTEwpCiAgICAgICBjb21waWxlX3NmX3Byb2coIGJydywgJmtleSApOwogfQogCiAKIGNvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfc2ZfcHJvZyA9IHsKICAgIC5kaXJ0eSA9IHsKLSAgICAgIC5tZXNhICA9IChfTkVXX0xJR0hUfF9ORVdfUE9MWUdPTiksCisgICAgICAubWVzYSAgPSAoX05FV19MSUdIVHxfTkVXX1BPTFlHT058X05FV19QT0lOVCksCiAgICAgICAuYnJ3ICAgPSAoQlJXX05FV19SRURVQ0VEX1BSSU1JVElWRSksCiAgICAgICAuY2FjaGUgPSBDQUNIRV9ORVdfVlNfUFJPRwogICAgfSwKLSAgIC51cGRhdGUgPSB1cGxvYWRfc2ZfcHJvZworICAgLnByZXBhcmUgPSB1cGxvYWRfc2ZfcHJvZwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2YuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3NmLmgKaW5kZXggZmI3MmI4NC4uMWMwZmI3MCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2YuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zZi5oCkBAIC0zNCw5ICszNCw5IEBACiAjZGVmaW5lIEJSV19TRl9ICiAKIAorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCiAjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKICNpbmNsdWRlICJicndfZXUuaCIKLSNpbmNsdWRlICJwcm9ncmFtLmgiCiAKIAogI2RlZmluZSBTRl9QT0lOVFMgICAgMApAQCAtNDUsMTQgKzQ1LDE5IEBACiAjZGVmaW5lIFNGX1VORklMTEVEX1RSSVMgICAzCiAKIHN0cnVjdCBicndfc2ZfcHJvZ19rZXkgeworICAgR0x1aW50IGF0dHJzOjMyOwogICAgR0x1aW50IHByaW1pdGl2ZToyOwogICAgR0x1aW50IGRvX3R3b3NpZGVfY29sb3I6MTsKICAgIEdMdWludCBkb19mbGF0X3NoYWRpbmc6MTsKLSAgIEdMdWludCBhdHRyczoxNjsKICAgIEdMdWludCBmcm9udGZhY2VfY2N3OjE7Ci0gICBHTHVpbnQgcGFkOjExOworICAgR0x1aW50IGRvX3BvaW50X3Nwcml0ZToxOworICAgR0x1aW50IHBhZDoxMDsKKyAgIEdMZW51bSBTcHJpdGVPcmlnaW47CiB9OwogCitzdHJ1Y3QgYnJ3X3NmX3BvaW50X3RleCB7CisJR0xib29sZWFuIENvb3JkUmVwbGFjZTsJCit9OwogCiBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgewogICAgc3RydWN0IGJyd19jb21waWxlIGZ1bmM7CkBAIC05NCwxMiArOTksMTQgQEAKIAogICAgR0x1Ynl0ZSBhdHRyX3RvX2lkeFtWRVJUX1JFU1VMVF9NQVhdOyAgIAogICAgR0x1Ynl0ZSBpZHhfdG9fYXR0cltWRVJUX1JFU1VMVF9NQVhdOyAgIAorICAgc3RydWN0IGJyd19zZl9wb2ludF90ZXggcG9pbnRfYXR0cnNbVkVSVF9SRVNVTFRfTUFYXTsKIH07CiAKICAKLXZvaWQgYnJ3X2VtaXRfdHJpX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMgKTsKLXZvaWQgYnJ3X2VtaXRfbGluZV9zZXR1cCggc3RydWN0IGJyd19zZl9jb21waWxlICpjICk7Ci12b2lkIGJyd19lbWl0X3BvaW50X3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMgKTsKK3ZvaWQgYnJ3X2VtaXRfdHJpX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMsIEdMYm9vbGVhbiBhbGxvY2F0ZSApOwordm9pZCBicndfZW1pdF9saW5lX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMsIEdMYm9vbGVhbiBhbGxvY2F0ZSApOwordm9pZCBicndfZW1pdF9wb2ludF9zZXR1cCggc3RydWN0IGJyd19zZl9jb21waWxlICpjLCBHTGJvb2xlYW4gYWxsb2NhdGUgKTsKK3ZvaWQgYnJ3X2VtaXRfcG9pbnRfc3ByaXRlX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMsIEdMYm9vbGVhbiBhbGxvY2F0ZSApOwogdm9pZCBicndfZW1pdF9hbnlwcmltX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMgKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zZl9lbWl0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zZl9lbWl0LmMKaW5kZXggY2JhZjAxOC4uNmZiYThjOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2ZfZW1pdC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3NmX2VtaXQuYwpAQCAtNTksNiArNTksMzUgQEAKICAgIHJldHVybiAoYy0+a2V5LmF0dHJzICYgKDE8PGF0dHIpKSA/IDEgOiAwOwogfQogCisvKioKKyAqIFNldHMgVkVSVF9SRVNVTFRfRk9HQy5ZICBmb3IgZ2xfRnJvbnRGYWNpbmcKKyAqCisgKiBUaGlzIGlzIGN1cnJlbnRseSBleGVjdXRlZCBpZiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSB1c2VzIFZFUlRfUkVTVUxUX0ZPR0MKKyAqIGF0IGFsbCwgYnV0IHRoaXMgY291bGQgYmUgZWxpbWluYXRlZCB3aXRoIGEgc2NhbiBvZiB0aGUgRlAgY29udGVudHMuCisgKi8KK3N0YXRpYyB2b2lkCitkb19mcm9udF9mYWNpbmcoIHN0cnVjdCBicndfc2ZfY29tcGlsZSAqYyApCit7CisgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsgCisgICBpbnQgaTsKKworICAgaWYgKCFoYXZlX2F0dHIoYywgVkVSVF9SRVNVTFRfRk9HQykpCisgICAgICByZXR1cm47CisKKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfQ01QKHAsIGJyd19udWxsX3JlZygpLCAKKyAgICAgICAgYy0+a2V5LmZyb250ZmFjZV9jY3cgPyBCUldfQ09ORElUSU9OQUxfRyA6IEJSV19DT05ESVRJT05BTF9MLAorICAgICAgICBjLT5kZXQsIGJyd19pbW1fZigwKSk7CisgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgc3RydWN0IGJyd19yZWcgZm9nYyA9IGdldF92ZXJ0X2F0dHIoYywgYy0+dmVydFtpXSxGUkFHX0FUVFJJQl9GT0dDKTsKKyAgICAgICBicndfTU9WKHAsIGdldF9lbGVtZW50KGZvZ2MsIDEpLCBicndfaW1tX2YoMCkpOworICAgICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT1JNQUwpOworICAgICAgIGJyd19NT1YocCwgZ2V0X2VsZW1lbnQoZm9nYywgMSksIGJyd19pbW1fZigxKSk7CisgICAgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgfQorICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQogCiAJCQkgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCkBAIC0zNDMsMTUgKzM3MiwxOSBAQAogCiAKIAotdm9pZCBicndfZW1pdF90cmlfc2V0dXAoIHN0cnVjdCBicndfc2ZfY29tcGlsZSAqYyApCit2b2lkIGJyd19lbWl0X3RyaV9zZXR1cCggc3RydWN0IGJyd19zZl9jb21waWxlICpjLCBHTGJvb2xlYW4gYWxsb2NhdGUpCiB7CiAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKICAgIEdMdWludCBpOwogCiAgICBjLT5ucl92ZXJ0cyA9IDM7Ci0gICBhbGxvY19yZWdzKGMpOworCisgICBpZiAoYWxsb2NhdGUpCisgICAgICBhbGxvY19yZWdzKGMpOworCiAgICBpbnZlcnRfZGV0KGMpOwogICAgY29weV96X2ludl93KGMpOworICAgZG9fZnJvbnRfZmFjaW5nKGMpOwogCiAgICBpZiAoYy0+a2V5LmRvX3R3b3NpZGVfY29sb3IpIAogICAgICAgZG9fdHdvc2lkZV9jb2xvcihjKTsKQEAgLTQyOCwxNCArNDYxLDE3IEBACiAKIAogCi12b2lkIGJyd19lbWl0X2xpbmVfc2V0dXAoIHN0cnVjdCBicndfc2ZfY29tcGlsZSAqYyApCit2b2lkIGJyd19lbWl0X2xpbmVfc2V0dXAoIHN0cnVjdCBicndfc2ZfY29tcGlsZSAqYywgR0xib29sZWFuIGFsbG9jYXRlKQogewogICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CiAgICBHTHVpbnQgaTsKIAogCiAgICBjLT5ucl92ZXJ0cyA9IDI7Ci0gICBhbGxvY19yZWdzKGMpOworCisgICBpZiAoYWxsb2NhdGUpCisgICAgICBhbGxvY19yZWdzKGMpOworCiAgICBpbnZlcnRfZGV0KGMpOwogICAgY29weV96X2ludl93KGMpOwogCkBAIC00OTcsMTcgKzUzMywxMDMgQEAKICAgIH0gCiB9CiAKLQotLyogUG9pbnRzIHNldHVwIC0gc2V2ZXJhbCBzaW1wbGlmaWNhdGlvbnMgYXMgYWxsIGF0dHJpYnV0ZXMgYXJlCi0gKiBjb25zdGFudCBhY3Jvc3MgdGhlIGZhY2Ugb2YgdGhlIHBvaW50IChwb2ludCBzcHJpdGVzIGV4Y2x1ZGVkISkKLSAqLwotdm9pZCBicndfZW1pdF9wb2ludF9zZXR1cCggc3RydWN0IGJyd19zZl9jb21waWxlICpjICkKK3ZvaWQgYnJ3X2VtaXRfcG9pbnRfc3ByaXRlX3NldHVwKCBzdHJ1Y3QgYnJ3X3NmX2NvbXBpbGUgKmMsIEdMYm9vbGVhbiBhbGxvY2F0ZSkKIHsKICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOwogICAgR0x1aW50IGk7CiAKICAgIGMtPm5yX3ZlcnRzID0gMTsKLSAgIGFsbG9jX3JlZ3MoYyk7CisKKyAgIGlmIChhbGxvY2F0ZSkKKyAgICAgIGFsbG9jX3JlZ3MoYyk7CisKKyAgIGNvcHlfel9pbnZfdyhjKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBjLT5ucl9zZXR1cF9yZWdzOyBpKyspCisgICB7CisgICAgICBzdHJ1Y3QgYnJ3X3NmX3BvaW50X3RleCAqdGV4ID0gJmMtPnBvaW50X2F0dHJzW2MtPmlkeF90b19hdHRyWzIqaV1dOworICAgICAgc3RydWN0IGJyd19yZWcgYTAgPSBvZmZzZXQoYy0+dmVydFswXSwgaSk7CisgICAgICBHTHVzaG9ydCBwYywgcGNfcGVyc3AsIHBjX2xpbmVhcjsKKyAgICAgIEdMYm9vbGVhbiBsYXN0ID0gY2FsY3VsYXRlX21hc2tzKGMsIGksICZwYywgJnBjX3BlcnNwLCAmcGNfbGluZWFyKTsKKyAgICAgICAgICAgIAorICAgICAgaWYgKHBjX3BlcnNwKQorICAgICAgewkJCQkKKwkgIGlmICghdGV4LT5Db29yZFJlcGxhY2UpIHsKKwkgICAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sX2ZsYWdfdmFsdWUocCwgcGNfcGVyc3ApOworCSAgICAgIGJyd19NVUwocCwgYTAsIGEwLCBjLT5pbnZfd1swXSk7CisJICB9CisgICAgICB9CisKKyAgICAgIGlmICh0ZXgtPkNvb3JkUmVwbGFjZSkgeworCSAgLyogQ2FjdWxhdGUgMS4wL1BvaW50V2lkdGggKi8KKwkgIGJyd19tYXRoKCZjLT5mdW5jLAorCQkgIGMtPnRtcCwKKwkJICBCUldfTUFUSF9GVU5DVElPTl9JTlYsCisJCSAgQlJXX01BVEhfU0FUVVJBVEVfTk9ORSwKKwkJICAwLAorCQkgIGMtPmR4MCwKKwkJICBCUldfTUFUSF9EQVRBX1NDQUxBUiwKKwkJICBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7CisKKwkgIGlmIChjLT5rZXkuU3ByaXRlT3JpZ2luID09IEdMX0xPV0VSX0xFRlQpIHsKKwkgICAJYnJ3X01VTChwLCBjLT5tMUN4LCBjLT50bXAsIGMtPmludl93WzBdKTsKKwkJYnJ3X01PVihwLCB2ZWMxKHN1Ym9mZnNldChjLT5tMUN4LCAxKSksIGJyd19pbW1fZigwLjApKTsKKwkgIAlicndfTVVMKHAsIGMtPm0yQ3ksIGMtPnRtcCwgbmVnYXRlKGMtPmludl93WzBdKSk7CisJCWJyd19NT1YocCwgdmVjMShzdWJvZmZzZXQoYy0+bTJDeSwgMCkpLCBicndfaW1tX2YoMC4wKSk7CisJICB9IGVsc2UgeworCSAgIAlicndfTVVMKHAsIGMtPm0xQ3gsIGMtPnRtcCwgYy0+aW52X3dbMF0pOworCQlicndfTU9WKHAsIHZlYzEoc3Vib2Zmc2V0KGMtPm0xQ3gsIDEpKSwgYnJ3X2ltbV9mKDAuMCkpOworCSAgCWJyd19NVUwocCwgYy0+bTJDeSwgYy0+dG1wLCBjLT5pbnZfd1swXSk7CisJCWJyd19NT1YocCwgdmVjMShzdWJvZmZzZXQoYy0+bTJDeSwgMCkpLCBicndfaW1tX2YoMC4wKSk7CisJICB9CisgICAgICB9IGVsc2UgeworCSAgYnJ3X01PVihwLCBjLT5tMUN4LCBicndfaW1tX3VkKDApKTsKKwkgIGJyd19NT1YocCwgYy0+bTJDeSwgYnJ3X2ltbV91ZCgwKSk7CisgICAgICB9CisKKyAgICAgIHsKKwkgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbF9mbGFnX3ZhbHVlKHAsIHBjKTsgCisJIGlmICh0ZXgtPkNvb3JkUmVwbGFjZSkgeworCSAgICAgaWYgKGMtPmtleS5TcHJpdGVPcmlnaW4gPT0gR0xfTE9XRVJfTEVGVCkgeworCQkgYnJ3X01VTChwLCBjLT5tM0MwLCBjLT5pbnZfd1swXSwgYnJ3X2ltbV9mKDEuMCkpOworCQkgYnJ3X01PVihwLCB2ZWMxKHN1Ym9mZnNldChjLT5tM0MwLCAwKSksIGJyd19pbW1fZigwLjApKTsKKwkgICAgIH0KKwkgICAgIGVsc2UKKwkJIGJyd19NT1YocCwgYy0+bTNDMCwgYnJ3X2ltbV9mKDAuMCkpOworCSB9IGVsc2UgeworCSAJYnJ3X01PVihwLCBjLT5tM0MwLCBhMCk7IC8qIGNvbnN0YW50IHZhbHVlICovCisJIH0KKworCSAvKiBDb3B5IG0wLi5tMyB0byBVUkIuIAorCSAgKi8KKwkgYnJ3X3VyYl9XUklURShwLCAKKwkJICAgICAgIGJyd19udWxsX3JlZygpLAorCQkgICAgICAgMCwKKwkJICAgICAgIGJyd192ZWM4X2dyZigwLCAwKSwKKwkJICAgICAgIDAsIAkvKiBhbGxvY2F0ZSAqLworCQkgICAgICAgMSwJLyogdXNlZCAqLworCQkgICAgICAgNCwgCS8qIG1zZyBsZW4gKi8KKwkJICAgICAgIDAsCS8qIHJlc3BvbnNlIGxlbiAqLworCQkgICAgICAgbGFzdCwgCS8qIGVvdCAqLworCQkgICAgICAgbGFzdCwgCS8qIHdyaXRlcyBjb21wbGV0ZSAqLworCQkgICAgICAgaSo0LAkvKiB1cmIgZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSAgICAgICBCUldfVVJCX1NXSVpaTEVfVFJBTlNQT1NFKTsKKyAgICAgIH0KKyAgIH0KK30KKworLyogUG9pbnRzIHNldHVwIC0gc2V2ZXJhbCBzaW1wbGlmaWNhdGlvbnMgYXMgYWxsIGF0dHJpYnV0ZXMgYXJlCisgKiBjb25zdGFudCBhY3Jvc3MgdGhlIGZhY2Ugb2YgdGhlIHBvaW50IChwb2ludCBzcHJpdGVzIGV4Y2x1ZGVkISkKKyAqLwordm9pZCBicndfZW1pdF9wb2ludF9zZXR1cCggc3RydWN0IGJyd19zZl9jb21waWxlICpjLCBHTGJvb2xlYW4gYWxsb2NhdGUpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgIEdMdWludCBpOworCisgICBjLT5ucl92ZXJ0cyA9IDE7CisgICAKKyAgIGlmIChhbGxvY2F0ZSkKKyAgICAgIGFsbG9jX3JlZ3MoYyk7CisKICAgIGNvcHlfel9pbnZfdyhjKTsKIAogICAgYnJ3X01PVihwLCBjLT5tMUN4LCBicndfaW1tX3VkKDApKTsgLyogemVybyAtIG1vdmUgb3V0IG9mIGxvb3AgKi8KQEAgLTU2MSwxMCArNjgzLDE0IEBACiAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKICAgIHN0cnVjdCBicndfcmVnIGlwID0gYnJ3X2lwX3JlZygpOwogICAgc3RydWN0IGJyd19yZWcgcGF5bG9hZF9wcmltID0gYnJ3X3V3MV9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgMSwgMCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBwYXlsb2FkX2F0dHIgPSBnZXRfZWxlbWVudF91ZChicndfdmVjMV9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgMSwgMCksIDApOyAKICAgIHN0cnVjdCBicndfcmVnIHByaW1tYXNrOwogICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqam1wOwogICAgc3RydWN0IGJyd19yZWcgdjFfbnVsbF91ZCA9IHZlYzEocmV0eXBlKGJyd19udWxsX3JlZygpLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgCisgICBHTHVpbnQgc2F2ZWZsYWc7CiAKKyAgIGMtPm5yX3ZlcnRzID0gMzsKICAgIGFsbG9jX3JlZ3MoYyk7CiAKICAgIHByaW1tYXNrID0gcmV0eXBlKGdldF9lbGVtZW50KGMtPnRtcCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKQEAgLTU4Miw4ICs3MDgsMTUgQEAKIAkJCQkJICAgICAgICgxPDxfM0RQUklNX1RSSUZBTl9OT1NUSVBQTEUpKSk7CiAgICBqbXAgPSBicndfSk1QSShwLCBpcCwgaXAsIGJyd19pbW1fdygwKSk7CiAgICB7Ci0gICAgICBicndfZW1pdF90cmlfc2V0dXAoIGMgKTsKLSAgICAgIC8qIG5vdGUgLSB0aHJlYWQga2lsbGVkIGluIHN1YnJvdXRpbmUgKi8KKyAgICAgIHNhdmVmbGFnID0gcC0+ZmxhZ192YWx1ZTsKKyAgICAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7IAorICAgICAgYnJ3X2VtaXRfdHJpX3NldHVwKCBjLCBHTF9GQUxTRSApOworICAgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworICAgICAgcC0+ZmxhZ192YWx1ZSA9IHNhdmVmbGFnOworICAgICAgLyogbm90ZSAtIHRocmVhZCBraWxsZWQgaW4gc3Vicm91dGluZSwgc28gbXVzdAorICAgICAgICogcmVzdG9yZSB0aGUgZmxhZyB3aGljaCBpcyBjaGFuZ2VkIHdoZW4gYnVpbGRpbmcKKyAgICAgICAqIHRoZSBzdWJyb3V0aW5lLiBmaXggIzEzMjQwCisgICAgICAgKi8KICAgIH0KICAgIGJyd19sYW5kX2Z3ZF9qdW1wKHAsIGptcCk7CiAKQEAgLTU5NiwxMiArNzI5LDI4IEBACiAJCQkJCSAgICAgICAoMTw8XzNEUFJJTV9MSU5FU1RSSVBfQ09OVF9CRikpKTsKICAgIGptcCA9IGJyd19KTVBJKHAsIGlwLCBpcCwgYnJ3X2ltbV93KDApKTsKICAgIHsKLSAgICAgIGJyd19lbWl0X2xpbmVfc2V0dXAoIGMgKTsKKyAgICAgIHNhdmVmbGFnID0gcC0+ZmxhZ192YWx1ZTsKKyAgICAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7IAorICAgICAgYnJ3X2VtaXRfbGluZV9zZXR1cCggYywgR0xfRkFMU0UgKTsKKyAgICAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKyAgICAgIHAtPmZsYWdfdmFsdWUgPSBzYXZlZmxhZzsKICAgICAgIC8qIG5vdGUgLSB0aHJlYWQga2lsbGVkIGluIHN1YnJvdXRpbmUgKi8KICAgIH0KICAgIGJyd19sYW5kX2Z3ZF9qdW1wKHAsIGptcCk7IAogCi0gICBicndfZW1pdF9wb2ludF9zZXR1cCggYyApOworICAgYnJ3X3NldF9jb25kaXRpb25hbG1vZChwLCBCUldfQ09ORElUSU9OQUxfWik7CisgICBicndfQU5EKHAsIHYxX251bGxfdWQsIHBheWxvYWRfYXR0ciwgYnJ3X2ltbV91ZCgxPDxCUldfU1BSSVRFX1BPSU5UX0VOQUJMRSkpOworICAgam1wID0gYnJ3X0pNUEkocCwgaXAsIGlwLCBicndfaW1tX3coMCkpOworICAgeworICAgICAgc2F2ZWZsYWcgPSBwLT5mbGFnX3ZhbHVlOworICAgICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsgCisgICAgICBicndfZW1pdF9wb2ludF9zcHJpdGVfc2V0dXAoIGMsIEdMX0ZBTFNFICk7CisgICAgICBicndfcG9wX2luc25fc3RhdGUocCk7CisgICAgICBwLT5mbGFnX3ZhbHVlID0gc2F2ZWZsYWc7CisgICB9CisgICBicndfbGFuZF9md2RfanVtcChwLCBqbXApOyAKKworICAgYnJ3X2VtaXRfcG9pbnRfc2V0dXAoIGMsIEdMX0ZBTFNFICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2Zfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3NmX3N0YXRlLmMKaW5kZXggOWE2ZTVmNS4uMjQ3ODg3MiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc2Zfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zZl9zdGF0ZS5jCkBAIC0zNSw2OSArMzUsNjkgQEAKICNpbmNsdWRlICJicndfc3RhdGUuaCIKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgImludGVsX2Ziby5oIgogCiBzdGF0aWMgdm9pZCB1cGxvYWRfc2ZfdnAoc3RydWN0IGJyd19jb250ZXh0ICpicncpCiB7CisgICBHTGNvbnRleHQgKmN0eCA9ICZicnctPmludGVsLmN0eDsKKyAgIGNvbnN0IEdMZmxvYXQgZGVwdGhfc2NhbGUgPSAxLjBGIC8gY3R4LT5EcmF3QnVmZmVyLT5fRGVwdGhNYXhGOwogICAgc3RydWN0IGJyd19zZl92aWV3cG9ydCBzZnY7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIgPQorICAgICAgaW50ZWxfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0pOworICAgR0xmbG9hdCB5X3NjYWxlLCB5X2JpYXM7CiAKICAgIG1lbXNldCgmc2Z2LCAwLCBzaXplb2Yoc2Z2KSk7Ci0gICAKLSAgIGlmIChicnctPmludGVsLmRyaURyYXdhYmxlKSAKLSAgIHsKLSAgICAgIC8qIF9ORVdfVklFV1BPUlQsIEJSV19ORVdfTUVUQU9QUyAqLwogCi0gICAgICBpZiAoIWJydy0+bWV0YW9wcy5hY3RpdmUpIHsKLQkgY29uc3QgR0xmbG9hdCAqdiA9IGJydy0+aW50ZWwuY3R4LlZpZXdwb3J0Ll9XaW5kb3dNYXAubTsKLQkgCi0JIHNmdi52aWV3cG9ydC5tMDAgPSAgIHZbTUFUX1NYXTsKLQkgc2Z2LnZpZXdwb3J0Lm0xMSA9IC0gdltNQVRfU1ldOwotCSBzZnYudmlld3BvcnQubTIyID0gICB2W01BVF9TWl0gKiBicnctPmludGVsLmRlcHRoX3NjYWxlOwotCSBzZnYudmlld3BvcnQubTMwID0gICB2W01BVF9UWF07Ci0JIHNmdi52aWV3cG9ydC5tMzEgPSAtIHZbTUFUX1RZXSArIGJydy0+aW50ZWwuZHJpRHJhd2FibGUtPmg7Ci0JIHNmdi52aWV3cG9ydC5tMzIgPSAgIHZbTUFUX1RaXSAqIGJydy0+aW50ZWwuZGVwdGhfc2NhbGU7CisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5OYW1lKSB7CisgICAgICAvKiBVc2VyLWNyZWF0ZWQgRkJPICovCisgICAgICBpZiAoaXJiICYmICFpcmItPlJlbmRlclRvVGV4dHVyZSkgeworCSB5X3NjYWxlID0gLTEuMDsKKwkgeV9iaWFzID0gY3R4LT5EcmF3QnVmZmVyLT5IZWlnaHQ7CisgICAgICB9IGVsc2UgeworCSB5X3NjYWxlID0gMS4wOworCSB5X2JpYXMgPSAwOwogICAgICAgfQotICAgICAgZWxzZSB7Ci0JIHNmdi52aWV3cG9ydC5tMDAgPSAgIDE7Ci0JIHNmdi52aWV3cG9ydC5tMTEgPSAtIDE7Ci0JIHNmdi52aWV3cG9ydC5tMjIgPSAgIDE7Ci0JIHNmdi52aWV3cG9ydC5tMzAgPSAgIDA7Ci0JIHNmdi52aWV3cG9ydC5tMzEgPSAgIGJydy0+aW50ZWwuZHJpRHJhd2FibGUtPmg7Ci0JIHNmdi52aWV3cG9ydC5tMzIgPSAgIDA7Ci0gICAgICB9CisgICB9IGVsc2UgeworICAgICAgeV9zY2FsZSA9IC0xLjA7CisgICAgICB5X2JpYXMgPSBjdHgtPkRyYXdCdWZmZXItPkhlaWdodDsKICAgIH0KIAotICAgLyogWFhYOiB3aGF0IHN0YXRlIGZvciB0aGlzPyAqLwotICAgaWYgKGJydy0+aW50ZWwuZHJpRHJhd2FibGUpCi0gICB7Ci0gICAgICBpbnRlbFNjcmVlblByaXZhdGUgKnNjcmVlbiA9IGJydy0+aW50ZWwuaW50ZWxTY3JlZW47Ci0gICAgICAvKiBfTkVXX1NDSVNTT1IgKi8KLSAgICAgIEdMaW50IHggPSBicnctPmF0dHJpYnMuU2Npc3Nvci0+WDsKLSAgICAgIEdMaW50IHkgPSBicnctPmF0dHJpYnMuU2Npc3Nvci0+WTsKLSAgICAgIEdMdWludCB3ID0gYnJ3LT5hdHRyaWJzLlNjaXNzb3ItPldpZHRoOwotICAgICAgR0x1aW50IGggPSBicnctPmF0dHJpYnMuU2Npc3Nvci0+SGVpZ2h0OworICAgLyogX05FV19WSUVXUE9SVCwgQlJXX05FV19NRVRBT1BTICovCiAKLSAgICAgIEdMaW50IHgxID0geDsKLSAgICAgIEdMaW50IHkxID0gYnJ3LT5pbnRlbC5kcmlEcmF3YWJsZS0+aCAtICh5ICsgaCk7Ci0gICAgICBHTGludCB4MiA9IHggKyB3IC0gMTsKLSAgICAgIEdMaW50IHkyID0geTEgKyBoIC0gMTsKKyAgIGlmICghYnJ3LT5tZXRhb3BzLmFjdGl2ZSkgeworICAgICAgY29uc3QgR0xmbG9hdCAqdiA9IGN0eC0+Vmlld3BvcnQuX1dpbmRvd01hcC5tOwogCi0gICAgICBpZiAoeDEgPCAwKSB4MSA9IDA7Ci0gICAgICBpZiAoeTEgPCAwKSB5MSA9IDA7Ci0gICAgICBpZiAoeDIgPCAwKSB4MiA9IDA7Ci0gICAgICBpZiAoeTIgPCAwKSB5MiA9IDA7Ci0KLSAgICAgIGlmICh4MiA+PSBzY3JlZW4tPndpZHRoKSB4MiA9IHNjcmVlbi0+d2lkdGgtMTsKLSAgICAgIGlmICh5MiA+PSBzY3JlZW4tPmhlaWdodCkgeTIgPSBzY3JlZW4tPmhlaWdodC0xOwotICAgICAgaWYgKHgxID49IHNjcmVlbi0+d2lkdGgpIHgxID0gc2NyZWVuLT53aWR0aC0xOwotICAgICAgaWYgKHkxID49IHNjcmVlbi0+aGVpZ2h0KSB5MSA9IHNjcmVlbi0+aGVpZ2h0LTE7Ci0gICAgICAKLSAgICAgIHNmdi5zY2lzc29yLnhtaW4gPSB4MTsKLSAgICAgIHNmdi5zY2lzc29yLnhtYXggPSB4MjsKLSAgICAgIHNmdi5zY2lzc29yLnltaW4gPSB5MTsKLSAgICAgIHNmdi5zY2lzc29yLnltYXggPSB5MjsKKyAgICAgIHNmdi52aWV3cG9ydC5tMDAgPSB2W01BVF9TWF07CisgICAgICBzZnYudmlld3BvcnQubTExID0gdltNQVRfU1ldICogeV9zY2FsZTsKKyAgICAgIHNmdi52aWV3cG9ydC5tMjIgPSB2W01BVF9TWl0gKiBkZXB0aF9zY2FsZTsKKyAgICAgIHNmdi52aWV3cG9ydC5tMzAgPSB2W01BVF9UWF07CisgICAgICBzZnYudmlld3BvcnQubTMxID0gdltNQVRfVFldICogeV9zY2FsZSArIHlfYmlhczsKKyAgICAgIHNmdi52aWV3cG9ydC5tMzIgPSB2W01BVF9UWl0gKiBkZXB0aF9zY2FsZTsKKyAgIH0gZWxzZSB7CisgICAgICBzZnYudmlld3BvcnQubTAwID0gICAxOworICAgICAgc2Z2LnZpZXdwb3J0Lm0xMSA9IC0gMTsKKyAgICAgIHNmdi52aWV3cG9ydC5tMjIgPSAgIDE7CisgICAgICBzZnYudmlld3BvcnQubTMwID0gICAwOworICAgICAgc2Z2LnZpZXdwb3J0Lm0zMSA9ICAgY3R4LT5EcmF3QnVmZmVyLT5IZWlnaHQ7CisgICAgICBzZnYudmlld3BvcnQubTMyID0gICAwOwogICAgfQogCi0gICBicnctPnNmLnZwX2dzX29mZnNldCA9IGJyd19jYWNoZV9kYXRhKCAmYnJ3LT5jYWNoZVtCUldfU0ZfVlBdLCAmc2Z2ICk7CisgICAvKiBfTkVXX1NDSVNTT1IgKi8KKworICAgLyogVGhlIHNjaXNzb3Igb25seSBuZWVkcyB0byBoYW5kbGUgdGhlIGludGVyc2VjdGlvbiBvZiBkcmF3YWJsZSBhbmQKKyAgICAqIHNjaXNzb3IgcmVjdC4gIENsaXBwaW5nIHRvIHRoZSBib3VuZGFyaWVzIG9mIHN0YXRpYyBzaGFyZWQgYnVmZmVycworICAgICogZm9yIGZyb250L2JhY2svZGVwdGggaXMgY292ZXJlZCBieSBsb29waW5nIG92ZXIgY2xpcHJlY3RzIGluIGJyd19kcmF3LmMuCisgICAgKgorICAgICogTm90ZSB0aGF0IHRoZSBoYXJkd2FyZSdzIGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUsIHdoaWxlIE1lc2EncyBtaW4gaXMKKyAgICAqIGluY2x1c2l2ZSBidXQgbWF4IGlzIGV4Y2x1c2l2ZS4KKyAgICAqLworICAgc2Z2LnNjaXNzb3IueG1pbiA9IGN0eC0+RHJhd0J1ZmZlci0+X1htaW47CisgICBzZnYuc2Npc3Nvci54bWF4ID0gY3R4LT5EcmF3QnVmZmVyLT5fWG1heCAtIDE7CisgICBzZnYuc2Npc3Nvci55bWluID0gY3R4LT5EcmF3QnVmZmVyLT5IZWlnaHQgLSBjdHgtPkRyYXdCdWZmZXItPl9ZbWF4OworICAgc2Z2LnNjaXNzb3IueW1heCA9IGN0eC0+RHJhd0J1ZmZlci0+SGVpZ2h0IC0gY3R4LT5EcmF3QnVmZmVyLT5fWW1pbiAtIDE7CisKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPnNmLnZwX2JvKTsKKyAgIGJydy0+c2YudnBfYm8gPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGUsIEJSV19TRl9WUCwgJnNmdiwgTlVMTCwgMCApOwogfQogCiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3NmX3ZwID0gewpAQCAtMTA3LDg3ICsxMDcsMTMxIEBACiAgICAgICAuYnJ3ICAgPSBCUldfTkVXX01FVEFPUFMsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9zZl92cAorICAgLnByZXBhcmUgPSB1cGxvYWRfc2ZfdnAKIH07CiAKK3N0cnVjdCBicndfc2ZfdW5pdF9rZXkgeworICAgdW5zaWduZWQgaW50IHRvdGFsX2dyZjsKKyAgIHVuc2lnbmVkIGludCB1cmJfZW50cnlfcmVhZF9sZW5ndGg7CiAKKyAgIHVuc2lnbmVkIGludCBucl91cmJfZW50cmllcywgdXJiX3NpemUsIHNmc2l6ZTsKIAotc3RhdGljIHZvaWQgdXBsb2FkX3NmX3VuaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKKyAgIEdMZW51bSBmcm9udF9mYWNlLCBjdWxsX2ZhY2U7CisgICBHTGJvb2xlYW4gc2Npc3NvciwgbGluZV9zbW9vdGgsIHBvaW50X3Nwcml0ZSwgcG9pbnRfYXR0ZW51YXRlZDsKKyAgIGZsb2F0IGxpbmVfd2lkdGg7CisgICBmbG9hdCBwb2ludF9zaXplOworfTsKKworc3RhdGljIHZvaWQKK3NmX3VuaXRfcG9wdWxhdGVfa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X3NmX3VuaXRfa2V5ICprZXkpCiB7Ci0gICBzdHJ1Y3QgYnJ3X3NmX3VuaXRfc3RhdGUgc2Y7Ci0gICBtZW1zZXQoJnNmLCAwLCBzaXplb2Yoc2YpKTsKKyAgIG1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CiAKICAgIC8qIENBQ0hFX05FV19TRl9QUk9HICovCi0gICBzZi50aHJlYWQwLmdyZl9yZWdfY291bnQgPSAoKGJydy0+c2YucHJvZ19kYXRhLT50b3RhbF9ncmYtMSkgJiB+MTUpIC8gMTY7Ci0gICBzZi50aHJlYWQwLmtlcm5lbF9zdGFydF9wb2ludGVyID0gYnJ3LT5zZi5wcm9nX2dzX29mZnNldCA+PiA2OwotICAgc2YudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPnNmLnByb2dfZGF0YS0+dXJiX3JlYWRfbGVuZ3RoOwotCi0gICBzZi50aHJlYWQxLmZsb2F0aW5nX3BvaW50X21vZGUgPSBCUldfRkxPQVRJTkdfUE9JTlRfTk9OX0lFRUVfNzU0OwotICAgc2YudGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMzsKLSAgIHNmLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMTsKKyAgIGtleS0+dG90YWxfZ3JmID0gYnJ3LT5zZi5wcm9nX2RhdGEtPnRvdGFsX2dyZjsKKyAgIGtleS0+dXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gYnJ3LT5zZi5wcm9nX2RhdGEtPnVyYl9yZWFkX2xlbmd0aDsKIAogICAgLyogQlJXX05FV19VUkJfRkVOQ0UgKi8KLSAgIHNmLnRocmVhZDQubnJfdXJiX2VudHJpZXMgPSBicnctPnVyYi5ucl9zZl9lbnRyaWVzOwotICAgc2YudGhyZWFkNC51cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplID0gYnJ3LT51cmIuc2ZzaXplIC0gMTsKLSAgIHNmLnRocmVhZDQubWF4X3RocmVhZHMgPSBNSU4yKDEyLCBicnctPnVyYi5ucl9zZl9lbnRyaWVzIC8gMikgLSAxOworICAga2V5LT5ucl91cmJfZW50cmllcyA9IGJydy0+dXJiLm5yX3NmX2VudHJpZXM7CisgICBrZXktPnVyYl9zaXplID0gYnJ3LT51cmIudnNpemU7CisgICBrZXktPnNmc2l6ZSA9IGJydy0+dXJiLnNmc2l6ZTsKKworICAga2V5LT5zY2lzc29yID0gYnJ3LT5hdHRyaWJzLlNjaXNzb3ItPkVuYWJsZWQ7CisgICBrZXktPmZyb250X2ZhY2UgPSBicnctPmF0dHJpYnMuUG9seWdvbi0+RnJvbnRGYWNlOworCisgICBpZiAoYnJ3LT5hdHRyaWJzLlBvbHlnb24tPkN1bGxGbGFnKQorICAgICAga2V5LT5jdWxsX2ZhY2UgPSBicnctPmF0dHJpYnMuUG9seWdvbi0+Q3VsbEZhY2VNb2RlOworICAgZWxzZQorICAgICAga2V5LT5jdWxsX2ZhY2UgPSBHTF9OT05FOworCisgICBrZXktPmxpbmVfd2lkdGggPSBicnctPmF0dHJpYnMuTGluZS0+V2lkdGg7CisgICBrZXktPmxpbmVfc21vb3RoID0gYnJ3LT5hdHRyaWJzLkxpbmUtPlNtb290aEZsYWc7CisKKyAgIGtleS0+cG9pbnRfc3ByaXRlID0gYnJ3LT5hdHRyaWJzLlBvaW50LT5Qb2ludFNwcml0ZTsKKyAgIGtleS0+cG9pbnRfc2l6ZSA9IGJydy0+YXR0cmlicy5Qb2ludC0+U2l6ZTsKKyAgIGtleS0+cG9pbnRfYXR0ZW51YXRlZCA9IGJydy0+YXR0cmlicy5Qb2ludC0+X0F0dGVudWF0ZWQ7Cit9CisKK3N0YXRpYyBkcmlfYm8gKgorc2ZfdW5pdF9jcmVhdGVfZnJvbV9rZXkoc3RydWN0IGJyd19jb250ZXh0ICpicncsIHN0cnVjdCBicndfc2ZfdW5pdF9rZXkgKmtleSwKKwkJCWRyaV9ibyAqKnJlbG9jX2J1ZnMpCit7CisgICBzdHJ1Y3QgYnJ3X3NmX3VuaXRfc3RhdGUgc2Y7CisgICBkcmlfYm8gKmJvOworCisgICBtZW1zZXQoJnNmLCAwLCBzaXplb2Yoc2YpKTsKKworICAgc2YudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gQUxJR04oa2V5LT50b3RhbF9ncmYsIDE2KSAvIDE2IC0gMTsKKyAgIHNmLnRocmVhZDAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSBicnctPnNmLnByb2dfYm8tPm9mZnNldCA+PiA2OyAvKiByZWxvYyAqLworCisgICBzZi50aHJlYWQxLmZsb2F0aW5nX3BvaW50X21vZGUgPSBCUldfRkxPQVRJTkdfUE9JTlRfTk9OX0lFRUVfNzU0OworCisgICBzZi50aHJlYWQzLmRpc3BhdGNoX2dyZl9zdGFydF9yZWcgPSAzOworICAgc2YudGhyZWFkMy51cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAxOworICAgc2YudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKworICAgc2YudGhyZWFkNC5ucl91cmJfZW50cmllcyA9IGtleS0+bnJfdXJiX2VudHJpZXM7CisgICBzZi50aHJlYWQ0LnVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemUgPSBrZXktPnNmc2l6ZSAtIDE7CisgICBzZi50aHJlYWQ0Lm1heF90aHJlYWRzID0gTUlOMigxMiwga2V5LT5ucl91cmJfZW50cmllcyAvIDIpIC0gMTsKIAogICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU0lOR0xFX1RIUkVBRCkKLSAgICAgIHNmLnRocmVhZDQubWF4X3RocmVhZHMgPSAwOyAKKyAgICAgIHNmLnRocmVhZDQubWF4X3RocmVhZHMgPSAwOwogCiAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKLSAgICAgIHNmLnRocmVhZDQuc3RhdHNfZW5hYmxlID0gMTsgCisgICAgICBzZi50aHJlYWQ0LnN0YXRzX2VuYWJsZSA9IDE7CiAKICAgIC8qIENBQ0hFX05FV19TRl9WUCAqLwotICAgc2Yuc2Y1LnNmX3ZpZXdwb3J0X3N0YXRlX29mZnNldCA9IGJydy0+c2YudnBfZ3Nfb2Zmc2V0ID4+IDU7Ci0gICAKKyAgIHNmLnNmNS5zZl92aWV3cG9ydF9zdGF0ZV9vZmZzZXQgPSBicnctPnNmLnZwX2JvLT5vZmZzZXQgPj4gNTsgLyogcmVsb2MgKi8KKwogICAgc2Yuc2Y1LnZpZXdwb3J0X3RyYW5zZm9ybSA9IDE7Ci0gICAKKwogICAgLyogX05FV19TQ0lTU09SICovCi0gICBpZiAoYnJ3LT5hdHRyaWJzLlNjaXNzb3ItPkVuYWJsZWQpIAotICAgICAgc2Yuc2Y2LnNjaXNzb3IgPSAxOyAgCisgICBpZiAoa2V5LT5zY2lzc29yKQorICAgICAgc2Yuc2Y2LnNjaXNzb3IgPSAxOwogCiAgICAvKiBfTkVXX1BPTFlHT04gKi8KLSAgIGlmIChicnctPmF0dHJpYnMuUG9seWdvbi0+RnJvbnRGYWNlID09IEdMX0NDVykKKyAgIGlmIChrZXktPmZyb250X2ZhY2UgPT0gR0xfQ0NXKQogICAgICAgc2Yuc2Y1LmZyb250X3dpbmRpbmcgPSBCUldfRlJPTlRXSU5ESU5HX0NDVzsKICAgIGVsc2UKICAgICAgIHNmLnNmNS5mcm9udF93aW5kaW5nID0gQlJXX0ZST05UV0lORElOR19DVzsKIAotICAgaWYgKGJydy0+YXR0cmlicy5Qb2x5Z29uLT5DdWxsRmxhZykgewotICAgICAgc3dpdGNoIChicnctPmF0dHJpYnMuUG9seWdvbi0+Q3VsbEZhY2VNb2RlKSB7Ci0gICAgICBjYXNlIEdMX0ZST05UOgotCSBzZi5zZjYuY3VsbF9tb2RlID0gQlJXX0NVTExNT0RFX0ZST05UOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfQkFDSzoKLQkgc2Yuc2Y2LmN1bGxfbW9kZSA9IEJSV19DVUxMTU9ERV9CQUNLOwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6Ci0JIHNmLnNmNi5jdWxsX21vZGUgPSBCUldfQ1VMTE1PREVfQk9USDsKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBhc3NlcnQoMCk7Ci0JIGJyZWFrOwotICAgICAgfQotICAgfQotICAgZWxzZQorICAgc3dpdGNoIChrZXktPmN1bGxfZmFjZSkgeworICAgY2FzZSBHTF9GUk9OVDoKKyAgICAgIHNmLnNmNi5jdWxsX21vZGUgPSBCUldfQ1VMTE1PREVfRlJPTlQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfQkFDSzoKKyAgICAgIHNmLnNmNi5jdWxsX21vZGUgPSBCUldfQ1VMTE1PREVfQkFDSzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9GUk9OVF9BTkRfQkFDSzoKKyAgICAgIHNmLnNmNi5jdWxsX21vZGUgPSBCUldfQ1VMTE1PREVfQk9USDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9OT05FOgogICAgICAgc2Yuc2Y2LmN1bGxfbW9kZSA9IEJSV19DVUxMTU9ERV9OT05FOwotICAgICAgCisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCk7CisgICAgICBicmVhazsKKyAgIH0KIAogICAgLyogX05FV19MSU5FICovCiAgICAvKiBYWFggdXNlIGN0eC0+Q29uc3QuTWluL01heExpbmVXaWR0aCBoZXJlICovCi0gICBzZi5zZjYubGluZV93aWR0aCA9IENMQU1QKGJydy0+YXR0cmlicy5MaW5lLT5XaWR0aCwgMS4wLCA1LjApICogKDE8PDEpOworICAgc2Yuc2Y2LmxpbmVfd2lkdGggPSBDTEFNUChrZXktPmxpbmVfd2lkdGgsIDEuMCwgNS4wKSAqICgxPDwxKTsKIAogICAgc2Yuc2Y2LmxpbmVfZW5kY2FwX2FhX3JlZ2lvbl93aWR0aCA9IDE7Ci0gICBpZiAoYnJ3LT5hdHRyaWJzLkxpbmUtPlNtb290aEZsYWcpCisgICBpZiAoa2V5LT5saW5lX3Ntb290aCkKICAgICAgIHNmLnNmNi5hYV9lbmFibGUgPSAxOwotICAgZWxzZSBpZiAoc2Yuc2Y2LmxpbmVfd2lkdGggPD0gMHgyKSAKLSAgICAgICBzZi5zZjYubGluZV93aWR0aCA9IDA7IAorICAgZWxzZSBpZiAoc2Yuc2Y2LmxpbmVfd2lkdGggPD0gMHgyKQorICAgICAgIHNmLnNmNi5saW5lX3dpZHRoID0gMDsKIAogICAgLyogX05FV19QT0lOVCAqLwotICAgc2Yuc2Y2LnBvaW50X3Jhc3RfcnVsZSA9IDE7CS8qIG9wZW5nbCBjb252ZW50aW9ucyAqLworICAgc2Yuc2Y2LnBvaW50X3Jhc3RfcnVsZSA9IEJSV19SQVNUUlVMRV9VUFBFUl9SSUdIVDsJLyogb3BlbmdsIGNvbnZlbnRpb25zICovCiAgICAvKiBYWFggY2xhbXAgbWF4IGRlcGVuZHMgb24gQUEgdnMuIG5vbi1BQSAqLwotICAgc2Yuc2Y3LnBvaW50X3NpemUgPSBDTEFNUChicnctPmF0dHJpYnMuUG9pbnQtPlNpemUsIDEuMCwgMy4wKSAqICgxPDwzKTsKLSAgIHNmLnNmNy51c2VfcG9pbnRfc2l6ZV9zdGF0ZSA9ICFicnctPmF0dHJpYnMuUG9pbnQtPl9BdHRlbnVhdGVkOwotICAgICAgCisKKyAgIHNmLnNmNy5zcHJpdGVfcG9pbnQgPSBrZXktPnBvaW50X3Nwcml0ZTsKKyAgIHNmLnNmNy5wb2ludF9zaXplID0gQ0xBTVAobmVhcmJ5aW50KGtleS0+cG9pbnRfc2l6ZSksIDEsIDI1NSkgKiAoMTw8Myk7CisgICBzZi5zZjcudXNlX3BvaW50X3NpemVfc3RhdGUgPSAha2V5LT5wb2ludF9hdHRlbnVhdGVkOworICAgc2Yuc2Y3LmFhX2xpbmVfZGlzdGFuY2VfbW9kZSA9IDA7CisKICAgIC8qIG1pZ2h0IGJlIEJSV19ORVdfUFJJTUlUSVZFIGlmIHdlIGhhdmUgdG8gYWRqdXN0IHB2IGZvciBwb2x5Z29uczoKICAgICAqLwogICAgc2Yuc2Y3LnRyaWZhbl9wdiA9IDI7CkBAIC0yMDAsOSArMjQ0LDQ4IEBACiAgICBzZi5zZjYuZGVzdF9vcmdfdmJpYXMgPSAweDg7CiAgICBzZi5zZjYuZGVzdF9vcmdfaGJpYXMgPSAweDg7CiAKLSAgIGJydy0+c2Yuc3RhdGVfZ3Nfb2Zmc2V0ID0gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlW0JSV19TRl9VTklUXSwgJnNmICk7CisgICBibyA9IGJyd191cGxvYWRfY2FjaGUoJmJydy0+Y2FjaGUsIEJSV19TRl9VTklULAorCQkJIGtleSwgc2l6ZW9mKCprZXkpLAorCQkJIHJlbG9jX2J1ZnMsIDIsCisJCQkgJnNmLCBzaXplb2Yoc2YpLAorCQkJIE5VTEwsIE5VTEwpOworCisgICAvKiBFbWl0IFNGIHByb2dyYW0gcmVsb2NhdGlvbiAqLworICAgaW50ZWxfYm9fZW1pdF9yZWxvYyhibywKKwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKKwkJICAgICAgIHNmLnRocmVhZDAuZ3JmX3JlZ19jb3VudCA8PCAxLAorCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGJyd19zZl91bml0X3N0YXRlLCB0aHJlYWQwKSwKKwkJICAgICAgIGJydy0+c2YucHJvZ19ibyk7CisKKyAgIC8qIEVtaXQgU0Ygdmlld3BvcnQgcmVsb2NhdGlvbiAqLworICAgaW50ZWxfYm9fZW1pdF9yZWxvYyhibywKKwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKKwkJICAgICAgIHNmLnNmNS5mcm9udF93aW5kaW5nIHwgKHNmLnNmNS52aWV3cG9ydF90cmFuc2Zvcm0gPDwgMSksCisJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnJ3X3NmX3VuaXRfc3RhdGUsIHNmNSksCisJCSAgICAgICBicnctPnNmLnZwX2JvKTsKKworICAgcmV0dXJuIGJvOwogfQogCitzdGF0aWMgdm9pZCB1cGxvYWRfc2ZfdW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQoreworICAgc3RydWN0IGJyd19zZl91bml0X2tleSBrZXk7CisgICBkcmlfYm8gKnJlbG9jX2J1ZnNbMl07CisKKyAgIHNmX3VuaXRfcG9wdWxhdGVfa2V5KGJydywgJmtleSk7CisKKyAgIHJlbG9jX2J1ZnNbMF0gPSBicnctPnNmLnByb2dfYm87CisgICByZWxvY19idWZzWzFdID0gYnJ3LT5zZi52cF9ibzsKKworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+c2Yuc3RhdGVfYm8pOworICAgYnJ3LT5zZi5zdGF0ZV9ibyA9IGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGUsIEJSV19TRl9VTklULAorCQkJCSAgICAgICAma2V5LCBzaXplb2Yoa2V5KSwKKwkJCQkgICAgICAgcmVsb2NfYnVmcywgMiwKKwkJCQkgICAgICAgTlVMTCk7CisgICBpZiAoYnJ3LT5zZi5zdGF0ZV9ibyA9PSBOVUxMKSB7CisgICAgICBicnctPnNmLnN0YXRlX2JvID0gc2ZfdW5pdF9jcmVhdGVfZnJvbV9rZXkoYnJ3LCAma2V5LCByZWxvY19idWZzKTsKKyAgIH0KK30KIAogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19zZl91bml0ID0gewogICAgLmRpcnR5ID0gewpAQCAtMjE1LDcgKzI5OCw1IEBACiAgICAgICAuY2FjaGUgPSAoQ0FDSEVfTkVXX1NGX1ZQIHwKIAkJQ0FDSEVfTkVXX1NGX1BST0cpCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF9zZl91bml0CisgICAucHJlcGFyZSA9IHVwbG9hZF9zZl91bml0LAogfTsKLQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZS5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RhdGUuaAppbmRleCBiNGNiZGQ3Li4zZWE2MTUxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZS5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlLmgKQEAgLTQ4LDggKzQ4LDggQEAKIGNvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfaW52YXJpZW50X3N0YXRlOwogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19nc19wcm9nOwogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19nc191bml0OwotY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19kcmF3aW5nX3JlY3Q7CiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2xpbmVfc3RpcHBsZTsKK2NvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfYWFfbGluZV9wYXJhbWV0ZXJzOwogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd19waXBlbGluZWRfc3RhdGVfcG9pbnRlcnM7CiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2JpbmRpbmdfdGFibGVfcG9pbnRlcnM7CiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2RlcHRoYnVmZmVyOwpAQCAtODAsNjcgKzgwLDU4IEBACiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2NsZWFyX3N1cmZhY2VfY2FjaGU7CiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2NsZWFyX2JhdGNoX2NhY2hlOwogCitjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X2luZGljZXM7Citjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3ZlcnRpY2VzOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGJyd19zdGF0ZV9jYWNoZS5jCiAgKi8KLUdMdWludCBicndfY2FjaGVfZGF0YShzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSApOworZHJpX2JvICpicndfY2FjaGVfZGF0YShzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSwKKwkJICAgICAgIGVudW0gYnJ3X2NhY2hlX2lkIGNhY2hlX2lkLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICAgIGRyaV9ibyAqKnJlbG9jX2J1ZnMsCisJCSAgICAgICBHTHVpbnQgbnJfcmVsb2NfYnVmcyk7CiAKLUdMdWludCBicndfY2FjaGVfZGF0YV9zeihzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSwKLQkJCSBjb25zdCB2b2lkICpkYXRhLAotCQkJIEdMdWludCBkYXRhX3N6KTsKK2RyaV9ibyAqYnJ3X2NhY2hlX2RhdGFfc3ooc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsCisJCQkgIGVudW0gYnJ3X2NhY2hlX2lkIGNhY2hlX2lkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLAorCQkJICBHTHVpbnQgZGF0YV9zaXplLAorCQkJICBkcmlfYm8gKipyZWxvY19idWZzLAorCQkJICBHTHVpbnQgbnJfcmVsb2NfYnVmcyk7CiAKLUdMdWludCBicndfdXBsb2FkX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSwKLQkJCSBjb25zdCB2b2lkICprZXksCi0JCQkgR0x1aW50IGtleV9zeiwKLQkJCSBjb25zdCB2b2lkICpkYXRhLAotCQkJIEdMdWludCBkYXRhX3N6LAotCQkJIGNvbnN0IHZvaWQgKmF1eCwKLQkJCSB2b2lkICphdXhfcmV0dXJuICk7CitkcmlfYm8gKmJyd191cGxvYWRfY2FjaGUoIHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAorCQkJICBlbnVtIGJyd19jYWNoZV9pZCBjYWNoZV9pZCwKKwkJCSAgY29uc3Qgdm9pZCAqa2V5LAorCQkJICBHTHVpbnQga2V5X3N6LAorCQkJICBkcmlfYm8gKipyZWxvY19idWZzLAorCQkJICBHTHVpbnQgbnJfcmVsb2NfYnVmcywKKwkJCSAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgR0x1aW50IGRhdGFfc3osCisJCQkgIGNvbnN0IHZvaWQgKmF1eCwKKwkJCSAgdm9pZCAqYXV4X3JldHVybiApOwogCi1HTGJvb2xlYW4gYnJ3X3NlYXJjaF9jYWNoZSggc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsCi0JCQkgICAgY29uc3Qgdm9pZCAqa2V5LAotCQkJICAgIEdMdWludCBrZXlfc2l6ZSwKLQkJCSAgICB2b2lkICphdXhfcmV0dXJuLAotCQkJICAgIEdMdWludCAqb2Zmc2V0X3JldHVybik7CitkcmlfYm8gKmJyd19zZWFyY2hfY2FjaGUoIHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAorCQkJICBlbnVtIGJyd19jYWNoZV9pZCBjYWNoZV9pZCwKKwkJCSAgY29uc3Qgdm9pZCAqa2V5LAorCQkJICBHTHVpbnQga2V5X3NpemUsCisJCQkgIGRyaV9ibyAqKnJlbG9jX2J1ZnMsCisJCQkgIEdMdWludCBucl9yZWxvY19idWZzLAorCQkJICB2b2lkICphdXhfcmV0dXJuKTsKK3ZvaWQgYnJ3X3N0YXRlX2NhY2hlX2NoZWNrX3NpemUoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7CiAKLXZvaWQgYnJ3X2luaXRfY2FjaGVzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwotdm9pZCBicndfZGVzdHJveV9jYWNoZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7Cit2b2lkIGJyd19pbml0X2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwordm9pZCBicndfZGVzdHJveV9jYWNoZSggc3RydWN0IGJyd19jb250ZXh0ICpicncgKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBicndfc3RhdGVfYmF0Y2guYwogICovCi0jZGVmaW5lIEJSV19CQVRDSF9TVFJVQ1QoYnJ3LCBzKSBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKCBicnctPmludGVsLmJhdGNoLCAocyksIHNpemVvZigqKHMpKSwgMCkKKyNkZWZpbmUgQlJXX0JBVENIX1NUUlVDVChicncsIHMpIGludGVsX2JhdGNoYnVmZmVyX2RhdGEoIGJydy0+aW50ZWwuYmF0Y2gsIChzKSwgc2l6ZW9mKCoocykpLCBJR05PUkVfQ0xJUFJFQ1RTKQogI2RlZmluZSBCUldfQ0FDSEVEX0JBVENIX1NUUlVDVChicncsIHMpIGJyd19jYWNoZWRfYmF0Y2hfc3RydWN0KCBicncsIChzKSwgc2l6ZW9mKCoocykpICkKIAogR0xib29sZWFuIGJyd19jYWNoZWRfYmF0Y2hfc3RydWN0KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKIAkJCQkgICBjb25zdCB2b2lkICpkYXRhLAogCQkJCSAgIEdMdWludCBzeiApOwotCiB2b2lkIGJyd19kZXN0cm95X2JhdGNoX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYnJ3X3N0YXRlX3Bvb2wuYwotICovCi12b2lkIGJyd19pbml0X3Bvb2xzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwotdm9pZCBicndfZGVzdHJveV9wb29scyggc3RydWN0IGJyd19jb250ZXh0ICpicncgKTsKLQotR0xib29sZWFuIGJyd19wb29sX2FsbG9jKCBzdHJ1Y3QgYnJ3X21lbV9wb29sICpwb29sLAotCQkJICBHTHVpbnQgc2l6ZSwKLQkJCSAgR0x1aW50IGFsaWdubWVudCwKLQkJCSAgR0x1aW50ICpvZmZzZXRfcmV0dXJuKTsKLQotdm9pZCBicndfcG9vbF9mZW5jZSggc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCSAgICAgc3RydWN0IGJyd19tZW1fcG9vbCAqcG9vbCwKLQkJICAgICBHTHVpbnQgZmVuY2UgKTsKLQotCi12b2lkIGJyd19wb29sX2NoZWNrX3dyYXAoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJICBzdHJ1Y3QgYnJ3X21lbV9wb29sICpwb29sICk7Ci0KLXZvaWQgYnJ3X2NsZWFyX2FsbF9jYWNoZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7Ci12b2lkIGJyd19pbnZhbGlkYXRlX3Bvb2xzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApOwogdm9pZCBicndfY2xlYXJfYmF0Y2hfY2FjaGVfZmx1c2goIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RhdGVfYmF0Y2guYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX2JhdGNoLmMKaW5kZXggOTA5YjBhYy4uNzdlMjczNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RhdGVfYmF0Y2guYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV9iYXRjaC5jCkBAIC0zMiw3ICszMiw2IEBACiAKIAogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgotI2luY2x1ZGUgImJyd19hdWIuaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImltcG9ydHMuaCIKIApAQCAtNDksNyArNDgsNyBAQAogICAgc3RydWN0IGhlYWRlciAqbmV3aGVhZGVyID0gKHN0cnVjdCBoZWFkZXIgKilkYXRhOwogCiAgICBpZiAoYnJ3LT5lbWl0X3N0YXRlX2Fsd2F5cykgewotICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZGF0YShicnctPmludGVsLmJhdGNoLCBkYXRhLCBzeiwgMCk7CisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKGJydy0+aW50ZWwuYmF0Y2gsIGRhdGEsIHN6LCBJR05PUkVfQ0xJUFJFQ1RTKTsKICAgICAgIHJldHVybiBHTF9UUlVFOwogICAgfQogCkBAIC03Niw3ICs3NSw3IEBACiAKICBlbWl0OgogICAgbWVtY3B5KGl0ZW0tPmhlYWRlciwgbmV3aGVhZGVyLCBzeik7Ci0gICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKGJydy0+aW50ZWwuYmF0Y2gsIGRhdGEsIHN6LCAwKTsKKyAgIGludGVsX2JhdGNoYnVmZmVyX2RhdGEoYnJ3LT5pbnRlbC5iYXRjaCwgZGF0YSwgc3osIElHTk9SRV9DTElQUkVDVFMpOwogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKQEAgLTkyLDEzICs5MSw2IEBACiAgICB9CiAKICAgIGJydy0+Y2FjaGVkX2JhdGNoX2l0ZW1zID0gTlVMTDsKLQotCi0gICBicndfY2xlYXJfYWxsX2NhY2hlcyhicncpOwotCi0gICBibVJlbGVhc2VCdWZmZXJzKCZicnctPmludGVsKTsKLSAgIAotICAgYnJ3X2ludmFsaWRhdGVfcG9vbHMoYnJ3KTsKIH0KIAogdm9pZCBicndfY2xlYXJfYmF0Y2hfY2FjaGVfZmx1c2goIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX2NhY2hlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV9jYWNoZS5jCmluZGV4IDcxYzY5MzguLmZjMGMzYmQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX2NhY2hlLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RhdGVfY2FjaGUuYwpAQCAtMjgsMTAgKzI4LDM1IEBACiAgICogQXV0aG9yczoKICAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KICAgKi8KLSAgICAgIAorCisvKiogQGZpbGUgYnJ3X3N0YXRlX2NhY2hlLmMKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSBzdGF0aWMgc3RhdGUgY2FjaGUgZm9yIDk2NS4gIFRoZSBjb25zdW1lcnMKKyAqIGNhbiBxdWVyeSB0aGUgaGFzaCB0YWJsZSBvZiBzdGF0ZSB1c2luZyBhIGNhY2hlX2lkLCBvcGFxdWUga2V5IGRhdGEsCisgKiBhbmQgbGlzdCBvZiBidWZmZXJzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHJlbG9jYXRpb25zLCBhbmQgcmVjZWl2ZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgc3RhdGUgYnVmZmVyIG9iamVjdCBvZiBzdGF0ZSAocGx1cyBhc3NvY2lhdGVkIGF1eGlsaWFyeQorICogZGF0YSkgaW4gcmV0dXJuLgorICoKKyAqIFRoZSBpbm5lciB3b3JraW5ncyBhcmUgYSBzaW1wbGUgaGFzaCB0YWJsZSBiYXNlZCBvbiBhIENSQyBvZiB0aGUga2V5IGRhdGEuCisgKiBUaGUgY2FjaGVfaWQgYW5kIHJlbG9jYXRpb24gdGFyZ2V0IGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZQorICogYnVmZmVyIGFyZSBpbmNsdWRlZCBhcyBhdXhpbGlhcnkga2V5IGRhdGEsIGJ1dCBhcmUgbm90IHBhcnQgb2YgdGhlIGhhc2gKKyAqIHZhbHVlICh0aGlzIHNob3VsZCBiZSBmaXhlZCwgYnV0IHdpbGwgbGlrZWx5IGJlIGZpeGVkIGluc3RlYWQgYnkgbWFraW5nCisgKiBjb25zdW1lcnMgdXNlIHN0cnVjdHVyZWQga2V5cykuCisgKgorICogUmVwbGFjZW1lbnQgaXMgbm90IGltcGxlbWVudGVkLiAgSW5zdGVhZCwgd2hlbiB0aGUgY2FjaGUgZ2V0cyB0b28gYmlnLCBhdAorICogYSBzYWZlIHBvaW50ICh1bmxvY2spIHdlIHRocm93IG91dCBhbGwgb2YgdGhlIGNhY2hlIGRhdGEgYW5kIGxldCBpdAorICogcmVnZW5lcmF0ZSBmb3IgdGhlIG5leHQgcmVuZGVyaW5nIG9wZXJhdGlvbi4KKyAqCisgKiBUaGUgcmVsb2NfYnVmIHBvaW50ZXJzIG5lZWQgdG8gYmUgaW5jbHVkZWQgYXMga2V5IGRhdGEsIG90aGVyd2lzZSB0aGUKKyAqIG5vbi11bmlxdWUgdmFsdWVzIHN0dWZmZWQgaW4gdGhlIG9mZnNldCBpbiBrZXkgZGF0YSB0aHJvdWdoCisgKiBicndfY2FjaGVfZGF0YSgpIG1heSByZXN1bHQgaW4gc3VjY2Vzc2Z1bCBwcm9iZSBmb3Igc3RhdGUgYnVmZmVycworICogZXZlbiB3aGVuIHRoZSBidWZmZXIgYmVpbmcgcmVmZXJlbmNlZCBkb2Vzbid0IG1hdGNoLiAgVGhlIHJlc3VsdCB3b3VsZCBiZQorICogdGhhdCB0aGUgc2FtZSBzdGF0ZSBjYWNoZSBlbnRyeSBpcyB1c2VkIHR3aWNlIGZvciBkaWZmZXJlbnQgYnVmZmVycywKKyAqIG9ubHkgb25lIG9mIHRoZSB0d28gYnVmZmVycyByZWZlcmVuY2VkIGdldHMgcHV0IGludG8gdGhlIG9mZnNldCwgYW5kIHRoZQorICogaW5jb3JyZWN0IHByb2dyYW0gaXMgcnVuIGZvciB0aGUgb3RoZXIgaW5zdGFuY2UuCisgKi8KIAogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgotI2luY2x1ZGUgImJyd19hdWIuaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImltcG9ydHMuaCIKIApAQCAtNDQsMTYgKzY5LDggQEAKICNpbmNsdWRlICJicndfc2YuaCIKICNpbmNsdWRlICJicndfZ3MuaCIKIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENoZWNrIGNhY2hlIGZvciB1cGxvYWRlZCB2ZXJzaW9uIG9mIHN0cnVjdCwgZWxzZSB1cGxvYWQgbmV3IG9uZS4KLSAqIEZhaWwgd2hlbiBtZW1vcnkgaXMgZXhoYXVzdGVkLgotICoKLSAqIFhYWDogRklYTUU6IEN1cnJlbnRseSBzZWFyY2ggaXMgc28gc2xvdyBpdCB3b3VsZCBiZSBxdWlja2VyIHRvCi0gKiByZWdlbmVyYXRlIHRoZSBkYXRhIGV2ZXJ5IHRpbWUuLi4KLSAqLwotCi1zdGF0aWMgR0x1aW50IGhhc2hfa2V5KCBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlfc2l6ZSApCitzdGF0aWMgR0x1aW50IGhhc2hfa2V5KCBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlfc2l6ZSwKKwkJCWRyaV9ibyAqKnJlbG9jX2J1ZnMsIEdMdWludCBucl9yZWxvY19idWZzKQogewogICAgR0x1aW50ICppa2V5ID0gKEdMdWludCAqKWtleTsKICAgIEdMdWludCBoYXNoID0gMCwgaTsKQEAgLTYyLDIzICs3OSw2MyBAQAogCiAgICAvKiBJJ20gc3VyZSB0aGlzIGNhbiBiZSBpbXByb3ZlZCBvbjoKICAgICAqLwotICAgZm9yIChpID0gMDsgaSA8IGtleV9zaXplLzQ7IGkrKykKKyAgIGZvciAoaSA9IDA7IGkgPCBrZXlfc2l6ZS80OyBpKyspIHsKICAgICAgIGhhc2ggXj0gaWtleVtpXTsKKyAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSB8IChoYXNoID4+IDI3KTsKKyAgIH0KKworICAgLyogSW5jbHVkZSB0aGUgQk8gcG9pbnRlcnMgYXMga2V5IGRhdGEgYXMgd2VsbCAqLworICAgaWtleSA9IChHTHVpbnQgKilyZWxvY19idWZzOworICAga2V5X3NpemUgPSBucl9yZWxvY19idWZzICogc2l6ZW9mKGRyaV9ibyAqKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBrZXlfc2l6ZS80OyBpKyspIHsKKyAgICAgIGhhc2ggXj0gaWtleVtpXTsKKyAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSB8IChoYXNoID4+IDI3KTsKKyAgIH0KIAogICAgcmV0dXJuIGhhc2g7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKnNlYXJjaF9jYWNoZSggc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsCi0JCQkJCSAgICAgR0x1aW50IGhhc2gsCi0JCQkJCSAgICAgY29uc3Qgdm9pZCAqa2V5LAotCQkJCQkgICAgIEdMdWludCBrZXlfc2l6ZSkKKy8qKgorICogTWFya3MgYSBuZXcgYnVmZmVyIGFzIGJlaW5nIGNob3NlbiBmb3IgdGhlIGdpdmVuIGNhY2hlIGlkLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlX2NhY2hlX2xhc3Qoc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsIGVudW0gYnJ3X2NhY2hlX2lkIGNhY2hlX2lkLAorCQkgIGRyaV9ibyAqYm8pCit7CisgICBpZiAoYm8gPT0gY2FjaGUtPmxhc3RfYm9bY2FjaGVfaWRdKQorICAgICAgcmV0dXJuOyAvKiBubyBjaGFuZ2UgKi8KKworICAgZHJpX2JvX3VucmVmZXJlbmNlKGNhY2hlLT5sYXN0X2JvW2NhY2hlX2lkXSk7CisgICBjYWNoZS0+bGFzdF9ib1tjYWNoZV9pZF0gPSBibzsKKyAgIGRyaV9ib19yZWZlcmVuY2UoY2FjaGUtPmxhc3RfYm9bY2FjaGVfaWRdKTsKKyAgIGNhY2hlLT5icnctPnN0YXRlLmRpcnR5LmNhY2hlIHw9IDEgPDwgY2FjaGVfaWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKgorc2VhcmNoX2NhY2hlKHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLCBlbnVtIGJyd19jYWNoZV9pZCBjYWNoZV9pZCwKKwkgICAgIEdMdWludCBoYXNoLCBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlfc2l6ZSwKKwkgICAgIGRyaV9ibyAqKnJlbG9jX2J1ZnMsIEdMdWludCBucl9yZWxvY19idWZzKQogewogICAgc3RydWN0IGJyd19jYWNoZV9pdGVtICpjOwogCisjaWYgMAorICAgaW50IGJ1Y2tldGNvdW50ID0gMDsKKworICAgZm9yIChjID0gY2FjaGUtPml0ZW1zW2hhc2ggJSBjYWNoZS0+c2l6ZV07IGM7IGMgPSBjLT5uZXh0KQorICAgICAgYnVja2V0Y291bnQrKzsKKworICAgZnByaW50ZihzdGRlcnIsICJidWNrZXQgJWQvJWQgPSAlZC8lZCBpdGVtc1xuIiwgaGFzaCAlIGNhY2hlLT5zaXplLAorCSAgIGNhY2hlLT5zaXplLCBidWNrZXRjb3VudCwgY2FjaGUtPm5faXRlbXMpOworI2VuZGlmCisKICAgIGZvciAoYyA9IGNhY2hlLT5pdGVtc1toYXNoICUgY2FjaGUtPnNpemVdOyBjOyBjID0gYy0+bmV4dCkgewotICAgICAgaWYgKGMtPmhhc2ggPT0gaGFzaCAmJiAKKyAgICAgIGlmIChjLT5jYWNoZV9pZCA9PSBjYWNoZV9pZCAmJgorCSAgYy0+aGFzaCA9PSBoYXNoICYmCiAJICBjLT5rZXlfc2l6ZSA9PSBrZXlfc2l6ZSAmJgotCSAgbWVtY21wKGMtPmtleSwga2V5LCBrZXlfc2l6ZSkgPT0gMCkKKwkgIG1lbWNtcChjLT5rZXksIGtleSwga2V5X3NpemUpID09IDAgJiYKKwkgIGMtPm5yX3JlbG9jX2J1ZnMgPT0gbnJfcmVsb2NfYnVmcyAmJgorCSAgbWVtY21wKGMtPnJlbG9jX2J1ZnMsIHJlbG9jX2J1ZnMsCisJCSBucl9yZWxvY19idWZzICogc2l6ZW9mKGRyaV9ibyAqKSkgPT0gMCkKIAkgcmV0dXJuIGM7CiAgICB9CiAKQEAgLTkzLDggKzE1MCw3IEBACiAgICBHTHVpbnQgc2l6ZSwgaTsKIAogICAgc2l6ZSA9IGNhY2hlLT5zaXplICogMzsKLSAgIGl0ZW1zID0gKHN0cnVjdCBicndfY2FjaGVfaXRlbSoqKSBfbWVzYV9tYWxsb2Moc2l6ZSAqIHNpemVvZigqaXRlbXMpKTsKLSAgIF9tZXNhX21lbXNldChpdGVtcywgMCwgc2l6ZSAqIHNpemVvZigqaXRlbXMpKTsKKyAgIGl0ZW1zID0gKHN0cnVjdCBicndfY2FjaGVfaXRlbSoqKSBfbWVzYV9jYWxsb2Moc2l6ZSAqIHNpemVvZigqaXRlbXMpKTsKIAogICAgZm9yIChpID0gMDsgaSA8IGNhY2hlLT5zaXplOyBpKyspCiAgICAgICBmb3IgKGMgPSBjYWNoZS0+aXRlbXNbaV07IGM7IGMgPSBuZXh0KSB7CkBAIC0xMDgsMTQyICsxNjQsMTgwIEBACiAgICBjYWNoZS0+c2l6ZSA9IHNpemU7CiB9CiAKLQotR0xib29sZWFuIGJyd19zZWFyY2hfY2FjaGUoIHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAotCQkJICAgIGNvbnN0IHZvaWQgKmtleSwKLQkJCSAgICBHTHVpbnQga2V5X3NpemUsCi0JCQkgICAgdm9pZCAqYXV4X3JldHVybiwKLQkJCSAgICBHTHVpbnQgKm9mZnNldF9yZXR1cm4pCisvKioKKyAqIFJldHVybnMgdGhlIGJ1ZmZlciBvYmplY3QgbWF0Y2hpbmcgY2FjaGVfaWQgYW5kIGtleSwgb3IgTlVMTC4KKyAqLworZHJpX2JvICpicndfc2VhcmNoX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSwKKwkJCSAgZW51bSBicndfY2FjaGVfaWQgY2FjaGVfaWQsCisJCQkgIGNvbnN0IHZvaWQgKmtleSwKKwkJCSAgR0x1aW50IGtleV9zaXplLAorCQkJICBkcmlfYm8gKipyZWxvY19idWZzLCBHTHVpbnQgbnJfcmVsb2NfYnVmcywKKwkJCSAgdm9pZCAqYXV4X3JldHVybiApCiB7CiAgICBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKml0ZW07Ci0gICBHTHVpbnQgYWRkciA9IDA7Ci0gICBHTHVpbnQgaGFzaCA9IGhhc2hfa2V5KGtleSwga2V5X3NpemUpOworICAgR0x1aW50IGhhc2ggPSBoYXNoX2tleShrZXksIGtleV9zaXplLCByZWxvY19idWZzLCBucl9yZWxvY19idWZzKTsKIAotICAgaXRlbSA9IHNlYXJjaF9jYWNoZShjYWNoZSwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CisgICBpdGVtID0gc2VhcmNoX2NhY2hlKGNhY2hlLCBjYWNoZV9pZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwKKwkJICAgICAgIHJlbG9jX2J1ZnMsIG5yX3JlbG9jX2J1ZnMpOwogCi0gICBpZiAoaXRlbSkgewotICAgICAgaWYgKGF1eF9yZXR1cm4pIAotCSAqKHZvaWQgKiopYXV4X3JldHVybiA9ICh2b2lkICopKChjaGFyICopaXRlbS0+a2V5ICsgaXRlbS0+a2V5X3NpemUpOwotICAgICAgCi0gICAgICAqb2Zmc2V0X3JldHVybiA9IGFkZHIgPSBpdGVtLT5vZmZzZXQ7Ci0gICB9ICAgIAotICAgIAotICAgaWYgKGl0ZW0gPT0gTlVMTCB8fCBhZGRyICE9IGNhY2hlLT5sYXN0X2FkZHIpIHsKLSAgICAgIGNhY2hlLT5icnctPnN0YXRlLmRpcnR5LmNhY2hlIHw9IDE8PGNhY2hlLT5pZDsKLSAgICAgIGNhY2hlLT5sYXN0X2FkZHIgPSBhZGRyOwotICAgfQotICAgCi0gICByZXR1cm4gaXRlbSAhPSBOVUxMOworICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoYXV4X3JldHVybikKKyAgICAgICoodm9pZCAqKilhdXhfcmV0dXJuID0gKHZvaWQgKikoKGNoYXIgKilpdGVtLT5rZXkgKyBpdGVtLT5rZXlfc2l6ZSk7CisKKyAgIHVwZGF0ZV9jYWNoZV9sYXN0KGNhY2hlLCBjYWNoZV9pZCwgaXRlbS0+Ym8pOworCisgICBkcmlfYm9fcmVmZXJlbmNlKGl0ZW0tPmJvKTsKKyAgIHJldHVybiBpdGVtLT5ibzsKIH0KIAotR0x1aW50IGJyd191cGxvYWRfY2FjaGUoIHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAotCQkJIGNvbnN0IHZvaWQgKmtleSwKLQkJCSBHTHVpbnQga2V5X3NpemUsCi0JCQkgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSBHTHVpbnQgZGF0YV9zaXplLAotCQkJIGNvbnN0IHZvaWQgKmF1eCwKLQkJCSB2b2lkICphdXhfcmV0dXJuICkKLXsgICAKLSAgIEdMdWludCBvZmZzZXQ7CitkcmlfYm8gKgorYnJ3X3VwbG9hZF9jYWNoZSggc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsCisJCSAgZW51bSBicndfY2FjaGVfaWQgY2FjaGVfaWQsCisJCSAgY29uc3Qgdm9pZCAqa2V5LAorCQkgIEdMdWludCBrZXlfc2l6ZSwKKwkJICBkcmlfYm8gKipyZWxvY19idWZzLAorCQkgIEdMdWludCBucl9yZWxvY19idWZzLAorCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgR0x1aW50IGRhdGFfc2l6ZSwKKwkJICBjb25zdCB2b2lkICphdXgsCisJCSAgdm9pZCAqYXV4X3JldHVybiApCit7CiAgICBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKml0ZW0gPSBDQUxMT0NfU1RSVUNUKGJyd19jYWNoZV9pdGVtKTsKLSAgIEdMdWludCBoYXNoID0gaGFzaF9rZXkoa2V5LCBrZXlfc2l6ZSk7Ci0gICB2b2lkICp0bXAgPSBfbWVzYV9tYWxsb2Moa2V5X3NpemUgKyBjYWNoZS0+YXV4X3NpemUpOwotICAgCi0gICBpZiAoIWJyd19wb29sX2FsbG9jKGNhY2hlLT5wb29sLCBkYXRhX3NpemUsIDYsICZvZmZzZXQpKSB7Ci0gICAgICAvKiBTaG91bGQgbm90IGJlIHBvc3NpYmxlOiAKLSAgICAgICAqLwotICAgICAgX21lc2FfcHJpbnRmKCJicndfcG9vbF9hbGxvYyBmYWlsZWRcbiIpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KKyAgIEdMdWludCBoYXNoID0gaGFzaF9rZXkoa2V5LCBrZXlfc2l6ZSwgcmVsb2NfYnVmcywgbnJfcmVsb2NfYnVmcyk7CisgICBHTHVpbnQgcmVsb2NzX3NpemUgPSBucl9yZWxvY19idWZzICogc2l6ZW9mKGRyaV9ibyAqKTsKKyAgIEdMdWludCBhdXhfc2l6ZSA9IGNhY2hlLT5hdXhfc2l6ZVtjYWNoZV9pZF07CisgICB2b2lkICp0bXA7CisgICBkcmlfYm8gKmJvOworICAgaW50IGk7CisKKyAgIC8qIENyZWF0ZSB0aGUgYnVmZmVyIG9iamVjdCB0byBjb250YWluIHRoZSBkYXRhICovCisgICBibyA9IGRyaV9ib19hbGxvYyhjYWNoZS0+YnJ3LT5pbnRlbC5idWZtZ3IsCisJCSAgICAgY2FjaGUtPm5hbWVbY2FjaGVfaWRdLCBkYXRhX3NpemUsIDEgPDwgNik7CisKKworICAgLyogU2V0IHVwIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUga2V5LCBhdXhfZGF0YSwgYW5kIHJlbG9jX2J1ZnMgKi8KKyAgIHRtcCA9IF9tZXNhX21hbGxvYyhrZXlfc2l6ZSArIGF1eF9zaXplICsgcmVsb2NzX3NpemUpOwogCiAgICBtZW1jcHkodG1wLCBrZXksIGtleV9zaXplKTsKKyAgIG1lbWNweSh0bXAgKyBrZXlfc2l6ZSwgYXV4LCBjYWNoZS0+YXV4X3NpemVbY2FjaGVfaWRdKTsKKyAgIG1lbWNweSh0bXAgKyBrZXlfc2l6ZSArIGF1eF9zaXplLCByZWxvY19idWZzLCByZWxvY3Nfc2l6ZSk7CisgICBmb3IgKGkgPSAwOyBpIDwgbnJfcmVsb2NfYnVmczsgaSsrKSB7CisgICAgICBpZiAocmVsb2NfYnVmc1tpXSAhPSBOVUxMKQorCSBkcmlfYm9fcmVmZXJlbmNlKHJlbG9jX2J1ZnNbaV0pOworICAgfQogCi0gICBpZiAoY2FjaGUtPmF1eF9zaXplKQotICAgICAgbWVtY3B5KHRtcCtrZXlfc2l6ZSwgYXV4LCBjYWNoZS0+YXV4X3NpemUpOwotCSAKKyAgIGl0ZW0tPmNhY2hlX2lkID0gY2FjaGVfaWQ7CiAgICBpdGVtLT5rZXkgPSB0bXA7CiAgICBpdGVtLT5oYXNoID0gaGFzaDsKICAgIGl0ZW0tPmtleV9zaXplID0ga2V5X3NpemU7Ci0gICBpdGVtLT5vZmZzZXQgPSBvZmZzZXQ7CisgICBpdGVtLT5yZWxvY19idWZzID0gdG1wICsga2V5X3NpemUgKyBhdXhfc2l6ZTsKKyAgIGl0ZW0tPm5yX3JlbG9jX2J1ZnMgPSBucl9yZWxvY19idWZzOworCisgICBpdGVtLT5ibyA9IGJvOworICAgZHJpX2JvX3JlZmVyZW5jZShibyk7CiAgICBpdGVtLT5kYXRhX3NpemUgPSBkYXRhX3NpemU7CiAKLSAgIGlmICgrK2NhY2hlLT5uX2l0ZW1zID4gY2FjaGUtPnNpemUgKiAxLjUpCisgICBpZiAoY2FjaGUtPm5faXRlbXMgPiBjYWNoZS0+c2l6ZSAqIDEuNSkKICAgICAgIHJlaGFzaChjYWNoZSk7Ci0gICAKKwogICAgaGFzaCAlPSBjYWNoZS0+c2l6ZTsKICAgIGl0ZW0tPm5leHQgPSBjYWNoZS0+aXRlbXNbaGFzaF07CiAgICBjYWNoZS0+aXRlbXNbaGFzaF0gPSBpdGVtOwotICAgICAgCisgICBjYWNoZS0+bl9pdGVtcysrOworCiAgICBpZiAoYXV4X3JldHVybikgewotICAgICAgYXNzZXJ0KGNhY2hlLT5hdXhfc2l6ZSk7CisgICAgICBhc3NlcnQoY2FjaGUtPmF1eF9zaXplW2NhY2hlX2lkXSk7CiAgICAgICAqKHZvaWQgKiopYXV4X3JldHVybiA9ICh2b2lkICopKChjaGFyICopaXRlbS0+a2V5ICsgaXRlbS0+a2V5X3NpemUpOwogICAgfQogCiAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKLSAgICAgIF9tZXNhX3ByaW50ZigidXBsb2FkICVzOiAlZCBieXRlcyB0byBwb29sIGJ1ZmZlciAlZCBvZmZzZXQgJXhcbiIsCi0JCSAgIGNhY2hlLT5uYW1lLAotCQkgICBkYXRhX3NpemUsIAotCQkgICBjYWNoZS0+cG9vbC0+YnVmZmVyLAotCQkgICBvZmZzZXQpOworICAgICAgX21lc2FfcHJpbnRmKCJ1cGxvYWQgJXM6ICVkIGJ5dGVzIHRvIGNhY2hlIGlkICVkXG4iLAorCQkgICBjYWNoZS0+bmFtZVtjYWNoZV9pZF0sCisJCSAgIGRhdGFfc2l6ZSwgY2FjaGVfaWQpOwogCi0gICAvKiBDb3B5IGRhdGEgdG8gdGhlIGJ1ZmZlcjoKLSAgICAqLwotICAgYm1CdWZmZXJTdWJEYXRhQVVCKCZjYWNoZS0+YnJ3LT5pbnRlbCwKLQkJICAgICAgY2FjaGUtPnBvb2wtPmJ1ZmZlciwKLQkJICAgICAgb2Zmc2V0LCAKLQkJICAgICAgZGF0YV9zaXplLCAKLQkJICAgICAgZGF0YSwKLQkJICAgICAgY2FjaGUtPmF1Yl90eXBlLAotCQkgICAgICBjYWNoZS0+YXViX3N1Yl90eXBlKTsKLSAgIAorICAgLyogQ29weSBkYXRhIHRvIHRoZSBidWZmZXIgKi8KKyAgIGRyaV9ib19zdWJkYXRhKGJvLCAwLCBkYXRhX3NpemUsIGRhdGEpOwogCi0gICBjYWNoZS0+YnJ3LT5zdGF0ZS5kaXJ0eS5jYWNoZSB8PSAxPDxjYWNoZS0+aWQ7Ci0gICBjYWNoZS0+bGFzdF9hZGRyID0gb2Zmc2V0OworICAgdXBkYXRlX2NhY2hlX2xhc3QoY2FjaGUsIGNhY2hlX2lkLCBibyk7CiAKLSAgIHJldHVybiBvZmZzZXQ7CisgICByZXR1cm4gYm87CiB9CiAKIC8qIFRoaXMgZG9lc24ndCByZWFsbHkgd29yayB3aXRoIGF1eCBkYXRhLiAgVXNlIHNlYXJjaC91cGxvYWQgaW5zdGVhZAogICovCi1HTHVpbnQgYnJ3X2NhY2hlX2RhdGFfc3ooc3RydWN0IGJyd19jYWNoZSAqY2FjaGUsCi0JCQkgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSBHTHVpbnQgZGF0YV9zaXplKQorZHJpX2JvICoKK2Jyd19jYWNoZV9kYXRhX3N6KHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAorCQkgIGVudW0gYnJ3X2NhY2hlX2lkIGNhY2hlX2lkLAorCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgR0x1aW50IGRhdGFfc2l6ZSwKKwkJICBkcmlfYm8gKipyZWxvY19idWZzLAorCQkgIEdMdWludCBucl9yZWxvY19idWZzKQogewotICAgR0x1aW50IGFkZHI7CisgICBkcmlfYm8gKmJvOworICAgc3RydWN0IGJyd19jYWNoZV9pdGVtICppdGVtOworICAgR0x1aW50IGhhc2ggPSBoYXNoX2tleShkYXRhLCBkYXRhX3NpemUsIHJlbG9jX2J1ZnMsIG5yX3JlbG9jX2J1ZnMpOwogCi0gICBpZiAoIWJyd19zZWFyY2hfY2FjaGUoY2FjaGUsIGRhdGEsIGRhdGFfc2l6ZSwgTlVMTCwgJmFkZHIpKSB7Ci0gICAgICBhZGRyID0gYnJ3X3VwbG9hZF9jYWNoZShjYWNoZSwgCi0JCQkgICAgICBkYXRhLCBkYXRhX3NpemUsIAotCQkJICAgICAgZGF0YSwgZGF0YV9zaXplLCAKLQkJCSAgICAgIE5VTEwsIE5VTEwpOworICAgaXRlbSA9IHNlYXJjaF9jYWNoZShjYWNoZSwgY2FjaGVfaWQsIGhhc2gsIGRhdGEsIGRhdGFfc2l6ZSwKKwkJICAgICAgIHJlbG9jX2J1ZnMsIG5yX3JlbG9jX2J1ZnMpOworICAgaWYgKGl0ZW0pIHsKKyAgICAgIHVwZGF0ZV9jYWNoZV9sYXN0KGNhY2hlLCBjYWNoZV9pZCwgaXRlbS0+Ym8pOworICAgICAgZHJpX2JvX3JlZmVyZW5jZShpdGVtLT5ibyk7CisgICAgICByZXR1cm4gaXRlbS0+Ym87CiAgICB9CiAKLSAgIHJldHVybiBhZGRyOworICAgYm8gPSBicndfdXBsb2FkX2NhY2hlKGNhY2hlLCBjYWNoZV9pZCwKKwkJCSBkYXRhLCBkYXRhX3NpemUsCisJCQkgcmVsb2NfYnVmcywgbnJfcmVsb2NfYnVmcywKKwkJCSBkYXRhLCBkYXRhX3NpemUsCisJCQkgTlVMTCwgTlVMTCk7CisKKyAgIHJldHVybiBibzsKIH0KIAotR0x1aW50IGJyd19jYWNoZV9kYXRhKHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAotCQkgICAgICBjb25zdCB2b2lkICpkYXRhKQorLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBicndfY2FjaGVfZGF0YV9zeiB1c2luZyB0aGUgY2FjaGVfaWQncyBjYW5vbmljYWwga2V5IHNpemUuCisgKgorICogSWYgbnJfcmVsb2NfYnVmcyBpcyBub256ZXJvLCBicndfc2VhcmNoX2NhY2hlKCkvYnJ3X3VwbG9hZF9jYWNoZSgpIHdvdWxkIGJlCisgKiBiZXR0ZXIgdG8gdXNlLCBhcyB0aGUgcG90ZW50aWFsbHkgY2hhbmdpbmcgb2Zmc2V0cyBpbiB0aGUgZGF0YS11c2VkLWFzLWtleQorICogd2lsbCByZXN1bHQgaW4gZXhjZXNzaXZlIGNhY2hlIG1pc3Nlcy4KKyAqLworZHJpX2JvICoKK2Jyd19jYWNoZV9kYXRhKHN0cnVjdCBicndfY2FjaGUgKmNhY2hlLAorCSAgICAgICBlbnVtIGJyd19jYWNoZV9pZCBjYWNoZV9pZCwKKwkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkgICAgICAgZHJpX2JvICoqcmVsb2NfYnVmcywKKwkgICAgICAgR0x1aW50IG5yX3JlbG9jX2J1ZnMpCiB7Ci0gICByZXR1cm4gYnJ3X2NhY2hlX2RhdGFfc3ooY2FjaGUsIGRhdGEsIGNhY2hlLT5rZXlfc2l6ZSk7CisgICByZXR1cm4gYnJ3X2NhY2hlX2RhdGFfc3ooY2FjaGUsIGNhY2hlX2lkLCBkYXRhLCBjYWNoZS0+a2V5X3NpemVbY2FjaGVfaWRdLAorCQkJICAgIHJlbG9jX2J1ZnMsIG5yX3JlbG9jX2J1ZnMpOwogfQogCitlbnVtIHBvb2xfdHlwZSB7CisgICBEV19TVVJGQUNFX1NUQVRFLAorICAgRFdfR0VORVJBTF9TVEFURQorfTsKIAotCi0KLQotc3RhdGljIHZvaWQgYnJ3X2luaXRfY2FjaGUoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCAKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIEdMdWludCBpZCwKLQkJCSAgICBHTHVpbnQga2V5X3NpemUsCi0JCQkgICAgR0x1aW50IGF1eF9zaXplLAotCQkJICAgIEdMdWludCBhdWJfdHlwZSwKLQkJCSAgICBHTHVpbnQgYXViX3N1Yl90eXBlICkKK3N0YXRpYyB2b2lkCiticndfaW5pdF9jYWNoZV9pZCggc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCWVudW0gYnJ3X2NhY2hlX2lkIGlkLAorCQlHTHVpbnQga2V5X3NpemUsCisJCUdMdWludCBhdXhfc2l6ZSkKIHsKLSAgIHN0cnVjdCBicndfY2FjaGUgKmNhY2hlID0gJmJydy0+Y2FjaGVbaWRdOworICAgc3RydWN0IGJyd19jYWNoZSAqY2FjaGUgPSAmYnJ3LT5jYWNoZTsKKworICAgY2FjaGUtPm5hbWVbaWRdID0gc3RyZHVwKG5hbWUpOworICAgY2FjaGUtPmtleV9zaXplW2lkXSA9IGtleV9zaXplOworICAgY2FjaGUtPmF1eF9zaXplW2lkXSA9IGF1eF9zaXplOworfQorCit2b2lkIGJyd19pbml0X2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCit7CisgICBzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSA9ICZicnctPmNhY2hlOworCiAgICBjYWNoZS0+YnJ3ID0gYnJ3OwotICAgY2FjaGUtPmlkID0gaWQ7Ci0gICBjYWNoZS0+bmFtZSA9IG5hbWU7Ci0gICBjYWNoZS0+aXRlbXMgPSBOVUxMOwogCiAgICBjYWNoZS0+c2l6ZSA9IDc7CiAgICBjYWNoZS0+bl9pdGVtcyA9IDA7CkBAIC0yNTEsMjAwICszNDUsMTMzIEBACiAgICAgICBfbWVzYV9jYWxsb2MoY2FjaGUtPnNpemUgKiAKIAkJICAgc2l6ZW9mKHN0cnVjdCBicndfY2FjaGVfaXRlbSkpOwogCisgICBicndfaW5pdF9jYWNoZV9pZChicncsCisJCSAgICAgIkNDX1ZQIiwKKwkJICAgICBCUldfQ0NfVlAsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfY2Nfdmlld3BvcnQpLAorCQkgICAgIDApOwogCi0gICBjYWNoZS0+a2V5X3NpemUgPSBrZXlfc2l6ZTsKLSAgIGNhY2hlLT5hdXhfc2l6ZSA9IGF1eF9zaXplOwotICAgY2FjaGUtPmF1Yl90eXBlID0gYXViX3R5cGU7Ci0gICBjYWNoZS0+YXViX3N1Yl90eXBlID0gYXViX3N1Yl90eXBlOwotICAgc3dpdGNoIChhdWJfdHlwZSkgewotICAgY2FzZSBEV19HRU5FUkFMX1NUQVRFOiBjYWNoZS0+cG9vbCA9ICZicnctPnBvb2xbQlJXX0dTX1BPT0xdOyBicmVhazsKLSAgIGNhc2UgRFdfU1VSRkFDRV9TVEFURTogY2FjaGUtPnBvb2wgPSAmYnJ3LT5wb29sW0JSV19TU19QT09MXTsgYnJlYWs7Ci0gICBkZWZhdWx0OiBhc3NlcnQoMCk7IGJyZWFrOwotICAgfQorICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJDQ19VTklUIiwKKwkJICAgICBCUldfQ0NfVU5JVCwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19jY191bml0X3N0YXRlKSwKKwkJICAgICAwKTsKKworICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJXTV9QUk9HIiwKKwkJICAgICBCUldfV01fUFJPRywKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd193bV9wcm9nX2tleSksCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfd21fcHJvZ19kYXRhKSk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiU0FNUExFUl9ERUZBVUxUX0NPTE9SIiwKKwkJICAgICBCUldfU0FNUExFUl9ERUZBVUxUX0NPTE9SLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgYnJ3X3NhbXBsZXJfZGVmYXVsdF9jb2xvciksCisJCSAgICAgMCk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiU0FNUExFUiIsCisJCSAgICAgQlJXX1NBTVBMRVIsCisJCSAgICAgMCwJCS8qIHZhcmlhYmxlIGtleS9kYXRhIHNpemUgKi8KKwkJICAgICAwKTsKKworICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJXTV9VTklUIiwKKwkJICAgICBCUldfV01fVU5JVCwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd193bV91bml0X3N0YXRlKSwKKwkJICAgICAwKTsKKworICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJTRl9QUk9HIiwKKwkJICAgICBCUldfU0ZfUFJPRywKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19zZl9wcm9nX2tleSksCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfc2ZfcHJvZ19kYXRhKSk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiU0ZfVlAiLAorCQkgICAgIEJSV19TRl9WUCwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19zZl92aWV3cG9ydCksCisJCSAgICAgMCk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiU0ZfVU5JVCIsCisJCSAgICAgQlJXX1NGX1VOSVQsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfc2ZfdW5pdF9zdGF0ZSksCisJCSAgICAgMCk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiVlNfVU5JVCIsCisJCSAgICAgQlJXX1ZTX1VOSVQsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfdnNfdW5pdF9zdGF0ZSksCisJCSAgICAgMCk7CisKKyAgIGJyd19pbml0X2NhY2hlX2lkKGJydywKKwkJICAgICAiVlNfUFJPRyIsCisJCSAgICAgQlJXX1ZTX1BST0csCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBicndfdnNfcHJvZ19rZXkpLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSkpOworCisgICBicndfaW5pdF9jYWNoZV9pZChicncsCisJCSAgICAgIkNMSVBfVU5JVCIsCisJCSAgICAgQlJXX0NMSVBfVU5JVCwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19jbGlwX3VuaXRfc3RhdGUpLAorCQkgICAgIDApOworCisgICBicndfaW5pdF9jYWNoZV9pZChicncsCisJCSAgICAgIkNMSVBfUFJPRyIsCisJCSAgICAgQlJXX0NMSVBfUFJPRywKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19jbGlwX3Byb2dfa2V5KSwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19jbGlwX3Byb2dfZGF0YSkpOworCisgICBicndfaW5pdF9jYWNoZV9pZChicncsCisJCSAgICAgIkdTX1VOSVQiLAorCQkgICAgIEJSV19HU19VTklULAorCQkgICAgIHNpemVvZihzdHJ1Y3QgYnJ3X2dzX3VuaXRfc3RhdGUpLAorCQkgICAgIDApOworCisgICBicndfaW5pdF9jYWNoZV9pZChicncsCisJCSAgICAgIkdTX1BST0ciLAorCQkgICAgIEJSV19HU19QUk9HLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgYnJ3X2dzX3Byb2dfa2V5KSwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19nc19wcm9nX2RhdGEpKTsKKworICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJTU19TVVJGQUNFIiwKKwkJICAgICBCUldfU1NfU1VSRkFDRSwKKwkJICAgICBzaXplb2Yoc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlKSwKKwkJICAgICAwKTsKKworICAgYnJ3X2luaXRfY2FjaGVfaWQoYnJ3LAorCQkgICAgICJTU19TVVJGX0JJTkQiLAorCQkgICAgIEJSV19TU19TVVJGX0JJTkQsCisJCSAgICAgMCwKKwkJICAgICAwKTsKIH0KIAotdm9pZCBicndfaW5pdF9jYWNoZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKLXsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJDQ19WUCIsCi0JCSAgQlJXX0NDX1ZQLAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X2NjX3ZpZXdwb3J0KSwKLQkJICAwLAotCQkgIERXX0dFTkVSQUxfU1RBVEUsCi0JCSAgRFdHU19DT0xPUl9DQUxDX1ZJRVdQT1JUX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJDQ19VTklUIiwKLQkJICBCUldfQ0NfVU5JVCwKLQkJICBzaXplb2Yoc3RydWN0IGJyd19jY191bml0X3N0YXRlKSwKLQkJICAwLAotCQkgIERXX0dFTkVSQUxfU1RBVEUsCi0JCSAgRFdHU19DT0xPUl9DQUxDX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJXTV9QUk9HIiwKLQkJICBCUldfV01fUFJPRywKLQkJICBzaXplb2Yoc3RydWN0IGJyd193bV9wcm9nX2tleSksCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfd21fcHJvZ19kYXRhKSwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfS0VSTkVMX0lOU1RSVUNUSU9OUyk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiU0FNUExFUl9ERUZBVUxUX0NPTE9SIiwKLQkJICBCUldfU0FNUExFUl9ERUZBVUxUX0NPTE9SLAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X3NhbXBsZXJfZGVmYXVsdF9jb2xvciksCi0JCSAgMCwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfU0FNUExFUl9ERUZBVUxUX0NPTE9SKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJTQU1QTEVSIiwKLQkJICBCUldfU0FNUExFUiwKLQkJICAwLAkJLyogdmFyaWFibGUga2V5L2RhdGEgc2l6ZSAqLwotCQkgIDAsCi0JCSAgRFdfR0VORVJBTF9TVEFURSwKLQkJICBEV0dTX1NBTVBMRVJfU1RBVEUpOwotCi0gICBicndfaW5pdF9jYWNoZShicncsCi0JCSAgIldNX1VOSVQiLAotCQkgIEJSV19XTV9VTklULAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X3dtX3VuaXRfc3RhdGUpLAotCQkgIDAsCi0JCSAgRFdfR0VORVJBTF9TVEFURSwKLQkJICBEV0dTX1dJTkRPV0VSX0laX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJTRl9QUk9HIiwKLQkJICBCUldfU0ZfUFJPRywKLQkJICBzaXplb2Yoc3RydWN0IGJyd19zZl9wcm9nX2tleSksCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfc2ZfcHJvZ19kYXRhKSwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfS0VSTkVMX0lOU1RSVUNUSU9OUyk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiU0ZfVlAiLAotCQkgIEJSV19TRl9WUCwKLQkJICBzaXplb2Yoc3RydWN0IGJyd19zZl92aWV3cG9ydCksCi0JCSAgMCwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfU1RSSVBTX0ZBTlNfVklFV1BPUlRfU1RBVEUpOwotCi0gICBicndfaW5pdF9jYWNoZShicncsCi0JCSAgIlNGX1VOSVQiLAotCQkgIEJSV19TRl9VTklULAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X3NmX3VuaXRfc3RhdGUpLAotCQkgIDAsCi0JCSAgRFdfR0VORVJBTF9TVEFURSwKLQkJICBEV0dTX1NUUklQU19GQU5TX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJWU19VTklUIiwKLQkJICBCUldfVlNfVU5JVCwKLQkJICBzaXplb2Yoc3RydWN0IGJyd192c191bml0X3N0YXRlKSwKLQkJICAwLAotCQkgIERXX0dFTkVSQUxfU1RBVEUsCi0JCSAgRFdHU19WRVJURVhfU0hBREVSX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJWU19QUk9HIiwKLQkJICBCUldfVlNfUFJPRywKLQkJICBzaXplb2Yoc3RydWN0IGJyd192c19wcm9nX2tleSksCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfdnNfcHJvZ19kYXRhKSwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfS0VSTkVMX0lOU1RSVUNUSU9OUyk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiQ0xJUF9VTklUIiwKLQkJICBCUldfQ0xJUF9VTklULAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X2NsaXBfdW5pdF9zdGF0ZSksCi0JCSAgMCwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfQ0xJUFBFUl9TVEFURSk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiQ0xJUF9QUk9HIiwKLQkJICBCUldfQ0xJUF9QUk9HLAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X2NsaXBfcHJvZ19rZXkpLAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X2NsaXBfcHJvZ19kYXRhKSwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfS0VSTkVMX0lOU1RSVUNUSU9OUyk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiR1NfVU5JVCIsCi0JCSAgQlJXX0dTX1VOSVQsCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfZ3NfdW5pdF9zdGF0ZSksCi0JCSAgMCwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfR0VPTUVUUllfU0hBREVSX1NUQVRFKTsKLQotICAgYnJ3X2luaXRfY2FjaGUoYnJ3LAotCQkgICJHU19QUk9HIiwKLQkJICBCUldfR1NfUFJPRywKLQkJICBzaXplb2Yoc3RydWN0IGJyd19nc19wcm9nX2tleSksCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfZ3NfcHJvZ19kYXRhKSwKLQkJICBEV19HRU5FUkFMX1NUQVRFLAotCQkgIERXR1NfS0VSTkVMX0lOU1RSVUNUSU9OUyk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiU1NfU1VSRkFDRSIsCi0JCSAgQlJXX1NTX1NVUkZBQ0UsCi0JCSAgc2l6ZW9mKHN0cnVjdCBicndfc3VyZmFjZV9zdGF0ZSksCi0JCSAgMCwKLQkJICBEV19TVVJGQUNFX1NUQVRFLAotCQkgIERXU1NfU1VSRkFDRV9TVEFURSk7Ci0KLSAgIGJyd19pbml0X2NhY2hlKGJydywKLQkJICAiU1NfU1VSRl9CSU5EIiwKLQkJICBCUldfU1NfU1VSRl9CSU5ELAotCQkgIHNpemVvZihzdHJ1Y3QgYnJ3X3N1cmZhY2VfYmluZGluZ190YWJsZSksCi0JCSAgMCwKLQkJICBEV19TVVJGQUNFX1NUQVRFLAotCQkgIERXU1NfQklORElOR19UQUJMRV9TVEFURSk7Ci19Ci0KLQotLyogV2hlbiB3ZSBsb3NlIGhhcmR3YXJlIGNvbnRleHQsIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgc3VyZmFjZSBjYWNoZQotICogYXMgdGhlc2Ugc3RydWN0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmUtdXBsb2FkZWQuICBUaGV5IGFyZSBzdWJqZWN0Ci0gKiB0byBmaXh1cCBieSB0aGUgbWVtb3J5IG1hbmFnZXIgYXMgdGhleSBjb250YWluIGFic29sdXRlIGFncAotICogb2Zmc2V0cywgc28gd2UgbmVlZCB0byBlbnN1cmUgdGhlcmUgaXMgYSBmcmVzaCB2ZXJzaW9uIG9mIHRoZQotICogc3RydWN0IGF2YWlsYWJsZSB0byByZWNlaXZlIHRoZSBmaXh1cC4KLSAqCi0gKiBYWFg6IE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlbid0IHR3byB2ZXJzaW9ucyBvZiBhIHN1cmZhY2Ugb3IKLSAqIGJ1ZmZlcm9iaiB3aXRoIGRpZmZlcmVudCBiYWNraW5nIGRhdGEgYWN0aXZlIGluIHRoZSBzYW1lIGJ1ZmZlciBhdAotICogb25jZT8gIE90aGVyd2lzZSB0aGUgY2FjaGUgY291bGQgY29uZnVzZSB0aGVtLiAgTWF5YmUgYmV0dGVyIG5vdCB0bwotICogY2FjaGUgYXQgYWxsPwotICogCi0gKiAtLT4gSXNuJ3QgdGhpcyB0aGUgc2FtZSBhcyBzYXlpbmcgbmVlZCB0byBlbnN1cmUgYmF0Y2ggaXMgZmx1c2hlZAotICogICAgICAgICBiZWZvcmUgbmV3IGRhdGEgaXMgdXBsb2FkZWQgdG8gYW4gZXhpc3RpbmcgYnVmZmVyPyAgV2UKLSAqICAgICAgICAgYWxyZWFkeSB0cnkgdG8gbWFrZSBzdXJlIG9mIHRoYXQuCi0gKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NhY2hlICpjYWNoZSApCitzdGF0aWMgdm9pZAorYnJ3X2NsZWFyX2NhY2hlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7CiAgICBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKmMsICpuZXh0OwogICAgR0x1aW50IGk7CiAKLSAgIGZvciAoaSA9IDA7IGkgPCBjYWNoZS0+c2l6ZTsgaSsrKSB7Ci0gICAgICBmb3IgKGMgPSBjYWNoZS0+aXRlbXNbaV07IGM7IGMgPSBuZXh0KSB7Ci0JIG5leHQgPSBjLT5uZXh0OwotCSBmcmVlKCh2b2lkICopYy0+a2V5KTsKLQkgZnJlZShjKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlLT5pdGVtc1tpXSA9IE5VTEw7Ci0gICB9Ci0KLSAgIGNhY2hlLT5uX2l0ZW1zID0gMDsKLX0KLQotdm9pZCBicndfY2xlYXJfYWxsX2NhY2hlcyggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQotewotICAgR0xpbnQgaTsKLQogICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU1RBVEUpCiAgICAgICBfbWVzYV9wcmludGYoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0gICBmb3IgKGkgPSAwOyBpIDwgQlJXX01BWF9DQUNIRTsgaSsrKQotICAgICAgY2xlYXJfY2FjaGUoJmJydy0+Y2FjaGVbaV0pOyAgICAgIAorICAgZm9yIChpID0gMDsgaSA8IGJydy0+Y2FjaGUuc2l6ZTsgaSsrKSB7CisgICAgICBmb3IgKGMgPSBicnctPmNhY2hlLml0ZW1zW2ldOyBjOyBjID0gbmV4dCkgeworCSBpbnQgajsKKworCSBuZXh0ID0gYy0+bmV4dDsKKwkgZm9yIChqID0gMDsgaiA8IGMtPm5yX3JlbG9jX2J1ZnM7IGorKykKKwkgICAgZHJpX2JvX3VucmVmZXJlbmNlKGMtPnJlbG9jX2J1ZnNbal0pOworCSBkcmlfYm9fdW5yZWZlcmVuY2UoYy0+Ym8pOworCSBmcmVlKCh2b2lkICopYy0+a2V5KTsKKwkgZnJlZShjKTsKKyAgICAgIH0KKyAgICAgIGJydy0+Y2FjaGUuaXRlbXNbaV0gPSBOVUxMOworICAgfQorCisgICBicnctPmNhY2hlLm5faXRlbXMgPSAwOwogCiAgICBpZiAoYnJ3LT5jdXJiZS5sYXN0X2J1ZikgewogICAgICAgX21lc2FfZnJlZShicnctPmN1cmJlLmxhc3RfYnVmKTsKQEAgLTQ1NiwxNCArNDgzLDI0IEBACiAgICBicnctPnN0YXRlLmRpcnR5LmNhY2hlIHw9IH4wOwogfQogCit2b2lkIGJyd19zdGF0ZV9jYWNoZV9jaGVja19zaXplKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCit7CisgICAvKiB1bi10dW5lZCBndWVzcy4gIFdlJ3ZlIGdvdCBhcm91bmQgMjAgc3RhdGUgb2JqZWN0cyBmb3IgYSB0b3RhbCBvZiBhcm91bmQKKyAgICAqIDMyaywgc28gMTAwMCBvZiB0aGVtIGlzIGFyb3VuZCAxLjVNQi4KKyAgICAqLworICAgaWYgKGJydy0+Y2FjaGUubl9pdGVtcyA+IDEwMDApCisgICAgICBicndfY2xlYXJfY2FjaGUoYnJ3KTsKK30KIAotCi0KLQotdm9pZCBicndfZGVzdHJveV9jYWNoZXMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3ZvaWQgYnJ3X2Rlc3Ryb3lfY2FjaGUoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKICAgIEdMdWludCBpOwogCisgICBicndfY2xlYXJfY2FjaGUoYnJ3KTsKICAgIGZvciAoaSA9IDA7IGkgPCBCUldfTUFYX0NBQ0hFOyBpKyspCi0gICAgICBjbGVhcl9jYWNoZSgmYnJ3LT5jYWNoZVtpXSk7ICAgICAgCisgICAgICBmcmVlKGJydy0+Y2FjaGUubmFtZVtpXSk7CisKKyAgIGZyZWUoYnJ3LT5jYWNoZS5pdGVtcyk7CisgICBicnctPmNhY2hlLml0ZW1zID0gTlVMTDsKKyAgIGJydy0+Y2FjaGUuc2l6ZSA9IDA7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV9kdW1wLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5M2Y5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX2R1bXAuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaW5jbHVkZSAibXR5cGVzLmgiCisKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19zdGF0ZS5oIgorI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCisKKy8qKgorICogUHJpbnRzIG91dCBhIGhlYWRlciwgdGhlIGNvbnRlbnRzLCBhbmQgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoCisgKiB0aGUgaGFyZHdhcmUgc3RhdGUgZGF0YSBnaXZlbi4KKyAqCisgKiBccGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBzdGF0ZSBvYmplY3QKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIGJhc2Ugb2YgdGhlIHN0YXRlIG9iamVjdAorICogXHBhcmFtIGh3X29mZnNldCBIYXJkd2FyZSBvZmZzZXQgb2YgdGhlIGJhc2Ugb2YgdGhlIHN0YXRlIGRhdGEuCisgKiBccGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIERXT1JEIGJlaW5nIG91dHB1dC4KKyAqLworc3RhdGljIHZvaWQKK3N0YXRlX291dChjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCB1aW50MzJfdCBod19vZmZzZXQsIGludCBpbmRleCwKKwkgIGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgdmE7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiU4czogMHglMDh4OiAweCUwOHg6ICIsCisJICAgIG5hbWUsIGh3X29mZnNldCArIGluZGV4ICogNCwgKCh1aW50MzJfdCAqKWRhdGEpW2luZGV4XSk7CisgICAgdmFfc3RhcnQodmEsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworfQorCisvKiogR2VuZXJpYywgdW5kZWNvZGVkIHN0YXRlIGJ1ZmZlciBkZWJ1ZyBwcmludG91dCAqLworc3RhdGljIHZvaWQKK3N0YXRlX3N0cnVjdF9vdXQoY29uc3QgY2hhciAqbmFtZSwgZHJpX2JvICpidWZmZXIsIHVuc2lnbmVkIGludCBzdGF0ZV9zaXplKQoreworICAgaW50IGk7CisKKyAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgZHJpX2JvX21hcChidWZmZXIsIEdMX0ZBTFNFKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZV9zaXplIC8gNDsgaSsrKSB7CisgICAgICBzdGF0ZV9vdXQobmFtZSwgYnVmZmVyLT52aXJ0dWFsLCBidWZmZXItPm9mZnNldCwgaSwKKwkJImR3b3JkICVkXG4iLCBpKTsKKyAgIH0KKyAgIGRyaV9ib191bm1hcChidWZmZXIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfOTY1X3N1cmZhY2V0eXBlKHVuc2lnbmVkIGludCBzdXJmYWNldHlwZSkKK3sKKyAgICBzd2l0Y2ggKHN1cmZhY2V0eXBlKSB7CisgICAgY2FzZSAwOiByZXR1cm4gIjFEIjsKKyAgICBjYXNlIDE6IHJldHVybiAiMkQiOworICAgIGNhc2UgMjogcmV0dXJuICIzRCI7CisgICAgY2FzZSAzOiByZXR1cm4gIkNVQkUiOworICAgIGNhc2UgNDogcmV0dXJuICJCVUZGRVIiOworICAgIGNhc2UgNzogcmV0dXJuICJOVUxMIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcF93bV9zdXJmYWNlX3N0YXRlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQoreworICAgaW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBicnctPndtLm5yX3N1cmZhY2VzOyBpKyspIHsKKyAgICAgIGRyaV9ibyAqc3VyZl9ibyA9IGJydy0+d20uc3VyZl9ib1tpXTsKKyAgICAgIHVuc2lnbmVkIGludCBzdXJmb2ZmOworICAgICAgc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlICpzdXJmOworICAgICAgY2hhciBuYW1lWzIwXTsKKworICAgICAgaWYgKHN1cmZfYm8gPT0gTlVMTCkgeworCSBmcHJpbnRmKHN0ZGVyciwgIldNIFNTJWQ6IE5VTExcbiIsIGkpOworCSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRyaV9ib19tYXAoc3VyZl9ibywgR0xfRkFMU0UpOworICAgICAgc3VyZm9mZiA9IHN1cmZfYm8tPm9mZnNldDsKKyAgICAgIHN1cmYgPSAoc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlICopKHN1cmZfYm8tPnZpcnR1YWwpOworCisgICAgICBzcHJpbnRmKG5hbWUsICJXTSBTUyVkIiwgaSk7CisgICAgICBzdGF0ZV9vdXQobmFtZSwgc3VyZiwgc3VyZm9mZiwgMCwgIiVzXG4iLAorCQlnZXRfOTY1X3N1cmZhY2V0eXBlKHN1cmYtPnNzMC5zdXJmYWNlX3R5cGUpKTsKKyAgICAgIHN0YXRlX291dChuYW1lLCBzdXJmLCBzdXJmb2ZmLCAxLCAib2Zmc2V0XG4iKTsKKyAgICAgIHN0YXRlX291dChuYW1lLCBzdXJmLCBzdXJmb2ZmLCAyLCAiJWR4JWQgc2l6ZSwgJWQgbWlwc1xuIiwKKwkJc3VyZi0+c3MyLndpZHRoICsgMSwgc3VyZi0+c3MyLmhlaWdodCArIDEsIHN1cmYtPnNzMi5taXBfY291bnQpOworICAgICAgc3RhdGVfb3V0KG5hbWUsIHN1cmYsIHN1cmZvZmYsIDMsICJwaXRjaCAlZCwgJXN0aWxlZFxuIiwKKwkJc3VyZi0+c3MzLnBpdGNoICsgMSwgc3VyZi0+c3MzLnRpbGVkX3N1cmZhY2UgPyAiIiA6ICJub3QgIik7CisgICAgICBzdGF0ZV9vdXQobmFtZSwgc3VyZiwgc3VyZm9mZiwgNCwgIm1pcCBiYXNlICVkXG4iLAorCQlzdXJmLT5zczQubWluX2xvZCk7CisKKyAgICAgIGRyaV9ib191bm1hcChzdXJmX2JvKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcF9zZl92aWV3cG9ydF9zdGF0ZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKK3sKKyAgIGNvbnN0IGNoYXIgKm5hbWUgPSAiU0YgVlAiOworICAgc3RydWN0IGJyd19zZl92aWV3cG9ydCAqdnA7CisgICB1aW50MzJfdCB2cF9vZmY7CisKKyAgIGlmIChicnctPnNmLnZwX2JvID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGRyaV9ib19tYXAoYnJ3LT5zZi52cF9ibywgR0xfRkFMU0UpOworCisgICB2cCA9IGJydy0+c2YudnBfYm8tPnZpcnR1YWw7CisgICB2cF9vZmYgPSBicnctPnNmLnZwX2JvLT5vZmZzZXQ7CisKKyAgIHN0YXRlX291dChuYW1lLCB2cCwgdnBfb2ZmLCAwLCAibTAwID0gJWZcbiIsIHZwLT52aWV3cG9ydC5tMDApOworICAgc3RhdGVfb3V0KG5hbWUsIHZwLCB2cF9vZmYsIDEsICJtMTEgPSAlZlxuIiwgdnAtPnZpZXdwb3J0Lm0xMSk7CisgICBzdGF0ZV9vdXQobmFtZSwgdnAsIHZwX29mZiwgMiwgIm0yMiA9ICVmXG4iLCB2cC0+dmlld3BvcnQubTIyKTsKKyAgIHN0YXRlX291dChuYW1lLCB2cCwgdnBfb2ZmLCAzLCAibTMwID0gJWZcbiIsIHZwLT52aWV3cG9ydC5tMzApOworICAgc3RhdGVfb3V0KG5hbWUsIHZwLCB2cF9vZmYsIDQsICJtMzEgPSAlZlxuIiwgdnAtPnZpZXdwb3J0Lm0zMSk7CisgICBzdGF0ZV9vdXQobmFtZSwgdnAsIHZwX29mZiwgNSwgIm0zMiA9ICVmXG4iLCB2cC0+dmlld3BvcnQubTMyKTsKKworICAgc3RhdGVfb3V0KG5hbWUsIHZwLCB2cF9vZmYsIDYsICJ0b3AgbGVmdCA9ICVkLCVkXG4iLAorCSAgICAgdnAtPnNjaXNzb3IueG1pbiwgdnAtPnNjaXNzb3IueW1pbik7CisgICBzdGF0ZV9vdXQobmFtZSwgdnAsIHZwX29mZiwgNywgImJvdHRvbSByaWdodCA9ICVkLCVkXG4iLAorCSAgICAgdnAtPnNjaXNzb3IueG1heCwgdnAtPnNjaXNzb3IueW1heCk7CisKKyAgIGRyaV9ib191bm1hcChicnctPnNmLnZwX2JvKTsKK30KKworc3RhdGljIHZvaWQgYnJ3X2RlYnVnX3Byb2coY29uc3QgY2hhciAqbmFtZSwgZHJpX2JvICpwcm9nKQoreworICAgdW5zaWduZWQgaW50IGk7CisgICB1aW50MzJfdCAqZGF0YTsKKworICAgaWYgKHByb2cgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgZHJpX2JvX21hcChwcm9nLCBHTF9GQUxTRSk7CisKKyAgIGRhdGEgPSBwcm9nLT52aXJ0dWFsOworCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+c2l6ZSAvIDQgLyA0OyBpKyspIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJThzOiAweCUwOHg6IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKwkgICAgICBuYW1lLCAodW5zaWduZWQgaW50KXByb2ctPm9mZnNldCArIGkgKiA0ICogNCwKKwkgICAgICBkYXRhW2kgKiA0XSwgZGF0YVtpICogNCArIDFdLCBkYXRhW2kgKiA0ICsgMl0sIGRhdGFbaSAqIDQgKyAzXSk7CisgICB9CisKKyAgIGRyaV9ib191bm1hcChwcm9nKTsKK30KKworCisvKioKKyAqIFByaW50IGFkZGl0aW9uYWwgZGVidWcgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBiYXRjaGJ1ZmZlcgorICogd2hlbiBERUJVR19CQVRDSCBpcyBzZXQuCisgKgorICogRm9yIDk2NSwgdGhpcyBtZWFucyBtYXBwaW5nIHRoZSBzdGF0ZSBidWZmZXJzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQKKyAqIGJ5IHRoZSBiYXRjaGJ1ZmZlciBhbmQgZHVtcGluZyB0aGVtLgorICoKKyAqIFRoZSBidWZmZXIgb2Zmc2V0cyBwcmludGVkIHJlbHkgb24gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBsYXN0IG9mZnNldAorICogaXQgd2FzIHZhbGlkYXRlZCBhdC4KKyAqLwordm9pZCBicndfZGVidWdfYmF0Y2goc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dCgmaW50ZWwtPmN0eCk7CisKKyAgIHN0YXRlX3N0cnVjdF9vdXQoIldNIGJpbmQiLCBicnctPndtLmJpbmRfYm8sIDQgKiBicnctPndtLm5yX3N1cmZhY2VzKTsKKyAgIGR1bXBfd21fc3VyZmFjZV9zdGF0ZShicncpOworCisgICBzdGF0ZV9zdHJ1Y3Rfb3V0KCJWUyIsIGJydy0+dnMuc3RhdGVfYm8sIHNpemVvZihzdHJ1Y3QgYnJ3X3ZzX3VuaXRfc3RhdGUpKTsKKyAgIGJyd19kZWJ1Z19wcm9nKCJWUyBwcm9nIiwgYnJ3LT52cy5wcm9nX2JvKTsKKworICAgc3RhdGVfc3RydWN0X291dCgiR1MiLCBicnctPmdzLnN0YXRlX2JvLCBzaXplb2Yoc3RydWN0IGJyd19nc191bml0X3N0YXRlKSk7CisgICBicndfZGVidWdfcHJvZygiR1MgcHJvZyIsIGJydy0+Z3MucHJvZ19ibyk7CisKKyAgIHN0YXRlX3N0cnVjdF9vdXQoIlNGIiwgYnJ3LT5zZi5zdGF0ZV9ibywgc2l6ZW9mKHN0cnVjdCBicndfc2ZfdW5pdF9zdGF0ZSkpOworICAgZHVtcF9zZl92aWV3cG9ydF9zdGF0ZShicncpOworICAgYnJ3X2RlYnVnX3Byb2coIlNGIHByb2ciLCBicnctPnNmLnByb2dfYm8pOworCisgICBzdGF0ZV9zdHJ1Y3Rfb3V0KCJXTSIsIGJydy0+d20uc3RhdGVfYm8sIHNpemVvZihzdHJ1Y3QgYnJ3X3dtX3VuaXRfc3RhdGUpKTsKKyAgIGJyd19kZWJ1Z19wcm9nKCJXTSBwcm9nIiwgYnJ3LT53bS5wcm9nX2JvKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX3Bvb2wuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX3Bvb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5MjZmMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV9wb29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgKGh0dHA6Ly93d3cudHVuZ3N0ZW5ncmFwaGljcy5jb20pIHRvCi0gZGV2ZWxvcCB0aGlzIDNEIGRyaXZlci4KLSAKLSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCi0gcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIAotIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCi0gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoKLSAgKiBBdXRob3JzOgotICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgotICAqLwotICAgICAgIAotCi0jaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCi0jaW5jbHVkZSAiaW1wb3J0cy5oIgotCi0jaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKLSNpbmNsdWRlICJidWZtZ3IuaCIKLQotR0xib29sZWFuIGJyd19wb29sX2FsbG9jKCBzdHJ1Y3QgYnJ3X21lbV9wb29sICpwb29sLAotCQkJICBHTHVpbnQgc2l6ZSwKLQkJCSAgR0x1aW50IGFsaWduLAotCQkJICBHTHVpbnQgKm9mZnNldF9yZXR1cm4pCi17Ci0gICBHTHVpbnQgYWxpZ25fbWFzayA9ICgxPDxhbGlnbiktMTsKLSAgIEdMdWludCBmaXh1cCA9ICgocG9vbC0+b2Zmc2V0ICsgYWxpZ25fbWFzaykgJiB+YWxpZ25fbWFzaykgLSBwb29sLT5vZmZzZXQ7Ci0KLSAgIHNpemUgPSAoc2l6ZSArIDMpICYgfjM7Ci0KLSAgIGlmIChwb29sLT5vZmZzZXQgKyBmaXh1cCArIHNpemUgPj0gcG9vbC0+c2l6ZSkgewotICAgICAgX21lc2FfcHJpbnRmKCIlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICBhc3NlcnQoMCk7Ci0gICAgICBleGl0KDApOwotICAgfQotCi0gICBwb29sLT5vZmZzZXQgKz0gZml4dXA7Ci0gICAqb2Zmc2V0X3JldHVybiA9IHBvb2wtPm9mZnNldDsKLSAgIHBvb2wtPm9mZnNldCArPSBzaXplOyAKLSAgCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotc3RhdGljCi12b2lkIGJyd19pbnZhbGlkYXRlX3Bvb2woIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgc3RydWN0IGJyd19tZW1fcG9vbCAqcG9vbCApCi17Ci0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFURSkKLSAgICAgIF9tZXNhX3ByaW50ZigiXG5cblxuICVzIFxuXG5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAKLSAgIGJtQnVmZmVyRGF0YShpbnRlbCwKLQkJcG9vbC0+YnVmZmVyLAotCQlwb29sLT5zaXplLAotCQlOVUxMLAotCQkwKTsgCi0KLSAgIHBvb2wtPm9mZnNldCA9IDA7Ci0KLSAgIGJyd19jbGVhcl9hbGxfY2FjaGVzKHBvb2wtPmJydyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyd19pbnZhbGlkYXRlX3Bvb2xfY2IoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgdm9pZCAqcHRyICkKLXsKLSAgIHN0cnVjdCBicndfbWVtX3Bvb2wgKnBvb2wgPSAoc3RydWN0IGJyd19tZW1fcG9vbCAqKSBwdHI7Ci0KLSAgIHBvb2wtPm9mZnNldCA9IDA7Ci0gICBicndfY2xlYXJfYWxsX2NhY2hlcyhwb29sLT5icncpOwotfQotCi0KLQotc3RhdGljIHZvaWQgYnJ3X2luaXRfcG9vbCggc3RydWN0IGJyd19jb250ZXh0ICpicncsCi0JCQkgICBHTHVpbnQgcG9vbF9pZCwKLQkJCSAgIEdMdWludCBzaXplICkKLXsKLSAgIHN0cnVjdCBicndfbWVtX3Bvb2wgKnBvb2wgPSAmYnJ3LT5wb29sW3Bvb2xfaWRdOwotCi0gICBwb29sLT5zaXplID0gc2l6ZTsgICAKLSAgIHBvb2wtPmJydyA9IGJydzsKLSAgIAotICAgYm1HZW5CdWZmZXJzKCZicnctPmludGVsLCAicG9vbCIsIDEsICZwb29sLT5idWZmZXIsIDEyKTsKLQotICAgLyogQWxzbyB3YW50IHRvIHNheSBub3QgdG8gd2FpdCBvbiBmZW5jZXMgd2hlbiBkYXRhIGlzIHByZXNlbnRlZAotICAgICovCi0gICBibUJ1ZmZlclNldEludmFsaWRhdGVDQigmYnJ3LT5pbnRlbCwgcG9vbC0+YnVmZmVyLCAKLQkJCSAgIGJyd19pbnZhbGlkYXRlX3Bvb2xfY2IsIAotCQkJICAgcG9vbCwKLQkJCSAgIEdMX1RSVUUpOyAgIAotCi0gICBibUJ1ZmZlckRhdGEoJmJydy0+aW50ZWwsCi0JCXBvb2wtPmJ1ZmZlciwKLQkJcG9vbC0+c2l6ZSwKLQkJTlVMTCwKLQkJMCk7IAotCi19Ci0KLXN0YXRpYyB2b2lkIGJyd19kZXN0cm95X3Bvb2woIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJICAgICAgR0x1aW50IHBvb2xfaWQgKQotewotICAgc3RydWN0IGJyd19tZW1fcG9vbCAqcG9vbCA9ICZicnctPnBvb2xbcG9vbF9pZF07Ci0gICAKLSAgIGJtRGVsZXRlQnVmZmVycygmYnJ3LT5pbnRlbCwgMSwgJnBvb2wtPmJ1ZmZlcik7Ci19Ci0KLQotdm9pZCBicndfcG9vbF9jaGVja193cmFwKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKLQkJCSAgc3RydWN0IGJyd19tZW1fcG9vbCAqcG9vbCApCi17Ci0gICBpZiAocG9vbC0+b2Zmc2V0ID4gKHBvb2wtPnNpemUgKiAzKSAvIDQpIHsKLSAgICAgIGlmIChicnctPmludGVsLmF1Yl9maWxlKQotCSBicnctPmludGVsLmF1Yl93cmFwID0gMTsKLSAgICAgIGVsc2UKLQkgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gQlJXX05FV19DT05URVhUOwotICAgfQotCi19Ci0KLXZvaWQgYnJ3X2luaXRfcG9vbHMoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKLXsKLSAgIGJyd19pbml0X3Bvb2woYnJ3LCBCUldfR1NfUE9PTCwgMHg4MDAwMCk7Ci0gICBicndfaW5pdF9wb29sKGJydywgQlJXX1NTX1BPT0wsIDB4ODAwMDApOwotfQotCi12b2lkIGJyd19kZXN0cm95X3Bvb2xzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCi17Ci0gICBicndfZGVzdHJveV9wb29sKGJydywgQlJXX0dTX1BPT0wpOwotICAgYnJ3X2Rlc3Ryb3lfcG9vbChicncsIEJSV19TU19QT09MKTsKLX0KLQotCi12b2lkIGJyd19pbnZhbGlkYXRlX3Bvb2xzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCi17Ci0gICBicndfaW52YWxpZGF0ZV9wb29sKCZicnctPmludGVsLCAmYnJ3LT5wb29sW0JSV19HU19QT09MXSk7Ci0gICBicndfaW52YWxpZGF0ZV9wb29sKCZicnctPmludGVsLCAmYnJ3LT5wb29sW0JSV19TU19QT09MXSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdGF0ZV91cGxvYWQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX3VwbG9hZC5jCmluZGV4IDkyYzA3YzIuLmQxZDMxOWQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX3VwbG9hZC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0YXRlX3VwbG9hZC5jCkBAIC0zMyw3ICszMyw3IEBACiAKICNpbmNsdWRlICJicndfY29udGV4dC5oIgogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgotI2luY2x1ZGUgImJ1Zm1nci5oIgorI2luY2x1ZGUgImRyaV9idWZtZ3IuaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgogCiAvKiBUaGlzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBicnctPnN0YXRlLmF0b21zW10uICBXZSBjb3VsZCB1c2UgdGhpcwpAQCAtODAsMTkgKzgwLDE3IEBACiAgICAgKi8KICAgICZicndfaW52YXJpZW50X3N0YXRlLAogICAgJmJyd19zdGF0ZV9iYXNlX2FkZHJlc3MsCi0gICAmYnJ3X3BpcGVfY29udHJvbCwKIAogICAgJmJyd19iaW5kaW5nX3RhYmxlX3BvaW50ZXJzLAogICAgJmJyd19ibGVuZF9jb25zdGFudF9jb2xvciwKIAotICAgJmJyd19kcmF3aW5nX3JlY3QsCiAgICAmYnJ3X2RlcHRoYnVmZmVyLAogCiAgICAmYnJ3X3BvbHlnb25fc3RpcHBsZSwKICAgICZicndfcG9seWdvbl9zdGlwcGxlX29mZnNldCwKIAogICAgJmJyd19saW5lX3N0aXBwbGUsCi0KKyAgICZicndfYWFfbGluZV9wYXJhbWV0ZXJzLAogICAgLyogT3JkZXJpbmcgb2YgdGhlIGNvbW1hbmRzIGJlbG93IGlzIGRvY3VtZW50ZWQgYXMgZml4ZWQuICAKICAgICAqLwogI2lmIDAKQEAgLTEwMyw2ICsxMDEsOCBAQAogICAgJmJyd19wc3BfdXJiX2NicywKICNlbmRpZgogCisgICAmYnJ3X2luZGljZXMsCisgICAmYnJ3X3ZlcnRpY2VzLAogCiAgICBOVUxMLAkJCS8qIGJyd19jb25zdGFudF9idWZmZXIgKi8KIH07CkBAIC0xMTIsOCArMTEyLDcgQEAKIHsKICAgIEdMdWludCBpOwogCi0gICBicndfaW5pdF9wb29scyhicncpOwotICAgYnJ3X2luaXRfY2FjaGVzKGJydyk7CisgICBicndfaW5pdF9jYWNoZShicncpOwogCiAgICBicnctPnN0YXRlLmF0b21zID0gX21lc2FfbWFsbG9jKHNpemVvZihhdG9tcykpOwogICAgYnJ3LT5zdGF0ZS5ucl9hdG9tcyA9IHNpemVvZihhdG9tcykvc2l6ZW9mKCphdG9tcyk7CkBAIC0xMzgsOSArMTM3LDggQEAKICAgICAgIGJydy0+c3RhdGUuYXRvbXMgPSBOVUxMOwogICAgfQogCi0gICBicndfZGVzdHJveV9jYWNoZXMoYnJ3KTsKKyAgIGJyd19kZXN0cm95X2NhY2hlKGJydyk7CiAgICBicndfZGVzdHJveV9iYXRjaF9jYWNoZShicncpOwotICAgYnJ3X2Rlc3Ryb3lfcG9vbHMoYnJ3KTsgICAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzgsOCArMTc2LDEwIEBACiAgKi8KIHZvaWQgYnJ3X3ZhbGlkYXRlX3N0YXRlKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKICAgIHN0cnVjdCBicndfc3RhdGVfZmxhZ3MgKnN0YXRlID0gJmJydy0+c3RhdGUuZGlydHk7Ci0gICBHTHVpbnQgaTsKKyAgIEdMdWludCBpLCBjb3VudCwgcGFzcyA9IDA7CisgICBkcmlfYm8gKmxhc3RfYmF0Y2hfYm8gPSBOVUxMOwogCiAgICBzdGF0ZS0+bWVzYSB8PSBicnctPmludGVsLk5ld0dMU3RhdGU7CiAgICBicnctPmludGVsLk5ld0dMU3RhdGUgPSAwOwpAQCAtMjEwLDEzICsyMTAsMzYgQEAKICAgIGlmIChicnctPnN0YXRlLmRpcnR5LmJydyAmIEJSV19ORVdfQ09OVEVYVCkKICAgICAgIGJyd19jbGVhcl9iYXRjaF9jYWNoZV9mbHVzaChicncpOwogCisgICBicnctPmludGVsLkZhbGxiYWNrID0gMDsKIAotICAgLyogTWFrZSBhbiBlYXJseSByZWZlcmVuY2UgdG8gdGhlIHN0YXRlIHBvb2xzLCBhcyB3ZSBkb24ndCBjb3BlCi0gICAgKiB3ZWxsIHdpdGggdGhlbSBiZWluZyBldmljdGVkIGZyb20gaGVyZSBkb3duLgorICAgY291bnQgPSAwOworCisgICAvKiBkbyBwcmVwYXJlIHN0YWdlIGZvciBhbGwgYXRvbXMgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBFbGVtZW50cyhhdG9tcyk7IGkrKykgeworICAgICAgY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlICphdG9tID0gYnJ3LT5zdGF0ZS5hdG9tc1tpXTsKKworICAgICAgaWYgKGJydy0+aW50ZWwuRmFsbGJhY2spCisgICAgICAgICBicmVhazsKKworICAgICAgaWYgKGNoZWNrX3N0YXRlKHN0YXRlLCAmYXRvbS0+ZGlydHkpKSB7CisgICAgICAgICBpZiAoYXRvbS0+cHJlcGFyZSkgeworICAgICAgICAgICAgYXRvbS0+cHJlcGFyZShicncpOworICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGlmIChicnctPmludGVsLkZhbGxiYWNrKQorICAgICAgcmV0dXJuOworCisgICAvKiBXZSdyZSBhYm91dCB0byB0cnkgdG8gc2V0IHVwIGEgY29oZXJlbnQgc3RhdGUgaW4gdGhlIGJhdGNoYnVmZmVyIGZvcgorICAgICogdGhlIGVtaXNzaW9uIG9mIHByaW1pdGl2ZXMuICBJZiB3ZSBleGNlZWQgdGhlIGFwZXJ0dXJlIHNpemUgaW4gYW55IG9mIHRoZQorICAgICogZW1pdCgpIGNhbGxzLCB3ZSBuZWVkIHRvIGdvIGJhY2sgdG8gc3F1YXJlIDEgYW5kIHRyeSBzZXR0aW5nIHVwIGFnYWluLgogICAgICovCi0gICAodm9pZClibUJ1ZmZlck9mZnNldCgmYnJ3LT5pbnRlbCwgYnJ3LT5wb29sW0JSV19HU19QT09MXS5idWZmZXIpOwotICAgKHZvaWQpYm1CdWZmZXJPZmZzZXQoJmJydy0+aW50ZWwsIGJydy0+cG9vbFtCUldfU1NfUE9PTF0uYnVmZmVyKTsKLSAgICh2b2lkKWJtQnVmZmVyT2Zmc2V0KCZicnctPmludGVsLCBicnctPmludGVsLmJhdGNoLT5idWZmZXIpOworZ290X2ZsdXNoZWQ6CisgICBkcmlfYm9fdW5yZWZlcmVuY2UobGFzdF9iYXRjaF9ibyk7CisgICBsYXN0X2JhdGNoX2JvID0gaW50ZWwtPmJhdGNoLT5idWY7CisgICBkcmlfYm9fcmVmZXJlbmNlKGxhc3RfYmF0Y2hfYm8pOworICAgYXNzZXJ0KHBhc3MrKyA8PSAyKTsKIAogICAgaWYgKElOVEVMX0RFQlVHKSB7CiAgICAgICAvKiBEZWJ1ZyB2ZXJzaW9uIHdoaWNoIGVuZm9yY2VzIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyBvbiB0aGUKQEAgLTIzNCwxMiArMjU3LDE2IEBACiAJIGFzc2VydChhdG9tLT5kaXJ0eS5tZXNhIHx8CiAJCWF0b20tPmRpcnR5LmJydyB8fAogCQlhdG9tLT5kaXJ0eS5jYWNoZSk7Ci0JIGFzc2VydChhdG9tLT51cGRhdGUpOworCisJIGlmIChicnctPmludGVsLkZhbGxiYWNrKQorCSAgICBicmVhazsKIAogCSBpZiAoY2hlY2tfc3RhdGUoc3RhdGUsICZhdG9tLT5kaXJ0eSkpIHsKLQkgICAgYnJ3LT5zdGF0ZS5hdG9tc1tpXS0+dXBkYXRlKCBicncgKTsKLQkgICAgCi0vKiAJICAgIGVtaXRfZm9vKGJydyk7ICovCisJICAgIGlmIChhdG9tLT5lbWl0KSB7CisJICAgICAgIGF0b20tPmVtaXQoIGJydyApOworCSAgICAgICBpZiAoaW50ZWwtPmJhdGNoLT5idWYgIT0gbGFzdF9iYXRjaF9ibykKKwkJICBnb3RvIGdvdF9mbHVzaGVkOworCSAgICB9CiAJIH0KIAogCSBhY2N1bXVsYXRlX3N0YXRlKCZleGFtaW5lZCwgJmF0b20tPmRpcnR5KTsKQEAgLTI1NSwxMCArMjgyLDIzIEBACiAgICB9CiAgICBlbHNlIHsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBFbGVtZW50cyhhdG9tcyk7IGkrKykgewkgCi0JIGlmIChjaGVja19zdGF0ZShzdGF0ZSwgJmJydy0+c3RhdGUuYXRvbXNbaV0tPmRpcnR5KSkKLQkgICAgYnJ3LT5zdGF0ZS5hdG9tc1tpXS0+dXBkYXRlKCBicncgKTsKKwkgY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlICphdG9tID0gYnJ3LT5zdGF0ZS5hdG9tc1tpXTsKKworCSBpZiAoYnJ3LT5pbnRlbC5GYWxsYmFjaykKKwkgICAgYnJlYWs7CisKKwkgaWYgKGNoZWNrX3N0YXRlKHN0YXRlLCAmYXRvbS0+ZGlydHkpKSB7CisJICAgIGlmIChhdG9tLT5lbWl0KSB7CisJICAgICAgIGF0b20tPmVtaXQoIGJydyApOworCSAgICAgICBpZiAoaW50ZWwtPmJhdGNoLT5idWYgIT0gbGFzdF9iYXRjaF9ibykKKwkJICBnb3RvIGdvdF9mbHVzaGVkOworCSAgICB9CisJIH0KICAgICAgIH0KICAgIH0KIAotICAgbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisgICBkcmlfYm9fdW5yZWZlcmVuY2UobGFzdF9iYXRjaF9ibyk7CisKKyAgIGlmICghYnJ3LT5pbnRlbC5GYWxsYmFjaykKKyAgICAgIG1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RydWN0cy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfc3RydWN0cy5oCmluZGV4IDEwZmVlOTQuLmVjODY1YzkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3N0cnVjdHMuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd19zdHJ1Y3RzLmgKQEAgLTE0MSw3ICsxNDEsOCBAQAogICAgICAgc3RydWN0IHsKIAkgR0x1aW50IHBpdGNoOjE4OyAKIAkgR0x1aW50IGZvcm1hdDozOyAKLQkgR0x1aW50IHBhZDo0OworCSBHTHVpbnQgcGFkOjI7CisJIEdMdWludCBzb2Z0d2FyZV90aWxlZF9yZW5kZXJpbmdfbW9kZToyOwogCSBHTHVpbnQgZGVwdGhfb2Zmc2V0X2Rpc2FibGU6MTsgCiAJIEdMdWludCB0aWxlX3dhbGs6MTsgCiAJIEdMdWludCB0aWxlZF9zdXJmYWNlOjE7IApAQCAtMTY2LDE0ICsxNjcsNjQgQEAKIAogICAgdW5pb24gewogICAgICAgc3RydWN0IHsKLQkgR0x1aW50IHBhZDoxMjsKLQkgR0x1aW50IG1pbl9hcnJheV9lbGVtZW50Ojk7IAorCSBHTHVpbnQgcGFkOjEwOworCSBHTHVpbnQgbWluX2FycmF5X2VsZW1lbnQ6MTE7IAogCSBHTHVpbnQgZGVwdGg6MTE7IAogICAgICAgfSBiaXRzOwogICAgICAgR0x1aW50IGR3b3JkOwogICAgfSBkd29yZDQ7CiB9OwogCitzdHJ1Y3QgYnJ3X2RlcHRoYnVmZmVyX2dtNDVfZzR4Cit7CisgICB1bmlvbiBoZWFkZXJfdW5pb24gaGVhZGVyOworICAgCisgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgeworCSBHTHVpbnQgcGl0Y2g6MTg7IAorCSBHTHVpbnQgZm9ybWF0OjM7IAorCSBHTHVpbnQgcGFkOjI7CisJIEdMdWludCBzb2Z0d2FyZV90aWxlZF9yZW5kZXJpbmdfbW9kZToyOworCSBHTHVpbnQgZGVwdGhfb2Zmc2V0X2Rpc2FibGU6MTsgCisJIEdMdWludCB0aWxlX3dhbGs6MTsgCisJIEdMdWludCB0aWxlZF9zdXJmYWNlOjE7IAorCSBHTHVpbnQgcGFkMjoxOworCSBHTHVpbnQgc3VyZmFjZV90eXBlOjM7IAorICAgICAgfSBiaXRzOworICAgICAgR0x1aW50IGR3b3JkOworICAgfSBkd29yZDE7CisgICAKKyAgIEdMdWludCBkd29yZDJfYmFzZV9hZGRyOyAKKyAKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisJIEdMdWludCBwYWQ6MTsKKwkgR0x1aW50IG1pcG1hcF9sYXlvdXQ6MTsgCisJIEdMdWludCBsb2Q6NDsgCisJIEdMdWludCB3aWR0aDoxMzsgCisJIEdMdWludCBoZWlnaHQ6MTM7IAorICAgICAgfSBiaXRzOworICAgICAgR0x1aW50IGR3b3JkOworICAgfSBkd29yZDM7CisKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisJIEdMdWludCBwYWQ6MTA7CisJIEdMdWludCBtaW5fYXJyYXlfZWxlbWVudDoxMTsgCisJIEdMdWludCBkZXB0aDoxMTsgCisgICAgICB9IGJpdHM7CisgICAgICBHTHVpbnQgZHdvcmQ7CisgICB9IGR3b3JkNDsKKworICAgdW5pb24geworICAgICAgc3RydWN0IHsKKyAgICAgICAgIEdMdWludCB4b2Zmc2V0OjE2OworICAgICAgICAgR0x1aW50IHlvZmZzZXQ6MTY7CisgICAgICB9IGJpdHM7CisgICAgICBHTHVpbnQgZHdvcmQ7CisgICB9IGR3b3JkNTsgICAvKiBORVcgaW4gSW50ZWdyYXRlZCBHcmFwaGljcyBEZXZpY2UgKi8KK307CisKIHN0cnVjdCBicndfZHJhd3JlY3QKIHsKICAgIHN0cnVjdCBoZWFkZXIgaGVhZGVyOwpAQCAtMjEzLDYgKzI2NCwyNSBAQAogICAgR0x1aW50IGJ1ZmZlcl9lbmQ7IAogfTsKIAorLyogTkVXIGluIEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlICovCitzdHJ1Y3QgYnJ3X2FhX2xpbmVfcGFyYW1ldGVycworeworICAgc3RydWN0IGhlYWRlciBoZWFkZXI7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgYWFfY292ZXJhZ2Vfc2NvcGU6ODsKKyAgICAgIEdMdWludCBwYWQwOjg7CisgICAgICBHTHVpbnQgYWFfY292ZXJhZ2VfYmlhczo4OworICAgICAgR0x1aW50IHBhZDE6ODsKKyAgIH0gYml0czA7CisKKyAgIHN0cnVjdCB7CisgICAgICBHTHVpbnQgYWFfY292ZXJhZ2VfZW5kY2FwX3Nsb3BlOjg7CisgICAgICBHTHVpbnQgcGFkMDo4OworICAgICAgR0x1aW50IGFhX2NvdmVyYWdlX2VuZGNhcF9iaWFzOjg7CisgICAgICBHTHVpbnQgcGFkMTo4OworICAgfSBiaXRzMTsKK307CiAKIHN0cnVjdCBicndfbGluZV9zdGlwcGxlCiB7ICAgCkBAIC0yMzksMzkgKzMwOSwzOSBAQAogICAgCiAgICBzdHJ1Y3QgewogICAgICAgR0x1aW50IHBhZDo1OwotICAgICAgR0x1aW50IG9mZnNldDoyNzsgCisgICAgICBHTHVpbnQgb2Zmc2V0OjI3OyAvKiBPZmZzZXQgZnJvbSBHRU5FUkFMX1NUQVRFX0JBU0UgKi8KICAgIH0gdnM7CiAgICAKICAgIHN0cnVjdAogICAgewogICAgICAgR0x1aW50IGVuYWJsZToxOwogICAgICAgR0x1aW50IHBhZDo0OwotICAgICAgR0x1aW50IG9mZnNldDoyNzsgCisgICAgICBHTHVpbnQgb2Zmc2V0OjI3OyAvKiBPZmZzZXQgZnJvbSBHRU5FUkFMX1NUQVRFX0JBU0UgKi8KICAgIH0gZ3M7CiAgICAKICAgIHN0cnVjdAogICAgewogICAgICAgR0x1aW50IGVuYWJsZToxOwogICAgICAgR0x1aW50IHBhZDo0OwotICAgICAgR0x1aW50IG9mZnNldDoyNzsgCisgICAgICBHTHVpbnQgb2Zmc2V0OjI3OyAvKiBPZmZzZXQgZnJvbSBHRU5FUkFMX1NUQVRFX0JBU0UgKi8KICAgIH0gY2xwOwogICAgCiAgICBzdHJ1Y3QKICAgIHsKICAgICAgIEdMdWludCBwYWQ6NTsKLSAgICAgIEdMdWludCBvZmZzZXQ6Mjc7IAorICAgICAgR0x1aW50IG9mZnNldDoyNzsgLyogT2Zmc2V0IGZyb20gR0VORVJBTF9TVEFURV9CQVNFICovCiAgICB9IHNmOwogCiAgICBzdHJ1Y3QKICAgIHsKICAgICAgIEdMdWludCBwYWQ6NTsKLSAgICAgIEdMdWludCBvZmZzZXQ6Mjc7IAorICAgICAgR0x1aW50IG9mZnNldDoyNzsgLyogT2Zmc2V0IGZyb20gR0VORVJBTF9TVEFURV9CQVNFICovCiAgICB9IHdtOwogICAgCiAgICBzdHJ1Y3QKICAgIHsKICAgICAgIEdMdWludCBwYWQ6NTsKLSAgICAgIEdMdWludCBvZmZzZXQ6Mjc7IC8qIEtXOiBjaGVjayBtZSEgKi8KKyAgICAgIEdMdWludCBvZmZzZXQ6Mjc7IC8qIE9mZnNldCBmcm9tIEdFTkVSQUxfU1RBVEVfQkFTRS4gS1c6IGNoZWNrIG1lISAqLwogICAgfSBjYzsKIH07CiAKQEAgLTMxNSw3ICszODUsOCBAQAogICAgewogICAgICAgR0x1aW50IGxlbmd0aDo4OwogICAgICAgR0x1aW50IG5vdGlmeV9lbmFibGU6MTsKLSAgICAgIEdMdWludCBwYWQ6MjsKKyAgICAgIEdMdWludCB0ZXh0dXJlX2NhY2hlX2ZsdXNoX2VuYWJsZToxOworICAgICAgR0x1aW50IGluZGlyZWN0X3N0YXRlX3BvaW50ZXJzX2Rpc2FibGU6MTsKICAgICAgIEdMdWludCBpbnN0cnVjdGlvbl9zdGF0ZV9jYWNoZV9mbHVzaF9lbmFibGU6MTsKICAgICAgIEdMdWludCB3cml0ZV9jYWNoZV9mbHVzaF9lbmFibGU6MTsKICAgICAgIEdMdWludCBkZXB0aF9zdGFsbF9lbmFibGU6MTsKQEAgLTQ3Myw3ICs1NDQsNyBAQAogICAgR0x1aW50IHBhZDA6MTsKICAgIEdMdWludCBncmZfcmVnX2NvdW50OjM7IAogICAgR0x1aW50IHBhZDE6MjsKLSAgIEdMdWludCBrZXJuZWxfc3RhcnRfcG9pbnRlcjoyNjsgCisgICBHTHVpbnQga2VybmVsX3N0YXJ0X3BvaW50ZXI6MjY7IC8qIE9mZnNldCBmcm9tIEdFTkVSQUxfU1RBVEVfQkFTRSAqLwogfTsKIAogc3RydWN0IHRocmVhZDEKQEAgLTU0Nyw4ICs2MTgsOCBAQAogICAgICAgR0x1aW50IHBhZDE6MTsKICAgICAgIEdMdWludCB1cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplOjU7IAogICAgICAgR0x1aW50IHBhZDI6MTsKLSAgICAgIEdMdWludCBtYXhfdGhyZWFkczoxOyAJLyogbWF5IGJlIGxlc3MgKi8KLSAgICAgIEdMdWludCBwYWQzOjY7CisgICAgICBHTHVpbnQgbWF4X3RocmVhZHM6NTsgCS8qIG1heSBiZSBsZXNzICovCisgICAgICBHTHVpbnQgcGFkMzoyOwogICAgfSB0aHJlYWQ0OyAgIAogICAgICAgCiAgICBzdHJ1Y3QKQEAgLTU1Nyw3ICs2MjgsNyBAQAogICAgICAgR0x1aW50IGNsaXBfbW9kZTozOyAKICAgICAgIEdMdWludCB1c2VyY2xpcF9lbmFibGVfZmxhZ3M6ODsgCiAgICAgICBHTHVpbnQgdXNlcmNsaXBfbXVzdF9jbGlwOjE7IAotICAgICAgR0x1aW50IHBhZDE6MTsKKyAgICAgIEdMdWludCBuZWdhdGl2ZV93X2NsaXBfdGVzdDoxOwogICAgICAgR0x1aW50IGd1YXJkX2JhbmRfZW5hYmxlOjE7IAogICAgICAgR0x1aW50IHZpZXdwb3J0X3pfY2xpcF9lbmFibGU6MTsgCiAgICAgICBHTHVpbnQgdmlld3BvcnRfeHlfY2xpcF9lbmFibGU6MTsgCkBAIC02MzcsNyArNzA4LDcgQEAKICAgIHN0cnVjdAogICAgewogICAgICAgR0x1aW50IHBhZDA6NTsgCi0gICAgICBHTHVpbnQgY2Nfdmlld3BvcnRfc3RhdGVfb2Zmc2V0OjI3OyAKKyAgICAgIEdMdWludCBjY192aWV3cG9ydF9zdGF0ZV9vZmZzZXQ6Mjc7IC8qIE9mZnNldCBmcm9tIEdFTkVSQUxfU1RBVEVfQkFTRSAqLwogICAgfSBjYzQ7CiAgICAKICAgIHN0cnVjdApAQCAtNjk5LDcgKzc3MCw3IEBACiAgICAgICBHTHVpbnQgZnJvbnRfd2luZGluZzoxOyAKICAgICAgIEdMdWludCB2aWV3cG9ydF90cmFuc2Zvcm06MTsgCiAgICAgICBHTHVpbnQgcGFkMDozOwotICAgICAgR0x1aW50IHNmX3ZpZXdwb3J0X3N0YXRlX29mZnNldDoyNzsgCisgICAgICBHTHVpbnQgc2Zfdmlld3BvcnRfc3RhdGVfb2Zmc2V0OjI3OyAvKiBPZmZzZXQgZnJvbSBHRU5FUkFMX1NUQVRFX0JBU0UgKi8KICAgIH0gc2Y1OwogICAgCiAgICBzdHJ1Y3QKQEAgLTcyNCw3ICs3OTUsOCBAQAogICAgICAgR0x1aW50IHVzZV9wb2ludF9zaXplX3N0YXRlOjE7IAogICAgICAgR0x1aW50IHN1YnBpeGVsX3ByZWNpc2lvbjoxOyAKICAgICAgIEdMdWludCBzcHJpdGVfcG9pbnQ6MTsgCi0gICAgICBHTHVpbnQgcGFkMDoxMTsKKyAgICAgIEdMdWludCBwYWQwOjEwOworICAgICAgR0x1aW50IGFhX2xpbmVfZGlzdGFuY2VfbW9kZToxOwogICAgICAgR0x1aW50IHRyaWZhbl9wdjoyOyAKICAgICAgIEdMdWludCBsaW5lc3RyaXBfcHY6MjsgCiAgICAgICBHTHVpbnQgdHJpc3RyaXBfcHY6MjsgCkBAIC03NDksOCArODIxLDggQEAKICAgICAgIEdMdWludCBwYWQxOjE7CiAgICAgICBHTHVpbnQgdXJiX2VudHJ5X2FsbG9jYXRpb25fc2l6ZTo1OyAKICAgICAgIEdMdWludCBwYWQyOjE7Ci0gICAgICBHTHVpbnQgbWF4X3RocmVhZHM6MTsgCi0gICAgICBHTHVpbnQgcGFkMzo2OworICAgICAgR0x1aW50IG1heF90aHJlYWRzOjU7IAorICAgICAgR0x1aW50IHBhZDM6MjsKICAgIH0gdGhyZWFkNDsgICAKICAgICAgIAogICAgc3RydWN0CkBAIC03NjQsOSArODM2LDE0IEBACiAgICBzdHJ1Y3QKICAgIHsKICAgICAgIEdMdWludCBtYXhfdnBfaW5kZXg6NDsgCi0gICAgICBHTHVpbnQgcGFkMDoyNjsKLSAgICAgIEdMdWludCByZW9yZGVyX2VuYWJsZToxOyAKKyAgICAgIEdMdWludCBwYWQwOjEyOworICAgICAgR0x1aW50IHN2YmlfcG9zdF9pbmNfdmFsdWU6MTA7CiAgICAgICBHTHVpbnQgcGFkMToxOworICAgICAgR0x1aW50IHN2YmlfcG9zdF9pbmNfZW5hYmxlOjE7CisgICAgICBHTHVpbnQgc3ZiaV9wYXlsb2FkOjE7CisgICAgICBHTHVpbnQgZGlzY2FyZF9hZGphY2VueToxOworICAgICAgR0x1aW50IHJlb3JkZXJfZW5hYmxlOjE7IAorICAgICAgR0x1aW50IHBhZDI6MTsKICAgIH0gZ3M2OwogfTsKIApAQCAtNzg2LDggKzg2Myw4IEBACiAgICAgICBHTHVpbnQgcGFkMToxOwogICAgICAgR0x1aW50IHVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemU6NTsgCiAgICAgICBHTHVpbnQgcGFkMjoxOwotICAgICAgR0x1aW50IG1heF90aHJlYWRzOjQ7IAotICAgICAgR0x1aW50IHBhZDM6MzsKKyAgICAgIEdMdWludCBtYXhfdGhyZWFkczo2OyAKKyAgICAgIEdMdWludCBwYWQzOjE7CiAgICB9IHRocmVhZDQ7ICAgCiAKICAgIHN0cnVjdApAQCAtODE1LDcgKzg5Miw3IEBACiAgICAKICAgIHN0cnVjdCB7CiAgICAgICBHTHVpbnQgc3RhdHNfZW5hYmxlOjE7IAotICAgICAgR0x1aW50IHBhZDA6MTsKKyAgICAgIEdMdWludCBkZXB0aF9idWZmZXJfY2xlYXI6MTsKICAgICAgIEdMdWludCBzYW1wbGVyX2NvdW50OjM7IAogICAgICAgR0x1aW50IHNhbXBsZXJfc3RhdGVfcG9pbnRlcjoyNzsgCiAgICB9IHdtNDsKQEAgLTgyNSw3ICs5MDIsOSBAQAogICAgICAgR0x1aW50IGVuYWJsZV84X3BpeDoxOyAKICAgICAgIEdMdWludCBlbmFibGVfMTZfcGl4OjE7IAogICAgICAgR0x1aW50IGVuYWJsZV8zMl9waXg6MTsgCi0gICAgICBHTHVpbnQgcGFkMDo3OworICAgICAgR0x1aW50IGVuYWJsZV9jb25fMzJfcGl4OjE7CisgICAgICBHTHVpbnQgZW5hYmxlX2Nvbl82NF9waXg6MTsKKyAgICAgIEdMdWludCBwYWQwOjU7CiAgICAgICBHTHVpbnQgbGVnYWN5X2dsb2JhbF9kZXB0aF9iaWFzOjE7IAogICAgICAgR0x1aW50IGxpbmVfc3RpcHBsZToxOyAKICAgICAgIEdMdWludCBkZXB0aF9vZmZzZXQ6MTsgCkBAIC04MzgsOSArOTE3LDggQEAKICAgICAgIEdMdWludCBwcm9ncmFtX2NvbXB1dGVzX2RlcHRoOjE7IAogICAgICAgR0x1aW50IHByb2dyYW1fdXNlc19raWxscGl4ZWw6MTsgCiAgICAgICBHTHVpbnQgbGVnYWN5X2xpbmVfcmFzdDogMTsgCi0gICAgICBHTHVpbnQgcGFkMToxOyAKLSAgICAgIEdMdWludCBtYXhfdGhyZWFkczo2OyAKLSAgICAgIEdMdWludCBwYWQyOjE7CisgICAgICBHTHVpbnQgdHJhbnNwb3NlZF91cmJfcmVhZF9lbmFibGU6MTsgCisgICAgICBHTHVpbnQgbWF4X3RocmVhZHM6NzsgCiAgICB9IHdtNTsKICAgIAogICAgR0xmbG9hdCBnbG9iYWxfZGVwdGhfb2Zmc2V0X2NvbnN0YW50OyAgCkBAIC05MjQsNiArMTAwMiw3IEBACiAgICAgICBHTGZsb2F0IG0zMjsgIAogICAgfSB2aWV3cG9ydDsKIAorICAgLyogc2Npc3NvciBjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlICovCiAgICBzdHJ1Y3QgewogICAgICAgR0xzaG9ydCB4bWluOwogICAgICAgR0xzaG9ydCB5bWluOwpAQCAtOTc4LDEwICsxMDU3LDI2IEBACiAgICB9IHNzMzsKICAgIAogICAgc3RydWN0IHsKLSAgICAgIEdMdWludCBwYWQ6MTk7Ci0gICAgICBHTHVpbnQgbWluX2FycmF5X2VsdDo5OyAKKyAgICAgIEdMdWludCBtdWx0aXNhbXBsZV9wb3NpdGlvbl9wYWxldHRlX2luZGV4OjM7CisgICAgICBHTHVpbnQgcGFkMToxOworICAgICAgR0x1aW50IG51bV9tdWx0aXNhbXBsZXM6MzsKKyAgICAgIEdMdWludCBwYWQwOjE7CisgICAgICBHTHVpbnQgcmVuZGVyX3RhcmdldF92aWV3X2V4dGVudDo5OworICAgICAgR0x1aW50IG1pbl9hcnJheV9lbHQ6MTE7CiAgICAgICBHTHVpbnQgbWluX2xvZDo0OyAKICAgIH0gc3M0OworCisgICBzdHJ1Y3QgeworICAgICAgR0x1aW50IHBhZDE6MTY7CisgICAgICBHTHVpbnQgbGxjX21hcHBpbmc6MTsKKyAgICAgIEdMdWludCBtbGNfbWFwcGluZzoxOworICAgICAgR0x1aW50IGdmZHQ6MTsKKyAgICAgIEdMdWludCBnZmR0X3NyYzoxOworICAgICAgR0x1aW50IHlfb2Zmc2V0OjQ7CisgICAgICBHTHVpbnQgcGFkMDoxOworICAgICAgR0x1aW50IHhfb2Zmc2V0Ojc7CisgICB9IHNzNTsgICAvKiBORVcgaW4gSW50ZWdyYXRlZCBHcmFwaGljcyBEZXZpY2UgKi8KKwogfTsKIAogCkBAIC0xMzAxLDYgKzEzOTYsMTcgQEAKIAkgR0x1aW50IGVuZF9vZl90aHJlYWQ6MTsKICAgICAgIH0gc2FtcGxlcjsKIAorICAgICAgc3RydWN0IHsKKyAgICAgICAgIEdMdWludCBiaW5kaW5nX3RhYmxlX2luZGV4Ojg7CisgICAgICAgICBHTHVpbnQgc2FtcGxlcjo0OworICAgICAgICAgR0x1aW50IG1zZ190eXBlOjQ7CisgICAgICAgICBHTHVpbnQgcmVzcG9uc2VfbGVuZ3RoOjQ7CisgICAgICAgICBHTHVpbnQgbXNnX2xlbmd0aDo0OworICAgICAgICAgR0x1aW50IG1zZ190YXJnZXQ6NDsKKyAgICAgICAgIEdMdWludCBwYWQxOjM7CisgICAgICAgICBHTHVpbnQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBzYW1wbGVyX2dtNDVfZzR4OyAKKwogICAgICAgc3RydWN0IGJyd191cmJfaW1tZWRpYXRlIHVyYjsKIAogICAgICAgc3RydWN0IHsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3RleC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdGV4LmMKaW5kZXggOWQ0Yjk4Ni4uMjU4YzYyNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdGV4LmMKQEAgLTQ0LDE1MSArNDQsMTYgQEAKICNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCiAjaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKICNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfdGV4LmgiCiAjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogCiAKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfZm9ybWF0ICoKLWJyd0Nob29zZVRleHR1cmVGb3JtYXQoIEdMY29udGV4dCAqY3R4LCBHTGludCBpbnRlcm5hbEZvcm1hdCwKLQkJCSBHTGVudW0gc3JjRm9ybWF0LCBHTGVudW0gc3JjVHlwZSApCi17Ci0gICBzd2l0Y2ggKCBpbnRlcm5hbEZvcm1hdCApIHsKLSAgIGNhc2UgNDoKLSAgIGNhc2UgR0xfUkdCQToKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBOgotICAgICAgaWYgKHNyY0Zvcm1hdCA9PSBHTF9CR1JBICYmIHNyY1R5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYpCi0JIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I0NDQ0OwotICAgICAgZWxzZSBpZiAoc3JjRm9ybWF0ID09IEdMX0JHUkEgJiYgc3JjVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVikKLQkgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjE1NTU7Ci0gICAgICBlbHNlIGlmICgoc3JjRm9ybWF0ID09IEdMX1JHQkEgJiYgc3JjVHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYpIHx8Ci0JICAgICAgIChzcmNGb3JtYXQgPT0gR0xfUkdCQSAmJiBzcmNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8Ci0JICAgICAgIChzcmNGb3JtYXQgPT0gR0xfQUJHUl9FWFQgJiYgc3JjVHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCkpIAotCSByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhODg4OF9yZXY7Ci0gICAgICBlbHNlCi0JIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I4ODg4OwotCi0gICBjYXNlIEdMX1JHQkE4OgotICAgY2FzZSBHTF9SR0IxMF9BMjoKLSAgIGNhc2UgR0xfUkdCQTEyOgotICAgY2FzZSBHTF9SR0JBMTY6Ci0gICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4ODsgCi0KLSAgIGNhc2UgR0xfUkdCODoKLSAgIGNhc2UgR0xfUkdCMTA6Ci0gICBjYXNlIEdMX1JHQjEyOgotICAgY2FzZSBHTF9SR0IxNjoKLSAgICAgIC8qIEJyb2Fkd2F0ZXIgZG9lc24ndCBzdXBwb3J0IFJHQjg4OCB0ZXh0dXJlcywgc28gdGhlc2UgbXVzdCBiZQotICAgICAgICogc3RvcmVkIGFzIEFSR0IuCi0gICAgICAgKi8KLSAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I4ODg4OwotCi0gICBjYXNlIDM6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCOgotICAgY2FzZSBHTF9SR0I6Ci0gICAgICBpZiAoc3JjRm9ybWF0ID09IEdMX1JHQiAmJgotCSAgc3JjVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkKLQkgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiNTY1OwotICAgICAgZWxzZQotCSByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4ODsKLQotCi0gICBjYXNlIEdMX1JHQjU6Ci0gICBjYXNlIEdMX1JHQjVfQTE6Ci0gICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiMTU1NTsKLQotICAgY2FzZSBHTF9SM19HM19CMjoKLSAgIGNhc2UgR0xfUkdCQTI6Ci0gICBjYXNlIEdMX1JHQkE0OgotICAgY2FzZSBHTF9SR0I0OgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjQ0NDQ7Ci0KLSAgIGNhc2UgR0xfQUxQSEE6Ci0gICBjYXNlIEdMX0FMUEhBNDoKLSAgIGNhc2UgR0xfQUxQSEE4OgotICAgY2FzZSBHTF9BTFBIQTEyOgotICAgY2FzZSBHTF9BTFBIQTE2OgotICAgY2FzZSBHTF9DT01QUkVTU0VEX0FMUEhBOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYTg7Ci0KLSAgIGNhc2UgMToKLSAgIGNhc2UgR0xfTFVNSU5BTkNFOgotICAgY2FzZSBHTF9MVU1JTkFOQ0U0OgotICAgY2FzZSBHTF9MVU1JTkFOQ0U4OgotICAgY2FzZSBHTF9MVU1JTkFOQ0UxMjoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFMTY6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfbDg7Ci0KLSAgIGNhc2UgMjoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgotICAgY2FzZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNDoKLSAgIGNhc2UgR0xfTFVNSU5BTkNFNl9BTFBIQTI6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRThfQUxQSEE4OgotICAgY2FzZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTQ6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTI6Ci0gICBjYXNlIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTY6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBOgotICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYWw4ODsKLQotICAgY2FzZSBHTF9JTlRFTlNJVFk6Ci0gICBjYXNlIEdMX0lOVEVOU0lUWTQ6Ci0gICBjYXNlIEdMX0lOVEVOU0lUWTg6Ci0gICBjYXNlIEdMX0lOVEVOU0lUWTEyOgotICAgY2FzZSBHTF9JTlRFTlNJVFkxNjoKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFk6Ci0gICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9pODsKLQotICAgY2FzZSBHTF9ZQ0JDUl9NRVNBOgotICAgICAgaWYgKHNyY1R5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgfHwKLQkgIHNyY1R5cGUgPT0gR0xfVU5TSUdORURfQllURSkKLSAgICAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3ljYmNyOwotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfeWNiY3JfcmV2OwotCi0gICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWDoKLSAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JfZnh0MTsKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX0ZYVDFfM0RGWDoKLSAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2Z4dDE7Ci0KLSAgIGNhc2UgR0xfUkdCX1MzVEM6Ci0gICBjYXNlIEdMX1JHQjRfUzNUQzoKLSAgIGNhc2UgR0xfUkdCQV9TM1RDOgotICAgY2FzZSBHTF9SR0JBNF9TM1RDOgotICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDoKLSAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6Ci0gICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOgotICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOgotICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JfZHh0MTsgLyogdGhlcmUgaXMgbm8gcmdiYSBzdXBwb3J0PyAqLwotCi0gICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDoKLSAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTY6Ci0gICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDI0OgotICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQzMjoKLSAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3oxNjsKLQotICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCB0ZXh0dXJlIGZvcm1hdCAlcyBpbiAlc1xuIiwgCi0JICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoaW50ZXJuYWxGb3JtYXQpLAotCSAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgcmV0dXJuIE5VTEw7IC8qIG5ldmVyIGdldCBoZXJlICovCi19Ci0KLQotdm9pZCBicndJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBmdW5jdGlvbnMtPkNob29zZVRleHR1cmVGb3JtYXQgPSBicndDaG9vc2VUZXh0dXJlRm9ybWF0OwotfQotCi12b2lkIGJyd19GcmFtZUJ1ZmZlclRleEluaXQoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3ZvaWQgYnJ3X0ZyYW1lQnVmZmVyVGV4SW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCQkgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbiApCiB7CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKICAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0gICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24gPSBpbnRlbC0+ZnJvbnRfcmVnaW9uOwogICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpvYmo7CiAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqaW1nOwogICAgCkBAIC0yMDksNiArNzQsMjYgQEAKIAogdm9pZCBicndfRnJhbWVCdWZmZXJUZXhEZXN0cm95KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7Ci0gICBicnctPmludGVsLmN0eC5Ecml2ZXIuRGVsZXRlVGV4dHVyZSggJmJydy0+aW50ZWwuY3R4LAotCQkJCQlicnctPmludGVsLmZyYW1lX2J1ZmZlcl90ZXhvYmogKTsKKyAgIGlmIChicnctPmludGVsLmZyYW1lX2J1ZmZlcl90ZXhvYmogIT0gTlVMTCkKKyAgICAgIGJydy0+aW50ZWwuY3R4LkRyaXZlci5EZWxldGVUZXh0dXJlKCAmYnJ3LT5pbnRlbC5jdHgsCisJCQkJCSAgIGJydy0+aW50ZWwuZnJhbWVfYnVmZmVyX3RleG9iaiApOworICAgYnJ3LT5pbnRlbC5mcmFtZV9idWZmZXJfdGV4b2JqID0gTlVMTDsKK30KKworLyoqCisgKiBGaW5hbGl6ZXMgYWxsIHRleHR1cmVzLCBjb21wbGV0aW5nIGFueSByZW5kZXJpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lCisgKiB0byBwcmVwYXJlIHRoZW0uCisgKi8KK3ZvaWQgYnJ3X3ZhbGlkYXRlX3RleHR1cmVzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKKyAgIGludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgQlJXX01BWF9URVhfVU5JVDsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmJydy0+YXR0cmlicy5UZXh0dXJlLT5Vbml0W2ldOworCisgICAgICBpZiAodGV4VW5pdC0+X1JlYWxseUVuYWJsZWQpIHsKKwkgaW50ZWxfZmluYWxpemVfbWlwbWFwX3RyZWUoaW50ZWwsIGkpOworICAgICAgfQorICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdGV4X2xheW91dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdGV4X2xheW91dC5jCmluZGV4IGFmMWFkMGYuLmU0MzdjNDEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3RleF9sYXlvdXQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd190ZXhfbGF5b3V0LmMKQEAgLTM1LDEwICszNSwxMiBAQAogCiAjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKICNpbmNsdWRlICJpbnRlbF90ZXhfbGF5b3V0LmgiCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgogCisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19NSVBUUkVFCiAKLUdMYm9vbGVhbiBicndfbWlwdHJlZV9sYXlvdXQoIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgKQorR0xib29sZWFuIGJyd19taXB0cmVlX2xheW91dCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10ICkKIHsKICAgIC8qIFhYWDogdGhlc2UgdmFyeSBkZXBlbmRpbmcgb24gaW1hZ2UgZm9ybWF0OiAKICAgICAqLwpAQCAtNTMsMTEgKzU1LDIwIEBACiAgICAgICBHTHVpbnQgcGFja194X3BpdGNoLCBwYWNrX3hfbnI7CiAgICAgICBHTHVpbnQgcGFja195X3BpdGNoOwogICAgICAgR0x1aW50IGxldmVsOworICAgICAgR0x1aW50IGFsaWduX2ggPSAyOworICAgICAgR0x1aW50IGFsaWduX3cgPSA0OwogCi0gICAgICBtdC0+cGl0Y2ggPSAoKG10LT53aWR0aDAgKiBtdC0+Y3BwICsgMykgJiB+MykgLyBtdC0+Y3BwOwogICAgICAgbXQtPnRvdGFsX2hlaWdodCA9IDA7CisgICAgICAKKyAgICAgIGlmIChtdC0+Y29tcHJlc3NlZCkgeworICAgICAgICAgIGFsaWduX3cgPSBpbnRlbF9jb21wcmVzc2VkX2FsaWdubWVudChtdC0+aW50ZXJuYWxfZm9ybWF0KTsKKyAgICAgICAgICBtdC0+cGl0Y2ggPSBBTElHTih3aWR0aCwgYWxpZ25fdyk7CisgICAgICAgICAgcGFja195X3BpdGNoID0gKGhlaWdodCArIDMpIC8gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXQtPnBpdGNoID0gaW50ZWxfbWlwdHJlZV9waXRjaF9hbGlnbiAoaW50ZWwsIG10LCBtdC0+d2lkdGgwKTsKKyAgICAgICAgICBwYWNrX3lfcGl0Y2ggPSBBTElHTihtdC0+aGVpZ2h0MCwgYWxpZ25faCk7CisgICAgICB9CiAKLSAgICAgIHBhY2tfeV9waXRjaCA9IE1BWDIobXQtPmhlaWdodDAsIDIpOwogICAgICAgcGFja194X3BpdGNoID0gbXQtPnBpdGNoOwogICAgICAgcGFja194X25yID0gMTsKIApAQCAtODMsMjYgKzk0LDM2IEBACiAKIAogCSBtdC0+dG90YWxfaGVpZ2h0ICs9IHk7Ci0KLQkgaWYgKHBhY2tfeF9waXRjaCA+IDQpIHsKLQkgICAgcGFja194X3BpdGNoID4+PSAxOwotCSAgICBwYWNrX3hfbnIgPDw9IDE7Ci0JICAgIGFzc2VydChwYWNrX3hfcGl0Y2ggKiBwYWNrX3hfbnIgPD0gbXQtPnBpdGNoKTsKLQkgfQotCi0JIGlmIChwYWNrX3lfcGl0Y2ggPiAyKSB7Ci0JICAgIHBhY2tfeV9waXRjaCA+Pj0gMTsKLQkgfQotCiAJIHdpZHRoICA9IG1pbmlmeSh3aWR0aCk7CiAJIGhlaWdodCA9IG1pbmlmeShoZWlnaHQpOwogCSBkZXB0aCAgPSBtaW5pZnkoZGVwdGgpOworCisgICAgaWYgKG10LT5jb21wcmVzc2VkKSB7CisgICAgICAgIHBhY2tfeV9waXRjaCA9IChoZWlnaHQgKyAzKSAvIDQ7CisgICAgICAgIAorICAgICAgICBpZiAocGFja194X3BpdGNoID4gQUxJR04od2lkdGgsIGFsaWduX3cpKSB7CisgICAgICAgICAgICBwYWNrX3hfcGl0Y2ggPSBBTElHTih3aWR0aCwgYWxpZ25fdyk7CisgICAgICAgICAgICBwYWNrX3hfbnIgPDw9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFja194X3BpdGNoID4gNCkgeworICAgICAgICAgICAgcGFja194X3BpdGNoID4+PSAxOworICAgICAgICAgICAgcGFja194X25yIDw8PSAxOworICAgICAgICAgICAgYXNzZXJ0KHBhY2tfeF9waXRjaCAqIHBhY2tfeF9uciA8PSBtdC0+cGl0Y2gpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhY2tfeV9waXRjaCA+IDIpIHsKKyAgICAgICAgICAgIHBhY2tfeV9waXRjaCA+Pj0gMTsKKyAgICAgICAgICAgIHBhY2tfeV9waXRjaCA9IEFMSUdOKHBhY2tfeV9waXRjaCwgYWxpZ25faCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgfQogCiAgICBkZWZhdWx0OgotICAgICAgaTk0NV9taXB0cmVlX2xheW91dF8yZChtdCk7CisgICAgICBpOTQ1X21pcHRyZWVfbGF5b3V0XzJkKGludGVsLCBtdCk7CiAgICAgICBicmVhazsKICAgIH0KICAgIERCRygiJXM6ICVkeCVkeCVkIC0gc3ogMHgleFxuIiwgX19GVU5DVElPTl9fLCAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3VyYi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdXJiLmMKaW5kZXggNjRmNTkwNC4uMTExNmFkZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdXJiLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdXJiLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlICJicndfY29udGV4dC5oIgogI2luY2x1ZGUgImJyd19zdGF0ZS5oIgogI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCi0jaW5jbHVkZSAiYnJ3X2hhbC5oIgogCiAjZGVmaW5lIFZTIDAKICNkZWZpbmUgR1MgMQpAQCAtNTMsNyArNTIsNyBAQAogICAgR0x1aW50IG1pbl9lbnRyeV9zaXplOwogICAgR0x1aW50IG1heF9lbnRyeV9zaXplOwogfSBsaW1pdHNbQ1MrMV0gPSB7Ci0gICB7IDgsIDMyLCAxLCA1IH0sCQkJLyogdnMgKi8KKyAgIHsgMTYsIDMyLCAxLCA1IH0sCQkJLyogdnMgKi8KICAgIHsgNCwgOCwgIDEsIDUgfSwJCQkvKiBncyAqLwogICAgeyA2LCA4LCAgMSwgNSB9LAkJCS8qIGNscCAqLwogICAgeyAxLCA4LCAgMSwgMTIgfSwJCSAgICAgICAgLyogc2YgKi8KQEAgLTY5LDcgKzY4LDcgQEAKICAgIGJydy0+dXJiLnNmX3N0YXJ0ID0gYnJ3LT51cmIuY2xpcF9zdGFydCArIGJydy0+dXJiLm5yX2NsaXBfZW50cmllcyAqIGJydy0+dXJiLnZzaXplOwogICAgYnJ3LT51cmIuY3Nfc3RhcnQgPSBicnctPnVyYi5zZl9zdGFydCArIGJydy0+dXJiLm5yX3NmX2VudHJpZXMgKiBicnctPnVyYi5zZnNpemU7CiAKLSAgIHJldHVybiBicnctPnVyYi5jc19zdGFydCArIGJydy0+dXJiLm5yX2NzX2VudHJpZXMgKiBicnctPnVyYi5jc2l6ZSA8PSAyNTY7CisgICByZXR1cm4gYnJ3LT51cmIuY3Nfc3RhcnQgKyBicnctPnVyYi5ucl9jc19lbnRyaWVzICogYnJ3LT51cmIuY3NpemUgPD0gVVJCX1NJWkVTKGJydyk7CiB9CiAKIC8qIE1vc3QgbWluaW1hbCB1cGRhdGUsIGZvcmNlcyByZS1lbWl0IG9mIFVSQiBmZW5jZSBwYWNrZXQgYWZ0ZXIgR1MKQEAgLTgxLDIwICs4MCw2IEBACiAgICBHTHVpbnQgdnNpemUgPSBicnctPnZzLnByb2dfZGF0YS0+dXJiX2VudHJ5X3NpemU7CiAgICBHTHVpbnQgc2ZzaXplID0gYnJ3LT5zZi5wcm9nX2RhdGEtPnVyYl9lbnRyeV9zaXplOwogCi0gICBzdGF0aWMgR0xib29sZWFuICgqaGFsX3JlY2FsY3VsYXRlX3VyYl9mZW5jZSkgKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KTsKLSAgIHN0YXRpYyBHTGJvb2xlYW4gaGFsX3RyaWVkOwotCi0gICBpZiAoIWhhbF90cmllZCkKLSAgIHsKLSAgICAgIGhhbF9yZWNhbGN1bGF0ZV91cmJfZmVuY2UgPSBicndfaGFsX2ZpbmRfc3ltYm9sICgiaW50ZWxfaGFsX3JlY2FsY3VsYXRlX3VyYl9mZW5jZSIpOwotICAgICAgaGFsX3RyaWVkID0gMTsKLSAgIH0KLSAgIGlmIChoYWxfcmVjYWxjdWxhdGVfdXJiX2ZlbmNlKQotICAgewotICAgICAgaWYgKCgqaGFsX3JlY2FsY3VsYXRlX3VyYl9mZW5jZSkgKGJydykpCi0JIHJldHVybjsKLSAgIH0KLSAgIAogICAgaWYgKGNzaXplIDwgbGltaXRzW0NTXS5taW5fZW50cnlfc2l6ZSkKICAgICAgIGNzaXplID0gbGltaXRzW0NTXS5taW5fZW50cnlfc2l6ZTsKIApAQCAtMTUzLDcgKzEzOCw3IEBACiAJCSAgICAgIGJydy0+dXJiLmNsaXBfc3RhcnQsCiAJCSAgICAgIGJydy0+dXJiLnNmX3N0YXJ0LAogCQkgICAgICBicnctPnVyYi5jc19zdGFydCwgCi0JCSAgICAgIDI1Nik7CisJCSAgICAgIFVSQl9TSVpFUyhicncpKTsKICAgICAgIAogICAgICAgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gQlJXX05FV19VUkJfRkVOQ0U7CiAgICB9CkBAIC0xNjcsNyArMTUyLDcgQEAKICAgICAgIC5jYWNoZSA9IChDQUNIRV9ORVdfVlNfUFJPRyB8CiAJCUNBQ0hFX05FV19TRl9QUk9HKQogICAgfSwKLSAgIC51cGRhdGUgPSByZWNhbGN1bGF0ZV91cmJfZmVuY2UKKyAgIC5wcmVwYXJlID0gcmVjYWxjdWxhdGVfdXJiX2ZlbmNlCiB9OwogCiAKQEAgLTE5MSwyNSArMTc2LDEzIEBACiAgICAvKiBUaGUgb3JkZXJpbmcgYmVsb3cgaXMgY29ycmVjdCwgbm90IHRoZSBsYXlvdXQgaW4gdGhlCiAgICAgKiBpbnN0cnVjdGlvbi4KICAgICAqCi0gICAgKiBUaGVyZSBhcmUgMjU2IHVyYiByZWcgcGFpcnMgaW4gdG90YWwuCisgICAgKiBUaGVyZSBhcmUgMjU2LzM4NCB1cmIgcmVnIHBhaXJzIGluIHRvdGFsLgogICAgICovCiAgICB1Zi5iaXRzMC52c19mZW5jZSAgPSBicnctPnVyYi5nc19zdGFydDsKICAgIHVmLmJpdHMwLmdzX2ZlbmNlICA9IGJydy0+dXJiLmNsaXBfc3RhcnQ7IAogICAgdWYuYml0czAuY2xwX2ZlbmNlID0gYnJ3LT51cmIuc2Zfc3RhcnQ7IAogICAgdWYuYml0czEuc2ZfZmVuY2UgID0gYnJ3LT51cmIuY3Nfc3RhcnQ7IAotICAgdWYuYml0czEuY3NfZmVuY2UgID0gMjU2OworICAgdWYuYml0czEuY3NfZmVuY2UgID0gVVJCX1NJWkVTKGJydyk7CiAKICAgIEJSV19CQVRDSF9TVFJVQ1QoYnJ3LCAmdWYpOwogfQotCi0KLSNpZiAwCi1jb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3VyYl9mZW5jZSA9IHsKLSAgIC5kaXJ0eSA9IHsKLSAgICAgIC5tZXNhID0gMCwKLSAgICAgIC5icncgPSBCUldfTkVXX1VSQl9GRU5DRSB8IEJSV19ORVdfUFNQLAotICAgICAgLmNhY2hlID0gMAotICAgfSwKLSAgIC51cGRhdGUgPSBicndfdXBsb2FkX3VyYl9mZW5jZQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdXRpbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdXRpbC5jCmluZGV4IGI2ZGVlZTIuLmQ4ZDM1YzUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3V0aWwuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd191dGlsLmMKQEAgLTQ1LDg2ICs0NSw2IEBACiB9CiAKIAotc3RhdGljIEdMdWludCBicndfcGFyYW1ldGVyX3N0YXRlX2ZsYWdzKGNvbnN0IGdsX3N0YXRlX2luZGV4IHN0YXRlW10pCi17Ci0gICBzd2l0Y2ggKHN0YXRlWzBdKSB7Ci0gICBjYXNlIFNUQVRFX01BVEVSSUFMOgotICAgY2FzZSBTVEFURV9MSUdIVDoKLSAgIGNhc2UgU1RBVEVfTElHSFRNT0RFTF9BTUJJRU5UOgotICAgY2FzZSBTVEFURV9MSUdIVE1PREVMX1NDRU5FQ09MT1I6Ci0gICBjYXNlIFNUQVRFX0xJR0hUUFJPRDoKLSAgICAgIHJldHVybiBfTkVXX0xJR0hUOwotCi0gICBjYXNlIFNUQVRFX1RFWEdFTjoKLSAgIGNhc2UgU1RBVEVfVEVYRU5WX0NPTE9SOgotICAgICAgcmV0dXJuIF9ORVdfVEVYVFVSRTsKLQotICAgY2FzZSBTVEFURV9GT0dfQ09MT1I6Ci0gICBjYXNlIFNUQVRFX0ZPR19QQVJBTVM6Ci0gICAgICByZXR1cm4gX05FV19GT0c7Ci0KLSAgIGNhc2UgU1RBVEVfQ0xJUFBMQU5FOgotICAgICAgcmV0dXJuIF9ORVdfVFJBTlNGT1JNOwotCi0gICBjYXNlIFNUQVRFX1BPSU5UX1NJWkU6Ci0gICBjYXNlIFNUQVRFX1BPSU5UX0FUVEVOVUFUSU9OOgotICAgICAgcmV0dXJuIF9ORVdfUE9JTlQ7Ci0KLSAgIGNhc2UgU1RBVEVfTU9ERUxWSUVXX01BVFJJWDoKLSAgICAgIHJldHVybiBfTkVXX01PREVMVklFVzsKLSAgIGNhc2UgU1RBVEVfUFJPSkVDVElPTl9NQVRSSVg6Ci0gICAgICByZXR1cm4gX05FV19QUk9KRUNUSU9OOwotICAgY2FzZSBTVEFURV9NVlBfTUFUUklYOgotICAgICAgcmV0dXJuIF9ORVdfTU9ERUxWSUVXIHwgX05FV19QUk9KRUNUSU9OOwotICAgY2FzZSBTVEFURV9URVhUVVJFX01BVFJJWDoKLSAgICAgIHJldHVybiBfTkVXX1RFWFRVUkVfTUFUUklYOwotICAgY2FzZSBTVEFURV9QUk9HUkFNX01BVFJJWDoKLSAgICAgIHJldHVybiBfTkVXX1RSQUNLX01BVFJJWDsKLQotICAgY2FzZSBTVEFURV9ERVBUSF9SQU5HRToKLSAgICAgIHJldHVybiBfTkVXX1ZJRVdQT1JUOwotCi0gICBjYXNlIFNUQVRFX0ZSQUdNRU5UX1BST0dSQU06Ci0gICBjYXNlIFNUQVRFX1ZFUlRFWF9QUk9HUkFNOgotICAgICAgcmV0dXJuIF9ORVdfUFJPR1JBTTsKLQotICAgY2FzZSBTVEFURV9JTlRFUk5BTDoKLSAgICAgIHN3aXRjaCAoc3RhdGVbMV0pIHsKLSAgICAgIGNhc2UgU1RBVEVfTk9STUFMX1NDQUxFOgotCSByZXR1cm4gX05FV19NT0RFTFZJRVc7Ci0gICAgICBjYXNlIFNUQVRFX1RFWFJFQ1RfU0NBTEU6Ci0JIHJldHVybiBfTkVXX1RFWFRVUkU7Ci0gICAgICBkZWZhdWx0OgotCSBhc3NlcnQoMCk7Ci0JIHJldHVybiAwOwotICAgICAgfQotCi0gICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KDApOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLQotR0x1aW50Ci1icndfcGFyYW1ldGVyX2xpc3Rfc3RhdGVfZmxhZ3Moc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCkKLXsKLSAgIEdMdWludCBpOwotICAgR0x1aW50IHJlc3VsdCA9IDA7Ci0KLSAgIGlmICghcGFyYW1MaXN0KQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbUxpc3QtPk51bVBhcmFtZXRlcnM7IGkrKykgewotICAgICAgaWYgKHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5UeXBlID09IFBST0dSQU1fU1RBVEVfVkFSKSB7Ci0gICAgICAgICByZXN1bHQgfD0gYnJ3X3BhcmFtZXRlcl9zdGF0ZV9mbGFncyhwYXJhbUxpc3QtPlBhcmFtZXRlcnNbaV0uU3RhdGVJbmRleGVzKTsKLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCiBHTHVpbnQgYnJ3X3RyYW5zbGF0ZV9ibGVuZF9lcXVhdGlvbiggR0xlbnVtIG1vZGUgKQogewogICAgc3dpdGNoIChtb2RlKSB7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192cy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnMuYwppbmRleCBlMTczZjZmLi4xZGI3Y2VlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192cy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgIG1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKICAgIG1lbWNweSgmYy5rZXksIGtleSwgc2l6ZW9mKCprZXkpKTsKIAotICAgYnJ3X2luaXRfY29tcGlsZSgmYy5mdW5jKTsKKyAgIGJyd19pbml0X2NvbXBpbGUoYnJ3LCAmYy5mdW5jKTsKICAgIGMudnAgPSB2cDsKIAogICAgYy5wcm9nX2RhdGEub3V0cHV0c193cml0dGVuID0gdnAtPnByb2dyYW0uQmFzZS5PdXRwdXRzV3JpdHRlbjsKQEAgLTczLDE5ICs3MywxNyBAQAogICAgICovCiAgICBwcm9ncmFtID0gYnJ3X2dldF9wcm9ncmFtKCZjLmZ1bmMsICZwcm9ncmFtX3NpemUpOwogCi0gICAvKgotICAgICovCi0gICBicnctPnZzLnByb2dfZ3Nfb2Zmc2V0ID0gYnJ3X3VwbG9hZF9jYWNoZSggJmJydy0+Y2FjaGVbQlJXX1ZTX1BST0ddLAotCQkJCQkgICAgICAmYy5rZXksCi0JCQkJCSAgICAgIHNpemVvZihjLmtleSksCi0JCQkJCSAgICAgIHByb2dyYW0sCi0JCQkJCSAgICAgIHByb2dyYW1fc2l6ZSwKLQkJCQkJICAgICAgJmMucHJvZ19kYXRhLAotCQkJCQkgICAgICAmYnJ3LT52cy5wcm9nX2RhdGEpOworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+dnMucHJvZ19ibyk7CisgICBicnctPnZzLnByb2dfYm8gPSBicndfdXBsb2FkX2NhY2hlKCAmYnJ3LT5jYWNoZSwgQlJXX1ZTX1BST0csCisJCQkJICAgICAgICZjLmtleSwgc2l6ZW9mKGMua2V5KSwKKwkJCQkgICAgICAgTlVMTCwgMCwKKwkJCQkgICAgICAgcHJvZ3JhbSwgcHJvZ3JhbV9zaXplLAorCQkJCSAgICAgICAmYy5wcm9nX2RhdGEsCisJCQkJICAgICAgICZicnctPnZzLnByb2dfZGF0YSApOwogfQogCiAKLXN0YXRpYyB2b2lkIGJyd191cGxvYWRfdnNfcHJvZyggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQorc3RhdGljIHZvaWQgYnJ3X3VwbG9hZF92c19wcm9nKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgc3RydWN0IGJyd192c19wcm9nX2tleSBrZXk7CiAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9wcm9ncmFtICp2cCA9IApAQCAtMTEwLDEzICsxMDgsMTMgQEAKIAogICAgLyogTWFrZSBhbiBlYXJseSBjaGVjayBmb3IgdGhlIGtleS4KICAgICAqLwotICAgaWYgKGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGVbQlJXX1ZTX1BST0ddLCAKLQkJCSZrZXksIHNpemVvZihrZXkpLAotCQkJJmJydy0+dnMucHJvZ19kYXRhLAotCQkJJmJydy0+dnMucHJvZ19nc19vZmZzZXQpKQotICAgICAgIHJldHVybjsKLQotICAgZG9fdnNfcHJvZyhicncsIHZwLCAma2V5KTsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPnZzLnByb2dfYm8pOworICAgYnJ3LT52cy5wcm9nX2JvID0gYnJ3X3NlYXJjaF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX1ZTX1BST0csCisJCQkJICAgICAgJmtleSwgc2l6ZW9mKGtleSksCisJCQkJICAgICAgTlVMTCwgMCwKKwkJCQkgICAgICAmYnJ3LT52cy5wcm9nX2RhdGEpOworICAgaWYgKGJydy0+dnMucHJvZ19ibyA9PSBOVUxMKQorICAgICAgZG9fdnNfcHJvZyhicncsIHZwLCAma2V5KTsKIH0KIAogCkBAIC0xMjgsNSArMTI2LDUgQEAKICAgICAgIC5icncgICA9IEJSV19ORVdfVkVSVEVYX1BST0dSQU0gfCBCUldfTkVXX01FVEFPUFMsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IGJyd191cGxvYWRfdnNfcHJvZworICAgLnByZXBhcmUgPSBicndfdXBsb2FkX3ZzX3Byb2cKIH07CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192cy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnMuaAppbmRleCBmZGI1Nzg1Li40MWEzM2ZmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192cy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzLmgKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCiAjaW5jbHVkZSAiYnJ3X2V1LmgiCi0jaW5jbHVkZSAicHJvZ3JhbS5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCiAKIAogc3RydWN0IGJyd192c19wcm9nX2tleSB7CkBAIC02Nyw2ICs2NywxMiBAQAogICAgc3RydWN0IGJyd19yZWcgcjE7CiAgICBzdHJ1Y3QgYnJ3X3JlZyByZWdzW1BST0dSQU1fQUREUkVTUysxXVsxMjhdOwogICAgc3RydWN0IGJyd19yZWcgdG1wOworICAgc3RydWN0IGJyd19yZWcgc3RhY2s7CisKKyAgIHN0cnVjdCB7CQorICAgICAgIEdMYm9vbGVhbiB1c2VkX2luX3NyYzsKKyAgICAgICBzdHJ1Y3QgYnJ3X3JlZyByZWc7CisgICB9IG91dHB1dF9yZWdzWzEyOF07CiAKICAgIHN0cnVjdCBicndfcmVnIHVzZXJwbGFuZVs2XTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfY29uc3R2YWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzX2NvbnN0dmFsLmMKaW5kZXggY2FlZjA0Mi4uNzM0YTkyNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfY29uc3R2YWwuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192c19jb25zdHZhbC5jCkBAIC0yMTgsNiArMjE4LDYgQEAKICAgICAgIC5icncgICA9IEJSV19ORVdfVkVSVEVYX1BST0dSQU0gfCBCUldfTkVXX0lOUFVUX0RJTUVOU0lPTlMsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IGNhbGNfd21faW5wdXRfc2l6ZXMKKyAgIC5wcmVwYXJlID0gY2FsY193bV9pbnB1dF9zaXplcwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfZW1pdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfZW1pdC5jCmluZGV4IDZlYjExYjEuLjg3NTk4MjYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzX2VtaXQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192c19lbWl0LmMKQEAgLTMwLDggKzMwLDggQEAKICAgKi8KICAgICAgICAgICAgIAogCi0jaW5jbHVkZSAicHJvZ3JhbS5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dyYW0uaCIKICNpbmNsdWRlICJzaGFkZXIvcHJvZ19wYXJhbWV0ZXIuaCIKICNpbmNsdWRlICJzaGFkZXIvcHJvZ19wcmludC5oIgogI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCkBAIC0xMzQsNiArMTM0LDE2IEBACiAJCQkJCSAgICAgV1JJVEVNQVNLX1gpOwogICAgICAgcmVnKys7CiAgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgIGlmIChjLT5vdXRwdXRfcmVnc1tpXS51c2VkX2luX3NyYykgeworICAgICAgICAgICAgYy0+b3V0cHV0X3JlZ3NbaV0ucmVnID0gYnJ3X3ZlYzhfZ3JmKHJlZywgMCk7CisgICAgICAgICAgICByZWcrKzsKKyAgICAgICAgfQorICAgfQorCisgICBjLT5zdGFjayA9ICBicndfdXcxNl9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgcmVnLCAwKTsKKyAgIHJlZyArPSAyOwogIAogICAgCiAgICAvKiBTb21lIG9wY29kZXMgbmVlZCBhbiBpbnRlcm5hbCB0ZW1wb3Jhcnk6CkBAIC0yMDEsNyArMjExLDcgQEAKIAkJCQkgICAgc3RydWN0IGJyd19yZWcsCiAJCQkJICAgIHN0cnVjdCBicndfcmVnICkpCiB7Ci0gICBpZiAoKGRzdC5maWxlID09IGFyZzAuZmlsZSAmJiBkc3QubnIgPT0gYXJnMC5ucikgJiYKKyAgIGlmICgoZHN0LmZpbGUgPT0gYXJnMC5maWxlICYmIGRzdC5uciA9PSBhcmcwLm5yKSB8fAogICAgICAgIChkc3QuZmlsZSA9PSBhcmcxLmZpbGUgJiYgZHN0Lm5yID09IGFyZzEubnIpKSB7CiAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKICAgICAgIHN0cnVjdCBicndfcmVnIHRtcCA9IGJyd193cml0ZW1hc2soZ2V0X3RtcChjKSwgZHN0LmR3MS5iaXRzLndyaXRlbWFzayk7CkBAIC0yMTMsNTcgKzIyMyw2NSBAQAogICAgfQogfQogCitzdGF0aWMgdm9pZCBlbWl0X3NvcCggc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGFyZzEsIAorCQkgICAgICBHTHVpbnQgY29uZCkKK3sKKyAgIGJyd19NT1YocCwgZHN0LCBicndfaW1tX2YoMC4wZikpOworICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgY29uZCwgYXJnMCwgYXJnMSk7CisgICBicndfTU9WKHAsIGRzdCwgYnJ3X2ltbV9mKDEuMGYpKTsKKyAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2xfZmxhZ192YWx1ZShwLCAweGZmKTsKK30KIAorc3RhdGljIHZvaWQgZW1pdF9zZXEoIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhcmcxICkKK3sKKyAgIGVtaXRfc29wKHAsIGRzdCwgYXJnMCwgYXJnMSwgQlJXX0NPTkRJVElPTkFMX0VRKTsKK30KIAotCitzdGF0aWMgdm9pZCBlbWl0X3NuZSggc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGFyZzEgKQoreworICAgZW1pdF9zb3AocCwgZHN0LCBhcmcwLCBhcmcxLCBCUldfQ09ORElUSU9OQUxfTkVRKTsKK30KIHN0YXRpYyB2b2lkIGVtaXRfc2x0KCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAogCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCiAJCSAgICAgIHN0cnVjdCBicndfcmVnIGFyZzAsCiAJCSAgICAgIHN0cnVjdCBicndfcmVnIGFyZzEgKQogewotICAgLyogQ291bGQgYmUgZG9uZSB3aXRoIGFuIGlmL2Vsc2UvZW5kaWYsIGJ1dCB0aGlzIG1ldGhvZCB1c2VzIGhhbGYKLSAgICAqIHRoZSBpbnN0cnVjdGlvbnMuICBOb3RlIHRoYXQgd2UgYXJlIGNhcmVmdWwgdG8gcmVmZXJlbmNlIHRoZQotICAgICogYXJndW1lbnRzIGJlZm9yZSB3cml0aW5nIHRoZSBkZXN0LiAgVGhhdCBtZWFucyB3ZSBlbWl0IHRoZQotICAgICogaW5zdHJ1Y3Rpb25zIGluIGFuIG9kZCBvcmRlciBhbmQgaGF2ZSB0byBwbGF5IHdpdGggdGhlIGZsYWcKLSAgICAqIHZhbHVlcy4KLSAgICAqLwotICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKLSAgIGJyd19DTVAocCwgYnJ3X251bGxfcmVnKCksIEJSV19DT05ESVRJT05BTF9HRSwgYXJnMCwgYXJnMSk7Ci0KLSAgIC8qIFdyaXRlIGFsbCB2YWx1ZXMgdG8gMToKLSAgICAqLwotICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOwotICAgYnJ3X01PVihwLCBkc3QsIGJyd19pbW1fZigxLjApKTsKLQotICAgLyogV2hlcmUgdGhlIHRlc3Qgc3VjY2VlZGVkLCBvdmVyd2l0ZSB3aXRoIHplcm86Ci0gICAgKi8KLSAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT1JNQUwpOwotICAgYnJ3X01PVihwLCBkc3QsIGJyd19pbW1fZigwLjApKTsKLSAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKyAgIGVtaXRfc29wKHAsIGRzdCwgYXJnMCwgYXJnMSwgQlJXX0NPTkRJVElPTkFMX0wpOwogfQogCitzdGF0aWMgdm9pZCBlbWl0X3NsZSggc3RydWN0IGJyd19jb21waWxlICpwLCAKKwkJICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhcmcwLAorCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhcmcxICkKK3sKKyAgIGVtaXRfc29wKHAsIGRzdCwgYXJnMCwgYXJnMSwgQlJXX0NPTkRJVElPTkFMX0xFKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zZ3QoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgCisJCSAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJICAgICAgc3RydWN0IGJyd19yZWcgYXJnMCwKKwkJICAgICAgc3RydWN0IGJyd19yZWcgYXJnMSApCit7CisgICBlbWl0X3NvcChwLCBkc3QsIGFyZzAsIGFyZzEsIEJSV19DT05ESVRJT05BTF9HKTsKK30KIAogc3RhdGljIHZvaWQgZW1pdF9zZ2UoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgCiAJCSAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKIAkJICAgICAgc3RydWN0IGJyd19yZWcgYXJnMCwKIAkJICAgICAgc3RydWN0IGJyd19yZWcgYXJnMSApCiB7Ci0gICBicndfcHVzaF9pbnNuX3N0YXRlKHApOwotICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX0dFLCBhcmcwLCBhcmcxKTsKLQotICAgLyogV3JpdGUgYWxsIHZhbHVlcyB0byB6ZXJvOgotICAgICovCi0gICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7Ci0gICBicndfTU9WKHAsIGRzdCwgYnJ3X2ltbV9mKDApKTsKLQotICAgLyogV2hlcmUgdGhlIHRlc3Qgc3VjY2VlZGVkLCBvdmVyd2l0ZSB3aXRoIDE6Ci0gICAgKi8KLSAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT1JNQUwpOwotICAgYnJ3X01PVihwLCBkc3QsIGJyd19pbW1fZigxLjApKTsKLSAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKyAgZW1pdF9zb3AocCwgZHN0LCBhcmcwLCBhcmcxLCBCUldfQ09ORElUSU9OQUxfR0UpOwogfQogCi0KIHN0YXRpYyB2b2lkIGVtaXRfbWF4KCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAogCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCiAJCSAgICAgIHN0cnVjdCBicndfcmVnIGFyZzAsCkBAIC01OTIsOSArNjEwLDEzIEBACiAgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgogICAgY2FzZSBQUk9HUkFNX0lOUFVUOgogICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKLSAgIGNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CiAgICAgICBhc3NlcnQoYy0+cmVnc1tmaWxlXVtpbmRleF0ubnIgIT0gMCk7CiAgICAgICByZXR1cm4gYy0+cmVnc1tmaWxlXVtpbmRleF07CisgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgorICAgY2FzZSBQUk9HUkFNX0NPTlNUQU5UOgorICAgY2FzZSBQUk9HUkFNX1VOSUZPUk06CisgICAgICBhc3NlcnQoYy0+cmVnc1tQUk9HUkFNX1NUQVRFX1ZBUl1baW5kZXhdLm5yICE9IDApOworICAgICAgcmV0dXJuIGMtPnJlZ3NbUFJPR1JBTV9TVEFURV9WQVJdW2luZGV4XTsKICAgIGNhc2UgUFJPR1JBTV9BRERSRVNTOgogICAgICAgYXNzZXJ0KGluZGV4ID09IDApOwogICAgICAgcmV0dXJuIGMtPnJlZ3NbZmlsZV1baW5kZXhdOwpAQCAtNjY4LDI4ICs2OTAsMjggQEAKICAqIGFjY291bnQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYnJ3X3JlZyBnZXRfYXJnKCBzdHJ1Y3QgYnJ3X3ZzX2NvbXBpbGUgKmMsCi0JCQkgICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYyApCisJCQkgICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzcmMgKQogewogICAgc3RydWN0IGJyd19yZWcgcmVnOwogCi0gICBpZiAoc3JjLkZpbGUgPT0gUFJPR1JBTV9VTkRFRklORUQpCisgICBpZiAoc3JjLT5GaWxlID09IFBST0dSQU1fVU5ERUZJTkVEKQogICAgICAgcmV0dXJuIGJyd19udWxsX3JlZygpOwogCi0gICBpZiAoc3JjLlJlbEFkZHIpIAotICAgICAgcmVnID0gZGVyZWYoYywgYy0+cmVnc1tQUk9HUkFNX1NUQVRFX1ZBUl1bMF0sIHNyYy5JbmRleCk7CisgICBpZiAoc3JjLT5SZWxBZGRyKSAKKyAgICAgIHJlZyA9IGRlcmVmKGMsIGMtPnJlZ3NbUFJPR1JBTV9TVEFURV9WQVJdWzBdLCBzcmMtPkluZGV4KTsKICAgIGVsc2UKLSAgICAgIHJlZyA9IGdldF9yZWcoYywgc3JjLkZpbGUsIHNyYy5JbmRleCk7CisgICAgICByZWcgPSBnZXRfcmVnKGMsIHNyYy0+RmlsZSwgc3JjLT5JbmRleCk7CiAKICAgIC8qIENvbnZlcnQgMy1iaXQgc3dpenpsZSB0byAyLWJpdC4gIAogICAgICovCi0gICByZWcuZHcxLmJpdHMuc3dpenpsZSA9IEJSV19TV0laWkxFNChHRVRfU1daKHNyYy5Td2l6emxlLCAwKSwKLQkJCQkgICAgICAgR0VUX1NXWihzcmMuU3dpenpsZSwgMSksCi0JCQkJICAgICAgIEdFVF9TV1ooc3JjLlN3aXp6bGUsIDIpLAotCQkJCSAgICAgICBHRVRfU1daKHNyYy5Td2l6emxlLCAzKSk7CisgICByZWcuZHcxLmJpdHMuc3dpenpsZSA9IEJSV19TV0laWkxFNChHRVRfU1daKHNyYy0+U3dpenpsZSwgMCksCisJCQkJICAgICAgIEdFVF9TV1ooc3JjLT5Td2l6emxlLCAxKSwKKwkJCQkgICAgICAgR0VUX1NXWihzcmMtPlN3aXp6bGUsIDIpLAorCQkJCSAgICAgICBHRVRfU1daKHNyYy0+U3dpenpsZSwgMykpOwogCiAgICAvKiBOb3RlIHRoaXMgaXMgb2sgZm9yIG5vbi1zd2l6emxlIGluc3RydWN0aW9uczogCiAgICAgKi8KLSAgIHJlZy5uZWdhdGUgPSBzcmMuTmVnYXRlQmFzZSA/IDEgOiAwOyAgIAorICAgcmVnLm5lZ2F0ZSA9IHNyYy0+TmVnYXRlQmFzZSA/IDEgOiAwOyAgIAogCiAgICByZXR1cm4gcmVnOwogfQpAQCAtODQ1LDcgKzg2Nyw3IEBACiAgICAgICAgKiBMYXRlciwgY2xpcHBpbmcgd2lsbCBkZXRlY3QgdWNwWzZdIGFuZCBlbnN1cmUgdGhlIHByaW1pdGl2ZSBpcwogICAgICAgICogY2xpcHBlZCBhZ2FpbnN0IGFsbCBmaXhlZCBwbGFuZXMuCiAgICAgICAgKi8KLSAgICAgIGlmICghYy0+a2V5Lmtub3dfd19pc19vbmUpIHsKKyAgICAgIGlmICghKEJSV19JU19HTTQ1KHAtPmJydykgfHwgQlJXX0lTX0c0WChwLT5icncpKSAmJiAhYy0+a2V5Lmtub3dfd19pc19vbmUpIHsKIAkgYnJ3X0NNUChwLAogCQkgdmVjOChicndfbnVsbF9yZWcoKSksCiAJCSBCUldfQ09ORElUSU9OQUxfTCwKQEAgLTg5MSwxNyArOTEzLDUwIEBACiAKIH0KIAotCi0KK3N0YXRpYyB2b2lkIAorcG9zdF92c19lbWl0KCBzdHJ1Y3QgYnJ3X3ZzX2NvbXBpbGUgKmMsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmVuZF9pbnN0ICkKK3sKKyAgIEdMdWludCBucl9pbnNucyA9IGMtPnZwLT5wcm9ncmFtLkJhc2UuTnVtSW5zdHJ1Y3Rpb25zOworICAgR0x1aW50IGluc24sIHRhcmdldF9pbnNuOworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QxLCAqaW5zdDI7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfaW5zdDEsICpicndfaW5zdDI7CisgICBpbnQgb2Zmc2V0OworICAgZm9yIChpbnNuID0gMDsgaW5zbiA8IG5yX2luc25zOyBpbnNuKyspIHsKKyAgICAgICBpbnN0MSA9ICZjLT52cC0+cHJvZ3JhbS5CYXNlLkluc3RydWN0aW9uc1tpbnNuXTsKKyAgICAgICBicndfaW5zdDEgPSBpbnN0MS0+RGF0YTsKKyAgICAgICBzd2l0Y2ggKGluc3QxLT5PcGNvZGUpIHsKKwkgICBjYXNlIE9QQ09ERV9DQUw6CisJICAgY2FzZSBPUENPREVfQlJBOgorCSAgICAgICB0YXJnZXRfaW5zbiA9IGluc3QxLT5CcmFuY2hUYXJnZXQ7CisJICAgICAgIGluc3QyID0gJmMtPnZwLT5wcm9ncmFtLkJhc2UuSW5zdHJ1Y3Rpb25zW3RhcmdldF9pbnNuXTsKKwkgICAgICAgYnJ3X2luc3QyID0gaW5zdDItPkRhdGE7CisJICAgICAgIG9mZnNldCA9IGJyd19pbnN0MiAtIGJyd19pbnN0MTsKKwkgICAgICAgYnJ3X3NldF9zcmMxKGJyd19pbnN0MSwgYnJ3X2ltbV9kKG9mZnNldCoxNikpOworCSAgICAgICBicmVhazsKKwkgICBjYXNlIE9QQ09ERV9FTkQ6CisJICAgICAgIG9mZnNldCA9IGVuZF9pbnN0IC0gYnJ3X2luc3QxOworCSAgICAgICBicndfc2V0X3NyYzEoYnJ3X2luc3QxLCBicndfaW1tX2Qob2Zmc2V0KjE2KSk7CisJICAgICAgIGJyZWFrOworCSAgIGRlZmF1bHQ6CisJICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgIH0KK30KIAogLyogRW1pdCB0aGUgZnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbnMgaGVyZS4KICAqLwotdm9pZCBicndfdnNfZW1pdCggc3RydWN0IGJyd192c19jb21waWxlICpjICkKK3ZvaWQgYnJ3X3ZzX2VtaXQoc3RydWN0IGJyd192c19jb21waWxlICpjICkKIHsKKyNkZWZpbmUgTUFYX0lGU04gMzIKICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOwogICAgR0x1aW50IG5yX2luc25zID0gYy0+dnAtPnByb2dyYW0uQmFzZS5OdW1JbnN0cnVjdGlvbnM7Ci0gICBHTHVpbnQgaW5zbjsKKyAgIEdMdWludCBpbnNuLCBpZl9pbnNuID0gMDsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmVuZF9pbnN0OworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaWZfaW5zdFtNQVhfSUZTTl07CisgICBzdHJ1Y3QgYnJ3X2luZGlyZWN0IHN0YWNrX2luZGV4ID0gYnJ3X2luZGlyZWN0KDAsIDApOyAgIAogCisgICBHTHVpbnQgaW5kZXg7CisgICBHTHVpbnQgZmlsZTsKIAogICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfVlMpIHsKICAgICAgIF9tZXNhX3ByaW50ZigiXG5cblxudnMtZW1pdDpcbiIpOwpAQCAtOTEyLDkgKzk2NywyNCBAQAogICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKICAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKICAgIAorICAgLyogTWVzc2FnZSByZWdpc3RlcnMgY2FuJ3QgYmUgcmVhZCwgc28gY29weSB0aGUgb3V0cHV0IGludG8gR1JGIHJlZ2lzdGVyCisgICAgICBpZiB0aGV5IGFyZSB1c2VkIGluIHNvdXJjZSByZWdpc3RlcnMgKi8KKyAgIGZvciAoaW5zbiA9IDA7IGluc24gPCBucl9pbnNuczsgaW5zbisrKSB7CisgICAgICAgR0x1aW50IGk7CisgICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSAmYy0+dnAtPnByb2dyYW0uQmFzZS5JbnN0cnVjdGlvbnNbaW5zbl07CisgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCSAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciAqc3JjID0gJmluc3QtPlNyY1JlZ1tpXTsKKwkgICBHTHVpbnQgaW5kZXggPSBzcmMtPkluZGV4OworCSAgIEdMdWludCBmaWxlID0gc3JjLT5GaWxlOwkKKwkgICBpZiAoZmlsZSA9PSBQUk9HUkFNX09VVFBVVCAmJiBpbmRleCAhPSBWRVJUX1JFU1VMVF9IUE9TKQorCSAgICAgICBjLT5vdXRwdXRfcmVnc1tpbmRleF0udXNlZF9pbl9zcmMgPSBHTF9UUlVFOworICAgICAgIH0KKyAgIH0KKwogICAgLyogU3RhdGljIHJlZ2lzdGVyIGFsbG9jYXRpb24KICAgICAqLwogICAgYnJ3X3ZzX2FsbG9jX3JlZ3MoYyk7CisgICBicndfTU9WKHAsIGdldF9hZGRyX3JlZyhzdGFja19pbmRleCksIGJyd19hZGRyZXNzKGMtPnN0YWNrKSk7CiAKICAgIGZvciAoaW5zbiA9IDA7IGluc24gPCBucl9pbnNuczsgaW5zbisrKSB7CiAKQEAgLTkyNCwxNyArOTk0LDI5IEBACiAgICAgICAKICAgICAgIC8qIEdldCBhcmd1bWVudCByZWdzLiAgU1daIGlzIHNwZWNpYWwgYW5kIGRvZXMgdGhpcyBpdHNlbGYuCiAgICAgICAgKi8KKyAgICAgIGluc3QtPkRhdGEgPSAmcC0+c3RvcmVbcC0+bnJfaW5zbl07CiAgICAgICBpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9TV1opCi0JIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIAotCSAgICBhcmdzW2ldID0gZ2V0X2FyZyhjLCBpbnN0LT5TcmNSZWdbaV0pOworCSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciAqc3JjID0gJmluc3QtPlNyY1JlZ1tpXTsKKwkgICAgICBpbmRleCA9IHNyYy0+SW5kZXg7CisJICAgICAgZmlsZSA9IHNyYy0+RmlsZTsJCisJICAgICAgaWYgKGZpbGUgPT0gUFJPR1JBTV9PVVRQVVQmJmMtPm91dHB1dF9yZWdzW2luZGV4XS51c2VkX2luX3NyYykKKwkJICBhcmdzW2ldID0gYy0+b3V0cHV0X3JlZ3NbaW5kZXhdLnJlZzsKKwkgICAgICBlbHNlCisJCSAgYXJnc1tpXSA9IGdldF9hcmcoYywgc3JjKTsKKwkgIH0KIAogICAgICAgLyogR2V0IGRlc3QgcmVncy4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSByZWcgdG8gYmUgYm90aAogICAgICAgICogZHN0IGFuZCBhcmcsIGdpdmVuIHRoZSBzdGF0aWMgYWxsb2NhdGlvbiBvZiByZWdpc3RlcnMuICBTbwogICAgICAgICogY2FyZSBuZWVkcyB0byBiZSB0YWtlbiBlbWl0dGluZyBtdWx0aS1vcGVyYXRpb24gaW5zdHJ1Y3Rpb25zLgotICAgICAgICovCi0gICAgICBkc3QgPSBnZXRfZHN0KGMsIGluc3QtPkRzdFJlZyk7CisgICAgICAgKi8gCisgICAgICBpbmRleCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKyAgICAgIGZpbGUgPSBpbnN0LT5Ec3RSZWcuRmlsZTsKKyAgICAgIGlmIChmaWxlID09IFBST0dSQU1fT1VUUFVUICYmIGMtPm91dHB1dF9yZWdzW2luZGV4XS51c2VkX2luX3NyYykKKwkgIGRzdCA9IGMtPm91dHB1dF9yZWdzW2luZGV4XS5yZWc7CisgICAgICBlbHNlCisJICBkc3QgPSBnZXRfZHN0KGMsIGluc3QtPkRzdFJlZyk7CiAKLSAgICAgIAogICAgICAgc3dpdGNoIChpbnN0LT5PcGNvZGUpIHsKICAgICAgIGNhc2UgT1BDT0RFX0FCUzoKIAkgYnJ3X01PVihwLCBkc3QsIGJyd19hYnMoYXJnc1swXSkpOwpAQCAtMTAwMywxMiArMTA4NSwyNSBAQAogICAgICAgY2FzZSBPUENPREVfUlNROgogCSBlbWl0X21hdGgxKGMsIEJSV19NQVRIX0ZVTkNUSU9OX1JTUSwgZHN0LCBhcmdzWzBdLCBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7CiAJIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9TRVE6CisgICAgICAgICBlbWl0X3NlcShwLCBkc3QsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TTkU6CisgICAgICAgICBlbWl0X3NuZShwLCBkc3QsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIE9QQ09ERV9TR0U6CiAJIGVtaXRfc2dlKHAsIGRzdCwgYXJnc1swXSwgYXJnc1sxXSk7CiAJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU0dUOgorICAgICAgICAgZW1pdF9zZ3QocCwgZHN0LCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIE9QQ09ERV9TTFQ6CiAJIGVtaXRfc2x0KHAsIGRzdCwgYXJnc1swXSwgYXJnc1sxXSk7CiAJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU0xFOgorICAgICAgICAgZW1pdF9zbGUocCwgZHN0LCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBPUENPREVfU1VCOgogCSBicndfQUREKHAsIGRzdCwgYXJnc1swXSwgbmVnYXRlKGFyZ3NbMV0pKTsKIAkgYnJlYWs7CkBAIC0xMDIxLDIxICsxMTE2LDgyIEBACiAgICAgICBjYXNlIE9QQ09ERV9YUEQ6CiAJIGVtaXRfeHBkKHAsIGRzdCwgYXJnc1swXSwgYXJnc1sxXSk7CiAJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfSUY6CisJIGFzc2VydChpZl9pbnNuIDwgTUFYX0lGU04pOworICAgICAgICAgaWZfaW5zdFtpZl9pbnNuKytdID0gYnJ3X0lGKHAsIEJSV19FWEVDVVRFXzgpOworCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VMU0U6CisJIGlmX2luc3RbaWZfaW5zbi0xXSA9IGJyd19FTFNFKHAsIGlmX2luc3RbaWZfaW5zbi0xXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRU5ESUY6CisgICAgICAgICBhc3NlcnQoaWZfaW5zbiA+IDApOworCSBicndfRU5ESUYocCwgaWZfaW5zdFstLWlmX2luc25dKTsKKwkgYnJlYWs7CQkJCisgICAgICBjYXNlIE9QQ09ERV9CUkE6CisgICAgICAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9STUFMKTsKKyAgICAgICAgIGJyd19BREQocCwgYnJ3X2lwX3JlZygpLCBicndfaXBfcmVnKCksIGJyd19pbW1fZCgxKjE2KSk7CisgICAgICAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sX2ZsYWdfdmFsdWUocCwgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQ0FMOgorCSBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKwkgYnJ3X0FERChwLCBkZXJlZl8xZChzdGFja19pbmRleCwgMCksIGJyd19pcF9yZWcoKSwgYnJ3X2ltbV9kKDMqMTYpKTsKKwkgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOworCSBicndfQUREKHAsIGdldF9hZGRyX3JlZyhzdGFja19pbmRleCksCisJCQkgZ2V0X2FkZHJfcmVnKHN0YWNrX2luZGV4KSwgYnJ3X2ltbV9kKDQpKTsKKwkgaW5zdC0+RGF0YSA9ICZwLT5zdG9yZVtwLT5ucl9pbnNuXTsKKwkgYnJ3X0FERChwLCBicndfaXBfcmVnKCksIGJyd19pcF9yZWcoKSwgYnJ3X2ltbV9kKDEqMTYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9SRVQ6CisJIGJyd19BREQocCwgZ2V0X2FkZHJfcmVnKHN0YWNrX2luZGV4KSwKKwkJCSBnZXRfYWRkcl9yZWcoc3RhY2tfaW5kZXgpLCBicndfaW1tX2QoLTQpKTsKKwkgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMSk7CisgICAgICAgICBicndfTU9WKHAsIGJyd19pcF9yZWcoKSwgZGVyZWZfMWQoc3RhY2tfaW5kZXgsIDApKTsKKwkgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOwogICAgICAgY2FzZSBPUENPREVfRU5EOgkKKyAgICAgICAgIGJyd19BREQocCwgYnJ3X2lwX3JlZygpLCBicndfaXBfcmVnKCksIGJyd19pbW1fZCgxKjE2KSk7CisgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBPUENPREVfUFJJTlQ6CisgICAgICBjYXNlIE9QQ09ERV9CR05TVUI6CisgICAgICBjYXNlIE9QQ09ERV9FTkRTVUI6CiAJIGJyZWFrOwogICAgICAgZGVmYXVsdDoKKwkgX21lc2FfcHJpbnRmKCJVbnN1cHBvcnQgb3Bjb2RlICVkIGluIHZlcnRleCBzaGFkZXJcbiIsIGluc3QtPk9wY29kZSk7CiAJIGJyZWFrOwogICAgICAgfQogCisgICAgICBpZiAoKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fT1VUUFVUKQorICAgICAgICAgICYmIChpbnN0LT5Ec3RSZWcuSW5kZXggIT0gVkVSVF9SRVNVTFRfSFBPUykKKyAgICAgICAgICAmJiBjLT5vdXRwdXRfcmVnc1tpbnN0LT5Ec3RSZWcuSW5kZXhdLnVzZWRfaW5fc3JjKSB7CisgICAgICAgICBicndfTU9WKHAsIGdldF9kc3QoYywgaW5zdC0+RHN0UmVnKSwgZHN0KTsKKyAgICAgIH0KKworICAgICAgLyogUmVzdWx0IGNvbG9yIGNsYW1waW5nLgorICAgICAgICoKKyAgICAgICAqIFdoZW4gZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgYW4gb3V0cHV0IHJlZ2lzdGVyIGFuZAorICAgICAgICogaXQncyBwcmltYXJ5L3NlY29uZGFyeSBmcm9udC9iYWNrIGNvbG9yLCB3ZSBoYXZlIHRvIGNsYW1wCisgICAgICAgKiB0aGUgcmVzdWx0IHRvIFswLDFdLiBUaGlzIGlzIGRvbmUgYnkgZW5hYmxpbmcgdGhlCisgICAgICAgKiBzYXR1cmF0aW9uIGJpdCBmb3IgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICAgICAgKgorICAgICAgICogV2UgZG9uJ3QgdXNlIGJyd19zZXRfc2F0dXJhdGUoKSBhcyBpdCBtb2RpZmllcworICAgICAgICogcC0+Y3VycmVudC0+aGVhZGVyLnNhdHVyYXRlLCB3aGljaCBhZmZlY3RzIGFsbCB0aGUgc3Vic2VxdWVudAorICAgICAgICogaW5zdHJ1Y3Rpb25zLiBJbnN0ZWFkLCB3ZSBkaXJlY3RseSBtb2RpZnkgdGhlIGhlYWRlcgorICAgICAgICogb2YgdGhlIGxhc3QgKGFscmVhZHkgc3RvcmVkKSBpbnN0cnVjdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fT1VUUFVUKSB7CisgICAgICAgICBpZiAoKGluc3QtPkRzdFJlZy5JbmRleCA9PSBWRVJUX1JFU1VMVF9DT0wwKQorICAgICAgICAgICAgIHx8IChpbnN0LT5Ec3RSZWcuSW5kZXggPT0gVkVSVF9SRVNVTFRfQ09MMSkKKyAgICAgICAgICAgICB8fCAoaW5zdC0+RHN0UmVnLkluZGV4ID09IFZFUlRfUkVTVUxUX0JGQzApCisgICAgICAgICAgICAgfHwgKGluc3QtPkRzdFJlZy5JbmRleCA9PSBWRVJUX1JFU1VMVF9CRkMxKSkgeworICAgICAgICAgICAgcC0+c3RvcmVbcC0+bnJfaW5zbi0xXS5oZWFkZXIuc2F0dXJhdGUgPSAxOworICAgICAgICAgfQorICAgICAgfQorCiAgICAgICByZWxlYXNlX3RtcHMoYyk7CiAgICB9CiAKKyAgIGVuZF9pbnN0ID0gJnAtPnN0b3JlW3AtPm5yX2luc25dOwogICAgZW1pdF92ZXJ0ZXhfd3JpdGUoYyk7Ci0KKyAgIHBvc3RfdnNfZW1pdChjLCBlbmRfaW5zdCk7CisgICBmb3IgKGluc24gPSAwOyBpbnNuIDwgbnJfaW5zbnM7IGluc24rKykKKyAgICAgICBjLT52cC0+cHJvZ3JhbS5CYXNlLkluc3RydWN0aW9uc1tpbnNuXS5EYXRhID0gTlVMTDsKIH0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192c19zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfc3RhdGUuYwppbmRleCBjMjI1YmY4Li45MDliOTQyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192c19zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzX3N0YXRlLmMKQEAgLTM2LDYwICszNiwxMDkgQEAKICNpbmNsdWRlICJicndfZGVmaW5lcy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgogCi1zdGF0aWMgdm9pZCB1cGxvYWRfdnNfdW5pdCggc3RydWN0IGJyd19jb250ZXh0ICpicncgKQotewotICAgc3RydWN0IGJyd192c191bml0X3N0YXRlIHZzOworc3RydWN0IGJyd192c191bml0X2tleSB7CisgICB1bnNpZ25lZCBpbnQgdG90YWxfZ3JmOworICAgdW5zaWduZWQgaW50IHVyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIHVuc2lnbmVkIGludCBjdXJiX2VudHJ5X3JlYWRfbGVuZ3RoOwogCi0gICBtZW1zZXQoJnZzLCAwLCBzaXplb2YodnMpKTsKKyAgIHVuc2lnbmVkIGludCBjdXJiZV9vZmZzZXQ7CisKKyAgIHVuc2lnbmVkIGludCBucl91cmJfZW50cmllcywgdXJiX3NpemU7Cit9OworCitzdGF0aWMgdm9pZAordnNfdW5pdF9wb3B1bGF0ZV9rZXkoc3RydWN0IGJyd19jb250ZXh0ICpicncsIHN0cnVjdCBicndfdnNfdW5pdF9rZXkgKmtleSkKK3sKKyAgIG1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CiAKICAgIC8qIENBQ0hFX05FV19WU19QUk9HICovCi0gICB2cy50aHJlYWQwLmtlcm5lbF9zdGFydF9wb2ludGVyID0gYnJ3LT52cy5wcm9nX2dzX29mZnNldCA+PiA2OwotICAgdnMudGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gKChicnctPnZzLnByb2dfZGF0YS0+dG90YWxfZ3JmLTEpICYgfjE1KSAvIDE2OwotICAgdnMudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPnZzLnByb2dfZGF0YS0+dXJiX3JlYWRfbGVuZ3RoOwotICAgdnMudGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPnZzLnByb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aDsKLSAgIHZzLnRocmVhZDMuZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IDE7CisgICBrZXktPnRvdGFsX2dyZiA9IGJydy0+dnMucHJvZ19kYXRhLT50b3RhbF9ncmY7CisgICBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGJydy0+dnMucHJvZ19kYXRhLT51cmJfcmVhZF9sZW5ndGg7CisgICBrZXktPmN1cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPnZzLnByb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aDsKIAotCi0gICAvKiBCUldfTkVXX1VSQl9GRU5DRSAgKi8KLSAgIHZzLnRocmVhZDQubnJfdXJiX2VudHJpZXMgPSBicnctPnVyYi5ucl92c19lbnRyaWVzOyAKLSAgIHZzLnRocmVhZDQudXJiX2VudHJ5X2FsbG9jYXRpb25fc2l6ZSA9IGJydy0+dXJiLnZzaXplIC0gMTsKLSAgIHZzLnRocmVhZDQubWF4X3RocmVhZHMgPSBNSU4yKAotICAgICAgTUFYMigwLCAoYnJ3LT51cmIubnJfdnNfZW50cmllcyAtIDYpIC8gMiAtIDEpLCAKLSAgICAgIDE1KTsKLQotCi0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NJTkdMRV9USFJFQUQpCi0gICAgICB2cy50aHJlYWQ0Lm1heF90aHJlYWRzID0gMDsgCisgICAvKiBCUldfTkVXX1VSQl9GRU5DRSAqLworICAga2V5LT5ucl91cmJfZW50cmllcyA9IGJydy0+dXJiLm5yX3ZzX2VudHJpZXM7CisgICBrZXktPnVyYl9zaXplID0gYnJ3LT51cmIudnNpemU7CiAKICAgIC8qIEJSV19ORVdfQ1VSQkVfT0ZGU0VUUywgX05FV19UUkFOU0ZPUk0gKi8KICAgIGlmIChicnctPmF0dHJpYnMuVHJhbnNmb3JtLT5DbGlwUGxhbmVzRW5hYmxlZCkgewogICAgICAgLyogTm90ZSB0aGF0IHdlIHJlYWQgaW4gdGhlIHVzZXJjbGlwIHBsYW5lcyBhcyB3ZWxsLCBoZW5jZQogICAgICAgICogY2xpcF9zdGFydDoKICAgICAgICAqLwotICAgICAgdnMudGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQgPSBicnctPmN1cmJlLmNsaXBfc3RhcnQgKiAyOworICAgICAga2V5LT5jdXJiZV9vZmZzZXQgPSBicnctPmN1cmJlLmNsaXBfc3RhcnQ7CiAgICB9CiAgICBlbHNlIHsKLSAgICAgIHZzLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gYnJ3LT5jdXJiZS52c19zdGFydCAqIDI7CisgICAgICBrZXktPmN1cmJlX29mZnNldCA9IGJydy0+Y3VyYmUudnNfc3RhcnQ7CiAgICB9Cit9CiAKK3N0YXRpYyBkcmlfYm8gKgordnNfdW5pdF9jcmVhdGVfZnJvbV9rZXkoc3RydWN0IGJyd19jb250ZXh0ICpicncsIHN0cnVjdCBicndfdnNfdW5pdF9rZXkgKmtleSkKK3sKKyAgIHN0cnVjdCBicndfdnNfdW5pdF9zdGF0ZSB2czsKKyAgIGRyaV9ibyAqYm87CisKKyAgIG1lbXNldCgmdnMsIDAsIHNpemVvZih2cykpOworCisgICB2cy50aHJlYWQwLmtlcm5lbF9zdGFydF9wb2ludGVyID0gYnJ3LT52cy5wcm9nX2JvLT5vZmZzZXQgPj4gNjsgLyogcmVsb2MgKi8KKyAgIHZzLnRocmVhZDAuZ3JmX3JlZ19jb3VudCA9IEFMSUdOKGtleS0+dG90YWxfZ3JmLCAxNikgLyAxNiAtIDE7CiAgICB2cy50aHJlYWQxLmZsb2F0aW5nX3BvaW50X21vZGUgPSBCUldfRkxPQVRJTkdfUE9JTlRfTk9OX0lFRUVfNzU0OworICAgdnMudGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIHZzLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0ga2V5LT5jdXJiX2VudHJ5X3JlYWRfbGVuZ3RoOworICAgdnMudGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMTsKICAgIHZzLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKKyAgIHZzLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0ga2V5LT5jdXJiZV9vZmZzZXQgKiAyOworCisgICB2cy50aHJlYWQ0Lm5yX3VyYl9lbnRyaWVzID0ga2V5LT5ucl91cmJfZW50cmllczsKKyAgIHZzLnRocmVhZDQudXJiX2VudHJ5X2FsbG9jYXRpb25fc2l6ZSA9IGtleS0+dXJiX3NpemUgLSAxOworICAgdnMudGhyZWFkNC5tYXhfdGhyZWFkcyA9IE1JTjIoTUFYMigwLCAoa2V5LT5ucl91cmJfZW50cmllcyAtIDYpIC8gMiAtIDEpLAorCQkJCSAxNSk7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NJTkdMRV9USFJFQUQpCisgICAgICB2cy50aHJlYWQ0Lm1heF90aHJlYWRzID0gMDsKIAogICAgLyogTm8gc2FtcGxlcnMgZm9yIEFSQl92cCBwcm9ncmFtczoKICAgICAqLwogICAgdnMudnM1LnNhbXBsZXJfY291bnQgPSAwOwogCiAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TVEFUUykKLSAgICAgIHZzLnRocmVhZDQuc3RhdHNfZW5hYmxlID0gMTsgCisgICAgICB2cy50aHJlYWQ0LnN0YXRzX2VuYWJsZSA9IDE7CiAKLSAgIC8qIFZlcnRleCBwcm9ncmFtIGFsd2F5cyBlbmFibGVkOiAKKyAgIC8qIFZlcnRleCBwcm9ncmFtIGFsd2F5cyBlbmFibGVkOgogICAgICovCiAgICB2cy52czYudnNfZW5hYmxlID0gMTsKIAotICAgYnJ3LT52cy5zdGF0ZV9nc19vZmZzZXQgPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGVbQlJXX1ZTX1VOSVRdLCAmdnMgKTsKKyAgIGJvID0gYnJ3X3VwbG9hZF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX1ZTX1VOSVQsCisJCQkga2V5LCBzaXplb2YoKmtleSksCisJCQkgJmJydy0+dnMucHJvZ19ibywgMSwKKwkJCSAmdnMsIHNpemVvZih2cyksCisJCQkgTlVMTCwgTlVMTCk7CisKKyAgIC8qIEVtaXQgVlMgcHJvZ3JhbSByZWxvY2F0aW9uICovCisgICBpbnRlbF9ib19lbWl0X3JlbG9jKGJvLAorCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAorCQkgICAgICAgdnMudGhyZWFkMC5ncmZfcmVnX2NvdW50IDw8IDEsCisJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnJ3X3ZzX3VuaXRfc3RhdGUsIHRocmVhZDApLAorCQkgICAgICAgYnJ3LT52cy5wcm9nX2JvKTsKKworICAgcmV0dXJuIGJvOwogfQogCitzdGF0aWMgdm9pZCBwcmVwYXJlX3ZzX3VuaXQoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICBzdHJ1Y3QgYnJ3X3ZzX3VuaXRfa2V5IGtleTsKKworICAgdnNfdW5pdF9wb3B1bGF0ZV9rZXkoYnJ3LCAma2V5KTsKKworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+dnMuc3RhdGVfYm8pOworICAgYnJ3LT52cy5zdGF0ZV9ibyA9IGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGUsIEJSV19WU19VTklULAorCQkJCSAgICAgICAma2V5LCBzaXplb2Yoa2V5KSwKKwkJCQkgICAgICAgJmJydy0+dnMucHJvZ19ibywgMSwKKwkJCQkgICAgICAgTlVMTCk7CisgICBpZiAoYnJ3LT52cy5zdGF0ZV9ibyA9PSBOVUxMKSB7CisgICAgICBicnctPnZzLnN0YXRlX2JvID0gdnNfdW5pdF9jcmVhdGVfZnJvbV9rZXkoYnJ3LCAma2V5KTsKKyAgIH0KK30KIAogY29uc3Qgc3RydWN0IGJyd190cmFja2VkX3N0YXRlIGJyd192c191bml0ID0gewogICAgLmRpcnR5ID0gewpAQCAtOTgsNSArMTQ3LDUgQEAKIAkJQlJXX05FV19VUkJfRkVOQ0UpLAogICAgICAgLmNhY2hlID0gQ0FDSEVfTkVXX1ZTX1BST0cKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3ZzX3VuaXQKKyAgIC5wcmVwYXJlID0gcHJlcGFyZV92c191bml0LAogfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3ZzX3RubC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfdG5sLmMKaW5kZXggYjY5YmUzNS4uMmNhYTAyMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfdG5sLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnNfdG5sLmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogICAgdmFsdWVzWzNdID0gczM7CiAgICBpZHggPSBfbWVzYV9hZGRfdW5uYW1lZF9jb25zdGFudCggcC0+cHJvZ3JhbS0+QmFzZS5QYXJhbWV0ZXJzLCB2YWx1ZXMsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN3aXp6bGUpOwotICAgLyogWFhYIHdoYXQgYWJvdXQgc3dpenpsZT8gKi8KKyAgIGFzc2VydChzd2l6emxlID09IFNXSVpaTEVfTk9PUCk7IC8qIE5lZWQgdG8gaGFuZGxlIHN3aXp6bGUgaW4gcmVnIHNldHVwICovCiAgICByZXR1cm4gbWFrZV91cmVnKFBST0dSQU1fU1RBVEVfVkFSLCBpZHgpOwogfQogCkBAIC01MjQsMTAgKzUyNCwxMyBAQAogICAgR0x1aW50IG5yID0gcC0+cHJvZ3JhbS0+QmFzZS5OdW1JbnN0cnVjdGlvbnMrKzsKICAgICAgIAogICAgaWYgKG5yID49IHAtPm5yX2luc3RydWN0aW9ucykgeworICAgICAgaW50IG5ld19ucl9pbnN0cnVjdGlvbnMgPSBwLT5ucl9pbnN0cnVjdGlvbnMgKiAyOworCiAgICAgICBwLT5wcm9ncmFtLT5CYXNlLkluc3RydWN0aW9ucyA9IAogCSBfbWVzYV9yZWFsbG9jKHAtPnByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uKSAqIHAtPm5yX2luc3RydWN0aW9ucywKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbikgKiAocC0+bnJfaW5zdHJ1Y3Rpb25zICo9IDIpKTsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbikgKiBuZXdfbnJfaW5zdHJ1Y3Rpb25zKTsKKyAgICAgIHAtPm5yX2luc3RydWN0aW9ucyA9IG5ld19ucl9pbnN0cnVjdGlvbnM7CiAgICB9CiAKICAgIHsgICAgICAKQEAgLTEwMDAsMTMgKzEwMDMsMTkgQEAKIAkJCQkJICAgICAgIFNUQVRFX1BPU0lUSU9OKTsgCiAJICAgIHN0cnVjdCB1cmVnIFYgPSBnZXRfZXllX3Bvc2l0aW9uKHApOwogCSAgICBzdHJ1Y3QgdXJlZyBkaXN0ID0gZ2V0X3RlbXAocCk7CisJICAgIHN0cnVjdCB1cmVnIHRtcFBwbGkgPSBnZXRfdGVtcChwKTsKIAogCSAgICBWUHBsaSA9IGdldF90ZW1wKHApOyAKIAkgICAgaGFsZiA9IGdldF90ZW1wKHApOworCisJICAgIC8qIEluIGhvbW9nZW5lb3VzIG9iamVjdCBjb29yZGluYXRlcworCSAgICAgKi8KKwkgICAgZW1pdF9vcDEocCwgT1BDT0RFX1JDUCwgZGlzdCwgMCwgc3dpenpsZTEoUHBsaSwgVykpOworCSAgICBlbWl0X29wMihwLCBPUENPREVfTVVMLCB0bXBQcGxpLCAwLCBQcGxpLCBkaXN0KTsKICAKIAkgICAgLyogQ2FsdWxhdGUgVlBwbGkgdmVjdG9yCiAJICAgICAqLwotCSAgICBlbWl0X29wMihwLCBPUENPREVfU1VCLCBWUHBsaSwgMCwgUHBsaSwgVik7IAorCSAgICBlbWl0X29wMihwLCBPUENPREVfU1VCLCBWUHBsaSwgMCwgdG1wUHBsaSwgVik7IAogCiAJICAgIC8qIE5vcm1hbGl6ZSBWUHBsaS4gIFRoZSBkaXN0IHZhbHVlIGFsc28gdXNlZCBpbgogCSAgICAgKiBhdHRlbnVhdGlvbiBiZWxvdy4KQEAgLTEwMzgsNiArMTA0Nyw3IEBACiAJICAgIGVtaXRfbm9ybWFsaXplX3ZlYzMocCwgaGFsZiwgaGFsZik7CiAKIAkgICAgcmVsZWFzZV90ZW1wKHAsIGRpc3QpOworCSAgICByZWxlYXNlX3RlbXAocCwgdG1wUHBsaSk7CiAJIH0KIAogCSAvKiBDYWxjdWxhdGUgZG90IHByb2R1Y3RzOgpAQCAtMTE2Miw2ICsxMTcyLDExIEBACiAgICB9CiAgICBlbHNlIHsKICAgICAgIGlucHV0ID0gc3dpenpsZTEocmVnaXN0ZXJfaW5wdXQocCwgVkVSVF9BVFRSSUJfRk9HKSwgWCk7CisgICAgICBpZiAocC0+c3RhdGUtPmZvZ19vcHRpb24gJiYKKwkgIHAtPnN0YXRlLT50bmxfZG9fdmVydGV4X2ZvZykKKwkgIGlucHV0ID0gc3dpenpsZTEocmVnaXN0ZXJfaW5wdXQocCwgVkVSVF9BVFRSSUJfRk9HKSwgWCk7CisgICAgICBlbHNlCisJICBpbnB1dCA9IHJlZ2lzdGVyX2lucHV0KHAsIFZFUlRfQVRUUklCX0ZPRyk7CiAgICB9CiAKICAgIGlmIChwLT5zdGF0ZS0+Zm9nX29wdGlvbiAmJgpAQCAtMTU2Niw3ICsxNTgxLDcgQEAKICAgIHJldHVybiBoYXNoOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfdG5sX3Byb2dyYW0oIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfdG5sX3Byb2dyYW0oIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OwogICAgc3RydWN0IHN0YXRlX2tleSBrZXk7CkBAIC0xNTc0LDcgKzE1ODksNyBAQAogICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpvbGQgPSBicnctPnRubF9wcm9ncmFtOwogCiAgICAvKiBfTkVXX1BST0dSQU0gKi8KLSAgIGlmIChicnctPmF0dHJpYnMuVmVydGV4UHJvZ3JhbS0+X0VuYWJsZWQpIAorICAgaWYgKGJydy0+YXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5fQ3VycmVudCkgCiAgICAgICByZXR1cm47CiAgICAgICAKICAgIC8qIEdyYWIgYWxsIHRoZSByZWxldmVudCBzdGF0ZSBhbmQgcHV0IGl0IGluIGEgc2luZ2xlIHN0cnVjdHVyZToKQEAgLTE2MDgsNiArMTYyMyw3IEBACiAKICAgIGlmIChvbGQgIT0gYnJ3LT50bmxfcHJvZ3JhbSkKICAgICAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfVE5MX1BST0dSQU07CisgICByZXR1cm47CiB9CiAKIC8qIE5vdGU6IFNlZSBicndfZHJhdy5jIC0gdGhlIHZlcnRleCBwcm9ncmFtIG11c3Qgbm90IHJlbHkgb24KQEAgLTE2MjEsMjQgKzE2MzcsMjUgQEAKIAkgICAgICAgX05FV19GT0cgfCAKIAkgICAgICAgX05FV19ISU5UIHwgCiAJICAgICAgIF9ORVdfUE9JTlQgfCAKLQkgICAgICAgX05FV19URVhUVVJFKSwKKwkgICAgICAgX05FV19URVhUVVJFIHwKKyAgICAgICAgICBfTkVXX1RFWFRVUkVfTUFUUklYKSwKICAgICAgIC5icncgPSAoQlJXX05FV19GUkFHTUVOVF9QUk9HUkFNIHwgCiAJICAgICAgQlJXX05FV19JTlBVVF9WQVJZSU5HKSwKICAgICAgIC5jYWNoZSA9IDAKICAgIH0sCi0gICAudXBkYXRlID0gdXBkYXRlX3RubF9wcm9ncmFtCisgICAucHJlcGFyZSA9IHByZXBhcmVfdG5sX3Byb2dyYW0KIH07CiAKIAogCiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9hY3RpdmVfdmVydHByb2coIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfYWN0aXZlX3ZlcnRwcm9nKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7CiAgICBjb25zdCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnByZXYgPSBicnctPnZlcnRleF9wcm9ncmFtOwogCiAgICAvKiBORVdfUFJPR1JBTSAqLwotICAgaWYgKGJydy0+YXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5fRW5hYmxlZCkgewotICAgICAgYnJ3LT52ZXJ0ZXhfcHJvZ3JhbSA9IGJydy0+YXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5DdXJyZW50OworICAgaWYgKGJydy0+YXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5fQ3VycmVudCkgeworICAgICAgYnJ3LT52ZXJ0ZXhfcHJvZ3JhbSA9IGJydy0+YXR0cmlicy5WZXJ0ZXhQcm9ncmFtLT5fQ3VycmVudDsKICAgIH0KICAgIGVsc2UgewogICAgICAgLyogQlJXX05FV19UTkxfUFJPR1JBTSAqLwpAQCAtMTY1Nyw3ICsxNjc0LDcgQEAKICAgICAgIC5icncgPSBCUldfTkVXX1ROTF9QUk9HUkFNLAogICAgICAgLmNhY2hlID0gMAogICAgfSwKLSAgIC51cGRhdGUgPSB1cGRhdGVfYWN0aXZlX3ZlcnRwcm9nCisgICAucHJlcGFyZSA9IHByZXBhcmVfYWN0aXZlX3ZlcnRwcm9nCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3Z0YmwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3Z0YmwuYwppbmRleCA3ODZmMzBlLi4zMWU5NmEyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd192dGJsLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfdnRibC5jCkBAIC00NywxMCArNDcsOSBAQAogCiAjaW5jbHVkZSAiYnJ3X2RyYXcuaCIKICNpbmNsdWRlICJicndfc3RhdGUuaCIKLSNpbmNsdWRlICJicndfYXViLmgiCiAjaW5jbHVkZSAiYnJ3X2ZhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYnJ3X3ZzLmgiCi0KKyNpbmNsdWRlIDxzdGRhcmcuaD4KIAogCiAvKiBjYWxsZWQgZnJvbSBpbnRlbERlc3Ryb3lDb250ZXh0KCkKQEAgLTYwLDggKzU5LDYgQEAKICAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7CiAgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KCZpbnRlbC0+Y3R4KTsKIAotICAgYnJ3X2F1Yl9kZXN0cm95KGJydyk7Ci0KICAgIGJyd19kZXN0cm95X21ldGFvcHMoYnJ3KTsKICAgIGJyd19kZXN0cm95X3N0YXRlKGJydyk7CiAgICBicndfZHJhd19kZXN0cm95KCBicncgKTsKQEAgLTczLDM4ICs3MCw1NCBAQAogLyogY2FsbGVkIGZyb20gaW50ZWxEcmF3QnVmZmVyKCkKICAqLwogc3RhdGljIHZvaWQgYnJ3X3NldF9kcmF3X3JlZ2lvbiggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCQkgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRyYXdfcmVnaW9uLAotCQkJCSAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVwdGhfcmVnaW9uKQorCQkJCSAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHJhd19yZWdpb25zW10sCisJCQkJICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb24sCisJCQkJR0x1aW50IG51bV9yZWdpb25zKQogewogICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dCgmaW50ZWwtPmN0eCk7Ci0KLSAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKGludGVsLCAmYnJ3LT5zdGF0ZS5kcmF3X3JlZ2lvbik7Ci0gICBpbnRlbF9yZWdpb25fcmVsZWFzZShpbnRlbCwgJmJydy0+c3RhdGUuZGVwdGhfcmVnaW9uKTsKLSAgIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoJmJydy0+c3RhdGUuZHJhd19yZWdpb24sIGRyYXdfcmVnaW9uKTsKKyAgIGludCBpOworICAgaWYgKGJydy0+c3RhdGUuZGVwdGhfcmVnaW9uICE9IGRlcHRoX3JlZ2lvbikKKyAgICAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfREVQVEhfQlVGRkVSOworICAgZm9yIChpID0gMDsgaSA8IGJydy0+c3RhdGUubnJfZHJhd19yZWdpb25zOyBpKyspCisgICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJmJydy0+c3RhdGUuZHJhd19yZWdpb25zW2ldKTsKKyAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKCZicnctPnN0YXRlLmRlcHRoX3JlZ2lvbik7CisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ2lvbnM7IGkrKykKKyAgICAgICBpbnRlbF9yZWdpb25fcmVmZXJlbmNlKCZicnctPnN0YXRlLmRyYXdfcmVnaW9uc1tpXSwgZHJhd19yZWdpb25zW2ldKTsKICAgIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoJmJydy0+c3RhdGUuZGVwdGhfcmVnaW9uLCBkZXB0aF9yZWdpb24pOworICAgYnJ3LT5zdGF0ZS5ucl9kcmF3X3JlZ2lvbnMgPSBudW1fcmVnaW9uczsKIH0KIAogCiAvKiBjYWxsZWQgZnJvbSBpbnRlbEZsdXNoQmF0Y2hMb2NrZWQKICAqLwotc3RhdGljIHZvaWQgYnJ3X2xvc3RfaGFyZHdhcmUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCitzdGF0aWMgdm9pZCBicndfbmV3X2JhdGNoKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQogewogICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dCgmaW50ZWwtPmN0eCk7CiAKLSAgIC8qIE5vdGUgdGhhdCB3ZSBlZmZlY3RpdmVseSBsb3NlIHRoZSBjb250ZXh0IGFmdGVyIHRoaXMuCi0gICAgKiAKLSAgICAqIFNldHRpbmcgdGhpcyBmbGFnIHByb3Zva2VzIGEgc3RhdGUgYnVmZmVyIHdyYXAgYW5kIGFsc28gZmx1c2hlcwotICAgICogdGhlIGhhcmR3YXJlIGNhY2hlcy4KKyAgIC8qIENoZWNrIHRoYXQgd2UgZGlkbid0IGp1c3Qgd3JhcCBvdXIgYmF0Y2hidWZmZXIgYXQgYSBiYWQgdGltZS4gKi8KKyAgIGFzc2VydCghYnJ3LT5ub19iYXRjaF93cmFwKTsKKworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+Y3VyYmUuY3VyYmVfYm8pOworICAgYnJ3LT5jdXJiZS5jdXJiZV9ibyA9IE5VTEw7CisKKyAgIC8qIE1hcmsgYWxsIGNvbnRleHQgc3RhdGUgYXMgbmVlZGluZyB0byBiZSByZS1lbWl0dGVkLgorICAgICogVGhpcyBpcyBwcm9iYWJseSBub3QgYXMgc2V2ZXJlIGFzIG9uIDkxNSwgc2luY2UgYWxtb3N0IGFsbCBvZiBvdXIgc3RhdGUKKyAgICAqIGlzIGp1c3QgaW4gcmVmZXJlbmNlZCBidWZmZXJzLgogICAgICovCiAgICBicnctPnN0YXRlLmRpcnR5LmJydyB8PSBCUldfTkVXX0NPTlRFWFQ7CiAKLSAgIC8qIFdoaWNoIG1lYW5zIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgY29tbWFuZHMgYWxyZWFkeSBxdWV1ZWQ6Ci0gICAgKi8KLSAgIGFzc2VydChpbnRlbC0+YmF0Y2gtPnB0ciA9PSBpbnRlbC0+YmF0Y2gtPm1hcCArIGludGVsLT5iYXRjaC0+b2Zmc2V0KTsKLQogICAgYnJ3LT5zdGF0ZS5kaXJ0eS5tZXNhIHw9IH4wOwogICAgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gfjA7CiAgICBicnctPnN0YXRlLmRpcnR5LmNhY2hlIHw9IH4wOworCisgICAvKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdXBsb2FkIGJ1ZmZlciBzbyB0aGF0IHdlJ2xsIGZvcmNlIGNob29zaW5nCisgICAgKiBhIG5ldyBidWZmZXIgbmV4dCB0aW1lLgorICAgICovCisgICBpZiAoYnJ3LT52Yi51cGxvYWQuYm8gIT0gTlVMTCkgeworICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+dmIudXBsb2FkLmJvKTsKKyAgICAgIGJydy0+dmIudXBsb2FkLmJvID0gTlVMTDsKKyAgICAgIGJydy0+dmIudXBsb2FkLm9mZnNldCA9IDA7CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGJyd19ub3RlX2ZlbmNlKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIApAQCAtMTE1LDEwICsxMjgsOSBAQAogIAogc3RhdGljIHZvaWQgYnJ3X25vdGVfdW5sb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQogewotICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoJmludGVsLT5jdHgpOwogCi0gICBicndfcG9vbF9jaGVja193cmFwKGJydywgJmJydy0+cG9vbFtCUldfR1NfUE9PTF0pOwotICAgYnJ3X3Bvb2xfY2hlY2tfd3JhcChicncsICZicnctPnBvb2xbQlJXX1NTX1BPT0xdKTsKKyAgIGJyd19zdGF0ZV9jYWNoZV9jaGVja19zaXplKGJydyk7CiAKICAgIGJyd19jb250ZXh0KCZpbnRlbC0+Y3R4KS0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfTE9DSzsKIH0KQEAgLTE1Niw5ICsxNjgsNiBAQAogICAgcmV0dXJuICooR0x1aW50ICopJmZsdXNoOwogfQogCi0KLQotCiBzdGF0aWMgdm9pZCBicndfaW52YWxpZGF0ZV9zdGF0ZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgbmV3X3N0YXRlICkKIHsKICAgIC8qIG5vdGhpbmcgKi8KQEAgLTE3NiwxMCArMTg1LDExIEBACiAgICBicnctPmludGVsLnZ0YmwuaW52YWxpZGF0ZV9zdGF0ZSA9IGJyd19pbnZhbGlkYXRlX3N0YXRlOyAKICAgIGJydy0+aW50ZWwudnRibC5ub3RlX2ZlbmNlID0gYnJ3X25vdGVfZmVuY2U7IAogICAgYnJ3LT5pbnRlbC52dGJsLm5vdGVfdW5sb2NrID0gYnJ3X25vdGVfdW5sb2NrOyAKLSAgIGJydy0+aW50ZWwudnRibC5sb3N0X2hhcmR3YXJlID0gYnJ3X2xvc3RfaGFyZHdhcmU7CisgICBicnctPmludGVsLnZ0YmwubmV3X2JhdGNoID0gYnJ3X25ld19iYXRjaDsKICAgIGJydy0+aW50ZWwudnRibC5kZXN0cm95ID0gYnJ3X2Rlc3Ryb3lfY29udGV4dDsKICAgIGJydy0+aW50ZWwudnRibC5zZXRfZHJhd19yZWdpb24gPSBicndfc2V0X2RyYXdfcmVnaW9uOwogICAgYnJ3LT5pbnRlbC52dGJsLmZsdXNoX2NtZCA9IGJyd19mbHVzaF9jbWQ7CiAgICBicnctPmludGVsLnZ0YmwuZW1pdF9mbHVzaCA9IGJyd19lbWl0X2ZsdXNoOworICAgYnJ3LT5pbnRlbC52dGJsLmRlYnVnX2JhdGNoID0gYnJ3X2RlYnVnX2JhdGNoOwogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd20uYwppbmRleCAxNDk3ZGM3Li4zNjEzMTJjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtLmMKQEAgLTI5LDEyICsyOSwxMSBAQAogICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgogICAqLwogICAgICAgICAgICAgIAotCisjaW5jbHVkZSAibWFpbi90ZXhmb3JtYXQuaCIKICNpbmNsdWRlICJicndfY29udGV4dC5oIgogI2luY2x1ZGUgImJyd191dGlsLmgiCiAjaW5jbHVkZSAiYnJ3X3dtLmgiCiAjaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCi0jaW5jbHVkZSAiYnJ3X2hhbC5oIgogCiAKIEdMdWludCBicndfd21fbnJfYXJncyggR0x1aW50IG9wY29kZSApCkBAIC02Niw3ICs2NSwxMSBAQAogICAgY2FzZSBPUENPREVfUE9XOgogICAgY2FzZSBPUENPREVfU1VCOgogICAgY2FzZSBPUENPREVfU0dFOgorICAgY2FzZSBPUENPREVfU0dUOgorICAgY2FzZSBPUENPREVfU0xFOgogICAgY2FzZSBPUENPREVfU0xUOgorICAgY2FzZSBPUENPREVfU0VROgorICAgY2FzZSBPUENPREVfU05FOgogICAgY2FzZSBPUENPREVfQUREOgogICAgY2FzZSBPUENPREVfTUFYOgogICAgY2FzZSBPUENPREVfTUlOOgpAQCAtMTE2LDIwICsxMTksNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGJyd193bV9wYXNzX2hhbCAoc3RydWN0IGJyd193bV9jb21waWxlICpjKQotewotICAgc3RhdGljIHZvaWQgKCpoYWxfd21fcGFzcykgKHN0cnVjdCBicndfd21fY29tcGlsZSAqYyk7Ci0gICBzdGF0aWMgR0xib29sZWFuIGhhbF90cmllZDsKLSAgIAotICAgaWYgKCFoYWxfdHJpZWQpCi0gICB7Ci0gICAgICBoYWxfd21fcGFzcyA9IGJyd19oYWxfZmluZF9zeW1ib2wgKCJpbnRlbF9oYWxfd21fcGFzcyIpOwotICAgICAgaGFsX3RyaWVkID0gMTsKLSAgIH0KLSAgIGlmIChoYWxfd21fcGFzcykKLSAgICAgICgqaGFsX3dtX3Bhc3MpIChjKTsKLX0KLQogc3RhdGljIHZvaWQgZG9fd21fcHJvZyggc3RydWN0IGJyd19jb250ZXh0ICpicncsCiAJCQlzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKmZwLCAKIAkJCXN0cnVjdCBicndfd21fcHJvZ19rZXkgKmtleSkKQEAgLTE1MCw2MCArMTM5LDUzIEBACiAgICBjLT5mcCA9IGZwOwogICAgYy0+ZW52X3BhcmFtID0gYnJ3LT5pbnRlbC5jdHguRnJhZ21lbnRQcm9ncmFtLlBhcmFtZXRlcnM7CiAKLQotICAgLyogQXVnbWVudCBmcmFnbWVudCBwcm9ncmFtLiAgQWRkIGluc3RydWN0aW9ucyBmb3IgcHJlLSBhbmQKLSAgICAqIHBvc3QtZnJhZ21lbnQtcHJvZ3JhbSB0YXNrcyBzdWNoIGFzIGludGVycG9sYXRpb24gYW5kIGZvZ2dpbmcuCi0gICAgKi8KLSAgIGJyd193bV9wYXNzX2ZwKGMpOwotICAgCi0gICAvKiBUcmFuc2xhdGUgdG8gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uLiAgQnVpbGQgcmVnaXN0ZXIgdXNhZ2UKLSAgICAqIGNoYWlucy4KLSAgICAqLwotICAgYnJ3X3dtX3Bhc3MwKGMpOwotCi0gICAvKiBEZWFkIGNvZGUgcmVtb3ZhbC4KLSAgICAqLwotICAgYnJ3X3dtX3Bhc3MxKGMpOwotCi0gICAvKiBIYWwgb3B0aW1pemF0aW9uCi0gICAgKi8KLSAgIGJyd193bV9wYXNzX2hhbCAoYyk7Ci0gICAKLSAgIC8qIFJlZ2lzdGVyIGFsbG9jYXRpb24uCi0gICAgKi8KLSAgIGMtPmdyZl9saW1pdCA9IEJSV19XTV9NQVhfR1JGLzI7Ci0KLSAgIC8qIFRoaXMgaXMgd2hlcmUgd2Ugc3RhcnQgZW1pdHRpbmcgZ2VuNCBjb2RlOgotICAgICovCi0gICBicndfaW5pdF9jb21waWxlKCZjLT5mdW5jKTsgICAgCi0KLSAgIGJyd193bV9wYXNzMihjKTsKLQotICAgYy0+cHJvZ19kYXRhLnRvdGFsX2dyZiA9IGMtPm1heF93bV9ncmY7Ci0gICBpZiAoYy0+bGFzdF9zY3JhdGNoKSB7Ci0gICAgICBjLT5wcm9nX2RhdGEudG90YWxfc2NyYXRjaCA9Ci0JIGMtPmxhc3Rfc2NyYXRjaCArIDB4NDA7CisgICAgYnJ3X2luaXRfY29tcGlsZShicncsICZjLT5mdW5jKTsKKyAgIGlmIChicndfd21faXNfZ2xzbCgmYy0+ZnAtPnByb2dyYW0pKSB7CisgICAgICAgYnJ3X3dtX2dsc2xfZW1pdChicncsIGMpOwogICAgfSBlbHNlIHsKLSAgICAgIGMtPnByb2dfZGF0YS50b3RhbF9zY3JhdGNoID0gMDsKKyAgICAgICAvKiBBdWdtZW50IGZyYWdtZW50IHByb2dyYW0uICBBZGQgaW5zdHJ1Y3Rpb25zIGZvciBwcmUtIGFuZAorCSogcG9zdC1mcmFnbWVudC1wcm9ncmFtIHRhc2tzIHN1Y2ggYXMgaW50ZXJwb2xhdGlvbiBhbmQgZm9nZ2luZy4KKwkqLworICAgICAgIGJyd193bV9wYXNzX2ZwKGMpOworCisgICAgICAgLyogVHJhbnNsYXRlIHRvIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbi4gIEJ1aWxkIHJlZ2lzdGVyIHVzYWdlCisJKiBjaGFpbnMuCisJKi8KKyAgICAgICBicndfd21fcGFzczAoYyk7CisKKyAgICAgICAvKiBEZWFkIGNvZGUgcmVtb3ZhbC4KKwkqLworICAgICAgIGJyd193bV9wYXNzMShjKTsKKworICAgICAgIC8qIFJlZ2lzdGVyIGFsbG9jYXRpb24uCisJKi8KKyAgICAgICBjLT5ncmZfbGltaXQgPSBCUldfV01fTUFYX0dSRi8yOworCisgICAgICAgYnJ3X3dtX3Bhc3MyKGMpOworCisgICAgICAgYy0+cHJvZ19kYXRhLnRvdGFsX2dyZiA9IGMtPm1heF93bV9ncmY7CisgICAgICAgaWYgKGMtPmxhc3Rfc2NyYXRjaCkgeworCSAgIGMtPnByb2dfZGF0YS50b3RhbF9zY3JhdGNoID0KKwkgICAgICAgYy0+bGFzdF9zY3JhdGNoICsgMHg0MDsKKyAgICAgICB9IGVsc2UgeworCSAgIGMtPnByb2dfZGF0YS50b3RhbF9zY3JhdGNoID0gMDsKKyAgICAgICB9CisKKyAgICAgICAvKiBFbWl0IEdFTjQgY29kZS4KKwkqLworICAgICAgIGJyd193bV9lbWl0KGMpOwogICAgfQotCi0gICAvKiBFbWl0IEdFTjQgY29kZS4KLSAgICAqLwotICAgYnJ3X3dtX2VtaXQoYyk7Ci0KICAgIC8qIGdldCB0aGUgcHJvZ3JhbQogICAgICovCiAgICBwcm9ncmFtID0gYnJ3X2dldF9wcm9ncmFtKCZjLT5mdW5jLCAmcHJvZ3JhbV9zaXplKTsKIAotICAgLyoKLSAgICAqLwotICAgYnJ3LT53bS5wcm9nX2dzX29mZnNldCA9IGJyd191cGxvYWRfY2FjaGUoICZicnctPmNhY2hlW0JSV19XTV9QUk9HXSwKLQkJCQkJICAgICAgJmMtPmtleSwKLQkJCQkJICAgICAgc2l6ZW9mKGMtPmtleSksCi0JCQkJCSAgICAgIHByb2dyYW0sCi0JCQkJCSAgICAgIHByb2dyYW1fc2l6ZSwKLQkJCQkJICAgICAgJmMtPnByb2dfZGF0YSwKLQkJCQkJICAgICAgJmJydy0+d20ucHJvZ19kYXRhICk7CisgICBkcmlfYm9fdW5yZWZlcmVuY2UoYnJ3LT53bS5wcm9nX2JvKTsKKyAgIGJydy0+d20ucHJvZ19ibyA9IGJyd191cGxvYWRfY2FjaGUoICZicnctPmNhY2hlLCBCUldfV01fUFJPRywKKwkJCQkgICAgICAgJmMtPmtleSwgc2l6ZW9mKGMtPmtleSksCisJCQkJICAgICAgIE5VTEwsIDAsCisJCQkJICAgICAgIHByb2dyYW0sIHByb2dyYW1fc2l6ZSwKKwkJCQkgICAgICAgJmMtPnByb2dfZGF0YSwKKwkJCQkgICAgICAgJmJydy0+d20ucHJvZ19kYXRhICk7CiB9CiAKIApAQCAtMjQzLDcgKzIyNSw4IEBACiAgICAgICBsb29rdXAgfD0gSVpfU1RFTkNJTF9URVNUX0VOQUJMRV9CSVQ7CiAKICAgICAgIGlmIChicnctPmF0dHJpYnMuU3RlbmNpbC0+V3JpdGVNYXNrWzBdIHx8Ci0JICAoYnJ3LT5hdHRyaWJzLlN0ZW5jaWwtPlRlc3RUd29TaWRlICYmIGJydy0+YXR0cmlicy5TdGVuY2lsLT5Xcml0ZU1hc2tbMV0pKQorCSAgKGJydy0+YXR0cmlicy5TdGVuY2lsLT5fVGVzdFR3b1NpZGUgJiYKKwkgICBicnctPmF0dHJpYnMuU3RlbmNpbC0+V3JpdGVNYXNrWzFdKSkKIAkgbG9va3VwIHw9IElaX1NURU5DSUxfV1JJVEVfRU5BQkxFX0JJVDsKICAgIH0KIApAQCAtMjg1LDcgKzI2OCw3IEBACiAKIAogICAgLyogQlJXX05FV19XTV9JTlBVVF9ESU1FTlNJT05TICovCi0gICBrZXktPnByb2p0ZXhfbWFzayA9IGJydy0+d20uaW5wdXRfc2l6ZV9tYXNrc1s0LTFdOyAKKyAgIGtleS0+cHJvanRleF9tYXNrID0gYnJ3LT53bS5pbnB1dF9zaXplX21hc2tzWzQtMV0gPj4gKEZSQUdfQVRUUklCX1RFWDAgLSBGUkFHX0FUVFJJQl9XUE9TKTsgCiAKICAgIC8qIF9ORVdfTElHSFQgKi8KICAgIGtleS0+ZmxhdF9zaGFkZSA9IChicnctPmF0dHJpYnMuTGlnaHQtPlNoYWRlTW9kZWwgPT0gR0xfRkxBVCk7CkBAIC0yOTYsMTcgKzI3OSw0MSBAQAogICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ID0gdW5pdC0+X0N1cnJlbnQ7CiAKICAgICAgIGlmICh1bml0LT5fUmVhbGx5RW5hYmxlZCkgewotCi0JIGlmICh0LT5Db21wYXJlTW9kZSA9PSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgJiYKLQkgICAgIHQtPkltYWdlWzBdW3QtPkJhc2VMZXZlbF0tPl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCkgewotCSAgICBrZXktPnNoYWRvd3RleF9tYXNrIHw9IDE8PGk7Ci0JIH0KLQotCSBpZiAodC0+SW1hZ2VbMF1bdC0+QmFzZUxldmVsXS0+SW50ZXJuYWxGb3JtYXQgPT0gR0xfWUNCQ1JfTUVTQSkKKwkgaWYgKHQtPkltYWdlWzBdW3QtPkJhc2VMZXZlbF0tPkludGVybmFsRm9ybWF0ID09IEdMX1lDQkNSX01FU0EpIHsKIAkgICAga2V5LT55dXZ0ZXhfbWFzayB8PSAxPDxpOworCSAgICBpZiAodC0+SW1hZ2VbMF1bdC0+QmFzZUxldmVsXS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ID09IAorCQkgICAgTUVTQV9GT1JNQVRfWUNCQ1IpCisJCWtleS0+eXV2dGV4X3N3YXBfbWFzayB8PSAxPDwgaTsKKwkgfQogICAgICAgfQogICAgfQotCSAgCisKKyAgIC8qIFNoYWRvdyAqLworICAga2V5LT5zaGFkb3d0ZXhfbWFzayA9IGZwLT5wcm9ncmFtLkJhc2UuU2hhZG93U2FtcGxlcnM7CisKKyAgIC8qIF9ORVdfQlVGRkVSUyAqLworICAgLyoKKyAgICAqIEluY2x1ZGUgdGhlIGRyYXcgYnVmZmVyIG9yaWdpbiBhbmQgaGVpZ2h0IHNvIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZQorICAgICogZnJhZ21lbnQgcG9zaXRpb24gdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gbGVmdCBvZiB0aGUgZHJhd2FibGUsCisgICAgKiBmcm9tIHRoZSBpbmNvbWluZyBzY3JlZW4gb3JpZ2luIHJlbGF0aXZlIHBvc2l0aW9uIHdlIGdldCBhcyBwYXJ0IG9mIG91cgorICAgICogcGF5bG9hZC4KKyAgICAqCisgICAgKiBXZSBjb3VsZCBhdm9pZCByZWNvbXBpbGluZyBieSBpbmNsdWRpbmcgdGhpcyBhcyBhIGNvbnN0YW50IHJlZmVyZW5jZWQgYnkKKyAgICAqIG91ciBwcm9ncmFtLCBidXQgaWYgd2Ugd2VyZSB0byBkbyB0aGF0IGl0IHdvdWxkIGFsc28gYmUgbmljZSB0byBoYW5kbGUKKyAgICAqIGdldHRpbmcgdGhhdCBjb25zdGFudCB1cGRhdGVkIGF0IGJhdGNoYnVmZmVyIHN1Ym1pdCB0aW1lICh3aGVuIHdlCisgICAgKiBob2xkIHRoZSBsb2NrIGFuZCBrbm93IHdoZXJlIHRoZSBidWZmZXIgcmVhbGx5IGlzKSByYXRoZXIgdGhhbiBhdCBlbWl0CisgICAgKiB0aW1lIHdoZW4gd2UgZG9uJ3QgaG9sZCB0aGUgbG9jayBhbmQgYXJlIGp1c3QgZ3Vlc3NpbmcuICBXZSBjb3VsZCBhbHNvCisgICAgKiBqdXN0IGF2b2lkIHVzaW5nIHRoaXMgYXMga2V5IGRhdGEgaWYgdGhlIHByb2dyYW0gZG9lc24ndCB1c2UKKyAgICAqIGZyYWdtZW50LnBvc2l0aW9uLgorICAgICoKKyAgICAqIFRoaXMgcHJldHR5IG11Y2ggYmVjb21lcyBtb290IHdpdGggRFJJMiBhbmQgcmVkaXJlY3RlZCBidWZmZXJzIGFueXdheSwKKyAgICAqIGFzIG91ciBvcmlnaW5zIHdpbGwgYWx3YXlzIGJlIHplcm8gdGhlbi4KKyAgICAqLworICAgaWYgKGJydy0+aW50ZWwuZHJpRHJhd2FibGUgIT0gTlVMTCkgeworICAgICAga2V5LT5vcmlnaW5feCA9IGJydy0+aW50ZWwuZHJpRHJhd2FibGUtPng7CisgICAgICBrZXktPm9yaWdpbl95ID0gYnJ3LT5pbnRlbC5kcmlEcmF3YWJsZS0+eTsKKyAgICAgIGtleS0+ZHJhd2FibGVfaGVpZ2h0ID0gYnJ3LT5pbnRlbC5kcmlEcmF3YWJsZS0+aDsKKyAgIH0KIAogICAgLyogRXh0cmEgaW5mbzoKICAgICAqLwpAQCAtMzE1LDcgKzMyMiw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgYnJ3X3VwbG9hZF93bV9wcm9nKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCitzdGF0aWMgdm9pZCBicndfcHJlcGFyZV93bV9wcm9nKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQogewogICAgc3RydWN0IGJyd193bV9wcm9nX2tleSBrZXk7CiAgICBzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqKQpAQCAtMzI1LDEzICszMzIsMTMgQEAKIAogICAgLyogTWFrZSBhbiBlYXJseSBjaGVjayBmb3IgdGhlIGtleS4KICAgICAqLwotICAgaWYgKGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGVbQlJXX1dNX1BST0ddLCAKLQkJCSZrZXksIHNpemVvZihrZXkpLAotCQkJJmJydy0+d20ucHJvZ19kYXRhLAotCQkJJmJydy0+d20ucHJvZ19nc19vZmZzZXQpKQotICAgICAgcmV0dXJuOwotCi0gICBkb193bV9wcm9nKGJydywgZnAsICZrZXkpOworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+d20ucHJvZ19ibyk7CisgICBicnctPndtLnByb2dfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfV01fUFJPRywKKwkJCQkgICAgICAma2V5LCBzaXplb2Yoa2V5KSwKKwkJCQkgICAgICBOVUxMLCAwLAorCQkJCSAgICAgICZicnctPndtLnByb2dfZGF0YSk7CisgICBpZiAoYnJ3LT53bS5wcm9nX2JvID09IE5VTEwpCisgICAgICBkb193bV9wcm9nKGJydywgZnAsICZrZXkpOwogfQogCiAKQEAgLTM0NSwxMiArMzUyLDEzIEBACiAJCV9ORVdfUE9MWUdPTiB8CiAJCV9ORVdfTElORSB8CiAJCV9ORVdfTElHSFQgfAorCQlfTkVXX0JVRkZFUlMgfAogCQlfTkVXX1RFWFRVUkUpLAogICAgICAgLmJydyAgID0gKEJSV19ORVdfRlJBR01FTlRfUFJPR1JBTSB8CiAJCUJSV19ORVdfV01fSU5QVVRfRElNRU5TSU9OUyB8CiAJCUJSV19ORVdfUkVEVUNFRF9QUklNSVRJVkUpLAogICAgICAgLmNhY2hlID0gMAogICAgfSwKLSAgIC51cGRhdGUgPSBicndfdXBsb2FkX3dtX3Byb2cKKyAgIC5wcmVwYXJlID0gYnJ3X3ByZXBhcmVfd21fcHJvZwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd20uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtLmgKaW5kZXggZjVmZGRmZC4uMjk3NjE3ZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd20uaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bS5oCkBAIC0zNCw5ICszNCw5IEBACiAjZGVmaW5lIEJSV19XTV9ICiAKIAorI2luY2x1ZGUgInNoYWRlci9wcm9nX2luc3RydWN0aW9uLmgiCiAjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKICNpbmNsdWRlICJicndfZXUuaCIKLSNpbmNsdWRlICJwcm9nX2luc3RydWN0aW9uLmgiCiAKIC8qIEEgYmlnIGxvb2t1cCB0YWJsZSBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5kIGhvdyBtYW55CiAgKiBhZGRpdGlvbmFsIHJlZ3Mgd2lsbCBpbnNlcnRlZCBiZWZvcmUgdGhlIG1haW4gcGF5bG9hZCBpbiB0aGUgV00KQEAgLTY5LDkgKzY5LDEyIEBACiAgICBHTHVpbnQgcnVudGltZV9jaGVja19hYWRzX2VtaXQ6MTsKICAgIAogICAgR0x1aW50IHl1dnRleF9tYXNrOjg7Ci0gICBHTHVpbnQgcGFkMToyNDsKKyAgIEdMdWludCB5dXZ0ZXhfc3dhcF9tYXNrOjg7CS8qIFVWIHN3YXBlZCAqLworICAgR0x1aW50IHBhZDE6MTY7CiAKICAgIEdMdWludCBwcm9ncmFtX3N0cmluZ19pZDozMjsKKyAgIEdMdWludCBvcmlnaW5feCwgb3JpZ2luX3k7CisgICBHTHVpbnQgZHJhd2FibGVfaGVpZ2h0OwogfTsKIAogCkBAIC0xNDAsNiArMTQzLDggQEAKICAgIEdMdWludCB3cml0ZW1hc2s6NDsKICAgIEdMdWludCB0ZXhfdW5pdDo0OyAgIC8qIHRleHR1cmUgdW5pdCBmb3IgVEVYLCBUWEQsIFRYUCBpbnN0cnVjdGlvbnMgKi8KICAgIEdMdWludCB0ZXhfaWR4OjM7ICAgIC8qIFRFWFRVUkVfMUQsMkQsM0QsQ1VCRSxSRUNUX0lOREVYIHNvdXJjZSB0YXJnZXQgKi8KKyAgIEdMdWludCBlb3Q6MTsgICAgCS8qIEVuZCBvZiB0aHJlYWQgaW5kaWNhdG9yIGZvciBGQl9XUklURSovCisgICBHTHVpbnQgdGFyZ2V0OjEwOyAgICAvKiB0YXJnZXQgYmluZGluZyB0YWJsZSBpbmRleCBmb3IgRkJfV1JJVEUqLwogfTsKIAogCkBAIC0xOTQsNiArMTk5LDggQEAKICAgIEdMdWludCBucl9mcF9pbnNuczsKICAgIEdMdWludCBmcF90ZW1wOwogICAgR0x1aW50IGZwX2ludGVycF9lbWl0dGVkOworICAgR0x1aW50IGZwX2ZyYWdjb2xvcl9lbWl0dGVkOworICAgR0x1aW50IGZwX2Rlcml2X2VtaXR0ZWQ7CiAKICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBwaXhlbF94eTsKICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBkZWx0YV94eTsKQEAgLTIzMSw2ICsyMzgsMTUgQEAKICAgIEdMdWludCBncmZfbGltaXQ7CiAgICBHTHVpbnQgbWF4X3dtX2dyZjsKICAgIEdMdWludCBsYXN0X3NjcmF0Y2g7CisKKyAgIHN0cnVjdCB7CisJR0xib29sZWFuIGluaXRlZDsKKwlzdHJ1Y3QgYnJ3X3JlZyByZWc7CisgICB9IHdtX3JlZ3NbUFJPR1JBTV9QQVlMT0FEKzFdWzI1Nl1bNF07CisgICBzdHJ1Y3QgYnJ3X3JlZyBzdGFjazsKKyAgIHN0cnVjdCBicndfcmVnIGVtaXRfbWFza19yZWc7CisgICBHTHVpbnQgcmVnX2luZGV4OworICAgR0x1aW50IHRtcF9pbmRleDsKIH07CiAKIApAQCAtMjU5LDQgKzI3NSw2IEBACiAJCSAgICAgICBHTHVpbnQgbG9va3VwLAogCQkgICAgICAgc3RydWN0IGJyd193bV9wcm9nX2tleSAqa2V5ICk7CiAKK0dMYm9vbGVhbiBicndfd21faXNfZ2xzbChjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnApOwordm9pZCBicndfd21fZ2xzbF9lbWl0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9lbWl0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9lbWl0LmMKaW5kZXggZmQ2MDUxNS4uOWI5MTliOSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fZW1pdC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX2VtaXQuYwpAQCAtMzksNyArMzksNyBAQAogLyogTm90IHF1aXRlIHN1cmUgaG93IGNvcnJlY3QgdGhpcyBpcyAtIG5lZWQgdG8gdW5kZXJzdGFuZCBob3JpegogICogdnMuIHZlcnRpY2FsIHN0cmlkZXMgYSBsaXR0bGUgYmV0dGVyLgogICovCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGJyd19yZWcgc2VjaGFsZiggc3RydWN0IGJyd19yZWcgcmVnICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGJyd19yZWcgc2VjaGFsZiggc3RydWN0IGJyd19yZWcgcmVnICkKIHsKICAgIGlmIChyZWcudnN0cmlkZSkKICAgICAgIHJlZy5ucisrOwpAQCAtMTIyLDI2ICsxMjIsMzAgQEAKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZW1pdF93cG9zX3h5KHN0cnVjdCBicndfY29tcGlsZSAqcCwKLQkJCSAgIGNvbnN0IHN0cnVjdCBicndfcmVnICpkc3QsCi0JCQkgICBHTHVpbnQgbWFzaywKLQkJCSAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwKQorc3RhdGljIHZvaWQgZW1pdF93cG9zX3h5KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJCSBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqZHN0LAorCQkJIEdMdWludCBtYXNrLAorCQkJIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwKQogewotICAgLyogQ2FsYyBkZWx0YSBYLFkgYnkgc3VidHJhY3Rpbmcgb3JpZ2luIGluIHIxIGZyb20gdGhlIHBpeGVsCi0gICAgKiBjZW50ZXJzLgorICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisKKyAgIC8qIENhbGN1bGF0ZSB0aGUgcGl4ZWwgb2Zmc2V0IGZyb20gd2luZG93IGJvdHRvbSBsZWZ0IGludG8gZGVzdGluYXRpb24KKyAgICAqIFggYW5kIFkgY2hhbm5lbHMuCiAgICAgKi8KICAgIGlmIChtYXNrICYgV1JJVEVNQVNLX1gpIHsKLSAgICAgIGJyd19NT1YocCwKKyAgICAgIC8qIFgnID0gWCAtIG9yaWdpbiAqLworICAgICAgYnJ3X0FERChwLAogCSAgICAgIGRzdFswXSwKLQkgICAgICByZXR5cGUoYXJnMFswXSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpKTsKKwkgICAgICByZXR5cGUoYXJnMFswXSwgQlJXX1JFR0lTVEVSX1RZUEVfVyksCisJICAgICAgYnJ3X2ltbV9kKDAgLSBjLT5rZXkub3JpZ2luX3gpKTsKICAgIH0KIAogICAgaWYgKG1hc2sgJiBXUklURU1BU0tfWSkgewotICAgICAgLyogVE9ETyAtLSB3aW5kb3dfaGVpZ2h0IC0gWSAqLwotICAgICAgYnJ3X01PVihwLAorICAgICAgLyogWScgPSBoZWlnaHQgLSAoWSAtIG9yaWdpbl95KSA9IGhlaWdodCArIG9yaWdpbl95IC0gWSAqLworICAgICAgYnJ3X0FERChwLAogCSAgICAgIGRzdFsxXSwKLQkgICAgICBuZWdhdGUocmV0eXBlKGFyZzBbMV0sIEJSV19SRUdJU1RFUl9UWVBFX1VXKSkpOwotCisJICAgICAgbmVnYXRlKHJldHlwZShhcmcwWzFdLCBCUldfUkVHSVNURVJfVFlQRV9XKSksCisJICAgICAgYnJ3X2ltbV9kKGMtPmtleS5vcmlnaW5feSArIGMtPmtleS5kcmF3YWJsZV9oZWlnaHQgLSAxKSk7CiAgICB9CiB9CiAKQEAgLTIxOSw2ICsyMjMsMTAgQEAKICAgICAgIGlmIChtYXNrICYgKDE8PGkpKSB7CiAJIGJyd19MSU5FKHAsIGJyd19udWxsX3JlZygpLCBpbnRlcnBbaV0sIGRlbHRhc1swXSk7CiAJIGJyd19NQUMocCwgZHN0W2ldLCBzdWJvZmZzZXQoaW50ZXJwW2ldLDEpLCBkZWx0YXNbMV0pOworICAgICAgfQorICAgfQorICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgaWYgKG1hc2sgJiAoMTw8aSkpIHsKIAkgYnJ3X01VTChwLCBkc3RbaV0sIGRzdFtpXSwgd1szXSk7CiAgICAgICB9CiAgICB9CkBAIC0yMjksMjAgKzIzNywyMCBAQAogCQkJIEdMdWludCBtYXNrLAogCQkJIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwICkKIHsKLSAgIHN0cnVjdCBicndfcmVnIGludGVycFs0XTsKLSAgIEdMdWludCBuciA9IGFyZzBbMF0ubnI7Ci0gICBHTHVpbnQgaTsKKwlzdHJ1Y3QgYnJ3X3JlZyBpbnRlcnBbNF07CisJR0x1aW50IG5yID0gYXJnMFswXS5ucjsKKwlHTHVpbnQgaTsKIAotICAgaW50ZXJwWzBdID0gYnJ3X3ZlYzFfZ3JmKG5yLCAwKTsKLSAgIGludGVycFsxXSA9IGJyd192ZWMxX2dyZihuciwgNCk7Ci0gICBpbnRlcnBbMl0gPSBicndfdmVjMV9ncmYobnIrMSwgMCk7Ci0gICBpbnRlcnBbM10gPSBicndfdmVjMV9ncmYobnIrMSwgNCk7CisJaW50ZXJwWzBdID0gYnJ3X3ZlYzFfZ3JmKG5yLCAwKTsKKwlpbnRlcnBbMV0gPSBicndfdmVjMV9ncmYobnIsIDQpOworCWludGVycFsyXSA9IGJyd192ZWMxX2dyZihucisxLCAwKTsKKwlpbnRlcnBbM10gPSBicndfdmVjMV9ncmYobnIrMSwgNCk7CiAKLSAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyApIHsKLSAgICAgIGlmIChtYXNrICYgKDE8PGkpKSB7Ci0JIGJyd19NT1YocCwgZHN0W2ldLCBzdWJvZmZzZXQoaW50ZXJwW2ldLDMpKTsJLyogVE9ETzogb3B0aW1pemUgYXdheSBsaWtlIG90aGVyIG1vdmVzICovCi0gICAgICB9Ci0gICB9CisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrICkgeworCQlpZiAobWFzayAmICgxPDxpKSkgeworCQkJYnJ3X01PVihwLCBkc3RbaV0sIHN1Ym9mZnNldChpbnRlcnBbaV0sMykpOwkvKiBUT0RPOiBvcHRpbWl6ZSBhd2F5IGxpa2Ugb3RoZXIgbW92ZXMgKi8KKwkJfQorCX0KIH0KIAogCkBAIC0zNDMsNyArMzUxLDI0IEBACiAgICAgICB9CiAgICB9CiB9CitzdGF0aWMgdm9pZCBlbWl0X3NvcCggc3RydWN0IGJyd19jb21waWxlICpwLCAKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmRzdCwKKwkJICAgICAgR0x1aW50IG1hc2ssCisJCSAgICAgIEdMdWludCBjb25kLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEgKQoreworICAgR0x1aW50IGk7CiAKKyAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGlmIChtYXNrICYgKDE8PGkpKSB7CQorCSBicndfTU9WKHAsIGRzdFtpXSwgYnJ3X2ltbV9mKDApKTsKKwkgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgY29uZCwgYXJnMFtpXSwgYXJnMVtpXSk7CisJIGJyd19NT1YocCwgZHN0W2ldLCBicndfaW1tX2YoMS4wKSk7CisJIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2xfZmxhZ192YWx1ZShwLCAweGZmKTsKKyAgICAgIH0KKyAgIH0KK30KIAogc3RhdGljIHZvaWQgZW1pdF9zbHQoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICpkc3QsCkBAIC0zNTEsMzkgKzM3Niw1MyBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEgKQogewotICAgR0x1aW50IGk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgIGlmIChtYXNrICYgKDE8PGkpKSB7CQotCSBicndfTU9WKHAsIGRzdFtpXSwgYnJ3X2ltbV9mKDApKTsKLQkgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX0wsIGFyZzBbaV0sIGFyZzFbaV0pOwotCSBicndfTU9WKHAsIGRzdFtpXSwgYnJ3X2ltbV9mKDEuMCkpOwotCSBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sX2ZsYWdfdmFsdWUocCwgMHhmZik7Ci0gICAgICB9Ci0gICB9CisJIGVtaXRfc29wKHAsIGRzdCwgbWFzaywgQlJXX0NPTkRJVElPTkFMX0wsIGFyZzAsIGFyZzEpOwogfQogCi0vKiBJc24ndCB0aGlzIGp1c3QgdGhlIHNhbWUgYXMgdGhlIGFib3ZlIHdpdGggdGhlIGFyZ3Mgc3dhcHBlZD8KLSAqLworc3RhdGljIHZvaWQgZW1pdF9zbGUoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgCisJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICpkc3QsCisJCSAgICAgIEdMdWludCBtYXNrLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEgKQoreworCSBlbWl0X3NvcChwLCBkc3QsIG1hc2ssIEJSV19DT05ESVRJT05BTF9MRSwgYXJnMCwgYXJnMSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfc2d0KCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqZHN0LAorCQkgICAgICBHTHVpbnQgbWFzaywKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzAsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcxICkKK3sKKwkgZW1pdF9zb3AocCwgZHN0LCBtYXNrLCBCUldfQ09ORElUSU9OQUxfRywgYXJnMCwgYXJnMSk7Cit9CisKIHN0YXRpYyB2b2lkIGVtaXRfc2dlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIAogCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqZHN0LAogCQkgICAgICBHTHVpbnQgbWFzaywKIAkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzAsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcxICkKIHsKLSAgIEdMdWludCBpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICBpZiAobWFzayAmICgxPDxpKSkgewkKLQkgYnJ3X01PVihwLCBkc3RbaV0sIGJyd19pbW1fZigwKSk7Ci0JIGJyd19DTVAocCwgYnJ3X251bGxfcmVnKCksIEJSV19DT05ESVRJT05BTF9HRSwgYXJnMFtpXSwgYXJnMVtpXSk7Ci0JIGJyd19NT1YocCwgZHN0W2ldLCBicndfaW1tX2YoMS4wKSk7Ci0JIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2xfZmxhZ192YWx1ZShwLCAweGZmKTsKLSAgICAgIH0KLSAgIH0KKwkgZW1pdF9zb3AocCwgZHN0LCBtYXNrLCBCUldfQ09ORElUSU9OQUxfR0UsIGFyZzAsIGFyZzEpOwogfQogCitzdGF0aWMgdm9pZCBlbWl0X3NlcSggc3RydWN0IGJyd19jb21waWxlICpwLCAKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmRzdCwKKwkJICAgICAgR0x1aW50IG1hc2ssCisJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMSApCit7CisJIGVtaXRfc29wKHAsIGRzdCwgbWFzaywgQlJXX0NPTkRJVElPTkFMX0VRLCBhcmcwLCBhcmcxKTsKK30KIAorc3RhdGljIHZvaWQgZW1pdF9zbmUoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgCisJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICpkc3QsCisJCSAgICAgIEdMdWludCBtYXNrLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEgKQoreworCSBlbWl0X3NvcChwLCBkc3QsIG1hc2ssIEJSV19DT05ESVRJT05BTF9ORVEsIGFyZzAsIGFyZzEpOworfQogCiBzdGF0aWMgdm9pZCBlbWl0X2NtcCggc3RydWN0IGJyd19jb21waWxlICpwLCAKIAkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmRzdCwKQEAgLTQ2NSw2ICs1MDQsOSBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEgKQogeworICAgaWYgKCEobWFzayAmIFdSSVRFTUFTS19YWVpXKSkKKyAgICAgIHJldHVybjsgLyogRG8gbm90IGVtaXQgZGVhZCBjb2RlKi8KKwogICAgYXNzZXJ0KChtYXNrICYgV1JJVEVNQVNLX1hZWlcpID09IFdSSVRFTUFTS19YKTsKIAogICAgYnJ3X01VTChwLCBicndfbnVsbF9yZWcoKSwgYXJnMFswXSwgYXJnMVswXSk7CkBAIC00ODIsNiArNTI0LDkgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzAsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcxICkKIHsKKyAgIGlmICghKG1hc2sgJiBXUklURU1BU0tfWFlaVykpCisgICAgICByZXR1cm47IC8qIERvIG5vdCBlbWl0IGRlYWQgY29kZSovCisKICAgIGFzc2VydCgobWFzayAmIFdSSVRFTUFTS19YWVpXKSA9PSBXUklURU1BU0tfWCk7CiAKICAgIGJyd19NVUwocCwgYnJ3X251bGxfcmVnKCksIGFyZzBbMF0sIGFyZzFbMF0pOwpAQCAtNTAwLDYgKzU0NSw5IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMSApCiB7CisgICBpZiAoIShtYXNrICYgV1JJVEVNQVNLX1hZWlcpKQorICAgICAgcmV0dXJuOyAvKiBEbyBub3QgZW1pdCBkZWFkIGNvZGUqLworCiAgICBhc3NlcnQoKG1hc2sgJiBXUklURU1BU0tfWFlaVykgPT0gV1JJVEVNQVNLX1gpOwogCiAgICBicndfTVVMKHAsIGJyd19udWxsX3JlZygpLCBhcmcwWzBdLCBhcmcxWzBdKTsKQEAgLTU0Myw4ICs1OTEsMTEgQEAKIAkJCUdMdWludCBtYXNrLAogCQkJY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzAgKQogewotICAgYXNzZXJ0KChtYXNrICYgV1JJVEVNQVNLX1hZWlcpID09IFdSSVRFTUFTS19YIHx8Ci0JICBmdW5jdGlvbiA9PSBCUldfTUFUSF9GVU5DVElPTl9TSU5DT1MpOworICAgaWYgKCEobWFzayAmIFdSSVRFTUFTS19YWVpXKSkKKyAgICAgIHJldHVybjsgLyogRG8gbm90IGVtaXQgZGVhZCBjb2RlKi8KKworICAgLy9hc3NlcnQoKG1hc2sgJiBXUklURU1BU0tfWFlaVykgPT0gV1JJVEVNQVNLX1ggfHwKKyAgIC8vCSAgZnVuY3Rpb24gPT0gQlJXX01BVEhfRlVOQ1RJT05fU0lOQ09TKTsKICAgIAogICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoMiksIGFyZzBbMF0pOwogCkBAIC01NjcsNiArNjE4LDkgQEAKIAkJCWNvbnN0IHN0cnVjdCBicndfcmVnICphcmcwLAogCQkJY29uc3Qgc3RydWN0IGJyd19yZWcgKmFyZzEpCiB7CisgICBpZiAoIShtYXNrICYgV1JJVEVNQVNLX1hZWlcpKQorICAgICAgcmV0dXJuOyAvKiBEbyBub3QgZW1pdCBkZWFkIGNvZGUqLworCiAgICBhc3NlcnQoKG1hc2sgJiBXUklURU1BU0tfWFlaVykgPT0gV1JJVEVNQVNLX1gpOwogCiAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOwpAQCAtNjYxLDcgKzcxNSw3IEBACiAJICAgICAgcmV0eXBlKHZlYzE2KGRzdFswXSksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwKIAkgICAgICAxLAogCSAgICAgIHJldHlwZShjLT5wYXlsb2FkLmRlcHRoWzBdLmh3X3JlZywgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAotCSAgICAgIGluc3QtPnRleF91bml0ICsgMSwgLyogc3VyZmFjZSAqLworCSAgICAgIGluc3QtPnRleF91bml0ICsgTUFYX0RSQVdfQlVGRkVSUywgLyogc3VyZmFjZSAqLwogCSAgICAgIGluc3QtPnRleF91bml0LAkgIC8qIHNhbXBsZXIgKi8KIAkgICAgICBpbnN0LT53cml0ZW1hc2ssCiAJICAgICAgKHNoYWRvdyA/IApAQCAtNjcwLDcgKzcyNCw2IEBACiAJICAgICAgcmVzcG9uc2VMZW5ndGgsCiAJICAgICAgbXNnTGVuZ3RoLAogCSAgICAgIDApOwkKLQogfQogCiAKQEAgLTcxMiw3ICs3NjUsNyBAQAogCSAgICAgIHJldHlwZSh2ZWMxNihkc3RbMF0pLCBCUldfUkVHSVNURVJfVFlQRV9VVyksCiAJICAgICAgMSwKIAkgICAgICByZXR5cGUoYy0+cGF5bG9hZC5kZXB0aFswXS5od19yZWcsIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwKLQkgICAgICBpbnN0LT50ZXhfdW5pdCArIDEsIC8qIHN1cmZhY2UgKi8KKwkgICAgICBpbnN0LT50ZXhfdW5pdCArIE1BWF9EUkFXX0JVRkZFUlMsIC8qIHN1cmZhY2UgKi8KIAkgICAgICBpbnN0LT50ZXhfdW5pdCwJICAvKiBzYW1wbGVyICovCiAJICAgICAgaW5zdC0+d3JpdGVtYXNrLAogCSAgICAgIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRV9CSUFTLApAQCAtNzc3LDYgKzgzMCw3IEBACiAgICAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOwogICAgICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX0dFLCBhcmcwW2ldLCBicndfaW1tX2YoMCkpOyAgIAogICAgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbF9mbGFnX3ZhbHVlKHAsIDB4ZmYpOworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKICAgICAgIGJyd19BTkQocCwgcjB1dywgYnJ3X2ZsYWdfcmVnKCksIHIwdXcpOwogICAgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOwogICAgfQpAQCAtNzg0LDcgKzgzOCw5IEBACiAKIHN0YXRpYyB2b2lkIGZpcmVfZmJfd3JpdGUoIHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKIAkJCSAgIEdMdWludCBiYXNlX3JlZywKLQkJCSAgIEdMdWludCBuciApCisJCQkgICBHTHVpbnQgbnIsCisJCQkgICBHTHVpbnQgdGFyZ2V0LAorCQkJICAgR0x1aW50IGVvdCApCiB7CiAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKICAgIApAQCAtODA3LDEwICs4NjMsMTAgQEAKIAkJcmV0eXBlKHZlYzE2KGJyd19udWxsX3JlZygpKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAogCQliYXNlX3JlZywKIAkJcmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAotCQkwLAkJLyogcmVuZGVyIHN1cmZhY2UgYWx3YXlzIDAgKi8KKwkJdGFyZ2V0LAkJCiAJCW5yLAogCQkwLCAKLQkJMSk7CisJCWVvdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVtaXRfYWEoIHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKQEAgLTgzNSw3ICs4OTEsOSBAQAogc3RhdGljIHZvaWQgZW1pdF9mYl93cml0ZSggc3RydWN0IGJyd193bV9jb21waWxlICpjLAogCQkJICAgc3RydWN0IGJyd19yZWcgKmFyZzAsCiAJCQkgICBzdHJ1Y3QgYnJ3X3JlZyAqYXJnMSwKLQkJCSAgIHN0cnVjdCBicndfcmVnICphcmcyKQorCQkJICAgc3RydWN0IGJyd19yZWcgKmFyZzIsCisJCQkgICBHTHVpbnQgdGFyZ2V0LAorCQkJICAgR0x1aW50IGVvdCkKIHsKICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOwogICAgR0x1aW50IG5yID0gMjsKQEAgLTg5MCwxNSArOTQ4LDE2IEBACiAgICAgICBHTHVpbnQgb2ZmID0gYy0+a2V5LmRlc3RfZGVwdGhfcmVnICUgMjsKIAogICAgICAgaWYgKG9mZiAhPSAwKSB7Ci0JIGJyd19wdXNoX2luc25fc3RhdGUocCk7Ci0JIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7Ci0JIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKG5yKSwgYXJnMVtjb21wXSk7Ci0JIC8qIDJuZCBoYWxmPyAqLwotCSBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyhucisxKSwgb2Zmc2V0KGFyZzFbY29tcF0sMSkpOwotCSBicndfcG9wX2luc25fc3RhdGUocCk7CisgICAgICAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKworICAgICAgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcobnIpLCBvZmZzZXQoYXJnMVtjb21wXSwxKSk7CisgICAgICAgICAvKiAybmQgaGFsZj8gKi8KKyAgICAgICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKG5yKzEpLCBhcmcxW2NvbXArMV0pOworICAgICAgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOwogICAgICAgfQogICAgICAgZWxzZSB7Ci0JIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKG5yKSwgYXJnMVtjb21wXSk7CisgICAgICAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyhuciksIGFyZzFbY29tcF0pOwogICAgICAgfQogICAgICAgbnIgKz0gMjsKICAgIH0KQEAgLTkwOCw3ICs5NjcsNyBAQAogICAgICAgaWYgKGMtPmtleS5hYV9kZXN0X3N0ZW5jaWxfcmVnKQogCSBlbWl0X2FhKGMsIGFyZzEsIDIpOwogCi0gICAgICBmaXJlX2ZiX3dyaXRlKGMsIDAsIG5yKTsKKyAgICAgIGZpcmVfZmJfd3JpdGUoYywgMCwgbnIsIHRhcmdldCwgZW90KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgc3RydWN0IGJyd19yZWcgdjFfbnVsbF91ZCA9IHZlYzEocmV0eXBlKGJyd19udWxsX3JlZygpLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOwpAQCAtOTI1LDE0ICs5ODQsMTQgQEAKICAgICAgIGptcCA9IGJyd19KTVBJKHAsIGlwLCBpcCwgYnJ3X2ltbV93KDApKTsKICAgICAgIHsKIAkgZW1pdF9hYShjLCBhcmcxLCAyKTsKLQkgZmlyZV9mYl93cml0ZShjLCAwLCBucik7CisJIGZpcmVfZmJfd3JpdGUoYywgMCwgbnIsIHRhcmdldCwgZW90KTsKIAkgLyogbm90ZSAtIHRocmVhZCBraWxsZWQgaW4gc3Vicm91dGluZSAqLwogICAgICAgfQogICAgICAgYnJ3X2xhbmRfZndkX2p1bXAocCwgam1wKTsKIAogICAgICAgLyogRUxTRTogU2h1ZmZsZSB1cCBvbmUgcmVnaXN0ZXIgdG8gZmlsbCBpbiB0aGUgaG9sZSBsZWZ0IGZvciBBQToKICAgICAgICAqLwotICAgICAgZmlyZV9mYl93cml0ZShjLCAxLCBuci0xKTsKKyAgICAgIGZpcmVfZmJfd3JpdGUoYywgMSwgbnItMSwgdGFyZ2V0LCBlb3QpOwogICAgfQogfQogCkBAIC0xMDgwLDcgKzExMzksNyBAQAogCSBicmVhazsKIAogICAgICAgY2FzZSBXTV9XUE9TWFk6Ci0JIGVtaXRfd3Bvc194eShwLCBkc3QsIGRzdF9mbGFncywgYXJnc1swXSk7CisJIGVtaXRfd3Bvc194eShjLCBkc3QsIGRzdF9mbGFncywgYXJnc1swXSk7CiAJIGJyZWFrOwogCiAgICAgICBjYXNlIFdNX1BJWEVMVzoKQEAgLTExMDAsNyArMTE1OSw3IEBACiAJIGJyZWFrOwogCiAgICAgICBjYXNlIFdNX0ZCX1dSSVRFOgotCSBlbWl0X2ZiX3dyaXRlKGMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCSBlbWl0X2ZiX3dyaXRlKGMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGluc3QtPnRhcmdldCwgaW5zdC0+ZW90KTsKIAkgYnJlYWs7CiAKIAkgLyogU3RyYWlnaHRmb3J3YXJkIGFyaXRobWV0aWM6CkBAIC0xMjA4LDkgKzEyNjcsMjEgQEAKIAkgZW1pdF9zbHQocCwgZHN0LCBkc3RfZmxhZ3MsIGFyZ3NbMF0sIGFyZ3NbMV0pOwogCSBicmVhazsKIAorICAgICAgY2FzZSBPUENPREVfU0xFOgorCSBlbWl0X3NsZShwLCBkc3QsIGRzdF9mbGFncywgYXJnc1swXSwgYXJnc1sxXSk7CisJYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TR1Q6CisJIGVtaXRfc2d0KHAsIGRzdCwgZHN0X2ZsYWdzLCBhcmdzWzBdLCBhcmdzWzFdKTsKKwlicmVhazsKICAgICAgIGNhc2UgT1BDT0RFX1NHRToKIAkgZW1pdF9zZ2UocCwgZHN0LCBkc3RfZmxhZ3MsIGFyZ3NbMF0sIGFyZ3NbMV0pOwogCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1NFUToKKwkgZW1pdF9zZXEocCwgZHN0LCBkc3RfZmxhZ3MsIGFyZ3NbMF0sIGFyZ3NbMV0pOworCWJyZWFrOworICAgICAgY2FzZSBPUENPREVfU05FOgorCSBlbWl0X3NuZShwLCBkc3QsIGRzdF9mbGFncywgYXJnc1swXSwgYXJnc1sxXSk7CisJYnJlYWs7CiAKICAgICAgIGNhc2UgT1BDT0RFX0xJVDoKIAkgZW1pdF9saXQocCwgZHN0LCBkc3RfZmxhZ3MsIGFyZ3NbMF0pOwpAQCAtMTIzMSw3ICsxMzAyLDggQEAKIAkgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6Ci0JIGFzc2VydCgwKTsKKwlfbWVzYV9wcmludGYoInVuc3VwcG9ydCBvcGNvZGUgJWQgaW4gZnJhZ21lbnQgcHJvZ3JhbVxuIiwgCisJCWluc3QtPm9wY29kZSk7CiAgICAgICB9CiAgICAgICAKICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9mcC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fZnAuYwppbmRleCBmZjk3ZDg3Li5iYzkzM2ZlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9mcC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX2ZwLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGdldF90ZW1wKCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMgKQogewotICAgaW50IGJpdCA9IGZmcyggfmMtPmZwX3RlbXAgKTsKKyAgIGludCBiaXQgPSBfbWVzYV9mZnMoIH5jLT5mcF90ZW1wICk7CiAKICAgIGlmICghYml0KSB7CiAgICAgICBfbWVzYV9wcmludGYoIiVzOiBvdXQgb2YgdGVtcG9yYXJpZXNcbiIsIF9fRklMRV9fKTsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiBzdGF0aWMgdm9pZCByZWxlYXNlX3RlbXAoIHN0cnVjdCBicndfd21fY29tcGlsZSAqYywgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIHRlbXAgKQogewotICAgYy0+ZnBfdGVtcCAmPSB+MTw8KHRlbXAuSW5kZXggKyAxIC0gRklSU1RfSU5URVJOQUxfVEVNUCk7CisgICBjLT5mcF90ZW1wICY9IH4oMSA8PCAodGVtcC5JbmRleCAtIEZJUlNUX0lOVEVSTkFMX1RFTVApKTsKIH0KIAogCkBAIC0xNzYsNiArMTc2LDcgQEAKIHsKICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gZ2V0X2ZwX2luc3QoYyk7CiAgICAqaW5zdCA9ICppbnN0MDsKKyAgIGluc3QtPkRhdGEgPSAodm9pZCAqKWluc3QwOwogICAgcmV0dXJuIGluc3Q7CiB9CiAKQEAgLTIwMSw3ICsyMDIsNiBAQAogICAgaW5zdC0+U3JjUmVnWzBdID0gc3JjMDsKICAgIGluc3QtPlNyY1JlZ1sxXSA9IHNyYzE7CiAgICBpbnN0LT5TcmNSZWdbMl0gPSBzcmMyOwotICAgCiAgICByZXR1cm4gaW5zdDsKIH0KICAgIApAQCAtMzYxLDYgKzM2MSwzNyBAQAogICAgYy0+ZnBfaW50ZXJwX2VtaXR0ZWQgfD0gMTw8aWR4OwogfQogCitzdGF0aWMgdm9pZCBlbWl0X2RkeCggc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCApCit7CisgICAgR0x1aW50IGlkeCA9IGluc3QtPlNyY1JlZ1swXS5JbmRleDsKKyAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgaW50ZXJwID0gc3JjX3JlZyhQUk9HUkFNX1BBWUxPQUQsIGlkeCk7CisKKyAgICBjLT5mcF9kZXJpdl9lbWl0dGVkIHw9IDE8PGlkeDsKKyAgICBlbWl0X29wKGMsCisgICAgICAgICAgICBPUENPREVfRERYLAorICAgICAgICAgICAgaW5zdC0+RHN0UmVnLAorICAgICAgICAgICAgMCwgMCwgMCwKKyAgICAgICAgICAgIGludGVycCwKKyAgICAgICAgICAgIGdldF9waXhlbF93KGMpLAorICAgICAgICAgICAgc3JjX3VuZGVmKCkpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2RkeSggc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCApCit7CisgICAgR0x1aW50IGlkeCA9IGluc3QtPlNyY1JlZ1swXS5JbmRleDsKKyAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgaW50ZXJwID0gc3JjX3JlZyhQUk9HUkFNX1BBWUxPQUQsIGlkeCk7CisKKyAgICBjLT5mcF9kZXJpdl9lbWl0dGVkIHw9IDE8PGlkeDsKKyAgICBlbWl0X29wKGMsCisgICAgICAgICAgICBPUENPREVfRERZLAorICAgICAgICAgICAgaW5zdC0+RHN0UmVnLAorICAgICAgICAgICAgMCwgMCwgMCwKKyAgICAgICAgICAgIGludGVycCwKKyAgICAgICAgICAgIGdldF9waXhlbF93KGMpLAorICAgICAgICAgICAgc3JjX3VuZGVmKCkpOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEhhY2tzIHRvIGV4dGVuZCB0aGUgcHJvZ3JhbSBwYXJhbWV0ZXIgYW5kIGNvbnN0YW50IGxpc3RzLgpAQCAtNDMzLDcgKzQ2NCw3IEBACiAgICB9CiAgICAKICAgIGlkeCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KCBwYXJhbUxpc3QsIHZhbHVlcywgNCwgJnN3aXp6bGUgKTsKLSAgIC8qIFhYWCB3aGF0IGFib3V0IHN3aXp6bGU/ICovCisgICBhc3NlcnQoc3dpenpsZSA9PSBTV0laWkxFX05PT1ApOyAvKiBOZWVkIHRvIGhhbmRsZSBzd2l6emxlIGluIHJlZyBzZXR1cCAqLwogICAgcmV0dXJuIHNyY19yZWcoUFJPR1JBTV9TVEFURV9WQVIsIGlkeCk7CiB9CiAKQEAgLTQ2MywxNyArNDk0LDIwIEBACiAKIAogICAgaWYgKGRzdC5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWFopIHsKKyAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpzd3o7CiAgICAgICBHTHVpbnQgeiA9IEdFVF9TV1ooc3JjMC5Td2l6emxlLCBaKTsKIAogICAgICAgLyogZHN0Lnh6ID0gc3d6IHNyYzAuMXp6egogICAgICAgICovCi0gICAgICBlbWl0X29wKGMsCi0JICAgICAgT1BDT0RFX1NXWiwKLQkgICAgICBkc3RfbWFzayhkc3QsIFdSSVRFTUFTS19YWiksCi0JICAgICAgaW5zdC0+U2F0dXJhdGVNb2RlLCAwLCAwLAotCSAgICAgIHNyY19zd2l6emxlKHNyYzAsIFNXSVpaTEVfT05FLCB6LCB6LCB6KSwKLQkgICAgICBzcmNfdW5kZWYoKSwKLQkgICAgICBzcmNfdW5kZWYoKSk7CisgICAgICBzd3ogPSBlbWl0X29wKGMsCisJCSAgICBPUENPREVfU1daLAorCQkgICAgZHN0X21hc2soZHN0LCBXUklURU1BU0tfWFopLAorCQkgICAgaW5zdC0+U2F0dXJhdGVNb2RlLCAwLCAwLAorCQkgICAgc3JjX3N3aXp6bGUoc3JjMCwgU1dJWlpMRV9PTkUsIHosIHosIHopLAorCQkgICAgc3JjX3VuZGVmKCksCisJCSAgICBzcmNfdW5kZWYoKSk7CisgICAgICAvKiBBdm9pZCBsZXR0aW5nIG5lZ2F0aW9uIGZsYWcgb2Ygc3JjMCBhZmZlY3Qgb3VyIDEgY29uc3RhbnQuICovCisgICAgICBzd3otPlNyY1JlZ1swXS5OZWdhdGVCYXNlICY9IH5ORUdBVEVfWDsKICAgIH0KICAgIGlmIChkc3QuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1cpIHsKICAgICAgIC8qIGRzdC53ID0gbW92IHNyYzEudwpAQCAtNDk2LDE1ICs1MzAsMTkgQEAKICAgIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3QgPSBpbnN0LT5Ec3RSZWc7CiAgICAKICAgIGlmIChkc3QuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1hXKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqc3d6OworCiAgICAgICAvKiBkc3QueHcgPSBzd3ogc3JjMC4xMTExCiAgICAgICAgKi8KLSAgICAgIGVtaXRfb3AoYywKLQkgICAgICBPUENPREVfU1daLAotCSAgICAgIGRzdF9tYXNrKGRzdCwgV1JJVEVNQVNLX1hXKSwKLQkgICAgICAwLCAwLCAwLAotCSAgICAgIHNyY19zd2l6emxlMShzcmMwLCBTV0laWkxFX09ORSksCi0JICAgICAgc3JjX3VuZGVmKCksCi0JICAgICAgc3JjX3VuZGVmKCkpOworICAgICAgc3d6ID0gZW1pdF9vcChjLAorCQkgICAgT1BDT0RFX1NXWiwKKwkJICAgIGRzdF9tYXNrKGRzdCwgV1JJVEVNQVNLX1hXKSwKKwkJICAgIDAsIDAsIDAsCisJCSAgICBzcmNfc3dpenpsZTEoc3JjMCwgU1dJWlpMRV9PTkUpLAorCQkgICAgc3JjX3VuZGVmKCksCisJCSAgICBzcmNfdW5kZWYoKSk7CisgICAgICAvKiBBdm9pZCBsZXR0aW5nIHRoZSBuZWdhdGlvbiBmbGFnIG9mIHNyYzAgYWZmZWN0IG91ciAxIGNvbnN0YW50LiAqLworICAgICAgc3d6LT5TcmNSZWdbMF0uTmVnYXRlQmFzZSA9IDA7CiAgICB9CiAKIApAQCAtNTI0LDEzICs1NjIsNjQgQEAKIHsKICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBjb29yZDsKICAgIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciB0bXBjb29yZDsKKyAgIEdMdWludCB1bml0ID0gYy0+ZnAtPnByb2dyYW0uQmFzZS5TYW1wbGVyVW5pdHNbaW5zdC0+VGV4U3JjVW5pdF07CiAKLSAgIGlmIChpbnN0LT5UZXhTcmNUYXJnZXQgPT0gVEVYVFVSRV9SRUNUX0lOREVYKSB7CisgICBpZiAoaW5zdC0+VGV4U3JjVGFyZ2V0ID09IFRFWFRVUkVfQ1VCRV9JTkRFWCkgeworICAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpvdXQ7CisgICAgICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIHRtcDAgPSBnZXRfdGVtcChjKTsKKyAgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgdG1wMHNyYyA9IHNyY19yZWdfZnJvbV9kc3QodG1wMCk7CisgICAgICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIHRtcDEgPSBnZXRfdGVtcChjKTsKKyAgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgdG1wMXNyYyA9IHNyY19yZWdfZnJvbV9kc3QodG1wMSk7CisgICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYzAgPSBpbnN0LT5TcmNSZWdbMF07CisKKyAgICAgICB0bXBjb29yZCA9IGdldF90ZW1wKGMpOworICAgICAgIGNvb3JkID0gc3JjX3JlZ19mcm9tX2RzdCh0bXBjb29yZCk7CisKKyAgICAgICBvdXQgPSBlbWl0X29wKGMsIE9QQ09ERV9NT1YsCisgICAgICAgICAgICAgICAgICAgICB0bXBjb29yZCwKKyAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgc3JjX3VuZGVmKCksCisgICAgICAgICAgICAgICAgICAgICBzcmNfdW5kZWYoKSk7CisgICAgICAgb3V0LT5TcmNSZWdbMF0uTmVnYXRlQmFzZSA9IDA7CisgICAgICAgb3V0LT5TcmNSZWdbMF0uQWJzID0gMTsKKworICAgICAgIGVtaXRfb3AoYywgT1BDT0RFX01BWCwKKyAgICAgICAgICAgICAgIHRtcDAsCisgICAgICAgICAgICAgICAwLCAwLCAwLAorICAgICAgICAgICAgICAgc3JjX3N3aXp6bGUxKGNvb3JkLCBYKSwKKyAgICAgICAgICAgICAgIHNyY19zd2l6emxlMShjb29yZCwgWSksCisgICAgICAgICAgICAgICBzcmNfdW5kZWYoKSk7CisKKyAgICAgICBlbWl0X29wKGMsIE9QQ09ERV9NQVgsCisgICAgICAgICAgICAgICB0bXAxLAorICAgICAgICAgICAgICAgMCwgMCwgMCwKKyAgICAgICAgICAgICAgIHRtcDBzcmMsCisgICAgICAgICAgICAgICBzcmNfc3dpenpsZTEoY29vcmQsIFopLAorICAgICAgICAgICAgICAgc3JjX3VuZGVmKCkpOworCisgICAgICAgZW1pdF9vcChjLCBPUENPREVfUkNQLAorICAgICAgICAgICAgICAgdG1wMCwKKyAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICB0bXAxc3JjLAorICAgICAgICAgICAgICAgc3JjX3VuZGVmKCksCisgICAgICAgICAgICAgICBzcmNfdW5kZWYoKSk7CisKKyAgICAgICBlbWl0X29wKGMsIE9QQ09ERV9NVUwsCisgICAgICAgICAgICAgICB0bXBjb29yZCwKKyAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICBzcmMwLAorICAgICAgICAgICAgICAgdG1wMHNyYywKKyAgICAgICAgICAgICAgIHNyY191bmRlZigpKTsKKworICAgICAgIHJlbGVhc2VfdGVtcChjLCB0bXAwKTsKKyAgICAgICByZWxlYXNlX3RlbXAoYywgdG1wMSk7CisgICB9IGVsc2UgaWYgKGluc3QtPlRleFNyY1RhcmdldCA9PSBURVhUVVJFX1JFQ1RfSU5ERVgpIHsKICAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzY2FsZSA9IAogCSBzZWFyY2hfb3JfYWRkX3BhcmFtNSggYywgCiAJCQkgICAgICAgU1RBVEVfSU5URVJOQUwsIAogCQkJICAgICAgIFNUQVRFX1RFWFJFQ1RfU0NBTEUsCi0JCQkgICAgICAgaW5zdC0+VGV4U3JjVW5pdCwKKwkJCSAgICAgICB1bml0LAogCQkJICAgICAgIDAsMCApOwogCiAgICAgICB0bXBjb29yZCA9IGdldF90ZW1wKGMpOwpAQCAtNTU2LDI5ICs2NDUsMzMgQEAKICAgICAqIGNvbnZlcnNpb24gcmVxdWlyZXMgYWxsb2NhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB3aGljaCB3ZQogICAgICogZG9uJ3QgaGF2ZSB0aGUgZmFjaWxpdHkgdG8gZG8gdGhhdCBsYXRlIGluIHRoZSBjb21waWxhdGlvbi4KICAgICAqLwotICAgaWYgKCEoYy0+a2V5Lnl1dnRleF9tYXNrICYgKDE8PGluc3QtPlRleFNyY1VuaXQpKSkgeworICAgaWYgKCEoYy0+a2V5Lnl1dnRleF9tYXNrICYgKDE8PHVuaXQpKSkgewogICAgICAgZW1pdF9vcChjLCAKIAkgICAgICBPUENPREVfVEVYLAogCSAgICAgIGluc3QtPkRzdFJlZywKIAkgICAgICBpbnN0LT5TYXR1cmF0ZU1vZGUsCi0JICAgICAgaW5zdC0+VGV4U3JjVW5pdCwKKwkgICAgICB1bml0LAogCSAgICAgIGluc3QtPlRleFNyY1RhcmdldCwKIAkgICAgICBjb29yZCwKIAkgICAgICBzcmNfdW5kZWYoKSwKIAkgICAgICBzcmNfdW5kZWYoKSk7CiAgICB9CiAgICBlbHNlIHsKKyAgICAgICBHTGJvb2xlYW4gIHN3YXBfdXYgPSBjLT5rZXkueXV2dGV4X3N3YXBfbWFzayAmICgxPDx1bml0KTsKKwogICAgICAgLyogCiAJIENPTlNUIEMwID0geyAtLjUsIC0uMDYyNSwgIC0uNSwgMS4xNjQgfQogCSBDT05TVCBDMSA9IHsgMS41OTYsIC0wLjgxMywgMi4wMTgsIC0uMzkxIH0KIAkgVVlWICAgICA9IFRFWCAuLi4KIAkgVVlWLnh5eiA9IEFERCBVWVYsICAgICBDMAogCSBVWVYueSAgID0gTVVMIFVZVi55LCAgIEMwLncKLQkgUkdCLnh5eiA9IE1BRCBVWVYueHh6LCBDMSwgICBVWVYueQorIAkgaWYgKFVWIHN3YXBlZCkKKwkgICAgUkdCLnh5eiA9IE1BRCBVWVYuenp4LCBDMSwgICBVWVYueQorCSBlbHNlCisJICAgIFJHQi54eXogPSBNQUQgVVlWLnh4eiwgQzEsICAgVVlWLnkgCiAJIFJHQi55ICAgPSBNQUQgVVlWLnosICAgQzEudywgUkdCLnkKICAgICAgICovCiAgICAgICBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgZHN0ID0gaW5zdC0+RHN0UmVnOwotICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYzAgPSBpbnN0LT5TcmNSZWdbMF07CiAgICAgICBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgdG1wID0gZ2V0X3RlbXAoYyk7CiAgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgdG1wc3JjID0gc3JjX3JlZ19mcm9tX2RzdCh0bXApOwogICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIEMwID0gc2VhcmNoX29yX2FkZF9jb25zdDRmKCBjLCAgLS41LCAtLjA2MjUsIC0uNSwgMS4xNjQgKTsKQEAgLTU5MCw5ICs2ODMsOSBAQAogCSAgICAgIE9QQ09ERV9URVgsCiAJICAgICAgdG1wLAogCSAgICAgIGluc3QtPlNhdHVyYXRlTW9kZSwKLQkgICAgICBpbnN0LT5UZXhTcmNVbml0LAorCSAgICAgIHVuaXQsCiAJICAgICAgaW5zdC0+VGV4U3JjVGFyZ2V0LAotCSAgICAgIHNyYzAsCisJICAgICAgY29vcmQsCiAJICAgICAgc3JjX3VuZGVmKCksCiAJICAgICAgc3JjX3VuZGVmKCkpOwogCkBAIC02MDgsNiArNzAxLDcgQEAKIAogICAgICAgLyogWVVWLnkgICA9IE1VTCBZVVYueSwgQzAudwogICAgICAgICovCisKICAgICAgIGVtaXRfb3AoYywKIAkgICAgICBPUENPREVfTVVMLAogCSAgICAgIGRzdF9tYXNrKHRtcCwgV1JJVEVNQVNLX1kpLApAQCAtNjE2LDEzICs3MTAsMTggQEAKIAkgICAgICBzcmNfc3dpenpsZTEoQzAsIFcpLAogCSAgICAgIHNyY191bmRlZigpKTsKIAotICAgICAgLyogUkdCLnh5eiA9IE1BRCBZVVYueHh6LCBDMSwgWVVWLnkKKyAgICAgIC8qIAorICAgICAgICogaWYgKFVWIHN3YXBlZCkKKyAgICAgICAqICAgICBSR0IueHl6ID0gTUFEIFlVVi56engsIEMxLCBZVVYueQorICAgICAgICogZWxzZQorICAgICAgICogICAgIFJHQi54eXogPSBNQUQgWVVWLnh4eiwgQzEsIFlVVi55CiAgICAgICAgKi8KKwogICAgICAgZW1pdF9vcChjLAogCSAgICAgIE9QQ09ERV9NQUQsCiAJICAgICAgZHN0X21hc2soZHN0LCBXUklURU1BU0tfWFlaKSwKIAkgICAgICAwLCAwLCAwLAotCSAgICAgIHNyY19zd2l6emxlKHRtcHNyYywgWCxYLFosWiksCisJICAgICAgc3dhcF91dj9zcmNfc3dpenpsZSh0bXBzcmMsIFosWixYLFgpOnNyY19zd2l6emxlKHRtcHNyYywgWCxYLFosWiksCiAJICAgICAgQzEsCiAJICAgICAgc3JjX3N3aXp6bGUxKHRtcHNyYywgWSkpOwogCkBAIC02MzksNyArNzM4LDggQEAKICAgICAgIHJlbGVhc2VfdGVtcChjLCB0bXApOwogICAgfQogCi0gICBpZiAoaW5zdC0+VGV4U3JjVGFyZ2V0ID09IEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WKSAKKyAgIGlmICgoaW5zdC0+VGV4U3JjVGFyZ2V0ID09IFRFWFRVUkVfUkVDVF9JTkRFWCkgfHwKKyAgICAgICAoaW5zdC0+VGV4U3JjVGFyZ2V0ID09IFRFWFRVUkVfQ1VCRV9JTkRFWCkpCiAgICAgICByZWxlYXNlX3RlbXAoYywgdG1wY29vcmQpOwogfQogCkBAIC02NjAsNyArNzYwLDcgQEAKICAgICAgIHJldHVybiAwOyAgLyogdXQyMDA0IGd1biByZW5kZXJpbmcgIT8hICovCiAgICBlbHNlIGlmIChzcmMuRmlsZSA9PSBQUk9HUkFNX0lOUFVUICYmIAogCSAgICBHRVRfU1daKHNyYy5Td2l6emxlLCBXKSA9PSBXICYmCi0JICAgIChjLT5rZXkucHJvanRleF9tYXNrICYgKDE8PHNyYy5JbmRleCkpID09IDApCisgICAgICAgICAgIChjLT5rZXkucHJvanRleF9tYXNrICYgKDE8PChzcmMuSW5kZXggKyBGUkFHX0FUVFJJQl9XUE9TIC0gRlJBR19BVFRSSUJfVEVYMCkpKSA9PSAwKQogICAgICAgcmV0dXJuIDA7CiAgICBlbHNlCiAgICAgICByZXR1cm4gMTsKQEAgLTc3MCwxNCArODcwLDM0IEBACiAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgb3V0Y29sb3IgPSBzcmNfcmVnKFBST0dSQU1fT1VUUFVULCBGUkFHX1JFU1VMVF9DT0xSKTsKICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBwYXlsb2FkX3IwX2RlcHRoID0gc3JjX3JlZyhQUk9HUkFNX1BBWUxPQUQsIFBBWUxPQURfREVQVEgpOwogICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIG91dGRlcHRoID0gc3JjX3JlZyhQUk9HUkFNX09VVFBVVCwgRlJBR19SRVNVTFRfREVQUik7CisgICBHTHVpbnQgaTsKIAotICAgZW1pdF9vcChjLAotCSAgIFdNX0ZCX1dSSVRFLAotCSAgIGRzdF9tYXNrKGRzdF91bmRlZigpLDApLAotCSAgIDAsIDAsIDAsCi0JICAgb3V0Y29sb3IsCi0JICAgcGF5bG9hZF9yMF9kZXB0aCwKLQkgICBvdXRkZXB0aCk7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgKmxhc3RfaW5zdDsKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYy0+ZnVuYy5icnc7CisKKyAgIC8qIGluc3QtPlNhbXBsZXIgaXMgbm90IHVzZWQgYnkgYmFja2VuZCwgCisgICAgICB1c2UgaXQgZm9yIGZiIHdyaXRlIHRhcmdldCBhbmQgZW90ICovCisKKyAgIGlmIChicnctPnN0YXRlLm5yX2RyYXdfcmVnaW9ucyA+IDEpIHsKKyAgICAgICBmb3IgKGkgPSAwIDsgaSA8IGJydy0+c3RhdGUubnJfZHJhd19yZWdpb25zOyBpKyspIHsKKwkgICBvdXRjb2xvciA9IHNyY19yZWcoUFJPR1JBTV9PVVRQVVQsIEZSQUdfUkVTVUxUX0RBVEEwICsgaSk7CisJICAgbGFzdF9pbnN0ID0gaW5zdCA9IGVtaXRfb3AoYywKKwkJICAgV01fRkJfV1JJVEUsIGRzdF9tYXNrKGRzdF91bmRlZigpLDApLCAwLCAwLCAwLAorCQkgICBvdXRjb2xvciwgcGF5bG9hZF9yMF9kZXB0aCwgb3V0ZGVwdGgpOworCSAgIGluc3QtPlNhbXBsZXIgPSAoaTw8MSk7CisJICAgaWYgKGMtPmZwX2ZyYWdjb2xvcl9lbWl0dGVkKSB7CisJICAgICAgIG91dGNvbG9yID0gc3JjX3JlZyhQUk9HUkFNX09VVFBVVCwgRlJBR19SRVNVTFRfQ09MUik7CisJICAgICAgIGxhc3RfaW5zdCA9IGluc3QgPSBlbWl0X29wKGMsIFdNX0ZCX1dSSVRFLCBkc3RfbWFzayhkc3RfdW5kZWYoKSwwKSwKKwkJICAgICAgIDAsIDAsIDAsIG91dGNvbG9yLCBwYXlsb2FkX3IwX2RlcHRoLCBvdXRkZXB0aCk7CisJICAgICAgIGluc3QtPlNhbXBsZXIgPSAoaTw8MSk7CisJICAgfQorICAgICAgIH0KKyAgICAgICBsYXN0X2luc3QtPlNhbXBsZXIgfD0gMTsgLy9lb3QKKyAgIH1lbHNlIHsKKyAgICAgICBpbnN0ID0gZW1pdF9vcChjLCBXTV9GQl9XUklURSwgZHN0X21hc2soZHN0X3VuZGVmKCksMCksCisJICAgICAgIDAsIDAsIDAsIG91dGNvbG9yLCBwYXlsb2FkX3IwX2RlcHRoLCBvdXRkZXB0aCk7CisgICAgICAgaW5zdC0+U2FtcGxlciA9IDF8KDA8PDEpOworICAgfQogfQogCiAKQEAgLTgwMyw3ICs5MjMsMTUgQEAKICAgIH0KIH0KIAkgCi0KK3N0YXRpYyB2b2lkIHZhbGlkYXRlX2RzdF9yZWdzKCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgKQoreworICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fT1VUUFVUKSB7CisgICAgICAgR0x1aW50IGlkeCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKyAgICAgICBpZiAoaWR4ID09IEZSQUdfUkVTVUxUX0NPTFIpCisJICAgYy0+ZnBfZnJhZ2NvbG9yX2VtaXR0ZWQgPSAxOworICAgfQorfQogCiBzdGF0aWMgdm9pZCBwcmludF9pbnNucyggY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc24sCiAJCQkgR0x1aW50IG5yICkKQEAgLTg0OCwxMiArOTc2LDE2IEBACiAKICAgIGZvciAoaW5zbiA9IDA7IGluc24gPCBmcC0+cHJvZ3JhbS5CYXNlLk51bUluc3RydWN0aW9uczsgaW5zbisrKSB7CiAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9ICZmcC0+cHJvZ3JhbS5CYXNlLkluc3RydWN0aW9uc1tpbnNuXTsKKyAgICAgIHZhbGlkYXRlX3NyY19yZWdzKGMsIGluc3QpOworICAgICAgdmFsaWRhdGVfZHN0X3JlZ3MoYywgaW5zdCk7CisgICB9CisgICBmb3IgKGluc24gPSAwOyBpbnNuIDwgZnAtPnByb2dyYW0uQmFzZS5OdW1JbnN0cnVjdGlvbnM7IGluc24rKykgeworICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSAmZnAtPnByb2dyYW0uQmFzZS5JbnN0cnVjdGlvbnNbaW5zbl07CiAgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqb3V0OwogCiAgICAgICAvKiBDaGVjayBmb3IgSU5QVVQgdmFsdWVzLCBlbWl0IElOVEVSUCBpbnN0cnVjdGlvbnMgd2hlcmUKICAgICAgICAqIG5lY2Vzc2FyeToKICAgICAgICAqLwotICAgICAgdmFsaWRhdGVfc3JjX3JlZ3MoYywgaW5zdCk7CiAKIAogICAgICAgc3dpdGNoIChpbnN0LT5PcGNvZGUpIHsKQEAgLTg4OSwxMSArMTAyMSwyMCBAQAogICAgICAgY2FzZSBPUENPREVfTElUOgogCSBwcmVjYWxjX2xpdChjLCBpbnN0KTsKIAkgYnJlYWs7Ci0gICAgIAorCisgICAgICBjYXNlIE9QQ09ERV9URVg6CisJIHByZWNhbGNfdGV4KGMsIGluc3QpOworCSBicmVhazsKKwogICAgICAgY2FzZSBPUENPREVfVFhQOgogCSBwcmVjYWxjX3R4cChjLCBpbnN0KTsKIAkgYnJlYWs7CiAKKyAgICAgIGNhc2UgT1BDT0RFX1RYQjoKKwkgb3V0ID0gZW1pdF9pbnNuKGMsIGluc3QpOworCSBvdXQtPlRleFNyY1VuaXQgPSBmcC0+cHJvZ3JhbS5CYXNlLlNhbXBsZXJVbml0c1tpbnN0LT5UZXhTcmNVbml0XTsKKwkgYnJlYWs7CisKICAgICAgIGNhc2UgT1BDT0RFX1hQRDogCiAJIG91dCA9IGVtaXRfaW5zbihjLCBpbnN0KTsKIAkgLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZG9uZSBpbiB0aGUgcGFyc2VyLiAKQEAgLTkwNyw4ICsxMDQ4LDE2IEBACiAJICAqLwogCSBvdXQtPkRzdFJlZy5Xcml0ZU1hc2sgPSAwOwogCSBicmVhazsKLQorICAgICAgY2FzZSBPUENPREVfRERYOgorCSBlbWl0X2RkeChjLCBpbnN0KTsKKwkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9ERFk6CisgICAgICAgICBlbWl0X2RkeShjLCBpbnN0KTsKKwlicmVhazsKICAgICAgIGNhc2UgT1BDT0RFX0VORDoKKwkgZW1pdF9mb2coYyk7CisJIGVtaXRfZmJfd3JpdGUoYyk7CisJIGJyZWFrOwogICAgICAgY2FzZSBPUENPREVfUFJJTlQ6CiAJIGJyZWFrOwogCSAKQEAgLTkxNywxNSArMTA2NiwxMSBAQAogCSBicmVhazsKICAgICAgIH0KICAgIH0KLSAgIAotICAgZW1pdF9mb2coYyk7Ci0gICBlbWl0X2ZiX3dyaXRlKGMpOwotCiAKICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1dNKSB7Ci0gICAgICBfbWVzYV9wcmludGYoIlxuXG5cbnBhc3NfZnA6XG4iKTsKLSAgICAgIHByaW50X2luc25zKCBjLT5wcm9nX2luc3RydWN0aW9ucywgYy0+bnJfZnBfaW5zbnMgKTsKLSAgICAgIF9tZXNhX3ByaW50ZigiXG4iKTsKKwkgICBfbWVzYV9wcmludGYoIlxuXG5cbnBhc3NfZnA6XG4iKTsKKwkgICBwcmludF9pbnNucyggYy0+cHJvZ19pbnN0cnVjdGlvbnMsIGMtPm5yX2ZwX2luc25zICk7CisJICAgX21lc2FfcHJpbnRmKCJcbiIpOwogICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9nbHNsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9nbHNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1MTAwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX2dsc2wuYwpAQCAtMCwwICsxLDEzNzUgQEAKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19ldS5oIgorI2luY2x1ZGUgImJyd193bS5oIgorCisvKiBPbmx5IGd1ZXNzLCBuZWVkIGEgZmxhZyBpbiBnbF9mcmFnbWVudF9wcm9ncmFtIGxhdGVyICovCitHTGJvb2xlYW4gYnJ3X3dtX2lzX2dsc2woY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBmcC0+QmFzZS5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gJmZwLT5CYXNlLkluc3RydWN0aW9uc1tpXTsKKwlzd2l0Y2ggKGluc3QtPk9wY29kZSkgeworCSAgICBjYXNlIE9QQ09ERV9JRjoKKwkgICAgY2FzZSBPUENPREVfSU5UOgorCSAgICBjYXNlIE9QQ09ERV9FTkRJRjoKKwkgICAgY2FzZSBPUENPREVfQ0FMOgorCSAgICBjYXNlIE9QQ09ERV9CUks6CisJICAgIGNhc2UgT1BDT0RFX1JFVDoKKwkgICAgY2FzZSBPUENPREVfRERYOgorCSAgICBjYXNlIE9QQ09ERV9ERFk6CisJICAgIGNhc2UgT1BDT0RFX0JHTkxPT1A6CisJCXJldHVybiBHTF9UUlVFOyAKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICByZXR1cm4gR0xfRkFMU0U7IAorfQorCitzdGF0aWMgdm9pZCBzZXRfcmVnKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywgaW50IGZpbGUsIGludCBpbmRleCwgCisJaW50IGNvbXBvbmVudCwgc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgIGMtPndtX3JlZ3NbZmlsZV1baW5kZXhdW2NvbXBvbmVudF0ucmVnID0gcmVnOworICAgIGMtPndtX3JlZ3NbZmlsZV1baW5kZXhdW2NvbXBvbmVudF0uaW5pdGVkID0gR0xfVFJVRTsKK30KKworc3RhdGljIGludCBnZXRfc2NhbGFyX2RzdF9pbmRleChzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCWlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgKDE8PGkpKQorCSAgICBicmVhazsKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHN0cnVjdCBicndfcmVnIGFsbG9jX3RtcChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpCit7CisgICAgc3RydWN0IGJyd19yZWcgcmVnOworICAgIHJlZyA9IGJyd192ZWM4X2dyZihjLT50bXBfaW5kZXgtLSwgMCk7CisgICAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV90bXBzKHN0cnVjdCBicndfd21fY29tcGlsZSAqYykKK3sKKyAgICBjLT50bXBfaW5kZXggPSAxMjc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJ3X3JlZyAKK2dldF9yZWcoc3RydWN0IGJyd193bV9jb21waWxlICpjLCBpbnQgZmlsZSwgaW50IGluZGV4LCBpbnQgY29tcG9uZW50LCBpbnQgbnIsIEdMdWludCBuZWcsIEdMdWludCBhYnMpCit7CisgICAgc3RydWN0IGJyd19yZWcgcmVnOworICAgIHN3aXRjaCAoZmlsZSkgeworCWNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CisJY2FzZSBQUk9HUkFNX0NPTlNUQU5UOgorCWNhc2UgUFJPR1JBTV9VTklGT1JNOgorCSAgICBmaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisJICAgIGJyZWFrOworCWNhc2UgUFJPR1JBTV9VTkRFRklORUQ6CisJICAgIHJldHVybiBicndfbnVsbF9yZWcoKTsJCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYoYy0+d21fcmVnc1tmaWxlXVtpbmRleF1bY29tcG9uZW50XS5pbml0ZWQpCisJcmVnID0gYy0+d21fcmVnc1tmaWxlXVtpbmRleF1bY29tcG9uZW50XS5yZWc7CisgICAgZWxzZSAKKwlyZWcgPSBicndfdmVjOF9ncmYoYy0+cmVnX2luZGV4LCAwKTsKKworICAgIGlmKCFjLT53bV9yZWdzW2ZpbGVdW2luZGV4XVtjb21wb25lbnRdLmluaXRlZCkgeworCXNldF9yZWcoYywgZmlsZSwgaW5kZXgsIGNvbXBvbmVudCwgcmVnKTsKKwljLT5yZWdfaW5kZXgrKzsKKyAgICB9CisKKyAgICBpZiAobmVnICYgKDE8PCBjb21wb25lbnQpKSB7CisJcmVnID0gbmVnYXRlKHJlZyk7CisgICAgfQorICAgIGlmIChhYnMpCisJcmVnID0gYnJ3X2FicyhyZWcpOworICAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB2b2lkIHByZWFsbG9jX3JlZyhzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpCit7CisgICAgaW50IGksIGo7CisgICAgc3RydWN0IGJyd19yZWcgcmVnOworICAgIGludCBucl9pbnRlcnBfcmVncyA9IDA7CisgICAgR0x1aW50IGlucHV0cyA9IEZSQUdfQklUX1dQT1MgfCBjLT5mcF9pbnRlcnBfZW1pdHRlZCB8IGMtPmZwX2Rlcml2X2VtaXR0ZWQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJcmVnID0gKGkgPCBjLT5rZXkubnJfZGVwdGhfcmVncykgCisJICAgID8gYnJ3X3ZlYzhfZ3JmKGkqMiwgMCkgOiBicndfdmVjOF9ncmYoMCwgMCk7CisJc2V0X3JlZyhjLCBQUk9HUkFNX1BBWUxPQUQsIFBBWUxPQURfREVQVEgsIGksIHJlZyk7CisgICAgfQorICAgIGMtPnJlZ19pbmRleCArPSAyKmMtPmtleS5ucl9kZXB0aF9yZWdzOworICAgIHsKKwlpbnQgbnJfcGFyYW1zID0gYy0+ZnAtPnByb2dyYW0uQmFzZS5QYXJhbWV0ZXJzLT5OdW1QYXJhbWV0ZXJzOworCXN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwbGlzdCA9IAorCSAgICBjLT5mcC0+cHJvZ3JhbS5CYXNlLlBhcmFtZXRlcnM7CisJaW50IGluZGV4ID0gMDsKKwljLT5wcm9nX2RhdGEubnJfcGFyYW1zID0gNCpucl9wYXJhbXM7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhcmFtczsgaSsrKSB7CisJICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyssIGluZGV4KyspIHsKKwkJcmVnID0gYnJ3X3ZlYzFfZ3JmKGMtPnJlZ19pbmRleCArIGluZGV4LzgsIAorCQkJaW5kZXglOCk7CisJCWMtPnByb2dfZGF0YS5wYXJhbVtpbmRleF0gPSAKKwkJICAgICZwbGlzdC0+UGFyYW1ldGVyVmFsdWVzW2ldW2pdOworCQlzZXRfcmVnKGMsIFBST0dSQU1fU1RBVEVfVkFSLCBpLCBqLCByZWcpOworCSAgICB9CisJfQorCWMtPm5yX2NyZWcgPSAyKigoNCpucl9wYXJhbXMrMTUpLzE2KTsKKwljLT5yZWdfaW5kZXggKz0gYy0+bnJfY3JlZzsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEZSQUdfQVRUUklCX01BWDsgaSsrKSB7CisJaWYgKGlucHV0cyAmICgxPDxpKSkgeworCSAgICBucl9pbnRlcnBfcmVncysrOworCSAgICByZWcgPSBicndfdmVjOF9ncmYoYy0+cmVnX2luZGV4LCAwKTsKKwkgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJc2V0X3JlZyhjLCBQUk9HUkFNX1BBWUxPQUQsIGksIGosIHJlZyk7CisJICAgIGMtPnJlZ19pbmRleCArPSAyOworCisJfQorICAgIH0KKyAgICBjLT5wcm9nX2RhdGEuZmlyc3RfY3VyYmVfZ3JmID0gYy0+a2V5Lm5yX2RlcHRoX3JlZ3MgKiAyOworICAgIGMtPnByb2dfZGF0YS51cmJfcmVhZF9sZW5ndGggPSBucl9pbnRlcnBfcmVncyAqIDI7CisgICAgYy0+cHJvZ19kYXRhLmN1cmJfcmVhZF9sZW5ndGggPSBjLT5ucl9jcmVnOworICAgIGMtPmVtaXRfbWFza19yZWcgPSBicndfdXcxX3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBjLT5yZWdfaW5kZXgsIDApOworICAgIGMtPnJlZ19pbmRleCsrOworICAgIGMtPnN0YWNrID0gIGJyd191dzE2X3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBjLT5yZWdfaW5kZXgsIDApOworICAgIGMtPnJlZ19pbmRleCArPSAyOworfQorCitzdGF0aWMgc3RydWN0IGJyd19yZWcgZ2V0X2RzdF9yZWcoc3RydWN0IGJyd193bV9jb21waWxlICpjLCAKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgaW50IGNvbXBvbmVudCwgaW50IG5yKQoreworICAgIHJldHVybiBnZXRfcmVnKGMsIGluc3QtPkRzdFJlZy5GaWxlLCBpbnN0LT5Ec3RSZWcuSW5kZXgsIGNvbXBvbmVudCwgbnIsCisJICAgIDAsIDApOworfQorCitzdGF0aWMgc3RydWN0IGJyd19yZWcgZ2V0X3NyY19yZWcoc3RydWN0IGJyd193bV9jb21waWxlICpjLCAKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNyYywgaW50IGluZGV4LCBpbnQgbnIpCit7CisgICAgaW50IGNvbXBvbmVudCA9IEdFVF9TV1ooc3JjLT5Td2l6emxlLCBpbmRleCk7CisgICAgcmV0dXJuIGdldF9yZWcoYywgc3JjLT5GaWxlLCBzcmMtPkluZGV4LCBjb21wb25lbnQsIG5yLCAKKwkgICAgc3JjLT5OZWdhdGVCYXNlLCBzcmMtPkFicyk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYWJzKCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIGludCBpOworICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRik7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWlmIChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgKDE8PGkpKSB7CisJICAgIHN0cnVjdCBicndfcmVnIHNyYywgZHN0OworCSAgICBkc3QgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCBpLCAxKTsKKwkgICAgc3JjID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisJICAgIGJyd19NT1YocCwgZHN0LCBicndfYWJzKHNyYykpOworCX0KKyAgICB9CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9pbnQoIHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRik7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWlmIChtYXNrICYgKDE8PGkpKSB7CisJICAgIHN0cnVjdCBicndfcmVnIHNyYywgZHN0OworCSAgICBkc3QgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCBpLCAxKSA7CisJICAgIHNyYyA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIGksIDEpOworCSAgICBicndfUk5ERChwLCBkc3QsIHNyYyk7CisJfQorICAgIH0KKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X21vdiggc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCBpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgc3RydWN0IGJyd19yZWcgc3JjLCBkc3Q7CisJICAgIGRzdCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworCSAgICBzcmMgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgYnJ3X01PVihwLCBkc3QsIHNyYyk7CisJfQorICAgIH0KKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3BpeGVsX3h5KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19yZWcgcjEgPSBicndfdmVjMV9ncmYoMSwgMCk7CisgICAgc3RydWN0IGJyd19yZWcgcjFfdXcgPSByZXR5cGUocjEsIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKworICAgIHN0cnVjdCBicndfcmVnIGRzdDAsIGRzdDE7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworCisgICAgZHN0MCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIDAsIDEpOworICAgIGRzdDEgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCAxLCAxKTsKKyAgICAvKiBDYWxjdWxhdGUgcGl4ZWwgY2VudGVycyBieSBhZGRpbmcgMSBvciAwIHRvIGVhY2ggb2YgdGhlCisgICAgICogbWljcm8tdGlsZSBjb29yZGluYXRlcyBwYXNzZWQgaW4gcjEuCisgICAgICovCisgICAgaWYgKG1hc2sgJiBXUklURU1BU0tfWCkgeworCWJyd19BREQocCwKKwkJdmVjOChyZXR5cGUoZHN0MCwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpKSwKKwkJc3RyaWRlKHN1Ym9mZnNldChyMV91dywgNCksIDIsIDQsIDApLAorCQlicndfaW1tX3YoMHgxMDEwMTAxMCkpOworICAgIH0KKworICAgIGlmIChtYXNrICYgV1JJVEVNQVNLX1kpIHsKKwlicndfQUREKHAsCisJCXZlYzgocmV0eXBlKGRzdDEsIEJSV19SRUdJU1RFUl9UWVBFX1VXKSksCisJCXN0cmlkZShzdWJvZmZzZXQocjFfdXcsIDUpLCAyLCA0LCAwKSwKKwkJYnJ3X2ltbV92KDB4MTEwMDExMDApKTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgZW1pdF9kZWx0YV94eShzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfcmVnIHIxID0gYnJ3X3ZlYzFfZ3JmKDEsIDApOworICAgIHN0cnVjdCBicndfcmVnIGRzdDAsIGRzdDEsIHNyYzAsIHNyYzE7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworCisgICAgZHN0MCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIDAsIDEpOworICAgIGRzdDEgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCAxLCAxKTsKKyAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgMCwgMSk7CisgICAgc3JjMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIDEsIDEpOworICAgIC8qIENhbGMgZGVsdGEgWCxZIGJ5IHN1YnRyYWN0aW5nIG9yaWdpbiBpbiByMSBmcm9tIHRoZSBwaXhlbAorICAgICAqIGNlbnRlcnMuCisgICAgICovCisgICAgaWYgKG1hc2sgJiBXUklURU1BU0tfWCkgeworCWJyd19BREQocCwKKwkJZHN0MCwKKwkJcmV0eXBlKHNyYzAsIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwKKwkJbmVnYXRlKHIxKSk7CisgICAgfQorCisgICAgaWYgKG1hc2sgJiBXUklURU1BU0tfWSkgeworCWJyd19BREQocCwKKwkJZHN0MSwKKwkJcmV0eXBlKHNyYzEsIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwKKwkJbmVnYXRlKHN1Ym9mZnNldChyMSwxKSkpOworCisgICAgfQorCit9CisKKworc3RhdGljIHZvaWQgZmlyZV9mYl93cml0ZSggc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGJhc2VfcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBlb3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgLyogUGFzcyB0aHJvdWdoIGNvbnRyb2wgaW5mb3JtYXRpb246CisgICAgICovCisgICAgLyogIG1vdiAoOCkgbTEuMDwxPjp1ZCAgIHIxLjA8ODs4LDE+OnVkICAgeyBBbGlnbjEgTm9NYXNrIH0gKi8KKyAgICB7CisJYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKwlicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsgLyogPyAqLworCWJyd19NT1YocCwKKwkJYnJ3X21lc3NhZ2VfcmVnKGJhc2VfcmVnICsgMSksCisJCWJyd192ZWM4X2dyZigxLCAwKSk7CisJYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworICAgIH0KKyAgICAvKiBTZW5kIGZyYW1lYnVmZmVyIHdyaXRlIG1lc3NhZ2U6ICovCisgICAgYnJ3X2ZiX1dSSVRFKHAsCisJICAgIHJldHlwZSh2ZWM4KGJyd19udWxsX3JlZygpKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAorCSAgICBiYXNlX3JlZywKKwkgICAgcmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAorCSAgICB0YXJnZXQsICAgICAgICAgICAgICAKKwkgICAgbnIsCisJICAgIDAsCisJICAgIGVvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfZmJfd3JpdGUoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBpbnQgbnIgPSAyOworICAgIGludCBjaGFubmVsOworICAgIEdMdWludCB0YXJnZXQsIGVvdDsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwOworCisgICAgLyogUmVzZXJ2ZSBhIHNwYWNlIGZvciBBQSAtIG1heSBub3QgYmUgbmVlZGVkOgorICAgICAqLworICAgIGlmIChjLT5rZXkuYWFfZGVzdF9zdGVuY2lsX3JlZykKKwluciArPSAxOworICAgIHsKKwlicndfcHVzaF9pbnNuX3N0YXRlKHApOworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCA0OyBjaGFubmVsKyspIHsKKwkgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICAmaW5zdC0+U3JjUmVnWzBdLCBjaGFubmVsLCAxKTsKKwkgICAgLyogIG1vdiAoOCkgbTIuMDwxPjp1ZCAgIHIyOC4wPDg7OCwxPjp1ZCAgeyBBbGlnbjEgfSAqLworCSAgICAvKiAgbW92ICg4KSBtNi4wPDE+OnVkICAgcjI5LjA8ODs4LDE+OnVkICB7IEFsaWduMSBTZWNIYWxmIH0gKi8KKwkgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcobnIgKyBjaGFubmVsKSwgc3JjMCk7CisJfQorCS8qIHNraXAgb3ZlciB0aGUgcmVncyBwb3B1bGF0ZWQgYWJvdmU6ICovCisJbnIgKz0gODsKKwlicndfcG9wX2luc25fc3RhdGUocCk7CisgICAgfQorCisgICBpZiAoYy0+a2V5LnNvdXJjZV9kZXB0aF90b19yZW5kZXJfdGFyZ2V0KQorICAgeworICAgICAgaWYgKGMtPmtleS5jb21wdXRlc19kZXB0aCkgeworICAgICAgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMl0sIDIsIDEpOworICAgICAgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcobnIpLCBzcmMwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgMSwgMSk7CisgICAgICAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyhuciksIHNyYzApOworICAgICAgfQorCisgICAgICBuciArPSAyOworICAgfQorICAgIHRhcmdldCA9IGluc3QtPlNhbXBsZXIgPj4gMTsKKyAgICBlb3QgPSBpbnN0LT5TYW1wbGVyICYgMTsKKyAgICBmaXJlX2ZiX3dyaXRlKGMsIDAsIG5yLCB0YXJnZXQsIGVvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcGl4ZWxfdyggc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgaWYgKG1hc2sgJiBXUklURU1BU0tfVykgeworCXN0cnVjdCBicndfcmVnIGRzdCwgc3JjMCwgZGVsdGEwLCBkZWx0YTE7CisJc3RydWN0IGJyd19yZWcgaW50ZXJwMzsKKworCWRzdCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIDMsIDEpOworCXNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCAwLCAxKTsKKwlkZWx0YTAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCAwLCAxKTsKKwlkZWx0YTEgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCAxLCAxKTsKKworCWludGVycDMgPSBicndfdmVjMV9ncmYoc3JjMC5ucisxLCA0KTsKKwkvKiBDYWxjIDEvdyAtIGp1c3QgbGludGVycCB3cG9zWzNdIG9wdGltaXplZCBieSBwdXR0aW5nIHRoZQorCSAqIHJlc3VsdCBzdHJhaWdodCBpbnRvIGEgbWVzc2FnZSByZWcuCisJICovCisJYnJ3X0xJTkUocCwgYnJ3X251bGxfcmVnKCksIGludGVycDMsIGRlbHRhMCk7CisJYnJ3X01BQyhwLCBicndfbWVzc2FnZV9yZWcoMiksIHN1Ym9mZnNldChpbnRlcnAzLCAxKSwgZGVsdGExKTsKKworCS8qIENhbGMgdyAqLworCWJyd19tYXRoXzE2KCBwLCBkc3QsCisJCUJSV19NQVRIX0ZVTkNUSU9OX0lOViwKKwkJQlJXX01BVEhfU0FUVVJBVEVfTk9ORSwKKwkJMiwgYnJ3X251bGxfcmVnKCksCisJCUJSV19NQVRIX1BSRUNJU0lPTl9GVUxMKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbGludGVycChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBpbnRlcnBbNF07CisgICAgc3RydWN0IGJyd19yZWcgZHN0LCBkZWx0YTAsIGRlbHRhMTsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwOworCisgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIDAsIDEpOworICAgIGRlbHRhMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIDAsIDEpOworICAgIGRlbHRhMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIDEsIDEpOworICAgIEdMdWludCBuciA9IHNyYzAubnI7CisgICAgaW50IGk7CisKKyAgICBpbnRlcnBbMF0gPSBicndfdmVjMV9ncmYobnIsIDApOworICAgIGludGVycFsxXSA9IGJyd192ZWMxX2dyZihuciwgNCk7CisgICAgaW50ZXJwWzJdID0gYnJ3X3ZlYzFfZ3JmKG5yKzEsIDApOworICAgIGludGVycFszXSA9IGJyd192ZWMxX2dyZihucisxLCA0KTsKKworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKyApIHsKKwlpZiAobWFzayAmICgxPDxpKSkgeworCSAgICBkc3QgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCBpLCAxKTsKKwkgICAgYnJ3X0xJTkUocCwgYnJ3X251bGxfcmVnKCksIGludGVycFtpXSwgZGVsdGEwKTsKKwkgICAgYnJ3X01BQyhwLCBkc3QsIHN1Ym9mZnNldChpbnRlcnBbaV0sMSksIGRlbHRhMSk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9jaW50ZXJwKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworCisgICAgc3RydWN0IGJyd19yZWcgaW50ZXJwWzRdOworICAgIHN0cnVjdCBicndfcmVnIGRzdCwgc3JjMDsKKworICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCAwLCAxKTsKKyAgICBHTHVpbnQgbnIgPSBzcmMwLm5yOworICAgIGludCBpOworCisgICAgaW50ZXJwWzBdID0gYnJ3X3ZlYzFfZ3JmKG5yLCAwKTsKKyAgICBpbnRlcnBbMV0gPSBicndfdmVjMV9ncmYobnIsIDQpOworICAgIGludGVycFsyXSA9IGJyd192ZWMxX2dyZihucisxLCAwKTsKKyAgICBpbnRlcnBbM10gPSBicndfdmVjMV9ncmYobnIrMSwgNCk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKysgKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIGJyd19NT1YocCwgZHN0LCBzdWJvZmZzZXQoaW50ZXJwW2ldLDMpKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X3BpbnRlcnAoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBpbnRlcnBbNF07CisgICAgc3RydWN0IGJyd19yZWcgZHN0LCBkZWx0YTAsIGRlbHRhMTsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCB3OworCisgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIDAsIDEpOworICAgIGRlbHRhMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIDAsIDEpOworICAgIGRlbHRhMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIDEsIDEpOworICAgIHcgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzJdLCAzLCAxKTsKKyAgICBHTHVpbnQgbnIgPSBzcmMwLm5yOworICAgIGludCBpOworCisgICAgaW50ZXJwWzBdID0gYnJ3X3ZlYzFfZ3JmKG5yLCAwKTsKKyAgICBpbnRlcnBbMV0gPSBicndfdmVjMV9ncmYobnIsIDQpOworICAgIGludGVycFsyXSA9IGJyd192ZWMxX2dyZihucisxLCAwKTsKKyAgICBpbnRlcnBbM10gPSBicndfdmVjMV9ncmYobnIrMSwgNCk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKysgKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIGJyd19MSU5FKHAsIGJyd19udWxsX3JlZygpLCBpbnRlcnBbaV0sIGRlbHRhMCk7CisJICAgIGJyd19NQUMocCwgZHN0LCBzdWJvZmZzZXQoaW50ZXJwW2ldLDEpLCAKKwkJICAgIGRlbHRhMSk7CisJICAgIGJyd19NVUwocCwgZHN0LCBkc3QsIHcpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfeHBkKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlHTHVpbnQgaTIgPSAoaSsyKSUzOworCUdMdWludCBpMSA9IChpKzEpJTM7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgc3RydWN0IGJyd19yZWcgc3JjMCwgc3JjMSwgZHN0OworCSAgICBkc3QgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCBpLCAxKTsKKwkgICAgc3JjMCA9IG5lZ2F0ZShnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpMiwgMSkpOworCSAgICBzcmMxID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgaTEsIDEpOworCSAgICBicndfTVVMKHAsIGJyd19udWxsX3JlZygpLCBzcmMwLCBzcmMxKTsKKwkgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIGkxLCAxKTsKKwkgICAgc3JjMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIGkyLCAxKTsKKwkgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCBpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKTsKKwkgICAgYnJ3X01BQyhwLCBkc3QsIHNyYzAsIHNyYzEpOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworCX0KKyAgICB9CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9kcDMoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwWzNdLCBzcmMxWzNdLCBkc3Q7CisgICAgaW50IGk7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCXNyYzBbaV0gPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwlzcmMxW2ldID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgaSwgMSk7CisgICAgfQorCisgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgZ2V0X3NjYWxhcl9kc3RfaW5kZXgoaW5zdCksIDEpOworICAgIGJyd19NVUwocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMF0sIHNyYzFbMF0pOworICAgIGJyd19NQUMocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMV0sIHNyYzFbMV0pOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworICAgIGJyd19NQUMocCwgZHN0LCBzcmMwWzJdLCBzcmMxWzJdKTsKKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2RwNChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfcmVnIHNyYzBbNF0sIHNyYzFbNF0sIGRzdDsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJc3JjMFtpXSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIGksIDEpOworCXNyYzFbaV0gPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCBpLCAxKTsKKyAgICB9CisgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgZ2V0X3NjYWxhcl9kc3RfaW5kZXgoaW5zdCksIDEpOworICAgIGJyd19NVUwocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMF0sIHNyYzFbMF0pOworICAgIGJyd19NQUMocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMV0sIHNyYzFbMV0pOworICAgIGJyd19NQUMocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMl0sIHNyYzFbMl0pOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworICAgIGJyd19NQUMocCwgZHN0LCBzcmMwWzNdLCBzcmMxWzNdKTsKKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2RwaChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfcmVnIHNyYzBbNF0sIHNyYzFbNF0sIGRzdDsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJc3JjMFtpXSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIGksIDEpOworCXNyYzFbaV0gPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCBpLCAxKTsKKyAgICB9CisgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgZ2V0X3NjYWxhcl9kc3RfaW5kZXgoaW5zdCksIDEpOworICAgIGJyd19NVUwocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMF0sIHNyYzFbMF0pOworICAgIGJyd19NQUMocCwgYnJ3X251bGxfcmVnKCksIHNyYzBbMV0sIHNyYzFbMV0pOworICAgIGJyd19NQUMocCwgZHN0LCBzcmMwWzJdLCBzcmMxWzJdKTsKKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKyAgICBicndfQUREKHAsIGRzdCwgc3JjMFszXSwgc3JjMVszXSk7CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9tYXRoMShzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0LCBHTHVpbnQgZnVuYykKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBkc3Q7CisKKyAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgMCwgMSk7CisgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgZ2V0X3NjYWxhcl9kc3RfaW5kZXgoaW5zdCksIDEpOworICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKDIpLCBzcmMwKTsKKyAgICBicndfbWF0aChwLAorCSAgICBkc3QsCisJICAgIGZ1bmMsCisJICAgIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IEJSV19NQVRIX1NBVFVSQVRFX1NBVFVSQVRFIDogQlJXX01BVEhfU0FUVVJBVEVfTk9ORSwKKwkgICAgMiwKKwkgICAgYnJ3X251bGxfcmVnKCksCisJICAgIEJSV19NQVRIX0RBVEFfVkVDVE9SLAorCSAgICBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcmNwKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgZW1pdF9tYXRoMShjLCBpbnN0LCBCUldfTUFUSF9GVU5DVElPTl9JTlYpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3JzcShzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIGVtaXRfbWF0aDEoYywgaW5zdCwgQlJXX01BVEhfRlVOQ1RJT05fUlNRKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zaW4oc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBlbWl0X21hdGgxKGMsIGluc3QsIEJSV19NQVRIX0ZVTkNUSU9OX1NJTik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfY29zKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgZW1pdF9tYXRoMShjLCBpbnN0LCBCUldfTUFUSF9GVU5DVElPTl9DT1MpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2V4MihzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIGVtaXRfbWF0aDEoYywgaW5zdCwgQlJXX01BVEhfRlVOQ1RJT05fRVhQKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9sZzIoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBlbWl0X21hdGgxKGMsIGluc3QsIEJSV19NQVRIX0ZVTkNUSU9OX0xPRyk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYWRkKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgc3RydWN0IGJyd19yZWcgc3JjMCwgc3JjMSwgZHN0OworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBpbnQgaTsKKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKyAgICBmb3IgKGkgPSAwIDsgaSA8IDQ7IGkrKykgeworCWlmIChtYXNrICYgKDE8PGkpKSB7CisJICAgIGRzdCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworCSAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisJICAgIHNyYzEgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCBpLCAxKTsKKwkgICAgYnJ3X0FERChwLCBkc3QsIHNyYzAsIHNyYzEpOworCX0KKyAgICB9CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zdWIoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBzcmMxLCBkc3Q7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIGludCBpOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworICAgIGZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgc3JjMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIGksIDEpOworCSAgICBicndfQUREKHAsIGRzdCwgc3JjMCwgbmVnYXRlKHNyYzEpKTsKKwl9CisgICAgfQorICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbXVsKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgc3RydWN0IGJyd19yZWcgc3JjMCwgc3JjMSwgZHN0OworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBpbnQgaTsKKyAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKyAgICBmb3IgKGkgPSAwIDsgaSA8IDQ7IGkrKykgeworCWlmIChtYXNrICYgKDE8PGkpKSB7CisJICAgIGRzdCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworCSAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisJICAgIHNyYzEgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCBpLCAxKTsKKwkgICAgYnJ3X01VTChwLCBkc3QsIHNyYzAsIHNyYzEpOworCX0KKyAgICB9CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9mcmMoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBkc3Q7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIGludCBpOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworICAgIGZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgYnJ3X0ZSQyhwLCBkc3QsIHNyYzApOworCX0KKyAgICB9CisgICAgaWYgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpCisJYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9mbHIoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBkc3Q7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIGludCBpOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworICAgIGZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgYnJ3X1JOREQocCwgZHN0LCBzcmMwKTsKKwl9CisgICAgfQorICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbWF4KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIHN0cnVjdCBicndfcmVnIHNyYzAsIHNyYzEsIGRzdDsKKyAgICBpbnQgaTsKKyAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlpZiAobWFzayAmICgxPDxpKSkgeworCSAgICBkc3QgPSBnZXRfZHN0X3JlZyhjLCBpbnN0LCBpLCAxKTsKKwkgICAgc3JjMCA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIGksIDEpOworCSAgICBzcmMxID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgaSwgMSk7CisJICAgIGJyd19zZXRfc2F0dXJhdGUocCwgKGluc3QtPlNhdHVyYXRlTW9kZSAhPSBTQVRVUkFURV9PRkYpID8gMSA6IDApOworCSAgICBicndfTU9WKHAsIGRzdCwgc3JjMCk7CisJICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7CisKKwkgICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgQlJXX0NPTkRJVElPTkFMX0wsIHNyYzAsIHNyYzEpOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKwkgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PUk1BTCk7CisJICAgIGJyd19NT1YocCwgZHN0LCBzcmMxKTsKKwkgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKKwkgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbF9mbGFnX3ZhbHVlKHAsIDB4ZmYpOworCX0KKyAgICB9CisgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X21pbihzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBzcmMxLCBkc3Q7CisgICAgaW50IGk7CisgICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgc3JjMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIGksIDEpOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKwkgICAgYnJ3X01PVihwLCBkc3QsIHNyYzApOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworCisJICAgIGJyd19DTVAocCwgYnJ3X251bGxfcmVnKCksIEJSV19DT05ESVRJT05BTF9MLCBzcmMxLCBzcmMwKTsKKwkgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAoaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRikgPyAxIDogMCk7CisJICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT1JNQUwpOworCSAgICBicndfTU9WKHAsIGRzdCwgc3JjMSk7CisJICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7CisJICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2xfZmxhZ192YWx1ZShwLCAweGZmKTsKKwl9CisgICAgfQorICAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9wb3coc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHNyYzAsIHNyYzE7CisgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgZ2V0X3NjYWxhcl9kc3RfaW5kZXgoaW5zdCksIDEpOworICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCAwLCAxKTsKKyAgICBzcmMxID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgMCwgMSk7CisKKyAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZygyKSwgc3JjMCk7CisgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoMyksIHNyYzEpOworCisgICAgYnJ3X21hdGgocCwKKwkgICAgZHN0LAorCSAgICBCUldfTUFUSF9GVU5DVElPTl9QT1csCisJICAgIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IEJSV19NQVRIX1NBVFVSQVRFX1NBVFVSQVRFIDogQlJXX01BVEhfU0FUVVJBVEVfTk9ORSwKKwkgICAgMiwKKwkgICAgYnJ3X251bGxfcmVnKCksCisJICAgIEJSV19NQVRIX0RBVEFfVkVDVE9SLAorCSAgICBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbHJwKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIHN0cnVjdCBicndfcmVnIGRzdCwgdG1wMSwgdG1wMiwgc3JjMCwgc3JjMSwgc3JjMjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKworCSAgICBzcmMxID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgaSwgMSk7CisKKwkgICAgaWYgKHNyYzEubnIgPT0gZHN0Lm5yKSB7CisJCXRtcDEgPSBhbGxvY190bXAoYyk7CisJCWJyd19NT1YocCwgdG1wMSwgc3JjMSk7CisJICAgIH0gZWxzZQorCQl0bXAxID0gc3JjMTsKKworCSAgICBzcmMyID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1syXSwgaSwgMSk7CisJICAgIGlmIChzcmMyLm5yID09IGRzdC5ucikgeworCQl0bXAyID0gYWxsb2NfdG1wKGMpOworCQlicndfTU9WKHAsIHRtcDIsIHNyYzIpOworCSAgICB9IGVsc2UKKwkJdG1wMiA9IHNyYzI7CisKKwkgICAgYnJ3X0FERChwLCBkc3QsIG5lZ2F0ZShzcmMwKSwgYnJ3X2ltbV9mKDEuMCkpOworCSAgICBicndfTVVMKHAsIGJyd19udWxsX3JlZygpLCBkc3QsIHRtcDIpOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKwkgICAgYnJ3X01BQyhwLCBkc3QsIHNyYzAsIHRtcDEpOworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIDApOworCX0KKwlyZWxlYXNlX3RtcHMoYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X2tpbChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpCit7CisJc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisJc3RydWN0IGJyd19yZWcgZGVwdGggPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisJYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKwlicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKwlicndfTk9UKHAsIGMtPmVtaXRfbWFza19yZWcsIGJyd19tYXNrX3JlZygxKSk7IC8vSU1BU0sKKwlicndfQU5EKHAsIGRlcHRoLCBjLT5lbWl0X21hc2tfcmVnLCBkZXB0aCk7CisJYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X21hZChzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHNyYzAsIHNyYzEsIHNyYzI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKG1hc2sgJiAoMTw8aSkpIHsKKwkgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisJICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCBpLCAxKTsKKwkgICAgc3JjMSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIGksIDEpOworCSAgICBzcmMyID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1syXSwgaSwgMSk7CisJICAgIGJyd19NVUwocCwgZHN0LCBzcmMwLCBzcmMxKTsKKworCSAgICBicndfc2V0X3NhdHVyYXRlKHAsIChpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSA/IDEgOiAwKTsKKwkgICAgYnJ3X0FERChwLCBkc3QsIGRzdCwgc3JjMik7CisJICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9zb3Aoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgR0x1aW50IGNvbmQpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgR0x1aW50IG1hc2sgPSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgIHN0cnVjdCBicndfcmVnIGRzdCwgc3JjMCwgc3JjMTsKKyAgICBpbnQgaTsKKworICAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWlmIChtYXNrICYgKDE8PGkpKSB7CisJICAgIGRzdCA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworCSAgICBzcmMwID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisJICAgIHNyYzEgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzFdLCBpLCAxKTsKKwkgICAgYnJ3X0NNUChwLCBicndfbnVsbF9yZWcoKSwgY29uZCwgc3JjMCwgc3JjMSk7CisJICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKKwkgICAgYnJ3X01PVihwLCBkc3QsIGJyd19pbW1fZigwLjApKTsKKwkgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PUk1BTCk7CisJICAgIGJyd19NT1YocCwgZHN0LCBicndfaW1tX2YoMS4wKSk7CisJfQorICAgIH0KKyAgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfc2x0KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgZW1pdF9zb3AoYywgaW5zdCwgQlJXX0NPTkRJVElPTkFMX0wpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3NsZShzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIGVtaXRfc29wKGMsIGluc3QsIEJSV19DT05ESVRJT05BTF9MRSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfc2d0KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgZW1pdF9zb3AoYywgaW5zdCwgQlJXX0NPTkRJVElPTkFMX0cpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3NnZShzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIGVtaXRfc29wKGMsIGluc3QsIEJSV19DT05ESVRJT05BTF9HRSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfc2VxKHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgZW1pdF9zb3AoYywgaW5zdCwgQlJXX0NPTkRJVElPTkFMX0VRKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zbmUoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBlbWl0X3NvcChjLCBpbnN0LCBCUldfQ09ORElUSU9OQUxfTkVRKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9kZHgoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgIHN0cnVjdCBicndfY29tcGlsZSAqcCA9ICZjLT5mdW5jOworICAgIEdMdWludCBtYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBpbnRlcnBbNF07CisgICAgc3RydWN0IGJyd19yZWcgZHN0OworICAgIHN0cnVjdCBicndfcmVnIHNyYzAsIHc7CisgICAgR0x1aW50IG5yLCBpOworICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCAwLCAxKTsKKyAgICB3ID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1sxXSwgMywgMSk7CisgICAgbnIgPSBzcmMwLm5yOworICAgIGludGVycFswXSA9IGJyd192ZWMxX2dyZihuciwgMCk7CisgICAgaW50ZXJwWzFdID0gYnJ3X3ZlYzFfZ3JmKG5yLCA0KTsKKyAgICBpbnRlcnBbMl0gPSBicndfdmVjMV9ncmYobnIrMSwgMCk7CisgICAgaW50ZXJwWzNdID0gYnJ3X3ZlYzFfZ3JmKG5yKzEsIDQpOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRik7CisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgICBpZiAobWFzayAmICgxPDxpKSkgeworICAgICAgICAgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisgICAgICAgICAgICBicndfTU9WKHAsIGRzdCwgaW50ZXJwW2ldKTsKKyAgICAgICAgICAgIGJyd19NVUwocCwgZHN0LCBkc3QsIHcpOworICAgICAgICB9CisgICAgfQorICAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfZGR5KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgc3RydWN0IGJyd19yZWcgaW50ZXJwWzRdOworICAgIHN0cnVjdCBicndfcmVnIGRzdDsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCB3OworICAgIEdMdWludCBuciwgaTsKKworICAgIHNyYzAgPSBnZXRfc3JjX3JlZyhjLCAmaW5zdC0+U3JjUmVnWzBdLCAwLCAxKTsKKyAgICBuciA9IHNyYzAubnI7CisgICAgdyA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMV0sIDMsIDEpOworICAgIGludGVycFswXSA9IGJyd192ZWMxX2dyZihuciwgMCk7CisgICAgaW50ZXJwWzFdID0gYnJ3X3ZlYzFfZ3JmKG5yLCA0KTsKKyAgICBpbnRlcnBbMl0gPSBicndfdmVjMV9ncmYobnIrMSwgMCk7CisgICAgaW50ZXJwWzNdID0gYnJ3X3ZlYzFfZ3JmKG5yKzEsIDQpOworICAgIGJyd19zZXRfc2F0dXJhdGUocCwgaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRik7CisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrICkgeworICAgICAgICBpZiAobWFzayAmICgxPDxpKSkgeworICAgICAgICAgICAgZHN0ID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgaSwgMSk7CisgICAgICAgICAgICBicndfTU9WKHAsIGRzdCwgc3Vib2Zmc2V0KGludGVycFtpXSwgMSkpOworICAgICAgICAgICAgYnJ3X01VTChwLCBkc3QsIGRzdCwgdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF93cG9zX3h5KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgc3RydWN0IGJyd19yZWcgc3JjMFsyXSwgZHN0WzJdOworCisgICAgZHN0WzBdID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgMCwgMSk7CisgICAgZHN0WzFdID0gZ2V0X2RzdF9yZWcoYywgaW5zdCwgMSwgMSk7CisKKyAgICBzcmMwWzBdID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgMCwgMSk7CisgICAgc3JjMFsxXSA9IGdldF9zcmNfcmVnKGMsICZpbnN0LT5TcmNSZWdbMF0sIDEsIDEpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBwaXhlbCBvZmZzZXQgZnJvbSB3aW5kb3cgYm90dG9tIGxlZnQgaW50byBkZXN0aW5hdGlvbgorICAgICAqIFggYW5kIFkgY2hhbm5lbHMuCisgICAgICovCisgICAgaWYgKG1hc2sgJiBXUklURU1BU0tfWCkgeworCS8qIFgnID0gWCAtIG9yaWdpbl94ICovCisJYnJ3X0FERChwLAorCQlkc3RbMF0sCisJCXJldHlwZShzcmMwWzBdLCBCUldfUkVHSVNURVJfVFlQRV9XKSwKKwkJYnJ3X2ltbV9kKDAgLSBjLT5rZXkub3JpZ2luX3gpKTsKKyAgICB9CisKKyAgICBpZiAobWFzayAmIFdSSVRFTUFTS19ZKSB7CisJLyogWScgPSBoZWlnaHQgLSAoWSAtIG9yaWdpbl95KSA9IGhlaWdodCArIG9yaWdpbl95IC0gWSAqLworCWJyd19BREQocCwKKwkJZHN0WzFdLAorCQluZWdhdGUocmV0eXBlKHNyYzBbMV0sIEJSV19SRUdJU1RFUl9UWVBFX1cpKSwKKwkJYnJ3X2ltbV9kKGMtPmtleS5vcmlnaW5feSArIGMtPmtleS5kcmF3YWJsZV9oZWlnaHQgLSAxKSk7CisgICAgfQorfQorCisvKiBUT0RPCisgICBCSUFTIG9uIFNJTUQ4IG5vdCB3b3JraW5kIHlldC4uLgorICovCQorc3RhdGljIHZvaWQgZW1pdF90eGIoc3RydWN0IGJyd193bV9jb21waWxlICpjLAorCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3RbNF0sIHNyY1s0XSwgcGF5bG9hZF9yZWc7CisgICAgR0x1aW50IHVuaXQgPSBjLT5mcC0+cHJvZ3JhbS5CYXNlLlNhbXBsZXJVbml0c1tpbnN0LT5UZXhTcmNVbml0XTsKKworICAgIEdMdWludCBpOworICAgIHBheWxvYWRfcmVnID0gZ2V0X3JlZyhjLCBQUk9HUkFNX1BBWUxPQUQsIFBBWUxPQURfREVQVEgsIDAsIDEsIDAsIDApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIAorCWRzdFtpXSA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJc3JjW2ldID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisKKyAgICBzd2l0Y2ggKGluc3QtPlRleFNyY1RhcmdldCkgeworCWNhc2UgVEVYVFVSRV8xRF9JTkRFWDoKKwkgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoMiksIHNyY1swXSk7CisJICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKDMpLCBicndfaW1tX2YoMCkpOworCSAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyg0KSwgYnJ3X2ltbV9mKDApKTsKKwkgICAgYnJlYWs7CisJY2FzZSBURVhUVVJFXzJEX0lOREVYOgorCWNhc2UgVEVYVFVSRV9SRUNUX0lOREVYOgorCSAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZygyKSwgc3JjWzBdKTsKKwkgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoMyksIHNyY1sxXSk7CisJICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKDQpLCBicndfaW1tX2YoMCkpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZygyKSwgc3JjWzBdKTsKKwkgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoMyksIHNyY1sxXSk7CisJICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKDQpLCBzcmNbMl0pOworCSAgICBicmVhazsKKyAgICB9CisgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoNSksIHNyY1szXSk7CisgICAgYnJ3X01PVihwLCBicndfbWVzc2FnZV9yZWcoNiksIGJyd19pbW1fZigwKSk7CisgICAgYnJ3X1NBTVBMRShwLAorCSAgICByZXR5cGUodmVjOChkc3RbMF0pLCBCUldfUkVHSVNURVJfVFlQRV9VVyksCisJICAgIDEsCisJICAgIHJldHlwZShwYXlsb2FkX3JlZywgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAorCSAgICB1bml0ICsgTUFYX0RSQVdfQlVGRkVSUywgLyogc3VyZmFjZSAqLworCSAgICB1bml0LCAgICAgLyogc2FtcGxlciAqLworCSAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrLAorCSAgICBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9TQU1QTEVfQklBUywKKwkgICAgNCwKKwkgICAgNCwKKwkgICAgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfdGV4KHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKwkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgc3RydWN0IGJyd19jb21waWxlICpwID0gJmMtPmZ1bmM7CisgICAgc3RydWN0IGJyd19yZWcgZHN0WzRdLCBzcmNbNF0sIHBheWxvYWRfcmVnOworICAgIEdMdWludCB1bml0ID0gYy0+ZnAtPnByb2dyYW0uQmFzZS5TYW1wbGVyVW5pdHNbaW5zdC0+VGV4U3JjVW5pdF07CisKKyAgICBHTHVpbnQgbXNnX2xlbjsKKyAgICBHTHVpbnQgaSwgbnI7CisgICAgR0x1aW50IGVtaXQ7CisgICAgR0xib29sZWFuIHNoYWRvdyA9IChjLT5rZXkuc2hhZG93dGV4X21hc2sgJiAoMTw8dW5pdCkpID8gMSA6IDA7CisKKyAgICBwYXlsb2FkX3JlZyA9IGdldF9yZWcoYywgUFJPR1JBTV9QQVlMT0FELCBQQVlMT0FEX0RFUFRILCAwLCAxLCAwLCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIAorCWRzdFtpXSA9IGdldF9kc3RfcmVnKGMsIGluc3QsIGksIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJc3JjW2ldID0gZ2V0X3NyY19yZWcoYywgJmluc3QtPlNyY1JlZ1swXSwgaSwgMSk7CisKKworICAgIHN3aXRjaCAoaW5zdC0+VGV4U3JjVGFyZ2V0KSB7CisJY2FzZSBURVhUVVJFXzFEX0lOREVYOgorCSAgICBlbWl0ID0gV1JJVEVNQVNLX1g7CisJICAgIG5yID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSBURVhUVVJFXzJEX0lOREVYOgorCWNhc2UgVEVYVFVSRV9SRUNUX0lOREVYOgorCSAgICBlbWl0ID0gV1JJVEVNQVNLX1hZOworCSAgICBuciA9IDI7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGVtaXQgPSBXUklURU1BU0tfWFlaOworCSAgICBuciA9IDM7CisJICAgIGJyZWFrOworICAgIH0KKyAgICBtc2dfbGVuID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJc3RhdGljIGNvbnN0IEdMdWludCBzd3pbNF0gPSB7MCwxLDIsMn07CisJaWYgKGVtaXQgJiAoMTw8aSkpCisJICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKG1zZ19sZW4rMSksIHNyY1tzd3pbaV1dKTsKKwllbHNlCisJICAgIGJyd19NT1YocCwgYnJ3X21lc3NhZ2VfcmVnKG1zZ19sZW4rMSksIGJyd19pbW1fZigwKSk7CisJbXNnX2xlbiArPSAxOworICAgIH0KKworICAgIGlmIChzaGFkb3cpIHsKKwlicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyg1KSwgYnJ3X2ltbV9mKDApKTsKKwlicndfTU9WKHAsIGJyd19tZXNzYWdlX3JlZyg2KSwgc3JjWzJdKTsKKyAgICB9CisKKyAgICBicndfU0FNUExFKHAsCisJICAgIHJldHlwZSh2ZWM4KGRzdFswXSksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwKKwkgICAgMSwKKwkgICAgcmV0eXBlKHBheWxvYWRfcmVnLCBCUldfUkVHSVNURVJfVFlQRV9VVyksCisJICAgIHVuaXQgKyBNQVhfRFJBV19CVUZGRVJTLCAvKiBzdXJmYWNlICovCisJICAgIHVuaXQsICAgICAvKiBzYW1wbGVyICovCisJICAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2ssCisJICAgIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFLAorCSAgICA0LAorCSAgICBzaGFkb3cgPyA2IDogNCwKKwkgICAgMCk7CisKKyAgICBpZiAoc2hhZG93KQorCWJyd19NT1YocCwgZHN0WzNdLCBicndfaW1tX2YoMS4wKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3Rfd21fZW1pdCggc3RydWN0IGJyd193bV9jb21waWxlICpjICkKK3sKKyAgICBHTHVpbnQgbnJfaW5zbnMgPSBjLT5mcC0+cHJvZ3JhbS5CYXNlLk51bUluc3RydWN0aW9uczsKKyAgICBHTHVpbnQgaW5zbiwgdGFyZ2V0X2luc247CisgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QxLCAqaW5zdDI7CisgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X2luc3QxLCAqYnJ3X2luc3QyOworICAgIGludCBvZmZzZXQ7CisgICAgZm9yIChpbnNuID0gMDsgaW5zbiA8IG5yX2luc25zOyBpbnNuKyspIHsKKwlpbnN0MSA9ICZjLT5mcC0+cHJvZ3JhbS5CYXNlLkluc3RydWN0aW9uc1tpbnNuXTsKKwlicndfaW5zdDEgPSBpbnN0MS0+RGF0YTsKKwlzd2l0Y2ggKGluc3QxLT5PcGNvZGUpIHsKKwkgICAgY2FzZSBPUENPREVfQ0FMOgorCQl0YXJnZXRfaW5zbiA9IGluc3QxLT5CcmFuY2hUYXJnZXQ7CisJCWluc3QyID0gJmMtPmZwLT5wcm9ncmFtLkJhc2UuSW5zdHJ1Y3Rpb25zW3RhcmdldF9pbnNuXTsKKwkJYnJ3X2luc3QyID0gaW5zdDItPkRhdGE7CisJCW9mZnNldCA9IGJyd19pbnN0MiAtIGJyd19pbnN0MTsKKwkJYnJ3X3NldF9zcmMxKGJyd19pbnN0MSwgYnJ3X2ltbV9kKG9mZnNldCoxNikpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYnJ3X3dtX2VtaXRfZ2xzbChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd193bV9jb21waWxlICpjKQoreworI2RlZmluZSBNQVhfSUZTTiAzMgorI2RlZmluZSBNQVhfTE9PUF9ERVBUSCAzMgorICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmlmX2luc3RbTUFYX0lGU05dLCAqbG9vcF9pbnN0W01BWF9MT09QX0RFUFRIXTsKKyAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0MCwgKmluc3QxOworICAgIGludCBpLCBpZl9pbnNuID0gMCwgbG9vcF9pbnNuID0gMDsKKyAgICBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgPSAmYy0+ZnVuYzsKKyAgICBzdHJ1Y3QgYnJ3X2luZGlyZWN0IHN0YWNrX2luZGV4ID0gYnJ3X2luZGlyZWN0KDAsIDApOworCisgICAgYy0+cmVnX2luZGV4ID0gMDsKKyAgICBwcmVhbGxvY19yZWcoYyk7CisgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgICBicndfTU9WKHAsIGdldF9hZGRyX3JlZyhzdGFja19pbmRleCksIGJyd19hZGRyZXNzKGMtPnN0YWNrKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bnJfZnBfaW5zbnM7IGkrKykgeworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gJmMtPnByb2dfaW5zdHJ1Y3Rpb25zW2ldOworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpvcmlnX2luc3Q7CisKKwlpZiAoKG9yaWdfaW5zdCA9IGluc3QtPkRhdGEpICE9IDApCisJICAgIG9yaWdfaW5zdC0+RGF0YSA9IGN1cnJlbnRfaW5zbihwKTsKKworCWlmIChpbnN0LT5Db25kVXBkYXRlKQorCSAgICBicndfc2V0X2NvbmRpdGlvbmFsbW9kKHAsIEJSV19DT05ESVRJT05BTF9OWik7CisJZWxzZQorCSAgICBicndfc2V0X2NvbmRpdGlvbmFsbW9kKHAsIEJSV19DT05ESVRJT05BTF9OT05FKTsKKworCXN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7CisJICAgIGNhc2UgV01fUElYRUxYWToKKwkJZW1pdF9waXhlbF94eShjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgV01fREVMVEFYWTogCisJCWVtaXRfZGVsdGFfeHkoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIFdNX1BJWEVMVzoKKwkJZW1pdF9waXhlbF93KGMsIGluc3QpOworCQlicmVhazsJCisJICAgIGNhc2UgV01fTElOVEVSUDoKKwkJZW1pdF9saW50ZXJwKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBXTV9QSU5URVJQOgorCQllbWl0X3BpbnRlcnAoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIFdNX0NJTlRFUlA6CisJCWVtaXRfY2ludGVycChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgV01fV1BPU1hZOgorCQllbWl0X3dwb3NfeHkoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIFdNX0ZCX1dSSVRFOgorCQllbWl0X2ZiX3dyaXRlKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfQUJTOgorCQllbWl0X2FicyhjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0FERDoKKwkJZW1pdF9hZGQoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9TVUI6CisJCWVtaXRfc3ViKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfRlJDOgorCQllbWl0X2ZyYyhjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0ZMUjoKKwkJZW1pdF9mbHIoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9MUlA6CisJCWVtaXRfbHJwKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfSU5UOgorCQllbWl0X2ludChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX01PVjoKKwkJZW1pdF9tb3YoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9EUDM6CisJCWVtaXRfZHAzKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfRFA0OgorCQllbWl0X2RwNChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX1hQRDoKKwkJZW1pdF94cGQoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9EUEg6CisJCWVtaXRfZHBoKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfUkNQOgorCQllbWl0X3JjcChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX1JTUToKKwkJZW1pdF9yc3EoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9TSU46CisJCWVtaXRfc2luKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfQ09TOgorCQllbWl0X2NvcyhjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0VYMjoKKwkJZW1pdF9leDIoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9MRzI6CisJCWVtaXRfbGcyKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfTUFYOgkKKwkJZW1pdF9tYXgoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9NSU46CQorCQllbWl0X21pbihjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0REWDoKKwkJZW1pdF9kZHgoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9ERFk6CisgICAgICAgICAgICAgICAgZW1pdF9kZHkoYywgaW5zdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX1NMVDoKKwkJZW1pdF9zbHQoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9TTEU6CisJCWVtaXRfc2xlKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfU0dUOgorCQllbWl0X3NndChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX1NHRToKKwkJZW1pdF9zZ2UoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9TRVE6CisJCWVtaXRfc2VxKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfU05FOgorCQllbWl0X3NuZShjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX01VTDoKKwkJZW1pdF9tdWwoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9QT1c6CisJCWVtaXRfcG93KGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfTUFEOgorCQllbWl0X21hZChjLCBpbnN0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX1RFWDoKKwkJZW1pdF90ZXgoYywgaW5zdCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9UWEI6CisJCWVtaXRfdHhiKGMsIGluc3QpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfS0lMX05WOgorCQllbWl0X2tpbChjKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0lGOgorCQlhc3NlcnQoaWZfaW5zbiA8IE1BWF9JRlNOKTsKKwkJaWZfaW5zdFtpZl9pbnNuKytdID0gYnJ3X0lGKHAsIEJSV19FWEVDVVRFXzgpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfRUxTRToKKwkJaWZfaW5zdFtpZl9pbnNuLTFdICA9IGJyd19FTFNFKHAsIGlmX2luc3RbaWZfaW5zbi0xXSk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9FTkRJRjoKKwkJYXNzZXJ0KGlmX2luc24gPiAwKTsKKwkJYnJ3X0VORElGKHAsIGlmX2luc3RbLS1pZl9pbnNuXSk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9CR05TVUI6CisJICAgIGNhc2UgT1BDT0RFX0VORFNVQjoKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0NBTDogCisJCWJyd19wdXNoX2luc25fc3RhdGUocCk7CisJCWJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgICAgICAgICAgICAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzEpOworICAgICAgICAgICAgICAgIGJyd19BREQocCwgZGVyZWZfMXVkKHN0YWNrX2luZGV4LCAwKSwgYnJ3X2lwX3JlZygpLCBicndfaW1tX2QoMyoxNikpOworICAgICAgICAgICAgICAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKKyAgICAgICAgICAgICAgICBicndfQUREKHAsIGdldF9hZGRyX3JlZyhzdGFja19pbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkZHJfcmVnKHN0YWNrX2luZGV4KSwgYnJ3X2ltbV9kKDQpKTsKKyAgICAgICAgICAgICAgICBvcmlnX2luc3QgPSBpbnN0LT5EYXRhOworICAgICAgICAgICAgICAgIG9yaWdfaW5zdC0+RGF0YSA9ICZwLT5zdG9yZVtwLT5ucl9pbnNuXTsKKyAgICAgICAgICAgICAgICBicndfQUREKHAsIGJyd19pcF9yZWcoKSwgYnJ3X2lwX3JlZygpLCBicndfaW1tX2QoMSoxNikpOworICAgICAgICAgICAgICAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSBPUENPREVfUkVUOgorCQlicndfcHVzaF9pbnNuX3N0YXRlKHApOworCQlicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKyAgICAgICAgICAgICAgICBicndfQUREKHAsIGdldF9hZGRyX3JlZyhzdGFja19pbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWRkcl9yZWcoc3RhY2tfaW5kZXgpLCBicndfaW1tX2QoLTQpKTsKKyAgICAgICAgICAgICAgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKyAgICAgICAgICAgICAgICBicndfTU9WKHAsIGJyd19pcF9yZWcoKSwgZGVyZWZfMXVkKHN0YWNrX2luZGV4LCAwKSk7CisgICAgICAgICAgICAgICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOworCQlicndfcG9wX2luc25fc3RhdGUocCk7CisKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0JHTkxPT1A6CisJCWxvb3BfaW5zdFtsb29wX2luc24rK10gPSBicndfRE8ocCwgQlJXX0VYRUNVVEVfOCk7CisJCWJyZWFrOworCSAgICBjYXNlIE9QQ09ERV9CUks6CisJCWJyd19CUkVBSyhwKTsKKwkJYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworCQlicmVhazsKKwkgICAgY2FzZSBPUENPREVfQ09OVDoKKwkJYnJ3X0NPTlQocCk7CisJCWJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgT1BDT0RFX0VORExPT1A6IAorCQlsb29wX2luc24tLTsKKwkJaW5zdDAgPSBpbnN0MSA9IGJyd19XSElMRShwLCBsb29wX2luc3RbbG9vcF9pbnNuXSk7CisJCS8qIHBhdGNoIGFsbCB0aGUgQlJFQUsgaW5zdHJ1Y3Rpb25zIGZyb20KKwkJICAgbGFzdCBCRUdJTkxPT1AgKi8KKwkJd2hpbGUgKGluc3QwID4gbG9vcF9pbnN0W2xvb3BfaW5zbl0pIHsKKwkJICAgIGluc3QwLS07CisJCSAgICBpZiAoaW5zdDAtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9CUkVBSykgeworCQkJaW5zdDAtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGluc3QxIC0gaW5zdDAgKyAxOworCQkJaW5zdDAtPmJpdHMzLmlmX2Vsc2UucG9wX2NvdW50ID0gMDsKKwkJICAgIH0gZWxzZSBpZiAoaW5zdDAtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9DT05USU5VRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdDAtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGluc3QxIC0gaW5zdDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0MC0+Yml0czMuaWZfZWxzZS5wb3BfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCV9tZXNhX3ByaW50ZigidW5zdXBwb3J0ZWQgSVIgaW4gZnJhZ21lbnQgc2hhZGVyICVkXG4iLAorCQkJaW5zdC0+T3Bjb2RlKTsKKwl9CisJaWYgKGluc3QtPkNvbmRVcGRhdGUpCisJICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT1JNQUwpOworCWVsc2UKKwkgICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgIH0KKyAgICBwb3N0X3dtX2VtaXQoYyk7CisgICAgZm9yIChpID0gMDsgaSA8IGMtPmZwLT5wcm9ncmFtLkJhc2UuTnVtSW5zdHJ1Y3Rpb25zOyBpKyspCisJYy0+ZnAtPnByb2dyYW0uQmFzZS5JbnN0cnVjdGlvbnNbaV0uRGF0YSA9IE5VTEw7Cit9CisKK3ZvaWQgYnJ3X3dtX2dsc2xfZW1pdChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd193bV9jb21waWxlICpjKQoreworICAgIGJyd193bV9wYXNzX2ZwKGMpOworICAgIGMtPnRtcF9pbmRleCA9IDEyNzsKKyAgICBicndfd21fZW1pdF9nbHNsKGJydywgYyk7CisgICAgYy0+cHJvZ19kYXRhLnRvdGFsX2dyZiA9IGMtPnJlZ19pbmRleDsKKyAgICBjLT5wcm9nX2RhdGEudG90YWxfc2NyYXRjaCA9IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9wYXNzMC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fcGFzczAuYwppbmRleCAwMGY2ZjZiLi4yMDVhNzE2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9wYXNzMC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3Bhc3MwLmMKQEAgLTE2OCw2ICsxNjgsNyBAQAogICAgICAgY2FzZSBQUk9HUkFNX1BBWUxPQUQ6CiAgICAgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgogICAgICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgIGNhc2UgUFJPR1JBTV9WQVJZSU5HOgogCSBicmVhazsKIAogICAgICAgY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgpAQCAtMTc5LDYgKzE4MCw4IEBACiAJIGJyZWFrOwogCiAgICAgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgorICAgICAgY2FzZSBQUk9HUkFNX1VOSUZPUk06CisgICAgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6CiAgICAgICBjYXNlIFBST0dSQU1fTkFNRURfUEFSQU06IHsKIAkgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBsaXN0ID0gYy0+ZnAtPnByb2dyYW0uQmFzZS5QYXJhbWV0ZXJzOwogCSAKQEAgLTE5Nyw2ICsyMDAsNyBAQAogCSAgICBicmVhazsKIAkgICAgCiAJIGNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CisJIGNhc2UgUFJPR1JBTV9VTklGT1JNOgogCSAgICAvKiBUaGVzZSBtYXkgY2hhbmdlIGZyb20gcnVuIHRvIHJ1bjoKIAkgICAgICovCiAJICAgIHJlZiA9IGdldF9wYXJhbV9yZWYoYywgJnBsaXN0LT5QYXJhbWV0ZXJWYWx1ZXNbaWR4XVtjb21wb25lbnRdICk7CkBAIC0zNDQsNiArMzQ4LDggQEAKICAgIG91dC0+c2F0dXJhdGUgPSAoaW5zdC0+U2F0dXJhdGVNb2RlICE9IFNBVFVSQVRFX09GRik7CiAgICBvdXQtPnRleF91bml0ID0gaW5zdC0+VGV4U3JjVW5pdDsKICAgIG91dC0+dGV4X2lkeCA9IGluc3QtPlRleFNyY1RhcmdldDsKKyAgIG91dC0+ZW90ID0gaW5zdC0+U2FtcGxlciAmIDE7CisgICBvdXQtPnRhcmdldCA9IGluc3QtPlNhbXBsZXI+PjE7CiAKICAgIC8qIEFyZ3M6CiAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3Bhc3MxLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9wYXNzMS5jCmluZGV4IGQ2NjhkZWYuLmY2ZjNhMzggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3Bhc3MxLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fcGFzczEuYwpAQCAtMTUwLDEyICsxNTAsMTcgQEAKICAgICAgIGNhc2UgT1BDT0RFX0ZMUjoKICAgICAgIGNhc2UgT1BDT0RFX0ZSQzoKICAgICAgIGNhc2UgT1BDT0RFX01PVjoKKyAgICAgIGNhc2UgT1BDT0RFX1NXWjoKIAkgcmVhZDAgPSB3cml0ZW1hc2s7CiAJIGJyZWFrOwogCiAgICAgICBjYXNlIE9QQ09ERV9TVUI6CiAgICAgICBjYXNlIE9QQ09ERV9TTFQ6CisgICAgICBjYXNlIE9QQ09ERV9TTEU6CiAgICAgICBjYXNlIE9QQ09ERV9TR0U6CisgICAgICBjYXNlIE9QQ09ERV9TR1Q6CisgICAgICBjYXNlIE9QQ09ERV9TRVE6CisgICAgICBjYXNlIE9QQ09ERV9TTkU6CiAgICAgICBjYXNlIE9QQ09ERV9BREQ6CiAgICAgICBjYXNlIE9QQ09ERV9NQVg6CiAgICAgICBjYXNlIE9QQ09ERV9NSU46CkBAIC0yNTMsMTEgKzI1OCw5IEBACiAJIHJlYWQwID0gV1JJVEVNQVNLX1hZVzsKIAkgYnJlYWs7CiAKLSAgICAgIGNhc2UgT1BDT0RFX1NXWjoKICAgICAgIGNhc2UgT1BDT0RFX0RTVDoKICAgICAgIGNhc2UgT1BDT0RFX1RYUDoKICAgICAgIGRlZmF1bHQ6Ci0JIGFzc2VydCgwKTsKIAkgYnJlYWs7CiAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3Bhc3MyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9wYXNzMi5jCmluZGV4IGExZWRiZDYuLjZmY2E5YWQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3Bhc3MyLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fcGFzczIuYwpAQCAtNjksNyArNjksOCBAQAogICovCiBzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyggc3RydWN0IGJyd193bV9jb21waWxlICpjICkKIHsKLSAgIEdMdWludCBpbnB1dHMgPSBGUkFHX0JJVF9XUE9TIHwgYy0+ZnBfaW50ZXJwX2VtaXR0ZWQ7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGMtPmZ1bmMuYnJ3OworICAgR0x1aW50IGlucHV0cyA9IChicnctPnZzLnByb2dfZGF0YS0+b3V0cHV0c193cml0dGVuICYgRE9fU0VUVVBfQklUUyk7CiAgICBHTHVpbnQgbnJfaW50ZXJwX3JlZ3MgPSAwOwogICAgR0x1aW50IGkgPSAwOwogICAgR0x1aW50IGo7CkBAIC04NSw4ICs4NiwxNSBAQAogCiAgICBmb3IgKGogPSAwOyBqIDwgRlJBR19BVFRSSUJfTUFYOyBqKyspIAogICAgICAgaWYgKGlucHV0cyAmICgxPDxqKSkgeworCSAvKiBpbmRleCBmb3IgdnMgb3V0cHV0IGFuZCBwcyBpbnB1dCBhcmUgbm90IHRoZSBzYW1lIAorCSAgICBpbiBzaGFkZXIgdmFyeWluZyAqLworCSBHTHVpbnQgaW5kZXg7CisJIGlmIChqID4gRlJBR19BVFRSSUJfVkFSMCkKKwkgICAgIGluZGV4ID0gaiAtIChWRVJUX1JFU1VMVF9WQVIwIC0gRlJBR19BVFRSSUJfVkFSMCk7CisJIGVsc2UKKwkgICAgIGluZGV4ID0gajsKIAkgbnJfaW50ZXJwX3JlZ3MrKzsKLQkgcHJlYWxsb2NfcmVnKGMsICZjLT5wYXlsb2FkLmlucHV0X2ludGVycFtqXSwgaSsrKTsKKwkgcHJlYWxsb2NfcmVnKGMsICZjLT5wYXlsb2FkLmlucHV0X2ludGVycFtpbmRleF0sIGkrKyk7CiAgICAgICB9CiAKICAgIGFzc2VydChucl9pbnRlcnBfcmVncyA+PSAxKTsKQEAgLTMyOCw3ICszMzYsNyBAQAogICAgYy0+c3RhdGUgPSBQQVNTMl9ET05FOwogCiAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19XTSkgewotICAgICAgYnJ3X3dtX3ByaW50X3Byb2dyYW0oYywgInBhc3MyL2RvbmUiKTsKKyAgICAgICBicndfd21fcHJpbnRfcHJvZ3JhbShjLCAicGFzczIvZG9uZSIpOwogICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9zYW1wbGVyX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9zYW1wbGVyX3N0YXRlLmMKaW5kZXggOTNkNGNmYy4uMDhkMDE4MiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fc2FtcGxlcl9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3NhbXBsZXJfc3RhdGUuYwpAQCAtNTQsNyArNTQsNyBAQAogICAgY2FzZSBHTF9SRVBFQVQ6IAogICAgICAgcmV0dXJuIEJSV19URVhDT09SRE1PREVfV1JBUDsKICAgIGNhc2UgR0xfQ0xBTVA6ICAKLSAgICAgIHJldHVybiBCUldfVEVYQ09PUkRNT0RFX0NMQU1QX0JPUkRFUjsgLyogY29uZm9ybSBsaWtlcyBpdCB0aGlzIHdheSAqLworICAgICAgcmV0dXJuIEJSV19URVhDT09SRE1PREVfQ0xBTVA7CiAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6IAogICAgICAgcmV0dXJuIEJSV19URVhDT09SRE1PREVfQ0xBTVA7IC8qIGNvbmZvcm0gbGlrZXMgaXQgdGhpcyB3YXkgKi8KICAgIGNhc2UgR0xfQ0xBTVBfVE9fQk9SREVSOiAKQEAgLTc5LDI3ICs3OSw0MyBAQAogfQogCiAKLXN0YXRpYyBHTHVpbnQgdXBsb2FkX2RlZmF1bHRfY29sb3IoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAotCQkJCSAgICBjb25zdCBHTGZsb2F0ICpjb2xvciApCitzdGF0aWMgZHJpX2JvICp1cGxvYWRfZGVmYXVsdF9jb2xvciggc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCQkJICAgICBjb25zdCBHTGZsb2F0ICpjb2xvciApCiB7CiAgICBzdHJ1Y3QgYnJ3X3NhbXBsZXJfZGVmYXVsdF9jb2xvciBzZGM7CiAKICAgIENPUFlfNFYoc2RjLmNvbG9yLCBjb2xvcik7IAogICAgCi0gICByZXR1cm4gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlW0JSV19TQU1QTEVSX0RFRkFVTFRfQ09MT1JdLCAmc2RjICk7CisgICByZXR1cm4gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlLCBCUldfU0FNUExFUl9ERUZBVUxUX0NPTE9SLCAmc2RjLAorCQkJICBOVUxMLCAwICk7CiB9CiAKIAotLyoKK3N0cnVjdCB3bV9zYW1wbGVyX2tleSB7CisgICBpbnQgc2FtcGxlcl9jb3VudDsKKworICAgc3RydWN0IHdtX3NhbXBsZXJfZW50cnkgeworICAgICAgR0xlbnVtIHdyYXBfciwgd3JhcF9zLCB3cmFwX3Q7CisgICAgICBmbG9hdCBtYXhsb2QsIG1pbmxvZDsKKyAgICAgIGZsb2F0IGxvZF9iaWFzOworICAgICAgZmxvYXQgbWF4X2FuaXNvOworICAgICAgR0xlbnVtIG1pbmZpbHRlciwgbWFnZmlsdGVyOworICAgICAgR0xlbnVtIGNvbXBhcmVtb2RlLCBjb21wYXJlZnVuYzsKKyAgICAgIGRyaV9ibyAqc2RjX2JvOworICAgfSBzYW1wbGVyW0JSV19NQVhfVEVYX1VOSVRdOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzYW1wbGVyIHN0YXRlIGZvciBhIHNpbmdsZSB1bml0IGJhc2VkIG9mZiBvZiB0aGUgc2FtcGxlciBrZXkKKyAqIGVudHJ5LgogICovCi1zdGF0aWMgdm9pZCBicndfdXBkYXRlX3NhbXBsZXJfc3RhdGUoIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRleFVuaXQsCi0JCQkJICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0JCQkJICAgICAgR0x1aW50IHNkY19nc19vZmZzZXQsCi0JCQkJICAgICAgc3RydWN0IGJyd19zYW1wbGVyX3N0YXRlICpzYW1wbGVyKQoteyAgIAorc3RhdGljIHZvaWQgYnJ3X3VwZGF0ZV9zYW1wbGVyX3N0YXRlKHN0cnVjdCB3bV9zYW1wbGVyX2VudHJ5ICprZXksCisJCQkJICAgICBkcmlfYm8gKnNkY19ibywKKwkJCQkgICAgIHN0cnVjdCBicndfc2FtcGxlcl9zdGF0ZSAqc2FtcGxlcikKK3sKICAgIF9tZXNhX21lbXNldChzYW1wbGVyLCAwLCBzaXplb2YoKnNhbXBsZXIpKTsKIAotICAgc3dpdGNoICh0ZXhPYmotPk1pbkZpbHRlcikgeworICAgc3dpdGNoIChrZXktPm1pbmZpbHRlcikgewogICAgY2FzZSBHTF9ORUFSRVNUOgogICAgICAgc2FtcGxlci0+c3MwLm1pbl9maWx0ZXIgPSBCUldfTUFQRklMVEVSX05FQVJFU1Q7CiAgICAgICBzYW1wbGVyLT5zczAubWlwX2ZpbHRlciA9IEJSV19NSVBGSUxURVJfTk9ORTsKQEAgLTEzMCwxNyArMTQ2LDE3IEBACiAKICAgIC8qIFNldCBBbmlzb3Ryb3B5OiAKICAgICAqLwotICAgaWYgKCB0ZXhPYmotPk1heEFuaXNvdHJvcHkgPiAxLjAgKSB7CisgICBpZiAoa2V5LT5tYXhfYW5pc28gPiAxLjApIHsKICAgICAgIHNhbXBsZXItPnNzMC5taW5fZmlsdGVyID0gQlJXX01BUEZJTFRFUl9BTklTT1RST1BJQzsgCiAgICAgICBzYW1wbGVyLT5zczAubWFnX2ZpbHRlciA9IEJSV19NQVBGSUxURVJfQU5JU09UUk9QSUM7CiAKLSAgICAgIGlmICh0ZXhPYmotPk1heEFuaXNvdHJvcHkgPiAyLjApIHsKLQkgc2FtcGxlci0+c3MzLm1heF9hbmlzbyA9IE1BWDIoKHRleE9iai0+TWF4QW5pc290cm9weSAtIDIpIC8gMiwKKyAgICAgIGlmIChrZXktPm1heF9hbmlzbyA+IDIuMCkgeworCSBzYW1wbGVyLT5zczMubWF4X2FuaXNvID0gTUFYMigoa2V5LT5tYXhfYW5pc28gLSAyKSAvIDIsCiAJCQkJICAgICAgIEJSV19BTklTT1JBVElPXzE2KTsKICAgICAgIH0KICAgIH0KICAgIGVsc2UgewotICAgICAgc3dpdGNoICh0ZXhPYmotPk1hZ0ZpbHRlcikgeworICAgICAgc3dpdGNoIChrZXktPm1hZ2ZpbHRlcikgewogICAgICAgY2FzZSBHTF9ORUFSRVNUOgogCSBzYW1wbGVyLT5zczAubWFnX2ZpbHRlciA9IEJSV19NQVBGSUxURVJfTkVBUkVTVDsKIAkgYnJlYWs7CkBAIC0xNTIsOSArMTY4LDkgQEAKICAgICAgIH0gIAogICAgfQogCi0gICBzYW1wbGVyLT5zczEucl93cmFwX21vZGUgPSB0cmFuc2xhdGVfd3JhcF9tb2RlKHRleE9iai0+V3JhcFIpOwotICAgc2FtcGxlci0+c3MxLnNfd3JhcF9tb2RlID0gdHJhbnNsYXRlX3dyYXBfbW9kZSh0ZXhPYmotPldyYXBTKTsKLSAgIHNhbXBsZXItPnNzMS50X3dyYXBfbW9kZSA9IHRyYW5zbGF0ZV93cmFwX21vZGUodGV4T2JqLT5XcmFwVCk7CisgICBzYW1wbGVyLT5zczEucl93cmFwX21vZGUgPSB0cmFuc2xhdGVfd3JhcF9tb2RlKGtleS0+d3JhcF9yKTsKKyAgIHNhbXBsZXItPnNzMS5zX3dyYXBfbW9kZSA9IHRyYW5zbGF0ZV93cmFwX21vZGUoa2V5LT53cmFwX3MpOworICAgc2FtcGxlci0+c3MxLnRfd3JhcF9tb2RlID0gdHJhbnNsYXRlX3dyYXBfbW9kZShrZXktPndyYXBfdCk7CiAKICAgIC8qIEZ1bHNpbSBjb21wbGFpbnMgaWYgSSBkb24ndCBkbyB0aGlzLiAgSGFyZHdhcmUgZG9lc24ndCBtaW5kOgogICAgICovCkBAIC0xNjgsMTcgKzE4NCwxOCBAQAogCiAgICAvKiBTZXQgc2hhZG93IGZ1bmN0aW9uOiAKICAgICAqLwotICAgaWYgKHRleE9iai0+Q29tcGFyZU1vZGUgPT0gR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkVfQVJCKSB7CisgICBpZiAoa2V5LT5jb21wYXJlbW9kZSA9PSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIpIHsKICAgICAgIC8qIFNoYWRvd2luZyBpcyAiZW5hYmxlZCIgYnkgZW1pdHRpbmcgYSBwYXJ0aWN1bGFyIHNhbXBsZXIKICAgICAgICAqIG1lc3NhZ2UgKHNhbXBsZV9jKS4gIFNvIG5lZWQgdG8gcmVjb21waWxlIFdNIHByb2dyYW0gd2hlbgogICAgICAgICogc2hhZG93IGNvbXBhcmlzb24gaXMgZW5hYmxlZCBvbiBlYWNoL2FueSB0ZXh0dXJlIHVuaXQuCiAgICAgICAgKi8KLSAgICAgIHNhbXBsZXItPnNzMC5zaGFkb3dfZnVuY3Rpb24gPSBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKHRleE9iai0+Q29tcGFyZUZ1bmMpOworICAgICAgc2FtcGxlci0+c3MwLnNoYWRvd19mdW5jdGlvbiA9CisJIGludGVsX3RyYW5zbGF0ZV9zaGFkb3dfY29tcGFyZV9mdW5jKGtleS0+Y29tcGFyZWZ1bmMpOwogICAgfQogCiAgICAvKiBTZXQgTE9EIGJpYXM6IAogICAgICovCi0gICBzYW1wbGVyLT5zczAubG9kX2JpYXMgPSBTX0ZJWEVEKHRleFVuaXQtPkxvZEJpYXMgKyB0ZXhPYmotPkxvZEJpYXMsIDYpOworICAgc2FtcGxlci0+c3MwLmxvZF9iaWFzID0gU19GSVhFRChDTEFNUChrZXktPmxvZF9iaWFzLCAtMTYsIDE1KSwgNik7CiAKICAgIHNhbXBsZXItPnNzMC5sb2RfcHJlY2xhbXAgPSAxOyAvKiBPcGVuR0wgbW9kZSAqLwogICAgc2FtcGxlci0+c3MwLmRlZmF1bHRfY29sb3JfbW9kZSA9IDA7IC8qIE9wZW5HTC9EWDEwIG1vZGUgKi8KQEAgLTE5MiwxMyArMjA5LDQ3IEBACiAgICAgKi8KICAgIHNhbXBsZXItPnNzMC5iYXNlX2xldmVsID0gVV9GSVhFRCgwLCAxKTsKIAotICAgc2FtcGxlci0+c3MxLm1heF9sb2QgPSBVX0ZJWEVEKE1BWDIodGV4T2JqLT5NYXhMb2QsIDApLCA2KTsKLSAgIHNhbXBsZXItPnNzMS5taW5fbG9kID0gVV9GSVhFRChNQVgyKHRleE9iai0+TWluTG9kLCAwKSwgNik7CisgICBzYW1wbGVyLT5zczEubWF4X2xvZCA9IFVfRklYRUQoTUlOMihNQVgyKGtleS0+bWF4bG9kLCAwKSwgMTMpLCA2KTsKKyAgIHNhbXBsZXItPnNzMS5taW5fbG9kID0gVV9GSVhFRChNSU4yKE1BWDIoa2V5LT5taW5sb2QsIDApLCAxMyksIDYpOwogICAgCi0gICBzYW1wbGVyLT5zczIuZGVmYXVsdF9jb2xvcl9wb2ludGVyID0gc2RjX2dzX29mZnNldCA+PiA1OworICAgc2FtcGxlci0+c3MyLmRlZmF1bHRfY29sb3JfcG9pbnRlciA9IHNkY19iby0+b2Zmc2V0ID4+IDU7IC8qIHJlbG9jICovCiB9CiAKKy8qKiBTZXRzIHVwIHRoZSBjYWNoZSBrZXkgZm9yIHNhbXBsZXIgc3RhdGUgZm9yIGFsbCB0ZXh0dXJlIHVuaXRzICovCitzdGF0aWMgdm9pZAorYnJ3X3dtX3NhbXBsZXJfcG9wdWxhdGVfa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJICAgIHN0cnVjdCB3bV9zYW1wbGVyX2tleSAqa2V5KQoreworICAgaW50IHVuaXQ7CiAKKyAgIG1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CisKKyAgIGZvciAodW5pdCA9IDA7IHVuaXQgPCBCUldfTUFYX1RFWF9VTklUOyB1bml0KyspIHsKKyAgICAgIGlmIChicnctPmF0dHJpYnMuVGV4dHVyZS0+VW5pdFt1bml0XS5fUmVhbGx5RW5hYmxlZCkgeworCSBzdHJ1Y3Qgd21fc2FtcGxlcl9lbnRyeSAqZW50cnkgPSAma2V5LT5zYW1wbGVyW3VuaXRdOworCSBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmJydy0+YXR0cmlicy5UZXh0dXJlLT5Vbml0W3VuaXRdOworCSBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiA9IHRleFVuaXQtPl9DdXJyZW50OworCisJIGVudHJ5LT53cmFwX3IgPSB0ZXhPYmotPldyYXBSOworCSBlbnRyeS0+d3JhcF9zID0gdGV4T2JqLT5XcmFwUzsKKwkgZW50cnktPndyYXBfdCA9IHRleE9iai0+V3JhcFQ7CisKKwkgZW50cnktPm1heGxvZCA9IHRleE9iai0+TWF4TG9kOworCSBlbnRyeS0+bWlubG9kID0gdGV4T2JqLT5NaW5Mb2Q7CisJIGVudHJ5LT5sb2RfYmlhcyA9IHRleFVuaXQtPkxvZEJpYXMgKyB0ZXhPYmotPkxvZEJpYXM7CisJIGVudHJ5LT5tYXhfYW5pc28gPSB0ZXhPYmotPk1heEFuaXNvdHJvcHk7CisJIGVudHJ5LT5taW5maWx0ZXIgPSB0ZXhPYmotPk1pbkZpbHRlcjsKKwkgZW50cnktPm1hZ2ZpbHRlciA9IHRleE9iai0+TWFnRmlsdGVyOworCSBlbnRyeS0+Y29tcGFyZW1vZGUgPSB0ZXhPYmotPkNvbXBhcmVNb2RlOworICAgIGVudHJ5LT5jb21wYXJlZnVuYyA9IHRleE9iai0+Q29tcGFyZUZ1bmM7CisKKwkgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+d20uc2RjX2JvW3VuaXRdKTsKKwkgYnJ3LT53bS5zZGNfYm9bdW5pdF0gPSB1cGxvYWRfZGVmYXVsdF9jb2xvcihicncsIHRleE9iai0+Qm9yZGVyQ29sb3IpOworCisJIGtleS0+c2FtcGxlcl9jb3VudCA9IHVuaXQgKyAxOworICAgICAgfQorICAgfQorfQogCiAvKiBBbGwgc2FtcGxlcnMgbXVzdCBiZSB1cGxvYWRlZCBpbiBhIHNpbmdsZSBjb250aWd1b3VzIGFycmF5LCB3aGljaAogICogY29tcGxpY2F0ZXMgdmFyaW91cyB0aGluZ3MuICBIb3dldmVyLCB0aGlzIGlzIHN0aWxsIHRvbyBjb25mdXNpbmcgLQpAQCAtMjA2LDQ4ICsyNTcsNjkgQEAKICAqLwogc3RhdGljIHZvaWQgdXBsb2FkX3dtX3NhbXBsZXJzKCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCiB7Ci0gICBHTHVpbnQgdW5pdDsKLSAgIEdMdWludCBzYW1wbGVyX2NvdW50ID0gMDsKKyAgIHN0cnVjdCB3bV9zYW1wbGVyX2tleSBrZXk7CisgICBpbnQgaTsKIAotICAgLyogX05FV19URVhUVVJFICovCi0gICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgQlJXX01BWF9URVhfVU5JVDsgdW5pdCsrKSB7Ci0gICAgICBpZiAoYnJ3LT5hdHRyaWJzLlRleHR1cmUtPlVuaXRbdW5pdF0uX1JlYWxseUVuYWJsZWQpIHsJIAotCSBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmJydy0+YXR0cmlicy5UZXh0dXJlLT5Vbml0W3VuaXRdOwotCSBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiA9IHRleFVuaXQtPl9DdXJyZW50OworICAgYnJ3X3dtX3NhbXBsZXJfcG9wdWxhdGVfa2V5KGJydywgJmtleSk7CiAKLQkgR0x1aW50IHNkY19nc19vZmZzZXQgPSB1cGxvYWRfZGVmYXVsdF9jb2xvcihicncsIHRleE9iai0+Qm9yZGVyQ29sb3IpOwotCi0JIGJyd191cGRhdGVfc2FtcGxlcl9zdGF0ZSh0ZXhVbml0LAotCQkJCSAgdGV4T2JqLCAKLQkJCQkgIHNkY19nc19vZmZzZXQsCi0JCQkJICAmYnJ3LT53bS5zYW1wbGVyW3VuaXRdKTsKLQotCSBzYW1wbGVyX2NvdW50ID0gdW5pdCArIDE7Ci0gICAgICB9Ci0gICB9Ci0gICAKLSAgIGlmIChicnctPndtLnNhbXBsZXJfY291bnQgIT0gc2FtcGxlcl9jb3VudCkgewotICAgICAgYnJ3LT53bS5zYW1wbGVyX2NvdW50ID0gc2FtcGxlcl9jb3VudDsKKyAgIGlmIChicnctPndtLnNhbXBsZXJfY291bnQgIT0ga2V5LnNhbXBsZXJfY291bnQpIHsKKyAgICAgIGJydy0+d20uc2FtcGxlcl9jb3VudCA9IGtleS5zYW1wbGVyX2NvdW50OwogICAgICAgYnJ3LT5zdGF0ZS5kaXJ0eS5jYWNoZSB8PSBDQUNIRV9ORVdfU0FNUExFUjsKICAgIH0KIAotICAgYnJ3LT53bS5zYW1wbGVyX2dzX29mZnNldCA9IDA7CisgICBkcmlfYm9fdW5yZWZlcmVuY2UoYnJ3LT53bS5zYW1wbGVyX2JvKTsKKyAgIGJydy0+d20uc2FtcGxlcl9ibyA9IE5VTEw7CisgICBpZiAoYnJ3LT53bS5zYW1wbGVyX2NvdW50ID09IDApCisgICAgICByZXR1cm47CiAKLSAgIGlmIChicnctPndtLnNhbXBsZXJfY291bnQpIAotICAgICAgYnJ3LT53bS5zYW1wbGVyX2dzX29mZnNldCA9IAotCSBicndfY2FjaGVfZGF0YV9zeigmYnJ3LT5jYWNoZVtCUldfU0FNUExFUl0sCi0JCQkgICBicnctPndtLnNhbXBsZXIsCi0JCQkgICBzaXplb2Yoc3RydWN0IGJyd19zYW1wbGVyX3N0YXRlKSAqIGJydy0+d20uc2FtcGxlcl9jb3VudCk7CisgICBicnctPndtLnNhbXBsZXJfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfU0FNUExFUiwKKwkJCQkJICZrZXksIHNpemVvZihrZXkpLAorCQkJCQkgYnJ3LT53bS5zZGNfYm8sIGtleS5zYW1wbGVyX2NvdW50LAorCQkJCQkgTlVMTCk7CisKKyAgIC8qIElmIHdlIGRpZG50IGZpbmQgaXQgaW4gdGhlIGNhY2hlLCBjb21wdXRlIHRoZSBzdGF0ZSBhbmQgcHV0IGl0IGluIHRoZQorICAgICogY2FjaGUuCisgICAgKi8KKyAgIGlmIChicnctPndtLnNhbXBsZXJfYm8gPT0gTlVMTCkgeworICAgICAgc3RydWN0IGJyd19zYW1wbGVyX3N0YXRlIHNhbXBsZXJbQlJXX01BWF9URVhfVU5JVF07CisKKyAgICAgIG1lbXNldChzYW1wbGVyLCAwLCBzaXplb2Yoc2FtcGxlcikpOworICAgICAgZm9yIChpID0gMDsgaSA8IGtleS5zYW1wbGVyX2NvdW50OyBpKyspIHsKKwkgaWYgKGJydy0+d20uc2RjX2JvW2ldID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJIGJyd191cGRhdGVfc2FtcGxlcl9zdGF0ZSgma2V5LnNhbXBsZXJbaV0sIGJydy0+d20uc2RjX2JvW2ldLAorCQkJCSAgJnNhbXBsZXJbaV0pOworICAgICAgfQorCisgICAgICBicnctPndtLnNhbXBsZXJfYm8gPSBicndfdXBsb2FkX2NhY2hlKCZicnctPmNhY2hlLCBCUldfU0FNUExFUiwKKwkJCQkJICAgICZrZXksIHNpemVvZihrZXkpLAorCQkJCQkgICAgYnJ3LT53bS5zZGNfYm8sIGtleS5zYW1wbGVyX2NvdW50LAorCQkJCQkgICAgJnNhbXBsZXIsIHNpemVvZihzYW1wbGVyKSwKKwkJCQkJICAgIE5VTEwsIE5VTEwpOworCisgICAgICAvKiBFbWl0IFNEQyByZWxvY2F0aW9ucyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IEJSV19NQVhfVEVYX1VOSVQ7IGkrKykgeworCSBpZiAoIWJydy0+YXR0cmlicy5UZXh0dXJlLT5Vbml0W2ldLl9SZWFsbHlFbmFibGVkKQorCSAgICBjb250aW51ZTsKKworCSBpbnRlbF9ib19lbWl0X3JlbG9jKGJydy0+d20uc2FtcGxlcl9ibywKKwkJCSAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAorCQkJICAgICAwLAorCQkJICAgICBpICogc2l6ZW9mKHN0cnVjdCBicndfc2FtcGxlcl9zdGF0ZSkgKworCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgYnJ3X3NhbXBsZXJfc3RhdGUsIHNzMiksCisJCQkgICAgIGJydy0+d20uc2RjX2JvW2ldKTsKKyAgICAgIH0KKyAgIH0KIH0KIAotCiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3dtX3NhbXBsZXJzID0gewogICAgLmRpcnR5ID0gewogICAgICAgLm1lc2EgPSBfTkVXX1RFWFRVUkUsCiAgICAgICAuYnJ3ID0gMCwKICAgICAgIC5jYWNoZSA9IDAKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3dtX3NhbXBsZXJzCisgICAucHJlcGFyZSA9IHVwbG9hZF93bV9zYW1wbGVycywKIH07CiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3N0YXRlLmMKaW5kZXggZmY1Y2IzMS4uZjk3ZDBkYyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9zdGF0ZS5jCkBAIC0zNCwxMDkgKzM0LDEzNiBAQAogI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCiAjaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCiAjaW5jbHVkZSAiYnJ3X2RlZmluZXMuaCIKLSNpbmNsdWRlICJidWZtZ3IuaCIKKyNpbmNsdWRlICJkcmlfYnVmbWdyLmgiCisjaW5jbHVkZSAiYnJ3X3dtLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogV00gdW5pdCAtIGZyYWdtZW50IHByb2dyYW1zIGFuZCByYXN0ZXJpemF0aW9uCiAgKi8KIAotc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9zY3JhdGNoX2NiKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJICAgdm9pZCAqdW51c2VkICkKLXsKLSAgIC8qIG5vdGhpbmcgKi8KLX0KK3N0cnVjdCBicndfd21fdW5pdF9rZXkgeworICAgdW5zaWduZWQgaW50IHRvdGFsX2dyZiwgdG90YWxfc2NyYXRjaDsKKyAgIHVuc2lnbmVkIGludCB1cmJfZW50cnlfcmVhZF9sZW5ndGg7CisgICB1bnNpZ25lZCBpbnQgY3VyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIHVuc2lnbmVkIGludCBkaXNwYXRjaF9ncmZfc3RhcnRfcmVnOwogCisgICB1bnNpZ25lZCBpbnQgY3VyYmVfb2Zmc2V0OworICAgdW5zaWduZWQgaW50IHVyYl9zaXplOwogCi1zdGF0aWMgdm9pZCB1cGxvYWRfd21fdW5pdChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCisgICB1bnNpZ25lZCBpbnQgbWF4X3RocmVhZHM7CisKKyAgIHVuc2lnbmVkIGludCBucl9zdXJmYWNlcywgc2FtcGxlcl9jb3VudDsKKyAgIEdMYm9vbGVhbiB1c2VzX2RlcHRoLCBjb21wdXRlc19kZXB0aCwgdXNlc19raWxsLCBpc19nbHNsOworICAgR0xib29sZWFuIHBvbHlnb25fc3RpcHBsZSwgc3RhdHNfd20sIGxpbmVfc3RpcHBsZSwgb2Zmc2V0X2VuYWJsZTsKKyAgIEdMZmxvYXQgb2Zmc2V0X3VuaXRzLCBvZmZzZXRfZmFjdG9yOworfTsKKworc3RhdGljIHZvaWQKK3dtX3VuaXRfcG9wdWxhdGVfa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X3dtX3VuaXRfa2V5ICprZXkpCiB7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSBicnctPmZyYWdtZW50X3Byb2dyYW07CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKLSAgIHN0cnVjdCBicndfd21fdW5pdF9zdGF0ZSB3bTsKLSAgIEdMdWludCBtYXhfdGhyZWFkczsKKworICAgbWVtc2V0KGtleSwgMCwgc2l6ZW9mKCprZXkpKTsKIAogICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU0lOR0xFX1RIUkVBRCkKLSAgICAgIG1heF90aHJlYWRzID0gMDsgCisgICAgICBrZXktPm1heF90aHJlYWRzID0gMTsKICAgIGVsc2UKLSAgICAgIG1heF90aHJlYWRzID0gMzE7CisgICAgICBrZXktPm1heF90aHJlYWRzID0gMzI7CiAKKyAgIC8qIENBQ0hFX05FV19XTV9QUk9HICovCisgICBrZXktPnRvdGFsX2dyZiA9IGJydy0+d20ucHJvZ19kYXRhLT50b3RhbF9ncmY7CisgICBrZXktPnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGJydy0+d20ucHJvZ19kYXRhLT51cmJfcmVhZF9sZW5ndGg7CisgICBrZXktPmN1cmJfZW50cnlfcmVhZF9sZW5ndGggPSBicnctPndtLnByb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aDsKKyAgIGtleS0+ZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IGJydy0+d20ucHJvZ19kYXRhLT5maXJzdF9jdXJiZV9ncmY7CisgICBrZXktPnRvdGFsX3NjcmF0Y2ggPSBBTElHTihicnctPndtLnByb2dfZGF0YS0+dG90YWxfc2NyYXRjaCwgMTAyNCk7CisKKyAgIC8qIEJSV19ORVdfVVJCX0ZFTkNFICovCisgICBrZXktPnVyYl9zaXplID0gYnJ3LT51cmIudnNpemU7CisKKyAgIC8qIEJSV19ORVdfQ1VSQkVfT0ZGU0VUUyAqLworICAga2V5LT5jdXJiZV9vZmZzZXQgPSBicnctPmN1cmJlLndtX3N0YXJ0OworCisgICAvKiBDQUNIRV9ORVdfU1VSRkFDRSAqLworICAga2V5LT5ucl9zdXJmYWNlcyA9IGJydy0+d20ubnJfc3VyZmFjZXM7CisKKyAgIC8qIENBQ0hFX05FV19TQU1QTEVSICovCisgICBrZXktPnNhbXBsZXJfY291bnQgPSBicnctPndtLnNhbXBsZXJfY291bnQ7CisKKyAgIC8qIF9ORVdfUE9MWUdPTlNUSVBQTEUgKi8KKyAgIGtleS0+cG9seWdvbl9zdGlwcGxlID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPlN0aXBwbGVGbGFnOworCisgICAvKiBCUldfTkVXX0ZSQUdNRU5UX1BST0dSQU0gKi8KKyAgIGtleS0+dXNlc19kZXB0aCA9IChmcC0+QmFzZS5JbnB1dHNSZWFkICYgKDEgPDwgRlJBR19BVFRSSUJfV1BPUykpICE9IDA7CisKKyAgIC8qIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCAqLworICAga2V5LT5jb21wdXRlc19kZXB0aCA9CisgICAgICAoZnAtPkJhc2UuT3V0cHV0c1dyaXR0ZW4gJiAoMSA8PCBGUkFHX1JFU1VMVF9ERVBSKSkgIT0gMDsKKworICAgLyogX05FV19DT0xPUiAqLworICAga2V5LT51c2VzX2tpbGwgPSBmcC0+VXNlc0tpbGwgfHwgYnJ3LT5hdHRyaWJzLkNvbG9yLT5BbHBoYUVuYWJsZWQ7CisgICBrZXktPmlzX2dsc2wgPSBicndfd21faXNfZ2xzbChmcCk7CisKKyAgIC8qIFhYWDogVGhpcyBuZWVkcyBhIGZsYWcgdG8gaW5kaWNhdGUgd2hlbiBpdCBjaGFuZ2VzLiAqLworICAga2V5LT5zdGF0c193bSA9IGludGVsLT5zdGF0c193bTsKKworICAgLyogX05FV19MSU5FICovCisgICBrZXktPmxpbmVfc3RpcHBsZSA9IGJydy0+YXR0cmlicy5MaW5lLT5TdGlwcGxlRmxhZzsKKworICAgLyogX05FV19QT0xZR09OICovCisgICBrZXktPm9mZnNldF9lbmFibGUgPSBicnctPmF0dHJpYnMuUG9seWdvbi0+T2Zmc2V0RmlsbDsKKyAgIGtleS0+b2Zmc2V0X3VuaXRzID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPk9mZnNldFVuaXRzOworICAga2V5LT5vZmZzZXRfZmFjdG9yID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPk9mZnNldEZhY3RvcjsKK30KKworc3RhdGljIGRyaV9ibyAqCit3bV91bml0X2NyZWF0ZV9mcm9tX2tleShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd193bV91bml0X2tleSAqa2V5LAorCQkJZHJpX2JvICoqcmVsb2NfYnVmcykKK3sKKyAgIHN0cnVjdCBicndfd21fdW5pdF9zdGF0ZSB3bTsKKyAgIGRyaV9ibyAqYm87CiAKICAgIG1lbXNldCgmd20sIDAsIHNpemVvZih3bSkpOwogCi0gICAvKiBDQUNIRV9ORVdfV01fUFJPRyAqLwotICAgd20udGhyZWFkMC5ncmZfcmVnX2NvdW50ID0gKChicnctPndtLnByb2dfZGF0YS0+dG90YWxfZ3JmLTEpICYgfjE1KSAvIDE2OwotICAgd20udGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IGJydy0+d20ucHJvZ19nc19vZmZzZXQgPj4gNjsKLSAgIHdtLnRocmVhZDMuZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IGJydy0+d20ucHJvZ19kYXRhLT5maXJzdF9jdXJiZV9ncmY7Ci0gICB3bS50aHJlYWQzLnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGJydy0+d20ucHJvZ19kYXRhLT51cmJfcmVhZF9sZW5ndGg7Ci0gICB3bS50aHJlYWQzLmNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGJydy0+d20ucHJvZ19kYXRhLT5jdXJiX3JlYWRfbGVuZ3RoOwotCi0gICB3bS53bTUubWF4X3RocmVhZHMgPSBtYXhfdGhyZWFkczsgICAgICAKLQotICAgaWYgKGJydy0+d20ucHJvZ19kYXRhLT50b3RhbF9zY3JhdGNoKSB7Ci0gICAgICBHTHVpbnQgcGVyX3RocmVhZCA9IChicnctPndtLnByb2dfZGF0YS0+dG90YWxfc2NyYXRjaCArIDEwMjMpIC8gMTAyNDsKLSAgICAgIEdMdWludCB0b3RhbCA9IHBlcl90aHJlYWQgKiAobWF4X3RocmVhZHMgKyAxKTsKLQotICAgICAgLyogU2NyYXRjaCBzcGFjZSAtLSBqdXN0IGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIHN1ZmZpY2llbnQKLSAgICAgICAqIGFsbG9jYXRlZCBmb3IgdGhlIGFjdGl2ZSBwcm9ncmFtIGFuZCBjdXJyZW50IG51bWJlciBvZiB0aHJlYWRzLgotICAgICAgICovICAgICAgCi0KLSAgICAgIGlmICghYnJ3LT53bS5zY3JhdGNoX2J1ZmZlcikgewotCSBibUdlbkJ1ZmZlcnMoaW50ZWwsICJ3bSBzY3JhdGNoIiwgMSwgJmJydy0+d20uc2NyYXRjaF9idWZmZXIsIDEyKTsKLQkgYm1CdWZmZXJTZXRJbnZhbGlkYXRlQ0IoaW50ZWwsCi0JCQkJIGJydy0+d20uc2NyYXRjaF9idWZmZXIsCi0JCQkJIGludmFsaWRhdGVfc2NyYXRjaF9jYiwKLQkJCQkgTlVMTCwKLQkJCQkgR0xfRkFMU0UpOwotICAgICAgfQotCi0gICAgICBpZiAodG90YWwgPiBicnctPndtLnNjcmF0Y2hfYnVmZmVyX3NpemUpIHsKLQkgYnJ3LT53bS5zY3JhdGNoX2J1ZmZlcl9zaXplID0gdG90YWw7Ci0JIGJtQnVmZmVyRGF0YShpbnRlbCwKLQkJICAgICAgYnJ3LT53bS5zY3JhdGNoX2J1ZmZlciwKLQkJICAgICAgYnJ3LT53bS5zY3JhdGNoX2J1ZmZlcl9zaXplLAotCQkgICAgICBOVUxMLAotCQkgICAgICAwKTsKLSAgICAgIH0KLQkJICAgCi0gICAgICBhc3NlcnQocGVyX3RocmVhZCA8PSAxMiAqIDEwMjQpOwotICAgICAgd20udGhyZWFkMi5wZXJfdGhyZWFkX3NjcmF0Y2hfc3BhY2UgPSAocGVyX3RocmVhZCAvIDEwMjQpIC0gMTsKLQotICAgICAgLyogWFhYOiBjb3VsZCBtYWtlIHRoaXMgZHluYW1pYyBhcyB0aGlzIGlzIHNvIHJhcmVseSBhY3RpdmU6Ci0gICAgICAgKi8KLSAgICAgIC8qIEJSV19ORVdfTE9DSyAqLwotICAgICAgd20udGhyZWFkMi5zY3JhdGNoX3NwYWNlX2Jhc2VfcG9pbnRlciA9IAotCSBibUJ1ZmZlck9mZnNldChpbnRlbCwgYnJ3LT53bS5zY3JhdGNoX2J1ZmZlcikgPj4gMTA7Ci0gICB9Ci0KLSAgIC8qIENBQ0hFX05FV19TVVJGQUNFICovCi0gICB3bS50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSBicnctPndtLm5yX3N1cmZhY2VzOwotCi0gICAvKiBCUldfTkVXX0NVUkJFX09GRlNFVFMgKi8KLSAgIHdtLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gYnJ3LT5jdXJiZS53bV9zdGFydCAqIDI7Ci0KLSAgIHdtLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKKyAgIHdtLnRocmVhZDAuZ3JmX3JlZ19jb3VudCA9IEFMSUdOKGtleS0+dG90YWxfZ3JmLCAxNikgLyAxNiAtIDE7CisgICB3bS50aHJlYWQwLmtlcm5lbF9zdGFydF9wb2ludGVyID0gYnJ3LT53bS5wcm9nX2JvLT5vZmZzZXQgPj4gNjsgLyogcmVsb2MgKi8KICAgIHdtLnRocmVhZDEuZGVwdGhfY29lZl91cmJfcmVhZF9vZmZzZXQgPSAxOwogICAgd20udGhyZWFkMS5mbG9hdGluZ19wb2ludF9tb2RlID0gQlJXX0ZMT0FUSU5HX1BPSU5UX05PTl9JRUVFXzc1NDsKKyAgIHdtLnRocmVhZDEuYmluZGluZ190YWJsZV9lbnRyeV9jb3VudCA9IGtleS0+bnJfc3VyZmFjZXM7CiAKLSAgIC8qIENBQ0hFX05FV19TQU1QTEVSICovCi0gICB3bS53bTQuc2FtcGxlcl9jb3VudCA9IGJydy0+d20uc2FtcGxlcl9jb3VudDsKLSAgIHdtLndtNC5zYW1wbGVyX3N0YXRlX3BvaW50ZXIgPSBicnctPndtLnNhbXBsZXJfZ3Nfb2Zmc2V0ID4+IDU7Ci0KLSAgIC8qIEJSV19ORVdfRlJBR01FTlRfUFJPR1JBTSAqLwotICAgewotICAgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gYnJ3LT5mcmFnbWVudF9wcm9ncmFtOyAKLQotICAgICAgaWYgKGZwLT5CYXNlLklucHV0c1JlYWQgJiAoMTw8RlJBR19BVFRSSUJfV1BPUykpIAotCSB3bS53bTUucHJvZ3JhbV91c2VzX2RlcHRoID0gMTsgLyogYXMgZmFyIGFzIHdlIGNhbiB0ZWxsICovCi0gICAKLSAgICAgIGlmIChmcC0+QmFzZS5PdXRwdXRzV3JpdHRlbiAmICgxPDxGUkFHX1JFU1VMVF9ERVBSKSkgCi0JIHdtLndtNS5wcm9ncmFtX2NvbXB1dGVzX2RlcHRoID0gMTsKLSAgIAotICAgICAgLyogX05FV19DT0xPUiAqLwotICAgICAgaWYgKGZwLT5Vc2VzS2lsbCB8fCAKLQkgIGJydy0+YXR0cmlicy5Db2xvci0+QWxwaGFFbmFibGVkKSAKLQkgd20ud201LnByb2dyYW1fdXNlc19raWxscGl4ZWwgPSAxOyAKKyAgIGlmIChrZXktPnRvdGFsX3NjcmF0Y2ggIT0gMCkgeworICAgICAgd20udGhyZWFkMi5zY3JhdGNoX3NwYWNlX2Jhc2VfcG9pbnRlciA9CisJIGJydy0+d20uc2NyYXRjaF9idWZmZXItPm9mZnNldCA+PiAxMDsgLyogcmVsb2MgKi8KKyAgICAgIHdtLnRocmVhZDIucGVyX3RocmVhZF9zY3JhdGNoX3NwYWNlID0ga2V5LT50b3RhbF9zY3JhdGNoIC8gMTAyNCAtIDE7CisgICB9IGVsc2UgeworICAgICAgd20udGhyZWFkMi5zY3JhdGNoX3NwYWNlX2Jhc2VfcG9pbnRlciA9IDA7CisgICAgICB3bS50aHJlYWQyLnBlcl90aHJlYWRfc2NyYXRjaF9zcGFjZSA9IDA7CiAgICB9CiAKLSAgIHdtLndtNS5lbmFibGVfMTZfcGl4ID0gMTsKKyAgIHdtLnRocmVhZDMuZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IGtleS0+ZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZzsKKyAgIHdtLnRocmVhZDMudXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0ga2V5LT51cmJfZW50cnlfcmVhZF9sZW5ndGg7CisgICB3bS50aHJlYWQzLmNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IGtleS0+Y3VyYl9lbnRyeV9yZWFkX2xlbmd0aDsKKyAgIHdtLnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0ga2V5LT5jdXJiZV9vZmZzZXQgKiAyOworICAgd20udGhyZWFkMy51cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOworCisgICB3bS53bTQuc2FtcGxlcl9jb3VudCA9IChrZXktPnNhbXBsZXJfY291bnQgKyAxKSAvIDQ7CisgICBpZiAoYnJ3LT53bS5zYW1wbGVyX2JvICE9IE5VTEwpIHsKKyAgICAgIC8qIHJlbG9jICovCisgICAgICB3bS53bTQuc2FtcGxlcl9zdGF0ZV9wb2ludGVyID0gYnJ3LT53bS5zYW1wbGVyX2JvLT5vZmZzZXQgPj4gNTsKKyAgIH0gZWxzZSB7CisgICAgICB3bS53bTQuc2FtcGxlcl9zdGF0ZV9wb2ludGVyID0gMDsKKyAgIH0KKworICAgd20ud201LnByb2dyYW1fdXNlc19kZXB0aCA9IGtleS0+dXNlc19kZXB0aDsKKyAgIHdtLndtNS5wcm9ncmFtX2NvbXB1dGVzX2RlcHRoID0ga2V5LT5jb21wdXRlc19kZXB0aDsKKyAgIHdtLndtNS5wcm9ncmFtX3VzZXNfa2lsbHBpeGVsID0ga2V5LT51c2VzX2tpbGw7CisKKyAgIGlmIChrZXktPmlzX2dsc2wpCisgICAgICB3bS53bTUuZW5hYmxlXzhfcGl4ID0gMTsKKyAgIGVsc2UKKyAgICAgIHdtLndtNS5lbmFibGVfMTZfcGl4ID0gMTsKKworICAgd20ud201Lm1heF90aHJlYWRzID0ga2V5LT5tYXhfdGhyZWFkcyAtIDE7CiAgICB3bS53bTUudGhyZWFkX2Rpc3BhdGNoX2VuYWJsZSA9IDE7CS8qIEFLQTogY29sb3Jfd3JpdGUgKi8KICAgIHdtLndtNS5sZWdhY3lfbGluZV9yYXN0ID0gMDsKICAgIHdtLndtNS5sZWdhY3lfZ2xvYmFsX2RlcHRoX2JpYXMgPSAwOwpAQCAtMTQ0LDM0ICsxNzEsMTAxIEBACiAgICB3bS53bTUubGluZV9hYV9yZWdpb25fd2lkdGggPSAwOwogICAgd20ud201LmxpbmVfZW5kY2FwX2FhX3JlZ2lvbl93aWR0aCA9IDE7CiAKLSAgIC8qIF9ORVdfUE9MWUdPTlNUSVBQTEUgKi8KLSAgIGlmIChicnctPmF0dHJpYnMuUG9seWdvbi0+U3RpcHBsZUZsYWcpIAotICAgICAgd20ud201LnBvbHlnb25fc3RpcHBsZSA9IDE7CisgICB3bS53bTUucG9seWdvbl9zdGlwcGxlID0ga2V5LT5wb2x5Z29uX3N0aXBwbGU7CiAKLSAgIC8qIF9ORVdfUE9MWUdPTiAqLwotICAgaWYgKGJydy0+YXR0cmlicy5Qb2x5Z29uLT5PZmZzZXRGaWxsKSB7CisgICBpZiAoa2V5LT5vZmZzZXRfZW5hYmxlKSB7CiAgICAgICB3bS53bTUuZGVwdGhfb2Zmc2V0ID0gMTsKICAgICAgIC8qIFNvbWV0aGluZyB3aWVyZCBnb2luZyBvbiB3aXRoIGxlZ2FjeV9nbG9iYWxfZGVwdGhfYmlhcywKICAgICAgICAqIG9mZnNldF9jb25zdGFudCwgc2NhbGluZyBhbmQgTVJELiAgVGhpcyB2YWx1ZSBwYXNzZXMgZ2xlYW4KICAgICAgICAqIGJ1dCBnaXZlcyBzb21lIG9kZCByZXN1bHRzIGVsc2V3ZXJlIChlZy4gdGhlCiAgICAgICAgKiBxdWFkLW9mZnNldC11bml0cyB0ZXN0KS4KICAgICAgICAqLwotICAgICAgd20uZ2xvYmFsX2RlcHRoX29mZnNldF9jb25zdGFudCA9IGJydy0+YXR0cmlicy5Qb2x5Z29uLT5PZmZzZXRVbml0cyAqIDI7CisgICAgICB3bS5nbG9iYWxfZGVwdGhfb2Zmc2V0X2NvbnN0YW50ID0ga2V5LT5vZmZzZXRfdW5pdHMgKiAyOwogCiAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgcGFzc2VzIGdsZWFuOgogICAgICAgICovCi0gICAgICB3bS5nbG9iYWxfZGVwdGhfb2Zmc2V0X3NjYWxlID0gYnJ3LT5hdHRyaWJzLlBvbHlnb24tPk9mZnNldEZhY3RvcjsKKyAgICAgIHdtLmdsb2JhbF9kZXB0aF9vZmZzZXRfc2NhbGUgPSBrZXktPm9mZnNldF9mYWN0b3I7CiAgICB9CiAKLSAgIC8qIF9ORVdfTElORSAqLwotICAgaWYgKGJydy0+YXR0cmlicy5MaW5lLT5TdGlwcGxlRmxhZykgewotICAgICAgd20ud201LmxpbmVfc3RpcHBsZSA9IDE7Ci0gICB9CisgICB3bS53bTUubGluZV9zdGlwcGxlID0ga2V5LT5saW5lX3N0aXBwbGU7CiAKLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NUQVRTIHx8IGludGVsLT5zdGF0c193bSkKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NUQVRTIHx8IGtleS0+c3RhdHNfd20pCiAgICAgICB3bS53bTQuc3RhdHNfZW5hYmxlID0gMTsKIAotICAgYnJ3LT53bS5zdGF0ZV9nc19vZmZzZXQgPSBicndfY2FjaGVfZGF0YSggJmJydy0+Y2FjaGVbQlJXX1dNX1VOSVRdLCAmd20gKTsKKyAgIGJvID0gYnJ3X3VwbG9hZF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX1dNX1VOSVQsCisJCQkga2V5LCBzaXplb2YoKmtleSksCisJCQkgcmVsb2NfYnVmcywgMywKKwkJCSAmd20sIHNpemVvZih3bSksCisJCQkgTlVMTCwgTlVMTCk7CisKKyAgIC8qIEVtaXQgV00gcHJvZ3JhbSByZWxvY2F0aW9uICovCisgICBpbnRlbF9ib19lbWl0X3JlbG9jKGJvLAorCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAorCQkgICAgICAgd20udGhyZWFkMC5ncmZfcmVnX2NvdW50IDw8IDEsCisJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnJ3X3dtX3VuaXRfc3RhdGUsIHRocmVhZDApLAorCQkgICAgICAgYnJ3LT53bS5wcm9nX2JvKTsKKworICAgLyogRW1pdCBzY3JhdGNoIHNwYWNlIHJlbG9jYXRpb24gKi8KKyAgIGlmIChrZXktPnRvdGFsX3NjcmF0Y2ggIT0gMCkgeworICAgICAgaW50ZWxfYm9fZW1pdF9yZWxvYyhibywKKwkJCSAgMCwgMCwKKwkJCSAgd20udGhyZWFkMi5wZXJfdGhyZWFkX3NjcmF0Y2hfc3BhY2UsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBicndfd21fdW5pdF9zdGF0ZSwgdGhyZWFkMiksCisJCQkgIGJydy0+d20uc2NyYXRjaF9idWZmZXIpOworICAgfQorCisgICAvKiBFbWl0IHNhbXBsZXIgc3RhdGUgcmVsb2NhdGlvbiAqLworICAgaWYgKGtleS0+c2FtcGxlcl9jb3VudCAhPSAwKSB7CisgICAgICBpbnRlbF9ib19lbWl0X3JlbG9jKGJvLAorCQkJICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCisJCQkgIHdtLndtNC5zdGF0c19lbmFibGUgfCAod20ud200LnNhbXBsZXJfY291bnQgPDwgMiksCisJCQkgIG9mZnNldG9mKHN0cnVjdCBicndfd21fdW5pdF9zdGF0ZSwgd200KSwKKwkJCSAgYnJ3LT53bS5zYW1wbGVyX2JvKTsKKyAgIH0KKworICAgcmV0dXJuIGJvOworfQorCisKK3N0YXRpYyB2b2lkIHVwbG9hZF93bV91bml0KCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyApCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAmYnJ3LT5pbnRlbDsKKyAgIHN0cnVjdCBicndfd21fdW5pdF9rZXkga2V5OworICAgZHJpX2JvICpyZWxvY19idWZzWzNdOworICAgd21fdW5pdF9wb3B1bGF0ZV9rZXkoYnJ3LCAma2V5KTsKKworICAgLyogQWxsb2NhdGUgdGhlIG5lY2Vzc2FyeSBzY3JhdGNoIHNwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gIERvbid0CisgICAgKiBib3RoZXIgcmVkdWNpbmcgdGhlIGFsbG9jYXRpb24gbGF0ZXIsIHNpbmNlIHdlIHVzZSBzY3JhdGNoIHNvCisgICAgKiByYXJlbHkuCisgICAgKi8KKyAgIGFzc2VydChrZXkudG90YWxfc2NyYXRjaCA8PSAxMiAqIDEwMjQpOworICAgaWYgKGtleS50b3RhbF9zY3JhdGNoKSB7CisgICAgICBHTHVpbnQgdG90YWwgPSBrZXkudG90YWxfc2NyYXRjaCAqIGtleS5tYXhfdGhyZWFkczsKKworICAgICAgaWYgKGJydy0+d20uc2NyYXRjaF9idWZmZXIgJiYgdG90YWwgPiBicnctPndtLnNjcmF0Y2hfYnVmZmVyLT5zaXplKSB7CisJIGRyaV9ib191bnJlZmVyZW5jZShicnctPndtLnNjcmF0Y2hfYnVmZmVyKTsKKwkgYnJ3LT53bS5zY3JhdGNoX2J1ZmZlciA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoYnJ3LT53bS5zY3JhdGNoX2J1ZmZlciA9PSBOVUxMKSB7CisJIGJydy0+d20uc2NyYXRjaF9idWZmZXIgPSBkcmlfYm9fYWxsb2MoaW50ZWwtPmJ1Zm1nciwKKwkJCQkJICAgICAgICJ3bSBzY3JhdGNoIiwKKwkJCQkJICAgICAgIHRvdGFsLAorCQkJCQkgICAgICAgNDA5Nik7CisgICAgICB9CisgICB9CisKKyAgIHJlbG9jX2J1ZnNbMF0gPSBicnctPndtLnByb2dfYm87CisgICByZWxvY19idWZzWzFdID0gYnJ3LT53bS5zY3JhdGNoX2J1ZmZlcjsKKyAgIHJlbG9jX2J1ZnNbMl0gPSBicnctPndtLnNhbXBsZXJfYm87CisKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPndtLnN0YXRlX2JvKTsKKyAgIGJydy0+d20uc3RhdGVfYm8gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfV01fVU5JVCwKKwkJCQkgICAgICAgJmtleSwgc2l6ZW9mKGtleSksCisJCQkJICAgICAgIHJlbG9jX2J1ZnMsIDMsCisJCQkJICAgICAgIE5VTEwpOworICAgaWYgKGJydy0+d20uc3RhdGVfYm8gPT0gTlVMTCkgeworICAgICAgYnJ3LT53bS5zdGF0ZV9ibyA9IHdtX3VuaXRfY3JlYXRlX2Zyb21fa2V5KGJydywgJmtleSwgcmVsb2NfYnVmcyk7CisgICB9CiB9CiAKIGNvbnN0IHN0cnVjdCBicndfdHJhY2tlZF9zdGF0ZSBicndfd21fdW5pdCA9IHsKQEAgLTE4OSw2ICsyODMsNiBAQAogCQlDQUNIRV9ORVdfV01fUFJPRyB8IAogCQlDQUNIRV9ORVdfU0FNUExFUikKICAgIH0sCi0gICAudXBkYXRlID0gdXBsb2FkX3dtX3VuaXQKKyAgIC5wcmVwYXJlID0gdXBsb2FkX3dtX3VuaXQsCiB9OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9zdXJmYWNlX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2Jyd193bV9zdXJmYWNlX3N0YXRlLmMKaW5kZXggZDI0YzYxOC4uYWYxNDAxYiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9icndfd21fc3VyZmFjZV9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvYnJ3X3dtX3N1cmZhY2Vfc3RhdGUuYwpAQCAtNjksNyArNjksNyBAQAogfQogCiAKLXN0YXRpYyBHTHVpbnQgdHJhbnNsYXRlX3RleF9mb3JtYXQoIEdMdWludCBtZXNhX2Zvcm1hdCApCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV90ZXhfZm9ybWF0KCBHTHVpbnQgbWVzYV9mb3JtYXQsIEdMZW51bSBkZXB0aF9tb2RlICkKIHsKICAgIHN3aXRjaCggbWVzYV9mb3JtYXQgKSB7CiAgICBjYXNlIE1FU0FfRk9STUFUX0w4OgpAQCAtMTE0LDExICsxMTQsMzIgQEAKICAgICAgIHJldHVybiBCUldfU1VSRkFDRUZPUk1BVF9GWFQxOwogCiAgICBjYXNlIE1FU0FfRk9STUFUX1oxNjoKLSAgICAgIHJldHVybiBCUldfU1VSRkFDRUZPUk1BVF9MMTZfVU5PUk07CisgICAgICBpZiAoZGVwdGhfbW9kZSA9PSBHTF9JTlRFTlNJVFkpIAorCSAgcmV0dXJuIEJSV19TVVJGQUNFRk9STUFUX0kxNl9VTk9STTsKKyAgICAgIGVsc2UgaWYgKGRlcHRoX21vZGUgPT0gR0xfQUxQSEEpCisJICByZXR1cm4gQlJXX1NVUkZBQ0VGT1JNQVRfQTE2X1VOT1JNOworICAgICAgZWxzZQorCSAgcmV0dXJuIEJSV19TVVJGQUNFRk9STUFUX0wxNl9VTk9STTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRFhUMToKKyAgICAgICByZXR1cm4gQlJXX1NVUkZBQ0VGT1JNQVRfRFhUMV9SR0I7CiAKICAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQxOgotICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRFhUMToKLSAgICAgIHJldHVybiBCUldfU1VSRkFDRUZPUk1BVF9EWFQxX1JHQjsKKyAgICAgICByZXR1cm4gQlJXX1NVUkZBQ0VGT1JNQVRfQkMxX1VOT1JNOworICAgICAgIAorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDM6CisgICAgICAgcmV0dXJuIEJSV19TVVJGQUNFRk9STUFUX0JDMl9VTk9STTsKKyAgICAgICAKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQ1OgorICAgICAgIHJldHVybiBCUldfU1VSRkFDRUZPUk1BVF9CQzNfVU5PUk07CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkE4OgorICAgICAgcmV0dXJuIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOEE4X1VOT1JNX1NSR0I7CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JfRFhUMToKKyAgICAgIHJldHVybiBCUldfU1VSRkFDRUZPUk1BVF9CQzFfVU5PUk1fU1JHQjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9aMjRfUzg6CisgICAgICByZXR1cm4gQlJXX1NVUkZBQ0VGT1JNQVRfSTI0WDhfVU5PUk07CiAKICAgIGRlZmF1bHQ6CiAgICAgICBhc3NlcnQoMCk7CkBAIC0xMjYsMTQyICsxNDcsMzQzIEBACiAgICB9CiB9CiAKLXN0YXRpYwotdm9pZCBicndfdXBkYXRlX3RleHR1cmVfc3VyZmFjZSggR0xjb250ZXh0ICpjdHgsIAotCQkJCSBHTHVpbnQgdW5pdCwKLQkJCQkgc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlICpzdXJmICkKK3N0cnVjdCBicndfd21fc3VyZmFjZV9rZXkgeworICAgR0xlbnVtIHRhcmdldCwgZGVwdGhtb2RlOworICAgZHJpX2JvICpibzsKKyAgIEdMaW50IGZvcm1hdDsKKyAgIEdMaW50IGZpcnN0X2xldmVsLCBsYXN0X2xldmVsOworICAgR0xpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGg7CisgICBHTGludCBwaXRjaCwgY3BwOworICAgdWludDMyX3QgdGlsaW5nOworICAgR0x1aW50IG9mZnNldDsKK307CisKK3N0YXRpYyB2b2lkCiticndfc2V0X3N1cmZhY2VfdGlsaW5nKHN0cnVjdCBicndfc3VyZmFjZV9zdGF0ZSAqc3VyZiwgdWludDMyX3QgdGlsaW5nKQogewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3dpdGNoICh0aWxpbmcpIHsKKyAgIGNhc2UgSTkxNV9USUxJTkdfTk9ORToKKyAgICAgIHN1cmYtPnNzMy50aWxlZF9zdXJmYWNlID0gMDsKKyAgICAgIHN1cmYtPnNzMy50aWxlX3dhbGsgPSAwOworICAgICAgYnJlYWs7CisgICBjYXNlIEk5MTVfVElMSU5HX1g6CisgICAgICBzdXJmLT5zczMudGlsZWRfc3VyZmFjZSA9IDE7CisgICAgICBzdXJmLT5zczMudGlsZV93YWxrID0gQlJXX1RJTEVXQUxLX1hNQUpPUjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBJOTE1X1RJTElOR19ZOgorICAgICAgc3VyZi0+c3MzLnRpbGVkX3N1cmZhY2UgPSAxOworICAgICAgc3VyZi0+c3MzLnRpbGVfd2FsayA9IEJSV19USUxFV0FMS19ZTUFKT1I7CisgICAgICBicmVhazsKKyAgIH0KK30KKworc3RhdGljIGRyaV9ibyAqCiticndfY3JlYXRlX3RleHR1cmVfc3VyZmFjZSggc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCQkgICAgc3RydWN0IGJyd193bV9zdXJmYWNlX2tleSAqa2V5ICkKK3sKKyAgIHN0cnVjdCBicndfc3VyZmFjZV9zdGF0ZSBzdXJmOworICAgZHJpX2JvICpibzsKKworICAgbWVtc2V0KCZzdXJmLCAwLCBzaXplb2Yoc3VyZikpOworCisgICBzdXJmLnNzMC5taXBtYXBfbGF5b3V0X21vZGUgPSBCUldfU1VSRkFDRV9NSVBNQVBMQVlPVVRfQkVMT1c7CisgICBzdXJmLnNzMC5zdXJmYWNlX3R5cGUgPSB0cmFuc2xhdGVfdGV4X3RhcmdldChrZXktPnRhcmdldCk7CisKKyAgIGlmIChrZXktPmJvKSAKKyAgICAgIHN1cmYuc3MwLnN1cmZhY2VfZm9ybWF0ID0gdHJhbnNsYXRlX3RleF9mb3JtYXQoa2V5LT5mb3JtYXQsIGtleS0+ZGVwdGhtb2RlKTsKKyAgIGVsc2UgeworICAgICBzd2l0Y2goa2V5LT5kZXB0aCkgeworICAgICBjYXNlIDMyOiBzdXJmLnNzMC5zdXJmYWNlX2Zvcm1hdCA9IEJSV19TVVJGQUNFRk9STUFUX0I4RzhSOEE4X1VOT1JNOyBicmVhazsKKyAgICAgZGVmYXVsdDoKKyAgICAgY2FzZSAyNDogc3VyZi5zczAuc3VyZmFjZV9mb3JtYXQgPSBCUldfU1VSRkFDRUZPUk1BVF9COEc4UjhYOF9VTk9STTsgYnJlYWs7CisgICAgIGNhc2UgMTY6IHN1cmYuc3MwLnN1cmZhY2VfZm9ybWF0ID0gQlJXX1NVUkZBQ0VGT1JNQVRfQjVHNlI1X1VOT1JNOyBicmVhazsKKyAgICAgfQorICAgfQorCisgICAvKiBUaGlzIGlzIG9rIGZvciBhbGwgdGV4dHVyZXMgd2l0aCBjaGFubmVsIHdpZHRoIDhiaXQgb3IgbGVzczoKKyAgICAqLworLyogICAgc3VyZi5zczAuZGF0YV9yZXR1cm5fZm9ybWF0ID0gQlJXX1NVUkZBQ0VSRVRVUk5GT1JNQVRfUzE7ICovCisgICBpZiAoa2V5LT5ibykKKyAgICAgc3VyZi5zczEuYmFzZV9hZGRyID0ga2V5LT5iby0+b2Zmc2V0OyAvKiByZWxvYyAqLworICAgZWxzZQorICAgICBzdXJmLnNzMS5iYXNlX2FkZHIgPSBrZXktPm9mZnNldDsKKworICAgc3VyZi5zczIubWlwX2NvdW50ID0ga2V5LT5sYXN0X2xldmVsIC0ga2V5LT5maXJzdF9sZXZlbDsKKyAgIHN1cmYuc3MyLndpZHRoID0ga2V5LT53aWR0aCAtIDE7CisgICBzdXJmLnNzMi5oZWlnaHQgPSBrZXktPmhlaWdodCAtIDE7CisgICBicndfc2V0X3N1cmZhY2VfdGlsaW5nKCZzdXJmLCBrZXktPnRpbGluZyk7CisgICBzdXJmLnNzMy5waXRjaCA9IChrZXktPnBpdGNoICoga2V5LT5jcHApIC0gMTsKKyAgIHN1cmYuc3MzLmRlcHRoID0ga2V5LT5kZXB0aCAtIDE7CisKKyAgIHN1cmYuc3M0Lm1pbl9sb2QgPSAwOworIAorICAgaWYgKGtleS0+dGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApIHsKKyAgICAgIHN1cmYuc3MwLmN1YmVfcG9zX3ggPSAxOworICAgICAgc3VyZi5zczAuY3ViZV9wb3NfeSA9IDE7CisgICAgICBzdXJmLnNzMC5jdWJlX3Bvc196ID0gMTsKKyAgICAgIHN1cmYuc3MwLmN1YmVfbmVnX3ggPSAxOworICAgICAgc3VyZi5zczAuY3ViZV9uZWdfeSA9IDE7CisgICAgICBzdXJmLnNzMC5jdWJlX25lZ196ID0gMTsKKyAgIH0KKworICAgYm8gPSBicndfdXBsb2FkX2NhY2hlKCZicnctPmNhY2hlLCBCUldfU1NfU1VSRkFDRSwKKwkJCSBrZXksIHNpemVvZigqa2V5KSwKKwkJCSAma2V5LT5ibywga2V5LT5ibyA/IDEgOiAwLAorCQkJICZzdXJmLCBzaXplb2Yoc3VyZiksCisJCQkgTlVMTCwgTlVMTCk7CisKKyAgIGlmIChrZXktPmJvKSB7CisgICAgICAvKiBFbWl0IHJlbG9jYXRpb24gdG8gc3VyZmFjZSBjb250ZW50cyAqLworICAgICAgaW50ZWxfYm9fZW1pdF9yZWxvYyhibywKKwkJCSAgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIsIDAsCisJCQkgIDAsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBicndfc3VyZmFjZV9zdGF0ZSwgc3MxKSwKKwkJCSAga2V5LT5ibyk7CisgICB9CisgICByZXR1cm4gYm87Cit9CisKK3N0YXRpYyB2b2lkCiticndfdXBkYXRlX3RleHR1cmVfc3VyZmFjZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCB1bml0ICkKK3sKICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9IGJydy0+YXR0cmlicy5UZXh0dXJlLT5Vbml0W3VuaXRdLl9DdXJyZW50OwogICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRPYmopOwogICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmZpcnN0SW1hZ2UgPSB0T2JqLT5JbWFnZVswXVtpbnRlbE9iai0+Zmlyc3RMZXZlbF07CisgICBzdHJ1Y3QgYnJ3X3dtX3N1cmZhY2Vfa2V5IGtleTsKIAotICAgbWVtc2V0KHN1cmYsIDAsIHNpemVvZigqc3VyZikpOworICAgbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKIAotICAgc3VyZi0+c3MwLm1pcG1hcF9sYXlvdXRfbW9kZSA9IEJSV19TVVJGQUNFX01JUE1BUExBWU9VVF9CRUxPVzsgICAKLSAgIHN1cmYtPnNzMC5zdXJmYWNlX3R5cGUgPSB0cmFuc2xhdGVfdGV4X3RhcmdldCh0T2JqLT5UYXJnZXQpOwotICAgc3VyZi0+c3MwLnN1cmZhY2VfZm9ybWF0ID0gdHJhbnNsYXRlX3RleF9mb3JtYXQoZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0KTsKKyAgIGlmIChpbnRlbE9iai0+aW1hZ2VPdmVycmlkZSkgeworICAgICAga2V5LnBpdGNoID0gaW50ZWxPYmotPnBpdGNoT3ZlcnJpZGUgLyBpbnRlbE9iai0+bXQtPmNwcDsKKyAgICAgIGtleS5kZXB0aCA9IGludGVsT2JqLT5kZXB0aE92ZXJyaWRlOworICAgICAga2V5LmJvID0gTlVMTDsKKyAgICAgIGtleS5vZmZzZXQgPSBpbnRlbE9iai0+dGV4dHVyZU9mZnNldDsKKyAgIH0gZWxzZSB7CisgICAgICBrZXkuZm9ybWF0ID0gZmlyc3RJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0OworICAgICAga2V5LnBpdGNoID0gaW50ZWxPYmotPm10LT5waXRjaDsKKyAgICAgIGtleS5kZXB0aCA9IGZpcnN0SW1hZ2UtPkRlcHRoOworICAgICAga2V5LmJvID0gaW50ZWxPYmotPm10LT5yZWdpb24tPmJ1ZmZlcjsKKyAgICAgIGtleS5vZmZzZXQgPSAwOworICAgfQogCi0gICAvKiBUaGlzIGlzIG9rIGZvciBhbGwgdGV4dHVyZXMgd2l0aCBjaGFubmVsIHdpZHRoIDhiaXQgb3IgbGVzczoKLSAgICAqLwotLyogICAgc3VyZi0+c3MwLmRhdGFfcmV0dXJuX2Zvcm1hdCA9IEJSV19TVVJGQUNFUkVUVVJORk9STUFUX1MxOyAqLworICAga2V5LnRhcmdldCA9IHRPYmotPlRhcmdldDsKKyAgIGtleS5kZXB0aG1vZGUgPSB0T2JqLT5EZXB0aE1vZGU7CisgICBrZXkuZmlyc3RfbGV2ZWwgPSBpbnRlbE9iai0+Zmlyc3RMZXZlbDsKKyAgIGtleS5sYXN0X2xldmVsID0gaW50ZWxPYmotPmxhc3RMZXZlbDsKKyAgIGtleS53aWR0aCA9IGZpcnN0SW1hZ2UtPldpZHRoOworICAga2V5LmhlaWdodCA9IGZpcnN0SW1hZ2UtPkhlaWdodDsKKyAgIGtleS5jcHAgPSBpbnRlbE9iai0+bXQtPmNwcDsKKyAgIGtleS5kZXB0aCA9IGZpcnN0SW1hZ2UtPkRlcHRoOworICAga2V5LnRpbGluZyA9IGludGVsT2JqLT5tdC0+cmVnaW9uLT50aWxpbmc7CiAKLSAgIC8qIEJSV19ORVdfTE9DSyAqLwotICAgc3VyZi0+c3MxLmJhc2VfYWRkciA9IGJtQnVmZmVyT2Zmc2V0KGludGVsLAotCQkJCQlpbnRlbE9iai0+bXQtPnJlZ2lvbi0+YnVmZmVyKTsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPndtLnN1cmZfYm9bdW5pdCArIE1BWF9EUkFXX0JVRkZFUlNdKTsKKyAgIGJydy0+d20uc3VyZl9ib1t1bml0ICsgTUFYX0RSQVdfQlVGRkVSU10gPSBicndfc2VhcmNoX2NhY2hlKCZicnctPmNhY2hlLCBCUldfU1NfU1VSRkFDRSwKKwkJCQkJCQkgICAgICAgJmtleSwgc2l6ZW9mKGtleSksCisJCQkJCQkJICAgICAgICZrZXkuYm8sIGtleS5ibyA/IDEgOiAwLAorCQkJCQkJCSAgICAgICBOVUxMKTsKKyAgIGlmIChicnctPndtLnN1cmZfYm9bdW5pdCArIE1BWF9EUkFXX0JVRkZFUlNdID09IE5VTEwpIHsKKyAgICAgIGJydy0+d20uc3VyZl9ib1t1bml0ICsgTUFYX0RSQVdfQlVGRkVSU10gPSBicndfY3JlYXRlX3RleHR1cmVfc3VyZmFjZShicncsICZrZXkpOworICAgfQorfQogCi0gICBzdXJmLT5zczIubWlwX2NvdW50ID0gaW50ZWxPYmotPmxhc3RMZXZlbCAtIGludGVsT2JqLT5maXJzdExldmVsOwotICAgc3VyZi0+c3MyLndpZHRoID0gZmlyc3RJbWFnZS0+V2lkdGggLSAxOwotICAgc3VyZi0+c3MyLmhlaWdodCA9IGZpcnN0SW1hZ2UtPkhlaWdodCAtIDE7CisvKioKKyAqIFNldHMgdXAgYSBzdXJmYWNlIHN0YXRlIHN0cnVjdHVyZSB0byBwb2ludCBhdCB0aGUgZ2l2ZW4gcmVnaW9uLgorICogV2hpbGUgaXQgaXMgb25seSB1c2VkIGZvciB0aGUgZnJvbnQvYmFjayBidWZmZXIgY3VycmVudGx5LCBpdCBzaG91bGQgYmUKKyAqIHVzYWJsZSBmb3IgZnVydGhlciBidWZmZXJzIHdoZW4gZG9pbmcgQVJCX2RyYXdfYnVmZmVyIHN1cHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkCiticndfdXBkYXRlX3JlZ2lvbl9zdXJmYWNlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisJCQkgIHVuc2lnbmVkIGludCB1bml0LCBHTGJvb2xlYW4gY2FjaGVkKQoreworICAgZHJpX2JvICpyZWdpb25fYm8gPSBOVUxMOworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIGludCBzdXJmYWNlX3R5cGU7CisgICAgICB1bnNpZ25lZCBpbnQgc3VyZmFjZV9mb3JtYXQ7CisgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodCwgY3BwOworICAgICAgR0x1Ynl0ZSBjb2xvcl9tYXNrWzRdOworICAgICAgR0xib29sZWFuIGNvbG9yX2JsZW5kOworICAgICAgdWludDMyX3QgdGlsaW5nOworICAgfSBrZXk7CiAKLSAgIHN1cmYtPnNzMy50aWxlX3dhbGsgPSBCUldfVElMRVdBTEtfWE1BSk9SOwotICAgc3VyZi0+c3MzLnRpbGVkX3N1cmZhY2UgPSBpbnRlbE9iai0+bXQtPnJlZ2lvbi0+dGlsZWQ7IC8qIGFsd2F5cyB6ZXJvICovCi0gICBzdXJmLT5zczMucGl0Y2ggPSAoaW50ZWxPYmotPm10LT5waXRjaCAqIGludGVsT2JqLT5tdC0+Y3BwKSAtIDE7Ci0gICBzdXJmLT5zczMuZGVwdGggPSBmaXJzdEltYWdlLT5EZXB0aCAtIDE7CisgICBtZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOwogCi0gICBzdXJmLT5zczQubWluX2xvZCA9IDA7Ci0gCi0gICBpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApIHsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX3Bvc194ID0gMTsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX3Bvc195ID0gMTsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX3Bvc196ID0gMTsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX25lZ194ID0gMTsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX25lZ195ID0gMTsKLSAgICAgIHN1cmYtPnNzMC5jdWJlX25lZ196ID0gMTsKKyAgIGlmIChyZWdpb24gIT0gTlVMTCkgeworICAgICAgcmVnaW9uX2JvID0gcmVnaW9uLT5idWZmZXI7CisKKyAgICAgIGtleS5zdXJmYWNlX3R5cGUgPSBCUldfU1VSRkFDRV8yRDsKKyAgICAgIGlmIChyZWdpb24tPmNwcCA9PSA0KQorCSBrZXkuc3VyZmFjZV9mb3JtYXQgPSBCUldfU1VSRkFDRUZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgIGVsc2UKKwkga2V5LnN1cmZhY2VfZm9ybWF0ID0gQlJXX1NVUkZBQ0VGT1JNQVRfQjVHNlI1X1VOT1JNOworICAgICAga2V5LnRpbGluZyA9IHJlZ2lvbi0+dGlsaW5nOworICAgICAga2V5LndpZHRoID0gcmVnaW9uLT5waXRjaDsgLyogWFhYOiBub3QgcmVhbGx5ISAqLworICAgICAga2V5LmhlaWdodCA9IHJlZ2lvbi0+aGVpZ2h0OworICAgICAga2V5LmNwcCA9IHJlZ2lvbi0+Y3BwOworICAgfSBlbHNlIHsKKyAgICAgIGtleS5zdXJmYWNlX3R5cGUgPSBCUldfU1VSRkFDRV9OVUxMOworICAgICAga2V5LnN1cmZhY2VfZm9ybWF0ID0gQlJXX1NVUkZBQ0VGT1JNQVRfQjhHOFI4QThfVU5PUk07CisgICAgICBrZXkudGlsaW5nID0gMDsKKyAgICAgIGtleS53aWR0aCA9IDE7CisgICAgICBrZXkuaGVpZ2h0ID0gMTsKKyAgICAgIGtleS5jcHAgPSA0OworICAgfQorICAgbWVtY3B5KGtleS5jb2xvcl9tYXNrLCBicnctPmF0dHJpYnMuQ29sb3ItPkNvbG9yTWFzaywKKwkgIHNpemVvZihrZXkuY29sb3JfbWFzaykpOworICAga2V5LmNvbG9yX2JsZW5kID0gKCFicnctPmF0dHJpYnMuQ29sb3ItPl9Mb2dpY09wRW5hYmxlZCAmJgorCQkgICAgICBicnctPmF0dHJpYnMuQ29sb3ItPkJsZW5kRW5hYmxlZCk7CisKKyAgIGRyaV9ib191bnJlZmVyZW5jZShicnctPndtLnN1cmZfYm9bdW5pdF0pOworICAgYnJ3LT53bS5zdXJmX2JvW3VuaXRdID0gTlVMTDsKKyAgIGlmIChjYWNoZWQpIAorICAgICAgIGJydy0+d20uc3VyZl9ib1t1bml0XSA9IGJyd19zZWFyY2hfY2FjaGUoJmJydy0+Y2FjaGUsIEJSV19TU19TVVJGQUNFLAorCSAgICAgICAma2V5LCBzaXplb2Yoa2V5KSwKKwkgICAgICAgJnJlZ2lvbl9ibywgMSwKKwkgICAgICAgTlVMTCk7CisKKyAgIGlmIChicnctPndtLnN1cmZfYm9bdW5pdF0gPT0gTlVMTCkgeworICAgICAgc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlIHN1cmY7CisKKyAgICAgIG1lbXNldCgmc3VyZiwgMCwgc2l6ZW9mKHN1cmYpKTsKKworICAgICAgc3VyZi5zczAuc3VyZmFjZV9mb3JtYXQgPSBrZXkuc3VyZmFjZV9mb3JtYXQ7CisgICAgICBzdXJmLnNzMC5zdXJmYWNlX3R5cGUgPSBrZXkuc3VyZmFjZV90eXBlOworICAgICAgaWYgKHJlZ2lvbl9ibyAhPSBOVUxMKQorCSBzdXJmLnNzMS5iYXNlX2FkZHIgPSByZWdpb25fYm8tPm9mZnNldDsgLyogcmVsb2MgKi8KKworICAgICAgc3VyZi5zczIud2lkdGggPSBrZXkud2lkdGggLSAxOworICAgICAgc3VyZi5zczIuaGVpZ2h0ID0ga2V5LmhlaWdodCAtIDE7CisgICAgICBicndfc2V0X3N1cmZhY2VfdGlsaW5nKCZzdXJmLCBrZXkudGlsaW5nKTsKKyAgICAgIHN1cmYuc3MzLnBpdGNoID0gKGtleS53aWR0aCAqIGtleS5jcHApIC0gMTsKKworICAgICAgLyogX05FV19DT0xPUiAqLworICAgICAgc3VyZi5zczAuY29sb3JfYmxlbmQgPSBrZXkuY29sb3JfYmxlbmQ7CisgICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfcmVkID0gICAha2V5LmNvbG9yX21hc2tbMF07CisgICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfZ3JlZW4gPSAha2V5LmNvbG9yX21hc2tbMV07CisgICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfYmx1ZSA9ICAha2V5LmNvbG9yX21hc2tbMl07CisgICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfYWxwaGEgPSAha2V5LmNvbG9yX21hc2tbM107CisKKyAgICAgIC8qIEtleSBzaXplIHdpbGwgbmV2ZXIgbWF0Y2gga2V5IHNpemUgZm9yIHRleHR1cmVzLCBzbyB3ZSdyZSBzYWZlLiAqLworICAgICAgYnJ3LT53bS5zdXJmX2JvW3VuaXRdID0gYnJ3X3VwbG9hZF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX1NTX1NVUkZBQ0UsCisJCQkJCSAgICAgICZrZXksIHNpemVvZihrZXkpLAorCQkJCQkgICAgICAgJnJlZ2lvbl9ibywgMSwKKwkJCQkJICAgICAgICZzdXJmLCBzaXplb2Yoc3VyZiksCisJCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChyZWdpb25fYm8gIT0gTlVMTCkgeworCSAvKiBXZSBtaWdodCBzYW1wbGUgZnJvbSBpdCwgYW5kIHdlIG1pZ2h0IHJlbmRlciB0byBpdCwgc28gZmxhZworCSAgKiB0aGVtIGJvdGguICBXZSBtaWdodCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgZnJvbSBvdGhlciBzdGF0ZQorCSAgKiBhIG1vcmUgcmVzdHJpY3RpdmUgcmVsb2NhdGlvbiB0byBlbWl0LgorCSAgKi8KKwkgaW50ZWxfYm9fZW1pdF9yZWxvYyhicnctPndtLnN1cmZfYm9bdW5pdF0sCisJCQkgICAgIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIgfAorCQkJICAgICBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiwKKwkJCSAgICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwKKwkJCSAgICAgMCwKKwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlLCBzczEpLAorCQkJICAgICByZWdpb25fYm8pOworICAgICAgfQogICAgfQogfQogCiAKKy8qKgorICogQ29uc3RydWN0cyB0aGUgYmluZGluZyB0YWJsZSBmb3IgdGhlIFdNIHN1cmZhY2Ugc3RhdGUsIHdoaWNoIG1hcHMgdW5pdAorICogbnVtYmVycyB0byBzdXJmYWNlIHN0YXRlIG9iamVjdHMuCisgKi8KK3N0YXRpYyBkcmlfYm8gKgorYnJ3X3dtX2dldF9iaW5kaW5nX3RhYmxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQoreworICAgZHJpX2JvICpiaW5kX2JvOwogCi0jZGVmaW5lIE9GRlNFVChUWVBFLCBGSUVMRCkgKCAoR0x1aW50KSYoKChUWVBFICopMCktPkZJRUxEKSApCisgICBiaW5kX2JvID0gYnJ3X3NlYXJjaF9jYWNoZSgmYnJ3LT5jYWNoZSwgQlJXX1NTX1NVUkZfQklORCwKKwkJCSAgICAgIE5VTEwsIDAsCisJCQkgICAgICBicnctPndtLnN1cmZfYm8sIGJydy0+d20ubnJfc3VyZmFjZXMsCisJCQkgICAgICBOVUxMKTsKIAorICAgaWYgKGJpbmRfYm8gPT0gTlVMTCkgeworICAgICAgR0x1aW50IGRhdGFfc2l6ZSA9IGJydy0+d20ubnJfc3VyZmFjZXMgKiBzaXplb2YoR0x1aW50KTsKKyAgICAgIHVpbnQzMl90ICpkYXRhID0gbWFsbG9jKGRhdGFfc2l6ZSk7CisgICAgICBpbnQgaTsKIAotc3RhdGljIHZvaWQgdXBsb2FkX3dtX3N1cmZhY2VzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBicnctPndtLm5yX3N1cmZhY2VzOyBpKyspCisgICAgICAgICBpZiAoYnJ3LT53bS5zdXJmX2JvW2ldKQorICAgICAgICAgICAgZGF0YVtpXSA9IGJydy0+d20uc3VyZl9ib1tpXS0+b2Zmc2V0OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGF0YVtpXSA9IDA7CisKKyAgICAgIGJpbmRfYm8gPSBicndfdXBsb2FkX2NhY2hlKCAmYnJ3LT5jYWNoZSwgQlJXX1NTX1NVUkZfQklORCwKKwkJCQkgIE5VTEwsIDAsCisJCQkJICBicnctPndtLnN1cmZfYm8sIGJydy0+d20ubnJfc3VyZmFjZXMsCisJCQkJICBkYXRhLCBkYXRhX3NpemUsCisJCQkJICBOVUxMLCBOVUxMKTsKKworICAgICAgLyogRW1pdCBiaW5kaW5nIHRhYmxlIHJlbG9jYXRpb25zIHRvIHN1cmZhY2Ugc3RhdGUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBCUldfV01fTUFYX1NVUkY7IGkrKykgeworCSBpZiAoYnJ3LT53bS5zdXJmX2JvW2ldICE9IE5VTEwpIHsKKwkgICAgaW50ZWxfYm9fZW1pdF9yZWxvYyhiaW5kX2JvLAorCQkJCUk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKKwkJCQkwLAorCQkJCWkgKiBzaXplb2YoR0x1aW50KSwKKwkJCQlicnctPndtLnN1cmZfYm9baV0pOworCSB9CisgICAgICB9CisKKyAgICAgIGZyZWUoZGF0YSk7CisgICB9CisKKyAgIHJldHVybiBiaW5kX2JvOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3dtX3N1cmZhY2VzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICkKIHsKICAgIEdMY29udGV4dCAqY3R4ID0gJmJydy0+aW50ZWwuY3R4OwogICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gJmJydy0+aW50ZWw7Ci0gICBzdHJ1Y3QgYnJ3X3N1cmZhY2VfYmluZGluZ190YWJsZSBiaW5kOwogICAgR0x1aW50IGk7CiAKLSAgIG1lbWNweSgmYmluZCwgJmJydy0+d20uYmluZCwgc2l6ZW9mKGJpbmQpKTsKLSAgICAgIAotICAgewotICAgICAgc3RydWN0IGJyd19zdXJmYWNlX3N0YXRlIHN1cmY7Ci0gICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24gPSBicnctPnN0YXRlLmRyYXdfcmVnaW9uOwotCi0gICAgICBtZW1zZXQoJnN1cmYsIDAsIHNpemVvZihzdXJmKSk7Ci0KLSAgICAgIGlmIChyZWdpb24tPmNwcCA9PSA0KQotCSBzdXJmLnNzMC5zdXJmYWNlX2Zvcm1hdCA9IEJSV19TVVJGQUNFRk9STUFUX0I4RzhSOEE4X1VOT1JNOwotICAgICAgZWxzZSAKLQkgc3VyZi5zczAuc3VyZmFjZV9mb3JtYXQgPSBCUldfU1VSRkFDRUZPUk1BVF9CNUc2UjVfVU5PUk07Ci0KLSAgICAgIHN1cmYuc3MwLnN1cmZhY2VfdHlwZSA9IEJSV19TVVJGQUNFXzJEOwotCi0gICAgICAvKiBfTkVXX0NPTE9SICovCi0gICAgICBzdXJmLnNzMC5jb2xvcl9ibGVuZCA9ICghYnJ3LT5hdHRyaWJzLkNvbG9yLT5fTG9naWNPcEVuYWJsZWQgJiYKLQkJCSAgICAgIGJydy0+YXR0cmlicy5Db2xvci0+QmxlbmRFbmFibGVkKTsKLQotCi0gICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfcmVkID0gICAhYnJ3LT5hdHRyaWJzLkNvbG9yLT5Db2xvck1hc2tbMF07Ci0gICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfZ3JlZW4gPSAhYnJ3LT5hdHRyaWJzLkNvbG9yLT5Db2xvck1hc2tbMV07Ci0gICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfYmx1ZSA9ICAhYnJ3LT5hdHRyaWJzLkNvbG9yLT5Db2xvck1hc2tbMl07Ci0gICAgICBzdXJmLnNzMC53cml0ZWRpc2FibGVfYWxwaGEgPSAhYnJ3LT5hdHRyaWJzLkNvbG9yLT5Db2xvck1hc2tbM107Ci0KLSAgICAgIC8qIEJSV19ORVdfTE9DSyAqLwotICAgICAgc3VyZi5zczEuYmFzZV9hZGRyID0gYm1CdWZmZXJPZmZzZXQoJmJydy0+aW50ZWwsIHJlZ2lvbi0+YnVmZmVyKTsKLQotCi0gICAgICBzdXJmLnNzMi53aWR0aCA9IHJlZ2lvbi0+cGl0Y2ggLSAxOyAvKiBYWFg6IG5vdCByZWFsbHkhICovCi0gICAgICBzdXJmLnNzMi5oZWlnaHQgPSByZWdpb24tPmhlaWdodCAtIDE7Ci0gICAgICBzdXJmLnNzMy50aWxlX3dhbGsgPSBCUldfVElMRVdBTEtfWE1BSk9SOwotICAgICAgc3VyZi5zczMudGlsZWRfc3VyZmFjZSA9IHJlZ2lvbi0+dGlsZWQ7Ci0gICAgICBzdXJmLnNzMy5waXRjaCA9IChyZWdpb24tPnBpdGNoICogcmVnaW9uLT5jcHApIC0gMTsKLQotICAgICAgYnJ3LT53bS5iaW5kLnN1cmZfc3Nfb2Zmc2V0WzBdID0gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlW0JSV19TU19TVVJGQUNFXSwgJnN1cmYgKTsKLSAgICAgIGJydy0+d20ubnJfc3VyZmFjZXMgPSAxOworICAgaWYgKGJydy0+c3RhdGUubnJfZHJhd19yZWdpb25zICA+IDEpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBicnctPnN0YXRlLm5yX2RyYXdfcmVnaW9uczsgaSsrKSB7CisgICAgICAgICBicndfdXBkYXRlX3JlZ2lvbl9zdXJmYWNlKGJydywgYnJ3LT5zdGF0ZS5kcmF3X3JlZ2lvbnNbaV0sIGksCisJCQkJICAgR0xfRkFMU0UpOworICAgICAgfQorICAgfWVsc2UgeworICAgICAgYnJ3X3VwZGF0ZV9yZWdpb25fc3VyZmFjZShicncsIGJydy0+c3RhdGUuZHJhd19yZWdpb25zWzBdLCAwLCBHTF9UUlVFKTsKICAgIH0KIAorICAgYnJ3LT53bS5ucl9zdXJmYWNlcyA9IE1BWF9EUkFXX0JVRkZFUlM7CiAKICAgIGZvciAoaSA9IDA7IGkgPCBCUldfTUFYX1RFWF9VTklUOyBpKyspIHsKICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRleFVuaXQgPSAmYnJ3LT5hdHRyaWJzLlRleHR1cmUtPlVuaXRbaV07CiAKLSAgICAgIC8qIF9ORVdfVEVYVFVSRSwgQlJXX05FV19URVhEQVRBIAotICAgICAgICovCi0gICAgICBpZiAodGV4VW5pdC0+X1JlYWxseUVuYWJsZWQgJiYKLQkgIGludGVsX2ZpbmFsaXplX21pcG1hcF90cmVlKGludGVsLHRleFVuaXQtPl9DdXJyZW50KSkgewotCi0JIHN0cnVjdCBicndfc3VyZmFjZV9zdGF0ZSBzdXJmOwotCi0JIGJyd191cGRhdGVfdGV4dHVyZV9zdXJmYWNlKGN0eCwgaSwgJnN1cmYpOwotCi0JIGJydy0+d20uYmluZC5zdXJmX3NzX29mZnNldFtpKzFdID0gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlW0JSV19TU19TVVJGQUNFXSwgJnN1cmYgKTsKLQkgYnJ3LT53bS5ucl9zdXJmYWNlcyA9IGkrMjsKKyAgICAgIC8qIF9ORVdfVEVYVFVSRSwgQlJXX05FV19URVhEQVRBICovCisgICAgICBpZih0ZXhVbml0LT5fUmVhbGx5RW5hYmxlZCkgeworICAgICAgICAgaWYgKHRleFVuaXQtPl9DdXJyZW50ID09IGludGVsLT5mcmFtZV9idWZmZXJfdGV4b2JqKSB7CisgICAgICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2UoYnJ3LT53bS5zdXJmX2JvW2krTUFYX0RSQVdfQlVGRkVSU10pOworICAgICAgICAgICAgYnJ3LT53bS5zdXJmX2JvW2krTUFYX0RSQVdfQlVGRkVSU10gPSBicnctPndtLnN1cmZfYm9bMF07CisgICAgICAgICAgICBkcmlfYm9fcmVmZXJlbmNlKGJydy0+d20uc3VyZl9ib1tpK01BWF9EUkFXX0JVRkZFUlNdKTsKKyAgICAgICAgICAgIGJydy0+d20ubnJfc3VyZmFjZXMgPSBpICsgTUFYX0RSQVdfQlVGRkVSUyArIDE7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJ3X3VwZGF0ZV90ZXh0dXJlX3N1cmZhY2UoY3R4LCBpKTsKKyAgICAgICAgICAgIGJydy0+d20ubnJfc3VyZmFjZXMgPSBpICsgTUFYX0RSQVdfQlVGRkVSUyArIDE7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+d20uc3VyZl9ib1tpK01BWF9EUkFXX0JVRkZFUlNdKTsKKyAgICAgICAgIGJydy0+d20uc3VyZl9ib1tpK01BWF9EUkFXX0JVRkZFUlNdID0gTlVMTDsKICAgICAgIH0KLSAgICAgIGVsc2UgaWYoIHRleFVuaXQtPl9SZWFsbHlFbmFibGVkICYmCi0JICAgICAgIHRleFVuaXQtPl9DdXJyZW50ID09IGludGVsLT5mcmFtZV9idWZmZXJfdGV4b2JqICkKLSAgICAgIHsKLQkgYnJ3LT53bS5iaW5kLnN1cmZfc3Nfb2Zmc2V0W2krMV0gPSBicnctPndtLmJpbmQuc3VyZl9zc19vZmZzZXRbMF07Ci0JIGJydy0+d20ubnJfc3VyZmFjZXMgPSBpKzI7Ci0gICAgICB9ICAgIAotICAgICAgZWxzZSB7Ci0JIGJydy0+d20uYmluZC5zdXJmX3NzX29mZnNldFtpKzFdID0gMDsKLSAgICAgIH0KKwogICAgfQogCi0gICBicnctPndtLmJpbmRfc3Nfb2Zmc2V0ID0gYnJ3X2NhY2hlX2RhdGEoICZicnctPmNhY2hlW0JSV19TU19TVVJGX0JJTkRdLAotCQkJCQkgICAgJmJydy0+d20uYmluZCApOworICAgZHJpX2JvX3VucmVmZXJlbmNlKGJydy0+d20uYmluZF9ibyk7CisgICBicnctPndtLmJpbmRfYm8gPSBicndfd21fZ2V0X2JpbmRpbmdfdGFibGUoYnJ3KTsKIH0KIAorCiBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgYnJ3X3dtX3N1cmZhY2VzID0gewogICAgLmRpcnR5ID0gewogICAgICAgLm1lc2EgPSBfTkVXX0NPTE9SIHwgX05FV19URVhUVVJFIHwgX05FV19CVUZGRVJTLAotICAgICAgLmJydyA9IChCUldfTkVXX0NPTlRFWFQgfCAKLQkgICAgICBCUldfTkVXX0xPQ0spLAkvKiByZXF1aXJlZCBmb3IgYm1CdWZmZXJPZmZzZXQgKi8KKyAgICAgIC5icncgPSBCUldfTkVXX0NPTlRFWFQsCiAgICAgICAuY2FjaGUgPSAwCiAgICB9LAotICAgLnVwZGF0ZSA9IHVwbG9hZF93bV9zdXJmYWNlcworICAgLnByZXBhcmUgPSBwcmVwYXJlX3dtX3N1cmZhY2VzLAogfTsKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2J1Zm1nci5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9idWZtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0OGMwZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2J1Zm1nci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlVGTUdSX0gKLSNkZWZpbmUgQlVGTUdSX0gKLQotI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKLQotCi0vKiBUaGUgYnVmZmVyIG1hbmFnZXIgY29udGV4dC4gIE9wYXF1ZS4KLSAqLwotc3RydWN0IGJ1Zm1ncjsKLXN0cnVjdCBidWZmZXI7Ci0KLQotc3RydWN0IGJ1Zm1nciAqYm1fZmFrZV9pbnRlbF9BdHRhY2goIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOyAKLQotLyogRmxhZ3MgZm9yIHZhbGlkYXRlIGFuZCBvdGhlciBjYWxscy4gIElmIGJvdGggTk9fVVBMT0FEIGFuZCBOT19FVklDVAotICogYXJlIHNwZWNpZmllZCwgVmFsaWRhdGVCdWZmZXJzIGlzIGVzc2VudGlhbGx5IGEgcXVlcnkuCi0gKi8KLSNkZWZpbmUgQk1fTUVNX0xPQ0FMICAgMHgxCi0jZGVmaW5lIEJNX01FTV9BR1AgICAgIDB4MgotI2RlZmluZSBCTV9NRU1fVlJBTSAgICAweDQJLyogbm90IHlldCB1c2VkICovCi0jZGVmaW5lIEJNX1dSSVRFICAgICAgIDB4OAkvKiBub3QgeWV0IHVzZWQgKi8KLSNkZWZpbmUgQk1fUkVBRCAgICAgICAgMHgxMAkvKiBub3QgeWV0IHVzZWQgKi8KLSNkZWZpbmUgQk1fTk9fVVBMT0FEICAgMHgyMAotI2RlZmluZSBCTV9OT19FVklDVCAgICAweDQwCi0jZGVmaW5lIEJNX05PX01PVkUgICAgIDB4ODAJLyogbm90IHlldCB1c2VkICovCi0jZGVmaW5lIEJNX05PX0FMTE9DICAgIDB4MTAwCS8qIGxlZ2FjeSAiZml4ZWQiIGJ1ZmZlcnMgb25seSAqLwotI2RlZmluZSBCTV9DTElFTlQgICAgICAweDIwMAkvKiBmb3IgbWFwIC0gcG9pbnRlciB3aWxsIGJlIGFjY2Vzc2VkCi0JCQkJICogd2l0aG91dCBkcmkgbG9jayAqLwotCi0jZGVmaW5lIEJNX01FTV9NQVNLIChCTV9NRU1fTE9DQUx8Qk1fTUVNX0FHUHxCTV9NRU1fVlJBTSkKLQotCi0KLQotLyogQ3JlYXRlIGEgcG9vbCBvZiBhIGdpdmVuIG1lbW9yeSB0eXBlLCBmcm9tIGEgY2VydGFpbiBvZmZzZXQgYW5kIGEKLSAqIGNlcnRhaW4gc2l6ZS4gIAotICoKLSAqIEFsc28gcGFzc2VkIGluIGlzIGEgdmlydHVhbCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgcG9vbC4gIFRoaXMKLSAqIGlzIHVzZWZ1bCBpbiB0aGUgZmFrZWQtb3V0IHZlcnNpb24gaW4gaTkxNSBzbyB0aGF0IE1hcEJ1ZmZlciBjYW4KLSAqIHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgcmVzaWRpbmcgaW4gQUdQIHNwYWNlLiAgCi0gKgotICogRmxhZ3MgcGFzc2VkIGludG8gYSBwb29sIGFyZSBpbmhlcml0ZWQgYnkgYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGluCi0gKiB0aGF0IHBvb2wuICBTbyBwb29scyByZXByZXNlbnRpbmcgdGhlIHN0YXRpYyBmcm9udCxiYWNrLGRlcHRoCi0gKiBidWZmZXIgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgTUVNX0FHUHxOT19VUExPQUR8Tk9fRVZJQ1R8Tk9fTU9WRSB0byBtYXRjaAotICogdGhlIGJlaGF2aW91ciBvZiB0aGUgbGVnYWN5IGFsbG9jYXRpb25zLgotICoKLSAqIFJldHVybnMgLTEgZm9yIGZhaWx1cmUsIHBvb2wgbnVtYmVyIGZvciBzdWNjZXNzLgotICovCi1pbnQgYm1Jbml0UG9vbCggc3RydWN0IGludGVsX2NvbnRleHQgKiwgCi0JCXVuc2lnbmVkIGxvbmcgbG93X29mZnNldCwKLQkJdm9pZCAqbG93X3ZpcnR1YWwsCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJdW5zaWduZWQgZmxhZ3MpOwotCi0KLS8qIFN0aWNrIGNsb3NlbHkgdG8gQVJCX3ZibyBzZW1hbnRpY3MgLSB0aGV5J3JlIHdlbGwgZGVmaW5lZCBhbmQKLSAqIHVuZGVyc3Rvb2QsIGFuZCBkcml2ZXJzIGNhbiBqdXN0IHBhc3MgdGhlIGNhbGxzIHRocm91Z2ggd2l0aG91dCB0b28KLSAqIG11Y2ggdGh1bmtpbmcuCi0gKi8KLXZvaWQgYm1HZW5CdWZmZXJzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbiwgc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlcnMsCi0JCSAgaW50IGFsaWduICk7Ci12b2lkIGJtRGVsZXRlQnVmZmVycyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCB1bnNpZ25lZCBuLCBzdHJ1Y3QgYnVmZmVyICoqYnVmZmVycyk7Ci0KLQotLyogSG9vayB0byBpbmZvcm0gZmFrZWQgYnVmZmVyIG1hbmFnZXIgYWJvdXQgZml4ZWQtcG9zaXRpb24KLSAqIGZyb250LGRlcHRoLGJhY2sgYnVmZmVycy4gIFRoZXNlIG1heSBtb3ZlIHRvIGEgZnVsbHkgbWVtb3J5LW1hbmFnZWQKLSAqIHNjaGVtZSwgb3IgdGhleSBtYXkgY29udGludWUgdG8gYmUgbWFuYWdlZCBhcyBpcy4KLSAqLwotc3RydWN0IGJ1ZmZlciAqYm1HZW5CdWZmZXJTdGF0aWMoc3RydWN0IGludGVsX2NvbnRleHQgKiwKLQkJCQkgdW5zaWduZWQgcG9vbCk7Ci0KLS8qIE9uIGV2aWN0LCBidWZmZXIgbWFuYWdlciB3aWxsIGNhbGwgaW52YWxpZGF0ZV9jYigpIHRvIG5vdGUgdGhhdCB0aGUKLSAqIGJ1ZmZlciBuZWVkcyB0byBiZSByZWxvYWRlZC4KLSAqCi0gKiBCdWZmZXIgaXMgdXBsb2FkZWQgYnkgY2FsbGluZyBibU1hcEJ1ZmZlcigpIGFuZCBjb3B5aW5nIGRhdGEgaW50bwotICogdGhlIHJldHVybmVkIHBvaW50ZXIuCi0gKgotICogVGhpcyBpcyBiYXNpY2FsbHkgYSBiaWcgaGFjayB0byBnZXQgc29tZSBtb3JlIHBlcmZvcm1hbmNlIGJ5Ci0gKiB0dXJuaW5nIG9mZiBiYWNraW5nIHN0b3JlIGZvciBidWZmZXJzIHdoZXJlIHdlIGVpdGhlciBoYXZlIGl0Ci0gKiBhbHJlYWR5ICh0ZXh0dXJlcykgb3IgZG9uJ3QgbmVlZCBpdCAoYmF0Y2ggYnVmZmVycywgdGVtcG9yYXJ5Ci0gKiB2Ym8ncykuCi0gKi8KLXZvaWQgYm1CdWZmZXJTZXRJbnZhbGlkYXRlQ0Ioc3RydWN0IGludGVsX2NvbnRleHQgKiwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlciAqYnVmLAotCQkJICAgICB2b2lkICgqaW52YWxpZGF0ZV9jYikoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIHZvaWQgKnB0ciApLAotCQkJICAgICB2b2lkICpwdHIsCi0JCQkgICAgIEdMYm9vbGVhbiBkb250X2ZlbmNlX3N1YmRhdGEpOwotCi0KLS8qIFRoZSBkcml2ZXIgaGFzIG1vcmUgaW50aW1hdGUga25vd2xlZGdlIG9mIHRoZSBoYXJkYXJlIHRoYW4gYSBHTAotICogY2xpZW50IHdvdWxkLCBzbyBmbGFncyBoZXJlIGlzIG1vcmUgcHJvc2NyaXB0aXZlIHRoYW4gdGhlIHVzYWdlCi0gKiB2YWx1ZXMgaW4gdGhlIEFSQl92Ym8gaW50ZXJmYWNlOgotICovCi1pbnQgYm1CdWZmZXJEYXRhKHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIAotCQkgIHN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCSAgdW5zaWduZWQgc2l6ZSwgCi0JCSAgY29uc3Qgdm9pZCAqZGF0YSwgCi0JCSAgdW5zaWduZWQgZmxhZ3MgKTsKLQotaW50IGJtQnVmZmVyU3ViRGF0YShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCAKLQkJICAgICBzdHJ1Y3QgYnVmZmVyICpidWYsIAotCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgCi0JCSAgICAgdW5zaWduZWQgc2l6ZSwgCi0JCSAgICAgY29uc3Qgdm9pZCAqZGF0YSApOwotCi0KLWludCBibUJ1ZmZlckRhdGFBVUIoc3RydWN0IGludGVsX2NvbnRleHQgKiwgCi0JCSAgICAgc3RydWN0IGJ1ZmZlciAqYnVmLCAKLQkJICAgICB1bnNpZ25lZCBzaXplLCAKLQkJICAgICBjb25zdCB2b2lkICpkYXRhLCAKLQkJICAgICB1bnNpZ25lZCBmbGFncywKLQkJICAgICB1bnNpZ25lZCBhdWJ0eXBlLAotCQkgICAgIHVuc2lnbmVkIGF1YnN1YnR5cGUgKTsKLQotaW50IGJtQnVmZmVyU3ViRGF0YUFVQihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCAKLQkJCXN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCQl1bnNpZ25lZCBvZmZzZXQsIAotCQkJdW5zaWduZWQgc2l6ZSwgCi0JCQljb25zdCB2b2lkICpkYXRhLAotCQkJdW5zaWduZWQgYXVidHlwZSwKLQkJCXVuc2lnbmVkIGF1YnN1YnR5cGUgKTsKLQotCi0vKiBJbiB0aGlzIHZlcnNpb24sIHRha2luZyB0aGUgb2Zmc2V0IHdpbGwgcHJvdm9rZSBhbiB1cGxvYWQgb24KLSAqIGJ1ZmZlcnMgbm90IGFscmVhZHkgcmVzaWRlbnQgaW4gQUdQOgotICovCi11bnNpZ25lZCBibUJ1ZmZlck9mZnNldChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCAKLQkJCXN0cnVjdCBidWZmZXIgKmJ1Zik7Ci0KLQotLyogRXh0cmFjdCBkYXRhIGZyb20gdGhlIGJ1ZmZlcjoKLSAqLwotdm9pZCBibUJ1ZmZlckdldFN1YkRhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKiwgCi0JCQlzdHJ1Y3QgYnVmZmVyICpidWYsIAotCQkJdW5zaWduZWQgb2Zmc2V0LCAKLQkJCXVuc2lnbmVkIHNpemUsIAotCQkJdm9pZCAqZGF0YSApOwotCi12b2lkICpibU1hcEJ1ZmZlciggc3RydWN0IGludGVsX2NvbnRleHQgKiwKLQkJICAgc3RydWN0IGJ1ZmZlciAqYnVmLCAKLQkJICAgdW5zaWduZWQgYWNjZXNzICk7Ci0KLXZvaWQgYm1Vbm1hcEJ1ZmZlciggc3RydWN0IGludGVsX2NvbnRleHQgKiwKLQkJICAgIHN0cnVjdCBidWZmZXIgKmJ1ZiApOwotCi12b2lkIGJtVW5tYXBCdWZmZXJBVUIoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICosCi0JCSAgICAgICBzdHJ1Y3QgYnVmZmVyICpidWYsCi0JCSAgICAgICB1bnNpZ25lZCBhdWJ0eXBlLAotCQkgICAgICAgdW5zaWduZWQgYXVic3VidHlwZSApOwotCi0KLS8qIFBlcnRhaW5zIHRvIGFsbCBidWZmZXJzIHdobydzIG9mZnNldCBoYXMgYmVlbiB0YWtlbiBzaW5jZSB0aGUgbGFzdAotICogZmVuY2Ugb3IgcmVsZWFzZS4KLSAqLwotaW50IGJtVmFsaWRhdGVCdWZmZXJzKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqICk7Ci12b2lkIGJtUmVsZWFzZUJ1ZmZlcnMoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICogKTsKLQotR0x1aW50IGJtQ3R4SWQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwotCi0KLUdMYm9vbGVhbiBibUVycm9yKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqICk7Ci12b2lkIGJtRXZpY3RBbGwoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICogKTsKLQotdm9pZCAqYm1GaW5kVmlydHVhbCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCSAgICAgc2l6ZV90IHN6ICk7Ci0KLS8qIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGJ5IHRoZSBidWZmZXIgbWFuYWdlciwgbm90IHJlYWxseSBzdXJlCi0gKiBpZiB3ZSBuZWVkIHRvIGJlIGV4cG9zaW5nIGl0IGluIHRoaXMgd2F5LCBwcm9iYWJseSBsaWJkcm0gd2lsbAotICogb2ZmZXIgZXF1aXZhbGVudCBjYWxscy4KLSAqCi0gKiBGb3Igbm93IHRoZXkgY2FuIHN0YXksIGJ1dCB3aWxsIGxpa2VseSBjaGFuZ2UvbW92ZSBiZWZvcmUgZmluYWw6Ci0gKi8KLXVuc2lnbmVkIGJtU2V0RmVuY2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICogKTsKLXVuc2lnbmVkIGJtU2V0RmVuY2VMb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqICk7Ci11bnNpZ25lZCBibUxvY2tBbmRGZW5jZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci1pbnQgYm1UZXN0RmVuY2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIHVuc2lnbmVkIGZlbmNlICk7Ci12b2lkIGJtRmluaXNoRmVuY2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIHVuc2lnbmVkIGZlbmNlICk7Ci12b2lkIGJtRmluaXNoRmVuY2VMb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCB1bnNpZ25lZCBmZW5jZSApOwotCi12b2lkIGJtX2Zha2VfTm90aWZ5Q29udGVuZGVkTG9ja1Rha2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICogKTsKLQotZXh0ZXJuIGludCBJTlRFTF9ERUJVRzsKLSNkZWZpbmUgREVCVUdfQlVGTUdSIDB4MTAwMDAwMDAKLQotI2RlZmluZSBEQkcoLi4uKSAgZG8geyBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CVUZNR1IpIF9tZXNhX3ByaW50ZihfX1ZBX0FSR1NfXyk7IH0gd2hpbGUoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2J1Zm1ncl9mYWtlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2J1Zm1ncl9mYWtlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWUxMWUuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9idWZtZ3JfZmFrZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPcmlnaW5hbGx5IGEgZmFrZSB2ZXJzaW9uIG9mIHRoZSBidWZmZXIgbWFuYWdlciBzbyB0aGF0IHdlIGNhbgotICogcHJvdG90eXBlIHRoZSBjaGFuZ2VzIGluIGEgZHJpdmVyIGZhaXJseSBxdWlja2x5LCBoYXMgYmVlbiBmbGVzaGVkCi0gKiBvdXQgdG8gYSBmdWxseSBmdW5jdGlvbmFsIGludGVyaW0gc29sdXRpb24uCi0gKgotICogQmFzaWNhbGx5IHdyYXBzIHRoZSBvbGQgc3R5bGUgbWVtb3J5IG1hbmFnZW1lbnQgaW4gdGhlIG5ldwotICogcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBidXQgaXMgbW9yZSBleHByZXNzaXZlIGFuZCBhdm9pZHMgbWFueSBvZgotICogdGhlIGJ1Z3MgaW4gdGhlIG9sZCB0ZXh0dXJlIG1hbmFnZXIuCi0gKi8KLSNpbmNsdWRlICJidWZtZ3IuaCIKLQotI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKLSNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgotI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCi0KLSNpbmNsdWRlICJzaW1wbGVfbGlzdC5oIgotI2luY2x1ZGUgIm1tLmgiCi0jaW5jbHVkZSAiaW1wb3J0cy5oIgotCi0jZGVmaW5lIEJNX1BPT0xfTUFYIDgKLQotLyogSW50ZXJuYWwgZmxhZ3M6Ci0gKi8KLSNkZWZpbmUgQk1fTk9fQkFDS0lOR19TVE9SRSAgIDB4MjAwMAotI2RlZmluZSBCTV9OT19GRU5DRV9TVUJEQVRBICAgMHg0MDAwCi0KLQotc3RhdGljIGludCBjaGVja19mZW5jZWQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwotCi1zdGF0aWMgaW50IG5yX2F0dGFjaCA9IDA7Ci0KLS8qIFdyYXBwZXIgYXJvdW5kIG1tLmMncyBtZW1fYmxvY2ssIHdoaWNoIHVuZGVyc3RhbmRzIHRoYXQgeW91IG11c3QKLSAqIHdhaXQgZm9yIGZlbmNlcyB0byBleHBpcmUgYmVmb3JlIG1lbW9yeSBjYW4gYmUgZnJlZWQuICBUaGlzIGlzCi0gKiBzcGVjaWZpYyB0byBvdXIgdXNlIG9mIG1lbWNweSBmb3IgdXBsb2FkcyAtIGFuIHVwbG9hZCB0aGF0IHdhcwotICogcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGNvbW1hbmQgcXVldWUgd291bGRuJ3QgbmVlZCB0byBjYXJlIGFib3V0Ci0gKiBmZW5jZXMuCi0gKi8KLXN0cnVjdCBibG9jayB7Ci0gICBzdHJ1Y3QgYmxvY2sgKm5leHQsICpwcmV2OwotICAgc3RydWN0IHBvb2wgKnBvb2w7CQkvKiBCTV9NRU1fQUdQICovCi0gICBzdHJ1Y3QgbWVtX2Jsb2NrICptZW07CS8qIEJNX01FTV9BR1AgKi8KLQotICAgdW5zaWduZWQgcmVmZXJlbmNlZDoxOwotICAgdW5zaWduZWQgb25faGFyZHdhcmU6MTsKLSAgIHVuc2lnbmVkIGZlbmNlZDoxOwkKLSAgIAotCi0gICB1bnNpZ25lZCBmZW5jZTsJCS8qIEJNX01FTV9BR1AsIFNwbGl0IHRvIHJlYWRfZmVuY2UsIHdyaXRlX2ZlbmNlICovCi0KLSAgIHN0cnVjdCBidWZmZXIgKmJ1ZjsKLSAgIHZvaWQgKnZpcnR1YWw7Ci19OwotCi0KLXN0cnVjdCBidWZmZXIgewotICAgdW5zaWduZWQgaWQ7CQkJLyogZGVidWcgb25seSAqLwotICAgY29uc3QgY2hhciAqbmFtZTsKLSAgIHVuc2lnbmVkIHNpemU7Ci0KLSAgIHVuc2lnbmVkIG1hcHBlZDoxOwkJCi0gICB1bnNpZ25lZCBkaXJ0eToxOwkJCi0gICB1bnNpZ25lZCBhdWJfZGlydHk6MTsJCi0gICB1bnNpZ25lZCBhbGlnbm1lbnQ6MTM7Ci0gICB1bnNpZ25lZCBmbGFnczoxNjsKLQotICAgc3RydWN0IGJsb2NrICpibG9jazsKLSAgIHZvaWQgKmJhY2tpbmdfc3RvcmU7Ci0gICB2b2lkICgqaW52YWxpZGF0ZV9jYikoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIHZvaWQgKiApOwotICAgdm9pZCAqaW52YWxpZGF0ZV9wdHI7Ci19OwotCi1zdHJ1Y3QgcG9vbCB7Ci0gICB1bnNpZ25lZCBzaXplOwotICAgdW5zaWduZWQgbG93X29mZnNldDsKLSAgIHN0cnVjdCBidWZmZXIgKnN0YXRpY19idWZmZXI7Ci0gICB1bnNpZ25lZCBmbGFnczsKLSAgIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXA7Ci0gICB2b2lkICp2aXJ0dWFsOwotICAgc3RydWN0IGJsb2NrIGxydTsJCS8qIG9ubHkgYWxsb2NhdGVkLCBub24tZmVuY2UtcGVuZGluZyBibG9ja3MgaGVyZSAqLwotfTsKLQotc3RydWN0IGJ1Zm1nciB7Ci0gICBfZ2x0aHJlYWRfTXV0ZXggbXV0ZXg7CS8qKjwgZm9yIHRocmVhZCBzYWZldHkgKi8KLSAgIHN0cnVjdCBwb29sIHBvb2xbQk1fUE9PTF9NQVhdOwotICAgdW5zaWduZWQgbnJfcG9vbHM7Ci0KLSAgIHVuc2lnbmVkIGJ1Zl9ucjsJCS8qIGZvciBnZW5lcmF0aW5nIGlkcyAqLwotCi0gICBzdHJ1Y3QgYmxvY2sgcmVmZXJlbmNlZDsJLyogYWZ0ZXIgYm1CdWZmZXJPZmZzZXQgKi8KLSAgIHN0cnVjdCBibG9jayBvbl9oYXJkd2FyZTsJLyogYWZ0ZXIgYm1WYWxpZGF0ZUJ1ZmZlcnMgKi8KLSAgIHN0cnVjdCBibG9jayBmZW5jZWQ7CQkvKiBhZnRlciBibUZlbmNlQnVmZmVycyAobWlfZmx1c2gsIGVtaXQgaXJxLCB3cml0ZSBkd29yZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiB0byBwb29sLT5scnUgb3IgZnJlZSgpICovCi0KLSAgIHVuc2lnbmVkIGN0eElkOwotICAgdW5zaWduZWQgbGFzdF9mZW5jZTsKLSAgIHVuc2lnbmVkIGZyZWVfb25faGFyZHdhcmU7Ci0KLSAgIHVuc2lnbmVkIGZhaWw6MTsKLSAgIHVuc2lnbmVkIG5lZWRfZmVuY2U6MTsKLX07Ci0KLSNkZWZpbmUgTUFYRkVOQ0UgMHg3ZmZmZmZmZgotCi1zdGF0aWMgR0xib29sZWFuIEZFTkNFX0xURSggdW5zaWduZWQgYSwgdW5zaWduZWQgYiApCi17Ci0gICBpZiAoYSA9PSBiKQotICAgICAgcmV0dXJuIEdMX1RSVUU7Ci0KLSAgIGlmIChhIDwgYiAmJiBiIC0gYSA8ICgxPDwyNCkpCi0gICAgICByZXR1cm4gR0xfVFJVRTsKLQotICAgaWYgKGEgPiBiICYmIE1BWEZFTkNFIC0gYSArIGIgPCAoMTw8MjQpKQotICAgICAgcmV0dXJuIEdMX1RSVUU7Ci0KLSAgIHJldHVybiBHTF9GQUxTRTsKLX0KLQotaW50IGJtVGVzdEZlbmNlKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHVuc2lnbmVkIGZlbmNlICkKLXsKLSAgIC8qIFNsaWdodCBwcm9ibGVtIHdpdGggd3JhcC1hcm91bmQ6Ci0gICAgKi8KLSAgIHJldHVybiBmZW5jZSA9PSAwIHx8IEZFTkNFX0xURShmZW5jZSwgaW50ZWwtPnNhcmVhLT5sYXN0X2Rpc3BhdGNoKTsKLX0KLQotI2RlZmluZSBMT0NLKGJtKSBcCi0gIGludCBkb2xvY2sgPSBucl9hdHRhY2ggPiAxOyBcCi0gIGlmIChkb2xvY2spIF9nbHRocmVhZF9MT0NLX01VVEVYKGJtLT5tdXRleCkKLQotI2RlZmluZSBVTkxPQ0soYm0pIFwKLSAgaWYgKGRvbG9jaykgX2dsdGhyZWFkX1VOTE9DS19NVVRFWChibS0+bXV0ZXgpCi0KLQotCi1zdGF0aWMgR0xib29sZWFuIGFsbG9jX2Zyb21fcG9vbCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAkJCQkKLQkJCQkgIHVuc2lnbmVkIHBvb2xfbnIsCi0JCQkJICBzdHJ1Y3QgYnVmZmVyICpidWYgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBzdHJ1Y3QgcG9vbCAqcG9vbCA9ICZibS0+cG9vbFtwb29sX25yXTsKLSAgIHN0cnVjdCBibG9jayAqYmxvY2sgPSAoc3RydWN0IGJsb2NrICopY2FsbG9jKHNpemVvZiAqYmxvY2ssIDEpOwotICAgR0x1aW50IHN6LCBhbGlnbiA9ICgxPDxidWYtPmFsaWdubWVudCk7Ci0KLSAgIGlmICghYmxvY2spCi0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0KLSAgIHN6ID0gKGJ1Zi0+c2l6ZSArIGFsaWduLTEpICYgfihhbGlnbi0xKTsKLQotICAgYmxvY2stPm1lbSA9IG1tQWxsb2NNZW0ocG9vbC0+aGVhcCwgCi0JCQkgICBzeiwgCi0JCQkgICBidWYtPmFsaWdubWVudCwgMCk7Ci0gICBpZiAoIWJsb2NrLT5tZW0pIHsKLSAgICAgIGZyZWUoYmxvY2spOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICBtYWtlX2VtcHR5X2xpc3QoYmxvY2spOwotCi0gICAvKiBJbnNlcnQgYXQgaGVhZCBvciBhdCB0YWlsPz8/ICAgCi0gICAgKi8KLSAgIGluc2VydF9hdF90YWlsKCZwb29sLT5scnUsIGJsb2NrKTsKLQotICAgYmxvY2stPnBvb2wgPSBwb29sOwotICAgYmxvY2stPnZpcnR1YWwgPSBwb29sLT52aXJ0dWFsICsgYmxvY2stPm1lbS0+b2ZzOwotICAgYmxvY2stPmJ1ZiA9IGJ1ZjsKLQotICAgYnVmLT5ibG9jayA9IGJsb2NrOwotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotCi0KLQotCi0KLQotCi0vKiBSZWxlYXNlIHRoZSBjYXJkIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGJ1ZjoKLSAqLwotc3RhdGljIHZvaWQgZnJlZV9ibG9jayggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBzdHJ1Y3QgYmxvY2sgKmJsb2NrICkKLXsKLSAgIERCRygiZnJlZSBibG9jayAlcFxuIiwgYmxvY2spOwotCi0gICBpZiAoIWJsb2NrKSAKLSAgICAgIHJldHVybjsKLQotICAgY2hlY2tfZmVuY2VkKGludGVsKTsKLQotICAgaWYgKGJsb2NrLT5yZWZlcmVuY2VkKSB7Ci0gICAgICBfbWVzYV9wcmludGYoInRyaWVkIHRvIGZyZWUgYmxvY2sgb24gcmVmZXJlbmNlZCBsaXN0XG4iKTsKLSAgICAgIGFzc2VydCgwKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGJsb2NrLT5vbl9oYXJkd2FyZSkgewotICAgICAgYmxvY2stPmJ1ZiA9IE5VTEw7Ci0gICAgICBpbnRlbC0+Ym0tPmZyZWVfb25faGFyZHdhcmUgKz0gYmxvY2stPm1lbS0+c2l6ZTsKLSAgIH0KLSAgIGVsc2UgaWYgKGJsb2NrLT5mZW5jZWQpIHsKLSAgICAgIGJsb2NrLT5idWYgPSBOVUxMOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBEQkcoIiAgICAtIGZyZWUgaW1tZWRpYXRlbHlcbiIpOwotICAgICAgcmVtb3ZlX2Zyb21fbGlzdChibG9jayk7Ci0KLSAgICAgIG1tRnJlZU1lbShibG9jay0+bWVtKTsKLSAgICAgIGZyZWUoYmxvY2spOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGFsbG9jX2JhY2tpbmdfc3RvcmUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGJ1ZmZlciAqYnVmICkKLXsKLSAgIGFzc2VydCghYnVmLT5iYWNraW5nX3N0b3JlKTsKLSAgIGFzc2VydCghKGJ1Zi0+ZmxhZ3MgJiAoQk1fTk9fRVZJQ1R8Qk1fTk9fQkFDS0lOR19TVE9SRSkpKTsKLQotICAgYnVmLT5iYWNraW5nX3N0b3JlID0gQUxJR05fTUFMTE9DKGJ1Zi0+c2l6ZSwgNjQpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2JhY2tpbmdfc3RvcmUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGJ1ZmZlciAqYnVmICkKLXsKLSAgIGFzc2VydCghKGJ1Zi0+ZmxhZ3MgJiAoQk1fTk9fRVZJQ1R8Qk1fTk9fQkFDS0lOR19TVE9SRSkpKTsKLQkgIAotICAgaWYgKGJ1Zi0+YmFja2luZ19zdG9yZSkgewotICAgICAgQUxJR05fRlJFRShidWYtPmJhY2tpbmdfc3RvcmUpOwotICAgICAgYnVmLT5iYWNraW5nX3N0b3JlID0gTlVMTDsKLSAgIH0KLX0KLQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHNldF9kaXJ0eSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgICAgc3RydWN0IGJ1ZmZlciAqYnVmICkKLXsKLSAgIGlmIChidWYtPmZsYWdzICYgQk1fTk9fQkFDS0lOR19TVE9SRSkKLSAgICAgIGJ1Zi0+aW52YWxpZGF0ZV9jYihpbnRlbCwgYnVmLT5pbnZhbGlkYXRlX3B0cik7Ci0KLSAgIGFzc2VydCghKGJ1Zi0+ZmxhZ3MgJiBCTV9OT19FVklDVCkpOwotCi0gICBEQkcoInNldF9kaXJ0eSAtIGJ1ZiAlZFxuIiwgYnVmLT5pZCk7Ci0gICBidWYtPmRpcnR5ID0gMTsKLX0KLQotCi1zdGF0aWMgaW50IGV2aWN0X2xydSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgbWF4X2ZlbmNlLCBHTHVpbnQgKnBvb2wgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBzdHJ1Y3QgYmxvY2sgKmJsb2NrLCAqdG1wOwotICAgaW50IGk7Ci0KLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBibS0+bnJfcG9vbHM7IGkrKykgewotICAgICAgaWYgKCEoYm0tPnBvb2xbaV0uZmxhZ3MgJiBCTV9OT19FVklDVCkpIHsKLQkgZm9yZWFjaF9zKGJsb2NrLCB0bXAsICZibS0+cG9vbFtpXS5scnUpIHsKLQotCSAgICBpZiAoYmxvY2stPmJ1ZiAmJgotCQkoYmxvY2stPmJ1Zi0+ZmxhZ3MgJiBCTV9OT19GRU5DRV9TVUJEQVRBKSkKLQkgICAgICAgY29udGludWU7Ci0KLQkgICAgaWYgKGJsb2NrLT5mZW5jZSAmJiBtYXhfZmVuY2UgJiYKLQkJIUZFTkNFX0xURShibG9jay0+ZmVuY2UsIG1heF9mZW5jZSkpCi0JICAgICAgIHJldHVybiAwOwotCi0JICAgIHNldF9kaXJ0eShpbnRlbCwgYmxvY2stPmJ1Zik7Ci0JICAgIGJsb2NrLT5idWYtPmJsb2NrID0gTlVMTDsKLQotCSAgICBmcmVlX2Jsb2NrKGludGVsLCBibG9jayk7Ci0JICAgICpwb29sID0gaTsKLQkgICAgcmV0dXJuIDE7Ci0JIH0KLSAgICAgIH0KLSAgIH0KLQotCi0gICByZXR1cm4gMDsKLX0KLQotCi0jZGVmaW5lIGZvcmVhY2hfc19yZXYocHRyLCB0LCBsaXN0KSAgIFwKLSAgICAgICAgZm9yKHB0cj0obGlzdCktPnByZXYsdD0ocHRyKS0+cHJldjsgbGlzdCAhPSBwdHI7IHB0cj10LCB0PSh0KS0+cHJldikKLQotc3RhdGljIGludCBldmljdF9tcnUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50ICpwb29sICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgc3RydWN0IGJsb2NrICpibG9jaywgKnRtcDsKLSAgIGludCBpOwotCi0gICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgYm0tPm5yX3Bvb2xzOyBpKyspIHsKLSAgICAgIGlmICghKGJtLT5wb29sW2ldLmZsYWdzICYgQk1fTk9fRVZJQ1QpKSB7Ci0JIGZvcmVhY2hfc19yZXYoYmxvY2ssIHRtcCwgJmJtLT5wb29sW2ldLmxydSkgewotCi0JICAgIGlmIChibG9jay0+YnVmICYmCi0JCShibG9jay0+YnVmLT5mbGFncyAmIEJNX05PX0ZFTkNFX1NVQkRBVEEpKQotCSAgICAgICBjb250aW51ZTsKLQotCSAgICBzZXRfZGlydHkoaW50ZWwsIGJsb2NrLT5idWYpOwotCSAgICBibG9jay0+YnVmLT5ibG9jayA9IE5VTEw7Ci0KLQkgICAgZnJlZV9ibG9jayhpbnRlbCwgYmxvY2spOwotCSAgICAqcG9vbCA9IGk7Ci0JICAgIHJldHVybiAxOwotCSB9Ci0gICAgICB9Ci0gICB9Ci0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjaGVja19mZW5jZWQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBzdHJ1Y3QgYnVmbWdyICpibSA9IGludGVsLT5ibTsKLSAgIHN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7Ci0gICBpbnQgcmV0ID0gMDsKLQotICAgZm9yZWFjaF9zKGJsb2NrLCB0bXAsICZibS0+ZmVuY2VkICkgewotICAgICAgYXNzZXJ0KGJsb2NrLT5mZW5jZWQpOwotCi0gICAgICBpZiAoYm1UZXN0RmVuY2UoaW50ZWwsIGJsb2NrLT5mZW5jZSkpIHsKLQotCSBibG9jay0+ZmVuY2VkID0gMDsKLQotCSBpZiAoIWJsb2NrLT5idWYpIHsKLQkgICAgREJHKCJkZWxheWVkIGZyZWU6IG9mZnNldCAleCBzeiAleFxuIiwgYmxvY2stPm1lbS0+b2ZzLCBibG9jay0+bWVtLT5zaXplKTsKLQkgICAgcmVtb3ZlX2Zyb21fbGlzdChibG9jayk7Ci0JICAgIG1tRnJlZU1lbShibG9jay0+bWVtKTsKLQkgICAgZnJlZShibG9jayk7Ci0JIH0KLQkgZWxzZSB7Ci0JICAgIERCRygicmV0dXJuIHRvIGxydTogb2Zmc2V0ICV4IHN6ICV4XG4iLCBibG9jay0+bWVtLT5vZnMsIGJsb2NrLT5tZW0tPnNpemUpOwotCSAgICBtb3ZlX3RvX3RhaWwoJmJsb2NrLT5wb29sLT5scnUsIGJsb2NrKTsKLQkgfQotCi0JIHJldCA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgLyogQmxvY2tzIGFyZSBvcmRlcmVkIGJ5IGZlbmNlLCBzbyBpZiBvbmUgZmFpbHMsIGFsbCBmcm9tCi0JICAqIGhlcmUgd2lsbCBmYWlsIGFsc286Ci0JICAqLwotCSBicmVhazsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogQWxzbyBjaGVjayB0aGUgcmVmZXJlbmNlZCBsaXN0OiAKLSAgICAqLwotICAgZm9yZWFjaF9zKGJsb2NrLCB0bXAsICZibS0+cmVmZXJlbmNlZCApIHsKLSAgICAgIGlmIChibG9jay0+ZmVuY2VkICYmCi0JICBibVRlc3RGZW5jZShpbnRlbCwgYmxvY2stPmZlbmNlKSkgewotCSBibG9jay0+ZmVuY2VkID0gMDsKLSAgICAgIH0KLSAgIH0KLQotICAgCi0gICBEQkcoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgcmV0dXJuIHJldDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIGZlbmNlX2Jsb2Nrcyggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICB1bnNpZ25lZCBmZW5jZSApCi17Ci0gICBzdHJ1Y3QgYnVmbWdyICpibSA9IGludGVsLT5ibTsKLSAgIHN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7Ci0KLSAgIGZvcmVhY2hfcyAoYmxvY2ssIHRtcCwgJmJtLT5vbl9oYXJkd2FyZSkgewotICAgICAgREJHKCJGZW5jZSBibG9jayAlcCAoc3ogMHgleCBidWYgJXApIHdpdGggZmVuY2UgJWRcbiIsIGJsb2NrLCAKLQkgIGJsb2NrLT5tZW0tPnNpemUsIGJsb2NrLT5idWYsIGZlbmNlKTsKLSAgICAgIGJsb2NrLT5mZW5jZSA9IGZlbmNlOwotCi0gICAgICBibG9jay0+b25faGFyZHdhcmUgPSAwOwotICAgICAgYmxvY2stPmZlbmNlZCA9IDE7Ci0KLSAgICAgIC8qIE1vdmUgdG8gdGFpbCBvZiBwZW5kaW5nIGxpc3QgaGVyZQotICAgICAgICovCi0gICAgICBtb3ZlX3RvX3RhaWwoJmJtLT5mZW5jZWQsIGJsb2NrKTsKLSAgIH0KLQotICAgLyogQWxzbyBjaGVjayB0aGUgcmVmZXJlbmNlZCBsaXN0OgotICAgICovICAKLSAgIGZvcmVhY2hfcyAoYmxvY2ssIHRtcCwgJmJtLT5yZWZlcmVuY2VkKSB7Ci0gICAgICBpZiAoYmxvY2stPm9uX2hhcmR3YXJlKSB7Ci0JIERCRygiRmVuY2UgYmxvY2sgJXAgKHN6IDB4JXggYnVmICVwKSB3aXRoIGZlbmNlICVkXG4iLCBibG9jaywgCi0JICAgICBibG9jay0+bWVtLT5zaXplLCBibG9jay0+YnVmLCBmZW5jZSk7Ci0JIAotCSBibG9jay0+ZmVuY2UgPSBmZW5jZTsKLQkgYmxvY2stPm9uX2hhcmR3YXJlID0gMDsKLQkgYmxvY2stPmZlbmNlZCA9IDE7Ci0gICAgICB9Ci0gICB9Ci0KLQotICAgYm0tPmxhc3RfZmVuY2UgPSBmZW5jZTsKLSAgIGFzc2VydChpc19lbXB0eV9saXN0KCZibS0+b25faGFyZHdhcmUpKTsKLX0KLQotCi0KLQotc3RhdGljIEdMYm9vbGVhbiBhbGxvY19ibG9jayggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgICAgc3RydWN0IGJ1ZmZlciAqYnVmICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgaW50IGk7Ci0KLSAgIGFzc2VydChpbnRlbC0+bG9ja2VkKTsKLQotICAgREJHKCIlcyAweCV4IGJ5dGVzICglcylcbiIsIF9fRlVOQ1RJT05fXywgYnVmLT5zaXplLCBidWYtPm5hbWUpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgYm0tPm5yX3Bvb2xzOyBpKyspIHsKLSAgICAgIGlmICghKGJtLT5wb29sW2ldLmZsYWdzICYgQk1fTk9fQUxMT0MpICYmCi0JICBhbGxvY19mcm9tX3Bvb2woaW50ZWwsIGksIGJ1ZikpIHsKLQotCSBEQkcoIiVzIC0tPiAweCV4IChzeiAleClcbiIsIF9fRlVOQ1RJT05fXywgCi0JICAgICBidWYtPmJsb2NrLT5tZW0tPm9mcywgYnVmLT5ibG9jay0+bWVtLT5zaXplKTsKLQkgCi0JIHJldHVybiBHTF9UUlVFOwotICAgICAgfQotICAgfQotCi0gICBEQkcoIiVzIC0tPiBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgcmV0dXJuIEdMX0ZBTFNFOyAgIAotfQotCi0KLXN0YXRpYyBHTGJvb2xlYW4gZXZpY3RfYW5kX2FsbG9jX2Jsb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJCXN0cnVjdCBidWZmZXIgKmJ1ZiApCi17Ci0gICBHTHVpbnQgcG9vbDsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotCi0gICBhc3NlcnQoYnVmLT5ibG9jayA9PSBOVUxMKTsKLQotICAgLyogUHV0IGEgY2FwIG9uIHRoZSBhbW91bnQgb2YgZnJlZSBtZW1vcnkgd2UnbGwgYWxsb3cgdG8gYWNjdW11bGF0ZQotICAgICogYmVmb3JlIGVtaXR0aW5nIGEgZmVuY2UuCi0gICAgKi8KLSAgIGlmIChibS0+ZnJlZV9vbl9oYXJkd2FyZSA+IDEgKiAxMDI0ICogMTAyNCkgewotICAgICAgREJHKCJmZW5jZSBmb3IgZnJlZSBzcGFjZTogJXhcbiIsIGJtLT5mcmVlX29uX2hhcmR3YXJlKTsKLSAgICAgIGJtU2V0RmVuY2UoaW50ZWwpOwotICAgfQotCi0gICAvKiBTZWFyY2ggZm9yIGFscmVhZHkgZnJlZSBtZW1vcnk6Ci0gICAgKi8KLSAgIGlmIChhbGxvY19ibG9jayhpbnRlbCwgYnVmKSkKLSAgICAgIHJldHVybiBHTF9UUlVFOwotCi0gICAvKiBMb29rIGZvciBtZW1vcnkgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgZnJlZTogCi0gICAgKi8KLSAgIGlmIChjaGVja19mZW5jZWQoaW50ZWwpICYmCi0gICAgICAgYWxsb2NfYmxvY2soaW50ZWwsIGJ1ZikpCi0gICAgICByZXR1cm4gR0xfVFJVRTsKLQotICAgLyogTG9vayBmb3IgbWVtb3J5IGJsb2NrcyBub3QgdXNlZCBmb3IgPjEgZnJhbWU6Ci0gICAgKi8KLSAgIHdoaWxlIChldmljdF9scnUoaW50ZWwsIGludGVsLT5zZWNvbmRfbGFzdF9zd2FwX2ZlbmNlLCAmcG9vbCkpCi0gICAgICBpZiAoYWxsb2NfZnJvbV9wb29sKGludGVsLCBwb29sLCBidWYpKQotCSByZXR1cm4gR0xfVFJVRTsKLQotICAgLyogSWYgd2UncmUgbm90IHRocmFzaGluZywgYWxsb3cgbHJ1IGV2aWN0aW9uIHRvIGRpZyBkZWVwZXIgaW50bwotICAgICogcmVjZW50bHkgdXNlZCB0ZXh0dXJlcy4gIFdlJ2xsIHByb2JhYmx5IGJlIHRocmFzaGluZyBzb29uOgotICAgICovCi0gICBpZiAoIWludGVsLT50aHJhc2hpbmcpIHsKLSAgICAgIHdoaWxlIChldmljdF9scnUoaW50ZWwsIDAsICZwb29sKSkKLQkgaWYgKGFsbG9jX2Zyb21fcG9vbChpbnRlbCwgcG9vbCwgYnVmKSkKLQkgICAgcmV0dXJuIEdMX1RSVUU7Ci0gICB9Ci0KLSAgIC8qIEtlZXAgdGhyYXNoaW5nIGNvdW50ZXIgYWxpdmU/Ci0gICAgKi8KLSAgIGlmIChpbnRlbC0+dGhyYXNoaW5nKQotICAgICAgaW50ZWwtPnRocmFzaGluZyA9IDIwOwotCi0gICAvKiBXYWl0IG9uIGFueSBhbHJlYWR5IHBlbmRpbmcgZmVuY2VzIC0gaGVyZSB3ZSBhcmUgd2FpdGluZyBmb3IgYW55Ci0gICAgKiBmcmVlZCBtZW1vcnkgdGhhdCBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8gaGFyZHdhcmUgYW5kIGZlbmNlZCB0bwotICAgICogYmVjb21lIGF2YWlsYWJsZToKLSAgICAqLwotICAgd2hpbGUgKCFpc19lbXB0eV9saXN0KCZibS0+ZmVuY2VkKSkgewotICAgICAgR0x1aW50IGZlbmNlID0gYm0tPmZlbmNlZC5uZXh0LT5mZW5jZTsKLSAgICAgIGJtRmluaXNoRmVuY2UoaW50ZWwsIGZlbmNlKTsKLQotICAgICAgaWYgKGFsbG9jX2Jsb2NrKGludGVsLCBidWYpKQotCSByZXR1cm4gR0xfVFJVRTsKLSAgIH0KLQotCi0gICAvKiAKLSAgICAqLwotICAgaWYgKCFpc19lbXB0eV9saXN0KCZibS0+b25faGFyZHdhcmUpKSB7Ci0gICAgICBibVNldEZlbmNlKGludGVsKTsKLQotICAgICAgd2hpbGUgKCFpc19lbXB0eV9saXN0KCZibS0+ZmVuY2VkKSkgewotCSBHTHVpbnQgZmVuY2UgPSBibS0+ZmVuY2VkLm5leHQtPmZlbmNlOwotCSBibUZpbmlzaEZlbmNlKGludGVsLCBmZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghaW50ZWwtPnRocmFzaGluZykgewkgCi0JIERCRygidGhyYXNoaW5nXG4iKTsKLSAgICAgIH0KLSAgICAgIGludGVsLT50aHJhc2hpbmcgPSAyMDsgCi0KLSAgICAgIGlmIChhbGxvY19ibG9jayhpbnRlbCwgYnVmKSkKLQkgcmV0dXJuIEdMX1RSVUU7Ci0gICB9Ci0KLSAgIHdoaWxlIChldmljdF9tcnUoaW50ZWwsICZwb29sKSkKLSAgICAgIGlmIChhbGxvY19mcm9tX3Bvb2woaW50ZWwsIHBvb2wsIGJ1ZikpCi0JIHJldHVybiBHTF9UUlVFOwotCi0gICBEQkcoIiVzIDB4JXggYnl0ZXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zi0+c2l6ZSk7Ci0KLSAgIGFzc2VydChpc19lbXB0eV9saXN0KCZibS0+b25faGFyZHdhcmUpKTsKLSAgIGFzc2VydChpc19lbXB0eV9saXN0KCZibS0+ZmVuY2VkKSk7Ci0KLSAgIHJldHVybiBHTF9GQUxTRTsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdWJsaWMgZnVuY3Rpb25zCi0gKi8KLQotCi0vKiBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGFyZSBza2V3ZWQgaW4gdGhlIGZha2UgaW1wbGVtZW50YXRpb24uCi0gKiBUaGlzIGNhbGwgd291bGQgYmUgdG8gYXR0YWNoIHRvIGFuIGV4aXN0aW5nIG1hbmFnZXIsIHJhdGhlciB0aGFuIHRvCi0gKiBjcmVhdGUgYSBsb2NhbCBvbmUuCi0gKi8KLXN0cnVjdCBidWZtZ3IgKmJtX2Zha2VfaW50ZWxfQXR0YWNoKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgX2dsdGhyZWFkX0RFQ0xBUkVfU1RBVElDX01VVEVYKGluaXRNdXRleCk7ICAgCi0gICBzdGF0aWMgc3RydWN0IGJ1Zm1nciBibTsKLSAgIAotICAgLyogVGhpcyBmdW5jdGlvbiBuZWVkcyBhIG11dGV4IG9mIGl0cyBvd24uLi4KLSAgICAqLwotICAgX2dsdGhyZWFkX0xPQ0tfTVVURVgoaW5pdE11dGV4KTsKLQotICAgaWYgKG5yX2F0dGFjaCA9PSAwKSB7Ci0gICAgICBfZ2x0aHJlYWRfSU5JVF9NVVRFWChibS5tdXRleCk7Ci0KLSAgICAgIG1ha2VfZW1wdHlfbGlzdCgmYm0ucmVmZXJlbmNlZCk7Ci0gICAgICBtYWtlX2VtcHR5X2xpc3QoJmJtLmZlbmNlZCk7Ci0gICAgICBtYWtlX2VtcHR5X2xpc3QoJmJtLm9uX2hhcmR3YXJlKTsKLSAgICAgIAotICAgICAgLyogVGhlIGNvbnRleHQgaWQgb2YgYW55IG9mIHRoZSBzaGFyZSBncm91cC4gIFRoaXMgd29uJ3QgYmUgdXNlZAotICAgICAgICogaW4gY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBrZXJuZWwsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIGlmCi0gICAgICAgKiB0aGlzIGNvbnRleHQgaXMgZXZlbnR1YWxseSBkZWxldGVkLgotICAgICAgICovCi0gICAgICBibS5jdHhJZCA9IGludGVsLT5oSFdDb250ZXh0OwotICAgfQotCi0gICBucl9hdHRhY2grKzsKLQotICAgX2dsdGhyZWFkX1VOTE9DS19NVVRFWChpbml0TXV0ZXgpOwotCi0gICByZXR1cm4gJmJtOwotfQotCi0KLQotLyogVGhlIHZpcnR1YWwgcG9pbnRlciB3b3VsZCBnbyBhd2F5IGluIGEgdHJ1ZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotaW50IGJtSW5pdFBvb2woIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCXVuc2lnbmVkIGxvbmcgbG93X29mZnNldCwKLQkJdm9pZCAqbG93X3ZpcnR1YWwsCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJdW5zaWduZWQgZmxhZ3MpCi17Ci0gICBzdHJ1Y3QgYnVmbWdyICpibSA9IGludGVsLT5ibTsKLSAgIGludCByZXR2YWwgPSAwOwotCi0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIEdMdWludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYm0tPm5yX3Bvb2xzOyBpKyspIHsKLQkgaWYgKGJtLT5wb29sW2ldLmxvd19vZmZzZXQgPT0gbG93X29mZnNldCAmJgotCSAgICAgYm0tPnBvb2xbaV0uc2l6ZSA9PSBzaXplKSB7Ci0JICAgIHJldHZhbCA9IGk7Ci0JICAgIGdvdG8gb3V0OwotCSB9Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKGJtLT5ucl9wb29scyA+PSBCTV9QT09MX01BWCkKLQkgcmV0dmFsID0gLTE7Ci0gICAgICBlbHNlIHsKLQkgaSA9IGJtLT5ucl9wb29scysrOwotICAgCi0JIERCRygiYm1Jbml0UG9vbCAlZCBsb3dfb2Zmc2V0ICV4IHN6ICV4XG4iLAotCSAgICAgaSwgbG93X29mZnNldCwgc2l6ZSk7Ci0gICAKLQkgYm0tPnBvb2xbaV0ubG93X29mZnNldCA9IGxvd19vZmZzZXQ7Ci0JIGJtLT5wb29sW2ldLnNpemUgPSBzaXplOwotCSBibS0+cG9vbFtpXS5oZWFwID0gbW1Jbml0KCBsb3dfb2Zmc2V0LCBzaXplICk7Ci0JIGJtLT5wb29sW2ldLnZpcnR1YWwgPSBsb3dfdmlydHVhbCAtIGxvd19vZmZzZXQ7Ci0JIGJtLT5wb29sW2ldLmZsYWdzID0gZmxhZ3M7Ci0gICAKLQkgbWFrZV9lbXB0eV9saXN0KCZibS0+cG9vbFtpXS5scnUpOwotCSAKLQkgcmV0dmFsID0gaTsKLSAgICAgIH0KLSAgIH0KLSBvdXQ6Ci0gICBVTkxPQ0soYm0pOwotICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBidWZmZXIgKmRvX0dlbkJ1ZmZlcihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBhbGlnbikKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgc3RydWN0IGJ1ZmZlciAqYnVmID0gY2FsbG9jKHNpemVvZigqYnVmKSwgMSk7Ci0KLSAgIGJ1Zi0+aWQgPSArK2JtLT5idWZfbnI7Ci0gICBidWYtPm5hbWUgPSBuYW1lOwotICAgYnVmLT5hbGlnbm1lbnQgPSBhbGlnbjsJCi0gICBidWYtPmZsYWdzID0gQk1fTUVNX0FHUHxCTV9NRU1fVlJBTXxCTV9NRU1fTE9DQUw7Ci0KLSAgIHJldHVybiBidWY7Ci19Ci0KLQotdm9pZCAqYm1GaW5kVmlydHVhbCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCSAgICAgc2l6ZV90IHN6ICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgaW50IGk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBibS0+bnJfcG9vbHM7IGkrKykKLSAgICAgIGlmIChvZmZzZXQgPj0gYm0tPnBvb2xbaV0ubG93X29mZnNldCAmJgotCSAgb2Zmc2V0ICsgc3ogPD0gYm0tPnBvb2xbaV0ubG93X29mZnNldCArIGJtLT5wb29sW2ldLnNpemUpCi0JIHJldHVybiBibS0+cG9vbFtpXS52aXJ0dWFsICsgb2Zmc2V0OwotCi0gICByZXR1cm4gTlVMTDsKLX0KLSAKLQotdm9pZCBibUdlbkJ1ZmZlcnMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuLCAKLQkJICBzdHJ1Y3QgYnVmZmVyICoqYnVmZmVycywKLQkJICBpbnQgYWxpZ24gKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCSBidWZmZXJzW2ldID0gZG9fR2VuQnVmZmVyKGludGVsLCBuYW1lLCBhbGlnbik7Ci0gICB9Ci0gICBVTkxPQ0soYm0pOwotfQotCi0KLXZvaWQgYm1EZWxldGVCdWZmZXJzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgdW5zaWduZWQgbiwgc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlcnMpCi17Ci0gICBzdHJ1Y3QgYnVmbWdyICpibSA9IGludGVsLT5ibTsKLQotICAgTE9DSyhibSk7Ci0gICB7Ci0gICAgICB1bnNpZ25lZCBpOwotICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JIHN0cnVjdCBidWZmZXIgKmJ1ZiA9IGJ1ZmZlcnNbaV07Ci0KLQkgaWYgKGJ1ZiAmJiBidWYtPmJsb2NrKQotCSAgICBmcmVlX2Jsb2NrKGludGVsLCBidWYtPmJsb2NrKTsKLQotCSBpZiAoYnVmKSAKLQkgICAgZnJlZShidWYpOwkgCi0gICAgICB9Ci0gICB9Ci0gICBVTkxPQ0soYm0pOwotfQotCi0KLQotCi0vKiBIb29rIHRvIGluZm9ybSBmYWtlZCBidWZmZXIgbWFuYWdlciBhYm91dCBmaXhlZC1wb3NpdGlvbgotICogZnJvbnQsZGVwdGgsYmFjayBidWZmZXJzLiAgVGhlc2UgbWF5IG1vdmUgdG8gYSBmdWxseSBtZW1vcnktbWFuYWdlZAotICogc2NoZW1lLCBvciB0aGV5IG1heSBjb250aW51ZSB0byBiZSBtYW5hZ2VkIGFzIGlzLiAgSXQgd2lsbCBwcm9iYWJseQotICogYmUgdXNlZnVsIHRvIHBhc3MgYSBmaXhlZCBvZmZzZXQgaGVyZSBvbmUgZGF5LgotICovCi1zdHJ1Y3QgYnVmZmVyICpibUdlbkJ1ZmZlclN0YXRpYyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJIHVuc2lnbmVkIHBvb2wgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBzdHJ1Y3QgYnVmZmVyICpidWY7Ci0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIGFzc2VydChibS0+cG9vbFtwb29sXS5mbGFncyAmIEJNX05PX0VWSUNUKTsKLSAgICAgIGFzc2VydChibS0+cG9vbFtwb29sXS5mbGFncyAmIEJNX05PX01PVkUpOwotCi0gICAgICBpZiAoYm0tPnBvb2xbcG9vbF0uc3RhdGljX2J1ZmZlcikKLQkgYnVmID0gYm0tPnBvb2xbcG9vbF0uc3RhdGljX2J1ZmZlcjsKLSAgICAgIGVsc2UgewotCSBidWYgPSBkb19HZW5CdWZmZXIoaW50ZWwsICJzdGF0aWMiLCAxMik7Ci0gICAKLQkgYm0tPnBvb2xbcG9vbF0uc3RhdGljX2J1ZmZlciA9IGJ1ZjsKLQkgYXNzZXJ0KCFidWYtPmJsb2NrKTsKLQotCSBidWYtPnNpemUgPSBibS0+cG9vbFtwb29sXS5zaXplOwotCSBidWYtPmZsYWdzID0gYm0tPnBvb2xbcG9vbF0uZmxhZ3M7Ci0JIGJ1Zi0+YWxpZ25tZW50ID0gMTI7Ci0JIAotCSBpZiAoIWFsbG9jX2Zyb21fcG9vbChpbnRlbCwgcG9vbCwgYnVmKSkKLQkgICAgYXNzZXJ0KDApOwotICAgICAgfQotICAgfQotICAgVU5MT0NLKGJtKTsKLSAgIHJldHVybiBidWY7Ci19Ci0KLQotc3RhdGljIHZvaWQgd2FpdF9xdWllc2NlbnQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgc3RydWN0IGJsb2NrICpibG9jaykKLXsKLSAgIGlmIChibG9jay0+b25faGFyZHdhcmUpIHsKLSAgICAgIGFzc2VydChpbnRlbC0+Ym0tPm5lZWRfZmVuY2UpOwotICAgICAgYm1TZXRGZW5jZShpbnRlbCk7Ci0gICAgICBhc3NlcnQoIWJsb2NrLT5vbl9oYXJkd2FyZSk7Ci0gICB9Ci0KLQotICAgaWYgKGJsb2NrLT5mZW5jZWQpIHsKLSAgICAgIGJtRmluaXNoRmVuY2UoaW50ZWwsIGJsb2NrLT5mZW5jZSk7Ci0gICB9Ci0KLSAgIGFzc2VydCghYmxvY2stPm9uX2hhcmR3YXJlKTsKLSAgIGFzc2VydCghYmxvY2stPmZlbmNlZCk7Ci19Ci0KLQotCi0vKiBJZiBidWZmZXIgc2l6ZSBjaGFuZ2VzLCBmcmVlIGFuZCByZWFsbG9jYXRlLiAgT3RoZXJ3aXNlIHVwZGF0ZSBpbgotICogcGxhY2UuCi0gKi8KLWludCBibUJ1ZmZlckRhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJIHN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCSB1bnNpZ25lZCBzaXplLCAKLQkJIGNvbnN0IHZvaWQgKmRhdGEsIAotCQkgdW5zaWduZWQgZmxhZ3MgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBpbnQgcmV0dmFsID0gMDsKLQotICAgTE9DSyhibSk7Ci0gICB7Ci0gICAgICBEQkcoImJtQnVmZmVyRGF0YSAlZCBzeiAweCV4IGRhdGE6ICVwXG4iLCBidWYtPmlkLCBzaXplLCBkYXRhKTsKLQotICAgICAgYXNzZXJ0KCFidWYtPm1hcHBlZCk7Ci0KLSAgICAgIGlmIChidWYtPmJsb2NrKSB7Ci0JIHN0cnVjdCBibG9jayAqYmxvY2sgPSBidWYtPmJsb2NrOwotCi0JIC8qIE9wdGltaXN0aWMgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiByZXVzZSB0aGUgYmxvY2sgLS0gbm90Ci0JICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzczoKLQkgICovCi0JIGlmIChibG9jay0+ZmVuY2VkKQotCSAgICBjaGVja19mZW5jZWQoaW50ZWwpOwotCi0JIGlmIChibG9jay0+b25faGFyZHdhcmUgfHwKLQkgICAgIGJsb2NrLT5mZW5jZWQgfHwKLQkgICAgIChidWYtPnNpemUgJiYgYnVmLT5zaXplICE9IHNpemUpIHx8IAotCSAgICAgKGRhdGEgPT0gTlVMTCkpIHsKLQotCSAgICBhc3NlcnQoIWJsb2NrLT5yZWZlcmVuY2VkKTsKLQotCSAgICBmcmVlX2Jsb2NrKGludGVsLCBibG9jayk7Ci0JICAgIGJ1Zi0+YmxvY2sgPSBOVUxMOwotCSAgICBidWYtPmRpcnR5ID0gMTsKLQkgfQotICAgICAgfQotCi0gICAgICBidWYtPnNpemUgPSBzaXplOwotICAgICAgaWYgKGJ1Zi0+YmxvY2spIHsKLQkgYXNzZXJ0IChidWYtPmJsb2NrLT5tZW0tPnNpemUgPj0gc2l6ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChidWYtPmZsYWdzICYgKEJNX05PX0JBQ0tJTkdfU1RPUkV8Qk1fTk9fRVZJQ1QpKSB7Ci0KLQkgYXNzZXJ0KGludGVsLT5sb2NrZWQgfHwgZGF0YSA9PSBOVUxMKTsKLQotCSBpZiAoZGF0YSAhPSBOVUxMKSB7Ci0JICAgIGlmICghYnVmLT5ibG9jayAmJiAhZXZpY3RfYW5kX2FsbG9jX2Jsb2NrKGludGVsLCBidWYpKSB7Ci0JICAgICAgIGJtLT5mYWlsID0gMTsKLQkgICAgICAgcmV0dmFsID0gLTE7Ci0JICAgICAgIGdvdG8gb3V0OwotCSAgICB9Ci0KLQkgICAgd2FpdF9xdWllc2NlbnQoaW50ZWwsIGJ1Zi0+YmxvY2spOwotCi0JICAgIERCRygiYm1CdWZmZXJEYXRhICVkIG9mZnNldCAweCV4IHN6IDB4JXhcbiIsIAotCQlidWYtPmlkLCBidWYtPmJsb2NrLT5tZW0tPm9mcywgc2l6ZSk7Ci0KLQkgICAgYXNzZXJ0KGJ1Zi0+YmxvY2stPnZpcnR1YWwgPT0gYnVmLT5ibG9jay0+cG9vbC0+dmlydHVhbCArIGJ1Zi0+YmxvY2stPm1lbS0+b2ZzKTsKLQotCSAgICBkb19tZW1jcHkoYnVmLT5ibG9jay0+dmlydHVhbCwgZGF0YSwgc2l6ZSk7Ci0JIH0KLQkgYnVmLT5kaXJ0eSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgICAgICAgREJHKCIlcyAtIHNldCBidWYgJWQgZGlydHlcbiIsIF9fRlVOQ1RJT05fXywgYnVmLT5pZCk7Ci0JIHNldF9kaXJ0eShpbnRlbCwgYnVmKTsKLQkgZnJlZV9iYWNraW5nX3N0b3JlKGludGVsLCBidWYpOwotICAgCi0JIGlmIChkYXRhICE9IE5VTEwpIHsgICAgICAKLQkgICAgYWxsb2NfYmFja2luZ19zdG9yZShpbnRlbCwgYnVmKTsKLQkgICAgZG9fbWVtY3B5KGJ1Zi0+YmFja2luZ19zdG9yZSwgZGF0YSwgc2l6ZSk7Ci0JIH0KLSAgICAgIH0KLSAgIH0KLSBvdXQ6Ci0gICBVTkxPQ0soYm0pOwotICAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0vKiBVcGRhdGUgdGhlIGJ1ZmZlciBpbiBwbGFjZSwgaW4gd2hhdGV2ZXIgc3BhY2UgaXQgaXMgY3VycmVudGx5IHJlc2lkZW50OgotICovCi1pbnQgYm1CdWZmZXJTdWJEYXRhKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCSAgICAgc3RydWN0IGJ1ZmZlciAqYnVmLCAKLQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIAotCQkgICAgIHVuc2lnbmVkIHNpemUsIAotCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0gICBpbnQgcmV0dmFsID0gMDsKLQotICAgaWYgKHNpemUgPT0gMCkgCi0gICAgICByZXR1cm4gMDsKLQotICAgTE9DSyhibSk7IAotICAgewotICAgICAgREJHKCJibUJ1ZmZlclN1YmRhdGEgJWQgb2Zmc2V0IDB4JXggc3ogMHgleFxuIiwgYnVmLT5pZCwgb2Zmc2V0LCBzaXplKTsKLSAgICAgIAotICAgICAgYXNzZXJ0KG9mZnNldCtzaXplIDw9IGJ1Zi0+c2l6ZSk7Ci0KLSAgICAgIGlmIChidWYtPmZsYWdzICYgKEJNX05PX0VWSUNUfEJNX05PX0JBQ0tJTkdfU1RPUkUpKSB7Ci0KLQkgYXNzZXJ0KGludGVsLT5sb2NrZWQpOwotCi0JIGlmICghYnVmLT5ibG9jayAmJiAhZXZpY3RfYW5kX2FsbG9jX2Jsb2NrKGludGVsLCBidWYpKSB7Ci0JICAgIGJtLT5mYWlsID0gMTsKLQkgICAgcmV0dmFsID0gLTE7Ci0JICAgIGdvdG8gb3V0OwotCSB9Ci0JIAotCSBpZiAoIShidWYtPmZsYWdzICYgQk1fTk9fRkVOQ0VfU1VCREFUQSkpCi0JICAgIHdhaXRfcXVpZXNjZW50KGludGVsLCBidWYtPmJsb2NrKTsKLQotCSBidWYtPmRpcnR5ID0gMDsKLQotCSBkb19tZW1jcHkoYnVmLT5ibG9jay0+dmlydHVhbCArIG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgREJHKCIlcyAtIHNldCBidWYgJWQgZGlydHlcbiIsIF9fRlVOQ1RJT05fXywgYnVmLT5pZCk7Ci0JIHNldF9kaXJ0eShpbnRlbCwgYnVmKTsKLQotCSBpZiAoYnVmLT5iYWNraW5nX3N0b3JlID09IE5VTEwpCi0JICAgIGFsbG9jX2JhY2tpbmdfc3RvcmUoaW50ZWwsIGJ1Zik7Ci0KLQkgZG9fbWVtY3B5KGJ1Zi0+YmFja2luZ19zdG9yZSArIG9mZnNldCwgZGF0YSwgc2l6ZSk7IAotICAgICAgfQotICAgfQotIG91dDoKLSAgIFVOTE9DSyhibSk7Ci0gICByZXR1cm4gcmV0dmFsOwotfQotCi0KLQotaW50IGJtQnVmZmVyRGF0YUFVQihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkgICAgIHN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCSAgICAgdW5zaWduZWQgc2l6ZSwgCi0JCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgCi0JCSAgICAgdW5zaWduZWQgZmxhZ3MsCi0JCSAgICAgdW5zaWduZWQgYXVidHlwZSwKLQkJICAgICB1bnNpZ25lZCBhdWJzdWJ0eXBlICkKLXsKLSAgIGludCByZXR2YWwgPSBibUJ1ZmZlckRhdGEoaW50ZWwsIGJ1Ziwgc2l6ZSwgZGF0YSwgZmxhZ3MpOwotICAgCi0KLSAgIC8qIFRoaXMgb25seSB3b3JrcyBiZWNhdXNlIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgYnVmZmVyIG1hbmFnZXIgd2UKLSAgICAqIGFsbG9jYXRlIGFsbCBidWZmZXJzIHN0YXRpY2FsbHkgaW4gYWdwIHNwYWNlIGFuZCBzbyBjYW4gZW1pdCB0aGUKLSAgICAqIHVwbG9hZHMgdG8gdGhlIGF1YiBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgb2Zmc2V0cyBhcyB0aGV5IGhhcHBlbi4KLSAgICAqLwotICAgaWYgKHJldHZhbCA9PSAwICYmIGRhdGEgJiYgaW50ZWwtPmF1Yl9maWxlKSB7Ci0KLSAgICAgIGlmIChidWYtPmJsb2NrICYmICFidWYtPmRpcnR5KSB7Ci0JIGludGVsLT52dGJsLmF1Yl9ndHRfZGF0YShpbnRlbCwKLQkJCQkgICAgICBidWYtPmJsb2NrLT5tZW0tPm9mcywKLQkJCQkgICAgICBidWYtPmJsb2NrLT52aXJ0dWFsLAotCQkJCSAgICAgIHNpemUsCi0JCQkJICAgICAgYXVidHlwZSwKLQkJCQkgICAgICBhdWJzdWJ0eXBlKTsKLQkgYnVmLT5hdWJfZGlydHkgPSAwOwotICAgICAgfQotICAgfQotICAgCi0gICByZXR1cm4gcmV0dmFsOwotfQotCQkgICAgICAgCi0KLWludCBibUJ1ZmZlclN1YkRhdGFBVUIoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCXN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCQl1bnNpZ25lZCBvZmZzZXQsIAotCQkJdW5zaWduZWQgc2l6ZSwgCi0JCQljb25zdCB2b2lkICpkYXRhLAotCQkJdW5zaWduZWQgYXVidHlwZSwKLQkJCXVuc2lnbmVkIGF1YnN1YnR5cGUgKQotewotICAgaW50IHJldHZhbCA9IGJtQnVmZmVyU3ViRGF0YShpbnRlbCwgYnVmLCBvZmZzZXQsIHNpemUsIGRhdGEpOwotICAgCi0KLSAgIC8qIFRoaXMgb25seSB3b3JrcyBiZWNhdXNlIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgYnVmZmVyIG1hbmFnZXIgd2UKLSAgICAqIGFsbG9jYXRlIGFsbCBidWZmZXJzIHN0YXRpY2FsbHkgaW4gYWdwIHNwYWNlIGFuZCBzbyBjYW4gZW1pdCB0aGUKLSAgICAqIHVwbG9hZHMgdG8gdGhlIGF1YiBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgb2Zmc2V0cyBhcyB0aGV5IGhhcHBlbi4KLSAgICAqLwotICAgaWYgKGludGVsLT5hdWJfZmlsZSkgewotICAgICAgaWYgKHJldHZhbCA9PSAwICYmIGJ1Zi0+YmxvY2sgJiYgIWJ1Zi0+ZGlydHkpCi0JIGludGVsLT52dGJsLmF1Yl9ndHRfZGF0YShpbnRlbCwKLQkJCQkgICAgICBidWYtPmJsb2NrLT5tZW0tPm9mcyArIG9mZnNldCwKLQkJCQkgICAgICAoKGNvbnN0IGNoYXIgKilidWYtPmJsb2NrLT52aXJ0dWFsKSArIG9mZnNldCwKLQkJCQkgICAgICBzaXplLAotCQkJCSAgICAgIGF1YnR5cGUsCi0JCQkJICAgICAgYXVic3VidHlwZSk7Ci0gICB9Ci0KLSAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgYm1Vbm1hcEJ1ZmZlckFVQiggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJICAgICAgIHN0cnVjdCBidWZmZXIgKmJ1ZiwKLQkJICAgICAgIHVuc2lnbmVkIGF1YnR5cGUsCi0JCSAgICAgICB1bnNpZ25lZCBhdWJzdWJ0eXBlICkKLXsKLSAgIGJtVW5tYXBCdWZmZXIoaW50ZWwsIGJ1Zik7Ci0KLSAgIGlmIChpbnRlbC0+YXViX2ZpbGUpIHsKLSAgICAgIC8qIEhhY2sgLSBleGNsdWRlIHRoZSBmcmFtZWJ1ZmZlciBtYXBwaW5ncy4gIElmIHlvdSByZW1vdmVkCi0gICAgICAgKiB0aGlzLCB5b3UnZCBnZXQgdmVyeSBiaWcgYXViZmlsZXMsIGJ1dCB5b3UgKndvdWxkKiBiZSBhYmxlIHRvCi0gICAgICAgKiBzZWUgZmFsbGJhY2sgcmVuZGVyaW5nLgotICAgICAgICovCi0gICAgICBpZiAoYnVmLT5ibG9jayAgJiYgIWJ1Zi0+ZGlydHkgJiYgYnVmLT5ibG9jay0+cG9vbCA9PSAmaW50ZWwtPmJtLT5wb29sWzBdKSB7Ci0JIGJ1Zi0+YXViX2RpcnR5ID0gMTsKLSAgICAgIH0KLSAgIH0KLX0KLQotdW5zaWduZWQgYm1CdWZmZXJPZmZzZXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCXN0cnVjdCBidWZmZXIgKmJ1ZikKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgdW5zaWduZWQgcmV0dmFsID0gMDsKLQotICAgTE9DSyhibSk7Ci0gICB7Ci0gICAgICBhc3NlcnQoaW50ZWwtPmxvY2tlZCk7Ci0KLSAgICAgIGlmICghYnVmLT5ibG9jayAmJgotCSAgIWV2aWN0X2FuZF9hbGxvY19ibG9jayhpbnRlbCwgYnVmKSkgewotCSBibS0+ZmFpbCA9IDE7Ci0JIHJldHZhbCA9IH4wOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIGFzc2VydChidWYtPmJsb2NrKTsKLQkgYXNzZXJ0KGJ1Zi0+YmxvY2stPmJ1ZiA9PSBidWYpOwotCi0JIERCRygiQWRkIGJ1ZiAlZCAoYmxvY2sgJXAsIGRpcnR5ICVkKSB0byByZWZlcmVuY2VkIGxpc3RcbiIsIGJ1Zi0+aWQsIGJ1Zi0+YmxvY2ssCi0JICAgICBidWYtPmRpcnR5KTsKLQotCSBtb3ZlX3RvX3RhaWwoJmJtLT5yZWZlcmVuY2VkLCBidWYtPmJsb2NrKTsKLQkgYnVmLT5ibG9jay0+cmVmZXJlbmNlZCA9IDE7Ci0KLQkgcmV0dmFsID0gYnVmLT5ibG9jay0+bWVtLT5vZnM7Ci0gICAgICB9Ci0gICB9Ci0gICBVTkxPQ0soYm0pOwotCi0gICByZXR1cm4gcmV0dmFsOwotfQotCi0KLQotLyogRXh0cmFjdCBkYXRhIGZyb20gdGhlIGJ1ZmZlcjoKLSAqLwotdm9pZCBibUJ1ZmZlckdldFN1YkRhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCXN0cnVjdCBidWZmZXIgKmJ1ZiwgCi0JCQl1bnNpZ25lZCBvZmZzZXQsIAotCQkJdW5zaWduZWQgc2l6ZSwgCi0JCQl2b2lkICpkYXRhICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotCi0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIERCRygiYm1CdWZmZXJTdWJkYXRhICVkIG9mZnNldCAweCV4IHN6IDB4JXhcbiIsIGJ1Zi0+aWQsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICAgIGlmIChidWYtPmZsYWdzICYgKEJNX05PX0VWSUNUfEJNX05PX0JBQ0tJTkdfU1RPUkUpKSB7Ci0JIGlmIChidWYtPmJsb2NrICYmIHNpemUpIHsKLQkgICAgd2FpdF9xdWllc2NlbnQoaW50ZWwsIGJ1Zi0+YmxvY2spOwotCSAgICBkb19tZW1jcHkoZGF0YSwgYnVmLT5ibG9jay0+dmlydHVhbCArIG9mZnNldCwgc2l6ZSk7IAotCSB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgaWYgKGJ1Zi0+YmFja2luZ19zdG9yZSAmJiBzaXplKSB7Ci0JICAgIGRvX21lbWNweShkYXRhLCBidWYtPmJhY2tpbmdfc3RvcmUgKyBvZmZzZXQsIHNpemUpOyAKLQkgfQotICAgICAgfQotICAgfQotICAgVU5MT0NLKGJtKTsKLX0KLQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHdoYXRldmVyIHNwYWNlIHRoZSBidWZmZXIgaXMgY3VycmVudGx5IHJlc2lkZW50IGluOgotICovCi12b2lkICpibU1hcEJ1ZmZlciggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkgICBzdHJ1Y3QgYnVmZmVyICpidWYsIAotCQkgICB1bnNpZ25lZCBmbGFncyApCi17Ci0gICBzdHJ1Y3QgYnVmbWdyICpibSA9IGludGVsLT5ibTsKLSAgIHZvaWQgKnJldHZhbCA9IE5VTEw7Ci0KLSAgIExPQ0soYm0pOwotICAgewotICAgICAgREJHKCJibU1hcEJ1ZmZlciAlZFxuIiwgYnVmLT5pZCk7Ci0KLSAgICAgIGlmIChidWYtPm1hcHBlZCkgewotCSBfbWVzYV9wcmludGYoIiVzOiBhbHJlYWR5IG1hcHBlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkgcmV0dmFsID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGJ1Zi0+ZmxhZ3MgJiAoQk1fTk9fQkFDS0lOR19TVE9SRXxCTV9OT19FVklDVCkpIHsKLQotCSBhc3NlcnQoaW50ZWwtPmxvY2tlZCk7Ci0KLQkgaWYgKCFidWYtPmJsb2NrICYmICFldmljdF9hbmRfYWxsb2NfYmxvY2soaW50ZWwsIGJ1ZikpIHsKLQkgICAgREJHKCIlczogYWxsb2MgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCSAgICBibS0+ZmFpbCA9IDE7Ci0JICAgIHJldHZhbCA9IE5VTEw7Ci0JIH0KLQkgZWxzZSB7Ci0JICAgIGFzc2VydChidWYtPmJsb2NrKTsKLQkgICAgYnVmLT5kaXJ0eSA9IDA7Ci0KLQkgICAgaWYgKCEoYnVmLT5mbGFncyAmIEJNX05PX0ZFTkNFX1NVQkRBVEEpKSAKLQkgICAgICAgd2FpdF9xdWllc2NlbnQoaW50ZWwsIGJ1Zi0+YmxvY2spOwotCi0JICAgIGJ1Zi0+bWFwcGVkID0gMTsKLQkgICAgcmV0dmFsID0gYnVmLT5ibG9jay0+dmlydHVhbDsKLQkgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0JIERCRygiJXMgLSBzZXQgYnVmICVkIGRpcnR5XG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zi0+aWQpOwotCSBzZXRfZGlydHkoaW50ZWwsIGJ1Zik7Ci0KLQkgaWYgKGJ1Zi0+YmFja2luZ19zdG9yZSA9PSAwKQotCSAgICBhbGxvY19iYWNraW5nX3N0b3JlKGludGVsLCBidWYpOwotCi0JIGJ1Zi0+bWFwcGVkID0gMTsKLQkgcmV0dmFsID0gYnVmLT5iYWNraW5nX3N0b3JlOwotICAgICAgfQotICAgfQotICAgVU5MT0NLKGJtKTsKLSAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgYm1Vbm1hcEJ1ZmZlciggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBzdHJ1Y3QgYnVmZmVyICpidWYgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0KLSAgIExPQ0soYm0pOwotICAgewotICAgICAgREJHKCJibVVubWFwQnVmZmVyICVkXG4iLCBidWYtPmlkKTsKLSAgICAgIGJ1Zi0+bWFwcGVkID0gMDsKLSAgIH0KLSAgIFVOTE9DSyhibSk7Ci19Ci0KLQotCi0KLS8qIFRoaXMgaXMgdGhlIGJpZyBoYWNrIHRoYXQgdHVybnMgb24gQk1fTk9fQkFDS0lOR19TVE9SRS4gIEJhc2ljYWxseQotICogc2F5cyB0aGF0IGFuIGV4dGVybmFsIHBhcnR5IHdpbGwgbWFpbnRhaW4gdGhlIGJhY2tpbmcgc3RvcmUsIGVnCi0gKiBNZXNhJ3MgbG9jYWwgY29weSBvZiB0ZXh0dXJlIGRhdGEuCi0gKi8KLXZvaWQgYm1CdWZmZXJTZXRJbnZhbGlkYXRlQ0Ioc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyICpidWYsCi0JCQkgICAgIHZvaWQgKCppbnZhbGlkYXRlX2NiKSggc3RydWN0IGludGVsX2NvbnRleHQgKiwgdm9pZCAqcHRyICksCi0JCQkgICAgIHZvaWQgKnB0ciwKLQkJCSAgICAgR0xib29sZWFuIGRvbnRfZmVuY2Vfc3ViZGF0YSkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotCi0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIGlmIChidWYtPmJhY2tpbmdfc3RvcmUpCi0JIGZyZWVfYmFja2luZ19zdG9yZShpbnRlbCwgYnVmKTsKLQotICAgICAgYnVmLT5mbGFncyB8PSBCTV9OT19CQUNLSU5HX1NUT1JFOwotICAgICAgCi0gICAgICBpZiAoZG9udF9mZW5jZV9zdWJkYXRhKQotCSBidWYtPmZsYWdzIHw9IEJNX05PX0ZFTkNFX1NVQkRBVEE7Ci0KLSAgICAgIERCRygiYm1CdWZmZXJTZXRJbnZhbGlkYXRlQ0Igc2V0IGJ1ZiAlZCBkaXJ0eVxuIiwgYnVmLT5pZCk7Ci0gICAgICBidWYtPmRpcnR5ID0gMTsKLSAgICAgIGJ1Zi0+aW52YWxpZGF0ZV9jYiA9IGludmFsaWRhdGVfY2I7Ci0gICAgICBidWYtPmludmFsaWRhdGVfcHRyID0gcHRyOwotCi0gICAgICAvKiBOb3RlIHRoYXQgaXQgaXMgaW52YWxpZCByaWdodCBmcm9tIHRoZSBzdGFydC4gIEFsc28gbm90ZQotICAgICAgICogaW52YWxpZGF0ZV9jYiBpcyBjYWxsZWQgd2l0aCB0aGUgYnVmbWdyIGxvY2tlZCwgc28gY2Fubm90Ci0gICAgICAgKiBpdHNlbGYgbWFrZSBidWZtZ3IgY2FsbHMuCi0gICAgICAgKi8KLSAgICAgIGludmFsaWRhdGVfY2IoIGludGVsLCBwdHIgKTsKLSAgIH0KLSAgIFVOTE9DSyhibSk7Ci19Ci0KLQotCi0KLQotCi0KLS8qIFRoaXMgaXMgb25seSBwcm90ZWN0ZWQgYWdhaW5zdCB0aHJlYWQgaW50ZXJhY3Rpb25zIGJ5IHRoZSBEUkkgbG9jawotICogYW5kIHRoZSBwb2xpY3kgb2YgZW5zdXJpbmcgdGhhdCBhbGwgZG1hIGlzIGZsdXNoZWQgcHJpb3IgdG8KLSAqIHJlbGVhc2luZyB0aGF0IGxvY2suICBPdGhlcndpc2UgeW91IG1pZ2h0IGhhdmUgdHdvIHRocmVhZHMgYnVpbGRpbmcKLSAqIHVwIGEgbGlzdCBvZiBidWZmZXJzIHRvIHZhbGlkYXRlIGF0IG9uY2UuCi0gKi8KLWludCBibVZhbGlkYXRlQnVmZmVycyggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgaW50IHJldHZhbCA9IDA7Ci0KLSAgIExPQ0soYm0pOwotICAgewotICAgICAgREJHKCIlcyBmYWlsICVkXG4iLCBfX0ZVTkNUSU9OX18sIGJtLT5mYWlsKTsKLSAgICAgIGFzc2VydChpbnRlbC0+bG9ja2VkKTsKLQotICAgICAgaWYgKCFibS0+ZmFpbCkgewotCSBzdHJ1Y3QgYmxvY2sgKmJsb2NrLCAqdG1wOwotCi0JIGZvcmVhY2hfcyhibG9jaywgdG1wLCAmYm0tPnJlZmVyZW5jZWQpIHsKLQkgICAgc3RydWN0IGJ1ZmZlciAqYnVmID0gYmxvY2stPmJ1ZjsKLQotCSAgICBEQkcoIlZhbGlkYXRlIGJ1ZiAlZCAvIGJsb2NrICVwIC8gZGlydHkgJWRcbiIsIGJ1Zi0+aWQsIGJsb2NrLCBidWYtPmRpcnR5KTsKLQotCSAgICAvKiBVcGxvYWQgdGhlIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3Nhcnk6Ci0JICAgICAqLwotCSAgICBpZiAoYnVmLT5kaXJ0eSkgewotCSAgICAgICBEQkcoIlVwbG9hZCBkaXJ0eSBidWYgJWQgKCVzKSBzeiAlZCBvZmZzZXQgMHgleFxuIiwgYnVmLT5pZCwgCi0JCSAgIGJ1Zi0+bmFtZSwgYnVmLT5zaXplLCBibG9jay0+bWVtLT5vZnMpOwotCi0JICAgICAgIGFzc2VydCghKGJ1Zi0+ZmxhZ3MgJiAoQk1fTk9fQkFDS0lOR19TVE9SRXxCTV9OT19FVklDVCkpKTsKLQotCSAgICAgICB3YWl0X3F1aWVzY2VudChpbnRlbCwgYnVmLT5ibG9jayk7Ci0KLQkgICAgICAgZG9fbWVtY3B5KGJ1Zi0+YmxvY2stPnZpcnR1YWwsCi0JCQkgYnVmLT5iYWNraW5nX3N0b3JlLCAKLQkJCSBidWYtPnNpemUpOwotCi0JICAgICAgIGlmIChpbnRlbC0+YXViX2ZpbGUpIHsKLQkJICBpbnRlbC0+dnRibC5hdWJfZ3R0X2RhdGEoaW50ZWwsCi0JCQkJCSAgICAgICBidWYtPmJsb2NrLT5tZW0tPm9mcywKLQkJCQkJICAgICAgIGJ1Zi0+YmFja2luZ19zdG9yZSwKLQkJCQkJICAgICAgIGJ1Zi0+c2l6ZSwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAwKTsKLQkgICAgICAgfQotCi0JICAgICAgIGJ1Zi0+ZGlydHkgPSAwOwotCSAgICAgICBidWYtPmF1Yl9kaXJ0eSA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoYnVmLT5hdWJfZGlydHkpIHsKLQkgICAgICAgaW50ZWwtPnZ0YmwuYXViX2d0dF9kYXRhKGludGVsLAotCQkJCQkgICAgYnVmLT5ibG9jay0+bWVtLT5vZnMsCi0JCQkJCSAgICBidWYtPmJsb2NrLT52aXJ0dWFsLAotCQkJCQkgICAgYnVmLT5zaXplLAotCQkJCQkgICAgMCwKLQkJCQkJICAgIDApOwotCSAgICAgICBidWYtPmF1Yl9kaXJ0eSA9IDA7Ci0JICAgIH0KLQotCSAgICBibG9jay0+cmVmZXJlbmNlZCA9IDA7Ci0JICAgIGJsb2NrLT5vbl9oYXJkd2FyZSA9IDE7Ci0JICAgIG1vdmVfdG9fdGFpbCgmYm0tPm9uX2hhcmR3YXJlLCBibG9jayk7Ci0JIH0KLQotCSBibS0+bmVlZF9mZW5jZSA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIHJldHZhbCA9IGJtLT5mYWlsID8gLTEgOiAwOwotICAgfQotICAgVU5MT0NLKGJtKTsKLQotCi0gICBpZiAocmV0dmFsICE9IDApCi0gICAgICBEQkcoIiVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQotICAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0KLQotdm9pZCBibVJlbGVhc2VCdWZmZXJzKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgc3RydWN0IGJ1Zm1nciAqYm0gPSBpbnRlbC0+Ym07Ci0KLSAgIExPQ0soYm0pOwotICAgewotICAgICAgc3RydWN0IGJsb2NrICpibG9jaywgKnRtcDsKLQotICAgICAgZm9yZWFjaF9zIChibG9jaywgdG1wLCAmYm0tPnJlZmVyZW5jZWQpIHsKLQotCSBEQkcoInJlbW92ZSBibG9jayAlcCBmcm9tIHJlZmVyZW5jZWQgbGlzdFxuIiwgYmxvY2spOwotCi0JIGlmIChibG9jay0+b25faGFyZHdhcmUpIHsKLQkgICAgLyogUmV0dXJuIHRvIHRoZSBvbi1oYXJkd2FyZSBsaXN0LgotCSAgICAgKi8KLQkgICAgbW92ZV90b190YWlsKCZibS0+b25faGFyZHdhcmUsIGJsb2NrKTsJICAgIAotCSB9Ci0JIGVsc2UgaWYgKGJsb2NrLT5mZW5jZWQpIHsKLQkgICAgc3RydWN0IGJsb2NrICpzOwotCi0JICAgIC8qIEhtbSAtIGhhdmUgdG8gc2NhbiB0aGUgZmVuY2VkIGxpc3QgdG8gaW5zZXJ0IHRoZQotCSAgICAgKiBidWZmZXJzIGluIG9yZGVyLiAgVGhpcyBpcyBPKG5tKSwgYnV0IHJhcmUgYW5kIHRoZQotCSAgICAgKiBudW1iZXJzIGFyZSBsb3cuCi0JICAgICAqLwotCSAgICBmb3JlYWNoIChzLCAmYm0tPmZlbmNlZCkgewotCSAgICAgICBpZiAoRkVOQ0VfTFRFKGJsb2NrLT5mZW5jZSwgcy0+ZmVuY2UpKQotCQkgIGJyZWFrOwotCSAgICB9Ci0JICAgIAotCSAgICBtb3ZlX3RvX3RhaWwocywgYmxvY2spOwotCSB9Ci0JIGVsc2UgewkJCQotCSAgICAvKiBSZXR1cm4gdG8gdGhlIGxydSBsaXN0OgotCSAgICAgKi8KLQkgICAgbW92ZV90b190YWlsKCZibG9jay0+cG9vbC0+bHJ1LCBibG9jayk7Ci0JIH0KLQotCSBibG9jay0+cmVmZXJlbmNlZCA9IDA7Ci0gICAgICB9Ci0gICB9Ci0gICBVTkxPQ0soYm0pOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGJ5IHRoZSBidWZmZXIgbWFuYWdlciwgbm90IHJlYWxseSBzdXJlCi0gKiBpZiB3ZSBuZWVkIHRvIGJlIGV4cG9zaW5nIGl0IGluIHRoaXMgd2F5LCBwcm9iYWJseSBsaWJkcm0gd2lsbAotICogb2ZmZXIgZXF1aXZhbGVudCBjYWxscy4KLSAqCi0gKiBGb3Igbm93IHRoZXkgY2FuIHN0YXksIGJ1dCB3aWxsIGxpa2VseSBjaGFuZ2UvbW92ZSBiZWZvcmUgZmluYWw6Ci0gKi8KLXVuc2lnbmVkIGJtU2V0RmVuY2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBhc3NlcnQoaW50ZWwtPmxvY2tlZCk7Ci0KLSAgIC8qIEVtaXQgTUlfRkxVU0ggaGVyZToKLSAgICAqLwotICAgaWYgKGludGVsLT5ibS0+bmVlZF9mZW5jZSkgewotCi0gICAgICAvKiBFbWl0IGEgZmx1c2ggd2l0aG91dCB1c2luZyBhIGJhdGNoYnVmZmVyLiAgQ2FuJ3QgcmVseSBvbiB0aGUKLSAgICAgICAqIGJhdGNoYnVmZmVyIGF0IHRoaXMgbGV2ZWwgcmVhbGx5LiAgV291bGQgcmVhbGx5IHByZWZlciB0aGF0Ci0gICAgICAgKiB0aGUgSVJRIGlvY3RseSBlbWl0dGVkIHRoZSBmbHVzaCBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAgICovCi0gICAgICBHTHVpbnQgZHdvcmRbMl07Ci0gICAgICBkd29yZFswXSA9IGludGVsLT52dGJsLmZsdXNoX2NtZCgpOwotICAgICAgZHdvcmRbMV0gPSAwOwotICAgICAgaW50ZWxfY21kX2lvY3RsKGludGVsLCAoY2hhciAqKSZkd29yZCwgc2l6ZW9mKGR3b3JkKSk7Ci0gICAgICAKLSAgICAgIGludGVsLT5ibS0+bGFzdF9mZW5jZSA9IGludGVsRW1pdElycUxvY2tlZCggaW50ZWwgKTsKLSAgICAgIAotICAgICAgZmVuY2VfYmxvY2tzKGludGVsLCBpbnRlbC0+Ym0tPmxhc3RfZmVuY2UpOwotCi0gICAgICBpbnRlbC0+dnRibC5ub3RlX2ZlbmNlKGludGVsLCBpbnRlbC0+Ym0tPmxhc3RfZmVuY2UpOwotICAgICAgaW50ZWwtPmJtLT5uZWVkX2ZlbmNlID0gMDsKLQotICAgICAgaWYgKGludGVsLT50aHJhc2hpbmcpIHsKLQkgaW50ZWwtPnRocmFzaGluZy0tOwotCSBpZiAoIWludGVsLT50aHJhc2hpbmcpCi0JICAgIERCRygibm90IHRocmFzaGluZ1xuIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGludGVsLT5ibS0+ZnJlZV9vbl9oYXJkd2FyZSA9IDA7Ci0gICB9Ci0gICAKLSAgIHJldHVybiBpbnRlbC0+Ym0tPmxhc3RfZmVuY2U7Ci19Ci0KLXVuc2lnbmVkIGJtU2V0RmVuY2VMb2NrKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICB1bnNpZ25lZCBsYXN0OwotICBMT0NLKGludGVsLT5ibSk7Ci0gIGxhc3QgPSBibVNldEZlbmNlKGludGVsKTsKLSAgVU5MT0NLKGludGVsLT5ibSk7Ci0gIHJldHVybiBsYXN0OwotfQotdW5zaWduZWQgYm1Mb2NrQW5kRmVuY2UoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBpZiAoaW50ZWwtPmJtLT5uZWVkX2ZlbmNlKSB7Ci0gICAgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKLSAgICAgIExPQ0soaW50ZWwtPmJtKTsKLSAgICAgIGJtU2V0RmVuY2UoaW50ZWwpOwotICAgICAgVU5MT0NLKGludGVsLT5ibSk7Ci0gICAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotICAgfQotCi0gICByZXR1cm4gaW50ZWwtPmJtLT5sYXN0X2ZlbmNlOwotfQotCi0KLXZvaWQgYm1GaW5pc2hGZW5jZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCB1bnNpZ25lZCBmZW5jZSApCi17Ci0gICBpZiAoIWJtVGVzdEZlbmNlKGludGVsLCBmZW5jZSkpIHsKLSAgICAgIERCRygiLi4ud2FpdCBvbiBmZW5jZSAlZFxuIiwgZmVuY2UpOwotICAgICAgaW50ZWxXYWl0SXJxKCBpbnRlbCwgZmVuY2UgKTsKLSAgIH0KLSAgIGFzc2VydChibVRlc3RGZW5jZShpbnRlbCwgZmVuY2UpKTsKLSAgIGNoZWNrX2ZlbmNlZChpbnRlbCk7Ci19Ci0KLXZvaWQgYm1GaW5pc2hGZW5jZUxvY2soIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgdW5zaWduZWQgZmVuY2UgKQotewotICAgTE9DSyhpbnRlbC0+Ym0pOwotICAgYm1GaW5pc2hGZW5jZShpbnRlbCwgZmVuY2UpOwotICAgVU5MT0NLKGludGVsLT5ibSk7Ci19Ci0KLQotLyogU3BlY2lmaWNhbGx5IGlnbm9yZSB0ZXh0dXJlIG1lbW9yeSBzaGFyaW5nLgotICogIC0tIGp1c3QgZXZpY3QgZXZlcnl0aGluZwotICogIC0tIGFuZCB3YWl0IGZvciBpZGxlCi0gKi8KLXZvaWQgYm1fZmFrZV9Ob3RpZnlDb250ZW5kZWRMb2NrVGFrZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotCi0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIHN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7Ci0gICAgICBHTHVpbnQgaTsKLQotICAgICAgYXNzZXJ0KGlzX2VtcHR5X2xpc3QoJmJtLT5yZWZlcmVuY2VkKSk7Ci0KLSAgICAgIGJtLT5uZWVkX2ZlbmNlID0gMTsKLSAgICAgIGJtLT5mYWlsID0gMDsKLSAgICAgIGJtRmluaXNoRmVuY2UoaW50ZWwsIGJtU2V0RmVuY2UoaW50ZWwpKTsKLQotICAgICAgYXNzZXJ0KGlzX2VtcHR5X2xpc3QoJmJtLT5mZW5jZWQpKTsKLSAgICAgIGFzc2VydChpc19lbXB0eV9saXN0KCZibS0+b25faGFyZHdhcmUpKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGJtLT5ucl9wb29sczsgaSsrKSB7Ci0JIGlmICghKGJtLT5wb29sW2ldLmZsYWdzICYgQk1fTk9fRVZJQ1QpKSB7Ci0JICAgIGZvcmVhY2hfcyhibG9jaywgdG1wLCAmYm0tPnBvb2xbaV0ubHJ1KSB7Ci0JICAgICAgIGFzc2VydChibVRlc3RGZW5jZShpbnRlbCwgYmxvY2stPmZlbmNlKSk7Ci0JICAgICAgIHNldF9kaXJ0eShpbnRlbCwgYmxvY2stPmJ1Zik7Ci0JICAgIH0KLQkgfQotICAgICAgfQotICAgfQotICAgVU5MT0NLKGJtKTsKLX0KLQotCi0KLXZvaWQgYm1FdmljdEFsbCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotCi0gICBMT0NLKGJtKTsKLSAgIHsKLSAgICAgIHN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7Ci0gICAgICBHTHVpbnQgaTsKLQotICAgICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgICAgYXNzZXJ0KGlzX2VtcHR5X2xpc3QoJmJtLT5yZWZlcmVuY2VkKSk7Ci0KLSAgICAgIGJtLT5uZWVkX2ZlbmNlID0gMTsKLSAgICAgIGJtLT5mYWlsID0gMDsKLSAgICAgIGJtRmluaXNoRmVuY2UoaW50ZWwsIGJtU2V0RmVuY2UoaW50ZWwpKTsKLQotICAgICAgYXNzZXJ0KGlzX2VtcHR5X2xpc3QoJmJtLT5mZW5jZWQpKTsKLSAgICAgIGFzc2VydChpc19lbXB0eV9saXN0KCZibS0+b25faGFyZHdhcmUpKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGJtLT5ucl9wb29sczsgaSsrKSB7Ci0JIGlmICghKGJtLT5wb29sW2ldLmZsYWdzICYgQk1fTk9fRVZJQ1QpKSB7Ci0JICAgIGZvcmVhY2hfcyhibG9jaywgdG1wLCAmYm0tPnBvb2xbaV0ubHJ1KSB7Ci0JICAgICAgIGFzc2VydChibVRlc3RGZW5jZShpbnRlbCwgYmxvY2stPmZlbmNlKSk7Ci0JICAgICAgIHNldF9kaXJ0eShpbnRlbCwgYmxvY2stPmJ1Zik7Ci0JICAgICAgIGJsb2NrLT5idWYtPmJsb2NrID0gTlVMTDsKLQotCSAgICAgICBmcmVlX2Jsb2NrKGludGVsLCBibG9jayk7Ci0JICAgIH0KLQkgfQotICAgICAgfQotICAgfQotICAgVU5MT0NLKGJtKTsKLX0KLQotCi1HTGJvb2xlYW4gYm1FcnJvciggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIHN0cnVjdCBidWZtZ3IgKmJtID0gaW50ZWwtPmJtOwotICAgR0xib29sZWFuIHJldHZhbDsKLQotICAgTE9DSyhibSk7Ci0gICB7Ci0gICAgICByZXR2YWwgPSBibS0+ZmFpbDsKLSAgIH0KLSAgIFVOTE9DSyhibSk7Ci0KLSAgIHJldHVybiByZXR2YWw7Ci19Ci0KLQotR0x1aW50IGJtQ3R4SWQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICByZXR1cm4gaW50ZWwtPmJtLT5jdHhJZDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmF0Y2hidWZmZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmF0Y2hidWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ODVlZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JhdGNoYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgotI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0jaW5jbHVkZSAiYnVmbWdyLmgiCi0KLQotc3RhdGljIHZvaWQgaW50ZWxfYmF0Y2hidWZmZXJfcmVzZXQoIHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2ggKQotewotICAgYXNzZXJ0KGJhdGNoLT5tYXAgPT0gTlVMTCk7Ci0KLSAgIGJhdGNoLT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZyliYXRjaC0+cHRyOwotICAgYmF0Y2gtPm9mZnNldCA9IChiYXRjaC0+b2Zmc2V0ICsgNjMpICYgfjYzOwotICAgYmF0Y2gtPnB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGJhdGNoLT5vZmZzZXQ7Ci0KLSAgIGlmIChCQVRDSF9TWiAtIGJhdGNoLT5vZmZzZXQgPCBCQVRDSF9SRUZJTEwpIHsKLSAgICAgIGJtQnVmZmVyRGF0YShiYXRjaC0+aW50ZWwsIAotCQkgICBiYXRjaC0+YnVmZmVyLAotCQkgICBCQVRDSF9TWiwgCi0JCSAgIE5VTEwsIAotCQkgICAwKTsgCi0gICAgICBiYXRjaC0+b2Zmc2V0ID0gMDsKLSAgICAgIGJhdGNoLT5wdHIgPSBOVUxMOwotICAgfQotCQkKLSAgIGJhdGNoLT5mbGFncyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsX2JhdGNoYnVmZmVyX3Jlc2V0X2NiKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJCXZvaWQgKnB0ciApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoID0gKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqKXB0cjsKLSAgIGFzc2VydChiYXRjaC0+bWFwID09IE5VTEwpOwotICAgYmF0Y2gtPmZsYWdzID0gMDsKLSAgIGJhdGNoLT5vZmZzZXQgPSAwOwotICAgYmF0Y2gtPnB0ciA9IE5VTEw7Ci19Ci0KLUdMdWJ5dGUgKmludGVsX2JhdGNoYnVmZmVyX21hcCggc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCApCi17Ci0gICBpZiAoIWJhdGNoLT5tYXApIHsKLSAgICAgIGJhdGNoLT5tYXAgPSBibU1hcEJ1ZmZlcihiYXRjaC0+aW50ZWwsIGJhdGNoLT5idWZmZXIsIAotCQkJICAgICAgIEJNX01FTV9BR1B8Qk1fTUVNX0xPQ0FMfEJNX0NMSUVOVHxCTV9XUklURSk7Ci0gICAgICBiYXRjaC0+cHRyICs9ICh1bnNpZ25lZCBsb25nKWJhdGNoLT5tYXA7Ci0gICB9Ci0KLSAgIHJldHVybiBiYXRjaC0+bWFwOwotfQotCi12b2lkIGludGVsX2JhdGNoYnVmZmVyX3VubWFwKCBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoICkKLXsKLSAgIGlmIChiYXRjaC0+bWFwKSB7Ci0gICAgICBiYXRjaC0+cHRyIC09ICh1bnNpZ25lZCBsb25nKWJhdGNoLT5tYXA7Ci0gICAgICBiYXRjaC0+bWFwID0gTlVMTDsKLSAgICAgIGJtVW5tYXBCdWZmZXIoYmF0Y2gtPmludGVsLCBiYXRjaC0+YnVmZmVyKTsKLSAgIH0KLX0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogUHVibGljIGZ1bmN0aW9ucwotICovCi1zdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmludGVsX2JhdGNoYnVmZmVyX2FsbG9jKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCA9IGNhbGxvYyhzaXplb2YoKmJhdGNoKSwgMSk7Ci0KLSAgIGJhdGNoLT5pbnRlbCA9IGludGVsOwotCi0gICBibUdlbkJ1ZmZlcnMoaW50ZWwsICJiYXRjaCIsIDEsICZiYXRjaC0+YnVmZmVyLCAxMik7Ci0KLSAgIGJtQnVmZmVyU2V0SW52YWxpZGF0ZUNCKGludGVsLCBiYXRjaC0+YnVmZmVyLAotCQkJICAgaW50ZWxfYmF0Y2hidWZmZXJfcmVzZXRfY2IsCi0JCQkgICBiYXRjaCwKLQkJCSAgIEdMX1RSVUUpOwotCi0gICBibUJ1ZmZlckRhdGEoYmF0Y2gtPmludGVsLAotCQliYXRjaC0+YnVmZmVyLAotCQlCQVRDSF9TWiwKLQkJTlVMTCwKLQkJMCk7Ci0KLQotICAgcmV0dXJuIGJhdGNoOwotfQotCi12b2lkIGludGVsX2JhdGNoYnVmZmVyX2ZyZWUoIHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2ggKQotewotICAgaWYgKGJhdGNoLT5tYXApIAotICAgICAgYm1Vbm1hcEJ1ZmZlcihiYXRjaC0+aW50ZWwsIGJhdGNoLT5idWZmZXIpOwotICAgCi0gICBibURlbGV0ZUJ1ZmZlcnMoYmF0Y2gtPmludGVsLCAxLCAmYmF0Y2gtPmJ1ZmZlcik7Ci0gICBmcmVlKGJhdGNoKTsKLX0KLQotCi0jZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQgCSgweEE8PDIzKQotCi0KLUdMYm9vbGVhbiBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaCggc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBiYXRjaC0+aW50ZWw7Ci0gICBHTHVpbnQgdXNlZCA9IGJhdGNoLT5wdHIgLSAoYmF0Y2gtPm1hcCArIGJhdGNoLT5vZmZzZXQpOwotICAgR0x1aW50IG9mZnNldDsKLSAgIEdMaW50IHJldHZhbCA9IEdMX1RSVUU7Ci0KLSAgIGFzc2VydChpbnRlbC0+bG9ja2VkKTsKLQotICAgaWYgKHVzZWQgPT0gMCkgewotICAgICAgYm1SZWxlYXNlQnVmZmVycyggYmF0Y2gtPmludGVsICk7Ci0gICAgICByZXR1cm4gR0xfVFJVRTsKLSAgIH0KLQotICAgLyogQWRkIHRoZSBNSV9CQVRDSF9CVUZGRVJfRU5ELiAgQWx3YXlzIGFkZCBhbiBNSV9GTFVTSCAtIHRoaXMgaXMgYQotICAgICogcGVyZm9ybWFuY2UgZHJhaW4gdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIGF2b2lkLgotICAgICovCi0gICBpZiAodXNlZCAmIDQpIHsKLSAgICAgICgoaW50ICopYmF0Y2gtPnB0cilbMF0gPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwotICAgICAgYmF0Y2gtPnB0ciArPSA0OwotICAgICAgdXNlZCArPSA0OwotICAgfQotICAgZWxzZSB7Ci0gICAgICAoKGludCAqKWJhdGNoLT5wdHIpWzBdID0gMDsKLSAgICAgICgoaW50ICopYmF0Y2gtPnB0cilbMV0gPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwotCi0gICAgICBiYXRjaC0+cHRyICs9IDg7Ci0gICAgICB1c2VkICs9IDg7Ci0gICB9Ci0KLSAgIGludGVsX2JhdGNoYnVmZmVyX3VubWFwKGJhdGNoKTsKLQotICAgLyogR2V0IHRoZSBiYXRjaCBidWZmZXIgb2Zmc2V0OiBNdXN0IGNhbGwgYm1CdWZmZXJPZmZzZXQoKSBiZWZvcmUKLSAgICAqIGJtVmFsaWRhdGVCdWZmZXJzKCksIG90aGVyd2lzZSB0aGUgYnVmZmVyIHdvbid0IGJlIG9uIHRoZSBpbnVzZQotICAgICogbGlzdC4KLSAgICAqLwotICAgb2Zmc2V0ID0gYm1CdWZmZXJPZmZzZXQoYmF0Y2gtPmludGVsLCBiYXRjaC0+YnVmZmVyKTsKLQotICAgaWYgKGJtVmFsaWRhdGVCdWZmZXJzKCBiYXRjaC0+aW50ZWwgKSAhPSAwKSB7Ci0gICAgICBhc3NlcnQoaW50ZWwtPmxvY2tlZCk7Ci0gICAgICBibVJlbGVhc2VCdWZmZXJzKCBiYXRjaC0+aW50ZWwgKTsKLSAgICAgIHJldHZhbCA9IEdMX0ZBTFNFOwotICAgICAgZ290byBvdXQ7Ci0gICB9Ci0KLQotICAgaWYgKGludGVsLT5hdWJfZmlsZSkgewotICAgICAgLyogU2VuZCBidWZmZXJlZCBjb21tYW5kcyB0byBhdWJmaWxlIGFzIGEgc2luZ2xlIHBhY2tldC4gCi0gICAgICAgKi8KLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX21hcChiYXRjaCk7Ci0gICAgICAoKGludCAqKWJhdGNoLT5wdHIpWy0xXSA9IGludGVsLT52dGJsLmZsdXNoX2NtZCgpOwotICAgICAgaW50ZWwtPnZ0YmwuYXViX2NvbW1hbmRzKGludGVsLAotCQkJICAgICAgIG9mZnNldCwgLyogRnVsc2ltIHdpZXJkbmVzcyAtIGRvbid0IGFkanVzdCAqLwotCQkJICAgICAgIGJhdGNoLT5tYXAgKyBiYXRjaC0+b2Zmc2V0LAotCQkJICAgICAgIHVzZWQpOwotICAgICAgKChpbnQgKiliYXRjaC0+cHRyKVstMV0gPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwotICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfdW5tYXAoYmF0Y2gpOwotICAgfQotCi0KLSAgIC8qIEZpcmUgdGhlIGJhdGNoIGJ1ZmZlciwgd2hpY2ggd2FzIHVwbG9hZGVkIGFib3ZlOgotICAgICovCi0gICBpbnRlbF9iYXRjaF9pb2N0bChiYXRjaC0+aW50ZWwsIAotCQkgICAgIG9mZnNldCArIGJhdGNoLT5vZmZzZXQsCi0JCSAgICAgdXNlZCk7Ci0KLSAgIGlmIChpbnRlbC0+YXViX2ZpbGUgJiYgCi0gICAgICAgaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0ZST05UX0xFRlQpCi0gICAgICBpbnRlbC0+dnRibC5hdWJfZHVtcF9ibXAoIGludGVsLCAwICk7Ci0KLSAgIC8qIFJlc2V0IHRoZSBidWZmZXI6Ci0gICAgKi8KLSBvdXQ6Ci0gICBpbnRlbF9iYXRjaGJ1ZmZlcl9yZXNldCggYmF0Y2ggKTsKLSAgIGludGVsX2JhdGNoYnVmZmVyX21hcCggYmF0Y2ggKTsKLQotICAgaWYgKCFyZXR2YWwpCi0gICAgICBEQkcoIiVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQotICAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0KLQotCi0KLQotdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9hbGlnbiggc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKLQkJCSAgICAgIEdMdWludCBhbGlnbiwKLQkJCSAgICAgIEdMdWludCBzeiApCi17Ci0gICB1bnNpZ25lZCBsb25nIHB0ciA9ICh1bnNpZ25lZCBsb25nKSBiYXRjaC0+cHRyOwotICAgdW5zaWduZWQgbG9uZyBhcHRyID0gKHB0ciArIGFsaWduKSAmIH4oKHVuc2lnbmVkIGxvbmcpYWxpZ24tMSk7Ci0gICBHTHVpbnQgZml4dXAgPSBhcHRyIC0gcHRyOwotCi0gICBpZiAoaW50ZWxfYmF0Y2hidWZmZXJfc3BhY2UoYmF0Y2gpIDwgZml4dXAgKyBzeikKLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGJhdGNoKTsKLSAgIGVsc2UgewotICAgICAgbWVtc2V0KGJhdGNoLT5wdHIsIDAsIGZpeHVwKTsgICAgICAKLSAgICAgIGJhdGNoLT5wdHIgKz0gZml4dXA7Ci0gICB9Ci19Ci0KLQotCi0KLXZvaWQgaW50ZWxfYmF0Y2hidWZmZXJfZGF0YShzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoLAotCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICAgR0x1aW50IGJ5dGVzLAotCQkJICAgIEdMdWludCBmbGFncykKLXsKLSAgIGFzc2VydCgoYnl0ZXMgJiAzKSA9PSAwKTsKLSAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoYmF0Y2gsIGJ5dGVzLCBmbGFncyk7Ci0gICBfX21lbWNweShiYXRjaC0+cHRyLCBkYXRhLCBieXRlcyk7Ci0gICBiYXRjaC0+cHRyICs9IGJ5dGVzOwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JhdGNoYnVmZmVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JhdGNoYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDM4Y2RmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmF0Y2hidWZmZXIuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9iYXRjaGJ1ZmZlci5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9iYXRjaGJ1ZmZlci5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9iYXRjaGJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWUwYTY1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmF0Y2hidWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIElOVEVMX0JBVENIQlVGRkVSX0gKLSNkZWZpbmUgSU5URUxfQkFUQ0hCVUZGRVJfSAotCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAiYnVmbWdyLmgiCi0KLXN0cnVjdCBpbnRlbF9jb250ZXh0OwotCi0jZGVmaW5lIEJBVENIX1NaICgxNiAqIDEwMjQpCi0jZGVmaW5lIEJBVENIX1JFRklMTCA0MDk2Ci0jZGVmaW5lIEJBVENIX1JFU0VSVkVEIDE2Ci0KLSNkZWZpbmUgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTIDB4MQotI2RlZmluZSBJTlRFTF9CQVRDSF9DTElQUkVDVFMgICAgMHgyCi0KLXN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciB7Ci0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWw7Ci0KLSAgIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcjsKLQotICAgR0x1aW50IGZsYWdzOwotICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLSAgIEdMdWJ5dGUgKm1hcDsKLSAgIEdMdWJ5dGUgKnB0cjsgCi19OwotCi1zdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmludGVsX2JhdGNoYnVmZmVyX2FsbG9jKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLQotdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9mcmVlKCBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoICk7Ci0KLQotR0xib29sZWFuIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKCBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoICk7Ci0KLXZvaWQgaW50ZWxfYmF0Y2hidWZmZXJfdW5tYXAoIHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2ggKTsKLUdMdWJ5dGUgKmludGVsX2JhdGNoYnVmZmVyX21hcCggc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCApOwotCi0KLS8qIFVubGlrZSBibUJ1ZmZlckRhdGEsIHRoaXMgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBidWZmZXIgYmUgbWFwcGVkLgotICogQ29uc2lkZXIgaXQgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB3cmFwcGluZyBtdWx0cGxlCi0gKiBpbnRlbF9idWZmZXJfZHdvcmQoKSBjYWxscy4KLSAqLwotdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsCi0JCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgICBHTHVpbnQgYnl0ZXMsCi0JCQkgICAgR0x1aW50IGZsYWdzKTsKLQotdm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9yZWxlYXNlX3NwYWNlKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsCi0JCQkJICAgR0x1aW50IGJ5dGVzKTsKLQotCi0vKiBJbmxpbmUgZnVuY3Rpb25zIC0gbWlnaHQgYWN0dWFsbHkgYmUgYmV0dGVyIG9mZiB3aXRoIHRoZXNlCi0gKiBub24taW5saW5lZC4gIENlcnRhaW5seSBiZXR0ZXIgb2ZmIHN3aXRjaGluZyBhbGwgY29tbWFuZCBwYWNrZXRzIHRvCi0gKiBiZSBwYXNzZWQgYXMgc3RydWN0cyByYXRoZXIgdGhhbiBkd29yZHMsIGJ1dCB0aGF0J3MgYSBsaXR0bGUgYml0IG9mCi0gKiB3b3JrLi4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgR0x1aW50IAotaW50ZWxfYmF0Y2hidWZmZXJfc3BhY2UoIHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2ggKQotewotICAgcmV0dXJuIChCQVRDSF9TWiAtIEJBVENIX1JFU0VSVkVEKSAtIChiYXRjaC0+cHRyIC0gKGJhdGNoLT5tYXAgKyBiYXRjaC0+b2Zmc2V0KSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIAotaW50ZWxfYmF0Y2hidWZmZXJfZW1pdF9kd29yZChzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoLAotCQkJICAgICBHTHVpbnQgZHdvcmQpCi17Ci0gICBhc3NlcnQoYmF0Y2gtPm1hcCk7Ci0gICBhc3NlcnQoaW50ZWxfYmF0Y2hidWZmZXJfc3BhY2UoYmF0Y2gpID49IDQpOwotICAgKihHTHVpbnQgKikoYmF0Y2gtPnB0cikgPSBkd29yZDsKLSAgIGJhdGNoLT5wdHIgKz0gNDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIAotaW50ZWxfYmF0Y2hidWZmZXJfcmVxdWlyZV9zcGFjZShzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoLAotCQkJCUdMdWludCBzeiwKLQkJCQlHTHVpbnQgZmxhZ3MpCi17Ci0gICBhc3NlcnQoc3ogPCBCQVRDSF9TWiAtIDgpOwotICAgaWYgKGludGVsX2JhdGNoYnVmZmVyX3NwYWNlKGJhdGNoKSA8IHN6IHx8Ci0gICAgICAgKGJhdGNoLT5mbGFncyAhPSAwICYmIGZsYWdzICE9IDAgJiYgYmF0Y2gtPmZsYWdzICE9IGZsYWdzKSkKLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGJhdGNoKTsKLSAgIAotICAgYmF0Y2gtPmZsYWdzIHw9IGZsYWdzOwotfQotCi12b2lkIGludGVsX2JhdGNoYnVmZmVyX2FsaWduKCBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoLAotCQkJICAgICAgR0x1aW50IGFsaWduLAotCQkJICAgICAgR0x1aW50IHN6ICk7Ci0KLQotLyogSGVyZSBhcmUgdGhlIGNydXN0eSBvbGQgbWFjcm9zLCB0byBiZSByZW1vdmVkOgotICovCi0jZGVmaW5lIEJBVENIX0xPQ0FMUyAKLSNkZWZpbmUgQkVHSU5fQkFUQ0gobiwgZmxhZ3MpIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoaW50ZWwtPmJhdGNoLCBuKjQsIGZsYWdzKQotI2RlZmluZSBPVVRfQkFUQ0goZCkgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfZHdvcmQoaW50ZWwtPmJhdGNoLCBkKQotI2RlZmluZSBBRFZBTkNFX0JBVENIKCkgZG8geyB9IHdoaWxlKDApCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JsaXQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmxpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODhjYmIyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYmxpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotI2luY2x1ZGUgInZibGFuay5oIgotCi0jaW5jbHVkZSAiaW50ZWxfcmVnLmgiCi0jaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgotI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKLSNpbmNsdWRlICJpbnRlbF9zdHJ1Y3RzLmgiCi0KLSNpbmNsdWRlICJidWZtZ3IuaCIKLQotCi0KLQotLyoKLSAqIENvcHkgdGhlIGJhY2sgYnVmZmVyIHRvIHRoZSBmcm9udCBidWZmZXIuIAotICovCi12b2lkIGludGVsQ29weUJ1ZmZlciggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LAotCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKnJlY3QgKSAKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbDsKLSAgIEdMYm9vbGVhbiAgIG1pc3NlZF90YXJnZXQ7Ci0gICBpbnQ2NF90IHVzdDsKLQotICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgYXNzZXJ0KGRQcml2KTsKLSAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYpOwotICAgYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSk7Ci0KLSAgIGludGVsID0gKHN0cnVjdCBpbnRlbF9jb250ZXh0ICopIGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0KLQotICAgYm1GaW5pc2hGZW5jZUxvY2soaW50ZWwsIGludGVsLT5sYXN0X3N3YXBfZmVuY2UpOwotCi0gICAvKiBUaGUgTE9DS19IQVJEV0FSRSBpcyByZXF1aXJlZCBmb3IgdGhlIGNsaXByZWN0cy4gIEJ1ZmZlciBvZmZzZXRzCi0gICAgKiBzaG91bGQgd29yayByZWdhcmRsZXNzLgotICAgICovCi0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotCi0gICBpZiAoIXJlY3QpCi0gICB7Ci0gICAgICAgVU5MT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgICAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmaW50ZWwtPnZibF9zZXEsIGludGVsLT52YmxhbmtfZmxhZ3MsICYgbWlzc2VkX3RhcmdldCApOwotICAgICAgIExPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICB9Ci0KLSAgIHsKLSAgICAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47Ci0gICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0gICAgICBpbnQgbmJveCA9IGRQcml2LT5udW1DbGlwUmVjdHM7Ci0gICAgICBkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgICAgIGludCBjcHAgPSBpbnRlbFNjcmVlbi0+Y3BwOwotICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqc3JjLCAqZHN0OwotICAgICAgaW50IEJSMTMsIENNRDsKLSAgICAgIGludCBpOwotICAgICAgaW50IHNyY19waXRjaCwgZHN0X3BpdGNoOwotCi0gICAgICBpZiAoaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPT0gMCkgewotCSBkc3QgPSBpbnRlbC0+ZnJvbnRfcmVnaW9uOwotCSBzcmMgPSBpbnRlbC0+YmFja19yZWdpb247Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgYXNzZXJ0KDApOwotCSBzcmMgPSBpbnRlbC0+ZnJvbnRfcmVnaW9uOwotCSBkc3QgPSBpbnRlbC0+YmFja19yZWdpb247Ci0gICAgICB9Ci0KLSAgICAgIHNyY19waXRjaCA9IHNyYy0+cGl0Y2ggKiBzcmMtPmNwcDsKLSAgICAgIGRzdF9waXRjaCA9IGRzdC0+cGl0Y2ggKiBkc3QtPmNwcDsKLQotICAgICAgaWYgKGNwcCA9PSAyKSB7Ci0JIEJSMTMgPSAoMHhDQyA8PCAxNikgfCAoMTw8MjQpOwotCSBDTUQgPSBYWV9TUkNfQ09QWV9CTFRfQ01EOwotICAgICAgfSAKLSAgICAgIGVsc2UgewotCSBCUjEzID0gKDB4Q0MgPDwgMTYpIHwgKDE8PDI0KSB8ICgxPDwyNSk7Ci0JIENNRCA9IChYWV9TUkNfQ09QWV9CTFRfQ01EIHwgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBIHwKLQkJWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzcmMtPnRpbGVkKSB7Ci0JIENNRCB8PSBYWV9TUkNfVElMRUQ7Ci0JIHNyY19waXRjaCAvPSA0OwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZHN0LT50aWxlZCkgewotCSBDTUQgfD0gWFlfRFNUX1RJTEVEOwotIAkgZHN0X3BpdGNoIC89IDQ7Ci0gICAgICB9Ci0gIAotICAgICAgZm9yIChpID0gMCA7IGkgPCBuYm94OyBpKyssIHBib3grKykgCi0gICAgICB7Ci0JIGRybV9jbGlwX3JlY3RfdCB0bXAgPSAqcGJveDsKLQotCSBpZiAocmVjdCkgewotCSAgICBpZiAoIWludGVsX2ludGVyc2VjdF9jbGlwcmVjdHMoJnRtcCwgJnRtcCwgcmVjdCkpCi0JICAgICAgIGNvbnRpbnVlOwotCSB9Ci0KLQotCSBpZiAodG1wLngxID4gdG1wLngyIHx8Ci0JICAgICB0bXAueTEgPiB0bXAueTIgfHwKLQkgICAgIHRtcC54MiA+IGludGVsU2NyZWVuLT53aWR0aCB8fAotCSAgICAgdG1wLnkyID4gaW50ZWxTY3JlZW4tPmhlaWdodCkKLQkgICAgY29udGludWU7Ci0gCi0JIEJFR0lOX0JBVENIKDgsIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyk7Ci0JIE9VVF9CQVRDSCggQ01EICk7Ci0JIE9VVF9CQVRDSCggZHN0X3BpdGNoIHwgQlIxMyApOwotCSBPVVRfQkFUQ0goICh0bXAueTEgPDwgMTYpIHwgdG1wLngxICk7Ci0JIE9VVF9CQVRDSCggKHRtcC55MiA8PCAxNikgfCB0bXAueDIgKTsKLQkgT1VUX0JBVENIKCBibUJ1ZmZlck9mZnNldChpbnRlbCwgZHN0LT5idWZmZXIpICk7Ci0JIE9VVF9CQVRDSCggKHRtcC55MSA8PCAxNikgfCB0bXAueDEgKTsKLQkgT1VUX0JBVENIKCBzcmNfcGl0Y2ggKTsKLQkgT1VUX0JBVENIKCBibUJ1ZmZlck9mZnNldChpbnRlbCwgc3JjLT5idWZmZXIpICk7IAotCSBBRFZBTkNFX0JBVENIKCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKCBpbnRlbC0+YmF0Y2ggKTsKLSAgIGludGVsLT5zZWNvbmRfbGFzdF9zd2FwX2ZlbmNlID0gaW50ZWwtPmxhc3Rfc3dhcF9mZW5jZTsKLSAgIGludGVsLT5sYXN0X3N3YXBfZmVuY2UgPSBibVNldEZlbmNlTG9jayggaW50ZWwgKTsKLSAgIFVOTE9DS19IQVJEV0FSRSggaW50ZWwgKTsKLQotICAgaWYgKCFyZWN0KQotICAgewotICAgICAgIGludGVsLT5zd2FwX2NvdW50Kys7Ci0gICAgICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCZ1c3QpOwotICAgICAgIGlmIChtaXNzZWRfdGFyZ2V0KSB7Ci0JICAgaW50ZWwtPnN3YXBfbWlzc2VkX2NvdW50Kys7Ci0JICAgaW50ZWwtPnN3YXBfbWlzc2VkX3VzdCA9IHVzdCAtICBpbnRlbC0+c3dhcF91c3Q7Ci0gICAgICAgfQotICAgCi0gICAgICAgaW50ZWwtPnN3YXBfdXN0ID0gdXN0OwotICAgfQotCi19Ci0KLQotCi0KLXZvaWQgaW50ZWxFbWl0RmlsbEJsaXQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCUdMdWludCBjcHAsCi0JCQlHTHNob3J0IGRzdF9waXRjaCwKLQkJCXN0cnVjdCBidWZmZXIgKmRzdF9idWZmZXIsCi0JCQlHTHVpbnQgZHN0X29mZnNldCwKLQkJCUdMYm9vbGVhbiBkc3RfdGlsZWQsCi0JCQlHTHNob3J0IHgsIEdMc2hvcnQgeSwgCi0JCQlHTHNob3J0IHcsIEdMc2hvcnQgaCwKLQkJCUdMdWludCBjb2xvciApCi17Ci0gICBHTHVpbnQgQlIxMywgQ01EOwotICAgQkFUQ0hfTE9DQUxTOwotCi0gICBkc3RfcGl0Y2ggKj0gY3BwOwotCi0gICBzd2l0Y2goY3BwKSB7Ci0gICBjYXNlIDE6IAotICAgY2FzZSAyOiAKLSAgIGNhc2UgMzogCi0gICAgICBCUjEzID0gKDB4RjAgPDwgMTYpIHwgKDE8PDI0KTsKLSAgICAgIENNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgNDoKLSAgICAgIEJSMTMgPSAoMHhGMCA8PCAxNikgfCAoMTw8MjQpIHwgKDE8PDI1KTsKLSAgICAgIENNRCA9IChYWV9DT0xPUl9CTFRfQ01EIHwgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBIHwKLQkgICAgIFhZX0NPTE9SX0JMVF9XUklURV9SR0IpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAoZHN0X3RpbGVkKSB7Ci0gICAgICBDTUQgfD0gWFlfRFNUX1RJTEVEOwotICAgICAgZHN0X3BpdGNoIC89IDQ7Ci0gICB9Ci0KLSAgIEJFR0lOX0JBVENIKDYsIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyk7Ci0gICBPVVRfQkFUQ0goIENNRCApOwotICAgT1VUX0JBVENIKCBkc3RfcGl0Y2ggfCBCUjEzICk7Ci0gICBPVVRfQkFUQ0goICh5IDw8IDE2KSB8IHggKTsKLSAgIE9VVF9CQVRDSCggKCh5K2gpIDw8IDE2KSB8ICh4K3cpICk7Ci0gICBPVVRfQkFUQ0goIGJtQnVmZmVyT2Zmc2V0KGludGVsLCBkc3RfYnVmZmVyKSArIGRzdF9vZmZzZXQgKTsKLSAgIE9VVF9CQVRDSCggY29sb3IgKTsKLSAgIEFEVkFOQ0VfQkFUQ0goKTsKLX0KLQotc3RhdGljIEdMdWludCB0cmFuc2xhdGVfcmFzdGVyX29wKEdMZW51bSBsb2dpY29wKQotewotICAgc3dpdGNoKGxvZ2ljb3ApIHsKLSAgIGNhc2UgR0xfQ0xFQVI6IHJldHVybiAweDAwOwotICAgY2FzZSBHTF9BTkQ6IHJldHVybiAweDg4OwotICAgY2FzZSBHTF9BTkRfUkVWRVJTRTogcmV0dXJuIDB4NDQ7Ci0gICBjYXNlIEdMX0NPUFk6IHJldHVybiAweENDOwotICAgY2FzZSBHTF9BTkRfSU5WRVJURUQ6IHJldHVybiAweDIyOwotICAgY2FzZSBHTF9OT09QOiByZXR1cm4gMHhBQTsKLSAgIGNhc2UgR0xfWE9SOiByZXR1cm4gMHg2NjsKLSAgIGNhc2UgR0xfT1I6IHJldHVybiAweEVFOwotICAgY2FzZSBHTF9OT1I6IHJldHVybiAweDExOwotICAgY2FzZSBHTF9FUVVJVjogcmV0dXJuIDB4OTk7Ci0gICBjYXNlIEdMX0lOVkVSVDogcmV0dXJuIDB4NTU7Ci0gICBjYXNlIEdMX09SX1JFVkVSU0U6IHJldHVybiAweEREOwotICAgY2FzZSBHTF9DT1BZX0lOVkVSVEVEOiByZXR1cm4gMHgzMzsKLSAgIGNhc2UgR0xfT1JfSU5WRVJURUQ6IHJldHVybiAweEJCOwotICAgY2FzZSBHTF9OQU5EOiByZXR1cm4gMHg3NzsKLSAgIGNhc2UgR0xfU0VUOiByZXR1cm4gMHhGRjsKLSAgIGRlZmF1bHQ6IHJldHVybiAwOwotICAgfQotfQotCi0KLS8qIENvcHkgQml0Qmx0Ci0gKi8KLXZvaWQgaW50ZWxFbWl0Q29weUJsaXQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCUdMdWludCBjcHAsCi0JCQlHTHNob3J0IHNyY19waXRjaCwKLQkJCXN0cnVjdCBidWZmZXIgKnNyY19idWZmZXIsCi0JCQlHTHVpbnQgIHNyY19vZmZzZXQsCi0JCQlHTGJvb2xlYW4gc3JjX3RpbGVkLAotCQkJR0xzaG9ydCBkc3RfcGl0Y2gsCi0JCQlzdHJ1Y3QgYnVmZmVyICpkc3RfYnVmZmVyLAotCQkJR0x1aW50ICBkc3Rfb2Zmc2V0LAotCQkJR0xib29sZWFuIGRzdF90aWxlZCwKLQkJCUdMc2hvcnQgc3JjX3gsIEdMc2hvcnQgc3JjX3ksCi0JCQlHTHNob3J0IGRzdF94LCBHTHNob3J0IGRzdF95LAotCQkJR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQlHTGVudW0gbG9naWNfb3AgKQotewotICAgR0x1aW50IENNRCwgQlIxMzsKLSAgIGludCBkc3RfeTIgPSBkc3RfeSArIGg7Ci0gICBpbnQgZHN0X3gyID0gZHN0X3ggKyB3OwotICAgQkFUQ0hfTE9DQUxTOwotCi0KLSAgIERCRygiJXMgc3JjOmJ1ZiglZCkvJWQgJWQsJWQgZHN0OmJ1ZiglZCkvJWQgJWQsJWQgc3o6JWR4JWQgb3A6JWRcbiIsCi0gICAgICAgX19GVU5DVElPTl9fLAotICAgICAgIHNyY19idWZmZXIsIHNyY19waXRjaCwgc3JjX3gsIHNyY195LAotICAgICAgIGRzdF9idWZmZXIsIGRzdF9waXRjaCwgZHN0X3gsIGRzdF95LAotICAgICAgIHcsaCxsb2dpY19vcCk7Ci0KLSAgIGFzc2VydCggbG9naWNfb3AgLSBHTF9DTEVBUiA+PSAwICk7Ci0gICBhc3NlcnQoIGxvZ2ljX29wIC0gR0xfQ0xFQVIgPCAweDEwICk7Ci0gICAgICAKLSAgIHNyY19waXRjaCAqPSBjcHA7Ci0gICBkc3RfcGl0Y2ggKj0gY3BwOwotCi0gICBzd2l0Y2goY3BwKSB7Ci0gICBjYXNlIDE6IAotICAgY2FzZSAyOiAKLSAgIGNhc2UgMzogCi0gICAgICBCUjEzID0gKHRyYW5zbGF0ZV9yYXN0ZXJfb3AobG9naWNfb3ApIDw8IDE2KSB8ICgxPDwyNCk7Ci0gICAgICBDTUQgPSBYWV9TUkNfQ09QWV9CTFRfQ01EOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDQ6Ci0gICAgICBCUjEzID0gKHRyYW5zbGF0ZV9yYXN0ZXJfb3AobG9naWNfb3ApIDw8IDE2KSB8ICgxPDwyNCkgfAotCSAgKDE8PDI1KTsKLSAgICAgIENNRCA9IChYWV9TUkNfQ09QWV9CTFRfQ01EIHwgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBIHwKLQkgICAgIFhZX1NSQ19DT1BZX0JMVF9XUklURV9SR0IpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAoc3JjX3RpbGVkKSB7Ci0gICAgICBDTUQgfD0gWFlfU1JDX1RJTEVEOwotICAgICAgc3JjX3BpdGNoIC89IDQ7Ci0gICB9Ci0gICAKLSAgIGlmIChkc3RfdGlsZWQpIHsKLSAgICAgIENNRCB8PSBYWV9EU1RfVElMRUQ7Ci0gICAgICBkc3RfcGl0Y2ggLz0gNDsKLSAgIH0KLQotICAgaWYgKGRzdF95MiA8IGRzdF95IHx8Ci0gICAgICAgZHN0X3gyIDwgZHN0X3gpIHsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZHN0X3BpdGNoICY9IDB4ZmZmZjsKLSAgIHNyY19waXRjaCAmPSAweGZmZmY7Ci0KLSAgIC8qIEluaXRpYWwgeSB2YWx1ZXMgZG9uJ3Qgc2VlbSB0byB3b3JrIHdpdGggbmVnYXRpdmUgcGl0Y2hlcy4gIElmCi0gICAgKiB3ZSBhZGp1c3QgdGhlIG9mZnNldHMgbWFudWFsbHkgKGJlbG93KSwgaXQgc2VlbXMgdG8gd29yayBmaW5lLgotICAgICoKLSAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhbHdheXMgYWRqdXN0LCB0aGUgaGFyZHdhcmUgZG9lc24ndAotICAgICoga25vdyB3aGljaCBibGl0IGRpcmVjdGlvbnMgdG8gdXNlLCBzbyBvdmVybGFwcGluZyBjb3B5cGl4ZWxzIGdldAotICAgICogdGhlIHdyb25nIHJlc3VsdC4KLSAgICAqLwotICAgaWYgKGRzdF9waXRjaCA+IDAgJiYgc3JjX3BpdGNoID4gMCkgewotICAgICAgQkVHSU5fQkFUQ0goOCwgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTKTsKLSAgICAgIE9VVF9CQVRDSCggQ01EICk7Ci0gICAgICBPVVRfQkFUQ0goIGRzdF9waXRjaCB8IEJSMTMgKTsKLSAgICAgIE9VVF9CQVRDSCggKGRzdF95IDw8IDE2KSB8IGRzdF94ICk7Ci0gICAgICBPVVRfQkFUQ0goIChkc3RfeTIgPDwgMTYpIHwgZHN0X3gyICk7Ci0gICAgICBPVVRfQkFUQ0goIGJtQnVmZmVyT2Zmc2V0KGludGVsLCBkc3RfYnVmZmVyKSArIGRzdF9vZmZzZXQgKTsJCi0gICAgICBPVVRfQkFUQ0goIChzcmNfeSA8PCAxNikgfCBzcmNfeCApOwotICAgICAgT1VUX0JBVENIKCBzcmNfcGl0Y2ggKTsKLSAgICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIHNyY19idWZmZXIpICsgc3JjX29mZnNldCApOyAKLSAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgQkVHSU5fQkFUQ0goOCwgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTKTsKLSAgICAgIE9VVF9CQVRDSCggQ01EICk7Ci0gICAgICBPVVRfQkFUQ0goIChkc3RfcGl0Y2ggJiAweGZmZmYpIHwgQlIxMyApOwotICAgICAgT1VUX0JBVENIKCAoMCA8PCAxNikgfCBkc3RfeCApOwotICAgICAgT1VUX0JBVENIKCAoaCA8PCAxNikgfCBkc3RfeDIgKTsKLSAgICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIGRzdF9idWZmZXIpICsgZHN0X29mZnNldCArIGRzdF95ICogZHN0X3BpdGNoICk7CQotICAgICAgT1VUX0JBVENIKCAoMCA8PCAxNikgfCBzcmNfeCApOwotICAgICAgT1VUX0JBVENIKCAoc3JjX3BpdGNoICYgMHhmZmZmKSApOwotICAgICAgT1VUX0JBVENIKCBibUJ1ZmZlck9mZnNldChpbnRlbCwgc3JjX2J1ZmZlcikgKyBzcmNfb2Zmc2V0ICsgc3JjX3kgKiBzcmNfcGl0Y2ggKTsgCi0gICAgICBBRFZBTkNFX0JBVENIKCk7Ci0gICB9Ci19Ci0KLQotCi12b2lkIGludGVsQ2xlYXJXaXRoQmxpdChHTGNvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBmbGFncykKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOwotICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKLSAgIEdMdWludCBjbGVhcl9kZXB0aCwgY2xlYXJfY29sb3I7Ci0gICBHTGludCBjeCwgY3ksIGN3LCBjaDsKLSAgIEdMaW50IGNwcCA9IGludGVsU2NyZWVuLT5jcHA7Ci0gICBHTGJvb2xlYW4gYWxsOwotICAgR0xpbnQgaTsKLSAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmZyb250ID0gaW50ZWwtPmZyb250X3JlZ2lvbjsKLSAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmJhY2sgPSBpbnRlbC0+YmFja19yZWdpb247Ci0gICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aCA9IGludGVsLT5kZXB0aF9yZWdpb247Ci0gICBHTHVpbnQgQlIxMywgRlJPTlRfQ01ELCBCQUNLX0NNRCwgREVQVEhfQ01EOwotICAgR0x1aW50IGZyb250X3BpdGNoOwotICAgR0x1aW50IGJhY2tfcGl0Y2g7Ci0gICBHTHVpbnQgZGVwdGhfcGl0Y2g7Ci0gICBCQVRDSF9MT0NBTFM7Ci0KLSAgIAotICAgY2xlYXJfY29sb3IgPSBpbnRlbC0+Q2xlYXJDb2xvcjsKLSAgIGNsZWFyX2RlcHRoID0gMDsKLQotICAgaWYgKGZsYWdzICYgQlVGRkVSX0JJVF9ERVBUSCkgewotICAgICAgY2xlYXJfZGVwdGggPSAoR0x1aW50KShjdHgtPkRlcHRoLkNsZWFyICogaW50ZWwtPkNsZWFyRGVwdGgpOwotICAgfQotCi0gICBpZiAoZmxhZ3MgJiBCVUZGRVJfQklUX1NURU5DSUwpIHsKLSAgICAgIGNsZWFyX2RlcHRoIHw9IChjdHgtPlN0ZW5jaWwuQ2xlYXIgJiAweGZmKSA8PCAyNDsKLSAgIH0KLQotICAgc3dpdGNoKGNwcCkgewotICAgY2FzZSAyOiAKLSAgICAgIEJSMTMgPSAoMHhGMCA8PCAxNikgfCAoMTw8MjQpOwotICAgICAgQkFDS19DTUQgID0gRlJPTlRfQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKLSAgICAgIERFUFRIX0NNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgNDoKLSAgICAgIEJSMTMgPSAoMHhGMCA8PCAxNikgfCAoMTw8MjQpIHwgKDE8PDI1KTsKLSAgICAgIEJBQ0tfQ01EID0gRlJPTlRfQ01EID0gKFhZX0NPTE9SX0JMVF9DTUQgfAotCQkJICAgICAgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBIHwgCi0JCQkgICAgICBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKLSAgICAgIERFUFRIX0NNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7Ci0gICAgICBpZiAoZmxhZ3MgJiBCVUZGRVJfQklUX0RFUFRIKSBERVBUSF9DTUQgfD0gWFlfQ09MT1JfQkxUX1dSSVRFX1JHQjsKLSAgICAgIGlmIChmbGFncyAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgREVQVEhfQ01EIHw9IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgIH0KLQotCi0KLSAgIGludGVsRmx1c2goICZpbnRlbC0+Y3R4ICk7Ci0gICBMT0NLX0hBUkRXQVJFKCBpbnRlbCApOwotICAgewotICAgICAgLyogZ2V0IGNsZWFyIGJvdW5kcyBhZnRlciBsb2NraW5nICovCi0gICAgICBjeCA9IGN0eC0+RHJhd0J1ZmZlci0+X1htaW47Ci0gICAgICBjeSA9IGN0eC0+RHJhd0J1ZmZlci0+X1ltaW47Ci0gICAgICBjaCA9IGN0eC0+RHJhd0J1ZmZlci0+X1ltYXggLSBjdHgtPkRyYXdCdWZmZXItPl9ZbWluOwotICAgICAgY3cgPSBjdHgtPkRyYXdCdWZmZXItPl9YbWF4IC0gY3R4LT5EcmF3QnVmZmVyLT5fWG1pbjsKLSAgICAgIGFsbCA9IChjdyA9PSBjdHgtPkRyYXdCdWZmZXItPldpZHRoICYmIGNoID09IGN0eC0+RHJhd0J1ZmZlci0+SGVpZ2h0KTsKLQotICAgICAgLyogZmxpcCB0b3AgdG8gYm90dG9tICovCi0gICAgICBjeSA9IGludGVsLT5kcmlEcmF3YWJsZS0+aCAtIGN5IC0gY2g7Ci0gICAgICBjeCA9IGN4ICsgaW50ZWwtPmRyYXdYOwotICAgICAgY3kgKz0gaW50ZWwtPmRyYXdZOwotCi0gICAgICAvKiBhZGp1c3QgZm9yIHBhZ2UgZmxpcHBpbmcgKi8KLSAgICAgIGlmICggaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPT0gMCApIHsKLQkgZnJvbnQgPSBpbnRlbC0+ZnJvbnRfcmVnaW9uOwotCSBiYWNrID0gaW50ZWwtPmJhY2tfcmVnaW9uOwotICAgICAgfSAKLSAgICAgIGVsc2UgewotCSBiYWNrID0gaW50ZWwtPmZyb250X3JlZ2lvbjsKLQkgZnJvbnQgPSBpbnRlbC0+YmFja19yZWdpb247Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGZyb250X3BpdGNoID0gZnJvbnQtPnBpdGNoICogZnJvbnQtPmNwcDsKLSAgICAgIGJhY2tfcGl0Y2ggPSBiYWNrLT5waXRjaCAqIGJhY2stPmNwcDsKLSAgICAgIGRlcHRoX3BpdGNoID0gZGVwdGgtPnBpdGNoICogZGVwdGgtPmNwcDsKLSAgICAgIAotICAgICAgaWYgKGZyb250LT50aWxlZCkgewotCSBGUk9OVF9DTUQgfD0gWFlfRFNUX1RJTEVEOwotCSBmcm9udF9waXRjaCAvPSA0OwotICAgICAgfQotCi0gICAgICBpZiAoYmFjay0+dGlsZWQpIHsKLQkgQkFDS19DTUQgfD0gWFlfRFNUX1RJTEVEOwotCSBiYWNrX3BpdGNoIC89IDQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZXB0aC0+dGlsZWQpIHsKLQkgREVQVEhfQ01EIHw9IFhZX0RTVF9USUxFRDsKLQkgZGVwdGhfcGl0Y2ggLz0gNDsKLSAgICAgIH0KLQotICAgICAgZm9yIChpID0gMCA7IGkgPCBpbnRlbC0+bnVtQ2xpcFJlY3RzIDsgaSsrKSAKLSAgICAgIHsgCSAKLQkgZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmaW50ZWwtPnBDbGlwUmVjdHNbaV07CSAKLQkgZHJtX2NsaXBfcmVjdF90IGI7Ci0KLQkgaWYgKCFhbGwpIHsKLQkgICAgR0xpbnQgeCA9IGJveC0+eDE7Ci0JICAgIEdMaW50IHkgPSBib3gtPnkxOwotCSAgICBHTGludCB3ID0gYm94LT54MiAtIHg7Ci0JICAgIEdMaW50IGggPSBib3gtPnkyIC0geTsKLQotCSAgICBpZiAoeCA8IGN4KSB3IC09IGN4IC0geCwgeCA9IGN4OyAKLQkgICAgaWYgKHkgPCBjeSkgaCAtPSBjeSAtIHksIHkgPSBjeTsKLQkgICAgaWYgKHggKyB3ID4gY3ggKyBjdykgdyA9IGN4ICsgY3cgLSB4OwotCSAgICBpZiAoeSArIGggPiBjeSArIGNoKSBoID0gY3kgKyBjaCAtIHk7Ci0JICAgIGlmICh3IDw9IDApIGNvbnRpbnVlOwotCSAgICBpZiAoaCA8PSAwKSBjb250aW51ZTsKLQotCSAgICBiLngxID0geDsKLQkgICAgYi55MSA9IHk7Ci0JICAgIGIueDIgPSB4ICsgdzsKLQkgICAgYi55MiA9IHkgKyBoOyAgICAgIAotCSB9IGVsc2UgewotCSAgICBiID0gKmJveDsKLQkgfQotCi0KLQkgaWYgKGIueDEgPiBiLngyIHx8Ci0JICAgICBiLnkxID4gYi55MiB8fAotCSAgICAgYi54MiA+IGludGVsU2NyZWVuLT53aWR0aCB8fAotCSAgICAgYi55MiA+IGludGVsU2NyZWVuLT5oZWlnaHQpCi0JICAgIGNvbnRpbnVlOwotCi0JIGlmICggZmxhZ3MgJiBCVUZGRVJfQklUX0ZST05UX0xFRlQgKSB7CSAgICAKLQkgICAgQkVHSU5fQkFUQ0goNiwgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTKTsKLQkgICAgT1VUX0JBVENIKCBGUk9OVF9DTUQgKTsKLQkgICAgT1VUX0JBVENIKCBmcm9udF9waXRjaCB8IEJSMTMgKTsKLQkgICAgT1VUX0JBVENIKCAoYi55MSA8PCAxNikgfCBiLngxICk7Ci0JICAgIE9VVF9CQVRDSCggKGIueTIgPDwgMTYpIHwgYi54MiApOwotCSAgICBPVVRfQkFUQ0goIGJtQnVmZmVyT2Zmc2V0KGludGVsLCBmcm9udC0+YnVmZmVyKSApOwotCSAgICBPVVRfQkFUQ0goIGNsZWFyX2NvbG9yICk7Ci0JICAgIEFEVkFOQ0VfQkFUQ0goKTsKLQkgfQotCi0JIGlmICggZmxhZ3MgJiBCVUZGRVJfQklUX0JBQ0tfTEVGVCApIHsKLQkgICAgQkVHSU5fQkFUQ0goNiwgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTKTsgCi0JICAgIE9VVF9CQVRDSCggQkFDS19DTUQgKTsKLQkgICAgT1VUX0JBVENIKCBiYWNrX3BpdGNoIHwgQlIxMyApOwotCSAgICBPVVRfQkFUQ0goIChiLnkxIDw8IDE2KSB8IGIueDEgKTsKLQkgICAgT1VUX0JBVENIKCAoYi55MiA8PCAxNikgfCBiLngyICk7Ci0JICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIGJhY2stPmJ1ZmZlcikgKTsKLQkgICAgT1VUX0JBVENIKCBjbGVhcl9jb2xvciApOwotCSAgICBBRFZBTkNFX0JBVENIKCk7Ci0JIH0KLQotCSBpZiAoIGZsYWdzICYgKEJVRkZFUl9CSVRfU1RFTkNJTCB8IEJVRkZFUl9CSVRfREVQVEgpICkgewotCSAgICBCRUdJTl9CQVRDSCg2LCBJTlRFTF9CQVRDSF9OT19DTElQUkVDVFMpOwotCSAgICBPVVRfQkFUQ0goIERFUFRIX0NNRCApOwotCSAgICBPVVRfQkFUQ0goIGRlcHRoX3BpdGNoIHwgQlIxMyApOwotCSAgICBPVVRfQkFUQ0goIChiLnkxIDw8IDE2KSB8IGIueDEgKTsKLQkgICAgT1VUX0JBVENIKCAoYi55MiA8PCAxNikgfCBiLngyICk7Ci0JICAgIE9VVF9CQVRDSCggYm1CdWZmZXJPZmZzZXQoaW50ZWwsIGRlcHRoLT5idWZmZXIpICk7Ci0JICAgIE9VVF9CQVRDSCggY2xlYXJfZGVwdGggKTsKLQkgICAgQURWQU5DRV9CQVRDSCgpOwotCSB9ICAgICAgCi0gICAgICB9Ci0gICB9Ci0gICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaCggaW50ZWwtPmJhdGNoICk7Ci0gICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci19Ci0KLQotCi0jZGVmaW5lIEJSMTNfNTY1ICAweDEKLSNkZWZpbmUgQlIxM184ODg4IDB4MwotCi0KLXZvaWQKLWludGVsRW1pdEltbWVkaWF0ZUNvbG9yRXhwYW5kQmxpdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJICBHTHVpbnQgY3BwLAotCQkJCSAgR0x1Ynl0ZSAqc3JjX2JpdHMsIEdMdWludCBzcmNfc2l6ZSwKLQkJCQkgIEdMdWludCBmZ19jb2xvciwKLQkJCQkgIEdMc2hvcnQgZHN0X3BpdGNoLAotCQkJCSAgc3RydWN0IGJ1ZmZlciAqZHN0X2J1ZmZlciwKLQkJCQkgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJCSAgR0xib29sZWFuIGRzdF90aWxlZCwKLQkJCQkgIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCAKLQkJCQkgIEdMc2hvcnQgdywgR0xzaG9ydCBoLAotCQkJCSAgR0xlbnVtIGxvZ2ljX29wKQotewotICAgc3RydWN0IHh5X3NldHVwX2JsaXQgc2V0dXA7Ci0gICBzdHJ1Y3QgeHlfdGV4dF9pbW1lZGlhdGVfYmxpdCB0ZXh0OwotICAgaW50IGR3b3JkcyA9ICgoc3JjX3NpemUgKyA3KSAmIH43KSAvIDQ7Ci0KLSAgIGFzc2VydCggbG9naWNfb3AgLSBHTF9DTEVBUiA+PSAwICk7Ci0gICBhc3NlcnQoIGxvZ2ljX29wIC0gR0xfQ0xFQVIgPCAweDEwICk7Ci0KLSAgIGlmICh3IDwgMCB8fCBoIDwgMCkgCi0gICAgICByZXR1cm47Ci0KLSAgIGRzdF9waXRjaCAqPSBjcHA7Ci0KLSAgIGlmIChkc3RfdGlsZWQpIAotICAgICAgZHN0X3BpdGNoIC89IDQ7Ci0KLSAgIERCRygiJXMgZHN0OmJ1ZiglcCkvJWQrJWQgJWQsJWQgc3o6JWR4JWQsICVkIGJ5dGVzICVkIGR3b3Jkc1xuIiwKLSAgICAgICBfX0ZVTkNUSU9OX18sCi0gICAgICAgZHN0X2J1ZmZlciwgZHN0X3BpdGNoLCBkc3Rfb2Zmc2V0LCB4LCB5LCB3LCBoLCBzcmNfc2l6ZSwgZHdvcmRzKTsKLQotICAgbWVtc2V0KCZzZXR1cCwgMCwgc2l6ZW9mKHNldHVwKSk7Ci0gICAKLSAgIHNldHVwLmJyMC5jbGllbnQgPSBDTElFTlRfMkQ7Ci0gICBzZXR1cC5icjAub3Bjb2RlID0gT1BDT0RFX1hZX1NFVFVQX0JMVDsKLSAgIHNldHVwLmJyMC53cml0ZV9hbHBoYSA9IChjcHAgPT0gNCk7Ci0gICBzZXR1cC5icjAud3JpdGVfcmdiID0gKGNwcCA9PSA0KTsKLSAgIHNldHVwLmJyMC5kc3RfdGlsZWQgPSBkc3RfdGlsZWQ7Ci0gICBzZXR1cC5icjAubGVuZ3RoID0gKHNpemVvZihzZXR1cCkgLyBzaXplb2YoaW50KSkgLSAyOwotICAgICAgCi0gICBzZXR1cC5icjEzLmRlc3RfcGl0Y2ggPSBkc3RfcGl0Y2g7Ci0gICBzZXR1cC5icjEzLnJvcCA9IHRyYW5zbGF0ZV9yYXN0ZXJfb3AobG9naWNfb3ApOwotICAgc2V0dXAuYnIxMy5jb2xvcl9kZXB0aCA9IChjcHAgPT0gNCkgPyBCUjEzXzg4ODggOiBCUjEzXzU2NTsKLSAgIHNldHVwLmJyMTMuY2xpcHBpbmdfZW5hYmxlID0gMDsKLSAgIHNldHVwLmJyMTMubW9ub19zb3VyY2VfdHJhbnNwYXJlbmN5ID0gMTsKLQotICAgc2V0dXAuZHcyLmNsaXBfeTEgPSAwOwotICAgc2V0dXAuZHcyLmNsaXBfeDEgPSAwOwotICAgc2V0dXAuZHczLmNsaXBfeTIgPSAxMDA7Ci0gICBzZXR1cC5kdzMuY2xpcF94MiA9IDEwMDsKLQotICAgc2V0dXAuZGVzdF9iYXNlX2FkZHIgPSBibUJ1ZmZlck9mZnNldChpbnRlbCwgZHN0X2J1ZmZlcikgKyBkc3Rfb2Zmc2V0OwotICAgc2V0dXAuYmFja2dyb3VuZF9jb2xvciA9IDA7Ci0gICBzZXR1cC5mb3JlZ3JvdW5kX2NvbG9yID0gZmdfY29sb3I7Ci0gICBzZXR1cC5wYXR0ZXJuX2Jhc2VfYWRkciA9IDA7Ci0KLSAgIG1lbXNldCgmdGV4dCwgMCwgc2l6ZW9mKHRleHQpKTsKLSAgIHRleHQuZHcwLmNsaWVudCA9IENMSUVOVF8yRDsKLSAgIHRleHQuZHcwLm9wY29kZSA9IE9QQ09ERV9YWV9URVhUX0lNTUVESUFURV9CTFQ7Ci0gICB0ZXh0LmR3MC5wYWQwID0gMDsKLSAgIHRleHQuZHcwLmJ5dGVfcGFja2VkID0gMTsJLyogP21heWJlPyAqLwotICAgdGV4dC5kdzAucGFkMSA9IDA7Ci0gICB0ZXh0LmR3MC5kc3RfdGlsZWQgPSBkc3RfdGlsZWQ7Ci0gICB0ZXh0LmR3MC5wYWQyID0gMDsKLSAgIHRleHQuZHcwLmxlbmd0aCA9IChzaXplb2YodGV4dCkvc2l6ZW9mKGludCkpIC0gMiArIGR3b3JkczsKLSAgIHRleHQuZHcxLmRlc3RfeTEgPSB5OwkvKiBkdXBsaWNhdGVzIGluZm8gaW4gc2V0dXAgYmxpdCAqLwotICAgdGV4dC5kdzEuZGVzdF94MSA9IHg7Ci0gICB0ZXh0LmR3Mi5kZXN0X3kyID0geSArIGg7Ci0gICB0ZXh0LmR3Mi5kZXN0X3gyID0geCArIHc7Ci0KLSAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoIGludGVsLT5iYXRjaCwKLQkJCQkgICAgc2l6ZW9mKHNldHVwKSArIAotCQkJCSAgICBzaXplb2YodGV4dCkgKyAKLQkJCQkgICAgZHdvcmRzLAotCQkJCSAgICBJTlRFTF9CQVRDSF9OT19DTElQUkVDVFMgKTsKLQotICAgaW50ZWxfYmF0Y2hidWZmZXJfZGF0YSggaW50ZWwtPmJhdGNoLAotCQkJICAgJnNldHVwLAotCQkJICAgc2l6ZW9mKHNldHVwKSwKLQkJCSAgIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyApOwotCi0gICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKCBpbnRlbC0+YmF0Y2gsCi0JCQkgICAmdGV4dCwKLQkJCSAgIHNpemVvZih0ZXh0KSwKLQkJCSAgIElOVEVMX0JBVENIX05PX0NMSVBSRUNUUyApOwotCi0gICBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKCBpbnRlbC0+YmF0Y2gsCi0JCQkgICBzcmNfYml0cywKLQkJCSAgIGR3b3JkcyAqIDQsCi0JCQkgICBJTlRFTF9CQVRDSF9OT19DTElQUkVDVFMgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9ibGl0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JsaXQuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kZDZjOGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9ibGl0LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfYmxpdC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9ibGl0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JsaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2MTU0NS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2JsaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5URUxfQkxJVF9ICi0jZGVmaW5lIElOVEVMX0JMSVRfSAotCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0KLXN0cnVjdCBidWZmZXI7Ci0KLWV4dGVybiB2b2lkIGludGVsQ29weUJ1ZmZlciggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRwcml2LAotCQkJICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKnJlY3QgKTsKLWV4dGVybiB2b2lkIGludGVsQ2xlYXJXaXRoQmxpdChHTGNvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBtYXNrKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxFbWl0Q29weUJsaXQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgICAgICBHTHVpbnQgY3BwLAotCQkJICAgICAgIEdMc2hvcnQgc3JjX3BpdGNoLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXIgKnNyY19idWZmZXIsCi0JCQkgICAgICAgR0x1aW50ICBzcmNfb2Zmc2V0LAotCQkJICAgICAgIEdMYm9vbGVhbiBzcmNfdGlsZWQsCi0JCQkgICAgICAgR0xzaG9ydCBkc3RfcGl0Y2gsCi0JCQkgICAgICAgc3RydWN0IGJ1ZmZlciAqZHN0X2J1ZmZlciwKLQkJCSAgICAgICBHTHVpbnQgIGRzdF9vZmZzZXQsCi0JCQkgICAgICAgR0xib29sZWFuIGRzdF90aWxlZCwKLQkJCSAgICAgICBHTHNob3J0IHNyY3gsIEdMc2hvcnQgc3JjeSwKLQkJCSAgICAgICBHTHNob3J0IGRzdHgsIEdMc2hvcnQgZHN0eSwKLQkJCSAgICAgICBHTHNob3J0IHcsIEdMc2hvcnQgaCwKLQkJCSAgICAgICBHTGVudW0gbG9naWNfb3AgKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxFbWl0RmlsbEJsaXQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgICAgICBHTHVpbnQgY3BwLAotCQkJICAgICAgIEdMc2hvcnQgZHN0X3BpdGNoLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXIgKmRzdF9idWZmZXIsCi0JCQkgICAgICAgR0x1aW50IGRzdF9vZmZzZXQsCi0JCQkgICAgICAgR0xib29sZWFuIGRzdF90aWxlZCwKLQkJCSAgICAgICBHTHNob3J0IHgsIEdMc2hvcnQgeSwgCi0JCQkgICAgICAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQkgICAgICAgR0x1aW50IGNvbG9yICk7Ci0KLXZvaWQKLWludGVsRW1pdEltbWVkaWF0ZUNvbG9yRXhwYW5kQmxpdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJICBHTHVpbnQgY3BwLAotCQkJCSAgR0x1Ynl0ZSAqc3JjX2JpdHMsIEdMdWludCBzcmNfc2l6ZSwKLQkJCQkgIEdMdWludCBmZ19jb2xvciwKLQkJCQkgIEdMc2hvcnQgZHN0X3BpdGNoLAotCQkJCSAgc3RydWN0IGJ1ZmZlciAqZHN0X2J1ZmZlciwKLQkJCQkgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJCSAgR0xib29sZWFuIGRzdF90aWxlZCwKLQkJCQkgIEdMc2hvcnQgZHN0X3gsIEdMc2hvcnQgZHN0X3ksIAotCQkJCSAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCi0JCQkJICBHTGVudW0gbG9naWNfb3AgKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNWU0MzMuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9idWZmZXJfb2JqZWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJidWZmZXJvYmouaCIKLQotI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKLSNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgotI2luY2x1ZGUgImJ1Zm1nci5oIgotCi0KLS8qKgotICogVGhlcmUgaXMgc29tZSBkdXBsaWNhdGlvbiBiZXR3ZWVuIG1lc2EncyBidWZmZXJvYmplY3RzIGFuZCBvdXIKLSAqIGJ1Zm1nciBidWZmZXJzLiAgQm90aCBoYXZlIGFuIGludGVnZXIgaGFuZGxlIGFuZCBhIGhhc2h0YWJsZSB0bwotICogbG9va3VwIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBoYW5kbGVzIGFuZAotICogaW50ZXJuYWwgc3RydWN0dXJlIHdoZXJlIHNvbWVob3cgc2hhcmVkLgotICovCi1zdGF0aWMgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmludGVsX2J1ZmZlcm9ial9hbGxvYyggR0xjb250ZXh0ICpjdHgsIAotCQkJCQkJICAgICAgIEdMdWludCBuYW1lLCAKLQkJCQkJCSAgICAgICBHTGVudW0gdGFyZ2V0ICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICpvYmogPSBNQUxMT0NfU1RSVUNUKGludGVsX2J1ZmZlcl9vYmplY3QpOwotCi0gICBfbWVzYV9pbml0aWFsaXplX2J1ZmZlcl9vYmplY3QoJm9iai0+QmFzZSwgbmFtZSwgdGFyZ2V0KTsKLQotICAgLyogWFhYOiAgV2UgZ2VuZXJhdGUgb3VyIG93biBoYW5kbGUsIHdoaWNoIGlzIGRpZmZlcmVudCB0byAnbmFtZScgYWJvdmUuCi0gICAgKi8KLSAgIGJtR2VuQnVmZmVycyhpbnRlbCwgImJ1ZmZlcm9iaiIsIDEsICZvYmotPmJ1ZmZlciwgNik7Ci0gICBhc3NlcnQob2JqLT5idWZmZXIpOwotCi0gICByZXR1cm4gJm9iai0+QmFzZTsKLX0KLQotCi0vKioKLSAqIERlYWxsb2NhdGUvZnJlZSBhIHZlcnRleC9waXhlbCBidWZmZXIgb2JqZWN0LgotICogQ2FsbGVkIHZpYSBnbERlbGV0ZUJ1ZmZlcnNBUkIoKS4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxfYnVmZmVyb2JqX2ZyZWUoIEdMY29udGV4dCAqY3R4LCAKLQkJCQkgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmogKQoteyAKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7Ci0KLSAgIGFzc2VydChpbnRlbF9vYmopOwotCi0gICBpZiAoaW50ZWxfb2JqLT5idWZmZXIpIAotICAgICAgYm1EZWxldGVCdWZmZXJzKCBpbnRlbCwgMSwgJmludGVsX29iai0+YnVmZmVyICk7Ci0gIAotICAgX21lc2FfZnJlZShpbnRlbF9vYmopOwotfQotCi0KLQotLyoqCi0gKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIHN0b3JlIGRhdGEgaW4gYSBidWZmZXIgb2JqZWN0LiAgQW55IGRhdGEgdGhhdCB3YXMKLSAqIHByZXZpb3VzbHkgc3RvcmVkIGluIHRoZSBidWZmZXIgb2JqZWN0IGlzIGxvc3QuICBJZiBkYXRhIGlzIE5VTEwsCi0gKiBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQsIGJ1dCBubyBjb3B5IHdpbGwgb2NjdXIuCi0gKiBDYWxsZWQgdmlhIGdsQnVmZmVyRGF0YUFSQigpLgotICovCi1zdGF0aWMgdm9pZCBpbnRlbF9idWZmZXJvYmpfZGF0YSggR0xjb250ZXh0ICpjdHgsIAotCQkJCSAgR0xlbnVtIHRhcmdldCwgCi0JCQkJICBHTHNpemVpcHRyQVJCIHNpemUsCi0JCQkJICBjb25zdCBHTHZvaWQgKmRhdGEsIAotCQkJCSAgR0xlbnVtIHVzYWdlLAotCQkJCSAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaiApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7Ci0gICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqaW50ZWxfb2JqID0gaW50ZWxfYnVmZmVyX29iamVjdChvYmopOwotCi0gICAvKiBYWFg6IGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCAndXNhZ2UnIChlZy4gcG9wdWxhdGUgZmxhZ3MKLSAgICAqIGFyZ3VtZW50IGJlbG93KQotICAgICovCi0gICBhc3NlcnQoaW50ZWxfb2JqKTsKLQotICAgb2JqLT5TaXplID0gc2l6ZTsKLSAgIG9iai0+VXNhZ2UgPSB1c2FnZTsKLQotICAgYm1CdWZmZXJEYXRhQVVCKGludGVsLCBpbnRlbF9vYmotPmJ1ZmZlciwgc2l6ZSwgZGF0YSwgMCwKLQkJICAgMCwgMCk7Ci19Ci0KLQotLyoqCi0gKiBSZXBsYWNlIGRhdGEgaW4gYSBzdWJyYW5nZSBvZiBidWZmZXIgb2JqZWN0LiAgSWYgdGhlIGRhdGEgcmFuZ2UKLSAqIHNwZWNpZmllZCBieSBzaXplICsgb2Zmc2V0IGV4dGVuZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBvcgotICogaWYgZGF0YSBpcyBOVUxMLCBubyBjb3B5IGlzIHBlcmZvcm1lZC4KLSAqIENhbGxlZCB2aWEgZ2xCdWZmZXJTdWJEYXRhQVJCKCkuCi0gKi8KLXN0YXRpYyB2b2lkIGludGVsX2J1ZmZlcm9ial9zdWJkYXRhKCBHTGNvbnRleHQgKmN0eCwgCi0JCQkJICAgICBHTGVudW0gdGFyZ2V0LCAKLQkJCQkgICAgIEdMaW50cHRyQVJCIG9mZnNldCwKLQkJCQkgICAgIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgCi0JCQkJICAgICBjb25zdCBHTHZvaWQgKiBkYXRhLAotCQkJCSAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKiBvYmogKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaiA9IGludGVsX2J1ZmZlcl9vYmplY3Qob2JqKTsKLQotICAgYXNzZXJ0KGludGVsX29iaik7Ci0gICBibUJ1ZmZlclN1YkRhdGFBVUIoaW50ZWwsIGludGVsX29iai0+YnVmZmVyLCBvZmZzZXQsIHNpemUsIGRhdGEsIDAsIDApOwotfQotCi0KLS8qKgotICogQ2FsbGVkIHZpYSBnbEdldEJ1ZmZlclN1YkRhdGFBUkIoKS4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxfYnVmZmVyb2JqX2dldF9zdWJkYXRhKCBHTGNvbnRleHQgKmN0eCwgCi0JCQkJCSBHTGVudW0gdGFyZ2V0LCAKLQkJCQkJIEdMaW50cHRyQVJCIG9mZnNldCwKLQkJCQkJIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgCi0JCQkJCSBHTHZvaWQgKiBkYXRhLAotCQkJCQkgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKiBvYmogKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaiA9IGludGVsX2J1ZmZlcl9vYmplY3Qob2JqKTsKLQotICAgYXNzZXJ0KGludGVsX29iaik7Ci0gICBibUJ1ZmZlckdldFN1YkRhdGEoaW50ZWwsIGludGVsX29iai0+YnVmZmVyLCBvZmZzZXQsIHNpemUsIGRhdGEpOwotfQotCi0KLQotLyoqCi0gKiBDYWxsZWQgdmlhIGdsTWFwQnVmZmVyQVJCKCkuCi0gKi8KLXN0YXRpYyB2b2lkICppbnRlbF9idWZmZXJvYmpfbWFwKCBHTGNvbnRleHQgKmN0eCwgCi0JCQkJICBHTGVudW0gdGFyZ2V0LCAKLQkJCQkgIEdMZW51bSBhY2Nlc3MsCi0JCQkJICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7Ci0KLSAgIC8qIFhYWDogVHJhbnNsYXRlIGFjY2VzcyB0byBmbGFncyBhcmcgYmVsb3c6Ci0gICAgKi8KLSAgIGFzc2VydChpbnRlbF9vYmopOwotICAgYXNzZXJ0KGludGVsX29iai0+YnVmZmVyKTsKLSAgIG9iai0+UG9pbnRlciA9IGJtTWFwQnVmZmVyKGludGVsLCBpbnRlbF9vYmotPmJ1ZmZlciwgMCk7Ci0gICByZXR1cm4gb2JqLT5Qb2ludGVyOwotfQotCi0KLS8qKgotICogQ2FsbGVkIHZpYSBnbE1hcEJ1ZmZlckFSQigpLgotICovCi1zdGF0aWMgR0xib29sZWFuIGludGVsX2J1ZmZlcm9ial91bm1hcCggR0xjb250ZXh0ICpjdHgsCi0JCQkJCUdMZW51bSB0YXJnZXQsCi0JCQkJCXN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmogKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaiA9IGludGVsX2J1ZmZlcl9vYmplY3Qob2JqKTsKLQotICAgYXNzZXJ0KGludGVsX29iaik7Ci0gICBhc3NlcnQoaW50ZWxfb2JqLT5idWZmZXIpOwotICAgYXNzZXJ0KG9iai0+UG9pbnRlcik7Ci0gICBibVVubWFwQnVmZmVyQVVCKGludGVsLCBpbnRlbF9vYmotPmJ1ZmZlciwgMCwgMCk7Ci0gICBvYmotPlBvaW50ZXIgPSBOVUxMOwotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0cnVjdCBidWZmZXIgKmludGVsX2J1ZmZlcm9ial9idWZmZXIoIGNvbnN0IHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogKQotewotICAgYXNzZXJ0KGludGVsX29iai0+QmFzZS5OYW1lKTsKLSAgIGFzc2VydChpbnRlbF9vYmotPmJ1ZmZlcik7Ci0gICByZXR1cm4gaW50ZWxfb2JqLT5idWZmZXI7Ci19ICAKLQotdm9pZCBpbnRlbF9idWZmZXJvYmpfaW5pdCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0KLSAgIGN0eC0+RHJpdmVyLk5ld0J1ZmZlck9iamVjdCA9IGludGVsX2J1ZmZlcm9ial9hbGxvYzsKLSAgIGN0eC0+RHJpdmVyLkRlbGV0ZUJ1ZmZlciA9IGludGVsX2J1ZmZlcm9ial9mcmVlOwotICAgY3R4LT5Ecml2ZXIuQnVmZmVyRGF0YSA9IGludGVsX2J1ZmZlcm9ial9kYXRhOwotICAgY3R4LT5Ecml2ZXIuQnVmZmVyU3ViRGF0YSA9IGludGVsX2J1ZmZlcm9ial9zdWJkYXRhOwotICAgY3R4LT5Ecml2ZXIuR2V0QnVmZmVyU3ViRGF0YSA9IGludGVsX2J1ZmZlcm9ial9nZXRfc3ViZGF0YTsKLSAgIGN0eC0+RHJpdmVyLk1hcEJ1ZmZlciA9IGludGVsX2J1ZmZlcm9ial9tYXA7Ci0gICBjdHgtPkRyaXZlci5Vbm1hcEJ1ZmZlciA9IGludGVsX2J1ZmZlcm9ial91bm1hcDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVyX29iamVjdHMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVyX29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lMDZkZDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9idWZmZXJfb2JqZWN0cy5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX2J1ZmZlcl9vYmplY3RzLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcnMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU1YzAzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgotI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKLSNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKLQotR0xib29sZWFuIGludGVsX2ludGVyc2VjdF9jbGlwcmVjdHMoIGRybV9jbGlwX3JlY3RfdCAqZHN0LAotCQkJCSAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICphLAotCQkJCSAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpiICkKLXsKLSAgIGRzdC0+eDEgPSBNQVgyKGEtPngxLCBiLT54MSk7Ci0gICBkc3QtPngyID0gTUlOMihhLT54MiwgYi0+eDIpOwotICAgZHN0LT55MSA9IE1BWDIoYS0+eTEsIGItPnkxKTsKLSAgIGRzdC0+eTIgPSBNSU4yKGEtPnkyLCBiLT55Mik7Ci0KLSAgIHJldHVybiAoZHN0LT54MSA8PSBkc3QtPngyICYmCi0JICAgZHN0LT55MSA8PSBkc3QtPnkyKTsKLX0KLQotc3RydWN0IGludGVsX3JlZ2lvbiAqaW50ZWxfZHJhd2J1Zl9yZWdpb24oIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBzd2l0Y2ggKGludGVsLT5jdHguRHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0pIHsKLSAgIGNhc2UgQlVGRkVSX0JJVF9GUk9OVF9MRUZUOgotICAgICAgcmV0dXJuIGludGVsLT5mcm9udF9yZWdpb247Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgotICAgICAgcmV0dXJuIGludGVsLT5iYWNrX3JlZ2lvbjsKLSAgIGRlZmF1bHQ6Ci0gICAgICAvKiBOb3QgbmVjZXNzYXJ5IHRvIGZhbGxiYWNrIC0gY291bGQgaGFuZGxlIGVpdGhlciBOT05FIG9yCi0gICAgICAgKiBGUk9OVF9BTkRfQkFDSyBjYXNlcyBiZWxvdy4KLSAgICAgICAqLwotICAgICAgcmV0dXJuIE5VTEw7CQkKLSAgIH0KLX0KLQotc3RydWN0IGludGVsX3JlZ2lvbiAqaW50ZWxfcmVhZGJ1Zl9yZWdpb24oIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotCi0gICAvKiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgdG8gc3VwcG9ydCBFWFRfZmJvJ3MsIGJ1dCBpcyBjb3JyZWN0Ci0gICAgKiBmb3Igbm93OgotICAgICovCi0gICBzd2l0Y2ggKGN0eC0+UmVhZEJ1ZmZlci0+X0NvbG9yUmVhZEJ1ZmZlckluZGV4KSB7Ci0gICBjYXNlIEJVRkZFUl9GUk9OVF9MRUZUOgotICAgICAgcmV0dXJuIGludGVsLT5mcm9udF9yZWdpb247Ci0gICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6Ci0gICAgICByZXR1cm4gaW50ZWwtPmJhY2tfcmVnaW9uOwotICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCgwKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0KLQotc3RhdGljIHZvaWQgaW50ZWxCdWZmZXJTaXplKEdMZnJhbWVidWZmZXIgKmJ1ZmZlciwKLQkJCSAgICBHTHVpbnQgKndpZHRoLCAKLQkJCSAgICBHTHVpbnQgKmhlaWdodCkKLXsKLSAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIC8qIE5lZWQgdG8gbG9jayB0byBtYWtlIHN1cmUgdGhlIGRyaURyYXdhYmxlIGlzIHVwdG9kYXRlLiAgVGhpcwotICAgICogaW5mb3JtYXRpb24gaXMgdXNlZCB0byByZXNpemUgTWVzYSdzIHNvZnR3YXJlIGJ1ZmZlcnMsIHNvIGl0IGhhcwotICAgICogdG8gYmUgY29ycmVjdC4KLSAgICAqLwotICAgTE9DS19IQVJEV0FSRShpbnRlbCk7Ci0gICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlKSB7Ci0gICAgICAqd2lkdGggPSBpbnRlbC0+ZHJpRHJhd2FibGUtPnc7Ci0gICAgICAqaGVpZ2h0ID0gaW50ZWwtPmRyaURyYXdhYmxlLT5oOwotICAgfQotICAgZWxzZSB7Ci0gICAgICAqd2lkdGggPSAwOwotICAgICAgKmhlaWdodCA9IDA7Ci0gICB9Ci0gICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsU2V0RnJvbnRDbGlwUmVjdHMoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0KLSAgIGlmICghZFByaXYpIHJldHVybjsKLQotICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1DbGlwUmVjdHM7Ci0gICBpbnRlbC0+cENsaXBSZWN0cyA9IGRQcml2LT5wQ2xpcFJlY3RzOwotICAgaW50ZWwtPmRyYXdYID0gZFByaXYtPng7Ci0gICBpbnRlbC0+ZHJhd1kgPSBkUHJpdi0+eTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbnRlbFNldEJhY2tDbGlwUmVjdHMoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7Ci0KLSAgIGlmICghZFByaXYpIHJldHVybjsKLQotICAgaWYgKGludGVsLT5zYXJlYS0+cGZfZW5hYmxlZCA9PSAwICYmIGRQcml2LT5udW1CYWNrQ2xpcFJlY3RzID09IDApIHsKLSAgICAgIGludGVsLT5udW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwotICAgICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgICAgIGludGVsLT5kcmF3WCA9IGRQcml2LT54OwotICAgICAgaW50ZWwtPmRyYXdZID0gZFByaXYtPnk7Ci0gICB9IGVsc2UgewotICAgICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1CYWNrQ2xpcFJlY3RzOwotICAgICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cEJhY2tDbGlwUmVjdHM7Ci0gICAgICBpbnRlbC0+ZHJhd1ggPSBkUHJpdi0+YmFja1g7Ci0gICAgICBpbnRlbC0+ZHJhd1kgPSBkUHJpdi0+YmFja1k7Ci0gICAgICAKLSAgICAgIGlmIChkUHJpdi0+bnVtQmFja0NsaXBSZWN0cyA9PSAxICYmCi0JICBkUHJpdi0+eCA9PSBkUHJpdi0+YmFja1ggJiYKLQkgIGRQcml2LT55ID09IGRQcml2LT5iYWNrWSkgewotICAgICAgCi0JIC8qIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJhY2sgY2xpcHJlY3QgZGltZW5zaW9ucyBoZXJlCi0JICAqIGFzIGVhcmx5IHZlcnNpb25zIG9mIGRyaS5hIGluIHRoZSBYc2VydmVyIGFyZSBpbmNvcnJlY3QuICBUcnkKLQkgICogdmVyeSBoYXJkIG5vdCB0byByZXN0cmljdCBmdXR1cmUgdmVyc2lvbnMgb2YgZHJpLmEgd2hpY2gKLQkgICogbWlnaHQgZWcuIGFsbG9jYXRlIHRydWx5IHByaXZhdGUgYmFjayBidWZmZXJzLgotCSAgKi8KLQkgaW50IHgxLCB5MTsKLQkgaW50IHgyLCB5MjsKLQkgCi0JIHgxID0gZFByaXYtPng7Ci0JIHkxID0gZFByaXYtPnk7ICAgICAgCi0JIHgyID0gZFByaXYtPnggKyBkUHJpdi0+dzsKLQkgeTIgPSBkUHJpdi0+eSArIGRQcml2LT5oOwotCSAKLQkgaWYgKHgxIDwgMCkgeDEgPSAwOwotCSBpZiAoeTEgPCAwKSB5MSA9IDA7Ci0JIGlmICh4MiA+IGludGVsLT5pbnRlbFNjcmVlbi0+d2lkdGgpIHgyID0gaW50ZWwtPmludGVsU2NyZWVuLT53aWR0aDsKLQkgaWYgKHkyID4gaW50ZWwtPmludGVsU2NyZWVuLT5oZWlnaHQpIHkyID0gaW50ZWwtPmludGVsU2NyZWVuLT5oZWlnaHQ7Ci0KLQkgaWYgKHgxID09IGRQcml2LT5wQmFja0NsaXBSZWN0c1swXS54MSAmJgotCSAgICAgeTEgPT0gZFByaXYtPnBCYWNrQ2xpcFJlY3RzWzBdLnkxKSB7Ci0KLQkgICAgZFByaXYtPnBCYWNrQ2xpcFJlY3RzWzBdLngyID0geDI7Ci0JICAgIGRQcml2LT5wQmFja0NsaXBSZWN0c1swXS55MiA9IHkyOwotCSB9Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotdm9pZCBpbnRlbFdpbmRvd01vdmVkKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOwotCi0gICBpZiAoIWludGVsLT5jdHguRHJhd0J1ZmZlcikgewotICAgICAgaW50ZWxTZXRGcm9udENsaXBSZWN0cyggaW50ZWwgKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgc3dpdGNoIChpbnRlbC0+Y3R4LkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdKSB7Ci0gICAgICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKLQkgaW50ZWxTZXRGcm9udENsaXBSZWN0cyggaW50ZWwgKTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgotCSBpbnRlbFNldEJhY2tDbGlwUmVjdHMoIGludGVsICk7Ci0JIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkgLyogZ2xEcmF3QnVmZmVyKEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0spOiBzb2Z0d2FyZSBmYWxsYmFjayAqLwotCSBpbnRlbFNldEZyb250Q2xpcFJlY3RzKCBpbnRlbCApOwotICAgICAgfQotICAgfQotCi0gICBfbWVzYV9yZXNpemVfZnJhbWVidWZmZXIoJmludGVsLT5jdHgsCi0JCQkgICAgKEdMZnJhbWVidWZmZXIqKWRQcml2LT5kcml2ZXJQcml2YXRlLAotCQkJICAgIGRQcml2LT53LCBkUHJpdi0+aCk7Ci0KLSAgIC8qIFNldCBzdGF0ZSB3ZSBrbm93IGRlcGVuZHMgb24gZHJhd2FibGUgcGFyYW1ldGVyczoKLSAgICAqLwotICAgewotICAgICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKLQotICAgICAgaWYgKGN0eC0+RHJpdmVyLlNjaXNzb3IpCi0JIGN0eC0+RHJpdmVyLlNjaXNzb3IoIGN0eCwgY3R4LT5TY2lzc29yLlgsIGN0eC0+U2Npc3Nvci5ZLAotCQkJICAgICAgY3R4LT5TY2lzc29yLldpZHRoLCBjdHgtPlNjaXNzb3IuSGVpZ2h0ICk7Ci0gICAgICAKLSAgICAgIGlmIChjdHgtPkRyaXZlci5EZXB0aFJhbmdlKQotCSBjdHgtPkRyaXZlci5EZXB0aFJhbmdlKCBjdHgsIAotCQkJCSBjdHgtPlZpZXdwb3J0Lk5lYXIsCi0JCQkJIGN0eC0+Vmlld3BvcnQuRmFyICk7Ci0KLSAgICAgIGludGVsLT5OZXdHTFN0YXRlIHw9IF9ORVdfU0NJU1NPUjsKLSAgIH0KLQotICAgLyogVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBsb2NrIGlzIGFsd2F5cyBncmFiYmVkIGJlZm9yZSBlbWl0dGluZwotICAgICogY29tbWFuZHMgYW5kIGNvbW1hbmRzIGFyZSBhbHdheXMgZmx1c2hlZCBwcmlvciB0byByZWxlYXNpbmcKLSAgICAqIHRoZSBsb2NrLgotICAgICovCi0gICBpbnRlbC0+TmV3R0xTdGF0ZSB8PSBfTkVXX1dJTkRPV19QT1M7IAotfQotCi0KLQotLyogQSB0cnVlIG1ldGEgdmVyc2lvbiBvZiB0aGlzIHdvdWxkIGJlIHZlcnkgc2ltcGxlIGFuZCBhZGRpdGlvbmFsbHkKLSAqIG1hY2hpbmUgaW5kZXBlbmRlbnQuICBNYXliZSB3ZSdsbCBnZXQgdGhlcmUgb25lIGRheS4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxDbGVhcldpdGhUcmlzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCQkgICAgICAgR0xiaXRmaWVsZCBtYXNrKQotewotICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKLSAgIGRybV9jbGlwX3JlY3RfdCBjbGVhcjsKLSAgIEdMaW50IGN4LCBjeSwgY3csIGNoOwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19EUkkpCi0gICAgICBfbWVzYV9wcmludGYoIiVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIG1hc2spOwotCi0gICB7Ci0KLSAgICAgIGludGVsLT52dGJsLmluc3RhbGxfbWV0YV9zdGF0ZShpbnRlbCk7Ci0KLSAgICAgIC8qIEdldCBjbGVhciBib3VuZHMgYWZ0ZXIgbG9ja2luZyAqLwotICAgICAgY3ggPSBjdHgtPkRyYXdCdWZmZXItPl9YbWluOwotICAgICAgY3kgPSBjdHgtPkRyYXdCdWZmZXItPl9ZbWluOwotICAgICAgY3cgPSBjdHgtPkRyYXdCdWZmZXItPl9YbWF4IC0gY3R4LT5EcmF3QnVmZmVyLT5fWG1pbjsKLSAgICAgIGNoID0gY3R4LT5EcmF3QnVmZmVyLT5fWW1heCAtIGN0eC0+RHJhd0J1ZmZlci0+X1ltaW47Ci0KLSAgICAgIGNsZWFyLngxID0gY3g7Ci0gICAgICBjbGVhci55MSA9IGN5OwotICAgICAgY2xlYXIueDIgPSBjeCArIGN3OwotICAgICAgY2xlYXIueTIgPSBjeSArIGNoOwotCi0gICAgICAvKiBCYWNrIGFuZCBzdGVuY2lsIGNsaXByZWN0cyBhcmUgdGhlIHNhbWUuICBUcnkgYW5kIGRvIGJvdGgKLSAgICAgICAqIGJ1ZmZlcnMgYXQgb25jZToKLSAgICAgICAqLwotICAgICAgaWYgKG1hc2sgJiAoQlVGRkVSX0JJVF9CQUNLX0xFRlR8QlVGRkVSX0JJVF9TVEVOQ0lMfEJVRkZFUl9CSVRfREVQVEgpKSB7IAotCSBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcmVnaW9uKGludGVsLCAKLQkJCQkgICAgICBpbnRlbC0+YmFja19yZWdpb24sCi0JCQkJICAgICAgaW50ZWwtPmRlcHRoX3JlZ2lvbiApOwotCi0JIGlmIChtYXNrICYgQlVGRkVSX0JJVF9CQUNLX0xFRlQpCi0JICAgIGludGVsLT52dGJsLm1ldGFfY29sb3JfbWFzayhpbnRlbCwgR0xfVFJVRSApOwotCSBlbHNlCi0JICAgIGludGVsLT52dGJsLm1ldGFfY29sb3JfbWFzayhpbnRlbCwgR0xfRkFMU0UgKTsKLQotCSBpZiAobWFzayAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgCi0JICAgIGludGVsLT52dGJsLm1ldGFfc3RlbmNpbF9yZXBsYWNlKCBpbnRlbCwgCi0JCQkJCSAgICAgIGludGVsLT5jdHguU3RlbmNpbC5Xcml0ZU1hc2tbMF0sIAotCQkJCQkgICAgICBpbnRlbC0+Y3R4LlN0ZW5jaWwuQ2xlYXIpOwotCSBlbHNlCi0JICAgIGludGVsLT52dGJsLm1ldGFfbm9fc3RlbmNpbF93cml0ZShpbnRlbCk7Ci0KLQkgaWYgKG1hc2sgJiBCVUZGRVJfQklUX0RFUFRIKSAKLQkgICAgaW50ZWwtPnZ0YmwubWV0YV9kZXB0aF9yZXBsYWNlKCBpbnRlbCApOwotCSBlbHNlCi0JICAgIGludGVsLT52dGJsLm1ldGFfbm9fZGVwdGhfd3JpdGUoaW50ZWwpOwotICAgICAgCi0JIC8qIFhYWDogVXNpbmcgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTIGhlcmUgaXMgZGFuZ2Vyb3VzIGFzIHRoZQotCSAgKiBkcmF3aW5nIG9yaWdpbiBtYXkgbm90IGJlIGNvcnJlY3RseSBlbWl0dGVkLgotCSAgKi8KLQkgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X3F1YWQoaW50ZWwsIAotCQkJCSAgICBjbGVhci54MSwgY2xlYXIueDIsIAotCQkJCSAgICBjbGVhci55MSwgY2xlYXIueTIsIAotCQkJCSAgICBpbnRlbC0+Y3R4LkRlcHRoLkNsZWFyLAotCQkJCSAgICBpbnRlbC0+Y2xlYXJfY2hhblswXSwgCi0JCQkJICAgIGludGVsLT5jbGVhcl9jaGFuWzFdLCAKLQkJCQkgICAgaW50ZWwtPmNsZWFyX2NoYW5bMl0sIAotCQkJCSAgICBpbnRlbC0+Y2xlYXJfY2hhblszXSwgCi0JCQkJICAgIDAsIDAsIDAsIDApOwotICAgICAgfQotCi0gICAgICAvKiBGcm9udCBtYXkgaGF2ZSBkaWZmZXJlbnQgY2xpcHJlY3RzOiAKLSAgICAgICAqLwotICAgICAgaWYgKG1hc2sgJiBCVUZGRVJfQklUX0ZST05UX0xFRlQpIHsKLQkgaW50ZWwtPnZ0YmwubWV0YV9ub19kZXB0aF93cml0ZShpbnRlbCk7Ci0JIGludGVsLT52dGJsLm1ldGFfbm9fc3RlbmNpbF93cml0ZShpbnRlbCk7Ci0JIGludGVsLT52dGJsLm1ldGFfY29sb3JfbWFzayhpbnRlbCwgR0xfVFJVRSApOwotCSBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcmVnaW9uKGludGVsLCAKLQkJCQkgICAgICBpbnRlbC0+ZnJvbnRfcmVnaW9uLAotCQkJCSAgICAgIGludGVsLT5kZXB0aF9yZWdpb24pOwotCi0JIC8qIFhYWDogVXNpbmcgSU5URUxfQkFUQ0hfTk9fQ0xJUFJFQ1RTIGhlcmUgaXMgZGFuZ2Vyb3VzIGFzIHRoZQotCSAgKiBkcmF3aW5nIG9yaWdpbiBtYXkgbm90IGJlIGNvcnJlY3RseSBlbWl0dGVkLgotCSAgKi8KLQkgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X3F1YWQoaW50ZWwsIAotCQkJCSAgICBjbGVhci54MSwgY2xlYXIueDIsIAotCQkJCSAgICBjbGVhci55MSwgY2xlYXIueTIsIAotCQkJCSAgICAwLAotCQkJCSAgICBpbnRlbC0+Y2xlYXJfY2hhblswXSwgCi0JCQkJICAgIGludGVsLT5jbGVhcl9jaGFuWzFdLCAKLQkJCQkgICAgaW50ZWwtPmNsZWFyX2NoYW5bMl0sIAotCQkJCSAgICBpbnRlbC0+Y2xlYXJfY2hhblszXSwgCi0JCQkJICAgIDAsIDAsIDAsIDApOwotICAgICAgfQotCi0gICAgICBpbnRlbC0+dnRibC5sZWF2ZV9tZXRhX3N0YXRlKCBpbnRlbCApOwotICAgfQotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIGludGVsQ2xlYXIoR0xjb250ZXh0ICpjdHgsIEdMYml0ZmllbGQgbWFzaykKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOwotICAgY29uc3QgR0x1aW50IGNvbG9yTWFzayA9ICooKEdMdWludCAqKSAmY3R4LT5Db2xvci5Db2xvck1hc2spOwotICAgR0xiaXRmaWVsZCB0cmlfbWFzayA9IDA7Ci0gICBHTGJpdGZpZWxkIGJsaXRfbWFzayA9IDA7Ci0gICBHTGJpdGZpZWxkIHN3cmFzdF9tYXNrID0gMDsKLQotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfRFJJKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyAleFxuIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKLQotCi0gICBpZiAobWFzayAmIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkgewotICAgICAgaWYgKGNvbG9yTWFzayA9PSB+MCkgewotCSBibGl0X21hc2sgfD0gQlVGRkVSX0JJVF9GUk9OVF9MRUZUOwotICAgICAgfSAKLSAgICAgIGVsc2UgewotCSB0cmlfbWFzayB8PSBCVUZGRVJfQklUX0ZST05UX0xFRlQ7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChtYXNrICYgQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKLSAgICAgIGlmIChjb2xvck1hc2sgPT0gfjApIHsKLQkgYmxpdF9tYXNrIHw9IEJVRkZFUl9CSVRfQkFDS19MRUZUOwotICAgICAgfSAKLSAgICAgIGVsc2UgewotCSB0cmlfbWFzayB8PSBCVUZGRVJfQklUX0JBQ0tfTEVGVDsKLSAgICAgIH0KLSAgIH0KLQotCi0gICBpZiAobWFzayAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgewotICAgICAgaWYgKCFpbnRlbC0+aHdfc3RlbmNpbCkgewotCSBzd3Jhc3RfbWFzayB8PSBCVUZGRVJfQklUX1NURU5DSUw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoY3R4LT5TdGVuY2lsLldyaXRlTWFza1swXSAmIDB4ZmYpICE9IDB4ZmYgfHwKLQkgICAgICAgaW50ZWwtPmRlcHRoX3JlZ2lvbi0+dGlsZWQpIHsKLQkgdHJpX21hc2sgfD0gQlVGRkVSX0JJVF9TVEVOQ0lMOwotICAgICAgfSAKLSAgICAgIGVsc2UgewotCSBibGl0X21hc2sgfD0gQlVGRkVSX0JJVF9TVEVOQ0lMOwotICAgICAgfQotICAgfQotCi0gICAvKiBEbyBkZXB0aCB3aXRoIHN0ZW5jaWwgaWYgcG9zc2libGUgdG8gYXZvaWQgMm5kIHBhc3Mgb3ZlciB0aGUKLSAgICAqIHNhbWUgYnVmZmVyLgotICAgICovCi0gICBpZiAobWFzayAmIEJVRkZFUl9CSVRfREVQVEgpIHsKLSAgICAgIGlmICgodHJpX21hc2sgJiBCVUZGRVJfQklUX1NURU5DSUwpIHx8Ci0JICBpbnRlbC0+ZGVwdGhfcmVnaW9uLT50aWxlZCkKLQkgdHJpX21hc2sgfD0gQlVGRkVSX0JJVF9ERVBUSDsKLSAgICAgIGVsc2UgCi0JIGJsaXRfbWFzayB8PSBCVUZGRVJfQklUX0RFUFRIOwotICAgfQotCi0gICBzd3Jhc3RfbWFzayB8PSAobWFzayAmIEJVRkZFUl9CSVRfQUNDVU0pOwotCi0gICBpbnRlbEZsdXNoKCBjdHggKTsKLQotICAgaWYgKGJsaXRfbWFzaykKLSAgICAgIGludGVsQ2xlYXJXaXRoQmxpdCggY3R4LCBibGl0X21hc2sgKTsKLQotICAgaWYgKHRyaV9tYXNrKSAKLSAgICAgIGludGVsQ2xlYXJXaXRoVHJpcyggaW50ZWwsIHRyaV9tYXNrICk7Ci0KLSAgIGlmIChzd3Jhc3RfbWFzaykKLSAgICAgIF9zd3Jhc3RfQ2xlYXIoIGN0eCwgc3dyYXN0X21hc2sgKTsKLX0KLQotCi0KLQotCi0KLQotLyogRmxpcCB0aGUgZnJvbnQgJiBiYWNrIGJ1ZmZlcnMKLSAqLwotc3RhdGljIHZvaWQgaW50ZWxQYWdlRmxpcCggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICkKLXsKLSNpZiAwCi0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWw7Ci0gICBpbnQgdG1wLCByZXQ7Ci0KLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0lPQ1RMKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotICAgYXNzZXJ0KGRQcml2KTsKLSAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYpOwotICAgYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSk7Ci0KLSAgIGludGVsID0gKHN0cnVjdCBpbnRlbF9jb250ZXh0ICopIGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQotICAgaW50ZWxGbHVzaCggJmludGVsLT5jdHggKTsKLSAgIExPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0KLSAgIGlmIChkUHJpdi0+cENsaXBSZWN0cykgewotICAgICAgKihkcm1fY2xpcF9yZWN0X3QgKilpbnRlbC0+c2FyZWEtPmJveGVzID0gZFByaXYtPnBDbGlwUmVjdHNbMF07Ci0gICAgICBpbnRlbC0+c2FyZWEtPm5ib3ggPSAxOwotICAgfQotCi0gICByZXQgPSBkcm1Db21tYW5kTm9uZShpbnRlbC0+ZHJpRmQsIERSTV9JODMwX0ZMSVApOyAKLSAgIGlmIChyZXQpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0gICAgICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICB0bXAgPSBpbnRlbC0+c2FyZWEtPmxhc3RfZW5xdWV1ZTsKLSAgIGludGVsUmVmaWxsQmF0Y2hMb2NrZWQoIGludGVsICk7Ci0gICBVTkxPQ0tfSEFSRFdBUkUoIGludGVsICk7Ci0KLQotICAgaW50ZWxTZXREcmF3QnVmZmVyKCAmaW50ZWwtPmN0eCwgaW50ZWwtPmN0eC5Db2xvci5Ecml2ZXJEcmF3QnVmZmVyICk7Ci0jZW5kaWYKLX0KLQotCi12b2lkIGludGVsU3dhcEJ1ZmZlcnMoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApCi17Ci0gICBpZiAoZFByaXYtPmRyaUNvbnRleHRQcml2ICYmIGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSkgewotICAgICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsOwotICAgICAgR0xjb250ZXh0ICpjdHg7Ci0gICAgICBpbnRlbCA9IChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKSBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7Ci0gICAgICBjdHggPSAmaW50ZWwtPmN0eDsKLSAgICAgIGlmIChjdHgtPlZpc3VhbC5kb3VibGVCdWZmZXJNb2RlKSB7Ci0JIF9tZXNhX25vdGlmeVN3YXBCdWZmZXJzKCBjdHggKTsgIC8qIGZsdXNoIHBlbmRpbmcgcmVuZGVyaW5nIGNvbWFuZHMgKi8KLQkgaWYgKCAwIC8qaW50ZWwtPmRvUGFnZUZsaXAqLyApIHsgLyogZG9QYWdlRmxpcCBpcyBuZXZlciBzZXQgISEhICovCi0JICAgIGludGVsUGFnZUZsaXAoIGRQcml2ICk7Ci0JIH0gZWxzZSB7Ci0JICAgIGludGVsQ29weUJ1ZmZlciggZFByaXYsIE5VTEwgKTsKLQkgfQotCSBpZiAoaW50ZWwtPmF1Yl9maWxlKSB7Ci0JICAgIGludGVsRmx1c2goY3R4KTsKLQkgICAgaW50ZWwtPnZ0YmwuYXViX2R1bXBfYm1wKCBpbnRlbCwgMSApOwotCi0JICAgIGludGVsLT5hdWJfd3JhcCA9IDE7Ci0JIH0KLSAgICAgIH0KLSAgIH0gZWxzZSB7Ci0gICAgICAvKiBYWFggdGhpcyBzaG91bGRuJ3QgYmUgYW4gZXJyb3IgYnV0IHdlIGNhbid0IGhhbmRsZSBpdCBmb3Igbm93ICovCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBkcmF3YWJsZSBoYXMgbm8gY29udGV4dCFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICB9Ci19Ci0KLXZvaWQgaW50ZWxDb3B5U3ViQnVmZmVyKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0JCQkgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKQotewotICAgaWYgKGRQcml2LT5kcmlDb250ZXh0UHJpdiAmJiBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpIHsKLSAgICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLSAgICAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7Ci0KLSAgICAgIGlmIChjdHgtPlZpc3VhbC5kb3VibGVCdWZmZXJNb2RlKSB7Ci0JIGRybV9jbGlwX3JlY3RfdCByZWN0OwotCSByZWN0LngxID0geCArIGRQcml2LT54OwotCSByZWN0LnkxID0gKGRQcml2LT5oIC0geSAtIGgpICsgZFByaXYtPnk7Ci0JIHJlY3QueDIgPSByZWN0LngxICsgdzsKLQkgcmVjdC55MiA9IHJlY3QueTEgKyBoOwotCSBfbWVzYV9ub3RpZnlTd2FwQnVmZmVycyggY3R4ICk7ICAvKiBmbHVzaCBwZW5kaW5nIHJlbmRlcmluZyBjb21hbmRzICovCi0JIGludGVsQ29weUJ1ZmZlciggZFByaXYsICZyZWN0ICk7Ci0gICAgICB9Ci0gICB9IGVsc2UgewotICAgICAgLyogWFhYIHRoaXMgc2hvdWxkbid0IGJlIGFuIGVycm9yIGJ1dCB3ZSBjYW4ndCBoYW5kbGUgaXQgZm9yIG5vdyAqLwotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZHJhd2FibGUgaGFzIG5vIGNvbnRleHQhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsRHJhd0J1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUgKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotICAgaW50IGZyb250ID0gMDsKLSAKLSAgIGlmICghY3R4LT5EcmF3QnVmZmVyKQotICAgICAgcmV0dXJuOwotCi0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6Ci0gICAgICBmcm9udCA9IDE7Ci0gICAgICBGQUxMQkFDSyggaW50ZWwsIElOVEVMX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9GQUxTRSApOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgotICAgICAgZnJvbnQgPSAwOwotICAgICAgRkFMTEJBQ0soIGludGVsLCBJTlRFTF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIEZBTExCQUNLKCBpbnRlbCwgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKCBpbnRlbC0+c2FyZWEtPnBmX2N1cnJlbnRfcGFnZSA9PSAxICkgCi0gICAgICBmcm9udCBePSAxOwotICAgCi0gICBpbnRlbFNldEZyb250Q2xpcFJlY3RzKCBpbnRlbCApOwotCi0KLSAgIGlmIChmcm9udCkgewotICAgICAgaWYgKGludGVsLT5kcmF3X3JlZ2lvbiAhPSBpbnRlbC0+ZnJvbnRfcmVnaW9uKSB7Ci0JIGludGVsX3JlZ2lvbl9yZWxlYXNlKGludGVsLCAmaW50ZWwtPmRyYXdfcmVnaW9uKTsKLQkgaW50ZWxfcmVnaW9uX3JlZmVyZW5jZSgmaW50ZWwtPmRyYXdfcmVnaW9uLCBpbnRlbC0+ZnJvbnRfcmVnaW9uKTsKLSAgICAgIH0KLSAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaW50ZWwtPmRyYXdfcmVnaW9uICE9IGludGVsLT5iYWNrX3JlZ2lvbikgewotCSBpbnRlbF9yZWdpb25fcmVsZWFzZShpbnRlbCwgJmludGVsLT5kcmF3X3JlZ2lvbik7Ci0JIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoJmludGVsLT5kcmF3X3JlZ2lvbiwgaW50ZWwtPmJhY2tfcmVnaW9uKTsKLSAgICAgIH0KLSAgIH0KLQotICAgaW50ZWwtPnZ0Ymwuc2V0X2RyYXdfcmVnaW9uKCBpbnRlbCwgCi0JCQkJaW50ZWwtPmRyYXdfcmVnaW9uLAotCQkJCWludGVsLT5kZXB0aF9yZWdpb24pOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbFJlYWRCdWZmZXIoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSApCi17Ci0gICAvKiBub3RoaW5nLCB1bnRpbCB3ZSBpbXBsZW1lbnQgaC93IGdsUmVhZC9Db3B5UGl4ZWxzIG9yIENvcHlUZXhJbWFnZSAqLwotfQotCi0KLQotdm9pZCBpbnRlbEluaXRCdWZmZXJGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKQotewotICAgZnVuY3Rpb25zLT5DbGVhciA9IGludGVsQ2xlYXI7Ci0gICBmdW5jdGlvbnMtPkdldEJ1ZmZlclNpemUgPSBpbnRlbEJ1ZmZlclNpemU7Ci0gICBmdW5jdGlvbnMtPkRyYXdCdWZmZXIgPSBpbnRlbERyYXdCdWZmZXI7Ci0gICBmdW5jdGlvbnMtPlJlYWRCdWZmZXIgPSBpbnRlbFJlYWRCdWZmZXI7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcnMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVycy5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmM4NmRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcnMuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9idWZmZXJzLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfY29udGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjUxZmVmLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfY29udGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgIm1hdHJpeC5oIgotI2luY2x1ZGUgInNpbXBsZV9saXN0LmgiCi0jaW5jbHVkZSAiZXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgImZyYW1lYnVmZmVyLmgiCi0jaW5jbHVkZSAiaW1wb3J0cy5oIgotI2luY2x1ZGUgInBvaW50cy5oIgotCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKLSNpbmNsdWRlICJ0bmwvdG5sLmgiCi0jaW5jbHVkZSAidmJvL3Ziby5oIgotCi0jaW5jbHVkZSAidG5sL3RfcGlwZWxpbmUuaCIKLSNpbmNsdWRlICJ0bmwvdF92ZXJ0ZXguaCIKLQotI2luY2x1ZGUgImRyaXZlcnMvY29tbW9uL2RyaXZlcmZ1bmNzLmgiCi0KLSNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKLQotI2luY2x1ZGUgImk4MzBfZHJpLmgiCi0jaW5jbHVkZSAiaTgzMF9jb21tb24uaCIKLQotI2luY2x1ZGUgImludGVsX3RleC5oIgotI2luY2x1ZGUgImludGVsX3NwYW4uaCIKLSNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgotI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCi0jaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgotI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKLSNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgotCi0jaW5jbHVkZSAiYnVmbWdyLmgiCi0KLSNpbmNsdWRlICJ1dGlscy5oIgotI2luY2x1ZGUgInZibGFuay5oIgotI2lmbmRlZiBJTlRFTF9ERUJVRwotaW50IElOVEVMX0RFQlVHID0gKDApOwotI2VuZGlmCi0KLSNkZWZpbmUgbmVlZF9HTF9BUkJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgbmVlZF9HTF9BUkJfcG9pbnRfcGFyYW1ldGVycwotI2RlZmluZSBuZWVkX0dMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCi0jZGVmaW5lIG5lZWRfR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0Ci0jZGVmaW5lIG5lZWRfR0xfQVJCX3ZlcnRleF9wcm9ncmFtCi0jZGVmaW5lIG5lZWRfR0xfQVJCX3dpbmRvd19wb3MKLSNkZWZpbmUgbmVlZF9HTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5Ci0jZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX2NvbG9yCi0jZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCi0jZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgbmVlZF9HTF9FWFRfYmxlbmRfbWlubWF4Ci0jZGVmaW5lIG5lZWRfR0xfRVhUX2N1bGxfdmVydGV4Ci0jZGVmaW5lIG5lZWRfR0xfRVhUX2ZvZ19jb29yZAotI2RlZmluZSBuZWVkX0dMX0VYVF9tdWx0aV9kcmF3X2FycmF5cwotI2RlZmluZSBuZWVkX0dMX0VYVF9zZWNvbmRhcnlfY29sb3IKLSNpbmNsdWRlICJleHRlbnNpb25faGVscGVyLmgiCi0KLSNpZm5kZWYgVkVSQk9TRQotaW50IFZFUkJPU0UgPSAwOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1lc2EncyBEcml2ZXIgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgIjQuMS4zMDAyIgotCi1zdGF0aWMgY29uc3QgR0x1Ynl0ZSAqaW50ZWxHZXRTdHJpbmcoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gbmFtZSApCi17Ci0gICBjb25zdCBjaGFyICogY2hpcHNldDsKLSAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMjhdOwotCi0gICBzd2l0Y2ggKG5hbWUpIHsKLSAgIGNhc2UgR0xfVkVORE9SOgotICAgICAgcmV0dXJuIChHTHVieXRlICopIlR1bmdzdGVuIEdyYXBoaWNzLCBJbmMiOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgIGNhc2UgR0xfUkVOREVSRVI6Ci0gICAgICBzd2l0Y2ggKGludGVsX2NvbnRleHQoY3R4KS0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSB7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NjVfUToKLQkgY2hpcHNldCA9ICJJbnRlbChSKSA5NjVRIjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQQ0lfQ0hJUF9JOTY1X0c6Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NjVfR18xOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIDk2NUciOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NDZfR1o6Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgOTQ2R1oiOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NjVfR006Ci0JIGNoaXBzZXQgPSAiSW50ZWwoUikgOTY1R00iOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBDSV9DSElQX0k5NjVfR01FOgotCSBjaGlwc2V0ID0gIkludGVsKFIpIDk2NUdNRS9HTEUiOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBjaGlwc2V0ID0gIlVua25vd24gSW50ZWwgQ2hpcHNldCI7Ci0gICAgICB9Ci0KLSAgICAgICh2b2lkKSBkcmlHZXRSZW5kZXJlclN0cmluZyggYnVmZmVyLCBjaGlwc2V0LCBEUklWRVJfVkVSU0lPTiwgMCApOwotICAgICAgcmV0dXJuIChHTHVieXRlICopIGJ1ZmZlcjsKLQotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0KLS8qKgotICogRXh0ZW5zaW9uIHN0cmluZ3MgZXhwb3J0ZWQgYnkgdGhlIGludGVsIGRyaXZlci4KLSAqCi0gKiBcbm90ZQotICogSXQgYXBwZWFycyB0aGF0IEFSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciBoYXMgImRpc2FwcGVhcmVkIiBjb21wYXJlZCB0byB0aGUKLSAqIG9sZCBpODMwLXNwZWNpZmljIGRyaXZlci4KLSAqLwotY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gY2FyZF9leHRlbnNpb25zW10gPQotewotICAgIHsgIkdMX0FSQl9tdWx0aXNhbXBsZSIsICAgICAgICAgICAgICAgIEdMX0FSQl9tdWx0aXNhbXBsZV9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9BUkJfbXVsdGl0ZXh0dXJlIiwgICAgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMiLCAgICAgICAgICAgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnNfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfQVJCX3RleHR1cmVfYm9yZGVyX2NsYW1wIiwgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uIiwgICAgICAgIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwIiwgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdGV4dHVyZV9lbnZfYWRkIiwgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3RleHR1cmVfZW52X2NvbWJpbmUiLCAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzIiwgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQiLCAgICBOVUxMIH0sCi0gICAgeyAiR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byIsICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSIsICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9OVl90ZXh0dXJlX3JlY3RhbmdsZSIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX3RleHR1cmVfcmVjdGFuZ2xlIiwgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSIsICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QiLCAgICAgICBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3RfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwgICAgICAgICAgICAgR0xfQVJCX3ZlcnRleF9wcm9ncmFtX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0FSQl93aW5kb3dfcG9zIiwgICAgICAgICAgICAgICAgIEdMX0FSQl93aW5kb3dfcG9zX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9ibGVuZF9jb2xvciIsICAgICAgICAgICAgICAgIEdMX0VYVF9ibGVuZF9jb2xvcl9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUiLCAgICBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGVfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUiLCAgICAgICAgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGVfZnVuY3Rpb25zIH0sCi0gICAgeyAiR0xfRVhUX2JsZW5kX21pbm1heCIsICAgICAgICAgICAgICAgR0xfRVhUX2JsZW5kX21pbm1heF9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfYmxlbmRfbG9naWNfb3AiLCAgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX2JsZW5kX3N1YnRyYWN0IiwgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0VYVF9jdWxsX3ZlcnRleCIsICAgICAgICAgICAgICAgIEdMX0VYVF9jdWxsX3ZlcnRleF9mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfZm9nX2Nvb3JkIiwgICAgICAgICAgICAgICAgICBHTF9FWFRfZm9nX2Nvb3JkX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyIsICAgICAgICAgIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5c19mdW5jdGlvbnMgfSwKLSAgICB7ICJHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIiwgICAgICAgICAgICBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yX2Z1bmN0aW9ucyB9LAotICAgIHsgIkdMX0VYVF9zdGVuY2lsX3dyYXAiLCAgICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9FWFRfdGV4dHVyZV9lZGdlX2NsYW1wIiwgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX3RleHR1cmVfZW52X2NvbWJpbmUiLCAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzIiwgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiLCBOVUxMIH0sCi0gICAgeyAiR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMiLCAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxIiwgIE5VTEwgfSwKLSAgICB7ICJHTF9BUFBMRV9jbGllbnRfc3RvcmFnZSIsICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfTUVTQV9wYWNrX2ludmVydCIsICAgICAgICAgICAgICAgTlVMTCB9LAotICAgIHsgIkdMX01FU0FfeWNiY3JfdGV4dHVyZSIsICAgICAgICAgICAgIE5VTEwgfSwKLSAgICB7ICJHTF9OVl9ibGVuZF9zcXVhcmUiLCAgICAgICAgICAgICAgICBOVUxMIH0sCi0gICAgeyAiR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAiLCAgICAgICAgICAgTlVMTCB9LAotICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgfQotfTsKLQotY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gYXJiX29jX2V4dGVuc2lvbiA9IAotICAgIHsgIkdMX0FSQl9vY2NsdXNpb25fcXVlcnkiLCAgICAgICAgICAgIEdMX0FSQl9vY2NsdXNpb25fcXVlcnlfZnVuY3Rpb25zfTsKLQotdm9pZCBpbnRlbEluaXRFeHRlbnNpb25zKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gZW5hYmxlX2ltYWdpbmcpCi17CSAgICAgCi0Jc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gY3R4P2ludGVsX2NvbnRleHQoY3R4KTpOVUxMOwotCWRyaUluaXRFeHRlbnNpb25zKGN0eCwgY2FyZF9leHRlbnNpb25zLCBlbmFibGVfaW1hZ2luZyk7Ci0JaWYgKCFjdHggfHwgaW50ZWwtPmludGVsU2NyZWVuLT5kcm1NaW5vciA+PSA4KQotCQlkcmlJbml0U2luZ2xlRXh0ZW5zaW9uIChjdHgsICZhcmJfb2NfZXh0ZW5zaW9uKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcmlfZGVidWdfY29udHJvbCBkZWJ1Z19jb250cm9sW10gPQotewotICAgIHsgImZhbGwiLCAgREVCVUdfRkFMTEJBQ0tTIH0sCi0gICAgeyAidGV4IiwgICBERUJVR19URVhUVVJFIH0sCi0gICAgeyAiaW9jdGwiLCBERUJVR19JT0NUTCB9LAotICAgIHsgInByaW0iLCAgREVCVUdfUFJJTVMgfSwKLSAgICB7ICJ2ZXJ0IiwgIERFQlVHX1ZFUlRTIH0sCi0gICAgeyAic3RhdGUiLCBERUJVR19TVEFURSB9LAotICAgIHsgInZlcmIiLCAgREVCVUdfVkVSQk9TRSB9LAotICAgIHsgImRyaSIsICAgREVCVUdfRFJJIH0sCi0gICAgeyAiZG1hIiwgICBERUJVR19ETUEgfSwKLSAgICB7ICJzYW4iLCAgIERFQlVHX1NBTklUWSB9LAotICAgIHsgInN5bmMiLCAgREVCVUdfU1lOQyB9LAotICAgIHsgInNsZWVwIiwgREVCVUdfU0xFRVAgfSwKLSAgICB7ICJwaXgiLCAgIERFQlVHX1BJWEVMIH0sCi0gICAgeyAiYnVmIiwgICBERUJVR19CVUZNR1IgfSwKLSAgICB7ICJzdGF0cyIsIERFQlVHX1NUQVRTIH0sCi0gICAgeyAidGlsZSIsICBERUJVR19USUxFIH0sCi0gICAgeyAic2luZyIsICBERUJVR19TSU5HTEVfVEhSRUFEIH0sCi0gICAgeyAidGhyZSIsICBERUJVR19TSU5HTEVfVEhSRUFEIH0sCi0gICAgeyAid20iLCAgICBERUJVR19XTSB9LAotICAgIHsgInZzIiwgICAgREVCVUdfVlMgfSwKLSAgICB7IE5VTEwsICAgIDAgfQotfTsKLQotCi1zdGF0aWMgdm9pZCBpbnRlbEludmFsaWRhdGVTdGF0ZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBuZXdfc3RhdGUgKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotCi0gICBfc3dyYXN0X0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgIF9zd3NldHVwX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgIF92Ym9fSW52YWxpZGF0ZVN0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgX3RubF9JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Ci0gICBfdG5sX2ludmFsaWRhdGVfdmVydGV4X3N0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgCi0gICBpbnRlbC0+TmV3R0xTdGF0ZSB8PSBuZXdfc3RhdGU7Ci0KLSAgIGlmIChpbnRlbC0+dnRibC5pbnZhbGlkYXRlX3N0YXRlKQotICAgICAgaW50ZWwtPnZ0YmwuaW52YWxpZGF0ZV9zdGF0ZSggaW50ZWwsIG5ld19zdGF0ZSApOwotfQotCi0KLXZvaWQgaW50ZWxGbHVzaCggR0xjb250ZXh0ICpjdHggKQotewotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dCggY3R4ICk7Ci0KLSAgIGJtTG9ja0FuZEZlbmNlKGludGVsKTsKLX0KLQotdm9pZCBpbnRlbEZpbmlzaCggR0xjb250ZXh0ICpjdHggKSAKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOwotCi0gICBibUZpbmlzaEZlbmNlKGludGVsLCBibUxvY2tBbmRGZW5jZShpbnRlbCkpOwotfQotCi1zdGF0aWMgdm9pZAotaW50ZWxCZWdpblF1ZXJ5KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKQotewotCXN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOwotCWRybUk4MzBNTUlPIGlvID0gewotCQkucmVhZF93cml0ZSA9IE1NSU9fUkVBRCwKLQkJLnJlZyA9IE1NSU9fUkVHU19QU19ERVBUSF9DT1VOVCwKLQkJLmRhdGEgPSAmcS0+UmVzdWx0IAotCX07Ci0JaW50ZWwtPnN0YXRzX3dtKys7Ci0JaW50ZWxGaW5pc2goJmludGVsLT5jdHgpOwotCWRybUNvbW1hbmRSZWFkKGludGVsLT5kcmlGZCwgRFJNX0k4MzBfTU1JTywgJmlvLCBzaXplb2YoaW8pKTsKLX0KLQotc3RhdGljIHZvaWQKLWludGVsRW5kUXVlcnkoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKnEpCi17Ci0Jc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dCggY3R4ICk7Ci0JR0x1aW50NjRFWFQgdG1wOwkKLQlkcm1JODMwTU1JTyBpbyA9IHsKLQkJLnJlYWRfd3JpdGUgPSBNTUlPX1JFQUQsCi0JCS5yZWcgPSBNTUlPX1JFR1NfUFNfREVQVEhfQ09VTlQsCi0JCS5kYXRhID0gJnRtcAotCX07Ci0JaW50ZWxGaW5pc2goJmludGVsLT5jdHgpOwotCWRybUNvbW1hbmRSZWFkKGludGVsLT5kcmlGZCwgRFJNX0k4MzBfTU1JTywgJmlvLCBzaXplb2YoaW8pKTsKLQlxLT5SZXN1bHQgPSB0bXAgLSBxLT5SZXN1bHQ7Ci0JcS0+UmVhZHkgPSBHTF9UUlVFOwotCWludGVsLT5zdGF0c193bS0tOwotfQotCi0KLXZvaWQgaW50ZWxJbml0RHJpdmVyRnVuY3Rpb25zKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBfbWVzYV9pbml0X2RyaXZlcl9mdW5jdGlvbnMoIGZ1bmN0aW9ucyApOwotCi0gICBmdW5jdGlvbnMtPkZsdXNoID0gaW50ZWxGbHVzaDsKLSAgIGZ1bmN0aW9ucy0+RmluaXNoID0gaW50ZWxGaW5pc2g7Ci0gICBmdW5jdGlvbnMtPkdldFN0cmluZyA9IGludGVsR2V0U3RyaW5nOwotICAgZnVuY3Rpb25zLT5VcGRhdGVTdGF0ZSA9IGludGVsSW52YWxpZGF0ZVN0YXRlOwotICAgZnVuY3Rpb25zLT5CZWdpblF1ZXJ5ID0gaW50ZWxCZWdpblF1ZXJ5OwotICAgZnVuY3Rpb25zLT5FbmRRdWVyeSA9IGludGVsRW5kUXVlcnk7Ci0KLSAgIC8qIENvcHlQaXhlbHMgY2FuIGJlIGFjY2VsZXJhdGVkIGV2ZW4gd2l0aCB0aGUgY3VycmVudCBtZW1vcnkKLSAgICAqIG1hbmFnZXI6Ci0gICAgKi8KLSAgIGlmICghZ2V0ZW52KCJJTlRFTF9OT19CTElUIikpIHsKLSAgICAgIGZ1bmN0aW9ucy0+Q29weVBpeGVscyA9IGludGVsQ29weVBpeGVsczsKLSAgICAgIGZ1bmN0aW9ucy0+Qml0bWFwID0gaW50ZWxCaXRtYXA7Ci0gICB9Ci0KLSAgIGludGVsSW5pdFRleHR1cmVGdW5jcyggZnVuY3Rpb25zICk7Ci0gICBpbnRlbEluaXRTdGF0ZUZ1bmNzKCBmdW5jdGlvbnMgKTsKLSAgIGludGVsSW5pdEJ1ZmZlckZ1bmNzKCBmdW5jdGlvbnMgKTsKLX0KLQotCi0KLUdMYm9vbGVhbiBpbnRlbEluaXRDb250ZXh0KCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbWVzYVZpcywKLQkJCSAgICBfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdiwKLQkJCSAgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSwKLQkJCSAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OwotICAgR0xjb250ZXh0ICpzaGFyZUN0eCA9IChHTGNvbnRleHQgKikgc2hhcmVkQ29udGV4dFByaXZhdGU7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2ID0gZHJpQ29udGV4dFByaXYtPmRyaVNjcmVlblByaXY7Ci0gICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gKGludGVsU2NyZWVuUHJpdmF0ZSAqKXNQcml2LT5wcml2YXRlOwotICAgdm9sYXRpbGUgZHJtSTgzMFNhcmVhICpzYVByaXYgPSAodm9sYXRpbGUgZHJtSTgzMFNhcmVhICopCi0gICAgICAoKChHTHVieXRlICopc1ByaXYtPnBTQVJFQSkraW50ZWxTY3JlZW4tPnNhcmVhX3ByaXZfb2Zmc2V0KTsKLQotICAgaWYgKCFfbWVzYV9pbml0aWFsaXplX2NvbnRleHQoJmludGVsLT5jdHgsCi0JCQkJIG1lc2FWaXMsIHNoYXJlQ3R4LCAKLQkJCQkgZnVuY3Rpb25zLAotCQkJCSAodm9pZCopIGludGVsKSkgewotICAgICAgX21lc2FfcHJpbnRmKCIlczogZmFpbGVkIHRvIGluaXQgbWVzYSBjb250ZXh0XG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSA9IGludGVsOwotICAgaW50ZWwtPmludGVsU2NyZWVuID0gaW50ZWxTY3JlZW47Ci0gICBpbnRlbC0+ZHJpU2NyZWVuID0gc1ByaXY7Ci0gICBpbnRlbC0+c2FyZWEgPSBzYVByaXY7Ci0KLSAgIGRyaVBhcnNlQ29uZmlnRmlsZXMgKCZpbnRlbC0+b3B0aW9uQ2FjaGUsICZpbnRlbFNjcmVlbi0+b3B0aW9uQ2FjaGUsCi0JCSAgIGludGVsLT5kcmlTY3JlZW4tPm15TnVtLCAiaTk2NSIpOwotCi0gICBpbnRlbC0+dmJsYW5rX2ZsYWdzID0gKGludGVsLT5pbnRlbFNjcmVlbi0+aXJxX2FjdGl2ZSAhPSAwKQotCSAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZpbnRlbC0+b3B0aW9uQ2FjaGUpIDogVkJMQU5LX0ZMQUdfTk9fSVJROwotCi0gICBjdHgtPkNvbnN0Lk1heFRleHR1cmVNYXhBbmlzb3Ryb3B5ID0gMi4wOwotCi0gICBpZiAoZ2V0ZW52KCJJTlRFTF9TVFJJQ1RfQ09ORk9STUFOQ0UiKSkgewotICAgICAgaW50ZWwtPnN0cmljdF9jb25mb3JtYW5jZSA9IDE7Ci0gICB9Ci0KLSAgIGlmIChpbnRlbC0+c3RyaWN0X2NvbmZvcm1hbmNlKSB7Ci0gICAgICBjdHgtPkNvbnN0Lk1pbkxpbmVXaWR0aCA9IDEuMDsKLSAgICAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoQUEgPSAxLjA7Ci0gICAgICBjdHgtPkNvbnN0Lk1heExpbmVXaWR0aCA9IDEuMDsKLSAgICAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoQUEgPSAxLjA7Ci0gICAgICBjdHgtPkNvbnN0LkxpbmVXaWR0aEdyYW51bGFyaXR5ID0gMS4wOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBjdHgtPkNvbnN0Lk1pbkxpbmVXaWR0aCA9IDEuMDsKLSAgICAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoQUEgPSAxLjA7Ci0gICAgICBjdHgtPkNvbnN0Lk1heExpbmVXaWR0aCA9IDUuMDsKLSAgICAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoQUEgPSA1LjA7Ci0gICAgICBjdHgtPkNvbnN0LkxpbmVXaWR0aEdyYW51bGFyaXR5ID0gMC41OwotICAgfQotCi0gICBjdHgtPkNvbnN0Lk1pblBvaW50U2l6ZSA9IDEuMDsKLSAgIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplQUEgPSAxLjA7Ci0gICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZSA9IDI1NS4wOwotICAgY3R4LT5Db25zdC5NYXhQb2ludFNpemVBQSA9IDMuMDsKLSAgIGN0eC0+Q29uc3QuUG9pbnRTaXplR3JhbnVsYXJpdHkgPSAxLjA7Ci0KLSAgIC8qIHJlaW5pdGlhbGl6ZSB0aGUgY29udGV4dCBwb2ludCBzdGF0ZS4KLSAgICAqIEl0IGRlcGVuZCBvbiBjb25zdGFudHMgaW4gX19HTGNvbnRleHRSZWM6OkNvbnN0Ci0gICAgKi8KLSAgIF9tZXNhX2luaXRfcG9pbnQoY3R4KTsKLQotICAgLyogSW5pdGlhbGl6ZSB0aGUgc29mdHdhcmUgcmFzdGVyaXplciBhbmQgaGVscGVyIG1vZHVsZXMuICovCi0gICBfc3dyYXN0X0NyZWF0ZUNvbnRleHQoIGN0eCApOwotICAgX3Zib19DcmVhdGVDb250ZXh0KCBjdHggKTsKLSAgIF90bmxfQ3JlYXRlQ29udGV4dCggY3R4ICk7Ci0gICBfc3dzZXR1cF9DcmVhdGVDb250ZXh0KCBjdHggKTsKLQotICAgVE5MX0NPTlRFWFQoY3R4KS0+RHJpdmVyLlJ1blBpcGVsaW5lID0gX3RubF9ydW5fcGlwZWxpbmU7Ci0KLSAgIC8qIENvbmZpZ3VyZSBzd3Jhc3QgdG8gbWF0Y2ggaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzOiAqLwotICAgX3N3cmFzdF9hbGxvd19waXhlbF9mb2coIGN0eCwgR0xfRkFMU0UgKTsKLSAgIF9zd3Jhc3RfYWxsb3dfdmVydGV4X2ZvZyggY3R4LCBHTF9UUlVFICk7Ci0KLSAgIC8qIERyaSBzdHVmZiAqLwotICAgaW50ZWwtPmhIV0NvbnRleHQgPSBkcmlDb250ZXh0UHJpdi0+aEhXQ29udGV4dDsKLSAgIGludGVsLT5kcmlGZCA9IHNQcml2LT5mZDsKLSAgIGludGVsLT5kcmlId0xvY2sgPSAoZHJtTG9jayAqKSAmc1ByaXYtPnBTQVJFQS0+bG9jazsKLQotICAgaW50ZWwtPmh3X3N0ZW5jaWwgPSBtZXNhVmlzLT5zdGVuY2lsQml0cyAmJiBtZXNhVmlzLT5kZXB0aEJpdHMgPT0gMjQ7Ci0gICBpbnRlbC0+aHdfc3RpcHBsZSA9IDE7Ci0KLSAgIHN3aXRjaChtZXNhVmlzLT5kZXB0aEJpdHMpIHsKLSAgIGNhc2UgMDoJCQkvKiB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8gKi8KLSAgIGNhc2UgMTY6Ci0gICAgICBpbnRlbC0+ZGVwdGhfc2NhbGUgPSAxLjAvMHhmZmZmOwotICAgICAgaW50ZWwtPnBvbHlnb25fb2Zmc2V0X3NjYWxlID0gMS4wLzB4ZmZmZjsKLSAgICAgIGludGVsLT5kZXB0aF9jbGVhcl9tYXNrID0gfjA7Ci0gICAgICBpbnRlbC0+Q2xlYXJEZXB0aCA9IDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAyNDoKLSAgICAgIGludGVsLT5kZXB0aF9zY2FsZSA9IDEuMC8weGZmZmZmZjsKLSAgICAgIGludGVsLT5wb2x5Z29uX29mZnNldF9zY2FsZSA9IDIuMC8weGZmZmZmZjsgLyogcmVxJ2QgdG8gcGFzcyBnbGVhbiAqLwotICAgICAgaW50ZWwtPmRlcHRoX2NsZWFyX21hc2sgPSAweDAwZmZmZmZmOwotICAgICAgaW50ZWwtPnN0ZW5jaWxfY2xlYXJfbWFzayA9IDB4ZmYwMDAwMDA7Ci0gICAgICBpbnRlbC0+Q2xlYXJEZXB0aCA9IDB4MDBmZmZmZmY7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoMCk7IAotICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIC8qIEluaXRpYWxpemUgc3dyYXN0LCB0bmwgZHJpdmVyIHRhYmxlczogKi8KLSAgIGludGVsSW5pdFNwYW5GdW5jcyggY3R4ICk7Ci0KLSAgIGludGVsLT5ub19odyA9IGdldGVudigiSU5URUxfTk9fSFciKSAhPSBOVUxMOwotCi0gICBpZiAoIWludGVsLT5pbnRlbFNjcmVlbi0+aXJxX2FjdGl2ZSkgewotICAgICAgX21lc2FfcHJpbnRmKCJJUlFzIG5vdCBhY3RpdmUuICBFeGl0aW5nXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0gICBpbnRlbEluaXRFeHRlbnNpb25zKGN0eCwgR0xfVFJVRSk7IAotCi0gICBJTlRFTF9ERUJVRyAgPSBkcmlQYXJzZURlYnVnU3RyaW5nKCBnZXRlbnYoICJJTlRFTF9ERUJVRyIgKSwKLQkJCQkgICAgICAgZGVidWdfY29udHJvbCApOwotCi0KLSAgIC8qIEJ1ZmZlciBtYW5hZ2VyOiAKLSAgICAqLwotICAgaW50ZWwtPmJtID0gYm1fZmFrZV9pbnRlbF9BdHRhY2goIGludGVsICk7Ci0KLQotICAgYm1Jbml0UG9vbChpbnRlbCwKLQkgICAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPnRleC5vZmZzZXQsIC8qIGxvdyBvZmZzZXQgKi8KLQkgICAgICBpbnRlbC0+aW50ZWxTY3JlZW4tPnRleC5tYXAsIC8qIGxvdyB2aXJ0dWFsICovCi0JICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT50ZXguc2l6ZSwKLQkgICAgICBCTV9NRU1fQUdQKTsKLQotICAgLyogVGhlc2UgYXJlIHN0aWxsIHN0YXRpYywgYnV0IGNyZWF0ZSByZWdpb25zIGZvciB0aGVtLiAgCi0gICAgKi8KLSAgIGludGVsLT5mcm9udF9yZWdpb24gPSAKLSAgICAgIGludGVsX3JlZ2lvbl9jcmVhdGVfc3RhdGljKGludGVsLAotCQkJCSBCTV9NRU1fQUdQLAotCQkJCSBpbnRlbFNjcmVlbi0+ZnJvbnQub2Zmc2V0LAotCQkJCSBpbnRlbFNjcmVlbi0+ZnJvbnQubWFwLAotCQkJCSBpbnRlbFNjcmVlbi0+Y3BwLAotCQkJCSBpbnRlbFNjcmVlbi0+ZnJvbnQucGl0Y2ggLyBpbnRlbFNjcmVlbi0+Y3BwLAotCQkJCSBpbnRlbFNjcmVlbi0+aGVpZ2h0LAotCQkJCSBpbnRlbFNjcmVlbi0+ZnJvbnQuc2l6ZSwKLQkJCQkgaW50ZWxTY3JlZW4tPmZyb250LnRpbGVkICE9IDApOwotCi0gICBpbnRlbC0+YmFja19yZWdpb24gPSAKLSAgICAgIGludGVsX3JlZ2lvbl9jcmVhdGVfc3RhdGljKGludGVsLAotCQkJCSBCTV9NRU1fQUdQLAotCQkJCSBpbnRlbFNjcmVlbi0+YmFjay5vZmZzZXQsCi0JCQkJIGludGVsU2NyZWVuLT5iYWNrLm1hcCwKLQkJCQkgaW50ZWxTY3JlZW4tPmNwcCwKLQkJCQkgaW50ZWxTY3JlZW4tPmJhY2sucGl0Y2ggLyBpbnRlbFNjcmVlbi0+Y3BwLAotCQkJCSBpbnRlbFNjcmVlbi0+aGVpZ2h0LAotCQkJCSBpbnRlbFNjcmVlbi0+YmFjay5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxTY3JlZW4tPmJhY2sudGlsZWQgIT0gMCk7Ci0KLSAgIC8qIFN0aWxsIGFzc3VtaW5nIGZyb250LmNwcCA9PSBkZXB0aC5jcHAKLSAgICAqCi0gICAgKiBYWFg6IFNldHRpbmcgdGlsaW5nIHRvIGZhbHNlIGJlY2F1c2UgRGVwdGggdGlsaW5nIG9ubHkgc3VwcG9ydHMKLSAgICAqIFlNQUpPUiBidXQgdGhlIGJsaXR0ZXIgb25seSBzdXBwb3J0cyBYTUFKT1IgdGlsaW5nLiAgSGF2ZSB0bwotICAgICogcmVzb2x2ZSBsYXRlci4KLSAgICAqLwotICAgaW50ZWwtPmRlcHRoX3JlZ2lvbiA9IAotICAgICAgaW50ZWxfcmVnaW9uX2NyZWF0ZV9zdGF0aWMoaW50ZWwsCi0JCQkJIEJNX01FTV9BR1AsCi0JCQkJIGludGVsU2NyZWVuLT5kZXB0aC5vZmZzZXQsCi0JCQkJIGludGVsU2NyZWVuLT5kZXB0aC5tYXAsCi0JCQkJIGludGVsU2NyZWVuLT5jcHAsCi0JCQkJIGludGVsU2NyZWVuLT5kZXB0aC5waXRjaCAvIGludGVsU2NyZWVuLT5jcHAsCi0JCQkJIGludGVsU2NyZWVuLT5oZWlnaHQsCi0JCQkJIGludGVsU2NyZWVuLT5kZXB0aC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxTY3JlZW4tPmRlcHRoLnRpbGVkICE9IDApOwotICAgCi0gICBpbnRlbF9idWZmZXJvYmpfaW5pdCggaW50ZWwgKTsKLSAgIGludGVsLT5iYXRjaCA9IGludGVsX2JhdGNoYnVmZmVyX2FsbG9jKCBpbnRlbCApOwotCi0gICBpZiAoaW50ZWwtPmN0eC5NZXNhX0RYVG4pIHsKLSAgICAgIF9tZXNhX2VuYWJsZV9leHRlbnNpb24oIGN0eCwgIkdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMiICk7Ci0gICAgICBfbWVzYV9lbmFibGVfZXh0ZW5zaW9uKCBjdHgsICJHTF9TM19zM3RjIiApOwotICAgfQotICAgZWxzZSBpZiAoZHJpUXVlcnlPcHRpb25iICgmaW50ZWxTY3JlZW4tPm9wdGlvbkNhY2hlLCAiZm9yY2VfczN0Y19lbmFibGUiKSkgewotICAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbiggY3R4LCAiR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyIgKTsKLSAgIH0KLQotLyogICAgZHJpSW5pdFRleHR1cmVPYmplY3RzKCBjdHgsICYgaW50ZWwtPnN3YXBwZWQsICovCi0vKiAJCQkgIERSSV9URVhNR1JfRE9fVEVYVFVSRV8xRCB8ICovCi0vKiAJCQkgIERSSV9URVhNR1JfRE9fVEVYVFVSRV8yRCB8ICAqLwotLyogCQkJICBEUklfVEVYTUdSX0RPX1RFWFRVUkVfUkVDVCApOyAqLwotCi0KLSAgIGlmIChnZXRlbnYoIklOVEVMX05PX1JBU1QiKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJkaXNhYmxpbmcgM0QgcmFzdGVyaXphdGlvblxuIik7Ci0gICAgICBpbnRlbC0+bm9fcmFzdCA9IDE7Ci0gICB9Ci0KLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXZvaWQgaW50ZWxEZXN0cm95Q29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdikKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKSBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQotICAgYXNzZXJ0KGludGVsKTsgLyogc2hvdWxkIG5ldmVyIGJlIG51bGwgKi8KLSAgIGlmIChpbnRlbCkgewotICAgICAgR0xib29sZWFuICAgcmVsZWFzZV90ZXh0dXJlX2hlYXBzOwotCi0KLSAgICAgIGludGVsLT52dGJsLmRlc3Ryb3koIGludGVsICk7Ci0KLSAgICAgIHJlbGVhc2VfdGV4dHVyZV9oZWFwcyA9IChpbnRlbC0+Y3R4LlNoYXJlZC0+UmVmQ291bnQgPT0gMSk7Ci0gICAgICBfc3dzZXR1cF9EZXN0cm95Q29udGV4dCAoJmludGVsLT5jdHgpOwotICAgICAgX3RubF9EZXN0cm95Q29udGV4dCAoJmludGVsLT5jdHgpOwotICAgICAgX3Zib19EZXN0cm95Q29udGV4dCAoJmludGVsLT5jdHgpOwotCi0gICAgICBfc3dyYXN0X0Rlc3Ryb3lDb250ZXh0ICgmaW50ZWwtPmN0eCk7Ci0gICAgICBpbnRlbC0+RmFsbGJhY2sgPSAwOwkvKiBkb24ndCBjYWxsIF9zd3Jhc3RfRmx1c2ggbGF0ZXIgKi8KLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZyZWUoaW50ZWwtPmJhdGNoKTsKLSAgICAgIGludGVsLT5iYXRjaCA9IE5VTEw7Ci0gICAgICAKLQotICAgICAgaWYgKCByZWxlYXNlX3RleHR1cmVfaGVhcHMgKSB7Ci0gICAgICAgICAvKiBUaGlzIHNoYXJlIGdyb3VwIGlzIGFib3V0IHRvIGdvIGF3YXksIGZyZWUgb3VyIHByaXZhdGUKLSAgICAgICAgICAqIHRleHR1cmUgb2JqZWN0IGRhdGEuCi0gICAgICAgICAgKi8KLQotCSAvKiBYWFg6IGRlc3Ryb3kgdGhlIHNoYXJlZCBidWZtZ3Igc3RydWN0IGhlcmU/Ci0JICAqLwotICAgICAgfQotCi0gICAgICAvKiBGcmVlIHRoZSByZWdpb25zIGNyZWF0ZWQgdG8gZGVzY3JpYmUgZnJvbnQvYmFjay9kZXB0aAotICAgICAgICogYnVmZmVyczoKLSAgICAgICAqLwotI2lmIDAKLSAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKGludGVsLCAmaW50ZWwtPmZyb250X3JlZ2lvbik7Ci0gICAgICBpbnRlbF9yZWdpb25fcmVsZWFzZShpbnRlbCwgJmludGVsLT5iYWNrX3JlZ2lvbik7Ci0gICAgICBpbnRlbF9yZWdpb25fcmVsZWFzZShpbnRlbCwgJmludGVsLT5kZXB0aF9yZWdpb24pOwotICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoaW50ZWwsICZpbnRlbC0+ZHJhd19yZWdpb24pOwotI2VuZGlmCi0KLSAgICAgIC8qIGZyZWUgdGhlIE1lc2EgY29udGV4dCAqLwotICAgICAgX21lc2FfZGVzdHJveV9jb250ZXh0KCZpbnRlbC0+Y3R4KTsKLSAgIH0KLQotICAgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUgPSBOVUxMOwotfQotCi1HTGJvb2xlYW4gaW50ZWxVbmJpbmRDb250ZXh0KF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2KQotewotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLUdMYm9vbGVhbiBpbnRlbE1ha2VDdXJyZW50KF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2LAotCQkJICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd1ByaXYsCi0JCQkgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlSZWFkUHJpdikKLXsKLQotICAgaWYgKGRyaUNvbnRleHRQcml2KSB7Ci0gICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAoc3RydWN0IGludGVsX2NvbnRleHQgKikgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7Ci0KLSAgICAgIGlmICggaW50ZWwtPmRyaURyYXdhYmxlICE9IGRyaURyYXdQcml2ICkgewotCSAvKiBTaG91bGRuJ3QgdGhlIHJlYWRidWZmZXIgYmUgc3RvcmVkIGFsc28/ICovCi0JIGRyaURyYXdhYmxlSW5pdFZCbGFuayggZHJpRHJhd1ByaXYsIGludGVsLT52YmxhbmtfZmxhZ3MsCi0JCSAgICAgICZpbnRlbC0+dmJsX3NlcSApOwotCi0JIGludGVsLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OwotCSBpbnRlbFdpbmRvd01vdmVkKCBpbnRlbCApOwotICAgICAgfQotCi0gICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoJmludGVsLT5jdHgsCi0JCQkgKEdMZnJhbWVidWZmZXIgKikgZHJpRHJhd1ByaXYtPmRyaXZlclByaXZhdGUsCi0JCQkgKEdMZnJhbWVidWZmZXIgKikgZHJpUmVhZFByaXYtPmRyaXZlclByaXZhdGUpOwotCi0gICAgICBpbnRlbC0+Y3R4LkRyaXZlci5EcmF3QnVmZmVyKCAmaW50ZWwtPmN0eCwgaW50ZWwtPmN0eC5Db2xvci5EcmF3QnVmZmVyWzBdICk7Ci0gICB9IGVsc2UgewotICAgICAgX21lc2FfbWFrZV9jdXJyZW50KE5VTEwsIE5VTEwsIE5VTEwpOwotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbnRlbENvbnRlbmRlZExvY2soIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGZsYWdzICkKLXsKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYgPSBpbnRlbC0+ZHJpU2NyZWVuOwotICAgdm9sYXRpbGUgZHJtSTgzMFNhcmVhICogc2FyZWEgPSBpbnRlbC0+c2FyZWE7Ci0gICBpbnQgbWUgPSBpbnRlbC0+aEhXQ29udGV4dDsKLSAgIGludCBteV9idWZtZ3IgPSBibUN0eElkKGludGVsKTsKLQotICAgZHJtR2V0TG9jayhpbnRlbC0+ZHJpRmQsIGludGVsLT5oSFdDb250ZXh0LCBmbGFncyk7Ci0KLSAgIC8qIElmIHRoZSB3aW5kb3cgbW92ZWQsIG1heSBuZWVkIHRvIHNldCBhIG5ldyBjbGlwcmVjdCBub3cuCi0gICAgKgotICAgICogTk9URTogVGhpcyByZWxlYXNlcyBhbmQgcmVnYWlucyB0aGUgaHcgbG9jaywgc28gYWxsIHN0YXRlCi0gICAgKiBjaGVja2luZyBtdXN0IGJlIGRvbmUgKmFmdGVyKiB0aGlzIGNhbGw6Ci0gICAgKi8KLSAgIGlmIChkUHJpdikKLSAgICAgIERSSV9WQUxJREFURV9EUkFXQUJMRV9JTkZPKHNQcml2LCBkUHJpdik7Ci0KLQotICAgaW50ZWwtPmxvY2tlZCA9IDE7Ci0gICBpbnRlbC0+bmVlZF9mbHVzaCA9IDE7Ci0KLSAgIC8qIExvc3QgY29udGV4dD8KLSAgICAqLwotICAgaWYgKHNhcmVhLT5jdHhPd25lciAhPSBtZSkgewotICAgICAgREJHKCJMb3N0IENvbnRleHQ6IHNhcmVhLT5jdHhPd25lciAleCBtZSAleFxuIiwgc2FyZWEtPmN0eE93bmVyLCBtZSk7Ci0gICAgICBzYXJlYS0+Y3R4T3duZXIgPSBtZTsKLSAgICAgIGludGVsLT52dGJsLmxvc3RfaGFyZHdhcmUoIGludGVsICk7Ci0gICB9Ci0KLSAgIC8qIEFzIGFib3ZlLCBidXQgZG9uJ3QgZXZpY3QgdGhlIHRleHR1cmUgZGF0YSBvbiB0cmFuc2l0aW9ucwotICAgICogYmV0d2VlbiBjb250ZXh0cyB3aGljaCBhbGwgc2hhcmUgYSBsb2NhbCBidWZmZXIgbWFuYWdlci4KLSAgICAqLwotICAgaWYgKHNhcmVhLT50ZXhBZ2UgIT0gbXlfYnVmbWdyKSB7Ci0gICAgICBEQkcoIkxvc3QgVGV4dHVyZXM6IHNhcmVhLT50ZXhBZ2UgJXggbXlfYnVmbWdyICV4XG4iLCBzYXJlYS0+Y3R4T3duZXIsIG15X2J1Zm1ncik7Ci0gICAgICBzYXJlYS0+dGV4QWdlID0gbXlfYnVmbWdyOwotICAgICAgYm1fZmFrZV9Ob3RpZnlDb250ZW5kZWRMb2NrVGFrZSggaW50ZWwgKTsgCi0gICB9Ci0KLSAgIC8qIERyYXdhYmxlIGNoYW5nZWQ/Ci0gICAgKi8KLSAgIGlmIChkUHJpdiAmJiBpbnRlbC0+bGFzdFN0YW1wICE9IGRQcml2LT5sYXN0U3RhbXApIHsKLSAgICAgIGludGVsV2luZG93TW92ZWQoIGludGVsICk7Ci0gICAgICBpbnRlbC0+bGFzdFN0YW1wID0gZFByaXYtPmxhc3RTdGFtcDsKLSAgIH0KLX0KLQotX2dsdGhyZWFkX0RFQ0xBUkVfU1RBVElDX01VVEVYKGxvY2tNdXRleCk7Ci0KLS8qIExvY2sgdGhlIGhhcmR3YXJlIGFuZCB2YWxpZGF0ZSBvdXIgc3RhdGUuICAKLSAqLwotdm9pZCBMT0NLX0hBUkRXQVJFKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgIGNoYXIgX19yZXQ9MDsKLQotICAgIF9nbHRocmVhZF9MT0NLX01VVEVYKGxvY2tNdXRleCk7Ci0gICAgYXNzZXJ0KCFpbnRlbC0+bG9ja2VkKTsKLQotCi0gICAgRFJNX0NBUyhpbnRlbC0+ZHJpSHdMb2NrLCBpbnRlbC0+aEhXQ29udGV4dCwKLQkgICAgKERSTV9MT0NLX0hFTER8aW50ZWwtPmhIV0NvbnRleHQpLCBfX3JldCk7Ci0gICAgaWYgKF9fcmV0KQotICAgICAgICBpbnRlbENvbnRlbmRlZExvY2soIGludGVsLCAwICk7Ci0KLSAgIGludGVsLT5sb2NrZWQgPSAxOwotCi0gICBpZiAoaW50ZWwtPmF1Yl93cmFwKSB7Ci0gICAgICBibV9mYWtlX05vdGlmeUNvbnRlbmRlZExvY2tUYWtlKCBpbnRlbCApOyAKLSAgICAgIGludGVsLT52dGJsLmxvc3RfaGFyZHdhcmUoIGludGVsICk7Ci0gICAgICBpbnRlbC0+dnRibC5hdWJfd3JhcChpbnRlbCk7Ci0gICAgICBpbnRlbC0+YXViX3dyYXAgPSAwOwotICAgfQotCi0gICBpZiAoYm1FcnJvcihpbnRlbCkpIHsKLSAgICAgIGJtRXZpY3RBbGwoaW50ZWwpOwotICAgICAgaW50ZWwtPnZ0YmwubG9zdF9oYXJkd2FyZSggaW50ZWwgKTsKLSAgIH0KLQotICAgLyogTWFrZSBzdXJlIG5vdGhpbmcgaGFzIGJlZW4gZW1pdHRlZCBwcmlvciB0byBnZXR0aW5nIHRoZSBsb2NrOiAKLSAgICAqLwotICAgYXNzZXJ0KGludGVsLT5iYXRjaC0+bWFwID09IDApOwotCi0gICAvKiBYWFg6IHBvc3Rwb25lLCBtYXkgbm90IGJlIG5lZWRlZDoKLSAgICAqLwotICAgaWYgKCFpbnRlbF9iYXRjaGJ1ZmZlcl9tYXAoaW50ZWwtPmJhdGNoKSkgewotICAgICAgYm1FdmljdEFsbChpbnRlbCk7Ci0gICAgICBpbnRlbC0+dnRibC5sb3N0X2hhcmR3YXJlKCBpbnRlbCApOwotCi0gICAgICAvKiBUaGlzIGNvdWxkIG9ubHkgZmFpbCBpZiB0aGUgYmF0Y2hidWZmZXIgd2FzIGdyZWF0ZXIgaW4gc2l6ZQotICAgICAgICogdGhhbiB0aGUgYXZhaWxhYmxlIHRleHR1cmUgbWVtb3J5OgotICAgICAgICovCi0gICAgICBpZiAoIWludGVsX2JhdGNoYnVmZmVyX21hcChpbnRlbC0+YmF0Y2gpKSB7Ci0JIF9tZXNhX3ByaW50ZigiZG91YmxlIGZhaWx1cmUgdG8gbWFwIGJhdGNoYnVmZmVyXG4iKTsKLQkgYXNzZXJ0KDApOwotICAgICAgfQotICAgfQotfQotIAotICAKLS8qIFVubG9jayB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGdsb2JhbCBjdXJyZW50IGNvbnRleHQgCi0gKi8KLXZvaWQgVU5MT0NLX0hBUkRXQVJFKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKQotewotICAgLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVsZWFzZWQ6IAotICAgICovCi0gICBhc3NlcnQoaW50ZWwtPmJhdGNoLT5wdHIgPT0gaW50ZWwtPmJhdGNoLT5tYXAgKyBpbnRlbC0+YmF0Y2gtPm9mZnNldCk7Ci0KLSAgIGludGVsX2JhdGNoYnVmZmVyX3VubWFwKGludGVsLT5iYXRjaCk7Ci0gICBpbnRlbC0+dnRibC5ub3RlX3VubG9jayggaW50ZWwgKTsKLSAgIGludGVsLT5sb2NrZWQgPSAwOwotCi0KLQotICAgRFJNX1VOTE9DSyhpbnRlbC0+ZHJpRmQsIGludGVsLT5kcmlId0xvY2ssIGludGVsLT5oSFdDb250ZXh0KTsKLSAgIF9nbHRocmVhZF9VTkxPQ0tfTVVURVgobG9ja011dGV4KTsgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yN2ExY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9jb250ZXh0LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfY29udGV4dC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2Zjg0OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIElOVEVMQ09OVEVYVF9JTkMKLSNkZWZpbmUgSU5URUxDT05URVhUX0lOQwotCi0KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgImRybS5oIgotI2luY2x1ZGUgInRleG1lbS5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCi0jaW5jbHVkZSAiaTgzMF9jb21tb24uaCIKLSNpbmNsdWRlICJ0bmwvdF92ZXJ0ZXguaCIKLQotI2RlZmluZSBUQUcoeCkgaW50ZWwjI3gKLSNpbmNsdWRlICJ0bmxfZGQvdF9kZF92ZXJ0ZXguaCIKLSN1bmRlZiBUQUcKLQotI2RlZmluZSBEVl9QRl81NTUgICgxPDw4KQotI2RlZmluZSBEVl9QRl81NjUgICgyPDw4KQotI2RlZmluZSBEVl9QRl84ODg4ICgzPDw4KQotCi1zdHJ1Y3QgaW50ZWxfcmVnaW9uOwotc3RydWN0IGludGVsX2NvbnRleHQ7Ci0KLXR5cGVkZWYgdm9pZCAoKmludGVsX3RyaV9mdW5jKShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqLCBpbnRlbFZlcnRleCAqLCBpbnRlbFZlcnRleCAqLAotCQkJCQkJCSAgaW50ZWxWZXJ0ZXggKik7Ci10eXBlZGVmIHZvaWQgKCppbnRlbF9saW5lX2Z1bmMpKHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIGludGVsVmVydGV4ICosIGludGVsVmVydGV4ICopOwotdHlwZWRlZiB2b2lkICgqaW50ZWxfcG9pbnRfZnVuYykoc3RydWN0IGludGVsX2NvbnRleHQgKiwgaW50ZWxWZXJ0ZXggKik7Ci0KLSNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIJIDB4MQotI2RlZmluZSBJTlRFTF9GQUxMQkFDS19SRUFEX0JVRkZFUgkgMHgyCi0jZGVmaW5lIElOVEVMX0ZBTExCQUNLX1VTRVIJCSAweDQKLSNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfUkVOREVSTU9ERQkgMHg4Ci0jZGVmaW5lIElOVEVMX0ZBTExCQUNLX1RFWFRVUkUgICAJIDB4MTAKLQotZXh0ZXJuIHZvaWQgaW50ZWxGYWxsYmFjayggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgYml0LCBHTGJvb2xlYW4gbW9kZSApOwotI2RlZmluZSBGQUxMQkFDSyggaW50ZWwsIGJpdCwgbW9kZSApIGludGVsRmFsbGJhY2soIGludGVsLCBiaXQsIG1vZGUgKQotCi0KLQotc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0Ci17Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgYmFzZTsgLyogVGhlICJwYXJlbnQiIG9iamVjdCAqLwotCi0gICAvKiBUaGUgbWlwbWFwIHRyZWUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IHRoZXNlIGxldmVscyBvbmNlCi0gICAgKiB2YWxpZGF0ZWQ6Ci0gICAgKi8KLSAgIEdMdWludCBmaXJzdExldmVsOwotICAgR0x1aW50IGxhc3RMZXZlbDsKLQotICAgR0x1aW50IGRpcnR5X2ltYWdlc1s2XTsKLSAgIEdMdWludCBkaXJ0eTsKLQotICAgLyogT24gdmFsaWRhdGlvbiBhbnkgYWN0aXZlIGltYWdlcyBoZWxkIGluIG1haW4gbWVtb3J5IG9yIGluIG90aGVyCi0gICAgKiByZWdpb25zIHdpbGwgYmUgY29waWVkIHRvIHRoaXMgcmVnaW9uIGFuZCB0aGUgb2xkIHN0b3JhZ2UgZnJlZWQuCi0gICAgKi8KLSAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQ7Ci19OwotCi0KLQotc3RydWN0IGludGVsX2NvbnRleHQKLXsKLSAgIEdMY29udGV4dCBjdHg7CQkvKiB0aGUgcGFyZW50IGNsYXNzICovCi0KLSAgIHN0cnVjdCB7Ci0gICAgICB2b2lkICgqZGVzdHJveSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOyAKLSAgICAgIHZvaWQgKCplbWl0X3N0YXRlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqZW1pdF9pbnZhcmllbnRfc3RhdGUpKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLSAgICAgIHZvaWQgKCpsb3N0X2hhcmR3YXJlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqbm90ZV9mZW5jZSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGZlbmNlICk7Ci0gICAgICB2b2lkICgqbm90ZV91bmxvY2spKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLSAgICAgIHZvaWQgKCp1cGRhdGVfdGV4dHVyZV9zdGF0ZSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwotCi0gICAgICB2b2lkICgqcmVuZGVyX3N0YXJ0KSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqc2V0X2RyYXdfcmVnaW9uKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkcmF3X3JlZ2lvbiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb24gKTsKLQotICAgICAgR0x1aW50ICgqZmx1c2hfY21kKSggdm9pZCApOwotCi0gICAgICB2b2lkICgqZW1pdF9mbHVzaCkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgR0x1aW50IHVudXNlZCApOwotCi0gICAgICB2b2lkICgqYXViX2NvbW1hbmRzKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCSAgICBHTHVpbnQgb2Zmc2V0LAotCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJCSAgICBHTHVpbnQgc3ogKTsKLSAgICAgIHZvaWQgKCphdWJfZHVtcF9ibXApKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMdWludCBidWZmZXIgKTsKLSAgICAgIHZvaWQgKCphdWJfd3JhcCkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwotICAgICAgdm9pZCAoKmF1Yl9ndHRfZGF0YSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCQkgICAgR0x1aW50IG9mZnNldCwKLQkJCSAgICBjb25zdCB2b2lkICpzcmMsCi0JCQkgICAgR0x1aW50IHNpemUsCi0JCQkgICAgR0x1aW50IGF1YnR5cGUsIAotCQkJICAgIEdMdWludCBhdWJzdWJ0eXBlKTsKLQotCi0gICAgICB2b2lkICgqcmVkdWNlZF9wcmltaXRpdmVfc3RhdGUpKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMZW51bSBycHJpbSApOwotCi0gICAgICBHTGJvb2xlYW4gKCpjaGVja192ZXJ0ZXhfc2l6ZSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGV4cGVjdGVkICk7Ci0KLSAgICAgIHZvaWQgKCppbnZhbGlkYXRlX3N0YXRlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTHVpbnQgbmV3X3N0YXRlICk7Ci0KLSAgICAgIC8qIE1ldGFvcHM6IAotICAgICAgICovCi0gICAgICB2b2lkICgqaW5zdGFsbF9tZXRhX3N0YXRlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqbGVhdmVfbWV0YV9zdGF0ZSkoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwotCi0gICAgICB2b2lkICgqbWV0YV9kcmF3X3JlZ2lvbikoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkcmF3X3JlZ2lvbiwKLQkJCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb24gKTsKLQotICAgICAgdm9pZCAoKm1ldGFfY29sb3JfbWFzaykoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgICAgICBHTGJvb2xlYW4gKTsKLSAgICAgIAotICAgICAgdm9pZCAoKm1ldGFfc3RlbmNpbF9yZXBsYWNlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJCSAgICBHTHVpbnQgbWFzaywKLQkJCQkgICAgR0x1aW50IGNsZWFyICk7Ci0KLSAgICAgIHZvaWQgKCptZXRhX2RlcHRoX3JlcGxhY2UpKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLQotICAgICAgdm9pZCAoKm1ldGFfdGV4dHVyZV9ibGVuZF9yZXBsYWNlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7Ci0gICAgICAKLSAgICAgIHZvaWQgKCptZXRhX25vX3N0ZW5jaWxfd3JpdGUpKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLSAgICAgIHZvaWQgKCptZXRhX25vX2RlcHRoX3dyaXRlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqbWV0YV9ub190ZXh0dXJlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0gICAgICB2b2lkICgqbWV0YV9pbXBvcnRfcGl4ZWxfc3RhdGUpIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqIGludGVsKTsKLSAgICAgIHZvaWQgKCptZXRhX2ZyYW1lX2J1ZmZlcl90ZXh0dXJlKSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJCQkgR0xpbnQgeG9mZiwgR0xpbnQgeW9mZiApOwotCi0gICAgICB2b2lkICgqbWV0YV9kcmF3X3F1YWQpKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCQkgICAgIEdMZmxvYXQgeDAsIEdMZmxvYXQgeDEsCi0JCQkgICAgIEdMZmxvYXQgeTAsIEdMZmxvYXQgeTEsIAotCQkJICAgICBHTGZsb2F0IHosCi0JCQkgICAgIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLAotCQkJICAgICBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEsCi0JCQkgICAgIEdMZmxvYXQgczAsIEdMZmxvYXQgczEsCi0JCQkgICAgIEdMZmxvYXQgdDAsIEdMZmxvYXQgdDEpOwotCi0KLQotICAgfSB2dGJsOwotCi0gICBHTGludCByZWZjb3VudDsgICAKLSAgIEdMdWludCBGYWxsYmFjazsKLSAgIEdMdWludCBOZXdHTFN0YXRlOwotICAgCi0gICBHTHVpbnQgbGFzdF9zd2FwX2ZlbmNlOwotICAgR0x1aW50IHNlY29uZF9sYXN0X3N3YXBfZmVuY2U7Ci0gICAKLSAgIEdMYm9vbGVhbiBhdWJfd3JhcDsKLSAgIEdMdWludCBzdGF0c193bTsKLQotICAgc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaDsKLQotICAgR0x1Ynl0ZSBjbGVhcl9jaGFuWzRdOwotICAgR0x1aW50IENsZWFyQ29sb3I7Ci0gICBHTHVpbnQgQ2xlYXJEZXB0aDsKLQotICAgR0xmbG9hdCBkZXB0aF9zY2FsZTsKLSAgIEdMZmxvYXQgcG9seWdvbl9vZmZzZXRfc2NhbGU7IC8qIGRlcGVuZGVudCBvbiBkZXB0aF9zY2FsZSwgYnBwICovCi0gICBHTHVpbnQgZGVwdGhfY2xlYXJfbWFzazsKLSAgIEdMdWludCBzdGVuY2lsX2NsZWFyX21hc2s7Ci0KLSAgIEdMYm9vbGVhbiBod19zdGVuY2lsOwotICAgR0xib29sZWFuIGh3X3N0aXBwbGU7Ci0gICBHTGJvb2xlYW4gZGVwdGhfYnVmZmVyX2lzX2Zsb2F0OwotICAgR0xib29sZWFuIG5vX2h3OwotICAgR0xib29sZWFuIG5vX3Jhc3Q7Ci0gICBHTGJvb2xlYW4gdGhyYXNoaW5nOwotICAgR0xib29sZWFuIGxvY2tlZDsKLSAgIEdMYm9vbGVhbiBzdHJpY3RfY29uZm9ybWFuY2U7Ci0gICBHTGJvb2xlYW4gbmVlZF9mbHVzaDsKLQotCi0gICAKLSAgIC8qIEFHUCBtZW1vcnkgYnVmZmVyIG1hbmFnZXI6Ci0gICAgKi8KLSAgIHN0cnVjdCBidWZtZ3IgKmJtOwotCi0KLSAgIC8qIFN0YXRlIGZvciBpbnRlbHZiLmMgYW5kIGludGVsdHJpcy5jLgotICAgICovCi0gICBHTGVudW0gcmVuZGVyX3ByaW1pdGl2ZTsKLSAgIEdMZW51bSByZWR1Y2VkX3ByaW1pdGl2ZTsKLQotICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZnJvbnRfcmVnaW9uOwotICAgc3RydWN0IGludGVsX3JlZ2lvbiAqYmFja19yZWdpb247Ci0gICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkcmF3X3JlZ2lvbjsKLSAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlcHRoX3JlZ2lvbjsKLQotICAgLyogVGhlc2UgcmVmZXIgdG8gdGhlIGN1cnJlbnQgZHJhdyAoZnJvbnQgdnMuIGJhY2spIGJ1ZmZlcjoKLSAgICAqLwotICAgaW50IGRyYXdYOwkJCS8qIG9yaWdpbiBvZiBkcmF3YWJsZSBpbiBkcmF3IGJ1ZmZlciAqLwotICAgaW50IGRyYXdZOwotICAgR0x1aW50IG51bUNsaXBSZWN0czsJCS8qIGNsaXByZWN0cyBmb3IgdGhhdCBidWZmZXIgKi8KLSAgIGRybV9jbGlwX3JlY3RfdCAqcENsaXBSZWN0czsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqZnJhbWVfYnVmZmVyX3RleG9iajsKLQotICAgR0xib29sZWFuIHNjaXNzb3I7Ci0gICBkcm1fY2xpcF9yZWN0X3QgZHJhd19yZWN0OwotICAgZHJtX2NsaXBfcmVjdF90IHNjaXNzb3JfcmVjdDsKLQotICAgZHJtX2NvbnRleHRfdCBoSFdDb250ZXh0OwotICAgZHJtTG9jayAqZHJpSHdMb2NrOwotICAgaW50IGRyaUZkOwotCi0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd2FibGU7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcmVlbjsKLSAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW47IAotICAgdm9sYXRpbGUgZHJtSTgzMFNhcmVhICpzYXJlYTsgCi0gICAKLSAgIEZJTEUgKmF1Yl9maWxlOwotCi0gICBHTHVpbnQgbGFzdFN0YW1wOwotCi0gICAvKioKLSAgICAqIENvbmZpZ3VyYXRpb24gY2FjaGUKLSAgICAqLwotICAgZHJpT3B0aW9uQ2FjaGUgb3B0aW9uQ2FjaGU7Ci0KLSAgIC8qIFZCSQotICAgICovCi0gICBHTHVpbnQgdmJsX3NlcTsKLSAgIEdMdWludCB2YmxhbmtfZmxhZ3M7Ci0KLSAgIGludDY0X3Qgc3dhcF91c3Q7Ci0gICBpbnQ2NF90IHN3YXBfbWlzc2VkX3VzdDsKLQotICAgR0x1aW50IHN3YXBfY291bnQ7Ci0gICBHTHVpbnQgc3dhcF9taXNzZWRfY291bnQ7Ci19OwotCi0vKiBUaGVzZSBhcmUgZnVuY3Rpb25zIG5vdzoKLSAqLwotdm9pZCBMT0NLX0hBUkRXQVJFKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLXZvaWQgVU5MT0NLX0hBUkRXQVJFKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLQotCi0jZGVmaW5lIFNVQlBJWEVMX1ggMC4xMjUKLSNkZWZpbmUgU1VCUElYRUxfWSAwLjEyNQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb2xvciBwYWNraW5nOgotICovCi0KLSNkZWZpbmUgSU5URUxfUEFDS0NPTE9SNDQ0NChyLGcsYixhKSBcCi0gICgoKChhKSAmIDB4ZjApIDw8IDgpIHwgKCgocikgJiAweGYwKSA8PCA0KSB8ICgoZykgJiAweGYwKSB8ICgoYikgPj4gNCkpCi0KLSNkZWZpbmUgSU5URUxfUEFDS0NPTE9SMTU1NShyLGcsYixhKSBcCi0gICgoKChyKSAmIDB4ZjgpIDw8IDcpIHwgKCgoZykgJiAweGY4KSA8PCAyKSB8ICgoKGIpICYgMHhmOCkgPj4gMykgfCBcCi0gICAgKChhKSA/IDB4ODAwMCA6IDApKQotCi0jZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjU2NShyLGcsYikgXAotICAoKCgocikgJiAweGY4KSA8PCA4KSB8ICgoKGcpICYgMHhmYykgPDwgMykgfCAoKChiKSAmIDB4ZjgpID4+IDMpKQotCi0jZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjg4ODgocixnLGIsYSkgXAotICAoKGE8PDI0KSB8IChyPDwxNikgfCAoZzw8OCkgfCBiKQotCi0KLSNkZWZpbmUgSU5URUxfUEFDS0NPTE9SKGZvcm1hdCwgciwgIGcsICBiLCBhKQkJXAotKGZvcm1hdCA9PSBEVl9QRl81NTUgPyBJTlRFTF9QQUNLQ09MT1IxNTU1KHIsZyxiLGEpIDoJXAotIChmb3JtYXQgPT0gRFZfUEZfNTY1ID8gSU5URUxfUEFDS0NPTE9SNTY1KHIsZyxiKSA6CVwKLSAgKGZvcm1hdCA9PSBEVl9QRl84ODg4ID8gSU5URUxfUEFDS0NPTE9SODg4OChyLGcsYixhKSA6CVwKLSAgIDApKSkKLQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZyb20gbGludXgga2VybmVsIGkzODYgaGVhZGVyIGZpbGVzLCBjb3BlcyB3aXRoIG9kZCBzaXplcyBiZXR0ZXIKLSAqIHRoYW4gQ09QWV9EV09SRFMgd291bGQ6Ci0gKi8KLSNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKLXsKLSAgIGludCBkMCwgZDEsIGQyOwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0gICAgICAicmVwIDsgbW92c2xcblx0IgotICAgICAgInRlc3RiICQyLCViNFxuXHQiCi0gICAgICAiamUgMWZcblx0IgotICAgICAgIm1vdnN3XG4iCi0gICAgICAiMTpcdHRlc3RiICQxLCViNFxuXHQiCi0gICAgICAiamUgMmZcblx0IgotICAgICAgIm1vdnNiXG4iCi0gICAgICAiMjoiCi0gICAgICA6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKLSAgICAgIDoiMCIgKG4vNCksICJxIiAobiksIjEiICgobG9uZykgdG8pLCIyIiAoKGxvbmcpIGZyb20pCi0gICAgICA6ICJtZW1vcnkiKTsKLSAgIHJldHVybiAodG8pOwotfQotI2Vsc2UKLSNkZWZpbmUgX19tZW1jcHkoYSxiLGMpIG1lbWNweShhLGIsYykKLSNlbmRpZgotCi0KLS8qIFRoZSBzeXN0ZW0gbWVtY3B5IChhdCBsZWFzdCBvbiB1YnVudHUgNS4xMCkgaGFzIHByb2JsZW1zIGNvcHlpbmcKLSAqIHRvIGFncCAod3JpdGVjb21iaW5lZCkgbWVtb3J5IGZyb20gYSBzb3VyY2Ugd2hpY2ggaXNuJ3QgNjQtYnl0ZQotICogYWxpZ25lZCAtIHRoZXJlIGlzIGEgNHggcGVyZm9ybWFuY2UgZmFsbG9mZi4KLSAqCi0gKiBUaGUgeDg2IF9fbWVtY3B5IGlzIGltbXVuZSB0byB0aGlzIGJ1dCBpcyBzbGlnaHRseSBzbG93ZXIKLSAqICgxMCUtaXNoKSB0aGFuIHRoZSBzeXN0ZW0gbWVtY3B5LgotICoKLSAqIFRoZSBzc2VfbWVtY3B5IHNlZW1zIHRvIGhhdmUgYSBzbGlnaHQgY2xpZmYgYXQgNjQvMzIgYnl0ZXMsIGJ1dAotICogaXNuJ3QgbXVjaCBmYXN0ZXIgdGhhbiB4ODZfbWVtY3B5IGZvciBhZ3AgY29waWVzLgotICogCi0gKiBUT0RPOiBzd2l0Y2ggZHluYW1pY2FsbHkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqZG9fbWVtY3B5KCB2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuICkKLXsKLSAgIGlmICggKCgodW5zaWduZWQgbG9uZylzcmMpICYgNjMpIHx8Ci0JKCgodW5zaWduZWQgbG9uZylkZXN0KSAmIDYzKSkgewotICAgICAgcmV0dXJuICBfX21lbWNweShkZXN0LCBzcmMsIG4pOwkKLSAgIH0KLSAgIGVsc2UKLSAgICAgIHJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBuKTsKLX0KLQotCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBEZWJ1Z2dpbmc6Ci0gKi8KLWV4dGVybiBpbnQgSU5URUxfREVCVUc7Ci0KLSNkZWZpbmUgREVCVUdfVEVYVFVSRQkweDEKLSNkZWZpbmUgREVCVUdfU1RBVEUJMHgyCi0jZGVmaW5lIERFQlVHX0lPQ1RMCTB4NAotI2RlZmluZSBERUJVR19QUklNUwkweDgKLSNkZWZpbmUgREVCVUdfVkVSVFMJMHgxMAotI2RlZmluZSBERUJVR19GQUxMQkFDS1MJMHgyMAotI2RlZmluZSBERUJVR19WRVJCT1NFCTB4NDAKLSNkZWZpbmUgREVCVUdfRFJJICAgICAgIDB4ODAKLSNkZWZpbmUgREVCVUdfRE1BICAgICAgIDB4MTAwCi0jZGVmaW5lIERFQlVHX1NBTklUWSAgICAweDIwMAotI2RlZmluZSBERUJVR19TWU5DICAgICAgMHg0MDAKLSNkZWZpbmUgREVCVUdfU0xFRVAgICAgIDB4ODAwCi0jZGVmaW5lIERFQlVHX1BJWEVMICAgICAweDEwMDAKLSNkZWZpbmUgREVCVUdfU1RBVFMgICAgIDB4MjAwMAotI2RlZmluZSBERUJVR19USUxFICAgICAgMHg0MDAwCi0jZGVmaW5lIERFQlVHX1NJTkdMRV9USFJFQUQgICAweDgwMDAKLSNkZWZpbmUgREVCVUdfV00gICAgICAgIDB4MTAwMDAKLSNkZWZpbmUgREVCVUdfVVJCICAgICAgIDB4MjAwMDAKLSNkZWZpbmUgREVCVUdfVlMgICAgICAgIDB4NDAwMDAKLQotCi0jZGVmaW5lIFBDSV9DSElQXzg0NV9HCQkJMHgyNTYyCi0jZGVmaW5lIFBDSV9DSElQX0k4MzBfTQkJCTB4MzU3NwotI2RlZmluZSBQQ0lfQ0hJUF9JODU1X0dNCQkweDM1ODIKLSNkZWZpbmUgUENJX0NISVBfSTg2NV9HCQkJMHgyNTcyCi0jZGVmaW5lIFBDSV9DSElQX0k5MTVfRwkJCTB4MjU4MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0dNCQkweDI1OTIKLSNkZWZpbmUgUENJX0NISVBfSTk0NV9HCQkJMHgyNzcyCi0jZGVmaW5lIFBDSV9DSElQX0k5NjVfRwkJCTB4MjlBMgotI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X1EJCQkweDI5OTIKLSNkZWZpbmUgUENJX0NISVBfSTk2NV9HXzEJCTB4Mjk4MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTQ2X0daCQkweDI5NzIKLSNkZWZpbmUgUENJX0NISVBfSTk2NV9HTSAgICAgICAgICAgICAgICAweDJBMDIKLSNkZWZpbmUgUENJX0NISVBfSTk2NV9HTUUgICAgICAgICAgICAgICAweDJBMTIKLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBpbnRlbF9jb250ZXh0LmM6Ci0gKi8KLQotZXh0ZXJuIEdMYm9vbGVhbiBpbnRlbEluaXRDb250ZXh0KCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkJCSAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKm1lc2FWaXMsCi0JCQkJICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCQkJICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUsCi0JCQkJICAgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxHZXRMb2NrKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGZsYWdzKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxGaW5pc2goIEdMY29udGV4dCAqY3R4ICk7Ci1leHRlcm4gdm9pZCBpbnRlbEZsdXNoKCBHTGNvbnRleHQgKmN0eCApOwotCi1leHRlcm4gdm9pZCBpbnRlbEluaXREcml2ZXJGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogaW50ZWxfc3RhdGUuYzoKLSAqLwotZXh0ZXJuIHZvaWQgaW50ZWxJbml0U3RhdGVGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLQotI2RlZmluZSBDT01QQVJFRlVOQ19BTFdBWVMJCTAKLSNkZWZpbmUgQ09NUEFSRUZVTkNfTkVWRVIJCTB4MQotI2RlZmluZSBDT01QQVJFRlVOQ19MRVNTCQkweDIKLSNkZWZpbmUgQ09NUEFSRUZVTkNfRVFVQUwJCTB4MwotI2RlZmluZSBDT01QQVJFRlVOQ19MRVFVQUwJCTB4NAotI2RlZmluZSBDT01QQVJFRlVOQ19HUkVBVEVSCQkweDUKLSNkZWZpbmUgQ09NUEFSRUZVTkNfTk9URVFVQUwJCTB4NgotI2RlZmluZSBDT01QQVJFRlVOQ19HRVFVQUwJCTB4NwotCi0jZGVmaW5lIFNURU5DSUxPUF9LRUVQCQkJMAotI2RlZmluZSBTVEVOQ0lMT1BfWkVSTwkJCTB4MQotI2RlZmluZSBTVEVOQ0lMT1BfUkVQTEFDRQkJMHgyCi0jZGVmaW5lIFNURU5DSUxPUF9JTkNSU0FUCQkweDMKLSNkZWZpbmUgU1RFTkNJTE9QX0RFQ1JTQVQJCTB4NAotI2RlZmluZSBTVEVOQ0lMT1BfSU5DUgkJCTB4NQotI2RlZmluZSBTVEVOQ0lMT1BfREVDUgkJCTB4NgotI2RlZmluZSBTVEVOQ0lMT1BfSU5WRVJUCQkweDcKLQotI2RlZmluZSBMT0dJQ09QX0NMRUFSCQkJMAotI2RlZmluZSBMT0dJQ09QX05PUgkJCTB4MQotI2RlZmluZSBMT0dJQ09QX0FORF9JTlYgCQkweDIKLSNkZWZpbmUgTE9HSUNPUF9DT1BZX0lOVgkJMHgzCi0jZGVmaW5lIExPR0lDT1BfQU5EX1JWUlNFCQkweDQKLSNkZWZpbmUgTE9HSUNPUF9JTlYJCQkweDUKLSNkZWZpbmUgTE9HSUNPUF9YT1IJCQkweDYKLSNkZWZpbmUgTE9HSUNPUF9OQU5ECQkJMHg3Ci0jZGVmaW5lIExPR0lDT1BfQU5ECQkJMHg4Ci0jZGVmaW5lIExPR0lDT1BfRVFVSVYJCQkweDkKLSNkZWZpbmUgTE9HSUNPUF9OT09QCQkJMHhhCi0jZGVmaW5lIExPR0lDT1BfT1JfSU5WCQkJMHhiCi0jZGVmaW5lIExPR0lDT1BfQ09QWQkJCTB4YwotI2RlZmluZSBMT0dJQ09QX09SX1JWUlNFCQkweGQKLSNkZWZpbmUgTE9HSUNPUF9PUgkJCTB4ZQotI2RlZmluZSBMT0dJQ09QX1NFVAkJCTB4ZgotCi0jZGVmaW5lIEJMRU5ERkFDVF9aRVJPCQkJMHgwMQotI2RlZmluZSBCTEVOREZBQ1RfT05FCQkJMHgwMgotI2RlZmluZSBCTEVOREZBQ1RfU1JDX0NPTFIJCTB4MDMKLSNkZWZpbmUgQkxFTkRGQUNUX0lOVl9TUkNfQ09MUiAJCTB4MDQKLSNkZWZpbmUgQkxFTkRGQUNUX1NSQ19BTFBIQQkJMHgwNQotI2RlZmluZSBCTEVOREZBQ1RfSU5WX1NSQ19BTFBIQSAJMHgwNgotI2RlZmluZSBCTEVOREZBQ1RfRFNUX0FMUEhBCQkweDA3Ci0jZGVmaW5lIEJMRU5ERkFDVF9JTlZfRFNUX0FMUEhBIAkweDA4Ci0jZGVmaW5lIEJMRU5ERkFDVF9EU1RfQ09MUgkJMHgwOQotI2RlZmluZSBCTEVOREZBQ1RfSU5WX0RTVF9DT0xSCQkweDBhCi0jZGVmaW5lIEJMRU5ERkFDVF9TUkNfQUxQSEFfU0FUVVJBVEUJMHgwYgotI2RlZmluZSBCTEVOREZBQ1RfQ09OU1RfQ09MT1IJCTB4MGMKLSNkZWZpbmUgQkxFTkRGQUNUX0lOVl9DT05TVF9DT0xPUgkweDBkCi0jZGVmaW5lIEJMRU5ERkFDVF9DT05TVF9BTFBIQQkJMHgwZQotI2RlZmluZSBCTEVOREZBQ1RfSU5WX0NPTlNUX0FMUEhBCTB4MGYKLSNkZWZpbmUgQkxFTkRGQUNUX01BU0sgICAgICAgICAgCTB4MGYKLQotCi1leHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoIEdMZW51bSBmdW5jICk7Ci1leHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKCBHTGVudW0gb3AgKTsKLWV4dGVybiBpbnQgaW50ZWxfdHJhbnNsYXRlX2JsZW5kX2ZhY3RvciggR0xlbnVtIGZhY3RvciApOwotZXh0ZXJuIGludCBpbnRlbF90cmFuc2xhdGVfbG9naWNfb3AoIEdMZW51bSBvcGNvZGUgKTsKLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBpbnRlbF9idWZmZXJzLmM6Ci0gKi8KLXZvaWQgaW50ZWxJbml0QnVmZmVyRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci0KLXN0cnVjdCBpbnRlbF9yZWdpb24gKmludGVsX3JlYWRidWZfcmVnaW9uKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLXN0cnVjdCBpbnRlbF9yZWdpb24gKmludGVsX2RyYXdidWZfcmVnaW9uKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgKTsKLQotZXh0ZXJuIHZvaWQgaW50ZWxXaW5kb3dNb3ZlZCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Ci0KLWV4dGVybiBHTGJvb2xlYW4gaW50ZWxfaW50ZXJzZWN0X2NsaXByZWN0cyggZHJtX2NsaXBfcmVjdF90ICpkZXN0LAotCQkJCQkgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICphLAotCQkJCQkgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpiICk7Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogaW50ZWxfcGl4ZWxfY29weS5jOgotICovCi12b2lkIGludGVsQ29weVBpeGVscyhHTGNvbnRleHQgKiBjdHgsCi0gICAgICAgICAgICAgICAgICAgICBHTGludCBzcmN4LCBHTGludCBzcmN5LAotICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBHTGludCBkZXN0eCwgR0xpbnQgZGVzdHksIEdMZW51bSB0eXBlKTsKLQotR0xib29sZWFuIGludGVsX2NoZWNrX2JsaXRfZnJhZ21lbnRfb3BzKEdMY29udGV4dCAqIGN0eCk7Ci0KLXZvaWQgaW50ZWxCaXRtYXAoR0xjb250ZXh0ICogY3R4LAotCQkgR0xpbnQgeCwgR0xpbnQgeSwKLQkJIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotCQkgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCi0JCSBjb25zdCBHTHVieXRlICogcGl4ZWxzKTsKLQotdm9pZCBpbnRlbEluaXRFeHRlbnNpb25zKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gZW5hYmxlX2ltYWdpbmcpOwotI2RlZmluZSBfTkVXX1dJTkRPV19QT1MgMHg0MDAwMDAwMAotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5saW5lIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgCi0gKiBUaGVzZSBhcmUgYmV0dGVyLXR5cGVkIHRoYW4gdGhlIG1hY3JvcyB1c2VkIHByZXZpb3VzbHk6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsX2NvbnRleHQoIEdMY29udGV4dCAqY3R4ICkKLXsKLSAgIHJldHVybiAoc3RydWN0IGludGVsX2NvbnRleHQgKiljdHg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbF90ZXh0dXJlX29iamVjdCggc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpvYmogKQotewotICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKilvYmo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UgKmludGVsX3RleHR1cmVfaW1hZ2UoIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICppbWcgKQotewotICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqKWltZzsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfZGVjb2RlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY2NzFiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2RlY29kZS5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX2RlY29kZS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9kZXB0aHN0ZW5jaWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfZGVwdGhzdGVuY2lsLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGFjNGFlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfZGVwdGhzdGVuY2lsLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfZGVwdGhzdGVuY2lsLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2Ziby5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9mYm8uYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hMTlmODZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9mYm8uYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9mYm8uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfaW9jdGwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfaW9jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4ZTk3Ni4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2lvY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCi0jaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKLSNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgotI2luY2x1ZGUgImRybS5oIgotI2luY2x1ZGUgImJ1Zm1nci5oIgotCi1zdGF0aWMgaW50IGludGVsV2FpdElkbGVMb2NrZWQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApCi17Ci0gICBzdGF0aWMgaW50IGluX3dhaXRfaWRsZSA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgZmVuY2U7Ci0KLSAgIGlmICghaW5fd2FpdF9pZGxlKSB7Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TWU5DKSB7Ci0JIGZwcmludGYoc3RkZXJyLCAid2FpdGluZyBmb3IgaWRsZVxuIik7Ci0gICAgICB9Ci0KLSAgICAgIGluX3dhaXRfaWRsZSA9IDE7Ci0gICAgICBmZW5jZSA9IGJtU2V0RmVuY2UoaW50ZWwpOwotICAgICAgaW50ZWxXYWl0SXJxKGludGVsLCBmZW5jZSk7Ci0gICAgICBpbl93YWl0X2lkbGUgPSAwOwotCi0gICAgICByZXR1cm4gYm1UZXN0RmVuY2UoaW50ZWwsIGZlbmNlKTsKLSAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLX0KLQotaW50IGludGVsRW1pdElycUxvY2tlZCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKLXsKLSAgIGludCBzZXEgPSAxOwotCi0gICBpZiAoIWludGVsLT5ub19odykgewotICAgICAgZHJtSTgzMElycUVtaXQgaWU7Ci0gICAgICBpbnQgcmV0OwotICAgICAgCi0gICAgICBhc3NlcnQoKCgqKGludCAqKWludGVsLT5kcmlId0xvY2spICYgfkRSTV9MT0NLX0NPTlQpID09IAotCSAgICAgKERSTV9MT0NLX0hFTER8aW50ZWwtPmhIV0NvbnRleHQpKTsKLQotICAgICAgaWUuaXJxX3NlcSA9ICZzZXE7Ci0KLSAgICAgIHJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoIGludGVsLT5kcmlGZCwgRFJNX0k4MzBfSVJRX0VNSVQsIAotCQkJCSAmaWUsIHNpemVvZihpZSkgKTsKLSAgICAgIGlmICggcmV0ICkgewotCSBmcHJpbnRmKCBzdGRlcnIsICIlczogZHJtSTgzMElycUVtaXQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCApOwotCSBleGl0KDEpOwotICAgICAgfSAgIAotCi0gICAgICBpZiAoMCkKLQkgZnByaW50ZihzdGRlcnIsICIlcyAtLT4gICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNlcSApOwotICAgfQotCi0gICByZXR1cm4gc2VxOwotfQotCi12b2lkIGludGVsV2FpdElycSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBpbnQgc2VxICkKLXsKLSAgIGlmICghaW50ZWwtPm5vX2h3KSB7Ci0gICAgICBkcm1JODMwSXJxV2FpdCBpdzsKLSAgICAgIGludCByZXQsIGxhc3RkaXNwYXRjaDsKLSAgICAgIAotICAgICAgaWYgKDApCi0JIGZwcmludGYoc3RkZXJyLCAiJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc2VxICk7Ci0KLSAgICAgIGl3LmlycV9zZXEgPSBzZXE7Ci0JCi0gICAgICBkbyB7Ci0JIGxhc3RkaXNwYXRjaCA9IGludGVsLT5zYXJlYS0+bGFzdF9kaXNwYXRjaDsKLQkgcmV0ID0gZHJtQ29tbWFuZFdyaXRlKCBpbnRlbC0+ZHJpRmQsIERSTV9JODMwX0lSUV9XQUlULCAmaXcsIHNpemVvZihpdykgKTsKLQotCSAvKiBUaGlzIHNlZW1zIHF1aXRlIG9mdGVuIHRvIHJldHVybiBiZWZvcmUgaXQgc2hvdWxkIT8hIAotCSAgKi8KLSAgICAgIH0gd2hpbGUgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIgfHwgKHJldCA9PSAtRUJVU1kgJiYgbGFzdGRpc3BhdGNoICE9IGludGVsLT5zYXJlYS0+bGFzdF9kaXNwYXRjaCkgfHwgKHJldCA9PSAwICYmIHNlcSA+IGludGVsLT5zYXJlYS0+bGFzdF9kaXNwYXRjaCkKLQkgICAgICAgfHwgKHJldCA9PSAwICYmIGludGVsLT5zYXJlYS0+bGFzdF9kaXNwYXRjaCAtIHNlcSA+PSAoMSA8PCAyNCkpKTsKLSAgICAgIAotCi0gICAgICBpZiAoIHJldCApIHsKLQkgZnByaW50Ziggc3RkZXJyLCAiJXM6IGRybUk4MzBJcnFXYWl0OiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQgKTsKLQotCSBpZiAoaW50ZWwtPmF1Yl9maWxlKSB7Ci0JICAgIGludGVsLT52dGJsLmF1Yl9kdW1wX2JtcCggaW50ZWwsIGludGVsLT5jdHguVmlzdWFsLmRvdWJsZUJ1ZmZlck1vZGUgPyAxIDogMCApOwotCSB9Ci0KLQkgZXhpdCgxKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotCi12b2lkIGludGVsX2JhdGNoX2lvY3RsKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkJR0x1aW50IHN0YXJ0X29mZnNldCwKLQkJCUdMdWludCB1c2VkKQotewotICAgZHJtSTgzMEJhdGNoQnVmZmVyIGJhdGNoOwotCi0gICBhc3NlcnQoaW50ZWwtPmxvY2tlZCk7Ci0gICBhc3NlcnQodXNlZCk7Ci0KLSAgIGlmICgwKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyB1c2VkICVkIG9mZnNldCAleC4uJXhcbiIsCi0JICAgICAgX19GVU5DVElPTl9fLCAKLQkgICAgICB1c2VkLCAKLQkgICAgICBzdGFydF9vZmZzZXQsCi0JICAgICAgc3RhcnRfb2Zmc2V0ICsgdXNlZCk7Ci0KLSAgIGJhdGNoLnN0YXJ0ID0gc3RhcnRfb2Zmc2V0OwotICAgYmF0Y2gudXNlZCA9IHVzZWQ7Ci0gICBiYXRjaC5jbGlwcmVjdHMgPSBOVUxMOwotICAgYmF0Y2gubnVtX2NsaXByZWN0cyA9IDA7Ci0gICBiYXRjaC5EUjEgPSAwOwotICAgYmF0Y2guRFI0ID0gMDsKLSAgICAgIAotICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfRE1BKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogMHgleC4uMHgleFxuIiwKLQkgICAgICBfX0ZVTkNUSU9OX18sIAotCSAgICAgIGJhdGNoLnN0YXJ0LCAKLQkgICAgICBiYXRjaC5zdGFydCArIGJhdGNoLnVzZWQgKiA0KTsKLQotICAgaWYgKCFpbnRlbC0+bm9faHcpIHsKLSAgICAgIGlmIChkcm1Db21tYW5kV3JpdGUgKGludGVsLT5kcmlGZCwgRFJNX0k4MzBfQkFUQ0hCVUZGRVIsICZiYXRjaCwgCi0JCQkgICBzaXplb2YoYmF0Y2gpKSkgewotCSBmcHJpbnRmKHN0ZGVyciwgIkRSTV9JODMwX0JBVENIQlVGRkVSOiAlZFxuIiwgIC1lcnJubyk7Ci0JIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Ci0JIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NZTkMpIHsKLQlpbnRlbFdhaXRJZGxlTG9ja2VkKGludGVsKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotdm9pZCBpbnRlbF9jbWRfaW9jdGwoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCSAgICAgIGNoYXIgKmJ1ZiwKLQkJICAgICAgR0x1aW50IHVzZWQpCi17Ci0gICBkcm1JODMwQ21kQnVmZmVyIGNtZDsKLQotICAgYXNzZXJ0KGludGVsLT5sb2NrZWQpOwotICAgYXNzZXJ0KHVzZWQpOwotCi0gICBjbWQuYnVmID0gYnVmOwotICAgY21kLnN6ID0gdXNlZDsKLSAgIGNtZC5jbGlwcmVjdHMgPSBpbnRlbC0+cENsaXBSZWN0czsKLSAgIGNtZC5udW1fY2xpcHJlY3RzID0gMDsKLSAgIGNtZC5EUjEgPSAwOwotICAgY21kLkRSNCA9IDA7Ci0gICAgICAKLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0RNQSkKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IDB4JXguLjB4JXhcbiIsCi0JICAgICAgX19GVU5DVElPTl9fLCAKLQkgICAgICAwLCAKLQkgICAgICAwICsgY21kLnN6KTsKLQotICAgaWYgKCFpbnRlbC0+bm9faHcpIHsKLSAgICAgIGlmIChkcm1Db21tYW5kV3JpdGUgKGludGVsLT5kcmlGZCwgRFJNX0k4MzBfQ01EQlVGRkVSLCAmY21kLCAKLQkJCSAgIHNpemVvZihjbWQpKSkgewotCSBmcHJpbnRmKHN0ZGVyciwgIkRSTV9JODMwX0NNREJVRkZFUjogJWRcbiIsICAtZXJybm8pOwotCSBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCSBleGl0KDEpOwotICAgICAgfQotCi0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TWU5DKSB7Ci0JaW50ZWxXYWl0SWRsZUxvY2tlZChpbnRlbCk7Ci0gICAgICB9Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWZmZDBmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfaW9jdGwuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9pb2N0bC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9taXBtYXBfdHJlZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9taXBtYXBfdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg2MDg2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfbWlwbWFwX3RyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgotI2luY2x1ZGUgImJ1Zm1nci5oIgotI2luY2x1ZGUgImVudW1zLmgiCi0jaW5jbHVkZSAiaW1wb3J0cy5oIgotCi1zdGF0aWMgR0xlbnVtIHRhcmdldF90b190YXJnZXQoIEdMZW51bSB0YXJnZXQgKQotewotICAgc3dpdGNoICh0YXJnZXQpIHsKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0FSQjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0FSQjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0FSQjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0FSQjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQjoKLSAgICAgIHJldHVybiBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQjsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdGFyZ2V0OwotICAgfQotfQotCi1zdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmludGVsX21pcHRyZWVfY3JlYXRlKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJCQlHTGVudW0gdGFyZ2V0LAotCQkJCQkJR0xlbnVtIGludGVybmFsX2Zvcm1hdCwKLQkJCQkJCUdMdWludCBmaXJzdF9sZXZlbCwKLQkJCQkJCUdMdWludCBsYXN0X2xldmVsLAotCQkJCQkJR0x1aW50IHdpZHRoMCwKLQkJCQkJCUdMdWludCBoZWlnaHQwLAotCQkJCQkJR0x1aW50IGRlcHRoMCwKLQkJCQkJCUdMdWludCBjcHAsCi0JCQkJCQlHTGJvb2xlYW4gY29tcHJlc3NlZCkKLXsKLSAgIEdMYm9vbGVhbiBvazsKLSAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgPSBjYWxsb2Moc2l6ZW9mKCptdCksIDEpOwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotICAgICAgX21lc2FfcHJpbnRmKCIlcyB0YXJnZXQgJXMgZm9ybWF0ICVzIGxldmVsICVkLi4lZFxuIiwgX19GVU5DVElPTl9fLAotCQkgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucih0YXJnZXQpLAotCQkgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihpbnRlcm5hbF9mb3JtYXQpLAotCQkgICBmaXJzdF9sZXZlbCwKLQkJICAgbGFzdF9sZXZlbCk7Ci0KLSAgIG10LT50YXJnZXQgPSB0YXJnZXRfdG9fdGFyZ2V0KHRhcmdldCk7Ci0gICBtdC0+aW50ZXJuYWxfZm9ybWF0ID0gaW50ZXJuYWxfZm9ybWF0OwotICAgbXQtPmZpcnN0X2xldmVsID0gZmlyc3RfbGV2ZWw7Ci0gICBtdC0+bGFzdF9sZXZlbCA9IGxhc3RfbGV2ZWw7Ci0gICBtdC0+d2lkdGgwID0gd2lkdGgwOwotICAgbXQtPmhlaWdodDAgPSBoZWlnaHQwOwotICAgbXQtPmRlcHRoMCA9IGRlcHRoMDsKLSAgIG10LT5jcHAgPSBjb21wcmVzc2VkID8gMiA6IGNwcDsKLSAgIG10LT5jb21wcmVzc2VkID0gY29tcHJlc3NlZDsKLQotICAgc3dpdGNoIChpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSB7Ci0jaWYgMAotICAgY2FzZSBQQ0lfQ0hJUF9JOTQ1X0c6Ci0gICAgICBvayA9IGk5NDVfbWlwdHJlZV9sYXlvdXQoIG10ICk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgUENJX0NISVBfSTkxNV9HOgotICAgY2FzZSBQQ0lfQ0hJUF9JOTE1X0dNOgotICAgICAgb2sgPSBpOTE1X21pcHRyZWVfbGF5b3V0KCBtdCApOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotCSBfbWVzYV9wcmludGYoImFzc3VtaW5nIEJSVyB0ZXh0dXJlIGxheW91dHNcbiIpOwotICAgICAgb2sgPSBicndfbWlwdHJlZV9sYXlvdXQoIG10ICk7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgaWYgKG9rKQotICAgICAgbXQtPnJlZ2lvbiA9IGludGVsX3JlZ2lvbl9hbGxvYyggaW50ZWwsIAotCQkJCSAgICAgICBtdC0+Y3BwLAotCQkJCSAgICAgICBtdC0+cGl0Y2gsIAotCQkJCSAgICAgICBtdC0+dG90YWxfaGVpZ2h0ICk7Ci0KLSAgIGlmICghbXQtPnJlZ2lvbikgewotICAgICAgZnJlZShtdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgcmV0dXJuIG10OwotfQotCi0KLQotdm9pZCBpbnRlbF9taXB0cmVlX2Rlc3Ryb3koIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCSAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10ICkKLXsKLSAgIGlmIChtdCkgewotICAgICAgR0x1aW50IGk7Ci0KLSAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKGludGVsLCAmKG10LT5yZWdpb24pKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9URVhUVVJFX0xFVkVMUzsgaSsrKQotCSBpZiAobXQtPmxldmVsW2ldLmltYWdlX29mZnNldCkKLQkgICAgZnJlZShtdC0+bGV2ZWxbaV0uaW1hZ2Vfb2Zmc2V0KTsKLQotICAgICAgZnJlZShtdCk7Ci0gICB9Ci19Ci0KLQotCi0KLXZvaWQgaW50ZWxfbWlwdHJlZV9zZXRfbGV2ZWxfaW5mbyhzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCSAgR0x1aW50IGxldmVsLAotCQkJCSAgR0x1aW50IG5yX2ltYWdlcywKLQkJCQkgIEdMdWludCB4LCBHTHVpbnQgeSwKLQkJCQkgIEdMdWludCB3LCBHTHVpbnQgaCwgR0x1aW50IGQpCi17Ci0gICBtdC0+bGV2ZWxbbGV2ZWxdLndpZHRoID0gdzsKLSAgIG10LT5sZXZlbFtsZXZlbF0uaGVpZ2h0ID0gaDsKLSAgIG10LT5sZXZlbFtsZXZlbF0uZGVwdGggPSBkOwotICAgbXQtPmxldmVsW2xldmVsXS5sZXZlbF9vZmZzZXQgPSAoeCArIHkgKiBtdC0+cGl0Y2gpICogbXQtPmNwcDsKLSAgIG10LT5sZXZlbFtsZXZlbF0ubnJfaW1hZ2VzID0gbnJfaW1hZ2VzOwotCi0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotICAgICAgX21lc2FfcHJpbnRmKCIlcyBsZXZlbCAlZCBpbWcgc2l6ZTogJWQsJWQgbGV2ZWxfb2Zmc2V0IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgbGV2ZWwsIHcsIGgsIAotCQkgICBtdC0+bGV2ZWxbbGV2ZWxdLmxldmVsX29mZnNldCk7Ci0KLSAgIC8qIE5vdCBzdXJlIHdoZW4gdGhpcyB3b3VsZCBoYXBwZW4sIGJ1dCBhbnl3YXk6IAotICAgICovCi0gICBpZiAobXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXQpIHsKLSAgICAgIGZyZWUobXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXQpOwotICAgICAgbXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXQgPSBOVUxMOwotICAgfQotCi0gICBpZiAobnJfaW1hZ2VzID4gMSkgewotICAgICAgbXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXQgPSBtYWxsb2MobnJfaW1hZ2VzICogc2l6ZW9mKEdMdWludCkpOwotICAgICAgbXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXRbMF0gPSAwOwotICAgfQotfQotCi0KLQotdm9pZCBpbnRlbF9taXB0cmVlX3NldF9pbWFnZV9vZmZzZXQoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKLQkJCQkgICAgR0x1aW50IGxldmVsLAotCQkJCSAgICBHTHVpbnQgaW1nLAotCQkJCSAgICBHTHVpbnQgeCwgR0x1aW50IHkpCi17Ci0gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19URVhUVVJFKQotICAgICAgX21lc2FfcHJpbnRmKCIlcyBsZXZlbCAlZCBpbWcgJWQgcG9zICVkLCVkXG4iLCBfX0ZVTkNUSU9OX18sIGxldmVsLCBpbWcsIHgsIHkpOwotCi0gICBpZiAoaW1nID09IDApCi0gICAgICBhc3NlcnQoeCA9PSAwICYmIHkgPT0gMCk7Ci0KLSAgIGlmIChpbWcgPiAwKQotICAgICAgbXQtPmxldmVsW2xldmVsXS5pbWFnZV9vZmZzZXRbaW1nXSA9ICh4ICsgeSAqIG10LT5waXRjaCkgKiBtdC0+Y3BwOwotfQotCi0KLS8qIEFsdGhvdWdoIHdlIHVzZSB0aGUgaW1hZ2Vfb2Zmc2V0W10gYXJyYXkgdG8gc3RvcmUgcmVsYXRpdmUgb2Zmc2V0cwotICogdG8gY3ViZSBmYWNlcywgTWVzYSBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhpcyBhbmQgZXhwZWN0cwotICogZWFjaCBjdWJlIGZhY2UgdG8gYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGltYWdlLgotICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBwcmVzZW50IHRoYXQgdmlldyB0byBtZXNhOgotICovCi1jb25zdCBHTHVpbnQgKmludGVsX21pcHRyZWVfZGVwdGhfb2Zmc2V0cyhzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCQkgIEdMdWludCBsZXZlbCkKLXsKLSAgIHN0YXRpYyBjb25zdCBHTHVpbnQgemVybyA9IDA7Ci0KLSAgIGlmIChtdC0+dGFyZ2V0ICE9IEdMX1RFWFRVUkVfM0QgfHwKLSAgICAgICBtdC0+bGV2ZWxbbGV2ZWxdLm5yX2ltYWdlcyA9PSAxKQotICAgICAgcmV0dXJuICZ6ZXJvOwotICAgZWxzZQotICAgICAgcmV0dXJuIG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0OwotfQotCi0KLUdMdWludCBpbnRlbF9taXB0cmVlX2ltYWdlX29mZnNldChzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCSAgR0x1aW50IGZhY2UsCi0JCQkJICBHTHVpbnQgbGV2ZWwpCi17Ci0gICBpZiAobXQtPnRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQikKLSAgICAgIHJldHVybiAobXQtPmxldmVsW2xldmVsXS5sZXZlbF9vZmZzZXQgKwotCSAgICAgIG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0W2ZhY2VdKTsKLSAgIGVsc2UKLSAgICAgIHJldHVybiBtdC0+bGV2ZWxbbGV2ZWxdLmxldmVsX29mZnNldDsKLX0KLQotCi0KLQotCi0KLS8qIFVwbG9hZCBkYXRhIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UuCi0gKi8KLUdMYm9vbGVhbiBpbnRlbF9taXB0cmVlX2ltYWdlX2RhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCQkgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmRzdCwKLQkJCQkgICBHTHVpbnQgZmFjZSwKLQkJCQkgICBHTHVpbnQgbGV2ZWwsCi0JCQkJICAgY29uc3Qgdm9pZCAqc3JjLCAKLQkJCQkgICBHTHVpbnQgc3JjX3Jvd19waXRjaCwKLQkJCQkgICBHTHVpbnQgc3JjX2ltYWdlX3BpdGNoKQotewotICAgR0x1aW50IGRlcHRoID0gZHN0LT5sZXZlbFtsZXZlbF0uZGVwdGg7Ci0gICBHTHVpbnQgZHN0X29mZnNldCA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGRzdCwgZmFjZSwgbGV2ZWwpOwotICAgY29uc3QgR0x1aW50ICpkc3RfZGVwdGhfb2Zmc2V0ID0gaW50ZWxfbWlwdHJlZV9kZXB0aF9vZmZzZXRzKGRzdCwgbGV2ZWwpOwotICAgR0x1aW50IGk7Ci0KLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotICAgICAgaWYgKCFpbnRlbF9yZWdpb25fZGF0YShpbnRlbCwKLQkJCSAgICAgZHN0LT5yZWdpb24sIAotCQkJICAgICBkc3Rfb2Zmc2V0ICsgZHN0X2RlcHRoX29mZnNldFtpXSwKLQkJCSAgICAgMCwKLQkJCSAgICAgMCwKLQkJCSAgICAgc3JjLAotCQkJICAgICBzcmNfcm93X3BpdGNoLAotCQkJICAgICAwLCAwLAkvKiBzb3VyY2UgeCx5ICovCi0JCQkgICAgIGRzdC0+bGV2ZWxbbGV2ZWxdLndpZHRoLAotCQkJICAgICBkc3QtPmxldmVsW2xldmVsXS5oZWlnaHQpKQotCSByZXR1cm4gR0xfRkFMU0U7Ci0gICAgICBzcmMgKz0gc3JjX2ltYWdlX3BpdGNoOwotICAgfQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfbWlwbWFwX3RyZWUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfbWlwbWFwX3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNDJmZWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9taXBtYXBfdHJlZS5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX21pcG1hcF90cmVlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX21pcG1hcF90cmVlLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX21pcG1hcF90cmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDcxNjcuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9taXBtYXBfdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5URUxfTUlQTUFQX1RSRUVfSAotI2RlZmluZSBJTlRFTF9NSVBNQVBfVFJFRV9ICi0KLSNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCi0KLS8qIEEgbGF5ZXIgb24gdG9wIG9mIHRoZSBpbnRlbF9yZWdpb25zIGNvZGUgd2hpY2ggYWRkczoKLSAqCi0gKiAtIENvZGUgdG8gc2l6ZSBhbmQgbGF5b3V0IGEgcmVnaW9uIHRvIGhvbGQgYSBzZXQgb2YgbWlwbWFwcy4KLSAqIC0gUXVlcnkgdG8gZGV0ZXJtaW5lIGlmIGEgbmV3IGltYWdlIGZpdHMgaW4gYW4gZXhpc3RpbmcgdHJlZS4KLSAqCi0gKiBUaGUgZml4ZWQgbWlwbWFwIGxheW91dCBvZiBpbnRlbCBoYXJkd2FyZSB3aGVyZSBvbmUgb2Zmc2V0Ci0gKiBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIGFsbCBpbWFnZXMgaW4gYSBtaXBtYXAgaGllcmFjaHkKLSAqIGNvbXBsaWNhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHTCB0ZXh0dXJlIGltYWdlIGNvbW1hbmRzLAotICogY29tcGFyZWQgdG8gaGFyZHdhcmUgd2hlcmUgZWFjaCBpbWFnZSBpcyBzcGVjaWZpZWQgd2l0aCBhbgotICogaW5kZXBlbmRlbnQgb2Zmc2V0LgotICoKLSAqIEluIGFuIGlkZWFsIHdvcmxkLCBlYWNoIHRleHR1cmUgb2JqZWN0IHdvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhCi0gKiBzaW5nbGUgYnVmbWdyIGJ1ZmZlciBvciAyZCBpbnRlbF9yZWdpb24sIGFuZCBhbGwgdGhlIGltYWdlcyB3aXRoaW4KLSAqIHRoZSB0ZXh0dXJlIG9iamVjdCB3b3VsZCBzbG90IGludG8gdGhlIHRyZWUgYXMgdGhleSBhcnJpdmUuICBUaGUKLSAqIHJlYWxpdHkgY2FuIGJlIGEgbGl0dGxlIG1lc3NpZXIsIGFzIGltYWdlcyBjYW4gYXJyaXZlIGZyb20gdGhlIHVzZXIKLSAqIHdpdGggc2l6ZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGV4aXN0aW5nIHRyZWUsIG9yIGluIGFuIG9yZGVyCi0gKiB3aGVyZSB0aGUgdHJlZSBsYXlvdXQgY2Fubm90IGJlIGd1ZXNzZWQgaW1tZWRpYXRlbHkuICAKLSAqIAotICogVGhpcyBzdHJ1Y3R1cmUgZW5jb2RlcyBhbiBpZGVhbGl6ZWQgbWlwbWFwIHRyZWUuICBUaGUgR0wgaW1hZ2UKLSAqIGNvbW1hbmRzIGJ1aWxkIHRoZXNlIHdoZXJlIHBvc3NpYmxlLCBvdGhlcndpc2Ugc3RvcmUgdGhlIGltYWdlcyBpbgotICogdGVtcG9yYXJ5IHN5c3RlbSBidWZmZXJzLgotICovCi0KLQotc3RydWN0IGludGVsX21pcG1hcF9sZXZlbCB7Ci0gICBHTHVpbnQgbGV2ZWxfb2Zmc2V0OwotICAgR0x1aW50IHdpZHRoOwotICAgR0x1aW50IGhlaWdodDsKLSAgIEdMdWludCBkZXB0aDsKLSAgIEdMdWludCBucl9pbWFnZXM7Ci0KLSAgIC8qIEV4cGxpY2l0bHkgc3RvcmUgdGhlIG9mZnNldCBvZiBlYWNoIGltYWdlIGZvciBlYWNoIGN1YmUgZmFjZSBvcgotICAgICogZGVwdGggdmFsdWUuICBQcmV0dHkgbXVjaCBoYXZlIHRvIGFjY2VwdCB0aGF0IGhhcmR3YXJlIGZvcm1hdHMKLSAgICAqIGFyZSBnb2luZyB0byBiZSBzbyBkaXZlcnNlIHRoYXQgdGhlcmUgaXMgbm8gdW5pZmllZCB3YXkgdG8KLSAgICAqIGNvbXB1dGUgdGhlIG9mZnNldHMgb2YgZGVwdGgvY3ViZSBpbWFnZXMgd2l0aGluIGEgbWlwbWFwIGxldmVsLAotICAgICogc28gaGF2ZSB0byBzdG9yZSB0aGVtIGFzIGEgbG9va3VwIHRhYmxlOgotICAgICovCi0gICBHTHVpbnQgKmltYWdlX29mZnNldDsKLX07Ci0KLXN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSB7Ci0gICAvKiBFZmZlY3RpdmVseSB0aGUga2V5OgotICAgICovCi0gICBHTGVudW0gdGFyZ2V0OwotICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdDsKLQotICAgR0x1aW50IGZpcnN0X2xldmVsOwotICAgR0x1aW50IGxhc3RfbGV2ZWw7Ci0KLSAgIEdMdWludCB3aWR0aDAsIGhlaWdodDAsIGRlcHRoMDsKLSAgIEdMdWludCBjcHA7Ci0gICBHTGJvb2xlYW4gY29tcHJlc3NlZDsKLQotICAgLyogRGVyaXZlZCBmcm9tIHRoZSBhYm92ZToKLSAgICAqLyAgIAotICAgR0x1aW50IHBpdGNoOwotICAgR0x1aW50IGRlcHRoX3BpdGNoOwkJLyogcGVyLWltYWdlIG9uIGk5NDU/ICovCi0gICBHTHVpbnQgdG90YWxfaGVpZ2h0OwotICAgCi0gICAvKiBJbmNsdWRlcyBpbWFnZSBvZmZzZXQgdGFibGVzOgotICAgICovCi0gICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX2xldmVsIGxldmVsW01BWF9URVhUVVJFX0xFVkVMU107Ci0KLSAgIC8qIFRoZSBkYXRhIGlzIGhlbGQgaGVyZToKLSAgICAqLwotICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uOwotCi0gICAvKiBUaGVzZSBhcmUgYWxzbyByZWZjb3VudGVkOgotICAgICovCi0gICBHTHVpbnQgcmVmY291bnQ7Ci19OwotCi0KLQotc3RydWN0IGludGVsX21pcG1hcF90cmVlICppbnRlbF9taXB0cmVlX2NyZWF0ZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJCQkJR0xlbnVtIHRhcmdldCwKLQkJCQkJCUdMZW51bSBpbnRlcm5hbF9mb3JtYXQsCi0JCQkJCQlHTHVpbnQgZmlyc3RfbGV2ZWwsCi0JCQkJCQlHTHVpbnQgbGFzdF9sZXZlbCwKLQkJCQkJCUdMdWludCB3aWR0aDAsCi0JCQkJCQlHTHVpbnQgaGVpZ2h0MCwKLQkJCQkJCUdMdWludCBkZXB0aDAsCi0JCQkJCQlHTHVpbnQgY3BwLAotCQkJCQkJR0xib29sZWFuIGNvbXByZXNzZWQpOwotCi12b2lkIGludGVsX21pcHRyZWVfZGVzdHJveSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgKTsKLQotCi0vKiBSZXR1cm4gdGhlIGxpbmVhciBvZmZzZXQgb2YgYW4gaW1hZ2UgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICogdHJlZToKLSAqLwotR0x1aW50IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KCBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCSAgIEdMdWludCBmYWNlLAotCQkJCSAgIEdMdWludCBsZXZlbCApOwotCi0vKiBSZXR1cm4gcG9pbnRlcnMgdG8gZWFjaCAyZCBzbGljZSB3aXRoaW4gYW4gaW1hZ2UuICBJbmRleGVkIGJ5IGRlcHRoCi0gKiB2YWx1ZS4KLSAqLwotY29uc3QgR0x1aW50ICppbnRlbF9taXB0cmVlX2RlcHRoX29mZnNldHMoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKLQkJCQkJICBHTHVpbnQgbGV2ZWwpOwotCi0KLXZvaWQgaW50ZWxfbWlwdHJlZV9zZXRfbGV2ZWxfaW5mbyhzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCSAgR0x1aW50IGxldmVsLAotCQkJCSAgR0x1aW50IG5yX2ltYWdlcywKLQkJCQkgIEdMdWludCB4LCBHTHVpbnQgeSwKLQkJCQkgIEdMdWludCB3LCBHTHVpbnQgaCwgR0x1aW50IGQpOwotCi12b2lkIGludGVsX21pcHRyZWVfc2V0X2ltYWdlX29mZnNldChzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAotCQkJCSAgICBHTHVpbnQgbGV2ZWwsCi0JCQkJICAgIEdMdWludCBpbWcsCi0JCQkJICAgIEdMdWludCB4LCBHTHVpbnQgeSk7Ci0KLQotLyogVXBsb2FkIGFuIGltYWdlIGludG8gYSB0cmVlCi0gKi8KLUdMYm9vbGVhbiBpbnRlbF9taXB0cmVlX2ltYWdlX2RhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCQkgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmRzdCwKLQkJCQkgICBHTHVpbnQgZmFjZSwKLQkJCQkgICBHTHVpbnQgbGV2ZWwsCi0JCQkJICAgY29uc3Qgdm9pZCAqc3JjLCAKLQkJCQkgICBHTHVpbnQgc3JjX3Jvd19waXRjaCwKLQkJCQkgICBHTHVpbnQgc3JjX2ltYWdlX3BpdGNoKTsKLQotLyogaTkxNV9taXBtYXBfdHJlZS5jOgotICovCi1HTGJvb2xlYW4gaTkxNV9taXB0cmVlX2xheW91dCggc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCApOwotR0xib29sZWFuIGk5NDVfbWlwdHJlZV9sYXlvdXQoIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgKTsKLUdMYm9vbGVhbiBicndfbWlwdHJlZV9sYXlvdXQoIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgKTsKLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9waXhlbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9waXhlbC5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmQ3MzNjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfcGl4ZWwuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcGl4ZWxfYml0bWFwLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsX2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjkwODVjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsX2JpdG1hcC5jCkBAIC0wLDAgKzEgQEAKKy4uL2ludGVsL2ludGVsX3BpeGVsX2JpdG1hcC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9waXhlbF9jb3B5LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsX2NvcHkuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lZTQzMzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9waXhlbF9jb3B5LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfcGl4ZWxfY29weS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9yZWcuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDQ4YjMuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9yZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfSU5URUxfUkVHX0hfCi0jZGVmaW5lIF9JTlRFTF9SRUdfSF8KLQotCi0KLSNkZWZpbmUgQ01EXzNEICgweDM8PDI5KQotCi0KLSNkZWZpbmUgXzNEUFJJTUlUSVZFICAgICAgICAgKCgweDM8PDI5KXwoMHgxZjw8MjQpKQotI2RlZmluZSBQUklNX0lORElSRUNUICAgICAgICAgICAgKDE8PDIzKQotI2RlZmluZSBQUklNX0lOTElORSAgICAgICAgICAgICAgKDA8PDIzKQotI2RlZmluZSBQUklNX0lORElSRUNUX1NFUVVFTlRJQUwgKDA8PDE3KQotI2RlZmluZSBQUklNX0lORElSRUNUX0VMVFMgICAgICAgKDE8PDE3KQotCi0jZGVmaW5lIFBSSU0zRF9UUklMSVNUCQkoMHgwPDwxOCkKLSNkZWZpbmUgUFJJTTNEX1RSSVNUUklQIAkoMHgxPDwxOCkKLSNkZWZpbmUgUFJJTTNEX1RSSVNUUklQX1JWUlNFCSgweDI8PDE4KQotI2RlZmluZSBQUklNM0RfVFJJRkFOCQkoMHgzPDwxOCkKLSNkZWZpbmUgUFJJTTNEX1BPTFkJCSgweDQ8PDE4KQotI2RlZmluZSBQUklNM0RfTElORUxJU1QgCSgweDU8PDE4KQotI2RlZmluZSBQUklNM0RfTElORVNUUklQCSgweDY8PDE4KQotI2RlZmluZSBQUklNM0RfUkVDVExJU1QgCSgweDc8PDE4KQotI2RlZmluZSBQUklNM0RfUE9JTlRMSVNUCSgweDg8PDE4KQotI2RlZmluZSBQUklNM0RfRElCCQkoMHg5PDwxOCkKLSNkZWZpbmUgUFJJTTNEX01BU0sJCSgweDFmPDwxOCkKLQotI2RlZmluZSBJOTE1UEFDS0NPTE9SNDQ0NChyLGcsYixhKSBcCi0gICgoKChhKSAmIDB4ZjApIDw8IDgpIHwgKCgocikgJiAweGYwKSA8PCA0KSB8ICgoZykgJiAweGYwKSB8ICgoYikgPj4gNCkpCi0KLSNkZWZpbmUgSTkxNVBBQ0tDT0xPUjE1NTUocixnLGIsYSkgXAotICAoKCgocikgJiAweGY4KSA8PCA3KSB8ICgoKGcpICYgMHhmOCkgPDwgMikgfCAoKChiKSAmIDB4ZjgpID4+IDMpIHwgXAotICAgICgoYSkgPyAweDgwMDAgOiAwKSkKLQotI2RlZmluZSBJOTE1UEFDS0NPTE9SNTY1KHIsZyxiKSBcCi0gICgoKChyKSAmIDB4ZjgpIDw8IDgpIHwgKCgoZykgJiAweGZjKSA8PCAzKSB8ICgoKGIpICYgMHhmOCkgPj4gMykpCi0KLSNkZWZpbmUgSTkxNVBBQ0tDT0xPUjg4ODgocixnLGIsYSkgXAotICAoKGE8PDI0KSB8IChyPDwxNikgfCAoZzw8OCkgfCBiKQotCi0KLQotCi0jZGVmaW5lIEJSMDBfQklUQkxUX0NMSUVOVCAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgQlIwMF9PUF9DT0xPUl9CTFQgICAgMHgxMDAwMDAwMAotI2RlZmluZSBCUjAwX09QX1NSQ19DT1BZX0JMVCAweDEwQzAwMDAwCi0jZGVmaW5lIEJSMTNfU09MSURfUEFUVEVSTiAgIDB4ODAwMDAwMDAKLQotI2RlZmluZSBYWV9DT0xPUl9CTFRfQ01ECQkoKDI8PDI5KXwoMHg1MDw8MjIpfDB4NCkKLSNkZWZpbmUgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBCSgxPDwyMSkKLSNkZWZpbmUgWFlfQ09MT1JfQkxUX1dSSVRFX1JHQgkJKDE8PDIwKQotCi0jZGVmaW5lIFhZX1NSQ19DT1BZX0JMVF9DTUQgICAgICAgICAgICAgKCgyPDwyOSl8KDB4NTM8PDIyKXw2KQotI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgICAgICgxPDwyMSkKLSNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQiAgICAgICAoMTw8MjApCi0KLSNkZWZpbmUgWFlfU1JDX1RJTEVEICAoMTw8MTUpCi0jZGVmaW5lIFhZX0RTVF9USUxFRCAgKDE8PDExKQotCi0jZGVmaW5lIEZFTkNFX0xJTkVBUiAwCi0jZGVmaW5lIEZFTkNFX1hNQUpPUiAxCi0jZGVmaW5lIEZFTkNFX1lNQUpPUiAyCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9yZWdpb25zLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3JlZ2lvbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1ZWNkZC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3JlZ2lvbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQcm92aWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYnVmbWdyIGJ1ZmZlcnM6Ci0gKiAgIC0gMmQgc2VtYW50aWNzIGFuZCBibGl0IG9wZXJhdGlvbnMKLSAqICAgLSByZWZjb3VudGluZyBvZiBidWZmZXJzIGZvciBtdWx0aXBsZSBpbWFnZXMgaW4gYSBidWZmZXIuCi0gKiAgIC0gcmVmY291bnRpbmcgb2YgYnVmZmVyIG1hcHBpbmdzLgotICogICAtIHNvbWUgbG9naWMgZm9yIG1vdmluZyB0aGUgYnVmZmVycyB0byB0aGUgYmVzdCBtZW1vcnkgcG9vbHMgZm9yCi0gKiAgICAgZ2l2ZW4gb3BlcmF0aW9ucy4KLSAqCi0gKiBNb3N0IG9mIHRoaXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gaW1wbGVtZW50IHRoZSBmaXhlZC1sYXlvdXQKLSAqIG1pcG1hcCB0cmVlIHJlcXVpcmVkIGJ5IGludGVsIGhhcmR3YXJlIGluIHRoZSBmYWNlIG9mIEdMJ3MKLSAqIHByb2dyYW1taW5nIGludGVyZmFjZSB3aGVyZSBlYWNoIGltYWdlIGNhbiBiZSBzcGVjaWZlZCBpbiByYW5kb20KLSAqIG9yZGVyIGFuZCBpdCBpc24ndCBjbGVhciB3aGF0IGxheW91dCB0aGUgdHJlZSBzaG91bGQgaGF2ZSB1bnRpbCB0aGUKLSAqIGxhc3QgbW9tZW50LgotICovCi0KLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgotI2luY2x1ZGUgImludGVsX2JsaXQuaCIKLSNpbmNsdWRlICJidWZtZ3IuaCIKLSNpbmNsdWRlICJpbXBvcnRzLmgiCi0KLS8qIFhYWDogVGhyZWFkIHNhZmV0eT8KLSAqLwotR0x1Ynl0ZSAqaW50ZWxfcmVnaW9uX21hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbikKLXsKLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICBpZiAoIXJlZ2lvbi0+bWFwX3JlZmNvdW50KyspIHsKLSAgICAgIHJlZ2lvbi0+bWFwID0gYm1NYXBCdWZmZXIoaW50ZWwsIHJlZ2lvbi0+YnVmZmVyLCAwKTsKLSAgICAgIGlmICghcmVnaW9uLT5tYXApCi0JIHJlZ2lvbi0+bWFwX3JlZmNvdW50LS07Ci0gICB9Ci0KLSAgIHJldHVybiByZWdpb24tPm1hcDsKLX0KLQotdm9pZCBpbnRlbF9yZWdpb25fdW5tYXAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCXN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbikKLXsKLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICBpZiAoIS0tcmVnaW9uLT5tYXBfcmVmY291bnQpIHsKLSAgICAgIGJtVW5tYXBCdWZmZXJBVUIoaW50ZWwsIHJlZ2lvbi0+YnVmZmVyLCAwLCAwKTsKLSAgICAgIHJlZ2lvbi0+bWFwID0gTlVMTDsKLSAgIH0KLX0KLQotc3RydWN0IGludGVsX3JlZ2lvbiAqaW50ZWxfcmVnaW9uX2FsbG9jKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkJCQkgR0x1aW50IGNwcCwKLQkJCQkJIEdMdWludCBwaXRjaCwgCi0JCQkJCSBHTHVpbnQgaGVpZ2h0ICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbiA9IGNhbGxvYyhzaXplb2YoKnJlZ2lvbiksIDEpOwotCi0gICBEQkcoIiVzICVkeCVkeCVkID09IDB4JXggYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICBjcHAsIHBpdGNoLCBoZWlnaHQsIGNwcCpwaXRjaCpoZWlnaHQpOwotCi0gICByZWdpb24tPmNwcCA9IGNwcDsKLSAgIHJlZ2lvbi0+cGl0Y2ggPSBwaXRjaDsKLSAgIHJlZ2lvbi0+aGVpZ2h0ID0gaGVpZ2h0OyAJLyogbmVlZGVkPyAqLwotICAgcmVnaW9uLT5yZWZjb3VudCA9IDE7Ci0KLSAgIGJtR2VuQnVmZmVycyhpbnRlbCwgInRleCIsIDEsICZyZWdpb24tPmJ1ZmZlciwgNik7Ci0gICBibUJ1ZmZlckRhdGEoaW50ZWwsIHJlZ2lvbi0+YnVmZmVyLCBwaXRjaCAqIGNwcCAqIGhlaWdodCwgTlVMTCwgMCk7Ci0KLSAgIHJldHVybiByZWdpb247Ci19Ci0KLXZvaWQgaW50ZWxfcmVnaW9uX3JlZmVyZW5jZSggc3RydWN0IGludGVsX3JlZ2lvbiAqKmRzdCwKLQkJCSAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqc3JjKQotewotICAgc3JjLT5yZWZjb3VudCsrOwotICAgYXNzZXJ0KCpkc3QgPT0gTlVMTCk7Ci0gICAqZHN0ID0gc3JjOwotfQotCi12b2lkIGludGVsX3JlZ2lvbl9yZWxlYXNlKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICoqcmVnaW9uICkKLXsKLSAgIGlmICghKnJlZ2lvbikKLSAgICAgIHJldHVybjsKLQotICAgREJHKCIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCAoKnJlZ2lvbiktPnJlZmNvdW50LTEpOwotICAgCi0gICBpZiAoLS0oKnJlZ2lvbiktPnJlZmNvdW50ID09IDApIHsKLSAgICAgIGFzc2VydCgoKnJlZ2lvbiktPm1hcF9yZWZjb3VudCA9PSAwKTsKLSAgICAgIGJtRGVsZXRlQnVmZmVycyhpbnRlbCwgMSwgJigqcmVnaW9uKS0+YnVmZmVyKTsKLSAgICAgIGZyZWUoKnJlZ2lvbik7Ci0gICB9Ci0gICAqcmVnaW9uID0gTlVMTDsKLX0KLQotCi1zdHJ1Y3QgaW50ZWxfcmVnaW9uICppbnRlbF9yZWdpb25fY3JlYXRlX3N0YXRpYyggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJCQkJCSBHTHVpbnQgbWVtX3R5cGUsCi0JCQkJCQkgR0x1aW50IG9mZnNldCwKLQkJCQkJCSB2b2lkICp2aXJ0dWFsLAotCQkJCQkJIEdMdWludCBjcHAsCi0JCQkJCQkgR0x1aW50IHBpdGNoLCAKLQkJCQkJCSBHTHVpbnQgaGVpZ2h0LAotCQkJCQkJIEdMdWludCBzaXplLAotCQkJCQkJIEdMYm9vbGVhbiB0aWxlZCApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24gPSBjYWxsb2Moc2l6ZW9mKCpyZWdpb24pLCAxKTsKLSAgIEdMaW50IHBvb2w7Ci0KLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIHJlZ2lvbi0+Y3BwID0gY3BwOwotICAgcmVnaW9uLT5waXRjaCA9IHBpdGNoOwotICAgcmVnaW9uLT5oZWlnaHQgPSBoZWlnaHQ7IAkvKiBuZWVkZWQ/ICovCi0gICByZWdpb24tPnJlZmNvdW50ID0gMTsKLSAgIHJlZ2lvbi0+dGlsZWQgPSB0aWxlZDsKLQotICAgLyogUmVjaXBlIGZvciBjcmVhdGluZyBhIHN0YXRpYyBidWZmZXIgLSBjcmVhdGUgYSBzdGF0aWMgcG9vbCB3aXRoCi0gICAgKiB0aGUgcmlnaHQgb2Zmc2V0IGFuZCBzaXplLCBnZW5lcmF0ZSBhIGJ1ZmZlciBhbmQgdXNlIGEgc3BlY2lhbAotICAgICogY2FsbCB0byBiaW5kIGl0IHRvIGFsbCBvZiB0aGUgbWVtb3J5IGluIHRoYXQgcG9vbC4KLSAgICAqLwotICAgcG9vbCA9IGJtSW5pdFBvb2woaW50ZWwsIG9mZnNldCwgdmlydHVhbCwgc2l6ZSwgCi0JCSAgICAgKEJNX01FTV9BR1AgfAotCQkgICAgICBCTV9OT19VUExPQUQgfCAKLQkJICAgICAgQk1fTk9fRVZJQ1QgfCAKLQkJICAgICAgQk1fTk9fTU9WRSkpOwotICAgaWYgKHBvb2wgPCAwKSB7Ci0gICAgICBfbWVzYV9wcmludGYoImJtSW5pdFBvb2wgZmFpbGVkIGZvciBzdGF0aWMgcmVnaW9uXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIHJlZ2lvbi0+YnVmZmVyID0gYm1HZW5CdWZmZXJTdGF0aWMoaW50ZWwsIHBvb2wpOwotCi0gICByZXR1cm4gcmVnaW9uOwotfQotCi0KLQotCi12b2lkIF9tZXNhX2NvcHlfcmVjdCggR0x1Ynl0ZSAqZHN0LAotCQkgICAgICBHTHVpbnQgY3BwLAotCQkgICAgICBHTHVpbnQgZHN0X3BpdGNoLAotCQkgICAgICBHTHVpbnQgZHN0X3gsIAotCQkgICAgICBHTHVpbnQgZHN0X3ksCi0JCSAgICAgIEdMdWludCB3aWR0aCwKLQkJICAgICAgR0x1aW50IGhlaWdodCwKLQkJICAgICAgY29uc3QgR0x1Ynl0ZSAqc3JjLAotCQkgICAgICBHTHVpbnQgc3JjX3BpdGNoLAotCQkgICAgICBHTHVpbnQgc3JjX3gsCi0JCSAgICAgIEdMdWludCBzcmNfeSApCi17Ci0gICBHTHVpbnQgaTsKLQotICAgZHN0X3BpdGNoICo9IGNwcDsKLSAgIHNyY19waXRjaCAqPSBjcHA7Ci0gICBkc3QgKz0gZHN0X3ggKiBjcHA7Ci0gICBzcmMgKz0gc3JjX3ggKiBjcHA7Ci0gICBkc3QgKz0gZHN0X3kgKiBkc3RfcGl0Y2g7Ci0gICBzcmMgKz0gc3JjX3kgKiBkc3RfcGl0Y2g7Ci0gICB3aWR0aCAqPSBjcHA7Ci0KLSAgIGlmICh3aWR0aCA9PSBkc3RfcGl0Y2ggJiYgCi0gICAgICAgd2lkdGggPT0gc3JjX3BpdGNoKQotICAgICAgZG9fbWVtY3B5KGRzdCwgc3JjLCBoZWlnaHQgKiB3aWR0aCk7Ci0gICBlbHNlIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewotCSBkb19tZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKLQkgZHN0ICs9IGRzdF9waXRjaDsKLQkgc3JjICs9IHNyY19waXRjaDsKLSAgICAgIH0KLSAgIH0KLX0KLQotCi0vKiBVcGxvYWQgZGF0YSB0byBhIHJlY3Rhbmd1bGFyIHN1Yi1yZWdpb24uICBMb3RzIG9mIGNob2ljZXMgaG93IHRvIGRvIHRoaXM6Ci0gKgotICogLSBtZW1jcHkgYnkgc3BhbiB0byBjdXJyZW50IGRlc3RpbmF0aW9uCi0gKiAtIHVwbG9hZCBkYXRhIGFzIG5ldyBidWZmZXIgYW5kIGJsaXQKLSAqCi0gKiBDdXJyZW50bHkgYWx3YXlzIG1lbWNweS4KLSAqLwotR0xib29sZWFuIGludGVsX3JlZ2lvbl9kYXRhKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCQkgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHN0LAotCQkJICAgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJICAgIEdMdWludCBkc3R4LCBHTHVpbnQgZHN0eSwKLQkJCSAgICBjb25zdCB2b2lkICpzcmMsIEdMdWludCBzcmNfcGl0Y2gsCi0JCQkgICAgR0x1aW50IHNyY3gsIEdMdWludCBzcmN5LAotCQkJICAgIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCkKLXsKLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIGlmICh3aWR0aCA9PSBkc3QtPnBpdGNoICYmIAotICAgICAgIHdpZHRoID09IHNyY19waXRjaCAmJgotICAgICAgIGRzdF9vZmZzZXQgPT0gMCAmJgotICAgICAgIGhlaWdodCA9PSBkc3QtPmhlaWdodCAmJgotICAgICAgIHNyY3ggPT0gMCAmJgotICAgICAgIHNyY3kgPT0gMCkgCi0gICB7Ci0gICAgICByZXR1cm4gKGJtQnVmZmVyRGF0YUFVQihpbnRlbCwKLQkJCSAgICAgIGRzdC0+YnVmZmVyLAotCQkJICAgICAgZHN0LT5jcHAgKiB3aWR0aCAqIGRzdC0+aGVpZ2h0LAotCQkJICAgICAgc3JjLCAwLCAwLCAwKSA9PSAwKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgR0x1Ynl0ZSAqbWFwID0gaW50ZWxfcmVnaW9uX21hcChpbnRlbCwgZHN0KTsKLQotICAgICAgaWYgKG1hcCkgewotCSBhc3NlcnQgKGRzdF9vZmZzZXQgKyBkc3R4ICsgd2lkdGggKyAKLQkJIChkc3R5ICsgaGVpZ2h0IC0gMSkgKiBkc3QtPnBpdGNoICogZHN0LT5jcHAgPD0gCi0JCSBkc3QtPnBpdGNoICogZHN0LT5jcHAgKiBkc3QtPmhlaWdodCk7Ci0JIAotCSBfbWVzYV9jb3B5X3JlY3QobWFwICsgZHN0X29mZnNldCwKLQkJCSBkc3QtPmNwcCwKLQkJCSBkc3QtPnBpdGNoLAotCQkJIGRzdHgsIGRzdHksCi0JCQkgd2lkdGgsIGhlaWdodCwKLQkJCSBzcmMsCi0JCQkgc3JjX3BpdGNoLAotCQkJIHNyY3gsIHNyY3kpOyAgICAgIAotCSAKLQkgaW50ZWxfcmVnaW9uX3VubWFwKGludGVsLCBkc3QpOwotCSByZXR1cm4gR0xfVFJVRTsKLSAgICAgIH0KLSAgICAgIGVsc2UgCi0JIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLX0KLQkJCSAgCi0vKiBDb3B5IHJlY3Rhbmd1bGFyIHN1Yi1yZWdpb25zLiBOZWVkIGJldHRlciBsb2dpYyBhYm91dCB3aGVuIHRvCi0gKiBwdXNoIGJ1ZmZlcnMgaW50byBBR1AgLSB3aWxsIGN1cnJlbnRseSBkbyBzbyB3aGVuZXZlciBwb3NzaWJsZS4KLSAqLwotdm9pZCBpbnRlbF9yZWdpb25fY29weSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJc3RydWN0IGludGVsX3JlZ2lvbiAqZHN0LAotCQkJR0x1aW50IGRzdF9vZmZzZXQsCi0JCQlHTHVpbnQgZHN0eCwgR0x1aW50IGRzdHksCi0JCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMsCi0JCQlHTHVpbnQgc3JjX29mZnNldCwKLQkJCUdMdWludCBzcmN4LCBHTHVpbnQgc3JjeSwKLQkJCUdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCApCi17Ci0gICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBhc3NlcnQoc3JjLT5jcHAgPT0gZHN0LT5jcHApOwotCi0gICBpbnRlbEVtaXRDb3B5QmxpdChpbnRlbCwKLQkJICAgICBkc3QtPmNwcCwKLQkJICAgICBzcmMtPnBpdGNoLCBzcmMtPmJ1ZmZlciwgc3JjX29mZnNldCwgc3JjLT50aWxlZCwKLQkJICAgICBkc3QtPnBpdGNoLCBkc3QtPmJ1ZmZlciwgZHN0X29mZnNldCwgZHN0LT50aWxlZCwKLQkJICAgICBzcmN4LCBzcmN5LAotCQkgICAgIGRzdHgsIGRzdHksCi0JCSAgICAgd2lkdGgsIGhlaWdodCwKLQkJICAgICBHTF9DT1BZICk7Ci19Ci0KLS8qIEZpbGwgYSByZWN0YW5ndWxhciBzdWItcmVnaW9uLiAgTmVlZCBiZXR0ZXIgbG9naWMgYWJvdXQgd2hlbiB0bwotICogcHVzaCBidWZmZXJzIGludG8gQUdQIC0gd2lsbCBjdXJyZW50bHkgZG8gc28gd2hlbmV2ZXIgcG9zc2libGUuCi0gKi8KLXZvaWQgaW50ZWxfcmVnaW9uX2ZpbGwoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCXN0cnVjdCBpbnRlbF9yZWdpb24gKmRzdCwKLQkJCUdMdWludCBkc3Rfb2Zmc2V0LAotCQkJR0x1aW50IGRzdHgsIEdMdWludCBkc3R5LAotCQkJR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LAotCQkJR0x1aW50IGNvbG9yICkKLXsKLSAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAKLSAgIGludGVsRW1pdEZpbGxCbGl0KGludGVsLAotCQkgICAgIGRzdC0+Y3BwLAotCQkgICAgIGRzdC0+cGl0Y2gsIGRzdC0+YnVmZmVyLCBkc3Rfb2Zmc2V0LCBkc3QtPnRpbGVkLAotCQkgICAgIGRzdHgsIGRzdHksCi0JCSAgICAgd2lkdGgsIGhlaWdodCwKLQkJICAgICBjb2xvciApOwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3JlZ2lvbnMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcmVnaW9ucy5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjg5YjJmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3JlZ2lvbnMuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9yZWdpb25zLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3JlZ2lvbnMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcmVnaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIzNWYxLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcmVnaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5URUxfUkVHSU9OU19ICi0jZGVmaW5lIElOVEVMX1JFR0lPTlNfSAotCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAiYnVmbWdyLmgiCQkvKiBmb3IgREJHISAqLwotc3RydWN0IGludGVsX2NvbnRleHQ7Ci0KLS8qIEEgbGF5ZXIgb24gdG9wIG9mIHRoZSBidWZtZ3IgYnVmZmVycyB0aGF0IGFkZHMgYSBmZXcgdXNlZnVsIHRoaW5nczoKLSAqCi0gKiAtIFJlZmNvdW50aW5nIGZvciBsb2NhbCBidWZmZXIgcmVmZXJlbmNlcy4KLSAqIC0gUmVmY291bnRpbmcgZm9yIGJ1ZmZlciBtYXBzCi0gKiAtIEJ1ZmZlciBkaW1lbnNpb25zIC0gcGl0Y2ggYW5kIGhlaWdodC4KLSAqIC0gQmxpdHRlciBjb21tYW5kcyBmb3IgY29weWluZyAyRCByZWdpb25zIGJldHdlZW4gYnVmZmVycy4KLSAqLwotc3RydWN0IGludGVsX3JlZ2lvbiB7Ci0gICBzdHJ1Y3QgYnVmZmVyICpidWZmZXI7Ci0gICBHTHVpbnQgcmVmY291bnQ7Ci0gICBHTHVpbnQgY3BwOwotICAgR0x1aW50IHBpdGNoOwotICAgR0x1aW50IGhlaWdodDsKLSAgIEdMYm9vbGVhbiB0aWxlZDsKLSAgIEdMdWJ5dGUgKm1hcDsKLSAgIEdMdWludCBtYXBfcmVmY291bnQ7Ci19OwotCi0vKiBBbGxvY2F0ZSBhIHJlZmNvdW50ZWQgcmVnaW9uLiAgUG9pbnRlcnMgdG8gcmVnaW9ucyBzaG91bGQgb25seSBiZQotICogY29waWVkIGJ5IGNhbGxpbmcgaW50ZWxfcmVmZXJlbmNlX3JlZ2lvbigpLgotICoKLSAqIE5vIHN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgdGlsZWQgcmVnaW9ucyBhdCB0aGlzIHBvaW50LgotICovCi1zdHJ1Y3QgaW50ZWxfcmVnaW9uICppbnRlbF9yZWdpb25fYWxsb2MoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCQkJIEdMdWludCBjcHAsCi0JCQkJCSBHTHVpbnQgcGl0Y2gsIAotCQkJCQkgR0x1aW50IGhlaWdodCApOwotCi12b2lkIGludGVsX3JlZ2lvbl9yZWZlcmVuY2UoIHN0cnVjdCBpbnRlbF9yZWdpb24gKipkc3QsIAotCQkJICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMgKTsKLQotdm9pZCBpbnRlbF9yZWdpb25fcmVsZWFzZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkgIHN0cnVjdCBpbnRlbF9yZWdpb24gKippYiApOwotCi0vKiBTdGF0aWMgcmVnaW9ucyBtYXkgYmUgdGlsZWQuICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBYIHNlcnZlcgotICogaGFzIHNldCB1cCBmZW5jZSByZWdpc3RlcnMgdG8gZGVmaW5lIHRpbGVkIHpvbmVzIGluIGFncCBhbmQgdGhlc2UKLSAqIGJ1ZmZlcnMgYXJlIHdpdGhpbiB0aG9zZSB6b25lcy4gIFRpbGluZyByZWdpb25zIHdpdGhvdXQgZmVuY2UKLSAqIHJlZ2lzdGVycyBpcyBtb3JlIHdvcmsuCi0gKi8KLXN0cnVjdCBpbnRlbF9yZWdpb24gKmludGVsX3JlZ2lvbl9jcmVhdGVfc3RhdGljKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJCQkgR0x1aW50IG1lbV90eXBlLAotCQkJCQkJIEdMdWludCBvZmZzZXQsCi0JCQkJCQkgdm9pZCAqdmlydHVhbCwKLQkJCQkJCSBHTHVpbnQgY3BwLAotCQkJCQkJIEdMdWludCBwaXRjaCwKLQkJCQkJCSBHTHVpbnQgaGVpZ2h0LAotCQkJCQkJIEdMdWludCBzaXplLAotCQkJCQkJIEdMYm9vbGVhbiB0aWxlZCApOwotCi0vKiBNYXAvdW5tYXAgcmVnaW9ucy4gIFRoaXMgaXMgcmVmY291bnRlZCBhbHNvOiAKLSAqLwotR0x1Ynl0ZSAqaW50ZWxfcmVnaW9uX21hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqaWIpOwotCi12b2lkIGludGVsX3JlZ2lvbl91bm1hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICppYik7Ci0KLQotLyogVXBsb2FkIGRhdGEgdG8gYSByZWN0YW5ndWxhciBzdWItcmVnaW9uCi0gKi8KLUdMYm9vbGVhbiBpbnRlbF9yZWdpb25fZGF0YShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIAotCQkJICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlc3QsCi0JCQkgICAgR0x1aW50IGRlc3Rfb2Zmc2V0LAotCQkJICAgIEdMdWludCBkZXN0eCwgR0x1aW50IGRlc3R5LAotCQkJICAgIGNvbnN0IHZvaWQgKnNyYywgR0x1aW50IHNyY19zdHJpZGUsCi0JCQkgICAgR0x1aW50IHNyY3gsIEdMdWludCBzcmN5LAotCQkJICAgIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCk7Ci0JCQkgIAotLyogQ29weSByZWN0YW5ndWxhciBzdWItcmVnaW9ucwotICovCi12b2lkIGludGVsX3JlZ2lvbl9jb3B5KCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0LAotCQkJR0x1aW50IGRlc3Rfb2Zmc2V0LAotCQkJR0x1aW50IGRlc3R4LCBHTHVpbnQgZGVzdHksCi0JCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMsCi0JCQlHTHVpbnQgc3JjX29mZnNldCwKLQkJCUdMdWludCBzcmN4LCBHTHVpbnQgc3JjeSwKLQkJCUdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCApOwotCi0vKiBGaWxsIGEgcmVjdGFuZ3VsYXIgc3ViLXJlZ2lvbgotICovCi12b2lkIGludGVsX3JlZ2lvbl9maWxsKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0LAotCQkJR0x1aW50IGRlc3Rfb2Zmc2V0LAotCQkJR0x1aW50IGRlc3R4LCBHTHVpbnQgZGVzdHksCi0JCQlHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsCi0JCQlHTHVpbnQgY29sb3IgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1pc2MgdXRpbGl0aWVzOiBtb3ZlIHRvIHNvbWV3aGVyZSBnZW5lcmljCi0gKi8KLXZvaWQgX21lc2FfY29weV9yZWN0KCBHTHVieXRlICpkc3QsCi0JCSAgICAgIEdMdWludCBjcHAsCi0JCSAgICAgIEdMdWludCBkc3RfcGl0Y2gsCi0JCSAgICAgIEdMdWludCBkc3RfeCwgCi0JCSAgICAgIEdMdWludCBkc3RfeSwKLQkJICAgICAgR0x1aW50IHdpZHRoLAotCQkgICAgICBHTHVpbnQgaGVpZ2h0LAotCQkgICAgICBjb25zdCBHTHVieXRlICpzcmMsCi0JCSAgICAgIEdMdWludCBzcmNfcGl0Y2gsCi0JCSAgICAgIEdMdWludCBzcmNfeCwKLQkJICAgICAgR0x1aW50IHNyY195ICk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NjcmVlbi5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9zY3JlZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YTcxNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NjcmVlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0lOVEVMX0lOSVRfSF8KLSNkZWZpbmUgX0lOVEVMX0lOSVRfSF8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAiZHJpX3V0aWwuaCIKLSNpbmNsdWRlICJ4bWxjb25maWcuaCIKLSNpbmNsdWRlICJpODMwX2NvbW1vbi5oIgotCi0vKiBYWFg6IGNoYW5nZSBuYW1lIG9yIGVsaW1pbmF0ZSB0byBhdm9pZCBjb25mbGljdCB3aXRoICJzdHJ1Y3QKLSAqIGludGVsX3JlZ2lvbiIhISEKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgZHJtX2hhbmRsZV90IGhhbmRsZTsKLSAgIGRybVNpemUgc2l6ZTsgICAgICAgIC8qIHJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICBjaGFyICptYXA7ICAgICAgICAgICAvKiBtZW1vcnkgbWFwICovCi0gICBpbnQgb2Zmc2V0OyAgICAgICAgICAvKiBmcm9tIHN0YXJ0IG9mIHZpZGVvIG1lbSwgaW4gYnl0ZXMgKi8KLSAgIGludCBwaXRjaDsgICAgICAgICAgIC8qIHJvdyBzdHJpZGUsIGluIHBpeGVscyAqLwotICAgdW5zaWduZWQgaW50IHRpbGVkOyAKLX0gaW50ZWxSZWdpb247Ci0KLXR5cGVkZWYgc3RydWN0IAotewotICAgaW50ZWxSZWdpb24gZnJvbnQ7Ci0gICBpbnRlbFJlZ2lvbiBiYWNrOwotICAgaW50ZWxSZWdpb24gcm90YXRlZDsKLSAgIGludGVsUmVnaW9uIGRlcHRoOwotICAgaW50ZWxSZWdpb24gdGV4OwotICAgCi0gICBpbnQgZGV2aWNlSUQ7Ci0gICBpbnQgd2lkdGg7Ci0gICBpbnQgaGVpZ2h0OwotICAgaW50IG1lbTsgICAgICAgICAvKiB1bnVzZWQgKi8KLQotICAgaW50IGNwcDsgICAgICAgICAvKiBmb3IgZnJvbnQgYW5kIGJhY2sgYnVmZmVycyAqLwotICAgaW50IGZiRm9ybWF0OwotCi0gICBpbnQgbG9nVGV4dHVyZUdyYW51bGFyaXR5OwotICAgCi0gICBfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcm5Qcml2OwotICAgdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OwotCi0gICBpbnQgZHJtTWlub3I7Ci0KLSAgIGludCBpcnFfYWN0aXZlOwotICAgaW50IGFsbG93X2JhdGNoYnVmZmVyOwotCi0vKiAgICBzdHJ1Y3QgbWF0cml4MjMgcm90TWF0cml4OyAqLwotCi0gICBpbnQgY3VycmVudF9yb3RhdGlvbjsgIC8qIDAsIDkwLCAxODAgb3IgMjcwICovCi0gICBpbnQgcm90YXRlZFdpZHRoLCByb3RhdGVkSGVpZ2h0OwotCi0gICAvKioKLSAgICAqIENvbmZpZ3VyYXRpb24gY2FjaGUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIGNvbnRleHRzIAotICAgICovCi0gICBkcmlPcHRpb25DYWNoZSBvcHRpb25DYWNoZTsKLX0gaW50ZWxTY3JlZW5Qcml2YXRlOwotCi0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsTWFwU2NyZWVuUmVnaW9ucyhfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2KTsKLQotZXh0ZXJuIHZvaWQKLWludGVsVW5tYXBTY3JlZW5SZWdpb25zKGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4pOwotCi1leHRlcm4gdm9pZAotaW50ZWxVcGRhdGVTY3JlZW5Gcm9tU0FSRUEoaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGRybUk4MzBTYXJlYSAqc2FyZWEpOwotCi1leHRlcm4gdm9pZAotaW50ZWxEZXN0cm95Q29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdik7Ci0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsVW5iaW5kQ29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdik7Ci0KLWV4dGVybiBHTGJvb2xlYW4KLWludGVsTWFrZUN1cnJlbnQoX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0gICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3UHJpdiwKLSAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaVJlYWRQcml2KTsKLQotZXh0ZXJuIHZvaWQKLWludGVsU3dhcEJ1ZmZlcnMoX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2KTsKLQotZXh0ZXJuIHZvaWQgCi1pbnRlbENvcHlTdWJCdWZmZXIoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiwKLQkJICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoICk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9zcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NwYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmYmVjYy4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NwYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi0jaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgotI2luY2x1ZGUgImludGVsX3NwYW4uaCIKLSNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgotI2luY2x1ZGUgImludGVsX3RleC5oIgotI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotCi0jdW5kZWYgREJHCi0jZGVmaW5lIERCRyAwCi0KLSNkZWZpbmUgTE9DQUxfVkFSUwkJCQkJCVwKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsgICAgICAgICAgICAgICAgICAgIFwKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsJCVwKLSAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsJCVwKLSAgIEdMdWludCBwaXRjaCA9IGRyYi0+cGl0Y2g7CQkJCQlcCi0gICBHTHVpbnQgaGVpZ2h0ID0gZFByaXYtPmg7CQkJCQlcCi0gICBjaGFyICpidWYgPSAoY2hhciAqKSBkcmItPkJhc2UuRGF0YSArCQkJXAotCQkJZFByaXYtPnggKiBkcmItPmNwcCArCQkJXAotCQkJZFByaXYtPnkgKiBwaXRjaDsJCQlcCi0gICBHTHVzaG9ydCBwOwkJCQkJCQlcCi0gICAodm9pZCkgYnVmOyAodm9pZCkgcAotCi0jZGVmaW5lIExPQ0FMX0RFUFRIX1ZBUlMJCQkJCVwKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsgICAgICAgICAgICAgICAgICAgIFwKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsJCVwKLSAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsJCVwKLSAgIEdMdWludCBwaXRjaCA9IGRyYi0+cGl0Y2g7CQkJCQlcCi0gICBHTHVpbnQgaGVpZ2h0ID0gZFByaXYtPmg7CQkJCQlcCi0gICBjaGFyICpidWYgPSAoY2hhciAqKSBkcmItPkJhc2UuRGF0YSArCQkJXAotCQkJZFByaXYtPnggKiBkcmItPmNwcCArCQkJXAotCQkJZFByaXYtPnkgKiBwaXRjaAotCi0jZGVmaW5lIExPQ0FMX1NURU5DSUxfVkFSUyBMT0NBTF9ERVBUSF9WQVJTIAotCi0jZGVmaW5lIElOSVRfTU9OT19QSVhFTChwLGNvbG9yKVwKLQkgcCA9IElOVEVMX1BBQ0tDT0xPUjU2NShjb2xvclswXSxjb2xvclsxXSxjb2xvclsyXSkKLQotI2RlZmluZSBZX0ZMSVAoX3kpIChoZWlnaHQgLSBfeSAtIDEpCi0KLSNkZWZpbmUgSFdfTE9DSygpCi0KLSNkZWZpbmUgSFdfVU5MT0NLKCkKLQotLyogMTYgYml0LCA1NjUgcmdiIGNvbG9yIHNwYW5saW5lIGFuZCBwaXhlbCBmdW5jdGlvbnMKLSAqLwotI2RlZmluZSBXUklURV9SR0JBKCBfeCwgX3ksIHIsIGcsIGIsIGEgKQkJCQlcCi0gICAqKEdMdXNob3J0ICopKGJ1ZiArIF94KjIgKyBfeSpwaXRjaCkgID0gKCAoKChpbnQpciAmIDB4ZjgpIDw8IDgpIHwJXAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGludClnICYgMHhmYykgPDwgMykgfAlcCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoaW50KWIgJiAweGY4KSA+PiAzKSkKLSNkZWZpbmUgV1JJVEVfUElYRUwoIF94LCBfeSwgcCApICBcCi0gICAqKEdMdXNob3J0ICopKGJ1ZiArIF94KjIgKyBfeSpwaXRjaCkgPSBwCi0KLSNkZWZpbmUgUkVBRF9SR0JBKCByZ2JhLCBfeCwgX3kgKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gICBHTHVzaG9ydCBwID0gKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpOwkJXAotICAgcmdiYVswXSA9ICgoKHAgPj4gMTEpICYgMHgxZikgKiAyNTUpIC8gMzE7CQkJXAotICAgcmdiYVsxXSA9ICgoKHAgPj4gIDUpICYgMHgzZikgKiAyNTUpIC8gNjM7CQkJXAotICAgcmdiYVsyXSA9ICgoKHAgPj4gIDApICYgMHgxZikgKiAyNTUpIC8gMzE7CQkJXAotICAgcmdiYVszXSA9IDI1NTsJCQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfNTY1Ci0jaW5jbHVkZSAic3BhbnRtcC5oIgotCi0vKiAxNSBiaXQsIDU1NSByZ2IgY29sb3Igc3BhbmxpbmUgYW5kIHBpeGVsIGZ1bmN0aW9ucwotICovCi0jZGVmaW5lIFdSSVRFX1JHQkEoIF94LCBfeSwgciwgZywgYiwgYSApCQkJXAotICAgKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpICA9ICgoKHIgJiAweGY4KSA8PCA3KSB8CVwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZyAmIDB4ZjgpIDw8IDMpIHwJXAotICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgICgoYiAmIDB4ZjgpID4+IDMpKQotCi0jZGVmaW5lIFdSSVRFX1BJWEVMKCBfeCwgX3ksIHAgKSAgXAotICAgKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqcGl0Y2gpICA9IHAKLQotI2RlZmluZSBSRUFEX1JHQkEoIHJnYmEsIF94LCBfeSApCQkJCVwKLWRvIHsJCQkJCQkJCVwKLSAgIEdMdXNob3J0IHAgPSAqKEdMdXNob3J0ICopKGJ1ZiArIF94KjIgKyBfeSpwaXRjaCk7CQlcCi0gICByZ2JhWzBdID0gKHAgPj4gNykgJiAweGY4OwkJCQkJXAotICAgcmdiYVsxXSA9IChwID4+IDMpICYgMHhmODsJCQkJCVwKLSAgIHJnYmFbMl0gPSAocCA8PCAzKSAmIDB4Zjg7CQkJCQlcCi0gICByZ2JhWzNdID0gMjU1OwkJCQkJCVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBUQUcoeCkgaW50ZWwjI3gjI181NTUKLSNpbmNsdWRlICJzcGFudG1wLmgiCi0KLS8qIDE2IGJpdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCi0gKi8KLSNkZWZpbmUgV1JJVEVfREVQVEgoIF94LCBfeSwgZCApIFwKLSAgICooR0x1c2hvcnQgKikoYnVmICsgKF94KSoyICsgKF95KSpwaXRjaCkgID0gZDsKLQotI2RlZmluZSBSRUFEX0RFUFRIKCBkLCBfeCwgX3kgKQlcCi0gICBkID0gKihHTHVzaG9ydCAqKShidWYgKyAoX3gpKjIgKyAoX3kpKnBpdGNoKTsJIAotCi0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfejE2Ci0jaW5jbHVkZSAiZGVwdGh0bXAuaCIKLQotCi0jdW5kZWYgTE9DQUxfVkFSUwotI2RlZmluZSBMT0NBTF9WQVJTCQkJCQkJXAotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwkJCVwKLSAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsJCVwKLSAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsJCVwKLSAgIEdMdWludCBwaXRjaCA9IGRyYi0+cGl0Y2g7CQkJCQlcCi0gICBHTHVpbnQgaGVpZ2h0ID0gZFByaXYtPmg7CQkJCQlcCi0gICBjaGFyICpidWYgPSAoY2hhciAqKWRyYi0+QmFzZS5EYXRhICsJCQkJXAotCQkJZFByaXYtPnggKiBkcmItPmNwcCArCQkJXAotCQkJZFByaXYtPnkgKiBwaXRjaDsJCQlcCi0gICBHTHVpbnQgcDsJCQkJCQkJXAotICAgKHZvaWQpIGJ1ZjsgKHZvaWQpIHAKLQotI3VuZGVmIElOSVRfTU9OT19QSVhFTAotI2RlZmluZSBJTklUX01PTk9fUElYRUwocCxjb2xvcilcCi0JIHAgPSBJTlRFTF9QQUNLQ09MT1I4ODg4KGNvbG9yWzBdLGNvbG9yWzFdLGNvbG9yWzJdLGNvbG9yWzNdKQotCi0vKiAzMiBiaXQsIDg4ODggYXJnYiBjb2xvciBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCi0gKi8KLSNkZWZpbmUgV1JJVEVfUkdCQShfeCwgX3ksIHIsIGcsIGIsIGEpCQkJXAotICAgICooR0x1aW50ICopKGJ1ZiArIF94KjQgKyBfeSpwaXRjaCkgPSAoKHIgPDwgMTYpIHwJXAotCQkJCQkgIChnIDw8IDgpICB8CVwKLQkJCQkJICAoYiA8PCAwKSAgfAlcCi0JCQkJCSAgKGEgPDwgMjQpICkKLQotI2RlZmluZSBXUklURV9QSVhFTChfeCwgX3ksIHApCQkJXAotICAgICooR0x1aW50ICopKGJ1ZiArIF94KjQgKyBfeSpwaXRjaCkgPSBwCi0KLQotI2RlZmluZSBSRUFEX1JHQkEocmdiYSwgX3gsIF95KQkJCQkJXAotICAgIGRvIHsJCQkJCQkJXAotCUdMdWludCBwID0gKihHTHVpbnQgKikoYnVmICsgX3gqNCArIF95KnBpdGNoKTsJCVwKLQlyZ2JhWzBdID0gKHAgPj4gMTYpICYgMHhmZjsJCQkJXAotCXJnYmFbMV0gPSAocCA+PiA4KSAgJiAweGZmOwkJCQlcCi0JcmdiYVsyXSA9IChwID4+IDApICAmIDB4ZmY7CQkJCVwKLQlyZ2JhWzNdID0gKHAgPj4gMjQpICYgMHhmZjsJCQkJXAotICAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfODg4OAotI2luY2x1ZGUgInNwYW50bXAuaCIKLQotCi0vKiAyNC84IGJpdCBpbnRlcmxlYXZlZCBkZXB0aC9zdGVuY2lsIGZ1bmN0aW9ucwotICovCi0jZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSB7CQkJXAotICAgR0x1aW50IHRtcCA9ICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpOwlcCi0gICB0bXAgJj0gMHhmZjAwMDAwMDsJCQkJCVwKLSAgIHRtcCB8PSAoZCkgJiAweGZmZmZmZjsJCQkJXAotICAgKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgPSB0bXA7CQlcCi19Ci0KLSNkZWZpbmUgUkVBRF9ERVBUSCggZCwgX3gsIF95ICkJCVwKLSAgIGQgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKnBpdGNoKSAmIDB4ZmZmZmZmOwotCi0KLSNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfejI0X3M4Ci0jaW5jbHVkZSAiZGVwdGh0bXAuaCIKLQotI2RlZmluZSBXUklURV9TVEVOQ0lMKCBfeCwgX3ksIGQgKSB7CQkJXAotICAgR0x1aW50IHRtcCA9ICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpOwlcCi0gICB0bXAgJj0gMHhmZmZmZmY7CQkJCQlcCi0gICB0bXAgfD0gKChkKTw8MjQpOwkJCQkJXAotICAgKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgPSB0bXA7CQlcCi19Ci0KLSNkZWZpbmUgUkVBRF9TVEVOQ0lMKCBkLCBfeCwgX3kgKQkJCVwKLSAgIGQgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKnBpdGNoKSA+PiAyNDsKLQotI2RlZmluZSBUQUcoeCkgaW50ZWwjI3gjI196MjRfczgKLSNpbmNsdWRlICJzdGVuY2lsdG1wLmgiCi0KLQotLyogTW92ZSBsb2NraW5nIG91dCB0byBnZXQgcmVhc29uYWJsZSBzcGFuIHBlcmZvcm1hbmNlLgotICovCi12b2lkIGludGVsU3BhblJlbmRlclN0YXJ0KCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7Ci0KLSAgIGlmIChpbnRlbC0+bmVlZF9mbHVzaCkgewotICAgICAgTE9DS19IQVJEV0FSRShpbnRlbCk7Ci0gICAgICBpbnRlbC0+dnRibC5lbWl0X2ZsdXNoKGludGVsLCAwKTsKLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7Ci0gICAgICBpbnRlbC0+bmVlZF9mbHVzaCA9IDA7Ci0gICAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwotICAgICAgaW50ZWxGaW5pc2goJmludGVsLT5jdHgpOwotICAgfQotCi0KLSAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwotCi0gICAvKiBKdXN0IG1hcCB0aGUgZnJhbWVidWZmZXIgYW5kIGFsbCB0ZXh0dXJlcy4gIEJ1Zm1nciBjb2RlIHdpbGwKLSAgICAqIHRha2UgY2FyZSBvZiB3YWl0aW5nIG9uIHRoZSBuZWNlc3NhcnkgZmVuY2VzOgotICAgICovCi0gICBpbnRlbF9yZWdpb25fbWFwKGludGVsLCBpbnRlbC0+ZnJvbnRfcmVnaW9uKTsKLSAgIGludGVsX3JlZ2lvbl9tYXAoaW50ZWwsIGludGVsLT5iYWNrX3JlZ2lvbik7Ci0gICBpbnRlbF9yZWdpb25fbWFwKGludGVsLCBpbnRlbC0+ZGVwdGhfcmVnaW9uKTsKLX0KLQotdm9pZCBpbnRlbFNwYW5SZW5kZXJGaW5pc2goIEdMY29udGV4dCAqY3R4ICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOwotCi0gICBfc3dyYXN0X2ZsdXNoKCBjdHggKTsKLQotICAgLyogTm93IHVubWFwIHRoZSBmcmFtZWJ1ZmZlcjoKLSAgICAqLwotICAgaW50ZWxfcmVnaW9uX3VubWFwKGludGVsLCBpbnRlbC0+ZnJvbnRfcmVnaW9uKTsKLSAgIGludGVsX3JlZ2lvbl91bm1hcChpbnRlbCwgaW50ZWwtPmJhY2tfcmVnaW9uKTsKLSAgIGludGVsX3JlZ2lvbl91bm1hcChpbnRlbCwgaW50ZWwtPmRlcHRoX3JlZ2lvbik7Ci0KLSAgIFVOTE9DS19IQVJEV0FSRSggaW50ZWwgKTsKLX0KLQotdm9pZCBpbnRlbEluaXRTcGFuRnVuY3MoIEdMY29udGV4dCAqY3R4ICkKLXsKLSAgIHN0cnVjdCBzd3Jhc3RfZGV2aWNlX2RyaXZlciAqc3dkZCA9IF9zd3Jhc3RfR2V0RGV2aWNlRHJpdmVyUmVmZXJlbmNlKGN0eCk7Ci0gICBzd2RkLT5TcGFuUmVuZGVyU3RhcnQgPSBpbnRlbFNwYW5SZW5kZXJTdGFydDsKLSAgIHN3ZGQtPlNwYW5SZW5kZXJGaW5pc2ggPSBpbnRlbFNwYW5SZW5kZXJGaW5pc2g7IAotfQotCi0KLS8qKgotICogUGx1ZyBpbiB0aGUgR2V0L1B1dCByb3V0aW5lcyBmb3IgdGhlIGdpdmVuIGRyaVJlbmRlcmJ1ZmZlci4KLSAqLwotdm9pZAotaW50ZWxTZXRTcGFuRnVuY3Rpb25zKGRyaVJlbmRlcmJ1ZmZlciAqZHJiLCBjb25zdCBHTHZpc3VhbCAqdmlzKQotewotICAgaWYgKGRyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9PSBHTF9SR0JBKSB7Ci0gICAgICBpZiAodmlzLT5yZWRCaXRzID09IDUgJiYgdmlzLT5ncmVlbkJpdHMgPT0gNSAmJiB2aXMtPmJsdWVCaXRzID09IDUpIHsKLSAgICAgICAgIGludGVsSW5pdFBvaW50ZXJzXzU1NSgmZHJiLT5CYXNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZpcy0+cmVkQml0cyA9PSA1ICYmIHZpcy0+Z3JlZW5CaXRzID09IDYgJiYgdmlzLT5ibHVlQml0cyA9PSA1KSB7Ci0gICAgICAgICBpbnRlbEluaXRQb2ludGVyc181NjUoJmRyYi0+QmFzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIGFzc2VydCh2aXMtPnJlZEJpdHMgPT0gOCk7Ci0gICAgICAgICBhc3NlcnQodmlzLT5ncmVlbkJpdHMgPT0gOCk7Ci0gICAgICAgICBhc3NlcnQodmlzLT5ibHVlQml0cyA9PSA4KTsKLSAgICAgICAgIGludGVsSW5pdFBvaW50ZXJzXzg4ODgoJmRyYi0+QmFzZSk7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlIGlmIChkcmItPkJhc2UuSW50ZXJuYWxGb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UMTYpIHsKLSAgICAgIGludGVsSW5pdERlcHRoUG9pbnRlcnNfejE2KCZkcmItPkJhc2UpOwotICAgfQotICAgZWxzZSBpZiAoZHJiLT5CYXNlLkludGVybmFsRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVDI0KSB7Ci0gICAgICBpbnRlbEluaXREZXB0aFBvaW50ZXJzX3oyNF9zOCgmZHJiLT5CYXNlKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGRyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9PSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQpIHsKLSAgICAgIGludGVsSW5pdFN0ZW5jaWxQb2ludGVyc196MjRfczgoJmRyYi0+QmFzZSk7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfc3Bhbi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA1ZTVlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NwYW4uYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF9zcGFuLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3NwYW4uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfc3Bhbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRmODU4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfc3Bhbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfSU5URUxfU1BBTl9ICi0jZGVmaW5lIF9JTlRFTF9TUEFOX0gKLQotI2luY2x1ZGUgImRyaXJlbmRlcmJ1ZmZlci5oIgotCi1leHRlcm4gdm9pZCBpbnRlbEluaXRTcGFuRnVuY3MoIEdMY29udGV4dCAqY3R4ICk7Ci0KLWV4dGVybiB2b2lkIGludGVsU3BhblJlbmRlckZpbmlzaCggR0xjb250ZXh0ICpjdHggKTsKLWV4dGVybiB2b2lkIGludGVsU3BhblJlbmRlclN0YXJ0KCBHTGNvbnRleHQgKmN0eCApOwotCi1leHRlcm4gdm9pZAotaW50ZWxTZXRTcGFuRnVuY3Rpb25zKGRyaVJlbmRlcmJ1ZmZlciAqcmIsIGNvbnN0IEdMdmlzdWFsICp2aXMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfc3RhdGUuYwppbmRleCAyZTQ0MmRiLi4wZmJhNWE3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3N0YXRlLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9zdGF0ZS5jCkBAIC0zOCw2ICszOCwzMSBAQAogI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKICNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCiAKK2ludCBpbnRlbF90cmFuc2xhdGVfc2hhZG93X2NvbXBhcmVfZnVuYyggR0xlbnVtIGZ1bmMgKQoreworICAgc3dpdGNoKGZ1bmMpIHsKKyAgIGNhc2UgR0xfTkVWRVI6IAorICAgICAgIHJldHVybiBDT01QQVJFRlVOQ19BTFdBWVM7IAorICAgY2FzZSBHTF9MRVNTOiAKKyAgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfTEVRVUFMOyAKKyAgIGNhc2UgR0xfTEVRVUFMOiAKKyAgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfTEVTUzsKKyAgIGNhc2UgR0xfR1JFQVRFUjogCisgICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX0dFUVVBTDsgCisgICBjYXNlIEdMX0dFUVVBTDogCisgICAgICByZXR1cm4gQ09NUEFSRUZVTkNfR1JFQVRFUjsgCisgICBjYXNlIEdMX05PVEVRVUFMOiAKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19FUVVBTDsgCisgICBjYXNlIEdMX0VRVUFMOiAKKyAgICAgIHJldHVybiBDT01QQVJFRlVOQ19OT1RFUVVBTDsgCisgICBjYXNlIEdMX0FMV0FZUzogCisgICAgICAgcmV0dXJuIENPTVBBUkVGVU5DX05FVkVSOyAKKyAgIH0KKworICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHZhbHVlIGluICVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBmdW5jKTsKKyAgIHJldHVybiBDT01QQVJFRlVOQ19ORVZFUjsgCit9CisKIGludCBpbnRlbF90cmFuc2xhdGVfY29tcGFyZV9mdW5jKCBHTGVudW0gZnVuYyApCiB7CiAgICBzd2l0Y2goZnVuYykgewpAQCAtMTcwLDE1ICsxOTUsMTYgQEAKIHN0YXRpYyB2b2lkIGludGVsQ2xlYXJDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKIHsKICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIGludGVsU2NyZWVuUHJpdmF0ZSAqc2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOwogCiAgICBVTkNMQU1QRURfRkxPQVRfVE9fUkdCQV9DSEFOKGludGVsLT5jbGVhcl9jaGFuLCBjb2xvcik7CiAKLSAgIGludGVsLT5DbGVhckNvbG9yID0gSU5URUxfUEFDS0NPTE9SKHNjcmVlbi0+ZmJGb3JtYXQsCi0JCQkJICAgICAgIGludGVsLT5jbGVhcl9jaGFuWzBdLCAKLQkJCQkgICAgICAgaW50ZWwtPmNsZWFyX2NoYW5bMV0sIAotCQkJCSAgICAgICBpbnRlbC0+Y2xlYXJfY2hhblsyXSwgCi0JCQkJICAgICAgIGludGVsLT5jbGVhcl9jaGFuWzNdKTsKKyAgIGludGVsLT5DbGVhckNvbG9yODg4OCA9IElOVEVMX1BBQ0tDT0xPUjg4ODgoaW50ZWwtPmNsZWFyX2NoYW5bMF0sCisJCQkJCSAgICAgICBpbnRlbC0+Y2xlYXJfY2hhblsxXSwKKwkJCQkJICAgICAgIGludGVsLT5jbGVhcl9jaGFuWzJdLAorCQkJCQkgICAgICAgaW50ZWwtPmNsZWFyX2NoYW5bM10pOworICAgaW50ZWwtPkNsZWFyQ29sb3I1NjUgPSBJTlRFTF9QQUNLQ09MT1I1NjUoaW50ZWwtPmNsZWFyX2NoYW5bMF0sCisJCQkJCSAgICAgaW50ZWwtPmNsZWFyX2NoYW5bMV0sCisJCQkJCSAgICAgaW50ZWwtPmNsZWFyX2NoYW5bMl0pOwogfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTIzOTY5Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgImltYWdlLmgiCi0jaW5jbHVkZSAidGV4c3RvcmUuaCIKLSNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKLSNpbmNsdWRlICJ0ZXhpbWFnZS5oIgotI2luY2x1ZGUgInRleG9iai5oIgotI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKLQotCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX3RleC5oIgotI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCi0KLQotc3RhdGljIEdMdWludCB0YXJnZXRfdG9fZmFjZSggR0xlbnVtIHRhcmdldCApCi17Ci0gICBzd2l0Y2ggKHRhcmdldCkgewotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCOgotICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCOgotICAgICAgcmV0dXJuICgoR0x1aW50KSB0YXJnZXQgLSAKLQkgICAgICAoR0x1aW50KSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gpOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgfQotfQotCi1zdGF0aWMgdm9pZCBpbnRlbFRleEltYWdlMUQoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKLQkJCSAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKLQkJCSAgICBHTGludCB3aWR0aCwgR0xpbnQgYm9yZGVyLAotCQkJICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotCi0gICBfbWVzYV9zdG9yZV90ZXhpbWFnZTFkKCBjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAotCQkJICAgd2lkdGgsIGJvcmRlciwgZm9ybWF0LCB0eXBlLAotCQkJICAgcGl4ZWxzLCBwYWNraW5nLCB0ZXhPYmosIHRleEltYWdlICk7Ci0KLSAgIGludGVsT2JqLT5kaXJ0eV9pbWFnZXNbMF0gfD0gKDEgPDwgbGV2ZWwpOwotICAgaW50ZWxPYmotPmRpcnR5IHw9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsVGV4U3ViSW1hZ2UxRCggR0xjb250ZXh0ICpjdHgsIAotCQkJICAgICAgIEdMZW51bSB0YXJnZXQsCi0JCQkgICAgICAgR0xpbnQgbGV2ZWwsCQotCQkJICAgICAgIEdMaW50IHhvZmZzZXQsCi0JCQkJR0xzaXplaSB3aWR0aCwKLQkJCSAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKLQkJCSAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCi0JCQkgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0JCQkgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotCi0gICBfbWVzYV9zdG9yZV90ZXhzdWJpbWFnZTFkKGN0eCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgd2lkdGgsIAotCQkJICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgcGFja2luZywgdGV4T2JqLAotCQkJICAgICB0ZXhJbWFnZSk7Ci0KLSAgIGludGVsT2JqLT5kaXJ0eV9pbWFnZXNbMF0gfD0gKDEgPDwgbGV2ZWwpOwotICAgaW50ZWxPYmotPmRpcnR5IHw9IDE7Ci19Ci0KLQotLyogSGFuZGxlcyAyRCwgQ1VCRSwgUkVDVDoKLSAqLwotc3RhdGljIHZvaWQgaW50ZWxUZXhJbWFnZTJEKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCi0JCQkgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCi0JCQkgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyLAotCQkJICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0JCQkgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotICAgR0x1aW50IGZhY2UgPSB0YXJnZXRfdG9fZmFjZSh0YXJnZXQpOwotCi0gICBfbWVzYV9zdG9yZV90ZXhpbWFnZTJkKCBjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAotCQkJICAgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsCi0JCQkgICBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UgKTsKLQotICAgaW50ZWxPYmotPmRpcnR5X2ltYWdlc1tmYWNlXSB8PSAoMSA8PCBsZXZlbCk7Ci0gICBpbnRlbE9iai0+ZGlydHkgfD0gMSA8PCBmYWNlOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbFRleFN1YkltYWdlMkQoIEdMY29udGV4dCAqY3R4LCAKLQkJCSAgICAgICBHTGVudW0gdGFyZ2V0LAotCQkJICAgICAgIEdMaW50IGxldmVsLAkKLQkJCSAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAotCQkJICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotCQkJICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotCQkJICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFja2luZywKLQkJCSAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLQkJCSAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgKQotewotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7Ci0gICBHTHVpbnQgZmFjZSA9IHRhcmdldF90b19mYWNlKHRhcmdldCk7Ci0KLSAgIF9tZXNhX3N0b3JlX3RleHN1YmltYWdlMmQoY3R4LCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgCi0JCQkgICAgIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwKLQkJCSAgICAgdGV4SW1hZ2UpOwotCi0gICBpbnRlbE9iai0+ZGlydHlfaW1hZ2VzW2ZhY2VdIHw9ICgxIDw8IGxldmVsKTsKLSAgIGludGVsT2JqLT5kaXJ0eSB8PSAxIDw8IGZhY2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsQ29tcHJlc3NlZFRleEltYWdlMkQoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotICAgR0x1aW50IGZhY2UgPSB0YXJnZXRfdG9fZmFjZSh0YXJnZXQpOwotCi0gICBfbWVzYV9zdG9yZV9jb21wcmVzc2VkX3RleGltYWdlMmQoY3R4LCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbEZvcm1hdCwgd2lkdGgsCi0JCQkJICAgICBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhLCB0ZXhPYmosIHRleEltYWdlKTsKLSAgIAotICAgaW50ZWxPYmotPmRpcnR5X2ltYWdlc1tmYWNlXSB8PSAoMSA8PCBsZXZlbCk7Ci0gICBpbnRlbE9iai0+ZGlydHkgfD0gMSA8PCBmYWNlOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgKQotewotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7Ci0gICBHTHVpbnQgZmFjZSA9IHRhcmdldF90b19mYWNlKHRhcmdldCk7Ci0KLSAgIF9tZXNhX3N0b3JlX2NvbXByZXNzZWRfdGV4c3ViaW1hZ2UyZChjdHgsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLAotCQkJCQloZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhLCB0ZXhPYmosIHRleEltYWdlKTsKLSAgIAotICAgaW50ZWxPYmotPmRpcnR5X2ltYWdlc1tmYWNlXSB8PSAoMSA8PCBsZXZlbCk7Ci0gICBpbnRlbE9iai0+ZGlydHkgfD0gMSA8PCBmYWNlOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGVsVGV4SW1hZ2UzRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGRlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApCi17Ci0gICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqID0gaW50ZWxfdGV4dHVyZV9vYmplY3QodGV4T2JqKTsKLQotICAgX21lc2Ffc3RvcmVfdGV4aW1hZ2UzZChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAotCQkJICB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLAotCQkJICBmb3JtYXQsIHR5cGUsIHBpeGVscywKLQkJCSAgJmN0eC0+VW5wYWNrLCB0ZXhPYmosIHRleEltYWdlKTsKLSAgIAotICAgaW50ZWxPYmotPmRpcnR5X2ltYWdlc1swXSB8PSAoMSA8PCBsZXZlbCk7Ci0gICBpbnRlbE9iai0+ZGlydHkgfD0gMSA8PCAwOwotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnRlbFRleFN1YkltYWdlM0QoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLAotICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFja2luZywKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UgKQotewotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7Ci0KLSAgIF9tZXNhX3N0b3JlX3RleHN1YmltYWdlM2QoY3R4LCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UpOwotCi0gICBpbnRlbE9iai0+ZGlydHlfaW1hZ2VzWzBdIHw9ICgxIDw8IGxldmVsKTsKLSAgIGludGVsT2JqLT5kaXJ0eSB8PSAxIDw8IDA7Ci19Ci0KLQotCi0KLXN0YXRpYyBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKmludGVsTmV3VGV4dHVyZU9iamVjdCggR0xjb250ZXh0ICpjdHgsIAotCQkJCQkJCUdMdWludCBuYW1lLCAKLQkJCQkJCQlHTGVudW0gdGFyZ2V0ICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqb2JqID0gQ0FMTE9DX1NUUlVDVChpbnRlbF90ZXh0dXJlX29iamVjdCk7Ci0KLSAgIF9tZXNhX2luaXRpYWxpemVfdGV4dHVyZV9vYmplY3QoJm9iai0+YmFzZSwgbmFtZSwgdGFyZ2V0KTsKLQotICAgcmV0dXJuICZvYmotPmJhc2U7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gaW50ZWxJc1RleHR1cmVSZXNpZGVudChHTGNvbnRleHQgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmopCi17Ci0jaWYgMAotICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7Ci0gICAKLSAgIHJldHVybiAKLSAgICAgIGludGVsT2JqLT5tdCAmJiAKLSAgICAgIGludGVsT2JqLT5tdC0+cmVnaW9uICYmIAotICAgICAgaW50ZWxfaXNfcmVnaW9uX3Jlc2lkZW50KGludGVsLCBpbnRlbE9iai0+bXQtPnJlZ2lvbik7Ci0jZW5kaWYKLSAgIHJldHVybiAxOwotfQotCi0KLQotc3RhdGljIHZvaWQgaW50ZWxUZXhQYXJhbWV0ZXIoIEdMY29udGV4dCAqY3R4LCAKLQkJCSAgICAgICBHTGVudW0gdGFyZ2V0LAotCQkJICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQkJICAgICAgIEdMZW51bSBwbmFtZSwgCi0JCQkgICAgICAgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotIAotICAgc3dpdGNoIChwbmFtZSkgewotICAgICAgLyogQW55dGhpbmcgd2hpY2ggY2FuIGFmZmVjdCB0aGUgY2FsY3VsYXRpb24gb2YgZmlyc3RMZXZlbCBhbmQKLSAgICAgICAqIGxhc3RMZXZlbCwgYXMgY2hhbmdlcyB0byB0aGVzZSBtYXkgaW52YWxpZGF0ZSB0aGUgbWlwdHJlZS4KLSAgICAgICAqLwotICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6Ci0gICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjoKLSAgIGNhc2UgR0xfVEVYVFVSRV9CQVNFX0xFVkVMOgotICAgY2FzZSBHTF9URVhUVVJFX01BWF9MRVZFTDoKLSAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fTE9EOgotICAgY2FzZSBHTF9URVhUVVJFX01BWF9MT0Q6Ci0gICAgICBpbnRlbE9iai0+ZGlydHkgfD0gMTsKLSAgICAgIGJyZWFrOwotCi0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWludGVsX2RlbGV0ZV90ZXh0dXJlX29iamVjdCggR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqICkKLXsKLSAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKLSAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOwotCi0gICBpZiAoaW50ZWxPYmotPm10KQotICAgICAgaW50ZWxfbWlwdHJlZV9kZXN0cm95KGludGVsLCBpbnRlbE9iai0+bXQpOwotCi0gICBfbWVzYV9kZWxldGVfdGV4dHVyZV9vYmplY3QoIGN0eCwgdGV4T2JqICk7Ci19Ci0KLXZvaWQgaW50ZWxJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCi17Ci0gICBmdW5jdGlvbnMtPk5ld1RleHR1cmVPYmplY3QgICAgICAgICAgPSBpbnRlbE5ld1RleHR1cmVPYmplY3Q7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlMUQgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlMUQ7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlMkQgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPlRleEltYWdlM0QgICAgICAgICAgICAgICAgPSBpbnRlbFRleEltYWdlM0Q7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlMUQgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlMUQ7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlMkQgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPlRleFN1YkltYWdlM0QgICAgICAgICAgICAgPSBpbnRlbFRleFN1YkltYWdlM0Q7Ci0gICBmdW5jdGlvbnMtPkNvcHlUZXhJbWFnZTFEICAgICAgICAgICAgPSBfc3dyYXN0X2NvcHlfdGV4aW1hZ2UxZDsKLSAgIGZ1bmN0aW9ucy0+Q29weVRleEltYWdlMkQgICAgICAgICAgICA9IF9zd3Jhc3RfY29weV90ZXhpbWFnZTJkOwotICAgZnVuY3Rpb25zLT5Db3B5VGV4U3ViSW1hZ2UxRCAgICAgICAgID0gX3N3cmFzdF9jb3B5X3RleHN1YmltYWdlMWQ7Ci0gICBmdW5jdGlvbnMtPkNvcHlUZXhTdWJJbWFnZTJEICAgICAgICAgPSBfc3dyYXN0X2NvcHlfdGV4c3ViaW1hZ2UyZDsKLSAgIGZ1bmN0aW9ucy0+Q29weVRleFN1YkltYWdlM0QgICAgICAgICA9IF9zd3Jhc3RfY29weV90ZXhzdWJpbWFnZTNkOwotICAgZnVuY3Rpb25zLT5EZWxldGVUZXh0dXJlICAgICAgICAgICAgID0gaW50ZWxfZGVsZXRlX3RleHR1cmVfb2JqZWN0OwotICAgZnVuY3Rpb25zLT5VcGRhdGVUZXh0dXJlUGFsZXR0ZSAgICAgID0gTlVMTDsKLSAgIGZ1bmN0aW9ucy0+SXNUZXh0dXJlUmVzaWRlbnQgPSBpbnRlbElzVGV4dHVyZVJlc2lkZW50OwotICAgZnVuY3Rpb25zLT5UZXN0UHJveHlUZXhJbWFnZSAgICAgICAgID0gX21lc2FfdGVzdF9wcm94eV90ZXhpbWFnZTsKLSAgIGZ1bmN0aW9ucy0+Q29tcHJlc3NlZFRleEltYWdlMkQgICAgICA9IGludGVsQ29tcHJlc3NlZFRleEltYWdlMkQ7Ci0gICBmdW5jdGlvbnMtPkNvbXByZXNzZWRUZXhTdWJJbWFnZTJEICAgPSBpbnRlbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEOwotICAgZnVuY3Rpb25zLT5UZXhQYXJhbWV0ZXIgICAgICAgICAgICAgID0gaW50ZWxUZXhQYXJhbWV0ZXI7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4LmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDc3Y2U3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4OWQ1Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBJTlRFTFRFWF9JTkMKLSNkZWZpbmUgSU5URUxURVhfSU5DCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCi0KLQotdm9pZCBpbnRlbEluaXRUZXh0dXJlRnVuY3MoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci0KLQotR0x1aW50IGludGVsX2ZpbmFsaXplX21pcG1hcF90cmVlKCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCi0JCQkJICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqICk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF9jb3B5LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF9jb3B5LmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODcxOTZjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4X2NvcHkuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfY29weS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfZm9ybWF0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zNDE1Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfZm9ybWF0LmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4X2Zvcm1hdC5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfaW1hZ2UuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4X2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTY3YWJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4X2ltYWdlLmMKQEAgLTAsMCArMSBAQAorLi4vaW50ZWwvaW50ZWxfdGV4X2ltYWdlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF9zdWJpbWFnZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iM2E4YTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfc3ViaW1hZ2UuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4X3ZhbGlkYXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF92YWxpZGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGVlOTQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfdGV4X3ZhbGlkYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKLSAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgotICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotCi0jaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgotI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCi0jaW5jbHVkZSAiaW50ZWxfdGV4LmgiCi0jaW5jbHVkZSAiYnVmbWdyLmgiCi0KLS8qKgotICogQ29tcHV0ZSB3aGljaCBtaXBtYXAgbGV2ZWxzIHRoYXQgcmVhbGx5IG5lZWQgdG8gYmUgc2VudCB0byB0aGUgaGFyZHdhcmUuCi0gKiBUaGlzIGRlcGVuZHMgb24gdGhlIGJhc2UgaW1hZ2Ugc2l6ZSwgR0xfVEVYVFVSRV9NSU5fTE9ELAotICogR0xfVEVYVFVSRV9NQVhfTE9ELCBHTF9URVhUVVJFX0JBU0VfTEVWRUwsIGFuZCBHTF9URVhUVVJFX01BWF9MRVZFTC4KLSAqLwotc3RhdGljIHZvaWQgaW50ZWxfY2FsY3VsYXRlX2ZpcnN0X2xhc3RfbGV2ZWwoIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogKQotewotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gJmludGVsT2JqLT5iYXNlOwotICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKiBjb25zdCBiYXNlSW1hZ2UgPQotICAgICAgIHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF07Ci0KLSAgIC8qIFRoZXNlIG11c3QgYmUgc2lnbmVkIHZhbHVlcy4gIE1pbkxvZCBhbmQgTWF4TG9kIGNhbiBiZSBuZWdhdGl2ZSBudW1iZXJzLAotICAgICogYW5kIGhhdmluZyBmaXJzdExldmVsIGFuZCBsYXN0TGV2ZWwgYXMgc2lnbmVkIHByZXZlbnRzIHRoZSBuZWVkIGZvcgotICAgICogZXh0cmEgc2lnbiBjaGVja3MuCi0gICAgKi8KLSAgIGludCAgIGZpcnN0TGV2ZWw7Ci0gICBpbnQgICBsYXN0TGV2ZWw7Ci0KLSAgIC8qIFllcywgdGhpcyBsb29rcyBvdmVybHkgY29tcGxpY2F0ZWQsIGJ1dCBpdCdzIGFsbCBuZWVkZWQuCi0gICAgKi8KLSAgIHN3aXRjaCAodE9iai0+VGFyZ2V0KSB7Ci0gICBjYXNlIEdMX1RFWFRVUkVfMUQ6Ci0gICBjYXNlIEdMX1RFWFRVUkVfMkQ6Ci0gICBjYXNlIEdMX1RFWFRVUkVfM0Q6Ci0gICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVA6Ci0gICAgICBpZiAodE9iai0+TWluRmlsdGVyID09IEdMX05FQVJFU1QgfHwgdE9iai0+TWluRmlsdGVyID09IEdMX0xJTkVBUikgewotICAgICAgICAgLyogR0xfTkVBUkVTVCBhbmQgR0xfTElORUFSIG9ubHkgY2FyZSBhYm91dCBHTF9URVhUVVJFX0JBU0VfTEVWRUwuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGZpcnN0TGV2ZWwgPSBsYXN0TGV2ZWwgPSB0T2JqLT5CYXNlTGV2ZWw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkgLyogQ3VycmVudGx5IG5vdCB0YWtpbmcgbWluL21heCBsb2QgaW50byBhY2NvdW50IGhlcmUsIHRob3NlCi0JICAqIHZhbHVlcyBhcmUgcHJvZ3JhbW1lZCBhcyBzYW1wbGVyIHN0YXRlIGVsc2V3aGVyZSBhbmQgd2UKLQkgICogdXBsb2FkIHRoZSBzYW1lIG1pcG1hcCBsZXZlbHMgcmVnYXJkbGVzcy4gIE5vdCBzdXJlIGlmCi0JICAqIHRoaXMgbWFrZXMgc2Vuc2UgYXMgaXQgbWVhbnMgaXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBhcHAKLQkgICogdG8gdXNlIG1pbi9tYXggbG9kIHRvIHJlZHVjZSB0ZXh0dXJlIG1lbW9yeSBwcmVzc3VyZToKLQkgICovCi0JIGZpcnN0TGV2ZWwgPSB0T2JqLT5CYXNlTGV2ZWw7Ci0JIGxhc3RMZXZlbCA9IE1JTjIodE9iai0+QmFzZUxldmVsICsgYmFzZUltYWdlLT5NYXhMb2cyLCAKLQkJCSAgdE9iai0+TWF4TGV2ZWwpOwotCSBsYXN0TGV2ZWwgPSBNQVgyKGZpcnN0TGV2ZWwsIGxhc3RMZXZlbCk7IC8qIG5lZWQgYXQgbGVhc3Qgb25lIGxldmVsICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfVEVYVFVSRV9SRUNUQU5HTEVfTlY6Ci0gICBjYXNlIEdMX1RFWFRVUkVfNERfU0dJUzoKLSAgICAgIGZpcnN0TGV2ZWwgPSBsYXN0TGV2ZWwgPSAwOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBzYXZlIHRoZXNlIHZhbHVlcyAqLwotICAgaW50ZWxPYmotPmZpcnN0TGV2ZWwgPSBmaXJzdExldmVsOwotICAgaW50ZWxPYmotPmxhc3RMZXZlbCA9IGxhc3RMZXZlbDsKLX0KLQotc3RhdGljIEdMYm9vbGVhbiBjb3B5X2ltYWdlX2RhdGFfdG9fdHJlZSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAotCQkJCQkgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmosCi0JCQkJCSAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlLAotCQkJCQkgIEdMdWludCBmYWNlLAotCQkJCQkgIEdMdWludCBsZXZlbCkKLXsKLSAgIHJldHVybiBpbnRlbF9taXB0cmVlX2ltYWdlX2RhdGEoaW50ZWwsCi0JCQkJICAgaW50ZWxPYmotPm10LAotCQkJCSAgIGZhY2UsCi0JCQkJICAgbGV2ZWwsCi0JCQkJICAgdGV4SW1hZ2UtPkRhdGEsCi0JCQkJICAgdGV4SW1hZ2UtPlJvd1N0cmlkZSwKLQkJCQkgICAodGV4SW1hZ2UtPlJvd1N0cmlkZSAqIAotCQkJCSAgICB0ZXhJbWFnZS0+SGVpZ2h0ICogCi0JCQkJICAgIHRleEltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfdGV4dHVyZV9pbnZhbGlkYXRlKCBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqICkKLXsKLSAgIEdMaW50IG5yX2ZhY2VzLCBmYWNlOwotICAgaW50ZWxPYmotPmRpcnR5ID0gfjA7Ci0KLSAgIG5yX2ZhY2VzID0gKGludGVsT2JqLT5iYXNlLlRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQKSA/IDYgOiAxOwotICAgZm9yIChmYWNlID0gMDsgZmFjZSA8IG5yX2ZhY2VzOyBmYWNlKyspIAotICAgICAgaW50ZWxPYmotPmRpcnR5X2ltYWdlc1tmYWNlXSA9IH4wOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF90ZXh0dXJlX2ludmFsaWRhdGVfY2IoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCQkJIHZvaWQgKnB0ciApCi17Ci0gICBpbnRlbF90ZXh0dXJlX2ludmFsaWRhdGUoIChzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKikgcHRyICk7Ci19Ci0KLQotLyogIAotICovCi1HTHVpbnQgaW50ZWxfZmluYWxpemVfbWlwbWFwX3RyZWUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKLQkJCQkgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogKQotewotICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRPYmopOwotICAgR0x1aW50IGZhY2UsIGk7Ci0gICBHTHVpbnQgbnJfZmFjZXMgPSAwOwotICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmZpcnN0SW1hZ2U7Ci0KLSAgIGlmKCB0T2JqID09IGludGVsLT5mcmFtZV9idWZmZXJfdGV4b2JqICkKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIAotICAgLyogV2Uga25vdy9yZXF1aXJlIHRoaXMgaXMgdHJ1ZSBieSBub3c6IAotICAgICovCi0gICBhc3NlcnQoaW50ZWxPYmotPmJhc2UuX0NvbXBsZXRlKTsKLQotICAgLyogV2hhdCBsZXZlbHMgbXVzdCB0aGUgdHJlZSBpbmNsdWRlIGF0IGEgbWluaW11bT8KLSAgICAqLwotICAgaWYgKGludGVsT2JqLT5kaXJ0eSkgewotICAgICAgaW50ZWxfY2FsY3VsYXRlX2ZpcnN0X2xhc3RfbGV2ZWwoIGludGVsT2JqICk7Ci0vKiAgICAgICBpbnRlbF9taXB0cmVlX2Rlc3Ryb3koaW50ZWwsIGludGVsT2JqLT5tdCk7ICovCi0vKiAgICAgICBpbnRlbE9iai0+bXQgPSBOVUxMOyAqLwotICAgfQotCi0gICBmaXJzdEltYWdlID0gaW50ZWxPYmotPmJhc2UuSW1hZ2VbMF1baW50ZWxPYmotPmZpcnN0TGV2ZWxdOwotCi0gICAvKiBGYWxsYmFjayBjYXNlOgotICAgICovCi0gICBpZiAoZmlyc3RJbWFnZS0+Qm9yZGVyKSB7Ci0gICAgICBpZiAoaW50ZWxPYmotPm10KSB7Ci0JIGludGVsX21pcHRyZWVfZGVzdHJveShpbnRlbCwgaW50ZWxPYmotPm10KTsKLQkgaW50ZWxPYmotPm10ID0gTlVMTDsKLQkgLyogU2V0IGFsbCBpbWFnZXMgZGlydHk6Ci0JICAqLwotCSBpbnRlbF90ZXh0dXJlX2ludmFsaWRhdGUoaW50ZWxPYmopOwotICAgICAgfQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0KLQotICAgLyogQ2hlY2sgdHJlZSBjYW4gaG9sZCBhbGwgYWN0aXZlIGxldmVscy4gIENoZWNrIHRyZWUgbWF0Y2hlcwotICAgICogdGFyZ2V0LCBpbWFnZUZvcm1hdCwgZXRjLgotICAgICovCi0gICBpZiAoaW50ZWxPYmotPm10ICYmCi0gICAgICAgKGludGVsT2JqLT5tdC0+dGFyZ2V0ICE9IGludGVsT2JqLT5iYXNlLlRhcmdldCB8fAotCWludGVsT2JqLT5tdC0+aW50ZXJuYWxfZm9ybWF0ICE9IGZpcnN0SW1hZ2UtPkludGVybmFsRm9ybWF0IHx8Ci0JaW50ZWxPYmotPm10LT5maXJzdF9sZXZlbCAhPSBpbnRlbE9iai0+Zmlyc3RMZXZlbCB8fAotCWludGVsT2JqLT5tdC0+bGFzdF9sZXZlbCAhPSBpbnRlbE9iai0+bGFzdExldmVsIHx8Ci0JaW50ZWxPYmotPm10LT53aWR0aDAgIT0gZmlyc3RJbWFnZS0+V2lkdGggfHwKLQlpbnRlbE9iai0+bXQtPmhlaWdodDAgIT0gZmlyc3RJbWFnZS0+SGVpZ2h0IHx8Ci0JaW50ZWxPYmotPm10LT5kZXB0aDAgIT0gZmlyc3RJbWFnZS0+RGVwdGggfHwKLQlpbnRlbE9iai0+bXQtPmNwcCAhPSBmaXJzdEltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXMgfHwKLQlpbnRlbE9iai0+bXQtPmNvbXByZXNzZWQgIT0gZmlyc3RJbWFnZS0+SXNDb21wcmVzc2VkKSkgCi0gICB7Ci0gICAgICBpbnRlbF9taXB0cmVlX2Rlc3Ryb3koaW50ZWwsIGludGVsT2JqLT5tdCk7Ci0gICAgICBpbnRlbE9iai0+bXQgPSBOVUxMOwotICAgICAgCi0gICAgICAvKiBTZXQgYWxsIGltYWdlcyBkaXJ0eToKLSAgICAgICAqLwotICAgICAgaW50ZWxfdGV4dHVyZV9pbnZhbGlkYXRlKGludGVsT2JqKTsKLSAgIH0KLSAgICAgIAotCi0gICAvKiBNYXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgdHJlZToKLSAgICAqLwotICAgaWYgKCFpbnRlbE9iai0+bXQpIHsKLSAgICAgIGludGVsT2JqLT5tdCA9IGludGVsX21pcHRyZWVfY3JlYXRlKGludGVsLAotCQkJCQkgIGludGVsT2JqLT5iYXNlLlRhcmdldCwKLQkJCQkJICBmaXJzdEltYWdlLT5JbnRlcm5hbEZvcm1hdCwKLQkJCQkJICBpbnRlbE9iai0+Zmlyc3RMZXZlbCwKLQkJCQkJICBpbnRlbE9iai0+bGFzdExldmVsLAotCQkJCQkgIGZpcnN0SW1hZ2UtPldpZHRoLAotCQkJCQkgIGZpcnN0SW1hZ2UtPkhlaWdodCwKLQkJCQkJICBmaXJzdEltYWdlLT5EZXB0aCwKLQkJCQkJICBmaXJzdEltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXMsCi0JCQkJCSAgZmlyc3RJbWFnZS0+SXNDb21wcmVzc2VkKTsKLQotICAgICAgLyogVGVsbCB0aGUgYnVmZmVyIG1hbmFnZXIgdGhhdCB3ZSB3aWxsIG1hbmFnZSB0aGUgYmFja2luZwotICAgICAgICogc3RvcmUsIGJ1dCB3ZSBzdGlsbCB3YW50IGl0IHRvIGRvIGZlbmNpbmcgZm9yIHVzLgotICAgICAgICovCi0gICAgICBibUJ1ZmZlclNldEludmFsaWRhdGVDQihpbnRlbCwgCi0JCQkgICAgICBpbnRlbE9iai0+bXQtPnJlZ2lvbi0+YnVmZmVyLAotCQkJICAgICAgaW50ZWxfdGV4dHVyZV9pbnZhbGlkYXRlX2NiLAotCQkJICAgICAgaW50ZWxPYmosCi0JCQkgICAgICBHTF9GQUxTRSk7Ci0gICB9Ci0KLSAgIC8qIFB1bGwgaW4gYW55IGltYWdlcyBub3QgaW4gdGhlIG9iamVjdCdzIHRyZWU6Ci0gICAgKi8KLSAgIGlmIChpbnRlbE9iai0+ZGlydHkpIHsKLSAgICAgIG5yX2ZhY2VzID0gKGludGVsT2JqLT5iYXNlLlRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQKSA/IDYgOiAxOwotICAgICAgZm9yIChmYWNlID0gMDsgZmFjZSA8IG5yX2ZhY2VzOyBmYWNlKyspIHsKLQkgaWYgKGludGVsT2JqLT5kaXJ0eV9pbWFnZXNbZmFjZV0pIHsKLQkgICAgZm9yIChpID0gaW50ZWxPYmotPmZpcnN0TGV2ZWw7IGkgPD0gaW50ZWxPYmotPmxhc3RMZXZlbDsgaSsrKSB7Ci0JICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSA9IGludGVsT2JqLT5iYXNlLkltYWdlW2ZhY2VdW2ldOwotCi0JICAgICAgIC8qIE5lZWQgdG8gaW1wb3J0IGltYWdlcyBpbiBtYWluIG1lbW9yeSBvciBoZWxkIGluIG90aGVyIHRyZWVzLgotCQkqLwotCSAgICAgICBpZiAoaW50ZWxPYmotPmRpcnR5X2ltYWdlc1tmYWNlXSAmICgxPDxpKSAmJgotCQkgICB0ZXhJbWFnZSkgewotCi0JCSAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKLQkJICAgICBfbWVzYV9wcmludGYoImNvcHkgZGF0YSBmcm9tIGltYWdlICVkICglcCkgaW50byBvYmplY3QgbWlwdHJlZVxuIiwKLQkJCQkgIGksCi0JCQkJICB0ZXhJbWFnZS0+RGF0YSk7Ci0KLQkJICBpZiAoIWNvcHlfaW1hZ2VfZGF0YV90b190cmVlKGludGVsLAotCQkJCQkgICAgICAgaW50ZWxPYmosCi0JCQkJCSAgICAgICB0ZXhJbWFnZSwKLQkJCQkJICAgICAgIGZhY2UsCi0JCQkJCSAgICAgICBpKSkKLQkJICAgICByZXR1cm4gR0xfRkFMU0U7Ci0KLQkgICAgICAgfQotCSAgICB9Ci0JIH0KLSAgICAgIH0KLQotICAgICAgLyogT25seSBjbGVhciB0aGUgZGlydHkgZmxhZ3MgaWYgZXZlcnl0aGluZyB3ZW50IG9rOgotICAgICAgICovCi0gICAgICBmb3IgKGZhY2UgPSAwOyBmYWNlIDwgbnJfZmFjZXM7IGZhY2UrKykgewotCSBpbnRlbE9iai0+ZGlydHlfaW1hZ2VzW2ZhY2VdID0gMDsKLSAgICAgIH0KLQotICAgICAgaW50ZWxPYmotPmRpcnR5ID0gMDsKLSAgIH0KLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3RleF92YWxpZGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfdmFsaWRhdGUuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40MWE3NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF90ZXhfdmFsaWRhdGUuYwpAQCAtMCwwICsxIEBACisuLi9pbnRlbC9pbnRlbF90ZXhfdmFsaWRhdGUuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvc2VydmVyL2ludGVsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L3NlcnZlci9pbnRlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg1OGEyLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvc2VydmVyL2ludGVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotI2lmbmRlZiBfSU5URUxfSF8KLSNkZWZpbmUgX0lOVEVMX0hfCi0KLSNpbmNsdWRlICJ4Zjg2ZHJtLmgiCQkvKiBkcm1faGFuZGxlX3QsIGV0YyAqLwotCi0vKiBJbnRlbCAqLwotI2lmbmRlZiBQQ0lfQ0hJUF9JODEwCi0jZGVmaW5lIFBDSV9DSElQX0k4MTAgICAgICAgICAgICAgIDB4NzEyMQotI2RlZmluZSBQQ0lfQ0hJUF9JODEwX0RDMTAwICAgICAgICAweDcxMjMKLSNkZWZpbmUgUENJX0NISVBfSTgxMF9FICAgICAgICAgICAgMHg3MTI1Ci0jZGVmaW5lIFBDSV9DSElQX0k4MTUgICAgICAgICAgICAgIDB4MTEzMgotI2RlZmluZSBQQ0lfQ0hJUF9JODEwX0JSSURHRSAgICAgICAweDcxMjAKLSNkZWZpbmUgUENJX0NISVBfSTgxMF9EQzEwMF9CUklER0UgMHg3MTIyCi0jZGVmaW5lIFBDSV9DSElQX0k4MTBfRV9CUklER0UgICAgIDB4NzEyNAotI2RlZmluZSBQQ0lfQ0hJUF9JODE1X0JSSURHRSAgICAgICAweDExMzAKLSNlbmRpZgotCi0jZGVmaW5lIFBDSV9DSElQXzg0NV9HCQkJMHgyNTYyCi0jZGVmaW5lIFBDSV9DSElQX0k4MzBfTQkJCTB4MzU3NwotCi0jaWZuZGVmIFBDSV9DSElQX0k4NTVfR00KLSNkZWZpbmUgUENJX0NISVBfSTg1NV9HTQkgICAweDM1ODIKLSNkZWZpbmUgUENJX0NISVBfSTg1NV9HTV9CUklER0UJICAgMHgzNTgwCi0jZW5kaWYKLQotI2lmbmRlZiBQQ0lfQ0hJUF9JODY1X0cKLSNkZWZpbmUgUENJX0NISVBfSTg2NV9HCQkgICAweDI1NzIKLSNkZWZpbmUgUENJX0NISVBfSTg2NV9HX0JSSURHRQkgICAweDI1NzAKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9DSElQX0k5MTVfRwotI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0cJCSAgIDB4MjU4MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0dfQlJJREdFCSAgIDB4MjU4MAotI2VuZGlmCi0KLSNpZm5kZWYgUENJX0NISVBfSTkxNV9HTQotI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0dNCSAgIDB4MjU5MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0dNX0JSSURHRQkgICAweDI1OTAKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9DSElQX0U3MjIxX0cKLSNkZWZpbmUgUENJX0NISVBfRTcyMjFfRwkgICAweDI1OEEKLS8qIFNhbWUgYXMgSTkxNV9HX0JSSURHRSAqLwotI2RlZmluZSBQQ0lfQ0hJUF9FNzIyMV9HX0JSSURHRQkgICAweDI1ODAKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9DSElQX0k5NDVfRwotI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0cgICAgICAgIDB4Mjc3MgotI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0dfQlJJREdFIDB4Mjc3MAotI2VuZGlmCi0KLSNpZm5kZWYgUENJX0NISVBfSTk0NV9HTQotI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0dNICAgICAgICAweDI3QTIKLSNkZWZpbmUgUENJX0NISVBfSTk0NV9HTV9CUklER0UgMHgyN0EwCi0jZW5kaWYKLQotI2RlZmluZSBJU19JODEwKHBJODEwKSAocEk4MTAtPkNoaXBzZXQgPT0gUENJX0NISVBfSTgxMCB8fAlcCi0JCQlwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF9JODEwX0RDMTAwIHx8IFwKLQkJCXBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k4MTBfRSkKLSNkZWZpbmUgSVNfSTgxNShwSTgxMCkgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k4MTUpCi0jZGVmaW5lIElTX0k4MzAocEk4MTApIChwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF9JODMwX00pCi0jZGVmaW5lIElTXzg0NUcocEk4MTApIChwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF84NDVfRykKLSNkZWZpbmUgSVNfSTg1WChwSTgxMCkgIChwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF9JODU1X0dNKQotI2RlZmluZSBJU19JODUyKHBJODEwKSAgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k4NTVfR00gJiYgKHBJODEwLT52YXJpYW50ID09IEk4NTJfR00gfHwgcEk4MTAtPnZhcmlhbnQgPT0gSTg1Ml9HTUUpKQotI2RlZmluZSBJU19JODU1KHBJODEwKSAgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k4NTVfR00gJiYgKHBJODEwLT52YXJpYW50ID09IEk4NTVfR00gfHwgcEk4MTAtPnZhcmlhbnQgPT0gSTg1NV9HTUUpKQotI2RlZmluZSBJU19JODY1RyhwSTgxMCkgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k4NjVfRykKLQotI2RlZmluZSBJU19JOTE1RyhwSTgxMCkgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k5MTVfRyB8fCBwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF9FNzIyMV9HKQotI2RlZmluZSBJU19JOTE1R00ocEk4MTApIChwSTgxMC0+Q2hpcHNldCA9PSBQQ0lfQ0hJUF9JOTE1X0dNKQotI2RlZmluZSBJU19JOTQ1RyhwSTgxMCkgKHBJODEwLT5DaGlwc2V0ID09IFBDSV9DSElQX0k5NDVfRykKLSNkZWZpbmUgSVNfSTk0NUdNKHBJODEwKSAocEk4MTAtPkNoaXBzZXQgPT0gUENJX0NISVBfSTk0NV9HTSkKLSNkZWZpbmUgSVNfSTlYWChwSTgxMCkgKElTX0k5MTVHKHBJODEwKSB8fCBJU19JOTE1R00ocEk4MTApIHx8IElTX0k5NDVHKHBJODEwKSB8fCBJU19JOTQ1R00ocEk4MTApKQotCi0jZGVmaW5lIElTX01PQklMRShwSTgxMCkgKElTX0k4MzAocEk4MTApIHx8IElTX0k4NVgocEk4MTApIHx8IElTX0k5MTVHTShwSTgxMCkgfHwgSVNfSTk0NUdNKHBJODEwKSkKLQotI2RlZmluZSBJODMwX0dNQ0hfQ1RSTAkJMHg1MgotCi0KLSNkZWZpbmUgSTgzMF9HTUNIX0dNU19NQVNLCQkJMHg3MAotI2RlZmluZSBJODMwX0dNQ0hfR01TX0RJU0FCTEVECQkweDAwCi0jZGVmaW5lIEk4MzBfR01DSF9HTVNfTE9DQUwJCQkweDEwCi0jZGVmaW5lIEk4MzBfR01DSF9HTVNfU1RPTEVOXzUxMgkweDIwCi0jZGVmaW5lIEk4MzBfR01DSF9HTVNfU1RPTEVOXzEwMjQJMHgzMAotI2RlZmluZSBJODMwX0dNQ0hfR01TX1NUT0xFTl84MTkyCTB4NDAKLQotI2RlZmluZSBJODU1X0dNQ0hfR01TX01BU0sJCQkoMHg3IDw8IDQpCi0jZGVmaW5lIEk4NTVfR01DSF9HTVNfRElTQUJMRUQJCQkweDAwCi0jZGVmaW5lIEk4NTVfR01DSF9HTVNfU1RPTEVOXzFNCQkJKDB4MSA8PCA0KQotI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl80TQkJCSgweDIgPDwgNCkKLSNkZWZpbmUgSTg1NV9HTUNIX0dNU19TVE9MRU5fOE0JCQkoMHgzIDw8IDQpCi0jZGVmaW5lIEk4NTVfR01DSF9HTVNfU1RPTEVOXzE2TQkJKDB4NCA8PCA0KQotI2RlZmluZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8zMk0JCSgweDUgPDwgNCkKLSNkZWZpbmUgSTkxNUdfR01DSF9HTVNfU1RPTEVOXzQ4TQkJKDB4NiA8PCA0KQotI2RlZmluZSBJOTE1R19HTUNIX0dNU19TVE9MRU5fNjRNCQkoMHg3IDw8IDQpCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBCb29sOwotI2RlZmluZSBUUlVFIDEKLSNkZWZpbmUgRkFMU0UgMAotCi0jZGVmaW5lIFBJUEVfTk9ORQkwPDwwCi0jZGVmaW5lIFBJUEVfQ1JUCTE8PDAKLSNkZWZpbmUgUElQRV9UVgkJMTw8MQotI2RlZmluZSBQSVBFX0RGUAkxPDwyCi0jZGVmaW5lIFBJUEVfTEZQCTE8PDMKLSNkZWZpbmUgUElQRV9DUlQyCTE8PDQKLSNkZWZpbmUgUElQRV9UVjIJMTw8NQotI2RlZmluZSBQSVBFX0RGUDIJMTw8NgotI2RlZmluZSBQSVBFX0xGUDIJMTw8NwotCi10eXBlZGVmIHN0cnVjdCBfSTgzME1lbVBvb2wgKkk4MzBNZW1Qb29sUHRyOwotdHlwZWRlZiBzdHJ1Y3QgX0k4MzBNZW1SYW5nZSAqSTgzME1lbVJhbmdlUHRyOwotdHlwZWRlZiBzdHJ1Y3QgX0k4MzBNZW1SYW5nZSB7Ci0gICBsb25nIFN0YXJ0OwotICAgbG9uZyBFbmQ7Ci0gICBsb25nIFNpemU7Ci0gICB1bnNpZ25lZCBsb25nIFBoeXNpY2FsOwotICAgdW5zaWduZWQgbG9uZyBPZmZzZXQ7CQkvKiBPZmZzZXQgb2YgQUdQLWFsbG9jYXRlZCBwb3J0aW9uICovCi0gICB1bnNpZ25lZCBsb25nIEFsaWdubWVudDsKLSAgIGRybV9oYW5kbGVfdCBLZXk7Ci0gICB1bnNpZ25lZCBsb25nIFBpdGNoOyAvLyBhZGQgcGl0Y2gKLSAgIEk4MzBNZW1Qb29sUHRyIFBvb2w7Ci19IEk4MzBNZW1SYW5nZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0k4MzBNZW1Qb29sIHsKLSAgIEk4MzBNZW1SYW5nZSBUb3RhbDsKLSAgIEk4MzBNZW1SYW5nZSBGcmVlOwotICAgSTgzME1lbVJhbmdlIEZpeGVkOwotICAgSTgzME1lbVJhbmdlIEFsbG9jYXRlZDsKLX0gSTgzME1lbVBvb2w7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIGludCB0YWlsX21hc2s7Ci0gICBJODMwTWVtUmFuZ2UgbWVtOwotICAgdW5zaWduZWQgY2hhciAqdmlydHVhbF9zdGFydDsKLSAgIGludCBoZWFkOwotICAgaW50IHRhaWw7Ci0gICBpbnQgc3BhY2U7Ci19IEk4MzBSaW5nQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdCBfSTgzMFJlYyB7Ci0gICB1bnNpZ25lZCBjaGFyICpNTUlPQmFzZTsKLSAgIHVuc2lnbmVkIGNoYXIgKkZiQmFzZTsKLSAgIGludCBjcHA7Ci0KLSAgIHVuc2lnbmVkIGludCBiaW9zX3ZlcnNpb247Ci0KLSAgIC8qIFRoZXNlIGFyZSBzZXQgaW4gUHJlSW5pdCBhbmQgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgIGxvbmcgRmJNYXBTaXplOwotICAgbG9uZyBUb3RhbFZpZGVvUmFtOwotICAgSTgzME1lbVJhbmdlIFN0b2xlbk1lbW9yeTsJCS8qIHByZS1hbGxvY2F0ZWQgbWVtb3J5ICovCi0gICBsb25nIEJJT1NNZW1vcnlTaXplOwkJCS8qIG1pbiBzdG9sZW4gcG9vbCBzaXplICovCi0gICBpbnQgQklPU01lbVNpemVMb2M7Ci0KLSAgIC8qIFRoZXNlIGNoYW5nZSBhY2NvcmRpbmcgdG8gd2hhdCBoYXMgYmVlbiBhbGxvY2F0ZWQuICovCi0gICBsb25nIEZyZWVNZW1vcnk7Ci0gICBJODMwTWVtUmFuZ2UgTWVtb3J5QXBlcnR1cmU7Ci0gICBJODMwTWVtUG9vbCBTdG9sZW5Qb29sOwotICAgbG9uZyBhbGxvY2F0ZWRNZW1vcnk7Ci0KLSAgIC8qIFJlZ2lvbnMgYWxsb2NhdGVkIGVpdGhlciBmcm9tIHRoZSBhYm92ZSBwb29scywgb3IgZnJvbSBhZ3BnYXJ0LiAqLwotICAgLyogZm9yIHNpbmdsZSBhbmQgZHVhbCBoZWFkIGNvbmZpZ3VyYXRpb25zICovCi0gICBJODMwTWVtUmFuZ2UgRnJvbnRCdWZmZXI7Ci0gICBJODMwTWVtUmFuZ2UgRnJvbnRCdWZmZXIyOwotICAgSTgzME1lbVJhbmdlIFNjcmF0Y2g7Ci0gICBJODMwTWVtUmFuZ2UgU2NyYXRjaDI7Ci0KLSAgIEk4MzBSaW5nQnVmZmVyICpMcFJpbmc7Ci0KLSAgIEk4MzBNZW1SYW5nZSBCYWNrQnVmZmVyOwotICAgSTgzME1lbVJhbmdlIERlcHRoQnVmZmVyOwotICAgSTgzME1lbVJhbmdlIFRleE1lbTsKLSAgIGludCBUZXhHcmFudWxhcml0eTsKLSAgIEk4MzBNZW1SYW5nZSBDb250ZXh0TWVtOwotICAgaW50IGRybU1pbm9yOwotICAgQm9vbCBoYXZlM0RXaW5kb3dzOwotCi0gICBCb29sIE5lZWRSaW5nQnVmZmVyTG93OwotICAgQm9vbCBhbGxvd1BhZ2VGbGlwOwotICAgQm9vbCBkaXNhYmxlVGlsaW5nOwotCi0gICBpbnQgQ2hpcHNldDsKLSAgIHVuc2lnbmVkIGxvbmcgTGluZWFyQWRkcjsKLSAgIHVuc2lnbmVkIGxvbmcgTU1JT0FkZHI7Ci0KLSAgIGRybVNpemUgICAgICAgICAgIHJlZ2lzdGVyU2l6ZTsgICAgIC8qKjwgXGJyaWVmIE1NSU8gcmVnaXN0ZXIgbWFwIHNpemUgKi8KLSAgIGRybV9oYW5kbGVfdCAgICAgICAgIHJlZ2lzdGVySGFuZGxlOyAgIC8qKjwgXGJyaWVmIE1NSU8gcmVnaXN0ZXIgbWFwIGhhbmRsZSAqLwotICAvLyAgIElPQUREUkVTUyBpb0Jhc2U7Ci0gICBpbnQgICAgICAgICAgICAgICBpcnE7ICAgICAgICAgICAgICAvKio8IFxicmllZiBJUlEgbnVtYmVyICovCi0gICBpbnQgR3R0Qm91bmQ7Ci0KLSAgIGRybV9oYW5kbGVfdCByaW5nX21hcDsKLSAgIHVuc2lnbmVkIGludCBGZW5jZVs4XTsKLQotfSBJODMwUmVjOwotCi0vKgotICogMTIyODggaXMgc2V0IGFzIHRoZSBtYXhpbXVtLCBjaG9zZW4gYmVjYXVzZSBpdCBpcyBlbm91Z2ggZm9yCi0gKiAxOTIweDE0NDBAMzJicHAgd2l0aCBhIDIwNDggcGl4ZWwgbGluZSBwaXRjaCB3aXRoIHNvbWUgdG8gc3BhcmUuCi0gKi8KLSNkZWZpbmUgSTgzMF9NQVhJTVVNX1ZCSU9TX01FTQkJMTIyODgKLSNkZWZpbmUgSTgzMF9ERUZBVUxUX1ZJREVPTUVNXzJECShNQigzMikgLyAxMDI0KQotI2RlZmluZSBJODMwX0RFRkFVTFRfVklERU9NRU1fM0QJKE1CKDY0KSAvIDEwMjQpCi0KLS8qIEZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbiAqLwotI2RlZmluZSBGUk9NX0FOWVdIRVJFCQkJMHgwMDAwMDAwMAotI2RlZmluZSBGUk9NX1BPT0xfT05MWQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgRlJPTV9ORVdfT05MWQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgRlJPTV9NQVNLCQkJMHgwMDAwMDAwZgotCi0jZGVmaW5lIEFMTE9DQVRFX0FUX1RPUAkJCTB4MDAwMDAwMTAKLSNkZWZpbmUgQUxMT0NBVEVfQVRfQk9UVE9NCQkweDAwMDAwMDIwCi0jZGVmaW5lIEZPUkNFX0dBUFMJCQkweDAwMDAwMDQwCi0KLSNkZWZpbmUgTkVFRF9QSFlTSUNBTF9BRERSCQkweDAwMDAwMTAwCi0jZGVmaW5lIEFMSUdOX0JPVEhfRU5EUwkJCTB4MDAwMDAyMDAKLSNkZWZpbmUgRk9SQ0VfTE9XCQkJMHgwMDAwMDQwMAotCi0jZGVmaW5lIEFMTE9DX05PX1RJTElORwkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgQUxMT0NfSU5JVElBTAkJCTB4MDAwMDIwMDAKLQotI2RlZmluZSBBTExPQ0FURV9EUllfUlVOCQkweDgwMDAwMDAwCi0KLS8qIENoaXBzZXQgcmVnaXN0ZXJzIGZvciBWSURFTyBCSU9TIG1lbW9yeSBSVyBhY2Nlc3MgKi8KLSNkZWZpbmUgXzg1NV9EUkFNX1JXX0NPTlRST0wgMHg1OAotI2RlZmluZSBfODQ1X0RSQU1fUldfQ09OVFJPTCAweDkwCi0jZGVmaW5lIERSQU1fV1JJVEUgICAgMHgzMzMzMDAwMAotCi0jZGVmaW5lIEtCKHgpICgoeCkgKiAxMDI0KQotI2RlZmluZSBNQih4KSAoKHgpICogS0IoMTAyNCkpCi0KLSNkZWZpbmUgR1RUX1BBR0VfU0laRQkJCUtCKDQpCi0jZGVmaW5lIFJPVU5EX1RPKHgsIHkpCQkJKCgoeCkgKyAoeSkgLSAxKSAvICh5KSAqICh5KSkKLSNkZWZpbmUgUk9VTkRfRE9XTl9UTyh4LCB5KQkJKCh4KSAvICh5KSAqICh5KSkKLSNkZWZpbmUgUk9VTkRfVE9fUEFHRSh4KQkJUk9VTkRfVE8oKHgpLCBHVFRfUEFHRV9TSVpFKQotI2RlZmluZSBST1VORF9UT19NQih4KQkJCVJPVU5EX1RPKCh4KSwgTUIoMSkpCi0jZGVmaW5lIFBSSU1BUllfUklOR0JVRkZFUl9TSVpFCQlLQigxMjgpCi0KLQotLyogUmluZyBidWZmZXIgcmVnaXN0ZXJzLCBwMjc3LCBvdmVydmlldyBwMTkKLSAqLwotI2RlZmluZSBMUF9SSU5HICAgICAweDIwMzAKLSNkZWZpbmUgSFBfUklORyAgICAgMHgyMDQwCi0KLSNkZWZpbmUgUklOR19UQUlMICAgICAgMHgwMAotI2RlZmluZSBUQUlMX0FERFIgICAgICAgICAgIDB4MDAwRkZGRjgKLSNkZWZpbmUgSTgzMF9UQUlMX01BU0sJICAgIDB4MDAxRkZGRjgKLQotI2RlZmluZSBSSU5HX0hFQUQgICAgICAweDA0Ci0jZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgMHhGRkUwMDAwMAotI2RlZmluZSBIRUFEX1dSQVBfT05FICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSEVBRF9BRERSICAgICAgICAgICAweDAwMUZGRkZDCi0jZGVmaW5lIEk4MzBfSEVBRF9NQVNLICAgICAgMHgwMDFGRkZGQwotCi0jZGVmaW5lIFJJTkdfU1RBUlQgICAgIDB4MDgKLSNkZWZpbmUgU1RBUlRfQUREUiAgICAgICAgICAweDAzRkZGRkY4Ci0jZGVmaW5lIEk4MzBfUklOR19TVEFSVF9NQVNLCTB4RkZGRkYwMDAKLQotI2RlZmluZSBSSU5HX0xFTiAgICAgICAweDBDCi0jZGVmaW5lIFJJTkdfTlJfUEFHRVMgICAgICAgMHgwMDFGRjAwMCAKLSNkZWZpbmUgSTgzMF9SSU5HX05SX1BBR0VTCTB4MDAxRkYwMDAKLSNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFJJTkdfUkVQT1JUXzY0SyAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSSU5HX1JFUE9SVF8xMjhLICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFJJTkdfVkFMSURfTUFTSyAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBSSU5HX1ZBTElEICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAweDAwMDAwMDAwCi0KLQotLyogRmVuY2UvVGlsaW5nIHJhbmdlcyBbMC4uN10KLSAqLwotI2RlZmluZSBGRU5DRSAgICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBGRU5DRV9OUiAgICAgICAgIDgKLQotI2RlZmluZSBJOTE1R19GRU5DRV9TVEFSVF9NQVNLCTB4MGZmMDAwMDAKLQotI2RlZmluZSBJODMwX0ZFTkNFX1NUQVJUX01BU0sJMHgwN2Y4MDAwMAotCi0jZGVmaW5lIEZFTkNFX1NUQVJUX01BU0sgICAgMHgwM0Y4MDAwMAotI2RlZmluZSBGRU5DRV9YX01BSk9SICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRkVOQ0VfWV9NQUpPUiAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEZFTkNFX1NJWkVfTUFTSyAgICAgMHgwMDAwMDcwMAotI2RlZmluZSBGRU5DRV9TSVpFXzUxMksgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRkVOQ0VfU0laRV8xTSAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEZFTkNFX1NJWkVfMk0gICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBGRU5DRV9TSVpFXzRNICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgRkVOQ0VfU0laRV84TSAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEZFTkNFX1NJWkVfMTZNICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBGRU5DRV9TSVpFXzMyTSAgICAgIDB4MDAwMDA2MDAKLSNkZWZpbmUgRkVOQ0VfU0laRV82NE0JICAgIDB4MDAwMDA3MDAKLSNkZWZpbmUgSTkxNUdfRkVOQ0VfU0laRV8xTSAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEk5MTVHX0ZFTkNFX1NJWkVfMk0gICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBJOTE1R19GRU5DRV9TSVpFXzRNICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSTkxNUdfRkVOQ0VfU0laRV84TSAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIEk5MTVHX0ZFTkNFX1NJWkVfMTZNICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBJOTE1R19GRU5DRV9TSVpFXzMyTSAgICAgIDB4MDAwMDA1MDAKLSNkZWZpbmUgSTkxNUdfRkVOQ0VfU0laRV82NE0JMHgwMDAwMDYwMAotI2RlZmluZSBJOTE1R19GRU5DRV9TSVpFXzEyOE0JMHgwMDAwMDcwMAotI2RlZmluZSBGRU5DRV9QSVRDSF8xICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRkVOQ0VfUElUQ0hfMiAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEZFTkNFX1BJVENIXzQgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBGRU5DRV9QSVRDSF84ICAgICAgIDB4MDAwMDAwMzAKLSNkZWZpbmUgRkVOQ0VfUElUQ0hfMTYgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEZFTkNFX1BJVENIXzMyICAgICAgMHgwMDAwMDA1MAotI2RlZmluZSBGRU5DRV9QSVRDSF82NAkgICAgMHgwMDAwMDA2MAotI2RlZmluZSBGRU5DRV9WQUxJRCAgICAgICAgIDB4MDAwMDAwMDEKLQotI2luY2x1ZGUgPG1taW8uaD4KLQotIyAgZGVmaW5lIE1NSU9fSU44KGJhc2UsIG9mZnNldCkgXAotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoKHVuc2lnbmVkIGNoYXIqKShiYXNlKSkgKyAob2Zmc2V0KSkKLSMgIGRlZmluZSBNTUlPX0lOMzIoYmFzZSwgb2Zmc2V0KSBcCi0JcmVhZF9NTUlPX0xFMzIoYmFzZSwgb2Zmc2V0KQotIyAgZGVmaW5lIE1NSU9fT1VUOChiYXNlLCBvZmZzZXQsIHZhbCkgXAotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoKHVuc2lnbmVkIGNoYXIqKShiYXNlKSkgKyAob2Zmc2V0KSkgPSAodmFsKQotIyAgZGVmaW5lIE1NSU9fT1VUMzIoYmFzZSwgb2Zmc2V0LCB2YWwpIFwKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh2b2lkICopKCgodW5zaWduZWQgY2hhciopKGJhc2UpKSArIChvZmZzZXQpKSA9IENQVV9UT19MRTMyKHZhbCkKLQotCi0JCQkJLyogTWVtb3J5IG1hcHBlZCByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lIElOUkVHOChhZGRyKSAgICAgICAgTU1JT19JTjgoTU1JTywgYWRkcikKLSNkZWZpbmUgSU5SRUcoYWRkcikgICAgICAgICBNTUlPX0lOMzIoTU1JTywgYWRkcikKLSNkZWZpbmUgT1VUUkVHOChhZGRyLCB2YWwpICBNTUlPX09VVDgoTU1JTywgYWRkciwgdmFsKQotI2RlZmluZSBPVVRSRUcoYWRkciwgdmFsKSAgIE1NSU9fT1VUMzIoTU1JTywgYWRkciwgdmFsKQotCi0jZGVmaW5lIERTUEFCQVNFCQkweDcwMTg0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9zZXJ2ZXIvaW50ZWxfZHJpLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L3NlcnZlci9pbnRlbF9kcmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5ZmRiZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L3NlcnZlci9pbnRlbF9kcmkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODIgKzAsMCBAQAotLyoqCi0gKiBcZmlsZSBzZXJ2ZXIvaW50ZWxfZHJpLmMKLSAqIFxicmllZiBGaWxlIHRvIHBlcmZvcm0gdGhlIGRldmljZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiB0YXNrcyB0eXBpY2FsbHkKLSAqIGRvbmUgaW4gdGhlIFggc2VydmVyLgotICoKLSAqIEhlcmUgdGhleSBhcmUgY29udmVydGVkIHRvIHJ1biBpbiB0aGUgY2xpZW50IChvciBwZXJoYXBzIGEgc3RhbmRhbG9uZQotICogcHJvY2VzcyksIGFuZCB0byB3b3JrIHdpdGggdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgcmF0aGVyIHRoYW4gdGhlIFgKLSAqIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KLSAqIAotICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmUgQWlybGllIChhaXJsaWVkQGxpbnV4LmllKQotCi0gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAotIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCi0gQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJkcml2ZXIuaCIKLSNpbmNsdWRlICJkcm0uaCIKLQotI2luY2x1ZGUgImludGVsLmgiCi0jaW5jbHVkZSAiaTgzMF9kcmkuaCIKLQotI2luY2x1ZGUgIm1lbW9wcy5oIgotI2luY2x1ZGUgInBjaWFjY2Vzcy5oIgotCi1zdGF0aWMgc2l6ZV90IGRybV9wYWdlX3NpemU7Ci1zdGF0aWMgaW50IG5leHRUaWxlID0gMDsKLSNkZWZpbmUgeGY4NkRydk1zZyguLi4pIGRvIHt9IHdoaWxlKDApCi0KLXN0YXRpYyBjb25zdCBpbnQgcGl0Y2hlc1tdID0gewotICAxMjggKiA4LAotICAxMjggKiAxNiwKLSAgMTI4ICogMzIsCi0gIDEyOCAqIDY0LAotICAwCi19OwotCi1zdGF0aWMgQm9vbCBJODMwRFJJRG9NYXBwaW5ncyhEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBkcm1JODMwU2FyZWEgKnNhcmVhKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLUdldEJlc3RUaWxlQWxpZ25tZW50KHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgIHVuc2lnbmVkIGxvbmcgaTsKLQotICAgZm9yIChpID0gS0IoNTEyKTsgaSA8IHNpemU7IGkgPDw9IDEpCi0gICAgICA7Ci0KLSAgIGlmIChpID4gTUIoNjQpKQotICAgICAgaSA9IE1CKDY0KTsKLQotICAgcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldEZlbmNlUmVncyhjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwKQotewotICBpbnQgaTsKLSAgdW5zaWduZWQgY2hhciAqTU1JTyA9IGN0eC0+TU1JT0FkZHJlc3M7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgIE9VVFJFRyhGRU5DRSArIGkgKiA0LCBwSTgzMC0+RmVuY2VbaV0pOwotICAgIC8vICAgIGlmIChJODEwX0RFQlVHICYgREVCVUdfVkVSQk9TRV9WR0EpCi0gICAgZnByaW50ZihzdGRlcnIsIkZlbmNlIFJlZ2lzdGVyIDogJXhcbiIsIHBJODMwLT5GZW5jZVtpXSk7Ci0gIH0KLX0KLQotLyogVGlsZWQgbWVtb3J5IGlzIGdvb2QuLi4gcmVhbGx5LCByZWFsbHkgZ29vZC4uLgotICoKLSAqIE5lZWQgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSB0aGF0IHdlIG1pc3Mgb3V0IG9uIHRoaXMgLSBwcm9iYWJseQotICogbmVlZCB0byBtb3ZlIHRoZSBmcm9udGJ1ZmZlciBhd2F5IGZyb20gdGhlICdndWFyZW50ZWVkJyBhbGlnbm1lbnQKLSAqIG9mIHRoZSBmaXJzdCBtZW1vcnkgc2VnbWVudCwgb3IgcGVyaGFwcyBhbGxvY2F0ZSBhIGRpc2NvbnRpZ291cwotICogZnJhbWVidWZmZXIgdG8gZ2V0IG1vcmUgYWxpZ25tZW50ICdzd2VldCBzcG90cycuCi0gKi8KLXN0YXRpYyB2b2lkCi1TZXRGZW5jZShjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLAotCSBpbnQgbnIsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IHBpdGNoLAotICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCi17Ci0gICB1bnNpZ25lZCBpbnQgdmFsOwotICAgdW5zaWduZWQgaW50IGZlbmNlX21hc2sgPSAwOwotICAgdW5zaWduZWQgaW50IGZlbmNlX3BpdGNoOwotCi0gICBpZiAobnIgPCAwIHx8IG5yID4gNykgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0JCSAiU2V0RmVuY2U6IGZlbmNlICVkIG91dCBvZiByYW5nZVxuIixucik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBJODMwLT5GZW5jZVtucl0gPSAwOwotCi0gICBpZiAoSVNfSTlYWChwSTgzMCkpCi0gICAJZmVuY2VfbWFzayA9IH5JOTE1R19GRU5DRV9TVEFSVF9NQVNLOwotICAgZWxzZQotICAgCWZlbmNlX21hc2sgPSB+STgzMF9GRU5DRV9TVEFSVF9NQVNLOwotCi0gICBpZiAoc3RhcnQgJiBmZW5jZV9tYXNrKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJTZXRGZW5jZTogJWQ6IHN0YXJ0ICgweCUwOHgpIGlzIG5vdCAlcyBhbGlnbmVkXG4iLAotCQkgbnIsIHN0YXJ0LCAoSVNfSTlYWChwSTgzMCkpID8gIjFNQiIgOiAiNTEyayIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAoc3RhcnQgJSBzaXplKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJTZXRGZW5jZTogJWQ6IHN0YXJ0ICgweCUwOHgpIGlzIG5vdCBzaXplICglZGspIGFsaWduZWRcbiIsCi0JCSBuciwgc3RhcnQsIHNpemUgLyAxMDI0KTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHBpdGNoICYgMTI3KSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJTZXRGZW5jZTogJWQ6IHBpdGNoICglZCkgbm90IGEgbXVsdGlwbGUgb2YgMTI4IGJ5dGVzXG4iLAotCQkgbnIsIHBpdGNoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgdmFsID0gKHN0YXJ0IHwgRkVOQ0VfWF9NQUpPUiB8IEZFTkNFX1ZBTElEKTsKLQotICAgaWYgKElTX0k5WFgocEk4MzApKSB7Ci0gICAJc3dpdGNoIChzaXplKSB7Ci0JICAgY2FzZSBNQigxKToKLSAgICAgIAkJdmFsIHw9IEk5MTVHX0ZFTkNFX1NJWkVfMU07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGNhc2UgTUIoMik6Ci0gICAgICAJCXZhbCB8PSBJOTE1R19GRU5DRV9TSVpFXzJNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBjYXNlIE1CKDQpOgotICAgICAgCQl2YWwgfD0gSTkxNUdfRkVOQ0VfU0laRV80TTsKLSAgICAgIAkJYnJlYWs7Ci0gICAJICAgY2FzZSBNQig4KToKLSAgICAgIAkJdmFsIHw9IEk5MTVHX0ZFTkNFX1NJWkVfOE07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGNhc2UgTUIoMTYpOgotICAgICAgCQl2YWwgfD0gSTkxNUdfRkVOQ0VfU0laRV8xNk07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGNhc2UgTUIoMzIpOgotICAgICAgCQl2YWwgfD0gSTkxNUdfRkVOQ0VfU0laRV8zMk07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGNhc2UgTUIoNjQpOgotICAgICAgCQl2YWwgfD0gSTkxNUdfRkVOQ0VfU0laRV82NE07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGRlZmF1bHQ6Ci0gICAgICAJCWZwcmludGYoc3RkZXJyLAotCQkgIlNldEZlbmNlOiAlZDogaWxsZWdhbCBzaXplICglZCBrQnl0ZSlcbiIsIG5yLCBzaXplIC8gMTAyNCk7Ci0gICAgICAJCXJldHVybjsKLSAgIAl9Ci0gICAgfSBlbHNlIHsKLSAgIAlzd2l0Y2ggKHNpemUpIHsKLQkgICBjYXNlIEtCKDUxMik6Ci0gICAgICAJCXZhbCB8PSBGRU5DRV9TSVpFXzUxMks7Ci0gICAgICAJCWJyZWFrOwotCSAgIGNhc2UgTUIoMSk6Ci0gICAgICAJCXZhbCB8PSBGRU5DRV9TSVpFXzFNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBjYXNlIE1CKDIpOgotICAgICAgCQl2YWwgfD0gRkVOQ0VfU0laRV8yTTsKLSAgICAgIAkJYnJlYWs7Ci0gICAJICAgY2FzZSBNQig0KToKLSAgICAgIAkJdmFsIHw9IEZFTkNFX1NJWkVfNE07Ci0gICAgICAJCWJyZWFrOwotICAgCSAgIGNhc2UgTUIoOCk6Ci0gICAgICAJCXZhbCB8PSBGRU5DRV9TSVpFXzhNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBjYXNlIE1CKDE2KToKLSAgICAgIAkJdmFsIHw9IEZFTkNFX1NJWkVfMTZNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBjYXNlIE1CKDMyKToKLSAgICAgIAkJdmFsIHw9IEZFTkNFX1NJWkVfMzJNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBjYXNlIE1CKDY0KToKLSAgICAgIAkJdmFsIHw9IEZFTkNFX1NJWkVfNjRNOwotICAgICAgCQlicmVhazsKLSAgIAkgICBkZWZhdWx0OgotICAgICAgCQlmcHJpbnRmKHN0ZGVyciwKLQkJICJTZXRGZW5jZTogJWQ6IGlsbGVnYWwgc2l6ZSAoJWQga0J5dGUpXG4iLCBuciwgc2l6ZSAvIDEwMjQpOwotICAgICAgCQlyZXR1cm47Ci0gICAJfQotICAgfQotCi0gICBpZiAoSVNfSTlYWChwSTgzMCkpCi0JZmVuY2VfcGl0Y2ggPSBwaXRjaCAvIDUxMjsKLSAgIGVsc2UKLQlmZW5jZV9waXRjaCA9IHBpdGNoIC8gMTI4OwotCi0gICBzd2l0Y2ggKGZlbmNlX3BpdGNoKSB7Ci0gICBjYXNlIDE6Ci0gICAgICB2YWwgfD0gRkVOQ0VfUElUQ0hfMTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAyOgotICAgICAgdmFsIHw9IEZFTkNFX1BJVENIXzI7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgNDoKLSAgICAgIHZhbCB8PSBGRU5DRV9QSVRDSF80OwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDg6Ci0gICAgICB2YWwgfD0gRkVOQ0VfUElUQ0hfODsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAxNjoKLSAgICAgIHZhbCB8PSBGRU5DRV9QSVRDSF8xNjsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAzMjoKLSAgICAgIHZhbCB8PSBGRU5DRV9QSVRDSF8zMjsKLSAgICAgIGJyZWFrOwotICAgY2FzZSA2NDoKLSAgICAgIHZhbCB8PSBGRU5DRV9QSVRDSF82NDsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYoc3RkZXJyLAotCQkgIlNldEZlbmNlOiAlZDogaWxsZWdhbCBwaXRjaCAoJWQpXG4iLCBuciwgcGl0Y2gpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwSTgzMC0+RmVuY2VbbnJdID0gdmFsOwotfQotCi1zdGF0aWMgQm9vbAotTWFrZVRpbGVzKGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzAsIEk4MzBNZW1SYW5nZSAqcE1lbSkKLXsKLSAgIGludCBwaXRjaCwgbnRpbGVzLCBpOwotCi0gICBwaXRjaCA9IHBNZW0tPlBpdGNoICogY3R4LT5jcHA7Ci0gICAvKgotICAgICogU2ltcGx5IHRyeSB0byBicmVhayB0aGUgcmVnaW9uIHVwIGludG8gYXQgbW9zdCBmb3VyIHBpZWNlcyBvZiBzaXplCi0gICAgKiBlcXVhbCB0byB0aGUgYWxpZ25tZW50LgotICAgICovCi0gICBudGlsZXMgPSBST1VORF9UTyhwTWVtLT5TaXplLCBwTWVtLT5BbGlnbm1lbnQpIC8gcE1lbS0+QWxpZ25tZW50OwotICAgaWYgKG50aWxlcyA+PSA0KSB7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICB9Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBudGlsZXM7IGkrKywgbmV4dFRpbGUrKykgewotICAgICBTZXRGZW5jZShjdHgsIHBJODMwLCBuZXh0VGlsZSwgcE1lbS0+U3RhcnQgKyBpICogcE1lbS0+QWxpZ25tZW50LAotCSAgICAgICBwaXRjaCwgcE1lbS0+QWxpZ25tZW50KTsKLSAgIH0KLSAgIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgdm9pZCBJODMwU2V0dXBNZW1vcnlUaWxpbmcoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCkKLXsKLSAgaW50IGk7Ci0KLSAgLyogQ2xlYXIgb3V0ICovCi0gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgcEk4MzAtPkZlbmNlW2ldID0gMDsKLSAgCi0gIG5leHRUaWxlID0gMDsKLQotICBpZiAocEk4MzAtPkJhY2tCdWZmZXIuQWxpZ25tZW50ID49IEtCKDUxMikpIHsKLSAgICBpZiAoTWFrZVRpbGVzKGN0eCwgcEk4MzAsICYocEk4MzAtPkJhY2tCdWZmZXIpKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0JCSAiQWN0aXZhdGluZyB0aWxlZCBtZW1vcnkgZm9yIHRoZSBiYWNrIGJ1ZmZlci5cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJNYWtlVGlsZXMgZmFpbGVkIGZvciB0aGUgYmFjayBidWZmZXIuXG4iKTsKLSAgICAgIHBJODMwLT5hbGxvd1BhZ2VGbGlwID0gRkFMU0U7Ci0gICAgfQotICB9Ci0gIAotICBpZiAocEk4MzAtPkRlcHRoQnVmZmVyLkFsaWdubWVudCA+PSBLQig1MTIpKSB7Ci0gICAgaWYgKE1ha2VUaWxlcyhjdHgsIHBJODMwLCAmKHBJODMwLT5EZXB0aEJ1ZmZlcikpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJBY3RpdmF0aW5nIHRpbGVkIG1lbW9yeSBmb3IgdGhlIGRlcHRoIGJ1ZmZlci5cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJNYWtlVGlsZXMgZmFpbGVkIGZvciB0aGUgZGVwdGggYnVmZmVyLlxuIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IEk4MzBEZXRlY3RNZW1vcnkoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCkKLXsKLSAgc3RydWN0IHBjaV9kZXZpY2UgaG9zdF9icmlkZ2U7Ci0gIHVpbnQzMl90IGdtY2hfY3RybDsKLSAgaW50IG1lbXNpemUgPSAwOwotICBpbnQgcmFuZ2U7Ci0KLSAgbWVtc2V0KCZob3N0X2JyaWRnZSwgMCwgc2l6ZW9mKGhvc3RfYnJpZGdlKSk7Ci0KLSAgcGNpX2RldmljZV9jZmdfcmVhZF91MzIoJmhvc3RfYnJpZGdlLCAmZ21jaF9jdHJsLCBJODMwX0dNQ0hfQ1RSTCk7Ci0gIAotICAvKiBXZSBuZWVkIHRvIHJlZHVjZSB0aGUgc3RvbGVuIHNpemUsIGJ5IHRoZSBHVFQgYW5kIHRoZSBwb3B1cC4KLSAgICogVGhlIEdUVCB2YXJ5aW5nIGFjY29yZGluZyB0aGUgdGhlIEZiTWFwU2l6ZSBhbmQgdGhlIHBvcHVwIGlzIDRLQiAqLwotICByYW5nZSA9IChjdHgtPnNoYXJlZC5mYlNpemUgLyAoMTAyNCoxMDI0KSkgKyA0OwotCi0gICBpZiAoSVNfSTg1WChwSTgzMCkgfHwgSVNfSTg2NUcocEk4MzApIHx8IElTX0k5WFgocEk4MzApKSB7Ci0gICAgICBzd2l0Y2ggKGdtY2hfY3RybCAmIEk4MzBfR01DSF9HTVNfTUFTSykgewotICAgICAgY2FzZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xTToKLQkgbWVtc2l6ZSA9IE1CKDEpIC0gS0IocmFuZ2UpOwotCSBicmVhazsKLSAgICAgIGNhc2UgSTg1NV9HTUNIX0dNU19TVE9MRU5fNE06Ci0JIG1lbXNpemUgPSBNQig0KSAtIEtCKHJhbmdlKTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEk4NTVfR01DSF9HTVNfU1RPTEVOXzhNOgotCSBtZW1zaXplID0gTUIoOCkgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8xNk06Ci0JIG1lbXNpemUgPSBNQigxNikgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJODU1X0dNQ0hfR01TX1NUT0xFTl8zMk06Ci0JIG1lbXNpemUgPSBNQigzMikgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJOTE1R19HTUNIX0dNU19TVE9MRU5fNDhNOgotCSBpZiAoSVNfSTlYWChwSTgzMCkpCi0JICAgIG1lbXNpemUgPSBNQig0OCkgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJOTE1R19HTUNIX0dNU19TVE9MRU5fNjRNOgotCSBpZiAoSVNfSTlYWChwSTgzMCkpCi0JICAgIG1lbXNpemUgPSBNQig2NCkgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgfQotICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAoZ21jaF9jdHJsICYgSTgzMF9HTUNIX0dNU19NQVNLKSB7Ci0gICAgICBjYXNlIEk4MzBfR01DSF9HTVNfU1RPTEVOXzUxMjoKLQkgbWVtc2l6ZSA9IEtCKDUxMikgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl8xMDI0OgotCSBtZW1zaXplID0gTUIoMSkgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJODMwX0dNQ0hfR01TX1NUT0xFTl84MTkyOgotCSBtZW1zaXplID0gTUIoOCkgLSBLQihyYW5nZSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBJODMwX0dNQ0hfR01TX0xPQ0FMOgotCSBtZW1zaXplID0gMDsKLQkgeGY4NkRydk1zZyhwU2Nybi0+c2NybkluZGV4LCBYX1dBUk5JTkcsCi0JCSAgICAiTG9jYWwgbWVtb3J5IGZvdW5kLCBidXQgd29uJ3QgYmUgdXNlZC5cbiIpOwotCSBicmVhazsKLSAgICAgIH0KLSAgIH0KLSAgIGlmIChtZW1zaXplID4gMCkgewotICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJkZXRlY3RlZCAlZCBrQiBzdG9sZW4gbWVtb3J5LlxuIiwgbWVtc2l6ZSAvIDEwMjQpOwotICAgfSBlbHNlIHsKLSAgICAgZnByaW50ZihzdGRlcnIsCi0JCSAibm8gdmlkZW8gbWVtb3J5IGRldGVjdGVkLlxuIik7Ci0gICB9Ci0gICByZXR1cm4gbWVtc2l6ZTsKLX0KLQotc3RhdGljIGludCBBZ3BJbml0KGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqaW5mbykKLXsKLSAgdW5zaWduZWQgbG9uZyBtb2RlID0gMHg0OwotCi0gIGlmIChkcm1BZ3BBY3F1aXJlKGN0eC0+ZHJtRkQpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiW2dhcnRdIEFHUCBub3QgYXZhaWxhYmxlXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgaWYgKGRybUFncEVuYWJsZShjdHgtPmRybUZELCBtb2RlKSA8IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIltnYXJ0XSBBR1Agbm90IGVuYWJsZWRcbiIpOwotICAgIGRybUFncFJlbGVhc2UoY3R4LT5kcm1GRCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZWxzZQotICAgIGZwcmludGYoc3RkZXJyLCAiW2dhcnRdIEFHUCBlbmFibGVkIGF0ICVkeFxuIiwgY3R4LT5hZ3Btb2RlKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBnaXZlbiBwb29sLiAgR3JvdyB0aGUgcG9vbCBpZiBuZWVkZWQgYW5kIGlmCi0gKiBwb3NzaWJsZS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLUFsbG9jRnJvbVBvb2woY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCwgCi0JICAgICAgSTgzME1lbVJhbmdlICpyZXN1bHQsIEk4MzBNZW1Qb29sICpwb29sLAotCSAgICAgIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQsIGludCBmbGFncykKLXsKLSAgIGxvbmcgbmVlZGVkLCBzdGFydCwgZW5kOwotCi0gICBpZiAoIXJlc3VsdCB8fCAhcG9vbCB8fCAhc2l6ZSkKLSAgICAgIHJldHVybiAwOwotCi0gICAvKiBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2UgaXMgbmVlZGVkLiAqLwotICAgaWYgKGFsaWdubWVudCA8PSBHVFRfUEFHRV9TSVpFKQotICAgICAgbmVlZGVkID0gc2l6ZTsKLSAgIGVsc2UgewotCSBzdGFydCA9IFJPVU5EX1RPKHBvb2wtPkZyZWUuU3RhcnQsIGFsaWdubWVudCk7Ci0JIGVuZCA9IFJPVU5EX1RPKHN0YXJ0ICsgc2l6ZSwgYWxpZ25tZW50KTsKLQkgbmVlZGVkID0gZW5kIC0gcG9vbC0+RnJlZS5TdGFydDsKLSAgIH0KLSAgIGlmIChuZWVkZWQgPiBwb29sLT5GcmVlLlNpemUpIHsKLSAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIHJlc3VsdC0+U3RhcnQgPSBST1VORF9UTyhwb29sLT5GcmVlLlN0YXJ0LCBhbGlnbm1lbnQpOwotICAgcG9vbC0+RnJlZS5TdGFydCArPSBuZWVkZWQ7Ci0gICByZXN1bHQtPkVuZCA9IHBvb2wtPkZyZWUuU3RhcnQ7Ci0KLSAgIHBvb2wtPkZyZWUuU2l6ZSA9IHBvb2wtPkZyZWUuRW5kIC0gcG9vbC0+RnJlZS5TdGFydDsKLSAgIHJlc3VsdC0+U2l6ZSA9IHJlc3VsdC0+RW5kIC0gcmVzdWx0LT5TdGFydDsKLSAgIHJlc3VsdC0+UG9vbCA9IHBvb2w7Ci0gICByZXN1bHQtPkFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgIHJldHVybiBuZWVkZWQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIEFsbG9jRnJvbUFHUChjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ25tZW50LCBJODMwTWVtUmFuZ2UgICpyZXN1bHQpCi17Ci0gICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0gICB1bnNpZ25lZCBsb25nIG5ld0FwU3RhcnQsIG5ld0FwRW5kOwotICAgaW50IHJldDsKLSAgIGlmICghcmVzdWx0IHx8ICFzaXplKQotICAgICAgcmV0dXJuIDA7Ci0gICAKLSAgIGlmICghYWxpZ25tZW50KQotICAgICBhbGlnbm1lbnQgPSA0OwotCi0gICBzdGFydCA9IFJPVU5EX1RPKHBJODMwLT5NZW1vcnlBcGVydHVyZS5TdGFydCwgYWxpZ25tZW50KTsKLSAgIGVuZCA9IFJPVU5EX1RPKHN0YXJ0ICsgc2l6ZSwgYWxpZ25tZW50KTsKLSAgIG5ld0FwU3RhcnQgPSBlbmQ7Ci0gICBuZXdBcEVuZCA9IHBJODMwLT5NZW1vcnlBcGVydHVyZS5FbmQ7Ci0KLSAgIHJldD1kcm1BZ3BBbGxvYyhjdHgtPmRybUZELCBzaXplLCAwLCAmKHJlc3VsdC0+UGh5c2ljYWwpLCAoZHJtX2hhbmRsZV90ICopJihyZXN1bHQtPktleSkpOwotICAgCi0gICBpZiAocmV0KQotICAgewotICAgICBmcHJpbnRmKHN0ZGVyciwiZHJtQWdwQWxsb2MgZmFpbGVkICVkXG4iLCByZXQpOwotICAgICByZXR1cm4gMDsKLSAgIH0KLSAgIHBJODMwLT5hbGxvY2F0ZWRNZW1vcnkgKz0gc2l6ZTsKLSAgIHBJODMwLT5NZW1vcnlBcGVydHVyZS5TdGFydCA9IG5ld0FwU3RhcnQ7Ci0gICBwSTgzMC0+TWVtb3J5QXBlcnR1cmUuRW5kID0gbmV3QXBFbmQ7Ci0gICBwSTgzMC0+TWVtb3J5QXBlcnR1cmUuU2l6ZSA9IG5ld0FwRW5kIC0gbmV3QXBTdGFydDsKLSAgIC8vICAgcEk4MzAtPkZyZWVNZW1vcnkgLT0gc2l6ZTsKLSAgIHJlc3VsdC0+U3RhcnQgPSBzdGFydDsKLSAgIHJlc3VsdC0+RW5kID0gc3RhcnQgKyBzaXplOwotICAgcmVzdWx0LT5TaXplID0gc2l6ZTsKLSAgIHJlc3VsdC0+T2Zmc2V0ID0gc3RhcnQ7Ci0gICByZXN1bHQtPkFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgIHJlc3VsdC0+UG9vbCA9IE5VTEw7Ci0gIAotICAgcmV0dXJuIHNpemU7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLUk4MzBBbGxvY1ZpZE1lbShjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBJODMwTWVtUmFuZ2UgKnJlc3VsdCwgSTgzME1lbVBvb2wgKnBvb2wsIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQsIGludCBmbGFncykKLXsKLSAgaW50IHJldDsKLQotICBpZiAoIXJlc3VsdCkKLSAgICByZXR1cm4gMDsKLQotICAgLyogTWFrZSBzdXJlIHRoZXNlIGFyZSBpbml0aWFsaXNlZC4gKi8KLSAgIHJlc3VsdC0+U2l6ZSA9IDA7Ci0gICByZXN1bHQtPktleSA9IC0xOwotCi0gICBpZiAoIXNpemUpIHsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBpZiAocG9vbC0+RnJlZS5TaXplIDwgc2l6ZSkKLSAgICAgcmV0dXJuIEFsbG9jRnJvbUFHUChjdHgsIHBJODMwLCBzaXplLCBhbGlnbm1lbnQsIHJlc3VsdCk7Ci0gICBlbHNlCi0gICB7Ci0gICAgIHJldCA9IEFsbG9jRnJvbVBvb2woY3R4LCBwSTgzMCwgcmVzdWx0LCBwb29sLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKTsKLQotICAgICBpZiAocmV0PT0wKQotICAgICAgIHJldHVybiBBbGxvY0Zyb21BR1AoY3R4LCBwSTgzMCwgc2l6ZSwgYWxpZ25tZW50LCByZXN1bHQpOwotICAgICByZXR1cm4gcmV0OwotICAgfQotfQotCi1zdGF0aWMgQm9vbCBCaW5kQWdwUmFuZ2UoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwTWVtUmFuZ2UgKm1lbSkKLXsKLSAgaWYgKCFtZW0pCi0gICAgcmV0dXJuIEZBTFNFOwotICAKLSAgaWYgKG1lbS0+S2V5ID09IC0xKQotICAgIHJldHVybiBUUlVFOwotCi0gIHJldHVybiAhZHJtQWdwQmluZChjdHgtPmRybUZELCBtZW0tPktleSwgbWVtLT5PZmZzZXQpOwotfQotCi0vKiBzaW1wbGUgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbmVlZGVkICovCi0vKiBwdXQgcmluZyBidWZmZXIgaW4gbG93IG1lbW9yeSAqLwotLyogbmVlZCB0byBhbGxvY2F0ZSBmcm9udCwgYmFjaywgZGVwdGggYnVmZmVycyBhbGlnbmVkIGNvcnJlY3RseSwKLSAgIGFsbG9jYXRlIHJpbmcgYnVmZmVyLCAKLSovCi0KLS8qICovCi1zdGF0aWMgQm9vbAotSTgzMEFsbG9jYXRlTWVtb3J5KGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzApCi17Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcmV0OwotICB1bnNpZ25lZCBsb25nIGxpbmVzLCBsaW5lU2l6ZSwgYWxpZ247Ci0KLSAgLyogYWxsb2NhdGUgcmluZyBidWZmZXIgKi8KLSAgbWVtc2V0KHBJODMwLT5McFJpbmcsIDAsIHNpemVvZihJODMwUmluZ0J1ZmZlcikpOwotICBwSTgzMC0+THBSaW5nLT5tZW0uS2V5ID0gLTE7Ci0KLSAgc2l6ZSA9IFBSSU1BUllfUklOR0JVRkZFUl9TSVpFOwotICAKLSAgcmV0ID0gSTgzMEFsbG9jVmlkTWVtKGN0eCwgcEk4MzAsICZwSTgzMC0+THBSaW5nLT5tZW0sICZwSTgzMC0+U3RvbGVuUG9vbCwgc2l6ZSwgMHgxMDAwLCAwKTsKLSAgCi0gIGlmIChyZXQgIT0gc2l6ZSkKLSAgewotICAgIGZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gYWxsb2NhdGUgcmluZyBidWZmZXIgJWxkXG4iLCByZXQpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHBJODMwLT5McFJpbmctPnRhaWxfbWFzayA9IHBJODMwLT5McFJpbmctPm1lbS5TaXplIC0gMTsKLQotICAKLSAgLyogYWxsb2NhdGUgZnJvbnQgYnVmZmVyICovCi0gIG1lbXNldCgmKHBJODMwLT5Gcm9udEJ1ZmZlciksIDAsIHNpemVvZihwSTgzMC0+RnJvbnRCdWZmZXIpKTsKLSAgcEk4MzAtPkZyb250QnVmZmVyLktleSA9IC0xOwotICBwSTgzMC0+RnJvbnRCdWZmZXIuUGl0Y2ggPSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGg7Ci0KLSAgYWxpZ24gPSBLQig1MTIpOyAgCi0KLSAgbGluZVNpemUgPSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGggKiBjdHgtPmNwcDsKLSAgbGluZXMgPSAoY3R4LT5zaGFyZWQudmlydHVhbEhlaWdodCArIDE1KSAvIDE2ICogMTY7Ci0gIHNpemUgPSBsaW5lU2l6ZSAqIGxpbmVzOwotICBzaXplID0gUk9VTkRfVE9fUEFHRShzaXplKTsKLQotICBhbGlnbiA9IEdldEJlc3RUaWxlQWxpZ25tZW50KHNpemUpOwotCi0gIHJldCA9IEk4MzBBbGxvY1ZpZE1lbShjdHgsIHBJODMwLCAmcEk4MzAtPkZyb250QnVmZmVyLCAmcEk4MzAtPlN0b2xlblBvb2wsIHNpemUsIGFsaWduLCAwKTsKLSAgaWYgKHJldCA8IHNpemUpCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwidW5hYmxlIHRvIGFsbG9jYXRlIGZyb250IGJ1ZmZlciAlbGRcbiIsIHJldCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgbWVtc2V0KCYocEk4MzAtPkJhY2tCdWZmZXIpLCAwLCBzaXplb2YocEk4MzAtPkJhY2tCdWZmZXIpKTsKLSAgcEk4MzAtPkJhY2tCdWZmZXIuS2V5ID0gLTE7Ci0gIHBJODMwLT5CYWNrQnVmZmVyLlBpdGNoID0gY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoOwotCi0gIHJldCA9IEk4MzBBbGxvY1ZpZE1lbShjdHgsIHBJODMwLCAmcEk4MzAtPkJhY2tCdWZmZXIsICZwSTgzMC0+U3RvbGVuUG9vbCwgc2l6ZSwgYWxpZ24sIDApOwotICBpZiAocmV0IDwgc2l6ZSkKLSAgewotICAgIGZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gYWxsb2NhdGUgYmFjayBidWZmZXIgJWxkXG4iLCByZXQpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICAKLSAgbWVtc2V0KCYocEk4MzAtPkRlcHRoQnVmZmVyKSwgMCwgc2l6ZW9mKHBJODMwLT5EZXB0aEJ1ZmZlcikpOwotICBwSTgzMC0+RGVwdGhCdWZmZXIuS2V5ID0gLTE7Ci0gIHBJODMwLT5EZXB0aEJ1ZmZlci5QaXRjaCA9IGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aDsKLQotICByZXQgPSBJODMwQWxsb2NWaWRNZW0oY3R4LCBwSTgzMCwgJnBJODMwLT5EZXB0aEJ1ZmZlciwgJnBJODMwLT5TdG9sZW5Qb29sLCBzaXplLCBhbGlnbiwgMCk7Ci0gIGlmIChyZXQgPCBzaXplKQotICB7Ci0gICAgZnByaW50ZihzdGRlcnIsInVuYWJsZSB0byBhbGxvY2F0ZSBkZXB0aCBidWZmZXIgJWxkXG4iLCByZXQpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIG1lbXNldCgmKHBJODMwLT5Db250ZXh0TWVtKSwgMCwgc2l6ZW9mKHBJODMwLT5Db250ZXh0TWVtKSk7Ci0gIHBJODMwLT5Db250ZXh0TWVtLktleSA9IC0xOwotICBzaXplID0gS0IoMzIpOwotCi0gIHJldCA9IEk4MzBBbGxvY1ZpZE1lbShjdHgsIHBJODMwLCAmcEk4MzAtPkNvbnRleHRNZW0sICZwSTgzMC0+U3RvbGVuUG9vbCwgc2l6ZSwgYWxpZ24sIDApOwotICBpZiAocmV0IDwgc2l6ZSkKLSAgewotICAgIGZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCBidWZmZXIgJWxkXG4iLCByZXQpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICAKLSAgbWVtc2V0KCYocEk4MzAtPlRleE1lbSksIDAsIHNpemVvZihwSTgzMC0+VGV4TWVtKSk7Ci0gIHBJODMwLT5UZXhNZW0uS2V5ID0gLTE7Ci0KLSAgc2l6ZSA9IDMyNzY4ICogMTAyNDsKLSAgcmV0ID0gQWxsb2NGcm9tQUdQKGN0eCwgcEk4MzAsIHNpemUsIGFsaWduLCAmcEk4MzAtPlRleE1lbSk7Ci0gIGlmIChyZXQgPCBzaXplKQotICB7Ci0gICAgZnByaW50ZihzdGRlcnIsInVuYWJsZSB0byBhbGxvY2F0ZSB0ZXh0dXJlIG1lbW9yeSAlbGRcbiIsIHJldCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBCb29sCi1JODMwQmluZE1lbW9yeShjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwKQotewotICBpZiAoIUJpbmRBZ3BSYW5nZShjdHgsICZwSTgzMC0+THBSaW5nLT5tZW0pKQotICAgIHJldHVybiBGQUxTRTsKLSAgaWYgKCFCaW5kQWdwUmFuZ2UoY3R4LCAmcEk4MzAtPkZyb250QnVmZmVyKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIGlmICghQmluZEFncFJhbmdlKGN0eCwgJnBJODMwLT5CYWNrQnVmZmVyKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIGlmICghQmluZEFncFJhbmdlKGN0eCwgJnBJODMwLT5EZXB0aEJ1ZmZlcikpCi0gICAgcmV0dXJuIEZBTFNFOwotICBpZiAoIUJpbmRBZ3BSYW5nZShjdHgsICZwSTgzMC0+Q29udGV4dE1lbSkpCi0gICAgcmV0dXJuIEZBTFNFOwotICBpZiAoIUJpbmRBZ3BSYW5nZShjdHgsICZwSTgzMC0+VGV4TWVtKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBCb29sCi1JODMwQ2xlYW51cERtYShjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgpCi17Ci0gICBkcm1JODMwSW5pdCBpbmZvOwotCi0gICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihkcm1JODMwSW5pdCkpOwotICAgaW5mby5mdW5jID0gSTgzMF9DTEVBTlVQX0RNQTsKLQotICAgaWYgKGRybUNvbW1hbmRXcml0ZShjdHgtPmRybUZELCBEUk1fSTgzMF9JTklULAotCQkgICAgICAgJmluZm8sIHNpemVvZihkcm1JODMwSW5pdCkpKSB7Ci0gICAgIGZwcmludGYoc3RkZXJyLCAiSTgzMCBEbWEgQ2xlYW51cCBGYWlsZWRcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgfQotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJvb2wKLUk4MzBJbml0RG1hKGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzApCi17Ci0gICBJODMwUmluZ0J1ZmZlciAqcmluZyA9IHBJODMwLT5McFJpbmc7Ci0gICBkcm1JODMwSW5pdCBpbmZvOwotCi0gICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihkcm1JODMwSW5pdCkpOwotICAgaW5mby5mdW5jID0gSTgzMF9JTklUX0RNQTsKLQotICAgaW5mby5yaW5nX3N0YXJ0ID0gcmluZy0+bWVtLlN0YXJ0ICsgcEk4MzAtPkxpbmVhckFkZHI7Ci0gICBpbmZvLnJpbmdfZW5kID0gcmluZy0+bWVtLkVuZCArIHBJODMwLT5MaW5lYXJBZGRyOwotICAgaW5mby5yaW5nX3NpemUgPSByaW5nLT5tZW0uU2l6ZTsKLQotICAgaW5mby5tbWlvX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpY3R4LT5NTUlPU3RhcnQ7Ci0KLSAgIGluZm8uc2FyZWFfcHJpdl9vZmZzZXQgPSBzaXplb2YoZHJtX3NhcmVhX3QpOwotCi0gICBpbmZvLmZyb250X29mZnNldCA9IHBJODMwLT5Gcm9udEJ1ZmZlci5TdGFydDsKLSAgIGluZm8uYmFja19vZmZzZXQgPSBwSTgzMC0+QmFja0J1ZmZlci5TdGFydDsKLSAgIGluZm8uZGVwdGhfb2Zmc2V0ID0gcEk4MzAtPkRlcHRoQnVmZmVyLlN0YXJ0OwotICAgaW5mby53ID0gY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoOwotICAgaW5mby5oID0gY3R4LT5zaGFyZWQudmlydHVhbEhlaWdodDsKLSAgIGluZm8ucGl0Y2ggPSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGg7Ci0gICBpbmZvLmJhY2tfcGl0Y2ggPSBwSTgzMC0+QmFja0J1ZmZlci5QaXRjaDsKLSAgIGluZm8uZGVwdGhfcGl0Y2ggPSBwSTgzMC0+RGVwdGhCdWZmZXIuUGl0Y2g7Ci0gICBpbmZvLmNwcCA9IGN0eC0+Y3BwOwotCi0gICBpZiAoZHJtQ29tbWFuZFdyaXRlKGN0eC0+ZHJtRkQsIERSTV9JODMwX0lOSVQsCi0JCSAgICAgICAmaW5mbywgc2l6ZW9mKGRybUk4MzBJbml0KSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotCQkgIkk4MzAgRG1hIEluaXRpYWxpemF0aW9uIEZhaWxlZFxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICB9Ci0KLSAgIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgaW50IEk4MzBDaGVja0RSTVZlcnNpb24oIGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwKLQkJCQkgIEk4MzBSZWMgKnBJODMwICkKLXsKLSAgIGRybVZlcnNpb25QdHIgIHZlcnNpb247Ci0KLSAgIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGN0eC0+ZHJtRkQpOwotCi0gICBpZiAodmVyc2lvbikgewotICAgICBpbnQgcmVxX21pbm9yLCByZXFfcGF0Y2g7Ci0KLSAgICAgcmVxX21pbm9yID0gNDsKLSAgICAgcmVxX3BhdGNoID0gMDsJCi0KLSAgICAgaWYgKHZlcnNpb24tPnZlcnNpb25fbWFqb3IgIT0gMSB8fAotCSB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yIDwgcmVxX21pbm9yIHx8Ci0JICh2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID09IHJlcV9taW5vciAmJiAKLQkgIHZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA8IHJlcV9wYXRjaCkpIHsKLSAgICAgICAvKiBJbmNvbXBhdGlibGUgZHJtIHZlcnNpb24gKi8KLSAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICAgIltkcmldIEk4MzBEUklTY3JlZW5Jbml0IGZhaWxlZCBiZWNhdXNlIG9mIGEgdmVyc2lvbiAiCi0JICAgICAgICJtaXNtYXRjaC5cbiIKLQkgICAgICAgIltkcmldIGk5MTUubyBrZXJuZWwgbW9kdWxlIHZlcnNpb24gaXMgJWQuJWQuJWQgIgotCSAgICAgICAiYnV0IHZlcnNpb24gMS4lZC4lZCBvciBuZXdlciBpcyBuZWVkZWQuXG4iCi0JICAgICAgICJbZHJpXSBEaXNhYmxpbmcgRFJJLlxuIiwKLQkgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9tYWpvciwKLQkgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9taW5vciwKLQkgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsLAotCSAgICAgICByZXFfbWlub3IsCi0JICAgICAgIHJlcV9wYXRjaCk7Ci0gICAgICAgZHJtRnJlZVZlcnNpb24odmVyc2lvbik7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgIH0KLSAgICAgCi0gICAgIHBJODMwLT5kcm1NaW5vciA9IHZlcnNpb24tPnZlcnNpb25fbWlub3I7Ci0gICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOwotICAgfQotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1JODMwU2V0UmluZ1JlZ3MoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCkKLXsKLSAgdW5zaWduZWQgaW50IGl0ZW1wOwotICB1bnNpZ25lZCBjaGFyICpNTUlPID0gY3R4LT5NTUlPQWRkcmVzczsKLQotICAgT1VUUkVHKExQX1JJTkcgKyBSSU5HX0xFTiwgMCk7Ci0gICBPVVRSRUcoTFBfUklORyArIFJJTkdfVEFJTCwgMCk7Ci0gICBPVVRSRUcoTFBfUklORyArIFJJTkdfSEVBRCwgMCk7Ci0KLSAgIGlmICgobG9uZykocEk4MzAtPkxwUmluZy0+bWVtLlN0YXJ0ICYgSTgzMF9SSU5HX1NUQVJUX01BU0spICE9Ci0gICAgICAgcEk4MzAtPkxwUmluZy0+bWVtLlN0YXJ0KSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICJJODMwU2V0UmluZ1JlZ3M6IFJpbmcgYnVmZmVyIHN0YXJ0ICglbHgpIHZpb2xhdGVzIGl0cyAiCi0JCSAibWFzayAoJXgpXG4iLCBwSTgzMC0+THBSaW5nLT5tZW0uU3RhcnQsIEk4MzBfUklOR19TVEFSVF9NQVNLKTsKLSAgIH0KLSAgIC8qIERvbid0IGNhcmUgYWJvdXQgdGhlIG9sZCB2YWx1ZS4gIFJlc2VydmVkIGJpdHMgbXVzdCBiZSB6ZXJvIGFueXdheS4gKi8KLSAgIGl0ZW1wID0gcEk4MzAtPkxwUmluZy0+bWVtLlN0YXJ0ICYgSTgzMF9SSU5HX1NUQVJUX01BU0s7Ci0gICBPVVRSRUcoTFBfUklORyArIFJJTkdfU1RBUlQsIGl0ZW1wKTsKLQotICAgaWYgKCgocEk4MzAtPkxwUmluZy0+bWVtLlNpemUgLSA0MDk2KSAmIEk4MzBfUklOR19OUl9QQUdFUykgIT0KLSAgICAgICBwSTgzMC0+THBSaW5nLT5tZW0uU2l6ZSAtIDQwOTYpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotCQkgIkk4MzBTZXRSaW5nUmVnczogUmluZyBidWZmZXIgc2l6ZSAtIDQwOTYgKCVseCkgdmlvbGF0ZXMgaXRzICIKLQkJICJtYXNrICgleClcbiIsIHBJODMwLT5McFJpbmctPm1lbS5TaXplIC0gNDA5NiwKLQkJIEk4MzBfUklOR19OUl9QQUdFUyk7Ci0gICB9Ci0gICAvKiBEb24ndCBjYXJlIGFib3V0IHRoZSBvbGQgdmFsdWUuICBSZXNlcnZlZCBiaXRzIG11c3QgYmUgemVybyBhbnl3YXkuICovCi0gICBpdGVtcCA9IChwSTgzMC0+THBSaW5nLT5tZW0uU2l6ZSAtIDQwOTYpICYgSTgzMF9SSU5HX05SX1BBR0VTOwotICAgaXRlbXAgfD0gKFJJTkdfTk9fUkVQT1JUIHwgUklOR19WQUxJRCk7Ci0gICBPVVRSRUcoTFBfUklORyArIFJJTkdfTEVOLCBpdGVtcCk7Ci0KLSAgIHBJODMwLT5McFJpbmctPmhlYWQgPSBJTlJFRyhMUF9SSU5HICsgUklOR19IRUFEKSAmIEk4MzBfSEVBRF9NQVNLOwotICAgcEk4MzAtPkxwUmluZy0+dGFpbCA9IElOUkVHKExQX1JJTkcgKyBSSU5HX1RBSUwpOwotICAgcEk4MzAtPkxwUmluZy0+c3BhY2UgPSBwSTgzMC0+THBSaW5nLT5oZWFkIC0gKHBJODMwLT5McFJpbmctPnRhaWwgKyA4KTsKLSAgIGlmIChwSTgzMC0+THBSaW5nLT5zcGFjZSA8IDApCi0gICAgICBwSTgzMC0+THBSaW5nLT5zcGFjZSArPSBwSTgzMC0+THBSaW5nLT5tZW0uU2l6ZTsKLQotICAgU2V0RmVuY2VSZWdzKGN0eCwgcEk4MzApOwotICAgCi0gICAvKiBSRVNFVCBUSEUgRElTUExBWSBQSVBFIFRPIFBPSU5UIFRPIFRIRSBGUk9OVEJVRkZFUiAtIGhhY2t5Ci0gICAgICBoYWNreSBoYWNreSAqLwotICAgT1VUUkVHKERTUEFCQVNFLCBwSTgzMC0+RnJvbnRCdWZmZXIuU3RhcnQgKyBwSTgzMC0+TGluZWFyQWRkcik7Ci0KLX0KLQotc3RhdGljIEJvb2wKLUk4MzBTZXRQYXJhbShjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIGludCBwYXJhbSwgaW50IHZhbHVlKQotewotICAgZHJtSTgzMFNldFBhcmFtIHNwOwotCi0gICBtZW1zZXQoJnNwLCAwLCBzaXplb2Yoc3ApKTsKLSAgIHNwLnBhcmFtID0gcGFyYW07Ci0gICBzcC52YWx1ZSA9IHZhbHVlOwotCi0gICBpZiAoZHJtQ29tbWFuZFdyaXRlKGN0eC0+ZHJtRkQsIERSTV9JODMwX1NFVFBBUkFNLCAmc3AsIHNpemVvZihzcCkpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkk4MzAgU2V0UGFyYW0gRmFpbGVkXG4iKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgIH0KLQotICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBCb29sCi1JODMwRFJJTWFwU2NyZWVuUmVnaW9ucyhEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBkcm1JODMwU2FyZWEgKnNhcmVhKQotewotICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICJbZHJtXSBNYXBwaW5nIGZyb250IGJ1ZmZlclxuIik7Ci0KLSAgIGlmIChkcm1BZGRNYXAoY3R4LT5kcm1GRCwKLSAgICAgICAgICAgICAgICAgKGRybV9oYW5kbGVfdCkoc2FyZWEtPmZyb250X29mZnNldCArIHBJODMwLT5MaW5lYXJBZGRyKSwKLSAgICAgICAgICAgICAgICAgc2FyZWEtPmZyb250X3NpemUsCi0gICAgICAgICAgICAgICAgIERSTV9GUkFNRV9CVUZGRVIsICAvKkRSTV9BR1AsKi8KLSAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgJnNhcmVhLT5mcm9udF9oYW5kbGUpIDwgMCkgewotICAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgICJbZHJtXSBkcm1BZGRNYXAoZnJvbnRfaGFuZGxlKSBmYWlsZWQuIERpc2FibGluZyBEUklcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgfQotICAgY3R4LT5zaGFyZWQuaEZyYW1lQnVmZmVyID0gc2FyZWEtPmZyb250X2hhbmRsZTsKLSAgIGN0eC0+c2hhcmVkLmZiU2l6ZSA9IHNhcmVhLT5mcm9udF9zaXplOwotICAgZnByaW50ZihzdGRlcnIsICJbZHJtXSBGcm9udCBCdWZmZXIgPSAweCUwOHhcbiIsCi0JICAgc2FyZWEtPmZyb250X2hhbmRsZSk7Ci0KLSAgIGlmIChkcm1BZGRNYXAoY3R4LT5kcm1GRCwKLSAgICAgICAgICAgICAgICAgKGRybV9oYW5kbGVfdCkoc2FyZWEtPmJhY2tfb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgc2FyZWEtPmJhY2tfc2l6ZSwgRFJNX0FHUCwgMCwKLSAgICAgICAgICAgICAgICAgJnNhcmVhLT5iYWNrX2hhbmRsZSkgPCAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgIltkcm1dIGRybUFkZE1hcChiYWNrX2hhbmRsZSkgZmFpbGVkLiBEaXNhYmxpbmcgRFJJXG4iKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgIH0KLSAgIGZwcmludGYoc3RkZXJyLCAiW2RybV0gQmFjayBCdWZmZXIgPSAweCUwOHhcbiIsCi0gICAgICAgICAgICAgIHNhcmVhLT5iYWNrX2hhbmRsZSk7Ci0KLSAgIGlmIChkcm1BZGRNYXAoY3R4LT5kcm1GRCwKLSAgICAgICAgICAgICAgICAgKGRybV9oYW5kbGVfdClzYXJlYS0+ZGVwdGhfb2Zmc2V0LAotICAgICAgICAgICAgICAgICBzYXJlYS0+ZGVwdGhfc2l6ZSwgRFJNX0FHUCwgMCwKLSAgICAgICAgICAgICAgICAgJnNhcmVhLT5kZXB0aF9oYW5kbGUpIDwgMCkgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICJbZHJtXSBkcm1BZGRNYXAoZGVwdGhfaGFuZGxlKSBmYWlsZWQuIERpc2FibGluZyBEUklcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgfQotICAgZnByaW50ZihzdGRlcnIsICJbZHJtXSBEZXB0aCBCdWZmZXIgPSAweCUwOHhcbiIsCi0gICAgICAgICAgICAgIHNhcmVhLT5kZXB0aF9oYW5kbGUpOwotCi0gICBpZiAoZHJtQWRkTWFwKGN0eC0+ZHJtRkQsCi0JCSAoZHJtX2hhbmRsZV90KXNhcmVhLT50ZXhfb2Zmc2V0LAotCQkgc2FyZWEtPnRleF9zaXplLCBEUk1fQUdQLCAwLAotCQkgJnNhcmVhLT50ZXhfaGFuZGxlKSA8IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotCQkgIltkcm1dIGRybUFkZE1hcCh0ZXhfaGFuZGxlKSBmYWlsZWQuIERpc2FibGluZyBEUklcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgfQotICAgZnByaW50ZihzdGRlcnIsICJbZHJtXSB0ZXh0dXJlcyA9IDB4JTA4eFxuIiwKLQkgICAgICBzYXJlYS0+dGV4X2hhbmRsZSk7Ci0KLSAgIHJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYyB2b2lkCi1JODMwRFJJVW5tYXBTY3JlZW5SZWdpb25zKGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzAsIGRybUk4MzBTYXJlYSAqc2FyZWEpCi17Ci0jaWYgMQotICAgaWYgKHNhcmVhLT5mcm9udF9oYW5kbGUpIHsKLSAgICAgIGRybVJtTWFwKGN0eC0+ZHJtRkQsIHNhcmVhLT5mcm9udF9oYW5kbGUpOwotICAgICAgc2FyZWEtPmZyb250X2hhbmRsZSA9IDA7Ci0gICB9Ci0jZW5kaWYKLSAgIGlmIChzYXJlYS0+YmFja19oYW5kbGUpIHsKLSAgICAgIGRybVJtTWFwKGN0eC0+ZHJtRkQsIHNhcmVhLT5iYWNrX2hhbmRsZSk7Ci0gICAgICBzYXJlYS0+YmFja19oYW5kbGUgPSAwOwotICAgfQotICAgaWYgKHNhcmVhLT5kZXB0aF9oYW5kbGUpIHsKLSAgICAgIGRybVJtTWFwKGN0eC0+ZHJtRkQsIHNhcmVhLT5kZXB0aF9oYW5kbGUpOwotICAgICAgc2FyZWEtPmRlcHRoX2hhbmRsZSA9IDA7Ci0gICB9Ci0gICBpZiAoc2FyZWEtPnRleF9oYW5kbGUpIHsKLSAgICAgIGRybVJtTWFwKGN0eC0+ZHJtRkQsIHNhcmVhLT50ZXhfaGFuZGxlKTsKLSAgICAgIHNhcmVhLT50ZXhfaGFuZGxlID0gMDsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLUk4MzBJbml0VGV4dHVyZUhlYXAoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCwgZHJtSTgzMFNhcmVhICpzYXJlYSkKLXsKLSAgIC8qIFN0YXJ0IHVwIHRoZSBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgZm9yIGFncCBzcGFjZSAqLwotICAgZHJtSTgzME1lbUluaXRIZWFwIGRybUhlYXA7Ci0gICBkcm1IZWFwLnJlZ2lvbiA9IEk4MzBfTUVNX1JFR0lPTl9BR1A7Ci0gICBkcm1IZWFwLnN0YXJ0ICA9IDA7Ci0gICBkcm1IZWFwLnNpemUgICA9IHNhcmVhLT50ZXhfc2l6ZTsKLSAgICAgIAotICAgaWYgKGRybUNvbW1hbmRXcml0ZShjdHgtPmRybUZELCBEUk1fSTgzMF9JTklUX0hFQVAsCi0JCQkgICZkcm1IZWFwLCBzaXplb2YoZHJtSGVhcCkpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJbZHJtXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZWQgYWdwIGhlYXAgbWFuYWdlclxuIik7Ci0gICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0JCSAgICAiW2RybV0gSW5pdGlhbGl6ZWQga2VybmVsIGFncCBoZWFwIG1hbmFnZXIsICVkXG4iLAotCQkgICAgc2FyZWEtPnRleF9zaXplKTsKLQotICAgICAgSTgzMFNldFBhcmFtKGN0eCwgSTgzMF9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWSwgCi0JCSAgICAgIHNhcmVhLT5sb2dfdGV4X2dyYW51bGFyaXR5KTsKLSAgIH0KLX0KLQotc3RhdGljIEJvb2wKLUk4MzBEUklEb01hcHBpbmdzKERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzAsIGRybUk4MzBTYXJlYSAqc2FyZWEpCi17Ci0gIGlmIChkcm1BZGRNYXAoY3R4LT5kcm1GRCwKLQkJKGRybV9oYW5kbGVfdClwSTgzMC0+THBSaW5nLT5tZW0uU3RhcnQsCi0JCXBJODMwLT5McFJpbmctPm1lbS5TaXplLCBEUk1fQUdQLCAwLAotCQkmcEk4MzAtPnJpbmdfbWFwKSA8IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwKLQkgICAgIltkcm1dIGRybUFkZE1hcChyaW5nX21hcCkgZmFpbGVkLiBEaXNhYmxpbmcgRFJJXG4iKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgZnByaW50ZihzdGRlcnIsICJbZHJtXSByaW5nIGJ1ZmZlciA9IDB4JTA4eFxuIiwKLQkgIHBJODMwLT5yaW5nX21hcCk7Ci0KLSAgaWYgKEk4MzBJbml0RG1hKGN0eCwgcEk4MzApID09IEZBTFNFKSB7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIAotICAgLyogaW5pdCB0byB6ZXJvIHRvIGJlIHNhZmUgKi8KLQotICBJODMwRFJJTWFwU2NyZWVuUmVnaW9ucyhjdHgsIHBJODMwLCBzYXJlYSk7Ci0gIEk4MzBJbml0VGV4dHVyZUhlYXAoY3R4LCBwSTgzMCwgc2FyZWEpOwotCi0gICBpZiAoY3R4LT5wY2lEZXZpY2UgIT0gUENJX0NISVBfODQ1X0cgJiYKLSAgICAgICBjdHgtPnBjaURldmljZSAhPSBQQ0lfQ0hJUF9JODMwX00pIHsKLSAgICAgIEk4MzBTZXRQYXJhbShjdHgsIEk4MzBfU0VUUEFSQU1fVVNFX01JX0JBVENIQlVGRkVSX1NUQVJULCAxICk7Ci0gICB9Ci0KLSAgIC8qIE9rYXkgbm93IGluaXRpYWxpemUgdGhlIGRtYSBlbmdpbmUgKi8KLSAgIHsKLSAgICAgIHBJODMwLT5pcnEgPSBkcm1HZXRJbnRlcnJ1cHRGcm9tQnVzSUQoY3R4LT5kcm1GRCwKLQkJCQkJICAgIGN0eC0+cGNpQnVzLAotCQkJCQkgICAgY3R4LT5wY2lEZXZpY2UsCi0JCQkJCSAgICBjdHgtPnBjaUZ1bmMpOwotCi0gICAgICBpZiAoZHJtQ3RsSW5zdEhhbmRsZXIoY3R4LT5kcm1GRCwgcEk4MzAtPmlycSkpIHsKLQkgZnByaW50ZihzdGRlcnIsCi0JCSAgICAiW2RybV0gZmFpbHVyZSBhZGRpbmcgaXJxIGhhbmRsZXJcbiIpOwotCSBwSTgzMC0+aXJxID0gMDsKLQkgcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgZWxzZQotCSBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJbZHJtXSBkbWEgY29udHJvbCBpbml0aWFsaXplZCwgdXNpbmcgSVJRICVkXG4iLAotCQkgICAgcEk4MzAtPmlycSk7Ci0gICB9Ci0KLSAgIGZwcmludGYoc3RkZXJyLCAiW2RyaV0gdmlzdWFsIGNvbmZpZ3MgaW5pdGlhbGl6ZWRcbiIpOwotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJvb2wKLUk4MzBDbGVhclNjcmVlbihEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBkcm1JODMwU2FyZWEgKnNhcmVhKQotewotICAvKiBuZWVkIHRvIGRybU1hcCBmcm9udCBhbmQgYmFjayBidWZmZXJzIGFuZCB6ZXJvIHRoZW0gKi8KLSAgZHJtQWRkcmVzcyBtYXBfYWRkcjsKLSAgaW50IHJldDsKLQotICByZXQgPSBkcm1NYXAoY3R4LT5kcm1GRCwKLQkgICAgICAgc2FyZWEtPmZyb250X2hhbmRsZSwKLQkgICAgICAgc2FyZWEtPmZyb250X3NpemUsCi0JICAgICAgICZtYXBfYWRkcik7Ci0KLSAgaWYgKHJldCkKLSAgewotICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG1hcCBmcm9udCBidWZmZXJcbiIpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGRyaW1lbXNldGlvKChjaGFyICopbWFwX2FkZHIsCi0JICAgICAgMCwKLQkgICAgICBzYXJlYS0+ZnJvbnRfc2l6ZSk7Ci0gIGRybVVubWFwKG1hcF9hZGRyLCBzYXJlYS0+ZnJvbnRfc2l6ZSk7Ci0KLQotICByZXQgPSBkcm1NYXAoY3R4LT5kcm1GRCwKLQkgICAgICAgc2FyZWEtPmJhY2tfaGFuZGxlLAotCSAgICAgICBzYXJlYS0+YmFja19zaXplLAotCSAgICAgICAmbWFwX2FkZHIpOwotCi0gIGlmIChyZXQpCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBtYXAgYmFjayBidWZmZXJcbiIpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGRyaW1lbXNldGlvKChjaGFyICopbWFwX2FkZHIsCi0JICAgICAgMCwKLQkgICAgICBzYXJlYS0+YmFja19zaXplKTsKLSAgZHJtVW5tYXAobWFwX2FkZHIsIHNhcmVhLT5iYWNrX3NpemUpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgQm9vbAotSTgzMFNjcmVlbkluaXQoRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCkKLQkJICAKLXsKLSAgIEk4MzBEUklQdHIgcEk4MzBEUkk7Ci0gICBkcm1JODMwU2FyZWEgKnBTQVJFQVByaXY7Ci0gICBpbnQgZXJyOwotICAgICAgCi0gICBkcm1fcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsgICAKLQotICAgcEk4MzAtPnJlZ2lzdGVyU2l6ZSA9IGN0eC0+TU1JT1NpemU7Ci0gICAvKiBUaGlzIGlzIGEgaGFjayBmb3Igbm93LiAgV2UgaGF2ZSB0byBoYXZlIG1vcmUgdGhhbiBhIDRrIHBhZ2UgaGVyZQotICAgICogYmVjYXVzZSBvZiB0aGUgc2l6ZSBvZiB0aGUgc3RhdGUuICBIb3dldmVyLCB0aGUgc3RhdGUgc2hvdWxkIGJlCi0gICAgKiBpbiBhIHBlci1jb250ZXh0IG1hcHBpbmcuICBUaGlzIHdpbGwgYmUgYWRkZWQgaW4gdGhlIE1lc2EgMy41IHBvcnQKLSAgICAqIG9mIHRoZSBJODMwIGRyaXZlci4KLSAgICAqLwotICAgY3R4LT5zaGFyZWQuU0FSRUFTaXplID0gU0FSRUFfTUFYOwotCi0gICAvKiBOb3RlIHRoYXQgZHJtT3BlbiB3aWxsIHRyeSB0byBsb2FkIHRoZSBrZXJuZWwgbW9kdWxlLCBpZiBuZWVkZWQuICovCi0gICBjdHgtPmRybUZEID0gZHJtT3BlbigiaTkxNSIsIE5VTEwgKTsKLSAgIGlmIChjdHgtPmRybUZEIDwgMCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJbZHJtXSBkcm1PcGVuIGZhaWxlZFxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgaWYgKChlcnIgPSBkcm1TZXRCdXNpZChjdHgtPmRybUZELCBjdHgtPnBjaUJ1c0lEKSkgPCAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIltkcm1dIGRybVNldEJ1c2lkIGZhaWxlZCAoJWQsICVzKSwgJXNcbiIsCi0JICAgICAgY3R4LT5kcm1GRCwgY3R4LT5wY2lCdXNJRCwgc3RyZXJyb3IoLWVycikpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGlmIChkcm1BZGRNYXAoIGN0eC0+ZHJtRkQsCi0JCSAgMCwKLQkJICBjdHgtPnNoYXJlZC5TQVJFQVNpemUsCi0JCSAgRFJNX1NITSwKLQkJICBEUk1fQ09OVEFJTlNfTE9DSywKLQkJICAmY3R4LT5zaGFyZWQuaFNBUkVBKSA8IDApCi0gICB7Ci0gICAgIGZwcmludGYoc3RkZXJyLCAiW2RybV0gZHJtQWRkTWFwIGZhaWxlZFxuIik7Ci0gICAgIHJldHVybiAwOwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgIltkcm1dIGFkZGVkICVkIGJ5dGUgU0FSRUEgYXQgMHglMDh4XG4iLAotCSAgIGN0eC0+c2hhcmVkLlNBUkVBU2l6ZSwgY3R4LT5zaGFyZWQuaFNBUkVBKTsKLSAgIAotICAgaWYgKGRybU1hcCggY3R4LT5kcm1GRCwKLQkgICAgICAgY3R4LT5zaGFyZWQuaFNBUkVBLAotCSAgICAgICBjdHgtPnNoYXJlZC5TQVJFQVNpemUsCi0JICAgICAgIChkcm1BZGRyZXNzUHRyKSgmY3R4LT5wU0FSRUEpKSA8IDApCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIltkcm1dIGRybU1hcCBmYWlsZWRcbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAKLSAgIH0KLSAgIAotICAgbWVtc2V0KGN0eC0+cFNBUkVBLCAwLCBjdHgtPnNoYXJlZC5TQVJFQVNpemUpOwotICAgZnByaW50ZihzdGRlcnIsICJbZHJtXSBtYXBwZWQgU0FSRUEgMHglMDh4IHRvICVwLCBzaXplICVkXG4iLAotCSAgIGN0eC0+c2hhcmVkLmhTQVJFQSwgY3R4LT5wU0FSRUEsIGN0eC0+c2hhcmVkLlNBUkVBU2l6ZSk7Ci0gICAKLQotICAgaWYgKGRybUFkZE1hcChjdHgtPmRybUZELCAKLQkJIGN0eC0+TU1JT1N0YXJ0LAotCQkgY3R4LT5NTUlPU2l6ZSwKLQkJIERSTV9SRUdJU1RFUlMsIAotCQkgRFJNX1JFQURfT05MWSwgCi0JCSAmcEk4MzAtPnJlZ2lzdGVySGFuZGxlKSA8IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiW2RybV0gZHJtQWRkTWFwIG1taW8gZmFpbGVkXG4iKTsJCi0gICAgICByZXR1cm4gMDsKLSAgIH0KLSAgIGZwcmludGYoc3RkZXJyLAotCSAgICJbZHJtXSByZWdpc3RlciBoYW5kbGUgPSAweCUwOHhcbiIsIHBJODMwLT5yZWdpc3RlckhhbmRsZSk7Ci0KLQotICAgaWYgKCFJODMwQ2hlY2tEUk1WZXJzaW9uKGN0eCwgcEk4MzApKSB7Ci0gICAgIHJldHVybiBGQUxTRTsKLSAgIH0KLQotICAgLyogQ3JlYXRlIGEgJ3NlcnZlcicgY29udGV4dCBzbyB3ZSBjYW4gZ3JhYiB0aGUgbG9jayBmb3IKLSAgICAqIGluaXRpYWxpemF0aW9uIGlvY3Rscy4KLSAgICAqLwotICAgaWYgKChlcnIgPSBkcm1DcmVhdGVDb250ZXh0KGN0eC0+ZHJtRkQsICZjdHgtPnNlcnZlckNvbnRleHQpKSAhPSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBkcm1DcmVhdGVDb250ZXh0IGZhaWxlZCAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIERSTV9MT0NLKGN0eC0+ZHJtRkQsIGN0eC0+cFNBUkVBLCBjdHgtPnNlcnZlckNvbnRleHQsIDApOyAKLQotICAgLyogSW5pdGlhbGl6ZSB0aGUgU0FSRUEgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwotICAgcFNBUkVBUHJpdiA9IChkcm1JODMwU2FyZWEgKikoKChjaGFyKiljdHgtPnBTQVJFQSkgKyAKLQkJCQkgc2l6ZW9mKGRybV9zYXJlYV90KSk7Ci0gICBtZW1zZXQocFNBUkVBUHJpdiwgMCwgc2l6ZW9mKCpwU0FSRUFQcml2KSk7Ci0KLSAgIHBJODMwLT5TdG9sZW5NZW1vcnkuU2l6ZSA9IEk4MzBEZXRlY3RNZW1vcnkoY3R4LCBwSTgzMCk7Ci0gICBwSTgzMC0+U3RvbGVuTWVtb3J5LlN0YXJ0ID0gMDsKLSAgIHBJODMwLT5TdG9sZW5NZW1vcnkuRW5kID0gcEk4MzAtPlN0b2xlbk1lbW9yeS5TaXplOwotCi0gICBwSTgzMC0+TWVtb3J5QXBlcnR1cmUuU3RhcnQgPSBwSTgzMC0+U3RvbGVuTWVtb3J5LkVuZDsKLSAgIHBJODMwLT5NZW1vcnlBcGVydHVyZS5FbmQgPSBLQig0MDAwMCk7Ci0gICBwSTgzMC0+TWVtb3J5QXBlcnR1cmUuU2l6ZSA9IHBJODMwLT5NZW1vcnlBcGVydHVyZS5FbmQgLSBwSTgzMC0+TWVtb3J5QXBlcnR1cmUuU3RhcnQ7Ci0KLSAgIHBJODMwLT5TdG9sZW5Qb29sLkZpeGVkID0gcEk4MzAtPlN0b2xlbk1lbW9yeTsKLSAgIHBJODMwLT5TdG9sZW5Qb29sLlRvdGFsID0gcEk4MzAtPlN0b2xlbk1lbW9yeTsKLSAgIHBJODMwLT5TdG9sZW5Qb29sLkZyZWUgPSBwSTgzMC0+U3RvbGVuUG9vbC5Ub3RhbDsKLSAgIHBJODMwLT5GcmVlTWVtb3J5ID0gcEk4MzAtPlN0b2xlblBvb2wuVG90YWwuU2l6ZTsKLQotICAgaWYgKCFBZ3BJbml0KGN0eCwgcEk4MzApKQotICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgIGlmIChJODMwQWxsb2NhdGVNZW1vcnkoY3R4LCBwSTgzMCkgPT0gRkFMU0UpCi0gICB7Ci0gICAgIHJldHVybiBGQUxTRTsKLSAgIH0KLQotICAgaWYgKEk4MzBCaW5kTWVtb3J5KGN0eCwgcEk4MzApID09IEZBTFNFKQotICAgewotICAgICByZXR1cm4gRkFMU0U7Ci0gICB9Ci0KLSAgIHBTQVJFQVByaXYtPmZyb250X29mZnNldCA9IHBJODMwLT5Gcm9udEJ1ZmZlci5TdGFydDsKLSAgIHBTQVJFQVByaXYtPmZyb250X3NpemUgPSBwSTgzMC0+RnJvbnRCdWZmZXIuU2l6ZTsKLSAgIHBTQVJFQVByaXYtPndpZHRoID0gY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoOwotICAgcFNBUkVBUHJpdi0+aGVpZ2h0ID0gY3R4LT5zaGFyZWQudmlydHVhbEhlaWdodDsKLSAgIHBTQVJFQVByaXYtPnBpdGNoID0gY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoOwotICAgcFNBUkVBUHJpdi0+dmlydHVhbFggPSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGg7Ci0gICBwU0FSRUFQcml2LT52aXJ0dWFsWSA9IGN0eC0+c2hhcmVkLnZpcnR1YWxIZWlnaHQ7Ci0gICBwU0FSRUFQcml2LT5iYWNrX29mZnNldCA9IHBJODMwLT5CYWNrQnVmZmVyLlN0YXJ0OwotICAgcFNBUkVBUHJpdi0+YmFja19zaXplID0gcEk4MzAtPkJhY2tCdWZmZXIuU2l6ZTsKLSAgIHBTQVJFQVByaXYtPmRlcHRoX29mZnNldCA9IHBJODMwLT5EZXB0aEJ1ZmZlci5TdGFydDsKLSAgIHBTQVJFQVByaXYtPmRlcHRoX3NpemUgPSBwSTgzMC0+RGVwdGhCdWZmZXIuU2l6ZTsKLSAgIHBTQVJFQVByaXYtPnRleF9vZmZzZXQgPSBwSTgzMC0+VGV4TWVtLlN0YXJ0OwotICAgcFNBUkVBUHJpdi0+dGV4X3NpemUgPSBwSTgzMC0+VGV4TWVtLlNpemU7Ci0gICBwU0FSRUFQcml2LT5sb2dfdGV4X2dyYW51bGFyaXR5ID0gcEk4MzAtPlRleEdyYW51bGFyaXR5OwotCi0gICBjdHgtPmRyaXZlckNsaWVudE1zZyA9IG1hbGxvYyhzaXplb2YoSTgzMERSSVJlYykpOwotICAgY3R4LT5kcml2ZXJDbGllbnRNc2dTaXplID0gc2l6ZW9mKEk4MzBEUklSZWMpOwotICAgcEk4MzBEUkkgPSAoSTgzMERSSVB0ciljdHgtPmRyaXZlckNsaWVudE1zZzsKLSAgIHBJODMwRFJJLT5kZXZpY2VJRCA9IHBJODMwLT5DaGlwc2V0OwotICAgcEk4MzBEUkktPnJlZ3NTaXplID0gSTgzMF9SRUdfU0laRTsKLSAgIHBJODMwRFJJLT53aWR0aCA9IGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aDsKLSAgIHBJODMwRFJJLT5oZWlnaHQgPSBjdHgtPnNoYXJlZC52aXJ0dWFsSGVpZ2h0OwotICAgcEk4MzBEUkktPm1lbSA9IGN0eC0+c2hhcmVkLmZiU2l6ZTsKLSAgIHBJODMwRFJJLT5jcHAgPSBjdHgtPmNwcDsKLSAgIHBJODMwRFJJLT5iYWNrT2Zmc2V0ID0gcEk4MzAtPkJhY2tCdWZmZXIuU3RhcnQ7Ci0gICBwSTgzMERSSS0+YmFja1BpdGNoID0gcEk4MzAtPkJhY2tCdWZmZXIuUGl0Y2g7IAotCi0gICBwSTgzMERSSS0+ZGVwdGhPZmZzZXQgPSBwSTgzMC0+RGVwdGhCdWZmZXIuU3RhcnQ7Ci0gICBwSTgzMERSSS0+ZGVwdGhQaXRjaCA9IHBJODMwLT5EZXB0aEJ1ZmZlci5QaXRjaDsgCi0KLSAgIHBJODMwRFJJLT5mYk9mZnNldCA9IHBJODMwLT5Gcm9udEJ1ZmZlci5TdGFydDsKLSAgIHBJODMwRFJJLT5mYlN0cmlkZSA9IHBJODMwLT5Gcm9udEJ1ZmZlci5QaXRjaDsKLQotICAgcEk4MzBEUkktPmJpdHNQZXJQaXhlbCA9IGN0eC0+YnBwOwotICAgcEk4MzBEUkktPnNhcmVhX3ByaXZfb2Zmc2V0ID0gc2l6ZW9mKGRybV9zYXJlYV90KTsKLSAgIAotICAgZXJyID0gSTgzMERSSURvTWFwcGluZ3MoY3R4LCBwSTgzMCwgcFNBUkVBUHJpdik7Ci0gICBpZiAoZXJyID09IEZBTFNFKQotICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgSTgzMFNldHVwTWVtb3J5VGlsaW5nKGN0eCwgcEk4MzApOwotCi0gICAvKiBRdWljayBoYWNrIHRvIGNsZWFyIHRoZSBmcm9udCAmIGJhY2sgYnVmZmVycy4gIENvdWxkIGFsc28gdXNlCi0gICAgKiB0aGUgY2xlYXIgaW9jdGwgdG8gZG8gdGhpcywgYnV0IHdvdWxkIG5lZWQgdG8gc2V0dXAgaHcgc3RhdGUKLSAgICAqIGZpcnN0LgotICAgICovCi0gICBJODMwQ2xlYXJTY3JlZW4oY3R4LCBwSTgzMCwgcFNBUkVBUHJpdik7Ci0KLSAgIEk4MzBTZXRSaW5nUmVncyhjdHgsIHBJODMwKTsKLQotICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqCi0gKiBcYnJpZWYgVmFsaWRhdGUgdGhlIGZiZGV2IG1vZGUuCi0gKiAKLSAqIFxwYXJhbSBjdHggZGlzcGxheSBoYW5kbGUuCi0gKgotICogXHJldHVybiBvbmUgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgotICoKLSAqIFNhdmVzIHNvbWUgcmVnaXN0ZXJzIGFuZCByZXR1cm5zIDEuCi0gKgotICogXHNhIHJhZGVvblZhbGlkYXRlTW9kZSgpLgotICovCi1zdGF0aWMgaW50IGk4MzBWYWxpZGF0ZU1vZGUoIGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCApCi17Ci0gIHJldHVybiAxOwotfQotCi0vKioKLSAqIFxicmllZiBFeGFtaW5lIG1vZGUgcmV0dXJuZWQgYnkgZmJkZXYuCi0gKiAKLSAqIFxwYXJhbSBjdHggZGlzcGxheSBoYW5kbGUuCi0gKgotICogXHJldHVybiBvbmUgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgotICoKLSAqIFJlc3RvcmVzIHJlZ2lzdGVycyB0aGF0IGZiZGV2IGhhcyBjbG9iYmVyZWQgYW5kIHJldHVybnMgMS4KLSAqCi0gKiBcc2EgaTgxMFZhbGlkYXRlTW9kZSgpLgotICovCi1zdGF0aWMgaW50IGk4MzBQb3N0VmFsaWRhdGVNb2RlKCBjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHggKQotewotICBJODMwUmVjICpwSTgzMCA9IGN0eC0+ZHJpdmVyUHJpdmF0ZTsKLQotICBJODMwU2V0UmluZ1JlZ3MoY3R4LCBwSTgzMCk7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qKgotICogXGJyaWVmIEluaXRpYWxpemUgdGhlIGZyYW1lYnVmZmVyIGRldmljZSBtb2RlCi0gKgotICogXHBhcmFtIGN0eCBkaXNwbGF5IGhhbmRsZS4KLSAqCi0gKiBccmV0dXJuIG9uZSBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCi0gKgotICogRmlsbHMgaW4gXHAgaW5mbyB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgYW5kIHNvbWUgaW5mb3JtYXRpb24gZnJvbSBccCBjdHgKLSAqIGFuZCB0aGVuIGNhbGxzIEk4MTBTY3JlZW5Jbml0KCkgZm9yIHRoZSBzY3JlZW4gaW5pdGlhbGl6YXRpb24uCi0gKiAKLSAqIEJlZm9yZSBleGl0aW5nIGNsZWFycyB0aGUgZnJhbWVidWZmZXIgbWVtb3J5IGFjY2Vzc2luZyBpdCBkaXJlY3RseS4KLSAqLwotc3RhdGljIGludCBpODMwSW5pdEZCRGV2KCBEUklEcml2ZXJDb250ZXh0ICpjdHggKQotewotICBJODMwUmVjICpwSTgzMCA9IGNhbGxvYygxLCBzaXplb2YoSTgzMFJlYykpOwotICBpbnQgaTsKLQotICAgewotICAgICAgaW50ICBkdW1teSA9IGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aDsKLQotICAgICAgc3dpdGNoIChjdHgtPmJwcCAvIDgpIHsKLSAgICAgIGNhc2UgMTogZHVtbXkgPSAoY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoICsgMTI3KSAmIH4xMjc7IGJyZWFrOwotICAgICAgY2FzZSAyOiBkdW1teSA9IChjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGggKyAgMzEpICYgIH4zMTsgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICBjYXNlIDQ6IGR1bW15ID0gKGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aCArICAxNSkgJiAgfjE1OyBicmVhazsKLSAgICAgIH0KLQotICAgICAgY3R4LT5zaGFyZWQudmlydHVhbFdpZHRoID0gZHVtbXk7Ci0gICAgICBjdHgtPnNoYXJlZC5XaWR0aCA9IGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aDsKLSAgIH0KLQotCi0gICBmb3IgKGkgPSAwOyBwaXRjaGVzW2ldICE9IDA7IGkrKykgewotICAgICBpZiAocGl0Y2hlc1tpXSA+PSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGgpIHsKLSAgICAgICBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGggPSBwaXRjaGVzW2ldOwotICAgICAgIGJyZWFrOwotICAgICB9Ci0gICB9Ci0KLSAgIGN0eC0+ZHJpdmVyUHJpdmF0ZSA9ICh2b2lkICopcEk4MzA7Ci0gICAKLSAgIHBJODMwLT5McFJpbmcgPSBjYWxsb2MoMSwgc2l6ZW9mKEk4MzBSaW5nQnVmZmVyKSk7Ci0gICBwSTgzMC0+Q2hpcHNldCA9IGN0eC0+Y2hpcHNldDsKLSAgIHBJODMwLT5MaW5lYXJBZGRyID0gY3R4LT5GQlN0YXJ0OwotCi0gICBpZiAoIUk4MzBTY3JlZW5Jbml0KCBjdHgsIHBJODMwICkpCi0gICAgICByZXR1cm4gMDsKLQotICAgCi0gICByZXR1cm4gMTsKLX0KLQotCi0vKioKLSAqIFxicmllZiBUaGUgc2NyZWVuIGlzIGJlaW5nIGNsb3NlZCwgc28gY2xlYW4gdXAgYW55IHN0YXRlIGFuZCBmcmVlIGFueQotICogcmVzb3VyY2VzIHVzZWQgYnkgdGhlIERSSS4KLSAqCi0gKiBccGFyYW0gY3R4IGRpc3BsYXkgaGFuZGxlLgotICoKLSAqIFVubWFwcyB0aGUgU0FSRUEsIGNsb3NlcyB0aGUgRFJNIGRldmljZSBmaWxlIGRlc2NyaXB0b3IgYW5kIGZyZWVzIHRoZSBkcml2ZXIKLSAqIHByaXZhdGUgZGF0YS4KLSAqLwotc3RhdGljIHZvaWQgaTgzMEhhbHRGQkRldiggRFJJRHJpdmVyQ29udGV4dCAqY3R4ICkKLXsKLSAgZHJtSTgzMFNhcmVhICpwU0FSRUFQcml2OwotICBJODMwUmVjICpwSTgzMCA9IGN0eC0+ZHJpdmVyUHJpdmF0ZTsKLQotICAgaWYgKHBJODMwLT5pcnEpIHsKLSAgICAgICBkcm1DdGxVbmluc3RIYW5kbGVyKGN0eC0+ZHJtRkQpOwotICAgICAgIHBJODMwLT5pcnEgPSAwOyAgIH0KLQotICAgSTgzMENsZWFudXBEbWEoY3R4KTsKLQotICBwU0FSRUFQcml2ID0gKGRybUk4MzBTYXJlYSAqKSgoKGNoYXIqKWN0eC0+cFNBUkVBKSArIAotCQkJCXNpemVvZihkcm1fc2FyZWFfdCkpOwotCi0gIEk4MzBEUklVbm1hcFNjcmVlblJlZ2lvbnMoY3R4LCBwSTgzMCwgcFNBUkVBUHJpdik7Ci0gIGRybVVubWFwKCBjdHgtPnBTQVJFQSwgY3R4LT5zaGFyZWQuU0FSRUFTaXplICk7Ci0gIGRybUNsb3NlKGN0eC0+ZHJtRkQpOwotICAKLSAgaWYgKGN0eC0+ZHJpdmVyUHJpdmF0ZSkgewotICAgIGZyZWUoY3R4LT5kcml2ZXJQcml2YXRlKTsKLSAgICBjdHgtPmRyaXZlclByaXZhdGUgPSAwOwotICB9Ci19Ci0KLQotZXh0ZXJuIHZvaWQgaTgxME5vdGlmeUZvY3VzKCBpbnQgKTsKLQotLyoqCi0gKiBcYnJpZWYgRXhwb3J0ZWQgZHJpdmVyIGludGVyZmFjZSBmb3IgTWluaSBHTFguCi0gKgotICogXHNhIERSSURyaXZlclJlYy4KLSAqLwotY29uc3Qgc3RydWN0IERSSURyaXZlclJlYyBfX2RyaURyaXZlciA9IHsKLSAgIGk4MzBWYWxpZGF0ZU1vZGUsCi0gICBpODMwUG9zdFZhbGlkYXRlTW9kZSwKLSAgIGk4MzBJbml0RkJEZXYsCi0gICBpODMwSGFsdEZCRGV2LAotICAgTlVMTCwvL0k4MzBFbmdpbmVTaHV0ZG93biwKLSAgIE5VTEwsIC8vSTgzMEVuZ2luZVJlc3RvcmUsICAKLSNpZm5kZWYgX0VNQkVEREVECi0gICAwLAotI2Vsc2UKLSAgIGk4MTBOb3RpZnlGb2N1cywgCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L3NlcnZlci9pbnRlbF9kcmkuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvc2VydmVyL2ludGVsX2RyaS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVmZmRkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L3NlcnZlci9pbnRlbF9kcmkuYwpAQCAtMCwwICsxIEBACisuLi8uLi9pbnRlbC9zZXJ2ZXIvaW50ZWxfZHJpLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9iYXRjaGJ1ZmZlci5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmF0Y2hidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZhYWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmF0Y2hidWZmZXIuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKKyNpbmNsdWRlICJpbnRlbF9kZWNvZGUuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWcuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKworLyogUmVsb2NhdGlvbnMgaW4ga2VybmVsIHNwYWNlOgorICogICAgLSBwYXNzIGRtYSBidWZmZXIgc2VwZXJhdGVseQorICogICAgLSBtZW1vcnkgbWFuYWdlciBrbm93cyBob3cgdG8gcGF0Y2gKKyAqICAgIC0gcGFzcyBsaXN0IG9mIGRlcGVuZGVudCBidWZmZXJzCisgKiAgICAtIHBhc3MgcmVsb2NhdGlvbiBsaXN0CisgKgorICogRWl0aGVyOgorICogICAgLSBnZXQgYmFjayBhbiBvZmZzZXQgZm9yIGJ1ZmZlciB0byBmaXJlCisgKiAgICAtIG1lbW9yeSBtYW5hZ2VyIGtub3dzIGhvdyB0byBmaXJlIGJ1ZmZlcgorICoKKyAqIFJlYWxseSB3YW50IHRoZSBidWZmZXIgdG8gYmUgQUdQIGFuZCBwaW5uZWQuCisgKgorICovCisKKy8qIENsaXByZWN0IGZlbmNlOiBUaGUgaGlnaGVzdCBmZW5jZSBwcm90ZWN0aW5nIGEgZG1hIGJ1ZmZlcgorICogY29udGFpbmluZyBleHBsaWNpdCBjbGlwcmVjdCBpbmZvcm1hdGlvbi4gIExpa2UgdGhlIG9sZCBkcmF3YWJsZQorICogbG9jayBidXQgaXJxLWRyaXZlbi4gIFggc2VydmVyIG11c3Qgd2FpdCBmb3IgdGhpcyBmZW5jZSB0byBleHBpcmUKKyAqIGJlZm9yZSBjaGFuZ2luZyBjbGlwcmVjdHMgW2FuZCB0aGVuIGRvaW5nIHN3IHJlbmRlcmluZz9dLiAgRm9yCisgKiBvdGhlciBkbWEgYnVmZmVycywgdGhlIHNjaGVkdWxlciB3aWxsIGdyYWIgY3VycmVudCBjbGlwcmVjdCBpbmZvCisgKiBhbmQgbWl4IGludG8gYnVmZmVyLiAgWCBzZXJ2ZXIgbXVzdCBob2xkIHRoZSBsb2NrIHdoaWxlIGNoYW5naW5nCisgKiBjbGlwcmVjdHM/Pz8gIE1ha2UgcGVyLWRyYXdhYmxlLiAgTmVlZCBjbGlwcmVjdHMgaW4gc2hhcmVkIG1lbW9yeQorICogLS0gYmVhdHMgc3RvcmluZyB0aGVtIHdpdGggZXZlcnkgY21kIGJ1ZmZlciBpbiB0aGUgcXVldWUuCisgKgorICogPT0+IFggc2VydmVyIG11c3Qgd2FpdCBmb3IgdGhpcyBmZW5jZSB0byBleHBpcmUgYmVmb3JlIHRvdWNoaW5nIHRoZQorICogZnJhbWVidWZmZXIgd2l0aCBuZXcgY2xpcHJlY3RzLgorICoKKyAqID09PiBDbGlwcmVjdC1kZXBlbmRlbnQgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggYQorICogY2xpcHJlY3QtdGltZXN0YW1wLiAgQWxsIG9mIHRoZSBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBhIHRpbWVzdGFtcAorICogbXVzdCBnbyB0byBoYXJkd2FyZSBiZWZvcmUgYW55IGJ1ZmZlciB3aXRoIGEgbmV3ZXIgdGltZXN0YW1wLgorICoKKyAqID09PiBEbWEgc2hvdWxkIGJlIHF1ZXVlZCBwZXItZHJhd2FibGUgZm9yIGNvcnJlY3QgWC9HTAorICogc3luY2hyb25pemF0aW9uLiAgT3IgY2FuIGZlbmNlcyBiZSB1c2VkIGZvciB0aGlzPworICoKKyAqIEFwcGxpZXMgdG86IEJsaXQgb3BlcmF0aW9ucywgbWV0YW9wcywgWCBzZXJ2ZXIgb3BlcmF0aW9ucyAtLSBYCisgKiBzZXJ2ZXIgYXV0b21hdGljYWxseSB3YWl0cyBvbiBpdHMgb3duIGRtYSB0byBjb21wbGV0ZSBiZWZvcmUKKyAqIG1vZGlmeWluZyBjbGlwcmVjdHMgPz8/CisgKi8KKwordm9pZAoraW50ZWxfYmF0Y2hidWZmZXJfcmVzZXQoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGJhdGNoLT5pbnRlbDsKKworICAgaWYgKGJhdGNoLT5idWYgIT0gTlVMTCkgeworICAgICAgZHJpX2JvX3VucmVmZXJlbmNlKGJhdGNoLT5idWYpOworICAgICAgYmF0Y2gtPmJ1ZiA9IE5VTEw7CisgICB9CisKKyAgIGlmICghYmF0Y2gtPmJ1ZmZlciAmJiBpbnRlbC0+dHRtID09IEdMX1RSVUUpCisgICAgICBiYXRjaC0+YnVmZmVyID0gbWFsbG9jIChpbnRlbC0+bWF4QmF0Y2hTaXplKTsKKworICAgYmF0Y2gtPmJ1ZiA9IGRyaV9ib19hbGxvYyhpbnRlbC0+YnVmbWdyLCAiYmF0Y2hidWZmZXIiLAorCQkJICAgICBpbnRlbC0+bWF4QmF0Y2hTaXplLCA0MDk2KTsKKyAgIGlmIChiYXRjaC0+YnVmZmVyKQorICAgICAgYmF0Y2gtPm1hcCA9IGJhdGNoLT5idWZmZXI7CisgICBlbHNlIHsKKyAgICAgIGRyaV9ib19tYXAoYmF0Y2gtPmJ1ZiwgR0xfVFJVRSk7CisgICAgICBiYXRjaC0+bWFwID0gYmF0Y2gtPmJ1Zi0+dmlydHVhbDsKKyAgIH0KKyAgIGJhdGNoLT5zaXplID0gaW50ZWwtPm1heEJhdGNoU2l6ZTsKKyAgIGJhdGNoLT5wdHIgPSBiYXRjaC0+bWFwOworICAgYmF0Y2gtPmRpcnR5X3N0YXRlID0gfjA7CisgICBiYXRjaC0+Y2xpcHJlY3RfbW9kZSA9IElHTk9SRV9DTElQUkVDVFM7Cit9CisKK3N0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqCitpbnRlbF9iYXRjaGJ1ZmZlcl9hbGxvYyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoID0gY2FsbG9jKHNpemVvZigqYmF0Y2gpLCAxKTsKKworICAgYmF0Y2gtPmludGVsID0gaW50ZWw7CisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9yZXNldChiYXRjaCk7CisKKyAgIHJldHVybiBiYXRjaDsKK30KKwordm9pZAoraW50ZWxfYmF0Y2hidWZmZXJfZnJlZShzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoKQoreworICAgaWYgKGJhdGNoLT5idWZmZXIpCisgICAgICBmcmVlIChiYXRjaC0+YnVmZmVyKTsKKyAgIGVsc2UgeworICAgICAgaWYgKGJhdGNoLT5tYXApIHsKKwkgZHJpX2JvX3VubWFwKGJhdGNoLT5idWYpOworCSBiYXRjaC0+bWFwID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KKyAgIGRyaV9ib191bnJlZmVyZW5jZShiYXRjaC0+YnVmKTsKKyAgIGJhdGNoLT5idWYgPSBOVUxMOworICAgZnJlZShiYXRjaCk7Cit9CisKKworCisvKiBUT0RPOiBQdXNoIHRoaXMgd2hvbGUgZnVuY3Rpb24gaW50byBidWZtZ3IuCisgKi8KK3N0YXRpYyB2b2lkCitkb19mbHVzaF9sb2NrZWQoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKwkJR0x1aW50IHVzZWQsIEdMYm9vbGVhbiBhbGxvd191bmxvY2spCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBiYXRjaC0+aW50ZWw7CisgICBpbnQgcmV0ID0gMDsKKworICAgaWYgKGJhdGNoLT5idWZmZXIpCisgICAgICBkcmlfYm9fc3ViZGF0YSAoYmF0Y2gtPmJ1ZiwgMCwgdXNlZCwgYmF0Y2gtPmJ1ZmZlcik7CisgICBlbHNlCisgICAgICBkcmlfYm9fdW5tYXAoYmF0Y2gtPmJ1Zik7CisKKyAgIGJhdGNoLT5tYXAgPSBOVUxMOworICAgYmF0Y2gtPnB0ciA9IE5VTEw7CisKKyAgIC8qIFRocm93IGF3YXkgbm9uLWVmZmVjdGl2ZSBwYWNrZXRzLiAgV29uJ3Qgd29yayBvbmNlIHdlIGhhdmUKKyAgICAqIGhhcmR3YXJlIGNvbnRleHRzIHdoaWNoIHdvdWxkIHByZXNlcnZlIHN0YXRlY2hhbmdlcyBiZXlvbmQgYQorICAgICogc2luZ2xlIGJ1ZmZlci4KKyAgICAqLworCisgICBpZiAoIShpbnRlbC0+bnVtQ2xpcFJlY3RzID09IDAgJiYKKwkgYmF0Y2gtPmNsaXByZWN0X21vZGUgPT0gTE9PUF9DTElQUkVDVFMpKSB7CisgICAgICBpZiAoaW50ZWwtPnR0bSA9PSBHTF9UUlVFKSB7CisJIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciAqZXhlY2J1ZjsKKworCSBleGVjYnVmID0gZHJpX3Byb2Nlc3NfcmVsb2NzKGJhdGNoLT5idWYpOworCSByZXQgPSBpbnRlbF9leGVjX2lvY3RsKGJhdGNoLT5pbnRlbCwKKwkJCQl1c2VkLAorCQkJCWJhdGNoLT5jbGlwcmVjdF9tb2RlICE9IExPT1BfQ0xJUFJFQ1RTLAorCQkJCWFsbG93X3VubG9jaywKKwkJCQlleGVjYnVmKTsKKyAgICAgIH0gZWxzZSB7CisJIGRyaV9wcm9jZXNzX3JlbG9jcyhiYXRjaC0+YnVmKTsKKwkgcmV0ID0gaW50ZWxfYmF0Y2hfaW9jdGwoYmF0Y2gtPmludGVsLAorCQkJCSBiYXRjaC0+YnVmLT5vZmZzZXQsCisJCQkJIHVzZWQsCisJCQkJIGJhdGNoLT5jbGlwcmVjdF9tb2RlICE9IExPT1BfQ0xJUFJFQ1RTLAorCQkJCSBhbGxvd191bmxvY2spOworICAgICAgfQorICAgfQorCisgICBkcmlfcG9zdF9zdWJtaXQoYmF0Y2gtPmJ1Zik7CisKKyAgIGlmIChpbnRlbC0+bnVtQ2xpcFJlY3RzID09IDAgJiYKKyAgICAgICBiYXRjaC0+Y2xpcHJlY3RfbW9kZSA9PSBMT09QX0NMSVBSRUNUUykgeworICAgICAgaWYgKGFsbG93X3VubG9jaykgeworCSAvKiBJZiB3ZSBhcmUgbm90IGRvaW5nIGFueSBhY3R1YWwgdXNlci12aXNpYmxlIHJlbmRlcmluZywKKwkgICogZG8gYSBzY2hlZF95aWVsZCB0byBrZWVwIHRoZSBhcHAgZnJvbSBwZWdnaW5nIHRoZSBjcHUgd2hpbGUKKwkgICogYWNoaWV2aW5nIG5vdGhpbmcuCisJICAqLworICAgICAgICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKKyAgICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgICAgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQkFUQ0gpIHsKKyAgICAgIGRyaV9ib19tYXAoYmF0Y2gtPmJ1ZiwgR0xfRkFMU0UpOworICAgICAgaW50ZWxfZGVjb2RlKGJhdGNoLT5idWYtPnZpcnR1YWwsIHVzZWQgLyA0LCBiYXRjaC0+YnVmLT5vZmZzZXQsCisJCSAgIGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpOworICAgICAgZHJpX2JvX3VubWFwKGJhdGNoLT5idWYpOworCisgICAgICBpZiAoaW50ZWwtPnZ0YmwuZGVidWdfYmF0Y2ggIT0gTlVMTCkKKwkgaW50ZWwtPnZ0YmwuZGVidWdfYmF0Y2goaW50ZWwpOworICAgfQorCisgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisgICAgICBleGl0KDEpOworICAgfQorICAgaW50ZWwtPnZ0YmwubmV3X2JhdGNoKGludGVsKTsKK30KKwordm9pZAorX2ludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsIGNvbnN0IGNoYXIgKmZpbGUsCisJCQkgaW50IGxpbmUpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBiYXRjaC0+aW50ZWw7CisgICBHTHVpbnQgdXNlZCA9IGJhdGNoLT5wdHIgLSBiYXRjaC0+bWFwOworICAgR0xib29sZWFuIHdhc19sb2NrZWQgPSBpbnRlbC0+bG9ja2VkOworCisgICBpZiAodXNlZCA9PSAwKQorICAgICAgcmV0dXJuOworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CQVRDSCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IEJhdGNoYnVmZmVyIGZsdXNoIHdpdGggJWRiIHVzZWRcbiIsIGZpbGUsIGxpbmUsCisJICAgICAgdXNlZCk7CisKKyAgIC8qIEVtaXQgYSBmbHVzaCBpZiB0aGUgYnVmbWdyIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLiAqLworICAgaWYgKCFpbnRlbC0+dHRtKSB7CisgICAgICAqKEdMdWludCAqKSAoYmF0Y2gtPnB0cikgPSBpbnRlbC0+dnRibC5mbHVzaF9jbWQoKTsKKyAgICAgIGJhdGNoLT5wdHIgKz0gNDsKKyAgICAgIHVzZWQgPSBiYXRjaC0+cHRyIC0gYmF0Y2gtPm1hcDsKKyAgIH0KKworICAgLyogUm91bmQgYmF0Y2hidWZmZXIgdXNhZ2UgdG8gMiBEV09SRHMuICovCisKKyAgIGlmICgodXNlZCAmIDQpID09IDApIHsKKyAgICAgICooR0x1aW50ICopIChiYXRjaC0+cHRyKSA9IDA7IC8qIG5vb3AgKi8KKyAgICAgIGJhdGNoLT5wdHIgKz0gNDsKKyAgICAgIHVzZWQgPSBiYXRjaC0+cHRyIC0gYmF0Y2gtPm1hcDsKKyAgIH0KKworICAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCisgICAqKEdMdWludCAqKSAoYmF0Y2gtPnB0cikgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOyAvKiBub29wICovCisgICBiYXRjaC0+cHRyICs9IDQ7CisgICB1c2VkID0gYmF0Y2gtPnB0ciAtIGJhdGNoLT5tYXA7CisKKyAgIC8qIFdvcmthcm91bmQgZm9yIHJlY3Vyc2l2ZSBiYXRjaGJ1ZmZlciBmbHVzaGluZzogSWYgdGhlIHdpbmRvdyBpcworICAgICogbW92ZWQsIHdlIGNhbiBnZXQgaW50byBhIGNhc2Ugd2hlcmUgd2UgdHJ5IHRvIGZsdXNoIGR1cmluZyBhCisgICAgKiBmbHVzaC4gIFdoYXQgaGFwcGVucyBpcyB0aGF0IHdoZW4gd2UgdHJ5IHRvIGdyYWIgdGhlIGxvY2sgZm9yCisgICAgKiB0aGUgZmlyc3QgZmx1c2gsIHdlIGRldGVjdCB0aGF0IHRoZSB3aW5kb3cgbW92ZWQgd2hpY2ggdGhlbgorICAgICogY2F1c2VzIGFub3RoZXIgZmx1c2ggKGZyb20gdGhlIGludGVsX2RyYXdfYnVmZmVyKCkgY2FsbCBpbgorICAgICogaW50ZWxVcGRhdGVQYWdlRmxpcHBpbmcoKSkuICBUbyB3b3JrIGFyb3VuZCB0aGlzIHdlIHJlc2V0IHRoZQorICAgICogYmF0Y2hidWZmZXIgdGFpbCBwb2ludGVyIGJlZm9yZSB0cnlpbmcgdG8gZ2V0IHRoZSBsb2NrLiAgVGhpcworICAgICogcHJldmVudCB0aGUgbmVzdGVkIGJ1ZmZlciBmbHVzaCwgYnV0IGEgYmV0dGVyIGZpeCB3b3VsZCBiZSB0bworICAgICogYXZvaWQgdGhhdCBpbiB0aGUgZmlyc3QgcGxhY2UuICovCisgICBiYXRjaC0+cHRyID0gYmF0Y2gtPm1hcDsKKworICAgaWYgKGludGVsLT52dGJsLmZpbmlzaF9iYXRjaCkKKyAgICAgIGludGVsLT52dGJsLmZpbmlzaF9iYXRjaChpbnRlbCk7CisKKyAgIC8qIFRPRE86IEp1c3QgcGFzcyB0aGUgcmVsb2NhdGlvbiBsaXN0IGFuZCBkbWEgYnVmZmVyIHVwIHRvIHRoZQorICAgICoga2VybmVsLgorICAgICovCisgICBpZiAoIXdhc19sb2NrZWQpCisgICAgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgZG9fZmx1c2hfbG9ja2VkKGJhdGNoLCB1c2VkLCBHTF9GQUxTRSk7CisKKyAgIGlmICghd2FzX2xvY2tlZCkKKyAgICAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NZTkMpIHsKKyAgICAgIGludCBpcnE7CisKKyAgICAgIGZwcmludGYoc3RkZXJyLCAid2FpdGluZyBmb3IgaWRsZVxuIik7CisgICAgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKyAgICAgIGlycSA9IGludGVsRW1pdElycUxvY2tlZChpbnRlbCk7CisgICAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworICAgICAgaW50ZWxXYWl0SXJxKGludGVsLCBpcnEpOworICAgfQorCisgICAvKiBSZXNldCB0aGUgYnVmZmVyOgorICAgICovCisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9yZXNldChiYXRjaCk7Cit9CisKKworLyogIFRoaXMgaXMgdGhlIG9ubHkgd2F5IGJ1ZmZlcnMgZ2V0IGFkZGVkIHRvIHRoZSB2YWxpZGF0ZSBsaXN0LgorICovCitHTGJvb2xlYW4KK2ludGVsX2JhdGNoYnVmZmVyX2VtaXRfcmVsb2Moc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpX2JvICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluLAorCQkJICAgICB1aW50MzJfdCBkZWx0YSkKK3sKKyAgIGludCByZXQ7CisKKyAgIGlmIChiYXRjaC0+cHRyIC0gYmF0Y2gtPm1hcCA+IGJhdGNoLT5idWYtPnNpemUpCisgICAgX21lc2FfcHJpbnRmICgiYmFkIHJlbG9jYXRpb24gcHRyICVwIG1hcCAlcCBvZmZzZXQgJWQgc2l6ZSAlZFxuIiwKKwkJICBiYXRjaC0+cHRyLCBiYXRjaC0+bWFwLCBiYXRjaC0+cHRyIC0gYmF0Y2gtPm1hcCwgYmF0Y2gtPmJ1Zi0+c2l6ZSk7CisgICByZXQgPSBpbnRlbF9ib19lbWl0X3JlbG9jKGJhdGNoLT5idWYsIHJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLAorCQkJICAgICBkZWx0YSwgYmF0Y2gtPnB0ciAtIGJhdGNoLT5tYXAsIGJ1ZmZlcik7CisKKyAgIC8qCisgICAgKiBVc2luZyB0aGUgb2xkIGJ1ZmZlciBvZmZzZXQsIHdyaXRlIGluIHdoYXQgdGhlIHJpZ2h0IGRhdGEgd291bGQgYmUsIGluIGNhc2UKKyAgICAqIHRoZSBidWZmZXIgZG9lc24ndCBtb3ZlIGFuZCB3ZSBjYW4gc2hvcnQtY2lyY3VpdCB0aGUgcmVsb2NhdGlvbiBwcm9jZXNzaW5nCisgICAgKiBpbiB0aGUga2VybmVsCisgICAgKi8KKyAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfZHdvcmQgKGJhdGNoLCBidWZmZXItPm9mZnNldCArIGRlbHRhKTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3ZvaWQKK2ludGVsX2JhdGNoYnVmZmVyX2RhdGEoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgR0x1aW50IGJ5dGVzLAorCQkgICAgICAgZW51bSBjbGlwcmVjdF9tb2RlIGNsaXByZWN0X21vZGUpCit7CisgICBhc3NlcnQoKGJ5dGVzICYgMykgPT0gMCk7CisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9yZXF1aXJlX3NwYWNlKGJhdGNoLCBieXRlcywgY2xpcHJlY3RfbW9kZSk7CisgICBfX21lbWNweShiYXRjaC0+cHRyLCBkYXRhLCBieXRlcyk7CisgICBiYXRjaC0+cHRyICs9IGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmF0Y2hidWZmZXIuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2JhdGNoYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNmVjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2JhdGNoYnVmZmVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKyNpZm5kZWYgSU5URUxfQkFUQ0hCVUZGRVJfSAorI2RlZmluZSBJTlRFTF9CQVRDSEJVRkZFUl9ICisKKyNpbmNsdWRlICJtdHlwZXMuaCIKKworI2luY2x1ZGUgImRyaV9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWcuaCIKKworc3RydWN0IGludGVsX2NvbnRleHQ7CisKKyNkZWZpbmUgQkFUQ0hfU1ogMTYzODQKKyNkZWZpbmUgQkFUQ0hfUkVTRVJWRUQgMTYKKworZW51bSBjbGlwcmVjdF9tb2RlIHsKKyAgIC8qKgorICAgICogQmF0Y2hidWZmZXIgY29udGVudHMgbWF5IGJlIGxvb3BlZCBvdmVyIHBlciBjbGlwcmVjdCwgYnV0IGRvIG5vdAorICAgICogcmVxdWlyZSBpdC4KKyAgICAqLworICAgSUdOT1JFX0NMSVBSRUNUUywKKyAgIC8qKgorICAgICogQmF0Y2hidWZmZXIgY29udGVudHMgcmVxdWlyZSBsb29waW5nIG92ZXIgcGVyIGNsaXByZWN0IGF0IGJhdGNoIHN1Ym1pdAorICAgICogdGltZS4KKyAgICAqLworICAgTE9PUF9DTElQUkVDVFMsCisgICAvKioKKyAgICAqIEJhdGNoYnVmZmVyIGNvbnRlbnRzIGNvbnRhaW4gZHJhd2luZyB0aGF0IHNob3VsZCBub3QgYmUgZXhlY3V0ZWQgbXVsdGlwbGUKKyAgICAqIHRpbWVzLgorICAgICovCisgICBOT19MT09QX0NMSVBSRUNUUywKKyAgIC8qKgorICAgICogQmF0Y2hidWZmZXIgY29udGVudHMgY29udGFpbiBkcmF3aW5nIHRoYXQgYWxyZWFkeSBoYW5kbGVzIGNsaXByZWN0cywgc3VjaAorICAgICogYXMgMkQgZHJhd2luZyB0byBmcm9udC9iYWNrL2RlcHRoIHRoYXQgZG9lc24ndCByZXNwZWN0IERSQVdJTkdfUkVDVEFOR0xFLgorICAgICogRXF1aXZhbGVudCBiZWhhdmlvciB0byBOT19MT09QX0NMSVBSRUNUUywgYnV0IG1heSBub3QgcGVyc2lzdCBpbiBiYXRjaAorICAgICogb3V0c2lkZSBvZiBMT0NLL1VOTE9DSy4KKyAgICAqLworICAgUkVGRVJFTkNFU19DTElQUkVDVFMKK307CisKK3N0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlcgoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsOworCisgICBkcmlfYm8gKmJ1ZjsKKworICAgR0x1Ynl0ZSAqYnVmZmVyOworCisgICBHTHVieXRlICptYXA7CisgICBHTHVieXRlICpwdHI7CisKKyAgIGVudW0gY2xpcHJlY3RfbW9kZSBjbGlwcmVjdF9tb2RlOworCisgICBHTHVpbnQgc2l6ZTsKKworICAgR0x1aW50IGRpcnR5X3N0YXRlOworfTsKKworc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICppbnRlbF9iYXRjaGJ1ZmZlcl9hbGxvYyhzdHJ1Y3QgaW50ZWxfY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZWwpOworCit2b2lkIGludGVsX2JhdGNoYnVmZmVyX2ZyZWUoc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCk7CisKKwordm9pZCBfaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKworI2RlZmluZSBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChiYXRjaCkgXAorCV9pbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChiYXRjaCwgX19GSUxFX18sIF9fTElORV9fKQorCit2b2lkIGludGVsX2JhdGNoYnVmZmVyX3Jlc2V0KHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gpOworCisKKy8qIFVubGlrZSBibUJ1ZmZlckRhdGEsIHRoaXMgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBidWZmZXIgYmUgbWFwcGVkLgorICogQ29uc2lkZXIgaXQgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB3cmFwcGluZyBtdWx0cGxlCisgKiBpbnRlbF9idWZmZXJfZHdvcmQoKSBjYWxscy4KKyAqLwordm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9kYXRhKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgR0x1aW50IGJ5dGVzLAorCQkJICAgIGVudW0gY2xpcHJlY3RfbW9kZSBjbGlwcmVjdF9tb2RlKTsKKwordm9pZCBpbnRlbF9iYXRjaGJ1ZmZlcl9yZWxlYXNlX3NwYWNlKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGJ5dGVzKTsKKworR0xib29sZWFuIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfcmVsb2Moc3RydWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaV9ibyAqYnVmZmVyLAorCQkJCSAgICAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCisJCQkJICAgICAgIHVpbnQzMl90IHdyaXRlX2RvbWFpbiwKKwkJCQkgICAgICAgdWludDMyX3Qgb2Zmc2V0KTsKKworLyogSW5saW5lIGZ1bmN0aW9ucyAtIG1pZ2h0IGFjdHVhbGx5IGJlIGJldHRlciBvZmYgd2l0aCB0aGVzZQorICogbm9uLWlubGluZWQuICBDZXJ0YWlubHkgYmV0dGVyIG9mZiBzd2l0Y2hpbmcgYWxsIGNvbW1hbmQgcGFja2V0cyB0bworICogYmUgcGFzc2VkIGFzIHN0cnVjdHMgcmF0aGVyIHRoYW4gZHdvcmRzLCBidXQgdGhhdCdzIGEgbGl0dGxlIGJpdCBvZgorICogd29yay4uLgorICovCitzdGF0aWMgSU5MSU5FIEdMaW50CitpbnRlbF9iYXRjaGJ1ZmZlcl9zcGFjZShzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoKQoreworICAgcmV0dXJuIChiYXRjaC0+c2l6ZSAtIEJBVENIX1JFU0VSVkVEKSAtIChiYXRjaC0+cHRyIC0gYmF0Y2gtPm1hcCk7Cit9CisKKworc3RhdGljIElOTElORSB2b2lkCitpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X2R3b3JkKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsIEdMdWludCBkd29yZCkKK3sKKyAgIGFzc2VydChiYXRjaC0+bWFwKTsKKyAgIGFzc2VydChpbnRlbF9iYXRjaGJ1ZmZlcl9zcGFjZShiYXRjaCkgPj0gNCk7CisgICAqKEdMdWludCAqKSAoYmF0Y2gtPnB0cikgPSBkd29yZDsKKyAgIGJhdGNoLT5wdHIgKz0gNDsKK30KKworc3RhdGljIElOTElORSB2b2lkCitpbnRlbF9iYXRjaGJ1ZmZlcl9yZXF1aXJlX3NwYWNlKHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBzeiwKKwkJCQllbnVtIGNsaXByZWN0X21vZGUgY2xpcHJlY3RfbW9kZSkKK3sKKyAgIGFzc2VydChzeiA8IGJhdGNoLT5zaXplIC0gOCk7CisgICBpZiAoaW50ZWxfYmF0Y2hidWZmZXJfc3BhY2UoYmF0Y2gpIDwgc3opCisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChiYXRjaCk7CisKKyAgIGlmIChjbGlwcmVjdF9tb2RlICE9IElHTk9SRV9DTElQUkVDVFMpIHsKKyAgICAgIGlmIChiYXRjaC0+Y2xpcHJlY3RfbW9kZSA9PSBJR05PUkVfQ0xJUFJFQ1RTKSB7CisJIGJhdGNoLT5jbGlwcmVjdF9tb2RlID0gY2xpcHJlY3RfbW9kZTsKKyAgICAgIH0gZWxzZSB7CisJIGlmIChiYXRjaC0+Y2xpcHJlY3RfbW9kZSAhPSBjbGlwcmVjdF9tb2RlKSB7CisJICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGJhdGNoKTsKKwkgICAgYmF0Y2gtPmNsaXByZWN0X21vZGUgPSBjbGlwcmVjdF9tb2RlOworCSB9CisgICAgICB9CisgICB9Cit9CisKKy8qIEhlcmUgYXJlIHRoZSBjcnVzdHkgb2xkIG1hY3JvcywgdG8gYmUgcmVtb3ZlZDoKKyAqLworI2RlZmluZSBCQVRDSF9MT0NBTFMKKworI2RlZmluZSBCRUdJTl9CQVRDSChuLCBjbGlwcmVjdF9tb2RlKSBkbyB7CQkJCVwKKyAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoaW50ZWwtPmJhdGNoLCAobikqNCwgY2xpcHJlY3RfbW9kZSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUX0JBVENIKGQpICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X2R3b3JkKGludGVsLT5iYXRjaCwgZCkKKworI2RlZmluZSBPVVRfUkVMT0MoYnVmLCByZWFkX2RvbWFpbnMsIHdyaXRlX2RvbWFpbiwgZGVsdGEpIGRvIHsJCVwKKyAgIGFzc2VydCgoZGVsdGEpID49IDApOwkJCQkJCVwKKyAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfcmVsb2MoaW50ZWwtPmJhdGNoLCBidWYsCQkJXAorCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLCBkZWx0YSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURWQU5DRV9CQVRDSCgpIGRvIHsgfSB3aGlsZSgwKQorCisKK3N0YXRpYyBJTkxJTkUgdm9pZAoraW50ZWxfYmF0Y2hidWZmZXJfZW1pdF9taV9mbHVzaChzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoKQoreworICAgaW50ZWxfYmF0Y2hidWZmZXJfcmVxdWlyZV9zcGFjZShiYXRjaCwgNCwgSUdOT1JFX0NMSVBSRUNUUyk7CisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X2R3b3JkKGJhdGNoLCBNSV9GTFVTSCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmxpdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjlhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9ibGl0LmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJlbnVtcy5oIgorCisjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmZmVycy5oIgorI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKKyNpbmNsdWRlICJpbnRlbF9yZWcuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX0JMSVQKKworLyoqCisgKiBDb3B5IHRoZSBiYWNrIGNvbG9yIGJ1ZmZlciB0byB0aGUgZnJvbnQgY29sb3IgYnVmZmVyLiAKKyAqIFVzZWQgZm9yIFN3YXBCdWZmZXJzKCkuCisgKi8KK3ZvaWQKK2ludGVsQ29weUJ1ZmZlcihjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2LAorICAgICAgICAgICAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHJlY3QpCit7CisKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbDsKKyAgIGNvbnN0IGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW47CisKKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGFzc2VydChkUHJpdik7CisKKyAgIGludGVsID0gaW50ZWxTY3JlZW5Db250ZXh0KGRQcml2LT5kcmlTY3JlZW5Qcml2LT5wcml2YXRlKTsKKyAgIGlmICghaW50ZWwpCisgICAgICByZXR1cm47CisKKyAgIGludGVsU2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOworCisgICAvKiBUaGUgTE9DS19IQVJEV0FSRSBpcyByZXF1aXJlZCBmb3IgdGhlIGNsaXByZWN0cy4gIEJ1ZmZlciBvZmZzZXRzCisgICAgKiBzaG91bGQgd29yayByZWdhcmRsZXNzLgorICAgICovCisgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaWYgKGRQcml2ICYmIGRQcml2LT5udW1DbGlwUmVjdHMpIHsKKyAgICAgIHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSBkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKyAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnNyYywgKmRzdDsKKyAgICAgIGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCAqcGJveCA9IGRQcml2LT5wQ2xpcFJlY3RzOworICAgICAgaW50IGNwcDsKKyAgICAgIGludCBzcmNfcGl0Y2gsIGRzdF9waXRjaDsKKyAgICAgIHVuc2lnbmVkIHNob3J0IHNyY194LCBzcmNfeTsKKyAgICAgIGludCBCUjEzLCBDTUQ7CisgICAgICBpbnQgaTsKKyAgICAgIGRyaV9ibyAqYXBlcl9hcnJheVszXTsKKworICAgICAgc3JjID0gaW50ZWxfZ2V0X3JiX3JlZ2lvbigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9CQUNLX0xFRlQpOworICAgICAgZHN0ID0gaW50ZWxfZ2V0X3JiX3JlZ2lvbigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9GUk9OVF9MRUZUKTsKKworICAgICAgc3JjX3BpdGNoID0gc3JjLT5waXRjaCAqIHNyYy0+Y3BwOworICAgICAgZHN0X3BpdGNoID0gZHN0LT5waXRjaCAqIGRzdC0+Y3BwOworCisgICAgICBjcHAgPSBzcmMtPmNwcDsKKworICAgICAgQVNTRVJUKGludGVsX2ZiKTsKKyAgICAgIEFTU0VSVChpbnRlbF9mYi0+QmFzZS5OYW1lID09IDApOyAgICAvKiBOb3QgYSB1c2VyLWNyZWF0ZWQgRkJPICovCisgICAgICBBU1NFUlQoc3JjKTsKKyAgICAgIEFTU0VSVChkc3QpOworICAgICAgQVNTRVJUKHNyYy0+Y3BwID09IGRzdC0+Y3BwKTsKKworICAgICAgaWYgKGNwcCA9PSAyKSB7CisJIEJSMTMgPSAoMHhDQyA8PCAxNikgfCAoMSA8PCAyNCk7CisJIENNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQ7CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgQlIxMyA9ICgweENDIDw8IDE2KSB8ICgxIDw8IDI0KSB8ICgxIDw8IDI1KTsKKwkgQ01EID0gWFlfU1JDX0NPUFlfQkxUX0NNRCB8IFhZX0JMVF9XUklURV9BTFBIQSB8IFhZX0JMVF9XUklURV9SR0I7CisgICAgICB9CisKKyNpZm5kZWYgSTkxNQorICAgICAgaWYgKHNyYy0+dGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKwkgQ01EIHw9IFhZX1NSQ19USUxFRDsKKwkgc3JjX3BpdGNoIC89IDQ7CisgICAgICB9CisgICAgICBpZiAoZHN0LT50aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworCSBDTUQgfD0gWFlfRFNUX1RJTEVEOworCSBkc3RfcGl0Y2ggLz0gNDsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgLyogZG8gc3BhY2UvY2xpcHJlY3RzIGNoZWNrIGJlZm9yZSBnb2luZyBhbnkgZnVydGhlciAqLworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfcmVxdWlyZV9zcGFjZShpbnRlbC0+YmF0Y2gsIDggKiA0LAorCQkJCSAgICAgIFJFRkVSRU5DRVNfQ0xJUFJFQ1RTKTsKKyAgIGFnYWluOgorICAgICAgYXBlcl9hcnJheVswXSA9IGludGVsLT5iYXRjaC0+YnVmOworICAgICAgYXBlcl9hcnJheVsxXSA9IGRzdC0+YnVmZmVyOworICAgICAgYXBlcl9hcnJheVsyXSA9IHNyYy0+YnVmZmVyOworCisgICAgICBpZiAoZHJpX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZShhcGVyX2FycmF5LCAzKSAhPSAwKSB7CisJaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKKwlnb3RvIGFnYWluOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrLCBwYm94KyspIHsKKwkgZHJtX2NsaXBfcmVjdF90IGJveCA9ICpwYm94OworCisJIGlmIChyZWN0KSB7CisJICAgIGlmICghaW50ZWxfaW50ZXJzZWN0X2NsaXByZWN0cygmYm94LCAmYm94LCByZWN0KSkKKwkgICAgICAgY29udGludWU7CisJIH0KKworCSBpZiAoYm94LngxID49IGJveC54MiB8fAorCSAgICAgYm94LnkxID49IGJveC55MikKKwkgICAgY29udGludWU7CisKKwkgYXNzZXJ0KGJveC54MSA8IGJveC54Mik7CisJIGFzc2VydChib3gueTEgPCBib3gueTIpOworCSBzcmNfeCA9IGJveC54MSAtIGRQcml2LT54ICsgZFByaXYtPmJhY2tYOworCSBzcmNfeSA9IGJveC55MSAtIGRQcml2LT55ICsgZFByaXYtPmJhY2tZOworCisJIEJFR0lOX0JBVENIKDgsIFJFRkVSRU5DRVNfQ0xJUFJFQ1RTKTsKKwkgT1VUX0JBVENIKENNRCk7CisJIE9VVF9CQVRDSChCUjEzIHwgZHN0X3BpdGNoKTsKKwkgT1VUX0JBVENIKChib3gueTEgPDwgMTYpIHwgYm94LngxKTsKKwkgT1VUX0JBVENIKChib3gueTIgPDwgMTYpIHwgYm94LngyKTsKKworCSBPVVRfUkVMT0MoZHN0LT5idWZmZXIsCisJCSAgIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisJCSAgIDApOworCSBPVVRfQkFUQ0goKHNyY195IDw8IDE2KSB8IHNyY194KTsKKwkgT1VUX0JBVENIKHNyY19waXRjaCk7CisJIE9VVF9SRUxPQyhzcmMtPmJ1ZmZlciwKKwkJICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgMCwKKwkJICAgMCk7CisJIEFEVkFOQ0VfQkFUQ0goKTsKKyAgICAgIH0KKworICAgICAgLyogRmx1c2ggdGhlIHJlbmRlcmluZyBhbmQgdGhlIGJhdGNoIHNvIHRoYXQgdGhlIHJlc3VsdHMgYWxsIGxhbmQgb24gdGhlCisgICAgICAgKiBzY3JlZW4gaW4gYSB0aW1lbHkgZmFzaGlvbi4KKyAgICAgICAqLworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZW1pdF9taV9mbHVzaChpbnRlbC0+YmF0Y2gpOworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKKyAgIH0KKworICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKK30KKworCisKKwordm9pZAoraW50ZWxFbWl0RmlsbEJsaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgIEdMdWludCBjcHAsCisJCSAgR0xzaG9ydCBkc3RfcGl0Y2gsCisJCSAgZHJpX2JvICpkc3RfYnVmZmVyLAorCQkgIEdMdWludCBkc3Rfb2Zmc2V0LAorCQkgIHVpbnQzMl90IGRzdF90aWxpbmcsCisJCSAgR0xzaG9ydCB4LCBHTHNob3J0IHksCisJCSAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCisJCSAgR0x1aW50IGNvbG9yKQoreworICAgR0x1aW50IEJSMTMsIENNRDsKKyAgIEJBVENIX0xPQ0FMUzsKKworICAgZHN0X3BpdGNoICo9IGNwcDsKKworICAgc3dpdGNoIChjcHApIHsKKyAgIGNhc2UgMToKKyAgIGNhc2UgMjoKKyAgIGNhc2UgMzoKKyAgICAgIEJSMTMgPSAoMHhGMCA8PCAxNikgfCAoMSA8PCAyNCk7CisgICAgICBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOworICAgICAgYnJlYWs7CisgICBjYXNlIDQ6CisgICAgICBCUjEzID0gKDB4RjAgPDwgMTYpIHwgKDEgPDwgMjQpIHwgKDEgPDwgMjUpOworICAgICAgQ01EID0gWFlfQ09MT1JfQkxUX0NNRCB8IFhZX0JMVF9XUklURV9BTFBIQSB8IFhZX0JMVF9XUklURV9SR0I7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICB9CisjaWZuZGVmIEk5MTUKKyAgIGlmIChkc3RfdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKyAgICAgIENNRCB8PSBYWV9EU1RfVElMRUQ7CisgICAgICBkc3RfcGl0Y2ggLz0gNDsKKyAgIH0KKyNlbmRpZgorCisgICBEQkcoIiVzIGRzdDpidWYoJXApLyVkKyVkICVkLCVkIHN6OiVkeCVkXG4iLAorICAgICAgIF9fRlVOQ1RJT05fXywgZHN0X2J1ZmZlciwgZHN0X3BpdGNoLCBkc3Rfb2Zmc2V0LCB4LCB5LCB3LCBoKTsKKworICAgYXNzZXJ0KHcgPiAwKTsKKyAgIGFzc2VydChoID4gMCk7CisKKyAgIEJFR0lOX0JBVENIKDYsIE5PX0xPT1BfQ0xJUFJFQ1RTKTsKKyAgIE9VVF9CQVRDSChDTUQpOworICAgT1VUX0JBVENIKEJSMTMgfCBkc3RfcGl0Y2gpOworICAgT1VUX0JBVENIKCh5IDw8IDE2KSB8IHgpOworICAgT1VUX0JBVENIKCgoeSArIGgpIDw8IDE2KSB8ICh4ICsgdykpOworICAgT1VUX1JFTE9DKGRzdF9idWZmZXIsCisJICAgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAorCSAgICAgZHN0X29mZnNldCk7CisgICBPVVRfQkFUQ0goY29sb3IpOworICAgQURWQU5DRV9CQVRDSCgpOworfQorCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9yYXN0ZXJfb3AoR0xlbnVtIGxvZ2ljb3ApCit7CisgICBzd2l0Y2gobG9naWNvcCkgeworICAgY2FzZSBHTF9DTEVBUjogcmV0dXJuIDB4MDA7CisgICBjYXNlIEdMX0FORDogcmV0dXJuIDB4ODg7CisgICBjYXNlIEdMX0FORF9SRVZFUlNFOiByZXR1cm4gMHg0NDsKKyAgIGNhc2UgR0xfQ09QWTogcmV0dXJuIDB4Q0M7CisgICBjYXNlIEdMX0FORF9JTlZFUlRFRDogcmV0dXJuIDB4MjI7CisgICBjYXNlIEdMX05PT1A6IHJldHVybiAweEFBOworICAgY2FzZSBHTF9YT1I6IHJldHVybiAweDY2OworICAgY2FzZSBHTF9PUjogcmV0dXJuIDB4RUU7CisgICBjYXNlIEdMX05PUjogcmV0dXJuIDB4MTE7CisgICBjYXNlIEdMX0VRVUlWOiByZXR1cm4gMHg5OTsKKyAgIGNhc2UgR0xfSU5WRVJUOiByZXR1cm4gMHg1NTsKKyAgIGNhc2UgR0xfT1JfUkVWRVJTRTogcmV0dXJuIDB4REQ7CisgICBjYXNlIEdMX0NPUFlfSU5WRVJURUQ6IHJldHVybiAweDMzOworICAgY2FzZSBHTF9PUl9JTlZFUlRFRDogcmV0dXJuIDB4QkI7CisgICBjYXNlIEdMX05BTkQ6IHJldHVybiAweDc3OworICAgY2FzZSBHTF9TRVQ6IHJldHVybiAweEZGOworICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICB9Cit9CisKKworLyogQ29weSBCaXRCbHQKKyAqLwordm9pZAoraW50ZWxFbWl0Q29weUJsaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgIEdMdWludCBjcHAsCisJCSAgR0xzaG9ydCBzcmNfcGl0Y2gsCisJCSAgZHJpX2JvICpzcmNfYnVmZmVyLAorCQkgIEdMdWludCBzcmNfb2Zmc2V0LAorCQkgIHVpbnQzMl90IHNyY190aWxpbmcsCisJCSAgR0xzaG9ydCBkc3RfcGl0Y2gsCisJCSAgZHJpX2JvICpkc3RfYnVmZmVyLAorCQkgIEdMdWludCBkc3Rfb2Zmc2V0LAorCQkgIHVpbnQzMl90IGRzdF90aWxpbmcsCisJCSAgR0xzaG9ydCBzcmNfeCwgR0xzaG9ydCBzcmNfeSwKKwkJICBHTHNob3J0IGRzdF94LCBHTHNob3J0IGRzdF95LAorCQkgIEdMc2hvcnQgdywgR0xzaG9ydCBoLAorCQkgIEdMZW51bSBsb2dpY19vcCkKK3sKKyAgIEdMdWludCBDTUQsIEJSMTM7CisgICBpbnQgZHN0X3kyID0gZHN0X3kgKyBoOworICAgaW50IGRzdF94MiA9IGRzdF94ICsgdzsKKyAgIGRyaV9ibyAqYXBlcl9hcnJheVszXTsKKyAgIEJBVENIX0xPQ0FMUzsKKworICAgLyogZG8gc3BhY2UvY2xpcHJlY3RzIGNoZWNrIGJlZm9yZSBnb2luZyBhbnkgZnVydGhlciAqLworICAgaW50ZWxfYmF0Y2hidWZmZXJfcmVxdWlyZV9zcGFjZShpbnRlbC0+YmF0Y2gsIDggKiA0LCBOT19MT09QX0NMSVBSRUNUUyk7CisgYWdhaW46CisgICBhcGVyX2FycmF5WzBdID0gaW50ZWwtPmJhdGNoLT5idWY7CisgICBhcGVyX2FycmF5WzFdID0gZHN0X2J1ZmZlcjsKKyAgIGFwZXJfYXJyYXlbMl0gPSBzcmNfYnVmZmVyOworCisgICBpZiAoZHJpX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZShhcGVyX2FycmF5LCAzKSAhPSAwKSB7CisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChpbnRlbC0+YmF0Y2gpOworICAgICAgZ290byBhZ2FpbjsKKyAgIH0KKworICAgREJHKCIlcyBzcmM6YnVmKCVwKS8lZCslZCAlZCwlZCBkc3Q6YnVmKCVwKS8lZCslZCAlZCwlZCBzejolZHglZFxuIiwKKyAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgc3JjX2J1ZmZlciwgc3JjX3BpdGNoLCBzcmNfb2Zmc2V0LCBzcmNfeCwgc3JjX3ksCisgICAgICAgZHN0X2J1ZmZlciwgZHN0X3BpdGNoLCBkc3Rfb2Zmc2V0LCBkc3RfeCwgZHN0X3ksIHcsIGgpOworCisgICBzcmNfcGl0Y2ggKj0gY3BwOworICAgZHN0X3BpdGNoICo9IGNwcDsKKworICAgQlIxMyA9IHRyYW5zbGF0ZV9yYXN0ZXJfb3AobG9naWNfb3ApIDw8IDE2OworCisgICBzd2l0Y2ggKGNwcCkgeworICAgY2FzZSAxOgorICAgY2FzZSAyOgorICAgY2FzZSAzOgorICAgICAgQlIxMyB8PSAoMSA8PCAyNCk7CisgICAgICBDTUQgPSBYWV9TUkNfQ09QWV9CTFRfQ01EOworICAgICAgYnJlYWs7CisgICBjYXNlIDQ6CisgICAgICBCUjEzIHw9ICgxIDw8IDI0KSB8ICgxIDw8IDI1KTsKKyAgICAgIENNRCA9IFhZX1NSQ19DT1BZX0JMVF9DTUQgfCBYWV9CTFRfV1JJVEVfQUxQSEEgfCBYWV9CTFRfV1JJVEVfUkdCOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICAgfQorCisjaWZuZGVmIEk5MTUKKyAgIGlmIChkc3RfdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKyAgICAgIENNRCB8PSBYWV9EU1RfVElMRUQ7CisgICAgICBkc3RfcGl0Y2ggLz0gNDsKKyAgIH0KKyAgIGlmIChzcmNfdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKyAgICAgIENNRCB8PSBYWV9TUkNfVElMRUQ7CisgICAgICBzcmNfcGl0Y2ggLz0gNDsKKyAgIH0KKyNlbmRpZgorCisgICBpZiAoZHN0X3kyIDw9IGRzdF95IHx8IGRzdF94MiA8PSBkc3RfeCkgeworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBJbml0aWFsIHkgdmFsdWVzIGRvbid0IHNlZW0gdG8gd29yayB3aXRoIG5lZ2F0aXZlIHBpdGNoZXMuICBJZgorICAgICogd2UgYWRqdXN0IHRoZSBvZmZzZXRzIG1hbnVhbGx5IChiZWxvdyksIGl0IHNlZW1zIHRvIHdvcmsgZmluZS4KKyAgICAqCisgICAgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYWx3YXlzIGFkanVzdCwgdGhlIGhhcmR3YXJlIGRvZXNuJ3QKKyAgICAqIGtub3cgd2hpY2ggYmxpdCBkaXJlY3Rpb25zIHRvIHVzZSwgc28gb3ZlcmxhcHBpbmcgY29weXBpeGVscyBnZXQKKyAgICAqIHRoZSB3cm9uZyByZXN1bHQuCisgICAgKi8KKyAgIGlmIChkc3RfcGl0Y2ggPiAwICYmIHNyY19waXRjaCA+IDApIHsKKyAgICAgIGFzc2VydChkc3RfeCA8IGRzdF94Mik7CisgICAgICBhc3NlcnQoZHN0X3kgPCBkc3RfeTIpOworCisgICAgICBCRUdJTl9CQVRDSCg4LCBOT19MT09QX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goQ01EKTsKKyAgICAgIE9VVF9CQVRDSChCUjEzIHwgZHN0X3BpdGNoKTsKKyAgICAgIE9VVF9CQVRDSCgoZHN0X3kgPDwgMTYpIHwgZHN0X3gpOworICAgICAgT1VUX0JBVENIKChkc3RfeTIgPDwgMTYpIHwgZHN0X3gyKTsKKyAgICAgIE9VVF9SRUxPQyhkc3RfYnVmZmVyLAorCQlJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAorCQlkc3Rfb2Zmc2V0KTsKKyAgICAgIE9VVF9CQVRDSCgoc3JjX3kgPDwgMTYpIHwgc3JjX3gpOworICAgICAgT1VUX0JBVENIKHNyY19waXRjaCk7CisgICAgICBPVVRfUkVMT0Moc3JjX2J1ZmZlciwKKwkJSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgMCwKKwkJc3JjX29mZnNldCk7CisgICAgICBBRFZBTkNFX0JBVENIKCk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGFzc2VydChkc3RfeCA8IGRzdF94Mik7CisgICAgICBhc3NlcnQoaCA+IDApOworCisgICAgICBCRUdJTl9CQVRDSCg4LCBOT19MT09QX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0goQ01EKTsKKyAgICAgIE9VVF9CQVRDSChCUjEzIHwgKCh1aW50MTZfdClkc3RfcGl0Y2gpKTsKKyAgICAgIE9VVF9CQVRDSCgoMCA8PCAxNikgfCBkc3RfeCk7CisgICAgICBPVVRfQkFUQ0goKGggPDwgMTYpIHwgZHN0X3gyKTsKKyAgICAgIE9VVF9SRUxPQyhkc3RfYnVmZmVyLAorCQlJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAorCQlkc3Rfb2Zmc2V0ICsgZHN0X3kgKiBkc3RfcGl0Y2gpOworICAgICAgT1VUX0JBVENIKCgwIDw8IDE2KSB8IHNyY194KTsKKyAgICAgIE9VVF9CQVRDSChzcmNfcGl0Y2gpOworICAgICAgT1VUX1JFTE9DKHNyY19idWZmZXIsCisJCUk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIDAsCisJCXNyY19vZmZzZXQgKyBzcmNfeSAqIHNyY19waXRjaCk7CisgICAgICBBRFZBTkNFX0JBVENIKCk7CisgICB9CisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X21pX2ZsdXNoKGludGVsLT5iYXRjaCk7Cit9CisKKworLyoqCisgKiBVc2UgYmxpdHRpbmcgdG8gY2xlYXIgdGhlIHJlbmRlcmJ1ZmZlcnMgbmFtZWQgYnkgJ2ZsYWdzJy4KKyAqIE5vdGU6IHdlIGNhbid0IHVzZSB0aGUgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlcyBmaWVsZAorICogc2luY2UgdGhhdCBtaWdodCBpbmNsdWRlIHNvZnR3YXJlIHJlbmRlcmJ1ZmZlcnMgb3IgcmVuZGVyYnVmZmVycworICogd2hpY2ggd2UncmUgY2xlYXJpbmcgd2l0aCB0cmlhbmdsZXMuCisgKiBccGFyYW0gbWFzayAgYml0bWFzayBvZiBCVUZGRVJfQklUXyogdmFsdWVzIGluZGljYXRpbmcgYnVmZmVycyB0byBjbGVhcgorICovCit2b2lkCitpbnRlbENsZWFyV2l0aEJsaXQoR0xjb250ZXh0ICpjdHgsIEdMYml0ZmllbGQgbWFzaykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPkRyYXdCdWZmZXI7CisgICBHTHVpbnQgY2xlYXJfZGVwdGg7CisgICBHTGJpdGZpZWxkIHNraXBCdWZmZXJzID0gMDsKKyAgIEJBVENIX0xPQ0FMUzsKKworICAgLyoKKyAgICAqIENvbXB1dGUgdmFsdWVzIGZvciBjbGVhcmluZyB0aGUgYnVmZmVycy4KKyAgICAqLworICAgY2xlYXJfZGVwdGggPSAwOworICAgaWYgKG1hc2sgJiBCVUZGRVJfQklUX0RFUFRIKSB7CisgICAgICBjbGVhcl9kZXB0aCA9IChHTHVpbnQpIChmYi0+X0RlcHRoTWF4ICogY3R4LT5EZXB0aC5DbGVhcik7CisgICB9CisgICBpZiAobWFzayAmIEJVRkZFUl9CSVRfU1RFTkNJTCkgeworICAgICAgY2xlYXJfZGVwdGggfD0gKGN0eC0+U3RlbmNpbC5DbGVhciAmIDB4ZmYpIDw8IDI0OworICAgfQorCisgICAvKiBJZiBjbGVhcmluZyBib3RoIGRlcHRoIGFuZCBzdGVuY2lsLCBza2lwIEJVRkZFUl9CSVRfU1RFTkNJTCBpbgorICAgICogdGhlIGxvb3AgYmVsb3cuCisgICAgKi8KKyAgIGlmICgobWFzayAmIEJVRkZFUl9CSVRfREVQVEgpICYmIChtYXNrICYgQlVGRkVSX0JJVF9TVEVOQ0lMKSkgeworICAgICAgc2tpcEJ1ZmZlcnMgPSBCVUZGRVJfQklUX1NURU5DSUw7CisgICB9CisKKyAgIC8qIFhYWCBNb3ZlIHRoaXMgZmx1c2gvbG9jayBpbnRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uYWw/ICovCisgICBpbnRlbEZsdXNoKCZpbnRlbC0+Y3R4KTsKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoaW50ZWwtPm51bUNsaXBSZWN0cykgeworICAgICAgR0xpbnQgY3gsIGN5LCBjdywgY2g7CisgICAgICBkcm1fY2xpcF9yZWN0X3QgY2xlYXI7CisgICAgICBpbnQgaTsKKworICAgICAgLyogR2V0IGNsZWFyIGJvdW5kcyBhZnRlciBsb2NraW5nICovCisgICAgICBjeCA9IGZiLT5fWG1pbjsKKyAgICAgIGN5ID0gZmItPl9ZbWluOworICAgICAgY3cgPSBmYi0+X1htYXggLSBjeDsKKyAgICAgIGNoID0gZmItPl9ZbWF4IC0gY3k7CisKKyAgICAgIGlmIChmYi0+TmFtZSA9PSAwKSB7CisgICAgICAgICAvKiBjbGVhcmluZyBhIHdpbmRvdyAqLworCisgICAgICAgICAvKiBmbGlwIHRvcCB0byBib3R0b20gKi8KKyAgICAgICAgIGNsZWFyLngxID0gY3ggKyBpbnRlbC0+ZHJhd1g7CisgICAgICAgICBjbGVhci55MSA9IGludGVsLT5kcmlEcmF3YWJsZS0+eSArIGludGVsLT5kcmlEcmF3YWJsZS0+aCAtIGN5IC0gY2g7CisgICAgICAgICBjbGVhci54MiA9IGNsZWFyLngxICsgY3c7CisgICAgICAgICBjbGVhci55MiA9IGNsZWFyLnkxICsgY2g7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIGNsZWFyaW5nIEZCTyAqLworICAgICAgICAgYXNzZXJ0KGludGVsLT5udW1DbGlwUmVjdHMgPT0gMSk7CisgICAgICAgICBhc3NlcnQoaW50ZWwtPnBDbGlwUmVjdHMgPT0gJmludGVsLT5mYm9SZWN0KTsKKyAgICAgICAgIGNsZWFyLngxID0gY3g7CisgICAgICAgICBjbGVhci55MSA9IGN5OworICAgICAgICAgY2xlYXIueDIgPSBjbGVhci54MSArIGN3OworICAgICAgICAgY2xlYXIueTIgPSBjbGVhci55MSArIGNoOworICAgICAgICAgLyogbm8gY2hhbmdlIHRvIG1hc2sgKi8KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGludGVsLT5udW1DbGlwUmVjdHM7IGkrKykgeworICAgICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmaW50ZWwtPnBDbGlwUmVjdHNbaV07CisgICAgICAgICBkcm1fY2xpcF9yZWN0X3QgYjsKKyAgICAgICAgIEdMdWludCBidWY7CisgICAgICAgICBHTHVpbnQgY2xlYXJNYXNrID0gbWFzazsgICAgICAvKiB1c2UgY29weSwgc2luY2Ugd2UgbW9kaWZ5IGl0IGJlbG93ICovCisgICAgICAgICBHTGJvb2xlYW4gYWxsID0gKGN3ID09IGZiLT5XaWR0aCAmJiBjaCA9PSBmYi0+SGVpZ2h0KTsKKworICAgICAgICAgaWYgKCFhbGwpIHsKKyAgICAgICAgICAgIGludGVsX2ludGVyc2VjdF9jbGlwcmVjdHMoJmIsICZjbGVhciwgYm94KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYiA9ICpib3g7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChiLngxID49IGIueDIgfHwgYi55MSA+PSBiLnkyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGlmICgwKQorICAgICAgICAgICAgX21lc2FfcHJpbnRmKCJjbGVhciAlZCwlZC4uJWQsJWQsIG1hc2sgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYi54MSwgYi55MSwgYi54MiwgYi55MiwgbWFzayk7CisKKyAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgcmVuZGVyYnVmZmVycyAqLworICAgICAgICAgZm9yIChidWYgPSAwOyBidWYgPCBCVUZGRVJfQ09VTlQgJiYgY2xlYXJNYXNrOyBidWYrKykgeworICAgICAgICAgICAgY29uc3QgR0xiaXRmaWVsZCBidWZCaXQgPSAxIDw8IGJ1ZjsKKyAgICAgICAgICAgIGlmICgoY2xlYXJNYXNrICYgYnVmQml0KSAmJiAhKGJ1ZkJpdCAmIHNraXBCdWZmZXJzKSkgeworICAgICAgICAgICAgICAgLyogT0ssIGNsZWFyIHRoaXMgcmVuZGVyYnVmZmVyICovCisgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICppcmJfcmVnaW9uID0KKwkJICBpbnRlbF9nZXRfcmJfcmVnaW9uKGZiLCBidWYpOworICAgICAgICAgICAgICAgZHJpX2JvICp3cml0ZV9idWZmZXIgPQorICAgICAgICAgICAgICAgICAgaW50ZWxfcmVnaW9uX2J1ZmZlcihpbnRlbCwgaXJiX3JlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsID8gSU5URUxfV1JJVEVfRlVMTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX1dSSVRFX1BBUlQpOworCisgICAgICAgICAgICAgICBHTHVpbnQgY2xlYXJWYWw7CisgICAgICAgICAgICAgICBHTGludCBwaXRjaCwgY3BwOworICAgICAgICAgICAgICAgR0x1aW50IEJSMTMsIENNRDsKKworICAgICAgICAgICAgICAgQVNTRVJUKGlyYl9yZWdpb24pOworCisgICAgICAgICAgICAgICBwaXRjaCA9IGlyYl9yZWdpb24tPnBpdGNoOworICAgICAgICAgICAgICAgY3BwID0gaXJiX3JlZ2lvbi0+Y3BwOworCisgICAgICAgICAgICAgICBEQkcoIiVzIGRzdDpidWYoJXApLyVkKyVkICVkLCVkIHN6OiVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBpcmJfcmVnaW9uLT5idWZmZXIsIChwaXRjaCAqIGNwcCksCisgICAgICAgICAgICAgICAgICAgaXJiX3JlZ2lvbi0+ZHJhd19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgYi54MSwgYi55MSwgYi54MiAtIGIueDEsIGIueTIgLSBiLnkxKTsKKworCSAgICAgICBCUjEzID0gMHhmMCA8PCAxNjsKKwkgICAgICAgQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKworICAgICAgICAgICAgICAgLyogU2V0dXAgdGhlIGJsaXQgY29tbWFuZCAqLworICAgICAgICAgICAgICAgaWYgKGNwcCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICBCUjEzIHw9ICgxIDw8IDI0KSB8ICgxIDw8IDI1KTsKKyAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gQlVGRkVSX0RFUFRIIHx8IGJ1ZiA9PSBCVUZGRVJfU1RFTkNJTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyTWFzayAmIEJVRkZFUl9CSVRfREVQVEgpCisgICAgICAgICAgICAgICAgICAgICAgICBDTUQgfD0gWFlfQkxUX1dSSVRFX1JHQjsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhck1hc2sgJiBCVUZGRVJfQklUX1NURU5DSUwpCisgICAgICAgICAgICAgICAgICAgICAgICBDTUQgfD0gWFlfQkxUX1dSSVRFX0FMUEhBOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhcmluZyBSR0JBICovCisgICAgICAgICAgICAgICAgICAgICBDTUQgfD0gWFlfQkxUX1dSSVRFX0FMUEhBIHwgWFlfQkxUX1dSSVRFX1JHQjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgQVNTRVJUKGNwcCA9PSAyIHx8IGNwcCA9PSAwKTsKKyAgICAgICAgICAgICAgICAgIEJSMTMgfD0gKDEgPDwgMjQpOworICAgICAgICAgICAgICAgfQorCisjaWZuZGVmIEk5MTUKKwkgICAgICAgaWYgKGlyYl9yZWdpb24tPnRpbGluZyAhPSBJOTE1X1RJTElOR19OT05FKSB7CisJCSAgQ01EIHw9IFhZX0RTVF9USUxFRDsKKwkJICBwaXRjaCAvPSA0OworCSAgICAgICB9CisjZW5kaWYKKwkgICAgICAgQlIxMyB8PSAocGl0Y2ggKiBjcHApOworCisgICAgICAgICAgICAgICBpZiAoYnVmID09IEJVRkZFUl9ERVBUSCB8fCBidWYgPT0gQlVGRkVSX1NURU5DSUwpIHsKKyAgICAgICAgICAgICAgICAgIGNsZWFyVmFsID0gY2xlYXJfZGVwdGg7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGNsZWFyVmFsID0gKGNwcCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgPyBpbnRlbC0+Q2xlYXJDb2xvcjg4ODggOiBpbnRlbC0+Q2xlYXJDb2xvcjU2NTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICBfbWVzYV9kZWJ1ZyhjdHgsICJoYXJkd2FyZSBibGl0IGNsZWFyIGJ1ZiAlZCByYiBpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGJ1ZiwgaXJiLT5CYXNlLk5hbWUpOworICAgICAgICAgICAgICAgICovCisJICAgICAgIGludGVsX3dhaXRfZmxpcHMoaW50ZWwpOworCisgICAgICAgICAgICAgICBhc3NlcnQoYi54MSA8IGIueDIpOworICAgICAgICAgICAgICAgYXNzZXJ0KGIueTEgPCBiLnkyKTsKKworICAgICAgICAgICAgICAgQkVHSU5fQkFUQ0goNiwgUkVGRVJFTkNFU19DTElQUkVDVFMpOworICAgICAgICAgICAgICAgT1VUX0JBVENIKENNRCk7CisgICAgICAgICAgICAgICBPVVRfQkFUQ0goQlIxMyk7CisgICAgICAgICAgICAgICBPVVRfQkFUQ0goKGIueTEgPDwgMTYpIHwgYi54MSk7CisgICAgICAgICAgICAgICBPVVRfQkFUQ0goKGIueTIgPDwgMTYpIHwgYi54Mik7CisgICAgICAgICAgICAgICBPVVRfUkVMT0Mod3JpdGVfYnVmZmVyLAorCQkJIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXJiX3JlZ2lvbi0+ZHJhd19vZmZzZXQpOworICAgICAgICAgICAgICAgT1VUX0JBVENIKGNsZWFyVmFsKTsKKyAgICAgICAgICAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKKyAgICAgICAgICAgICAgIGNsZWFyTWFzayAmPSB+YnVmQml0OyAgICAvKiB0dXJuIG9mZiBiaXQsIGZvciBmYXN0ZXIgbG9vcCBleGl0ICovCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X21pX2ZsdXNoKGludGVsLT5iYXRjaCk7CisgICB9CisKKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Cit9CisKK3ZvaWQKK2ludGVsRW1pdEltbWVkaWF0ZUNvbG9yRXhwYW5kQmxpdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkJICBHTHVpbnQgY3BwLAorCQkJCSAgR0x1Ynl0ZSAqc3JjX2JpdHMsIEdMdWludCBzcmNfc2l6ZSwKKwkJCQkgIEdMdWludCBmZ19jb2xvciwKKwkJCQkgIEdMc2hvcnQgZHN0X3BpdGNoLAorCQkJCSAgZHJpX2JvICpkc3RfYnVmZmVyLAorCQkJCSAgR0x1aW50IGRzdF9vZmZzZXQsCisJCQkJICB1aW50MzJfdCBkc3RfdGlsaW5nLAorCQkJCSAgR0xzaG9ydCB4LCBHTHNob3J0IHksCisJCQkJICBHTHNob3J0IHcsIEdMc2hvcnQgaCwKKwkJCQkgIEdMZW51bSBsb2dpY19vcCkKK3sKKyAgIGludCBkd29yZHMgPSBBTElHTihzcmNfc2l6ZSwgOCkgLyA0OworICAgdWludDMyX3Qgb3Bjb2RlLCBicjEzLCBibGl0X2NtZDsKKworICAgYXNzZXJ0KCBsb2dpY19vcCAtIEdMX0NMRUFSID49IDAgKTsKKyAgIGFzc2VydCggbG9naWNfb3AgLSBHTF9DTEVBUiA8IDB4MTAgKTsKKworICAgaWYgKHcgPCAwIHx8IGggPCAwKQorICAgICAgcmV0dXJuOworCisgICBkc3RfcGl0Y2ggKj0gY3BwOworCisgICBEQkcoIiVzIGRzdDpidWYoJXApLyVkKyVkICVkLCVkIHN6OiVkeCVkLCAlZCBieXRlcyAlZCBkd29yZHNcbiIsCisgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgIGRzdF9idWZmZXIsIGRzdF9waXRjaCwgZHN0X29mZnNldCwgeCwgeSwgdywgaCwgc3JjX3NpemUsIGR3b3Jkcyk7CisKKyAgIGludGVsX2JhdGNoYnVmZmVyX3JlcXVpcmVfc3BhY2UoIGludGVsLT5iYXRjaCwKKwkJCQkgICAgKDggKiA0KSArCisJCQkJICAgICgzICogNCkgKworCQkJCSAgICBkd29yZHMsCisJCQkJICAgIFJFRkVSRU5DRVNfQ0xJUFJFQ1RTICk7CisKKyAgIG9wY29kZSA9IFhZX1NFVFVQX0JMVF9DTUQ7CisgICBpZiAoY3BwID09IDQpCisgICAgICBvcGNvZGUgfD0gWFlfQkxUX1dSSVRFX0FMUEhBIHwgWFlfQkxUX1dSSVRFX1JHQjsKKyNpZm5kZWYgSTkxNQorICAgaWYgKGRzdF90aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworICAgICAgb3Bjb2RlIHw9IFhZX0RTVF9USUxFRDsKKyAgICAgIGRzdF9waXRjaCAvPSA0OworICAgfQorI2VuZGlmCisKKyAgIGJyMTMgPSBkc3RfcGl0Y2ggfCAodHJhbnNsYXRlX3Jhc3Rlcl9vcChsb2dpY19vcCkgPDwgMTYpIHwgKDEgPDwgMjkpOworICAgaWYgKGNwcCA9PSAyKQorICAgICAgYnIxMyB8PSBCUjEzXzU2NTsKKyAgIGVsc2UKKyAgICAgIGJyMTMgfD0gQlIxM184ODg4OworCisgICBibGl0X2NtZCA9IFhZX1RFWFRfSU1NRURJQVRFX0JMSVRfQ01EIHwgWFlfVEVYVF9CWVRFX1BBQ0tFRDsgLyogcGFja2luZz8gKi8KKyAgIGlmIChkc3RfdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpCisgICAgICBibGl0X2NtZCB8PSBYWV9EU1RfVElMRUQ7CisKKyAgIEJFR0lOX0JBVENIKDggKyAzLCBSRUZFUkVOQ0VTX0NMSVBSRUNUUyk7CisgICBPVVRfQkFUQ0gob3Bjb2RlKTsKKyAgIE9VVF9CQVRDSChicjEzKTsKKyAgIE9VVF9CQVRDSCgoMCA8PCAxNikgfCAwKTsgLyogY2xpcCB4MSwgeTEgKi8KKyAgIE9VVF9CQVRDSCgoMTAwIDw8IDE2KSB8IDEwMCk7IC8qIGNsaXAgeDIsIHkyICovCisgICBPVVRfUkVMT0MoZHN0X2J1ZmZlciwKKwkgICAgIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCisJICAgICBkc3Rfb2Zmc2V0KTsKKyAgIE9VVF9CQVRDSCgwKTsgLyogYmcgKi8KKyAgIE9VVF9CQVRDSChmZ19jb2xvcik7IC8qIGZnICovCisgICBPVVRfQkFUQ0goMCk7IC8qIHBhdHRlcm4gYmFzZSBhZGRyICovCisKKyAgIE9VVF9CQVRDSChibGl0X2NtZCB8ICgoMyAtIDIpICsgZHdvcmRzKSk7CisgICBPVVRfQkFUQ0goKHkgPDwgMTYpIHwgeCk7CisgICBPVVRfQkFUQ0goKCh5ICsgaCkgPDwgMTYpIHwgKHggKyB3KSk7CisgICBBRFZBTkNFX0JBVENIKCk7CisKKyAgIGludGVsX2JhdGNoYnVmZmVyX2RhdGEoIGludGVsLT5iYXRjaCwKKwkJCSAgIHNyY19iaXRzLAorCQkJICAgZHdvcmRzICogNCwKKwkJCSAgIFJFRkVSRU5DRVNfQ0xJUFJFQ1RTICk7CisKKyAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goaW50ZWwtPmJhdGNoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2JsaXQuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2JsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgxY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYmxpdC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5URUxfQkxJVF9ICisjZGVmaW5lIElOVEVMX0JMSVRfSAorCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCisjaW5jbHVkZSAiZHJpX2J1Zm1nci5oIgorCitleHRlcm4gdm9pZCBpbnRlbENvcHlCdWZmZXIoY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKiBkcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiByZWN0KTsKKworZXh0ZXJuIHZvaWQgaW50ZWxDbGVhcldpdGhCbGl0KEdMY29udGV4dCAqIGN0eCwgR0xiaXRmaWVsZCBtYXNrKTsKKworZXh0ZXJuIHZvaWQgaW50ZWxFbWl0Q29weUJsaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2hvcnQgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpX2JvICpzcmNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHNyY19vZmZzZXQsCisJCQkgICAgICB1aW50MzJfdCBzcmNfdGlsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaG9ydCBkc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmlfYm8gKmRzdF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X29mZnNldCwKKwkJCSAgICAgIHVpbnQzMl90IGRzdF90aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNob3J0IHNyY3gsIEdMc2hvcnQgc3JjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2hvcnQgZHN0eCwgR0xzaG9ydCBkc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCisJCQkgICAgICBHTGVudW0gbG9naWNvcCApOworCitleHRlcm4gdm9pZCBpbnRlbEVtaXRGaWxsQmxpdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgY3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaG9ydCBkc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmlfYm8gKmRzdF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X29mZnNldCwKKwkJCSAgICAgIHVpbnQzMl90IGRzdF90aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNob3J0IHgsIEdMc2hvcnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2hvcnQgdywgR0xzaG9ydCBoLCBHTHVpbnQgY29sb3IpOworCit2b2lkCitpbnRlbEVtaXRJbW1lZGlhdGVDb2xvckV4cGFuZEJsaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJCSAgR0x1aW50IGNwcCwKKwkJCQkgIEdMdWJ5dGUgKnNyY19iaXRzLCBHTHVpbnQgc3JjX3NpemUsCisJCQkJICBHTHVpbnQgZmdfY29sb3IsCisJCQkJICBHTHNob3J0IGRzdF9waXRjaCwKKwkJCQkgIGRyaV9ibyAqZHN0X2J1ZmZlciwKKwkJCQkgIEdMdWludCBkc3Rfb2Zmc2V0LAorCQkJCSAgdWludDMyX3QgZHN0X3RpbGluZywKKwkJCQkgIEdMc2hvcnQgeCwgR0xzaG9ydCB5LAorCQkJCSAgR0xzaG9ydCB3LCBHTHNob3J0IGgsCisJCQkJICBHTGVudW0gbG9naWNfb3ApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2J1ZmZlcl9vYmplY3RzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9idWZmZXJfb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjNhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9idWZmZXJfb2JqZWN0cy5jCkBAIC0wLDAgKzEsMjg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAiYnVmZmVyb2JqLmgiCisKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmZmVyX29iamVjdHMuaCIKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKyNpbmNsdWRlICJkcmlfYnVmbWdyLmgiCisKK3N0YXRpYyBHTGJvb2xlYW4gaW50ZWxfYnVmZmVyb2JqX3VubWFwKEdMY29udGV4dCAqIGN0eCwKKwkJCQkgICAgICAgR0xlbnVtIHRhcmdldCwKKwkJCQkgICAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaik7CisKKy8qKiBBbGxvY2F0ZXMgYSBuZXcgZHJpX2JvIHRvIHN0b3JlIHRoZSBkYXRhIGZvciB0aGUgYnVmZmVyIG9iamVjdC4gKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9idWZmZXJvYmpfYWxsb2NfYnVmZmVyKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaikKK3sKKyAgIGludGVsX29iai0+YnVmZmVyID0gZHJpX2JvX2FsbG9jKGludGVsLT5idWZtZ3IsICJidWZmZXJvYmoiLAorCQkJCSAgICBpbnRlbF9vYmotPkJhc2UuU2l6ZSwgNjQpOworfQorCisvKioKKyAqIFRoZXJlIGlzIHNvbWUgZHVwbGljYXRpb24gYmV0d2VlbiBtZXNhJ3MgYnVmZmVyb2JqZWN0cyBhbmQgb3VyCisgKiBidWZtZ3IgYnVmZmVycy4gIEJvdGggaGF2ZSBhbiBpbnRlZ2VyIGhhbmRsZSBhbmQgYSBoYXNodGFibGUgdG8KKyAqIGxvb2t1cCBhbiBvcGFxdWUgc3RydWN0dXJlLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGUgaGFuZGxlcyBhbmQKKyAqIGludGVybmFsIHN0cnVjdHVyZSB3aGVyZSBzb21laG93IHNoYXJlZC4KKyAqLworc3RhdGljIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICoKK2ludGVsX2J1ZmZlcm9ial9hbGxvYyhHTGNvbnRleHQgKiBjdHgsIEdMdWludCBuYW1lLCBHTGVudW0gdGFyZ2V0KQoreworICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKm9iaiA9IENBTExPQ19TVFJVQ1QoaW50ZWxfYnVmZmVyX29iamVjdCk7CisKKyAgIF9tZXNhX2luaXRpYWxpemVfYnVmZmVyX29iamVjdCgmb2JqLT5CYXNlLCBuYW1lLCB0YXJnZXQpOworCisgICBvYmotPmJ1ZmZlciA9IE5VTEw7CisKKyAgIHJldHVybiAmb2JqLT5CYXNlOworfQorCisvKiBCcmVhayB0aGUgQ09XIHRpZSB0byB0aGUgcmVnaW9uLiAgVGhlIHJlZ2lvbiBnZXRzIHRvIGtlZXAgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2ludGVsX2J1ZmZlcm9ial9yZWxlYXNlX3JlZ2lvbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaikKK3sKKyAgIGFzc2VydChpbnRlbF9vYmotPnJlZ2lvbi0+YnVmZmVyID09IGludGVsX29iai0+YnVmZmVyKTsKKyAgIGludGVsX29iai0+cmVnaW9uLT5wYm8gPSBOVUxMOworICAgaW50ZWxfb2JqLT5yZWdpb24gPSBOVUxMOworCisgICBkcmlfYm9fdW5yZWZlcmVuY2UoaW50ZWxfb2JqLT5idWZmZXIpOworICAgaW50ZWxfb2JqLT5idWZmZXIgPSBOVUxMOworfQorCisvKiBCcmVhayB0aGUgQ09XIHRpZSB0byB0aGUgcmVnaW9uLiAgQm90aCB0aGUgcGJvIGFuZCB0aGUgcmVnaW9uIGVuZAorICogdXAgd2l0aCBhIGNvcHkgb2YgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2ludGVsX2J1ZmZlcm9ial9jb3coc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqaW50ZWxfb2JqKQoreworICAgYXNzZXJ0KGludGVsX29iai0+cmVnaW9uKTsKKyAgIGludGVsX3JlZ2lvbl9jb3coaW50ZWwsIGludGVsX29iai0+cmVnaW9uKTsKK30KKworCisvKioKKyAqIERlYWxsb2NhdGUvZnJlZSBhIHZlcnRleC9waXhlbCBidWZmZXIgb2JqZWN0LgorICogQ2FsbGVkIHZpYSBnbERlbGV0ZUJ1ZmZlcnNBUkIoKS4KKyAqLworc3RhdGljIHZvaWQKK2ludGVsX2J1ZmZlcm9ial9mcmVlKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7CisKKyAgIGFzc2VydChpbnRlbF9vYmopOworCisgICAvKiBCdWZmZXIgb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSB1bm1hcHBlZCB3aGVuIGRlbGV0aW5nIGFjY29yZGluZworICAgICogdG8gdGhlIHNwZWMuCisgICAgKi8KKyAgIGlmIChvYmotPlBvaW50ZXIpCisgICAgICBpbnRlbF9idWZmZXJvYmpfdW5tYXAoY3R4LCAwLCBvYmopOworCisgICBpZiAoaW50ZWxfb2JqLT5yZWdpb24pIHsKKyAgICAgIGludGVsX2J1ZmZlcm9ial9yZWxlYXNlX3JlZ2lvbihpbnRlbCwgaW50ZWxfb2JqKTsKKyAgIH0KKyAgIGVsc2UgaWYgKGludGVsX29iai0+YnVmZmVyKSB7CisgICAgICBkcmlfYm9fdW5yZWZlcmVuY2UoaW50ZWxfb2JqLT5idWZmZXIpOworICAgfQorCisgICBfbWVzYV9mcmVlKGludGVsX29iaik7Cit9CisKKworCisvKioKKyAqIEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgc3RvcmUgZGF0YSBpbiBhIGJ1ZmZlciBvYmplY3QuICBBbnkgZGF0YSB0aGF0IHdhcworICogcHJldmlvdXNseSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBvYmplY3QgaXMgbG9zdC4gIElmIGRhdGEgaXMgTlVMTCwKKyAqIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCwgYnV0IG5vIGNvcHkgd2lsbCBvY2N1ci4KKyAqIENhbGxlZCB2aWEgZ2xCdWZmZXJEYXRhQVJCKCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9idWZmZXJvYmpfZGF0YShHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgR0xzaXplaXB0ckFSQiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB1c2FnZSwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7CisKKyAgIGludGVsX29iai0+QmFzZS5TaXplID0gc2l6ZTsKKyAgIGludGVsX29iai0+QmFzZS5Vc2FnZSA9IHVzYWdlOworCisgICAvKiBCdWZmZXIgb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSB1bm1hcHBlZCB3aGVuIGNyZWF0aW5nIG5ldyBkYXRhIGJ1ZmZlcnMKKyAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlYy4KKyAgICAqLworICAgaWYgKG9iai0+UG9pbnRlcikKKyAgICAgIGludGVsX2J1ZmZlcm9ial91bm1hcChjdHgsIDAsIG9iaik7CisKKyAgIGlmIChpbnRlbF9vYmotPnJlZ2lvbikKKyAgICAgIGludGVsX2J1ZmZlcm9ial9yZWxlYXNlX3JlZ2lvbihpbnRlbCwgaW50ZWxfb2JqKTsKKworICAgaWYgKGludGVsX29iai0+YnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIGRyaV9ib191bnJlZmVyZW5jZShpbnRlbF9vYmotPmJ1ZmZlcik7CisgICAgICBpbnRlbF9vYmotPmJ1ZmZlciA9IE5VTEw7CisgICB9CisgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICBpbnRlbF9idWZmZXJvYmpfYWxsb2NfYnVmZmVyKGludGVsLCBpbnRlbF9vYmopOworCisgICAgICBpZiAoZGF0YSAhPSBOVUxMKQorCSBkcmlfYm9fc3ViZGF0YShpbnRlbF9vYmotPmJ1ZmZlciwgMCwgc2l6ZSwgZGF0YSk7CisgICB9Cit9CisKKworLyoqCisgKiBSZXBsYWNlIGRhdGEgaW4gYSBzdWJyYW5nZSBvZiBidWZmZXIgb2JqZWN0LiAgSWYgdGhlIGRhdGEgcmFuZ2UKKyAqIHNwZWNpZmllZCBieSBzaXplICsgb2Zmc2V0IGV4dGVuZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBvcgorICogaWYgZGF0YSBpcyBOVUxMLCBubyBjb3B5IGlzIHBlcmZvcm1lZC4KKyAqIENhbGxlZCB2aWEgZ2xCdWZmZXJTdWJEYXRhQVJCKCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9idWZmZXJvYmpfc3ViZGF0YShHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnRwdHJBUkIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaXB0ckFSQiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICogZGF0YSwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7CisKKyAgIGFzc2VydChpbnRlbF9vYmopOworCisgICBpZiAoaW50ZWxfb2JqLT5yZWdpb24pCisgICAgICBpbnRlbF9idWZmZXJvYmpfY293KGludGVsLCBpbnRlbF9vYmopOworCisgICBkcmlfYm9fc3ViZGF0YShpbnRlbF9vYmotPmJ1ZmZlciwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKK30KKworCisvKioKKyAqIENhbGxlZCB2aWEgZ2xHZXRCdWZmZXJTdWJEYXRhQVJCKCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9idWZmZXJvYmpfZ2V0X3N1YmRhdGEoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnRwdHJBUkIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWlwdHJBUkIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKiBkYXRhLCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqKQoreworICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaiA9IGludGVsX2J1ZmZlcl9vYmplY3Qob2JqKTsKKworICAgYXNzZXJ0KGludGVsX29iaik7CisgICBkcmlfYm9fZ2V0X3N1YmRhdGEoaW50ZWxfb2JqLT5idWZmZXIsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKKworCisvKioKKyAqIENhbGxlZCB2aWEgZ2xNYXBCdWZmZXJBUkIoKS4KKyAqLworc3RhdGljIHZvaWQgKgoraW50ZWxfYnVmZmVyb2JqX21hcChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSBhY2Nlc3MsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmopCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqaW50ZWxfb2JqID0gaW50ZWxfYnVmZmVyX29iamVjdChvYmopOworCisgICAvKiBYWFg6IFRyYW5zbGF0ZSBhY2Nlc3MgdG8gZmxhZ3MgYXJnIGJlbG93OgorICAgICovCisgICBhc3NlcnQoaW50ZWxfb2JqKTsKKworICAgaWYgKGludGVsX29iai0+cmVnaW9uKQorICAgICAgaW50ZWxfYnVmZmVyb2JqX2NvdyhpbnRlbCwgaW50ZWxfb2JqKTsKKworICAgaWYgKGludGVsX29iai0+YnVmZmVyID09IE5VTEwpIHsKKyAgICAgIG9iai0+UG9pbnRlciA9IE5VTEw7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgZHJpX2JvX21hcChpbnRlbF9vYmotPmJ1ZmZlciwgR0xfVFJVRSk7CisgICBvYmotPlBvaW50ZXIgPSBpbnRlbF9vYmotPmJ1ZmZlci0+dmlydHVhbDsKKyAgIHJldHVybiBvYmotPlBvaW50ZXI7Cit9CisKKworLyoqCisgKiBDYWxsZWQgdmlhIGdsTWFwQnVmZmVyQVJCKCkuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX2J1ZmZlcm9ial91bm1hcChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKK3sKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmogPSBpbnRlbF9idWZmZXJfb2JqZWN0KG9iaik7CisKKyAgIGFzc2VydChpbnRlbF9vYmopOworICAgaWYgKGludGVsX29iai0+YnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIGFzc2VydChvYmotPlBvaW50ZXIpOworICAgICAgZHJpX2JvX3VubWFwKGludGVsX29iai0+YnVmZmVyKTsKKyAgICAgIG9iai0+UG9pbnRlciA9IE5VTEw7CisgICB9CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworZHJpX2JvICoKK2ludGVsX2J1ZmZlcm9ial9idWZmZXIoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqaW50ZWxfb2JqLCBHTHVpbnQgZmxhZykKK3sKKyAgIGlmIChpbnRlbF9vYmotPnJlZ2lvbikgeworICAgICAgaWYgKGZsYWcgPT0gSU5URUxfV1JJVEVfUEFSVCkKKyAgICAgICAgIGludGVsX2J1ZmZlcm9ial9jb3coaW50ZWwsIGludGVsX29iaik7CisgICAgICBlbHNlIGlmIChmbGFnID09IElOVEVMX1dSSVRFX0ZVTEwpIHsKKyAgICAgICAgIGludGVsX2J1ZmZlcm9ial9yZWxlYXNlX3JlZ2lvbihpbnRlbCwgaW50ZWxfb2JqKTsKKwkgaW50ZWxfYnVmZmVyb2JqX2FsbG9jX2J1ZmZlcihpbnRlbCwgaW50ZWxfb2JqKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGludGVsX29iai0+YnVmZmVyOworfQorCit2b2lkCitpbnRlbF9idWZmZXJvYmpfaW5pdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OworCisgICBjdHgtPkRyaXZlci5OZXdCdWZmZXJPYmplY3QgPSBpbnRlbF9idWZmZXJvYmpfYWxsb2M7CisgICBjdHgtPkRyaXZlci5EZWxldGVCdWZmZXIgPSBpbnRlbF9idWZmZXJvYmpfZnJlZTsKKyAgIGN0eC0+RHJpdmVyLkJ1ZmZlckRhdGEgPSBpbnRlbF9idWZmZXJvYmpfZGF0YTsKKyAgIGN0eC0+RHJpdmVyLkJ1ZmZlclN1YkRhdGEgPSBpbnRlbF9idWZmZXJvYmpfc3ViZGF0YTsKKyAgIGN0eC0+RHJpdmVyLkdldEJ1ZmZlclN1YkRhdGEgPSBpbnRlbF9idWZmZXJvYmpfZ2V0X3N1YmRhdGE7CisgICBjdHgtPkRyaXZlci5NYXBCdWZmZXIgPSBpbnRlbF9idWZmZXJvYmpfbWFwOworICAgY3R4LT5Ecml2ZXIuVW5tYXBCdWZmZXIgPSBpbnRlbF9idWZmZXJvYmpfdW5tYXA7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9idWZmZXJfb2JqZWN0cy5oCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIHNyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfYnVmZmVyX29iamVjdHMuaApyZW5hbWUgdG8gc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYnVmZmVyX29iamVjdHMuaAppbmRleCA0YjM4ODAzLi43Y2VjYzMyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2J1ZmZlcl9vYmplY3RzLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfYnVmZmVyX29iamVjdHMuaApAQCAtMSw2ICsxLDYgQEAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCi0gKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwNSBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpAQCAtMzEsMjUgKzMxLDMzIEBACiAjaW5jbHVkZSAibXR5cGVzLmgiCiAKIHN0cnVjdCBpbnRlbF9jb250ZXh0Oworc3RydWN0IGludGVsX3JlZ2lvbjsKIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0OwogCiAKIC8qKgogICogSW50ZWwgdmVydGV4L3BpeGVsIGJ1ZmZlciBvYmplY3QsIGRlcml2ZWQgZnJvbSBNZXNhJ3MgZ2xfYnVmZmVyX29iamVjdC4KICAqLwotc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3Qgeworc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QKK3sKICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0IEJhc2U7Ci0gICBzdHJ1Y3QgYnVmZmVyICpidWZmZXI7ICAgLyogdGhlIGxvdy1sZXZlbCBidWZmZXIgbWFuYWdlcidzIGJ1ZmZlciBoYW5kbGUgKi8KKyAgIGRyaV9ibyAqYnVmZmVyOyAgICAgLyogdGhlIGxvdy1sZXZlbCBidWZmZXIgbWFuYWdlcidzIGJ1ZmZlciBoYW5kbGUgKi8KKworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uOyAvKiBJcyB0aGVyZSBhIHplcm8tY29weSB0ZXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIChwaXhlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG9iamVjdD8gKi8KIH07CiAKIAogLyogR2V0IHRoZSBibSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIGEgR0wgYnVmZmVyb2JqZWN0OgogICovCi1zdHJ1Y3QgYnVmZmVyICppbnRlbF9idWZmZXJvYmpfYnVmZmVyKCBjb25zdCBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqb2JqICk7CitkcmlfYm8gKmludGVsX2J1ZmZlcm9ial9idWZmZXIoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0CisJCQkgICAgICAgKm9iaiwgR0x1aW50IGZsYWcpOwogCiAvKiBIb29rIHRoZSBidWZmZXJvYmplY3QgaW1wbGVtZW50YXRpb24gaW50byBtZXNhOiAKICAqLwotdm9pZCBpbnRlbF9idWZmZXJvYmpfaW5pdCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7Cit2b2lkIGludGVsX2J1ZmZlcm9ial9pbml0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCk7CiAKIAogCkBAIC01OCwxMyArNjYsMjEgQEAKICAqIHRoZSBOYW1lID09IDAgdGVzdCBpcyB0aGUgb25seSB3YXkgdG8gaWRlbnRpZnkgdGhlbSBhbmQgYXZvaWQKICAqIGNhc3RpbmcgdGhlbSBlcnJvbmVvdXNseSB0byBvdXIgc3RydWN0cy4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqCi1pbnRlbF9idWZmZXJfb2JqZWN0KCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqICkKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKgoraW50ZWxfYnVmZmVyX29iamVjdChzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqKQogewogICAgaWYgKG9iai0+TmFtZSkKLSAgICAgIHJldHVybiAoc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKilvYmo7CisgICAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICopIG9iajsKICAgIGVsc2UKICAgICAgIHJldHVybiBOVUxMOwogfQogCisvKiBIZWxwZXJzIGZvciB6ZXJvY29weSBpbWFnZSB1cGxvYWRzLiAgU2VlIGFsc28gaW50ZWxfcmVnaW9ucy5oOgorICovCit2b2lkIGludGVsX2J1ZmZlcm9ial9jb3coc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICppbnRlbF9vYmopOwordm9pZCBpbnRlbF9idWZmZXJvYmpfcmVsZWFzZV9yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKmludGVsX29iaik7CisKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9idWZmZXJzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9idWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczNTJlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2J1ZmZlcnMuYwpAQCAtMCwwICsxLDEwOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCisjaW5jbHVkZSAiaW50ZWxfZGVwdGhzdGVuY2lsLmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZHJpcmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCisjaW5jbHVkZSAidmJsYW5rLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKworLyogVGhpcyBibG9jayBjYW4gYmUgcmVtb3ZlZCB3aGVuIGxpYmRybSA+PSAyLjMuMSBpcyByZXF1aXJlZCAqLworCisjaWZuZGVmIERSTV9JT0NUTF9JOTE1X0ZMSVAKKworI2RlZmluZSBEUk1fVkJMQU5LX0ZMSVAgMHg4MDAwMDAwCisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2ZsaXAgeworICAgaW50IHBpcGVzOworfSBkcm1faTkxNV9mbGlwX3Q7CisKKyN1bmRlZiBEUk1fSU9DVExfSTkxNV9GTElQCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0ZMSVAgRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxJUCwgXAorCQkJCSAgICBkcm1faTkxNV9mbGlwX3QpCisKKyNlbmRpZgorCisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19CTElUCisKKy8qKgorICogWFhYIG1vdmUgdGhpcyBpbnRvIGEgbmV3IGRyaS9jb21tb24vY2xpcHJlY3RzLmMgZmlsZS4KKyAqLworR0xib29sZWFuCitpbnRlbF9pbnRlcnNlY3RfY2xpcHJlY3RzKGRybV9jbGlwX3JlY3RfdCAqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogYikKK3sKKyAgIEdMaW50IGJ4ID0gYi0+eDE7CisgICBHTGludCBieSA9IGItPnkxOworICAgR0xpbnQgYncgPSBiLT54MiAtIGJ4OworICAgR0xpbnQgYmggPSBiLT55MiAtIGJ5OworCisgICBpZiAoYnggPCBhLT54MSkKKyAgICAgIGJ3IC09IGEtPngxIC0gYngsIGJ4ID0gYS0+eDE7CisgICBpZiAoYnkgPCBhLT55MSkKKyAgICAgIGJoIC09IGEtPnkxIC0gYnksIGJ5ID0gYS0+eTE7CisgICBpZiAoYnggKyBidyA+IGEtPngyKQorICAgICAgYncgPSBhLT54MiAtIGJ4OworICAgaWYgKGJ5ICsgYmggPiBhLT55MikKKyAgICAgIGJoID0gYS0+eTIgLSBieTsKKyAgIGlmIChidyA8PSAwKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgaWYgKGJoIDw9IDApCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGRzdC0+eDEgPSBieDsKKyAgIGRzdC0+eTEgPSBieTsKKyAgIGRzdC0+eDIgPSBieCArIGJ3OworICAgZHN0LT55MiA9IGJ5ICsgYmg7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisvKioKKyAqIFJldHVybiBwb2ludGVyIHRvIGN1cnJlbnQgY29sb3IgZHJhd2luZyByZWdpb24sIG9yIE5VTEwuCisgKi8KK3N0cnVjdCBpbnRlbF9yZWdpb24gKgoraW50ZWxfZHJhd2J1Zl9yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiQ29sb3IgPQorICAgICAgaW50ZWxfcmVuZGVyYnVmZmVyKGludGVsLT5jdHguRHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0pOworICAgaWYgKGlyYkNvbG9yKQorICAgICAgcmV0dXJuIGlyYkNvbG9yLT5yZWdpb247CisgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZXR1cm4gcG9pbnRlciB0byBjdXJyZW50IGNvbG9yIHJlYWRpbmcgcmVnaW9uLCBvciBOVUxMLgorICovCitzdHJ1Y3QgaW50ZWxfcmVnaW9uICoKK2ludGVsX3JlYWRidWZfcmVnaW9uKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYgorICAgICAgPSBpbnRlbF9yZW5kZXJidWZmZXIoaW50ZWwtPmN0eC5SZWFkQnVmZmVyLT5fQ29sb3JSZWFkQnVmZmVyKTsKKyAgIGlmIChpcmIpCisgICAgICByZXR1cm4gaXJiLT5yZWdpb247CisgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKK30KKworCisKKy8qKgorICogVXBkYXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzIGZvciByZW5kZXJpbmcgdG8gYSB1c2VyLWNyZWF0ZWQgRkJPOgorICogICBpbnRlbC0+bnVtQ2xpcFJlY3RzCisgKiAgIGludGVsLT5wQ2xpcFJlY3RzCisgKiAgIGludGVsLT5kcmF3WAorICogICBpbnRlbC0+ZHJhd1kKKyAqLworc3RhdGljIHZvaWQKK2ludGVsU2V0UmVuZGVyYnVmZmVyQ2xpcFJlY3RzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIGFzc2VydChpbnRlbC0+Y3R4LkRyYXdCdWZmZXItPldpZHRoID4gMCk7CisgICBhc3NlcnQoaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5IZWlnaHQgPiAwKTsKKyAgIGludGVsLT5mYm9SZWN0LngxID0gMDsKKyAgIGludGVsLT5mYm9SZWN0LnkxID0gMDsKKyAgIGludGVsLT5mYm9SZWN0LngyID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5XaWR0aDsKKyAgIGludGVsLT5mYm9SZWN0LnkyID0gaW50ZWwtPmN0eC5EcmF3QnVmZmVyLT5IZWlnaHQ7CisgICBpbnRlbC0+bnVtQ2xpcFJlY3RzID0gMTsKKyAgIGludGVsLT5wQ2xpcFJlY3RzID0gJmludGVsLT5mYm9SZWN0OworICAgaW50ZWwtPmRyYXdYID0gMDsKKyAgIGludGVsLT5kcmF3WSA9IDA7Cit9CisKKworLyoqCisgKiBBcyBhYm92ZSwgYnV0IGZvciByZW5kZXJpbmcgdG8gZnJvbnQgYnVmZmVyIG9mIGEgd2luZG93LgorICogXHNhIGludGVsU2V0UmVuZGVyYnVmZmVyQ2xpcFJlY3RzCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbFNldEZyb250Q2xpcFJlY3RzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKworICAgaWYgKCFkUHJpdikKKyAgICAgIHJldHVybjsKKworICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IGRQcml2LT5udW1DbGlwUmVjdHM7CisgICBpbnRlbC0+cENsaXBSZWN0cyA9IGRQcml2LT5wQ2xpcFJlY3RzOworICAgaW50ZWwtPmRyYXdYID0gZFByaXYtPng7CisgICBpbnRlbC0+ZHJhd1kgPSBkUHJpdi0+eTsKK30KKworCisvKioKKyAqIEFzIGFib3ZlLCBidXQgZm9yIHJlbmRlcmluZyB0byBiYWNrIGJ1ZmZlciBvZiBhIHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQKK2ludGVsU2V0QmFja0NsaXBSZWN0cyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7CisgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCisgICBpZiAoIWRQcml2KQorICAgICAgcmV0dXJuOworCisgICBpbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworCisgICBpZiAoaW50ZWxfZmItPnBmX2FjdGl2ZSB8fCBkUHJpdi0+bnVtQmFja0NsaXBSZWN0cyA9PSAwKSB7CisgICAgICAvKiB1c2UgdGhlIGZyb250IGNsaXAgcmVjdHMgKi8KKyAgICAgIGludGVsLT5udW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOworICAgICAgaW50ZWwtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKKyAgICAgIGludGVsLT5kcmF3WCA9IGRQcml2LT54OworICAgICAgaW50ZWwtPmRyYXdZID0gZFByaXYtPnk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIHVzZSB0aGUgYmFjayBjbGlwIHJlY3RzICovCisgICAgICBpbnRlbC0+bnVtQ2xpcFJlY3RzID0gZFByaXYtPm51bUJhY2tDbGlwUmVjdHM7CisgICAgICBpbnRlbC0+cENsaXBSZWN0cyA9IGRQcml2LT5wQmFja0NsaXBSZWN0czsKKyAgICAgIGludGVsLT5kcmF3WCA9IGRQcml2LT5iYWNrWDsKKyAgICAgIGludGVsLT5kcmF3WSA9IGRQcml2LT5iYWNrWTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2ludGVsVXBkYXRlUGFnZUZsaXBwaW5nKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCUdMaW50IGFyZWFBLCBHTGludCBhcmVhQikKK3sKKyAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKyAgIHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSBkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIEdMYm9vbGVhbiBwZl9hY3RpdmU7CisgICBHTGludCBwZl9wbGFuZXM7CisKKyAgIC8qIFVwZGF0ZSBwYWdlIGZsaXBwaW5nIGluZm8gKi8KKyAgIHBmX3BsYW5lcyA9IDA7CisKKyAgIGlmIChhcmVhQSA+IDApCisgICAgICBwZl9wbGFuZXMgfD0gMTsKKworICAgaWYgKGFyZWFCID4gMCkKKyAgICAgIHBmX3BsYW5lcyB8PSAyOworCisgICBpbnRlbF9mYi0+cGZfY3VycmVudF9wYWdlID0gKGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlID4+CisJCQkJKGludGVsX2ZiLT5wZl9wbGFuZXMgJiAweDIpKSAmIDB4MzsKKworICAgaW50ZWxfZmItPnBmX251bV9wYWdlcyA9IGludGVsLT5pbnRlbFNjcmVlbi0+dGhpcmQuaGFuZGxlID8gMyA6IDI7CisKKyAgIHBmX2FjdGl2ZSA9IHBmX3BsYW5lcyAmJiAocGZfcGxhbmVzICYgaW50ZWwtPnNhcmVhLT5wZl9hY3RpdmUpID09IHBmX3BsYW5lczsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfTE9DSykKKyAgICAgIGlmIChwZl9hY3RpdmUgIT0gaW50ZWxfZmItPnBmX2FjdGl2ZSkKKwkgX21lc2FfcHJpbnRmKCIlcyAtIFBhZ2UgZmxpcHBpbmcgJXNhY3RpdmVcbiIsIF9fcHJvZ25hbWUsCisJCSAgICAgIHBmX2FjdGl2ZSA/ICIiIDogImluIik7CisKKyAgIGlmIChwZl9hY3RpdmUpIHsKKyAgICAgIC8qIFN5bmMgcGFnZXMgYmV0d2VlbiBwbGFuZXMgaWYgZmxpcHBpbmcgb24gYm90aCBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICBpZiAocGZfcGxhbmVzID09IDB4MyAmJiBwZl9wbGFuZXMgIT0gaW50ZWxfZmItPnBmX3BsYW5lcyAmJgorCSAgKGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlICYgMHgzKSAhPQorCSAgKCgoaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UpID4+IDIpICYgMHgzKSkgeworCSBkcm1faTkxNV9mbGlwX3QgZmxpcDsKKworCSBpZiAoaW50ZWxfZmItPnBmX2N1cnJlbnRfcGFnZSA9PQorCSAgICAgKGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlICYgMHgzKSkgeworCSAgICAvKiBYWFg6IFRoaXMgaXMgdWdseSwgYnV0IGVtaXR0aW5nIHR3byBmbGlwcyAnaW4gYSByb3cnIGNhbiBjYXVzZQorCSAgICAgKiBsb2NrdXBzIGZvciB1bmtub3duIHJlYXNvbnMuCisJICAgICAqLworCSAgICBpbnRlbC0+c2FyZWEtPnBmX2N1cnJlbnRfcGFnZSA9CisJICAgICAgIGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlICYgMHgzOworCSAgICBpbnRlbC0+c2FyZWEtPnBmX2N1cnJlbnRfcGFnZSB8PQorCSAgICAgICAoKGludGVsX2ZiLT5wZl9jdXJyZW50X3BhZ2UgKyBpbnRlbF9mYi0+cGZfbnVtX3BhZ2VzIC0gMSkgJQorCQlpbnRlbF9mYi0+cGZfbnVtX3BhZ2VzKSA8PCAyOworCisJICAgIGZsaXAucGlwZXMgPSAweDI7CisJIH0gZWxzZSB7CisJICAgIGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlID0KKwkgICAgICAgaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgJiAoMHgzIDw8IDIpOworCSAgICBpbnRlbC0+c2FyZWEtPnBmX2N1cnJlbnRfcGFnZSB8PQorCSAgICAgICAoaW50ZWxfZmItPnBmX2N1cnJlbnRfcGFnZSArIGludGVsX2ZiLT5wZl9udW1fcGFnZXMgLSAxKSAlCisJICAgICAgIGludGVsX2ZiLT5wZl9udW1fcGFnZXM7CisKKwkgICAgZmxpcC5waXBlcyA9IDB4MTsKKwkgfQorCisJIGRybUNvbW1hbmRXcml0ZShpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X0ZMSVAsICZmbGlwLCBzaXplb2YoZmxpcCkpOworICAgICAgfQorCisgICAgICBpbnRlbF9mYi0+cGZfcGxhbmVzID0gcGZfcGxhbmVzOworICAgfQorCisgICBpbnRlbF9mYi0+cGZfYWN0aXZlID0gcGZfYWN0aXZlOworICAgaW50ZWxfZmxpcF9yZW5kZXJidWZmZXJzKGludGVsX2ZiKTsKKyAgIGludGVsX2RyYXdfYnVmZmVyKCZpbnRlbC0+Y3R4LCBpbnRlbC0+Y3R4LkRyYXdCdWZmZXIpOworfQorCisvKioKKyAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGN1cnJlbnRseSBib3VuZCB3aW5kb3cgaXMgbW92ZWQvcmVzaXplZC4KKyAqIFhYWDogYWN0dWFsbHksIGl0IHNlZW1zIHRvIE5PVCBiZSBjYWxsZWQgd2hlbiB0aGUgd2luZG93IGlzIG9ubHkgbW92ZWQgKEJQKS4KKyAqLwordm9pZAoraW50ZWxXaW5kb3dNb3ZlZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OworICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOworICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworCisgICBpZiAoIWludGVsLT5jdHguRHJhd0J1ZmZlcikgeworICAgICAgLyogd2hlbiB3b3VsZCB0aGlzIGhhcHBlbj8gLUJQICovCisgICAgICBpbnRlbFNldEZyb250Q2xpcFJlY3RzKGludGVsKTsKKyAgIH0KKyAgIGVsc2UgaWYgKGludGVsLT5jdHguRHJhd0J1ZmZlci0+TmFtZSAhPSAwKSB7CisgICAgICAvKiBkcmF3aW5nIHRvIHVzZXItY3JlYXRlZCBGQk8gLSBkbyBub3RoaW5nICovCisgICAgICAvKiBDbGlwcmVjdHMgd291bGQgYmUgc2V0IGZyb20gaW50ZWxEcmF3QnVmZmVyKCkgKi8KKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogZHJhd2luZyB0byBhIHdpbmRvdyAqLworICAgICAgc3dpdGNoIChpbnRlbF9mYi0+QmFzZS5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSkgeworICAgICAgY2FzZSBCVUZGRVJfRlJPTlRfTEVGVDoKKyAgICAgICAgIGludGVsU2V0RnJvbnRDbGlwUmVjdHMoaW50ZWwpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6CisgICAgICAgICBpbnRlbFNldEJhY2tDbGlwUmVjdHMoaW50ZWwpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgaW50ZWxTZXRGcm9udENsaXBSZWN0cyhpbnRlbCk7CisgICAgICB9CisJCisgICB9CisKKyAgIGlmICghaW50ZWwtPmludGVsU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZHJpMi5lbmFibGVkICYmCisgICAgICAgaW50ZWwtPmludGVsU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZGR4X3ZlcnNpb24ubWlub3IgPj0gNykgeworICAgICAgdm9sYXRpbGUgc3RydWN0IGRybV9pOTE1X3NhcmVhICpzYXJlYSA9IGludGVsLT5zYXJlYTsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCBkcndfcmVjdCA9IHsgLngxID0gZFByaXYtPngsIC54MiA9IGRQcml2LT54ICsgZFByaXYtPncsCisJCQkJICAgLnkxID0gZFByaXYtPnksIC55MiA9IGRQcml2LT55ICsgZFByaXYtPmggfTsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCBwbGFuZUFfcmVjdCA9IHsgLngxID0gc2FyZWEtPnBsYW5lQV94LCAueTEgPSBzYXJlYS0+cGxhbmVBX3ksCisJCQkJICAgICAueDIgPSBzYXJlYS0+cGxhbmVBX3ggKyBzYXJlYS0+cGxhbmVBX3csCisJCQkJICAgICAueTIgPSBzYXJlYS0+cGxhbmVBX3kgKyBzYXJlYS0+cGxhbmVBX2ggfTsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCBwbGFuZUJfcmVjdCA9IHsgLngxID0gc2FyZWEtPnBsYW5lQl94LCAueTEgPSBzYXJlYS0+cGxhbmVCX3ksCisJCQkJICAgICAueDIgPSBzYXJlYS0+cGxhbmVCX3ggKyBzYXJlYS0+cGxhbmVCX3csCisJCQkJICAgICAueTIgPSBzYXJlYS0+cGxhbmVCX3kgKyBzYXJlYS0+cGxhbmVCX2ggfTsKKyAgICAgIEdMaW50IGFyZWFBID0gZHJpSW50ZXJzZWN0QXJlYSggZHJ3X3JlY3QsIHBsYW5lQV9yZWN0ICk7CisgICAgICBHTGludCBhcmVhQiA9IGRyaUludGVyc2VjdEFyZWEoIGRyd19yZWN0LCBwbGFuZUJfcmVjdCApOworICAgICAgR0x1aW50IGZsYWdzID0gZFByaXYtPnZibEZsYWdzOworCisgICAgICBpbnRlbFVwZGF0ZVBhZ2VGbGlwcGluZyhpbnRlbCwgYXJlYUEsIGFyZWFCKTsKKworICAgICAgLyogVXBkYXRlIHZibGFuayBpbmZvCisgICAgICAgKi8KKyAgICAgIGlmIChhcmVhQiA+IGFyZWFBIHx8IChhcmVhQSA9PSBhcmVhQiAmJiBhcmVhQiA+IDApKSB7CisJIGZsYWdzID0gZFByaXYtPnZibEZsYWdzIHwgVkJMQU5LX0ZMQUdfU0VDT05EQVJZOworICAgICAgfSBlbHNlIHsKKwkgZmxhZ3MgPSBkUHJpdi0+dmJsRmxhZ3MgJiB+VkJMQU5LX0ZMQUdfU0VDT05EQVJZOworICAgICAgfQorCisgICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgY2hhbmdlZCBwaXBlcyAqLworICAgICAgaWYgKGZsYWdzICE9IGRQcml2LT52YmxGbGFncyAmJiBkUHJpdi0+dmJsRmxhZ3MgJiYKKwkgICEoZFByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfTk9fSVJRKSkgeworCSBpbnQ2NF90IGNvdW50OworCSBkcm1WQmxhbmsgdmJsOworCSBpbnQgaTsKKworCSAvKgorCSAgKiBEZWFsIHdpdGggcGFnZSBmbGlwcGluZworCSAgKi8KKwkgdmJsLnJlcXVlc3QudHlwZSA9IERSTV9WQkxBTktfQUJTT0xVVEU7CisKKwkgaWYgKCBkUHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKSB7CisJICAgIHZibC5yZXF1ZXN0LnR5cGUgfD0gRFJNX1ZCTEFOS19TRUNPTkRBUlk7CisJIH0KKworCSBmb3IgKGkgPSAwOyBpIDwgaW50ZWxfZmItPnBmX251bV9wYWdlczsgaSsrKSB7CisJICAgIGlmICghaW50ZWxfZmItPmNvbG9yX3JiW2ldIHx8CisJCShpbnRlbF9mYi0+dmJsX3dhaXRlZCAtIGludGVsX2ZiLT5jb2xvcl9yYltpXS0+dmJsX3BlbmRpbmcpIDw9CisJCSgxPDwyMykpCisJICAgICAgIGNvbnRpbnVlOworCisJICAgIHZibC5yZXF1ZXN0LnNlcXVlbmNlID0gaW50ZWxfZmItPmNvbG9yX3JiW2ldLT52YmxfcGVuZGluZzsKKwkgICAgZHJtV2FpdFZCbGFuayhpbnRlbC0+ZHJpRmQsICZ2YmwpOworCSB9CisKKwkgLyoKKwkgICogVXBkYXRlIG1zY19iYXNlIGZyb20gb2xkIHBpcGUKKwkgICovCisJIGRyaURyYXdhYmxlR2V0TVNDMzIoZFByaXYtPmRyaVNjcmVlblByaXYsIGRQcml2LCAmY291bnQpOworCSBkUHJpdi0+bXNjX2Jhc2UgPSBjb3VudDsKKwkgLyoKKwkgICogVGhlbiBnZXQgbmV3IHZibGFua19iYXNlIGFuZCB2YmxTZXEgdmFsdWVzCisJICAqLworCSBkUHJpdi0+dmJsRmxhZ3MgPSBmbGFnczsKKwkgZHJpR2V0Q3VycmVudFZCbGFuayhkUHJpdik7CisJIGRQcml2LT52YmxhbmtfYmFzZSA9IGRQcml2LT52YmxTZXE7CisKKwkgaW50ZWxfZmItPnZibF93YWl0ZWQgPSBkUHJpdi0+dmJsU2VxOworCisJIGZvciAoaSA9IDA7IGkgPCBpbnRlbF9mYi0+cGZfbnVtX3BhZ2VzOyBpKyspIHsKKwkgICAgaWYgKGludGVsX2ZiLT5jb2xvcl9yYltpXSkKKwkgICAgICAgaW50ZWxfZmItPmNvbG9yX3JiW2ldLT52YmxfcGVuZGluZyA9IGludGVsX2ZiLT52Ymxfd2FpdGVkOworCSB9CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgZFByaXYtPnZibEZsYWdzICY9IH5WQkxBTktfRkxBR19TRUNPTkRBUlk7CisgICB9CisKKyAgIC8qIFVwZGF0ZSBNZXNhJ3Mgbm90aW9uIG9mIHdpbmRvdyBzaXplICovCisgICBkcmlVcGRhdGVGcmFtZWJ1ZmZlclNpemUoY3R4LCBkUHJpdik7CisgICBpbnRlbF9mYi0+QmFzZS5Jbml0aWFsaXplZCA9IEdMX1RSVUU7IC8qIFhYWCByZW1vdmUgc29tZWRheSAqLworCisgICAvKiBVcGRhdGUgaGFyZHdhcmUgc2Npc3NvciAqLworICAgaWYgKGN0eC0+RHJpdmVyLlNjaXNzb3IgIT0gTlVMTCkgeworICAgICAgY3R4LT5Ecml2ZXIuU2Npc3NvcihjdHgsIGN0eC0+U2Npc3Nvci5YLCBjdHgtPlNjaXNzb3IuWSwKKwkJCSAgY3R4LT5TY2lzc29yLldpZHRoLCBjdHgtPlNjaXNzb3IuSGVpZ2h0KTsKKyAgIH0KKworICAgLyogUmUtY2FsY3VsYXRlIHZpZXdwb3J0IHJlbGF0ZWQgc3RhdGUgKi8KKyAgIGlmIChjdHgtPkRyaXZlci5EZXB0aFJhbmdlICE9IE5VTEwpCisgICAgICBjdHgtPkRyaXZlci5EZXB0aFJhbmdlKCBjdHgsIGN0eC0+Vmlld3BvcnQuTmVhciwgY3R4LT5WaWV3cG9ydC5GYXIgKTsKK30KKworCisKKy8qIEEgdHJ1ZSBtZXRhIHZlcnNpb24gb2YgdGhpcyB3b3VsZCBiZSB2ZXJ5IHNpbXBsZSBhbmQgYWRkaXRpb25hbGx5CisgKiBtYWNoaW5lIGluZGVwZW5kZW50LiAgTWF5YmUgd2UnbGwgZ2V0IHRoZXJlIG9uZSBkYXkuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbENsZWFyV2l0aFRyaXMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGJpdGZpZWxkIG1hc2spCit7CisgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OworICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiA9IGN0eC0+RHJhd0J1ZmZlcjsKKyAgIEdMdWludCBidWY7CisKKyAgIGludGVsLT52dGJsLmluc3RhbGxfbWV0YV9zdGF0ZShpbnRlbCk7CisKKyAgIC8qIEJhY2sgYW5kIHN0ZW5jaWwgY2xpcHJlY3RzIGFyZSB0aGUgc2FtZS4gIFRyeSBhbmQgZG8gYm90aAorICAgICogYnVmZmVycyBhdCBvbmNlOgorICAgICovCisgICBpZiAobWFzayAmIChCVUZGRVJfQklUX0JBQ0tfTEVGVCB8IEJVRkZFUl9CSVRfU1RFTkNJTCB8IEJVRkZFUl9CSVRfREVQVEgpKSB7CisgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpiYWNrUmVnaW9uID0KKwkgaW50ZWxfZ2V0X3JiX3JlZ2lvbihmYiwgQlVGRkVSX0JBQ0tfTEVGVCk7CisgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aFJlZ2lvbiA9CisJIGludGVsX2dldF9yYl9yZWdpb24oZmIsIEJVRkZFUl9ERVBUSCk7CisKKyAgICAgIGludGVsLT52dGJsLm1ldGFfZHJhd19yZWdpb24oaW50ZWwsIGJhY2tSZWdpb24sIGRlcHRoUmVnaW9uKTsKKworICAgICAgaWYgKG1hc2sgJiBCVUZGRVJfQklUX0JBQ0tfTEVGVCkKKwkgaW50ZWwtPnZ0YmwubWV0YV9jb2xvcl9tYXNrKGludGVsLCBHTF9UUlVFKTsKKyAgICAgIGVsc2UKKwkgaW50ZWwtPnZ0YmwubWV0YV9jb2xvcl9tYXNrKGludGVsLCBHTF9GQUxTRSk7CisKKyAgICAgIGlmIChtYXNrICYgQlVGRkVSX0JJVF9TVEVOQ0lMKQorCSBpbnRlbC0+dnRibC5tZXRhX3N0ZW5jaWxfcmVwbGFjZShpbnRlbCwKKwkJCQkJICBpbnRlbC0+Y3R4LlN0ZW5jaWwuV3JpdGVNYXNrWzBdLAorCQkJCQkgIGludGVsLT5jdHguU3RlbmNpbC5DbGVhcik7CisgICAgICBlbHNlCisJIGludGVsLT52dGJsLm1ldGFfbm9fc3RlbmNpbF93cml0ZShpbnRlbCk7CisKKyAgICAgIGlmIChtYXNrICYgQlVGRkVSX0JJVF9ERVBUSCkKKwkgaW50ZWwtPnZ0YmwubWV0YV9kZXB0aF9yZXBsYWNlKGludGVsKTsKKyAgICAgIGVsc2UKKwkgaW50ZWwtPnZ0YmwubWV0YV9ub19kZXB0aF93cml0ZShpbnRlbCk7CisKKyAgICAgIGludGVsLT52dGJsLm1ldGFfZHJhd19xdWFkKGludGVsLAorCQkJCSBmYi0+X1htaW4sCisJCQkJIGZiLT5fWG1heCwKKwkJCQkgZmItPl9ZbWluLAorCQkJCSBmYi0+X1ltYXgsCisJCQkJIGludGVsLT5jdHguRGVwdGguQ2xlYXIsCisJCQkJIGludGVsLT5DbGVhckNvbG9yODg4OCwKKwkJCQkgMCwgMCwgMCwgMCk7ICAgLyogdGV4Y29vcmRzICovCisKKyAgICAgIG1hc2sgJj0gfihCVUZGRVJfQklUX0JBQ0tfTEVGVCB8IEJVRkZFUl9CSVRfU1RFTkNJTCB8IEJVRkZFUl9CSVRfREVQVEgpOworICAgfQorCisgICAvKiBjbGVhciB0aGUgcmVtYWluaW5nIChjb2xvcikgcmVuZGVyYnVmZmVycyAqLworICAgZm9yIChidWYgPSAwOyBidWYgPCBCVUZGRVJfQ09VTlQgJiYgbWFzazsgYnVmKyspIHsKKyAgICAgIGNvbnN0IEdMdWludCBidWZCaXQgPSAxIDw8IGJ1ZjsKKyAgICAgIGlmIChtYXNrICYgYnVmQml0KSB7CisJIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYkNvbG9yID0KKwkgICAgaW50ZWxfcmVuZGVyYnVmZmVyKGZiLT5BdHRhY2htZW50W2J1Zl0uUmVuZGVyYnVmZmVyKTsKKworCSBBU1NFUlQoaXJiQ29sb3IpOworCisJIGludGVsLT52dGJsLm1ldGFfbm9fZGVwdGhfd3JpdGUoaW50ZWwpOworCSBpbnRlbC0+dnRibC5tZXRhX25vX3N0ZW5jaWxfd3JpdGUoaW50ZWwpOworCSBpbnRlbC0+dnRibC5tZXRhX2NvbG9yX21hc2soaW50ZWwsIEdMX1RSVUUpOworCSBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcmVnaW9uKGludGVsLCBpcmJDb2xvci0+cmVnaW9uLCBOVUxMKTsKKworCSBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcXVhZChpbnRlbCwKKwkJCQkgICAgZmItPl9YbWluLAorCQkJCSAgICBmYi0+X1htYXgsCisJCQkJICAgIGZiLT5fWW1pbiwKKwkJCQkgICAgZmItPl9ZbWF4LAorCQkJCSAgICAwLCBpbnRlbC0+Q2xlYXJDb2xvcjg4ODgsCisJCQkJICAgIDAsIDAsIDAsIDApOyAgIC8qIHRleGNvb3JkcyAqLworCisJIG1hc2sgJj0gfmJ1ZkJpdDsKKyAgICAgIH0KKyAgIH0KKworICAgaW50ZWwtPnZ0YmwubGVhdmVfbWV0YV9zdGF0ZShpbnRlbCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpidWZmZXJfbmFtZXNbXSA9IHsKKyAgIFtCVUZGRVJfRlJPTlRfTEVGVF0gPSAiZnJvbnQiLAorICAgW0JVRkZFUl9CQUNLX0xFRlRdID0gImJhY2siLAorICAgW0JVRkZFUl9GUk9OVF9SSUdIVF0gPSAiZnJvbnQgcmlnaHQiLAorICAgW0JVRkZFUl9CQUNLX1JJR0hUXSA9ICJiYWNrIHJpZ2h0IiwKKyAgIFtCVUZGRVJfQVVYMF0gPSAiYXV4MCIsCisgICBbQlVGRkVSX0FVWDFdID0gImF1eDEiLAorICAgW0JVRkZFUl9BVVgyXSA9ICJhdXgyIiwKKyAgIFtCVUZGRVJfQVVYM10gPSAiYXV4MyIsCisgICBbQlVGRkVSX0RFUFRIXSA9ICJkZXB0aCIsCisgICBbQlVGRkVSX1NURU5DSUxdID0gInN0ZW5jaWwiLAorICAgW0JVRkZFUl9BQ0NVTV0gPSAiYWNjdW0iLAorICAgW0JVRkZFUl9DT0xPUjBdID0gImNvbG9yMCIsCisgICBbQlVGRkVSX0NPTE9SMV0gPSAiY29sb3IxIiwKKyAgIFtCVUZGRVJfQ09MT1IyXSA9ICJjb2xvcjIiLAorICAgW0JVRkZFUl9DT0xPUjNdID0gImNvbG9yMyIsCisgICBbQlVGRkVSX0NPTE9SNF0gPSAiY29sb3I0IiwKKyAgIFtCVUZGRVJfQ09MT1I1XSA9ICJjb2xvcjUiLAorICAgW0JVRkZFUl9DT0xPUjZdID0gImNvbG9yNiIsCisgICBbQlVGRkVSX0NPTE9SN10gPSAiY29sb3I3IiwKK307CisKKy8qKgorICogQ2FsbGVkIGJ5IGN0eC0+RHJpdmVyLkNsZWFyLgorICovCitzdGF0aWMgdm9pZAoraW50ZWxDbGVhcihHTGNvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBtYXNrKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgY29uc3QgR0x1aW50IGNvbG9yTWFzayA9ICooKEdMdWludCAqKSAmIGN0eC0+Q29sb3IuQ29sb3JNYXNrKTsKKyAgIEdMYml0ZmllbGQgdHJpX21hc2sgPSAwOworICAgR0xiaXRmaWVsZCBibGl0X21hc2sgPSAwOworICAgR0xiaXRmaWVsZCBzd3Jhc3RfbWFzayA9IDA7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOworICAgR0x1aW50IGk7CisKKyAgIGlmICgwKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogSFcgY29sb3IgYnVmZmVycyAoZnJvbnQsIGJhY2ssIGF1eCwgZ2VuZXJpYyBGQk8sIGV0YykgKi8KKyAgIGlmIChjb2xvck1hc2sgPT0gfjApIHsKKyAgICAgIC8qIGNsZWFyIGFsbCBSLEcsQixBICovCisgICAgICAvKiBYWFggRkJPOiBuZWVkIHRvIGNoZWNrIGlmIGNvbG9yYnVmZmVycyBhcmUgc29mdHdhcmUgUkJPcyEgKi8KKyAgICAgIGJsaXRfbWFzayB8PSAobWFzayAmIEJVRkZFUl9CSVRTX0NPTE9SKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogZ2xDb2xvck1hc2sgaW4gZWZmZWN0ICovCisgICAgICB0cmlfbWFzayB8PSAobWFzayAmIEJVRkZFUl9CSVRTX0NPTE9SKTsKKyAgIH0KKworICAgLyogSFcgc3RlbmNpbCAqLworICAgaWYgKG1hc2sgJiBCVUZGRVJfQklUX1NURU5DSUwpIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9yZWdpb24gKnN0ZW5jaWxSZWdpb24KKyAgICAgICAgID0gaW50ZWxfZ2V0X3JiX3JlZ2lvbihmYiwgQlVGRkVSX1NURU5DSUwpOworICAgICAgaWYgKHN0ZW5jaWxSZWdpb24pIHsKKyAgICAgICAgIC8qIGhhdmUgaHcgc3RlbmNpbCAqLworICAgICAgICAgaWYgKElTXzk2NShpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSB8fAorCSAgICAgKGN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMF0gJiAweGZmKSAhPSAweGZmKSB7CisJICAgIC8qIFdlIGhhdmUgdG8gdXNlIHRoZSAzRCBlbmdpbmUgaWYgd2UncmUgY2xlYXJpbmcgYSBwYXJ0aWFsIG1hc2sKKwkgICAgICogb2YgdGhlIHN0ZW5jaWwgYnVmZmVyLCBvciBpZiB3ZSdyZSBvbiBhIDk2NSB3aGljaCBoYXMgYSB0aWxlZAorCSAgICAgKiBkZXB0aC9zdGVuY2lsIGJ1ZmZlciBpbiBhIGxheW91dCB3ZSBjYW4ndCBibGl0IHRvLgorCSAgICAgKi8KKyAgICAgICAgICAgIHRyaV9tYXNrIHw9IEJVRkZFUl9CSVRfU1RFTkNJTDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogY2xlYXJpbmcgYWxsIHN0ZW5jaWwgYml0cywgdXNlIGJsaXR0aW5nICovCisgICAgICAgICAgICBibGl0X21hc2sgfD0gQlVGRkVSX0JJVF9TVEVOQ0lMOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBIVyBkZXB0aCAqLworICAgaWYgKG1hc2sgJiBCVUZGRVJfQklUX0RFUFRIKSB7CisgICAgICAvKiBjbGVhciBkZXB0aCB3aXRoIHdoYXRldmVyIG1ldGhvZCBpcyB1c2VkIGZvciBzdGVuY2lsIChzZWUgYWJvdmUpICovCisgICAgICBpZiAoSVNfOTY1KGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpIHx8CisJICB0cmlfbWFzayAmIEJVRkZFUl9CSVRfU1RFTkNJTCkKKyAgICAgICAgIHRyaV9tYXNrIHw9IEJVRkZFUl9CSVRfREVQVEg7CisgICAgICBlbHNlCisgICAgICAgICBibGl0X21hc2sgfD0gQlVGRkVSX0JJVF9ERVBUSDsKKyAgIH0KKworICAgLyogU1cgZmFsbGJhY2sgY2xlYXJpbmcgKi8KKyAgIHN3cmFzdF9tYXNrID0gbWFzayAmIH50cmlfbWFzayAmIH5ibGl0X21hc2s7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBCVUZGRVJfQ09VTlQ7IGkrKykgeworICAgICAgR0x1aW50IGJ1ZkJpdCA9IDEgPDwgaTsKKyAgICAgIGlmICgoYmxpdF9tYXNrIHwgdHJpX21hc2spICYgYnVmQml0KSB7CisgICAgICAgICBpZiAoIWZiLT5BdHRhY2htZW50W2ldLlJlbmRlcmJ1ZmZlci0+Q2xhc3NJRCkgeworICAgICAgICAgICAgYmxpdF9tYXNrICY9IH5idWZCaXQ7CisgICAgICAgICAgICB0cmlfbWFzayAmPSB+YnVmQml0OworICAgICAgICAgICAgc3dyYXN0X21hc2sgfD0gYnVmQml0OworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBpZiAoYmxpdF9tYXNrKSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CTElUKSB7CisJIERCRygiYmxpdCBjbGVhcjoiKTsKKwkgZm9yIChpID0gMDsgaSA8IEJVRkZFUl9DT1VOVDsgaSsrKSB7CisJICAgIGlmIChibGl0X21hc2sgJiAoMSA8PCBpKSkKKwkgICAgICAgREJHKCIgJXMiLCBidWZmZXJfbmFtZXNbaV0pOworCSB9CisJIERCRygiXG4iKTsKKyAgICAgIH0KKyAgICAgIGludGVsQ2xlYXJXaXRoQmxpdChjdHgsIGJsaXRfbWFzayk7CisgICB9CisKKyAgIGlmICh0cmlfbWFzaykgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQkxJVCkgeworCSBEQkcoInRyaSBjbGVhcjoiKTsKKwkgZm9yIChpID0gMDsgaSA8IEJVRkZFUl9DT1VOVDsgaSsrKSB7CisJICAgIGlmICh0cmlfbWFzayAmICgxIDw8IGkpKQorCSAgICAgICBEQkcoIiAlcyIsIGJ1ZmZlcl9uYW1lc1tpXSk7CisJIH0KKwkgREJHKCJcbiIpOworICAgICAgfQorICAgICAgaW50ZWxDbGVhcldpdGhUcmlzKGludGVsLCB0cmlfbWFzayk7CisgICB9CisKKyAgIGlmIChzd3Jhc3RfbWFzaykgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQkxJVCkgeworCSBEQkcoInN3cmFzdCBjbGVhcjoiKTsKKwkgZm9yIChpID0gMDsgaSA8IEJVRkZFUl9DT1VOVDsgaSsrKSB7CisJICAgIGlmIChzd3Jhc3RfbWFzayAmICgxIDw8IGkpKQorCSAgICAgICBEQkcoIiAlcyIsIGJ1ZmZlcl9uYW1lc1tpXSk7CisJIH0KKwkgREJHKCJcbiIpOworICAgICAgfQorICAgICAgX3N3cmFzdF9DbGVhcihjdHgsIHN3cmFzdF9tYXNrKTsKKyAgIH0KK30KKworCisvKiBFbWl0IHdhaXQgZm9yIHBlbmRpbmcgZmxpcHMgKi8KK3ZvaWQKK2ludGVsX3dhaXRfZmxpcHMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9CisgICAgICAoc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICopIGludGVsLT5jdHguRHJhd0J1ZmZlcjsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmludGVsX3JiID0KKyAgICAgIGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLAorCQkJICAgICBpbnRlbF9mYi0+QmFzZS5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9PQorCQkJICAgICBCVUZGRVJfRlJPTlRfTEVGVCA/IEJVRkZFUl9GUk9OVF9MRUZUIDoKKwkJCSAgICAgQlVGRkVSX0JBQ0tfTEVGVCk7CisKKyAgIGlmIChpbnRlbF9mYi0+QmFzZS5OYW1lID09IDAgJiYgaW50ZWxfcmIgJiYKKyAgICAgICBpbnRlbF9yYi0+cGZfcGVuZGluZyA9PSBpbnRlbF9mYi0+cGZfc2VxKSB7CisgICAgICBHTGludCBwZl9wbGFuZXMgPSBpbnRlbF9mYi0+cGZfcGxhbmVzOworICAgICAgQkFUQ0hfTE9DQUxTOworCisgICAgICAvKiBXYWl0IGZvciBwZW5kaW5nIGZsaXBzIHRvIHRha2UgZWZmZWN0ICovCisgICAgICBCRUdJTl9CQVRDSCgyLCBOT19MT09QX0NMSVBSRUNUUyk7CisgICAgICBPVVRfQkFUQ0gocGZfcGxhbmVzICYgMHgxID8gKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQKQorCQk6IDApOworICAgICAgT1VUX0JBVENIKHBmX3BsYW5lcyAmIDB4MiA/IChNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUCkKKwkJOiAwKTsKKyAgICAgIEFEVkFOQ0VfQkFUQ0goKTsKKworICAgICAgaW50ZWxfcmItPnBmX3BlbmRpbmctLTsKKyAgIH0KK30KKworCisvKiBGbGlwIHRoZSBmcm9udCAmIGJhY2sgYnVmZmVycworICovCitzdGF0aWMgR0xib29sZWFuCitpbnRlbFBhZ2VGbGlwKGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICogZFByaXYpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWw7CisgICBpbnQgcmV0OworICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19JT0NUTCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGFzc2VydChkUHJpdik7CisgICBhc3NlcnQoZFByaXYtPmRyaUNvbnRleHRQcml2KTsKKyAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpOworCisgICBpbnRlbCA9IChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKSBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7CisKKyAgIGlmIChpbnRlbC0+aW50ZWxTY3JlZW4tPmRybU1pbm9yIDwgOSkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgaW50ZWxGbHVzaCgmaW50ZWwtPmN0eCk7CisKKyAgIHJldCA9IDA7CisKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoZFByaXYtPm51bUNsaXBSZWN0cyAmJiBpbnRlbF9mYi0+cGZfYWN0aXZlKSB7CisgICAgICBkcm1faTkxNV9mbGlwX3QgZmxpcDsKKworICAgICAgZmxpcC5waXBlcyA9IGludGVsX2ZiLT5wZl9wbGFuZXM7CisKKyAgICAgIHJldCA9IGRybUNvbW1hbmRXcml0ZShpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X0ZMSVAsICZmbGlwLCBzaXplb2YoZmxpcCkpOworICAgfQorCisgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAocmV0IHx8ICFpbnRlbF9mYi0+cGZfYWN0aXZlKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBpZiAoIWRQcml2LT5udW1DbGlwUmVjdHMpIHsKKyAgICAgIHVzbGVlcCgxMDAwMCk7CS8qIHRocm90dGxlIGludmlzaWJsZSBjbGllbnQgMTBtcyAqLworICAgfQorCisgICBpbnRlbF9mYi0+cGZfY3VycmVudF9wYWdlID0gKGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlID4+CisJCQkJKGludGVsX2ZiLT5wZl9wbGFuZXMgJiAweDIpKSAmIDB4MzsKKworICAgaWYgKGRQcml2LT5udW1DbGlwUmVjdHMgIT0gMCkgeworICAgICAgaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9GUk9OVF9MRUZUKS0+cGZfcGVuZGluZyA9CisgICAgICBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKCZpbnRlbF9mYi0+QmFzZSwgQlVGRkVSX0JBQ0tfTEVGVCktPnBmX3BlbmRpbmcgPQorCSArK2ludGVsX2ZiLT5wZl9zZXE7CisgICB9CisKKyAgIGludGVsX2ZsaXBfcmVuZGVyYnVmZmVycyhpbnRlbF9mYik7CisgICBpbnRlbF9kcmF3X2J1ZmZlcigmaW50ZWwtPmN0eCwgJmludGVsX2ZiLT5CYXNlKTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsU2NoZWR1bGVTd2FwKF9fRFJJZHJhd2FibGVQcml2YXRlICogZFByaXYsIEdMYm9vbGVhbiAqbWlzc2VkX3RhcmdldCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSBkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHVuc2lnbmVkIGludCBpbnRlcnZhbDsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9CisgICAgICBpbnRlbFNjcmVlbkNvbnRleHQoZFByaXYtPmRyaVNjcmVlblByaXYtPnByaXZhdGUpOworICAgY29uc3QgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IGludGVsLT5pbnRlbFNjcmVlbjsKKyAgIHVuc2lnbmVkIGludCB0YXJnZXQ7CisgICBkcm1faTkxNV92Ymxhbmtfc3dhcF90IHN3YXA7CisgICBHTGJvb2xlYW4gcmV0OworCisgICBpZiAoIWRQcml2LT52YmxGbGFncyB8fAorICAgICAgIChkUHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19OT19JUlEpIHx8CisgICAgICAgaW50ZWxTY3JlZW4tPmRybU1pbm9yIDwgKGludGVsX2ZiLT5wZl9hY3RpdmUgPyA5IDogNikpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGludGVydmFsID0gZHJpR2V0VkJsYW5rSW50ZXJ2YWwoZFByaXYpOworCisgICBzd2FwLnNlcXR5cGUgPSBEUk1fVkJMQU5LX0FCU09MVVRFOworCisgICBpZiAoZFByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfU1lOQykgeworICAgICAgc3dhcC5zZXF0eXBlIHw9IERSTV9WQkxBTktfTkVYVE9OTUlTUzsKKyAgIH0gZWxzZSBpZiAoaW50ZXJ2YWwgPT0gMCkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgc3dhcC5kcmF3YWJsZSA9IGRQcml2LT5oSFdEcmF3YWJsZTsKKyAgIHRhcmdldCA9IHN3YXAuc2VxdWVuY2UgPSBkUHJpdi0+dmJsU2VxICsgaW50ZXJ2YWw7CisKKyAgIGlmICggZFByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfU0VDT05EQVJZICkgeworICAgICAgc3dhcC5zZXF0eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOworICAgfQorCisgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKKworICAgaWYgKCBpbnRlbF9mYi0+cGZfYWN0aXZlICkgeworICAgICAgc3dhcC5zZXF0eXBlIHw9IERSTV9WQkxBTktfRkxJUDsKKworICAgICAgaW50ZWxfZmItPnBmX2N1cnJlbnRfcGFnZSA9ICgoKGludGVsLT5zYXJlYS0+cGZfY3VycmVudF9wYWdlID4+CisJCQkJICAgICAoaW50ZWxfZmItPnBmX3BsYW5lcyAmIDB4MikpICYgMHgzKSArIDEpICUKKwkJCQkgIGludGVsX2ZiLT5wZl9udW1fcGFnZXM7CisgICB9CisKKyAgIGlmICghZHJtQ29tbWFuZFdyaXRlUmVhZChpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X1ZCTEFOS19TV0FQLCAmc3dhcCwKKwkJCSAgICBzaXplb2Yoc3dhcCkpKSB7CisgICAgICBkUHJpdi0+dmJsU2VxID0gc3dhcC5zZXF1ZW5jZTsKKyAgICAgIHN3YXAuc2VxdWVuY2UgLT0gdGFyZ2V0OworICAgICAgKm1pc3NlZF90YXJnZXQgPSBzd2FwLnNlcXVlbmNlID4gMCAmJiBzd2FwLnNlcXVlbmNlIDw9ICgxIDw8IDIzKTsKKworICAgICAgaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9CQUNLX0xFRlQpLT52YmxfcGVuZGluZyA9CisJIGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLAorCQkJCUJVRkZFUl9GUk9OVF9MRUZUKS0+dmJsX3BlbmRpbmcgPQorCSBkUHJpdi0+dmJsU2VxOworCisgICAgICBpZiAoc3dhcC5zZXF0eXBlICYgRFJNX1ZCTEFOS19GTElQKSB7CisJIGludGVsX2ZsaXBfcmVuZGVyYnVmZmVycyhpbnRlbF9mYik7CisJIGludGVsX2RyYXdfYnVmZmVyKCZpbnRlbC0+Y3R4LCBpbnRlbC0+Y3R4LkRyYXdCdWZmZXIpOworICAgICAgfQorCisgICAgICByZXQgPSBHTF9UUlVFOworICAgfSBlbHNlIHsKKyAgICAgIGlmIChzd2FwLnNlcXR5cGUgJiBEUk1fVkJMQU5LX0ZMSVApIHsKKwkgaW50ZWxfZmItPnBmX2N1cnJlbnRfcGFnZSA9ICgoaW50ZWwtPnNhcmVhLT5wZl9jdXJyZW50X3BhZ2UgPj4KKwkJCQkJKGludGVsX2ZiLT5wZl9wbGFuZXMgJiAweDIpKSAmIDB4MykgJQorCQkJCSAgICAgaW50ZWxfZmItPnBmX251bV9wYWdlczsKKyAgICAgIH0KKworICAgICAgcmV0ID0gR0xfRkFMU0U7CisgICB9CisKKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIHJldHVybiByZXQ7Cit9CisgIAordm9pZAoraW50ZWxTd2FwQnVmZmVycyhfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2KQoreworICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKKworICAgaWYgKGRQcml2LT5kcmlDb250ZXh0UHJpdiAmJiBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpIHsKKyAgICAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKyAgICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbDsKKworICAgICAgaWYgKGN0eCA9PSBOVUxMKQorCSByZXR1cm47CisKKyAgICAgIGludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworCisgICAgICBpZiAoY3R4LT5WaXN1YWwuZG91YmxlQnVmZmVyTW9kZSkgeworCSBHTGJvb2xlYW4gbWlzc2VkX3RhcmdldDsKKwkgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworCSBpbnQ2NF90IHVzdDsKKyAgICAgICAgIAorCSBfbWVzYV9ub3RpZnlTd2FwQnVmZmVycyhjdHgpOyAgLyogZmx1c2ggcGVuZGluZyByZW5kZXJpbmcgY29tYW5kcyAqLworCisgICAgICAgICBpZiAoIWludGVsU2NoZWR1bGVTd2FwKGRQcml2LCAmbWlzc2VkX3RhcmdldCkpIHsKKwkgICAgZHJpV2FpdEZvclZCbGFuayhkUHJpdiwgJm1pc3NlZF90YXJnZXQpOworCisJICAgIC8qCisJICAgICAqIFVwZGF0ZSBlYWNoIGJ1ZmZlcidzIHZibF9wZW5kaW5nIHNvIHdlIGRvbid0IGdldCB0b28gb3V0IG9mCisJICAgICAqIHN5bmMKKwkgICAgICovCisJICAgIGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLAorCQkJCSAgIEJVRkZFUl9CQUNLX0xFRlQpLT52YmxfcGVuZGluZyA9IAorCQkgICAgaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsCisJCQkJCSAgIEJVRkZFUl9GUk9OVF9MRUZUKS0+dmJsX3BlbmRpbmcgPQorCQkgICAgZFByaXYtPnZibFNlcTsKKwkgICAgaWYgKCFpbnRlbFBhZ2VGbGlwKGRQcml2KSkgeworCSAgICAgICBpbnRlbENvcHlCdWZmZXIoZFByaXYsIE5VTEwpOworCSAgICB9CisJIH0KKworCSBpbnRlbF9mYi0+c3dhcF9jb3VudCsrOworCSAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSAoJnVzdCk7CisJIGlmIChtaXNzZWRfdGFyZ2V0KSB7CisJICAgIGludGVsX2ZiLT5zd2FwX21pc3NlZF9jb3VudCsrOworCSAgICBpbnRlbF9mYi0+c3dhcF9taXNzZWRfdXN0ID0gdXN0IC0gaW50ZWxfZmItPnN3YXBfdXN0OworCSB9CisKKwkgaW50ZWxfZmItPnN3YXBfdXN0ID0gdXN0OworICAgICAgfQorICAgICAgZHJtQ29tbWFuZE5vbmUoaW50ZWwtPmRyaUZkLCBEUk1fSTkxNV9HRU1fVEhST1RUTEUpOworCisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIFhYWCB0aGlzIHNob3VsZG4ndCBiZSBhbiBlcnJvciBidXQgd2UgY2FuJ3QgaGFuZGxlIGl0IGZvciBub3cgKi8KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGRyYXdhYmxlIGhhcyBubyBjb250ZXh0IVxuIiwgX19GVU5DVElPTl9fKTsKKyAgIH0KK30KKwordm9pZAoraW50ZWxDb3B5U3ViQnVmZmVyKF9fRFJJZHJhd2FibGVQcml2YXRlICogZFByaXYsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgaWYgKGRQcml2LT5kcmlDb250ZXh0UHJpdiAmJiBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpIHsKKyAgICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9CisgICAgICAgICAoc3RydWN0IGludGVsX2NvbnRleHQgKikgZFByaXYtPmRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOworICAgICAgR0xjb250ZXh0ICpjdHggPSAmaW50ZWwtPmN0eDsKKworICAgICAgaWYgKGN0eC0+VmlzdWFsLmRvdWJsZUJ1ZmZlck1vZGUpIHsKKyAgICAgICAgIGRybV9jbGlwX3JlY3RfdCByZWN0OworICAgICAgICAgcmVjdC54MSA9IHggKyBkUHJpdi0+eDsKKyAgICAgICAgIHJlY3QueTEgPSAoZFByaXYtPmggLSB5IC0gaCkgKyBkUHJpdi0+eTsKKyAgICAgICAgIHJlY3QueDIgPSByZWN0LngxICsgdzsKKyAgICAgICAgIHJlY3QueTIgPSByZWN0LnkxICsgaDsKKyAgICAgICAgIF9tZXNhX25vdGlmeVN3YXBCdWZmZXJzKGN0eCk7ICAvKiBmbHVzaCBwZW5kaW5nIHJlbmRlcmluZyBjb21hbmRzICovCisgICAgICAgICBpbnRlbENvcHlCdWZmZXIoZFByaXYsICZyZWN0KTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogWFhYIHRoaXMgc2hvdWxkbid0IGJlIGFuIGVycm9yIGJ1dCB3ZSBjYW4ndCBoYW5kbGUgaXQgZm9yIG5vdyAqLworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZHJhd2FibGUgaGFzIG5vIGNvbnRleHQhXG4iLCBfX0ZVTkNUSU9OX18pOworICAgfQorfQorCisKKy8qKgorICogVXBkYXRlIHRoZSBoYXJkd2FyZSBzdGF0ZSBmb3IgZHJhd2luZyBpbnRvIGEgd2luZG93IG9yIGZyYW1lYnVmZmVyIG9iamVjdC4KKyAqCisgKiBDYWxsZWQgYnkgZ2xEcmF3QnVmZmVyLCBnbEJpbmRGcmFtZWJ1ZmZlckVYVCwgTWFrZUN1cnJlbnQsIGFuZCBvdGhlcgorICogcGxhY2VzIHdpdGhpbiB0aGUgZHJpdmVyLgorICoKKyAqIEJhc2ljYWxseSwgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYW55IHRpbWUgdGhlIGN1cnJlbnQgZnJhbWVidWZmZXIKKyAqIGNoYW5nZXMsIHRoZSByZW5kZXJidWZmZXJzIGNoYW5nZSwgb3Igd2UgbmVlZCB0byBkcmF3IGludG8gZGlmZmVyZW50CisgKiBjb2xvciBidWZmZXJzLgorICovCit2b2lkCitpbnRlbF9kcmF3X2J1ZmZlcihHTGNvbnRleHQgKiBjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpjb2xvclJlZ2lvbnNbTUFYX0RSQVdfQlVGRkVSU10sICpkZXB0aFJlZ2lvbiA9IE5VTEw7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmJEZXB0aCA9IE5VTEwsICppcmJTdGVuY2lsID0gTlVMTDsKKyAgIGludCBmcm9udCA9IDA7ICAgICAgICAgICAgICAgLyogZHJhd2luZyB0byBmcm9udCBjb2xvciBidWZmZXI/ICovCisKKyAgIGlmICghZmIpIHsKKyAgICAgIC8qIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgdGhlIGluaXRpYWwgY29udGV4dCBpbml0aWFsaXphdGlvbiAqLworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBEbyB0aGlzIGhlcmUsIG5vdGUgY29yZSBNZXNhLCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCisgICAgKiBtYW55IHBsYWNlcyB3aXRoaW4gdGhlIGRyaXZlci4KKyAgICAqLworICAgaWYgKGN0eC0+TmV3U3RhdGUgJiAoX05FV19CVUZGRVJTIHwgX05FV19DT0xPUiB8IF9ORVdfUElYRUwpKSB7CisgICAgICAvKiB0aGlzIHVwZGF0ZXMgdGhlIERyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzIGZpZWxkcywgZXRjICovCisgICAgICBfbWVzYV91cGRhdGVfZnJhbWVidWZmZXIoY3R4KTsKKyAgICAgIC8qIHRoaXMgdXBkYXRlcyB0aGUgRHJhd0J1ZmZlcidzIFdpZHRoL0hlaWdodCBpZiBpdCdzIGEgRkJPICovCisgICAgICBfbWVzYV91cGRhdGVfZHJhd19idWZmZXJfYm91bmRzKGN0eCk7CisgICB9CisKKyAgIGlmIChmYi0+X1N0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKKyAgICAgIC8qIHRoaXMgbWF5IG9jY3VyIHdoZW4gd2UncmUgY2FsbGVkIGJ5IGdsQmluZEZyYW1lQnVmZmVyKCkgZHVyaW5nCisgICAgICAgKiB0aGUgcHJvY2VzcyBvZiBzb21lb25lIHNldHRpbmcgdXAgcmVuZGVyYnVmZmVycywgZXRjLgorICAgICAgICovCisgICAgICAvKl9tZXNhX2RlYnVnKGN0eCwgIkRyYXdCdWZmZXI6IGluY29tcGxldGUgdXNlciBGQk9cbiIpOyovCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChmYi0+TmFtZSkKKyAgICAgIGludGVsX3ZhbGlkYXRlX3BhaXJlZF9kZXB0aF9zdGVuY2lsKGN0eCwgZmIpOworCisgICAvKiBJZiB0aGUgYmF0Y2ggY29udGVudHMgcmVxdWlyZSBsb29waW5nIG92ZXIgY2xpcHJlY3RzLCBmbHVzaCB0aGVtIGJlZm9yZQorICAgICogd2UgZ28gY2hhbmdpbmcgd2hpY2ggY2xpcHJlY3RzIGdldCByZWZlcmVuY2VkIHdoZW4gdGhhdCBoYXBwZW5zLgorICAgICovCisgICBpZiAoaW50ZWwtPmJhdGNoLT5jbGlwcmVjdF9tb2RlID09IExPT1BfQ0xJUFJFQ1RTKQorICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKKworICAgLyoKKyAgICAqIEhvdyBtYW55IGNvbG9yIGJ1ZmZlcnMgYXJlIHdlIGRyYXdpbmcgaW50bz8KKyAgICAqLworICAgaWYgKGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA9PSAwKSB7CisgICAgICAvKiB3cml0aW5nIHRvIDAgICovCisgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUpOworICAgICAgY29sb3JSZWdpb25zWzBdID0gTlVMTDsKKworICAgICAgaWYgKGZiLT5OYW1lICE9IDApCisJIGludGVsU2V0UmVuZGVyYnVmZmVyQ2xpcFJlY3RzKGludGVsKTsKKyAgIH0gZWxzZSBpZiAoZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzID4gMSkgeworICAgICAgIGludCBpOworICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYjsKKyAgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX0ZBTFNFKTsKKworICAgICAgIGlmIChmYi0+TmFtZSAhPSAwKQorICAgICAgICAgICBpbnRlbFNldFJlbmRlcmJ1ZmZlckNsaXBSZWN0cyhpbnRlbCk7CisgICAgICAgZm9yIChpID0gMDsgaSA8IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgIGlyYiA9IGludGVsX3JlbmRlcmJ1ZmZlcihmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbaV0pOworICAgICAgICAgICBjb2xvclJlZ2lvbnNbaV0gPSAoaXJiICYmIGlyYi0+cmVnaW9uKSA/IGlyYi0+cmVnaW9uIDogTlVMTDsKKyAgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIGRyYXcgdG8gZXhhY3RseSBvbmUgY29sb3IgYnVmZmVyICovCisgICAgICAvKl9tZXNhX2RlYnVnKGN0eCwgIkhhcmR3YXJlIHJlbmRlcmluZ1xuIik7Ki8KKyAgICAgIEZBTExCQUNLKGludGVsLCBJTlRFTF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UpOworICAgICAgaWYgKGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9PSBCVUZGRVJfRlJPTlRfTEVGVCkgeworICAgICAgICAgZnJvbnQgPSAxOworICAgICAgfQorCisgICAgICAvKgorICAgICAgICogR2V0IHRoZSBpbnRlbF9yZW5kZXJidWZmZXIgZm9yIHRoZSBjb2xvcmJ1ZmZlciB3ZSdyZSBkcmF3aW5nIGludG8uCisgICAgICAgKiBBbmQgc2V0IHVwIGNsaXByZWN0cy4KKyAgICAgICAqLworICAgICAgaWYgKGZiLT5OYW1lID09IDApIHsKKwkgLyogZHJhd2luZyB0byB3aW5kb3cgc3lzdGVtIGJ1ZmZlciAqLworCSBpZiAoZnJvbnQpIHsKKwkgICAgaW50ZWxTZXRGcm9udENsaXBSZWN0cyhpbnRlbCk7CisJICAgIGNvbG9yUmVnaW9uc1swXSA9IGludGVsX2dldF9yYl9yZWdpb24oZmIsIEJVRkZFUl9GUk9OVF9MRUZUKTsKKwkgfQorCSBlbHNlIHsKKwkgICAgaW50ZWxTZXRCYWNrQ2xpcFJlY3RzKGludGVsKTsKKwkgICAgY29sb3JSZWdpb25zWzBdPSBpbnRlbF9nZXRfcmJfcmVnaW9uKGZiLCBCVUZGRVJfQkFDS19MRUZUKTsKKwkgfQorICAgICAgfQorICAgICAgZWxzZSB7CisJIC8qIGRyYXdpbmcgdG8gdXNlci1jcmVhdGVkIEZCTyAqLworCSBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmI7CisJIGludGVsU2V0UmVuZGVyYnVmZmVyQ2xpcFJlY3RzKGludGVsKTsKKwkgaXJiID0gaW50ZWxfcmVuZGVyYnVmZmVyKGZiLT5fQ29sb3JEcmF3QnVmZmVyc1swXSk7CisJIGNvbG9yUmVnaW9uc1swXSA9IChpcmIgJiYgaXJiLT5yZWdpb24pID8gaXJiLT5yZWdpb24gOiBOVUxMOworICAgICAgfQorICAgfQorCisgICAvKiBVcGRhdGUgY3VsbGluZyBkaXJlY3Rpb24gd2hpY2ggY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlCisgICAgKiBvcmllbnRhdGlvbiBvZiB0aGUgYnVmZmVyOgorICAgICovCisgICBpZiAoY3R4LT5Ecml2ZXIuRnJvbnRGYWNlKQorICAgICAgY3R4LT5Ecml2ZXIuRnJvbnRGYWNlKGN0eCwgY3R4LT5Qb2x5Z29uLkZyb250RmFjZSk7CisgICBlbHNlCisgICAgICBjdHgtPk5ld1N0YXRlIHw9IF9ORVdfUE9MWUdPTjsKKworICAgaWYgKCFjb2xvclJlZ2lvbnNbMF0pIHsKKyAgICAgIEZBTExCQUNLKGludGVsLCBJTlRFTF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfVFJVRSk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIEZBTExCQUNLKGludGVsLCBJTlRFTF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UpOworICAgfQorCisgICAvKioqCisgICAgKioqIEdldCBkZXB0aCBidWZmZXIgcmVnaW9uIGFuZCBjaGVjayBpZiB3ZSBuZWVkIGEgc29mdHdhcmUgZmFsbGJhY2suCisgICAgKioqIE5vdGUgdGhhdCB0aGUgZGVwdGggYnVmZmVyIGlzIHVzdWFsbHkgYSBERVBUSF9TVEVOQ0lMIGJ1ZmZlci4KKyAgICAqKiovCisgICBpZiAoZmItPl9EZXB0aEJ1ZmZlciAmJiBmYi0+X0RlcHRoQnVmZmVyLT5XcmFwcGVkKSB7CisgICAgICBpcmJEZXB0aCA9IGludGVsX3JlbmRlcmJ1ZmZlcihmYi0+X0RlcHRoQnVmZmVyLT5XcmFwcGVkKTsKKyAgICAgIGlmIChpcmJEZXB0aCAmJiBpcmJEZXB0aC0+cmVnaW9uKSB7CisgICAgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfREVQVEhfQlVGRkVSLCBHTF9GQUxTRSk7CisgICAgICAgICBkZXB0aFJlZ2lvbiA9IGlyYkRlcHRoLT5yZWdpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIEZBTExCQUNLKGludGVsLCBJTlRFTF9GQUxMQkFDS19ERVBUSF9CVUZGRVIsIEdMX1RSVUUpOworICAgICAgICAgZGVwdGhSZWdpb24gPSBOVUxMOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBub3QgdXNpbmcgZGVwdGggYnVmZmVyICovCisgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfREVQVEhfQlVGRkVSLCBHTF9GQUxTRSk7CisgICAgICBkZXB0aFJlZ2lvbiA9IE5VTEw7CisgICB9CisKKyAgIC8qKioKKyAgICAqKiogU3RlbmNpbCBidWZmZXIKKyAgICAqKiogVGhpcyBjYW4gb25seSBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBpZiB3ZSdyZSB1c2luZyBhCisgICAgKioqIGNvbWJpbmVkIERFUFRIX1NURU5DSUwgYnVmZmVyIChmb3Igbm93IGFueXdheSkuCisgICAgKioqLworICAgaWYgKGZiLT5fU3RlbmNpbEJ1ZmZlciAmJiBmYi0+X1N0ZW5jaWxCdWZmZXItPldyYXBwZWQpIHsKKyAgICAgIGlyYlN0ZW5jaWwgPSBpbnRlbF9yZW5kZXJidWZmZXIoZmItPl9TdGVuY2lsQnVmZmVyLT5XcmFwcGVkKTsKKyAgICAgIGlmIChpcmJTdGVuY2lsICYmIGlyYlN0ZW5jaWwtPnJlZ2lvbikgeworICAgICAgICAgQVNTRVJUKGlyYlN0ZW5jaWwtPkJhc2UuX0FjdHVhbEZvcm1hdCA9PSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCk7CisgICAgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfU1RFTkNJTF9CVUZGRVIsIEdMX0ZBTFNFKTsKKyAgICAgICAgIC8qIG5lZWQgdG8gcmUtY29tcHV0ZSBzdGVuY2lsIGh3IHN0YXRlICovCisJIGlmIChjdHgtPkRyaXZlci5FbmFibGUgIT0gTlVMTCkKKwkgICAgY3R4LT5Ecml2ZXIuRW5hYmxlKGN0eCwgR0xfU1RFTkNJTF9URVNULCBjdHgtPlN0ZW5jaWwuRW5hYmxlZCk7CisJIGVsc2UKKwkgICAgY3R4LT5OZXdTdGF0ZSB8PSBfTkVXX1NURU5DSUw7CisgICAgICAgICBpZiAoIWRlcHRoUmVnaW9uKQorICAgICAgICAgICAgZGVwdGhSZWdpb24gPSBpcmJTdGVuY2lsLT5yZWdpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIEZBTExCQUNLKGludGVsLCBJTlRFTF9GQUxMQkFDS19TVEVOQ0lMX0JVRkZFUiwgR0xfVFJVRSk7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIFhYWCBGQk86IGluc3RlYWQgb2YgRkFMU0UsIHBhc3MgY3R4LT5TdGVuY2lsLkVuYWJsZWQgPz8/ICovCisgICAgICBGQUxMQkFDSyhpbnRlbCwgSU5URUxfRkFMTEJBQ0tfU1RFTkNJTF9CVUZGRVIsIEdMX0ZBTFNFKTsKKyAgICAgIC8qIG5lZWQgdG8gcmUtY29tcHV0ZSBzdGVuY2lsIGh3IHN0YXRlICovCisgICAgICBpZiAoY3R4LT5Ecml2ZXIuRW5hYmxlICE9IE5VTEwpCisJIGN0eC0+RHJpdmVyLkVuYWJsZShjdHgsIEdMX1NURU5DSUxfVEVTVCwgY3R4LT5TdGVuY2lsLkVuYWJsZWQpOworICAgICAgZWxzZQorCSBjdHgtPk5ld1N0YXRlIHw9IF9ORVdfU1RFTkNJTDsKKyAgIH0KKworICAgLyoKKyAgICAqIFVwZGF0ZSBkZXB0aCB0ZXN0IHN0YXRlCisgICAgKi8KKyAgIGlmIChjdHgtPkRyaXZlci5FbmFibGUpIHsKKyAgICAgIGlmIChjdHgtPkRlcHRoLlRlc3QgJiYgZmItPlZpc3VhbC5kZXB0aEJpdHMgPiAwKSB7CisJIGN0eC0+RHJpdmVyLkVuYWJsZShjdHgsIEdMX0RFUFRIX1RFU1QsIEdMX1RSVUUpOworICAgICAgfSBlbHNlIHsKKwkgY3R4LT5Ecml2ZXIuRW5hYmxlKGN0eCwgR0xfREVQVEhfVEVTVCwgR0xfRkFMU0UpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+TmV3U3RhdGUgfD0gX05FV19ERVBUSDsKKyAgIH0KKworICAgaW50ZWwtPnZ0Ymwuc2V0X2RyYXdfcmVnaW9uKGludGVsLCBjb2xvclJlZ2lvbnMsIGRlcHRoUmVnaW9uLCAKKwlmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnMpOworCisgICAvKiB1cGRhdGUgdmlld3BvcnQgc2luY2UgaXQgZGVwZW5kcyBvbiB3aW5kb3cgc2l6ZSAqLworICAgaWYgKGN0eC0+RHJpdmVyLlZpZXdwb3J0KSB7CisgICAgICBjdHgtPkRyaXZlci5WaWV3cG9ydChjdHgsIGN0eC0+Vmlld3BvcnQuWCwgY3R4LT5WaWV3cG9ydC5ZLAorCQkJICAgY3R4LT5WaWV3cG9ydC5XaWR0aCwgY3R4LT5WaWV3cG9ydC5IZWlnaHQpOworICAgfSBlbHNlIHsKKyAgICAgIGN0eC0+TmV3U3RhdGUgfD0gX05FV19WSUVXUE9SVDsKKyAgIH0KKworICAgLyogU2V0IHN0YXRlIHdlIGtub3cgZGVwZW5kcyBvbiBkcmF3YWJsZSBwYXJhbWV0ZXJzOgorICAgICovCisgICBpZiAoY3R4LT5Ecml2ZXIuU2Npc3NvcikKKyAgICAgIGN0eC0+RHJpdmVyLlNjaXNzb3IoY3R4LCBjdHgtPlNjaXNzb3IuWCwgY3R4LT5TY2lzc29yLlksCisJCQkgIGN0eC0+U2Npc3Nvci5XaWR0aCwgY3R4LT5TY2lzc29yLkhlaWdodCk7CisgICBpbnRlbC0+TmV3R0xTdGF0ZSB8PSBfTkVXX1NDSVNTT1I7CisKKyAgIGlmIChjdHgtPkRyaXZlci5EZXB0aFJhbmdlKQorICAgICAgY3R4LT5Ecml2ZXIuRGVwdGhSYW5nZShjdHgsCisJCQkgICAgIGN0eC0+Vmlld3BvcnQuTmVhciwKKwkJCSAgICAgY3R4LT5WaWV3cG9ydC5GYXIpOworfQorCisKK3N0YXRpYyB2b2lkCitpbnRlbERyYXdCdWZmZXIoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gbW9kZSkKK3sKKyAgIGludGVsX2RyYXdfYnVmZmVyKGN0eCwgY3R4LT5EcmF3QnVmZmVyKTsKK30KKworCitzdGF0aWMgdm9pZAoraW50ZWxSZWFkQnVmZmVyKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIG1vZGUpCit7CisgICBpZiAoY3R4LT5SZWFkQnVmZmVyID09IGN0eC0+RHJhd0J1ZmZlcikgeworICAgICAgLyogVGhpcyB3aWxsIHVwZGF0ZSBGQk8gY29tcGxldGVuZXNzIHN0YXR1cy4KKyAgICAgICAqIEEgZnJhbWVidWZmZXIgd2lsbCBiZSBpbmNvbXBsZXRlIGlmIHRoZSBHTF9SRUFEX0JVRkZFUiBzZXR0aW5nCisgICAgICAgKiByZWZlcnMgdG8gYSBtaXNzaW5nIHJlbmRlcmJ1ZmZlci4gIENhbGxpbmcgZ2xSZWFkQnVmZmVyIGNhbiBzZXQKKyAgICAgICAqIHRoYXQgc3RyYWlnaHQgYW5kIGNhbiBtYWtlIHRoZSBkcmF3aW5nIGJ1ZmZlciBjb21wbGV0ZS4KKyAgICAgICAqLworICAgICAgaW50ZWxfZHJhd19idWZmZXIoY3R4LCBjdHgtPkRyYXdCdWZmZXIpOworICAgfQorICAgLyogR2VuZXJhbGx5LCBmdW5jdGlvbnMgd2hpY2ggcmVhZCBwaXhlbHMgKGdsUmVhZFBpeGVscywgZ2xDb3B5UGl4ZWxzLCBldGMpCisgICAgKiByZWZlcmVuY2UgY3R4LT5SZWFkQnVmZmVyIGFuZCBkbyBhcHByb3ByaWF0ZSBzdGF0ZSBjaGVja3MuCisgICAgKi8KK30KKworCit2b2lkCitpbnRlbEluaXRCdWZmZXJGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKK3sKKyAgIGZ1bmN0aW9ucy0+Q2xlYXIgPSBpbnRlbENsZWFyOworICAgZnVuY3Rpb25zLT5EcmF3QnVmZmVyID0gaW50ZWxEcmF3QnVmZmVyOworICAgZnVuY3Rpb25zLT5SZWFkQnVmZmVyID0gaW50ZWxSZWFkQnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXguaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2J1ZmZlcnMuaApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gc3JjL21lc2EvZHJpdmVycy9kcmkvaTkxNS9pbnRlbF90ZXguaApjb3B5IHRvIHNyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2J1ZmZlcnMuaAppbmRleCA5YjdlNTUwLi5hNjY5YTg1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3RleC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2J1ZmZlcnMuaApAQCAtMSw2ICsxLDcgQEAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAKLSAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiAKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCkBAIC0yNSwyMSArMjYsMzEgQEAKICAqIAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIElOVEVMVEVYX0lOQwotI2RlZmluZSBJTlRFTFRFWF9JTkMKLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKLSNpbmNsdWRlICJ0ZXhtZW0uaCIKKyNpZm5kZWYgSU5URUxfQlVGRkVSU19ICisjZGVmaW5lIElOVEVMX0JVRkZFUlNfSAogCiAKLXZvaWQgaW50ZWxJbml0VGV4dHVyZUZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOworc3RydWN0IGludGVsX2NvbnRleHQ7CitzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXI7CiAKLXZvaWQgaW50ZWxEZXN0cm95VGV4T2JqKCBpbnRlbENvbnRleHRQdHIgaW50ZWwsIGludGVsVGV4dHVyZU9iamVjdFB0ciB0ICk7Ci1pbnQgaW50ZWxVcGxvYWRUZXhJbWFnZXMoIGludGVsQ29udGV4dFB0ciBpbnRlbCwgaW50ZWxUZXh0dXJlT2JqZWN0UHRyIHQsCi0JCQkgIEdMdWludCBmYWNlICk7CiAKLUdMYm9vbGVhbiAKLWludGVsX2RyaVJlaW5pdFRleHR1cmVIZWFwKCBkcmlUZXhIZWFwICpoZWFwLAotCQkJICAgIHVuc2lnbmVkIHNpemUgKTsKLSNlbmRpZgorZXh0ZXJuIEdMYm9vbGVhbgoraW50ZWxfaW50ZXJzZWN0X2NsaXByZWN0cyhkcm1fY2xpcF9yZWN0X3QgKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBiKTsKKworZXh0ZXJuIHN0cnVjdCBpbnRlbF9yZWdpb24gKmludGVsX3JlYWRidWZfcmVnaW9uKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCk7CisKK2V4dGVybiBzdHJ1Y3QgaW50ZWxfcmVnaW9uICppbnRlbF9kcmF3YnVmX3JlZ2lvbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpOworCitleHRlcm4gdm9pZCBpbnRlbF93YWl0X2ZsaXBzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCk7CisKK2V4dGVybiB2b2lkIGludGVsU3dhcEJ1ZmZlcnMoX19EUklkcmF3YWJsZVByaXZhdGUgKiBkUHJpdik7CisKK2V4dGVybiB2b2lkIGludGVsV2luZG93TW92ZWQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKKworZXh0ZXJuIHZvaWQgaW50ZWxfZHJhd19idWZmZXIoR0xjb250ZXh0ICogY3R4LCBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiKTsKKworZXh0ZXJuIHZvaWQgaW50ZWxJbml0QnVmZmVyRnVuY3Moc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMpOworCisjZW5kaWYgLyogSU5URUxfQlVGRkVSU19IICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9jaGlwc2V0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9jaGlwc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViOWVmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2NoaXBzZXQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNkZWZpbmUgUENJX0NISVBfSTgxMAkJCTB4NzEyMQorI2RlZmluZSBQQ0lfQ0hJUF9JODEwX0RDMTAwCQkweDcxMjMKKyNkZWZpbmUgUENJX0NISVBfSTgxMF9FCQkJMHg3MTI1CisjZGVmaW5lIFBDSV9DSElQX0k4MTUJCQkweDExMzIKKworI2RlZmluZSBQQ0lfQ0hJUF9JODMwX00JCQkweDM1NzcKKyNkZWZpbmUgUENJX0NISVBfODQ1X0cJCQkweDI1NjIKKyNkZWZpbmUgUENJX0NISVBfSTg1NV9HTQkJMHgzNTgyCisjZGVmaW5lIFBDSV9DSElQX0k4NjVfRwkJCTB4MjU3MgorCisjZGVmaW5lIFBDSV9DSElQX0k5MTVfRwkJCTB4MjU4MgorI2RlZmluZSBQQ0lfQ0hJUF9FNzIyMV9HCQkweDI1OEEKKyNkZWZpbmUgUENJX0NISVBfSTkxNV9HTQkJMHgyNTkyCisjZGVmaW5lIFBDSV9DSElQX0k5NDVfRwkJCTB4Mjc3MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0dNCQkweDI3QTIKKyNkZWZpbmUgUENJX0NISVBfSTk0NV9HTUUJCTB4MjdBRQorCisjZGVmaW5lIFBDSV9DSElQX1EzNV9HCQkJMHgyOUIyCisjZGVmaW5lIFBDSV9DSElQX0czM19HCQkJMHgyOUMyCisjZGVmaW5lIFBDSV9DSElQX1EzM19HCQkJMHgyOUQyCisKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HCQkJMHgyOUEyCisjZGVmaW5lIFBDSV9DSElQX0k5NjVfUQkJCTB4Mjk5MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X0dfMQkJMHgyOTgyCisjZGVmaW5lIFBDSV9DSElQX0k5NDZfR1oJCTB4Mjk3MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X0dNICAgICAgICAgICAgICAgIDB4MkEwMgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X0dNRSAgICAgICAgICAgICAgIDB4MkExMgorCisjZGVmaW5lIFBDSV9DSElQX0dNNDVfR00gICAgICAgICAgICAgICAgMHgyQTQyCisKKyNkZWZpbmUgUENJX0NISVBfSUdEX0VfRyAgICAgICAgICAgICAgICAweDJFMDIKKyNkZWZpbmUgUENJX0NISVBfUTQ1X0cgICAgICAgICAgICAgICAgICAweDJFMTIKKyNkZWZpbmUgUENJX0NISVBfRzQ1X0cgICAgICAgICAgICAgICAgICAweDJFMjIKKworI2RlZmluZSBJU19NT0JJTEUoZGV2aWQpCShkZXZpZCA9PSBQQ0lfQ0hJUF9JODU1X0dNIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSTkxNV9HTSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0k5NDVfR00gfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9JOTQ1X0dNRSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0k5NjVfR00gfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9JOTY1X0dNRSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0dNNDVfR00pCisKKyNkZWZpbmUgSVNfR000NV9HTShkZXZpZCkgICAgICAgKGRldmlkID09IFBDSV9DSElQX0dNNDVfR00pCisjZGVmaW5lIElTX0c0WChkZXZpZCkgICAgICAgICAgIChkZXZpZCA9PSBQQ0lfQ0hJUF9JR0RfRV9HIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlkID09IFBDSV9DSElQX1E0NV9HIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlkID09IFBDSV9DSElQX0c0NV9HKQorCisjZGVmaW5lIElTXzkxNShkZXZpZCkJCShkZXZpZCA9PSBQQ0lfQ0hJUF9JOTE1X0cgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9FNzIyMV9HIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSTkxNV9HTSkKKworI2RlZmluZSBJU185NDUoZGV2aWQpCQkoZGV2aWQgPT0gUENJX0NISVBfSTk0NV9HIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSTk0NV9HTSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0k5NDVfR01FIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfRzMzX0cgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9RMzNfRyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX1EzNV9HKQorCisjZGVmaW5lIElTXzk2NShkZXZpZCkJCShkZXZpZCA9PSBQQ0lfQ0hJUF9JOTY1X0cgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9JOTY1X1EgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9JOTY1X0dfMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0k5NjVfR00gfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9JOTY1X0dNRSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0k5NDZfR1ogfHwgXAorCQkJCSBJU19HTTQ1X0dNKGRldmlkKSB8fCBcCisJCQkJIElTX0c0WChkZXZpZCkpCisKKyNkZWZpbmUgSVNfOVhYKGRldmlkKQkJKElTXzkxNShkZXZpZCkgfHwgXAorCQkJCSBJU185NDUoZGV2aWQpIHx8IFwKKwkJCQkgSVNfOTY1KGRldmlkKSkKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMxOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfY29udGV4dC5jCkBAIC0wLDAgKzEsMTAzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisjaW5jbHVkZSAic2ltcGxlX2xpc3QuaCIKKyNpbmNsdWRlICJleHRlbnNpb25zLmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAicG9pbnRzLmgiCisKKyNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCisjaW5jbHVkZSAic3dyYXN0X3NldHVwL3N3cmFzdF9zZXR1cC5oIgorI2luY2x1ZGUgInRubC90bmwuaCIKKworI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCisjaW5jbHVkZSAidG5sL3RfdmVydGV4LmgiCisKKyNpbmNsdWRlICJkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5oIgorCisjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCisKKyNpbmNsdWRlICJpODMwX2RyaS5oIgorCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgorI2luY2x1ZGUgImludGVsX3BpeGVsLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcl9vYmplY3RzLmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfZGVjb2RlLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCisKKyNpbmNsdWRlICJkcmlyZW5kZXJidWZmZXIuaCIKKyNpbmNsdWRlICJ2YmxhbmsuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInhtbHBvb2wuaCIgICAgICAgICAgICAvKiBmb3Igc3ltYm9saWMgdmFsdWVzIG9mIGVudW0tdHlwZSBvcHRpb25zICovCisjaWZuZGVmIElOVEVMX0RFQlVHCitpbnQgSU5URUxfREVCVUcgPSAoMCk7CisjZW5kaWYKKworI2RlZmluZSBuZWVkX0dMX05WX3BvaW50X3Nwcml0ZQorI2RlZmluZSBuZWVkX0dMX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBuZWVkX0dMX0FSQl9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIG5lZWRfR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24KKyNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgbmVlZF9HTF9BUkJfd2luZG93X3BvcworI2RlZmluZSBuZWVkX0dMX0FSQl9vY2NsdXNpb25fcXVlcnkKKyNkZWZpbmUgbmVlZF9HTF9FWFRfYmxlbmRfY29sb3IKKyNkZWZpbmUgbmVlZF9HTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgbmVlZF9HTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgbmVlZF9HTF9FWFRfY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgbmVlZF9HTF9FWFRfZm9nX2Nvb3JkCisjZGVmaW5lIG5lZWRfR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBuZWVkX0dMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2RlZmluZSBuZWVkX0dMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgbmVlZF9HTF9OVl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBuZWVkX0dMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsCisjZGVmaW5lIG5lZWRfR0xfRVhUX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgbmVlZF9HTF9WRVJTSU9OXzJfMAorI2RlZmluZSBuZWVkX0dMX1ZFUlNJT05fMl8xCisjZGVmaW5lIG5lZWRfR0xfQVJCX3NoYWRlcl9vYmplY3RzCisjZGVmaW5lIG5lZWRfR0xfQVJCX3ZlcnRleF9zaGFkZXIKKworI2luY2x1ZGUgImV4dGVuc2lvbl9oZWxwZXIuaCIKKworI2RlZmluZSBEUklWRVJfREFURSAgICAgICAgICAgICAgICAgICAgICIyMDA4MDcxNiIKKyNkZWZpbmUgRFJJVkVSX0RBVEVfR0VNICAgICAgICAgICAgICAgICAiR0VNICIgRFJJVkVSX0RBVEUKKworc3RhdGljIGNvbnN0IEdMdWJ5dGUgKgoraW50ZWxHZXRTdHJpbmcoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gbmFtZSkKK3sKKyAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjb25zdCBpbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIGNvbnN0IGNoYXIgKmNoaXBzZXQ7CisgICBzdGF0aWMgY2hhciBidWZmZXJbMTI4XTsKKworICAgc3dpdGNoIChuYW1lKSB7CisgICBjYXNlIEdMX1ZFTkRPUjoKKyAgICAgIHJldHVybiAoR0x1Ynl0ZSAqKSAiVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYyI7CisgICAgICBicmVhazsKKworICAgY2FzZSBHTF9SRU5ERVJFUjoKKyAgICAgIHN3aXRjaCAoaW50ZWwtPmludGVsU2NyZWVuLT5kZXZpY2VJRCkgeworICAgICAgY2FzZSBQQ0lfQ0hJUF84NDVfRzoKKyAgICAgICAgIGNoaXBzZXQgPSAiSW50ZWwoUikgODQ1RyI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfSTgzMF9NOgorICAgICAgICAgY2hpcHNldCA9ICJJbnRlbChSKSA4MzBNIjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9JODU1X0dNOgorICAgICAgICAgY2hpcHNldCA9ICJJbnRlbChSKSA4NTJHTS84NTVHTSI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfSTg2NV9HOgorICAgICAgICAgY2hpcHNldCA9ICJJbnRlbChSKSA4NjVHIjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9JOTE1X0c6CisgICAgICAgICBjaGlwc2V0ID0gIkludGVsKFIpIDkxNUciOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0U3MjIxX0c6CisJIGNoaXBzZXQgPSAiSW50ZWwgKFIpIEU3MjIxRyAoaTkxNSkiOworCSBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfSTkxNV9HTToKKyAgICAgICAgIGNoaXBzZXQgPSAiSW50ZWwoUikgOTE1R00iOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0k5NDVfRzoKKyAgICAgICAgIGNoaXBzZXQgPSAiSW50ZWwoUikgOTQ1RyI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfSTk0NV9HTToKKyAgICAgICAgIGNoaXBzZXQgPSAiSW50ZWwoUikgOTQ1R00iOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0k5NDVfR01FOgorICAgICAgICAgY2hpcHNldCA9ICJJbnRlbChSKSA5NDVHTUUiOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0czM19HOgorCSBjaGlwc2V0ID0gIkludGVsKFIpIEczMyI7CisJIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9RMzVfRzoKKwkgY2hpcHNldCA9ICJJbnRlbChSKSBRMzUiOworCSBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfUTMzX0c6CisJIGNoaXBzZXQgPSAiSW50ZWwoUikgUTMzIjsKKwkgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0k5NjVfUToKKwkgY2hpcHNldCA9ICJJbnRlbChSKSA5NjVRIjsKKwkgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0k5NjVfRzoKKyAgICAgIGNhc2UgUENJX0NISVBfSTk2NV9HXzE6CisJIGNoaXBzZXQgPSAiSW50ZWwoUikgOTY1RyI7CisJIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9JOTQ2X0daOgorCSBjaGlwc2V0ID0gIkludGVsKFIpIDk0NkdaIjsKKwkgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0k5NjVfR006CisJIGNoaXBzZXQgPSAiSW50ZWwoUikgOTY1R00iOworCSBicmVhazsKKyAgICAgIGNhc2UgUENJX0NISVBfSTk2NV9HTUU6CisJIGNoaXBzZXQgPSAiSW50ZWwoUikgOTY1R01FL0dMRSI7CisJIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9HTTQ1X0dNOgorCSBjaGlwc2V0ID0gIk1vYmlsZSBJbnRlbMKuIEdNNDUgRXhwcmVzcyBDaGlwc2V0IjsKKwkgYnJlYWs7IAorICAgICAgY2FzZSBQQ0lfQ0hJUF9JR0RfRV9HOgorCSBjaGlwc2V0ID0gIkludGVsKFIpIEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlIjsKKwkgYnJlYWs7CisgICAgICBjYXNlIFBDSV9DSElQX0c0NV9HOgorICAgICAgICAgY2hpcHNldCA9ICJJbnRlbChSKSBHNDUvRzQzIjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQ0lfQ0hJUF9RNDVfRzoKKyAgICAgICAgIGNoaXBzZXQgPSAiSW50ZWwoUikgUTQ1L1E0MyI7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBjaGlwc2V0ID0gIlVua25vd24gSW50ZWwgQ2hpcHNldCI7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgKHZvaWQpIGRyaUdldFJlbmRlcmVyU3RyaW5nKGJ1ZmZlciwgY2hpcHNldCwgCisJCQkJICAoaW50ZWwtPnR0bSkgPyBEUklWRVJfREFURV9HRU0gOiBEUklWRVJfREFURSwKKwkJCQkgIDApOworICAgICAgcmV0dXJuIChHTHVieXRlICopIGJ1ZmZlcjsKKworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorfQorCisvKioKKyAqIEV4dGVuc2lvbiBzdHJpbmdzIGV4cG9ydGVkIGJ5IHRoZSBpbnRlbCBkcml2ZXIuCisgKgorICogRXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgYWxsIGNoaXBzIHN1cHBvcnRlZCBieSBpODMwX2RyaSwgaTkxNV9kcmksIG9yCisgKiBpOTY1X2RyaS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNhcmRfZXh0ZW5zaW9uc1tdID0geworICAgeyJHTF9BUkJfbXVsdGlzYW1wbGUiLCBHTF9BUkJfbXVsdGlzYW1wbGVfZnVuY3Rpb25zfSwKKyAgIHsiR0xfQVJCX211bHRpdGV4dHVyZSIsIE5VTEx9LAorICAgeyJHTF9BUkJfcG9pbnRfcGFyYW1ldGVycyIsIEdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzX2Z1bmN0aW9uc30sCisgICB7IkdMX05WX3BvaW50X3Nwcml0ZSIsIEdMX05WX3BvaW50X3Nwcml0ZV9mdW5jdGlvbnN9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAiLCBOVUxMfSwKKyAgIHsiR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24iLCBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9mdW5jdGlvbnN9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9jdWJlX21hcCIsIE5VTEx9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9lbnZfYWRkIiwgTlVMTH0sCisgICB7IkdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lIiwgTlVMTH0sCisgICB7IkdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhciIsIE5VTEx9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9lbnZfZG90MyIsIE5VTEx9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQiLCBOVUxMfSwKKyAgIHsiR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byIsICAgTlVMTCB9LAorICAgeyJHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUiLCBOVUxMfSwKKyAgIHsiR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUiLCBOVUxMfSwKKyAgIHsiR0xfRVhUX3RleHR1cmVfcmVjdGFuZ2xlIiwgTlVMTH0sCisgICB7IkdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzIiwgTlVMTH0sIAorICAgeyJHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QiLCBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3RfZnVuY3Rpb25zfSwKKyAgIHsiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwgR0xfQVJCX3ZlcnRleF9wcm9ncmFtX2Z1bmN0aW9uc30sCisgICB7IkdMX0FSQl93aW5kb3dfcG9zIiwgR0xfQVJCX3dpbmRvd19wb3NfZnVuY3Rpb25zfSwKKyAgIHsiR0xfRVhUX2JsZW5kX2NvbG9yIiwgR0xfRVhUX2JsZW5kX2NvbG9yX2Z1bmN0aW9uc30sCisgICB7IkdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSIsCisgICAgR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlX2Z1bmN0aW9uc30sCisgICB7IkdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlIiwgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGVfZnVuY3Rpb25zfSwKKyAgIHsiR0xfRVhUX2JsZW5kX21pbm1heCIsIEdMX0VYVF9ibGVuZF9taW5tYXhfZnVuY3Rpb25zfSwKKyAgIHsiR0xfRVhUX2JsZW5kX2xvZ2ljX29wIiwgTlVMTH0sCisgICB7IkdMX0VYVF9ibGVuZF9zdWJ0cmFjdCIsIE5VTEx9LAorICAgeyJHTF9FWFRfY3VsbF92ZXJ0ZXgiLCBHTF9FWFRfY3VsbF92ZXJ0ZXhfZnVuY3Rpb25zfSwKKyAgIHsiR0xfRVhUX2ZvZ19jb29yZCIsIEdMX0VYVF9mb2dfY29vcmRfZnVuY3Rpb25zfSwKKyAgIHsiR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzIiwgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzX2Z1bmN0aW9uc30sCisgICB7IkdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIiwgR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWxfZnVuY3Rpb25zfSwKKyNpZiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYIEZCTyB0ZW1wb3Jhcnk/ICovCisgICB7IkdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbCIsIE5VTEx9LAorI2VuZGlmCisgICB7IkdMX0VYVF9zZWNvbmRhcnlfY29sb3IiLCBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yX2Z1bmN0aW9uc30sCisgICB7IkdMX0VYVF9zdGVuY2lsX3dyYXAiLCBOVUxMfSwKKyAgIHsiR0xfRVhUX3RleHR1cmVfZWRnZV9jbGFtcCIsIE5VTEx9LAorICAgeyJHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSIsIE5VTEx9LAorICAgeyJHTF9FWFRfdGV4dHVyZV9lbnZfZG90MyIsIE5VTEx9LAorICAgeyJHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiLCBOVUxMfSwKKyAgIHsiR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMiLCBOVUxMfSwKKyAgIHsiR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEiLCBOVUxMfSwKKyAgIHsiR0xfQVBQTEVfY2xpZW50X3N0b3JhZ2UiLCBOVUxMfSwKKyAgIHsiR0xfTUVTQV9wYWNrX2ludmVydCIsIE5VTEx9LAorICAgeyJHTF9NRVNBX3ljYmNyX3RleHR1cmUiLCBOVUxMfSwKKyAgIHsiR0xfTlZfYmxlbmRfc3F1YXJlIiwgTlVMTH0sCisgICB7IkdMX05WX3ZlcnRleF9wcm9ncmFtIiwgR0xfTlZfdmVydGV4X3Byb2dyYW1fZnVuY3Rpb25zfSwKKyAgIHsiR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEiLCBOVUxMfSwKKyAgIHsgIkdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIiwgTlVMTCB9LAorICAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gYnJ3X2V4dGVuc2lvbnNbXSA9IHsKKyAgIHsgIkdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMCIsICAgICAgIEdMX1ZFUlNJT05fMl8wX2Z1bmN0aW9uc30sCisgICB7ICJHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMjAiLCAgICAgICBHTF9WRVJTSU9OXzJfMV9mdW5jdGlvbnN9LAorICAgeyAiR0xfQVJCX3NoYWRlcl9vYmplY3RzIiwgICAgICAgICAgICAgR0xfQVJCX3NoYWRlcl9vYmplY3RzX2Z1bmN0aW9uc30sCisgICB7ICJHTF9BUkJfdmVydGV4X3NoYWRlciIsICAgICAgICAgICAgICBHTF9BUkJfdmVydGV4X3NoYWRlcl9mdW5jdGlvbnN9LAorICAgeyAiR0xfQVJCX3BvaW50X3Nwcml0ZSIsIAkJICBOVUxMfSwKKyAgIHsgIkdMX0FSQl9mcmFnbWVudF9zaGFkZXIiLCAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0FSQl9kcmF3X2J1ZmZlcnMiLCAgICAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0FSQl9kZXB0aF90ZXh0dXJlIiwgICAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0FSQl9mcmFnbWVudF9wcm9ncmFtIiwgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0FSQl9zaGFkb3ciLCAgICAgICAgICAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0VYVF9zaGFkb3dfZnVuY3MiLCAgICAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdyIsICAgIE5VTEwgfSwKKyAgIC8qIEFSQiBleHRuIHdvbid0IHdvcmsgaWYgbm90IGVuYWJsZWQgKi8KKyAgIHsgIkdMX1NHSVhfZGVwdGhfdGV4dHVyZSIsICAgICAgICAgICAgIE5VTEwgfSwKKyAgIHsgIkdMX0VYVF90ZXh0dXJlX3NSR0IiLAkJICBOVUxMfSwKKyAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGFyYl9vY19leHRlbnNpb25zW10gPSB7CisgICB7IkdMX0FSQl9vY2NsdXNpb25fcXVlcnkiLCAgICAgICAgICAgIEdMX0FSQl9vY2NsdXNpb25fcXVlcnlfZnVuY3Rpb25zfSwKKyAgIHtOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIHR0bV9leHRlbnNpb25zW10gPSB7CisgICB7IkdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QiLCBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0X2Z1bmN0aW9uc30sCisgICB7IkdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0IiwgTlVMTH0sCisgICB7TlVMTCwgTlVMTH0KK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgcG90ZW50aWFsIGxpc3Qgb2YgZXh0ZW5zaW9ucyBpZiBjdHggPT0gTlVMTCwgb3IgYWN0dWFsbHkgZW5hYmxlcworICogZXh0ZW5zaW9ucyBmb3IgYSBjb250ZXh0LgorICovCit2b2lkIGludGVsSW5pdEV4dGVuc2lvbnMoR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBlbmFibGVfaW1hZ2luZykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGN0eD9pbnRlbF9jb250ZXh0KGN0eCk6TlVMTDsKKworICAgLyogRGlzYWJsZSBpbWFnaW5nIGV4dGVuc2lvbiB1bnRpbCBjb252b2x1dGlvbiBpcyB3b3JraW5nIGluIHRleGltYWdlIHBhdGhzLgorICAgICovCisgICBlbmFibGVfaW1hZ2luZyA9IEdMX0ZBTFNFOworCisgICBkcmlJbml0RXh0ZW5zaW9ucyhjdHgsIGNhcmRfZXh0ZW5zaW9ucywgZW5hYmxlX2ltYWdpbmcpOworCisgICBpZiAoaW50ZWwgPT0gTlVMTCB8fCBpbnRlbC0+dHRtKQorICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCB0dG1fZXh0ZW5zaW9ucywgR0xfRkFMU0UpOworCisgICBpZiAoaW50ZWwgPT0gTlVMTCB8fCAKKyAgICAgICAoSVNfOTY1KGludGVsLT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQpICYmIAorCWludGVsLT5pbnRlbFNjcmVlbi0+ZHJtTWlub3IgPj0gOCkpCisgICAgICBkcmlJbml0RXh0ZW5zaW9ucyhjdHgsIGFyYl9vY19leHRlbnNpb25zLCBHTF9GQUxTRSk7CisKKyAgIGlmIChpbnRlbCA9PSBOVUxMIHx8IElTXzk2NShpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSkKKyAgICAgIGRyaUluaXRFeHRlbnNpb25zKGN0eCwgYnJ3X2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcmlfZGVidWdfY29udHJvbCBkZWJ1Z19jb250cm9sW10gPSB7CisgICB7ICJ0ZXgiLCAgIERFQlVHX1RFWFRVUkV9LAorICAgeyAic3RhdGUiLCBERUJVR19TVEFURX0sCisgICB7ICJpb2N0bCIsIERFQlVHX0lPQ1RMfSwKKyAgIHsgImJsaXQiLCAgREVCVUdfQkxJVH0sCisgICB7ICJtaXAiLCAgIERFQlVHX01JUFRSRUV9LAorICAgeyAiZmFsbCIsICBERUJVR19GQUxMQkFDS1N9LAorICAgeyAidmVyYiIsICBERUJVR19WRVJCT1NFfSwKKyAgIHsgImJhdCIsICAgREVCVUdfQkFUQ0h9LAorICAgeyAicGl4IiwgICBERUJVR19QSVhFTH0sCisgICB7ICJidWYiLCAgIERFQlVHX0JVRk1HUn0sCisgICB7ICJyZWciLCAgIERFQlVHX1JFR0lPTn0sCisgICB7ICJmYm8iLCAgIERFQlVHX0ZCT30sCisgICB7ICJsb2NrIiwgIERFQlVHX0xPQ0t9LAorICAgeyAic3luYyIsICBERUJVR19TWU5DfSwKKyAgIHsgInByaW0iLCAgREVCVUdfUFJJTVMgfSwKKyAgIHsgInZlcnQiLCAgREVCVUdfVkVSVFMgfSwKKyAgIHsgImRyaSIsICAgREVCVUdfRFJJIH0sCisgICB7ICJkbWEiLCAgIERFQlVHX0RNQSB9LAorICAgeyAic2FuIiwgICBERUJVR19TQU5JVFkgfSwKKyAgIHsgInNsZWVwIiwgREVCVUdfU0xFRVAgfSwKKyAgIHsgInN0YXRzIiwgREVCVUdfU1RBVFMgfSwKKyAgIHsgInRpbGUiLCAgREVCVUdfVElMRSB9LAorICAgeyAic2luZyIsICBERUJVR19TSU5HTEVfVEhSRUFEIH0sCisgICB7ICJ0aHJlIiwgIERFQlVHX1NJTkdMRV9USFJFQUQgfSwKKyAgIHsgIndtIiwgICAgREVCVUdfV00gfSwKKyAgIHsgInVyYiIsICAgREVCVUdfVVJCIH0sCisgICB7ICJ2cyIsICAgIERFQlVHX1ZTIH0sCisgICB7IE5VTEwsICAgIDAgfQorfTsKKworCitzdGF0aWMgdm9pZAoraW50ZWxJbnZhbGlkYXRlU3RhdGUoR0xjb250ZXh0ICogY3R4LCBHTHVpbnQgbmV3X3N0YXRlKQoreworICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKworICAgX3N3cmFzdF9JbnZhbGlkYXRlU3RhdGUoY3R4LCBuZXdfc3RhdGUpOworICAgX3N3c2V0dXBfSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF92Ym9fSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF90bmxfSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF90bmxfaW52YWxpZGF0ZV92ZXJ0ZXhfc3RhdGUoY3R4LCBuZXdfc3RhdGUpOworCisgICBpbnRlbC0+TmV3R0xTdGF0ZSB8PSBuZXdfc3RhdGU7CisKKyAgIGlmIChpbnRlbC0+dnRibC5pbnZhbGlkYXRlX3N0YXRlKQorICAgICAgaW50ZWwtPnZ0YmwuaW52YWxpZGF0ZV9zdGF0ZSggaW50ZWwsIG5ld19zdGF0ZSApOworfQorCisKK3ZvaWQKK2ludGVsRmx1c2goR0xjb250ZXh0ICogY3R4KQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworCisgICBpZiAoaW50ZWwtPkZhbGxiYWNrKQorICAgICAgX3N3cmFzdF9mbHVzaChjdHgpOworCisgICBpZiAoIUlTXzk2NShpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSkKKyAgICAgIElOVEVMX0ZJUkVWRVJUSUNFUyhpbnRlbCk7CisKKyAgIC8qIEVtaXQgYSBmbHVzaCBzbyB0aGF0IGFueSBmcm9udGJ1ZmZlciByZW5kZXJpbmcgdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkCisgICAgKiBsYW5kcyBvbnNjcmVlbiBpbiBhIHRpbWVseSBtYW5uZXIsIGV2ZW4gaWYgdGhlIFggU2VydmVyIGRvZXNuJ3QgdHJpZ2dlcgorICAgICogYSBmbHVzaCBmb3IgdXMuCisgICAgKi8KKyAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goaW50ZWwtPmJhdGNoKTsKKworICAgaWYgKGludGVsLT5iYXRjaC0+bWFwICE9IGludGVsLT5iYXRjaC0+cHRyKQorICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goaW50ZWwtPmJhdGNoKTsKK30KKwordm9pZAoraW50ZWxGaW5pc2goR0xjb250ZXh0ICogY3R4KQoreworICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiA9IGN0eC0+RHJhd0J1ZmZlcjsKKyAgIGludCBpOworCisgICBpbnRlbEZsdXNoKGN0eCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnM7IGkrKykgeworICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYjsKKworICAgICAgIGlyYiA9IGludGVsX3JlbmRlcmJ1ZmZlcihmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbaV0pOworCisgICAgICAgaWYgKGlyYi0+cmVnaW9uKQorCSAgZHJpX2JvX3dhaXRfcmVuZGVyaW5nKGlyYi0+cmVnaW9uLT5idWZmZXIpOworICAgfQorICAgaWYgKGZiLT5fRGVwdGhCdWZmZXIpIHsKKyAgICAgIC8qIFhYWDogV2FpdCBvbiBidWZmZXIgaWRsZSAqLworICAgfQorfQorCitzdGF0aWMgdm9pZAoraW50ZWxCZWdpblF1ZXJ5KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKQoreworCXN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoIGN0eCApOworCXN0cnVjdCBkcm1faTkxNV9tbWlvIGlvID0geworCQkucmVhZF93cml0ZSA9IEk5MTVfTU1JT19SRUFELAorCQkucmVnID0gTU1JT19SRUdTX1BTX0RFUFRIX0NPVU5ULAorCQkuZGF0YSA9ICZxLT5SZXN1bHQgCisJfTsKKwlpbnRlbC0+c3RhdHNfd20rKzsKKwlpbnRlbEZpbmlzaCgmaW50ZWwtPmN0eCk7CisJZHJtQ29tbWFuZFdyaXRlKGludGVsLT5kcmlGZCwgRFJNX0k5MTVfTU1JTywgJmlvLCBzaXplb2YoaW8pKTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsRW5kUXVlcnkoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKnEpCit7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dCggY3R4ICk7CisJR0x1aW50NjRFWFQgdG1wOwkKKwlzdHJ1Y3QgZHJtX2k5MTVfbW1pbyBpbyA9IHsKKwkJLnJlYWRfd3JpdGUgPSBJOTE1X01NSU9fUkVBRCwKKwkJLnJlZyA9IE1NSU9fUkVHU19QU19ERVBUSF9DT1VOVCwKKwkJLmRhdGEgPSAmdG1wCisJfTsKKwlpbnRlbEZpbmlzaCgmaW50ZWwtPmN0eCk7CisJZHJtQ29tbWFuZFdyaXRlKGludGVsLT5kcmlGZCwgRFJNX0k5MTVfTU1JTywgJmlvLCBzaXplb2YoaW8pKTsKKwlxLT5SZXN1bHQgPSB0bXAgLSBxLT5SZXN1bHQ7CisJcS0+UmVhZHkgPSBHTF9UUlVFOworCWludGVsLT5zdGF0c193bS0tOworfQorCisvKiogRHJpdmVyLXNwZWNpZmljIGZlbmNlIGVtaXQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBmYWtlIG1lbW9yeSBtYW5hZ2VyLiAqLworc3RhdGljIHVuc2lnbmVkIGludAoraW50ZWxfZmVuY2VfZW1pdCh2b2lkICpwcml2YXRlKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gKHN0cnVjdCBpbnRlbF9jb250ZXh0ICopcHJpdmF0ZTsKKyAgIHVuc2lnbmVkIGludCBmZW5jZTsKKworICAgLyogWFhYOiBOZWVkIHRvIGVtaXQgYSBmbHVzaCwgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IChhdCBsZWFzdCB3aXRoIHRoZQorICAgICogY3VycmVudCBiYXRjaGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiwgd2UgaGF2ZSkuCisgICAgKi8KKworICAgZmVuY2UgPSBpbnRlbEVtaXRJcnFMb2NrZWQoaW50ZWwpOworCisgICByZXR1cm4gZmVuY2U7Cit9CisKKy8qKiBEcml2ZXItc3BlY2lmaWMgZmVuY2Ugd2FpdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGZha2UgbWVtb3J5IG1hbmFnZXIuICovCitzdGF0aWMgaW50CitpbnRlbF9mZW5jZV93YWl0KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGludCBjb29raWUpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSAoc3RydWN0IGludGVsX2NvbnRleHQgKilwcml2YXRlOworCisgICBpbnRlbFdhaXRJcnEoaW50ZWwsIGNvb2tpZSk7CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgR0xib29sZWFuCitpbnRlbF9pbml0X2J1Zm1ncihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpCit7CisgICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOworICAgR0xib29sZWFuIGdlbV9kaXNhYmxlID0gZ2V0ZW52KCJJTlRFTF9OT19HRU0iKSAhPSBOVUxMOworICAgaW50IGdlbV9rZXJuZWwgPSAwOworICAgR0xib29sZWFuIGdlbV9zdXBwb3J0ZWQ7CisgICBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gZ3A7CisKKyAgIGdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfR0VNOworICAgZ3AudmFsdWUgPSAmZ2VtX2tlcm5lbDsKKworICAgKHZvaWQpIGRybUNvbW1hbmRXcml0ZVJlYWQoaW50ZWwtPmRyaUZkLCBEUk1fSTkxNV9HRVRQQVJBTSwgJmdwLCBzaXplb2YoZ3ApKTsKKworICAgLyogSWYgd2UndmUgZ290IGEgbmV3IGVub3VnaCBERFggdGhhdCdzIGluaXRpYWxpemluZyBHRU0gYW5kIGdpdmluZyB1cworICAgICogb2JqZWN0IGhhbmRsZXMgZm9yIHRoZSBzaGFyZWQgYnVmZmVycywgdXNlIHRoYXQuCisgICAgKi8KKyAgIGludGVsLT50dG0gPSBHTF9GQUxTRTsKKyAgIGlmIChpbnRlbC0+aW50ZWxTY3JlZW4tPmRyaVNjcm5Qcml2LT5kcmkyLmVuYWJsZWQpCisgICAgICAgZ2VtX3N1cHBvcnRlZCA9IEdMX1RSVUU7CisgICBlbHNlIGlmIChpbnRlbC0+aW50ZWxTY3JlZW4tPmRyaVNjcm5Qcml2LT5kZHhfdmVyc2lvbi5taW5vciA+PSA5ICYmCisJICAgIGdlbV9rZXJuZWwgJiYKKwkgICAgaW50ZWwtPmludGVsU2NyZWVuLT5mcm9udC5ib19oYW5kbGUgIT0gLTEpCisgICAgICAgZ2VtX3N1cHBvcnRlZCA9IEdMX1RSVUU7CisgICBlbHNlCisgICAgICAgZ2VtX3N1cHBvcnRlZCA9IEdMX0ZBTFNFOworCisgICBpZiAoIWdlbV9kaXNhYmxlICYmIGdlbV9zdXBwb3J0ZWQpIHsKKyAgICAgIGludCBib19yZXVzZV9tb2RlOworICAgICAgaW50ZWwtPmJ1Zm1nciA9IGludGVsX2J1Zm1ncl9nZW1faW5pdChpbnRlbC0+ZHJpRmQsCisJCQkJCSAgICBCQVRDSF9TWik7CisgICAgICBpZiAoaW50ZWwtPmJ1Zm1nciAhPSBOVUxMKQorCSBpbnRlbC0+dHRtID0gR0xfVFJVRTsKKworICAgICAgYm9fcmV1c2VfbW9kZSA9IGRyaVF1ZXJ5T3B0aW9uaSgmaW50ZWwtPm9wdGlvbkNhY2hlLCAiYm9fcmV1c2UiKTsKKyAgICAgIHN3aXRjaCAoYm9fcmV1c2VfbW9kZSkgeworICAgICAgY2FzZSBEUklfQ09ORl9CT19SRVVTRV9ESVNBQkxFRDoKKwkgYnJlYWs7CisgICAgICBjYXNlIERSSV9DT05GX0JPX1JFVVNFX0FMTDoKKwkgaW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2UoaW50ZWwtPmJ1Zm1ncik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorICAgLyogT3RoZXJ3aXNlLCB1c2UgdGhlIGNsYXNzaWMgYnVmZmVyIG1hbmFnZXIuICovCisgICBpZiAoaW50ZWwtPmJ1Zm1nciA9PSBOVUxMKSB7CisgICAgICBpZiAoZ2VtX2Rpc2FibGUpIHsKKwkgZnByaW50ZihzdGRlcnIsICJHRU0gZGlzYWJsZWQuICBVc2luZyBjbGFzc2ljLlxuIik7CisgICAgICB9IGVsc2UgeworCSBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0aWFsaXplIEdFTS4gICIKKwkJICJGYWxsaW5nIGJhY2sgdG8gY2xhc3NpYy5cbiIpOworICAgICAgfQorCisgICAgICBpZiAoaW50ZWxTY3JlZW4tPnRleC5zaXplID09IDApIHsKKwkgZnByaW50ZihzdGRlcnIsICJbJXM6JXVdIEVycm9yIGluaXRpYWxpemluZyBidWZmZXIgbWFuYWdlci5cbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCSByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisKKyAgICAgIGludGVsLT5idWZtZ3IgPSBpbnRlbF9idWZtZ3JfZmFrZV9pbml0KGludGVsU2NyZWVuLT50ZXgub2Zmc2V0LAorCQkJCQkgICAgIGludGVsU2NyZWVuLT50ZXgubWFwLAorCQkJCQkgICAgIGludGVsU2NyZWVuLT50ZXguc2l6ZSwKKwkJCQkJICAgICBpbnRlbF9mZW5jZV9lbWl0LAorCQkJCQkgICAgIGludGVsX2ZlbmNlX3dhaXQsCisJCQkJCSAgICAgaW50ZWwpOworICAgfQorCisgICAvKiBYWFggYnVmbWdyIHNob3VsZCBiZSBwZXItc2NyZWVuLCBub3QgcGVyLWNvbnRleHQgKi8KKyAgIGludGVsU2NyZWVuLT50dG0gPSBpbnRlbC0+dHRtOworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKwordm9pZAoraW50ZWxJbml0RHJpdmVyRnVuY3Rpb25zKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKQoreworICAgX21lc2FfaW5pdF9kcml2ZXJfZnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisKKyAgIGZ1bmN0aW9ucy0+Rmx1c2ggPSBpbnRlbEZsdXNoOworICAgZnVuY3Rpb25zLT5GaW5pc2ggPSBpbnRlbEZpbmlzaDsKKyAgIGZ1bmN0aW9ucy0+R2V0U3RyaW5nID0gaW50ZWxHZXRTdHJpbmc7CisgICBmdW5jdGlvbnMtPlVwZGF0ZVN0YXRlID0gaW50ZWxJbnZhbGlkYXRlU3RhdGU7CisKKyAgIGZ1bmN0aW9ucy0+Q29weUNvbG9yVGFibGUgPSBfc3dyYXN0X0NvcHlDb2xvclRhYmxlOworICAgZnVuY3Rpb25zLT5Db3B5Q29sb3JTdWJUYWJsZSA9IF9zd3Jhc3RfQ29weUNvbG9yU3ViVGFibGU7CisgICBmdW5jdGlvbnMtPkNvcHlDb252b2x1dGlvbkZpbHRlcjFEID0gX3N3cmFzdF9Db3B5Q29udm9sdXRpb25GaWx0ZXIxRDsKKyAgIGZ1bmN0aW9ucy0+Q29weUNvbnZvbHV0aW9uRmlsdGVyMkQgPSBfc3dyYXN0X0NvcHlDb252b2x1dGlvbkZpbHRlcjJEOworCisgICBmdW5jdGlvbnMtPkJlZ2luUXVlcnkgPSBpbnRlbEJlZ2luUXVlcnk7CisgICBmdW5jdGlvbnMtPkVuZFF1ZXJ5ID0gaW50ZWxFbmRRdWVyeTsKKworICAgaW50ZWxJbml0VGV4dHVyZUZ1bmNzKGZ1bmN0aW9ucyk7CisgICBpbnRlbEluaXRTdGF0ZUZ1bmNzKGZ1bmN0aW9ucyk7CisgICBpbnRlbEluaXRCdWZmZXJGdW5jcyhmdW5jdGlvbnMpOworICAgaW50ZWxJbml0UGl4ZWxGdW5jcyhmdW5jdGlvbnMpOworfQorCisKK0dMYm9vbGVhbgoraW50ZWxJbml0Q29udGV4dChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICBfX0RSSWNvbnRleHRQcml2YXRlICogZHJpQ29udGV4dFByaXYsCisgICAgICAgICAgICAgICAgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKK3sKKyAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7CisgICBHTGNvbnRleHQgKnNoYXJlQ3R4ID0gKEdMY29udGV4dCAqKSBzaGFyZWRDb250ZXh0UHJpdmF0ZTsKKyAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYgPSBkcmlDb250ZXh0UHJpdi0+ZHJpU2NyZWVuUHJpdjsKKyAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4gPSAoaW50ZWxTY3JlZW5Qcml2YXRlICopIHNQcml2LT5wcml2YXRlOworICAgdm9sYXRpbGUgc3RydWN0IGRybV9pOTE1X3NhcmVhICpzYVByaXYgPSAoc3RydWN0IGRybV9pOTE1X3NhcmVhICopCisgICAgICAoKChHTHVieXRlICopIHNQcml2LT5wU0FSRUEpICsgaW50ZWxTY3JlZW4tPnNhcmVhX3ByaXZfb2Zmc2V0KTsKKyAgIGludCBmdGhyb3R0bGVfbW9kZTsKKworICAgaWYgKCFfbWVzYV9pbml0aWFsaXplX2NvbnRleHQoJmludGVsLT5jdHgsIG1lc2FWaXMsIHNoYXJlQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLCAodm9pZCAqKSBpbnRlbCkpIHsKKyAgICAgIF9tZXNhX3ByaW50ZigiJXM6IGZhaWxlZCB0byBpbml0IG1lc2EgY29udGV4dFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUgPSBpbnRlbDsKKyAgIGludGVsLT5pbnRlbFNjcmVlbiA9IGludGVsU2NyZWVuOworICAgaW50ZWwtPmRyaVNjcmVlbiA9IHNQcml2OworICAgaW50ZWwtPnNhcmVhID0gc2FQcml2OworCisgICAvKiBEcmkgc3R1ZmYgKi8KKyAgIGludGVsLT5oSFdDb250ZXh0ID0gZHJpQ29udGV4dFByaXYtPmhIV0NvbnRleHQ7CisgICBpbnRlbC0+ZHJpRmQgPSBzUHJpdi0+ZmQ7CisgICBpbnRlbC0+ZHJpSHdMb2NrID0gc1ByaXYtPmxvY2s7CisKKyAgIGludGVsLT53aWR0aCA9IGludGVsU2NyZWVuLT53aWR0aDsKKyAgIGludGVsLT5oZWlnaHQgPSBpbnRlbFNjcmVlbi0+aGVpZ2h0OworCisgICBkcmlQYXJzZUNvbmZpZ0ZpbGVzKCZpbnRlbC0+b3B0aW9uQ2FjaGUsICZpbnRlbFNjcmVlbi0+b3B0aW9uQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludGVsLT5kcmlTY3JlZW4tPm15TnVtLAorCQkgICAgICAgSVNfOTY1KGludGVsU2NyZWVuLT5kZXZpY2VJRCkgPyAiaTk2NSIgOiAiaTkxNSIpOworICAgaWYgKGludGVsU2NyZWVuLT5kZXZpY2VJRCA9PSBQQ0lfQ0hJUF9JODY1X0cpCisgICAgICBpbnRlbC0+bWF4QmF0Y2hTaXplID0gNDA5NjsKKyAgIGVsc2UKKyAgICAgIGludGVsLT5tYXhCYXRjaFNpemUgPSBCQVRDSF9TWjsKKworICAgaWYgKCFpbnRlbF9pbml0X2J1Zm1ncihpbnRlbCkpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZU1heEFuaXNvdHJvcHkgPSAyLjA7CisKKyAgIC8qIFRoaXMgZG9lc24ndCB5ZXQgY2F0Y2ggYWxsIG5vbi1jb25mb3JtYW50IHJlbmRlcmluZywgYnV0IGl0J3MgYQorICAgICogc3RhcnQuCisgICAgKi8KKyAgIGlmIChnZXRlbnYoIklOVEVMX1NUUklDVF9DT05GT1JNQU5DRSIpKSB7CisgICAgICBpbnRlbC0+c3RyaWN0X2NvbmZvcm1hbmNlID0gMTsKKyAgIH0KKworICAgaWYgKGludGVsLT5zdHJpY3RfY29uZm9ybWFuY2UpIHsKKyAgICAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoID0gMS4wOworICAgICAgY3R4LT5Db25zdC5NaW5MaW5lV2lkdGhBQSA9IDEuMDsKKyAgICAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoID0gMS4wOworICAgICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGhBQSA9IDEuMDsKKyAgICAgIGN0eC0+Q29uc3QuTGluZVdpZHRoR3JhbnVsYXJpdHkgPSAxLjA7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoID0gMS4wOworICAgICAgY3R4LT5Db25zdC5NaW5MaW5lV2lkdGhBQSA9IDEuMDsKKyAgICAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoID0gNS4wOworICAgICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGhBQSA9IDUuMDsKKyAgICAgIGN0eC0+Q29uc3QuTGluZVdpZHRoR3JhbnVsYXJpdHkgPSAwLjU7CisgICB9CisKKyAgIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplID0gMS4wOworICAgY3R4LT5Db25zdC5NaW5Qb2ludFNpemVBQSA9IDEuMDsKKyAgIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplID0gMjU1LjA7CisgICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZUFBID0gMy4wOworICAgY3R4LT5Db25zdC5Qb2ludFNpemVHcmFudWxhcml0eSA9IDEuMDsKKworICAgLyogcmVpbml0aWFsaXplIHRoZSBjb250ZXh0IHBvaW50IHN0YXRlLgorICAgICogSXQgZGVwZW5kIG9uIGNvbnN0YW50cyBpbiBfX0dMY29udGV4dFJlYzo6Q29uc3QKKyAgICAqLworICAgX21lc2FfaW5pdF9wb2ludChjdHgpOworCisgICBjdHgtPkNvbnN0Lk1heENvbG9yQXR0YWNobWVudHMgPSA0OyAgLyogWFhYIEZCTzogcmV2aWV3IHRoaXMgKi8KKworICAgLyogSW5pdGlhbGl6ZSB0aGUgc29mdHdhcmUgcmFzdGVyaXplciBhbmQgaGVscGVyIG1vZHVsZXMuICovCisgICBfc3dyYXN0X0NyZWF0ZUNvbnRleHQoY3R4KTsKKyAgIF92Ym9fQ3JlYXRlQ29udGV4dChjdHgpOworICAgX3RubF9DcmVhdGVDb250ZXh0KGN0eCk7CisgICBfc3dzZXR1cF9DcmVhdGVDb250ZXh0KGN0eCk7CisgCisgICAvKiBDb25maWd1cmUgc3dyYXN0IHRvIG1hdGNoIGhhcmR3YXJlIGNoYXJhY3RlcmlzdGljczogKi8KKyAgIF9zd3Jhc3RfYWxsb3dfcGl4ZWxfZm9nKGN0eCwgR0xfRkFMU0UpOworICAgX3N3cmFzdF9hbGxvd192ZXJ0ZXhfZm9nKGN0eCwgR0xfVFJVRSk7CisKKyAgIGludGVsLT5od19zdGVuY2lsID0gbWVzYVZpcy0+c3RlbmNpbEJpdHMgJiYgbWVzYVZpcy0+ZGVwdGhCaXRzID09IDI0OworICAgaW50ZWwtPmh3X3N0aXBwbGUgPSAxOworCisgICAvKiBYWFggRkJPOiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSB1c2VkIGFueXdoZXJlICovCisgICBzd2l0Y2ggKG1lc2FWaXMtPmRlcHRoQml0cykgeworICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIHdoYXQgdG8gZG8gaW4gdGhpcyBjYXNlPyAqLworICAgY2FzZSAxNjoKKyAgICAgIGludGVsLT5wb2x5Z29uX29mZnNldF9zY2FsZSA9IDEuMDsKKyAgICAgIGJyZWFrOworICAgY2FzZSAyNDoKKyAgICAgIGludGVsLT5wb2x5Z29uX29mZnNldF9zY2FsZSA9IDIuMDsgICAgIC8qIHJlcSdkIHRvIHBhc3MgZ2xlYW4gKi8KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoSVNfOTY1KGludGVsU2NyZWVuLT5kZXZpY2VJRCkpCisgICAgICBpbnRlbC0+cG9seWdvbl9vZmZzZXRfc2NhbGUgLz0gMHhmZmZmOworCisgICBpbnRlbC0+UmVuZGVySW5kZXggPSB+MDsKKworICAgZnRocm90dGxlX21vZGUgPSBkcmlRdWVyeU9wdGlvbmkoJmludGVsLT5vcHRpb25DYWNoZSwgImZ0aHJvdHRsZV9tb2RlIik7CisgICBpbnRlbC0+aXJxc0VtaXR0ZWQgPSAwOworCisgICBpbnRlbC0+ZG9faXJxcyA9IChpbnRlbC0+aW50ZWxTY3JlZW4tPmlycV9hY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgICAgIGZ0aHJvdHRsZV9tb2RlID09IERSSV9DT05GX0ZUSFJPVFRMRV9JUlFTKTsKKworICAgaW50ZWwtPmRvX3VzbGVlcHMgPSAoZnRocm90dGxlX21vZGUgPT0gRFJJX0NPTkZfRlRIUk9UVExFX1VTTEVFUFMpOworCisgICBfbWF0aF9tYXRyaXhfY3RyKCZpbnRlbC0+Vmlld3BvcnRNYXRyaXgpOworCisgICBpZiAoSVNfOTY1KGludGVsU2NyZWVuLT5kZXZpY2VJRCkgJiYgIWludGVsLT5pbnRlbFNjcmVlbi0+aXJxX2FjdGl2ZSkgeworICAgICAgX21lc2FfcHJpbnRmKCJJUlFzIG5vdCBhY3RpdmUuICBFeGl0aW5nXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGludGVsSW5pdEV4dGVuc2lvbnMoY3R4LCBHTF9GQUxTRSk7CisKKyAgIElOVEVMX0RFQlVHID0gZHJpUGFyc2VEZWJ1Z1N0cmluZyhnZXRlbnYoIklOVEVMX0RFQlVHIiksIGRlYnVnX2NvbnRyb2wpOworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQlVGTUdSKQorICAgICAgZHJpX2J1Zm1ncl9zZXRfZGVidWcoaW50ZWwtPmJ1Zm1nciwgR0xfVFJVRSk7CisKKyAgIGlmICghc1ByaXYtPmRyaTIuZW5hYmxlZCkKKyAgICAgIGludGVsX3JlY3JlYXRlX3N0YXRpY19yZWdpb25zKGludGVsKTsKKworICAgaW50ZWwtPmJhdGNoID0gaW50ZWxfYmF0Y2hidWZmZXJfYWxsb2MoaW50ZWwpOworCisgICBpbnRlbF9idWZmZXJvYmpfaW5pdChpbnRlbCk7CisgICBpbnRlbF9mYm9faW5pdChpbnRlbCk7CisKKyAgIGlmIChpbnRlbC0+Y3R4Lk1lc2FfRFhUbikgeworICAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbihjdHgsICJHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjIik7CisgICAgICBfbWVzYV9lbmFibGVfZXh0ZW5zaW9uKGN0eCwgIkdMX1MzX3MzdGMiKTsKKyAgIH0KKyAgIGVsc2UgaWYgKGRyaVF1ZXJ5T3B0aW9uYigmaW50ZWwtPm9wdGlvbkNhY2hlLCAiZm9yY2VfczN0Y19lbmFibGUiKSkgeworICAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbihjdHgsICJHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjIik7CisgICB9CisKKyAgIGludGVsLT5wcmltLnByaW1pdGl2ZSA9IH4wOworCisgICAvKiBGb3JjZSBhbGwgc29mdHdhcmUgZmFsbGJhY2tzICovCisgICBpZiAoZHJpUXVlcnlPcHRpb25iKCZpbnRlbC0+b3B0aW9uQ2FjaGUsICJub19yYXN0IikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZGlzYWJsaW5nIDNEIHJhc3Rlcml6YXRpb25cbiIpOworICAgICAgaW50ZWwtPm5vX3Jhc3QgPSAxOworICAgfQorCisgICAvKiBEaXNhYmxlIGFsbCBoYXJkd2FyZSByZW5kZXJpbmcgKHNraXAgZW1pdHRpbmcgYmF0Y2hlcyBhbmQgZmVuY2VzL3dhaXRzCisgICAgKiB0byB0aGUga2VybmVsKQorICAgICovCisgICBpbnRlbC0+bm9faHcgPSBnZXRlbnYoIklOVEVMX05PX0hXIikgIT0gTlVMTDsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3ZvaWQKK2ludGVsRGVzdHJveUNvbnRleHQoX19EUkljb250ZXh0UHJpdmF0ZSAqIGRyaUNvbnRleHRQcml2KQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0KKyAgICAgIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKSBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKworICAgYXNzZXJ0KGludGVsKTsgICAgICAgICAgICAgICAvKiBzaG91bGQgbmV2ZXIgYmUgbnVsbCAqLworICAgaWYgKGludGVsKSB7CisgICAgICBHTGJvb2xlYW4gcmVsZWFzZV90ZXh0dXJlX2hlYXBzOworCisgICAgICBJTlRFTF9GSVJFVkVSVElDRVMoaW50ZWwpOworCisgICAgICBpbnRlbC0+dnRibC5kZXN0cm95KGludGVsKTsKKworICAgICAgcmVsZWFzZV90ZXh0dXJlX2hlYXBzID0gKGludGVsLT5jdHguU2hhcmVkLT5SZWZDb3VudCA9PSAxKTsKKyAgICAgIF9zd3NldHVwX0Rlc3Ryb3lDb250ZXh0KCZpbnRlbC0+Y3R4KTsKKyAgICAgIF90bmxfRGVzdHJveUNvbnRleHQoJmludGVsLT5jdHgpOworICAgICAgX3Zib19EZXN0cm95Q29udGV4dCgmaW50ZWwtPmN0eCk7CisKKyAgICAgIF9zd3Jhc3RfRGVzdHJveUNvbnRleHQoJmludGVsLT5jdHgpOworICAgICAgaW50ZWwtPkZhbGxiYWNrID0gMDsgICAgICAvKiBkb24ndCBjYWxsIF9zd3Jhc3RfRmx1c2ggbGF0ZXIgKi8KKworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZnJlZShpbnRlbC0+YmF0Y2gpOworICAgICAgZnJlZShpbnRlbC0+cHJpbS52Yik7CisKKyAgICAgIGlmIChyZWxlYXNlX3RleHR1cmVfaGVhcHMpIHsKKyAgICAgICAgIC8qIFRoaXMgc2hhcmUgZ3JvdXAgaXMgYWJvdXQgdG8gZ28gYXdheSwgZnJlZSBvdXIgcHJpdmF0ZQorICAgICAgICAgICogdGV4dHVyZSBvYmplY3QgZGF0YS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG8gc29tZXRoaW5nIHRvIGZyZWUgdGV4dHVyZSBoZWFwc1xuIik7CisgICAgICB9CisKKyAgICAgIC8qIGZyZWUgdGhlIE1lc2EgY29udGV4dCAqLworICAgICAgX21lc2FfZnJlZV9jb250ZXh0X2RhdGEoJmludGVsLT5jdHgpOworCisgICAgICBkcmlfYnVmbWdyX2Rlc3Ryb3koaW50ZWwtPmJ1Zm1ncik7CisgICB9Cit9CisKK0dMYm9vbGVhbgoraW50ZWxVbmJpbmRDb250ZXh0KF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdikKK3sKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitHTGJvb2xlYW4KK2ludGVsTWFrZUN1cnJlbnQoX19EUkljb250ZXh0UHJpdmF0ZSAqIGRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyaURyYXdQcml2LAorICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyaVJlYWRQcml2KQoreworICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBkcmlEcmF3UHJpdi0+ZHJpU2NyZWVuUHJpdjsKKworICAgaWYgKGRyaUNvbnRleHRQcml2KSB7CisgICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPQorICAgICAgICAgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICopIGRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOworICAgICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9CisJIChzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKikgZHJpRHJhd1ByaXYtPmRyaXZlclByaXZhdGU7CisgICAgICBHTGZyYW1lYnVmZmVyICpyZWFkRmIgPSAoR0xmcmFtZWJ1ZmZlciAqKSBkcmlSZWFkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKworCisgICAgICAvKiBYWFggRkJPIHRlbXBvcmFyeSBmaXgtdXBzISAqLworICAgICAgLyogaWYgdGhlIHJlbmRlcmJ1ZmZlcnMgZG9uJ3QgaGF2ZSByZWdpb25zLCBpbml0IHRoZW0gZnJvbSB0aGUgY29udGV4dCAqLworICAgICAgaWYgKCFkcmlDb250ZXh0UHJpdi0+ZHJpU2NyZWVuUHJpdi0+ZHJpMi5lbmFibGVkKSB7CisgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmJEZXB0aAorICAgICAgICAgICAgPSBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKCZpbnRlbF9mYi0+QmFzZSwgQlVGRkVSX0RFUFRIKTsKKyAgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYlN0ZW5jaWwKKyAgICAgICAgICAgID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9TVEVOQ0lMKTsKKworICAgICAgICAgaWYgKGludGVsX2ZiLT5jb2xvcl9yYlswXSkgeworCSAgICBpbnRlbF9yZW5kZXJidWZmZXJfc2V0X3JlZ2lvbihpbnRlbF9mYi0+Y29sb3JfcmJbMF0sCisJCQkJCSAgaW50ZWwtPmZyb250X3JlZ2lvbik7CisgICAgICAgICB9CisgICAgICAgICBpZiAoaW50ZWxfZmItPmNvbG9yX3JiWzFdKSB7CisJICAgIGludGVsX3JlbmRlcmJ1ZmZlcl9zZXRfcmVnaW9uKGludGVsX2ZiLT5jb2xvcl9yYlsxXSwKKwkJCQkJICBpbnRlbC0+YmFja19yZWdpb24pOworICAgICAgICAgfQorI2lmIDAKKyAgICAgICAgIGlmIChpbnRlbF9mYi0+Y29sb3JfcmJbMl0pIHsKKwkgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3NldF9yZWdpb24oaW50ZWxfZmItPmNvbG9yX3JiWzJdLAorCQkJCQkgIGludGVsLT50aGlyZF9yZWdpb24pOworICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICBpZiAoaXJiRGVwdGgpIHsKKwkgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3NldF9yZWdpb24oaXJiRGVwdGgsIGludGVsLT5kZXB0aF9yZWdpb24pOworICAgICAgICAgfQorICAgICAgICAgaWYgKGlyYlN0ZW5jaWwpIHsKKwkgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3NldF9yZWdpb24oaXJiU3RlbmNpbCwgaW50ZWwtPmRlcHRoX3JlZ2lvbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHNldCBHTGZyYW1lYnVmZmVyIHNpemUgdG8gbWF0Y2ggd2luZG93LCBpZiBuZWVkZWQgKi8KKyAgICAgIGRyaVVwZGF0ZUZyYW1lYnVmZmVyU2l6ZSgmaW50ZWwtPmN0eCwgZHJpRHJhd1ByaXYpOworCisgICAgICBpZiAoZHJpUmVhZFByaXYgIT0gZHJpRHJhd1ByaXYpIHsKKwkgZHJpVXBkYXRlRnJhbWVidWZmZXJTaXplKCZpbnRlbC0+Y3R4LCBkcmlSZWFkUHJpdik7CisgICAgICB9CisKKyAgICAgIF9tZXNhX21ha2VfY3VycmVudCgmaW50ZWwtPmN0eCwgJmludGVsX2ZiLT5CYXNlLCByZWFkRmIpOworCisgICAgICAvKiBUaGUgZHJhd2J1ZmZlciB3b24ndCBhbHdheXMgYmUgdXBkYXRlZCBieSBfbWVzYV9tYWtlX2N1cnJlbnQ6IAorICAgICAgICovCisgICAgICBpZiAoaW50ZWwtPmN0eC5EcmF3QnVmZmVyID09ICZpbnRlbF9mYi0+QmFzZSkgeworCisJIGlmIChpbnRlbC0+ZHJpUmVhZERyYXdhYmxlICE9IGRyaVJlYWRQcml2KQorCSAgICBpbnRlbC0+ZHJpUmVhZERyYXdhYmxlID0gZHJpUmVhZFByaXY7CisKKwkgaWYgKGludGVsLT5kcmlEcmF3YWJsZSAhPSBkcmlEcmF3UHJpdikgeworCSAgICBpZiAoZHJpRHJhd1ByaXYtPnN3YXBfaW50ZXJ2YWwgPT0gKHVuc2lnbmVkKS0xKSB7CisJICAgICAgIGludCBpOworCisJICAgICAgIGRyaURyYXdQcml2LT52YmxGbGFncyA9IChpbnRlbC0+aW50ZWxTY3JlZW4tPmlycV9hY3RpdmUgIT0gMCkKKwkJICA/IGRyaUdldERlZmF1bHRWQmxhbmtGbGFncygmaW50ZWwtPm9wdGlvbkNhY2hlKQorCQkgOiBWQkxBTktfRkxBR19OT19JUlE7CisKKwkgICAgICAgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkgKCZpbnRlbF9mYi0+c3dhcF91c3QpOworCSAgICAgICBkcmlEcmF3YWJsZUluaXRWQmxhbmsoZHJpRHJhd1ByaXYpOworCSAgICAgICBpbnRlbF9mYi0+dmJsX3dhaXRlZCA9IGRyaURyYXdQcml2LT52YmxTZXE7CisKKwkgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnRlbC0+aW50ZWxTY3JlZW4tPnRoaXJkLmhhbmRsZSA/IDMgOiAyKTsgaSsrKSB7CisJCSAgaWYgKGludGVsX2ZiLT5jb2xvcl9yYltpXSkKKwkJICAgICBpbnRlbF9mYi0+Y29sb3JfcmJbaV0tPnZibF9wZW5kaW5nID0gZHJpRHJhd1ByaXYtPnZibFNlcTsKKwkgICAgICAgfQorCSAgICB9CisJICAgIGludGVsLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OworCSAgICBpbnRlbFdpbmRvd01vdmVkKGludGVsKTsKKwkgfQorCisJIGludGVsX2RyYXdfYnVmZmVyKCZpbnRlbC0+Y3R4LCAmaW50ZWxfZmItPkJhc2UpOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoTlVMTCwgTlVMTCwgTlVMTCk7CisgICB9CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgdm9pZAoraW50ZWxDb250ZW5kZWRMb2NrKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGZsYWdzKQoreworICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gaW50ZWwtPmRyaURyYXdhYmxlOworICAgX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdiA9IGludGVsLT5kcmlTY3JlZW47CisgICB2b2xhdGlsZSBzdHJ1Y3QgZHJtX2k5MTVfc2FyZWEgKnNhcmVhID0gaW50ZWwtPnNhcmVhOworICAgaW50IG1lID0gaW50ZWwtPmhIV0NvbnRleHQ7CisKKyAgIGRybUdldExvY2soaW50ZWwtPmRyaUZkLCBpbnRlbC0+aEhXQ29udGV4dCwgZmxhZ3MpOworICAgaW50ZWwtPmxvY2tlZCA9IDE7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0xPQ0spCisgICAgICBfbWVzYV9wcmludGYoIiVzIC0gZ290IGNvbnRlbmRlZCBsb2NrXG4iLCBfX3Byb2duYW1lKTsKKworICAgLyogSWYgdGhlIHdpbmRvdyBtb3ZlZCwgbWF5IG5lZWQgdG8gc2V0IGEgbmV3IGNsaXByZWN0IG5vdy4KKyAgICAqCisgICAgKiBOT1RFOiBUaGlzIHJlbGVhc2VzIGFuZCByZWdhaW5zIHRoZSBodyBsb2NrLCBzbyBhbGwgc3RhdGUKKyAgICAqIGNoZWNraW5nIG11c3QgYmUgZG9uZSAqYWZ0ZXIqIHRoaXMgY2FsbDoKKyAgICAqLworICAgaWYgKGRQcml2KQorICAgICAgIERSSV9WQUxJREFURV9EUkFXQUJMRV9JTkZPKHNQcml2LCBkUHJpdik7CisKKyAgIGlmIChzYXJlYSAmJiBzYXJlYS0+Y3R4T3duZXIgIT0gbWUpIHsKKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0JVRk1HUikgeworCSBmcHJpbnRmKHN0ZGVyciwgIkxvc3QgQ29udGV4dDogc2FyZWEtPmN0eE93bmVyICV4IG1lICV4XG4iLAorCQkgc2FyZWEtPmN0eE93bmVyLCBtZSk7CisgICAgICB9CisgICAgICBzYXJlYS0+Y3R4T3duZXIgPSBtZTsKKyAgIH0KKworICAgLyogSWYgdGhlIGxhc3QgY29uc3VtZXIgb2YgdGhlIHRleHR1cmUgbWVtb3J5IHdhc24ndCB1cywgbm90aWZ5IHRoZSBmYWtlCisgICAgKiBidWZtZ3IgYW5kIHJlY29yZCB0aGUgbmV3IG93bmVyLiAgV2Ugc2hvdWxkIGhhdmUgdGhlIG1lbW9yeSBzaGFyZWQKKyAgICAqIGJldHdlZW4gY29udGV4dHMgb2YgYSBzaW5nbGUgZmFrZSBidWZtZ3IsIGJ1dCB0aGlzIHdpbGwgYXQgbGVhc3QgbWFrZQorICAgICogdGhpbmdzIGNvcnJlY3QgZm9yIG5vdy4KKyAgICAqLworICAgaWYgKCFpbnRlbC0+dHRtICYmIHNhcmVhLT50ZXhBZ2UgIT0gaW50ZWwtPmhIV0NvbnRleHQpIHsKKyAgICAgIHNhcmVhLT50ZXhBZ2UgPSBpbnRlbC0+aEhXQ29udGV4dDsKKyAgICAgIGludGVsX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UoaW50ZWwtPmJ1Zm1ncik7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CQVRDSCkKKwkgaW50ZWxfZGVjb2RlX2NvbnRleHRfcmVzZXQoKTsKKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0JVRk1HUikKKwkgZnByaW50ZihzdGRlcnIsICJMb3N0IFRleHR1cmVzOiBzYXJlYS0+dGV4QWdlICV4IGh3IGNvbnRleHQgJXhcbiIsCisJCSBzYXJlYS0+Y3R4T3duZXIsIGludGVsLT5oSFdDb250ZXh0KTsKKyAgIH0KKworICAgaWYgKHNhcmVhLT53aWR0aCAhPSBpbnRlbC0+d2lkdGggfHwgc2FyZWEtPmhlaWdodCAhPSBpbnRlbC0+aGVpZ2h0KSB7CisgICAgICAgaW50IG51bUNsaXBSZWN0cyA9IGludGVsLT5udW1DbGlwUmVjdHM7CisKKyAgICAgICAvKgorCSogRklYTUU6IFJlYWxseSBvbmx5IG5lZWQgdG8gZG8gdGhpcyB3aGVuIGRyYXdpbmcgdG8gYQorCSogY29tbW9uIGJhY2stIG9yIGZyb250IGJ1ZmZlci4KKwkqLworCisgICAgICAgLyoKKwkqIFRoaXMgd2lsbCBlc3NlbnRpYWxseSBkcm9wIHRoZSBvdXRzdGFuZGluZyBiYXRjaGJ1ZmZlciBvbgorCSogdGhlIGZsb29yLgorCSovCisgICAgICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IDA7CisKKyAgICAgICBpZiAoaW50ZWwtPkZhbGxiYWNrKQorCSAgIF9zd3Jhc3RfZmx1c2goJmludGVsLT5jdHgpOworCisgICAgICAgaWYgKCFJU185NjUoaW50ZWwtPmludGVsU2NyZWVuLT5kZXZpY2VJRCkpCisJICAgSU5URUxfRklSRVZFUlRJQ0VTKGludGVsKTsKKworICAgICAgIGlmIChpbnRlbC0+YmF0Y2gtPm1hcCAhPSBpbnRlbC0+YmF0Y2gtPnB0cikKKwkgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChpbnRlbC0+YmF0Y2gpOworCisgICAgICAgaW50ZWwtPm51bUNsaXBSZWN0cyA9IG51bUNsaXBSZWN0czsKKworICAgICAgIC8qIGZvcmNlIHdpbmRvdyB1cGRhdGUgKi8KKyAgICAgICBpbnRlbC0+bGFzdFN0YW1wID0gMDsKKworICAgICAgIGludGVsLT53aWR0aCA9IHNhcmVhLT53aWR0aDsKKyAgICAgICBpbnRlbC0+aGVpZ2h0ID0gc2FyZWEtPmhlaWdodDsKKyAgIH0KKworICAgLyogRHJhd2FibGUgY2hhbmdlZD8KKyAgICAqLworICAgaWYgKGRQcml2ICYmIGludGVsLT5sYXN0U3RhbXAgIT0gZFByaXYtPmxhc3RTdGFtcCkgeworICAgICAgIGludGVsV2luZG93TW92ZWQoaW50ZWwpOworICAgICAgIGludGVsLT5sYXN0U3RhbXAgPSBkUHJpdi0+bGFzdFN0YW1wOworICAgfQorfQorCisKK19nbHRocmVhZF9ERUNMQVJFX1NUQVRJQ19NVVRFWChsb2NrTXV0ZXgpOworCisvKiBMb2NrIHRoZSBoYXJkd2FyZSBhbmQgdmFsaWRhdGUgb3VyIHN0YXRlLiAgCisgKi8KK3ZvaWQgTE9DS19IQVJEV0FSRSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKK3sKKyAgICBfX0RSSWRyYXdhYmxlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKyAgICBfX0RSSXNjcmVlbiAqc1ByaXYgPSBpbnRlbC0+ZHJpU2NyZWVuOworICAgIGNoYXIgX19yZXQgPSAwOworICAgIHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSBOVUxMOworICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmludGVsX3JiID0gTlVMTDsKKworICAgIF9nbHRocmVhZF9MT0NLX01VVEVYKGxvY2tNdXRleCk7CisgICAgYXNzZXJ0KCFpbnRlbC0+bG9ja2VkKTsKKyAgICBpbnRlbC0+bG9ja2VkID0gMTsKKworICAgIGlmIChpbnRlbC0+ZHJpRHJhd2FibGUpIHsKKyAgICAgICBpbnRlbF9mYiA9IGludGVsLT5kcmlEcmF3YWJsZS0+ZHJpdmVyUHJpdmF0ZTsKKworICAgICAgIGlmIChpbnRlbF9mYikKKwkgIGludGVsX3JiID0KKwkgICAgIGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLAorCQkJCSAgICBpbnRlbF9mYi0+QmFzZS5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSk7CisgICAgfQorCisgICAgaWYgKGludGVsX3JiICYmIGRQcml2LT52YmxGbGFncyAmJgorCSEoZFByaXYtPnZibEZsYWdzICYgVkJMQU5LX0ZMQUdfTk9fSVJRKSAmJgorCShpbnRlbF9mYi0+dmJsX3dhaXRlZCAtIGludGVsX3JiLT52YmxfcGVuZGluZykgPiAoMTw8MjMpKSB7CisJZHJtVkJsYW5rIHZibDsKKworCXZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX0FCU09MVVRFOworCisJaWYgKCBkUHJpdi0+dmJsRmxhZ3MgJiBWQkxBTktfRkxBR19TRUNPTkRBUlkgKSB7CisJICAgIHZibC5yZXF1ZXN0LnR5cGUgfD0gRFJNX1ZCTEFOS19TRUNPTkRBUlk7CisJfQorCisJdmJsLnJlcXVlc3Quc2VxdWVuY2UgPSBpbnRlbF9yYi0+dmJsX3BlbmRpbmc7CisJZHJtV2FpdFZCbGFuayhpbnRlbC0+ZHJpRmQsICZ2YmwpOworCWludGVsX2ZiLT52Ymxfd2FpdGVkID0gdmJsLnJlcGx5LnNlcXVlbmNlOworICAgIH0KKworICAgIERSTV9DQVMoaW50ZWwtPmRyaUh3TG9jaywgaW50ZWwtPmhIV0NvbnRleHQsCisgICAgICAgIChEUk1fTE9DS19IRUxEfGludGVsLT5oSFdDb250ZXh0KSwgX19yZXQpOworCisgICAgaWYgKHNQcml2LT5kcmkyLmVuYWJsZWQpIHsKKwlpZiAoX19yZXQpCisJICAgIGRybUdldExvY2soaW50ZWwtPmRyaUZkLCBpbnRlbC0+aEhXQ29udGV4dCwgMCk7CisJaWYgKF9fZHJpUGFyc2VFdmVudHMoZFByaXYtPmRyaUNvbnRleHRQcml2LCBkUHJpdikpIHsKKwkgICAgaW50ZWxXaW5kb3dNb3ZlZChpbnRlbCk7CisJICAgIGludGVsX2RyYXdfYnVmZmVyKCZpbnRlbC0+Y3R4LCBpbnRlbC0+Y3R4LkRyYXdCdWZmZXIpOworCX0KKyAgICB9IGVsc2UgaWYgKF9fcmV0KSB7CisgICAgICAgIGludGVsQ29udGVuZGVkTG9jayggaW50ZWwsIDAgKTsKKyAgICB9CisKKworICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0xPQ0spCisgICAgICBfbWVzYV9wcmludGYoIiVzIC0gbG9ja2VkXG4iLCBfX3Byb2duYW1lKTsKK30KKworCisvKiBVbmxvY2sgdGhlIGhhcmR3YXJlIHVzaW5nIHRoZSBnbG9iYWwgY3VycmVudCBjb250ZXh0IAorICovCit2b2lkIFVOTE9DS19IQVJEV0FSRSggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICkKK3sKKyAgIGludGVsLT52dGJsLm5vdGVfdW5sb2NrKCBpbnRlbCApOworICAgaW50ZWwtPmxvY2tlZCA9IDA7CisKKyAgIERSTV9VTkxPQ0soaW50ZWwtPmRyaUZkLCBpbnRlbC0+ZHJpSHdMb2NrLCBpbnRlbC0+aEhXQ29udGV4dCk7CisKKyAgIF9nbHRocmVhZF9VTkxPQ0tfTVVURVgobG9ja011dGV4KTsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfTE9DSykKKyAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSB1bmxvY2tlZFxuIiwgX19wcm9nbmFtZSk7CisKKyAgIC8qKgorICAgICogTm90aGluZyBzaG91bGQgYmUgbGVmdCBpbiBiYXRjaCBvdXRzaWRlIG9mIExPQ0svVU5MT0NLIHdoaWNoIHJlZmVyZW5jZXMKKyAgICAqIGNsaXByZWN0cy4KKyAgICAqLworICAgaWYgKGludGVsLT5iYXRjaC0+Y2xpcHJlY3RfbW9kZSA9PSBSRUZFUkVOQ0VTX0NMSVBSRUNUUykKKyAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2NvbnRleHQuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWEzNzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfY29udGV4dC5oCkBAIC0wLDAgKzEsNTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElOVEVMQ09OVEVYVF9JTkMKKyNkZWZpbmUgSU5URUxDT05URVhUX0lOQworCisKKworI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1tLmgiCisjaW5jbHVkZSAidGV4bWVtLmgiCisjaW5jbHVkZSAiZHJpX2J1Zm1nci5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1nci5oIgorCisjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCisjaW5jbHVkZSAiaW50ZWxfdGV4X29iai5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAidG5sL3RfdmVydGV4LmgiCisKKyNkZWZpbmUgVEFHKHgpIGludGVsIyN4CisjaW5jbHVkZSAidG5sX2RkL3RfZGRfdmVydGV4LmgiCisjdW5kZWYgVEFHCisKKyNkZWZpbmUgRFZfUEZfNTU1ICAoMTw8OCkKKyNkZWZpbmUgRFZfUEZfNTY1ICAoMjw8OCkKKyNkZWZpbmUgRFZfUEZfODg4OCAoMzw8OCkKKworc3RydWN0IGludGVsX3JlZ2lvbjsKK3N0cnVjdCBpbnRlbF9jb250ZXh0OworCit0eXBlZGVmIHZvaWQgKCppbnRlbF90cmlfZnVuYykgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIGludGVsVmVydGV4ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsVmVydGV4ICosIGludGVsVmVydGV4ICopOwordHlwZWRlZiB2b2lkICgqaW50ZWxfbGluZV9mdW5jKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiwgaW50ZWxWZXJ0ZXggKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsVmVydGV4ICopOwordHlwZWRlZiB2b2lkICgqaW50ZWxfcG9pbnRfZnVuYykgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICosIGludGVsVmVydGV4ICopOworCisjZGVmaW5lIElOVEVMX0ZBTExCQUNLX0RSQVdfQlVGRkVSCSAweDEKKyNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfUkVBRF9CVUZGRVIJIDB4MgorI2RlZmluZSBJTlRFTF9GQUxMQkFDS19ERVBUSF9CVUZGRVIgICAgICAweDQKKyNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfU1RFTkNJTF9CVUZGRVIgICAgMHg4CisjZGVmaW5lIElOVEVMX0ZBTExCQUNLX1VTRVIJCSAweDEwCisjZGVmaW5lIElOVEVMX0ZBTExCQUNLX1JFTkRFUk1PREUJIDB4MjAKKyNkZWZpbmUgSU5URUxfRkFMTEJBQ0tfVEVYVFVSRSAgIAkgMHg0MAorCitleHRlcm4gdm9pZCBpbnRlbEZhbGxiYWNrKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIG1vZGUpOworI2RlZmluZSBGQUxMQkFDSyggaW50ZWwsIGJpdCwgbW9kZSApIGludGVsRmFsbGJhY2soIGludGVsLCBiaXQsIG1vZGUgKQorCisKKyNkZWZpbmUgSU5URUxfV1JJVEVfUEFSVCAgMHgxCisjZGVmaW5lIElOVEVMX1dSSVRFX0ZVTEwgIDB4MgorI2RlZmluZSBJTlRFTF9SRUFEICAgICAgICAweDQKKworI2RlZmluZSBJTlRFTF9NQVhfRklYVVAgNjQKKworc3RydWN0IGludGVsX2NvbnRleHQKK3sKKyAgIEdMY29udGV4dCBjdHg7ICAgICAgICAgICAgICAgLyogdGhlIHBhcmVudCBjbGFzcyAqLworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHZvaWQgKCpkZXN0cm95KSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7CisgICAgICB2b2lkICgqZW1pdF9zdGF0ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKmZpbmlzaF9iYXRjaCkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKm5ld19iYXRjaCkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKmVtaXRfaW52YXJpZW50X3N0YXRlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7CisgICAgICB2b2lkICgqbm90ZV9mZW5jZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IGZlbmNlKTsKKyAgICAgIHZvaWQgKCpub3RlX3VubG9jaykgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCk7CisgICAgICB2b2lkICgqdXBkYXRlX3RleHR1cmVfc3RhdGUpIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqIGludGVsKTsKKworICAgICAgdm9pZCAoKnJlbmRlcl9zdGFydCkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKnJlbmRlcl9wcmV2YWxpZGF0ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKnNldF9kcmF3X3JlZ2lvbikgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqIGRyYXdfcmVnaW9uc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKiBkZXB0aF9yZWdpb24sCisJCQkgICAgICAgR0x1aW50IG51bV9yZWdpb25zKTsKKworICAgICAgR0x1aW50ICgqZmx1c2hfY21kKSAodm9pZCk7CisgICAgICB2b2lkICgqZW1pdF9mbHVzaCkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IHVudXNlZCk7CisKKyAgICAgIHZvaWQgKCpyZWR1Y2VkX3ByaW1pdGl2ZV9zdGF0ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcnByaW0pOworCisgICAgICBHTGJvb2xlYW4gKCpjaGVja192ZXJ0ZXhfc2l6ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwsCisJCQkJICAgICAgR0x1aW50IGV4cGVjdGVkKTsKKyAgICAgIHZvaWQgKCppbnZhbGlkYXRlX3N0YXRlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJCUdMdWludCBuZXdfc3RhdGUpOworCisKKyAgICAgIC8qIE1ldGFvcHM6IAorICAgICAgICovCisgICAgICB2b2lkICgqaW5zdGFsbF9tZXRhX3N0YXRlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7CisgICAgICB2b2lkICgqbGVhdmVfbWV0YV9zdGF0ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworCisgICAgICB2b2lkICgqbWV0YV9kcmF3X3JlZ2lvbikgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKiBkcmF3X3JlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqIGRlcHRoX3JlZ2lvbik7CisKKyAgICAgIHZvaWQgKCptZXRhX2RyYXdfcXVhZCkoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICBHTGZsb2F0IHgwLCBHTGZsb2F0IHgxLAorCQkJICAgICBHTGZsb2F0IHkwLCBHTGZsb2F0IHkxLAorCQkJICAgICBHTGZsb2F0IHosCisJCQkgICAgIEdMdWludCBjb2xvciwgLyogQVJHQjMyICovCisJCQkgICAgIEdMZmxvYXQgczAsIEdMZmxvYXQgczEsCisJCQkgICAgIEdMZmxvYXQgdDAsIEdMZmxvYXQgdDEpOworCisgICAgICB2b2lkICgqbWV0YV9jb2xvcl9tYXNrKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCwgR0xib29sZWFuKTsKKworICAgICAgdm9pZCAoKm1ldGFfc3RlbmNpbF9yZXBsYWNlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBtYXNrLCBHTHVpbnQgY2xlYXIpOworCisgICAgICB2b2lkICgqbWV0YV9kZXB0aF9yZXBsYWNlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7CisKKyAgICAgIHZvaWQgKCptZXRhX3RleHR1cmVfYmxlbmRfcmVwbGFjZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworCisgICAgICB2b2lkICgqbWV0YV9ub19zdGVuY2lsX3dyaXRlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCk7CisgICAgICB2b2lkICgqbWV0YV9ub19kZXB0aF93cml0ZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworICAgICAgdm9pZCAoKm1ldGFfbm9fdGV4dHVyZSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICogaW50ZWwpOworCisgICAgICB2b2lkICgqbWV0YV9pbXBvcnRfcGl4ZWxfc3RhdGUpIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqIGludGVsKTsKKyAgICAgIHZvaWQgKCptZXRhX2ZyYW1lX2J1ZmZlcl90ZXh0dXJlKSAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJCQkgR0xpbnQgeG9mZiwgR0xpbnQgeW9mZik7CisKKyAgICAgIEdMYm9vbGVhbigqbWV0YV90ZXhfcmVjdF9zb3VyY2UpIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqIGludGVsLAorCQkJCQlkcmlfYm8gKiBidWZmZXIsCisJCQkJCUdMdWludCBvZmZzZXQsCisJCQkJCUdMdWludCBwaXRjaCwKKwkJCQkJR0x1aW50IGhlaWdodCwKKwkJCQkJR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpOworCisgICAgICB2b2lkICgqYXNzZXJ0X25vdF9kaXJ0eSkgKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCk7CisKKyAgICAgIHZvaWQgKCpkZWJ1Z19iYXRjaCkoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKKyAgIH0gdnRibDsKKworICAgR0xpbnQgcmVmY291bnQ7CisgICBHTHVpbnQgRmFsbGJhY2s7CisgICBHTHVpbnQgTmV3R0xTdGF0ZTsKKworICAgZHJpX2J1Zm1nciAqYnVmbWdyOworICAgdW5zaWduZWQgaW50IG1heEJhdGNoU2l6ZTsKKworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZnJvbnRfcmVnaW9uOworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqYmFja19yZWdpb247CisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICp0aGlyZF9yZWdpb247CisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXB0aF9yZWdpb247CisKKyAgIC8qKgorICAgICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUga2VybmVsIG1lbW9yeSBtYW5hZ2VyIGlzIGJlaW5nIHVzZWQKKyAgICAqIGluc3RlYWQgb2YgdGhlIGZha2UgY2xpZW50LXNpZGUgbWVtb3J5IG1hbmFnZXIuCisgICAgKi8KKyAgIEdMYm9vbGVhbiB0dG07CisKKyAgIHN0cnVjdCBpbnRlbF9iYXRjaGJ1ZmZlciAqYmF0Y2g7CisgICBHTGJvb2xlYW4gbm9fYmF0Y2hfd3JhcDsKKyAgIHVuc2lnbmVkIGJhdGNoX2lkOworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIEdMdWludCBpZDsKKyAgICAgIHVpbnQzMl90IHByaW1pdGl2ZTsJLyoqPCBDdXJyZW50IGhhcmR3YXJlIHByaW1pdGl2ZSB0eXBlICovCisgICAgICB2b2lkICgqZmx1c2gpIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKTsKKyAgICAgIGRyaV9ibyAqdmJfYm87CisgICAgICB1aW50OF90ICp2YjsKKyAgICAgIHVuc2lnbmVkIGludCBzdGFydF9vZmZzZXQ7IC8qKjwgQnl0ZSBvZmZzZXQgb2YgcHJpbWl0aXZlIHNlcXVlbmNlICovCisgICAgICB1bnNpZ25lZCBpbnQgY3VycmVudF9vZmZzZXQ7IC8qKjwgQnl0ZSBvZmZzZXQgb2YgbmV4dCB2ZXJ0ZXggKi8KKyAgICAgIHVuc2lnbmVkIGludCBjb3VudDsJLyoqPCBOdW1iZXIgb2YgdmVydGljZXMgaW4gY3VycmVudCBwcmltaXRpdmUgKi8KKyAgIH0gcHJpbTsKKworICAgR0x1aW50IHN0YXRzX3dtOworICAgR0xib29sZWFuIGxvY2tlZDsKKyAgIGNoYXIgKnByZXZMb2NrRmlsZTsKKyAgIGludCBwcmV2TG9ja0xpbmU7CisKKyAgIEdMdWJ5dGUgY2xlYXJfY2hhbls0XTsKKyAgIEdMdWludCBDbGVhckNvbG9yNTY1OworICAgR0x1aW50IENsZWFyQ29sb3I4ODg4OworCisgICAvKiBPZmZzZXRzIG9mIGZpZWxkcyB3aXRoaW4gdGhlIGN1cnJlbnQgdmVydGV4OgorICAgICovCisgICBHTHVpbnQgY29sb3JvZmZzZXQ7CisgICBHTHVpbnQgc3BlY29mZnNldDsKKyAgIEdMdWludCB3cG9zX29mZnNldDsKKyAgIEdMdWludCB3cG9zX3NpemU7CisKKyAgIHN0cnVjdCB0bmxfYXR0cl9tYXAgdmVydGV4X2F0dHJzW1ZFUlRfQVRUUklCX01BWF07CisgICBHTHVpbnQgdmVydGV4X2F0dHJfY291bnQ7CisKKyAgIEdMZmxvYXQgcG9seWdvbl9vZmZzZXRfc2NhbGU7ICAgICAgICAvKiBkZXBlbmRlbnQgb24gZGVwdGhfc2NhbGUsIGJwcCAqLworCisgICBHTGJvb2xlYW4gaHdfc3RlbmNpbDsKKyAgIEdMYm9vbGVhbiBod19zdGlwcGxlOworICAgR0xib29sZWFuIGRlcHRoX2J1ZmZlcl9pc19mbG9hdDsKKyAgIEdMYm9vbGVhbiBub19yYXN0OworICAgR0xib29sZWFuIHN0cmljdF9jb25mb3JtYW5jZTsKKworICAgLyogU3RhdGUgZm9yIGludGVsdmIuYyBhbmQgaW50ZWx0cmlzLmMuCisgICAgKi8KKyAgIEdMdWludCBSZW5kZXJJbmRleDsKKyAgIEdMbWF0cml4IFZpZXdwb3J0TWF0cml4OworICAgR0xlbnVtIHJlbmRlcl9wcmltaXRpdmU7CisgICBHTGVudW0gcmVkdWNlZF9wcmltaXRpdmU7CisgICBHTHVpbnQgdmVydGV4X3NpemU7CisgICBHTHVieXRlICp2ZXJ0czsgICAgICAgICAgICAgIC8qIHBvaW50cyB0byB0bmwtPmNsaXBzcGFjZS52ZXJ0ZXhfYnVmICovCisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkcmF3X3JlZ2lvbjsKKworICAgLyogRmFsbGJhY2sgcmFzdGVyaXphdGlvbiBmdW5jdGlvbnMgCisgICAgKi8KKyAgIGludGVsX3BvaW50X2Z1bmMgZHJhd19wb2ludDsKKyAgIGludGVsX2xpbmVfZnVuYyBkcmF3X2xpbmU7CisgICBpbnRlbF90cmlfZnVuYyBkcmF3X3RyaTsKKworICAgLyogVGhlc2UgcmVmZXIgdG8gdGhlIGN1cnJlbnQgZHJhd2luZyBidWZmZXI6CisgICAgKi8KKyAgIGludCBkcmF3WCwgZHJhd1k7ICAgICAgICAgICAgLyoqPCBvcmlnaW4gb2YgZHJhd2luZyBhcmVhIHdpdGhpbiByZWdpb24gKi8KKyAgIEdMdWludCBudW1DbGlwUmVjdHM7ICAgICAgICAgLyoqPCBjbGlwcmVjdHMgZm9yIGRyYXdpbmcgKi8KKyAgIGRybV9jbGlwX3JlY3RfdCAqcENsaXBSZWN0czsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqZnJhbWVfYnVmZmVyX3RleG9iajsKKyAgIGRybV9jbGlwX3JlY3RfdCBmYm9SZWN0OyAgICAgLyoqPCBjbGlwcmVjdCBmb3IgRkJPIHJlbmRlcmluZyAqLworCisgICBpbnQgcGVyZl9ib3hlczsKKworICAgR0x1aW50IGRvX3VzbGVlcHM7CisgICBpbnQgZG9faXJxczsKKyAgIEdMdWludCBpcnFzRW1pdHRlZDsKKworICAgR0xib29sZWFuIHNjaXNzb3I7CisgICBkcm1fY2xpcF9yZWN0X3QgZHJhd19yZWN0OworICAgZHJtX2NsaXBfcmVjdF90IHNjaXNzb3JfcmVjdDsKKworICAgZHJtX2NvbnRleHRfdCBoSFdDb250ZXh0OworICAgZHJtTG9jayAqZHJpSHdMb2NrOworICAgaW50IGRyaUZkOworCisgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpRHJhd2FibGU7CisgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJpUmVhZERyYXdhYmxlOworICAgX19EUklzY3JlZW5Qcml2YXRlICpkcmlTY3JlZW47CisgICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuOworICAgdm9sYXRpbGUgc3RydWN0IGRybV9pOTE1X3NhcmVhICpzYXJlYTsKKworICAgR0x1aW50IGxhc3RTdGFtcDsKKworICAgR0xib29sZWFuIG5vX2h3OworCisgICAvKioKKyAgICAqIENvbmZpZ3VyYXRpb24gY2FjaGUKKyAgICAqLworICAgZHJpT3B0aW9uQ2FjaGUgb3B0aW9uQ2FjaGU7CisKKyAgIC8qIExhc3Qgc2VlbiB3aWR0aC9oZWlnaHQgb2YgdGhlIHNjcmVlbiAqLworICAgaW50IHdpZHRoOworICAgaW50IGhlaWdodDsKKworICAgaW50NjRfdCBzd2FwX3VzdDsKKyAgIGludDY0X3Qgc3dhcF9taXNzZWRfdXN0OworCisgICBHTHVpbnQgc3dhcF9jb3VudDsKKyAgIEdMdWludCBzd2FwX21pc3NlZF9jb3VudDsKK307CisKKy8qIFRoZXNlIGFyZSBmdW5jdGlvbnMgbm93OgorICovCit2b2lkIExPQ0tfSEFSRFdBUkUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOwordm9pZCBVTkxPQ0tfSEFSRFdBUkUoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCApOworCitleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKworCisjZGVmaW5lIFNVQlBJWEVMX1ggMC4xMjUKKyNkZWZpbmUgU1VCUElYRUxfWSAwLjEyNQorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKyNkZWZpbmUgQUxJR04odmFsdWUsIGFsaWdubWVudCkgICgodmFsdWUgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSkpCisKKyNkZWZpbmUgSU5URUxfRklSRVZFUlRJQ0VTKGludGVsKQkJXAorZG8gewkJCQkJCVwKKyAgIGlmICgoaW50ZWwpLT5wcmltLmZsdXNoKQkJCVwKKyAgICAgIChpbnRlbCktPnByaW0uZmx1c2goaW50ZWwpOwkJXAorfSB3aGlsZSAoMCkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29sb3IgcGFja2luZzoKKyAqLworCisjZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjQ0NDQocixnLGIsYSkgXAorICAoKCgoYSkgJiAweGYwKSA8PCA4KSB8ICgoKHIpICYgMHhmMCkgPDwgNCkgfCAoKGcpICYgMHhmMCkgfCAoKGIpID4+IDQpKQorCisjZGVmaW5lIElOVEVMX1BBQ0tDT0xPUjE1NTUocixnLGIsYSkgXAorICAoKCgocikgJiAweGY4KSA8PCA3KSB8ICgoKGcpICYgMHhmOCkgPDwgMikgfCAoKChiKSAmIDB4ZjgpID4+IDMpIHwgXAorICAgICgoYSkgPyAweDgwMDAgOiAwKSkKKworI2RlZmluZSBJTlRFTF9QQUNLQ09MT1I1NjUocixnLGIpIFwKKyAgKCgoKHIpICYgMHhmOCkgPDwgOCkgfCAoKChnKSAmIDB4ZmMpIDw8IDMpIHwgKCgoYikgJiAweGY4KSA+PiAzKSkKKworI2RlZmluZSBJTlRFTF9QQUNLQ09MT1I4ODg4KHIsZyxiLGEpIFwKKyAgKChhPDwyNCkgfCAocjw8MTYpIHwgKGc8PDgpIHwgYikKKworI2RlZmluZSBJTlRFTF9QQUNLQ09MT1IoZm9ybWF0LCByLCAgZywgIGIsIGEpCQlcCisoZm9ybWF0ID09IERWX1BGXzU1NSA/IElOVEVMX1BBQ0tDT0xPUjE1NTUocixnLGIsYSkgOglcCisgKGZvcm1hdCA9PSBEVl9QRl81NjUgPyBJTlRFTF9QQUNLQ09MT1I1NjUocixnLGIpIDoJXAorICAoZm9ybWF0ID09IERWX1BGXzg4ODggPyBJTlRFTF9QQUNLQ09MT1I4ODg4KHIsZyxiLGEpIDoJXAorICAgMCkpKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcm9tIGxpbnV4IGtlcm5lbCBpMzg2IGhlYWRlciBmaWxlcywgY29wZXMgd2l0aCBvZGQgc2l6ZXMgYmV0dGVyCisgKiB0aGFuIENPUFlfRFdPUkRTIHdvdWxkOgorICogWFhYIFB1dCB0aGlzIGluIHNyYy9tZXNhL21haW4vaW1wb3J0cy5oID8/PworICovCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIElOTElORSB2b2lkICogX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCit7CisgICBpbnQgZDAsIGQxLCBkMjsKKyAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgInJlcCA7IG1vdnNsXG5cdCIKKyAgICAgICJ0ZXN0YiAkMiwlYjRcblx0IgorICAgICAgImplIDFmXG5cdCIKKyAgICAgICJtb3Zzd1xuIgorICAgICAgIjE6XHR0ZXN0YiAkMSwlYjRcblx0IgorICAgICAgImplIDJmXG5cdCIKKyAgICAgICJtb3ZzYlxuIgorICAgICAgIjI6IgorICAgICAgOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCisgICAgICA6IjAiIChuLzQpLCAicSIgKG4pLCIxIiAoKGxvbmcpIHRvKSwiMiIgKChsb25nKSBmcm9tKQorICAgICAgOiAibWVtb3J5Iik7CisgICByZXR1cm4gKHRvKTsKK30KKyNlbHNlCisjZGVmaW5lIF9fbWVtY3B5KGEsYixjKSBtZW1jcHkoYSxiLGMpCisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWJ1Z2dpbmc6CisgKi8KK2V4dGVybiBpbnQgSU5URUxfREVCVUc7CisKKyNkZWZpbmUgREVCVUdfVEVYVFVSRQkweDEKKyNkZWZpbmUgREVCVUdfU1RBVEUJMHgyCisjZGVmaW5lIERFQlVHX0lPQ1RMCTB4NAorI2RlZmluZSBERUJVR19CTElUCTB4OAorI2RlZmluZSBERUJVR19NSVBUUkVFICAgMHgxMAorI2RlZmluZSBERUJVR19GQUxMQkFDS1MJMHgyMAorI2RlZmluZSBERUJVR19WRVJCT1NFCTB4NDAKKyNkZWZpbmUgREVCVUdfQkFUQ0ggICAgIDB4ODAKKyNkZWZpbmUgREVCVUdfUElYRUwgICAgIDB4MTAwCisjZGVmaW5lIERFQlVHX0JVRk1HUiAgICAweDIwMAorI2RlZmluZSBERUJVR19SRUdJT04gICAgMHg0MDAKKyNkZWZpbmUgREVCVUdfRkJPICAgICAgIDB4ODAwCisjZGVmaW5lIERFQlVHX0xPQ0sgICAgICAweDEwMDAKKyNkZWZpbmUgREVCVUdfU1lOQwkweDIwMDAKKyNkZWZpbmUgREVCVUdfUFJJTVMJMHg0MDAwCisjZGVmaW5lIERFQlVHX1ZFUlRTCTB4ODAwMAorI2RlZmluZSBERUJVR19EUkkgICAgICAgMHgxMDAwMAorI2RlZmluZSBERUJVR19ETUEgICAgICAgMHgyMDAwMAorI2RlZmluZSBERUJVR19TQU5JVFkgICAgMHg0MDAwMAorI2RlZmluZSBERUJVR19TTEVFUCAgICAgMHg4MDAwMAorI2RlZmluZSBERUJVR19TVEFUUyAgICAgMHgxMDAwMDAKKyNkZWZpbmUgREVCVUdfVElMRSAgICAgIDB4MjAwMDAwCisjZGVmaW5lIERFQlVHX1NJTkdMRV9USFJFQUQgICAweDQwMDAwMAorI2RlZmluZSBERUJVR19XTSAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgREVCVUdfVVJCICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBERUJVR19WUyAgICAgICAgMHgyMDAwMDAwCisKKyNkZWZpbmUgREJHKC4uLikgZG8gewkJCQkJCVwKKwlpZiAoSU5URUxfREVCVUcgJiBGSUxFX0RFQlVHX0ZMQUcpCQkJXAorCQlfbWVzYV9wcmludGYoX19WQV9BUkdTX18pOwkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBQQ0lfQ0hJUF84NDVfRwkJCTB4MjU2MgorI2RlZmluZSBQQ0lfQ0hJUF9JODMwX00JCQkweDM1NzcKKyNkZWZpbmUgUENJX0NISVBfSTg1NV9HTQkJMHgzNTgyCisjZGVmaW5lIFBDSV9DSElQX0k4NjVfRwkJCTB4MjU3MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0cJCQkweDI1ODIKKyNkZWZpbmUgUENJX0NISVBfSTkxNV9HTQkJMHgyNTkyCisjZGVmaW5lIFBDSV9DSElQX0k5NDVfRwkJCTB4Mjc3MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0dNCQkweDI3QTIKKyNkZWZpbmUgUENJX0NISVBfSTk0NV9HTUUJCTB4MjdBRQorI2RlZmluZSBQQ0lfQ0hJUF9HMzNfRwkJCTB4MjlDMgorI2RlZmluZSBQQ0lfQ0hJUF9RMzVfRwkJCTB4MjlCMgorI2RlZmluZSBQQ0lfQ0hJUF9RMzNfRwkJCTB4MjlEMgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGludGVsX2NvbnRleHQuYzoKKyAqLworCitleHRlcm4gR0xib29sZWFuIGludGVsSW5pdENvbnRleHQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyk7CisKK2V4dGVybiB2b2lkIGludGVsR2V0TG9jayhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMdWludCBmbGFncyk7CisKK2V4dGVybiB2b2lkIGludGVsRmluaXNoKEdMY29udGV4dCAqIGN0eCk7CitleHRlcm4gdm9pZCBpbnRlbEZsdXNoKEdMY29udGV4dCAqIGN0eCk7CisKK2V4dGVybiB2b2lkIGludGVsSW5pdERyaXZlckZ1bmN0aW9ucyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyk7CitleHRlcm4gdm9pZCBpbnRlbEluaXRFeHRlbnNpb25zKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gZW5hYmxlX2ltYWdpbmcpOworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGludGVsX3N0YXRlLmM6CisgKi8KK2V4dGVybiB2b2lkIGludGVsSW5pdFN0YXRlRnVuY3Moc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMpOworCisjZGVmaW5lIENPTVBBUkVGVU5DX0FMV0FZUwkJMAorI2RlZmluZSBDT01QQVJFRlVOQ19ORVZFUgkJMHgxCisjZGVmaW5lIENPTVBBUkVGVU5DX0xFU1MJCTB4MgorI2RlZmluZSBDT01QQVJFRlVOQ19FUVVBTAkJMHgzCisjZGVmaW5lIENPTVBBUkVGVU5DX0xFUVVBTAkJMHg0CisjZGVmaW5lIENPTVBBUkVGVU5DX0dSRUFURVIJCTB4NQorI2RlZmluZSBDT01QQVJFRlVOQ19OT1RFUVVBTAkJMHg2CisjZGVmaW5lIENPTVBBUkVGVU5DX0dFUVVBTAkJMHg3CisKKyNkZWZpbmUgU1RFTkNJTE9QX0tFRVAJCQkwCisjZGVmaW5lIFNURU5DSUxPUF9aRVJPCQkJMHgxCisjZGVmaW5lIFNURU5DSUxPUF9SRVBMQUNFCQkweDIKKyNkZWZpbmUgU1RFTkNJTE9QX0lOQ1JTQVQJCTB4MworI2RlZmluZSBTVEVOQ0lMT1BfREVDUlNBVAkJMHg0CisjZGVmaW5lIFNURU5DSUxPUF9JTkNSCQkJMHg1CisjZGVmaW5lIFNURU5DSUxPUF9ERUNSCQkJMHg2CisjZGVmaW5lIFNURU5DSUxPUF9JTlZFUlQJCTB4NworCisjZGVmaW5lIExPR0lDT1BfQ0xFQVIJCQkwCisjZGVmaW5lIExPR0lDT1BfTk9SCQkJMHgxCisjZGVmaW5lIExPR0lDT1BfQU5EX0lOViAJCTB4MgorI2RlZmluZSBMT0dJQ09QX0NPUFlfSU5WCQkweDMKKyNkZWZpbmUgTE9HSUNPUF9BTkRfUlZSU0UJCTB4NAorI2RlZmluZSBMT0dJQ09QX0lOVgkJCTB4NQorI2RlZmluZSBMT0dJQ09QX1hPUgkJCTB4NgorI2RlZmluZSBMT0dJQ09QX05BTkQJCQkweDcKKyNkZWZpbmUgTE9HSUNPUF9BTkQJCQkweDgKKyNkZWZpbmUgTE9HSUNPUF9FUVVJVgkJCTB4OQorI2RlZmluZSBMT0dJQ09QX05PT1AJCQkweGEKKyNkZWZpbmUgTE9HSUNPUF9PUl9JTlYJCQkweGIKKyNkZWZpbmUgTE9HSUNPUF9DT1BZCQkJMHhjCisjZGVmaW5lIExPR0lDT1BfT1JfUlZSU0UJCTB4ZAorI2RlZmluZSBMT0dJQ09QX09SCQkJMHhlCisjZGVmaW5lIExPR0lDT1BfU0VUCQkJMHhmCisKKyNkZWZpbmUgQkxFTkRGQUNUX1pFUk8JCQkweDAxCisjZGVmaW5lIEJMRU5ERkFDVF9PTkUJCQkweDAyCisjZGVmaW5lIEJMRU5ERkFDVF9TUkNfQ09MUgkJMHgwMworI2RlZmluZSBCTEVOREZBQ1RfSU5WX1NSQ19DT0xSIAkJMHgwNAorI2RlZmluZSBCTEVOREZBQ1RfU1JDX0FMUEhBCQkweDA1CisjZGVmaW5lIEJMRU5ERkFDVF9JTlZfU1JDX0FMUEhBIAkweDA2CisjZGVmaW5lIEJMRU5ERkFDVF9EU1RfQUxQSEEJCTB4MDcKKyNkZWZpbmUgQkxFTkRGQUNUX0lOVl9EU1RfQUxQSEEgCTB4MDgKKyNkZWZpbmUgQkxFTkRGQUNUX0RTVF9DT0xSCQkweDA5CisjZGVmaW5lIEJMRU5ERkFDVF9JTlZfRFNUX0NPTFIJCTB4MGEKKyNkZWZpbmUgQkxFTkRGQUNUX1NSQ19BTFBIQV9TQVRVUkFURQkweDBiCisjZGVmaW5lIEJMRU5ERkFDVF9DT05TVF9DT0xPUgkJMHgwYworI2RlZmluZSBCTEVOREZBQ1RfSU5WX0NPTlNUX0NPTE9SCTB4MGQKKyNkZWZpbmUgQkxFTkRGQUNUX0NPTlNUX0FMUEhBCQkweDBlCisjZGVmaW5lIEJMRU5ERkFDVF9JTlZfQ09OU1RfQUxQSEEJMHgwZgorI2RlZmluZSBCTEVOREZBQ1RfTUFTSyAgICAgICAgICAJMHgwZgorCitlbnVtIHsKKyAgIERSSV9DT05GX0JPX1JFVVNFX0RJU0FCTEVELAorICAgRFJJX0NPTkZfQk9fUkVVU0VfQUxMCit9OworCitleHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9zaGFkb3dfY29tcGFyZV9mdW5jKEdMZW51bSBmdW5jKTsKK2V4dGVybiBpbnQgaW50ZWxfdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhHTGVudW0gZnVuYyk7CitleHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9zdGVuY2lsX29wKEdMZW51bSBvcCk7CitleHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9ibGVuZF9mYWN0b3IoR0xlbnVtIGZhY3Rvcik7CitleHRlcm4gaW50IGludGVsX3RyYW5zbGF0ZV9sb2dpY19vcChHTGVudW0gb3Bjb2RlKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIElubGluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIAorICogVGhlc2UgYXJlIGJldHRlci10eXBlZCB0aGFuIHRoZSBtYWNyb3MgdXNlZCBwcmV2aW91c2x5OgorICovCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBpbnRlbF9jb250ZXh0ICoKK2ludGVsX2NvbnRleHQoR0xjb250ZXh0ICogY3R4KQoreworICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqKSBjdHg7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVjb2RlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEwNTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVjb2RlLmMKQEAgLTAsMCArMSwxMDUzIEBACisvKiAtKi0gYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKy8qKiBAZmlsZSBpbnRlbF9kZWNvZGUuYworICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gcHJpbnQgb3V0IGJhdGNoYnVmZmVyIGNvbnRlbnRzIGluIGEKKyAqIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4KKyAqCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgaTkxNSBwYWNrZXRzLCBhbmQgb25seSBwcmV0dHktcHJpbnRzIGEKKyAqIHN1YnNldCBvZiB0aGVtLiAgVGhlIGludGVudGlvbiBpcyBmb3IgaXQgdG8gbWFrZSBqdXN0IGEgYmVzdCBhdHRlbXB0IHRvCisgKiBkZWNvZGUsIGJ1dCBuZXZlciBjcmFzaCBpbiB0aGUgcHJvY2Vzcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiaW50ZWxfZGVjb2RlLmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorCisjZGVmaW5lIEJVRkZFUl9GQUlMKF9jb3VudCwgX2xlbiwgX25hbWUpIGRvIHsJCQlcCisgICAgZnByaW50ZihvdXQsICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgaW4gJXMgKCVkIDwgJWQpXG4iLAlcCisJICAgIChfbmFtZSksIChfY291bnQpLCAoX2xlbikpOwkJCQlcCisgICAgKCpmYWlsdXJlcykrKzsJCQkJCQlcCisgICAgcmV0dXJuIGNvdW50OwkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBGSUxFICpvdXQ7CitzdGF0aWMgdWludDMyX3Qgc2F2ZWRfczIgPSAwLCBzYXZlZF9zNCA9IDA7CitzdGF0aWMgY2hhciBzYXZlZF9zMl9zZXQgPSAwLCBzYXZlZF9zNF9zZXQgPSAwOworCitzdGF0aWMgZmxvYXQKK2ludF9hc19mbG9hdCh1aW50MzJfdCBpbnR2YWwpCit7CisgICAgdW5pb24gaW50ZmxvYXQgeworCXVpbnQzMl90IGk7CisJZmxvYXQgZjsKKyAgICB9IHV2YWw7CisKKyAgICB1dmFsLmkgPSBpbnR2YWw7CisgICAgcmV0dXJuIHV2YWwuZjsKK30KKworc3RhdGljIHZvaWQKK2luc3RyX291dCh1aW50MzJfdCAqZGF0YSwgdWludDMyX3QgaHdfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJICBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IHZhOworCisgICAgZnByaW50ZihvdXQsICIweCUwOHg6IDB4JTA4eDolcyAiLCBod19vZmZzZXQgKyBpbmRleCAqIDQsIGRhdGFbaW5kZXhdLAorCSAgICBpbmRleCA9PSAwID8gIiIgOiAiICAiKTsKKyAgICB2YV9zdGFydCh2YSwgZm10KTsKKyAgICB2ZnByaW50ZihvdXQsIGZtdCwgdmEpOworICAgIHZhX2VuZCh2YSk7Cit9CisKKworc3RhdGljIGludAorZGVjb2RlX21pKHVpbnQzMl90ICpkYXRhLCBpbnQgY291bnQsIHVpbnQzMl90IGh3X29mZnNldCwgaW50ICpmYWlsdXJlcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlOworCisgICAgc3RydWN0IHsKKwl1aW50MzJfdCBvcGNvZGU7CisJaW50IG1pbl9sZW47CisJaW50IG1heF9sZW47CisJY2hhciAqbmFtZTsKKyAgICB9IG9wY29kZXNfbWlbXSA9IHsKKwl7IDB4MDgsIDEsIDEsICJNSV9BUkJfT05fT0ZGIiB9LAorCXsgMHgwYSwgMSwgMSwgIk1JX0JBVENIX0JVRkZFUl9FTkQiIH0sCisJeyAweDMxLCAyLCAyLCAiTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIiB9LAorCXsgMHgxNCwgMywgMywgIk1JX0RJU1BMQVlfQlVGRkVSX0lORk8iIH0sCisJeyAweDA0LCAxLCAxLCAiTUlfRkxVU0giIH0sCisJeyAweDIyLCAzLCAzLCAiTUlfTE9BRF9SRUdJU1RFUl9JTU0iIH0sCisJeyAweDEzLCAyLCAyLCAiTUlfTE9BRF9TQ0FOX0xJTkVTX0VYQ0wiIH0sCisJeyAweDEyLCAyLCAyLCAiTUlfTE9BRF9TQ0FOX0xJTkVTX0lOQ0wiIH0sCisJeyAweDAwLCAxLCAxLCAiTUlfTk9PUCIgfSwKKwl7IDB4MTEsIDIsIDIsICJNSV9PVkVSTEFZX0ZMSVAiIH0sCisJeyAweDA3LCAxLCAxLCAiTUlfUkVQT1JUX0hFQUQiIH0sCisJeyAweDE4LCAyLCAyLCAiTUlfU0VUX0NPTlRFWFQiIH0sCisJeyAweDIwLCAzLCA0LCAiTUlfU1RPUkVfREFUQV9JTU0iIH0sCisJeyAweDIxLCAzLCA0LCAiTUlfU1RPUkVfREFUQV9JTkRFWCIgfSwKKwl7IDB4MjQsIDMsIDMsICJNSV9TVE9SRV9SRUdJU1RFUl9NRU0iIH0sCisJeyAweDAyLCAxLCAxLCAiTUlfVVNFUl9JTlRFUlJVUFQiIH0sCisJeyAweDAzLCAxLCAxLCAiTUlfV0FJVF9GT1JfRVZFTlQiIH0sCisgICAgfTsKKworCisgICAgZm9yIChvcGNvZGUgPSAwOyBvcGNvZGUgPCBzaXplb2Yob3Bjb2Rlc19taSkgLyBzaXplb2Yob3Bjb2Rlc19taVswXSk7CisJIG9wY29kZSsrKSB7CisJaWYgKChkYXRhWzBdICYgMHgxZjgwMDAwMCkgPj4gMjMgPT0gb3Bjb2Rlc19taVtvcGNvZGVdLm9wY29kZSkgeworCSAgICB1bnNpZ25lZCBpbnQgbGVuID0gMSwgaTsKKworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiJXNcbiIsIG9wY29kZXNfbWlbb3Bjb2RlXS5uYW1lKTsKKwkgICAgaWYgKG9wY29kZXNfbWlbb3Bjb2RlXS5tYXhfbGVuID4gMSkgeworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMjsKKwkJaWYgKGxlbiA8IG9wY29kZXNfbWlbb3Bjb2RlXS5taW5fbGVuIHx8CisJCSAgICBsZW4gPiBvcGNvZGVzX21pW29wY29kZV0ubWF4X2xlbikKKwkJeworCQkgICAgZnByaW50ZihvdXQsICJCYWQgbGVuZ3RoIGluICVzXG4iLAorCQkJICAgIG9wY29kZXNfbWlbb3Bjb2RlXS5uYW1lKTsKKwkJfQorCSAgICB9CisKKwkgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpID49IGNvdW50KQorCQkgICAgQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgb3Bjb2Rlc19taVtvcGNvZGVdLm5hbWUpOworCQlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpLCAiZHdvcmQgJWRcbiIsIGkpOworCSAgICB9CisKKwkgICAgcmV0dXJuIGxlbjsKKwl9CisgICAgfQorCisgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIk1JIFVOS05PV05cbiIpOworICAgICgqZmFpbHVyZXMpKys7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV8yZCh1aW50MzJfdCAqZGF0YSwgaW50IGNvdW50LCB1aW50MzJfdCBod19vZmZzZXQsIGludCAqZmFpbHVyZXMpCit7CisgICAgdW5zaWduZWQgaW50IG9wY29kZSwgbGVuOworICAgIGNoYXIgKmZvcm1hdCA9IE5VTEw7CisKKyAgICBzdHJ1Y3QgeworCXVpbnQzMl90IG9wY29kZTsKKwlpbnQgbWluX2xlbjsKKwlpbnQgbWF4X2xlbjsKKwljaGFyICpuYW1lOworICAgIH0gb3Bjb2Rlc18yZFtdID0geworCXsgMHg0MCwgNSwgNSwgIkNPTE9SX0JMVCIgfSwKKwl7IDB4NDMsIDYsIDYsICJTUkNfQ09QWV9CTFQiIH0sCisJeyAweDAxLCA4LCA4LCAiWFlfU0VUVVBfQkxUIiB9LAorCXsgMHgxMSwgOSwgOSwgIlhZX1NFVFVQX01PTk9fUEFUVEVSTl9TTF9CTFQiIH0sCisJeyAweDAzLCAzLCAzLCAiWFlfU0VUVVBfQ0xJUF9CTFQiIH0sCisJeyAweDI0LCAyLCAyLCAiWFlfUElYRUxfQkxUIiB9LAorCXsgMHgyNSwgMywgMywgIlhZX1NDQU5MSU5FU19CTFQiIH0sCisJeyAweDI2LCA0LCA0LCAiWV9URVhUX0JMVCIgfSwKKwl7IDB4MzEsIDUsIDEzNCwgIlhZX1RFWFRfSU1NRURJQVRFX0JMVCIgfSwKKwl7IDB4NTAsIDYsIDYsICJYWV9DT0xPUl9CTFQiIH0sCisJeyAweDUxLCA2LCA2LCAiWFlfUEFUX0JMVCIgfSwKKwl7IDB4NzYsIDgsIDgsICJYWV9QQVRfQ0hST01BX0JMVCIgfSwKKwl7IDB4NzIsIDcsIDEzNSwgIlhZX1BBVF9CTFRfSU1NRURJQVRFIiB9LAorCXsgMHg3NywgOSwgMTM3LCAiWFlfUEFUX0NIUk9NQV9CTFRfSU1NRURJQVRFIiB9LAorCXsgMHg1MiwgOSwgOSwgIlhZX01PTk9fUEFUX0JMVCIgfSwKKwl7IDB4NTksIDcsIDcsICJYWV9NT05PX1BBVF9GSVhFRF9CTFQiIH0sCisJeyAweDUzLCA4LCA4LCAiWFlfU1JDX0NPUFlfQkxUIiB9LAorCXsgMHg1NCwgOCwgOCwgIlhZX01PTk9fU1JDX0NPUFlfQkxUIiB9LAorCXsgMHg3MSwgOSwgMTM3LCAiWFlfTU9OT19TUkNfQ09QWV9JTU1FRElBVEVfQkxUIiB9LAorCXsgMHg1NSwgOSwgOSwgIlhZX0ZVTExfQkxUIiB9LAorCXsgMHg1NSwgOSwgMTM3LCAiWFlfRlVMTF9JTU1FRElBVEVfUEFUVEVSTl9CTFQiIH0sCisJeyAweDU2LCA5LCA5LCAiWFlfRlVMTF9NT05PX1NSQ19CTFQiIH0sCisJeyAweDc1LCAxMCwgMTM4LCAiWFlfRlVMTF9NT05PX1NSQ19JTU1FRElBVEVfUEFUVEVSTl9CTFQiIH0sCisJeyAweDU3LCAxMiwgMTIsICJYWV9GVUxMX01PTk9fUEFUVEVSTl9CTFQiIH0sCisJeyAweDU4LCAxMiwgMTIsICJYWV9GVUxMX01PTk9fUEFUVEVSTl9NT05PX1NSQ19CTFQiIH0sCisgICAgfTsKKworICAgIHN3aXRjaCAoKGRhdGFbMF0gJiAweDFmYzAwMDAwKSA+PiAyMikgeworICAgIGNhc2UgMHg1MDoKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLAorCQkgICJYWV9DT0xPUl9CTFQgKHJnYiAlc2FibGVkLCBhbHBoYSAlc2FibGVkLCBkc3QgdGlsZSAlZClcbiIsCisJCSAgKGRhdGFbMF0gJiAoMSA8PCAyMCkpID8gImVuIiA6ICJkaXMiLAorCQkgIChkYXRhWzBdICYgKDEgPDwgMjEpKSA/ICJlbiIgOiAiZGlzIiwKKwkJICAoZGF0YVswXSA+PiAxMSkgJiAxKTsKKworCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCWlmIChsZW4gIT0gNikKKwkgICAgZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gWFlfQ09MT1JfQkxUXG4iKTsKKwlpZiAoY291bnQgPCA2KQorCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiWFlfQ09MT1JfQkxUIik7CisKKwlzd2l0Y2ggKChkYXRhWzFdID4+IDI0KSAmIDB4MykgeworCWNhc2UgMDoKKwkgICAgZm9ybWF0PSI4IjsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBmb3JtYXQ9IjU2NSI7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgZm9ybWF0PSIxNTU1IjsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBmb3JtYXQ9Ijg4ODgiOworCSAgICBicmVhazsKKwl9CisKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAxLCAiZm9ybWF0ICVzLCBwaXRjaCAlZCwgIgorCQkgICJjbGlwcGluZyAlc2FibGVkXG4iLCBmb3JtYXQsCisJCSAgKHNob3J0KShkYXRhWzFdICYgMHhmZmZmKSwKKwkJICBkYXRhWzFdICYgKDEgPDwgMzApID8gImVuIiA6ICJkaXMiKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAyLCAiKCVkLCVkKVxuIiwKKwkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzJdID4+IDE2KTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAzLCAiKCVkLCVkKVxuIiwKKwkJICBkYXRhWzNdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA0LCAib2Zmc2V0IDB4JTA4eFxuIiwgZGF0YVs0XSk7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgNSwgImNvbG9yXG4iKTsKKwlyZXR1cm4gbGVuOworICAgIGNhc2UgMHg1MzoKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLAorCQkgICJYWV9TUkNfQ09QWV9CTFQgKHJnYiAlc2FibGVkLCBhbHBoYSAlc2FibGVkLCAiCisJCSAgInNyYyB0aWxlICVkLCBkc3QgdGlsZSAlZClcbiIsCisJCSAgKGRhdGFbMF0gJiAoMSA8PCAyMCkpID8gImVuIiA6ICJkaXMiLAorCQkgIChkYXRhWzBdICYgKDEgPDwgMjEpKSA/ICJlbiIgOiAiZGlzIiwKKwkJICAoZGF0YVswXSA+PiAxNSkgJiAxLAorCQkgIChkYXRhWzBdID4+IDExKSAmIDEpOworCisJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJaWYgKGxlbiAhPSA4KQorCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBYWV9TUkNfQ09QWV9CTFRcbiIpOworCWlmIChjb3VudCA8IDgpCisJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICJYWV9TUkNfQ09QWV9CTFQiKTsKKworCXN3aXRjaCAoKGRhdGFbMV0gPj4gMjQpICYgMHgzKSB7CisJY2FzZSAwOgorCSAgICBmb3JtYXQ9IjgiOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGZvcm1hdD0iNTY1IjsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBmb3JtYXQ9IjE1NTUiOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIGZvcm1hdD0iODg4OCI7CisJICAgIGJyZWFrOworCX0KKworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDEsICJmb3JtYXQgJXMsIGRzdCBwaXRjaCAlZCwgIgorCQkgICJjbGlwcGluZyAlc2FibGVkXG4iLCBmb3JtYXQsCisJCSAgKHNob3J0KShkYXRhWzFdICYgMHhmZmZmKSwKKwkJICBkYXRhWzFdICYgKDEgPDwgMzApID8gImVuIiA6ICJkaXMiKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAyLCAiZHN0ICglZCwlZClcbiIsCisJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMywgImRzdCAoJWQsJWQpXG4iLAorCQkgIGRhdGFbM10gJiAweGZmZmYsIGRhdGFbM10gPj4gMTYpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDQsICJkc3Qgb2Zmc2V0IDB4JTA4eFxuIiwgZGF0YVs0XSk7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgNSwgInNyYyAoJWQsJWQpXG4iLAorCQkgIGRhdGFbNV0gJiAweGZmZmYsIGRhdGFbNV0gPj4gMTYpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDYsICJzcmMgcGl0Y2ggJWRcbiIsCisJCSAgKHNob3J0KShkYXRhWzZdICYgMHhmZmZmKSk7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgNywgInNyYyBvZmZzZXQgMHglMDh4XG4iLCBkYXRhWzddKTsKKwlyZXR1cm4gbGVuOworICAgIH0KKworICAgIGZvciAob3Bjb2RlID0gMDsgb3Bjb2RlIDwgc2l6ZW9mKG9wY29kZXNfMmQpIC8gc2l6ZW9mKG9wY29kZXNfMmRbMF0pOworCSBvcGNvZGUrKykgeworCWlmICgoZGF0YVswXSAmIDB4MWZjMDAwMDApID4+IDIyID09IG9wY29kZXNfMmRbb3Bjb2RlXS5vcGNvZGUpIHsKKwkgICAgdW5zaWduZWQgaW50IGk7CisKKwkgICAgbGVuID0gMTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIiVzXG4iLCBvcGNvZGVzXzJkW29wY29kZV0ubmFtZSk7CisJICAgIGlmIChvcGNvZGVzXzJkW29wY29kZV0ubWF4X2xlbiA+IDEpIHsKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gPCBvcGNvZGVzXzJkW29wY29kZV0ubWluX2xlbiB8fAorCQkgICAgbGVuID4gb3Bjb2Rlc18yZFtvcGNvZGVdLm1heF9sZW4pCisJCXsKKwkJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLCBvcGNvZGVzXzJkW29wY29kZV0ubmFtZSk7CisJCX0KKwkgICAgfQorCisJICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQlpZiAoaSA+PSBjb3VudCkKKwkJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sIG9wY29kZXNfMmRbb3Bjb2RlXS5uYW1lKTsKKwkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkgICAgfQorCisJICAgIHJldHVybiBsZW47CisJfQorICAgIH0KKworICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsICIyRCBVTktOT1dOXG4iKTsKKyAgICAoKmZhaWx1cmVzKSsrOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfM2RfMWModWludDMyX3QgKmRhdGEsIGludCBjb3VudCwgdWludDMyX3QgaHdfb2Zmc2V0LCBpbnQgKmZhaWx1cmVzKQoreworICAgIHN3aXRjaCAoKGRhdGFbMF0gJiAweDAwZjgwMDAwKSA+PiAxOSkgeworICAgIGNhc2UgMHgxMToKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiM0RTVEFURV9ERVBUSF9TVUJSRUNUQU5HTEVfRElTQUxCRVxuIik7CisJcmV0dXJuIDE7CisgICAgY2FzZSAweDEwOgorCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsICIzRFNUQVRFX1NDSVNTT1JfRU5BQkxFXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiM0QgVU5LTk9XTlxuIik7CisgICAgKCpmYWlsdXJlcykrKzsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzFkKHVpbnQzMl90ICpkYXRhLCBpbnQgY291bnQsIHVpbnQzMl90IGh3X29mZnNldCwgaW50ICpmYWlsdXJlcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuLCBpLCBjLCBvcGNvZGUsIHdvcmQsIG1hcCwgc2FtcGxlciwgaW5zdHI7CisKKyAgICBzdHJ1Y3QgeworCXVpbnQzMl90IG9wY29kZTsKKwlpbnQgbWluX2xlbjsKKwlpbnQgbWF4X2xlbjsKKwljaGFyICpuYW1lOworICAgIH0gb3Bjb2Rlc18zZF8xZFtdID0geworCXsgMHg4ZSwgMywgMywgIjNEU1RBVEVfQlVGRkVSX0lORk8iIH0sCisJeyAweDg2LCA0LCA0LCAiM0RTVEFURV9DSFJPTUFfS0VZIiB9LAorCXsgMHg5YywgMSwgMSwgIjNEU1RBVEVfQ0xFQVJfUEFSQU1FVEVSUyIgfSwKKwl7IDB4ODgsIDIsIDIsICIzRFNUQVRFX0NPTlNUQU5UX0JMRU5EX0NPTE9SIiB9LAorCXsgMHg5OSwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9ESUZGVVNFIiB9LAorCXsgMHg5YSwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9TUEVDVUxBUiIgfSwKKwl7IDB4OTgsIDIsIDIsICIzRFNUQVRFX0RFRkFVTFRfWiIgfSwKKwl7IDB4OTcsIDIsIDIsICIzRFNUQVRFX0RFUFRIX09GRlNFVF9TQ0FMRSIgfSwKKwl7IDB4ODUsIDIsIDIsICIzRFNUQVRFX0RFU1RfQlVGRkVSX1ZBUklBQkxFUyIgfSwKKwl7IDB4ODAsIDUsIDUsICIzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFIiB9LAorCXsgMHg4ZSwgMywgMywgIjNEU1RBVEVfQlVGRkVSX0lORk8iIH0sCisJeyAweDlkLCA2NSwgNjUsICIzRFNUQVRFX0ZJTFRFUl9DT0VGRklDSUVOVFNfNFg0IiB9LAorCXsgMHg5ZSwgNCwgNCwgIjNEU1RBVEVfTU9OT19GSUxURVIiIH0sCisJeyAweDg5LCA0LCA0LCAiM0RTVEFURV9GT0dfTU9ERSIgfSwKKwl7IDB4OGYsIDIsIDE2LCAiM0RTVEFURV9NQVBfUEFMTEVURV9MT0FEXzMyIiB9LAorCXsgMHg4MSwgMywgMywgIjNEU1RBVEVfU0NJU1NPUl9SRUNUQU5HTEUiIH0sCisJeyAweDgzLCAyLCAyLCAiM0RTVEFURV9TUEFOX1NUSVBQTEUiIH0sCisgICAgfTsKKworICAgIHN3aXRjaCAoKGRhdGFbMF0gJiAweDAwZmYwMDAwKSA+PiAxNikgeworICAgIGNhc2UgMHgwNzoKKwkvKiBUaGlzIGluc3RydWN0aW9uIGlzIHVudXN1YWwuICBBIDAgbGVuZ3RoIG1lYW5zIGp1c3QgMSBEV09SRCBpbnN0ZWFkIG9mCisJICogMi4gIFRoZSAwIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gb25lIHBsYWNlIHRvIGJlIHVuc3VwcG9ydGVkLCBidXQKKwkgKiBzdGF0ZWQgdG8gYmUgcmVxdWlyZWQgaW4gYW5vdGhlciwgYW5kIDAgbGVuZ3RoIExPQURfSU5ESVJFQ1RzIGFwcGVhcgorCSAqIHRvIGNhdXNlIG5vIGhhcm0gYXQgbGVhc3QuCisJICovCisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEU1RBVEVfTE9BRF9JTkRJUkVDVFxuIik7CisJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDE7CisJaSA9IDE7CisJaWYgKGRhdGFbMF0gJiAoMHgwMSA8PCA4KSkgeworCSAgICBpZiAoaSArIDIgPj0gY291bnQpCisJCUJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX0xPQURfSU5ESVJFQ1QiKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiU0lTLjBcbiIpOworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJTSVMuMVxuIik7CisJfQorCWlmIChkYXRhWzBdICYgKDB4MDIgPDwgOCkpIHsKKwkgICAgaWYgKGkgKyAxID49IGNvdW50KQorCQlCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RTVEFURV9MT0FEX0lORElSRUNUIik7CisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIkRJUy4wXG4iKTsKKwl9CisJaWYgKGRhdGFbMF0gJiAoMHgwNCA8PCA4KSkgeworCSAgICBpZiAoaSArIDIgPj0gY291bnQpCisJCUJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX0xPQURfSU5ESVJFQ1QiKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiU1NCLjBcbiIpOworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJTU0IuMVxuIik7CisJfQorCWlmIChkYXRhWzBdICYgKDB4MDggPDwgOCkpIHsKKwkgICAgaWYgKGkgKyAyID49IGNvdW50KQorCQlCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RTVEFURV9MT0FEX0lORElSRUNUIik7CisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIk1TQi4wXG4iKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiTVNCLjFcbiIpOworCX0KKwlpZiAoZGF0YVswXSAmICgweDEwIDw8IDgpKSB7CisJICAgIGlmIChpICsgMiA+PSBjb3VudCkKKwkJQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgIjNEU1RBVEVfTE9BRF9JTkRJUkVDVCIpOworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJQU1AuMFxuIik7CisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIlBTUC4xXG4iKTsKKwl9CisJaWYgKGRhdGFbMF0gJiAoMHgyMCA8PCA4KSkgeworCSAgICBpZiAoaSArIDIgPj0gY291bnQpCisJCUJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX0xPQURfSU5ESVJFQ1QiKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiUFNDLjBcbiIpOworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJQU0MuMVxuIik7CisJfQorCWlmIChsZW4gIT0gaSkgeworCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX0xPQURfSU5ESVJFQ1RcbiIpOworCSAgICAoKmZhaWx1cmVzKSsrOworCSAgICByZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gbGVuOworICAgIGNhc2UgMHgwNDoKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiM0RTVEFURV9MT0FEX1NUQVRFX0lNTUVESUFURV8xXG4iKTsKKwlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKwlpID0gMTsKKwlmb3IgKHdvcmQgPSAwOyB3b3JkIDw9IDc7IHdvcmQrKykgeworCSAgICBpZiAoZGF0YVswXSAmICgxIDw8ICg0ICsgd29yZCkpKSB7CisJCWlmIChpID49IGNvdW50KQorCQkgICAgQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgIjNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMSIpOworCisJCS8qIHNhdmUgdmVydGV4IHN0YXRlIGZvciBkZWNvZGUgKi8KKwkJaWYgKHdvcmQgPT0gMikgeworCQkgICAgc2F2ZWRfczJfc2V0ID0gMTsKKwkJICAgIHNhdmVkX3MyID0gZGF0YVtpXTsKKwkJfQorCQlpZiAod29yZCA9PSA0KSB7CisJCSAgICBzYXZlZF9zNF9zZXQgPSAxOworCQkgICAgc2F2ZWRfczQgPSBkYXRhW2ldOworCQl9CisKKwkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiUyVkXG4iLCB3b3JkKTsKKwkgICAgfQorCX0KKwlpZiAobGVuICE9IGkpIHsKKwkgICAgZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9MT0FEX0lORElSRUNUXG4iKTsKKwkgICAgKCpmYWlsdXJlcykrKzsKKwl9CisJcmV0dXJuIGxlbjsKKyAgICBjYXNlIDB4MDA6CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEU1RBVEVfTUFQX1NUQVRFXG4iKTsKKwlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwM2YpICsgMjsKKworCWkgPSAxOworCWZvciAobWFwID0gMDsgbWFwIDw9IDE1OyBtYXArKykgeworCSAgICBpZiAoZGF0YVsxXSAmICgxIDw8IG1hcCkpIHsKKwkJaWYgKGkgKyAzID49IGNvdW50KQorCQkgICAgQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgIjNEU1RBVEVfTUFQX1NUQVRFIik7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIm1hcCAlZCBNUzJcbiIsIG1hcCk7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIm1hcCAlZCBNUzNcbiIsIG1hcCk7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIm1hcCAlZCBNUzRcbiIsIG1hcCk7CisJICAgIH0KKwl9CisJaWYgKGxlbiAhPSBpKSB7CisJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIDNEU1RBVEVfTUFQX1NUQVRFXG4iKTsKKwkgICAgKCpmYWlsdXJlcykrKzsKKwkgICAgcmV0dXJuIGxlbjsKKwl9CisJcmV0dXJuIGxlbjsKKyAgICBjYXNlIDB4MDY6CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEU1RBVEVfUElYRUxfU0hBREVSX0NPTlNUQU5UU1xuIik7CisJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisKKwlpID0gMTsKKwlmb3IgKGMgPSAwOyBjIDw9IDMxOyBjKyspIHsKKwkgICAgaWYgKGRhdGFbMV0gJiAoMSA8PCBjKSkgeworCQlpZiAoaSArIDQgPj0gY291bnQpCisJCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RTVEFURV9QSVhFTF9TSEFERVJfQ09OU1RBTlRTIik7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksICJDJWQuWCA9ICVmXG4iLAorCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQlpKys7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksICJDJWQuWSA9ICVmXG4iLAorCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQlpKys7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksICJDJWQuWiA9ICVmXG4iLAorCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQlpKys7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksICJDJWQuVyA9ICVmXG4iLAorCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQlpKys7CisJICAgIH0KKwl9CisJaWYgKGxlbiAhPSBpKSB7CisJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIDNEU1RBVEVfTUFQX1NUQVRFXG4iKTsKKwkgICAgKCpmYWlsdXJlcykrKzsKKwl9CisJcmV0dXJuIGxlbjsKKyAgICBjYXNlIDB4MDU6CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU1cbiIpOworCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCWlmICgobGVuIC0gMSkgJSAzICE9IDAgfHwgbGVuID4gMzcwKSB7CisJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIDNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU1cbiIpOworCSAgICAoKmZhaWx1cmVzKSsrOworCX0KKwlpID0gMTsKKwlmb3IgKGluc3RyID0gMDsgaW5zdHIgPCAobGVuIC0gMSkgLyAzOyBpbnN0cisrKSB7CisJICAgIGlmIChpICsgMyA+PSBjb3VudCkKKwkJQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgIjNEU1RBVEVfTUFQX1NUQVRFIik7CisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgIlBTJTAzeFxuIiwgaW5zdHIpOworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJQUyUwM3hcbiIsIGluc3RyKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAiUFMlMDN4XG4iLCBpbnN0cik7CisJfQorCXJldHVybiBsZW47CisgICAgY2FzZSAweDAxOgorCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsICIzRFNUQVRFX1NBTVBMRVJfU1RBVEVcbiIpOworCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDAzZikgKyAyOworCWkgPSAxOworCWZvciAoc2FtcGxlciA9IDA7IHNhbXBsZXIgPD0gMTU7IHNhbXBsZXIrKykgeworCSAgICBpZiAoZGF0YVsxXSAmICgxIDw8IHNhbXBsZXIpKSB7CisJCWlmIChpICsgMyA+PSBjb3VudCkKKwkJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX1NBTVBMRVJfU1RBVEUiKTsKKwkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSsrLCAic2FtcGxlciAlZCBTUzJcbiIsCisJCQkgIHNhbXBsZXIpOworCQlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpKyssICJzYW1wbGVyICVkIFNTM1xuIiwKKwkJCSAgc2FtcGxlcik7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGkrKywgInNhbXBsZXIgJWQgU1M0XG4iLAorCQkJICBzYW1wbGVyKTsKKwkgICAgfQorCX0KKwlpZiAobGVuICE9IGkpIHsKKwkgICAgZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9TQU1QTEVSX1NUQVRFXG4iKTsKKwkgICAgKCpmYWlsdXJlcykrKzsKKwl9CisJcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzXzNkXzFkKSAvIHNpemVvZihvcGNvZGVzXzNkXzFkWzBdKTsKKwkgb3Bjb2RlKyspCisgICAgeworCWlmICgoKGRhdGFbMF0gJiAweDAwZmYwMDAwKSA+PiAxNikgPT0gb3Bjb2Rlc18zZF8xZFtvcGNvZGVdLm9wY29kZSkgeworCSAgICBsZW4gPSAxOworCisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsICIlc1xuIiwgb3Bjb2Rlc18zZF8xZFtvcGNvZGVdLm5hbWUpOworCSAgICBpZiAob3Bjb2Rlc18zZF8xZFtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwZmZmZikgKyAyOworCQlpZiAobGVuIDwgb3Bjb2Rlc18zZF8xZFtvcGNvZGVdLm1pbl9sZW4gfHwKKwkJICAgIGxlbiA+IG9wY29kZXNfM2RfMWRbb3Bjb2RlXS5tYXhfbGVuKQorCQl7CisJCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAlc1xuIiwKKwkJCSAgICBvcGNvZGVzXzNkXzFkW29wY29kZV0ubmFtZSk7CisJCSAgICAoKmZhaWx1cmVzKSsrOworCQl9CisJICAgIH0KKworCSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgPj0gY291bnQpCisJCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAgb3Bjb2Rlc18zZF8xZFtvcGNvZGVdLm5hbWUpOworCQlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpLCAiZHdvcmQgJWRcbiIsIGkpOworCSAgICB9CisKKwkgICAgcmV0dXJuIGxlbjsKKwl9CisgICAgfQorCisgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEIFVOS05PV05cbiIpOworICAgICgqZmFpbHVyZXMpKys7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV8zZF9wcmltaXRpdmUodWludDMyX3QgKmRhdGEsIGludCBjb3VudCwgdWludDMyX3QgaHdfb2Zmc2V0LAorCQkgICAgaW50ICpmYWlsdXJlcykKK3sKKyAgICBjaGFyIGltbWVkaWF0ZSA9IChkYXRhWzBdICYgKDEgPDwgMjMpKSA9PSAwOworICAgIHVuc2lnbmVkIGludCBsZW4sIGk7CisgICAgY2hhciAqcHJpbXR5cGU7CisKKyAgICBzd2l0Y2ggKChkYXRhWzBdID4+IDE4KSAmIDB4ZikgeworICAgIGNhc2UgMHgwOiBwcmltdHlwZSA9ICJUUklMSVNUIjsgYnJlYWs7CisgICAgY2FzZSAweDE6IHByaW10eXBlID0gIlRSSVNUUklQIjsgYnJlYWs7CisgICAgY2FzZSAweDI6IHByaW10eXBlID0gIlRSSVNUUklQX1JFVkVSU0UiOyBicmVhazsKKyAgICBjYXNlIDB4MzogcHJpbXR5cGUgPSAiVFJJRkFOIjsgYnJlYWs7CisgICAgY2FzZSAweDQ6IHByaW10eXBlID0gIlBPTFlHT04iOyBicmVhazsKKyAgICBjYXNlIDB4NTogcHJpbXR5cGUgPSAiTElORUxJU1QiOyBicmVhazsKKyAgICBjYXNlIDB4NjogcHJpbXR5cGUgPSAiTElORVNUUklQIjsgYnJlYWs7CisgICAgY2FzZSAweDc6IHByaW10eXBlID0gIlJFQ1RMSVNUIjsgYnJlYWs7CisgICAgY2FzZSAweDg6IHByaW10eXBlID0gIlBPSU5UTElTVCI7IGJyZWFrOworICAgIGNhc2UgMHg5OiBwcmltdHlwZSA9ICJESUIiOyBicmVhazsKKyAgICBjYXNlIDB4YTogcHJpbXR5cGUgPSAiQ0xFQVJfUkVDVCI7IGJyZWFrOworICAgIGRlZmF1bHQ6IHByaW10eXBlID0gInVua25vd24iOyBicmVhazsKKyAgICB9CisKKyAgICAvKiBYWFg6IDNEUFJJTV9ESUIgbm90IHN1cHBvcnRlZCAqLworICAgIGlmIChpbW1lZGlhdGUpIHsKKwlsZW4gPSAoZGF0YVswXSAmIDB4MDAwM2ZmZmYpICsgMjsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiM0RQUklNSVRJVkUgaW5saW5lICVzXG4iLCBwcmltdHlwZSk7CisJaWYgKGNvdW50IDwgbGVuKQorCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAgIjNEUFJJTUlUSVZFIGlubGluZSIpOworCWlmICghc2F2ZWRfczJfc2V0IHx8ICFzYXZlZF9zNF9zZXQpIHsKKwkgICAgZnByaW50ZihvdXQsICJ1bmtub3duIHZlcnRleCBmb3JtYXRcbiIpOworCSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwKKwkJCSAgIiAgICAgICAgICAgdmVydGV4IGRhdGEgKCVmIGZsb2F0KVxuIiwKKwkJCSAgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHVuc2lnbmVkIGludCB2ZXJ0ZXggPSAwOworCSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOykgeworCQl1bnNpZ25lZCBpbnQgdGM7CisKKyNkZWZpbmUgVkVSVEVYX09VVChmbXQsIC4uLikgZG8gewkJCQkJXAorICAgIGlmIChpIDwgbGVuKQkJCQkJCQlcCisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwgIiBWJWQuImZtdCJcbiIsIHZlcnRleCwgX19WQV9BUkdTX18pOyBcCisgICAgZWxzZQkJCQkJCQkJXAorCWZwcmludGYob3V0LCAiIG1pc3NpbmcgZGF0YSBpbiBWJWRcbiIsIHZlcnRleCk7CQkJXAorICAgIGkrKzsJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKwkJVkVSVEVYX09VVCgiWCA9ICVmIiwgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJVkVSVEVYX09VVCgiWSA9ICVmIiwgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkgICAgICAgIHN3aXRjaCAoc2F2ZWRfczQgPj4gNiAmIDB4NykgeworCQljYXNlIDB4MToKKwkJICAgIFZFUlRFWF9PVVQoIlogPSAlZiIsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDI6CisJCSAgICBWRVJURVhfT1VUKCJaID0gJWYiLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkgICAgVkVSVEVYX09VVCgiVyA9ICVmIiwgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MzoKKwkJICAgIGJyZWFrOworCQljYXNlIDB4NDoKKwkJICAgIFZFUlRFWF9PVVQoIlcgPSAlZiIsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIGZwcmludGYob3V0LCAiYmFkIFM0IHBvc2l0aW9uIG1hc2tcbiIpOworCQl9CisKKwkJaWYgKHNhdmVkX3M0ICYgKDEgPDwgMTApKSB7CisJCSAgICBWRVJURVhfT1VUKCJjb2xvciA9IChBPTB4JTAyeCwgUj0weCUwMngsIEc9MHglMDJ4LCAiCisJCQkgICAgICAgIkI9MHglMDJ4KSIsCisJCQkgICAgICAgZGF0YVtpXSA+PiAyNCwKKwkJCSAgICAgICAoZGF0YVtpXSA+PiAxNikgJiAweGZmLAorCQkJICAgICAgIChkYXRhW2ldID4+IDgpICYgMHhmZiwKKwkJCSAgICAgICBkYXRhW2ldICYgMHhmZik7CisJCX0KKwkJaWYgKHNhdmVkX3M0ICYgKDEgPDwgMTEpKSB7CisJCSAgICBWRVJURVhfT1VUKCJzcGVjID0gKEE9MHglMDJ4LCBSPTB4JTAyeCwgRz0weCUwMngsICIKKwkJCSAgICAgICAiQj0weCUwMngpIiwKKwkJCSAgICAgICBkYXRhW2ldID4+IDI0LAorCQkJICAgICAgIChkYXRhW2ldID4+IDE2KSAmIDB4ZmYsCisJCQkgICAgICAgKGRhdGFbaV0gPj4gOCkgJiAweGZmLAorCQkJICAgICAgIGRhdGFbaV0gJiAweGZmKTsKKwkJfQorCQlpZiAoc2F2ZWRfczQgJiAoMSA8PCAxMikpCisJCSAgICBWRVJURVhfT1VUKCJ3aWR0aCA9IDB4JTA4eCkiLCBkYXRhW2ldKTsKKworCQlmb3IgKHRjID0gMDsgdGMgPD0gNzsgdGMrKykgeworCQkgICAgc3dpdGNoICgoc2F2ZWRfczIgPj4gKHRjICogNCkpICYgMHhmKSB7CisJCSAgICBjYXNlIDB4MDoKKwkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCVZFUlRFWF9PVVQoIlQlZC5ZID0gJWYiLCB0YywgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAweDE6CisJCQlWRVJURVhfT1VUKCJUJWQuWCA9ICVmIiwgdGMsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQlWRVJURVhfT1VUKCJUJWQuWSA9ICVmIiwgdGMsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQlWRVJURVhfT1VUKCJUJWQuWiA9ICVmIiwgdGMsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgyOgorCQkJVkVSVEVYX09VVCgiVCVkLlggPSAlZiIsIHRjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJVkVSVEVYX09VVCgiVCVkLlkgPSAlZiIsIHRjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJVkVSVEVYX09VVCgiVCVkLlogPSAlZiIsIHRjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJVkVSVEVYX09VVCgiVCVkLlcgPSAlZiIsIHRjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIDB4MzoKKwkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAweDQ6CisJCQlWRVJURVhfT1VUKCJUJWQuWFkgPSAweCUwOHggaGFsZi1mbG9hdCIsIHRjLCBkYXRhW2ldKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAweDU6CisJCQlWRVJURVhfT1VUKCJUJWQuWFkgPSAweCUwOHggaGFsZi1mbG9hdCIsIHRjLCBkYXRhW2ldKTsKKwkJCVZFUlRFWF9PVVQoIlQlZC5aVyA9IDB4JTA4eCBoYWxmLWZsb2F0IiwgdGMsIGRhdGFbaV0pOworCQkJYnJlYWs7CisJCSAgICBjYXNlIDB4ZjoKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCWZwcmludGYob3V0LCAiYmFkIFMyLlQlZCBmb3JtYXRcbiIsIHRjKTsKKwkJICAgIH0KKwkJfQorCQl2ZXJ0ZXgrKzsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCS8qIGluZGlyZWN0IHZlcnRpY2VzICovCisJbGVuID0gZGF0YVswXSAmIDB4MDAwMGZmZmY7IC8qIGluZGV4IGNvdW50ICovCisJaWYgKGRhdGFbMF0gJiAoMSA8PCAxNykpIHsKKwkgICAgLyogcmFuZG9tIHZlcnRleCBhY2Nlc3MgKi8KKwkgICAgaWYgKGNvdW50IDwgKGxlbiArIDEpIC8gMiArIDEpIHsKKwkJQlVGRkVSX0ZBSUwoY291bnQsIChsZW4gKyAxKSAvIDIgKyAxLAorCQkJICAgICIzRFBSSU1JVElWRSByYW5kb20gaW5kaXJlY3QiKTsKKwkgICAgfQorCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLAorCQkgICAgICAiM0RQUklNSVRJVkUgcmFuZG9tIGluZGlyZWN0ICVzICglZClcbiIsIHByaW10eXBlLCBsZW4pOworCSAgICBpZiAobGVuID09IDApIHsKKwkJLyogdmVydGV4IGluZGljZXMgY29udGludWUgdW50aWwgMHhmZmZmIGlzIGZvdW5kICovCisJCWZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisJCSAgICBpZiAoKGRhdGFbaV0gJiAweGZmZmYpID09IDB4ZmZmZikgeworCQkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwKKwkJCQkgICIgICAgICAgICAgICBpbmRpY2VzOiAodGVybWluYXRvcilcbiIpOworCQkJcmV0dXJuIGk7CisJCSAgICB9IGVsc2UgaWYgKChkYXRhW2ldID4+IDE2KSA9PSAweGZmZmYpIHsKKwkJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksCisJCQkJICAiICAgICAgICAgICAgaW5kaWNlczogMHglMDR4LCAiCisJCQkJICAiKHRlcm1pbmF0b3IpXG4iLAorCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZik7CisJCQlyZXR1cm4gaTsKKwkJICAgIH0gZWxzZSB7CisJCQlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpLAorCQkJCSAgIiAgICAgICAgICAgIGluZGljZXM6IDB4JTA0eCwgMHglMDR4XG4iLAorCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZiwgZGF0YVtpXSA+PiAxNik7CisJCSAgICB9CisJCX0KKwkJZnByaW50ZihvdXQsCisJCQkiM0RQUklNSVRJVkU6IG5vIHRlcm1pbmF0b3IgZm91bmQgaW4gaW5kZXggYnVmZmVyXG4iKTsKKwkJKCpmYWlsdXJlcykrKzsKKwkJcmV0dXJuIGNvdW50OworCSAgICB9IGVsc2UgeworCQkvKiBmaXhlZCBzaXplIHZlcnRleCBpbmRleCBidWZmZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7CisJCSAgICBpZiAoaSAqIDIgPT0gbGVuIC0gMSkgeworCQkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwKKwkJCQkgICIgICAgICAgICAgICBpbmRpY2VzOiAweCUwNHhcbiIsCisJCQkJICBkYXRhW2ldICYgMHhmZmZmKTsKKwkJICAgIH0gZWxzZSB7CisJCQlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCBpLAorCQkJCSAgIiAgICAgICAgICAgIGluZGljZXM6IDB4JTA0eCwgMHglMDR4XG4iLAorCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZiwgZGF0YVtpXSA+PiAxNik7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gKGxlbiArIDEpIC8gMiArIDE7CisJfSBlbHNlIHsKKwkgICAgLyogc2VxdWVudGlhbCB2ZXJ0ZXggYWNjZXNzICovCisJICAgIGlmIChjb3VudCA8IDIpCisJCUJVRkZFUl9GQUlMKGNvdW50LCAyLCAiM0RQUklNSVRJVkUgc2VxIGluZGlyZWN0Iik7CisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsCisJCSAgICAgICIzRFBSSU1JVElWRSBzZXF1ZW50aWFsIGluZGlyZWN0ICVzLCAlZCBzdGFydGluZyBmcm9tICIKKwkJICAgICAgIiVkXG4iLCBwcmltdHlwZSwgbGVuLCBkYXRhWzFdICYgMHhmZmZmKTsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMSwgIiAgICAgICAgICAgc3RhcnRcbiIpOworCSAgICByZXR1cm4gMjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkKHVpbnQzMl90ICpkYXRhLCBpbnQgY291bnQsIHVpbnQzMl90IGh3X29mZnNldCwgaW50ICpmYWlsdXJlcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlOworCisgICAgc3RydWN0IHsKKwl1aW50MzJfdCBvcGNvZGU7CisJaW50IG1pbl9sZW47CisJaW50IG1heF9sZW47CisJY2hhciAqbmFtZTsKKyAgICB9IG9wY29kZXNfM2RbXSA9IHsKKwl7IDB4MDYsIDEsIDEsICIzRFNUQVRFX0FOVElfQUxJQVNJTkciIH0sCisJeyAweDA4LCAxLCAxLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX09QUyIgfSwKKwl7IDB4MDksIDEsIDEsICIzRFNUQVRFX0JBQ0tGQUNFX1NURU5DSUxfTUFTS1MiIH0sCisJeyAweDE2LCAxLCAxLCAiM0RTVEFURV9DT09SRF9TRVRfQklORElOR1MiIH0sCisJeyAweDE1LCAxLCAxLCAiM0RTVEFURV9GT0dfQ09MT1IiIH0sCisJeyAweDBiLCAxLCAxLCAiM0RTVEFURV9JTkRFUEVOREVOVF9BTFBIQV9CTEVORCIgfSwKKwl7IDB4MGQsIDEsIDEsICIzRFNUQVRFX01PREVTXzQiIH0sCisJeyAweDBjLCAxLCAxLCAiM0RTVEFURV9NT0RFU181IiB9LAorCXsgMHgwNywgMSwgMSwgIjNEU1RBVEVfUkFTVEVSSVpBVElPTl9SVUxFUyIgfSwKKyAgICB9OworCisgICAgc3dpdGNoICgoZGF0YVswXSAmIDB4MWYwMDAwMDApID4+IDI0KSB7CisgICAgY2FzZSAweDFmOgorCXJldHVybiBkZWNvZGVfM2RfcHJpbWl0aXZlKGRhdGEsIGNvdW50LCBod19vZmZzZXQsIGZhaWx1cmVzKTsKKyAgICBjYXNlIDB4MWQ6CisJcmV0dXJuIGRlY29kZV8zZF8xZChkYXRhLCBjb3VudCwgaHdfb2Zmc2V0LCBmYWlsdXJlcyk7CisgICAgY2FzZSAweDFjOgorCXJldHVybiBkZWNvZGVfM2RfMWMoZGF0YSwgY291bnQsIGh3X29mZnNldCwgZmFpbHVyZXMpOworICAgIH0KKworICAgIGZvciAob3Bjb2RlID0gMDsgb3Bjb2RlIDwgc2l6ZW9mKG9wY29kZXNfM2QpIC8gc2l6ZW9mKG9wY29kZXNfM2RbMF0pOworCSBvcGNvZGUrKykgeworCWlmICgoZGF0YVswXSAmIDB4MWYwMDAwMDApID4+IDI0ID09IG9wY29kZXNfM2Rbb3Bjb2RlXS5vcGNvZGUpIHsKKwkgICAgdW5zaWduZWQgaW50IGxlbiA9IDEsIGk7CisKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIiVzXG4iLCBvcGNvZGVzXzNkW29wY29kZV0ubmFtZSk7CisJICAgIGlmIChvcGNvZGVzXzNkW29wY29kZV0ubWF4X2xlbiA+IDEpIHsKKwkJbGVuID0gKGRhdGFbMF0gJiAweGZmKSArIDI7CisJCWlmIChsZW4gPCBvcGNvZGVzXzNkW29wY29kZV0ubWluX2xlbiB8fAorCQkgICAgbGVuID4gb3Bjb2Rlc18zZFtvcGNvZGVdLm1heF9sZW4pCisJCXsKKwkJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLCBvcGNvZGVzXzNkW29wY29kZV0ubmFtZSk7CisJCX0KKwkgICAgfQorCisJICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQlpZiAoaSA+PSBjb3VudCkKKwkJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sIG9wY29kZXNfM2Rbb3Bjb2RlXS5uYW1lKTsKKwkJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkgICAgfQorCSAgICByZXR1cm4gbGVuOworCX0KKyAgICB9CisKKyAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAwLCAiM0QgVU5LTk9XTlxuIik7CisgICAgKCpmYWlsdXJlcykrKzsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0Xzk2NV9zdXJmYWNldHlwZSh1bnNpZ25lZCBpbnQgc3VyZmFjZXR5cGUpCit7CisgICAgc3dpdGNoIChzdXJmYWNldHlwZSkgeworICAgIGNhc2UgMDogcmV0dXJuICIxRCI7CisgICAgY2FzZSAxOiByZXR1cm4gIjJEIjsKKyAgICBjYXNlIDI6IHJldHVybiAiM0QiOworICAgIGNhc2UgMzogcmV0dXJuICJDVUJFIjsKKyAgICBjYXNlIDQ6IHJldHVybiAiQlVGRkVSIjsKKyAgICBjYXNlIDc6IHJldHVybiAiTlVMTCI7CisgICAgZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF85NjVfZGVwdGhmb3JtYXQodW5zaWduZWQgaW50IGRlcHRoZm9ybWF0KQoreworICAgIHN3aXRjaCAoZGVwdGhmb3JtYXQpIHsKKyAgICBjYXNlIDA6IHJldHVybiAiczhfejI0ZmxvYXQiOworICAgIGNhc2UgMTogcmV0dXJuICJ6MzJmbG9hdCI7CisgICAgY2FzZSAyOiByZXR1cm4gInoyNHM4IjsKKyAgICBjYXNlIDU6IHJldHVybiAiejE2IjsKKyAgICBkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzk2NSh1aW50MzJfdCAqZGF0YSwgaW50IGNvdW50LCB1aW50MzJfdCBod19vZmZzZXQsIGludCAqZmFpbHVyZXMpCit7CisgICAgdW5zaWduZWQgaW50IG9wY29kZSwgbGVuOworCisgICAgc3RydWN0IHsKKwl1aW50MzJfdCBvcGNvZGU7CisJaW50IG1pbl9sZW47CisJaW50IG1heF9sZW47CisJY2hhciAqbmFtZTsKKyAgICB9IG9wY29kZXNfM2RbXSA9IHsKKwl7IDB4NjAwMCwgMywgMywgIlVSQl9GRU5DRSIgfSwKKwl7IDB4NjAwMSwgMiwgMiwgIkNTX1VSQl9TVEFURSIgfSwKKwl7IDB4NjAwMiwgMiwgMiwgIkNPTlNUQU5UX0JVRkZFUiIgfSwKKwl7IDB4NjEwMSwgNiwgNiwgIlNUQVRFX0JBU0VfQUREUkVTUyIgfSwKKwl7IDB4NjEwMiwgMiwgMiAsICJTVEFURV9TSVAiIH0sCisJeyAweDYxMDQsIDEsIDEsICIzRFNUQVRFX1BJUEVMSU5FX1NFTEVDVCIgfSwKKwl7IDB4NjgwYiwgMSwgMSwgIjNEU1RBVEVfVkZfU1RBVElTVElDUyIgfSwKKwl7IDB4NjkwNCwgMSwgMSwgIjNEU1RBVEVfUElQRUxJTkVfU0VMRUNUIiB9LAorCXsgMHg3ODAwLCA3LCA3LCAiM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMiIH0sCisJeyAweDc4MDEsIDYsIDYsICIzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMiIH0sCisJeyAweDc4MGIsIDEsIDEsICIzRFNUQVRFX1ZGX1NUQVRJU1RJQ1MiIH0sCisJeyAweDc4MDgsIDUsIDI1NywgIjNEU1RBVEVfVkVSVEVYX0JVRkZFUlMiIH0sCisJeyAweDc4MDksIDMsIDI1NiwgIjNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTIiB9LAorCS8qIDB4NzgwODogM0RTVEFURV9WRVJURVhfQlVGRkVSUyAqLworCS8qIDB4NzgwOTogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMgKi8KKwl7IDB4NzkwMCwgNCwgNCwgIjNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEUiIH0sCisJeyAweDc5MDEsIDUsIDUsICIzRFNUQVRFX0NPTlNUQU5UX0NPTE9SIiB9LAorCXsgMHg3OTA1LCA1LCA3LCAiM0RTVEFURV9ERVBUSF9CVUZGRVIiIH0sCisJeyAweDc5MDYsIDIsIDIsICIzRFNUQVRFX1BPTFlfU1RJUFBMRV9PRkZTRVQiIH0sCisJeyAweDc5MDcsIDMzLCAzMywgIjNEU1RBVEVfUE9MWV9TVElQUExFX1BBVFRFUk4iIH0sCisJeyAweDc5MDgsIDMsIDMsICIzRFNUQVRFX0xJTkVfU1RJUFBMRSIgfSwKKwl7IDB4NzkwOSwgMiwgMiwgIjNEU1RBVEVfR0xPQkFMX0RFUFRIX09GRlNFVF9DTEFNUCIgfSwKKwl7IDB4NzkwYSwgMywgMywgIjNEU1RBVEVfQUFfTElORV9QQVJBTUVURVJTIiB9LAorCXsgMHg3YjAwLCA2LCA2LCAiM0RQUklNSVRJVkUiIH0sCisgICAgfTsKKworICAgIGxlbiA9IChkYXRhWzBdICYgMHgwMDAwZmZmZikgKyAyOworCisgICAgc3dpdGNoICgoZGF0YVswXSAmIDB4ZmZmZjAwMDApID4+IDE2KSB7CisgICAgY2FzZSAweDYxMDE6CisJaWYgKGxlbiAhPSA2KQorCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBTVEFURV9CQVNFX0FERFJFU1NcbiIpOworCWlmIChjb3VudCA8IDYpCisJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICJTVEFURV9CQVNFX0FERFJFU1MiKTsKKworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsCisJCSAgIlNUQVRFX0JBU0VfQUREUkVTU1xuIik7CisKKwlpZiAoZGF0YVsxXSAmIDEpIHsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMSwgIkdlbmVyYWwgc3RhdGUgYXQgMHglMDh4XG4iLAorCQkgICAgICBkYXRhWzFdICYgfjEpOworCX0gZWxzZQorCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAxLCAiR2VuZXJhbCBzdGF0ZSBub3QgdXBkYXRlZFxuIik7CisKKwlpZiAoZGF0YVsyXSAmIDEpIHsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMiwgIlN1cmZhY2Ugc3RhdGUgYXQgMHglMDh4XG4iLAorCQkgICAgICBkYXRhWzJdICYgfjEpOworCX0gZWxzZQorCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAyLCAiU3VyZmFjZSBzdGF0ZSBub3QgdXBkYXRlZFxuIik7CisKKwlpZiAoZGF0YVszXSAmIDEpIHsKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMywgIkluZGlyZWN0IHN0YXRlIGF0IDB4JTA4eFxuIiwKKwkJICAgICAgZGF0YVszXSAmIH4xKTsKKwl9IGVsc2UKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMywgIkluZGlyZWN0IHN0YXRlIG5vdCB1cGRhdGVkXG4iKTsKKworCWlmIChkYXRhWzRdICYgMSkgeworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA0LCAiR2VuZXJhbCBzdGF0ZSB1cHBlciBib3VuZCAweCUwOHhcbiIsCisJCSAgICAgIGRhdGFbNF0gJiB+MSk7CisJfSBlbHNlCisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDQsICJHZW5lcmFsIHN0YXRlIG5vdCB1cGRhdGVkXG4iKTsKKworCWlmIChkYXRhWzVdICYgMSkgeworCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA1LCAiSW5kaXJlY3Qgc3RhdGUgdXBwZXIgYm91bmQgMHglMDh4XG4iLAorCQkgICAgICBkYXRhWzVdICYgfjEpOworCX0gZWxzZQorCSAgICBpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA1LCAiSW5kaXJlY3Qgc3RhdGUgbm90IHVwZGF0ZWRcbiIpOworCisJcmV0dXJuIGxlbjsKKyAgICBjYXNlIDB4NzgwMDoKKwlpZiAobGVuICE9IDcpCisJICAgIGZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTXG4iKTsKKwlpZiAoY291bnQgPCA3KQorCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMiKTsKKworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsCisJCSAgIjNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAxLCAiVlMgc3RhdGVcbiIpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDIsICJHUyBzdGF0ZVxuIik7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMywgIkNsaXAgc3RhdGVcbiIpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDQsICJTRiBzdGF0ZVxuIik7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgNSwgIldNIHN0YXRlXG4iKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA2LCAiQ0Mgc3RhdGVcbiIpOworCXJldHVybiBsZW47CisgICAgY2FzZSAweDc4MDE6CisJaWYgKGxlbiAhPSA2KQorCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNcbiIpOworCWlmIChjb3VudCA8IDYpCisJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMiKTsKKworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsCisJCSAgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU1xuIik7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMSwgIlZTIGJpbmRpbmcgdGFibGVcbiIpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDIsICJHUyBiaW5kaW5nIHRhYmxlXG4iKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAzLCAiQ2xpcCBiaW5kaW5nIHRhYmxlXG4iKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCA0LCAiU0YgYmluZGluZyB0YWJsZVxuIik7CisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgNSwgIldNIGJpbmRpbmcgdGFibGVcbiIpOworCisJcmV0dXJuIGxlbjsKKworICAgIGNhc2UgMHg3OTAwOgorCWlmIChsZW4gIT0gNCkKKwkgICAgZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRVxuIik7CisJaWYgKGNvdW50IDwgNCkKKwkgICAgQlVGRkVSX0ZBSUwoY291bnQsIGxlbiwgIjNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEUiKTsKKworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsCisJCSAgIjNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEVcbiIpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDEsICJ0b3AgbGVmdDogJWQsJWRcbiIsCisJCSAgZGF0YVsxXSAmIDB4ZmZmZiwKKwkJICAoZGF0YVsxXSA+PiAxNikgJiAweGZmZmYpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDIsICJib3R0b20gcmlnaHQ6ICVkLCVkXG4iLAorCQkgIGRhdGFbMl0gJiAweGZmZmYsCisJCSAgKGRhdGFbMl0gPj4gMTYpICYgMHhmZmZmKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAzLCAib3JpZ2luOiAlZCwlZFxuIiwKKwkJICAoaW50KWRhdGFbM10gJiAweGZmZmYsCisJCSAgKChpbnQpZGF0YVszXSA+PiAxNikgJiAweGZmZmYpOworCisJcmV0dXJuIGxlbjsKKworICAgIGNhc2UgMHg3OTA1OgorCWlmIChsZW4gIT0gNSkKKwkgICAgZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9ERVBUSF9CVUZGRVJcbiIpOworCWlmIChjb3VudCA8IDUpCisJICAgIEJVRkZFUl9GQUlMKGNvdW50LCBsZW4sICIzRFNUQVRFX0RFUFRIX0JVRkZFUiIpOworCisJaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwKKwkJICAiM0RTVEFURV9ERVBUSF9CVUZGRVJcbiIpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDEsICIlcywgJXMsIHBpdGNoID0gJWQgYnl0ZXMsICVzdGlsZWRcbiIsCisJCSAgZ2V0Xzk2NV9zdXJmYWNldHlwZShkYXRhWzFdID4+IDI5KSwKKwkJICBnZXRfOTY1X2RlcHRoZm9ybWF0KChkYXRhWzFdID4+IDE4KSAmIDB4NyksCisJCSAgKGRhdGFbMV0gJiAweDAwMDFmZmZmKSArIDEsCisJCSAgZGF0YVsxXSAmICgxIDw8IDI3KSA/ICIiIDogIm5vdCAiKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAyLCAiZGVwdGggb2Zmc2V0XG4iKTsKKwlpbnN0cl9vdXQoZGF0YSwgaHdfb2Zmc2V0LCAzLCAiJWR4JWRcbiIsCisJCSAgKChkYXRhWzNdICYgMHgwMDA3ZmZjMCkgPj4gNikgKyAxLAorCQkgICgoZGF0YVszXSAmIDB4ZmZmODAwMDApID4+IDE5KSArIDEpOworCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDQsICJ2b2x1bWUgZGVwdGhcbiIpOworCisJcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzXzNkKSAvIHNpemVvZihvcGNvZGVzXzNkWzBdKTsKKwkgb3Bjb2RlKyspIHsKKwlpZiAoKGRhdGFbMF0gJiAweGZmZmYwMDAwKSA+PiAxNiA9PSBvcGNvZGVzXzNkW29wY29kZV0ub3Bjb2RlKSB7CisJICAgIHVuc2lnbmVkIGludCBpOworCSAgICBsZW4gPSAxOworCisJICAgIGluc3RyX291dChkYXRhLCBod19vZmZzZXQsIDAsICIlc1xuIiwgb3Bjb2Rlc18zZFtvcGNvZGVdLm5hbWUpOworCSAgICBpZiAob3Bjb2Rlc18zZFtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCWxlbiA9IChkYXRhWzBdICYgMHhmZikgKyAyOworCQlpZiAobGVuIDwgb3Bjb2Rlc18zZFtvcGNvZGVdLm1pbl9sZW4gfHwKKwkJICAgIGxlbiA+IG9wY29kZXNfM2Rbb3Bjb2RlXS5tYXhfbGVuKQorCQl7CisJCSAgICBmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAlc1xuIiwgb3Bjb2Rlc18zZFtvcGNvZGVdLm5hbWUpOworCQl9CisJICAgIH0KKworCSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgPj0gY291bnQpCisJCSAgICBCVUZGRVJfRkFJTChjb3VudCwgbGVuLCBvcGNvZGVzXzNkW29wY29kZV0ubmFtZSk7CisJCWluc3RyX291dChkYXRhLCBod19vZmZzZXQsIGksICJkd29yZCAlZFxuIiwgaSk7CisJICAgIH0KKwkgICAgcmV0dXJuIGxlbjsKKwl9CisgICAgfQorCisgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgMCwgIjNEIFVOS05PV05cbiIpOworICAgICgqZmFpbHVyZXMpKys7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogRGVjb2RlcyBhbiBpODMwLWk5MTUgYmF0Y2ggYnVmZmVyLCB3cml0aW5nIHRoZSBvdXRwdXQgdG8gc3Rkb3V0LgorICoKKyAqIFxwYXJhbSBkYXRhIGJhdGNoIGJ1ZmZlciBjb250ZW50cworICogXHBhcmFtIGNvdW50IG51bWJlciBvZiBEV09SRHMgdG8gZGVjb2RlIGluIHRoZSBiYXRjaCBidWZmZXIKKyAqIFxwYXJhbSBod19vZmZzZXQgaGFyZHdhcmUgYWRkcmVzcyBmb3IgdGhlIGJ1ZmZlcgorICovCitpbnQKK2ludGVsX2RlY29kZSh1aW50MzJfdCAqZGF0YSwgaW50IGNvdW50LCB1aW50MzJfdCBod19vZmZzZXQsIHVpbnQzMl90IGRldmlkKQoreworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IGZhaWx1cmVzID0gMDsKKworICAgIG91dCA9IHN0ZGVycjsKKworICAgIHdoaWxlIChpbmRleCA8IGNvdW50KSB7CisJc3dpdGNoICgoZGF0YVtpbmRleF0gJiAweGUwMDAwMDAwKSA+PiAyOSkgeworCWNhc2UgMHgwOgorCSAgICBpbmRleCArPSBkZWNvZGVfbWkoZGF0YSArIGluZGV4LCBjb3VudCAtIGluZGV4LAorCQkJICAgICAgIGh3X29mZnNldCArIGluZGV4ICogNCwgJmZhaWx1cmVzKTsKKwkgICAgYnJlYWs7CisJY2FzZSAweDI6CisJICAgIGluZGV4ICs9IGRlY29kZV8yZChkYXRhICsgaW5kZXgsIGNvdW50IC0gaW5kZXgsCisJCQkgICAgICAgaHdfb2Zmc2V0ICsgaW5kZXggKiA0LCAmZmFpbHVyZXMpOworCSAgICBicmVhazsKKwljYXNlIDB4MzoKKwkgICAgaWYgKElTXzk2NShkZXZpZCkpIHsKKwkJaW5kZXggKz0gZGVjb2RlXzNkXzk2NShkYXRhICsgaW5kZXgsIGNvdW50IC0gaW5kZXgsCisJCQkJICAgICAgIGh3X29mZnNldCArIGluZGV4ICogNCwgJmZhaWx1cmVzKTsKKwkgICAgfSBlbHNlIHsKKwkJaW5kZXggKz0gZGVjb2RlXzNkKGRhdGEgKyBpbmRleCwgY291bnQgLSBpbmRleCwKKwkJCQkgICBod19vZmZzZXQgKyBpbmRleCAqIDQsICZmYWlsdXJlcyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgaW5zdHJfb3V0KGRhdGEsIGh3X29mZnNldCwgaW5kZXgsICJVTktOT1dOXG4iKTsKKwkgICAgZmFpbHVyZXMrKzsKKwkgICAgaW5kZXgrKzsKKwkgICAgYnJlYWs7CisJfQorCWZmbHVzaChvdXQpOworICAgIH0KKworICAgIHJldHVybiBmYWlsdXJlczsKK30KKwordm9pZCBpbnRlbF9kZWNvZGVfY29udGV4dF9yZXNldCh2b2lkKQoreworICAgIHNhdmVkX3MyX3NldCA9IDA7CisgICAgc2F2ZWRfczRfc2V0ID0gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVjb2RlLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA2NDRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVjb2RlLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCitpbnQgaW50ZWxfZGVjb2RlKHVpbnQzMl90ICpkYXRhLCBpbnQgY291bnQsIHVpbnQzMl90IGh3X29mZnNldCwgdWludDMyX3QgZGV2aWQpOwordm9pZCBpbnRlbF9kZWNvZGVfY29udGV4dF9yZXNldCh2b2lkKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2RlcHRoc3RlbmNpbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVwdGhzdGVuY2lsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiYTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2RlcHRoc3RlbmNpbC5jCkBAIC0wLDAgKzEsMjUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImRlcHRoc3RlbmNpbC5oIgorI2luY2x1ZGUgImZib2JqZWN0LmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAicmVuZGVyYnVmZmVyLmgiCisKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfZGVwdGhzdGVuY2lsLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX3NwYW4uaCIKKworLyoqCisgKiBUaGUgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZWlyIG93bgorICogZnJhbWVidWZmZXIgb2JqZWN0cyBjb25zaXN0aW5nIG9mIGNvbG9yIHJlbmRlcmJ1ZmZlcnMgKDAgb3IgbW9yZSksCisgKiBkZXB0aCByZW5kZXJidWZmZXJzICgwIG9yIDEpIGFuZCBzdGVuY2lsIHJlbmRlcmJ1ZmZlcnMgKDAgb3IgMSkuCisgKgorICogVGhlIHNwZWMgY29uc2lkZXJzIGRlcHRoIGFuZCBzdGVuY2lsIHJlbmRlcmJ1ZmZlcnMgdG8gYmUgdG90YWxseSBpbmRlcGVuZGVudAorICogYnVmZmVycy4gIEluIHJlYWxpdHksIG1vc3QgZ3JhcGhpY3MgaGFyZHdhcmUgdG9kYXkgdXNlcyBhIGNvbWJpbmVkCisgKiBkZXB0aCtzdGVuY2lsIGJ1ZmZlciAob25lIDMyLWJpdCBwaXhlbCA9IDI0IGJpdHMgb2YgWiArIDggYml0cyBvZiBzdGVuY2lsKS4KKyAqCisgKiBUaGlzIGNhdXNlcyBkaWZmaWN1bHR5IGJlY2F1c2UgdGhlIHVzZXIgbWF5IGNyZWF0ZSBzb21lIG51bWJlciBvZiBkZXB0aAorICogcmVuZGVyYnVmZmVycyBhbmQgc29tZSBudW1iZXIgb2Ygc3RlbmNpbCByZW5kZXJidWZmZXJzIGFuZCBiaW5kIHRoZW0KKyAqIHRvZ2V0aGVyIGluIGZyYW1lYnVmZmVycyBpbiBhbnkgY29tYmluYXRpb24uCisgKgorICogVGhpcyBjb2RlIG1hbmFnZXMgYWxsIHRoYXQuCisgKgorICogMS4gRGVwdGggcmVuZGVyYnVmZmVycyBhcmUgYWx3YXlzIGFsbG9jYXRlZCBpbiBoYXJkd2FyZSBhcyAzMmJwcAorICogICAgR0xfREVQVEgyNF9TVEVOQ0lMOCBidWZmZXJzLgorICoKKyAqIDIuIFN0ZW5jaWwgcmVuZGVyYnVmZmVycyBhcmUgaW5pdGlhbGx5IGFsbG9jYXRlZCBpbiBzb2Z0d2FyZSBhcyA4YnBwCisgKiAgICBHTF9TVEVOQ0lMX0lOREVYOCBidWZmZXJzLgorICoKKyAqIDMuIERlcHRoIGFuZCBTdGVuY2lsIHJlbmRlcmJ1ZmZlcnMgdXNlIHRoZSBQYWlyZWRTdGVuY2lsIGFuZCBQYWlyZWREZXB0aAorICogICAgZmllbGRzIChyZXNwZWN0aXZlbHkpIHRvIGluZGljYXRlIGlmIHRoZSBidWZmZXIncyBjdXJyZW50bHkgcGFpcmVkCisgKiAgICB3aXRoIGFub3RoZXIgc3RlbmNpbCBvciBkZXB0aCBidWZmZXIgKHJlc3BlY3RpdmVseSkuCisgKgorICogNC4gV2hlbiBhIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlciBhcmUgaW5pdGlhbGx5IGJvdGggYXR0YWNoZWQgdG8gdGhlCisgKiAgICBjdXJyZW50IGZyYW1lYnVmZmVyLCB3ZSBtZXJnZSB0aGUgc3RlbmNpbCBidWZmZXIgdmFsdWVzIGludG8gdGhlCisgKiAgICBkZXB0aCBidWZmZXIgKHJlYWxseSBhIGRlcHRoK3N0ZW5jaWwgYnVmZmVyKS4gIFRoZSB0aGVuIGhhcmR3YXJlIHVzZXMKKyAqICAgIHRoZSBjb21iaW5lZCBidWZmZXIuCisgKgorICogNS4gV2hlbmV2ZXIgYSBkZXB0aCBvciBzdGVuY2lsIGJ1ZmZlciBpcyByZWFsbG9jYXRlZCAod2l0aAorICogICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlKSB3ZSB1bmRvIHRoZSBwYWlyaW5nIGFuZCBjb3B5IHRoZSBzdGVuY2lsIHZhbHVlcworICogICAgZnJvbSB0aGUgY29tYmluZWQgZGVwdGgvc3RlbmNpbCBidWZmZXIgYmFjayB0byB0aGUgc3RlbmNpbC1vbmx5IGJ1ZmZlci4KKyAqCisgKiA2LiBXZSBhbHNvIHVuZG8gdGhlIHBhaXJpbmcgd2hlbiB3ZSBmaW5kIGEgY2hhbmdlIGluIGJ1ZmZlciBiaW5kaW5ncy4KKyAqCisgKiA3LiBJZiBhIGZyYW1lYnVmZmVyIGlzIG9ubHkgdXNpbmcgYSBkZXB0aCByZW5kZXJidWZmZXIgKG5vIHN0ZW5jaWwpLCB3ZQorICogICAganVzdCB1c2UgdGhlIGNvbWJpbmVkIGRlcHRoL3N0ZW5jaWwgYnVmZmVyIGFuZCBpZ25vcmUgdGhlIHN0ZW5jaWwgdmFsdWVzLgorICoKKyAqIDguIElmIGEgZnJhbWVidWZmZXIgaXMgb25seSB1c2luZyBhIHN0ZW5jaWwgcmVuZGVyYnVmZmVyIChubyBkZXB0aCkgd2UgaGF2ZQorICogICAgdG8gcHJvbW90ZSB0aGUgOGJwcCBzb2Z0d2FyZSBzdGVuY2lsIGJ1ZmZlciB0byBhIDMyYnBwIGhhcmR3YXJlCisgKiAgICBkZXB0aCtzdGVuY2lsIGJ1ZmZlci4KKyAqCisgKi8KKworLyoqCisgKiBVbmRvIHRoZSBwYWlyaW5nL2ludGVybGVhdmluZyBiZXR3ZWVuIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnMuCisgKiBpcmIgc2hvdWxkIGJlIGEgZGVwdGgvc3RlbmNpbCBvciBzdGVuY2lsIHJlbmRlcmJ1ZmZlci4KKyAqLwordm9pZAoraW50ZWxfdW5wYWlyX2RlcHRoX3N0ZW5jaWwoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYikKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gJmlyYi0+QmFzZTsKKworICAgaWYgKGlyYi0+UGFpcmVkU3RlbmNpbCkgeworICAgICAgLyogaXJiIGlzIGEgZGVwdGgvc3RlbmNpbCBidWZmZXIgKi8KKyAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnN0ZW5jaWxSYjsKKyAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnN0ZW5jaWxJcmI7CisKKyAgICAgIEFTU0VSVChyYi0+X0FjdHVhbEZvcm1hdCA9PSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCk7CisKKyAgICAgIHN0ZW5jaWxSYiA9IF9tZXNhX2xvb2t1cF9yZW5kZXJidWZmZXIoY3R4LCBpcmItPlBhaXJlZFN0ZW5jaWwpOworICAgICAgc3RlbmNpbElyYiA9IGludGVsX3JlbmRlcmJ1ZmZlcihzdGVuY2lsUmIpOworICAgICAgaWYgKHN0ZW5jaWxJcmIpIHsKKyAgICAgICAgIC8qIG5lZWQgdG8gZXh0cmFjdCBzdGVuY2lsIHZhbHVlcyBmcm9tIHRoZSBkZXB0aCBidWZmZXIgKi8KKwkgQVNTRVJUKHN0ZW5jaWxJcmItPlBhaXJlZERlcHRoID09IHJiLT5OYW1lKTsKKwkgaW50ZWxfcmVuZGVyYnVmZmVyX21hcChpbnRlbCwgcmIpOworCSBpbnRlbF9yZW5kZXJidWZmZXJfbWFwKGludGVsLCBzdGVuY2lsUmIpOworCSBfbWVzYV9leHRyYWN0X3N0ZW5jaWwoY3R4LCByYiwgc3RlbmNpbFJiKTsKKwkgaW50ZWxfcmVuZGVyYnVmZmVyX3VubWFwKGludGVsLCBzdGVuY2lsUmIpOworCSBpbnRlbF9yZW5kZXJidWZmZXJfdW5tYXAoaW50ZWwsIHJiKTsKKyAgICAgICAgIHN0ZW5jaWxJcmItPlBhaXJlZERlcHRoID0gMDsKKyAgICAgIH0KKyAgICAgIGlyYi0+UGFpcmVkU3RlbmNpbCA9IDA7CisgICB9CisgICBlbHNlIGlmIChpcmItPlBhaXJlZERlcHRoKSB7CisgICAgICAvKiBpcmIgaXMgYSBzdGVuY2lsIGJ1ZmZlciAqLworICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqZGVwdGhSYjsKKyAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmRlcHRoSXJiOworCisgICAgICBBU1NFUlQocmItPl9BY3R1YWxGb3JtYXQgPT0gR0xfU1RFTkNJTF9JTkRFWDhfRVhUIHx8CisgICAgICAgICAgICAgcmItPl9BY3R1YWxGb3JtYXQgPT0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQpOworCisgICAgICBkZXB0aFJiID0gX21lc2FfbG9va3VwX3JlbmRlcmJ1ZmZlcihjdHgsIGlyYi0+UGFpcmVkRGVwdGgpOworICAgICAgZGVwdGhJcmIgPSBpbnRlbF9yZW5kZXJidWZmZXIoZGVwdGhSYik7CisgICAgICBpZiAoZGVwdGhJcmIpIHsKKyAgICAgICAgIC8qIG5lZWQgdG8gZXh0cmFjdCBzdGVuY2lsIHZhbHVlcyBmcm9tIHRoZSBkZXB0aCBidWZmZXIgKi8KKwkgQVNTRVJUKGRlcHRoSXJiLT5QYWlyZWRTdGVuY2lsID09IHJiLT5OYW1lKTsKKwkgaW50ZWxfcmVuZGVyYnVmZmVyX21hcChpbnRlbCwgcmIpOworCSBpbnRlbF9yZW5kZXJidWZmZXJfbWFwKGludGVsLCBkZXB0aFJiKTsKKwkgX21lc2FfZXh0cmFjdF9zdGVuY2lsKGN0eCwgZGVwdGhSYiwgcmIpOworCSBpbnRlbF9yZW5kZXJidWZmZXJfdW5tYXAoaW50ZWwsIGRlcHRoUmIpOworCSBpbnRlbF9yZW5kZXJidWZmZXJfdW5tYXAoaW50ZWwsIHJiKTsKKyAgICAgICAgIGRlcHRoSXJiLT5QYWlyZWRTdGVuY2lsID0gMDsKKyAgICAgIH0KKyAgICAgIGlyYi0+UGFpcmVkRGVwdGggPSAwOworICAgfQorICAgZWxzZSB7CisgICAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIlByb2JsZW0gaW4gdW5kb19kZXB0aF9zdGVuY2lsX3BhaXJpbmciKTsKKyAgIH0KKworICAgQVNTRVJUKGlyYi0+UGFpcmVkU3RlbmNpbCA9PSAwKTsKKyAgIEFTU0VSVChpcmItPlBhaXJlZERlcHRoID09IDApOworfQorCisKKy8qKgorICogRXhhbWluZSB0aGUgZGVwdGggYW5kIHN0ZW5jaWwgcmVuZGVyYnVmZmVycyB3aGljaCBhcmUgYXR0YWNoZWQgdG8gdGhlCisgKiBmcmFtZWJ1ZmZlci4gIElmIGJvdGggZGVwdGggYW5kIHN0ZW5jaWwgYXJlIGF0dGFjaGVkLCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAqIHJlbmRlcmJ1ZmZlcnMgYXJlICdwYWlyZWQnIChjb21iaW5lZCkuICBJZiBvbmx5IGRlcHRoIG9yIG9ubHkgc3RlbmNpbCBpcworICogYXR0YWNoZWQsIHVuZG8gYW55IHByZXZpb3VzIHBhaXJpbmcuCisgKgorICogTXVzdCBiZSBjYWxsZWQgaWYgTmV3U3RhdGUgJiBfTkVXX0JVRkZFUiAod2hlbiByZW5kZXJidWZmZXIgYXR0YWNobWVudHMKKyAqIGNoYW5nZSwgZm9yIGV4YW1wbGUpLgorICovCit2b2lkCitpbnRlbF92YWxpZGF0ZV9wYWlyZWRfZGVwdGhfc3RlbmNpbChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqZGVwdGhSYiwgKnN0ZW5jaWxSYjsKKworICAgZGVwdGhSYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9ERVBUSCk7CisgICBzdGVuY2lsUmIgPSBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKGZiLCBCVUZGRVJfU1RFTkNJTCk7CisKKyAgIGlmIChkZXB0aFJiICYmIHN0ZW5jaWxSYikgeworICAgICAgaWYgKGRlcHRoUmIgPT0gc3RlbmNpbFJiKSB7CisgICAgICAgICAvKiBVc2luZyBhIHVzZXItY3JlYXRlZCBjb21iaW5lZCBkZXB0aC9zdGVuY2lsIGJ1ZmZlci4KKyAgICAgICAgICAqIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgKi8KKyAgICAgICAgIEFTU0VSVChkZXB0aFJiLT5CYXNlLl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX1NURU5DSUxfRVhUKTsKKyAgICAgICAgIEFTU0VSVChkZXB0aFJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPT0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAvKiBTZXBhcmF0ZSBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMsIG5lZWQgdG8gaW50ZXJsZWF2ZSBub3cgKi8KKyAgICAgICAgIEFTU0VSVChkZXB0aFJiLT5CYXNlLl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCk7CisgICAgICAgICBBU1NFUlQoc3RlbmNpbFJiLT5CYXNlLl9CYXNlRm9ybWF0ID09IEdMX1NURU5DSUxfSU5ERVgpOworICAgICAgICAgLyogbWF5IG5lZWQgdG8gaW50ZXJsZWF2ZSBkZXB0aC9zdGVuY2lsIG5vdyAqLworICAgICAgICAgaWYgKGRlcHRoUmItPlBhaXJlZFN0ZW5jaWwgPT0gc3RlbmNpbFJiLT5CYXNlLk5hbWUpIHsKKyAgICAgICAgICAgIC8qIE9LLCB0aGUgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVycyBhcmUgYWxyZWFkeSBpbnRlcmxlYXZlZCAqLworICAgICAgICAgICAgQVNTRVJUKHN0ZW5jaWxSYi0+UGFpcmVkRGVwdGggPT0gZGVwdGhSYi0+QmFzZS5OYW1lKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbmVlZCB0byBzZXR1cCBuZXcgcGFpcmluZy9pbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgICAgIGlmIChkZXB0aFJiLT5QYWlyZWRTdGVuY2lsKSB7CisgICAgICAgICAgICAgICBpbnRlbF91bnBhaXJfZGVwdGhfc3RlbmNpbChjdHgsIGRlcHRoUmIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZW5jaWxSYi0+UGFpcmVkRGVwdGgpIHsKKyAgICAgICAgICAgICAgIGludGVsX3VucGFpcl9kZXB0aF9zdGVuY2lsKGN0eCwgc3RlbmNpbFJiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVNTRVJUKGRlcHRoUmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9PSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCk7CisgICAgICAgICAgICBBU1NFUlQoc3RlbmNpbFJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPT0gR0xfU1RFTkNJTF9JTkRFWDhfRVhUIHx8CisgICAgICAgICAgICAgICAgICAgc3RlbmNpbFJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPT0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQpOworCisgICAgICAgICAgICAvKiBlc3RhYmxpc2ggbmV3IHBhaXJpbmc6IGludGVybGVhdmUgc3RlbmNpbCBpbnRvIGRlcHRoIGJ1ZmZlciAqLworCSAgICBpbnRlbF9yZW5kZXJidWZmZXJfbWFwKGludGVsLCAmZGVwdGhSYi0+QmFzZSk7CisJICAgIGludGVsX3JlbmRlcmJ1ZmZlcl9tYXAoaW50ZWwsICZzdGVuY2lsUmItPkJhc2UpOworICAgICAgICAgICAgX21lc2FfaW5zZXJ0X3N0ZW5jaWwoY3R4LCAmZGVwdGhSYi0+QmFzZSwgJnN0ZW5jaWxSYi0+QmFzZSk7CisJICAgIGludGVsX3JlbmRlcmJ1ZmZlcl91bm1hcChpbnRlbCwgJnN0ZW5jaWxSYi0+QmFzZSk7CisJICAgIGludGVsX3JlbmRlcmJ1ZmZlcl91bm1hcChpbnRlbCwgJmRlcHRoUmItPkJhc2UpOworICAgICAgICAgICAgZGVwdGhSYi0+UGFpcmVkU3RlbmNpbCA9IHN0ZW5jaWxSYi0+QmFzZS5OYW1lOworICAgICAgICAgICAgc3RlbmNpbFJiLT5QYWlyZWREZXB0aCA9IGRlcHRoUmItPkJhc2UuTmFtZTsKKyAgICAgICAgIH0KKworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAoZGVwdGhSYikgeworICAgICAgLyogRGVwdGggYnVmZmVyIGJ1dCBubyBzdGVuY2lsIGJ1ZmZlci4KKyAgICAgICAqIFdlJ2xsIHVzZSBhIEdMX0RFUFRIMjRfU1RFTkNJTDggYnVmZmVyIGFuZCBpZ25vcmUgdGhlIHN0ZW5jaWwgYml0cy4KKyAgICAgICAqLworICAgICAgLyogY2FuJ3QgYXNzZXJ0IHRoaXMgdW50aWwgc3RvcmFnZSBpcyBhbGxvY2F0ZWQ6CisgICAgICAgICBBU1NFUlQoZGVwdGhSYi0+QmFzZS5fQWN0dWFsRm9ybWF0ID09IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUKTsKKyAgICAgICAqLworICAgICAgLyogaW50ZWxfdW5kbyBhbnkgcHJldmlvdXMgcGFpcmluZyAqLworICAgICAgaWYgKGRlcHRoUmItPlBhaXJlZFN0ZW5jaWwpIHsKKyAgICAgICAgIGludGVsX3VucGFpcl9kZXB0aF9zdGVuY2lsKGN0eCwgZGVwdGhSYik7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChzdGVuY2lsUmIpIHsKKyAgICAgIC8qIFN0ZW5jaWwgYnVmZmVyIGJ1dCBubyBkZXB0aCBidWZmZXIuCisgICAgICAgKiBTaW5jZSBoL3cgZG9lc24ndCB0eXBpY2FsbHkgc3VwcG9ydCBqdXN0IDhicHAgc3RlbmNpbCB3L291dCBaLAorICAgICAgICogd2UnbGwgdXNlIGEgR0xfREVQVEgyNF9TVEVOQ0lMOCBidWZmZXIgYW5kIGlnbm9yZSB0aGUgZGVwdGggYml0cy4KKyAgICAgICAqLworICAgICAgLyogdW5kbyBhbnkgcHJldmlvdXMgcGFpcmluZyAqLworICAgICAgaWYgKHN0ZW5jaWxSYi0+UGFpcmVkRGVwdGgpIHsKKyAgICAgICAgIGludGVsX3VucGFpcl9kZXB0aF9zdGVuY2lsKGN0eCwgc3RlbmNpbFJiKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdGVuY2lsUmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9PSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQpIHsKKyAgICAgICAgIC8qIHByb21vdGUgYnVmZmVyIHRvIEdMX0RFUFRIMjRfU1RFTkNJTDggZm9yIGh3IHJlbmRlcmluZyAqLworICAgICAgICAgX21lc2FfcHJvbW90ZV9zdGVuY2lsKGN0eCwgJnN0ZW5jaWxSYi0+QmFzZSk7CisgICAgICAgICBBU1NFUlQoc3RlbmNpbFJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPT0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQpOworICAgICAgfQorICAgfQorCisgICAvKiBGaW5hbGx5LCB1cGRhdGUgdGhlIGZiLT5fRGVwdGhCdWZmZXIgYW5kIGZiLT5fU3RlbmNpbEJ1ZmZlciBmaWVsZHMgKi8KKyAgIF9tZXNhX3VwZGF0ZV9kZXB0aF9idWZmZXIoY3R4LCBmYiwgQlVGRkVSX0RFUFRIKTsKKyAgIGlmIChkZXB0aFJiICYmIGRlcHRoUmItPlBhaXJlZFN0ZW5jaWwpCisgICAgICBfbWVzYV91cGRhdGVfc3RlbmNpbF9idWZmZXIoY3R4LCBmYiwgQlVGRkVSX0RFUFRIKTsKKyAgIGVsc2UKKyAgICAgIF9tZXNhX3VwZGF0ZV9zdGVuY2lsX2J1ZmZlcihjdHgsIGZiLCBCVUZGRVJfU1RFTkNJTCk7CisKKworICAgLyogVGhlIGhhcmR3YXJlIHNob3VsZCB1c2UgZmItPkF0dGFjaG1lbnRbQlVGRkVSX0RFUFRIXS5SZW5kZXJidWZmZXIKKyAgICAqIGZpcnN0LCBpZiBwcmVzZW50LCB0aGVuIGZiLT5BdHRhY2htZW50W0JVRkZFUl9TVEVOQ0lMXS5SZW5kZXJidWZmZXIKKyAgICAqIGlmIHByZXNlbnQuCisgICAgKi8KK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2RlcHRoc3RlbmNpbC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZGVwdGhzdGVuY2lsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZWIwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2RlcHRoc3RlbmNpbC5oCkBAIC0wLDAgKzEsMTUgQEAKKworI2lmbmRlZiBJTlRFTF9ERVBUSF9TVEVOQ0lMX0gKKyNkZWZpbmUgSU5URUxfREVQVEhfU1RFTkNJTF9ICisKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKKworZXh0ZXJuIHZvaWQKK2ludGVsX3VucGFpcl9kZXB0aF9zdGVuY2lsKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiKTsKKworZXh0ZXJuIHZvaWQKK2ludGVsX3ZhbGlkYXRlX3BhaXJlZF9kZXB0aF9zdGVuY2lsKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIpOworCisKKyNlbmRpZiAvKiBJTlRFTF9ERVBUSF9TVEVOQ0lMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2Ziby5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZmJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMmViZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2Ziby5jCkBAIC0wLDAgKzEsNzA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAiZmJvYmplY3QuaCIKKyNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgInJlbmRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKKyNpbmNsdWRlICJ0ZXhyZW5kZXIuaCIKKworI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJzLmgiCisjaW5jbHVkZSAiaW50ZWxfZGVwdGhzdGVuY2lsLmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfc3Bhbi5oIgorCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX0ZCTworCisjZGVmaW5lIElOVEVMX1JCX0NMQVNTIDB4MTIzNDU2NzgKKworCisvKiBYWFggRkJPOiBtb3ZlIHRoaXMgdG8gaW50ZWxfY29udGV4dC5oIChpbmxpbmVkKSAqLworLyoqCisgKiBSZXR1cm4gYSBnbF9yZW5kZXJidWZmZXIgcHRyIGNhc3RlZCB0byBpbnRlbF9yZW5kZXJidWZmZXIuCisgKiBOVUxMIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHJiIGlzbid0IHJlYWxseSBhbiBpbnRlbF9yZW5kZXJidWZmZXIuCisgKiBUaGlzIGlzIGRldGVybWllbmQgYnkgY2hlY2tpbmcgdGhlIENsYXNzSUQuCisgKi8KK3N0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKgoraW50ZWxfcmVuZGVyYnVmZmVyKHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQoreworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiID0gKHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKikgcmI7CisgICBpZiAoaXJiICYmIGlyYi0+QmFzZS5DbGFzc0lEID09IElOVEVMX1JCX0NMQVNTKSB7CisgICAgICAvKl9tZXNhX3dhcm5pbmcoTlVMTCwgIlJldHVybmluZyBub24taW50ZWwgUmJcbiIpOyovCisgICAgICByZXR1cm4gaXJiOworICAgfQorICAgZWxzZQorICAgICAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqCitpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsIGludCBhdHRJbmRleCkKK3sKKyAgIGlmIChhdHRJbmRleCA+PSAwKQorICAgICAgcmV0dXJuIGludGVsX3JlbmRlcmJ1ZmZlcihmYi0+QXR0YWNobWVudFthdHRJbmRleF0uUmVuZGVyYnVmZmVyKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQKK2ludGVsX2ZsaXBfcmVuZGVyYnVmZmVycyhzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiKQoreworICAgaW50IGN1cnJlbnRfcGFnZSA9IGludGVsX2ZiLT5wZl9jdXJyZW50X3BhZ2U7CisgICBpbnQgbmV4dF9wYWdlID0gKGN1cnJlbnRfcGFnZSArIDEpICUgaW50ZWxfZmItPnBmX251bV9wYWdlczsKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnRtcF9yYjsKKworICAgLyogRXhjaGFuZ2UgcmVuZGVyYnVmZmVycyBpZiBuZWNlc3NhcnkgYnV0IG1ha2Ugc3VyZSB0aGVpciByZWZlcmVuY2UgY291bnRzCisgICAgKiBhcmUgcHJlc2VydmVkLgorICAgICovCisgICBpZiAoaW50ZWxfZmItPmNvbG9yX3JiW2N1cnJlbnRfcGFnZV0gJiYKKyAgICAgICBpbnRlbF9mYi0+QmFzZS5BdHRhY2htZW50W0JVRkZFUl9GUk9OVF9MRUZUXS5SZW5kZXJidWZmZXIgIT0KKyAgICAgICAmaW50ZWxfZmItPmNvbG9yX3JiW2N1cnJlbnRfcGFnZV0tPkJhc2UpIHsKKyAgICAgIHRtcF9yYiA9IE5VTEw7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfcmVuZGVyYnVmZmVyKCZ0bXBfcmIsCisJIGludGVsX2ZiLT5CYXNlLkF0dGFjaG1lbnRbQlVGRkVSX0ZST05UX0xFRlRdLlJlbmRlcmJ1ZmZlcik7CisgICAgICB0bXBfcmIgPSAmaW50ZWxfZmItPmNvbG9yX3JiW2N1cnJlbnRfcGFnZV0tPkJhc2U7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfcmVuZGVyYnVmZmVyKAorCSAmaW50ZWxfZmItPkJhc2UuQXR0YWNobWVudFtCVUZGRVJfRlJPTlRfTEVGVF0uUmVuZGVyYnVmZmVyLCB0bXBfcmIpOworICAgICAgX21lc2FfcmVmZXJlbmNlX3JlbmRlcmJ1ZmZlcigmdG1wX3JiLCBOVUxMKTsKKyAgIH0KKworICAgaWYgKGludGVsX2ZiLT5jb2xvcl9yYltuZXh0X3BhZ2VdICYmCisgICAgICAgaW50ZWxfZmItPkJhc2UuQXR0YWNobWVudFtCVUZGRVJfQkFDS19MRUZUXS5SZW5kZXJidWZmZXIgIT0KKyAgICAgICAmaW50ZWxfZmItPmNvbG9yX3JiW25leHRfcGFnZV0tPkJhc2UpIHsKKyAgICAgIHRtcF9yYiA9IE5VTEw7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfcmVuZGVyYnVmZmVyKCZ0bXBfcmIsCisJIGludGVsX2ZiLT5CYXNlLkF0dGFjaG1lbnRbQlVGRkVSX0JBQ0tfTEVGVF0uUmVuZGVyYnVmZmVyKTsKKyAgICAgIHRtcF9yYiA9ICZpbnRlbF9mYi0+Y29sb3JfcmJbbmV4dF9wYWdlXS0+QmFzZTsKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV9yZW5kZXJidWZmZXIoCisJICZpbnRlbF9mYi0+QmFzZS5BdHRhY2htZW50W0JVRkZFUl9CQUNLX0xFRlRdLlJlbmRlcmJ1ZmZlciwgdG1wX3JiKTsKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV9yZW5kZXJidWZmZXIoJnRtcF9yYiwgTlVMTCk7CisgICB9Cit9CisKKworc3RydWN0IGludGVsX3JlZ2lvbiAqCitpbnRlbF9nZXRfcmJfcmVnaW9uKHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsIEdMdWludCBhdHRJbmRleCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIGF0dEluZGV4KTsKKworICAgaWYgKGlyYikKKyAgICAgIHJldHVybiBpcmItPnJlZ2lvbjsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZnJhbWVidWZmZXIgb2JqZWN0LgorICovCitzdGF0aWMgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICoKK2ludGVsX25ld19mcmFtZWJ1ZmZlcihHTGNvbnRleHQgKiBjdHgsIEdMdWludCBuYW1lKQoreworICAgLyogT25seSBkcmF3YWJsZSBzdGF0ZSBpbiBpbnRlbF9mcmFtZWJ1ZmZlciBhdCB0aGlzIHRpbWUsIGp1c3QgdXNlIE1lc2EncworICAgICogY2xhc3MKKyAgICAqLworICAgcmV0dXJuIF9tZXNhX25ld19mcmFtZWJ1ZmZlcihjdHgsIG5hbWUpOworfQorCisKK3N0YXRpYyB2b2lkCitpbnRlbF9kZWxldGVfcmVuZGVyYnVmZmVyKHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQoreworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiID0gaW50ZWxfcmVuZGVyYnVmZmVyKHJiKTsKKworICAgQVNTRVJUKGlyYik7CisKKyAgIGlmIChpcmItPlBhaXJlZFN0ZW5jaWwgfHwgaXJiLT5QYWlyZWREZXB0aCkgeworICAgICAgaW50ZWxfdW5wYWlyX2RlcHRoX3N0ZW5jaWwoY3R4LCBpcmIpOworICAgfQorCisgICBpZiAoaXJiLT5zcGFuX2NhY2hlICE9IE5VTEwpCisgICAgICBfbWVzYV9mcmVlKGlyYi0+c3Bhbl9jYWNoZSk7CisKKyAgIGlmIChpbnRlbCAmJiBpcmItPnJlZ2lvbikgeworICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJmlyYi0+cmVnaW9uKTsKKyAgIH0KKworICAgX21lc2FfZnJlZShpcmIpOworfQorCisKKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3BlY2lmaWMgcGl4ZWwgaW4gYSByZW5kZXJidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkICoKK2ludGVsX2dldF9wb2ludGVyKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5KQoreworICAgLyogQnkgcmV0dXJuaW5nIE5VTEwgd2UgZm9yY2UgYWxsIHNvZnR3YXJlIHJlbmRlcmluZyB0byBnbyB0aHJvdWdoCisgICAgKiB0aGUgc3BhbiByb3V0aW5lcy4KKyAgICAqLworICAgcmV0dXJuIE5VTEw7Cit9CisKKworCisvKioKKyAqIENhbGxlZCB2aWEgZ2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKCkgdG8gc2V0IHRoZSBmb3JtYXQgYW5kIGFsbG9jYXRlCisgKiBzdG9yYWdlIGZvciBhIHVzZXItY3JlYXRlZCByZW5kZXJidWZmZXIuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX2FsbG9jX3JlbmRlcmJ1ZmZlcl9zdG9yYWdlKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIgPSBpbnRlbF9yZW5kZXJidWZmZXIocmIpOworICAgR0xib29sZWFuIHNvZnR3YXJlQnVmZmVyID0gR0xfRkFMU0U7CisgICBpbnQgY3BwOworCisgICBBU1NFUlQocmItPk5hbWUgIT0gMCk7CisKKyAgIHN3aXRjaCAoaW50ZXJuYWxGb3JtYXQpIHsKKyAgIGNhc2UgR0xfUjNfRzNfQjI6CisgICBjYXNlIEdMX1JHQjQ6CisgICBjYXNlIEdMX1JHQjU6CisgICAgICByYi0+X0FjdHVhbEZvcm1hdCA9IEdMX1JHQjU7CisgICAgICByYi0+RGF0YVR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgcmItPlJlZEJpdHMgPSA1OworICAgICAgcmItPkdyZWVuQml0cyA9IDY7CisgICAgICByYi0+Qmx1ZUJpdHMgPSA1OworICAgICAgY3BwID0gMjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9SR0I6CisgICBjYXNlIEdMX1JHQjg6CisgICBjYXNlIEdMX1JHQjEwOgorICAgY2FzZSBHTF9SR0IxMjoKKyAgIGNhc2UgR0xfUkdCMTY6CisgICAgICByYi0+X0FjdHVhbEZvcm1hdCA9IEdMX1JHQjg7CisgICAgICByYi0+RGF0YVR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgcmItPlJlZEJpdHMgPSA4OworICAgICAgcmItPkdyZWVuQml0cyA9IDg7CisgICAgICByYi0+Qmx1ZUJpdHMgPSA4OworICAgICAgcmItPkFscGhhQml0cyA9IDA7CisgICAgICBjcHAgPSA0OworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1JHQkE6CisgICBjYXNlIEdMX1JHQkEyOgorICAgY2FzZSBHTF9SR0JBNDoKKyAgIGNhc2UgR0xfUkdCNV9BMToKKyAgIGNhc2UgR0xfUkdCQTg6CisgICBjYXNlIEdMX1JHQjEwX0EyOgorICAgY2FzZSBHTF9SR0JBMTI6CisgICBjYXNlIEdMX1JHQkExNjoKKyAgICAgIHJiLT5fQWN0dWFsRm9ybWF0ID0gR0xfUkdCQTg7CisgICAgICByYi0+RGF0YVR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgcmItPlJlZEJpdHMgPSA4OworICAgICAgcmItPkdyZWVuQml0cyA9IDg7CisgICAgICByYi0+Qmx1ZUJpdHMgPSA4OworICAgICAgcmItPkFscGhhQml0cyA9IDg7CisgICAgICBjcHAgPSA0OworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1NURU5DSUxfSU5ERVg6CisgICBjYXNlIEdMX1NURU5DSUxfSU5ERVgxX0VYVDoKKyAgIGNhc2UgR0xfU1RFTkNJTF9JTkRFWDRfRVhUOgorICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQ6CisgICBjYXNlIEdMX1NURU5DSUxfSU5ERVgxNl9FWFQ6CisgICAgICAvKiBhbGxvYyBhIGRlcHRoK3N0ZW5jaWwgYnVmZmVyICovCisgICAgICByYi0+X0FjdHVhbEZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOworICAgICAgcmItPkRhdGFUeXBlID0gR0xfVU5TSUdORURfSU5UXzI0XzhfRVhUOworICAgICAgcmItPlN0ZW5jaWxCaXRzID0gODsKKyAgICAgIGNwcCA9IDQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTY6CisgICAgICByYi0+X0FjdHVhbEZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDE2OworICAgICAgcmItPkRhdGFUeXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgICByYi0+RGVwdGhCaXRzID0gMTY7CisgICAgICBjcHAgPSAyOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDoKKyAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMjQ6CisgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyOgorICAgICAgcmItPl9BY3R1YWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKKyAgICAgIHJiLT5EYXRhVHlwZSA9IEdMX1VOU0lHTkVEX0lOVF8yNF84X0VYVDsKKyAgICAgIHJiLT5EZXB0aEJpdHMgPSAyNDsKKyAgICAgIGNwcCA9IDQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfREVQVEhfU1RFTkNJTF9FWFQ6CisgICBjYXNlIEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOgorICAgICAgcmItPl9BY3R1YWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKKyAgICAgIHJiLT5EYXRhVHlwZSA9IEdMX1VOU0lHTkVEX0lOVF8yNF84X0VYVDsKKyAgICAgIHJiLT5EZXB0aEJpdHMgPSAyNDsKKyAgICAgIHJiLT5TdGVuY2lsQml0cyA9IDg7CisgICAgICBjcHAgPSA0OworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShjdHgsCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGZvcm1hdCBpbiBpbnRlbF9hbGxvY19yZW5kZXJidWZmZXJfc3RvcmFnZSIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpbnRlbEZsdXNoKGN0eCk7CisKKyAgIC8qIGZyZWUgb2xkIHJlZ2lvbiAqLworICAgaWYgKGlyYi0+cmVnaW9uKSB7CisgICAgICBpbnRlbF9yZWdpb25fcmVsZWFzZSgmaXJiLT5yZWdpb24pOworICAgfQorCisgICAvKiBhbGxvY2F0ZSBuZXcgbWVtb3J5IHJlZ2lvbi9yZW5kZXJidWZmZXIgKi8KKyAgIGlmIChzb2Z0d2FyZUJ1ZmZlcikgeworICAgICAgcmV0dXJuIF9tZXNhX3NvZnRfcmVuZGVyYnVmZmVyX3N0b3JhZ2UoY3R4LCByYiwgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogQ2hvb3NlIGEgcGl0Y2ggdG8gbWF0Y2ggaGFyZHdhcmUgcmVxdWlyZW1lbnRzOgorICAgICAgICovCisgICAgICBHTHVpbnQgcGl0Y2ggPSAoKGNwcCAqIHdpZHRoICsgNjMpICYgfjYzKSAvIGNwcDsKKworICAgICAgLyogYWxsb2MgaGFyZHdhcmUgcmVuZGVyYnVmZmVyICovCisgICAgICBEQkcoIkFsbG9jYXRpbmcgJWQgeCAlZCBJbnRlbCBSQk8gKHBpdGNoICVkKVxuIiwgd2lkdGgsCisJICBoZWlnaHQsIHBpdGNoKTsKKworICAgICAgaXJiLT5yZWdpb24gPSBpbnRlbF9yZWdpb25fYWxsb2MoaW50ZWwsIGNwcCwgcGl0Y2gsIGhlaWdodCk7CisgICAgICBpZiAoIWlyYi0+cmVnaW9uKQorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOyAgICAgICAvKiBvdXQgb2YgbWVtb3J5PyAqLworCisgICAgICBBU1NFUlQoaXJiLT5yZWdpb24tPmJ1ZmZlcik7CisKKyAgICAgIHJiLT5XaWR0aCA9IHdpZHRoOworICAgICAgcmItPkhlaWdodCA9IGhlaWdodDsKKworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9Cit9CisKKworCisvKioKKyAqIENhbGxlZCBmb3IgZWFjaCBoYXJkd2FyZSByZW5kZXJidWZmZXIgd2hlbiBhIF93aW5kb3dfIGlzIHJlc2l6ZWQuCisgKiBKdXN0IHVwZGF0ZSBmaWVsZHMuCisgKiBOb3QgdXNlZCBmb3IgdXNlci1jcmVhdGVkIHJlbmRlcmJ1ZmZlcnMhCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX2FsbG9jX3dpbmRvd19zdG9yYWdlKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCkKK3sKKyAgIEFTU0VSVChyYi0+TmFtZSA9PSAwKTsKKyAgIHJiLT5XaWR0aCA9IHdpZHRoOworICAgcmItPkhlaWdodCA9IGhlaWdodDsKKyAgIHJiLT5fQWN0dWFsRm9ybWF0ID0gaW50ZXJuYWxGb3JtYXQ7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgdm9pZAoraW50ZWxfcmVzaXplX2J1ZmZlcnMoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsCisJCSAgICAgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KQoreworICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IChzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIqKWZiOworICAgaW50IGk7CisKKyAgIF9tZXNhX3Jlc2l6ZV9mcmFtZWJ1ZmZlcihjdHgsIGZiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgZmItPkluaXRpYWxpemVkID0gR0xfVFJVRTsgLyogWFhYIHJlbW92ZSBzb21lZGF5ICovCisKKyAgIGlmIChmYi0+TmFtZSAhPSAwKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIE1ha2Ugc3VyZSBhbGwgd2luZG93IHN5c3RlbSByZW5kZXJidWZmZXJzIGFyZSB1cCB0byBkYXRlICovCisgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiA9ICZpbnRlbF9mYi0+Y29sb3JfcmJbaV0tPkJhc2U7CisKKyAgICAgIC8qIG9ubHkgcmVzaXplIGlmIHNpemUgaXMgY2hhbmdpbmcgKi8KKyAgICAgIGlmIChyYiAmJiAocmItPldpZHRoICE9IHdpZHRoIHx8IHJiLT5IZWlnaHQgIT0gaGVpZ2h0KSkgeworCSByYi0+QWxsb2NTdG9yYWdlKGN0eCwgcmIsIHJiLT5JbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX25vcF9hbGxvY19zdG9yYWdlKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCkKK3sKKyAgIF9tZXNhX3Byb2JsZW0oY3R4LCAiaW50ZWxfb3BfYWxsb2Nfc3RvcmFnZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiIpOworICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCisKK3ZvaWQKK2ludGVsX3JlbmRlcmJ1ZmZlcl9zZXRfcmVnaW9uKHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiLAorCQkJICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uKQoreworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqb2xkOworCisgICBvbGQgPSByYi0+cmVnaW9uOworICAgcmItPnJlZ2lvbiA9IE5VTEw7CisgICBpbnRlbF9yZWdpb25fcmVmZXJlbmNlKCZyYi0+cmVnaW9uLCByZWdpb24pOworICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJm9sZCk7CisKKyAgIHJiLT5wZlBpdGNoID0gcmVnaW9uLT5waXRjaDsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW50ZWxfcmVuZGVyYnVmZmVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG9uLXNjcmVlbiB3aW5kb3csCisgKiBub3QgYSB1c2VyLWNyZWF0ZWQgcmVuZGVyYnVmZmVyLgorICovCitzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICoKK2ludGVsX2NyZWF0ZV9yZW5kZXJidWZmZXIoR0xlbnVtIGludEZvcm1hdCkKK3sKKyAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiOworICAgY29uc3QgR0x1aW50IG5hbWUgPSAwOworCisgICBpcmIgPSBDQUxMT0NfU1RSVUNUKGludGVsX3JlbmRlcmJ1ZmZlcik7CisgICBpZiAoIWlyYikgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLCAiY3JlYXRpbmcgcmVuZGVyYnVmZmVyIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgX21lc2FfaW5pdF9yZW5kZXJidWZmZXIoJmlyYi0+QmFzZSwgbmFtZSk7CisgICBpcmItPkJhc2UuQ2xhc3NJRCA9IElOVEVMX1JCX0NMQVNTOworCisgICBzd2l0Y2ggKGludEZvcm1hdCkgeworICAgY2FzZSBHTF9SR0I1OgorICAgICAgaXJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPSBHTF9SR0I1OworICAgICAgaXJiLT5CYXNlLl9CYXNlRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgIGlyYi0+QmFzZS5SZWRCaXRzID0gNTsKKyAgICAgIGlyYi0+QmFzZS5HcmVlbkJpdHMgPSA2OworICAgICAgaXJiLT5CYXNlLkJsdWVCaXRzID0gNTsKKyAgICAgIGlyYi0+QmFzZS5EYXRhVHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfUkdCQTg6CisgICAgICBpcmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9IEdMX1JHQkE4OworICAgICAgaXJiLT5CYXNlLl9CYXNlRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgIGlyYi0+QmFzZS5SZWRCaXRzID0gODsKKyAgICAgIGlyYi0+QmFzZS5HcmVlbkJpdHMgPSA4OworICAgICAgaXJiLT5CYXNlLkJsdWVCaXRzID0gODsKKyAgICAgIGlyYi0+QmFzZS5BbHBoYUJpdHMgPSA4OworICAgICAgaXJiLT5CYXNlLkRhdGFUeXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQ6CisgICAgICBpcmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9IEdMX1NURU5DSUxfSU5ERVg4X0VYVDsKKyAgICAgIGlyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX1NURU5DSUxfSU5ERVg7CisgICAgICBpcmItPkJhc2UuU3RlbmNpbEJpdHMgPSA4OworICAgICAgaXJiLT5CYXNlLkRhdGFUeXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKKyAgICAgIGlyYi0+QmFzZS5fQWN0dWFsRm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UMTY7CisgICAgICBpcmItPkJhc2UuX0Jhc2VGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7CisgICAgICBpcmItPkJhc2UuRGVwdGhCaXRzID0gMTY7CisgICAgICBpcmItPkJhc2UuRGF0YVR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQyNDoKKyAgICAgIGlyYi0+QmFzZS5fQWN0dWFsRm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAgICBpcmItPkJhc2UuX0Jhc2VGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7CisgICAgICBpcmItPkJhc2UuRGVwdGhCaXRzID0gMjQ7CisgICAgICBpcmItPkJhc2UuRGF0YVR5cGUgPSBHTF9VTlNJR05FRF9JTlQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ6CisgICAgICBpcmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOworICAgICAgaXJiLT5CYXNlLl9CYXNlRm9ybWF0ID0gR0xfREVQVEhfU1RFTkNJTF9FWFQ7CisgICAgICBpcmItPkJhc2UuRGVwdGhCaXRzID0gMjQ7CisgICAgICBpcmItPkJhc2UuU3RlbmNpbEJpdHMgPSA4OworICAgICAgaXJiLT5CYXNlLkRhdGFUeXBlID0gR0xfVU5TSUdORURfSU5UXzI0XzhfRVhUOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBpbnRGb3JtYXQgaW4gaW50ZWxfY3JlYXRlX3JlbmRlcmJ1ZmZlciIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9IGludEZvcm1hdDsKKworICAgLyogaW50ZWwtc3BlY2lmaWMgbWV0aG9kcyAqLworICAgaXJiLT5CYXNlLkRlbGV0ZSA9IGludGVsX2RlbGV0ZV9yZW5kZXJidWZmZXI7CisgICBpcmItPkJhc2UuQWxsb2NTdG9yYWdlID0gaW50ZWxfYWxsb2Nfd2luZG93X3N0b3JhZ2U7CisgICBpcmItPkJhc2UuR2V0UG9pbnRlciA9IGludGVsX2dldF9wb2ludGVyOworCisgICByZXR1cm4gaXJiOworfQorCisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHJlbmRlcmJ1ZmZlciBvYmplY3QuCisgKiBUeXBpY2FsbHkgY2FsbGVkIHZpYSBnbEJpbmRSZW5kZXJidWZmZXJFWFQoKS4KKyAqLworc3RhdGljIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKgoraW50ZWxfbmV3X3JlbmRlcmJ1ZmZlcihHTGNvbnRleHQgKiBjdHgsIEdMdWludCBuYW1lKQoreworICAgLypzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7ICovCisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmI7CisKKyAgIGlyYiA9IENBTExPQ19TVFJVQ1QoaW50ZWxfcmVuZGVyYnVmZmVyKTsKKyAgIGlmICghaXJiKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJjcmVhdGluZyByZW5kZXJidWZmZXIiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBfbWVzYV9pbml0X3JlbmRlcmJ1ZmZlcigmaXJiLT5CYXNlLCBuYW1lKTsKKyAgIGlyYi0+QmFzZS5DbGFzc0lEID0gSU5URUxfUkJfQ0xBU1M7CisKKyAgIC8qIGludGVsLXNwZWNpZmljIG1ldGhvZHMgKi8KKyAgIGlyYi0+QmFzZS5EZWxldGUgPSBpbnRlbF9kZWxldGVfcmVuZGVyYnVmZmVyOworICAgaXJiLT5CYXNlLkFsbG9jU3RvcmFnZSA9IGludGVsX2FsbG9jX3JlbmRlcmJ1ZmZlcl9zdG9yYWdlOworICAgaXJiLT5CYXNlLkdldFBvaW50ZXIgPSBpbnRlbF9nZXRfcG9pbnRlcjsKKyAgIC8qIHNwYW4gcm91dGluZXMgc2V0IGluIGFsbG9jX3N0b3JhZ2UgZnVuY3Rpb24gKi8KKworICAgcmV0dXJuICZpcmItPkJhc2U7Cit9CisKKworLyoqCisgKiBDYWxsZWQgdmlhIGdsQmluZEZyYW1lYnVmZmVyRVhUKCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9iaW5kX2ZyYW1lYnVmZmVyKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiwgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYnJlYWQpCit7CisgICBpZiAodGFyZ2V0ID09IEdMX0ZSQU1FQlVGRkVSX0VYVCB8fCB0YXJnZXQgPT0gR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQpIHsKKyAgICAgIGludGVsX2RyYXdfYnVmZmVyKGN0eCwgZmIpOworICAgICAgLyogSW50ZWdlciBkZXB0aCByYW5nZSBkZXBlbmRzIG9uIGRlcHRoIGJ1ZmZlciBiaXRzICovCisgICAgICBpZiAoY3R4LT5Ecml2ZXIuRGVwdGhSYW5nZSAhPSBOVUxMKQorCSBjdHgtPkRyaXZlci5EZXB0aFJhbmdlKGN0eCwgY3R4LT5WaWV3cG9ydC5OZWFyLCBjdHgtPlZpZXdwb3J0LkZhcik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgdGFyZ2V0ID09IEdMX1JFQURfRlJBTUVCVUZGRVJfRVhUICovCisgICB9Cit9CisKKworLyoqCisgKiBDYWxsZWQgdmlhIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoKS4KKyAqLworc3RhdGljIHZvaWQKK2ludGVsX2ZyYW1lYnVmZmVyX3JlbmRlcmJ1ZmZlcihHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gYXR0YWNobWVudCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpCit7CisgICBEQkcoIkludGVsIEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyICV1ICV1XG4iLCBmYi0+TmFtZSwgcmIgPyByYi0+TmFtZSA6IDApOworCisgICBpbnRlbEZsdXNoKGN0eCk7CisKKyAgIF9tZXNhX2ZyYW1lYnVmZmVyX3JlbmRlcmJ1ZmZlcihjdHgsIGZiLCBhdHRhY2htZW50LCByYik7CisgICBpbnRlbF9kcmF3X2J1ZmZlcihjdHgsIGZiKTsKK30KKworc3RhdGljIEdMYm9vbGVhbgoraW50ZWxfdXBkYXRlX3dyYXBwZXIoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiwgCisJCSAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgaWYgKHRleEltYWdlLT5UZXhGb3JtYXQgPT0gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4OCkgeworICAgICAgaXJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPSBHTF9SR0JBODsKKyAgICAgIGlyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX1JHQkE7CisgICAgICBEQkcoIlJlbmRlciB0byBSR0JBOCB0ZXh0dXJlIE9LXG4iKTsKKyAgIH0KKyAgIGVsc2UgaWYgKHRleEltYWdlLT5UZXhGb3JtYXQgPT0gJl9tZXNhX3RleGZvcm1hdF9yZ2I1NjUpIHsKKyAgICAgIGlyYi0+QmFzZS5fQWN0dWFsRm9ybWF0ID0gR0xfUkdCNTsKKyAgICAgIGlyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX1JHQjsKKyAgICAgIERCRygiUmVuZGVyIHRvIFJHQjUgdGV4dHVyZSBPS1xuIik7CisgICB9CisgICBlbHNlIGlmICh0ZXhJbWFnZS0+VGV4Rm9ybWF0ID09ICZfbWVzYV90ZXhmb3JtYXRfejE2KSB7CisgICAgICBpcmItPkJhc2UuX0FjdHVhbEZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDE2OworICAgICAgaXJiLT5CYXNlLl9CYXNlRm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgICAgREJHKCJSZW5kZXIgdG8gREVQVEgxNiB0ZXh0dXJlIE9LXG4iKTsKKyAgIH0gZWxzZSBpZiAodGV4SW1hZ2UtPlRleEZvcm1hdCA9PSAmX21lc2FfdGV4Zm9ybWF0X3oyNF9zOCkgeworICAgICAgaXJiLT5CYXNlLl9BY3R1YWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKKyAgICAgIGlyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX0RFUFRIX1NURU5DSUxfRVhUOworICAgICAgREJHKCJSZW5kZXIgdG8gREVQVEhfU1RFTkNJTCB0ZXh0dXJlIE9LXG4iKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgREJHKCJSZW5kZXIgdG8gdGV4dHVyZSBCQUQgRk9STUFUICVkXG4iLAorCSAgdGV4SW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9IGlyYi0+QmFzZS5fQWN0dWFsRm9ybWF0OworICAgaXJiLT5CYXNlLldpZHRoID0gdGV4SW1hZ2UtPldpZHRoOworICAgaXJiLT5CYXNlLkhlaWdodCA9IHRleEltYWdlLT5IZWlnaHQ7CisgICBpcmItPkJhc2UuRGF0YVR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOyAgICAgICAvKiBGQk8gWFhYIGZpeCAqLworICAgaXJiLT5CYXNlLlJlZEJpdHMgPSB0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5SZWRCaXRzOworICAgaXJiLT5CYXNlLkdyZWVuQml0cyA9IHRleEltYWdlLT5UZXhGb3JtYXQtPkdyZWVuQml0czsKKyAgIGlyYi0+QmFzZS5CbHVlQml0cyA9IHRleEltYWdlLT5UZXhGb3JtYXQtPkJsdWVCaXRzOworICAgaXJiLT5CYXNlLkFscGhhQml0cyA9IHRleEltYWdlLT5UZXhGb3JtYXQtPkFscGhhQml0czsKKyAgIGlyYi0+QmFzZS5EZXB0aEJpdHMgPSB0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5EZXB0aEJpdHM7CisKKyAgIGlyYi0+QmFzZS5EZWxldGUgPSBpbnRlbF9kZWxldGVfcmVuZGVyYnVmZmVyOworICAgaXJiLT5CYXNlLkFsbG9jU3RvcmFnZSA9IGludGVsX25vcF9hbGxvY19zdG9yYWdlOworCisgICBpcmItPlJlbmRlclRvVGV4dHVyZSA9IEdMX1RSVUU7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisvKioKKyAqIFdoZW4gZ2xGcmFtZWJ1ZmZlclRleHR1cmVbMTIzXUQgaXMgY2FsbGVkIHRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUKKyAqIGdsX3JlbmRlcmJ1ZmZlciB3cmFwcGVyIGFyb3VuZCB0aGUgdGV4dHVyZSBpbWFnZS4KKyAqIFRoaXMgd2lsbCBoYXZlIHRoZSByZWdpb24gaW5mbyBuZWVkZWQgZm9yIGhhcmR3YXJlIHJlbmRlcmluZy4KKyAqLworc3RhdGljIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKgoraW50ZWxfd3JhcF90ZXh0dXJlKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgY29uc3QgR0x1aW50IG5hbWUgPSB+MDsgICAgICAvKiBub3Qgc2lnbmlmaWNhbnQsIGJ1dCBkaXN0aW5jdCBmb3IgZGVidWdnaW5nICovCisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmI7CisKKyAgIC8qIG1ha2UgYW4gaW50ZWxfcmVuZGVyYnVmZmVyIHRvIHdyYXAgdGhlIHRleHR1cmUgaW1hZ2UgKi8KKyAgIGlyYiA9IENBTExPQ19TVFJVQ1QoaW50ZWxfcmVuZGVyYnVmZmVyKTsKKyAgIGlmICghaXJiKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbEZyYW1lYnVmZmVyVGV4dHVyZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIF9tZXNhX2luaXRfcmVuZGVyYnVmZmVyKCZpcmItPkJhc2UsIG5hbWUpOworICAgaXJiLT5CYXNlLkNsYXNzSUQgPSBJTlRFTF9SQl9DTEFTUzsKKworICAgaWYgKCFpbnRlbF91cGRhdGVfd3JhcHBlcihjdHgsIGlyYiwgdGV4SW1hZ2UpKSB7CisgICAgICBfbWVzYV9mcmVlKGlyYik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIGlyYjsKK30KKworCisvKioKKyAqIENhbGxlZCBieSBnbEZyYW1lYnVmZmVyVGV4dHVyZVsxMjNdREVYVCgpIChhbmQgb3RoZXIgcGxhY2VzKSB0bworICogcHJlcGFyZSBmb3IgcmVuZGVyaW5nIGludG8gdGV4dHVyZSBtZW1vcnkuICBUaGlzIG1pZ2h0IGJlIGNhbGxlZAorICogbWFueSB0aW1lcyB0byBjaG9vc2UgZGlmZmVyZW50IHRleHR1cmUgbGV2ZWxzLCBjdWJlIGZhY2VzLCBldGMKKyAqIGJlZm9yZSBpbnRlbF9maW5pc2hfcmVuZGVyX3RleHR1cmUoKSBpcyBldmVyIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQKK2ludGVsX3JlbmRlcl90ZXh0dXJlKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyX2F0dGFjaG1lbnQgKmF0dCkKK3sKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICpuZXdJbWFnZQorICAgICAgPSBhdHQtPlRleHR1cmUtPkltYWdlW2F0dC0+Q3ViZU1hcEZhY2VdW2F0dC0+VGV4dHVyZUxldmVsXTsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiA9IGludGVsX3JlbmRlcmJ1ZmZlcihhdHQtPlJlbmRlcmJ1ZmZlcik7CisgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxfaW1hZ2U7CisgICBHTHVpbnQgaW1hZ2VPZmZzZXQ7CisKKyAgICh2b2lkKSBmYjsKKworICAgQVNTRVJUKG5ld0ltYWdlKTsKKworICAgaWYgKCFpcmIpIHsKKyAgICAgIGlyYiA9IGludGVsX3dyYXBfdGV4dHVyZShjdHgsIG5ld0ltYWdlKTsKKyAgICAgIGlmIChpcmIpIHsKKyAgICAgICAgIC8qIGJpbmQgdGhlIHdyYXBwZXIgdG8gdGhlIGF0dGFjaG1lbnQgcG9pbnQgKi8KKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9yZW5kZXJidWZmZXIoJmF0dC0+UmVuZGVyYnVmZmVyLCAmaXJiLT5CYXNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgLyogZmFsbGJhY2sgdG8gc29mdHdhcmUgcmVuZGVyaW5nICovCisgICAgICAgICBfbWVzYV9yZW5kZXJfdGV4dHVyZShjdHgsIGZiLCBhdHQpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfSBpZiAoIWludGVsX3VwZGF0ZV93cmFwcGVyKGN0eCwgaXJiLCBuZXdJbWFnZSkpIHsKKyAgICAgICBfbWVzYV9yZWZlcmVuY2VfcmVuZGVyYnVmZmVyKCZhdHQtPlJlbmRlcmJ1ZmZlciwgTlVMTCk7CisgICAgICAgX21lc2FfcmVuZGVyX3RleHR1cmUoY3R4LCBmYiwgYXR0KTsKKyAgICAgICByZXR1cm47CisgICB9CisKKyAgIERCRygiQmVnaW4gcmVuZGVyIHRleHR1cmUgdGlkICV4IHRleD0ldSB3PSVkIGg9JWQgcmVmY291bnQ9JWRcbiIsCisgICAgICAgX2dsdGhyZWFkX0dldElEKCksCisgICAgICAgYXR0LT5UZXh0dXJlLT5OYW1lLCBuZXdJbWFnZS0+V2lkdGgsIG5ld0ltYWdlLT5IZWlnaHQsCisgICAgICAgaXJiLT5CYXNlLlJlZkNvdW50KTsKKworICAgLyogcG9pbnQgdGhlIHJlbmRlcmJ1ZmVyJ3MgcmVnaW9uIHRvIHRoZSB0ZXh0dXJlIGltYWdlIHJlZ2lvbiAqLworICAgaW50ZWxfaW1hZ2UgPSBpbnRlbF90ZXh0dXJlX2ltYWdlKG5ld0ltYWdlKTsKKyAgIGlmIChpcmItPnJlZ2lvbiAhPSBpbnRlbF9pbWFnZS0+bXQtPnJlZ2lvbikgeworICAgICAgaWYgKGlyYi0+cmVnaW9uKQorCSBpbnRlbF9yZWdpb25fcmVsZWFzZSgmaXJiLT5yZWdpb24pOworICAgICAgaW50ZWxfcmVnaW9uX3JlZmVyZW5jZSgmaXJiLT5yZWdpb24sIGludGVsX2ltYWdlLT5tdC0+cmVnaW9uKTsKKyAgIH0KKworICAgLyogY29tcHV0ZSBvZmZzZXQgb2YgdGhlIHBhcnRpY3VsYXIgMkQgaW1hZ2Ugd2l0aGluIHRoZSB0ZXh0dXJlIHJlZ2lvbiAqLworICAgaW1hZ2VPZmZzZXQgPSBpbnRlbF9taXB0cmVlX2ltYWdlX29mZnNldChpbnRlbF9pbWFnZS0+bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC0+Q3ViZU1hcEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC0+VGV4dHVyZUxldmVsKTsKKworICAgaWYgKGF0dC0+VGV4dHVyZS0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfM0QpIHsKKyAgICAgIGNvbnN0IEdMdWludCAqb2Zmc2V0cyA9IGludGVsX21pcHRyZWVfZGVwdGhfb2Zmc2V0cyhpbnRlbF9pbWFnZS0+bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0LT5UZXh0dXJlTGV2ZWwpOworICAgICAgaW1hZ2VPZmZzZXQgKz0gb2Zmc2V0c1thdHQtPlpvZmZzZXRdOworICAgfQorCisgICAvKiBzdG9yZSB0aGF0IG9mZnNldCBpbiB0aGUgcmVnaW9uICovCisgICBpbnRlbF9pbWFnZS0+bXQtPnJlZ2lvbi0+ZHJhd19vZmZzZXQgPSBpbWFnZU9mZnNldDsKKworICAgLyogdXBkYXRlIGRyYXdpbmcgcmVnaW9uLCBldGMgKi8KKyAgIGludGVsX2RyYXdfYnVmZmVyKGN0eCwgZmIpOworfQorCisKKy8qKgorICogQ2FsbGVkIGJ5IE1lc2Egd2hlbiByZW5kZXJpbmcgdG8gYSB0ZXh0dXJlIGlzIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9maW5pc2hfcmVuZGVyX3RleHR1cmUoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXJfYXR0YWNobWVudCAqYXR0KQoreworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiID0gaW50ZWxfcmVuZGVyYnVmZmVyKGF0dC0+UmVuZGVyYnVmZmVyKTsKKworICAgREJHKCJFbmQgcmVuZGVyIHRleHR1cmUgKHRpZCAleCkgdGV4ICV1XG4iLCBfZ2x0aHJlYWRfR2V0SUQoKSwgYXR0LT5UZXh0dXJlLT5OYW1lKTsKKworICAgaWYgKGlyYikgeworICAgICAgLyoganVzdCByZWxlYXNlIHRoZSByZWdpb24gKi8KKyAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlKCZpcmItPnJlZ2lvbik7CisgICB9CisgICBlbHNlIGlmIChhdHQtPlJlbmRlcmJ1ZmZlcikgeworICAgICAgLyogc29mdHdhcmUgZmFsbGJhY2sgKi8KKyAgICAgIF9tZXNhX2ZpbmlzaF9yZW5kZXJfdGV4dHVyZShjdHgsIGF0dCk7CisgICAgICAvKiBYWFggRkJPOiBOZWVkIHRvIHVubWFwIHRoZSBidWZmZXIgKG9yIGluIGludGVsU3BhblJlbmRlclN0YXJ0Pz8/KSAqLworICAgfQorfQorCisKKy8qKgorICogRG8gb25lLXRpbWUgY29udGV4dCBpbml0aWFsaXphdGlvbnMgcmVsYXRlZCB0byBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0LgorICogSG9vayBpbiBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9ucy4KKyAqLwordm9pZAoraW50ZWxfZmJvX2luaXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgaW50ZWwtPmN0eC5Ecml2ZXIuTmV3RnJhbWVidWZmZXIgPSBpbnRlbF9uZXdfZnJhbWVidWZmZXI7CisgICBpbnRlbC0+Y3R4LkRyaXZlci5OZXdSZW5kZXJidWZmZXIgPSBpbnRlbF9uZXdfcmVuZGVyYnVmZmVyOworICAgaW50ZWwtPmN0eC5Ecml2ZXIuQmluZEZyYW1lYnVmZmVyID0gaW50ZWxfYmluZF9mcmFtZWJ1ZmZlcjsKKyAgIGludGVsLT5jdHguRHJpdmVyLkZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyID0gaW50ZWxfZnJhbWVidWZmZXJfcmVuZGVyYnVmZmVyOworICAgaW50ZWwtPmN0eC5Ecml2ZXIuUmVuZGVyVGV4dHVyZSA9IGludGVsX3JlbmRlcl90ZXh0dXJlOworICAgaW50ZWwtPmN0eC5Ecml2ZXIuRmluaXNoUmVuZGVyVGV4dHVyZSA9IGludGVsX2ZpbmlzaF9yZW5kZXJfdGV4dHVyZTsKKyAgIGludGVsLT5jdHguRHJpdmVyLlJlc2l6ZUJ1ZmZlcnMgPSBpbnRlbF9yZXNpemVfYnVmZmVyczsKK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2Ziby5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfZmJvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxNTU4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2Ziby5oCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElOVEVMX0ZCT19ICisjZGVmaW5lIElOVEVMX0ZCT19ICisKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKworc3RydWN0IGludGVsX2NvbnRleHQ7CisKKy8qKgorICogSW50ZWwgZnJhbWVidWZmZXIsIGRlcml2ZWQgZnJvbSBnbF9mcmFtZWJ1ZmZlci4KKyAqLworc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyCit7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgQmFzZTsKKworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqY29sb3JfcmJbM107CisKKyAgIC8qIERyYXdhYmxlIHBhZ2UgZmxpcHBpbmcgc3RhdGUgKi8KKyAgIEdMYm9vbGVhbiBwZl9hY3RpdmU7CisgICBHTHVpbnQgcGZfc2VxOworICAgR0xpbnQgcGZfcGxhbmVzOworICAgR0xpbnQgcGZfY3VycmVudF9wYWdlOworICAgR0xpbnQgcGZfbnVtX3BhZ2VzOworCisgICAvKiBWQkkKKyAgICAqLworICAgR0x1aW50IHZibF93YWl0ZWQ7CisKKyAgIGludDY0X3Qgc3dhcF91c3Q7CisgICBpbnQ2NF90IHN3YXBfbWlzc2VkX3VzdDsKKworICAgR0x1aW50IHN3YXBfY291bnQ7CisgICBHTHVpbnQgc3dhcF9taXNzZWRfY291bnQ7Cit9OworCisKKy8qKgorICogSW50ZWwgcmVuZGVyYnVmZmVyLCBkZXJpdmVkIGZyb20gZ2xfcmVuZGVyYnVmZmVyLgorICogTm90ZTogVGhlIFBhaXJlZERlcHRoIGFuZCBQYWlyZWRTdGVuY2lsIGZpZWxkcyB1c2UgcmVuZGVyYnVmZmVyIElEcywKKyAqIG5vdCBwb2ludGVycyBiZWNhdXNlIGluIHNvbWUgY2lyY3Vtc3RhbmNlcyBhIGRlbGV0ZWQgcmVuZGVyYnVmZmVyIGNvdWxkCisgKiByZXN1bHQgaW4gYSBkYW5nbGluZyBwb2ludGVyIGhlcmUuCisgKi8KK3N0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIKK3sKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgQmFzZTsKKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbjsKKyAgIEdMdWludCBwZlBpdGNoOyAgICAgICAgICAgICAgLyogcG9zc2libHkgcGFnZWQgZmxpcHBlZCBwaXRjaCAqLworICAgR0xib29sZWFuIFJlbmRlclRvVGV4dHVyZTsgICAvKiBSVFQ/ICovCisKKyAgIEdMdWludCBQYWlyZWREZXB0aDsgICAvKio8IG9ubHkgdXNlZCBpZiB0aGlzIGlzIGEgZGVwdGggcmVuZGVyYnVmZmVyICovCisgICBHTHVpbnQgUGFpcmVkU3RlbmNpbDsgLyoqPCBvbmx5IHVzZWQgaWYgdGhpcyBpcyBhIHN0ZW5jaWwgcmVuZGVyYnVmZmVyICovCisKKyAgIEdMdWludCBwZl9wZW5kaW5nOyAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgb2YgcGVuZGluZyBmbGlwICovCisKKyAgIEdMdWludCB2YmxfcGVuZGluZzsgICAvKio8IHZibGFuayBzZXF1ZW5jZSBudW1iZXIgb2YgcGVuZGluZyBmbGlwICovCisKKyAgIHVpbnQ4X3QgKnNwYW5fY2FjaGU7CisgICB1bnNpZ25lZCBsb25nIHNwYW5fY2FjaGVfb2Zmc2V0OworfTsKKworZXh0ZXJuIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmludGVsX3JlbmRlcmJ1ZmZlcihzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyYik7CisKK2V4dGVybiB2b2lkCitpbnRlbF9yZW5kZXJidWZmZXJfc2V0X3JlZ2lvbihzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsCisJCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24pOworCitleHRlcm4gc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqCitpbnRlbF9jcmVhdGVfcmVuZGVyYnVmZmVyKEdMZW51bSBpbnRGb3JtYXQpOworCitleHRlcm4gdm9pZCBpbnRlbF9mYm9faW5pdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwpOworCisKKy8qIFhYWCBtYWtlIGlubGluZSBvciBtYWNybyAqLworZXh0ZXJuIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmludGVsX2dldF9yZW5kZXJidWZmZXIoc3RydWN0IGdsX2ZyYW1lYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0SW5kZXgpOworCitleHRlcm4gdm9pZCBpbnRlbF9mbGlwX3JlbmRlcmJ1ZmZlcnMoc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYik7CisKKworLyogWFhYIG1ha2UgaW5saW5lIG9yIG1hY3JvICovCitleHRlcm4gc3RydWN0IGludGVsX3JlZ2lvbiAqaW50ZWxfZ2V0X3JiX3JlZ2lvbihzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGF0dEluZGV4KTsKKworCisKKworI2VuZGlmIC8qIElOVEVMX0ZCT19IICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9pb2N0bC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGM4MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfaW9jdGwuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgorCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCisjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKworI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfSU9DVEwKKworaW50CitpbnRlbEVtaXRJcnFMb2NrZWQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKQoreworICAgc3RydWN0IGRybV9pOTE1X2lycV9lbWl0IGllOworICAgaW50IHJldCwgc2VxID0gMTsKKworICAgaWYgKGludGVsLT5ub19odykKKyAgICAgIHJldHVybiAxOworCisgICAvKgorICAgICBhc3NlcnQoKCgqKGludCAqKWludGVsLT5kcmlId0xvY2spICYgfkRSTV9MT0NLX0NPTlQpID09CisgICAgIChEUk1fTE9DS19IRUxEfGludGVsLT5oSFdDb250ZXh0KSk7CisgICAqLworCisgICBpZS5pcnFfc2VxID0gJnNlcTsKKworICAgcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X0lSUV9FTUlULCAmaWUsIHNpemVvZihpZSkpOworICAgaWYgKHJldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZHJtX2k5MTVfaXJxX2VtaXQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICBleGl0KDEpOworICAgfQorCisgICBEQkcoIiVzIC0tPiAgJWRcbiIsIF9fRlVOQ1RJT05fXywgc2VxKTsKKworICAgcmV0dXJuIHNlcTsKK30KKwordm9pZAoraW50ZWxXYWl0SXJxKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgaW50IHNlcSkKK3sKKyAgIHN0cnVjdCBkcm1faTkxNV9pcnFfd2FpdCBpdzsKKyAgIGludCByZXQsIGxhc3RkaXNwYXRjaDsKKyAgIHZvbGF0aWxlIHN0cnVjdCBkcm1faTkxNV9zYXJlYSAqc2FyZWEgPSBpbnRlbC0+c2FyZWE7CisKKyAgIGlmIChpbnRlbC0+bm9faHcpCisgICAgICByZXR1cm47CisKKyAgIERCRygiJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc2VxKTsKKworICAgaXcuaXJxX3NlcSA9IHNlcTsKKworICAgZG8geworICAgICAgbGFzdGRpc3BhdGNoID0gc2FyZWEtPmxhc3RfZGlzcGF0Y2g7CisgICAgICByZXQgPSBkcm1Db21tYW5kV3JpdGUoaW50ZWwtPmRyaUZkLCBEUk1fSTkxNV9JUlFfV0FJVCwgJml3LCBzaXplb2YoaXcpKTsKKyAgIH0gd2hpbGUgKHJldCA9PSAtRUFHQUlOIHx8CisJICAgIHJldCA9PSAtRUlOVFIgfHwKKwkgICAgKHJldCA9PSAtRUJVU1kgJiYgbGFzdGRpc3BhdGNoICE9IHNhcmVhLT5sYXN0X2Rpc3BhdGNoKSB8fAorCSAgICAocmV0ID09IDAgJiYgc2VxID4gc2FyZWEtPmxhc3RfZGlzcGF0Y2gpIHx8CisJICAgIChyZXQgPT0gMCAmJiBzYXJlYS0+bGFzdF9kaXNwYXRjaCAtIHNlcSA+PSAoMSA8PCAyNCkpKTsKKworICAgaWYgKHJldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZHJtX2k5MTVfaXJxX3dhaXQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICBleGl0KDEpOworICAgfQorfQorCisKK2ludAoraW50ZWxfYmF0Y2hfaW9jdGwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgR0x1aW50IHN0YXJ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCB1c2VkLAorICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGlnbm9yZV9jbGlwcmVjdHMsIEdMYm9vbGVhbiBhbGxvd191bmxvY2spCit7CisgICBzdHJ1Y3QgZHJtX2k5MTVfYmF0Y2hidWZmZXIgYmF0Y2g7CisKKyAgIGlmIChpbnRlbC0+bm9faHcpCisgICAgICByZXR1cm4gMDsKKworICAgYXNzZXJ0KGludGVsLT5sb2NrZWQpOworICAgYXNzZXJ0KHVzZWQpOworCisgICBEQkcoIiVzIHVzZWQgJWQgb2Zmc2V0ICV4Li4leCBpZ25vcmVfY2xpcHJlY3RzICVkXG4iLAorICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICB1c2VkLCBzdGFydF9vZmZzZXQsIHN0YXJ0X29mZnNldCArIHVzZWQsIGlnbm9yZV9jbGlwcmVjdHMpOworCisgICAvKiBUaHJvdyBhd2F5IG5vbi1lZmZlY3RpdmUgcGFja2V0cy4gIFdvbid0IHdvcmsgb25jZSB3ZSBoYXZlCisgICAgKiBoYXJkd2FyZSBjb250ZXh0cyB3aGljaCB3b3VsZCBwcmVzZXJ2ZSBzdGF0ZWNoYW5nZXMgYmV5b25kIGEKKyAgICAqIHNpbmdsZSBidWZmZXIuCisgICAgKi8KKyAgIGJhdGNoLnN0YXJ0ID0gc3RhcnRfb2Zmc2V0OworICAgYmF0Y2gudXNlZCA9IHVzZWQ7CisgICBiYXRjaC5jbGlwcmVjdHMgPSBpbnRlbC0+cENsaXBSZWN0czsKKyAgIGJhdGNoLm51bV9jbGlwcmVjdHMgPSBpZ25vcmVfY2xpcHJlY3RzID8gMCA6IGludGVsLT5udW1DbGlwUmVjdHM7CisgICBiYXRjaC5EUjEgPSAwOworICAgYmF0Y2guRFI0ID0gKCgoKEdMdWludCkgaW50ZWwtPmRyYXdYKSAmIDB4ZmZmZikgfAorICAgICAgICAgICAgICAgICgoKEdMdWludCkgaW50ZWwtPmRyYXdZKSA8PCAxNikpOworCisgICBEQkcoIiVzOiAweCV4Li4weCV4IERSNDogJXggY2xpcHJlY3RzOiAlZFxuIiwKKyAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgYmF0Y2guc3RhcnQsCisgICAgICAgYmF0Y2guc3RhcnQgKyBiYXRjaC51c2VkICogNCwgYmF0Y2guRFI0LCBiYXRjaC5udW1fY2xpcHJlY3RzKTsKKworICAgaWYgKGRybUNvbW1hbmRXcml0ZShpbnRlbC0+ZHJpRmQsIERSTV9JOTE1X0JBVENIQlVGRkVSLCAmYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiYXRjaCkpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSTV9JOTE1X0JBVENIQlVGRkVSOiAlZFxuIiwgLWVycm5vKTsKKyAgICAgIHJldHVybiAtZXJybm87CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitpbnQKK2ludGVsX2V4ZWNfaW9jdGwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgR0x1aW50IHVzZWQsCisJCSBHTGJvb2xlYW4gaWdub3JlX2NsaXByZWN0cywgR0xib29sZWFuIGFsbG93X3VubG9jaywKKwkJIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciAqZXhlY2J1ZikKK3sKKyAgIGludCByZXQ7CisKKyAgIGFzc2VydChpbnRlbC0+bG9ja2VkKTsKKyAgIGFzc2VydCh1c2VkKTsKKworICAgaWYgKGludGVsLT5ub19odykKKyAgICAgIHJldHVybiAwOworCisgICBleGVjYnVmLT5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOworICAgZXhlY2J1Zi0+YmF0Y2hfbGVuID0gdXNlZDsKKyAgIGV4ZWNidWYtPmNsaXByZWN0c19wdHIgPSAodWludHB0cl90KWludGVsLT5wQ2xpcFJlY3RzOworICAgZXhlY2J1Zi0+bnVtX2NsaXByZWN0cyA9IGlnbm9yZV9jbGlwcmVjdHMgPyAwIDogaW50ZWwtPm51bUNsaXBSZWN0czsKKyAgIGV4ZWNidWYtPkRSMSA9IDA7CisgICBleGVjYnVmLT5EUjQgPSAoKCgoR0x1aW50KSBpbnRlbC0+ZHJhd1gpICYgMHhmZmZmKSB8CisJCSAgICgoKEdMdWludCkgaW50ZWwtPmRyYXdZKSA8PCAxNikpOworCisgICBkbyB7CisgICAgICByZXQgPSBpb2N0bChpbnRlbC0+ZHJpRmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSLCBleGVjYnVmKTsKKyAgIH0gd2hpbGUgKHJldCA9PSAtRUFHQUlOKTsKKworICAgaWYgKHJldCAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSTV9JOTE1X0dFTV9FWEVDQlVGRkVSOiAlZFxuIiwgLWVycm5vKTsKKyAgICAgIHJldHVybiAtZXJybm87CisgICB9CisKKyAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9pb2N0bC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfaW9jdGwuaApzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX2lvY3RsLmgKcmVuYW1lIHRvIHNyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2lvY3RsLmgKaW5kZXggZGYyNzY1OS4uNTI2ZTM4MyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9pb2N0bC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX2lvY3RsLmgKQEAgLTMzLDEyICszMywxNCBAQAogdm9pZCBpbnRlbFdhaXRJcnEoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgaW50IHNlcSApOwogaW50IGludGVsRW1pdElycUxvY2tlZCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsICk7CiAKLXZvaWQgaW50ZWxfYmF0Y2hfaW9jdGwoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgCi0JCQlHTHVpbnQgc3RhcnRfb2Zmc2V0LAotCQkJR0x1aW50IHVzZWQpOwotCi12b2lkIGludGVsX2NtZF9pb2N0bCggc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCAKLQkJICAgICAgY2hhciAqYnVmLAotCQkgICAgICBHTHVpbnQgdXNlZCk7CitpbnQgaW50ZWxfYmF0Y2hfaW9jdGwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgICAgICBHTHVpbnQgc3RhcnRfb2Zmc2V0LAorCQkgICAgICBHTHVpbnQgdXNlZCwKKwkJICAgICAgR0xib29sZWFuIGlnbm9yZV9jbGlwcmVjdHMsCisJCSAgICAgIEdMYm9vbGVhbiBhbGxvd191bmxvY2spOworaW50IGludGVsX2V4ZWNfaW9jdGwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkgICAgIEdMdWludCB1c2VkLAorCQkgICAgIEdMYm9vbGVhbiBpZ25vcmVfY2xpcHJlY3RzLCBHTGJvb2xlYW4gYWxsb3dfdW5sb2NrLAorCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciAqZXhlY2J1Zik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfbWlwbWFwX3RyZWUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX21pcG1hcF90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlN2UwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX21pcG1hcF90cmVlLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgImVudW1zLmgiCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX01JUFRSRUUKKworc3RhdGljIEdMZW51bQordGFyZ2V0X3RvX3RhcmdldChHTGVudW0gdGFyZ2V0KQoreworICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQjoKKyAgICAgIHJldHVybiBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQjsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdGFyZ2V0OworICAgfQorfQorCitzdGF0aWMgc3RydWN0IGludGVsX21pcG1hcF90cmVlICoKK2ludGVsX21pcHRyZWVfY3JlYXRlX2ludGVybmFsKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgIEdMZW51bSB0YXJnZXQsCisJCQkgICAgICBHTGVudW0gaW50ZXJuYWxfZm9ybWF0LAorCQkJICAgICAgR0x1aW50IGZpcnN0X2xldmVsLAorCQkJICAgICAgR0x1aW50IGxhc3RfbGV2ZWwsCisJCQkgICAgICBHTHVpbnQgd2lkdGgwLAorCQkJICAgICAgR0x1aW50IGhlaWdodDAsCisJCQkgICAgICBHTHVpbnQgZGVwdGgwLCBHTHVpbnQgY3BwLCBHTHVpbnQgY29tcHJlc3NfYnl0ZSkKK3sKKyAgIEdMYm9vbGVhbiBvazsKKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgPSBjYWxsb2Moc2l6ZW9mKCptdCksIDEpOworCisgICBEQkcoIiVzIHRhcmdldCAlcyBmb3JtYXQgJXMgbGV2ZWwgJWQuLiVkXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihpbnRlcm5hbF9mb3JtYXQpLCBmaXJzdF9sZXZlbCwgbGFzdF9sZXZlbCk7CisKKyAgIG10LT50YXJnZXQgPSB0YXJnZXRfdG9fdGFyZ2V0KHRhcmdldCk7CisgICBtdC0+aW50ZXJuYWxfZm9ybWF0ID0gaW50ZXJuYWxfZm9ybWF0OworICAgbXQtPmZpcnN0X2xldmVsID0gZmlyc3RfbGV2ZWw7CisgICBtdC0+bGFzdF9sZXZlbCA9IGxhc3RfbGV2ZWw7CisgICBtdC0+d2lkdGgwID0gd2lkdGgwOworICAgbXQtPmhlaWdodDAgPSBoZWlnaHQwOworICAgbXQtPmRlcHRoMCA9IGRlcHRoMDsKKyAgIG10LT5jcHAgPSBjb21wcmVzc19ieXRlID8gY29tcHJlc3NfYnl0ZSA6IGNwcDsKKyAgIG10LT5jb21wcmVzc2VkID0gY29tcHJlc3NfYnl0ZSA/IDEgOiAwOworICAgbXQtPnJlZmNvdW50ID0gMTsgCisgICBtdC0+cGl0Y2ggPSAwOworCisjaWZkZWYgSTkxNQorICAgaWYgKElTXzk0NShpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSkKKyAgICAgIG9rID0gaTk0NV9taXB0cmVlX2xheW91dChpbnRlbCwgbXQpOworICAgZWxzZQorICAgICAgb2sgPSBpOTE1X21pcHRyZWVfbGF5b3V0KGludGVsLCBtdCk7CisjZWxzZQorICAgb2sgPSBicndfbWlwdHJlZV9sYXlvdXQoaW50ZWwsIG10KTsKKyNlbmRpZgorCisgICBpZiAoIW9rKSB7CisgICAgICBmcmVlKG10KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gbXQ7Cit9CisKK3N0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqCitpbnRlbF9taXB0cmVlX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCSAgICAgR0xlbnVtIHRhcmdldCwKKwkJICAgICBHTGVudW0gaW50ZXJuYWxfZm9ybWF0LAorCQkgICAgIEdMdWludCBmaXJzdF9sZXZlbCwKKwkJICAgICBHTHVpbnQgbGFzdF9sZXZlbCwKKwkJICAgICBHTHVpbnQgd2lkdGgwLAorCQkgICAgIEdMdWludCBoZWlnaHQwLAorCQkgICAgIEdMdWludCBkZXB0aDAsIEdMdWludCBjcHAsIEdMdWludCBjb21wcmVzc19ieXRlKQoreworICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdDsKKworICAgbXQgPSBpbnRlbF9taXB0cmVlX2NyZWF0ZV9pbnRlcm5hbChpbnRlbCwgdGFyZ2V0LCBpbnRlcm5hbF9mb3JtYXQsCisJCQkJICAgICAgZmlyc3RfbGV2ZWwsIGxhc3RfbGV2ZWwsIHdpZHRoMCwKKwkJCQkgICAgICBoZWlnaHQwLCBkZXB0aDAsIGNwcCwgY29tcHJlc3NfYnl0ZSk7CisgICAvKgorICAgICogcGl0Y2ggPT0gMCBpbmRpY2F0ZXMgdGhlIG51bGwgdGV4dHVyZQorICAgICovCisgICBpZiAoIW10IHx8ICFtdC0+cGl0Y2gpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgbXQtPnJlZ2lvbiA9IGludGVsX3JlZ2lvbl9hbGxvYyhpbnRlbCwKKwkJCQkgICBtdC0+Y3BwLCBtdC0+cGl0Y2gsIG10LT50b3RhbF9oZWlnaHQpOworCisgICBpZiAoIW10LT5yZWdpb24pIHsKKyAgICAgICBmcmVlKG10KTsKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIG10OworfQorCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKgoraW50ZWxfbWlwdHJlZV9jcmVhdGVfZm9yX3JlZ2lvbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkJR0xlbnVtIHRhcmdldCwKKwkJCQlHTGVudW0gaW50ZXJuYWxfZm9ybWF0LAorCQkJCUdMdWludCBmaXJzdF9sZXZlbCwKKwkJCQlHTHVpbnQgbGFzdF9sZXZlbCwKKwkJCQlzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisJCQkJR0x1aW50IGRlcHRoMCwKKwkJCQlHTHVpbnQgY29tcHJlc3NfYnl0ZSkKK3sKKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQ7CisKKyAgIG10ID0gaW50ZWxfbWlwdHJlZV9jcmVhdGVfaW50ZXJuYWwoaW50ZWwsIHRhcmdldCwgaW50ZXJuYWxfZm9ybWF0LAorCQkJCSAgICAgIGZpcnN0X2xldmVsLCBsYXN0X2xldmVsLAorCQkJCSAgICAgIHJlZ2lvbi0+cGl0Y2gsIHJlZ2lvbi0+aGVpZ2h0LCBkZXB0aDAsCisJCQkJICAgICAgcmVnaW9uLT5jcHAsIGNvbXByZXNzX2J5dGUpOworICAgaWYgKCFtdCkKKyAgICAgIHJldHVybiBtdDsKKyNpZiAwCisgICBpZiAobXQtPnBpdGNoICE9IHJlZ2lvbi0+cGl0Y2gpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAgICJyZWdpb24gcGl0Y2ggKCVkKSBkb2Vzbid0IG1hdGNoIG1pcG1hcCB0cmVlIHBpdGNoICglZClcbiIsCisJICAgICAgcmVnaW9uLT5waXRjaCwgbXQtPnBpdGNoKTsKKyAgICAgIGZyZWUobXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisjZWxzZQorICAgLyogVGhlIG1pcG1hcCB0cmVlIHBpdGNoIGlzIGFsaWduZWQgdG8gNjQgYnl0ZXMgdG8gbWFrZSBzdXJlIHJlbmRlcgorICAgICogdG8gdGV4dHVyZSB3b3JrcywgYnV0IHdlIGRvbid0IG5lZWQgdGhhdCBmb3IgdGV4dHVyaW5nIGZyb20gYQorICAgICogcGl4bWFwLiAgSnVzdCBvdmVycmlkZSBpdCBoZXJlLiAqLworICAgbXQtPnBpdGNoID0gcmVnaW9uLT5waXRjaDsKKyNlbmRpZgorCisgICBtdC0+cmVnaW9uID0gcmVnaW9uOworCisgICByZXR1cm4gbXQ7CisgfQorCisvKioKKyAqIGludGVsX21pcHRyZWVfcGl0Y2hfYWxpZ246CisgKgorICogQGludGVsOiBpbnRlbCBjb250ZXh0IHBvaW50ZXIKKyAqCisgKiBAbXQ6IHRoZSBtaXB0cmVlIHRvIGNvbXB1dGUgcGl0Y2ggYWxpZ25tZW50IGZvcgorICoKKyAqIEBwaXRjaDogdGhlIG5hdHVyYWwgcGl0Y2ggdmFsdWUKKyAqCisgKiBHaXZlbiBAcGl0Y2gsIGNvbXB1dGUgYSBsYXJnZXIgdmFsdWUgd2hpY2ggYWNjb3VudHMgZm9yCisgKiBhbnkgbmVjZXNzYXJ5IGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgZGV2aWNlCisgKi8KKworaW50IGludGVsX21pcHRyZWVfcGl0Y2hfYWxpZ24gKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorCQkJICAgICAgIGludCBwaXRjaCkKK3sKKyNpZmRlZiBJOTE1CisgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OworI2VuZGlmCisKKyAgIGlmICghbXQtPmNvbXByZXNzZWQpIHsKKyAgICAgIGludCBwaXRjaF9hbGlnbjsKKworICAgICAgaWYgKGludGVsLT50dG0pIHsKKwkgLyogWFhYOiBBbGlnbiBwaXRjaCB0byBtdWx0aXBsZSBvZiA2NCBieXRlcyBmb3Igbm93IHRvIGFsbG93CisJICAqIHJlbmRlci10by10ZXh0dXJlIHRvIHdvcmsgaW4gYWxsIGNhc2VzLiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZQorCSAgKiByZXBsYWNlZCBhdCBzb21lIHBvaW50IGJ5IHNvbWUgc2NoZW1lIHRvIG9ubHkgZG8gdGhpcyB3aGVuIHJlYWxseQorCSAgKiBuZWNlc3NhcnkuCisJICAqLworCSBwaXRjaF9hbGlnbiA9IDY0OworICAgICAgfSBlbHNlIHsKKwkgcGl0Y2hfYWxpZ24gPSA0OworICAgICAgfQorCisgICAgICBwaXRjaCA9IEFMSUdOKHBpdGNoICogbXQtPmNwcCwgcGl0Y2hfYWxpZ24pOworCisjaWZkZWYgSTkxNQorICAgICAgLyogWFhYOiBBdCBsZWFzdCB0aGUgaTkxNSBzZWVtcyB2ZXJ5IHVwc2V0IHdoZW4gdGhlIHBpdGNoIGlzIGEgbXVsdGlwbGUKKyAgICAgICAqIG9mIDEwMjQgYW5kIHNvbWV0aW1lcyA1MTIgYnl0ZXMgLSBwZXJmb3JtYW5jZSBjYW4gZHJvcCBieSBzZXZlcmFsCisgICAgICAgKiB0aW1lcy4gR28gdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBmb3Igbm93LgorICAgICAgICovCisgICAgICBpZiAoIShwaXRjaCAmIDUxMSkgJiYgCisJIChwaXRjaCArIHBpdGNoX2FsaWduKSA8ICgxIDw8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscykpCisJIHBpdGNoICs9IHBpdGNoX2FsaWduOworI2VuZGlmCisKKyAgICAgIHBpdGNoIC89IG10LT5jcHA7CisgICB9CisgICByZXR1cm4gcGl0Y2g7Cit9CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfcmVmZXJlbmNlKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqc3JjKQoreworICAgc3JjLT5yZWZjb3VudCsrOworICAgKmRzdCA9IHNyYzsKKyAgIERCRygiJXMgJXAgcmVmY291bnQgbm93ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNyYywgc3JjLT5yZWZjb3VudCk7Cit9CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfcmVsZWFzZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICoqbXQpCit7CisgICBpZiAoISptdCkKKyAgICAgIHJldHVybjsKKworICAgREJHKCIlcyAlcCByZWZjb3VudCB3aWxsIGJlICVkXG4iLCBfX0ZVTkNUSU9OX18sICptdCwgKCptdCktPnJlZmNvdW50IC0gMSk7CisgICBpZiAoLS0oKm10KS0+cmVmY291bnQgPD0gMCkgeworICAgICAgR0x1aW50IGk7CisKKyAgICAgIERCRygiJXMgZGVsZXRpbmcgJXBcbiIsIF9fRlVOQ1RJT05fXywgKm10KTsKKworICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2UoJigoKm10KS0+cmVnaW9uKSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRV9MRVZFTFM7IGkrKykKKyAgICAgICAgIGlmICgoKm10KS0+bGV2ZWxbaV0uaW1hZ2Vfb2Zmc2V0KQorICAgICAgICAgICAgZnJlZSgoKm10KS0+bGV2ZWxbaV0uaW1hZ2Vfb2Zmc2V0KTsKKworICAgICAgZnJlZSgqbXQpOworICAgfQorICAgKm10ID0gTlVMTDsKK30KKworCisKKworLyogQ2FuIHRoZSBpbWFnZSBiZSBwdWxsZWQgaW50byBhIHVuaWZpZWQgbWlwbWFwIHRyZWUuICBUaGlzIG1pcnJvcnMKKyAqIHRoZSBjb21wbGV0ZW5lc3MgdGVzdCBpbiBhIGxvdCBvZiB3YXlzLgorICoKKyAqIE5vdCBzdXJlIHdoZXRoZXIgSSB3YW50IHRvIHBhc3MgZ2xfdGV4dHVyZV9pbWFnZSBoZXJlLgorICovCitHTGJvb2xlYW4KK2ludGVsX21pcHRyZWVfbWF0Y2hfaW1hZ2Uoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZmFjZSwgR0x1aW50IGxldmVsKQoreworICAgLyogSW1hZ2VzIHdpdGggYm9yZGVycyBhcmUgbmV2ZXIgcHVsbGVkIGludG8gbWlwbWFwIHRyZWVzLiAKKyAgICAqLworICAgaWYgKGltYWdlLT5Cb3JkZXIgfHwKKyAgICAgICAoKGltYWdlLT5fQmFzZUZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQpICYmCisgICAgICAgICgoaW1hZ2UtPlRleE9iamVjdC0+V3JhcFMgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSB8fAorICAgICAgICAgKGltYWdlLT5UZXhPYmplY3QtPldyYXBUID09IEdMX0NMQU1QX1RPX0JPUkRFUikpKSkgCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGlmIChpbWFnZS0+SW50ZXJuYWxGb3JtYXQgIT0gbXQtPmludGVybmFsX2Zvcm1hdCB8fAorICAgICAgIGltYWdlLT5Jc0NvbXByZXNzZWQgIT0gbXQtPmNvbXByZXNzZWQpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGlmICghaW1hZ2UtPklzQ29tcHJlc3NlZCAmJgorICAgICAgICFtdC0+Y29tcHJlc3NlZCAmJgorICAgICAgIGltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXMgIT0gbXQtPmNwcCkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgLyogVGVzdCBpbWFnZSBkaW1lbnNpb25zIGFnYWluc3QgdGhlIGJhc2UgbGV2ZWwgaW1hZ2UgYWRqdXN0ZWQgZm9yCisgICAgKiBtaW5pZmljYXRpb24uICBUaGlzIHdpbGwgYWxzbyBjYXRjaCBpbWFnZXMgbm90IHByZXNlbnQgaW4gdGhlCisgICAgKiB0cmVlLCBjaGFuZ2VkIHRhcmdldHMsIGV0Yy4KKyAgICAqLworICAgaWYgKGltYWdlLT5XaWR0aCAhPSBtdC0+bGV2ZWxbbGV2ZWxdLndpZHRoIHx8CisgICAgICAgaW1hZ2UtPkhlaWdodCAhPSBtdC0+bGV2ZWxbbGV2ZWxdLmhlaWdodCB8fAorICAgICAgIGltYWdlLT5EZXB0aCAhPSBtdC0+bGV2ZWxbbGV2ZWxdLmRlcHRoKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCit2b2lkCitpbnRlbF9taXB0cmVlX3NldF9sZXZlbF9pbmZvKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisJCQkgICAgIEdMdWludCBsZXZlbCwKKwkJCSAgICAgR0x1aW50IG5yX2ltYWdlcywKKwkJCSAgICAgR0x1aW50IHgsIEdMdWludCB5LAorCQkJICAgICBHTHVpbnQgdywgR0x1aW50IGgsIEdMdWludCBkKQoreworICAgbXQtPmxldmVsW2xldmVsXS53aWR0aCA9IHc7CisgICBtdC0+bGV2ZWxbbGV2ZWxdLmhlaWdodCA9IGg7CisgICBtdC0+bGV2ZWxbbGV2ZWxdLmRlcHRoID0gZDsKKyAgIG10LT5sZXZlbFtsZXZlbF0ubGV2ZWxfb2Zmc2V0ID0gKHggKyB5ICogbXQtPnBpdGNoKSAqIG10LT5jcHA7CisgICBtdC0+bGV2ZWxbbGV2ZWxdLm5yX2ltYWdlcyA9IG5yX2ltYWdlczsKKworICAgREJHKCIlcyBsZXZlbCAlZCBzaXplOiAlZCwlZCwlZCBvZmZzZXQgJWQsJWQgKDB4JXgpXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgbGV2ZWwsIHcsIGgsIGQsIHgsIHksIG10LT5sZXZlbFtsZXZlbF0ubGV2ZWxfb2Zmc2V0KTsKKworICAgLyogTm90IHN1cmUgd2hlbiB0aGlzIHdvdWxkIGhhcHBlbiwgYnV0IGFueXdheTogCisgICAgKi8KKyAgIGlmIChtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldCkgeworICAgICAgZnJlZShtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldCk7CisgICAgICBtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldCA9IE5VTEw7CisgICB9CisKKyAgIGFzc2VydChucl9pbWFnZXMpOworCisgICBtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldCA9IG1hbGxvYyhucl9pbWFnZXMgKiBzaXplb2YoR0x1aW50KSk7CisgICBtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldFswXSA9IDA7Cit9CisKKworCit2b2lkCitpbnRlbF9taXB0cmVlX3NldF9pbWFnZV9vZmZzZXQoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKwkJCSAgICAgICBHTHVpbnQgbGV2ZWwsIEdMdWludCBpbWcsCisJCQkgICAgICAgR0x1aW50IHgsIEdMdWludCB5KQoreworICAgaWYgKGltZyA9PSAwICYmIGxldmVsID09IDApCisgICAgICBhc3NlcnQoeCA9PSAwICYmIHkgPT0gMCk7CisKKyAgIGFzc2VydChpbWcgPCBtdC0+bGV2ZWxbbGV2ZWxdLm5yX2ltYWdlcyk7CisKKyAgIG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0W2ltZ10gPSAoeCArIHkgKiBtdC0+cGl0Y2gpICogbXQtPmNwcDsKKworICAgREJHKCIlcyBsZXZlbCAlZCBpbWcgJWQgcG9zICVkLCVkIGltYWdlX29mZnNldCAleFxuIiwKKyAgICAgICBfX0ZVTkNUSU9OX18sIGxldmVsLCBpbWcsIHgsIHksIG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0W2ltZ10pOworfQorCisKKy8qIEFsdGhvdWdoIHdlIHVzZSB0aGUgaW1hZ2Vfb2Zmc2V0W10gYXJyYXkgdG8gc3RvcmUgcmVsYXRpdmUgb2Zmc2V0cworICogdG8gY3ViZSBmYWNlcywgTWVzYSBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhpcyBhbmQgZXhwZWN0cworICogZWFjaCBjdWJlIGZhY2UgdG8gYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGltYWdlLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBwcmVzZW50IHRoYXQgdmlldyB0byBtZXNhOgorICovCitjb25zdCBHTHVpbnQgKgoraW50ZWxfbWlwdHJlZV9kZXB0aF9vZmZzZXRzKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsIEdMdWludCBsZXZlbCkKK3sKKyAgIHN0YXRpYyBjb25zdCBHTHVpbnQgemVybyA9IDA7CisKKyAgIGlmIChtdC0+dGFyZ2V0ICE9IEdMX1RFWFRVUkVfM0QgfHwgbXQtPmxldmVsW2xldmVsXS5ucl9pbWFnZXMgPT0gMSkKKyAgICAgIHJldHVybiAmemVybzsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldDsKK30KKworCitHTHVpbnQKK2ludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisJCQkgICBHTHVpbnQgZmFjZSwgR0x1aW50IGxldmVsKQoreworICAgaWYgKG10LT50YXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpCisgICAgICByZXR1cm4gKG10LT5sZXZlbFtsZXZlbF0ubGV2ZWxfb2Zmc2V0ICsKKwkgICAgICBtdC0+bGV2ZWxbbGV2ZWxdLmltYWdlX29mZnNldFtmYWNlXSk7CisgICBlbHNlCisgICAgICByZXR1cm4gbXQtPmxldmVsW2xldmVsXS5sZXZlbF9vZmZzZXQ7Cit9CisKKworCisvKioKKyAqIE1hcCBhIHRleGltYWdlIGluIGEgbWlwbWFwIHRyZWUuCisgKiBccGFyYW0gcm93X3N0cmlkZSAgcmV0dXJucyByb3cgc3RyaWRlIGluIGJ5dGVzCisgKiBccGFyYW0gaW1hZ2Vfc3RyaWRlICByZXR1cm5zIGltYWdlIHN0cmlkZSBpbiBieXRlcyAoZm9yIDNEIHRleHR1cmVzKS4KKyAqIFxwYXJhbSBpbWFnZV9vZmZzZXRzIHBvaW50ZXIgdG8gYXJyYXkgb2YgcGl4ZWwgb2Zmc2V0cyBmcm9tIHRoZSByZXR1cm5lZAorICoJICBwb2ludGVyIHRvIGVhY2ggZGVwdGggaW1hZ2UKKyAqIFxyZXR1cm4gYWRkcmVzcyBvZiBtYXBwaW5nCisgKi8KK0dMdWJ5dGUgKgoraW50ZWxfbWlwdHJlZV9pbWFnZV9tYXAoc3RydWN0IGludGVsX2NvbnRleHQgKiBpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqIG10LAorICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgKiByb3dfc3RyaWRlLCBHTHVpbnQgKiBpbWFnZV9vZmZzZXRzKQoreworICAgREJHKCIlcyBcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmIChyb3dfc3RyaWRlKQorICAgICAgKnJvd19zdHJpZGUgPSBtdC0+cGl0Y2ggKiBtdC0+Y3BwOworCisgICBpZiAobXQtPnRhcmdldCA9PSBHTF9URVhUVVJFXzNEKSB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG10LT5sZXZlbFtsZXZlbF0uZGVwdGg7IGkrKykKKwkgaW1hZ2Vfb2Zmc2V0c1tpXSA9IG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0W2ldIC8gbXQtPmNwcDsKKyAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQobXQtPmxldmVsW2xldmVsXS5kZXB0aCA9PSAxKTsKKyAgICAgIGFzc2VydChtdC0+dGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVAgfHwKKwkgICAgIG10LT5sZXZlbFtsZXZlbF0uaW1hZ2Vfb2Zmc2V0WzBdID09IDApOworICAgICAgaW1hZ2Vfb2Zmc2V0c1swXSA9IDA7CisgICB9CisKKyAgIHJldHVybiAoaW50ZWxfcmVnaW9uX21hcChpbnRlbCwgbXQtPnJlZ2lvbikgKworICAgICAgICAgICBpbnRlbF9taXB0cmVlX2ltYWdlX29mZnNldChtdCwgZmFjZSwgbGV2ZWwpKTsKK30KKwordm9pZAoraW50ZWxfbWlwdHJlZV9pbWFnZV91bm1hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQpCit7CisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgaW50ZWxfcmVnaW9uX3VubWFwKGludGVsLCBtdC0+cmVnaW9uKTsKK30KKworCisKKy8qIFVwbG9hZCBkYXRhIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UuCisgKi8KK3ZvaWQKK2ludGVsX21pcHRyZWVfaW1hZ2VfZGF0YShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpkc3QsCisJCQkgR0x1aW50IGZhY2UsCisJCQkgR0x1aW50IGxldmVsLAorCQkJIHZvaWQgKnNyYywKKwkJCSBHTHVpbnQgc3JjX3Jvd19waXRjaCwKKwkJCSBHTHVpbnQgc3JjX2ltYWdlX3BpdGNoKQoreworICAgR0x1aW50IGRlcHRoID0gZHN0LT5sZXZlbFtsZXZlbF0uZGVwdGg7CisgICBHTHVpbnQgZHN0X29mZnNldCA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGRzdCwgZmFjZSwgbGV2ZWwpOworICAgY29uc3QgR0x1aW50ICpkc3RfZGVwdGhfb2Zmc2V0ID0gaW50ZWxfbWlwdHJlZV9kZXB0aF9vZmZzZXRzKGRzdCwgbGV2ZWwpOworICAgR0x1aW50IGk7CisgICBHTHVpbnQgaGVpZ2h0ID0gMDsKKworICAgREJHKCIlczogJWQvJWRcbiIsIF9fRlVOQ1RJT05fXywgZmFjZSwgbGV2ZWwpOworICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgIGhlaWdodCA9IGRzdC0+bGV2ZWxbbGV2ZWxdLmhlaWdodDsKKyAgICAgIGlmKGRzdC0+Y29tcHJlc3NlZCkKKwkgaGVpZ2h0ID0gKGhlaWdodCArIDMpIC8gNDsKKyAgICAgIGludGVsX3JlZ2lvbl9kYXRhKGludGVsLAorCQkJZHN0LT5yZWdpb24sCisJCQlkc3Rfb2Zmc2V0ICsgZHN0X2RlcHRoX29mZnNldFtpXSwgLyogZHN0X29mZnNldCAqLworCQkJMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRzdHgsIGRzdHkgKi8KKwkJCXNyYywKKwkJCXNyY19yb3dfcGl0Y2gsCisJCQkwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc291cmNlIHgsIHkgKi8KKwkJCWRzdC0+bGV2ZWxbbGV2ZWxdLndpZHRoLCBoZWlnaHQpOyAvKiB3aWR0aCwgaGVpZ2h0ICovCisKKyAgICAgIHNyYyArPSBzcmNfaW1hZ2VfcGl0Y2ggKiBkc3QtPmNwcDsKKyAgIH0KK30KKworZXh0ZXJuIEdMdWludCBpbnRlbF9jb21wcmVzc2VkX2FsaWdubWVudChHTGVudW0pOworLyogQ29weSBtaXBtYXAgaW1hZ2UgYmV0d2VlbiB0cmVlcworICovCit2b2lkCitpbnRlbF9taXB0cmVlX2ltYWdlX2NvcHkoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBmYWNlLCBHTHVpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpzcmMpCit7CisgICBHTHVpbnQgd2lkdGggPSBzcmMtPmxldmVsW2xldmVsXS53aWR0aDsKKyAgIEdMdWludCBoZWlnaHQgPSBzcmMtPmxldmVsW2xldmVsXS5oZWlnaHQ7CisgICBHTHVpbnQgZGVwdGggPSBzcmMtPmxldmVsW2xldmVsXS5kZXB0aDsKKyAgIEdMdWludCBkc3Rfb2Zmc2V0ID0gaW50ZWxfbWlwdHJlZV9pbWFnZV9vZmZzZXQoZHN0LCBmYWNlLCBsZXZlbCk7CisgICBHTHVpbnQgc3JjX29mZnNldCA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KHNyYywgZmFjZSwgbGV2ZWwpOworICAgY29uc3QgR0x1aW50ICpkc3RfZGVwdGhfb2Zmc2V0ID0gaW50ZWxfbWlwdHJlZV9kZXB0aF9vZmZzZXRzKGRzdCwgbGV2ZWwpOworICAgY29uc3QgR0x1aW50ICpzcmNfZGVwdGhfb2Zmc2V0ID0gaW50ZWxfbWlwdHJlZV9kZXB0aF9vZmZzZXRzKHNyYywgbGV2ZWwpOworICAgR0x1aW50IGk7CisKKyAgIGlmIChkc3QtPmNvbXByZXNzZWQpIHsKKyAgICAgICBHTHVpbnQgYWxpZ25tZW50ID0gaW50ZWxfY29tcHJlc3NlZF9hbGlnbm1lbnQoZHN0LT5pbnRlcm5hbF9mb3JtYXQpOworICAgICAgIGhlaWdodCA9IChoZWlnaHQgKyAzKSAvIDQ7CisgICAgICAgd2lkdGggPSAoKHdpZHRoICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpKTsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgIGludGVsX3JlZ2lvbl9jb3B5KGludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5yZWdpb24sIGRzdF9vZmZzZXQgKyBkc3RfZGVwdGhfb2Zmc2V0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPnJlZ2lvbiwgc3JjX29mZnNldCArIHNyY19kZXB0aF9vZmZzZXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfbWlwbWFwX3RyZWUuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX21pcG1hcF90cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1MzdkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX21pcG1hcF90cmVlLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5URUxfTUlQTUFQX1RSRUVfSAorI2RlZmluZSBJTlRFTF9NSVBNQVBfVFJFRV9ICisKKyNpbmNsdWRlICJpbnRlbF9yZWdpb25zLmgiCisKKy8qIEEgbGF5ZXIgb24gdG9wIG9mIHRoZSBpbnRlbF9yZWdpb25zIGNvZGUgd2hpY2ggYWRkczoKKyAqCisgKiAtIENvZGUgdG8gc2l6ZSBhbmQgbGF5b3V0IGEgcmVnaW9uIHRvIGhvbGQgYSBzZXQgb2YgbWlwbWFwcy4KKyAqIC0gUXVlcnkgdG8gZGV0ZXJtaW5lIGlmIGEgbmV3IGltYWdlIGZpdHMgaW4gYW4gZXhpc3RpbmcgdHJlZS4KKyAqIC0gTW9yZSByZWZjb3VudGluZyAKKyAqICAgICAtIG1heWJlIGFibGUgdG8gcmVtb3ZlIHJlZmNvdW50aW5nIGZyb20gaW50ZWxfcmVnaW9uPworICogLSA/CisgKgorICogVGhlIGZpeGVkIG1pcG1hcCBsYXlvdXQgb2YgaW50ZWwgaGFyZHdhcmUgd2hlcmUgb25lIG9mZnNldAorICogc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiBhbGwgaW1hZ2VzIGluIGEgbWlwbWFwIGhpZXJhY2h5CisgKiBjb21wbGljYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgR0wgdGV4dHVyZSBpbWFnZSBjb21tYW5kcywKKyAqIGNvbXBhcmVkIHRvIGhhcmR3YXJlIHdoZXJlIGVhY2ggaW1hZ2UgaXMgc3BlY2lmaWVkIHdpdGggYW4KKyAqIGluZGVwZW5kZW50IG9mZnNldC4KKyAqCisgKiBJbiBhbiBpZGVhbCB3b3JsZCwgZWFjaCB0ZXh0dXJlIG9iamVjdCB3b3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYQorICogc2luZ2xlIGJ1Zm1nciBidWZmZXIgb3IgMmQgaW50ZWxfcmVnaW9uLCBhbmQgYWxsIHRoZSBpbWFnZXMgd2l0aGluCisgKiB0aGUgdGV4dHVyZSBvYmplY3Qgd291bGQgc2xvdCBpbnRvIHRoZSB0cmVlIGFzIHRoZXkgYXJyaXZlLiAgVGhlCisgKiByZWFsaXR5IGNhbiBiZSBhIGxpdHRsZSBtZXNzaWVyLCBhcyBpbWFnZXMgY2FuIGFycml2ZSBmcm9tIHRoZSB1c2VyCisgKiB3aXRoIHNpemVzIHRoYXQgZG9uJ3QgZml0IGluIHRoZSBleGlzdGluZyB0cmVlLCBvciBpbiBhbiBvcmRlcgorICogd2hlcmUgdGhlIHRyZWUgbGF5b3V0IGNhbm5vdCBiZSBndWVzc2VkIGltbWVkaWF0ZWx5LiAgCisgKiAKKyAqIFRoaXMgc3RydWN0dXJlIGVuY29kZXMgYW4gaWRlYWxpemVkIG1pcG1hcCB0cmVlLiAgVGhlIEdMIGltYWdlCisgKiBjb21tYW5kcyBidWlsZCB0aGVzZSB3aGVyZSBwb3NzaWJsZSwgb3RoZXJ3aXNlIHN0b3JlIHRoZSBpbWFnZXMgaW4KKyAqIHRlbXBvcmFyeSBzeXN0ZW0gYnVmZmVycy4KKyAqLworCisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBsb2NhdGlvbiBvZiBlYWNoIHRleHR1cmUgaW1hZ2Ugd2l0aGluIGEgdGV4dHVyZSByZWdpb24uCisgKi8KK3N0cnVjdCBpbnRlbF9taXBtYXBfbGV2ZWwKK3sKKyAgIC8qKgorICAgICogQnl0ZSBvZmZzZXQgdG8gdGhlIGJhc2Ugb2YgdGhpcyBsZXZlbC4KKyAgICAqCisgICAgKiBUaGlzIGlzIHVzZWQgZm9yIG1pcG1hcCBsZXZlbHMgb2YgMUQvMkQvM0QgdGV4dHVyZXMuICBIb3dldmVyLCBDVUJFCisgICAgKiBsYXlvdXRzIHNwcmVhZCBpbWFnZXMgYXJvdW5kIHRoZSB3aG9sZSB0cmVlLCBzbyB0aGUgbGV2ZWwgb2Zmc2V0IGlzCisgICAgKiBhbHdheXMgemVybyBpbiB0aGF0IGNhc2UuCisgICAgKi8KKyAgIEdMdWludCBsZXZlbF9vZmZzZXQ7CisgICBHTHVpbnQgd2lkdGg7CisgICBHTHVpbnQgaGVpZ2h0OworICAgLyoqIERlcHRoIG9mIHRoZSBtaXBtYXAgYXQgdGhpcyBsZXZlbDogMSBmb3IgMUQvMkQvQ1VCRSwgbiBmb3IgM0QuICovCisgICBHTHVpbnQgZGVwdGg7CisgICAvKiogTnVtYmVyIG9mIGltYWdlcyBhdCB0aGlzIGxldmVsOiAxIGZvciAxRC8yRCwgNiBmb3IgQ1VCRSwgZGVwdGggZm9yIDNEICovCisgICBHTHVpbnQgbnJfaW1hZ2VzOworCisgICAvKioKKyAgICAqIEJ5dGUgb2Zmc2V0IGZyb20gbGV2ZWxfb2Zmc2V0IHRvIHRoZSBpbWFnZSBmb3IgZWFjaCBjdWJlIGZhY2Ugb3IgZGVwdGgKKyAgICAqIGxldmVsLgorICAgICoKKyAgICAqIFByZXR0eSBtdWNoIGhhdmUgdG8gYWNjZXB0IHRoYXQgaGFyZHdhcmUgZm9ybWF0cworICAgICogYXJlIGdvaW5nIHRvIGJlIHNvIGRpdmVyc2UgdGhhdCB0aGVyZSBpcyBubyB1bmlmaWVkIHdheSB0bworICAgICogY29tcHV0ZSB0aGUgb2Zmc2V0cyBvZiBkZXB0aC9jdWJlIGltYWdlcyB3aXRoaW4gYSBtaXBtYXAgbGV2ZWwsCisgICAgKiBzbyBoYXZlIHRvIHN0b3JlIHRoZW0gYXMgYSBsb29rdXAgdGFibGUuCisgICAgKi8KKyAgIEdMdWludCAqaW1hZ2Vfb2Zmc2V0OworfTsKKworc3RydWN0IGludGVsX21pcG1hcF90cmVlCit7CisgICAvKiBFZmZlY3RpdmVseSB0aGUga2V5OgorICAgICovCisgICBHTGVudW0gdGFyZ2V0OworICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdDsKKworICAgR0x1aW50IGZpcnN0X2xldmVsOworICAgR0x1aW50IGxhc3RfbGV2ZWw7CisKKyAgIEdMdWludCB3aWR0aDAsIGhlaWdodDAsIGRlcHRoMDsgLyoqPCBMZXZlbCB6ZXJvIGltYWdlIGRpbWVuc2lvbnMgKi8KKyAgIEdMdWludCBjcHA7CisgICBHTGJvb2xlYW4gY29tcHJlc3NlZDsKKworICAgLyogRGVyaXZlZCBmcm9tIHRoZSBhYm92ZToKKyAgICAqLworICAgR0x1aW50IHBpdGNoOworICAgR0x1aW50IGRlcHRoX3BpdGNoOyAgICAgICAgICAvKiBwZXItaW1hZ2Ugb24gaTk0NT8gKi8KKyAgIEdMdWludCB0b3RhbF9oZWlnaHQ7CisKKyAgIC8qIEluY2x1ZGVzIGltYWdlIG9mZnNldCB0YWJsZXM6CisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfbGV2ZWwgbGV2ZWxbTUFYX1RFWFRVUkVfTEVWRUxTXTsKKworICAgLyogVGhlIGRhdGEgaXMgaGVsZCBoZXJlOgorICAgICovCisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb247CisKKyAgIC8qIFRoZXNlIGFyZSBhbHNvIHJlZmNvdW50ZWQ6CisgICAgKi8KKyAgIEdMdWludCByZWZjb3VudDsKK307CisKKworCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmludGVsX21pcHRyZWVfY3JlYXRlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGZpcnN0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGFzdF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHdpZHRoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGhlaWdodDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXB0aDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBjcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBjb21wcmVzc19ieXRlKTsKKworc3RydWN0IGludGVsX21pcG1hcF90cmVlICoKK2ludGVsX21pcHRyZWVfY3JlYXRlX2Zvcl9yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJCUdMZW51bSB0YXJnZXQsCisJCQkJR0xlbnVtIGludGVybmFsX2Zvcm1hdCwKKwkJCQlHTHVpbnQgZmlyc3RfbGV2ZWwsCisJCQkJR0x1aW50IGxhc3RfbGV2ZWwsCisJCQkJc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uLAorCQkJCUdMdWludCBkZXB0aDAsCisJCQkJR0x1aW50IGNvbXByZXNzX2J5dGUpOworCitpbnQgaW50ZWxfbWlwdHJlZV9waXRjaF9hbGlnbiAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisJCQkgICAgICAgaW50IHBpdGNoKTsKKwordm9pZCBpbnRlbF9taXB0cmVlX3JlZmVyZW5jZShzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKipkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqc3JjKTsKKwordm9pZCBpbnRlbF9taXB0cmVlX3JlbGVhc2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICoqbXQpOworCisvKiBDaGVjayBpZiBhbiBpbWFnZSBmaXRzIGFuIGV4aXN0aW5nIG1pcG1hcCB0cmVlIGxheW91dAorICovCitHTGJvb2xlYW4gaW50ZWxfbWlwdHJlZV9tYXRjaF9pbWFnZShzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGZhY2UsIEdMdWludCBsZXZlbCk7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gaW1hZ2Ugd2l0aGluIGEgdHJlZS4gIFJldHVybiBpbWFnZSBzdHJpZGUgYXMKKyAqIHdlbGwuCisgKi8KK0dMdWJ5dGUgKmludGVsX21pcHRyZWVfaW1hZ2VfbWFwKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCAqIHJvd19zdHJpZGUsIEdMdWludCAqIGltYWdlX3N0cmlkZSk7CisKK3ZvaWQgaW50ZWxfbWlwdHJlZV9pbWFnZV91bm1hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCk7CisKKworLyogUmV0dXJuIHRoZSBsaW5lYXIgb2Zmc2V0IG9mIGFuIGltYWdlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAqIHRyZWU6CisgKi8KK0dMdWludCBpbnRlbF9taXB0cmVlX2ltYWdlX29mZnNldChzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBmYWNlLCBHTHVpbnQgbGV2ZWwpOworCisvKiBSZXR1cm4gcG9pbnRlcnMgdG8gZWFjaCAyZCBzbGljZSB3aXRoaW4gYW4gaW1hZ2UuICBJbmRleGVkIGJ5IGRlcHRoCisgKiB2YWx1ZS4KKyAqLworY29uc3QgR0x1aW50ICppbnRlbF9taXB0cmVlX2RlcHRoX29mZnNldHMoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsZXZlbCk7CisKKwordm9pZCBpbnRlbF9taXB0cmVlX3NldF9sZXZlbF9pbmZvKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBucl9pbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHgsIEdMdWludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB3LCBHTHVpbnQgaCwgR0x1aW50IGQpOworCit2b2lkIGludGVsX21pcHRyZWVfc2V0X2ltYWdlX29mZnNldChzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGltZywgR0x1aW50IHgsIEdMdWludCB5KTsKKworCisvKiBVcGxvYWQgYW4gaW1hZ2UgaW50byBhIHRyZWUKKyAqLwordm9pZCBpbnRlbF9taXB0cmVlX2ltYWdlX2RhdGEoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBzcmNfcm93X3BpdGNoLCBHTHVpbnQgc3JjX2ltYWdlX3BpdGNoKTsKKworLyogQ29weSBhbiBpbWFnZSBiZXR3ZWVuIHR3byB0cmVlcworICovCit2b2lkIGludGVsX21pcHRyZWVfaW1hZ2VfY29weShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBmYWNlLCBHTHVpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKnNyYyk7CisKKy8qIGk5MTVfbWlwbWFwX3RyZWUuYzoKKyAqLworR0xib29sZWFuIGk5MTVfbWlwdHJlZV9sYXlvdXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCk7CitHTGJvb2xlYW4gaTk0NV9taXB0cmVlX2xheW91dChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKK0dMYm9vbGVhbiBicndfbWlwdHJlZV9sYXlvdXQoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcGl4ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE3ODY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcGl4ZWwuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zYWxsb2MKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZW51bXMuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKKworI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9waXhlbC5oIgorI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKworI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfUElYRUwKKworc3RhdGljIEdMZW51bQorZWZmZWN0aXZlX2Z1bmMoR0xlbnVtIGZ1bmMsIEdMYm9vbGVhbiBzcmNfYWxwaGFfaXNfb25lKQoreworICAgaWYgKHNyY19hbHBoYV9pc19vbmUpIHsKKyAgICAgIGlmIChmdW5jID09IEdMX1NSQ19BTFBIQSkKKwkgcmV0dXJuIEdMX09ORTsKKyAgICAgIGlmIChmdW5jID09IEdMX09ORV9NSU5VU19TUkNfQUxQSEEpCisJIHJldHVybiBHTF9aRVJPOworICAgfQorCisgICByZXR1cm4gZnVuYzsKK30KKworLyoqCisgKiBDaGVjayBpZiBhbnkgZnJhZ21lbnQgb3BlcmF0aW9ucyBhcmUgaW4gZWZmZWN0IHdoaWNoIG1pZ2h0IGVmZmVjdAorICogZ2xEcmF3L0NvcHlQaXhlbHMuCisgKi8KK0dMYm9vbGVhbgoraW50ZWxfY2hlY2tfYmxpdF9mcmFnbWVudF9vcHMoR0xjb250ZXh0ICogY3R4LCBHTGJvb2xlYW4gc3JjX2FscGhhX2lzX29uZSkKK3sKKyAgIGlmIChjdHgtPk5ld1N0YXRlKQorICAgICAgX21lc2FfdXBkYXRlX3N0YXRlKGN0eCk7CisKKyAgIGlmIChjdHgtPkZyYWdtZW50UHJvZ3JhbS5fRW5hYmxlZCkgeworICAgICAgREJHKCJmYWxsYmFjayBkdWUgdG8gZnJhZ21lbnQgcHJvZ3JhbVxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlmIChjdHgtPkNvbG9yLkJsZW5kRW5hYmxlZCAmJgorICAgICAgIChlZmZlY3RpdmVfZnVuYyhjdHgtPkNvbG9yLkJsZW5kU3JjUkdCLCBzcmNfYWxwaGFfaXNfb25lKSAhPSBHTF9PTkUgfHwKKwllZmZlY3RpdmVfZnVuYyhjdHgtPkNvbG9yLkJsZW5kRHN0UkdCLCBzcmNfYWxwaGFfaXNfb25lKSAhPSBHTF9aRVJPIHx8CisJY3R4LT5Db2xvci5CbGVuZEVxdWF0aW9uUkdCICE9IEdMX0ZVTkNfQUREIHx8CisJZWZmZWN0aXZlX2Z1bmMoY3R4LT5Db2xvci5CbGVuZFNyY0EsIHNyY19hbHBoYV9pc19vbmUpICE9IEdMX09ORSB8fAorCWVmZmVjdGl2ZV9mdW5jKGN0eC0+Q29sb3IuQmxlbmREc3RBLCBzcmNfYWxwaGFfaXNfb25lKSAhPSBHTF9aRVJPIHx8CisJY3R4LT5Db2xvci5CbGVuZEVxdWF0aW9uQSAhPSBHTF9GVU5DX0FERCkpIHsKKyAgICAgIERCRygiZmFsbGJhY2sgZHVlIHRvIGJsZW5kXG4iKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzKSB7CisgICAgICBEQkcoImZhbGxiYWNrIGR1ZSB0byB0ZXh0dXJpbmdcbiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoIShjdHgtPkNvbG9yLkNvbG9yTWFza1swXSAmJgorCSBjdHgtPkNvbG9yLkNvbG9yTWFza1sxXSAmJgorCSBjdHgtPkNvbG9yLkNvbG9yTWFza1syXSAmJgorCSBjdHgtPkNvbG9yLkNvbG9yTWFza1szXSkpIHsKKyAgICAgIERCRygiZmFsbGJhY2sgZHVlIHRvIGNvbG9yIG1hc2tpbmdcbiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQpIHsKKyAgICAgIERCRygiZmFsbGJhY2sgZHVlIHRvIGFscGhhXG4iKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKGN0eC0+RGVwdGguVGVzdCkgeworICAgICAgREJHKCJmYWxsYmFjayBkdWUgdG8gZGVwdGggdGVzdFxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlmIChjdHgtPkZvZy5FbmFibGVkKSB7CisgICAgICBEQkcoImZhbGxiYWNrIGR1ZSB0byBmb2dcbiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoY3R4LT5fSW1hZ2VUcmFuc2ZlclN0YXRlKSB7CisgICAgICBEQkcoImZhbGxiYWNrIGR1ZSB0byBpbWFnZSB0cmFuc2ZlclxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlmIChjdHgtPlN0ZW5jaWwuRW5hYmxlZCkgeworICAgICAgREJHKCJmYWxsYmFjayBkdWUgdG8gaW1hZ2Ugc3RlbmNpbFxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlmIChjdHgtPlNjaXNzb3IuRW5hYmxlZCkgeworICAgICAgLyogWFhYIE5vdGU6IFNjaXNzb3IgY291bGQgYmUgZG9uZSB3aXRoIHRoZSBibGl0dGVyICovCisgICAgICBEQkcoImZhbGxiYWNrIGR1ZSB0byBpbWFnZSBzY2lzc29yXG4iKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKGN0eC0+UmVuZGVyTW9kZSAhPSBHTF9SRU5ERVIpIHsKKyAgICAgIERCRygiZmFsbGJhY2sgZHVlIHRvIHJlbmRlciBtb2RlXG4iKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKworR0xib29sZWFuCitpbnRlbF9jaGVja19tZXRhX3RleF9mcmFnbWVudF9vcHMoR0xjb250ZXh0ICogY3R4KQoreworICAgaWYgKGN0eC0+TmV3U3RhdGUpCisgICAgICBfbWVzYV91cGRhdGVfc3RhdGUoY3R4KTsKKworICAgLyogU29tZSBvZiBfSW1hZ2VUcmFuc2ZlclN0YXRlIChzY2FsZSwgYmlhcykgY291bGQgYmUgZG9uZSB3aXRoCisgICAgKiBmcmFnbWVudCBwcm9ncmFtcyBvbiBpOTE1LgorICAgICovCisgICByZXR1cm4gIShjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgfHwgY3R4LT5Gb2cuRW5hYmxlZCB8fCAgICAgLyogbm90IGRvbmUgeWV0ICovCisgICAgICAgICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRVbml0cyB8fCBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fRW5hYmxlZCk7Cit9CisKKy8qIFRoZSBpbnRlbF9yZWdpb24gc3RydWN0IGRvZXNuJ3QgcmVhbGx5IGRvIGVub3VnaCB0byBjYXB0dXJlIHRoZQorICogZm9ybWF0IG9mIHRoZSBwaXhlbHMgaW4gdGhlIHJlZ2lvbi4gIEZvciBub3cgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdAorICogdGhlIHJlZ2lvbiBpcyBhIGRpc3BsYXkgc3VyZmFjZSBhbmQgaGVuY2UgaXMgZWl0aGVyIEFSR0I4ODg4IG9yCisgKiBSR0I1NjUuCisgKiBYWFggRkJPOiBJZiB3ZSdkIHBhc3MgaW4gdGhlIGludGVsX3JlbmRlcmJ1ZmZlciBpbnN0ZWFkIG9mIHJlZ2lvbiwgd2UnZAorICoga25vdyB0aGUgYnVmZmVyJ3MgcGl4ZWwgZm9ybWF0LgorICoKKyAqIFxwYXJhbSBmb3JtYXQgIGFzIGdpdmVuIHRvIGdsRHJhdy9SZWFkUGl4ZWxzCisgKiBccGFyYW0gdHlwZSAgYXMgZ2l2ZW4gdG8gZ2xEcmF3L1JlYWRQaXhlbHMKKyAqLworR0xib29sZWFuCitpbnRlbF9jaGVja19ibGl0X2Zvcm1hdChzdHJ1Y3QgaW50ZWxfcmVnaW9uICogcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICBpZiAocmVnaW9uLT5jcHAgPT0gNCAmJgorICAgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViB8fAorICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpICYmIGZvcm1hdCA9PSBHTF9CR1JBKSB7CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIH0KKworICAgaWYgKHJlZ2lvbi0+Y3BwID09IDIgJiYKKyAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAmJiBmb3JtYXQgPT0gR0xfQkdSKSB7CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIH0KKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgZm9ybWF0IGZvciBibGl0IChjcHAgJWQsIHR5cGUgJXMgZm9ybWF0ICVzKVxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZWdpb24tPmNwcCwKKyAgICAgICAgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodHlwZSksIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKGZvcm1hdCkpOworCisgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKKwordm9pZAoraW50ZWxJbml0UGl4ZWxGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKK3sKKyAgIGZ1bmN0aW9ucy0+QWNjdW0gPSBfc3dyYXN0X0FjY3VtOworICAgaWYgKCFnZXRlbnYoIklOVEVMX05PX0JMSVQiKSkgeworICAgICAgZnVuY3Rpb25zLT5CaXRtYXAgPSBpbnRlbEJpdG1hcDsKKyAgICAgIGZ1bmN0aW9ucy0+Q29weVBpeGVscyA9IGludGVsQ29weVBpeGVsczsKKyNpZmRlZiBJOTE1CisgICAgICBmdW5jdGlvbnMtPlJlYWRQaXhlbHMgPSBpbnRlbFJlYWRQaXhlbHM7CisgICAgICBmdW5jdGlvbnMtPkRyYXdQaXhlbHMgPSBpbnRlbERyYXdQaXhlbHM7CisjZW5kaWYKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3BpeGVsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODk5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5URUxfUElYRUxfSAorI2RlZmluZSBJTlRFTF9QSVhFTF9ICisKKyNpbmNsdWRlICJtdHlwZXMuaCIKKwordm9pZCBpbnRlbEluaXRQaXhlbEZ1bmNzKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKTsKKworR0xib29sZWFuIGludGVsX2NoZWNrX2JsaXRfZnJhZ21lbnRfb3BzKEdMY29udGV4dCAqIGN0eCwKKwkJCQkJR0xib29sZWFuIHNyY19hbHBoYV9pc19vbmUpOworCitHTGJvb2xlYW4gaW50ZWxfY2hlY2tfbWV0YV90ZXhfZnJhZ21lbnRfb3BzKEdMY29udGV4dCAqIGN0eCk7CisKK0dMYm9vbGVhbiBpbnRlbF9jaGVja19ibGl0X2Zvcm1hdChzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpOworCisKK3ZvaWQgaW50ZWxSZWFkUGl4ZWxzKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNrLAorICAgICAgICAgICAgICAgICAgICAgR0x2b2lkICogcGl4ZWxzKTsKKwordm9pZCBpbnRlbERyYXdQaXhlbHMoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKiBwaXhlbHMpOworCit2b2lkIGludGVsQ29weVBpeGVscyhHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBzcmN4LCBHTGludCBzcmN5LAorICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBkZXN0eCwgR0xpbnQgZGVzdHksIEdMZW51bSB0eXBlKTsKKwordm9pZCBpbnRlbEJpdG1hcChHTGNvbnRleHQgKiBjdHgsCisJCSBHTGludCB4LCBHTGludCB5LAorCQkgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisJCSBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKKwkJIGNvbnN0IEdMdWJ5dGUgKiBwaXhlbHMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcGl4ZWxfYml0bWFwLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbF9iaXRtYXAuYwpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsX2JpdG1hcC5jCnJlbmFtZSB0byBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbF9iaXRtYXAuYwppbmRleCA0MjFmY2M1Li43ZTBkMjBlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTY1L2ludGVsX3BpeGVsX2JpdG1hcC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3BpeGVsX2JpdG1hcC5jCkBAIC00MSw3ICs0MSw5IEBACiAjaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgogI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKICNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgotCisjaW5jbHVkZSAiaW50ZWxfYnVmZmVycy5oIgorI2luY2x1ZGUgImludGVsX3BpeGVsLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnLmgiCiAKIAogI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfUElYRUwKQEAgLTkxLDExICs5Myw2IEBACiAgICBkZXN0W2JpdC84XSB8PSAxIDw8IChiaXQgJSA4KTsKIH0KIAotc3RhdGljIGludCBhbGlnbihpbnQgeCwgaW50IGFsaWduKQotewotICAgcmV0dXJuICh4ICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKLX0KLQogLyogRXh0cmFjdCBhIHJlY3RhbmdsZSdzIHdvcnRoIG9mIGRhdGEgZnJvbSB0aGUgYml0bWFwLiAgQ2FsbGVkCiAgKiBwZXItY2xpcHJlY3QuCiAgKi8KQEAgLTE0Nyw3ICsxNDQsNyBAQAogICAgICAgfQogCiAgICAgICBpZiAocm93X2FsaWduKQotCSBiaXQgPSAoYml0ICsgcm93X2FsaWduIC0gMSkgJiB+KHJvd19hbGlnbiAtIDEpOworCSBiaXQgPSBBTElHTihiaXQsIHJvd19hbGlnbik7CiAgICB9CiAKICAgIHJldHVybiBjb3VudDsKQEAgLTE2OCwxMiArMTY1LDEyIEBACiB7CiAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CiAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkc3QgPSBpbnRlbF9kcmF3YnVmX3JlZ2lvbihpbnRlbCk7Ci0gICAKLSAgIHVuaW9uIHsKLSAgICAgIEdMdWludCB1aTsKLSAgICAgIEdMdWJ5dGUgdWJbNF07Ci0gICB9IGNvbG9yOworICAgR0xmbG9hdCB0bXBDb2xvcls0XTsKKyAgIEdMdWJ5dGUgdWJjb2xvcls0XTsKKyAgIEdMdWludCBjb2xvcjg4ODgsIGNvbG9yNTY1OwogCisgICBpZiAoIWRzdCkKKyAgICAgICByZXR1cm4gR0xfRkFMU0U7CiAKICAgIGlmICh1bnBhY2stPkJ1ZmZlck9iai0+TmFtZSkgewogICAgICAgYml0bWFwID0gbWFwX3BibyhjdHgsIHdpZHRoLCBoZWlnaHQsIHVucGFjaywgYml0bWFwKTsKQEAgLTE4MSwxNCArMTc4LDIzIEBACiAJIHJldHVybiBHTF9UUlVFOwkvKiBldmVuIHRob3VnaCB0aGlzIGlzIGFuIGVycm9yLCB3ZSdyZSBkb25lICovCiAgICB9CiAKLSAgIFVOQ0xBTVBFRF9GTE9BVF9UT19DSEFOKGNvbG9yLnViWzBdLCBjdHgtPkN1cnJlbnQuUmFzdGVyQ29sb3JbMl0pOwotICAgVU5DTEFNUEVEX0ZMT0FUX1RPX0NIQU4oY29sb3IudWJbMV0sIGN0eC0+Q3VycmVudC5SYXN0ZXJDb2xvclsxXSk7Ci0gICBVTkNMQU1QRURfRkxPQVRfVE9fQ0hBTihjb2xvci51YlsyXSwgY3R4LT5DdXJyZW50LlJhc3RlckNvbG9yWzBdKTsKLSAgIFVOQ0xBTVBFRF9GTE9BVF9UT19DSEFOKGNvbG9yLnViWzNdLCBjdHgtPkN1cnJlbnQuUmFzdGVyQ29sb3JbM10pOworICAgQ09QWV80Vih0bXBDb2xvciwgY3R4LT5DdXJyZW50LlJhc3RlckNvbG9yKTsKKworICAgaWYgKE5FRURfU0VDT05EQVJZX0NPTE9SKGN0eCkpIHsKKyAgICAgICBBRERfM1YodG1wQ29sb3IsIHRtcENvbG9yLCBjdHgtPkN1cnJlbnQuUmFzdGVyU2Vjb25kYXJ5Q29sb3IpOworICAgfQorCisgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJjb2xvclswXSwgdG1wQ29sb3JbMF0pOworICAgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKHViY29sb3JbMV0sIHRtcENvbG9yWzFdKTsKKyAgIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURSh1YmNvbG9yWzJdLCB0bXBDb2xvclsyXSk7CisgICBVTkNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJjb2xvclszXSwgdG1wQ29sb3JbM10pOworCisgICBjb2xvcjg4ODggPSBJTlRFTF9QQUNLQ09MT1I4ODg4KHViY29sb3JbMF0sIHViY29sb3JbMV0sIHViY29sb3JbMl0sIHViY29sb3JbM10pOworICAgY29sb3I1NjUgPSBJTlRFTF9QQUNLQ09MT1I1NjUodWJjb2xvclswXSwgdWJjb2xvclsxXSwgdWJjb2xvclsyXSk7CiAKICAgIC8qIERvZXMgem9vbSBhcHBseSB0byBiaXRtYXBzPwogICAgICovCi0gICBpZiAoIWludGVsX2NoZWNrX2JsaXRfZnJhZ21lbnRfb3BzKGN0eCkgfHwKKyAgIGlmICghaW50ZWxfY2hlY2tfYmxpdF9mcmFnbWVudF9vcHMoY3R4LCB0bXBDb2xvclszXSA9PSAxLjBGKSB8fAogICAgICAgIGN0eC0+UGl4ZWwuWm9vbVggIT0gMS4wRiB8fCAKICAgICAgICBjdHgtPlBpeGVsLlpvb21ZICE9IDEuMEYpCiAgICAgICByZXR1cm4gR0xfRkFMU0U7CkBAIC0yMjYsMTAgKzIzMiwxMCBAQAogICAgICAgZHN0eSA9IGRQcml2LT55ICsgKGRQcml2LT5oIC0gZHN0eSAtIGhlaWdodCk7ICAKICAgICAgIGRzdHggPSBkUHJpdi0+eCArIGRzdHg7CiAKLSAgICAgIGRlc3RfcmVjdC54MSA9IGRzdHg7Ci0gICAgICBkZXN0X3JlY3QueTEgPSBkc3R5OwotICAgICAgZGVzdF9yZWN0LngyID0gZHN0eCArIHdpZHRoOwotICAgICAgZGVzdF9yZWN0LnkyID0gZHN0eSArIGhlaWdodDsKKyAgICAgIGRlc3RfcmVjdC54MSA9IGRzdHggPCAwID8gMCA6IGRzdHg7CisgICAgICBkZXN0X3JlY3QueTEgPSBkc3R5IDwgMCA/IDAgOiBkc3R5OworICAgICAgZGVzdF9yZWN0LngyID0gZHN0eCArIHdpZHRoIDwgMCA/IDAgOiBkc3R4ICsgd2lkdGg7CisgICAgICBkZXN0X3JlY3QueTIgPSBkc3R5ICsgaGVpZ2h0IDwgMCA/IDAgOiBkc3R5ICsgaGVpZ2h0OwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CiAgICAgICAgICBkcm1fY2xpcF9yZWN0X3QgcmVjdDsKQEAgLTI1OSw3ICsyNjUsNyBAQAogCSAgICBmb3IgKHB4ID0gMDsgcHggPCBib3hfdzsgcHggKz0gRFgpIHsgCiAJICAgICAgIGludCBoID0gTUlOMihEWSwgYm94X2ggLSBweSk7CiAJICAgICAgIGludCB3ID0gTUlOMihEWCwgYm94X3cgLSBweCk7IAotCSAgICAgICBHTHVpbnQgc3ogPSBhbGlnbihhbGlnbih3LDgpICogaCwgNjQpLzg7CisJICAgICAgIEdMdWludCBzeiA9IEFMSUdOKEFMSUdOKHcsOCkgKiBoLCA2NCkvODsKIAkgICAgICAgR0xlbnVtIGxvZ2ljX29wID0gY3R4LT5Db2xvci5Db2xvckxvZ2ljT3BFbmFibGVkID8KIAkJICBjdHgtPkNvbG9yLkxvZ2ljT3AgOiBHTF9DT1BZOwogCkBAIC0yODMsMTEgKzI4OSwxMSBAQAogCQkJCQkJICBkc3QtPmNwcCwKIAkJCQkJCSAgKEdMdWJ5dGUgKilzdGlwcGxlLCAKIAkJCQkJCSAgc3osCi0JCQkJCQkgIGNvbG9yLnVpLAorCQkJCQkJICAoZHN0LT5jcHAgPT0gMikgPyBjb2xvcjU2NSA6IGNvbG9yODg4OCwKIAkJCQkJCSAgZHN0LT5waXRjaCwKIAkJCQkJCSAgZHN0LT5idWZmZXIsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIGRzdC0+dGlsZWQsCisJCQkJCQkgIGRzdC0+dGlsaW5nLAogCQkJCQkJICByZWN0LngxICsgcHgsCiAJCQkJCQkgIHJlY3QueTIgLSAocHkgKyBoKSwKIAkJCQkJCSAgdywgaCwKQEAgLTI5NSwxMCArMzAxLDggQEAKIAkgICAgfSAKIAkgfSAKICAgICAgIH0KLSAgICAgIGludGVsLT5uZWVkX2ZsdXNoID0gR0xfVFJVRTsKLSAgIG91dDoKLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CiAgICB9CitvdXQ6CiAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcGl4ZWxfY29weS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcGl4ZWxfY29weS5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHNyYy9tZXNhL2RyaXZlcnMvZHJpL2k5NjUvaW50ZWxfcGl4ZWxfY29weS5jCnJlbmFtZSB0byBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9waXhlbF9jb3B5LmMKaW5kZXggNThkYzQ5NS4uMzA5M2NjZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaTk2NS9pbnRlbF9waXhlbF9jb3B5LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcGl4ZWxfY29weS5jCkBAIC0yOCwxOCArMjgsMjEgQEAKICNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgImVudW1zLmgiCiAjaW5jbHVkZSAiaW1hZ2UuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgogI2luY2x1ZGUgIm10eXBlcy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgInN0YXRlLmgiCiAjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgogCiAjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCiAjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgogI2luY2x1ZGUgImludGVsX2lvY3RsLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJzLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmxpdC5oIgogI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKyNpbmNsdWRlICJpbnRlbF9waXhlbC5oIgogCisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19QSVhFTAogCiBzdGF0aWMgc3RydWN0IGludGVsX3JlZ2lvbiAqCiBjb3B5cGl4X3NyY19yZWdpb24oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGVudW0gdHlwZSkKQEAgLTY4LDIwICs3MSwyMCBAQAogfQogCiAKLQotCiAvKioKICAqIENoZWNrIGlmIGFueSBmcmFnbWVudCBvcGVyYXRpb25zIGFyZSBpbiBlZmZlY3Qgd2hpY2ggbWlnaHQgZWZmZWN0Ci0gKiBnbERyYXcvQ29weVBpeGVscy4KKyAqIGdsQ29weVBpeGVscy4gIERpZmZlcnMgZnJvbSBpbnRlbF9jaGVja19ibGl0X2ZyYWdtZW50X29wcyBpbiB0aGF0CisgKiB3ZSBhbGxvdyBTY2lzc29yLgogICovCi1HTGJvb2xlYW4KLWludGVsX2NoZWNrX2JsaXRfZnJhZ21lbnRfb3BzKEdMY29udGV4dCAqIGN0eCkKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX2NoZWNrX2NvcHlwaXhlbF9ibGl0X2ZyYWdtZW50X29wcyhHTGNvbnRleHQgKiBjdHgpCiB7CiAgICBpZiAoY3R4LT5OZXdTdGF0ZSkKICAgICAgIF9tZXNhX3VwZGF0ZV9zdGF0ZShjdHgpOwogCisgICAvKiBDb3VsZCBkbyBsb2dpY29wIHdpdGggdGhlIGJsaXR0ZXI6IAorICAgICovCiAgICByZXR1cm4gIShjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgfHwKLQkgICAgY3R4LT5SZW5kZXJNb2RlICE9IEdMX1JFTkRFUiB8fAogICAgICAgICAgICAgY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQgfHwKICAgICAgICAgICAgIGN0eC0+RGVwdGguVGVzdCB8fAogICAgICAgICAgICAgY3R4LT5Gb2cuRW5hYmxlZCB8fApAQCAtODksMTIgKzkyLDEzIEBACiAgICAgICAgICAgICAhY3R4LT5Db2xvci5Db2xvck1hc2tbMF0gfHwKICAgICAgICAgICAgICFjdHgtPkNvbG9yLkNvbG9yTWFza1sxXSB8fAogICAgICAgICAgICAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrWzJdIHx8Ci0gICAgICAgICAgICAhY3R4LT5Db2xvci5Db2xvck1hc2tbM10gfHwJLyogY2FuIGRvIHRoaXMhICovCisgICAgICAgICAgICAhY3R4LT5Db2xvci5Db2xvck1hc2tbM10gfHwKICAgICAgICAgICAgIGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzIHx8CiAJICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9FbmFibGVkIHx8CiAJICAgIGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkKTsKIH0KIAorI2lmZGVmIEk5MTUKIC8qIERvZXNuJ3Qgd29yayBmb3Igb3ZlcmxhcHBpbmcgcmVnaW9ucy4gIENvdWxkIGRvIGEgZG91YmxlIGNvcHkgb3IKICAqIGp1c3QgZmFsbGJhY2suCiAgKi8KQEAgLTExMywxNSArMTE3LDkgQEAKICAgIERCRygiJXMgJWQsJWQgJWR4JWQgLS0+ICVkLCVkXG4iLCBfX0ZVTkNUSU9OX18sIAogICAgICAgIHNyY3gsIHNyY3ksIHdpZHRoLCBoZWlnaHQsIGRzdHgsIGRzdHkpOwogCi0gICBpZiAoIXNyYyB8fCAhZHN0IHx8IHR5cGUgIT0gR0xfQ09MT1IgfHwKLSAgICAgICBjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgfHwKLSAgICAgICBjdHgtPlBpeGVsLlpvb21YICE9IDEuMEYgfHwgY3R4LT5QaXhlbC5ab29tWSAhPSAxLjBGIHx8Ci0gICAgICAgY3R4LT5SZW5kZXJNb2RlICE9IEdMX1JFTkRFUiB8fAotICAgICAgIGN0eC0+VGV4dHVyZS5fRW5hYmxlZFVuaXRzIHx8Ci0gICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0VuYWJsZWQgfHwKLSAgICAgICBzcmMgIT0gZHN0ICkKLSAgICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICAKKyAgIGlmICghc3JjIHx8ICFkc3QgfHwgdHlwZSAhPSBHTF9DT0xPUikKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKwogICAgLyogQ2FuJ3QgaGFuZGxlIG92ZXJsYXBwaW5nIHJlZ2lvbnMuICBEb24ndCBoYXZlIHN1ZmZpY2llbnQgY29udHJvbAogICAgICogb3ZlciByYXN0ZXJpemF0aW9uIHRvIHB1bGwgaXQgb2ZmIGluLXBsYWNlLiAgUHVudCBvbiB0aGVzZSBmb3IKICAgICAqIG5vdy4KQEAgLTEzNSwxMyArMTMzLDEzIEBACiAKICAgICAgIHNyY2JveC54MSA9IHNyY3g7CiAgICAgICBzcmNib3gueTEgPSBzcmN5OwotICAgICAgc3JjYm94LngyID0gc3JjeCArIHdpZHRoIC0gMTsKLSAgICAgIHNyY2JveC55MiA9IHNyY3kgKyBoZWlnaHQgLSAxOworICAgICAgc3JjYm94LngyID0gc3JjeCArIHdpZHRoOworICAgICAgc3JjYm94LnkyID0gc3JjeSArIGhlaWdodDsKIAogICAgICAgZHN0Ym94LngxID0gZHN0eDsKICAgICAgIGRzdGJveC55MSA9IGRzdHk7Ci0gICAgICBkc3Rib3gueDIgPSBkc3R4ICsgd2lkdGggLSAxOwotICAgICAgZHN0Ym94LnkyID0gZHN0eSArIGhlaWdodCAtIDE7CisgICAgICBkc3Rib3gueDIgPSBkc3R4ICsgd2lkdGggKiBjdHgtPlBpeGVsLlpvb21YOworICAgICAgZHN0Ym94LnkyID0gZHN0eSArIGhlaWdodCAqIGN0eC0+UGl4ZWwuWm9vbVk7CiAKICAgICAgIERCRygic3JjICVkLCVkICVkLCVkXG4iLCBzcmNib3gueDEsIHNyY2JveC55MSwgc3JjYm94LngyLCBzcmNib3gueTIpOwogICAgICAgREJHKCJkc3QgJWQsJWQgJWQsJWQgKCVkeCVkKSAoJWYsJWYpXG4iLCBkc3Rib3gueDEsIGRzdGJveC55MSwgZHN0Ym94LngyLCBkc3Rib3gueTIsCkBAIC0xODAsMjIgKzE3OCw2NiBAQAogCiAgICAvKiBTZXQgdGhlIGZyb250YnVmZmVyIHVwIGFzIGEgbGFyZ2UgcmVjdGFuZ3VsYXIgdGV4dHVyZS4KICAgICAqLwotICAgaW50ZWwtPnZ0YmwubWV0YV9mcmFtZV9idWZmZXJfdGV4dHVyZSggaW50ZWwsIHNyY3ggLSBkc3R4LCBzcmN5IC0gZHN0eSApOworICAgaWYgKCFpbnRlbC0+dnRibC5tZXRhX3RleF9yZWN0X3NvdXJjZShpbnRlbCwgc3JjLT5idWZmZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+aGVpZ2h0LCBzcmNfZm9ybWF0LCBzcmNfdHlwZSkpIHsKKyAgICAgIGludGVsLT52dGJsLmxlYXZlX21ldGFfc3RhdGUoaW50ZWwpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCiAKICAgIGludGVsLT52dGJsLm1ldGFfdGV4dHVyZV9ibGVuZF9yZXBsYWNlKGludGVsKTsKLSAgIAotICAgaWYgKGludGVsLT5kcmlEcmF3YWJsZS0+bnVtQ2xpcFJlY3RzKQotICAgICAgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X3F1YWQoIGludGVsLAotCQkJCSAgZHN0eCwgZHN0eCArIHdpZHRoLAotCQkJCSAgZHN0eSwgZHN0eSArIGhlaWdodCwKLQkJCQkgIGN0eC0+Q3VycmVudC5SYXN0ZXJQb3NbIDIgXSwKLQkJCQkgIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIDAuMCApOwotICAgCi0gICBpbnRlbC0+dnRibC5sZWF2ZV9tZXRhX3N0YXRlKCBpbnRlbCApOwotICAgCisKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlLT5udW1DbGlwUmVjdHMpIHsKKyAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKworCisgICAgICBzcmN5ID0gZFByaXYtPmggLSBzcmN5IC0gaGVpZ2h0OyAgLyogY29udmVydCBmcm9tIGdsIHRvIGhhcmR3YXJlIGNvb3JkcyAqLworCisgICAgICBzcmN4ICs9IGRQcml2LT54OworICAgICAgc3JjeSArPSBkUHJpdi0+eTsKKworICAgICAgLyogQ2xpcCBhZ2FpbnN0IHRoZSBzb3VyY2UgcmVnaW9uLiAgVGhpcyBpcyB0aGUgb25seSBzb3VyY2UKKyAgICAgICAqIGNsaXBwaW5nIHdlIGRvLiAgWFhYOiBKdXN0IHNldCB0aGUgdGV4Y29yZCB3cmFwIG1vZGUgdG8gY2xhbXAKKyAgICAgICAqIG9yIHNpbWlsYXIuCisgICAgICAgKgorICAgICAgICovCisgICAgICBpZiAoMCkgeworICAgICAgICAgR0xpbnQgb3JpZ194ID0gc3JjeDsKKyAgICAgICAgIEdMaW50IG9yaWdfeSA9IHNyY3k7CisKKyAgICAgICAgIGlmICghX21lc2FfY2xpcF90b19yZWdpb24oMCwgMCwgc3JjLT5waXRjaCwgc3JjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmN4LCAmc3JjeSwgJndpZHRoLCAmaGVpZ2h0KSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICBkc3R4ICs9IHNyY3ggLSBvcmlnX3g7CisgICAgICAgICBkc3R5ICs9IChzcmN5IC0gb3JpZ195KSAqIGN0eC0+UGl4ZWwuWm9vbVk7CisgICAgICB9CisKKyAgICAgIC8qIEp1c3QgdXNlIHRoZSByZWd1bGFyIGNsaXByZWN0IG1lY2hhbmlzbS4uLiAgRG9lcyB0aGlzIG5lZWQgdG8KKyAgICAgICAqIGV2ZW4gaG9sZCB0aGUgbG9jaz8/PworICAgICAgICovCisgICAgICBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcXVhZChpbnRlbCwKKwkJCQkgZHN0eCwKKwkJCQkgZHN0eCArIHdpZHRoICogY3R4LT5QaXhlbC5ab29tWCwKKwkJCQkgZFByaXYtPmggLSAoZHN0eSArIGhlaWdodCAqIGN0eC0+UGl4ZWwuWm9vbVkpLAorCQkJCSBkUHJpdi0+aCAtIChkc3R5KSwgMCwgLyogWFhYOiB3aGF0IHogdmFsdWU/ICovCisJCQkJIDB4MDBmZjAwZmYsCisJCQkJIHNyY3gsIHNyY3ggKyB3aWR0aCwgc3JjeSwgc3JjeSArIGhlaWdodCk7CisKKyAgICBvdXQ6CisgICAgICBpbnRlbC0+dnRibC5sZWF2ZV9tZXRhX3N0YXRlKGludGVsKTsKKyAgICAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goaW50ZWwtPmJhdGNoKTsKKyAgIH0KKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisKICAgIERCRygiJXM6IHN1Y2Nlc3NcbiIsIF9fRlVOQ1RJT05fXyk7CiAgICByZXR1cm4gR0xfVFJVRTsKIH0KKyNlbmRpZiAvKiBJOTE1ICovCisKIAogLyoqCiAgKiBDb3B5UGl4ZWxzIHdpdGggdGhlIGJsaXR0ZXIuICBEb24ndCBzdXBwb3J0IHpvb21pbmcsIHBpeGVsIHRyYW5zZmVyLCBldGMuCkBAIC0yMTMsNyArMjU1LDcgQEAKICAgIC8qIENvcHlwaXhlbHMgY2FuIGJlIG1vcmUgdGhhbiBhIHN0cmFpZ2h0IGNvcHkuICBFbnN1cmUgYWxsIHRoZQogICAgICogZXh0cmEgb3BlcmF0aW9ucyBhcmUgZGlzYWJsZWQ6CiAgICAgKi8KLSAgIGlmICghaW50ZWxfY2hlY2tfYmxpdF9mcmFnbWVudF9vcHMoY3R4KSB8fAorICAgaWYgKCFpbnRlbF9jaGVja19jb3B5cGl4ZWxfYmxpdF9mcmFnbWVudF9vcHMoY3R4KSB8fAogICAgICAgIGN0eC0+UGl4ZWwuWm9vbVggIT0gMS4wRiB8fCBjdHgtPlBpeGVsLlpvb21ZICE9IDEuMEYpCiAgICAgICByZXR1cm4gR0xfRkFMU0U7CiAKQEAgLTIyNCwxNSArMjY2LDEyIEBACiAKICAgIGludGVsRmx1c2goJmludGVsLT5jdHgpOwogCi0vKiAgICBpbnRlbC0+dnRibC5yZW5kZXJfc3RhcnQoaW50ZWwpOyAqLwotLyogICAgaW50ZWwtPnZ0YmwuZW1pdF9zdGF0ZShpbnRlbCk7ICovCi0KICAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOwogCiAgICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlLT5udW1DbGlwUmVjdHMpIHsKICAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKyAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUmVhZFByaXYgPSBpbnRlbC0+ZHJpUmVhZERyYXdhYmxlOwogICAgICAgZHJtX2NsaXBfcmVjdF90ICpib3ggPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgICAgIGRybV9jbGlwX3JlY3RfdCBkZXN0X3JlY3Q7CiAgICAgICBHTGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKICAgICAgIEdMaW50IGRlbHRhX3ggPSAwOwogICAgICAgR0xpbnQgZGVsdGFfeSA9IDA7CkBAIC0yNjIsOCArMzAxLDggQEAKICAgICAgIHNyY3kgPSBkUHJpdi0+aCAtIHNyY3kgLSBoZWlnaHQ7ICAKICAgICAgIGRzdHggKz0gZFByaXYtPng7CiAgICAgICBkc3R5ICs9IGRQcml2LT55OwotICAgICAgc3JjeCArPSBkUHJpdi0+eDsKLSAgICAgIHNyY3kgKz0gZFByaXYtPnk7CisgICAgICBzcmN4ICs9IGRSZWFkUHJpdi0+eDsKKyAgICAgIHNyY3kgKz0gZFJlYWRQcml2LT55OwogCiAgICAgICAvKiBDbGlwIGFnYWluc3QgdGhlIHNvdXJjZSByZWdpb24uICBUaGlzIGlzIHRoZSBvbmx5IHNvdXJjZQogICAgICAgICogY2xpcHBpbmcgd2UgZG8uICBEc3QgaXMgY2xpcHBlZCB3aXRoIGNsaXByZWN0cyBiZWxvdy4KQEAgLTI4MCwxMyArMzE5LDYgQEAKICAgICAgICAgIGRzdHkgPSBzcmN5IC0gZGVsdGFfeTsKICAgICAgIH0KIAotICAgICAgZGVzdF9yZWN0LngxID0gZHN0eDsKLSAgICAgIGRlc3RfcmVjdC55MSA9IGRzdHk7Ci0gICAgICBkZXN0X3JlY3QueDIgPSBkc3R4ICsgd2lkdGg7Ci0gICAgICBkZXN0X3JlY3QueTIgPSBkc3R5ICsgaGVpZ2h0OwotCi0vKiAgICAgICBpbnRlbC0+dnRibC5lbWl0X2ZsdXNoKGludGVsLCAwKTsgKi8KLQogICAgICAgLyogQ291bGQgZG8gc2xpZ2h0bHkgbW9yZSBjbGlwcGluZzogRWcsIHRha2UgdGhlIGludGVyc2VjdGlvbiBvZgogICAgICAgICogdGhlIGV4aXN0aW5nIHNldCBvZiBjbGlwcmVjdHMgYW5kIHRob3NlIGNsaXByZWN0cyB0cmFuc2xhdGVkCiAgICAgICAgKiBieSBkZWx0YV94LCBkZWx0YV95OgpAQCAtMjk1LDMyICszMjcsMzMgQEAKICAgICAgICAqIGludHJvZHVjZSBnYXJiYWdlIHdoZW4gY29weWluZyBmcm9tIG9ic2N1cmVkIHdpbmRvdyByZWdpb25zLgogICAgICAgICovCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7Ci0gICAgICAgICBkcm1fY2xpcF9yZWN0X3QgcmVjdDsKKwkgR0xpbnQgY2xpcF94ID0gZHN0eDsKKwkgR0xpbnQgY2xpcF95ID0gZHN0eTsKKwkgR0xpbnQgY2xpcF93ID0gd2lkdGg7CisJIEdMaW50IGNsaXBfaCA9IGhlaWdodDsKIAotICAgICAgICAgaWYgKCFpbnRlbF9pbnRlcnNlY3RfY2xpcHJlY3RzKCZyZWN0LCAmZGVzdF9yZWN0LCAmYm94W2ldKSkKKyAgICAgICAgIGlmICghX21lc2FfY2xpcF90b19yZWdpb24oYm94W2ldLngxLCBib3hbaV0ueTEsIGJveFtpXS54MiwgYm94W2ldLnkyLAorCQkJCSAgICZjbGlwX3gsICZjbGlwX3ksICZjbGlwX3csICZjbGlwX2gpKQogICAgICAgICAgICAgY29udGludWU7CiAKLQotICAgICAgICAgaW50ZWxFbWl0Q29weUJsaXQoaW50ZWwsIAotCQkJICAgZHN0LT5jcHAsIAotCQkJICAgc3JjLT5waXRjaCwgc3JjLT5idWZmZXIsIDAsIHNyYy0+dGlsZWQsCi0JCQkgICBkc3QtPnBpdGNoLCBkc3QtPmJ1ZmZlciwgMCwgZHN0LT50aWxlZCwKLQkJCSAgIHJlY3QueDEgKyBkZWx0YV94LCAKLQkJCSAgIHJlY3QueTEgKyBkZWx0YV95LCAgICAgICAvKiBzcmN4LCBzcmN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LngxLCByZWN0LnkxLCAgICAvKiBkc3R4LCBkc3R5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LngyIC0gcmVjdC54MSwgcmVjdC55MiAtIHJlY3QueTEsCisgICAgICAgICBpbnRlbEVtaXRDb3B5QmxpdChpbnRlbCwgZHN0LT5jcHAsCisJCQkgICBzcmMtPnBpdGNoLCBzcmMtPmJ1ZmZlciwgMCwgc3JjLT50aWxpbmcsCisJCQkgICBkc3QtPnBpdGNoLCBkc3QtPmJ1ZmZlciwgMCwgZHN0LT50aWxpbmcsCisJCQkgICBjbGlwX3ggKyBkZWx0YV94LCBjbGlwX3kgKyBkZWx0YV95LCAvKiBzcmN4LCBzcmN5ICovCisJCQkgICBjbGlwX3gsIGNsaXBfeSwgLyogZHN0eCwgZHN0eSAqLworCQkJICAgY2xpcF93LCBjbGlwX2gsCiAJCQkgICBjdHgtPkNvbG9yLkNvbG9yTG9naWNPcEVuYWJsZWQgPwogCQkJICAgY3R4LT5Db2xvci5Mb2dpY09wIDogR0xfQ09QWSk7CiAgICAgICB9Ci0KLSAgICAgIGludGVsLT5uZWVkX2ZsdXNoID0gR0xfVFJVRTsKLSAgIG91dDoKLSAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGludGVsLT5iYXRjaCk7CiAgICB9CitvdXQ6CiAgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBEQkcoIiVzOiBzdWNjZXNzXG4iLCBfX0ZVTkNUSU9OX18pOwogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKKwogdm9pZAogaW50ZWxDb3B5UGl4ZWxzKEdMY29udGV4dCAqIGN0eCwKICAgICAgICAgICAgICAgICBHTGludCBzcmN4LCBHTGludCBzcmN5LApAQCAtMzMzLDExICszNjYsMTIgQEAKICAgIGlmIChkb19ibGl0X2NvcHlwaXhlbHMoY3R4LCBzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0eCwgZGVzdHksIHR5cGUpKQogICAgICAgcmV0dXJuOwogCisjaWZkZWYgSTkxNQogICAgaWYgKGRvX3RleHR1cmVfY29weXBpeGVscyhjdHgsIHNyY3gsIHNyY3ksIHdpZHRoLCBoZWlnaHQsIGRlc3R4LCBkZXN0eSwgdHlwZSkpCiAgICAgICByZXR1cm47Ci0gICAKLSAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQotICAgICAgX21lc2FfcHJpbnRmKCJmYWxsYmFjayB0byBfc3dyYXN0X0NvcHlQaXhlbHNcbiIpOworI2VuZGlmCisKKyAgIERCRygiZmFsbGJhY2sgdG8gX3N3cmFzdF9Db3B5UGl4ZWxzXG4iKTsKIAogICAgX3N3cmFzdF9Db3B5UGl4ZWxzKGN0eCwgc3JjeCwgc3JjeSwgd2lkdGgsIGhlaWdodCwgZGVzdHgsIGRlc3R5LCB0eXBlKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3BpeGVsX2RyYXcuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3BpeGVsX2RyYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njc1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcGl4ZWxfZHJhdy5jCkBAIC0wLDAgKzEsMzgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnNhbGxvYworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgImVudW1zLmgiCisjaW5jbHVkZSAiaW1hZ2UuaCIKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJidWZmZXJvYmouaCIKKyNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCisKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2JsaXQuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJzLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX3BpeGVsLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmZmVyX29iamVjdHMuaCIKKyNpbmNsdWRlICJpbnRlbF90cmlzLmgiCisKKworCitzdGF0aWMgR0xib29sZWFuCitkb190ZXh0dXJlX2RyYXdwaXhlbHMoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICogcGl4ZWxzKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHN0ID0gaW50ZWxfZHJhd2J1Zl9yZWdpb24oaW50ZWwpOworICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKnNyYyA9IGludGVsX2J1ZmZlcl9vYmplY3QodW5wYWNrLT5CdWZmZXJPYmopOworICAgR0x1aW50IHJvd0xlbmd0aCA9IHVucGFjay0+Um93TGVuZ3RoID8gdW5wYWNrLT5Sb3dMZW5ndGggOiB3aWR0aDsKKyAgIEdMdWludCBzcmNfb2Zmc2V0OworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGludGVsRmx1c2goJmludGVsLT5jdHgpOworCisgICBpZiAoIWRzdCkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgaW50ZWwtPnZ0YmwucmVuZGVyX3N0YXJ0KGludGVsKTsKKyAgIGludGVsLT52dGJsLmVtaXRfc3RhdGUoaW50ZWwpOworCisgICBpZiAoc3JjKSB7CisgICAgICBpZiAoIV9tZXNhX3ZhbGlkYXRlX3Bib19hY2Nlc3MoMiwgdW5wYWNrLCB3aWR0aCwgaGVpZ2h0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSkgeworICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgImdsRHJhd1BpeGVscyIpOworICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIFBCTyBvbmx5IGZvciBub3c6CisgICAgICAgKi8KKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorCSBfbWVzYV9wcmludGYoIiVzIC0gbm90IFBCT1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgLyogVGhlcmUgYXJlIGEgY291cGxlIG9mIHRoaW5ncyB3ZSBjYW4ndCBkbyB5ZXQsIG9uZSBvZiB3aGljaCBpcworICAgICogc2V0IHRoZSBjb3JyZWN0IHN0YXRlIGZvciBwaXhlbCBvcGVyYXRpb25zIHdoZW4gR0wgdGV4dHVyaW5nIGlzCisgICAgKiBlbmFibGVkLiAgVGhhdCdzIGEgcHJldHR5IHJhcmUgc3RhdGUgYW5kIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUKKyAgICAqIGVmZm9ydC4gIEEgY29tcGxldGVseSBkZXZpY2UtaW5kZXBlbmRlbnQgdmVyc2lvbiBvZiB0aGlzIG1heSBkbworICAgICogbW9yZS4KKyAgICAqCisgICAgKiBTaW1pbGFybHksIHdlIG1ha2Ugbm8gYXR0ZW1wdCB0byBtZXJnZSBtZXRhb3BzIHByb2Nlc3Npbmcgd2l0aAorICAgICogYW4gZW5hYmxlZCBmcmFnbWVudCBwcm9ncmFtLCB0aG91Z2ggaXQgd291bGQgY2VydGFpbmx5IGJlCisgICAgKiBwb3NzaWJsZS4KKyAgICAqLworICAgaWYgKCFpbnRlbF9jaGVja19tZXRhX3RleF9mcmFnbWVudF9vcHMoY3R4KSkgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICAgICBfbWVzYV9wcmludGYoIiVzIC0gYmFkIEdMIGZyYWdtZW50IHN0YXRlIGZvciBtZXRhb3BzIHRleHR1cmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaW50ZWwtPnZ0YmwuaW5zdGFsbF9tZXRhX3N0YXRlKGludGVsKTsKKworCisgICAvKiBJcyB0aGlzIHRydWU/ICBBbHNvIHdpbGwgbmVlZCB0byB0dXJuIGRlcHRoIHRlc3Rpbmcgb24gYWNjb3JkaW5nCisgICAgKiB0byBzdGF0ZToKKyAgICAqLworICAgaW50ZWwtPnZ0YmwubWV0YV9ub19zdGVuY2lsX3dyaXRlKGludGVsKTsKKyAgIGludGVsLT52dGJsLm1ldGFfbm9fZGVwdGhfd3JpdGUoaW50ZWwpOworCisgICAvKiBTZXQgdGhlIDNkIGVuZ2luZSB0byBkcmF3IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbjoKKyAgICAqLworICAgaW50ZWwtPnZ0YmwubWV0YV9kcmF3X3JlZ2lvbihpbnRlbCwgZHN0LCBpbnRlbC0+ZGVwdGhfcmVnaW9uKTsKKworICAgaW50ZWwtPnZ0YmwubWV0YV9pbXBvcnRfcGl4ZWxfc3RhdGUoaW50ZWwpOworCisgICBzcmNfb2Zmc2V0ID0gKEdMdWludCkgX21lc2FfaW1hZ2VfYWRkcmVzcygyLCB1bnBhY2ssIHBpeGVscywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgMCwgMCwgMCk7CisKKworICAgLyogU2V0dXAgdGhlIHBibyB1cCBhcyBhIHJlY3Rhbmd1bGFyIHRleHR1cmUsIGlmIHBvc3NpYmxlLgorICAgICoKKyAgICAqIFRPRE86IFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBwb3NzaWJsZSBpZiB0aGUgaTkxNSBmcmFnbWVudAorICAgICogcHJvZ3JhbSBpcyBhZGp1c3RlZCB0byBjb3JyZWN0bHkgc3dpenpsZSB0aGUgc2FtcGxlZCBjb2xvcnMuCisgICAgKiBUaGUgbWFqb3IgZXhjZXB0aW9uIGlzIGFueSAyNGJpdCB0ZXh0dXJlLCBsaWtlIFJHQjg4OCwgZm9yIHdoaWNoCisgICAgKiB0aGVyZSBpcyBubyBoYXJkd2FyZSBzdXBwb3J0LiAgCisgICAgKi8KKyAgIGlmICghaW50ZWwtPnZ0YmwubWV0YV90ZXhfcmVjdF9zb3VyY2UoaW50ZWwsIHNyYy0+YnVmZmVyLCBzcmNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dMZW5ndGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlKSkgeworICAgICAgaW50ZWwtPnZ0YmwubGVhdmVfbWV0YV9zdGF0ZShpbnRlbCk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGludGVsLT52dGJsLm1ldGFfdGV4dHVyZV9ibGVuZF9yZXBsYWNlKGludGVsKTsKKworCisgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaWYgKGludGVsLT5kcmlEcmF3YWJsZS0+bnVtQ2xpcFJlY3RzKSB7CisgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7CisgICAgICBHTGludCBzcmN4LCBzcmN5OworICAgICAgR0xpbnQgZHN0eCwgZHN0eTsKKworICAgICAgZHN0eCA9IHg7CisgICAgICBkc3R5ID0gZFByaXYtPmggLSAoeSArIGhlaWdodCk7CisKKyAgICAgIHNyY3ggPSAwOyAgICAgICAgICAgICAgICAgLyogc2tpcHJvd3MvcGl4ZWxzIGFscmVhZHkgZG9uZSAqLworICAgICAgc3JjeSA9IDA7CisKKyAgICAgIGlmICgwKSB7CisgICAgICAgICBjb25zdCBHTGludCBvcmlnX3ggPSBkc3R4OworICAgICAgICAgY29uc3QgR0xpbnQgb3JpZ195ID0gZHN0eTsKKworICAgICAgICAgaWYgKCFfbWVzYV9jbGlwX3RvX3JlZ2lvbigwLCAwLCBkc3QtPnBpdGNoLCBkc3QtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdHgsICZkc3R5LCAmd2lkdGgsICZoZWlnaHQpKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgIHNyY3ggKz0gZHN0eCAtIG9yaWdfeDsKKyAgICAgICAgIHNyY3kgKz0gZHN0eSAtIG9yaWdfeTsKKyAgICAgIH0KKworCisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiZHJhdyAlZCwlZCAlZHglZFxuIiwgZHN0eCwgZHN0eSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgIC8qIE11c3QgdXNlIHRoZSByZWd1bGFyIGNsaXByZWN0IG1lY2hhbmlzbSBpbiBvcmRlciB0byBnZXQgdGhlCisgICAgICAgKiBkcmF3aW5nIG9yaWdpbiBzZXQgY29ycmVjdGx5LiAgT3RoZXJ3aXNlIHNjaXNzb3Igc3RhdGUgaXMgaW4KKyAgICAgICAqIGluY29ycmVjdCBjb29yZGluYXRlIHNwYWNlLiAgRG9lcyB0aGlzIGV2ZW4gbmVlZCB0byBob2xkIHRoZQorICAgICAgICogbG9jaz8/PworICAgICAgICovCisgICAgICBpbnRlbC0+dnRibC5tZXRhX2RyYXdfcXVhZChpbnRlbCwKKwkJCQkgZHN0eCwgZHN0eCArIHdpZHRoICogY3R4LT5QaXhlbC5ab29tWCwKKwkJCQkgZFByaXYtPmggLSAoeSArIGhlaWdodCAqIGN0eC0+UGl4ZWwuWm9vbVkpLAorCQkJCSBkUHJpdi0+aCAtICh5KSwKKwkJCQkgLWN0eC0+Q3VycmVudC5SYXN0ZXJQb3NbMl0gKiAuNSwKKwkJCQkgMHgwMGZmMDBmZiwKKwkJCQkgc3JjeCwgc3JjeCArIHdpZHRoLCBzcmN5ICsgaGVpZ2h0LCBzcmN5KTsKKyAgICBvdXQ6CisgICAgICBpbnRlbC0+dnRibC5sZWF2ZV9tZXRhX3N0YXRlKGludGVsKTsKKyAgICAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goaW50ZWwtPmJhdGNoKTsKKyAgIH0KKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisKKworCisvKiBQcm9zOiAgCisgKiAgIC0gbm8gd2FpdGluZyBmb3IgaWRsZSBiZWZvcmUgdXBkYXRpbmcgZnJhbWVidWZmZXIuCisgKiAgIAorICogQ29uczoKKyAqICAgLSBpZiB1cGxvYWQgaXMgYnkgbWVtY3B5LCB0aGlzIG1heSBhY3R1YWxseSBiZSBzbG93ZXIgdGhhbiBmYWxsYmFjayBwYXRoLgorICogICAtIHVwbG9hZHMgdGhlIHdob2xlIGltYWdlIGV2ZW4gaWYgZGVzdGluYXRpb24gaXMgY2xpcHBlZAorICogICAKKyAqIE5lZWQgdG8gYmVuY2htYXJrLgorICoKKyAqIEdpdmVuIHRoZSBxdWVzdGlvbnMgYWJvdXQgcGVyZm9ybWFuY2UsIGltcGxlbWVudCBmb3IgcGJvJ3Mgb25seS4KKyAqIFRoaXMgcGF0aCBpcyBkZWZpbml0ZWx5IGEgd2luIGlmIHRoZSBwYm8gaXMgYWxyZWFkeSBpbiBhZ3AuICBJZiBpdAorICogdHVybnMgb3V0IG90aGVyd2lzZSwgd2UgY2FuIGFkZCB0aGUgY29kZSBuZWNlc3NhcnkgdG8gdXBsb2FkIGNsaWVudAorICogZGF0YSB0byBhZ3Agc3BhY2UgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGJsaXQuICAoVGhvdWdoIGl0IG1heSB0dXJuCisgKiBvdXQgdG8gYmUgYmV0dGVyL3NpbXBsZXIganVzdCB0byB1c2UgdGhlIHRleHR1cmUgZW5naW5lKS4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorZG9fYmxpdF9kcmF3cGl4ZWxzKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqIHBpeGVscykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlc3QgPSBpbnRlbF9kcmF3YnVmX3JlZ2lvbihpbnRlbCk7CisgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqc3JjID0gaW50ZWxfYnVmZmVyX29iamVjdCh1bnBhY2stPkJ1ZmZlck9iaik7CisgICBHTHVpbnQgc3JjX29mZnNldDsKKyAgIEdMdWludCByb3dMZW5ndGg7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorICAgICAgX21lc2FfcHJpbnRmKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCisgICBpZiAoIWRlc3QpIHsKKyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorICAgICAgICAgX21lc2FfcHJpbnRmKCIlcyAtIG5vIGRlc3RcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGlmIChzcmMpIHsKKyAgICAgIC8qIFRoaXMgdmFsaWRhdGlvbiBzaG91bGQgYmUgZG9uZSBieSBjb3JlIG1lc2E6CisgICAgICAgKi8KKyAgICAgIGlmICghX21lc2FfdmFsaWRhdGVfcGJvX2FjY2VzcygyLCB1bnBhY2ssIHdpZHRoLCBoZWlnaHQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMpKSB7CisgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiZ2xEcmF3UGl4ZWxzIik7CisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogUEJPIG9ubHkgZm9yIG5vdzoKKyAgICAgICAqLworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICAgICBfbWVzYV9wcmludGYoIiVzIC0gbm90IFBCT1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKCFpbnRlbF9jaGVja19ibGl0X2Zvcm1hdChkZXN0LCBmb3JtYXQsIHR5cGUpKSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBiYWQgZm9ybWF0IGZvciBibGl0XG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoIWludGVsX2NoZWNrX2JsaXRfZnJhZ21lbnRfb3BzKGN0eCwgR0xfRkFMU0UpKSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBiYWQgR0wgZnJhZ21lbnQgc3RhdGUgZm9yIGJsaXR0ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgaWYgKGN0eC0+UGl4ZWwuWm9vbVggIT0gMS4wRikgeworICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfUElYRUwpCisgICAgICAgICBfbWVzYV9wcmludGYoIiVzIC0gYmFkIFBpeGVsWm9vbVggZm9yIGJsaXRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKworICAgaWYgKHVucGFjay0+Um93TGVuZ3RoID4gMCkKKyAgICAgIHJvd0xlbmd0aCA9IHVucGFjay0+Um93TGVuZ3RoOworICAgZWxzZQorICAgICAgcm93TGVuZ3RoID0gd2lkdGg7CisKKyAgIGlmIChjdHgtPlBpeGVsLlpvb21ZID09IC0xLjBGKSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBiYWQgUGl4ZWxab29tWSBmb3IgYmxpdFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsgICAgICAgICAgLyogbGF0ZXIgKi8KKyAgICAgIHkgLT0gaGVpZ2h0OworICAgfQorICAgZWxzZSBpZiAoY3R4LT5QaXhlbC5ab29tWSA9PSAxLjBGKSB7CisgICAgICByb3dMZW5ndGggPSAtcm93TGVuZ3RoOworICAgfQorICAgZWxzZSB7CisgICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBiYWQgUGl4ZWxab29tWSBmb3IgYmxpdFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgc3JjX29mZnNldCA9IChHTHVpbnQpIF9tZXNhX2ltYWdlX2FkZHJlc3MoMiwgdW5wYWNrLCBwaXhlbHMsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIDAsIDAsIDApOworCisgICBpbnRlbEZsdXNoKCZpbnRlbC0+Y3R4KTsKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoaW50ZWwtPmRyaURyYXdhYmxlLT5udW1DbGlwUmVjdHMpIHsKKyAgICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiA9IGludGVsLT5kcmlEcmF3YWJsZTsKKyAgICAgIGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCAqYm94ID0gZFByaXYtPnBDbGlwUmVjdHM7CisgICAgICBkcm1fY2xpcF9yZWN0X3QgcmVjdDsKKyAgICAgIGRybV9jbGlwX3JlY3RfdCBkZXN0X3JlY3Q7CisgICAgICBkcmlfYm8gKnNyY19idWZmZXIgPSBpbnRlbF9idWZmZXJvYmpfYnVmZmVyKGludGVsLCBzcmMsIElOVEVMX1JFQUQpOworICAgICAgaW50IGk7CisKKyAgICAgIGRlc3RfcmVjdC54MSA9IGRQcml2LT54ICsgeDsKKyAgICAgIGRlc3RfcmVjdC55MSA9IGRQcml2LT55ICsgZFByaXYtPmggLSAoeSArIGhlaWdodCk7CisgICAgICBkZXN0X3JlY3QueDIgPSBkZXN0X3JlY3QueDEgKyB3aWR0aDsKKyAgICAgIGRlc3RfcmVjdC55MiA9IGRlc3RfcmVjdC55MSArIGhlaWdodDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgeworICAgICAgICAgaWYgKCFpbnRlbF9pbnRlcnNlY3RfY2xpcHJlY3RzKCZyZWN0LCAmZGVzdF9yZWN0LCAmYm94W2ldKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICBpbnRlbEVtaXRDb3B5QmxpdChpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QtPmNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0xlbmd0aCwgc3JjX2J1ZmZlciwgc3JjX29mZnNldCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LT5waXRjaCwgZGVzdC0+YnVmZmVyLCAwLCBkZXN0LT50aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LngxIC0gZGVzdF9yZWN0LngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC55MiAtIGRlc3RfcmVjdC55MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnkxLCByZWN0LngyIC0gcmVjdC54MSwgcmVjdC55MiAtIHJlY3QueTEsCisJCQkgICBjdHgtPkNvbG9yLkNvbG9yTG9naWNPcEVuYWJsZWQgPworCQkJICAgY3R4LT5Db2xvci5Mb2dpY09wIDogR0xfQ09QWSk7CisgICAgICB9CisgICB9CisgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19QSVhFTCkKKyAgICAgIF9tZXNhX3ByaW50ZigiJXMgLSBET05FXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisKK3ZvaWQKK2ludGVsRHJhd1BpeGVscyhHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LAorICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAorICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqIHBpeGVscykKK3sKKyAgIGlmIChkb19ibGl0X2RyYXdwaXhlbHMoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFjaywgcGl4ZWxzKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGRvX3RleHR1cmVfZHJhd3BpeGVscyhjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrLCBwaXhlbHMpKQorICAgICAgcmV0dXJuOworCisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BJWEVMKQorICAgICAgX21lc2FfcHJpbnRmKCIlczogZmFsbGJhY2sgdG8gc3dyYXN0XG4iLCBfX0ZVTkNUSU9OX18pOworCisgICBpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQgPT0gY3R4LT5GcmFnbWVudFByb2dyYW0uX1RleEVudlByb2dyYW0pIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBkb24ndCB3YW50IHRoZSBpOTE1IHRleGVudiBwcm9ncmFtIHRvIGJlIGFwcGxpZWQgdG8gRHJhd1BpeGVscy4KKyAgICAgICAqIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gKG1lc2Egd2lsbCBvdGhlci0KKyAgICAgICAqIHdpc2UgaGFwcGlseSBydW4gdGhlIGZyYWdtZW50IHByb2dyYW0gb24gZWFjaCBwaXhlbCBpbiB0aGUgaW1hZ2UpLgorICAgICAgICovCisgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnBTYXZlID0gY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQ7CisgICAvKiBjYW4ndCBqdXN0IHNldCBjdXJyZW50IGZyYWcgcHJvZyB0byAwIGhlcmUgYXMgb24gYnVmZmVyIHJlc2l6ZQorICAgICAgd2UnbGwgZ2V0IG5ldyBzdGF0ZSBjaGVja3Mgd2hpY2ggd2lsbCBzZWdmYXVsdC4gUmVtYWlucyBhIGhhY2suICovCisgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCA9IE5VTEw7CisgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fVXNlVGV4RW52UHJvZ3JhbSA9IEdMX0ZBTFNFOworICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0FjdGl2ZSA9IEdMX0ZBTFNFOworICAgICAgX3N3cmFzdF9EcmF3UGl4ZWxzKCBjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrLCBwaXhlbHMgKTsKKyAgICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50ID0gZnBTYXZlOworICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX1VzZVRleEVudlByb2dyYW0gPSBHTF9UUlVFOworICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0FjdGl2ZSA9IEdMX1RSVUU7CisgICAgICBfc3dyYXN0X0ludmFsaWRhdGVTdGF0ZShjdHgsIF9ORVdfUFJPR1JBTSk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIF9zd3Jhc3RfRHJhd1BpeGVscyggY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFjaywgcGl4ZWxzICk7CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9yZWcuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWY3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9yZWcuaApAQCAtMCwwICsxLDIwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTURfTUkJCQkJKDB4MCA8PCAyOSkKKyNkZWZpbmUgQ01EXzJECQkJCSgweDIgPDwgMjkpCisjZGVmaW5lIENNRF8zRAkJCQkoMHgzIDw8IDI5KQorCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQJCShDTURfTUkgfCAweEEgPDwgMjMpCisKKyNkZWZpbmUgTUlfRkxVU0gJCQkoQ01EX01JIHwgKDQgPDwgMjMpKQorI2RlZmluZSBGTFVTSF9NQVBfQ0FDSEUJCQkJKDEgPDwgMCkKKyNkZWZpbmUgSU5ISUJJVF9GTFVTSF9SRU5ERVJfQ0FDSEUJCSgxIDw8IDIpCisKKy8qIFN0YWxscyBjb21tYW5kIGV4ZWN1dGlvbiB3YWl0aW5nIGZvciB0aGUgZ2l2ZW4gZXZlbnRzIHRvIGhhdmUgb2NjdXJyZWQuICovCisjZGVmaW5lIE1JX1dBSVRfRk9SX0VWRU5UICAgICAgICAgICAgICAgKENNRF9NSSB8ICgweDMgPDwgMjMpKQorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVAgICAgICAgICgxPDw2KQorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVAgICAgICAgICgxPDwyKQorCisvKiBwMTg5ICovCisjZGVmaW5lIF8zRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzEgICAoQ01EXzNEIHwgKDB4MWQ8PDI0KSB8ICgweDA0PDwxNikpCisjZGVmaW5lIEkxX0xPQURfUyhuKSAgICAgICAgICAgICAgICAgICAgICAoMTw8KDQrbikpCisKKy8qKiBAeworICogOTE1IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUzBfVkJfT0ZGU0VUX01BU0sJCTB4ZmZmZmZmYworI2RlZmluZSBTMF9BVVRPX0NBQ0hFX0lOVl9ESVNBQkxFCSgxPDwwKQorLyoqIEB9ICovCisKKy8qKiBAeworICogODMwIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUzBfVkJfT0ZGU0VUX01BU0tfODMwCQkweGZmZmZmZjgKKyNkZWZpbmUgUzBfVkJfUElUQ0hfU0hJRlRfODMwCQkxCisjZGVmaW5lIFMwX1ZCX0VOQUJMRV84MzAJCTAKKy8qKiBAfSAqLworCisjZGVmaW5lIFMxX1ZFUlRFWF9XSURUSF9TSElGVCAgICAgICAgICAyNAorI2RlZmluZSBTMV9WRVJURVhfV0lEVEhfTUFTSyAgICAgICAgICAgKDB4M2Y8PDI0KQorI2RlZmluZSBTMV9WRVJURVhfUElUQ0hfU0hJRlQgICAgICAgICAgMTYKKyNkZWZpbmUgUzFfVkVSVEVYX1BJVENIX01BU0sgICAgICAgICAgICgweDNmPDwxNikKKworI2RlZmluZSBURVhDT09SREZNVF8yRCAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFRFWENPT1JERk1UXzNEICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgVEVYQ09PUkRGTVRfNEQgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBURVhDT09SREZNVF8xRCAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFRFWENPT1JERk1UXzJEXzE2ICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgVEVYQ09PUkRGTVRfNERfMTYgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBURVhDT09SREZNVF9OT1RfUFJFU0VOVCAgICAgICAgMHhmCisjZGVmaW5lIFMyX1RFWENPT1JEX0ZNVDBfTUFTSyAgICAgICAgICAgIDB4ZgorI2RlZmluZSBTMl9URVhDT09SRF9GTVQxX1NISUZUICAgICAgICAgICA0CisjZGVmaW5lIFMyX1RFWENPT1JEX0ZNVCh1bml0LCB0eXBlKSAgICAoKHR5cGUpPDwodW5pdCo0KSkKKyNkZWZpbmUgUzJfVEVYQ09PUkRfTk9ORSAgICAgICAgICAgICAgICh+MCkKKyNkZWZpbmUgUzJfVEVYX0NPVU5UX1NISUZUXzgzMAkJMTIKKyNkZWZpbmUgUzJfVkVSVEVYXzBfV0lEVEhfU0hJRlRfODMwCTAKKyNkZWZpbmUgUzJfVkVSVEVYXzFfV0lEVEhfU0hJRlRfODMwCTYKKy8qIFMzIG5vdCBpbnRlcmVzdGluZyAqLworCisjZGVmaW5lIFM0X1BPSU5UX1dJRFRIX1NISUZUICAgICAgICAgICAyMworI2RlZmluZSBTNF9QT0lOVF9XSURUSF9NQVNLICAgICAgICAgICAgKDB4MWZmPDwyMykKKyNkZWZpbmUgUzRfTElORV9XSURUSF9TSElGVCAgICAgICAgICAgIDE5CisjZGVmaW5lIFM0X0xJTkVfV0lEVEhfT05FICAgICAgICAgICAgICAoMHgyPDwxOSkKKyNkZWZpbmUgUzRfTElORV9XSURUSF9NQVNLICAgICAgICAgICAgICgweGY8PDE5KQorI2RlZmluZSBTNF9GTEFUU0hBREVfQUxQSEEgICAgICAgICAgICAgKDE8PDE4KQorI2RlZmluZSBTNF9GTEFUU0hBREVfRk9HICAgICAgICAgICAgICAgKDE8PDE3KQorI2RlZmluZSBTNF9GTEFUU0hBREVfU1BFQ1VMQVIgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBTNF9GTEFUU0hBREVfQ09MT1IgICAgICAgICAgICAgKDE8PDE1KQorI2RlZmluZSBTNF9DVUxMTU9ERV9CT1RICSAgICAgICAoMDw8MTMpCisjZGVmaW5lIFM0X0NVTExNT0RFX05PTkUJICAgICAgICgxPDwxMykKKyNkZWZpbmUgUzRfQ1VMTE1PREVfQ1cJCSAgICAgICAoMjw8MTMpCisjZGVmaW5lIFM0X0NVTExNT0RFX0NDVwkJICAgICAgICgzPDwxMykKKyNkZWZpbmUgUzRfQ1VMTE1PREVfTUFTSwkgICAgICAgKDM8PDEzKQorI2RlZmluZSBTNF9WRk1UX1BPSU5UX1dJRFRIICAgICAgICAgICAgKDE8PDEyKQorI2RlZmluZSBTNF9WRk1UX1NQRUNfRk9HICAgICAgICAgICAgICAgKDE8PDExKQorI2RlZmluZSBTNF9WRk1UX0NPTE9SICAgICAgICAgICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBTNF9WRk1UX0RFUFRIX09GRlNFVCAgICAgICAgICAgKDE8PDkpCisjZGVmaW5lIFM0X1ZGTVRfWFlaICAgICAJICAgICAgICgxPDw2KQorI2RlZmluZSBTNF9WRk1UX1hZWlcgICAgIAkgICAgICAgKDI8PDYpCisjZGVmaW5lIFM0X1ZGTVRfWFkgICAgIAkJICAgICAgICgzPDw2KQorI2RlZmluZSBTNF9WRk1UX1hZVyAgICAgCSAgICAgICAoNDw8NikKKyNkZWZpbmUgUzRfVkZNVF9YWVpXX01BU0sgICAgICAgICAgICAgICg3PDw2KQorI2RlZmluZSBTNF9GT1JDRV9ERUZBVUxUX0RJRkZVU0UgICAgICAgKDE8PDUpCisjZGVmaW5lIFM0X0ZPUkNFX0RFRkFVTFRfU1BFQ1VMQVIgICAgICAoMTw8NCkKKyNkZWZpbmUgUzRfTE9DQUxfREVQVEhfT0ZGU0VUX0VOQUJMRSAgICgxPDwzKQorI2RlZmluZSBTNF9WRk1UX0ZPR19QQVJBTSAgICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFM0X1NQUklURV9QT0lOVF9FTkFCTEUgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgUzRfTElORV9BTlRJQUxJQVNfRU5BQkxFICAgICAgICgxPDwwKQorCisjZGVmaW5lIFM0X1ZGTVRfTUFTSyAoUzRfVkZNVF9QT0lOVF9XSURUSCAgIHwgCVwKKwkJICAgICAgUzRfVkZNVF9TUEVDX0ZPRyAgICAgIHwJXAorCQkgICAgICBTNF9WRk1UX0NPTE9SICAgICAgICAgfAlcCisJCSAgICAgIFM0X1ZGTVRfREVQVEhfT0ZGU0VUICB8CVwKKwkJICAgICAgUzRfVkZNVF9YWVpXX01BU0sgICAgIHwJXAorCQkgICAgICBTNF9WRk1UX0ZPR19QQVJBTSkKKworCisjZGVmaW5lIFM1X1dSSVRFRElTQUJMRV9BTFBIQSAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIFM1X1dSSVRFRElTQUJMRV9SRUQgICAgICAgICAgICAoMTw8MzApCisjZGVmaW5lIFM1X1dSSVRFRElTQUJMRV9HUkVFTiAgICAgICAgICAoMTw8MjkpCisjZGVmaW5lIFM1X1dSSVRFRElTQUJMRV9CTFVFICAgICAgICAgICAoMTw8MjgpCisjZGVmaW5lIFM1X1dSSVRFRElTQUJMRV9NQVNLICAgICAgICAgICAoMHhmPDwyOCkKKyNkZWZpbmUgUzVfRk9SQ0VfREVGQVVMVF9QT0lOVF9TSVpFICAgICgxPDwyNykKKyNkZWZpbmUgUzVfTEFTVF9QSVhFTF9FTkFCTEUgICAgICAgICAgICgxPDwyNikKKyNkZWZpbmUgUzVfR0xPQkFMX0RFUFRIX09GRlNFVF9FTkFCTEUgICgxPDwyNSkKKyNkZWZpbmUgUzVfRk9HX0VOQUJMRSAgICAgICAgICAgICAgICAgICgxPDwyNCkKKyNkZWZpbmUgUzVfU1RFTkNJTF9SRUZfU0hJRlQgICAgICAgICAgIDE2CisjZGVmaW5lIFM1X1NURU5DSUxfUkVGX01BU0sgICAgICAgICAgICAoMHhmZjw8MTYpCisjZGVmaW5lIFM1X1NURU5DSUxfVEVTVF9GVU5DX1NISUZUICAgICAxMworI2RlZmluZSBTNV9TVEVOQ0lMX1RFU1RfRlVOQ19NQVNLICAgICAgKDB4Nzw8MTMpCisjZGVmaW5lIFM1X1NURU5DSUxfRkFJTF9TSElGVCAgICAgICAgICAxMAorI2RlZmluZSBTNV9TVEVOQ0lMX0ZBSUxfTUFTSyAgICAgICAgICAgKDB4Nzw8MTApCisjZGVmaW5lIFM1X1NURU5DSUxfUEFTU19aX0ZBSUxfU0hJRlQgICA3CisjZGVmaW5lIFM1X1NURU5DSUxfUEFTU19aX0ZBSUxfTUFTSyAgICAoMHg3PDw3KQorI2RlZmluZSBTNV9TVEVOQ0lMX1BBU1NfWl9QQVNTX1NISUZUICAgNAorI2RlZmluZSBTNV9TVEVOQ0lMX1BBU1NfWl9QQVNTX01BU0sgICAgKDB4Nzw8NCkKKyNkZWZpbmUgUzVfU1RFTkNJTF9XUklURV9FTkFCTEUgICAgICAgICgxPDwzKQorI2RlZmluZSBTNV9TVEVOQ0lMX1RFU1RfRU5BQkxFICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFM1X0NPTE9SX0RJVEhFUl9FTkFCTEUgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgUzVfTE9HSUNPUF9FTkFCTEUgICAgICAgICAgICAgICgxPDwwKQorCisKKyNkZWZpbmUgUzZfQUxQSEFfVEVTVF9FTkFCTEUgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgUzZfQUxQSEFfVEVTVF9GVU5DX1NISUZUICAgICAgIDI4CisjZGVmaW5lIFM2X0FMUEhBX1RFU1RfRlVOQ19NQVNLICAgICAgICAoMHg3PDwyOCkKKyNkZWZpbmUgUzZfQUxQSEFfUkVGX1NISUZUICAgICAgICAgICAgIDIwCisjZGVmaW5lIFM2X0FMUEhBX1JFRl9NQVNLICAgICAgICAgICAgICAoMHhmZjw8MjApCisjZGVmaW5lIFM2X0RFUFRIX1RFU1RfRU5BQkxFICAgICAgICAgICAoMTw8MTkpCisjZGVmaW5lIFM2X0RFUFRIX1RFU1RfRlVOQ19TSElGVCAgICAgICAxNgorI2RlZmluZSBTNl9ERVBUSF9URVNUX0ZVTkNfTUFTSyAgICAgICAgKDB4Nzw8MTYpCisjZGVmaW5lIFM2X0NCVUZfQkxFTkRfRU5BQkxFICAgICAgICAgICAoMTw8MTUpCisjZGVmaW5lIFM2X0NCVUZfQkxFTkRfRlVOQ19TSElGVCAgICAgICAxMgorI2RlZmluZSBTNl9DQlVGX0JMRU5EX0ZVTkNfTUFTSyAgICAgICAgKDB4Nzw8MTIpCisjZGVmaW5lIFM2X0NCVUZfU1JDX0JMRU5EX0ZBQ1RfU0hJRlQgICA4CisjZGVmaW5lIFM2X0NCVUZfU1JDX0JMRU5EX0ZBQ1RfTUFTSyAgICAoMHhmPDw4KQorI2RlZmluZSBTNl9DQlVGX0RTVF9CTEVORF9GQUNUX1NISUZUICAgNAorI2RlZmluZSBTNl9DQlVGX0RTVF9CTEVORF9GQUNUX01BU0sgICAgKDB4Zjw8NCkKKyNkZWZpbmUgUzZfREVQVEhfV1JJVEVfRU5BQkxFICAgICAgICAgICgxPDwzKQorI2RlZmluZSBTNl9DT0xPUl9XUklURV9FTkFCTEUgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFM2X1RSSVNUUklQX1BWX1NISUZUICAgICAgICAgICAwCisjZGVmaW5lIFM2X1RSSVNUUklQX1BWX01BU0sgICAgICAgICAgICAoMHgzPDwwKQorCisjZGVmaW5lIFM3X0RFUFRIX09GRlNFVF9DT05TVF9NQVNLICAgICB+MAorCisvKiBQcmltaXRpdmUgZGlzcGF0Y2ggb24gODMwLTk0NSAqLworI2RlZmluZSBfM0RQUklNSVRJVkUJCQkoQ01EXzNEIHwgKDB4MWYgPDwgMjQpKQorI2RlZmluZSBQUklNX0lORElSRUNUICAgICAgICAgICAgKDE8PDIzKQorI2RlZmluZSBQUklNX0lOTElORSAgICAgICAgICAgICAgKDA8PDIzKQorI2RlZmluZSBQUklNX0lORElSRUNUX1NFUVVFTlRJQUwgKDA8PDE3KQorI2RlZmluZSBQUklNX0lORElSRUNUX0VMVFMgICAgICAgKDE8PDE3KQorCisjZGVmaW5lIFBSSU0zRF9UUklMSVNUCQkoMHgwPDwxOCkKKyNkZWZpbmUgUFJJTTNEX1RSSVNUUklQIAkoMHgxPDwxOCkKKyNkZWZpbmUgUFJJTTNEX1RSSVNUUklQX1JWUlNFCSgweDI8PDE4KQorI2RlZmluZSBQUklNM0RfVFJJRkFOCQkoMHgzPDwxOCkKKyNkZWZpbmUgUFJJTTNEX1BPTFkJCSgweDQ8PDE4KQorI2RlZmluZSBQUklNM0RfTElORUxJU1QgCSgweDU8PDE4KQorI2RlZmluZSBQUklNM0RfTElORVNUUklQCSgweDY8PDE4KQorI2RlZmluZSBQUklNM0RfUkVDVExJU1QgCSgweDc8PDE4KQorI2RlZmluZSBQUklNM0RfUE9JTlRMSVNUCSgweDg8PDE4KQorI2RlZmluZSBQUklNM0RfRElCCQkoMHg5PDwxOCkKKyNkZWZpbmUgUFJJTTNEX01BU0sJCSgweDFmPDwxOCkKKworI2RlZmluZSBYWV9TRVRVUF9CTFRfQ01ECQkoQ01EXzJEIHwgKDB4MDEgPDwgMjIpIHwgNikKKworI2RlZmluZSBYWV9DT0xPUl9CTFRfQ01ECQkoQ01EXzJEIHwgKDB4NTAgPDwgMjIpIHwgNCkKKworI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfQ01EICAgICAgICAgICAgIChDTURfMkQgfCAoMHg1MyA8PCAyMikgfCA2KQorCisjZGVmaW5lIFhZX1RFWFRfSU1NRURJQVRFX0JMSVRfQ01ECShDTURfMkQgfCAoMHgzMSA8PCAyMikpCisjIGRlZmluZSBYWV9URVhUX0JZVEVfUEFDS0VECQkoMSA8PCAxNikKKworLyogQlIwMCAqLworI2RlZmluZSBYWV9CTFRfV1JJVEVfQUxQSEEJKDEgPDwgMjEpCisjZGVmaW5lIFhZX0JMVF9XUklURV9SR0IJKDEgPDwgMjApCisjZGVmaW5lIFhZX1NSQ19USUxFRAkJKDEgPDwgMTUpCisjZGVmaW5lIFhZX0RTVF9USUxFRAkJKDEgPDwgMTEpCisKKy8qIEJSMTMgKi8KKyNkZWZpbmUgQlIxM181NjUJCSgweDEgPDwgMjQpCisjZGVmaW5lIEJSMTNfODg4OAkJKDB4MyA8PCAyNCkKKworI2RlZmluZSBGRU5DRV9MSU5FQVIgMAorI2RlZmluZSBGRU5DRV9YTUFKT1IgMQorI2RlZmluZSBGRU5DRV9ZTUFKT1IgMgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcmVnaW9ucy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcmVnaW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmRjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9yZWdpb25zLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFByb3ZpZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIHRvcCBvZiBidWZtZ3IgYnVmZmVyczoKKyAqICAgLSAyZCBzZW1hbnRpY3MgYW5kIGJsaXQgb3BlcmF0aW9ucworICogICAtIHJlZmNvdW50aW5nIG9mIGJ1ZmZlcnMgZm9yIG11bHRpcGxlIGltYWdlcyBpbiBhIGJ1ZmZlci4KKyAqICAgLSByZWZjb3VudGluZyBvZiBidWZmZXIgbWFwcGluZ3MuCisgKiAgIC0gc29tZSBsb2dpYyBmb3IgbW92aW5nIHRoZSBidWZmZXJzIHRvIHRoZSBiZXN0IG1lbW9yeSBwb29scyBmb3IKKyAqICAgICBnaXZlbiBvcGVyYXRpb25zLgorICoKKyAqIE1vc3Qgb2YgdGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQgdGhlIGZpeGVkLWxheW91dAorICogbWlwbWFwIHRyZWUgcmVxdWlyZWQgYnkgaW50ZWwgaGFyZHdhcmUgaW4gdGhlIGZhY2Ugb2YgR0wncworICogcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIHdoZXJlIGVhY2ggaW1hZ2UgY2FuIGJlIHNwZWNpZmVkIGluIHJhbmRvbQorICogb3JkZXIgYW5kIGl0IGlzbid0IGNsZWFyIHdoYXQgbGF5b3V0IHRoZSB0cmVlIHNob3VsZCBoYXZlIHVudGlsIHRoZQorICogbGFzdCBtb21lbnQuCisgKi8KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX2JsaXQuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgorI2luY2x1ZGUgImRyaV9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKworI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfUkVHSU9OCisKKy8qIFhYWDogVGhyZWFkIHNhZmV0eT8KKyAqLworR0x1Ynl0ZSAqCitpbnRlbF9yZWdpb25fbWFwKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uKQoreworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgIGlmICghcmVnaW9uLT5tYXBfcmVmY291bnQrKykgeworICAgICAgaWYgKHJlZ2lvbi0+cGJvKQorICAgICAgICAgaW50ZWxfcmVnaW9uX2NvdyhpbnRlbCwgcmVnaW9uKTsKKworICAgICAgZHJpX2JvX21hcChyZWdpb24tPmJ1ZmZlciwgR0xfVFJVRSk7CisgICAgICByZWdpb24tPm1hcCA9IHJlZ2lvbi0+YnVmZmVyLT52aXJ0dWFsOworICAgfQorCisgICByZXR1cm4gcmVnaW9uLT5tYXA7Cit9CisKK3ZvaWQKK2ludGVsX3JlZ2lvbl91bm1hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbikKK3sKKyAgIERCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICBpZiAoIS0tcmVnaW9uLT5tYXBfcmVmY291bnQpIHsKKyAgICAgIGRyaV9ib191bm1hcChyZWdpb24tPmJ1ZmZlcik7CisgICAgICByZWdpb24tPm1hcCA9IE5VTEw7CisgICB9Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX3NldF9yZWdpb25fdGlsaW5nX2dlbShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uLAorCQkJICAgIHVpbnQzMl90IGJvX2hhbmRsZSkKK3sKKyAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyBnZXRfdGlsaW5nOworICAgaW50IHJldDsKKworICAgbWVtc2V0KCZnZXRfdGlsaW5nLCAwLCBzaXplb2YoZ2V0X3RpbGluZykpOworCisgICBnZXRfdGlsaW5nLmhhbmRsZSA9IGJvX2hhbmRsZTsKKyAgIHJldCA9IGlvY3RsKGludGVsLT5kcmlGZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcsICZnZXRfdGlsaW5nKTsKKyAgIGlmIChyZXQgIT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0IHRpbGluZyBzdGF0ZSBmb3IgcmVnaW9uOiAlc1xuIiwKKwkgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgcmV0dXJuIHJldDsKKyAgIH0KKworICAgcmVnaW9uLT50aWxpbmcgPSBnZXRfdGlsaW5nLnRpbGluZ19tb2RlOworICAgcmVnaW9uLT5iaXRfNl9zd2l6emxlID0gZ2V0X3RpbGluZy5zd2l6emxlX21vZGU7CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3JlZ2lvbiAqCitpbnRlbF9yZWdpb25fYWxsb2NfaW50ZXJuYWwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgIEdMdWludCBjcHAsIEdMdWludCBwaXRjaCwgR0x1aW50IGhlaWdodCwKKwkJCSAgICBkcmlfYm8gKmJ1ZmZlcikKK3sKKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbjsKKworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJlZ2lvbiA9IGNhbGxvYyhzaXplb2YoKnJlZ2lvbiksIDEpOworICAgcmVnaW9uLT5jcHAgPSBjcHA7CisgICByZWdpb24tPnBpdGNoID0gcGl0Y2g7CisgICByZWdpb24tPmhlaWdodCA9IGhlaWdodDsgICAgIC8qIG5lZWRlZD8gKi8KKyAgIHJlZ2lvbi0+cmVmY291bnQgPSAxOworICAgcmVnaW9uLT5idWZmZXIgPSBidWZmZXI7CisKKyAgIC8qIERlZmF1bHQgdG8gbm8gdGlsaW5nICovCisgICByZWdpb24tPnRpbGluZyA9IEk5MTVfVElMSU5HX05PTkU7CisgICByZWdpb24tPmJpdF82X3N3aXp6bGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKworICAgcmV0dXJuIHJlZ2lvbjsKK30KKworc3RydWN0IGludGVsX3JlZ2lvbiAqCitpbnRlbF9yZWdpb25fYWxsb2Moc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgIEdMdWludCBjcHAsIEdMdWludCBwaXRjaCwgR0x1aW50IGhlaWdodCkKK3sKKyAgIGRyaV9ibyAqYnVmZmVyOworCisgICBidWZmZXIgPSBkcmlfYm9fYWxsb2MoaW50ZWwtPmJ1Zm1nciwgInJlZ2lvbiIsCisJCQkgcGl0Y2ggKiBjcHAgKiBoZWlnaHQsIDY0KTsKKworICAgcmV0dXJuIGludGVsX3JlZ2lvbl9hbGxvY19pbnRlcm5hbChpbnRlbCwgY3BwLCBwaXRjaCwgaGVpZ2h0LCBidWZmZXIpOworfQorCitzdHJ1Y3QgaW50ZWxfcmVnaW9uICoKK2ludGVsX3JlZ2lvbl9hbGxvY19mb3JfaGFuZGxlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgIEdMdWludCBjcHAsIEdMdWludCBwaXRjaCwgR0x1aW50IGhlaWdodCwKKwkJCSAgICAgIEdMdWludCBoYW5kbGUpCit7CisgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb247CisgICBkcmlfYm8gKmJ1ZmZlcjsKKworICAgYnVmZmVyID0gaW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoaW50ZWwtPmJ1Zm1nciwgImRyaTIgcmVnaW9uIiwgaGFuZGxlKTsKKworICAgcmVnaW9uID0gaW50ZWxfcmVnaW9uX2FsbG9jX2ludGVybmFsKGludGVsLCBjcHAsIHBpdGNoLCBoZWlnaHQsIGJ1ZmZlcik7CisgICBpZiAocmVnaW9uID09IE5VTEwpCisgICAgICByZXR1cm4gcmVnaW9uOworCisgICBpbnRlbF9zZXRfcmVnaW9uX3RpbGluZ19nZW0oaW50ZWwsIHJlZ2lvbiwgaGFuZGxlKTsKKworICAgcmV0dXJuIHJlZ2lvbjsKK30KKwordm9pZAoraW50ZWxfcmVnaW9uX3JlZmVyZW5jZShzdHJ1Y3QgaW50ZWxfcmVnaW9uICoqZHN0LCBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMpCit7CisgICBhc3NlcnQoKmRzdCA9PSBOVUxMKTsKKyAgIGlmIChzcmMpIHsKKyAgICAgIHNyYy0+cmVmY291bnQrKzsKKyAgICAgICpkc3QgPSBzcmM7CisgICB9Cit9CisKK3ZvaWQKK2ludGVsX3JlZ2lvbl9yZWxlYXNlKHN0cnVjdCBpbnRlbF9yZWdpb24gKipyZWdpb25faGFuZGxlKQoreworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uID0gKnJlZ2lvbl9oYW5kbGU7CisKKyAgIGlmIChyZWdpb24gPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgREJHKCIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCByZWdpb24tPnJlZmNvdW50IC0gMSk7CisKKyAgIEFTU0VSVChyZWdpb24tPnJlZmNvdW50ID4gMCk7CisgICByZWdpb24tPnJlZmNvdW50LS07CisKKyAgIGlmIChyZWdpb24tPnJlZmNvdW50ID09IDApIHsKKyAgICAgIGFzc2VydChyZWdpb24tPm1hcF9yZWZjb3VudCA9PSAwKTsKKworICAgICAgaWYgKHJlZ2lvbi0+cGJvKQorCSByZWdpb24tPnBiby0+cmVnaW9uID0gTlVMTDsKKyAgICAgIHJlZ2lvbi0+cGJvID0gTlVMTDsKKyAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZWdpb24tPmJ1ZmZlcik7CisKKyAgICAgIGlmIChyZWdpb24tPmNsYXNzaWNfbWFwICE9IE5VTEwpIHsKKwkgZHJtVW5tYXAocmVnaW9uLT5jbGFzc2ljX21hcCwKKwkJCXJlZ2lvbi0+cGl0Y2ggKiByZWdpb24tPmNwcCAqIHJlZ2lvbi0+aGVpZ2h0KTsKKyAgICAgIH0KKworICAgICAgZnJlZShyZWdpb24pOworICAgfQorICAgKnJlZ2lvbl9oYW5kbGUgPSBOVUxMOworfQorCisvKgorICogWFhYIE1vdmUgdGhpcyBpbnRvIGNvcmUgTWVzYT8KKyAqLwordm9pZAorX21lc2FfY29weV9yZWN0KEdMdWJ5dGUgKiBkc3QsCisgICAgICAgICAgICAgICAgR0x1aW50IGNwcCwKKyAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X3BpdGNoLAorICAgICAgICAgICAgICAgIEdMdWludCBkc3RfeCwKKyAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X3ksCisgICAgICAgICAgICAgICAgR0x1aW50IHdpZHRoLAorICAgICAgICAgICAgICAgIEdMdWludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgY29uc3QgR0x1Ynl0ZSAqIHNyYywKKyAgICAgICAgICAgICAgICBHTHVpbnQgc3JjX3BpdGNoLCBHTHVpbnQgc3JjX3gsIEdMdWludCBzcmNfeSkKK3sKKyAgIEdMdWludCBpOworCisgICBkc3RfcGl0Y2ggKj0gY3BwOworICAgc3JjX3BpdGNoICo9IGNwcDsKKyAgIGRzdCArPSBkc3RfeCAqIGNwcDsKKyAgIHNyYyArPSBzcmNfeCAqIGNwcDsKKyAgIGRzdCArPSBkc3RfeSAqIGRzdF9waXRjaDsKKyAgIHNyYyArPSBzcmNfeSAqIGRzdF9waXRjaDsKKyAgIHdpZHRoICo9IGNwcDsKKworICAgaWYgKHdpZHRoID09IGRzdF9waXRjaCAmJiB3aWR0aCA9PSBzcmNfcGl0Y2gpCisgICAgICBtZW1jcHkoZHN0LCBzcmMsIGhlaWdodCAqIHdpZHRoKTsKKyAgIGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIGRzdCArPSBkc3RfcGl0Y2g7CisgICAgICAgICBzcmMgKz0gc3JjX3BpdGNoOworICAgICAgfQorICAgfQorfQorCisKKy8qIFVwbG9hZCBkYXRhIHRvIGEgcmVjdGFuZ3VsYXIgc3ViLXJlZ2lvbi4gIExvdHMgb2YgY2hvaWNlcyBob3cgdG8gZG8gdGhpczoKKyAqCisgKiAtIG1lbWNweSBieSBzcGFuIHRvIGN1cnJlbnQgZGVzdGluYXRpb24KKyAqIC0gdXBsb2FkIGRhdGEgYXMgbmV3IGJ1ZmZlciBhbmQgYmxpdAorICoKKyAqIEN1cnJlbnRseSBhbHdheXMgbWVtY3B5LgorICovCit2b2lkCitpbnRlbF9yZWdpb25fZGF0YShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkc3QsCisgICAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBkc3R4LCBHTHVpbnQgZHN0eSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyYywgR0x1aW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBzcmN4LCBHTHVpbnQgc3JjeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KQoreworICAgR0xib29sZWFuIGxvY2tlZCA9IEdMX0ZBTFNFOworCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICBpZiAoaW50ZWwgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGRzdC0+cGJvKSB7CisgICAgICBpZiAoZHN0eCA9PSAwICYmCisgICAgICAgICAgZHN0eSA9PSAwICYmIHdpZHRoID09IGRzdC0+cGl0Y2ggJiYgaGVpZ2h0ID09IGRzdC0+aGVpZ2h0KQorICAgICAgICAgaW50ZWxfcmVnaW9uX3JlbGVhc2VfcGJvKGludGVsLCBkc3QpOworICAgICAgZWxzZQorICAgICAgICAgaW50ZWxfcmVnaW9uX2NvdyhpbnRlbCwgZHN0KTsKKyAgIH0KKworICAgaWYgKCFpbnRlbC0+bG9ja2VkKSB7CisgICAgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKyAgICAgIGxvY2tlZCA9IEdMX1RSVUU7CisgICB9CisKKyAgIF9tZXNhX2NvcHlfcmVjdChpbnRlbF9yZWdpb25fbWFwKGludGVsLCBkc3QpICsgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBkc3QtPmNwcCwKKyAgICAgICAgICAgICAgICAgICBkc3QtPnBpdGNoLAorICAgICAgICAgICAgICAgICAgIGRzdHgsIGRzdHksIHdpZHRoLCBoZWlnaHQsIHNyYywgc3JjX3BpdGNoLCBzcmN4LCBzcmN5KTsKKworICAgaW50ZWxfcmVnaW9uX3VubWFwKGludGVsLCBkc3QpOworCisgICBpZiAobG9ja2VkKQorICAgICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKKworfQorCisvKiBDb3B5IHJlY3Rhbmd1bGFyIHN1Yi1yZWdpb25zLiBOZWVkIGJldHRlciBsb2dpYyBhYm91dCB3aGVuIHRvCisgKiBwdXNoIGJ1ZmZlcnMgaW50byBBR1AgLSB3aWxsIGN1cnJlbnRseSBkbyBzbyB3aGVuZXZlciBwb3NzaWJsZS4KKyAqLwordm9pZAoraW50ZWxfcmVnaW9uX2NvcHkoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgR0x1aW50IGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICBHTHVpbnQgZHN0eCwgR0x1aW50IGRzdHksCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMsCisgICAgICAgICAgICAgICAgICBHTHVpbnQgc3JjX29mZnNldCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBzcmN4LCBHTHVpbnQgc3JjeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KQoreworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKGludGVsID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChkc3QtPnBibykgeworICAgICAgaWYgKGRzdHggPT0gMCAmJgorICAgICAgICAgIGRzdHkgPT0gMCAmJiB3aWR0aCA9PSBkc3QtPnBpdGNoICYmIGhlaWdodCA9PSBkc3QtPmhlaWdodCkKKyAgICAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlX3BibyhpbnRlbCwgZHN0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGludGVsX3JlZ2lvbl9jb3coaW50ZWwsIGRzdCk7CisgICB9CisKKyAgIGFzc2VydChzcmMtPmNwcCA9PSBkc3QtPmNwcCk7CisKKyAgIGludGVsRW1pdENvcHlCbGl0KGludGVsLAorICAgICAgICAgICAgICAgICAgICAgZHN0LT5jcHAsCisgICAgICAgICAgICAgICAgICAgICBzcmMtPnBpdGNoLCBzcmMtPmJ1ZmZlciwgc3JjX29mZnNldCwgc3JjLT50aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICBkc3QtPnBpdGNoLCBkc3QtPmJ1ZmZlciwgZHN0X29mZnNldCwgZHN0LT50aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICBzcmN4LCBzcmN5LCBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0LAorCQkgICAgIEdMX0NPUFkpOworfQorCisvKiBGaWxsIGEgcmVjdGFuZ3VsYXIgc3ViLXJlZ2lvbi4gIE5lZWQgYmV0dGVyIGxvZ2ljIGFib3V0IHdoZW4gdG8KKyAqIHB1c2ggYnVmZmVycyBpbnRvIEFHUCAtIHdpbGwgY3VycmVudGx5IGRvIHNvIHdoZW5ldmVyIHBvc3NpYmxlLgorICovCit2b2lkCitpbnRlbF9yZWdpb25fZmlsbChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkc3QsCisgICAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBkc3R4LCBHTHVpbnQgZHN0eSwKKyAgICAgICAgICAgICAgICAgIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0x1aW50IGNvbG9yKQoreworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKGludGVsID09IE5VTEwpCisgICAgICByZXR1cm47ICAgCisKKyAgIGlmIChkc3QtPnBibykgeworICAgICAgaWYgKGRzdHggPT0gMCAmJgorICAgICAgICAgIGRzdHkgPT0gMCAmJiB3aWR0aCA9PSBkc3QtPnBpdGNoICYmIGhlaWdodCA9PSBkc3QtPmhlaWdodCkKKyAgICAgICAgIGludGVsX3JlZ2lvbl9yZWxlYXNlX3BibyhpbnRlbCwgZHN0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGludGVsX3JlZ2lvbl9jb3coaW50ZWwsIGRzdCk7CisgICB9CisKKyAgIGludGVsRW1pdEZpbGxCbGl0KGludGVsLAorICAgICAgICAgICAgICAgICAgICAgZHN0LT5jcHAsCisgICAgICAgICAgICAgICAgICAgICBkc3QtPnBpdGNoLCBkc3QtPmJ1ZmZlciwgZHN0X29mZnNldCwgZHN0LT50aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcik7Cit9CisKKy8qIEF0dGFjaCB0byBhIHBibywgZGlzY2FyZGluZyBvdXIgZGF0YS4gIEVmZmVjdGl2ZWx5IHplcm8tY29weSB1cGxvYWQKKyAqIHRoZSBwYm8ncyBkYXRhLgorICovCit2b2lkCitpbnRlbF9yZWdpb25fYXR0YWNoX3BibyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqcGJvKQoreworICAgaWYgKHJlZ2lvbi0+cGJvID09IHBibykKKyAgICAgIHJldHVybjsKKworICAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHBibyBhdHRhY2hlZCwgYnJlYWsgdGhlIGNvdyB0aWUgbm93LgorICAgICogRG9uJ3QgY2FsbCBpbnRlbF9yZWdpb25fcmVsZWFzZV9wYm8oKSBhcyB0aGF0IHdvdWxkCisgICAgKiB1bm5lY2Vzc2FyaWx5IGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciB3ZSB3b3VsZCBoYXZlIHRvIGltbWVkaWF0ZWx5CisgICAgKiBkaXNjYXJkLgorICAgICovCisgICBpZiAocmVnaW9uLT5wYm8pIHsKKyAgICAgIHJlZ2lvbi0+cGJvLT5yZWdpb24gPSBOVUxMOworICAgICAgcmVnaW9uLT5wYm8gPSBOVUxMOworICAgfQorCisgICBpZiAocmVnaW9uLT5idWZmZXIpIHsKKyAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZWdpb24tPmJ1ZmZlcik7CisgICAgICByZWdpb24tPmJ1ZmZlciA9IE5VTEw7CisgICB9CisKKyAgIHJlZ2lvbi0+cGJvID0gcGJvOworICAgcmVnaW9uLT5wYm8tPnJlZ2lvbiA9IHJlZ2lvbjsKKyAgIGRyaV9ib19yZWZlcmVuY2UocGJvLT5idWZmZXIpOworICAgcmVnaW9uLT5idWZmZXIgPSBwYm8tPmJ1ZmZlcjsKK30KKworCisvKiBCcmVhayB0aGUgQ09XIHRpZSB0byB0aGUgcGJvIGFuZCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgKiBUaGUgcGJvIGdldHMgdG8ga2VlcCB0aGUgZGF0YS4KKyAqLwordm9pZAoraW50ZWxfcmVnaW9uX3JlbGVhc2VfcGJvKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24pCit7CisgICBhc3NlcnQocmVnaW9uLT5idWZmZXIgPT0gcmVnaW9uLT5wYm8tPmJ1ZmZlcik7CisgICByZWdpb24tPnBiby0+cmVnaW9uID0gTlVMTDsKKyAgIHJlZ2lvbi0+cGJvID0gTlVMTDsKKyAgIGRyaV9ib191bnJlZmVyZW5jZShyZWdpb24tPmJ1ZmZlcik7CisgICByZWdpb24tPmJ1ZmZlciA9IE5VTEw7CisKKyAgIHJlZ2lvbi0+YnVmZmVyID0gZHJpX2JvX2FsbG9jKGludGVsLT5idWZtZ3IsICJyZWdpb24iLAorCQkJCSByZWdpb24tPnBpdGNoICogcmVnaW9uLT5jcHAgKiByZWdpb24tPmhlaWdodCwKKwkJCQkgNjQpOworfQorCisvKiBCcmVhayB0aGUgQ09XIHRpZSB0byB0aGUgcGJvLiAgQm90aCB0aGUgcGJvIGFuZCB0aGUgcmVnaW9uIGVuZCB1cAorICogd2l0aCBhIGNvcHkgb2YgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2ludGVsX3JlZ2lvbl9jb3coc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24pCit7CisgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqcGJvID0gcmVnaW9uLT5wYm87CisgICBHTGJvb2xlYW4gd2FzX2xvY2tlZCA9IGludGVsLT5sb2NrZWQ7CisKKyAgIGlmIChpbnRlbCA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbnRlbF9yZWdpb25fcmVsZWFzZV9wYm8oaW50ZWwsIHJlZ2lvbik7CisKKyAgIGFzc2VydChyZWdpb24tPmNwcCAqIHJlZ2lvbi0+cGl0Y2ggKiByZWdpb24tPmhlaWdodCA9PSBwYm8tPkJhc2UuU2l6ZSk7CisKKyAgIERCRygiJXMgKCVkIGJ5dGVzKVxuIiwgX19GVU5DVElPTl9fLCBwYm8tPkJhc2UuU2l6ZSk7CisKKyAgIC8qIE5vdyBibGl0IGZyb20gdGhlIHRleHR1cmUgYnVmZmVyIHRvIHRoZSBuZXcgYnVmZmVyOiAKKyAgICAqLworCisgICB3YXNfbG9ja2VkID0gaW50ZWwtPmxvY2tlZDsKKyAgIGlmICghd2FzX2xvY2tlZCkKKyAgICAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICBpbnRlbEVtaXRDb3B5QmxpdChpbnRlbCwKKwkJICAgICByZWdpb24tPmNwcCwKKwkJICAgICByZWdpb24tPnBpdGNoLCByZWdpb24tPmJ1ZmZlciwgMCwgcmVnaW9uLT50aWxpbmcsCisJCSAgICAgcmVnaW9uLT5waXRjaCwgcGJvLT5idWZmZXIsIDAsIHJlZ2lvbi0+dGlsaW5nLAorCQkgICAgIDAsIDAsIDAsIDAsCisJCSAgICAgcmVnaW9uLT5waXRjaCwgcmVnaW9uLT5oZWlnaHQsCisJCSAgICAgR0xfQ09QWSk7CisKKyAgIGlmICghd2FzX2xvY2tlZCkKKyAgICAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Cit9CisKK2RyaV9ibyAqCitpbnRlbF9yZWdpb25fYnVmZmVyKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uLCBHTHVpbnQgZmxhZykKK3sKKyAgIGlmIChyZWdpb24tPnBibykgeworICAgICAgaWYgKGZsYWcgPT0gSU5URUxfV1JJVEVfUEFSVCkKKyAgICAgICAgIGludGVsX3JlZ2lvbl9jb3coaW50ZWwsIHJlZ2lvbik7CisgICAgICBlbHNlIGlmIChmbGFnID09IElOVEVMX1dSSVRFX0ZVTEwpCisgICAgICAgICBpbnRlbF9yZWdpb25fcmVsZWFzZV9wYm8oaW50ZWwsIHJlZ2lvbik7CisgICB9CisKKyAgIHJldHVybiByZWdpb24tPmJ1ZmZlcjsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF9yZWdpb24gKgoraW50ZWxfcmVjcmVhdGVfc3RhdGljKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uLAorCQkgICAgICBpbnRlbFJlZ2lvbiAqcmVnaW9uX2Rlc2MpCit7CisgICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gaW50ZWwtPmludGVsU2NyZWVuOworICAgaW50IHJldDsKKworICAgaWYgKHJlZ2lvbiA9PSBOVUxMKSB7CisgICAgICByZWdpb24gPSBjYWxsb2Moc2l6ZW9mKCpyZWdpb24pLCAxKTsKKyAgICAgIHJlZ2lvbi0+cmVmY291bnQgPSAxOworICAgfQorCisgICBpZiAoaW50ZWwtPmN0eC5WaXN1YWwucmdiQml0cyA9PSAyNCkKKyAgICAgIHJlZ2lvbi0+Y3BwID0gNDsKKyAgIGVsc2UKKyAgICAgIHJlZ2lvbi0+Y3BwID0gaW50ZWwtPmN0eC5WaXN1YWwucmdiQml0cyAvIDg7CisgICByZWdpb24tPnBpdGNoID0gaW50ZWxTY3JlZW4tPnBpdGNoOworICAgcmVnaW9uLT5oZWlnaHQgPSBpbnRlbFNjcmVlbi0+aGVpZ2h0OyAgICAgLyogbmVlZGVkPyAqLworCisgICBpZiAoaW50ZWwtPnR0bSkgeworICAgICAgYXNzZXJ0KHJlZ2lvbl9kZXNjLT5ib19oYW5kbGUgIT0gLTEpOworICAgICAgcmVnaW9uLT5idWZmZXIgPSBpbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZShpbnRlbC0+YnVmbWdyLAorCQkJCQkJICAgICBuYW1lLAorCQkJCQkJICAgICByZWdpb25fZGVzYy0+Ym9faGFuZGxlKTsKKworICAgICAgaW50ZWxfc2V0X3JlZ2lvbl90aWxpbmdfZ2VtKGludGVsLCByZWdpb24sIHJlZ2lvbl9kZXNjLT5ib19oYW5kbGUpOworICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IGRybU1hcChpbnRlbC0+ZHJpRmQsIHJlZ2lvbl9kZXNjLT5oYW5kbGUsCisJCSAgIHJlZ2lvbi0+cGl0Y2ggKiByZWdpb24tPmNwcCAqIHJlZ2lvbi0+aGVpZ2h0LAorCQkgICAmcmVnaW9uLT5jbGFzc2ljX21hcCk7CisgICAgICBpZiAocmV0ICE9IDApIHsKKwkgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZHJtTWFwICVzIGJ1ZmZlclxuIiwgbmFtZSk7CisJIGZyZWUocmVnaW9uKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIHJlZ2lvbi0+YnVmZmVyID0gaW50ZWxfYm9fZmFrZV9hbGxvY19zdGF0aWMoaW50ZWwtPmJ1Zm1nciwKKwkJCQkJCSAgbmFtZSwKKwkJCQkJCSAgcmVnaW9uX2Rlc2MtPm9mZnNldCwKKwkJCQkJCSAgcmVnaW9uLT5waXRjaCAqIHJlZ2lvbi0+Y3BwICoKKwkJCQkJCSAgcmVnaW9uLT5oZWlnaHQsCisJCQkJCQkgIHJlZ2lvbi0+Y2xhc3NpY19tYXApOworCisgICAgICAvKiBUaGUgc2FyZWEganVzdCBnaXZlcyB1cyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgaXQncyB0aWxlZCBvciBub3QsCisgICAgICAgKiBpbnN0ZWFkIG9mIHdoaWNoIHRpbGluZyBtb2RlIGl0IGlzLiAgR3Vlc3MuCisgICAgICAgKi8KKyAgICAgIGlmIChyZWdpb25fZGVzYy0+dGlsZWQpIHsKKwkgaWYgKElTXzk2NShpbnRlbC0+aW50ZWxTY3JlZW4tPmRldmljZUlEKSAmJgorCSAgICAgcmVnaW9uX2Rlc2MgPT0gJmludGVsU2NyZWVuLT5kZXB0aCkKKwkgICAgcmVnaW9uLT50aWxpbmcgPSBJOTE1X1RJTElOR19ZOworCSBlbHNlCisJICAgIHJlZ2lvbi0+dGlsaW5nID0gSTkxNV9USUxJTkdfWDsKKyAgICAgIH0gZWxzZSB7CisJIHJlZ2lvbi0+dGlsaW5nID0gSTkxNV9USUxJTkdfTk9ORTsKKyAgICAgIH0KKworICAgICAgcmVnaW9uLT5iaXRfNl9zd2l6emxlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisgICB9CisKKyAgIGFzc2VydChyZWdpb24tPmJ1ZmZlciAhPSBOVUxMKTsKKworICAgcmV0dXJuIHJlZ2lvbjsKK30KKworLyoqCisgKiBDcmVhdGUgaW50ZWxfcmVnaW9uIHN0cnVjdHMgdG8gZGVzY3JpYmUgdGhlIHN0YXRpYyBmcm9udCwgYmFjaywgYW5kIGRlcHRoCisgKiBidWZmZXJzIGNyZWF0ZWQgYnkgdGhlIHhzZXJ2ZXIuCisgKgorICogQWx0aG91Z2ggRkJPJ3MgbWVhbiB3ZSBub3cgbm8gbG9uZ2VyIHVzZSB0aGVzZSBhcyByZW5kZXIgdGFyZ2V0cyBpbgorICogYWxsIGNpcmN1bXN0YW5jZXMsIHRoZXkgd29uJ3QgZ28gYXdheSB1bnRpbCB0aGUgYmFjayBhbmQgZGVwdGgKKyAqIGJ1ZmZlcnMgYmVjb21lIHByaXZhdGUsIGFuZCB0aGUgZnJvbnQgYnVmZmVyIHdpbGwgcmVtYWluIGV2ZW4gdGhlbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgZG9uJ3QgYWxsb2NhdGUgdmlkZW8gbWVtb3J5LCBqdXN0IGRlc2NyaWJlCisgKiBhbGxvY2F0aW9ucyBhbHJlYWQgbWFkZSBieSB0aGUgWCBzZXJ2ZXIuCisgKi8KK3ZvaWQKK2ludGVsX3JlY3JlYXRlX3N0YXRpY19yZWdpb25zKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCkKK3sKKyAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4gPSBpbnRlbC0+aW50ZWxTY3JlZW47CisKKyAgIGludGVsLT5mcm9udF9yZWdpb24gPQorICAgICAgaW50ZWxfcmVjcmVhdGVfc3RhdGljKGludGVsLCAiZnJvbnQiLAorCQkJICAgIGludGVsLT5mcm9udF9yZWdpb24sCisJCQkgICAgJmludGVsU2NyZWVuLT5mcm9udCk7CisKKyAgIGludGVsLT5iYWNrX3JlZ2lvbiA9CisgICAgICBpbnRlbF9yZWNyZWF0ZV9zdGF0aWMoaW50ZWwsICJiYWNrIiwKKwkJCSAgICBpbnRlbC0+YmFja19yZWdpb24sCisJCQkgICAgJmludGVsU2NyZWVuLT5iYWNrKTsKKworI2lmZGVmIEk5MTUKKyAgIGlmIChpbnRlbFNjcmVlbi0+dGhpcmQuaGFuZGxlKSB7CisgICAgICBpbnRlbC0+dGhpcmRfcmVnaW9uID0KKwkgaW50ZWxfcmVjcmVhdGVfc3RhdGljKGludGVsLCAidGhpcmQiLAorCQkJICAgICAgIGludGVsLT50aGlyZF9yZWdpb24sCisJCQkgICAgICAgJmludGVsU2NyZWVuLT50aGlyZCk7CisgICB9CisjZW5kaWYgLyogSTkxNSAqLworCisgICAvKiBTdGlsbCBhc3N1bWVzIGZyb250LmNwcCA9PSBkZXB0aC5jcHAuICBXZSBjYW4ga2lsbCB0aGlzIHdoZW4gd2UgbW92ZSB0bworICAgICogcHJpdmF0ZSBidWZmZXJzLgorICAgICovCisgICBpbnRlbC0+ZGVwdGhfcmVnaW9uID0KKyAgICAgIGludGVsX3JlY3JlYXRlX3N0YXRpYyhpbnRlbCwgImRlcHRoIiwKKwkJCSAgICBpbnRlbC0+ZGVwdGhfcmVnaW9uLAorCQkJICAgICZpbnRlbFNjcmVlbi0+ZGVwdGgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcmVnaW9ucy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfcmVnaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZjE5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9yZWdpb25zLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5URUxfUkVHSU9OU19ICisjZGVmaW5lIElOVEVMX1JFR0lPTlNfSAorCisvKiogQGZpbGUgaW50ZWxfcmVnaW9ucy5oCisgKgorICogU3RydWN0dXJlIGRlZmluaXRpb25zIGFuZCBwcm90b3R5cGVzIGZvciBpbnRlbF9yZWdpb24gaGFuZGxpbmcsIHdoaWNoIGlzCisgKiB0aGUgYmFzaWMgc3RydWN0dXJlIGZvciByZWN0YW5ndWxhciBjb2xsZWN0aW9ucyBvZiBwaXhlbHMgc3RvcmVkIGluIGEgZHJpX2JvLgorICovCisKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJkcmlfYnVmbWdyLmgiCisKK3N0cnVjdCBpbnRlbF9jb250ZXh0Oworc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3Q7CisKKy8qKgorICogQSBsYXllciBvbiB0b3Agb2YgdGhlIGJ1Zm1nciBidWZmZXJzIHRoYXQgYWRkcyBhIGZldyB1c2VmdWwgdGhpbmdzOgorICoKKyAqIC0gUmVmY291bnRpbmcgZm9yIGxvY2FsIGJ1ZmZlciByZWZlcmVuY2VzLgorICogLSBSZWZjb3VudGluZyBmb3IgYnVmZmVyIG1hcHMKKyAqIC0gQnVmZmVyIGRpbWVuc2lvbnMgLSBwaXRjaCBhbmQgaGVpZ2h0LgorICogLSBCbGl0dGVyIGNvbW1hbmRzIGZvciBjb3B5aW5nIDJEIHJlZ2lvbnMgYmV0d2VlbiBidWZmZXJzLiAocmVhbGx5Pz8/KQorICovCitzdHJ1Y3QgaW50ZWxfcmVnaW9uCit7CisgICBkcmlfYm8gKmJ1ZmZlcjsgIC8qKjwgYnVmZmVyIG1hbmFnZXIncyBidWZmZXIgKi8KKyAgIEdMdWludCByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgZm9yIHJlZ2lvbiAqLworICAgR0x1aW50IGNwcDsgICAgICAvKio8IGJ5dGVzIHBlciBwaXhlbCAqLworICAgR0x1aW50IHBpdGNoOyAgICAvKio8IGluIHBpeGVscyAqLworICAgR0x1aW50IGhlaWdodDsgICAvKio8IGluIHBpeGVscyAqLworICAgR0x1Ynl0ZSAqbWFwOyAgICAvKio8IG9ubHkgbm9uLU5VTEwgd2hlbiByZWdpb24gaXMgYWN0dWFsbHkgbWFwcGVkICovCisgICBHTHVpbnQgbWFwX3JlZmNvdW50OyAgLyoqPCBSZWZlcmVuY2UgY291bnQgZm9yIG1hcHBpbmcgKi8KKworICAgR0x1aW50IGRyYXdfb2Zmc2V0OyAvKio8IE9mZnNldCBvZiBkcmF3aW5nIGFkZHJlc3Mgd2l0aGluIHRoZSByZWdpb24gKi8KKyAgIHVpbnQzMl90IHRpbGluZzsgLyoqPCBXaGljaCB0aWxpbmcgbW9kZSB0aGUgcmVnaW9uIGlzIGluICovCisgICB1aW50MzJfdCBiaXRfNl9zd2l6emxlOyAvKio8IEdFTSBmbGFnIGZvciBhZGRyZXNzIHN3aXp6bGluZyByZXF1aXJlbWVudCAqLworICAgZHJtQWRkcmVzcyBjbGFzc2ljX21hcDsgLyoqPCBkcm1NYXAgb2YgdGhlIHJlZ2lvbiB3aGVuIG5vdCBpbiBHRU0gbW9kZSAqLworICAgc3RydWN0IGludGVsX2J1ZmZlcl9vYmplY3QgKnBibzsgICAgIC8qIHplcm8tY29weSB1cGxvYWRzICovCit9OworCisKKy8qIEFsbG9jYXRlIGEgcmVmY291bnRlZCByZWdpb24uICBQb2ludGVycyB0byByZWdpb25zIHNob3VsZCBvbmx5IGJlCisgKiBjb3BpZWQgYnkgY2FsbGluZyBpbnRlbF9yZWZlcmVuY2VfcmVnaW9uKCkuCisgKi8KK3N0cnVjdCBpbnRlbF9yZWdpb24gKmludGVsX3JlZ2lvbl9hbGxvYyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgcGl0Y2gsIEdMdWludCBoZWlnaHQpOworCitzdHJ1Y3QgaW50ZWxfcmVnaW9uICoKK2ludGVsX3JlZ2lvbl9hbGxvY19mb3JfaGFuZGxlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgIEdMdWludCBjcHAsIEdMdWludCBwaXRjaCwgR0x1aW50IGhlaWdodCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBoYW5kbGUpOworCit2b2lkIGludGVsX3JlZ2lvbl9yZWZlcmVuY2Uoc3RydWN0IGludGVsX3JlZ2lvbiAqKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMpOworCit2b2lkIGludGVsX3JlZ2lvbl9yZWxlYXNlKHN0cnVjdCBpbnRlbF9yZWdpb24gKippYik7CisKK3ZvaWQgaW50ZWxfcmVjcmVhdGVfc3RhdGljX3JlZ2lvbnMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsKTsKKworLyogTWFwL3VubWFwIHJlZ2lvbnMuICBUaGlzIGlzIHJlZmNvdW50ZWQgYWxzbzogCisgKi8KK0dMdWJ5dGUgKmludGVsX3JlZ2lvbl9tYXAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICppYik7CisKK3ZvaWQgaW50ZWxfcmVnaW9uX3VubWFwKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX3JlZ2lvbiAqaWIpOworCisKKy8qIFVwbG9hZCBkYXRhIHRvIGEgcmVjdGFuZ3VsYXIgc3ViLXJlZ2lvbgorICovCit2b2lkIGludGVsX3JlZ2lvbl9kYXRhKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGRlc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZGVzdHgsIEdMdWludCBkZXN0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjLCBHTHVpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHNyY3gsIEdMdWludCBzcmN5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpOworCisvKiBDb3B5IHJlY3Rhbmd1bGFyIHN1Yi1yZWdpb25zCisgKi8KK3ZvaWQgaW50ZWxfcmVnaW9uX2NvcHkoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZGVzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXN0eCwgR0x1aW50IGRlc3R5LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBzcmNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgc3JjeCwgR0x1aW50IHNyY3ksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCk7CisKKy8qIEZpbGwgYSByZWN0YW5ndWxhciBzdWItcmVnaW9uCisgKi8KK3ZvaWQgaW50ZWxfcmVnaW9uX2ZpbGwoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZGVzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXN0eCwgR0x1aW50IGRlc3R5LAorICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMdWludCBjb2xvcik7CisKKy8qIEhlbHBlcnMgZm9yIHplcm9jb3B5IHVwbG9hZHMsIHBhcnRpY3VsYXJseSB0ZXh0dXJlIGltYWdlIHVwbG9hZHM6CisgKi8KK3ZvaWQgaW50ZWxfcmVnaW9uX2F0dGFjaF9wYm8oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICpwYm8pOwordm9pZCBpbnRlbF9yZWdpb25fcmVsZWFzZV9wYm8oc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uKTsKK3ZvaWQgaW50ZWxfcmVnaW9uX2NvdyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uKTsKKworZHJpX2JvICppbnRlbF9yZWdpb25fYnVmZmVyKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpyZWdpb24sCisJCQkgICAgR0x1aW50IGZsYWcpOworCit2b2lkIF9tZXNhX2NvcHlfcmVjdChHTHVieXRlICogZHN0LAorICAgICAgICAgICAgICAgIEdMdWludCBjcHAsCisgICAgICAgICAgICAgICAgR0x1aW50IGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICBHTHVpbnQgZHN0X3gsCisgICAgICAgICAgICAgICAgR0x1aW50IGRzdF95LAorICAgICAgICAgICAgICAgIEdMdWludCB3aWR0aCwKKyAgICAgICAgICAgICAgICBHTHVpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGNvbnN0IEdMdWJ5dGUgKiBzcmMsCisgICAgICAgICAgICAgICAgR0x1aW50IHNyY19waXRjaCwgR0x1aW50IHNyY194LCBHTHVpbnQgc3JjX3kpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NjcmVlbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfc2NyZWVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkODk5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NjcmVlbi5jCkBAIC0wLDAgKzEsNzk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJyZW5kZXJidWZmZXIuaCIKKyNpbmNsdWRlICJzaW1wbGVfbGlzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAidmJsYW5rLmgiCisjaW5jbHVkZSAieG1scG9vbC5oIgorCisKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKworI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9zcGFuLmgiCisjaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKKyNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCisKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorI2luY2x1ZGUgImk4MzBfZHJpLmgiCisjaW5jbHVkZSAiaW50ZWxfcmVnaW9ucy5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCisKK1BVQkxJQyBjb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdID0KKyAgIERSSV9DT05GX0JFR0lOCisgICBEUklfQ09ORl9TRUNUSU9OX1BFUkZPUk1BTkNFCisgICAgICBEUklfQ09ORl9GVEhST1RUTEVfTU9ERShEUklfQ09ORl9GVEhST1RUTEVfSVJRUykKKyAgICAgIERSSV9DT05GX1ZCTEFOS19NT0RFKERSSV9DT05GX1ZCTEFOS19BTFdBWVNfU1lOQykKKyAgICAgIC8qIE9wdGlvbnMgY29ycmVzcG9uZCB0byBEUklfQ09ORl9CT19SRVVTRV9ESVNBQkxFRCwKKyAgICAgICAqIERSSV9DT05GX0JPX1JFVVNFX0FMTAorICAgICAgICovCisgICAgICBEUklfQ09ORl9PUFRfQkVHSU5fVihib19yZXVzZSwgZW51bSwgMSwgIjA6MSIpCisJIERSSV9DT05GX0RFU0NfQkVHSU4oZW4sICJCdWZmZXIgb2JqZWN0IHJldXNlIikKKwkgICAgRFJJX0NPTkZfRU5VTSgwLCAiRGlzYWJsZSBidWZmZXIgb2JqZWN0IHJldXNlIikKKwkgICAgRFJJX0NPTkZfRU5VTSgxLCAiRW5hYmxlIHJldXNlIG9mIGFsbCBzaXplcyBvZiBidWZmZXIgb2JqZWN0cyIpCisJIERSSV9DT05GX0RFU0NfRU5ECisgICAgICBEUklfQ09ORl9PUFRfRU5ECisgICBEUklfQ09ORl9TRUNUSU9OX0VORAorICAgRFJJX0NPTkZfU0VDVElPTl9RVUFMSVRZCisgICAgICBEUklfQ09ORl9GT1JDRV9TM1RDX0VOQUJMRShmYWxzZSkKKyAgICAgIERSSV9DT05GX0FMTE9XX0xBUkdFX1RFWFRVUkVTKDIpCisgICBEUklfQ09ORl9TRUNUSU9OX0VORAorICAgRFJJX0NPTkZfU0VDVElPTl9ERUJVRworICAgICBEUklfQ09ORl9OT19SQVNUKGZhbHNlKQorICAgRFJJX0NPTkZfU0VDVElPTl9FTkQKK0RSSV9DT05GX0VORDsKKworY29uc3QgR0x1aW50IF9fZHJpTkNvbmZpZ09wdGlvbnMgPSA2OworCisjaWZkZWYgVVNFX05FV19JTlRFUkZBQ0UKK3N0YXRpYyBQRk5HTFhDUkVBVEVDT05URVhUTU9ERVMgY3JlYXRlX2NvbnRleHRfbW9kZXMgPSBOVUxMOworI2VuZGlmIC8qVVNFX05FV19JTlRFUkZBQ0UgKi8KKworLyoqCisgKiBNYXAgYWxsIHRoZSBtZW1vcnkgcmVnaW9ucyBkZXNjcmliZWQgYnkgdGhlIHNjcmVlbi4KKyAqIFxyZXR1cm4gR0xfVFJVRSBpZiBzdWNjZXNzLCBHTF9GQUxTRSBpZiBlcnJvci4KKyAqLworR0xib29sZWFuCitpbnRlbE1hcFNjcmVlblJlZ2lvbnMoX19EUklzY3JlZW5Qcml2YXRlICogc1ByaXYpCit7CisgICBpbnRlbFNjcmVlblByaXZhdGUgKmludGVsU2NyZWVuID0gKGludGVsU2NyZWVuUHJpdmF0ZSAqKSBzUHJpdi0+cHJpdmF0ZTsKKworICAgaWYgKDApCisgICAgICBfbWVzYV9wcmludGYoIlRFWCAweCUwOHggIiwgaW50ZWxTY3JlZW4tPnRleC5oYW5kbGUpOworICAgaWYgKGludGVsU2NyZWVuLT50ZXguc2l6ZSAhPSAwKSB7CisgICAgICBpZiAoZHJtTWFwKHNQcml2LT5mZCwKKwkJIGludGVsU2NyZWVuLT50ZXguaGFuZGxlLAorCQkgaW50ZWxTY3JlZW4tPnRleC5zaXplLAorCQkgKGRybUFkZHJlc3MgKikgJiBpbnRlbFNjcmVlbi0+dGV4Lm1hcCkgIT0gMCkgeworCSBpbnRlbFVubWFwU2NyZWVuUmVnaW9ucyhpbnRlbFNjcmVlbik7CisJIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3ZvaWQKK2ludGVsVW5tYXBTY3JlZW5SZWdpb25zKGludGVsU2NyZWVuUHJpdmF0ZSAqIGludGVsU2NyZWVuKQoreworICAgaWYgKGludGVsU2NyZWVuLT50ZXgubWFwKSB7CisgICAgICBkcm1Vbm1hcChpbnRlbFNjcmVlbi0+dGV4Lm1hcCwgaW50ZWxTY3JlZW4tPnRleC5zaXplKTsKKyAgICAgIGludGVsU2NyZWVuLT50ZXgubWFwID0gTlVMTDsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraW50ZWxQcmludERSSUluZm8oaW50ZWxTY3JlZW5Qcml2YXRlICogaW50ZWxTY3JlZW4sCisgICAgICAgICAgICAgICAgICBfX0RSSXNjcmVlblByaXZhdGUgKiBzUHJpdiwgSTgzMERSSVB0ciBnRFJJUHJpdikKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiKioqIEZyb250IHNpemU6ICAgMHgleCAgb2Zmc2V0OiAweCV4ICBwaXRjaDogJWRcbiIsCisgICAgICAgICAgIGludGVsU2NyZWVuLT5mcm9udC5zaXplLCBpbnRlbFNjcmVlbi0+ZnJvbnQub2Zmc2V0LAorICAgICAgICAgICBpbnRlbFNjcmVlbi0+cGl0Y2gpOworICAgZnByaW50ZihzdGRlcnIsICIqKiogQmFjayBzaXplOiAgICAweCV4ICBvZmZzZXQ6IDB4JXggIHBpdGNoOiAlZFxuIiwKKyAgICAgICAgICAgaW50ZWxTY3JlZW4tPmJhY2suc2l6ZSwgaW50ZWxTY3JlZW4tPmJhY2sub2Zmc2V0LAorICAgICAgICAgICBpbnRlbFNjcmVlbi0+cGl0Y2gpOworICAgZnByaW50ZihzdGRlcnIsICIqKiogRGVwdGggc2l6ZTogICAweCV4ICBvZmZzZXQ6IDB4JXggIHBpdGNoOiAlZFxuIiwKKyAgICAgICAgICAgaW50ZWxTY3JlZW4tPmRlcHRoLnNpemUsIGludGVsU2NyZWVuLT5kZXB0aC5vZmZzZXQsCisgICAgICAgICAgIGludGVsU2NyZWVuLT5waXRjaCk7CisgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBUZXh0dXJlIHNpemU6IDB4JXggIG9mZnNldDogMHgleFxuIiwKKyAgICAgICAgICAgaW50ZWxTY3JlZW4tPnRleC5zaXplLCBpbnRlbFNjcmVlbi0+dGV4Lm9mZnNldCk7CisgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBNZW1vcnkgOiAweCV4XG4iLCBnRFJJUHJpdi0+bWVtKTsKK30KKworCitzdGF0aWMgdm9pZAoraW50ZWxQcmludFNBUkVBKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9zYXJlYSAqIHNhcmVhKQoreworICAgZnByaW50ZihzdGRlcnIsICJTQVJFQTogc2FyZWEgd2lkdGggJWQgIGhlaWdodCAlZFxuIiwgc2FyZWEtPndpZHRoLAorICAgICAgICAgICBzYXJlYS0+aGVpZ2h0KTsKKyAgIGZwcmludGYoc3RkZXJyLCAiU0FSRUE6IHBpdGNoOiAlZFxuIiwgc2FyZWEtPnBpdGNoKTsKKyAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAiU0FSRUE6IGZyb250IG9mZnNldDogMHglMDh4ICBzaXplOiAweCV4ICBoYW5kbGU6IDB4JXggdGlsZWQ6ICVkXG4iLAorICAgICAgICAgICBzYXJlYS0+ZnJvbnRfb2Zmc2V0LCBzYXJlYS0+ZnJvbnRfc2l6ZSwKKyAgICAgICAgICAgKHVuc2lnbmVkKSBzYXJlYS0+ZnJvbnRfaGFuZGxlLCBzYXJlYS0+ZnJvbnRfdGlsZWQpOworICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICJTQVJFQTogYmFjayAgb2Zmc2V0OiAweCUwOHggIHNpemU6IDB4JXggIGhhbmRsZTogMHgleCB0aWxlZDogJWRcbiIsCisgICAgICAgICAgIHNhcmVhLT5iYWNrX29mZnNldCwgc2FyZWEtPmJhY2tfc2l6ZSwKKyAgICAgICAgICAgKHVuc2lnbmVkKSBzYXJlYS0+YmFja19oYW5kbGUsIHNhcmVhLT5iYWNrX3RpbGVkKTsKKyAgIGZwcmludGYoc3RkZXJyLCAiU0FSRUE6IGRlcHRoIG9mZnNldDogMHglMDh4ICBzaXplOiAweCV4ICBoYW5kbGU6IDB4JXggdGlsZWQ6ICVkXG4iLAorICAgICAgICAgICBzYXJlYS0+ZGVwdGhfb2Zmc2V0LCBzYXJlYS0+ZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgKHVuc2lnbmVkKSBzYXJlYS0+ZGVwdGhfaGFuZGxlLCBzYXJlYS0+ZGVwdGhfdGlsZWQpOworICAgZnByaW50ZihzdGRlcnIsICJTQVJFQTogdGV4ICAgb2Zmc2V0OiAweCUwOHggIHNpemU6IDB4JXggIGhhbmRsZTogMHgleFxuIiwKKyAgICAgICAgICAgc2FyZWEtPnRleF9vZmZzZXQsIHNhcmVhLT50ZXhfc2l6ZSwgKHVuc2lnbmVkKSBzYXJlYS0+dGV4X2hhbmRsZSk7Cit9CisKKworLyoqCisgKiBBIG51bWJlciBvZiB0aGUgc2NyZWVuIHBhcmFtZXRlcnMgYXJlIG9idGFpbmVkL2NvbXB1dGVkIGZyb20KKyAqIGluZm9ybWF0aW9uIGluIHRoZSBTQVJFQS4gIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aG9zZSBwYXJhbWV0ZXJzLgorICovCit2b2lkCitpbnRlbFVwZGF0ZVNjcmVlbkZyb21TQVJFQShpbnRlbFNjcmVlblByaXZhdGUgKiBpbnRlbFNjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1faTkxNV9zYXJlYSAqIHNhcmVhKQoreworICAgaW50ZWxTY3JlZW4tPndpZHRoID0gc2FyZWEtPndpZHRoOworICAgaW50ZWxTY3JlZW4tPmhlaWdodCA9IHNhcmVhLT5oZWlnaHQ7CisgICBpbnRlbFNjcmVlbi0+cGl0Y2ggPSBzYXJlYS0+cGl0Y2g7CisKKyAgIGludGVsU2NyZWVuLT5mcm9udC5vZmZzZXQgPSBzYXJlYS0+ZnJvbnRfb2Zmc2V0OworICAgaW50ZWxTY3JlZW4tPmZyb250LmhhbmRsZSA9IHNhcmVhLT5mcm9udF9oYW5kbGU7CisgICBpbnRlbFNjcmVlbi0+ZnJvbnQuc2l6ZSA9IHNhcmVhLT5mcm9udF9zaXplOworICAgaW50ZWxTY3JlZW4tPmZyb250LnRpbGVkID0gc2FyZWEtPmZyb250X3RpbGVkOworCisgICBpbnRlbFNjcmVlbi0+YmFjay5vZmZzZXQgPSBzYXJlYS0+YmFja19vZmZzZXQ7CisgICBpbnRlbFNjcmVlbi0+YmFjay5oYW5kbGUgPSBzYXJlYS0+YmFja19oYW5kbGU7CisgICBpbnRlbFNjcmVlbi0+YmFjay5zaXplID0gc2FyZWEtPmJhY2tfc2l6ZTsKKyAgIGludGVsU2NyZWVuLT5iYWNrLnRpbGVkID0gc2FyZWEtPmJhY2tfdGlsZWQ7CisKKyAgIGlmIChpbnRlbFNjcmVlbi0+ZHJpU2NyblByaXYtPmRkeF92ZXJzaW9uLm1pbm9yID49IDgpIHsKKyAgICAgIGludGVsU2NyZWVuLT50aGlyZC5vZmZzZXQgPSBzYXJlYS0+dGhpcmRfb2Zmc2V0OworICAgICAgaW50ZWxTY3JlZW4tPnRoaXJkLmhhbmRsZSA9IHNhcmVhLT50aGlyZF9oYW5kbGU7CisgICAgICBpbnRlbFNjcmVlbi0+dGhpcmQuc2l6ZSA9IHNhcmVhLT50aGlyZF9zaXplOworICAgICAgaW50ZWxTY3JlZW4tPnRoaXJkLnRpbGVkID0gc2FyZWEtPnRoaXJkX3RpbGVkOworICAgfQorCisgICBpbnRlbFNjcmVlbi0+ZGVwdGgub2Zmc2V0ID0gc2FyZWEtPmRlcHRoX29mZnNldDsKKyAgIGludGVsU2NyZWVuLT5kZXB0aC5oYW5kbGUgPSBzYXJlYS0+ZGVwdGhfaGFuZGxlOworICAgaW50ZWxTY3JlZW4tPmRlcHRoLnNpemUgPSBzYXJlYS0+ZGVwdGhfc2l6ZTsKKyAgIGludGVsU2NyZWVuLT5kZXB0aC50aWxlZCA9IHNhcmVhLT5kZXB0aF90aWxlZDsKKworICAgaWYgKGludGVsU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZGR4X3ZlcnNpb24ubWlub3IgPj0gOSkgeworICAgICAgaW50ZWxTY3JlZW4tPmZyb250LmJvX2hhbmRsZSA9IHNhcmVhLT5mcm9udF9ib19oYW5kbGU7CisgICAgICBpbnRlbFNjcmVlbi0+YmFjay5ib19oYW5kbGUgPSBzYXJlYS0+YmFja19ib19oYW5kbGU7CisgICAgICBpbnRlbFNjcmVlbi0+dGhpcmQuYm9faGFuZGxlID0gc2FyZWEtPnRoaXJkX2JvX2hhbmRsZTsKKyAgICAgIGludGVsU2NyZWVuLT5kZXB0aC5ib19oYW5kbGUgPSBzYXJlYS0+ZGVwdGhfYm9faGFuZGxlOworICAgfSBlbHNlIHsKKyAgICAgIGludGVsU2NyZWVuLT5mcm9udC5ib19oYW5kbGUgPSAtMTsKKyAgICAgIGludGVsU2NyZWVuLT5iYWNrLmJvX2hhbmRsZSA9IC0xOworICAgICAgaW50ZWxTY3JlZW4tPnRoaXJkLmJvX2hhbmRsZSA9IC0xOworICAgICAgaW50ZWxTY3JlZW4tPmRlcHRoLmJvX2hhbmRsZSA9IC0xOworICAgfQorCisgICBpbnRlbFNjcmVlbi0+dGV4Lm9mZnNldCA9IHNhcmVhLT50ZXhfb2Zmc2V0OworICAgaW50ZWxTY3JlZW4tPmxvZ1RleHR1cmVHcmFudWxhcml0eSA9IHNhcmVhLT5sb2dfdGV4X2dyYW51bGFyaXR5OworICAgaW50ZWxTY3JlZW4tPnRleC5oYW5kbGUgPSBzYXJlYS0+dGV4X2hhbmRsZTsKKyAgIGludGVsU2NyZWVuLT50ZXguc2l6ZSA9IHNhcmVhLT50ZXhfc2l6ZTsKKworICAgaWYgKDApCisgICAgICBpbnRlbFByaW50U0FSRUEoc2FyZWEpOworfQorCisKKy8qKgorICogRFJJMiBlbnRyeXBvaW50CisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbEhhbmRsZURyYXdhYmxlQ29uZmlnKF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiwKKwkJCSAgX19EUkljb250ZXh0UHJpdmF0ZSAqcGNwLAorCQkJICBfX0RSSURyYXdhYmxlQ29uZmlnRXZlbnQgKmV2ZW50KQoreworICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworICAgc3RydWN0IGludGVsX3JlZ2lvbiAqcmVnaW9uID0gTlVMTDsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiLCAqZGVwdGhfcmIsICpzdGVuY2lsX3JiOworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gcGNwLT5kcml2ZXJQcml2YXRlOworICAgaW50IGNwcCwgcGl0Y2g7CisKKyAgIGNwcCA9IGludGVsLT5jdHguVmlzdWFsLnJnYkJpdHMgLyA4OworICAgcGl0Y2ggPSAoKGNwcCAqIGRQcml2LT53ICsgNjMpICYgfjYzKSAvIGNwcDsKKworICAgcmIgPSBpbnRlbF9mYi0+Y29sb3JfcmJbMV07CisgICBpZiAocmIpIHsKKyAgICAgIHJlZ2lvbiA9IGludGVsX3JlZ2lvbl9hbGxvYyhpbnRlbCwgY3BwLCBwaXRjaCwgZFByaXYtPmgpOworICAgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3NldF9yZWdpb24ocmIsIHJlZ2lvbik7CisgICB9CisKKyAgIHJiID0gaW50ZWxfZmItPmNvbG9yX3JiWzJdOworICAgaWYgKHJiKSB7CisgICAgICByZWdpb24gPSBpbnRlbF9yZWdpb25fYWxsb2MoaW50ZWwsIGNwcCwgcGl0Y2gsIGRQcml2LT5oKTsKKyAgICAgIGludGVsX3JlbmRlcmJ1ZmZlcl9zZXRfcmVnaW9uKHJiLCByZWdpb24pOworICAgfQorCisgICBkZXB0aF9yYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLCBCVUZGRVJfREVQVEgpOworICAgc3RlbmNpbF9yYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLCBCVUZGRVJfU1RFTkNJTCk7CisgICBpZiAoZGVwdGhfcmIgfHwgc3RlbmNpbF9yYikKKyAgICAgIHJlZ2lvbiA9IGludGVsX3JlZ2lvbl9hbGxvYyhpbnRlbCwgY3BwLCBwaXRjaCwgZFByaXYtPmgpOworICAgaWYgKGRlcHRoX3JiKQorICAgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3NldF9yZWdpb24oZGVwdGhfcmIsIHJlZ2lvbik7CisgICBpZiAoc3RlbmNpbF9yYikKKyAgICAgIGludGVsX3JlbmRlcmJ1ZmZlcl9zZXRfcmVnaW9uKHN0ZW5jaWxfcmIsIHJlZ2lvbik7CisKKyAgIC8qIEZJWE1FOiBUZWxsIHRoZSBYIHNlcnZlciBhYm91dCB0aGUgcmVnaW9ucyB3ZSBqdXN0IGFsbG9jYXRlZCBhbmQKKyAgICAqIGF0dGFjaGVkLiAqLworfQorCisvKioKKyAqIERSSTIgZW50cnlwb2ludAorICovCitzdGF0aWMgdm9pZAoraW50ZWxIYW5kbGVCdWZmZXJBdHRhY2goX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LAorCQkJX19EUkljb250ZXh0UHJpdmF0ZSAqcGNwLAorCQkJX19EUklCdWZmZXJBdHRhY2hFdmVudCAqYmEpCit7CisgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gZFByaXYtPmRyaXZlclByaXZhdGU7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpyYjsKKyAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKnJlZ2lvbjsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IHBjcC0+ZHJpdmVyUHJpdmF0ZTsKKworICAgc3dpdGNoIChiYS0+YnVmZmVyLmF0dGFjaG1lbnQpIHsKKyAgIGNhc2UgRFJJX0RSQVdBQkxFX0JVRkZFUl9GUk9OVF9MRUZUOgorICAgICAgcmIgPSBpbnRlbF9mYi0+Y29sb3JfcmJbMF07CisgICAgICBicmVhazsKKworICAgY2FzZSBEUklfRFJBV0FCTEVfQlVGRkVSX0JBQ0tfTEVGVDoKKyAgICAgIHJiID0gaW50ZWxfZmItPmNvbG9yX3JiWzBdOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgRFJJX0RSQVdBQkxFX0JVRkZFUl9ERVBUSDoKKyAgICAgcmIgPSBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKCZpbnRlbF9mYi0+QmFzZSwgQlVGRkVSX0RFUFRIKTsKKyAgICAgYnJlYWs7CisKKyAgIGNhc2UgRFJJX0RSQVdBQkxFX0JVRkZFUl9TVEVOQ0lMOgorICAgICByYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLCBCVUZGRVJfU1RFTkNJTCk7CisgICAgIGJyZWFrOworCisgICBjYXNlIERSSV9EUkFXQUJMRV9CVUZGRVJfQUNDVU06CisgICBkZWZhdWx0OgorICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmhhbmRsZWQgYnVmZmVyIGF0dGFjaCBldmVudCwgYXR0YWNtZW50IHR5cGUgJWRcbiIsCisJICAgICAgYmEtPmJ1ZmZlci5hdHRhY2htZW50KTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmIDAKKyAgIC8qIEZJWE1FOiBBZGQgdGhpcyBzbyB3ZSBjYW4gZmlsdGVyIG91dCB3aGVuIHRoZSBYIHNlcnZlciBzZW5kcyB1cworICAgICogYXR0YWNobWVudCBldmVudHMgZm9yIHRoZSBidWZmZXJzIHdlIGp1c3QgYWxsb2NhdGVkLiAgTmVlZCB0bworICAgICogZ2V0IHRoZSBCTyBoYW5kbGUgZm9yIGEgcmVuZGVyIGJ1ZmZlci4gKi8KKyAgIGlmIChpbnRlbF9yZW5kZXJidWZmZXJfZ2V0X3JlZ2lvbl9oYW5kbGUocmIpID09IGJhLT5idWZmZXIuaGFuZGxlKQorICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgIHJlZ2lvbiA9IGludGVsX3JlZ2lvbl9hbGxvY19mb3JfaGFuZGxlKGludGVsLCBiYS0+YnVmZmVyLmNwcCwKKwkJCQkJICBiYS0+YnVmZmVyLnBpdGNoIC8gYmEtPmJ1ZmZlci5jcHAsCisJCQkJCSAgZFByaXYtPmgsCisJCQkJCSAgYmEtPmJ1ZmZlci5oYW5kbGUpOworCisgICBpbnRlbF9yZW5kZXJidWZmZXJfc2V0X3JlZ2lvbihyYiwgcmVnaW9uKTsKK30KKworc3RhdGljIGNvbnN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uIGludGVsVGV4T2Zmc2V0RXh0ZW5zaW9uID0geworICAgeyBfX0RSSV9URVhfT0ZGU0VUIH0sCisgICBpbnRlbFNldFRleE9mZnNldCwKK307CisKK3N0YXRpYyBjb25zdCBfX0RSSXRleEJ1ZmZlckV4dGVuc2lvbiBpbnRlbFRleEJ1ZmZlckV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX1RFWF9CVUZGRVIsIF9fRFJJX1RFWF9CVUZGRVJfVkVSU0lPTiB9LAorICAgaW50ZWxTZXRUZXhCdWZmZXIsCit9OworCitzdGF0aWMgY29uc3QgX19EUklleHRlbnNpb24gKmludGVsU2NyZWVuRXh0ZW5zaW9uc1tdID0geworICAgICZkcmlSZWFkRHJhd2FibGVFeHRlbnNpb24sCisgICAgJmRyaUNvcHlTdWJCdWZmZXJFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpU3dhcENvbnRyb2xFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpRnJhbWVUcmFja2luZ0V4dGVuc2lvbi5iYXNlLAorICAgICZkcmlNZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb24uYmFzZSwKKyAgICAmaW50ZWxUZXhPZmZzZXRFeHRlbnNpb24uYmFzZSwKKyAgICAmaW50ZWxUZXhCdWZmZXJFeHRlbnNpb24uYmFzZSwKKyAgICBOVUxMCit9OworCitzdGF0aWMgR0xib29sZWFuCitpbnRlbF9nZXRfcGFyYW0oX19EUklzY3JlZW5Qcml2YXRlICpwc3AsIGludCBwYXJhbSwgaW50ICp2YWx1ZSkKK3sKKyAgIGludCByZXQ7CisgICBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gZ3A7CisKKyAgIGdwLnBhcmFtID0gcGFyYW07CisgICBncC52YWx1ZSA9IHZhbHVlOworCisgICByZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKHBzcC0+ZmQsIERSTV9JOTE1X0dFVFBBUkFNLCAmZ3AsIHNpemVvZihncCkpOworICAgaWYgKHJldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJkcm1faTkxNV9nZXRwYXJhbTogJWRcbiIsIHJldCk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgR0xib29sZWFuIGludGVsSW5pdERyaXZlcihfX0RSSXNjcmVlblByaXZhdGUgKnNQcml2KQoreworICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbjsKKyAgIEk4MzBEUklQdHIgZ0RSSVByaXYgPSAoSTgzMERSSVB0cikgc1ByaXYtPnBEZXZQcml2OworICAgc3RydWN0IGRybV9pOTE1X3NhcmVhICpzYXJlYTsKKworICAgaWYgKHNQcml2LT5kZXZQcml2U2l6ZSAhPSBzaXplb2YoSTgzMERSSVJlYykpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiXG5FUlJPUiEgIHNpemVvZihJODMwRFJJUmVjKSBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgc2l6ZSBmcm9tIGRldmljZSBkcml2ZXJcbiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICAvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBhcmVhICovCisgICBpbnRlbFNjcmVlbiA9IChpbnRlbFNjcmVlblByaXZhdGUgKikgQ0FMTE9DKHNpemVvZihpbnRlbFNjcmVlblByaXZhdGUpKTsKKyAgIGlmICghaW50ZWxTY3JlZW4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5FUlJPUiEgIEFsbG9jYXRpbmcgcHJpdmF0ZSBhcmVhIGZhaWxlZFxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisgICAvKiBwYXJzZSBpbmZvcm1hdGlvbiBpbiBfX2RyaUNvbmZpZ09wdGlvbnMgKi8KKyAgIGRyaVBhcnNlT3B0aW9uSW5mbygmaW50ZWxTY3JlZW4tPm9wdGlvbkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgIF9fZHJpQ29uZmlnT3B0aW9ucywgX19kcmlOQ29uZmlnT3B0aW9ucyk7CisKKyAgIGludGVsU2NyZWVuLT5kcmlTY3JuUHJpdiA9IHNQcml2OworICAgc1ByaXYtPnByaXZhdGUgPSAodm9pZCAqKSBpbnRlbFNjcmVlbjsKKyAgIGludGVsU2NyZWVuLT5zYXJlYV9wcml2X29mZnNldCA9IGdEUklQcml2LT5zYXJlYV9wcml2X29mZnNldDsKKyAgIHNhcmVhID0gKHN0cnVjdCBkcm1faTkxNV9zYXJlYSAqKQorICAgICAgKCgoR0x1Ynl0ZSAqKSBzUHJpdi0+cFNBUkVBKSArIGludGVsU2NyZWVuLT5zYXJlYV9wcml2X29mZnNldCk7CisKKyAgIGludGVsU2NyZWVuLT5kZXZpY2VJRCA9IGdEUklQcml2LT5kZXZpY2VJRDsKKworICAgaW50ZWxVcGRhdGVTY3JlZW5Gcm9tU0FSRUEoaW50ZWxTY3JlZW4sIHNhcmVhKTsKKworICAgaWYgKCFpbnRlbE1hcFNjcmVlblJlZ2lvbnMoc1ByaXYpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRVJST1IhICBtYXBwaW5nIHJlZ2lvbnNcbiIpOworICAgICAgX21lc2FfZnJlZShpbnRlbFNjcmVlbik7CisgICAgICBzUHJpdi0+cHJpdmF0ZSA9IE5VTEw7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGludGVsU2NyZWVuLT5zYXJlYV9wcml2X29mZnNldCA9IGdEUklQcml2LT5zYXJlYV9wcml2X29mZnNldDsKKworICAgaWYgKDApCisgICAgICBpbnRlbFByaW50RFJJSW5mbyhpbnRlbFNjcmVlbiwgc1ByaXYsIGdEUklQcml2KTsKKworICAgaW50ZWxTY3JlZW4tPmRybU1pbm9yID0gc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yOworCisgICAvKiBEZXRlcm1pbmUgaWYgSVJRcyBhcmUgYWN0aXZlPyAqLworICAgaWYgKCFpbnRlbF9nZXRfcGFyYW0oc1ByaXYsIEk5MTVfUEFSQU1fSVJRX0FDVElWRSwKKwkJCSZpbnRlbFNjcmVlbi0+aXJxX2FjdGl2ZSkpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIC8qIERldGVybWluZSBpZiBiYXRjaGJ1ZmZlcnMgYXJlIGFsbG93ZWQgKi8KKyAgIGlmICghaW50ZWxfZ2V0X3BhcmFtKHNQcml2LCBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSLAorCQkJJmludGVsU2NyZWVuLT5hbGxvd19iYXRjaGJ1ZmZlcikpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIHNQcml2LT5leHRlbnNpb25zID0gaW50ZWxTY3JlZW5FeHRlbnNpb25zOworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZAoraW50ZWxEZXN0cm95U2NyZWVuKF9fRFJJc2NyZWVuUHJpdmF0ZSAqIHNQcml2KQoreworICAgaW50ZWxTY3JlZW5Qcml2YXRlICppbnRlbFNjcmVlbiA9IChpbnRlbFNjcmVlblByaXZhdGUgKikgc1ByaXYtPnByaXZhdGU7CisKKyAgIGludGVsVW5tYXBTY3JlZW5SZWdpb25zKGludGVsU2NyZWVuKTsKKworICAgRlJFRShpbnRlbFNjcmVlbik7CisgICBzUHJpdi0+cHJpdmF0ZSA9IE5VTEw7Cit9CisKKworLyoqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIG5lZWQgdG8gc2V0IHVwIEdMIHJlbmRlcmluZyB0byBhIG5ldyBYIHdpbmRvdy4KKyAqLworc3RhdGljIEdMYm9vbGVhbgoraW50ZWxDcmVhdGVCdWZmZXIoX19EUklzY3JlZW5Qcml2YXRlICogZHJpU2NyblByaXYsCisgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyaURyYXdQcml2LAorICAgICAgICAgICAgICAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1lc2FWaXMsIEdMYm9vbGVhbiBpc1BpeG1hcCkKK3sKKyAgIGludGVsU2NyZWVuUHJpdmF0ZSAqc2NyZWVuID0gKGludGVsU2NyZWVuUHJpdmF0ZSAqKSBkcmlTY3JuUHJpdi0+cHJpdmF0ZTsKKworICAgaWYgKGlzUGl4bWFwKSB7CisgICAgICByZXR1cm4gR0xfRkFMU0U7ICAgICAgICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworICAgfQorICAgZWxzZSB7CisgICAgICBHTGJvb2xlYW4gc3dTdGVuY2lsID0gKG1lc2FWaXMtPnN0ZW5jaWxCaXRzID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNhVmlzLT5kZXB0aEJpdHMgIT0gMjQpOworICAgICAgR0xlbnVtIHJnYkZvcm1hdCA9IChtZXNhVmlzLT5yZWRCaXRzID09IDUgPyBHTF9SR0I1IDogR0xfUkdCQTgpOworCisgICAgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gQ0FMTE9DX1NUUlVDVChpbnRlbF9mcmFtZWJ1ZmZlcik7CisKKyAgICAgIGlmICghaW50ZWxfZmIpCisJIHJldHVybiBHTF9GQUxTRTsKKworICAgICAgX21lc2FfaW5pdGlhbGl6ZV9mcmFtZWJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIG1lc2FWaXMpOworCisgICAgICAvKiBzZXR1cCB0aGUgaGFyZHdhcmUtYmFzZWQgcmVuZGVyYnVmZmVycyAqLworICAgICAgaW50ZWxfZmItPmNvbG9yX3JiWzBdID0gaW50ZWxfY3JlYXRlX3JlbmRlcmJ1ZmZlcihyZ2JGb3JtYXQpOworICAgICAgX21lc2FfYWRkX3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9GUk9OVF9MRUZULAorCQkJICAgICAmaW50ZWxfZmItPmNvbG9yX3JiWzBdLT5CYXNlKTsKKworICAgICAgaWYgKG1lc2FWaXMtPmRvdWJsZUJ1ZmZlck1vZGUpIHsKKwkgaW50ZWxfZmItPmNvbG9yX3JiWzFdID0gaW50ZWxfY3JlYXRlX3JlbmRlcmJ1ZmZlcihyZ2JGb3JtYXQpOworCisgICAgICAgICBfbWVzYV9hZGRfcmVuZGVyYnVmZmVyKCZpbnRlbF9mYi0+QmFzZSwgQlVGRkVSX0JBQ0tfTEVGVCwKKwkJCQkmaW50ZWxfZmItPmNvbG9yX3JiWzFdLT5CYXNlKTsKKworCSBpZiAoc2NyZWVuLT50aGlyZC5oYW5kbGUpIHsKKwkgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqdG1wX3JiID0gTlVMTDsKKworCSAgICBpbnRlbF9mYi0+Y29sb3JfcmJbMl0gPSBpbnRlbF9jcmVhdGVfcmVuZGVyYnVmZmVyKHJnYkZvcm1hdCk7CisJICAgIF9tZXNhX3JlZmVyZW5jZV9yZW5kZXJidWZmZXIoJnRtcF9yYiwgJmludGVsX2ZiLT5jb2xvcl9yYlsyXS0+QmFzZSk7CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKG1lc2FWaXMtPmRlcHRoQml0cyA9PSAyNCkgeworCSBpZiAobWVzYVZpcy0+c3RlbmNpbEJpdHMgPT0gOCkgeworCSAgICAvKiBjb21iaW5lZCBkZXB0aC9zdGVuY2lsIGJ1ZmZlciAqLworCSAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpkZXB0aFN0ZW5jaWxSYgorCSAgICAgICA9IGludGVsX2NyZWF0ZV9yZW5kZXJidWZmZXIoR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQpOworCSAgICAvKiBub3RlOiBiaW5kIFJCIHRvIHR3byBhdHRhY2htZW50IHBvaW50cyAqLworCSAgICBfbWVzYV9hZGRfcmVuZGVyYnVmZmVyKCZpbnRlbF9mYi0+QmFzZSwgQlVGRkVSX0RFUFRILAorCQkJCSAgICZkZXB0aFN0ZW5jaWxSYi0+QmFzZSk7CisJICAgIF9tZXNhX2FkZF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLCBCVUZGRVJfU1RFTkNJTCwKKwkJCQkgICAmZGVwdGhTdGVuY2lsUmItPkJhc2UpOworCSB9IGVsc2UgeworCSAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpkZXB0aFJiCisJICAgICAgID0gaW50ZWxfY3JlYXRlX3JlbmRlcmJ1ZmZlcihHTF9ERVBUSF9DT01QT05FTlQyNCk7CisJICAgIF9tZXNhX2FkZF9yZW5kZXJidWZmZXIoJmludGVsX2ZiLT5CYXNlLCBCVUZGRVJfREVQVEgsCisJCQkJICAgJmRlcHRoUmItPkJhc2UpOworCSB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChtZXNhVmlzLT5kZXB0aEJpdHMgPT0gMTYpIHsKKyAgICAgICAgIC8qIGp1c3QgMTYtYml0IGRlcHRoIGJ1ZmZlciwgbm8gaHcgc3RlbmNpbCAqLworICAgICAgICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqZGVwdGhSYgorCSAgICA9IGludGVsX2NyZWF0ZV9yZW5kZXJidWZmZXIoR0xfREVQVEhfQ09NUE9ORU5UMTYpOworICAgICAgICAgX21lc2FfYWRkX3JlbmRlcmJ1ZmZlcigmaW50ZWxfZmItPkJhc2UsIEJVRkZFUl9ERVBUSCwgJmRlcHRoUmItPkJhc2UpOworICAgICAgfQorCisgICAgICAvKiBub3cgYWRkIGFueS9hbGwgc29mdHdhcmUtYmFzZWQgcmVuZGVyYnVmZmVycyB3ZSBtYXkgbmVlZCAqLworICAgICAgX21lc2FfYWRkX3NvZnRfcmVuZGVyYnVmZmVycygmaW50ZWxfZmItPkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZBTFNFLCAvKiBuZXZlciBzdyBjb2xvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9GQUxTRSwgLyogbmV2ZXIgc3cgZGVwdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dTdGVuY2lsLCBtZXNhVmlzLT5hY2N1bVJlZEJpdHMgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9GQUxTRSwgLyogbmV2ZXIgc3cgYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkFMU0UgIC8qIG5ldmVyIHN3IGF1eCAqLyApOworICAgICAgZHJpRHJhd1ByaXYtPmRyaXZlclByaXZhdGUgPSAodm9pZCAqKSBpbnRlbF9mYjsKKworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbERlc3Ryb3lCdWZmZXIoX19EUklkcmF3YWJsZVByaXZhdGUgKiBkcmlEcmF3UHJpdikKK3sKKyAgIF9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKChHTGZyYW1lYnVmZmVyICoqKSgmKGRyaURyYXdQcml2LT5kcml2ZXJQcml2YXRlKSkpOworfQorCisKKy8qKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzIGJ1ZmZlciBzd2Fwcy4KKyAqLworc3RhdGljIGludAoraW50ZWxHZXRTd2FwSW5mbyhfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2LCBfX0RSSXN3YXBJbmZvICogc0luZm8pCit7CisgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCisgICBpZiAoKGRQcml2ID09IE5VTEwpIHx8IChkUHJpdi0+ZHJpdmVyUHJpdmF0ZSA9PSBOVUxMKQorICAgICAgIHx8IChzSW5mbyA9PSBOVUxMKSkgeworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBpbnRlbF9mYiA9IGRQcml2LT5kcml2ZXJQcml2YXRlOworICAgc0luZm8tPnN3YXBfY291bnQgPSBpbnRlbF9mYi0+c3dhcF9jb3VudDsKKyAgIHNJbmZvLT5zd2FwX3VzdCA9IGludGVsX2ZiLT5zd2FwX3VzdDsKKyAgIHNJbmZvLT5zd2FwX21pc3NlZF9jb3VudCA9IGludGVsX2ZiLT5zd2FwX21pc3NlZF9jb3VudDsKKworICAgc0luZm8tPnN3YXBfbWlzc2VkX3VzYWdlID0gKHNJbmZvLT5zd2FwX21pc3NlZF9jb3VudCAhPSAwKQorICAgICAgPyBkcmlDYWxjdWxhdGVTd2FwVXNhZ2UoZFByaXYsIDAsIGludGVsX2ZiLT5zd2FwX21pc3NlZF91c3QpCisgICAgICA6IDAuMDsKKworICAgcmV0dXJuIDA7Cit9CisKKworLyogVGhlcmUgYXJlIHByb2JhYmx5IGJldHRlciB3YXlzIHRvIGRvIHRoaXMsIHN1Y2ggYXMgYW4KKyAqIGluaXQtZGVzaWduYXRlZCBmdW5jdGlvbiB0byByZWdpc3RlciBjaGlwaWRzIGFuZCBjcmVhdGVjb250ZXh0CisgKiBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiBHTGJvb2xlYW4gaTgzMENyZWF0ZUNvbnRleHQoY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1lc2FWaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2hhcmVkQ29udGV4dFByaXZhdGUpOworCitleHRlcm4gR0xib29sZWFuIGk5MTVDcmVhdGVDb250ZXh0KGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWNvbnRleHRQcml2YXRlICogZHJpQ29udGV4dFByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlKTsKK2V4dGVybiBHTGJvb2xlYW4gYnJ3Q3JlYXRlQ29udGV4dChjb25zdCBfX0dMY29udGV4dE1vZGVzICogbWVzYVZpcywKKwkJCQkgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKwkJCQkgIHZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlKTsKKworc3RhdGljIEdMYm9vbGVhbgoraW50ZWxDcmVhdGVDb250ZXh0KGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtZXNhVmlzLAorICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSkKK3sKKyAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYgPSBkcmlDb250ZXh0UHJpdi0+ZHJpU2NyZWVuUHJpdjsKKyAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4gPSAoaW50ZWxTY3JlZW5Qcml2YXRlICopIHNQcml2LT5wcml2YXRlOworCisjaWZkZWYgSTkxNQorICAgaWYgKElTXzlYWChpbnRlbFNjcmVlbi0+ZGV2aWNlSUQpKSB7CisgICAgICBpZiAoIUlTXzk2NShpbnRlbFNjcmVlbi0+ZGV2aWNlSUQpKSB7CisJIHJldHVybiBpOTE1Q3JlYXRlQ29udGV4dChtZXNhVmlzLCBkcmlDb250ZXh0UHJpdiwKKwkJCQkgIHNoYXJlZENvbnRleHRQcml2YXRlKTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaTgzMENyZWF0ZUNvbnRleHQobWVzYVZpcywgZHJpQ29udGV4dFByaXYsIHNoYXJlZENvbnRleHRQcml2YXRlKTsKKyAgIH0KKyNlbHNlCisgICBpZiAoSVNfOTY1KGludGVsU2NyZWVuLT5kZXZpY2VJRCkpCisgICAgICByZXR1cm4gYnJ3Q3JlYXRlQ29udGV4dChtZXNhVmlzLCBkcmlDb250ZXh0UHJpdiwgc2hhcmVkQ29udGV4dFByaXZhdGUpOworI2VuZGlmCisgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBkZXZpY2VJRCAleFxuIiwgaW50ZWxTY3JlZW4tPmRldmljZUlEKTsKKyAgIHJldHVybiBHTF9GQUxTRTsKK30KKworCitzdGF0aWMgX19EUkljb25maWcgKioKK2ludGVsRmlsbEluTW9kZXMoX19EUklzY3JlZW5Qcml2YXRlICpwc3AsCisJCSB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyKQoreworICAgX19EUkljb25maWcgKipjb25maWdzOworICAgX19HTGNvbnRleHRNb2RlcyAqbTsKKyAgIHVuc2lnbmVkIGRlcHRoX2J1ZmZlcl9mYWN0b3I7CisgICB1bnNpZ25lZCBiYWNrX2J1ZmZlcl9mYWN0b3I7CisgICBHTGVudW0gZmJfZm9ybWF0OworICAgR0xlbnVtIGZiX3R5cGU7CisgICBpbnQgaTsKKworICAgLyogR0xYX1NXQVBfQ09QWV9PTUwgaXMgb25seSBzdXBwb3J0ZWQgYmVjYXVzZSB0aGUgSW50ZWwgZHJpdmVyIGRvZXNuJ3QKKyAgICAqIHN1cHBvcnQgcGFnZWZsaXBwaW5nIGF0IGFsbC4KKyAgICAqLworICAgc3RhdGljIGNvbnN0IEdMZW51bSBiYWNrX2J1ZmZlcl9tb2Rlc1tdID0geworICAgICAgR0xYX05PTkUsIEdMWF9TV0FQX1VOREVGSU5FRF9PTUwsIEdMWF9TV0FQX0NPUFlfT01MCisgICB9OworCisgICB1X2ludDhfdCBkZXB0aF9iaXRzX2FycmF5WzNdOworICAgdV9pbnQ4X3Qgc3RlbmNpbF9iaXRzX2FycmF5WzNdOworCisgICBkZXB0aF9iaXRzX2FycmF5WzBdID0gMDsKKyAgIGRlcHRoX2JpdHNfYXJyYXlbMV0gPSBkZXB0aF9iaXRzOworICAgZGVwdGhfYml0c19hcnJheVsyXSA9IGRlcHRoX2JpdHM7CisKKyAgIC8qIEp1c3QgbGlrZSB3aXRoIHRoZSBhY2N1bXVsYXRpb24gYnVmZmVyLCBhbHdheXMgcHJvdmlkZSBzb21lIG1vZGVzCisgICAgKiB3aXRoIGEgc3RlbmNpbCBidWZmZXIuICBJdCB3aWxsIGJlIGEgc3cgZmFsbGJhY2ssIGJ1dCBzb21lIGFwcHMgd29uJ3QKKyAgICAqIGNhcmUgYWJvdXQgdGhhdC4KKyAgICAqLworICAgc3RlbmNpbF9iaXRzX2FycmF5WzBdID0gMDsKKyAgIHN0ZW5jaWxfYml0c19hcnJheVsxXSA9IDA7CisgICBpZiAoZGVwdGhfYml0cyA9PSAyNCkKKyAgICAgIHN0ZW5jaWxfYml0c19hcnJheVsxXSA9IChzdGVuY2lsX2JpdHMgPT0gMCkgPyA4IDogc3RlbmNpbF9iaXRzOworCisgICBzdGVuY2lsX2JpdHNfYXJyYXlbMl0gPSAoc3RlbmNpbF9iaXRzID09IDApID8gOCA6IHN0ZW5jaWxfYml0czsKKworICAgZGVwdGhfYnVmZmVyX2ZhY3RvciA9ICgoZGVwdGhfYml0cyAhPSAwKSB8fCAoc3RlbmNpbF9iaXRzICE9IDApKSA/IDMgOiAxOworICAgYmFja19idWZmZXJfZmFjdG9yID0gKGhhdmVfYmFja19idWZmZXIpID8gMyA6IDE7CisKKyAgIGlmIChwaXhlbF9iaXRzID09IDE2KSB7CisgICAgICBmYl9mb3JtYXQgPSBHTF9SR0I7CisgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGZiX2Zvcm1hdCA9IEdMX0JHUkE7CisgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOworICAgfQorCisgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsCisJCQkgICAgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksCisJCQkgICAgICBkZXB0aF9idWZmZXJfZmFjdG9yLCBiYWNrX2J1ZmZlcl9tb2RlcywKKwkJCSAgICAgIGJhY2tfYnVmZmVyX2ZhY3Rvcik7CisgICBpZiAoY29uZmlncyA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICAvKiBNYXJrIHRoZSB2aXN1YWwgYXMgc2xvdyBpZiB0aGVyZSBhcmUgImZha2UiIHN0ZW5jaWwgYml0cy4KKyAgICAqLworICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisgICAgICBtID0gJmNvbmZpZ3NbaV0tPm1vZGVzOworICAgICAgaWYgKChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSkgeworICAgICAgICAgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gY29uZmlnczsKK30KKworCisvKioKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBjcmVhdGVOZXdTY3JlZW4gZW50cnkgcG9pbnQuCisgKiBDYWxsZWQgd2hlbiB1c2luZyBsZWdhY3kgRFJJLgorICogCisgKiBcdG9kbyBtYXliZSBmb2xkIHRoaXMgaW50byBpbnRlbEluaXREcml2ZXIKKyAqCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICovCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKippbnRlbEluaXRTY3JlZW4oX19EUklzY3JlZW5Qcml2YXRlICpwc3ApCit7CisjaWZkZWYgSTkxNQorICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkZHhfZXhwZWN0ZWQgPSB7IDEsIDUsIDAgfTsKKyNlbHNlCisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRkeF9leHBlY3RlZCA9IHsgMSwgNiwgMCB9OworI2VuZGlmCisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRyaV9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OworICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcm1fZXhwZWN0ZWQgPSB7IDEsIDUsIDAgfTsKKyAgIEk4MzBEUklQdHIgZHJpX3ByaXYgPSAoSTgzMERSSVB0cikgcHNwLT5wRGV2UHJpdjsKKworICAgaWYgKCFkcmlDaGVja0RyaURkeERybVZlcnNpb25zMigiaTkxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3AtPmRyaV92ZXJzaW9uLCAmZHJpX2V4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNwLT5kZHhfdmVyc2lvbiwgJmRkeF9leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzcC0+ZHJtX3ZlcnNpb24sICZkcm1fZXhwZWN0ZWQpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogQ2FsbGluZyBkcmlJbml0RXh0ZW5zaW9ucyBoZXJlLCB3aXRoIGEgTlVMTCBjb250ZXh0IHBvaW50ZXIsCisgICAgKiBkb2VzIG5vdCBhY3R1YWxseSBlbmFibGUgdGhlIGV4dGVuc2lvbnMuICBJdCBqdXN0IG1ha2VzIHN1cmUKKyAgICAqIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdAorICAgICogKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCisgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcworICAgICogY2FsbGVkLCBidXQgd2UgY2FuJ3QgZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYQorICAgICogY29udGV4dCBwb2ludGVyLgorICAgICoKKyAgICAqIEhlbGxvIGNoaWNrZW4uICBIZWxsbyBlZ2cuICBIb3cgYXJlIHlvdSB0d28gdG9kYXk/CisgICAgKi8KKyAgIGludGVsSW5pdEV4dGVuc2lvbnMoTlVMTCwgR0xfVFJVRSk7CisJICAgCisgICBpZiAoIWludGVsSW5pdERyaXZlcihwc3ApKQorICAgICAgIHJldHVybiBOVUxMOworCisgICBwc3AtPmV4dGVuc2lvbnMgPSBpbnRlbFNjcmVlbkV4dGVuc2lvbnM7CisKKyAgIHJldHVybiAoY29uc3QgX19EUkljb25maWcgKiopCisgICAgICAgaW50ZWxGaWxsSW5Nb2Rlcyhwc3AsIGRyaV9wcml2LT5jcHAgKiA4LAorCQkJKGRyaV9wcml2LT5jcHAgPT0gMikgPyAxNiA6IDI0LAorCQkJKGRyaV9wcml2LT5jcHAgPT0gMikgPyAwICA6IDgsIDEpOworfQorCitzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWxTY3JlZW5Db250ZXh0KGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4pCit7CisgIC8qCisgICAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBoYXZlIHRoZSBzY3JlZW4gYWxsb2NhdGUgYSBkdW1teQorICAgKiBjb250ZXh0IGF0IHNjcmVlbiBjcmVhdGlvbi4gRm9yIG5vdyBqdXN0IHVzZSB0aGUgY3VycmVudCBjb250ZXh0LgorICAgKi8KKworICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsICJObyBjdXJyZW50IGNvbnRleHQgaW4gaW50ZWxTY3JlZW5Db250ZXh0XG4iKTsKKyAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGludGVsX2NvbnRleHQoY3R4KTsKK30KKworLyoqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3BlY2lmaWMgcGFydCBvZiB0aGUgY3JlYXRlTmV3U2NyZWVuIGVudHJ5IHBvaW50LgorICogQ2FsbGVkIHdoZW4gdXNpbmcgRFJJMi4KKyAqCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICovCitzdGF0aWMgY29uc3QKK19fRFJJY29uZmlnICoqaW50ZWxJbml0U2NyZWVuMihfX0RSSXNjcmVlblByaXZhdGUgKnBzcCkKK3sKKyAgIGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW47CisKKyAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLAorICAgICogZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlCisgICAgKiB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQKKyAgICAqICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQorICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUgaXMKKyAgICAqIGNhbGxlZCwgYnV0IHdlIGNhbid0IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEKKyAgICAqIGNvbnRleHQgcG9pbnRlci4KKyAgICAqCisgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PworICAgICovCisgICBpbnRlbEluaXRFeHRlbnNpb25zKE5VTEwsIEdMX1RSVUUpOworCisgICAvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBhcmVhICovCisgICBpbnRlbFNjcmVlbiA9IChpbnRlbFNjcmVlblByaXZhdGUgKikgQ0FMTE9DKHNpemVvZihpbnRlbFNjcmVlblByaXZhdGUpKTsKKyAgIGlmICghaW50ZWxTY3JlZW4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5FUlJPUiEgIEFsbG9jYXRpbmcgcHJpdmF0ZSBhcmVhIGZhaWxlZFxuIik7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisgICAvKiBwYXJzZSBpbmZvcm1hdGlvbiBpbiBfX2RyaUNvbmZpZ09wdGlvbnMgKi8KKyAgIGRyaVBhcnNlT3B0aW9uSW5mbygmaW50ZWxTY3JlZW4tPm9wdGlvbkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgIF9fZHJpQ29uZmlnT3B0aW9ucywgX19kcmlOQ29uZmlnT3B0aW9ucyk7CisKKyAgIGludGVsU2NyZWVuLT5kcmlTY3JuUHJpdiA9IHBzcDsKKyAgIHBzcC0+cHJpdmF0ZSA9ICh2b2lkICopIGludGVsU2NyZWVuOworCisgICBpbnRlbFNjcmVlbi0+ZHJtTWlub3IgPSBwc3AtPmRybV92ZXJzaW9uLm1pbm9yOworCisgICAvKiBEZXRlcm1pbmUgY2hpcHNldCBJRD8gKi8KKyAgIGlmICghaW50ZWxfZ2V0X3BhcmFtKHBzcCwgSTkxNV9QQVJBTV9DSElQU0VUX0lELAorCQkJJmludGVsU2NyZWVuLT5kZXZpY2VJRCkpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIC8qIERldGVybWluZSBpZiBJUlFzIGFyZSBhY3RpdmU/ICovCisgICBpZiAoIWludGVsX2dldF9wYXJhbShwc3AsIEk5MTVfUEFSQU1fSVJRX0FDVElWRSwKKwkJCSZpbnRlbFNjcmVlbi0+aXJxX2FjdGl2ZSkpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIC8qIERldGVybWluZSBpZiBiYXRjaGJ1ZmZlcnMgYXJlIGFsbG93ZWQgKi8KKyAgIGlmICghaW50ZWxfZ2V0X3BhcmFtKHBzcCwgSTkxNV9QQVJBTV9BTExPV19CQVRDSEJVRkZFUiwKKwkJCSZpbnRlbFNjcmVlbi0+YWxsb3dfYmF0Y2hidWZmZXIpKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBpZiAoIWludGVsU2NyZWVuLT5hbGxvd19iYXRjaGJ1ZmZlcikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJiYXRjaCBidWZmZXIgbm90IGFsbG93ZWRcbiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBwc3AtPmV4dGVuc2lvbnMgPSBpbnRlbFNjcmVlbkV4dGVuc2lvbnM7CisKKyAgIHJldHVybiBkcmlDb25jYXRDb25maWdzKGludGVsRmlsbEluTW9kZXMocHNwLCAxNiwgMTYsIDAsIDEpLAorCQkJICAgaW50ZWxGaWxsSW5Nb2Rlcyhwc3AsIDMyLCAyNCwgOCwgMSkpOworfQorCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4JCSA9IGludGVsSW5pdFNjcmVlbiwKKyAgIC5EZXN0cm95U2NyZWVuCSA9IGludGVsRGVzdHJveVNjcmVlbiwKKyAgIC5DcmVhdGVDb250ZXh0CSA9IGludGVsQ3JlYXRlQ29udGV4dCwKKyAgIC5EZXN0cm95Q29udGV4dAkgPSBpbnRlbERlc3Ryb3lDb250ZXh0LAorICAgLkNyZWF0ZUJ1ZmZlcgkgPSBpbnRlbENyZWF0ZUJ1ZmZlciwKKyAgIC5EZXN0cm95QnVmZmVyCSA9IGludGVsRGVzdHJveUJ1ZmZlciwKKyAgIC5Td2FwQnVmZmVycwkJID0gaW50ZWxTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudAkJID0gaW50ZWxNYWtlQ3VycmVudCwKKyAgIC5VbmJpbmRDb250ZXh0CSA9IGludGVsVW5iaW5kQ29udGV4dCwKKyAgIC5HZXRTd2FwSW5mbwkJID0gaW50ZWxHZXRTd2FwSW5mbywKKyAgIC5HZXREcmF3YWJsZU1TQwkgPSBkcmlEcmF3YWJsZUdldE1TQzMyLAorICAgLldhaXRGb3JNU0MJCSA9IGRyaVdhaXRGb3JNU0MzMiwKKyAgIC5Db3B5U3ViQnVmZmVyCSA9IGludGVsQ29weVN1YkJ1ZmZlciwKKworICAgLkluaXRTY3JlZW4yCQkgPSBpbnRlbEluaXRTY3JlZW4yLAorICAgLkhhbmRsZURyYXdhYmxlQ29uZmlnID0gaW50ZWxIYW5kbGVEcmF3YWJsZUNvbmZpZywKKyAgIC5IYW5kbGVCdWZmZXJBdHRhY2gJID0gaW50ZWxIYW5kbGVCdWZmZXJBdHRhY2gsCit9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfc2NyZWVuLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF9zY3JlZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTczYjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfc2NyZWVuLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lOVEVMX0lOSVRfSF8KKyNkZWZpbmUgX0lOVEVMX0lOSVRfSF8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSAiZHJpX3V0aWwuaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorI2luY2x1ZGUgInhtbGNvbmZpZy5oIgorCisvKiBYWFg6IGNoYW5nZSBuYW1lIG9yIGVsaW1pbmF0ZSB0byBhdm9pZCBjb25mbGljdCB3aXRoICJzdHJ1Y3QKKyAqIGludGVsX3JlZ2lvbiIhISEKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIGRybV9oYW5kbGVfdCBoYW5kbGU7CisgICBkcm1TaXplIHNpemU7ICAgICAgICAgICAgICAgIC8qIHJlZ2lvbiBzaXplIGluIGJ5dGVzICovCisgICBjaGFyICptYXA7ICAgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBtYXAgKi8KKyAgIGludCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgLyogZnJvbSBzdGFydCBvZiB2aWRlbyBtZW0sIGluIGJ5dGVzICovCisgICB1bnNpZ25lZCBpbnQgYm9faGFuZGxlOwkvKiBidWZmZXIgb2JqZWN0IGlkIGlmIGF2YWlsYWJsZSwgb3IgLTEgKi8KKyAgIC8qKgorICAgICogRmxhZ3MgaWYgdGhlIHJlZ2lvbiBpcyB0aWxlZC4KKyAgICAqCisgICAgKiBOb3QgaW5jbHVkZWQgaXMgWSB2ZXJzdXMgWCB0aWxpbmcuCisgICAgKi8KKyAgIEdMYm9vbGVhbiB0aWxlZDsKK30gaW50ZWxSZWdpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBpbnRlbFJlZ2lvbiBmcm9udDsKKyAgIGludGVsUmVnaW9uIGJhY2s7CisgICBpbnRlbFJlZ2lvbiB0aGlyZDsKKyAgIGludGVsUmVnaW9uIGRlcHRoOworICAgaW50ZWxSZWdpb24gdGV4OworCisgICBpbnQgZGV2aWNlSUQ7CisgICBpbnQgd2lkdGg7CisgICBpbnQgaGVpZ2h0OworICAgaW50IHBpdGNoOyAgICAgICAgICAgICAgICAgICAvKiBjb21tb24gcm93IHN0cmlkZSwgaW4gcGl4ZWxzICovCisKKyAgIGludCBsb2dUZXh0dXJlR3JhbnVsYXJpdHk7CisKKyAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqZHJpU2NyblByaXY7CisgICB1bnNpZ25lZCBpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisKKyAgIGludCBkcm1NaW5vcjsKKworICAgaW50IGlycV9hY3RpdmU7CisgICBpbnQgYWxsb3dfYmF0Y2hidWZmZXI7CisKKyAgIGludCB0dG07CisKKyAgIC8qKgorICAgKiBDb25maWd1cmF0aW9uIGNhY2hlIHdpdGggZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBjb250ZXh0cworICAgKi8KKyAgIGRyaU9wdGlvbkNhY2hlIG9wdGlvbkNhY2hlOworfSBpbnRlbFNjcmVlblByaXZhdGU7CisKKworCitleHRlcm4gR0xib29sZWFuIGludGVsTWFwU2NyZWVuUmVnaW9ucyhfX0RSSXNjcmVlblByaXZhdGUgKiBzUHJpdik7CisKK2V4dGVybiB2b2lkIGludGVsVW5tYXBTY3JlZW5SZWdpb25zKGludGVsU2NyZWVuUHJpdmF0ZSAqIGludGVsU2NyZWVuKTsKKworZXh0ZXJuIHZvaWQKK2ludGVsVXBkYXRlU2NyZWVuRnJvbVNBUkVBKGludGVsU2NyZWVuUHJpdmF0ZSAqIGludGVsU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9pOTE1X3NhcmVhICogc2FyZWEpOworCitleHRlcm4gdm9pZCBpbnRlbERlc3Ryb3lDb250ZXh0KF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdik7CisKK2V4dGVybiBHTGJvb2xlYW4gaW50ZWxVbmJpbmRDb250ZXh0KF9fRFJJY29udGV4dFByaXZhdGUgKiBkcmlDb250ZXh0UHJpdik7CisKK2V4dGVybiBHTGJvb2xlYW4KK2ludGVsTWFrZUN1cnJlbnQoX19EUkljb250ZXh0UHJpdmF0ZSAqIGRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyaURyYXdQcml2LAorICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyaVJlYWRQcml2KTsKKworZXh0ZXJuIHZvaWQgaW50ZWxTd2FwQnVmZmVycyhfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2KTsKKworZXh0ZXJuIHZvaWQKK2ludGVsQ29weVN1YkJ1ZmZlcihfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRQcml2LCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7CisKK2V4dGVybiBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWxTY3JlZW5Db250ZXh0KGludGVsU2NyZWVuUHJpdmF0ZSAqaW50ZWxTY3JlZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NwYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVkZTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfc3Bhbi5jCkBAIC0wLDAgKzEsODE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJjb2xvcm1hYy5oIgorCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfc2NyZWVuLmgiCisjaW5jbHVkZSAiaW50ZWxfc3Bhbi5oIgorI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKyNpbmNsdWRlICJpbnRlbF9pb2N0bC5oIgorI2luY2x1ZGUgImludGVsX3RleC5oIgorCisjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgorCitzdGF0aWMgdm9pZAoraW50ZWxfc2V0X3NwYW5fZnVuY3Rpb25zKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYik7CisKKyNkZWZpbmUgU1BBTl9DQUNIRV9TSVpFCQk0MDk2CisKK3N0YXRpYyB2b2lkCitnZXRfc3Bhbl9jYWNoZShzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgIGlmIChpcmItPnNwYW5fY2FjaGUgPT0gTlVMTCkgeworICAgICAgaXJiLT5zcGFuX2NhY2hlID0gX21lc2FfbWFsbG9jKFNQQU5fQ0FDSEVfU0laRSk7CisgICAgICBpcmItPnNwYW5fY2FjaGVfb2Zmc2V0ID0gLTE7CisgICB9CisKKyAgIGlmICgob2Zmc2V0ICYgfihTUEFOX0NBQ0hFX1NJWkUgLSAxKSkgIT0gaXJiLT5zcGFuX2NhY2hlX29mZnNldCkgeworICAgICAgaXJiLT5zcGFuX2NhY2hlX29mZnNldCA9IG9mZnNldCAmIH4oU1BBTl9DQUNIRV9TSVpFIC0gMSk7CisgICAgICBkcmlfYm9fZ2V0X3N1YmRhdGEoaXJiLT5yZWdpb24tPmJ1ZmZlciwgaXJiLT5zcGFuX2NhY2hlX29mZnNldCwKKwkJCSBTUEFOX0NBQ0hFX1NJWkUsIGlyYi0+c3Bhbl9jYWNoZSk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhcl9zcGFuX2NhY2hlKHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYikKK3sKKyAgIGlyYi0+c3Bhbl9jYWNoZV9vZmZzZXQgPSAtMTsKK30KKworc3RhdGljIHVpbnQzMl90CitwcmVhZF8zMihzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgIGdldF9zcGFuX2NhY2hlKGlyYiwgb2Zmc2V0KTsKKworICAgcmV0dXJuICoodWludDMyX3QgKikoaXJiLT5zcGFuX2NhY2hlICsgKG9mZnNldCAmIChTUEFOX0NBQ0hFX1NJWkUgLSAxKSkpOworfQorCitzdGF0aWMgdWludDMyX3QKK3ByZWFkX3hyZ2I4ODg4KHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiwgdWludDMyX3Qgb2Zmc2V0KQoreworICAgZ2V0X3NwYW5fY2FjaGUoaXJiLCBvZmZzZXQpOworCisgICByZXR1cm4gKih1aW50MzJfdCAqKShpcmItPnNwYW5fY2FjaGUgKyAob2Zmc2V0ICYgKFNQQU5fQ0FDSEVfU0laRSAtIDEpKSkgfAorICAgICAgMHhmZjAwMDAwMDsKK30KKworc3RhdGljIHVpbnQxNl90CitwcmVhZF8xNihzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgIGdldF9zcGFuX2NhY2hlKGlyYiwgb2Zmc2V0KTsKKworICAgcmV0dXJuICoodWludDE2X3QgKikoaXJiLT5zcGFuX2NhY2hlICsgKG9mZnNldCAmIChTUEFOX0NBQ0hFX1NJWkUgLSAxKSkpOworfQorCitzdGF0aWMgdWludDhfdAorcHJlYWRfOChzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgIGdldF9zcGFuX2NhY2hlKGlyYiwgb2Zmc2V0KTsKKworICAgcmV0dXJuICoodWludDhfdCAqKShpcmItPnNwYW5fY2FjaGUgKyAob2Zmc2V0ICYgKFNQQU5fQ0FDSEVfU0laRSAtIDEpKSk7Cit9CisKK3N0YXRpYyB2b2lkCitwd3JpdGVfMzIoc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHZhbCkKK3sKKyAgIGNsZWFyX3NwYW5fY2FjaGUoaXJiKTsKKworICAgZHJpX2JvX3N1YmRhdGEoaXJiLT5yZWdpb24tPmJ1ZmZlciwgb2Zmc2V0LCA0LCAmdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3B3cml0ZV94cmdiODg4OChzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsKQoreworICAgY2xlYXJfc3Bhbl9jYWNoZShpcmIpOworCisgICBkcmlfYm9fc3ViZGF0YShpcmItPnJlZ2lvbi0+YnVmZmVyLCBvZmZzZXQsIDMsICZ2YWwpOworfQorCitzdGF0aWMgdm9pZAorcHdyaXRlXzE2KHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MTZfdCB2YWwpCit7CisgICBjbGVhcl9zcGFuX2NhY2hlKGlyYik7CisKKyAgIGRyaV9ib19zdWJkYXRhKGlyYi0+cmVnaW9uLT5idWZmZXIsIG9mZnNldCwgMiwgJnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitwd3JpdGVfOChzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsIHVpbnQzMl90IG9mZnNldCwgdWludDhfdCB2YWwpCit7CisgICBjbGVhcl9zcGFuX2NhY2hlKGlyYik7CisKKyAgIGRyaV9ib19zdWJkYXRhKGlyYi0+cmVnaW9uLT5idWZmZXIsIG9mZnNldCwgMSwgJnZhbCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBub190aWxlX3N3aXp6bGUoc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiLAorCQkJCXN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCQlpbnQgeCwgaW50IHkpCit7CisJeCArPSBpbnRlbC0+ZHJhd1g7CisJeSArPSBpbnRlbC0+ZHJhd1k7CisKKwlyZXR1cm4gKHkgKiBpcmItPnJlZ2lvbi0+cGl0Y2ggKyB4KSAqIGlyYi0+cmVnaW9uLT5jcHA7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggdGlsZWQgc3VyZmFjZXMKKyAqLworCitzdGF0aWMgdWludDMyX3QgeF90aWxlX3N3aXp6bGUoc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgICBpbnQgeCwgaW50IHkpCit7CisJaW50CXRpbGVfc3RyaWRlOworCWludAl4Ynl0ZTsKKwlpbnQJeF90aWxlX29mZiwgeV90aWxlX29mZjsKKwlpbnQJeF90aWxlX251bWJlciwgeV90aWxlX251bWJlcjsKKwlpbnQJdGlsZV9vZmYsIHRpbGVfYmFzZTsKKwkKKwl0aWxlX3N0cmlkZSA9IChpcmItPnBmUGl0Y2ggKiBpcmItPnJlZ2lvbi0+Y3BwKSA8PCAzOworCQorCXggKz0gaW50ZWwtPmRyYXdYOworCXkgKz0gaW50ZWwtPmRyYXdZOworCisJeGJ5dGUgPSB4ICogaXJiLT5yZWdpb24tPmNwcDsKKworCXhfdGlsZV9vZmYgPSB4Ynl0ZSAmIDB4MWZmOworCXlfdGlsZV9vZmYgPSB5ICYgNzsKKworCXhfdGlsZV9udW1iZXIgPSB4Ynl0ZSA+PiA5OworCXlfdGlsZV9udW1iZXIgPSB5ID4+IDM7CisKKwl0aWxlX29mZiA9ICh5X3RpbGVfb2ZmIDw8IDkpICsgeF90aWxlX29mZjsKKworCXN3aXRjaCAoaXJiLT5yZWdpb24tPmJpdF82X3N3aXp6bGUpIHsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOgorCSAgIGJyZWFrOworCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzk6CisJICAgdGlsZV9vZmYgXj0gKCh0aWxlX29mZiA+PiAzKSAmIDY0KTsKKwkgICBicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOgorCSAgIHRpbGVfb2ZmIF49ICgodGlsZV9vZmYgPj4gMykgJiA2NCkgXiAoKHRpbGVfb2ZmID4+IDQpICYgNjQpOworCSAgIGJyZWFrOworCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTE6CisJICAgdGlsZV9vZmYgXj0gKCh0aWxlX29mZiA+PiAzKSAmIDY0KSBeICgodGlsZV9vZmYgPj4gNSkgJiA2NCk7CisJICAgYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMToKKwkgICB0aWxlX29mZiBePSAoKHRpbGVfb2ZmID4+IDMpICYgNjQpIF4gKCh0aWxlX29mZiA+PiA0KSAmIDY0KSBeCisJICAgICAgKCh0aWxlX29mZiA+PiA1KSAmIDY0KTsKKwkgICBicmVhazsKKwlkZWZhdWx0OgorCSAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0aWxlIHN3aXp6bGluZyBtb2RlICVkXG4iLAorCQkgICBpcmItPnJlZ2lvbi0+Yml0XzZfc3dpenpsZSk7CisJICAgZXhpdCgxKTsKKwl9CisKKwl0aWxlX2Jhc2UgPSAoeF90aWxlX251bWJlciA8PCAxMikgKyB5X3RpbGVfbnVtYmVyICogdGlsZV9zdHJpZGU7CisKKyNpZiAwCisJcHJpbnRmKCIoJWQsJWQpIC0+ICVkICsgJWQgPSAlZCAocGl0Y2ggPSAlZCwgdHN0cmlkZSA9ICVkKVxuIiwKKwkgICAgICAgeCwgeSwgdGlsZV9vZmYsIHRpbGVfYmFzZSwKKwkgICAgICAgdGlsZV9vZmYgKyB0aWxlX2Jhc2UsCisJICAgICAgIGlyYi0+cGZQaXRjaCwgdGlsZV9zdHJpZGUpOworI2VuZGlmCisKKwlyZXR1cm4gdGlsZV9iYXNlICsgdGlsZV9vZmY7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB5X3RpbGVfc3dpenpsZShzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIsCisJCQkgICAgICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICAgIGludCB4LCBpbnQgeSkKK3sKKwlpbnQJdGlsZV9zdHJpZGU7CisJaW50CXhieXRlOworCWludAl4X3RpbGVfb2ZmLCB5X3RpbGVfb2ZmOworCWludAl4X3RpbGVfbnVtYmVyLCB5X3RpbGVfbnVtYmVyOworCWludAl0aWxlX29mZiwgdGlsZV9iYXNlOworCQorCXRpbGVfc3RyaWRlID0gKGlyYi0+cGZQaXRjaCAqIGlyYi0+cmVnaW9uLT5jcHApIDw8IDU7CisJCisJeCArPSBpbnRlbC0+ZHJhd1g7CisJeSArPSBpbnRlbC0+ZHJhd1k7CisKKwl4Ynl0ZSA9IHggKiBpcmItPnJlZ2lvbi0+Y3BwOworCisJeF90aWxlX29mZiA9IHhieXRlICYgMHg3ZjsKKwl5X3RpbGVfb2ZmID0geSAmIDB4MWY7CisKKwl4X3RpbGVfbnVtYmVyID0geGJ5dGUgPj4gNzsKKwl5X3RpbGVfbnVtYmVyID0geSA+PiA1OworCisJdGlsZV9vZmYgPSAoKHhfdGlsZV9vZmYgJiB+MHhmKSA8PCA1KSArICh5X3RpbGVfb2ZmIDw8IDQpICsKKwkgICAoeF90aWxlX29mZiAmIDB4Zik7CisKKwlzd2l0Y2ggKGlyYi0+cmVnaW9uLT5iaXRfNl9zd2l6emxlKSB7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORToKKwkgICBicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85OgorCSAgIHRpbGVfb2ZmIF49ICgodGlsZV9vZmYgPj4gMykgJiA2NCk7CisJICAgYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDoKKwkgICB0aWxlX29mZiBePSAoKHRpbGVfb2ZmID4+IDMpICYgNjQpIF4gKCh0aWxlX29mZiA+PiA0KSAmIDY0KTsKKwkgICBicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzExOgorCSAgIHRpbGVfb2ZmIF49ICgodGlsZV9vZmYgPj4gMykgJiA2NCkgXiAoKHRpbGVfb2ZmID4+IDUpICYgNjQpOworCSAgIGJyZWFrOworCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTE6CisJICAgdGlsZV9vZmYgXj0gKCh0aWxlX29mZiA+PiAzKSAmIDY0KSBeICgodGlsZV9vZmYgPj4gNCkgJiA2NCkgXgorCSAgICAgICgodGlsZV9vZmYgPj4gNSkgJiA2NCk7CisJICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdGlsZSBzd2l6emxpbmcgbW9kZSAlZFxuIiwKKwkJICAgaXJiLT5yZWdpb24tPmJpdF82X3N3aXp6bGUpOworCSAgIGV4aXQoMSk7CisJfQorCisJdGlsZV9iYXNlID0gKHhfdGlsZV9udW1iZXIgPDwgMTIpICsgeV90aWxlX251bWJlciAqIHRpbGVfc3RyaWRlOworCisJcmV0dXJuIHRpbGVfYmFzZSArIHRpbGVfb2ZmOworfQorCisvKgorICBicmVhayBpbnRlbFdyaXRlUkdCQVNwYW5fQVJHQjg4ODgKKyovCisKKyN1bmRlZiBEQkcKKyNkZWZpbmUgREJHIDAKKworI2RlZmluZSBMT0NBTF9WQVJTCQkJCQkJCVwKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsJCQlcCisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIgPSBpbnRlbF9yZW5kZXJidWZmZXIocmIpOwkJXAorICAgY29uc3QgR0xpbnQgeVNjYWxlID0gaXJiLT5SZW5kZXJUb1RleHR1cmUgPyAxIDogLTE7CQkJXAorICAgY29uc3QgR0xpbnQgeUJpYXMgPSBpcmItPlJlbmRlclRvVGV4dHVyZSA/IDAgOiBpcmItPkJhc2UuSGVpZ2h0IC0gMTsJXAorICAgR0x1aW50IHA7CQkJCQkJCQlcCisgICAodm9pZCkgcDsKKworLyogWFhYIEZCTzogdGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1hY3JvIGluIHNwYW50bXAyLmggZXhjZXB0IHdlIGdldAorICogdGhlIGNsaXByZWN0IGluZm8gZnJvbSB0aGUgY29udGV4dCwgbm90IHRoZSBkcmlEcmF3YWJsZS4KKyAqIE1vdmUgdGhpcyBpbnRvIHNwYW50bXAyLmggc29tZWRheS4KKyAqLworI2RlZmluZSBIV19DTElQTE9PUCgpCQkJCQkJCVwKKyAgIGRvIHsJCQkJCQkJCQlcCisgICAgICBpbnQgX25jID0gaW50ZWwtPm51bUNsaXBSZWN0czsJCQkJCVwKKyAgICAgIHdoaWxlICggX25jLS0gKSB7CQkJCQkJCVwKKwkgaW50IG1pbnggPSBpbnRlbC0+cENsaXBSZWN0c1tfbmNdLngxIC0gaW50ZWwtPmRyYXdYOwkJXAorCSBpbnQgbWlueSA9IGludGVsLT5wQ2xpcFJlY3RzW19uY10ueTEgLSBpbnRlbC0+ZHJhd1k7CQlcCisJIGludCBtYXh4ID0gaW50ZWwtPnBDbGlwUmVjdHNbX25jXS54MiAtIGludGVsLT5kcmF3WDsJCVwKKwkgaW50IG1heHkgPSBpbnRlbC0+cENsaXBSZWN0c1tfbmNdLnkyIC0gaW50ZWwtPmRyYXdZOworCQorI2lmIDAKKyAgICAgIH19CisjZW5kaWYKKworI2RlZmluZSBZX0ZMSVAoX3kpICgoX3kpICogeVNjYWxlICsgeUJpYXMpCisKKy8qIFhYWCB3aXRoIEdFTSwgdGhlc2UgbmVlZCB0byB0ZWxsIHRoZSBrZXJuZWwgKi8KKyNkZWZpbmUgSFdfTE9DSygpCisKKyNkZWZpbmUgSFdfVU5MT0NLKCkKKworLyogMTYgYml0LCBSR0I1NjUgY29sb3Igc3BhbmxpbmUgYW5kIHBpeGVsIGZ1bmN0aW9ucworICovCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfRk1UIEdMX1JHQgorI2RlZmluZSBTUEFOVE1QX1BJWEVMX1RZUEUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWwjI3gjI19SR0I1NjUKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsIyN4IyNfUkdCNTY1IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF8xNihpcmIsIG5vX3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBYLCBZKSkKKyNkZWZpbmUgUFVUX1ZBTFVFKFgsIFksIFYpIHB3cml0ZV8xNihpcmIsIG5vX3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBYLCBZKSwgVikKKyNpbmNsdWRlICJzcGFudG1wMi5oIgorCisvKiAzMiBiaXQsIEFSR0I4ODg4IGNvbG9yIHNwYW5saW5lIGFuZCBwaXhlbCBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9CR1JBCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfVFlQRSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWwjI3gjI19BUkdCODg4OAorI2RlZmluZSBUQUcyKHgseSkgaW50ZWwjI3gjI19BUkdCODg4OCMjeQorI2RlZmluZSBHRVRfVkFMVUUoWCwgWSkgcHJlYWRfMzIoaXJiLCBub190aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSkpCisjZGVmaW5lIFBVVF9WQUxVRShYLCBZLCBWKSBwd3JpdGVfMzIoaXJiLCBub190aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworLyogMzIgYml0LCB4UkdCODg4OCBjb2xvciBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgU1BBTlRNUF9QSVhFTF9GTVQgR0xfQkdSQQorI2RlZmluZSBTUEFOVE1QX1BJWEVMX1RZUEUgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWCisKKyNkZWZpbmUgVEFHKHgpICAgIGludGVsIyN4IyNfeFJHQjg4ODgKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsIyN4IyNfeFJHQjg4ODgjI3kKKyNkZWZpbmUgR0VUX1ZBTFVFKFgsIFkpIHByZWFkX3hyZ2I4ODg4KGlyYiwgbm9fdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlX3hyZ2I4ODg4KGlyYiwgbm9fdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpLCBWKQorI2luY2x1ZGUgInNwYW50bXAyLmgiCisKKy8qIDE2IGJpdCBSR0I1NjUgY29sb3IgdGlsZSBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9SR0IKKyNkZWZpbmUgU1BBTlRNUF9QSVhFTF9UWVBFIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81CisKKyNkZWZpbmUgVEFHKHgpICAgIGludGVsX1hUaWxlXyMjeCMjX1JHQjU2NQorI2RlZmluZSBUQUcyKHgseSkgaW50ZWxfWFRpbGVfIyN4IyNfUkdCNTY1IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF8xNihpcmIsIHhfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlXzE2KGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9SR0IKKyNkZWZpbmUgU1BBTlRNUF9QSVhFTF9UWVBFIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81CisKKyNkZWZpbmUgVEFHKHgpICAgIGludGVsX1lUaWxlXyMjeCMjX1JHQjU2NQorI2RlZmluZSBUQUcyKHgseSkgaW50ZWxfWVRpbGVfIyN4IyNfUkdCNTY1IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF8xNihpcmIsIHlfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlXzE2KGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworLyogMzIgYml0IEFSR0I4ODggY29sb3IgdGlsZSBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9CR1JBCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfVFlQRSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWxfWFRpbGVfIyN4IyNfQVJHQjg4ODgKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsX1hUaWxlXyMjeCMjX0FSR0I4ODg4IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF8zMihpcmIsIHhfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlXzMyKGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9CR1JBCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfVFlQRSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWxfWVRpbGVfIyN4IyNfQVJHQjg4ODgKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsX1lUaWxlXyMjeCMjX0FSR0I4ODg4IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF8zMihpcmIsIHlfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlXzMyKGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworLyogMzIgYml0IHhSR0I4ODggY29sb3IgdGlsZSBzcGFubGluZSBhbmQgcGl4ZWwgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9CR1JBCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfVFlQRSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWxfWFRpbGVfIyN4IyNfeFJHQjg4ODgKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsX1hUaWxlXyMjeCMjX3hSR0I4ODg4IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF94cmdiODg4OChpcmIsIHhfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlX3hyZ2I4ODg4KGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9CR1JBCisjZGVmaW5lIFNQQU5UTVBfUElYRUxfVFlQRSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYKKworI2RlZmluZSBUQUcoeCkgICAgaW50ZWxfWVRpbGVfIyN4IyNfeFJHQjg4ODgKKyNkZWZpbmUgVEFHMih4LHkpIGludGVsX1lUaWxlXyMjeCMjX3hSR0I4ODg4IyN5CisjZGVmaW5lIEdFVF9WQUxVRShYLCBZKSBwcmVhZF94cmdiODg4OChpcmIsIHlfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIFgsIFkpKQorI2RlZmluZSBQVVRfVkFMVUUoWCwgWSwgVikgcHdyaXRlX3hyZ2I4ODg4KGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgWCwgWSksIFYpCisjaW5jbHVkZSAic3BhbnRtcDIuaCIKKworI2RlZmluZSBMT0NBTF9ERVBUSF9WQVJTCQkJCQkJXAorICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOwkJCVwKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmlyYiA9IGludGVsX3JlbmRlcmJ1ZmZlcihyYik7CQlcCisgICBjb25zdCBHTGludCB5U2NhbGUgPSBpcmItPlJlbmRlclRvVGV4dHVyZSA/IDEgOiAtMTsJCQlcCisgICBjb25zdCBHTGludCB5QmlhcyA9IGlyYi0+UmVuZGVyVG9UZXh0dXJlID8gMCA6IGlyYi0+QmFzZS5IZWlnaHQgLSAxOworCisKKyNkZWZpbmUgTE9DQUxfU1RFTkNJTF9WQVJTIExPQ0FMX0RFUFRIX1ZBUlMKKworLyoqCisgKiogMTYtYml0IGRlcHRoYnVmZmVyIGZ1bmN0aW9ucy4KKyAqKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVzaG9ydAorI2RlZmluZSBXUklURV9ERVBUSChfeCwgX3ksIGQpIFwKKyAgIHB3cml0ZV8xNihpcmIsIG5vX3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBfeCwgX3kpLCBkKQorI2RlZmluZSBSRUFEX0RFUFRIKGQsIF94LCBfeSkgXAorICAgZCA9IHByZWFkXzE2KGlyYiwgbm9fdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSkpCisjZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjX3oxNgorI2luY2x1ZGUgImRlcHRodG1wLmgiCisKKworLyoqCisgKiogMTYtYml0IHggdGlsZSBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCisgKiovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKyNkZWZpbmUgV1JJVEVfREVQVEgoX3gsIF95LCBkKSBcCisgICBwd3JpdGVfMTYoaXJiLCB4X3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBfeCwgX3kpLCBkKQorI2RlZmluZSBSRUFEX0RFUFRIKGQsIF94LCBfeSkgXAorICAgZCA9IHByZWFkXzE2KGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSkKKyNkZWZpbmUgVEFHKHgpIGludGVsX1hUaWxlXyMjeCMjX3oxNgorI2luY2x1ZGUgImRlcHRodG1wLmgiCisKKy8qKgorICoqIDE2LWJpdCB5IHRpbGUgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgorICoqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdXNob3J0CisjZGVmaW5lIFdSSVRFX0RFUFRIKF94LCBfeSwgZCkgXAorICAgcHdyaXRlXzE2KGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSwgZCkKKyNkZWZpbmUgUkVBRF9ERVBUSChkLCBfeCwgX3kpIFwKKyAgIGQgPSBwcmVhZF8xNihpcmIsIHlfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSkpCisjZGVmaW5lIFRBRyh4KSBpbnRlbF9ZVGlsZV8jI3gjI196MTYKKyNpbmNsdWRlICJkZXB0aHRtcC5oIgorCisKKy8qKgorICoqIDI0LzgtYml0IGludGVybGVhdmVkIGRlcHRoL3N0ZW5jaWwgZnVuY3Rpb25zCisgKiogTm90ZTogd2UncmUgYWN0dWFsbHkgcmVhZGluZyBiYWNrIGNvbWJpbmVkIGRlcHRoK3N0ZW5jaWwgdmFsdWVzLgorICoqIFRoZSB3cmFwcGVycyBpbiBtYWluL2RlcHRoc3RlbmNpbC5jIGFyZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGRlcHRoCisgKiogYW5kIHN0ZW5jaWwgdmFsdWVzLgorICoqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCisvKiBDaGFuZ2UgWlpaUyAtPiBTWlpaICovCisjZGVmaW5lIFdSSVRFX0RFUFRIKF94LCBfeSwgZCkJCQkJCVwKKyAgIHB3cml0ZV8zMihpcmIsIG5vX3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBfeCwgX3kpLAkJXAorCSAgICAgKChkKSA+PiA4KSB8ICgoZCkgPDwgMjQpKQorCisvKiBDaGFuZ2UgU1paWiAtPiBaWlpTICovCisjZGVmaW5lIFJFQURfREVQVEgoIGQsIF94LCBfeSApIHsJCQkJXAorICAgR0x1aW50IHRtcCA9IHByZWFkXzMyKGlyYiwgbm9fdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSkpOwlcCisgICBkID0gKHRtcCA8PCA4KSB8ICh0bXAgPj4gMjQpOwkJCQlcCit9CisKKyNkZWZpbmUgVEFHKHgpIGludGVsIyN4IyNfejI0X3M4CisjaW5jbHVkZSAiZGVwdGh0bXAuaCIKKworCisvKioKKyAqKiAyNC84LWJpdCB4LXRpbGUgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKKyAqKiBOb3RlOiB3ZSdyZSBhY3R1YWxseSByZWFkaW5nIGJhY2sgY29tYmluZWQgZGVwdGgrc3RlbmNpbCB2YWx1ZXMuCisgKiogVGhlIHdyYXBwZXJzIGluIG1haW4vZGVwdGhzdGVuY2lsLmMgYXJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgZGVwdGgKKyAqKiBhbmQgc3RlbmNpbCB2YWx1ZXMuCisgKiovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1aW50CisKKy8qIENoYW5nZSBaWlpTIC0+IFNaWlogKi8KKyNkZWZpbmUgV1JJVEVfREVQVEgoX3gsIF95LCBkKQkJCQkJXAorICAgcHdyaXRlXzMyKGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSwJCVwKKwkgICAgICgoZCkgPj4gOCkgfCAoKGQpIDw8IDI0KSkJCQkJXAorCisvKiBDaGFuZ2UgU1paWiAtPiBaWlpTICovCisjZGVmaW5lIFJFQURfREVQVEgoIGQsIF94LCBfeSApIHsJCQkJXAorICAgR0x1aW50IHRtcCA9IHByZWFkXzMyKGlyYiwgeF90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSk7CVwKKyAgIGQgPSAodG1wIDw8IDgpIHwgKHRtcCA+PiAyNCk7CQkJCVwKK30KKworI2RlZmluZSBUQUcoeCkgaW50ZWxfWFRpbGVfIyN4IyNfejI0X3M4CisjaW5jbHVkZSAiZGVwdGh0bXAuaCIKKworLyoqCisgKiogMjQvOC1iaXQgeS10aWxlIGludGVybGVhdmVkIGRlcHRoL3N0ZW5jaWwgZnVuY3Rpb25zCisgKiogTm90ZTogd2UncmUgYWN0dWFsbHkgcmVhZGluZyBiYWNrIGNvbWJpbmVkIGRlcHRoK3N0ZW5jaWwgdmFsdWVzLgorICoqIFRoZSB3cmFwcGVycyBpbiBtYWluL2RlcHRoc3RlbmNpbC5jIGFyZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGRlcHRoCisgKiogYW5kIHN0ZW5jaWwgdmFsdWVzLgorICoqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCisvKiBDaGFuZ2UgWlpaUyAtPiBTWlpaICovCisjZGVmaW5lIFdSSVRFX0RFUFRIKF94LCBfeSwgZCkJCQkJCVwKKyAgIHB3cml0ZV8zMihpcmIsIHlfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSksCQlcCisJICAgICAoKGQpID4+IDgpIHwgKChkKSA8PCAyNCkpCisKKy8qIENoYW5nZSBTWlpaIC0+IFpaWlMgKi8KKyNkZWZpbmUgUkVBRF9ERVBUSCggZCwgX3gsIF95ICkgewkJCQlcCisgICBHTHVpbnQgdG1wID0gcHJlYWRfMzIoaXJiLCB5X3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBfeCwgX3kpKTsJXAorICAgZCA9ICh0bXAgPDwgOCkgfCAodG1wID4+IDI0KTsJCQkJXAorfQorCisjZGVmaW5lIFRBRyh4KSBpbnRlbF9ZVGlsZV8jI3gjI196MjRfczgKKyNpbmNsdWRlICJkZXB0aHRtcC5oIgorCisKKy8qKgorICoqIDgtYml0IHN0ZW5jaWwgZnVuY3Rpb24gKFhYWCBGQk86IFRoaXMgaXMgb2Jzb2xldGUpCisgKiovCisjZGVmaW5lIFdSSVRFX1NURU5DSUwoX3gsIF95LCBkKQkJCQlcCisgICBwd3JpdGVfOChpcmIsIG5vX3RpbGVfc3dpenpsZShpcmIsIGludGVsLCBfeCwgX3kpICsgMywgZCkKKworI2RlZmluZSBSRUFEX1NURU5DSUwoZCwgX3gsIF95KQkJCQkJXAorICAgZCA9IHByZWFkXzgoaXJiLCBub190aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSArIDMpOworCisjZGVmaW5lIFRBRyh4KSBpbnRlbCMjeCMjX3oyNF9zOAorI2luY2x1ZGUgInN0ZW5jaWx0bXAuaCIKKworLyoqCisgKiogOC1iaXQgeC10aWxlIHN0ZW5jaWwgZnVuY3Rpb24gKFhYWCBGQk86IFRoaXMgaXMgb2Jzb2xldGUpCisgKiovCisjZGVmaW5lIFdSSVRFX1NURU5DSUwoX3gsIF95LCBkKQkJCQlcCisgICBwd3JpdGVfOChpcmIsIHhfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSkgKyAzLCBkKQorCisjZGVmaW5lIFJFQURfU1RFTkNJTChkLCBfeCwgX3kpCQkJCQlcCisgICBkID0gcHJlYWRfOChpcmIsIHhfdGlsZV9zd2l6emxlKGlyYiwgaW50ZWwsIF94LCBfeSkgKyAzKTsKKworI2RlZmluZSBUQUcoeCkgaW50ZWxfWFRpbGVfIyN4IyNfejI0X3M4CisjaW5jbHVkZSAic3RlbmNpbHRtcC5oIgorCisvKioKKyAqKiA4LWJpdCB5LXRpbGUgc3RlbmNpbCBmdW5jdGlvbiAoWFhYIEZCTzogVGhpcyBpcyBvYnNvbGV0ZSkKKyAqKi8KKyNkZWZpbmUgV1JJVEVfU1RFTkNJTChfeCwgX3ksIGQpCQkJCVwKKyAgIHB3cml0ZV84KGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSArIDMsIGQpCisKKyNkZWZpbmUgUkVBRF9TVEVOQ0lMKGQsIF94LCBfeSkJCQkJCVwKKyAgIGQgPSBwcmVhZF84KGlyYiwgeV90aWxlX3N3aXp6bGUoaXJiLCBpbnRlbCwgX3gsIF95KSArIDMpCisKKyNkZWZpbmUgVEFHKHgpIGludGVsX1lUaWxlXyMjeCMjX3oyNF9zOAorI2luY2x1ZGUgInN0ZW5jaWx0bXAuaCIKKwordm9pZAoraW50ZWxfcmVuZGVyYnVmZmVyX21hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQoreworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiID0gaW50ZWxfcmVuZGVyYnVmZmVyKHJiKTsKKworICAgaWYgKGlyYiA9PSBOVUxMIHx8IGlyYi0+cmVnaW9uID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlyYi0+cGZQaXRjaCA9IGlyYi0+cmVnaW9uLT5waXRjaDsKKworICAgaW50ZWxfc2V0X3NwYW5fZnVuY3Rpb25zKGludGVsLCByYik7Cit9CisKK3ZvaWQKK2ludGVsX3JlbmRlcmJ1ZmZlcl91bm1hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpCit7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIgPSBpbnRlbF9yZW5kZXJidWZmZXIocmIpOworCisgICBpZiAoaXJiID09IE5VTEwgfHwgaXJiLT5yZWdpb24gPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgY2xlYXJfc3Bhbl9jYWNoZShpcmIpOworICAgaXJiLT5wZlBpdGNoID0gMDsKKworICAgcmItPkdldFJvdyA9IE5VTEw7CisgICByYi0+UHV0Um93ID0gTlVMTDsKK30KKworLyoqCisgKiBNYXAgb3IgdW5tYXAgYWxsIHRoZSByZW5kZXJidWZmZXJzIHdoaWNoIHdlIG1heSBuZWVkIGR1cmluZworICogc29mdHdhcmUgcmVuZGVyaW5nLgorICogWFhYIGluIHRoZSBmdXR1cmUsIHdlIGNvdWxkIHByb2JhYmx5IGNvbnZleSBleHRyYSBpbmZvcm1hdGlvbiB0bworICogcmVkdWNlIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgbmVlZGVkLiAgSS5lLiBpZiBkb2luZyBhIGdsUmVhZFBpeGVscworICogZnJvbSB0aGUgZGVwdGggYnVmZmVyLCB3ZSByZWFsbHkgb25seSBuZWVkIG9uZSBtYXBwaW5nLgorICoKKyAqIFhYWCBSZXdyaXRlIHRoaXMgZnVuY3Rpb24gc29tZWRheS4KKyAqIFdlIGNhbiBwcm9iYWJseSBqdXN0IGxvb3Agb3ZlciBhbGwgdGhlIHJlbmRlcmJ1ZmZlciBhdHRhY2htZW50cywKKyAqIG1hcC91bm1hcCBhbGwgb2YgdGhlbSwgYW5kIG5vdCB3b3JyeSBhYm91dCB0aGUgX0NvbG9yRHJhd0J1ZmZlcnMKKyAqIF9Db2xvclJlYWRCdWZmZXIsIF9EZXB0aEJ1ZmZlciBvciBfU3RlbmNpbEJ1ZmZlciBmaWVsZHMuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9tYXBfdW5tYXBfYnVmZmVycyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsIEdMYm9vbGVhbiBtYXApCit7CisgICBHTGNvbnRleHQgKmN0eCA9ICZpbnRlbC0+Y3R4OworICAgR0x1aW50IGksIGo7CisKKyAgIC8qIGNvbG9yIGRyYXcgYnVmZmVycyAqLworICAgZm9yIChqID0gMDsgaiA8IGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnM7IGorKykgeworICAgICAgaWYgKG1hcCkKKwkgaW50ZWxfcmVuZGVyYnVmZmVyX21hcChpbnRlbCwgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1tqXSk7CisgICAgICBlbHNlCisJIGludGVsX3JlbmRlcmJ1ZmZlcl91bm1hcChpbnRlbCwgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1tqXSk7CisgICB9CisKKyAgIC8qIGNoZWNrIGZvciByZW5kZXIgdG8gdGV4dHVyZXMgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBCVUZGRVJfQ09VTlQ7IGkrKykgeworICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlcl9hdHRhY2htZW50ICphdHQgPQorICAgICAgICAgY3R4LT5EcmF3QnVmZmVyLT5BdHRhY2htZW50ICsgaTsKKyAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4ID0gYXR0LT5UZXh0dXJlOworICAgICAgaWYgKHRleCkgeworICAgICAgICAgLyogcmVuZGVyIHRvIHRleHR1cmUgKi8KKyAgICAgICAgIEFTU0VSVChhdHQtPlJlbmRlcmJ1ZmZlcik7CisgICAgICAgICBpZiAobWFwKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1nOworICAgICAgICAgICAgdGV4SW1nID0gdGV4LT5JbWFnZVthdHQtPkN1YmVNYXBGYWNlXVthdHQtPlRleHR1cmVMZXZlbF07CisgICAgICAgICAgICBpbnRlbF90ZXhfbWFwX2ltYWdlcyhpbnRlbCwgaW50ZWxfdGV4dHVyZV9vYmplY3QodGV4KSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludGVsX3RleF91bm1hcF9pbWFnZXMoaW50ZWwsIGludGVsX3RleHR1cmVfb2JqZWN0KHRleCkpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBjb2xvciByZWFkIGJ1ZmZlcnMgKi8KKyAgIGlmIChtYXApCisgICAgICBpbnRlbF9yZW5kZXJidWZmZXJfbWFwKGludGVsLCBjdHgtPlJlYWRCdWZmZXItPl9Db2xvclJlYWRCdWZmZXIpOworICAgZWxzZQorICAgICAgaW50ZWxfcmVuZGVyYnVmZmVyX3VubWFwKGludGVsLCBjdHgtPlJlYWRCdWZmZXItPl9Db2xvclJlYWRCdWZmZXIpOworCisgICAvKiBkZXB0aCBidWZmZXIgKE5vdGUgd3JhcHBlciEpICovCisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fRGVwdGhCdWZmZXIpIHsKKyAgICAgIGlmIChtYXApCisJIGludGVsX3JlbmRlcmJ1ZmZlcl9tYXAoaW50ZWwsIGN0eC0+RHJhd0J1ZmZlci0+X0RlcHRoQnVmZmVyLT5XcmFwcGVkKTsKKyAgICAgIGVsc2UKKwkgaW50ZWxfcmVuZGVyYnVmZmVyX3VubWFwKGludGVsLAorCQkJCSAgY3R4LT5EcmF3QnVmZmVyLT5fRGVwdGhCdWZmZXItPldyYXBwZWQpOworICAgfQorCisgICAvKiBzdGVuY2lsIGJ1ZmZlciAoTm90ZSB3cmFwcGVyISkgKi8KKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9TdGVuY2lsQnVmZmVyKSB7CisgICAgICBpZiAobWFwKQorCSBpbnRlbF9yZW5kZXJidWZmZXJfbWFwKGludGVsLAorCQkJCWN0eC0+RHJhd0J1ZmZlci0+X1N0ZW5jaWxCdWZmZXItPldyYXBwZWQpOworICAgICAgZWxzZQorCSBpbnRlbF9yZW5kZXJidWZmZXJfdW5tYXAoaW50ZWwsCisJCQkJICBjdHgtPkRyYXdCdWZmZXItPl9TdGVuY2lsQnVmZmVyLT5XcmFwcGVkKTsKKyAgIH0KK30KKworCisKKy8qKgorICogUHJlcGFyZSBmb3Igc29mdGFyZSByZW5kZXJpbmcuICBNYXAgY3VycmVudCByZWFkL2RyYXcgZnJhbWVidWZmZXJzJworICogcmVuZGVyYnVmZmVzIGFuZCBhbGwgY3VycmVudGx5IGJvdW5kIHRleHR1cmUgb2JqZWN0cy4KKyAqCisgKiBPbGQgbm90ZTogTW92ZWQgbG9ja2luZyBvdXQgdG8gZ2V0IHJlYXNvbmFibGUgc3BhbiBwZXJmb3JtYW5jZS4KKyAqLwordm9pZAoraW50ZWxTcGFuUmVuZGVyU3RhcnQoR0xjb250ZXh0ICogY3R4KQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgR0x1aW50IGk7CisKKyAgIGludGVsRmx1c2goJmludGVsLT5jdHgpOworICAgTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzOyBpKyspIHsKKyAgICAgIGlmIChjdHgtPlRleHR1cmUuVW5pdFtpXS5fUmVhbGx5RW5hYmxlZCkgeworICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogPSBjdHgtPlRleHR1cmUuVW5pdFtpXS5fQ3VycmVudDsKKyAgICAgICAgIGludGVsX3RleF9tYXBfaW1hZ2VzKGludGVsLCBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopKTsKKyAgICAgIH0KKyAgIH0KKworICAgaW50ZWxfbWFwX3VubWFwX2J1ZmZlcnMoaW50ZWwsIEdMX1RSVUUpOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIGRvbmUgc29mdGFyZSByZW5kZXJpbmcuICBVbm1hcCB0aGUgYnVmZmVycyB3ZSBtYXBwZWQgaW4KKyAqIHRoZSBhYm92ZSBmdW5jdGlvbi4KKyAqLwordm9pZAoraW50ZWxTcGFuUmVuZGVyRmluaXNoKEdMY29udGV4dCAqIGN0eCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIEdMdWludCBpOworCisgICBfc3dyYXN0X2ZsdXNoKGN0eCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzOyBpKyspIHsKKyAgICAgIGlmIChjdHgtPlRleHR1cmUuVW5pdFtpXS5fUmVhbGx5RW5hYmxlZCkgeworICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogPSBjdHgtPlRleHR1cmUuVW5pdFtpXS5fQ3VycmVudDsKKyAgICAgICAgIGludGVsX3RleF91bm1hcF9pbWFnZXMoaW50ZWwsIGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaikpOworICAgICAgfQorICAgfQorCisgICBpbnRlbF9tYXBfdW5tYXBfYnVmZmVycyhpbnRlbCwgR0xfRkFMU0UpOworCisgICBVTkxPQ0tfSEFSRFdBUkUoaW50ZWwpOworfQorCisKK3ZvaWQKK2ludGVsSW5pdFNwYW5GdW5jcyhHTGNvbnRleHQgKiBjdHgpCit7CisgICBzdHJ1Y3Qgc3dyYXN0X2RldmljZV9kcml2ZXIgKnN3ZGQgPSBfc3dyYXN0X0dldERldmljZURyaXZlclJlZmVyZW5jZShjdHgpOworICAgc3dkZC0+U3BhblJlbmRlclN0YXJ0ID0gaW50ZWxTcGFuUmVuZGVyU3RhcnQ7CisgICBzd2RkLT5TcGFuUmVuZGVyRmluaXNoID0gaW50ZWxTcGFuUmVuZGVyRmluaXNoOworfQorCisKKy8qKgorICogUGx1ZyBpbiBhcHByb3ByaWF0ZSBzcGFuIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGZvciB0aGUgZ2l2ZW4gcmVuZGVyYnVmZmVyLgorICogVGhlc2UgYXJlIHVzZWQgZm9yIHRoZSBzb2Z0d2FyZSBmYWxsYmFja3MuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9zZXRfc3Bhbl9mdW5jdGlvbnMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQoreworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiID0gKHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKikgcmI7CisgICB1aW50MzJfdCB0aWxpbmc7CisKKyAgIC8qIElmIGluIEdFTSBtb2RlLCB3ZSBuZWVkIHRvIGRvIHRoZSB0aWxlIGFkZHJlc3Mgc3dpenpsaW5nIG91cnNlbHZlcywKKyAgICAqIGluc3RlYWQgb2YgdGhlIGZlbmNlIHJlZ2lzdGVycyBoYW5kbGluZyBpdC4KKyAgICAqLworICAgaWYgKGludGVsLT50dG0pCisgICAgICB0aWxpbmcgPSBpcmItPnJlZ2lvbi0+dGlsaW5nOworICAgZWxzZQorICAgICAgdGlsaW5nID0gSTkxNV9USUxJTkdfTk9ORTsKKworICAgaWYgKHJiLT5fQWN0dWFsRm9ybWF0ID09IEdMX1JHQjUpIHsKKyAgICAgIC8qIDU2NSBSR0IgKi8KKyAgICAgIHN3aXRjaCAodGlsaW5nKSB7CisgICAgICBjYXNlIEk5MTVfVElMSU5HX05PTkU6CisgICAgICBkZWZhdWx0OgorCSBpbnRlbEluaXRQb2ludGVyc19SR0I1NjUocmIpOworCSBicmVhazsKKyAgICAgIGNhc2UgSTkxNV9USUxJTkdfWDoKKwkgaW50ZWxfWFRpbGVfSW5pdFBvaW50ZXJzX1JHQjU2NShyYik7CisJIGJyZWFrOworICAgICAgY2FzZSBJOTE1X1RJTElOR19ZOgorCSBpbnRlbF9ZVGlsZV9Jbml0UG9pbnRlcnNfUkdCNTY1KHJiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChyYi0+X0FjdHVhbEZvcm1hdCA9PSBHTF9SR0I4KSB7CisgICAgICAvKiA4ODg4IFJHQnggKi8KKyAgICAgIHN3aXRjaCAodGlsaW5nKSB7CisgICAgICBjYXNlIEk5MTVfVElMSU5HX05PTkU6CisgICAgICBkZWZhdWx0OgorCSBpbnRlbEluaXRQb2ludGVyc194UkdCODg4OChyYik7CisJIGJyZWFrOworICAgICAgY2FzZSBJOTE1X1RJTElOR19YOgorCSBpbnRlbF9YVGlsZV9Jbml0UG9pbnRlcnNfeFJHQjg4ODgocmIpOworCSBicmVhazsKKyAgICAgIGNhc2UgSTkxNV9USUxJTkdfWToKKwkgaW50ZWxfWVRpbGVfSW5pdFBvaW50ZXJzX3hSR0I4ODg4KHJiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChyYi0+X0FjdHVhbEZvcm1hdCA9PSBHTF9SR0JBOCkgeworICAgICAgLyogODg4OCBSR0JBICovCisgICAgICBzd2l0Y2ggKHRpbGluZykgeworICAgICAgY2FzZSBJOTE1X1RJTElOR19OT05FOgorICAgICAgZGVmYXVsdDoKKwkgaW50ZWxJbml0UG9pbnRlcnNfQVJHQjg4ODgocmIpOworCSBicmVhazsKKyAgICAgIGNhc2UgSTkxNV9USUxJTkdfWDoKKwkgaW50ZWxfWFRpbGVfSW5pdFBvaW50ZXJzX0FSR0I4ODg4KHJiKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEk5MTVfVElMSU5HX1k6CisJIGludGVsX1lUaWxlX0luaXRQb2ludGVyc19BUkdCODg4OChyYik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAocmItPl9BY3R1YWxGb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UMTYpIHsKKyAgICAgIHN3aXRjaCAodGlsaW5nKSB7CisgICAgICBjYXNlIEk5MTVfVElMSU5HX05PTkU6CisgICAgICBkZWZhdWx0OgorCSBpbnRlbEluaXREZXB0aFBvaW50ZXJzX3oxNihyYik7CisJIGJyZWFrOworICAgICAgY2FzZSBJOTE1X1RJTElOR19YOgorCSBpbnRlbF9YVGlsZV9Jbml0RGVwdGhQb2ludGVyc196MTYocmIpOworCSBicmVhazsKKyAgICAgIGNhc2UgSTkxNV9USUxJTkdfWToKKwkgaW50ZWxfWVRpbGVfSW5pdERlcHRoUG9pbnRlcnNfejE2KHJiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChyYi0+X0FjdHVhbEZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQyNCB8fCAgICAgICAgLyogWFhYIEZCTyByZW1vdmUgKi8KKyAgICAgICAgICAgIHJiLT5fQWN0dWFsRm9ybWF0ID09IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUKSB7CisgICAgICBzd2l0Y2ggKHRpbGluZykgeworICAgICAgY2FzZSBJOTE1X1RJTElOR19OT05FOgorICAgICAgZGVmYXVsdDoKKwkgaW50ZWxJbml0RGVwdGhQb2ludGVyc196MjRfczgocmIpOworCSBicmVhazsKKyAgICAgIGNhc2UgSTkxNV9USUxJTkdfWDoKKwkgaW50ZWxfWFRpbGVfSW5pdERlcHRoUG9pbnRlcnNfejI0X3M4KHJiKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEk5MTVfVElMSU5HX1k6CisJIGludGVsX1lUaWxlX0luaXREZXB0aFBvaW50ZXJzX3oyNF9zOChyYik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAocmItPl9BY3R1YWxGb3JtYXQgPT0gR0xfU1RFTkNJTF9JTkRFWDhfRVhUKSB7CisgICAgICBzd2l0Y2ggKHRpbGluZykgeworICAgICAgY2FzZSBJOTE1X1RJTElOR19OT05FOgorICAgICAgZGVmYXVsdDoKKwkgaW50ZWxJbml0U3RlbmNpbFBvaW50ZXJzX3oyNF9zOChyYik7CisJIGJyZWFrOworICAgICAgY2FzZSBJOTE1X1RJTElOR19YOgorCSBpbnRlbF9YVGlsZV9Jbml0U3RlbmNpbFBvaW50ZXJzX3oyNF9zOChyYik7CisJIGJyZWFrOworICAgICAgY2FzZSBJOTE1X1RJTElOR19ZOgorCSBpbnRlbF9ZVGlsZV9Jbml0U3RlbmNpbFBvaW50ZXJzX3oyNF9zOChyYik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIF9BY3R1YWxGb3JtYXQgaW4gaW50ZWxTZXRTcGFuRnVuY3Rpb25zIik7CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3NwYW4uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NwYW4uaApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L2ludGVsX3NwYW4uaApyZW5hbWUgdG8gc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfc3Bhbi5oCmluZGV4IDJkNGY4NTguLmFjYmViNGEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvaW50ZWxfc3Bhbi5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3NwYW4uaApAQCAtMjgsMTQgKzI4LDEzIEBACiAjaWZuZGVmIF9JTlRFTF9TUEFOX0gKICNkZWZpbmUgX0lOVEVMX1NQQU5fSAogCi0jaW5jbHVkZSAiZHJpcmVuZGVyYnVmZmVyLmgiCitleHRlcm4gdm9pZCBpbnRlbEluaXRTcGFuRnVuY3MoR0xjb250ZXh0ICogY3R4KTsKIAotZXh0ZXJuIHZvaWQgaW50ZWxJbml0U3BhbkZ1bmNzKCBHTGNvbnRleHQgKmN0eCApOwotCi1leHRlcm4gdm9pZCBpbnRlbFNwYW5SZW5kZXJGaW5pc2goIEdMY29udGV4dCAqY3R4ICk7Ci1leHRlcm4gdm9pZCBpbnRlbFNwYW5SZW5kZXJTdGFydCggR0xjb250ZXh0ICpjdHggKTsKLQotZXh0ZXJuIHZvaWQKLWludGVsU2V0U3BhbkZ1bmN0aW9ucyhkcmlSZW5kZXJidWZmZXIgKnJiLCBjb25zdCBHTHZpc3VhbCAqdmlzKTsKK2V4dGVybiB2b2lkIGludGVsU3BhblJlbmRlckZpbmlzaChHTGNvbnRleHQgKiBjdHgpOworZXh0ZXJuIHZvaWQgaW50ZWxTcGFuUmVuZGVyU3RhcnQoR0xjb250ZXh0ICogY3R4KTsKK3ZvaWQgaW50ZWxfcmVuZGVyYnVmZmVyX21hcChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpOwordm9pZCBpbnRlbF9yZW5kZXJidWZmZXJfdW5tYXAoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMThlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleC5jCkBAIC0wLDAgKzEsMjU2IEBACisjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgorI2luY2x1ZGUgInRleG9iai5oIgorI2luY2x1ZGUgInRleGltYWdlLmgiCisjaW5jbHVkZSAibWlwbWFwLmgiCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCisjaW5jbHVkZSAiaW50ZWxfdGV4LmgiCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX1RFWFRVUkUKKworc3RhdGljIEdMYm9vbGVhbgoraW50ZWxJc1RleHR1cmVSZXNpZGVudChHTGNvbnRleHQgKiBjdHgsIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqKQoreworI2lmIDAKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOworCisgICByZXR1cm4KKyAgICAgIGludGVsT2JqLT5tdCAmJgorICAgICAgaW50ZWxPYmotPm10LT5yZWdpb24gJiYKKyAgICAgIGludGVsX2lzX3JlZ2lvbl9yZXNpZGVudChpbnRlbCwgaW50ZWxPYmotPm10LT5yZWdpb24pOworI2VuZGlmCisgICByZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqCitpbnRlbE5ld1RleHR1cmVJbWFnZShHTGNvbnRleHQgKiBjdHgpCit7CisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgKHZvaWQpIGN0eDsKKyAgIHJldHVybiAoc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKikgQ0FMTE9DX1NUUlVDVChpbnRlbF90ZXh0dXJlX2ltYWdlKTsKK30KKworCitzdGF0aWMgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICoKK2ludGVsTmV3VGV4dHVyZU9iamVjdChHTGNvbnRleHQgKiBjdHgsIEdMdWludCBuYW1lLCBHTGVudW0gdGFyZ2V0KQoreworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICpvYmogPSBDQUxMT0NfU1RSVUNUKGludGVsX3RleHR1cmVfb2JqZWN0KTsKKworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgIF9tZXNhX2luaXRpYWxpemVfdGV4dHVyZV9vYmplY3QoJm9iai0+YmFzZSwgbmFtZSwgdGFyZ2V0KTsKKworICAgcmV0dXJuICZvYmotPmJhc2U7Cit9CisKK3N0YXRpYyB2b2lkIAoraW50ZWxEZWxldGVUZXh0dXJlT2JqZWN0KEdMY29udGV4dCAqY3R4LAorCQkJIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7CisKKyAgIGlmIChpbnRlbE9iai0+bXQpCisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworCisgICBfbWVzYV9kZWxldGVfdGV4dHVyZV9vYmplY3QoY3R4LCB0ZXhPYmopOworfQorCisKK3N0YXRpYyB2b2lkCitpbnRlbEZyZWVUZXh0dXJlSW1hZ2VEYXRhKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UgKmludGVsSW1hZ2UgPSBpbnRlbF90ZXh0dXJlX2ltYWdlKHRleEltYWdlKTsKKworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbEltYWdlLT5tdCk7CisgICB9CisKKyAgIGlmICh0ZXhJbWFnZS0+RGF0YSkgeworICAgICAgX21lc2FfZnJlZV90ZXhtZW1vcnkodGV4SW1hZ2UtPkRhdGEpOworICAgICAgdGV4SW1hZ2UtPkRhdGEgPSBOVUxMOworICAgfQorfQorCisKKy8qIFRoZSBzeXN0ZW0gbWVtY3B5IChhdCBsZWFzdCBvbiB1YnVudHUgNS4xMCkgaGFzIHByb2JsZW1zIGNvcHlpbmcKKyAqIHRvIGFncCAod3JpdGVjb21iaW5lZCkgbWVtb3J5IGZyb20gYSBzb3VyY2Ugd2hpY2ggaXNuJ3QgNjQtYnl0ZQorICogYWxpZ25lZCAtIHRoZXJlIGlzIGEgNHggcGVyZm9ybWFuY2UgZmFsbG9mZi4KKyAqCisgKiBUaGUgeDg2IF9fbWVtY3B5IGlzIGltbXVuZSB0byB0aGlzIGJ1dCBpcyBzbGlnaHRseSBzbG93ZXIKKyAqICgxMCUtaXNoKSB0aGFuIHRoZSBzeXN0ZW0gbWVtY3B5LgorICoKKyAqIFRoZSBzc2VfbWVtY3B5IHNlZW1zIHRvIGhhdmUgYSBzbGlnaHQgY2xpZmYgYXQgNjQvMzIgYnl0ZXMsIGJ1dAorICogaXNuJ3QgbXVjaCBmYXN0ZXIgdGhhbiB4ODZfbWVtY3B5IGZvciBhZ3AgY29waWVzLgorICogCisgKiBUT0RPOiBzd2l0Y2ggZHluYW1pY2FsbHkuCisgKi8KK3N0YXRpYyB2b2lkICoKK2RvX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworICAgaWYgKCgoKHVuc2lnbmVkKSBzcmMpICYgNjMpIHx8ICgoKHVuc2lnbmVkKSBkZXN0KSAmIDYzKSkgeworICAgICAgcmV0dXJuIF9fbWVtY3B5KGRlc3QsIHNyYywgbik7CisgICB9CisgICBlbHNlCisgICAgICByZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKworI2lmIERPX0RFQlVHICYmICFkZWZpbmVkKF9faWE2NF9fKQorCisjaWZuZGVmIF9feDg2XzY0X18KK3N0YXRpYyB1bnNpZ25lZAorZmFzdHJkdHNjKHZvaWQpCit7CisgICB1bnNpZ25lZCBlYXg7CisgICBfX2FzbV9fIHZvbGF0aWxlICgiXHQiCisgICAgICAgICAgICAgICAgICAgICAicHVzaGwgICUlZWJ4XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJjcHVpZFxuXHQiICIuYnl0ZSAweDBmLCAweDMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4XG4iOiI9YSIgKGVheCkKKyAgICAgICAgICAgICAgICAgICAgIDoiMCIoMCkKKyAgICAgICAgICAgICAgICAgICAgIDoiZWN4IiwgImVkeCIsICJjYyIpOworCisgICByZXR1cm4gZWF4OworfQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZAorZmFzdHJkdHNjKHZvaWQpCit7CisgICB1bnNpZ25lZCBlYXg7CisgICBfX2FzbV9fIHZvbGF0aWxlICgiXHQiICJjcHVpZFxuXHQiICIuYnl0ZSAweDBmLCAweDMxXG5cdCI6Ij1hIiAoZWF4KQorICAgICAgICAgICAgICAgICAgICAgOiIwIigwKQorICAgICAgICAgICAgICAgICAgICAgOiJlY3giLCAiZWR4IiwgImVieCIsICJjYyIpOworCisgICByZXR1cm4gZWF4OworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZAordGltZV9kaWZmKHVuc2lnbmVkIHQsIHVuc2lnbmVkIHQyKQoreworICAgcmV0dXJuICgodCA8IHQyKSA/IHQyIC0gdCA6IDB4RkZGRkZGRkZVIC0gKHQgLSB0MiAtIDEpKTsKK30KKworCitzdGF0aWMgdm9pZCAqCit0aW1lZF9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKyAgIHZvaWQgKnJldDsKKyAgIHVuc2lnbmVkIHQxLCB0MjsKKyAgIGRvdWJsZSByYXRlOworCisgICBpZiAoKCgodW5zaWduZWQpIHNyYykgJiA2MykgfHwgKCgodW5zaWduZWQpIGRlc3QpICYgNjMpKQorICAgICAgX21lc2FfcHJpbnRmKCJXYXJuaW5nIC0gbm9uLWFsaWduZWQgdGV4dHVyZSBjb3B5IVxuIik7CisKKyAgIHQxID0gZmFzdHJkdHNjKCk7CisgICByZXQgPSBkb19tZW1jcHkoZGVzdCwgc3JjLCBuKTsKKyAgIHQyID0gZmFzdHJkdHNjKCk7CisKKyAgIHJhdGUgPSB0aW1lX2RpZmYodDEsIHQyKTsKKyAgIHJhdGUgLz0gKGRvdWJsZSkgbjsKKyAgIF9tZXNhX3ByaW50ZigidGltZWRfbWVtY3B5OiAldSAldSAtLT4gJWYgY2xvY2tzL2J5dGVcbiIsIHQxLCB0MiwgcmF0ZSk7CisgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIERPX0RFQlVHICovCisKKy8qKgorICogR2VuZXJhdGUgbmV3IG1pcG1hcCBkYXRhIGZyb20gQkFTRSsxIHRvIEJBU0UrcCAodGhlIG1pbmltYWxseS1zaXplZCBtaXBtYXAKKyAqIGxldmVsKS4KKyAqCisgKiBUaGUgdGV4dHVyZSBvYmplY3QncyBtaXB0cmVlIG11c3QgYmUgbWFwcGVkLgorICoKKyAqIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHRoaXMgd2FzIGp1c3QgY2FsbGVkIGJ5IE1lc2Egd2hlbmV2ZXIgbWlwbWFwcworICogbmVlZGVkIHRvIGJlIHJlZ2VuZXJhdGVkLCByYXRoZXIgdGhhbiB1cyBoYXZpbmcgdG8gcmVtZW1iZXIgdG8gZG8gc28gaW4KKyAqIGVhY2ggdGV4dHVyZSBpbWFnZSBtb2RpZmljYXRpb24gcGF0aC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHNvIGluY2x1ZGUgYW4gYWNjZWxlcmF0ZWQgcGF0aC4KKyAqLwordm9pZAoraW50ZWxfZ2VuZXJhdGVfbWlwbWFwKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7CisgICBHTHVpbnQgbnJfZmFjZXMgPSAoaW50ZWxPYmotPmJhc2UuVGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApID8gNiA6IDE7CisgICBpbnQgZmFjZSwgaTsKKworICAgX21lc2FfZ2VuZXJhdGVfbWlwbWFwKGN0eCwgdGFyZ2V0LCB0ZXhPYmopOworCisgICAvKiBVcGRhdGUgdGhlIGxldmVsIGluZm9ybWF0aW9uIGluIG91ciBwcml2YXRlIGRhdGEgaW4gdGhlIG5ldyBpbWFnZXMsIHNpbmNlCisgICAgKiBpdCBkaWRuJ3QgZ2V0IHNldCBhcyBwYXJ0IG9mIGEgbm9ybWFsIFRleEltYWdlIHBhdGguCisgICAgKi8KKyAgIGZvciAoZmFjZSA9IDA7IGZhY2UgPCBucl9mYWNlczsgZmFjZSsrKSB7CisgICAgICBmb3IgKGkgPSB0ZXhPYmotPkJhc2VMZXZlbCArIDE7IGkgPCB0ZXhPYmotPk1heExldmVsOyBpKyspIHsKKyAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlOworCisJIGludGVsSW1hZ2UgPSBpbnRlbF90ZXh0dXJlX2ltYWdlKHRleE9iai0+SW1hZ2VbZmFjZV1baV0pOworCSBpZiAoaW50ZWxJbWFnZSA9PSBOVUxMKQorCSAgICBicmVhazsKKworCSBpbnRlbEltYWdlLT5sZXZlbCA9IGk7CisJIGludGVsSW1hZ2UtPmZhY2UgPSBmYWNlOworCSAvKiBVbnJlZmVyZW5jZSB0aGUgbWlwdHJlZSB0byBzaWduYWwgdGhhdCB0aGUgbmV3IERhdGEgaXMgYSBiYXJlCisJICAqIHBvaW50ZXIgZnJvbSBtZXNhLgorCSAgKi8KKwkgaW50ZWxfbWlwdHJlZV9yZWxlYXNlKGludGVsLCAmaW50ZWxJbWFnZS0+bXQpOworICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZCBpbnRlbEdlbmVyYXRlTWlwbWFwKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaikKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0ZXhPYmopOworCisgICBpbnRlbF90ZXhfbWFwX2xldmVsX2ltYWdlcyhpbnRlbCwgaW50ZWxPYmosIHRleE9iai0+QmFzZUxldmVsKTsKKyAgIGludGVsX2dlbmVyYXRlX21pcG1hcChjdHgsIHRhcmdldCwgdGV4T2JqKTsKKyAgIGludGVsX3RleF91bm1hcF9sZXZlbF9pbWFnZXMoaW50ZWwsIGludGVsT2JqLCB0ZXhPYmotPkJhc2VMZXZlbCk7Cit9CisKK3ZvaWQKK2ludGVsSW5pdFRleHR1cmVGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucykKK3sKKyAgIGZ1bmN0aW9ucy0+Q2hvb3NlVGV4dHVyZUZvcm1hdCA9IGludGVsQ2hvb3NlVGV4dHVyZUZvcm1hdDsKKyAgIGZ1bmN0aW9ucy0+VGV4SW1hZ2UxRCA9IGludGVsVGV4SW1hZ2UxRDsKKyAgIGZ1bmN0aW9ucy0+VGV4SW1hZ2UyRCA9IGludGVsVGV4SW1hZ2UyRDsKKyAgIGZ1bmN0aW9ucy0+VGV4SW1hZ2UzRCA9IGludGVsVGV4SW1hZ2UzRDsKKyAgIGZ1bmN0aW9ucy0+VGV4U3ViSW1hZ2UxRCA9IGludGVsVGV4U3ViSW1hZ2UxRDsKKyAgIGZ1bmN0aW9ucy0+VGV4U3ViSW1hZ2UyRCA9IGludGVsVGV4U3ViSW1hZ2UyRDsKKyAgIGZ1bmN0aW9ucy0+VGV4U3ViSW1hZ2UzRCA9IGludGVsVGV4U3ViSW1hZ2UzRDsKKyNpZmRlZiBJOTE1CisgICBmdW5jdGlvbnMtPkNvcHlUZXhJbWFnZTFEID0gaW50ZWxDb3B5VGV4SW1hZ2UxRDsKKyAgIGZ1bmN0aW9ucy0+Q29weVRleEltYWdlMkQgPSBpbnRlbENvcHlUZXhJbWFnZTJEOworICAgZnVuY3Rpb25zLT5Db3B5VGV4U3ViSW1hZ2UxRCA9IGludGVsQ29weVRleFN1YkltYWdlMUQ7CisgICBmdW5jdGlvbnMtPkNvcHlUZXhTdWJJbWFnZTJEID0gaW50ZWxDb3B5VGV4U3ViSW1hZ2UyRDsKKyNlbHNlCisgICBmdW5jdGlvbnMtPkNvcHlUZXhJbWFnZTFEID0gX3N3cmFzdF9jb3B5X3RleGltYWdlMWQ7CisgICBmdW5jdGlvbnMtPkNvcHlUZXhJbWFnZTJEID0gX3N3cmFzdF9jb3B5X3RleGltYWdlMmQ7CisgICBmdW5jdGlvbnMtPkNvcHlUZXhTdWJJbWFnZTFEID0gX3N3cmFzdF9jb3B5X3RleHN1YmltYWdlMWQ7CisgICBmdW5jdGlvbnMtPkNvcHlUZXhTdWJJbWFnZTJEID0gX3N3cmFzdF9jb3B5X3RleHN1YmltYWdlMmQ7CisjZW5kaWYKKyAgIGZ1bmN0aW9ucy0+R2V0VGV4SW1hZ2UgPSBpbnRlbEdldFRleEltYWdlOworICAgZnVuY3Rpb25zLT5HZW5lcmF0ZU1pcG1hcCA9IGludGVsR2VuZXJhdGVNaXBtYXA7CisKKyAgIC8qIGNvbXByZXNzZWQgdGV4dHVyZSBmdW5jdGlvbnMgKi8KKyAgIGZ1bmN0aW9ucy0+Q29tcHJlc3NlZFRleEltYWdlMkQgPSBpbnRlbENvbXByZXNzZWRUZXhJbWFnZTJEOworICAgZnVuY3Rpb25zLT5HZXRDb21wcmVzc2VkVGV4SW1hZ2UgPSBpbnRlbEdldENvbXByZXNzZWRUZXhJbWFnZTsKKworICAgZnVuY3Rpb25zLT5OZXdUZXh0dXJlT2JqZWN0ID0gaW50ZWxOZXdUZXh0dXJlT2JqZWN0OworICAgZnVuY3Rpb25zLT5OZXdUZXh0dXJlSW1hZ2UgPSBpbnRlbE5ld1RleHR1cmVJbWFnZTsKKyAgIGZ1bmN0aW9ucy0+RGVsZXRlVGV4dHVyZSA9IGludGVsRGVsZXRlVGV4dHVyZU9iamVjdDsKKyAgIGZ1bmN0aW9ucy0+RnJlZVRleEltYWdlRGF0YSA9IGludGVsRnJlZVRleHR1cmVJbWFnZURhdGE7CisgICBmdW5jdGlvbnMtPlVwZGF0ZVRleHR1cmVQYWxldHRlID0gMDsKKyAgIGZ1bmN0aW9ucy0+SXNUZXh0dXJlUmVzaWRlbnQgPSBpbnRlbElzVGV4dHVyZVJlc2lkZW50OworCisjaWYgRE9fREVCVUcgJiYgIWRlZmluZWQoX19pYTY0X18pCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CVUZNR1IpCisgICAgICBmdW5jdGlvbnMtPlRleHR1cmVNZW1DcHkgPSB0aW1lZF9tZW1jcHk7CisgICBlbHNlCisjZW5kaWYKKyAgICAgIGZ1bmN0aW9ucy0+VGV4dHVyZU1lbUNweSA9IGRvX21lbWNweTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3YThiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleC5oCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElOVEVMVEVYX0lOQworI2RlZmluZSBJTlRFTFRFWF9JTkMKKworI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ0ZXhtZW0uaCIKKworCit2b2lkIGludGVsSW5pdFRleHR1cmVGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyk7CisKK2NvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2Zvcm1hdCAqaW50ZWxDaG9vc2VUZXh0dXJlRm9ybWF0KEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlKTsKKworCit2b2lkIGludGVsVGV4SW1hZ2UzRChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpOworCit2b2lkIGludGVsVGV4U3ViSW1hZ2UzRChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqIHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqcGFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKKwordm9pZCBpbnRlbFRleEltYWdlMkQoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSk7CisKK3ZvaWQgaW50ZWxUZXhTdWJJbWFnZTJEKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICogcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpOworCit2b2lkIGludGVsVGV4SW1hZ2UxRChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSk7CisKK3ZvaWQgaW50ZWxUZXhTdWJJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKiBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSk7CisKK3ZvaWQgaW50ZWxDb3B5VGV4SW1hZ2UxRChHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOworCit2b2lkIGludGVsQ29weVRleEltYWdlMkQoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyKTsKKwordm9pZCBpbnRlbENvcHlUZXhTdWJJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CisKK3ZvaWQgaW50ZWxDb3B5VGV4U3ViSW1hZ2UyRChHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCit2b2lkIGludGVsR2V0VGV4SW1hZ2UoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICogcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSk7CisKK3ZvaWQgaW50ZWxDb21wcmVzc2VkVGV4SW1hZ2UyRCggR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorCQkJCUdMaW50IGludGVybmFsRm9ybWF0LAorCQkJCUdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciwKKwkJCQlHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLAorCQkJCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorCQkJCXN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApOworCit2b2lkIGludGVsR2V0Q29tcHJlc3NlZFRleEltYWdlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKwkJCQlHTHZvaWQgKnBpeGVscywKKwkJCQlzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKwkJCQlzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpOworCit2b2lkIGludGVsU2V0VGV4T2Zmc2V0KF9fRFJJY29udGV4dCAqcERSSUN0eCwgR0xpbnQgdGV4bmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIEdMaW50IGRlcHRoLCBHTHVpbnQgcGl0Y2gpOwordm9pZCBpbnRlbFNldFRleEJ1ZmZlcihfX0RSSWNvbnRleHQgKnBEUklDdHgsCisJCSAgICAgICBHTGludCB0YXJnZXQsIF9fRFJJZHJhd2FibGUgKnBEcmF3KTsKKworR0x1aW50IGludGVsX2ZpbmFsaXplX21pcG1hcF90cmVlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IHVuaXQpOworCit2b2lkIGludGVsX3RleF9tYXBfbGV2ZWxfaW1hZ2VzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCQlzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqLAorCQkJCWludCBsZXZlbCk7CisKK3ZvaWQgaW50ZWxfdGV4X3VubWFwX2xldmVsX2ltYWdlcyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCQkJICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqLAorCQkJCSAgaW50IGxldmVsKTsKKwordm9pZCBpbnRlbF90ZXhfbWFwX2ltYWdlcyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmopOworCit2b2lkIGludGVsX3RleF91bm1hcF9pbWFnZXMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmopOworCitpbnQgaW50ZWxfY29tcHJlc3NlZF9udW1fYnl0ZXMoR0x1aW50IG1lc2FGb3JtYXQpOworCit2b2lkIGludGVsX2dlbmVyYXRlX21pcG1hcChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKwkJCSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfY29weS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2NvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGFiNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2NvcHkuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgImVudW1zLmgiCisjaW5jbHVkZSAiaW1hZ2UuaCIKKyNpbmNsdWRlICJ0ZXhpbWFnZS5oIgorI2luY2x1ZGUgIm1pcG1hcC5oIgorI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKKworI2luY2x1ZGUgImludGVsX3NjcmVlbi5oIgorI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF9taXBtYXBfdHJlZS5oIgorI2luY2x1ZGUgImludGVsX3JlZ2lvbnMuaCIKKyNpbmNsdWRlICJpbnRlbF9mYm8uaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX1RFWFRVUkUKKworLyoqCisgKiBHZXQgdGhlIGludGVsX3JlZ2lvbiB3aGljaCBpcyB0aGUgc291cmNlIGZvciBhbnkgZ2xDb3B5VGV4W1N1Yl1JbWFnZSBjYWxsLgorICoKKyAqIERvIHRoZSBiZXN0IHdlIGNhbiB1c2luZyB0aGUgYmxpdHRlci4gIEEgZnV0dXJlIHByb2plY3QgaXMgdG8gdXNlCisgKiB0aGUgdGV4dHVyZSBlbmdpbmUgYW5kIGZyYWdtZW50IHByb2dyYW1zIGZvciB0aGVzZSBjb3BpZXMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVnaW9uICoKK2dldF90ZXhpbWFnZV9zb3VyY2Uoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLCBHTGVudW0gaW50ZXJuYWxGb3JtYXQpCit7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmI7CisKKyAgIERCRygiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihpbnRlcm5hbEZvcm1hdCkpOworCisgICBzd2l0Y2ggKGludGVybmFsRm9ybWF0KSB7CisgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDoKKyAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMTZfQVJCOgorICAgICAgaXJiID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihpbnRlbC0+Y3R4LlJlYWRCdWZmZXIsIEJVRkZFUl9ERVBUSCk7CisgICAgICBpZiAoaXJiICYmIGlyYi0+cmVnaW9uICYmIGlyYi0+cmVnaW9uLT5jcHAgPT0gMikKKyAgICAgICAgIHJldHVybiBpcmItPnJlZ2lvbjsKKyAgICAgIHJldHVybiBOVUxMOworICAgY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDoKKyAgIGNhc2UgR0xfREVQVEhfU1RFTkNJTF9FWFQ6CisgICAgICBpcmIgPSBpbnRlbF9nZXRfcmVuZGVyYnVmZmVyKGludGVsLT5jdHguUmVhZEJ1ZmZlciwgQlVGRkVSX0RFUFRIKTsKKyAgICAgIGlmIChpcmIgJiYgaXJiLT5yZWdpb24gJiYgaXJiLT5yZWdpb24tPmNwcCA9PSA0KQorICAgICAgICAgcmV0dXJuIGlyYi0+cmVnaW9uOworICAgICAgcmV0dXJuIE5VTEw7CisgICBjYXNlIEdMX1JHQkE6CisgICBjYXNlIEdMX1JHQkE4OgorICAgICAgcmV0dXJuIGludGVsX3JlYWRidWZfcmVnaW9uKGludGVsKTsKKyAgIGNhc2UgR0xfUkdCOgorICAgICAgaWYgKGludGVsLT5jdHguVmlzdWFsLnJnYkJpdHMgPT0gMTYpCisgICAgICAgICByZXR1cm4gaW50ZWxfcmVhZGJ1Zl9yZWdpb24oaW50ZWwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgICB9Cit9CisKKworc3RhdGljIEdMYm9vbGVhbgorZG9fY29weV90ZXhzdWJpbWFnZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisJCSAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBHTGludCBkc3R4LCBHTGludCBkc3R5LAorICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK3sKKyAgIEdMY29udGV4dCAqY3R4ID0gJmludGVsLT5jdHg7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiA9IGludGVsSW1hZ2UtPmJhc2UuVGV4T2JqZWN0OworICAgY29uc3Qgc3RydWN0IGludGVsX3JlZ2lvbiAqc3JjID0KKyAgICAgIGdldF90ZXhpbWFnZV9zb3VyY2UoaW50ZWwsIGludGVybmFsRm9ybWF0KTsKKworICAgaWYgKCFpbnRlbEltYWdlLT5tdCB8fCAhc3JjKSB7CisgICAgICBEQkcoIiVzIGZhaWwgJXAgJXBcbiIsIF9fRlVOQ1RJT05fXywgaW50ZWxJbWFnZS0+bXQsIHNyYyk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGludGVsRmx1c2goY3R4KTsKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworICAgeworICAgICAgR0x1aW50IGltYWdlX29mZnNldCA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGludGVsSW1hZ2UtPm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bGV2ZWwpOworICAgICAgY29uc3QgR0xpbnQgb3JpZ194ID0geDsKKyAgICAgIGNvbnN0IEdMaW50IG9yaWdfeSA9IHk7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOworCisgICAgICBpZiAoX21lc2FfY2xpcF90b19yZWdpb24oZmItPl9YbWluLCBmYi0+X1ltaW4sIGZiLT5fWG1heCwgZmItPl9ZbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LCAmeSwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgLyogVXBkYXRlIGRzdCBmb3IgY2xpcHBlZCBzcmMuICBOZWVkIHRvIGFsc28gY2xpcCB0aGUgc291cmNlIHJlY3QuCisgICAgICAgICAgKi8KKyAgICAgICAgIGRzdHggKz0geCAtIG9yaWdfeDsKKyAgICAgICAgIGRzdHkgKz0geSAtIG9yaWdfeTsKKworICAgICAgICAgaWYgKGN0eC0+UmVhZEJ1ZmZlci0+TmFtZSA9PSAwKSB7CisgICAgICAgICAgICAvKiByZWFkaW5nIGZyb20gYSB3aW5kb3csIGFkanVzdCB4LCB5ICovCisgICAgICAgICAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbnRlbC0+ZHJpRHJhd2FibGU7CisgICAgICAgICAgICBHTHVpbnQgd2luZG93X3k7CisgICAgICAgICAgICAvKiB3aW5kb3dfeSA9IHBvc2l0aW9uIG9mIHdpbmRvdyBvbiBzY3JlZW4gaWYgeT0wPWJvdHRvbSAqLworICAgICAgICAgICAgd2luZG93X3kgPSBpbnRlbC0+aW50ZWxTY3JlZW4tPmhlaWdodCAtIChkUHJpdi0+eSArIGRQcml2LT5oKTsKKyAgICAgICAgICAgIHkgPSB3aW5kb3dfeSArIHk7CisgICAgICAgICAgICB4ICs9IGRQcml2LT54OworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiByZWFkaW5nIGZyb20gYSBGQk8gKi8KKyAgICAgICAgICAgIC8qIGludmVydCBZICovCisgICAgICAgICAgICB5ID0gY3R4LT5SZWFkQnVmZmVyLT5IZWlnaHQgLSB5IC0gMTsKKyAgICAgICAgIH0KKworCisgICAgICAgICAvKiBBIGJpdCBvZiBmaWRkbGluZyB0byBnZXQgdGhlIGJsaXR0ZXIgdG8gd29yayB3aXRoIC12ZQorICAgICAgICAgICogcGl0Y2hlcy4gIEJ1dCB3ZSBnZXQgYSBuaWNlIGludmVydGVkIGJsaXQgdGhpcyB3YXksIHNvIGl0J3MKKyAgICAgICAgICAqIHdvcnRoIGl0OgorICAgICAgICAgICovCisgICAgICAgICBpbnRlbEVtaXRDb3B5QmxpdChpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPm10LT5jcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtc3JjLT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5oZWlnaHQgKiBzcmMtPnBpdGNoICogc3JjLT5jcHAsCisJCQkgICBzcmMtPnRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPm10LT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPm10LT5yZWdpb24tPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX29mZnNldCwKKwkJCSAgIGludGVsSW1hZ2UtPm10LT5yZWdpb24tPnRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkgKyBoZWlnaHQsIGRzdHgsIGRzdHksIHdpZHRoLCBoZWlnaHQsCisJCQkgICBHTF9DT1BZKTsgLyogPyAqLworICAgICAgfQorICAgfQorCisKKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIC8qIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwICovCisgICBpZiAoaW50ZWxJbWFnZS0+bGV2ZWwgPT0gdGV4T2JqLT5CYXNlTGV2ZWwgJiYgdGV4T2JqLT5HZW5lcmF0ZU1pcG1hcCkgeworICAgICAgaW50ZWxfZ2VuZXJhdGVfbWlwbWFwKGN0eCwgdGFyZ2V0LCB0ZXhPYmopOworICAgfQorCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisKKworCit2b2lkCitpbnRlbENvcHlUZXhJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyKQoreworICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9CisgICAgICAmY3R4LT5UZXh0dXJlLlVuaXRbY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0XTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqID0KKyAgICAgIF9tZXNhX3NlbGVjdF90ZXhfb2JqZWN0KGN0eCwgdGV4VW5pdCwgdGFyZ2V0KTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSA9CisgICAgICBfbWVzYV9zZWxlY3RfdGV4X2ltYWdlKGN0eCwgdGV4T2JqLCB0YXJnZXQsIGxldmVsKTsKKworICAgaWYgKGJvcmRlcikKKyAgICAgIGdvdG8gZmFpbDsKKworICAgLyogU2V0dXAgb3IgcmVkZWZpbmUgdGhlIHRleHR1cmUgb2JqZWN0LCBtaXBtYXAgdHJlZSBhbmQgdGV4dHVyZQorICAgICogaW1hZ2UuICBEb24ndCBwb3B1bGF0ZSB5ZXQuICAKKyAgICAqLworICAgY3R4LT5Ecml2ZXIuVGV4SW1hZ2UxRChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBDSEFOX1RZUEUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPkRlZmF1bHRQYWNraW5nLCB0ZXhPYmosIHRleEltYWdlKTsKKworICAgaWYgKCFkb19jb3B5X3RleHN1YmltYWdlKGludGVsX2NvbnRleHQoY3R4KSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsX3RleHR1cmVfaW1hZ2UodGV4SW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0LCAwLCAwLCB4LCB5LCB3aWR0aCwgMSkpCisgICAgICBnb3RvIGZhaWw7CisKKyAgIHJldHVybjsKKworIGZhaWw6CisgICBfc3dyYXN0X2NvcHlfdGV4aW1hZ2UxZChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGJvcmRlcik7Cit9CisKK3ZvaWQKK2ludGVsQ29weVRleEltYWdlMkQoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyKQoreworICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9CisgICAgICAmY3R4LT5UZXh0dXJlLlVuaXRbY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0XTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqID0KKyAgICAgIF9tZXNhX3NlbGVjdF90ZXhfb2JqZWN0KGN0eCwgdGV4VW5pdCwgdGFyZ2V0KTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSA9CisgICAgICBfbWVzYV9zZWxlY3RfdGV4X2ltYWdlKGN0eCwgdGV4T2JqLCB0YXJnZXQsIGxldmVsKTsKKworICAgaWYgKGJvcmRlcikKKyAgICAgIGdvdG8gZmFpbDsKKworICAgLyogU2V0dXAgb3IgcmVkZWZpbmUgdGhlIHRleHR1cmUgb2JqZWN0LCBtaXBtYXAgdHJlZSBhbmQgdGV4dHVyZQorICAgICogaW1hZ2UuICBEb24ndCBwb3B1bGF0ZSB5ZXQuICAKKyAgICAqLworICAgY3R4LT5Ecml2ZXIuVGV4SW1hZ2UyRChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIENIQU5fVFlQRSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+RGVmYXVsdFBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UpOworCisKKyAgIGlmICghZG9fY29weV90ZXhzdWJpbWFnZShpbnRlbF9jb250ZXh0KGN0eCksIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbF90ZXh0dXJlX2ltYWdlKHRleEltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCwgMCwgMCwgeCwgeSwgd2lkdGgsIGhlaWdodCkpCisgICAgICBnb3RvIGZhaWw7CisKKyAgIHJldHVybjsKKworIGZhaWw6CisgICBfc3dyYXN0X2NvcHlfdGV4aW1hZ2UyZChjdHgsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsRm9ybWF0LCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKK30KKworCit2b2lkCitpbnRlbENvcHlUZXhTdWJJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpCit7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0KKyAgICAgICZjdHgtPlRleHR1cmUuVW5pdFtjdHgtPlRleHR1cmUuQ3VycmVudFVuaXRdOworICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogPQorICAgICAgX21lc2Ffc2VsZWN0X3RleF9vYmplY3QoY3R4LCB0ZXhVbml0LCB0YXJnZXQpOworICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlID0KKyAgICAgIF9tZXNhX3NlbGVjdF90ZXhfaW1hZ2UoY3R4LCB0ZXhPYmosIHRhcmdldCwgbGV2ZWwpOworICAgR0xlbnVtIGludGVybmFsRm9ybWF0ID0gdGV4SW1hZ2UtPkludGVybmFsRm9ybWF0OworCisgICAvKiBYWFggbmVlZCB0byBjaGVjayA8Ym9yZGVyPiBhcyBpbiBhYm92ZSBmdW5jdGlvbj8gKi8KKworICAgLyogTmVlZCB0byBjaGVjayB0ZXh0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCBzb3VyY2UgZm9ybWF0LiAKKyAgICAqLworCisgICBpZiAoIWRvX2NvcHlfdGV4c3ViaW1hZ2UoaW50ZWxfY29udGV4dChjdHgpLCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxfdGV4dHVyZV9pbWFnZSh0ZXhJbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsIHhvZmZzZXQsIDAsIHgsIHksIHdpZHRoLCAxKSkgeworICAgICAgX3N3cmFzdF9jb3B5X3RleHN1YmltYWdlMWQoY3R4LCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB4LCB5LCB3aWR0aCk7CisgICB9Cit9CisKKworCit2b2lkCitpbnRlbENvcHlUZXhTdWJJbWFnZTJEKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQoreworICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9CisgICAgICAmY3R4LT5UZXh0dXJlLlVuaXRbY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0XTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqID0KKyAgICAgIF9tZXNhX3NlbGVjdF90ZXhfb2JqZWN0KGN0eCwgdGV4VW5pdCwgdGFyZ2V0KTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSA9CisgICAgICBfbWVzYV9zZWxlY3RfdGV4X2ltYWdlKGN0eCwgdGV4T2JqLCB0YXJnZXQsIGxldmVsKTsKKyAgIEdMZW51bSBpbnRlcm5hbEZvcm1hdCA9IHRleEltYWdlLT5JbnRlcm5hbEZvcm1hdDsKKworCisgICAvKiBOZWVkIHRvIGNoZWNrIHRleHR1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHNvdXJjZSBmb3JtYXQuIAorICAgICovCisKKyAgIGlmICghZG9fY29weV90ZXhzdWJpbWFnZShpbnRlbF9jb250ZXh0KGN0eCksIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbF90ZXh0dXJlX2ltYWdlKHRleEltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSkgeworCisgICAgICBEQkcoIiVzIC0gZmFsbGJhY2sgdG8gc3dyYXN0XG4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgICBfc3dyYXN0X2NvcHlfdGV4c3ViaW1hZ2UyZChjdHgsIHRhcmdldCwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9mb3JtYXQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlhMjliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2Zvcm1hdC5jCkBAIC0wLDAgKzEsMTkzIEBACisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorI2luY2x1ZGUgImludGVsX3RleC5oIgorI2luY2x1ZGUgInRleGZvcm1hdC5oIgorI2luY2x1ZGUgImVudW1zLmgiCisKKy8qIEl0IHdvcmtzIG91dCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgZmluZSBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQKKyAqIGhhcmR3YXJlLiAgSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgYSBuZWVkIHRvIG1hcCB0aGUgZm9ybWF0cyBvbnRvCisgKiBoYXJkd2FyZSBkZXNjcmlwdG9ycy4KKyAqLworLyogTm90ZSB0aGF0IHRoZSBpOTE1IGNhbiBhY3R1YWxseSBzdXBwb3J0IG1hbnkgbW9yZSBmb3JtYXRzIHRoYW4KKyAqIHRoZXNlIGlmIHdlIHRha2UgdGhlIHN0ZXAgb2Ygc2ltcGx5IHN3aXp6bGluZyB0aGUgY29sb3JzCisgKiBpbW1lZGlhdGVseSBhZnRlciBzYW1wbGluZy4uLgorICovCitjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9mb3JtYXQgKgoraW50ZWxDaG9vc2VUZXh0dXJlRm9ybWF0KEdMY29udGV4dCAqIGN0eCwgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBjb25zdCBHTGJvb2xlYW4gZG8zMmJwdCA9IChpbnRlbC0+Y3R4LlZpc3VhbC5yZ2JCaXRzID09IDMyKTsKKworICAgc3dpdGNoIChpbnRlcm5hbEZvcm1hdCkgeworICAgY2FzZSA0OgorICAgY2FzZSBHTF9SR0JBOgorICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkE6CisgICAgICBpZiAoZm9ybWF0ID09IEdMX0JHUkEpIHsKKyAgICAgICAgIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgfHwgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYpIHsKKyAgICAgICAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I4ODg4OworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVikgeworICAgICAgICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjQ0NDQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWKSB7CisgICAgICAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiMTU1NTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBkbzMyYnB0ID8gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4OCA6ICZfbWVzYV90ZXhmb3JtYXRfYXJnYjQ0NDQ7CisKKyAgIGNhc2UgMzoKKyAgIGNhc2UgR0xfUkdCOgorICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQjoKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfUkdCICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpIHsKKyAgICAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3JnYjU2NTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkbzMyYnB0ID8gJl9tZXNhX3RleGZvcm1hdF9hcmdiODg4OCA6ICZfbWVzYV90ZXhmb3JtYXRfcmdiNTY1OworCisgICBjYXNlIEdMX1JHQkE4OgorICAgY2FzZSBHTF9SR0IxMF9BMjoKKyAgIGNhc2UgR0xfUkdCQTEyOgorICAgY2FzZSBHTF9SR0JBMTY6CisgICAgICByZXR1cm4gZG8zMmJwdCA/ICZfbWVzYV90ZXhmb3JtYXRfYXJnYjg4ODggOiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I0NDQ0OworCisgICBjYXNlIEdMX1JHQkE0OgorICAgY2FzZSBHTF9SR0JBMjoKKyAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X2FyZ2I0NDQ0OworCisgICBjYXNlIEdMX1JHQjVfQTE6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9hcmdiMTU1NTsKKworICAgY2FzZSBHTF9SR0I4OgorICAgY2FzZSBHTF9SR0IxMDoKKyAgIGNhc2UgR0xfUkdCMTI6CisgICBjYXNlIEdMX1JHQjE2OgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYXJnYjg4ODg7CisKKyAgIGNhc2UgR0xfUkdCNToKKyAgIGNhc2UgR0xfUkdCNDoKKyAgIGNhc2UgR0xfUjNfRzNfQjI6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2I1NjU7CisKKyAgIGNhc2UgR0xfQUxQSEE6CisgICBjYXNlIEdMX0FMUEhBNDoKKyAgIGNhc2UgR0xfQUxQSEE4OgorICAgY2FzZSBHTF9BTFBIQTEyOgorICAgY2FzZSBHTF9BTFBIQTE2OgorICAgY2FzZSBHTF9DT01QUkVTU0VEX0FMUEhBOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYTg7CisKKyAgIGNhc2UgMToKKyAgIGNhc2UgR0xfTFVNSU5BTkNFOgorICAgY2FzZSBHTF9MVU1JTkFOQ0U0OgorICAgY2FzZSBHTF9MVU1JTkFOQ0U4OgorICAgY2FzZSBHTF9MVU1JTkFOQ0UxMjoKKyAgIGNhc2UgR0xfTFVNSU5BTkNFMTY6CisgICBjYXNlIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfbDg7CisKKyAgIGNhc2UgMjoKKyAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgY2FzZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNDoKKyAgIGNhc2UgR0xfTFVNSU5BTkNFNl9BTFBIQTI6CisgICBjYXNlIEdMX0xVTUlOQU5DRThfQUxQSEE4OgorICAgY2FzZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTQ6CisgICBjYXNlIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTI6CisgICBjYXNlIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTY6CisgICBjYXNlIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfYWw4ODsKKworICAgY2FzZSBHTF9JTlRFTlNJVFk6CisgICBjYXNlIEdMX0lOVEVOU0lUWTQ6CisgICBjYXNlIEdMX0lOVEVOU0lUWTg6CisgICBjYXNlIEdMX0lOVEVOU0lUWTEyOgorICAgY2FzZSBHTF9JTlRFTlNJVFkxNjoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFk6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9pODsKKworICAgY2FzZSBHTF9ZQ0JDUl9NRVNBOgorICAgICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgfHwgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKQorICAgICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfeWNiY3I7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF95Y2Jjcl9yZXY7CisKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiX2Z4dDE7CisgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9GWFQxXzNERlg6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2Z4dDE7CisKKyAgIGNhc2UgR0xfUkdCX1MzVEM6CisgICBjYXNlIEdMX1JHQjRfUzNUQzoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3JnYl9keHQxOworCisgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiYV9keHQxOworCisgICBjYXNlIEdMX1JHQkFfUzNUQzoKKyAgIGNhc2UgR0xfUkdCQTRfUzNUQzoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2R4dDM7CisKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6CisgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9yZ2JhX2R4dDU7CisKKyAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UOgorICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKKyAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMjQ6CisgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyOgorICAgICAgcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfejE2OworCisgICBjYXNlIEdMX0RFUFRIX1NURU5DSUxfRVhUOgorICAgY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDoKKyAgICAgIHJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3oyNF9zODsKKworI2lmbmRlZiBJOTE1CisgICBjYXNlIEdMX1NSR0JfRVhUOgorICAgY2FzZSBHTF9TUkdCOF9FWFQ6CisgICBjYXNlIEdMX1NSR0JfQUxQSEFfRVhUOgorICAgY2FzZSBHTF9TUkdCOF9BTFBIQThfRVhUOgorICAgY2FzZSBHTF9TTFVNSU5BTkNFX0VYVDoKKyAgIGNhc2UgR0xfU0xVTUlOQU5DRThfRVhUOgorICAgY2FzZSBHTF9TTFVNSU5BTkNFX0FMUEhBX0VYVDoKKyAgIGNhc2UgR0xfU0xVTUlOQU5DRThfQUxQSEE4X0VYVDoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9TUkdCX0VYVDoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX0VYVDoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0VYVDoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0FMUEhBX0VYVDoKKyAgICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9zcmdiYTg7CisgICBjYXNlIEdMX0NPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUOgorICAgY2FzZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQxX0VYVDoKKyAgIGNhc2UgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUM19FWFQ6CisgICBjYXNlIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUOgorICAgICByZXR1cm4gJl9tZXNhX3RleGZvcm1hdF9zcmdiX2R4dDE7CisjZW5kaWYKKworICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCB0ZXh0dXJlIGZvcm1hdCAlcyBpbiAlc1xuIiwKKyAgICAgICAgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoaW50ZXJuYWxGb3JtYXQpLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgLyogbmV2ZXIgZ2V0IGhlcmUgKi8KK30KKworaW50IGludGVsX2NvbXByZXNzZWRfbnVtX2J5dGVzKEdMdWludCBtZXNhRm9ybWF0KQoreworICAgaW50IGJ5dGVzID0gMDsKKyAgIHN3aXRjaChtZXNhRm9ybWF0KSB7CisgICAgIAorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRlhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9GWFQxOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQxOgorICAgICBieXRlcyA9IDI7CisgICAgIGJyZWFrOworICAgICAKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQzOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDU6CisgICAgIGJ5dGVzID0gNDsKKyAgIGRlZmF1bHQ6CisgICAgIGJyZWFrOworICAgfQorICAgCisgICByZXR1cm4gYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfaW1hZ2UuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTY4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfaW1hZ2UuYwpAQCAtMCwwICsxLDc3MyBAQAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAiZW51bXMuaCIKKyNpbmNsdWRlICJjb2xvcnRhYi5oIgorI2luY2x1ZGUgImNvbnZvbHZlLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgInNpbXBsZV9saXN0LmgiCisjaW5jbHVkZSAidGV4Y29tcHJlc3MuaCIKKyNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKKyNpbmNsdWRlICJ0ZXhvYmouaCIKKyNpbmNsdWRlICJ0ZXhzdG9yZS5oIgorI2luY2x1ZGUgInRleGltYWdlLmgiCisKKyNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZmZXJfb2JqZWN0cy5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfdGV4LmgiCisjaW5jbHVkZSAiaW50ZWxfaW9jdGwuaCIKKyNpbmNsdWRlICJpbnRlbF9ibGl0LmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisKKyNkZWZpbmUgRklMRV9ERUJVR19GTEFHIERFQlVHX1RFWFRVUkUKKworLyogRnVuY3Rpb25zIHRvIHN0b3JlIHRleHR1cmUgaW1hZ2VzLiAgV2hlcmUgcG9zc2libGUsIG1pcG1hcF90cmVlJ3MKKyAqIHdpbGwgYmUgY3JlYXRlZCBvciBmdXJ0aGVyIGluc3RhbnRpYXRlZCB3aXRoIGltYWdlIGRhdGEsIG90aGVyd2lzZQorICogaW1hZ2VzIHdpbGwgYmUgc3RvcmVkIGluIG1hbGxvYydkIG1lbW9yeS4gIEEgdmFsaWRhdGlvbiBzdGVwIGlzCisgKiByZXF1aXJlZCB0byBwdWxsIHRob3NlIGltYWdlcyBpbnRvIGEgbWlwbWFwIHRyZWUsIG9yIG90aGVyd2lzZQorICogZGVjaWRlIGEgZmFsbGJhY2sgaXMgcmVxdWlyZWQuCisgKi8KKworCitzdGF0aWMgaW50Citsb2diYXNlMihpbnQgbikKK3sKKyAgIEdMaW50IGkgPSAxOworICAgR0xpbnQgbG9nMiA9IDA7CisKKyAgIHdoaWxlIChuID4gaSkgeworICAgICAgaSAqPSAyOworICAgICAgbG9nMisrOworICAgfQorCisgICByZXR1cm4gbG9nMjsKK30KKworCisvKiBPdGhlcndpc2UsIHN0b3JlIGl0IGluIG1lbW9yeSBpZiAoQm9yZGVyICE9IDApIG9yIChhbnkgZGltZW5zaW9uID09CisgKiAxKS4KKyAqICAgIAorICogT3RoZXJ3aXNlLCBpZiBtYXhfbGV2ZWwgPj0gbGV2ZWwgPj0gbWluX2xldmVsLCBjcmVhdGUgdHJlZSB3aXRoCisgKiBzcGFjZSBmb3IgdGV4dHVyZXMgZnJvbSBtaW5fbGV2ZWwgZG93biB0byBtYXhfbGV2ZWwuCisgKgorICogT3RoZXJ3aXNlLCBjcmVhdGUgdHJlZSB3aXRoIHNwYWNlIGZvciB0ZXh0dXJlcyBmcm9tIChsZXZlbAorICogMCkuLigxeDEpLiAgQ29uc2lkZXIgcHJ1bmluZyB0aGlzIHRyZWUgYXQgYSB2YWxpZGF0aW9uIGlmIHRoZQorICogc2F2aW5nIGlzIHdvcnRoIGl0LgorICovCitzdGF0aWMgdm9pZAorZ3Vlc3NfYW5kX2FsbG9jX21pcG1hcF90cmVlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlKQoreworICAgR0x1aW50IGZpcnN0TGV2ZWw7CisgICBHTHVpbnQgbGFzdExldmVsOworICAgR0x1aW50IHdpZHRoID0gaW50ZWxJbWFnZS0+YmFzZS5XaWR0aDsKKyAgIEdMdWludCBoZWlnaHQgPSBpbnRlbEltYWdlLT5iYXNlLkhlaWdodDsKKyAgIEdMdWludCBkZXB0aCA9IGludGVsSW1hZ2UtPmJhc2UuRGVwdGg7CisgICBHTHVpbnQgbDJ3aWR0aCwgbDJoZWlnaHQsIGwyZGVwdGg7CisgICBHTHVpbnQgaSwgY29tcF9ieXRlID0gMDsKKworICAgREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKGludGVsSW1hZ2UtPmJhc2UuQm9yZGVyIHx8CisgICAgICAgKChpbnRlbEltYWdlLT5iYXNlLl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCkgJiYgCisgICAgICAgICgoaW50ZWxPYmotPmJhc2UuV3JhcFMgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSB8fAorICAgICAgICAgKGludGVsT2JqLT5iYXNlLldyYXBUID09IEdMX0NMQU1QX1RPX0JPUkRFUikpKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGludGVsSW1hZ2UtPmxldmVsID4gaW50ZWxPYmotPmJhc2UuQmFzZUxldmVsICYmCisgICAgICAgKGludGVsSW1hZ2UtPmJhc2UuV2lkdGggPT0gMSB8fAorICAgICAgICAoaW50ZWxPYmotPmJhc2UuVGFyZ2V0ICE9IEdMX1RFWFRVUkVfMUQgJiYKKyAgICAgICAgIGludGVsSW1hZ2UtPmJhc2UuSGVpZ2h0ID09IDEpIHx8CisgICAgICAgIChpbnRlbE9iai0+YmFzZS5UYXJnZXQgPT0gR0xfVEVYVFVSRV8zRCAmJgorICAgICAgICAgaW50ZWxJbWFnZS0+YmFzZS5EZXB0aCA9PSAxKSkpCisgICAgICByZXR1cm47CisKKyAgIC8qIElmIHRoaXMgaW1hZ2UgZGlzcmVzcGVjdHMgQmFzZUxldmVsLCBhbGxvY2F0ZSBmcm9tIGxldmVsIHplcm8uCisgICAgKiBVc3VhbGx5IEJhc2VMZXZlbCA9PSAwLCBzbyBpdCdzIHVubGlrZWx5IHRvIGhhcHBlbi4KKyAgICAqLworICAgaWYgKGludGVsSW1hZ2UtPmxldmVsIDwgaW50ZWxPYmotPmJhc2UuQmFzZUxldmVsKQorICAgICAgZmlyc3RMZXZlbCA9IDA7CisgICBlbHNlCisgICAgICBmaXJzdExldmVsID0gaW50ZWxPYmotPmJhc2UuQmFzZUxldmVsOworCisKKyAgIC8qIEZpZ3VyZSBvdXQgaW1hZ2UgZGltZW5zaW9ucyBhdCBzdGFydCBsZXZlbC4gCisgICAgKi8KKyAgIGZvciAoaSA9IGludGVsSW1hZ2UtPmxldmVsOyBpID4gZmlyc3RMZXZlbDsgaS0tKSB7CisgICAgICB3aWR0aCA8PD0gMTsKKyAgICAgIGlmIChoZWlnaHQgIT0gMSkKKyAgICAgICAgIGhlaWdodCA8PD0gMTsKKyAgICAgIGlmIChkZXB0aCAhPSAxKQorICAgICAgICAgZGVwdGggPDw9IDE7CisgICB9CisKKyAgIC8qIEd1ZXNzIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgbGFzdExldmVsLiAgVGhpcyBpcyBwcm9iYWJseSBnb2luZworICAgICogdG8gYmUgd3JvbmcgZmFpcmx5IG9mdGVuIGFuZCBtaWdodCBtZWFuIHRoYXQgd2UgaGF2ZSB0byBsb29rIGF0CisgICAgKiByZXNpemFibGUgYnVmZmVycywgb3IgcmVxdWlyZSB0aGF0IGJ1ZmZlcnMgaW1wbGVtZW50IGxhenkKKyAgICAqIHBhZ2V0YWJsZSBhcnJhbmdlbWVudHMuCisgICAgKi8KKyAgIGlmICgoaW50ZWxPYmotPmJhc2UuTWluRmlsdGVyID09IEdMX05FQVJFU1QgfHwKKyAgICAgICAgaW50ZWxPYmotPmJhc2UuTWluRmlsdGVyID09IEdMX0xJTkVBUikgJiYKKyAgICAgICBpbnRlbEltYWdlLT5sZXZlbCA9PSBmaXJzdExldmVsKSB7CisgICAgICBsYXN0TGV2ZWwgPSBmaXJzdExldmVsOworICAgfQorICAgZWxzZSB7CisgICAgICBsMndpZHRoID0gbG9nYmFzZTIod2lkdGgpOworICAgICAgbDJoZWlnaHQgPSBsb2diYXNlMihoZWlnaHQpOworICAgICAgbDJkZXB0aCA9IGxvZ2Jhc2UyKGRlcHRoKTsKKyAgICAgIGxhc3RMZXZlbCA9IGZpcnN0TGV2ZWwgKyBNQVgyKE1BWDIobDJ3aWR0aCwgbDJoZWlnaHQpLCBsMmRlcHRoKTsKKyAgIH0KKworICAgYXNzZXJ0KCFpbnRlbE9iai0+bXQpOworICAgaWYgKGludGVsSW1hZ2UtPmJhc2UuSXNDb21wcmVzc2VkKQorICAgICAgY29tcF9ieXRlID0gaW50ZWxfY29tcHJlc3NlZF9udW1fYnl0ZXMoaW50ZWxJbWFnZS0+YmFzZS5UZXhGb3JtYXQtPk1lc2FGb3JtYXQpOworICAgaW50ZWxPYmotPm10ID0gaW50ZWxfbWlwdHJlZV9jcmVhdGUoaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbE9iai0+YmFzZS5UYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5iYXNlLkludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5iYXNlLlRleEZvcm1hdC0+VGV4ZWxCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfYnl0ZSk7CisKKyAgIERCRygiJXMgLSBzdWNjZXNzXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisKKworCitzdGF0aWMgR0x1aW50Cit0YXJnZXRfdG9fZmFjZShHTGVudW0gdGFyZ2V0KQoreworICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0FSQjoKKyAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQjoKKyAgICAgIHJldHVybiAoKEdMdWludCkgdGFyZ2V0IC0gKEdMdWludCkgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YKTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgIH0KK30KKworLyogVGhlcmUgYXJlIGFjdHVhbGx5IHF1aXRlIGEgZmV3IGNvbWJpbmF0aW9ucyB0aGlzIHdpbGwgd29yayBmb3IsCisgKiBtb3JlIHRoYW4gd2hhdCBJJ3ZlIGxpc3RlZCBoZXJlLgorICovCitzdGF0aWMgR0xib29sZWFuCitjaGVja19wYm9fZm9ybWF0KEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfZm9ybWF0ICptZXNhX2Zvcm1hdCkKK3sKKyAgIHN3aXRjaCAoaW50ZXJuYWxGb3JtYXQpIHsKKyAgIGNhc2UgNDoKKyAgIGNhc2UgR0xfUkdCQToKKyAgICAgIHJldHVybiAoZm9ybWF0ID09IEdMX0JHUkEgJiYKKyAgICAgICAgICAgICAgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSB8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYpICYmCisgICAgICAgICAgICAgIG1lc2FfZm9ybWF0ID09ICZfbWVzYV90ZXhmb3JtYXRfYXJnYjg4ODgpOworICAgY2FzZSAzOgorICAgY2FzZSBHTF9SR0I6CisgICAgICByZXR1cm4gKGZvcm1hdCA9PSBHTF9SR0IgJiYKKyAgICAgICAgICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgorICAgICAgICAgICAgICBtZXNhX2Zvcm1hdCA9PSAmX21lc2FfdGV4Zm9ybWF0X3JnYjU2NSk7CisgICBjYXNlIEdMX1lDQkNSX01FU0E6CisgICAgICByZXR1cm4gKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgfHwgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9Cit9CisKKworLyogWFhYOiBEbyB0aGlzIGZvciBUZXhTdWJJbWFnZSBhbHNvOgorICovCitzdGF0aWMgR0xib29sZWFuCit0cnlfcGJvX3VwbG9hZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxJbWFnZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAorICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscykKK3sKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXJfb2JqZWN0ICpwYm8gPSBpbnRlbF9idWZmZXJfb2JqZWN0KHVucGFjay0+QnVmZmVyT2JqKTsKKyAgIEdMdWludCBzcmNfb2Zmc2V0LCBzcmNfc3RyaWRlOworICAgR0x1aW50IGRzdF9vZmZzZXQsIGRzdF9zdHJpZGU7CisKKyAgIGlmICghcGJvIHx8CisgICAgICAgaW50ZWwtPmN0eC5fSW1hZ2VUcmFuc2ZlclN0YXRlIHx8CisgICAgICAgdW5wYWNrLT5Ta2lwUGl4ZWxzIHx8IHVucGFjay0+U2tpcFJvd3MpIHsKKyAgICAgIF9tZXNhX3ByaW50ZigiJXM6IGZhaWx1cmUgMVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgc3JjX29mZnNldCA9IChHTHVpbnQpIHBpeGVsczsKKworICAgaWYgKHVucGFjay0+Um93TGVuZ3RoID4gMCkKKyAgICAgIHNyY19zdHJpZGUgPSB1bnBhY2stPlJvd0xlbmd0aDsKKyAgIGVsc2UKKyAgICAgIHNyY19zdHJpZGUgPSB3aWR0aDsKKworICAgZHN0X29mZnNldCA9IGludGVsX21pcHRyZWVfaW1hZ2Vfb2Zmc2V0KGludGVsSW1hZ2UtPm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bGV2ZWwpOworCisgICBkc3Rfc3RyaWRlID0gaW50ZWxJbWFnZS0+bXQtPnBpdGNoOworCisgICBpbnRlbEZsdXNoKCZpbnRlbC0+Y3R4KTsKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworICAgeworICAgICAgZHJpX2JvICpzcmNfYnVmZmVyID0gaW50ZWxfYnVmZmVyb2JqX2J1ZmZlcihpbnRlbCwgcGJvLCBJTlRFTF9SRUFEKTsKKyAgICAgIGRyaV9ibyAqZHN0X2J1ZmZlciA9IGludGVsX3JlZ2lvbl9idWZmZXIoaW50ZWwsCisJCQkJCSAgICAgICBpbnRlbEltYWdlLT5tdC0+cmVnaW9uLAorCQkJCQkgICAgICAgSU5URUxfV1JJVEVfRlVMTCk7CisKKworICAgICAgaW50ZWxFbWl0Q29weUJsaXQoaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5tdC0+Y3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgc3JjX2J1ZmZlciwgc3JjX29mZnNldCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCBkc3RfYnVmZmVyLCBkc3Rfb2Zmc2V0LCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsCisJCQlHTF9DT1BZKTsKKyAgIH0KKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKworc3RhdGljIEdMYm9vbGVhbgordHJ5X3Bib196Y29weShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwsCisgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlLAorICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKKyAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsCisgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMpCit7CisgICBzdHJ1Y3QgaW50ZWxfYnVmZmVyX29iamVjdCAqcGJvID0gaW50ZWxfYnVmZmVyX29iamVjdCh1bnBhY2stPkJ1ZmZlck9iaik7CisgICBHTHVpbnQgc3JjX29mZnNldCwgc3JjX3N0cmlkZTsKKyAgIEdMdWludCBkc3Rfb2Zmc2V0LCBkc3Rfc3RyaWRlOworCisgICBpZiAoIXBibyB8fAorICAgICAgIGludGVsLT5jdHguX0ltYWdlVHJhbnNmZXJTdGF0ZSB8fAorICAgICAgIHVucGFjay0+U2tpcFBpeGVscyB8fCB1bnBhY2stPlNraXBSb3dzKSB7CisgICAgICBfbWVzYV9wcmludGYoIiVzOiBmYWlsdXJlIDFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIHNyY19vZmZzZXQgPSAoR0x1aW50KSBwaXhlbHM7CisKKyAgIGlmICh1bnBhY2stPlJvd0xlbmd0aCA+IDApCisgICAgICBzcmNfc3RyaWRlID0gdW5wYWNrLT5Sb3dMZW5ndGg7CisgICBlbHNlCisgICAgICBzcmNfc3RyaWRlID0gd2lkdGg7CisKKyAgIGRzdF9vZmZzZXQgPSBpbnRlbF9taXB0cmVlX2ltYWdlX29mZnNldChpbnRlbEltYWdlLT5tdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmxldmVsKTsKKworICAgZHN0X3N0cmlkZSA9IGludGVsSW1hZ2UtPm10LT5waXRjaDsKKworICAgaWYgKHNyY19zdHJpZGUgIT0gZHN0X3N0cmlkZSB8fCBkc3Rfb2Zmc2V0ICE9IDAgfHwgc3JjX29mZnNldCAhPSAwKSB7CisgICAgICBfbWVzYV9wcmludGYoIiVzOiBmYWlsdXJlIDJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIGludGVsX3JlZ2lvbl9hdHRhY2hfcGJvKGludGVsLCBpbnRlbEltYWdlLT5tdC0+cmVnaW9uLCBwYm8pOworCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisKKworCisKK3N0YXRpYyB2b2lkCitpbnRlbFRleEltYWdlKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgR0xpbnQgZGltcywKKyAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LCBHTGludCBkZXB0aCwKKyAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKKyAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwgR0xzaXplaSBpbWFnZVNpemUsIGludCBjb21wcmVzc2VkKQoreworICAgc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsID0gaW50ZWxfY29udGV4dChjdHgpOworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7CisgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxJbWFnZSA9IGludGVsX3RleHR1cmVfaW1hZ2UodGV4SW1hZ2UpOworICAgR0xpbnQgcG9zdENvbnZXaWR0aCA9IHdpZHRoOworICAgR0xpbnQgcG9zdENvbnZIZWlnaHQgPSBoZWlnaHQ7CisgICBHTGludCB0ZXhlbEJ5dGVzLCBzaXplSW5CeXRlczsKKyAgIEdMdWludCBkc3RSb3dTdHJpZGUsIHNyY1Jvd1N0cmlkZSA9IHRleEltYWdlLT5Sb3dTdHJpZGU7CisKKworICAgREJHKCIlcyB0YXJnZXQgJXMgbGV2ZWwgJWQgJWR4JWR4JWQgYm9yZGVyICVkXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwgbGV2ZWwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIpOworCisgICBpbnRlbEZsdXNoKGN0eCk7CisKKyAgIGludGVsSW1hZ2UtPmZhY2UgPSB0YXJnZXRfdG9fZmFjZSh0YXJnZXQpOworICAgaW50ZWxJbWFnZS0+bGV2ZWwgPSBsZXZlbDsKKworICAgaWYgKGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSAmIElNQUdFX0NPTlZPTFVUSU9OX0JJVCkgeworICAgICAgX21lc2FfYWRqdXN0X2ltYWdlX2Zvcl9jb252b2x1dGlvbihjdHgsIGRpbXMsICZwb3N0Q29udldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdENvbnZIZWlnaHQpOworICAgfQorCisgICAvKiBjaG9vc2UgdGhlIHRleHR1cmUgZm9ybWF0ICovCisgICB0ZXhJbWFnZS0+VGV4Rm9ybWF0ID0gaW50ZWxDaG9vc2VUZXh0dXJlRm9ybWF0KGN0eCwgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSk7CisKKyAgIF9tZXNhX3NldF9mZXRjaF9mdW5jdGlvbnModGV4SW1hZ2UsIGRpbXMpOworCisgICBpZiAodGV4SW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlcyA9PSAwKSB7CisgICAgICAvKiBtdXN0IGJlIGEgY29tcHJlc3NlZCBmb3JtYXQgKi8KKyAgICAgIHRleGVsQnl0ZXMgPSAwOworICAgICAgdGV4SW1hZ2UtPklzQ29tcHJlc3NlZCA9IEdMX1RSVUU7CisgICAgICB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemUgPQorCSBjdHgtPkRyaXZlci5Db21wcmVzc2VkVGV4dHVyZVNpemUoY3R4LCB0ZXhJbWFnZS0+V2lkdGgsCisJCQkJCSAgIHRleEltYWdlLT5IZWlnaHQsIHRleEltYWdlLT5EZXB0aCwKKwkJCQkJICAgdGV4SW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICB9IGVsc2UgeworICAgICAgdGV4ZWxCeXRlcyA9IHRleEltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXM7CisgICAgICAKKyAgICAgIC8qIE1pbmltdW0gcGl0Y2ggb2YgMzIgYnl0ZXMgKi8KKyAgICAgIGlmIChwb3N0Q29udldpZHRoICogdGV4ZWxCeXRlcyA8IDMyKSB7CisJIHBvc3RDb252V2lkdGggPSAzMiAvIHRleGVsQnl0ZXM7CisJIHRleEltYWdlLT5Sb3dTdHJpZGUgPSBwb3N0Q29udldpZHRoOworICAgICAgfQorCisgICAgICBpZiAoIWludGVsSW1hZ2UtPm10KSB7ICAgICAgCisJICBhc3NlcnQodGV4SW1hZ2UtPlJvd1N0cmlkZSA9PSBwb3N0Q29udldpZHRoKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogUmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGEgcG90ZW50aWFsbHkgb3JwaGFuZWQgYnVmZmVyLiAgIAorICAgICogUmVsZWFzZSBhbnkgb2xkIG1hbGxvY2VkIG1lbW9yeS4KKyAgICAqLworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbEltYWdlLT5tdCk7CisgICAgICBhc3NlcnQoIXRleEltYWdlLT5EYXRhKTsKKyAgIH0KKyAgIGVsc2UgaWYgKHRleEltYWdlLT5EYXRhKSB7CisgICAgICBfbWVzYV9mcmVlX3RleG1lbW9yeSh0ZXhJbWFnZS0+RGF0YSk7CisgICAgICB0ZXhJbWFnZS0+RGF0YSA9IE5VTEw7CisgICB9CisKKyAgIC8qIElmIHRoaXMgaXMgdGhlIG9ubHkgdGV4dHVyZSBpbWFnZSBpbiB0aGUgdHJlZSwgY291bGQgY2FsbAorICAgICogYm1CdWZmZXJEYXRhIHdpdGggTlVMTCBkYXRhIHRvIGZyZWUgdGhlIG9sZCBibG9jayBhbmQgYXZvaWQKKyAgICAqIHdhaXRpbmcgb24gYW55IG91dHN0YW5kaW5nIGZlbmNlcy4KKyAgICAqLworICAgaWYgKGludGVsT2JqLT5tdCAmJgorICAgICAgIGludGVsT2JqLT5tdC0+Zmlyc3RfbGV2ZWwgPT0gbGV2ZWwgJiYKKyAgICAgICBpbnRlbE9iai0+bXQtPmxhc3RfbGV2ZWwgPT0gbGV2ZWwgJiYKKyAgICAgICBpbnRlbE9iai0+bXQtPnRhcmdldCAhPSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQiAmJgorICAgICAgICFpbnRlbF9taXB0cmVlX21hdGNoX2ltYWdlKGludGVsT2JqLT5tdCwgJmludGVsSW1hZ2UtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+ZmFjZSwgaW50ZWxJbWFnZS0+bGV2ZWwpKSB7CisKKyAgICAgIERCRygicmVsZWFzZSBpdFxuIik7CisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworICAgICAgYXNzZXJ0KCFpbnRlbE9iai0+bXQpOworICAgfQorCisgICBpZiAoIWludGVsT2JqLT5tdCkgeworICAgICAgZ3Vlc3NfYW5kX2FsbG9jX21pcG1hcF90cmVlKGludGVsLCBpbnRlbE9iaiwgaW50ZWxJbWFnZSk7CisgICAgICBpZiAoIWludGVsT2JqLT5tdCkgeworCSBEQkcoImd1ZXNzX2FuZF9hbGxvY19taXBtYXBfdHJlZTogZmFpbGVkXG4iKTsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KCFpbnRlbEltYWdlLT5tdCk7CisKKyAgIGlmIChpbnRlbE9iai0+bXQgJiYKKyAgICAgICBpbnRlbF9taXB0cmVlX21hdGNoX2ltYWdlKGludGVsT2JqLT5tdCwgJmludGVsSW1hZ2UtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5mYWNlLCBpbnRlbEltYWdlLT5sZXZlbCkpIHsKKworICAgICAgaW50ZWxfbWlwdHJlZV9yZWZlcmVuY2UoJmludGVsSW1hZ2UtPm10LCBpbnRlbE9iai0+bXQpOworICAgICAgYXNzZXJ0KGludGVsSW1hZ2UtPm10KTsKKyAgIH0gZWxzZSBpZiAoaW50ZWxJbWFnZS0+YmFzZS5Cb3JkZXIgPT0gMCkgeworICAgICAgaW50IGNvbXBfYnl0ZSA9IDA7CisKKyAgICAgIGlmIChpbnRlbEltYWdlLT5iYXNlLklzQ29tcHJlc3NlZCkgeworCSBjb21wX2J5dGUgPQorCSAgICBpbnRlbF9jb21wcmVzc2VkX251bV9ieXRlcyhpbnRlbEltYWdlLT5iYXNlLlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICAgICB9CisKKyAgICAgIC8qIERpZG4ndCBmaXQgaW4gdGhlIG9iamVjdCBtaXB0cmVlLCBidXQgaXQncyBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uIGluCisgICAgICAgKiBhIG1pcHRyZWUsIHNvIGNyZWF0ZSBvbmUganVzdCBmb3Igb3VyIGxldmVsIGFuZCBzdG9yZSBpdCBpbiB0aGUgaW1hZ2UuCisgICAgICAgKiBJdCdsbCBnZXQgbW92ZWQgaW50byB0aGUgb2JqZWN0IG1pcHRyZWUgYXQgdmFsaWRhdGUgdGltZS4KKyAgICAgICAqLworICAgICAgaW50ZWxJbWFnZS0+bXQgPSBpbnRlbF9taXB0cmVlX2NyZWF0ZShpbnRlbCwgdGFyZ2V0LCBpbnRlcm5hbEZvcm1hdCwKKwkJCQkJICAgIGxldmVsLCBsZXZlbCwKKwkJCQkJICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoLAorCQkJCQkgICAgaW50ZWxJbWFnZS0+YmFzZS5UZXhGb3JtYXQtPlRleGVsQnl0ZXMsCisJCQkJCSAgICBjb21wX2J5dGUpOworCisgICB9CisKKyAgIC8qIFBCTyBmYXN0cGF0aHM6CisgICAgKi8KKyAgIGlmIChkaW1zIDw9IDIgJiYKKyAgICAgICBpbnRlbEltYWdlLT5tdCAmJgorICAgICAgIGludGVsX2J1ZmZlcl9vYmplY3QodW5wYWNrLT5CdWZmZXJPYmopICYmCisgICAgICAgY2hlY2tfcGJvX2Zvcm1hdChpbnRlcm5hbEZvcm1hdCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgaW50ZWxJbWFnZS0+YmFzZS5UZXhGb3JtYXQpKSB7CisKKyAgICAgIERCRygidHJ5aW5nIHBibyB1cGxvYWRcbiIpOworCisgICAgICAvKiBBdHRlbXB0IHRvIHRleHR1cmUgZGlyZWN0bHkgZnJvbSBQQk8gZGF0YSAoemVybyBjb3B5IHVwbG9hZCkuCisgICAgICAgKgorICAgICAgICogQ3VycmVudGx5IGRpc2FibGUgYXMgaXQgY2FuIGxlYWQgdG8gd29yc2UgYXMgd2VsbCBhcyBiZXR0ZXIKKyAgICAgICAqIHBlcmZvcm1hbmNlIChpbiBwYXJ0aWN1bGFyIHdoZW4gaW50ZWxfcmVnaW9uX2NvdygpIGlzCisgICAgICAgKiByZXF1aXJlZCkuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnRlbE9iai0+bXQgPT0gaW50ZWxJbWFnZS0+bXQgJiYKKyAgICAgICAgICBpbnRlbE9iai0+bXQtPmZpcnN0X2xldmVsID09IGxldmVsICYmCisgICAgICAgICAgaW50ZWxPYmotPm10LT5sYXN0X2xldmVsID09IGxldmVsKSB7CisKKyAgICAgICAgIGlmICh0cnlfcGJvX3pjb3B5KGludGVsLCBpbnRlbEltYWdlLCB1bnBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSkgeworCisgICAgICAgICAgICBEQkcoInBibyB6Y29weSB1cGxvYWQgc3VjY2VlZGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICAgICAvKiBPdGhlcndpc2UsIGF0dGVtcHQgdG8gdXNlIHRoZSBibGl0dGVyIGZvciBQQk8gaW1hZ2UgdXBsb2Fkcy4KKyAgICAgICAqLworICAgICAgaWYgKHRyeV9wYm9fdXBsb2FkKGludGVsLCBpbnRlbEltYWdlLCB1bnBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpKSB7CisgICAgICAgICBEQkcoInBibyB1cGxvYWQgc3VjY2VlZGVkXG4iKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgREJHKCJwYm8gdXBsb2FkIGZhaWxlZFxuIik7CisgICB9CisKKworCisgICAvKiBpbnRlbENvcHlUZXhJbWFnZSBjYWxscyB0aGlzIGZ1bmN0aW9uIHdpdGggcGl4ZWxzID09IE5VTEwsIHdpdGgKKyAgICAqIHRoZSBleHBlY3RhdGlvbiB0aGF0IHRoZSBtaXBtYXAgdHJlZSB3aWxsIGJlIHNldCB1cCBidXQgbm90aGluZworICAgICogbW9yZSB3aWxsIGJlIGRvbmUuICBUaGlzIGlzIHdoZXJlIHRob3NlIGNhbGxzIHJldHVybjoKKyAgICAqLworICAgaWYgKGNvbXByZXNzZWQpIHsKKyAgICAgIHBpeGVscyA9IF9tZXNhX3ZhbGlkYXRlX3Bib19jb21wcmVzc2VkX3RleGltYWdlKGN0eCwgaW1hZ2VTaXplLCBwaXhlbHMsCisJCQkJCQkgICAgICB1bnBhY2ssCisJCQkJCQkgICAgICAiZ2xDb21wcmVzc2VkVGV4SW1hZ2UiKTsKKyAgIH0gZWxzZSB7CisgICAgICBwaXhlbHMgPSBfbWVzYV92YWxpZGF0ZV9wYm9fdGV4aW1hZ2UoY3R4LCBkaW1zLCB3aWR0aCwgaGVpZ2h0LCAxLAorCQkJCQkgICBmb3JtYXQsIHR5cGUsCisJCQkJCSAgIHBpeGVscywgdW5wYWNrLCAiZ2xUZXhJbWFnZSIpOworICAgfQorCisgICBMT0NLX0hBUkRXQVJFKGludGVsKTsKKworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICB0ZXhJbWFnZS0+RGF0YSA9IGludGVsX21pcHRyZWVfaW1hZ2VfbWFwKGludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5tdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+ZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSb3dTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmJhc2UuSW1hZ2VPZmZzZXRzKTsKKyAgICAgIHRleEltYWdlLT5Sb3dTdHJpZGUgPSBkc3RSb3dTdHJpZGUgLyBpbnRlbEltYWdlLT5tdC0+Y3BwOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBBbGxvY2F0ZSByZWd1bGFyIG1lbW9yeSBhbmQgc3RvcmUgdGhlIGltYWdlIHRoZXJlIHRlbXBvcmFyaWx5LiAgICovCisgICAgICBpZiAodGV4SW1hZ2UtPklzQ29tcHJlc3NlZCkgeworICAgICAgICAgc2l6ZUluQnl0ZXMgPSB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemU7CisgICAgICAgICBkc3RSb3dTdHJpZGUgPQorICAgICAgICAgICAgX21lc2FfY29tcHJlc3NlZF9yb3dfc3RyaWRlKHRleEltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQsIHdpZHRoKTsKKyAgICAgICAgIGFzc2VydChkaW1zICE9IDMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBkc3RSb3dTdHJpZGUgPSBwb3N0Q29udldpZHRoICogdGV4ZWxCeXRlczsKKyAgICAgICAgIHNpemVJbkJ5dGVzID0gZGVwdGggKiBkc3RSb3dTdHJpZGUgKiBwb3N0Q29udkhlaWdodDsKKyAgICAgIH0KKworICAgICAgdGV4SW1hZ2UtPkRhdGEgPSBfbWVzYV9hbGxvY190ZXhtZW1vcnkoc2l6ZUluQnl0ZXMpOworICAgfQorCisgICBEQkcoIlVwbG9hZCBpbWFnZSAlZHglZHglZCByb3dfbGVuICVkICIKKyAgICAgICAicGl0Y2ggJWRcbiIsCisgICAgICAgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoICogdGV4ZWxCeXRlcywgZHN0Um93U3RyaWRlKTsKKworICAgLyogQ29weSBkYXRhLiAgV291bGQgbGlrZSB0byBrbm93IHdoZW4gaXQncyBvayBmb3IgdXMgdG8gZWcuIHVzZQorICAgICogdGhlIGJsaXR0ZXIgdG8gY29weS4gIE9yLCB1c2UgdGhlIGhhcmR3YXJlIHRvIGRvIHRoZSBmb3JtYXQKKyAgICAqIGNvbnZlcnNpb24gYW5kIGNvcHk6CisgICAgKi8KKyAgIGlmIChwaXhlbHMpIHsKKyAgICAgICBpZiAoY29tcHJlc3NlZCkgeworCSAgIGlmIChpbnRlbEltYWdlLT5tdCkgeworCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkc3QgPSBpbnRlbEltYWdlLT5tdC0+cmVnaW9uOworCSAgICAgICBfbWVzYV9jb3B5X3JlY3QodGV4SW1hZ2UtPkRhdGEsIGRzdC0+Y3BwLCBkc3QtPnBpdGNoLAorCQkJICAgICAgIDAsIDAsCisJCQkgICAgICAgaW50ZWxJbWFnZS0+bXQtPmxldmVsW2xldmVsXS53aWR0aCwKKwkJCSAgICAgICBpbnRlbEltYWdlLT5tdC0+bGV2ZWxbbGV2ZWxdLmhlaWdodC80LAorCQkJICAgICAgIHBpeGVscywKKwkJCSAgICAgICBzcmNSb3dTdHJpZGUsCisJCQkgICAgICAgMCwgMCk7CisJICAgfSBlbHNlCisJICAgICAgIG1lbWNweSh0ZXhJbWFnZS0+RGF0YSwgcGl4ZWxzLCBpbWFnZVNpemUpOworICAgICAgIH0gZWxzZSBpZiAoIXRleEltYWdlLT5UZXhGb3JtYXQtPlN0b3JlSW1hZ2UoY3R4LCBkaW1zLCAKKwkJCQkJCSAgIHRleEltYWdlLT5fQmFzZUZvcm1hdCwgCisJCQkJCQkgICB0ZXhJbWFnZS0+VGV4Rm9ybWF0LCAKKwkJCQkJCSAgIHRleEltYWdlLT5EYXRhLCAwLCAwLCAwLCAvKiBkc3RYL1kvWm9mZnNldCAqLworCQkJCQkJICAgZHN0Um93U3RyaWRlLAorCQkJCQkJICAgdGV4SW1hZ2UtPkltYWdlT2Zmc2V0cywKKwkJCQkJCSAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoLAorCQkJCQkJICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHVucGFjaykpIHsKKwkgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbFRleEltYWdlIik7CisgICAgICAgfQorICAgfQorCisgICAvKiBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcCAqLworICAgaWYgKGxldmVsID09IHRleE9iai0+QmFzZUxldmVsICYmIHRleE9iai0+R2VuZXJhdGVNaXBtYXApIHsKKyAgICAgIGludGVsX2dlbmVyYXRlX21pcG1hcChjdHgsIHRhcmdldCwgdGV4T2JqKTsKKyAgIH0KKworICAgX21lc2FfdW5tYXBfdGV4aW1hZ2VfcGJvKGN0eCwgdW5wYWNrKTsKKworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICBpbnRlbF9taXB0cmVlX2ltYWdlX3VubWFwKGludGVsLCBpbnRlbEltYWdlLT5tdCk7CisgICAgICB0ZXhJbWFnZS0+RGF0YSA9IE5VTEw7CisgICB9CisKKyAgIFVOTE9DS19IQVJEV0FSRShpbnRlbCk7Cit9CisKK3ZvaWQKK2ludGVsVGV4SW1hZ2UzRChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgaW50ZWxUZXhJbWFnZShjdHgsIDMsIHRhcmdldCwgbGV2ZWwsCisgICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLAorICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgdW5wYWNrLCB0ZXhPYmosIHRleEltYWdlLCAwLCAwKTsKK30KKworCit2b2lkCitpbnRlbFRleEltYWdlMkQoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciwKKyAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAorICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSkKK3sKKyAgIGludGVsVGV4SW1hZ2UoY3R4LCAyLCB0YXJnZXQsIGxldmVsLAorICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMSwgYm9yZGVyLAorICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgdW5wYWNrLCB0ZXhPYmosIHRleEltYWdlLCAwLCAwKTsKK30KKwordm9pZAoraW50ZWxUZXhJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICBHTGludCB3aWR0aCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgaW50ZWxUZXhJbWFnZShjdHgsIDEsIHRhcmdldCwgbGV2ZWwsCisgICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0LCB3aWR0aCwgMSwgMSwgYm9yZGVyLAorICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgdW5wYWNrLCB0ZXhPYmosIHRleEltYWdlLCAwLCAwKTsKK30KKwordm9pZCBpbnRlbENvbXByZXNzZWRUZXhJbWFnZTJEKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisJCQkJR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisJCQkJR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyLAorCQkJCUdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsCisJCQkJc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisJCQkJc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlICkKK3sKKyAgIGludGVsVGV4SW1hZ2UoY3R4LCAyLCB0YXJnZXQsIGxldmVsLAorCQkgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDEsIGJvcmRlciwKKwkJIDAsIDAsIGRhdGEsICZjdHgtPlVucGFjaywgdGV4T2JqLCB0ZXhJbWFnZSwgaW1hZ2VTaXplLCAxKTsKK30KKworLyoqCisgKiBOZWVkIHRvIG1hcCB0ZXh0dXJlIGltYWdlIGludG8gbWVtb3J5IGJlZm9yZSBjb3B5aW5nIGltYWdlIGRhdGEsCisgKiB0aGVuIHVubWFwIGl0LgorICovCitzdGF0aWMgdm9pZAoraW50ZWxfZ2V0X3RleF9pbWFnZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorCQkgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqIHBpeGVscywKKwkJICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorCQkgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlLCBpbnQgY29tcHJlc3NlZCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IGludGVsX2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlID0gaW50ZWxfdGV4dHVyZV9pbWFnZSh0ZXhJbWFnZSk7CisKKyAgIC8qIE1hcCAqLworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICAvKiBJbWFnZSBpcyBzdG9yZWQgaW4gaGFyZHdhcmUgZm9ybWF0IGluIGEgYnVmZmVyIG1hbmFnZWQgYnkgdGhlCisgICAgICAgKiBrZXJuZWwuICBOZWVkIHRvIGV4cGxpY2l0bHkgbWFwIGFuZCB1bm1hcCBpdC4KKyAgICAgICAqLworICAgICAgaW50ZWxJbWFnZS0+YmFzZS5EYXRhID0KKyAgICAgICAgIGludGVsX21pcHRyZWVfaW1hZ2VfbWFwKGludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZWxJbWFnZS0+YmFzZS5Sb3dTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5iYXNlLkltYWdlT2Zmc2V0cyk7CisgICAgICBpbnRlbEltYWdlLT5iYXNlLlJvd1N0cmlkZSAvPSBpbnRlbEltYWdlLT5tdC0+Y3BwOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBPdGhlcndpc2UsIHRoZSBpbWFnZSBzaG91bGQgYWN0dWFsbHkgYmUgc3RvcmVkIGluCisgICAgICAgKiBpbnRlbEltYWdlLT5iYXNlLkRhdGEuICBUaGlzIGlzIHByZXR0eSBjb25mdXNpbmcgZm9yCisgICAgICAgKiBldmVyeWJvZHksIEknZCBtdWNoIHByZWZlciB0byBzZXBhcmF0ZSB0aGUgdHdvIGZ1bmN0aW9ucyBvZgorICAgICAgICogdGV4SW1hZ2UtPkRhdGEgLSBzdG9yYWdlIGZvciB0ZXh0dXJlIGltYWdlcyBpbiBtYWluIG1lbW9yeQorICAgICAgICogYW5kIGFjY2VzcyAoaWUgbWFwcGluZ3MpIG9mIGltYWdlcy4gIEluIG90aGVyIHdvcmRzLCB3ZSdkCisgICAgICAgKiBjcmVhdGUgYSBuZXcgdGV4SW1hZ2UtPk1hcCBmaWVsZCBhbmQgbGVhdmUgRGF0YSBzaW1wbHkgZm9yCisgICAgICAgKiBzdG9yYWdlLgorICAgICAgICovCisgICAgICBhc3NlcnQoaW50ZWxJbWFnZS0+YmFzZS5EYXRhKTsKKyAgIH0KKworCisgICBpZiAoY29tcHJlc3NlZCkgeworICAgICAgX21lc2FfZ2V0X2NvbXByZXNzZWRfdGV4aW1hZ2UoY3R4LCB0YXJnZXQsIGxldmVsLCBwaXhlbHMsCisJCQkJICAgIHRleE9iaiwgdGV4SW1hZ2UpOworICAgfSBlbHNlIHsKKyAgICAgIF9tZXNhX2dldF90ZXhpbWFnZShjdHgsIHRhcmdldCwgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzLAorCQkJIHRleE9iaiwgdGV4SW1hZ2UpOworICAgfQorICAgICAKKworICAgLyogVW5tYXAgKi8KKyAgIGlmIChpbnRlbEltYWdlLT5tdCkgeworICAgICAgaW50ZWxfbWlwdHJlZV9pbWFnZV91bm1hcChpbnRlbCwgaW50ZWxJbWFnZS0+bXQpOworICAgICAgaW50ZWxJbWFnZS0+YmFzZS5EYXRhID0gTlVMTDsKKyAgIH0KK30KKwordm9pZAoraW50ZWxHZXRUZXhJbWFnZShHTGNvbnRleHQgKiBjdHgsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICogcGl4ZWxzLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgaW50ZWxfZ2V0X3RleF9pbWFnZShjdHgsIHRhcmdldCwgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzLAorCQkgICAgICAgdGV4T2JqLCB0ZXhJbWFnZSwgMCk7CisKKworfQorCit2b2lkCitpbnRlbEdldENvbXByZXNzZWRUZXhJbWFnZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisJCQkgICBHTHZvaWQgKnBpeGVscywKKwkJCSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorCQkJICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworICAgaW50ZWxfZ2V0X3RleF9pbWFnZShjdHgsIHRhcmdldCwgbGV2ZWwsIDAsIDAsIHBpeGVscywKKwkJICAgICAgIHRleE9iaiwgdGV4SW1hZ2UsIDEpOworfQorCit2b2lkCitpbnRlbFNldFRleE9mZnNldChfX0RSSWNvbnRleHQgKnBEUklDdHgsIEdMaW50IHRleG5hbWUsCisJCSAgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgR0xpbnQgZGVwdGgsIEdMdWludCBwaXRjaCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCA9IHBEUklDdHgtPmRyaXZlclByaXZhdGU7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPSBfbWVzYV9sb29rdXBfdGV4dHVyZSgmaW50ZWwtPmN0eCwgdGV4bmFtZSk7CisgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqID0gaW50ZWxfdGV4dHVyZV9vYmplY3QodE9iaik7CisKKyAgIGlmICghaW50ZWxPYmopCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbnRlbE9iai0+bXQpCisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworCisgICBpbnRlbE9iai0+aW1hZ2VPdmVycmlkZSA9IEdMX1RSVUU7CisgICBpbnRlbE9iai0+ZGVwdGhPdmVycmlkZSA9IGRlcHRoOworICAgaW50ZWxPYmotPnBpdGNoT3ZlcnJpZGUgPSBwaXRjaDsKKworICAgaWYgKG9mZnNldCkKKyAgICAgIGludGVsT2JqLT50ZXh0dXJlT2Zmc2V0ID0gb2Zmc2V0OworfQorCit2b2lkCitpbnRlbFNldFRleEJ1ZmZlcihfX0RSSWNvbnRleHQgKnBEUklDdHgsIEdMaW50IHRhcmdldCwgX19EUklkcmF3YWJsZSAqZFByaXYpCit7CisgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gZFByaXYtPmRyaXZlclByaXZhdGU7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBwRFJJQ3R4LT5kcml2ZXJQcml2YXRlOworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iajsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlOworICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdDsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiOworICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdDsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqOworICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlOworICAgaW50IGxldmVsID0gMCwgdHlwZSwgZm9ybWF0LCBpbnRlcm5hbEZvcm1hdDsKKworICAgdGV4VW5pdCA9ICZpbnRlbC0+Y3R4LlRleHR1cmUuVW5pdFtpbnRlbC0+Y3R4LlRleHR1cmUuQ3VycmVudFVuaXRdOworICAgdGV4T2JqID0gX21lc2Ffc2VsZWN0X3RleF9vYmplY3QoJmludGVsLT5jdHgsIHRleFVuaXQsIHRhcmdldCk7CisgICBpbnRlbE9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KHRleE9iaik7CisKKyAgIGlmICghaW50ZWxPYmopCisgICAgICByZXR1cm47CisKKyAgIF9fZHJpUGFyc2VFdmVudHMocERSSUN0eCwgZFByaXYpOworCisgICByYiA9IGludGVsX2ZiLT5jb2xvcl9yYlswXTsKKyAgIHR5cGUgPSBHTF9CR1JBOworICAgZm9ybWF0ID0gR0xfVU5TSUdORURfQllURTsKKyAgIGludGVybmFsRm9ybWF0ID0gKHJiLT5yZWdpb24tPmNwcCA9PSAzID8gMyA6IDQpOworCisgICBtdCA9IGludGVsX21pcHRyZWVfY3JlYXRlX2Zvcl9yZWdpb24oaW50ZWwsIHRhcmdldCwKKwkJCQkJaW50ZXJuYWxGb3JtYXQsCisJCQkJCTAsIDAsIHJiLT5yZWdpb24sIDEsIDApOworICAgaWYgKG10ID09IE5VTEwpCisgICAgICAgcmV0dXJuOworCisgICBfbWVzYV9sb2NrX3RleHR1cmUoJmludGVsLT5jdHgsIHRleE9iaik7CisKKyAgIGlmIChpbnRlbE9iai0+bXQpCisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworCisgICBpbnRlbE9iai0+bXQgPSBtdDsKKyAgIHRleEltYWdlID0gX21lc2FfZ2V0X3RleF9pbWFnZSgmaW50ZWwtPmN0eCwgdGV4T2JqLCB0YXJnZXQsIGxldmVsKTsKKyAgIF9tZXNhX2luaXRfdGV4aW1hZ2VfZmllbGRzKCZpbnRlbC0+Y3R4LCB0YXJnZXQsIHRleEltYWdlLAorCQkJICAgICAgcmItPnJlZ2lvbi0+cGl0Y2gsIHJiLT5yZWdpb24tPmhlaWdodCwgMSwKKwkJCSAgICAgIDAsIGludGVybmFsRm9ybWF0KTsKKworICAgaW50ZWxJbWFnZSA9IGludGVsX3RleHR1cmVfaW1hZ2UodGV4SW1hZ2UpOworICAgaW50ZWxJbWFnZS0+ZmFjZSA9IHRhcmdldF90b19mYWNlKHRhcmdldCk7CisgICBpbnRlbEltYWdlLT5sZXZlbCA9IGxldmVsOworICAgdGV4SW1hZ2UtPlRleEZvcm1hdCA9IGludGVsQ2hvb3NlVGV4dHVyZUZvcm1hdCgmaW50ZWwtPmN0eCwgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGZvcm1hdCk7CisgICBfbWVzYV9zZXRfZmV0Y2hfZnVuY3Rpb25zKHRleEltYWdlLCAyKTsKKyAgIHRleEltYWdlLT5Sb3dTdHJpZGUgPSByYi0+cmVnaW9uLT5waXRjaDsKKyAgIGludGVsX21pcHRyZWVfcmVmZXJlbmNlKCZpbnRlbEltYWdlLT5tdCwgaW50ZWxPYmotPm10KTsKKworICAgaWYgKCFpbnRlbF9taXB0cmVlX21hdGNoX2ltYWdlKGludGVsT2JqLT5tdCwgJmludGVsSW1hZ2UtPmJhc2UsCisJCQkJICBpbnRlbEltYWdlLT5mYWNlLCBpbnRlbEltYWdlLT5sZXZlbCkpIHsKKwkgICBmcHJpbnRmKHN0ZGVyciwgIm1pcHRyZWUgZG9lc24ndCBtYXRjaCBpbWFnZVxuIik7CisgICB9CisKKyAgIF9tZXNhX3VubG9ja190ZXh0dXJlKCZpbnRlbC0+Y3R4LCB0ZXhPYmopOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2xheW91dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2xheW91dC5jCmluZGV4IGZjYjVjYzMuLmVkYzNhMmUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9sYXlvdXQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfbGF5b3V0LmMKQEAgLTMyLDE1ICszMiwyNyBAQAogCiAjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKICNpbmNsdWRlICJpbnRlbF90ZXhfbGF5b3V0LmgiCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgogCi0KLXN0YXRpYyBpbnQgYWxpZ24oaW50IHZhbHVlLCBpbnQgYWxpZ25tZW50KQorR0x1aW50IGludGVsX2NvbXByZXNzZWRfYWxpZ25tZW50KEdMZW51bSBpbnRlcm5hbEZvcm1hdCkKIHsKLSAgIHJldHVybiAodmFsdWUgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7CisgICAgR0x1aW50IGFsaWdubWVudCA9IDQ7CisKKyAgICBzd2l0Y2ggKGludGVybmFsRm9ybWF0KSB7CisgICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQl9GWFQxXzNERlg6CisgICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYOgorICAgICAgICBhbGlnbm1lbnQgPSA4OworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhbGlnbm1lbnQ7CiB9CiAKLXZvaWQgaTk0NV9taXB0cmVlX2xheW91dF8yZCggc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCApCit2b2lkIGk5NDVfbWlwdHJlZV9sYXlvdXRfMmQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCApCiB7CiAgICBHTGludCBhbGlnbl9oID0gMiwgYWxpZ25fdyA9IDQ7CiAgICBHTHVpbnQgbGV2ZWw7CkBAIC01MSwyMyArNjMsMzYgQEAKIAogICAgbXQtPnBpdGNoID0gbXQtPndpZHRoMDsKIAorICAgaWYgKG10LT5jb21wcmVzc2VkKSB7CisgICAgICAgYWxpZ25fdyA9IGludGVsX2NvbXByZXNzZWRfYWxpZ25tZW50KG10LT5pbnRlcm5hbF9mb3JtYXQpOworICAgICAgIG10LT5waXRjaCA9IEFMSUdOKG10LT53aWR0aDAsIGFsaWduX3cpOworICAgfQorCiAgICAvKiBNYXkgbmVlZCB0byBhZGp1c3QgcGl0Y2ggdG8gYWNjb21vZGF0ZSB0aGUgcGxhY2VtZW50IG9mCiAgICAgKiB0aGUgMm5kIG1pcG1hcC4gIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGFsaWdubWVudAogICAgICogY29uc3RyYWludHMgb2YgbWlwbWFwIHBsYWNlbWVudCBwdXNoIHRoZSByaWdodCBlZGdlIG9mIHRoZQogICAgICogMm5kIG1pcG1hcCBvdXQgcGFzdCB0aGUgd2lkdGggb2YgaXRzIHBhcmVudC4KICAgICAqLwogICAgaWYgKG10LT5maXJzdF9sZXZlbCAhPSBtdC0+bGFzdF9sZXZlbCkgewotICAgICAgR0x1aW50IG1pcDFfd2lkdGggPSBhbGlnbihtaW5pZnkobXQtPndpZHRoMCksIGFsaWduX3cpCi0JCQkrIG1pbmlmeShtaW5pZnkobXQtPndpZHRoMCkpOworICAgICAgIEdMdWludCBtaXAxX3dpZHRoOwogCi0gICAgICBpZiAobWlwMV93aWR0aCA+IG10LT53aWR0aDApCi0JIG10LT5waXRjaCA9IG1pcDFfd2lkdGg7CisgICAgICAgaWYgKG10LT5jb21wcmVzc2VkKSB7CisgICAgICAgICAgIG1pcDFfd2lkdGggPSBBTElHTihtaW5pZnkobXQtPndpZHRoMCksIGFsaWduX3cpCisgICAgICAgICAgICAgICArIEFMSUdOKG1pbmlmeShtaW5pZnkobXQtPndpZHRoMCkpLCBhbGlnbl93KTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBtaXAxX3dpZHRoID0gQUxJR04obWluaWZ5KG10LT53aWR0aDApLCBhbGlnbl93KQorICAgICAgICAgICAgICAgKyBtaW5pZnkobWluaWZ5KG10LT53aWR0aDApKTsKKyAgICAgICB9CisKKyAgICAgICBpZiAobWlwMV93aWR0aCA+IG10LT5waXRjaCkgeworICAgICAgICAgICBtdC0+cGl0Y2ggPSBtaXAxX3dpZHRoOworICAgICAgIH0KICAgIH0KIAogICAgLyogUGl0Y2ggbXVzdCBiZSBhIHdob2xlIG51bWJlciBvZiBkd29yZHMsIGV2ZW4gdGhvdWdoIHdlCiAgICAgKiBleHByZXNzIGl0IGluIHRleGVscy4KICAgICAqLwotICAgbXQtPnBpdGNoID0gYWxpZ24obXQtPnBpdGNoICogbXQtPmNwcCwgNCkgLyBtdC0+Y3BwOworICAgbXQtPnBpdGNoID0gaW50ZWxfbWlwdHJlZV9waXRjaF9hbGlnbiAoaW50ZWwsIG10LCBtdC0+cGl0Y2gpOwogICAgbXQtPnRvdGFsX2hlaWdodCA9IDA7CiAKICAgIGZvciAoIGxldmVsID0gbXQtPmZpcnN0X2xldmVsIDsgbGV2ZWwgPD0gbXQtPmxhc3RfbGV2ZWwgOyBsZXZlbCsrICkgewpAQCAtNzksNyArMTA0LDcgQEAKICAgICAgIGlmIChtdC0+Y29tcHJlc3NlZCkKIAkgaW1nX2hlaWdodCA9IE1BWDIoMSwgaGVpZ2h0LzQpOwogICAgICAgZWxzZQotCSBpbWdfaGVpZ2h0ID0gYWxpZ24oaGVpZ2h0LCBhbGlnbl9oKTsKKwkgaW1nX2hlaWdodCA9IEFMSUdOKGhlaWdodCwgYWxpZ25faCk7CiAKIAogICAgICAgLyogQmVjYXVzZSB0aGUgaW1hZ2VzIGFyZSBwYWNrZWQgYmV0dGVyLCB0aGUgZmluYWwgb2Zmc2V0CkBAIC05MCw3ICsxMTUsNyBAQAogICAgICAgLyogTGF5b3V0X2JlbG93OiBzdGVwIHJpZ2h0IGFmdGVyIHNlY29uZCBtaXBtYXAuCiAgICAgICAgKi8KICAgICAgIGlmIChsZXZlbCA9PSBtdC0+Zmlyc3RfbGV2ZWwgKyAxKSB7Ci0JIHggKz0gYWxpZ24od2lkdGgsIGFsaWduX3cpOworCSB4ICs9IEFMSUdOKHdpZHRoLCBhbGlnbl93KTsKICAgICAgIH0KICAgICAgIGVsc2UgewogCSB5ICs9IGltZ19oZWlnaHQ7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfbGF5b3V0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfbGF5b3V0LmgKaW5kZXggMWUzN2Y4Zi4uMTkzNjk5ZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X2xheW91dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9sYXlvdXQuaApAQCAtMzgsNCArMzgsNSBAQAogICAgcmV0dXJuIE1BWDIoMSwgZD4+MSk7CiB9CiAKLWV4dGVybiB2b2lkIGk5NDVfbWlwdHJlZV9sYXlvdXRfMmQoIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQgKTsKK2V4dGVybiB2b2lkIGk5NDVfbWlwdHJlZV9sYXlvdXRfMmQoIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCApOworZXh0ZXJuIEdMdWludCBpbnRlbF9jb21wcmVzc2VkX2FsaWdubWVudChHTGVudW0pOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X29iai5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTM0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfb2JqLmgKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSU5URUxfVEVYX09CSl9ICisjZGVmaW5lIF9JTlRFTF9URVhfT0JKX0gKKworc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0Cit7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgYmFzZTsgICAgICAgLyogVGhlICJwYXJlbnQiIG9iamVjdCAqLworCisgICAvKiBUaGUgbWlwbWFwIHRyZWUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IHRoZXNlIGxldmVscyBvbmNlCisgICAgKiB2YWxpZGF0ZWQ6CisgICAgKi8KKyAgIEdMdWludCBmaXJzdExldmVsOworICAgR0x1aW50IGxhc3RMZXZlbDsKKworICAgLyogT2Zmc2V0IGZvciBmaXJzdExldmVsIGltYWdlOgorICAgICovCisgICBHTHVpbnQgdGV4dHVyZU9mZnNldDsKKworICAgLyogT24gdmFsaWRhdGlvbiBhbnkgYWN0aXZlIGltYWdlcyBoZWxkIGluIG1haW4gbWVtb3J5IG9yIGluIG90aGVyCisgICAgKiByZWdpb25zIHdpbGwgYmUgY29waWVkIHRvIHRoaXMgcmVnaW9uIGFuZCB0aGUgb2xkIHN0b3JhZ2UgZnJlZWQuCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQ7CisKKyAgIEdMYm9vbGVhbiBpbWFnZU92ZXJyaWRlOworICAgR0xpbnQgZGVwdGhPdmVycmlkZTsKKyAgIEdMdWludCBwaXRjaE92ZXJyaWRlOworfTsKKworc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UKK3sKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlIGJhc2U7CisKKyAgIC8qIFRoZXNlIGFyZW4ndCBzdG9yZWQgaW4gZ2xfdGV4dHVyZV9pbWFnZSAKKyAgICAqLworICAgR0x1aW50IGxldmVsOworICAgR0x1aW50IGZhY2U7CisKKyAgIC8qIElmIGludGVsSW1hZ2UtPm10ICE9IE5VTEwsIGltYWdlIGRhdGEgaXMgc3RvcmVkIGhlcmUuCisgICAgKiBFbHNlIGlmIGludGVsSW1hZ2UtPmJhc2UuRGF0YSAhPSBOVUxMLCBpbWFnZSBpcyBzdG9yZWQgdGhlcmUuCisgICAgKiBFbHNlIHRoZXJlIGlzIG5vIGltYWdlIGRhdGEuCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQ7Cit9OworCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqCitpbnRlbF90ZXh0dXJlX29iamVjdChzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKm9iaikKK3sKKyAgIHJldHVybiAoc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICopIG9iajsKK30KKworc3RhdGljIElOTElORSBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqCitpbnRlbF90ZXh0dXJlX2ltYWdlKHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICppbWcpCit7CisgICByZXR1cm4gKHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICopIGltZzsKK30KKworI2VuZGlmIC8qIF9JTlRFTF9URVhfT0JKX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9zdWJpbWFnZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvaW50ZWxfdGV4X3N1YmltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyOGExZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF9zdWJpbWFnZS5jCkBAIC0wLDAgKzEsMTg2IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZXhvYmouaCIKKyNpbmNsdWRlICJ0ZXhzdG9yZS5oIgorI2luY2x1ZGUgInRleGNvbXByZXNzLmgiCisjaW5jbHVkZSAiZW51bXMuaCIKKworI2luY2x1ZGUgImludGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9taXBtYXBfdHJlZS5oIgorCisjZGVmaW5lIEZJTEVfREVCVUdfRkxBRyBERUJVR19URVhUVVJFCisKK3N0YXRpYyB2b2lkCitpbnRlbFRleFN1YmltYWdlKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgR0xpbnQgZGltcywKKyAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsCisgICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpCit7CisgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqaW50ZWwgPSBpbnRlbF9jb250ZXh0KGN0eCk7CisgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxJbWFnZSA9IGludGVsX3RleHR1cmVfaW1hZ2UodGV4SW1hZ2UpOworICAgR0x1aW50IGRzdFJvd1N0cmlkZSA9IDA7CisgICAKKyAgIERCRygiJXMgdGFyZ2V0ICVzIGxldmVsICVkIG9mZnNldCAlZCwlZCAlZHglZFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHRhcmdldCksCisgICAgICAgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQpOworCisgICBpbnRlbEZsdXNoKGN0eCk7CisKKyAgIHBpeGVscyA9CisgICAgICBfbWVzYV92YWxpZGF0ZV9wYm9fdGV4aW1hZ2UoY3R4LCBkaW1zLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHBpeGVscywgcGFja2luZywgImdsVGV4U3ViSW1hZ2UyRCIpOworICAgaWYgKCFwaXhlbHMpCisgICAgICByZXR1cm47CisKKyAgIExPQ0tfSEFSRFdBUkUoaW50ZWwpOworCisgICAvKiBNYXAgYnVmZmVyIGlmIG5lY2Vzc2FyeS4gIE5lZWQgdG8gbG9jayB0byBwcmV2ZW50IG90aGVyIGNvbnRleHRzCisgICAgKiBmcm9tIHVwbG9hZGluZyB0aGUgYnVmZmVyIHVuZGVyIHVzLgorICAgICovCisgICBpZiAoaW50ZWxJbWFnZS0+bXQpIAorICAgICAgdGV4SW1hZ2UtPkRhdGEgPSBpbnRlbF9taXB0cmVlX2ltYWdlX21hcChpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0Um93U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhJbWFnZS0+SW1hZ2VPZmZzZXRzKTsKKyAgIGVsc2UgeworICAgICAgaWYgKHRleEltYWdlLT5Jc0NvbXByZXNzZWQpIHsKKyAgICAgICAgIGRzdFJvd1N0cmlkZSA9CisgICAgICAgICAgICBfbWVzYV9jb21wcmVzc2VkX3Jvd19zdHJpZGUodGV4SW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCwgd2lkdGgpOworICAgICAgICAgYXNzZXJ0KGRpbXMgIT0gMyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGRzdFJvd1N0cmlkZSA9IHRleEltYWdlLT5Sb3dTdHJpZGUgKiB0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5UZXhlbEJ5dGVzOworICAgICAgfQorICAgfQorCisgICBhc3NlcnQoZHN0Um93U3RyaWRlKTsKKworICAgaWYgKCF0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5TdG9yZUltYWdlKGN0eCwgZGltcywgdGV4SW1hZ2UtPl9CYXNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleEltYWdlLT5UZXhGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4SW1hZ2UtPkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RSb3dTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4SW1hZ2UtPkltYWdlT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgcGFja2luZykpIHsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImludGVsVGV4U3ViSW1hZ2UiKTsKKyAgIH0KKworICAgLyogR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAgKi8KKyAgIGlmIChsZXZlbCA9PSB0ZXhPYmotPkJhc2VMZXZlbCAmJiB0ZXhPYmotPkdlbmVyYXRlTWlwbWFwKSB7CisgICAgICBpbnRlbF9nZW5lcmF0ZV9taXBtYXAoY3R4LCB0YXJnZXQsIHRleE9iaik7CisgICB9CisKKyAgIF9tZXNhX3VubWFwX3RleGltYWdlX3BibyhjdHgsIHBhY2tpbmcpOworCisgICBpZiAoaW50ZWxJbWFnZS0+bXQpIHsKKyAgICAgIGludGVsX21pcHRyZWVfaW1hZ2VfdW5tYXAoaW50ZWwsIGludGVsSW1hZ2UtPm10KTsKKyAgICAgIHRleEltYWdlLT5EYXRhID0gTlVMTDsKKyAgIH0KKworICAgVU5MT0NLX0hBUkRXQVJFKGludGVsKTsKK30KKworCisKKworCit2b2lkCitpbnRlbFRleFN1YkltYWdlM0QoR0xjb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKiBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSkKK3sKKworICAgaW50ZWxUZXhTdWJpbWFnZShjdHgsIDMsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscywgcGFja2luZywgdGV4T2JqLCB0ZXhJbWFnZSk7CisKK30KKworCisKK3ZvaWQKK2ludGVsVGV4U3ViSW1hZ2UyRChHTGNvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqIHBpeGVscywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQoreworCisgICBpbnRlbFRleFN1YmltYWdlKGN0eCwgMiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgeG9mZnNldCwgeW9mZnNldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UpOworCit9CisKKwordm9pZAoraW50ZWxUZXhTdWJJbWFnZTFEKEdMY29udGV4dCAqIGN0eCwKKyAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKiBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICpwYWNraW5nLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSkKK3sKKyAgIGludGVsVGV4U3ViaW1hZ2UoY3R4LCAxLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICB4b2Zmc2V0LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICB3aWR0aCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMsIHBhY2tpbmcsIHRleE9iaiwgdGV4SW1hZ2UpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfdmFsaWRhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL2ludGVsX3RleF92YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjNmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9pbnRlbF90ZXhfdmFsaWRhdGUuYwpAQCAtMCwwICsxLDMwMCBAQAorI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorCisjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKworI2RlZmluZSBGSUxFX0RFQlVHX0ZMQUcgREVCVUdfVEVYVFVSRQorCisvKioKKyAqIENvbXB1dGUgd2hpY2ggbWlwbWFwIGxldmVscyB0aGF0IHJlYWxseSBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIGhhcmR3YXJlLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBiYXNlIGltYWdlIHNpemUsIEdMX1RFWFRVUkVfTUlOX0xPRCwKKyAqIEdMX1RFWFRVUkVfTUFYX0xPRCwgR0xfVEVYVFVSRV9CQVNFX0xFVkVMLCBhbmQgR0xfVEVYVFVSRV9NQVhfTEVWRUwuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9jYWxjdWxhdGVfZmlyc3RfbGFzdF9sZXZlbChzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9vYmplY3QgKmludGVsT2JqKQoreworICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqID0gJmludGVsT2JqLT5iYXNlOworICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmNvbnN0IGJhc2VJbWFnZSA9CisgICAgICB0T2JqLT5JbWFnZVswXVt0T2JqLT5CYXNlTGV2ZWxdOworCisgICAvKiBUaGVzZSBtdXN0IGJlIHNpZ25lZCB2YWx1ZXMuICBNaW5Mb2QgYW5kIE1heExvZCBjYW4gYmUgbmVnYXRpdmUgbnVtYmVycywKKyAgICAqIGFuZCBoYXZpbmcgZmlyc3RMZXZlbCBhbmQgbGFzdExldmVsIGFzIHNpZ25lZCBwcmV2ZW50cyB0aGUgbmVlZCBmb3IKKyAgICAqIGV4dHJhIHNpZ24gY2hlY2tzLgorICAgICovCisgICBpbnQgZmlyc3RMZXZlbDsKKyAgIGludCBsYXN0TGV2ZWw7CisKKyAgIC8qIFllcywgdGhpcyBsb29rcyBvdmVybHkgY29tcGxpY2F0ZWQsIGJ1dCBpdCdzIGFsbCBuZWVkZWQuCisgICAgKi8KKyAgIHN3aXRjaCAodE9iai0+VGFyZ2V0KSB7CisgICBjYXNlIEdMX1RFWFRVUkVfMUQ6CisgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICBjYXNlIEdMX1RFWFRVUkVfM0Q6CisgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVA6CisgICAgICBpZiAodE9iai0+TWluRmlsdGVyID09IEdMX05FQVJFU1QgfHwgdE9iai0+TWluRmlsdGVyID09IEdMX0xJTkVBUikgeworICAgICAgICAgLyogR0xfTkVBUkVTVCBhbmQgR0xfTElORUFSIG9ubHkgY2FyZSBhYm91dCBHTF9URVhUVVJFX0JBU0VfTEVWRUwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGZpcnN0TGV2ZWwgPSBsYXN0TGV2ZWwgPSB0T2JqLT5CYXNlTGV2ZWw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyNpZmRlZiBJOTE1CisgICAgICAgICBmaXJzdExldmVsID0gdE9iai0+QmFzZUxldmVsICsgKEdMaW50KSAodE9iai0+TWluTG9kICsgMC41KTsKKyAgICAgICAgIGZpcnN0TGV2ZWwgPSBNQVgyKGZpcnN0TGV2ZWwsIHRPYmotPkJhc2VMZXZlbCk7CisgICAgICAgICBmaXJzdExldmVsID0gTUlOMihmaXJzdExldmVsLCB0T2JqLT5CYXNlTGV2ZWwgKyBiYXNlSW1hZ2UtPk1heExvZzIpOworICAgICAgICAgbGFzdExldmVsID0gdE9iai0+QmFzZUxldmVsICsgKEdMaW50KSAodE9iai0+TWF4TG9kICsgMC41KTsKKyAgICAgICAgIGxhc3RMZXZlbCA9IE1BWDIobGFzdExldmVsLCB0T2JqLT5CYXNlTGV2ZWwpOworICAgICAgICAgbGFzdExldmVsID0gTUlOMihsYXN0TGV2ZWwsIHRPYmotPkJhc2VMZXZlbCArIGJhc2VJbWFnZS0+TWF4TG9nMik7CisgICAgICAgICBsYXN0TGV2ZWwgPSBNSU4yKGxhc3RMZXZlbCwgdE9iai0+TWF4TGV2ZWwpOworICAgICAgICAgbGFzdExldmVsID0gTUFYMihmaXJzdExldmVsLCBsYXN0TGV2ZWwpOyAgICAgICAvKiBuZWVkIGF0IGxlYXN0IG9uZSBsZXZlbCAqLworI2Vsc2UKKwkgLyogQ3VycmVudGx5IG5vdCB0YWtpbmcgbWluL21heCBsb2QgaW50byBhY2NvdW50IGhlcmUsIHRob3NlCisJICAqIHZhbHVlcyBhcmUgcHJvZ3JhbW1lZCBhcyBzYW1wbGVyIHN0YXRlIGVsc2V3aGVyZSBhbmQgd2UKKwkgICogdXBsb2FkIHRoZSBzYW1lIG1pcG1hcCBsZXZlbHMgcmVnYXJkbGVzcy4gIE5vdCBzdXJlIGlmCisJICAqIHRoaXMgbWFrZXMgc2Vuc2UgYXMgaXQgbWVhbnMgaXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBhcHAKKwkgICogdG8gdXNlIG1pbi9tYXggbG9kIHRvIHJlZHVjZSB0ZXh0dXJlIG1lbW9yeSBwcmVzc3VyZToKKwkgICovCisJIGZpcnN0TGV2ZWwgPSB0T2JqLT5CYXNlTGV2ZWw7CisJIGxhc3RMZXZlbCA9IE1JTjIodE9iai0+QmFzZUxldmVsICsgYmFzZUltYWdlLT5NYXhMb2cyLAorCQkJICB0T2JqLT5NYXhMZXZlbCk7CisJIGxhc3RMZXZlbCA9IE1BWDIoZmlyc3RMZXZlbCwgbGFzdExldmVsKTsgLyogbmVlZCBhdCBsZWFzdCBvbmUgbGV2ZWwgKi8KKyNlbmRpZgorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WOgorICAgY2FzZSBHTF9URVhUVVJFXzREX1NHSVM6CisgICAgICBmaXJzdExldmVsID0gbGFzdExldmVsID0gMDsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogc2F2ZSB0aGVzZSB2YWx1ZXMgKi8KKyAgIGludGVsT2JqLT5maXJzdExldmVsID0gZmlyc3RMZXZlbDsKKyAgIGludGVsT2JqLT5sYXN0TGV2ZWwgPSBsYXN0TGV2ZWw7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBpbWFnZSdzIGNvbnRlbnRzIGF0IGl0cyBsZXZlbCBpbnRvIHRoZSBvYmplY3QncyBtaXB0cmVlLAorICogYW5kIHVwZGF0ZXMgdGhlIGltYWdlIHRvIHBvaW50IGF0IHRoZSBvYmplY3QncyBtaXB0cmVlLgorICovCitzdGF0aWMgdm9pZAorY29weV9pbWFnZV9kYXRhX3RvX3RyZWUoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICppbnRlbEltYWdlKQoreworICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisgICAgICAvKiBDb3B5IHBvdGVudGlhbGx5IHdpdGggdGhlIGJsaXR0ZXI6CisgICAgICAgKi8KKyAgICAgIGludGVsX21pcHRyZWVfaW1hZ2VfY29weShpbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbE9iai0+bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+ZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5sZXZlbCwgaW50ZWxJbWFnZS0+bXQpOworCisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbEltYWdlLT5tdCk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGFzc2VydChpbnRlbEltYWdlLT5iYXNlLkRhdGEgIT0gTlVMTCk7CisKKyAgICAgIC8qIE1vcmUgc3RyYWlnaHRmb3J3YXJkIHVwbG9hZC4gIAorICAgICAgICovCisgICAgICBpbnRlbF9taXB0cmVlX2ltYWdlX2RhdGEoaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxPYmotPm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+bGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxJbWFnZS0+YmFzZS5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmJhc2UuUm93U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsSW1hZ2UtPmJhc2UuUm93U3RyaWRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbEltYWdlLT5iYXNlLkhlaWdodCk7CisgICAgICBfbWVzYV9hbGlnbl9mcmVlKGludGVsSW1hZ2UtPmJhc2UuRGF0YSk7CisgICAgICBpbnRlbEltYWdlLT5iYXNlLkRhdGEgPSBOVUxMOworICAgfQorCisgICBpbnRlbF9taXB0cmVlX3JlZmVyZW5jZSgmaW50ZWxJbWFnZS0+bXQsIGludGVsT2JqLT5tdCk7Cit9CisKKworLyogIAorICovCitHTHVpbnQKK2ludGVsX2ZpbmFsaXplX21pcG1hcF90cmVlKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwgR0x1aW50IHVuaXQpCit7CisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPSBpbnRlbC0+Y3R4LlRleHR1cmUuVW5pdFt1bml0XS5fQ3VycmVudDsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX29iamVjdCAqaW50ZWxPYmogPSBpbnRlbF90ZXh0dXJlX29iamVjdCh0T2JqKTsKKyAgIGludCBjb21wX2J5dGUgPSAwOworICAgaW50IGNwcDsKKyAgIEdMdWludCBmYWNlLCBpOworICAgR0x1aW50IG5yX2ZhY2VzID0gMDsKKyAgIHN0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlICpmaXJzdEltYWdlOworCisgICAvKiBXZSBrbm93L3JlcXVpcmUgdGhpcyBpcyB0cnVlIGJ5IG5vdzogCisgICAgKi8KKyAgIGFzc2VydChpbnRlbE9iai0+YmFzZS5fQ29tcGxldGUpOworCisgICAvKiBXaGF0IGxldmVscyBtdXN0IHRoZSB0cmVlIGluY2x1ZGUgYXQgYSBtaW5pbXVtPworICAgICovCisgICBpbnRlbF9jYWxjdWxhdGVfZmlyc3RfbGFzdF9sZXZlbChpbnRlbE9iaik7CisgICBmaXJzdEltYWdlID0KKyAgICAgIGludGVsX3RleHR1cmVfaW1hZ2UoaW50ZWxPYmotPmJhc2UuSW1hZ2VbMF1baW50ZWxPYmotPmZpcnN0TGV2ZWxdKTsKKworICAgLyogRmFsbGJhY2sgY2FzZToKKyAgICAqLworICAgaWYgKGZpcnN0SW1hZ2UtPmJhc2UuQm9yZGVyIHx8CisgICAgICAgKChmaXJzdEltYWdlLT5iYXNlLl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCkgJiYKKyAgICAgICAgKCh0T2JqLT5XcmFwUyA9PSBHTF9DTEFNUF9UT19CT1JERVIpIHx8CisgICAgICAgICAodE9iai0+V3JhcFQgPT0gR0xfQ0xBTVBfVE9fQk9SREVSKSkpKSB7CisgICAgICBpZiAoaW50ZWxPYmotPm10KSB7CisgICAgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworICAgICAgfQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisKKyAgIC8qIElmIGJvdGggZmlyc3RJbWFnZSBhbmQgaW50ZWxPYmogaGF2ZSBhIHRyZWUgd2hpY2ggY2FuIGNvbnRhaW4KKyAgICAqIGFsbCBhY3RpdmUgaW1hZ2VzLCBmYXZvdXIgZmlyc3RJbWFnZS4gIE5vdGUgdGhhdCBiZWNhdXNlIG9mIHRoZQorICAgICogY29tcGxldGVuZXNzIHJlcXVpcmVtZW50LCB3ZSBrbm93IHRoYXQgdGhlIGltYWdlIGRpbWVuc2lvbnMKKyAgICAqIHdpbGwgbWF0Y2guCisgICAgKi8KKyAgIGlmIChmaXJzdEltYWdlLT5tdCAmJgorICAgICAgIGZpcnN0SW1hZ2UtPm10ICE9IGludGVsT2JqLT5tdCAmJgorICAgICAgIGZpcnN0SW1hZ2UtPm10LT5maXJzdF9sZXZlbCA8PSBpbnRlbE9iai0+Zmlyc3RMZXZlbCAmJgorICAgICAgIGZpcnN0SW1hZ2UtPm10LT5sYXN0X2xldmVsID49IGludGVsT2JqLT5sYXN0TGV2ZWwpIHsKKworICAgICAgaWYgKGludGVsT2JqLT5tdCkKKyAgICAgICAgIGludGVsX21pcHRyZWVfcmVsZWFzZShpbnRlbCwgJmludGVsT2JqLT5tdCk7CisKKyAgICAgIGludGVsX21pcHRyZWVfcmVmZXJlbmNlKCZpbnRlbE9iai0+bXQsIGZpcnN0SW1hZ2UtPm10KTsKKyAgIH0KKworICAgaWYgKGZpcnN0SW1hZ2UtPmJhc2UuSXNDb21wcmVzc2VkKSB7CisgICAgICBjb21wX2J5dGUgPSBpbnRlbF9jb21wcmVzc2VkX251bV9ieXRlcyhmaXJzdEltYWdlLT5iYXNlLlRleEZvcm1hdC0+TWVzYUZvcm1hdCk7CisgICAgICBjcHAgPSBjb21wX2J5dGU7CisgICB9CisgICBlbHNlIGNwcCA9IGZpcnN0SW1hZ2UtPmJhc2UuVGV4Rm9ybWF0LT5UZXhlbEJ5dGVzOworCisgICAvKiBDaGVjayB0cmVlIGNhbiBob2xkIGFsbCBhY3RpdmUgbGV2ZWxzLiAgQ2hlY2sgdHJlZSBtYXRjaGVzCisgICAgKiB0YXJnZXQsIGltYWdlRm9ybWF0LCBldGMuCisgICAgKiAKKyAgICAqIFhYWDogRm9yIHNvbWUgbGF5b3V0cyAoZWcgaTk0NT8pLCB0aGUgdGVzdCBtaWdodCBoYXZlIHRvIGJlCisgICAgKiBmaXJzdF9sZXZlbCA9PSBmaXJzdExldmVsLCBhcyB0aGUgdHJlZSBpc24ndCB2YWxpZCBleGNlcHQgYXQgdGhlCisgICAgKiBvcmlnaW5hbCBzdGFydCBsZXZlbC4gIEhvcGUgdG8gZ2V0IGFyb3VuZCB0aGlzIGJ5CisgICAgKiBwcm9ncmFtbWluZyBtaW5Mb2QsIG1heExvZCwgYmFzZUxldmVsIGludG8gdGhlIGhhcmR3YXJlIGFuZAorICAgICogbGVhdmluZyB0aGUgdHJlZSBhbG9uZS4KKyAgICAqLworICAgaWYgKGludGVsT2JqLT5tdCAmJgorICAgICAgIChpbnRlbE9iai0+bXQtPnRhcmdldCAhPSBpbnRlbE9iai0+YmFzZS5UYXJnZXQgfHwKKwlpbnRlbE9iai0+bXQtPmludGVybmFsX2Zvcm1hdCAhPSBmaXJzdEltYWdlLT5iYXNlLkludGVybmFsRm9ybWF0IHx8CisJaW50ZWxPYmotPm10LT5maXJzdF9sZXZlbCAhPSBpbnRlbE9iai0+Zmlyc3RMZXZlbCB8fAorCWludGVsT2JqLT5tdC0+bGFzdF9sZXZlbCAhPSBpbnRlbE9iai0+bGFzdExldmVsIHx8CisJaW50ZWxPYmotPm10LT53aWR0aDAgIT0gZmlyc3RJbWFnZS0+YmFzZS5XaWR0aCB8fAorCWludGVsT2JqLT5tdC0+aGVpZ2h0MCAhPSBmaXJzdEltYWdlLT5iYXNlLkhlaWdodCB8fAorCWludGVsT2JqLT5tdC0+ZGVwdGgwICE9IGZpcnN0SW1hZ2UtPmJhc2UuRGVwdGggfHwKKwlpbnRlbE9iai0+bXQtPmNwcCAhPSBjcHAgfHwKKwlpbnRlbE9iai0+bXQtPmNvbXByZXNzZWQgIT0gZmlyc3RJbWFnZS0+YmFzZS5Jc0NvbXByZXNzZWQpKSB7CisgICAgICBpbnRlbF9taXB0cmVlX3JlbGVhc2UoaW50ZWwsICZpbnRlbE9iai0+bXQpOworICAgfQorCisKKyAgIC8qIE1heSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB0cmVlOgorICAgICovCisgICBpZiAoIWludGVsT2JqLT5tdCkgeworICAgICAgaW50ZWxPYmotPm10ID0gaW50ZWxfbWlwdHJlZV9jcmVhdGUoaW50ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbE9iai0+YmFzZS5UYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEltYWdlLT5iYXNlLkludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxPYmotPmZpcnN0TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbE9iai0+bGFzdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbWFnZS0+YmFzZS5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW1hZ2UtPmJhc2UuSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbWFnZS0+YmFzZS5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfYnl0ZSk7CisgICB9CisKKyAgIC8qIFB1bGwgaW4gYW55IGltYWdlcyBub3QgaW4gdGhlIG9iamVjdCdzIHRyZWU6CisgICAgKi8KKyAgIG5yX2ZhY2VzID0gKGludGVsT2JqLT5iYXNlLlRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQKSA/IDYgOiAxOworICAgZm9yIChmYWNlID0gMDsgZmFjZSA8IG5yX2ZhY2VzOyBmYWNlKyspIHsKKyAgICAgIGZvciAoaSA9IGludGVsT2JqLT5maXJzdExldmVsOyBpIDw9IGludGVsT2JqLT5sYXN0TGV2ZWw7IGkrKykgeworICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UgKmludGVsSW1hZ2UgPQorICAgICAgICAgICAgaW50ZWxfdGV4dHVyZV9pbWFnZShpbnRlbE9iai0+YmFzZS5JbWFnZVtmYWNlXVtpXSk7CisKKyAgICAgICAgIC8qIE5lZWQgdG8gaW1wb3J0IGltYWdlcyBpbiBtYWluIG1lbW9yeSBvciBoZWxkIGluIG90aGVyIHRyZWVzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoaW50ZWxPYmotPm10ICE9IGludGVsSW1hZ2UtPm10KSB7CisgICAgICAgICAgICBjb3B5X2ltYWdlX2RhdGFfdG9fdHJlZShpbnRlbCwgaW50ZWxPYmosIGludGVsSW1hZ2UpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gR0xfVFJVRTsKK30KKwordm9pZAoraW50ZWxfdGV4X21hcF9sZXZlbF9pbWFnZXMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorCQkJICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiwKKwkJCSAgIGludCBsZXZlbCkKK3sKKyAgIEdMdWludCBucl9mYWNlcyA9IChpbnRlbE9iai0+YmFzZS5UYXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUCkgPyA2IDogMTsKKyAgIEdMdWludCBmYWNlOworCisgICBmb3IgKGZhY2UgPSAwOyBmYWNlIDwgbnJfZmFjZXM7IGZhY2UrKykgeworICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UgKmludGVsSW1hZ2UgPQorCSBpbnRlbF90ZXh0dXJlX2ltYWdlKGludGVsT2JqLT5iYXNlLkltYWdlW2ZhY2VdW2xldmVsXSk7CisKKyAgICAgIGlmIChpbnRlbEltYWdlLT5tdCkgeworCSBpbnRlbEltYWdlLT5iYXNlLkRhdGEgPQorCSAgICBpbnRlbF9taXB0cmVlX2ltYWdlX21hcChpbnRlbCwKKwkJCQkgICAgaW50ZWxJbWFnZS0+bXQsCisJCQkJICAgIGludGVsSW1hZ2UtPmZhY2UsCisJCQkJICAgIGludGVsSW1hZ2UtPmxldmVsLAorCQkJCSAgICAmaW50ZWxJbWFnZS0+YmFzZS5Sb3dTdHJpZGUsCisJCQkJICAgIGludGVsSW1hZ2UtPmJhc2UuSW1hZ2VPZmZzZXRzKTsKKwkgLyogY29udmVydCBzdHJpZGUgdG8gdGV4ZWxzLCBub3QgYnl0ZXMgKi8KKwkgaW50ZWxJbWFnZS0+YmFzZS5Sb3dTdHJpZGUgLz0gaW50ZWxJbWFnZS0+bXQtPmNwcDsKKwkgLyogaW50ZWxJbWFnZS0+YmFzZS5JbWFnZVN0cmlkZSAvPSBpbnRlbEltYWdlLT5tdC0+Y3BwOyAqLworICAgICAgfQorICAgfQorfQorCit2b2lkCitpbnRlbF90ZXhfdW5tYXBfbGV2ZWxfaW1hZ2VzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKwkJCSAgICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaiwKKwkJCSAgICAgaW50IGxldmVsKQoreworICAgR0x1aW50IG5yX2ZhY2VzID0gKGludGVsT2JqLT5iYXNlLlRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQKSA/IDYgOiAxOworICAgR0x1aW50IGZhY2U7CisKKyAgIGZvciAoZmFjZSA9IDA7IGZhY2UgPCBucl9mYWNlczsgZmFjZSsrKSB7CisgICAgICBzdHJ1Y3QgaW50ZWxfdGV4dHVyZV9pbWFnZSAqaW50ZWxJbWFnZSA9CisJIGludGVsX3RleHR1cmVfaW1hZ2UoaW50ZWxPYmotPmJhc2UuSW1hZ2VbZmFjZV1bbGV2ZWxdKTsKKworICAgICAgaWYgKGludGVsSW1hZ2UtPm10KSB7CisJIGludGVsX21pcHRyZWVfaW1hZ2VfdW5tYXAoaW50ZWwsIGludGVsSW1hZ2UtPm10KTsKKwkgaW50ZWxJbWFnZS0+YmFzZS5EYXRhID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAoraW50ZWxfdGV4X21hcF9pbWFnZXMoc3RydWN0IGludGVsX2NvbnRleHQgKmludGVsLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaikKK3sKKyAgIGludCBpOworCisgICBEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICBmb3IgKGkgPSBpbnRlbE9iai0+Zmlyc3RMZXZlbDsgaSA8PSBpbnRlbE9iai0+bGFzdExldmVsOyBpKyspCisgICAgICBpbnRlbF90ZXhfbWFwX2xldmVsX2ltYWdlcyhpbnRlbCwgaW50ZWxPYmosIGkpOworfQorCit2b2lkCitpbnRlbF90ZXhfdW5tYXBfaW1hZ2VzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbE9iaikKK3sKKyAgIGludCBpOworCisgICBmb3IgKGkgPSBpbnRlbE9iai0+Zmlyc3RMZXZlbDsgaSA8PSBpbnRlbE9iai0+bGFzdExldmVsOyBpKyspCisgICAgICBpbnRlbF90ZXhfdW5tYXBfbGV2ZWxfaW1hZ2VzKGludGVsLCBpbnRlbE9iaiwgaSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9zZXJ2ZXIvaTgzMF9kcmkuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL3NlcnZlci9pODMwX2RyaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjA0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9zZXJ2ZXIvaTgzMF9kcmkuaApAQCAtMCwwICsxLDYyIEBACisvKiAkWEZyZWU4NjogeGMvcHJvZ3JhbXMvWHNlcnZlci9ody94ZnJlZTg2L2RyaXZlcnMvaTgxMC9pODMwX2RyaS5oLHYgMS42IDIwMDMvMDkvMjggMjA6MTU6NTkgYWxhbmggRXhwICQgKi8KKworI2lmbmRlZiBfSTgzMF9EUklfSAorI2RlZmluZSBfSTgzMF9EUklfSAorCisjaW5jbHVkZSAieGY4NmRybS5oIgorCisjZGVmaW5lIEk4MzBfTUFYX0RSQVdBQkxFUyAyNTYKKworI2RlZmluZSBJODMwX01BSk9SX1ZFUlNJT04gMQorI2RlZmluZSBJODMwX01JTk9SX1ZFUlNJT04gOQorI2RlZmluZSBJODMwX1BBVENITEVWRUwgMAorCisjZGVmaW5lIEk4MzBfUkVHX1NJWkUgMHg4MDAwMAorCit0eXBlZGVmIHN0cnVjdCBfSTgzMERSSVJlYyB7CisgICBkcm1faGFuZGxlX3QgcmVnczsKKyAgIGRybVNpemUgcmVnc1NpemU7CisKKyAgIGRybVNpemUgdW51c2VkMTsgLyogYmFja2J1ZmZlclNpemUgKi8KKyAgIGRybV9oYW5kbGVfdCB1bnVzZWQyOyAvKiBiYWNrYnVmZmVyICovCisKKyAgIGRybVNpemUgdW51c2VkMzsgLyogZGVwdGhidWZmZXJTaXplICovCisgICBkcm1faGFuZGxlX3QgdW51c2VkNDsgLyogZGVwdGhidWZmZXIgKi8KKworICAgZHJtU2l6ZSB1bnVzZWQ1OyAvKiByb3RhdGVkU2l6ZSAqLworICAgZHJtX2hhbmRsZV90IHVudXNlZDY7IC8qIHJvdGF0ZWRidWZmZXIgKi8KKworICAgZHJtX2hhbmRsZV90IHVudXNlZDc7IC8qIHRleHR1cmVzICovCisgICBpbnQgdW51c2VkODsgLyogdGV4dHVyZVNpemUgKi8KKworICAgZHJtX2hhbmRsZV90IHVudXNlZDk7IC8qIGFncF9idWZmZXJzICovCisgICBkcm1TaXplIHVudXNlZDEwOyAvKiBhZ3BfYnVmX3NpemUgKi8KKworICAgaW50IGRldmljZUlEOworICAgaW50IHdpZHRoOworICAgaW50IGhlaWdodDsKKyAgIGludCBtZW07CisgICBpbnQgY3BwOworICAgaW50IGJpdHNQZXJQaXhlbDsKKworICAgaW50IHVudXNlZDExWzhdOyAvKiB3YXMgZnJvbnQvYmFjay9kZXB0aC9yb3RhdGVkIG9mZnNldC9waXRjaCAqLworCisgICBpbnQgdW51c2VkMTI7IC8qIGxvZ1RleHR1cmVHcmFudWxhcml0eSAqLworICAgaW50IHVudXNlZDEzOyAvKiB0ZXh0dXJlT2Zmc2V0ICovCisKKyAgIGludCBpcnE7CisgICBpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7Cit9IEk4MzBEUklSZWMsICpJODMwRFJJUHRyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAvKiBOb3RoaW5nIGhlcmUgeWV0ICovCisgICBpbnQgZHVtbXk7Cit9IEk4MzBDb25maWdQcml2UmVjLCAqSTgzMENvbmZpZ1ByaXZQdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIC8qIE5vdGhpbmcgaGVyZSB5ZXQgKi8KKyAgIGludCBkdW1teTsKK30gSTgzMERSSUNvbnRleHRSZWMsICpJODMwRFJJQ29udGV4dFB0cjsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvc2VydmVyL2ludGVsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9zZXJ2ZXIvaW50ZWwuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbC5oCnJlbmFtZSB0byBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pbnRlbC9zZXJ2ZXIvaW50ZWwuaAppbmRleCBkNzg1OGEyLi42ZWE3MjQ5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL3NlcnZlci9pbnRlbC5oCkBAIC03NSw2ICs3NSw5IEBACiAKICNkZWZpbmUgSTgzMF9HTUNIX0NUUkwJCTB4NTIKIAorI2RlZmluZSBJODMwX0dNQ0hfTUVNX01BU0sgICAgICAweDEKKyNkZWZpbmUgSTgzMF9HTUNIX01FTV82NE0gICAgICAgMHgxCisjZGVmaW5lIEk4MzBfR01DSF9NRU1fMTI4TSAgICAgIDAKIAogI2RlZmluZSBJODMwX0dNQ0hfR01TX01BU0sJCQkweDcwCiAjZGVmaW5lIEk4MzBfR01DSF9HTVNfRElTQUJMRUQJCTB4MDAKQEAgLTE0MSw3ICsxNDQsNyBAQAogICAgdW5zaWduZWQgY2hhciAqTU1JT0Jhc2U7CiAgICB1bnNpZ25lZCBjaGFyICpGYkJhc2U7CiAgICBpbnQgY3BwOwotCisgICB1aW50MzJfdCBhcGVyX3NpemU7CiAgICB1bnNpZ25lZCBpbnQgYmlvc192ZXJzaW9uOwogCiAgICAvKiBUaGVzZSBhcmUgc2V0IGluIFByZUluaXQgYW5kIG5ldmVyIGNoYW5nZWQuICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbF9kcmkuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL3NlcnZlci9pbnRlbF9kcmkuYwpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9pOTE1L3NlcnZlci9pbnRlbF9kcmkuYwpyZW5hbWUgdG8gc3JjL21lc2EvZHJpdmVycy9kcmkvaW50ZWwvc2VydmVyL2ludGVsX2RyaS5jCmluZGV4IGI2OTQ2YjcuLmU0OWM0MjEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2k5MTUvc2VydmVyL2ludGVsX2RyaS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL2ludGVsL3NlcnZlci9pbnRlbF9kcmkuYwpAQCAtMjkyLDE1ICsyOTIsNDMgQEAKIAogc3RhdGljIGludCBJODMwRGV0ZWN0TWVtb3J5KGNvbnN0IERSSURyaXZlckNvbnRleHQgKmN0eCwgSTgzMFJlYyAqcEk4MzApCiB7Ci0gIHN0cnVjdCBwY2lfZGV2aWNlIGhvc3RfYnJpZGdlOworICBzdHJ1Y3QgcGNpX2RldmljZSBob3N0X2JyaWRnZSwgaWdfZGV2OwogICB1aW50MzJfdCBnbWNoX2N0cmw7CiAgIGludCBtZW1zaXplID0gMDsKICAgaW50IHJhbmdlOwotCisgIHVpbnQzMl90IGFwZXJfc2l6ZTsKKyAgdWludDMyX3QgbWVtYmFzZTIgPSAwOworICAgICAgCiAgIG1lbXNldCgmaG9zdF9icmlkZ2UsIDAsIHNpemVvZihob3N0X2JyaWRnZSkpOworICBtZW1zZXQoJmlnX2RldiwgMCwgc2l6ZW9mKGlnX2RldikpOworCisgIGlnX2Rldi5kZXYgPSAyOwogCiAgIHBjaV9kZXZpY2VfY2ZnX3JlYWRfdTMyKCZob3N0X2JyaWRnZSwgJmdtY2hfY3RybCwgSTgzMF9HTUNIX0NUUkwpOwotICAKKworICBpZiAoSVNfSTgzMChwSTgzMCkgfHwgSVNfODQ1RyhwSTgzMCkpIHsKKyAgICBpZiAoKGdtY2hfY3RybCAmIEk4MzBfR01DSF9NRU1fTUFTSykgPT0gSTgzMF9HTUNIX01FTV8xMjhNKSB7CisgICAgICBhcGVyX3NpemUgPSAweDgwMDAwMDAwOworICAgIH0gZWxzZSB7CisgICAgICBhcGVyX3NpemUgPSAweDQwMDAwMDAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoSVNfSTlYWChwSTgzMCkpIHsKKyAgICAgIGludCByZXQ7CisgICAgICByZXQgPSBwY2lfZGV2aWNlX2NmZ19yZWFkX3UzMigmaWdfZGV2LCAmbWVtYmFzZTIsIDB4MTgpOworICAgICAgaWYgKG1lbWJhc2UyICYgMHgwODAwMDAwMCkKKwlhcGVyX3NpemUgPSAweDgwMDAwMDA7CisgICAgICBlbHNlCisJYXBlcl9zaXplID0gMHgxMDAwMDAwMDsKKworICAgICAgZnByaW50ZihzdGRlcnIsImFwZXIgc2l6ZSBpcyAlMDhYICUwOHggJWRcbiIsIGFwZXJfc2l6ZSwgbWVtYmFzZTIsIHJldCk7CisgICAgfSBlbHNlCisgICAgICBhcGVyX3NpemUgPSAweDgwMDAwMDA7CisgIH0KKworICBwSTgzMC0+YXBlcl9zaXplID0gYXBlcl9zaXplOworCisKICAgLyogV2UgbmVlZCB0byByZWR1Y2UgdGhlIHN0b2xlbiBzaXplLCBieSB0aGUgR1RUIGFuZCB0aGUgcG9wdXAuCiAgICAqIFRoZSBHVFQgdmFyeWluZyBhY2NvcmRpbmcgdGhlIHRoZSBGYk1hcFNpemUgYW5kIHRoZSBwb3B1cCBpcyA0S0IgKi8KICAgcmFuZ2UgPSAoY3R4LT5zaGFyZWQuZmJTaXplIC8gKDEwMjQqMTAyNCkpICsgNDsKQEAgLTU3Nyw3ICs2MDUsOCBAQAogICAgIGZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCBidWZmZXIgJWxkXG4iLCByZXQpOwogICAgIHJldHVybiBGQUxTRTsKICAgfQotICAKKworI2lmIDAgIAogICBtZW1zZXQoJihwSTgzMC0+VGV4TWVtKSwgMCwgc2l6ZW9mKHBJODMwLT5UZXhNZW0pKTsKICAgcEk4MzAtPlRleE1lbS5LZXkgPSAtMTsKIApAQCAtNTg4LDYgKzYxNyw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsInVuYWJsZSB0byBhbGxvY2F0ZSB0ZXh0dXJlIG1lbW9yeSAlbGRcbiIsIHJldCk7CiAgICAgcmV0dXJuIEZBTFNFOwogICB9CisjZW5kaWYKIAogICByZXR1cm4gVFJVRTsKIH0KQEAgLTYwNSwxMiArNjM1LDI5IEBACiAgICAgcmV0dXJuIEZBTFNFOwogICBpZiAoIUJpbmRBZ3BSYW5nZShjdHgsICZwSTgzMC0+Q29udGV4dE1lbSkpCiAgICAgcmV0dXJuIEZBTFNFOworI2lmIDAKICAgaWYgKCFCaW5kQWdwUmFuZ2UoY3R4LCAmcEk4MzAtPlRleE1lbSkpCiAgICAgcmV0dXJuIEZBTFNFOwotCisjZW5kaWYKICAgcmV0dXJuIFRSVUU7CiB9CiAKK3N0YXRpYyB2b2lkIFNldHVwRFJJTU0oY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCkKK3sKKyAgdW5zaWduZWQgbG9uZyBhcGVyRW5kID0gUk9VTkRfRE9XTl9UTyhwSTgzMC0+YXBlcl9zaXplLCBHVFRfUEFHRV9TSVpFKSAvIEdUVF9QQUdFX1NJWkU7CisgIHVuc2lnbmVkIGxvbmcgYXBlclN0YXJ0ID0gUk9VTkRfVE8ocEk4MzAtPmFwZXJfc2l6ZSAtIEtCKDMyNzY4KSwgR1RUX1BBR0VfU0laRSkgLyBHVFRfUEFHRV9TSVpFOworCisgIGZwcmludGYoc3RkZXJyLCAiYXBlciBzaXplIGlzICUwOFhcbiIsIGN0eC0+c2hhcmVkLmZiU2l6ZSk7CisgIGlmIChkcm1NTUluaXQoY3R4LT5kcm1GRCwgYXBlclN0YXJ0LCBhcGVyRW5kIC0gYXBlclN0YXJ0LCBEUk1fQk9fTUVNX1RUKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsCisJICAgICAgIkRSTSBNTSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAiRFJNIE1NIEluaXRpYWxpemVkIGF0IG9mZnNldCAweCVseCBsZW5ndGggJWQgcGFnZVxuIiwgYXBlclN0YXJ0LCBhcGVyRW5kLWFwZXJTdGFydCk7CisgIH0KKworfQorCiBzdGF0aWMgQm9vbAogSTgzMENsZWFudXBEbWEoY29uc3QgRFJJRHJpdmVyQ29udGV4dCAqY3R4KQogewpAQCAtODEwLDYgKzg1Nyw3IEBACiAgICBmcHJpbnRmKHN0ZGVyciwgIltkcm1dIERlcHRoIEJ1ZmZlciA9IDB4JTA4eFxuIiwKICAgICAgICAgICAgICAgc2FyZWEtPmRlcHRoX2hhbmRsZSk7CiAKKyNpZiAwCiAgICBpZiAoZHJtQWRkTWFwKGN0eC0+ZHJtRkQsCiAJCSAoZHJtX2hhbmRsZV90KXNhcmVhLT50ZXhfb2Zmc2V0LAogCQkgc2FyZWEtPnRleF9zaXplLCBEUk1fQUdQLCAwLApAQCAtODIwLDcgKzg2OCw3IEBACiAgICB9CiAgICBmcHJpbnRmKHN0ZGVyciwgIltkcm1dIHRleHR1cmVzID0gMHglMDh4XG4iLAogCSAgICAgIHNhcmVhLT50ZXhfaGFuZGxlKTsKLQorI2VuZGlmCiAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtODQ4LDI5ICs4OTYsNiBAQAogICAgfQogfQogCi1zdGF0aWMgdm9pZAotSTgzMEluaXRUZXh0dXJlSGVhcChjb25zdCBEUklEcml2ZXJDb250ZXh0ICpjdHgsIEk4MzBSZWMgKnBJODMwLCBkcm1JODMwU2FyZWEgKnNhcmVhKQotewotICAgLyogU3RhcnQgdXAgdGhlIHNpbXBsZSBtZW1vcnkgbWFuYWdlciBmb3IgYWdwIHNwYWNlICovCi0gICBkcm1JODMwTWVtSW5pdEhlYXAgZHJtSGVhcDsKLSAgIGRybUhlYXAucmVnaW9uID0gSTgzMF9NRU1fUkVHSU9OX0FHUDsKLSAgIGRybUhlYXAuc3RhcnQgID0gMDsKLSAgIGRybUhlYXAuc2l6ZSAgID0gc2FyZWEtPnRleF9zaXplOwotICAgICAgCi0gICBpZiAoZHJtQ29tbWFuZFdyaXRlKGN0eC0+ZHJtRkQsIERSTV9JODMwX0lOSVRfSEVBUCwKLQkJCSAgJmRybUhlYXAsIHNpemVvZihkcm1IZWFwKSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotCQkgICAgIltkcm1dIEZhaWxlZCB0byBpbml0aWFsaXplZCBhZ3AgaGVhcCBtYW5hZ2VyXG4iKTsKLSAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJbZHJtXSBJbml0aWFsaXplZCBrZXJuZWwgYWdwIGhlYXAgbWFuYWdlciwgJWRcbiIsCi0JCSAgICBzYXJlYS0+dGV4X3NpemUpOwotCi0gICAgICBJODMwU2V0UGFyYW0oY3R4LCBJODMwX1NFVFBBUkFNX1RFWF9MUlVfTE9HX0dSQU5VTEFSSVRZLCAKLQkJICAgICAgc2FyZWEtPmxvZ190ZXhfZ3JhbnVsYXJpdHkpOwotICAgfQotfQotCiBzdGF0aWMgQm9vbAogSTgzMERSSURvTWFwcGluZ3MoRFJJRHJpdmVyQ29udGV4dCAqY3R4LCBJODMwUmVjICpwSTgzMCwgZHJtSTgzMFNhcmVhICpzYXJlYSkKIHsKQEAgLTg5Miw3ICs5MTcsNyBAQAogICAgLyogaW5pdCB0byB6ZXJvIHRvIGJlIHNhZmUgKi8KIAogICBJODMwRFJJTWFwU2NyZWVuUmVnaW9ucyhjdHgsIHBJODMwLCBzYXJlYSk7Ci0gIEk4MzBJbml0VGV4dHVyZUhlYXAoY3R4LCBwSTgzMCwgc2FyZWEpOworICBTZXR1cERSSU1NKGN0eCwgcEk4MzApOwogCiAgICBpZiAoY3R4LT5wY2lEZXZpY2UgIT0gUENJX0NISVBfODQ1X0cgJiYKICAgICAgICBjdHgtPnBjaURldmljZSAhPSBQQ0lfQ0hJUF9JODMwX00pIHsKQEAgLTEwODQsNiArMTEwOSwxMCBAQAogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAKKyAgIHBTQVJFQVByaXYtPnJvdGF0ZWRfb2Zmc2V0ID0gLTE7CisgICBwU0FSRUFQcml2LT5yb3RhdGVkX3NpemUgPSAwOworICAgcFNBUkVBUHJpdi0+cm90YXRlZF9waXRjaCA9IGN0eC0+c2hhcmVkLnZpcnR1YWxXaWR0aDsKKwogICAgcFNBUkVBUHJpdi0+ZnJvbnRfb2Zmc2V0ID0gcEk4MzAtPkZyb250QnVmZmVyLlN0YXJ0OwogICAgcFNBUkVBUHJpdi0+ZnJvbnRfc2l6ZSA9IHBJODMwLT5Gcm9udEJ1ZmZlci5TaXplOwogICAgcFNBUkVBUHJpdi0+d2lkdGggPSBjdHgtPnNoYXJlZC52aXJ0dWFsV2lkdGg7CkBAIC0xMDk1LDggKzExMjQsMTAgQEAKICAgIHBTQVJFQVByaXYtPmJhY2tfc2l6ZSA9IHBJODMwLT5CYWNrQnVmZmVyLlNpemU7CiAgICBwU0FSRUFQcml2LT5kZXB0aF9vZmZzZXQgPSBwSTgzMC0+RGVwdGhCdWZmZXIuU3RhcnQ7CiAgICBwU0FSRUFQcml2LT5kZXB0aF9zaXplID0gcEk4MzAtPkRlcHRoQnVmZmVyLlNpemU7CisjaWYgMAogICAgcFNBUkVBUHJpdi0+dGV4X29mZnNldCA9IHBJODMwLT5UZXhNZW0uU3RhcnQ7CiAgICBwU0FSRUFQcml2LT50ZXhfc2l6ZSA9IHBJODMwLT5UZXhNZW0uU2l6ZTsKKyNlbmRpZgogICAgcFNBUkVBUHJpdi0+bG9nX3RleF9ncmFudWxhcml0eSA9IHBJODMwLT5UZXhHcmFudWxhcml0eTsKIAogICAgY3R4LT5kcml2ZXJDbGllbnRNc2cgPSBtYWxsb2Moc2l6ZW9mKEk4MzBEUklSZWMpKTsKQEAgLTExMDgsMTQgKzExMzksNiBAQAogICAgcEk4MzBEUkktPmhlaWdodCA9IGN0eC0+c2hhcmVkLnZpcnR1YWxIZWlnaHQ7CiAgICBwSTgzMERSSS0+bWVtID0gY3R4LT5zaGFyZWQuZmJTaXplOwogICAgcEk4MzBEUkktPmNwcCA9IGN0eC0+Y3BwOwotICAgcEk4MzBEUkktPmJhY2tPZmZzZXQgPSBwSTgzMC0+QmFja0J1ZmZlci5TdGFydDsKLSAgIHBJODMwRFJJLT5iYWNrUGl0Y2ggPSBwSTgzMC0+QmFja0J1ZmZlci5QaXRjaDsgCi0KLSAgIHBJODMwRFJJLT5kZXB0aE9mZnNldCA9IHBJODMwLT5EZXB0aEJ1ZmZlci5TdGFydDsKLSAgIHBJODMwRFJJLT5kZXB0aFBpdGNoID0gcEk4MzAtPkRlcHRoQnVmZmVyLlBpdGNoOyAKLQotICAgcEk4MzBEUkktPmZiT2Zmc2V0ID0gcEk4MzAtPkZyb250QnVmZmVyLlN0YXJ0OwotICAgcEk4MzBEUkktPmZiU3RyaWRlID0gcEk4MzAtPkZyb250QnVmZmVyLlBpdGNoOwogCiAgICBwSTgzMERSSS0+Yml0c1BlclBpeGVsID0gY3R4LT5icHA7CiAgICBwSTgzMERSSS0+c2FyZWFfcHJpdl9vZmZzZXQgPSBzaXplb2YoZHJtX3NhcmVhX3QpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2NvbnRleHQuYwppbmRleCA3ZjU1OGU5Li4yOWZkNjU0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2NvbnRleHQuYwpAQCAtMjUzLDkgKzI1Myw2IEBACiAKICAgIG1tZXNhLT5kb19pcnFzID0gKG1tZXNhLT5tYWNoNjRTY3JlZW4tPmlycSAmJiAhZ2V0ZW52KCJNQUNINjRfTk9fSVJRUyIpKTsKIAotICAgbW1lc2EtPnZibGFua19mbGFncyA9IChtbWVzYS0+ZG9faXJxcykKLSAgICAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZtbWVzYS0+b3B0aW9uQ2FjaGUpIDogVkJMQU5LX0ZMQUdfTk9fSVJROwotCiAgICBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSA9ICh2b2lkICopbW1lc2E7CiAKICAgIGlmIChkcmlRdWVyeU9wdGlvbmIoJm1tZXNhLT5vcHRpb25DYWNoZSwgIm5vX3Jhc3QiKSkgewpAQCAtMzMwLDEwICszMjcsMTUgQEAKICAgICAgIH0KIAogICAgICAgCi0gICAgICBkcmlEcmF3YWJsZUluaXRWQmxhbmsoIGRyaURyYXdQcml2LCBuZXdNYWNoNjRDdHgtPnZibGFua19mbGFncywKLQkJCSAgICAgJm5ld01hY2g2NEN0eC0+dmJsX3NlcSApOwotCiAgICAgICBpZiAoIG5ld01hY2g2NEN0eC0+ZHJpRHJhd2FibGUgIT0gZHJpRHJhd1ByaXYgKSB7CisJIGlmIChkcmlEcmF3UHJpdi0+c3dhcF9pbnRlcnZhbCA9PSAodW5zaWduZWQpLTEpIHsKKwkgICAgZHJpRHJhd1ByaXYtPnZibEZsYWdzID0gKG5ld01hY2g2NEN0eC0+ZG9faXJxcykKKwkgICAgICAgPyBkcmlHZXREZWZhdWx0VkJsYW5rRmxhZ3MoJm5ld01hY2g2NEN0eC0+b3B0aW9uQ2FjaGUpCisJICAgICAgIDogVkJMQU5LX0ZMQUdfTk9fSVJROworCisJICAgIGRyaURyYXdhYmxlSW5pdFZCbGFuayggZHJpRHJhd1ByaXYgKTsKKwkgfQorCiAJIG5ld01hY2g2NEN0eC0+ZHJpRHJhd2FibGUgPSBkcmlEcmF3UHJpdjsKIAkgbWFjaDY0Q2FsY1ZpZXdwb3J0KCBuZXdNYWNoNjRDdHgtPmdsQ3R4ICk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2NvbnRleHQuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfY29udGV4dC5oCmluZGV4IGU5MjVmMTguLmZhNmUyYmIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfY29udGV4dC5oCkBAIC0yNjMsOCArMjYzLDYgQEAKIAogICAgLyogVkJJCiAgICAgKi8KLSAgIEdMdWludCB2Ymxfc2VxOwotICAgR0x1aW50IHZibGFua19mbGFnczsKICAgIEdMdWludCBkb19pcnFzOwogCiAgICAvKiBDb25maWd1cmF0aW9uIGNhY2hlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2lvY3RsLmMKaW5kZXggNmJjMmI1OC4uMGEyZGYzMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9pb2N0bC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfaW9jdGwuYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAKIC8qIENvcHkgdGhlIGJhY2sgY29sb3IgYnVmZmVyIHRvIHRoZSBmcm9udCBjb2xvciBidWZmZXIuCiAgKi8KLXZvaWQgbWFjaDY0Q29weUJ1ZmZlciggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICkKK3ZvaWQgbWFjaDY0Q29weUJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICkKIHsKICAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2E7CiAgICBHTGludCBuYm94LCBpLCByZXQ7CkBAIC0zMjAsNyArMzIwLDcgQEAKICNlbmRpZgogCiAgICBVTkxPQ0tfSEFSRFdBUkUoIG1tZXNhICk7Ci0gICBkcmlXYWl0Rm9yVkJsYW5rKCBkUHJpdiwgJm1tZXNhLT52Ymxfc2VxLCBtbWVzYS0+dmJsYW5rX2ZsYWdzLCAmbWlzc2VkX3RhcmdldCApOworICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICZtaXNzZWRfdGFyZ2V0ICk7CiAgICBMT0NLX0hBUkRXQVJFKCBtbWVzYSApOwogCiAgICAvKiB1c2UgZnJvbnQgYnVmZmVyIGNsaXByZWN0cyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9pb2N0bC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9pb2N0bC5oCmluZGV4IDIxNTNhYjguLjZlZjliYzAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfaW9jdGwuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X2lvY3RsLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIGV4dGVybiB2b2lkIG1hY2g2NEZsdXNoRE1BTG9ja2VkKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhICk7CiBleHRlcm4gdm9pZCBtYWNoNjRVcGxvYWRId1N0YXRlTG9ja2VkKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhICk7CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkICptYWNoNjRBbGxvY0RtYUxvdyggbWFjaDY0Q29udGV4dFB0ciBtbWVzYSwgaW50IGJ5dGVzICkKK3N0YXRpYyBJTkxJTkUgdm9pZCAqbWFjaDY0QWxsb2NEbWFMb3coIG1hY2g2NENvbnRleHRQdHIgbW1lc2EsIGludCBieXRlcyApCiB7CiAgICBDQVJEMzIgKmhlYWQ7CiAKQEAgLTYwLDcgKzYwLDcgQEAKICAgIHJldHVybiBoZWFkOwogfQogCi1zdGF0aWMgX19pbmxpbmUgdm9pZCAqbWFjaDY0QWxsb2NEbWFMb2NrZWQoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EsIGludCBieXRlcyApCitzdGF0aWMgSU5MSU5FIHZvaWQgKm1hY2g2NEFsbG9jRG1hTG9ja2VkKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLCBpbnQgYnl0ZXMgKQogewogICAgQ0FSRDMyICpoZWFkOwogCkBAIC03OCw3ICs3OCw3IEBACiAJCQkJICBHTGludCBvZmZzZXQsIEdMaW50IHBpdGNoLCBHTGludCBmb3JtYXQsCiAJCQkJICBHTGludCB4LCBHTGludCB5LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICk7CiAKLWV4dGVybiB2b2lkIG1hY2g2NENvcHlCdWZmZXIoIGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApOworZXh0ZXJuIHZvaWQgbWFjaDY0Q29weUJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICk7CiAjaWYgRU5BQkxFX1BFUkZfQk9YRVMKIGV4dGVybiB2b2lkIG1hY2g2NFBlcmZvcm1hbmNlQ291bnRlcnMoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgKTsKIGV4dGVybiB2b2lkIG1hY2g2NFBlcmZvcm1hbmNlQm94ZXNMb2NrZWQoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfbG9jay5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9sb2NrLmMKaW5kZXggZWE2MDVmYi4uZDAxOGJhNCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9sb2NrLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9sb2NrLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgaWYgKCBtbWVzYS0+bGFzdFN0YW1wICE9IGRQcml2LT5sYXN0U3RhbXAgKSB7CiAgICAgICBtbWVzYS0+bGFzdFN0YW1wID0gZFByaXYtPmxhc3RTdGFtcDsKLSAgICAgIGlmIChtbWVzYS0+Z2xDdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdID09IEJVRkZFUl9CSVRfQkFDS19MRUZUKQorICAgICAgaWYgKG1tZXNhLT5nbEN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0JBQ0tfTEVGVCkKICAgICAgICAgIG1hY2g2NFNldENsaXByZWN0cyggbW1lc2EtPmdsQ3R4LCBHTF9CQUNLX0xFRlQgKTsKICAgICAgIGVsc2UKICAgICAgICAgIG1hY2g2NFNldENsaXByZWN0cyggbW1lc2EtPmdsQ3R4LCBHTF9GUk9OVF9MRUZUICk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3NjcmVlbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9zY3JlZW4uYwppbmRleCAzMDBhM2RlLi40ZGZmZmVmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3NjcmVlbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc2NyZWVuLmMKQEAgLTY5LDc5ICs2OSwxNSBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gY2FyZF9leHRlbnNpb25zW107CiAKLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICogZmlsbF9pbl9tb2RlcyggX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotCQkJCQkgdW5zaWduZWQgcGl4ZWxfYml0cywgCi0JCQkJCSB1bnNpZ25lZCBkZXB0aF9iaXRzLAotCQkJCQkgdW5zaWduZWQgc3RlbmNpbF9iaXRzLAotCQkJCQkgY29uc3QgR0xlbnVtICogZGJfbW9kZXMsCi0JCQkJCSB1bnNpZ25lZCBudW1fZGJfbW9kZXMsCi0JCQkJCSBpbnQgdmlzVHlwZSApCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK21hY2g2NEZpbGxJbk1vZGVzKCBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCwKKwkJICAgdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKKwkJICAgdW5zaWduZWQgc3RlbmNpbF9iaXRzLCBHTGJvb2xlYW4gaGF2ZV9iYWNrX2J1ZmZlciApCiB7Ci0gICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0c1syXVs0XSA9IHsKLQl7ICAgICAgICAgIDUsICAgICAgICAgIDYsICAgICAgICAgIDUsICAgICAgICAgIDAgfSwKLQl7ICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAgIDAgfQotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFza3NbMl1bNF0gPSB7Ci0JeyAweDAwMDBGODAwLCAweDAwMDAwN0UwLCAweDAwMDAwMDFGLCAweDAwMDAwMDAwIH0sCi0JeyAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGLCAweDAwMDAwMDAwIH0KLSAgICB9OwotCi0gICAgdW5zaWduZWQgICBpOwotICAgIHVuc2lnbmVkICAgajsKLSAgICBjb25zdCB1bnNpZ25lZCBpbmRleCA9ICgocGl4ZWxfYml0cyArIDE1KSAvIDE2KSAtIDE7Ci0KLSAgICBmb3IgKCBpID0gMCA7IGkgPCBudW1fZGJfbW9kZXMgOyBpKysgKSB7Ci0JZm9yICggaiA9IDAgOyBqIDwgMiA7IGorKyApIHsKLQotCSAgICBtb2Rlcy0+cmVkQml0cyAgID0gYml0c1tpbmRleF1bMF07Ci0JICAgIG1vZGVzLT5ncmVlbkJpdHMgPSBiaXRzW2luZGV4XVsxXTsKLQkgICAgbW9kZXMtPmJsdWVCaXRzICA9IGJpdHNbaW5kZXhdWzJdOwotCSAgICBtb2Rlcy0+YWxwaGFCaXRzID0gYml0c1tpbmRleF1bM107Ci0JICAgIG1vZGVzLT5yZWRNYXNrICAgPSBtYXNrc1tpbmRleF1bMF07Ci0JICAgIG1vZGVzLT5ncmVlbk1hc2sgPSBtYXNrc1tpbmRleF1bMV07Ci0JICAgIG1vZGVzLT5ibHVlTWFzayAgPSBtYXNrc1tpbmRleF1bMl07Ci0JICAgIG1vZGVzLT5hbHBoYU1hc2sgPSBtYXNrc1tpbmRleF1bM107Ci0JICAgIG1vZGVzLT5yZ2JCaXRzICAgPSBtb2Rlcy0+cmVkQml0cyArIG1vZGVzLT5ncmVlbkJpdHMKLQkJKyBtb2Rlcy0+Ymx1ZUJpdHMgKyBtb2Rlcy0+YWxwaGFCaXRzOwotCi0JICAgIG1vZGVzLT5hY2N1bVJlZEJpdHMgICA9IDE2ICogajsKLQkgICAgbW9kZXMtPmFjY3VtR3JlZW5CaXRzID0gMTYgKiBqOwotCSAgICBtb2Rlcy0+YWNjdW1CbHVlQml0cyAgPSAxNiAqIGo7Ci0JICAgIG1vZGVzLT5hY2N1bUFscGhhQml0cyA9IDA7Ci0JICAgIG1vZGVzLT52aXN1YWxSYXRpbmcgPSAoaiA9PSAwKSA/IEdMWF9OT05FIDogR0xYX1NMT1dfQ09ORklHOwotCSAgICBtb2Rlcy0+ZHJhd2FibGVUeXBlID0gR0xYX1dJTkRPV19CSVQgfCBHTFhfUElYTUFQX0JJVDsKLQkgICAgbW9kZXMtPnN0ZW5jaWxCaXRzID0gc3RlbmNpbF9iaXRzOwotCSAgICBtb2Rlcy0+ZGVwdGhCaXRzID0gZGVwdGhfYml0czsKLQotCSAgICBtb2Rlcy0+dmlzdWFsVHlwZSA9IHZpc1R5cGU7Ci0JICAgIG1vZGVzLT5yZW5kZXJUeXBlID0gR0xYX1JHQkFfQklUOwotCSAgICBtb2Rlcy0+cmdiTW9kZSA9IEdMX1RSVUU7Ci0KLQkgICAgaWYgKCBkYl9tb2Rlc1tpXSA9PSBHTFhfTk9ORSApIHsKLQotCQltb2Rlcy0+ZG91YmxlQnVmZmVyTW9kZSA9IEdMX0ZBTFNFOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQltb2Rlcy0+ZG91YmxlQnVmZmVyTW9kZSA9IEdMX1RSVUU7Ci0JCW1vZGVzLT5zd2FwTWV0aG9kID0gZGJfbW9kZXNbaV07Ci0JICAgIH0KLQotCSAgICBtb2RlcyA9IG1vZGVzLT5uZXh0OwotCX0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1vZGVzOwotfQotCi0KLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICoKLW1hY2g2NEZpbGxJbk1vZGVzKCB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAotCQkgdW5zaWduZWQgc3RlbmNpbF9iaXRzLCBHTGJvb2xlYW4gaGF2ZV9iYWNrX2J1ZmZlciApCi17Ci0gICBfX0dMY29udGV4dE1vZGVzICogbW9kZXM7CisgICAgX19EUkljb25maWcgKipjb25maWdzOwogICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtOwotICAgIHVuc2lnbmVkIG51bV9tb2RlczsKKyAgICBHTGVudW0gZmJfZm9ybWF0OworICAgIEdMZW51bSBmYl90eXBlOwogICAgIHVuc2lnbmVkIGRlcHRoX2J1ZmZlcl9mYWN0b3I7CiAgICAgdW5zaWduZWQgYmFja19idWZmZXJfZmFjdG9yOwogICAgIHVuc2lnbmVkIGk7CkBAIC0xNTUsNDkgKzkxLDUxIEBACiAJR0xYX05PTkUsIEdMWF9TV0FQX1VOREVGSU5FRF9PTUwgLyosIEdMWF9TV0FQX0NPUFlfT01MICovCiAgICAgfTsKIAotICAgIGludCBkZXB0aF9idWZmZXJfbW9kZXNbMl1bMl07CisgICAgdV9pbnQ4X3QgZGVwdGhfYml0c19hcnJheVsyXTsKKyAgICB1X2ludDhfdCBzdGVuY2lsX2JpdHNfYXJyYXlbMl07CiAKLQotICAgIGRlcHRoX2J1ZmZlcl9tb2Rlc1swXVswXSA9IGRlcHRoX2JpdHM7Ci0gICAgZGVwdGhfYnVmZmVyX21vZGVzWzFdWzBdID0gZGVwdGhfYml0czsKKyAgICBkZXB0aF9iaXRzX2FycmF5WzBdID0gZGVwdGhfYml0czsKKyAgICBkZXB0aF9iaXRzX2FycmF5WzFdID0gZGVwdGhfYml0czsKICAgICAKICAgICAvKiBKdXN0IGxpa2Ugd2l0aCB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlciwgYWx3YXlzIHByb3ZpZGUgc29tZSBtb2RlcwogICAgICAqIHdpdGggYSBzdGVuY2lsIGJ1ZmZlci4gIEl0IHdpbGwgYmUgYSBzdyBmYWxsYmFjaywgYnV0IHNvbWUgYXBwcyB3b24ndAogICAgICAqIGNhcmUgYWJvdXQgdGhhdC4KICAgICAgKi8KLSAgICBkZXB0aF9idWZmZXJfbW9kZXNbMF1bMV0gPSAwOwotICAgIGRlcHRoX2J1ZmZlcl9tb2Rlc1sxXVsxXSA9IChzdGVuY2lsX2JpdHMgPT0gMCkgPyA4IDogc3RlbmNpbF9iaXRzOworICAgIHN0ZW5jaWxfYml0c19hcnJheVswXSA9IDA7CisgICAgc3RlbmNpbF9iaXRzX2FycmF5WzFdID0gKHN0ZW5jaWxfYml0cyA9PSAwKSA/IDggOiBzdGVuY2lsX2JpdHM7CiAKICAgICBkZXB0aF9idWZmZXJfZmFjdG9yID0gKChkZXB0aF9iaXRzICE9IDApIHx8IChzdGVuY2lsX2JpdHMgIT0gMCkpID8gMiA6IDE7CiAgICAgYmFja19idWZmZXJfZmFjdG9yICA9IChoYXZlX2JhY2tfYnVmZmVyKSA/IDIgOiAxOwogCi0gICAgbnVtX21vZGVzID0gZGVwdGhfYnVmZmVyX2ZhY3RvciAqIGJhY2tfYnVmZmVyX2ZhY3RvciAqIDQ7Ci0KLSAgICBtb2RlcyA9ICgqZHJpX2ludGVyZmFjZS0+Y3JlYXRlQ29udGV4dE1vZGVzKSggbnVtX21vZGVzLCBzaXplb2YoIF9fR0xjb250ZXh0TW9kZXMgKSApOwotICAgIG0gPSBtb2RlczsKLSAgICBmb3IgKCBpID0gMCA7IGkgPCBkZXB0aF9idWZmZXJfZmFjdG9yIDsgaSsrICkgewotCW0gPSBmaWxsX2luX21vZGVzKCBtLCBwaXhlbF9iaXRzLCAKLQkJCSAgIGRlcHRoX2J1ZmZlcl9tb2Rlc1tpXVswXSwgZGVwdGhfYnVmZmVyX21vZGVzW2ldWzFdLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9UUlVFX0NPTE9SICk7CisgICAgaWYgKHBpeGVsX2JpdHMgPT0gMTYpIHsKKyAgICAgICBmYl9mb3JtYXQgPSBHTF9SR0I7CisgICAgICAgZmJfdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBmYl9mb3JtYXQgPSBHTF9CR1JBOworICAgICAgIGZiX3R5cGUgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY7CiAgICAgfQogCi0gICAgZm9yICggaSA9IDAgOyBpIDwgZGVwdGhfYnVmZmVyX2ZhY3RvciA7IGkrKyApIHsKLQltID0gZmlsbF9pbl9tb2RlcyggbSwgcGl4ZWxfYml0cywgCi0JCQkgICBkZXB0aF9idWZmZXJfbW9kZXNbaV1bMF0sIGRlcHRoX2J1ZmZlcl9tb2Rlc1tpXVsxXSwKLQkJCSAgIGJhY2tfYnVmZmVyX21vZGVzLCBiYWNrX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBHTFhfRElSRUNUX0NPTE9SICk7CisgICAgY29uZmlncyA9IGRyaUNyZWF0ZUNvbmZpZ3MoZmJfZm9ybWF0LCBmYl90eXBlLAorCQkJICAgICAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwKKwkJCSAgICAgICBkZXB0aF9idWZmZXJfZmFjdG9yLCBiYWNrX2J1ZmZlcl9tb2RlcywKKwkJCSAgICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IpOworICAgIGlmIChjb25maWdzID09IE5VTEwpIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLAorCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOworICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIE1hcmsgdGhlIHZpc3VhbCBhcyBzbG93IGlmIHRoZXJlIGFyZSAiZmFrZSIgc3RlbmNpbCBiaXRzLgogICAgICAqLwotICAgIGZvciAoIG0gPSBtb2RlcyA7IG0gIT0gTlVMTCA7IG0gPSBtLT5uZXh0ICkgewotICAgICAgIGlmICggKG0tPnN0ZW5jaWxCaXRzICE9IDApICYmIChtLT5zdGVuY2lsQml0cyAhPSBzdGVuY2lsX2JpdHMpICl7Ci0JICAgIG0tPnZpc3VhbFJhdGluZyA9IEdMWF9TTE9XX0NPTkZJRzsKLQl9CisgICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisgICAgICAgbSA9ICZjb25maWdzW2ldLT5tb2RlczsKKyAgICAgICBpZiAoKG0tPnN0ZW5jaWxCaXRzICE9IDApICYmIChtLT5zdGVuY2lsQml0cyAhPSBzdGVuY2lsX2JpdHMpKSB7CisJICBtLT52aXN1YWxSYXRpbmcgPSBHTFhfU0xPV19DT05GSUc7CisgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBtb2RlczsKKyAgICByZXR1cm4gKGNvbnN0IF9fRFJJY29uZmlnICoqKSBjb25maWdzOwogfQogCiAKQEAgLTIwOCw5ICsxNDYsNyBAQAogewogICAgbWFjaDY0U2NyZWVuUHRyIG1hY2g2NFNjcmVlbjsKICAgIEFUSURSSVB0ciBzZXJ2ZXJJbmZvID0gKEFUSURSSVB0cilzUHJpdi0+cERldlByaXY7Ci0gICBQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DIGdseF9lbmFibGVfZXh0ZW5zaW9uID0KLSAgICAgKFBGTkdMWFNDUkVOQUJMRUVYVEVOU0lPTlBST0MpICgqZHJpX2ludGVyZmFjZS0+Z2V0UHJvY0FkZHJlc3MoImdseEVuYWJsZUV4dGVuc2lvbiIpKTsKLSAgIHZvaWQgKiBjb25zdCBwc2MgPSBzUHJpdi0+cHNjLT5zY3JlZW5Db25maWdzOworICAgaW50IGk7CiAKICAgIGlmIChzUHJpdi0+ZGV2UHJpdlNpemUgIT0gc2l6ZW9mKEFUSURSSVJlYykpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCJcbkVSUk9SISAgc2l6ZW9mKEFUSURSSVJlYykgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHNpemUgZnJvbSBkZXZpY2UgZHJpdmVyXG4iKTsKQEAgLTMxOSwxNSArMjU1LDE0IEBACiAKICAgIG1hY2g2NFNjcmVlbi0+ZHJpU2NyZWVuID0gc1ByaXY7CiAKLSAgIGlmICggZ2x4X2VuYWJsZV9leHRlbnNpb24gIT0gTlVMTCApIHsKLSAgICAgIGlmICggbWFjaDY0U2NyZWVuLT5pcnEgIT0gMCApIHsKLQkgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9TR0lfc3dhcF9jb250cm9sIiApOwotCSAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV92aWRlb19zeW5jIiApOwotCSAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX01FU0Ffc3dhcF9jb250cm9sIiApOwotICAgICAgfQotCi0gICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSIgKTsKKyAgIGkgPSAwOworICAgbWFjaDY0U2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmZHJpRnJhbWVUcmFja2luZ0V4dGVuc2lvbi5iYXNlOworICAgaWYgKCBtYWNoNjRTY3JlZW4tPmlycSAhPSAwICkgeworICAgICAgbWFjaDY0U2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmZHJpU3dhcENvbnRyb2xFeHRlbnNpb24uYmFzZTsKKyAgICAgIG1hY2g2NFNjcmVlbi0+ZXh0ZW5zaW9uc1tpKytdID0gJmRyaU1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvbi5iYXNlOwogICAgfQorICAgbWFjaDY0U2NyZWVuLT5leHRlbnNpb25zW2krK10gPSBOVUxMOworICAgc1ByaXYtPmV4dGVuc2lvbnMgPSBtYWNoNjRTY3JlZW4tPmV4dGVuc2lvbnM7CiAKICAgIHJldHVybiBtYWNoNjRTY3JlZW47CiB9CkBAIC00NzUsOSArNDEwLDQ4IEBACiAgICByZXR1cm4gR0xfVFJVRTsKIH0KIAorLyoqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3BlY2lmaWMgcGFydCBvZiB0aGUgY3JlYXRlTmV3U2NyZWVuIGVudHJ5IHBvaW50LgorICogCisgKiBcdG9kbyBtYXliZSBmb2xkIHRoaXMgaW50byBpbnRlbEluaXREcml2ZXIKKyAqCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICovCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK21hY2g2NEluaXRTY3JlZW4oX19EUklzY3JlZW5Qcml2YXRlICpwc3ApCit7CisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRkeF9leHBlY3RlZCA9IHsgNiwgNCwgMCB9OworICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7IDQsIDAsIDAgfTsKKyAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJtX2V4cGVjdGVkID0geyAyLCAwLCAwIH07CisgICBBVElEUklQdHIgZHJpX3ByaXYgPSAoQVRJRFJJUHRyKSBwc3AtPnBEZXZQcml2OwogCi1zdGF0aWMgc3RydWN0IF9fRHJpdmVyQVBJUmVjIG1hY2g2NEFQSSA9IHsKLSAgIC5Jbml0RHJpdmVyICAgICAgPSBtYWNoNjRJbml0RHJpdmVyLAorICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiTWFjaDY0IiwKKwkJCQkgICAgICAmcHNwLT5kcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAorCQkJCSAgICAgICZwc3AtPmRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICAKKyAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLAorICAgICogZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlCisgICAgKiB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQKKyAgICAqICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQorICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUgaXMKKyAgICAqIGNhbGxlZCwgYnV0IHdlIGNhbid0IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEKKyAgICAqIGNvbnRleHQgcG9pbnRlci4KKyAgICAqCisgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PworICAgICovCisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9GQUxTRSApOworCisgICBpZiAoIW1hY2g2NEluaXREcml2ZXIocHNwKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICByZXR1cm4gIG1hY2g2NEZpbGxJbk1vZGVzKCBwc3AsIGRyaV9wcml2LT5jcHAgKiA4LCAxNiwgMCwgMSk7Cit9CisKK2NvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyBkcmlEcml2ZXJBUEkgPSB7CisgICAuSW5pdFNjcmVlbiAgICAgID0gbWFjaDY0SW5pdFNjcmVlbiwKICAgIC5EZXN0cm95U2NyZWVuICAgPSBtYWNoNjREZXN0cm95U2NyZWVuLAogICAgLkNyZWF0ZUNvbnRleHQgICA9IG1hY2g2NENyZWF0ZUNvbnRleHQsCiAgICAuRGVzdHJveUNvbnRleHQgID0gbWFjaDY0RGVzdHJveUNvbnRleHQsCkBAIC00ODcsNzEgKzQ2MSw5IEBACiAgICAuTWFrZUN1cnJlbnQgICAgID0gbWFjaDY0TWFrZUN1cnJlbnQsCiAgICAuVW5iaW5kQ29udGV4dCAgID0gbWFjaDY0VW5iaW5kQ29udGV4dCwKICAgIC5HZXRTd2FwSW5mbyAgICAgPSBOVUxMLAotICAgLkdldE1TQyAgICAgICAgICA9IGRyaUdldE1TQzMyLAorICAgLkdldERyYXdhYmxlTVNDICA9IGRyaURyYXdhYmxlR2V0TVNDMzIsCiAgICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAogICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCiAgICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAogfTsKIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJvb3RzdHJhcCBmdW5jdGlvbiBmb3IgdGhlIGRyaXZlci4gIGxpYkdMIHN1cHBsaWVzIGFsbCBvZiB0aGUKLSAqIHJlcXVpc2l0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLCBhbmQgdGhlIGRyaXZlciBpbml0aWFsaXplcyBpdHNlbGYuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBmaWxscyBpbiB0aGUgbGlua2VkIGxpc3QgcG9pbnRlZCB0byBieSBcYyBkcml2ZXJfbW9kZXMKLSAqIHdpdGggdGhlIFxjIF9fR0xjb250ZXh0TW9kZXMgdGhhdCB0aGUgZHJpdmVyIGNhbiBzdXBwb3J0IGZvciB3aW5kb3dzIG9yCi0gKiBwYnVmZmVycy4KLSAqIAotICogXHJldHVybiBBIHBvaW50ZXIgdG8gYSBcYyBfX0RSSXNjcmVlblByaXZhdGUgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiAKLSAqICAgICAgICAgZmFpbHVyZS4KLSAqLwotUFVCTElDCi12b2lkICogX19kcmlDcmVhdGVOZXdTY3JlZW5fMjAwNTA3MjcoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgX19EUklzY3JlZW4gKnBzYywKLQkJCSAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkZHhfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICogZnJhbWVfYnVmZmVyLAotCQkJICAgICBkcm1BZGRyZXNzIHBTQVJFQSwgaW50IGZkLCAKLQkJCSAgICAgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWludGVyZmFjZU1ldGhvZHMgKiBpbnRlcmZhY2UsCi0JCQkgICAgIF9fR0xjb250ZXh0TW9kZXMgKiogZHJpdmVyX21vZGVzICkKLQkJCSAgICAgCi17Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKLSAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0geyA2LCA0LCAwIH07Ci0gICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRyaV9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OwotICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcm1fZXhwZWN0ZWQgPSB7IDIsIDAsIDAgfTsKLQotICAgZHJpX2ludGVyZmFjZSA9IGludGVyZmFjZTsKLQotICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiTWFjaDY0IiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0KLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJm1hY2g2NEFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgQVRJRFJJUHRyIGRyaV9wcml2ID0gKEFUSURSSVB0cikgcHNwLT5wRGV2UHJpdjsKLSAgICAgICpkcml2ZXJfbW9kZXMgPSBtYWNoNjRGaWxsSW5Nb2RlcyggZHJpX3ByaXYtPmNwcCAqIDgsCi0JCQkJCSAxNiwKLQkJCQkJIDAsCi0JCQkJCSAxKTsKLQotICAgICAgLyogQ2FsbGluZyBkcmlJbml0RXh0ZW5zaW9ucyBoZXJlLCB3aXRoIGEgTlVMTCBjb250ZXh0IHBvaW50ZXIsIGRvZXMgbm90IGFjdHVhbGx5Ci0gICAgICAgKiBlbmFibGUgdGhlIGV4dGVuc2lvbnMuICBJdCBqdXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIGRpc3BhdGNoIG9mZnNldHMgZm9yIGFsbAotICAgICAgICogdGhlIGV4dGVuc2lvbnMgdGhhdCAqbWlnaHQqIGJlIGVuYWJsZXMgYXJlIGtub3duLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUKLSAgICAgICAqIGRpc3BhdGNoIG9mZnNldHMgbmVlZCB0byBiZSBrbm93biB3aGVuIF9tZXNhX2NvbnRleHRfY3JlYXRlIGlzIGNhbGxlZCwgYnV0IHdlIGNhbid0Ci0gICAgICAgKiBlbmFibGUgdGhlIGV4dGVuc2lvbnMgdW50aWwgd2UgaGF2ZSBhIGNvbnRleHQgcG9pbnRlci4KLSAgICAgICAqCi0gICAgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PwotICAgICAgICovCi0gICAgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwotICAgfQotCi0gICByZXR1cm4gKHZvaWQgKikgcHNwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9zY3JlZW4uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc2NyZWVuLmgKaW5kZXggN2JmN2RjNC4uYmU1ZTI5YSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9zY3JlZW4uaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3NjcmVlbi5oCkBAIC03Myw2ICs3Myw4IEBACiAgICBfX0RSSXNjcmVlblByaXZhdGUgKmRyaVNjcmVlbjsKIAogICAgZHJpT3B0aW9uQ2FjaGUgb3B0aW9uQ2FjaGU7CisKKyAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpleHRlbnNpb25zWzRdOwogfSBtYWNoNjRTY3JlZW5SZWMsICptYWNoNjRTY3JlZW5QdHI7CiAKICNlbmRpZiAvKiBfX01BQ0g2NF9TQ1JFRU5fSF9fICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3NwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc3Bhbi5jCmluZGV4IDVjMjQwM2YuLjkxZDQ2Y2UgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc3Bhbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc3Bhbi5jCkBAIC0xMTcsNiArMTE3LDggQEAKIAogLyogMTYgYml0IGRlcHRoYnVmZmVyIGZ1bmN0aW9ucy4KICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdXNob3J0CisKICNkZWZpbmUgV1JJVEVfREVQVEgoIF94LCBfeSwgZCApCQkJCQlcCiAgICAqKEdMdXNob3J0ICopKGJ1ZiArICgoX3gpICsgKF95KSAqIGRyYi0+cGl0Y2gpICogMikgPSBkOwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3N0YXRlLmMKaW5kZXggOWFjNTFlZS4uZDMyZDdlZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfc3RhdGUuYwpAQCAtNzI2LDI0ICs3MjYsMjYgQEAKIAogICAgRkxVU0hfQkFUQ0goIG1tZXNhICk7CiAKLSAgIC8qCi0gICAgKiBfRHJhd0Rlc3RNYXNrIGlzIGVhc2llciB0byBjb3BlIHdpdGggdGhhbiA8bW9kZT4uCi0gICAgKi8KLSAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzICE9IDEpIHsKKyAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLworICAgICAgRkFMTEJBQ0soIG1tZXNhLCBNQUNINjRfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSApIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICBGQUxMQkFDSyggbW1lc2EsIE1BQ0g2NF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIG1hY2g2NFNldENsaXByZWN0cyggY3R4LCBHTF9GUk9OVF9MRUZUICk7CiAgICAgICBpZiAoTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9NU0cpCiAJIGZwcmludGYoc3RkZXJyLCIlczogQlVGRkVSX0JJVF9GUk9OVF9MRUZUXG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOgogICAgICAgRkFMTEJBQ0soIG1tZXNhLCBNQUNINjRfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX0ZBTFNFICk7CiAgICAgICBtYWNoNjRTZXRDbGlwcmVjdHMoIGN0eCwgR0xfQkFDS19MRUZUICk7CiAgICAgICBpZiAoTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9NU0cpCiAJIGZwcmludGYoc3RkZXJyLCIlczogQlVGRkVSX0JJVF9CQUNLX0xFRlRcbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBHTF9OT05FIG9yIEdMX0ZST05UX0FORF9CQUNLIG9yIHN0ZXJlbyBsZWZ0JnJpZ2h0LCBldGMgKi8KICAgICAgIEZBTExCQUNLKCBtbWVzYSwgTUFDSDY0X0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CiAgICAgICBpZiAoTUFDSDY0X0RFQlVHICYgREVCVUdfVkVSQk9TRV9NU0cpCiAJIGZwcmludGYoc3RkZXJyLCIlczogZmFsbGJhY2sgKG1vZGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIG1vZGUpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF90ZXguaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21hY2g2NC9tYWNoNjRfdGV4LmgKaW5kZXggZTY3NjYxYi4uOGUwYjIzZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF90ZXguaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3RleC5oCkBAIC03Miw5ICs3Miw5IEBACiAjZGVmaW5lIE1BQ0g2NFBBQ0tDT0xPUjQ0NDQociwgZywgYiwgYSkJCQkJCVwKICAgICgoKChhKSAmIDB4ZjApIDw8IDgpIHwgKCgocikgJiAweGYwKSA8PCA0KSB8ICgoZykgJiAweGYwKSB8ICgoYikgPj4gNCkpCiAKLXN0YXRpYyBfX2lubGluZV9fIEdMdWludCBtYWNoNjRQYWNrQ29sb3IoIEdMdWludCBjcHAsCi0JCQkJCSAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCi0JCQkJCSAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQorc3RhdGljIElOTElORSBHTHVpbnQgbWFjaDY0UGFja0NvbG9yKCBHTHVpbnQgY3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQogewogICAgc3dpdGNoICggY3BwICkgewogICAgY2FzZSAyOgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWFjaDY0L21hY2g2NF90cmlzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3RyaXMuYwppbmRleCBlNGRmMDExLi42ZmI0YzViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3RyaXMuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tYWNoNjQvbWFjaDY0X3RyaXMuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAjZGVmaW5lIENPUFlfVkVSVEVYX09PQSggdmIsIHZlcnRzaXplLCB2LCBuICkJRE9fQ09QWV9WRVJURVgoIHZiLCB2ZXJ0c2l6ZSwgdiwgbiwgMSApCiAKIAotc3RhdGljIF9faW5saW5lIHZvaWQgbWFjaDY0X2RyYXdfcXVhZCggbWFjaDY0Q29udGV4dFB0ciBtbWVzYSwKK3N0YXRpYyBJTkxJTkUgdm9pZCBtYWNoNjRfZHJhd19xdWFkKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAogCQkJCSAgICAgICBtYWNoNjRWZXJ0ZXhQdHIgdjAsCiAJCQkJICAgICAgIG1hY2g2NFZlcnRleFB0ciB2MSwKIAkJCQkgICAgICAgbWFjaDY0VmVydGV4UHRyIHYyLApAQCAtNDE5LDcgKzQxOSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgbWFjaDY0X2RyYXdfdHJpYW5nbGUoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EsCitzdGF0aWMgSU5MSU5FIHZvaWQgbWFjaDY0X2RyYXdfdHJpYW5nbGUoIG1hY2g2NENvbnRleHRQdHIgbW1lc2EsCiAJCQkJCSAgIG1hY2g2NFZlcnRleFB0ciB2MCwKIAkJCQkJICAgbWFjaDY0VmVydGV4UHRyIHYxLAogCQkJCQkgICBtYWNoNjRWZXJ0ZXhQdHIgdjIgKQpAQCAtNjY2LDcgKzY2Niw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgbWFjaDY0X2RyYXdfbGluZSggbWFjaDY0Q29udGV4dFB0ciBtbWVzYSwKK3N0YXRpYyBJTkxJTkUgdm9pZCBtYWNoNjRfZHJhd19saW5lKCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAogCQkJCSAgICAgbWFjaDY0VmVydGV4UHRyIHYwLAogCQkJCSAgICAgbWFjaDY0VmVydGV4UHRyIHYxICkKIHsKQEAgLTk1NSw3ICs5NTUsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkIG1hY2g2NF9kcmF3X3BvaW50KCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAorc3RhdGljIElOTElORSB2b2lkIG1hY2g2NF9kcmF3X3BvaW50KCBtYWNoNjRDb250ZXh0UHRyIG1tZXNhLAogCQkJCSAgICAgIG1hY2g2NFZlcnRleFB0ciB2MCApCiB7CiAjaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FfeG1lc2EuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FfeG1lc2EuYwppbmRleCBkMGNmMDZmLi5lN2ExYjNiMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYV94bWVzYS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FfeG1lc2EuYwpAQCAtNzQsMTEgKzc0LDEzIEBACiAjZGVmaW5lIG5lZWRfR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CiAjZGVmaW5lIG5lZWRfR0xfQVJCX3ZlcnRleF9wcm9ncmFtCiAjZGVmaW5lIG5lZWRfR0xfRVhUX2ZvZ19jb29yZAorI2RlZmluZSBuZWVkX0dMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzCiAjZGVmaW5lIG5lZWRfR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCiAjZGVmaW5lIG5lZWRfR0xfRVhUX3NlY29uZGFyeV9jb2xvcgogI2lmIDAKICNkZWZpbmUgbmVlZF9HTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQogI2VuZGlmCisjZGVmaW5lIG5lZWRfR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAogI2RlZmluZSBuZWVkX0dMX05WX3ZlcnRleF9wcm9ncmFtCiAjaW5jbHVkZSAiZXh0ZW5zaW9uX2hlbHBlci5oIgogCkBAIC0xMDksMTkgKzExMSwxOCBAQAogaW50IE1HQV9ERUJVRyA9IDA7CiAjZW5kaWYKIAotc3RhdGljIGludCBnZXRTd2FwSW5mbyggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LCBfX0RSSXN3YXBJbmZvICogc0luZm8gKTsKLQotc3RhdGljIF9fR0xjb250ZXh0TW9kZXMgKgotbWdhRmlsbEluTW9kZXMoIHVuc2lnbmVkIHBpeGVsX2JpdHMsIHVuc2lnbmVkIGRlcHRoX2JpdHMsCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK21nYUZpbGxJbk1vZGVzKCBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCwKKwkJdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKIAkJdW5zaWduZWQgc3RlbmNpbF9iaXRzLCBHTGJvb2xlYW4gaGF2ZV9iYWNrX2J1ZmZlciApCiB7Ci0gICAgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzOworICAgIF9fRFJJY29uZmlnICoqY29uZmlnczsKICAgICBfX0dMY29udGV4dE1vZGVzICogbTsKLSAgICB1bnNpZ25lZCBudW1fbW9kZXM7CiAgICAgdW5zaWduZWQgZGVwdGhfYnVmZmVyX2ZhY3RvcjsKICAgICB1bnNpZ25lZCBiYWNrX2J1ZmZlcl9mYWN0b3I7CiAgICAgR0xlbnVtIGZiX2Zvcm1hdDsKICAgICBHTGVudW0gZmJfdHlwZTsKKyAgICBpbnQgaTsKIAogICAgIC8qIEdMWF9TV0FQX0NPUFlfT01MIGlzIG9ubHkgc3VwcG9ydGVkIGJlY2F1c2UgdGhlIE1HQSBkcml2ZXIgZG9lc24ndAogICAgICAqIHN1cHBvcnQgcGFnZWZsaXBwaW5nIGF0IGFsbC4KQEAgLTE0OSw4ICsxNTAsNiBAQAogICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IgPSAoKGRlcHRoX2JpdHMgIT0gMCkgfHwgKHN0ZW5jaWxfYml0cyAhPSAwKSkgPyAzIDogMTsKICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgID0gKGhhdmVfYmFja19idWZmZXIpID8gMiA6IDE7CiAKLSAgICBudW1fbW9kZXMgPSBkZXB0aF9idWZmZXJfZmFjdG9yICogYmFja19idWZmZXJfZmFjdG9yICogNDsKLQogICAgIGlmICggcGl4ZWxfYml0cyA9PSAxNiApIHsKICAgICAgICAgZmJfZm9ybWF0ID0gR0xfUkdCOwogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CkBAIC0xNjAsNDYgKzE1OSw0MSBAQAogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwogICAgIH0KIAotICAgIG1vZGVzID0gKCpkcmlfaW50ZXJmYWNlLT5jcmVhdGVDb250ZXh0TW9kZXMpKCBudW1fbW9kZXMsIHNpemVvZiggX19HTGNvbnRleHRNb2RlcyApICk7Ci0gICAgbSA9IG1vZGVzOwotICAgIGlmICggISBkcmlGaWxsSW5Nb2RlcyggJiBtLCBmYl9mb3JtYXQsIGZiX3R5cGUsCi0JCQkgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICAgR0xYX1RSVUVfQ09MT1IgKSApIHsKKyAgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsCisJCQkgICAgICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LAorCQkJICAgICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCisJCQkgICAgICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3Rvcik7CisgICAgaWYgKGNvbmZpZ3MgPT0gTlVMTCkgewogCWZwcmludGYoIHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLAogCQkgX19mdW5jX18sIF9fTElORV9fICk7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKCAhIGRyaUZpbGxJbk1vZGVzKCAmIG0sIGZiX2Zvcm1hdCwgZmJfdHlwZSwKLQkJCSAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwgZGVwdGhfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIGJhY2tfYnVmZmVyX21vZGVzLCBiYWNrX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBHTFhfRElSRUNUX0NPTE9SICkgKSB7Ci0JZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCi0JCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9CisgICAvKiBNYXJrIHRoZSB2aXN1YWwgYXMgc2xvdyBpZiB0aGVyZSBhcmUgImZha2UiIHN0ZW5jaWwgYml0cy4KKyAgICAqLworICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisgICAgICBtID0gJmNvbmZpZ3NbaV0tPm1vZGVzOworICAgICAgaWYgKChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSkgeworICAgICAgICAgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOworICAgICAgfQorICAgfQogCi0gICAgLyogTWFyayB0aGUgdmlzdWFsIGFzIHNsb3cgaWYgdGhlcmUgYXJlICJmYWtlIiBzdGVuY2lsIGJpdHMuCi0gICAgICovCi0gICAgZm9yICggbSA9IG1vZGVzIDsgbSAhPSBOVUxMIDsgbSA9IG0tPm5leHQgKSB7Ci0JaWYgKCAobS0+c3RlbmNpbEJpdHMgIT0gMCkgJiYgKG0tPnN0ZW5jaWxCaXRzICE9IHN0ZW5jaWxfYml0cykgKSB7Ci0JICAgIG0tPnZpc3VhbFJhdGluZyA9IEdMWF9TTE9XX0NPTkZJRzsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGVzOworICAgcmV0dXJuIChjb25zdCBfX0RSSWNvbmZpZyAqKikgY29uZmlnczsKIH0KIAorY29uc3QgX19EUklleHRlbnNpb24gKm1nYVNjcmVlbkV4dGVuc2lvbnNbXSA9IHsKKyAgICAmZHJpUmVhZERyYXdhYmxlRXh0ZW5zaW9uLAorICAgICZkcmlTd2FwQ29udHJvbEV4dGVuc2lvbi5iYXNlLAorICAgICZkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uLmJhc2UsCisgICAgJmRyaU1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvbi5iYXNlLAorICAgIE5VTEwKK307CiAKIHN0YXRpYyBHTGJvb2xlYW4KIG1nYUluaXREcml2ZXIoX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdikKIHsKICAgIG1nYVNjcmVlblByaXZhdGUgKm1nYVNjcmVlbjsKICAgIE1HQURSSVB0ciAgICAgICAgIHNlcnZlckluZm8gPSAoTUdBRFJJUHRyKXNQcml2LT5wRGV2UHJpdjsKLSAgIFBGTkdMWFNDUkVOQUJMRUVYVEVOU0lPTlBST0MgZ2x4X2VuYWJsZV9leHRlbnNpb24gPQotICAgICAgIChQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DKSAoKmRyaV9pbnRlcmZhY2UtPmdldFByb2NBZGRyZXNzKCJnbHhFbmFibGVFeHRlbnNpb24iKSk7Ci0gICB2b2lkICogY29uc3QgcHNjID0gc1ByaXYtPnBzYy0+c2NyZWVuQ29uZmlnczsKIAogICAgaWYgKHNQcml2LT5kZXZQcml2U2l6ZSAhPSBzaXplb2YoTUdBRFJJUmVjKSkgewogICAgICAgZnByaW50ZihzdGRlcnIsIlxuRVJST1IhICBzaXplb2YoTUdBRFJJUmVjKSBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgc2l6ZSBmcm9tIGRldmljZSBkcml2ZXJcbiIpOwpAQCAtMjE2LDcgKzIxMCw3IEBACiAgICBtZ2FTY3JlZW4tPnNQcml2ID0gc1ByaXY7CiAgICBzUHJpdi0+cHJpdmF0ZSA9ICh2b2lkICopbWdhU2NyZWVuOwogCi0gICBpZiAoc1ByaXYtPmRybU1pbm9yID49IDEpIHsKKyAgIGlmIChzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gMSkgewogICAgICAgaW50IHJldDsKICAgICAgIGRybV9tZ2FfZ2V0cGFyYW1fdCBncDsKIApAQCAtMjM0LDEzICsyMjgsNyBAQAogICAgICAgfQogICAgfQogCi0gICBpZiAoIGdseF9lbmFibGVfZXh0ZW5zaW9uICE9IE5VTEwgKSB7Ci0gICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX01FU0Ffc3dhcF9jb250cm9sIiApOwotICAgICAgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX3N3YXBfZnJhbWVfdXNhZ2UiICk7Ci0gICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZCIgKTsKLSAgICAgICgqZ2x4X2VuYWJsZV9leHRlbnNpb24pKCBwc2MsICJHTFhfU0dJX3N3YXBfY29udHJvbCIgKTsKLSAgICAgICgqZ2x4X2VuYWJsZV9leHRlbnNpb24pKCBwc2MsICJHTFhfU0dJX3ZpZGVvX3N5bmMiICk7Ci0gICB9CisgICBzUHJpdi0+ZXh0ZW5zaW9ucyA9IG1nYVNjcmVlbkV4dGVuc2lvbnM7CiAKICAgIGlmIChzZXJ2ZXJJbmZvLT5jaGlwc2V0ICE9IE1HQV9DQVJEX1RZUEVfRzIwMCAmJgogICAgICAgIHNlcnZlckluZm8tPmNoaXBzZXQgIT0gTUdBX0NBUkRfVFlQRV9HNDAwKSB7CkBAIC0yNzMsNyArMjYxLDcgQEAKICAgICAqIHRoZXJlIGlzIGEgbmV3LCBpbi1rZXJuZWwgbWVjaGFuaXNtIGZvciBoYW5kbGluZyB0aGUgd2FpdC4KICAgICAqLwogCi0gICBpZiAobWdhU2NyZWVuLT5zUHJpdi0+ZHJtTWlub3IgPCAyKSB7CisgICBpZiAobWdhU2NyZWVuLT5zUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPCAyKSB7CiAgICAgICBtZ2FTY3JlZW4tPm1taW8uaGFuZGxlID0gc2VydmVySW5mby0+cmVnaXN0ZXJzLmhhbmRsZTsKICAgICAgIG1nYVNjcmVlbi0+bW1pby5zaXplID0gc2VydmVySW5mby0+cmVnaXN0ZXJzLnNpemU7CiAgICAgICBpZiAoIGRybU1hcCggc1ByaXYtPmZkLApAQCAtNDExLDEzICszOTksMTUgQEAKICNlbmRpZgogICAgeyAiR0xfRVhUX3NlY29uZGFyeV9jb2xvciIsICAgICAgICBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yX2Z1bmN0aW9ucyB9LAogICAgeyAiR0xfRVhUX3N0ZW5jaWxfd3JhcCIsICAgICAgICAgICBOVUxMIH0sCisgICB7ICJHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IiwgIEdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3RfZnVuY3Rpb25zIH0sCiAgICB7ICJHTF9NRVNBX3ljYmNyX3RleHR1cmUiLCAgICAgICAgIE5VTEwgfSwKICAgIHsgIkdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIiwgICAgICAgTlVMTCB9LAogICAgeyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBBUkJfdnBfZXh0ZW5zaW9uW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gQVJCX3ZwX2V4dGVuc2lvbnNbXSA9IHsKICAgIHsgIkdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbSIsICAgICAgICAgR0xfQVJCX3ZlcnRleF9wcm9ncmFtX2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMiLCBHTF9FWFRfZ3B1X3Byb2dyYW1fcGFyYW1ldGVyc19mdW5jdGlvbnMgfSwKICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9CiB9OwogCkBAIC02MjIsNyArNjEyLDcgQEAKICAgIH0KIAogICAgaWYgKCBkcmlRdWVyeU9wdGlvbmIoICZtbWVzYS0+b3B0aW9uQ2FjaGUsICJhcmJfdmVydGV4X3Byb2dyYW0iICkgKSB7Ci0gICAgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBjdHgsIEFSQl92cF9leHRlbnNpb24gKTsKKyAgICAgIGRyaUluaXRFeHRlbnNpb25zKGN0eCwgQVJCX3ZwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKICAgIH0KICAgIAogICAgaWYgKCBkcmlRdWVyeU9wdGlvbmIoICZtbWVzYS0+b3B0aW9uQ2FjaGUsICJudl92ZXJ0ZXhfcHJvZ3JhbSIgKSApIHsKQEAgLTY0NiwxMCArNjM2LDcgQEAKIAkJCQkgICAgZGVidWdfY29udHJvbCApOwogI2VuZGlmCiAKLSAgIG1tZXNhLT52YmxhbmtfZmxhZ3MgPSAobW1lc2EtPm1nYVNjcmVlbi0+aXJxID09IDApCi0gICAgICAgPyBWQkxBTktfRkxBR19OT19JUlEgOiBkcmlHZXREZWZhdWx0VkJsYW5rRmxhZ3MoJm1tZXNhLT5vcHRpb25DYWNoZSk7Ci0KLSAgICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiBtbWVzYS0+c3dhcF91c3QgKTsKKyAgICgqc1ByaXYtPnN5c3RlbVRpbWUtPmdldFVTVCkoICYgbW1lc2EtPnN3YXBfdXN0ICk7CiAKICAgIGlmIChkcmlRdWVyeU9wdGlvbmIoJm1tZXNhLT5vcHRpb25DYWNoZSwgIm5vX3Jhc3QiKSkgewogICAgICAgZnByaW50ZihzdGRlcnIsICJkaXNhYmxpbmcgM0QgYWNjZWxlcmF0aW9uXG4iKTsKQEAgLTg3OCw4ICs4NjUsMTQgQEAKICAgICAgIG1nYUNvbnRleHRQdHIgbW1lc2EgPSAobWdhQ29udGV4dFB0cikgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7CiAKICAgICAgIGlmIChtbWVzYS0+ZHJpRHJhd2FibGUgIT0gZHJpRHJhd1ByaXYpIHsKLQkgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiwgbW1lc2EtPnZibGFua19mbGFncywKLQkJCQkmbW1lc2EtPnZibF9zZXEgKTsKKwkgaWYgKGRyaURyYXdQcml2LT5zd2FwX2ludGVydmFsID09ICh1bnNpZ25lZCktMSkgeworCSAgICBkcmlEcmF3UHJpdi0+dmJsRmxhZ3MgPSAobW1lc2EtPm1nYVNjcmVlbi0+aXJxID09IDApCisJICAgICAgID8gVkJMQU5LX0ZMQUdfTk9fSVJRCisJICAgICAgIDogZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZtbWVzYS0+b3B0aW9uQ2FjaGUpOworCisJICAgIGRyaURyYXdhYmxlSW5pdFZCbGFuayggZHJpRHJhd1ByaXYgKTsKKwkgfQorCiAJIG1tZXNhLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OwogCSBtbWVzYS0+ZGlydHkgPSB+MDsgCiAJIG1tZXNhLT5kaXJ0eV9jbGlwcmVjdHMgPSAoTUdBX0ZST05UfE1HQV9CQUNLKTsgCkBAIC05MzMsODggKzkyNiw1MSBAQAogfQogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgbWdhQVBJID0gewotICAgLkluaXREcml2ZXIgICAgICA9IG1nYUluaXREcml2ZXIsCi0gICAuRGVzdHJveVNjcmVlbiAgID0gbWdhRGVzdHJveVNjcmVlbiwKLSAgIC5DcmVhdGVDb250ZXh0ICAgPSBtZ2FDcmVhdGVDb250ZXh0LAotICAgLkRlc3Ryb3lDb250ZXh0ICA9IG1nYURlc3Ryb3lDb250ZXh0LAotICAgLkNyZWF0ZUJ1ZmZlciAgICA9IG1nYUNyZWF0ZUJ1ZmZlciwKLSAgIC5EZXN0cm95QnVmZmVyICAgPSBtZ2FEZXN0cm95QnVmZmVyLAotICAgLlN3YXBCdWZmZXJzICAgICA9IG1nYVN3YXBCdWZmZXJzLAotICAgLk1ha2VDdXJyZW50ICAgICA9IG1nYU1ha2VDdXJyZW50LAotICAgLlVuYmluZENvbnRleHQgICA9IG1nYVVuYmluZENvbnRleHQsCi0gICAuR2V0U3dhcEluZm8gICAgID0gZ2V0U3dhcEluZm8sCi0gICAuR2V0TVNDICAgICAgICAgID0gZHJpR2V0TVNDMzIsCi0gICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAotICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCi0gICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAotfTsKLQotCiAvKioKLSAqIFRoaXMgaXMgdGhlIGJvb3RzdHJhcCBmdW5jdGlvbiBmb3IgdGhlIGRyaXZlci4gIGxpYkdMIHN1cHBsaWVzIGFsbCBvZiB0aGUKLSAqIHJlcXVpc2l0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLCBhbmQgdGhlIGRyaXZlciBpbml0aWFsaXplcyBpdHNlbGYuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBmaWxscyBpbiB0aGUgbGlua2VkIGxpc3QgcG9pbnRlZCB0byBieSBcYyBkcml2ZXJfbW9kZXMKLSAqIHdpdGggdGhlIFxjIF9fR0xjb250ZXh0TW9kZXMgdGhhdCB0aGUgZHJpdmVyIGNhbiBzdXBwb3J0IGZvciB3aW5kb3dzIG9yCi0gKiBwYnVmZmVycy4KKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBjcmVhdGVOZXdTY3JlZW4gZW50cnkgcG9pbnQuCiAgKiAKLSAqIFxyZXR1cm4gQSBwb2ludGVyIHRvIGEgXGMgX19EUklzY3JlZW5Qcml2YXRlIG9uIHN1Y2Nlc3MsIG9yIFxjIE5VTEwgb24gCi0gKiAgICAgICAgIGZhaWx1cmUuCisgKiBcdG9kbyBtYXliZSBmb2xkIHRoaXMgaW50byBpbnRlbEluaXREcml2ZXIKKyAqCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgogICovCi1QVUJMSUMKLXZvaWQgKiBfX2RyaUNyZWF0ZU5ld1NjcmVlbl8yMDA1MDcyNyggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBfX0RSSXNjcmVlbiAqcHNjLAotCQkJICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICogbW9kZXMsCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRkeF92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcmlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJtX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKiBmcmFtZV9idWZmZXIsCi0JCQkgICAgIGRybUFkZHJlc3MgcFNBUkVBLCBpbnQgZmQsIAotCQkJICAgICBpbnQgaW50ZXJuYWxfYXBpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJaW50ZXJmYWNlTWV0aG9kcyAqIGludGVyZmFjZSwKLQkJCSAgICAgX19HTGNvbnRleHRNb2RlcyAqKiBkcml2ZXJfbW9kZXMgKQotCQkJICAgICAKK3N0YXRpYyBjb25zdCBfX0RSSWNvbmZpZyAqKm1nYUluaXRTY3JlZW4oX19EUklzY3JlZW4gKnBzcCkKIHsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwOwogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkZHhfZXhwZWN0ZWQgPSB7IDEsIDIsIDAgfTsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJpX2V4cGVjdGVkID0geyA0LCAwLCAwIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsgMywgMCwgMCB9OwotCi0gICBkcmlfaW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgTUdBRFJJUHRyIGRyaV9wcml2ID0gKE1HQURSSVB0cikgcHNwLT5wRGV2UHJpdjsKIAogICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiTUdBIiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgeworCQkJCSAgICAgICZwc3AtPmRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKQogICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9CiAKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJm1nYUFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgTUdBRFJJUHRyIGRyaV9wcml2ID0gKE1HQURSSVB0cikgcHNwLT5wRGV2UHJpdjsKLSAgICAgICpkcml2ZXJfbW9kZXMgPSBtZ2FGaWxsSW5Nb2RlcyggZHJpX3ByaXYtPmNwcCAqIDgsCi0JCQkJICAgICAgKGRyaV9wcml2LT5jcHAgPT0gMikgPyAxNiA6IDI0LAotCQkJCSAgICAgIChkcmlfcHJpdi0+Y3BwID09IDIpID8gMCAgOiA4LAotCQkJCSAgICAgIChkcmlfcHJpdi0+YmFja09mZnNldCAhPSBkcmlfcHJpdi0+ZGVwdGhPZmZzZXQpICk7CiAKLSAgICAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLCBkb2VzIG5vdCBhY3R1YWxseQotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwKLSAgICAgICAqIHRoZSBleHRlbnNpb25zIHRoYXQgKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCi0gICAgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcyBjYWxsZWQsIGJ1dCB3ZSBjYW4ndAotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYSBjb250ZXh0IHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KLSAgICAgICAqLwotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLSAgICAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBnNDAwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7Ci0gICAgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBOVUxMLCBBUkJfdnBfZXh0ZW5zaW9uICk7Ci0gICAgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgTlZfdnBfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKKyAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLAorICAgICogZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlCisgICAgKiB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQKKyAgICAqICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQorICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUgaXMKKyAgICAqIGNhbGxlZCwgYnV0IHdlIGNhbid0IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEKKyAgICAqIGNvbnRleHQgcG9pbnRlci4KKyAgICAqCisgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PworICAgICovCiAKLSAgIH0KKyAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBjYXJkX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgZzQwMF9leHRlbnNpb25zLCBHTF9GQUxTRSApOworICAgZHJpSW5pdEV4dGVuc2lvbnMoTlVMTCwgQVJCX3ZwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKKyAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBOVl92cF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwogCi0gICByZXR1cm4gKHZvaWQgKikgcHNwOworICAgaWYgKCFtZ2FJbml0RHJpdmVyKHBzcCkpCisgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBtZ2FGaWxsSW5Nb2RlcyggcHNwLAorCQkJICBkcmlfcHJpdi0+Y3BwICogOCwKKwkJCSAgKGRyaV9wcml2LT5jcHAgPT0gMikgPyAxNiA6IDI0LAorCQkJICAoZHJpX3ByaXYtPmNwcCA9PSAyKSA/IDAgIDogOCwKKwkJCSAgKGRyaV9wcml2LT5iYWNrT2Zmc2V0ICE9IGRyaV9wcml2LT5kZXB0aE9mZnNldCkgKTsKIH0KIAogCkBAIC0xMDQzLDMgKzk5OSwyMCBAQAogCiAgICByZXR1cm4gMDsKIH0KKworY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGRyaURyaXZlckFQSSA9IHsKKyAgIC5Jbml0U2NyZWVuICAgICAgPSBtZ2FJbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gICA9IG1nYURlc3Ryb3lTY3JlZW4sCisgICAuQ3JlYXRlQ29udGV4dCAgID0gbWdhQ3JlYXRlQ29udGV4dCwKKyAgIC5EZXN0cm95Q29udGV4dCAgPSBtZ2FEZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICAgPSBtZ2FDcmVhdGVCdWZmZXIsCisgICAuRGVzdHJveUJ1ZmZlciAgID0gbWdhRGVzdHJveUJ1ZmZlciwKKyAgIC5Td2FwQnVmZmVycyAgICAgPSBtZ2FTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudCAgICAgPSBtZ2FNYWtlQ3VycmVudCwKKyAgIC5VbmJpbmRDb250ZXh0ICAgPSBtZ2FVbmJpbmRDb250ZXh0LAorICAgLkdldFN3YXBJbmZvICAgICA9IGdldFN3YXBJbmZvLAorICAgLkdldERyYXdhYmxlTVNDICA9IGRyaURyYXdhYmxlR2V0TVNDMzIsCisgICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAorICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCisgICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fjb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhY29udGV4dC5oCmluZGV4IDZhYTkyMzUuLjY4YmJhOTQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fjb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYWNvbnRleHQuaApAQCAtMjU3LDExICsyNTcsNiBAQAogICAgZHJtQnVmUHRyICB2ZXJ0ZXhfZG1hX2J1ZmZlcjsKICAgIGRybUJ1ZlB0ciAgaWxvYWRfYnVmZmVyOwogCi0gICAvKiBWQkkKLSAgICAqLwotICAgR0x1aW50IHZibF9zZXE7Ci0gICBHTHVpbnQgdmJsYW5rX2ZsYWdzOwotCiAgICBpbnQ2NF90IHN3YXBfdXN0OwogICAgaW50NjRfdCBzd2FwX21pc3NlZF91c3Q7CiAKQEAgLTMzMyw5ICszMjgsOSBAQAogI2RlZmluZSBERUJVR19WRVJCT1NFX1RFWFRVUkUgICAweDA4CiAjZGVmaW5lIERFQlVHX1ZFUkJPU0VfRkFMTEJBQ0sJMHgxMAogCi1zdGF0aWMgX19pbmxpbmVfXyBHTHVpbnQgbWdhUGFja0NvbG9yKEdMdWludCBjcHAsCi0JCQkJICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCi0JCQkJICAgICAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEpCitzdGF0aWMgSU5MSU5FIEdMdWludCBtZ2FQYWNrQ29sb3IoR0x1aW50IGNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSkKIHsKICAgIHN3aXRjaCAoY3BwKSB7CiAgICBjYXNlIDI6CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhZGQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FkZC5jCmluZGV4IDA0MzM2YjUuLmFjN2JmOWYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FkZC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FkZC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSAibWdhX3htZXNhLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAotI2RlZmluZSBEUklWRVJfREFURQkiMjAwNjEwMzAiCisjZGVmaW5lIERSSVZFUl9EQVRFCSIyMDA3MTAxNyIKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhaW9jdGwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5jCmluZGV4IGY4NTg3ZmMuLmRlZTkzOTkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5jCkBAIC01NSw3ICs1NSw3IEBACiB7CiAgICAgaW50IHJldCA9IEVOT1NZUzsKIAotICAgIGlmICggbW1lc2EtPmRyaVNjcmVlbi0+ZHJtTWlub3IgPj0gMiApIHsKKyAgICBpZiAoIG1tZXNhLT5kcmlTY3JlZW4tPmRybV92ZXJzaW9uLm1pbm9yID49IDIgKSB7CiAJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZCggbW1lc2EtPmRyaVNjcmVlbi0+ZmQsIERSTV9NR0FfU0VUX0ZFTkNFLAogCQkJCSAgIGZlbmNlLCBzaXplb2YoIHVpbnQzMl90ICkpOwogCWlmIChyZXQpIHsKQEAgLTczLDcgKzczLDcgQEAKIHsKICAgICBpbnQgcmV0ID0gRU5PU1lTOwogCi0gICAgaWYgKCBtbWVzYS0+ZHJpU2NyZWVuLT5kcm1NaW5vciA+PSAyICkgeworICAgIGlmICggbW1lc2EtPmRyaVNjcmVlbi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gMiApIHsKIAl1aW50MzJfdCB0ZW1wID0gZmVuY2U7CiAJCiAJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZCggbW1lc2EtPmRyaVNjcmVlbi0+ZmQsCkBAIC00MDksNyArNDA5LDcgQEAKIC8qCiAgKiBDb3B5IHRoZSBiYWNrIGJ1ZmZlciB0byB0aGUgZnJvbnQgYnVmZmVyLgogICovCi12b2lkIG1nYUNvcHlCdWZmZXIoIGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApCit2b2lkIG1nYUNvcHlCdWZmZXIoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApCiB7CiAgICBtZ2FDb250ZXh0UHRyIG1tZXNhOwogICAgZHJtX2NsaXBfcmVjdF90ICpwYm94OwpAQCAtNDE3LDcgKzQxNyw3IEBACiAgICBHTGludCByZXQ7CiAgICBHTGludCBpOwogICAgR0xib29sZWFuICAgbWlzc2VkX3RhcmdldDsKLQorICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKIAogICAgYXNzZXJ0KGRQcml2KTsKICAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYpOwpAQCAtNDI4LDExICs0MjgsMTAgQEAKICAgIEZMVVNIX0JBVENIKCBtbWVzYSApOwogCiAgICBtZ2FXYWl0Rm9yRnJhbWVDb21wbGV0aW9uKCBtbWVzYSApOwotICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICYgbW1lc2EtPnZibF9zZXEsIG1tZXNhLT52YmxhbmtfZmxhZ3MsCi0JCSAgICAgJiBtaXNzZWRfdGFyZ2V0ICk7CisgICBkcmlXYWl0Rm9yVkJsYW5rKCBkUHJpdiwgJiBtaXNzZWRfdGFyZ2V0ICk7CiAgICBpZiAoIG1pc3NlZF90YXJnZXQgKSB7CiAgICAgICBtbWVzYS0+c3dhcF9taXNzZWRfY291bnQrKzsKLSAgICAgICh2b2lkKSAoKmRyaV9pbnRlcmZhY2UtPmdldFVTVCkoICYgbW1lc2EtPnN3YXBfbWlzc2VkX3VzdCApOworICAgICAgKHZvaWQpICgqcHNwLT5zeXN0ZW1UaW1lLT5nZXRVU1QpKCAmIG1tZXNhLT5zd2FwX21pc3NlZF91c3QgKTsKICAgIH0KICAgIExPQ0tfSEFSRFdBUkUoIG1tZXNhICk7CiAKQEAgLTQ3MCw3ICs0NjksNyBAQAogCiAgICBtbWVzYS0+ZGlydHkgfD0gTUdBX1VQTE9BRF9DTElQUkVDVFM7CiAgICBtbWVzYS0+c3dhcF9jb3VudCsrOwotICAgKHZvaWQpICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiBtbWVzYS0+c3dhcF91c3QgKTsKKyAgICh2b2lkKSAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJiBtbWVzYS0+c3dhcF91c3QgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhaW9jdGwuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5oCmluZGV4IDlhYTA4YzUuLmRiYzgyM2QgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2Fpb2N0bC5oCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAibWdhY29udGV4dC5oIgogI2luY2x1ZGUgIm1nYV94bWVzYS5oIgogCi12b2lkIG1nYUNvcHlCdWZmZXIoIGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApOwordm9pZCBtZ2FDb3B5QnVmZmVyKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKTsKIHZvaWQgbWdhV2FpdEZvclZCbGFuayggbWdhQ29udGV4dFB0ciBtbWVzYSApOwogCiB2b2lkIG1nYUdldElMb2FkQnVmZmVyTG9ja2VkKCBtZ2FDb250ZXh0UHRyIG1tZXNhICk7CkBAIC02MSw3ICs2MSw3IEBACiAKIGV4dGVybiBkcm1CdWZQdHIgbWdhX2dldF9idWZmZXJfaW9jdGwoIG1nYUNvbnRleHRQdHIgbW1lc2EgKTsKIAotc3RhdGljIF9faW5saW5lCitzdGF0aWMgSU5MSU5FCiBHTHVpbnQgKm1nYUFsbG9jRG1hTG93KCBtZ2FDb250ZXh0UHRyIG1tZXNhLCBpbnQgYnl0ZXMgKQogewogICAgR0x1aW50ICpoZWFkOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYXJlbmRlci5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYXJlbmRlci5jCmluZGV4IGM5ZTQyYTguLjUxY2RkZjEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FyZW5kZXIuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhcmVuZGVyLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAgICBmb3IgKGkgPSAwIDsgaSA8IFZCLT5QcmltaXRpdmVDb3VudCA7IGkrKykKICAgIHsKLSAgICAgIEdMdWludCBwcmltID0gVkItPlByaW1pdGl2ZVtpXS5tb2RlOworICAgICAgR0x1aW50IHByaW0gPSBfdG5sX3RyYW5zbGF0ZV9wcmltKCZWQi0+UHJpbWl0aXZlW2ldKTsKICAgICAgIEdMdWludCBzdGFydCA9IFZCLT5QcmltaXRpdmVbaV0uc3RhcnQ7CiAgICAgICBHTHVpbnQgbGVuZ3RoID0gVkItPlByaW1pdGl2ZVtpXS5jb3VudDsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYXNwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FzcGFuLmMKaW5kZXggMDVkY2JiODUuLjdhYzU5NjYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FzcGFuLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYXNwYW4uYwpAQCAtMTA3LDYgKzEwNyw4IEBACiAKIC8qIDE2IGJpdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVzaG9ydAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKQlcCiAgICAqKEdMdXNob3J0ICopKGJ1ZiArIChfeCkqMiArIChfeSkqcGl0Y2gpID0gZDsKIApAQCAtMTIxLDYgKzEyMyw4IEBACiAKIC8qIDMyIGJpdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMuCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJXAogICAgKihHTHVpbnQgKikoYnVmICsgKF94KSo0ICsgKF95KSpwaXRjaCkgPSBkOwogCkBAIC0xMzQsNiArMTM4LDggQEAKIAogLyogMjQvOCBiaXQgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSB7CQkJXAogICAgR0x1aW50IHRtcCA9ICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqcGl0Y2gpOwlcCiAgICB0bXAgJj0gMHhmZjsJCQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FzdGF0ZS5jCmluZGV4IGMyMGE3NmYuLjFkNDEzZDMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FzdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2FzdGF0ZS5jCkBAIC03NzgsOCArNzc4LDYgQEAKIHsKICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpjb25zdCBkcmlEcmF3YWJsZSA9IG1tZXNhLT5kcmlEcmF3YWJsZTsKICAgIF9fRFJJZHJhd2FibGVQcml2YXRlICpjb25zdCBkcmlSZWFkYWJsZSA9IG1tZXNhLT5kcmlSZWFkYWJsZTsKLSAgIGRybV9tZ2Ffc2FyZWFfdCAqc2FyZWEgPSBtbWVzYS0+c2FyZWE7Ci0KIAogICAgbW1lc2EtPmRpcnR5X2NsaXByZWN0cyA9IDA7CQogCkBAIC03OTAsOSArNzg4LDYgQEAKIAogICAgbWdhX3NldF9jbGlwcmVjdHMobW1lc2EpOwogCi0gICBzYXJlYS0+cmVxX2RyYXdhYmxlID0gZHJpRHJhd2FibGUtPmRyYXc7Ci0gICBzYXJlYS0+cmVxX2RyYXdfYnVmZmVyID0gbW1lc2EtPmRyYXdfYnVmZmVyOwotCiAgICBtZ2FVcGRhdGVDbGlwcGluZyggbW1lc2EtPmdsQ3R4ICk7CiAgICBtZ2FDYWxjVmlld3BvcnQoIG1tZXNhLT5nbEN0eCApOwogfQpAQCAtODA0LDIwICs3OTksMjIgQEAKIAogICAgRkxVU0hfQkFUQ0goIG1tZXNhICk7CiAKLSAgIC8qCi0gICAgKiBfRHJhd0Rlc3RNYXNrIGlzIGVhc2llciB0byBjb3BlIHdpdGggdGhhbiA8bW9kZT4uCi0gICAgKi8KLSAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzICE9IDEpIHsKKyAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLworICAgICAgRkFMTEJBQ0soIGN0eCwgTUdBX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gKSB7CisgICBjYXNlIEJVRkZFUl9GUk9OVF9MRUZUOgogICAgICAgbW1lc2EtPnNldHVwLmRzdG9yZyA9IG1tZXNhLT5tZ2FTY3JlZW4tPmZyb250T2Zmc2V0OwogICAgICAgbW1lc2EtPmRyYXdfYnVmZmVyID0gTUdBX0ZST05UOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOgogICAgICAgbW1lc2EtPnNldHVwLmRzdG9yZyA9IG1tZXNhLT5tZ2FTY3JlZW4tPmJhY2tPZmZzZXQ7CiAgICAgICBtbWVzYS0+ZHJhd19idWZmZXIgPSBNR0FfQkFDSzsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLwogICAgICAgRkFMTEJBQ0soIGN0eCwgTUdBX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CiAgICAgICByZXR1cm47CiAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhdHJpcy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbWdhL21nYXRyaXMuYwppbmRleCAwYzgwODFjLi5kMmE4YTY5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9tZ2EvbWdhdHJpcy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL21nYS9tZ2F0cmlzLmMKQEAgLTY2LDcgKzY2LDcgQEAKIH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBtZ2FfZHJhd190cmlhbmdsZSggbWdhQ29udGV4dFB0ciBtbWVzYSwKK3N0YXRpYyB2b2lkIElOTElORSBtZ2FfZHJhd190cmlhbmdsZSggbWdhQ29udGV4dFB0ciBtbWVzYSwKIAkJCQkJICAgbWdhVmVydGV4UHRyIHYwLAogCQkJCQkgICBtZ2FWZXJ0ZXhQdHIgdjEsCiAJCQkJCSAgIG1nYVZlcnRleFB0ciB2MiApCkBAIC04MSw3ICs4MSw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBtZ2FfZHJhd19xdWFkKCBtZ2FDb250ZXh0UHRyIG1tZXNhLAorc3RhdGljIHZvaWQgSU5MSU5FIG1nYV9kcmF3X3F1YWQoIG1nYUNvbnRleHRQdHIgbW1lc2EsCiAJCQkJICAgICAgIG1nYVZlcnRleFB0ciB2MCwKIAkJCQkgICAgICAgbWdhVmVydGV4UHRyIHYxLAogCQkJCSAgICAgICBtZ2FWZXJ0ZXhQdHIgdjIsCkBAIC0xMDAsNyArMTAwLDcgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9kcmF3X3BvaW50KCBtZ2FDb250ZXh0UHRyIG1tZXNhLAorc3RhdGljIElOTElORSB2b2lkIG1nYV9kcmF3X3BvaW50KCBtZ2FDb250ZXh0UHRyIG1tZXNhLAogCQkJCQltZ2FWZXJ0ZXhQdHIgdG1wICkKIHsKICAgIGNvbnN0IEdMZmxvYXQgc3ogPSAwLjUgKiBDTEFNUChtbWVzYS0+Z2xDdHgtPlBvaW50LlNpemUsCkBAIC0xNTksNyArMTU5LDcgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9kcmF3X2xpbmUoIG1nYUNvbnRleHRQdHIgbW1lc2EsCitzdGF0aWMgSU5MSU5FIHZvaWQgbWdhX2RyYXdfbGluZSggbWdhQ29udGV4dFB0ciBtbWVzYSwKIAkJCQkgICAgICBtZ2FWZXJ0ZXhQdHIgdjAsCiAJCQkJICAgICAgbWdhVmVydGV4UHRyIHYxICkKIHsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQyZGU1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIHNyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvTWFrZWZpbGUKLQotVE9QID0gLi4vLi4vLi4vLi4vLi4KLWluY2x1ZGUgJChUT1ApL2NvbmZpZ3MvY3VycmVudAotCi1MSUJOQU1FID0gbm91dmVhdV9kcmkuc28KLQotTUlOSUdMWF9TT1VSQ0VTID0gCi0KLURSSVZFUl9TT1VSQ0VTID0gXAotCW5vdXZlYXVfYnVmZmVyb2JqLmMgICAgICBcCi0Jbm91dmVhdV9idWZmZXJzLmMgICAgICAgIFwKLQlub3V2ZWF1X2NhcmQuYyAgICAgICAgICAgXAotCW5vdXZlYXVfY29udGV4dC5jICAgICAgICBcCi0Jbm91dmVhdV9kcml2ZXIuYyAgICAgICAgIFwKLQlub3V2ZWF1X2ZpZm8uYyAgICAgICAgICAgXAotCW5vdXZlYXVfbG9jay5jICAgICAgICAgICBcCi0Jbm91dmVhdV9vYmplY3QuYyAgICAgICAgIFwKLQlub3V2ZWF1X3NjcmVlbi5jICAgICAgICAgXAotCW5vdXZlYXVfc3Bhbi5jICAgICAgICAgICBcCi0Jbm91dmVhdV9zdGF0ZS5jICAgICAgICAgIFwKLQlub3V2ZWF1X3N0YXRlX2NhY2hlLmMgICAgXAotCW5vdXZlYXVfc2hhZGVyLmMgICAgICAgICBcCi0Jbm91dmVhdV9zaGFkZXJfMC5jICAgICAgIFwKLQlub3V2ZWF1X3NoYWRlcl8xLmMgICAgICAgXAotCW5vdXZlYXVfc2hhZGVyXzIuYyAgICAgICBcCi0Jbm91dmVhdV90ZXguYyAgICAgICAgICAgIFwKLQlub3V2ZWF1X3N3dGNsLmMgICAgICAgICAgXAotCW5vdXZlYXVfc3luYy5jICAgICAgICAgICBcCi0Jbm91dmVhdV9xdWVyeS5jICAgICAgICAgIFwKLQludjA0X3N0YXRlLmMgICAgICAgICAgICAgXAotCW52MDRfc3d0Y2wuYyAgICAgICAgICAgICBcCi0JbnYxMF9zdGF0ZS5jICAgICAgICAgICAgIFwKLQludjEwX3N3dGNsLmMgICAgICAgICAgICAgXAotCW52MjBfc3RhdGUuYyAgICAgICAgICAgICBcCi0JbnYyMF92ZXJ0cHJvZy5jICAgICAgICAgIFwKLQludjMwX3N0YXRlLmMgICAgICAgICAgICAgXAotCW52MzBfZnJhZ3Byb2cuYyAgICAgICAgICBcCi0JbnYzMF92ZXJ0cHJvZy5jICAgICAgICAgIFwKLQludjQwX2ZyYWdwcm9nLmMgICAgICAgICAgXAotCW52NDBfdmVydHByb2cuYyAgICAgICAgICBcCi0JbnY1MF9zdGF0ZS5jCi0KLUNfU09VUkNFUyA9IFwKLQkkKENPTU1PTl9TT1VSQ0VTKSBcCi0JJChEUklWRVJfU09VUkNFUykgCi0KLUFTTV9TT1VSQ0VTID0gCi0KLQotaW5jbHVkZSAuLi9NYWtlZmlsZS50ZW1wbGF0ZQotCi1zeW1saW5rczoKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9idWZmZXJvYmouYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9idWZmZXJvYmouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxNDA2MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfYnVmZmVyb2JqLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotI2luY2x1ZGUgImJ1ZmZlcm9iai5oIgotI2luY2x1ZGUgImVudW1zLmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2J1ZmZlcm9iai5oIgotI2luY2x1ZGUgIm5vdXZlYXVfYnVmZmVycy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLSNpbmNsdWRlICJub3V2ZWF1X21zZy5oIgotCi0jZGVmaW5lIE5PVVZFQVVfTUVNX0ZSRUUobWVtKSBkbyB7ICAgICAgXAotCW5vdXZlYXVfbWVtX2ZyZWUoY3R4LCAobWVtKSk7ICAgXAotCShtZW0pID0gTlVMTDsgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIERFQlVHKGZtdCxhcmdzLi4uKSBkbyB7ICAgICAgICAgICAgICAgIFwKLQlpZiAoTk9VVkVBVV9ERUJVRyAmIERFQlVHX0JVRkZFUk9CSikgeyBcCi0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICJmbXQsIF9fZnVuY19fLCAjI2FyZ3MpOyAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUoMCkKLQotc3RhdGljIEdMYm9vbGVhbgotbm91dmVhdV9ib19kb3dubG9hZF9mcm9tX3NjcmVlbihHTGNvbnRleHQgKmN0eCwJR0x1aW50IG9mZnNldCwgR0x1aW50IHNpemUsCi0JCQkJCQlzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQlub3V2ZWF1X21lbSAqaW5fbWVtOwotCi0JREVCVUcoImJvPSVwLCBvZmZzZXQ9JWQsIHNpemU9JWRcbiIsIGJvLCBvZmZzZXQsIHNpemUpOwotCi0JLyogSWYgdGhlcmUncyBhIHBlcm1hbmVudCBiYWNraW5nIHN0b3JlLCBibGl0IGRpcmVjdGx5IGludG8gaXQgKi8KLQlpZiAobmJvLT5jcHVfbWVtKSB7Ci0JCWlmIChuYm8tPmNwdV9tZW0gIT0gbmJvLT5ncHVfbWVtKSB7Ci0JCQlERUJVRygiLi5jcHVfbWVtXG4iKTsKLQkJCW5vdXZlYXVfbWVtZm9ybWF0X2ZsYXRfZW1pdChjdHgsIG5iby0+Y3B1X21lbSwKLQkJCQkJCSAgICBuYm8tPmdwdV9tZW0sCi0JCQkJCQkgICAgb2Zmc2V0LCBvZmZzZXQsIHNpemUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJREVCVUcoIi4uc3lzX21lbVxuIik7Ci0JCWluX21lbSA9IG5vdXZlYXVfbWVtX2FsbG9jKGN0eCwgTk9VVkVBVV9NRU1fQUdQLCBzaXplLCAwKTsKLQkJaWYgKGluX21lbSkgewotCQkJREVCVUcoIi4uLi52aWEgR0FSVFxuIik7Ci0JCQkvKiBvdGhlcndpc2UsIHRyeSBibGl0dGluZyB0byBmYXN0ZXIgbWVtb3J5IGFuZAotCQkJICogY29weWluZyBmcm9tIHRoZXJlCi0JCQkgKi8KLQkJCW5vdXZlYXVfbWVtZm9ybWF0X2ZsYXRfZW1pdChjdHgsIGluX21lbSwgbmJvLT5ncHVfbWVtLAotCQkJCQkJCSAwLCBvZmZzZXQsIHNpemUpOwotCQkJbm91dmVhdV9ub3RpZmllcl93YWl0X25vcChjdHgsIG5tZXNhLT5zeW5jTm90aWZpZXIsCi0JCQkJCQkgICAgICAgTnZTdWJNZW1Gb3JtYXQpOwotCQkJX21lc2FfbWVtY3B5KG5iby0+Y3B1X21lbV9zeXMgKyBvZmZzZXQsCi0JCQkJCWluX21lbS0+bWFwLCBzaXplKTsKLQkJCU5PVVZFQVVfTUVNX0ZSRUUoaW5fbWVtKTsKLQkJfSBlbHNlIHsKLQkJCURFQlVHKCIuLi4uZGlyZWN0IFZSQU0gY29weVxuIik7Ci0JCQkvKiB3b3JzdCBjYXNlLCBjb3B5IGRpcmVjdGx5IGZyb20gdnJhbSAqLwotCQkJX21lc2FfbWVtY3B5KG5iby0+Y3B1X21lbV9zeXMgKyBvZmZzZXQsCi0JCQkJICAgICBuYm8tPmdwdV9tZW0gKyBvZmZzZXQsCi0JCQkJICAgICBzaXplKTsKLQkJfQotCX0KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1ub3V2ZWF1X2JvX3VwbG9hZF90b19zY3JlZW4oR0xjb250ZXh0ICpjdHgsIEdMdWludCBvZmZzZXQsIEdMdWludCBzaXplLAotCQkJCQkgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jbm91dmVhdV9idWZmZXJfb2JqZWN0ICpuYm8gPSAobm91dmVhdV9idWZmZXJfb2JqZWN0ICopYm87Ci0Jbm91dmVhdV9tZW0gKm91dF9tZW07Ci0KLQlERUJVRygiYm89JXAsIG9mZnNldD0lZCwgc2l6ZT0lZFxuIiwgYm8sIG9mZnNldCwgc2l6ZSk7Ci0KLQlpZiAobmJvLT5jcHVfbWVtKSB7Ci0JCWlmIChuYm8tPmNwdV9tZW0gIT0gbmJvLT5ncHVfbWVtKSB7Ci0JCQlERUJVRygiLi5jcHVfbWVtXG4iKTsKLQkJCW5vdXZlYXVfbWVtZm9ybWF0X2ZsYXRfZW1pdChjdHgsIG5iby0+Z3B1X21lbSwKLQkJCQkJCSAgICBuYm8tPmNwdV9tZW0sCi0JCQkJCQkgICAgb2Zmc2V0LCBvZmZzZXQsIHNpemUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJb3V0X21lbSA9IG5vdXZlYXVfbWVtX2FsbG9jKGN0eCwgTk9VVkVBVV9NRU1fQUdQIHwKLQkJCQkJCSBOT1VWRUFVX01FTV9NQVBQRUQsCi0JCQkJCQkgc2l6ZSwgMCk7Ci0JCWlmIChvdXRfbWVtKSB7Ci0JCQlERUJVRygiLi4uLnZpYSBHQVJUXG4iKTsKLQkJCV9tZXNhX21lbWNweShvdXRfbWVtLT5tYXAsCi0JCQkJCW5iby0+Y3B1X21lbV9zeXMgKyBvZmZzZXQsIHNpemUpOwotCQkJbm91dmVhdV9tZW1mb3JtYXRfZmxhdF9lbWl0KGN0eCwgbmJvLT5ncHVfbWVtLCBvdXRfbWVtLAotCQkJCQkJICAgIG9mZnNldCwgMCwgc2l6ZSk7Ci0JCQlub3V2ZWF1X25vdGlmaWVyX3dhaXRfbm9wKGN0eCwgbm1lc2EtPnN5bmNOb3RpZmllciwKLQkJCQkJCSAgICAgICBOdlN1Yk1lbUZvcm1hdCk7Ci0JCQlOT1VWRUFVX01FTV9GUkVFKG91dF9tZW0pOwotCQl9IGVsc2UgewotCQkJREVCVUcoIi4uLi5kaXJlY3QgVlJBTSBjb3B5XG4iKTsKLQkJCV9tZXNhX21lbWNweShuYm8tPmdwdV9tZW0tPm1hcCArIG9mZnNldCwKLQkJCQkgICAgIG5iby0+Y3B1X21lbV9zeXMgKyBvZmZzZXQsCi0JCQkJICAgICBzaXplKTsKLQkJfQotCX0KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi1HTGJvb2xlYW4KLW5vdXZlYXVfYm9fbW92ZV9pbihHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKQotewotCW5vdXZlYXVfYnVmZmVyX29iamVjdCAqbmJvID0gKG5vdXZlYXVfYnVmZmVyX29iamVjdCAqKWJvOwotCi0JREVCVUcoImJvPSVwXG4iLCBibyk7Ci0KLQlpZiAoYm8tPk9uQ2FyZCkKLQkJcmV0dXJuIEdMX1RSVUU7Ci0JYXNzZXJ0KG5iby0+Z3B1X21lbV9mbGFncyk7Ci0KLQluYm8tPmdwdV9tZW0gPSBub3V2ZWF1X21lbV9hbGxvYyhjdHgsIG5iby0+Z3B1X21lbV9mbGFncyB8Ci0JCQkJCSAgICAgIE5PVVZFQVVfTUVNX01BUFBFRCwKLQkJCQkJICAgICAgYm8tPlNpemUsIDApOwotCWFzc2VydChuYm8tPmdwdV9tZW0pOwotCi0JaWYgKG5iby0+Y3B1X21lbV9mbGFncykgewotCQlpZiAoKG5iby0+Y3B1X21lbV9mbGFnc3xOT1VWRUFVX01FTV9NQVBQRUQpICE9IG5iby0+Z3B1X21lbS0+dHlwZSkgewotCQkJREVCVUcoIi4ubmVlZCBjcHVfbWVtIGJ1ZmZlclxuIik7Ci0KLQkJCW5iby0+Y3B1X21lbSA9IG5vdXZlYXVfbWVtX2FsbG9jKGN0eCwKLQkJCQkJCQkgbmJvLT5jcHVfbWVtX2ZsYWdzIHwKLQkJCQkJCQkgTk9VVkVBVV9NRU1fTUFQUEVELAotCQkJCQkJCSBiby0+U2l6ZSwgMCk7Ci0KLQkJCWlmIChuYm8tPmNwdV9tZW0pIHsKLQkJCQlERUJVRygiLi4uLmFsbG9jIG9rLCBraWxsIHN5c19tZW0gYnVmZmVyXG4iKTsKLQkJCQlfbWVzYV9tZW1jcHkobmJvLT5jcHVfbWVtLT5tYXAsCi0JCQkJCSAgICAgbmJvLT5jcHVfbWVtX3N5cywgYm8tPlNpemUpOwotCQkJCUZSRUUobmJvLT5jcHVfbWVtX3N5cyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlERUJVRygiLi5jcHUgZGlyZWN0IGFjY2VzcyB0byBHUFUgYnVmZmVyXG4iKTsKLQkJCW5iby0+Y3B1X21lbSA9IG5iby0+Z3B1X21lbTsKLQkJfQotCX0KLQlub3V2ZWF1X2JvX3VwbG9hZF90b19zY3JlZW4oY3R4LCAwLCBiby0+U2l6ZSwgYm8pOwotCi0JYm8tPk9uQ2FyZCA9IEdMX1RSVUU7Ci0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLUdMYm9vbGVhbgotbm91dmVhdV9ib19tb3ZlX291dChHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jbm91dmVhdV9idWZmZXJfb2JqZWN0ICpuYm8gPSAobm91dmVhdV9idWZmZXJfb2JqZWN0ICopYm87Ci0JR0x1aW50IG5yX2RpcnR5OwotCi0JREVCVUcoImJvPSVwXG4iLCBibyk7Ci0JaWYgKCFiby0+T25DYXJkKQotCQlyZXR1cm4gR0xfVFJVRTsKLQotCW5yX2RpcnR5ID0gbm91dmVhdV9ib19kb3dubG9hZF9kaXJ0eShjdHgsIGJvKTsKLQlpZiAobmJvLT5jcHVfbWVtKSB7Ci0JCWlmIChucl9kaXJ0eSAmJiBuYm8tPmNwdV9tZW0gIT0gbmJvLT5ncHVfbWVtKQotCQkJbm91dmVhdV9ub3RpZmllcl93YWl0X25vcChjdHgsIG5tZXNhLT5zeW5jTm90aWZpZXIsCi0JCQkJCQkgICAgICAgTnZTdWJNZW1Gb3JtYXQpOwotCQlERUJVRygiLi5kZXN0cm95IGNwdV9tZW0gYnVmZmVyXG4iKTsKLQkJbmJvLT5jcHVfbWVtX3N5cyA9IG1hbGxvYyhiby0+U2l6ZSk7Ci0JCWFzc2VydChuYm8tPmNwdV9tZW1fc3lzKTsKLQkJX21lc2FfbWVtY3B5KG5iby0+Y3B1X21lbV9zeXMsIG5iby0+Y3B1X21lbS0+bWFwLCBiby0+U2l6ZSk7Ci0JCWlmIChuYm8tPmNwdV9tZW0gPT0gbmJvLT5ncHVfbWVtKQotCQkJbmJvLT5jcHVfbWVtID0gTlVMTDsKLQkJZWxzZQotCQkJTk9VVkVBVV9NRU1fRlJFRShuYm8tPmNwdV9tZW0pOwotCX0KLQlOT1VWRUFVX01FTV9GUkVFKG5iby0+Z3B1X21lbSk7Ci0KLQliby0+T25DYXJkID0gR0xfRkFMU0U7Ci0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X2JvX2Nob29zZV9zdG9yYWdlX21ldGhvZChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHVzYWdlLAotCQkJCQkJIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibykKLXsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQlHTHVpbnQgZ3B1X3R5cGUgPSAwOwotCUdMdWludCBjcHVfdHlwZSA9IDA7Ci0KLQlzd2l0Y2ggKHVzYWdlKSB7Ci0JLyogQ2xpZW50IHNvdXJjZSwgY2hhbmdlcyBvZnRlbiwgdXNlZCBieSBHTCBtYW55IHRpbWVzICovCi0JY2FzZSBHTF9EWU5BTUlDX0RSQVdfQVJCOgotCQlncHVfdHlwZSA9IE5PVVZFQVVfTUVNX0FHUCB8IE5PVVZFQVVfTUVNX0ZCX0FDQ0VQVEFCTEU7Ci0JCWNwdV90eXBlID0gTk9VVkVBVV9NRU1fQUdQOwotCQlicmVhazsKLQkvKiBHTCBzb3VyY2UsIGNoYW5nZXMgb2Z0ZW4sIGNsaWVudCByZWFkcyBtYW55IHRpbWVzICovCi0JY2FzZSBHTF9EWU5BTUlDX1JFQURfQVJCOgotCS8qIENsaWVudCBzb3VyY2UsIHNwZWNpZmllZCBvbmNlLCB1c2VkIGJ5IEdMIG1hbnkgdGltZXMgKi8KLQljYXNlIEdMX1NUQVRJQ19EUkFXX0FSQjoKLQkvKiBHTCBzb3VyY2UsIHNwZWNpZmllZCBvbmNlLCBjbGllbnQgcmVhZHMgbWFueSB0aW1lcyAqLwotCWNhc2UgR0xfU1RBVElDX1JFQURfQVJCOgotCS8qIENsaWVudCBzb3VyY2UsIHNwZWNpZmllZCBvbmNlLCB1c2VkIGJ5IEdMIGEgZmV3IHRpbWVzICovCi0JY2FzZSBHTF9TVFJFQU1fRFJBV19BUkI6Ci0JLyogR0wgc291cmNlLCBzcGVjaWZpZWQgb25jZSwgY2xpZW50IHJlYWRzIGEgZmV3IHRpbWVzICovCi0JY2FzZSBHTF9TVFJFQU1fUkVBRF9BUkI6Ci0JLyogR0wgc291cmNlLCBjaGFuZ2VzIG9mdGVuLCB1c2VkIGJ5IEdMIG1hbnkgdGltZXMqLwotCWNhc2UgR0xfRFlOQU1JQ19DT1BZX0FSQjoKLQkvKiBHTCBzb3VyY2UsIHNwZWNpZmllZCBvbmNlLCB1c2VkIGJ5IEdMIG1hbnkgdGltZXMgKi8KLQljYXNlIEdMX1NUQVRJQ19DT1BZX0FSQjoKLQkvKiBHTCBzb3VyY2UsIHNwZWNpZmllZCBvbmNlLCB1c2VkIGJ5IEdMIGEgZmV3IHRpbWVzICovCi0JY2FzZSBHTF9TVFJFQU1fQ09QWV9BUkI6Ci0JCWdwdV90eXBlID0gTk9VVkVBVV9NRU1fRkI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6IAotCQlhc3NlcnQoMCk7Ci0JfQotCi0JbmJvLT5ncHVfbWVtX2ZsYWdzID0gZ3B1X3R5cGU7Ci0JbmJvLT5jcHVfbWVtX2ZsYWdzID0gY3B1X3R5cGU7Ci0JbmJvLT51c2FnZQkgICA9IHVzYWdlOwotfQotCi12b2lkCi1ub3V2ZWF1X2JvX2luaXRfc3RvcmFnZShHTGNvbnRleHQgKmN0eCwJR0x1aW50IHZhbGlkX2dwdV9hY2Nlc3MsCi0JCQkJCUdMc2l6ZWlwdHJBUkIgc2l6ZSwKLQkJCQkJY29uc3QgR0x2b2lkICpkYXRhLAotCQkJCQlHTGVudW0gdXNhZ2UsCi0JCQkJCXN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibykKLXsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQotCURFQlVHKCJibz0lcFxuIiwgYm8pOwotCi0JLyogRnJlZSB1cCBwcmV2aW91cyBidWZmZXJzIGlmIHdlIGNhbid0IHJldXNlIHRoZW0gKi8KLQlpZiAobmJvLT51c2FnZSAhPSB1c2FnZSB8fAotCQkJKG5iby0+Z3B1X21lbSAmJiAobmJvLT5ncHVfbWVtLT5zaXplICE9IHNpemUpKSkgewotCQlpZiAobmJvLT5jcHVfbWVtX3N5cykKLQkJCUZSRUUobmJvLT5jcHVfbWVtX3N5cyk7Ci0JCWlmIChuYm8tPmNwdV9tZW0pIHsKLQkJCWlmIChuYm8tPmNwdV9tZW0gIT0gbmJvLT5ncHVfbWVtKQotCQkJCU5PVVZFQVVfTUVNX0ZSRUUobmJvLT5jcHVfbWVtKTsKLQkJCWVsc2UKLQkJCQluYm8tPmNwdV9tZW0gPSBOVUxMOwotCQl9Ci0JCWlmIChuYm8tPmdwdV9tZW0pCi0JCQlOT1VWRUFVX01FTV9GUkVFKG5iby0+Z3B1X21lbSk7Ci0KLQkJYm8tPk9uQ2FyZCA9IEdMX0ZBTFNFOwotCQluYm8tPmNwdV9tZW1fc3lzID0gY2FsbG9jKDEsIHNpemUpOwotCX0KLQotCW5vdXZlYXVfYm9fY2hvb3NlX3N0b3JhZ2VfbWV0aG9kKGN0eCwgdXNhZ2UsIGJvKTsKLQkvKiBGb3JjZSBvZmYgZmxhZ3MgdGhhdCBtYXkgbm90IGJlIG9rIGZvciBhIGdpdmVuIGJ1ZmZlciAqLwotCW5iby0+Z3B1X21lbV9mbGFncyAmPSB2YWxpZF9ncHVfYWNjZXNzOwotCi0JYm8tPlVzYWdlICA9IHVzYWdlOwotCWJvLT5TaXplICAgPSBzaXplOwotCi0JaWYgKGRhdGEpIHsKLQkJR0x2b2lkICptYXAgPSBub3V2ZWF1X2JvX21hcChjdHgsIEdMX1dSSVRFX09OTFlfQVJCLCBibyk7Ci0JCV9tZXNhX21lbWNweShtYXAsIGRhdGEsIHNpemUpOwotCQlub3V2ZWF1X2JvX2RpcnR5X2FsbChjdHgsIEdMX0ZBTFNFLCBibyk7Ci0JCW5vdXZlYXVfYm9fdW5tYXAoY3R4LCBibyk7Ci0JfQotfQotCi12b2lkICoKLW5vdXZlYXVfYm9fbWFwKEdMY29udGV4dCAqY3R4LCBHTGVudW0gYWNjZXNzLCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQotCURFQlVHKCJibz0lcCwgYWNjZXNzPSVzXG4iLCBibywgX21lc2FfbG9va3VwX2VudW1fYnlfbnIoYWNjZXNzKSk7Ci0KLQlpZiAoYm8tPk9uQ2FyZCAmJiAKLQkJKGFjY2VzcyA9PSBHTF9SRUFEX09OTFlfQVJCIHx8IGFjY2VzcyA9PSBHTF9SRUFEX1dSSVRFX0FSQikpIHsKLQkJR0x1aW50IG5yX2RpcnR5OwotCi0JCURFQlVHKCIuLm9uIGNhcmRcbiIpOwotCQlucl9kaXJ0eSA9IG5vdXZlYXVfYm9fZG93bmxvYWRfZGlydHkoY3R4LCBibyk7Ci0KLQkJLyogbm91dmVhdV9ib19kb3dubG9hZF9kaXJ0eSB3b24ndCB3YWl0IHVubGVzcyBpdCBuZWVkcyB0bwotCQkgKiBmcmVlIGEgdGVtcCBidWZmZXIsIHdoaWNoIGlzbid0IHRoZSBjYXNlIGlmIGNwdV9tZW0gaXMKLQkJICogcHJlc2VudC4KLQkJICovCi0JCWlmIChucl9kaXJ0eSAmJiBuYm8tPmNwdV9tZW0gJiYgbmJvLT5jcHVfbWVtICE9IG5iby0+Z3B1X21lbSkKLQkJCW5vdXZlYXVfbm90aWZpZXJfd2FpdF9ub3AoY3R4LCBubWVzYS0+c3luY05vdGlmaWVyLAotCQkJCQkJICAgICAgIE52U3ViTWVtRm9ybWF0KTsKLQl9Ci0KLQlpZiAobmJvLT5jcHVfbWVtKSB7Ci0JCURFQlVHKCIuLmFjY2VzcyB2aWEgY3B1X21lbVxuIik7Ci0JCXJldHVybiBuYm8tPmNwdV9tZW0tPm1hcDsKLQl9IGVsc2UgewotCQlERUJVRygiLi5hY2Nlc3MgdmlhIGNwdV9tZW1fc3lzXG4iKTsKLQkJcmV0dXJuIG5iby0+Y3B1X21lbV9zeXM7Ci0JfQotfQotCi12b2lkCi1ub3V2ZWF1X2JvX3VubWFwKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pCi17Ci0JREVCVUcoInVubWFwIGJvPSVwXG4iLCBibyk7Ci19Ci0KLXVpbnQzMl90Ci1ub3V2ZWF1X2JvX2dwdV9yZWYoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibykKLXsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQotCWFzc2VydChuYm8tPm1hcHBlZCA9PSBHTF9GQUxTRSk7Ci0KLQlERUJVRygiZ3B1X3JlZlxuIik7Ci0JCi0JaWYgKCFiby0+T25DYXJkKSB7Ci0JCW5vdXZlYXVfYm9fbW92ZV9pbihjdHgsIGJvKTsKLQkJYm8tPk9uQ2FyZCA9IEdMX1RSVUU7Ci0JfQotCW5vdXZlYXVfYm9fdXBsb2FkX2RpcnR5KGN0eCwgYm8pOwotCi0JcmV0dXJuIG5vdXZlYXVfbWVtX2dwdV9vZmZzZXRfZ2V0KGN0eCwgbmJvLT5ncHVfbWVtKTsKLX0KLQotdm9pZAotbm91dmVhdV9ib19kaXJ0eV9saW5lYXIoR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBvbl9jYXJkLAotCQkJdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAotCQkJc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKQotewotCW5vdXZlYXVfYnVmZmVyX29iamVjdCAqbmJvID0gKG5vdXZlYXVfYnVmZmVyX29iamVjdCAqKWJvOwotCW5vdXZlYXVfYnVmZmVyb2JqX2RpcnR5ICpkaXJ0eTsKLQl1aW50MzJfdCBzdGFydCA9IG9mZnNldDsKLQl1aW50MzJfdCBlbmQgPSBvZmZzZXQgKyBzaXplOwotCWludCBpOwotCi0JaWYgKG5iby0+Y3B1X21lbSA9PSBuYm8tPmdwdV9tZW0pCi0JCXJldHVybjsKLQotCWRpcnR5ID0gb25fY2FyZCA/ICZuYm8tPmdwdV9kaXJ0eSA6ICZuYm8tPmNwdV9kaXJ0eTsKLQotCURFQlVHKCJvbl9jYXJkPSVkLCBvZmZzZXQ9JWQsIHNpemU9JWQsIGJvPSVwXG4iLAotCQkJb25fY2FyZCwgb2Zmc2V0LCBzaXplLCBibyk7Ci0KLQlmb3IgKGk9MDsgaTxkaXJ0eS0+bnJfZGlydHk7IGkrKykgewotCQlub3V2ZWF1X2J1ZmZlcm9ial9yZWdpb24gKnIgPSAmZGlydHktPmRpcnR5W2ldOwotCi0JCS8qIGFscmVhZHkgZGlydHkgKi8KLQkJaWYgKHN0YXJ0ID49IHItPnN0YXJ0ICYmIGVuZCA8PSByLT5lbmQpIHsKLQkJCURFQlVHKCIuLmFscmVhZHkgZGlydHlcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogYWRkIHRvIHRoZSBlbmQgb2YgYSByZWdpb24gKi8KLQkJaWYgKHN0YXJ0ID49IHItPnN0YXJ0ICYmIHN0YXJ0IDw9IHItPmVuZCkgewotCQkJaWYgKGVuZCA+IHItPmVuZCkgewotCQkJCURFQlVHKCIuLmV4dGVuZCBlbmQgb2YgcmVnaW9uXG4iKTsKLQkJCQlyLT5lbmQgPSBlbmQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogYWRkIHRvIHRoZSBzdGFydCBvZiBhIHJlZ2lvbiAqLwotCQlpZiAoc3RhcnQgPCByLT5zdGFydCAmJiBlbmQgPj0gci0+ZW5kKSB7Ci0JCQlERUJVRygiLi5leHRlbmQgc3RhcnQgb2YgcmVnaW9uXG4iKTsKLQkJCXItPnN0YXJ0ID0gc3RhcnQ7Ci0JCQkvKiAuLiBhbmQgdG8gdGhlIGVuZCAqLwotCQkJaWYgKGVuZCA+IHItPmVuZCkgewotCQkJCURFQlVHKCIuLi4uYW5kIGVuZFxuIik7Ci0JCQkJci0+ZW5kID0gZW5kOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyogbmV3IHJlZ2lvbiAqLwotCURFQlVHKCIuLm5ldyBkaXJ0eVxuIik7Ci0JZGlydHktPm5yX2RpcnR5Kys7Ci0JZGlydHktPmRpcnR5ID0gcmVhbGxvYyhkaXJ0eS0+ZGlydHksCi0JCQkgICAgICAgc2l6ZW9mKG5vdXZlYXVfYnVmZmVyb2JqX3JlZ2lvbikgKgotCQkJICAgICAgIGRpcnR5LT5ucl9kaXJ0eSk7Ci0JZGlydHktPmRpcnR5W2RpcnR5LT5ucl9kaXJ0eSAtIDFdLnN0YXJ0ID0gc3RhcnQ7Ci0JZGlydHktPmRpcnR5W2RpcnR5LT5ucl9kaXJ0eSAtIDFdLmVuZCAgID0gZW5kOwotfQotCi12b2lkCi1ub3V2ZWF1X2JvX2RpcnR5X2FsbChHTGNvbnRleHQgKmN0eCwgR0xib29sZWFuIG9uX2NhcmQsCi0JCSAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKQotewotCW5vdXZlYXVfYnVmZmVyX29iamVjdCAqbmJvID0gKG5vdXZlYXVfYnVmZmVyX29iamVjdCAqKWJvOwotCW5vdXZlYXVfYnVmZmVyb2JqX2RpcnR5ICpkaXJ0eTsKLQotCWRpcnR5ID0gb25fY2FyZCA/ICZuYm8tPmdwdV9kaXJ0eSA6ICZuYm8tPmNwdV9kaXJ0eTsKLQkKLQlERUJVRygiZGlydHkgYWxsXG4iKTsKLQlpZiAoZGlydHktPm5yX2RpcnR5KSB7Ci0JCUZSRUUoZGlydHktPmRpcnR5KTsKLQkJZGlydHktPmRpcnR5ICAgID0gTlVMTDsKLQkJZGlydHktPm5yX2RpcnR5ID0gMDsKLQl9Ci0KLQlub3V2ZWF1X2JvX2RpcnR5X2xpbmVhcihjdHgsIG9uX2NhcmQsIDAsIGJvLT5TaXplLCBibyk7Ci19Ci0KLUdMdWludAotbm91dmVhdV9ib191cGxvYWRfZGlydHkoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibykKLXsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQlub3V2ZWF1X2J1ZmZlcm9ial9kaXJ0eSAqZGlydHkgPSAmbmJvLT5jcHVfZGlydHk7Ci0JR0x1aW50IG5yX2RpcnR5OwotCWludCBpOwotCi0JbnJfZGlydHkgPSBkaXJ0eS0+bnJfZGlydHk7Ci0JaWYgKCFucl9kaXJ0eSkgewotCQlERUJVRygiY2xlYW5cbiIpOwotCQlyZXR1cm4gbnJfZGlydHk7Ci0JfQotCi0JZm9yIChpPTA7IGk8bnJfZGlydHk7IGkrKykgewotCQlub3V2ZWF1X2J1ZmZlcm9ial9yZWdpb24gKnIgPSAmZGlydHktPmRpcnR5W2ldOwotCi0JCURFQlVHKCJkaXJ0eSAlZDogbz0weCUwOHgsIHM9MHglMDh4XG4iLAotCQkJCWksIHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCk7Ci0JCW5vdXZlYXVfYm9fdXBsb2FkX3RvX3NjcmVlbihjdHgsCi0JCQkJCSAgICByLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQsIGJvKTsKLQl9Ci0KLQlGUkVFKGRpcnR5LT5kaXJ0eSk7Ci0JZGlydHktPmRpcnR5ICAgID0gTlVMTDsKLQlkaXJ0eS0+bnJfZGlydHkgPSAwOwotCi0JcmV0dXJuIG5yX2RpcnR5OwotfQotCi1HTHVpbnQKLW5vdXZlYXVfYm9fZG93bmxvYWRfZGlydHkoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibykKLXsKLQlub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKm5ibyA9IChub3V2ZWF1X2J1ZmZlcl9vYmplY3QgKilibzsKLQlub3V2ZWF1X2J1ZmZlcm9ial9kaXJ0eSAqZGlydHkgPSAmbmJvLT5ncHVfZGlydHk7Ci0JR0x1aW50IG5yX2RpcnR5OwotCWludCBpOwotCi0JbnJfZGlydHkgPSBkaXJ0eS0+bnJfZGlydHk7Ci0JaWYgKG5yX2RpcnR5KSB7Ci0JCURFQlVHKCJjbGVhblxuIik7Ci0JCXJldHVybiBucl9kaXJ0eTsKLQl9Ci0JCi0JZm9yIChpPTA7IGk8bnJfZGlydHk7IGkrKykgewotCQlub3V2ZWF1X2J1ZmZlcm9ial9yZWdpb24gKnIgPSAmZGlydHktPmRpcnR5W2ldOwotCi0JCURFQlVHKCJkaXJ0eSAlZDogbz0weCUwOHgsIHM9MHglMDh4XG4iLAotCQkJCWksIHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCk7Ci0JCW5vdXZlYXVfYm9fZG93bmxvYWRfZnJvbV9zY3JlZW4oY3R4LAotCQkJCQkJci0+c3RhcnQsCi0JCQkJCQlyLT5lbmQgLSByLT5zdGFydCwgYm8pOwotCX0KLQotCUZSRUUoZGlydHktPmRpcnR5KTsKLQlkaXJ0eS0+ZGlydHkgICAgPSBOVUxMOwotCWRpcnR5LT5ucl9kaXJ0eSA9IDA7Ci0KLQlyZXR1cm4gbnJfZGlydHk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1QmluZEJ1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKLXsKLX0KLQotc3RhdGljIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICoKLW5vdXZlYXVOZXdCdWZmZXJPYmplY3QoR0xjb250ZXh0ICpjdHgsIEdMdWludCBidWZmZXIsIEdMZW51bSB0YXJnZXQpCi17Ci0Jbm91dmVhdV9idWZmZXJfb2JqZWN0ICpuYm87Ci0KLQluYm8gPSBDQUxMT0NfU1RSVUNUKG5vdXZlYXVfYnVmZmVyX29iamVjdF90KTsKLQlpZiAobmJvKQotCQlfbWVzYV9pbml0aWFsaXplX2J1ZmZlcl9vYmplY3QoJm5iby0+bWVzYSwgYnVmZmVyLCB0YXJnZXQpOwotCURFQlVHKCJibz0lcFxuIiwgbmJvKTsKLQotCXJldHVybiBuYm8gPyAmbmJvLT5tZXNhIDogTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVEZWxldGVCdWZmZXIoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmopCi17Ci0Jbm91dmVhdV9idWZmZXJfb2JqZWN0ICpuYm8gPSAobm91dmVhdV9idWZmZXJfb2JqZWN0ICopb2JqOwotCi0JaWYgKG5iby0+Z3B1X2RpcnR5Lm5yX2RpcnR5KQotCQlGUkVFKG5iby0+Z3B1X2RpcnR5LmRpcnR5KTsKLQlpZiAobmJvLT5jcHVfZGlydHkubnJfZGlydHkpCi0JCUZSRUUobmJvLT5jcHVfZGlydHkuZGlydHkpOwotCWlmIChuYm8tPmNwdV9tZW0pIG5vdXZlYXVfbWVtX2ZyZWUoY3R4LCBuYm8tPmNwdV9tZW0pOwotCWlmIChuYm8tPmdwdV9tZW0pIG5vdXZlYXVfbWVtX2ZyZWUoY3R4LCBuYm8tPmdwdV9tZW0pOwotCi0JX21lc2FfZGVsZXRlX2J1ZmZlcl9vYmplY3QoY3R4LCBvYmopOwotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdUJ1ZmZlckRhdGEoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwKLQkJICBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSwKLQkJICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqKQotewotCUdMdWludCBncHVfZmxhZ3M7Ci0KLQlERUJVRygidGFyZ2V0PSVzLCBzaXplPSVkLCBkYXRhPSVwLCB1c2FnZT0lcywgb2JqPSVwXG4iLAotCQkJX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwKLQkJCShHTHVpbnQpc2l6ZSwgZGF0YSwKLQkJCV9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHVzYWdlKSwKLQkJCW9iaik7Ci0KLQlzd2l0Y2ggKHRhcmdldCkgewotCWNhc2UgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCOgotCQlncHVfZmxhZ3MgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlncHVfZmxhZ3MgPSBOT1VWRUFVX0JPX1ZSQU1fT0sgfCBOT1VWRUFVX0JPX0dBUlRfT0s7Ci0JCWJyZWFrOwotCX0KLQlub3V2ZWF1X2JvX2luaXRfc3RvcmFnZShjdHgsIGdwdV9mbGFncywgc2l6ZSwgZGF0YSwgdXNhZ2UsIG9iaik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1QnVmZmVyU3ViRGF0YShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnRwdHJBUkIgb2Zmc2V0LAotCQkgICAgIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLAotCQkgICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmopCi17Ci0JR0x2b2lkICpvdXQ7Ci0KLQlERUJVRygidGFyZ2V0PSVzLCBvZmZzZXQ9MHgleCwgc2l6ZT0lZCwgZGF0YT0lcCwgb2JqPSVwXG4iLAotCQkJX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwKLQkJCShHTHVpbnQpb2Zmc2V0LCAoR0x1aW50KXNpemUsIGRhdGEsIG9iaik7Ci0KLQlvdXQgPSBub3V2ZWF1X2JvX21hcChjdHgsIEdMX1dSSVRFX09OTFlfQVJCLCBvYmopOwotCV9tZXNhX21lbWNweShvdXQgKyBvZmZzZXQsIGRhdGEsIHNpemUpOwotCW5vdXZlYXVfYm9fZGlydHlfbGluZWFyKGN0eCwgR0xfRkFMU0UsIG9mZnNldCwgc2l6ZSwgb2JqKTsKLQlub3V2ZWF1X2JvX3VubWFwKGN0eCwgb2JqKTsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVHZXRCdWZmZXJTdWJEYXRhKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsCi0JCSAgICAgR0xzaXplaXB0ckFSQiBzaXplLCBHTHZvaWQgKmRhdGEsCi0JCSAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKLXsKLQljb25zdCBHTHZvaWQgKmluOwotCi0JREVCVUcoInRhcmdldD0lcywgb2Zmc2V0PTB4JXgsIHNpemU9JWQsIGRhdGE9JXAsIG9iaj0lcFxuIiwKLQkJCV9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHRhcmdldCksCi0JCQkoR0x1aW50KW9mZnNldCwgKEdMdWludClzaXplLCBkYXRhLCBvYmopOwotCi0JaW4gPSBub3V2ZWF1X2JvX21hcChjdHgsIEdMX1JFQURfT05MWV9BUkIsIG9iaik7Ci0JX21lc2FfbWVtY3B5KGRhdGEsIGluICsgb2Zmc2V0LCBzaXplKTsKLQlub3V2ZWF1X2JvX3VubWFwKGN0eCwgb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgKgotbm91dmVhdU1hcEJ1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcywKLQkJIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmopCi17Ci0JREVCVUcoInRhcmdldD0lcywgYWNjZXNzPSVzLCBvYmo9JXBcbiIsCi0JCQlfbWVzYV9sb29rdXBfZW51bV9ieV9ucih0YXJnZXQpLAotCQkJX21lc2FfbG9va3VwX2VudW1fYnlfbnIoYWNjZXNzKSwKLQkJCW9iagotCQkJKTsKLQotCS8qIEFscmVhZHkgbWFwcGVkLi4gKi8KLQlpZiAob2JqLT5Qb2ludGVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIEhhdmUgdG8gcGFzcyBSRUFEX1dSSVRFIGhlcmUsIG5vdXZlYXVfYm9fbWFwIHdpbGwgb25seSBlbnN1cmUgdGhhdAotCSAqIHRoZSBjcHVfbWVtIGJ1ZmZlciBpcyB1cC10by1kYXRlIGlmIHdlIGFzayBmb3IgcmVhZCBhY2Nlc3MuCi0JICoKLQkgKiBIb3dldmVyLCBldmVuIGlmIHRoZSBjbGllbnQgb25seSBhc2tzIGZvciB3cml0ZSBhY2Nlc3MsIHdlJ3JlIHN0aWxsCi0JICogZm9yY2VkIHRvIHJldXBsb2FkIHRoZSBlbnRpcmUgYnVmZmVyLiAgU28sIHdlIG5lZWQgdGhlIGNwdV9tZW0gYnVmZmVyCi0JICogdG8gaGF2ZSB0aGUgY29ycmVjdCBkYXRhIGFsbCB0aGUgdGltZS4KLQkgKi8KLQlvYmotPlBvaW50ZXIgPSBub3V2ZWF1X2JvX21hcChjdHgsIEdMX1JFQURfV1JJVEVfQVJCLCBvYmopOwotCi0JLyogVGhlIEdMIHNwZWMgc2F5cyB0aGF0IGEgY2xpZW50IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gYSBidWZmZXJvYmoKLQkgKiBtYXBwZWQgUkVBRF9PTkxZIG9iamVjdCBtYXkgaGF2ZSB1bnByZWRpY3RhYmxlIHJlc3VsdHMsIHBvc3NpYmx5Ci0JICogZXZlbiBwcm9ncmFtIHRlcm1pbmF0aW9uLgotCSAqCi0JICogV2UncmUgZ29pbmcgdG8gdXNlIHRoaXMsIGFuZCBvbmx5IG1hcmsgdGhlIGJ1ZmZlciBhcyBkaXJ0aWVkIGlmCi0JICogdGhlIGNsaWVudCBhc2tzIGZvciB3cml0ZSBhY2Nlc3MuCi0JICovCi0JaWYgKHRhcmdldCAhPSBHTF9SRUFEX09OTFlfQVJCKSB7Ci0JCS8qIFdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hhdCB3YXMgbW9kaWZpZWQgYnkgdGhlIGNsaWVudCwKLQkJICogc28gdGhlIGVudGlyZSBidWZmZXIgZ2V0cyBkaXJ0aWVkLiAqLwotCQlub3V2ZWF1X2JvX2RpcnR5X2FsbChjdHgsIEdMX0ZBTFNFLCBvYmopOwotCX0KLQotCXJldHVybiBvYmotPlBvaW50ZXI7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLW5vdXZlYXVVbm1hcEJ1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaikKLXsKLQlERUJVRygidGFyZ2V0PSVzLCBvYmo9JXBcbiIsIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHRhcmdldCksIG9iaik7Ci0KLQlhc3NlcnQob2JqLT5Qb2ludGVyKTsKLQotCW5vdXZlYXVfYm9fdW5tYXAoY3R4LCBvYmopOwotCW9iai0+UG9pbnRlciA9IE5VTEw7Ci0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0JICAKLXZvaWQKLW5vdXZlYXVJbml0QnVmZmVyT2JqZWN0cyhHTGNvbnRleHQgKmN0eCkKLXsKLQljdHgtPkRyaXZlci5CaW5kQnVmZmVyCQk9IG5vdXZlYXVCaW5kQnVmZmVyOwotCWN0eC0+RHJpdmVyLk5ld0J1ZmZlck9iamVjdAk9IG5vdXZlYXVOZXdCdWZmZXJPYmplY3Q7Ci0JY3R4LT5Ecml2ZXIuRGVsZXRlQnVmZmVyCT0gbm91dmVhdURlbGV0ZUJ1ZmZlcjsKLQljdHgtPkRyaXZlci5CdWZmZXJEYXRhCQk9IG5vdXZlYXVCdWZmZXJEYXRhOwotCWN0eC0+RHJpdmVyLkJ1ZmZlclN1YkRhdGEJPSBub3V2ZWF1QnVmZmVyU3ViRGF0YTsKLQljdHgtPkRyaXZlci5HZXRCdWZmZXJTdWJEYXRhCT0gbm91dmVhdUdldEJ1ZmZlclN1YkRhdGE7Ci0JY3R4LT5Ecml2ZXIuTWFwQnVmZmVyCQk9IG5vdXZlYXVNYXBCdWZmZXI7Ci0JY3R4LT5Ecml2ZXIuVW5tYXBCdWZmZXIJCT0gbm91dmVhdVVubWFwQnVmZmVyOwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfYnVmZmVyb2JqLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfYnVmZmVyb2JqLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzlhMzUuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2J1ZmZlcm9iai5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI2lmbmRlZiBfX05PVVZFQVVfQlVGRkVST0JKX0hfXwotI2RlZmluZSBfX05PVVZFQVVfQlVGRkVST0JKX0hfXwotCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAibm91dmVhdV9idWZmZXJzLmgiCi0KLSNkZWZpbmUgTk9VVkVBVV9CT19WUkFNX09LIChOT1VWRUFVX01FTV9GQiB8IE5PVVZFQVVfTUVNX0ZCX0FDQ0VQVEFCTEUpCi0jZGVmaW5lIE5PVVZFQVVfQk9fR0FSVF9PSyAgKE5PVVZFQVVfTUVNX0FHUCB8IE5PVVZFQVVfTUVNX0FHUF9BQ0NFUFRBQkxFKQotCi10eXBlZGVmIHN0cnVjdCBub3V2ZWF1X2J1ZmZlcm9ial9yZWdpb25fdCB7Ci0JdWludDMyX3Qgc3RhcnQ7Ci0JdWludDMyX3QgZW5kOwotfSBub3V2ZWF1X2J1ZmZlcm9ial9yZWdpb247Ci0KLXR5cGVkZWYgc3RydWN0IG5vdXZlYXVfYnVmZmVyb2JqX2RpcnR5X3QgewotCW5vdXZlYXVfYnVmZmVyb2JqX3JlZ2lvbiAqZGlydHk7Ci0JaW50IG5yX2RpcnR5OwotfSBub3V2ZWF1X2J1ZmZlcm9ial9kaXJ0eTsKLQotdHlwZWRlZiBzdHJ1Y3Qgbm91dmVhdV9idWZmZXJfb2JqZWN0X3QgewotCS8qIEJhc2UgY2xhc3MsIG11c3QgYmUgZmlyc3QgKi8KLQlzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCBtZXNhOwotCi0JR0xib29sZWFuCQltYXBwZWQ7Ci0JR0xlbnVtCQkJdXNhZ2U7Ci0KLQkvKiBNZW1vcnkgdXNlZCBmb3IgR1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyKi8KLQlHTHVpbnQJCQlncHVfbWVtX2ZsYWdzOwotCW5vdXZlYXVfbWVtICoJCWdwdV9tZW07Ci0Jbm91dmVhdV9idWZmZXJvYmpfZGlydHkJZ3B1X2RpcnR5OwotCi0JLyogTWVtb3J5IHVzZWQgZm9yIENQVSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciAqLwotCUdMdWludAkJCWNwdV9tZW1fZmxhZ3M7Ci0Jbm91dmVhdV9tZW0gKgkJY3B1X21lbTsKLQlHTHZvaWQgKgkJY3B1X21lbV9zeXM7Ci0Jbm91dmVhdV9idWZmZXJvYmpfZGlydHkJY3B1X2RpcnR5OwotfSBub3V2ZWF1X2J1ZmZlcl9vYmplY3Q7Ci0KLWV4dGVybiB2b2lkCi1ub3V2ZWF1X2JvX2luaXRfc3RvcmFnZShHTGNvbnRleHQgKmN0eCwgR0x1aW50IHZhbGlkX2dwdV9hY2Nlc3MsCi0JCQlHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlLAotCQkJc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKTsKLQotZXh0ZXJuIEdMYm9vbGVhbgotbm91dmVhdV9ib19tb3ZlX2luKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gR0xib29sZWFuCi1ub3V2ZWF1X2JvX21vdmVfb3V0KEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gdm9pZCAqCi1ub3V2ZWF1X2JvX21hcChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHVzYWdlLCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gdm9pZAotbm91dmVhdV9ib191bm1hcChHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKmJvKTsKLQotZXh0ZXJuIHVpbnQzMl90Ci1ub3V2ZWF1X2JvX2dwdV9yZWYoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibyk7Ci0KLWV4dGVybiB2b2lkCi1ub3V2ZWF1X2JvX2RpcnR5X2xpbmVhcihHTGNvbnRleHQgKmN0eCwgR0xib29sZWFuIG9uX2NhcmQsCi0JCQl1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUsCi0JCQlzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gdm9pZAotbm91dmVhdV9ib19kaXJ0eV9hbGwoR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBvbl9jYXJkLAotCQkgICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpibyk7Ci0KLWV4dGVybiBHTHVpbnQKLW5vdXZlYXVfYm9fdXBsb2FkX2RpcnR5KEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gR0x1aW50Ci1ub3V2ZWF1X2JvX2Rvd25sb2FkX2RpcnR5KEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqYm8pOwotCi1leHRlcm4gdm9pZAotbm91dmVhdUluaXRCdWZmZXJPYmplY3RzKEdMY29udGV4dCAqY3R4KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfYnVmZmVycy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2J1ZmZlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5OGY2MS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfYnVmZmVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLSNpbmNsdWRlICJ1dGlscy5oIgotI2luY2x1ZGUgImZyYW1lYnVmZmVyLmgiCi0jaW5jbHVkZSAicmVuZGVyYnVmZmVyLmgiCi0jaW5jbHVkZSAiZmJvYmplY3QuaCIKLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfYnVmZmVycy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfb2JqZWN0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKLSNpbmNsdWRlICJub3V2ZWF1X21zZy5oIgotCi0jZGVmaW5lIE1BWF9NRU1GTVRfTEVOR1RIIDMyNzY4Ci0KLS8qIFVuc3RyaWRlZCBibGl0IHVzaW5nIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUICovCi1HTGJvb2xlYW4KLW5vdXZlYXVfbWVtZm9ybWF0X2ZsYXRfZW1pdChHTGNvbnRleHQgKmN0eCwKLSAgICAgIAkJCSAgICBub3V2ZWF1X21lbSAqZHN0LCBub3V2ZWF1X21lbSAqc3JjLAotCQkJICAgIEdMdWludCBkc3Rfb2Zmc2V0LCBHTHVpbnQgc3JjX29mZnNldCwKLQkJCSAgICBHTHVpbnQgc2l6ZSkKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICB1aW50MzJfdCBzcmNfaGFuZGxlLCBkc3RfaGFuZGxlOwotICAgR0x1aW50IGNvdW50OwotCi0gICBpZiAoc3JjX29mZnNldCArIHNpemUgPiBzcmMtPnNpemUpIHsKLSAgICAgIE1FU1NBR0UoInNyYyBvdXQgb2Ygbm91dmVhdV9tZW0gYm91bmRzXG4iKTsKLSAgICAgIHJldHVybiBHTF9GQUxTRTsKLSAgIH0KLSAgIGlmIChkc3Rfb2Zmc2V0ICsgc2l6ZSA+IGRzdC0+c2l6ZSkgewotICAgICAgTUVTU0FHRSgiZHN0IG91dCBvZiBub3V2ZWF1X21lbSBib3VuZHNcbiIpOwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgfQotCi0gICBzcmNfaGFuZGxlID0gKHNyYy0+dHlwZSAmIE5PVVZFQVVfTUVNX0ZCKSA/IE52RG1hRkIgOiBOdkRtYVRUOwotICAgZHN0X2hhbmRsZSA9IChkc3QtPnR5cGUgJiBOT1VWRUFVX01FTV9GQikgPyBOdkRtYUZCIDogTnZEbWFUVDsKLSAgIHNyY19vZmZzZXQgKz0gbm91dmVhdV9tZW1fZ3B1X29mZnNldF9nZXQoY3R4LCBzcmMpOwotICAgZHN0X29mZnNldCArPSBub3V2ZWF1X21lbV9ncHVfb2Zmc2V0X2dldChjdHgsIGRzdCk7Ci0KLSAgIEJFR0lOX1JJTkdfU0laRShOdlN1Yk1lbUZvcm1hdCwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0JKRUNUX0lOLCAyKTsKLSAgIE9VVF9SSU5HICAgICAgIChzcmNfaGFuZGxlKTsKLSAgIE9VVF9SSU5HICAgICAgIChkc3RfaGFuZGxlKTsKLQotICAgY291bnQgPSAoc2l6ZSAvIE1BWF9NRU1GTVRfTEVOR1RIKSArICgoc2l6ZSAlIE1BWF9NRU1GTVRfTEVOR1RIKSA/IDEgOiAwKTsKLQotICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgIEdMdWludCBsZW5ndGggPSAoc2l6ZSA+IE1BWF9NRU1GTVRfTEVOR1RIKSA/IE1BWF9NRU1GTVRfTEVOR1RIIDogc2l6ZTsKLQotICAgICAgQkVHSU5fUklOR19TSVpFKE52U3ViTWVtRm9ybWF0LCBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU4sIDgpOwotICAgICAgT1VUX1JJTkcgICAgICAgKHNyY19vZmZzZXQpOwotICAgICAgT1VUX1JJTkcgICAgICAgKGRzdF9vZmZzZXQpOwotICAgICAgT1VUX1JJTkcgICAgICAgKDApOyAvKiBwaXRjaCBpbiAqLwotICAgICAgT1VUX1JJTkcgICAgICAgKDApOyAvKiBwaXRjaCBvdXQgKi8KLSAgICAgIE9VVF9SSU5HICAgICAgIChsZW5ndGgpOyAvKiBsaW5lIGxlbmd0aCAqLwotICAgICAgT1VUX1JJTkcgICAgICAgKDEpOyAvKiBudW1iZXIgb2YgbGluZXMgKi8KLSAgICAgIE9VVF9SSU5HICAgICAgICgoMSA8PCA4KSAvKiBkc3RfaW5jICovIHwgKDEgPDwgMCkgLyogc3JjX2luYyAqLyk7Ci0gICAgICBPVVRfUklORyAgICAgICAoMCk7IC8qIGJ1ZmZlciBub3RpZnk/ICovCi0gICAgICBGSVJFX1JJTkcoKTsKLQotICAgICAgc3JjX29mZnNldCArPSBsZW5ndGg7Ci0gICAgICBkc3Rfb2Zmc2V0ICs9IGxlbmd0aDsKLSAgICAgIHNpemUgICAgICAgLT0gbGVuZ3RoOwotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotdm9pZAotbm91dmVhdV9tZW1fZnJlZShHTGNvbnRleHQgKmN0eCwgbm91dmVhdV9tZW0gKm1lbSkKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICBzdHJ1Y3QgZHJtX25vdXZlYXVfbWVtX2ZyZWUgbWVtZjsKLQotICAgaWYgKE5PVVZFQVVfREVCVUcgJiBERUJVR19NRU0pICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB0eXBlPTB4JXgsIG9mZnNldD0weCV4LCBzaXplPTB4JXhcbiIsCi0JICAgIF9fZnVuY19fLCBtZW0tPnR5cGUsIChHTHVpbnQpbWVtLT5vZmZzZXQsIChHTHVpbnQpbWVtLT5zaXplKTsKLSAgIH0KLQotICAgaWYgKG1lbS0+bWFwKQotICAgICAgZHJtVW5tYXAobWVtLT5tYXAsIG1lbS0+c2l6ZSk7Ci0gICBtZW1mLmZsYWdzICA9IG1lbS0+dHlwZTsKLSAgIG1lbWYub2Zmc2V0ID0gbWVtLT5vZmZzZXQ7Ci0gICBkcm1Db21tYW5kV3JpdGUobm1lc2EtPmRyaUZkLCBEUk1fTk9VVkVBVV9NRU1fRlJFRSwgJm1lbWYsIHNpemVvZihtZW1mKSk7Ci0gICBGUkVFKG1lbSk7Ci19Ci0KLW5vdXZlYXVfbWVtICoKLW5vdXZlYXVfbWVtX2FsbG9jKEdMY29udGV4dCAqY3R4LCBpbnQgdHlwZSwgR0x1aW50IHNpemUsIEdMdWludCBhbGlnbikKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICBzdHJ1Y3QgZHJtX25vdXZlYXVfbWVtX2FsbG9jIG1lbWE7Ci0gICBub3V2ZWF1X21lbSAqbWVtOwotICAgaW50IHJldDsKLQotICAgaWYgKE5PVVZFQVVfREVCVUcgJiBERUJVR19NRU0pICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZXF1ZXN0ZWQ6IHR5cGU9MHgleCwgc2l6ZT0weCV4LCBhbGlnbj0weCV4XG4iLAotCSAgICBfX2Z1bmNfXywgdHlwZSwgKEdMdWludClzaXplLCBhbGlnbik7Ci0gICB9Ci0KLSAgIG1lbSA9IENBTExPQyhzaXplb2Yobm91dmVhdV9tZW0pKTsKLSAgIGlmICghbWVtKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgIG1lbWEuZmxhZ3MgICAgID0gdHlwZTsKLSAgIG1lbWEuc2l6ZSAgICAgID0gbWVtLT5zaXplID0gc2l6ZTsKLSAgIG1lbWEuYWxpZ25tZW50ID0gYWxpZ247Ci0gICBtZW0tPm1hcCAgICAgICA9IE5VTEw7Ci0gICByZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKG5tZXNhLT5kcmlGZCwgRFJNX05PVVZFQVVfTUVNX0FMTE9DLAotCSAJCSAgICAgJm1lbWEsIHNpemVvZihtZW1hKSk7Ci0gICBpZiAocmV0KSB7Ci0gICAgICBGUkVFKG1lbSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLSAgIG1lbS0+b2Zmc2V0ID0gbWVtYS5vZmZzZXQ7Ci0gICBtZW0tPnR5cGUgICA9IG1lbWEuZmxhZ3M7Ci0KLSAgIGlmIChOT1VWRUFVX0RFQlVHICYgREVCVUdfTUVNKSAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogYWN0dWFsOiB0eXBlPTB4JXgsIG9mZnNldD0weCV4LCBzaXplPTB4JXhcbiIsCi0JICAgIF9fZnVuY19fLCBtZW0tPnR5cGUsIChHTHVpbnQpbWVtLT5vZmZzZXQsIChHTHVpbnQpbWVtLT5zaXplKTsKLSAgIH0KLQotICAgaWYgKHR5cGUgJiBOT1VWRUFVX01FTV9NQVBQRUQpCi0gICAgICByZXQgPSBkcm1NYXAobm1lc2EtPmRyaUZkLCBtZW1hLm1hcF9oYW5kbGUsIG1lbS0+c2l6ZSwgJm1lbS0+bWFwKTsKLSAgIGlmIChyZXQpIHsKLSAgICAgIG1lbS0+bWFwID0gTlVMTDsKLSAgICAgIG5vdXZlYXVfbWVtX2ZyZWUoY3R4LCBtZW0pOwotICAgICAgbWVtID0gTlVMTDsKLSAgIH0KLQotICAgcmV0dXJuIG1lbTsKLX0KLQotdWludDMyX3QKLW5vdXZlYXVfbWVtX2dwdV9vZmZzZXRfZ2V0KEdMY29udGV4dCAqY3R4LCBub3V2ZWF1X21lbSAqbWVtKQotewotICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotICAgcmV0dXJuIG1lbS0+b2Zmc2V0OwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1ub3V2ZWF1X3JlbmRlcmJ1ZmZlcl9waXhlbGZvcm1hdChub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqbnJiLAotICAgICAgCQkJCSBHTGVudW0gaW50ZXJuYWxGb3JtYXQpCi17Ci0gICAgICBucmItPm1lc2EuSW50ZXJuYWxGb3JtYXQJPSBpbnRlcm5hbEZvcm1hdDsKLQotICAgLypUT0RPOiBXZSBwcm9iYWJseSB3YW50IHRvIGV4dGVuZCB0aGlzIGEgYml0LCBhbmQgbWF5YmUgbWFrZQotICAgICogICAgICBjYXJkLXNwZWNpZmljPyAKLSAgICAqLwotICAgICAgc3dpdGNoIChpbnRlcm5hbEZvcm1hdCkgewotICAgICAgY2FzZSBHTF9SR0JBOgotICAgICAgY2FzZSBHTF9SR0JBODoKLQkgbnJiLT5tZXNhLl9CYXNlRm9ybWF0CT0gR0xfUkdCQTsKLQkgbnJiLT5tZXNhLl9BY3R1YWxGb3JtYXQ9IEdMX1JHQkE4OwotCSBucmItPm1lc2EuRGF0YVR5cGUJPSBHTF9VTlNJR05FRF9CWVRFOwotCSBucmItPm1lc2EuUmVkQml0cwk9IDg7Ci0JIG5yYi0+bWVzYS5HcmVlbkJpdHMJPSA4OwotCSBucmItPm1lc2EuQmx1ZUJpdHMJPSA4OwotCSBucmItPm1lc2EuQWxwaGFCaXRzCT0gODsKLQkgbnJiLT5jcHAJCT0gNDsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX1JHQjoKLSAgICAgIGNhc2UgR0xfUkdCNToKLQkgbnJiLT5tZXNhLl9CYXNlRm9ybWF0CT0gR0xfUkdCOwotCSBucmItPm1lc2EuX0FjdHVhbEZvcm1hdD0gR0xfUkdCNTsKLQkgbnJiLT5tZXNhLkRhdGFUeXBlCT0gR0xfVU5TSUdORURfQllURTsKLQkgbnJiLT5tZXNhLlJlZEJpdHMJPSA1OwotCSBucmItPm1lc2EuR3JlZW5CaXRzCT0gNjsKLQkgbnJiLT5tZXNhLkJsdWVCaXRzCT0gNTsKLQkgbnJiLT5tZXNhLkFscGhhQml0cwk9IDA7Ci0JIG5yYi0+Y3BwCQk9IDI7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKLQkgbnJiLT5tZXNhLl9CYXNlRm9ybWF0CT0gR0xfREVQVEhfQ09NUE9ORU5UOwotCSBucmItPm1lc2EuX0FjdHVhbEZvcm1hdD0gR0xfREVQVEhfQ09NUE9ORU5UMTY7Ci0JIG5yYi0+bWVzYS5EYXRhVHlwZQk9IEdMX1VOU0lHTkVEX1NIT1JUOwotCSBucmItPm1lc2EuRGVwdGhCaXRzCT0gMTY7Ci0JIG5yYi0+Y3BwCQk9IDI7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQyNDoKLQkgbnJiLT5tZXNhLl9CYXNlRm9ybWF0CT0gR0xfREVQVEhfQ09NUE9ORU5UOwotCSBucmItPm1lc2EuX0FjdHVhbEZvcm1hdD0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7Ci0JIG5yYi0+bWVzYS5EYXRhVHlwZQk9IEdMX1VOU0lHTkVEX0lOVF8yNF84X0VYVDsKLQkgbnJiLT5tZXNhLkRlcHRoQml0cwk9IDI0OwotCSBucmItPmNwcAkJPSA0OwotCSBicmVhazsKLSAgICAgIGNhc2UgR0xfU1RFTkNJTF9JTkRFWDhfRVhUOgotCSBucmItPm1lc2EuX0Jhc2VGb3JtYXQJPSBHTF9TVEVOQ0lMX0lOREVYOwotCSBucmItPm1lc2EuX0FjdHVhbEZvcm1hdD0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7Ci0JIG5yYi0+bWVzYS5EYXRhVHlwZQk9IEdMX1VOU0lHTkVEX0lOVF8yNF84X0VYVDsKLQkgbnJiLT5tZXNhLlN0ZW5jaWxCaXRzCT0gODsKLQkgbnJiLT5jcHAJCT0gNDsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOgotCSBucmItPm1lc2EuX0Jhc2VGb3JtYXQJPSBHTF9ERVBUSF9TVEVOQ0lMX0VYVDsKLQkgbnJiLT5tZXNhLl9BY3R1YWxGb3JtYXQ9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOwotCSBucmItPm1lc2EuRGF0YVR5cGUJPSBHTF9VTlNJR05FRF9JTlRfMjRfOF9FWFQ7Ci0JIG5yYi0+bWVzYS5EZXB0aEJpdHMJPSAyNDsKLQkgbnJiLT5tZXNhLlN0ZW5jaWxCaXRzICA9IDg7Ci0JIG5yYi0+Y3BwCQk9IDQ7Ci0JIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIEdMX0ZBTFNFOwotCSBicmVhazsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLW5vdXZlYXVfcmVuZGVyYnVmZmVyX3N0b3JhZ2UoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiLAotICAgICAgCQkJICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsCi0JCQkgICAgIEdMdWludCB3aWR0aCwKLQkJCSAgICAgR0x1aW50IGhlaWdodCkKLXsKLSAgIG5vdXZlYXVfcmVuZGVyYnVmZmVyICpucmIgPSAobm91dmVhdV9yZW5kZXJidWZmZXIqKXJiOwotCi0gICBpZiAoIW5vdXZlYXVfcmVuZGVyYnVmZmVyX3BpeGVsZm9ybWF0KG5yYiwgaW50ZXJuYWxGb3JtYXQpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIGludGVybmFsRm9ybWF0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7Ci0gICB9Ci0KLSAgIC8qIElmIHRoaXMgYnVmZmVyIGlzbid0IHN0YXRpY2FsbHkgYWxsb2MnZCwgd2UgbWF5IG5lZWQgdG8gYXNrIHRoZQotICAgICogZHJtIGZvciBtb3JlIG1lbW9yeSAqLwotICAgaWYgKCFucmItPmRQcml2ICYmIChyYi0+V2lkdGggIT0gd2lkdGggfHwgcmItPkhlaWdodCAhPSBoZWlnaHQpKSB7Ci0gICAgICBHTHVpbnQgcGl0Y2g7Ci0KLSAgICAgIC8qIGFsaWduIHBpdGNoZXMgdG8gNjQgYnl0ZXMgKi8KLSAgICAgIHBpdGNoID0gKCh3aWR0aCAqIG5yYi0+Y3BwKSArIDYzKSAmIH42MzsKLQotICAgICAgaWYgKG5yYi0+bWVtKQotCSBub3V2ZWF1X21lbV9mcmVlKGN0eCwgbnJiLT5tZW0pOwotICAgICAgbnJiLT5tZW0gPSBub3V2ZWF1X21lbV9hbGxvYyhjdHgsCi0JICAgIAkJCSAgIE5PVVZFQVVfTUVNX0ZCIHwgTk9VVkVBVV9NRU1fTUFQUEVELAotCQkJCSAgIHBpdGNoKmhlaWdodCwKLQkJCQkgICAwKTsKLSAgICAgIGlmICghbnJiLT5tZW0pCi0JIHJldHVybiBHTF9GQUxTRTsKLQotICAgICAgLyogdXBkYXRlIG5vdXZlYXVfcmVuZGVyYnVmZmVyIGluZm8gKi8KLSAgICAgIG5yYi0+b2Zmc2V0ID0gbm91dmVhdV9tZW1fZ3B1X29mZnNldF9nZXQoY3R4LCBucmItPm1lbSk7Ci0gICAgICBucmItPnBpdGNoICA9IHBpdGNoOwotICAgfQotCi0gICByYi0+V2lkdGggPSB3aWR0aDsKLSAgIHJiLT5IZWlnaHQgPSBoZWlnaHQ7Ci0gICByYi0+SW50ZXJuYWxGb3JtYXQgPSBpbnRlcm5hbEZvcm1hdDsKLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdV9yZW5kZXJidWZmZXJfZGVsZXRlKHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQotewotICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOwotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKm5yYiA9IChub3V2ZWF1X3JlbmRlcmJ1ZmZlciopcmI7Ci0KLSAgIGlmIChucmItPm1lbSkKLSAgICAgIG5vdXZlYXVfbWVtX2ZyZWUoY3R4LCBucmItPm1lbSk7Ci0gICBGUkVFKG5yYik7Ci19Ci0KLW5vdXZlYXVfcmVuZGVyYnVmZmVyICoKLW5vdXZlYXVfcmVuZGVyYnVmZmVyX25ldyhHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMdm9pZCAqbWFwLAotICAgICAgCQkJIEdMdWludCBvZmZzZXQsICBHTHVpbnQgcGl0Y2gsCi0JCQkgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2KQotewotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKm5yYjsKLQotICAgbnJiID0gQ0FMTE9DX1NUUlVDVChub3V2ZWF1X3JlbmRlcmJ1ZmZlcl90KTsKLSAgIGlmIChucmIpIHsKLSAgICAgIF9tZXNhX2luaXRfcmVuZGVyYnVmZmVyKCZucmItPm1lc2EsIDApOwotCi0gICAgICBub3V2ZWF1X3JlbmRlcmJ1ZmZlcl9waXhlbGZvcm1hdChucmIsIGludGVybmFsRm9ybWF0KTsKLQotICAgICAgbnJiLT5tZXNhLkFsbG9jU3RvcmFnZQk9IG5vdXZlYXVfcmVuZGVyYnVmZmVyX3N0b3JhZ2U7Ci0gICAgICBucmItPm1lc2EuRGVsZXRlCQk9IG5vdXZlYXVfcmVuZGVyYnVmZmVyX2RlbGV0ZTsKLQotICAgICAgbnJiLT5kUHJpdiAgPSBkUHJpdjsKLSAgICAgIG5yYi0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgbnJiLT5waXRjaCAgPSBwaXRjaDsKLSAgICAgIG5yYi0+bWFwICAgID0gbWFwOwotICAgfQotCi0gICByZXR1cm4gbnJiOwotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdV9jbGlwcmVjdHNfZHJhd2FibGVfc2V0KG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLAotICAgICAgCQkJICAgICAgIG5vdXZlYXVfcmVuZGVyYnVmZmVyICpucmIpCi17Ci0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBucmItPmRQcml2OwotCi0gICBubWVzYS0+bnVtQ2xpcFJlY3RzCT0gZFByaXYtPm51bUNsaXBSZWN0czsKLSAgIG5tZXNhLT5wQ2xpcFJlY3RzCT0gZFByaXYtPnBDbGlwUmVjdHM7Ci0gICBubWVzYS0+ZHJhd1gJCT0gZFByaXYtPng7Ci0gICBubWVzYS0+ZHJhd1kJCT0gZFByaXYtPnk7Ci0gICBubWVzYS0+ZHJhd1cJCT0gZFByaXYtPnc7Ci0gICBubWVzYS0+ZHJhd0gJCT0gZFByaXYtPmg7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X2NsaXByZWN0c19yZW5kZXJidWZmZXJfc2V0KG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLAotICAgICAgCQkJCSAgIG5vdXZlYXVfcmVuZGVyYnVmZmVyICpucmIpCi17Ci0gICBubWVzYS0+bnVtQ2xpcFJlY3RzCT0gMTsKLSAgIG5tZXNhLT5wQ2xpcFJlY3RzCT0gJm5tZXNhLT5vc0NsaXBSZWN0OwotICAgbm1lc2EtPm9zQ2xpcFJlY3QueDEJPSAwOwotICAgbm1lc2EtPm9zQ2xpcFJlY3QueTEJPSAwOwotICAgbm1lc2EtPm9zQ2xpcFJlY3QueDIJPSBucmItPm1lc2EuV2lkdGg7Ci0gICBubWVzYS0+b3NDbGlwUmVjdC55Mgk9IG5yYi0+bWVzYS5IZWlnaHQ7Ci0gICBubWVzYS0+ZHJhd1gJCT0gMDsKLSAgIG5tZXNhLT5kcmF3WQkJPSAwOwotICAgbm1lc2EtPmRyYXdXCQk9IG5yYi0+bWVzYS5XaWR0aDsKLSAgIG5tZXNhLT5kcmF3SAkJPSBucmItPm1lc2EuSGVpZ2h0OwotfQotCi12b2lkCi1ub3V2ZWF1X3dpbmRvd19tb3ZlZChHTGNvbnRleHQgKmN0eCkKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqbnJiOwotCi0gICBucmIgPSAobm91dmVhdV9yZW5kZXJidWZmZXIgKiljdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdOwotICAgaWYgKCFucmIpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICghbnJiLT5kUHJpdikKLSAgICAgIG5vdXZlYXVfY2xpcHJlY3RzX3JlbmRlcmJ1ZmZlcl9zZXQobm1lc2EsIG5yYik7Ci0gICBlbHNlCi0gICAgICBub3V2ZWF1X2NsaXByZWN0c19kcmF3YWJsZV9zZXQobm1lc2EsIG5yYik7Ci0KLSAgIC8qIFZpZXdwb3J0IGRlcGVuZHMgb24gd2luZG93IHNpemUvcG9zaXRpb24sIG5vdXZlYXVDYWxjVmlld3BvcnQKLSAgICAqIHdpbGwgdGFrZSBjYXJlIG9mIGNhbGxpbmcgdGhlIGh3LXNwZWNpZmljIFdpbmRvd01vdmVkCi0gICAgKi8KLSAgIGN0eC0+RHJpdmVyLlZpZXdwb3J0KGN0eCwgY3R4LT5WaWV3cG9ydC5YLCBjdHgtPlZpZXdwb3J0LlksCi0JIAkJICAgICBjdHgtPlZpZXdwb3J0LldpZHRoLCBjdHgtPlZpZXdwb3J0LkhlaWdodCk7Ci0gICAvKiBTY2lzc29yIGRlcGVuZHMgb24gd2luZG93IHBvc2l0aW9uICovCi0gICBjdHgtPkRyaXZlci5TY2lzc29yKGN0eCwgY3R4LT5TY2lzc29yLlgsIGN0eC0+U2Npc3Nvci5ZLAotCSAJCSAgICBjdHgtPlNjaXNzb3IuV2lkdGgsIGN0eC0+U2Npc3Nvci5IZWlnaHQpOwotfQotCi1HTGJvb2xlYW4KLW5vdXZlYXVfYnVpbGRfZnJhbWVidWZmZXIoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIpCi17Ci0gICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKmNvbG9yW01BWF9EUkFXX0JVRkZFUlNdOwotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKmRlcHRoOwotCi0gICBfbWVzYV91cGRhdGVfZnJhbWVidWZmZXIoY3R4KTsKLSAgIF9tZXNhX3VwZGF0ZV9kcmF3X2J1ZmZlcl9ib3VuZHMoY3R4KTsKLQotICAgY29sb3JbMF0gPSAobm91dmVhdV9yZW5kZXJidWZmZXIgKilmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF07Ci0gICBpZiAoZmItPl9EZXB0aEJ1ZmZlciAmJiBmYi0+X0RlcHRoQnVmZmVyLT5XcmFwcGVkKQotICAgICAgZGVwdGggPSAobm91dmVhdV9yZW5kZXJidWZmZXIgKilmYi0+X0RlcHRoQnVmZmVyLT5XcmFwcGVkOwotICAgZWxzZQotICAgICAgZGVwdGggPSAobm91dmVhdV9yZW5kZXJidWZmZXIgKilmYi0+X0RlcHRoQnVmZmVyOwotCi0gICBpZiAoIW5tZXNhLT5od19mdW5jLkJpbmRCdWZmZXJzKG5tZXNhLCAxLCBjb2xvciwgZGVwdGgpKQotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotICAgbm91dmVhdV93aW5kb3dfbW92ZWQoY3R4KTsKLQotICAgcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1RHJhd0J1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGJ1ZmZlcikKLXsKLSAgIG5vdXZlYXVfYnVpbGRfZnJhbWVidWZmZXIoY3R4LCBjdHgtPkRyYXdCdWZmZXIpOwotfQotCi1zdGF0aWMgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICoKLW5vdXZlYXVOZXdGcmFtZWJ1ZmZlcihHTGNvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUpCi17Ci0gICByZXR1cm4gX21lc2FfbmV3X2ZyYW1lYnVmZmVyKGN0eCwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICoKLW5vdXZlYXVOZXdSZW5kZXJidWZmZXIoR0xjb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKQotewotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKm5yYjsKLQotICAgbnJiID0gQ0FMTE9DX1NUUlVDVChub3V2ZWF1X3JlbmRlcmJ1ZmZlcl90KTsKLSAgIGlmIChucmIpIHsKLSAgICAgIF9tZXNhX2luaXRfcmVuZGVyYnVmZmVyKCZucmItPm1lc2EsIG5hbWUpOwotCi0gICAgICBucmItPm1lc2EuQWxsb2NTdG9yYWdlCT0gbm91dmVhdV9yZW5kZXJidWZmZXJfc3RvcmFnZTsKLSAgICAgIG5yYi0+bWVzYS5EZWxldGUJCT0gbm91dmVhdV9yZW5kZXJidWZmZXJfZGVsZXRlOwotICAgfQotICAgcmV0dXJuICZucmItPm1lc2E7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1QmluZEZyYW1lYnVmZmVyKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiLCBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZicmVhZCkKLXsKLSAgIGlmICh0YXJnZXQgPT0gR0xfRlJBTUVCVUZGRVJfRVhUIHx8IHRhcmdldCA9PSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCkgewotICAgICAgbm91dmVhdV9idWlsZF9mcmFtZWJ1ZmZlcihjdHgsIGZiKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTGNvbnRleHQgKmN0eCwKLSAgICAgIAkJCSAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiLAotICAgICAgCQkJICAgICAgIEdMZW51bSBhdHRhY2htZW50LAotCQkJICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKQotewotICAgX21lc2FfZnJhbWVidWZmZXJfcmVuZGVyYnVmZmVyKGN0eCwgZmIsIGF0dGFjaG1lbnQsIHJiKTsKLSAgIG5vdXZlYXVfYnVpbGRfZnJhbWVidWZmZXIoY3R4LCBmYik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1UmVuZGVyVGV4dHVyZShHTGNvbnRleHQgKmN0eCwKLSAgICAgIAkJICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiLAotICAgICAgCQkgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXJfYXR0YWNobWVudCAqYXR0KQotewotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdUZpbmlzaFJlbmRlclRleHR1cmUoR0xjb250ZXh0ICpjdHgsCi0gICAgICAJCQkgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyX2F0dGFjaG1lbnQgKmF0dCkKLXsKLX0KLQotdm9pZAotbm91dmVhdUluaXRCdWZmZXJGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmMpCi17Ci0gICBmdW5jLT5EcmF3QnVmZmVyCQkgPSBub3V2ZWF1RHJhd0J1ZmZlcjsKLQotICAgZnVuYy0+TmV3RnJhbWVidWZmZXIJCSA9IG5vdXZlYXVOZXdGcmFtZWJ1ZmZlcjsKLSAgIGZ1bmMtPk5ld1JlbmRlcmJ1ZmZlcgkgPSBub3V2ZWF1TmV3UmVuZGVyYnVmZmVyOwotICAgZnVuYy0+QmluZEZyYW1lYnVmZmVyCSA9IG5vdXZlYXVCaW5kRnJhbWVidWZmZXI7Ci0gICBmdW5jLT5GcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciA9IG5vdXZlYXVGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcjsKLSAgIGZ1bmMtPlJlbmRlclRleHR1cmUJCSA9IG5vdXZlYXVSZW5kZXJUZXh0dXJlOwotICAgZnVuYy0+RmluaXNoUmVuZGVyVGV4dHVyZQkgPSBub3V2ZWF1RmluaXNoUmVuZGVyVGV4dHVyZTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2J1ZmZlcnMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9idWZmZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjQ1NTEuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2J1ZmZlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSNpZm5kZWYgX19OT1VWRUFVX0JVRkZFUlNfSF9fCi0jZGVmaW5lIF9fTk9VVkVBVV9CVUZGRVJTX0hfXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLSNpbmNsdWRlICJyZW5kZXJidWZmZXIuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qgbm91dmVhdV9tZW1fdCB7Ci0gICBpbnQgdHlwZTsKLSAgIHVpbnQ2NF90IG9mZnNldDsKLSAgIHVpbnQ2NF90IHNpemU7Ci0gICB2b2lkKiAgICBtYXA7Ci19IG5vdXZlYXVfbWVtOwotCi1leHRlcm4gbm91dmVhdV9tZW0gKm5vdXZlYXVfbWVtX2FsbG9jKEdMY29udGV4dCAqY3R4LCBpbnQgdHlwZSwKLSAgICAgIAkJCQkgICAgICBHTHVpbnQgc2l6ZSwgR0x1aW50IGFsaWduKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfbWVtX2ZyZWUoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVfbWVtICptZW0pOwotZXh0ZXJuIHVpbnQzMl90IG5vdXZlYXVfbWVtX2dwdV9vZmZzZXRfZ2V0KEdMY29udGV4dCAqY3R4LCBub3V2ZWF1X21lbSAqbWVtKTsKLQotZXh0ZXJuIEdMYm9vbGVhbiBub3V2ZWF1X21lbWZvcm1hdF9mbGF0X2VtaXQoR0xjb250ZXh0ICpjdHgsCi0gICAgICAJCQkJCSAgICAgbm91dmVhdV9tZW0gKmRzdCwKLQkJCQkJICAgICBub3V2ZWF1X21lbSAqc3JjLAotCQkJCQkgICAgIEdMdWludCBkc3Rfb2Zmc2V0LAotCQkJCQkgICAgIEdMdWludCBzcmNfb2Zmc2V0LAotCQkJCQkgICAgIEdMdWludCBzaXplKTsKLQotdHlwZWRlZiBzdHJ1Y3Qgbm91dmVhdV9yZW5kZXJidWZmZXJfdCB7Ci0gICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyIG1lc2E7IC8qIG11c3QgYmUgZmlyc3QhICovCi0gICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAgKmRQcml2OwotCi0gICBub3V2ZWF1X21lbSAqbWVtOwotICAgdm9pZCAqCW1hcDsKLQotICAgaW50CQljcHA7Ci0gICB1aW50MzJfdAlvZmZzZXQ7Ci0gICB1aW50MzJfdAlwaXRjaDsKLX0gbm91dmVhdV9yZW5kZXJidWZmZXI7Ci0KLWV4dGVybiBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqbm91dmVhdV9yZW5kZXJidWZmZXJfbmV3KEdMZW51bSBpbnRlcm5hbEZvcm1hdCwKLSAgICAgIEdMdm9pZCAqbWFwLCBHTHVpbnQgb2Zmc2V0LCBHTHVpbnQgcGl0Y2gsIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdik7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X3dpbmRvd19tb3ZlZChHTGNvbnRleHQgKmN0eCk7Ci1leHRlcm4gR0xib29sZWFuIG5vdXZlYXVfYnVpbGRfZnJhbWVidWZmZXIoR0xjb250ZXh0ICosIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqKTsKLWV4dGVybiBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqbm91dmVhdV9jdXJyZW50X2RyYXdfYnVmZmVyKEdMY29udGV4dCAqY3R4KTsKLQotZXh0ZXJuIHZvaWQgbm91dmVhdUluaXRCdWZmZXJGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jYXJkLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWYxMmYwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0KLSNpbmNsdWRlICJub3V2ZWF1X2NhcmQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCi0jaW5jbHVkZSAibm91dmVhdV9jYXJkX2xpc3QuaCIKLQotCi1ub3V2ZWF1X2NhcmQqIG5vdXZlYXVfY2FyZF9sb29rdXAodWludDMyX3QgZGV2aWNlX2lkKQotewotCWludCBpOwotCWZvcihpPTA7aTxzaXplb2Yobm91dmVhdV9jYXJkX2xpc3QpL3NpemVvZihub3V2ZWF1X2NhcmQpLTE7aSsrKQotCQlpZiAobm91dmVhdV9jYXJkX2xpc3RbaV0uaWQ9PShkZXZpY2VfaWQmMHhmZmZmKSkKLQkJCXJldHVybiAmKG5vdXZlYXVfY2FyZF9saXN0W2ldKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY2FyZC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2NhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0YzVmMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19OT1VWRUFVX0NBUkRfSF9fCi0jZGVmaW5lIF9fTk9VVkVBVV9DQVJEX0hfXwotCi0jaW5jbHVkZSAiZHJpX3V0aWwuaCIKLSNpbmNsdWRlICJkcm0uaCIKLSNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgotCi10eXBlZGVmIHN0cnVjdCBub3V2ZWF1X2NhcmRfdCB7Ci0JdWludDE2X3QgaWQ7IC8qIGxhc3QgNCBkaWdpdHMgb2YgcGNpIGlkLCBsYXN0IGRpZ2l0IGlzIGFsd2F5cyAwICovCi0JY2hhciogbmFtZTsgLyogdGhlIHVzZXItZnJpZW5kbHkgY2FyZCBuYW1lICovCi0JdWludDMyX3QgY2xhc3NfM2Q7IC8qIHRoZSBvYmplY3QgY2xhc3MgdGhpcyBjYXJkIHVzZXMgZm9yIDNEICovCi0JdWludDMyX3QgdHlwZTsgLyogdGhlIG1ham9yIGNhcmQgZmFtaWx5ICovCi0JdWludDMyX3QgZmxhZ3M7Ci19Ci1ub3V2ZWF1X2NhcmQ7Ci0KLSNkZWZpbmUgTlZfSEFTX0xNQSAweDAwMDAwMDAxCi0KLWV4dGVybiBub3V2ZWF1X2NhcmQqIG5vdXZlYXVfY2FyZF9sb29rdXAodWludDMyX3QgZGV2aWNlX2lkKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jYXJkX2xpc3QuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jYXJkX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjNWM0YS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY2FyZF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotc3RhdGljIG5vdXZlYXVfY2FyZCBub3V2ZWF1X2NhcmRfbGlzdFtdPXsKLXsweDAwMDgsICAiRURHRSAzRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVl8wMywgMH0sCi17MHgwMDA5LCAgIkVER0UgM0QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlZfMDMsIDB9LAotezB4MDAxMCwgICJNdXRhcmEgVjA4IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WXzAzLCAwfSwKLXsweDAwMjAsICAiUklWQSBUTlQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFLCAgICBOVl8wNCwgMH0sCi17MHgwMDI4LCAgIlJJVkEgVE5UMi9UTlQyIFBybyIsICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotezB4MDAyOSwgICJSSVZBIFROVDIgVWx0cmEiLCAgICAgICAgICAgICAgICAgICAgICAgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEUsICAgIE5WXzA0LCAwfSwKLXsweDAwMkEsICAiUml2YSBUblQyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFLCAgICBOVl8wNCwgMH0sCi17MHgwMDJCLCAgIlJpdmEgVG5UMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotezB4MDAyQywgICJWYW50YS9WYW50YSBMVCIsICAgICAgICAgICAgICAgICAgICAgICAgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEUsICAgIE5WXzA0LCAwfSwKLXsweDAwMkQsICAiUklWQSBUTlQyIE1vZGVsIDY0L01vZGVsIDY0IFBybyIsICAgICAgIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFLCAgICBOVl8wNCwgMH0sCi17MHgwMDJFLCAgIlZhbnRhIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotezB4MDAyRiwgICJWYW50YSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEUsICAgIE5WXzA0LCAwfSwKLXsweDAwNDAsICAiR2VGb3JjZSA2ODAwIFVsdHJhIiwgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDQxLCAgIkdlRm9yY2UgNjgwMCIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA0MiwgICJHZUZvcmNlIDY4MDAgTEUiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwNDMsICAiTlY0MC4zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDQ0LCAgIkdlRm9yY2UgNjgwMCBYVCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA0NSwgICJHZUZvcmNlIDY4MDAgR1QiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwNDYsICAiR2VGb3JjZSA2ODAwIEdUIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDQ3LCAgIkdlRm9yY2UgNjgwMCBHUyIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA0OCwgICJHZUZvcmNlIDY4MDAgWFQiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwNDksICAiTlY0MEdMIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDRELCAgIlF1YWRybyBGWCA0MDAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA0RSwgICJRdWFkcm8gRlggNDAwMCIsICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwOTAsICAiR2VGb3JjZSA3ODAwIEdUWCIsICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDkxLCAgIkdlRm9yY2UgNzgwMCBHVFgiLCAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA5MiwgICJHZUZvcmNlIDc4MDAgR1QiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwOTMsICAiR2VGb3JjZSA3ODAwIEdTIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMDk4LCAgIkdlRm9yY2UgR28gNzgwMCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDA5OSwgICJHRSBGb3JjZSBHbyA3ODAwIEdUWCIsICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwOUQsICAiUXVhZHJvIEZYNDUwMCIsICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEEwLCAgIkFsYWRkaW4gVE5UMiIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotezB4MDBDMCwgICJHZUZvcmNlIDY4MDAgR1MiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwQzEsICAiR2VGb3JjZSA2ODAwIiwgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEMyLCAgIkdlRm9yY2UgNjgwMCBMRSIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBDMywgICJHZWZvcmNlIDY4MDAgWFQiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwQzgsICAiR2VGb3JjZSBHbyA2ODAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEM5LCAgIkdlRm9yY2UgR28gNjgwMCBVbHRyYSIsICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBDQywgICJRdWFkcm8gRlggR28xNDAwIiwgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwQ0QsICAiUXVhZHJvIEZYIDM0NTAvNDAwMCBTREkiLCAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMENFLCAgIlF1YWRybyBGWCAxNDAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBGMCwgICJHZUZvcmNlIDY4MDAvR2VGb3JjZSA2ODAwIFVsdHJhIiwgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwRjEsICAiR2VGb3JjZSA2NjAwL0dlRm9yY2UgNjYwMCBHVCIsICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEYyLCAgIkdlRm9yY2UgNjYwMC9HZUZvcmNlIDY2MDAgR1QiLCAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBGMywgICJHZUZvcmNlIDYyMDAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwRjQsICAiR2VGb3JjZSA2NjAwIExFIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEY1LCAgIkdlRm9yY2UgNzgwMCBHUyIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBGNiwgICJHZUZvcmNlIDY2MDAgR1MiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAwRjgsICAiUXVhZHJvIEZYIDM0MDAvNDQwMCIsICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMEY5LCAgIkdlRm9yY2UgNjgwMCBVbHRyYS9HZUZvcmNlIDY4MDAgR1QiLCAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDBGQSwgICJHZUZvcmNlIFBDWCA1NzUwIiwgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAwRkIsICAiR2VGb3JjZSBQQ1ggNTkwMCIsICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMEZDLCAgIlF1YWRybyBGWCAzMzAvR2VGb3JjZSBQQ1ggNTMwMCIsICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzAsIDB9LAotezB4MDBGRCwgICJRdWFkcm8gRlggMzMwL1F1YWRybyBOVlMyODAiLCAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzMwLCAwfSwKLXsweDAwRkUsICAiUXVhZHJvIEZYIDEzMDAiLCAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMEZGLCAgIkdlRm9yY2UgUENYIDQzMDAiLCAgICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDEwMCwgICJHZUZvcmNlIDI1NiBTRFIiLCAgICAgICAgICAgICAgICAgICAgICAgTlYxMF9UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzEwLCAwfSwKLXsweDAxMDEsICAiR2VGb3JjZSAyNTYgRERSIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTBfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xMCwgMH0sCi17MHgwMTAzLCAgIlF1YWRybyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjEwX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTAsIDB9LAotezB4MDExMCwgICJHZUZvcmNlMiBNWC9NWCA0MDAiLCAgICAgICAgICAgICAgICAgICAgTlYxMV9UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzExLCAwfSwKLXsweDAxMTEsICAiR2VGb3JjZTIgTVggMTAwIEREUi8yMDAgRERSIiwgICAgICAgICAgIE5WMTFfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xMSwgMH0sCi17MHgwMTEyLCAgIkdlRm9yY2UyIEdvIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjExX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTEsIDB9LAotezB4MDExMywgICJRdWFkcm8yIE1YUi9FWC9HbyIsICAgICAgICAgICAgICAgICAgICAgTlYxMV9UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzExLCAwfSwKLXsweDAxNDAsICAiR2VGb3JjZSA2NjAwIEdUIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMTQxLCAgIkdlRm9yY2UgNjYwMCIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDE0MiwgICJHZUZvcmNlIDY2MDAgUENJZSIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAxNDQsICAiR2VGb3JjZSBHbyA2NjAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMTQ1LCAgIkdlRm9yY2UgNjYxMCBYTCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDE0NiwgICJHZWZvcmNlIEdvIDY2MDBURS82MjAwVEUiLCAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAxNDgsICAiR2VGb3JjZSBHbyA2NjAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMTQ5LCAgIkdlRm9yY2UgR28gNjYwMCBHVCIsICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDE0QSwgICJRdWFkcm8gTlZTIDQ0MCIsICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAxNEMsICAiUXVhZHJvIEZYIDU1MCIsICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMTRELCAgIlF1YWRybyBGWCA1NTAiLCAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDE0RSwgICJRdWFkcm8gRlggNTQwIiwgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAxNEYsICAiR2VGb3JjZSA2MjAwIiwgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMTUwLCAgIkdlRm9yY2UyIEdUUy9Qcm8iLCAgICAgICAgICAgICAgICAgICAgICBOVjExX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTUsIDB9LAotezB4MDE1MSwgICJHZUZvcmNlMiBUaSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYxMV9UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE1LCAwfSwKLXsweDAxNTIsICAiR2VGb3JjZTIgVWx0cmEsIEJsYWRlcnVubmVyIiwgICAgICAgICAgIE5WMTFfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNSwgMH0sCi17MHgwMTUzLCAgIlF1YWRybzIgUHJvIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjExX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTUsIDB9LAotezB4MDE2MSwgICJHZUZvcmNlIDYyMDAgVHVyYm9DYWNoZShUTSkiLCAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAxNjIsICAiR2VGb3JjZSA2MjAwIFNFIFR1cmJvQ2FjaGUgKFRNKSIsICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMTYzLCAgIkdlRm9yY2UgNjIwMCBMRSIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDE2NCwgICJHZUZvcmNlIEdvIDYyMDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAxNjUsICAiUXVhZHJvIE5WUyAyODUiLCAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMTY2LCAgIkdlRm9yY2UgR28gNjQwMCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDE2NywgICJHZUZvcmNlIEdvIDYyMDAgVHVyYm9DYWNoZSIsICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAxNjgsICAiR2VGb3JjZSBHbyA2MjAwIFR1cmJvQ2FjaGUiLCAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMTcwLCAgIkdlRm9yY2U0IE1YIDQ2MCIsICAgICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE3MSwgICJHZUZvcmNlNCBNWCA0NDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxNzIsICAiR2VGb3JjZTQgTVggNDIwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTczLCAgIkdlRm9yY2U0IE1YIDQ0MC1TRSIsICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE3NCwgICJHZUZvcmNlNCA0NDAgR28iLCAgICAgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxNzUsICAiR2VGb3JjZTQgNDIwIEdvIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTc2LCAgIkdlRm9yY2U0IDQyMCBHbyAzMk0iLCAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE3NywgICJHZUZvcmNlNCA0NjAgR28iLCAgICAgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxNzgsICAiUXVhZHJvNCA1NTAgWEdMIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTc5LCAgIkdlRm9yY2U0IDQyMCBHbyAzMk0iLCAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE3QSwgICJRdWFkcm80IDIwMC80MDAgTlZTIiwgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxN0IsICAiUXVhZHJvNCA1NTAgWEdMIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTdDLCAgIlF1YWRybzQgNTAwIEdvR0wiLCAgICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE3RCwgICJHZUZvcmNlNCA0MTAgR28gMTZNIiwgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxODEsICAiR2VGb3JjZTQgTVggNDQwIEFHUCA4eCIsICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTgyLCAgIkdlRm9yY2U0IE1YIDQ0MFNFIEFHUCA4eCIsICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE4MywgICJHZUZvcmNlNCBNWCA0MjAgQUdQIDh4IiwgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxODUsICAiR2VGb3JjZTQgTVggNDAwMCBBR1AgOHgiLCAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMTg2LCAgIkdlRm9yY2U0IDQ0OCBHbyIsICAgICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE4NywgICJHZUZvcmNlNCA0ODggR28iLCAgICAgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxODgsICAiUXVhZHJvNCA1ODAgWEdMIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMThBLCAgIlF1YWRybzQgTlZTIEFHUCA4eCIsICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE4QiwgICJRdWFkcm80IDM4MCBYR0wiLCAgICAgICAgICAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAxOEMsICAiUXVhZHJvIE5WUyA1MCBQQ0kiLCAgICAgICAgICAgICAgICAgICAgIE5WMTdfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8xNywgMH0sCi17MHgwMThELCAgIkdlRm9yY2U0IDQ0OCBHbyIsICAgICAgICAgICAgICAgICAgICAgICBOVjE3X1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTcsIDB9LAotezB4MDE5MSwgICJHZUZvcmNlIDg4MDAgR1RYIiwgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NTAwMCwgIE5WXzUwLCAwfSwKLXsweDAxOTMsICAiR2VGb3JjZSA4ODAwIEdUUyIsICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDUwMDAsICBOVl81MCwgMH0sCi17MHgwMUEwLCAgIkdlRm9yY2UyIE1YIEludGVncmF0ZWQgR3JhcGhpY3MiLCAgICAgICBOVjExX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMTEsIDB9LAotezB4MDFEMSwgICJHZUZvcmNlIDczMDAgTEUiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAxRDYsICAiR2VGb3JjZSBHbyA3MjAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMUQ3LCAgIlF1YWRybyBOVlMgMTEwTSAvIEdlRm9yY2UgR28gNzMwMCIsICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDFEOCwgICJHZUZvcmNlIEdvIDc0MDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAxREEsICAiUXVhZHJvIE5WUyAxMTBNIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMURGLCAgIkdlRm9yY2UgNzMwMCBHUyIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDFGMCwgICJHZUZvcmNlNCBNWCAtIG5Gb3JjZSBHUFUiLCAgICAgICAgICAgICAgTlYxN19UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzE3LCAwfSwKLXsweDAyMDAsICAiR2VGb3JjZTMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8yMCwgMH0sCi17MHgwMjAxLCAgIkdlRm9yY2UzIFRpIDIwMCIsICAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMjAsIDB9LAotezB4MDIwMiwgICJHZUZvcmNlMyBUaSA1MDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNELCAgICAgICAgIE5WXzIwLCAwfSwKLXsweDAyMDMsICAiUXVhZHJvIERDQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRCwgICAgICAgICBOVl8yMCwgMH0sCi17MHgwMjExLCAgIkdlRm9yY2UgNjgwMCIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDIxMiwgICJHZUZvcmNlIDY4MDAgTEUiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAyMTUsICAiR2VGb3JjZSA2ODAwIEdUIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMjE4LCAgIkdlRm9yY2UgNjgwMCBYVCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDIyMSwgICJHZUZvcmNlIDYyMDAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAyNDAsICAiR2VGb3JjZSA2MTUwIiwgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwMjQyLCAgIkdlRm9yY2UgNjEwMCIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDI0NCwgICJHZWZvcmNlIDYxNTAgR28iLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAyNTAsICAiR2VGb3JjZTQgVGkgNDYwMCIsICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRHwweDA1MDAsICBOVl8yNSwgMH0sCi17MHgwMjUxLCAgIkdlRm9yY2U0IFRpIDQ0MDAiLCAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0R8MHgwNTAwLCAgTlZfMjUsIDB9LAotezB4MDI1MiwgICJHZUZvcmNlNCBUaSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDUwMCwgIE5WXzI1LCAwfSwKLXsweDAyNTMsICAiR2VGb3JjZTQgVGkgNDIwMCIsICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRHwweDA1MDAsICBOVl8yNSwgMH0sCi17MHgwMjU4LCAgIlF1YWRybzQgOTAwIFhHTCIsICAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0R8MHgwNTAwLCAgTlZfMjUsIDB9LAotezB4MDI1OSwgICJRdWFkcm80IDc1MCBYR0wiLCAgICAgICAgICAgICAgICAgICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDUwMCwgIE5WXzI1LCAwfSwKLXsweDAyNUIsICAiUXVhZHJvNCA3MDAgWEdMIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRHwweDA1MDAsICBOVl8yNSwgMH0sCi17MHgwMjgwLCAgIkdlRm9yY2U0IFRpIDQ4MDAiLCAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0R8MHgwNTAwLCAgTlZfMjUsIDB9LAotezB4MDI4MSwgICJHZUZvcmNlNCBUaSA0MjAwIEFHUCA4eCIsICAgICAgICAgICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDUwMCwgIE5WXzI1LCAwfSwKLXsweDAyODIsICAiR2VGb3JjZTQgVGkgNDgwMCBTRSIsICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRHwweDA1MDAsICBOVl8yNSwgMH0sCi17MHgwMjg2LCAgIkdlRm9yY2U0IFRpIDQyMDAgR28gQUdQIDh4IiwgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0R8MHgwNTAwLCAgTlZfMjUsIDB9LAotezB4MDI4OCwgICJRdWFkcm80IDk4MCBYR0wiLCAgICAgICAgICAgICAgICAgICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDUwMCwgIE5WXzI1LCAwfSwKLXsweDAyODksICAiUXVhZHJvNCA3ODAgWEdMIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMjBfVENMX1BSSU1JVElWRV8zRHwweDA1MDAsICBOVl8yNSwgMH0sCi17MHgwMjhDLCAgIlF1YWRybzQgNzAwIEdvR0wiLCAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0R8MHgwNTAwLCAgTlZfMjUsIDB9LAotezB4MDI5MCwgICJHZUZvcmNlIDc5MDAgR1RYIiwgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAyOTEsICAiR2VGb3JjZSA3OTAwIEdUIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMjkyLCAgIkdlRm9yY2UgNzkwMCBHUyIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDI5OCwgICJHZUZvcmNlIEdvIDc5MDAgR1MiLCAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAyOTksICAiR2VGb3JjZSBHbyA3OTAwIEdUWCIsICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMjlBLCAgIlF1YWRybyBGWCAyNTAwTSIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDI5QiwgICJRdWFkcm8gRlggMTUwME0iLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAyOUMsICAiUXVhZHJvIEZYIDU1MDAiLCAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMjlELCAgIlF1YWRybyBGWCAzNTAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDI5RSwgICJRdWFkcm8gRlggMTUwMCIsICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAyOUYsICAiUXVhZHJvIEZYIDQ1MDAgWDIiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMkEwLCAgIlhHUFUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0QsICAgICAgICAgTlZfMjAsIDB9LAotezB4MDJFMSwgICJHZUZvcmNlIDc2MDAgR1MiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAzMDAsICAiR2VGb3JjZSBGWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzAxLCAgIkdlRm9yY2UgRlggNTgwMCBVbHRyYSIsICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMwMiwgICJHZUZvcmNlIEZYIDU4MDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDMwMCwgIE5WXzMwLCAwfSwKLXsweDAzMDgsICAiUXVhZHJvIEZYIDIwMDAiLCAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzA5LCAgIlF1YWRybyBGWCAxMDAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMxMSwgICJHZUZvcmNlIEZYIDU2MDAgVWx0cmEiLCAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDMwMCwgIE5WXzMwLCAwfSwKLXsweDAzMTIsICAiR2VGb3JjZSBGWCA1NjAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzEzLCAgIk5WMzEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMxNCwgICJHZUZvcmNlIEZYIDU2MDBYVCIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDMwMCwgIE5WXzMwLCAwfSwKLXsweDAzMTYsICAiTlYzMU0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzE3LCAgIk5WMzFNIFBybyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMxQSwgICJHZUZvcmNlIEZYIEdvNTYwMCIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDMwMCwgIE5WXzMwLCAwfSwKLXsweDAzMUIsICAiR2VGb3JjZSBGWCBHbzU2NTAiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzFDLCAgIk5WSURJQSBRdWFkcm8gRlggR283MDAiLCAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMxRCwgICJOVjMxR0xNIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDMwMCwgIE5WXzMwLCAwfSwKLXsweDAzMUUsICAiTlYzMUdMTSBQcm8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDAzMDAsICBOVl8zMCwgMH0sCi17MHgwMzFGLCAgIk5WMzFHTE0gUHJvIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwMzAwLCAgTlZfMzAsIDB9LAotezB4MDMyMCwgICJHZUZvcmNlIEZYIDUyMDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzM0LCAwfSwKLXsweDAzMjEsICAiR2VGb3JjZSBGWCA1MjAwIFVsdHJhIiwgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA2MDAsICBOVl8zNCwgMH0sCi17MHgwMzIyLCAgIkdlRm9yY2UgRlggNTIwMCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzQsIDB9LAotezB4MDMyMywgICJHZUZvcmNlIEZYIDUyMDBMRSIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzM0LCAwfSwKLXsweDAzMjQsICAiR2VGb3JjZSBGWCBHbzUyMDAiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA2MDAsICBOVl8zNCwgMH0sCi17MHgwMzI1LCAgIkdlRm9yY2UgRlggR281MjUwIiwgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzQsIDB9LAotezB4MDMyNiwgICJHZUZvcmNlIEZYIDU1MDAiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzM0LCAwfSwKLXsweDAzMjcsICAiR2VGb3JjZSBGWCA1MTAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA2MDAsICBOVl8zNCwgMH0sCi17MHgwMzI4LCAgIkdlRm9yY2UgRlggR281MjAwIDMyTS82NE0iLCAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzQsIDB9LAotezB4MDMyOSwgICJHZUZvcmNlIEZYIEdvNTIwMCIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzM0LCAwfSwKLXsweDAzMkEsICAiUXVhZHJvIE5WUyAyODAgUENJIiwgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA2MDAsICBOVl8zNCwgMH0sCi17MHgwMzJCLCAgIlF1YWRybyBGWCA1MDAvNjAwIFBDSSIsICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzQsIDB9LAotezB4MDMyQywgICJHZUZvcmNlIEZYIEdvIDUzMDAiLCAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDYwMCwgIE5WXzM0LCAwfSwKLXsweDAzMkQsICAiR2VGb3JjZSBGWCBHbzUxMDAiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA2MDAsICBOVl8zNCwgMH0sCi17MHgwMzJGLCAgIk5WMzRHTCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNjAwLCAgTlZfMzQsIDB9LAotezB4MDMzMCwgICJHZUZvcmNlIEZYIDU5MDAgVWx0cmEiLCAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzMzEsICAiR2VGb3JjZSBGWCA1OTAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzMyLCAgIkdlRm9yY2UgRlggNTkwMFhUIiwgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDMzMywgICJHZUZvcmNlIEZYIDU5NTAgVWx0cmEiLCAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzMzQsICAiR2VGb3JjZSBGWCA1OTAwWlQiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzM4LCAgIlF1YWRybyBGWCAzMDAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDMzRiwgICJRdWFkcm8gRlggNzAwIiwgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzNDEsICAiR2VGb3JjZSBGWCA1NzAwIFVsdHJhIiwgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzQyLCAgIkdlRm9yY2UgRlggNTcwMCIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDM0MywgICJHZUZvcmNlIEZYIDU3MDBMRSIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzNDQsICAiR2VGb3JjZSBGWCA1NzAwVkUiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzQ1LCAgIk5WMzYuNSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDM0NywgICJHZUZvcmNlIEZYIEdvNTcwMCIsICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzNDgsICAiR2VGb3JjZSBGWCBHbzU3MDAiLCAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzQ5LCAgIk5WMzZNIFBybyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDM0QiwgICJOVjM2TUFQIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzNEMsICAiUXVhZHJvIEZYIEdvMTAwMCIsICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDA0MDAsICBOVl8zMCwgMH0sCi17MHgwMzRFLCAgIlF1YWRybyBGWCAxMTAwIiwgICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHgwNDAwLCAgTlZfMzAsIDB9LAotezB4MDM0RiwgICJOVjM2R0wiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4MDQwMCwgIE5WXzMwLCAwfSwKLXsweDAzOTEsICAiR2VGb3JjZSA3NjAwIEdUIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwMzkyLCAgIkdlRm9yY2UgNzYwMCBHUyIsICAgICAgICAgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0MDAwLCAgTlZfNDAsIDB9LAotezB4MDM5MywgICJHZUZvcmNlIDczMDAgR1QiLCAgICAgICAgICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDAwMCwgIE5WXzQwLCAwfSwKLXsweDAzOTgsICAiR2VGb3JjZSBHbyA3NjAwIiwgICAgICAgICAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQwMDAsICBOVl80MCwgMH0sCi17MHgwM0QwLCAgIkdlRm9yY2UgNjEwMCBuRm9yY2UgNDMwIiwgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDNEMSwgICJHZUZvcmNlIDYxMDAgbkZvcmNlIDQwNSIsICAgICAgICAgICAgICAgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEfDB4NDQwMCwgIE5WXzQ0LCAwfSwKLXsweDAzRDIsICAiR2VGb3JjZSA2MTAwIG5Gb3JjZSA0MDAiLCAgICAgICAgICAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRHwweDQ0MDAsICBOVl80NCwgMH0sCi17MHgwM0Q1LCAgIkdlRm9yY2UgNjEwMCBuRm9yY2UgNDIwIiwgICAgICAgICAgICAgICBOVjMwX1RDTF9QUklNSVRJVkVfM0R8MHg0NDAwLCAgTlZfNDQsIDB9LAotezB4MDAwOCwgICJOVjEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WXzAzLCAwfSwKLXsweDAwMDksICAiREFDNjQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVl8wMywgMH0sCi17MHgwMDE4LCAgIlJpdmExMjgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlZfMDMsIDB9LAotezB4MDAxOSwgICJSaXZhMTI4WlgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WXzAzLCAwfSwKLXsweDAwMjAsICAiVE5UIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFLCAgICBOVl8wNCwgMH0sCi17MHgwMDI4LCAgIlROVDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotezB4MDAyOSwgICJVVE5UMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEUsICAgIE5WXzA0LCAwfSwKLXsweDAwMkMsICAiVlROVDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFLCAgICBOVl8wNCwgMH0sCi17MHgwMEEwLCAgIklUTlQyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRSwgICAgTlZfMDQsIDB9LAotfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY29udGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM5MmMwLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9jb250ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAic2ltcGxlX2xpc3QuaCIKLSNpbmNsdWRlICJpbXBvcnRzLmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKLSNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgotCi0jaW5jbHVkZSAidG5sL3RubC5oIgotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0jaW5jbHVkZSAidG5sL3RfdnBfYnVpbGQuaCIKLQotI2luY2x1ZGUgImRyaXZlcnMvY29tbW9uL2RyaXZlcmZ1bmNzLmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2RyaXZlci5oIgotLy8jaW5jbHVkZSAibm91dmVhdV9zdGF0ZS5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc3Bhbi5oIgotI2luY2x1ZGUgIm5vdXZlYXVfb2JqZWN0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV90ZXguaCIKLSNpbmNsdWRlICJub3V2ZWF1X21zZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9sb2NrLmgiCi0jaW5jbHVkZSAibm91dmVhdV9xdWVyeS5oIgotI2luY2x1ZGUgIm52MDRfc3d0Y2wuaCIKLSNpbmNsdWRlICJudjEwX3N3dGNsLmgiCi0KLSNpbmNsdWRlICJ2YmxhbmsuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotI2luY2x1ZGUgInRleG1lbS5oIgotI2luY2x1ZGUgInhtbHBvb2wuaCIgLyogZm9yIHN5bWJvbGljIHZhbHVlcyBvZiBlbnVtLXR5cGUgb3B0aW9ucyAqLwotCi0jaWZuZGVmIE5PVVZFQVVfREVCVUcKLWludCBOT1VWRUFVX0RFQlVHID0gMDsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9kZWJ1Z19jb250cm9sIGRlYnVnX2NvbnRyb2xbXSA9Ci17Ci0JeyAic2hhZGVycyIgICAsIERFQlVHX1NIQURFUlMgICAgfSwKLQl7ICJtZW0iICAgICAgICwgREVCVUdfTUVNICAgICAgICB9LAotCXsgImJ1ZmZlcm9iaiIgLCBERUJVR19CVUZGRVJPQkogIH0sCi0JeyBOVUxMICAgICAgICAsIDAgICAgICAgICAgICAgICAgfQotfTsKLQotI2RlZmluZSBuZWVkX0dMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQotI2RlZmluZSBuZWVkX0dMX0FSQl9vY2NsdXNpb25fcXVlcnkKLSNpbmNsdWRlICJleHRlbnNpb25faGVscGVyLmgiCi0KLWNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNvbW1vbl9leHRlbnNpb25zW10gPQotewotCXsgTlVMTCwgICAgMCB9Ci19OwotCi1jb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBudjEwX2V4dGVuc2lvbnNbXSA9Ci17Ci0JeyBOVUxMLCAgICAwIH0KLX07Ci0KLWNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIG52MjBfZXh0ZW5zaW9uc1tdID0KLXsKLQl7IE5VTEwsICAgIDAgfQotfTsKLQotY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gbnYzMF9leHRlbnNpb25zW10gPQotewotCXsgIkdMX0FSQl9mcmFnbWVudF9wcm9ncmFtIiwJTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotCXsgTlVMTCwgICAgMCB9Ci19OwotCi1jb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBudjQwX2V4dGVuc2lvbnNbXSA9Ci17Ci0gICAvKiBBUkJfdnAgY2FuIGJlIG1vdmVkIHRvIG52MjAvMzAgb25jZSB0aGUgc2hhZGVyIGJhY2tlbmQgaGFzIGJlZW4KLSAgICAqIHdyaXR0ZW4gZm9yIHRob3NlIGNhcmRzLgotICAgICovCi0JeyAiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwJR0xfQVJCX3ZlcnRleF9wcm9ncmFtX2Z1bmN0aW9ucyB9LAotCXsgIkdMX0FSQl9vY2NsdXNpb25fcXVlcnkiLAlHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5X2Z1bmN0aW9uc30sCi0JeyBOVUxMLCAwIH0KLX07Ci0KLWNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIG52NTBfZXh0ZW5zaW9uc1tdID0KLXsKLQl7IE5VTEwsICAgIDAgfQotfTsKLQotLyogQ3JlYXRlIHRoZSBkZXZpY2Ugc3BlY2lmaWMgY29udGV4dC4KLSAqLwotR0xib29sZWFuIG5vdXZlYXVDcmVhdGVDb250ZXh0KCBjb25zdCBfX0dMY29udGV4dE1vZGVzICpnbFZpc3VhbCwKLQkJX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCXZvaWQgKnNoYXJlZENvbnRleHRQcml2YXRlICkKLXsKLQlHTGNvbnRleHQgKmN0eCwgKnNoYXJlQ3R4OwotCV9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYgPSBkcmlDb250ZXh0UHJpdi0+ZHJpU2NyZWVuUHJpdjsKLQlzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgZnVuY3Rpb25zOwotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhOwotCW5vdXZlYXVTY3JlZW5QdHIgc2NyZWVuOwotCi0JLyogQWxsb2NhdGUgdGhlIGNvbnRleHQgKi8KLQlubWVzYSA9IChub3V2ZWF1Q29udGV4dFB0cikgQ0FMTE9DKCBzaXplb2YoKm5tZXNhKSApOwotCWlmICggIW5tZXNhICkKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCi0Jbm1lc2EtPmRyaUNvbnRleHQgPSBkcmlDb250ZXh0UHJpdjsKLQlubWVzYS0+ZHJpU2NyZWVuID0gc1ByaXY7Ci0Jbm1lc2EtPmRyaURyYXdhYmxlID0gTlVMTDsKLQlubWVzYS0+aEhXQ29udGV4dCA9IGRyaUNvbnRleHRQcml2LT5oSFdDb250ZXh0OwotCW5tZXNhLT5kcmlId0xvY2sgPSAmc1ByaXYtPnBTQVJFQS0+bG9jazsKLQlubWVzYS0+ZHJpRmQgPSBzUHJpdi0+ZmQ7Ci0KLQlubWVzYS0+c2NyZWVuID0gKG5vdXZlYXVTY3JlZW5QdHIpKHNQcml2LT5wcml2YXRlKTsKLQlzY3JlZW49bm1lc2EtPnNjcmVlbjsKLQotCS8qIENyZWF0ZSB0aGUgaGFyZHdhcmUgY29udGV4dCAqLwotCWlmICghbm91dmVhdURSTUdldFBhcmFtKG5tZXNhLCBOT1VWRUFVX0dFVFBBUkFNX0ZCX1BIWVNJQ0FMLAotCQkgCQkmbm1lc2EtPnZyYW1fcGh5cykpCi0JICAgcmV0dXJuIEdMX0ZBTFNFOwotCWlmICghbm91dmVhdURSTUdldFBhcmFtKG5tZXNhLCBOT1VWRUFVX0dFVFBBUkFNX0ZCX1NJWkUsCi0JCSAJCSZubWVzYS0+dnJhbV9zaXplKSkKLQkgICByZXR1cm4gR0xfRkFMU0U7Ci0JaWYgKCFub3V2ZWF1RFJNR2V0UGFyYW0obm1lc2EsIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1BIWVNJQ0FMLAotCQkgCQkmbm1lc2EtPmdhcnRfcGh5cykpCi0JICAgcmV0dXJuIEdMX0ZBTFNFOwotCWlmICghbm91dmVhdURSTUdldFBhcmFtKG5tZXNhLCBOT1VWRUFVX0dFVFBBUkFNX0FHUF9TSVpFLAotCQkgCQkmbm1lc2EtPmdhcnRfc2l6ZSkpCi0JICAgcmV0dXJuIEdMX0ZBTFNFOwotCWlmICghbm91dmVhdUZpZm9Jbml0KG5tZXNhKSkKLQkgICByZXR1cm4gR0xfRkFMU0U7Ci0Jbm91dmVhdU9iamVjdEluaXQobm1lc2EpOwotCi0KLQkvKiBJbml0IGRlZmF1bHQgZHJpdmVyIGZ1bmN0aW9ucyB0aGVuIHBsdWcgaW4gb3VyIG5vdXZlYXUtc3BlY2lmaWMgZnVuY3Rpb25zCi0JICogKHRoZSB0ZXh0dXJlIGZ1bmN0aW9ucyBhcmUgZXNwZWNpYWxseSBpbXBvcnRhbnQpCi0JICovCi0JX21lc2FfaW5pdF9kcml2ZXJfZnVuY3Rpb25zKCAmZnVuY3Rpb25zICk7Ci0Jbm91dmVhdURyaXZlckluaXRGdW5jdGlvbnMoICZmdW5jdGlvbnMgKTsKLQlub3V2ZWF1VGV4SW5pdEZ1bmN0aW9ucyggJmZ1bmN0aW9ucyApOwotCi0JLyogQWxsb2NhdGUgdGhlIE1lc2EgY29udGV4dCAqLwotCWlmIChzaGFyZWRDb250ZXh0UHJpdmF0ZSkKLQkJc2hhcmVDdHggPSAoKG5vdXZlYXVDb250ZXh0UHRyKSBzaGFyZWRDb250ZXh0UHJpdmF0ZSktPmdsQ3R4OwotCWVsc2UgCi0JCXNoYXJlQ3R4ID0gTlVMTDsKLQlubWVzYS0+Z2xDdHggPSBfbWVzYV9jcmVhdGVfY29udGV4dChnbFZpc3VhbCwgc2hhcmVDdHgsCi0JCQkmZnVuY3Rpb25zLCAodm9pZCAqKSBubWVzYSk7Ci0JaWYgKCFubWVzYS0+Z2xDdHgpIHsKLQkJRlJFRShubWVzYSk7Ci0JCXJldHVybiBHTF9GQUxTRTsKLQl9Ci0JZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUgPSBubWVzYTsKLQljdHggPSBubWVzYS0+Z2xDdHg7Ci0KLQkvKiBQYXJzZSBjb25maWd1cmF0aW9uIGZpbGVzICovCi0JZHJpUGFyc2VDb25maWdGaWxlcyAoJm5tZXNhLT5vcHRpb25DYWNoZSwgJnNjcmVlbi0+b3B0aW9uQ2FjaGUsCi0JCQlzY3JlZW4tPmRyaVNjcmVlbi0+bXlOdW0sICJub3V2ZWF1Iik7Ci0KLQlubWVzYS0+c2FyZWEgPSAoc3RydWN0IGRybV9ub3V2ZWF1X3NhcmVhICopKChjaGFyICopc1ByaXYtPnBTQVJFQSArCi0JCQlzY3JlZW4tPnNhcmVhX3ByaXZfb2Zmc2V0KTsKLQotCS8qIEVuYWJsZSBhbnkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgKi8KLQlkcmlJbml0RXh0ZW5zaW9ucyhjdHgsIGNvbW1vbl9leHRlbnNpb25zLCBHTF9UUlVFKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl8xMCkKLQkJZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCBudjEwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl8yMCkKLQkJZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCBudjIwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl8zMCkKLQkJZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCBudjMwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl80MCkKLQkJZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCBudjQwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl81MCkKLQkJZHJpSW5pdEV4dGVuc2lvbnMoY3R4LCBudjUwX2V4dGVuc2lvbnMsIEdMX0ZBTFNFKTsKLQotCW5tZXNhLT5jdXJyZW50X3ByaW1pdGl2ZSA9IC0xOwotCi0Jbm91dmVhdVNoYWRlckluaXRGdW5jcyhjdHgpOwotCS8qIEluc3RhbGwgTWVzYSdzIGZpeGVkLWZ1bmN0aW9uIHRleGVudiBzaGFkZXIgc3VwcG9ydCAqLwotCWlmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlID49IE5WXzQwKQotCQljdHgtPkZyYWdtZW50UHJvZ3JhbS5fTWFpbnRhaW5UZXhFbnZQcm9ncmFtID0gR0xfVFJVRTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHN3cmFzdCAqLwotCV9zd3Jhc3RfQ3JlYXRlQ29udGV4dCggY3R4ICk7Ci0JX3Zib19DcmVhdGVDb250ZXh0KCBjdHggKTsKLQlfdG5sX0NyZWF0ZUNvbnRleHQoIGN0eCApOwotCV9zd3NldHVwX0NyZWF0ZUNvbnRleHQoIGN0eCApOwotCi0JX21hdGhfbWF0cml4X2N0cigmbm1lc2EtPnZpZXdwb3J0KTsKLQotCW5vdXZlYXVEREluaXRTdGF0ZUZ1bmNzKCBjdHggKTsKLQlub3V2ZWF1U3BhbkluaXRGdW5jdGlvbnMoIGN0eCApOwotCW5vdXZlYXVEREluaXRTdGF0ZSggbm1lc2EgKTsKLQlzd2l0Y2gobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSkKLQl7Ci0JCWNhc2UgTlZfMDM6Ci0JCQkvL252MDNUcmlJbml0RnVuY3Rpb25zKCBjdHggKTsKLQkJCWJyZWFrOwotCQljYXNlIE5WXzA0OgotCQljYXNlIE5WXzA1OgotCQkJbnYwNFRyaUluaXRGdW5jdGlvbnMoIGN0eCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlZfMTA6Ci0JCWNhc2UgTlZfMTE6Ci0JCWNhc2UgTlZfMTc6Ci0JCWNhc2UgTlZfMjA6Ci0JCWNhc2UgTlZfMzA6Ci0JCWNhc2UgTlZfNDA6Ci0JCWNhc2UgTlZfNDQ6Ci0JCWNhc2UgTlZfNTA6Ci0JCWRlZmF1bHQ6Ci0JCQludjEwVHJpSW5pdEZ1bmN0aW9ucyggY3R4ICk7Ci0JCQlicmVhazsKLQl9Ci0KLQlub3V2ZWF1SW5pdEJ1ZmZlck9iamVjdHMoY3R4KTsKLQlpZiAoIW5vdXZlYXVTeW5jSW5pdEZ1bmNzKGN0eCkpCi0JICAgcmV0dXJuIEdMX0ZBTFNFOwotCW5vdXZlYXVRdWVyeUluaXRGdW5jcyhjdHgpOwotCW5tZXNhLT5od19mdW5jLkluaXRDYXJkKG5tZXNhKTsKLSAgICAgICAgbm91dmVhdUluaXRTdGF0ZShjdHgpOwotCi0JZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUgPSAodm9pZCAqKW5tZXNhOwotCi0JTk9VVkVBVV9ERUJVRyA9IGRyaVBhcnNlRGVidWdTdHJpbmcoIGdldGVudiggIk5PVVZFQVVfREVCVUciICksCi0JCQlkZWJ1Z19jb250cm9sICk7Ci0KLQlpZiAoZHJpUXVlcnlPcHRpb25iKCZubWVzYS0+b3B0aW9uQ2FjaGUsICJub19yYXN0IikpIHsKLQkJZnByaW50ZihzdGRlcnIsICJkaXNhYmxpbmcgM0QgYWNjZWxlcmF0aW9uXG4iKTsKLQkJRkFMTEJBQ0sobm1lc2EsIE5PVVZFQVVfRkFMTEJBQ0tfRElTQUJMRSwgMSk7Ci0JfQotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLS8qIERlc3Ryb3kgdGhlIGRldmljZSBzcGVjaWZpYyBjb250ZXh0LiAqLwotdm9pZCBub3V2ZWF1RGVzdHJveUNvbnRleHQoIF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2ICApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSAobm91dmVhdUNvbnRleHRQdHIpIGRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOwotCi0JYXNzZXJ0KG5tZXNhKTsKLQlpZiAoIG5tZXNhICkgewotCQkvKiBmcmVlIHRoZSBvcHRpb24gY2FjaGUgKi8KLQkJZHJpRGVzdHJveU9wdGlvbkNhY2hlICgmbm1lc2EtPm9wdGlvbkNhY2hlKTsKLQotCQlGUkVFKCBubWVzYSApOwotCX0KLQotfQotCi0KLS8qIEZvcmNlIHRoZSBjb250ZXh0IGBjJyB0byBiZSB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBhc3NvY2lhdGUgd2l0aCBpdAotICogYnVmZmVyIGBiJy4KLSAqLwotR0xib29sZWFuIG5vdXZlYXVNYWtlQ3VycmVudCggX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCi0JCV9fRFJJZHJhd2FibGVQcml2YXRlICpkcmlEcmF3UHJpdiwKLQkJX19EUklkcmF3YWJsZVByaXZhdGUgKmRyaVJlYWRQcml2ICkKLXsKLQlpZiAoIGRyaUNvbnRleHRQcml2ICkgewotCQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IChub3V2ZWF1Q29udGV4dFB0cikgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7Ci0JCXN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZHJhd19mYiA9Ci0JCQkoc3RydWN0IGdsX2ZyYW1lYnVmZmVyKilkcmlEcmF3UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQkJc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpyZWFkX2ZiID0KLQkJCShzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIqKWRyaVJlYWRQcml2LT5kcml2ZXJQcml2YXRlOwotCi0JCWRyaURyYXdhYmxlSW5pdFZCbGFuayhkcmlEcmF3UHJpdiwgbm1lc2EtPnZibGFua19mbGFncywgJm5tZXNhLT52Ymxhbmtfc2VxICk7Ci0JCW5tZXNhLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OwotCi0JCV9tZXNhX3Jlc2l6ZV9mcmFtZWJ1ZmZlcihubWVzYS0+Z2xDdHgsIGRyYXdfZmIsCi0JCQkJCSBkcmlEcmF3UHJpdi0+dywgZHJpRHJhd1ByaXYtPmgpOwotCQlpZiAoZHJhd19mYiAhPSByZWFkX2ZiKSB7Ci0JCQlfbWVzYV9yZXNpemVfZnJhbWVidWZmZXIobm1lc2EtPmdsQ3R4LCBkcmF3X2ZiLAotCQkJCQkJIGRyaVJlYWRQcml2LT53LAotCQkJCQkJIGRyaVJlYWRQcml2LT5oKTsKLQkJfQotCQlfbWVzYV9tYWtlX2N1cnJlbnQobm1lc2EtPmdsQ3R4LCBkcmF3X2ZiLCByZWFkX2ZiKTsKLQotCQlub3V2ZWF1X2J1aWxkX2ZyYW1lYnVmZmVyKG5tZXNhLT5nbEN0eCwKLQkJICAgICAgCQkJICBkcmlEcmF3UHJpdi0+ZHJpdmVyUHJpdmF0ZSk7Ci0JfSBlbHNlIHsKLQkJX21lc2FfbWFrZV9jdXJyZW50KCBOVUxMLCBOVUxMLCBOVUxMICk7Ci0JfQotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLQotLyogRm9yY2UgdGhlIGNvbnRleHQgYGMnIHRvIGJlIHVuYm91bmQgZnJvbSBpdHMgYnVmZmVyLgotICovCi1HTGJvb2xlYW4gbm91dmVhdVVuYmluZENvbnRleHQoIF9fRFJJY29udGV4dFByaXZhdGUgKmRyaUNvbnRleHRQcml2ICkKLXsKLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotc3RhdGljIHZvaWQgbm91dmVhdURvU3dhcEJ1ZmZlcnMobm91dmVhdUNvbnRleHRQdHIgbm1lc2EsCi0JCQkJIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdikKLXsKLQlzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiOwotCW5vdXZlYXVfcmVuZGVyYnVmZmVyICpzcmMsICpkc3Q7Ci0JZHJtX2NsaXBfcmVjdF90ICpib3g7Ci0JaW50IG5ib3gsIGk7Ci0KLQlmYiA9IChzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKilkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQlkc3QgPSAobm91dmVhdV9yZW5kZXJidWZmZXIqKQotCQlmYi0+QXR0YWNobWVudFtCVUZGRVJfRlJPTlRfTEVGVF0uUmVuZGVyYnVmZmVyOwotCXNyYyA9IChub3V2ZWF1X3JlbmRlcmJ1ZmZlciopCi0JCWZiLT5BdHRhY2htZW50W0JVRkZFUl9CQUNLX0xFRlRdLlJlbmRlcmJ1ZmZlcjsKLQotI2lmZGVmIEFMTE9XX01VTFRJX1NVQkNIQU5ORUwKLQlMT0NLX0hBUkRXQVJFKG5tZXNhKTsKLQluYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKLQlib3ggID0gZFByaXYtPnBDbGlwUmVjdHM7Ci0KLQlpZiAobmJveCkgewotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWJDdHhTdXJmMkQsCi0JCQkJTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJEX0ZPUk1BVCwgNCk7Ci0JCWlmIChzcmMtPm1lc2EuX0FjdHVhbEZvcm1hdCA9PSBHTF9SR0JBOCkKLQkJCU9VVF9SSU5HICAgICAgICg2KTsgLyogWDhSOEc4QjggKi8KLQkJZWxzZQotCQkJT1VUX1JJTkcgICAgICAgKDQpOyAvKiBSNUc2QjUgKi8KLQkJT1VUX1JJTkcgICAgICAgKChkc3QtPnBpdGNoIDw8IDE2KSB8IHNyYy0+cGl0Y2gpOwotCQlPVVRfUklORyAgICAgICAoc3JjLT5vZmZzZXQpOwotCQlPVVRfUklORyAgICAgICAoZHN0LT5vZmZzZXQpOwotCX0KLQotCWZvciAoaT0wOyBpPG5ib3g7IGkrKywgYm94KyspIHsKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViSW1hZ2VCbGl0LCBOVjEwX0lNQUdFX0JMSVRfU0VUX1BPSU5ULCAzKTsKLQkJT1VUX1JJTkcgICAgICAgKCgoYm94LT55MSAtIGRQcml2LT55KSA8PCAxNikgfAotCQkJCShib3gtPngxIC0gZFByaXYtPngpKTsKLQkJT1VUX1JJTkcgICAgICAgKChib3gtPnkxIDw8IDE2KSB8IGJveC0+eDEpOwotCQlPVVRfUklORyAgICAgICAoKChib3gtPnkyIC0gYm94LT55MSkgPDwgMTYpIHwKLQkJCQkoYm94LT54MiAtIGJveC0+eDEpKTsKLQl9Ci0JRklSRV9SSU5HKCk7Ci0KLQlVTkxPQ0tfSEFSRFdBUkUobm1lc2EpOwotI2VuZGlmCi19Ci0KLXZvaWQgbm91dmVhdVN3YXBCdWZmZXJzKF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdikKLXsKLQlpZiAoZFByaXYtPmRyaUNvbnRleHRQcml2ICYmIGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSkgewotCQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IGRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKLQotCQlpZiAobm1lc2EtPmdsQ3R4LT5WaXN1YWwuZG91YmxlQnVmZmVyTW9kZSkgewotCQkJX21lc2Ffbm90aWZ5U3dhcEJ1ZmZlcnMobm1lc2EtPmdsQ3R4KTsKLQkJCW5vdXZlYXVEb1N3YXBCdWZmZXJzKG5tZXNhLCBkUHJpdik7Ci0JCX0KLQotCX0KLX0KLQotdm9pZCBub3V2ZWF1Q29weVN1YkJ1ZmZlcihfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCi0JCQkgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQotewotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY3RybHJlZy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2N0cmxyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMmQ1OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfY3RybHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbiwgU3lsdmFpbiBNdW5hdXQKLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLQotI2RlZmluZSBOVjAzX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNmIwCi0jZGVmaW5lIE5WMDRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MDAKLQotI2RlZmluZSBOVjAzX0ZJRk9fUkVHU19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwCi0jICAgIGRlZmluZSBOVjAzX0ZJRk9fUkVHU19ETUFQVVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSMgICAgZGVmaW5lIE5WMDNfRklGT19SRUdTX0RNQUdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0NAotCi0vKiBGaWZvIGNvbW1hbmRzLiBUaGVzZSBhcmUgbm90IHJlZ3MsIG5laXRoZXIgbWFza3MgKi8KLSNkZWZpbmUgTlYwM19GSUZPX0NNRF9KVU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBOVjAzX0ZJRk9fQ01EX0pVTVBfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDFmZmZmZmZjCi0jZGVmaW5lIE5WMDNfRklGT19DTURfUkVXSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVjAzX0ZJRk9fQ01EX0pVTVAgfCAoMCAmIE5WMDNfRklGT19DTURfSlVNUF9PRkZTRVRfTUFTSykpCi0KLQotI2RlZmluZSBOT05JTkNfTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9kcmkuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9kcmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzYzNmYi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfZHJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaWZuZGVmIF9OT1VWRUFVX0RSSV8KLSNkZWZpbmUgX05PVVZFQVVfRFJJXwotCi0jaW5jbHVkZSAieGY4NmRybS5oIgotI2luY2x1ZGUgImRybS5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1aW50MzJfdCBkZXZpY2VfaWQ7CS8qKjwgXGJyaWVmIFBDSSBkZXZpY2UgSUQgKi8KLQl1aW50MzJfdCB3aWR0aDsJCS8qKjwgXGJyaWVmIHdpZHRoIGluIHBpeGVscyBvZiBkaXNwbGF5ICovCi0JdWludDMyX3QgaGVpZ2h0OwkvKio8IFxicmllZiBoZWlnaHQgaW4gc2NhbmxpbmVzIG9mIGRpc3BsYXkgKi8KLQl1aW50MzJfdCBkZXB0aDsJCS8qKjwgXGJyaWVmIGRlcHRoIG9mIGRpc3BsYXkgKDgsIDE1LCAxNiwgMjQpICovCi0JdWludDMyX3QgYnBwOwkJLyoqPCBcYnJpZWYgYml0IGRlcHRoIG9mIGRpc3BsYXkgKDgsIDE2LCAyNCwgMzIpICovCi0KLQl1aW50MzJfdCBidXNfdHlwZTsJLyoqPCBcYnJpZWYgdGhzIGJ1cyB0eXBlICovCi0JdWludDMyX3QgYnVzX21vZGU7CS8qKjwgXGJyaWVmIGJ1cyBtb2RlICh1c2VkIGZvciBBR1AsIG1heWJlIGFsc28gZm9yIFBDSS1FID8pICovCi0KLQl1aW50MzJfdCBmcm9udF9vZmZzZXQ7CS8qKjwgXGJyaWVmIGZyb250IGJ1ZmZlciBvZmZzZXQgKi8KLQl1aW50MzJfdCBmcm9udF9waXRjaDsJLyoqPCBcYnJpZWYgZnJvbnQgYnVmZmVyIHBpdGNoICovCi0JdWludDMyX3QgYmFja19vZmZzZXQ7CS8qKjwgXGJyaWVmIHByaXZhdGUgYmFjayBidWZmZXIgb2Zmc2V0ICovCi0JdWludDMyX3QgYmFja19waXRjaDsJLyoqPCBcYnJpZWYgcHJpdmF0ZSBiYWNrIGJ1ZmZlciBwaXRjaCAqLwotCXVpbnQzMl90IGRlcHRoX29mZnNldDsJLyoqPCBcYnJpZWYgcHJpdmF0ZSBkZXB0aCBidWZmZXIgb2Zmc2V0ICovCi0JdWludDMyX3QgZGVwdGhfcGl0Y2g7CS8qKjwgXGJyaWVmIHByaXZhdGUgZGVwdGggYnVmZmVyIHBpdGNoICovCi0KLX0gTk9VVkVBVURSSVJlYywgKk5PVVZFQVVEUklQdHI7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfZHJpdmVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzk1MzUuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2RyaXZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotLy8jaW5jbHVkZSAibm91dmVhdV9zdGF0ZS5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbG9jay5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZHJpdmVyLmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImZyYW1lYnVmZmVyLmgiCi0KLSNpbmNsdWRlICJ1dGlscy5oIgotCi0vKiBXcmFwcGVyIGZvciBEUk1fTk9VVkVBVV9HRVRQQVJBTSBpb2N0bCAqLwotR0xib29sZWFuIG5vdXZlYXVEUk1HZXRQYXJhbShub3V2ZWF1Q29udGV4dFB0ciBubWVzYSwKLQkJCSAgICAgdW5zaWduZWQgaW50ICAgICAgcGFyYW0sCi0JCQkgICAgIHVpbnQ2NF90KiAgICAgICAgIHZhbHVlKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSBnZXRwOwotCi0JZ2V0cC5wYXJhbSA9IHBhcmFtOwotCWlmICghdmFsdWUgfHwgZHJtQ29tbWFuZFdyaXRlUmVhZChubWVzYS0+ZHJpRmQsIERSTV9OT1VWRUFVX0dFVFBBUkFNLAotCQkJCQkgICZnZXRwLCBzaXplb2YoZ2V0cCkpKQotCQlyZXR1cm4gR0xfRkFMU0U7Ci0JKnZhbHVlID0gZ2V0cC52YWx1ZTsKLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotLyogV3JhcHBlciBmb3IgRFJNX05PVVZFQVVfR0VUUEFSQU0gaW9jdGwgKi8KLUdMYm9vbGVhbiBub3V2ZWF1RFJNU2V0UGFyYW0obm91dmVhdUNvbnRleHRQdHIgbm1lc2EsCi0JCQkgICAgIHVuc2lnbmVkIGludCAgICAgIHBhcmFtLAotCQkJICAgICB1aW50NjRfdCAgICAgICAgICB2YWx1ZSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfc2V0cGFyYW0gc2V0cDsKLQotCXNldHAucGFyYW0gPSBwYXJhbTsKLQlzZXRwLnZhbHVlID0gdmFsdWU7Ci0JaWYgKGRybUNvbW1hbmRXcml0ZShubWVzYS0+ZHJpRmQsIERSTV9OT1VWRUFVX1NFVFBBUkFNLCAmc2V0cCwKLQkJCQlzaXplb2Yoc2V0cCkpKQotCQlyZXR1cm4gR0xfRkFMU0U7Ci0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLS8qIFJldHVybiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY3VycmVudCBjb2xvciBidWZmZXIgKi8KLXN0YXRpYyB2b2lkIG5vdXZlYXVHZXRCdWZmZXJTaXplKCBHTGZyYW1lYnVmZmVyICpidWZmZXIsCi0JCUdMdWludCAqd2lkdGgsIEdMdWludCAqaGVpZ2h0ICkKLXsKLQlHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUxPQ0tfSEFSRFdBUkUoIG5tZXNhICk7Ci0JKndpZHRoICA9IG5tZXNhLT5kcmlEcmF3YWJsZS0+dzsKLQkqaGVpZ2h0ID0gbm1lc2EtPmRyaURyYXdhYmxlLT5oOwotCVVOTE9DS19IQVJEV0FSRSggbm1lc2EgKTsKLX0KLQotLyogZ2xHZXRTdHJpbmcgKi8KLXN0YXRpYyBjb25zdCBHTHVieXRlICpub3V2ZWF1R2V0U3RyaW5nKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG5hbWUgKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEyOF07Ci0JY29uc3QgY2hhciAqIGNhcmRfbmFtZSA9ICJVbmtub3duIjsKLQlHTHVpbnQgYWdwX21vZGUgPSAwOwotCi0Jc3dpdGNoICggbmFtZSApIHsKLQkJY2FzZSBHTF9WRU5ET1I6Ci0JCQlyZXR1cm4gKEdMdWJ5dGUgKilEUklWRVJfQVVUSE9SOwotCi0JCWNhc2UgR0xfUkVOREVSRVI6Ci0JCQljYXJkX25hbWU9bm1lc2EtPnNjcmVlbi0+Y2FyZC0+bmFtZTsKLQotCQkJc3dpdGNoKG5tZXNhLT5zY3JlZW4tPmJ1c190eXBlKQotCQkJewotCQkJCWNhc2UgTlZfUENJOgotCQkJCWNhc2UgTlZfUENJRToKLQkJCQlkZWZhdWx0OgotCQkJCQlhZ3BfbW9kZT0wOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5WX0FHUDoKLQkJCQkJYWdwX21vZGU9bm1lc2EtPnNjcmVlbi0+YWdwX21vZGU7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJZHJpR2V0UmVuZGVyZXJTdHJpbmcoIGJ1ZmZlciwgY2FyZF9uYW1lLCBEUklWRVJfREFURSwKLQkJCQkJYWdwX21vZGUgKTsKLQkJCXJldHVybiAoR0x1Ynl0ZSAqKWJ1ZmZlcjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBOVUxMOwotCX0KLX0KLQotLyogZ2xGbHVzaCAqLwotc3RhdGljIHZvaWQgbm91dmVhdUZsdXNoKCBHTGNvbnRleHQgKmN0eCApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlGSVJFX1JJTkcoKTsKLX0KLQotLyogZ2xGaW5pc2ggKi8KLXN0YXRpYyB2b2lkIG5vdXZlYXVGaW5pc2goIEdMY29udGV4dCAqY3R4ICkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCW5vdXZlYXVGbHVzaCggY3R4ICk7Ci0Jbm91dmVhdVdhaXRGb3JJZGxlKCBubWVzYSApOwotfQotCi0vKiBnbENsZWFyICovCi1zdGF0aWMgdm9pZCBub3V2ZWF1Q2xlYXIoIEdMY29udGV4dCAqY3R4LCBHTGJpdGZpZWxkIG1hc2sgKQotewotCS8vIFhYWCB3ZSByZWFsbHkgc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlLi4uCi19Ci0KLXZvaWQgbm91dmVhdURyaXZlckluaXRGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLQlmdW5jdGlvbnMtPkdldEJ1ZmZlclNpemUJPSBub3V2ZWF1R2V0QnVmZmVyU2l6ZTsKLQlmdW5jdGlvbnMtPlJlc2l6ZUJ1ZmZlcnMJPSBfbWVzYV9yZXNpemVfZnJhbWVidWZmZXI7Ci0JZnVuY3Rpb25zLT5HZXRTdHJpbmcJCT0gbm91dmVhdUdldFN0cmluZzsKLQlmdW5jdGlvbnMtPkZsdXNoCQk9IG5vdXZlYXVGbHVzaDsKLQlmdW5jdGlvbnMtPkZpbmlzaAkJPSBub3V2ZWF1RmluaXNoOwotCWZ1bmN0aW9ucy0+Q2xlYXIJCT0gbm91dmVhdUNsZWFyOwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfZHJpdmVyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfZHJpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjQwMTIuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2RyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotI2lmbmRlZiBfX05PVVZFQVVfRFJJVkVSX0hfXwotI2RlZmluZSBfX05PVVZFQVVfRFJJVkVSX0hfXwotCi0jZGVmaW5lIERSSVZFUl9EQVRFCSIyMDA2MDIxOSIKLSNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiU3RlcGhhbmUgTWFyY2hlc2luIgotCi1leHRlcm4gdm9pZCBub3V2ZWF1RHJpdmVySW5pdEZ1bmN0aW9ucyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKTsKLWV4dGVybiBHTGJvb2xlYW4gbm91dmVhdURSTUdldFBhcmFtKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCB1bnNpZ25lZCBpbnQgcGFyYW0sCi0gICAgICAJCQkJICAgIHVpbnQ2NF90ICp2YWx1ZSk7Ci1leHRlcm4gR0xib29sZWFuIG5vdXZlYXVEUk1TZXRQYXJhbShub3V2ZWF1Q29udGV4dFB0ciBubWVzYSwgdW5zaWduZWQgaW50IHBhcmFtLAotICAgICAgCQkJCSAgICB1aW50NjRfdCB2YWx1ZSk7Ci0KLSNlbmRpZiAvKiBfX05PVVZFQVVfRFJJVkVSX0hfXyAqLwotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfbG9jay5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NmM5ZS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2xvY2suaCIKLQotI2luY2x1ZGUgImRyaXJlbmRlcmJ1ZmZlci5oIgotI2luY2x1ZGUgImZyYW1lYnVmZmVyLmgiCi0KLQotLyogVXBkYXRlIHRoZSBoYXJkd2FyZSBzdGF0ZS4gIFRoaXMgaXMgY2FsbGVkIGlmIGFub3RoZXIgY29udGV4dCBoYXMKLSAqIGdyYWJiZWQgdGhlIGhhcmR3YXJlIGxvY2ssIHdoaWNoIGluY2x1ZGVzIHRoZSBYIHNlcnZlci4gIFRoaXMKLSAqIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyB0aGUgZHJpdmVyJ3Mgd2luZG93IHN0YXRlIGFmdGVyIHRoZSBYIHNlcnZlcgotICogbW92ZXMsIHJlc2l6ZXMgb3IgcmVzdGFja3MgYSB3aW5kb3cgLS0gdGhlIGNoYW5nZSB3aWxsIGJlIHJlZmxlY3RlZAotICogaW4gdGhlIGRyYXdhYmxlIHBvc2l0aW9uIGFuZCBjbGlwIHJlY3RzLiAgU2luY2UgdGhlIFggc2VydmVyIGdyYWJzCi0gKiB0aGUgaGFyZHdhcmUgbG9jayB3aGVuIGl0IGNoYW5nZXMgdGhlIHdpbmRvdyBzdGF0ZSwgdGhpcyByb3V0aW5lIHdpbGwKLSAqIGF1dG9tYXRpY2FsbHkgYmUgY2FsbGVkIGFmdGVyIHN1Y2ggYSBjaGFuZ2UuCi0gKi8KLXZvaWQgbm91dmVhdUdldExvY2soIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCBHTHVpbnQgZmxhZ3MgKQotewotICAgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gbm1lc2EtPmRyaURyYXdhYmxlOwotICAgX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdiA9IG5tZXNhLT5kcmlTY3JlZW47Ci0gICBzdHJ1Y3QgZHJtX25vdXZlYXVfc2FyZWEgKnNhcmVhID0gbm1lc2EtPnNhcmVhOwotCi0gICBkcm1HZXRMb2NrKCBubWVzYS0+ZHJpRmQsIG5tZXNhLT5oSFdDb250ZXh0LCBmbGFncyApOwotCi0gICAvKiBUaGUgd2luZG93IG1pZ2h0IGhhdmUgbW92ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gZ2V0IG5ldyBjbGlwCi0gICAgKiByZWN0cy4KLSAgICAqCi0gICAgKiBOT1RFOiBUaGlzIHJlbGVhc2VzIGFuZCByZWdyYWJzIHRoZSBodyBsb2NrIHRvIGFsbG93IHRoZSBYIHNlcnZlcgotICAgICogdG8gcmVzcG9uZCB0byB0aGUgRFJJIHByb3RvY29sIHJlcXVlc3QgZm9yIG5ldyBkcmF3YWJsZSBpbmZvLgotICAgICogU2luY2UgdGhlIGhhcmR3YXJlIHN0YXRlIGRlcGVuZHMgb24gaGF2aW5nIHRoZSBsYXRlc3QgZHJhd2FibGUKLSAgICAqIGNsaXAgcmVjdHMsIGFsbCBzdGF0ZSBjaGVja2luZyBtdXN0IGJlIGRvbmUgX2FmdGVyXyB0aGlzIGNhbGwuCi0gICAgKi8KLSAgIERSSV9WQUxJREFURV9EUkFXQUJMRV9JTkZPKCBzUHJpdiwgZFByaXYgKTsKLQotICAgLyogSWYgdGltZXN0YW1wcyBkb24ndCBtYXRjaCwgdGhlIHdpbmRvdyBoYXMgYmVlbiBjaGFuZ2VkICovCi0gICBpZiAobm1lc2EtPmxhc3RTdGFtcCAhPSBkUHJpdi0+bGFzdFN0YW1wKSB7Ci0gICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gKHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqKWRQcml2LT5kcml2ZXJQcml2YXRlOwotCi0gICAgICAvKiBfbWVzYV9yZXNpemVfZnJhbWVidWZmZXIgd2lsbCB0YWtlIGNhcmUgb2YgY2FsbGluZyB0aGUgcmVuZGVyYnVmZmVyJ3MKLSAgICAgICAqIEFsbG9jU3RvcmFnZSBmdW5jdGlvbiBpZiB3ZSBuZWVkIG1vcmUgbWVtb3J5IHRvIGhvbGQgaXQgKi8KLSAgICAgIGlmIChmYi0+V2lkdGggIT0gZFByaXYtPncgfHwgZmItPkhlaWdodCAhPSBkUHJpdi0+aCkgewotCSBfbWVzYV9yZXNpemVfZnJhbWVidWZmZXIobm1lc2EtPmdsQ3R4LCBmYiwgZFByaXYtPncsIGRQcml2LT5oKTsKLQkgLyogcmVzaXplIGJ1ZmZlcnMsIHdpbGwgY2FsbCBub3V2ZWF1X3dpbmRvd19tb3ZlZCAqLwotCSBub3V2ZWF1X2J1aWxkX2ZyYW1lYnVmZmVyKG5tZXNhLT5nbEN0eCwgZmIpOwotICAgICAgfSBlbHNlIHsKLQkgbm91dmVhdV93aW5kb3dfbW92ZWQobm1lc2EtPmdsQ3R4KTsKLSAgICAgIH0KLQotICAgICAgbm1lc2EtPmxhc3RTdGFtcCA9IGRQcml2LT5sYXN0U3RhbXA7Ci0gICB9Ci0KLSAgIG5tZXNhLT5udW1DbGlwUmVjdHMgPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwotICAgbm1lc2EtPnBDbGlwUmVjdHMgPSBkUHJpdi0+cENsaXBSZWN0czsKLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2xvY2suaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9sb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmIwMDEuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fTk9VVkVBVV9MT0NLX0hfXwotI2RlZmluZSBfX05PVVZFQVVfTE9DS19IX18KLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotCi1leHRlcm4gdm9pZCBub3V2ZWF1R2V0TG9jayggbm91dmVhdUNvbnRleHRQdHIgbm1lc2EsIEdMdWludCBmbGFncyApOwotCi0vKgotICogISEhIFdlIG1heSB3YW50IHRvIHNlcGFyYXRlIGxvY2tzIGZyb20gbG9ja3Mgd2l0aCB2YWxpZGF0aW9uLiAgVGhpcwotICogY291bGQgYmUgdXNlZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvciB0aG9zZSB0aGluZ3MgY29tbWFuZHMgdGhhdAotICogZG8gbm90IGRvIGFueSBkcmF3aW5nICEhIQotICovCi0KLS8qIExvY2sgdGhlIGhhcmR3YXJlIGFuZCB2YWxpZGF0ZSBvdXIgc3RhdGUuCi0gKi8KLSNkZWZpbmUgTE9DS19IQVJEV0FSRSggbm1lc2EgKQkJCQkJCVwKLSAgIGRvIHsJCQkJCQkJCQlcCi0gICAgICBjaGFyIF9fcmV0ID0gMDsJCQkJCQkJXAotICAgICAgREVCVUdfQ0hFQ0tfTE9DSygpOwkJCQkJCVwKLSAgICAgIERSTV9DQVMoIG5tZXNhLT5kcmlId0xvY2ssIG5tZXNhLT5oSFdDb250ZXh0LAkJCVwKLQkgICAgICAgKERSTV9MT0NLX0hFTEQgfCBubWVzYS0+aEhXQ29udGV4dCksIF9fcmV0ICk7CQlcCi0gICAgICBpZiAoIF9fcmV0ICkJCQkJCQkJXAotCSBub3V2ZWF1R2V0TG9jayggbm1lc2EsIDAgKTsJCQkJCVwKLSAgICAgIERFQlVHX0xPQ0soKTsJCQkJCQkJXAotICAgfSB3aGlsZSAoMCkKLQotLyogVW5sb2NrIHRoZSBoYXJkd2FyZS4KLSAqLwotI2RlZmluZSBVTkxPQ0tfSEFSRFdBUkUoIG5tZXNhICkJCQkJCVwKLSAgIGRvIHsJCQkJCQkJCQlcCi0gICAgICBEUk1fVU5MT0NLKCBubWVzYS0+ZHJpRmQsCQkJCQkJXAotCQkgIG5tZXNhLT5kcmlId0xvY2ssCQkJCQlcCi0JCSAgbm1lc2EtPmhIV0NvbnRleHQgKTsJCQkJCVwKLSAgICAgIERFQlVHX1JFU0VUKCk7CQkJCQkJCVwKLSAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgREVCVUdfTE9DSygpCi0jZGVmaW5lIERFQlVHX1JFU0VUKCkKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTE9DSygpCi0KLQotI2VuZGlmIC8qIF9fTk9VVkVBVV9MT0NLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X21zZy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X21zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVhMjE4Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi1Db3B5cmlnaHQgKEMpIFRoZSBXZWF0aGVyIENoYW5uZWwsIEluYy4gIDIwMDIuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotQ29weXJpZ2h0IDIwMDYgU3RlcGhhbmUgTWFyY2hlc2luLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVRoZSBXZWF0aGVyIENoYW5uZWwgKFRNKSBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8gZGV2ZWxvcCB0aGUKLWluaXRpYWwgcmVsZWFzZSBvZiB0aGUgUmFkZW9uIDg1MDAgZHJpdmVyIHVuZGVyIHRoZSBYRnJlZTg2IGxpY2Vuc2UuCi1UaGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi1uZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAotcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBBdXRob3JzOgotICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+Ci0gKiAgIE5pY29sYWkgSGFlaG5sZSA8cHJlZmVjdF9AZ214Lm5ldD4KLSAqLwotCi0KLSNpZm5kZWYgX19OT1VWRUFVX01TR19IX18KLSNkZWZpbmUgX19OT1VWRUFVX01TR19IX18KLQotI2RlZmluZSBXQVJOX09OQ0UoYSwgLi4uKSBkbyB7XAotCSAgICAgICAgc3RhdGljIGludCB3YXJuIyNfX0xJTkVfXz0xO1wKLQkgICAgICAgIGlmKHdhcm4jI19fTElORV9fKXtcCi0JCQkgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipXQVJOX09OQ0UqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpO1wKLQkJCSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgJXMgZnVuY3Rpb24gJXMgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pO1wKLQkJCSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIGEsICMjIF9fVkFfQVJHU19fKTtcCi0JCQkgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpO1wKLQkJCSAgICAgICAgICAgICAgICB3YXJuIyNfX0xJTkVfXz0wO1wKLQkJCSAgICAgICAgICAgICAgICB9IFwKLQkgICAgICAgIH13aGlsZSgwKQotCi0jZGVmaW5lIE1FU1NBR0UoYSwgLi4uKSBkb3tcCi0JICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqSU5GTyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTtcCi0JICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBmdW5jdGlvbiAlcyBsaW5lICVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLQkgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICBhLCAjIyBfX1ZBX0FSR1NfXyk7XAotCSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7XAotCSAgICAgICAgfXdoaWxlKDApCi0KLSNkZWZpbmUgRkFUQUwoYSwgLi4uKSBkb3tcCi0JICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipGQVRBTCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTtcCi0JICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBmdW5jdGlvbiAlcyBsaW5lICVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLQkgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICBhLCAjIyBfX1ZBX0FSR1NfXyk7XAotCSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7XAotCSAgICAgICAgfXdoaWxlKDApCi0KLSNlbmRpZiAvKiBfX05PVVZFQVVfTVNHX0hfXyAqLwotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDM0ODguLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotCi0KLUdMYm9vbGVhbiBub3V2ZWF1Q3JlYXRlQ29udGV4dE9iamVjdChub3V2ZWF1Q29udGV4dFB0ciBubWVzYSwKLQkJCQkgICAgIHVpbnQzMl90IGhhbmRsZSwgaW50IGNsYXNzKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9ncm9ial9hbGxvYyBjdG87Ci0JaW50IHJldDsKLQotCWN0by5jaGFubmVsID0gbm1lc2EtPmZpZm8uY2hhbm5lbDsKLQljdG8uaGFuZGxlICA9IGhhbmRsZTsKLQljdG8uY2xhc3MgICA9IGNsYXNzOwotCXJldCA9IGRybUNvbW1hbmRXcml0ZShubWVzYS0+ZHJpRmQsIERSTV9OT1VWRUFVX0dST0JKX0FMTE9DLAotCQkJICAgICAgJmN0bywgc2l6ZW9mKGN0bykpOwotCi0JcmV0dXJuIHJldCA9PSAwOwotfQotCi12b2lkIG5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm91dmVhdUNvbnRleHRQdHIgbm1lc2EsIGludCBzdWJjaGFubmVsLCBpbnQgaGFuZGxlKQotewotCUJFR0lOX1JJTkdfU0laRShzdWJjaGFubmVsLCAwLCAxKTsKLQlPVVRfUklORyhoYW5kbGUpOwotfQotCi12b2lkIG5vdXZlYXVPYmplY3RJbml0KG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotI2lmZGVmIE5PVVZFQVVfUklOR19ERUJVRwotCXJldHVybjsKLSNlbmRpZgotCi0Jbm91dmVhdUNyZWF0ZUNvbnRleHRPYmplY3Qobm1lc2EsIE52M0QsIG5tZXNhLT5zY3JlZW4tPmNhcmQtPmNsYXNzXzNkKTsKLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT49TlZfMTApIHsKLQkJbm91dmVhdUNyZWF0ZUNvbnRleHRPYmplY3Qobm1lc2EsIE52Q3R4U3VyZjJELCBOVjEwX0NPTlRFWFRfU1VSRkFDRVNfMkQpOwotCX0gZWxzZSB7Ci0JCW5vdXZlYXVDcmVhdGVDb250ZXh0T2JqZWN0KG5tZXNhLCBOdkN0eFN1cmYyRCwgTlYwNF9DT05URVhUX1NVUkZBQ0VTXzJEKTsKLQkJbm91dmVhdUNyZWF0ZUNvbnRleHRPYmplY3Qobm1lc2EsIE52Q3R4U3VyZjNELCBOVjA0X0NPTlRFWFRfU1VSRkFDRVNfM0QpOwotCX0KLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT49TlZfMTEpIHsKLQkJbm91dmVhdUNyZWF0ZUNvbnRleHRPYmplY3Qobm1lc2EsIE52SW1hZ2VCbGl0LCBOVjEwX0lNQUdFX0JMSVQpOwotCX0gZWxzZSB7Ci0JCW5vdXZlYXVDcmVhdGVDb250ZXh0T2JqZWN0KG5tZXNhLCBOdkltYWdlQmxpdCwgTlZfSU1BR0VfQkxJVCk7Ci0JfQotCW5vdXZlYXVDcmVhdGVDb250ZXh0T2JqZWN0KG5tZXNhLCBOdk1lbUZvcm1hdCwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQpOwotCi0jaWZkZWYgQUxMT1dfTVVMVElfU1VCQ0hBTk5FTAotCW5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm1lc2EsIE52U3ViQ3R4U3VyZjJELCBOdkN0eFN1cmYyRCk7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViQ3R4U3VyZjJELCBOVjEwX0NPTlRFWFRfU1VSRkFDRVNfMkRfU0VUX0RNQV9JTl9NRU1PUlkwLCAyKTsKLQlPVVRfUklORyhOdkRtYUZCKTsKLQlPVVRfUklORyhOdkRtYUZCKTsKLQotCW5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm1lc2EsIE52U3ViSW1hZ2VCbGl0LCBOdkltYWdlQmxpdCk7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViSW1hZ2VCbGl0LCBOVjEwX0lNQUdFX0JMSVRfU0VUX0NPTlRFWFRfU1VSRkFDRVNfMkQsIDEpOwotCU9VVF9SSU5HKE52Q3R4U3VyZjJEKTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWJJbWFnZUJsaXQsIE5WMTBfSU1BR0VfQkxJVF9TRVRfT1BFUkFUSU9OLCAxKTsKLQlPVVRfUklORygzKTsgLyogU1JDQ09QWSAqLwotCi0Jbm91dmVhdU9iamVjdE9uU3ViY2hhbm5lbChubWVzYSwgTnZTdWJNZW1Gb3JtYXQsIE52TWVtRm9ybWF0KTsKLSNlbmRpZgotCi0Jbm91dmVhdU9iamVjdE9uU3ViY2hhbm5lbChubWVzYSwgTnZTdWIzRCwgTnYzRCk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzJkMDEuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X29iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotI2lmbmRlZiBfX05PVVZFQVVfT0JKRUNUX0hfXwotI2RlZmluZSBfX05PVVZFQVVfT0JKRUNUX0hfXwotCi0jaW5jbHVkZSAibm91dmVhdV9jb250ZXh0LmgiCi0KLSNkZWZpbmUgQUxMT1dfTVVMVElfU1VCQ0hBTk5FTAotCi12b2lkIG5vdXZlYXVPYmplY3RJbml0KG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKTsKLQotZW51bSBETUFPYmplY3RzIHsKLQlOdjNEICAgICAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMTksCi0JTnZDdHhTdXJmMkQJCT0gMHg4MDAwMDAyMCwKLQlOdkltYWdlQmxpdAkJPSAweDgwMDAwMDIxLAotCU52TWVtRm9ybWF0CQk9IDB4ODAwMDAwMjIsCi0JTnZDdHhTdXJmM0QJCT0gMHg4MDAwMDAyMywKLQlOdkRtYUZCCQkJPSAweEQwRkIwMDAxLAotCU52RG1hVFQJCQk9IDB4RDBBQTAwMDEsCi0JTnZTeW5jTm90aWZ5CQk9IDB4RDAwMDAwMDEsCi0JTnZRdWVyeU5vdGlmeQkJPSAweEQwMDAwMDAyCi19OwotCi1lbnVtIERNQVN1YmNoYW5uZWwgewotCU52U3ViQ3R4U3VyZjJECT0gMCwKLQlOdlN1YkltYWdlQmxpdAk9IDEsCi0JTnZTdWJNZW1Gb3JtYXQJPSAyLAotCU52U3ViQ3R4U3VyZjNECT0gMywKLQlOdlN1YjNECQk9IDcsCi19OwotCi1leHRlcm4gdm9pZCBub3V2ZWF1T2JqZWN0T25TdWJjaGFubmVsKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCBpbnQgc3ViY2hhbm5lbCwgaW50IGhhbmRsZSk7Ci0KLWV4dGVybiBHTGJvb2xlYW4gbm91dmVhdUNyZWF0ZUNvbnRleHRPYmplY3Qobm91dmVhdUNvbnRleHRQdHIgbm1lc2EsCi0gICAgICAJCQkJCSAgICB1aW50MzJfdCBoYW5kbGUsIGludCBjbGFzcyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3F1ZXJ5LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcXVlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NDE0MC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcXVlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotLyogR0xfQVJCX29jY2x1c2lvbl9xdWVyeSBzdXBwb3J0IGZvciBOVjIwLzMwLzQwICovCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLQotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbXNnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc3luYy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcXVlcnkuaCIKLQotc3RhdGljIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKgotbm91dmVhdU5ld1F1ZXJ5T2JqZWN0KEdMY29udGV4dCAqY3R4LCBHTHVpbnQgaWQpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlub3V2ZWF1X3F1ZXJ5X29iamVjdCAqbnE7Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDsgaTxubWVzYS0+cXVlcnlfb2JqZWN0X21heDsgaSsrKQotCQlpZiAobm1lc2EtPnF1ZXJ5X2FsbG9jW2ldID09IEdMX0ZBTFNFKQotCQkJYnJlYWs7Ci0JaWYgKGk9PW5tZXNhLT5xdWVyeV9vYmplY3RfbWF4KQotCQlyZXR1cm4gTlVMTDsKLQotCW5xID0gQ0FMTE9DX1NUUlVDVChub3V2ZWF1X3F1ZXJ5X29iamVjdF90KTsKLQlpZiAobnEpIHsKLQkJbnEtPm5vdGlmaWVyX2lkCT0gaTsKLQotCQlucS0+bWVzYS5JZCAgICAgPSBpZDsKLQkJbnEtPm1lc2EuUmVzdWx0ID0gMDsKLQkJbnEtPm1lc2EuQWN0aXZlID0gR0xfRkFMU0U7Ci0JCW5xLT5tZXNhLlJlYWR5ICA9IEdMX1RSVUU7Ci0JfQotCi0JcmV0dXJuIChzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICopbnE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1QmVnaW5RdWVyeShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX3F1ZXJ5X29iamVjdCAqcSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCW5vdXZlYXVfcXVlcnlfb2JqZWN0ICpucSA9IChub3V2ZWF1X3F1ZXJ5X29iamVjdCAqKXE7Ci0KLQlub3V2ZWF1X25vdGlmaWVyX3Jlc2V0KGN0eCwgbm1lc2EtPnF1ZXJ5Tm90aWZpZXIsIG5xLT5ub3RpZmllcl9pZCk7Ci0KLQlzd2l0Y2ggKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGUpIHsKLQljYXNlIE5WXzIwOgotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIDB4MTdjOCwgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFICAoMSk7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgMHgxN2NjLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUgICgxKTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8zMDoKLQljYXNlIE5WXzQwOgotCWNhc2UgTlZfNDQ6Ci0JCS8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBPQ0NfUVVFUlkgZW5hYmxlLCBidXQgaXQgKmlzKiBuZWVkZWQgdG8gbWFrZQotCQkgKiB0aGUgU0VUX09CSkVDVDcgbm90aWZpZXIgYmxvY2sgd29yayB3aXRoIFNUT1JFX1JFU1VMVC4KLQkJICoKLQkJICogQWxzbywgdGhpcyBhcHBlYXJzIHRvIHJlc2V0IHRoZSBwaXhlbCBwYXNzIGNvdW50ZXIgKi8KLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsCi0JCQkJIE5WMzBfVENMX1BSSU1JVElWRV8zRF9PQ0NfUVVFUllfT1JfQ09MT1JfQlVGRl9FTkFCTEUsCi0JCQkJIDEpOwotCQlPVVRfUklORyAgICAgICAgKDEpOwotCQkvKiBQcm9iYWJseSBPQ0NfUVVFUllfRU5BQkxFICovCi0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgMHgxN2NjLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUgICgxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNFKCJubyBzdXBwb3J0IGZvciB0aGlzIGNhcmRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1VXBkYXRlUXVlcnkoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKnEpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlub3V2ZWF1X3F1ZXJ5X29iamVjdCAqbnEgPSAobm91dmVhdV9xdWVyeV9vYmplY3QgKilxOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBub3V2ZWF1X25vdGlmaWVyX3N0YXR1cyhjdHgsIG5tZXNhLT5xdWVyeU5vdGlmaWVyLAotCQkJCQkgbnEtPm5vdGlmaWVyX2lkKTsKLQotCXEtPlJlYWR5ID0gKHN0YXR1cyA9PSBOVl9OT1RJRllfU1RBVEVfU1RBVFVTX0NPTVBMRVRFRCk7Ci0JaWYgKHEtPlJlYWR5KQotCQlxLT5SZXN1bHQgPSBub3V2ZWF1X25vdGlmaWVyX3JldHVybl92YWwoY3R4LAotCQkJCQkJCW5tZXNhLT5xdWVyeU5vdGlmaWVyLAotCQkJCQkJCW5xLT5ub3RpZmllcl9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1V2FpdFF1ZXJ5UmVzdWx0KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jbm91dmVhdV9xdWVyeV9vYmplY3QgKm5xID0gKG5vdXZlYXVfcXVlcnlfb2JqZWN0ICopcTsKLQotCW5vdXZlYXVfbm90aWZpZXJfd2FpdF9zdGF0dXMoY3R4LCBubWVzYS0+cXVlcnlOb3RpZmllciwgbnEtPm5vdGlmaWVyX2lkLAotCQkJCSAgICAgTlZfTk9USUZZX1NUQVRFX1NUQVRVU19DT01QTEVURUQsIDApOwotCW5vdXZlYXVVcGRhdGVRdWVyeShjdHgsIHRhcmdldCwgcSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1RW5kUXVlcnkoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKnEpCi17Ci0Jbm91dmVhdV9xdWVyeV9vYmplY3QgKm5xID0gKG5vdXZlYXVfcXVlcnlfb2JqZWN0ICopcTsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0Jc3dpdGNoIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlKSB7Ci0JY2FzZSBOVl8yMDoKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTdkMCwgMSk7Ci0JCU9VVF9SSU5HICAgICAgICgweDAxMDAwMDAwIHwgbnEtPm5vdGlmaWVyX2lkKjMyKTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8zMDoKLQljYXNlIE5WXzQwOgotCWNhc2UgTlZfNDQ6Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RPUkVfUkVTVUxULCAxKTsKLQkJT1VUX1JJTkcgICAgICAgKDB4MDEwMDAwMDAgfCBucS0+bm90aWZpZXJfaWQqMzIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQVJOX09OQ0UoIm5vIHN1cHBvcnQgZm9yIHRoaXMgY2FyZFxuIik7Ci0JCWJyZWFrOwotCX0KLQlGSVJFX1JJTkcoKTsKLQotCS8qWFhYOiB3YWl0IGZvciBxdWVyeSB0byBjb21wbGV0ZSwgbWVzYSBkb2Vzbid0IGdpdmUgdGhlIGRyaXZlcgotCSAqICAgICBhbiBpbnRlcmZhY2UgdG8gcXVlcnkgdGhlIHN0YXR1cyBvZiBhIHF1ZXJ5IG9iamVjdCBzbyAKLQkgKiAgICAgdGhpcyBoYXMgdG8gc3RhbGwgdGhlIGNoYW5uZWwuCi0JICovCi0Jbm91dmVhdVdhaXRRdWVyeVJlc3VsdChjdHgsIHRhcmdldCwgcSk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIDB4MTdjYywgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUgICgwKTsKLX0KLQotdm9pZAotbm91dmVhdVF1ZXJ5SW5pdEZ1bmNzKEdMY29udGV4dCAqY3R4KQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA8IE5WXzIwKQotCQlyZXR1cm47Ci0KLQlubWVzYS0+cXVlcnlfb2JqZWN0X21heCA9ICgweDQwMDAgLyAzMik7Ci0Jbm1lc2EtPnF1ZXJ5Tm90aWZpZXIgPQotCQlub3V2ZWF1X25vdGlmaWVyX25ldyhjdHgsIE52UXVlcnlOb3RpZnksCi0JCQkJCSAgbm1lc2EtPnF1ZXJ5X29iamVjdF9tYXgpOwotCW5tZXNhLT5xdWVyeV9hbGxvYyA9IGNhbGxvYyhubWVzYS0+cXVlcnlfb2JqZWN0X21heCwgc2l6ZW9mKEdMYm9vbGVhbikpOwotCi0Jc3dpdGNoIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlKSB7Ci0JY2FzZSBOVl8yMDoKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDgsIDEpOwotCQlPVVRfUklOR19DQUNIRSAgKE52UXVlcnlOb3RpZnkpOwotCQlicmVhazsKLQljYXNlIE5WXzMwOgotCWNhc2UgTlZfNDA6Ci0JY2FzZSBOVl80NDoKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDcsIDEpOwotCQlPVVRfUklOR19DQUNIRSAgKE52UXVlcnlOb3RpZnkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9OwotCi0JY3R4LT5Ecml2ZXIuTmV3UXVlcnlPYmplY3QJPSBub3V2ZWF1TmV3UXVlcnlPYmplY3Q7Ci0JY3R4LT5Ecml2ZXIuQmVnaW5RdWVyeQkJPSBub3V2ZWF1QmVnaW5RdWVyeTsKLQljdHgtPkRyaXZlci5FbmRRdWVyeQkJPSBub3V2ZWF1RW5kUXVlcnk7Ci0jaWYgMAotCWN0eC0+RHJpdmVyLlVwZGF0ZVF1ZXJ5CQk9IG5vdXZlYXVVcGRhdGVRdWVyeTsKLQljdHgtPkRyaXZlci5XYWl0UXVlcnlSZXN1bHQJPSBub3V2ZWF1V2FpdFF1ZXJ5UmVzdWx0OwotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9yZWcuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9yZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1OGI1My4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA1ICswLDAgQEAKLS8qCi0gICBBdXRvZ2VuZXJhdGVkIGZpbGUsIGRvIG5vdCBlZGl0ICEKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQ29weXJpZ2h0IChDKSAyMDA2IDoKLSAgIERtaXRyeSBCYXJ5c2hrb3YsCi0gICBMYXVyZW50IENhcmxpZXIsCi0gICBNYXR0aGlldSBDYXN0ZXQsCi0gICBEYXdpZCBHYWpvd25paywKLSAgIEplcmVteSBLb2xiLAotICAgU3RlcGhhbmUgTG9ldWlsbGV0LAotICAgUGF0cmljZSBNYW5kaW4sCi0gICBTdGVwaGFuZSBNYXJjaGVzaW4sCi0gICBTZXJnZSBNYXJ0aW4sCi0gICBTeWx2YWluIE11bmF1dCwKLSAgIEJlbiBTa2VnZ3MsCi0gICBFcmlrIFdhbGluZywKLSAgIGtvYWxhX2JyLAotICAgc3R1cm1mbHV0LgotCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLWEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi1wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLXRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLW5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCi1wb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCi1MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi1PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLVdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBDcmVhdGVkIGZyb20gb2JqZWN0cy5jIHJldi4gMS4zOTgKLSovCi0KLSNpZm5kZWYgX05PVVZFQVVfUkVHX0gKLSNkZWZpbmUgX05PVVZFQVVfUkVHX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjAxX0NPTlRFWFRfQ0xJUF9SRUNUQU5HTEUgdXNlZCBvbjogTlYwMyBOVjA0IE5WMTAgTlYxNSBOVjIwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WMDFfQ09OVEVYVF9DTElQX1JFQ1RBTkdMRQkJCQkweDAwMDAwMDE5Ci0jCWRlZmluZQkJTlYwMV9DT05URVhUX0NMSVBfUkVDVEFOR0xFX1NFVF9QT0lOVAkJCTB4MDAwMDAzMDAJLyogUGFyYW1ldGVyczogeCB5ICovCi0jCWRlZmluZQkJTlYwMV9DT05URVhUX0NMSVBfUkVDVEFOR0xFX1NFVF9TSVpFCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCB1c2VkIG9uOiBOVjA0IE5WMTAgTlYxNSBOVjIwIE5WMzAgTlY0MCBHNzAKLSovCi0jZGVmaW5lCQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQJCQkJMHgwMDAwMDAzOQotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PUAkJCQkweDAwMDAwMTAwCi0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZCQkJMHgwMDAwMDEwNAotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0JKRUNUX0lOCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09CSkVDVF9PVVQJCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX0lOCQkJMHgwMDAwMDMwYwotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9PVVQJCQkweDAwMDAwMzEwCi0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfUElUQ0hfSU4JCQkweDAwMDAwMzE0Ci0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfUElUQ0hfT1VUCQkJMHgwMDAwMDMxOAotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0xJTkVfTEVOR1RIX0lOCQkweDAwMDAwMzFjCi0jCWRlZmluZQkJTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTElORV9DT1VOVAkJCTB4MDAwMDAzMjAKLSMJZGVmaW5lCQlOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9GT1JNQVQJCQkweDAwMDAwMzI0CS8qIFBhcmFtZXRlcnM6IHNyY19pbmMgZHN0X2luYyAqLwotIwlkZWZpbmUJCU5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0JVRl9OT1RJRlkJCQkweDAwMDAwMzI4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwM19QUklNSVRJVkVfUkFTVEVSX09QIHVzZWQgb246IE5WMDMgTlYwNCBOVjEwIE5WMTUgTlYyMCBOVjMwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WMDNfUFJJTUlUSVZFX1JBU1RFUl9PUAkJCQkweDAwMDAwMDQzCi0jCWRlZmluZQkJTlYwM19QUklNSVRJVkVfUkFTVEVSX09QX05PVElGWQkJCQkweDAwMDAwMTAwCi0jCWRlZmluZQkJTlYwM19QUklNSVRJVkVfUkFTVEVSX09QX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYwM19QUklNSVRJVkVfUkFTVEVSX09QX0xPR0lDX09QCQkJMHgwMDAwMDMwMAkvKiBQYXJhbWV0ZXJzOiBsb2dpY19vcCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUIHVzZWQgb246IE5WMDQgTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjA0X0dESV9SRUNUQU5HTEVfVEVYVAkJCQkJMHgwMDAwMDA0YQotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX1NFVF9ETUFfTk9USUZZCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX1BBVFRFUk4JCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX1JPUDUJCQkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX1NVUkZBQ0UJCQkJMHgwMDAwMDE5OAotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX09QRVJBVElPTgkJCTB4MDAwMDAyZmMKLSMJZGVmaW5lCQlOVjA0X0dESV9SRUNUQU5HTEVfVEVYVF9GT1JNQVQJCQkJMHgwMDAwMDMwMAotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX0JMT0NLX0xFVkVMMV9UTAkJCTB4MDAwMDA1ZjQJLyogUGFyYW1ldGVyczogbGVmdCB0b3AgKi8KLSMJZGVmaW5lCQlOVjA0X0dESV9SRUNUQU5HTEVfVEVYVF9CTE9DS19MRVZFTDFfQlIJCQkweDAwMDAwNWY4CS8qIFBhcmFtZXRlcnM6IHJpZ2h0IGJvdHRvbSAqLwotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX0ZJTExfVkFMVUUJCQkweDAwMDAwNWZjCi0jCWRlZmluZQkJTlYwNF9HRElfUkVDVEFOR0xFX1RFWFRfQkxPQ0tfTEVWRUwyX1RMCQkJMHgwMDAwMDYwMAkvKiBQYXJhbWV0ZXJzOiBsZWZ0IHRvcCAqLwotIwlkZWZpbmUJCU5WMDRfR0RJX1JFQ1RBTkdMRV9URVhUX0JMT0NLX0xFVkVMMl9CUgkJCTB4MDAwMDA2MDQJLyogUGFyYW1ldGVyczogcmlnaHQgYm90dG9tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNF9TV0laWkxFRF9TVVJGQUNFIHVzZWQgb246IE5WMDQgTlYxMCBOVjE1IAotKi8KLSNkZWZpbmUJCQlOVjA0X1NXSVpaTEVEX1NVUkZBQ0UJCQkJCTB4MDAwMDAwNTIKLSMJZGVmaW5lCQlOVjA0X1NXSVpaTEVEX1NVUkZBQ0VfRE1BX05PVElGWQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOVjA0X1NXSVpaTEVEX1NVUkZBQ0VfRE1BX0lNQUdFCQkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjA0X1NXSVpaTEVEX1NVUkZBQ0VfRk9STUFUCQkJCTB4MDAwMDAzMDAJLyogUGFyYW1ldGVyczogbG9nMihoZWlnaHQpIGxvZzIod2lkdGgpIGNvbG9yICovCi0jCWRlZmluZQkJTlYwNF9TV0laWkxFRF9TVVJGQUNFX09GRlNFVAkJCQkweDAwMDAwMzA0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEIHVzZWQgb246IE5WMDQgCi0qLwotI2RlZmluZQkJCU5WMDRfQ09OVEVYVF9TVVJGQUNFU18zRAkJCQkweDAwMDAwMDUzCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0RNQV9DT0xPUgkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfM0RfRE1BX1pFVEEJCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0NMSVBfSE9SSVpPTlRBTAkJMHgwMDAwMDJmOAkvKiBQYXJhbWV0ZXJzOiB4IHdpZHRoICovCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0NMSVBfVkVSVElDQUwJCQkweDAwMDAwMmZjCS8qIFBhcmFtZXRlcnM6IHkgaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0ZPUk1BVAkJCQkweDAwMDAwMzAwCS8qIFBhcmFtZXRlcnM6IGNvbG9yIHR5cGUgd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0NMSVBfU0laRQkJCTB4MDAwMDAzMDQJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX1BJVENICQkJCTB4MDAwMDAzMDgJLyogUGFyYW1ldGVyczogY29sb3IgemV0YSAqLwotIwlkZWZpbmUJCU5WMDRfQ09OVEVYVF9TVVJGQUNFU18zRF9PRkZTRVRfQ09MT1IJCQkweDAwMDAwMzBjCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX09GRlNFVF9aRVRBCQkJMHgwMDAwMDMxMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFIHVzZWQgb246IE5WMDQgCi0qLwotI2RlZmluZQkJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFCQkJCTB4MDAwMDAwNTQKLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9OT1AJCQkJMHgwMDAwMDEwMAotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX05PVElGWQkJCTB4MDAwMDAxMDQKLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9ETUFfTk9USUZZCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX0RNQV8xCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX0RNQV8yCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX1NVUkZBQ0UJCQkweDAwMDAwMThjCi0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfQ09MT1JfS0VZCQkJMHgwMDAwMDMwMAotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX1RFWFRVUkVfT0ZGU0VUCQkweDAwMDAwMzA0Ci0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVEVYVFVSRV9GT1JNQVQJCTB4MDAwMDAzMDgJLyogUGFyYW1ldGVyczogY29sb3IgbWlwbWFwcyBsb2codSkgbG9nKHYpIHdyYXBfcyB3cmFwX3QgKi8KLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9URVhUVVJFX0ZJTFRFUgkJMHgwMDAwMDMwYwkvKiBQYXJhbWV0ZXJzOiBtYWdmaWx0ZXIgbWluZmlsdGVyIGxvZGJpYXMgKi8KLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9CTEVORAkJCTB4MDAwMDAzMTAJLyogUGFyYW1ldGVyczogdGV4dHVyZSBiZW5hYmxlIGRzdCBzcmMgKi8KLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9DT05UUk9MCQkJMHgwMDAwMDMxNAkvKiBQYXJhbWV0ZXJzOiBhbHBoYXJlZiBhbHBoYWZ1bmMgYWxwaGFlbmFibGUgemVuYWJsZSB6d3JpdGUgemZ1bmMgY3VsbG1vZGUgKi8KLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9GT0dfQ09MT1IJCQkweDAwMDAwMzE4Ci0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goIGQpCQkoMHgwMDAwMDQwMCArIGQgKiAweDAwMjApCi0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1koIGQpCQkoMHgwMDAwMDQwNCArIGQgKiAweDAwMjApCi0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1ooIGQpCQkoMHgwMDAwMDQwOCArIGQgKiAweDAwMjApCi0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfSU5WX1coIGQpCQkJKDB4MDAwMDA0MGMgKyBkICogMHgwMDIwKQotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX0NPTE9SKCBkKQkJCSgweDAwMDAwNDEwICsgZCAqIDB4MDAyMCkKLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9TUEVDVUxBUiggZCkJCQkoMHgwMDAwMDQxNCArIGQgKiAweDAwMjApCi0jCWRlZmluZQkJTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVEVYVFVSRV9TKCBkKQkJKDB4MDAwMDA0MTggKyBkICogMHgwMDIwKQotIwlkZWZpbmUJCU5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX1RFWFRVUkVfVCggZCkJCSgweDAwMDAwNDFjICsgZCAqIDB4MDAyMCkKLSMJZGVmaW5lCQlOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9EUkFXCQkJCTB4MDAwMDA2MDAJLyogUGFyYW1ldGVyczogdjAgdjEgdjIgdjMgdjQgdjUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjA0X0RYNl9NVUxUSVRFWF9UUklBTkdMRSB1c2VkIG9uOiBOVjA0IE5WMTAgTlYxNSAKLSovCi0jZGVmaW5lCQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEUJCQkJMHgwMDAwMDA1NQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX05PUAkJCQkweDAwMDAwMTAwCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfTk9USUZZCQkJMHgwMDAwMDEwNAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfRE1BXzEJCQkweDAwMDAwMTg0Ci0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfRE1BXzIJCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfU1VSRkFDRQkJCTB4MDAwMDAxOGMKLSMJZGVmaW5lCQlOVjA0X0RYNl9NVUxUSVRFWF9UUklBTkdMRV9PRkZTRVQwCQkJMHgwMDAwMDMwOAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX09GRlNFVDEJCQkweDAwMDAwMzBjCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfRk9STUFUMAkJCTB4MDAwMDAzMTAJLyogUGFyYW1ldGVyczogY29sb3IgbWlwbWFwcyBsb2codSkgbG9nKHYpIHdyYXBfcyB3cmFwX3QgKi8KLSMJZGVmaW5lCQlOVjA0X0RYNl9NVUxUSVRFWF9UUklBTkdMRV9GT1JNQVQxCQkJMHgwMDAwMDMxNAkvKiBQYXJhbWV0ZXJzOiBjb2xvciBtaXBtYXBzIGxvZyh1KSBsb2codikgd3JhcF9zIHdyYXBfdCAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0ZJTFRFUjAJCQkweDAwMDAwMzE4CS8qIFBhcmFtZXRlcnM6IG1hZ2ZpbHRlciBtaW5maWx0ZXIgbG9kYmlhcyAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0ZJTFRFUjEJCQkweDAwMDAwMzFjCS8qIFBhcmFtZXRlcnM6IG1hZ2ZpbHRlciBtaW5maWx0ZXIgbG9kYmlhcyAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTUJJTkVfMF9BTFBIQQkJMHgwMDAwMDMyMAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTUJJTkVfMF9DT0xPUgkJMHgwMDAwMDMyNAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTUJJTkVfMV9BTFBIQQkJMHgwMDAwMDMyYwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTUJJTkVfMV9DT0xPUgkJMHgwMDAwMDMzMAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTUJJTkVfRkFDVE9SCQkweDAwMDAwMzM0Ci0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfQkxFTkQJCQkweDAwMDAwMzM4CS8qIFBhcmFtZXRlcnM6IGJlbmFibGUgZHN0IHNyYyAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTlRST0wwCQkJMHgwMDAwMDMzYwkvKiBQYXJhbWV0ZXJzOiByZWRfd3JpdGUgZ3JlZW5fd3JpdGUgYmx1ZV93cml0ZSBhbHBoYV93cml0ZSBhbHBoYV93cml0ZSBzdGVuY2lsX3dyaXRlIGFscGhhcmVmIGFscGhhZnVuYyBhbHBoYWVuYWJsZSB6ZW5hYmxlIHp3cml0ZSB6ZnVuYyBjdWxsbW9kZSAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTlRST0wxCQkJMHgwMDAwMDM0MAkvKiBQYXJhbWV0ZXJzOiBzdGVuY2lsX2VuYWJsZSBzdGVuY2lsX21hc2tfd3JpdGUgc3RlbmNpbF9tYXNrX3JlYWQgc3RlbmNpbHJlZiBzdGVuY2lsZnVuYyAqLwotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0NPTlRST0wyCQkJMHgwMDAwMDM0NAkvKiBQYXJhbWV0ZXJzOiBzdGVuY2lsX2ZhaWwgc3RlbmNpbF96ZmFpbCBzdGVuY2lsX3pwYXNzICovCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfRk9HX0NPTE9SCQkJMHgwMDAwMDM0OAotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX1RMVkVSVEVYX1NYKCBkKQkJKDB4MDAwMDA0MDAgKyBkICogMHgwMDI4KQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX1RMVkVSVEVYX1NZKCBkKQkJKDB4MDAwMDA0MDQgKyBkICogMHgwMDI4KQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX1RMVkVSVEVYX1NaKCBkKQkJKDB4MDAwMDA0MDggKyBkICogMHgwMDI4KQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX0lOVl9XKCBkKQkJCSgweDAwMDAwNDBjICsgZCAqIDB4MDAyOCkKLSMJZGVmaW5lCQlOVjA0X0RYNl9NVUxUSVRFWF9UUklBTkdMRV9DT0xPUiggZCkJCQkoMHgwMDAwMDQxMCArIGQgKiAweDAwMjgpCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfU1BFQ1VMQVIoIGQpCQkJKDB4MDAwMDA0MTQgKyBkICogMHgwMDI4KQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX1RFWFRVUkUwX1MoIGQpCQkoMHgwMDAwMDQxOCArIGQgKiAweDAwMjgpCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfVEVYVFVSRTBfVCggZCkJCSgweDAwMDAwNDFjICsgZCAqIDB4MDAyOCkKLSMJZGVmaW5lCQlOVjA0X0RYNl9NVUxUSVRFWF9UUklBTkdMRV9URVhUVVJFMV9TKCBkKQkJKDB4MDAwMDA0MjAgKyBkICogMHgwMDI4KQotIwlkZWZpbmUJCU5WMDRfRFg2X01VTFRJVEVYX1RSSUFOR0xFX1RFWFRVUkUxX1QoIGQpCQkoMHgwMDAwMDQyNCArIGQgKiAweDAwMjgpCi0jCWRlZmluZQkJTlYwNF9EWDZfTVVMVElURVhfVFJJQU5HTEVfRFJBVwkJCQkweDAwMDAwNTQwCS8qIFBhcmFtZXRlcnM6IHYwIHYxIHYyIHYzIHY0IHY1ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNF9DT0xPUl9LRVkgdXNlZCBvbjogTlYwNCBOVjEwIE5WMTUgTlYyMCBOVjQwIAotKi8KLSNkZWZpbmUJCQlOVjA0X0NPTE9SX0tFWQkJCQkJCTB4MDAwMDAwNTcKLSMJZGVmaW5lCQlOVjA0X0NPTE9SX0tFWV9TRVRfRE1BX05PVElGWQkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYwNF9DT0xPUl9LRVlfRk9STUFUCQkJCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYwNF9DT0xPUl9LRVlfVkFMVUUJCQkJCTB4MDAwMDAzMDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjA0X1NPTElEX0xJTkUgdXNlZCBvbjogTlYwNCAKLSovCi0jZGVmaW5lCQkJTlYwNF9TT0xJRF9MSU5FCQkJCQkJMHgwMDAwMDA1YwotIwlkZWZpbmUJCU5WMDRfU09MSURfTElORV9DTElQX1JFQ1RBTkdMRQkJCQkweDAwMDAwMTg0Ci0jCWRlZmluZQkJTlYwNF9TT0xJRF9MSU5FX1BBVFRFUk4JCQkJCTB4MDAwMDAxODgKLSMJZGVmaW5lCQlOVjA0X1NPTElEX0xJTkVfUk9QCQkJCQkweDAwMDAwMThjCi0jCWRlZmluZQkJTlYwNF9TT0xJRF9MSU5FX1NVUkZBQ0UJCQkJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjA0X1NPTElEX0xJTkVfT1BFUkFUSU9OCQkJCTB4MDAwMDAyZmMKLSMJZGVmaW5lCQlOVjA0X1NPTElEX0xJTkVfQ09MT1JfRk9STUFUCQkJCTB4MDAwMDAzMDAKLSMJZGVmaW5lCQlOVjA0X1NPTElEX0xJTkVfQ09MT1JfVkFMVUUJCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU5WMDRfU09MSURfTElORV9TVEFSVAkJCQkJMHgwMDAwMDQwMAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjA0X1NPTElEX0xJTkVfRU5ECQkJCQkweDAwMDAwNDAwCS8qIFBhcmFtZXRlcnM6IHggeSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WMDRfVU5LMDA1RSB1c2VkIG9uOiBOVjA0IAotKi8KLSNkZWZpbmUJCQlOVjA0X1VOSzAwNUUJCQkJCQkweDAwMDAwMDVlCi0jCWRlZmluZQkJTlYwNF9VTkswMDVFX1NFVF9TVVJGQUNFCQkJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjA0X1VOSzAwNUVfVU5LMDJmYwkJCQkJMHgwMDAwMDJmYwotIwlkZWZpbmUJCU5WMDRfVU5LMDA1RV9VTkswMzAwCQkJCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYwNF9VTkswMDVFX0NPVU5URVIJCQkJCTB4MDAwMDAzMDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjA1X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWSB1c2VkIG9uOiBOVjA0IAotKi8KLSNkZWZpbmUJCQlOVjA1X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWQkJCQkweDAwMDAwMDYzCi0jCWRlZmluZQkJTlYwNV9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfU1VSRkFDRQkJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjA1X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9DT0xPUl9DT05WRVJTSU9OCQkweDAwMDAwMmZjCi0jCWRlZmluZQkJTlYwNV9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfT1BFUkFUSU9OCQkJMHgwMDAwMDMwNAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZIHVzZWQgb246IE5WMDQgCi0qLwotI2RlZmluZQkJCU5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZCQkJCTB4MDAwMDAwNzcKLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9ETUFfTk9USUZZCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYwNF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfRE1BX0lNQUdFCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX1NVUkZBQ0UJCQkweDAwMDAwMTk4Ci0jCWRlZmluZQkJTlYwNF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfQ09MT1JfRk9STUFUCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYwNF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfT1BFUkFUSU9OCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX0NMSVBfUE9TCQkJMHgwMDAwMDMwOAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9DTElQX1NJWkUJCQkweDAwMDAwMzBjCS8qIFBhcmFtZXRlcnM6IHdpZHRoIGhlaWdodCAqLwotIwlkZWZpbmUJCU5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX09VVF9QT1MJCQkweDAwMDAwMzEwCS8qIFBhcmFtZXRlcnM6IHggeSAqLwotIwlkZWZpbmUJCU5WMDRfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX09VVF9TSVpFCQkJMHgwMDAwMDMxNAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9EVV9EWAkJCTB4MDAwMDAzMTgJLyogUGFyYW1ldGVyczogaW50IGZyYWMqMHgxMDAwMDAgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9EVl9EWQkJCTB4MDAwMDAzMWMJLyogUGFyYW1ldGVyczogaW50IGZyYWMqMHgxMDAwMDAgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9TSVpFCQkJMHgwMDAwMDQwMAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9GT1JNQVQJCQkweDAwMDAwNDA0CS8qIFBhcmFtZXRlcnM6IHBpdGNoIG9yaWdpbiBmaWx0ZXIgKi8KLSMJZGVmaW5lCQlOVjA0X1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9PRkZTRVQJCQkweDAwMDAwNDA4Ci0jCWRlZmluZQkJTlYwNF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfUE9JTlQJCQkweDAwMDAwNDBjCS8qIFBhcmFtZXRlcnM6IHVfaW50IHVfZnJhYyoweDEwIHZfaW50IHZfZnJhYyoweDEwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlZfSU1BR0VfRlJPTV9DUFUgdXNlZCBvbjogTlYwNCAKLSovCi0jZGVmaW5lCQkJTlZfSU1BR0VfRlJPTV9DUFUJCQkJCTB4MDAwMDAwNjEKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9ETUFfTk9USUZZCQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9DTElQX1JFQ1RBTkdMRQkJCTB4MDAwMDAxODgKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9QQVRURVJOCQkJCTB4MDAwMDAxOGMKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9ST1AJCQkJCTB4MDAwMDAxOTAKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9TVVJGQUNFCQkJCTB4MDAwMDAxOWMKLSMJZGVmaW5lCQlOVl9JTUFHRV9GUk9NX0NQVV9PUEVSQVRJT04JCQkJMHgwMDAwMDJmYwotIwlkZWZpbmUJCU5WX0lNQUdFX0ZST01fQ1BVX0ZPUk1BVAkJCQkweDAwMDAwMzAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNV9JTUFHRV9GUk9NX0NQVSB1c2VkIG9uOiBOVjA0IAotKi8KLSNkZWZpbmUJCQlOVjA1X0lNQUdFX0ZST01fQ1BVCQkJCQkweDAwMDAwMDY1Ci0jCWRlZmluZQkJTlYwNV9JTUFHRV9GUk9NX0NQVV9ETUFfTk9USUZZCQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOVjA1X0lNQUdFX0ZST01fQ1BVX0NMSVBfUkVDVEFOR0xFCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMDVfSU1BR0VfRlJPTV9DUFVfUEFUVEVSTgkJCQkweDAwMDAwMThjCi0jCWRlZmluZQkJTlYwNV9JTUFHRV9GUk9NX0NQVV9ST1AJCQkJCTB4MDAwMDAxOTAKLSMJZGVmaW5lCQlOVjA1X0lNQUdFX0ZST01fQ1BVX1NVUkZBQ0UJCQkJMHgwMDAwMDE5YwotIwlkZWZpbmUJCU5WMDVfSU1BR0VfRlJPTV9DUFVfT1BFUkFUSU9OCQkJCTB4MDAwMDAyZmMKLSMJZGVmaW5lCQlOVjA1X0lNQUdFX0ZST01fQ1BVX0ZPUk1BVAkJCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYwNV9JTUFHRV9GUk9NX0NQVV9QT0lOVAkJCQkweDAwMDAwMzA0CS8qIFBhcmFtZXRlcnM6IHggeSAqLwotIwlkZWZpbmUJCU5WMDVfSU1BR0VfRlJPTV9DUFVfU0laRV9PVVQJCQkJMHgwMDAwMDMwOAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjA1X0lNQUdFX0ZST01fQ1BVX1NJWkVfSU4JCQkJMHgwMDAwMDMwYwkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjA1X0lNQUdFX0ZST01fQ1BVX0NPTE9SKCBkKQkJCQkoMHgwMDAwMDQwMCArIGQgKiAweDAwMDQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlZfSU1BR0VfQkxJVCB1c2VkIG9uOiBOVjA0IE5WMTAgTlYxNSBOVjIwIE5WNDAgCi0qLwotI2RlZmluZQkJCU5WX0lNQUdFX0JMSVQJCQkJCQkweDAwMDAwMDVmCi0jCWRlZmluZQkJTlZfSU1BR0VfQkxJVF9ETUFfTk9USUZZCQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOVl9JTUFHRV9CTElUX0NPTE9SX0tFWQkJCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WX0lNQUdFX0JMSVRfQ0xJUF9SRUNUQU5HTEUJCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WX0lNQUdFX0JMSVRfUEFUVEVSTgkJCQkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU5WX0lNQUdFX0JMSVRfUk9QNQkJCQkJMHgwMDAwMDE5MAotIwlkZWZpbmUJCU5WX0lNQUdFX0JMSVRfU1VSRkFDRQkJCQkJMHgwMDAwMDE5YwotIwlkZWZpbmUJCU5WX0lNQUdFX0JMSVRfT1BFUkFUSU9OCQkJCQkweDAwMDAwMmZjCi0jCWRlZmluZQkJTlZfSU1BR0VfQkxJVF9QT0lOVF9JTgkJCQkJMHgwMDAwMDMwMAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVl9JTUFHRV9CTElUX1BPSU5UX09VVAkJCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVl9JTUFHRV9CTElUX1NJWkUJCQkJCTB4MDAwMDAzMDgJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEIHVzZWQgb246IE5WMTAgCi0qLwotI2RlZmluZQkJCU5WMTBfVENMX1BSSU1JVElWRV8zRAkJCQkJMHgwMDAwMDA1NgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WMTdfVENMX1BSSU1JVElWRV8zRCB1c2VkIG9uOiBOVjE1IAotKi8KLSNkZWZpbmUJCQlOVjE3X1RDTF9QUklNSVRJVkVfM0QJCQkJCTB4MDAwMDAwOTkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjExX1RDTF9QUklNSVRJVkVfM0QgdXNlZCBvbjogTlYxNSAKLSovCi0jZGVmaW5lCQkJTlYxMV9UQ0xfUFJJTUlUSVZFXzNECQkJCQkweDAwMDAwMDk2Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX05PUAkJCQkweDAwMDAwMTAwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX05PVElGWQkJCQkweDAwMDAwMTA0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9ETUFfTk9USUZZCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TRVRfRE1BX0lOX01FTU9SWTAJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfU0VUX0RNQV9JTl9NRU1PUlkxCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9ESVNQTEFZX0xJU1QJCQkweDAwMDAwMThjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9ETUFfSU5fTUVNT1JZMgkJMHgwMDAwMDE5NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TRVRfRE1BX0lOX01FTU9SWTMJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjE3X1RDTF9QUklNSVRJVkVfM0RfU0VUX0RNQV9JTl9NRU1PUlk0CQkweDAwMDAwMWFjCi0jCWRlZmluZQkJTlYxN19UQ0xfUFJJTUlUSVZFXzNEX1NFVF9ETUFfSU5fTUVNT1JZNQkJMHgwMDAwMDFiMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9IT1JJWgkJCTB4MDAwMDAyMDAJLyogUGFyYW1ldGVyczogd2lkdGggeCAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9WRVJUCQkJMHgwMDAwMDIwNAkvKiBQYXJhbWV0ZXJzOiBoZWlnaHQgeSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9CVUZGRVJfRk9STUFUCQkJMHgwMDAwMDIwOAkvKiBQYXJhbWV0ZXJzOiB0eXBlIGNvbG9yICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUl9QSVRDSAkJCTB4MDAwMDAyMGMJLyogUGFyYW1ldGVyczogZGVwdGgvc3RlbmNpbCBidWZmZXIgcGl0Y2ggY29sb3IgYnVmZmVyIHBpdGNoICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX09GRlNFVAkJCTB4MDAwMDAyMTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfT0ZGU0VUCQkJMHgwMDAwMDIxNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9UWF9PRkZTRVQoZCkJCQkoMHgwMDAwMDIxOCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX0ZPUk1BVChkKQkJCSgweDAwMDAwMjIwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogd3JhcF90IHdyYXBfcyBsb2cyKGhlaWdodCkgbG9nMih3aWR0aCkgbG9kIG5wb3QgZm9ybWF0IGN1YmVfbWFwICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX0VOQUJMRShkKQkJCSgweDAwMDAwMjI4ICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogZW5hYmxlIGFuaXNvdHJvcHkgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVFhfTlBPVF9QSVRDSChkKQkJCSgweDAwMDAwMjMwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogcGl0Y2ggKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVFhfTlBPVF9TSVpFKGQpCQkJKDB4MDAwMDAyNDAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVFhfRklMVEVSKGQpCQkJKDB4MDAwMDAyNDggKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiBtYWdfZmlsdGVyIG1pbl9maWx0ZXIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVFhfUEFMRVRURV9PRkZTRVQoZCkJCSgweDAwMDAwMjUwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVFhfTUFUUklYX0VOQUJMRShkKQkJKDB4MDAwMDAzZTAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9UWF9NQVRSSVgoeCx5KQkJCSgweDAwMDAwNTQwICsgeSAqIDB4MDAxMCArIHggKiAweDAwMDQpCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0lOX0FMUEhBKGQpCQkJKDB4MDAwMDAyNjAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiB2YXJhX21hcHBpbmcgdmFyYV9jb21wb25lbnRfdXNhZ2UgdmFyYV9pbnB1dCB2YXJiX21hcHBpbmcgdmFyYl9jb21wb25lbnRfdXNhZ2UgdmFyYl9pbnB1dCB2YXJjX21hcHBpbmcgdmFyY19jb21wb25lbnRfdXNhZ2UgdmFyY19pbnB1dCB2YXJkX21hcHBpbmcgdmFyZF9jb21wb25lbnRfdXNhZ2UgdmFyZF9pbnB1dCAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9SQ19JTl9SR0IoZCkJCQkoMHgwMDAwMDI2OCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IHZhcmFfbWFwcGluZyB2YXJhX2NvbXBvbmVudF91c2FnZSB2YXJhX2lucHV0IHZhcmJfbWFwcGluZyB2YXJiX2NvbXBvbmVudF91c2FnZSB2YXJiX2lucHV0IHZhcmNfbWFwcGluZyB2YXJjX2NvbXBvbmVudF91c2FnZSB2YXJjX2lucHV0IHZhcmRfbWFwcGluZyB2YXJkX2NvbXBvbmVudF91c2FnZSB2YXJkX2lucHV0ICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX09VVF9BTFBIQShkKQkJCSgweDAwMDAwMjc4ICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogc2NhbGUgYmlhcyBtdXhfc3VtIGFiX2RvdF9wcm9kdWN0IGNkX2RvdF9wcm9kdWN0IHN1bV9vdXRwdXQgYWJfb3V0cHV0IGNkX291dHB1dCAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9SQ19PVVRfUkdCKGQpCQkJKDB4MDAwMDAyODAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiByYzFfdHhfdW5pdHNfZW5hYmxlZCByYzFfcmNfZW5hYmxlZCBzY2FsZSBiaWFzIG11eF9zdW0gYWJfZG90X3Byb2R1Y3QgY2RfZG90X3Byb2R1Y3Qgc3VtX291dHB1dCBhYl9vdXRwdXQgY2Rfb3V0cHV0ICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0NPTE9SMAkJCQkweDAwMDAwMjcwCS8qIFBhcmFtZXRlcnM6IGEgciBnIGIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfUkNfQ09MT1IxCQkJCTB4MDAwMDAyNzQJLyogUGFyYW1ldGVyczogYSByIGcgYiAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9SQ19GSU5BTDAJCQkJMHgwMDAwMDI4OAkvKiBQYXJhbWV0ZXJzOiB2YXJhX21hcHBpbmcgdmFyYV9jb21wb25lbnRfdXNhZ2UgdmFyYV9pbnB1dCB2YXJiX21hcHBpbmcgdmFyYl9jb21wb25lbnRfdXNhZ2UgdmFyYl9pbnB1dCB2YXJjX21hcHBpbmcgdmFyY19jb21wb25lbnRfdXNhZ2UgdmFyY19pbnB1dCB2YXJkX21hcHBpbmcgdmFyZF9jb21wb25lbnRfdXNhZ2UgdmFyZF9pbnB1dCAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9SQ19GSU5BTDEJCQkJMHgwMDAwMDI4YwkvKiBQYXJhbWV0ZXJzOiB2YXJlX21hcHBpbmcgdmFyZV9jb21wb25lbnRfdXNhZ2UgdmFyZV9pbnB1dCB2YXJmX21hcHBpbmcgdmFyZl9jb21wb25lbnRfdXNhZ2UgdmFyZl9pbnB1dCB2YXJnX21hcHBpbmcgdmFyZ19jb21wb25lbnRfdXNhZ2UgdmFyZ19pbnB1dCBjb2xvcl9zdW1fY2xhbXAgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfTU9ERUwJCQkweDAwMDAwMjk0CS8qIFBhcmFtZXRlcnM6IGxvY2FsX3ZpZXdlciBjb2xvcl9jb250cm9sICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0VOQUJMRQkJMHgwMDAwMDI5OAkvKiBQYXJhbWV0ZXJzOiBzcGVjdWxhciBkaWZmdXNlIGFtYmllbnQgZW1pc3Npb24gKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRk9HX01PREUJCQkJMHgwMDAwMDI5YwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GT0dfQ09PUkRfRElTVAkJCTB4MDAwMDAyYTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VOQUJMRQkJCTB4MDAwMDAyYTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0NPTE9SCQkJCTB4MDAwMDAyYTgJLyogUGFyYW1ldGVyczogYSBiIGcgciAqLwotIwlkZWZpbmUJCU5WMTdfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLX0VOQUJMRQkJCTB4MDAwMDAyYmMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ0xJUF9IT1JJWihkKQkJKDB4MDAwMDAyYzAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiB4MiB4MSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DTElQX1ZFUlQoZCkJCSgweDAwMDAwMmUwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogeTIgeTEgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19FTkFCTEUJCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfRU5BQkxFCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0VfRU5BQkxFCQkJMHgwMDAwMDMwOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRQkJCTB4MDAwMDAzMGMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRElUSEVSX0VOQUJMRQkJCTB4MDAwMDAzMTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRJTkdfRU5BQkxFCQkJMHgwMDAwMDMxNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJTX0VOQUJMRQkJMHgwMDAwMDMxOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9TTU9PVEhfRU5BQkxFCQkweDAwMDAwMzFjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU01PT1RIX0VOQUJMRQkJMHgwMDAwMDMyMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NNT09USF9FTkFCTEUJCTB4MDAwMDAzMjQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1dFSUdIVF9FTkFCTEUJCTB4MDAwMDAzMjgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9FTkFCTEUJCQkweDAwMDAwMzJjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1BPSU5UX0VOQUJMRQkweDAwMDAwMzMwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0xJTkVfRU5BQkxFCTB4MDAwMDAzMzQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRklMTF9FTkFCTEUJMHgwMDAwMDMzOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0ZVTkMJCQkweDAwMDAwMzNjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfUkVGCQkJMHgwMDAwMDM0MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9GVU5DX1NSQwkJCTB4MDAwMDAzNDQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19EU1QJCQkweDAwMDAwMzQ4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SCQkJMHgwMDAwMDM0YwkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0VRVUFUSU9OCQkJMHgwMDAwMDM1MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9GVU5DCQkJMHgwMDAwMDM1NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLCQkJMHgwMDAwMDM1OAkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1dSSVRFX0VOQUJMRQkJMHgwMDAwMDM1YwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX01BU0sJCQkweDAwMDAwMzYwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlVOQ19GVU5DCQkJMHgwMDAwMDM2NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZVTkNfUkVGCQkJMHgwMDAwMDM2OAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZVTkNfTUFTSwkJCTB4MDAwMDAzNmMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9PUF9GQUlMCQkJMHgwMDAwMDM3MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX09QX1pGQUlMCQkJMHgwMDAwMDM3NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX09QX1pQQVNTCQkJMHgwMDAwMDM3OAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9TSEFERV9NT0RFTAkJCTB4MDAwMDAzN2MKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElORV9XSURUSAkJCTB4MDAwMDAzODAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRkFDVE9SCQkweDAwMDAwMzg0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1VOSVRTCQkweDAwMDAwMzg4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9GUk9OVAkJMHgwMDAwMDM4YwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfQkFDSwkJCTB4MDAwMDAzOTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfUkFOR0VfTkVBUgkJCTB4MDAwMDAzOTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfUkFOR0VfRkFSCQkJMHgwMDAwMDM5OAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0UJCQkJMHgwMDAwMDM5YwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9GQUNFCQkJMHgwMDAwMDNhMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9OT1JNQUxJWkVfRU5BQkxFCQkJMHgwMDAwMDNhNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9SCQkJMHgwMDAwMDNhOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9HCQkJMHgwMDAwMDNhYwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9CCQkJMHgwMDAwMDNiMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9BCQkJMHgwMDAwMDNiNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9DT05UUk9MCQkJMHgwMDAwMDNiOAkvKiBQYXJhbWV0ZXJzOiBjb2xvcl9jb250cm9sICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0VOQUJMRURfTElHSFRTCQkJMHgwMDAwMDNiYwkvKiBQYXJhbWV0ZXJzOiBsaWdodCA3IGxpZ2h0IDYgbGlnaHQgNSBsaWdodCA0IGxpZ2h0IDMgbGlnaHQgMiBsaWdodCAxIGxpZ2h0IDAgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9FTkFCTEUoIGQpCQkoMHgwMDAwMDNjMCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdfTUFUUklYX0VOQUJMRQkJMHgwMDAwMDNlOAkvKiBQYXJhbWV0ZXJzOiBwcm9qZWN0aW9uIG1vZGVsdmlldzAgbW9kZWx2aWV3MSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9TSVpFCQkJMHgwMDAwMDNlYwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9NT0RFTFZJRVcwX01BVFJJWCggZCkJCSgweDAwMDAwNDAwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTU9ERUxWSUVXMV9NQVRSSVgoIGQpCQkoMHgwMDAwMDQ0MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0lOVkVSU0VfTU9ERUxWSUVXMF9NQVRSSVgoIGQpCSgweDAwMDAwNDgwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfSU5WRVJTRV9NT0RFTFZJRVcxX01BVFJJWCggZCkJKDB4MDAwMDA0YzAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QUk9KRUNUSU9OX01BVFJJWCggZCkJCSgweDAwMDAwNTAwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9BKGQpCQkJKDB4MDAwMDA2MDAgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0IoZCkJCQkoMHgwMDAwMDYwNCArIGQgKiAweDAwMTApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfQyhkKQkJCSgweDAwMDAwNjA4ICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9EKGQpCQkJKDB4MDAwMDA2MGMgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GT0dfRVFVQVRJT05fQ09OU1RBTlQJCTB4MDAwMDA2ODAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VRVUFUSU9OX0xJTkVBUgkJMHgwMDAwMDY4NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GT0dfRVFVQVRJT05fUVVBRFJBVElDCQkweDAwMDAwNjg4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19BCTB4MDAwMDA2YTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0IJMHgwMDAwMDZhNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfQwkweDAwMDAwNmE4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19ECTB4MDAwMDA2YWMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0UJMHgwMDAwMDZiMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfRgkweDAwMDAwNmI0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fUgkweDAwMDAwNmM0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fRwkweDAwMDAwNmM4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fQgkweDAwMDAwNmNjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1NDQUxFX1gJCQkweDAwMDAwNmU4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1NDQUxFX1kJCQkweDAwMDAwNmVjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1NDQUxFX1oJCQkweDAwMDAwNmYwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1NDQUxFX1cJCQkweDAwMDAwNmY0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9BCQkJMHgwMDAwMDZmOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfQgkJCTB4MDAwMDA2ZmMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0MJCQkweDAwMDAwNzAwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9ECQkJMHgwMDAwMDcwNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfRQkJCTB4MDAwMDA3MDgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0YJCQkweDAwMDAwNzBjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9HCQkJMHgwMDAwMDcxMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfSAkJCTB4MDAwMDA3MTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0FNQklFTlRfUihkKQkoMHgwMDAwMDgwMCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX0coZCkJKDB4MDAwMDA4MDQgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9CKGQpCSgweDAwMDAwODA4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0RJRkZVU0VfUihkKQkoMHgwMDAwMDgwYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9ESUZGVVNFX0coZCkJKDB4MDAwMDA4MTAgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9CKGQpCSgweDAwMDAwODE0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX1IoZCkJKDB4MDAwMDA4MTggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfU1BFQ1VMQVJfRyhkKQkoMHgwMDAwMDgxYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9TUEVDVUxBUl9CKGQpCSgweDAwMDAwODIwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfSEFMRl9WRUNUT1JfWChkKQkJKDB4MDAwMDA4MjggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9IQUxGX1ZFQ1RPUl9ZKGQpCQkoMHgwMDAwMDgyYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0hBTEZfVkVDVE9SX1ooZCkJCSgweDAwMDAwODMwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1goZCkJCSgweDAwMDAwODM0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1koZCkJCSgweDAwMDAwODM4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1ooZCkJCSgweDAwMDAwODNjICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShkKQkJKDB4MDAwMDA4NDAgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0VYUE9ORU5UKGQpCQkoMHgwMDAwMDg0NCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfQ1VUT0ZGX0IoZCkJCSgweDAwMDAwODQ4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9ESVJfWChkKQkJKDB4MDAwMDA4NGMgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9ZKGQpCQkoMHgwMDAwMDg1MCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfRElSX1ooZCkJCSgweDAwMDAwODU0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQyhkKQkJKDB4MDAwMDA4NTggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9YKGQpCQkoMHgwMDAwMDg1YyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1BPU0lUSU9OX1koZCkJCSgweDAwMDAwODYwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfUE9TSVRJT05fWihkKQkJKDB4MDAwMDA4NjQgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9DT05TVEFOVF9BVFRFTlVBVElPTihkKQkoMHgwMDAwMDg2OCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0xJTkVBUl9BVFRFTlVBVElPTihkKQkoMHgwMDAwMDg2YyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1FVQURSQVRJQ19BVFRFTlVBVElPTihkKQkoMHgwMDAwMDg3MCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfM0ZfWAkJCTB4MDAwMDBjMDAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU18zRl9ZCQkJMHgwMDAwMGMwNAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzNGX1oJCQkweDAwMDAwYzA4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfNEZfWAkJCTB4MDAwMDBjMTgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180Rl9ZCQkJMHgwMDAwMGMxYwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzRGX1oJCQkweDAwMDAwYzIwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfNEZfVwkJCTB4MDAwMDBjMjQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX05PUl8zRl9YCQkJMHgwMDAwMGMzMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNGX1kJCQkweDAwMDAwYzM0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0ZfWgkJCTB4MDAwMDBjMzgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX05PUl8zSV9YWQkJCTB4MDAwMDBjNDAJLyogUGFyYW1ldGVyczogeSB4ICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0lfWgkJCTB4MDAwMDBjNDQJLyogUGFyYW1ldGVyczogeiAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRGX1IJCQkweDAwMDAwYzUwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfNEZfRwkJCTB4MDAwMDBjNTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF80Rl9CCQkJMHgwMDAwMGM1OAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRGX0EJCQkweDAwMDAwYzVjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfM0ZfUgkJCTB4MDAwMDBjNjAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF8zRl9HCQkJMHgwMDAwMGM2NAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzNGX0IJCQkweDAwMDAwYzY4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfNEkJCQkweDAwMDAwYzZjCS8qIFBhcmFtZXRlcnM6IGEgYiBnIHIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTDJfM0ZfUgkJCTB4MDAwMDBjODAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTDJfM0ZfRwkJCTB4MDAwMDBjODQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTDJfM0ZfQgkJCTB4MDAwMDBjODgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTDJfM0kJCQkweDAwMDAwYzhjCS8qIFBhcmFtZXRlcnM6IGEgYiBnIHIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF8yRl9TCQkJMHgwMDAwMGM5MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzJGX1QJCQkweDAwMDAwYzk0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfMkkJCQkweDAwMDAwYzk4CS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRGX1MJCQkweDAwMDAwY2EwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfNEZfVAkJCTB4MDAwMDBjYTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80Rl9SCQkJMHgwMDAwMGNhOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRGX1EJCQkweDAwMDAwY2FjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfNElfU1QJCQkweDAwMDAwY2IwCS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRJX1JRCQkJMHgwMDAwMGNiNAkvKiBQYXJhbWV0ZXJzOiBxIHIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV8yRl9TCQkJMHgwMDAwMGNiOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzJGX1QJCQkweDAwMDAwY2JjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfMkkJCQkweDAwMDAwY2MwCS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRGX1MJCQkweDAwMDAwY2M4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNEZfVAkJCTB4MDAwMDBjY2MKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80Rl9SCQkJMHgwMDAwMGNkMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRGX1EJCQkweDAwMDAwY2Q0Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNElfU1QJCQkweDAwMDAwY2Q4CS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRJX1JRCQkJMHgwMDAwMGNkYwkvKiBQYXJhbWV0ZXJzOiBxIHIgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0ZPR18xRgkJCTB4MDAwMDBjZTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1dHSF8xRgkJCTB4MDAwMDBjZTQKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfRURHRUZMQUdfRU5BQkxFCQkJMHgwMDAwMGNlYwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUiggZCkJCQkoMHgwMDAwMGQwNCArIGQgKiAweDAwMDgpCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfVkFMSURBVEUJCTB4MDAwMDBjZjAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX09GRlNFVF9QT1MJCTB4MDAwMDBkMDAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX0ZPUk1BVF9QT1MJCTB4MDAwMDBkMDQJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BUlJBWV9PRkZTRVRfQ09MCQkweDAwMDAwZDA4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BUlJBWV9GT1JNQVRfQ09MCQkweDAwMDAwZDBjCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfT0ZGU0VUX0NPTDIJCTB4MDAwMDBkMTAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX0ZPUk1BVF9DT0wyCQkweDAwMDAwZDE0CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfT0ZGU0VUX1RYMAkJMHgwMDAwMGQxOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfRk9STUFUX1RYMAkJMHgwMDAwMGQxYwkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX09GRlNFVF9UWDEJCTB4MDAwMDBkMjAKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX0ZPUk1BVF9UWDEJCTB4MDAwMDBkMjQJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BUlJBWV9PRkZTRVRfTk9SCQkweDAwMDAwZDI4Ci0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BUlJBWV9GT1JNQVRfTk9SCQkweDAwMDAwZDJjCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfT0ZGU0VUX1dHSAkJMHgwMDAwMGQzMAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfRk9STUFUX1dHSAkJMHgwMDAwMGQzNAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX09GRlNFVF9GT0cJCTB4MDAwMDBkMzgKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX0ZPUk1BVF9GT0cJCTB4MDAwMDBkM2MJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX0xPR0lDX09QX0VOQUJMRQkJMHgwMDAwMGQ0MAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9MT0dJQ19PUF9PUAkJCTB4MDAwMDBkNDQKLSMJZGVmaW5lCQlOVjE3X1RDTF9QUklNSVRJVkVfM0RfTE1BX0RFUFRIX0JVRkZFUl9QSVRDSAkJMHgwMDAwMGQ1YwkvKiBQYXJhbWV0ZXJzOiBwaXRjaCAqLwotIwlkZWZpbmUJCU5WMTdfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfQlVGRkVSX09GRlNFVAkJMHgwMDAwMGQ2MAotIwlkZWZpbmUJCU5WMTdfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfRklMTF9WQUxVRQkJMHgwMDAwMGQ2OAotIwlkZWZpbmUJCU5WMTdfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfQ0xFQVJfRU5BQkxFCQkweDAwMDAwZDZjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JFR0lOX0VORAkJCQkweDAwMDAwZGZjCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0lOREVYX0RBVEEJCQkweDAwMDAwZTAwCS8qIFBhcmFtZXRlcnM6IGluZGV4MSBpbmRleDAgKi8KLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0JVRkZFUl9CRUdJTl9FTkQJCTB4MDAwMDEzZmMKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0JVRkZFUl9EUkFXX0FSUkFZUwkJMHgwMDAwMTQwMAkvKiBQYXJhbWV0ZXJzOiBjb3VudC0xIGZpcnN0ICovCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX09SSUdJTl9YCQkJMHgwMDAwMTYzOAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9PUklHSU5fWQkJCTB4MDAwMDE2M2MKLSMJZGVmaW5lCQlOVjEwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1JJR0lOX1oJCQkweDAwMDAxNjQwCi0jCWRlZmluZQkJTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX09SSUdJTl9XCQkJMHgwMDAwMTY0NAotIwlkZWZpbmUJCU5WMTdfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfRU5BQkxFCQkJMHgwMDAwMTY1OAotIwlkZWZpbmUJCU5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfREFUQQkJCTB4MDAwMDE4MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjEwX0lNQUdFX0ZST01fQ1BVIHVzZWQgb246IE5WMTAgTlYxNSBOVjIwIE5WMzAgTlY0MCBHNzAKLSovCi0jZGVmaW5lCQkJTlYxMF9JTUFHRV9GUk9NX0NQVQkJCQkJMHgwMDAwMDA4YQotIwlkZWZpbmUJCU5WMTBfSU1BR0VfRlJPTV9DUFVfU0VUX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9GUk9NX0NQVV9TRVRfQ09OVEVYVF9DTElQX1JFQ1RBTkdMRQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfRlJPTV9DUFVfU0VUX0lNQUdFX1BBVFRFUk4JCQkweDAwMDAwMThjCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9GUk9NX0NQVV9TRVRfUkFTVEVSX09QCQkJMHgwMDAwMDE5MAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfRlJPTV9DUFVfU0VUX0NPTlRFWFRfU1VSRkFDRVNfMkQJCTB4MDAwMDAxOWMKLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0ZST01fQ1BVX09QRVJBVElPTgkJCQkweDAwMDAwMmZjCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9GUk9NX0NQVV9GT1JNQVQJCQkJMHgwMDAwMDMwMAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfRlJPTV9DUFVfUE9JTlQJCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0ZST01fQ1BVX1NJWkVfT1VUCQkJCTB4MDAwMDAzMDgJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9GUk9NX0NQVV9TSVpFX0lOCQkJCTB4MDAwMDAzMGMJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9GUk9NX0NQVV9ITElORQkJCQkweDAwMDAwNDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYxMF9QUklNSVRJVkVfMkQgdXNlZCBvbjogTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjEwX1BSSU1JVElWRV8yRAkJCQkJMHgwMDAwMDA3YgotIwlkZWZpbmUJCU5WMTBfUFJJTUlUSVZFXzJEX1NFVF9ETUFfTk9USUZZCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMTBfUFJJTUlUSVZFXzJEX1NFVF9TVVJGQUNFCQkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjEwX1BSSU1JVElWRV8yRF9TRVRfRk9STUFUCQkJCTB4MDAwMDAzMDAKLSMJZGVmaW5lCQlOVjEwX1BSSU1JVElWRV8yRF9TRVRfUE9JTlQJCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiB4IHkgKi8KLSMJZGVmaW5lCQlOVjEwX1BSSU1JVElWRV8yRF9TRVRfU0laRQkJCQkweDAwMDAwMzA4CS8qIFBhcmFtZXRlcnM6IHdpZHRoIGhlaWdodCAqLwotIwlkZWZpbmUJCU5WMTBfUFJJTUlUSVZFXzJEX1NFVF9DTElQX0hPUklaCQkJMHgwMDAwMDMwYwkvKiBQYXJhbWV0ZXJzOiB3aWR0aCB4ICovCi0jCWRlZmluZQkJTlYxMF9QUklNSVRJVkVfMkRfU0VUX0NMSVBfVkVSVAkJCQkweDAwMDAwMzEwCS8qIFBhcmFtZXRlcnM6IGhlaWdodCB5ICovCi0jCWRlZmluZQkJTlYxMF9QUklNSVRJVkVfMkRfU0VUX0RBVEEoIGQpCQkJCSgweDAwMDAwNDAwICsgZCAqIDB4MDAwNCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjEwX0lNQUdFX0JMSVQgdXNlZCBvbjogTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjEwX0lNQUdFX0JMSVQJCQkJCQkweDAwMDAwMDlmCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9CTElUX05PUAkJCQkJMHgwMDAwMDEwMAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfQkxJVF9OT1RJRlkJCQkJCTB4MDAwMDAxMDQKLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0JMSVRfU0VUX0RNQV9OT1RJRlkJCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfQkxJVF9TRVRfQ09OVEVYVF9DTElQX1JFQ1RBTkdMRQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMTBfSU1BR0VfQkxJVF9TRVRfSU1BR0VfUEFUVEVSTgkJCTB4MDAwMDAxOGMKLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0JMSVRfU0VUX1JBU1RFUl9PUAkJCQkweDAwMDAwMTkwCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9CTElUX1NFVF9DT05URVhUX1NVUkZBQ0VTXzJECQkJMHgwMDAwMDE5YwotIwlkZWZpbmUJCU5WMTBfSU1BR0VfQkxJVF9TRVRfT1BFUkFUSU9OCQkJCTB4MDAwMDAyZmMKLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0JMSVRfU0VUX1BPSU5UCQkJCTB4MDAwMDAzMDAJLyogUGFyYW1ldGVyczogeCB5ICovCi0jCWRlZmluZQkJTlYxMF9JTUFHRV9CTElUX1NFVF9QSVRDSAkJCQkweDAwMDAwMzA0CS8qIFBhcmFtZXRlcnM6IHNraXAgKi8KLSMJZGVmaW5lCQlOVjEwX0lNQUdFX0JMSVRfU0VUX1NJWkUJCQkJMHgwMDAwMDMwOAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjEwX1ZJREVPX0RJU1BMQVkgdXNlZCBvbjogTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjEwX1ZJREVPX0RJU1BMQVkJCQkJCTB4MDAwMDAwN2MKLSMJZGVmaW5lCQlOVjEwX1ZJREVPX0RJU1BMQVlfQ09VTlRFUgkJCQkweDAwMDAwMDUwCi0jCWRlZmluZQkJTlYxMF9WSURFT19ESVNQTEFZX1NFVF9ETUFfRlJPTV9NRU1PUlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYxMF9WSURFT19ESVNQTEFZX1NFVF9ETUFfSU5fTUVNT1JZMAkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjEwX1ZJREVPX0RJU1BMQVlfU0VUX0RNQV9JTl9NRU1PUlkxCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMTBfVklERU9fRElTUExBWV9TRVRfT0JKRUNUMwkJCQkweDAwMDAwMTljCi0jCWRlZmluZQkJTlYxMF9WSURFT19ESVNQTEFZX1NJWkUJCQkJCTB4MDAwMDAyZjgJLyogUGFyYW1ldGVyczogaGVpZ2h0IHdpZHRoICovCi0jCWRlZmluZQkJTlYxMF9WSURFT19ESVNQTEFZX09GRlNFVAkJCQkweDAwMDAwMzAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYxMF9VTkswMDcyIHVzZWQgb246IE5WMTAgTlYxNSBOVjIwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WMTBfVU5LMDA3MgkJCQkJCTB4MDAwMDAwNzIKLSMJZGVmaW5lCQlOVjEwX1VOSzAwNzJfQ09VTlRFUgkJCQkJMHgwMDAwMDA1MAotIwlkZWZpbmUJCU5WNDBfVU5LMDA3Ml9TRVRfT0JKRUNUCQkJCQkweDAwMDAwMDYwCi0jCWRlZmluZQkJTlYxMF9VTkswMDcyX1NFVF9ETUFfTk9USUZZCQkJCTB4MDAwMDAxODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjEwX1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWSB1c2VkIG9uOiBOVjEwIE5WMTUgTlYyMCBOVjMwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZCQkJCTB4MDAwMDAwODkKLSMJZGVmaW5lCQlOVjEwX1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9DT1VOVEVSCQkJMHgwMDAwMDA1MAotIwlkZWZpbmUJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX1NFVF9ETUFfSU5fTUVNT1JZCQkweDAwMDAwMTg0Ci0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfU0VUX1JBU1RFUl9PUAkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX1NFVF9JTUFHRV9QQVRURVJOCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfU0VUX1NVUkZBQ0UJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjEwX1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9PUEVSQVRJT04JCQkweDAwMDAwMzA0Ci0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfQ0xJUF9QT1MJCQkweDAwMDAwMzA4CS8qIFBhcmFtZXRlcnM6IHggeSAqLwotIwlkZWZpbmUJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX0NMSVBfU0laRQkJCTB4MDAwMDAzMGMJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfT1VUX1BPUwkJCTB4MDAwMDAzMTAJLyogUGFyYW1ldGVyczogeCB5ICovCi0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfT1VUX1NJWkUJCQkweDAwMDAwMzE0CS8qIFBhcmFtZXRlcnM6IHdpZHRoIGhlaWdodCAqLwotIwlkZWZpbmUJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX1NJWkUJCQkweDAwMDAwNDAwCS8qIFBhcmFtZXRlcnM6IHdpZHRoIGhlaWdodCAqLwotIwlkZWZpbmUJCU5WMTBfU0NBTEVEX0lNQUdFX0ZST01fTUVNT1JZX0ZPUk1BVAkJCTB4MDAwMDA0MDQJLyogUGFyYW1ldGVyczogcGl0Y2ggKi8KLSMJZGVmaW5lCQlOVjEwX1NDQUxFRF9JTUFHRV9GUk9NX01FTU9SWV9PRkZTRVQJCQkweDAwMDAwNDA4Ci0jCWRlZmluZQkJTlYxMF9TQ0FMRURfSU1BR0VfRlJPTV9NRU1PUllfUE9JTlQJCQkweDAwMDAwNDBjCS8qIFBhcmFtZXRlcnM6IHVfaW50IHVfZnJhYyoweDEwIHZfaW50IHZfZnJhYyoweDEwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJEIHVzZWQgb246IE5WMTAgTlYxNSBOVjIwIE5WMzAgTlY0MCBHNzAKLSovCi0jZGVmaW5lCQkJTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJECQkJCTB4MDAwMDAwNjIKLSMJZGVmaW5lCQlOVjEwX0NPTlRFWFRfU1VSRkFDRVNfMkRfU0VUX0RNQV9OT1RJRlkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJEX1NFVF9ETUFfSU5fTUVNT1JZMAkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WMTBfQ09OVEVYVF9TVVJGQUNFU18yRF9TRVRfRE1BX0lOX01FTU9SWTEJCTB4MDAwMDAxODgKLSMJZGVmaW5lCQlOVjEwX0NPTlRFWFRfU1VSRkFDRVNfMkRfRk9STUFUCQkJCTB4MDAwMDAzMDAJLyogUGFyYW1ldGVyczogY29sb3IgdHlwZSB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOVjEwX0NPTlRFWFRfU1VSRkFDRVNfMkRfUElUQ0gJCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiBzcmMgZHN0ICovCi0jCWRlZmluZQkJTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJEX09GRlNFVF9TUkMJCQkweDAwMDAwMzA4Ci0jCWRlZmluZQkJTlYxMF9DT05URVhUX1NVUkZBQ0VTXzJEX09GRlNFVF9EU1QJCQkweDAwMDAwMzBjCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNF9DT05URVhUX1NVUkZBQ0VTXzJEIHVzZWQgb246IE5WMDQgTlYxMCBOVjE1IAotKi8KLSNkZWZpbmUJCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfMkQJCQkJMHgwMDAwMDA0MgotIwlkZWZpbmUJCU5WMDRfQ09OVEVYVF9TVVJGQUNFU18yRF9OT1RJRlkJCQkJMHgwMDAwMDEwNAotIwlkZWZpbmUJCU5WMDRfQ09OVEVYVF9TVVJGQUNFU18yRF9TRVRfRE1BX05PVElGWQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfMkRfU0VUX0RNQV9JTUFHRV9TUkMJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfMkRfU0VUX0RNQV9JTUFHRV9EU1QJCTB4MDAwMDAxODgKLSMJZGVmaW5lCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfMkRfRk9STUFUCQkJCTB4MDAwMDAzMDAKLSMJZGVmaW5lCQlOVjA0X0NPTlRFWFRfU1VSRkFDRVNfMkRfUElUQ0gJCQkJMHgwMDAwMDMwNAkvKiBQYXJhbWV0ZXJzOiBzcmMgZHN0ICovCi0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzJEX09GRlNFVF9TUkMJCQkweDAwMDAwMzA4Ci0jCWRlZmluZQkJTlYwNF9DT05URVhUX1NVUkZBQ0VTXzJEX09GRlNFVF9EU1QJCQkweDAwMDAwMzBjCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYwNF9JTUFHRV9QQVRURVJOIHVzZWQgb246IE5WMDQgTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjA0X0lNQUdFX1BBVFRFUk4JCQkJCTB4MDAwMDAwNDQKLSMJZGVmaW5lCQlOVjA0X0lNQUdFX1BBVFRFUk5fQ09MT1JfRk9STUFUCQkJCTB4MDAwMDAzMDAKLSMJZGVmaW5lCQlOVjA0X0lNQUdFX1BBVFRFUk5fTU9OT19GT1JNQVQJCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU5WMDRfSU1BR0VfUEFUVEVSTl9TRUxFQ1QJCQkJMHgwMDAwMDMwYwotIwlkZWZpbmUJCU5WMDRfSU1BR0VfUEFUVEVSTl9NT05PQ0hST01FX1NIQVBFCQkJMHgwMDAwMDMwOAotIwlkZWZpbmUJCU5WMDRfSU1BR0VfUEFUVEVSTl9NT05PQ0hST01FX0NPTE9SMAkJCTB4MDAwMDAzMTAKLSMJZGVmaW5lCQlOVjA0X0lNQUdFX1BBVFRFUk5fTU9OT0NIUk9NRV9DT0xPUjEJCQkweDAwMDAwMzE0Ci0jCWRlZmluZQkJTlYwNF9JTUFHRV9QQVRURVJOX01PTk9DSFJPTUVfUEFUVEVSTjAJCQkweDAwMDAwMzE4Ci0jCWRlZmluZQkJTlYwNF9JTUFHRV9QQVRURVJOX01PTk9DSFJPTUVfUEFUVEVSTjEJCQkweDAwMDAwMzFjCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYyMF9TV0laWkxFRF9TVVJGQUNFIHVzZWQgb246IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjIwX1NXSVpaTEVEX1NVUkZBQ0UJCQkJCTB4MDAwMDAwOWUKLSMJZGVmaW5lCQlOVjIwX1NXSVpaTEVEX1NVUkZBQ0VfU0VUX09CSkVDVDAJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTlYyMF9TV0laWkxFRF9TVVJGQUNFX1NFVF9PQkpFQ1QxCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU5WMjBfU1dJWlpMRURfU1VSRkFDRV9GT1JNQVQJCQkJMHgwMDAwMDMwMAkvKiBQYXJhbWV0ZXJzOiBsb2cyKGhlaWdodCkgbG9nMih3aWR0aCkgY29sb3IgKi8KLSMJZGVmaW5lCQlOVjIwX1NXSVpaTEVEX1NVUkZBQ0VfT0ZGU0VUCQkJCTB4MDAwMDAzMDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVjIwX1RDTF9QUklNSVRJVkVfM0QgdXNlZCBvbjogTlYyMCAKLSovCi0jZGVmaW5lCQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNECQkJCQkweDAwMDAwMDk3Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX05PUAkJCQkweDAwMDAwMTAwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX05PVElGWQkJCQkweDAwMDAwMTA0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1QwCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMQkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDIJCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1QzCQkJMHgwMDAwMDE5NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUNAkJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDUJCQkweDAwMDAwMTljCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1Q2CQkJMHgwMDAwMDFhMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUNwkJCTB4MDAwMDAxYTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDgJCQkweDAwMDAwMWE4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1Q5CQkJMHgwMDAwMDFhYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMTAJCQkweDAwMDAwMWIwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0hPUklaCQkJMHgwMDAwMDIwMAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCB4ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1ZFUlQJCQkweDAwMDAwMjA0CS8qIFBhcmFtZXRlcnM6IGhlaWdodCB5ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUl9GT1JNQVQJCQkweDAwMDAwMjA4CS8qIFBhcmFtZXRlcnM6IHR5cGUgY29sb3IgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQlVGRkVSX1BJVENICQkJMHgwMDAwMDIwYwkvKiBQYXJhbWV0ZXJzOiBkZXB0aC9zdGVuY2lsIGJ1ZmZlciBwaXRjaCBjb2xvciBidWZmZXIgcGl0Y2ggKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfT0ZGU0VUCQkJMHgwMDAwMDIxMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9PRkZTRVQJCQkweDAwMDAwMjE0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xNQV9ERVBUSF9CVUZGRVJfUElUQ0gJCTB4MDAwMDAyMmMJLyogUGFyYW1ldGVyczogcGl0Y2ggKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTE1BX0RFUFRIX0JVRkZFUl9PRkZTRVQJCTB4MDAwMDAyMzAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfQ09OVFJPTAkJCTB4MDAwMDAyOTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfQ09OVFJPTAkJMHgwMDAwMDI5OAkvKiBQYXJhbWV0ZXJzOiBiYWNrX3NwZWN1bGFyIGJhY2tfYW1iaWVudCBiYWNrX2RpZmZ1c2UgYmFja19lbWlzc2lvbiBmcm9udF9zcGVjdWxhciBmcm9udF9hbWJpZW50IGZyb250X2RpZmZ1c2UgZnJvbnRfZW1pc3Npb24gKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRk9HX01PREUJCQkJMHgwMDAwMDI5YwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9GT0dfQ09PUkRfRElTVAkJCTB4MDAwMDAyYTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VOQUJMRQkJCTB4MDAwMDAyYTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ0xJUF9IT1JJWihkKQkJKDB4MDAwMDAyYzAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiB4MiB4MSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DTElQX1ZFUlQoZCkJCSgweDAwMDAwMmUwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogeTIgeTEgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19FTkFCTEUJCQkweDAwMDAwMzAwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfRU5BQkxFCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0VfRU5BQkxFCQkJMHgwMDAwMDMwOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRQkJCTB4MDAwMDAzMGMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRElUSEVSX0VOQUJMRQkJCTB4MDAwMDAzMTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRJTkdfRU5BQkxFCQkJMHgwMDAwMDMxNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9TTU9PVEhfRU5BQkxFCQkweDAwMDAwMzFjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUlNfRU5BQkxFCQkweDAwMDAwMzE4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU01PT1RIX0VOQUJMRQkJMHgwMDAwMDMyMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NNT09USF9FTkFCTEUJCTB4MDAwMDAzMjQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9FTkFCTEUJCQkweDAwMDAwMzJjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1BPSU5UX0VOQUJMRQkweDAwMDAwMzMwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0xJTkVfRU5BQkxFCTB4MDAwMDAzMzQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRklMTF9FTkFCTEUJMHgwMDAwMDMzOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0ZVTkMJCQkweDAwMDAwMzNjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfUkVGCQkJMHgwMDAwMDM0MAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9GVU5DX1NSQwkJCTB4MDAwMDAzNDQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19EU1QJCQkweDAwMDAwMzQ4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SCQkJMHgwMDAwMDM0YwkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0VRVUFUSU9OCQkJMHgwMDAwMDM1MAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9GVU5DCQkJMHgwMDAwMDM1NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLCQkJMHgwMDAwMDM1OAkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1dSSVRFX0VOQUJMRQkJMHgwMDAwMDM1YwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX01BU0sJCQkweDAwMDAwMzYwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlVOQ19GVU5DCQkJMHgwMDAwMDM2NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZVTkNfUkVGCQkJMHgwMDAwMDM2OAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZVTkNfTUFTSwkJCTB4MDAwMDAzNmMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9PUF9GQUlMCQkJMHgwMDAwMDM3MAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX09QX1pGQUlMCQkJMHgwMDAwMDM3NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX09QX1pQQVNTCQkJMHgwMDAwMDM3OAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TSEFERV9NT0RFTAkJCTB4MDAwMDAzN2MKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElORV9XSURUSAkJCTB4MDAwMDAzODAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRkFDVE9SCQkweDAwMDAwMzg0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1VOSVRTCQkweDAwMDAwMzg4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9GUk9OVAkJMHgwMDAwMDM4YwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfQkFDSwkJCTB4MDAwMDAzOTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfUkFOR0VfTkVBUgkJCTB4MDAwMDAzOTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfUkFOR0VfRkFSCQkJMHgwMDAwMDM5OAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0UJCQkJMHgwMDAwMDM5YwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9GQUNFCQkJMHgwMDAwMDNhMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9OT1JNQUxJWkVfRU5BQkxFCQkJMHgwMDAwMDNhNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9GUk9OVF9SCQkweDAwMDAwM2E4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0ZST05UX0cJCTB4MDAwMDAzYWMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfRlJPTlRfQgkJMHgwMDAwMDNiMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9GUk9OVF9BCQkweDAwMDAwM2I0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFUEFSQVRFX1NQRUNVTEFSX0VOQUJMRQkJMHgwMDAwMDNiOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9FTkFCTEVEX0xJR0hUUwkJCTB4MDAwMDAzYmMJLyogUGFyYW1ldGVyczogbGlnaHQgNyBsaWdodCA2IGxpZ2h0IDUgbGlnaHQgNCBsaWdodCAzIGxpZ2h0IDIgbGlnaHQgMSBsaWdodCAwICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfRU5BQkxFKGQpCQkoMHgwMDAwMDNjMCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX01BVFJJWF9FTkFCTEUoZCkJCSgweDAwMDAwNDIwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfU0laRQkJCTB4MDAwMDA0M2MKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTU9ERUxWSUVXX01BVFJJWCggZCkJCSgweDAwMDAwNDgwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfSU5WRVJTRV9NT0RFTFZJRVdfTUFUUklYKCBkKQkoMHgwMDAwMDU4MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BST0pFQ1RJT05fTUFUUklYKCBkKQkJKDB4MDAwMDA2ODAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9UWF9NQVRSSVgoeCx5KQkJCSgweDAwMDAwNmMwICsgeSAqIDB4MDAxMCArIHggKiAweDAwMDQpCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfQShkKQkJCSgweDAwMDAwODQwICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9CKGQpCQkJKDB4MDAwMDA4NDQgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0MoZCkJCQkoMHgwMDAwMDg0OCArIGQgKiAweDAwMTApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfRChkKQkJCSgweDAwMDAwODRjICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VRVUFUSU9OX0NPTlNUQU5UCQkweDAwMDAwOWMwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FUVVBVElPTl9MSU5FQVIJCTB4MDAwMDA5YzQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VRVUFUSU9OX1FVQURSQVRJQwkJMHgwMDAwMDljOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfQQkweDAwMDAwOWUwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19CCTB4MDAwMDA5ZTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0MJMHgwMDAwMDllOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfRAkweDAwMDAwOWVjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19FCTB4MDAwMDA5ZjAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0YJMHgwMDAwMDlmNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9TUFJJVEUJCQkweDAwMDAwYTFjCS8qIFBhcmFtZXRlcnM6IGNvb3JkX3JlcGxhY2Ugcl9tb2RlIGVuYWJsZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9PWAkJCTB4MDAwMDBhMjAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1kJCQkweDAwMDAwYTI0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0RFUFRIX0FWR19TCQkweDAwMDAwYTI4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1VOS05PV05fQQkJMHgwMDAwMGEyYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfQQkJCTB4MDAwMDBhMzAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0IJCQkweDAwMDAwYTM0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9DCQkJMHgwMDAwMGEzOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfRAkJCTB4MDAwMDBhM2MKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0UJCQkweDAwMDAwYTQwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9GCQkJMHgwMDAwMGE0NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfRwkJCTB4MDAwMDBhNDgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0gJCQkweDAwMDAwYTRjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1BYX0RJVjIJCQkweDAwMDAwYWYwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1BZX0RJVjIJCQkweDAwMDAwYWY0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0RFUFRIX0hBTEZfUwkJMHgwMDAwMGFmOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9VTktOT1dOX0IJCTB4MDAwMDBhZmMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0lOU1QwCQkJMHgwMDAwMGIwMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfSU5TVDEJCQkweDAwMDAwYjA0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9JTlNUMgkJCTB4MDAwMDBiMDgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0lOU1QzCQkJMHgwMDAwMGIwYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfQ09OU1RfWAkJCTB4MDAwMDBiODAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0NPTlNUX1kJCQkweDAwMDAwYjg0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9aCQkJMHgwMDAwMGI4OAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfQ09OU1RfVwkJCTB4MDAwMDBiOGMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0NPTlNUX0lECQkweDAwMDAxZWE0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fUgkweDAwMDAwYTEwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fRwkweDAwMDAwYTE0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fQgkweDAwMDAwYTE4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX09GRlNFVChkKQkJCSgweDAwMDAxYjAwICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVFhfRk9STUFUKGQpCQkJKDB4MDAwMDFiMDQgKyBkICogMHgwMDQwKQkvKiBQYXJhbWV0ZXJzOiBsb2cyKGhlaWdodCkgbG9nMih3aWR0aCkgbG9kIGZvcm1hdCBjdWJlX21hcCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9UWF9XUkFQKGQpCQkJKDB4MDAwMDFiMDggKyBkICogMHgwMDQwKQkvKiBQYXJhbWV0ZXJzOiB3cmFwX3Mgd3JhcF90IHdyYXBfciAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9UWF9FTkFCTEUoZCkJCQkoMHgwMDAwMWIwYyArIGQgKiAweDAwNDApCS8qIFBhcmFtZXRlcnM6IGVuYWJsZSBhbmlzb3Ryb3B5ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX05QT1RfUElUQ0goZCkJCQkoMHgwMDAwMWIxMCArIGQgKiAweDAwNDApCS8qIFBhcmFtZXRlcnM6IHBpdGNoICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX0ZJTFRFUihkKQkJCSgweDAwMDAxYjE0ICsgZCAqIDB4MDA0MCkJLyogUGFyYW1ldGVyczogbWFnX2ZpbHRlciBtaW5fZmlsdGVyICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX05QT1RfU0laRShkKQkJCSgweDAwMDAxYjFjICsgZCAqIDB4MDA0MCkJLyogUGFyYW1ldGVyczogd2lkdGggaGVpZ2h0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX1BBTEVUVEVfT0ZGU0VUKGQpCQkoMHgwMDAwMWIyMCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0VOQUJMRQkJCQkweDAwMDAxZTYwCS8qIFBhcmFtZXRlcnM6IG51bWJlciBvZiByYyBlbmFibGVkICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX1NIQURFUl9PUAkJCTB4MDAwMDFlNzAJLyogUGFyYW1ldGVyczogb3AwIG9wMSBvcDIgb3AzICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX1NIQURFUl9DVUxMX01PREUJCTB4MDAwMDE3ZjgJLyogUGFyYW1ldGVyczogY3VsbDAgY3VsbDEgY3VsbDIgY3VsbDMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVFhfU0hBREVSX1BSRVZJT1VTCQkweDAwMDAxZTc4CS8qIFBhcmFtZXRlcnM6IHByZXYyIHByZXYzICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0NPTE9SMAkJCQkweDAwMDAxZTIwCS8qIFBhcmFtZXRlcnM6IGEgciBnIGIgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUkNfQ09MT1IxCQkJCTB4MDAwMDFlMjQJLyogUGFyYW1ldGVyczogYSByIGcgYiAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9SQ19GSU5BTDAJCQkJMHgwMDAwMDI4OAkvKiBQYXJhbWV0ZXJzOiB2YXJhX21hcHBpbmcgdmFyYV9jb21wb25lbnRfdXNhZ2UgdmFyYV9pbnB1dCB2YXJiX21hcHBpbmcgdmFyYl9jb21wb25lbnRfdXNhZ2UgdmFyYl9pbnB1dCB2YXJjX21hcHBpbmcgdmFyY19jb21wb25lbnRfdXNhZ2UgdmFyY19pbnB1dCB2YXJkX21hcHBpbmcgdmFyZF9jb21wb25lbnRfdXNhZ2UgdmFyZF9pbnB1dCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9SQ19GSU5BTDEJCQkJMHgwMDAwMDI4YwkvKiBQYXJhbWV0ZXJzOiB2YXJlX21hcHBpbmcgdmFyZV9jb21wb25lbnRfdXNhZ2UgdmFyZV9pbnB1dCB2YXJmX21hcHBpbmcgdmFyZl9jb21wb25lbnRfdXNhZ2UgdmFyZl9pbnB1dCB2YXJnX21hcHBpbmcgdmFyZ19jb21wb25lbnRfdXNhZ2UgdmFyZ19pbnB1dCBjb2xvcl9zdW1fY2xhbXAgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUkNfSU5fQUxQSEEoZCkJCQkoMHgwMDAwMDI2MCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IHZhcmFfbWFwcGluZyB2YXJhX2NvbXBvbmVudF91c2FnZSB2YXJhX2lucHV0IHZhcmJfbWFwcGluZyB2YXJiX2NvbXBvbmVudF91c2FnZSB2YXJiX2lucHV0IHZhcmNfbWFwcGluZyB2YXJjX2NvbXBvbmVudF91c2FnZSB2YXJjX2lucHV0IHZhcmRfbWFwcGluZyB2YXJkX2NvbXBvbmVudF91c2FnZSB2YXJkX2lucHV0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0lOX1JHQihkKQkJCSgweDAwMDAwYWMwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogdmFyYV9tYXBwaW5nIHZhcmFfY29tcG9uZW50X3VzYWdlIHZhcmFfaW5wdXQgdmFyYl9tYXBwaW5nIHZhcmJfY29tcG9uZW50X3VzYWdlIHZhcmJfaW5wdXQgdmFyY19tYXBwaW5nIHZhcmNfY29tcG9uZW50X3VzYWdlIHZhcmNfaW5wdXQgdmFyZF9tYXBwaW5nIHZhcmRfY29tcG9uZW50X3VzYWdlIHZhcmRfaW5wdXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUkNfQ09OU1RBTlRfQ09MT1IwKGQpCQkoMHgwMDAwMGE2MCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IGEgciBnIGIgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUkNfQ09OU1RBTlRfQ09MT1IxKGQpCQkoMHgwMDAwMGE4MCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IGEgciBnIGIgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfUkNfT1VUX0FMUEhBKGQpCQkJKDB4MDAwMDBhYTAgKyBkICogMHgwMDA0KQkvKiBQYXJhbWV0ZXJzOiBzY2FsZSBiaWFzIG11eF9zdW0gYWJfZG90X3Byb2R1Y3QgY2RfZG90X3Byb2R1Y3Qgc3VtX291dHB1dCBhYl9vdXRwdXQgY2Rfb3V0cHV0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX09VVF9SR0IoZCkJCQkoMHgwMDAwMWU0MCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IHNjYWxlIGJpYXMgbXV4X3N1bSBhYl9kb3RfcHJvZHVjdCBjZF9kb3RfcHJvZHVjdCBzdW1fb3V0cHV0IGFiX291dHB1dCBjZF9vdXRwdXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfUE9TSVRJT05fWChkKQkJKDB4MDAwMDEwNWMgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9ZKGQpCQkoMHgwMDAwMTA2MCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1BPU0lUSU9OX1ooZCkJCSgweDAwMDAxMDY0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfSEFMRl9WRUNUT1JfWChkKQkJKDB4MDAwMDEwMjggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9IQUxGX1ZFQ1RPUl9ZKGQpCQkoMHgwMDAwMTAyYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0hBTEZfVkVDVE9SX1ooZCkJCSgweDAwMDAxMDMwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1goZCkJCSgweDAwMDAxMDM0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1koZCkJCSgweDAwMDAxMDM4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRElSRUNUSU9OX1ooZCkJCSgweDAwMDAxMDNjICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0FNQklFTlRfUihkKQkoMHgwMDAwMTAwMCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX0coZCkJKDB4MDAwMDEwMDQgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9CKGQpCSgweDAwMDAxMDA4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0RJRkZVU0VfUihkKQkoMHgwMDAwMTAwYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9ESUZGVVNFX0coZCkJKDB4MDAwMDEwMTAgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9CKGQpCSgweDAwMDAxMDE0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX1IoZCkJKDB4MDAwMDEwMTggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfU1BFQ1VMQVJfRyhkKQkoMHgwMDAwMTAxYyArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9TUEVDVUxBUl9CKGQpCSgweDAwMDAxMDIwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfQkFDS19TSURFX1BST0RVQ1RfQU1CSUVOVChkKQkoMHgwMDAwMGMwMCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0JBQ0tfU0lERV9QUk9EVUNUX0RJRkZVU0UoZCkJKDB4MDAwMDBjMGMgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9CQUNLX1NJREVfUFJPRFVDVF9TUEVDVUxBUihkKQkoMHgwMDAwMGMxOCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0NPTlNUQU5UX0FUVEVOVUFUSU9OKGQpCSgweDAwMDAxMDY4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfTElORUFSX0FUVEVOVUFUSU9OKGQpCSgweDAwMDAxMDZjICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfUVVBRFJBVElDX0FUVEVOVUFUSU9OKGQpCSgweDAwMDAxMDcwICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShkKQkJKDB4MDAwMDEwNDAgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0VYUE9ORU5UKGQpCQkoMHgwMDAwMTA0NCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfQ1VUT0ZGX0IoZCkJCSgweDAwMDAxMDQ4ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9ESVJfWChkKQkJKDB4MDAwMDEwNGMgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9ZKGQpCQkoMHgwMDAwMTA1MCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfRElSX1ooZCkJCSgweDAwMDAxMDU0ICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQyhkKQkJKDB4MDAwMDEwNTggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9CQUNLX01BVEVSSUFMX1NISU5JTkVTU19BCQkweDAwMDAxZTI4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JBQ0tfTUFURVJJQUxfU0hJTklORVNTX0IJCTB4MDAwMDFlMmMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQkFDS19NQVRFUklBTF9TSElOSU5FU1NfQwkJMHgwMDAwMWUzMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9CQUNLX01BVEVSSUFMX1NISU5JTkVTU19ECQkweDAwMDAxZTM0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JBQ0tfTUFURVJJQUxfU0hJTklORVNTX0UJCTB4MDAwMDFlMzgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQkFDS19NQVRFUklBTF9TSElOSU5FU1NfRgkJMHgwMDAwMWUzYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NUSVBQTEVfRU5BQkxFCQkweDAwMDAxNDdjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9QQVRURVJOKGQpCSgweDAwMDAxNDgwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU18zRl9YCQkJMHgwMDAwMTUwMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzNGX1kJCQkweDAwMDAxNTA0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfM0ZfWgkJCTB4MDAwMDE1MDgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180Rl9YCQkJMHgwMDAwMTUxOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzRGX1kJCQkweDAwMDAxNTFjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfNEZfWgkJCTB4MDAwMDE1MjAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180Rl9XCQkJMHgwMDAwMTUyNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzRJX1hZCQkJMHgwMDAwMTUyOAkvKiBQYXJhbWV0ZXJzOiB5IHggKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180SV9aVwkJCTB4MDAwMDE1MmMJLyogUGFyYW1ldGVyczogdyB6ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0ZfWAkJCTB4MDAwMDE1MzAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX05PUl8zRl9ZCQkJMHgwMDAwMTUzNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNGX1oJCQkweDAwMDAxNTM4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0lfWFkJCQkweDAwMDAxNTQwCS8qIFBhcmFtZXRlcnM6IHkgeCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNJX1oJCQkweDAwMDAxNTQ0CS8qIFBhcmFtZXRlcnM6IHogKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF80Rl9SCQkJMHgwMDAwMTU1MAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRGX0cJCQkweDAwMDAxNTU0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfNEZfQgkJCTB4MDAwMDE1NTgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF80Rl9BCQkJMHgwMDAwMTU1YwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzNGX1IJCQkweDAwMDAxNTYwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfM0ZfRwkJCTB4MDAwMDE1NjQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF8zRl9CCQkJMHgwMDAwMTU2OAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRJCQkJMHgwMDAwMTU2YwkvKiBQYXJhbWV0ZXJzOiBhIGIgZyByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0wyXzNGX1IJCQkweDAwMDAxNTgwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0wyXzNGX0cJCQkweDAwMDAxNTg0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0wyXzNGX0IJCQkweDAwMDAxNTg4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0wyXzNJCQkJMHgwMDAwMTU4YwkvKiBQYXJhbWV0ZXJzOiBhIGIgZyByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfMkZfUwkJCTB4MDAwMDE1OTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF8yRl9UCQkJMHgwMDAwMTU5NAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzJJCQkJMHgwMDAwMTU5OAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80Rl9TCQkJMHgwMDAwMTVhMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRGX1QJCQkweDAwMDAxNWE0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfNEZfUgkJCTB4MDAwMDE1YTgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80Rl9RCQkJMHgwMDAwMTVhYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRJX1NUCQkJMHgwMDAwMTViMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80SV9SUQkJCTB4MDAwMDE1YjQJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfMkZfUwkJCTB4MDAwMDE1YjgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV8yRl9UCQkJMHgwMDAwMTViYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzJJCQkJMHgwMDAwMTVjMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80Rl9TCQkJMHgwMDAwMTVjOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRGX1QJCQkweDAwMDAxNWNjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNEZfUgkJCTB4MDAwMDE1ZDAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80Rl9RCQkJMHgwMDAwMTVkNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRJX1NUCQkJMHgwMDAwMTVkOAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80SV9SUQkJCTB4MDAwMDE1ZGMJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfMkZfUwkJCTB4MDAwMDE1ZTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl8yRl9UCQkJMHgwMDAwMTVlNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzJJCQkJMHgwMDAwMTVlOAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80Rl9TCQkJMHgwMDAwMTVmMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzRGX1QJCQkweDAwMDAxNWY0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfNEZfUgkJCTB4MDAwMDE1ZjgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80Rl9RCQkJMHgwMDAwMTVmYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzRJX1NUCQkJMHgwMDAwMTYwMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80SV9SUQkJCTB4MDAwMDE2MDQJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfMkZfUwkJCTB4MDAwMDE2MDgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM18yRl9UCQkJMHgwMDAwMTYwYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzJJCQkJMHgwMDAwMTYxMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180Rl9TCQkJMHgwMDAwMTYyMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzRGX1QJCQkweDAwMDAxNjI0Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfNEZfUgkJCTB4MDAwMDE2MjgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180Rl9RCQkJMHgwMDAwMTYyYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzRJX1NUCQkJMHgwMDAwMTYzMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180SV9SUQkJCTB4MDAwMDE2MzQJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9GT0dfMUYJCQkweDAwMDAxNjk4Ci0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0VER0VfRkxBRwkJCQkweDAwMDAxNmJjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjBfUE9TCQkweDAwMDAxNzIwCS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFIxX1dHSAkJMHgwMDAwMTcyNAkvKiBQYXJhbWV0ZXJzOiBlbmFibGVkPyBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkJfUE9JTlRFUl9BVFRSMl9OT1IJCTB4MDAwMDE3MjgJLyogUGFyYW1ldGVyczogZW5hYmxlZD8gb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjNfQ09MCQkweDAwMDAxNzJjCS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFI0X0NPTDIJCTB4MDAwMDE3MzAJLyogUGFyYW1ldGVyczogZW5hYmxlZD8gb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjVfRk9HCQkweDAwMDAxNzM0CS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFI2CQkJMHgwMDAwMTczOAkvKiBQYXJhbWV0ZXJzOiBlbmFibGVkPyBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkJfUE9JTlRFUl9BVFRSNwkJCTB4MDAwMDE3M2MJLyogUGFyYW1ldGVyczogZW5hYmxlZD8gb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjhfVFgwCQkweDAwMDAxNzQwCS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFI5X1RYMQkJMHgwMDAwMTc0NAkvKiBQYXJhbWV0ZXJzOiBlbmFibGVkPyBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkJfUE9JTlRFUl9BVFRSMTBfVFgyCQkweDAwMDAxNzQ4CS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFIxMV9UWDMJCTB4MDAwMDE3NGMJLyogUGFyYW1ldGVyczogZW5hYmxlZD8gb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjEyX1RYNAkJMHgwMDAwMTc1MAkvKiBQYXJhbWV0ZXJzOiBlbmFibGVkPyBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkJfUE9JTlRFUl9BVFRSMTNfVFg1CQkweDAwMDAxNzU0CS8qIFBhcmFtZXRlcnM6IGVuYWJsZWQ/IG9mZnNldCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9QT0lOVEVSX0FUVFIxNF9UWDYJCTB4MDAwMDE3NTgJLyogUGFyYW1ldGVyczogZW5hYmxlZD8gb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZCX1BPSU5URVJfQVRUUjE1X1RYNwkJMHgwMDAwMTc1YwkvKiBQYXJhbWV0ZXJzOiBlbmFibGVkPyBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIoIGQpCQkJKDB4MDAwMDE3NjAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjBfUE9TCQkJMHgwMDAwMTc2MAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIxX1dHSAkJCTB4MDAwMDE3NjQJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMl9OT1IJCQkweDAwMDAxNzY4CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjNfQ09MCQkJMHgwMDAwMTc2YwkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFI0X0NPTDIJCQkweDAwMDAxNzcwCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjVfRk9HCQkJMHgwMDAwMTc3NAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFI2CQkJMHgwMDAwMTc3OAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFI3CQkJMHgwMDAwMTc3YwkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFI4X1RYMAkJCTB4MDAwMDE3ODAJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSOV9UWDEJCQkweDAwMDAxNzg0CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjEwX1RYMgkJCTB4MDAwMDE3ODgJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMTFfVFgzCQkJMHgwMDAwMTc4YwkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIxMl9UWDQJCQkweDAwMDAxNzkwCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjEzX1RYNQkJCTB4MDAwMDE3OTQJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMTRfVFg2CQkJMHgwMDAwMTc5OAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIxNV9UWDcJCQkweDAwMDAxNzljCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9CQUNLX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fUgkweDAwMDAxN2EwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0JBQ0tfU0lERV9QUk9EVUNUX0FNQklFTlRfUExVU19FTUlTU0lPTl9HCTB4MDAwMDE3YTQKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfTU9ERUxfQkFDS19TSURFX1BST0RVQ1RfQU1CSUVOVF9QTFVTX0VNSVNTSU9OX0IJMHgwMDAwMTdhOAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9CQUNLX0EJCTB4MDAwMDE3YWMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfQkFDS19SCQkweDAwMDAxN2IwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0JBQ0tfRwkJMHgwMDAwMTdiNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9CQUNLX0IJCTB4MDAwMDE3YjgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTE9HSUNfT1BfRU5BQkxFCQkweDAwMDAxN2JjCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX0xPR0lDX09QX09QCQkJMHgwMDAwMTdjMAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9UV09fU0lERV9FTkFCTEUJMHgwMDAwMTdjNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9CRUdJTl9FTkQJCQkJMHgwMDAwMTdmYwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TQ0lTU09SX1gyX1gxCQkJMHgwMDAwMWMzMAkvKiBQYXJhbWV0ZXJzOiB4MiB4MSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9TQ0lTU09SX1kyX1kxCQkJMHgwMDAwMWM1MAkvKiBQYXJhbWV0ZXJzOiB5MiB5MSAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9WQUxVRV9ERVBUSAkJCTB4MDAwMDFkOGMKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfVkFMVUVfQVJHQgkJCTB4MDAwMDFkOTAKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfV0hJQ0hfQlVGRkVSUwkJMHgwMDAwMWQ5NAkvKiBQYXJhbWV0ZXJzOiBjbGVhciBjb2xvciBhIGNsZWFyIGNvbG9yIGIgY2xlYXIgY29sb3IgZyBjbGVhciBjb2xvciByIGNsZWFyIGRlcHRoIGNsZWFyIHN0ZW5jaWwgKi8KLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfSU5ERVhfREFUQQkJCTB4MDAwMDE4MDAJLyogUGFyYW1ldGVyczogaW5kZXgxIGluZGV4MCAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WQl9WRVJURVhfQkFUQ0gJCQkweDAwMDAxODEwCS8qIFBhcmFtZXRlcnM6IGNvdW50X3ZlcnRpY2VzIG9mZnNldF92ZXJ0aWNlcyAqLwotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfREFUQQkJCTB4MDAwMDE4MTgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1JJR0lOX1gJCQkweDAwMDAxZjAwCi0jCWRlZmluZQkJTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX09SSUdJTl9ZCQkJMHgwMDAwMWYwNAotIwlkZWZpbmUJCU5WMjBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9PUklHSU5fWgkJCTB4MDAwMDFmMDgKLSMJZGVmaW5lCQlOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1JJR0lOX1cJCQkweDAwMDAxZjBjCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEIHVzZWQgb246IE5WMzAgTlY0MCBHNzAKLSovCi0jZGVmaW5lCQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNECQkJCQkweDAwMDAwMDk3Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1QwCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMQkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDIJCQkweDAwMDAwMTg4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1QzCQkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUNAkJCTB4MDAwMDAxOTQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDUJCQkweDAwMDAwMTk4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1Q2CQkJMHgwMDAwMDFhNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUNwkJCTB4MDAwMDAxYTgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDgJCQkweDAwMDAwMWFjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1Q5CQkJMHgwMDAwMDFiNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMTAJCQkweDAwMDAwMWI4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9WQl9TUkMwX09CSkVDVAkJMHgwMDAwMDE5YwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfVkJfU1JDMV9PQkpFQ1QJCTB4MDAwMDAxYTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQlVGRkVSMF9QSVRDSAkJCTB4MDAwMDAyMGMJLyogUGFyYW1ldGVyczogZGVwdGgvc3RlbmNpbCBidWZmZXIgcGl0Y2ggY29sb3IwIGJ1ZmZlciBwaXRjaCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUjBfT0ZGU0VUCQkJMHgwMDAwMDIxMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9PRkZTRVQJCQkweDAwMDAwMjE0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SMV9PRkZTRVQJCQkweDAwMDAwMjE4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUjFfUElUQ0gJCQkweDAwMDAwMjFjCS8qIFBhcmFtZXRlcnM6IGNvbG9yMSBidWZmZXIgcGl0Y2ggKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTE1BX0RFUFRIX0JVRkZFUl9QSVRDSAkJMHgwMDAwMDIyYwkvKiBQYXJhbWV0ZXJzOiBwaXRjaCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfQlVGRkVSX09GRlNFVAkJMHgwMDAwMDIzMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9UWF9NQVRSSVhfRU5BQkxFKGQpCQkoMHgwMDAwMDI0MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUjJfUElUQ0gJCQkweDAwMDAwMjgwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUjNfUElUQ0gJCQkweDAwMDAwMjg0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JVRkZFUjJfT0ZGU0VUCQkJMHgwMDAwMDI4OAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9CVUZGRVIzX09GRlNFVAkJCTB4MDAwMDAyOGMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfRElUSEVSX0VOQUJMRQkJCTB4MDAwMDAzMDAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19FTkFCTEUJCQkweDAwMDAwMzA0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfRlVOQwkJCTB4MDAwMDAzMDgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19SRUYJCQkweDAwMDAwMzBjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfRU5BQkxFCQkJMHgwMDAwMDMxMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9GVU5DX1NSQwkJCTB4MDAwMDAzMTQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19EU1QJCQkweDAwMDAwMzE4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SCQkJMHgwMDAwMDMxYwkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0VRVUFUSU9OCQkJMHgwMDAwMDMyMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLCQkJMHgwMDAwMDMyNAkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19FTkFCTEUJCTB4MDAwMDAzMjgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX01BU0sJCQkweDAwMDAwMzJjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19GVU5DX0ZVTkMJCTB4MDAwMDAzMzAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX0ZVTkNfUkVGCQkweDAwMDAwMzM0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19GVU5DX01BU0sJCTB4MDAwMDAzMzgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX09QX0ZBSUwJCTB4MDAwMDAzM2MKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX09QX1pGQUlMCQkweDAwMDAwMzQwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19PUF9aUEFTUwkJMHgwMDAwMDM0NAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0VOQUJMRQkJMHgwMDAwMDM0OAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX01BU0sJCTB4MDAwMDAzNGMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9GVU5DX0ZVTkMJCTB4MDAwMDAzNTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9GVU5DX1JFRgkJMHgwMDAwMDM1NAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfTUFTSwkJMHgwMDAwMDM1OAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX09QX0ZBSUwJCTB4MDAwMDAzNWMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9PUF9aRkFJTAkJMHgwMDAwMDM2MAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX09QX1pQQVNTCQkweDAwMDAwMzY0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NIQURFX01PREVMCQkJMHgwMDAwMDM2OAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfRU5BQkxFCQkJMHgwMDAwMDM2YwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfQ09MT1IJCQkJMHgwMDAwMDM3MAotIwlkZWZpbmUJCU5WNDBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLX0JVRkZFUjEyMwkJMHgwMDAwMDM3MAkvKiBQYXJhbWV0ZXJzOiBidWZmZXIzIGIgYnVmZmVyMyBnIGJ1ZmZlcjMgciBidWZmZXIzIGEgYnVmZmVyMiBiIGJ1ZmZlcjIgZyBidWZmZXIyIHIgYnVmZmVyMiBhIGJ1ZmZlcjEgYiBidWZmZXIxIGcgYnVmZmVyMSByIGJ1ZmZlcjEgYSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9OT1JNQUxJWkVfRU5BQkxFCQkJMHgwMDAwMDM3YwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9SQU5HRV9ORUFSCQkJMHgwMDAwMDM5NAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9SQU5HRV9GQVIJCQkweDAwMDAwMzk4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0ZST05UX1IJCTB4MDAwMDAzYTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfRlJPTlRfRwkJMHgwMDAwMDNhNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9GUk9OVF9CCQkweDAwMDAwM2E4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0ZST05UX0EJCTB4MDAwMDAzYjQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElORV9XSURUSF9TTU9PVEgJCQkweDAwMDAwM2I4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU01PT1RIX0VOQUJMRQkJMHgwMDAwMDNiYwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0VOQUJMRShkKQkJKDB4MDAwMDA0MDAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9NT0RFTFZJRVdfTUFUUklYKCBkKQkJKDB4MDAwMDA0ODAgKyBkICogMHgwMDA0KQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9JTlZFUlNFX01PREVMVklFV19NQVRSSVgoIGQpCSgweDAwMDAwNTgwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUFJPSkVDVElPTl9NQVRSSVgoIGQpCQkoMHgwMDAwMDY4MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX01BVFJJWCh4LHkpCQkJKDB4MDAwMDA2YzAgKyB5ICogMHgwMDEwICsgeCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfRlBfQUNUSVZFX1BST0dSQU0JCQkweDAwMDAwOGU0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19DT09SRF9ESVNUCQkJMHgwMDAwMDhjOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfTU9ERQkJCQkweDAwMDAwOGNjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FUVVBVElPTl9DT05TVEFOVAkJMHgwMDAwMDhkMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfRVFVQVRJT05fTElORUFSCQkweDAwMDAwOGQ0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FUVVBVElPTl9RVUFEUkFUSUMJCTB4MDAwMDA4ZDgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUkNfQ09MT1IwCQkJCTB4MDAwMDA4ZWMJLyogUGFyYW1ldGVyczogYSByIGcgYiAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19DT0xPUjEJCQkJMHgwMDAwMDhmMAkvKiBQYXJhbWV0ZXJzOiBhIHIgZyBiICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0ZJTkFMMAkJCQkweDAwMDAwOGY0CS8qIFBhcmFtZXRlcnM6IHZhcmFfbWFwcGluZyB2YXJhX2NvbXBvbmVudF91c2FnZSB2YXJhX2lucHV0IHZhcmJfbWFwcGluZyB2YXJiX2NvbXBvbmVudF91c2FnZSB2YXJiX2lucHV0IHZhcmNfbWFwcGluZyB2YXJjX2NvbXBvbmVudF91c2FnZSB2YXJjX2lucHV0IHZhcmRfbWFwcGluZyB2YXJkX2NvbXBvbmVudF91c2FnZSB2YXJkX2lucHV0ICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0ZJTkFMMQkJCQkweDAwMDAwOGY4CS8qIFBhcmFtZXRlcnM6IHZhcmVfbWFwcGluZyB2YXJlX2NvbXBvbmVudF91c2FnZSB2YXJlX2lucHV0IHZhcmZfbWFwcGluZyB2YXJmX2NvbXBvbmVudF91c2FnZSB2YXJmX2lucHV0IHZhcmdfbWFwcGluZyB2YXJnX2NvbXBvbmVudF91c2FnZSB2YXJnX2lucHV0IGNvbG9yX3N1bV9jbGFtcCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19FTkFCTEUJCQkJMHgwMDAwMDhmYwkvKiBQYXJhbWV0ZXJzOiBudW1iZXIgb2YgcmMgZW5hYmxlZCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19JTl9BTFBIQShkKQkJCSgweDAwMDAwOTAwICsgZCAqIDB4MDAyMCkJLyogUGFyYW1ldGVyczogdmFyYV9tYXBwaW5nIHZhcmFfY29tcG9uZW50X3VzYWdlIHZhcmFfaW5wdXQgdmFyYl9tYXBwaW5nIHZhcmJfY29tcG9uZW50X3VzYWdlIHZhcmJfaW5wdXQgdmFyY19tYXBwaW5nIHZhcmNfY29tcG9uZW50X3VzYWdlIHZhcmNfaW5wdXQgdmFyZF9tYXBwaW5nIHZhcmRfY29tcG9uZW50X3VzYWdlIHZhcmRfaW5wdXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUkNfSU5fUkdCKGQpCQkJKDB4MDAwMDA5MDQgKyBkICogMHgwMDIwKQkvKiBQYXJhbWV0ZXJzOiB2YXJhX21hcHBpbmcgdmFyYV9jb21wb25lbnRfdXNhZ2UgdmFyYV9pbnB1dCB2YXJiX21hcHBpbmcgdmFyYl9jb21wb25lbnRfdXNhZ2UgdmFyYl9pbnB1dCB2YXJjX21hcHBpbmcgdmFyY19jb21wb25lbnRfdXNhZ2UgdmFyY19pbnB1dCB2YXJkX21hcHBpbmcgdmFyZF9jb21wb25lbnRfdXNhZ2UgdmFyZF9pbnB1dCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19DT05TVEFOVF9DT0xPUjAoZCkJCSgweDAwMDAwOTA4ICsgZCAqIDB4MDAyMCkJLyogUGFyYW1ldGVyczogYSByIGcgYiAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19DT05TVEFOVF9DT0xPUjEoZCkJCSgweDAwMDAwOTBjICsgZCAqIDB4MDAyMCkJLyogUGFyYW1ldGVyczogYSByIGcgYiAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9SQ19PVVRfQUxQSEEoZCkJCQkoMHgwMDAwMDkxMCArIGQgKiAweDAwMjApCS8qIFBhcmFtZXRlcnM6IHNjYWxlIGJpYXMgbXV4X3N1bSBhYl9kb3RfcHJvZHVjdCBjZF9kb3RfcHJvZHVjdCBzdW1fb3V0cHV0IGFiX291dHB1dCBjZF9vdXRwdXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUkNfT1VUX1JHQihkKQkJCSgweDAwMDAwOTE0ICsgZCAqIDB4MDAyMCkJLyogUGFyYW1ldGVyczogc2NhbGUgYmlhcyBtdXhfc3VtIGFiX2RvdF9wcm9kdWN0IGNkX2RvdF9wcm9kdWN0IHN1bV9vdXRwdXQgYWJfb3V0cHV0IGNkX291dHB1dCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DT0xPUl9CVUZGRVJfRElNMAkweDAwMDAwMjAwCS8qIFBhcmFtZXRlcnM6IHdpZHRoIHhfb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NPTE9SX0JVRkZFUl9ESU0xCTB4MDAwMDAyMDQJLyogUGFyYW1ldGVyczogaGVpZ2h0IHlfb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NPTE9SX0JVRkZFUl9PRlMwCTB4MDAwMDAyYzAJLyogUGFyYW1ldGVyczogd2lkdGggeF9vZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ09MT1JfQlVGRkVSX09GUzEJMHgwMDAwMDJjNAkvKiBQYXJhbWV0ZXJzOiBoZWlnaHQgeV9vZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfRElNU18wCQkJMHgwMDAwMGEwMAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCB4X29mZnNldCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9ESU1TXzEJCQkweDAwMDAwYTA0CS8qIFBhcmFtZXRlcnM6IGhlaWdodCB5X29mZnNldCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9QTFVTX0VNSVNTSU9OX1IJMHgwMDAwMGExMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9QTFVTX0VNSVNTSU9OX0cJMHgwMDAwMGExNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9QTFVTX0VNSVNTSU9OX0IJMHgwMDAwMGExOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9TQ0lTU09SX1dJRFRIX1hQT1MJCTB4MDAwMDA4YzAJLyogUGFyYW1ldGVyczogd2lkdGggeF9vZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0NJU1NPUl9IRUlHSFRfWVBPUwkJMHgwMDAwMDhjNAkvKiBQYXJhbWV0ZXJzOiBoZWlnaHQgeV9vZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfU1BSSVRFCQkJMHgwMDAwMWVlOAkvKiBQYXJhbWV0ZXJzOiBjb29yZF9yZXBsYWNlIHJfbW9kZSBlbmFibGUgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfU0laRQkJCTB4MDAwMDFlZTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0EJCQkweDAwMDAxZWMwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9CCQkJMHgwMDAwMWVjNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfQwkJCTB4MDAwMDFlYzgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0QJCQkweDAwMDAxZWNjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9FCQkJMHgwMDAwMWVkMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJfRgkJCTB4MDAwMDFlZDQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9JTlRfUEFSQU1FVEVSX0cJCQkweDAwMDAxZWQ4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1BBUkFNRVRFUl9ICQkJMHgwMDAwMWVkYwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9QQVJBTUVURVJTX0VOQUJMRQkJMHgwMDAwMWVlNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9YRlJNX09YCQkJMHgwMDAwMGEyMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9YRlJNX09ZCQkJMHgwMDAwMGEyNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9YRlJNX05QRl9ESVYyCQkweDAwMDAwYTI4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1hGUk1fVU5LMF8weDAJCTB4MDAwMDBhMmMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfWEZSTV9QWF9ESVYyCQkweDAwMDAwYTMwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1hGUk1fUFlfRElWMgkJMHgwMDAwMGEzNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9YRlJNX0ZNTl9ESVYyCQkweDAwMDAwYTM4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1hGUk1fVU5LMV8weDAJCTB4MDAwMDBhM2MKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRklMTF9FTkFCTEUJMHgwMDAwMGE2MAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9MSU5FX0VOQUJMRQkweDAwMDAwYTY0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1BPSU5UX0VOQUJMRQkweDAwMDAwYTY4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX0ZVTkMJCQkweDAwMDAwYTZjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1dSSVRFX0VOQUJMRQkJMHgwMDAwMGE3MAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRQkJCTB4MDAwMDBhNzQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRkFDVE9SCQkweDAwMDAwYTc4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1VOSVRTCQkweDAwMDAwYTdjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9JTlNUMAkJCTB4MDAwMDBiODAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0lOU1QxCQkJMHgwMDAwMGI4NAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfSU5TVDIJCQkweDAwMDAwYjg4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9JTlNUMwkJCTB4MDAwMDBiOGMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfQkFDS19SCQkweDAwMDAxN2IwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BVEVSSUFMX0JBQ0tfRwkJMHgwMDAwMTdiNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVRFUklBTF9CQUNLX0IJCTB4MDAwMDE3YjgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFURVJJQUxfQkFDS19BCQkweDAwMDAxN2MwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX09DQ19RVUVSWV9PUl9DT0xPUl9CVUZGX0VOQUJMRQkweDAwMDAxN2M4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NUT1JFX1JFU1VMVAkJCTB4MDAwMDE4MDAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9BKGQpCQkJKDB4MDAwMDBlMDAgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0IoZCkJCQkoMHgwMDAwMGUwNCArIGQgKiAweDAwMTApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfQyhkKQkJCSgweDAwMDAwZTA4ICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9EKGQpCQkJKDB4MDAwMDBlMGMgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9SKGQpCSgweDAwMDAxMDAwICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0FNQklFTlRfRyhkKQkoMHgwMDAwMTAwNCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9BTUJJRU5UX0IoZCkJKDB4MDAwMDEwMDggKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9SKGQpCSgweDAwMDAxMDBjICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX0RJRkZVU0VfRyhkKQkoMHgwMDAwMTAxMCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9ESUZGVVNFX0IoZCkJKDB4MDAwMDEwMTQgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfU1BFQ1VMQVJfUihkKQkoMHgwMDAwMTAxOCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0ZST05UX1NJREVfUFJPRFVDVF9TUEVDVUxBUl9HKGQpCSgweDAwMDAxMDFjICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX0IoZCkJKDB4MDAwMDEwMjAgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9IQUxGX1ZFQ1RPUl9YKGQpCQkoMHgwMDAwMTAyOCArIGQgKiAweDAwODApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0hBTEZfVkVDVE9SX1koZCkJCSgweDAwMDAxMDJjICsgZCAqIDB4MDA4MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfSEFMRl9WRUNUT1JfWihkKQkJKDB4MDAwMDEwMzAgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9ESVJFQ1RJT05fWChkKQkJKDB4MDAwMDEwMzQgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9ESVJFQ1RJT05fWShkKQkJKDB4MDAwMDEwMzggKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9ESVJFQ1RJT05fWihkKQkJKDB4MDAwMDEwM2MgKyBkICogMHgwMDgwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9DT05TVEFOVF9BVFRFTlVBVElPTihkKQkoMHgwMDAwMTIyOCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0xJTkVBUl9BVFRFTlVBVElPTihkKQkoMHgwMDAwMTIyYyArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1FVQURSQVRJQ19BVFRFTlVBVElPTihkKQkoMHgwMDAwMTIzMCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfQ1VUT0ZGX0EoZCkJCSgweDAwMDAxMjAwICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9FWFBPTkVOVChkKQkJKDB4MDAwMDEyMDQgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0NVVE9GRl9CKGQpCQkoMHgwMDAwMTIwOCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfRElSX1goZCkJCSgweDAwMDAxMjBjICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9ESVJfWShkKQkJKDB4MDAwMDEyMTAgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9aKGQpCQkoMHgwMDAwMTIxNCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1NQT1RfQ1VUT0ZGX0MoZCkJCSgweDAwMDAxMjE4ICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfUE9TSVRJT05fWChkKQkJKDB4MDAwMDEyMWMgKyBkICogMHgwMDQwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9ZKGQpCQkoMHgwMDAwMTIyMCArIGQgKiAweDAwNDApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX1BPU0lUSU9OX1ooZCkJCSgweDAwMDAxMjI0ICsgZCAqIDB4MDA0MCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0EJMHgwMDAwMTQwMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfQgkweDAwMDAxNDA0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19DCTB4MDAwMDE0MDgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfTUFURVJJQUxfU0hJTklORVNTX0QJMHgwMDAwMTQwYwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9NQVRFUklBTF9TSElOSU5FU1NfRQkweDAwMDAxNDEwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX01BVEVSSUFMX1NISU5JTkVTU19GCTB4MDAwMDE0MTQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfRU5BQkxFRF9MSUdIVFMJCQkweDAwMDAxNDIwCS8qIFBhcmFtZXRlcnM6IGxpZ2h0IDcgbGlnaHQgNiBsaWdodCA1IGxpZ2h0IDQgbGlnaHQgMyBsaWdodCAyIGxpZ2h0IDEgbGlnaHQgMCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9VTksxRDZDX09GRlNFVAkJCTB4MDAwMDFkNmMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVU5LMUQ3MF9WQUxVRQkJCTB4MDAwMDFkNzAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElORV9TVElQUExFX0VOQUJMRQkJMHgwMDAwMWRiNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSU5FX1NUSVBQTEVfUEFUVEVSTgkJMHgwMDAwMWRiOAkvKiBQYXJhbWV0ZXJzOiBmYWN0b3IgcGF0dGVybiAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9CRUdJTl9FTkQJCQkJMHgwMDAwMTgwOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0UJCQkJMHgwMDAwMTgzMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9GQUNFCQkJMHgwMDAwMTgzNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NNT09USF9FTkFCTEUJCTB4MDAwMDE4MzgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFX0VOQUJMRQkJCTB4MDAwMDE4M2MKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfVkFMVUVfREVQVEgJCQkweDAwMDAxZDhjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX1ZBTFVFX0FSR0IJCQkweDAwMDAxZDkwCS8qIFBhcmFtZXRlcnM6IGEgciBnIGIgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfV0hJQ0hfQlVGRkVSUwkJMHgwMDAwMWQ5NAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9CQUNLX01BVEVSSUFMX1NISU5JTkVTU19BCQkweDAwMDAxZTIwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JBQ0tfTUFURVJJQUxfU0hJTklORVNTX0IJCTB4MDAwMDFlMjQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkFDS19NQVRFUklBTF9TSElOSU5FU1NfQwkJMHgwMDAwMWUyOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9CQUNLX01BVEVSSUFMX1NISU5JTkVTU19ECQkweDAwMDAxZTJjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0JBQ0tfTUFURVJJQUxfU0hJTklORVNTX0UJCTB4MDAwMDFlMzAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkFDS19NQVRFUklBTF9TSElOSU5FU1NfRgkJMHgwMDAwMWUzNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9ET19WRVJUSUNFUwkJCTB4MDAwMDFkYWMKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0ZST01fSUQJCQkweDAwMDAxZTljCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1BST0dSQU1fU1RBUlRfSUQJCTB4MDAwMDFlYTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0NPTlNUX0lECQkweDAwMDAxZWZjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMF9YCQkweDAwMDAxZjAwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMF9ZCQkweDAwMDAxZjA0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMF9aCQkweDAwMDAxZjA4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMF9XCQkweDAwMDAxZjBjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMV9YCQkweDAwMDAxZjEwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMV9ZCQkweDAwMDAxZjE0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMV9aCQkweDAwMDAxZjE4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMV9XCQkweDAwMDAxZjFjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMl9YCQkweDAwMDAxZjIwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMl9ZCQkweDAwMDAxZjI0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMl9aCQkweDAwMDAxZjI4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QMl9XCQkweDAwMDAxZjJjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QM19YCQkweDAwMDAxZjMwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QM19ZCQkweDAwMDAxZjM0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QM19aCQkweDAwMDAxZjM4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9QM19XCQkweDAwMDAxZjNjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZUWF9BVFRSXzNYKGQpCQkJKDB4MDAwMDE1MDAgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WVFhfQVRUUl8zWShkKQkJCSgweDAwMDAxNTA0ICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlRYX0FUVFJfM1ooZCkJCQkoMHgwMDAwMTUwOCArIGQgKiAweDAwMTApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZUWF9BVFRSXzNXKGQpCQkJKDB4MDAwMDE1MGMgKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WVFhfQVRUUl80WChkKQkJCSgweDAwMDAxYzAwICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlRYX0FUVFJfNFkoZCkJCQkoMHgwMDAwMWMwNCArIGQgKiAweDAwMTApCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZUWF9BVFRSXzRaKGQpCQkJKDB4MDAwMDFjMDggKyBkICogMHgwMDEwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WVFhfQVRUUl80VyhkKQkJCSgweDAwMDAxYzBjICsgZCAqIDB4MDAxMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkJfUE9JTlRFUl9BVFRSKGQpCQkoMHgwMDAwMTY4MCArIGQgKiAweDAwMDQpCS8qIFBhcmFtZXRlcnM6IHNvdXJjZTogb2Zmc2V0ICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0lfWFkJCQkweDAwMDAwYTkwCS8qIFBhcmFtZXRlcnM6IHkgeCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNJX1oJCQkweDAwMDAwYTk0CS8qIFBhcmFtZXRlcnM6IHogKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF8yRl9TCQkJMHgwMDAwMThjMAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzJGX1QJCQkweDAwMDAxOGM0Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfMkZfUwkJCTB4MDAwMDE4YzgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV8yRl9UCQkJMHgwMDAwMThjYwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzJGX1MJCQkweDAwMDAxOGQwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfMkZfVAkJCTB4MDAwMDE4ZDQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM18yRl9TCQkJMHgwMDAwMThkOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzJGX1QJCQkweDAwMDAxOGRjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfMkkJCQkweDAwMDAxOTIwCS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzJJCQkJMHgwMDAwMTkyNAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl8ySQkJCTB4MDAwMDE5MjgJLyogUGFyYW1ldGVyczogdCBzICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfMkkJCQkweDAwMDAxOTJjCS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRJCQkJMHgwMDAwMTk0YwkvKiBQYXJhbWV0ZXJzOiBhIGIgZyByICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0wyXzNJCQkJMHgwMDAwMTk1MAkvKiBQYXJhbWV0ZXJzOiBhIGIgZyByICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfNElfU1QJCQkweDAwMDAxOWMwCS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRJX1JRCQkJMHgwMDAwMTljNAkvKiBQYXJhbWV0ZXJzOiBxIHIgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80SV9TVAkJCTB4MDAwMDE5YzgJLyogUGFyYW1ldGVyczogdCBzICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNElfUlEJCQkweDAwMDAxOWNjCS8qIFBhcmFtZXRlcnM6IHEgciAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzRJX1NUCQkJMHgwMDAwMTlkMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80SV9SUQkJCTB4MDAwMDE5ZDQJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfNElfU1QJCQkweDAwMDAxOWQ4CS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzRJX1JRCQkJMHgwMDAwMTlkYwkvKiBQYXJhbWV0ZXJzOiBxIHIgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0ZPR18xRgkJCTB4MDAwMDFlNTQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1VOS18wCQkJMHgwMDAwMTcxOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUiggZCkJCQkoMHgwMDAwMTc0MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMF9QT1MJCQkweDAwMDAxNzQwCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjFfV0dICQkJMHgwMDAwMTc0NAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIyX05PUgkJCTB4MDAwMDE3NDgJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSM19DT0wJCQkweDAwMDAxNzRjCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjRfQ09MMgkJCTB4MDAwMDE3NTAJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSNV9GT0cJCQkweDAwMDAxNzU0CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjYJCQkweDAwMDAxNzU4CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjcJCQkweDAwMDAxNzVjCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjhfVFgwCQkJMHgwMDAwMTc2MAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFI5X1RYMQkJCTB4MDAwMDE3NjQJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMTBfVFgyCQkJMHgwMDAwMTc2OAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIxMV9UWDMJCQkweDAwMDAxNzZjCS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjEyX1RYNAkJCTB4MDAwMDE3NzAJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMTNfVFg1CQkJMHgwMDAwMTc3NAkvKiBQYXJhbWV0ZXJzOiBzdHJpZGUgZmllbGRzIHR5cGUgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIxNF9UWDYJCQkweDAwMDAxNzc4CS8qIFBhcmFtZXRlcnM6IHN0cmlkZSBmaWVsZHMgdHlwZSAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVRUUjE1X1RYNwkJCTB4MDAwMDE3N2MJLyogUGFyYW1ldGVyczogc3RyaWRlIGZpZWxkcyB0eXBlICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX01PREVMX0JBQ0tfU0lERV9QUk9EVUNUX0FNQklFTlRfUExVU19FTUlTU0lPTl9SCTB4MDAwMDE3YTAKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfTU9ERUxfQkFDS19TSURFX1BST0RVQ1RfQU1CSUVOVF9QTFVTX0VNSVNTSU9OX0cJMHgwMDAwMTdhNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9NT0RFTF9CQUNLX1NJREVfUFJPRFVDVF9BTUJJRU5UX1BMVVNfRU1JU1NJT05fQgkweDAwMDAxN2E4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZQX0FDVElWRV9QUk9HUkFNCQkJMHgwMDAwMDhlNAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9UWF9BRERSRVNTX1VOSVQoZCkJCSgweDAwMDAxYTAwICsgZCAqIDB4MDAyMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVFhfRk9STUFUX1VOSVQoZCkJCQkoMHgwMDAwMWEwNCArIGQgKiAweDAwMjApCS8qIFBhcmFtZXRlcnM6IG1pcG1hcCB0eXBlIGZvcm1hdCBuY29tcCBjdWJpYyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9UWF9XUkFQX1VOSVQoZCkJCQkoMHgwMDAwMWEwOCArIGQgKiAweDAwMjApCS8qIFBhcmFtZXRlcnM6IHdyYXBfcyB3cmFwX3Qgd3JhcF9yICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX0VOQUJMRV9VTklUKGQpCQkJKDB4MDAwMDFhMGMgKyBkICogMHgwMDIwKQkvKiBQYXJhbWV0ZXJzOiBudjQwX2VuYWJsZSBudjMwX2VuYWJsZSBhbmlzb3Ryb3B5ICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX1NXSVpaTEVfVU5JVChkKQkJKDB4MDAwMDFhMTAgKyBkICogMHgwMDIwKQotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9UWF9GSUxURVJfVU5JVChkKQkJCSgweDAwMDAxYTE0ICsgZCAqIDB4MDAyMCkJLyogUGFyYW1ldGVyczogZmlsdGVyX21pbiBmaWx0ZXJfbWFnICovCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX1hZX0RJTV9VTklUKGQpCQkJKDB4MDAwMDFhMTggKyBkICogMHgwMDIwKQkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVFhfVU5LMDdfVU5JVChkKQkJCSgweDAwMDAxYTFjICsgZCAqIDB4MDAyMCkKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVFhfREVQVEhfVU5JVChkKQkJCSgweDAwMDAxODQwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogZGVwdGggTlBPVCBwaXRjaCAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WQl9WRVJURVhfQkFUQ0gJCQkweDAwMDAxODE0CS8qIFBhcmFtZXRlcnM6IGNvdW50X3ZlcnRpY2VzIG9mZnNldF92ZXJ0aWNlcyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WQl9FTEVNRU5UX1UxNgkJCTB4MDAwMDE4MGMJLyogUGFyYW1ldGVyczogMTogMDogKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkJfRUxFTUVOVF9VMzIJCQkweDAwMDAxODEwCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9EQVRBCQkJMHgwMDAwMTgxOAotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9MT0dJQ19PUF9FTkFCTEUJCTB4MDAwMDAzNzQKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTE9HSUNfT1BfT1AJCQkweDAwMDAwMzc4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9ESVNQTEFZX0xJU1RfTUVNX09GRlNFVAkweDAwMDAxODFjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0VYRUNVVEVfRElTUExBWV9MSVNUCQkweDAwMDAxODI0CS8qIFBhcmFtZXRlcnM6IGxlbmd0aCBzdGFydCBvZmZzZXQgKi8KLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9NT0RFX0ZST05UCQkweDAwMDAxODI4Ci0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9CQUNLCQkJMHgwMDAwMTgyYwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NUSVBQTEVfRU5BQkxFCQkweDAwMDAxNDdjCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9QQVRURVJOKCBkKQkoMHgwMDAwMTQ4MCArIGQgKiAweDAwMDQpCi0jCWRlZmluZQkJTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9DTElQUElOR19QTEFORVMJCTB4MDAwMDE0NzgKLSMJZGVmaW5lCQlOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfSU5fUkVHCQkJCTB4MDAwMDFmZjAJLyogUGFyYW1ldGVyczogdmVydGV4IHBvcyB3ZWlnaHQgbm9ybWFsIHByaW1hcnkgY29sb3Igc2Vjb25kYXJ5IGNvbG9yIGZvZ2Nvb3JkIHRleHR1cmUgY29vcmRzIDAgdGV4dHVyZSBjY29yZHMgMSB0ZXh0dXJlIGNvb3JkcyAyIHRleHR1cmUgY29vcmRzIDMgdGV4dHVyZSBjb29yZHMgNCB0ZXh0dXJlIGNvb3JkcyA1IHRleHR1cmUgY29vcmRzIDYgdGV4dHVyZSBjb29yZHMgNyAqLwotIwlkZWZpbmUJCU5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHCQkJMHgwMDAwMWZmNAkvKiBQYXJhbWV0ZXJzOiBwcmltYXJ5IGNvbG9yIHNlY29uZGFyeSBjb2xvciBiYWNrZmFjZSBwcmltYXJ5IGNvbG9yIGJhY2tmYWNlIHNlY29uZGFyeSBjb2xvciBmb2djb29yZCBwb2ludHNpemUgY2xpcCBwbGFuZSAwIGNsaXAgcGxhbmUgMSBjbGlwIHBsYW5lIDIgY2xpcCBwbGFuZSAzIGNsaXAgcGxhbmUgNCBjbGlwIHBsYW5lIDUgdGV4dHVyZSBjb29yZHMgMCB0ZXh0dXJlIGNvb3JkcyAxIHRleHR1cmUgY29vcmRzIDIgdGV4dHVyZSBjb29yZHMgMyB0ZXh0dXJlIGNvb3JkcyA0IHRleHR1cmUgY29vcmRzIDUgdGV4dHVyZSBjb29yZHMgNiB0ZXh0dXJlIGNvb3JkcyA3ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlYzMF9DTEVBUl9CVUZGRVIgdXNlZCBvbjogTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVjMwX0NMRUFSX0JVRkZFUgkJCQkJMHgwMDAwMDA2NgotIwlkZWZpbmUJCU5WMzBfQ0xFQVJfQlVGRkVSX1NFVF9ETUFfTk9USUZZCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU5WMzBfQ0xFQVJfQlVGRkVSX1NFVF9JTUFHRV9QQVRURVJOCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU5WMzBfQ0xFQVJfQlVGRkVSX1NFVF9SQVNURVJfT1AJCQkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU5WMzBfQ0xFQVJfQlVGRkVSX1NFVF9DT05URVhUX1NVUkZBQ0VfMkQJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOVjMwX0NMRUFSX0JVRkZFUl9VTkswMDJmYwkJCQkweDAwMDAwMmZjCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEIHVzZWQgb246IAotKi8KLSNkZWZpbmUJCQlOVjUwX1RDTF9QUklNSVRJVkVfM0QJCQkJCTB4MDAwMDAwOTcKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVF8wKCBkKQkJCSgweDAwMDAwMTgwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVF8xKCBkKQkJCSgweDAwMDAwMWMwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0ZPR18xRgkJCTB4MDAwMDAzMTQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU18yRl9YCQkJMHgwMDAwMDM4MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzJGX1kJCQkweDAwMDAwMzg0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfMkZfUwkJCTB4MDAwMDAzYzAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF8yRl9UCQkJMHgwMDAwMDNjNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzJGX1MJCQkweDAwMDAwM2M4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfMkZfVAkJCTB4MDAwMDAzY2MKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl8yRl9TCQkJMHgwMDAwMDNkMAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzJGX1QJCQkweDAwMDAwM2Q0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfMkZfUwkJCTB4MDAwMDAzZDgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM18yRl9UCQkJMHgwMDAwMDNkYwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzNGX1gJCQkweDAwMDAwNDAwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfM0ZfWQkJCTB4MDAwMDA0MDQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU18zRl9aCQkJMHgwMDAwMDQwOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNGX1gJCQkweDAwMDAwNDIwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0ZfWQkJCTB4MDAwMDA0MjQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX05PUl8zRl9aCQkJMHgwMDAwMDQyOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzNGX1IJCQkweDAwMDAwNDMwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfM0ZfRwkJCTB4MDAwMDA0MzQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF8zRl9CCQkJMHgwMDAwMDQzOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MMl8zRl9SCQkJMHgwMDAwMDQ0MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MMl8zRl9HCQkJMHgwMDAwMDQ0NAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MMl8zRl9CCQkJMHgwMDAwMDQ0OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzRGX1gJCQkweDAwMDAwNTAwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfNEZfWQkJCTB4MDAwMDA1MDQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180Rl9aCQkJMHgwMDAwMDUwOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfUE9TXzRGX1cJCQkweDAwMDAwNTBjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfNEZfUgkJCTB4MDAwMDA1MzAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF80Rl9HCQkJMHgwMDAwMDUzNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MXzRGX0IJCQkweDAwMDAwNTM4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9DT0xfNEZfQQkJCTB4MDAwMDA1M2MKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80Rl9TCQkJMHgwMDAwMDU4MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRGX1QJCQkweDAwMDAwNTg0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDBfNEZfUgkJCTB4MDAwMDA1ODgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80Rl9RCQkJMHgwMDAwMDU4YwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRGX1MJCQkweDAwMDAwNTkwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNEZfVAkJCTB4MDAwMDA1OTQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV80Rl9SCQkJMHgwMDAwMDU5OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRGX1EJCQkweDAwMDAwNTljCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfNEZfUwkJCTB4MDAwMDA1YTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80Rl9UCQkJMHgwMDAwMDVhNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgyXzRGX1IJCQkweDAwMDAwNWE4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfNEZfUQkJCTB4MDAwMDA1YWMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180Rl9TCQkJMHgwMDAwMDViMAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzRGX1QJCQkweDAwMDAwNWI0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDNfNEZfUgkJCTB4MDAwMDA1YjgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180Rl9RCQkJMHgwMDAwMDViYwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzJJCQkJMHgwMDAwMDZhMAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMV8ySQkJCTB4MDAwMDA2YTQJLyogUGFyYW1ldGVyczogdCBzICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfMkkJCQkweDAwMDAwNmE4CS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzJJCQkJMHgwMDAwMDZhYwkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1BPU180SV9YWQkJCTB4MDAwMDA3MDAJLyogUGFyYW1ldGVyczogeSB4ICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9QT1NfNElfWlcJCQkweDAwMDAwNzA0CS8qIFBhcmFtZXRlcnM6IHcgeiAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgwXzRJX1NUCQkJMHgwMDAwMDc0MAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMF80SV9SUQkJCTB4MDAwMDA3NDQJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDFfNElfU1QJCQkweDAwMDAwNzQ4CS8qIFBhcmFtZXRlcnM6IHQgcyAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgxXzRJX1JRCQkJMHgwMDAwMDc0YwkvKiBQYXJhbWV0ZXJzOiBxIHIgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYMl80SV9TVAkJCTB4MDAwMDA3NTAJLyogUGFyYW1ldGVyczogdCBzICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9UWDJfNElfUlEJCQkweDAwMDAwNzU0CS8qIFBhcmFtZXRlcnM6IHEgciAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVFgzXzRJX1NUCQkJMHgwMDAwMDc1OAkvKiBQYXJhbWV0ZXJzOiB0IHMgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1RYM180SV9SUQkJCTB4MDAwMDA3NWMJLyogUGFyYW1ldGVyczogcSByICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9OT1JfM0lfWFkJCQkweDAwMDAwNzkwCS8qIFBhcmFtZXRlcnM6IHkgeCAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfTk9SXzNJX1oJCQkweDAwMDAwNzk0CS8qIFBhcmFtZXRlcnM6IHogKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0NPTF80SQkJCTB4MDAwMDA4OGMJLyogUGFyYW1ldGVyczogYSBiIGcgciAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQ09MMl8zSQkJCTB4MDAwMDA4OTAJLyogUGFyYW1ldGVyczogYSBiIGcgciAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9VTkswX1gJCQkweDAwMDAwYTAwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1VOSzBfWQkJCTB4MDAwMDBhMDQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfVU5LMF9aCQkJMHgwMDAwMGEwOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9VTksxX1gJCQkweDAwMDAwYTBjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1VOSzFfWQkJCTB4MDAwMDBhMTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfVU5LMV9aCQkJMHgwMDAwMGExNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9SQU5HRV9ORUFSCQkJMHgwMDAwMGMwOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9SQU5HRV9GQVIJCQkweDAwMDAwYzBjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfSE9SSVooZCkJCSgweDAwMDAwZDAwICsgZCAqIDB4MDAwOCkJLyogUGFyYW1ldGVyczogeDIgeDEgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ0xJUF9WRVJUKGQpCQkoMHgwMDAwMGQwNCArIGQgKiAweDAwMDgpCS8qIFBhcmFtZXRlcnM6IHkyIHkxICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9CVUZGRVJfRklSU1QJCTB4MDAwMDBkNzQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0JVRkZFUl9DT1VOVAkJMHgwMDAwMGQ3OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9DT0xPUl9SCQkJMHgwMDAwMGQ4MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9DT0xPUl9HCQkJMHgwMDAwMGQ4NAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9DT0xPUl9CCQkJMHgwMDAwMGQ4OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9DT0xPUl9BCQkJMHgwMDAwMGQ4YwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9ERVBUSAkJCTB4MDAwMDBkOTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfU1RFTkNJTAkJCTB4MDAwMDBkYTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9NT0RFX0ZST05UCQkweDAwMDAwZGFjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9CQUNLCQkJMHgwMDAwMGRiMAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NNT09USF9FTkFCTEUJCTB4MDAwMDBkYjQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfUE9JTlRfRU5BQkxFCTB4MDAwMDBkYzAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfTElORV9FTkFCTEUJMHgwMDAwMGRjNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9GSUxMX0VOQUJMRQkweDAwMDAwZGM4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NDSVNTT1JfV0lEVEhfWFBPUwkJMHgwMDAwMGUwNAkvKiBQYXJhbWV0ZXJzOiB3IHggKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU0NJU1NPUl9IRUlHSFRfWVBPUwkJMHgwMDAwMGUwOAkvKiBQYXJhbWV0ZXJzOiBoIHkgKi8KLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0NPTlNUX0lECQkweDAwMDAwZjAwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9YCQkJMHgwMDAwMGYwNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfQ09OU1RfWQkJCTB4MDAwMDBmMDgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0NPTlNUX1oJCQkweDAwMDAwZjBjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9XCQkJMHgwMDAwMGYxMAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfUkVGCQkweDAwMDAwZjU0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlJPTlRfTUFTSwkJMHgwMDAwMGY1OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfTUFTSwkJMHgwMDAwMGY1YwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRQkJCTB4MDAwMDEyY2MKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU0hBREVfTU9ERUwJCQkweDAwMDAxMmQ0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1dSSVRFX0VOQUJMRQkJMHgwMDAwMTJlOAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0VOQUJMRQkJCTB4MDAwMDEyZWMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfRlVOQwkJCTB4MDAwMDEzMGMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19SRUYJCQkweDAwMDAxMzEwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfRlVOQwkJCTB4MDAwMDEzMTQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfQ09MT1JfUgkJCTB4MDAwMDEzMWMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfQ09MT1JfRwkJCTB4MDAwMDEzMjAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfQ09MT1JfQgkJCTB4MDAwMDEzMjQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfQ09MT1JfQQkJCTB4MDAwMDEzMjgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRVFVQVRJT05fUkdCCQkweDAwMDAxMzQwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfU1JDX1JHQgkJMHgwMDAwMTM0NAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9GVU5DX0RTVF9SR0IJCTB4MDAwMDEzNDgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRVFVQVRJT05fQUxQSEEJCTB4MDAwMDEzNGMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19TUkNfQUxQSEEJCTB4MDAwMDEzNTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19EU1RfQUxQSEEJCTB4MDAwMDEzNTgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX0VOQUJMRQkJMHgwMDAwMTM4MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfT1BfRkFJTAkJMHgwMDAwMTM4NAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfT1BfWkZBSUwJCTB4MDAwMDEzODgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX09QX1pQQVNTCQkweDAwMDAxMzhjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19GVU5DX0ZVTkMJCTB4MDAwMDEzOTAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX0ZVTkNfUkVGCQkweDAwMDAxMzk0Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19NQVNLCQkJMHgwMDAwMTM5OAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfRlVOQ19NQVNLCQkweDAwMDAxMzljCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfV0lEVEgJCQkweDAwMDAxM2IwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1NJWkUJCQkweDAwMDAxNTE4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUgkJMHgwMDAwMTU2YwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9MSU5FX1NNT09USF9FTkFCTEUJCTB4MDAwMDE1NzAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9FTkFCTEUJCTB4MDAwMDE1OTQKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9PUF9GQUlMCQkweDAwMDAxNTk4Ci0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlJPTlRfT1BfWkZBSUwJCTB4MDAwMDE1OWMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9PUF9aUEFTUwkJMHgwMDAwMTVhMAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfRlVOQwkJMHgwMDAwMTVhNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9VTklUUwkJMHgwMDAwMTViYwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQkVHSU4JCQkweDAwMDAxNWRjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9FTkQJCQkweDAwMDAxNWUwCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9EQVRBCQkJMHgwMDAwMTY0MAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9MSU5FX1NUSVBQTEVfRU5BQkxFCQkweDAwMDAxNjZjCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU1RJUFBMRV9QQVRURVJOCQkweDAwMDAxNjgwCS8qIFBhcmFtZXRlcnM6IHBhdHRlcm4gZmFjdG9yICovCi0jCWRlZmluZQkJTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9FTkFCTEUJCTB4MDAwMDE2OGMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9TVElQUExFX1BBVFRFUk4oIGQpCSgweDAwMDAxNzAwICsgZCAqIDB4MDAwNCkKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFX0VOQUJMRQkJCTB4MDAwMDE5MTgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfRkFDRQkJCTB4MDAwMDE5MWMKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFCQkJCTB4MDAwMDE5MjAKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfTE9HSUNfT1BfRU5BQkxFCQkJMHgwMDAwMTljNAotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9MT0dJQ19PUF9PUAkJCTB4MDAwMDE5YzgKLSMJZGVmaW5lCQlOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfQlVGRkVSUwkJCTB4MDAwMDE5ZDAJLyogUGFyYW1ldGVyczogY29sb3Igc3RlbmNpbCBkZXB0aCAqLwotIwlkZWZpbmUJCU5WNTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLKCBkKQkJCSgweDAwMDAxYTAwICsgZCAqIDB4MDAwNCkJLyogUGFyYW1ldGVyczogYSBiIGcgciAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE5WX0RNQV9GUk9NX01FTU9SWSB1c2VkIG9uOiBOVjAzIE5WMDQgTlYxMCBOVjE1IE5WMjAgTlYzMCBOVjQwIEc3MAotKi8KLSNkZWZpbmUJCQlOVl9ETUFfRlJPTV9NRU1PUlkJCQkJCTB4MDAwMDAwMDIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVl9ETUFfVE9fTUVNT1JZIHVzZWQgb246IE5WMDMgTlYwNCBOVjEwIE5WMTUgTlYyMCBOVjMwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WX0RNQV9UT19NRU1PUlkJCQkJCTB4MDAwMDAwMDMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOVl9ETUFfSU5fTUVNT1JZIHVzZWQgb246IE5WMDMgTlYwNCBOVjEwIE5WMTUgTlYyMCBOVjMwIE5WNDAgRzcwCi0qLwotI2RlZmluZQkJCU5WX0RNQV9JTl9NRU1PUlkJCQkJCTB4MDAwMDAwM2QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOdlR5cGUwMDQ2IHVzZWQgb246IE5WMDQgCi0qLwotI2RlZmluZQkJCU52VHlwZTAwNDYJCQkJCQkweDAwMDAwMDQ2Ci0jCWRlZmluZQkJTnZUeXBlMDA0Nl9ETUFfTk9USUZZCQkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTnZUeXBlMDA0Nl9ETUFfTUVNXzEJCQkJCTB4MDAwMDAxODQKLSMJZGVmaW5lCQlOdlR5cGUwMDQ2X0RNQV9NRU1fMgkJCQkJMHgwMDAwMDE4OAotIwlkZWZpbmUJCU52VHlwZTAwNDZfRE1BXzMJCQkJCTB4MDAwMDAxOGMKLSMJZGVmaW5lCQlOdlR5cGUwMDQ2X0RNQV80CQkJCQkweDAwMDAwMTkwCi0jCWRlZmluZQkJTnZUeXBlMDA0Nl9PQkpfNQkJCQkJMHgwMDAwMDE5NAotIwlkZWZpbmUJCU52VHlwZTAwNDZfT0JKXzYJCQkJCTB4MDAwMDAxOTgKLSMJZGVmaW5lCQlOdlR5cGUwMDQ2X1BJVENIMQkJCQkJMHgwMDAwMDMwNAotIwlkZWZpbmUJCU52VHlwZTAwNDZfUElUQ0gyCQkJCQkweDAwMDAwMzBjCi0jCWRlZmluZQkJTnZUeXBlMDA0Nl9TSVpFCQkJCQkJMHgwMDAwMDM0MAkvKiBQYXJhbWV0ZXJzOiB3aWR0aCBoZWlnaHQgKi8KLSMJZGVmaW5lCQlOdlR5cGUwMDQ2X1dJRFRICQkJCQkweDAwMDAwMzQ0CS8qIFBhcmFtZXRlcnM6IHZpc2libGVfd2lkdGggYmxhbmtfd2lkdGggKi8KLSMJZGVmaW5lCQlOdlR5cGUwMDQ2X0hTWU5DCQkJCQkweDAwMDAwMzQ4CS8qIFBhcmFtZXRlcnM6IGhzeW5jX3N0YXJ0IGhzeW5jX2xlbiAqLwotIwlkZWZpbmUJCU52VHlwZTAwNDZfSEVJR0hUCQkJCQkweDAwMDAwMzRjCS8qIFBhcmFtZXRlcnM6IHZpc2libGVfaGVpZ2h0IGJsYW5rX2hlaWdodCAqLwotIwlkZWZpbmUJCU52VHlwZTAwNDZfVlNZTkMJCQkJCTB4MDAwMDAzNTAJLyogUGFyYW1ldGVyczogdnN5bmNfc3RhcnQgdnN5bmNfbGVuICovCi0jCWRlZmluZQkJTnZUeXBlMDA0Nl9GVUxMX1NJWkUJCQkJCTB4MDAwMDAzNTQJLyogUGFyYW1ldGVyczogZnVsbF93aWR0aCBmdWxsX2hlaWdodCAqLwotIwlkZWZpbmUJCU52VHlwZTAwNDZfUElYRUxfQ0xLCQkJCQkweDAwMDAwMzU4Ci0jCWRlZmluZQkJTnZUeXBlMDA0Nl9GTEFHUwkJCQkJMHgwMDAwMDM1YwkvKiBQYXJhbWV0ZXJzOiBkb3VibGVzY2FuIC1oc3luYyAtdnN5bmMgZGVwdGggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLU9iamVjdCBOdlR5cGUwMDQ3IHVzZWQgb246IE5WMDQgCi0qLwotI2RlZmluZQkJCU52VHlwZTAwNDcJCQkJCQkweDAwMDAwMDQ3Ci0jCWRlZmluZQkJTnZUeXBlMDA0N19ETUFfTk9USUZZCQkJCQkweDAwMDAwMTgwCi0jCWRlZmluZQkJTnZUeXBlMDA0N19VTksxOUMJCQkJCTB4MDAwMDAxOWMKLSMJZGVmaW5lCQlOdlR5cGUwMDQ3X1VOSzFBMAkJCQkJMHgwMDAwMDFhMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotT2JqZWN0IE52VHlwZTAwNDkgdXNlZCBvbjogTlYwNCAKLSovCi0jZGVmaW5lCQkJTnZUeXBlMDA0OQkJCQkJCTB4MDAwMDAwNDkKLSMJZGVmaW5lCQlOdlR5cGUwMDQ5X0RNQV9OT1RJRlkJCQkJCTB4MDAwMDAxODAKLSMJZGVmaW5lCQlOdlR5cGUwMDQ5X0RNQV9NRU1fMQkJCQkJMHgwMDAwMDE4NAotIwlkZWZpbmUJCU52VHlwZTAwNDlfRE1BX01FTV8yCQkJCQkweDAwMDAwMTg4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi1PYmplY3QgTnZUeXBlMDA0RCB1c2VkIG9uOiBOVjA0IAotKi8KLSNkZWZpbmUJCQlOdlR5cGUwMDRECQkJCQkJMHgwMDAwMDA0ZAotIwlkZWZpbmUJCU52VHlwZTAwNERfRE1BX05PVElGWQkJCQkJMHgwMDAwMDE4MAotIwlkZWZpbmUJCU52VHlwZTAwNERfRE1BX01FTV8xCQkJCQkweDAwMDAwMTg0Ci0jCWRlZmluZQkJTnZUeXBlMDA0RF9ETUFfTUVNXzIJCQkJCTB4MDAwMDAxODgKLSMJZGVmaW5lCQlOdlR5cGUwMDREX0RNQV9NRU1fMwkJCQkJMHgwMDAwMDE4YwotIwlkZWZpbmUJCU52VHlwZTAwNERfRE1BX01FTV80CQkJCQkweDAwMDAwMTkwCi0KLSNlbmRpZiAvKiBfTk9VVkVBVV9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlci5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgzN2M1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zaGFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbiBTa2VnZ3MuCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotLyoKLSAqIEF1dGhvcnM6Ci0gKiAgIEJlbiBTa2VnZ3MgPGRhcmt0YW1hQGlpbmV0Lm5ldC5hdT4KLSAqLwotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotI2luY2x1ZGUgImV4dGVuc2lvbnMuaCIKLQotI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCi0jaW5jbHVkZSAic2hhZGVyL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKLS8qI2luY2x1ZGUgInNoYWRlci9hcmJwcm9ncGFyc2UuaCIqLwotI2luY2x1ZGUgInRubC90bmwuaCIKLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc2hhZGVyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWVzYSBlbnRyeSBwb2ludHMKLSAqLwotc3RhdGljIHZvaWQKLW5vdXZlYXVCaW5kUHJvZ3JhbShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCi17Ci0gICBOVlNEQkcoInRhcmdldD0lcywgcHJvZz0lcFxuIiwgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwgcHJvZyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCi1ub3V2ZWF1TmV3UHJvZ3JhbShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQotewotICAgbm91dmVhdVNoYWRlciAqbnZzOwotCi0gICBOVlNEQkcoInRhcmdldD0lcywgaWQ9JWRcbiIsIF9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKHRhcmdldCksIGlkKTsKLQotICAgbnZzID0gQ0FMTE9DX1NUUlVDVChfbm91dmVhdVNoYWRlcik7Ci0gICBOVlNEQkcoInByb2c9JXBcbiIsIG52cyk7Ci0gICBzd2l0Y2ggKHRhcmdldCkgewotICAgY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6Ci0gICAgICByZXR1cm4gX21lc2FfaW5pdF92ZXJ0ZXhfcHJvZ3JhbShjdHgsICZudnMtPm1lc2EudnAsIHRhcmdldCwgaWQpOwotICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjoKLSAgICAgIHJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LCAmbnZzLT5tZXNhLmZwLCB0YXJnZXQsIGlkKTsKLSAgIGRlZmF1bHQ6Ci0gICAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIlVuc3VwcG9ydGVkIHNoYWRlciB0YXJnZXQiKTsKLSAgICAgIGJyZWFrOwotICAgfQotCi0gICBGUkVFKG52cyk7Ci0gICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVEZWxldGVQcm9ncmFtKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKLXsKLSAgIG5vdXZlYXVTaGFkZXIgKm52cyA9IChub3V2ZWF1U2hhZGVyICopcHJvZzsKLQotICAgTlZTREJHKCJwcm9nPSVwXG4iLCBwcm9nKTsKLQotICAgaWYgKG52cy0+dHJhbnNsYXRlZCkKLSAgICAgIEZSRUUobnZzLT5wcm9ncmFtKTsKLSAgIF9tZXNhX2RlbGV0ZV9wcm9ncmFtKGN0eCwgcHJvZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1UHJvZ3JhbVN0cmluZ05vdGlmeShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKLSAgICAgIAkJCSAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQotewotICAgbm91dmVhdVNoYWRlciAqbnZzID0gKG5vdXZlYXVTaGFkZXIgKilwcm9nOwotCi0gICBOVlNEQkcoInRhcmdldD0lcywgcHJvZz0lcFxuIiwgX21lc2FfbG9va3VwX2VudW1fYnlfbnIodGFyZ2V0KSwgcHJvZyk7Ci0KLSAgIGlmIChudnMtPnRyYW5zbGF0ZWQpCi0gICAgICBGUkVFKG52cy0+cHJvZ3JhbSk7Ci0KLSAgIG52cy0+ZXJyb3IgICAgICA9IEdMX0ZBTFNFOwotICAgbnZzLT50cmFuc2xhdGVkID0gR0xfRkFMU0U7Ci0KLSAgIF90bmxfcHJvZ3JhbV9zdHJpbmcoY3R4LCB0YXJnZXQsIHByb2cpOwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1ub3V2ZWF1SXNQcm9ncmFtTmF0aXZlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCi17Ci0gICBub3V2ZWF1U2hhZGVyICpudnMgPSAobm91dmVhdVNoYWRlciAqKXByb2c7Ci0KLSAgIE5WU0RCRygidGFyZ2V0PSVzLCBwcm9nPSVwXG4iLCBfbWVzYV9sb29rdXBfZW51bV9ieV9ucih0YXJnZXQpLCBwcm9nKTsKLQotICAgcmV0dXJuIG52cy0+dHJhbnNsYXRlZDsKLX0KLQotR0xib29sZWFuCi1udnNVcGRhdGVTaGFkZXIoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cykKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGxpc3Q7Ci0gICBpbnQgaTsKLQotICAgTlZTREJHKCJwcm9nPSVwXG4iLCBudnMpOwotCi0gICAvKiBUcmFuc2xhdGUgdG8gSFcgZm9ybWF0IG5vdyBpZiBuZWNlc3NhcnkgKi8KLSAgIGlmICghbnZzLT50cmFuc2xhdGVkKSB7Ci0gICAgICAvKiBNZXNhIEFTTSBzaGFkZXIgLT4gbm91dmVhdVNoYWRlciAqLwotICAgICAgaWYgKCFub3V2ZWF1X3NoYWRlcl9wYXNzMChjdHgsIG52cykpCi0JIHJldHVybiBHTF9GQUxTRTsKLSAgICAgIC8qIEJhc2ljIGRlYWQgY29kZSBlbGltaW5hdGlvbiArIHJlZ2lzdGVyIHVzYWdlIGluZm8gKi8KLSAgICAgIGlmICghbm91dmVhdV9zaGFkZXJfcGFzczEobnZzKSkKLQkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgLyogbm91dmVhdVNoYWRlciAtPiBIVyBieXRlY29kZSwgSFcgcmVnaXN0ZXIgYWxsb2MgKi8KLSAgICAgIGlmICghbm91dmVhdV9zaGFkZXJfcGFzczIobnZzKSkKLQkgcmV0dXJuIEdMX0ZBTFNFOwotICAgICAgYXNzZXJ0KG52cy0+dHJhbnNsYXRlZCk7Ci0gICAgICBhc3NlcnQobnZzLT5wcm9ncmFtKTsKLSAgIH0KLSAgIAotICAgLyogVXBkYXRlIHN0YXRlIHBhcmFtZXRlcnMgKi8KLSAgIHBsaXN0ID0gbnZzLT5tZXNhLnZwLkJhc2UuUGFyYW1ldGVyczsKLSAgIF9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhjdHgsIHBsaXN0KTsKLSAgIGZvciAoaT0wOyBpPG52cy0+cGFyYW1faGlnaDsgaSsrKSB7Ci0gICAgICBpZiAoIW52cy0+cGFyYW1zW2ldLmluX3VzZSkKLQkgY29udGludWU7Ci0KLSAgICAgIGlmICghbnZzLT5vbl9oYXJkd2FyZSkgewotCSAvKiBpZiB3ZSd2ZSBiZWVuIGtpY2tlZCBvZmYgdGhlIGhhcmR3YXJlIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIG91cgotCSAgKiBjb25zdHMgYXJlIHN0aWxsIHRoZXJlLi4gcmV1cGxvYWQgdGhlbSBhbGwKLQkgICovCi0JIG52cy0+ZnVuYy0+VXBkYXRlQ29uc3QoY3R4LCBudnMsIGkpOwotICAgICAgfSBlbHNlIGlmIChudnMtPnBhcmFtc1tpXS5zb3VyY2VfdmFsKSB7Ci0JIC8qIHVwZGF0ZSBhbnkgY2hhbmdlZCBzdGF0ZSBwYXJhbWV0ZXJzICovCi0JIGlmICghVEVTVF9FUV80VihudnMtPnBhcmFtc1tpXS52YWwsIG52cy0+cGFyYW1zW2ldLnNvdXJjZV92YWwpKQotCSAgICBudnMtPmZ1bmMtPlVwZGF0ZUNvbnN0KGN0eCwgbnZzLCBpKTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogVXBsb2FkIHByb2dyYW0gdG8gaGFyZHdhcmUsIHRoaXMgbXVzdCBjb21lIGFmdGVyIHN0YXRlIHBhcmFtIHVwZGF0ZQotICAgICogYXMgPj1OVjMwIGZyYWdwcm9ncyBpbmxpbmUgY29uc3RzIGludG8gdGhlIGJ5dGVjb2RlLgotICAgICovCi0gICBpZiAoIW52cy0+b25faGFyZHdhcmUpIHsKLSAgICAgIG5vdXZlYXVTaGFkZXIgKipjdXJyZW50OwotCi0gICAgICBpZiAobnZzLT5tZXNhLnZwLkJhc2UuVGFyZ2V0ID09IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQikKLQkgY3VycmVudCA9ICZubWVzYS0+Y3VycmVudF92ZXJ0cHJvZzsKLSAgICAgIGVsc2UKLQkgY3VycmVudCA9ICZubWVzYS0+Y3VycmVudF9mcmFncHJvZzsKLSAgICAgIGlmICgqY3VycmVudCkgKCpjdXJyZW50KS0+b25faGFyZHdhcmUgPSAwOwotCi0gICAgICBudnMtPmZ1bmMtPlVwbG9hZFRvSFcoY3R4LCBudnMpOwotICAgICAgbnZzLT5vbl9oYXJkd2FyZSA9IDE7Ci0KLSAgICAgICpjdXJyZW50ID0gbnZzOwotICAgfQotCi0gICByZXR1cm4gR0xfVFJVRTsKLX0KLQotbm91dmVhdVNoYWRlciAqCi1udnNCdWlsZFRleHRTaGFkZXIoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0gICBub3V2ZWF1U2hhZGVyICpudnM7Ci0KLSAgIG52cyA9IENBTExPQ19TVFJVQ1QoX25vdXZlYXVTaGFkZXIpOwotICAgaWYgKCFudnMpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgaWYgKHRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpIHsKLSAgICAgIF9tZXNhX2luaXRfdmVydGV4X3Byb2dyYW0oY3R4LCAmbnZzLT5tZXNhLnZwLCBHTF9WRVJURVhfUFJPR1JBTV9BUkIsIDApOwotICAgICAgX21lc2FfcGFyc2VfYXJiX3ZlcnRleF9wcm9ncmFtKGN0eCwKLQkgICAgCQkJICAgICBHTF9WRVJURVhfUFJPR1JBTV9BUkIsCi0JCQkJICAgICB0ZXh0LAotCQkJCSAgICAgc3RybGVuKHRleHQpLAotCQkJCSAgICAgJm52cy0+bWVzYS52cCk7Ci0gICB9IGVsc2UgaWYgKHRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQikgewotICAgICAgX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKGN0eCwgJm52cy0+bWVzYS5mcCwgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIsIDApOwotICAgICAgX21lc2FfcGFyc2VfYXJiX2ZyYWdtZW50X3Byb2dyYW0oY3R4LAotCSAgICAJCQkgICAgICAgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIsCi0JCQkJICAgICAgIHRleHQsCi0JCQkJICAgICAgIHN0cmxlbih0ZXh0KSwKLQkJCQkgICAgICAgJm52cy0+bWVzYS5mcCk7Ci0gICB9Ci0KLSAgIG5vdXZlYXVfc2hhZGVyX3Bhc3MwKGN0eCwgbnZzKTsKLSAgIG5vdXZlYXVfc2hhZGVyX3Bhc3MxKG52cyk7Ci0gICBub3V2ZWF1X3NoYWRlcl9wYXNzMihudnMpOwotCi0gICByZXR1cm4gbnZzOwotfQotCi1zdGF0aWMgdm9pZAotbnZzQnVpbGRQYXNzdGhyb3VnaFZQKEdMY29udGV4dCAqY3R4KQotewotICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotICAgY29uc3QgY2hhciAqdnBfdGV4dCA9Ci0gICAgICAiISFBUkJ2cDEuMFxuIgotICAgICAgIk9QVElPTiBBUkJfcG9zaXRpb25faW52YXJpYW50OyIKLSAgICAgICIiCi0gICAgICAiTU9WIHJlc3VsdC5jb2xvciwgdmVydGV4LmNvbG9yO1xuIgotICAgICAgIk1PViByZXN1bHQudGV4Y29vcmRbMF0sIHZlcnRleC50ZXhjb29yZFswXTtcbiIKLSAgICAgICJNT1YgcmVzdWx0LnRleGNvb3JkWzFdLCB2ZXJ0ZXgudGV4Y29vcmRbMV07XG4iCi0gICAgICAiTU9WIHJlc3VsdC50ZXhjb29yZFsyXSwgdmVydGV4LnRleGNvb3JkWzJdO1xuIgotICAgICAgIk1PViByZXN1bHQudGV4Y29vcmRbM10sIHZlcnRleC50ZXhjb29yZFszXTtcbiIKLSAgICAgICJNT1YgcmVzdWx0LnRleGNvb3JkWzRdLCB2ZXJ0ZXgudGV4Y29vcmRbNF07XG4iCi0gICAgICAiTU9WIHJlc3VsdC50ZXhjb29yZFs1XSwgdmVydGV4LnRleGNvb3JkWzVdO1xuIgotICAgICAgIk1PViByZXN1bHQudGV4Y29vcmRbNl0sIHZlcnRleC50ZXhjb29yZFs2XTtcbiIKLSAgICAgICJNT1YgcmVzdWx0LnRleGNvb3JkWzddLCB2ZXJ0ZXgudGV4Y29vcmRbN107XG4iCi0gICAgICAiRU5EIjsKLQotICAgbm1lc2EtPnBhc3N0aHJvdWdoX3ZwID0gbnZzQnVpbGRUZXh0U2hhZGVyKGN0eCwKLQkgCQkJCSAgICAgIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwKLQkJCQkJICAgICAgdnBfdGV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udnNCdWlsZFBhc3N0aHJvdWdoRlAoR0xjb250ZXh0ICpjdHgpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWNvbnN0IGNoYXIgKmZwX3RleHQgPQotCQkiISFBUkJmcDEuMFxuIgotCQkiTU9WIHJlc3VsdC5jb2xvciwgZnJhZ21lbnQuY29sb3I7XG4iCi0JCSJFTkQiOwotCi0Jbm1lc2EtPnBhc3N0aHJvdWdoX2ZwID0gbnZzQnVpbGRUZXh0U2hhZGVyKGN0eCwKLQkJCQkJCSAgIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCLAotCQkJCQkJICAgZnBfdGV4dCk7Ci19Ci0KLXZvaWQKLW5vdXZlYXVTaGFkZXJJbml0RnVuY3MoR0xjb250ZXh0ICogY3R4KQotewotICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotICAgc3dpdGNoIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlKSB7Ci0gICBjYXNlIE5WXzIwOgotICAgICAgTlYyMFZQSW5pdFNoYWRlckZ1bmNzKCZubWVzYS0+VlBmdW5jKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVl8zMDoKLSAgICAgIE5WMzBWUEluaXRTaGFkZXJGdW5jcygmbm1lc2EtPlZQZnVuYyk7Ci0gICAgICBOVjMwRlBJbml0U2hhZGVyRnVuY3MoJm5tZXNhLT5GUGZ1bmMpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIE5WXzQwOgotICAgY2FzZSBOVl80NDoKLSAgICAgIE5WNDBWUEluaXRTaGFkZXJGdW5jcygmbm1lc2EtPlZQZnVuYyk7Ci0gICAgICBOVjQwRlBJbml0U2hhZGVyRnVuY3MoJm5tZXNhLT5GUGZ1bmMpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIE5WXzUwOgotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgLyogQnVpbGQgYSB2ZXJ0ZXggcHJvZ3JhbSB0aGF0IHNpbXBseSBwYXNzZXMgdGhyb3VnaCBhbGwgYXR0cmlicy4KLSAgICAqIE5lZWRlZCB0byBkbyBzd3RjbCBvbiBudjQwCi0gICAgKi8KLSAgIGlmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlID49IE5WXzQwKQotICAgICAgbnZzQnVpbGRQYXNzdGhyb3VnaFZQKGN0eCk7Ci0KLSAgIC8qIE5lZWRlZCBvbiBOVjMwLCBldmVuIHdoZW4gdXNpbmcgc3d0Y2wsIGlmIHlvdSB3YW50IHRvIGdldCBjb2xvdXJzICovCi0gICBpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl8zMCkKLSAgICAgIG52c0J1aWxkUGFzc3Rocm91Z2hGUChjdHgpOwotCi0gICBjdHgtPkNvbnN0LlZlcnRleFByb2dyYW0uTWF4TmF0aXZlSW5zdHJ1Y3Rpb25zICAgID0gbm1lc2EtPlZQZnVuYy5NYXhJbnN0OwotICAgY3R4LT5Db25zdC5WZXJ0ZXhQcm9ncmFtLk1heE5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IG5tZXNhLT5WUGZ1bmMuTWF4SW5zdDsKLSAgIGN0eC0+Q29uc3QuVmVydGV4UHJvZ3JhbS5NYXhOYXRpdmVUZXhJbnN0cnVjdGlvbnMgPSBubWVzYS0+VlBmdW5jLk1heEluc3Q7Ci0gICBjdHgtPkNvbnN0LlZlcnRleFByb2dyYW0uTWF4TmF0aXZlVGV4SW5kaXJlY3Rpb25zID0KLSAgICAgIGN0eC0+Q29uc3QuVmVydGV4UHJvZ3JhbS5NYXhOYXRpdmVUZXhJbnN0cnVjdGlvbnM7Ci0gICBjdHgtPkNvbnN0LlZlcnRleFByb2dyYW0uTWF4TmF0aXZlQXR0cmlicyAgICAgICAgID0gbm1lc2EtPlZQZnVuYy5NYXhBdHRyaWI7Ci0gICBjdHgtPkNvbnN0LlZlcnRleFByb2dyYW0uTWF4TmF0aXZlVGVtcHMgICAgICAgICAgID0gbm1lc2EtPlZQZnVuYy5NYXhUZW1wOwotICAgY3R4LT5Db25zdC5WZXJ0ZXhQcm9ncmFtLk1heE5hdGl2ZUFkZHJlc3NSZWdzICAgICA9IG5tZXNhLT5WUGZ1bmMuTWF4QWRkcmVzczsKLSAgIGN0eC0+Q29uc3QuVmVydGV4UHJvZ3JhbS5NYXhOYXRpdmVQYXJhbWV0ZXJzICAgICAgPSBubWVzYS0+VlBmdW5jLk1heENvbnN0OwotCi0gICBpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl8zMCkgewotICAgICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlSW5zdHJ1Y3Rpb25zICAgID0gbm1lc2EtPkZQZnVuYy5NYXhJbnN0OwotICAgICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlQWx1SW5zdHJ1Y3Rpb25zID0gbm1lc2EtPkZQZnVuYy5NYXhJbnN0OwotICAgICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zID0gbm1lc2EtPkZQZnVuYy5NYXhJbnN0OwotICAgICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlVGV4SW5kaXJlY3Rpb25zID0KLQkgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zOwotICAgICAgY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4TmF0aXZlQXR0cmlicyAgICAgICAgID0gbm1lc2EtPkZQZnVuYy5NYXhBdHRyaWI7Ci0gICAgICBjdHgtPkNvbnN0LkZyYWdtZW50UHJvZ3JhbS5NYXhOYXRpdmVUZW1wcyAgICAgICAgICAgPSBubWVzYS0+RlBmdW5jLk1heFRlbXA7Ci0gICAgICBjdHgtPkNvbnN0LkZyYWdtZW50UHJvZ3JhbS5NYXhOYXRpdmVBZGRyZXNzUmVncyAgICAgPSBubWVzYS0+RlBmdW5jLk1heEFkZHJlc3M7Ci0gICAgICBjdHgtPkNvbnN0LkZyYWdtZW50UHJvZ3JhbS5NYXhOYXRpdmVQYXJhbWV0ZXJzICAgICAgPSBubWVzYS0+RlBmdW5jLk1heENvbnN0OwotICAgfQotCi0gICBjdHgtPkRyaXZlci5OZXdQcm9ncmFtCQk9IG5vdXZlYXVOZXdQcm9ncmFtOwotICAgY3R4LT5Ecml2ZXIuQmluZFByb2dyYW0JCT0gbm91dmVhdUJpbmRQcm9ncmFtOwotICAgY3R4LT5Ecml2ZXIuRGVsZXRlUHJvZ3JhbQkJPSBub3V2ZWF1RGVsZXRlUHJvZ3JhbTsKLSAgIGN0eC0+RHJpdmVyLlByb2dyYW1TdHJpbmdOb3RpZnkJPSBub3V2ZWF1UHJvZ3JhbVN0cmluZ05vdGlmeTsKLSAgIGN0eC0+RHJpdmVyLklzUHJvZ3JhbU5hdGl2ZQkJPSBub3V2ZWF1SXNQcm9ncmFtTmF0aXZlOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGlzYXNzZW1ibHkgc3VwcG9ydCBzdHJ1Y3RzCi0gKi8KLSNkZWZpbmUgQ0hFQ0tfUkFOR0UoaWR4LCBhcnIpICgoaWR4KTxzaXplb2YoXyMjYXJyKS9zaXplb2YoY29uc3QgY2hhciAqKSkgXAotCT8gXyMjYXJyWyhpZHgpXSA6ICNhcnIiX09PQiIKLQotI2RlZmluZSBOT0RTICAgICAgKDE8PDApCi0jZGVmaW5lIEJSQU5DSF9UUiAoMTw8MSkKLSNkZWZpbmUgQlJBTkNIX0VMICgxPDwyKQotI2RlZmluZSBCUkFOQ0hfRU4gKDE8PDMpCi0jZGVmaW5lIEJSQU5DSF9SRSAoMTw8NCkKLSNkZWZpbmUgQlJBTkNIX0FMTCAoQlJBTkNIX1RSfEJSQU5DSF9FTHxCUkFOQ0hfRU4pCi0jZGVmaW5lIENPVU5UX0lOQyAoMTw8NCkKLSNkZWZpbmUgQ09VTlRfSU5EICgxPDw1KQotI2RlZmluZSBDT1VOVF9OVU0gKDE8PDYpCi0jZGVmaW5lIENPVU5UX0FMTCAoQ09VTlRfSU5DfENPVU5UX0lORHxDT1VOVF9OVU0pCi0jZGVmaW5lIFRJX1VOSVQgICAoMTw8NykKLXN0cnVjdCBfb3Bjb2RlX2luZm8KLXsKLSAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICBpbnQgbnVtc3JjOwotICAgaW50IGZsYWdzOwotfTsKLQotc3RhdGljIHN0cnVjdCBfb3Bjb2RlX2luZm8gb3BzW10gPSB7Ci0gICBbTlZTX09QX0FCU10gPSB7IkFCUyIsIDEsIDB9LAotICAgW05WU19PUF9BRERdID0geyJBREQiLCAyLCAwfSwKLSAgIFtOVlNfT1BfQVJBXSA9IHsiQVJBIiwgMSwgMH0sCi0gICBbTlZTX09QX0FSTF0gPSB7IkFSTCIsIDEsIDB9LAotICAgW05WU19PUF9BUlJdID0geyJBUlIiLCAxLCAwfSwKLSAgIFtOVlNfT1BfQlJBXSA9IHsiQlJBIiwgMCwgTk9EUyB8IEJSQU5DSF9UUn0sCi0gICBbTlZTX09QX0JSS10gPSB7IkJSSyIsIDAsIE5PRFN9LAotICAgW05WU19PUF9DQUxdID0geyJDQUwiLCAwLCBOT0RTIHwgQlJBTkNIX1RSfSwKLSAgIFtOVlNfT1BfQ01QXSA9IHsiQ01QIiwgMiwgMH0sCi0gICBbTlZTX09QX0NPU10gPSB7IkNPUyIsIDEsIDB9LAotICAgW05WU19PUF9ESVZdID0geyJESVYiLCAyLCAwfSwKLSAgIFtOVlNfT1BfRERYXSA9IHsiRERYIiwgMSwgMH0sCi0gICBbTlZTX09QX0REWV0gPSB7IkREWSIsIDEsIDB9LAotICAgW05WU19PUF9EUDJdID0geyJEUDIiLCAyLCAwfSwKLSAgIFtOVlNfT1BfRFAyQV0gPSB7IkRQMkEiLCAzLCAwfSwKLSAgIFtOVlNfT1BfRFAzXSA9IHsiRFAzIiwgMiwgMH0sCi0gICBbTlZTX09QX0RQNF0gPSB7IkRQNCIsIDIsIDB9LAotICAgW05WU19PUF9EUEhdID0geyJEUEgiLCAyLCAwfSwKLSAgIFtOVlNfT1BfRFNUXSA9IHsiRFNUIiwgMiwgMH0sCi0gICBbTlZTX09QX0VYMl0gPSB7IkVYMiIsIDEsIDB9LAotICAgW05WU19PUF9FWFBdID0geyJFWFAiLCAxLCAwfSwKLSAgIFtOVlNfT1BfRkxSXSA9IHsiRkxSIiwgMSwgMH0sCi0gICBbTlZTX09QX0ZSQ10gPSB7IkZSQyIsIDEsIDB9LAotICAgW05WU19PUF9JRl0gPSB7IklGIiwgMCwgTk9EUyB8IEJSQU5DSF9FTCB8IEJSQU5DSF9FTn0sCi0gICBbTlZTX09QX0tJTF0gPSB7IktJTCIsIDEsIDB9LAotICAgW05WU19PUF9MRzJdID0geyJMRzIiLCAxLCAwfSwKLSAgIFtOVlNfT1BfTElUXSA9IHsiTElUIiwgMSwgMH0sCi0gICBbTlZTX09QX0xPR10gPSB7IkxPRyIsIDEsIDB9LAotICAgW05WU19PUF9MT09QXSA9IHsiTE9PUCIsIDAsIE5PRFMgfCBDT1VOVF9BTEwgfCBCUkFOQ0hfRU59LAotICAgW05WU19PUF9MUlBdID0geyJMUlAiLCAzLCAwfSwKLSAgIFtOVlNfT1BfTUFEXSA9IHsiTUFEIiwgMywgMH0sCi0gICBbTlZTX09QX01BWF0gPSB7Ik1BWCIsIDIsIDB9LAotICAgW05WU19PUF9NSU5dID0geyJNSU4iLCAyLCAwfSwKLSAgIFtOVlNfT1BfTU9WXSA9IHsiTU9WIiwgMSwgMH0sCi0gICBbTlZTX09QX01VTF0gPSB7Ik1VTCIsIDIsIDB9LAotICAgW05WU19PUF9OUk1dID0geyJOUk0iLCAxLCAwfSwKLSAgIFtOVlNfT1BfUEsySF0gPSB7IlBLMkgiLCAxLCAwfSwKLSAgIFtOVlNfT1BfUEsyVVNdID0geyJQSzJVUyIsIDEsIDB9LAotICAgW05WU19PUF9QSzRCXSA9IHsiUEs0QiIsIDEsIDB9LAotICAgW05WU19PUF9QSzRVQl0gPSB7IlBLNFVCIiwgMSwgMH0sCi0gICBbTlZTX09QX1BPV10gPSB7IlBPVyIsIDIsIDB9LAotICAgW05WU19PUF9QT1BBXSA9IHsiUE9QQSIsIDAsIDB9LAotICAgW05WU19PUF9QVVNIQV0gPSB7IlBVU0hBIiwgMSwgTk9EU30sCi0gICBbTlZTX09QX1JDQ10gPSB7IlJDQyIsIDEsIDB9LAotICAgW05WU19PUF9SQ1BdID0geyJSQ1AiLCAxLCAwfSwKLSAgIFtOVlNfT1BfUkVQXSA9IHsiUkVQIiwgMCwgTk9EUyB8IEJSQU5DSF9FTiB8IENPVU5UX05VTX0sCi0gICBbTlZTX09QX1JFVF0gPSB7IlJFVCIsIDAsIE5PRFN9LAotICAgW05WU19PUF9SRkxdID0geyJSRkwiLCAxLCAwfSwKLSAgIFtOVlNfT1BfUlNRXSA9IHsiUlNRIiwgMSwgMH0sCi0gICBbTlZTX09QX1NDU10gPSB7IlNDUyIsIDEsIDB9LAotICAgW05WU19PUF9TRVFdID0geyJTRVEiLCAyLCAwfSwKLSAgIFtOVlNfT1BfU0ZMXSA9IHsiU0ZMIiwgMiwgMH0sCi0gICBbTlZTX09QX1NHRV0gPSB7IlNHRSIsIDIsIDB9LAotICAgW05WU19PUF9TR1RdID0geyJTR1QiLCAyLCAwfSwKLSAgIFtOVlNfT1BfU0lOXSA9IHsiU0lOIiwgMSwgMH0sCi0gICBbTlZTX09QX1NMRV0gPSB7IlNMRSIsIDIsIDB9LAotICAgW05WU19PUF9TTFRdID0geyJTTFQiLCAyLCAwfSwKLSAgIFtOVlNfT1BfU05FXSA9IHsiU05FIiwgMiwgMH0sCi0gICBbTlZTX09QX1NTR10gPSB7IlNTRyIsIDEsIDB9LAotICAgW05WU19PUF9TVFJdID0geyJTVFIiLCAyLCAwfSwKLSAgIFtOVlNfT1BfU1VCXSA9IHsiU1VCIiwgMiwgMH0sCi0gICBbTlZTX09QX1RFWF0gPSB7IlRFWCIsIDEsIFRJX1VOSVR9LAotICAgW05WU19PUF9UWEJdID0geyJUWEIiLCAxLCBUSV9VTklUfSwKLSAgIFtOVlNfT1BfVFhEXSA9IHsiVFhEIiwgMywgVElfVU5JVH0sCi0gICBbTlZTX09QX1RYTF0gPSB7IlRYTCIsIDEsIFRJX1VOSVR9LAotICAgW05WU19PUF9UWFBdID0geyJUWFAiLCAxLCBUSV9VTklUfSwKLSAgIFtOVlNfT1BfVVAySF0gPSB7IlVQMkgiLCAxLCAwfSwKLSAgIFtOVlNfT1BfVVAyVVNdID0geyJVUDJVUyIsIDEsIDB9LAotICAgW05WU19PUF9VUDRCXSA9IHsiVVA0QiIsIDEsIDB9LAotICAgW05WU19PUF9VUDRVQl0gPSB7IlVQNFVCIiwgMSwgMH0sCi0gICBbTlZTX09QX1gyRF0gPSB7IlgyRCIsIDMsIDB9LAotICAgW05WU19PUF9YUERdID0geyJYUEQiLCAyLCAwfSwKLSAgIFtOVlNfT1BfTk9QXSA9IHsiTk9QIiwgMCwgTk9EU30sCi19OwotCi1zdGF0aWMgc3RydWN0IF9vcGNvZGVfaW5mbyAqCi1fZ2V0X29wX2luZm8oaW50IG9wKQotewotICAgaWYgKG9wID49IChzaXplb2Yob3BzKSAvIHNpemVvZihzdHJ1Y3QgX29wY29kZV9pbmZvKSkpCi0gICAgICByZXR1cm4gTlVMTDsKLSAgIGlmIChvcHNbb3BdLm5hbWUgPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotICAgcmV0dXJuICZvcHNbb3BdOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqX1NGUl9TVFJJTkdbXSA9IHsKLSAgIFtOVlNfRlJfUE9TSVRJT05dID0gInBvc2l0aW9uIiwKLSAgIFtOVlNfRlJfV0VJR0hUXSA9ICJ3ZWlnaHQiLAotICAgW05WU19GUl9OT1JNQUxdID0gIm5vcm1hbCIsCi0gICBbTlZTX0ZSX0NPTDBdID0gImNvbG9yIiwKLSAgIFtOVlNfRlJfQ09MMV0gPSAiY29sb3Iuc2Vjb25kYXJ5IiwKLSAgIFtOVlNfRlJfQkZDMF0gPSAiYmZjIiwKLSAgIFtOVlNfRlJfQkZDMV0gPSAiYmZjLnNlY29uZGFyeSIsCi0gICBbTlZTX0ZSX0ZPR0NPT1JEXSA9ICJmb2djb29yZCIsCi0gICBbTlZTX0ZSX1BPSU5UU1pdID0gInBvaW50c2l6ZSIsCi0gICBbTlZTX0ZSX1RFWENPT1JEMF0gPSAidGV4Y29vcmRbMF0iLAotICAgW05WU19GUl9URVhDT09SRDFdID0gInRleGNvb3JkWzFdIiwKLSAgIFtOVlNfRlJfVEVYQ09PUkQyXSA9ICJ0ZXhjb29yZFsyXSIsCi0gICBbTlZTX0ZSX1RFWENPT1JEM10gPSAidGV4Y29vcmRbM10iLAotICAgW05WU19GUl9URVhDT09SRDRdID0gInRleGNvb3JkWzRdIiwKLSAgIFtOVlNfRlJfVEVYQ09PUkQ1XSA9ICJ0ZXhjb29yZFs1XSIsCi0gICBbTlZTX0ZSX1RFWENPT1JENl0gPSAidGV4Y29vcmRbNl0iLAotICAgW05WU19GUl9URVhDT09SRDddID0gInRleGNvb3JkWzddIiwKLSAgIFtOVlNfRlJfRlJBR0RBVEEwXSA9ICJkYXRhWzBdIiwKLSAgIFtOVlNfRlJfRlJBR0RBVEExXSA9ICJkYXRhWzFdIiwKLSAgIFtOVlNfRlJfRlJBR0RBVEEyXSA9ICJkYXRhWzJdIiwKLSAgIFtOVlNfRlJfRlJBR0RBVEEzXSA9ICJkYXRhWzNdIiwKLSAgIFtOVlNfRlJfQ0xJUDBdID0gImNsaXBfcGxhbmVbMF0iLAotICAgW05WU19GUl9DTElQMV0gPSAiY2xpcF9wbGFuZVsxXSIsCi0gICBbTlZTX0ZSX0NMSVAyXSA9ICJjbGlwX3BsYW5lWzJdIiwKLSAgIFtOVlNfRlJfQ0xJUDNdID0gImNsaXBfcGxhbmVbM10iLAotICAgW05WU19GUl9DTElQNF0gPSAiY2xpcF9wbGFuZVs0XSIsCi0gICBbTlZTX0ZSX0NMSVA1XSA9ICJjbGlwX3BsYW5lWzVdIiwKLSAgIFtOVlNfRlJfQ0xJUDZdID0gImNsaXBfcGxhbmVbNl0iLAotICAgW05WU19GUl9GQUNJTkddID0gImZhY2luZyIsCi19OwotCi0jZGVmaW5lIFNGUl9TVFJJTkcoaWR4KSBDSEVDS19SQU5HRSgoaWR4KSwgU0ZSX1NUUklORykKLQotc3RhdGljIGNvbnN0IGNoYXIgKl9TV1pfU1RSSU5HW10gPSB7Ci0gICBbTlZTX1NXWl9YXSA9ICJ4IiwKLSAgIFtOVlNfU1daX1ldID0gInkiLAotICAgW05WU19TV1pfWl0gPSAieiIsCi0gICBbTlZTX1NXWl9XXSA9ICJ3IgotfTsKLQotI2RlZmluZSBTV1pfU1RSSU5HKGlkeCkgQ0hFQ0tfUkFOR0UoKGlkeCksIFNXWl9TVFJJTkcpCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfTlZTX1BSRUNfU1RSSU5HW10gPSB7Ci0gICBbTlZTX1BSRUNfRkxPQVQzMl0gPSAiUiIsCi0gICBbTlZTX1BSRUNfRkxPQVQxNl0gPSAiSCIsCi0gICBbTlZTX1BSRUNfRklYRUQxMl0gPSAiWCIsCi0gICBbTlZTX1BSRUNfVU5LTk9XTl0gPSAiPyIKLX07Ci0KLSNkZWZpbmUgTlZTX1BSRUNfU1RSSU5HKGlkeCkgQ0hFQ0tfUkFOR0UoKGlkeCksIE5WU19QUkVDX1NUUklORykKLQotc3RhdGljIGNvbnN0IGNoYXIgKl9OVlNfQ09ORF9TVFJJTkdbXSA9IHsKLSAgIFtOVlNfQ09ORF9GTF0gPSAiRkwiLAotICAgW05WU19DT05EX0xUXSA9ICJMVCIsCi0gICBbTlZTX0NPTkRfRVFdID0gIkVRIiwKLSAgIFtOVlNfQ09ORF9MRV0gPSAiTEUiLAotICAgW05WU19DT05EX0dUXSA9ICJHVCIsCi0gICBbTlZTX0NPTkRfTkVdID0gIk5FIiwKLSAgIFtOVlNfQ09ORF9HRV0gPSAiR0UiLAotICAgW05WU19DT05EX1RSXSA9ICJUUiIsCi0gICBbTlZTX0NPTkRfVU5LTk9XTl0gPSAiPz8iCi19OwotCi0jZGVmaW5lIE5WU19DT05EX1NUUklORyhpZHgpIENIRUNLX1JBTkdFKChpZHgpLCBOVlNfQ09ORF9TVFJJTkcpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hhZGVyRnJhZ21lbnQgZHVtcGluZwotICovCi1zdGF0aWMgdm9pZAotbnZzRHVtcEluZGVudChpbnQgbHZsKQotewotICAgd2hpbGUgKGx2bC0tKQotICAgICAgcHJpbnRmKCIgICIpOwotfQotCi1zdGF0aWMgdm9pZAotbnZzRHVtcFN3aXp6bGUobnZzU3d6Q29tcCAqc3d6KQotewotICAgcHJpbnRmKCIuJXMlcyVzJXMiLAotCSAgU1daX1NUUklORyhzd3pbMF0pLAotCSAgU1daX1NUUklORyhzd3pbMV0pLCBTV1pfU1RSSU5HKHN3elsyXSksIFNXWl9TVFJJTkcoc3d6WzNdKQotICAgICAgKTsKLX0KLQotc3RhdGljIHZvaWQKLW52c0R1bXBSZWcobnZzSW5zdHJ1Y3Rpb24gKiBpbnN0LCBudnNSZWdpc3RlciAqIHJlZykKLXsKLSAgIGlmIChyZWctPm5lZ2F0ZSkKLSAgICAgIHByaW50ZigiLSIpOwotICAgaWYgKHJlZy0+YWJzKQotICAgICAgcHJpbnRmKCJhYnMoIik7Ci0KLSAgIHN3aXRjaCAocmVnLT5maWxlKSB7Ci0gICBjYXNlIE5WU19GSUxFX1RFTVA6Ci0gICAgICBwcmludGYoIlIlZCIsIHJlZy0+aW5kZXgpOwotICAgICAgbnZzRHVtcFN3aXp6bGUocmVnLT5zd2l6emxlKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVlNfRklMRV9BVFRSSUI6Ci0gICAgICBwcmludGYoImF0dHJpYi4lcyIsIFNGUl9TVFJJTkcocmVnLT5pbmRleCkpOwotICAgICAgbnZzRHVtcFN3aXp6bGUocmVnLT5zd2l6emxlKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVlNfRklMRV9BRERSRVNTOgotICAgICAgcHJpbnRmKCJBJWQiLCByZWctPmluZGV4KTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVlNfRklMRV9DT05TVDoKLSAgICAgIGlmIChyZWctPmluZGV4ZWQpCi0JIHByaW50ZigiY29uc3RbQSVkLiVzICsgJWRdIiwKLQkJcmVnLT5hZGRyX3JlZywgU1daX1NUUklORyhyZWctPmFkZHJfY29tcCksIHJlZy0+aW5kZXgpOwotICAgICAgZWxzZQotCSBwcmludGYoImNvbnN0WyVkXSIsIHJlZy0+aW5kZXgpOwotICAgICAgbnZzRHVtcFN3aXp6bGUocmVnLT5zd2l6emxlKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZigiVU5LTk9XTl9GSUxFIik7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgaWYgKHJlZy0+YWJzKQotICAgICAgcHJpbnRmKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udnNEdW1wSW5zdHJ1Y3Rpb24obnZzSW5zdHJ1Y3Rpb24gKiBpbnN0LCBpbnQgc2xvdCwgaW50IGx2bCkKLXsKLSAgIHN0cnVjdCBfb3Bjb2RlX2luZm8gKm9wciA9ICZvcHNbaW5zdC0+b3BdOwotICAgaW50IGk7Ci0KLSAgIG52c0R1bXBJbmRlbnQobHZsKTsKLSAgIHByaW50ZigiJXMgIiwgb3ByLT5uYW1lKTsKLQotICAgaWYgKCFvcHItPmZsYWdzICYgTk9EUykgewotICAgICAgc3dpdGNoIChpbnN0LT5kZXN0LmZpbGUpIHsKLSAgICAgIGNhc2UgTlZTX0ZJTEVfUkVTVUxUOgotCSBwcmludGYoInJlc3VsdC4lcyIsIFNGUl9TVFJJTkcoaW5zdC0+ZGVzdC5pbmRleCkpOwotCSBicmVhazsKLSAgICAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLQkgcHJpbnRmKCJSJWQiLCBpbnN0LT5kZXN0LmluZGV4KTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIE5WU19GSUxFX0FERFJFU1M6Ci0JIHByaW50ZigiQSVkIiwgaW5zdC0+ZGVzdC5pbmRleCk7Ci0JIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkgcHJpbnRmKCJVTktOT1dOX0RTVF9GSUxFIik7Ci0JIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoaW5zdC0+bWFzayAhPSBTTUFTS19BTEwpIHsKLQkgcHJpbnRmKCIuIik7Ci0JIGlmIChpbnN0LT5tYXNrICYgU01BU0tfWCkKLQkgICAgcHJpbnRmKCJ4Iik7Ci0JIGlmIChpbnN0LT5tYXNrICYgU01BU0tfWSkKLQkgICAgcHJpbnRmKCJ5Iik7Ci0JIGlmIChpbnN0LT5tYXNrICYgU01BU0tfWikKLQkgICAgcHJpbnRmKCJ6Iik7Ci0JIGlmIChpbnN0LT5tYXNrICYgU01BU0tfVykKLQkgICAgcHJpbnRmKCJ3Iik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcHItPm51bXNyYykKLQkgcHJpbnRmKCIsICIpOwotICAgfQotCi0gICBmb3IgKGkgPSAwOyBpIDwgb3ByLT5udW1zcmM7IGkrKykgewotICAgICAgbnZzRHVtcFJlZyhpbnN0LCAmaW5zdC0+c3JjW2ldKTsKLSAgICAgIGlmIChpICE9IG9wci0+bnVtc3JjIC0gMSkKLQkgcHJpbnRmKCIsICIpOwotICAgfQotICAgaWYgKG9wci0+ZmxhZ3MgJiBUSV9VTklUKQotICAgICAgcHJpbnRmKCIsIHRleHR1cmVbJWRdIiwgaW5zdC0+dGV4X3VuaXQpOwotCi0gICBwcmludGYoIlxuIik7Ci19Ci0KLXZvaWQKLW52c0R1bXBGcmFnbWVudExpc3QobnZzRnJhZ21lbnRIZWFkZXIgKmYsIGludCBsdmwpCi17Ci0gICB3aGlsZSAoZikgewotICAgICAgc3dpdGNoIChmLT50eXBlKSB7Ci0gICAgICBjYXNlIE5WU19JTlNUUlVDVElPTjoKLQkgbnZzRHVtcEluc3RydWN0aW9uKChudnNJbnN0cnVjdGlvbiopZiwgMCwgbHZsKTsKLQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSBmcHJpbnRmKHN0ZGVyciwgIiVzOiBPbmx5IE5WU19JTlNUUlVDVElPTiBmcmFnbWVudHMgY2FuIGJlIGluIgotCSAgICAgICAgICAgICAgICAgIm52c0ZyYWdtZW50TGlzdCFcbiIsIF9fZnVuY19fKTsKLQkgcmV0dXJuOwotICAgICAgfQotICAgICAgZiA9IGYtPm5leHQ7Ci0gICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSFcgc2hhZGVyIGRpc2Fzc2VtYmx5Ci0gKi8KLXN0YXRpYyB2b2lkCi1udnNEaXNhc21IV1NoYWRlck9wKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBzdHJ1Y3QgX29wY29kZV9pbmZvICpvcGk7Ci0gICBudnNPcGNvZGUgb3A7Ci0gICBudnNSZWdGaWxlIGZpbGU7Ci0gICBudnNTd3pDb21wIHN3els0XTsKLSAgIGludCBpOwotCi0gICBvcCA9IHNoYWRlci0+R2V0T3Bjb2RlKHNoYWRlciwgbWVyZ2VkKTsKLSAgIG9waSA9IF9nZXRfb3BfaW5mbyhvcCk7Ci0gICBpZiAoIW9waSkgewotICAgICAgcHJpbnRmKCJOTyBPUElORk8hIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHByaW50ZigiJXMiLCBvcGktPm5hbWUpOwotICAgaWYgKHNoYWRlci0+R2V0UHJlY2lzaW9uICYmCi0gICAgICAgKCEob3BpLT5mbGFncyAmIEJSQU5DSF9BTEwpKSAmJiAoIShvcGktPmZsYWdzICogTk9EUykpICYmCi0gICAgICAgKG9wICE9IE5WU19PUF9OT1ApKQotICAgICAgcHJpbnRmKCIlcyIsIE5WU19QUkVDX1NUUklORyhzaGFkZXItPkdldFByZWNpc2lvbihzaGFkZXIpKSk7Ci0gICBpZiAoc2hhZGVyLT5TdXBwb3J0c0NvbmRpdGlvbmFsICYmIHNoYWRlci0+U3VwcG9ydHNDb25kaXRpb25hbChzaGFkZXIpKSB7Ci0gICAgICBpZiAoc2hhZGVyLT5HZXRDb25kaXRpb25VcGRhdGUoc2hhZGVyKSkgewotCSBwcmludGYoIkMlZCIsIHNoYWRlci0+R2V0Q29uZFJlZ0lEKHNoYWRlcikpOwotICAgICAgfQotICAgfQotICAgaWYgKHNoYWRlci0+R2V0U2F0dXJhdGUgJiYgc2hhZGVyLT5HZXRTYXR1cmF0ZShzaGFkZXIpKQotICAgICAgcHJpbnRmKCJfU0FUIik7Ci0KLSAgIGlmICghKG9waS0+ZmxhZ3MgJiBOT0RTKSkgewotICAgICAgaW50IG1hc2sgPSBzaGFkZXItPkdldERlc3RNYXNrKHNoYWRlciwgbWVyZ2VkKTsKLQotICAgICAgc3dpdGNoIChzaGFkZXItPkdldERlc3RGaWxlKHNoYWRlciwgbWVyZ2VkKSkgewotICAgICAgY2FzZSBOVlNfRklMRV9BRERSRVNTOgotCSBwcmludGYoIiBBJWQiLCBzaGFkZXItPkdldERlc3RJRChzaGFkZXIsIG1lcmdlZCkpOwotCSBicmVhazsKLSAgICAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLQkgcHJpbnRmKCIgUiVkIiwgc2hhZGVyLT5HZXREZXN0SUQoc2hhZGVyLCBtZXJnZWQpKTsKLQkgYnJlYWs7Ci0gICAgICBjYXNlIE5WU19GSUxFX1JFU1VMVDoKLQkgcHJpbnRmKCIgcmVzdWx0LiVzIiwgKFNGUl9TVFJJTkcoc2hhZGVyLT5HZXREZXN0SUQoc2hhZGVyLCBtZXJnZWQpKSkpOwotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JIHByaW50ZigiIEJBRF9SRVNVTFRfRklMRSIpOwotCSBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKG1hc2sgIT0gU01BU0tfQUxMKSB7Ci0JIHByaW50ZigiLiIpOwotCSBpZiAobWFzayAmIFNNQVNLX1gpIHByaW50ZigieCIpOwotCSBpZiAobWFzayAmIFNNQVNLX1kpIHByaW50ZigieSIpOwotCSBpZiAobWFzayAmIFNNQVNLX1opIHByaW50ZigieiIpOwotCSBpZiAobWFzayAmIFNNQVNLX1cpIHByaW50ZigidyIpOwotICAgICAgfQotICAgfQotCi0gICBpZiAoc2hhZGVyLT5TdXBwb3J0c0NvbmRpdGlvbmFsICYmIHNoYWRlci0+U3VwcG9ydHNDb25kaXRpb25hbChzaGFkZXIpICYmCi0gICAgICAgc2hhZGVyLT5HZXRDb25kaXRpb25UZXN0KHNoYWRlcikpIHsKLSAgICAgIHNoYWRlci0+R2V0Q29uZFJlZ1N3aXp6bGUoc2hhZGVyLCBzd3opOwotCi0gICAgICBwcmludGYoIiAoJXMlZC4lcyVzJXMlcykiLAotCSAgICBOVlNfQ09ORF9TVFJJTkcoc2hhZGVyLT5HZXRDb25kaXRpb24oc2hhZGVyKSksCi0JICAgIHNoYWRlci0+R2V0Q29uZFJlZ0lEKHNoYWRlciksCi0JICAgIFNXWl9TVFJJTkcoc3d6W05WU19TV1pfWF0pLAotCSAgICBTV1pfU1RSSU5HKHN3eltOVlNfU1daX1ldKSwKLQkgICAgU1daX1NUUklORyhzd3pbTlZTX1NXWl9aXSksCi0JICAgIFNXWl9TVFJJTkcoc3d6W05WU19TV1pfV10pCi0JICAgICk7Ci0gICB9Ci0KLSAgIC8qIGxvb3BpbmcgKi8KLSAgIGlmIChvcGktPmZsYWdzICYgQ09VTlRfQUxMKSB7Ci0gICAgICBwcmludGYoIiB7ICIpOwotICAgICAgaWYgKG9waS0+ZmxhZ3MgJiBDT1VOVF9OVU0pIHsKLQkgcHJpbnRmKCIlZCIsIHNoYWRlci0+R2V0TG9vcENvdW50KHNoYWRlcikpOwotICAgICAgfQotICAgICAgaWYgKG9waS0+ZmxhZ3MgJiBDT1VOVF9JTkQpIHsKLQkgcHJpbnRmKCIsICVkIiwgc2hhZGVyLT5HZXRMb29wSW5pdGlhbChzaGFkZXIpKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcGktPmZsYWdzICYgQ09VTlRfSU5DKSB7Ci0JIHByaW50ZigiLCAlZCIsIHNoYWRlci0+R2V0TG9vcEluY3JlbWVudChzaGFkZXIpKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZigiIH0iKTsKLSAgIH0KLQotICAgLyogYnJhbmNoaW5nICovCi0gICBpZiAob3BpLT5mbGFncyAmIEJSQU5DSF9UUikKLSAgICAgIHByaW50ZigiICVkIiwgc2hhZGVyLT5HZXRCcmFuY2goc2hhZGVyKSk7Ci0gICBpZiAob3BpLT5mbGFncyAmIEJSQU5DSF9FTCkKLSAgICAgIHByaW50ZigiIEVMU0UgJWQiLCBzaGFkZXItPkdldEJyYW5jaEVsc2Uoc2hhZGVyKSk7Ci0gICBpZiAob3BpLT5mbGFncyAmIEJSQU5DSF9FTikKLSAgICAgIHByaW50ZigiIEVORCAlZCIsIHNoYWRlci0+R2V0QnJhbmNoRW5kKHNoYWRlcikpOwotCi0gICBpZiAoIShvcGktPmZsYWdzICYgTk9EUykgJiYgb3BpLT5udW1zcmMpCi0gICAgICBwcmludGYoIiwiKTsKLSAgIHByaW50ZigiICIpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgb3BpLT5udW1zcmM7IGkrKykgewotICAgICAgaWYgKHNoYWRlci0+R2V0U291cmNlQWJzKHNoYWRlciwgbWVyZ2VkLCBpKSkKLQkgcHJpbnRmKCJhYnMoIik7Ci0gICAgICBpZiAoc2hhZGVyLT5HZXRTb3VyY2VOZWdhdGUoc2hhZGVyLCBtZXJnZWQsIGkpKQotCSBwcmludGYoIi0iKTsKLQotICAgICAgZmlsZSA9IHNoYWRlci0+R2V0U291cmNlRmlsZShzaGFkZXIsIG1lcmdlZCwgaSk7Ci0gICAgICBzd2l0Y2ggKGZpbGUpIHsKLSAgICAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLQkgcHJpbnRmKCJSJWQiLCBzaGFkZXItPkdldFNvdXJjZUlEKHNoYWRlciwgbWVyZ2VkLCBpKSk7Ci0JIGJyZWFrOwotICAgICAgY2FzZSBOVlNfRklMRV9DT05TVDoKLQkgaWYgKHNoYWRlci0+R2V0U291cmNlSW5kZXhlZChzaGFkZXIsIG1lcmdlZCwgaSkpIHsKLQkgICAgcHJpbnRmKCJjW0ElZC4lcyArIDB4JXhdIiwKLQkJICAgICBzaGFkZXItPkdldFJlbEFkZHJlc3NSZWdJRChzaGFkZXIpLAotCQkgICAgIFNXWl9TVFJJTkcoc2hhZGVyLT5HZXRSZWxBZGRyZXNzU3dpenpsZShzaGFkZXIpKSwKLQkJICAgICBzaGFkZXItPkdldFNvdXJjZUlEKHNoYWRlciwgbWVyZ2VkLCBpKQotCQkgICk7Ci0JIH0gZWxzZSB7Ci0JICAgIGZsb2F0IHZhbFs0XTsKLQotCSAgICBpZiAoc2hhZGVyLT5HZXRTb3VyY2VDb25zdFZhbCkgewotCSAgICAgICBzaGFkZXItPkdldFNvdXJjZUNvbnN0VmFsKHNoYWRlciwgbWVyZ2VkLCBpLCB2YWwpOwotCSAgICAgICBwcmludGYoInsgJS4wMmYsICUuMDJmLCAlLjAyZiwgJS4wMmYgfSIsCi0JCSAgICAgdmFsWzBdLCB2YWxbMV0sIHZhbFsyXSwgdmFsWzNdKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgcHJpbnRmKCJjWzB4JXhdIiwgc2hhZGVyLT5HZXRTb3VyY2VJRChzaGFkZXIsIG1lcmdlZCwgaSkpOwotCSAgICB9Ci0JIH0KLQkgYnJlYWs7Ci0gICAgICBjYXNlIE5WU19GSUxFX0FUVFJJQjoKLQkgaWYgKHNoYWRlci0+R2V0U291cmNlSW5kZXhlZChzaGFkZXIsIG1lcmdlZCwgaSkpIHsKLQkgICAgcHJpbnRmKCJhdHRyaWJbQSVkLiVzICsgJWRdIiwKLQkJICAgICBzaGFkZXItPkdldFJlbEFkZHJlc3NSZWdJRChzaGFkZXIpLAotCQkgICAgIFNXWl9TVFJJTkcoc2hhZGVyLT5HZXRSZWxBZGRyZXNzU3dpenpsZShzaGFkZXIpKSwKLQkJICAgICBzaGFkZXItPkdldFNvdXJjZUlEKHNoYWRlciwgbWVyZ2VkLCBpKQotCQkgICk7Ci0JIH0KLQkgZWxzZSB7Ci0JICAgIHByaW50ZigiYXR0cmliLiVzIiwKLQkJICAgICBTRlJfU1RSSU5HKHNoYWRlci0+R2V0U291cmNlSUQoc2hhZGVyLCBtZXJnZWQsIGkpKQotCQkgICk7Ci0JIH0KLQkgYnJlYWs7Ci0gICAgICBjYXNlIE5WU19GSUxFX0FERFJFU1M6Ci0JIHByaW50ZigiQSVkIiwgc2hhZGVyLT5HZXRSZWxBZGRyZXNzUmVnSUQoc2hhZGVyKSk7Ci0JIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkgcHJpbnRmKCJVTktOT1dOX1NSQ19GSUxFIik7Ci0JIGJyZWFrOwotICAgICAgfQotCi0gICAgICBzaGFkZXItPkdldFNvdXJjZVN3aXp6bGUoc2hhZGVyLCBtZXJnZWQsIGksIHN3eik7Ci0gICAgICBpZiAoZmlsZSAhPSBOVlNfRklMRV9BRERSRVNTICYmCi0JICAoc3d6W05WU19TV1pfWF0gIT0gTlZTX1NXWl9YIHx8IHN3eltOVlNfU1daX1ldICE9IE5WU19TV1pfWSB8fAotCSAgIHN3eltOVlNfU1daX1pdICE9IE5WU19TV1pfWiB8fCBzd3pbTlZTX1NXWl9XXSAhPSBOVlNfU1daX1cpKSB7Ci0JIHByaW50ZigiLiVzJXMlcyVzIiwgU1daX1NUUklORyhzd3pbTlZTX1NXWl9YXSksCi0JICAgICAgIAkJICAgICBTV1pfU1RSSU5HKHN3eltOVlNfU1daX1ldKSwKLQkJCSAgICAgU1daX1NUUklORyhzd3pbTlZTX1NXWl9aXSksCi0JCQkgICAgIFNXWl9TVFJJTkcoc3d6W05WU19TV1pfV10pKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHNoYWRlci0+R2V0U291cmNlQWJzKHNoYWRlciwgbWVyZ2VkLCBpKSkKLQkgcHJpbnRmKCIpIik7Ci0gICAgICBpZiAoc2hhZGVyLT5HZXRTb3VyY2VTY2FsZSkgewotCSBpbnQgc2NhbGUgPSBzaGFkZXItPkdldFNvdXJjZVNjYWxlKHNoYWRlciwgbWVyZ2VkLCBpKTsKLQkgaWYgKHNjYWxlID4gMSkKLQkgICAgcHJpbnRmKCJ7c2NhbGVkICVkeH0iLCBzY2FsZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaSA8IChvcGktPm51bXNyYyAtIDEpKQotCSBwcmludGYoIiwgIik7Ci0gICB9Ci0KLSAgIGlmIChzaGFkZXItPklzTGFzdEluc3Qoc2hhZGVyKSkKLSAgICAgIHByaW50ZigiICsgRU5EIik7Ci19Ci0KLXZvaWQKLW52c0Rpc2FzbUhXU2hhZGVyKG52c1B0ciBudnMpCi17Ci0gICBudnNGdW5jICpzaGFkZXIgPSBudnMtPmZ1bmM7Ci0gICB1bnNpZ25lZCBpbnQgaWFkZHIgPSAwOwotCi0gICBpZiAoIW52cy0+cHJvZ3JhbSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJObyBIVyBwcm9ncmFtIHByZXNlbnQiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgc2hhZGVyLT5pbnN0ID0gbnZzLT5wcm9ncmFtOwotICAgd2hpbGUgKDEpIHsKLSAgICAgIGlmIChzaGFkZXItPmluc3QgPj0gKG52cy0+cHJvZ3JhbSArIG52cy0+cHJvZ3JhbV9zaXplKSkgewotCSBmcHJpbnRmKHN0ZGVyciwgIlJlYWNoZWQgZW5kIG9mIHByb2dyYW0sIGJ1dCBIVyBpbnN0IGhhcyBubyBFTkQiKTsKLQkgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZigiXHQweCUwOHg6XG4iLCBzaGFkZXItPmluc3RbMF0pOwotICAgICAgcHJpbnRmKCJcdDB4JTA4eDpcbiIsIHNoYWRlci0+aW5zdFsxXSk7Ci0gICAgICBwcmludGYoIlx0MHglMDh4OlxuIiwgc2hhZGVyLT5pbnN0WzJdKTsKLSAgICAgIHByaW50ZigiXHQweCUwOHg6Iiwgc2hhZGVyLT5pbnN0WzNdKTsKLQotICAgICAgcHJpbnRmKCJcblx0XHRJTlNUICVkLjA6ICIsIGlhZGRyKTsKLSAgICAgIG52c0Rpc2FzbUhXU2hhZGVyT3Aoc2hhZGVyLCAwKTsKLSAgICAgIGlmIChzaGFkZXItPkhhc01lcmdlZEluc3Qoc2hhZGVyKSkgewotCSBwcmludGYoIlxuXHRcdElOU1QgJWQuMTogIiwgaWFkZHIpOwotCSBudnNEaXNhc21IV1NoYWRlck9wKHNoYWRlciwgMSk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoIlxuIik7Ci0KLSAgICAgIGlmIChzaGFkZXItPklzTGFzdEluc3Qoc2hhZGVyKSkKLQkgYnJlYWs7Ci0KLSAgICAgIHNoYWRlci0+aW5zdCArPSBzaGFkZXItPkdldE9mZnNldE5leHQoc2hhZGVyKTsKLSAgICAgIGlhZGRyKys7Ci0gICB9Ci0KLSAgIHByaW50ZigiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zaGFkZXIuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zaGFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyNWEyYS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc2hhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotI2lmbmRlZiBfX1NIQURFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fU0hBREVSX0NPTU1PTl9IX18KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotI2luY2x1ZGUgImJ1ZmZlcm9iai5oIgotCi0jZGVmaW5lIE5WU0RCRyhmbXQsIGFyZ3MuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoTk9VVkVBVV9ERUJVRyAmIERFQlVHX1NIQURFUlMpIHsgICAgICAgICAgICAgICAgICBcCi0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICJmbXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSgwKQotCi10eXBlZGVmIHN0cnVjdCBfbnZzRnVuYyBudnNGdW5jOwotCi0jZGVmaW5lIE5WU19NQVhfVEVNUFMgICAzMgotI2RlZmluZSBOVlNfTUFYX0FUVFJJQlMgMTYKLSNkZWZpbmUgTlZTX01BWF9DT05TVFMgIDI1NgotI2RlZmluZSBOVlNfTUFYX0FERFJFU1MgMgotI2RlZmluZSBOVlNfTUFYX0lOU05TICAgNDA5NgotCi10eXBlZGVmIHN0cnVjdCBfbnZzX2ZyYWdtZW50X2hlYWRlciB7Ci0gICBzdHJ1Y3QgX252c19mcmFnbWVudF9oZWFkZXIgKnBhcmVudDsKLSAgIHN0cnVjdCBfbnZzX2ZyYWdtZW50X2hlYWRlciAqcHJldjsKLSAgIHN0cnVjdCBfbnZzX2ZyYWdtZW50X2hlYWRlciAqbmV4dDsKLSAgIGVudW0gewotICAgICAgTlZTX0lOU1RSVUNUSU9OLAotICAgICAgTlZTX0JSQU5DSCwKLSAgICAgIE5WU19MT09QLAotICAgICAgTlZTX1NVQlJPVVRJTkUKLSAgIH0gdHlwZTsKLX0gbnZzRnJhZ21lbnRIZWFkZXI7Ci0KLXR5cGVkZWYgdW5pb24gewotCXN0cnVjdCB7Ci0JCUdMYm9vbGVhbiB1c2VzX2tpbDsKLQkJR0x1aW50ICAgIG51bV9yZWdzOwotCX0gTlYzMEZQOwotCXN0cnVjdCB7Ci0JCXVpbnQzMl90IHZwX2luX3JlZzsKLQkJdWludDMyX3QgdnBfb3V0X3JlZzsKLQkJdWludDMyX3QgY2xpcF9lbmFibGVzOwotCX0gTlYzMFZQOwotfSBudnNDYXJkUHJpdjsKLQotdHlwZWRlZiBzdHJ1Y3QgX25vdXZlYXVTaGFkZXIgewotICAgdW5pb24gewotICAgICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtIHZwOwotICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gZnA7Ci0gICB9IG1lc2E7Ci0gICBHTGNvbnRleHQgKmN0eDsKLSAgIG52c0Z1bmMgKmZ1bmM7Ci0KLSAgIC8qIFN0YXRlIG9mIHRoZSBmaW5hbCBwcm9ncmFtICovCi0gICBHTGJvb2xlYW4gZXJyb3I7Ci0gICBHTGJvb2xlYW4gdHJhbnNsYXRlZDsKLSAgIEdMYm9vbGVhbiBvbl9oYXJkd2FyZTsKLSAgIHVuc2lnbmVkIGludCAqcHJvZ3JhbTsKLSAgIHVuc2lnbmVkIGludCBwcm9ncmFtX3NpemU7Ci0gICB1bnNpZ25lZCBpbnQgcHJvZ3JhbV9hbGxvY19zaXplOwotICAgdW5zaWduZWQgaW50IHByb2dyYW1fc3RhcnRfaWQ7Ci0gICB1bnNpZ25lZCBpbnQgcHJvZ3JhbV9jdXJyZW50OwotICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKnByb2dyYW1fYnVmZmVyOwotICAgaW50CQlpbnN0X2NvdW50OwotCi0gICBudnNDYXJkUHJpdiBjYXJkX3ByaXY7Ci0gICBpbnQJCXZwX2F0dHJpYl9tYXBbTlZTX01BWF9BVFRSSUJTXTsKLQotICAgc3RydWN0IHsKLSAgICAgIEdMYm9vbGVhbiBpbl91c2U7Ci0KLSAgICAgIEdMZmxvYXQgICpzb3VyY2VfdmFsOwkvKiBOVUxMIGlmIGludmFyaWFudCAqLwotICAgICAgZmxvYXQJdmFsWzRdOwotICAgICAgLyogSGFyZHdhcmUtc3BlY2lmaWMgdHJhY2tpbmcsIGN1cnJlbnRseSBvbmx5IG52MzBfZnJhZ3Byb2cKLSAgICAgICAqIG1ha2VzIHVzZSBvZiBpdC4KLSAgICAgICAqLwotICAgICAgaW50CSpod19pbmRleDsKLSAgICAgIGludCAgICAgICAgaHdfaW5kZXhfY250OwotICAgfSBwYXJhbXNbTlZTX01BWF9DT05TVFNdOwotICAgaW50IHBhcmFtX2hpZ2g7Ci0KLSAgIC8qIFBhc3MtcHJpdmF0ZSBkYXRhICovCi0gICB2b2lkICpwYXNzX3JlYzsKLQotICAgbnZzRnJhZ21lbnRIZWFkZXIgKnByb2dyYW1fdHJlZTsKLX0gbm91dmVhdVNoYWRlciwgKm52c1B0cjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgIE5WU19GSUxFX05PTkUsCi0gICBOVlNfRklMRV9URU1QLAotICAgTlZTX0ZJTEVfQVRUUklCLAotICAgTlZTX0ZJTEVfQ09OU1QsCi0gICBOVlNfRklMRV9SRVNVTFQsCi0gICBOVlNfRklMRV9BRERSRVNTLAotICAgTlZTX0ZJTEVfVU5LTk9XTgotfSBudnNSZWdGaWxlOwotCi10eXBlZGVmIGVudW0gewotICAgTlZTX09QX1VOS05PV04gPSAwLAotICAgTlZTX09QX05PUCwKLSAgIE5WU19PUF9BQlMsIE5WU19PUF9BREQsIE5WU19PUF9BUkEsIE5WU19PUF9BUkwsIE5WU19PUF9BUlIsCi0gICBOVlNfT1BfQlJBLCBOVlNfT1BfQlJLLAotICAgTlZTX09QX0NBTCwgTlZTX09QX0NNUCwgTlZTX09QX0NPUywKLSAgIE5WU19PUF9ERFgsIE5WU19PUF9ERFksIE5WU19PUF9ESVYsIE5WU19PUF9EUDIsIE5WU19PUF9EUDJBLCBOVlNfT1BfRFAzLAotICAgTlZTX09QX0RQNCwgTlZTX09QX0RQSCwgTlZTX09QX0RTVCwKLSAgIE5WU19PUF9FWDIsIE5WU19PUF9FWFAsCi0gICBOVlNfT1BfRkxSLCBOVlNfT1BfRlJDLAotICAgTlZTX09QX0lGLAotICAgTlZTX09QX0tJTCwKLSAgIE5WU19PUF9MRzIsIE5WU19PUF9MSVQsIE5WU19PUF9MT0csIE5WU19PUF9MT09QLCBOVlNfT1BfTFJQLAotICAgTlZTX09QX01BRCwgTlZTX09QX01BWCwgTlZTX09QX01JTiwgTlZTX09QX01PViwgTlZTX09QX01VTCwKLSAgIE5WU19PUF9OUk0sCi0gICBOVlNfT1BfUEsySCwgTlZTX09QX1BLMlVTLCBOVlNfT1BfUEs0QiwgTlZTX09QX1BLNFVCLCBOVlNfT1BfUE9XLAotICAgTlZTX09QX1BPUEEsIE5WU19PUF9QVVNIQSwKLSAgIE5WU19PUF9SQ0MsIE5WU19PUF9SQ1AsIE5WU19PUF9SRVAsIE5WU19PUF9SRVQsIE5WU19PUF9SRkwsIE5WU19PUF9SU1EsCi0gICBOVlNfT1BfU0NTLCBOVlNfT1BfU0VRLCBOVlNfT1BfU0ZMLCBOVlNfT1BfU0dFLCBOVlNfT1BfU0dULCBOVlNfT1BfU0lOLAotICAgTlZTX09QX1NMRSwgTlZTX09QX1NMVCwgTlZTX09QX1NORSwgTlZTX09QX1NTRywgTlZTX09QX1NUUiwgTlZTX09QX1NVQiwKLSAgIE5WU19PUF9TV1osCi0gICBOVlNfT1BfVEVYLCBOVlNfT1BfVFhCLCBOVlNfT1BfVFhELCBOVlNfT1BfVFhMLCBOVlNfT1BfVFhQLAotICAgTlZTX09QX1VQMkgsIE5WU19PUF9VUDJVUywgTlZTX09QX1VQNEIsIE5WU19PUF9VUDRVQiwKLSAgIE5WU19PUF9YMkQsIE5WU19PUF9YUEQsCi0gICBOVlNfT1BfRU1VTAotfSBudnNPcGNvZGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICBOVlNfUFJFQ19GTE9BVDMyLAotICAgTlZTX1BSRUNfRkxPQVQxNiwKLSAgIE5WU19QUkVDX0ZJWEVEMTIsCi0gICBOVlNfUFJFQ19VTktOT1dOCi19IG52c1ByZWNpc2lvbjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgIE5WU19TV1pfWCA9IDAsCi0gICBOVlNfU1daX1kgPSAxLAotICAgTlZTX1NXWl9aID0gMiwKLSAgIE5WU19TV1pfVyA9IDMKLX0gbnZzU3d6Q29tcDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgIE5WU19GUl9QT1NJVElPTgk9IDAsCi0gICBOVlNfRlJfV0VJR0hUCT0gMSwKLSAgIE5WU19GUl9OT1JNQUwJPSAyLAotICAgTlZTX0ZSX0NPTDAJCT0gMywKLSAgIE5WU19GUl9DT0wxCQk9IDQsCi0gICBOVlNfRlJfRk9HQ09PUkQJPSA1LAotICAgTlZTX0ZSX1RFWENPT1JEMAk9IDgsCi0gICBOVlNfRlJfVEVYQ09PUkQxCT0gOSwKLSAgIE5WU19GUl9URVhDT09SRDIJPSAxMCwKLSAgIE5WU19GUl9URVhDT09SRDMJPSAxMSwKLSAgIE5WU19GUl9URVhDT09SRDQJPSAxMiwKLSAgIE5WU19GUl9URVhDT09SRDUJPSAxMywKLSAgIE5WU19GUl9URVhDT09SRDYJPSAxNCwKLSAgIE5WU19GUl9URVhDT09SRDcJPSAxNSwKLSAgIE5WU19GUl9CRkMwCQk9IDE2LAotICAgTlZTX0ZSX0JGQzEJCT0gMTcsCi0gICBOVlNfRlJfUE9JTlRTWgk9IDE4LAotICAgTlZTX0ZSX0ZSQUdEQVRBMAk9IDE5LAotICAgTlZTX0ZSX0ZSQUdEQVRBMQk9IDIwLAotICAgTlZTX0ZSX0ZSQUdEQVRBMgk9IDIxLAotICAgTlZTX0ZSX0ZSQUdEQVRBMwk9IDIyLAotICAgTlZTX0ZSX0NMSVAwCQk9IDIzLAotICAgTlZTX0ZSX0NMSVAxCQk9IDI0LAotICAgTlZTX0ZSX0NMSVAyCQk9IDI1LAotICAgTlZTX0ZSX0NMSVAzCQk9IDI2LAotICAgTlZTX0ZSX0NMSVA0CQk9IDI3LAotICAgTlZTX0ZSX0NMSVA1CQk9IDI4LAotICAgTlZTX0ZSX0NMSVA2CQk9IDI5LAotICAgTlZTX0ZSX0ZBQ0lORwk9IDMwLAotICAgTlZTX0ZSX1VOS05PV04KLX0gbnZzRml4ZWRSZWc7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICBOVlNfQ09ORF9GTCwgTlZTX0NPTkRfTFQsIE5WU19DT05EX0VRLCBOVlNfQ09ORF9MRSwgTlZTX0NPTkRfR1QsCi0gICBOVlNfQ09ORF9ORSwgTlZTX0NPTkRfR0UsIE5WU19DT05EX1RSLCBOVlNfQ09ORF9VTiwKLSAgIE5WU19DT05EX1VOS05PV04KLX0gbnZzQ29uZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgbnZzUmVnRmlsZQlmaWxlOwotICAgdW5zaWduZWQgaW50CQlpbmRleDsKLQotICAgdW5zaWduZWQgaW50CQlpbmRleGVkOwotICAgdW5zaWduZWQgaW50CQlhZGRyX3JlZzsKLSAgIG52c1N3ekNvbXAJCWFkZHJfY29tcDsKLQotICAgbnZzU3d6Q29tcAkJc3dpenpsZVs0XTsKLSAgIGludAkJCW5lZ2F0ZTsKLSAgIGludAkJCWFiczsKLX0gbnZzUmVnaXN0ZXI7Ci0KLXN0YXRpYyBjb25zdCBudnNSZWdpc3RlciBudnJfdW51c2VkID0gewotICAgLmZpbGUJPSBOVlNfRklMRV9BVFRSSUIsCi0gICAuaW5kZXgJPSAwLAotICAgLmluZGV4ZWQJPSAwLAotICAgLmFkZHJfcmVnCT0gMCwKLSAgIC5hZGRyX2NvbXAJPSBOVlNfU1daX1gsCi0gICAuc3dpenpsZQk9IHtOVlNfU1daX1gsIE5WU19TV1pfWSwgTlZTX1NXWl9aLCBOVlNfU1daX1d9LAotICAgLm5lZ2F0ZQk9IDAsCi0gICAuYWJzCQk9IDAsCi19OwotCi10eXBlZGVmIGVudW0gewotICAgTlZTX1RFWF9UQVJHRVRfMUQsCi0gICBOVlNfVEVYX1RBUkdFVF8yRCwKLSAgIE5WU19URVhfVEFSR0VUXzNELAotICAgTlZTX1RFWF9UQVJHRVRfQ1VCRSwKLSAgIE5WU19URVhfVEFSR0VUX1JFQ1QsCi0gICBOVlNfVEVYX1RBUkdFVF9VTktOT1dOID0gMAotfSBudnNUZXhUYXJnZXQ7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JTlZTX1NDQUxFXzFYCSA9IDAsCi0JTlZTX1NDQUxFXzJYCSA9IDEsCi0JTlZTX1NDQUxFXzRYCSA9IDIsCi0JTlZTX1NDQUxFXzhYCSA9IDMsCi0JTlZTX1NDQUxFX0lOVl8yWCA9IDUsCi0JTlZTX1NDQUxFX0lOVl80WCA9IDYsCi0JTlZTX1NDQUxFX0lOVl84WCA9IDcsCi19IG52c1NjYWxlOwotCi0vKiBBcml0aC9URVggaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCBudnNfaW5zdHJ1Y3Rpb24gewotICAgbnZzRnJhZ21lbnRIZWFkZXIgaGVhZGVyOwotCi0gICBudnNPcGNvZGUJb3A7Ci0gICB1bnNpZ25lZCBpbnQgc2F0dXJhdGU7Ci0KLSAgIG52c1JlZ2lzdGVyCWRlc3Q7Ci0gICB1bnNpZ25lZCBpbnQJbWFzazsKLSAgIG52c1NjYWxlCWRlc3Rfc2NhbGU7Ci0KLSAgIG52c1JlZ2lzdGVyCXNyY1szXTsKLQotICAgdW5zaWduZWQgaW50IHRleF91bml0OwotICAgbnZzVGV4VGFyZ2V0IHRleF90YXJnZXQ7Ci0KLSAgIG52c0NvbmQJY29uZDsKLSAgIG52c1N3ekNvbXAJY29uZF9zd2l6emxlWzRdOwotICAgaW50CQljb25kX3JlZzsKLSAgIGludAkJY29uZF90ZXN0OwotICAgaW50CQljb25kX3VwZGF0ZTsKLX0gbnZzSW5zdHJ1Y3Rpb247Ci0KLS8qIEJSQSwgQ0FMLCBJRiAqLwotdHlwZWRlZiBzdHJ1Y3QgbnZzX2JyYW5jaCB7Ci0JbnZzRnJhZ21lbnRIZWFkZXIgIGhlYWRlcjsKLQotCW52c09wY29kZQlvcDsKLQotCW52c0NvbmQJCWNvbmQ7Ci0JbnZzU3d6Q29tcAljb25kX3N3aXp6bGVbNF07Ci0JaW50CQljb25kX3Rlc3Q7Ci0KLQludnNGcmFnbWVudEhlYWRlciAqdGFyZ2V0X2hlYWQ7Ci0JbnZzRnJhZ21lbnRIZWFkZXIgKnRhcmdldF90YWlsOwotCW52c0ZyYWdtZW50SGVhZGVyICplbHNlX2hlYWQ7Ci0JbnZzRnJhZ21lbnRIZWFkZXIgKmVsc2VfdGFpbDsKLX0gbnZzQnJhbmNoOwotCi0vKiBMT09QK0VORExPT1AgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQludnNGcmFnbWVudEhlYWRlciAgaGVhZGVyOwotCi0JaW50ICAgICAgICAgICAgICAgIGNvdW50OwotCWludCAgICAgICAgICAgICAgICBpbml0aWFsOwotCWludCAgICAgICAgICAgICAgICBpbmNyZW1lbnQ7Ci0KLQludnNGcmFnbWVudEhlYWRlciAqaW5zbl9oZWFkOwotCW52c0ZyYWdtZW50SGVhZGVyICppbnNuX3RhaWw7Ci19IG52c0xvb3A7Ci0KLS8qIGxhYmVsK2ZvbGxvd2luZyBpbnN0cnVjdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IG52c19zdWJyb3V0aW5lIHsKLQludnNGcmFnbWVudEhlYWRlciAgaGVhZGVyOwotCi0JY2hhciAqICAgICAgICAgICAgIGxhYmVsOwotCW52c0ZyYWdtZW50SGVhZGVyICppbnNuX2hlYWQ7Ci0JbnZzRnJhZ21lbnRIZWFkZXIgKmluc25fdGFpbDsKLX0gbnZzU3Vicm91dGluZTsKLQotI2RlZmluZSBTTUFTS19YICgxPDwwKQotI2RlZmluZSBTTUFTS19ZICgxPDwxKQotI2RlZmluZSBTTUFTS19aICgxPDwyKQotI2RlZmluZSBTTUFTS19XICgxPDwzKQotI2RlZmluZSBTTUFTS19BTEwgKFNNQVNLX1h8U01BU0tfWXxTTUFTS19afFNNQVNLX1cpCi0KLSNkZWZpbmUgU1BPU19BRERSRVNTIDMKLXN0cnVjdCBfb3BfeGxhdCB7Ci0JdW5zaWduZWQgaW50CU5WOwotCW52c09wY29kZQlTT1A7Ci0JaW50CQlzcmNwb3NbM107Ci19OwotI2RlZmluZSBNT0RfT1BDT0RFKHQsaHcsc29wLHMwLHMxLHMyKSBkbyB7IFwKLQl0W2h3XS5OViA9IGh3OyBcCi0JdFtod10uU09QID0gc29wOyBcCi0JdFtod10uc3JjcG9zWzBdID0gczA7IFwKLQl0W2h3XS5zcmNwb3NbMV0gPSBzMTsgXAotCXRbaHddLnNyY3Bvc1syXSA9IHMyOyBcCi19IHdoaWxlKDApCi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgTlZWUF9UWF9WT1BfQ09VTlQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IE5WVlBfVFhfTlZTX09QX0NPVU5UOwotZXh0ZXJuIHN0cnVjdCBfb3BfeGxhdCBOVlZQX1RYX1ZPUFtdOwotZXh0ZXJuIHN0cnVjdCBfb3BfeGxhdCBOVlZQX1RYX1NPUFtdOwotCi1leHRlcm4gdW5zaWduZWQgaW50IE5WRlBfVFhfQU9QX0NPVU5UOwotZXh0ZXJuIHVuc2lnbmVkIGludCBOVkZQX1RYX0JPUF9DT1VOVDsKLWV4dGVybiBzdHJ1Y3QgX29wX3hsYXQgTlZGUF9UWF9BT1BbXTsKLWV4dGVybiBzdHJ1Y3QgX29wX3hsYXQgTlZGUF9UWF9CT1BbXTsKLQotZXh0ZXJuIHZvaWQgTlYyMFZQVFhTd2l6emxlKGludCBod3N3eiwgbnZzU3d6Q29tcCAqc3d6KTsKLWV4dGVybiBudnNTd3pDb21wIE5WMjBWUF9UWF9TV0laWkxFWzRdOwotCi0jZGVmaW5lIFNDQVBfU1JDX0FCUwkoMTw8MCkKLQotc3RydWN0IF9udnNGdW5jIHsKLSAgIG52c0NhcmRQcml2ICpjYXJkX3ByaXY7Ci0KLSAgIHVuc2lnbmVkIGludAlNYXhJbnN0OwotICAgdW5zaWduZWQgaW50CU1heEF0dHJpYjsKLSAgIHVuc2lnbmVkIGludAlNYXhUZW1wOwotICAgdW5zaWduZWQgaW50CU1heEFkZHJlc3M7Ci0gICB1bnNpZ25lZCBpbnQJTWF4Q29uc3Q7Ci0gICB1bnNpZ25lZCBpbnQJY2FwczsKLQotICAgdW5zaWduZWQgaW50ICppbnN0OwotICAgdm9pZAkJKCpVcGxvYWRUb0hXKQkJKEdMY29udGV4dCAqLCBub3V2ZWF1U2hhZGVyICopOwotICAgdm9pZAkJKCpVcGRhdGVDb25zdCkJCShHTGNvbnRleHQgKiwgbm91dmVhdVNoYWRlciAqLCBpbnQpOwotCi0gICBzdHJ1Y3QgX29wX3hsYXQqKCpHZXRPUFRYUmVjKQkobnZzRnVuYyAqLCBpbnQgbWVyZ2VkKTsKLSAgIHN0cnVjdCBfb3BfeGxhdCooKkdldE9QVFhGcm9tU09QKQkobnZzT3Bjb2RlLCBpbnQgKmlkKTsKLQotICAgdm9pZAkJKCpJbml0SW5zdHJ1Y3Rpb24pCShudnNGdW5jICopOwotICAgaW50CQkoKlN1cHBvcnRzT3Bjb2RlKQkobnZzRnVuYyAqLCBudnNPcGNvZGUpOwotICAgaW50CQkoKlN1cHBvcnRzUmVzdWx0U2NhbGUpCShudnNGdW5jICosIG52c1NjYWxlKTsKLSAgIHZvaWQJCSgqU2V0T3Bjb2RlKQkJKG52c0Z1bmMgKiwgdW5zaWduZWQgaW50IG9wY29kZSwKLQkgCQkJCSBpbnQgc2xvdCk7Ci0gICB2b2lkCQkoKlNldENDVXBkYXRlKQkJKG52c0Z1bmMgKik7Ci0gICB2b2lkCQkoKlNldENvbmRpdGlvbikJCShudnNGdW5jICosIGludCBvbiwgbnZzQ29uZCwgaW50IHJlZywKLQkgCQkJCSBudnNTd3pDb21wICpzd2l6emxlKTsKLSAgIHZvaWQJCSgqU2V0UmVzdWx0KQkJKG52c0Z1bmMgKiwgbnZzUmVnaXN0ZXIgKiwKLQkgCQkJCSB1bnNpZ25lZCBpbnQgbWFzaywgaW50IHNsb3QpOwotICAgdm9pZAkJKCpTZXRSZXN1bHRTY2FsZSkJKG52c0Z1bmMgKiwgbnZzU2NhbGUpOwotICAgdm9pZAkJKCpTZXRTb3VyY2UpCQkobnZzRnVuYyAqLCBudnNSZWdpc3RlciAqLCBpbnQgcG9zKTsKLSAgIHZvaWQJCSgqU2V0VGV4SW1hZ2VVbml0KQkobnZzRnVuYyAqLCBpbnQgdW5pdCk7Ci0gICB2b2lkCQkoKlNldFNhdHVyYXRlKQkJKG52c0Z1bmMgKik7Ci0gICB2b2lkCQkoKlNldExhc3RJbnN0KQkJKG52c0Z1bmMgKik7Ci0KLSAgIHZvaWQJCSgqU2V0QnJhbmNoVGFyZ2V0KQkobnZzRnVuYyAqLCBpbnQgYWRkcik7Ci0gICB2b2lkCQkoKlNldEJyYW5jaEVsc2UpCShudnNGdW5jICosIGludCBhZGRyKTsKLSAgIHZvaWQJCSgqU2V0QnJhbmNoRW5kKQkJKG52c0Z1bmMgKiwgaW50IGFkZHIpOwotICAgdm9pZAkJKCpTZXRMb29wUGFyYW1zKQkobnZzRnVuYyAqLCBpbnQgY250LCBpbnQgaW5pdCwgaW50IGluYyk7Ci0KLSAgIGludAkJKCpIYXNNZXJnZWRJbnN0KQkobnZzRnVuYyAqKTsKLSAgIGludAkJKCpJc0xhc3RJbnN0KQkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0T2Zmc2V0TmV4dCkJKG52c0Z1bmMgKik7Ci0KLSAgIGludAkJKCpHZXRPcGNvZGVTbG90KQkobnZzRnVuYyAqLCBpbnQgbWVyZ2VkKTsKLSAgIHVuc2lnbmVkIGludAkoKkdldE9wY29kZUhXKQkJKG52c0Z1bmMgKiwgaW50IHNsb3QpOwotICAgbnZzT3Bjb2RlCSgqR2V0T3Bjb2RlKQkJKG52c0Z1bmMgKiwgaW50IG1lcmdlZCk7Ci0KLSAgIG52c1ByZWNpc2lvbgkoKkdldFByZWNpc2lvbikJCShudnNGdW5jICopOwotICAgaW50CQkoKkdldFNhdHVyYXRlKQkJKG52c0Z1bmMgKik7Ci0KLSAgIG52c1JlZ0ZpbGUJKCpHZXREZXN0RmlsZSkJCShudnNGdW5jICosIGludCBtZXJnZWQpOwotICAgdW5zaWduZWQgaW50CSgqR2V0RGVzdElEKQkJKG52c0Z1bmMgKiwgaW50IG1lcmdlZCk7Ci0gICB1bnNpZ25lZCBpbnQJKCpHZXREZXN0TWFzaykJCShudnNGdW5jICosIGludCBtZXJnZWQpOwotCi0gICB1bnNpZ25lZCBpbnQJKCpHZXRTb3VyY2VIVykJCShudnNGdW5jICosIGludCBtZXJnZWQsIGludCBwb3MpOwotICAgbnZzUmVnRmlsZQkoKkdldFNvdXJjZUZpbGUpCShudnNGdW5jICosIGludCBtZXJnZWQsIGludCBwb3MpOwotICAgaW50CQkoKkdldFNvdXJjZUlEKQkJKG52c0Z1bmMgKiwgaW50IG1lcmdlZCwgaW50IHBvcyk7Ci0gICBpbnQJCSgqR2V0VGV4SW1hZ2VVbml0KQkobnZzRnVuYyAqKTsKLSAgIGludAkJKCpHZXRTb3VyY2VOZWdhdGUpCShudnNGdW5jICosIGludCBtZXJnZWQsIGludCBwb3MpOwotICAgaW50CQkoKkdldFNvdXJjZUFicykJCShudnNGdW5jICosIGludCBtZXJnZWQsIGludCBwb3MpOwotICAgdm9pZAkJKCpHZXRTb3VyY2VTd2l6emxlKQkobnZzRnVuYyAqLCBpbnQgbWVyZ2VkLCBpbnQgcG9zLAotCSAJCQkJIG52c1N3ekNvbXAgKnN3eik7Ci0gICBpbnQJCSgqR2V0U291cmNlSW5kZXhlZCkJKG52c0Z1bmMgKiwgaW50IG1lcmdlZCwgaW50IHBvcyk7Ci0gICB2b2lkCQkoKkdldFNvdXJjZUNvbnN0VmFsKQkobnZzRnVuYyAqLCBpbnQgbWVyZ2VkLCBpbnQgcG9zLAotCSAJCQkJIGZsb2F0ICp2YWwpOwotICAgaW50CQkoKkdldFNvdXJjZVNjYWxlKQkobnZzRnVuYyAqLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKTsKLQotICAgaW50CQkoKkdldFJlbEFkZHJlc3NSZWdJRCkJKG52c0Z1bmMgKik7Ci0gICBudnNTd3pDb21wCSgqR2V0UmVsQWRkcmVzc1N3aXp6bGUpCShudnNGdW5jICopOwotCi0gICBpbnQJCSgqU3VwcG9ydHNDb25kaXRpb25hbCkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0Q29uZGl0aW9uVXBkYXRlKQkobnZzRnVuYyAqKTsKLSAgIGludAkJKCpHZXRDb25kaXRpb25UZXN0KQkobnZzRnVuYyAqKTsKLSAgIG52c0NvbmQJKCpHZXRDb25kaXRpb24pCQkobnZzRnVuYyAqKTsKLSAgIHZvaWQJCSgqR2V0Q29uZFJlZ1N3aXp6bGUpCShudnNGdW5jICosIG52c1N3ekNvbXAgKnN3eik7Ci0gICBpbnQJCSgqR2V0Q29uZFJlZ0lEKQkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0QnJhbmNoKQkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0QnJhbmNoRWxzZSkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0QnJhbmNoRW5kKQkJKG52c0Z1bmMgKik7Ci0KLSAgIGludAkJKCpHZXRMb29wQ291bnQpCQkobnZzRnVuYyAqKTsKLSAgIGludAkJKCpHZXRMb29wSW5pdGlhbCkJKG52c0Z1bmMgKik7Ci0gICBpbnQJCSgqR2V0TG9vcEluY3JlbWVudCkJKG52c0Z1bmMgKik7Ci19OwotCi1zdGF0aWMgaW5saW5lIG52c1JlZ2lzdGVyCi1udnNOZWdhdGUobnZzUmVnaXN0ZXIgcmVnKQotewotICAgcmVnLm5lZ2F0ZSA9ICFyZWcubmVnYXRlOwotICAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIGlubGluZSBudnNSZWdpc3RlcgotbnZzQWJzKG52c1JlZ2lzdGVyIHJlZykKLXsKLSAgIHJlZy5hYnMgPSAxOwotICAgcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIGlubGluZSBudnNSZWdpc3RlcgotbnZzU3dpenpsZShudnNSZWdpc3RlciByZWcsIG52c1N3ekNvbXAgeCwgbnZzU3d6Q29tcCB5LAotICAgICAgCSAgIG52c1N3ekNvbXAgeiwgbnZzU3d6Q29tcCB3KQotewotICAgbnZzU3d6Q29tcCBzY1s0XSA9IHsgeCwgeSwgeiwgdyB9OwotICAgbnZzU3d6Q29tcCBvY1s0XTsKLSAgIGludCBpOwotCi0gICBmb3IgKGk9MDtpPDQ7aSsrKQotICAgICAgb2NbaV0gPSByZWcuc3dpenpsZVtpXTsKLSAgIGZvciAoaT0wO2k8NDtpKyspCi0gICAgICByZWcuc3dpenpsZVtpXSA9IG9jW3NjW2ldXTsKLSAgIHJldHVybiByZWc7Ci19Ci0KLSNkZWZpbmUgbnZzUHJvZ3JhbUVycm9yKG52cyxmbXQsYXJncy4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmcHJpbnRmKHN0ZGVyciwgIm52c1Byb2dyYW1FcnJvciAoJXMpOiAiZm10LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAotCShudnMpLT5lcnJvciA9IEdMX1RSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKG52cyktPnRyYW5zbGF0ZWQgPSBHTF9GQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUoMCkKLQotZXh0ZXJuIEdMYm9vbGVhbiBudnNVcGRhdGVTaGFkZXIoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cyk7Ci1leHRlcm4gdm9pZCBudnNEaXNhc21IV1NoYWRlcihudnNQdHIpOwotZXh0ZXJuIHZvaWQgbnZzRHVtcEZyYWdtZW50TGlzdChudnNGcmFnbWVudEhlYWRlciAqZiwgaW50IGx2bCk7Ci1leHRlcm4gbm91dmVhdVNoYWRlciAqbnZzQnVpbGRUZXh0U2hhZGVyKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAotICAgICAgCQkJCQkgY29uc3QgY2hhciAqdGV4dCk7Ci0KLWV4dGVybiB2b2lkIE5WMjBWUEluaXRTaGFkZXJGdW5jcyhudnNGdW5jICopOwotZXh0ZXJuIHZvaWQgTlYzMFZQSW5pdFNoYWRlckZ1bmNzKG52c0Z1bmMgKik7Ci1leHRlcm4gdm9pZCBOVjQwVlBJbml0U2hhZGVyRnVuY3MobnZzRnVuYyAqKTsKLQotZXh0ZXJuIHZvaWQgTlYzMEZQSW5pdFNoYWRlckZ1bmNzKG52c0Z1bmMgKik7Ci1leHRlcm4gdm9pZCBOVjQwRlBJbml0U2hhZGVyRnVuY3MobnZzRnVuYyAqKTsKLQotZXh0ZXJuIHZvaWQgbm91dmVhdVNoYWRlckluaXRGdW5jcyhHTGNvbnRleHQgKmN0eCk7Ci0KLWV4dGVybiBHTGJvb2xlYW4gbm91dmVhdV9zaGFkZXJfcGFzczAoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cyk7Ci1leHRlcm4gR0xib29sZWFuIG5vdXZlYXVfc2hhZGVyX3Bhc3MxKG52c1B0ciBudnMpOwotZXh0ZXJuIEdMYm9vbGVhbiBub3V2ZWF1X3NoYWRlcl9wYXNzMihudnNQdHIgbnZzKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zaGFkZXJfMC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlcl8wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjAzY2MuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlcl8wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuIFNrZWdncy4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAotICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLSAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqLwotCi0vKgotICogQXV0aG9yczoKLSAqICAgQmVuIFNrZWdncyA8ZGFya3RhbWFAaWluZXQubmV0LmF1PgotICovCi0KLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgImVudW1zLmgiCi0KLSNpbmNsdWRlICJzaGFkZXIvcHJvZ19pbnN0cnVjdGlvbi5oIgotI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgotI2luY2x1ZGUgInNoYWRlci9wcm9nX3N0YXRldmFycy5oIgotI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtb3B0LmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3NoYWRlci5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbXNnLmgiCi0KLXN0YXRpYyBudnNGaXhlZFJlZyBfdHhfbWVzYV92cF9kc3RfcmVnW1ZFUlRfUkVTVUxUX01BWF0gPSB7Ci0gICBOVlNfRlJfUE9TSVRJT04sIE5WU19GUl9DT0wwLCBOVlNfRlJfQ09MMSwgTlZTX0ZSX0ZPR0NPT1JELAotICAgTlZTX0ZSX1RFWENPT1JEMCwgTlZTX0ZSX1RFWENPT1JEMSwgTlZTX0ZSX1RFWENPT1JEMiwgTlZTX0ZSX1RFWENPT1JEMywKLSAgIE5WU19GUl9URVhDT09SRDQsIE5WU19GUl9URVhDT09SRDUsIE5WU19GUl9URVhDT09SRDYsIE5WU19GUl9URVhDT09SRDcsCi0gICBOVlNfRlJfUE9JTlRTWiwgTlZTX0ZSX0JGQzAsIE5WU19GUl9CRkMxLCBOVlNfRlJfVU5LTk9XTiAvKiBFREdFICovCi19OwotCi1zdGF0aWMgbnZzRml4ZWRSZWcgX3R4X21lc2FfZnBfZHN0X3JlZ1tGUkFHX1JFU1VMVF9NQVhdID0gewotICAgTlZTX0ZSX0ZSQUdEQVRBMCAvKiBDT0xSICovLCBOVlNfRlJfRlJBR0RBVEEwIC8qIENPTEggKi8sCi0gICBOVlNfRlJfVU5LTk9XTiAvKiBERVBSICovCi19OwotCi1zdGF0aWMgbnZzRml4ZWRSZWcgX3R4X21lc2FfZnBfc3JjX3JlZ1tGUkFHX0FUVFJJQl9NQVhdID0gewotICAgTlZTX0ZSX1BPU0lUSU9OLCBOVlNfRlJfQ09MMCwgTlZTX0ZSX0NPTDEsIE5WU19GUl9GT0dDT09SRCwKLSAgIE5WU19GUl9URVhDT09SRDAsIE5WU19GUl9URVhDT09SRDEsIE5WU19GUl9URVhDT09SRDIsIE5WU19GUl9URVhDT09SRDMsCi0gICBOVlNfRlJfVEVYQ09PUkQ0LCBOVlNfRlJfVEVYQ09PUkQ1LCBOVlNfRlJfVEVYQ09PUkQ2LCBOVlNfRlJfVEVYQ09PUkQ3Ci19OwotCi1zdGF0aWMgbnZzU3d6Q29tcCBfdHhfbWVzYV9zd2l6emxlWzRdID0gewotICAgTlZTX1NXWl9YLCBOVlNfU1daX1ksIE5WU19TV1pfWiwgTlZTX1NXWl9XCi19OwotCi1zdGF0aWMgbnZzT3Bjb2RlIF90eF9tZXNhX29wY29kZVtdID0gewotICAgW09QQ09ERV9BQlNdID0gTlZTX09QX0FCUywgW09QQ09ERV9BRERdID0gTlZTX09QX0FERCwKLSAgIFtPUENPREVfQVJBXSA9IE5WU19PUF9BUkEsIFtPUENPREVfQVJMXSA9IE5WU19PUF9BUkwsCi0gICBbT1BDT0RFX0FSTF9OVl0gPSBOVlNfT1BfQVJMLCBbT1BDT0RFX0FSUl0gPSBOVlNfT1BfQVJSLAotICAgW09QQ09ERV9DTVBdID0gTlZTX09QX0NNUCwgW09QQ09ERV9DT1NdID0gTlZTX09QX0NPUywKLSAgIFtPUENPREVfRERYXSA9IE5WU19PUF9ERFgsIFtPUENPREVfRERZXSA9IE5WU19PUF9ERFksCi0gICBbT1BDT0RFX0RQM10gPSBOVlNfT1BfRFAzLCBbT1BDT0RFX0RQNF0gPSBOVlNfT1BfRFA0LAotICAgW09QQ09ERV9EUEhdID0gTlZTX09QX0RQSCwgW09QQ09ERV9EU1RdID0gTlZTX09QX0RTVCwKLSAgIFtPUENPREVfRVgyXSA9IE5WU19PUF9FWDIsIFtPUENPREVfRVhQXSA9IE5WU19PUF9FWFAsCi0gICBbT1BDT0RFX0ZMUl0gPSBOVlNfT1BfRkxSLCBbT1BDT0RFX0ZSQ10gPSBOVlNfT1BfRlJDLAotICAgW09QQ09ERV9LSUxdID0gTlZTX09QX0VNVUwsIFtPUENPREVfS0lMX05WXSA9IE5WU19PUF9LSUwsCi0gICBbT1BDT0RFX0xHMl0gPSBOVlNfT1BfTEcyLCBbT1BDT0RFX0xJVF0gPSBOVlNfT1BfTElULAotICAgW09QQ09ERV9MT0ddID0gTlZTX09QX0xPRywKLSAgIFtPUENPREVfTFJQXSA9IE5WU19PUF9MUlAsCi0gICBbT1BDT0RFX01BRF0gPSBOVlNfT1BfTUFELCBbT1BDT0RFX01BWF0gPSBOVlNfT1BfTUFYLAotICAgW09QQ09ERV9NSU5dID0gTlZTX09QX01JTiwgW09QQ09ERV9NT1ZdID0gTlZTX09QX01PViwKLSAgIFtPUENPREVfTVVMXSA9IE5WU19PUF9NVUwsCi0gICBbT1BDT0RFX1BLMkhdID0gTlZTX09QX1BLMkgsIFtPUENPREVfUEsyVVNdID0gTlZTX09QX1BLMlVTLAotICAgW09QQ09ERV9QSzRCXSA9IE5WU19PUF9QSzRCLCBbT1BDT0RFX1BLNFVCXSA9IE5WU19PUF9QSzRVQiwKLSAgIFtPUENPREVfUE9XXSA9IE5WU19PUF9QT1csIFtPUENPREVfUE9QQV0gPSBOVlNfT1BfUE9QQSwKLSAgIFtPUENPREVfUFVTSEFdID0gTlZTX09QX1BVU0hBLAotICAgW09QQ09ERV9SQ0NdID0gTlZTX09QX1JDQywgW09QQ09ERV9SQ1BdID0gTlZTX09QX1JDUCwKLSAgIFtPUENPREVfUkZMXSA9IE5WU19PUF9SRkwsIFtPUENPREVfUlNRXSA9IE5WU19PUF9SU1EsCi0gICBbT1BDT0RFX1NDU10gPSBOVlNfT1BfU0NTLCBbT1BDT0RFX1NFUV0gPSBOVlNfT1BfU0VRLAotICAgW09QQ09ERV9TRkxdID0gTlZTX09QX1NGTCwgW09QQ09ERV9TR0VdID0gTlZTX09QX1NHRSwKLSAgIFtPUENPREVfU0dUXSA9IE5WU19PUF9TR1QsIFtPUENPREVfU0lOXSA9IE5WU19PUF9TSU4sCi0gICBbT1BDT0RFX1NMRV0gPSBOVlNfT1BfU0xFLCBbT1BDT0RFX1NMVF0gPSBOVlNfT1BfU0xULAotICAgW09QQ09ERV9TTkVdID0gTlZTX09QX1NORSwgW09QQ09ERV9TU0ddID0gTlZTX09QX1NTRywKLSAgIFtPUENPREVfU1RSXSA9IE5WU19PUF9TVFIsIFtPUENPREVfU1VCXSA9IE5WU19PUF9TVUIsCi0gICBbT1BDT0RFX1NXWl0gPSBOVlNfT1BfTU9WLAotICAgW09QQ09ERV9URVhdID0gTlZTX09QX1RFWCwgW09QQ09ERV9UWEJdID0gTlZTX09QX1RYQiwKLSAgIFtPUENPREVfVFhEXSA9IE5WU19PUF9UWEQsCi0gICBbT1BDT0RFX1RYTF0gPSBOVlNfT1BfVFhMLCBbT1BDT0RFX1RYUF0gPSBOVlNfT1BfVFhQLAotICAgW09QQ09ERV9UWFBfTlZdID0gTlZTX09QX1RYUCwKLSAgIFtPUENPREVfVVAySF0gPSBOVlNfT1BfVVAySCwgW09QQ09ERV9VUDJVU10gPSBOVlNfT1BfVVAyVVMsCi0gICBbT1BDT0RFX1VQNEJdID0gTlZTX09QX1VQNEIsIFtPUENPREVfVVA0VUJdID0gTlZTX09QX1VQNFVCLAotICAgW09QQ09ERV9YMkRdID0gTlZTX09QX1gyRCwKLSAgIFtPUENPREVfWFBEXSA9IE5WU19PUF9YUEQKLX07Ci0KLXN0YXRpYyBudnNDb25kIF90eF9tZXNhX2NvbmRtYXNrW10gPSB7Ci0gICBOVlNfQ09ORF9UUiwgLyogd29ya2Fyb3VuZCBtZXNhIG5vdCBmaWxsaW5nIGEgdmFsaWQgdmFsdWUgKi8KLSAgIE5WU19DT05EX0dULCBOVlNfQ09ORF9MVCwgTlZTX0NPTkRfVU4sIE5WU19DT05EX0dFLAotICAgTlZTX0NPTkRfTEUsIE5WU19DT05EX05FLCBOVlNfQ09ORF9ORSwgTlZTX0NPTkRfVFIsIE5WU19DT05EX0ZMCi19OwotCi1zdHJ1Y3QgcGFzczBfcmVjIHsKLSAgIGludCBudnNfaXBvczsKLSAgIGludCBuZXh0X3RlbXA7Ci0KLSAgIGludCBtZXNhX2NvbnN0X2Jhc2U7Ci0gICBpbnQgbWVzYV9jb25zdF9sYXN0OwotCi0gICBpbnQgc3d6Y29uc3RfZG9uZTsKLSAgIGludCBzd3pjb25zdF9pZDsKLSAgIG52c1JlZ2lzdGVyIGNvbnN0X2hhbGY7Ci19OwotCi0jZGVmaW5lIFggTlZTX1NXWl9YCi0jZGVmaW5lIFkgTlZTX1NXWl9ZCi0jZGVmaW5lIFogTlZTX1NXWl9aCi0jZGVmaW5lIFcgTlZTX1NXWl9XCi0KLSNkZWZpbmUgRklMTF9DT05ESVRJT05fRkxBR1MoZnJhZ21lbnQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKGZyYWdtZW50KS0+Y29uZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcGFzczBfbWFrZV9jb25kbWFzayhpbnN0LT5Ec3RSZWcuQ29uZE1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKChmcmFnbWVudCktPmNvbmQgIT0gTlZTX0NPTkRfVFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCShmcmFnbWVudCktPmNvbmRfdGVzdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoZnJhZ21lbnQpLT5jb25kX3JlZyA9IGluc3QtPkNvbmREc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwYXNzMF9tYWtlX3N3aXp6bGUoKGZyYWdtZW50KS0+Y29uZF9zd2l6emxlLCBpbnN0LT5Ec3RSZWcuQ29uZFN3aXp6bGUpO1wKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBBUklUSChvcCxkZXN0LG1hc2ssc2F0LHMwLHMxLHMyKSBkbyB7ICAgICAgICAgICAgICAgXAotCW52c2luc3QgPSBwYXNzMF9lbWl0KG52cywgcGFyZW50LCBmcG9zLCAob3ApLCAgICAgICBcCi0JCSAgIChkZXN0KSwgKG1hc2spLCAoc2F0KSwgKHMwKSwgKHMxKSwgKHMyKSk7XAotCUZJTExfQ09ORElUSU9OX0ZMQUdTKG52c2luc3QpOyAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgQVJJVEh1KG9wLGRlc3QsbWFzayxzYXQsczAsczEsczIpIGRvIHsgICAgICAgICAgICAgIFwKLQludnNpbnN0ID0gcGFzczBfZW1pdChudnMsIHBhcmVudCwgZnBvcywgKG9wKSwgICAgICAgXAotCQkgICAoZGVzdCksIChtYXNrKSwgKHNhdCksIChzMCksIChzMSksIChzMikpO1wKLX0gd2hpbGUoMCkKLQotc3RhdGljIHZvaWQKLXBhc3MwX2FwcGVuZF9mcmFnbWVudChudnNGcmFnbWVudEhlYWRlciAqcGFyZW50LAotCQkgICAgICBudnNGcmFnbWVudEhlYWRlciAqZnJhZ21lbnQsCi0JCSAgICAgIGludCBwb3MpCi17Ci0JbnZzRnJhZ21lbnRIZWFkZXIgKipoZWFkLCAqKnRhaWw7Ci0JYXNzZXJ0KHBhcmVudCAmJiBmcmFnbWVudCk7Ci0KLQlzd2l0Y2ggKHBhcmVudC0+dHlwZSkgewotCWNhc2UgTlZTX0JSQU5DSDoKLQkJaWYgKHBvcyA9PSAwKSB7Ci0JCQloZWFkID0gJigobnZzQnJhbmNoICopcGFyZW50KS0+dGFyZ2V0X2hlYWQ7Ci0JCQl0YWlsID0gJigobnZzQnJhbmNoICopcGFyZW50KS0+dGFyZ2V0X3RhaWw7Ci0JCX0gZWxzZSB7Ci0JCQloZWFkID0gJigobnZzQnJhbmNoICopcGFyZW50KS0+ZWxzZV9oZWFkOwotCQkJdGFpbCA9ICYoKG52c0JyYW5jaCAqKXBhcmVudCktPmVsc2VfdGFpbDsKLQkJfQotCQlicmVhazsKLQljYXNlIE5WU19MT09QOgotCQloZWFkID0gJigobnZzTG9vcCAqKXBhcmVudCktPmluc25faGVhZDsKLQkJdGFpbCA9ICYoKG52c0xvb3AgKilwYXJlbnQpLT5pbnNuX3RhaWw7Ci0JCWJyZWFrOwotCWNhc2UgTlZTX1NVQlJPVVRJTkU6Ci0JCWhlYWQgPSAmKChudnNTdWJyb3V0aW5lICopcGFyZW50KS0+aW5zbl9oZWFkOwotCQl0YWlsID0gJigobnZzU3Vicm91dGluZSAqKXBhcmVudCktPmluc25fdGFpbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYXNzZXJ0KDApOwotCQlicmVhazsKLQl9Ci0KLQlmcmFnbWVudC0+cGFyZW50ID0gcGFyZW50OwotCWZyYWdtZW50LT5wcmV2ICAgPSAqdGFpbDsKLQlmcmFnbWVudC0+bmV4dCAgID0gTlVMTDsKLQlpZiAoISgqaGVhZCkpCi0JCSpoZWFkID0gZnJhZ21lbnQ7Ci0JZWxzZQotCQkoKnRhaWwpLT5uZXh0ID0gZnJhZ21lbnQ7Ci0JKnRhaWwgPSBmcmFnbWVudDsKLQotfQotCi1zdGF0aWMgbnZzU3Vicm91dGluZSAqCi1wYXNzMF9jcmVhdGVfc3Vicm91dGluZShub3V2ZWF1U2hhZGVyICpudnMsIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCW52c1N1YnJvdXRpbmUgKnN1YjsKLQotCXN1YiA9IENBTExPQ19TVFJVQ1QobnZzX3N1YnJvdXRpbmUpOwotCWlmIChzdWIpIHsKLQkJc3ViLT5oZWFkZXIudHlwZSA9IE5WU19TVUJST1VUSU5FOwotCQlzdWItPmxhYmVsCSA9IHN0cmR1cChsYWJlbCk7Ci0JCWlmICghbnZzLT5wcm9ncmFtX3RyZWUpCi0JCQludnMtPnByb2dyYW1fdHJlZSA9ICZzdWItPmhlYWRlcjsKLQkJZWxzZQotCQkJcGFzczBfYXBwZW5kX2ZyYWdtZW50KG52cy0+cHJvZ3JhbV90cmVlLAotCQkJCQkgICAgICAmc3ViLT5oZWFkZXIsIDApOwotCX0KLQotCXJldHVybiBzdWI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXNzMF9tYWtlX3JlZyhub3V2ZWF1U2hhZGVyICpudnMsIG52c1JlZ2lzdGVyICpyZWcsCi0JICAgICAgIG52c1JlZ0ZpbGUgZmlsZSwgdW5zaWduZWQgaW50IGluZGV4KQotewotCXN0cnVjdCBwYXNzMF9yZWMgKnJlYyA9IG52cy0+cGFzc19yZWM7Ci0KLQkvKiBkZWZhdWx0cyAqLwotCSpyZWcgPSBudnJfdW51c2VkOwotCS8qIC0xID09IHF1aWNrLWFuZC1kaXJ0eSB0ZW1wIGFsbG9jICovCi0JaWYgKGZpbGUgPT0gTlZTX0ZJTEVfVEVNUCAmJiBpbmRleCA9PSAtMSkgewotCQlpbmRleCA9IHJlYy0+bmV4dF90ZW1wKys7Ci0JCWFzc2VydChpbmRleCA8IE5WU19NQVhfVEVNUFMpOwotCX0KLQlyZWctPmZpbGUgICA9IGZpbGU7Ci0JcmVnLT5pbmRleCAgPSBpbmRleDsKLX0KLQotc3RhdGljIHZvaWQKLXBhc3MwX21ha2Vfc3dpenpsZShudnNTd3pDb21wICpzd3osIHVuc2lnbmVkIGludCBtZXNhKQotewotCWludCBpOwotCi0JZm9yIChpPTA7aTw0O2krKykKLQkJc3d6W2ldID0gX3R4X21lc2Ffc3dpenpsZVtHRVRfU1daKG1lc2EsIGkpXTsKLX0KLQotc3RhdGljIG52c09wY29kZQotcGFzczBfbWFrZV9vcGNvZGUoZW51bSBwcm9nX29wY29kZSBvcCkKLXsKLQlpZiAob3AgPiBNQVhfT1BDT0RFKQotCQlyZXR1cm4gTlZTX09QX1VOS05PV047Ci0JcmV0dXJuIF90eF9tZXNhX29wY29kZVtvcF07Ci19Ci0KLXN0YXRpYyBudnNDb25kCi1wYXNzMF9tYWtlX2NvbmRtYXNrKEdMdWludCBtZXNhKQotewotCWlmIChtZXNhID4gQ09ORF9GTCkKLQkJcmV0dXJuIE5WU19DT05EX1VOS05PV047Ci0JcmV0dXJuIF90eF9tZXNhX2NvbmRtYXNrW21lc2FdOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYXNzMF9tYWtlX21hc2soR0x1aW50IG1lc2FfbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlpZiAobWVzYV9tYXNrICYgV1JJVEVNQVNLX1gpIG1hc2sgfD0gU01BU0tfWDsKLQlpZiAobWVzYV9tYXNrICYgV1JJVEVNQVNLX1kpIG1hc2sgfD0gU01BU0tfWTsKLQlpZiAobWVzYV9tYXNrICYgV1JJVEVNQVNLX1opIG1hc2sgfD0gU01BU0tfWjsKLQlpZiAobWVzYV9tYXNrICYgV1JJVEVNQVNLX1cpIG1hc2sgfD0gU01BU0tfVzsKLQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1wYXNzMF9vcGNvZGVfaXNfdGV4KGVudW0gcHJvZ19vcGNvZGUgb3ApCi17Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgT1BDT0RFX1RFWDoKLQljYXNlIE9QQ09ERV9UWEI6Ci0JY2FzZSBPUENPREVfVFhEOgotCWNhc2UgT1BDT0RFX1RYTDoKLQljYXNlIE9QQ09ERV9UWFA6Ci0JCXJldHVybiBHTF9UUlVFOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBHTF9GQUxTRTsKLX0KLQotc3RhdGljIG52c1RleFRhcmdldAotcGFzczBfbWFrZV90ZXhfdGFyZ2V0KEdMdWludCBtZXNhKQotewotCXN3aXRjaCAobWVzYSkgewotCWNhc2UgVEVYVFVSRV8xRF9JTkRFWDogcmV0dXJuIE5WU19URVhfVEFSR0VUXzFEOwotCWNhc2UgVEVYVFVSRV8yRF9JTkRFWDogcmV0dXJuIE5WU19URVhfVEFSR0VUXzJEOwotCWNhc2UgVEVYVFVSRV8zRF9JTkRFWDogcmV0dXJuIE5WU19URVhfVEFSR0VUXzNEOwotCWNhc2UgVEVYVFVSRV9DVUJFX0lOREVYOiByZXR1cm4gTlZTX1RFWF9UQVJHRVRfQ1VCRTsKLQljYXNlIFRFWFRVUkVfUkVDVF9JTkRFWDogcmV0dXJuIE5WU19URVhfVEFSR0VUX1JFQ1Q7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5WU19URVhfVEFSR0VUX1VOS05PV047Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcGFzczBfbWFrZV9kc3RfcmVnKG52c1B0ciBudnMsIG52c1JlZ2lzdGVyICpyZWcsCi0gICAgICAJCSAgIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0KQotewotCXN0cnVjdCBnbF9wcm9ncmFtICptZXNhID0gKHN0cnVjdCBnbF9wcm9ncmFtKikmbnZzLT5tZXNhLnZwOwotCW52c0ZpeGVkUmVnIHNmcjsKLQotCXN3aXRjaCAoZHN0LT5GaWxlKSB7Ci0JY2FzZSBQUk9HUkFNX09VVFBVVDoKLQkJaWYgKG1lc2EtPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpIHsKLQkJCXNmciA9IChkc3QtPkluZGV4IDwgVkVSVF9SRVNVTFRfTUFYKSA/Ci0JCQkJX3R4X21lc2FfdnBfZHN0X3JlZ1tkc3QtPkluZGV4XSA6Ci0JCQkJTlZTX0ZSX1VOS05PV047Ci0JCX0gZWxzZSB7Ci0JCQlzZnIgPSAoZHN0LT5JbmRleCA8IEZSQUdfUkVTVUxUX01BWCkgPwotCQkJCV90eF9tZXNhX2ZwX2RzdF9yZWdbZHN0LT5JbmRleF0gOgotCQkJCU5WU19GUl9VTktOT1dOOwotCQl9Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgcmVnLCBOVlNfRklMRV9SRVNVTFQsIHNmcik7Ci0JCWJyZWFrOwotCWNhc2UgUFJPR1JBTV9URU1QT1JBUlk6Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgcmVnLCBOVlNfRklMRV9URU1QLCBkc3QtPkluZGV4KTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9HUkFNX0FERFJFU1M6Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgcmVnLCBOVlNfRklMRV9BRERSRVNTLCBkc3QtPkluZGV4KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIGRlc3QgZmlsZSAlZFxuIiwgZHN0LT5GaWxlKTsKLQkJYXNzZXJ0KDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXBhc3MwX21ha2Vfc3JjX3JlZyhudnNQdHIgbnZzLCBudnNSZWdpc3RlciAqcmVnLCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNyYykKLXsKLQlzdHJ1Y3QgcGFzczBfcmVjICpyZWMgPSBudnMtPnBhc3NfcmVjOwotCXN0cnVjdCBnbF9wcm9ncmFtICptZXNhID0gKHN0cnVjdCBnbF9wcm9ncmFtICopJm52cy0+bWVzYS52cC5CYXNlOwotCWludCBpOwotCi0JKnJlZyA9IG52cl91bnVzZWQ7Ci0KLQlzd2l0Y2ggKHNyYy0+RmlsZSkgewotCWNhc2UgUFJPR1JBTV9JTlBVVDoKLQkJcmVnLT5maWxlID0gTlZTX0ZJTEVfQVRUUklCOwotCQlpZiAobWVzYS0+VGFyZ2V0ID09IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQikgewotCQkJZm9yIChpPTA7IGk8TlZTX01BWF9BVFRSSUJTOyBpKyspIHsKLQkJCQlpZiAobnZzLT52cF9hdHRyaWJfbWFwW2ldID09IHNyYy0+SW5kZXgpIHsKLQkJCQkJcmVnLT5pbmRleCA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpPT1OVlNfTUFYX0FUVFJJQlMpCi0JCQkJcmVnLT5pbmRleCA9IE5WU19GUl9VTktOT1dOOwotCQl9IGVsc2UgewotCQkJcmVnLT5pbmRleCA9IChzcmMtPkluZGV4IDwgRlJBR19BVFRSSUJfTUFYKSA/Ci0JCQkJX3R4X21lc2FfZnBfc3JjX3JlZ1tzcmMtPkluZGV4XSA6Ci0JCQkJTlZTX0ZSX1VOS05PV047Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQUk9HUkFNX1NUQVRFX1ZBUjoKLQljYXNlIFBST0dSQU1fTkFNRURfUEFSQU06Ci0JY2FzZSBQUk9HUkFNX0NPTlNUQU5UOgotCQlyZWctPmZpbGUgICAgPSBOVlNfRklMRV9DT05TVDsKLQkJcmVnLT5pbmRleCAgID0gc3JjLT5JbmRleCArIHJlYy0+bWVzYV9jb25zdF9iYXNlOwotCQlyZWctPmluZGV4ZWQgPSBzcmMtPlJlbEFkZHI7Ci0JCWlmIChyZWctPmluZGV4ZWQpIHsKLQkJCXJlZy0+YWRkcl9yZWcgID0gMDsKLQkJCXJlZy0+YWRkcl9jb21wID0gTlZTX1NXWl9YOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUFJPR1JBTV9URU1QT1JBUlk6Ci0JCXJlZy0+ZmlsZSAgPSBOVlNfRklMRV9URU1QOwotCQlyZWctPmluZGV4ID0gc3JjLT5JbmRleDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIHNvdXJjZSB0eXBlICVkXG4iLCBzcmMtPkZpbGUpOwotCQlhc3NlcnQoMCk7Ci0JfQotCi0JLyogcGVyLWNvbXBvbmVudCBuZWdhdGUgaGFuZGxlZCBlbHNld2hlcmUgKi8KLQlyZWctPm5lZ2F0ZSA9IHNyYy0+TmVnYXRlQmFzZSAhPSAwOwotCXJlZy0+YWJzICAgID0gc3JjLT5BYnM7Ci0JcGFzczBfbWFrZV9zd2l6emxlKHJlZy0+c3dpenpsZSwgc3JjLT5Td2l6emxlKTsKLX0KLQotc3RhdGljIG52c0luc3RydWN0aW9uICoKLXBhc3MwX2VtaXQobm91dmVhdVNoYWRlciAqbnZzLCBudnNGcmFnbWVudEhlYWRlciAqcGFyZW50LCBpbnQgZnBvcywKLQkgICBudnNPcGNvZGUgb3AsIG52c1JlZ2lzdGVyIGRzdCwKLQkgICB1bnNpZ25lZCBpbnQgbWFzaywgaW50IHNhdHVyYXRlLAotCSAgIG52c1JlZ2lzdGVyIHNyYzAsIG52c1JlZ2lzdGVyIHNyYzEsIG52c1JlZ2lzdGVyIHNyYzIpCi17Ci0JbnZzSW5zdHJ1Y3Rpb24gKnNpZjsKLQotCXNpZiA9IENBTExPQ19TVFJVQ1QobnZzX2luc3RydWN0aW9uKTsKLQlpZiAoIXNpZikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBTZWVtcyBtZXNhIGRvZXNuJ3QgZXhwbGljaXRseSAwIHRoaXMuLiAqLwotCWlmIChudnMtPm1lc2EudnAuQmFzZS5UYXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKQotCQlzYXR1cmF0ZSA9IDA7Ci0KLQlzaWYtPm9wCQk9IG9wOwotCXNpZi0+c2F0dXJhdGUJPSBzYXR1cmF0ZTsKLQlzaWYtPmRlc3QJPSBkc3Q7Ci0Jc2lmLT5tYXNrCT0gbWFzazsKLQlzaWYtPmRlc3Rfc2NhbGUJPSBOVlNfU0NBTEVfMVg7Ci0Jc2lmLT5zcmNbMF0JPSBzcmMwOwotCXNpZi0+c3JjWzFdCT0gc3JjMTsKLQlzaWYtPnNyY1syXQk9IHNyYzI7Ci0Jc2lmLT5jb25kCT0gQ09ORF9UUjsKLQlzaWYtPmNvbmRfcmVnCT0gMDsKLQlzaWYtPmNvbmRfdGVzdAk9IDA7Ci0Jc2lmLT5jb25kX3VwZGF0ZT0gMDsKLQlwYXNzMF9tYWtlX3N3aXp6bGUoc2lmLT5jb25kX3N3aXp6bGUsIFNXSVpaTEVfTk9PUCk7Ci0JcGFzczBfYXBwZW5kX2ZyYWdtZW50KHBhcmVudCwgJnNpZi0+aGVhZGVyLCBmcG9zKTsKLQotCXJldHVybiBzaWY7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXNzMF9maXh1cF9zd2l6emxlKG52c1B0ciBudnMsIG52c0ZyYWdtZW50SGVhZGVyICpwYXJlbnQsIGludCBmcG9zLAotCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzcmMsCi0JCSAgICB1bnNpZ25lZCBpbnQgc20xLAotCQkgICAgdW5zaWduZWQgaW50IHNtMikKLXsKLQlzdGF0aWMgY29uc3QgZmxvYXQgc2NbNF0gPSB7IDEuMCwgMC4wLCAtMS4wLCAwLjAgfTsKLQlzdHJ1Y3QgcGFzczBfcmVjICpyZWMgPSBudnMtPnBhc3NfcmVjOwotCWludCBmaXh1cF8xLCBmaXh1cF8yOwotCW52c0luc3RydWN0aW9uICpudnNpbnN0OwotCW52c1JlZ2lzdGVyIHNyLCBkciA9IG52cl91bnVzZWQ7Ci0JbnZzUmVnaXN0ZXIgc20xY29uc3QsIHNtMmNvbnN0OwotCi0JaWYgKCFyZWMtPnN3emNvbnN0X2RvbmUpIHsKLQkJc3RydWN0IGdsX3Byb2dyYW0gKnByb2cgPSAmbnZzLT5tZXNhLnZwLkJhc2U7Ci0gICAgICAgICAgICAgICAgR0x1aW50IHN3aXp6bGU7Ci0JCXJlYy0+c3d6Y29uc3RfaWQgPSBfbWVzYV9hZGRfdW5uYW1lZF9jb25zdGFudChwcm9nLT5QYXJhbWV0ZXJzLAotCQkJCQkJCSAgICAgIHNjLCA0LCAmc3dpenpsZSk7Ci0gICAgICAgICAgICAgICAgLyogWFhYIHdoYXQgYWJvdXQgc3dpenpsZT8gKi8KLQkJcmVjLT5zd3pjb25zdF9kb25lID0gMTsKLQkJQ09QWV80VihudnMtPnBhcmFtc1tyZWMtPnN3emNvbnN0X2lkXS52YWwsIHNjKTsKLQl9Ci0KLQlmaXh1cF8xID0gKHNtMSAhPSBNQUtFX1NXSVpaTEU0KDAsMCwwLDApICYmCi0JCQlzbTIgIT0gTUFLRV9TV0laWkxFNCgyLDIsMiwyKSk7Ci0JZml4dXBfMiA9IChzbTIgIT0gTUFLRV9TV0laWkxFNCgyLDIsMiwyKSk7Ci0KLQlpZiAoc3JjLT5GaWxlICE9IFBST0dSQU1fVEVNUE9SQVJZICYmIHNyYy0+RmlsZSAhPSBQUk9HUkFNX0lOUFVUKSB7Ci0JCS8qIFdlIGNhbid0IHVzZSBtb3JlIHRoYW4gb25lIGNvbnN0IGluIGFuIGluc3RydWN0aW9uLAotCQkgKiBzbyBtb3ZlIHRoZSBjb25zdCBpbnRvIGEgdGVtcCwgYW5kIHN3aXp6bGUgZnJvbSB0aGVyZS4KLQkJICoKLQkJICogVE9ETzogc2hvdWxkIGp1c3QgZW1pdCB0aGUgc3dpenpsZWQgY29uc3QsIGluc3RlYWQgb2YKLQkJICogICAgICAgc3dpenpsaW5nIGl0IGluIHRoZSBzaGFkZXIuLiB3b3VsZCBuZWVkIHRvIHJlc3dpenpsZQotCQkgKiAgICAgICBhbnkgc3RhdGUgcGFyYW1zIHdoZW4gdGhleSBjaGFuZ2UgaG93ZXZlci4uCi0JCSAqLwotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZkciwgTlZTX0ZJTEVfVEVNUCwgLTEpOwotCQlwYXNzMF9tYWtlX3NyY19yZWcobnZzLCAmc3IsIHNyYyk7Ci0JCUFSSVRIdShOVlNfT1BfTU9WLCBkciwgU01BU0tfQUxMLCAwLAotCQkJCSBzciwgbnZyX3VudXNlZCwgbnZyX3VudXNlZCk7Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgJnNyLCBOVlNfRklMRV9URU1QLCBkci5pbmRleCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZpeHVwXzEpCi0JCQlzcmMtPk5lZ2F0ZUJhc2UgPSAwOwotCQlwYXNzMF9tYWtlX3NyY19yZWcobnZzLCAmc3IsIHNyYyk7Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgJmRyLCBOVlNfRklMRV9URU1QLCAtMSk7Ci0JfQotCi0JcGFzczBfbWFrZV9yZWcobnZzLCAmc20xY29uc3QsIE5WU19GSUxFX0NPTlNULCByZWMtPnN3emNvbnN0X2lkKTsKLQlwYXNzMF9tYWtlX3N3aXp6bGUoc20xY29uc3Quc3dpenpsZSwgc20xKTsKLQlpZiAoZml4dXBfMSAmJiBmaXh1cF8yKSB7Ci0JCS8qIEFueSBjb21iaW5hdGlvbiB3aXRoIFNXSVpaTEVfT05FICovCi0JCXBhc3MwX21ha2VfcmVnKG52cywgJnNtMmNvbnN0LAotCQkJCSAgICBOVlNfRklMRV9DT05TVCwgcmVjLT5zd3pjb25zdF9pZCk7Ci0JCXBhc3MwX21ha2Vfc3dpenpsZShzbTJjb25zdC5zd2l6emxlLCBzbTIpOwotCQlBUklUSHUoTlZTX09QX01BRCwgZHIsIFNNQVNLX0FMTCwgMCwgc3IsIHNtMWNvbnN0LCBzbTJjb25zdCk7Ci0JfSBlbHNlIHsKLQkJLyogU1dJWlpMRV9aRVJPIHx8IGFyYml0cmFyeSBuZWdhdGUgKi8KLQkJQVJJVEh1KE5WU19PUF9NVUwsIGRyLCBTTUFTS19BTEwsIDAsIHNyLCBzbTFjb25zdCwgbnZyX3VudXNlZCk7Ci0JfQotCi0Jc3JjLT5GaWxlCT0gUFJPR1JBTV9URU1QT1JBUlk7Ci0Jc3JjLT5JbmRleAk9IGRyLmluZGV4OwotCXNyYy0+U3dpenpsZQk9IFNXSVpaTEVfTk9PUDsKLX0KLQotI2RlZmluZSBTRVRfU1daKGZzLCBjcCwgYykgZnMgPSAoZnMgJiB+KDB4Nzw8KGNwKjMpKSkgfCAoYzw8KGNwKjMpKQotc3RhdGljIHZvaWQKLXBhc3MwX2NoZWNrX3NvdXJjZXMobnZzUHRyIG52cywgbnZzRnJhZ21lbnRIZWFkZXIgKnBhcmVudCwgaW50IGZwb3MsCi0JCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKLXsKLQl1bnNpZ25lZCBpbnQgaW5zcmMgPSAtMSwgY29uc3RzcmMgPSAtMTsKLQlpbnQgaTsKLQotCWZvciAoaT0wO2k8X21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTtpKyspIHsKLQkJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzcmMgPSAmaW5zdC0+U3JjUmVnW2ldOwotCQl1bnNpZ25lZCBpbnQgc21fMSA9IDAsIHNtXzIgPSAwOwotCQludnNSZWdpc3RlciBzciwgZHI7Ci0JCWludCBkb19tb3YgPSAwLCBjOwotCi0JCS8qIEJ1aWxkIHVwIHN3aXp6bGUgbWFza3MgYXMgaWYgd2Ugd2VyZSBnb2luZyB0byB1c2UKLQkJICogIk1BRCBuZXcsIHNyYywgY29uc3QxLCBjb25zdDIiIHRvIHN1cHBvcnQgYXJiaXRyYXJ5IG5lZ2F0aW9uCi0JCSAqIGFuZCBTV0laWkxFX1pFUk8vU1dJWlpMRV9PTkUuCi0JCSAqLwotCQlmb3IgKGM9MDtjPDQ7YysrKSB7Ci0JCQlpZiAoR0VUX1NXWihzcmMtPlN3aXp6bGUsIGMpID09IFNXSVpaTEVfWkVSTykgewotCQkJCVNFVF9TV1ooc21fMSwgYywgU1dJWlpMRV9ZKTsgLyogMC4wICovCi0JCQkJU0VUX1NXWihzbV8yLCBjLCBTV0laWkxFX1kpOwotCQkJCVNFVF9TV1ooc3JjLT5Td2l6emxlLCBjLCBTV0laWkxFX1gpOwotCQkJfSBlbHNlIGlmIChHRVRfU1daKHNyYy0+U3dpenpsZSwgYykgPT0gU1dJWlpMRV9PTkUpIHsKLQkJCQlTRVRfU1daKHNtXzEsIGMsIFNXSVpaTEVfWSk7Ci0JCQkJaWYgKHNyYy0+TmVnYXRlQmFzZSAmICgxPDxjKSkKLQkJCQkJU0VUX1NXWihzbV8yLCBjLCBTV0laWkxFX1opOyAvKiAtMS4wICovCi0JCQkJZWxzZQotCQkJCQlTRVRfU1daKHNtXzIsIGMsIFNXSVpaTEVfWCk7IC8qIDEuMCAqLwotCQkJCVNFVF9TV1ooc3JjLT5Td2l6emxlLCBjLCBTV0laWkxFX1gpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc3JjLT5OZWdhdGVCYXNlICYgKDE8PGMpKQotCQkJCQlTRVRfU1daKHNtXzEsIGMsIFNXSVpaTEVfWik7IC8qIC1beHl6d10gKi8KLQkJCQllbHNlCi0JCQkJCVNFVF9TV1ooc21fMSwgYywgU1dJWlpMRV9YKTsgLypbeHl6d10qLwotCQkJCVNFVF9TV1ooc21fMiwgYywgU1dJWlpMRV9ZKTsKLQkJCX0KLQkJfQotCi0JCS8qIFVubGVzcyB3ZSdyZSBtdWx0aXBseWluZyBieSAxLjAgb3IgLTEuMCBvbiBhbGwgY29tcG9uZW50cywKLQkJICogYW5kIHdlJ3JlIGFkZGluZyBub3RoaW5nIHRvIGFueSBjb21wb25lbnQgd2UgaGF2ZSB0bwotCQkgKiBlbXVsYXRlIHRoZSBzd2l6emxlLgotCQkgKi8KLQkJaWYgKChzbV8xICE9IE1BS0VfU1dJWlpMRTQoMCwwLDAsMCkgJiYKLQkJCQkJc21fMSAhPSBNQUtFX1NXSVpaTEU0KDIsMiwyLDIpKSB8fAotCQkJCXNtXzIgIT0gTUFLRV9TV0laWkxFNCgxLDEsMSwxKSkgewotCQkJcGFzczBfZml4dXBfc3dpenpsZShudnMsIHBhcmVudCwgZnBvcywgc3JjLCBzbV8xLCBzbV8yKTsKLQkJCS8qIFRoZSBzb3VyY2UgaXMgZGVmaW5pdGVseSBpbiBhIHRlbXAgbm93LCBzbyBkb24ndAotCQkJICogYm90aGVyIGNoZWNraW5nICBmb3IgbXVsdGlwbGUgQVRUUklCL0NPTlNUIHJlZ3MuCi0JCQkgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSFcgY2FuJ3QgdXNlIG1vcmUgdGhhbiBvbmUgQVRUUklCIG9yIFBBUkFNIGluIGEgc2luZ2xlCi0JCSAqIGluc3RydWN0aW9uICovCi0JCXN3aXRjaCAoc3JjLT5GaWxlKSB7Ci0JCWNhc2UgUFJPR1JBTV9JTlBVVDoKLQkJCWlmIChpbnNyYyAhPSAtMSAmJiBpbnNyYyAhPSBzcmMtPkluZGV4KSAKLQkJCQlkb19tb3YgPSAxOwotCQkJZWxzZSBpbnNyYyA9IHNyYy0+SW5kZXg7Ci0JCQlicmVhazsKLQkJY2FzZSBQUk9HUkFNX1NUQVRFX1ZBUjoKLQkJCWlmIChjb25zdHNyYyAhPSAtMSAmJiBjb25zdHNyYyAhPSBzcmMtPkluZGV4KQotCQkJCWRvX21vdiA9IDE7Ci0JCQllbHNlIGNvbnN0c3JjID0gc3JjLT5JbmRleDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBFbWl0IGFueSBleHRyYSBBVFRSSUIvQ09OU1QgdG8gYSB0ZW1wLCBhbmQgbW9kaWZ5IHRoZSBNZXNhCi0JCSAqIGluc3RydWN0aW9uIHRvIHBvaW50IGF0IHRoZSB0ZW1wLgotCQkgKi8KLQkJaWYgKGRvX21vdikgewotCQkJcGFzczBfbWFrZV9zcmNfcmVnKG52cywgJnNyLCBzcmMpOwotCQkJcGFzczBfbWFrZV9yZWcobnZzLCAmZHIsIE5WU19GSUxFX1RFTVAsIC0xKTsKLQkJCXBhc3MwX2VtaXQobnZzLCBwYXJlbnQsIGZwb3MsIE5WU19PUF9NT1YsCi0JCQkJCWRyLCBTTUFTS19BTEwsIDAsCi0JCQkJCXNyLCBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQotCQkJc3JjLT5GaWxlCT0gUFJPR1JBTV9URU1QT1JBUlk7Ci0JCQlzcmMtPkluZGV4CT0gZHIuaW5kZXg7Ci0JCQlzcmMtPlN3aXp6bGU9IFNXSVpaTEVfTk9PUDsKLQkJfQotCX0KLX0KLQotc3RhdGljIEdMYm9vbGVhbgotcGFzczBfZW11bGF0ZV9pbnN0cnVjdGlvbihub3V2ZWF1U2hhZGVyICpudnMsCi0JCQkgIG52c0ZyYWdtZW50SGVhZGVyICpwYXJlbnQsIGludCBmcG9zLAotCQkJICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKLXsKLQludnNGdW5jICpzaGFkZXIgPSBudnMtPmZ1bmM7Ci0JbnZzUmVnaXN0ZXIgc3JjWzNdLCBkZXN0LCB0ZW1wOwotCW52c0luc3RydWN0aW9uICpudnNpbnN0OwotCXVuc2lnbmVkIGludCBtYXNrID0gcGFzczBfbWFrZV9tYXNrKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2spOwotCWludCBpLCBzYXQ7Ci0KLQlzYXQgPSAoaW5zdC0+U2F0dXJhdGVNb2RlID09IFNBVFVSQVRFX1pFUk9fT05FKTsKLQotCS8qIEJ1aWxkIGFsbCB0aGUgInJlYWwiIHJlZ3MgZm9yIHRoZSBpbnN0cnVjdGlvbiAqLwotCWZvciAoaT0wOyBpPF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7IGkrKykKLQkJcGFzczBfbWFrZV9zcmNfcmVnKG52cywgJnNyY1tpXSwgJmluc3QtPlNyY1JlZ1tpXSk7Ci0JaWYgKGluc3QtPk9wY29kZSAhPSBPUENPREVfS0lMKQotCQlwYXNzMF9tYWtlX2RzdF9yZWcobnZzLCAmZGVzdCwgJmluc3QtPkRzdFJlZyk7Ci0KLQlzd2l0Y2ggKGluc3QtPk9wY29kZSkgewotCWNhc2UgT1BDT0RFX0FCUzoKLQkJaWYgKHNoYWRlci0+Y2FwcyAmIFNDQVBfU1JDX0FCUykKLQkJCUFSSVRIKE5WU19PUF9NT1YsIGRlc3QsIG1hc2ssIHNhdCwKLQkJCQkJbnZzQWJzKHNyY1swXSksIG52cl91bnVzZWQsIG52cl91bnVzZWQpOwotCQllbHNlCi0JCQlBUklUSChOVlNfT1BfTUFYLCBkZXN0LCBtYXNrLCBzYXQsCi0JCQkJCXNyY1swXSwgbnZzTmVnYXRlKHNyY1swXSksIG52cl91bnVzZWQpOwotCQlicmVhazsKLQljYXNlIE9QQ09ERV9DTVA6Ci0JCS8qWFhYOiB0aGlzIHdpbGwgY2xvYmJlciBDQzAuLi4gKi8KLQkJQVJJVEggKE5WU19PUF9NT1YsIGRlc3QsIG1hc2ssIHNhdCwKLQkJCQlzcmNbMl0sIG52cl91bnVzZWQsIG52cl91bnVzZWQpOwotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZ0ZW1wLCBOVlNfRklMRV9URU1QLCAtMSk7Ci0JCUFSSVRIdShOVlNfT1BfTU9WLCB0ZW1wLCBTTUFTS19BTEwsIDAsCi0JCQkJc3JjWzBdLCBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQkJbnZzaW5zdC0+Y29uZF91cGRhdGUgPSAxOwotCQludnNpbnN0LT5jb25kX3JlZyAgICA9IDA7Ci0JCUFSSVRIIChOVlNfT1BfTU9WLCBkZXN0LCBtYXNrLCBzYXQsCi0JCQkJc3JjWzFdLCBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQkJbnZzaW5zdC0+Y29uZCAgICAgID0gQ09ORF9MVDsKLQkJbnZzaW5zdC0+Y29uZF9yZWcgID0gMDsKLQkJbnZzaW5zdC0+Y29uZF90ZXN0ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBPUENPREVfRFBIOgotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZ0ZW1wLCBOVlNfRklMRV9URU1QLCAtMSk7Ci0JCUFSSVRIdShOVlNfT1BfRFAzLCB0ZW1wLCBTTUFTS19YLCAwLAotCQkJCSBzcmNbMF0sIHNyY1sxXSwgbnZyX3VudXNlZCk7Ci0JCUFSSVRIIChOVlNfT1BfQURELCBkZXN0LCBtYXNrLCBzYXQsCi0JCQkJIG52c1N3aXp6bGUodGVtcCwgWCwgWCwgWCwgWCksCi0JCQkJIG52c1N3aXp6bGUoc3JjWzFdLCBXLCBXLCBXLCBXKSwKLQkJCQkgbnZyX3VudXNlZCk7Ci0JCWJyZWFrOwotCWNhc2UgT1BDT0RFX0tJTDoKLQkJLyogVGhpcyBpcyBvbmx5IGluIEFSQiBzaGFkZXJzLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSAqIGFib3V0IGNsb2JiZXJpbmcgYSBDQyByZWcgYXMgdGhleSBhcmVuJ3Qgc3VwcG9ydGVkIGFueXdheS4KLQkJICpYWFg6IG1pZ2h0IGhhdmUgdG8gd29ycnkgd2l0aCBHTFNMIGhvd2V2ZXIuLi4KLQkJICovCi0JCS8qIE1PVkMwIHRlbXAsIHNyYyAqLwotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZ0ZW1wLCBOVlNfRklMRV9URU1QLCAtMSk7Ci0JCUFSSVRIdShOVlNfT1BfTU9WLCB0ZW1wLCBTTUFTS19BTEwsIDAsCi0JCQkJIHNyY1swXSwgbnZyX3VudXNlZCwgbnZyX3VudXNlZCk7Ci0JCW52c2luc3QtPmNvbmRfdXBkYXRlID0gMTsKLQkJbnZzaW5zdC0+Y29uZF9yZWcgICAgPSAwOwotCQkvKiBLSUxfTlYgKExUMC54eXp3KSB0ZW1wICovCi0JCUFSSVRIdShOVlNfT1BfS0lMLCBudnJfdW51c2VkLCAwLCAwLAotCQkJCSBudnJfdW51c2VkLCBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQkJbnZzaW5zdC0+Y29uZCAgICAgID0gQ09ORF9MVDsKLQkJbnZzaW5zdC0+Y29uZF9yZWcgID0gMDsKLQkJbnZzaW5zdC0+Y29uZF90ZXN0ID0gMTsKLQkJcGFzczBfbWFrZV9zd2l6emxlKG52c2luc3QtPmNvbmRfc3dpenpsZSwgU1dJWlpMRV9OT09QKTsKLQkJYnJlYWs7Ci0JY2FzZSBPUENPREVfTFJQOgotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZ0ZW1wLCBOVlNfRklMRV9URU1QLCAtMSk7Ci0JCUFSSVRIdShOVlNfT1BfTUFELCB0ZW1wLCBtYXNrLCAwLAotCQkJCSBudnNOZWdhdGUoc3JjWzBdKSwgc3JjWzJdLCBzcmNbMl0pOwotCQlBUklUSCAoTlZTX09QX01BRCwgZGVzdCwgbWFzaywgc2F0LCBzcmNbMF0sIHNyY1sxXSwgdGVtcCk7Ci0JCWJyZWFrOwotCWNhc2UgT1BDT0RFX1BPVzoKLQkJaWYgKHNoYWRlci0+U3VwcG9ydHNPcGNvZGUoc2hhZGVyLCBOVlNfT1BfTEcyKSAmJgotCQkJCXNoYWRlci0+U3VwcG9ydHNPcGNvZGUoc2hhZGVyLCBOVlNfT1BfRVgyKSkgewotCQkJcGFzczBfbWFrZV9yZWcobnZzLCAmdGVtcCwgTlZTX0ZJTEVfVEVNUCwgLTEpOwotCQkJLyogTEcyIHRlbXAueCwgc3JjMC5jICovCi0JCQlBUklUSHUoTlZTX09QX0xHMiwgdGVtcCwgU01BU0tfWCwgMCwKLQkJCQkJIG52c1N3aXp6bGUoc3JjWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkJIG52cl91bnVzZWQsIG52cl91bnVzZWQpOwotCQkJLyogTVVMIHRlbXAueCwgdGVtcC54LCBzcmMxLmMgKi8KLQkJCUFSSVRIdShOVlNfT1BfTVVMLCB0ZW1wLCBTTUFTS19YLCAwLAotCQkJCQkgbnZzU3dpenpsZSh0ZW1wLCBYLCBYLCBYLCBYKSwKLQkJCQkJIG52c1N3aXp6bGUoc3JjWzFdLCBYLCBYLCBYLCBYKSwKLQkJCQkJIG52cl91bnVzZWQpOwotCQkJLyogRVgyIGRlc3QsIHRlbXAueCAqLwotCQkJQVJJVEggKE5WU19PUF9FWDIsIGRlc3QsIG1hc2ssIHNhdCwKLQkJCQkJIG52c1N3aXp6bGUodGVtcCwgWCwgWCwgWCwgWCksCi0JCQkJCSBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGNhbiB3ZSB1c2UgRVhQL0xPRyBpbnN0ZWFkIG9mIEVYMi9MRzI/PyAqLwotCQkJZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgUE9XIGZvciBOVjIwIHZ0eHByb2chXG4iKTsKLQkJCXJldHVybiBHTF9GQUxTRTsKLQkJfQotCQlicmVhazsKLQljYXNlIE9QQ09ERV9SU1E6Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgJnRlbXAsIE5WU19GSUxFX1RFTVAsIC0xKTsKLQkJQVJJVEh1KE5WU19PUF9MRzIsIHRlbXAsIFNNQVNLX1gsIDAsCi0JCQkJIG52c0FicyhudnNTd2l6emxlKHNyY1swXSwgWCwgWCwgWCwgWCkpLAotCQkJCSBudnJfdW51c2VkLCBudnJfdW51c2VkKTsKLQkJbnZzaW5zdC0+ZGVzdF9zY2FsZSA9IE5WU19TQ0FMRV9JTlZfMlg7Ci0JCUFSSVRIIChOVlNfT1BfRVgyLCBkZXN0LCBtYXNrLCBzYXQsCi0JCQkJIG52c05lZ2F0ZShudnNTd2l6emxlKHRlbXAsIFgsIFgsIFgsIFgpKSwKLQkJCQkgbnZyX3VudXNlZCwgbnZyX3VudXNlZCk7Ci0JCWJyZWFrOwotCWNhc2UgT1BDT0RFX1NDUzoKLQkJaWYgKG1hc2sgJiBTTUFTS19YKQotCQkJQVJJVEgoTlZTX09QX0NPUywgZGVzdCwgU01BU0tfWCwgc2F0LAotCQkJCQludnNTd2l6emxlKHNyY1swXSwgWCwgWCwgWCwgWCksCi0JCQkJCW52cl91bnVzZWQsIG52cl91bnVzZWQpOwotCQlpZiAobWFzayAmIFNNQVNLX1kpCi0JCQlBUklUSChOVlNfT1BfU0lOLCBkZXN0LCBTTUFTS19ZLCBzYXQsCi0JCQkJCW52c1N3aXp6bGUoc3JjWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkJbnZyX3VudXNlZCwgbnZyX3VudXNlZCk7Ci0JCWJyZWFrOwotCWNhc2UgT1BDT0RFX1NVQjoKLQkJQVJJVEgoTlZTX09QX0FERCwgZGVzdCwgbWFzaywgc2F0LAotCQkJCXNyY1swXSwgbnZzTmVnYXRlKHNyY1sxXSksIG52cl91bnVzZWQpOwotCQlicmVhazsKLQljYXNlIE9QQ09ERV9YUEQ6Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgJnRlbXAsIE5WU19GSUxFX1RFTVAsIC0xKTsKLQkJQVJJVEh1KE5WU19PUF9NVUwsIHRlbXAsIFNNQVNLX0FMTCwgMCwKLQkJCQkgbnZzU3dpenpsZShzcmNbMF0sIFosIFgsIFksIFkpLAotCQkJCSBudnNTd2l6emxlKHNyY1sxXSwgWSwgWiwgWCwgWCksCi0JCQkJIG52cl91bnVzZWQpOwotCQlBUklUSCAoTlZTX09QX01BRCwgZGVzdCwgKG1hc2sgJiB+U01BU0tfVyksIHNhdCwKLQkJCQkgbnZzU3dpenpsZShzcmNbMF0sIFksIFosIFgsIFgpLAotCQkJCSBudnNTd2l6emxlKHNyY1sxXSwgWiwgWCwgWSwgWSksCi0JCQkJIG52c05lZ2F0ZSh0ZW1wKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVdBUk5fT05DRSgiaHcgZG9lc24ndCBzdXBwb3J0IG9wY29kZSBcIiVzXCIsIgotCQkJICAiYW5kIG5vIGVtdWxhdGlvbiBmb3VuZFxuIiwKLQkJCSAgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpKTsKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCX0KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1wYXNzMF90cmFuc2xhdGVfYXJpdGgobm91dmVhdVNoYWRlciAqbnZzLCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKLQkJCQkJICBpbnQgaXBvcywgaW50IGZwb3MsCi0JCQkJCSAgbnZzRnJhZ21lbnRIZWFkZXIgKnBhcmVudCkKLXsKLQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9ICZwcm9nLT5JbnN0cnVjdGlvbnNbaXBvc107Ci0JbnZzRnVuYyAqc2hhZGVyID0gbnZzLT5mdW5jOwotCW52c0luc3RydWN0aW9uICpudnNpbnN0OwotCUdMYm9vbGVhbiByZXQ7Ci0KLQkvKiBEZWFsIHdpdGggbXVsdGlwbGUgQVRUUklCL1BBUkFNIGluIGEgc2luZ2xlIGluc3RydWN0aW9uICovCi0JcGFzczBfY2hlY2tfc291cmNlcyhudnMsIHBhcmVudCwgZnBvcywgaW5zdCk7Ci0KLQkvKiBOb3cgaXQncyBzYWZlIHRvIGRvIHRoZSBwcm9nX2luc3RydWN0aW9uLT5udnNJbnN0cnVjdGlvbgotCSAqIGNvbnZlcnNpb24KLQkgKi8KLQlpZiAoc2hhZGVyLT5TdXBwb3J0c09wY29kZShzaGFkZXIsCi0JCQkJICAgcGFzczBfbWFrZV9vcGNvZGUoaW5zdC0+T3Bjb2RlKSkpIHsKLQkJbnZzUmVnaXN0ZXIgc3JjWzNdLCBkZXN0OwotCQlpbnQgaTsKLQotCQlmb3IgKGk9MDsgaTxfbWVzYV9udW1faW5zdF9zcmNfcmVncyhpbnN0LT5PcGNvZGUpOyBpKyspCi0JCQlwYXNzMF9tYWtlX3NyY19yZWcobnZzLCAmc3JjW2ldLCAmaW5zdC0+U3JjUmVnW2ldKTsKLQkJcGFzczBfbWFrZV9kc3RfcmVnKG52cywgJmRlc3QsICZpbnN0LT5Ec3RSZWcpOwotCi0JCUFSSVRIKHBhc3MwX21ha2Vfb3Bjb2RlKGluc3QtPk9wY29kZSksIGRlc3QsCi0JCQkJcGFzczBfbWFrZV9tYXNrKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJCShpbnN0LT5TYXR1cmF0ZU1vZGUgIT0gU0FUVVJBVEVfT0ZGKSwKLQkJCQlzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKLQkJbnZzaW5zdC0+dGV4X3VuaXQgICA9IGluc3QtPlRleFNyY1VuaXQ7Ci0JCWlmIChwYXNzMF9vcGNvZGVfaXNfdGV4KGluc3QtPk9wY29kZSkpCi0JCQludnNpbnN0LT50ZXhfdGFyZ2V0ID0KLQkJCQlwYXNzMF9tYWtlX3RleF90YXJnZXQoaW5zdC0+VGV4U3JjVGFyZ2V0KTsKLQkJZWxzZQotCQkJbnZzaW5zdC0+dGV4X3RhcmdldCA9IE5WU19URVhfVEFSR0VUX1VOS05PV047Ci0KLQkJcmV0ID0gR0xfVFJVRTsKLQl9IGVsc2UKLQkJcmV0ID0gcGFzczBfZW11bGF0ZV9pbnN0cnVjdGlvbihudnMsIHBhcmVudCwgZnBvcywgaW5zdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1wYXNzMF90cmFuc2xhdGVfaW5zdHJ1Y3Rpb25zKG5vdXZlYXVTaGFkZXIgKm52cywgaW50IGlwb3MsIGludCBmcG9zLAotCQkJCQkJIG52c0ZyYWdtZW50SGVhZGVyICpwYXJlbnQpCi17Ci0Jc3RydWN0IGdsX3Byb2dyYW0gKnByb2cgPSAoc3RydWN0IGdsX3Byb2dyYW0gKikmbnZzLT5tZXNhLnZwOwotCi0Jd2hpbGUgKDEpIHsKLQkJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSAmcHJvZy0+SW5zdHJ1Y3Rpb25zW2lwb3NdOwotCi0JCXN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7Ci0JCWNhc2UgT1BDT0RFX0VORDoKLQkJCXJldHVybiBHTF9UUlVFOwotCQljYXNlIE9QQ09ERV9CUkE6Ci0JCWNhc2UgT1BDT0RFX0NBTDoKLQkJY2FzZSBPUENPREVfUkVUOgotCQkvL2Nhc2UgT1BDT0RFX0xPT1A6Ci0JCS8vY2FzZSBPUENPREVfRU5ETE9PUDoKLQkJLy9jYXNlIE9QQ09ERV9JRjoKLQkJLy9jYXNlIE9QQ09ERV9FTFNFOgotCQkvL2Nhc2UgT1BDT0RFX0VORElGOgotCQkJV0FSTl9PTkNFKCJicmFuY2ggb3BzIHVuaW1wbGVtZW50ZWRcbiIpOwotCQkJcmV0dXJuIEdMX0ZBTFNFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoIXBhc3MwX3RyYW5zbGF0ZV9hcml0aChudnMsIHByb2csCi0JCQkJCQkgICBpcG9zLCBmcG9zLCBwYXJlbnQpKQotCQkJCXJldHVybiBHTF9GQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaXBvcysrOwotCX0KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi1zdGF0aWMgdm9pZAotcGFzczBfYnVpbGRfYXR0cmliX21hcChub3V2ZWF1U2hhZGVyICpudnMsIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqdnApCi17Ci0JR0x1aW50IGlucHV0c19yZWFkID0gdnAtPkJhc2UuSW5wdXRzUmVhZDsKLQlHTHVpbnQgaW5wdXRfYWxsb2MgPSB+MHhGRkZGOwotCWludCBpOwotCi0JZm9yIChpPTA7IGk8TlZTX01BWF9BVFRSSUJTOyBpKyspCi0JCW52cy0+dnBfYXR0cmliX21hcFtpXSA9IC0xOwotCi0Jd2hpbGUgKGlucHV0c19yZWFkKSB7Ci0JCWludCBpbiA9IGZmcyhpbnB1dHNfcmVhZCkgLSAxOwotCQlpbnQgaHc7Ci0JCWlucHV0c19yZWFkICY9IH4oMTw8aW4pOwotCi0JCWlmICh2cC0+SXNOVlByb2dyYW0pIHsKLQkJCS8qIE5WdnA6IG11c3QgYWxpYXMgKi8KLQkJCWlmIChpbiA+PSBWRVJUX0FUVFJJQl9HRU5FUklDMCkKLQkJCQlodyA9IGluIC0gVkVSVF9BVFRSSUJfR0VORVJJQzA7Ci0JCQllbHNlCi0JCQkJaHcgPSBpbjsKLQkJfSBlbHNlIHsKLQkJCS8qIEFSQnZwOiBtYXkgYWxpYXMgKGJ1dCB3ZSB3b24ndCkKLQkJCSAqIEdMMi4wOiBtdXN0IG5vdCBhbGlhcwotCQkJICovCi0JCQlpZiAoaW4gPj0gVkVSVF9BVFRSSUJfR0VORVJJQzApCi0JCQkJaHcgPSBmZnMofmlucHV0X2FsbG9jKSAtIDE7Ci0JCQllbHNlIAotCQkJCWh3ID0gaW47Ci0JCQlpbnB1dF9hbGxvYyB8PSAoMTw8aHcpOwotCQl9Ci0KLQkJbnZzLT52cF9hdHRyaWJfbWFwW2h3XSA9IGluOwotCX0KLQotCWlmIChOT1VWRUFVX0RFQlVHICYgREVCVUdfU0hBREVSUykgewotCQlwcmludGYoInZ0eHByb2cgYXR0cmliIG1hcDpcbiIpOwotCQlmb3IgKGk9MDsgaTxOVlNfTUFYX0FUVFJJQlM7IGkrKykgewotCQkJcHJpbnRmKCIgaHc6JWQgPSBhdHRyaWI6JWRcbiIsCi0JCQkJCWksIG52cy0+dnBfYXR0cmliX21hcFtpXSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXNzMF92cF9pbnNlcnRfZmZfY2xpcF9wbGFuZXMoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cykKLXsKLQlzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyA9ICZudnMtPm1lc2EudnAuQmFzZTsKLQludnNGcmFnbWVudEhlYWRlciAqcGFyZW50ID0gbnZzLT5wcm9ncmFtX3RyZWU7Ci0JbnZzSW5zdHJ1Y3Rpb24gKm52c2luc3Q7Ci0JR0x1aW50IGZwb3MgPSAwOwotCW52c1JlZ2lzdGVyIG9wb3MsIGVwb3MsIGVxbiwgbXZbNF07Ci0JZ2xfc3RhdGVfaW5kZXggdG9rZW5zW1NUQVRFX0xFTkdUSF0KLSAgICAgICAgICAgPSB7IFNUQVRFX01PREVMVklFV19NQVRSSVgsIDAsIDAsIDAsIDAgfTsKLQlHTGludCBpZDsKLQlpbnQgaTsKLQotCS8qIG1vZGVsdmlldyB0cmFuc2Zvcm0gKi8KLQlwYXNzMF9tYWtlX3JlZyhudnMsICZvcG9zLCBOVlNfRklMRV9BVFRSSUIsIE5WU19GUl9QT1NJVElPTik7Ci0JcGFzczBfbWFrZV9yZWcobnZzLCAmZXBvcywgTlZTX0ZJTEVfVEVNUCAgLCAtMSk7Ci0JZm9yIChpPTA7IGk8NDsgaSsrKSB7Ci0JCXRva2Vuc1syXSA9IHRva2Vuc1szXSA9IGk7Ci0JCWlkID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCB0b2tlbnMpOwotCQlwYXNzMF9tYWtlX3JlZyhudnMsICZtdltpXSwgTlZTX0ZJTEVfQ09OU1QsIGlkKTsKLQl9Ci0JQVJJVEh1KE5WU19PUF9EUDQsIGVwb3MsIFNNQVNLX1gsIDAsIG9wb3MsIG12WzBdLCBudnJfdW51c2VkKTsKLQlBUklUSHUoTlZTX09QX0RQNCwgZXBvcywgU01BU0tfWSwgMCwgb3BvcywgbXZbMV0sIG52cl91bnVzZWQpOwotCUFSSVRIdShOVlNfT1BfRFA0LCBlcG9zLCBTTUFTS19aLCAwLCBvcG9zLCBtdlsyXSwgbnZyX3VudXNlZCk7Ci0JQVJJVEh1KE5WU19PUF9EUDQsIGVwb3MsIFNNQVNLX1csIDAsIG9wb3MsIG12WzNdLCBudnJfdW51c2VkKTsKLQotCS8qIEVtaXQgY29kZSB0byBlbXVsYXRlIGZpeGVkLWZ1bmN0aW9uIGdsQ2xpcFBsYW5lICovCi0JZm9yIChpPTA7IGk8NjsgaSsrKSB7Ci0JCUdMdWludCBjbGlwbWFzayA9IFNNQVNLX1g7Ci0JCW52c1JlZ2lzdGVyIGNsaXA7Ci0KLQkJaWYgKCEoY3R4LT5UcmFuc2Zvcm0uQ2xpcFBsYW5lc0VuYWJsZWQgJiAoMTw8aSkpKQotCQkJY29udGludWU7Ci0KLQkJLyogUG9pbnQgYSBjb25zdCBhdCBhIHVzZXIgY2xpcHBpbmcgcGxhbmUgKi8KLQkJdG9rZW5zWzBdID0gU1RBVEVfQ0xJUFBMQU5FOwotCQl0b2tlbnNbMV0gPSBpOwotCQlpZCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZy0+UGFyYW1ldGVycywgdG9rZW5zKTsKLQkJcGFzczBfbWFrZV9yZWcobnZzLCAmZXFuICwgTlZTX0ZJTEVfQ09OU1QgLCBpZCk7Ci0JCXBhc3MwX21ha2VfcmVnKG52cywgJmNsaXAsIE5WU19GSUxFX1JFU1VMVCwgTlZTX0ZSX0NMSVAwICsgaSk7Ci0KLQkJLypYWFg6IHNvbWV0aGluZyBlbHNlIG5lZWRzIHRvIHRha2UgY2FyZSBvZiBtb2RpZnlpbmcgdGhlCi0JCSAqICAgICBpbnN0cnVjdGlvbnMgdG8gd3JpdGUgdG8gdGhlIGNvcnJlY3QgaHcgY2xpcCByZWdpc3Rlci4KLQkJICovCi0JCXN3aXRjaCAoaSkgewotCQljYXNlIDA6IGNhc2UgMzoJY2xpcG1hc2sgPSBTTUFTS19ZOyBicmVhazsKLQkJY2FzZSAxOiBjYXNlIDQ6IGNsaXBtYXNrID0gU01BU0tfWjsgYnJlYWs7Ci0JCWNhc2UgMjogY2FzZSA1OiBjbGlwbWFzayA9IFNNQVNLX1c7IGJyZWFrOwotCQl9Ci0KLQkJLyogRW1pdCB0cmFuc2Zvcm0gKi8KLQkJQVJJVEh1KE5WU19PUF9EUDQsIGNsaXAsIGNsaXBtYXNrLCAwLCBlcG9zLCBlcW4sIG52cl91bnVzZWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXBhc3MwX3JlYmFzZV9tZXNhX2NvbnN0cyhub3V2ZWF1U2hhZGVyICpudnMpCi17Ci0Jc3RydWN0IHBhc3MwX3JlYyAqcmVjID0gbnZzLT5wYXNzX3JlYzsKLQlzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyA9ICZudnMtPm1lc2EudnAuQmFzZTsKLQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9uczsKLQlpbnQgaTsKLQotCS8qWFhYOiBub3QgYSBnb29kIGlkZWEsIHBhcmFtcy0+aHdfaW5kZXggaXMgbWFsbG9jJ2QgKi8KLQltZW1zZXQobnZzLT5wYXJhbXMsIDB4MDAsIHNpemVvZihudnMtPnBhcmFtcykpOwotCi0JLyogV2hlbiBkb2luZyByZWxhdGl2ZSBhZGRyZXNzaW5nIG9uIGNvbnN0YW50cywgdGhlIGhhcmR3YXJlIG5lZWRzIHVzCi0JICogdG8gZmlsbCB0aGUgImNvbnN0IGlkIiBmaWVsZCB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuICBEZXRlcm1pbmUgdGhlCi0JICogbW9zdCBuZWdhdGl2ZSBpbmRleCB0aGF0IGlzIHVzZWQgc28gdGhhdCBhbGwgYWNjZXNzZXMgdG8gYQotCSAqIG1lc2EtcHJvdmlkZWQgY29uc3RhbnQgY2FuIGJlIHJlYmFzZWQgdG8gYSBwb3NpdGl2ZSBpbmRleC4KLQkgKi8KLQl3aGlsZSAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9FTkQpIHsKLQkJZm9yIChpPTA7IGk8X21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNyYyA9ICZpbnN0LT5TcmNSZWdbaV07Ci0KLQkJCXN3aXRjaCAoc3JjLT5GaWxlKSB7Ci0JCQljYXNlIFBST0dSQU1fU1RBVEVfVkFSOgotCQkJY2FzZSBQUk9HUkFNX0NPTlNUQU5UOgotCQkJY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgotCQkJCWlmIChzcmMtPlJlbEFkZHIgJiYgc3JjLT5JbmRleCA8IDApIHsKLQkJCQkJaW50IGJhc2UgPSBzcmMtPkluZGV4ICogLTE7Ci0JCQkJCWlmIChyZWMtPm1lc2FfY29uc3RfYmFzZSA8IGJhc2UpCi0JCQkJCQlyZWMtPm1lc2FfY29uc3RfYmFzZSA9IGJhc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWluc3QrKzsKLQl9Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4KLXBhc3MwX3Jlc29sdmVfbWVzYV9jb25zdHMobm91dmVhdVNoYWRlciAqbnZzKQotewotCXN0cnVjdCBwYXNzMF9yZWMgKnJlYyA9IG52cy0+cGFzc19yZWM7Ci0Jc3RydWN0IGdsX3Byb2dyYW0gKnByb2cgPSAmbnZzLT5tZXNhLnZwLkJhc2U7Ci0Jc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBsaXN0ID0gcHJvZy0+UGFyYW1ldGVyczsKLQlpbnQgaTsKLQotCS8qIEluaXQgYWxsIGNvbnN0IHRyYWNraW5nL2FsbG9jIGluZm8gZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QsIHJhdGhlcgotCSAqIHRoYW4gZG9pbmcgaXQgYXMgd2UgdHJhbnNsYXRlIHRoZSBwcm9ncmFtLiAgT3RoZXJ3aXNlOgotCSAqICAgMSkgd2UgY2FuJ3QgZ2V0IGF0IHRoZSBjb3JyZWN0IGNvbnN0YW50IGluZm8gd2hlbiByZWxhdGl2ZQotCSAqICAgICAgYWRkcmVzc2luZyBpcyBiZWluZyB1c2VkIGR1ZSB0byBzcmMtPkluZGV4IG5vdCBwb2ludGluZwotCSAqICAgICAgYXQgdGhlIGV4YWN0IGNvbnN0OwotCSAqICAgMikgYXMgd2UgYWRkIGV4dHJhIGNvbnN0cyB0byB0aGUgcHJvZ3JhbSwgbWVzYSB3aWxsIGNhbGwgcmVhbGxvYygpCi0JICogICAgICBhbmQgd2UgZ2V0IGludmFsaWQgcG9pbnRlcnMgdG8gdGhlIGNvbnN0IGRhdGEuCi0JICovCi0JcmVjLT5tZXNhX2NvbnN0X2xhc3QgPSBwbGlzdC0+TnVtUGFyYW1ldGVycyArIHJlYy0+bWVzYV9jb25zdF9iYXNlOwotCW52cy0+cGFyYW1faGlnaCA9IHJlYy0+bWVzYV9jb25zdF9sYXN0OwotCWZvciAoaT0wOyBpPHBsaXN0LT5OdW1QYXJhbWV0ZXJzOyBpKyspIHsKLQkJaW50IGh3ID0gcmVjLT5tZXNhX2NvbnN0X2Jhc2UgKyBpOwotCi0JCWlmIChodyA+IE5WU19NQVhfQ09OU1RTKSB7Ci0JCQludnNQcm9ncmFtRXJyb3IobnZzLCAiaHcgPSAlZCA+IE5WU19NQVhfQ09OU1RTIVxuIiwgaHcpOwotCQkJcmV0dXJuIEdMX0ZBTFNFOwotCQl9Ci0KLQkJc3dpdGNoIChwbGlzdC0+UGFyYW1ldGVyc1tpXS5UeXBlKSB7Ci0JCWNhc2UgUFJPR1JBTV9OQU1FRF9QQVJBTToKLQkJY2FzZSBQUk9HUkFNX1NUQVRFX1ZBUjoKLQkJCW52cy0+cGFyYW1zW2h3XS5pbl91c2UgICAgID0gR0xfVFJVRTsKLQkJCW52cy0+cGFyYW1zW2h3XS5zb3VyY2VfdmFsID0gcGxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXTsKLQkJCUNPUFlfNFYobnZzLT5wYXJhbXNbaHddLnZhbCwgcGxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQUk9HUkFNX0NPTlNUQU5UOgotCQkJbnZzLT5wYXJhbXNbaHddLmluX3VzZSAgICAgPSBHTF9UUlVFOwotCQkJbnZzLT5wYXJhbXNbaHddLnNvdXJjZV92YWwgPSBOVUxMOwotCQkJQ09QWV80VihudnMtPnBhcmFtc1tod10udmFsLCBwbGlzdC0+UGFyYW1ldGVyVmFsdWVzW2ldKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbnZzUHJvZ3JhbUVycm9yKG52cywgImhpdCBiYWQgdHlwZT0lZCBvbiBwYXJhbSAlZFxuIiwKLQkJCQkJcGxpc3QtPlBhcmFtZXRlcnNbaV0uVHlwZSwgaSk7Ci0JCQlyZXR1cm4gR0xfRkFMU0U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotR0xib29sZWFuCi1ub3V2ZWF1X3NoYWRlcl9wYXNzMChHTGNvbnRleHQgKmN0eCwgbm91dmVhdVNoYWRlciAqbnZzKQotewotCW5vdXZlYXVDb250ZXh0UHRyICAgICAgICAgICBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCXN0cnVjdCBnbF9wcm9ncmFtICAgICAgICAgICpwcm9nICA9IChzdHJ1Y3QgZ2xfcHJvZ3JhbSopbnZzOwotCXN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAgICp2cCAgICA9IChzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKilwcm9nOwotCXN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcCAgICA9IChzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqKXByb2c7Ci0Jc3RydWN0IHBhc3MwX3JlYyAqcmVjOwotCWludCByZXQgPSBHTF9GQUxTRTsKLQotCU5WU0RCRygic3RhcnQ6IG52cz0lcFxuIiwgbnZzKTsKLQotCS8qIFByZXZpb3VzbHkgZGV0ZWN0ZWQgYW4gZXJyb3IsIGFuZCBoYXZlbid0IHJlY2lldmVkIG5ldyBwcm9ncmFtCi0JICogc3RyaW5nLCBzbyBmYWlsIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmIChudnMtPmVycm9yKSB7Ci0JCU5WU0RCRygiZmFpbGVkIHByZXZpb3VzIGNvbXBpbGUgYXR0ZW1wdCwgbm90IHJldHJ5aW5nXG4iKTsKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCX0KLQotCXJlYyA9IENBTExPQ19TVFJVQ1QocGFzczBfcmVjKTsKLQlpZiAoIXJlYykKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCi0JcmVjLT5uZXh0X3RlbXAgPSBwcm9nLT5OdW1UZW1wb3JhcmllczsKLQludnMtPnBhc3NfcmVjICA9IHJlYzsKLQkJCi0JbnZzLT5wcm9ncmFtX3RyZWUgPSAobnZzRnJhZ21lbnRIZWFkZXIqKQotCQlwYXNzMF9jcmVhdGVfc3Vicm91dGluZShudnMsICJwcm9ncmFtIGJvZHkiKTsKLQlpZiAoIW52cy0+cHJvZ3JhbV90cmVlKSB7Ci0JCUZSRUUocmVjKTsKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCX0KLQotCXN3aXRjaCAocHJvZy0+VGFyZ2V0KSB7Ci0JY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6Ci0JCW52cy0+ZnVuYyA9ICZubWVzYS0+VlBmdW5jOwotCi0JCWlmICh2cC0+SXNQb3NpdGlvbkludmFyaWFudCkKLQkJCV9tZXNhX2luc2VydF9tdnBfY29kZShjdHgsIHZwKTsKLQkJcGFzczBfcmViYXNlX21lc2FfY29uc3RzKG52cyk7Ci0KLQkJaWYgKCFwcm9nLT5TdHJpbmcgJiYgY3R4LT5UcmFuc2Zvcm0uQ2xpcFBsYW5lc0VuYWJsZWQpCi0JCQlwYXNzMF92cF9pbnNlcnRfZmZfY2xpcF9wbGFuZXMoY3R4LCBudnMpOwotCi0JCXBhc3MwX2J1aWxkX2F0dHJpYl9tYXAobnZzLCB2cCk7Ci0JCWJyZWFrOwotCWNhc2UgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkI6Ci0JCW52cy0+ZnVuYyA9ICZubWVzYS0+RlBmdW5jOwotCi0JCWlmIChmcC0+Rm9nT3B0aW9uICE9IEdMX05PTkUpCi0JCQlfbWVzYV9hcHBlbmRfZm9nX2NvZGUoY3R4LCBmcCk7Ci0JCXBhc3MwX3JlYmFzZV9tZXNhX2NvbnN0cyhudnMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gcHJvZ3JhbSB0eXBlICVkIiwgcHJvZy0+VGFyZ2V0KTsKLQkJRlJFRShyZWMpOwotCQkvKiBERVNUUk9ZIFRSRUUhISAqLwotCQlyZXR1cm4gR0xfRkFMU0U7Ci0JfQotCW52cy0+ZnVuYy0+Y2FyZF9wcml2ID0gJm52cy0+Y2FyZF9wcml2OwotCi0JcmV0ID0gcGFzczBfdHJhbnNsYXRlX2luc3RydWN0aW9ucyhudnMsIDAsIDAsIG52cy0+cHJvZ3JhbV90cmVlKTsKLQlpZiAocmV0KQotCQlyZXQgPSBwYXNzMF9yZXNvbHZlX21lc2FfY29uc3RzKG52cyk7CQotCQotCS8qWFhYOiBpZiAoIXJldCkgREVTVFJPWSBUUkVFISEhICovCi0KLQlGUkVFKHJlYyk7Ci0JcmV0dXJuIHJldDsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlcl8xLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc2hhZGVyXzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTQwMS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc2hhZGVyXzEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgImVudW1zLmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3NoYWRlci5oIgotCi1HTGJvb2xlYW4KLW5vdXZlYXVfc2hhZGVyX3Bhc3MxKG52c1B0ciBudnMpCi17Ci0gICBOVlNEQkcoInN0YXJ0OiBudnM9JXBcbiIsIG52cyk7Ci0KLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zaGFkZXJfMi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlcl8yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjdkYWMuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NoYWRlcl8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBCZW4gU2tlZ2dzLgotICoKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCi0gKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLS8qCi0gKiBBdXRob3JzOgotICogICBCZW4gU2tlZ2dzIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+Ci0gKi8KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAiZW51bXMuaCIKLQotI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgotI2luY2x1ZGUgInNoYWRlci9wcm9nX3ByaW50LmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3NoYWRlci5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbXNnLmgiCi0KLXN0cnVjdCBwYXNzMl9yZWMgewotCS8qIE1hcCBudnNSZWdpc3RlciB0ZW1wIElEIG9udG8gaHcgdGVtcCBJRCAqLwotCXVuc2lnbmVkIGludCB0ZW1wc1tOVlNfTUFYX1RFTVBTXTsKLQkvKiBUcmFjayBmcmVlIGh3IHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGludCBod190ZW1wc1tOVlNfTUFYX1RFTVBTXTsKLX07Ci0KLXN0YXRpYyBpbnQKLXBhc3MyX2FsbG9jX2h3X3RlbXAobnZzUHRyIG52cykKLXsKLQlzdHJ1Y3QgcGFzczJfcmVjICpyZWMgPSBudnMtPnBhc3NfcmVjOwotCWludCBpOwotCi0JZm9yIChpPTA7IGk8bnZzLT5mdW5jLT5NYXhUZW1wOyBpKyspIHsKLQkJLyogVGhpcyBpcyBhICpob3JyaWJsZSogaGFjay4uIFIwIGlzIGJvdGggdGVtcDAgYW5kIHJlc3VsdC5jb2xvcgotCQkgKiBpbiBOVjMwLzQwIGZyYWdwcm9ncywgd2UgY2FuIHVzZSBSMCBhcyBhIHRlbXAgYmVmb3JlIHJlc3VsdAotCQkgKiBpcyB3cml0dGVuIGhvd2V2ZXIuLgotCQkgKi8KLQkJaWYgKG52cy0+bWVzYS52cC5CYXNlLlRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAmJiBpPT0wKQotCQkJY29udGludWU7Ci0JCWlmIChyZWMtPmh3X3RlbXBzW2ldID09IDApIHsKLQkJCXJlYy0+aHdfdGVtcHNbaV0gPSAxOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBudnNSZWdpc3RlcgotcGFzczJfbWFuZ2xlX3JlZyhudnNQdHIgbnZzLCBudnNJbnN0cnVjdGlvbiAqaW5zdCwgbnZzUmVnaXN0ZXIgcmVnKQotewotCXN0cnVjdCBwYXNzMl9yZWMgKnJlYyA9IG52cy0+cGFzc19yZWM7Ci0KLQlpZiAocmVnLmZpbGUgPT0gTlZTX0ZJTEVfVEVNUCkgewotCQlpZiAocmVjLT50ZW1wc1tyZWcuaW5kZXhdID09IC0xKQotCQkJcmVjLT50ZW1wc1tyZWcuaW5kZXhdID0gcGFzczJfYWxsb2NfaHdfdGVtcChudnMpOwotCQlyZWcuaW5kZXggPSByZWMtPnRlbXBzW3JlZy5pbmRleF07Ci0JfQotCi0JcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQKLXBhc3MyX2FkZF9pbnN0cnVjdGlvbihudnNQdHIgbnZzLCBudnNJbnN0cnVjdGlvbiAqaW5zdCwgCi0JCSAgICAgIHN0cnVjdCBfb3BfeGxhdCAqb3AsIGludCBzbG90KQotewotCW52c1N3ekNvbXAgZGVmYXVsdF9zd3pbNF0gPSB7IE5WU19TV1pfWCwgTlZTX1NXWl9ZLAotCQkJCSAgICAgIE5WU19TV1pfWiwgTlZTX1NXWl9XIH07Ci0JbnZzRnVuYyAqc2hhZGVyID0gbnZzLT5mdW5jOwotCW52c1JlZ2lzdGVyIHJlZzsKLQlpbnQgaTsKLQotCXNoYWRlci0+U2V0T3Bjb2RlKHNoYWRlciwgb3AtPk5WLCBzbG90KTsKLQlpZiAoaW5zdC0+c2F0dXJhdGUJKSBzaGFkZXItPlNldFNhdHVyYXRlKHNoYWRlcik7Ci0JaWYgKGluc3QtPmNvbmRfdXBkYXRlCSkgc2hhZGVyLT5TZXRDQ1VwZGF0ZShzaGFkZXIpOwotCWlmIChpbnN0LT5jb25kX3Rlc3QJKSBzaGFkZXItPlNldENvbmRpdGlvbihzaGFkZXIsIDEsIGluc3QtPmNvbmQsCi0JCQkJCQkgICAgICAgaW5zdC0+Y29uZF9yZWcsCi0JCQkJCQkgICAgICAgaW5zdC0+Y29uZF9zd2l6emxlKTsKLQllbHNlCQkJICBzaGFkZXItPlNldENvbmRpdGlvbihzaGFkZXIsIDAsIE5WU19DT05EX1RSLAotCQkJCQkJICAgICAgIDAsCi0JCQkJCQkgICAgICAgZGVmYXVsdF9zd3opOwotCXN3aXRjaCAoaW5zdC0+b3ApIHsKLQljYXNlIE5WU19PUF9URVg6Ci0JY2FzZSBOVlNfT1BfVFhCOgotCWNhc2UgTlZTX09QX1RYTDoKLQljYXNlIE5WU19PUF9UWFA6Ci0JY2FzZSBOVlNfT1BfVFhEOgotCQlzaGFkZXItPlNldFRleEltYWdlVW5pdChzaGFkZXIsIGluc3QtPnRleF91bml0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAob3AtPnNyY3Bvc1tpXSAhPSAtMSkgewotCQkJcmVnID0gcGFzczJfbWFuZ2xlX3JlZyhudnMsIGluc3QsIGluc3QtPnNyY1tpXSk7Ci0KLQkJCXNoYWRlci0+U2V0U291cmNlKHNoYWRlciwgJnJlZywgb3AtPnNyY3Bvc1tpXSk7Ci0KLQkJCWlmIChyZWcuZmlsZSA9PSBOVlNfRklMRV9DT05TVCAmJgotCQkJCQlzaGFkZXItPkdldFNvdXJjZUNvbnN0VmFsKSB7Ci0JCQkJaW50IGlkeF9zbG90ID0KLQkJCQkJbnZzLT5wYXJhbXNbcmVnLmluZGV4XS5od19pbmRleF9jbnQrKzsKLQkJCQludnMtPnBhcmFtc1tyZWcuaW5kZXhdLmh3X2luZGV4ID0gcmVhbGxvYygKLQkJCQkJCW52cy0+cGFyYW1zW3JlZy5pbmRleF0uaHdfaW5kZXgsCi0JCQkJCQlzaXplb2YoaW50KSAqIGlkeF9zbG90KzEpOwotCQkJCW52cy0+cGFyYW1zW3JlZy5pbmRleF0uaHdfaW5kZXhbaWR4X3Nsb3RdID0KLQkJCQkJbnZzLT5wcm9ncmFtX2N1cnJlbnQgKyA0OwotCQkJfQotCQl9Ci0JfQotCi0JcmVnID0gcGFzczJfbWFuZ2xlX3JlZyhudnMsIGluc3QsIGluc3QtPmRlc3QpOwotCXNoYWRlci0+U2V0UmVzdWx0KHNoYWRlciwgJnJlZywgaW5zdC0+bWFzaywgc2xvdCk7Ci0KLQlpZiAoaW5zdC0+ZGVzdF9zY2FsZSAhPSBOVlNfU0NBTEVfMVgpIHsKLQkJc2hhZGVyLT5TZXRSZXN1bHRTY2FsZShzaGFkZXIsIGluc3QtPmRlc3Rfc2NhbGUpOwotCX0KLX0KLQotc3RhdGljIGludAotcGFzczJfYXNzZW1ibGVfaW5zdHJ1Y3Rpb24obnZzUHRyIG52cywgbnZzSW5zdHJ1Y3Rpb24gKmluc3QsIGludCBsYXN0KQotewotCW52c0Z1bmMgKnNoYWRlciA9IG52cy0+ZnVuYzsKLQlzdHJ1Y3QgX29wX3hsYXQgKm9wOwotCXVuc2lnbmVkIGludCBod19pbnN0WzhdOwotCWludCBzbG90OwotCWludCBpbnN0c3o7Ci0JaW50IGk7Ci0KLQlzaGFkZXItPmluc3QgPSBod19pbnN0OwotCi0JLyogQXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLwotCWlmICghKG9wID0gc2hhZGVyLT5HZXRPUFRYRnJvbVNPUChpbnN0LT5vcCwgJnNsb3QpKSkKLQkJcmV0dXJuIDA7Ci0Jc2hhZGVyLT5Jbml0SW5zdHJ1Y3Rpb24oc2hhZGVyKTsKLQlwYXNzMl9hZGRfaW5zdHJ1Y3Rpb24obnZzLCBpbnN0LCBvcCwgc2xvdCk7Ci0JaWYgKGxhc3QpCi0JCXNoYWRlci0+U2V0TGFzdEluc3Qoc2hhZGVyKTsKLQotCWluc3RzeiA9IHNoYWRlci0+R2V0T2Zmc2V0TmV4dChudnMtPmZ1bmMpOwotCWlmIChudnMtPnByb2dyYW1fc2l6ZSArIGluc3RzeiA+PSBudnMtPnByb2dyYW1fYWxsb2Nfc2l6ZSkgewotCQludnMtPnByb2dyYW1fYWxsb2Nfc2l6ZSAqPSAyOwotCQludnMtPnByb2dyYW0gPSByZWFsbG9jKG52cy0+cHJvZ3JhbSwKLQkJCQkgICAgICAgbnZzLT5wcm9ncmFtX2FsbG9jX3NpemUgKgotCQkJCSAgICAgICBzaXplb2YodWludDMyX3QpKTsKLQl9Ci0KLQlmb3IgKGk9MDsgaTxpbnN0c3o7IGkrKykKLQkJbnZzLT5wcm9ncmFtW252cy0+cHJvZ3JhbV9jdXJyZW50KytdID0gaHdfaW5zdFtpXTsKLQludnMtPnByb2dyYW1fc2l6ZSA9IG52cy0+cHJvZ3JhbV9jdXJyZW50OwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgR0xib29sZWFuCi1wYXNzMl90cmFuc2xhdGUobnZzUHRyIG52cywgbnZzRnJhZ21lbnRIZWFkZXIgKmYpCi17Ci0JbnZzRnVuYyAqc2hhZGVyID0gbnZzLT5mdW5jOwotCUdMYm9vbGVhbiBsYXN0OwotCi0Jd2hpbGUgKGYpIHsKLQkJbGFzdCA9IChmID09ICgobnZzU3Vicm91dGluZSopbnZzLT5wcm9ncmFtX3RyZWUpLT5pbnNuX3RhaWwpOwotCi0JCXN3aXRjaCAoZi0+dHlwZSkgewotCQljYXNlIE5WU19JTlNUUlVDVElPTjoKLQkJCWlmICghcGFzczJfYXNzZW1ibGVfaW5zdHJ1Y3Rpb24obnZzLAotCQkJCQkJCShudnNJbnN0cnVjdGlvbiAqKWYsCi0JCQkJCQkJbGFzdCkpCi0JCQkJcmV0dXJuIEdMX0ZBTFNFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXQVJOX09OQ0UoIlVuaW1wbGVtZW50ZWQgZnJhZ21lbnQgdHlwZVxuIik7Ci0JCQlyZXR1cm4gR0xfRkFMU0U7Ci0JCX0KLQotCQlmID0gZi0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotLyogVHJhbnNsYXRlIHByb2dyYW0gaW50byBoYXJkd2FyZSBmb3JtYXQgKi8KLUdMYm9vbGVhbgotbm91dmVhdV9zaGFkZXJfcGFzczIobnZzUHRyIG52cykKLXsKLQlzdHJ1Y3QgcGFzczJfcmVjICpyZWM7Ci0JaW50IGk7Ci0KLQlOVlNEQkcoInN0YXJ0OiBudnM9JXBcbiIsIG52cyk7Ci0KLQlyZWMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwYXNzMl9yZWMpKTsKLQlmb3IgKGk9MDsgaTxOVlNfTUFYX1RFTVBTOyBpKyspCi0JCXJlYy0+dGVtcHNbaV0gPSAtMTsKLQludnMtPnBhc3NfcmVjID0gcmVjOwotCi0JLyogU3RhcnQgb2ZmIHdpdGggYWxsb2NhdGluZyA0IHVpbnQzMl90J3MgZm9yIGVhY2ggaW5zdCwgd2lsbCBiZSBncm93bgotCSAqIGlmIG5lY2Vzc2FyeS4uCi0JICovCi0JbnZzLT5wcm9ncmFtX2FsbG9jX3NpemUgPSBudnMtPm1lc2EudnAuQmFzZS5OdW1JbnN0cnVjdGlvbnMgKiA0OwotCW52cy0+cHJvZ3JhbSA9IGNhbGxvYyhudnMtPnByb2dyYW1fYWxsb2Nfc2l6ZSwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JbnZzLT5wcm9ncmFtX3NpemUgICAgPSAwOwotCW52cy0+cHJvZ3JhbV9jdXJyZW50ID0gMDsKLQotCWlmICghcGFzczJfdHJhbnNsYXRlKG52cywKLQkJCSAgICAgKChudnNTdWJyb3V0aW5lKiludnMtPnByb2dyYW1fdHJlZSktPmluc25faGVhZCkpIHsKLQkJZnJlZShudnMtPnByb2dyYW0pOwotCQludnMtPnByb2dyYW0gPSBOVUxMOwotCQlyZXR1cm4gR0xfRkFMU0U7Ci0JfQotCi0JLyogU2hyaW5rIGFsbG9jYXRlZCBtZW1vcnkgdG8gb25seSB3aGF0IHdlIG5lZWQgKi8KLQludnMtPnByb2dyYW0gPSByZWFsbG9jKG52cy0+cHJvZ3JhbSwKLQkJCSAgICAgICBudnMtPnByb2dyYW1fc2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOwotCW52cy0+cHJvZ3JhbV9hbGxvY19zaXplID0gbnZzLT5wcm9ncmFtX3NpemU7Ci0KLQludnMtPnRyYW5zbGF0ZWQgID0gMTsKLQludnMtPm9uX2hhcmR3YXJlID0gMDsKLQotCWlmIChOT1VWRUFVX0RFQlVHICYgREVCVUdfU0hBREVSUykgewotCQlmZmx1c2goc3Rkb3V0KTsgZmZsdXNoKHN0ZGVycik7Ci0JCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS1NRVNBIFBST0dSQU0gdGFyZ2V0PSVzLCBpZD0weCV4XG4iLAotCQkJCV9tZXNhX2xvb2t1cF9lbnVtX2J5X25yKAotCQkJCQludnMtPm1lc2EudnAuQmFzZS5UYXJnZXQpLAotCQkJCW52cy0+bWVzYS52cC5CYXNlLklkKTsKLQkJZmZsdXNoKHN0ZG91dCk7IGZmbHVzaChzdGRlcnIpOwotCQlfbWVzYV9wcmludF9wcm9ncmFtKCZudnMtPm1lc2EudnAuQmFzZSk7Ci0JCWZmbHVzaChzdGRvdXQpOyBmZmx1c2goc3RkZXJyKTsKLQkJZnByaW50ZihzdGRlcnIsICJeXl5eXl5eXl5eXl5eXl5eTUVTQSBQUk9HUkFNXG4iKTsKLQkJZmZsdXNoKHN0ZG91dCk7IGZmbHVzaChzdGRlcnIpOwotCQlmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS1OViBQUk9HUkFNXG4iKTsKLQkJZmZsdXNoKHN0ZG91dCk7IGZmbHVzaChzdGRlcnIpOwotCQludnNEaXNhc21IV1NoYWRlcihudnMpOwotCQlmZmx1c2goc3Rkb3V0KTsgZmZsdXNoKHN0ZGVycik7Ci0JCWZwcmludGYoc3RkZXJyLCAiXl5eXl5eXl5eXl5eXl5eXk5WIFBST0dSQU1cbiIpOwotCQlmZmx1c2goc3Rkb3V0KTsgZmZsdXNoKHN0ZGVycik7Ci0JfQotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3Bhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNmOWZhLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zcGFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3NwYW4uaCIKLSNpbmNsdWRlICJub3V2ZWF1X2ZpZm8uaCIKLSNpbmNsdWRlICJub3V2ZWF1X2xvY2suaCIKLQotI2luY2x1ZGUgInN3cmFzdC9zd3Jhc3QuaCIKLQotI2RlZmluZSBIQVZFX0hXX0RFUFRIX1NQQU5TCTAKLSNkZWZpbmUgSEFWRV9IV19ERVBUSF9QSVhFTFMJMAotI2RlZmluZSBIQVZFX0hXX1NURU5DSUxfU1BBTlMJMAotI2RlZmluZSBIQVZFX0hXX1NURU5DSUxfUElYRUxTCTAKLQotc3RhdGljIGNoYXIgKmZha2Vfc3BhblsxMjgwKjEwMjQqNF07Ci0KLSNkZWZpbmUgSFdfQ0xJUExPT1AoKQkJCQkJCQlcCi0gICBkbyB7CQkJCQkJCQkJXAotICAgICAgaW50IF9uYyA9IG5tZXNhLT5udW1DbGlwUmVjdHM7CQkJCQlcCi0gICAgICB3aGlsZSAoIF9uYy0tICkgewkJCQkJCQlcCi0JIGludCBtaW54ID0gbm1lc2EtPnBDbGlwUmVjdHNbX25jXS54MSAtIG5tZXNhLT5kcmF3WDsJCVwKLQkgaW50IG1pbnkgPSBubWVzYS0+cENsaXBSZWN0c1tfbmNdLnkxIC0gbm1lc2EtPmRyYXdZOwkJXAotCSBpbnQgbWF4eCA9IG5tZXNhLT5wQ2xpcFJlY3RzW19uY10ueDIgLSBubWVzYS0+ZHJhd1g7CQlcCi0JIGludCBtYXh5ID0gbm1lc2EtPnBDbGlwUmVjdHNbX25jXS55MiAtIG5tZXNhLT5kcmF3WTsKLQotI2RlZmluZSBMT0NBTF9WQVJTCQkJCQkJCVwKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7CQkJXAotICAgbm91dmVhdV9yZW5kZXJidWZmZXIgKm5yYiA9IChub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqKXJiOwkJXAotICAgR0x1aW50IGhlaWdodCA9IG5yYi0+bWVzYS5IZWlnaHQ7CQkJCQlcCi0gICBHTHVieXRlICptYXAgPSAoR0x1Ynl0ZSAqKShucmItPm1hcCA/IG5yYi0+bWFwIDogbnJiLT5tZW0tPm1hcCkgKyAgICBcCi0JIChubWVzYS0+ZHJhd1kgKiBucmItPnBpdGNoKSArIChubWVzYS0+ZHJhd1ggKiBucmItPmNwcCk7ICAgICAgIFwKLSAgIG1hcCA9IGZha2Vfc3BhbjsgXAotICAgR0x1aW50IHA7CQkJCQkJCQlcCi0gICAodm9pZCkgcDsKLQotI2RlZmluZSBZX0ZMSVAoIF95ICkgICAgICAgICAgICAoaGVpZ2h0IC0gX3kgLSAxKQotCi0jZGVmaW5lIEhXX0xPQ0soKQotCi0jZGVmaW5lIEhXX1VOTE9DSygpCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb2xvciBidWZmZXJzCi0gKi8KLQotLyogUkdCNTY1ICovIAotI2RlZmluZSBTUEFOVE1QX1BJWEVMX0ZNVCBHTF9SR0IKLSNkZWZpbmUgU1BBTlRNUF9QSVhFTF9UWVBFIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81Ci0KLSNkZWZpbmUgVEFHKHgpICAgIG5vdXZlYXUjI3gjI19SR0I1NjUKLSNkZWZpbmUgVEFHMih4LHkpIG5vdXZlYXUjI3gjI19SR0I1NjUjI3kKLSNkZWZpbmUgR0VUX1BUUihYLFkpIChtYXAgKyAoWSkqbnJiLT5waXRjaCArIChYKSpucmItPmNwcCkKLSNpbmNsdWRlICJzcGFudG1wMi5oIgotCi0KLS8qIEFSR0I4ODg4ICovCi0jZGVmaW5lIFNQQU5UTVBfUElYRUxfRk1UIEdMX0JHUkEKLSNkZWZpbmUgU1BBTlRNUF9QSVhFTF9UWVBFIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgotCi0jZGVmaW5lIFRBRyh4KSAgICBub3V2ZWF1IyN4IyNfQVJHQjg4ODgKLSNkZWZpbmUgVEFHMih4LHkpIG5vdXZlYXUjI3gjI19BUkdCODg4OCMjeQotI2RlZmluZSBHRVRfUFRSKFgsWSkgKG1hcCArIChZKSpucmItPnBpdGNoICsgKFgpKm5yYi0+Y3BwKQotI2luY2x1ZGUgInNwYW50bXAyLmgiCi0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1U3BhblJlbmRlclN0YXJ0KCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgRklSRV9SSU5HKCk7Ci0gICBMT0NLX0hBUkRXQVJFKG5tZXNhKTsKLSAgIG5vdXZlYXVXYWl0Rm9ySWRsZUxvY2tlZCggbm1lc2EgKTsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVTcGFuUmVuZGVyRmluaXNoKCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgX3N3cmFzdF9mbHVzaCggY3R4ICk7Ci0gICBub3V2ZWF1V2FpdEZvcklkbGVMb2NrZWQoIG5tZXNhICk7Ci0gICBVTkxPQ0tfSEFSRFdBUkUoIG5tZXNhICk7Ci19Ci0KLXZvaWQgbm91dmVhdVNwYW5Jbml0RnVuY3Rpb25zKCBHTGNvbnRleHQgKmN0eCApCi17Ci0gICBzdHJ1Y3Qgc3dyYXN0X2RldmljZV9kcml2ZXIgKnN3ZGQgPSBfc3dyYXN0X0dldERldmljZURyaXZlclJlZmVyZW5jZShjdHgpOwotICAgc3dkZC0+U3BhblJlbmRlclN0YXJ0CT0gbm91dmVhdVNwYW5SZW5kZXJTdGFydDsKLSAgIHN3ZGQtPlNwYW5SZW5kZXJGaW5pc2gJPSBub3V2ZWF1U3BhblJlbmRlckZpbmlzaDsKLX0KLQotCi0vKioKLSAqIFBsdWcgaW4gdGhlIEdldC9QdXQgcm91dGluZXMgZm9yIHRoZSBnaXZlbiBkcmlSZW5kZXJidWZmZXIuCi0gKi8KLXZvaWQKLW5vdXZlYXVTcGFuU2V0RnVuY3Rpb25zKG5vdXZlYXVfcmVuZGVyYnVmZmVyICpucmIsIGNvbnN0IEdMdmlzdWFsICp2aXMpCi17Ci0gICBpZiAobnJiLT5tZXNhLl9BY3R1YWxGb3JtYXQgPT0gR0xfUkdCQTgpCi0gICAgICBub3V2ZWF1SW5pdFBvaW50ZXJzX0FSR0I4ODg4KCZucmItPm1lc2EpOwotICAgZWxzZSAvLyBpZiAobnJiLT5tZXNhLl9BY3R1YWxGb3JtYXQgPT0gR0xfUkdCNSkKLSAgICAgIG5vdXZlYXVJbml0UG9pbnRlcnNfUkdCNTY1KCZucmItPm1lc2EpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NwYW4uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zcGFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzllY2QuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3NwYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLSNpZm5kZWYgX19OT1VWRUFVX1NQQU5fSF9fCi0jZGVmaW5lIF9fTk9VVkVBVV9TUEFOX0hfXwotCi0jaW5jbHVkZSAiZHJpcmVuZGVyYnVmZmVyLmgiCi0jaW5jbHVkZSAibm91dmVhdV9idWZmZXJzLmgiCi0KLWV4dGVybiB2b2lkIG5vdXZlYXVTcGFuSW5pdEZ1bmN0aW9ucyggR0xjb250ZXh0ICpjdHggKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVTcGFuU2V0RnVuY3Rpb25zKG5vdXZlYXVfcmVuZGVyYnVmZmVyICpucmIsIGNvbnN0IEdMdmlzdWFsICp2aXMpOwotCi0jZW5kaWYgLyogX19OT1VWRUFVX1NQQU5fSF9fICovCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MThkY2YuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IEplcmVteSBLb2xiCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKLWxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCi10aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQotU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotRVJJQyBBTkhPTFQgT1IgU0lMSUNPTiBJTlRFR1JBVEVEIFNZU1RFTVMgQ09SUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQotVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3N0YXRlLmgiCi0jaW5jbHVkZSAibm91dmVhdV9zd3RjbC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotI2luY2x1ZGUgInRubC90bmwuaCIKLSNpbmNsdWRlICJzd3Jhc3Rfc2V0dXAvc3dyYXN0X3NldHVwLmgiCi0KLSNpbmNsdWRlICJ0bmwvdF9waXBlbGluZS5oIgotCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAiY29sb3JtYWMuaCIKLQotc3RhdGljIF9faW5saW5lX18gR0x1aW50IG5vdXZlYXVQYWNrQ29sb3IoR0x1aW50IGZvcm1hdCwKLQkJCQkgICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCi0JCQkJICAgICAgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhKQotewotICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBQQUNLX0NPTE9SXzU2NSggciwgZywgYiApOwotICAgY2FzZSA0OgotICAgICAgcmV0dXJuIFBBQ0tfQ09MT1JfODg4OCggciwgZywgYiwgYSk7Ci0gICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGZvcm1hdCAlZFxuIiwgKGludClmb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdXZlYXVDYWxjVmlld3BvcnQoR0xjb250ZXh0ICpjdHgpCi17Ci0gICAgLyogQ2FsY3VsYXRlIHRoZSBWaWV3cG9ydCBNYXRyaXggKi8KLSAgICAKLSAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgIGNvbnN0IEdMZmxvYXQgKnYgPSBjdHgtPlZpZXdwb3J0Ll9XaW5kb3dNYXAubTsKLSAgICBHTGZsb2F0ICptID0gbm1lc2EtPnZpZXdwb3J0Lm07Ci0gICAgR0xmbG9hdCB4b2Zmc2V0ID0gbm1lc2EtPmRyYXdYLCB5b2Zmc2V0ID0gbm1lc2EtPmRyYXdZICsgbm1lc2EtPmRyYXdIOwotICAKLSAgICBubWVzYS0+ZGVwdGhfc2NhbGUgPSAxLjAgLyBjdHgtPkRyYXdCdWZmZXItPl9EZXB0aE1heEY7Ci0KLSAgICBtW01BVF9TWF0gPSAgIHZbTUFUX1NYXTsKLSAgICBtW01BVF9UWF0gPSAgIHZbTUFUX1RYXSArIHhvZmZzZXQgKyBTVUJQSVhFTF9YOwotICAgIG1bTUFUX1NZXSA9IC0gdltNQVRfU1ldOwotICAgIG1bTUFUX1RZXSA9ICgtdltNQVRfVFldKSArIHlvZmZzZXQgKyBTVUJQSVhFTF9ZOwotICAgIG1bTUFUX1NaXSA9ICAgdltNQVRfU1pdICogbm1lc2EtPmRlcHRoX3NjYWxlOwotICAgIG1bTUFUX1RaXSA9ICAgdltNQVRfVFpdICogbm1lc2EtPmRlcHRoX3NjYWxlOwotCi0gICAgbm1lc2EtPmh3X2Z1bmMuV2luZG93TW92ZWQobm1lc2EpOwotfQotCi1zdGF0aWMgdm9pZCBub3V2ZWF1Vmlld3BvcnQoR0xjb250ZXh0ICpjdHgsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgIC8qIAotICAgICAqIE5lZWQgdG8gc2VuZCAoYXQgbGVhc3Qgb24gYW4gbnYzNSB0aGUgZm9sbG93aW5nOgotICAgICAqIGNvbnMgPSA0ICh0aGlzIG1heSBiZSBieXRlcyBwZXIgcGl4ZWwpCi0gICAgICoKLSAgICAgKiBUaGUgdmlld3BvcnQ6Ci0gICAgICogNDQ1ICAgMHgwMDAwYmVlMCAgIHtzaXplOiAweDAgICBjaGFubmVsOiAweDEgICBjbWQ6IDB4MDAwMDllZTB9IDwtLSBWSUVXUE9SVF9TRVRVUC9IRUFERVIgPwotICAgICAqIDQ0NiAgIDB4MDAwMDAwMDAgICB7c2l6ZTogMHgwICAgY2hhbm5lbDogMHgwICAgY21kOiAweDAwMDAwMDAwfSA8LS0geCAqIGNvbnMKLSAgICAgKiA0NDcgICAweDAwMDAwYzgwICAge3NpemU6IDB4MCAgIGNoYW5uZWw6IDB4MCAgIGNtZDogMHgwMDAwMGM4MH0gPC0tIChoZWlnaHQgKyB4KSAqIGNvbnMKLSAgICAgKiA0NDggICAweDAwMDAwMDAwICAge3NpemU6IDB4MCAgIGNoYW5uZWw6IDB4MCAgIGNtZDogMHgwMDAwMDAwMH0gPC0tIHkgKiBjb25zCi0gICAgICogNDQ5ICAgMHgwMDAwMDk2MCAgIHtzaXplOiAweDAgICBjaGFubmVsOiAweDAgICBjbWQ6IDB4MDAwMDA5NjB9IDwtLSAod2lkdGggKyB5KSAqIGNvbnMKLSAgICAgKiA0NGEgICAweDAwMDgyYTAwICAge3NpemU6IDB4MiAgIGNoYW5uZWw6IDB4MSAgIGNtZDogMHgwMDAwMGEwMH0gPC0tIFZJRVdQT1JUX0RJTVMKLSAgICAgKiA0NGIgICAweDA0MDAwMDAwICA8LS0gKFdpZHRoX2Zyb21fZ2xWaWV3cG9ydCA8PCAxNikgfCB4Ci0gICAgICogNDRjICAgMHgwMzAwMDAwMCAgPC0tIChIZWlnaHRfZnJvbV9nbFZpZXdwb3J0IDw8IDE2KSB8ICh3aW5faGVpZ2h0IC0gaGVpZ2h0IC0geSkKLSAgICAgKgotICAgICAqLwotICAgIAotICAgIG5vdXZlYXVDYWxjVmlld3BvcnQoY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgbm91dmVhdURlcHRoUmFuZ2UoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIG5lYXIsIEdMY2xhbXBkIGZhcikKLXsKLSAgICBub3V2ZWF1Q2FsY1ZpZXdwb3J0KGN0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdXZlYXVERFVwZGF0ZUhXU3RhdGUoR0xjb250ZXh0ICpjdHgpCi17Ci0gICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLSAgICBpbnQgbmV3X3N0YXRlID0gbm1lc2EtPm5ld19zdGF0ZTsKLQotICAgIGlmICggbmV3X3N0YXRlIHx8IG5tZXNhLT5uZXdfcmVuZGVyX3N0YXRlICYgX05FV19URVhUVVJFICkKLSAgICB7Ci0gICAgICAgIG5tZXNhLT5uZXdfc3RhdGUgPSAwOwotCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgdmFyaW91cyBwYXJ0cyBvZiB0aGUgY29udGV4dCdzIHN0YXRlLgotICAgICAgICAqLwotICAgICAgICAvKgotICAgICAgICBpZiAoIG5ld19zdGF0ZSAmIE5PVVZFQVVfTkVXX0FMUEhBICkKLSAgICAgICAgICAgIG5vdXZlYXVVcGRhdGVBbHBoYU1vZGUoIGN0eCApOwotCi0gICAgICAgIGlmICggbmV3X3N0YXRlICYgTk9VVkVBVV9ORVdfREVQVEggKQotICAgICAgICAgICAgbm91dmVhdVVwZGF0ZVpNb2RlKCBjdHggKTsKLQotICAgICAgICBpZiAoIG5ld19zdGF0ZSAmIE5PVVZFQVVfTkVXX0ZPRyApCi0gICAgICAgICAgICBub3V2ZWF1VXBkYXRlRm9nQXR0cmliKCBjdHggKTsKLQotICAgICAgICBpZiAoIG5ld19zdGF0ZSAmIE5PVVZFQVVfTkVXX0NMSVAgKQotICAgICAgICAgICAgbm91dmVhdVVwZGF0ZUNsaXBwaW5nKCBjdHggKTsKLQotICAgICAgICBpZiAoIG5ld19zdGF0ZSAmIE5PVVZFQVVfTkVXX0NVTEwgKQotICAgICAgICAgICAgbm91dmVhdVVwZGF0ZUN1bGwoIGN0eCApOwotCi0gICAgICAgIGlmICggbmV3X3N0YXRlICYgTk9VVkVBVV9ORVdfTUFTS1MgKQotICAgICAgICAgICAgbm91dmVhdVVwZGF0ZU1hc2tzKCBjdHggKTsKLQotICAgICAgICBpZiAoIG5ld19zdGF0ZSAmIE5PVVZFQVVfTkVXX1dJTkRPVyApCi0gICAgICAgICAgICBub3V2ZWF1VXBkYXRlV2luZG93KCBjdHggKTsKLQotICAgICAgICBpZiAoIG5tZXNhLT5uZXdfcmVuZGVyX3N0YXRlICYgX05FV19URVhUVVJFICkgewotICAgICAgICAgICAgbm91dmVhdVVwZGF0ZVRleHR1cmVTdGF0ZSggY3R4ICk7Ci0gICAgICAgIH0qLwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbm91dmVhdURESW52YWxpZGF0ZVN0YXRlKEdMY29udGV4dCAqY3R4LCBHTHVpbnQgbmV3X3N0YXRlKQotewotICAgIF9zd3Jhc3RfSW52YWxpZGF0ZVN0YXRlKCBjdHgsIG5ld19zdGF0ZSApOwotICAgIF9zd3NldHVwX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgICBfdmJvX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgICBfdG5sX0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKLSAgICBOT1VWRUFVX0NPTlRFWFQoY3R4KS0+bmV3X3JlbmRlcl9zdGF0ZSB8PSBuZXdfc3RhdGU7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGNvbnRleHQncyBoYXJkd2FyZSBzdGF0ZS4gKi8KLXZvaWQgbm91dmVhdURESW5pdFN0YXRlKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotICAgIHVpbnQzMl90IHR5cGUgPSBubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlOwotICAgIHN3aXRjaCh0eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBOVl8wMzoKLSAgICAgICAgICAgIC8qIFVuaW1wbGVtZW50ZWQgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WXzA0OgotICAgICAgICBjYXNlIE5WXzA1OgotICAgICAgICAgICAgbnYwNEluaXRTdGF0ZUZ1bmNzKG5tZXNhLT5nbEN0eCwgJm5tZXNhLT5nbEN0eC0+RHJpdmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WXzEwOgotICAgICAgICBjYXNlIE5WXzExOgotICAgICAgICBjYXNlIE5WXzE3OgotICAgICAgICAgICAgbnYxMEluaXRTdGF0ZUZ1bmNzKG5tZXNhLT5nbEN0eCwgJm5tZXNhLT5nbEN0eC0+RHJpdmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WXzIwOgotICAgICAgICAgICAgbnYyMEluaXRTdGF0ZUZ1bmNzKG5tZXNhLT5nbEN0eCwgJm5tZXNhLT5nbEN0eC0+RHJpdmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WXzMwOgotICAgICAgICBjYXNlIE5WXzQwOgotICAgICAgICBjYXNlIE5WXzQ0OgotICAgICAgICAgICAgbnYzMEluaXRTdGF0ZUZ1bmNzKG5tZXNhLT5nbEN0eCwgJm5tZXNhLT5nbEN0eC0+RHJpdmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5WXzUwOgotICAgICAgICAgICAgbnY1MEluaXRTdGF0ZUZ1bmNzKG5tZXNhLT5nbEN0eCwgJm5tZXNhLT5nbEN0eC0+RHJpdmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5vdXZlYXVfc3RhdGVfY2FjaGVfaW5pdChubWVzYSk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGRyaXZlcidzIHN0YXRlIGZ1bmN0aW9ucyAqLwotdm9pZCBub3V2ZWF1RERJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCkKLXsKLSAgIGN0eC0+RHJpdmVyLlVwZGF0ZVN0YXRlCQk9IG5vdXZlYXVEREludmFsaWRhdGVTdGF0ZTsKLQotICAgY3R4LT5Ecml2ZXIuQ2xlYXJJbmRleAkJPSBOVUxMOwotICAgY3R4LT5Ecml2ZXIuQ2xlYXJDb2xvcgkJPSBOVUxMOyAvL25vdXZlYXVERENsZWFyQ29sb3I7Ci0gICBjdHgtPkRyaXZlci5DbGVhclN0ZW5jaWwJCT0gTlVMTDsgLy9ub3V2ZWF1RERDbGVhclN0ZW5jaWw7Ci0gICBjdHgtPkRyaXZlci5EcmF3QnVmZmVyCQk9IE5VTEw7IC8vbm91dmVhdURERHJhd0J1ZmZlcjsKLSAgIGN0eC0+RHJpdmVyLlJlYWRCdWZmZXIJCT0gTlVMTDsgLy9ub3V2ZWF1RERSZWFkQnVmZmVyOwotCi0gICBjdHgtPkRyaXZlci5JbmRleE1hc2sJCT0gTlVMTDsKLSAgIGN0eC0+RHJpdmVyLkNvbG9yTWFzawkJPSBOVUxMOyAvL25vdXZlYXVERENvbG9yTWFzazsKLSAgIGN0eC0+RHJpdmVyLkFscGhhRnVuYwkJPSBOVUxMOyAvL25vdXZlYXVEREFscGhhRnVuYzsKLSAgIGN0eC0+RHJpdmVyLkJsZW5kRXF1YXRpb25TZXBhcmF0ZQk9IE5VTEw7IC8vbm91dmVhdUREQmxlbmRFcXVhdGlvblNlcGFyYXRlOwotICAgY3R4LT5Ecml2ZXIuQmxlbmRGdW5jU2VwYXJhdGUJPSBOVUxMOyAvL25vdXZlYXVEREJsZW5kRnVuY1NlcGFyYXRlOwotICAgY3R4LT5Ecml2ZXIuQ2xlYXJEZXB0aAkJPSBOVUxMOyAvL25vdXZlYXVERENsZWFyRGVwdGg7Ci0gICBjdHgtPkRyaXZlci5DdWxsRmFjZQkJCT0gTlVMTDsgLy9ub3V2ZWF1RERDdWxsRmFjZTsKLSAgIGN0eC0+RHJpdmVyLkZyb250RmFjZQkJPSBOVUxMOyAvL25vdXZlYXVEREZyb250RmFjZTsKLSAgIGN0eC0+RHJpdmVyLkRlcHRoRnVuYwkJPSBOVUxMOyAvL25vdXZlYXVERERlcHRoRnVuYzsKLSAgIGN0eC0+RHJpdmVyLkRlcHRoTWFzawkJPSBOVUxMOyAvL25vdXZlYXVERERlcHRoTWFzazsKLSAgIGN0eC0+RHJpdmVyLkVuYWJsZQkJCT0gTlVMTDsgLy9ub3V2ZWF1RERFbmFibGU7Ci0gICBjdHgtPkRyaXZlci5Gb2dmdgkJCT0gTlVMTDsgLy9ub3V2ZWF1RERGb2dmdjsKLSAgIGN0eC0+RHJpdmVyLkhpbnQJCQk9IE5VTEw7Ci0gICBjdHgtPkRyaXZlci5MaWdodGZ2CQkJPSBOVUxMOwotICAgY3R4LT5Ecml2ZXIuTGlnaHRNb2RlbGZ2CQk9IE5VTEw7IC8vbm91dmVhdURETGlnaHRNb2RlbGZ2OwotICAgY3R4LT5Ecml2ZXIuTG9naWNPcGNvZGUJCT0gTlVMTDsgLy9ub3V2ZWF1RERMb2dpY09wQ29kZTsKLSAgIGN0eC0+RHJpdmVyLlBvbHlnb25Nb2RlCQk9IE5VTEw7Ci0gICBjdHgtPkRyaXZlci5Qb2x5Z29uU3RpcHBsZQkJPSBOVUxMOyAvL25vdXZlYXVERFBvbHlnb25TdGlwcGxlOwotICAgY3R4LT5Ecml2ZXIuUmVuZGVyTW9kZQkJPSBOVUxMOyAvL25vdXZlYXVERFJlbmRlck1vZGU7Ci0gICBjdHgtPkRyaXZlci5TY2lzc29yCQkJPSBOVUxMOyAvL25vdXZlYXVERFNjaXNzb3I7Ci0gICBjdHgtPkRyaXZlci5TaGFkZU1vZGVsCQk9IE5VTEw7IC8vbm91dmVhdUREU2hhZGVNb2RlbDsKLSAgIGN0eC0+RHJpdmVyLlN0ZW5jaWxGdW5jU2VwYXJhdGUJPSBOVUxMOyAvL25vdXZlYXVERFN0ZW5jaWxGdW5jU2VwYXJhdGU7Ci0gICBjdHgtPkRyaXZlci5TdGVuY2lsTWFza1NlcGFyYXRlCT0gTlVMTDsgLy9ub3V2ZWF1RERTdGVuY2lsTWFza1NlcGFyYXRlOwotICAgY3R4LT5Ecml2ZXIuU3RlbmNpbE9wU2VwYXJhdGUJPSBOVUxMOyAvL25vdXZlYXVERFN0ZW5jaWxPcFNlcGFyYXRlOwotCi0gICBjdHgtPkRyaXZlci5EZXB0aFJhbmdlICAgICAgICAgICAgICAgPSBub3V2ZWF1RGVwdGhSYW5nZTsKLSAgIGN0eC0+RHJpdmVyLlZpZXdwb3J0ICAgICAgICAgICAgICAgICA9IG5vdXZlYXVWaWV3cG9ydDsKLQotICAgLyogUGl4ZWwgcGF0aCBmYWxsYmFja3MuCi0gICAgKi8KLSAgIGN0eC0+RHJpdmVyLkFjY3VtID0gX3N3cmFzdF9BY2N1bTsKLSAgIGN0eC0+RHJpdmVyLkJpdG1hcCA9IF9zd3Jhc3RfQml0bWFwOwotICAgY3R4LT5Ecml2ZXIuQ29weVBpeGVscyA9IF9zd3Jhc3RfQ29weVBpeGVsczsKLSAgIGN0eC0+RHJpdmVyLkRyYXdQaXhlbHMgPSBfc3dyYXN0X0RyYXdQaXhlbHM7Ci0gICBjdHgtPkRyaXZlci5SZWFkUGl4ZWxzID0gX3N3cmFzdF9SZWFkUGl4ZWxzOwotCi0gICAvKiBTd3Jhc3QgaG9va3MgZm9yIGltYWdpbmcgZXh0ZW5zaW9uczoKLSAgICAqLwotICAgY3R4LT5Ecml2ZXIuQ29weUNvbG9yVGFibGUgPSBfc3dyYXN0X0NvcHlDb2xvclRhYmxlOwotICAgY3R4LT5Ecml2ZXIuQ29weUNvbG9yU3ViVGFibGUgPSBfc3dyYXN0X0NvcHlDb2xvclN1YlRhYmxlOwotICAgY3R4LT5Ecml2ZXIuQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQgPSBfc3dyYXN0X0NvcHlDb252b2x1dGlvbkZpbHRlcjFEOwotICAgY3R4LT5Ecml2ZXIuQ29weUNvbnZvbHV0aW9uRmlsdGVyMkQgPSBfc3dyYXN0X0NvcHlDb252b2x1dGlvbkZpbHRlcjJEOwotfQotCi0jZGVmaW5lIFNUQVRFX0lOSVQoYSkgaWYgKGN0eC0+RHJpdmVyLmEpIGN0eC0+RHJpdmVyLmEKLQotdm9pZCBub3V2ZWF1SW5pdFN0YXRlKEdMY29udGV4dCAqY3R4KQotewotICAgIC8qCi0gICAgICogTWVzYSBzaG91bGQgZG8gdGhpcyBmb3IgdXM6Ci0gICAgICovCi0KLSAgICBTVEFURV9JTklUKEFscGhhRnVuYykoIGN0eCwgCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkFscGhhRnVuYywKLSAgICAgICAgICAgIGN0eC0+Q29sb3IuQWxwaGFSZWYpOwotCi0gICAgU1RBVEVfSU5JVChCbGVuZENvbG9yKSggY3R4LAotICAgICAgICAgICAgY3R4LT5Db2xvci5CbGVuZENvbG9yICk7Ci0KLSAgICBTVEFURV9JTklUKEJsZW5kRXF1YXRpb25TZXBhcmF0ZSkoIGN0eCwgCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkJsZW5kRXF1YXRpb25SR0IsCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkJsZW5kRXF1YXRpb25BKTsKLQotICAgIFNUQVRFX0lOSVQoQmxlbmRGdW5jU2VwYXJhdGUpKCBjdHgsCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkJsZW5kU3JjUkdCLAotICAgICAgICAgICAgY3R4LT5Db2xvci5CbGVuZERzdFJHQiwKLSAgICAgICAgICAgIGN0eC0+Q29sb3IuQmxlbmRTcmNBLAotICAgICAgICAgICAgY3R4LT5Db2xvci5CbGVuZERzdEEpOwotCi0gICAgU1RBVEVfSU5JVChDbGVhckNvbG9yKSggY3R4LCBjdHgtPkNvbG9yLkNsZWFyQ29sb3IpOwotICAgIFNUQVRFX0lOSVQoQ2xlYXJEZXB0aCkoIGN0eCwgY3R4LT5EZXB0aC5DbGVhcik7Ci0gICAgU1RBVEVfSU5JVChDbGVhclN0ZW5jaWwpKCBjdHgsIGN0eC0+U3RlbmNpbC5DbGVhcik7Ci0KLSAgICBTVEFURV9JTklUKENvbG9yTWFzaykoIGN0eCwgCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkNvbG9yTWFza1tSQ09NUF0sCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkNvbG9yTWFza1tHQ09NUF0sCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkNvbG9yTWFza1tCQ09NUF0sCi0gICAgICAgICAgICBjdHgtPkNvbG9yLkNvbG9yTWFza1tBQ09NUF0pOwotCi0gICAgU1RBVEVfSU5JVChDdWxsRmFjZSkoIGN0eCwgY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZSApOwotICAgIFNUQVRFX0lOSVQoRGVwdGhGdW5jKSggY3R4LCBjdHgtPkRlcHRoLkZ1bmMgKTsKLSAgICBTVEFURV9JTklUKERlcHRoTWFzaykoIGN0eCwgY3R4LT5EZXB0aC5NYXNrICk7Ci0KLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfQUxQSEFfVEVTVCwgY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfQkxFTkQsIGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX0NPTE9SX0xPR0lDX09QLCBjdHgtPkNvbG9yLkNvbG9yTG9naWNPcEVuYWJsZWQgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfQ09MT1JfU1VNLCBjdHgtPkZvZy5Db2xvclN1bUVuYWJsZWQgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfQ1VMTF9GQUNFLCBjdHgtPlBvbHlnb24uQ3VsbEZsYWcgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfREVQVEhfVEVTVCwgY3R4LT5EZXB0aC5UZXN0ICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX0RJVEhFUiwgY3R4LT5Db2xvci5EaXRoZXJGbGFnICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX0ZPRywgY3R4LT5Gb2cuRW5hYmxlZCApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9MSUdIVElORywgY3R4LT5MaWdodC5FbmFibGVkICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX0xJTkVfU01PT1RILCBjdHgtPkxpbmUuU21vb3RoRmxhZyApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9MSU5FX1NUSVBQTEUsIGN0eC0+TGluZS5TdGlwcGxlRmxhZyApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9QT0lOVF9TTU9PVEgsIGN0eC0+UG9pbnQuU21vb3RoRmxhZyApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9QT0xZR09OX09GRlNFVF9GSUxMLCBjdHgtPlBvbHlnb24uT2Zmc2V0RmlsbCk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUsIGN0eC0+UG9seWdvbi5PZmZzZXRMaW5lKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQsIGN0eC0+UG9seWdvbi5PZmZzZXRQb2ludCk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX1BPTFlHT05fU01PT1RILCBjdHgtPlBvbHlnb24uU21vb3RoRmxhZyApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9QT0xZR09OX1NUSVBQTEUsIGN0eC0+UG9seWdvbi5TdGlwcGxlRmxhZyApOwotICAgIFNUQVRFX0lOSVQoRW5hYmxlKSggY3R4LCBHTF9TQ0lTU09SX1RFU1QsIGN0eC0+U2Npc3Nvci5FbmFibGVkICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX1NURU5DSUxfVEVTVCwgY3R4LT5TdGVuY2lsLkVuYWJsZWQgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfVEVYVFVSRV8xRCwgR0xfRkFMU0UgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfVEVYVFVSRV8yRCwgR0xfRkFMU0UgKTsKLSAgICBTVEFURV9JTklUKEVuYWJsZSkoIGN0eCwgR0xfVEVYVFVSRV9SRUNUQU5HTEVfTlYsIEdMX0ZBTFNFICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX1RFWFRVUkVfM0QsIEdMX0ZBTFNFICk7Ci0gICAgU1RBVEVfSU5JVChFbmFibGUpKCBjdHgsIEdMX1RFWFRVUkVfQ1VCRV9NQVAsIEdMX0ZBTFNFICk7Ci0KLSAgICBTVEFURV9JTklUKEZvZ2Z2KSggY3R4LCBHTF9GT0dfQ09MT1IsIGN0eC0+Rm9nLkNvbG9yICk7Ci0gICAgU1RBVEVfSU5JVChGb2dmdikoIGN0eCwgR0xfRk9HX01PREUsIDAgKTsKLSAgICBTVEFURV9JTklUKEZvZ2Z2KSggY3R4LCBHTF9GT0dfREVOU0lUWSwgJmN0eC0+Rm9nLkRlbnNpdHkgKTsKLSAgICBTVEFURV9JTklUKEZvZ2Z2KSggY3R4LCBHTF9GT0dfU1RBUlQsICZjdHgtPkZvZy5TdGFydCApOwotICAgIFNUQVRFX0lOSVQoRm9nZnYpKCBjdHgsIEdMX0ZPR19FTkQsICZjdHgtPkZvZy5FbmQgKTsKLQotICAgIFNUQVRFX0lOSVQoRnJvbnRGYWNlKSggY3R4LCBjdHgtPlBvbHlnb24uRnJvbnRGYWNlICk7Ci0KLSAgICB7Ci0gICAgICAgIEdMZmxvYXQgZiA9IChHTGZsb2F0KWN0eC0+TGlnaHQuTW9kZWwuQ29sb3JDb250cm9sOwotICAgICAgICBTVEFURV9JTklUKExpZ2h0TW9kZWxmdikoIGN0eCwgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCwgJmYgKTsKLSAgICB9Ci0KLSAgICBTVEFURV9JTklUKExpbmVTdGlwcGxlKSggY3R4LCBjdHgtPkxpbmUuU3RpcHBsZUZhY3RvciwgY3R4LT5MaW5lLlN0aXBwbGVQYXR0ZXJuICk7Ci0gICAgU1RBVEVfSU5JVChMaW5lV2lkdGgpKCBjdHgsIGN0eC0+TGluZS5XaWR0aCApOwotICAgIFNUQVRFX0lOSVQoTG9naWNPcGNvZGUpKCBjdHgsIGN0eC0+Q29sb3IuTG9naWNPcCApOwotICAgIFNUQVRFX0lOSVQoUG9pbnRTaXplKSggY3R4LCBjdHgtPlBvaW50LlNpemUgKTsKLSAgICBTVEFURV9JTklUKFBvbHlnb25Nb2RlKSggY3R4LCBHTF9GUk9OVCwgY3R4LT5Qb2x5Z29uLkZyb250TW9kZSApOwotICAgIFNUQVRFX0lOSVQoUG9seWdvbk1vZGUpKCBjdHgsIEdMX0JBQ0ssIGN0eC0+UG9seWdvbi5CYWNrTW9kZSApOwotICAgIFNUQVRFX0lOSVQoUG9seWdvbk9mZnNldCkoIGN0eCwKLQkgICAgY3R4LT5Qb2x5Z29uLk9mZnNldEZhY3RvciwKLQkgICAgY3R4LT5Qb2x5Z29uLk9mZnNldFVuaXRzICk7Ci0gICAgU1RBVEVfSU5JVChQb2x5Z29uU3RpcHBsZSkoIGN0eCwgKGNvbnN0IEdMdWJ5dGUgKiljdHgtPlBvbHlnb25TdGlwcGxlICk7Ci0gICAgU1RBVEVfSU5JVChTaGFkZU1vZGVsKSggY3R4LCBjdHgtPkxpZ2h0LlNoYWRlTW9kZWwgKTsKLSAgICBTVEFURV9JTklUKFN0ZW5jaWxGdW5jU2VwYXJhdGUpKCBjdHgsIEdMX0ZST05ULAotICAgICAgICAgICAgY3R4LT5TdGVuY2lsLkZ1bmN0aW9uWzBdLAotICAgICAgICAgICAgY3R4LT5TdGVuY2lsLlJlZlswXSwKLSAgICAgICAgICAgIGN0eC0+U3RlbmNpbC5WYWx1ZU1hc2tbMF0gKTsKLSAgICBTVEFURV9JTklUKFN0ZW5jaWxGdW5jU2VwYXJhdGUpKCBjdHgsIEdMX0JBQ0ssCi0gICAgICAgICAgICBjdHgtPlN0ZW5jaWwuRnVuY3Rpb25bMV0sCi0gICAgICAgICAgICBjdHgtPlN0ZW5jaWwuUmVmWzFdLAotICAgICAgICAgICAgY3R4LT5TdGVuY2lsLlZhbHVlTWFza1sxXSApOwotICAgIFNUQVRFX0lOSVQoU3RlbmNpbE1hc2tTZXBhcmF0ZSkoIGN0eCwgR0xfRlJPTlQsIGN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMF0gKTsKLSAgICBTVEFURV9JTklUKFN0ZW5jaWxNYXNrU2VwYXJhdGUpKCBjdHgsIEdMX0JBQ0ssIGN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMV0gKTsKLSAgICBTVEFURV9JTklUKFN0ZW5jaWxPcFNlcGFyYXRlKSggY3R4LCBHTF9GUk9OVCwKLSAgICAgICAgICAgIGN0eC0+U3RlbmNpbC5GYWlsRnVuY1swXSwKLSAgICAgICAgICAgIGN0eC0+U3RlbmNpbC5aRmFpbEZ1bmNbMF0sCi0gICAgICAgICAgICBjdHgtPlN0ZW5jaWwuWlBhc3NGdW5jWzBdKTsKLSAgICBTVEFURV9JTklUKFN0ZW5jaWxPcFNlcGFyYXRlKSggY3R4LCBHTF9CQUNLLAotICAgICAgICAgICAgY3R4LT5TdGVuY2lsLkZhaWxGdW5jWzFdLAotICAgICAgICAgICAgY3R4LT5TdGVuY2lsLlpGYWlsRnVuY1sxXSwKLSAgICAgICAgICAgIGN0eC0+U3RlbmNpbC5aUGFzc0Z1bmNbMV0pOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhYzcxNy4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNiBKZXJlbXkgS29sYgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTk9VVkVBVV9TVEFURV9IX18KLSNkZWZpbmUgX19OT1VWRUFVX1NUQVRFX0hfXwotCi0jaW5jbHVkZSAibm91dmVhdV9jb250ZXh0LmgiCi0KLWV4dGVybiB2b2lkIG5vdXZlYXVEREluaXRTdGF0ZShub3V2ZWF1Q29udGV4dFB0ciBubWVzYSk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1RERJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCk7Ci0KLWV4dGVybiB2b2lkIG52MDRJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKTsKLWV4dGVybiB2b2lkIG52MTBJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKTsKLWV4dGVybiB2b2lkIG52MjBJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKTsKLWV4dGVybiB2b2lkIG52MzBJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKTsKLWV4dGVybiB2b2lkIG52NTBJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKTsKLQotZXh0ZXJuIHZvaWQgbm91dmVhdUluaXRTdGF0ZShHTGNvbnRleHQgKmN0eCk7Ci0KLS8qCi1leHRlcm4gdm9pZCBub3V2ZWF1RERVcGRhdGVTdGF0ZShHTGNvbnRleHQgKmN0eCk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1RERVcGRhdGVIV1N0YXRlKEdMY29udGV4dCAqY3R4KTsKLQotZXh0ZXJuIHZvaWQgbm91dmVhdUVtaXRId1N0YXRlTG9ja2VkKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKTsKLSovCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlX2NhY2hlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3RhdGVfY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0YjlkMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3RhdGVfY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLQotI2luY2x1ZGUgIm5vdXZlYXVfc3RhdGVfY2FjaGUuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotCi0jZGVmaW5lIEJFR0lOX1JJTkdfTk9GTFVTSChzdWJjaGFubmVsLHRhZyxzaXplKSBkbyB7CQkJCQlcCi0JaWYgKG5tZXNhLT5maWZvLmZyZWUgPD0gKHNpemUpKQkJCQkJCQlcCi0JCVdBSVRfUklORyhubWVzYSwoc2l6ZSkpOwkJCQkJCVwKLQlPVVRfUklORyggKChzaXplKTw8MTgpIHwgKChzdWJjaGFubmVsKSA8PCAxMykgfCAodGFnKSk7CQkJCVwKLQlubWVzYS0+Zmlmby5mcmVlIC09ICgoc2l6ZSkgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX13aGlsZSgwKQotCi0vLyBmbHVzaCBhbGwgdGhlIGRpcnR5IHN0YXRlCi12b2lkIG5vdXZlYXVfc3RhdGVfY2FjaGVfZmx1c2gobm91dmVhdUNvbnRleHRQdHIgbm1lc2EpCi17Ci0JaW50IGk9MDsKLQlpbnQgcnVuPTA7Ci0KLQkvLyBmYXN0LXBhdGggbm8gc3RhdGUgY2hhbmdlcwotCWlmICghbm1lc2EtPnN0YXRlX2NhY2hlLmRpcnR5KQotCQlyZXR1cm47Ci0Jbm1lc2EtPnN0YXRlX2NhY2hlLmRpcnR5PTA7Ci0KLQlkbwotCXsKLQkJLy8ganVtcCB0byBhIGRpcnR5IHN0YXRlCi0JCXdoaWxlKChubWVzYS0+c3RhdGVfY2FjaGUuaGRpcnR5W2kvTk9VVkVBVV9TVEFURV9DQUNIRV9ISUVSX1NJWkVdPT0wKSYmKGk8Tk9VVkVBVV9TVEFURV9DQUNIRV9FTlRSSUVTKSkKLQkJCWk9KGkmfihOT1VWRUFVX1NUQVRFX0NBQ0hFX0hJRVJfU0laRS0xKSkrTk9VVkVBVV9TVEFURV9DQUNIRV9ISUVSX1NJWkU7Ci0JCXdoaWxlKChubWVzYS0+c3RhdGVfY2FjaGUuYXRvbXNbaV0uZGlydHk9PTApJiYoaTxOT1VWRUFVX1NUQVRFX0NBQ0hFX0VOVFJJRVMpKQotCQkJaSsrOwotCi0JCS8vIGZpZ3VyZSBvdXQgYSBydW4gb2YgZGlydHkgdmFsdWVzCi0JCXJ1bj0wOwotCQl3aGlsZSgobm1lc2EtPnN0YXRlX2NhY2hlLmF0b21zW2krcnVuXS5kaXJ0eSkmJihpK3J1bjxOT1VWRUFVX1NUQVRFX0NBQ0hFX0VOVFJJRVMpKQotCQkJcnVuKys7Ci0KLQkJLy8gb3V0cHV0IGV2ZXJ5dGhpbmcgYXMgYSBzaW5nbGUgcnVuCi0JCWlmIChydW4+MCkgewotCQkJaW50IGo7Ci0KLQkJCUJFR0lOX1JJTkdfTk9GTFVTSChOdlN1YjNELCBpKjQsIHJ1bik7Ci0JCQlmb3Ioaj0wO2o8cnVuO2orKykKLQkJCXsKLQkJCQlPVVRfUklORyhubWVzYS0+c3RhdGVfY2FjaGUuYXRvbXNbaStqXS52YWx1ZSk7Ci0JCQkJbm1lc2EtPnN0YXRlX2NhY2hlLmF0b21zW2kral0uZGlydHk9MDsKLQkJCQlpZiAoKGkraiklTk9VVkVBVV9TVEFURV9DQUNIRV9ISUVSX1NJWkU9PTApCi0JCQkJCW5tZXNhLT5zdGF0ZV9jYWNoZS5oZGlydHlbKGkraikvTk9VVkVBVV9TVEFURV9DQUNIRV9ISUVSX1NJWkUtMV09MDsKLQkJCX0KLQkJCWkrPXJ1bjsKLQkJfQotCX0KLQl3aGlsZShpPE5PVVZFQVVfU1RBVEVfQ0FDSEVfRU5UUklFUyk7Ci0Jbm1lc2EtPnN0YXRlX2NhY2hlLmhkaXJ0eVtOT1VWRUFVX1NUQVRFX0NBQ0hFX0hJRVJfU0laRS9OT1VWRUFVX1NUQVRFX0NBQ0hFX0hJRVJfU0laRS0xXT0wOwotfQotCi0KLS8vIGluaXRzIHRoZSBzdGF0ZSBjYWNoZQotdm9pZCBub3V2ZWF1X3N0YXRlX2NhY2hlX2luaXQobm91dmVhdUNvbnRleHRQdHIgbm1lc2EpCi17Ci0JaW50IGk7Ci0JZm9yKGk9MDtpPE5PVVZFQVVfU1RBVEVfQ0FDSEVfRU5UUklFUztpKyspCi0JewotCQlubWVzYS0+c3RhdGVfY2FjaGUuYXRvbXNbaV0uZGlydHk9MDsKLQkJbm1lc2EtPnN0YXRlX2NhY2hlLmF0b21zW2ldLnZhbHVlPTB4REVBREJFRUY7IC8vIG52aWRpYSBjYXJkcyBsaWtlIGJlZWYKLQl9Ci0Jbm1lc2EtPnN0YXRlX2NhY2hlLmRpcnR5PTA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zdGF0ZV9jYWNoZS5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlX2NhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOWQ0MjYuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N0YXRlX2NhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0KLSNpZm5kZWYgX19OT1VWRUFVX1NUQVRFX0NBQ0hFX0hfXwotI2RlZmluZSBfX05PVVZFQVVfU1RBVEVfQ0FDSEVfSF9fCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLQotI2RlZmluZSBOT1VWRUFVX1NUQVRFX0NBQ0hFX0VOVFJJRVMgMjA0OAotLy8gc2l6ZSBvZiBhIGRpcnR5IHJlcXVlc3RzIGJsb2NrCi0vLyB5b3UgY2FuIHBsYXkgd2l0aCB0aGF0IGFuZCB0dW5lIHRoZSB2YWx1ZSB0byBpbmNyZWFzZS9kZWNyZWFzZSBwZXJmb3JtYW5jZQotLy8gYnV0IGtlZXAgaXQgYSBwb3dlciBvZiAyICEKLSNkZWZpbmUgTk9VVkVBVV9TVEFURV9DQUNIRV9ISUVSX1NJWkUgIDMyCi0KLXR5cGVkZWYgc3RydWN0IG5vdXZlYXVfc3RhdGVfYXRvbV90ewotCXVpbnQzMl90IHZhbHVlOwotCXVpbnQzMl90IGRpcnR5OwotfW5vdXZlYXVfc3RhdGVfYXRvbTsKLQotdHlwZWRlZiBzdHJ1Y3Qgbm91dmVhdV9zdGF0ZV9jYWNoZV90ewotCW5vdXZlYXVfc3RhdGVfYXRvbSBhdG9tc1tOT1VWRUFVX1NUQVRFX0NBQ0hFX0VOVFJJRVNdOwotCXVpbnQzMl90IGN1cnJlbnRfcG9zOwotCS8vIGhpZXJhcmNoaWNhbCBkaXJ0eSBmbGFncwotCXVpbnQ4X3QgaGRpcnR5W05PVVZFQVVfU1RBVEVfQ0FDSEVfRU5UUklFUy9OT1VWRUFVX1NUQVRFX0NBQ0hFX0hJRVJfU0laRV07Ci0JLy8gbWFzdGVyIGRpcnR5IGZsYWcKLQl1aW50OF90IGRpcnR5OwotfW5vdXZlYXVfc3RhdGVfY2FjaGU7Ci0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zd3RjbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N3dGNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDEzYmQuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N3dGNsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21tb24gc29mdHdhcmUgVENMIGNvZGUgKi8KLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc3d0Y2wuaCIKLSNpbmNsdWRlICJudjEwX3N3dGNsLmgiCi0jaW5jbHVkZSAibm91dmVhdV9zcGFuLmgiCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKLSNpbmNsdWRlICJ0bmwvdG5sLmgiCi0jaW5jbHVkZSAidG5sL3RfcGlwZWxpbmUuaCIKLQotLyogQ29tbW9uIHRyaSBmdW5jdGlvbnMgKi8KLQotLyogVGhlIGZhbGxiYWNrcyAqLwotdm9pZCBub3V2ZWF1X2ZhbGxiYWNrX3RyaShzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSwKLQkJbm91dmVhdVZlcnRleCAqdjAsCi0JCW5vdXZlYXVWZXJ0ZXggKnYxLAotCQlub3V2ZWF1VmVydGV4ICp2MikKLXsgICAgCi0JR0xjb250ZXh0ICpjdHggPSBubWVzYS0+Z2xDdHg7Ci0JU1d2ZXJ0ZXggdlszXTsKLQlfc3dzZXR1cF9UcmFuc2xhdGUoY3R4LCB2MCwgJnZbMF0pOwotCV9zd3NldHVwX1RyYW5zbGF0ZShjdHgsIHYxLCAmdlsxXSk7Ci0JX3N3c2V0dXBfVHJhbnNsYXRlKGN0eCwgdjIsICZ2WzJdKTsKLQlfc3dyYXN0X1RyaWFuZ2xlKGN0eCwgJnZbMF0sICZ2WzFdLCAmdlsyXSk7Ci19Ci0KLQotdm9pZCBub3V2ZWF1X2ZhbGxiYWNrX2xpbmUoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EsCi0JCW5vdXZlYXVWZXJ0ZXggKnYwLAotCQlub3V2ZWF1VmVydGV4ICp2MSkKLXsKLQlHTGNvbnRleHQgKmN0eCA9IG5tZXNhLT5nbEN0eDsKLQlTV3ZlcnRleCB2WzJdOwotCV9zd3NldHVwX1RyYW5zbGF0ZShjdHgsIHYwLCAmdlswXSk7Ci0JX3N3c2V0dXBfVHJhbnNsYXRlKGN0eCwgdjEsICZ2WzFdKTsKLQlfc3dyYXN0X0xpbmUoY3R4LCAmdlswXSwgJnZbMV0pOwotfQotCi0KLXZvaWQgbm91dmVhdV9mYWxsYmFja19wb2ludChzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSwKLQkJbm91dmVhdVZlcnRleCAqdjApCi17Ci0JR0xjb250ZXh0ICpjdHggPSBubWVzYS0+Z2xDdHg7Ci0JU1d2ZXJ0ZXggdlsxXTsKLQlfc3dzZXR1cF9UcmFuc2xhdGUoY3R4LCB2MCwgJnZbMF0pOwotCV9zd3Jhc3RfUG9pbnQoY3R4LCAmdlswXSk7Ci19Ci0KLXZvaWQgbm91dmVhdUZhbGxiYWNrKHN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhLCBHTHVpbnQgYml0LCBHTGJvb2xlYW4gbW9kZSkKLXsKLQlHTGNvbnRleHQgKmN0eCA9IG5tZXNhLT5nbEN0eDsKLQlHTHVpbnQgb2xkZmFsbGJhY2sgPSBubWVzYS0+RmFsbGJhY2s7Ci0KLQlpZiAobW9kZSkgewotCQlubWVzYS0+RmFsbGJhY2sgfD0gYml0OwotCQlpZiAob2xkZmFsbGJhY2sgPT0gMCkgewotCQkJaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGU8TlZfMTApIHsKLQkJCQkvL252MDRGaW5pc2hQcmltaXRpdmUobm1lc2EpOwotCQkJfSBlbHNlIHsKLQkJCQkvL252MTBGaW5pc2hQcmltaXRpdmUobm1lc2EpOwotCQkJfQotCi0JCQlfc3dzZXR1cF9XYWtldXAoY3R4KTsKLQkJCW5tZXNhLT5yZW5kZXJfaW5kZXggPSB+MDsKLQkJfQotCX0KLQllbHNlIHsKLQkJbm1lc2EtPkZhbGxiYWNrICY9IH5iaXQ7Ci0JCWlmIChvbGRmYWxsYmFjayA9PSBiaXQpIHsKLQkJCV9zd3Jhc3RfZmx1c2goIGN0eCApOwotCi0JCQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZTxOVl8xMCkgewotCQkJCW52MDRUcmlJbml0RnVuY3Rpb25zKGN0eCk7Ci0JCQl9IGVsc2UgewotCQkJCW52MTBUcmlJbml0RnVuY3Rpb25zKGN0eCk7Ci0JCQl9Ci0KLQkJCV90bmxfaW52YWxpZGF0ZV92ZXJ0ZXhfc3RhdGUoIGN0eCwgfjAgKTsKLQkJCV90bmxfaW52YWxpZGF0ZV92ZXJ0aWNlcyggY3R4LCB+MCApOwotCQkJX3RubF9pbnN0YWxsX2F0dHJzKCBjdHgsIAotCQkJCQlubWVzYS0+dmVydGV4X2F0dHJzLCAKLQkJCQkJbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50LAotCQkJCQlubWVzYS0+dmlld3BvcnQubSwgMCApOyAKLQkJfQotCX0gICAgCi19Ci0KLQotdm9pZCBub3V2ZWF1UnVuUGlwZWxpbmUoIEdMY29udGV4dCAqY3R4ICkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKG5tZXNhLT5uZXdfc3RhdGUpIHsKLQkJbm1lc2EtPm5ld19yZW5kZXJfc3RhdGUgfD0gbm1lc2EtPm5ld19zdGF0ZTsKLQl9Ci0KLQlfdG5sX3J1bl9waXBlbGluZSggY3R4ICk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N3dGNsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3d0Y2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0ZDg3Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3d0Y2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Db3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLSNpZm5kZWYgX19OT1VWRUFVX1NXVENMX0hfXwotI2RlZmluZSBfX05PVVZFQVVfU1dUQ0xfSF9fCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLQotZXh0ZXJuIHZvaWQgbm91dmVhdV9mYWxsYmFja190cmkoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EsCi0JCW5vdXZlYXVWZXJ0ZXggKnYwLAotCQlub3V2ZWF1VmVydGV4ICp2MSwKLQkJbm91dmVhdVZlcnRleCAqdjIpOwotCi1leHRlcm4gdm9pZCBub3V2ZWF1X2ZhbGxiYWNrX2xpbmUoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EsCi0JCW5vdXZlYXVWZXJ0ZXggKnYwLAotCQlub3V2ZWF1VmVydGV4ICp2MSk7Ci0KLWV4dGVybiB2b2lkIG5vdXZlYXVfZmFsbGJhY2tfcG9pbnQoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EsIAotCQlub3V2ZWF1VmVydGV4ICp2MCk7Ci0KLWV4dGVybiB2b2lkIG5vdXZlYXVGYWxsYmFjayhzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSwgR0x1aW50IGJpdCwgR0xib29sZWFuIG1vZGUpOwotCi1leHRlcm4gdm9pZCBub3V2ZWF1UnVuUGlwZWxpbmUoIEdMY29udGV4dCAqY3R4ICk7Ci0KLWV4dGVybiB2b2lkIG5vdXZlYXVUcmlJbml0RnVuY3Rpb25zKCBHTGNvbnRleHQgKmN0eCApOwotCi0KLSNlbmRpZiAvKiBfX05PVVZFQVVfU1dUQ0xfSF9fICovCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N5bmMuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zeW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYmM4NDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3N5bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInZibGFuay5oIiAvKiBmb3IgRE9fVVNMRUVQICovCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2J1ZmZlcnMuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9tc2cuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3N5bmMuaCIKLQotI2RlZmluZSBOT1RJRklFUihfX3YpIFwKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOyBcCi0Jdm9sYXRpbGUgdWludDMyX3QgKl9fdiA9ICh2b2lkKilubWVzYS0+bm90aWZpZXJfYmxvY2sgKyBub3RpZmllci0+b2Zmc2V0Ci0KLXN0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcl9hbGxvYyAqCi1ub3V2ZWF1X25vdGlmaWVyX25ldyhHTGNvbnRleHQgKmN0eCwgR0x1aW50IGhhbmRsZSwgR0x1aW50IGNvdW50KQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyX2FsbG9jICpub3RpZmllcjsKLQlpbnQgcmV0OwotCi0jaWZkZWYgTk9VVkVBVV9SSU5HX0RFQlVHCi0JcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotCW5vdGlmaWVyID0gQ0FMTE9DX1NUUlVDVChkcm1fbm91dmVhdV9ub3RpZmllcl9hbGxvYyk7Ci0JaWYgKCFub3RpZmllcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlub3RpZmllci0+Y2hhbm5lbCA9IG5tZXNhLT5maWZvLmNoYW5uZWw7Ci0Jbm90aWZpZXItPmhhbmRsZSAgPSBoYW5kbGU7Ci0Jbm90aWZpZXItPmNvdW50ICAgPSBjb3VudDsKLQlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKG5tZXNhLT5kcmlGZCwgRFJNX05PVVZFQVVfTk9USUZJRVJfQUxMT0MsCi0JCQkJICBub3RpZmllciwgc2l6ZW9mKCpub3RpZmllcikpOwotCWlmIChyZXQpIHsKLQkJTUVTU0FHRSgiRmFpbGVkIHRvIGNyZWF0ZSBub3RpZmllciAweCUwOHg6ICVkXG4iLCBoYW5kbGUsIHJldCk7Ci0JCUZSRUUobm90aWZpZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gbm90aWZpZXI7Ci19Ci0KLXZvaWQKLW5vdXZlYXVfbm90aWZpZXJfZGVzdHJveShHTGNvbnRleHQgKmN0eCwKLQkJCSBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKm5vdGlmaWVyKQotewotCS8qWFhYOiBmcmVlIG5vdGlmaWVyIG9iamVjdC4uICovCi0JRlJFRShub3RpZmllcik7Ci19Ci0KLXZvaWQKLW5vdXZlYXVfbm90aWZpZXJfcmVzZXQoR0xjb250ZXh0ICpjdHgsCi0JCSAgICAgICBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKm5vdGlmaWVyLAotCQkgICAgICAgR0x1aW50IGlkKQotewotCU5PVElGSUVSKG4pOwotCi0jaWZkZWYgTk9VVkVBVV9SSU5HX0RFQlVHCi0JcmV0dXJuOwotI2VuZGlmCi0KLQluW05WX05PVElGWV9USU1FXzAgICAgICAvNF0gPSAweDAwMDAwMDAwOwotCW5bTlZfTk9USUZZX1RJTUVfMSAgICAgIC80XSA9IDB4MDAwMDAwMDA7Ci0JbltOVl9OT1RJRllfUkVUVVJOX1ZBTFVFLzRdID0gMHgwMDAwMDAwMDsKLQluW05WX05PVElGWV9TVEFURSAgICAgICAvNF0gPSAoTlZfTk9USUZZX1NUQVRFX1NUQVRVU19JTl9QUk9DRVNTIDw8Ci0JCQkJICAgICAgIE5WX05PVElGWV9TVEFURV9TVEFUVVNfU0hJRlQpOwotfQotCi1HTHVpbnQKLW5vdXZlYXVfbm90aWZpZXJfc3RhdHVzKEdMY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyX2FsbG9jICpub3RpZmllciwKLQkJCUdMdWludCBpZCkKLXsKLQlOT1RJRklFUihuKTsKLQotCXJldHVybiBuW05WX05PVElGWV9TVEFURS80XSA+PiBOVl9OT1RJRllfU1RBVEVfU1RBVFVTX1NISUZUOwotfQotCi1HTHVpbnQKLW5vdXZlYXVfbm90aWZpZXJfcmV0dXJuX3ZhbChHTGNvbnRleHQgKmN0eCwKLQkJCSAgICBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKm5vdGlmaWVyLAotCQkJICAgIEdMdWludCBpZCkKLXsKLQlOT1RJRklFUihuKTsKLQotCXJldHVybiBuW05WX05PVElGWV9SRVRVUk5fVkFMVUUvNF07Ci19Ci0KLUdMYm9vbGVhbgotbm91dmVhdV9ub3RpZmllcl93YWl0X3N0YXR1cyhHTGNvbnRleHQgKmN0eCwKLQkJCSAgICAgc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyX2FsbG9jICpub3RpZmllciwKLQkJCSAgICAgR0x1aW50IGlkLCBHTHVpbnQgc3RhdHVzLCBHTHVpbnQgdGltZW91dCkKLXsKLQlOT1RJRklFUihuKTsKLQl1bnNpZ25lZCBpbnQgdGltZSA9IDA7Ci0KLSNpZmRlZiBOT1VWRUFVX1JJTkdfREVCVUcKLQlyZXR1cm4gR0xfVFJVRTsKLSNlbmRpZgotCi0Jd2hpbGUgKHRpbWUgPD0gdGltZW91dCkgewotCQlpZiAobltOVl9OT1RJRllfU1RBVEUvNF0gJiBOVl9OT1RJRllfU1RBVEVfRVJST1JfQ09ERV9NQVNLKSB7Ci0JCQlNRVNTQUdFKCJOb3RpZmllciByZXR1cm5lZCBlcnJvcjogMHglMDR4XG4iLAotCQkJCQluW05WX05PVElGWV9TVEFURS80XSAmCi0JCQkJCU5WX05PVElGWV9TVEFURV9FUlJPUl9DT0RFX01BU0spOwotCQkJcmV0dXJuIEdMX0ZBTFNFOwotCQl9Ci0KLQkJaWYgKCgobltOVl9OT1RJRllfU1RBVEUvNF0gJiBOVl9OT1RJRllfU1RBVEVfU1RBVFVTX01BU0spID4+Ci0JCQkJTlZfTk9USUZZX1NUQVRFX1NUQVRVU19TSElGVCkgPT0gc3RhdHVzKQotCQkJcmV0dXJuIEdMX1RSVUU7Ci0KLQkJaWYgKHRpbWVvdXQpIHsKLQkJCURPX1VTTEVFUCgxKTsKLQkJCXRpbWUrKzsKLQkJfQotCX0KLQotCU1FU1NBR0UoIk5vdGlmaWVyIHRpbWVkIG91dFxuIik7Ci0JcmV0dXJuIEdMX0ZBTFNFOwotfQotCi12b2lkCi1ub3V2ZWF1X25vdGlmaWVyX3dhaXRfbm9wKEdMY29udGV4dCAqY3R4LAotCQkJICBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKm5vdGlmaWVyLAotCQkJICBHTHVpbnQgc3ViYykKLXsKLQlOT1RJRklFUihuKTsKLQlHTGJvb2xlYW4gcmV0OwotCi0Jbm91dmVhdV9ub3RpZmllcl9yZXNldChjdHgsIG5vdGlmaWVyLCAwKTsKLQotCUJFR0lOX1JJTkdfU0laRShzdWJjLCBOVl9OT1RJRlksIDEpOwotCU9VVF9SSU5HICAgICAgIChOVl9OT1RJRllfU1RZTEVfV1JJVEVfT05MWSk7Ci0JQkVHSU5fUklOR19TSVpFKHN1YmMsIE5WX05PUCwgMSk7Ci0JT1VUX1JJTkcgICAgICAgKDApOwotCUZJUkVfUklORygpOwotCi0JcmV0ID0gbm91dmVhdV9ub3RpZmllcl93YWl0X3N0YXR1cyhjdHgsIG5vdGlmaWVyLCAwLAotCQkJCQkgICBOVl9OT1RJRllfU1RBVEVfU1RBVFVTX0NPTVBMRVRFRCwKLQkJCQkJICAgMCAvKiBubyB0aW1lb3V0ICovKTsKLQlpZiAocmV0ID09IEdMX0ZBTFNFKSBNRVNTQUdFKCJ3YWl0IG9uIG5vdGlmaWVyIGZhaWxlZFxuIik7Ci19Ci0KLUdMYm9vbGVhbiBub3V2ZWF1U3luY0luaXRGdW5jcyhHTGNvbnRleHQgKmN0eCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0jaWZkZWYgTk9VVkVBVV9SSU5HX0RFQlVHCi0JcmV0dXJuIEdMX1RSVUU7Ci0jZW5kaWYKLQotCW5tZXNhLT5zeW5jTm90aWZpZXIgPSBub3V2ZWF1X25vdGlmaWVyX25ldyhjdHgsIE52U3luY05vdGlmeSwgMSk7Ci0JaWYgKCFubWVzYS0+c3luY05vdGlmaWVyKSB7Ci0JCU1FU1NBR0UoIkZhaWxlZCB0byBjcmVhdGUgY2hhbm5lbCBzeW5jIG5vdGlmaWVyXG4iKTsKLQkJcmV0dXJuIEdMX0ZBTFNFOwotCX0KLQotCS8qIDB4MTgwIGlzIFNFVF9ETUFfTk9USUZZLCBzaG91bGQgYmUgY29ycmVjdCBmb3IgYWxsIHN1cHBvcnRlZCAzRAotCSAqIG9iamVjdCBjbGFzc2VzCi0JICovCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCAweDE4MCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUgIChOdlN5bmNOb3RpZnkpOwotI2lmZGVmIEFMTE9XX01VTFRJX1NVQkNIQU5ORUwKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWJNZW1Gb3JtYXQsCi0JICAgICAgCQlOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9ETUFfTk9USUZZLCAxKTsKLQlPVVRfUklORyAgICAgICAoTnZTeW5jTm90aWZ5KTsKLSNlbmRpZgotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zeW5jLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfc3luYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZhZjE3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9zeW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX05PVVZFQVVfU1lOQ19IX18KLSNkZWZpbmUgX19OT1VWRUFVX1NZTkNfSF9fCi0KLSNpbmNsdWRlICJub3V2ZWF1X2J1ZmZlcnMuaCIKLQotI2RlZmluZSBOVl9OT1RJRklFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTlZfTk9USUZZX1RJTUVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIE5WX05PVElGWV9USU1FXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBOVl9OT1RJRllfUkVUVVJOX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgTlZfTk9USUZZX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIE5WX05PVElGWV9TVEFURV9TVEFUVVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwMDAwMAotI2RlZmluZSBOVl9OT1RJRllfU1RBVEVfU1RBVFVTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTlZfTk9USUZZX1NUQVRFX1NUQVRVU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE5WX05PVElGWV9TVEFURV9TVEFUVVNfSU5fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBOVl9OT1RJRllfU1RBVEVfRVJST1JfQ09ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgTlZfTk9USUZZX1NUQVRFX0VSUk9SX0NPREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIE1ldGhvZHMgdGhhdCAoaG9wZWZ1bGx5KSBhbGwgb2JqZWN0cyBoYXZlICovCi0jZGVmaW5lIE5WX05PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBOVl9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKLSNkZWZpbmUgTlZfTk9USUZZX1NUWUxFX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLWV4dGVybiBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKgotbm91dmVhdV9ub3RpZmllcl9uZXcoR0xjb250ZXh0ICosIEdMdWludCBoYW5kbGUsIEdMdWludCBjb3VudCk7Ci1leHRlcm4gdm9pZCAKLW5vdXZlYXVfbm90aWZpZXJfZGVzdHJveShHTGNvbnRleHQgKiwgc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyX2FsbG9jICopOwotZXh0ZXJuIHZvaWQKLW5vdXZlYXVfbm90aWZpZXJfcmVzZXQoR0xjb250ZXh0ICosIHN0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcl9hbGxvYyAqLAotCQkgICAgICAgR0x1aW50IGlkKTsKLWV4dGVybiBHTHVpbnQKLW5vdXZlYXVfbm90aWZpZXJfc3RhdHVzKEdMY29udGV4dCAqLCBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKiwKLQkJCUdMdWludCBpZCk7Ci1leHRlcm4gR0x1aW50Ci1ub3V2ZWF1X25vdGlmaWVyX3JldHVybl92YWwoR0xjb250ZXh0ICosIHN0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcl9hbGxvYyAqLAotCQkJICAgIEdMdWludCBpZCk7Ci1leHRlcm4gR0xib29sZWFuCi1ub3V2ZWF1X25vdGlmaWVyX3dhaXRfc3RhdHVzKEdMY29udGV4dCAqLCBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJfYWxsb2MgKiwKLQkJCSAgICAgR0x1aW50IGlkLCBHTHVpbnQgc3RhdHVzLCBHTHVpbnQgdGltZW91dCk7Ci1leHRlcm4gdm9pZAotbm91dmVhdV9ub3RpZmllcl93YWl0X25vcChHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyX2FsbG9jICosCi0JCQkgIEdMdWludCBzdWJjKTsKLQotZXh0ZXJuIEdMYm9vbGVhbiBub3V2ZWF1U3luY0luaXRGdW5jcyhHTGNvbnRleHQgKmN0eCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV90ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4ZDI3OS4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfdGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDIwMDYgU3RlcGhhbmUgTWFyY2hlc2luCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKLWxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCi10aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQotU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotRVJJQyBBTkhPTFQgT1IgU0lMSUNPTiBJTlRFR1JBVEVEIFNZU1RFTVMgQ09SUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQotVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgIm5vdXZlYXVfdGV4LmgiCi0KLS8vIFhYWCBuZWVkcyBzb21lIGxvdmUKLXZvaWQgbm91dmVhdVRleEluaXRGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICkKLXsKLS8qCi0gICBmdW5jdGlvbnMtPlRleEVudgkJCT0gbm91dmVhdVRleEVudjsKLSAgIGZ1bmN0aW9ucy0+Q2hvb3NlVGV4dHVyZUZvcm1hdAk9IG5vdXZlYXVDaG9vc2VUZXh0dXJlRm9ybWF0OwotICAgZnVuY3Rpb25zLT5UZXhJbWFnZTFECQk9IG5vdXZlYXVUZXhJbWFnZTFEOwotICAgZnVuY3Rpb25zLT5UZXhTdWJJbWFnZTFECQk9IG5vdXZlYXVUZXhTdWJJbWFnZTFEOwotICAgZnVuY3Rpb25zLT5UZXhJbWFnZTJECQk9IG5vdXZlYXVUZXhJbWFnZTJEOwotICAgZnVuY3Rpb25zLT5UZXhTdWJJbWFnZTJECQk9IG5vdXZlYXVUZXhTdWJJbWFnZTJEOwotICAgZnVuY3Rpb25zLT5UZXhQYXJhbWV0ZXIJCT0gbm91dmVhdVRleFBhcmFtZXRlcjsKLSAgIGZ1bmN0aW9ucy0+QmluZFRleHR1cmUJCT0gbm91dmVhdUJpbmRUZXh0dXJlOwotICAgZnVuY3Rpb25zLT5OZXdUZXh0dXJlT2JqZWN0CQk9IG5vdXZlYXVOZXdUZXh0dXJlT2JqZWN0OwotICAgZnVuY3Rpb25zLT5EZWxldGVUZXh0dXJlCQk9IG5vdXZlYXVEZWxldGVUZXh0dXJlOwotICAgZnVuY3Rpb25zLT5Jc1RleHR1cmVSZXNpZGVudAkJPSBkcmlJc1RleHR1cmVSZXNpZGVudDsKLQotICAgZHJpSW5pdFRleHR1cmVGb3JtYXRzKCk7Ci0qLwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfdGV4LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfdGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzcxZjguLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3RleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19OT1VWRUFVX1RFWF9IX18KLSNkZWZpbmUgX19OT1VWRUFVX1RFWF9IX18KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAiZGQuaCIKLQotZXh0ZXJuIHZvaWQgbm91dmVhdVRleEluaXRGdW5jdGlvbnMoIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zICk7Ci0KLSNlbmRpZiAvKiBfX05PVVZFQVVfVEVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjA0X3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MDRfc3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkZjNkMi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MDRfc3RhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDIwMDcgU3RlcGhhbmUgTWFyY2hlc2luCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKLWxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCi10aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQotU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotRVJJQyBBTkhPTFQgT1IgU0lMSUNPTiBJTlRFR1JBVEVEIFNZU1RFTVMgQ09SUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQotVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9tc2cuaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi1zdGF0aWMgdWludDMyX3QgbnYwNF9jb21wYXJlX2Z1bmMoR0x1aW50IGYpCi17Ci0Jc3dpdGNoICggZiApIHsKLQkJY2FzZSBHTF9ORVZFUjoJCXJldHVybiAxOwotCQljYXNlIEdMX0xFU1M6CQlyZXR1cm4gMjsKLQkJY2FzZSBHTF9FUVVBTDoJCXJldHVybiAzOwotCQljYXNlIEdMX0xFUVVBTDoJCXJldHVybiA0OwotCQljYXNlIEdMX0dSRUFURVI6CXJldHVybiA1OwotCQljYXNlIEdMX05PVEVRVUFMOglyZXR1cm4gNjsKLQkJY2FzZSBHTF9HRVFVQUw6CQlyZXR1cm4gNzsKLQkJY2FzZSBHTF9BTFdBWVM6CQlyZXR1cm4gODsKLQl9Ci0JV0FSTl9PTkNFKCJVbmFibGUgdG8gZmluZCB0aGUgZnVuY3Rpb25cbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgbnYwNF9ibGVuZF9mdW5jKEdMdWludCBmKQotewotCXN3aXRjaCAoIGYgKSB7Ci0JCWNhc2UgR0xfWkVSTzoJCQlyZXR1cm4gMHgxOwotCQljYXNlIEdMX09ORToJCQlyZXR1cm4gMHgyOwotCQljYXNlIEdMX1NSQ19DT0xPUjoJCXJldHVybiAweDM7Ci0JCWNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoJcmV0dXJuIDB4NDsKLQkJY2FzZSBHTF9TUkNfQUxQSEE6CQlyZXR1cm4gMHg1OwotCQljYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CXJldHVybiAweDY7Ci0JCWNhc2UgR0xfRFNUX0FMUEhBOgkJcmV0dXJuIDB4NzsKLQkJY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOglyZXR1cm4gMHg4OwotCQljYXNlIEdMX0RTVF9DT0xPUjoJCXJldHVybiAweDk7Ci0JCWNhc2UgR0xfT05FX01JTlVTX0RTVF9DT0xPUjoJcmV0dXJuIDB4QTsKLQkJY2FzZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU6CXJldHVybiAweEI7Ci0JfQotCVdBUk5fT05DRSgiVW5hYmxlIHRvIGZpbmQgdGhlIGZ1bmN0aW9uIDB4JXhcbiIsZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfZW1pdF9jb250cm9sKEdMY29udGV4dCAqY3R4KQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JdWludDMyX3QgY29udHJvbCxjdWxsOwotCUdMdWJ5dGUgYWxwaGFfcmVmOwotCi0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShhbHBoYV9yZWYsIGN0eC0+Q29sb3IuQWxwaGFSZWYpOwotCWNvbnRyb2w9YWxwaGFfcmVmOwotCWNvbnRyb2x8PShudjA0X2NvbXBhcmVfZnVuYyhjdHgtPkNvbG9yLkFscGhhRnVuYyk8PDgpOwotCWNvbnRyb2x8PShjdHgtPkNvbG9yLkFscGhhRW5hYmxlZDw8MTIpOwotCWNvbnRyb2x8PSgxPDwxMyk7Ci0JY29udHJvbHw9KGN0eC0+RGVwdGguVGVzdDw8MTQpOwotCWNvbnRyb2x8PShudjA0X2NvbXBhcmVfZnVuYyhjdHgtPkRlcHRoLkZ1bmMpPDwxNik7Ci0JaWYgKChjdHgtPlBvbHlnb24uQ3VsbEZsYWcpJiYoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZSE9R0xfRlJPTlRfQU5EX0JBQ0spKQotCXsKLQkJaWYgKChjdHgtPlBvbHlnb24uRnJvbnRGYWNlPT1HTF9DVykmJihjdHgtPlBvbHlnb24uQ3VsbEZhY2VNb2RlPT1HTF9GUk9OVCkpCi0JCQljdWxsPTI7Ci0JCWlmICgoY3R4LT5Qb2x5Z29uLkZyb250RmFjZT09R0xfQ1cpJiYoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZT09R0xfQkFDSykpCi0JCQljdWxsPTM7Ci0JCWlmICgoY3R4LT5Qb2x5Z29uLkZyb250RmFjZT09R0xfQ0NXKSYmKGN0eC0+UG9seWdvbi5DdWxsRmFjZU1vZGU9PUdMX0ZST05UKSkKLQkJCWN1bGw9MzsKLQkJaWYgKChjdHgtPlBvbHlnb24uRnJvbnRGYWNlPT1HTF9DQ1cpJiYoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZT09R0xfQkFDSykpCi0JCQljdWxsPTI7Ci0JfQotCWVsc2UKLQkJaWYgKGN0eC0+UG9seWdvbi5DdWxsRmFjZU1vZGU9PUdMX0ZST05UX0FORF9CQUNLKQotCQkJY3VsbD0wOwotCQllbHNlCi0JCQljdWxsPTE7Ci0JY29udHJvbHw9KGN1bGw8PDIwKTsKLQljb250cm9sfD0oY3R4LT5Db2xvci5EaXRoZXJGbGFnPDwyMik7Ci0JaWYgKChjdHgtPkRlcHRoLlRlc3QpJiYoY3R4LT5EZXB0aC5NYXNrKSkKLQkJY29udHJvbHw9KDE8PDI0KTsKLQotCWNvbnRyb2x8PSgxPDwzMCk7IC8vIGludGVnZXIgemJ1ZmZlciBmb3JtYXQKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfQ09OVFJPTCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoY29udHJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfZW1pdF9ibGVuZChHTGNvbnRleHQgKmN0eCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCXVpbnQzMl90IGJsZW5kOwotCi0JYmxlbmQ9MHg0OyAvLyB0ZXh0dXJlIE1PRFVMQVRFX0FMUEhBCi0JYmxlbmR8PTB4MjA7IC8vIGFscGhhIGlzIE1TQgotCXN3aXRjaChjdHgtPkxpZ2h0LlNoYWRlTW9kZWwpIHsKLQkJY2FzZSBHTF9TTU9PVEg6YmxlbmR8PSgxPDw2KTticmVhazsKLQkJY2FzZSBHTF9GTEFUOiAgYmxlbmR8PSgyPDw2KTticmVhazsKLQkJZGVmYXVsdDpicmVhazsKLQl9Ci0JaWYgKGN0eC0+SGludC5QZXJzcGVjdGl2ZUNvcnJlY3Rpb24hPUdMX0ZBU1RFU1QpCi0JCWJsZW5kfD0oMTw8OCk7Ci0JYmxlbmR8PShjdHgtPkZvZy5FbmFibGVkPDwxNik7Ci0JYmxlbmR8PShjdHgtPkNvbG9yLkJsZW5kRW5hYmxlZDw8MjApOwotCWJsZW5kfD0obnYwNF9ibGVuZF9mdW5jKGN0eC0+Q29sb3IuQmxlbmRTcmNSR0IpPDwyNCk7Ci0JYmxlbmR8PShudjA0X2JsZW5kX2Z1bmMoY3R4LT5Db2xvci5CbGVuZERzdFJHQik8PDI4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfQkxFTkQsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKGJsZW5kKTsKLX0KLQotc3RhdGljIHZvaWQgbnYwNF9lbWl0X2ZvZ19jb2xvcihHTGNvbnRleHQgKmN0eCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgY1s0XTsKLQljWzBdID0gRkxPQVRfVE9fVUJZVEUoIGN0eC0+Rm9nLkNvbG9yWzBdICk7Ci0JY1sxXSA9IEZMT0FUX1RPX1VCWVRFKCBjdHgtPkZvZy5Db2xvclsxXSApOwotCWNbMl0gPSBGTE9BVF9UT19VQllURSggY3R4LT5Gb2cuQ29sb3JbMl0gKTsKLQljWzNdID0gRkxPQVRfVE9fVUJZVEUoIGN0eC0+Rm9nLkNvbG9yWzNdICk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9GT0dfQ09MT1IsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKFBBQ0tfQ09MT1JfODg4OF9SRVYoY1swXSxjWzFdLGNbMl0sY1szXSkpOwotfQotCi1zdGF0aWMgdm9pZCBudjA0QWxwaGFGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCi17Ci0JbnYwNF9lbWl0X2NvbnRyb2woY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgbnYwNEJsZW5kQ29sb3IoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCi17Ci0JbnYwNF9lbWl0X2JsZW5kKGN0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEpCi17Ci0JbnYwNF9lbWl0X2JsZW5kKGN0eCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgbnYwNEJsZW5kRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsCi0JCUdMZW51bSBzZmFjdG9yQSwgR0xlbnVtIGRmYWN0b3JBKQotewotCW52MDRfZW1pdF9ibGVuZChjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBudjA0Q2xlYXIoR0xjb250ZXh0ICpjdHgsIEdMYml0ZmllbGQgbWFzaykKLXsKLQkvKiBUT0RPICovCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRDbGVhckNvbG9yKEdMY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IGNvbG9yWzRdKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNENsZWFyRGVwdGgoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIGQpCi17Ci0JLyogVE9ETyAqLwotfQotCi1zdGF0aWMgdm9pZCBudjA0Q2xlYXJTdGVuY2lsKEdMY29udGV4dCAqY3R4LCBHTGludCBzKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNENsaXBQbGFuZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikKLXsKLQkvKiBUT0RPICovCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRDb2xvck1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBybWFzaywgR0xib29sZWFuIGdtYXNrLAotCQlHTGJvb2xlYW4gYm1hc2ssIEdMYm9vbGVhbiBhbWFzayApCi17Ci0JLyogVE9ETyAqLwotfQotCi1zdGF0aWMgdm9pZCBudjA0Q29sb3JNYXRlcmlhbChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKQotewotCS8qIFRPRE8gSSBuZWVkIGxvdmUgKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNEN1bGxGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQludjA0X2VtaXRfY29udHJvbChjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBudjA0RnJvbnRGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQkvKiBUT0RPICovCi19Ci0KLXN0YXRpYyB2b2lkIG52MDREZXB0aEZ1bmMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKQotewotCW52MDRfZW1pdF9jb250cm9sKGN0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDREZXB0aE1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBmbGFnKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNERlcHRoUmFuZ2UoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIG5lYXJ2YWwsIEdMY2xhbXBkIGZhcnZhbCkKLXsKLQkvKiBUT0RPICovCi19Ci0KLS8qKiBTcGVjaWZ5IHRoZSBjdXJyZW50IGJ1ZmZlciBmb3Igd3JpdGluZyAqLwotLy92b2lkICgqRHJhd0J1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU3BlY2lmeSB0aGUgYnVmZmVycyBmb3Igd3JpdGluZyBmb3IgZnJhZ21lbnQgcHJvZ3JhbXMqLwotLy92b2lkICgqRHJhd0J1ZmZlcnMpKCBHTGNvbnRleHQgKmN0eCwgR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZmZlcnMgKTsKLQotc3RhdGljIHZvaWQgbnYwNEVuYWJsZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQotewotCXN3aXRjaChjYXApCi0JewotCQljYXNlIEdMX0FMUEhBX1RFU1Q6Ci0JCQludjA0X2VtaXRfY29udHJvbChjdHgpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9BVVRPX05PUk1BTDoKLQkJY2FzZSBHTF9CTEVORDoKLQkJCW52MDRfZW1pdF9ibGVuZChjdHgpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9DTElQX1BMQU5FMDoKLS8vCQljYXNlIEdMX0NMSVBfUExBTkUxOgotLy8JCWNhc2UgR0xfQ0xJUF9QTEFORTI6Ci0vLwkJY2FzZSBHTF9DTElQX1BMQU5FMzoKLS8vCQljYXNlIEdMX0NMSVBfUExBTkU0OgotLy8JCWNhc2UgR0xfQ0xJUF9QTEFORTU6Ci0vLwkJY2FzZSBHTF9DT0xPUl9MT0dJQ19PUDoKLS8vCQljYXNlIEdMX0NPTE9SX01BVEVSSUFMOgotLy8JCWNhc2UgR0xfQ09MT1JfU1VNX0VYVDoKLS8vCQljYXNlIEdMX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfQ09OVk9MVVRJT05fMUQ6Ci0vLwkJY2FzZSBHTF9DT05WT0xVVElPTl8yRDoKLQkJY2FzZSBHTF9DVUxMX0ZBQ0U6Ci0JCQludjA0X2VtaXRfY29udHJvbChjdHgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfREVQVEhfVEVTVDoKLQkJCW52MDRfZW1pdF9jb250cm9sKGN0eCk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ESVRIRVI6Ci0JCQludjA0X2VtaXRfY29udHJvbChjdHgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfRk9HOgotCQkJbnYwNF9lbWl0X2JsZW5kKGN0eCk7Ci0JCQludjA0X2VtaXRfZm9nX2NvbG9yKGN0eCk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0hJU1RPR1JBTToKLS8vCQljYXNlIEdMX0lOREVYX0xPR0lDX09QOgotLy8JCWNhc2UgR0xfTElHSFQwOgotLy8JCWNhc2UgR0xfTElHSFQxOgotLy8JCWNhc2UgR0xfTElHSFQyOgotLy8JCWNhc2UgR0xfTElHSFQzOgotLy8JCWNhc2UgR0xfTElHSFQ0OgotLy8JCWNhc2UgR0xfTElHSFQ1OgotLy8JCWNhc2UgR0xfTElHSFQ2OgotLy8JCWNhc2UgR0xfTElHSFQ3OgotLy8JCWNhc2UgR0xfTElHSFRJTkc6Ci0vLwkJY2FzZSBHTF9MSU5FX1NNT09USDoKLS8vCQljYXNlIEdMX0xJTkVfU1RJUFBMRToKLS8vCQljYXNlIEdMX01BUDFfQ09MT1JfNDoKLS8vCQljYXNlIEdMX01BUDFfSU5ERVg6Ci0vLwkJY2FzZSBHTF9NQVAxX05PUk1BTDoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzI6Ci0vLwkJY2FzZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMzoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF80OgotLy8JCWNhc2UgR0xfTUFQMV9WRVJURVhfMzoKLS8vCQljYXNlIEdMX01BUDFfVkVSVEVYXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0NPTE9SXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0lOREVYOgotLy8JCWNhc2UgR0xfTUFQMl9OT1JNQUw6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMToKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yOgotLy8JCWNhc2UgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNDoKLS8vCQljYXNlIEdMX01BUDJfVkVSVEVYXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1ZFUlRFWF80OgotLy8JCWNhc2UgR0xfTUlOTUFYOgotLy8JCWNhc2UgR0xfTk9STUFMSVpFOgotLy8JCWNhc2UgR0xfUE9JTlRfU01PT1RIOgotLy8JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQ6Ci0vLwkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9MSU5FOgotLy8JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKLS8vCQljYXNlIEdMX1BPTFlHT05fU01PT1RIOgotLy8JCWNhc2UgR0xfUE9MWUdPTl9TVElQUExFOgotLy8JCWNhc2UgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEU6Ci0vLwkJY2FzZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfUkVTQ0FMRV9OT1JNQUw6Ci0vLwkJY2FzZSBHTF9TQ0lTU09SX1RFU1Q6Ci0vLwkJY2FzZSBHTF9TRVBBUkFCTEVfMkQ6Ci0vLwkJY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9ROgotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fUjoKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1M6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9UOgotLy8JCWNhc2UgR0xfVEVYVFVSRV8xRDoKLS8vCQljYXNlIEdMX1RFWFRVUkVfMkQ6Ci0vLwkJY2FzZSBHTF9URVhUVVJFXzNEOgotCX0KLX0KLQotc3RhdGljIHZvaWQgbnYwNEZvZ2Z2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLQludjA0X2VtaXRfYmxlbmQoY3R4KTsKLQludjA0X2VtaXRfZm9nX2NvbG9yKGN0eCk7Ci19Ci0gICAKLXN0YXRpYyB2b2lkIG52MDRIaW50KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKLXsKLQlzd2l0Y2godGFyZ2V0KQotCXsKLQkJY2FzZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQ6bnYwNF9lbWl0X2JsZW5kKGN0eCk7YnJlYWs7Ci0JCWRlZmF1bHQ6YnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjA0TGluZVN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIEdMaW50IGZhY3RvciwgR0x1c2hvcnQgcGF0dGVybiApCi17Ci0JLyogVE9ETyBub3QgZXZlbiBpbiB5b3VyIGRyZWFtcyAqLwotfQotCi1zdGF0aWMgdm9pZCBudjA0TGluZVdpZHRoKEdMY29udGV4dCAqY3R4LCBHTGZsb2F0IHdpZHRoKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNExvZ2ljT3Bjb2RlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gb3Bjb2RlKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNFBvaW50UGFyYW1ldGVyZnYoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNFBvaW50U2l6ZShHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBzaXplKQotewotCS8qIFRPRE8gKi8KLX0KLQotc3RhdGljIHZvaWQgbnYwNFBvbHlnb25Nb2RlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpCi17Ci0JLyogVE9ETyAqLwotfQotCi0vKiogU2V0IHRoZSBzY2FsZSBhbmQgdW5pdHMgdXNlZCB0byBjYWxjdWxhdGUgZGVwdGggdmFsdWVzICovCi1zdGF0aWMgdm9pZCBudjA0UG9seWdvbk9mZnNldChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCi17Ci0JLyogVE9ETyAqLwotfQotCi0vKiogU2V0IHRoZSBwb2x5Z29uIHN0aXBwbGluZyBwYXR0ZXJuICovCi1zdGF0aWMgdm9pZCBudjA0UG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWJ5dGUgKm1hc2sgKQotewotCS8qIFRPRE8gKi8KLX0KLQotLyogU3BlY2lmaWVzIHRoZSBjdXJyZW50IGJ1ZmZlciBmb3IgcmVhZGluZyAqLwotdm9pZCAoKlJlYWRCdWZmZXIpKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGJ1ZmZlciApOwotLyoqIFNldCByYXN0ZXJpemF0aW9uIG1vZGUgKi8KLXZvaWQgKCpSZW5kZXJNb2RlKShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUgKTsKLQotLyoqIERlZmluZSB0aGUgc2Npc3NvciBib3ggKi8KLXN0YXRpYyB2b2lkIG52MDRTY2lzc29yKEdMY29udGV4dCAqY3R4LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKLXsKLQkvKiBUT0RPICovCi19Ci0KLS8qKiBTZWxlY3QgZmxhdCBvciBzbW9vdGggc2hhZGluZyAqLwotc3RhdGljIHZvaWQgbnYwNFNoYWRlTW9kZWwoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW52MDRfZW1pdF9ibGVuZChjdHgpOwotfQotCi0vKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbEZ1bmMgKi8KLXN0YXRpYyB2b2lkIG52MDRTdGVuY2lsRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsCi0JCUdMaW50IHJlZiwgR0x1aW50IG1hc2spCi17Ci0JLyogVE9ETyAqLwotfQotCi0vKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbE1hc2sgKi8KLXN0YXRpYyB2b2lkIG52MDRTdGVuY2lsTWFza1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spCi17Ci0JLyogVE9ETyAqLwotfQotCi0vKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbE9wICovCi1zdGF0aWMgdm9pZCBudjA0U3RlbmNpbE9wU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwKLQkJR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpCi17Ci0JLyogVE9ETyAqLwotfQotCi0vKiogQ29udHJvbCB0aGUgZ2VuZXJhdGlvbiBvZiB0ZXh0dXJlIGNvb3JkaW5hdGVzICovCi12b2lkICgqVGV4R2VuKShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsCi0JCWNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0vKiogU2V0IHRleHR1cmUgZW52aXJvbm1lbnQgcGFyYW1ldGVycyAqLwotdm9pZCAoKlRleEVudikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKLQkJY29uc3QgR0xmbG9hdCAqcGFyYW0pOwotLyoqIFNldCB0ZXh0dXJlIHBhcmFtZXRlcnMgKi8KLXZvaWQgKCpUZXhQYXJhbWV0ZXIpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAotCQlzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLQkJR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotCi0vKiBVcGRhdGUgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoZSB3aW5kb3cgcG9zaXRpb24vc2l6ZSAqLwotc3RhdGljIHZvaWQgbnYwNFdpbmRvd01vdmVkKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotfQotCi0vKiBJbml0aWFsaXNlIGFueSBjYXJkLXNwZWNpZmljIG5vbi1HTCByZWxhdGVkIHN0YXRlICovCi1zdGF0aWMgR0xib29sZWFuIG52MDRJbml0Q2FyZChub3V2ZWF1Q29udGV4dFB0ciBubWVzYSkKLXsKLQlub3V2ZWF1T2JqZWN0T25TdWJjaGFubmVsKG5tZXNhLCBOdlN1YjNELCBOdjNEKTsKLQlub3V2ZWF1T2JqZWN0T25TdWJjaGFubmVsKG5tZXNhLCBOdlN1YkN0eFN1cmYzRCwgTnZDdHhTdXJmM0QpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViQ3R4U3VyZjNELCBOVjA0X0NPTlRFWFRfU1VSRkFDRVNfM0RfRE1BX05PVElGWSwgMyk7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX1NVUkZBQ0UsIDEpOwotCU9VVF9SSU5HKE52Q3R4U3VyZjNEKTsKLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotLyogVXBkYXRlIGJ1ZmZlciBvZmZzZXQvcGl0Y2gvZm9ybWF0ICovCi1zdGF0aWMgR0xib29sZWFuIG52MDRCaW5kQnVmZmVycyhub3V2ZWF1Q29udGV4dFB0ciBubWVzYSwgaW50IG51bV9jb2xvciwKLQkJbm91dmVhdV9yZW5kZXJidWZmZXIgKipjb2xvciwKLQkJbm91dmVhdV9yZW5kZXJidWZmZXIgKmRlcHRoKQotewotCUdMdWludCB4LCB5LCB3LCBoOwotCXVpbnQzMl90IGRlcHRoX3BpdGNoPShkZXB0aD9kZXB0aC0+cGl0Y2g6MCsxNSkmfjE1KzE2OwotCWlmIChkZXB0aF9waXRjaDwyNTYpIGRlcHRoX3BpdGNoPTI1NjsKLQotCXcgPSBjb2xvclswXS0+bWVzYS5XaWR0aDsKLQloID0gY29sb3JbMF0tPm1lc2EuSGVpZ2h0OwotCXggPSBubWVzYS0+ZHJhd1g7Ci0JeSA9IG5tZXNhLT5kcmF3WTsKLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YkN0eFN1cmYzRCwgTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX0ZPUk1BVCwgMSk7Ci0JaWYgKGNvbG9yWzBdLT5tZXNhLl9BY3R1YWxGb3JtYXQgPT0gR0xfUkdCQTgpCi0JCU9VVF9SSU5HKDB4MTA4LypBOFI4RzhCOCovKTsKLQllbHNlCi0JCU9VVF9SSU5HKDB4MTAzLypSNUc2QjUqLyk7Ci0KLQkvKiBGSVhNRSBwaXRjaGVzIGhhdmUgdG8gYmUgYWxpZ25lZCAhICovCi0JQkVHSU5fUklOR19TSVpFKE52U3ViQ3R4U3VyZjNELCBOVjA0X0NPTlRFWFRfU1VSRkFDRVNfM0RfUElUQ0gsIDIpOwotCU9VVF9SSU5HKGNvbG9yWzBdLT5waXRjaHwoZGVwdGhfcGl0Y2g8PDE2KSk7Ci0JT1VUX1JJTkcoY29sb3JbMF0tPm9mZnNldCk7Ci0JaWYgKGRlcHRoKSB7Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YkN0eFN1cmYzRCwgTlYwNF9DT05URVhUX1NVUkZBQ0VTXzNEX09GRlNFVF9aRVRBLCAxKTsKLQkJT1VUX1JJTkcoZGVwdGgtPm9mZnNldCk7Ci0JfQotCi0vLwlCRUdJTl9SSU5HX1NJWkUoTnZTdWJDdHhTdXJmM0QsIE5WMDRfQ09OVEVYVF9TVVJGQUNFU18zRF9DTElQX0hPUklaT05UQUwsIDIpOwotLy8JT1VUX1JJTkcoKHc8PDE2KXx4KTsKLS8vCU9VVF9SSU5HKChoPDwxNil8eSk7Ci0KLQotCS8qIEZJWE1FIG5vdCBzdXJlLi4uICovCi0vKglCRUdJTl9SSU5HX1NJWkUoTnZTdWJDdHhTdXJmM0QsIE5WMDRfQ09OVEVYVF9TVVJGQUNFU18zRF9DTElQX1NJWkUsIDEpOwotCU9VVF9SSU5HKChoPDwxNil8dyk7Ki8KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi12b2lkIG52MDRJbml0U3RhdGVGdW5jcyhHTGNvbnRleHQgKmN0eCwgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlmdW5jLT5BbHBoYUZ1bmMJCQk9IG52MDRBbHBoYUZ1bmM7Ci0JZnVuYy0+QmxlbmRDb2xvcgkJPSBudjA0QmxlbmRDb2xvcjsKLQlmdW5jLT5CbGVuZEVxdWF0aW9uU2VwYXJhdGUJPSBudjA0QmxlbmRFcXVhdGlvblNlcGFyYXRlOwotCWZ1bmMtPkJsZW5kRnVuY1NlcGFyYXRlCQk9IG52MDRCbGVuZEZ1bmNTZXBhcmF0ZTsKLQlmdW5jLT5DbGVhcgkJCT0gbnYwNENsZWFyOwotCWZ1bmMtPkNsZWFyQ29sb3IJCT0gbnYwNENsZWFyQ29sb3I7Ci0JZnVuYy0+Q2xlYXJEZXB0aAkJPSBudjA0Q2xlYXJEZXB0aDsKLQlmdW5jLT5DbGVhclN0ZW5jaWwJCT0gbnYwNENsZWFyU3RlbmNpbDsKLQlmdW5jLT5DbGlwUGxhbmUJCQk9IG52MDRDbGlwUGxhbmU7Ci0JZnVuYy0+Q29sb3JNYXNrCQkJPSBudjA0Q29sb3JNYXNrOwotCWZ1bmMtPkNvbG9yTWF0ZXJpYWwJCT0gbnYwNENvbG9yTWF0ZXJpYWw7Ci0JZnVuYy0+Q3VsbEZhY2UJCQk9IG52MDRDdWxsRmFjZTsKLQlmdW5jLT5Gcm9udEZhY2UJCQk9IG52MDRGcm9udEZhY2U7Ci0JZnVuYy0+RGVwdGhGdW5jCQkJPSBudjA0RGVwdGhGdW5jOwotCWZ1bmMtPkRlcHRoTWFzawkJCT0gbnYwNERlcHRoTWFzazsKLQlmdW5jLT5EZXB0aFJhbmdlCQk9IG52MDREZXB0aFJhbmdlOwotCWZ1bmMtPkVuYWJsZQkJCT0gbnYwNEVuYWJsZTsKLQlmdW5jLT5Gb2dmdgkJCT0gbnYwNEZvZ2Z2OwotCWZ1bmMtPkhpbnQJCQk9IG52MDRIaW50OwotLyoJZnVuYy0+TGlnaHRmdgkJCT0gbnYwNExpZ2h0ZnY7Ki8KLS8qCWZ1bmMtPkxpZ2h0TW9kZWxmdgkJPSBudjA0TGlnaHRNb2RlbGZ2OyAqLwotCWZ1bmMtPkxpbmVTdGlwcGxlCQk9IG52MDRMaW5lU3RpcHBsZTsJCS8qIE5vdCBmb3IgTlYwNCAqLwotCWZ1bmMtPkxpbmVXaWR0aAkJCT0gbnYwNExpbmVXaWR0aDsKLQlmdW5jLT5Mb2dpY09wY29kZQkJPSBudjA0TG9naWNPcGNvZGU7Ci0JZnVuYy0+UG9pbnRQYXJhbWV0ZXJmdgkJPSBudjA0UG9pbnRQYXJhbWV0ZXJmdjsKLQlmdW5jLT5Qb2ludFNpemUJCQk9IG52MDRQb2ludFNpemU7Ci0JZnVuYy0+UG9seWdvbk1vZGUJCT0gbnYwNFBvbHlnb25Nb2RlOwotCWZ1bmMtPlBvbHlnb25PZmZzZXQJCT0gbnYwNFBvbHlnb25PZmZzZXQ7Ci0JZnVuYy0+UG9seWdvblN0aXBwbGUJCT0gbnYwNFBvbHlnb25TdGlwcGxlOwkJLyogTm90IGZvciBOVjA0ICovCi0vKglmdW5jLT5SZWFkQnVmZmVyCQk9IG52MDRSZWFkQnVmZmVyOyovCi0vKglmdW5jLT5SZW5kZXJNb2RlCQk9IG52MDRSZW5kZXJNb2RlOyovCi0JZnVuYy0+U2Npc3NvcgkJCT0gbnYwNFNjaXNzb3I7Ci0JZnVuYy0+U2hhZGVNb2RlbAkJPSBudjA0U2hhZGVNb2RlbDsKLQlmdW5jLT5TdGVuY2lsRnVuY1NlcGFyYXRlCT0gbnYwNFN0ZW5jaWxGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+U3RlbmNpbE1hc2tTZXBhcmF0ZQk9IG52MDRTdGVuY2lsTWFza1NlcGFyYXRlOwotCWZ1bmMtPlN0ZW5jaWxPcFNlcGFyYXRlCQk9IG52MDRTdGVuY2lsT3BTZXBhcmF0ZTsKLS8qCWZ1bmMtPlRleEdlbgkJCT0gbnYwNFRleEdlbjsqLwotLyoJZnVuYy0+VGV4UGFyYW1ldGVyCQk9IG52MDRUZXhQYXJhbWV0ZXI7Ki8KLS8qCWZ1bmMtPlRleHR1cmVNYXRyaXgJCT0gbnYwNFRleHR1cmVNYXRyaXg7Ki8KLQotCW5tZXNhLT5od19mdW5jLkluaXRDYXJkCQk9IG52MDRJbml0Q2FyZDsKLQlubWVzYS0+aHdfZnVuYy5CaW5kQnVmZmVycwk9IG52MDRCaW5kQnVmZmVyczsKLQlubWVzYS0+aHdfZnVuYy5XaW5kb3dNb3ZlZAk9IG52MDRXaW5kb3dNb3ZlZDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYwNF9zd3RjbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjA0X3N3dGNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDcyZTAuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjA0X3N3dGNsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA3IFN0ZXBoYW5lIE1hcmNoZXNpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICovCi0KLS8qIFNvZnR3YXJlIFRDTCBmb3IgTlYwNCwgTlYwNSwgTlYwNiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotI2luY2x1ZGUgImVudW1zLmgiCi0KLSNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCi0jaW5jbHVkZSAic3dyYXN0X3NldHVwL3N3cmFzdF9zZXR1cC5oIgotI2luY2x1ZGUgInRubC90X2NvbnRleHQuaCIKLSNpbmNsdWRlICJ0bmwvdF9waXBlbGluZS5oIgotCi0jaW5jbHVkZSAibm91dmVhdV9zd3RjbC5oIgotI2luY2x1ZGUgIm52MDRfc3d0Y2wuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3NwYW4uaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfdGV4LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9tc2cuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotCi1zdGF0aWMgdm9pZCBudjA0UmFzdGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHJwcmltLCBHTHVpbnQgaHdwcmltICk7Ci1zdGF0aWMgdm9pZCBudjA0UmVuZGVyUHJpbWl0aXZlKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHByaW0gKTsKLXN0YXRpYyB2b2lkIG52MDRSZXNldExpbmVTdGlwcGxlKCBHTGNvbnRleHQgKmN0eCApOwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjA0XzJ0cmlhbmdsZXMoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2Esbm91dmVhdVZlcnRleCogdjAsbm91dmVhdVZlcnRleCogdjEsbm91dmVhdVZlcnRleCogdjIsbm91dmVhdVZlcnRleCogdjMsbm91dmVhdVZlcnRleCogdjQsbm91dmVhdVZlcnRleCogdjUpCi17Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goMHhBKSw0OSk7Ci0JT1VUX1JJTkdwKHYwLDgpOwotCU9VVF9SSU5HcCh2MSw4KTsKLQlPVVRfUklOR3AodjIsOCk7Ci0JT1VUX1JJTkdwKHYzLDgpOwotCU9VVF9SSU5HcCh2NCw4KTsKLQlPVVRfUklOR3AodjUsOCk7Ci0JT1VUX1JJTkcoMHhGRURDQkEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYwNF8xdHJpYW5nbGUoc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2Esbm91dmVhdVZlcnRleCogdjAsbm91dmVhdVZlcnRleCogdjEsbm91dmVhdVZlcnRleCogdjIpCi17Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goMHhEKSwyNSk7Ci0JT1VUX1JJTkdwKHYwLDgpOwotCU9VVF9SSU5HcCh2MSw4KTsKLQlPVVRfUklOR3AodjIsOCk7Ci0JT1VUX1JJTkcoMHhGRUQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYwNF8xcXVhZChzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSxub3V2ZWF1VmVydGV4KiB2MCxub3V2ZWF1VmVydGV4KiB2MSxub3V2ZWF1VmVydGV4KiB2Mixub3V2ZWF1VmVydGV4KiB2MykKLXsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9UTFZFUlRFWF9TWCgweEMpLDMzKTsKLQlPVVRfUklOR3AodjAsOCk7Ci0JT1VUX1JJTkdwKHYxLDgpOwotCU9VVF9SSU5HcCh2Miw4KTsKLQlPVVRfUklOR3AodjMsOCk7Ci0JT1VUX1JJTkcoMHhGRUNFREMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYwNF9yZW5kZXJfcG9pbnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBmaXJzdCxHTHVpbnQgbGFzdCkKLXsKLQlXQVJOX09OQ0UoIlVuaW1wbGVtZW50ZWRcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYwNF9yZW5kZXJfbGluZShHTGNvbnRleHQgKmN0eCxHTHVpbnQgdjEsR0x1aW50IHYyKQotewotCVdBUk5fT05DRSgiVW5pbXBsZW1lbnRlZFxuIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjA0X3JlbmRlcl90cmlhbmdsZShHTGNvbnRleHQgKmN0eCxHTHVpbnQgdjEsR0x1aW50IHYyLEdMdWludCB2MykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0KLQludjA0XzF0cmlhbmdsZShubWVzYSwKLQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cit2MSp2ZXJ0c2l6ZSksCi0JCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrdjIqdmVydHNpemUpLAotCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK3YzKnZlcnRzaXplKQotCQkgICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjA0X3JlbmRlcl9xdWFkKEdMY29udGV4dCAqY3R4LEdMdWludCB2MSxHTHVpbnQgdjIsR0x1aW50IHYzLEdMdWludCB2NCkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0KLQludjA0XzFxdWFkKG5tZXNhLAotCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK3YxKnZlcnRzaXplKSwKLQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cit2Mip2ZXJ0c2l6ZSksCi0JCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrdjMqdmVydHNpemUpLAotCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK3Y0KnZlcnRzaXplKQotCQkgICk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICBSZW5kZXIgdW5jbGlwcGVkIGJlZ2luL2VuZCBvYmplY3RzICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfcG9pbnRzX3ZlcnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCS8vIGVybQotfQotCi1zdGF0aWMgdm9pZCBudjA0X3JlbmRlcl9saW5lc192ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQkvLyB1bW0KLX0KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfbGluZV9zdHJpcF92ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQkvLyB5ZWFoCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX2xpbmVfbG9vcF92ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQkvLyByaWdodAotfQotCi1zdGF0aWMgdm9pZCBudjA0X3JlbmRlcl90cmlhbmdsZXNfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlICp2ZXJ0cHRyID0gKEdMdWJ5dGUgKilubWVzYS0+dmVydHM7Ci0JR0x1aW50IHZlcnRzaXplID0gbm1lc2EtPnZlcnRleF9zaXplOwotCWludCBpOwotCi0JZm9yKGk9c3RhcnQ7aTxjb3VudC01O2krPTYpCi0JCW52MDRfMnRyaWFuZ2xlcyhubWVzYSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkrMCkqdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cisoaSsxKSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhpKzIpKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkrMykqdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cisoaSs0KSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhpKzUpKnZlcnRzaXplKQotCQkJICAgICAgICk7Ci0JaWYgKGkhPWNvdW50KQotCXsKLQkJbnYwNF8xdHJpYW5nbGUobm1lc2EsCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhpKzApKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkrMSkqdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cisoaSsyKSp2ZXJ0c2l6ZSkKLQkJCSAgICAgICApOwotCQlpKz0zOwotCX0KLQlpZiAoaSE9Y291bnQpCi0JCXByaW50Zigib29wc1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX3RyaV9zdHJpcF92ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JdWludDMyX3Qgc3RyaXB0YmxbXT17MHgzMjEyMTAsMHg1NDM0MzIsMHg3NjU2NTQsMHg5ODc4NzYsMHhCQTlBOTgsMHhEQ0JDQkEsMHhGRURFREN9OwotCWludCBpLGo7Ci0KLQlmb3IoaT1zdGFydDtpPGNvdW50O2krPTE0KQotCXsKLQkJaW50IG51bXZlcnQ9TUlOMigxNixjb3VudC1pKTsKLQkJaW50IG51bXRyaT1udW12ZXJ0LTI7Ci0JCWlmIChudW12ZXJ0PDMpCi0JCQlicmVhazsKLQotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9UTFZFUlRFWF9TWCgweDApLG51bXZlcnQqOCk7Ci0JCWZvcihqPTA7ajxudW12ZXJ0O2orKykKLQkJCU9VVF9SSU5HcCgobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkraikqdmVydHNpemUpLDgpOwotCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX0RSQVd8Tk9OSU5DX01FVEhPRCwobnVtdHJpKzEpLzIpOwotCQlmb3Ioaj0wO2o8bnVtdHJpLzI7aisrKQotCQkJT1VUX1JJTkcoc3RyaXB0Ymxbal0pOwotCQlpZiAobnVtdHJpJTIpCi0JCQlPVVRfUklORyhzdHJpcHRibFtudW10cmkvMl0mMHhGRkYpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfdHJpX2Zhbl92ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JdWludDMyX3QgZmFudGJsW109ezB4MzIwMjEwLDB4NTQwNDMwLDB4NzYwNjUwLDB4OTgwODcwLDB4QkEwQTkwLDB4REMwQ0IwLDB4RkUwRUQwfTsKLQlpbnQgaSxqOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goMHgwKSw4KTsKLQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK3N0YXJ0KnZlcnRzaXplKSw4KTsKLQotCWZvcihpPXN0YXJ0KzE7aTxjb3VudDtpKz0xNCkKLQl7Ci0JCWludCBudW12ZXJ0PU1JTjIoMTUsY291bnQtaSk7Ci0JCWludCBudW10cmk9bnVtdmVydC0xOwotCQlpZiAobnVtdmVydDwzKQotCQkJYnJlYWs7Ci0KLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goMHgxKSxudW12ZXJ0KjgpOwotCi0JCWZvcihqPTA7ajxudW12ZXJ0O2orKykKLQkJCU9VVF9SSU5HcCgobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkraikqdmVydHNpemUpLDgpOwotCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX0RSQVd8Tk9OSU5DX01FVEhPRCwobnVtdHJpKzEpLzIpOwotCQlmb3Ioaj0wO2o8bnVtdHJpLzI7aisrKQotCQkJT1VUX1JJTkcoZmFudGJsW2pdKTsKLQkJaWYgKG51bXRyaSUyKQotCQkJT1VUX1JJTkcoZmFudGJsW251bXRyaS8yXSYweEZGRik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjA0X3JlbmRlcl9xdWFkc192ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JaW50IGk7Ci0KLQlmb3IoaT1zdGFydDtpPGNvdW50O2krPTQpCi0JCW52MDRfMXF1YWQobm1lc2EsCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhpKzApKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrKGkrMSkqdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0cisoaSsyKSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhpKzMpKnZlcnRzaXplKQotCQkJICAgICAgICk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX25vb3BfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci19Ci0KLXN0YXRpYyB2b2lkICgqbnYwNF9yZW5kZXJfdGFiX3ZlcnRzW0dMX1BPTFlHT04rMl0pKEdMY29udGV4dCAqLAotCQkJCQkJCSAgIEdMdWludCwKLQkJCQkJCQkgICBHTHVpbnQsCi0JCQkJCQkJICAgR0x1aW50KSA9Ci17Ci0gICBudjA0X3JlbmRlcl9wb2ludHNfdmVydHMsCi0gICBudjA0X3JlbmRlcl9saW5lc192ZXJ0cywKLSAgIG52MDRfcmVuZGVyX2xpbmVfbG9vcF92ZXJ0cywKLSAgIG52MDRfcmVuZGVyX2xpbmVfc3RyaXBfdmVydHMsCi0gICBudjA0X3JlbmRlcl90cmlhbmdsZXNfdmVydHMsCi0gICBudjA0X3JlbmRlcl90cmlfc3RyaXBfdmVydHMsCi0gICBudjA0X3JlbmRlcl90cmlfZmFuX3ZlcnRzLAotICAgbnYwNF9yZW5kZXJfcXVhZHNfdmVydHMsCi0gICBudjA0X3JlbmRlcl90cmlfc3RyaXBfdmVydHMsICAvL252MDRfcmVuZGVyX3F1YWRfc3RyaXBfdmVydHMKLSAgIG52MDRfcmVuZGVyX3RyaV9mYW5fdmVydHMsICAgIC8vbnYwNF9yZW5kZXJfcG9seV92ZXJ0cwotICAgbnYwNF9yZW5kZXJfbm9vcF92ZXJ0cywKLX07Ci0KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfcG9pbnRzX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JLy8gZXJtCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX2xpbmVzX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JLy8gdW1tCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX2xpbmVfc3RyaXBfZWx0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQkvLyB5ZWFoCi19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX2xpbmVfbG9vcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCS8vIHJpZ2h0Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX3RyaWFuZ2xlc19lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1Ynl0ZSAqdmVydHB0ciA9IChHTHVieXRlICopbm1lc2EtPnZlcnRzOwotCUdMdWludCB2ZXJ0c2l6ZSA9IG5tZXNhLT52ZXJ0ZXhfc2l6ZTsKLQljb25zdCBHTHVpbnQgKiBjb25zdCBlbHQgPSBUTkxfQ09OVEVYVChjdHgpLT52Yi5FbHRzOwotCWludCBpOwotCi0JZm9yKGk9c3RhcnQ7aTxjb3VudC01O2krPTYpCi0JCW52MDRfMnRyaWFuZ2xlcyhubWVzYSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W2krMF0qdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0citlbHRbaSsxXSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpKzJdKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W2krM10qdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0citlbHRbaSs0XSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpKzVdKnZlcnRzaXplKQotCQkJICAgICAgICk7Ci0JaWYgKGkhPWNvdW50KQotCXsKLQkJbnYwNF8xdHJpYW5nbGUobm1lc2EsCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpKzBdKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W2krMV0qdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0citlbHRbaSsyXSp2ZXJ0c2l6ZSkKLQkJCSAgICAgICApOwotCQlpKz0zOwotCX0KLQlpZiAoaSE9Y291bnQpCi0JCXByaW50Zigib29wc1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX3RyaV9zdHJpcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1Ynl0ZSAqdmVydHB0ciA9IChHTHVieXRlICopbm1lc2EtPnZlcnRzOwotCUdMdWludCB2ZXJ0c2l6ZSA9IG5tZXNhLT52ZXJ0ZXhfc2l6ZTsKLQl1aW50MzJfdCBzdHJpcHRibFtdPXsweDMyMTIxMCwweDU0MzQzMiwweDc2NTY1NCwweDk4Nzg3NiwweEJBOUE5OCwweERDQkNCQSwweEZFREVEQ307Ci0JY29uc3QgR0x1aW50ICogY29uc3QgZWx0ID0gVE5MX0NPTlRFWFQoY3R4KS0+dmIuRWx0czsKLQlpbnQgaSxqOwotCi0JZm9yKGk9c3RhcnQ7aTxjb3VudDtpKz0xNCkKLQl7Ci0JCWludCBudW12ZXJ0PU1JTjIoMTYsY291bnQtaSk7Ci0JCWludCBudW10cmk9bnVtdmVydC0yOwotCQlpZiAobnVtdmVydDwzKQotCQkJYnJlYWs7Ci0KLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYwNF9EWDVfVEVYVFVSRURfVFJJQU5HTEVfVExWRVJURVhfU1goMHgwKSxudW12ZXJ0KjgpOwotCQlmb3Ioaj0wO2o8bnVtdmVydDtqKyspCi0JCQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpK2pdKnZlcnRzaXplKSw4KTsKLQotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9EUkFXfE5PTklOQ19NRVRIT0QsKG51bXRyaSsxKS8yKTsKLQkJZm9yKGo9MDtqPG51bXRyaS8yO2orKykKLQkJCU9VVF9SSU5HKHN0cmlwdGJsW2pdKTsKLQkJaWYgKG51bXRyaSUyKQotCQkJT1VUX1JJTkcoc3RyaXB0YmxbbnVtdHJpLzJdJjB4RkZGKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX3RyaV9mYW5fZWx0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JdWludDMyX3QgZmFudGJsW109ezB4MzIwMjEwLDB4NTQwNDMwLDB4NzYwNjUwLDB4OTgwODcwLDB4QkEwQTkwLDB4REMwQ0IwLDB4RkUwRUQwfTsKLQljb25zdCBHTHVpbnQgKiBjb25zdCBlbHQgPSBUTkxfQ09OVEVYVChjdHgpLT52Yi5FbHRzOwotCWludCBpLGo7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9UTFZFUlRFWF9TWCgweDApLDgpOwotCU9VVF9SSU5HcCgobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W3N0YXJ0XSp2ZXJ0c2l6ZSksOCk7Ci0KLQlmb3IoaT1zdGFydCsxO2k8Y291bnQ7aSs9MTQpCi0JewotCQlpbnQgbnVtdmVydD1NSU4yKDE1LGNvdW50LWkpOwotCQlpbnQgbnVtdHJpPW51bXZlcnQtMjsKLQkJaWYgKG51bXZlcnQ8MykKLQkJCWJyZWFrOwotCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMDRfRFg1X1RFWFRVUkVEX1RSSUFOR0xFX1RMVkVSVEVYX1NYKDB4MSksbnVtdmVydCo4KTsKLQotCQlmb3Ioaj0wO2o8bnVtdmVydDtqKyspCi0JCQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpK2pdKnZlcnRzaXplKSw4KTsKLQotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjA0X0RYNV9URVhUVVJFRF9UUklBTkdMRV9EUkFXfE5PTklOQ19NRVRIT0QsKG51bXRyaSsxKS8yKTsKLQkJZm9yKGo9MDtqPG51bXRyaS8yO2orKykKLQkJCU9VVF9SSU5HKGZhbnRibFtqXSk7Ci0JCWlmIChudW10cmklMikKLQkJCU9VVF9SSU5HKGZhbnRibFtudW10cmkvMl0mMHhGRkYpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfcXVhZHNfZWx0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JY29uc3QgR0x1aW50ICogY29uc3QgZWx0ID0gVE5MX0NPTlRFWFQoY3R4KS0+dmIuRWx0czsKLQlpbnQgaTsKLQotCWZvcihpPXN0YXJ0O2k8Y291bnQ7aSs9NCkKLQkJbnYwNF8xcXVhZChubWVzYSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W2krMF0qdmVydHNpemUpLAotCQkJCShub3V2ZWF1VmVydGV4KikodmVydHB0citlbHRbaSsxXSp2ZXJ0c2l6ZSksCi0JCQkJKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyK2VsdFtpKzJdKnZlcnRzaXplKSwKLQkJCQkobm91dmVhdVZlcnRleCopKHZlcnRwdHIrZWx0W2krM10qdmVydHNpemUpCi0JCQkgICAgICAgKTsKLX0KLQotc3RhdGljIHZvaWQgbnYwNF9yZW5kZXJfbm9vcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotfQotCi1zdGF0aWMgdm9pZCAoKm52MDRfcmVuZGVyX3RhYl9lbHRzW0dMX1BPTFlHT04rMl0pKEdMY29udGV4dCAqLAotCQkJCQkJCSAgIEdMdWludCwKLQkJCQkJCQkgICBHTHVpbnQsCi0JCQkJCQkJICAgR0x1aW50KSA9Ci17Ci0gICBudjA0X3JlbmRlcl9wb2ludHNfZWx0cywKLSAgIG52MDRfcmVuZGVyX2xpbmVzX2VsdHMsCi0gICBudjA0X3JlbmRlcl9saW5lX2xvb3BfZWx0cywKLSAgIG52MDRfcmVuZGVyX2xpbmVfc3RyaXBfZWx0cywKLSAgIG52MDRfcmVuZGVyX3RyaWFuZ2xlc19lbHRzLAotICAgbnYwNF9yZW5kZXJfdHJpX3N0cmlwX2VsdHMsCi0gICBudjA0X3JlbmRlcl90cmlfZmFuX2VsdHMsCi0gICBudjA0X3JlbmRlcl9xdWFkc19lbHRzLAotICAgbnYwNF9yZW5kZXJfdHJpX3N0cmlwX2VsdHMsICAgLy8gbnYwNF9yZW5kZXJfcXVhZF9zdHJpcF9lbHRzLAotICAgbnYwNF9yZW5kZXJfdHJpX2Zhbl9lbHRzLCAgICAgLy8gbnYwNF9yZW5kZXJfcG9seV9lbHRzLAotICAgbnYwNF9yZW5kZXJfbm9vcF9lbHRzLAotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICBDaG9vc2UgcmVuZGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBFTUlUX0FUVFIoIEFUVFIsIFNUWUxFICkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gICBubWVzYS0+dmVydGV4X2F0dHJzW25tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudF0uYXR0cmliID0gKEFUVFIpOwlcCi0gICBubWVzYS0+dmVydGV4X2F0dHJzW25tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudF0uZm9ybWF0ID0gKFNUWUxFKTsJXAotICAgbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50Kys7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFTUlUX1BBRCggTiApCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gICBubWVzYS0+dmVydGV4X2F0dHJzW25tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudF0uYXR0cmliID0gMDsJCVwKLSAgIG5tZXNhLT52ZXJ0ZXhfYXR0cnNbbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50XS5mb3JtYXQgPSBFTUlUX1BBRDsJXAotICAgbm1lc2EtPnZlcnRleF9hdHRyc1tubWVzYS0+dmVydGV4X2F0dHJfY291bnRdLm9mZnNldCA9IChOKTsJCVwKLSAgIG5tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudCsrOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIG52MDRfcmVuZGVyX2NsaXBwZWRfbGluZShHTGNvbnRleHQgKmN0eCxHTHVpbnQgaWksR0x1aW50IGpqKQotewotfQotCi1zdGF0aWMgdm9pZCBudjA0X3JlbmRlcl9jbGlwcGVkX3BvbHkoR0xjb250ZXh0ICpjdHgsY29uc3QgR0x1aW50ICplbHRzLEdMdWludCBuKQotewotfQotCi1zdGF0aWMgdm9pZCBudjA0Q2hvb3NlUmVuZGVyU3RhdGUoR0xjb250ZXh0ICpjdHgpCi17Ci0JVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLQotCXRubC0+RHJpdmVyLlJlbmRlci5QcmltVGFiVmVydHMgPSBudjA0X3JlbmRlcl90YWJfdmVydHM7Ci0JdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJFbHRzID0gbnYwNF9yZW5kZXJfdGFiX2VsdHM7Ci0JdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRMaW5lID0gbnYwNF9yZW5kZXJfY2xpcHBlZF9saW5lOwotCXRubC0+RHJpdmVyLlJlbmRlci5DbGlwcGVkUG9seWdvbiA9IG52MDRfcmVuZGVyX2NsaXBwZWRfcG9seTsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUG9pbnRzID0gbnYwNF9yZW5kZXJfcG9pbnRzOwotCXRubC0+RHJpdmVyLlJlbmRlci5MaW5lID0gbnYwNF9yZW5kZXJfbGluZTsKLQl0bmwtPkRyaXZlci5SZW5kZXIuVHJpYW5nbGUgPSBudjA0X3JlbmRlcl90cmlhbmdsZTsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUXVhZCA9IG52MDRfcmVuZGVyX3F1YWQ7Ci19Ci0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYwNE91dHB1dFZlcnRleEZvcm1hdChzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0KiBubWVzYSkKLXsKLQlHTGNvbnRleHQqIGN0eD1ubWVzYS0+Z2xDdHg7Ci0JREVDTEFSRV9SRU5ERVJJTlBVVFMoaW5kZXgpOwotCi0JLyoKLQkgKiBUZWxsIHRfdmVydGV4IGFib3V0IHRoZSB2ZXJ0ZXggZm9ybWF0Ci0JICovCi0Jbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50ID0gMDsKLQlSRU5ERVJJTlBVVFNfQ09QWShpbmRleCwgbm1lc2EtPnJlbmRlcl9pbnB1dHNfYml0c2V0KTsKLQotCS8vIFNYIFNZIFNaIElOVlcKLQkvLyBGSVhNRSA6IHdlIHVzZSBXIGluc3RlYWQgb2YgSU5WVywgYnV0IHNpbmNlIFc9MSBpdCBkb2Vzbid0IG1hdHRlcgotCWlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleCwgX1ROTF9BVFRSSUJfUE9TKSkKLQkJRU1JVF9BVFRSKF9UTkxfQVRUUklCX1BPUyxFTUlUXzRGX1ZJRVdQT1JUKTsKLQllbHNlCi0JCUVNSVRfUEFEKDQqc2l6ZW9mKGZsb2F0KSk7Ci0KLQkvLyBDT0xPUgotCWlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleCwgX1ROTF9BVFRSSUJfQ09MT1IwKSkKLQkJRU1JVF9BVFRSKF9UTkxfQVRUUklCX0NPTE9SMCxFTUlUXzRVQl80Rl9BQkdSKTsKLQllbHNlCi0JCUVNSVRfUEFEKDQpOwotCi0JLy8gU1BFQ1VMQVIKLQlpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXgsIF9UTkxfQVRUUklCX0NPTE9SMSkpCi0JCUVNSVRfQVRUUihfVE5MX0FUVFJJQl9DT0xPUjEsRU1JVF80VUJfNEZfQUJHUik7Ci0JZWxzZQotCQlFTUlUX1BBRCg0KTsKLQotCS8vIFRFWFRVUkUKLQlpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXgsIF9UTkxfQVRUUklCX1RFWDApKQotCQlFTUlUX0FUVFIoX1ROTF9BVFRSSUJfVEVYMCxFTUlUXzJGKTsKLQllbHNlCi0JCUVNSVRfUEFEKDIqc2l6ZW9mKGZsb2F0KSk7Ci0KLQlubWVzYS0+dmVydGV4X3NpemU9X3RubF9pbnN0YWxsX2F0dHJzKCBjdHgsCi0JCQlubWVzYS0+dmVydGV4X2F0dHJzLCAKLQkJCW5tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudCwKLQkJCW5tZXNhLT52aWV3cG9ydC5tLCAwICk7Ci19Ci0KLQotc3RhdGljIHZvaWQgbnYwNENob29zZVZlcnRleFN0YXRlKCBHTGNvbnRleHQgKmN0eCApCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwotCURFQ0xBUkVfUkVOREVSSU5QVVRTKGluZGV4KTsKLQotCVJFTkRFUklOUFVUU19DT1BZKGluZGV4LCB0bmwtPnJlbmRlcl9pbnB1dHNfYml0c2V0KTsKLQlpZiAoIVJFTkRFUklOUFVUU19FUVVBTChpbmRleCwgbm1lc2EtPnJlbmRlcl9pbnB1dHNfYml0c2V0KSkKLQl7Ci0JCVJFTkRFUklOUFVUU19DT1BZKG5tZXNhLT5yZW5kZXJfaW5wdXRzX2JpdHNldCwgaW5kZXgpOwotCQludjA0T3V0cHV0VmVydGV4Rm9ybWF0KG5tZXNhKTsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgSGlnaCBsZXZlbCBob29rcyBmb3IgdF92Yl9yZW5kZXIuYyAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkIG52MDRSZW5kZXJTdGFydChHTGNvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKG5tZXNhLT5uZXdfc3RhdGUpIHsKLQkJbm1lc2EtPm5ld19yZW5kZXJfc3RhdGUgfD0gbm1lc2EtPm5ld19zdGF0ZTsKLQl9Ci0KLQlpZiAobm1lc2EtPm5ld19yZW5kZXJfc3RhdGUpIHsKLQkJbnYwNENob29zZVZlcnRleFN0YXRlKGN0eCk7Ci0JCW52MDRDaG9vc2VSZW5kZXJTdGF0ZShjdHgpOwotCQlubWVzYS0+bmV3X3JlbmRlcl9zdGF0ZSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjA0UmVuZGVyRmluaXNoKEdMY29udGV4dCAqY3R4KQotewotfQotCi0KLS8qIFN5c3RlbSB0byBmbHVzaCBkbWEgYW5kIGVtaXQgc3RhdGUgY2hhbmdlcyBiYXNlZCBvbiB0aGUgcmFzdGVyaXplZAotICogcHJpbWl0aXZlLgotICovCi12b2lkIG52MDRSYXN0ZXJQcmltaXRpdmUoR0xjb250ZXh0ICpjdHgsCi0JCUdMZW51bSBnbHByaW0sCi0JCUdMdWludCBod3ByaW0pCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWFzc2VydCAoIW5tZXNhLT5uZXdfc3RhdGUpOwotCi0JaWYgKGh3cHJpbSAhPSBubWVzYS0+Y3VycmVudF9wcmltaXRpdmUpCi0JewotCQlubWVzYS0+Y3VycmVudF9wcmltaXRpdmU9aHdwcmltOwotCQkKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBHTHVpbnQgaHdfcHJpbVtHTF9QT0xZR09OKzFdID0gewotCUdMX1BPSU5UUysxLAotCUdMX0xJTkVTKzEsCi0JR0xfTElORV9TVFJJUCsxLAotCUdMX0xJTkVfTE9PUCsxLAotCUdMX1RSSUFOR0xFUysxLAotCUdMX1RSSUFOR0xFX1NUUklQKzEsCi0JR0xfVFJJQU5HTEVfRkFOKzEsCi0JR0xfUVVBRFMrMSwKLQlHTF9RVUFEX1NUUklQKzEsCi0JR0xfUE9MWUdPTisxCi19OwotCi0vKiBDYWxsYmFjayBmb3IgbWVzYToKLSAqLwotc3RhdGljIHZvaWQgbnYwNFJlbmRlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBwcmltICkKLXsKLQludjA0UmFzdGVyUHJpbWl0aXZlKCBjdHgsIHByaW0sIGh3X3ByaW1bcHJpbV0gKTsKLX0KLQotc3RhdGljIHZvaWQgbnYwNFJlc2V0TGluZVN0aXBwbGUoIEdMY29udGV4dCAqY3R4ICkKLXsKLQkvKiBGSVhNRSBkbyBzb21ldGhpbmcgaGVyZSAqLwotCVdBUk5fT05DRSgiVW5pbXBsZW1lbnRlZCBudjA0UmVzZXRMaW5lU3RpcHBsZVxuIik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIG52MDRUcmlJbml0RnVuY3Rpb25zKEdMY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLQotCXRubC0+RHJpdmVyLlJ1blBpcGVsaW5lID0gbm91dmVhdVJ1blBpcGVsaW5lOwotCXRubC0+RHJpdmVyLlJlbmRlci5TdGFydCA9IG52MDRSZW5kZXJTdGFydDsKLQl0bmwtPkRyaXZlci5SZW5kZXIuRmluaXNoID0gbnYwNFJlbmRlckZpbmlzaDsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUHJpbWl0aXZlTm90aWZ5ID0gbnYwNFJlbmRlclByaW1pdGl2ZTsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUmVzZXRMaW5lU3RpcHBsZSA9IG52MDRSZXNldExpbmVTdGlwcGxlOwotCXRubC0+RHJpdmVyLlJlbmRlci5CdWlsZFZlcnRpY2VzID0gX3RubF9idWlsZF92ZXJ0aWNlczsKLQl0bmwtPkRyaXZlci5SZW5kZXIuQ29weVBWID0gX3RubF9jb3B5X3B2OwotCXRubC0+RHJpdmVyLlJlbmRlci5JbnRlcnAgPSBfdG5sX2ludGVycDsKLQotCV90bmxfaW5pdF92ZXJ0aWNlcyggY3R4LCBjdHgtPkNvbnN0Lk1heEFycmF5TG9ja1NpemUgKyAxMiwgMzIgKTsKLQotCW5tZXNhLT52ZXJ0cyA9IChHTHVieXRlICopdG5sLT5jbGlwc3BhY2UudmVydGV4X2J1ZjsKLX0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MDRfc3d0Y2wuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYwNF9zd3RjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRkZTUzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYwNF9zd3RjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2lmbmRlZiBfX05WMDRfU1dUQ0xfSF9fCi0jZGVmaW5lIF9fTlYwNF9TV1RDTF9IX18KLQotI2luY2x1ZGUgIm10eXBlcy5oIgotCi1leHRlcm4gdm9pZCBudjA0RmFsbGJhY2soIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgYml0LCBHTGJvb2xlYW4gbW9kZSApOwotZXh0ZXJuIHZvaWQgbnYwNEZpbmlzaFByaW1pdGl2ZShzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSk7Ci1leHRlcm4gdm9pZCBudjA0VHJpSW5pdEZ1bmN0aW9ucyhHTGNvbnRleHQgKmN0eCk7Ci0jZGVmaW5lIEZBTExCQUNLKCBubWVzYSwgYml0LCBtb2RlICkgbm91dmVhdUZhbGxiYWNrKCBubWVzYS0+Z2xDdHgsIGJpdCwgbW9kZSApCi0KLSNlbmRpZiAvKiBfX05WMDRfU1dUQ0xfSF9fICovCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYxMF9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjEwX3N0YXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzRiMTQuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjEwX3N0YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IE5vdXZlYXUKLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfb2JqZWN0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi1zdGF0aWMgdm9pZCBudjEwVmlld3BvcnRTY2FsZShub3V2ZWF1Q29udGV4dFB0ciBubWVzYSkKLXsKLQlHTGNvbnRleHQgKmN0eCA9IG5tZXNhLT5nbEN0eDsKLQlHTHVpbnQgdyA9IGN0eC0+Vmlld3BvcnQuV2lkdGg7Ci0JR0x1aW50IGggPSBjdHgtPlZpZXdwb3J0LkhlaWdodDsKLQotCUdMZmxvYXQgbWF4X2RlcHRoID0gKGN0eC0+Vmlld3BvcnQuTmVhciArIGN0eC0+Vmlld3BvcnQuRmFyKSAqIDAuNTsKLS8qCWlmIChjdHgtPkRyYXdCdWZmZXIpIHsKLQkJc3dpdGNoIChjdHgtPkRyYXdCdWZmZXItPl9EZXB0aEJ1ZmZlci0+RGVwdGhCaXRzKSB7Ci0JCQljYXNlIDE2OgotCQkJCW1heF9kZXB0aCAqPSAzMjc2Ny4wOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQltYXhfZGVwdGggKj0gMTY3NzcyMTUuMDsKLQkJCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ki8KLQkJLyogRGVmYXVsdCB0byAyNCBiaXRzIHJhbmdlICovCQotCQltYXhfZGVwdGggKj0gMTY3NzcyMTUuMDsKLS8qCX0qLwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfU0NBTEVfWCwgNCk7Ci0JT1VUX1JJTkdfQ0FDSEVmICgoKChHTGZsb2F0KSB3KSAqIDAuNSkgLSAyMDQ4LjApOwotCU9VVF9SSU5HX0NBQ0hFZiAoKCgoR0xmbG9hdCkgaCkgKiAwLjUpIC0gMjA0OC4wKTsKLQlPVVRfUklOR19DQUNIRWYgKG1heF9kZXB0aCk7Ci0JT1VUX1JJTkdfQ0FDSEVmICgwLjApOwotfQotCi1zdGF0aWMgdm9pZCBudjEwQWxwaGFGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlIHViUmVmOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJSZWYsIHJlZik7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0ZVTkMsIDIpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotCU9VVF9SSU5HX0NBQ0hFKHViUmVmKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMEJsZW5kQ29sb3IoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsgCi0JR0x1Ynl0ZSBjZls0XTsKLQotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2ZbMF0sIGNvbG9yWzBdKTsKLQlDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGNmWzFdLCBjb2xvclsxXSk7Ci0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShjZlsyXSwgY29sb3JbMl0pOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2ZbM10sIGNvbG9yWzNdKTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SLCAxKTsKLQlPVVRfUklOR19DQUNIRShQQUNLX0NPTE9SXzg4ODgoY2ZbM10sIGNmWzFdLCBjZlsyXSwgY2ZbMF0pKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JYXNzZXJ0KCBtb2RlUkdCID09IG1vZGVBICk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9FUVVBVElPTiwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZVJHQik7Ci19Ci0KLQotc3RhdGljIHZvaWQgbnYxMEJsZW5kRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsCi0JCUdMZW51bSBzZmFjdG9yQSwgR0xlbnVtIGRmYWN0b3JBKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlhc3NlcnQoIHNmYWN0b3JSR0IgPT0gc2ZhY3RvckEgKTsKLQlhc3NlcnQoIGRmYWN0b3JSR0IgPT0gZGZhY3RvckEgKTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfU1JDLCAyKTsKLQlPVVRfUklOR19DQUNIRShzZmFjdG9yUkdCKTsKLQlPVVRfUklOR19DQUNIRShkZmFjdG9yUkdCKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMENsZWFyKEdMY29udGV4dCAqY3R4LCBHTGJpdGZpZWxkIG1hc2spCi17Ci0JLyogVE9ETyAqLwotfQotCi1zdGF0aWMgdm9pZCBudjEwQ2xlYXJDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgY1s0XTsKLQlVTkNMQU1QRURfRkxPQVRfVE9fUkdCQV9DSEFOKGMsY29sb3IpOwotCW5tZXNhLT5jbGVhcl9jb2xvcl92YWx1ZSA9IFBBQ0tfQ09MT1JfODg4OChjWzNdLGNbMF0sY1sxXSxjWzJdKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMENsZWFyRGVwdGgoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIGQpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotLyoJc3dpdGNoIChjdHgtPkRyYXdCdWZmZXItPl9EZXB0aEJ1ZmZlci0+RGVwdGhCaXRzKSB7Ci0JCWNhc2UgMTY6Ci0JCQlubWVzYS0+Y2xlYXJfdmFsdWUgPSAodWludDMyX3QpKGQqMHg3RkZGKTsKLQkJCWJyZWFrOwotCQljYXNlIDI0OiovCi0JCQlubWVzYS0+Y2xlYXJfdmFsdWUgPSAoKG5tZXNhLT5jbGVhcl92YWx1ZSYweDAwMDAwMEZGKSB8Ci0JCQkJKCgodWludDMyX3QpKGQqMHhGRkZGRkYpKTw8OCkpOwotLyoJCQlicmVhazsKLQl9Ki8KLX0KLQotc3RhdGljIHZvaWQgbnYxMENsZWFyU3RlbmNpbChHTGNvbnRleHQgKmN0eCwgR0xpbnQgcykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0vKglpZiAoY3R4LT5EcmF3QnVmZmVyLT5fRGVwdGhCdWZmZXItPkRlcHRoQml0cyA9PSAyNCkgeyovCi0JCW5tZXNhLT5jbGVhcl92YWx1ZSA9ICgobm1lc2EtPmNsZWFyX3ZhbHVlJjB4RkZGRkZGMDApfAotCQkJKHMmMHgwMDAwMDBGRikpOwotLyoJfSovCi19Ci0KLXN0YXRpYyB2b2lkIG52MTBDbGlwUGxhbmUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0EocGxhbmUpLCA0KTsKLQlPVVRfUklOR19DQUNIRWYoZXF1YXRpb25bMF0pOwotCU9VVF9SSU5HX0NBQ0hFZihlcXVhdGlvblsxXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGVxdWF0aW9uWzJdKTsKLQlPVVRfUklOR19DQUNIRWYoZXF1YXRpb25bM10pOwotfQotCi1zdGF0aWMgdm9pZCBudjEwQ29sb3JNYXNrKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gcm1hc2ssIEdMYm9vbGVhbiBnbWFzaywKLQkJR0xib29sZWFuIGJtYXNrLCBHTGJvb2xlYW4gYW1hc2sgKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFTSywgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoKChhbWFzayAmJiAweDAxKSA8PCAyNCkgfCAoKHJtYXNrICYmIDB4MDEpIDw8IDE2KSB8ICgoZ21hc2sgJiYgMHgwMSk8PCA4KSB8ICgoYm1hc2sgJiYgMHgwMSkgPDwgMCkpOwotfQotCi1zdGF0aWMgdm9pZCBudjEwQ29sb3JNYXRlcmlhbChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKQotewotCS8qIFRPRE8gSSBuZWVkIGxvdmUgKi8KLX0KLQotc3RhdGljIHZvaWQgbnYxMEN1bGxGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NVTExfRkFDRSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBGcm9udEZhY2UoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfRkFDRSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBEZXB0aEZ1bmMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfRlVOQywgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoZnVuYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBEZXB0aE1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBmbGFnKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfV1JJVEVfRU5BQkxFLCAxKTsKLQlPVVRfUklOR19DQUNIRShmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMERlcHRoUmFuZ2UoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIG5lYXJ2YWwsIEdMY2xhbXBkIGZhcnZhbCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JR0xmbG9hdCBkZXB0aF9zY2FsZSA9IDE2Nzc3MjE2LjA7Ci0JaWYgKGN0eC0+RHJhd0J1ZmZlci0+X0RlcHRoQnVmZmVyLT5EZXB0aEJpdHMgPT0gMTYpIHsKLQkJZGVwdGhfc2NhbGUgPSAzMjc2OC4wOwotCX0KLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1JBTkdFX05FQVIsIDIpOwotCU9VVF9SSU5HX0NBQ0hFZihuZWFydmFsICogZGVwdGhfc2NhbGUpOwotCU9VVF9SSU5HX0NBQ0hFZihmYXJ2YWwgKiBkZXB0aF9zY2FsZSk7Ci0KLQludjEwVmlld3BvcnRTY2FsZShubWVzYSk7Ci19Ci0KLS8qKiBTcGVjaWZ5IHRoZSBjdXJyZW50IGJ1ZmZlciBmb3Igd3JpdGluZyAqLwotLy92b2lkICgqRHJhd0J1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU3BlY2lmeSB0aGUgYnVmZmVycyBmb3Igd3JpdGluZyBmb3IgZnJhZ21lbnQgcHJvZ3JhbXMqLwotLy92b2lkICgqRHJhd0J1ZmZlcnMpKCBHTGNvbnRleHQgKmN0eCwgR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZmZlcnMgKTsKLQotc3RhdGljIHZvaWQgbnYxMEVuYWJsZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jc3dpdGNoKGNhcCkKLQl7Ci0JCWNhc2UgR0xfQUxQSEFfVEVTVDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfQVVUT19OT1JNQUw6Ci0JCWNhc2UgR0xfQkxFTkQ6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9CTEVORF9GVU5DX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9DTElQX1BMQU5FMDoKLQkJY2FzZSBHTF9DTElQX1BMQU5FMToKLQkJY2FzZSBHTF9DTElQX1BMQU5FMjoKLQkJY2FzZSBHTF9DTElQX1BMQU5FMzoKLQkJY2FzZSBHTF9DTElQX1BMQU5FNDoKLQkJY2FzZSBHTF9DTElQX1BMQU5FNToKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfRU5BQkxFKGNhcC1HTF9DTElQX1BMQU5FMCksIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfQ09MT1JfTE9HSUNfT1A6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9MT0dJQ19PUF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKLS8vCQljYXNlIEdMX0NPTE9SX1NVTV9FWFQ6Ci0vLwkJY2FzZSBHTF9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX0NPTlZPTFVUSU9OXzFEOgotLy8JCWNhc2UgR0xfQ09OVk9MVVRJT05fMkQ6Ci0JCWNhc2UgR0xfQ1VMTF9GQUNFOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ERVBUSF9URVNUOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfVEVTVF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfRElUSEVSOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfRElUSEVSX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9GT0c6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9GT0dfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfSElTVE9HUkFNOgotLy8JCWNhc2UgR0xfSU5ERVhfTE9HSUNfT1A6Ci0JCWNhc2UgR0xfTElHSFQwOgotCQljYXNlIEdMX0xJR0hUMToKLQkJY2FzZSBHTF9MSUdIVDI6Ci0JCWNhc2UgR0xfTElHSFQzOgotCQljYXNlIEdMX0xJR0hUNDoKLQkJY2FzZSBHTF9MSUdIVDU6Ci0JCWNhc2UgR0xfTElHSFQ2OgotCQljYXNlIEdMX0xJR0hUNzoKLQkJCXsKLQkJCXVpbnQzMl90IG1hc2s9MTw8KDIqKGNhcC1HTF9MSUdIVDApKTsKLQkJCW5tZXNhLT5lbmFibGVkX2xpZ2h0cz0oKG5tZXNhLT5lbmFibGVkX2xpZ2h0cyZtYXNrKXwobWFzaypzdGF0ZSkpOwotCQkJaWYgKG5tZXNhLT5saWdodGluZ19lbmFibGVkKQotCQkJewotCQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0VOQUJMRURfTElHSFRTLCAxKTsKLQkJCQlPVVRfUklOR19DQUNIRShubWVzYS0+ZW5hYmxlZF9saWdodHMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgR0xfTElHSFRJTkc6Ci0JCQlubWVzYS0+bGlnaHRpbmdfZW5hYmxlZD1zdGF0ZTsKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0VOQUJMRURfTElHSFRTLCAxKTsKLQkJCWlmIChubWVzYS0+bGlnaHRpbmdfZW5hYmxlZCkKLQkJCQlPVVRfUklOR19DQUNIRShubWVzYS0+ZW5hYmxlZF9saWdodHMpOwotCQkJZWxzZQotCQkJCU9VVF9SSU5HX0NBQ0hFKDB4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9MSU5FX1NNT09USDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU01PT1RIX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0xJTkVfU1RJUFBMRToKLS8vCQljYXNlIEdMX01BUDFfQ09MT1JfNDoKLS8vCQljYXNlIEdMX01BUDFfSU5ERVg6Ci0vLwkJY2FzZSBHTF9NQVAxX05PUk1BTDoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzI6Ci0vLwkJY2FzZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMzoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF80OgotLy8JCWNhc2UgR0xfTUFQMV9WRVJURVhfMzoKLS8vCQljYXNlIEdMX01BUDFfVkVSVEVYXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0NPTE9SXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0lOREVYOgotLy8JCWNhc2UgR0xfTUFQMl9OT1JNQUw6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMToKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yOgotLy8JCWNhc2UgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNDoKLS8vCQljYXNlIEdMX01BUDJfVkVSVEVYXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1ZFUlRFWF80OgotLy8JCWNhc2UgR0xfTUlOTUFYOgotCQljYXNlIEdMX05PUk1BTElaRToKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX05PUk1BTElaRV9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9QT0lOVF9TTU9PVEg6Ci0JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQ6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9QT0lOVF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfTElORToKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0xJTkVfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEw6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9GSUxMX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9QT0xZR09OX1NNT09USDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU01PT1RIX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX1BPTFlHT05fU1RJUFBMRToKLS8vCQljYXNlIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX1JFU0NBTEVfTk9STUFMOgotLy8JCWNhc2UgR0xfU0NJU1NPUl9URVNUOgotLy8JCWNhc2UgR0xfU0VQQVJBQkxFXzJEOgotCQljYXNlIEdMX1NURU5DSUxfVEVTVDoKLQkJCS8vIFRPRE8gQkFDSyBhbmQgRlJPTlQgPwotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9ROgotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fUjoKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1M6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9UOgotLy8JCWNhc2UgR0xfVEVYVFVSRV8xRDoKLS8vCQljYXNlIEdMX1RFWFRVUkVfMkQ6Ci0vLwkJY2FzZSBHTF9URVhUVVJFXzNEOgotCX0KLX0KLQotc3RhdGljIHZvaWQgbnYxMEZvZ2Z2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLSAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgIHN3aXRjaChwbmFtZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgR0xfRk9HX01PREU6Ci0gICAgICAgICAgICAvL0JFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19NT0RFLCAxKTsKLSAgICAgICAgICAgIC8vT1VUX1JJTkdfQ0FDSEUgKHBhcmFtcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIFRPRE86IHVuc3VyZSBhYm91dCB0aGUgcmVzdC4qLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi19Ci0gICAKLXN0YXRpYyB2b2lkIG52MTBIaW50KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKLXsKLQkvKiBUT0RPIEkgbmVlZCBsb3ZlIChmb2cgYW5kIGxpbmVfc21vb3RoIGhpbnRzKSAqLwotfQotCi0vLyB2b2lkICgqSW5kZXhNYXNrKShHTGNvbnRleHQgKmN0eCwgR0x1aW50IG1hc2spOwotCi1lbnVtIHsKLQlTUE9UTElHSFRfTk9fVVBEQVRFLAotCVNQT1RMSUdIVF9VUERBVEVfRVhQT05FTlQsCi0JU1BPVExJR0hUX1VQREFURV9ESVJFQ1RJT04sCi0JU1BPVExJR0hUX1VQREFURV9BTEwKLX07Ci0KLXN0YXRpYyB2b2lkIG52MTBMaWdodGZ2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMaW50IHAgPSBsaWdodCAtIEdMX0xJR0hUMDsKLQlzdHJ1Y3QgZ2xfbGlnaHQgKmwgPSAmY3R4LT5MaWdodC5MaWdodFtwXTsKLQlpbnQgc3BvdGxpZ2h0X3VwZGF0ZSA9IFNQT1RMSUdIVF9OT19VUERBVEU7Ci0KLQlzd2l0Y2gocG5hbWUpCi0JewotCQljYXNlIEdMX0FNQklFTlQ6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0RJRkZVU0U6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQRUNVTEFSOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX1IocCksIDMpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1swXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzFdKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMl0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9TSVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9YKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQT1RfRElSRUNUSU9OOgotCQkJc3BvdGxpZ2h0X3VwZGF0ZSA9IFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKLQkJCXNwb3RsaWdodF91cGRhdGUgPSBTUE9UTElHSFRfVVBEQVRFX0VYUE9ORU5UOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9DVVRPRkY6Ci0JCQlzcG90bGlnaHRfdXBkYXRlID0gU1BPVExJR0hUX1VQREFURV9BTEw7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0NPTlNUQU5UX0FUVEVOVUFUSU9OKHApLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZigqcGFyYW1zKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0xJTkVBUl9BVFRFTlVBVElPTihwKSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRWYoKnBhcmFtcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9RVUFEUkFUSUNfQVRURU5VQVRJT04ocCksIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKCpwYXJhbXMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2goc3BvdGxpZ2h0X3VwZGF0ZSkgewotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOgotCQkJewotCQkJCUdMZmxvYXQgeCx5LHo7Ci0JCQkJR0xmbG9hdCBzcG90X2xpZ2h0X2NvZWZfYSA9IDEuMCAvIChsLT5fQ29zQ3V0b2ZmIC0gMS4wKTsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9YKHApLCAzKTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeCk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHkpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih6KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRVhQT05FTlQ6Ci0JCQl7Ci0JCQkJR0xmbG9hdCBjYyxsYyxxYzsKLQkJCQljYyA9IDEuMDsJLyogRklYTUU6IFRoZXNlIG5lZWQgdG8gYmUgY29ycmVjdGx5IGNvbXB1dGVkICovCi0JCQkJbGMgPSAwLjA7Ci0JCQkJcWMgPSAyLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgMyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTUE9UTElHSFRfVVBEQVRFX0FMTDoKLQkJCXsKLQkJCQlHTGZsb2F0IGNjLGxjLHFjLCB4LHkseiwgYzsKLQkJCQlHTGZsb2F0IHNwb3RfbGlnaHRfY29lZl9hID0gMS4wIC8gKGwtPl9Db3NDdXRvZmYgLSAxLjApOwotCQkJCWNjID0gMS4wOwkvKiBGSVhNRTogVGhlc2UgbmVlZCB0byBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgKi8KLQkJCQlsYyA9IDAuMDsKLQkJCQlxYyA9IDIuMDsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQljID0gc3BvdF9saWdodF9jb2VmX2EgKyAxLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgNyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHgpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih5KTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeik7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qKiBTZXQgdGhlIGxpZ2h0aW5nIG1vZGVsIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyB2b2lkICgqTGlnaHRNb2RlbGZ2KShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotCi0KLXN0YXRpYyB2b2lkIG52MTBMaW5lU3RpcHBsZShHTGNvbnRleHQgKmN0eCwgR0xpbnQgZmFjdG9yLCBHTHVzaG9ydCBwYXR0ZXJuICkKLXsKLQkvKiBOb3QgZm9yIE5WMTAgKi8KLX0KLQotc3RhdGljIHZvaWQgbnYxMExpbmVXaWR0aChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCB3aWR0aCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfV0lEVEgsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKCgoaW50KSAod2lkdGggKiA4LjApKSAmIC00KTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMExvZ2ljT3Bjb2RlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gb3Bjb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTE9HSUNfT1BfT1AsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG9wY29kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBQb2ludFBhcmFtZXRlcmZ2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLQkvKlRPRE86IG5vdCBzdXJlIHdoYXQgZ29lcyBoZXJlLiAqLwotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JCi19Ci0KLXN0YXRpYyB2b2lkIG52MTBQb2ludFNpemUoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgc2l6ZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1NJWkUsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKCgoaW50KSAoc2l6ZSAqIDguMCkpICYgLTQpOwotfQotCi1zdGF0aWMgdm9pZCBudjEwUG9seWdvbk1vZGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfRlJPTlQsIDEpOwotCQlPVVRfUklOR19DQUNIRShtb2RlKTsKLQl9Ci0JaWYgKGZhY2UgPT0gR0xfQkFDSyB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9CQUNLLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci0JfQotfQotCi0vKiogU2V0IHRoZSBzY2FsZSBhbmQgdW5pdHMgdXNlZCB0byBjYWxjdWxhdGUgZGVwdGggdmFsdWVzICovCi1zdGF0aWMgdm9pZCBudjEwUG9seWdvbk9mZnNldChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiwgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFZihmYWN0b3IpOwotICAgICAgICBPVVRfUklOR19DQUNIRWYodW5pdHMpOwotfQotCi0vKiogU2V0IHRoZSBwb2x5Z29uIHN0aXBwbGluZyBwYXR0ZXJuICovCi1zdGF0aWMgdm9pZCBudjEwUG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWJ5dGUgKm1hc2sgKQotewotCS8qIE5vdCBmb3IgTlYxMCAqLwotfQotCi0vKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgYnVmZmVyIGZvciByZWFkaW5nICovCi12b2lkICgqUmVhZEJ1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU2V0IHJhc3Rlcml6YXRpb24gbW9kZSAqLwotdm9pZCAoKlJlbmRlck1vZGUpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSApOwotCi0vKiogRGVmaW5lIHRoZSBzY2lzc29yIGJveCAqLwotc3RhdGljIHZvaWQgbnYxMFNjaXNzb3IoR0xjb250ZXh0ICpjdHgsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotfQotCi0vKiogU2VsZWN0IGZsYXQgb3Igc21vb3RoIHNoYWRpbmcgKi8KLXN0YXRpYyB2b2lkIG52MTBTaGFkZU1vZGVsKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfU0hBREVfTU9ERUwsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG1vZGUpOwotfQotCi0vKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbEZ1bmMgKi8KLXN0YXRpYyB2b2lkIG52MTBTdGVuY2lsRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsCi0JCUdMaW50IHJlZiwgR0x1aW50IG1hc2spCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCS8qIE5WMTAgZG8gbm90IGhhdmUgc2VwYXJhdGUgRlJPTlQgYW5kIEJBQ0sgc3RlbmNpbHMgKi8KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZVTkNfRlVOQywgMyk7Ci0JT1VUX1JJTkdfQ0FDSEUoZnVuYyk7Ci0JT1VUX1JJTkdfQ0FDSEUocmVmKTsKLQlPVVRfUklOR19DQUNIRShtYXNrKTsKLX0KLQotLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxNYXNrICovCi1zdGF0aWMgdm9pZCBudjEwU3RlbmNpbE1hc2tTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQkvKiBOVjEwIGRvIG5vdCBoYXZlIHNlcGFyYXRlIEZST05UIGFuZCBCQUNLIHN0ZW5jaWxzICovCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9NQVNLLCAxKTsKLQlPVVRfUklOR19DQUNIRShtYXNrKTsKLX0KLQotLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxPcCAqLwotc3RhdGljIHZvaWQgbnYxMFN0ZW5jaWxPcFNlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsCi0JCUdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQkvKiBOVjEwIGRvIG5vdCBoYXZlIHNlcGFyYXRlIEZST05UIGFuZCBCQUNLIHN0ZW5jaWxzICovCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9PUF9GQUlMLCAzKTsKLQlPVVRfUklOR19DQUNIRShmYWlsKTsKLQlPVVRfUklOR19DQUNIRSh6ZmFpbCk7Ci0JT1VUX1JJTkdfQ0FDSEUoenBhc3MpOwotfQotCi0vKiogQ29udHJvbCB0aGUgZ2VuZXJhdGlvbiBvZiB0ZXh0dXJlIGNvb3JkaW5hdGVzICovCi12b2lkICgqVGV4R2VuKShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsCi0JCWNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0vKiogU2V0IHRleHR1cmUgZW52aXJvbm1lbnQgcGFyYW1ldGVycyAqLwotdm9pZCAoKlRleEVudikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKLQkJY29uc3QgR0xmbG9hdCAqcGFyYW0pOwotLyoqIFNldCB0ZXh0dXJlIHBhcmFtZXRlcnMgKi8KLXZvaWQgKCpUZXhQYXJhbWV0ZXIpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAotCQlzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKLQkJR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotCi1zdGF0aWMgdm9pZCBudjEwVGV4dHVyZU1hdHJpeChHTGNvbnRleHQgKmN0eCwgR0x1aW50IHVuaXQsIGNvbnN0IEdMbWF0cml4ICptYXQpCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1RYX01BVFJJWCh1bml0LCAwKSwgMTYpOwotICAgICAgICAvKlhYWDogVGhpcyBTSE9VTEQgd29yay4qLwotICAgICAgICBPVVRfUklOR19DQUNIRXAobWF0LT5tLCAxNik7Ci19Ci0KLS8qIFVwZGF0ZSBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhlIHdpbmRvdyBwb3NpdGlvbi9zaXplICovCi1zdGF0aWMgdm9pZCBudjEwV2luZG93TW92ZWQobm91dmVhdUNvbnRleHRQdHIgbm1lc2EpCi17Ci0JR0xjb250ZXh0ICpjdHggPSBubWVzYS0+Z2xDdHg7Ci0JR0xmbG9hdCAqdiA9IG5tZXNhLT52aWV3cG9ydC5tOwotCUdMdWludCB3ID0gY3R4LT5WaWV3cG9ydC5XaWR0aDsKLQlHTHVpbnQgaCA9IGN0eC0+Vmlld3BvcnQuSGVpZ2h0OwotCUdMdWludCB4ID0gY3R4LT5WaWV3cG9ydC5YICsgbm1lc2EtPmRyYXdYOwotCUdMdWludCB5ID0gY3R4LT5WaWV3cG9ydC5ZICsgbm1lc2EtPmRyYXdZOwotCWludCBpOwotCi0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0hPUklaLCAyKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKHcgPDwgMTYpIHwgeCk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKChoIDw8IDE2KSB8IHkpOwotCi0JLyogc29tZXRoaW5nIHRvIGRvIHdpdGggY2xlYXJzLCBwb3NzaWJseSBkb2Vzbid0IGJlbG9uZyBoZXJlICovCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MDJiNCwgMSk7Ci0JT1VUX1JJTkcoMCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsCi0JICAgICAgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfSE9SSVooMCksIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgoKHcreC0xKSA8PCAxNikgfCB4IHwgMHgwODAwMDgwMCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELAotCSAgICAgIE5WMTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DTElQX1ZFUlQoMCksIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgoKGgreS0xKSA8PCAxNikgfCB5IHwgMHgwODAwMDgwMCk7Ci0JZm9yIChpPTE7IGk8ODsgaSsrKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkJICAgICAgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfSE9SSVooaSksIDEpOwotICAgICAgICAJT1VUX1JJTkdfQ0FDSEUoMCk7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkJICAgICAgTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfVkVSVChpKSwgMSk7Ci0JICAgICAgICBPVVRfUklOR19DQUNIRSgwKTsKLQl9Ci0KLQludjEwVmlld3BvcnRTY2FsZShubWVzYSk7Ci19Ci0KLS8qIEluaXRpYWxpc2UgYW55IGNhcmQtc3BlY2lmaWMgbm9uLUdMIHJlbGF0ZWQgc3RhdGUgKi8KLXN0YXRpYyBHTGJvb2xlYW4gbnYxMEluaXRDYXJkKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotCW5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm1lc2EsIE52U3ViM0QsIE52M0QpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9TRVRfRE1BX0lOX01FTU9SWTAsIDIpOwotCU9VVF9SSU5HKE52RG1hRkIpOwkvKiAxODQgZG1hX2luX21lbW9yeTAgKi8KLQlPVVRfUklORyhOdkRtYUZCKTsJLyogMTg4IGRtYV9pbl9tZW1vcnkxICovCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMTBfVENMX1BSSU1JVElWRV8zRF9TRVRfRE1BX0lOX01FTU9SWTIsIDIpOwotCU9VVF9SSU5HKE52RG1hRkIpOwkvKiAxOTQgZG1hX2luX21lbW9yeTIgKi8KLQlPVVRfUklORyhOdkRtYUZCKTsJLyogMTk4IGRtYV9pbl9tZW1vcnkzICovCi0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgwMjkwLCAxKTsKLQlPVVRfUklORygweDAwMTAwMDAxKTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgwM2Y0LCAxKTsKLQlPVVRfUklORygwKTsKLQotCWlmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlID49IE5WXzExKSB7Ci0JICAgICAgICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxMjAsIDMpOwotICAgICAgICAJT1VUX1JJTkcoMCk7Ci0JICAgICAgICBPVVRfUklORygxKTsKLQkgICAgICAgIE9VVF9SSU5HKDIpOwotCX0KLQotCXJldHVybiBHTF9UUlVFOwotfQotCi0vKiBVcGRhdGUgYnVmZmVyIG9mZnNldC9waXRjaC9mb3JtYXQgKi8KLXN0YXRpYyBHTGJvb2xlYW4gbnYxMEJpbmRCdWZmZXJzKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCBpbnQgbnVtX2NvbG9yLAotCQkJCSBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqKmNvbG9yLAotCQkJCSBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqZGVwdGgpCi17Ci0JR0x1aW50IHgsIHksIHcsIGg7Ci0JR0x1aW50IHBpdGNoLCBmb3JtYXQsIGRlcHRoX3BpdGNoOwotCi0JdyA9IGNvbG9yWzBdLT5tZXNhLldpZHRoOwotCWggPSBjb2xvclswXS0+bWVzYS5IZWlnaHQ7Ci0JeCA9IG5tZXNhLT5kcmF3WDsKLQl5ID0gbm1lc2EtPmRyYXdZOwotCi0JaWYgKG51bV9jb2xvciAhPSAxKQotCQlyZXR1cm4gR0xfRkFMU0U7Ci0KLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfSE9SSVosIDYpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgodyA8PCAxNikgfCB4KTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKGggPDwgMTYpIHwgeSk7Ci0JZGVwdGhfcGl0Y2ggPSAoZGVwdGggPyBkZXB0aC0+cGl0Y2ggOiBjb2xvclswXS0+cGl0Y2gpOwotCXBpdGNoID0gKGRlcHRoX3BpdGNoPDwxNikgfCBjb2xvclswXS0+cGl0Y2g7Ci0JZm9ybWF0ID0gMHgxMDg7Ci0JaWYgKGNvbG9yWzBdLT5tZXNhLl9BY3R1YWxGb3JtYXQgIT0gR0xfUkdCQTgpIHsKLQkJZm9ybWF0ID0gMHgxMDM7IC8qIFI1RzZCNSBjb2xvciBidWZmZXIgKi8KLQl9Ci0JT1VUX1JJTkdfQ0FDSEUoZm9ybWF0KTsKLQlPVVRfUklOR19DQUNIRShwaXRjaCk7Ci0JT1VUX1JJTkdfQ0FDSEUoY29sb3JbMF0tPm9mZnNldCk7Ci0JT1VUX1JJTkdfQ0FDSEUoZGVwdGggPyBkZXB0aC0+b2Zmc2V0IDogY29sb3JbMF0tPm9mZnNldCk7Ci0KLQkvKiBBbHdheXMgc2V0IHRvIGJvdHRvbSBsZWZ0IG9mIGJ1ZmZlciAqLwotCS8qQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1JJR0lOX1gsIDQpOwotCU9VVF9SSU5HX0NBQ0hFZiAoMC4wKTsKLQlPVVRfUklOR19DQUNIRWYgKChHTGZsb2F0KSBoKTsKLQlPVVRfUklOR19DQUNIRWYgKDAuMCk7Ci0JT1VUX1JJTkdfQ0FDSEVmICgwLjApOyovCi0KLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotdm9pZCBudjEwSW5pdFN0YXRlRnVuY3MoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuYykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JZnVuYy0+QWxwaGFGdW5jCQkJPSBudjEwQWxwaGFGdW5jOwotCWZ1bmMtPkJsZW5kQ29sb3IJCT0gbnYxMEJsZW5kQ29sb3I7Ci0JZnVuYy0+QmxlbmRFcXVhdGlvblNlcGFyYXRlCT0gbnYxMEJsZW5kRXF1YXRpb25TZXBhcmF0ZTsKLQlmdW5jLT5CbGVuZEZ1bmNTZXBhcmF0ZQkJPSBudjEwQmxlbmRGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+Q2xlYXIJCQk9IG52MTBDbGVhcjsKLQlmdW5jLT5DbGVhckNvbG9yCQk9IG52MTBDbGVhckNvbG9yOwotCWZ1bmMtPkNsZWFyRGVwdGgJCT0gbnYxMENsZWFyRGVwdGg7Ci0JZnVuYy0+Q2xlYXJTdGVuY2lsCQk9IG52MTBDbGVhclN0ZW5jaWw7Ci0JZnVuYy0+Q2xpcFBsYW5lCQkJPSBudjEwQ2xpcFBsYW5lOwotCWZ1bmMtPkNvbG9yTWFzawkJCT0gbnYxMENvbG9yTWFzazsKLQlmdW5jLT5Db2xvck1hdGVyaWFsCQk9IG52MTBDb2xvck1hdGVyaWFsOwotCWZ1bmMtPkN1bGxGYWNlCQkJPSBudjEwQ3VsbEZhY2U7Ci0JZnVuYy0+RnJvbnRGYWNlCQkJPSBudjEwRnJvbnRGYWNlOwotCWZ1bmMtPkRlcHRoRnVuYwkJCT0gbnYxMERlcHRoRnVuYzsKLQlmdW5jLT5EZXB0aE1hc2sJCQk9IG52MTBEZXB0aE1hc2s7Ci0JZnVuYy0+RGVwdGhSYW5nZQkJPSBudjEwRGVwdGhSYW5nZTsKLQlmdW5jLT5FbmFibGUJCQk9IG52MTBFbmFibGU7Ci0JZnVuYy0+Rm9nZnYJCQk9IG52MTBGb2dmdjsKLQlmdW5jLT5IaW50CQkJPSBudjEwSGludDsKLQlmdW5jLT5MaWdodGZ2CQkJPSBudjEwTGlnaHRmdjsKLS8qCWZ1bmMtPkxpZ2h0TW9kZWxmdgkJPSBudjEwTGlnaHRNb2RlbGZ2OyAqLwotCWZ1bmMtPkxpbmVTdGlwcGxlCQk9IG52MTBMaW5lU3RpcHBsZTsJCS8qIE5vdCBmb3IgTlYxMCAqLwotCWZ1bmMtPkxpbmVXaWR0aAkJCT0gbnYxMExpbmVXaWR0aDsKLQlmdW5jLT5Mb2dpY09wY29kZQkJPSBudjEwTG9naWNPcGNvZGU7Ci0JZnVuYy0+UG9pbnRQYXJhbWV0ZXJmdgkJPSBudjEwUG9pbnRQYXJhbWV0ZXJmdjsKLQlmdW5jLT5Qb2ludFNpemUJCQk9IG52MTBQb2ludFNpemU7Ci0JZnVuYy0+UG9seWdvbk1vZGUJCT0gbnYxMFBvbHlnb25Nb2RlOwotCWZ1bmMtPlBvbHlnb25PZmZzZXQJCT0gbnYxMFBvbHlnb25PZmZzZXQ7Ci0JZnVuYy0+UG9seWdvblN0aXBwbGUJCT0gbnYxMFBvbHlnb25TdGlwcGxlOwkJLyogTm90IGZvciBOVjEwICovCi0vKglmdW5jLT5SZWFkQnVmZmVyCQk9IG52MTBSZWFkQnVmZmVyOyovCi0vKglmdW5jLT5SZW5kZXJNb2RlCQk9IG52MTBSZW5kZXJNb2RlOyovCi0JZnVuYy0+U2Npc3NvcgkJCT0gbnYxMFNjaXNzb3I7Ci0JZnVuYy0+U2hhZGVNb2RlbAkJPSBudjEwU2hhZGVNb2RlbDsKLQlmdW5jLT5TdGVuY2lsRnVuY1NlcGFyYXRlCT0gbnYxMFN0ZW5jaWxGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+U3RlbmNpbE1hc2tTZXBhcmF0ZQk9IG52MTBTdGVuY2lsTWFza1NlcGFyYXRlOwotCWZ1bmMtPlN0ZW5jaWxPcFNlcGFyYXRlCQk9IG52MTBTdGVuY2lsT3BTZXBhcmF0ZTsKLS8qCWZ1bmMtPlRleEdlbgkJCT0gbnYxMFRleEdlbjsqLwotLyoJZnVuYy0+VGV4UGFyYW1ldGVyCQk9IG52MTBUZXhQYXJhbWV0ZXI7Ki8KLQlmdW5jLT5UZXh0dXJlTWF0cml4CQk9IG52MTBUZXh0dXJlTWF0cml4OwotCi0Jbm1lc2EtPmh3X2Z1bmMuSW5pdENhcmQJCT0gbnYxMEluaXRDYXJkOwotCW5tZXNhLT5od19mdW5jLkJpbmRCdWZmZXJzCT0gbnYxMEJpbmRCdWZmZXJzOwotCW5tZXNhLT5od19mdW5jLldpbmRvd01vdmVkCT0gbnYxMFdpbmRvd01vdmVkOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjEwX3N3dGNsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MTBfc3d0Y2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExNDY5Yi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MTBfc3d0Y2wuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0vKiBTb2Z0d2FyZSBUQ0wgZm9yIE5WMTAsIE5WMjAsIE5WMzAsIE5WNDAsIE5WNTAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAiY29sb3JtYWMuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotCi0jaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgotI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKLSNpbmNsdWRlICJ0bmwvdF9jb250ZXh0LmgiCi0jaW5jbHVkZSAidG5sL3RfcGlwZWxpbmUuaCIKLQotI2luY2x1ZGUgIm5vdXZlYXVfc3d0Y2wuaCIKLSNpbmNsdWRlICJudjEwX3N3dGNsLmgiCi0jaW5jbHVkZSAibm91dmVhdV9jb250ZXh0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9zcGFuLmgiCi0jaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3RleC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbXNnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLQotc3RhdGljIHZvaWQgbnYxMFJhc3RlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBycHJpbSwgR0x1aW50IGh3cHJpbSApOwotc3RhdGljIHZvaWQgbnYxMFJlbmRlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwcmltICk7Ci1zdGF0aWMgdm9pZCBudjEwUmVzZXRMaW5lU3RpcHBsZSggR0xjb250ZXh0ICpjdHggKTsKLQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjEwU3RhcnRQcmltaXRpdmUoc3RydWN0IG5vdXZlYXVfY29udGV4dCogbm1lc2EsdWludDMyX3QgcHJpbWl0aXZlLHVpbnQzMl90IHNpemUpCi17Ci0JaWYgKChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlPj1OVl8xMCkgJiYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGU8PU5WXzE3KSkKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYxMF9UQ0xfUFJJTUlUSVZFXzNEX0JFR0lOX0VORCwxKTsKLQllbHNlIGlmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlPT1OVl8yMCkKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JFR0lOX0VORCwxKTsKLQllbHNlCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMzBfVENMX1BSSU1JVElWRV8zRF9CRUdJTl9FTkQsMSk7Ci0JT1VUX1JJTkcocHJpbWl0aXZlKTsKLQotCWlmICgobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT49TlZfMTApICYmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlPD1OVl8xNykpCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMTBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfQVJSQVlfREFUQXxOT05JTkNfTUVUSE9ELHNpemUpOwotCWVsc2UgaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGU9PU5WXzIwKQotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0RBVEF8Tk9OSU5DX01FVEhPRCxzaXplKTsKLQllbHNlCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfREFUQXxOT05JTkNfTUVUSE9ELHNpemUpOwotfQotCi1pbmxpbmUgdm9pZCBudjEwRmluaXNoUHJpbWl0aXZlKHN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhKQotewotCWlmICgobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT49TlZfMTApICYmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlPD1OVl8xNykpCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMTBfVENMX1BSSU1JVElWRV8zRF9CRUdJTl9FTkQsMSk7Ci0JZWxzZSBpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT09TlZfMjApCi0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMjBfVENMX1BSSU1JVElWRV8zRF9CRUdJTl9FTkQsMSk7Ci0JZWxzZQotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkVHSU5fRU5ELDEpOwotCU9VVF9SSU5HKDB4MCk7Ci0JRklSRV9SSU5HKCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG52MTBFeHRlbmRQcmltaXRpdmUoc3RydWN0IG5vdXZlYXVfY29udGV4dCogbm1lc2EsIGludCBzaXplKQotewotCS8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tLiBpZiBub3QsIHdhaXQgKi8KLQlpZiAoUklOR19BVkFJTEFCTEUoKTxzaXplKQotCXsKLQkJV0FJVF9SSU5HKG5tZXNhLHNpemUpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgIFJlbmRlciB1bmNsaXBwZWQgYmVnaW4vZW5kIG9iamVjdHMgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MsR0x1aW50IHByaW0pCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlICp2ZXJ0cHRyID0gKEdMdWJ5dGUgKilubWVzYS0+dmVydHM7Ci0JR0x1aW50IHZlcnRzaXplID0gbm1lc2EtPnZlcnRleF9zaXplOwotCUdMdWludCBzaXplX2R3b3JkID0gdmVydHNpemUqKGNvdW50LXN0YXJ0KS80OwotCi0JbnYxMEV4dGVuZFByaW1pdGl2ZShubWVzYSwgc2l6ZV9kd29yZCk7Ci0JbnYxMFN0YXJ0UHJpbWl0aXZlKG5tZXNhLHByaW0rMSxzaXplX2R3b3JkKTsKLQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhzdGFydCp2ZXJ0c2l6ZSkpLHNpemVfZHdvcmQpOwotCW52MTBGaW5pc2hQcmltaXRpdmUobm1lc2EpOwotfQotCi1zdGF0aWMgdm9pZCBudjEwX3JlbmRlcl9wb2ludHNfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1BPSU5UUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX2xpbmVzX3ZlcnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX3ZlcnRzKGN0eCxzdGFydCxjb3VudCxmbGFncyxHTF9MSU5FUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX2xpbmVfc3RyaXBfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX0xJTkVfU1RSSVApOwotfQotCi1zdGF0aWMgdm9pZCBudjEwX3JlbmRlcl9saW5lX2xvb3BfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX0xJTkVfTE9PUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3RyaWFuZ2xlc192ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQludjEwX3JlbmRlcl9nZW5lcmljX3ByaW1pdGl2ZV92ZXJ0cyhjdHgsc3RhcnQsY291bnQsZmxhZ3MsR0xfVFJJQU5HTEVTKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfdHJpX3N0cmlwX3ZlcnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX3ZlcnRzKGN0eCxzdGFydCxjb3VudCxmbGFncyxHTF9UUklBTkdMRV9TVFJJUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3RyaV9mYW5fdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1RSSUFOR0xFX0ZBTik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3F1YWRzX3ZlcnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX3ZlcnRzKGN0eCxzdGFydCxjb3VudCxmbGFncyxHTF9RVUFEUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3F1YWRfc3RyaXBfdmVydHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfdmVydHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1FVQURfU1RSSVApOwotfQotCi1zdGF0aWMgdm9pZCBudjEwX3JlbmRlcl9wb2x5X3ZlcnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX3ZlcnRzKGN0eCxzdGFydCxjb3VudCxmbGFncyxHTF9QT0xZR09OKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfbm9vcF92ZXJ0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLX0KLQotc3RhdGljIHZvaWQgKCpudjEwX3JlbmRlcl90YWJfdmVydHNbR0xfUE9MWUdPTisyXSkoR0xjb250ZXh0ICosCi0JCQkJCQkJICAgR0x1aW50LAotCQkJCQkJCSAgIEdMdWludCwKLQkJCQkJCQkgICBHTHVpbnQpID0KLXsKLSAgIG52MTBfcmVuZGVyX3BvaW50c192ZXJ0cywKLSAgIG52MTBfcmVuZGVyX2xpbmVzX3ZlcnRzLAotICAgbnYxMF9yZW5kZXJfbGluZV9sb29wX3ZlcnRzLAotICAgbnYxMF9yZW5kZXJfbGluZV9zdHJpcF92ZXJ0cywKLSAgIG52MTBfcmVuZGVyX3RyaWFuZ2xlc192ZXJ0cywKLSAgIG52MTBfcmVuZGVyX3RyaV9zdHJpcF92ZXJ0cywKLSAgIG52MTBfcmVuZGVyX3RyaV9mYW5fdmVydHMsCi0gICBudjEwX3JlbmRlcl9xdWFkc192ZXJ0cywKLSAgIG52MTBfcmVuZGVyX3F1YWRfc3RyaXBfdmVydHMsCi0gICBudjEwX3JlbmRlcl9wb2x5X3ZlcnRzLAotICAgbnYxMF9yZW5kZXJfbm9vcF92ZXJ0cywKLX07Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MsR0x1aW50IHByaW0pCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlICp2ZXJ0cHRyID0gKEdMdWJ5dGUgKilubWVzYS0+dmVydHM7Ci0JR0x1aW50IHZlcnRzaXplID0gbm1lc2EtPnZlcnRleF9zaXplOwotCUdMdWludCBzaXplX2R3b3JkID0gdmVydHNpemUqKGNvdW50LXN0YXJ0KS80OwotCWNvbnN0IEdMdWludCAqIGNvbnN0IGVsdCA9IFROTF9DT05URVhUKGN0eCktPnZiLkVsdHM7Ci0JR0x1aW50IGo7Ci0KLQludjEwRXh0ZW5kUHJpbWl0aXZlKG5tZXNhLCBzaXplX2R3b3JkKTsKLQludjEwU3RhcnRQcmltaXRpdmUobm1lc2EscHJpbSsxLHNpemVfZHdvcmQpOwotCWZvciAoaj1zdGFydDsgajxjb3VudDsgaisrICkgewotCQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyhlbHRbal0qdmVydHNpemUpKSx2ZXJ0c2l6ZS80KTsKLQl9Ci0JbnYxMEZpbmlzaFByaW1pdGl2ZShubWVzYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3BvaW50c19lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1BPSU5UUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX2xpbmVzX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfZWx0cyhjdHgsc3RhcnQsY291bnQsZmxhZ3MsR0xfTElORVMpOwotfQotCi1zdGF0aWMgdm9pZCBudjEwX3JlbmRlcl9saW5lX3N0cmlwX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfZWx0cyhjdHgsc3RhcnQsY291bnQsZmxhZ3MsR0xfTElORV9TVFJJUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX2xpbmVfbG9vcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX0xJTkVfTE9PUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3RyaWFuZ2xlc19lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1RSSUFOR0xFUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3RyaV9zdHJpcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1RSSUFOR0xFX1NUUklQKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfdHJpX2Zhbl9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotCW52MTBfcmVuZGVyX2dlbmVyaWNfcHJpbWl0aXZlX2VsdHMoY3R4LHN0YXJ0LGNvdW50LGZsYWdzLEdMX1RSSUFOR0xFX0ZBTik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3F1YWRzX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfZWx0cyhjdHgsc3RhcnQsY291bnQsZmxhZ3MsR0xfUVVBRFMpOwotfQotCi1zdGF0aWMgdm9pZCBudjEwX3JlbmRlcl9xdWFkX3N0cmlwX2VsdHMoR0xjb250ZXh0ICpjdHgsR0x1aW50IHN0YXJ0LEdMdWludCBjb3VudCxHTHVpbnQgZmxhZ3MpCi17Ci0JbnYxMF9yZW5kZXJfZ2VuZXJpY19wcmltaXRpdmVfZWx0cyhjdHgsc3RhcnQsY291bnQsZmxhZ3MsR0xfUVVBRF9TVFJJUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MTBfcmVuZGVyX3BvbHlfZWx0cyhHTGNvbnRleHQgKmN0eCxHTHVpbnQgc3RhcnQsR0x1aW50IGNvdW50LEdMdWludCBmbGFncykKLXsKLQludjEwX3JlbmRlcl9nZW5lcmljX3ByaW1pdGl2ZV9lbHRzKGN0eCxzdGFydCxjb3VudCxmbGFncyxHTF9QT0xZR09OKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfbm9vcF9lbHRzKEdMY29udGV4dCAqY3R4LEdMdWludCBzdGFydCxHTHVpbnQgY291bnQsR0x1aW50IGZsYWdzKQotewotfQotCi1zdGF0aWMgdm9pZCAoKm52MTBfcmVuZGVyX3RhYl9lbHRzW0dMX1BPTFlHT04rMl0pKEdMY29udGV4dCAqLAotCQkJCQkJCSAgIEdMdWludCwKLQkJCQkJCQkgICBHTHVpbnQsCi0JCQkJCQkJICAgR0x1aW50KSA9Ci17Ci0gICBudjEwX3JlbmRlcl9wb2ludHNfZWx0cywKLSAgIG52MTBfcmVuZGVyX2xpbmVzX2VsdHMsCi0gICBudjEwX3JlbmRlcl9saW5lX2xvb3BfZWx0cywKLSAgIG52MTBfcmVuZGVyX2xpbmVfc3RyaXBfZWx0cywKLSAgIG52MTBfcmVuZGVyX3RyaWFuZ2xlc19lbHRzLAotICAgbnYxMF9yZW5kZXJfdHJpX3N0cmlwX2VsdHMsCi0gICBudjEwX3JlbmRlcl90cmlfZmFuX2VsdHMsCi0gICBudjEwX3JlbmRlcl9xdWFkc19lbHRzLAotICAgbnYxMF9yZW5kZXJfcXVhZF9zdHJpcF9lbHRzLAotICAgbnYxMF9yZW5kZXJfcG9seV9lbHRzLAotICAgbnYxMF9yZW5kZXJfbm9vcF9lbHRzLAotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICBDaG9vc2UgcmVuZGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBFTUlUX0FUVFIoIEFUVFIsIFNUWUxFICkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gICBubWVzYS0+dmVydGV4X2F0dHJzW25tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudF0uYXR0cmliID0gKEFUVFIpOwlcCi0gICBubWVzYS0+dmVydGV4X2F0dHJzW25tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudF0uZm9ybWF0ID0gKFNUWUxFKTsJXAotICAgbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50Kys7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfY2xpcHBlZF9saW5lKEdMY29udGV4dCAqY3R4LEdMdWludCBpaSxHTHVpbnQgamopCi17Ci0KLX0KLQotc3RhdGljIHZvaWQgbnYxMF9yZW5kZXJfY2xpcHBlZF9wb2x5KEdMY29udGV4dCAqY3R4LGNvbnN0IEdMdWludCAqZWx0cyxHTHVpbnQgbikKLXsKLQlUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwotCXN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQiA9ICZ0bmwtPnZiOwotCUdMdWludCAqdG1wID0gVkItPkVsdHM7Ci0JVkItPkVsdHMgPSAoR0x1aW50ICopZWx0czsKLQludjEwX3JlbmRlcl9nZW5lcmljX3ByaW1pdGl2ZV9lbHRzKCBjdHgsIDAsIG4sIFBSSU1fQkVHSU58UFJJTV9FTkQsR0xfUE9MWUdPTiApOwotCVZCLT5FbHRzID0gdG1wOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYxMF9yZW5kZXJfcG9pbnRzKEdMY29udGV4dCAqY3R4LEdMdWludCBmaXJzdCxHTHVpbnQgbGFzdCkKLXsKLQlXQVJOX09OQ0UoIlVuaW1wbGVtZW50ZWRcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbnYxMF9yZW5kZXJfbGluZShHTGNvbnRleHQgKmN0eCxHTHVpbnQgdjEsR0x1aW50IHYyKQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1Ynl0ZSAqdmVydHB0ciA9IChHTHVieXRlICopbm1lc2EtPnZlcnRzOwotCUdMdWludCB2ZXJ0c2l6ZSA9IG5tZXNhLT52ZXJ0ZXhfc2l6ZTsKLQlHTHVpbnQgc2l6ZV9kd29yZCA9IHZlcnRzaXplKigyKS80OwotCi0JLyogT1VUX1JJTkdwIHdhbnRzIHNpemUgaW4gRFdPUkRTICovCi0JdmVydHNpemUgPj49IDI7Ci0KLQludjEwRXh0ZW5kUHJpbWl0aXZlKG5tZXNhLCBzaXplX2R3b3JkKTsKLQludjEwU3RhcnRQcmltaXRpdmUobm1lc2EsR0xfTElORVMrMSxzaXplX2R3b3JkKTsKLQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyh2MSp2ZXJ0c2l6ZSkpLHZlcnRzaXplKTsKLQlPVVRfUklOR3AoKG5vdXZlYXVWZXJ0ZXgqKSh2ZXJ0cHRyKyh2Mip2ZXJ0c2l6ZSkpLHZlcnRzaXplKTsKLQludjEwRmluaXNoUHJpbWl0aXZlKG5tZXNhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG52MTBfcmVuZGVyX3RyaWFuZ2xlKEdMY29udGV4dCAqY3R4LEdMdWludCB2MSxHTHVpbnQgdjIsR0x1aW50IHYzKQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1Ynl0ZSAqdmVydHB0ciA9IChHTHVieXRlICopbm1lc2EtPnZlcnRzOwotCUdMdWludCB2ZXJ0c2l6ZSA9IG5tZXNhLT52ZXJ0ZXhfc2l6ZTsKLQlHTHVpbnQgc2l6ZV9kd29yZCA9IHZlcnRzaXplKigzKS80OwotCi0JLyogT1VUX1JJTkdwIHdhbnRzIHNpemUgaW4gRFdPUkRTICovCi0JdmVydHNpemUgPj49IDI7Ci0KLQludjEwRXh0ZW5kUHJpbWl0aXZlKG5tZXNhLCBzaXplX2R3b3JkKTsKLQludjEwU3RhcnRQcmltaXRpdmUobm1lc2EsR0xfVFJJQU5HTEVTKzEsc2l6ZV9kd29yZCk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjEqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjIqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjMqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JbnYxMEZpbmlzaFByaW1pdGl2ZShubWVzYSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjEwX3JlbmRlcl9xdWFkKEdMY29udGV4dCAqY3R4LEdMdWludCB2MSxHTHVpbnQgdjIsR0x1aW50IHYzLEdMdWludCB2NCkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgKnZlcnRwdHIgPSAoR0x1Ynl0ZSAqKW5tZXNhLT52ZXJ0czsKLQlHTHVpbnQgdmVydHNpemUgPSBubWVzYS0+dmVydGV4X3NpemU7Ci0JR0x1aW50IHNpemVfZHdvcmQgPSB2ZXJ0c2l6ZSooNCkvNDsKLQotCS8qIE9VVF9SSU5HcCB3YW50cyBzaXplIGluIERXT1JEUyAqLwotCXZlcnRzaXplID4+PSAyOwotCi0JbnYxMEV4dGVuZFByaW1pdGl2ZShubWVzYSwgc2l6ZV9kd29yZCk7Ci0JbnYxMFN0YXJ0UHJpbWl0aXZlKG5tZXNhLEdMX1FVQURTKzEsc2l6ZV9kd29yZCk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjEqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjIqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjMqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JT1VUX1JJTkdwKChub3V2ZWF1VmVydGV4KikodmVydHB0cisodjQqdmVydHNpemUpKSx2ZXJ0c2l6ZSk7Ci0JbnYxMEZpbmlzaFByaW1pdGl2ZShubWVzYSk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBudjEwQ2hvb3NlUmVuZGVyU3RhdGUoR0xjb250ZXh0ICpjdHgpCi17Ci0JVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JdG5sLT5Ecml2ZXIuUmVuZGVyLlByaW1UYWJWZXJ0cyA9IG52MTBfcmVuZGVyX3RhYl92ZXJ0czsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUHJpbVRhYkVsdHMgPSBudjEwX3JlbmRlcl90YWJfZWx0czsKLQl0bmwtPkRyaXZlci5SZW5kZXIuQ2xpcHBlZExpbmUgPSBudjEwX3JlbmRlcl9jbGlwcGVkX2xpbmU7Ci0JdG5sLT5Ecml2ZXIuUmVuZGVyLkNsaXBwZWRQb2x5Z29uID0gbnYxMF9yZW5kZXJfY2xpcHBlZF9wb2x5OwotCXRubC0+RHJpdmVyLlJlbmRlci5Qb2ludHMgPSBudjEwX3JlbmRlcl9wb2ludHM7Ci0JdG5sLT5Ecml2ZXIuUmVuZGVyLkxpbmUgPSBudjEwX3JlbmRlcl9saW5lOwotCXRubC0+RHJpdmVyLlJlbmRlci5UcmlhbmdsZSA9IG52MTBfcmVuZGVyX3RyaWFuZ2xlOwotCXRubC0+RHJpdmVyLlJlbmRlci5RdWFkID0gbnYxMF9yZW5kZXJfcXVhZDsKLX0KLQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudjEwT3V0cHV0VmVydGV4Rm9ybWF0KHN0cnVjdCBub3V2ZWF1X2NvbnRleHQqIG5tZXNhKQotewotCUdMY29udGV4dCogY3R4PW5tZXNhLT5nbEN0eDsKLQlUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwotCURFQ0xBUkVfUkVOREVSSU5QVVRTKGluZGV4KTsKLQlzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmdG5sLT52YjsKLQlpbnQgYXR0cl9zaXplWzE2XTsKLQlpbnQgZGVmYXVsdF9hdHRyX3NpemVbOF09ezMsMywzLDQsMywxLDQsNH07Ci0JaW50IGk7Ci0JaW50IHNsb3RzPTA7Ci0JaW50IHRvdGFsX3NpemU9MDsKLQotCW5tZXNhLT52ZXJ0ZXhfYXR0cl9jb3VudCA9IDA7Ci0JUkVOREVSSU5QVVRTX0NPUFkoaW5kZXgsIG5tZXNhLT5yZW5kZXJfaW5wdXRzX2JpdHNldCk7Ci0KLQkvKgotCSAqIERldGVybWluZSBhdHRyaWJ1dGUgc2l6ZXMKLQkgKi8KLQlmb3IoaT0wO2k8ODtpKyspCi0JewotCQlpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXgsIGkpKQotCQkJYXR0cl9zaXplW2ldPWRlZmF1bHRfYXR0cl9zaXplW2ldOwotCQllbHNlCi0JCQlhdHRyX3NpemVbaV09MDsKLQl9Ci0JZm9yKGk9ODtpPDE2O2krKykKLQl7Ci0JCWlmIChSRU5ERVJJTlBVVFNfVEVTVChpbmRleCwgaSkpCi0JCQlhdHRyX3NpemVbaV09VkItPlRleENvb3JkUHRyW2ktOF0tPnNpemU7Ci0JCWVsc2UKLQkJCWF0dHJfc2l6ZVtpXT0wOwotCX0KLQotCS8qCi0JICogVGVsbCB0X3ZlcnRleCBhYm91dCB0aGUgdmVydGV4IGZvcm1hdAotCSAqLwotCWZvcihpPTA7aTwxNjtpKyspCi0JewotCQlpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXgsIGkpKQotCQl7Ci0JCQlzbG90cz1pKzE7Ci0JCQlzd2l0Y2goYXR0cl9zaXplW2ldKQotCQkJewotCQkJCWNhc2UgMToKLQkJCQkJRU1JVF9BVFRSKGksRU1JVF8xRik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJRU1JVF9BVFRSKGksRU1JVF8yRik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJRU1JVF9BVFRSKGksRU1JVF8zRik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJRU1JVF9BVFRSKGksRU1JVF80Rik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGk9PV9UTkxfQVRUUklCX0NPTE9SMCkKLQkJCQlubWVzYS0+Y29sb3Jfb2Zmc2V0PXRvdGFsX3NpemU7Ci0JCQlpZiAoaT09X1ROTF9BVFRSSUJfQ09MT1IxKQotCQkJCW5tZXNhLT5zcGVjdWxhcl9vZmZzZXQ9dG90YWxfc2l6ZTsKLQkJCXRvdGFsX3NpemUrPWF0dHJfc2l6ZVtpXTsKLQkJfQotCX0KLQotCW5tZXNhLT52ZXJ0ZXhfc2l6ZT1fdG5sX2luc3RhbGxfYXR0cnMoIGN0eCwKLQkJCW5tZXNhLT52ZXJ0ZXhfYXR0cnMsIAotCQkJbm1lc2EtPnZlcnRleF9hdHRyX2NvdW50LAotCQkJTlVMTCwgMCApOwotCWFzc2VydChubWVzYS0+dmVydGV4X3NpemU9PXRvdGFsX3NpemUqNCk7Ci0KLQkvKiAKLQkgKiBUZWxsIHRoZSBoYXJkd2FyZSBhYm91dCB0aGUgdmVydGV4IGZvcm1hdAotCSAqLwotCWlmICgobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZT49TlZfMTApICYmIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlPD1OVl8xNykpIHsKLQkJaW50IHNpemU7Ci0KLSNkZWZpbmUgTlZfVkVSVEVYX0FUVFJJQlVURV9UWVBFX0ZMT0FUIDIKLQotI2RlZmluZSBOVjEwX1NFVF9WRVJURVhfQVRUUklCKGksaikgXAotCWRvIHsJXAotCQlzaXplID0gYXR0cl9zaXplW2pdIDw8IDQ7CVwKLQkJc2l6ZSB8PSAoYXR0cl9zaXplW2pdKjQpIDw8IDg7CVwKLQkJc2l6ZSB8PSBOVl9WRVJURVhfQVRUUklCVVRFX1RZUEVfRkxPQVQ7CVwKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIoaSksMSk7CVwKLQkJT1VUX1JJTkdfQ0FDSEUoc2l6ZSk7CVwKLQl9IHdoaWxlICgwKQotCi0JCU5WMTBfU0VUX1ZFUlRFWF9BVFRSSUIoMCwgX1ROTF9BVFRSSUJfUE9TKTsKLQkJTlYxMF9TRVRfVkVSVEVYX0FUVFJJQigxLCBfVE5MX0FUVFJJQl9DT0xPUjApOwotCQlOVjEwX1NFVF9WRVJURVhfQVRUUklCKDIsIF9UTkxfQVRUUklCX0NPTE9SMSk7Ci0JCU5WMTBfU0VUX1ZFUlRFWF9BVFRSSUIoMywgX1ROTF9BVFRSSUJfVEVYMCk7Ci0JCU5WMTBfU0VUX1ZFUlRFWF9BVFRSSUIoNCwgX1ROTF9BVFRSSUJfVEVYMSk7Ci0JCU5WMTBfU0VUX1ZFUlRFWF9BVFRSSUIoNSwgX1ROTF9BVFRSSUJfTk9STUFMKTsKLQkJTlYxMF9TRVRfVkVSVEVYX0FUVFJJQig2LCBfVE5MX0FUVFJJQl9XRUlHSFQpOwotCQlOVjEwX1NFVF9WRVJURVhfQVRUUklCKDcsIF9UTkxfQVRUUklCX0ZPRyk7Ci0KLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjEwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FSUkFZX1ZBTElEQVRFLDEpOwotCQlPVVRfUklOR19DQUNIRSgwKTsKLQl9IGVsc2UgaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGU9PU5WXzIwKSB7Ci0JCWZvcihpPTA7aTwxNjtpKyspCi0JCXsKLQkJCWludCBzaXplPWF0dHJfc2l6ZVtpXTsKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCxOVjIwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX0FUVFIoaSksMSk7Ci0JCQlPVVRfUklOR19DQUNIRShOVl9WRVJURVhfQVRUUklCVVRFX1RZUEVfRkxPQVR8KHNpemUqMHgxMCkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9ET19WRVJUSUNFUywgMSk7Ci0JCU9VVF9SSU5HKDApOwotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9BVFRSMF9QT1Msc2xvdHMpOwotCQlmb3IoaT0wO2k8c2xvdHM7aSsrKQotCQl7Ci0JCQlpbnQgc2l6ZT1hdHRyX3NpemVbaV07Ci0JCQlPVVRfUklOR19DQUNIRShOVl9WRVJURVhfQVRUUklCVVRFX1RZUEVfRkxPQVR8KHNpemUqMHgxMCkpOwotCQl9Ci0JCS8vIEZJWE1FIHRoaXMgaXMgcHJvYmFibHkgbm90IG5lZWRlZAotCQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCxOVjMwX1RDTF9QUklNSVRJVkVfM0RfVkVSVEVYX1VOS18wLDEpOwotCQlPVVRfUklORygwKTsKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZFUlRFWF9VTktfMCwxKTsKLQkJT1VUX1JJTkcoMCk7Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELE5WMzBfVENMX1BSSU1JVElWRV8zRF9WRVJURVhfVU5LXzAsMSk7Ci0JCU9VVF9SSU5HKDApOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBudjEwQ2hvb3NlVmVydGV4U3RhdGUoIEdMY29udGV4dCAqY3R4ICkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCVROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7Ci0JREVDTEFSRV9SRU5ERVJJTlBVVFMoaW5kZXgpOwotCQotCVJFTkRFUklOUFVUU19DT1BZKGluZGV4LCB0bmwtPnJlbmRlcl9pbnB1dHNfYml0c2V0KTsKLQlpZiAoIVJFTkRFUklOUFVUU19FUVVBTChpbmRleCwgbm1lc2EtPnJlbmRlcl9pbnB1dHNfYml0c2V0KSkKLQl7Ci0JCVJFTkRFUklOUFVUU19DT1BZKG5tZXNhLT5yZW5kZXJfaW5wdXRzX2JpdHNldCwgaW5kZXgpOwotCQludjEwT3V0cHV0VmVydGV4Rm9ybWF0KG5tZXNhKTsKLQl9Ci0KLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA9PSBOVl8zMCkgewotCQlub3V2ZWF1U2hhZGVyICpmcDsKLQkJCi0JCWlmIChjdHgtPkZyYWdtZW50UHJvZ3JhbS5FbmFibGVkKSB7Ci0JCQlmcCA9IChub3V2ZWF1U2hhZGVyICopIGN0eC0+RnJhZ21lbnRQcm9ncmFtLkN1cnJlbnQ7Ci0JCQludnNVcGRhdGVTaGFkZXIoY3R4LCBmcCk7Ci0JCX0gZWxzZQotCQkJbnZzVXBkYXRlU2hhZGVyKGN0eCwgbm1lc2EtPnBhc3N0aHJvdWdoX2ZwKTsKLQl9Ci0KLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl80MCkgewotCQkvKiBFbnN1cmUgcGFzc3Rocm91Z2ggc2hhZGVyIGlzIGJlaW5nIHVzZWQsIGFuZCBtdnAgbWF0cml4Ci0JCSAqIGlzIHVwIHRvIGRhdGUKLQkJICovCi0JCW52c1VwZGF0ZVNoYWRlcihjdHgsIG5tZXNhLT5wYXNzdGhyb3VnaF92cCk7Ci0KLQkJLyogVXBkYXRlIHRleGVudiBzaGFkZXIgLyB1c2VyIGZyYWdwcm9nICovCi0JCW52c1VwZGF0ZVNoYWRlcihjdHgsIChub3V2ZWF1U2hhZGVyKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCk7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgIEhpZ2ggbGV2ZWwgaG9va3MgZm9yIHRfdmJfcmVuZGVyLmMgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZCBudjEwUmVuZGVyU3RhcnQoR0xjb250ZXh0ICpjdHgpCi17Ci0JVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLQlzdHJ1Y3Qgbm91dmVhdV9jb250ZXh0ICpubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKG5tZXNhLT5uZXdfc3RhdGUpIHsKLQkJbm1lc2EtPm5ld19yZW5kZXJfc3RhdGUgfD0gbm1lc2EtPm5ld19zdGF0ZTsKLQl9Ci0KLQlpZiAobm1lc2EtPm5ld19yZW5kZXJfc3RhdGUpIHsKLQkJbnYxMENob29zZVZlcnRleFN0YXRlKGN0eCk7Ci0JCW52MTBDaG9vc2VSZW5kZXJTdGF0ZShjdHgpOwotCQlubWVzYS0+bmV3X3JlbmRlcl9zdGF0ZSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjEwUmVuZGVyRmluaXNoKEdMY29udGV4dCAqY3R4KQotewotfQotCi0KLS8qIFN5c3RlbSB0byBmbHVzaCBkbWEgYW5kIGVtaXQgc3RhdGUgY2hhbmdlcyBiYXNlZCBvbiB0aGUgcmFzdGVyaXplZAotICogcHJpbWl0aXZlLgotICovCi12b2lkIG52MTBSYXN0ZXJQcmltaXRpdmUoR0xjb250ZXh0ICpjdHgsCi0JCUdMZW51bSBnbHByaW0sCi0JCUdMdWludCBod3ByaW0pCi17Ci0Jc3RydWN0IG5vdXZlYXVfY29udGV4dCAqbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWFzc2VydCAoIW5tZXNhLT5uZXdfc3RhdGUpOwotCi0JaWYgKGh3cHJpbSAhPSBubWVzYS0+Y3VycmVudF9wcmltaXRpdmUpCi0JewotCQlubWVzYS0+Y3VycmVudF9wcmltaXRpdmU9aHdwcmltOwotCQkKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBHTHVpbnQgaHdfcHJpbVtHTF9QT0xZR09OKzFdID0gewotCUdMX1BPSU5UUysxLAotCUdMX0xJTkVTKzEsCi0JR0xfTElORV9TVFJJUCsxLAotCUdMX0xJTkVfTE9PUCsxLAotCUdMX1RSSUFOR0xFUysxLAotCUdMX1RSSUFOR0xFX1NUUklQKzEsCi0JR0xfVFJJQU5HTEVfRkFOKzEsCi0JR0xfUVVBRFMrMSwKLQlHTF9RVUFEX1NUUklQKzEsCi0JR0xfUE9MWUdPTisxCi19OwotCi0vKiBDYWxsYmFjayBmb3IgbWVzYToKLSAqLwotc3RhdGljIHZvaWQgbnYxMFJlbmRlclByaW1pdGl2ZSggR0xjb250ZXh0ICpjdHgsIEdMdWludCBwcmltICkKLXsKLQludjEwUmFzdGVyUHJpbWl0aXZlKCBjdHgsIHByaW0sIGh3X3ByaW1bcHJpbV0gKTsKLX0KLQotc3RhdGljIHZvaWQgbnYxMFJlc2V0TGluZVN0aXBwbGUoIEdMY29udGV4dCAqY3R4ICkKLXsKLQkvKiBGSVhNRSBkbyBzb21ldGhpbmcgaGVyZSAqLwotCVdBUk5fT05DRSgiVW5pbXBsZW1lbnRlZCBudjEwUmVzZXRMaW5lU3RpcHBsZVxuIik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIG52MTBUcmlJbml0RnVuY3Rpb25zKEdMY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQoY3R4KTsKLQotCXRubC0+RHJpdmVyLlJ1blBpcGVsaW5lID0gbm91dmVhdVJ1blBpcGVsaW5lOwotCXRubC0+RHJpdmVyLlJlbmRlci5TdGFydCA9IG52MTBSZW5kZXJTdGFydDsKLQl0bmwtPkRyaXZlci5SZW5kZXIuRmluaXNoID0gbnYxMFJlbmRlckZpbmlzaDsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUHJpbWl0aXZlTm90aWZ5ID0gbnYxMFJlbmRlclByaW1pdGl2ZTsKLQl0bmwtPkRyaXZlci5SZW5kZXIuUmVzZXRMaW5lU3RpcHBsZSA9IG52MTBSZXNldExpbmVTdGlwcGxlOwotCXRubC0+RHJpdmVyLlJlbmRlci5CdWlsZFZlcnRpY2VzID0gX3RubF9idWlsZF92ZXJ0aWNlczsKLQl0bmwtPkRyaXZlci5SZW5kZXIuQ29weVBWID0gX3RubF9jb3B5X3B2OwotCXRubC0+RHJpdmVyLlJlbmRlci5JbnRlcnAgPSBfdG5sX2ludGVycDsKLQotCV90bmxfaW5pdF92ZXJ0aWNlcyggY3R4LCBjdHgtPkNvbnN0Lk1heEFycmF5TG9ja1NpemUgKyAxMiwgCi0JCQk2NCAqIHNpemVvZihHTGZsb2F0KSApOwotCi0Jbm1lc2EtPnZlcnRzID0gKEdMdWJ5dGUgKil0bmwtPmNsaXBzcGFjZS52ZXJ0ZXhfYnVmOwotfQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYxMF9zd3RjbC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjEwX3N3dGNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODU0YWQuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjEwX3N3dGNsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDIwMDYgU3RlcGhhbmUgTWFyY2hlc2luCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKLWxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCi10aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQotU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotRVJJQyBBTkhPTFQgT1IgU0lMSUNPTiBJTlRFR1JBVEVEIFNZU1RFTVMgQ09SUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQotVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0jaWZuZGVmIF9fTlYxMF9TV1RDTF9IX18KLSNkZWZpbmUgX19OVjEwX1NXVENMX0hfXwotCi0jaW5jbHVkZSAibXR5cGVzLmgiCi0KLWV4dGVybiB2b2lkIG52MTBGYWxsYmFjayggR0xjb250ZXh0ICpjdHgsIEdMdWludCBiaXQsIEdMYm9vbGVhbiBtb2RlICk7Ci1leHRlcm4gdm9pZCBudjEwRmluaXNoUHJpbWl0aXZlKHN0cnVjdCBub3V2ZWF1X2NvbnRleHQgKm5tZXNhKTsKLWV4dGVybiB2b2lkIG52MTBUcmlJbml0RnVuY3Rpb25zKEdMY29udGV4dCAqY3R4KTsKLSNkZWZpbmUgRkFMTEJBQ0soIG5tZXNhLCBiaXQsIG1vZGUgKSBub3V2ZWF1RmFsbGJhY2soIG5tZXNhLT5nbEN0eCwgYml0LCBtb2RlICkKLQotI2VuZGlmIC8qIF9fTlYxMF9TV1RDTF9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3NoYWRlci5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3NoYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDJlMjlkLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYyMF9zaGFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBOVjIwX1RDTF9QUklNSVRJVkVfM0RfMHgwQjAwICovCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF8wQjAwCTB4MDAwMDAwMDAgLyogYWx3YXlzIDA/ICovCi0jZGVmaW5lIE5WMjBfVlBfSU5TVDBfS05PV04JMAotCi0vKiBOVjIwX1RDTF9QUklNSVRJVkVfM0RfMHgwQjA0ICovCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TQ0FfT1BDT0RFX1NISUZUCQkJCTI1Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TQ0FfT1BDT0RFX01BU0sJCQkJKDB4MEYgPDwgMjUpCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfUkNQCTB4MgotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX1JDQwkweDMKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9SU1EJMHg0Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfRVhQCTB4NQotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX0xPRwkweDYKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9MSVQJMHg3Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9WRUNfT1BDT0RFX1NISUZUCQkJCTIxCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9WRUNfT1BDT0RFX01BU0sJCQkJKDB4MEYgPDwgMjEpCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfTk9QCTB4MCAvKiBndWVzcyAqLwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX01PVgkweDEKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9NVUwJMHgyCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfQURECTB4MwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX01BRAkweDQKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9EUDMJMHg1Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfRFBICTB4NgotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX0RQNAkweDcKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9EU1QJMHg4Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfTUlOCTB4OQotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX01BWAkweEEKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX09QQ09ERV9TTFQJMHhCCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9PUENPREVfU0dFCTB4QwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfT1BDT0RFX0FSTAkweEQKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0NPTlNUX1NSQ19TSElGVAkJCQkxMwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfQ09OU1RfU1JDX01BU0sJCQkJKDB4RkYgPDwgMTMpCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfU0hJRlQJCQkJOQotI2RlZmluZSBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX01BU0sJCQkJKDB4RiA8PCA5KSAvKiBndWVzcyAqLwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX1BPUwkwCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfQ09MMAkzCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfQ09MMQk0Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfVEMobikJKDkrbikKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NSQzBIX1NISUZUCQkJCTAKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NSQzBIX01BU0sJCQkJCSgweDFGRiA8PCAwKQotI2RlZmluZSBOVjIwX1ZQX0lOU1QxX0tOT1dOCSggXAotCU5WMjBfVlBfSU5TVF9PUENPREVfTUFTSyB8IFwKLQlOVjIwX1ZQX0lOU1RfQ09OU1RfU1JDX01BU0sgfCBcCi0JTlYyMF9WUF9JTlNUX0lOUFVUX1NSQ19NQVNLIHwgXAotCU5WMjBfVlBfSU5TVF9TUkMwSF9NQVNLIFwKLQkpCi0KLS8qIE5WMjBfVENMX1BSSU1JVElWRV8zRF8weDBCMDggKi8KLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NSQzBMX1NISUZUCQkJCTI2Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TUkMwTF9NQVNLCQkJCQkoMHgzRiAgPDwyNikKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NSQzFfU0hJRlQJCQkJCTExCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TUkMxX01BU0sJCQkJCSgweDdGRkY8PDExKQotI2RlZmluZSBOVjIwX1ZQX0lOU1RfU1JDMkhfU0hJRlQJCQkJMAotI2RlZmluZSBOVjIwX1ZQX0lOU1RfU1JDMkhfTUFTSwkJCQkJKDB4N0ZGIDw8IDApCi0KLS8qIE5WMjBfVENMX1BSSU1JVElWRV8zRF8weDBCMEMgKi8KLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NSQzJMX1NISUZUCQkJCTI4Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TUkMyTF9NQVNLCQkJCQkoMHgwRiAgPDwyOCkKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1ZURU1QX1dSSVRFTUFTS19TSElGVAkJCTI0Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9WVEVNUF9XUklURU1BU0tfTUFTSwkJCSgweDBGICA8PDI0KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1RFTVBfV1JJVEVNQVNLX1gJKDE8PDI3KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1RFTVBfV1JJVEVNQVNLX1kJKDE8PDI2KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1RFTVBfV1JJVEVNQVNLX1oJKDE8PDI1KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1RFTVBfV1JJVEVNQVNLX1cJKDE8PDI0KQotI2RlZmluZSBOVjIwX1ZQX0lOU1RfREVTVF9URU1QX0lEX1NISUZUCQkJCTIwCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1RFTVBfSURfTUFTSwkJCQkoMHgwRiAgPDwyMCkKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19TSElGVAkJCTE2Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9TVEVNUF9XUklURU1BU0tfTUFTSwkJCSgweDBGICA8PDE2KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19YCSgxPDwxOSkKLSMgICAgZGVmaW5lIE5WMjBfVlBfSU5TVF9TVEVNUF9XUklURU1BU0tfWQkoMTw8MTgpCi0jICAgIGRlZmluZSBOVjIwX1ZQX0lOU1RfU1RFTVBfV1JJVEVNQVNLX1oJKDE8PDE3KQotIyAgICBkZWZpbmUgTlYyMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19XCSgxPDwxNikKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0RFU1RfV1JJVEVNQVNLX1NISUZUCQkJMTIKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0RFU1RfV1JJVEVNQVNLX01BU0sJCQkoMHgwRiAgPDwxMikKLSMgICAgZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1dSSVRFTUFTS19YCSgxPDwxNSkKLSMgICAgZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1dSSVRFTUFTS19ZCSgxPDwxNCkKLSMgICAgZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1dSSVRFTUFTS19aCSgxPDwxMykKLSMgICAgZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1dSSVRFTUFTS19XCSgxPDwxMikKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0RFU1RfU0hJRlQJCQkJCTMKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0RFU1RfTUFTSwkJCQkJKDB4RiA8PCAzKSAvKiBndWVzcyAqLwotI2RlZmluZSBOVjIwX1ZQX0lOU1RfREVTVF9QT1MJMAotI2RlZmluZSBOVjIwX1ZQX0lOU1RfREVTVF9DT0wwCTMKLSNkZWZpbmUgTlYyMF9WUF9JTlNUX0RFU1RfQ09MMQk0Ci0jZGVmaW5lIE5WMjBfVlBfSU5TVF9ERVNUX1RDKG4pCSg5K24pCi0jZGVmaW5lIE5WMjBfVlBfSU5TVF9JTkRFWF9DT05TVAkJCQkoMTw8MSkKLSNkZWZpbmUgTlYyMF9WUF9JTlNUM19LTk9XTiAoIFwKLQlOVjIwX1ZQX0lOU1RfU1JDMkxfTUFTSyB8IFwKLQlOVjIwX1ZQX0lOU1RfVEVNUF9XUklURU1BU0tfTUFTSyB8IFwKLQlOVjIwX1ZQX0lOU1RfREVTVF9URU1QX0lEX01BU0sgfCBcCi0JTlYyMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19NQVNLIHwgXAotCU5WMjBfVlBfSU5TVF9ERVNUX1dSSVRFTUFTS19NQVNLIHwgXAotCU5WMjBfVlBfSU5TVF9ERVNUX01BU0sgfCBcCi0JTlYyMF9WUF9JTlNUX0lOREVYX0NPTlNUIFwKLQkpCi0KLS8qIFVzZWZ1bCB0byBzcGxpdCB0aGUgc291cmNlIHNlbGVjdGlvbiByZWdzIGludG8gdGhlaXIgcGllY2VzICovCi0jZGVmaW5lIE5WMjBfVlBfU1JDMF9ISUdIX1NISUZUIDYKLSNkZWZpbmUgTlYyMF9WUF9TUkMwX0hJR0hfTUFTSyAgMHgwMDAwN0ZDMAotI2RlZmluZSBOVjIwX1ZQX1NSQzBfTE9XX01BU0sgICAweDAwMDAwMDNGCi0jZGVmaW5lIE5WMjBfVlBfU1JDMl9ISUdIX1NISUZUIDQKLSNkZWZpbmUgTlYyMF9WUF9TUkMyX0hJR0hfTUFTSyAgMHgwMDAwN0ZGMAotI2RlZmluZSBOVjIwX1ZQX1NSQzJfTE9XX01BU0sgICAweDAwMDAwMDBGCi0KLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX05FR0FURQkJCQkJKDE8PDE0KQotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfU1daX1hfU0hJRlQJCQkJMTIKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1NXWl9YX01BU0sJCQkJKDB4MDMgIDw8MTIpCi0jZGVmaW5lIE5WMjBfVlBfU1JDX1JFR19TV1pfWV9TSElGVAkJCQkxMAotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfU1daX1lfTUFTSwkJCQkoMHgwMyAgPDwxMCkKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1NXWl9aX1NISUZUCQkJCTgKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1NXWl9aX01BU0sJCQkJKDB4MDMgIDw8IDgpCi0jZGVmaW5lIE5WMjBfVlBfU1JDX1JFR19TV1pfV19TSElGVAkJCQk2Ci0jZGVmaW5lIE5WMjBfVlBfU1JDX1JFR19TV1pfV19NQVNLCQkJCSgweDAzICA8PCA2KQotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfU1daX0FMTF9TSElGVAkJCQk2Ci0jZGVmaW5lIE5WMjBfVlBfU1JDX1JFR19TV1pfQUxMX01BU0sJCQkJKDB4RkYgIDw8IDYpCi0jZGVmaW5lIE5WMjBfVlBfU1JDX1JFR19URU1QX0lEX1NISUZUCQkJCTIKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1RFTVBfSURfTUFTSwkJCQkoMHgwRiAgPDwgMCkKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQJCQkJMAotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfVFlQRV9NQVNLCQkJCSgweDAzICA8PCAwKQotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfVFlQRV9URU1QCTEKLSNkZWZpbmUgTlYyMF9WUF9TUkNfUkVHX1RZUEVfSU5QVVQJMgotI2RlZmluZSBOVjIwX1ZQX1NSQ19SRUdfVFlQRV9DT05TVAkzCS8qIGd1ZXNzICovCi0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYyMF9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3N0YXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjJmNjEuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3N0YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUNvcHlyaWdodCAyMDA2IE5vdXZlYXUKLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgotbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KLXRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci1wYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi1Tb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi1FUklDIEFOSE9MVCBPUiBTSUxJQ09OIElOVEVHUkFURUQgU1lTVEVNUyBDT1JQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi1VU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfb2JqZWN0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi1zdGF0aWMgdm9pZCBudjIwQWxwaGFGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlIHViUmVmOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJSZWYsIHJlZik7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0ZVTkMsIDIpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotCU9VVF9SSU5HX0NBQ0hFKHViUmVmKTsKLX0KLQotc3RhdGljIHZvaWQgbnYyMEJsZW5kQ29sb3IoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsgCi0JR0x1Ynl0ZSBjZls0XTsKLQotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2ZbMF0sIGNvbG9yWzBdKTsKLQlDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGNmWzFdLCBjb2xvclsxXSk7Ci0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShjZlsyXSwgY29sb3JbMl0pOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2ZbM10sIGNvbG9yWzNdKTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SLCAxKTsKLQlPVVRfUklOR19DQUNIRShQQUNLX0NPTE9SXzg4ODgoY2ZbM10sIGNmWzFdLCBjZlsyXSwgY2ZbMF0pKTsKLX0KLQotc3RhdGljIHZvaWQgbnYyMEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0VRVUFUSU9OLCAxKTsKLQlPVVRfUklOR19DQUNIRSgobW9kZUE8PDE2KSB8IG1vZGVSR0IpOwotfQotCi0KLXN0YXRpYyB2b2lkIG52MjBCbGVuZEZ1bmNTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLAotCQlHTGVudW0gc2ZhY3RvckEsIEdMZW51bSBkZmFjdG9yQSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfU1JDLCAyKTsKLQlPVVRfUklOR19DQUNIRSgoc2ZhY3RvckE8PDE2KSB8IHNmYWN0b3JSR0IpOwotCU9VVF9SSU5HX0NBQ0hFKChkZmFjdG9yQTw8MTYpIHwgZGZhY3RvclJHQik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBDbGVhcihHTGNvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBtYXNrKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1aW50IGh3X2J1ZnMgPSAwOwotCi0JaWYgKG1hc2sgJiAoQlVGRkVSX0JJVF9GUk9OVF9MRUZUIHwgQlVGRkVSX0JJVF9CQUNLX0xFRlQpKQotCQlod19idWZzIHw9IDB4ZjA7Ci0JaWYgKG1hc2sgJiAoQlVGRkVSX0JJVF9ERVBUSCkpCi0JCWh3X2J1ZnMgfD0gMHgwMzsKLQotCWlmIChod19idWZzKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX1dISUNIX0JVRkZFUlMsIDEpOwotCQlPVVRfUklOR19DQUNIRShod19idWZzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBDbGVhckNvbG9yKEdMY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IGNvbG9yWzRdKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1Ynl0ZSBjWzRdOwotCVVOQ0xBTVBFRF9GTE9BVF9UT19SR0JBX0NIQU4oYyxjb2xvcik7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfVkFMVUVfQVJHQiwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoUEFDS19DT0xPUl84ODg4KGNbM10sY1swXSxjWzFdLGNbMl0pKTsKLX0KLQotc3RhdGljIHZvaWQgbnYyMENsZWFyRGVwdGgoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIGQpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlubWVzYS0+Y2xlYXJfdmFsdWU9KChubWVzYS0+Y2xlYXJfdmFsdWUmMHgwMDAwMDBGRil8KCgodWludDMyX3QpKGQqMHhGRkZGRkYpKTw8OCkpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX1ZBTFVFX0RFUFRILCAxKTsKLQlPVVRfUklOR19DQUNIRShubWVzYS0+Y2xlYXJfdmFsdWUpOwotfQotCi0vKiB3ZSdyZSBkb24ndCBzdXBwb3J0IGluZGV4ZWQgYnVmZmVycwotICAgdm9pZCAoKkNsZWFySW5kZXgpKEdMY29udGV4dCAqY3R4LCBHTHVpbnQgaW5kZXgpCi0gKi8KLQotc3RhdGljIHZvaWQgbnYyMENsZWFyU3RlbmNpbChHTGNvbnRleHQgKmN0eCwgR0xpbnQgcykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCW5tZXNhLT5jbGVhcl92YWx1ZT0oKG5tZXNhLT5jbGVhcl92YWx1ZSYweEZGRkZGRjAwKXwocyYweDAwMDAwMEZGKSk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfVkFMVUVfREVQVEgsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG5tZXNhLT5jbGVhcl92YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBDbGlwUGxhbmUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9DTElQX1BMQU5FX0EocGxhbmUpLCA0KTsKLQlPVVRfUklOR19DQUNIRWYoZXF1YXRpb25bMF0pOwotCU9VVF9SSU5HX0NBQ0hFZihlcXVhdGlvblsxXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGVxdWF0aW9uWzJdKTsKLQlPVVRfUklOR19DQUNIRWYoZXF1YXRpb25bM10pOwotfQotCi1zdGF0aWMgdm9pZCBudjIwQ29sb3JNYXNrKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gcm1hc2ssIEdMYm9vbGVhbiBnbWFzaywKLQkJR0xib29sZWFuIGJtYXNrLCBHTGJvb2xlYW4gYW1hc2sgKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ09MT1JfTUFTSywgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoKChhbWFzayAmJiAweDAxKSA8PCAyNCkgfCAoKHJtYXNrICYmIDB4MDEpIDw8IDE2KSB8ICgoZ21hc2sgJiYgMHgwMSk8PCA4KSB8ICgoYm1hc2sgJiYgMHgwMSkgPDwgMCkpOwotfQotCi1zdGF0aWMgdm9pZCBudjIwQ29sb3JNYXRlcmlhbChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKQotewotCS8vIFRPRE8gSSBuZWVkIGxvdmUKLX0KLQotc3RhdGljIHZvaWQgbnYyMEN1bGxGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NVTExfRkFDRSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBGcm9udEZhY2UoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfRlJPTlRfRkFDRSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBEZXB0aEZ1bmMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfRlVOQywgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoZnVuYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBEZXB0aE1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBmbGFnKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfV1JJVEVfRU5BQkxFLCAxKTsKLQlPVVRfUklOR19DQUNIRShmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQgbnYyMERlcHRoUmFuZ2UoR0xjb250ZXh0ICpjdHgsIEdMY2xhbXBkIG5lYXJ2YWwsIEdMY2xhbXBkIGZhcnZhbCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1JBTkdFX05FQVIsIDIpOwotCU9VVF9SSU5HX0NBQ0hFZihuZWFydmFsKTsKLQlPVVRfUklOR19DQUNIRWYoZmFydmFsKTsKLX0KLQotLyoqIFNwZWNpZnkgdGhlIGN1cnJlbnQgYnVmZmVyIGZvciB3cml0aW5nICovCi0vL3ZvaWQgKCpEcmF3QnVmZmVyKSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIgKTsKLS8qKiBTcGVjaWZ5IHRoZSBidWZmZXJzIGZvciB3cml0aW5nIGZvciBmcmFnbWVudCBwcm9ncmFtcyovCi0vL3ZvaWQgKCpEcmF3QnVmZmVycykoIEdMY29udGV4dCAqY3R4LCBHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmZmVycyApOwotCi1zdGF0aWMgdm9pZCBudjIwRW5hYmxlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gY2FwLCBHTGJvb2xlYW4gc3RhdGUpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlzd2l0Y2goY2FwKQotCXsKLQkJY2FzZSBHTF9BTFBIQV9URVNUOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfQUxQSEFfRlVOQ19FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9BVVRPX05PUk1BTDoKLQkJY2FzZSBHTF9CTEVORDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0NMSVBfUExBTkUwOgotCQljYXNlIEdMX0NMSVBfUExBTkUxOgotCQljYXNlIEdMX0NMSVBfUExBTkUyOgotCQljYXNlIEdMX0NMSVBfUExBTkUzOgotCQljYXNlIEdMX0NMSVBfUExBTkU0OgotCQljYXNlIEdMX0NMSVBfUExBTkU1OgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9FTkFCTEUoY2FwLUdMX0NMSVBfUExBTkUwKSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9DT0xPUl9MT0dJQ19PUDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX0xPR0lDX09QX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0NPTE9SX01BVEVSSUFMOgotLy8JCWNhc2UgR0xfQ09MT1JfU1VNX0VYVDoKLS8vCQljYXNlIEdMX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfQ09OVk9MVVRJT05fMUQ6Ci0vLwkJY2FzZSBHTF9DT05WT0xVVElPTl8yRDoKLQkJY2FzZSBHTF9DVUxMX0ZBQ0U6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0VfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0RFUFRIX1RFU1Q6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ESVRIRVI6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9ESVRIRVJfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0ZPRzoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9ISVNUT0dSQU06Ci0vLwkJY2FzZSBHTF9JTkRFWF9MT0dJQ19PUDoKLQkJY2FzZSBHTF9MSUdIVDA6Ci0JCWNhc2UgR0xfTElHSFQxOgotCQljYXNlIEdMX0xJR0hUMjoKLQkJY2FzZSBHTF9MSUdIVDM6Ci0JCWNhc2UgR0xfTElHSFQ0OgotCQljYXNlIEdMX0xJR0hUNToKLQkJY2FzZSBHTF9MSUdIVDY6Ci0JCWNhc2UgR0xfTElHSFQ3OgotCQkJewotCQkJdWludDMyX3QgbWFzaz0weDExPDwoMiooY2FwLUdMX0xJR0hUMCkpOwotCQkJbm1lc2EtPmVuYWJsZWRfbGlnaHRzPSgobm1lc2EtPmVuYWJsZWRfbGlnaHRzJm1hc2spfChtYXNrKnN0YXRlKSk7Ci0JCQlpZiAobm1lc2EtPmxpZ2h0aW5nX2VuYWJsZWQpCi0JCQl7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfRU5BQkxFRF9MSUdIVFMsIDEpOwotCQkJCU9VVF9SSU5HX0NBQ0hFKG5tZXNhLT5lbmFibGVkX2xpZ2h0cyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCX0KLQkJY2FzZSBHTF9MSUdIVElORzoKLQkJCW5tZXNhLT5saWdodGluZ19lbmFibGVkPXN0YXRlOwotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfRU5BQkxFRF9MSUdIVFMsIDEpOwotCQkJaWYgKG5tZXNhLT5saWdodGluZ19lbmFibGVkKQotCQkJCU9VVF9SSU5HX0NBQ0hFKG5tZXNhLT5lbmFibGVkX2xpZ2h0cyk7Ci0JCQllbHNlCi0JCQkJT1VUX1JJTkdfQ0FDSEUoMHgwKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0xJTkVfU01PT1RIOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElORV9TTU9PVEhfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfTElORV9TVElQUExFOgotLy8JCWNhc2UgR0xfTUFQMV9DT0xPUl80OgotLy8JCWNhc2UgR0xfTUFQMV9JTkRFWDoKLS8vCQljYXNlIEdMX01BUDFfTk9STUFMOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzE6Ci0vLwkJY2FzZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMjoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzQ6Ci0vLwkJY2FzZSBHTF9NQVAxX1ZFUlRFWF8zOgotLy8JCWNhc2UgR0xfTUFQMV9WRVJURVhfNDoKLS8vCQljYXNlIEdMX01BUDJfQ09MT1JfNDoKLS8vCQljYXNlIEdMX01BUDJfSU5ERVg6Ci0vLwkJY2FzZSBHTF9NQVAyX05PUk1BTDoKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xOgotLy8JCWNhc2UgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzI6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMzoKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF80OgotLy8JCWNhc2UgR0xfTUFQMl9WRVJURVhfMzoKLS8vCQljYXNlIEdMX01BUDJfVkVSVEVYXzQ6Ci0vLwkJY2FzZSBHTF9NSU5NQVg6Ci0JCWNhc2UgR0xfTk9STUFMSVpFOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTk9STUFMSVpFX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX1BPSU5UX1NNT09USDoKLQkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9QT0lOVDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1BPSU5UX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9MSU5FOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfTElORV9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZJTExfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fU01PT1RIOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9TTU9PVEhfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fU1RJUFBMRToKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEU6Ci0vLwkJY2FzZSBHTF9SRVNDQUxFX05PUk1BTDoKLQkJY2FzZSBHTF9TQ0lTU09SX1RFU1Q6Ci0JCQkvKiBObyBlbmFibGUgYml0LCBudjIwU2Npc3NvciB3aWxsIGFkanVzdCB0byBtYXggcmFuZ2UgKi8KLQkJCWN0eC0+RHJpdmVyLlNjaXNzb3IoY3R4LCBjdHgtPlNjaXNzb3IuWCwgY3R4LT5TY2lzc29yLlksCi0JCQkgICAgICAJCQkgY3R4LT5TY2lzc29yLldpZHRoLCBjdHgtPlNjaXNzb3IuSGVpZ2h0KTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfU0VQQVJBQkxFXzJEOgotCQljYXNlIEdMX1NURU5DSUxfVEVTVDoKLQkJCS8vIFRPRE8gQkFDSyBhbmQgRlJPTlQgPwotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9ROgotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fUjoKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1M6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9UOgotLy8JCWNhc2UgR0xfVEVYVFVSRV8xRDoKLS8vCQljYXNlIEdMX1RFWFRVUkVfMkQ6Ci0vLwkJY2FzZSBHTF9URVhUVVJFXzNEOgotCX0KLX0KLQotc3RhdGljIHZvaWQgbnYyMEZvZ2Z2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLSAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgIHN3aXRjaChwbmFtZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgR0xfRk9HX01PREU6Ci0gICAgICAgICAgICBCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9GT0dfTU9ERSwgMSk7Ci0gICAgICAgICAgICAvL09VVF9SSU5HX0NBQ0hFIChwYXJhbXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBUT0RPOiB1bnN1cmUgYWJvdXQgdGhlIHJlc3QuKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotfQotICAgCi1zdGF0aWMgdm9pZCBudjIwSGludChHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpCi17Ci0JLy8gVE9ETyBJIG5lZWQgbG92ZSAoZm9nIGFuZCBsaW5lX3Ntb290aCBoaW50cykKLX0KLQotLy8gdm9pZCAoKkluZGV4TWFzaykoR0xjb250ZXh0ICpjdHgsIEdMdWludCBtYXNrKTsKLQotZW51bSB7Ci0JU1BPVExJR0hUX05PX1VQREFURSwKLQlTUE9UTElHSFRfVVBEQVRFX0VYUE9ORU5ULAotCVNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OLAotCVNQT1RMSUdIVF9VUERBVEVfQUxMCi19OwotCi1zdGF0aWMgdm9pZCBudjIwTGlnaHRmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTGludCBwID0gbGlnaHQgLSBHTF9MSUdIVDA7Ci0Jc3RydWN0IGdsX2xpZ2h0ICpsID0gJmN0eC0+TGlnaHQuTGlnaHRbcF07Ci0JaW50IHNwb3RsaWdodF91cGRhdGUgPSBTUE9UTElHSFRfTk9fVVBEQVRFOwotCi0JLyogbm90IHN1cmUgd2hlcmUgdGhlIGZvdXJ0aCBwYXJhbSB2YWx1ZSBnb2VzLi4uKi8KLQlzd2l0Y2gocG5hbWUpCi0JewotCQljYXNlIEdMX0FNQklFTlQ6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0RJRkZVU0U6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQRUNVTEFSOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX1IocCksIDMpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1swXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzFdKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMl0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9TSVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9YKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQT1RfRElSRUNUSU9OOgotCQkJc3BvdGxpZ2h0X3VwZGF0ZSA9IFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKLQkJCXNwb3RsaWdodF91cGRhdGUgPSBTUE9UTElHSFRfVVBEQVRFX0VYUE9ORU5UOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9DVVRPRkY6Ci0JCQlzcG90bGlnaHRfdXBkYXRlID0gU1BPVExJR0hUX1VQREFURV9BTEw7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0NPTlNUQU5UX0FUVEVOVUFUSU9OKHApLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZigqcGFyYW1zKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0xJTkVBUl9BVFRFTlVBVElPTihwKSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRWYoKnBhcmFtcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9RVUFEUkFUSUNfQVRURU5VQVRJT04ocCksIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKCpwYXJhbXMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2goc3BvdGxpZ2h0X3VwZGF0ZSkgewotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOgotCQkJewotCQkJCUdMZmxvYXQgeCx5LHo7Ci0JCQkJR0xmbG9hdCBzcG90X2xpZ2h0X2NvZWZfYSA9IDEuMCAvIChsLT5fQ29zQ3V0b2ZmIC0gMS4wKTsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9YKHApLCAzKTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeCk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHkpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih6KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRVhQT05FTlQ6Ci0JCQl7Ci0JCQkJR0xmbG9hdCBjYyxsYyxxYzsKLQkJCQljYyA9IDEuMDsJLyogRklYTUU6IFRoZXNlIG5lZWQgdG8gYmUgY29ycmVjdGx5IGNvbXB1dGVkICovCi0JCQkJbGMgPSAwLjA7Ci0JCQkJcWMgPSAyLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgMyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTUE9UTElHSFRfVVBEQVRFX0FMTDoKLQkJCXsKLQkJCQlHTGZsb2F0IGNjLGxjLHFjLCB4LHkseiwgYzsKLQkJCQlHTGZsb2F0IHNwb3RfbGlnaHRfY29lZl9hID0gMS4wIC8gKGwtPl9Db3NDdXRvZmYgLSAxLjApOwotCQkJCWNjID0gMS4wOwkvKiBGSVhNRTogVGhlc2UgbmVlZCB0byBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgKi8KLQkJCQlsYyA9IDAuMDsKLQkJCQlxYyA9IDIuMDsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQljID0gc3BvdF9saWdodF9jb2VmX2EgKyAxLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgNyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHgpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih5KTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeik7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qKiBTZXQgdGhlIGxpZ2h0aW5nIG1vZGVsIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyB2b2lkICgqTGlnaHRNb2RlbGZ2KShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotCi0KLXN0YXRpYyB2b2lkIG52MjBMaW5lU3RpcHBsZShHTGNvbnRleHQgKmN0eCwgR0xpbnQgZmFjdG9yLCBHTHVzaG9ydCBwYXR0ZXJuICkKLXsKLS8qCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfTElORV9TVElQUExFX1BBVFRFUk4sIDEpOwotCU9VVF9SSU5HX0NBQ0hFKChwYXR0ZXJuIDw8IDE2KSB8IGZhY3Rvcik7Ki8KLX0KLQotc3RhdGljIHZvaWQgbnYyMExpbmVXaWR0aChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCB3aWR0aCkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfV0lEVEgsIDEpOwotCU9VVF9SSU5HX0NBQ0hFZih3aWR0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MjBMb2dpY09wY29kZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG9wY29kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX0xPR0lDX09QX09QLCAxKTsKLQlPVVRfUklOR19DQUNIRShvcGNvZGUpOwotfQotCi1zdGF0aWMgdm9pZCBudjIwUG9pbnRQYXJhbWV0ZXJmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0JLypUT0RPOiBub3Qgc3VyZSB3aGF0IGdvZXMgaGVyZS4gKi8KLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCQotfQotCi0vKiogU3BlY2lmeSB0aGUgZGlhbWV0ZXIgb2YgcmFzdGVyaXplZCBwb2ludHMgKi8KLXN0YXRpYyB2b2lkIG52MjBQb2ludFNpemUoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgc2l6ZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1NJWkUsIDEpOwotCU9VVF9SSU5HX0NBQ0hFZihzaXplKTsKLX0KLQotLyoqIFNlbGVjdCBhIHBvbHlnb24gcmFzdGVyaXphdGlvbiBtb2RlICovCi1zdGF0aWMgdm9pZCBudjIwUG9seWdvbk1vZGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfRlJPTlQsIDEpOwotCQlPVVRfUklOR19DQUNIRShtb2RlKTsKLQl9Ci0JaWYgKGZhY2UgPT0gR0xfQkFDSyB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9CQUNLLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci0JfQotfQotCi0vKiogU2V0IHRoZSBzY2FsZSBhbmQgdW5pdHMgdXNlZCB0byBjYWxjdWxhdGUgZGVwdGggdmFsdWVzICovCi1zdGF0aWMgdm9pZCBudjIwUG9seWdvbk9mZnNldChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiwgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFZihmYWN0b3IpOwotICAgICAgICBPVVRfUklOR19DQUNIRWYodW5pdHMpOwotfQotCi0vKiogU2V0IHRoZSBwb2x5Z29uIHN0aXBwbGluZyBwYXR0ZXJuICovCi1zdGF0aWMgdm9pZCBudjIwUG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWJ5dGUgKm1hc2sgKQotewotICAgICAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgICAgICBCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NUSVBQTEVfUEFUVEVSTigwKSwgMzIpOwotICAgICAgICBPVVRfUklOR19DQUNIRXAobWFzaywgMzIpOwotfQotCi0vKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgYnVmZmVyIGZvciByZWFkaW5nICovCi12b2lkICgqUmVhZEJ1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU2V0IHJhc3Rlcml6YXRpb24gbW9kZSAqLwotdm9pZCAoKlJlbmRlck1vZGUpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSApOwotCi0vKiogRGVmaW5lIHRoZSBzY2lzc29yIGJveCAqLwotc3RhdGljIHZvaWQgbnYyMFNjaXNzb3IoR0xjb250ZXh0ICpjdHgsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgICAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JLyogVGhlcmUncyBubyBzY2lzc29yIGVuYWJsZSBiaXQsIHNvIGFkanVzdCB0aGUgc2Npc3NvciB0byBjb3ZlciB0aGUKLQkgKiBtYXhpbXVtIGRyYXcgYnVmZmVyIGJvdW5kcwotCSAqLwotCWlmICghY3R4LT5TY2lzc29yLkVuYWJsZWQpIHsKLQkgICB4ID0geSA9IDA7Ci0JICAgdyA9IGggPSA0MDk1OwotCX0gZWxzZSB7Ci0JICAgeCArPSBubWVzYS0+ZHJhd1g7Ci0JICAgeSArPSBubWVzYS0+ZHJhd1k7Ci0JfQotCi0gICAgICAgIC8qQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0NJU1NPUl9YMl9YMSwgMSk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCh3IDw8IDE2KSB8IHggKTsKLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0NJU1NPUl9ZMl9ZMSwgMSk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKChoIDw8IDE2KSB8IHkgKTsqLwotCi19Ci0KLS8qKiBTZWxlY3QgZmxhdCBvciBzbW9vdGggc2hhZGluZyAqLwotc3RhdGljIHZvaWQgbnYyMFNoYWRlTW9kZWwoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9TSEFERV9NT0RFTCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLS8qKiBPcGVuR0wgMi4wIHR3by1zaWRlZCBTdGVuY2lsRnVuYyAqLwotc3RhdGljIHZvaWQgbnYyMFN0ZW5jaWxGdW5jU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywKLQkJR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GVU5DX0ZVTkMsIDMpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotCU9VVF9SSU5HX0NBQ0hFKHJlZik7Ci0JT1VUX1JJTkdfQ0FDSEUobWFzayk7Ci19Ci0KLS8qKiBPcGVuR0wgMi4wIHR3by1zaWRlZCBTdGVuY2lsTWFzayAqLwotc3RhdGljIHZvaWQgbnYyMFN0ZW5jaWxNYXNrU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9NQVNLLCAxKTsKLQlPVVRfUklOR19DQUNIRShtYXNrKTsKLX0KLQotLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxPcCAqLwotc3RhdGljIHZvaWQgbnYyMFN0ZW5jaWxPcFNlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsCi0JCUdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX09QX0ZBSUwsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKGZhaWwpOwotCU9VVF9SSU5HX0NBQ0hFKHpmYWlsKTsKLQlPVVRfUklOR19DQUNIRSh6cGFzcyk7Ci19Ci0KLS8qKiBDb250cm9sIHRoZSBnZW5lcmF0aW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMgKi8KLXZvaWQgKCpUZXhHZW4pKEdMY29udGV4dCAqY3R4LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwKLQkJY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLS8qKiBTZXQgdGV4dHVyZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzICovCi12b2lkICgqVGV4RW52KShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAotCQljb25zdCBHTGZsb2F0ICpwYXJhbSk7Ci0vKiogU2V0IHRleHR1cmUgcGFyYW1ldGVycyAqLwotdm9pZCAoKlRleFBhcmFtZXRlcikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCi0JCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQlHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0KLXN0YXRpYyB2b2lkIG52MjBUZXh0dXJlTWF0cml4KEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCwgY29uc3QgR0xtYXRyaXggKm1hdCkKLXsKLSAgICAgICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVFhfTUFUUklYKHVuaXQsIDApLCAxNik7Ci0gICAgICAgIC8qWFhYOiBUaGlzIFNIT1VMRCB3b3JrLiovCi0gICAgICAgIE9VVF9SSU5HX0NBQ0hFcChtYXQtPm0sIDE2KTsKLX0KLQotLyogVXBkYXRlIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGUgd2luZG93IHBvc2l0aW9uL3NpemUgKi8KLXN0YXRpYyB2b2lkIG52MjBXaW5kb3dNb3ZlZChub3V2ZWF1Q29udGV4dFB0ciBubWVzYSkKLXsKLQlHTGNvbnRleHQgKmN0eCA9IG5tZXNhLT5nbEN0eDsKLQlHTGZsb2F0ICp2ID0gbm1lc2EtPnZpZXdwb3J0Lm07Ci0JR0x1aW50IHcgPSBjdHgtPlZpZXdwb3J0LldpZHRoOwotCUdMdWludCBoID0gY3R4LT5WaWV3cG9ydC5IZWlnaHQ7Ci0JR0x1aW50IHggPSBjdHgtPlZpZXdwb3J0LlggKyBubWVzYS0+ZHJhd1g7Ci0JR0x1aW50IHkgPSBjdHgtPlZpZXdwb3J0LlkgKyBubWVzYS0+ZHJhd1k7Ci0JaW50IGk7Ci0KLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfSE9SSVosIDIpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgodyA8PCAxNikgfCB4KTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKGggPDwgMTYpIHwgeSk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgwMmI0LCAxKTsKLQlPVVRfUklORygwKTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ0xJUF9IT1JJWigwKSwgMSk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCg0MDk1IDw8IDE2KSB8IDApOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkgICAgICBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfQ0xJUF9WRVJUKDApLCAxKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKDQwOTUgPDwgMTYpIHwgMCk7Ci0JZm9yIChpPTE7IGk8ODsgaSsrKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkJICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfSE9SSVooaSksIDEpOwotICAgICAgICAJT1VUX1JJTkdfQ0FDSEUoMCk7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwKLQkJICAgICAgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NMSVBfVkVSVChpKSwgMSk7Ci0JICAgICAgICBPVVRfUklOR19DQUNIRSgwKTsKLQl9Ci0KLQljdHgtPkRyaXZlci5TY2lzc29yKGN0eCwgY3R4LT5TY2lzc29yLlgsIGN0eC0+U2Npc3Nvci5ZLAotCSAgICAgIAkJICAgIGN0eC0+U2Npc3Nvci5XaWR0aCwgY3R4LT5TY2lzc29yLkhlaWdodCk7Ci0KLQkvKiBUT0RPOiByZWNhbGMgdmlld3BvcnQgc2NhbGUgY29lZnMgKi8KLX0KLQotLyogSW5pdGlhbGlzZSBhbnkgY2FyZC1zcGVjaWZpYyBub24tR0wgcmVsYXRlZCBzdGF0ZSAqLwotc3RhdGljIEdMYm9vbGVhbiBudjIwSW5pdENhcmQobm91dmVhdUNvbnRleHRQdHIgbm1lc2EpCi17Ci0Jbm91dmVhdU9iamVjdE9uU3ViY2hhbm5lbChubWVzYSwgTnZTdWIzRCwgTnYzRCk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1NFVF9PQkpFQ1QxLCAyKTsKLQlPVVRfUklORyhOdkRtYUZCKTsJLyogMTg0IGRtYV9vYmplY3QxICovCi0JT1VUX1JJTkcoTnZEbWFGQik7CS8qIDE4OCBkbWFfb2JqZWN0MiAqLwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDMsIDIpOwotCU9VVF9SSU5HKE52RG1hRkIpOwkvKiAxOTQgZG1hX29iamVjdDMgKi8KLQlPVVRfUklORyhOdkRtYUZCKTsJLyogMTk4IGRtYV9vYmplY3Q0ICovCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUOCwgMSk7Ci0JT1VUX1JJTkcoTnZEbWFGQik7CS8qIDFhOCBkbWFfb2JqZWN0OCAqLwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTdlMCwgMyk7Ci0JT1VUX1JJTkdmKDAuMCk7Ci0JT1VUX1JJTkdmKDAuMCk7Ci0JT1VUX1JJTkdmKDEuMCk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZTZjLCAxKTsKLQlPVVRfUklORygweDBkYjYpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDAyOTAsIDEpOwotCU9VVF9SSU5HKDB4MDAxMDAwMDEpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDA5ZmMsIDEpOwotCU9VVF9SSU5HKDApOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFkODAsIDEpOwotCU9VVF9SSU5HKDEpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDA5ZjgsIDEpOwotCU9VVF9SSU5HKDQpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTdlYywgMyk7Ci0JT1VUX1JJTkdmKDAuMCk7Ci0JT1VUX1JJTkdmKDEuMCk7Ci0JT1VUX1JJTkdmKDAuMCk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZDg4LCAxKTsKLQlPVVRfUklORygzKTsKLQotCS8qIEZJWE1FOiBNb3JlIGRtYSBvYmplY3RzIHRvIHNldHVwID8gKi8KLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFlOTgsIDEpOwotCU9VVF9SSU5HKDApOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTIwLCAzKTsKLQlPVVRfUklORygwKTsKLQlPVVRfUklORygxKTsKLQlPVVRfUklORygyKTsKLQotCXJldHVybiBHTF9UUlVFOwotfQotCi0vKiBVcGRhdGUgYnVmZmVyIG9mZnNldC9waXRjaC9mb3JtYXQgKi8KLXN0YXRpYyBHTGJvb2xlYW4gbnYyMEJpbmRCdWZmZXJzKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCBpbnQgbnVtX2NvbG9yLAotCQkJCSBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqKmNvbG9yLAotCQkJCSBub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqZGVwdGgpCi17Ci0JR0x1aW50IHgsIHksIHcsIGg7Ci0JR0x1aW50IHBpdGNoLCBmb3JtYXQsIGRlcHRoX3BpdGNoOwotCi0JdyA9IGNvbG9yWzBdLT5tZXNhLldpZHRoOwotCWggPSBjb2xvclswXS0+bWVzYS5IZWlnaHQ7Ci0JeCA9IG5tZXNhLT5kcmF3WDsKLQl5ID0gbm1lc2EtPmRyYXdZOwotCi0JaWYgKG51bV9jb2xvciAhPSAxKQotCQlyZXR1cm4gR0xfRkFMU0U7Ci0KLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfSE9SSVosIDYpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgodyA8PCAxNikgfCB4KTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKGggPDwgMTYpIHwgeSk7Ci0JZGVwdGhfcGl0Y2ggPSAoZGVwdGggPyBkZXB0aC0+cGl0Y2ggOiBjb2xvclswXS0+cGl0Y2gpOwotCXBpdGNoID0gKGRlcHRoX3BpdGNoPDwxNikgfCBjb2xvclswXS0+cGl0Y2g7Ci0JZm9ybWF0ID0gMHgxMjg7Ci0JaWYgKGNvbG9yWzBdLT5tZXNhLl9BY3R1YWxGb3JtYXQgIT0gR0xfUkdCQTgpIHsKLQkJZm9ybWF0ID0gMHgxMjM7IC8qIFI1RzZCNSBjb2xvciBidWZmZXIgKi8KLQl9Ci0JT1VUX1JJTkdfQ0FDSEUoZm9ybWF0KTsKLQlPVVRfUklOR19DQUNIRShwaXRjaCk7Ci0JT1VUX1JJTkdfQ0FDSEUoY29sb3JbMF0tPm9mZnNldCk7Ci0JT1VUX1JJTkdfQ0FDSEUoZGVwdGggPyBkZXB0aC0+b2Zmc2V0IDogY29sb3JbMF0tPm9mZnNldCk7Ci0KLQlpZiAoZGVwdGgpIHsKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9MTUFfREVQVEhfQlVGRkVSX1BJVENILCAyKTsKLQkJLyogVE9ETzogdXNlIGEgZGlmZmVyZW50IGJ1ZmZlciAqLwotCQlPVVRfUklORyhkZXB0aC0+cGl0Y2gpOwotCQlPVVRfUklORyhkZXB0aC0+b2Zmc2V0KTsKLQl9Ci0KLQkvKiBBbHdheXMgc2V0IHRvIGJvdHRvbSBsZWZ0IG9mIGJ1ZmZlciAqLwotCS8qQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjIwX1RDTF9QUklNSVRJVkVfM0RfVklFV1BPUlRfT1JJR0lOX1gsIDQpOwotCU9VVF9SSU5HX0NBQ0hFZiAoMC4wKTsKLQlPVVRfUklOR19DQUNIRWYgKChHTGZsb2F0KSBoKTsKLQlPVVRfUklOR19DQUNIRWYgKDAuMCk7Ci0JT1VUX1JJTkdfQ0FDSEVmICgwLjApOyovCi0KLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotdm9pZCBudjIwSW5pdFN0YXRlRnVuY3MoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuYykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JZnVuYy0+QWxwaGFGdW5jCQkJPSBudjIwQWxwaGFGdW5jOwotCWZ1bmMtPkJsZW5kQ29sb3IJCT0gbnYyMEJsZW5kQ29sb3I7Ci0JZnVuYy0+QmxlbmRFcXVhdGlvblNlcGFyYXRlCT0gbnYyMEJsZW5kRXF1YXRpb25TZXBhcmF0ZTsKLQlmdW5jLT5CbGVuZEZ1bmNTZXBhcmF0ZQkJPSBudjIwQmxlbmRGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+Q2xlYXIJCQk9IG52MjBDbGVhcjsKLQlmdW5jLT5DbGVhckNvbG9yCQk9IG52MjBDbGVhckNvbG9yOwotCWZ1bmMtPkNsZWFyRGVwdGgJCT0gbnYyMENsZWFyRGVwdGg7Ci0JZnVuYy0+Q2xlYXJTdGVuY2lsCQk9IG52MjBDbGVhclN0ZW5jaWw7Ci0JZnVuYy0+Q2xpcFBsYW5lCQkJPSBudjIwQ2xpcFBsYW5lOwotCWZ1bmMtPkNvbG9yTWFzawkJCT0gbnYyMENvbG9yTWFzazsKLQlmdW5jLT5Db2xvck1hdGVyaWFsCQk9IG52MjBDb2xvck1hdGVyaWFsOwotCWZ1bmMtPkN1bGxGYWNlCQkJPSBudjIwQ3VsbEZhY2U7Ci0JZnVuYy0+RnJvbnRGYWNlCQkJPSBudjIwRnJvbnRGYWNlOwotCWZ1bmMtPkRlcHRoRnVuYwkJCT0gbnYyMERlcHRoRnVuYzsKLQlmdW5jLT5EZXB0aE1hc2sJCQk9IG52MjBEZXB0aE1hc2s7Ci0JZnVuYy0+RGVwdGhSYW5nZQkJPSBudjIwRGVwdGhSYW5nZTsKLQlmdW5jLT5FbmFibGUJCQk9IG52MjBFbmFibGU7Ci0JZnVuYy0+Rm9nZnYJCQk9IG52MjBGb2dmdjsKLQlmdW5jLT5IaW50CQkJPSBudjIwSGludDsKLQlmdW5jLT5MaWdodGZ2CQkJPSBudjIwTGlnaHRmdjsKLS8qCWZ1bmMtPkxpZ2h0TW9kZWxmdgkJPSBudjIwTGlnaHRNb2RlbGZ2OyAqLwotCWZ1bmMtPkxpbmVTdGlwcGxlCQk9IG52MjBMaW5lU3RpcHBsZTsKLQlmdW5jLT5MaW5lV2lkdGgJCQk9IG52MjBMaW5lV2lkdGg7Ci0JZnVuYy0+TG9naWNPcGNvZGUJCT0gbnYyMExvZ2ljT3Bjb2RlOwotCWZ1bmMtPlBvaW50UGFyYW1ldGVyZnYJCT0gbnYyMFBvaW50UGFyYW1ldGVyZnY7Ci0JZnVuYy0+UG9pbnRTaXplCQkJPSBudjIwUG9pbnRTaXplOwotCWZ1bmMtPlBvbHlnb25Nb2RlCQk9IG52MjBQb2x5Z29uTW9kZTsKLQlmdW5jLT5Qb2x5Z29uT2Zmc2V0CQk9IG52MjBQb2x5Z29uT2Zmc2V0OwotCWZ1bmMtPlBvbHlnb25TdGlwcGxlCQk9IG52MjBQb2x5Z29uU3RpcHBsZTsKLS8qCWZ1bmMtPlJlYWRCdWZmZXIJCT0gbnYyMFJlYWRCdWZmZXI7Ki8KLS8qCWZ1bmMtPlJlbmRlck1vZGUJCT0gbnYyMFJlbmRlck1vZGU7Ki8KLQlmdW5jLT5TY2lzc29yCQkJPSBudjIwU2Npc3NvcjsKLQlmdW5jLT5TaGFkZU1vZGVsCQk9IG52MjBTaGFkZU1vZGVsOwotCWZ1bmMtPlN0ZW5jaWxGdW5jU2VwYXJhdGUJPSBudjIwU3RlbmNpbEZ1bmNTZXBhcmF0ZTsKLQlmdW5jLT5TdGVuY2lsTWFza1NlcGFyYXRlCT0gbnYyMFN0ZW5jaWxNYXNrU2VwYXJhdGU7Ci0JZnVuYy0+U3RlbmNpbE9wU2VwYXJhdGUJCT0gbnYyMFN0ZW5jaWxPcFNlcGFyYXRlOwotLyoJZnVuYy0+VGV4R2VuCQkJPSBudjIwVGV4R2VuOyovCi0vKglmdW5jLT5UZXhQYXJhbWV0ZXIJCT0gbnYyMFRleFBhcmFtZXRlcjsqLwotCWZ1bmMtPlRleHR1cmVNYXRyaXgJCT0gbnYyMFRleHR1cmVNYXRyaXg7Ci0KLQlubWVzYS0+aHdfZnVuYy5Jbml0Q2FyZAkJPSBudjIwSW5pdENhcmQ7Ci0Jbm1lc2EtPmh3X2Z1bmMuQmluZEJ1ZmZlcnMJPSBudjIwQmluZEJ1ZmZlcnM7Ci0Jbm1lc2EtPmh3X2Z1bmMuV2luZG93TW92ZWQJPSBudjIwV2luZG93TW92ZWQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYyMF92ZXJ0cHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3ZlcnRwcm9nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2ZjZDcuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjIwX3ZlcnRwcm9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotI2luY2x1ZGUgIm5vdXZlYXVfY29udGV4dC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfb2JqZWN0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9maWZvLmgiCi0jaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKLQotI2luY2x1ZGUgIm5vdXZlYXVfc2hhZGVyLmgiCi0jaW5jbHVkZSAibnYyMF9zaGFkZXIuaCIKLQotdW5zaWduZWQgaW50IE5WVlBfVFhfVk9QX0NPVU5UID0gMTY7Ci11bnNpZ25lZCBpbnQgTlZWUF9UWF9OVlNfT1BfQ09VTlQgPSAxNjsKLXN0cnVjdCBfb3BfeGxhdCBOVlZQX1RYX1ZPUFszMl07Ci1zdHJ1Y3QgX29wX3hsYXQgTlZWUF9UWF9TT1BbMzJdOwotCi1udnNTd3pDb21wIE5WMjBWUF9UWF9TV0laWkxFWzRdID0geyBOVlNfU1daX1gsIE5WU19TV1pfWSwgTlZTX1NXWl9aLCBOVlNfU1daX1cgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdXBwb3J0IHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB2b2lkCi1OVjIwVlBVcGxvYWRUb0hXKEdMY29udGV4dCAqY3R4LCBub3V2ZWF1U2hhZGVyICpudnMpCi17Ci0gICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgaW50IGk7Ci0KLSAgIC8qIFhYWDogbWlzc2luZyBhIHdheSB0byBzYXkgd2hhdCBpbnNuIHdlJ3JlIHVwbG9hZGluZyBmcm9tLCBhbmQgcG9zc2libGUKLSAgICAqICAgICAgdGhlIHByb2dyYW0gc3RhcnQgcG9zaXRpb24gKGlmIE5WMjAgaGFzIG9uZSkgKi8KLSAgIGZvciAoaT0wOyBpPG52cy0+cHJvZ3JhbV9zaXplOyBpKz00KSB7Ci0gICAgICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYyMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9JTlNUMCwgNCk7Ci0gICAgICBPVVRfUklORyhudnMtPnByb2dyYW1baSArIDBdKTsKLSAgICAgIE9VVF9SSU5HKG52cy0+cHJvZ3JhbVtpICsgMV0pOwotICAgICAgT1VUX1JJTkcobnZzLT5wcm9ncmFtW2kgKyAyXSk7Ci0gICAgICBPVVRfUklORyhudnMtPnByb2dyYW1baSArIDNdKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU5WMjBWUFVwZGF0ZUNvbnN0KEdMY29udGV4dCAqY3R4LCBub3V2ZWF1U2hhZGVyICpudnMsIGludCBpZCkKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLSAgIC8qIFdvcnRoIGNoZWNraW5nIGlmIHRoZSB2YWx1ZSAqYWN0dWFsbHkqIGNoYW5nZWQ/IE1lc2EgZG9lc24ndCB0ZWxsIHVzIHRoaXMKLSAgICAqIGFzIGZhciBhcyBJIGtub3cuLgotICAgICovCi0gICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9JRCwgMSk7Ci0gICBPVVRfUklORyAoaWQpOwotICAgQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMjBfVENMX1BSSU1JVElWRV8zRF9WUF9VUExPQURfQ09OU1RfWCwgNCk7Ci0gICBPVVRfUklOR2YobnZzLT5wYXJhbXNbaWRdLnNvdXJjZV92YWxbMF0pOwotICAgT1VUX1JJTkdmKG52cy0+cGFyYW1zW2lkXS5zb3VyY2VfdmFsWzFdKTsKLSAgIE9VVF9SSU5HZihudnMtPnBhcmFtc1tpZF0uc291cmNlX3ZhbFsyXSk7Ci0gICBPVVRfUklOR2YobnZzLT5wYXJhbXNbaWRdLnNvdXJjZV92YWxbM10pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFzc2VtYmx5IHJvdXRpbmVzCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEaXNhc3NlbWJseSByb3V0aW5lcwotICovCi12b2lkCi1OVjIwVlBUWFN3aXp6bGUoaW50IGh3c3d6LCBudnNTd3pDb21wICpzd3opCi17Ci0gICBzd3pbTlZTX1NXWl9YXSA9IE5WMjBWUF9UWF9TV0laWkxFWyhod3N3eiAmIDB4QzApID4+IDZdOwotICAgc3d6W05WU19TV1pfWV0gPSBOVjIwVlBfVFhfU1dJWlpMRVsoaHdzd3ogJiAweDMwKSA+PiA0XTsKLSAgIHN3eltOVlNfU1daX1pdID0gTlYyMFZQX1RYX1NXSVpaTEVbKGh3c3d6ICYgMHgwQykgPj4gMl07Ci0gICBzd3pbTlZTX1NXWl9XXSA9IE5WMjBWUF9UWF9TV0laWkxFWyhod3N3eiAmIDB4MDMpID4+IDBdOwotfQotCi1zdGF0aWMgaW50Ci1OVjIwVlBIYXNNZXJnZWRJbnN0KG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBpZiAoc2hhZGVyLT5HZXRPcGNvZGVIVyhzaGFkZXIsIDApICE9IE5WMjBfVlBfSU5TVF9PUENPREVfTk9QICYmCi0gICAgICAgc2hhZGVyLT5HZXRPcGNvZGVIVyhzaGFkZXIsIDEpICE9IE5WMjBfVlBfSU5TVF9PUENPREVfTk9QKQotICAgICAgcHJpbnRmCi0JICgiXG5cbioqKioqYm90aCBvcGNvZGUgZmllbGRzIGhhdmUgdmFsdWVzIC0gUExFQVNFIFJFUE9SVCoqKioqXG4iKTsKLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1OVjIwVlBJc0xhc3RJbnN0KG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbM10gJiAoMSA8PCAwKSkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMjBWUEdldE9mZnNldE5leHQobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIHJldHVybiA0OwotfQotCi1zdGF0aWMgc3RydWN0IF9vcF94bGF0ICoKLU5WMjBWUEdldE9QVFhSZWMobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCkKLXsKLSAgIHN0cnVjdCBfb3BfeGxhdCAqb3ByOwotICAgaW50IG9wOwotCi0gICBpZiAoc2hhZGVyLT5HZXRPcGNvZGVTbG90KHNoYWRlciwgbWVyZ2VkKSkgewotICAgICAgb3ByID0gTlZWUF9UWF9TT1A7Ci0gICAgICBvcCA9IHNoYWRlci0+R2V0T3Bjb2RlSFcoc2hhZGVyLCAxKTsKLSAgICAgIGlmIChvcCA+PSBOVlZQX1RYX05WU19PUF9DT1VOVCkKLQkgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIG9wciA9IE5WVlBfVFhfVk9QOwotICAgICAgb3AgPSBzaGFkZXItPkdldE9wY29kZUhXKHNoYWRlciwgMCk7Ci0gICAgICBpZiAob3AgPj0gTlZWUF9UWF9WT1BfQ09VTlQpCi0JIHJldHVybiBOVUxMOwotICAgfQotCi0gICBpZiAob3ByW29wXS5TT1AgPT0gTlZTX09QX1VOS05PV04pCi0gICAgICByZXR1cm4gTlVMTDsKLSAgIHJldHVybiAmb3ByW29wXTsKLX0KLQotc3RhdGljIHN0cnVjdCBfb3BfeGxhdCAqCi1OVjIwVlBHZXRPUFRYRnJvbVNPUChudnNPcGNvZGUgc29wLCBpbnQgKmlkKQotewotICAgaW50IGk7Ci0KLSAgIGZvciAoaT0wO2k8TlZWUF9UWF9WT1BfQ09VTlQ7aSsrKSB7Ci0gICAgICBpZiAoTlZWUF9UWF9WT1BbaV0uU09QID09IHNvcCkgewotCSBpZiAoaWQpICppZCA9IDA7Ci0JIHJldHVybiAmTlZWUF9UWF9WT1BbaV07Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGZvciAoaT0wO2k8TlZWUF9UWF9OVlNfT1BfQ09VTlQ7aSsrKSB7Ci0gICAgICBpZiAoTlZWUF9UWF9TT1BbaV0uU09QID09IHNvcCkgewotCSBpZiAoaWQpICppZCA9IDE7Ci0JIHJldHVybiAmTlZWUF9UWF9TT1BbaV07Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci1OVjIwVlBHZXRPcGNvZGVTbG90KG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBpZiAoc2hhZGVyLT5IYXNNZXJnZWRJbnN0KHNoYWRlcikpCi0gICAgICByZXR1cm4gbWVyZ2VkOwotICAgaWYgKHNoYWRlci0+R2V0T3Bjb2RlSFcoc2hhZGVyLCAwKSA9PSBOVjIwX1ZQX0lOU1RfT1BDT0RFX05PUCkKLSAgICAgIHJldHVybiAxOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBudnNPcGNvZGUKLU5WMjBWUEdldE9wY29kZShudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkKQotewotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0KLSAgIG9wciA9IHNoYWRlci0+R2V0T1BUWFJlYyhzaGFkZXIsIG1lcmdlZCk7Ci0gICBpZiAoIW9wcikKLSAgICAgIHJldHVybiBOVlNfT1BfVU5LTk9XTjsKLQotICAgcmV0dXJuIG9wci0+U09QOwotfQotCi1zdGF0aWMgbnZzT3Bjb2RlCi1OVjIwVlBHZXRPcGNvZGVIVyhudnNGdW5jICogc2hhZGVyLCBpbnQgc2xvdCkKLXsKLSAgIGlmIChzbG90KQotICAgICAgcmV0dXJuIChzaGFkZXItPmluc3RbMV0gJiBOVjIwX1ZQX0lOU1RfU0NBX09QQ09ERV9NQVNLKQotCSA+PiBOVjIwX1ZQX0lOU1RfU0NBX09QQ09ERV9TSElGVDsKLSAgIHJldHVybiAoc2hhZGVyLT5pbnN0WzFdICYgTlYyMF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSykKLSAgICAgID4+IE5WMjBfVlBfSU5TVF9WRUNfT1BDT0RFX1NISUZUOwotfQotCi1zdGF0aWMgbnZzUmVnRmlsZQotTlYyMFZQR2V0RGVzdEZpbGUobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCkKLXsKLSAgIHN3aXRjaCAoc2hhZGVyLT5HZXRPcGNvZGUoc2hhZGVyLCBtZXJnZWQpKSB7Ci0gICBjYXNlIE5WU19PUF9BUkw6Ci0gICAgICByZXR1cm4gTlZTX0ZJTEVfQUREUkVTUzsKLSAgIGRlZmF1bHQ6Ci0gICAgICAvKkZJWE1FOiBUaGlzIHByb2JhYmx5IGlzbid0IGNvcnJlY3QuLiAqLwotICAgICAgaWYgKChzaGFkZXItPmluc3RbM10gJiBOVjIwX1ZQX0lOU1RfREVTVF9XUklURU1BU0tfTUFTSykgPT0gMCkKLQkgcmV0dXJuIE5WU19GSUxFX1RFTVA7Ci0gICAgICByZXR1cm4gTlZTX0ZJTEVfUkVTVUxUOwotICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjIwVlBHZXREZXN0SUQobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCkKLXsKLSAgIGludCBpZDsKLQotICAgc3dpdGNoIChzaGFkZXItPkdldERlc3RGaWxlKHNoYWRlciwgbWVyZ2VkKSkgewotICAgY2FzZSBOVlNfRklMRV9SRVNVTFQ6Ci0gICAgICBpZCA9ICgoc2hhZGVyLT5pbnN0WzNdICYgTlYyMF9WUF9JTlNUX0RFU1RfTUFTSykKLQkgICAgPj4gTlYyMF9WUF9JTlNUX0RFU1RfU0hJRlQpOwotICAgICAgc3dpdGNoIChpZCkgewotICAgICAgY2FzZSBOVjIwX1ZQX0lOU1RfREVTVF9QT1MgIDogcmV0dXJuIE5WU19GUl9QT1NJVElPTjsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0RFU1RfQ09MMCA6IHJldHVybiBOVlNfRlJfQ09MMDsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0RFU1RfQ09MMSA6IHJldHVybiBOVlNfRlJfQ09MMTsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0RFU1RfVEMoMCk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQwOwotICAgICAgY2FzZSBOVjIwX1ZQX0lOU1RfREVTVF9UQygxKTogcmV0dXJuIE5WU19GUl9URVhDT09SRDE7Ci0gICAgICBjYXNlIE5WMjBfVlBfSU5TVF9ERVNUX1RDKDIpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMjsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0RFU1RfVEMoMyk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQzOwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIC0xOwotICAgICAgfQotICAgY2FzZSBOVlNfRklMRV9BRERSRVNTOgotICAgICAgcmV0dXJuIDA7Ci0gICBjYXNlIE5WU19GSUxFX1RFTVA6Ci0gICAgICBpZCA9ICgoc2hhZGVyLT5pbnN0WzNdICYgTlYyMF9WUF9JTlNUX0RFU1RfVEVNUF9JRF9NQVNLKQotCSAgICA+PiBOVjIwX1ZQX0lOU1RfREVTVF9URU1QX0lEX1NISUZUKTsKLSAgICAgIHJldHVybiBpZDsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLU5WMjBWUEdldERlc3RNYXNrKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBpbnQgaHdtYXNrLCBtYXNrID0gMDsKLQotICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgQVJMIC0gaGFyZHdhcmUgb25seSBzdXBwb3J0cyBhCi0gICAgKiAxLWNvbXBvbmVudCBhZGRyZXNzIHJlZwotICAgICovCi0gICBpZiAoc2hhZGVyLT5HZXRPcGNvZGUoc2hhZGVyLCBtZXJnZWQpID09IE5WU19PUF9BUkwpCi0gICAgICByZXR1cm4gU01BU0tfWDsKLQotICAgaWYgKHNoYWRlci0+R2V0RGVzdEZpbGUoc2hhZGVyLCBtZXJnZWQpID09IE5WU19GSUxFX1JFU1VMVCkKLSAgICAgIGh3bWFzayA9IChzaGFkZXItPmluc3RbM10gJiBOVjIwX1ZQX0lOU1RfREVTVF9XUklURU1BU0tfTUFTSykKLQkgPj4gTlYyMF9WUF9JTlNUX0RFU1RfV1JJVEVNQVNLX1NISUZUOwotICAgZWxzZSBpZiAoc2hhZGVyLT5HZXRPcGNvZGVTbG90KHNoYWRlciwgbWVyZ2VkKSkKLSAgICAgIGh3bWFzayA9IChzaGFkZXItPmluc3RbM10gJiBOVjIwX1ZQX0lOU1RfU1RFTVBfV1JJVEVNQVNLX01BU0spCi0JID4+IE5WMjBfVlBfSU5TVF9TVEVNUF9XUklURU1BU0tfU0hJRlQ7Ci0gICBlbHNlCi0gICAgICBod21hc2sgPSAoc2hhZGVyLT5pbnN0WzNdICYgTlYyMF9WUF9JTlNUX1ZURU1QX1dSSVRFTUFTS19NQVNLKQotCSA+PiBOVjIwX1ZQX0lOU1RfVlRFTVBfV1JJVEVNQVNLX1NISUZUOwotCi0gICBpZiAoaHdtYXNrICYgKDEgPDwgMykpIG1hc2sgfD0gU01BU0tfWDsKLSAgIGlmIChod21hc2sgJiAoMSA8PCAyKSkgbWFzayB8PSBTTUFTS19ZOwotICAgaWYgKGh3bWFzayAmICgxIDw8IDEpKSBtYXNrIHw9IFNNQVNLX1o7Ci0gICBpZiAoaHdtYXNrICYgKDEgPDwgMCkpIG1hc2sgfD0gU01BU0tfVzsKLQotICAgcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLU5WMjBWUEdldFNvdXJjZUhXKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICBzdHJ1Y3QgX29wX3hsYXQgKm9wcjsKLSAgIHVuc2lnbmVkIGludCBzcmM7Ci0KLSAgIG9wciA9IHNoYWRlci0+R2V0T1BUWFJlYyhzaGFkZXIsIG1lcmdlZCk7Ci0gICBpZiAoIW9wcikKLSAgICAgIHJldHVybiAtMTsKLQotICAgc3dpdGNoIChvcHItPnNyY3Bvc1twb3NdKSB7Ci0gICBjYXNlIDA6Ci0gICAgICBzcmMgPSAoKHNoYWRlci0+aW5zdFsxXSAmIE5WMjBfVlBfSU5TVF9TUkMwSF9NQVNLKQotCSAgICAgPj4gTlYyMF9WUF9JTlNUX1NSQzBIX1NISUZUKQotCSA8PCBOVjIwX1ZQX1NSQzBfSElHSF9TSElGVDsKLSAgICAgIHNyYyB8PSAoKHNoYWRlci0+aW5zdFsyXSAmIE5WMjBfVlBfSU5TVF9TUkMwTF9NQVNLKQotCSAgICAgID4+IE5WMjBfVlBfSU5TVF9TUkMwTF9TSElGVCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMToKLSAgICAgIHNyYyA9ICgoc2hhZGVyLT5pbnN0WzJdICYgTlYyMF9WUF9JTlNUX1NSQzFfTUFTSykKLQkgICAgID4+IE5WMjBfVlBfSU5TVF9TUkMxX1NISUZUKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAyOgotICAgICAgc3JjID0gKChzaGFkZXItPmluc3RbMl0gJiBOVjIwX1ZQX0lOU1RfU1JDMkhfTUFTSykKLQkgICAgID4+IE5WMjBfVlBfSU5TVF9TUkMySF9TSElGVCkKLQkgPDwgTlYyMF9WUF9TUkMyX0hJR0hfU0hJRlQ7Ci0gICAgICBzcmMgfD0gKChzaGFkZXItPmluc3RbM10gJiBOVjIwX1ZQX0lOU1RfU1JDMkxfTUFTSykKLQkgICAgICA+PiBOVjIwX1ZQX0lOU1RfU1JDMkxfU0hJRlQpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgc3JjID0gLTE7Ci0gICB9Ci0KLSAgIHJldHVybiBzcmM7Ci19Ci0KLXN0YXRpYyBudnNSZWdGaWxlCi1OVjIwVlBHZXRTb3VyY2VGaWxlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICB1bnNpZ25lZCBpbnQgc3JjOwotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0gICBpbnQgZmlsZTsKLQotICAgb3ByID0gc2hhZGVyLT5HZXRPUFRYUmVjKHNoYWRlciwgbWVyZ2VkKTsKLSAgIGlmICghb3ByIHx8IG9wci0+c3JjcG9zW3Bvc10gPT0gLTEpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgIHN3aXRjaCAob3ByLT5zcmNwb3NbcG9zXSkgewotICAgY2FzZSBTUE9TX0FERFJFU1M6Ci0gICAgICByZXR1cm4gTlZTX0ZJTEVfQUREUkVTUzsKLSAgIGRlZmF1bHQ6Ci0gICAgICBzcmMgPSBOVjIwVlBHZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLSAgICAgIGZpbGUgPSAoc3JjICYgTlYyMF9WUF9TUkNfUkVHX1RZUEVfTUFTSykgPj4gTlYyMF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQ7Ci0KLSAgICAgIHN3aXRjaCAoZmlsZSkgewotICAgICAgY2FzZSBOVjIwX1ZQX1NSQ19SRUdfVFlQRV9URU1QIDogcmV0dXJuIE5WU19GSUxFX1RFTVA7Ci0gICAgICBjYXNlIE5WMjBfVlBfU1JDX1JFR19UWVBFX0lOUFVUOiByZXR1cm4gTlZTX0ZJTEVfQVRUUklCOwotICAgICAgY2FzZSBOVjIwX1ZQX1NSQ19SRUdfVFlQRV9DT05TVDogcmV0dXJuIE5WU19GSUxFX0NPTlNUOwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIE5WU19GSUxFX1VOS05PV047Ci0gICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMjBWUEdldFNvdXJjZUlEKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICB1bnNpZ25lZCBpbnQgc3JjOwotCi0gICBzd2l0Y2ggKHNoYWRlci0+R2V0U291cmNlRmlsZShzaGFkZXIsIG1lcmdlZCwgcG9zKSkgewotICAgY2FzZSBOVlNfRklMRV9URU1QOgotICAgICAgc3JjID0gc2hhZGVyLT5HZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLSAgICAgIHJldHVybiAoKHNyYyAmIE5WMjBfVlBfU1JDX1JFR19URU1QX0lEX01BU0spID4+Ci0JICAgICAgTlYyMF9WUF9TUkNfUkVHX1RFTVBfSURfU0hJRlQpOwotICAgY2FzZSBOVlNfRklMRV9DT05TVDoKLSAgICAgIHJldHVybiAoKHNoYWRlci0+aW5zdFsxXSAmIE5WMjBfVlBfSU5TVF9DT05TVF9TUkNfTUFTSykKLQkgICAgICA+PiBOVjIwX1ZQX0lOU1RfQ09OU1RfU1JDX1NISUZUKTsKLSAgIGNhc2UgTlZTX0ZJTEVfQVRUUklCOgotICAgICAgc3JjID0gKChzaGFkZXItPmluc3RbMV0gJiBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX01BU0spCi0JICAgICA+PiBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX1NISUZUKTsKLSAgICAgIHN3aXRjaCAoc3JjKSB7Ci0gICAgICBjYXNlIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfUE9TICA6IHJldHVybiBOVlNfRlJfUE9TSVRJT047Ci0gICAgICBjYXNlIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfQ09MMCA6IHJldHVybiBOVlNfRlJfQ09MMDsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0lOUFVUX1NSQ19DT0wxIDogcmV0dXJuIE5WU19GUl9DT0wxOwotICAgICAgY2FzZSBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX1RDKDApOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMDsKLSAgICAgIGNhc2UgTlYyMF9WUF9JTlNUX0lOUFVUX1NSQ19UQygxKTogcmV0dXJuIE5WU19GUl9URVhDT09SRDE7Ci0gICAgICBjYXNlIE5WMjBfVlBfSU5TVF9JTlBVVF9TUkNfVEMoMik6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQyOwotICAgICAgY2FzZSBOVjIwX1ZQX0lOU1RfSU5QVVRfU1JDX1RDKDMpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMzsKLSAgICAgIGRlZmF1bHQ6Ci0JIHJldHVybiBOVlNfRlJfVU5LTk9XTjsKLSAgICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMjBWUEdldFNvdXJjZU5lZ2F0ZShudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgdW5zaWduZWQgaW50IHNyYzsKLQotICAgc3JjID0gc2hhZGVyLT5HZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLQotICAgcmV0dXJuICgoc3JjICYgTlYyMF9WUF9TUkNfUkVHX05FR0FURSkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMjBWUEdldFNvdXJjZUFicyhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgLyogTlYyMCBjYW4ndCBkbyBBQlMgb24gc291cmNlcz8gIEFwcGVhcnMgdG8gYmUgZW11bGF0ZWQgd2l0aAotICAgICogICAgICBNQVggcmVnLCByZWcsIC1yZWcKLSAgICAqLwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjIwVlBHZXRTb3VyY2VTd2l6emxlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MsIG52c1N3ekNvbXAgKnN3eikKLXsKLSAgIHVuc2lnbmVkIGludCBzcmM7Ci0gICBpbnQgc3d6Yml0czsKLQotICAgc3JjID0gc2hhZGVyLT5HZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLSAgIHN3emJpdHMgID0KLSAgICAgIChzcmMgJiBOVjIwX1ZQX1NSQ19SRUdfU1daX0FMTF9NQVNLKSA+PiBOVjIwX1ZQX1NSQ19SRUdfU1daX0FMTF9TSElGVDsKLSAgIHJldHVybiBOVjIwVlBUWFN3aXp6bGUoc3d6Yml0cywgc3d6KTsKLX0KLQotc3RhdGljIGludAotTlYyMFZQR2V0U291cmNlSW5kZXhlZChudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgLyogSSBkb24ndCB0aGluayBOVjIwIGNhbiBpbmRleCBpbnRvIGF0dHJpYnMsIGF0IGxlYXN0IG5vIEdMCi0gICAgKiBleHRlbnNpb24gaXMgZXhwb3NlZCB0aGF0IHdpbGwgYWxsb3cgaXQuCi0gICAgKi8KLSAgIGlmIChzaGFkZXItPkdldFNvdXJjZUZpbGUoc2hhZGVyLCBtZXJnZWQsIHBvcykgIT0gTlZTX0ZJTEVfQ09OU1QpCi0gICAgICByZXR1cm4gMDsKLSAgIGlmIChzaGFkZXItPmluc3RbM10gJiBOVjIwX1ZQX0lOU1RfSU5ERVhfQ09OU1QpCi0gICAgICByZXR1cm4gMTsKLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1OVjIwVlBHZXRBZGRyZXNzUmVnSUQobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIC8qIE9ubHkgMSBhZGRyZXNzIHJlZyAqLwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBudnNTd3pDb21wCi1OVjIwVlBHZXRBZGRyZXNzUmVnU3dpenpsZShudnNGdW5jICogc2hhZGVyKQotewotICAgLyogT25seSBBMC54IGF2YWlsYWJsZSAqLwotICAgcmV0dXJuIE5WU19TV1pfWDsKLX0KLQotdm9pZAotTlYyMFZQSW5pdFNoYWRlckZ1bmNzKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX05PUCwgTlZTX09QX05PUCwgLTEsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX01PViwgTlZTX09QX01PViwgIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX01VTCwgTlZTX09QX01VTCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0FERCwgTlZTX09QX0FERCwgIDAsICAyLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX01BRCwgTlZTX09QX01BRCwgIDAsICAxLCAgMik7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0RQMywgTlZTX09QX0RQMywgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0RQSCwgTlZTX09QX0RQSCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0RQNCwgTlZTX09QX0RQNCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0RTVCwgTlZTX09QX0RTVCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX01JTiwgTlZTX09QX01JTiwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX01BWCwgTlZTX09QX01BWCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX1NMVCwgTlZTX09QX1NMVCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX1NHRSwgTlZTX09QX1NHRSwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjIwX1ZQX0lOU1RfT1BDT0RFX0FSTCwgTlZTX09QX0FSTCwgIDAsIC0xLCAtMSk7Ci0KLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfTk9QLCBOVlNfT1BfTk9QLCAtMSwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfUkNQLCBOVlNfT1BfUkNQLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfUkNDLCBOVlNfT1BfUkNDLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfUlNRLCBOVlNfT1BfUlNRLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfRVhQLCBOVlNfT1BfRVhQLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfTE9HLCBOVlNfT1BfTE9HLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMjBfVlBfSU5TVF9PUENPREVfTElULCBOVlNfT1BfTElULCAgMiwgLTEsIC0xKTsKLQotICAgc2hhZGVyLT5VcGxvYWRUb0hXCQk9IE5WMjBWUFVwbG9hZFRvSFc7Ci0gICBzaGFkZXItPlVwZGF0ZUNvbnN0CQk9IE5WMjBWUFVwZGF0ZUNvbnN0OwotCi0gICBzaGFkZXItPkdldE9QVFhSZWMJCT0gTlYyMFZQR2V0T1BUWFJlYzsKLSAgIHNoYWRlci0+R2V0T1BUWEZyb21TT1AJPSBOVjIwVlBHZXRPUFRYRnJvbVNPUDsKLQotICAgc2hhZGVyLT5IYXNNZXJnZWRJbnN0CT0gTlYyMFZQSGFzTWVyZ2VkSW5zdDsKLSAgIHNoYWRlci0+SXNMYXN0SW5zdAkJPSBOVjIwVlBJc0xhc3RJbnN0OwotICAgc2hhZGVyLT5HZXRPZmZzZXROZXh0CT0gTlYyMFZQR2V0T2Zmc2V0TmV4dDsKLSAgIHNoYWRlci0+R2V0T3Bjb2RlU2xvdAk9IE5WMjBWUEdldE9wY29kZVNsb3Q7Ci0gICBzaGFkZXItPkdldE9wY29kZQkJPSBOVjIwVlBHZXRPcGNvZGU7Ci0gICBzaGFkZXItPkdldE9wY29kZUhXCQk9IE5WMjBWUEdldE9wY29kZUhXOwotICAgc2hhZGVyLT5HZXREZXN0RmlsZQkJPSBOVjIwVlBHZXREZXN0RmlsZTsKLSAgIHNoYWRlci0+R2V0RGVzdElECQk9IE5WMjBWUEdldERlc3RJRDsKLSAgIHNoYWRlci0+R2V0RGVzdE1hc2sJCT0gTlYyMFZQR2V0RGVzdE1hc2s7Ci0gICBzaGFkZXItPkdldFNvdXJjZUhXCQk9IE5WMjBWUEdldFNvdXJjZUhXOwotICAgc2hhZGVyLT5HZXRTb3VyY2VGaWxlCT0gTlYyMFZQR2V0U291cmNlRmlsZTsKLSAgIHNoYWRlci0+R2V0U291cmNlSUQJCT0gTlYyMFZQR2V0U291cmNlSUQ7Ci0gICBzaGFkZXItPkdldFNvdXJjZU5lZ2F0ZQk9IE5WMjBWUEdldFNvdXJjZU5lZ2F0ZTsKLSAgIHNoYWRlci0+R2V0U291cmNlQWJzCQk9IE5WMjBWUEdldFNvdXJjZUFiczsKLSAgIHNoYWRlci0+R2V0U291cmNlU3dpenpsZQk9IE5WMjBWUEdldFNvdXJjZVN3aXp6bGU7Ci0gICBzaGFkZXItPkdldFNvdXJjZUluZGV4ZWQJPSBOVjIwVlBHZXRTb3VyY2VJbmRleGVkOwotICAgc2hhZGVyLT5HZXRSZWxBZGRyZXNzUmVnSUQJPSBOVjIwVlBHZXRBZGRyZXNzUmVnSUQ7Ci0gICBzaGFkZXItPkdldFJlbEFkZHJlc3NTd2l6emxlCT0gTlYyMFZQR2V0QWRkcmVzc1JlZ1N3aXp6bGU7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MzBfZnJhZ3Byb2cuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF9mcmFncHJvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzI0NTIzLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF9mcmFncHJvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQyICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2ZpZm8uaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCi0jaW5jbHVkZSAibm91dmVhdV9zaGFkZXIuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfbXNnLmgiCi0jaW5jbHVkZSAibm91dmVhdV9idWZmZXJvYmouaCIKLSNpbmNsdWRlICJudjMwX3NoYWRlci5oIgotCi11bnNpZ25lZCBpbnQgTlZGUF9UWF9BT1BfQ09VTlQgPSA2NDsKLXN0cnVjdCBfb3BfeGxhdCBOVkZQX1RYX0FPUFs2NF07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdXBwb3J0IHJvdXRpbmVzCi0gKi8KLQotc3RhdGljIHZvaWQKLU5WMzBGUFVwbG9hZFRvSFcoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cykKLXsKLSAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICBudnNDYXJkUHJpdiAqcHJpdiA9ICZudnMtPmNhcmRfcHJpdjsKLSAgIHVpbnQzMl90IG9mZnNldDsKLQotICAgaWYgKCFudnMtPnByb2dyYW1fYnVmZmVyKQotICAgICAgbnZzLT5wcm9ncmFtX2J1ZmZlciA9IGN0eC0+RHJpdmVyLk5ld0J1ZmZlck9iamVjdChjdHgsIDAsCi0JCQkJCQkJR0xfQVJSQVlfQlVGRkVSX0FSQik7Ci0KLSAgIC8qIFNob3VsZCB1c2UgU1RBVElDX0RSQVdfQVJCIGlmIHNoYWRlciBkb2Vzbid0IHVzZSBjaGFuZ2FibGUgcGFyYW1zICovCi0gICBub3V2ZWF1X2JvX2luaXRfc3RvcmFnZShjdHgsIE5PVVZFQVVfQk9fVlJBTV9PSywKLQkgCQkgIG52cy0+cHJvZ3JhbV9zaXplICogc2l6ZW9mKHVpbnQzMl90KSwKLQkJCSAgKGNvbnN0IEdMdm9pZCAqKW52cy0+cHJvZ3JhbSwKLQkJCSAgR0xfRFlOQU1JQ19EUkFXX0FSQiwKLQkJCSAgbnZzLT5wcm9ncmFtX2J1ZmZlcik7Ci0KLSAgIG9mZnNldCA9IG5vdXZlYXVfYm9fZ3B1X3JlZihjdHgsIG52cy0+cHJvZ3JhbV9idWZmZXIpOwotCi0gICAvKiBOb3QgdXNpbmcgc3RhdGUgY2FjaGUgaGVyZSwgdXBkYXRlZCBwcm9ncmFtcyBhdCB0aGUgc2FtZSBhZGRyZXNzIGRvbid0Ci0gICAgKiBzZWVtIHRvIHRha2UgZWZmZWN0IHVubGVzcyB0aGUgQUNUSVZFX1BST0dSQU0gbWV0aG9kIGlzIGNhbGxlZCBhZ2Fpbi4KLSAgICAqIEhXIGNhY2hlcyB0aGUgcHJvZ3JhbSBzb21ld2hlcmU/Ci0gICAgKi8KLSAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfRlBfQUNUSVZFX1BST0dSQU0sIDEpOwotICAgT1VUX1JJTkcgICAgICAgKG9mZnNldCB8IDEpOwotICAgaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGUgPT0gTlZfMzApIHsgIAotCSAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELAotCQkJICAgMHgxZDYwIC8qTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZQX0NPTlRST0wqLywgMSk7Ci0JICAgT1VUX1JJTkcgICAgICAgKChwcml2LT5OVjMwRlAudXNlc19raWwgPDwgNykpOwotCSAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDE0NTAsIDEpOwotCSAgIE9VVF9SSU5HICAgICAgIChwcml2LT5OVjMwRlAubnVtX3JlZ3MgPDwgMTYpOwotICAgfSBlbHNlIHsKLQkgICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwKLQkJCSAgIDB4MWQ2MCAvKk5WMzBfVENMX1BSSU1JVElWRV8zRF9GUF9DT05UUk9MKi8sIDEpOwotCSAgIE9VVF9SSU5HICAgICAgICgocHJpdi0+TlYzMEZQLnVzZXNfa2lsIDw8ICA3KSB8Ci0JCQkgICAocHJpdi0+TlYzMEZQLm51bV9yZWdzIDw8IDI0KSk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBVcGRhdGVDb25zdChHTGNvbnRleHQgKmN0eCwgbm91dmVhdVNoYWRlciAqbnZzLCBpbnQgaWQpCi17Ci0gICB1aW50MzJfdCAqbmV3ICAgICA9IG52cy0+cGFyYW1zW2lkXS5zb3VyY2VfdmFsID8KLSAgICAgICh1aW50MzJfdCopbnZzLT5wYXJhbXNbaWRdLnNvdXJjZV92YWwgOiAodWludDMyX3QqKW52cy0+cGFyYW1zW2lkXS52YWw7Ci0gICB1aW50MzJfdCAqY3VycmVudDsKLSAgIGludCBpOwotCi0gICBmb3IgKGk9MDsgaTxudnMtPnBhcmFtc1tpZF0uaHdfaW5kZXhfY250OyBpKyspIHsKLSAgICAgIGN1cnJlbnQgPSBudnMtPnByb2dyYW0gKyBudnMtPnBhcmFtc1tpZF0uaHdfaW5kZXhbaV07Ci0gICAgICBDT1BZXzRWKGN1cnJlbnQsIG5ldyk7Ci0gICB9Ci0gICBudnMtPm9uX2hhcmR3YXJlID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFzc2VtYmx5IGhlbHBlcnMKLSAqLwotc3RhdGljIHN0cnVjdCBfb3BfeGxhdCAqCi1OVjMwRlBHZXRPUFRYRnJvbVNPUChudnNPcGNvZGUgb3AsIGludCAqaWQpCi17Ci0gICBpbnQgaTsKLQotICAgZm9yIChpPTA7IGk8TlZGUF9UWF9BT1BfQ09VTlQ7IGkrKykgewotICAgICAgaWYgKE5WRlBfVFhfQU9QW2ldLlNPUCA9PSBvcCkgewotCSBpZiAoaWQpICppZCA9IDA7Ci0JIHJldHVybiAmTlZGUF9UWF9BT1BbaV07Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci1OVjMwRlBTdXBwb3J0c09wY29kZShudnNGdW5jICpzaGFkZXIsIG52c09wY29kZSBvcCkKLXsKLSAgIGlmIChzaGFkZXItPkdldE9QVFhGcm9tU09QKG9wLCBOVUxMKSkKLSAgICAgIHJldHVybiAxOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRPcGNvZGUobnZzRnVuYyAqc2hhZGVyLCB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBpbnQgc2xvdCkKLXsKLSAgIGlmIChvcGNvZGUgPT0gTlYzMF9GUF9PUF9PUENPREVfS0lMKQotICAgICAgc2hhZGVyLT5jYXJkX3ByaXYtPk5WMzBGUC51c2VzX2tpbCA9IEdMX1RSVUU7Ci0gICBzaGFkZXItPmluc3RbMF0gJj0gfk5WMzBfRlBfT1BfT1BDT0RFX01BU0s7Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gKG9wY29kZSA8PCBOVjMwX0ZQX09QX09QQ09ERV9TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRDQ1VwZGF0ZShudnNGdW5jICpzaGFkZXIpCi17Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gTlYzMF9GUF9PUF9DT05EX1dSSVRFX0VOQUJMRTsKLX0KLQotc3RhdGljIHZvaWQKLU5WMzBGUFNldENvbmRpdGlvbihudnNGdW5jICpzaGFkZXIsIGludCBvbiwgbnZzQ29uZCBjb25kLCBpbnQgcmVnLAotICAgICAgCQkgIG52c1N3ekNvbXAgKnN3eikKLXsKLSAgIG52c1N3ekNvbXAgZGVmYXVsdF9zd3pbNF0gPSB7IE5WU19TV1pfWCwgTlZTX1NXWl9ZLCBOVlNfU1daX1osIE5WU19TV1pfVyB9OwotICAgdW5zaWduZWQgaW50IGh3Y29uZDsKLQotICAgLyogY29uZCBtYXNraW5nIGlzIGFsd2F5cyBlbmFibGVkICovCi0gICBpZiAoIW9uKSB7Ci0gICAgICBjb25kID0gTlZTX0NPTkRfVFI7Ci0gICAgICByZWcgID0gMDsKLSAgICAgIHN3eiAgPSBkZWZhdWx0X3N3ejsKLSAgIH0KLQotICAgc3dpdGNoIChjb25kKSB7Ci0gICBjYXNlIE5WU19DT05EX1RSOiBod2NvbmQgPSBOVjMwX0ZQX09QX0NPTkRfVFI7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9GTDogaHdjb25kID0gTlYzMF9GUF9PUF9DT05EX0ZMOyBicmVhazsKLSAgIGNhc2UgTlZTX0NPTkRfTFQ6IGh3Y29uZCA9IE5WMzBfRlBfT1BfQ09ORF9MVDsgYnJlYWs7Ci0gICBjYXNlIE5WU19DT05EX0dUOiBod2NvbmQgPSBOVjMwX0ZQX09QX0NPTkRfR1Q7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9MRTogaHdjb25kID0gTlYzMF9GUF9PUF9DT05EX0xFOyBicmVhazsKLSAgIGNhc2UgTlZTX0NPTkRfR0U6IGh3Y29uZCA9IE5WMzBfRlBfT1BfQ09ORF9HRTsgYnJlYWs7Ci0gICBjYXNlIE5WU19DT05EX0VROiBod2NvbmQgPSBOVjMwX0ZQX09QX0NPTkRfRVE7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9ORTogaHdjb25kID0gTlYzMF9GUF9PUF9DT05EX05FOyBicmVhazsKLSAgIGRlZmF1bHQ6Ci0JV0FSTl9PTkNFKCJ1bmtub3duIGZwIGNvbmRtYXNrPSVkXG4iLCBjb25kKTsKLQlod2NvbmQgPSBOVjMwX0ZQX09QX0NPTkRfVFI7Ci0JYnJlYWs7Ci0gICB9Ci0KLSAgIHNoYWRlci0+aW5zdFsxXSAmPSB+TlYzMF9GUF9PUF9DT05EX01BU0s7Ci0gICBzaGFkZXItPmluc3RbMV0gfD0gKGh3Y29uZCA8PCBOVjMwX0ZQX09QX0NPTkRfU0hJRlQpOwotCi0gICBzaGFkZXItPmluc3RbMV0gJj0gfk5WMzBfRlBfT1BfQ09ORF9TV1pfQUxMX01BU0s7Ci0gICBzaGFkZXItPmluc3RbMV0gfD0gKHN3eltOVlNfU1daX1hdIDw8IE5WMzBfRlBfT1BfQ09ORF9TV1pfWF9TSElGVCk7Ci0gICBzaGFkZXItPmluc3RbMV0gfD0gKHN3eltOVlNfU1daX1ldIDw8IE5WMzBfRlBfT1BfQ09ORF9TV1pfWV9TSElGVCk7Ci0gICBzaGFkZXItPmluc3RbMV0gfD0gKHN3eltOVlNfU1daX1pdIDw8IE5WMzBfRlBfT1BfQ09ORF9TV1pfWl9TSElGVCk7Ci0gICBzaGFkZXItPmluc3RbMV0gfD0gKHN3eltOVlNfU1daX1ddIDw8IE5WMzBfRlBfT1BfQ09ORF9TV1pfV19TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRIaWdoUmVnKG52c0Z1bmMgKnNoYWRlciwgaW50IGlkKQotewotICAgaWYgKHNoYWRlci0+Y2FyZF9wcml2LT5OVjMwRlAubnVtX3JlZ3MgPCAoaWQrMSkpIHsKLSAgICAgIGlmIChpZCA9PSAwKQotCSBpZCA9IDE7IC8qIG5lY2Vzc2FyeT8gKi8KLSAgICAgIHNoYWRlci0+Y2FyZF9wcml2LT5OVjMwRlAubnVtX3JlZ3MgPSAoaWQrMSk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRSZXN1bHQobnZzRnVuYyAqc2hhZGVyLCBudnNSZWdpc3RlciAqcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywgaW50IHNsb3QpCi17Ci0gICB1bnNpZ25lZCBpbnQgaHdyZWc7Ci0KLSAgIGlmIChtYXNrICYgU01BU0tfWCkgc2hhZGVyLT5pbnN0WzBdIHw9IE5WMzBfRlBfT1BfT1VUX1g7Ci0gICBpZiAobWFzayAmIFNNQVNLX1kpIHNoYWRlci0+aW5zdFswXSB8PSBOVjMwX0ZQX09QX09VVF9ZOwotICAgaWYgKG1hc2sgJiBTTUFTS19aKSBzaGFkZXItPmluc3RbMF0gfD0gTlYzMF9GUF9PUF9PVVRfWjsKLSAgIGlmIChtYXNrICYgU01BU0tfVykgc2hhZGVyLT5pbnN0WzBdIHw9IE5WMzBfRlBfT1BfT1VUX1c7Ci0KLSAgIGlmIChyZWctPmZpbGUgPT0gTlZTX0ZJTEVfUkVTVUxUKSB7Ci0gICAgICBod3JlZyA9IDA7IC8qIEZJWE1FOiB0aGlzIGlzIG9ubHkgZnJhZ21lbnQuY29sb3IgKi8KLSAgICAgIC8qIFRoaXMgaXMgKm5vdCogY29ycmVjdCwgSSBoYXZlIG5vIGlkZWEgd2hhdCBpdCBpcyBlaXRoZXIgKi8KLSAgICAgIHNoYWRlci0+aW5zdFswXSB8PSBOVjMwX0ZQX09QX1VOSzBfNzsKLSAgIH0gZWxzZSB7Ci0gICAgICBzaGFkZXItPmluc3RbMF0gJj0gfk5WMzBfRlBfT1BfVU5LMF83OwotICAgICAgaHdyZWcgPSByZWctPmluZGV4OwotICAgfQotICAgTlYzMEZQU2V0SGlnaFJlZyhzaGFkZXIsIGh3cmVnKTsKLSAgIHNoYWRlci0+aW5zdFswXSAmPSB+TlYzMF9GUF9PUF9PVVRfUkVHX1NISUZUOwotICAgc2hhZGVyLT5pbnN0WzBdIHw9IChod3JlZyAgPDwgTlYzMF9GUF9PUF9PVVRfUkVHX1NISUZUKTsKLX0KLQotc3RhdGljIHZvaWQKLU5WMzBGUFNldFNvdXJjZShudnNGdW5jICpzaGFkZXIsIG52c1JlZ2lzdGVyICpyZWcsIGludCBwb3MpCi17Ci0gICB1bnNpZ25lZCBpbnQgaHdzcmMgPSAwOwotCi0gICBzd2l0Y2ggKHJlZy0+ZmlsZSkgewotICAgY2FzZSBOVlNfRklMRV9URU1QOgotICAgICAgaHdzcmMgfD0gKE5WMzBfRlBfUkVHX1RZUEVfVEVNUCA8PCBOVjMwX0ZQX1JFR19UWVBFX1NISUZUKTsKLSAgICAgIGh3c3JjIHw9IChyZWctPmluZGV4IDw8IE5WMzBfRlBfUkVHX1NSQ19TSElGVCk7Ci0gICAgICBOVjMwRlBTZXRIaWdoUmVnKHNoYWRlciwgcmVnLT5pbmRleCk7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgTlZTX0ZJTEVfQVRUUklCOgotICAgICAgewotCSB1bnNpZ25lZCBpbnQgaHdpbjsKLQotCSBzd2l0Y2ggKHJlZy0+aW5kZXgpIHsKLQkgY2FzZSBOVlNfRlJfUE9TSVRJT04gOiBod2luID0gTlYzMF9GUF9PUF9JTlBVVF9TUkNfUE9TSVRJT047IGJyZWFrOwotCSBjYXNlIE5WU19GUl9DT0wwICAgICA6IGh3aW4gPSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19DT0wwOyBicmVhazsKLQkgY2FzZSBOVlNfRlJfQ09MMSAgICAgOiBod2luID0gTlYzMF9GUF9PUF9JTlBVVF9TUkNfQ09MMTsgYnJlYWs7Ci0JIGNhc2UgTlZTX0ZSX0ZPR0NPT1JEIDogaHdpbiA9IE5WMzBfRlBfT1BfSU5QVVRfU1JDX0ZPR0M7IGJyZWFrOwotCSBjYXNlIE5WU19GUl9URVhDT09SRDA6IGh3aW4gPSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQygwKTsgYnJlYWs7Ci0JIGNhc2UgTlZTX0ZSX1RFWENPT1JEMTogaHdpbiA9IE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDKDEpOyBicmVhazsKLQkgY2FzZSBOVlNfRlJfVEVYQ09PUkQyOiBod2luID0gTlYzMF9GUF9PUF9JTlBVVF9TUkNfVEMoMik7IGJyZWFrOwotCSBjYXNlIE5WU19GUl9URVhDT09SRDM6IGh3aW4gPSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQygzKTsgYnJlYWs7Ci0JIGNhc2UgTlZTX0ZSX1RFWENPT1JENDogaHdpbiA9IE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDKDQpOyBicmVhazsKLQkgY2FzZSBOVlNfRlJfVEVYQ09PUkQ1OiBod2luID0gTlYzMF9GUF9PUF9JTlBVVF9TUkNfVEMoNSk7IGJyZWFrOwotCSBjYXNlIE5WU19GUl9URVhDT09SRDY6IGh3aW4gPSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQyg2KTsgYnJlYWs7Ci0JIGNhc2UgTlZTX0ZSX1RFWENPT1JENzogaHdpbiA9IE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDKDcpOyBicmVhazsKLQkgZGVmYXVsdDoKLQkJV0FSTl9PTkNFKCJ1bmtub3duIGZwIGlucHV0ICVkXG4iLCByZWctPmluZGV4KTsKLQkJaHdpbiA9IE5WMzBfRlBfT1BfSU5QVVRfU1JDX0NPTDA7Ci0JCWJyZWFrOwotCSB9Ci0JIHNoYWRlci0+aW5zdFswXSAmPSB+TlYzMF9GUF9PUF9JTlBVVF9TUkNfTUFTSzsKLQkgc2hhZGVyLT5pbnN0WzBdIHw9IChod2luIDw8IE5WMzBfRlBfT1BfSU5QVVRfU1JDX1NISUZUKTsKLQkgaHdzcmMgfD0gKGh3aW4gPDwgTlYzMF9GUF9SRUdfU1JDX1NISUZUKTsKLSAgICAgIH0KLSAgICAgIGh3c3JjIHw9IChOVjMwX0ZQX1JFR19UWVBFX0lOUFVUIDw8IE5WMzBfRlBfUkVHX1RZUEVfU0hJRlQpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIE5WU19GSUxFX0NPTlNUOgotICAgICAgLyogY29uc3RzIGFyZSBpbmxpbmVkIGFmdGVyIHRoZSBpbnN0ICovCi0gICAgICBod3NyYyB8PSAoTlYzMF9GUF9SRUdfVFlQRV9DT05TVCA8PCBOVjMwX0ZQX1JFR19UWVBFX1NISUZUKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCgwKTsKLSAgICAgIGJyZWFrOwotICAgfQotCi0gICBpZiAocmVnLT5uZWdhdGUpCi0gICAgICBod3NyYyB8PSBOVjMwX0ZQX1JFR19ORUdBVEU7Ci0gICBpZiAocmVnLT5hYnMpCi0gICAgICBzaGFkZXItPmluc3RbMV0gfD0gKDEgPDwgKDI5K3BvcykpOwotICAgaHdzcmMgfD0gKHJlZy0+c3dpenpsZVtOVlNfU1daX1hdIDw8IE5WMzBfRlBfUkVHX1NXWl9YX1NISUZUKTsKLSAgIGh3c3JjIHw9IChyZWctPnN3aXp6bGVbTlZTX1NXWl9ZXSA8PCBOVjMwX0ZQX1JFR19TV1pfWV9TSElGVCk7Ci0gICBod3NyYyB8PSAocmVnLT5zd2l6emxlW05WU19TV1pfWl0gPDwgTlYzMF9GUF9SRUdfU1daX1pfU0hJRlQpOwotICAgaHdzcmMgfD0gKHJlZy0+c3dpenpsZVtOVlNfU1daX1ddIDw8IE5WMzBfRlBfUkVHX1NXWl9XX1NISUZUKTsKLQotICAgc2hhZGVyLT5pbnN0W3BvcysxXSAmPSB+TlYzMF9GUF9SRUdfQUxMX01BU0s7Ci0gICBzaGFkZXItPmluc3RbcG9zKzFdIHw9IGh3c3JjOwotfQotCi1zdGF0aWMgdm9pZAotTlYzMEZQU2V0VGV4SW1hZ2VVbml0KG52c0Z1bmMgKnNoYWRlciwgaW50IHVuaXQpCi17Ci0gICBzaGFkZXItPmluc3RbMF0gJj0gfk5WMzBfRlBfT1BfVEVYX1VOSVRfU0hJRlQ7Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gKHVuaXQgPDwgTlYzMF9GUF9PUF9URVhfVU5JVF9TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRTYXR1cmF0ZShudnNGdW5jICpzaGFkZXIpCi17Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gTlYzMF9GUF9PUF9PVVRfU0FUOwotfQotCi1zdGF0aWMgdm9pZAotTlYzMEZQSW5pdEluc3RydWN0aW9uKG52c0Z1bmMgKnNoYWRlcikKLXsKLSAgIHVuc2lnbmVkIGludCBod3NyYzsKLQotICAgc2hhZGVyLT5pbnN0WzBdID0gMDsKLQotICAgaHdzcmMgPSAoTlYzMF9GUF9SRUdfVFlQRV9JTlBVVCA8PCBOVjMwX0ZQX1JFR19UWVBFX1NISUZUKSB8Ci0gICAgICAJICAgKE5WU19TV1pfWCA8PCBOVjMwX0ZQX1JFR19TV1pfWF9TSElGVCkgfAotCSAgIChOVlNfU1daX1kgPDwgTlYzMF9GUF9SRUdfU1daX1lfU0hJRlQpIHwKLQkgICAoTlZTX1NXWl9aIDw8IE5WMzBfRlBfUkVHX1NXWl9aX1NISUZUKSB8Ci0JICAgKE5WU19TV1pfVyA8PCBOVjMwX0ZQX1JFR19TV1pfV19TSElGVCk7Ci0gICBzaGFkZXItPmluc3RbMV0gPSBod3NyYzsKLSAgIHNoYWRlci0+aW5zdFsyXSA9IGh3c3JjOwotICAgc2hhZGVyLT5pbnN0WzNdID0gaHdzcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBTZXRMYXN0SW5zdChudnNGdW5jICpzaGFkZXIpCi17Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gMTsgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEaXNhc3NlbWJseSBoZWxwZXJzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgX29wX3hsYXQgKgotTlYzMEZQR2V0T1BUWFJlYyhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkKQotewotICAgaW50IG9wOwotCi0gICBvcCA9IHNoYWRlci0+R2V0T3Bjb2RlSFcoc2hhZGVyLCAwKTsKLSAgIGlmIChvcCA+IE5WRlBfVFhfQU9QX0NPVU5UKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICBpZiAoTlZGUF9UWF9BT1Bbb3BdLlNPUCA9PSBOVlNfT1BfVU5LTk9XTikKLSAgICAgIHJldHVybiBOVUxMOwotICAgcmV0dXJuICZOVkZQX1RYX0FPUFtvcF07Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEhhc01lcmdlZEluc3QobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1OVjMwRlBJc0xhc3RJbnN0KG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX1BST0dSQU1fRU5EKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGludAotTlYzMEZQR2V0T2Zmc2V0TmV4dChudnNGdW5jICogc2hhZGVyKQotewotICAgaW50IGk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICBpZiAoc2hhZGVyLT5HZXRTb3VyY2VGaWxlKHNoYWRlciwgMCwgaSkgPT0gTlZTX0ZJTEVfQ09OU1QpCi0JIHJldHVybiA4OwotICAgcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyBudnNPcGNvZGUKLU5WMzBGUEdldE9wY29kZShudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkKQotewotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0KLSAgIG9wciA9IHNoYWRlci0+R2V0T1BUWFJlYyhzaGFkZXIsIG1lcmdlZCk7Ci0gICBpZiAoIW9wcikKLSAgICAgIHJldHVybiBOVlNfT1BfVU5LTk9XTjsKLQotICAgcmV0dXJuIG9wci0+U09QOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjMwRlBHZXRPcGNvZGVIVyhudnNGdW5jICogc2hhZGVyLCBpbnQgc2xvdCkKLXsKLSAgIGludCBvcDsKLQotICAgb3AgPSAoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9GUF9PUF9PUENPREVfTUFTSykgPj4gTlYzMF9GUF9PUF9PUENPREVfU0hJRlQ7Ci0KLSAgIHJldHVybiBvcDsKLX0KLQotc3RhdGljIG52c1JlZ0ZpbGUKLU5WMzBGUEdldERlc3RGaWxlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICAvKiBSZXN1bHQgcmVncyBvdmVybGFwIHRlbXBvcmFyeSByZWdzICovCi0gICByZXR1cm4gTlZTX0ZJTEVfVEVNUDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotTlYzMEZQR2V0RGVzdElEKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBpbnQgaWQ7Ci0KLSAgIHN3aXRjaCAoc2hhZGVyLT5HZXREZXN0RmlsZShzaGFkZXIsIG1lcmdlZCkpIHsKLSAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLSAgICAgIGlkID0gKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX09VVF9SRUdfTUFTSykKLQkgICAgPj4gTlYzMF9GUF9PUF9PVVRfUkVHX1NISUZUKTsKLSAgICAgIHJldHVybiBpZDsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLU5WMzBGUEdldERlc3RNYXNrKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLSAgIGlmIChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX09VVF9YKSBtYXNrIHw9IFNNQVNLX1g7Ci0gICBpZiAoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9GUF9PUF9PVVRfWSkgbWFzayB8PSBTTUFTS19ZOwotICAgaWYgKHNoYWRlci0+aW5zdFswXSAmIE5WMzBfRlBfT1BfT1VUX1opIG1hc2sgfD0gU01BU0tfWjsKLSAgIGlmIChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX09VVF9XKSBtYXNrIHw9IFNNQVNLX1c7Ci0KLSAgIHJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjMwRlBHZXRTb3VyY2VIVyhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0KLSAgIG9wciA9IHNoYWRlci0+R2V0T1BUWFJlYyhzaGFkZXIsIG1lcmdlZCk7Ci0gICBpZiAoIW9wciB8fCBvcHItPnNyY3Bvc1twb3NdID09IC0xKQotICAgICAgcmV0dXJuIC0xOwotCi0gICByZXR1cm4gc2hhZGVyLT5pbnN0W29wci0+c3JjcG9zW3Bvc10gKyAxXTsKLX0KLQotc3RhdGljIG52c1JlZ0ZpbGUKLU5WMzBGUEdldFNvdXJjZUZpbGUobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCwgaW50IHBvcykKLXsKLSAgIHVuc2lnbmVkIGludCBzcmM7Ci0gICBzdHJ1Y3QgX29wX3hsYXQgKm9wcjsKLSAgIGludCBmaWxlOwotCi0gICBvcHIgPSBzaGFkZXItPkdldE9QVFhSZWMoc2hhZGVyLCBtZXJnZWQpOwotICAgaWYgKCFvcHIgfHwgb3ByLT5zcmNwb3NbcG9zXSA9PSAtMSkKLSAgICAgIHJldHVybiBOVlNfRklMRV9VTktOT1dOOwotCi0gICBzd2l0Y2ggKG9wci0+c3JjcG9zW3Bvc10pIHsKLSAgIGNhc2UgU1BPU19BRERSRVNTOiByZXR1cm4gTlZTX0ZJTEVfQUREUkVTUzsKLSAgIGRlZmF1bHQ6Ci0gICAgICBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotICAgICAgZmlsZSA9IChzcmMgJiBOVjMwX0ZQX1JFR19UWVBFX01BU0spID4+IE5WMzBfRlBfUkVHX1RZUEVfU0hJRlQ7Ci0KLSAgICAgIHN3aXRjaCAoZmlsZSkgewotICAgICAgY2FzZSBOVjMwX0ZQX1JFR19UWVBFX1RFTVAgOiByZXR1cm4gTlZTX0ZJTEVfVEVNUDsKLSAgICAgIGNhc2UgTlYzMF9GUF9SRUdfVFlQRV9JTlBVVDogcmV0dXJuIE5WU19GSUxFX0FUVFJJQjsKLSAgICAgIGNhc2UgTlYzMF9GUF9SRUdfVFlQRV9DT05TVDogcmV0dXJuIE5WU19GSUxFX0NPTlNUOwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIE5WU19GSUxFX1VOS05PV047Ci0gICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldFNvdXJjZUlEKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICBzd2l0Y2ggKHNoYWRlci0+R2V0U291cmNlRmlsZShzaGFkZXIsIG1lcmdlZCwgcG9zKSkgewotICAgY2FzZSBOVlNfRklMRV9BVFRSSUI6Ci0gICAgICBzd2l0Y2ggKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX0lOUFVUX1NSQ19NQVNLKQotCSAgICAgID4+IE5WMzBfRlBfT1BfSU5QVVRfU1JDX1NISUZUKSB7Ci0gICAgICBjYXNlIE5WMzBfRlBfT1BfSU5QVVRfU1JDX1BPU0lUSU9OOiByZXR1cm4gTlZTX0ZSX1BPU0lUSU9OOwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19DT0wwICAgIDogcmV0dXJuIE5WU19GUl9DT0wwOwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19DT0wxICAgIDogcmV0dXJuIE5WU19GUl9DT0wxOwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19GT0dDICAgIDogcmV0dXJuIE5WU19GUl9GT0dDT09SRDsKLSAgICAgIGNhc2UgTlYzMF9GUF9PUF9JTlBVVF9TUkNfVEMoMCkgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQwOwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQygxKSAgIDogcmV0dXJuIE5WU19GUl9URVhDT09SRDE7Ci0gICAgICBjYXNlIE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDKDIpICAgOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMjsKLSAgICAgIGNhc2UgTlYzMF9GUF9PUF9JTlBVVF9TUkNfVEMoMykgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQzOwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQyg0KSAgIDogcmV0dXJuIE5WU19GUl9URVhDT09SRDQ7Ci0gICAgICBjYXNlIE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDKDUpICAgOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENTsKLSAgICAgIGNhc2UgTlYzMF9GUF9PUF9JTlBVVF9TUkNfVEMoNikgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ2OwotICAgICAgY2FzZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQyg3KSAgIDogcmV0dXJuIE5WU19GUl9URVhDT09SRDc7Ci0gICAgICBkZWZhdWx0OgotCSByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLSAgICAgIHsKLQkgdW5zaWduZWQgaW50IHNyYzsKLQotCSBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotCSByZXR1cm4gKChzcmMgJiBOVjMwX0ZQX1JFR19TUkNfTUFTSykgPj4gTlYzMF9GUF9SRUdfU1JDX1NISUZUKTsKLSAgICAgIH0KLSAgIGNhc2UgTlZTX0ZJTEVfQ09OU1Q6CQkvKiBpbmxpbmVkIGludG8gZnJhZ3Byb2cgKi8KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldFRleEltYWdlVW5pdChudnNGdW5jICpzaGFkZXIpCi17Ci0gICAgICByZXR1cm4gKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX1RFWF9VTklUX01BU0spCi0JICAgICAgPj4gTlYzMF9GUF9PUF9URVhfVU5JVF9TSElGVCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldFNvdXJjZU5lZ2F0ZShudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgdW5zaWduZWQgaW50IHNyYzsKLQotICAgc3JjID0gc2hhZGVyLT5HZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLQotICAgaWYgKHNyYyA9PSAtMSkKLSAgICAgIHJldHVybiAtMTsKLSAgIHJldHVybiAoKHNyYyAmIE5WMzBfRlBfUkVHX05FR0FURSkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldFNvdXJjZUFicyhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0gICBzdGF0aWMgdW5zaWduZWQgaW50IGFic3Bvc1szXSA9IHsKLSAgICAgIE5WMzBfRlBfT1BfT1VUX0FCUywKLSAgICAgICgxIDw8IDMwKSwJCS8qIGd1ZXNzICovCi0gICAgICAoMSA8PCAzMSkJCQkvKiBndWVzcyAqLwotICAgfTsKLQotICAgb3ByID0gc2hhZGVyLT5HZXRPUFRYUmVjKHNoYWRlciwgbWVyZ2VkKTsKLSAgIGlmICghb3ByIHx8IG9wci0+c3JjcG9zW3Bvc10gPT0gLTEpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgIHJldHVybiAoKHNoYWRlci0+aW5zdFsxXSAmIGFic3Bvc1tvcHItPnNyY3Bvc1twb3NdXSkgPyAxIDogMCk7Ci19Ci0KLW52c1N3ekNvbXAgTlYzMEZQX1RYX1NXSVpaTEVbNF0gPSB7TlZTX1NXWl9YLCBOVlNfU1daX1ksIE5WU19TV1pfWiwgTlZTX1NXWl9XIH07Ci0KLXN0YXRpYyB2b2lkCi1OVjMwRlBUWFN3aXp6bGUoaW50IGh3c3d6LCBudnNTd3pDb21wICpzd3opCi17Ci0gICBzd3pbTlZTX1NXWl9XXSA9IE5WMzBGUF9UWF9TV0laWkxFWyhod3N3eiAmIDB4QzApID4+IDZdOwotICAgc3d6W05WU19TV1pfWl0gPSBOVjMwRlBfVFhfU1dJWlpMRVsoaHdzd3ogJiAweDMwKSA+PiA0XTsKLSAgIHN3eltOVlNfU1daX1ldID0gTlYzMEZQX1RYX1NXSVpaTEVbKGh3c3d6ICYgMHgwQykgPj4gMl07Ci0gICBzd3pbTlZTX1NXWl9YXSA9IE5WMzBGUF9UWF9TV0laWkxFWyhod3N3eiAmIDB4MDMpID4+IDBdOwotfQotCi1zdGF0aWMgdm9pZAotTlYzMEZQR2V0U291cmNlU3dpenpsZShudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zLCBudnNTd3pDb21wICpzd3opCi17Ci0gICB1bnNpZ25lZCBpbnQgc3JjOwotICAgaW50IHN3emJpdHM7Ci0KLSAgIHNyYyA9IHNoYWRlci0+R2V0U291cmNlSFcoc2hhZGVyLCBtZXJnZWQsIHBvcyk7Ci0gICBzd3piaXRzID0gKHNyYyAmIE5WMzBfRlBfUkVHX1NXWl9BTExfTUFTSykgPj4gTlYzMF9GUF9SRUdfU1daX0FMTF9TSElGVDsKLSAgIE5WMzBGUFRYU3dpenpsZShzd3piaXRzLCBzd3opOwotfQotCi1zdGF0aWMgaW50Ci1OVjMwRlBHZXRTb3VyY2VJbmRleGVkKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICBzd2l0Y2ggKHNoYWRlci0+R2V0U291cmNlRmlsZShzaGFkZXIsIG1lcmdlZCwgcG9zKSkgewotICAgY2FzZSBOVlNfRklMRV9BVFRSSUI6Ci0gICAgICByZXR1cm4gKChzaGFkZXItPmluc3RbM10gJiBOVjMwX0ZQX09QX0lOREVYX0lOUFVUKSA/IDEgOiAwKTsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU5WMzBGUEdldFNvdXJjZUNvbnN0VmFsKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MsIGZsb2F0ICp2YWwpCi17Ci0gICB2YWxbMF0gPSAqKGZsb2F0ICopICYoc2hhZGVyLT5pbnN0WzRdKTsKLSAgIHZhbFsxXSA9ICooZmxvYXQgKikgJihzaGFkZXItPmluc3RbNV0pOwotICAgdmFsWzJdID0gKihmbG9hdCAqKSAmKHNoYWRlci0+aW5zdFs2XSk7Ci0gICB2YWxbM10gPSAqKGZsb2F0ICopICYoc2hhZGVyLT5pbnN0WzddKTsKLX0KLQotc3RhdGljIGludAotTlYzMEZQR2V0U291cmNlU2NhbGUobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCwgaW50IHBvcykKLXsKLS8qRklYTUU6IGlzIHRoaXMgcGVyLXNvdXJjZSwgb25seSBmb3IgYSBzcGVjaWZpYyBzb3VyY2UsIG9yIGFsbCBzb3VyY2VzPz8qLwotICAgcmV0dXJuICgxIDw8ICgoc2hhZGVyLT5pbnN0WzJdICYgTlYzMF9GUF9PUF9TUkNfU0NBTEVfTUFTSykKLQkJID4+IE5WMzBfRlBfT1BfU1JDX1NDQUxFX1NISUZUKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldEFkZHJlc3NSZWdJRChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBudnNTd3pDb21wCi1OVjMwRlBHZXRBZGRyZXNzUmVnU3dpenpsZShudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuIE5WU19TV1pfWDsKLX0KLQotc3RhdGljIGludAotTlYzMEZQU3VwcG9ydHNDb25kaXRpb25hbChudnNGdW5jICogc2hhZGVyKQotewotICAgLypGSVhNRTogSXMgdGhpcyB0cnVlIG9mIGFsbCBvcHM/ICovCi0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotTlYzMEZQR2V0Q29uZGl0aW9uVXBkYXRlKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX0ZQX09QX0NPTkRfV1JJVEVfRU5BQkxFKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGludAotTlYzMEZQR2V0Q29uZGl0aW9uVGVzdChudnNGdW5jICogc2hhZGVyKQotewotICAgLypGSVhNRTogYWx3YXlzPyAqLwotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBudnNDb25kCi1OVjMwRlBHZXRDb25kaXRpb24obnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIGludCBjb25kOwotCi0gICBjb25kID0gKChzaGFkZXItPmluc3RbMV0gJiBOVjMwX0ZQX09QX0NPTkRfTUFTSykKLQkgICA+PiBOVjMwX0ZQX09QX0NPTkRfU0hJRlQpOwotCi0gICBzd2l0Y2ggKGNvbmQpIHsKLSAgIGNhc2UgTlYzMF9GUF9PUF9DT05EX0ZMOiByZXR1cm4gTlZTX0NPTkRfRkw7Ci0gICBjYXNlIE5WMzBfRlBfT1BfQ09ORF9MVDogcmV0dXJuIE5WU19DT05EX0xUOwotICAgY2FzZSBOVjMwX0ZQX09QX0NPTkRfRVE6IHJldHVybiBOVlNfQ09ORF9FUTsKLSAgIGNhc2UgTlYzMF9GUF9PUF9DT05EX0xFOiByZXR1cm4gTlZTX0NPTkRfTEU7Ci0gICBjYXNlIE5WMzBfRlBfT1BfQ09ORF9HVDogcmV0dXJuIE5WU19DT05EX0dUOwotICAgY2FzZSBOVjMwX0ZQX09QX0NPTkRfTkU6IHJldHVybiBOVlNfQ09ORF9ORTsKLSAgIGNhc2UgTlYzMF9GUF9PUF9DT05EX0dFOiByZXR1cm4gTlZTX0NPTkRfR0U7Ci0gICBjYXNlIE5WMzBfRlBfT1BfQ09ORF9UUjogcmV0dXJuIE5WU19DT05EX1RSOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVlNfQ09ORF9VTktOT1dOOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotTlYzMEZQR2V0Q29uZFJlZ1N3aXp6bGUobnZzRnVuYyAqIHNoYWRlciwgbnZzU3d6Q29tcCAqc3d6KQotewotICAgaW50IHN3emJpdHM7Ci0KLSAgIHN3emJpdHMgPSAoc2hhZGVyLT5pbnN0WzFdICYgTlYzMF9GUF9PUF9DT05EX1NXWl9BTExfTUFTSykKLSAgICAgID4+IE5WMzBfRlBfT1BfQ09ORF9TV1pfQUxMX1NISUZUOwotICAgTlYzMEZQVFhTd2l6emxlKHN3emJpdHMsIHN3eik7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBGUEdldENvbmRSZWdJRChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBudnNQcmVjaXNpb24KLU5WMzBGUEdldFByZWNpc2lvbihudnNGdW5jICogc2hhZGVyKQotewotICAgaW50IHA7Ci0KLSAgIHAgPSAoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9GUF9PUF9QUkVDSVNJT05fTUFTSykKLSAgICAgID4+IE5WMzBfRlBfT1BfUFJFQ0lTSU9OX1NISUZUOwotCi0gICBzd2l0Y2ggKHApIHsKLSAgIGNhc2UgTlYzMF9GUF9QUkVDSVNJT05fRlAzMjogcmV0dXJuIE5WU19QUkVDX0ZMT0FUMzI7Ci0gICBjYXNlIE5WMzBfRlBfUFJFQ0lTSU9OX0ZQMTY6IHJldHVybiBOVlNfUFJFQ19GTE9BVDE2OwotICAgY2FzZSBOVjMwX0ZQX1BSRUNJU0lPTl9GWDEyOiByZXR1cm4gTlZTX1BSRUNfRklYRUQxMjsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlZTX1BSRUNfVU5LTk9XTjsKLSAgIH0KLX0KLQotc3RhdGljIGludAotTlYzMEZQR2V0U2F0dXJhdGUobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIHJldHVybiAoKHNoYWRlci0+aW5zdFswXSAmIE5WMzBfRlBfT1BfT1VUX1NBVCkgPyAxIDogMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbml0Ci0gKi8KLXZvaWQKLU5WMzBGUEluaXRTaGFkZXJGdW5jcyhudnNGdW5jICogc2hhZGVyKQotewotICAgLyogVGhlc2UgYXJlIHByb2JhYmx5IGJvZ3VzLCBJIG1hZGUgdGhlbSB1cC4uLiAqLwotICAgc2hhZGVyLT5NYXhJbnN0CT0gMTAyNDsKLSAgIHNoYWRlci0+TWF4QXR0cmliCT0gMTY7Ci0gICBzaGFkZXItPk1heFRlbXAJPSAzMjsKLSAgIHNoYWRlci0+TWF4QWRkcmVzcwk9IDE7Ci0gICBzaGFkZXItPk1heENvbnN0CT0gMjU2OwotICAgc2hhZGVyLT5jYXBzCQk9IFNDQVBfU1JDX0FCUzsKLQotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfTU9WLCBOVlNfT1BfTU9WLCAwLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfTVVMLCBOVlNfT1BfTVVMLCAwLCAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9BREQsIE5WU19PUF9BREQsIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX01BRCwgTlZTX09QX01BRCwgMCwgMSwgMik7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9EUDMsIE5WU19PUF9EUDMsIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0RQNCwgTlZTX09QX0RQNCwgMCwgMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfRFNULCBOVlNfT1BfRFNULCAwLCAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9NSU4sIE5WU19PUF9NSU4sIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX01BWCwgTlZTX09QX01BWCwgMCwgMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfU0xULCBOVlNfT1BfU0xULCAwLCAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9TR0UsIE5WU19PUF9TR0UsIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0ZSQywgTlZTX09QX0ZSQywgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0ZMUiwgTlZTX09QX0ZMUiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1RFWCwgTlZTX09QX1RFWCwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1RYRCwgTlZTX09QX1RYRCwgMCwgMSwgMik7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9UWFAsIE5WU19PUF9UWFAsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9UWEIsIE5WU19PUF9UWEIsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9TRVEsIE5WU19PUF9TRVEsIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1NHVCwgTlZTX09QX1NHVCwgMCwgMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfU0xFLCBOVlNfT1BfU0xFLCAwLCAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9TTkUsIE5WU19PUF9TTkUsIDAsIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1JDUCwgTlZTX09QX1JDUCwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0xHMiwgTlZTX09QX0xHMiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0VYMiwgTlZTX09QX0VYMiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX0NPUywgTlZTX09QX0NPUywgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1NJTiwgTlZTX09QX1NJTiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX05PUCwgTlZTX09QX05PUCwgLTEsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9ERFgsIE5WU19PUF9ERFgsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9ERFksIE5WU19PUF9ERFksIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9LSUwsIE5WU19PUF9LSUwsIC0xLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfUEs0QiwgTlZTX09QX1BLNEIsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9VUDRCLCBOVlNfT1BfVVA0QiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1BLMkgsIE5WU19PUF9QSzJILCAwLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfVVAySCwgTlZTX09QX1VQMkgsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9QSzRVQiwgTlZTX09QX1BLNFVCLCAwLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfVVA0VUIsIE5WU19PUF9VUDRVQiwgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WMzBfRlBfT1BfT1BDT0RFX1BLMlVTLCBOVlNfT1BfUEsyVVMsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9VUDJVUywgTlZTX09QX1VQMlVTLCAwLCAtMSwgLTEpOwotICAgLypGSVhNRTogSGF2ZW4ndCBjb25maXJtZWQgdGhlIHNvdXJjZSBwb3NpdGlvbnMgZm9yIHRoZSBiZWxvdyBvcGNvZGVzICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9MSVQsIE5WU19PUF9MSVQsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9MUlAsIE5WU19PUF9MUlAsIDAsIDEsIDIpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlYzMF9GUF9PUF9PUENPREVfUE9XLCBOVlNfT1BfUE9XLCAwLCAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9SU1EsIE5WU19PUF9SU1EsIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjMwX0ZQX09QX09QQ09ERV9SRkwsIE5WU19PUF9SRkwsIDAsIDEsIC0xKTsKLQotICAgc2hhZGVyLT5HZXRPUFRYUmVjCQk9IE5WMzBGUEdldE9QVFhSZWM7Ci0gICBzaGFkZXItPkdldE9QVFhGcm9tU09QCT0gTlYzMEZQR2V0T1BUWEZyb21TT1A7Ci0KLSAgIHNoYWRlci0+VXBsb2FkVG9IVwkJPSBOVjMwRlBVcGxvYWRUb0hXOwotICAgc2hhZGVyLT5VcGRhdGVDb25zdAkJPSBOVjMwRlBVcGRhdGVDb25zdDsKLQotICAgc2hhZGVyLT5Jbml0SW5zdHJ1Y3Rpb24JPSBOVjMwRlBJbml0SW5zdHJ1Y3Rpb247Ci0gICBzaGFkZXItPlN1cHBvcnRzT3Bjb2RlCT0gTlYzMEZQU3VwcG9ydHNPcGNvZGU7Ci0gICBzaGFkZXItPlNldE9wY29kZQkJPSBOVjMwRlBTZXRPcGNvZGU7Ci0gICBzaGFkZXItPlNldENDVXBkYXRlCQk9IE5WMzBGUFNldENDVXBkYXRlOwotICAgc2hhZGVyLT5TZXRDb25kaXRpb24JCT0gTlYzMEZQU2V0Q29uZGl0aW9uOwotICAgc2hhZGVyLT5TZXRSZXN1bHQJCT0gTlYzMEZQU2V0UmVzdWx0OwotICAgc2hhZGVyLT5TZXRTb3VyY2UJCT0gTlYzMEZQU2V0U291cmNlOwotICAgc2hhZGVyLT5TZXRUZXhJbWFnZVVuaXQJPSBOVjMwRlBTZXRUZXhJbWFnZVVuaXQ7Ci0gICBzaGFkZXItPlNldFNhdHVyYXRlCQk9IE5WMzBGUFNldFNhdHVyYXRlOwotICAgc2hhZGVyLT5TZXRMYXN0SW5zdAkJPSBOVjMwRlBTZXRMYXN0SW5zdDsKLQotICAgc2hhZGVyLT5IYXNNZXJnZWRJbnN0CT0gTlYzMEZQSGFzTWVyZ2VkSW5zdDsKLSAgIHNoYWRlci0+SXNMYXN0SW5zdAkJPSBOVjMwRlBJc0xhc3RJbnN0OwotICAgc2hhZGVyLT5HZXRPZmZzZXROZXh0CT0gTlYzMEZQR2V0T2Zmc2V0TmV4dDsKLSAgIHNoYWRlci0+R2V0T3Bjb2RlCQk9IE5WMzBGUEdldE9wY29kZTsKLSAgIHNoYWRlci0+R2V0T3Bjb2RlSFcJCT0gTlYzMEZQR2V0T3Bjb2RlSFc7Ci0gICBzaGFkZXItPkdldERlc3RGaWxlCQk9IE5WMzBGUEdldERlc3RGaWxlOwotICAgc2hhZGVyLT5HZXREZXN0SUQJCT0gTlYzMEZQR2V0RGVzdElEOwotICAgc2hhZGVyLT5HZXREZXN0TWFzawkJPSBOVjMwRlBHZXREZXN0TWFzazsKLSAgIHNoYWRlci0+R2V0U291cmNlSFcJCT0gTlYzMEZQR2V0U291cmNlSFc7Ci0gICBzaGFkZXItPkdldFNvdXJjZUZpbGUJPSBOVjMwRlBHZXRTb3VyY2VGaWxlOwotICAgc2hhZGVyLT5HZXRTb3VyY2VJRAkJPSBOVjMwRlBHZXRTb3VyY2VJRDsKLSAgIHNoYWRlci0+R2V0VGV4SW1hZ2VVbml0CT0gTlYzMEZQR2V0VGV4SW1hZ2VVbml0OwotICAgc2hhZGVyLT5HZXRTb3VyY2VOZWdhdGUJPSBOVjMwRlBHZXRTb3VyY2VOZWdhdGU7Ci0gICBzaGFkZXItPkdldFNvdXJjZUFicwkJPSBOVjMwRlBHZXRTb3VyY2VBYnM7Ci0gICBzaGFkZXItPkdldFNvdXJjZVN3aXp6bGUJPSBOVjMwRlBHZXRTb3VyY2VTd2l6emxlOwotICAgc2hhZGVyLT5HZXRTb3VyY2VJbmRleGVkCT0gTlYzMEZQR2V0U291cmNlSW5kZXhlZDsKLSAgIHNoYWRlci0+R2V0U291cmNlQ29uc3RWYWwJPSBOVjMwRlBHZXRTb3VyY2VDb25zdFZhbDsKLSAgIHNoYWRlci0+R2V0U291cmNlU2NhbGUJPSBOVjMwRlBHZXRTb3VyY2VTY2FsZTsKLSAgIHNoYWRlci0+R2V0UmVsQWRkcmVzc1JlZ0lECT0gTlYzMEZQR2V0QWRkcmVzc1JlZ0lEOwotICAgc2hhZGVyLT5HZXRSZWxBZGRyZXNzU3dpenpsZSA9IE5WMzBGUEdldEFkZHJlc3NSZWdTd2l6emxlOwotICAgc2hhZGVyLT5HZXRQcmVjaXNpb24JCT0gTlYzMEZQR2V0UHJlY2lzaW9uOwotICAgc2hhZGVyLT5HZXRTYXR1cmF0ZQkJPSBOVjMwRlBHZXRTYXR1cmF0ZTsKLSAgIHNoYWRlci0+U3VwcG9ydHNDb25kaXRpb25hbAk9IE5WMzBGUFN1cHBvcnRzQ29uZGl0aW9uYWw7Ci0gICBzaGFkZXItPkdldENvbmRpdGlvblVwZGF0ZQk9IE5WMzBGUEdldENvbmRpdGlvblVwZGF0ZTsKLSAgIHNoYWRlci0+R2V0Q29uZGl0aW9uVGVzdAk9IE5WMzBGUEdldENvbmRpdGlvblRlc3Q7Ci0gICBzaGFkZXItPkdldENvbmRpdGlvbgkJPSBOVjMwRlBHZXRDb25kaXRpb247Ci0gICBzaGFkZXItPkdldENvbmRSZWdTd2l6emxlCT0gTlYzMEZQR2V0Q29uZFJlZ1N3aXp6bGU7Ci0gICBzaGFkZXItPkdldENvbmRSZWdJRAkJPSBOVjMwRlBHZXRDb25kUmVnSUQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MzBfc2hhZGVyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MzBfc2hhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDI3ZGQuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjMwX3NoYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLSNpZm5kZWYgX19OVjMwX1NIQURFUl9IX18KLSNkZWZpbmUgX19OVjMwX1NIQURFUl9IX18KLQotLyogVmVydGV4IHByb2dyYW1zIGluc3RydWN0aW9uIHNldAotICoKLSAqIDEyOGJpdCBvcGNvZGVzLCBzcGxpdCBpbnRvIDQgMzItYml0IG9uZXMgZm9yIGVhc2Ugb2YgdXNlLgotICoKLSAqIE5vbi1uYXRpdmUgaW5zdHJ1Y3Rpb25zCi0gKgkgQUJTIC0gTU9WICsgTlY0MF9WUF9JTlNUMF9ERVNUX0FCUwotICoJIFBPVyAtIEVYMiArIE1VTCArIExHMgotICoJIFNVQiAtIEFERCwgc2Vjb25kIHNvdXJjZSBuZWdhdGVkCi0gKgkgU1daIC0gTU9WCi0gKgkgWFBEIC0gIAotICoKLSAqIFJlZ2lzdGVyIGFjY2VzcwotICoJIC0gT25seSBvbmUgSU5QVVQgY2FuIGJlIGFjY2Vzc2VkIHBlci1pbnN0cnVjdGlvbiAobW92ZSBleHRyYXMgaW50byBURU1QcykKLSAqCSAtIE9ubHkgb25lIENPTlNUIGNhbiBiZSBhY2Nlc3NlZCBwZXItaW5zdHJ1Y3Rpb24gKG1vdmUgZXh0cmFzIGludG8gVEVNUHMpCi0gKgotICogUmVsYXRpdmUgQWRkcmVzc2luZwotICoJIEFjY29yZGluZyB0byB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE1BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIKLSAqCSB0aGVyZSBhcmUgb25seSB0d28gYWRkcmVzcyByZWdpc3RlcnMgYXZhaWxhYmxlLiAgVGhlIGRlc3RpbmF0aW9uIGluIHRoZSBBUkwKLSAqCSBpbnN0cnVjdGlvbiBpcyBzZXQgdG8gVEVNUCA8bj4gKFRoZSB0ZW1wIGlzbid0IGFjdHVhbGx5IHdyaXR0ZW4pLgotICoKLSAqCSBXaGVuIHVzaW5nIHZhbmlsbGEgQVJCX3ZfcCwgdGhlIHByb3ByaWV0YXJ5IGRyaXZlciB3aWxsIHNxdWlzaCBib3RoIHRoZSBhdmFpbGFibGUKLSAqCSBBRERSRVNTIHJlZ3MgaW50byB0aGUgZmlyc3QgaGFyZHdhcmUgcmVnIGluIHRoZSBYIGFuZCBZIGNvbXBvbmVudHMuCi0gKgotICoJIFRvIHVzZSBhbiBhZGRyZXNzIHJlZyBhcyBhbiBpbmRleCBpbnRvIGNvbnN0cywgdGhlIENPTlNUX1NSQyBpcyBzZXQgdG8KLSAqCSAoY29uc3RfYmFzZSArIG9mZnNldCkgYW5kIElOREVYX0NPTlNUIGlzIHNldC4KLSAqCi0gKgkgVG8gYWNjZXNzIHRoZSBzZWNvbmQgYWRkcmVzcyByZWcgdXNlIEFERFJfUkVHX1NFTEVDVF8xLiBBIHBhcnRpY3VsYXIgY29tcG9uZW50Ci0gKgkgb2YgdGhlIGFkZHJlc3MgcmVncyBpcyBzZWxlY3RlZCB3aXRoIEFERFJfU1daLgotICoKLSAqCSBPbmx5IG9uZSBhZGRyZXNzIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZCBwZXIgaW5zdHJ1Y3Rpb24uCi0gKgotICogQ29uZGl0aW9uYWwgZXhlY3V0aW9uIChzZWUgTlZfdmVydGV4X3Byb2dyYW17MiwzfSBmb3IgZGV0YWlscykKLSAqCSBDb25kaXRpb25hbCBleGVjdXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24gaXMgZW5hYmxlZCBieSBzZXR0aW5nIENPTkRfVEVTVF9FTkFCTEUsIGFuZAotICoJIHNlbGVjdGluZyB0aGUgY29uZGl0aW9uIHdoaWNoIHdpbGwgYWxsb3cgdGhlIHRlc3QgdG8gcGFzcyB3aXRoIENPTkRfe0ZMLExULC4uLn0uCi0gKgkgSXQgaXMgcG9zc2libGUgdG8gc3dpenpsZSB0aGUgdmFsdWVzIGluIHRoZSBjb25kaXRpb24gcmVnaXN0ZXIsIHdoaWNoIGFsbG93cyBmb3IKLSAqCSB0ZXN0aW5nIGFnYWluc3QgYW4gaW5kaXZpZHVhbCBjb21wb25lbnQuCi0gKgotICogQnJhbmNoaW5nCi0gKgkgVGhlIEJSQS9DQUwgaW5zdHJ1Y3Rpb25zIHNlZW0gdG8gZm9sbG93IGEgc2xpZ2h0bHkgZGlmZmVyZW50IG9wY29kZSBsYXlvdXQuICBUaGUKLSAqCSBkZXN0aW5hdGlvbiBpbnN0cnVjdGlvbiBJRCAoSUFERFIpIG92ZXJsYXBzIGEgc291cmNlIGZpZWxkLiAgSW5zdHJ1Y3Rpb24gSUQncyBzZWVtIHRvCi0gKgkgYmUgbnVtYmVyZWQgYmFzZWQgb24gdGhlIFVQTE9BRF9GUk9NX0lEIEZJRk8gY29tbWFuZCwgYW5kIGlzIGluY3JlbWVudGVkIGF1dG9tYXRpY2FsbHkKLSAqCSBvbiBlYWNoIFVQTE9BRF9JTlNUIEZJRk8gY29tbWFuZC4KLSAqCi0gKgkgQ29uZGl0aW9uYWwgYnJhbmNoaW5nIGlzIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBjb25kaXRpb24gdGVzdHMgZGVzY3JpYmVkIGFib3ZlLgotICoJIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGRlZGljYXRlZCBsb29waW5nIGluc3RydWN0aW9ucywgYnV0IHRoaXMgY2FuIGJlIGRvbmUKLSAqCSB1c2luZyBhIHRlbXAgcmVnICsgY29uZGl0aW9uYWwgYnJhbmNoaW5nLgotICoKLSAqCSBTdWJyb3V0aW5lcyBtYXkgYmUgdXBsb2FkZWQgYmVmb3JlIHRoZSBtYWluIHByb2dyYW0gaXRzZWxmLCBidXQgdGhlIGZpcnN0IGV4ZWN1dGVkCi0gKgkgaW5zdHJ1Y3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgUFJPR1JBTV9TVEFSVF9JRCBGSUZPIGNvbW1hbmQuCi0gKgotICovCi0KLS8qIERXT1JEIDAgKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0FERFJfUkVHX1NFTEVDVF8xCQkJCSgxIDw8IDI0KQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfU1JDMl9BQlMJCQkgCQkoMSA8PCAyMykgLyogZ3Vlc3MgKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NSQzFfQUJTCQkJIAkJKDEgPDwgMjIpIC8qIGd1ZXNzICovCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TUkMwX0FCUwkJCSAJCSgxIDw8IDIxKSAvKiBndWVzcyAqLwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfT1VUX1JFU1VMVAkJCQkJKDEgPDwgMjApCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9ERVNUX1RFTVBfSURfU0hJRlQJCQkJMTYKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0RFU1RfVEVNUF9JRF9NQVNLCQkJCSgweDBGIDw8IDE2KQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9VUERBVEVfRU5BQkxFCQkJCSgxPDwxNSkKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfVEVTVF9FTkFCTEUJCQkJKDE8PDE0KQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9TSElGVAkJCQkJMTEKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfTUFTSwkJCQkJKDB4MDcgPDwgMTEpCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9GTAkwIC8qIGd1ZXNzICovCQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfTFQJMQkKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX0VRCTIKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX0xFCTMKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX0dUCTQKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX05FCTUKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX0dFCTYKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX1RSCTcgLyogZ3Vlc3MgKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfU1daX1hfU0hJRlQJCQkJOQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9TV1pfWF9NQVNLCQkJCSgweDAzIDw8ICA5KQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9TV1pfWV9TSElGVAkJCQk3Ci0jZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX1NXWl9ZX01BU0sJCQkJKDB4MDMgPDwgIDcpCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9DT05EX1NXWl9aX1NISUZUCQkJCTUKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfU1daX1pfTUFTSwkJCQkoMHgwMyA8PCAgNSkKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfU1daX1dfU0hJRlQJCQkJMwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9TV1pfV19NQVNLCQkJCSgweDAzIDw8ICAzKQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09ORF9TV1pfQUxMX1NISUZUCQkJCTMKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTkRfU1daX0FMTF9NQVNLCQkJCSgweEZGIDw8ICAzKQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQUREUl9TV1pfU0hJRlQJCQkJMQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQUREUl9TV1pfTUFTSwkJCQkoMHgwMyA8PCAgMSkKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NDQV9PUENPREVIX1NISUZUCQkJCTAKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NDQV9PUENPREVIX01BU0sJCQkJKDB4MDEgPDwgIDApCi0KLS8qIERXT1JEIDEgKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NDQV9PUENPREVMX1NISUZUCQkJCTI4Ci0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TQ0FfT1BDT0RFTF9NQVNLCQkJCSgweDBGIDw8IDI4KQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX05PUAkweDAwCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfUkNQCTB4MDIKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9SQ0MJMHgwMwotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1JTUQkweDA0Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfRVhQCTB4MDUKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9MT0cJMHgwNgotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX0xJVAkweDA3Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfQlJBCTB4MDkKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9DQUwJMHgwQgotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1JFVAkweDBDCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfTEcyCTB4MEQKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9FWDIJMHgwRQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1NJTgkweDBGCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfQ09TCTB4MTAKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1ZFQ19PUENPREVfU0hJRlQJCQkJMjMKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSwkJCQkoMHgxRiA8PCAyMykKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9OT1BWCTB4MDAKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9NT1YJMHgwMQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX01VTAkweDAyCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfQURECTB4MDMKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9NQUQJMHgwNAotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX0RQMwkweDA1Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfRFA0CTB4MDcKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9EUEgJMHgwNgotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX0RTVAkweDA4Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfTUlOCTB4MDkKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9NQVgJMHgwQQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1NMVAkweDBCCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfU0dFCTB4MEMKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9BUkwJMHgwRAotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX0ZSQwkweDBFCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfRkxSCTB4MEYKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9TRVEJMHgxMAotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1NGTAkweDExCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfU0dUCTB4MTIKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9TTEUJMHgxMwotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX1NORQkweDE0Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfU1RSCTB4MTUKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9PUF9TU0cJMHgxNgotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX09QX0FSUgkweDE3Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfT1BfQVJBCTB4MTgKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0NPTlNUX1NSQ19TSElGVAkJCQkxNAotI2RlZmluZSBOVjMwX1ZQX0lOU1RfQ09OU1RfU1JDX01BU0sJCQkJKDB4RkYgPDwgMTQpCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9JTlBVVF9TUkNfU0hJRlQJCQkJOQkJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0lOUFVUX1NSQ19NQVNLCQkJCSgweDBGIDw8ICA5KQkvKk5WMjAqLwotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0lOX1BPUwkwCSAgLyogVGhlc2Ugc2VlbSB0byBtYXRjaCB0aGUgYmluZGluZ3Mgc3BlY2lmaWVkIGluICovCi0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfSU5fV0VJR0hUCTEJICAvKiB0aGUgQVJCX3ZfcCBzcGVjICgyLjE0LjMuMSkgKi8KLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9JTl9OT1JNQUwJMgkgIAotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0lOX0NPTDAJMwkgIC8qIFNob3VsZCBwcm9iYWJseSBjb25maXJtIHRoZW0gYWxsIHRob3VnaCAqLwotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0lOX0NPTDEJNAotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0lOX0ZPR0MJNQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0lOX1RDMAk4Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfSU5fVEMobikJKDgrbikKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NSQzBIX1NISUZUCQkJCTAJCS8qTlYyMCovCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TUkMwSF9NQVNLCQkJCQkoMHgxRkYgPDwgMCkJLypOVjIwKi8KLQotLyogRFdPUkQgMiAqLwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfU1JDMExfU0hJRlQJCQkJMjYJCS8qTlYyMCovCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TUkMwTF9NQVNLCQkJCQkoMHgzRiAgPDwyNikJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NSQzFfU0hJRlQJCQkJCTExCQkvKk5WMjAqLwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfU1JDMV9NQVNLCQkJCQkoMHg3RkZGPDwxMSkJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NSQzJIX1NISUZUCQkJCTAJCS8qTlYyMCovCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TUkMySF9NQVNLCQkJCQkoMHg3RkYgPDwgMCkJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0lBRERSX1NISUZUCQkJCTIKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0lBRERSX01BU0sJCQkJCSgweEZGIDw8ICAyKSAJLyogZ3Vlc3MgKi8KLQotLyogRFdPUkQgMyAqLwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfU1JDMkxfU0hJRlQJCQkJMjgJCS8qTlYyMCovCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TUkMyTF9NQVNLCQkJCQkoMHgwRiAgPDwyOCkJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19TSElGVAkJCTI0Ci0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TVEVNUF9XUklURU1BU0tfTUFTSwkJCSgweDBGIDw8IDI0KQotI2RlZmluZSBOVjMwX1ZQX0lOU1RfVlRFTVBfV1JJVEVNQVNLX1NISUZUCQkJMjAKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1ZURU1QX1dSSVRFTUFTS19NQVNLCQkJKDB4MEYgPDwgMjApCi0jZGVmaW5lIE5WMzBfVlBfSU5TVF9TREVTVF9XUklURU1BU0tfU0hJRlQJCQkxNgotI2RlZmluZSBOVjMwX1ZQX0lOU1RfU0RFU1RfV1JJVEVNQVNLX01BU0sJCQkoMHgwRiA8PCAxNikKLSNkZWZpbmUgTlYzMF9WUF9JTlNUX1ZERVNUX1dSSVRFTUFTS19TSElGVAkJCTEyCQkvKk5WMjAqLwotI2RlZmluZSBOVjMwX1ZQX0lOU1RfVkRFU1RfV1JJVEVNQVNLX01BU0sJCQkoMHgwRiA8PCAxMikJLypOVjIwKi8KLSNkZWZpbmUgTlYzMF9WUF9JTlNUX0RFU1RfSURfU0hJRlQJCQkJMgotI2RlZmluZSBOVjMwX1ZQX0lOU1RfREVTVF9JRF9NQVNLCQkJCSgweDBGIDw8ICAyKQotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0RFU1RfUE9TCTAKLSMJZGVmaW5lIE5WMzBfVlBfSU5TVF9ERVNUX0NPTDAJMwotIwlkZWZpbmUgTlYzMF9WUF9JTlNUX0RFU1RfQ09MMQk0Ci0jCWRlZmluZSBOVjMwX1ZQX0lOU1RfREVTVF9UQyhuKQkoOCtuKQotCi0vKiBTb3VyY2UtcmVnaXN0ZXIgZGVmaW5pdGlvbiAtIG1hdGNoZXMgTlYyMCBleGFjdGx5ICovCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19ORUdBVEUJCQkJCSgxPDwxNCkKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1NXWl9YX1NISUZUCQkJCTEyCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19TV1pfWF9NQVNLCQkJCSgweDAzICA8PDEyKQotI2RlZmluZSBOVjMwX1ZQX1NSQ19SRUdfU1daX1lfU0hJRlQJCQkJMTAKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1NXWl9ZX01BU0sJCQkJKDB4MDMgIDw8MTApCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19TV1pfWl9TSElGVAkJCQk4Ci0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19TV1pfWl9NQVNLCQkJCSgweDAzICA8PCA4KQotI2RlZmluZSBOVjMwX1ZQX1NSQ19SRUdfU1daX1dfU0hJRlQJCQkJNgotI2RlZmluZSBOVjMwX1ZQX1NSQ19SRUdfU1daX1dfTUFTSwkJCQkoMHgwMyAgPDwgNikKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1NXWl9BTExfU0hJRlQJCQkJNgotI2RlZmluZSBOVjMwX1ZQX1NSQ19SRUdfU1daX0FMTF9NQVNLCQkJCSgweEZGICA8PCA2KQotI2RlZmluZSBOVjMwX1ZQX1NSQ19SRUdfVEVNUF9JRF9TSElGVAkJCQkyCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19URU1QX0lEX01BU0sJCQkJKDB4MEYgIDw8IDApCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19UWVBFX1NISUZUCQkJCTAKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1RZUEVfTUFTSwkJCQkoMHgwMyAgPDwgMCkKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1RZUEVfVEVNUAkxCi0jZGVmaW5lIE5WMzBfVlBfU1JDX1JFR19UWVBFX0lOUFVUCTIKLSNkZWZpbmUgTlYzMF9WUF9TUkNfUkVHX1RZUEVfQ09OU1QJMyAvKiBndWVzcyAqLwotCi0vKgotICogRWFjaCBmcmFnbWVudCBwcm9ncmFtIG9wY29kZSBhcHBlYXJzIHRvIGJlIGNvbXByaXNlZCBvZiA0IDMyLWJpdCB2YWx1ZXMuCi0gKgotICoJIDAgLSBPcGNvZGUsIG91dHB1dCByZWcvbWFzaywgQVRUUklCIHNvdXJjZQotICoJIDEgLSBTb3VyY2UgMAotICoJIDIgLSBTb3VyY2UgMQotICoJIDMgLSBTb3VyY2UgMgotICoKLSAqIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gc3BlY2lhbCBkaWZmZXJlbmNlIGJldHdlZW4gcmVzdWx0IHJlZ3MgYW5kIHRlbXAgcmVncy4KLSAqIAkJcmVzdWx0LmNvbG9yID09IFIwLnh5encKLSAqIAkJcmVzdWx0LmRlcHRoID09IFIxLnoKLSAqIFdoZW4gdGhlIGZyYWdwcm9nIGNvbnRhaW5zIGluc3RydWN0aW9ucyB0byB3cml0ZSBkZXB0aCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1VOSzFENzg9MAotICogb3RoZXJ3aXNlIGl0IGlzIHNldCB0byAxLgotICoKLSAqIENvbnN0YW50cyBhcmUgaW5zZXJ0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIHRoYXQgdXNlcyB0aGVtLgotICogCi0gKiBJdCBhcHBlYXJzIHRoYXQgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIHR3byBpbnB1dCByZWdpc3RlcnMgaW4gb25lCi0gKiBpbnN0cnVjdGlvbiBhcyB0aGUgaW5wdXQgc291cmNpbmcgaXMgZG9uZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZHdvcmQKLSAqIGFuZCBub3QgdGhlIHNvdXJjZSBzZWxlY3Rpb24gZHdvcmRzLiAgQXMgc3VjaCBpbnN0cnVjdGlvbnMgc3VjaCBhczoKLSAqIAotICoJCSBBREQgcmVzdWx0LmNvbG9yLCBmcmFnbWVudC5jb2xvciwgZnJhZ21lbnQudGV4Y29vcmRbMF07Ci0gKgotICogbXVzdCBiZSBzcGxpdCBpbnRvIHR3byBNT1YncyBhbmQgdGhlbiBhbiBBREQgKG52aWRpYSBkb2VzIHRoaXMpIGJ1dAotICogSSdtIG5vdCBzdXJlIHdoeSBpdCdzIG5vdCBqdXN0IG9uZSBNT1YgYW5kIHRoZW4gc291cmNlIHRoZSBzZWNvbmQgaW5wdXQKLSAqIGluIHRoZSBBREQgaW5zdHJ1Y3Rpb24uLgotICoKLSAqIE5lZ2F0aW9uIG9mIHRoZSBmdWxsIHNvdXJjZSBpcyBkb25lIHdpdGggTlYzMF9GUF9SRUdfTkVHQVRFLCBhcmJpdHJhcnkKLSAqIG5lZ2F0aW9uIHJlcXVpcmVzIG11bHRpcGxpY2F0aW9uIHdpdGggYSBjb25zdC4KLSAqCi0gKiBBcmJpdHJhcnkgc3dpenpsaW5nIGlzIHN1cHBvcnRlZCB3aXRoIHRoZSBleGNlcHRpb24gb2YgU1dJWlpMRV9aRVJPL1NXSVpaTEVfT05FCi0gKiBUaGUgdGVtcC9yZXN1bHQgcmVncyBhcHBlYXIgdG8gYmUgaW5pdGlhbGlzZWQgdG8gKDAuMCwgMC4wLCAwLjAsIDAuMCkgYXMgU1dJWlpMRV9aRVJPCi0gKiBpcyBpbXBsZW1lbnRlZCBzaW1wbHkgYnkgbm90IHdyaXRpbmcgdG8gdGhlIHJlbGV2YW50IGNvbXBvbmVudHMgb2YgdGhlIGRlc3RpbmF0aW9uLgotICoKLSAqIENvbmRpdGlvbmFsIGV4ZWN1dGlvbgotICogICBUT0RPCi0gKiAKLSAqIE5vbi1uYXRpdmUgaW5zdHJ1Y3Rpb25zOgotICoJIExJVAotICoJIExSUCAtIE1BRCtNQUQKLSAqCSBTVUIgLSBBREQsIG5lZ2F0ZSBzZWNvbmQgc291cmNlCi0gKgkgUlNRIC0gTEcyICsgRVgyCi0gKgkgUE9XIC0gTEcyICsgTVVMICsgRVgyCi0gKgkgU0NTIC0gQ09TICsgU0lOCi0gKgkgWFBECi0gKi8KLQotLy89PSBPcGNvZGUgLyBEZXN0aW5hdGlvbiBzZWxlY3Rpb24gPT0KLSNkZWZpbmUgTlYzMF9GUF9PUF9QUk9HUkFNX0VORAkJCQkJKDEgPDwgMCkKLSNkZWZpbmUgTlYzMF9GUF9PUF9PVVRfUkVHX1NISUZUCQkJCTEKLSNkZWZpbmUgTlYzMF9GUF9PUF9PVVRfUkVHX01BU0sJCQkJCSgzMSA8PCAxKQkvKiB1bmNlcnRhaW4gKi8KLS8qIE5lZWRzIHRvIGJlIHNldCB3aGVuIHdyaXRpbmcgb3V0cHV0cyB0byBnZXQgZXhwZWN0ZWQgcmVzdWx0Li4gKi8KLSNkZWZpbmUgTlYzMF9GUF9PUF9VTkswXzcJCQkJCSgxIDw8IDcpCi0jZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9XUklURV9FTkFCTEUJCQkJKDEgPDwgOCkKLSNkZWZpbmUgTlYzMF9GUF9PUF9PVVRNQVNLX1NISUZUCQkJCTkKLSNkZWZpbmUgTlYzMF9GUF9PUF9PVVRNQVNLX01BU0sJCQkJCSgweEYgPDwgOSkKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1VUX1gJKDE8PDkpCi0jCWRlZmluZSBOVjMwX0ZQX09QX09VVF9ZCSgxPDwxMCkKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1VUX1oJKDE8PDExKQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PVVRfVwkoMTw8MTIpCi0vKiBVbmNlcnRhaW4gYWJvdXQgdGhlc2UsIGVzcGVjaWFsbHkgdGhlIGlucHV0X3NyYyB2YWx1ZXMuLiBpdCdzIHBvc3NpYmxlIHRoYXQKLSAqIHRoZXkgY2FuIGJlIGR5bmFtaWNhbGx5IGNoYW5nZWQuCi0gKi8KLSNkZWZpbmUgTlYzMF9GUF9PUF9JTlBVVF9TUkNfU0hJRlQJCQkJMTMKLSNkZWZpbmUgTlYzMF9GUF9PUF9JTlBVVF9TUkNfTUFTSwkJCQkoMTUgPDwgMTMpCi0jCWRlZmluZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19QT1NJVElPTgkweDAKLSMJZGVmaW5lIE5WMzBfRlBfT1BfSU5QVVRfU1JDX0NPTDAJMHgxCi0jCWRlZmluZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19DT0wxCTB4MgotIwlkZWZpbmUgTlYzMF9GUF9PUF9JTlBVVF9TUkNfRk9HQwkweDMKLSMJZGVmaW5lIE5WMzBfRlBfT1BfSU5QVVRfU1JDX1RDMAkJMHg0Ci0jCWRlZmluZSBOVjMwX0ZQX09QX0lOUFVUX1NSQ19UQyhuKQkoMHg0ICsgbikKLSNkZWZpbmUgTlYzMF9GUF9PUF9URVhfVU5JVF9TSElGVAkJCQkxNwotI2RlZmluZSBOVjMwX0ZQX09QX1RFWF9VTklUX01BU0sJCQkJKDB4RiA8PCAxNykgLyogZ3Vlc3MgKi8KLSNkZWZpbmUgTlYzMF9GUF9PUF9QUkVDSVNJT05fU0hJRlQJCQkJMjIKLSNkZWZpbmUgTlYzMF9GUF9PUF9QUkVDSVNJT05fTUFTSwkJCQkoMyA8PCAyMikKLSMgICBkZWZpbmUgTlYzMF9GUF9QUkVDSVNJT05fRlAzMgkwCi0jICAgZGVmaW5lIE5WMzBfRlBfUFJFQ0lTSU9OX0ZQMTYJMQotIyAgIGRlZmluZSBOVjMwX0ZQX1BSRUNJU0lPTl9GWDEyCTIKLSNkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfU0hJRlQJCQkJCTI0Ci0jZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX01BU0sJCQkJCSgweDNGIDw8IDI0KQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfTk9QCTB4MDAKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX01PVgkweDAxCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9NVUwJMHgwMgotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfQURECTB4MDMKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX01BRAkweDA0Ci0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9EUDMJMHgwNQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfRFA0CTB4MDYKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX0RTVAkweDA3Ci0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9NSU4JMHgwOAotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfTUFYCTB4MDkKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1NMVAkweDBBCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9TR0UJMHgwQgotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfU0xFCTB4MEMKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1NHVAkweDBECi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9TTkUJMHgwRQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfU0VRCTB4MEYKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX0ZSQwkweDEwCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9GTFIJMHgxMQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfS0lMCTB4MTIKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1BLNEIgICAweDEzCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9VUDRCICAgMHgxNAotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfRERYCTB4MTUgLyogY2FuIG9ubHkgd3JpdGUgWFkgKi8KLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX0REWQkweDE2IC8qIGNhbiBvbmx5IHdyaXRlIFhZICovCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9URVgJMHgxNwotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfVFhQCTB4MTgKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1RYRAkweDE5Ci0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9SQ1AJMHgxQQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfUlNRCTB4MUIKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX0VYMgkweDFDCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9MRzIJMHgxRAotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfTElUCTB4MUUKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX0xSUAkweDFGCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9DT1MJMHgyMgotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfU0lOCTB4MjMKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1BLMkggICAweDI0Ci0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9VUDJIICAgMHgyNQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfUE9XCTB4MjYKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1BLNFVCICAweDI3Ci0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9VUDRVQiAgMHgyOAotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfUEsyVVMgIDB4MjkKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1VQMlVTICAweDJBCi0jCWRlZmluZSBOVjMwX0ZQX09QX09QQ09ERV9EUDJBICAgMHgyRQotIwlkZWZpbmUgTlYzMF9GUF9PUF9PUENPREVfVFhCCTB4MzEKLSMJZGVmaW5lIE5WMzBfRlBfT1BfT1BDT0RFX1JGTAkweDM2Ci0jZGVmaW5lIE5WMzBfRlBfT1BfT1VUX1NBVAkJCQkJKDEgPDwgMzEpCi0KLS8qIGhpZ2ggb3JkZXIgYml0cyBvZiBTUkMwICovCi0jZGVmaW5lIE5WMzBfRlBfT1BfT1VUX0FCUwkJCQkJKDEgPDwgMjkpCi0jZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9TV1pfV19TSElGVAkJCQkyNwotI2RlZmluZSBOVjMwX0ZQX09QX0NPTkRfU1daX1dfTUFTSwkJCQkoMyA8PCAyNykKLSNkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1NXWl9aX1NISUZUCQkJCTI1Ci0jZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9TV1pfWl9NQVNLCQkJCSgzIDw8IDI1KQotI2RlZmluZSBOVjMwX0ZQX09QX0NPTkRfU1daX1lfU0hJRlQJCQkJMjMKLSNkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1NXWl9ZX01BU0sJCQkJKDMgPDwgMjMpCi0jZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9TV1pfWF9TSElGVAkJCQkyMQotI2RlZmluZSBOVjMwX0ZQX09QX0NPTkRfU1daX1hfTUFTSwkJCQkoMyA8PCAyMSkKLSNkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1NXWl9BTExfU0hJRlQJCQkJMjEKLSNkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1NXWl9BTExfTUFTSwkJCQkoMHhGRiA8PCAyMSkKLSNkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1NISUZUCQkJCQkxOAotI2RlZmluZSBOVjMwX0ZQX09QX0NPTkRfTUFTSwkJCQkJKDB4MDcgPDwgMTgpCi0jCWRlZmluZSBOVjMwX0ZQX09QX0NPTkRfRkwJMAotIwlkZWZpbmUgTlYzMF9GUF9PUF9DT05EX0xUCTEKLSMJZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9FUQkyCi0jCWRlZmluZSBOVjMwX0ZQX09QX0NPTkRfTEUJMwotIwlkZWZpbmUgTlYzMF9GUF9PUF9DT05EX0dUCTQKLSMJZGVmaW5lIE5WMzBfRlBfT1BfQ09ORF9ORQk1Ci0jCWRlZmluZSBOVjMwX0ZQX09QX0NPTkRfR0UJNgotIwlkZWZpbmUgTlYzMF9GUF9PUF9DT05EX1RSCTcKLQotLyogaGlnaCBvcmRlciBiaXRzIG9mIFNSQzEgKi8KLSNkZWZpbmUgTlYzMF9GUF9PUF9TUkNfU0NBTEVfU0hJRlQJCQkJMjgKLSNkZWZpbmUgTlYzMF9GUF9PUF9TUkNfU0NBTEVfTUFTSwkJCQkoMyA8PCAyOCkKLQotLyogaGlnaCBvcmRlciBiaXRzIG9mIFNSQzIgKi8KLSNkZWZpbmUgTlYzMF9GUF9PUF9JTkRFWF9JTlBVVAkJCQkJKDEgPDwgMzApCi0KLS8vPT0gUmVnaXN0ZXIgc2VsZWN0aW9uID09Ci0jZGVmaW5lIE5WMzBfRlBfUkVHX0FMTF9NQVNLCQkJCQkoMHgxRkZGRjw8MCkKLSNkZWZpbmUgTlYzMF9GUF9SRUdfVFlQRV9TSElGVAkJCQkJMAotI2RlZmluZSBOVjMwX0ZQX1JFR19UWVBFX01BU0sJCQkJCSgzIDw8IDApCi0jCWRlZmluZSBOVjMwX0ZQX1JFR19UWVBFX1RFTVAJMAotIwlkZWZpbmUgTlYzMF9GUF9SRUdfVFlQRV9JTlBVVAkxCi0jCWRlZmluZSBOVjMwX0ZQX1JFR19UWVBFX0NPTlNUCTIKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1JDX1NISUZUCQkJCQkyIC8qIHVuY2VydGFpbiAqLwotI2RlZmluZSBOVjMwX0ZQX1JFR19TUkNfTUFTSwkJCQkJKDMxIDw8IDIpCi0jZGVmaW5lIE5WMzBfRlBfUkVHX1VOS18wCQkJCQkoMSA8PCA4KQotI2RlZmluZSBOVjMwX0ZQX1JFR19TV1pfQUxMX1NISUZUCQkJCTkKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1daX0FMTF9NQVNLCQkJCSgyNTUgPDwgOSkKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1daX1hfU0hJRlQJCQkJCTkKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1daX1hfTUFTSwkJCQkJKDMgPDwgOSkKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1daX1lfU0hJRlQJCQkJCTExCi0jZGVmaW5lIE5WMzBfRlBfUkVHX1NXWl9ZX01BU0sJCQkJCSgzIDw8IDExKQotI2RlZmluZSBOVjMwX0ZQX1JFR19TV1pfWl9TSElGVAkJCQkJMTMKLSNkZWZpbmUgTlYzMF9GUF9SRUdfU1daX1pfTUFTSwkJCQkJKDMgPDwgMTMpCi0jZGVmaW5lIE5WMzBfRlBfUkVHX1NXWl9XX1NISUZUCQkJCQkxNQotI2RlZmluZSBOVjMwX0ZQX1JFR19TV1pfV19NQVNLCQkJCQkoMyA8PCAxNSkKLSMJZGVmaW5lIE5WMzBfRlBfU1dJWlpMRV9YCTAKLSMJZGVmaW5lIE5WMzBfRlBfU1dJWlpMRV9ZCTEKLSMJZGVmaW5lIE5WMzBfRlBfU1dJWlpMRV9aCTIKLSMJZGVmaW5lIE5WMzBfRlBfU1dJWlpMRV9XCTMKLSNkZWZpbmUgTlYzMF9GUF9SRUdfTkVHQVRFCQkJCQkoMSA8PCAxNykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MzBfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF9zdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjAxMDk1Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF9zdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDIwMDYgTm91dmVhdQotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibm91dmVhdV9jb250ZXh0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2ZpZm8uaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc3RhdGUuaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi0jZGVmaW5lIE5PVVZFQVVfQ0FSRF9VU0lOR19TSEFERVJTIChubWVzYS0+c2NyZWVuLT5jYXJkLT50eXBlID49IE5WXzQwKQotCi1zdGF0aWMgdm9pZCBudjMwQWxwaGFGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlIHViUmVmOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJSZWYsIHJlZik7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0ZVTkMsIDIpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOyAgICAgLyogTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfRlVOQyAqLwotCU9VVF9SSU5HX0NBQ0hFKHViUmVmKTsgICAgLyogTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfUkVGICAqLwotfQotCi1zdGF0aWMgdm9pZCBudjMwQmxlbmRDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOyAKLQlHTHVieXRlIGNmWzRdOwotCi0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShjZlswXSwgY29sb3JbMF0pOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY2ZbMV0sIGNvbG9yWzFdKTsKLQlDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGNmWzJdLCBjb2xvclsyXSk7Ci0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShjZlszXSwgY29sb3JbM10pOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfQ09MT1IsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKFBBQ0tfQ09MT1JfODg4OChjZlszXSwgY2ZbMV0sIGNmWzJdLCBjZlswXSkpOwotfQotCi1zdGF0aWMgdm9pZCBudjMwQmxlbmRFcXVhdGlvblNlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRVFVQVRJT04sIDEpOwotCU9VVF9SSU5HX0NBQ0hFKChtb2RlQTw8MTYpIHwgbW9kZVJHQik7Ci19Ci0KLQotc3RhdGljIHZvaWQgbnYzMEJsZW5kRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsCi0JCUdMZW51bSBzZmFjdG9yQSwgR0xlbnVtIGRmYWN0b3JBKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19TUkMsIDIpOwotCU9VVF9SSU5HX0NBQ0hFKChzZmFjdG9yQTw8MTYpIHwgc2ZhY3RvclJHQik7Ci0JT1VUX1JJTkdfQ0FDSEUoKGRmYWN0b3JBPDwxNikgfCBkZmFjdG9yUkdCKTsKLX0KLQotc3RhdGljIHZvaWQgbnYzMENsZWFyKEdMY29udGV4dCAqY3R4LCBHTGJpdGZpZWxkIG1hc2spCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVpbnQgaHdfYnVmcyA9IDA7Ci0KLQlpZiAobWFzayAmIChCVUZGRVJfQklUX0ZST05UX0xFRlQgfCBCVUZGRVJfQklUX0JBQ0tfTEVGVCkpCi0JCWh3X2J1ZnMgfD0gMHhmMDsKLQlpZiAobWFzayAmIChCVUZGRVJfQklUX0RFUFRIKSkKLQkJaHdfYnVmcyB8PSAweDAzOwotCi0JaWYgKGh3X2J1ZnMpIHsKLQkJQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9XSElDSF9CVUZGRVJTLCAxKTsKLQkJT1VUX1JJTkcoaHdfYnVmcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjMwQ2xlYXJDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMdWJ5dGUgY1s0XTsKLQlVTkNMQU1QRURfRkxPQVRfVE9fUkdCQV9DSEFOKGMsY29sb3IpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX1ZBTFVFX0FSR0IsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKFBBQ0tfQ09MT1JfODg4OChjWzNdLGNbMF0sY1sxXSxjWzJdKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBDbGVhckRlcHRoKEdMY29udGV4dCAqY3R4LCBHTGNsYW1wZCBkKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jbm1lc2EtPmNsZWFyX3ZhbHVlPSgobm1lc2EtPmNsZWFyX3ZhbHVlJjB4MDAwMDAwRkYpfCgoKHVpbnQzMl90KShkKjB4RkZGRkZGKSk8PDgpKTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9WQUxVRV9ERVBUSCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobm1lc2EtPmNsZWFyX3ZhbHVlKTsKLX0KLQotLyogd2UncmUgZG9uJ3Qgc3VwcG9ydCBpbmRleGVkIGJ1ZmZlcnMKLSAgIHZvaWQgKCpDbGVhckluZGV4KShHTGNvbnRleHQgKmN0eCwgR0x1aW50IGluZGV4KQotICovCi0KLXN0YXRpYyB2b2lkIG52MzBDbGVhclN0ZW5jaWwoR0xjb250ZXh0ICpjdHgsIEdMaW50IHMpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlubWVzYS0+Y2xlYXJfdmFsdWU9KChubWVzYS0+Y2xlYXJfdmFsdWUmMHhGRkZGRkYwMCl8KHMmMHgwMDAwMDBGRikpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX1ZBTFVFX0RFUFRILCAxKTsKLQlPVVRfUklOR19DQUNIRShubWVzYS0+Y2xlYXJfdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBudjMwQ2xpcFBsYW5lKEdMY29udGV4dCAqY3R4LCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlpZiAoTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpCi0JCXJldHVybjsKLQotCXBsYW5lIC09IEdMX0NMSVBfUExBTkUwOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NMSVBfUExBTkVfQShwbGFuZSksIDQpOwotCU9VVF9SSU5HX0NBQ0hFZihlcXVhdGlvblswXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGVxdWF0aW9uWzFdKTsKLQlPVVRfUklOR19DQUNIRWYoZXF1YXRpb25bMl0pOwotCU9VVF9SSU5HX0NBQ0hFZihlcXVhdGlvblszXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBDb2xvck1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBybWFzaywgR0xib29sZWFuIGdtYXNrLAotCQlHTGJvb2xlYW4gYm1hc2ssIEdMYm9vbGVhbiBhbWFzayApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9NQVNLLCAxKTsKLQlPVVRfUklOR19DQUNIRSgoKGFtYXNrICYmIDB4MDEpIDw8IDI0KSB8ICgocm1hc2sgJiYgMHgwMSkgPDwgMTYpIHwgKChnbWFzayAmJiAweDAxKTw8IDgpIHwgKChibWFzayAmJiAweDAxKSA8PCAwKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBDb2xvck1hdGVyaWFsKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpCi17Ci0JLy8gVE9ETyBJIG5lZWQgbG92ZQotfQotCi1zdGF0aWMgdm9pZCBudjMwQ3VsbEZhY2UoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFLCAxKTsKLQlPVVRfUklOR19DQUNIRShtb2RlKTsKLX0KLQotc3RhdGljIHZvaWQgbnYzMEZyb250RmFjZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9GUk9OVF9GQUNFLCAxKTsKLQlPVVRfUklOR19DQUNIRShtb2RlKTsKLX0KLQotc3RhdGljIHZvaWQgbnYzMERlcHRoRnVuYyhHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZ1bmMpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9GVU5DLCAxKTsKLQlPVVRfUklOR19DQUNIRShmdW5jKTsKLX0KLQotc3RhdGljIHZvaWQgbnYzMERlcHRoTWFzayhHTGNvbnRleHQgKmN0eCwgR0xib29sZWFuIGZsYWcpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9XUklURV9FTkFCTEUsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKGZsYWcpOwotfQotCi1zdGF0aWMgdm9pZCBudjMwRGVwdGhSYW5nZShHTGNvbnRleHQgKmN0eCwgR0xjbGFtcGQgbmVhcnZhbCwgR0xjbGFtcGQgZmFydmFsKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfUkFOR0VfTkVBUiwgMik7Ci0JT1VUX1JJTkdfQ0FDSEVmKG5lYXJ2YWwpOwotCU9VVF9SSU5HX0NBQ0hFZihmYXJ2YWwpOwotfQotCi0vKiogU3BlY2lmeSB0aGUgY3VycmVudCBidWZmZXIgZm9yIHdyaXRpbmcgKi8KLS8vdm9pZCAoKkRyYXdCdWZmZXIpKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGJ1ZmZlciApOwotLyoqIFNwZWNpZnkgdGhlIGJ1ZmZlcnMgZm9yIHdyaXRpbmcgZm9yIGZyYWdtZW50IHByb2dyYW1zKi8KLS8vdm9pZCAoKkRyYXdCdWZmZXJzKSggR0xjb250ZXh0ICpjdHgsIEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZmZXJzICk7Ci0KLXN0YXRpYyB2b2lkIG52MzBFbmFibGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBjYXAsIEdMYm9vbGVhbiBzdGF0ZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCXN3aXRjaChjYXApCi0JewotCQljYXNlIEdMX0FMUEhBX1RFU1Q6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0FVVE9fTk9STUFMOgotCQljYXNlIEdMX0JMRU5EOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRlVOQ19FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTA6Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTE6Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTI6Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTM6Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTQ6Ci0JCWNhc2UgR0xfQ0xJUF9QTEFORTU6Ci0JCQlpZiAoTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpIHsKLQkJCQlub3V2ZWF1U2hhZGVyICpudnMgPSAobm91dmVhdVNoYWRlciAqKWN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudDsKLQkJCQlpZiAobnZzKQotCQkJCQludnMtPnRyYW5zbGF0ZWQgPSBHTF9GQUxTRTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ0xJUF9QTEFORV9FTkFCTEUoY2FwLUdMX0NMSVBfUExBTkUwKSwgMSk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfQ09MT1JfTE9HSUNfT1A6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9DT0xPUl9MT0dJQ19PUF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKLS8vCQljYXNlIEdMX0NPTE9SX1NVTV9FWFQ6Ci0vLwkJY2FzZSBHTF9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX0NPTlZPTFVUSU9OXzFEOgotLy8JCWNhc2UgR0xfQ09OVk9MVVRJT05fMkQ6Ci0JCWNhc2UgR0xfQ1VMTF9GQUNFOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfQ1VMTF9GQUNFX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ERVBUSF9URVNUOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfVEVTVF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfRElUSEVSOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfRElUSEVSX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9GT0c6Ci0JCQlpZiAoTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpCi0JCQkJYnJlYWs7Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfSElTVE9HUkFNOgotLy8JCWNhc2UgR0xfSU5ERVhfTE9HSUNfT1A6Ci0JCWNhc2UgR0xfTElHSFQwOgotCQljYXNlIEdMX0xJR0hUMToKLQkJY2FzZSBHTF9MSUdIVDI6Ci0JCWNhc2UgR0xfTElHSFQzOgotCQljYXNlIEdMX0xJR0hUNDoKLQkJY2FzZSBHTF9MSUdIVDU6Ci0JCWNhc2UgR0xfTElHSFQ2OgotCQljYXNlIEdMX0xJR0hUNzoKLQkJCXsKLQkJCXVpbnQzMl90IG1hc2s9MHgxMTw8KDIqKGNhcC1HTF9MSUdIVDApKTsKLQotCQkJaWYgKE5PVVZFQVVfQ0FSRF9VU0lOR19TSEFERVJTKQotCQkJCWJyZWFrOwotCi0JCQlubWVzYS0+ZW5hYmxlZF9saWdodHM9KChubWVzYS0+ZW5hYmxlZF9saWdodHMmbWFzayl8KG1hc2sqc3RhdGUpKTsKLQkJCWlmIChubWVzYS0+bGlnaHRpbmdfZW5hYmxlZCkKLQkJCXsKLQkJCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9FTkFCTEVEX0xJR0hUUywgMSk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEUobm1lc2EtPmVuYWJsZWRfbGlnaHRzKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkJfQotCQljYXNlIEdMX0xJR0hUSU5HOgotCQkJaWYgKE5PVVZFQVVfQ0FSRF9VU0lOR19TSEFERVJTKQotCQkJCWJyZWFrOwotCi0JCQlubWVzYS0+bGlnaHRpbmdfZW5hYmxlZD1zdGF0ZTsKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0VOQUJMRURfTElHSFRTLCAxKTsKLQkJCWlmIChubWVzYS0+bGlnaHRpbmdfZW5hYmxlZCkKLQkJCQlPVVRfUklOR19DQUNIRShubWVzYS0+ZW5hYmxlZF9saWdodHMpOwotCQkJZWxzZQotCQkJCU9VVF9SSU5HX0NBQ0hFKDB4MCk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0xJTkVfU01PT1RIOgotLy8JCWNhc2UgR0xfTElORV9TVElQUExFOgotLy8JCWNhc2UgR0xfTUFQMV9DT0xPUl80OgotLy8JCWNhc2UgR0xfTUFQMV9JTkRFWDoKLS8vCQljYXNlIEdMX01BUDFfTk9STUFMOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzE6Ci0vLwkJY2FzZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMjoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzQ6Ci0vLwkJY2FzZSBHTF9NQVAxX1ZFUlRFWF8zOgotLy8JCWNhc2UgR0xfTUFQMV9WRVJURVhfNDoKLS8vCQljYXNlIEdMX01BUDJfQ09MT1JfNDoKLS8vCQljYXNlIEdMX01BUDJfSU5ERVg6Ci0vLwkJY2FzZSBHTF9NQVAyX05PUk1BTDoKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xOgotLy8JCWNhc2UgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzI6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMzoKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF80OgotLy8JCWNhc2UgR0xfTUFQMl9WRVJURVhfMzoKLS8vCQljYXNlIEdMX01BUDJfVkVSVEVYXzQ6Ci0vLwkJY2FzZSBHTF9NSU5NQVg6Ci0JCWNhc2UgR0xfTk9STUFMSVpFOgotCQkJaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGUgIT0gTlZfNDQpIHsKLQkJCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9OT1JNQUxJWkVfRU5BQkxFLCAxKTsKLQkJCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX1BPSU5UX1NNT09USDoKLQkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9QT0lOVDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX1BPSU5UX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9MSU5FOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfTElORV9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZJTExfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fU01PT1RIOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9TTU9PVEhfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fU1RJUFBMRToKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEU6Ci0vLwkJY2FzZSBHTF9SRVNDQUxFX05PUk1BTDoKLQkJY2FzZSBHTF9TQ0lTU09SX1RFU1Q6Ci0JCQkvKiBObyBlbmFibGUgYml0LCBudjMwU2Npc3NvciB3aWxsIGFkanVzdCB0byBtYXggcmFuZ2UgKi8KLQkJCWN0eC0+RHJpdmVyLlNjaXNzb3IoY3R4LCBjdHgtPlNjaXNzb3IuWCwgY3R4LT5TY2lzc29yLlksCi0JCQkgICAgICAJCQkgY3R4LT5TY2lzc29yLldpZHRoLCBjdHgtPlNjaXNzb3IuSGVpZ2h0KTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfU0VQQVJBQkxFXzJEOgotCQljYXNlIEdMX1NURU5DSUxfVEVTVDoKLQkJCS8vIFRPRE8gQkFDSyBhbmQgRlJPTlQgPwotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1E6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9SOgotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fUzoKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1Q6Ci0vLwkJY2FzZSBHTF9URVhUVVJFXzFEOgotLy8JCWNhc2UgR0xfVEVYVFVSRV8yRDoKLS8vCQljYXNlIEdMX1RFWFRVUkVfM0Q6Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudjMwRm9nZnYoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotewotICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLSAgICBpZiAoTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN3aXRjaChwbmFtZSkKLSAgICB7Ci0gICAgY2FzZSBHTF9GT0dfTU9ERToKLSAgICB7Ci0gICAgICAgIGludCBtb2RlID0gMDsKLSAgICAgICAgLyogVGhlIG1vZGVzIGFyZSBkaWZmZXJlbnQgaW4gR0wgYW5kIHRoZSBjYXJkLiAgKi8KLSAgICAgICAgc3dpdGNoKGN0eC0+Rm9nLk1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBHTF9MSU5FQVI6Ci0gICAgICAgICAgICBtb2RlID0gMHg4MDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTF9FWFA6Ci0gICAgICAgICAgICBtb2RlID0gMHg4MDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTF9FWFAyOgotICAgICAgICAgICAgbW9kZSA9IDB4ODAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfTU9ERSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUgKG1vZGUpOwotCWJyZWFrOwotICAgIH0KLSAgICBjYXNlIEdMX0ZPR19DT0xPUjoKLSAgICB7Ci0JR0x1Ynl0ZSBjWzRdOwotCVVOQ0xBTVBFRF9GTE9BVF9UT19SR0JBX0NIQU4oYyxwYXJhbXMpOwotICAgICAgICBCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9GT0dfQ09MT1IsIDEpOwotICAgICAgICAvKiBudmlkaWEgaWdub3JlcyB0aGUgYWxwaGEgY2hhbm5lbCAqLwotCU9VVF9SSU5HX0NBQ0hFKFBBQ0tfQ09MT1JfODg4OF9SRVYoY1swXSxjWzFdLGNbMl0sY1szXSkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBHTF9GT0dfREVOU0lUWToKLSAgICBjYXNlIEdMX0ZPR19TVEFSVDoKLSAgICBjYXNlIEdMX0ZPR19FTkQ6Ci0gICAgewotICAgICAgICBHTGZsb2F0IGY9MC4sIGM9MC47Ci0gICAgICAgIHN3aXRjaChjdHgtPkZvZy5Nb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgR0xfTElORUFSOgotICAgICAgICAgICAgZiA9IC0xLjAvKGN0eC0+Rm9nLkVuZCAtIGN0eC0+Rm9nLlN0YXJ0KTsKLSAgICAgICAgICAgIGMgPSBjdHgtPkZvZy5TdGFydC8oY3R4LT5Gb2cuRW5kIC0gY3R4LT5Gb2cuU3RhcnQpICsgMi4wMDE5NTM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTF9FWFA6Ci0gICAgICAgICAgICBmID0gLTAuMDkwMTY4KmN0eC0+Rm9nLkRlbnNpdHk7Ci0gICAgICAgICAgICBjID0gMS41OwotICAgICAgICBjYXNlIEdMX0VYUDI6Ci0gICAgICAgICAgICBmID0gLTAuMjEyMzMwKmN0eC0+Rm9nLkRlbnNpdHk7Ci0gICAgICAgICAgICBjID0gMS41OwotICAgICAgICB9Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FUVVBVElPTl9MSU5FQVIsIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRShmKTsKLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfRk9HX0VRVUFUSU9OX0NPTlNUQU5ULCAxKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoYyk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0ZPR19FUVVBVElPTl9RVUFEUkFUSUMsIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgwKTsgLyogSXMgdGhpcyBhbHdheXMgdGhlIHNhbWU/ICovCi0gICAgICAgIGJyZWFrOwotICAgIH0KLS8vICAgIGNhc2UgR0xfRk9HX0NPT1JEX1NSQzoKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0gICAKLXN0YXRpYyB2b2lkIG52MzBIaW50KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKLXsKLQkvLyBUT0RPIEkgbmVlZCBsb3ZlIChmb2cgYW5kIGxpbmVfc21vb3RoIGhpbnRzKQotfQotCi0vLyB2b2lkICgqSW5kZXhNYXNrKShHTGNvbnRleHQgKmN0eCwgR0x1aW50IG1hc2spOwotCi1lbnVtIHsKLQlTUE9UTElHSFRfTk9fVVBEQVRFLAotCVNQT1RMSUdIVF9VUERBVEVfRVhQT05FTlQsCi0JU1BPVExJR0hUX1VQREFURV9ESVJFQ1RJT04sCi0JU1BPVExJR0hUX1VQREFURV9BTEwKLX07Ci0KLXN0YXRpYyB2b2lkIG52MzBMaWdodGZ2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUdMaW50IHAgPSBsaWdodCAtIEdMX0xJR0hUMDsKLQlzdHJ1Y3QgZ2xfbGlnaHQgKmwgPSAmY3R4LT5MaWdodC5MaWdodFtwXTsKLQlpbnQgc3BvdGxpZ2h0X3VwZGF0ZSA9IFNQT1RMSUdIVF9OT19VUERBVEU7Ci0KLQlpZiAoTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpCi0JICAgcmV0dXJuOwotCi0JLyogbm90IHN1cmUgd2hlcmUgdGhlIGZvdXJ0aCBwYXJhbSB2YWx1ZSBnb2VzLi4uKi8KLQlzd2l0Y2gocG5hbWUpCi0JewotCQljYXNlIEdMX0FNQklFTlQ6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfQU1CSUVOVF9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0RJRkZVU0U6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9GUk9OVF9TSURFX1BST0RVQ1RfRElGRlVTRV9SKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQRUNVTEFSOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfRlJPTlRfU0lERV9QUk9EVUNUX1NQRUNVTEFSX1IocCksIDMpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1swXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzFdKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMl0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9TSVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9QT1NJVElPTl9YKHApLCAzKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZihwYXJhbXNbMF0pOwotCQkJT1VUX1JJTkdfQ0FDSEVmKHBhcmFtc1sxXSk7Ci0JCQlPVVRfUklOR19DQUNIRWYocGFyYW1zWzJdKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1NQT1RfRElSRUNUSU9OOgotCQkJc3BvdGxpZ2h0X3VwZGF0ZSA9IFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKLQkJCXNwb3RsaWdodF91cGRhdGUgPSBTUE9UTElHSFRfVVBEQVRFX0VYUE9ORU5UOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfU1BPVF9DVVRPRkY6Ci0JCQlzcG90bGlnaHRfdXBkYXRlID0gU1BPVExJR0hUX1VQREFURV9BTEw7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0NPTlNUQU5UX0FUVEVOVUFUSU9OKHApLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFZigqcGFyYW1zKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0xJR0hUX0xJTkVBUl9BVFRFTlVBVElPTihwKSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRWYoKnBhcmFtcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9RVUFEUkFUSUNfQVRURU5VQVRJT04ocCksIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEVmKCpwYXJhbXMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2goc3BvdGxpZ2h0X3VwZGF0ZSkgewotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRElSRUNUSU9OOgotCQkJewotCQkJCUdMZmxvYXQgeCx5LHo7Ci0JCQkJR0xmbG9hdCBzcG90X2xpZ2h0X2NvZWZfYSA9IDEuMCAvIChsLT5fQ29zQ3V0b2ZmIC0gMS4wKTsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSUdIVF9TUE9UX0RJUl9YKHApLCAzKTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeCk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHkpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih6KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNQT1RMSUdIVF9VUERBVEVfRVhQT05FTlQ6Ci0JCQl7Ci0JCQkJR0xmbG9hdCBjYyxsYyxxYzsKLQkJCQljYyA9IDEuMDsJLyogRklYTUU6IFRoZXNlIG5lZWQgdG8gYmUgY29ycmVjdGx5IGNvbXB1dGVkICovCi0JCQkJbGMgPSAwLjA7Ci0JCQkJcWMgPSAyLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgMyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTUE9UTElHSFRfVVBEQVRFX0FMTDoKLQkJCXsKLQkJCQlHTGZsb2F0IGNjLGxjLHFjLCB4LHkseiwgYzsKLQkJCQlHTGZsb2F0IHNwb3RfbGlnaHRfY29lZl9hID0gMS4wIC8gKGwtPl9Db3NDdXRvZmYgLSAxLjApOwotCQkJCWNjID0gMS4wOwkvKiBGSVhNRTogVGhlc2UgbmVlZCB0byBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgKi8KLQkJCQlsYyA9IDAuMDsKLQkJCQlxYyA9IDIuMDsKLQkJCQl4ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblswXTsKLQkJCQl5ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsxXTsKLQkJCQl6ID0gc3BvdF9saWdodF9jb2VmX2EgKiBsLT5fTm9ybURpcmVjdGlvblsyXTsKLQkJCQljID0gc3BvdF9saWdodF9jb2VmX2EgKyAxLjA7Ci0JCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElHSFRfU1BPVF9DVVRPRkZfQShwKSwgNyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGNjKTsKLQkJCQlPVVRfUklOR19DQUNIRWYobGMpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZihxYyk7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKHgpOwotCQkJCU9VVF9SSU5HX0NBQ0hFZih5KTsKLQkJCQlPVVRfUklOR19DQUNIRWYoeik7Ci0JCQkJT1VUX1JJTkdfQ0FDSEVmKGMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qKiBTZXQgdGhlIGxpZ2h0aW5nIG1vZGVsIHBhcmFtZXRlcnMgKi8KLXZvaWQgKCpMaWdodE1vZGVsZnYpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0KLQotc3RhdGljIHZvaWQgbnYzMExpbmVTdGlwcGxlKEdMY29udGV4dCAqY3R4LCBHTGludCBmYWN0b3IsIEdMdXNob3J0IHBhdHRlcm4gKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfTElORV9TVElQUExFX1BBVFRFUk4sIDEpOwotCU9VVF9SSU5HX0NBQ0hFKChwYXR0ZXJuIDw8IDE2KSB8IGZhY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBMaW5lV2lkdGgoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgd2lkdGgpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlIHViV2lkdGg7Ci0KLQl1YldpZHRoID0gKEdMdWJ5dGUpKHdpZHRoICogOC4wKSAmIDB4RkY7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9MSU5FX1dJRFRIX1NNT09USCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUodWJXaWR0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBMb2dpY09wY29kZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG9wY29kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX0xPR0lDX09QX09QLCAxKTsKLQlPVVRfUklOR19DQUNIRShvcGNvZGUpOwotfQotCi1zdGF0aWMgdm9pZCBudjMwUG9pbnRQYXJhbWV0ZXJmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0JLypUT0RPOiBub3Qgc3VyZSB3aGF0IGdvZXMgaGVyZS4gKi8KLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCQotfQotCi0vKiogU3BlY2lmeSB0aGUgZGlhbWV0ZXIgb2YgcmFzdGVyaXplZCBwb2ludHMgKi8KLXN0YXRpYyB2b2lkIG52MzBQb2ludFNpemUoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgc2l6ZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPSU5UX1NJWkUsIDEpOwotCU9VVF9SSU5HX0NBQ0hFZihzaXplKTsKLX0KLQotLyoqIFNlbGVjdCBhIHBvbHlnb24gcmFzdGVyaXphdGlvbiBtb2RlICovCi1zdGF0aWMgdm9pZCBudjMwUG9seWdvbk1vZGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfRlJPTlQsIDEpOwotCQlPVVRfUklOR19DQUNIRShtb2RlKTsKLQl9Ci0JaWYgKGZhY2UgPT0gR0xfQkFDSyB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fTU9ERV9CQUNLLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci0JfQotfQotCi0vKiogU2V0IHRoZSBzY2FsZSBhbmQgdW5pdHMgdXNlZCB0byBjYWxjdWxhdGUgZGVwdGggdmFsdWVzICovCi1zdGF0aWMgdm9pZCBudjMwUG9seWdvbk9mZnNldChHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiwgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFZihmYWN0b3IpOwotCi0gICAgICAgIC8qIExvb2tzIGxpa2Ugd2UgYWx3YXlzIG11bHRpcGx5IHVuaXRzIGJ5IDIuMC4uLiBhY2NvcmRpbmcgdG8gdGhlIGR1bXBzLiovCi0gICAgICAgIE9VVF9SSU5HX0NBQ0hFZih1bml0cyAqIDIuMCk7Ci19Ci0KLS8qKiBTZXQgdGhlIHBvbHlnb24gc3RpcHBsaW5nIHBhdHRlcm4gKi8KLXN0YXRpYyB2b2lkIG52MzBQb2x5Z29uU3RpcHBsZShHTGNvbnRleHQgKmN0eCwgY29uc3QgR0x1Ynl0ZSAqbWFzayApCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1BPTFlHT05fU1RJUFBMRV9QQVRURVJOKDApLCAzMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFcChtYXNrLCAzMik7Ci19Ci0KLS8qIFNwZWNpZmllcyB0aGUgY3VycmVudCBidWZmZXIgZm9yIHJlYWRpbmcgKi8KLXZvaWQgKCpSZWFkQnVmZmVyKSggR0xjb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIgKTsKLS8qKiBTZXQgcmFzdGVyaXphdGlvbiBtb2RlICovCi12b2lkICgqUmVuZGVyTW9kZSkoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlICk7Ci0KLS8qIFRyYW5zbGF0ZSBHTCBjb29yZHMgdG8gd2luZG93IGNvb3JkcywgY2xhbXBpbmcgdy9oIHRvIHRoZQotICogZGltZW5zaW9ucyBvZiB0aGUgd2luZG93LgotICovCi1zdGF0aWMgdm9pZCBudjMwV2luZG93Q29vcmRzKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLAotCQkJICAgICBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3LCBHTHVpbnQgaCwKLQkJCSAgICAgR0x1aW50ICp3WCwgR0x1aW50ICp3WSwgR0x1aW50ICp3VywgR0x1aW50ICp3SCkKLXsKLQlpZiAoKHgrdykgPiBubWVzYS0+ZHJhd1cpCi0JCXcgPSBubWVzYS0+ZHJhd1cgLSB4OwotCSgqd1gpID0geCArIG5tZXNhLT5kcmF3WDsKLQkoKndXKSA9IHc7Ci0KLQlpZiAoKHkraCkgPiBubWVzYS0+ZHJhd0gpCi0JCWggPSBubWVzYS0+ZHJhd0ggLSB5OwotCSgqd1kpID0gKG5tZXNhLT5kcmF3SCAtIHkpIC0gaCArIG5tZXNhLT5kcmF3WTsKLQkoKndIKSA9IGg7Ci19Ci0KLS8qKiBEZWZpbmUgdGhlIHNjaXNzb3IgYm94ICovCi1zdGF0aWMgdm9pZCBudjMwU2Npc3NvcihHTGNvbnRleHQgKmN0eCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgICAgIG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JR0x1aW50IHdYLCB3WSwgd1csIHdIOwotCi0JLyogVGhlcmUncyBubyBzY2lzc29yIGVuYWJsZSBiaXQsIHNvIGFkanVzdCB0aGUgc2Npc3NvciB0byBjb3ZlciB0aGUKLQkgKiBtYXhpbXVtIGRyYXcgYnVmZmVyIGJvdW5kcwotCSAqLwotCWlmICghY3R4LT5TY2lzc29yLkVuYWJsZWQpIHsKLQkgICB3WCA9IG5tZXNhLT5kcmF3WDsKLQkgICB3WSA9IG5tZXNhLT5kcmF3WTsKLQkgICB3VyA9IG5tZXNhLT5kcmF3VzsKLQkgICB3SCA9IG5tZXNhLT5kcmF3SDsKLQl9IGVsc2UgewotCSAgIG52MzBXaW5kb3dDb29yZHMobm1lc2EsIHgsIHksIHcsIGgsICZ3WCwgJndZLCAmd1csICZ3SCk7Ci0JfQotCi0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NDSVNTT1JfV0lEVEhfWFBPUywgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFICAoKHdXIDw8IDE2KSB8IHdYKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUgICgod0ggPDwgMTYpIHwgd1kpOwotfQotCi0vKiogU2VsZWN0IGZsYXQgb3Igc21vb3RoIHNoYWRpbmcgKi8KLXN0YXRpYyB2b2lkIG52MzBTaGFkZU1vZGVsKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0hBREVfTU9ERUwsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG1vZGUpOwotfQotCi0vKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbEZ1bmMgKi8KLXN0YXRpYyB2b2lkIG52MzBTdGVuY2lsRnVuY1NlcGFyYXRlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsCi0JCUdMaW50IHJlZiwgR0x1aW50IG1hc2spCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWlmIChmYWNlID09IEdMX0ZST05UIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spIHsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9GVU5DX0ZVTkMsIDMpOwotCQlPVVRfUklOR19DQUNIRShmdW5jKTsKLQkJT1VUX1JJTkdfQ0FDSEUocmVmKTsKLQkJT1VUX1JJTkdfQ0FDSEUobWFzayk7Ci0JfQotCWlmIChmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfRlVOQ19GVU5DLCAzKTsKLQkJT1VUX1JJTkdfQ0FDSEUoZnVuYyk7Ci0JCU9VVF9SSU5HX0NBQ0hFKHJlZik7Ci0JCU9VVF9SSU5HX0NBQ0hFKG1hc2spOwotCX0KLX0KLQotLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxNYXNrICovCi1zdGF0aWMgdm9pZCBudjMwU3RlbmNpbE1hc2tTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlpZiAoZmFjZSA9PSBHTF9GUk9OVCB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlJPTlRfTUFTSywgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFKG1hc2spOwotCX0KLQlpZiAoZmFjZSA9PSBHTF9CQUNLIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spIHsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX01BU0ssIDEpOwotCQlPVVRfUklOR19DQUNIRShtYXNrKTsKLQl9Ci19Ci0KLS8qKiBPcGVuR0wgMi4wIHR3by1zaWRlZCBTdGVuY2lsT3AgKi8KLXN0YXRpYyB2b2lkIG52MzBTdGVuY2lsT3BTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLAotCQlHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX09QX0ZBSUwsIDMpOwotCQlPVVRfUklOR19DQUNIRShmYWlsKTsKLQkJT1VUX1JJTkdfQ0FDSEUoemZhaWwpOwotCQlPVVRfUklOR19DQUNIRSh6cGFzcyk7Ci0JfQotCWlmIChmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfT1BfRkFJTCwgMyk7Ci0JCU9VVF9SSU5HX0NBQ0hFKGZhaWwpOwotCQlPVVRfUklOR19DQUNIRSh6ZmFpbCk7Ci0JCU9VVF9SSU5HX0NBQ0hFKHpwYXNzKTsKLQl9Ci19Ci0KLS8qKiBDb250cm9sIHRoZSBnZW5lcmF0aW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMgKi8KLXZvaWQgKCpUZXhHZW4pKEdMY29udGV4dCAqY3R4LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwKLQkJY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLS8qKiBTZXQgdGV4dHVyZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzICovCi12b2lkICgqVGV4RW52KShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAotCQljb25zdCBHTGZsb2F0ICpwYXJhbSk7Ci0vKiogU2V0IHRleHR1cmUgcGFyYW1ldGVycyAqLwotdm9pZCAoKlRleFBhcmFtZXRlcikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCi0JCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQlHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0KLXN0YXRpYyB2b2lkIG52MzBUZXh0dXJlTWF0cml4KEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCwgY29uc3QgR0xtYXRyaXggKm1hdCkKLXsKLSAgICAgICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWlmICghTk9VVkVBVV9DQVJEX1VTSU5HX1NIQURFUlMpIHsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELAotCQkJCSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVFhfTUFUUklYKHVuaXQsIDApLCAxNik7Ci0JCS8qWFhYOiBUaGlzIFNIT1VMRCB3b3JrLiovCi0JCU9VVF9SSU5HX0NBQ0hFcChtYXQtPm0sIDE2KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG52MzBXaW5kb3dNb3ZlZChub3V2ZWF1Q29udGV4dFB0ciBubWVzYSkKLXsKLQlHTGNvbnRleHQgKmN0eCA9IG5tZXNhLT5nbEN0eDsKLQlHTGZsb2F0ICp2ID0gbm1lc2EtPnZpZXdwb3J0Lm07Ci0JR0x1aW50IHdYLCB3WSwgd1csIHdIOwotCi0JbnYzMFdpbmRvd0Nvb3JkcyhubWVzYSwgY3R4LT5WaWV3cG9ydC5YLCBjdHgtPlZpZXdwb3J0LlksIAotCQkJCWN0eC0+Vmlld3BvcnQuV2lkdGgsIGN0eC0+Vmlld3BvcnQuSGVpZ2h0LAotCQkJCSZ3WCwgJndZLCAmd1csICZ3SCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0RJTVNfMCwgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFICAoKHdXIDw8IDE2KSB8IHdYKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUgICgod0ggPDwgMTYpIHwgd1kpOwotCi0JLyogc29tZXRoaW5nIHRvIGRvIHdpdGggY2xlYXJzLCBwb3NzaWJseSBkb2Vzbid0IGJlbG9uZyBoZXJlICovCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELAotCSAgICAgIE5WMzBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DT0xPUl9CVUZGRVJfT0ZTMCwgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCgobm1lc2EtPmRyYXdYICsgbm1lc2EtPmRyYXdXKSA8PCAxNikgfCBubWVzYS0+ZHJhd1gpOwotICAgICAgICBPVVRfUklOR19DQUNIRSgoKG5tZXNhLT5kcmF3WSArIG5tZXNhLT5kcmF3SCkgPDwgMTYpIHwgbm1lc2EtPmRyYXdZKTsKLQotCS8qIHZpZXdwb3J0IHRyYW5zZm9ybSAqLwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX1hGUk1fT1gsIDgpOwotCU9VVF9SSU5HX0NBQ0hFZiAodltNQVRfVFhdKTsKLQlPVVRfUklOR19DQUNIRWYgKHZbTUFUX1RZXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmICh2W01BVF9UWl0pOwotCU9VVF9SSU5HX0NBQ0hFZiAoMC4wKTsKLQlPVVRfUklOR19DQUNIRWYgKHZbTUFUX1NYXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmICh2W01BVF9TWV0pOwotCU9VVF9SSU5HX0NBQ0hFZiAodltNQVRfU1pdKTsKLQlPVVRfUklOR19DQUNIRWYgKDAuMCk7Ci0KLQljdHgtPkRyaXZlci5TY2lzc29yKGN0eCwgY3R4LT5TY2lzc29yLlgsIGN0eC0+U2Npc3Nvci5ZLAotCSAgICAgIAkJICAgIGN0eC0+U2Npc3Nvci5XaWR0aCwgY3R4LT5TY2lzc29yLkhlaWdodCk7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gbnYzMEluaXRDYXJkKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotCWludCBpOwotCW5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm1lc2EsIE52U3ViM0QsIE52M0QpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMSwgMyk7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JT1VUX1JJTkcoTnZEbWFUVCk7Ci0gICAgICAgIE9VVF9SSU5HKE52RG1hRkIpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDgsIDEpOwotCU9VVF9SSU5HKE52RG1hRkIpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVDQsIDIpOwotCU9VVF9SSU5HKE52RG1hRkIpOwotCU9VVF9SSU5HKE52RG1hRkIpOwotICAgICAgICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxYjAsIDEpOyAvKiBTRVRfT0JKRUNUOEIqLwotICAgICAgICBPVVRfUklORyhOdkRtYUZCKTsKLQotICAgICAgICBmb3IoaSA9IDB4MmM4OyBpIDw9IDB4MmZjOyBpICs9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBpLCAxKTsKLSAgICAgICAgICAgIE9VVF9SSU5HKDB4MCk7Ci0gICAgICAgIH0KLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDAyMjAsIDEpOwotCU9VVF9SSU5HKDEpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MDNiMCwgMSk7Ci0JT1VUX1JJTkcoMHgwMDEwMDAwMCk7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTQ1NCwgMSk7Ci0JT1VUX1JJTkcoMCk7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MWQ4MCwgMSk7Ci0JT1VUX1JJTkcoMyk7Ci0JCi0JLyogTkVXICovCi0gICAgICAgCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFlOTgsIDEpOwotICAgICAgICBPVVRfUklORygwKTsKLSAgICAgICAgQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTdlMCwgMyk7Ci0gICAgICAgIE9VVF9SSU5HKDApOwotICAgICAgICBPVVRfUklORygwKTsKLSAgICAgICAgT1VUX1JJTkcoMHgzZjgwMDAwMCk7Ci0gICAgICAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFmODAsIDE2KTsKLSAgICAgICAgT1VUX1JJTkcoMCk7IE9VVF9SSU5HKDApOyBPVVRfUklORygwKTsgT1VUX1JJTkcoMCk7IAotICAgICAgICBPVVRfUklORygwKTsgT1VUX1JJTkcoMCk7IE9VVF9SSU5HKDApOyBPVVRfUklORygwKTsgCi0gICAgICAgIE9VVF9SSU5HKDB4MDAwMGZmZmYpOwotICAgICAgICBPVVRfUklORygwKTsgT1VUX1JJTkcoMCk7IE9VVF9SSU5HKDApOyBPVVRfUklORygwKTsgCi0gICAgICAgIE9VVF9SSU5HKDApOyBPVVRfUklORygwKTsgT1VUX1JJTkcoMCk7IAotLyoKLSAgICAgICAgQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTAwLCAyKTsKLSAgICAgICAgT1VUX1JJTkcoMCk7Ci0gICAgICAgIE9VVF9SSU5HKDApOwotKi8KLSAgICAgICAgQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MTIwLCAzKTsKLSAgICAgICAgT1VUX1JJTkcoMCk7Ci0gICAgICAgIE9VVF9SSU5HKDEpOwotICAgICAgICBPVVRfUklORygyKTsKLQotICAgICAgICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZDg4LCAxKTsKLSAgICAgICAgT1VUX1JJTkcoMHgwMDAwMTIwMCk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1JDX0VOQUJMRSwgMSk7Ci0JT1VUX1JJTkcgICAgICAgKDApOwotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gbnY0MEluaXRDYXJkKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhKQotewotCW5vdXZlYXVPYmplY3RPblN1YmNoYW5uZWwobm1lc2EsIE52U3ViM0QsIE52M0QpOwotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUMSwgMik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUOCwgMSk7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUNCwgMik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JT1VUX1JJTkcoTnZEbWFGQik7Ci0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIDB4MDIyMCwgMSk7Ci0JT1VUX1JJTkcoMSk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZWE0LCAzKTsKLQlPVVRfUklORygweDAwMDAwMDEwKTsKLQlPVVRfUklORygweDAxMDAwMTAwKTsKLQlPVVRfUklORygweGZmODAwMDA2KTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZmM0LCAxKTsKLQlPVVRfUklORygweDA2MTQ0MzIxKTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZmM4LCAyKTsKLQlPVVRfUklORygweGVkY2JhOTg3KTsKLQlPVVRfUklORygweDAwMDAwMDIxKTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZmQwLCAxKTsKLQlPVVRfUklORygweDAwMTcxNjE1KTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxZmQ0LCAxKTsKLQlPVVRfUklORygweDAwMWIxYTE5KTsKLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFlZjgsIDEpOwotCU9VVF9SSU5HKDB4MDAyMGZmZmYpOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFkNjQsIDEpOwotCU9VVF9SSU5HKDB4MDBkMzAwMDApOwotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDFlOTQsIDEpOwotCU9VVF9SSU5HKDB4MDAwMDAwMDEpOwotCi0JcmV0dXJuIEdMX1RSVUU7Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gbnYzMEJpbmRCdWZmZXJzKG5vdXZlYXVDb250ZXh0UHRyIG5tZXNhLCBpbnQgbnVtX2NvbG9yLAotCQlub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqKmNvbG9yLAotCQlub3V2ZWF1X3JlbmRlcmJ1ZmZlciAqZGVwdGgpCi17Ci0JR0x1aW50IHgsIHksIHcsIGg7Ci0KLQl3ID0gY29sb3JbMF0tPm1lc2EuV2lkdGg7Ci0JaCA9IGNvbG9yWzBdLT5tZXNhLkhlaWdodDsKLQl4ID0gbm1lc2EtPmRyYXdYOwotCXkgPSBubWVzYS0+ZHJhd1k7Ci0KLQlpZiAobnVtX2NvbG9yICE9IDEpCi0JCXJldHVybiBHTF9GQUxTRTsKLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZJRVdQT1JUX0NPTE9SX0JVRkZFUl9ESU0wLCA1KTsKLQlPVVRfUklORyAgICAgICAgKCgodyt4KTw8MTYpfHgpOwotCU9VVF9SSU5HICAgICAgICAoKChoK3kpPDwxNil8eSk7Ci0JaWYgKGNvbG9yWzBdLT5tZXNhLl9BY3R1YWxGb3JtYXQgPT0gR0xfUkdCQTgpCi0JCU9VVF9SSU5HICAgICAgICAoMHgxNDgpOwotCWVsc2UKLQkJT1VUX1JJTkcgICAgICAgICgweDE0Myk7Ci0JaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGUgPj0gTlZfNDApCi0JCU9VVF9SSU5HICAgICAgICAoY29sb3JbMF0tPnBpdGNoKTsKLQllbHNlCi0JCU9VVF9SSU5HICAgICAgICAoY29sb3JbMF0tPnBpdGNoIHwgKGRlcHRoID8gKGRlcHRoLT5waXRjaCA8PCAxNik6IDApKTsKLQlPVVRfUklORyAgICAgICAgKGNvbG9yWzBdLT5vZmZzZXQpOwotCi0JaWYgKGRlcHRoKSB7Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfREVQVEhfT0ZGU0VULCAxKTsKLQkJT1VUX1JJTkcgICAgICAgIChkZXB0aC0+b2Zmc2V0KTsKLQkJaWYgKG5tZXNhLT5zY3JlZW4tPmNhcmQtPnR5cGUgPj0gTlZfNDApIHsKLQkJCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfTE1BX0RFUFRIX0JVRkZFUl9QSVRDSCwgMSk7Ci0JCQlPVVRfUklORyAgICAgICAgKGRlcHRoLT5waXRjaCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gR0xfVFJVRTsKLX0KLQotdm9pZCBudjMwSW5pdFN0YXRlRnVuY3MoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuYykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JZnVuYy0+QWxwaGFGdW5jCQkJPSBudjMwQWxwaGFGdW5jOwotCWZ1bmMtPkJsZW5kQ29sb3IJCT0gbnYzMEJsZW5kQ29sb3I7Ci0JZnVuYy0+QmxlbmRFcXVhdGlvblNlcGFyYXRlCT0gbnYzMEJsZW5kRXF1YXRpb25TZXBhcmF0ZTsKLQlmdW5jLT5CbGVuZEZ1bmNTZXBhcmF0ZQkJPSBudjMwQmxlbmRGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+Q2xlYXIJCQk9IG52MzBDbGVhcjsKLQlmdW5jLT5DbGVhckNvbG9yCQk9IG52MzBDbGVhckNvbG9yOwotCWZ1bmMtPkNsZWFyRGVwdGgJCT0gbnYzMENsZWFyRGVwdGg7Ci0JZnVuYy0+Q2xlYXJTdGVuY2lsCQk9IG52MzBDbGVhclN0ZW5jaWw7Ci0JZnVuYy0+Q2xpcFBsYW5lCQkJPSBudjMwQ2xpcFBsYW5lOwotCWZ1bmMtPkNvbG9yTWFzawkJCT0gbnYzMENvbG9yTWFzazsKLQlmdW5jLT5Db2xvck1hdGVyaWFsCQk9IG52MzBDb2xvck1hdGVyaWFsOwotCWZ1bmMtPkN1bGxGYWNlCQkJPSBudjMwQ3VsbEZhY2U7Ci0JZnVuYy0+RnJvbnRGYWNlCQkJPSBudjMwRnJvbnRGYWNlOwotCWZ1bmMtPkRlcHRoRnVuYwkJCT0gbnYzMERlcHRoRnVuYzsKLQlmdW5jLT5EZXB0aE1hc2sJCQk9IG52MzBEZXB0aE1hc2s7Ci0JZnVuYy0+RGVwdGhSYW5nZSAgICAgICAgICAgICAgICA9IG52MzBEZXB0aFJhbmdlOwotCWZ1bmMtPkVuYWJsZQkJCT0gbnYzMEVuYWJsZTsKLQlmdW5jLT5Gb2dmdgkJCT0gbnYzMEZvZ2Z2OwotCWZ1bmMtPkhpbnQJCQk9IG52MzBIaW50OwotCWZ1bmMtPkxpZ2h0ZnYJCQk9IG52MzBMaWdodGZ2OwotLyoJZnVuYy0+TGlnaHRNb2RlbGZ2CQk9IG52MzBMaWdodE1vZGVsZnY7ICovCi0JZnVuYy0+TGluZVN0aXBwbGUJCT0gbnYzMExpbmVTdGlwcGxlOwotCWZ1bmMtPkxpbmVXaWR0aAkJCT0gbnYzMExpbmVXaWR0aDsKLQlmdW5jLT5Mb2dpY09wY29kZQkJPSBudjMwTG9naWNPcGNvZGU7Ci0JZnVuYy0+UG9pbnRQYXJhbWV0ZXJmdgkJPSBudjMwUG9pbnRQYXJhbWV0ZXJmdjsKLQlmdW5jLT5Qb2ludFNpemUJCQk9IG52MzBQb2ludFNpemU7Ci0JZnVuYy0+UG9seWdvbk1vZGUJCT0gbnYzMFBvbHlnb25Nb2RlOwotCWZ1bmMtPlBvbHlnb25PZmZzZXQJCT0gbnYzMFBvbHlnb25PZmZzZXQ7Ci0JZnVuYy0+UG9seWdvblN0aXBwbGUJCT0gbnYzMFBvbHlnb25TdGlwcGxlOwotI2lmIDAKLQlmdW5jLT5SZWFkQnVmZmVyCQk9IG52MzBSZWFkQnVmZmVyOwotCWZ1bmMtPlJlbmRlck1vZGUJCT0gbnYzMFJlbmRlck1vZGU7Ci0jZW5kaWYKLQlmdW5jLT5TY2lzc29yCQkJPSBudjMwU2Npc3NvcjsKLQlmdW5jLT5TaGFkZU1vZGVsCQk9IG52MzBTaGFkZU1vZGVsOwotCWZ1bmMtPlN0ZW5jaWxGdW5jU2VwYXJhdGUJPSBudjMwU3RlbmNpbEZ1bmNTZXBhcmF0ZTsKLQlmdW5jLT5TdGVuY2lsTWFza1NlcGFyYXRlCT0gbnYzMFN0ZW5jaWxNYXNrU2VwYXJhdGU7Ci0JZnVuYy0+U3RlbmNpbE9wU2VwYXJhdGUJCT0gbnYzMFN0ZW5jaWxPcFNlcGFyYXRlOwotI2lmIDAKLQlmdW5jLT5UZXhHZW4JCQk9IG52MzBUZXhHZW47Ci0JZnVuYy0+VGV4UGFyYW1ldGVyCQk9IG52MzBUZXhQYXJhbWV0ZXI7Ci0jZW5kaWYKLQlmdW5jLT5UZXh0dXJlTWF0cml4CQk9IG52MzBUZXh0dXJlTWF0cml4OwotCi0KLQlpZiAobm1lc2EtPnNjcmVlbi0+Y2FyZC0+dHlwZSA+PSBOVl80MCkKLQkgICBubWVzYS0+aHdfZnVuYy5Jbml0Q2FyZAk9IG52NDBJbml0Q2FyZDsKLQllbHNlIAotCSAgIG5tZXNhLT5od19mdW5jLkluaXRDYXJkCT0gbnYzMEluaXRDYXJkOwotCW5tZXNhLT5od19mdW5jLkJpbmRCdWZmZXJzCT0gbnYzMEJpbmRCdWZmZXJzOwotCW5tZXNhLT5od19mdW5jLldpbmRvd01vdmVkCT0gbnYzMFdpbmRvd01vdmVkOwotfQotCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252MzBfdmVydHByb2cuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF92ZXJ0cHJvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDIzZTg0Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnYzMF92ZXJ0cHJvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLSNpbmNsdWRlICJub3V2ZWF1X2NvbnRleHQuaCIKLSNpbmNsdWRlICJub3V2ZWF1X29iamVjdC5oIgotI2luY2x1ZGUgIm5vdXZlYXVfZmlmby5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCi0KLSNpbmNsdWRlICJub3V2ZWF1X3NoYWRlci5oIgotI2luY2x1ZGUgIm52MzBfc2hhZGVyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3VwcG9ydCByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZAotTlYzMFZQVXBsb2FkVG9IVyhHTGNvbnRleHQgKmN0eCwgbm91dmVhdVNoYWRlciAqbnZzKQotewotICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLSAgIGludCBpOwotCi0gICAvKiBXZSBjYW4gZG8gYmV0dGVyIGhlcmUgYW5kIGtlZXAgbW9yZSB0aGFuIG9uZSBWUCBvbiB0aGUgaGFyZHdhcmUsIGFuZAotICAgICogc3dpdGNoIGJldHdlZW4gdGhlbSB3aXRoIFBST0dSQU1fU1RBUlRfSUQuLgotICAgICovCi0gICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9GUk9NX0lELCAxKTsKLSAgIE9VVF9SSU5HKDApOwotICAgZm9yIChpPTA7IGk8bnZzLT5wcm9ncmFtX3NpemU7IGkrPTQpIHsKLSAgICAgIEJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfVVBMT0FEX0lOU1QwLCA0KTsKLSAgICAgIE9VVF9SSU5HKG52cy0+cHJvZ3JhbVtpICsgMF0pOwotICAgICAgT1VUX1JJTkcobnZzLT5wcm9ncmFtW2kgKyAxXSk7Ci0gICAgICBPVVRfUklORyhudnMtPnByb2dyYW1baSArIDJdKTsKLSAgICAgIE9VVF9SSU5HKG52cy0+cHJvZ3JhbVtpICsgM10pOwotICAgfQotICAgQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9QUk9HUkFNX1NUQVJUX0lELCAxKTsKLSAgIE9VVF9SSU5HKDApOwotCi0gICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX0lOX1JFRywgMik7Ci0gICBPVVRfUklORyhudnMtPmNhcmRfcHJpdi5OVjMwVlAudnBfaW5fcmVnKTsKLSAgIE9VVF9SSU5HKG52cy0+Y2FyZF9wcml2Lk5WMzBWUC52cF9vdXRfcmVnKTsKLQotICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjMwX1RDTF9QUklNSVRJVkVfM0RfU0VUX0NMSVBQSU5HX1BMQU5FUywgMSk7Ci0gICBPVVRfUklOR19DQUNIRSAgKG52cy0+Y2FyZF9wcml2Lk5WMzBWUC5jbGlwX2VuYWJsZXMpOwotfQotCi1zdGF0aWMgdm9pZAotTlYzMFZQVXBkYXRlQ29uc3QoR0xjb250ZXh0ICpjdHgsIG5vdXZlYXVTaGFkZXIgKm52cywgaW50IGlkKQotewotICAgbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLSAgIEdMZmxvYXQgKnZhbDsKLQotICAgdmFsID0gbnZzLT5wYXJhbXNbaWRdLnNvdXJjZV92YWwgPwotICAgICAgbnZzLT5wYXJhbXNbaWRdLnNvdXJjZV92YWwgOiBudnMtPnBhcmFtc1tpZF0udmFsOwotCi0gICBCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX1VQTE9BRF9DT05TVF9JRCwgNSk7Ci0gICBPVVRfUklORyAoaWQpOwotICAgT1VUX1JJTkdwKHZhbCwgNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXNzZW1ibHkgcm91dGluZXMKLSAqLwotc3RhdGljIHZvaWQKLU5WMzBWUFNldEJyYW5jaFRhcmdldChudnNGdW5jICpzaGFkZXIsIGludCBhZGRyKQotewotCXNoYWRlci0+aW5zdFsyXSAmPSB+TlYzMF9WUF9JTlNUX0lBRERSX01BU0s7Ci0Jc2hhZGVyLT5pbnN0WzJdIHw9IChhZGRyIDw8IE5WMzBfVlBfSU5TVF9JQUREUl9TSElGVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGlzYXNzZW1ibHkgcm91dGluZXMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludAotTlYzMFZQR2V0T3Bjb2RlSFcobnZzRnVuYyAqIHNoYWRlciwgaW50IHNsb3QpCi17Ci0gICBpbnQgb3A7Ci0KLSAgIGlmIChzbG90KSB7Ci0gICAgICBvcCA9IChzaGFkZXItPmluc3RbMV0gJiBOVjMwX1ZQX0lOU1RfU0NBX09QQ09ERUxfTUFTSykKLQkgPj4gTlYzMF9WUF9JTlNUX1NDQV9PUENPREVMX1NISUZUOwotICAgICAgb3AgfD0gKChzaGFkZXItPmluc3RbMF0gJiBOVjMwX1ZQX0lOU1RfU0NBX09QQ09ERUhfTUFTSykKLQkgICAgID4+IE5WMzBfVlBfSU5TVF9TQ0FfT1BDT0RFSF9TSElGVCkgPDwgNDsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgb3AgPSAoc2hhZGVyLT5pbnN0WzFdICYgTlYzMF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSykKLQkgPj4gTlYzMF9WUF9JTlNUX1ZFQ19PUENPREVfU0hJRlQ7Ci0gICB9Ci0KLSAgIHJldHVybiBvcDsKLX0KLQotc3RhdGljIG52c1JlZ0ZpbGUKLU5WMzBWUEdldERlc3RGaWxlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBzd2l0Y2ggKHNoYWRlci0+R2V0T3Bjb2RlKHNoYWRlciwgbWVyZ2VkKSkgewotICAgY2FzZSBOVlNfT1BfQVJMOgotICAgY2FzZSBOVlNfT1BfQVJSOgotICAgY2FzZSBOVlNfT1BfQVJBOgotICAgICAgcmV0dXJuIE5WU19GSUxFX0FERFJFU1M7Ci0gICBkZWZhdWx0OgotICAgICAgLypGSVhNRTogVGhpcyBwcm9iYWJseSBpc24ndCBjb3JyZWN0Li4gKi8KLSAgICAgIGlmICgoc2hhZGVyLT5pbnN0WzNdICYgTlYzMF9WUF9JTlNUX1ZERVNUX1dSSVRFTUFTS19NQVNLKSAhPSAwKQotCSByZXR1cm4gTlZTX0ZJTEVfUkVTVUxUOwotICAgICAgaWYgKChzaGFkZXItPmluc3RbM10gJiBOVjMwX1ZQX0lOU1RfU0RFU1RfV1JJVEVNQVNLX01BU0spICE9IDApCi0JIHJldHVybiBOVlNfRklMRV9SRVNVTFQ7Ci0gICAgICByZXR1cm4gTlZTX0ZJTEVfVEVNUDsKLSAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotTlYzMFZQR2V0RGVzdElEKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBpbnQgaWQ7Ci0KLSAgIHN3aXRjaCAoc2hhZGVyLT5HZXREZXN0RmlsZShzaGFkZXIsIG1lcmdlZCkpIHsKLSAgIGNhc2UgTlZTX0ZJTEVfUkVTVUxUOgotICAgICAgaWQgPSAoKHNoYWRlci0+aW5zdFszXSAmIE5WMzBfVlBfSU5TVF9ERVNUX0lEX01BU0spCi0JICAgID4+IE5WMzBfVlBfSU5TVF9ERVNUX0lEX1NISUZUKTsKLSAgICAgIHN3aXRjaCAoaWQpIHsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0RFU1RfUE9TICA6IHJldHVybiBOVlNfRlJfUE9TSVRJT047Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9ERVNUX0NPTDAgOiByZXR1cm4gTlZTX0ZSX0NPTDA7Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9ERVNUX0NPTDEgOiByZXR1cm4gTlZTX0ZSX0NPTDE7Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9ERVNUX1RDKDApOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMDsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0RFU1RfVEMoMSk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQxOwotICAgICAgY2FzZSBOVjMwX1ZQX0lOU1RfREVTVF9UQygyKTogcmV0dXJuIE5WU19GUl9URVhDT09SRDI7Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9ERVNUX1RDKDMpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMzsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0RFU1RfVEMoNCk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ0OwotICAgICAgY2FzZSBOVjMwX1ZQX0lOU1RfREVTVF9UQyg1KTogcmV0dXJuIE5WU19GUl9URVhDT09SRDU7Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9ERVNUX1RDKDYpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENjsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0RFU1RfVEMoNyk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ3OwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIC0xOwotICAgICAgfQotICAgY2FzZSBOVlNfRklMRV9BRERSRVNTOgotICAgY2FzZSBOVlNfRklMRV9URU1QOgotICAgICAgcmV0dXJuIChzaGFkZXItPmluc3RbMF0gJiBOVjMwX1ZQX0lOU1RfREVTVF9URU1QX0lEX01BU0spCi0JID4+IE5WMzBfVlBfSU5TVF9ERVNUX1RFTVBfSURfU0hJRlQ7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC0xOwotICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjMwVlBHZXREZXN0TWFzayhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkKQotewotICAgaW50IGh3bWFzaywgbWFzayA9IDA7Ci0KLSAgIGlmIChzaGFkZXItPkdldERlc3RGaWxlKHNoYWRlciwgbWVyZ2VkKSA9PSBOVlNfRklMRV9SRVNVTFQpCi0gICAgICBpZiAoc2hhZGVyLT5HZXRPcGNvZGVTbG90KHNoYWRlciwgbWVyZ2VkKSkKLQkgaHdtYXNrID0gKHNoYWRlci0+aW5zdFszXSAmIE5WMzBfVlBfSU5TVF9TREVTVF9XUklURU1BU0tfTUFTSykKLQkgICAgPj4gTlYzMF9WUF9JTlNUX1NERVNUX1dSSVRFTUFTS19TSElGVDsKLSAgICAgIGVsc2UKLQkgaHdtYXNrID0gKHNoYWRlci0+aW5zdFszXSAmIE5WMzBfVlBfSU5TVF9WREVTVF9XUklURU1BU0tfTUFTSykKLQkgICAgPj4gTlYzMF9WUF9JTlNUX1ZERVNUX1dSSVRFTUFTS19TSElGVDsKLSAgIGVsc2UgaWYgKHNoYWRlci0+R2V0T3Bjb2RlU2xvdChzaGFkZXIsIG1lcmdlZCkpCi0gICAgICBod21hc2sgPSAoc2hhZGVyLT5pbnN0WzNdICYgTlYzMF9WUF9JTlNUX1NURU1QX1dSSVRFTUFTS19NQVNLKQotCSA+PiBOVjMwX1ZQX0lOU1RfU1RFTVBfV1JJVEVNQVNLX1NISUZUOwotICAgZWxzZQotICAgICAgaHdtYXNrID0gKHNoYWRlci0+aW5zdFszXSAmIE5WMzBfVlBfSU5TVF9WVEVNUF9XUklURU1BU0tfTUFTSykKLQkgPj4gTlYzMF9WUF9JTlNUX1ZURU1QX1dSSVRFTUFTS19TSElGVDsKLQotICAgaWYgKGh3bWFzayAmICgxIDw8IDMpKSBtYXNrIHw9IFNNQVNLX1g7Ci0gICBpZiAoaHdtYXNrICYgKDEgPDwgMikpIG1hc2sgfD0gU01BU0tfWTsKLSAgIGlmIChod21hc2sgJiAoMSA8PCAxKSkgbWFzayB8PSBTTUFTS19aOwotICAgaWYgKGh3bWFzayAmICgxIDw8IDApKSBtYXNrIHw9IFNNQVNLX1c7Ci0KLSAgIHJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgaW50Ci1OVjMwVlBHZXRTb3VyY2VJRChudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgdW5zaWduZWQgaW50IHNyYzsKLQotICAgc3dpdGNoIChzaGFkZXItPkdldFNvdXJjZUZpbGUoc2hhZGVyLCBtZXJnZWQsIHBvcykpIHsKLSAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLSAgICAgIHNyYyA9IHNoYWRlci0+R2V0U291cmNlSFcoc2hhZGVyLCBtZXJnZWQsIHBvcyk7Ci0gICAgICByZXR1cm4gKChzcmMgJiBOVjMwX1ZQX1NSQ19SRUdfVEVNUF9JRF9NQVNLKSA+PgotCSAgICAgIE5WMzBfVlBfU1JDX1JFR19URU1QX0lEX1NISUZUKTsKLSAgIGNhc2UgTlZTX0ZJTEVfQ09OU1Q6Ci0gICAgICByZXR1cm4gKChzaGFkZXItPmluc3RbMV0gJiBOVjMwX1ZQX0lOU1RfQ09OU1RfU1JDX01BU0spCi0JICAgICAgPj4gTlYzMF9WUF9JTlNUX0NPTlNUX1NSQ19TSElGVCk7Ci0gICBjYXNlIE5WU19GSUxFX0FUVFJJQjoKLSAgICAgIHNyYyA9ICgoc2hhZGVyLT5pbnN0WzFdICYgTlYzMF9WUF9JTlNUX0lOUFVUX1NSQ19NQVNLKQotCSAgICAgPj4gTlYzMF9WUF9JTlNUX0lOUFVUX1NSQ19TSElGVCk7Ci0gICAgICBzd2l0Y2ggKHNyYykgewotICAgICAgY2FzZSBOVjMwX1ZQX0lOU1RfSU5fUE9TICA6IHJldHVybiBOVlNfRlJfUE9TSVRJT047Ci0gICAgICBjYXNlIE5WMzBfVlBfSU5TVF9JTl9DT0wwIDogcmV0dXJuIE5WU19GUl9DT0wwOwotICAgICAgY2FzZSBOVjMwX1ZQX0lOU1RfSU5fQ09MMSA6IHJldHVybiBOVlNfRlJfQ09MMTsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDApOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMDsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDEpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMTsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDIpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMjsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDMpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMzsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDQpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENDsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDUpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENTsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDYpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENjsKLSAgICAgIGNhc2UgTlYzMF9WUF9JTlNUX0lOX1RDKDcpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENzsKLSAgICAgIGRlZmF1bHQ6Ci0JIHJldHVybiBOVlNfRlJfVU5LTk9XTjsKLSAgICAgIH0KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBWUEdldFNvdXJjZUFicyhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgc3RydWN0IF9vcF94bGF0ICpvcHI7Ci0gICBzdGF0aWMgdW5zaWduZWQgaW50IGFic3Bvc1szXSA9IHsKLSAgICAgIE5WMzBfVlBfSU5TVF9TUkMwX0FCUywKLSAgICAgIE5WMzBfVlBfSU5TVF9TUkMxX0FCUywKLSAgICAgIE5WMzBfVlBfSU5TVF9TUkMyX0FCUywKLSAgIH07Ci0KLSAgIG9wciA9IHNoYWRlci0+R2V0T1BUWFJlYyhzaGFkZXIsIG1lcmdlZCk7Ci0gICBpZiAoIW9wciB8fCBvcHItPnNyY3Bvc1twb3NdID09IC0xIHx8IG9wci0+c3JjcG9zW3Bvc10gPiAyKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIHJldHVybiAoKHNoYWRlci0+aW5zdFswXSAmIGFic3Bvc1tvcHItPnNyY3Bvc1twb3NdXSkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBWUEdldFJlbEFkZHJlc3NSZWdJRChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9WUF9JTlNUX0FERFJfUkVHX1NFTEVDVF8xKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIG52c1N3ekNvbXAKLU5WMzBWUEdldFJlbEFkZHJlc3NTd2l6emxlKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBudnNTd3pDb21wIHN3ejsKLQotICAgc3d6ID0gTlYyMFZQX1RYX1NXSVpaTEVbKHNoYWRlci0+aW5zdFswXSAmIE5WMzBfVlBfSU5TVF9BRERSX1NXWl9NQVNLKQotCQkJICAgPj4gTlYzMF9WUF9JTlNUX0FERFJfU1daX1NISUZUXTsKLSAgIHJldHVybiBzd3o7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBWUFN1cHBvcnRzQ29uZGl0aW9uYWwobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIC8qRklYTUU6IElzIHRoaXMgdHJ1ZSBvZiBhbGwgb3BzPyAqLwotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBWUEdldENvbmRpdGlvblVwZGF0ZShudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9WUF9JTlNUX0NPTkRfVVBEQVRFX0VOQUJMRSkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WMzBWUEdldENvbmRpdGlvblRlc3QobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIGludCBvcDsKLQotICAgLyogVGhlIGNvbmRpdGlvbiB0ZXN0IGlzIHVuY29uZGl0aW9uYWxseSBlbmFibGVkIG9uIHNvbWUKLSAgICAqIGluc3RydWN0aW9ucy4gaWU6IHRoZSBjb25kaXRpb24gdGVzdCBiaXQgZG9lcyAqTk9UKiBoYXZlCi0gICAgKiB0byBiZSBzZXQuCi0gICAgKgotICAgICogRklYTUU6IGNoZWNrIG90aGVyIHJlbGV2YW50IG9wcyBmb3IgdGhpcyBzaXR1YXRpb24uCi0gICAgKi8KLSAgIG9wID0gc2hhZGVyLT5HZXRPcGNvZGVIVyhzaGFkZXIsIDEpOwotICAgc3dpdGNoIChvcCkgewotICAgY2FzZSBOVjMwX1ZQX0lOU1RfT1BfQlJBOgotICAgICAgcmV0dXJuIDE7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9WUF9JTlNUX0NPTkRfVEVTVF9FTkFCTEUpID8gMSA6IDApOwotICAgfQotfQotCi1zdGF0aWMgbnZzQ29uZAotTlYzMFZQR2V0Q29uZGl0aW9uKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBpbnQgY29uZDsKLQotICAgY29uZCA9ICgoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9WUF9JTlNUX0NPTkRfTUFTSykKLQkgICA+PiBOVjMwX1ZQX0lOU1RfQ09ORF9TSElGVCk7Ci0KLSAgIHN3aXRjaCAoY29uZCkgewotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9GTDogcmV0dXJuIE5WU19DT05EX0ZMOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9MVDogcmV0dXJuIE5WU19DT05EX0xUOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9FUTogcmV0dXJuIE5WU19DT05EX0VROwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9MRTogcmV0dXJuIE5WU19DT05EX0xFOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9HVDogcmV0dXJuIE5WU19DT05EX0dUOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9ORTogcmV0dXJuIE5WU19DT05EX05FOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9HRTogcmV0dXJuIE5WU19DT05EX0dFOwotICAgY2FzZSBOVjMwX1ZQX0lOU1RfQ09ORF9UUjogcmV0dXJuIE5WU19DT05EX1RSOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVlNfQ09ORF9VTktOT1dOOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotTlYzMFZQR2V0Q29uZFJlZ1N3aXp6bGUobnZzRnVuYyAqIHNoYWRlciwgbnZzU3d6Q29tcCAqc3d6KQotewotICAgaW50IHN3emJpdHM7Ci0KLSAgIHN3emJpdHMgPSAoc2hhZGVyLT5pbnN0WzBdICYgTlYzMF9WUF9JTlNUX0NPTkRfU1daX0FMTF9NQVNLKQotICAgICAgPj4gTlYzMF9WUF9JTlNUX0NPTkRfU1daX0FMTF9TSElGVDsKLSAgIE5WMjBWUFRYU3dpenpsZShzd3piaXRzLCBzd3opOwotfQotCi1zdGF0aWMgaW50Ci1OVjMwVlBHZXRDb25kUmVnSUQobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLU5WMzBWUEdldEJyYW5jaChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzJdICYgTlYzMF9WUF9JTlNUX0lBRERSX01BU0spCi0JICAgPj4gTlYzMF9WUF9JTlNUX0lBRERSX1NISUZUKTsKLX0KLQotdm9pZAotTlYzMFZQSW5pdFNoYWRlckZ1bmNzKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICAvKiBJbmhlcml0IE5WMjAgY29kZSwgYSBsb3Qgb2YgaXQgaXMgdGhlIHNhbWUgKi8KLSAgIE5WMjBWUEluaXRTaGFkZXJGdW5jcyhzaGFkZXIpOwotCi0gICAvKiBJbmNyZWFzZSBtYXggdmFsaWQgb3Bjb2RlIElELCBhbmQgYWRkIG5ldyBpbnN0cnVjdGlvbnMgKi8KLSAgIE5WVlBfVFhfVk9QX0NPVU5UID0gTlZWUF9UWF9OVlNfT1BfQ09VTlQgPSAzMjsKLQotICAgTU9EX09QQ09ERShOVlZQX1RYX1ZPUCwgTlYzMF9WUF9JTlNUX09QX0ZSQywgTlZTX09QX0ZSQywgIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjMwX1ZQX0lOU1RfT1BfRkxSLCBOVlNfT1BfRkxSLCAgMCwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9WT1AsIE5WMzBfVlBfSU5TVF9PUF9TRVEsIE5WU19PUF9TRVEsICAwLCAgMSwgLTEpOwotICAgTU9EX09QQ09ERShOVlZQX1RYX1ZPUCwgTlYzMF9WUF9JTlNUX09QX1NGTCwgTlZTX09QX1NGTCwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjMwX1ZQX0lOU1RfT1BfU0dULCBOVlNfT1BfU0dULCAgMCwgIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9WT1AsIE5WMzBfVlBfSU5TVF9PUF9TTEUsIE5WU19PUF9TTEUsICAwLCAgMSwgLTEpOwotICAgTU9EX09QQ09ERShOVlZQX1RYX1ZPUCwgTlYzMF9WUF9JTlNUX09QX1NORSwgTlZTX09QX1NORSwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjMwX1ZQX0lOU1RfT1BfU1RSLCBOVlNfT1BfU1RSLCAgMCwgIDEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9WT1AsIE5WMzBfVlBfSU5TVF9PUF9TU0csIE5WU19PUF9TU0csICAwLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVlZQX1RYX1ZPUCwgTlYzMF9WUF9JTlNUX09QX0FSUiwgTlZTX09QX0FSUiwgIDAsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfVk9QLCBOVjMwX1ZQX0lOU1RfT1BfQVJBLCBOVlNfT1BfQVJBLCAgMywgLTEsIC0xKTsKLQotICAgTU9EX09QQ09ERShOVlZQX1RYX1NPUCwgTlYzMF9WUF9JTlNUX09QX0JSQSwgTlZTX09QX0JSQSwgLTEsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfU09QLCBOVjMwX1ZQX0lOU1RfT1BfQ0FMLCBOVlNfT1BfQ0FMLCAtMSwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMzBfVlBfSU5TVF9PUF9SRVQsIE5WU19PUF9SRVQsIC0xLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVlZQX1RYX1NPUCwgTlYzMF9WUF9JTlNUX09QX0xHMiwgTlZTX09QX0xHMiwgIDIsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WVlBfVFhfU09QLCBOVjMwX1ZQX0lOU1RfT1BfRVgyLCBOVlNfT1BfRVgyLCAgMiwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WMzBfVlBfSU5TVF9PUF9TSU4sIE5WU19PUF9TSU4sICAyLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVlZQX1RYX1NPUCwgTlYzMF9WUF9JTlNUX09QX0NPUywgTlZTX09QX0NPUywgIDIsIC0xLCAtMSk7Ci0KLSAgIHNoYWRlci0+VXBsb2FkVG9IVwkJPSBOVjMwVlBVcGxvYWRUb0hXOwotICAgc2hhZGVyLT5VcGRhdGVDb25zdAkJPSBOVjMwVlBVcGRhdGVDb25zdDsKLQotICAgc2hhZGVyLT5HZXRPcGNvZGVIVwkJPSBOVjMwVlBHZXRPcGNvZGVIVzsKLQotICAgc2hhZGVyLT5HZXREZXN0RmlsZQkJPSBOVjMwVlBHZXREZXN0RmlsZTsKLSAgIHNoYWRlci0+R2V0RGVzdElECQk9IE5WMzBWUEdldERlc3RJRDsKLSAgIHNoYWRlci0+R2V0RGVzdE1hc2sJCT0gTlYzMFZQR2V0RGVzdE1hc2s7Ci0KLSAgIHNoYWRlci0+R2V0U291cmNlSUQJCT0gTlYzMFZQR2V0U291cmNlSUQ7Ci0gICBzaGFkZXItPkdldFNvdXJjZUFicwkJPSBOVjMwVlBHZXRTb3VyY2VBYnM7Ci0KLSAgIHNoYWRlci0+R2V0UmVsQWRkcmVzc1JlZ0lECT0gTlYzMFZQR2V0UmVsQWRkcmVzc1JlZ0lEOwotICAgc2hhZGVyLT5HZXRSZWxBZGRyZXNzU3dpenpsZQk9IE5WMzBWUEdldFJlbEFkZHJlc3NTd2l6emxlOwotCi0gICBzaGFkZXItPlN1cHBvcnRzQ29uZGl0aW9uYWwJPSBOVjMwVlBTdXBwb3J0c0NvbmRpdGlvbmFsOwotICAgc2hhZGVyLT5HZXRDb25kaXRpb25VcGRhdGUJPSBOVjMwVlBHZXRDb25kaXRpb25VcGRhdGU7Ci0gICBzaGFkZXItPkdldENvbmRpdGlvblRlc3QJPSBOVjMwVlBHZXRDb25kaXRpb25UZXN0OwotICAgc2hhZGVyLT5HZXRDb25kaXRpb24JCT0gTlYzMFZQR2V0Q29uZGl0aW9uOwotICAgc2hhZGVyLT5HZXRDb25kUmVnU3dpenpsZQk9IE5WMzBWUEdldENvbmRSZWdTd2l6emxlOwotICAgc2hhZGVyLT5HZXRDb25kUmVnSUQJCT0gTlYzMFZQR2V0Q29uZFJlZ0lEOwotCi0gICBzaGFkZXItPkdldEJyYW5jaAkJPSBOVjMwVlBHZXRCcmFuY2g7Ci0gICBzaGFkZXItPlNldEJyYW5jaFRhcmdldAk9IE5WMzBWUFNldEJyYW5jaFRhcmdldDsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjQwX2ZyYWdwcm9nLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NDBfZnJhZ3Byb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0YWUwNC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NDBfZnJhZ3Byb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jaW5jbHVkZSAibm91dmVhdV9zaGFkZXIuaCIKLSNpbmNsdWRlICJudjQwX3NoYWRlci5oIgotCi0vKiBicmFuY2hpbmcgb3BzICovCi11bnNpZ25lZCBpbnQgTlZGUF9UWF9CT1BfQ09VTlQgPSA1Owotc3RydWN0IF9vcF94bGF0IE5WRlBfVFhfQk9QWzY0XTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFzc2VtYmx5IHJvdXRpbmVzCi0gKiAJLSBUaGVzZSBleHRlbmQgdGhlIE5WMzAgcm91dGluZXMsIHdoaWNoIGFyZSBhbG1vc3QgaWRlbnRpY2FsLiAgTlY0MAotICogCSAganVzdCBoYXMgYnJhbmNoaW5nIGhhY2tlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzZXQuCi0gKi8KLXN0YXRpYyBpbnQKLU5WNDBGUFN1cHBvcnRzUmVzdWx0U2NhbGUobnZzRnVuYyAqc2hhZGVyLCBudnNTY2FsZSBzY2FsZSkKLXsKLQlzd2l0Y2ggKHNjYWxlKSB7Ci0JY2FzZSBOVlNfU0NBTEVfMVg6Ci0JY2FzZSBOVlNfU0NBTEVfMlg6Ci0JY2FzZSBOVlNfU0NBTEVfNFg6Ci0JY2FzZSBOVlNfU0NBTEVfOFg6Ci0JY2FzZSBOVlNfU0NBTEVfSU5WXzJYOgotCWNhc2UgTlZTX1NDQUxFX0lOVl80WDoKLQljYXNlIE5WU19TQ0FMRV9JTlZfOFg6Ci0JCXJldHVybiAxOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLU5WNDBGUFNldFJlc3VsdFNjYWxlKG52c0Z1bmMgKnNoYWRlciwgbnZzU2NhbGUgc2NhbGUpCi17Ci0Jc2hhZGVyLT5pbnN0WzJdICY9IH5OVjQwX0ZQX09QX0RTVF9TQ0FMRV9NQVNLOwotCXNoYWRlci0+aW5zdFsyXSB8PSAoKHVuc2lnbmVkIGludClzY2FsZSA8PCBOVjQwX0ZQX09QX0RTVF9TQ0FMRV9TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwRlBTZXRCcmFuY2hUYXJnZXQobnZzRnVuYyAqc2hhZGVyLCBpbnQgYWRkcikKLXsKLQlzaGFkZXItPmluc3RbMl0gJj0gfk5WNDBfRlBfT1BfSUFERFJfTUFTSzsKLQlzaGFkZXItPmluc3RbMl0gfD0gKGFkZHIgPDwgTlY0MF9GUF9PUF9JQUREUl9TSElGVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwRlBTZXRCcmFuY2hFbHNlKG52c0Z1bmMgKnNoYWRlciwgaW50IGFkZHIpCi17Ci0Jc2hhZGVyLT5pbnN0WzJdICY9IH5OVjQwX0ZQX09QX0VMU0VfSURfTUFTSzsKLQlzaGFkZXItPmluc3RbMl0gfD0gKGFkZHIgPDwgTlY0MF9GUF9PUF9FTFNFX0lEX1NISUZUKTsKLX0KLQotc3RhdGljIHZvaWQKLU5WNDBGUFNldEJyYW5jaEVuZChudnNGdW5jICpzaGFkZXIsIGludCBhZGRyKQotewotCXNoYWRlci0+aW5zdFszXSAmPSB+TlY0MF9GUF9PUF9FTkRfSURfTUFTSzsKLQlzaGFkZXItPmluc3RbM10gfD0gKGFkZHIgPDwgTlY0MF9GUF9PUF9FTkRfSURfU0hJRlQpOwotfQotCi1zdGF0aWMgdm9pZAotTlY0MEZQU2V0TG9vcFBhcmFtcyhudnNGdW5jICpzaGFkZXIsIGludCBjb3VudCwgaW50IGluaXRpYWwsIGludCBpbmNyZW1lbnQpCi17Ci0Jc2hhZGVyLT5pbnN0WzJdICY9IH4oTlY0MF9GUF9PUF9MT09QX0NPVU5UX01BU0sgfAotCQkJICAgICBOVjQwX0ZQX09QX0xPT1BfSU5ERVhfTUFTSyB8Ci0JCQkgICAgIE5WNDBfRlBfT1BfTE9PUF9JTkNSX01BU0spOwotCXNoYWRlci0+aW5zdFsyXSB8PSAoKGNvdW50ICAgICA8PCBOVjQwX0ZQX09QX0xPT1BfQ09VTlRfU0hJRlQpIHwKLQkJCSAgICAoaW5pdGlhbCAgIDw8IE5WNDBfRlBfT1BfTE9PUF9JTkRFWF9TSElGVCkgfAotCQkJICAgIChpbmNyZW1lbnQgPDwgTlY0MF9GUF9PUF9MT09QX0lOQ1JfU0hJRlQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEaXNhc3NlbWJseSByb3V0aW5lcwotICovCi1zdGF0aWMgc3RydWN0IF9vcF94bGF0ICoKLU5WNDBGUEdldE9QVFhSZWMobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCkKLXsKLSAgIHN0cnVjdCBfb3BfeGxhdCAqb3ByOwotICAgaW50IG9wOwotCi0gICBvcCA9IHNoYWRlci0+R2V0T3Bjb2RlSFcoc2hhZGVyLCAwKTsKLSAgIGlmIChzaGFkZXItPmluc3RbMl0gJiBOVjQwX0ZQX09QX09QQ09ERV9JU19CUkFOQ0gpIHsKLSAgICAgIG9wciA9IE5WRlBfVFhfQk9QOwotICAgICAgb3AgJj0gfk5WNDBfRlBfT1BfT1BDT0RFX0lTX0JSQU5DSDsKLSAgICAgIGlmIChvcCA+IE5WRlBfVFhfQk9QX0NPVU5UKQotCSByZXR1cm4gTlVMTDsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgb3ByID0gTlZGUF9UWF9BT1A7Ci0gICAgICBpZiAob3AgPiBOVkZQX1RYX0FPUF9DT1VOVCkKLQkgcmV0dXJuIE5VTEw7Ci0gICB9Ci0KLSAgIGlmIChvcHJbb3BdLlNPUCA9PSBOVlNfT1BfVU5LTk9XTikKLSAgICAgIHJldHVybiBOVUxMOwotICAgcmV0dXJuICZvcHJbb3BdOwotfQotCi1zdGF0aWMgaW50Ci1OVjQwRlBHZXRTb3VyY2VJRChudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgc3dpdGNoIChzaGFkZXItPkdldFNvdXJjZUZpbGUoc2hhZGVyLCBtZXJnZWQsIHBvcykpIHsKLSAgIGNhc2UgTlZTX0ZJTEVfQVRUUklCOgotICAgICAgc3dpdGNoICgoc2hhZGVyLT5pbnN0WzBdICYgTlY0MF9GUF9PUF9JTlBVVF9TUkNfTUFTSykKLQkgICAgICA+PiBOVjQwX0ZQX09QX0lOUFVUX1NSQ19TSElGVCkgewotICAgICAgY2FzZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19QT1NJVElPTjogcmV0dXJuIE5WU19GUl9QT1NJVElPTjsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfQ09MMCAgICA6IHJldHVybiBOVlNfRlJfQ09MMDsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfQ09MMSAgICA6IHJldHVybiBOVlNfRlJfQ09MMTsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfRk9HQyAgICA6IHJldHVybiBOVlNfRlJfRk9HQ09PUkQ7Ci0gICAgICBjYXNlIE5WNDBfRlBfT1BfSU5QVVRfU1JDX1RDKDApICAgOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMDsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfVEMoMSkgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQxOwotICAgICAgY2FzZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19UQygyKSAgIDogcmV0dXJuIE5WU19GUl9URVhDT09SRDI7Ci0gICAgICBjYXNlIE5WNDBfRlBfT1BfSU5QVVRfU1JDX1RDKDMpICAgOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMzsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfVEMoNCkgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ0OwotICAgICAgY2FzZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19UQyg1KSAgIDogcmV0dXJuIE5WU19GUl9URVhDT09SRDU7Ci0gICAgICBjYXNlIE5WNDBfRlBfT1BfSU5QVVRfU1JDX1RDKDYpICAgOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENjsKLSAgICAgIGNhc2UgTlY0MF9GUF9PUF9JTlBVVF9TUkNfVEMoNykgICA6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ3OwotICAgICAgY2FzZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19GQUNJTkcgIDogcmV0dXJuIE5WU19GUl9GQUNJTkc7Ci0gICAgICBkZWZhdWx0OgotCSByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLSAgICAgIHsKLQkgdW5zaWduZWQgaW50IHNyYzsKLQotCSBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotCSByZXR1cm4gKChzcmMgJiBOVjQwX0ZQX1JFR19TUkNfTUFTSykgPj4gTlY0MF9GUF9SRUdfU1JDX1NISUZUKTsKLSAgICAgIH0KLSAgIGNhc2UgTlZTX0ZJTEVfQ09OU1Q6CQkvKiBpbmxpbmVkIGludG8gZnJhZ3Byb2cgKi8KLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WNDBGUEdldEJyYW5jaChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9GUF9PUF9JQUREUl9NQVNLKQotCSAgID4+IE5WNDBfRlBfT1BfSUFERFJfU0hJRlQpOzsKLX0KLQotc3RhdGljIGludAotTlY0MEZQR2V0QnJhbmNoRWxzZShudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9GUF9PUF9FTFNFX0lEX01BU0spCi0JICAgPj4gTlY0MF9GUF9PUF9FTFNFX0lEX1NISUZUKTsKLX0KLQotc3RhdGljIGludAotTlY0MEZQR2V0QnJhbmNoRW5kKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbM10gJiBOVjQwX0ZQX09QX0VORF9JRF9NQVNLKQotCSAgID4+IE5WNDBfRlBfT1BfRU5EX0lEX1NISUZUKTsKLX0KLQotc3RhdGljIGludAotTlY0MEZQR2V0TG9vcENvdW50KG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbMl0gJiBOVjQwX0ZQX09QX0xPT1BfQ09VTlRfTUFTSykKLQkgICA+PiBOVjQwX0ZQX09QX0xPT1BfQ09VTlRfU0hJRlQpOwotfQotCi1zdGF0aWMgaW50Ci1OVjQwRlBHZXRMb29wSW5pdGlhbChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9GUF9PUF9MT09QX0lOREVYX01BU0spCi0JICAgPj4gTlY0MF9GUF9PUF9MT09QX0lOREVYX1NISUZUKTsKLX0KLQotc3RhdGljIGludAotTlY0MEZQR2V0TG9vcEluY3JlbWVudChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9GUF9PUF9MT09QX0lOQ1JfTUFTSykKLQkgICA+PiBOVjQwX0ZQX09QX0xPT1BfSU5DUl9TSElGVCk7Ci19Ci0KLXZvaWQKLU5WNDBGUEluaXRTaGFkZXJGdW5jcyhudnNGdW5jICogc2hhZGVyKQotewotICAgLyogSW5oZXJpdCBOVjMwIEZQIGNvZGUsIGl0J3MgbW9zdGx5IHRoZSBzYW1lICovCi0gICBOVjMwRlBJbml0U2hhZGVyRnVuY3Moc2hhZGVyKTsKLQotICAgLyogS2lsbCBvZmYgb3Bjb2RlcyBzZWVuIG9uIE5WMzAsIGJ1dCBub3Qgc2VlbiBvbiBOVjQwIC0gbmVlZCB0byBmaW5kCi0gICAgKiBvdXQgaWYgdGhlc2UgYWN0dWFsbHkgd29yayBvciBub3QuCi0gICAgKgotICAgICogdXBkYXRlOiBlaXRoZXIgTElUL1JTUSBkb24ndCB3b3JrIG9uIG52NDAsIG9yIEkgZ2VuZXJhdGUgYmFkIGNvZGUgZm9yCi0gICAgKiAgICAgICAgIHRoZW0uICBoYXZlbid0IHRlc3RlZCB0aGUgb3RoZXJzIHlldAotICAgICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCAweDFCLCBOVlNfT1BfVU5LTk9XTiwgLTEsIC0xLCAtMSk7CS8qIE5WMzAgUlNRICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCAweDFFLCBOVlNfT1BfVU5LTk9XTiwgLTEsIC0xLCAtMSk7CS8qIE5WMzAgTElUICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCAweDFGLCBOVlNfT1BfVU5LTk9XTiwgLTEsIC0xLCAtMSk7CS8qIE5WMzAgTFJQICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCAweDI2LCBOVlNfT1BfVU5LTk9XTiwgLTEsIC0xLCAtMSk7CS8qIE5WMzAgUE9XICovCi0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCAweDM2LCBOVlNfT1BfVU5LTk9XTiwgLTEsIC0xLCAtMSk7CS8qIE5WMzAgUkZMICovCi0KLSAgIC8qIEV4dHJhIG9wY29kZXMgc3VwcG9ydGVkIG9uIE5WNDAgKi8KLSAgIE1PRF9PUENPREUoTlZGUF9UWF9BT1AsIE5WNDBfRlBfT1BfT1BDT0RFX0RJViAgICAgLCBOVlNfT1BfRElWICwgIDAsICAxLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQU9QLCBOVjQwX0ZQX09QX09QQ09ERV9EUDJBICAgICwgTlZTX09QX0RQMkEsICAwLCAgMSwgIDIpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0FPUCwgTlY0MF9GUF9PUF9PUENPREVfVFhMICAgICAsIE5WU19PUF9UWEwgLCAgMCwgLTEsIC0xKTsKLQotICAgTU9EX09QQ09ERShOVkZQX1RYX0JPUCwgTlY0MF9GUF9PUF9CUkFfT1BDT0RFX0JSSyAsIE5WU19PUF9CUksgLCAtMSwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9CT1AsIE5WNDBfRlBfT1BfQlJBX09QQ09ERV9DQUwgLCBOVlNfT1BfQ0FMICwgLTEsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQk9QLCBOVjQwX0ZQX09QX0JSQV9PUENPREVfSUYgICwgTlZTX09QX0lGICAsIC0xLCAtMSwgLTEpOwotICAgTU9EX09QQ09ERShOVkZQX1RYX0JPUCwgTlY0MF9GUF9PUF9CUkFfT1BDT0RFX0xPT1AsIE5WU19PUF9MT09QLCAtMSwgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZGUF9UWF9CT1AsIE5WNDBfRlBfT1BfQlJBX09QQ09ERV9SRVAgLCBOVlNfT1BfUkVQICwgLTEsIC0xLCAtMSk7Ci0gICBNT0RfT1BDT0RFKE5WRlBfVFhfQk9QLCBOVjQwX0ZQX09QX0JSQV9PUENPREVfUkVUICwgTlZTX09QX1JFVCAsIC0xLCAtMSwgLTEpOwotCi0gICBzaGFkZXItPlN1cHBvcnRzUmVzdWx0U2NhbGUJPSBOVjQwRlBTdXBwb3J0c1Jlc3VsdFNjYWxlOwotICAgc2hhZGVyLT5TZXRSZXN1bHRTY2FsZQk9IE5WNDBGUFNldFJlc3VsdFNjYWxlOwotCi0gICAvKiBmcmFnbWVudC5mYWNpbmcgKi8KLSAgIHNoYWRlci0+R2V0U291cmNlSUQJCT0gTlY0MEZQR2V0U291cmNlSUQ7Ci0KLSAgIC8qIGJyYW5jaGluZyAqLwotICAgc2hhZGVyLT5HZXRPUFRYUmVjCQk9IE5WNDBGUEdldE9QVFhSZWM7Ci0gICBzaGFkZXItPkdldEJyYW5jaAkJPSBOVjQwRlBHZXRCcmFuY2g7Ci0gICBzaGFkZXItPkdldEJyYW5jaEVsc2UJPSBOVjQwRlBHZXRCcmFuY2hFbHNlOwotICAgc2hhZGVyLT5HZXRCcmFuY2hFbmQJCT0gTlY0MEZQR2V0QnJhbmNoRW5kOwotICAgc2hhZGVyLT5HZXRMb29wQ291bnQJCT0gTlY0MEZQR2V0TG9vcENvdW50OwotICAgc2hhZGVyLT5HZXRMb29wSW5pdGlhbAk9IE5WNDBGUEdldExvb3BJbml0aWFsOwotICAgc2hhZGVyLT5HZXRMb29wSW5jcmVtZW50CT0gTlY0MEZQR2V0TG9vcEluY3JlbWVudDsKLSAgIHNoYWRlci0+U2V0QnJhbmNoVGFyZ2V0CT0gTlY0MEZQU2V0QnJhbmNoVGFyZ2V0OwotICAgc2hhZGVyLT5TZXRCcmFuY2hFbHNlCT0gTlY0MEZQU2V0QnJhbmNoRWxzZTsKLSAgIHNoYWRlci0+U2V0QnJhbmNoRW5kCQk9IE5WNDBGUFNldEJyYW5jaEVuZDsKLSAgIHNoYWRlci0+U2V0TG9vcFBhcmFtcwk9IE5WNDBGUFNldExvb3BQYXJhbXM7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NDBfc2hhZGVyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NDBfc2hhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGY0YzIuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjQwX3NoYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLSNpZm5kZWYgX19OVjQwX1NIQURFUl9IX18KLSNkZWZpbmUgX19OVjQwX1NIQURFUl9IX18KLQotLyogVmVydGV4IHByb2dyYW1zIGluc3RydWN0aW9uIHNldAotICoKLSAqIFRoZSBOVjQwIGluc3RydWN0aW9uIHNldCBpcyB2ZXJ5IHNpbWlsYXIgdG8gTlYzMC4gIE1vc3QgZmllbGRzIGFyZSBpbgotICogYSBzbGlnaHRseSBkaWZmZXJlbnQgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uIGhvd2V2ZXIuCi0gKgotICogTWVyZ2VkIGluc3RydWN0aW9ucwotICogICAgIEluIHNvbWUgY2FzZXMgaXQgaXMgcG9zc2libGUgdG8gcHV0IHR3byBpbnN0cnVjdGlvbnMgaW50byBvbmUgb3Bjb2RlCi0gKiAgICAgc2xvdC4gIFRoZSBydWxlcyBmb3Igd2hlbiB0aGlzIGlzIE9LIGlzIG5vdCBlbnRpcmVseSBjbGVhciB0byBtZSB5ZXQuCi0gKgotICogICAgIFRoZXJlIGFyZSBzZXBhcmF0ZSB3cml0ZW1hc2tzIGFuZCBkZXN0IHRlbXAgcmVnaXN0ZXIgZmllbGRzIGZvciBlYWNoCi0gKiAgICAgZ3JvdXBpbmcgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhlcmUgaXMgaG93ZXZlciBvbmx5IG9uZSBmaWVsZCB3aXRoIHRoZQotICogICAgIElEIG9mIGEgcmVzdWx0IHJlZ2lzdGVyLiAgV3JpdGluZyB0byB0ZW1wL3Jlc3VsdCByZWdzIGlzIHNlbGVjdGVkIGJ5Ci0gKiAgICAgc2V0dGluZyBWRUNfUkVTVUxUL1NDQV9SRVNVTFQuCi0gKgotICogVGVtcG9yYXJ5IHJlZ2lzdGVycwotICogICAgIFRoZSBzb3VyY2UvZGVzdCB0ZW1wIHJlZ2lzdGVyIGZpZWxkcyBoYXZlIGJlZW4gZXh0ZW5kZWQgYnkgMSBiaXQsIHRvCi0gKiAgICAgZ2l2ZSBhIHRvdGFsIG9mIDMyIHRlbXBvcmFyeSByZWdpc3RlcnMuCi0gKgotICogUmVsYXRpdmUgQWRkcmVzc2luZwotICogICAgIE5WNDAgY2FuIHVzZSBhbiBhZGRyZXNzIHJlZ2lzdGVyIHRvIGluZGV4IGludG8gdmVydGV4IGF0dHJpYnV0ZSByZWdzLgotICogICAgIFRoaXMgaXMgZG9uZSBieSBwdXR0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaW50byBJTlBVVF9TUkMgYW5kIHNldHRpbmcKLSAqICAgICB0aGUgSU5ERVhfSU5QVVQgZmxhZy4KLSAqCi0gKiBDb25kaXRpb25hbCBleGVjdXRpb24gKHNlZSBOVl92ZXJ0ZXhfcHJvZ3JhbXsyLDN9IGZvciBkZXRhaWxzKQotICogICAgIFRoZXJlIGlzIGEgc2Vjb25kIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIG9uIE5WNDAsIGl0J3MgdXNlIGlzIGVuYWJsZWQKLSAqICAgICBieSBzZXR0aW5nIHRoZSBDT05EX1JFR19TRUxFQ1RfMSBmbGFnLgotICoKLSAqIFRleHR1cmUgbG9va3VwCi0gKiAgICAgVE9ETwotICovCi0KLS8qIC0tLS0gT1BDT0RFIEJJVFMgMTI3Ojk2IC8gZGF0YSBEV09SRCAwIC0tLSAqLwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfVkVDX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMCkKLS8qIHVuY2VydGFpbi4uICovCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX1VQREFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAoKDEgPDwgMTQpfDE8PDI5KQotLyogdXNlIGFkZHJlc3MgcmVnIGFzIGluZGV4IGludG8gYXR0cmlicyAqLwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfSU5ERVhfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNykKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfUkVHX1NFTEVDVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9BRERSX1JFR19TRUxFQ1RfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU1JDMl9BQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NSQzFfQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjIpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TUkMwX0FCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIxKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1ZFQ19ERVNUX1RFTVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUYgPDwgMTUpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX1RFU1RfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEzKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDcgPDwgMTApCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9GTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX0VRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9MRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX1NXWl9YX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCA4KQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9TV1pfWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDYpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX1NXWl9aX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9TV1pfWl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgNCkKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9DT05EX1NXWl9XX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQ09ORF9TV1pfQUxMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTkRfU1daX0FMTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDIpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9BRERSX1NXWl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQUREUl9TV1pfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMgPDwgMCkKLSNkZWZpbmUgTlY0MF9WUF9JTlNUMF9LTk9XTiAoIFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfSU5ERVhfSU5QVVQgfCBcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX0NPTkRfUkVHX1NFTEVDVF8xIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9BRERSX1JFR19TRUxFQ1RfMSB8IFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfU1JDMl9BQlMgfCBcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX1NSQzFfQUJTIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9TUkMwX0FCUyB8IFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9NQVNLIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9DT05EX1RFU1RfRU5BQkxFIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9DT05EX01BU0sgfCBcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX0NPTkRfU1daX0FMTF9NQVNLIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9BRERSX1NXWl9NQVNLKQotCi0vKiAtLS0tIE9QQ09ERSBCSVRTIDk1OjY0IC8gZGF0YSBEV09SRCAxIC0tLSAqLwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfVkVDX09QQ09ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUYgPDwgMjIpCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfTk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX01PViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9NVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX01BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9EUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfRFA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0RQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9EU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9TTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfU0dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0FSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9GUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfRkxSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRgotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX1NFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9TRkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfU0dUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMgotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX1NMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9TTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX1NTRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9BUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE3Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfQVJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX1RYV0hBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NDQV9PUENPREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3Ci0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TQ0FfT1BDT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGIDw8IDI3KQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX1JDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9SQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfUlNRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfTElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0JSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfUkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0xHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9FWDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRgotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX09QX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9PUF9QVVNIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfT1BfUE9QQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNAotI2RlZmluZSBOVjQwX1ZQX0lOU1RfQ09OU1RfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0NPTlNUX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYgPDwgMTIpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9JTlBVVF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBOVjQwX1ZQX0lOU1RfSU5QVVRfU1JDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEYgPDwgOCkKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9JTl9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfSU5fV0VJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0lOX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9JTl9DT0wwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfSU5fQ09MMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0lOX0ZPR0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9JTl9UQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfSU5fVEMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCtuKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU1JDMEhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NSQzBIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDApCi0jZGVmaW5lIE5WNDBfVlBfSU5TVDFfS05PV04gKCBcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSyB8IFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfU0NBX09QQ09ERV9NQVNLIHwgXAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9DT05TVF9TUkNfTUFTSyAgfCBcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX0lOUFVUX1NSQ19NQVNLICB8IFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfU1JDMEhfTUFTSyBcCi0gICAgICAgICAgICAgICAgKQotCi0vKiAtLS0tIE9QQ09ERSBCSVRTIDYzOjMyIC8gZGF0YSBEV09SRCAyIC0tLSAqLwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU1JDMExfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NSQzBMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRkYgPDwgMjMpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TUkMxX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU1JDMV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUZGRkYgPDwgNikKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NSQzJIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TUkMySF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRiA8PCAwKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfSUFERFJIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0lBRERSSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGIDw8IDApCi0KLS8qIC0tLS0gT1BDT0RFIEJJVFMgMzE6MCAvIGRhdGEgRFdPUkQgMyAtLS0gKi8KLSNkZWZpbmUgTlY0MF9WUF9JTlNUX0lBRERSTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIE5WNDBfVlBfSU5TVF9JQUREUkxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3IDw8IDI5KQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU1JDMkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NSQzJMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3RkYgPDwgMjEpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU0NBX1dSSVRFTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RiA8PCAxNykKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfU0NBX1dSSVRFTUFTS19ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX1NDQV9XUklURU1BU0tfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9WRUNfV1JJVEVNQVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBOVjQwX1ZQX0lOU1RfVkVDX1dSSVRFTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RiA8PCAxMykKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9WRUNfV1JJVEVNQVNLX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfVkVDX1dSSVRFTUFTS19ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX1ZFQ19XUklURU1BU0tfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNCkKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9WRUNfV1JJVEVNQVNLX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9TQ0FfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEyKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfU0NBX0RFU1RfVEVNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgTlY0MF9WUF9JTlNUX1NDQV9ERVNUX1RFTVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGIDw8IDcpCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9ERVNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBOVjQwX1ZQX0lOU1RfREVTVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzEgPDwgMikKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9ERVNUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfREVTVF9DT0wwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0RFU1RfQ09MMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9ERVNUX0JGQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfREVTVF9CRkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0RFU1RfRk9HQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9ERVNUX1BTWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jICAgIGRlZmluZSBOVjQwX1ZQX0lOU1RfREVTVF9UQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotIyAgICBkZWZpbmUgTlY0MF9WUF9JTlNUX0RFU1RfVEMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcrbikKLSMgICAgZGVmaW5lIE5WNDBfVlBfSU5TVF9ERVNUX1RFTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGCi0jZGVmaW5lIE5WNDBfVlBfSU5TVF9JTkRFWF9DT05TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQotI2RlZmluZSBOVjQwX1ZQX0lOU1RfTEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgTlY0MF9WUF9JTlNUM19LTk9XTiAoIFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfU1JDMkxfTUFTSyB8XAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX01BU0sgfFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfVkVDX1dSSVRFTUFTS19NQVNLIHxcCi0gICAgICAgICAgICAgICAgTlY0MF9WUF9JTlNUX1NDQV9ERVNUX1RFTVBfTUFTSyB8XAotICAgICAgICAgICAgICAgIE5WNDBfVlBfSU5TVF9ERVNUX01BU0sgfFwKLSAgICAgICAgICAgICAgICBOVjQwX1ZQX0lOU1RfSU5ERVhfQ09OU1QpCi0KLS8qIFVzZWZ1bCB0byBzcGxpdCB0aGUgc291cmNlIHNlbGVjdGlvbiByZWdzIGludG8gdGhlaXIgcGllY2VzICovCi0jZGVmaW5lIE5WNDBfVlBfU1JDMF9ISUdIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBOVjQwX1ZQX1NSQzBfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMUZFMDAKLSNkZWZpbmUgTlY0MF9WUF9TUkMwX0xPV19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMUZGCi0jZGVmaW5lIE5WNDBfVlBfU1JDMl9ISUdIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBOVjQwX1ZQX1NSQzJfSElHSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMUY4MDAKLSNkZWZpbmUgTlY0MF9WUF9TUkMyX0xPV19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwN0ZGCi0KLS8qIFNvdXJjZSBzZWxlY3Rpb24gLSB0aGVzZSBhcmUgdGhlIGJpdHMgeW91IGZpbGwgTlY0MF9WUF9JTlNUX1NSQ24gd2l0aCAqLwotI2RlZmluZSBOVjQwX1ZQX1NSQ19ORUdBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKLSNkZWZpbmUgTlY0MF9WUF9TUkNfU1daX1hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIE5WNDBfVlBfU1JDX1NXWl9YX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDE0KQotI2RlZmluZSBOVjQwX1ZQX1NSQ19TV1pfWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTlY0MF9WUF9TUkNfU1daX1lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMTIpCi0jZGVmaW5lIE5WNDBfVlBfU1JDX1NXWl9aX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBOVjQwX1ZQX1NSQ19TV1pfWl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxMCkKLSNkZWZpbmUgTlY0MF9WUF9TUkNfU1daX1dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIE5WNDBfVlBfU1JDX1NXWl9XX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCA4KQotI2RlZmluZSBOVjQwX1ZQX1NSQ19TV1pfQUxMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTlY0MF9WUF9TUkNfU1daX0FMTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDgpCi0jZGVmaW5lIE5WNDBfVlBfU1JDX1RFTVBfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBOVjQwX1ZQX1NSQ19URU1QX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUYgPDwgMikKLSNkZWZpbmUgTlY0MF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE5WNDBfVlBfU1JDX1JFR19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAwKQotIyAgICBkZWZpbmUgTlY0MF9WUF9TUkNfUkVHX1RZUEVfVU5LMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSMgICAgZGVmaW5lIE5WNDBfVlBfU1JDX1JFR19UWVBFX1RFTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jICAgIGRlZmluZSBOVjQwX1ZQX1NSQ19SRUdfVFlQRV9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotIyAgICBkZWZpbmUgTlY0MF9WUF9TUkNfUkVHX1RZUEVfQ09OU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLQotCi0vKgotICogRWFjaCBmcmFnbWVudCBwcm9ncmFtIG9wY29kZSBhcHBlYXJzIHRvIGJlIGNvbXByaXNlZCBvZiA0IDMyLWJpdCB2YWx1ZXMuCi0gKgotICogICAgICAgICAwIC0gT3Bjb2RlLCBvdXRwdXQgcmVnL21hc2ssIEFUVFJJQiBzb3VyY2UKLSAqICAgICAgICAgMSAtIFNvdXJjZSAwCi0gKiAgICAgICAgIDIgLSBTb3VyY2UgMQotICogICAgICAgICAzIC0gU291cmNlIDIKLSAqCi0gKiBUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIHNwZWNpYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlc3VsdCByZWdzIGFuZCB0ZW1wIHJlZ3MuCi0gKiAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbG9yID09IFIwLnh5encKLSAqICAgICAgICAgICAgICAgICByZXN1bHQuZGVwdGggPT0gUjEuegotICogV2hlbiB0aGUgZnJhZ3Byb2cgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIHRvIHdyaXRlIGRlcHRoLAotICogTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1VOSzFENzg9MCBvdGhlcndpc2UgaXQgaXMgc2V0IHRvIDEuCi0gKgotICogQ29uc3RhbnRzIGFyZSBpbnNlcnRlZCBkaXJlY3RseSBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIHRoZW0uCi0gKiAKLSAqIEl0IGFwcGVhcnMgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgdHdvIGlucHV0IHJlZ2lzdGVycyBpbiBvbmUKLSAqIGluc3RydWN0aW9uIGFzIHRoZSBpbnB1dCBzb3VyY2luZyBpcyBkb25lIGluIHRoZSBpbnN0cnVjdGlvbiBkd29yZAotICogYW5kIG5vdCB0aGUgc291cmNlIHNlbGVjdGlvbiBkd29yZHMuICBBcyBzdWNoIGluc3RydWN0aW9ucyBzdWNoIGFzOgotICogCi0gKiAgICAgICAgICAgICAgICAgQUREIHJlc3VsdC5jb2xvciwgZnJhZ21lbnQuY29sb3IsIGZyYWdtZW50LnRleGNvb3JkWzBdOwotICoKLSAqIG11c3QgYmUgc3BsaXQgaW50byB0d28gTU9WJ3MgYW5kIHRoZW4gYW4gQUREIChudmlkaWEgZG9lcyB0aGlzKSBidXQKLSAqIEknbSBub3Qgc3VyZSB3aHkgaXQncyBub3QganVzdCBvbmUgTU9WIGFuZCB0aGVuIHNvdXJjZSB0aGUgc2Vjb25kIGlucHV0Ci0gKiBpbiB0aGUgQUREIGluc3RydWN0aW9uLi4KLSAqCi0gKiBOZWdhdGlvbiBvZiB0aGUgZnVsbCBzb3VyY2UgaXMgZG9uZSB3aXRoIE5WMzBfRlBfUkVHX05FR0FURSwgYXJiaXRyYXJ5Ci0gKiBuZWdhdGlvbiByZXF1aXJlcyBtdWx0aXBsaWNhdGlvbiB3aXRoIGEgY29uc3QuCi0gKgotICogQXJiaXRyYXJ5IHN3aXp6bGluZyBpcyBzdXBwb3J0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIFNXSVpaTEVfWkVSTyBhbmQKLSAqIFNXSVpaTEVfT05FLgotICoKLSAqIFRoZSB0ZW1wL3Jlc3VsdCByZWdzIGFwcGVhciB0byBiZSBpbml0aWFsaXNlZCB0byAoMC4wLCAwLjAsIDAuMCwgMC4wKSBhcwotICogU1dJWlpMRV9aRVJPIGlzIGltcGxlbWVudGVkIHNpbXBseSBieSBub3Qgd3JpdGluZyB0byB0aGUgcmVsZXZhbnQgY29tcG9uZW50cwotICogb2YgdGhlIGRlc3RpbmF0aW9uLgotICoKLSAqIExvb3BpbmcKLSAqICAgTG9vcHMgYXBwZWFyIHRvIGJlIGZhaXJseSBleHBlbnNpdmUgb24gTlY0MCBhdCBsZWFzdCwgdGhlIHByb3ByaWV0YXJ5Ci0gKiAgIGRyaXZlciBnb2VzIHRvIGEgbG90IG9mIGVmZm9ydCB0byBhdm9pZCB1c2luZyB0aGUgbmF0aXZlIGxvb3BpbmcKLSAqICAgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlIHRvdGFsIG51bWJlciBvZiAqZXhlY3V0ZWQqIGluc3RydWN0aW9ucyBiZXR3ZWVuCi0gKiAgIFJFUC9FTkRSRVAgb3IgTE9PUC9FTkRMT09QIGlzIDw9NTAwLCB0aGUgZHJpdmVyIHdpbGwgdW5yb2xsIHRoZSBsb29wLgotICogICBUaGUgbWF4aW11bSBsb29wIGNvdW50IGlzIDI1NS4KLSAqCi0gKiBDb25kaXRpb25hbCBleGVjdXRpb24KLSAqICAgVE9ETwotICogCi0gKiBOb24tbmF0aXZlIGluc3RydWN0aW9uczoKLSAqICAgICAgICAgTElUCi0gKiAgICAgICAgIExSUCAtIE1BRCtNQUQKLSAqICAgICAgICAgU1VCIC0gQURELCBuZWdhdGUgc2Vjb25kIHNvdXJjZQotICogICAgICAgICBSU1EgLSBMRzIgKyBFWDIKLSAqICAgICAgICAgUE9XIC0gTEcyICsgTVVMICsgRVgyCi0gKiAgICAgICAgIFNDUyAtIENPUyArIFNJTgotICogICAgICAgICBYUEQKLSAqICAgICAgICAgRFAyIC0gTVVMICsgQURECi0gKiAgICAgICAgIE5STQotICovCi0KLS8vPT0gT3Bjb2RlIC8gRGVzdGluYXRpb24gc2VsZWN0aW9uID09Ci0jZGVmaW5lIE5WNDBfRlBfT1BfUFJPR1JBTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBOVjQwX0ZQX09QX09VVF9SRUdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTlY0MF9GUF9PUF9PVVRfUkVHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMxIDw8IDEpCi0vKiBOZWVkcyB0byBiZSBzZXQgd2hlbiB3cml0aW5nIG91dHB1dHMgdG8gZ2V0IGV4cGVjdGVkIHJlc3VsdC4uICovCi0jZGVmaW5lIE5WNDBfRlBfT1BfVU5LMF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQotI2RlZmluZSBOVjQwX0ZQX09QX0NPTkRfV1JJVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKLSNkZWZpbmUgTlY0MF9GUF9PUF9PVVRNQVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIE5WNDBfRlBfT1BfT1VUTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RiA8PCA5KQotIyAgICBkZWZpbmUgTlY0MF9GUF9PUF9PVVRfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKLSMgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1VUX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8MTApCi0jICAgIGRlZmluZSBOVjQwX0ZQX09QX09VVF9aICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PDExKQotIyAgICBkZWZpbmUgTlY0MF9GUF9PUF9PVVRfVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwxMikKLS8qIFVuY2VydGFpbiBhYm91dCB0aGVzZSwgZXNwZWNpYWxseSB0aGUgaW5wdXRfc3JjIHZhbHVlcy4uIGl0J3MgcG9zc2libGUgdGhhdAotICogdGhleSBjYW4gYmUgZHluYW1pY2FsbHkgY2hhbmdlZC4KLSAqLwotI2RlZmluZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgTlY0MF9GUF9PUF9JTlBVVF9TUkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUgPDwgMTMpCi0jICAgIGRlZmluZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotIyAgICBkZWZpbmUgTlY0MF9GUF9PUF9JTlBVVF9TUkNfQ09MMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSMgICAgZGVmaW5lIE5WNDBfRlBfT1BfSU5QVVRfU1JDX0NPTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCi0jICAgIGRlZmluZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19GT0dDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MwotIyAgICBkZWZpbmUgTlY0MF9GUF9PUF9JTlBVVF9TUkNfVEMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKLSMgICAgZGVmaW5lIE5WNDBfRlBfT1BfSU5QVVRfU1JDX1RDKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NCArIG4pCi0jICAgIGRlZmluZSBOVjQwX0ZQX09QX0lOUFVUX1NSQ19GQUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RQotI2RlZmluZSBOVjQwX0ZQX09QX1RFWF9VTklUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgTlY0MF9GUF9PUF9URVhfVU5JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEYgPDwgMTcpCi0jZGVmaW5lIE5WNDBfRlBfT1BfUFJFQ0lTSU9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMgotI2RlZmluZSBOVjQwX0ZQX09QX1BSRUNJU0lPTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyMikKLSMgICBkZWZpbmUgTlY0MF9GUF9QUkVDSVNJT05fRlAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jICAgZGVmaW5lIE5WNDBfRlBfUFJFQ0lTSU9OX0ZQMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotIyAgIGRlZmluZSBOVjQwX0ZQX1BSRUNJU0lPTl9GWDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNGIDw8IDI0KQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX05PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9NT1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfTVVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9NQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfRFAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX0RQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9EU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9TTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfU0dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1NMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9TR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBECi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfU05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1NFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9GUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfRkxSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX0tJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9QSzRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfVVA0QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNAotLyogRERYL0REWSBjYW4gb25seSB3cml0ZSB0byBYWSAqLwotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX0REWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9ERFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE2Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfVEVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNwotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1RYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9UWEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfUkNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX0VYMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9MRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFECi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1NJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9QSzJIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI0Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfVVAySCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1BLNFVCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjcKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9VUDRVQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfUEsyVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1VQMlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkEKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9EUDJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJFCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfVFhMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyRgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfT1BDT0RFX1RYQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX09QQ09ERV9ESVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNBCi0vKiBUaGUgdXNlIG9mIHRoZXNlIGluc3RydWN0aW9ucyBhcHBlYXJzIHRvIGJlIGluZGljYXRlZCBieSBiaXQgMzEgb2YgRFdPUkQgMi4qLwotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfQlJBX09QQ09ERV9CUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX0JSQV9PUENPREVfQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9CUkFfT1BDT0RFX0lGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfQlJBX09QQ09ERV9MT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX0JSQV9PUENPREVfUkVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9CUkFfT1BDT0RFX1JFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQotI2RlZmluZSBOVjQwX0ZQX09QX09VVF9TQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMSkKLQotLyogaGlnaCBvcmRlciBiaXRzIG9mIFNSQzAgKi8KLSNkZWZpbmUgTlY0MF9GUF9PUF9PVVRfQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjkpCi0jZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9TV1pfV19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBOVjQwX0ZQX09QX0NPTkRfU1daX1dfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyNykKLSNkZWZpbmUgTlY0MF9GUF9PUF9DT05EX1NXWl9aX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9TV1pfWl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDI1KQotI2RlZmluZSBOVjQwX0ZQX09QX0NPTkRfU1daX1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgTlY0MF9GUF9PUF9DT05EX1NXWl9ZX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMjMpCi0jZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9TV1pfWF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBOVjQwX0ZQX09QX0NPTkRfU1daX1hfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyMSkKLSNkZWZpbmUgTlY0MF9GUF9PUF9DT05EX1NXWl9BTExfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9TV1pfQUxMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDIxKQotI2RlZmluZSBOVjQwX0ZQX09QX0NPTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKLSNkZWZpbmUgTlY0MF9GUF9PUF9DT05EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDcgPDwgMTgpCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9DT05EX0ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9MVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX0NPTkRfRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9DT05EX0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9HVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX09QX0NPTkRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9PUF9DT05EX0dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfT1BfQ09ORF9UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLQotLyogaGlnaCBvcmRlciBiaXRzIG9mIFNSQzEgKi8KLSNkZWZpbmUgTlY0MF9GUF9PUF9PUENPREVfSVNfQlJBTkNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MzEpCi0jZGVmaW5lIE5WNDBfRlBfT1BfRFNUX1NDQUxFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOAotI2RlZmluZSBOVjQwX0ZQX09QX0RTVF9TQ0FMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyOCkKLQotLyogU1JDMSBMT09QICovCi0jZGVmaW5lIE5WNDBfRlBfT1BfTE9PUF9JTkNSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOQotI2RlZmluZSBOVjQwX0ZQX09QX0xPT1BfSU5DUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRiA8PCAxOSkKLSNkZWZpbmUgTlY0MF9GUF9PUF9MT09QX0lOREVYX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIE5WNDBfRlBfT1BfTE9PUF9JTkRFWF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDEwKQotI2RlZmluZSBOVjQwX0ZQX09QX0xPT1BfQ09VTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTlY0MF9GUF9PUF9MT09QX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDIpCi0KLS8qIFNSQzEgSUYgKi8KLSNkZWZpbmUgTlY0MF9GUF9PUF9FTFNFX0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE5WNDBfRlBfT1BfRUxTRV9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRiA8PCAyKQotCi0vKiBTUkMxIENBTCAqLwotI2RlZmluZSBOVjQwX0ZQX09QX0lBRERSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTlY0MF9GUF9PUF9JQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGIDw8IDIpCi0KLS8qIFNSQzEgUkVQCi0gKiAgIEkgaGF2ZSBubyBpZGVhIHdoeSB0aGVyZSBhcmUgMyBjb3VudCB2YWx1ZXMgaGVyZS4uICBidXQgdGhleQotICogICBoYXZlIGFsd2F5cyBiZWVuIGZpbGxlZCB3aXRoIHRoZSBzYW1lIHZhbHVlIGluIG15IHRlc3RzIHNvCi0gKiAgIGZhci4uCi0gKi8KLSNkZWZpbmUgTlY0MF9GUF9PUF9SRVBfQ09VTlQxX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE5WNDBfRlBfT1BfUkVQX0NPVU5UMV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRiA8PCAyKQotI2RlZmluZSBOVjQwX0ZQX09QX1JFUF9DT1VOVDJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTlY0MF9GUF9PUF9SRVBfQ09VTlQyX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYgPDwgMTApCi0jZGVmaW5lIE5WNDBfRlBfT1BfUkVQX0NPVU5UM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOQotI2RlZmluZSBOVjQwX0ZQX09QX1JFUF9DT1VOVDNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRiA8PCAxOSkKLQotLyogU1JDMiBSRVAvSUYgKi8KLSNkZWZpbmUgTlY0MF9GUF9PUF9FTkRfSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE5WNDBfRlBfT1BfRU5EX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRiA8PCAyKQotCi0vLyBTUkMyIGhpZ2gtb3JkZXIKLSNkZWZpbmUgTlY0MF9GUF9PUF9JTkRFWF9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMzApCi0jZGVmaW5lIE5WNDBfRlBfT1BfQUREUl9JTkRFWF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOQotI2RlZmluZSBOVjQwX0ZQX09QX0FERFJfSU5ERVhfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RiA8PCAxOSkKLQotLy89PSBSZWdpc3RlciBzZWxlY3Rpb24gPT0KLSNkZWZpbmUgTlY0MF9GUF9SRUdfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE5WNDBfRlBfUkVHX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAwKQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfUkVHX1RZUEVfVEVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX1JFR19UWVBFX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9SRUdfVFlQRV9DT05TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBOVjQwX0ZQX1JFR19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTlY0MF9GUF9SRUdfU1JDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMxIDw8IDIpCi0jZGVmaW5lIE5WNDBfRlBfUkVHX1VOS18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQotI2RlZmluZSBOVjQwX0ZQX1JFR19TV1pfQUxMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTlY0MF9GUF9SRUdfU1daX0FMTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjU1IDw8IDkpCi0jZGVmaW5lIE5WNDBfRlBfUkVHX1NXWl9YX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBOVjQwX0ZQX1JFR19TV1pfWF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgOSkKLSNkZWZpbmUgTlY0MF9GUF9SRUdfU1daX1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIE5WNDBfRlBfUkVHX1NXWl9ZX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDExKQotI2RlZmluZSBOVjQwX0ZQX1JFR19TV1pfWl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgTlY0MF9GUF9SRUdfU1daX1pfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMTMpCi0jZGVmaW5lIE5WNDBfRlBfUkVHX1NXWl9XX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBOVjQwX0ZQX1JFR19TV1pfV19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxNSkKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX1NXSVpaTEVfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jICAgICAgICBkZWZpbmUgTlY0MF9GUF9TV0laWkxFX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotIyAgICAgICAgZGVmaW5lIE5WNDBfRlBfU1dJWlpMRV9aICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSMgICAgICAgIGRlZmluZSBOVjQwX0ZQX1NXSVpaTEVfVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE5WNDBfRlBfUkVHX05FR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbnY0MF92ZXJ0cHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjQwX3ZlcnRwcm9nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTQxNDAuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjQwX3ZlcnRwcm9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzggKzAsMCBAQAotI2luY2x1ZGUgIm5vdXZlYXVfc2hhZGVyLmgiCi0jaW5jbHVkZSAibm91dmVhdV9tc2cuaCIKLSNpbmNsdWRlICJudjQwX3NoYWRlci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFzc2VtYmx5IHJvdXRpbmVzCi0gKi8KLXN0YXRpYyBpbnQKLU5WNDBWUFN1cHBvcnRzT3Bjb2RlKG52c0Z1bmMgKiBzaGFkZXIsIG52c09wY29kZSBvcCkKLXsKLSAgIGlmIChzaGFkZXItPkdldE9QVFhGcm9tU09QKG9wLCBOVUxMKSkKLSAgICAgIHJldHVybiAxOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBTZXRPcGNvZGUobnZzRnVuYyAqc2hhZGVyLCB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBpbnQgc2xvdCkKLXsKLSAgIGlmIChzbG90KSB7Ci0gICAgICBzaGFkZXItPmluc3RbMV0gJj0gfk5WNDBfVlBfSU5TVF9TQ0FfT1BDT0RFX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbMV0gfD0gKG9wY29kZSA8PCBOVjQwX1ZQX0lOU1RfU0NBX09QQ09ERV9TSElGVCk7Ci0gICB9IGVsc2UgewotICAgICAgc2hhZGVyLT5pbnN0WzFdICY9IH5OVjQwX1ZQX0lOU1RfVkVDX09QQ09ERV9NQVNLOwotICAgICAgc2hhZGVyLT5pbnN0WzFdIHw9IChvcGNvZGUgPDwgTlY0MF9WUF9JTlNUX1ZFQ19PUENPREVfU0hJRlQpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotTlY0MFZQU2V0Q0NVcGRhdGUobnZzRnVuYyAqc2hhZGVyKQotewotICAgc2hhZGVyLT5pbnN0WzBdIHw9IE5WNDBfVlBfSU5TVF9DT05EX1VQREFURV9FTkFCTEU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBTZXRDb25kaXRpb24obnZzRnVuYyAqc2hhZGVyLCBpbnQgb24sIG52c0NvbmQgY29uZCwgaW50IHJlZywKLSAgICAgIAkJICAgbnZzU3d6Q29tcCAqc3dpenpsZSkKLXsKLSAgIHVuc2lnbmVkIGludCBod2NvbmQ7Ci0KLSAgIGlmIChvbiApIHNoYWRlci0+aW5zdFswXSB8PSBOVjQwX1ZQX0lOU1RfQ09ORF9URVNUX0VOQUJMRTsKLSAgIGVsc2UgICAgIHNoYWRlci0+aW5zdFswXSAmPSB+TlY0MF9WUF9JTlNUX0NPTkRfVEVTVF9FTkFCTEU7Ci0gICBpZiAocmVnKSBzaGFkZXItPmluc3RbMF0gfD0gTlY0MF9WUF9JTlNUX0NPTkRfUkVHX1NFTEVDVF8xOwotICAgZWxzZSAgICAgc2hhZGVyLT5pbnN0WzBdICY9IH5OVjQwX1ZQX0lOU1RfQ09ORF9SRUdfU0VMRUNUXzE7Ci0KLSAgIHN3aXRjaCAoY29uZCkgewotICAgY2FzZSBOVlNfQ09ORF9UUjogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfVFI7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9GTDogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfRkw7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9MVDogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfTFQ7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9HVDogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfR1Q7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9ORTogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfTkU7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9FUTogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfRVE7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9HRTogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfR0U7IGJyZWFrOwotICAgY2FzZSBOVlNfQ09ORF9MRTogaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfTEU7IGJyZWFrOwotICAgZGVmYXVsdDoKLQlXQVJOX09OQ0UoInVua25vd24gdnAgY29uZCAlZFxuIiwgY29uZCk7Ci0JaHdjb25kID0gTlY0MF9WUF9JTlNUX0NPTkRfVFI7Ci0JYnJlYWs7Ci0gICB9Ci0gICBzaGFkZXItPmluc3RbMF0gJj0gfk5WNDBfVlBfSU5TVF9DT05EX01BU0s7Ci0gICBzaGFkZXItPmluc3RbMF0gfD0gKGh3Y29uZCA8PCBOVjQwX1ZQX0lOU1RfQ09ORF9TSElGVCk7Ci0KLSAgIHNoYWRlci0+aW5zdFswXSAmPSB+TlY0MF9WUF9JTlNUX0NPTkRfU1daX0FMTF9NQVNLOwotICAgc2hhZGVyLT5pbnN0WzBdIHw9IChzd2l6emxlW05WU19TV1pfWF0gPDwgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1hfU0hJRlQpOwotICAgc2hhZGVyLT5pbnN0WzBdIHw9IChzd2l6emxlW05WU19TV1pfWV0gPDwgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1lfU0hJRlQpOwotICAgc2hhZGVyLT5pbnN0WzBdIHw9IChzd2l6emxlW05WU19TV1pfWl0gPDwgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1pfU0hJRlQpOwotICAgc2hhZGVyLT5pbnN0WzBdIHw9IChzd2l6emxlW05WU19TV1pfV10gPDwgTlY0MF9WUF9JTlNUX0NPTkRfU1daX1dfU0hJRlQpOwotfQotCi0vKiB0aGVzZSBqdXN0IGV4aXN0IGhlcmUgdW50aWwgbm91dmVhdV9yZWcuaCBoYXMgdGhlbS4gKi8KLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ09MMAkoMTw8MCkKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ09MMQkoMTw8MSkKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQkZDMAkoMTw8MikKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQkZDMQkoMTw8MykKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfRk9HQwkoMTw8NCkKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfUFNaCSgxPDw1KQotI2RlZmluZSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFAwCSgxPDw2KQotI2RlZmluZSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFAxCSgxPDw3KQotI2RlZmluZSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFAyCSgxPDw4KQotI2RlZmluZSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFAzCSgxPDw5KQotI2RlZmluZSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFA0CSgxPDwxMCkKLSNkZWZpbmUgTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ0xQNQkoMTw8MTEpCi0jZGVmaW5lIE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX1RFWDAgICAoMTw8MTQpCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLU5WNDBWUFRyYW5zbGF0ZVJlc3VsdFJlZyhudnNGdW5jICpzaGFkZXIsIG52c0ZpeGVkUmVnIHJlc3VsdCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKm1hc2tfcmV0KQotewotCXVuc2lnbmVkIGludCAqb3V0X3JlZyA9ICZzaGFkZXItPmNhcmRfcHJpdi0+TlYzMFZQLnZwX291dF9yZWc7Ci0JdW5zaWduZWQgaW50ICpjbGlwX2VuID0gJnNoYWRlci0+Y2FyZF9wcml2LT5OVjMwVlAuY2xpcF9lbmFibGVzOwotCi0JKm1hc2tfcmV0ID0gMHhmOwotCi0Jc3dpdGNoIChyZXN1bHQpIHsKLQljYXNlIE5WU19GUl9QT1NJVElPTjoKLQkJLyogb3V0X3JlZyBQT1MgaW1wbGllZCAqLwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfUE9TOwotCWNhc2UgTlZTX0ZSX0NPTDA6Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ09MMDsKLQkJcmV0dXJuIE5WNDBfVlBfSU5TVF9ERVNUX0NPTDA7Ci0JY2FzZSBOVlNfRlJfQ09MMToKLQkJKCpvdXRfcmVnKSB8PSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DT0wxOwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfQ09MMTsKLQljYXNlIE5WU19GUl9CRkMwOgotCQkoKm91dF9yZWcpIHw9IE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX0JGQzA7Ci0JCXJldHVybiBOVjQwX1ZQX0lOU1RfREVTVF9CRkMwOwotCWNhc2UgTlZTX0ZSX0JGQzE6Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQkZDMTsKLQkJcmV0dXJuIE5WNDBfVlBfSU5TVF9ERVNUX0JGQzE7Ci0JY2FzZSBOVlNfRlJfRk9HQ09PUkQ6Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfRk9HQzsKLQkJKm1hc2tfcmV0ID0gMHg4OwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfRk9HQzsKLQljYXNlIE5WU19GUl9DTElQMDoKLQkJKCpvdXRfcmVnKSB8PSBOVjMwX1RDTF9QUklNSVRJVkVfM0RfVlBfT1VUX1JFR19DTFAwOwotCQkoKmNsaXBfZW4pIHw9IDB4MDAwMDAwMDI7Ci0JCSptYXNrX3JldCA9IDB4NDsKLQkJcmV0dXJuIE5WNDBfVlBfSU5TVF9ERVNUX0ZPR0M7Ci0JY2FzZSBOVlNfRlJfQ0xJUDE6Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ0xQMTsKLQkJKCpjbGlwX2VuKSB8PSAweDAwMDAwMDIwOwotCQkqbWFza19yZXQgPSAweDI7Ci0JCXJldHVybiBOVjQwX1ZQX0lOU1RfREVTVF9GT0dDOwotCWNhc2UgTlZTX0ZSX0NMSVAyOgotCQkoKm91dF9yZWcpIHw9IE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX0NMUDI7Ci0JCSgqY2xpcF9lbikgfD0gMHgwMDAwMDIwMDsKLQkJKm1hc2tfcmV0ID0gMHgxOwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfRk9HQzsKLQljYXNlIE5WU19GUl9QT0lOVFNaOgotCQkoKm91dF9yZWcpIHw9IE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX1BTWjsKLQkJKm1hc2tfcmV0ID0gMHg4OwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfUFNaOwotCWNhc2UgTlZTX0ZSX0NMSVAzOgotCQkoKm91dF9yZWcpIHw9IE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX0NMUDM7Ci0JCSgqY2xpcF9lbikgfD0gMHgwMDAwMjAwMDsKLQkJKm1hc2tfcmV0ID0gMHg0OwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfUFNaOwotCWNhc2UgTlZTX0ZSX0NMSVA0OgotCQkoKmNsaXBfZW4pIHw9IDB4MDAwMjAwMDA7Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ0xQNDsKLQkJKm1hc2tfcmV0ID0gMHgyOwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfUFNaOwotCWNhc2UgTlZTX0ZSX0NMSVA1OgotCQkoKmNsaXBfZW4pIHw9IDB4MDAyMDAwMDA7Ci0JCSgqb3V0X3JlZykgfD0gTlYzMF9UQ0xfUFJJTUlUSVZFXzNEX1ZQX09VVF9SRUdfQ0xQNTsKLQkJKm1hc2tfcmV0ID0gMHgxOwotCQlyZXR1cm4gTlY0MF9WUF9JTlNUX0RFU1RfUFNaOwotCWNhc2UgTlZTX0ZSX1RFWENPT1JEMDoKLQljYXNlIE5WU19GUl9URVhDT09SRDE6Ci0JY2FzZSBOVlNfRlJfVEVYQ09PUkQyOgotCWNhc2UgTlZTX0ZSX1RFWENPT1JEMzoKLQljYXNlIE5WU19GUl9URVhDT09SRDQ6Ci0JY2FzZSBOVlNfRlJfVEVYQ09PUkQ1OgotCWNhc2UgTlZTX0ZSX1RFWENPT1JENjoKLQljYXNlIE5WU19GUl9URVhDT09SRDc6Ci0JewotCQlpbnQgdW5pdCA9IHJlc3VsdCAtIE5WU19GUl9URVhDT09SRDA7Ci0JCSgqb3V0X3JlZykgfD0gKE5WMzBfVENMX1BSSU1JVElWRV8zRF9WUF9PVVRfUkVHX1RFWDAgPDwgdW5pdCk7Ci0JCXJldHVybiBOVjQwX1ZQX0lOU1RfREVTVF9UQyh1bml0KTsKLQl9Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNFKCJ1bmtub3duIHZwIG91dHB1dCAlZFxuIiwgcmVzdWx0KTsKLQkJcmV0dXJuIE5WNDBfVlBfSU5TVF9ERVNUX1BPUzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBTZXRSZXN1bHQobnZzRnVuYyAqc2hhZGVyLCBudnNSZWdpc3RlciAqIGRlc3QsIHVuc2lnbmVkIGludCBtYXNrLAotICAgICAgCQlpbnQgc2xvdCkKLXsKLSAgIHVuc2lnbmVkIGludCBod21hc2sgPSAwOwotCi0gICBpZiAobWFzayAmIFNNQVNLX1gpIGh3bWFzayB8PSAoMSA8PCAzKTsKLSAgIGlmIChtYXNrICYgU01BU0tfWSkgaHdtYXNrIHw9ICgxIDw8IDIpOwotICAgaWYgKG1hc2sgJiBTTUFTS19aKSBod21hc2sgfD0gKDEgPDwgMSk7Ci0gICBpZiAobWFzayAmIFNNQVNLX1cpIGh3bWFzayB8PSAoMSA8PCAwKTsKLQotICAgaWYgKGRlc3QtPmZpbGUgPT0gTlZTX0ZJTEVfUkVTVUxUKSB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdmFsaWRfbWFzazsKLSAgICAgIGludCBod2lkeDsKLQotICAgICAgaHdpZHggPSBOVjQwVlBUcmFuc2xhdGVSZXN1bHRSZWcoc2hhZGVyLCBkZXN0LT5pbmRleCwgJnZhbGlkX21hc2spOwotICAgICAgaWYgKGh3bWFzayAmIH52YWxpZF9tYXNrKQotCSAgICAgIFdBUk5fT05DRSgid3JpdGluZyBpbnZhbGlkIGNvbXBvbmVudHMgb2YgcmVzdWx0IHJlZ1xuIik7Ci0gICAgICBod21hc2sgJj0gdmFsaWRfbWFzazsKLQotICAgICAgc2hhZGVyLT5pbnN0WzNdICY9IH5OVjQwX1ZQX0lOU1RfREVTVF9NQVNLOwotICAgICAgc2hhZGVyLT5pbnN0WzNdIHw9IChod2lkeCA8PCBOVjQwX1ZQX0lOU1RfREVTVF9TSElGVCk7Ci0KLSAgICAgIGlmIChzbG90KSBzaGFkZXItPmluc3RbM10gfD0gTlY0MF9WUF9JTlNUX1NDQV9SRVNVTFQ7Ci0gICAgICBlbHNlICAgICAgc2hhZGVyLT5pbnN0WzBdIHw9IE5WNDBfVlBfSU5TVF9WRUNfUkVTVUxUOwotICAgfSBlbHNlIHsKLSAgICAgIC8qIE5WU19GSUxFX1RFTVAgfHwgTlZTX0ZJTEVfQUREUkVTUyAqLwotICAgICAgaWYgKHNsb3QpIHsKLQkgc2hhZGVyLT5pbnN0WzNdICY9IH5OVjQwX1ZQX0lOU1RfU0NBX1JFU1VMVDsKLQkgc2hhZGVyLT5pbnN0WzNdICY9IH5OVjQwX1ZQX0lOU1RfU0NBX0RFU1RfVEVNUF9NQVNLOwotCSBzaGFkZXItPmluc3RbM10gfD0gKGRlc3QtPmluZGV4IDw8IE5WNDBfVlBfSU5TVF9TQ0FfREVTVF9URU1QX1NISUZUKTsKLSAgICAgIH0gZWxzZSB7Ci0JIHNoYWRlci0+aW5zdFswXSAmPSB+TlY0MF9WUF9JTlNUX1ZFQ19SRVNVTFQ7Ci0JIHNoYWRlci0+aW5zdFswXSAmPSB+KE5WNDBfVlBfSU5TVF9WRUNfREVTVF9URU1QX01BU0sgfCAoMTw8MjApKTsKLQkgc2hhZGVyLT5pbnN0WzBdIHw9IChkZXN0LT5pbmRleCA8PCBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9TSElGVCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChzbG90KSB7Ci0gICAgICBzaGFkZXItPmluc3RbM10gJj0gfk5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbM10gfD0gKGh3bWFzayA8PCBOVjQwX1ZQX0lOU1RfU0NBX1dSSVRFTUFTS19TSElGVCk7Ci0gICB9IGVsc2UgewotICAgICAgc2hhZGVyLT5pbnN0WzNdICY9IH5OVjQwX1ZQX0lOU1RfVkVDX1dSSVRFTUFTS19NQVNLOwotICAgICAgc2hhZGVyLT5pbnN0WzNdIHw9IChod21hc2sgPDwgTlY0MF9WUF9JTlNUX1ZFQ19XUklURU1BU0tfU0hJRlQpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotTlY0MFZQSW5zZXJ0U291cmNlKG52c0Z1bmMgKnNoYWRlciwgdW5zaWduZWQgaW50IGh3LCBpbnQgcG9zKQotewotICAgc3dpdGNoIChwb3MpIHsKLSAgIGNhc2UgMDoKLSAgICAgIHNoYWRlci0+aW5zdFsxXSAmPSB+TlY0MF9WUF9JTlNUX1NSQzBIX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbMl0gJj0gfk5WNDBfVlBfSU5TVF9TUkMwTF9NQVNLOwotICAgICAgc2hhZGVyLT5pbnN0WzFdIHw9ICgoaHcgJiBOVjQwX1ZQX1NSQzBfSElHSF9NQVNLKSA+PgotCSAgICBOVjQwX1ZQX1NSQzBfSElHSF9TSElGVCkKLQkgPDwgTlY0MF9WUF9JTlNUX1NSQzBIX1NISUZUOwotICAgICAgc2hhZGVyLT5pbnN0WzJdIHw9IChodyAmIE5WNDBfVlBfU1JDMF9MT1dfTUFTSykKLQkgPDwgTlY0MF9WUF9JTlNUX1NSQzBMX1NISUZUOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDE6Ci0gICAgICBzaGFkZXItPmluc3RbMl0gJj0gfk5WNDBfVlBfSU5TVF9TUkMxX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbMl0gfD0gaHcKLQkgPDwgTlY0MF9WUF9JTlNUX1NSQzFfU0hJRlQ7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgMjoKLSAgICAgIHNoYWRlci0+aW5zdFsyXSAmPSB+TlY0MF9WUF9JTlNUX1NSQzJIX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbM10gJj0gfk5WNDBfVlBfSU5TVF9TUkMyTF9NQVNLOwotICAgICAgc2hhZGVyLT5pbnN0WzJdIHw9ICgoaHcgJiBOVjQwX1ZQX1NSQzJfSElHSF9NQVNLKSA+PgotCSAgICBOVjQwX1ZQX1NSQzJfSElHSF9TSElGVCkKLQkgPDwgTlY0MF9WUF9JTlNUX1NSQzJIX1NISUZUOwotICAgICAgc2hhZGVyLT5pbnN0WzNdIHw9IChodyAmIE5WNDBfVlBfU1JDMl9MT1dfTUFTSykKLQkgPDwgTlY0MF9WUF9JTlNUX1NSQzJMX1NISUZUOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KDApOwotICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBTZXRTb3VyY2UobnZzRnVuYyAqc2hhZGVyLCBudnNSZWdpc3RlciAqIHNyYywgaW50IHBvcykKLXsKLSAgIHVuc2lnbmVkIGludCBodyA9IDA7Ci0KLSAgIHN3aXRjaCAoc3JjLT5maWxlKSB7Ci0gICBjYXNlIE5WU19GSUxFX0FERFJFU1M6Ci0gICAgICBicmVhazsKLSAgIGNhc2UgTlZTX0ZJTEVfQVRUUklCOgotICAgICAgaHcgfD0gKE5WNDBfVlBfU1JDX1JFR19UWVBFX0lOUFVUIDw8IE5WNDBfVlBfU1JDX1JFR19UWVBFX1NISUZUKTsKLQotICAgICAgc2hhZGVyLT5pbnN0WzFdICY9IH5OVjQwX1ZQX0lOU1RfSU5QVVRfU1JDX01BU0s7Ci0gICAgICBzaGFkZXItPmluc3RbMV0gfD0gKHNyYy0+aW5kZXggPDwgTlY0MF9WUF9JTlNUX0lOUFVUX1NSQ19TSElGVCk7Ci0gICAgICBzaGFkZXItPmNhcmRfcHJpdi0+TlYzMFZQLnZwX2luX3JlZyB8PSAoMSA8PCBzcmMtPmluZGV4KTsKLSAgICAgIGlmIChzcmMtPmluZGV4ZWQpIHsKLQkgc2hhZGVyLT5pbnN0WzBdIHw9IE5WNDBfVlBfSU5TVF9JTkRFWF9JTlBVVDsKLQkgaWYgKHNyYy0+YWRkcl9yZWcpCi0JICAgIHNoYWRlci0+aW5zdFswXSB8PSBOVjQwX1ZQX0lOU1RfQUREUl9SRUdfU0VMRUNUXzE7Ci0JIGVsc2UKLQkgICAgc2hhZGVyLT5pbnN0WzBdICY9IH5OVjQwX1ZQX0lOU1RfQUREUl9SRUdfU0VMRUNUXzE7Ci0JIHNoYWRlci0+aW5zdFswXSAmPSB+TlY0MF9WUF9JTlNUX0FERFJfU1daX1NISUZUOwotCSBzaGFkZXItPmluc3RbMF0gfD0gKHNyYy0+YWRkcl9jb21wIDw8IE5WNDBfVlBfSU5TVF9BRERSX1NXWl9TSElGVCk7Ci0gICAgICB9IGVsc2UKLQkgc2hhZGVyLT5pbnN0WzBdICY9IH5OVjQwX1ZQX0lOU1RfSU5ERVhfSU5QVVQ7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgTlZTX0ZJTEVfQ09OU1Q6Ci0gICAgICBodyB8PSAoTlY0MF9WUF9TUkNfUkVHX1RZUEVfQ09OU1QgPDwgTlY0MF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQpOwotCi0gICAgICBzaGFkZXItPmluc3RbMV0gJj0gfk5WNDBfVlBfSU5TVF9DT05TVF9TUkNfTUFTSzsKLSAgICAgIHNoYWRlci0+aW5zdFsxXSB8PSAoc3JjLT5pbmRleCA8PCBOVjQwX1ZQX0lOU1RfQ09OU1RfU1JDX1NISUZUKTsKLSAgICAgIGlmIChzcmMtPmluZGV4ZWQpIHsKLQkgc2hhZGVyLT5pbnN0WzNdIHw9IE5WNDBfVlBfSU5TVF9JTkRFWF9DT05TVDsKLQkgaWYgKHNyYy0+YWRkcl9yZWcpCi0JICAgIHNoYWRlci0+aW5zdFswXSB8PSBOVjQwX1ZQX0lOU1RfQUREUl9SRUdfU0VMRUNUXzE7Ci0JIGVsc2UKLQkgICAgc2hhZGVyLT5pbnN0WzBdICY9IH5OVjQwX1ZQX0lOU1RfQUREUl9SRUdfU0VMRUNUXzE7Ci0JIHNoYWRlci0+aW5zdFswXSAmPSB+TlY0MF9WUF9JTlNUX0FERFJfU1daX01BU0s7Ci0JIHNoYWRlci0+aW5zdFswXSB8PSAoc3JjLT5hZGRyX2NvbXAgPDwgTlY0MF9WUF9JTlNUX0FERFJfU1daX1NISUZUKTsKLSAgICAgIH0gZWxzZQotCSBzaGFkZXItPmluc3RbM10gJj0gfk5WNDBfVlBfSU5TVF9JTkRFWF9DT05TVDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVlNfRklMRV9URU1QOgotICAgICAgaHcgfD0gKE5WNDBfVlBfU1JDX1JFR19UWVBFX1RFTVAgPDwgTlY0MF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQpOwotICAgICAgaHcgfD0gKHNyYy0+aW5kZXggPDwgTlY0MF9WUF9TUkNfVEVNUF9TUkNfU0hJRlQpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIHNvdXJjZSBmaWxlICVkXG4iLCBzcmMtPmZpbGUpOwotICAgICAgYXNzZXJ0KDApOwotICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIGlmIChzcmMtPmZpbGUgIT0gTlZTX0ZJTEVfQUREUkVTUykgewotICAgICAgaWYgKHNyYy0+bmVnYXRlKQotCSBodyB8PSBOVjQwX1ZQX1NSQ19ORUdBVEU7Ci0gICAgICBpZiAoc3JjLT5hYnMpCi0JIHNoYWRlci0+aW5zdFswXSB8PSAoMSA8PCAoMjEgKyBwb3MpKTsKLSAgICAgIGVsc2UKLQkgc2hhZGVyLT5pbnN0WzBdICY9IH4oMSA8PCAoMjEgKyBwb3MpKTsKLSAgICAgIGh3IHw9IChzcmMtPnN3aXp6bGVbMF0gPDwgTlY0MF9WUF9TUkNfU1daX1hfU0hJRlQpOwotICAgICAgaHcgfD0gKHNyYy0+c3dpenpsZVsxXSA8PCBOVjQwX1ZQX1NSQ19TV1pfWV9TSElGVCk7Ci0gICAgICBodyB8PSAoc3JjLT5zd2l6emxlWzJdIDw8IE5WNDBfVlBfU1JDX1NXWl9aX1NISUZUKTsKLSAgICAgIGh3IHw9IChzcmMtPnN3aXp6bGVbM10gPDwgTlY0MF9WUF9TUkNfU1daX1dfU0hJRlQpOwotCi0gICAgICBOVjQwVlBJbnNlcnRTb3VyY2Uoc2hhZGVyLCBodywgcG9zKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU5WNDBWUFNldEJyYW5jaFRhcmdldChudnNGdW5jICpzaGFkZXIsIGludCBhZGRyKQotewotCXNoYWRlci0+aW5zdFsyXSAmPSB+TlY0MF9WUF9JTlNUX0lBRERSSF9NQVNLOwotCXNoYWRlci0+aW5zdFsyXSB8PSAoKGFkZHIgJiAweGY4KSA+PiAzKSA8PCBOVjQwX1ZQX0lOU1RfSUFERFJIX1NISUZUOwotCXNoYWRlci0+aW5zdFszXSAmPSB+TlY0MF9WUF9JTlNUX0lBRERSTF9NQVNLOwotCXNoYWRlci0+aW5zdFszXSB8PSAoKGFkZHIgJiAweDA3KSA8PCBOVjQwX1ZQX0lOU1RfSUFERFJMX1NISUZUKTsKLX0KLQotc3RhdGljIHZvaWQKLU5WNDBWUEluaXRJbnN0cnVjdGlvbihudnNGdW5jICpzaGFkZXIpCi17Ci0gICB1bnNpZ25lZCBpbnQgaHdzcmMgPSAwOwotCi0gICBzaGFkZXItPmluc3RbMF0gPSAvKk5WNDBfVlBfSU5TVF9WRUNfUkVTVUxUIHwgKi8KLSAgICAgIAkJICAgICBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9NQVNLIHwgKDE8PDIwKTsKLSAgIHNoYWRlci0+aW5zdFsxXSA9IDA7Ci0gICBzaGFkZXItPmluc3RbMl0gPSAwOwotICAgc2hhZGVyLT5pbnN0WzNdID0gTlY0MF9WUF9JTlNUX1NDQV9SRVNVTFQgfAotICAgICAgCQkgICAgIE5WNDBfVlBfSU5TVF9TQ0FfREVTVF9URU1QX01BU0sgfAotCQkgICAgIE5WNDBfVlBfSU5TVF9ERVNUX01BU0s7Ci0gICAKLSAgIGh3c3JjID0gKE5WNDBfVlBfU1JDX1JFR19UWVBFX0lOUFVUIDw8IE5WNDBfVlBfU1JDX1JFR19UWVBFX1NISUZUKSB8Ci0gICAgICAJICAgKE5WU19TV1pfWCA8PCBOVjQwX1ZQX1NSQ19TV1pfWF9TSElGVCkgfAotICAgICAgCSAgIChOVlNfU1daX1kgPDwgTlY0MF9WUF9TUkNfU1daX1lfU0hJRlQpIHwKLSAgICAgIAkgICAoTlZTX1NXWl9aIDw8IE5WNDBfVlBfU1JDX1NXWl9aX1NISUZUKSB8Ci0gICAgICAJICAgKE5WU19TV1pfVyA8PCBOVjQwX1ZQX1NSQ19TV1pfV19TSElGVCk7Ci0gICBOVjQwVlBJbnNlcnRTb3VyY2Uoc2hhZGVyLCBod3NyYywgMCk7Ci0gICBOVjQwVlBJbnNlcnRTb3VyY2Uoc2hhZGVyLCBod3NyYywgMSk7Ci0gICBOVjQwVlBJbnNlcnRTb3VyY2Uoc2hhZGVyLCBod3NyYywgMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBTZXRMYXN0SW5zdChudnNGdW5jICpzaGFkZXIpCi17Ci0gICBzaGFkZXItPmluc3RbM10gfD0gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEaXNhc3NlbWJseSByb3V0aW5lcwotICovCi1zdGF0aWMgaW50Ci1OVjQwVlBIYXNNZXJnZWRJbnN0KG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBpZiAoc2hhZGVyLT5HZXRPcGNvZGVIVyhzaGFkZXIsIDApICE9IE5WNDBfVlBfSU5TVF9PUF9OT1AgJiYKLSAgICAgICBzaGFkZXItPkdldE9wY29kZUhXKHNoYWRlciwgMSkgIT0gTlY0MF9WUF9JTlNUX09QX05PUCkKLSAgICAgIHJldHVybiAxOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLU5WNDBWUEdldE9wY29kZUhXKG52c0Z1bmMgKiBzaGFkZXIsIGludCBzbG90KQotewotICAgaW50IG9wOwotCi0gICBpZiAoc2xvdCkKLSAgICAgIG9wID0gKHNoYWRlci0+aW5zdFsxXSAmIE5WNDBfVlBfSU5TVF9TQ0FfT1BDT0RFX01BU0spCi0JID4+IE5WNDBfVlBfSU5TVF9TQ0FfT1BDT0RFX1NISUZUOwotICAgZWxzZQotICAgICAgb3AgPSAoc2hhZGVyLT5pbnN0WzFdICYgTlY0MF9WUF9JTlNUX1ZFQ19PUENPREVfTUFTSykKLQkgPj4gTlY0MF9WUF9JTlNUX1ZFQ19PUENPREVfU0hJRlQ7Ci0KLSAgIHJldHVybiBvcDsKLX0KLQotc3RhdGljIG52c1JlZ0ZpbGUKLU5WNDBWUEdldERlc3RGaWxlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQpCi17Ci0gICBudnNPcGNvZGUgb3A7Ci0KLSAgIG9wID0gc2hhZGVyLT5HZXRPcGNvZGUoc2hhZGVyLCBtZXJnZWQpOwotICAgc3dpdGNoIChvcCkgewotICAgY2FzZSBOVlNfT1BfQVJMOgotICAgY2FzZSBOVlNfT1BfQVJSOgotICAgY2FzZSBOVlNfT1BfQVJBOgotICAgY2FzZSBOVlNfT1BfUE9QQToKLSAgICAgIHJldHVybiBOVlNfRklMRV9BRERSRVNTOwotICAgZGVmYXVsdDoKLSAgICAgIGlmIChzaGFkZXItPkdldE9wY29kZVNsb3Qoc2hhZGVyLCBtZXJnZWQpKSB7Ci0JIGlmIChzaGFkZXItPmluc3RbM10gJiBOVjQwX1ZQX0lOU1RfU0NBX1JFU1VMVCkKLQkgICAgcmV0dXJuIE5WU19GSUxFX1JFU1VMVDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCSBpZiAoc2hhZGVyLT5pbnN0WzBdICYgTlY0MF9WUF9JTlNUX1ZFQ19SRVNVTFQpCi0JICAgIHJldHVybiBOVlNfRklMRV9SRVNVTFQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gTlZTX0ZJTEVfVEVNUDsKLSAgIH0KLQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjQwVlBHZXREZXN0SUQobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCkKLXsKLSAgIGludCBpZDsKLQotICAgc3dpdGNoIChzaGFkZXItPkdldERlc3RGaWxlKHNoYWRlciwgbWVyZ2VkKSkgewotICAgY2FzZSBOVlNfRklMRV9SRVNVTFQ6Ci0gICAgICBpZCA9ICgoc2hhZGVyLT5pbnN0WzNdICYgTlY0MF9WUF9JTlNUX0RFU1RfTUFTSykKLQkgICAgPj4gTlY0MF9WUF9JTlNUX0RFU1RfU0hJRlQpOwotICAgICAgc3dpdGNoIChpZCkgewotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9QT1MgOiByZXR1cm4gTlZTX0ZSX1BPU0lUSU9OOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9DT0wwOiByZXR1cm4gTlZTX0ZSX0NPTDA7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9ERVNUX0NPTDE6IHJldHVybiBOVlNfRlJfQ09MMTsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0RFU1RfQkZDMDogcmV0dXJuIE5WU19GUl9CRkMwOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9CRkMxOiByZXR1cm4gTlZTX0ZSX0JGQzE7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9ERVNUX0ZPR0M6IHsKLQkgICAgaW50IG1hc2sgPSBzaGFkZXItPkdldERlc3RNYXNrKHNoYWRlciwgbWVyZ2VkKTsKLQkgICAgc3dpdGNoIChtYXNrKSB7Ci0JICAgIGNhc2UgU01BU0tfWDogcmV0dXJuIE5WU19GUl9GT0dDT09SRDsKLQkgICAgY2FzZSBTTUFTS19ZOiByZXR1cm4gTlZTX0ZSX0NMSVAwOwotCSAgICBjYXNlIFNNQVNLX1o6IHJldHVybiBOVlNfRlJfQ0xJUDE7Ci0JICAgIGNhc2UgU01BU0tfVzogcmV0dXJuIE5WU19GUl9DTElQMjsKLQkgICAgZGVmYXVsdDoKLQkgICAgICAgcHJpbnRmKCJtb3JlIHRoYW4gMSBtYXNrIGNvbXBvbmVudCBzZXQgaW4gRk9HQyB3cml0ZW1hc2shXG4iKTsKLQkgICAgICAgcmV0dXJuIE5WU19GUl9VTktOT1dOOwotCSAgICB9Ci0JIH0KLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0RFU1RfUFNaOgotCSB7Ci0JICAgIGludCBtYXNrID0gc2hhZGVyLT5HZXREZXN0TWFzayhzaGFkZXIsIG1lcmdlZCk7Ci0JICAgIHN3aXRjaCAobWFzaykgewotCSAgICBjYXNlIFNNQVNLX1g6IHJldHVybiBOVlNfRlJfUE9JTlRTWjsKLQkgICAgY2FzZSBTTUFTS19ZOiByZXR1cm4gTlZTX0ZSX0NMSVAzOwotCSAgICBjYXNlIFNNQVNLX1o6IHJldHVybiBOVlNfRlJfQ0xJUDQ7Ci0JICAgIGNhc2UgU01BU0tfVzogcmV0dXJuIE5WU19GUl9DTElQNTsKLQkgICAgZGVmYXVsdDoKLQkgICAgICAgcHJpbnRmKCJtb3JlIHRoYW4gMSBtYXNrIGNvbXBvbmVudCBzZXQgaW4gUFNaIHdyaXRlbWFzayFcbiIpOwotCSAgICAgICByZXR1cm4gTlZTX0ZSX1VOS05PV047Ci0JICAgIH0KLQkgfQotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9UQygwKTogcmV0dXJuIE5WU19GUl9URVhDT09SRDA7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9ERVNUX1RDKDEpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JEMTsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0RFU1RfVEMoMik6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQyOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9UQygzKTogcmV0dXJuIE5WU19GUl9URVhDT09SRDM7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9ERVNUX1RDKDQpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENDsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0RFU1RfVEMoNSk6IHJldHVybiBOVlNfRlJfVEVYQ09PUkQ1OwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfREVTVF9UQyg2KTogcmV0dXJuIE5WU19GUl9URVhDT09SRDY7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9ERVNUX1RDKDcpOiByZXR1cm4gTlZTX0ZSX1RFWENPT1JENzsKLSAgICAgIGRlZmF1bHQ6Ci0JIHJldHVybiAtMTsKLSAgICAgIH0KLSAgIGNhc2UgTlZTX0ZJTEVfQUREUkVTUzoKLSAgICAgIC8qIEluc3RydWN0aW9ucyB0aGF0IHdyaXRlIGFkZHJlc3MgcmVncyBhcmUgZW5jb2RlZCBhcyBpZgotICAgICAgICogdGhleSB3b3VsZCB3cml0ZSB0ZW1wcy4KLSAgICAgICAqLwotICAgY2FzZSBOVlNfRklMRV9URU1QOgotICAgICAgaWYgKHNoYWRlci0+R2V0T3Bjb2RlU2xvdChzaGFkZXIsIG1lcmdlZCkpCi0JIGlkID0gKChzaGFkZXItPmluc3RbM10gJiBOVjQwX1ZQX0lOU1RfU0NBX0RFU1RfVEVNUF9NQVNLKQotCSAgICAgICA+PiBOVjQwX1ZQX0lOU1RfU0NBX0RFU1RfVEVNUF9TSElGVCk7Ci0gICAgICBlbHNlCi0JIGlkID0gKChzaGFkZXItPmluc3RbMF0gJiBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9NQVNLKQotCSAgICAgICA+PiBOVjQwX1ZQX0lOU1RfVkVDX0RFU1RfVEVNUF9TSElGVCk7Ci0gICAgICByZXR1cm4gaWQ7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC0xOwotICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1OVjQwVlBHZXREZXN0TWFzayhudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkKQotewotICAgdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0gICBpZiAoc2hhZGVyLT5HZXRPcGNvZGVTbG90KHNoYWRlciwgbWVyZ2VkKSkgewotICAgICAgaWYgKHNoYWRlci0+aW5zdFszXSAmIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX1gpIG1hc2sgfD0gU01BU0tfWDsKLSAgICAgIGlmIChzaGFkZXItPmluc3RbM10gJiBOVjQwX1ZQX0lOU1RfU0NBX1dSSVRFTUFTS19ZKSBtYXNrIHw9IFNNQVNLX1k7Ci0gICAgICBpZiAoc2hhZGVyLT5pbnN0WzNdICYgTlY0MF9WUF9JTlNUX1NDQV9XUklURU1BU0tfWikgbWFzayB8PSBTTUFTS19aOwotICAgICAgaWYgKHNoYWRlci0+aW5zdFszXSAmIE5WNDBfVlBfSU5TVF9TQ0FfV1JJVEVNQVNLX1cpIG1hc2sgfD0gU01BU0tfVzsKLSAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc2hhZGVyLT5pbnN0WzNdICYgTlY0MF9WUF9JTlNUX1ZFQ19XUklURU1BU0tfWCkgbWFzayB8PSBTTUFTS19YOwotICAgICAgaWYgKHNoYWRlci0+aW5zdFszXSAmIE5WNDBfVlBfSU5TVF9WRUNfV1JJVEVNQVNLX1kpIG1hc2sgfD0gU01BU0tfWTsKLSAgICAgIGlmIChzaGFkZXItPmluc3RbM10gJiBOVjQwX1ZQX0lOU1RfVkVDX1dSSVRFTUFTS19aKSBtYXNrIHw9IFNNQVNLX1o7Ci0gICAgICBpZiAoc2hhZGVyLT5pbnN0WzNdICYgTlY0MF9WUF9JTlNUX1ZFQ19XUklURU1BU0tfVykgbWFzayB8PSBTTUFTS19XOwotICAgfQotCi0gICByZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotTlY0MFZQR2V0U291cmNlSFcobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCwgaW50IHBvcykKLXsKLSAgIHN0cnVjdCBfb3BfeGxhdCAqb3ByOwotICAgdW5zaWduZWQgaW50IHNyYzsKLQotICAgb3ByID0gc2hhZGVyLT5HZXRPUFRYUmVjKHNoYWRlciwgbWVyZ2VkKTsKLSAgIGlmICghb3ByKQotICAgICAgcmV0dXJuIC0xOwotCi0gICBzd2l0Y2ggKG9wci0+c3JjcG9zW3Bvc10pIHsKLSAgIGNhc2UgMDoKLSAgICAgIHNyYyA9ICgoc2hhZGVyLT5pbnN0WzFdICYgTlY0MF9WUF9JTlNUX1NSQzBIX01BU0spCi0JICAgICA+PiBOVjQwX1ZQX0lOU1RfU1JDMEhfU0hJRlQpCi0JIDw8IE5WNDBfVlBfU1JDMF9ISUdIX1NISUZUOwotICAgICAgc3JjIHw9ICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9WUF9JTlNUX1NSQzBMX01BU0spCi0JICAgICAgPj4gTlY0MF9WUF9JTlNUX1NSQzBMX1NISUZUKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSAxOgotICAgICAgc3JjID0gKChzaGFkZXItPmluc3RbMl0gJiBOVjQwX1ZQX0lOU1RfU1JDMV9NQVNLKQotCSAgICAgPj4gTlY0MF9WUF9JTlNUX1NSQzFfU0hJRlQpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDI6Ci0gICAgICBzcmMgPSAoKHNoYWRlci0+aW5zdFsyXSAmIE5WNDBfVlBfSU5TVF9TUkMySF9NQVNLKQotCSAgICAgPj4gTlY0MF9WUF9JTlNUX1NSQzJIX1NISUZUKQotCSA8PCBOVjQwX1ZQX1NSQzJfSElHSF9TSElGVDsKLSAgICAgIHNyYyB8PSAoKHNoYWRlci0+aW5zdFszXSAmIE5WNDBfVlBfSU5TVF9TUkMyTF9NQVNLKQotCSAgICAgID4+IE5WNDBfVlBfSU5TVF9TUkMyTF9TSElGVCk7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBzcmMgPSAtMTsKLSAgIH0KLQotICAgcmV0dXJuIHNyYzsKLX0KLQotc3RhdGljIG52c1JlZ0ZpbGUKLU5WNDBWUEdldFNvdXJjZUZpbGUobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCwgaW50IHBvcykKLXsKLSAgIHVuc2lnbmVkIGludCBzcmM7Ci0gICBzdHJ1Y3QgX29wX3hsYXQgKm9wcjsKLSAgIGludCBmaWxlOwotCi0gICBvcHIgPSBzaGFkZXItPkdldE9QVFhSZWMoc2hhZGVyLCBtZXJnZWQpOwotICAgaWYgKCFvcHIgfHwgb3ByLT5zcmNwb3NbcG9zXSA9PSAtMSkKLSAgICAgIHJldHVybiAtMTsKLQotICAgc3dpdGNoIChvcHItPnNyY3Bvc1twb3NdKSB7Ci0gICBjYXNlIFNQT1NfQUREUkVTUzogcmV0dXJuIE5WU19GSUxFX0FERFJFU1M7Ci0gICBkZWZhdWx0OgotICAgICAgc3JjID0gc2hhZGVyLT5HZXRTb3VyY2VIVyhzaGFkZXIsIG1lcmdlZCwgcG9zKTsKLSAgICAgIGZpbGUgPSAoc3JjICYgTlY0MF9WUF9TUkNfUkVHX1RZUEVfTUFTSykgPj4gTlY0MF9WUF9TUkNfUkVHX1RZUEVfU0hJRlQ7Ci0KLSAgICAgIHN3aXRjaCAoZmlsZSkgewotICAgICAgY2FzZSBOVjQwX1ZQX1NSQ19SRUdfVFlQRV9URU1QIDogcmV0dXJuIE5WU19GSUxFX1RFTVA7Ci0gICAgICBjYXNlIE5WNDBfVlBfU1JDX1JFR19UWVBFX0lOUFVUOiByZXR1cm4gTlZTX0ZJTEVfQVRUUklCOwotICAgICAgY2FzZSBOVjQwX1ZQX1NSQ19SRUdfVFlQRV9DT05TVDogcmV0dXJuIE5WU19GSUxFX0NPTlNUOwotICAgICAgZGVmYXVsdDoKLQkgcmV0dXJuIE5WU19GSUxFX1VOS05PV047Ci0gICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLU5WNDBWUEdldFNvdXJjZUlEKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICBzd2l0Y2ggKHNoYWRlci0+R2V0U291cmNlRmlsZShzaGFkZXIsIG1lcmdlZCwgcG9zKSkgewotICAgY2FzZSBOVlNfRklMRV9BVFRSSUI6Ci0gICAgICBzd2l0Y2ggKChzaGFkZXItPmluc3RbMV0gJiBOVjQwX1ZQX0lOU1RfSU5QVVRfU1JDX01BU0spCi0JICAgICAgPj4gTlY0MF9WUF9JTlNUX0lOUFVUX1NSQ19TSElGVCkgewotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfSU5fUE9TOgkJcmV0dXJuIE5WU19GUl9QT1NJVElPTjsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1dFSUdIVDoJcmV0dXJuIE5WU19GUl9XRUlHSFQ7Ci0gICAgICBjYXNlIE5WNDBfVlBfSU5TVF9JTl9OT1JNQUw6CXJldHVybiBOVlNfRlJfTk9STUFMOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfSU5fQ09MMDoJcmV0dXJuIE5WU19GUl9DT0wwOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfSU5fQ09MMToJcmV0dXJuIE5WU19GUl9DT0wxOwotICAgICAgY2FzZSBOVjQwX1ZQX0lOU1RfSU5fRk9HQzoJcmV0dXJuIE5WU19GUl9GT0dDT09SRDsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDApOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JEMDsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDEpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JEMTsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDIpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JEMjsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDMpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JEMzsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDQpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JENDsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDUpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JENTsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDYpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JENjsKLSAgICAgIGNhc2UgTlY0MF9WUF9JTlNUX0lOX1RDKDcpOglyZXR1cm4gTlZTX0ZSX1RFWENPT1JENzsKLSAgICAgIGRlZmF1bHQ6Ci0JIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBOVlNfRklMRV9DT05TVDoKLSAgICAgIHJldHVybiAoKHNoYWRlci0+aW5zdFsxXSAmIE5WNDBfVlBfSU5TVF9DT05TVF9TUkNfTUFTSykKLQkgICAgICA+PiBOVjQwX1ZQX0lOU1RfQ09OU1RfU1JDX1NISUZUKTsKLSAgIGNhc2UgTlZTX0ZJTEVfVEVNUDoKLSAgICAgIHsKLQkgdW5zaWduZWQgaW50IHNyYzsKLQotCSBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotCSByZXR1cm4gKChzcmMgJiBOVjQwX1ZQX1NSQ19URU1QX1NSQ19NQVNLKSA+PgotCQkgTlY0MF9WUF9TUkNfVEVNUF9TUkNfU0hJRlQpOwotICAgICAgfQotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMTsKLSAgIH0KLX0KLQotc3RhdGljIGludAotTlY0MFZQR2V0U291cmNlTmVnYXRlKG52c0Z1bmMgKiBzaGFkZXIsIGludCBtZXJnZWQsIGludCBwb3MpCi17Ci0gICB1bnNpZ25lZCBpbnQgc3JjOwotCi0gICBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotCi0gICBpZiAoc3JjID09IC0xKQotICAgICAgcmV0dXJuIC0xOwotICAgcmV0dXJuICgoc3JjICYgTlY0MF9WUF9TUkNfTkVHQVRFKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIHZvaWQKLU5WNDBWUEdldFNvdXJjZVN3aXp6bGUobnZzRnVuYyAqIHNoYWRlciwgaW50IG1lcmdlZCwgaW50IHBvcywgbnZzU3d6Q29tcCAqc3d6KQotewotICAgdW5zaWduZWQgaW50IHNyYzsKLSAgIGludCBzd3piaXRzOwotCi0gICBzcmMgPSBzaGFkZXItPkdldFNvdXJjZUhXKHNoYWRlciwgbWVyZ2VkLCBwb3MpOwotICAgc3d6Yml0cyA9IChzcmMgJiBOVjQwX1ZQX1NSQ19TV1pfQUxMX01BU0spID4+IE5WNDBfVlBfU1JDX1NXWl9BTExfU0hJRlQ7Ci0gICBOVjIwVlBUWFN3aXp6bGUoc3d6Yml0cywgc3d6KTsKLX0KLQotc3RhdGljIGludAotTlY0MFZQR2V0U291cmNlSW5kZXhlZChudnNGdW5jICogc2hhZGVyLCBpbnQgbWVyZ2VkLCBpbnQgcG9zKQotewotICAgc3dpdGNoIChzaGFkZXItPkdldFNvdXJjZUZpbGUoc2hhZGVyLCBtZXJnZWQsIHBvcykpIHsKLSAgIGNhc2UgTlZTX0ZJTEVfQVRUUklCOgotICAgICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzBdICYgTlY0MF9WUF9JTlNUX0lOREVYX0lOUFVUKSA/IDEgOiAwKTsKLSAgIGNhc2UgTlZTX0ZJTEVfQ09OU1Q6Ci0gICAgICByZXR1cm4gKChzaGFkZXItPmluc3RbM10gJiBOVjQwX1ZQX0lOU1RfSU5ERVhfQ09OU1QpID8gMSA6IDApOwotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgfQotfQotCi1zdGF0aWMgbnZzU3d6Q29tcAotTlY0MFZQR2V0QWRkcmVzc1JlZ1N3aXp6bGUobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIG52c1N3ekNvbXAgc3d6OwotCi0gICBzd3ogPSBOVjIwVlBfVFhfU1dJWlpMRVsoc2hhZGVyLT5pbnN0WzBdICYgTlY0MF9WUF9JTlNUX0FERFJfU1daX01BU0spCi0JCQkgICA+PiBOVjQwX1ZQX0lOU1RfQUREUl9TV1pfU0hJRlRdOwotICAgcmV0dXJuIHN3ejsKLX0KLQotc3RhdGljIGludAotTlY0MFZQU3VwcG9ydHNDb25kaXRpb25hbChudnNGdW5jICogc2hhZGVyKQotewotICAgLypGSVhNRTogSXMgdGhpcyB0cnVlIG9mIGFsbCBvcHM/ICovCi0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotTlY0MFZQR2V0Q29uZGl0aW9uVXBkYXRlKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICByZXR1cm4gKChzaGFkZXItPmluc3RbMF0gJiBOVjQwX1ZQX0lOU1RfQ09ORF9VUERBVEVfRU5BQkxFKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGludAotTlY0MFZQR2V0Q29uZGl0aW9uVGVzdChudnNGdW5jICogc2hhZGVyKQotewotICAgaW50IG9wOwotCi0gICAvKiBUaGUgY29uZGl0aW9uIHRlc3QgaXMgdW5jb25kaXRpb25hbGx5IGVuYWJsZWQgb24gc29tZQotICAgICogaW5zdHJ1Y3Rpb25zLiBpZTogdGhlIGNvbmRpdGlvbiB0ZXN0IGJpdCBkb2VzICpOT1QqIGhhdmUKLSAgICAqIHRvIGJlIHNldC4KLSAgICAqCi0gICAgKiBGSVhNRTogY2hlY2sgb3RoZXIgcmVsZXZhbnQgb3BzIGZvciB0aGlzIHNpdHVhdGlvbi4KLSAgICAqLwotICAgb3AgPSBzaGFkZXItPkdldE9wY29kZUhXKHNoYWRlciwgMSk7Ci0gICBzd2l0Y2ggKG9wKSB7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9PUF9CUkE6Ci0gICAgICByZXR1cm4gMTsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKChzaGFkZXItPmluc3RbMF0gJiBOVjQwX1ZQX0lOU1RfQ09ORF9URVNUX0VOQUJMRSkgPyAxIDogMCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyBudnNDb25kCi1OVjQwVlBHZXRDb25kaXRpb24obnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIGludCBjb25kOwotCi0gICBjb25kID0gKChzaGFkZXItPmluc3RbMF0gJiBOVjQwX1ZQX0lOU1RfQ09ORF9NQVNLKQotCSAgID4+IE5WNDBfVlBfSU5TVF9DT05EX1NISUZUKTsKLQotICAgc3dpdGNoIChjb25kKSB7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0ZMOiByZXR1cm4gTlZTX0NPTkRfRkw7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0xUOiByZXR1cm4gTlZTX0NPTkRfTFQ7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0VROiByZXR1cm4gTlZTX0NPTkRfRVE7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0xFOiByZXR1cm4gTlZTX0NPTkRfTEU7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0dUOiByZXR1cm4gTlZTX0NPTkRfR1Q7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX05FOiByZXR1cm4gTlZTX0NPTkRfTkU7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX0dFOiByZXR1cm4gTlZTX0NPTkRfR0U7Ci0gICBjYXNlIE5WNDBfVlBfSU5TVF9DT05EX1RSOiByZXR1cm4gTlZTX0NPTkRfVFI7Ci0gICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5WU19DT05EX1VOS05PV047Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1OVjQwVlBHZXRDb25kUmVnU3dpenpsZShudnNGdW5jICogc2hhZGVyLCBudnNTd3pDb21wICpzd3opCi17Ci0gICBpbnQgc3d6Yml0czsKLQotICAgc3d6Yml0cyA9IChzaGFkZXItPmluc3RbMF0gJiBOVjQwX1ZQX0lOU1RfQ09ORF9TV1pfQUxMX01BU0spCi0gICAgICA+PiBOVjQwX1ZQX0lOU1RfQ09ORF9TV1pfQUxMX1NISUZUOwotICAgTlYyMFZQVFhTd2l6emxlKHN3emJpdHMsIHN3eik7Ci19Ci0KLXN0YXRpYyBpbnQKLU5WNDBWUEdldENvbmRSZWdJRChudnNGdW5jICogc2hhZGVyKQotewotICAgcmV0dXJuICgoc2hhZGVyLT5pbnN0WzBdICYgTlY0MF9WUF9JTlNUX0NPTkRfUkVHX1NFTEVDVF8xKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGludAotTlY0MFZQR2V0QnJhbmNoKG52c0Z1bmMgKiBzaGFkZXIpCi17Ci0gICBpbnQgYWRkcjsKLQotICAgYWRkciA9ICgoc2hhZGVyLT5pbnN0WzJdICYgTlY0MF9WUF9JTlNUX0lBRERSSF9NQVNLKQotCSAgID4+IE5WNDBfVlBfSU5TVF9JQUREUkhfU0hJRlQpIDw8IDM7Ci0gICBhZGRyIHw9ICgoc2hhZGVyLT5pbnN0WzNdICYgTlY0MF9WUF9JTlNUX0lBRERSTF9NQVNLKQotCSAgICA+PiBOVjQwX1ZQX0lOU1RfSUFERFJMX1NISUZUKTsKLSAgIHJldHVybiBhZGRyOwotfQotCi12b2lkCi1OVjQwVlBJbml0U2hhZGVyRnVuY3MobnZzRnVuYyAqIHNoYWRlcikKLXsKLSAgIC8qIEluaGVyaXQgTlYzMCBWUCBjb2RlLCB3ZSBzaGFyZSBzb21lIG9mIGl0ICovCi0gICBOVjMwVlBJbml0U2hhZGVyRnVuY3Moc2hhZGVyKTsKLQotICAgLyogTGltaXRzICovCi0gICBzaGFkZXItPk1heEluc3QJPSA0MDk2OwotICAgc2hhZGVyLT5NYXhBdHRyaWIJPSAxNjsKLSAgIHNoYWRlci0+TWF4VGVtcAk9IDMyOwotICAgc2hhZGVyLT5NYXhBZGRyZXNzCT0gMjsKLSAgIHNoYWRlci0+TWF4Q29uc3QJPSAyNTY7Ci0gICBzaGFkZXItPmNhcHMJCT0gU0NBUF9TUkNfQUJTOwotCi0gICAvKiBBZGQgZXh0cmEgb3Bjb2RlcyBmb3IgTlY0MCsgKi8KLS8vICAgICAgTU9EX09QQ09ERShOVlZQX1RYX1ZPUCwgTlY0MF9WUF9JTlNUX09QX1RYV0hBVCwgTlZTX09QX1RFWCAgLCAgMCwgIDQsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WNDBfVlBfSU5TVF9PUF9QVVNIQSwgTlZTX09QX1BVU0hBLCAgMywgLTEsIC0xKTsKLSAgIE1PRF9PUENPREUoTlZWUF9UWF9TT1AsIE5WNDBfVlBfSU5TVF9PUF9QT1BBICwgTlZTX09QX1BPUEEgLCAtMSwgLTEsIC0xKTsKLQotICAgc2hhZGVyLT5Jbml0SW5zdHJ1Y3Rpb24JPSBOVjQwVlBJbml0SW5zdHJ1Y3Rpb247Ci0gICBzaGFkZXItPlN1cHBvcnRzT3Bjb2RlCT0gTlY0MFZQU3VwcG9ydHNPcGNvZGU7Ci0gICBzaGFkZXItPlNldE9wY29kZQkJPSBOVjQwVlBTZXRPcGNvZGU7Ci0gICBzaGFkZXItPlNldENDVXBkYXRlCQk9IE5WNDBWUFNldENDVXBkYXRlOwotICAgc2hhZGVyLT5TZXRDb25kaXRpb24JCT0gTlY0MFZQU2V0Q29uZGl0aW9uOwotICAgc2hhZGVyLT5TZXRSZXN1bHQJCT0gTlY0MFZQU2V0UmVzdWx0OwotICAgc2hhZGVyLT5TZXRTb3VyY2UJCT0gTlY0MFZQU2V0U291cmNlOwotICAgc2hhZGVyLT5TZXRMYXN0SW5zdAkJPSBOVjQwVlBTZXRMYXN0SW5zdDsKLSAgIHNoYWRlci0+U2V0QnJhbmNoVGFyZ2V0CT0gTlY0MFZQU2V0QnJhbmNoVGFyZ2V0OwotCi0gICBzaGFkZXItPkhhc01lcmdlZEluc3QJPSBOVjQwVlBIYXNNZXJnZWRJbnN0OwotICAgc2hhZGVyLT5HZXRPcGNvZGVIVwkJPSBOVjQwVlBHZXRPcGNvZGVIVzsKLQotICAgc2hhZGVyLT5HZXREZXN0RmlsZQkJPSBOVjQwVlBHZXREZXN0RmlsZTsKLSAgIHNoYWRlci0+R2V0RGVzdElECQk9IE5WNDBWUEdldERlc3RJRDsKLSAgIHNoYWRlci0+R2V0RGVzdE1hc2sJCT0gTlY0MFZQR2V0RGVzdE1hc2s7Ci0KLSAgIHNoYWRlci0+R2V0U291cmNlSFcJCT0gTlY0MFZQR2V0U291cmNlSFc7Ci0gICBzaGFkZXItPkdldFNvdXJjZUZpbGUJPSBOVjQwVlBHZXRTb3VyY2VGaWxlOwotICAgc2hhZGVyLT5HZXRTb3VyY2VJRAkJPSBOVjQwVlBHZXRTb3VyY2VJRDsKLSAgIHNoYWRlci0+R2V0U291cmNlTmVnYXRlCT0gTlY0MFZQR2V0U291cmNlTmVnYXRlOwotICAgc2hhZGVyLT5HZXRTb3VyY2VTd2l6emxlCT0gTlY0MFZQR2V0U291cmNlU3dpenpsZTsKLSAgIHNoYWRlci0+R2V0U291cmNlSW5kZXhlZAk9IE5WNDBWUEdldFNvdXJjZUluZGV4ZWQ7Ci0KLSAgIHNoYWRlci0+R2V0UmVsQWRkcmVzc1N3aXp6bGUJPSBOVjQwVlBHZXRBZGRyZXNzUmVnU3dpenpsZTsKLQotICAgc2hhZGVyLT5TdXBwb3J0c0NvbmRpdGlvbmFsCT0gTlY0MFZQU3VwcG9ydHNDb25kaXRpb25hbDsKLSAgIHNoYWRlci0+R2V0Q29uZGl0aW9uVXBkYXRlCT0gTlY0MFZQR2V0Q29uZGl0aW9uVXBkYXRlOwotICAgc2hhZGVyLT5HZXRDb25kaXRpb25UZXN0CT0gTlY0MFZQR2V0Q29uZGl0aW9uVGVzdDsKLSAgIHNoYWRlci0+R2V0Q29uZGl0aW9uCQk9IE5WNDBWUEdldENvbmRpdGlvbjsKLSAgIHNoYWRlci0+R2V0Q29uZFJlZ1N3aXp6bGUJPSBOVjQwVlBHZXRDb25kUmVnU3dpenpsZTsKLSAgIHNoYWRlci0+R2V0Q29uZFJlZ0lECQk9IE5WNDBWUEdldENvbmRSZWdJRDsKLQotICAgc2hhZGVyLT5HZXRCcmFuY2gJCT0gTlY0MFZQR2V0QnJhbmNoOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9udjUwX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NTBfc3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ZTI2OC4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L252NTBfc3RhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IDIwMDYgTm91dmVhdQotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLWNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi10byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi1vbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCi1saWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQotdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLXBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLVNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLUVSSUMgQU5IT0xUIE9SIFNJTElDT04gSU5URUdSQVRFRCBTWVNURU1TIENPUlAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCi1EQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKLU9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKLVVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibm91dmVhdV9jb250ZXh0LmgiCi0jaW5jbHVkZSAibm91dmVhdV9vYmplY3QuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2ZpZm8uaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgotI2luY2x1ZGUgIm5vdXZlYXVfc3RhdGUuaCIKLQotI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCi0KLSNpbmNsdWRlICJtdHlwZXMuaCIKLSNpbmNsdWRlICJjb2xvcm1hYy5oIgotCi1zdGF0aWMgdm9pZCBudjUwQWxwaGFGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYywgR0xmbG9hdCByZWYpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVieXRlIHViUmVmOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUodWJSZWYsIHJlZik7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9BTFBIQV9GVU5DX1JFRiwgMik7Ci0JT1VUX1JJTkdfQ0FDSEUodWJSZWYpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotfQotCi1zdGF0aWMgdm9pZCBudjUwQmxlbmRDb2xvcihHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOyAKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0NPTE9SX1IsIDQpOwotCU9VVF9SSU5HX0NBQ0hFZihjb2xvclswXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGNvbG9yWzFdKTsKLQlPVVRfUklOR19DQUNIRWYoY29sb3JbMl0pOwotCU9VVF9SSU5HX0NBQ0hFZihjb2xvclszXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0VRVUFUSU9OX1JHQiwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZVJHQik7Ci0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfQkxFTkRfRVFVQVRJT05fQUxQSEEsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG1vZGVBKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBudjUwQmxlbmRGdW5jU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwKLQkJR0xlbnVtIHNmYWN0b3JBLCBHTGVudW0gZGZhY3RvckEpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfU1JDX1JHQiwgMik7Ci0JT1VUX1JJTkdfQ0FDSEUoc2ZhY3RvclJHQik7CS8qIEZJWE1FLCBzb21ldGltZXMgaGFzIHwweDQwMDAgKi8KLQlPVVRfUklOR19DQUNIRShkZmFjdG9yUkdCKTsJLyogRklYTUUsIHNvbWV0aW1lcyBoYXMgfDB4NDAwMCAqLwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0JMRU5EX0ZVTkNfU1JDX0FMUEhBLCAyKTsKLQlPVVRfUklOR19DQUNIRShzZmFjdG9yQSk7CS8qIEZJWE1FLCBzb21ldGltZXMgaGFzIHwweDQwMDAgKi8KLQlPVVRfUklOR19DQUNIRShkZmFjdG9yQSk7CS8qIEZJWE1FLCBzb21ldGltZXMgaGFzIHwweDQwMDAgKi8KLX0KLQotc3RhdGljIHZvaWQgbnY1MENsZWFyKEdMY29udGV4dCAqY3R4LCBHTGJpdGZpZWxkIG1hc2spCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlHTHVpbnQgaHdfYnVmcyA9IDA7Ci0KLQlpZiAobWFzayAmIChCVUZGRVJfQklUX0ZST05UX0xFRlQgfCBCVUZGRVJfQklUX0JBQ0tfTEVGVCkpCi0JCWh3X2J1ZnMgfD0gMHgzYzsKLQlpZiAobWFzayAmIChCVUZGRVJfQklUX1NURU5DSUwpKQotCQlod19idWZzIHw9IDB4MDI7Ci0JaWYgKG1hc2sgJiAoQlVGRkVSX0JJVF9ERVBUSCkpCi0JCWh3X2J1ZnMgfD0gMHgwMTsKLQotCWlmIChod19idWZzKSB7Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfQlVGRkVSUywgMSk7Ci0JCU9VVF9SSU5HKGh3X2J1ZnMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbnY1MENsZWFyQ29sb3IoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMZmxvYXQgY29sb3JbNF0pCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0NMRUFSX0NPTE9SX1IsIDQpOwotCU9VVF9SSU5HX0NBQ0hFZihjb2xvclswXSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGNvbG9yWzFdKTsKLQlPVVRfUklOR19DQUNIRWYoY29sb3JbMl0pOwotCU9VVF9SSU5HX0NBQ0hFZihjb2xvclszXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBDbGVhckRlcHRoKEdMY29udGV4dCAqY3R4LCBHTGNsYW1wZCBkKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9DTEVBUl9ERVBUSCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGQpOwotfQotCi0vKiB3ZSdyZSBkb24ndCBzdXBwb3J0IGluZGV4ZWQgYnVmZmVycwotICAgdm9pZCAoKkNsZWFySW5kZXgpKEdMY29udGV4dCAqY3R4LCBHTHVpbnQgaW5kZXgpCi0gKi8KLQotc3RhdGljIHZvaWQgbnY1MENsZWFyU3RlbmNpbChHTGNvbnRleHQgKmN0eCwgR0xpbnQgcykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfQ0xFQVJfU1RFTkNJTCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUocyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBDbGlwUGxhbmUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCi17Ci0JLyogT25seSB1c2luZyBzaGFkZXJzICovCi19Ci0KLXN0YXRpYyB2b2lkIG52NTBDb2xvck1hc2soR0xjb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBybWFzaywgR0xib29sZWFuIGdtYXNrLAotCQlHTGJvb2xlYW4gYm1hc2ssIEdMYm9vbGVhbiBhbWFzayApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlpbnQgaTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0NPTE9SX01BU0soMCksIDgpOwotCWZvciAoaT0wOyBpPDg7IGkrKykgewotCQlPVVRfUklOR19DQUNIRSgoKGFtYXNrICYmIDB4MDEpIDw8IDEyKSB8ICgoYm1hc2sgJiYgMHgwMSkgPDwgOCkgfCAoKGdtYXNrICYmIDB4MDEpPDwgNCkgfCAoKHJtYXNrICYmIDB4MDEpIDw8IDApKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBDb2xvck1hdGVyaWFsKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpCi17Ci0JLy8gVE9ETyBJIG5lZWQgbG92ZQotfQotCi1zdGF0aWMgdm9pZCBudjUwQ3VsbEZhY2UoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0UsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG1vZGUpOwotfQotCi1zdGF0aWMgdm9pZCBudjUwRnJvbnRGYWNlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0ZST05UX0ZBQ0UsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG1vZGUpOwotfQotCi1zdGF0aWMgdm9pZCBudjUwRGVwdGhGdW5jKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZnVuYykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX0ZVTkMsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotfQotCi1zdGF0aWMgdm9pZCBudjUwRGVwdGhNYXNrKEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gZmxhZykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0RFUFRIX1dSSVRFX0VOQUJMRSwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUoZmxhZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBEZXB0aFJhbmdlKEdMY29udGV4dCAqY3R4LCBHTGNsYW1wZCBuZWFydmFsLCBHTGNsYW1wZCBmYXJ2YWwpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9SQU5HRV9ORUFSLCAyKTsKLQlPVVRfUklOR19DQUNIRWYobmVhcnZhbCk7Ci0JT1VUX1JJTkdfQ0FDSEVmKGZhcnZhbCk7Ci19Ci0KLS8qKiBTcGVjaWZ5IHRoZSBjdXJyZW50IGJ1ZmZlciBmb3Igd3JpdGluZyAqLwotLy92b2lkICgqRHJhd0J1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU3BlY2lmeSB0aGUgYnVmZmVycyBmb3Igd3JpdGluZyBmb3IgZnJhZ21lbnQgcHJvZ3JhbXMqLwotLy92b2lkICgqRHJhd0J1ZmZlcnMpKCBHTGNvbnRleHQgKmN0eCwgR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZmZlcnMgKTsKLQotc3RhdGljIHZvaWQgbnY1MEVuYWJsZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0Jc3dpdGNoKGNhcCkKLQl7Ci0JCWNhc2UgR0xfQUxQSEFfVEVTVDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0FMUEhBX0ZVTkNfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfQVVUT19OT1JNQUw6Ci0vLwkJY2FzZSBHTF9CTEVORDoKLS8vCQljYXNlIEdMX0NMSVBfUExBTkUwOgotLy8JCWNhc2UgR0xfQ0xJUF9QTEFORTE6Ci0vLwkJY2FzZSBHTF9DTElQX1BMQU5FMjoKLS8vCQljYXNlIEdMX0NMSVBfUExBTkUzOgotLy8JCWNhc2UgR0xfQ0xJUF9QTEFORTQ6Ci0vLwkJY2FzZSBHTF9DTElQX1BMQU5FNToKLQkJY2FzZSBHTF9DT0xPUl9MT0dJQ19PUDoKLQkJCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0xPR0lDX09QX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0NPTE9SX01BVEVSSUFMOgotLy8JCWNhc2UgR0xfQ09MT1JfU1VNX0VYVDoKLS8vCQljYXNlIEdMX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfQ09OVk9MVVRJT05fMUQ6Ci0vLwkJY2FzZSBHTF9DT05WT0xVVElPTl8yRDoKLQkJY2FzZSBHTF9DVUxMX0ZBQ0U6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9DVUxMX0ZBQ0VfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0RFUFRIX1RFU1Q6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9ERVBUSF9URVNUX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX0RJVEhFUjoKLS8vCQljYXNlIEdMX0ZPRzoKLS8vCQljYXNlIEdMX0hJU1RPR1JBTToKLS8vCQljYXNlIEdMX0lOREVYX0xPR0lDX09QOgotLy8JCWNhc2UgR0xfTElHSFQwOgotLy8JCWNhc2UgR0xfTElHSFQxOgotLy8JCWNhc2UgR0xfTElHSFQyOgotLy8JCWNhc2UgR0xfTElHSFQzOgotLy8JCWNhc2UgR0xfTElHSFQ0OgotLy8JCWNhc2UgR0xfTElHSFQ1OgotLy8JCWNhc2UgR0xfTElHSFQ2OgotLy8JCWNhc2UgR0xfTElHSFQ3OgotLy8JCWNhc2UgR0xfTElHSFRJTkc6Ci0JCWNhc2UgR0xfTElORV9TTU9PVEg6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9MSU5FX1NNT09USF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfTElORV9TVElQUExFOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfTElORV9TVElQUExFX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX01BUDFfQ09MT1JfNDoKLS8vCQljYXNlIEdMX01BUDFfSU5ERVg6Ci0vLwkJY2FzZSBHTF9NQVAxX05PUk1BTDoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xOgotLy8JCWNhc2UgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzI6Ci0vLwkJY2FzZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMzoKLS8vCQljYXNlIEdMX01BUDFfVEVYVFVSRV9DT09SRF80OgotLy8JCWNhc2UgR0xfTUFQMV9WRVJURVhfMzoKLS8vCQljYXNlIEdMX01BUDFfVkVSVEVYXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0NPTE9SXzQ6Ci0vLwkJY2FzZSBHTF9NQVAyX0lOREVYOgotLy8JCWNhc2UgR0xfTUFQMl9OT1JNQUw6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMToKLS8vCQljYXNlIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yOgotLy8JCWNhc2UgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNDoKLS8vCQljYXNlIEdMX01BUDJfVkVSVEVYXzM6Ci0vLwkJY2FzZSBHTF9NQVAyX1ZFUlRFWF80OgotLy8JCWNhc2UgR0xfTUlOTUFYOgotLy8JCWNhc2UgR0xfTk9STUFMSVpFOgotLy8JCWNhc2UgR0xfUE9JTlRfU01PT1RIOgotCQljYXNlIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfUE9JTlRfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkU6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9MSU5FX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfRklMTF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9MWUdPTl9TTU9PVEg6Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NNT09USF9FTkFCTEUsIDEpOwotCQkJT1VUX1JJTkdfQ0FDSEUoc3RhdGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9MWUdPTl9TVElQUExFOgotCQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9TVElQUExFX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlicmVhazsKLS8vCQljYXNlIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFOgotLy8JCWNhc2UgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRToKLS8vCQljYXNlIEdMX1JFU0NBTEVfTk9STUFMOgotCQljYXNlIEdMX1NDSVNTT1JfVEVTVDoKLQkJCS8qIE5vIGVuYWJsZSBiaXQsIG52NTBTY2lzc29yIHdpbGwgYWRqdXN0IHRvIG1heCByYW5nZSAqLwotCQkJY3R4LT5Ecml2ZXIuU2Npc3NvcihjdHgsIGN0eC0+U2Npc3Nvci5YLCBjdHgtPlNjaXNzb3IuWSwKLQkJCSAgICAgIAkJCSBjdHgtPlNjaXNzb3IuV2lkdGgsIGN0eC0+U2Npc3Nvci5IZWlnaHQpOwotCQkJYnJlYWs7Ci0vLwkJY2FzZSBHTF9TRVBBUkFCTEVfMkQ6Ci0JCWNhc2UgR0xfU1RFTkNJTF9URVNUOgotCQkJLy8gVE9ETyBCQUNLIGFuZCBGUk9OVCA/Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0VOQUJMRSwgMSk7Ci0JCQlPVVRfUklOR19DQUNIRShzdGF0ZSk7Ci0JCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfRU5BQkxFLCAxKTsKLQkJCU9VVF9SSU5HX0NBQ0hFKHN0YXRlKTsKLQkJCWJyZWFrOwotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fUToKLS8vCQljYXNlIEdMX1RFWFRVUkVfR0VOX1I6Ci0vLwkJY2FzZSBHTF9URVhUVVJFX0dFTl9TOgotLy8JCWNhc2UgR0xfVEVYVFVSRV9HRU5fVDoKLS8vCQljYXNlIEdMX1RFWFRVUkVfMUQ6Ci0vLwkJY2FzZSBHTF9URVhUVVJFXzJEOgotLy8JCWNhc2UgR0xfVEVYVFVSRV8zRDoKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBGb2dmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0JLyogT25seSB1c2luZyBzaGFkZXJzICovCi19Ci0gICAKLXN0YXRpYyB2b2lkIG52NTBIaW50KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKLXsKLQkvLyBUT0RPIEkgbmVlZCBsb3ZlIChmb2cgYW5kIGxpbmVfc21vb3RoIGhpbnRzKQotfQotCi0vLyB2b2lkICgqSW5kZXhNYXNrKShHTGNvbnRleHQgKmN0eCwgR0x1aW50IG1hc2spOwotCi1zdGF0aWMgdm9pZCBudjUwTGlnaHRmdihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi17Ci0JLyogT25seSB3aXRoIHNoYWRlcnMgKi8KLX0KLQotLyoqIFNldCB0aGUgbGlnaHRpbmcgbW9kZWwgcGFyYW1ldGVycyAqLwotdm9pZCAoKkxpZ2h0TW9kZWxmdikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLQotCi1zdGF0aWMgdm9pZCBudjUwTGluZVN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIEdMaW50IGZhY3RvciwgR0x1c2hvcnQgcGF0dGVybiApCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfU1RJUFBMRV9QQVRURVJOLCAxKTsKLQlPVVRfUklOR19DQUNIRSgocGF0dGVybiA8PCA4KSB8IGZhY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBMaW5lV2lkdGgoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgd2lkdGgpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX0xJTkVfV0lEVEgsIDEpOwotCU9VVF9SSU5HX0NBQ0hFZih3aWR0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBMb2dpY09wY29kZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG9wY29kZSkKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfTE9HSUNfT1BfT1AsIDEpOwotCU9VVF9SSU5HX0NBQ0hFKG9wY29kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52NTBQb2ludFBhcmFtZXRlcmZ2KEdMY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLQkvKlRPRE86IG5vdCBzdXJlIHdoYXQgZ29lcyBoZXJlLiAqLwotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0JCi19Ci0KLS8qKiBTcGVjaWZ5IHRoZSBkaWFtZXRlciBvZiByYXN0ZXJpemVkIHBvaW50cyAqLwotc3RhdGljIHZvaWQgbnY1MFBvaW50U2l6ZShHTGNvbnRleHQgKmN0eCwgR0xmbG9hdCBzaXplKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0lOVF9TSVpFLCAxKTsKLQlPVVRfUklOR19DQUNIRWYoc2l6ZSk7Ci19Ci0KLS8qKiBTZWxlY3QgYSBwb2x5Z29uIHJhc3Rlcml6YXRpb24gbW9kZSAqLwotc3RhdGljIHZvaWQgbnY1MFBvbHlnb25Nb2RlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWlmIChmYWNlID09IEdMX0ZST05UIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spIHsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9NT0RFX0ZST05ULCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci0JfQotCWlmIChmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX01PREVfQkFDSywgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFKG1vZGUpOwotCX0KLX0KLQotLyoqIFNldCB0aGUgc2NhbGUgYW5kIHVuaXRzIHVzZWQgdG8gY2FsY3VsYXRlIGRlcHRoIHZhbHVlcyAqLwotc3RhdGljIHZvaWQgbnY1MFBvbHlnb25PZmZzZXQoR0xjb250ZXh0ICpjdHgsIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKQotewotICAgICAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotIAotICAgICAgICBCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX09GRlNFVF9GQUNUT1IsIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRWYoZmFjdG9yKTsKLSAgICAgICAgQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfUE9MWUdPTl9PRkZTRVRfVU5JVFMsIDEpOwotICAgICAgICBPVVRfUklOR19DQUNIRWYodW5pdHMpOwotfQotCi0vKiogU2V0IHRoZSBwb2x5Z29uIHN0aXBwbGluZyBwYXR0ZXJuICovCi1zdGF0aWMgdm9pZCBudjUwUG9seWdvblN0aXBwbGUoR0xjb250ZXh0ICpjdHgsIGNvbnN0IEdMdWJ5dGUgKm1hc2sgKQotewotICAgICAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotICAgICAgICBCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9QT0xZR09OX1NUSVBQTEVfUEFUVEVSTigwKSwgMzIpOwotICAgICAgICBPVVRfUklOR19DQUNIRXAobWFzaywgMzIpOwotfQotCi0vKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgYnVmZmVyIGZvciByZWFkaW5nICovCi12b2lkICgqUmVhZEJ1ZmZlcikoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyICk7Ci0vKiogU2V0IHJhc3Rlcml6YXRpb24gbW9kZSAqLwotdm9pZCAoKlJlbmRlck1vZGUpKEdMY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSApOwotCi0vKiogRGVmaW5lIHRoZSBzY2lzc29yIGJveCAqLwotc3RhdGljIHZvaWQgbnY1MFNjaXNzb3IoR0xjb250ZXh0ICpjdHgsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgICAgICBub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JLyogVGhlcmUncyBubyBzY2lzc29yIGVuYWJsZSBiaXQsIHNvIGFkanVzdCB0aGUgc2Npc3NvciB0byBjb3ZlciB0aGUKLQkgKiBtYXhpbXVtIGRyYXcgYnVmZmVyIGJvdW5kcwotCSAqLwotCWlmICghY3R4LT5TY2lzc29yLkVuYWJsZWQpIHsKLQkgICB4ID0geSA9IDA7Ci0JICAgdyA9IGggPSA4MTkxOwotCX0gZWxzZSB7Ci0JICAgeCArPSBubWVzYS0+ZHJhd1g7Ci0JICAgeSArPSBubWVzYS0+ZHJhd1k7Ci0JfQotCi0gICAgICAgIEJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NDSVNTT1JfV0lEVEhfWFBPUywgMik7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCgodykgPDwgMTYpIHwgeCk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCgoaCkgPDwgMTYpIHwgeSk7Ci19Ci0KLS8qKiBTZWxlY3QgZmxhdCBvciBzbW9vdGggc2hhZGluZyAqLwotc3RhdGljIHZvaWQgbnY1MFNoYWRlTW9kZWwoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TSEFERV9NT0RFTCwgMSk7Ci0JT1VUX1JJTkdfQ0FDSEUobW9kZSk7Ci19Ci0KLS8qKiBPcGVuR0wgMi4wIHR3by1zaWRlZCBTdGVuY2lsRnVuYyAqLwotc3RhdGljIHZvaWQgbnY1MFN0ZW5jaWxGdW5jU2VwYXJhdGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywKLQkJR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfRlVOQywgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFKGZ1bmMpOwotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX0ZVTkNfUkVGLCAxKTsKLQkJT1VUX1JJTkdfQ0FDSEUocmVmKTsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9GUk9OVF9GVU5DX01BU0ssIDEpOwotCQlPVVRfUklOR19DQUNIRShtYXNrKTsKLQl9Ci0JaWYgKGZhY2UgPT0gR0xfQkFDSyB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfQkFDS19GVU5DX0ZVTkMsIDIpOwotCQlPVVRfUklOR19DQUNIRShmdW5jKTsKLQkJT1VUX1JJTkdfQ0FDSEUocmVmKTsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX0ZVTkNfTUFTSywgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFKG1hc2spOwotCX0KLX0KLQotLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxNYXNrICovCi1zdGF0aWMgdm9pZCBudjUwU3RlbmNpbE1hc2tTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQotewotCW5vdXZlYXVDb250ZXh0UHRyIG5tZXNhID0gTk9VVkVBVV9DT05URVhUKGN0eCk7Ci0KLQlpZiAoZmFjZSA9PSBHTF9GUk9OVCB8fCBmYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSB7Ci0JCUJFR0lOX1JJTkdfQ0FDSEUoTnZTdWIzRCwgTlY1MF9UQ0xfUFJJTUlUSVZFXzNEX1NURU5DSUxfRlJPTlRfTUFTSywgMSk7Ci0JCU9VVF9SSU5HX0NBQ0hFKG1hc2spOwotCX0KLQlpZiAoZmFjZSA9PSBHTF9CQUNLIHx8IGZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spIHsKLQkJQkVHSU5fUklOR19DQUNIRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfU1RFTkNJTF9CQUNLX01BU0ssIDEpOwotCQlPVVRfUklOR19DQUNIRShtYXNrKTsKLQl9Ci19Ci0KLS8qKiBPcGVuR0wgMi4wIHR3by1zaWRlZCBTdGVuY2lsT3AgKi8KLXN0YXRpYyB2b2lkIG52NTBTdGVuY2lsT3BTZXBhcmF0ZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLAotCQlHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKLXsKLQlub3V2ZWF1Q29udGV4dFB0ciBubWVzYSA9IE5PVVZFQVVfQ09OVEVYVChjdHgpOwotCi0JaWYgKGZhY2UgPT0gR0xfRlJPTlQgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0ZST05UX09QX0ZBSUwsIDMpOwotCQlPVVRfUklOR19DQUNIRShmYWlsKTsKLQkJT1VUX1JJTkdfQ0FDSEUoemZhaWwpOwotCQlPVVRfUklOR19DQUNIRSh6cGFzcyk7Ci0JfQotCWlmIChmYWNlID09IEdMX0JBQ0sgfHwgZmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TVEVOQ0lMX0JBQ0tfT1BfRkFJTCwgMyk7Ci0JCU9VVF9SSU5HX0NBQ0hFKGZhaWwpOwotCQlPVVRfUklOR19DQUNIRSh6ZmFpbCk7Ci0JCU9VVF9SSU5HX0NBQ0hFKHpwYXNzKTsKLQl9Ci19Ci0KLS8qKiBDb250cm9sIHRoZSBnZW5lcmF0aW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMgKi8KLXZvaWQgKCpUZXhHZW4pKEdMY29udGV4dCAqY3R4LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwKLQkJY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLS8qKiBTZXQgdGV4dHVyZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzICovCi12b2lkICgqVGV4RW52KShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAotCQljb25zdCBHTGZsb2F0ICpwYXJhbSk7Ci0vKiogU2V0IHRleHR1cmUgcGFyYW1ldGVycyAqLwotdm9pZCAoKlRleFBhcmFtZXRlcikoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCi0JCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotCQlHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci0KLXN0YXRpYyB2b2lkIG52NTBUZXh0dXJlTWF0cml4KEdMY29udGV4dCAqY3R4LCBHTHVpbnQgdW5pdCwgY29uc3QgR0xtYXRyaXggKm1hdCkKLXsKLQkvKiBPbmx5IHdpdGggc2hhZGVycyAqLwotfQotCi1zdGF0aWMgdm9pZCBudjUwV2luZG93TW92ZWQobm91dmVhdUNvbnRleHRQdHIgbm1lc2EpCi17Ci0JR0xjb250ZXh0ICpjdHggPSBubWVzYS0+Z2xDdHg7Ci0JR0xmbG9hdCAqdiA9IG5tZXNhLT52aWV3cG9ydC5tOwotCUdMdWludCB3ID0gY3R4LT5WaWV3cG9ydC5XaWR0aDsKLQlHTHVpbnQgaCA9IGN0eC0+Vmlld3BvcnQuSGVpZ2h0OwotCUdMdWludCB4ID0gY3R4LT5WaWV3cG9ydC5YICsgbm1lc2EtPmRyYXdYOwotCUdMdWludCB5ID0gY3R4LT5WaWV3cG9ydC5ZICsgbm1lc2EtPmRyYXdZOwotCWludCBpOwotCi0JQkVHSU5fUklOR19DQUNIRShOdlN1YjNELAotCSAgICAgIE5WNTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DTElQX0hPUklaKDApLCAyKTsKLSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoKDgxOTEgPDwgMTYpIHwgMCk7Ci0gICAgICAgIE9VVF9SSU5HX0NBQ0hFKCg4MTkxIDw8IDE2KSB8IDApOwotCWZvciAoaT0xOyBpPDg7IGkrKykgewotCQlCRUdJTl9SSU5HX0NBQ0hFKE52U3ViM0QsCi0JCSAgICAgIE5WNTBfVENMX1BSSU1JVElWRV8zRF9WSUVXUE9SVF9DTElQX0hPUklaKGkpLCAyKTsKLSAgICAgICAgCU9VVF9SSU5HX0NBQ0hFKDApOwotCSAgICAgICAgT1VUX1JJTkdfQ0FDSEUoMCk7Ci0JfQotCi0JY3R4LT5Ecml2ZXIuU2Npc3NvcihjdHgsIGN0eC0+U2Npc3Nvci5YLCBjdHgtPlNjaXNzb3IuWSwKLQkgICAgICAJCSAgICBjdHgtPlNjaXNzb3IuV2lkdGgsIGN0eC0+U2Npc3Nvci5IZWlnaHQpOwotfQotCi1zdGF0aWMgR0xib29sZWFuIG52NTBJbml0Q2FyZChub3V2ZWF1Q29udGV4dFB0ciBubWVzYSkKLXsKLQlpbnQgaSxqOwotCi0Jbm91dmVhdU9iamVjdE9uU3ViY2hhbm5lbChubWVzYSwgTnZTdWIzRCwgTnYzRCk7Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgxNTU4LCAxKTsKLQlPVVRfUklORygxKTsKLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCBOVjUwX1RDTF9QUklNSVRJVkVfM0RfU0VUX09CSkVDVF8xKDApLCA4KTsKLQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJT1VUX1JJTkcoTnZEbWFGQik7Ci0JfQotCi0JQkVHSU5fUklOR19TSVpFKE52U3ViM0QsIE5WNTBfVENMX1BSSU1JVElWRV8zRF9TRVRfT0JKRUNUXzAoMCksIDEyKTsKLQlmb3IgKGk9MDsgaTwxMjsgaSsrKSB7Ci0JCU9VVF9SSU5HKE52RG1hRkIpOwotCX0KLQotCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDEyMWMsIDEpOwotCU9VVF9SSU5HKDEpOwotCi0JZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0JCUJFR0lOX1JJTkdfU0laRShOdlN1YjNELCAweDAyMDAgKyAoaSoweDIwKSwgNSk7Ci0JCWZvciAoaj0wOyBqPDU7IGorKykgewotCQkJT1VUX1JJTkcoMCk7Ci0JCX0KLQl9Ci0KLQlCRUdJTl9SSU5HX1NJWkUoTnZTdWIzRCwgMHgwZmUwLCA1KTsKLQlPVVRfUklORygwKTsKLQlPVVRfUklORygwKTsKLQlPVVRfUklORygweDE2KTsKLQlPVVRfUklORygwKTsKLQlPVVRfUklORygwKTsKLQotCXJldHVybiBHTF9GQUxTRTsKLX0KLQotc3RhdGljIEdMYm9vbGVhbiBudjUwQmluZEJ1ZmZlcnMobm91dmVhdUNvbnRleHRQdHIgbm1lc2EsIGludCBudW1fY29sb3IsCi0gICAgICAJCQkJIG5vdXZlYXVfcmVuZGVyYnVmZmVyICoqY29sb3IsCi0JCQkJIG5vdXZlYXVfcmVuZGVyYnVmZmVyICpkZXB0aCkKLXsKLQlyZXR1cm4gR0xfRkFMU0U7Ci19Ci0KLXZvaWQgbnY1MEluaXRTdGF0ZUZ1bmNzKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmMpCi17Ci0Jbm91dmVhdUNvbnRleHRQdHIgbm1lc2EgPSBOT1VWRUFVX0NPTlRFWFQoY3R4KTsKLQotCWZ1bmMtPkFscGhhRnVuYwkJCT0gbnY1MEFscGhhRnVuYzsKLQlmdW5jLT5CbGVuZENvbG9yCQk9IG52NTBCbGVuZENvbG9yOwotCWZ1bmMtPkJsZW5kRXF1YXRpb25TZXBhcmF0ZQk9IG52NTBCbGVuZEVxdWF0aW9uU2VwYXJhdGU7Ci0JZnVuYy0+QmxlbmRGdW5jU2VwYXJhdGUJCT0gbnY1MEJsZW5kRnVuY1NlcGFyYXRlOwotCWZ1bmMtPkNsZWFyCQkJPSBudjUwQ2xlYXI7Ci0JZnVuYy0+Q2xlYXJDb2xvcgkJPSBudjUwQ2xlYXJDb2xvcjsKLQlmdW5jLT5DbGVhckRlcHRoCQk9IG52NTBDbGVhckRlcHRoOwotCWZ1bmMtPkNsZWFyU3RlbmNpbAkJPSBudjUwQ2xlYXJTdGVuY2lsOwotCWZ1bmMtPkNsaXBQbGFuZQkJCT0gbnY1MENsaXBQbGFuZTsKLQlmdW5jLT5Db2xvck1hc2sJCQk9IG52NTBDb2xvck1hc2s7Ci0JZnVuYy0+Q29sb3JNYXRlcmlhbAkJPSBudjUwQ29sb3JNYXRlcmlhbDsKLQlmdW5jLT5DdWxsRmFjZQkJCT0gbnY1MEN1bGxGYWNlOwotCWZ1bmMtPkZyb250RmFjZQkJCT0gbnY1MEZyb250RmFjZTsKLQlmdW5jLT5EZXB0aEZ1bmMJCQk9IG52NTBEZXB0aEZ1bmM7Ci0JZnVuYy0+RGVwdGhNYXNrCQkJPSBudjUwRGVwdGhNYXNrOwotCWZ1bmMtPkRlcHRoUmFuZ2UJCT0gbnY1MERlcHRoUmFuZ2U7Ci0JZnVuYy0+RW5hYmxlCQkJPSBudjUwRW5hYmxlOwotCWZ1bmMtPkZvZ2Z2CQkJPSBudjUwRm9nZnY7Ci0JZnVuYy0+SGludAkJCT0gbnY1MEhpbnQ7Ci0JZnVuYy0+TGlnaHRmdgkJCT0gbnY1MExpZ2h0ZnY7Ci0vKglmdW5jLT5MaWdodE1vZGVsZnYJCT0gbnY1MExpZ2h0TW9kZWxmdjsJICovCi0JZnVuYy0+TGluZVN0aXBwbGUJCT0gbnY1MExpbmVTdGlwcGxlOwotCWZ1bmMtPkxpbmVXaWR0aAkJCT0gbnY1MExpbmVXaWR0aDsKLQlmdW5jLT5Mb2dpY09wY29kZQkJPSBudjUwTG9naWNPcGNvZGU7Ci0JZnVuYy0+UG9pbnRQYXJhbWV0ZXJmdgkJPSBudjUwUG9pbnRQYXJhbWV0ZXJmdjsKLQlmdW5jLT5Qb2ludFNpemUJCQk9IG52NTBQb2ludFNpemU7Ci0JZnVuYy0+UG9seWdvbk1vZGUJCT0gbnY1MFBvbHlnb25Nb2RlOwotCWZ1bmMtPlBvbHlnb25PZmZzZXQJCT0gbnY1MFBvbHlnb25PZmZzZXQ7Ci0JZnVuYy0+UG9seWdvblN0aXBwbGUJCT0gbnY1MFBvbHlnb25TdGlwcGxlOwotLyoJZnVuYy0+UmVhZEJ1ZmZlcgkJPSBudjUwUmVhZEJ1ZmZlcjsJKi8KLS8qCWZ1bmMtPlJlbmRlck1vZGUJCT0gbnY1MFJlbmRlck1vZGU7CSovCi0JZnVuYy0+U2Npc3NvcgkJCT0gbnY1MFNjaXNzb3I7Ci0JZnVuYy0+U2hhZGVNb2RlbAkJPSBudjUwU2hhZGVNb2RlbDsKLQlmdW5jLT5TdGVuY2lsRnVuY1NlcGFyYXRlCT0gbnY1MFN0ZW5jaWxGdW5jU2VwYXJhdGU7Ci0JZnVuYy0+U3RlbmNpbE1hc2tTZXBhcmF0ZQk9IG52NTBTdGVuY2lsTWFza1NlcGFyYXRlOwotCWZ1bmMtPlN0ZW5jaWxPcFNlcGFyYXRlCQk9IG52NTBTdGVuY2lsT3BTZXBhcmF0ZTsKLS8qCWZ1bmMtPlRleEdlbgkJCT0gbnY1MFRleEdlbjsJCSovCi0vKglmdW5jLT5UZXhQYXJhbWV0ZXIJCT0gbnY1MFRleFBhcmFtZXRlcjsJKi8KLQlmdW5jLT5UZXh0dXJlTWF0cml4CQk9IG52NTBUZXh0dXJlTWF0cml4OwotCi0Jbm1lc2EtPmh3X2Z1bmMuSW5pdENhcmQJCT0gbnY1MEluaXRDYXJkOwotCW5tZXNhLT5od19mdW5jLkJpbmRCdWZmZXJzCT0gbnY1MEJpbmRCdWZmZXJzOwotCW5tZXNhLT5od19mdW5jLldpbmRvd01vdmVkCT0gbnY1MFdpbmRvd01vdmVkOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9jb250ZXh0LmMKaW5kZXggZGZjODlhMi4uNWU3Y2FkYyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfY29udGV4dC5jCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgIF90bmxfYWxsb3dfdmVydGV4X2ZvZyggY3R4LCBHTF9UUlVFICk7CiAKICAgIGRyaUluaXRFeHRlbnNpb25zKCBjdHgsIGNhcmRfZXh0ZW5zaW9ucywgR0xfVFJVRSApOwotICAgaWYgKHNQcml2LT5kcm1NaW5vciA+PSA0KQorICAgaWYgKHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSA0KQogICAgICAgX21lc2FfZW5hYmxlX2V4dGVuc2lvbiggY3R4LCAiR0xfTUVTQV95Y2Jjcl90ZXh0dXJlIiApOwogCiAgICByMTI4SW5pdFRyaUZ1bmNzKCBjdHggKTsKQEAgLTI2MSw5ICsyNjEsNiBAQAogICAgcjEyOERESW5pdFNwYW5GdW5jcyggY3R4ICk7CiAgICByMTI4RERJbml0U3RhdGUoIHJtZXNhICk7CiAKLSAgIHJtZXNhLT52YmxhbmtfZmxhZ3MgPSAocm1lc2EtPnIxMjhTY3JlZW4tPmlycSAhPSAwKQotICAgICAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZybWVzYS0+b3B0aW9uQ2FjaGUpIDogVkJMQU5LX0ZMQUdfTk9fSVJROwotCiAgICBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSA9ICh2b2lkICopcm1lc2E7CiAKICNpZiBET19ERUJVRwpAQCAtMzQ2LDggKzM0MywxMyBAQAogCSBuZXdSMTI4Q3R4LT5kaXJ0eSA9IFIxMjhfVVBMT0FEX0FMTDsKICAgICAgIH0KIAotICAgICAgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiwgbmV3UjEyOEN0eC0+dmJsYW5rX2ZsYWdzLAotCQkJICAgICAmbmV3UjEyOEN0eC0+dmJsX3NlcSApOworICAgICAgaWYgKGRyaURyYXdQcml2LT5zd2FwX2ludGVydmFsID09ICh1bnNpZ25lZCktMSkgeworCSBkcmlEcmF3UHJpdi0+dmJsRmxhZ3MgPSAobmV3UjEyOEN0eC0+cjEyOFNjcmVlbi0+aXJxICE9IDApCisJICAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZuZXdSMTI4Q3R4LT5vcHRpb25DYWNoZSkKKwkgICAgOiBWQkxBTktfRkxBR19OT19JUlE7CisKKwkgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiApOworICAgICAgfQogICAgICAgbmV3UjEyOEN0eC0+ZHJpRHJhd2FibGUgPSBkcmlEcmF3UHJpdjsKIAogICAgICAgX21lc2FfbWFrZV9jdXJyZW50KCBuZXdSMTI4Q3R4LT5nbEN0eCwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfY29udGV4dC5oCmluZGV4IDFkMTBjYjAuLjdiZjg1M2QgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2NvbnRleHQuaApAQCAtMjA5LDExICsyMDksNiBAQAogICAgR0x1aW50IGNfdGV4dHVyZUJ5dGVzOwogICAgR0x1aW50IGNfdmVydGV4QnVmZmVyczsKIAotICAgLyogVkJJCi0gICAgKi8KLSAgIEdMdWludCB2Ymxfc2VxOwotICAgR0x1aW50IHZibGFua19mbGFnczsKLQogICAgLyogQ29uZmlndXJhdGlvbiBjYWNoZQogICAgICovCiAgICBkcmlPcHRpb25DYWNoZSBvcHRpb25DYWNoZTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9pb2N0bC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2lvY3RsLmMKaW5kZXggZGNiNWQxMC4uYTNkNGIyYiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2lvY3RsLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2lvY3RsLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogCiAvKiBDb3B5IHRoZSBiYWNrIGNvbG9yIGJ1ZmZlciB0byB0aGUgZnJvbnQgY29sb3IgYnVmZmVyLgogICovCi12b2lkIHIxMjhDb3B5QnVmZmVyKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKQordm9pZCByMTI4Q29weUJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICkKIHsKICAgIHIxMjhDb250ZXh0UHRyIHJtZXNhOwogICAgR0xpbnQgbmJveCwgaSwgcmV0OwpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICB9CiAKICAgIFVOTE9DS19IQVJEV0FSRSggcm1lc2EgKTsKLSAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmcm1lc2EtPnZibF9zZXEsIHJtZXNhLT52YmxhbmtfZmxhZ3MsICZtaXNzZWRfdGFyZ2V0ICk7CisgICBkcmlXYWl0Rm9yVkJsYW5rKCBkUHJpdiwgJm1pc3NlZF90YXJnZXQgKTsKICAgIExPQ0tfSEFSRFdBUkUoIHJtZXNhICk7CiAKICAgIG5ib3ggPSBkUHJpdi0+bnVtQ2xpcFJlY3RzOwkvKiBtdXN0IGJlIGluIGxvY2tlZCByZWdpb24gKi8KQEAgLTMyNyw3ICszMjcsNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQgcjEyOFBhZ2VGbGlwKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKQordm9pZCByMTI4UGFnZUZsaXAoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApCiB7CiAgICByMTI4Q29udGV4dFB0ciBybWVzYTsKICAgIEdMaW50IHJldDsKQEAgLTM1OCw3ICszNTgsNyBAQAogICAgfQogCiAgICBVTkxPQ0tfSEFSRFdBUkUoIHJtZXNhICk7Ci0gICBkcmlXYWl0Rm9yVkJsYW5rKCBkUHJpdiwgJnJtZXNhLT52Ymxfc2VxLCBybWVzYS0+dmJsYW5rX2ZsYWdzLCAmbWlzc2VkX3RhcmdldCApOworICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICZtaXNzZWRfdGFyZ2V0ICk7CiAgICBMT0NLX0hBUkRXQVJFKCBybWVzYSApOwogCiAgICAvKiBUaGUga2VybmVsIHdpbGwgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIHBlcmZvcm0gcGFnZSBmbGlwcGluZwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X2lvY3RsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfaW9jdGwuaAppbmRleCA1MmFlM2EyLi40YjBjOWNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfaW9jdGwuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfaW9jdGwuaApAQCAtNDQsNyArNDQsNyBAQAogZXh0ZXJuIGRybUJ1ZlB0ciByMTI4R2V0QnVmZmVyTG9ja2VkKCByMTI4Q29udGV4dFB0ciBybWVzYSApOwogZXh0ZXJuIHZvaWQgcjEyOEZsdXNoVmVydGljZXNMb2NrZWQoIHIxMjhDb250ZXh0UHRyIHJtZXNhICk7CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkICpyMTI4QWxsb2NEbWFMb3coIHIxMjhDb250ZXh0UHRyIHJtZXNhLCBpbnQgY291bnQsCitzdGF0aWMgSU5MSU5FIHZvaWQgKnIxMjhBbGxvY0RtYUxvdyggcjEyOENvbnRleHRQdHIgcm1lc2EsIGludCBjb3VudCwKIAkJCQkgICAgICAgaW50IHZlcnRfc2l6ZSApCiB7CiAgICB1aW50MzJfdCAqaGVhZDsKQEAgLTg1LDggKzg1LDggQEAKIGV4dGVybiB2b2lkIHIxMjhSZWFkRGVwdGhQaXhlbHNMb2NrZWQoIHIxMjhDb250ZXh0UHRyIHJtZXNhLCBHTHVpbnQgbiwKIAkJCQkgICAgICAgY29uc3QgR0xpbnQgeFtdLCBjb25zdCBHTGludCB5W10gKTsKIAotZXh0ZXJuIHZvaWQgcjEyOENvcHlCdWZmZXIoIGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApOwotZXh0ZXJuIHZvaWQgcjEyOFBhZ2VGbGlwKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKTsKK2V4dGVybiB2b2lkIHIxMjhDb3B5QnVmZmVyKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKTsKK2V4dGVybiB2b2lkIHIxMjhQYWdlRmxpcCggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICk7CiB2b2lkIHIxMjhXYWl0Rm9yVkJsYW5rKCByMTI4Q29udGV4dFB0ciBybWVzYSApOwogCiBleHRlcm4gdm9pZCByMTI4V2FpdEZvcklkbGVMb2NrZWQoIHIxMjhDb250ZXh0UHRyIHJtZXNhICk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc2NyZWVuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc2NyZWVuLmMKaW5kZXggMWU5NjE2Mi4uNDQ4Yzg1NyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3NjcmVlbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9zY3JlZW4uYwpAQCAtOTcsOSArOTcsNyBAQAogewogICAgcjEyOFNjcmVlblB0ciByMTI4U2NyZWVuOwogICAgUjEyOERSSVB0ciByMTI4RFJJUHJpdiA9IChSMTI4RFJJUHRyKXNQcml2LT5wRGV2UHJpdjsKLSAgIFBGTkdMWFNDUkVOQUJMRUVYVEVOU0lPTlBST0MgZ2x4X2VuYWJsZV9leHRlbnNpb24gPQotICAgICAoUEZOR0xYU0NSRU5BQkxFRVhURU5TSU9OUFJPQykgKCpkcmlfaW50ZXJmYWNlLT5nZXRQcm9jQWRkcmVzcygiZ2x4RW5hYmxlRXh0ZW5zaW9uIikpOwotICAgdm9pZCAqIGNvbnN0IHBzYyA9IHNQcml2LT5wc2MtPnNjcmVlbkNvbmZpZ3M7CisgICBpbnQgaTsKIAogICAgaWYgKHNQcml2LT5kZXZQcml2U2l6ZSAhPSBzaXplb2YoUjEyOERSSVJlYykpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCJcbkVSUk9SISAgc2l6ZW9mKFIxMjhEUklSZWMpIGRvZXMgbm90IG1hdGNoIHBhc3NlZCBzaXplIGZyb20gZGV2aWNlIGRyaXZlclxuIik7CkBAIC0xMjAsNyArMTE4LDcgQEAKICAgIHIxMjhTY3JlZW4tPklzUENJID0gcjEyOERSSVByaXYtPklzUENJOwogICAgcjEyOFNjcmVlbi0+c2FyZWFfcHJpdl9vZmZzZXQgPSByMTI4RFJJUHJpdi0+c2FyZWFfcHJpdl9vZmZzZXQ7CiAgICAKLSAgIGlmIChzUHJpdi0+ZHJtTWlub3IgPj0gMykgeworICAgaWYgKHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAzKSB7CiAgICAgICBkcm1fcjEyOF9nZXRwYXJhbV90IGdwOwogICAgICAgaW50IHJldDsKIApAQCAtMjI1LDE1ICsyMjMsMTQgQEAKIAogICAgcjEyOFNjcmVlbi0+ZHJpU2NyZWVuID0gc1ByaXY7CiAKLSAgIGlmICggZ2x4X2VuYWJsZV9leHRlbnNpb24gIT0gTlVMTCApIHsKLSAgICAgIGlmICggcjEyOFNjcmVlbi0+aXJxICE9IDAgKSB7Ci0JICgqZ2x4X2VuYWJsZV9leHRlbnNpb24pKCBwc2MsICJHTFhfU0dJX3N3YXBfY29udHJvbCIgKTsKLQkgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9TR0lfdmlkZW9fc3luYyIgKTsKLQkgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX3N3YXBfY29udHJvbCIgKTsKLSAgICAgIH0KLQotICAgICAgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX3N3YXBfZnJhbWVfdXNhZ2UiICk7CisgICBpID0gMDsKKyAgIHIxMjhTY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uLmJhc2U7CisgICBpZiAoIHIxMjhTY3JlZW4tPmlycSAhPSAwICkgeworICAgICAgIHIxMjhTY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlTd2FwQ29udHJvbEV4dGVuc2lvbi5iYXNlOworICAgICAgIHIxMjhTY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlNZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb24uYmFzZTsKICAgIH0KKyAgIHIxMjhTY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9IE5VTEw7CisgICBzUHJpdi0+ZXh0ZW5zaW9ucyA9IHIxMjhTY3JlZW4tPmV4dGVuc2lvbnM7CiAKICAgIHJldHVybiByMTI4U2NyZWVuOwogfQpAQCAtNDAxLDM3ICszOTgsMTggQEAKICAgIHJldHVybiBHTF9UUlVFOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgcjEyOEFQSSA9IHsKLSAgIC5Jbml0RHJpdmVyICAgICAgPSByMTI4SW5pdERyaXZlciwKLSAgIC5EZXN0cm95U2NyZWVuICAgPSByMTI4RGVzdHJveVNjcmVlbiwKLSAgIC5DcmVhdGVDb250ZXh0ICAgPSByMTI4Q3JlYXRlQ29udGV4dCwKLSAgIC5EZXN0cm95Q29udGV4dCAgPSByMTI4RGVzdHJveUNvbnRleHQsCi0gICAuQ3JlYXRlQnVmZmVyICAgID0gcjEyOENyZWF0ZUJ1ZmZlciwKLSAgIC5EZXN0cm95QnVmZmVyICAgPSByMTI4RGVzdHJveUJ1ZmZlciwKLSAgIC5Td2FwQnVmZmVycyAgICAgPSByMTI4U3dhcEJ1ZmZlcnMsCi0gICAuTWFrZUN1cnJlbnQgICAgID0gcjEyOE1ha2VDdXJyZW50LAotICAgLlVuYmluZENvbnRleHQgICA9IHIxMjhVbmJpbmRDb250ZXh0LAotICAgLkdldFN3YXBJbmZvICAgICA9IE5VTEwsCi0gICAuR2V0TVNDICAgICAgICAgID0gZHJpR2V0TVNDMzIsCi0gICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAotICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCi0gICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAotCi19OwotCi0KLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICoKLXIxMjhGaWxsSW5Nb2RlcyggdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKK3N0YXRpYyBjb25zdCBfX0RSSWNvbmZpZyAqKgorcjEyOEZpbGxJbk1vZGVzKCBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCwKKwkJIHVuc2lnbmVkIHBpeGVsX2JpdHMsIHVuc2lnbmVkIGRlcHRoX2JpdHMsCiAJCSB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyICkKIHsKLSAgICBfX0dMY29udGV4dE1vZGVzICogbW9kZXM7CisgICAgX19EUkljb25maWcgKipjb25maWdzOwogICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtOwotICAgIHVuc2lnbmVkIG51bV9tb2RlczsKICAgICB1bnNpZ25lZCBkZXB0aF9idWZmZXJfZmFjdG9yOwogICAgIHVuc2lnbmVkIGJhY2tfYnVmZmVyX2ZhY3RvcjsKICAgICBHTGVudW0gZmJfZm9ybWF0OwogICAgIEdMZW51bSBmYl90eXBlOworICAgIGludCBpOwogCiAgICAgLyogUmlnaHQgbm93IEdMWF9TV0FQX0NPUFlfT01MIGlzbid0IHN1cHBvcnRlZCwgYnV0IGl0IHdvdWxkIGJlIGVhc3kKICAgICAgKiBlbm91Z2ggdG8gYWRkIHN1cHBvcnQuICBCYXNpY2FsbHksIGlmIGEgY29udGV4dCBpcyBjcmVhdGVkIHdpdGggYW4KQEAgLTQ1OSw4ICs0MzcsNiBAQAogICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IgPSAoKGRlcHRoX2JpdHMgIT0gMCkgfHwgKHN0ZW5jaWxfYml0cyAhPSAwKSkgPyAyIDogMTsKICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgID0gKGhhdmVfYmFja19idWZmZXIpID8gMiA6IDE7CiAKLSAgICBudW1fbW9kZXMgPSBkZXB0aF9idWZmZXJfZmFjdG9yICogYmFja19idWZmZXJfZmFjdG9yICogNDsKLQogICAgIGlmICggcGl4ZWxfYml0cyA9PSAxNiApIHsKICAgICAgICAgZmJfZm9ybWF0ID0gR0xfUkdCOwogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CkBAIC00NzAsOTcgKzQ0Niw4NSBAQAogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwogICAgIH0KIAotICAgIG1vZGVzID0gKCpkcmlfaW50ZXJmYWNlLT5jcmVhdGVDb250ZXh0TW9kZXMpKCBudW1fbW9kZXMsIHNpemVvZiggX19HTGNvbnRleHRNb2RlcyApICk7Ci0gICAgbSA9IG1vZGVzOwotICAgIGlmICggISBkcmlGaWxsSW5Nb2RlcyggJiBtLCBmYl9mb3JtYXQsIGZiX3R5cGUsCi0JCQkgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICAgR0xYX1RSVUVfQ09MT1IgKSApIHsKLQlmcHJpbnRmKCBzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXyApOwotCXJldHVybiBOVUxMOwotICAgIH0KKyAgIGNvbmZpZ3MgPSBkcmlDcmVhdGVDb25maWdzKGZiX2Zvcm1hdCwgZmJfdHlwZSwKKwkJCSAgICAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwKKwkJCSAgICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IsIGJhY2tfYnVmZmVyX21vZGVzLAorCQkJICAgICAgYmFja19idWZmZXJfZmFjdG9yKTsKKyAgIGlmIChjb25maWdzID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgX19MSU5FX18pOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CiAKLSAgICBpZiAoICEgZHJpRmlsbEluTW9kZXMoICYgbSwgZmJfZm9ybWF0LCBmYl90eXBlLAotCQkJICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9ESVJFQ1RfQ09MT1IgKSApIHsKLQlmcHJpbnRmKCBzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXyApOwotCXJldHVybiBOVUxMOwotICAgIH0KKyAgIC8qIE1hcmsgdGhlIHZpc3VhbCBhcyBzbG93IGlmIHRoZXJlIGFyZSAiZmFrZSIgc3RlbmNpbCBiaXRzLgorICAgICovCisgICBmb3IgKGkgPSAwOyBjb25maWdzW2ldOyBpKyspIHsKKyAgICAgIG0gPSAmY29uZmlnc1tpXS0+bW9kZXM7CisgICAgICBpZiAoKG0tPnN0ZW5jaWxCaXRzICE9IDApICYmIChtLT5zdGVuY2lsQml0cyAhPSBzdGVuY2lsX2JpdHMpKSB7CisgICAgICAgICBtLT52aXN1YWxSYXRpbmcgPSBHTFhfU0xPV19DT05GSUc7CisgICAgICB9CisgICB9CiAKLSAgICAvKiBNYXJrIHRoZSB2aXN1YWwgYXMgc2xvdyBpZiB0aGVyZSBhcmUgImZha2UiIHN0ZW5jaWwgYml0cy4KLSAgICAgKi8KLSAgICBmb3IgKCBtID0gbW9kZXMgOyBtICE9IE5VTEwgOyBtID0gbS0+bmV4dCApIHsKLQlpZiAoIChtLT5zdGVuY2lsQml0cyAhPSAwKSAmJiAobS0+c3RlbmNpbEJpdHMgIT0gc3RlbmNpbF9iaXRzKSApIHsKLQkgICAgbS0+dmlzdWFsUmF0aW5nID0gR0xYX1NMT1dfQ09ORklHOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kZXM7CisgICByZXR1cm4gKGNvbnN0IF9fRFJJY29uZmlnICoqKSBjb25maWdzOwogfQogCiAKIC8qKgotICogVGhpcyBpcyB0aGUgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciB0aGUgZHJpdmVyLiAgbGliR0wgc3VwcGxpZXMgYWxsIG9mIHRoZQotICogcmVxdWlzaXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0sIGFuZCB0aGUgZHJpdmVyIGluaXRpYWxpemVzIGl0c2VsZi4KLSAqIFRoaXMgcm91dGluZSBhbHNvIGZpbGxzIGluIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVkIHRvIGJ5IFxjIGRyaXZlcl9tb2RlcwotICogd2l0aCB0aGUgXGMgX19HTGNvbnRleHRNb2RlcyB0aGF0IHRoZSBkcml2ZXIgY2FuIHN1cHBvcnQgZm9yIHdpbmRvd3Mgb3IKLSAqIHBidWZmZXJzLgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KICAqIAotICogXHJldHVybiBBIHBvaW50ZXIgdG8gYSBcYyBfX0RSSXNjcmVlblByaXZhdGUgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiAKLSAqICAgICAgICAgZmFpbHVyZS4KKyAqIFx0b2RvIG1heWJlIGZvbGQgdGhpcyBpbnRvIGludGVsSW5pdERyaXZlcgorICoKKyAqIFxyZXR1cm4gdGhlIF9fR0xjb250ZXh0TW9kZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCiAgKi8KLVBVQkxJQwotdm9pZCAqIF9fZHJpQ3JlYXRlTmV3U2NyZWVuXzIwMDUwNzI3KCBfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIF9fRFJJc2NyZWVuICpwc2MsCi0JCQkgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlcywKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZGR4X3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRyaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcm1fdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklmcmFtZWJ1ZmZlciAqIGZyYW1lX2J1ZmZlciwKLQkJCSAgICAgZHJtQWRkcmVzcyBwU0FSRUEsIGludCBmZCwgCi0JCQkgICAgIGludCBpbnRlcm5hbF9hcGlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotCQkJICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCi0JCQkgICAgIAorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCityMTI4SW5pdFNjcmVlbihfX0RSSXNjcmVlblByaXZhdGUgKnBzcCkKIHsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwOwogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkZHhfZXhwZWN0ZWQgPSB7IDQsIDAsIDAgfTsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJpX2V4cGVjdGVkID0geyA0LCAwLCAwIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsgMiwgMiwgMCB9OwotCi0KLSAgIGRyaV9pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICBSMTI4RFJJUHRyIGRyaV9wcml2ID0gKFIxMjhEUklQdHIpIHBzcC0+cERldlByaXY7CiAKICAgIGlmICggISBkcmlDaGVja0RyaURkeERybVZlcnNpb25zMiggIlJhZ2UxMjgiLAotCQkJCSAgICAgIGRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKLQkJCQkgICAgICBkZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCi0JCQkJICAgICAgZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKSB7CisJCQkJICAgICAgJnBzcC0+ZHJpX3ZlcnNpb24sICYgZHJpX2V4cGVjdGVkLAorCQkJCSAgICAgICZwc3AtPmRkeF92ZXJzaW9uLCAmIGRkeF9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kcm1fdmVyc2lvbiwgJiBkcm1fZXhwZWN0ZWQgKSApCiAgICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLSAgICAgIAotICAgcHNwID0gX19kcmlVdGlsQ3JlYXRlTmV3U2NyZWVuKGRweSwgc2NybiwgcHNjLCBOVUxMLAotCQkJCSAgZGR4X3ZlcnNpb24sIGRyaV92ZXJzaW9uLCBkcm1fdmVyc2lvbiwKLQkJCQkgIGZyYW1lX2J1ZmZlciwgcFNBUkVBLCBmZCwKLQkJCQkgIGludGVybmFsX2FwaV92ZXJzaW9uLCAmcjEyOEFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgUjEyOERSSVB0ciBkcmlfcHJpdiA9IChSMTI4RFJJUHRyKSBwc3AtPnBEZXZQcml2OwotICAgICAgKmRyaXZlcl9tb2RlcyA9IHIxMjhGaWxsSW5Nb2RlcyggZHJpX3ByaXYtPmJwcCwKLQkJCQkgICAgICAgKGRyaV9wcml2LT5icHAgPT0gMTYpID8gMTYgOiAyNCwKLQkJCQkgICAgICAgKGRyaV9wcml2LT5icHAgPT0gMTYpID8gMCAgOiA4LAotCQkJCSAgICAgICAoZHJpX3ByaXYtPmJhY2tPZmZzZXQgIT0gZHJpX3ByaXYtPmRlcHRoT2Zmc2V0KSApOwogCi0gICAgICAvKiBDYWxsaW5nIGRyaUluaXRFeHRlbnNpb25zIGhlcmUsIHdpdGggYSBOVUxMIGNvbnRleHQgcG9pbnRlciwgZG9lcyBub3QgYWN0dWFsbHkKLSAgICAgICAqIGVuYWJsZSB0aGUgZXh0ZW5zaW9ucy4gIEl0IGp1c3QgbWFrZXMgc3VyZSB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsCi0gICAgICAgKiB0aGUgZXh0ZW5zaW9ucyB0aGF0ICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQotICAgICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUgaXMgY2FsbGVkLCBidXQgd2UgY2FuJ3QKLSAgICAgICAqIGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEgY29udGV4dCBwb2ludGVyLgotICAgICAgICoKLSAgICAgICAqIEhlbGxvIGNoaWNrZW4uICBIZWxsbyBlZ2cuICBIb3cgYXJlIHlvdSB0d28gdG9kYXk/Ci0gICAgICAgKi8KLSAgICAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBjYXJkX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7Ci0gICB9CisgICAvKiBDYWxsaW5nIGRyaUluaXRFeHRlbnNpb25zIGhlcmUsIHdpdGggYSBOVUxMIGNvbnRleHQgcG9pbnRlciwKKyAgICAqIGRvZXMgbm90IGFjdHVhbGx5IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucy4gIEl0IGp1c3QgbWFrZXMgc3VyZQorICAgICogdGhhdCBhbGwgdGhlIGRpc3BhdGNoIG9mZnNldHMgZm9yIGFsbCB0aGUgZXh0ZW5zaW9ucyB0aGF0CisgICAgKiAqbWlnaHQqIGJlIGVuYWJsZXMgYXJlIGtub3duLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUKKyAgICAqIGRpc3BhdGNoIG9mZnNldHMgbmVlZCB0byBiZSBrbm93biB3aGVuIF9tZXNhX2NvbnRleHRfY3JlYXRlIGlzCisgICAgKiBjYWxsZWQsIGJ1dCB3ZSBjYW4ndCBlbmFibGUgdGhlIGV4dGVuc2lvbnMgdW50aWwgd2UgaGF2ZSBhCisgICAgKiBjb250ZXh0IHBvaW50ZXIuCisgICAgKgorICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KKyAgICAqLworICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKIAotICAgcmV0dXJuICh2b2lkICopIHBzcDsKKyAgIGlmICghcjEyOEluaXREcml2ZXIocHNwKSkKKyAgICAgICByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuIHIxMjhGaWxsSW5Nb2RlcyggcHNwLAorCQkJICAgZHJpX3ByaXYtPmJwcCwKKwkJCSAgIChkcmlfcHJpdi0+YnBwID09IDE2KSA/IDE2IDogMjQsCisJCQkgICAoZHJpX3ByaXYtPmJwcCA9PSAxNikgPyAwICA6IDgsCisJCQkgICAoZHJpX3ByaXYtPmJhY2tPZmZzZXQgIT0gZHJpX3ByaXYtPmRlcHRoT2Zmc2V0KSApOwogfQorCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4gICAgICA9IHIxMjhJbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gICA9IHIxMjhEZXN0cm95U2NyZWVuLAorICAgLkNyZWF0ZUNvbnRleHQgICA9IHIxMjhDcmVhdGVDb250ZXh0LAorICAgLkRlc3Ryb3lDb250ZXh0ICA9IHIxMjhEZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICAgPSByMTI4Q3JlYXRlQnVmZmVyLAorICAgLkRlc3Ryb3lCdWZmZXIgICA9IHIxMjhEZXN0cm95QnVmZmVyLAorICAgLlN3YXBCdWZmZXJzICAgICA9IHIxMjhTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudCAgICAgPSByMTI4TWFrZUN1cnJlbnQsCisgICAuVW5iaW5kQ29udGV4dCAgID0gcjEyOFVuYmluZENvbnRleHQsCisgICAuR2V0U3dhcEluZm8gICAgID0gTlVMTCwKKyAgIC5HZXREcmF3YWJsZU1TQyAgPSBkcmlEcmF3YWJsZUdldE1TQzMyLAorICAgLldhaXRGb3JNU0MgICAgICA9IGRyaVdhaXRGb3JNU0MzMiwKKyAgIC5XYWl0Rm9yU0JDICAgICAgPSBOVUxMLAorICAgLlN3YXBCdWZmZXJzTVNDICA9IE5VTEwKK307CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc2NyZWVuLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc2NyZWVuLmgKaW5kZXggYjMxZTg3Ni4uZTJmYTE2NyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3NjcmVlbi5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9zY3JlZW4uaApAQCAtNzcsNiArNzcsOCBAQAogICAgLyogQ29uZmlndXJhdGlvbiBjYWNoZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgY29udGV4dHMgKi8KICAgIGRyaU9wdGlvbkNhY2hlIG9wdGlvbkNhY2hlOwogCisgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqZXh0ZW5zaW9uc1s0XTsKKwogfSByMTI4U2NyZWVuUmVjLCAqcjEyOFNjcmVlblB0cjsKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3NwYW4uYwppbmRleCBjNWI2NDgwLi5kZDE3N2UwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc3Bhbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF9zcGFuLmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogCiAvKiAxNi1iaXQgZGVwdGggYnVmZmVyIGZ1bmN0aW9ucwogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKIAogI2RlZmluZSBXUklURV9ERVBUSF9TUEFOKCkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXApAQCAtMjA2LDYgKzIwNyw4IEBACiAKIC8qIDI0LWJpdCBkZXB0aCwgOC1iaXQgc3RlbmNpbCBidWZmZXIgZnVuY3Rpb25zCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSF9TUEFOKCkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogICAgR0x1aW50IGJ1ZltuXTsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc3RhdGUuYwppbmRleCA1OGMzYTI3Li41MmE0ZDJlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfc3RhdGUuYwpAQCAtODEyLDcgKzgxMiw3IEBACiAgICByMTI4Q29udGV4dFB0ciBybWVzYSA9IFIxMjhfQ09OVEVYVChjdHgpOwogICAgaW50IHggPSBybWVzYS0+ZHJpRHJhd2FibGUtPng7CiAgICBpbnQgeSA9IHJtZXNhLT5kcmlEcmF3YWJsZS0+eTsKLSAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXTsKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKICAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsKIAogICAgcm1lc2EtPnNldHVwLndpbmRvd194eV9vZmZzZXQgPSAoKCh5ICYgMHhGRkYpIDw8IFIxMjhfV0lORE9XX1lfU0hJRlQpIHwKQEAgLTg5NiwxOCArODk2LDIyIEBACiAKICAgIEZMVVNIX0JBVENIKCBybWVzYSApOwogCi0gICAvKgotICAgICogX0NvbG9yRHJhd0J1ZmZlck1hc2sgaXMgZWFzaWVyIHRvIGNvcGUgd2l0aCB0aGFuIDxtb2RlPi4KLSAgICAqLwotICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSApIHsKLSAgIGNhc2UgQlVGRkVSX0JJVF9GUk9OVF9MRUZUOgotICAgY2FzZSBCVUZGRVJfQklUX0JBQ0tfTEVGVDoKLSAgICAgIEZBTExCQUNLKCBybWVzYSwgUjEyOF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKLSAgICAgIGJyZWFrOwotICAgZGVmYXVsdDoKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzICE9IDEpIHsKICAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLwogICAgICAgRkFMTEJBQ0soIHJtZXNhLCBSMTI4X0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSApIHsKKyAgICAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CisgICAgICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6CisgICAgICAgICBGQUxMQkFDSyggcm1lc2EsIFIxMjhfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX0ZBTFNFICk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvKiBHTF9OT05FIG9yIEdMX0ZST05UX0FORF9CQUNLIG9yIHN0ZXJlbyBsZWZ0JnJpZ2h0LCBldGMgKi8KKyAgICAgICAgIEZBTExCQUNLKCBybWVzYSwgUjEyOF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfVFJVRSApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICB9CiAKICAgIHJtZXNhLT5uZXdfc3RhdGUgfD0gUjEyOF9ORVdfV0lORE9XOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3RleC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjEyOC9yMTI4X3RleC5oCmluZGV4IGU4NjM0MzYuLjc3ZjAyMDEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IxMjgvcjEyOF90ZXguaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMTI4L3IxMjhfdGV4LmgKQEAgLTY3LDkgKzY3LDkgQEAKICNkZWZpbmUgUjEyOFBBQ0tDT0xPUjQ0NDQoIHIsIGcsIGIsIGEgKQkJCQkJXAogICAgKCgoKGEpICYgMHhmMCkgPDwgOCkgfCAoKChyKSAmIDB4ZjApIDw8IDQpIHwgKChnKSAmIDB4ZjApIHwgKChiKSA+PiA0KSkKIAotc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgcjEyOFBhY2tDb2xvciggR0x1aW50IGNwcCwKLQkJCQkJR0x1Ynl0ZSByLCBHTHVieXRlIGcsCi0JCQkJCUdMdWJ5dGUgYiwgR0x1Ynl0ZSBhICkKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QgcjEyOFBhY2tDb2xvciggR0x1aW50IGNwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhICkKIHsKICAgICBzd2l0Y2ggKCBjcHAgKSB7CiAgICAgY2FzZSAyOgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9jb250ZXh0LmMKaW5kZXggNWExNzg0NC4uYzU2NzM0OSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfY29udGV4dC5jCkBAIC02OSw2ICs2OSw3IEBACiAjZGVmaW5lIG5lZWRfR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgogI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9taW5tYXgKICNkZWZpbmUgbmVlZF9HTF9FWFRfZm9nX2Nvb3JkCisjZGVmaW5lIG5lZWRfR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCiAjZGVmaW5lIG5lZWRfR0xfRVhUX3NlY29uZGFyeV9jb2xvcgogI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQogI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlCkBAIC0xMzIsNiArMTMzLDcgQEAKICAgICB7ICJHTF9FWFRfYmxlbmRfbWlubWF4IiwgICAgICAgICAgICAgICBHTF9FWFRfYmxlbmRfbWlubWF4X2Z1bmN0aW9ucyB9LAogICAgIHsgIkdMX0VYVF9ibGVuZF9zdWJ0cmFjdCIsICAgICAgICAgICAgIE5VTEwgfSwKICAgICB7ICJHTF9FWFRfZm9nX2Nvb3JkIiwgICAgICAgICAgICAgICAgICBHTF9FWFRfZm9nX2Nvb3JkX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyIsICAgICAgICAgIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5c19mdW5jdGlvbnMgfSwKICAgICB7ICJHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIiwgICAgICAgICAgICBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yX2Z1bmN0aW9ucyB9LAogICAgIHsgIkdMX0VYVF9zdGVuY2lsX3dyYXAiLCAgICAgICAgICAgICAgIE5VTEwgfSwKICAgICB7ICJHTF9FWFRfdGV4dHVyZV9lZGdlX2NsYW1wIiwgICAgICAgICBOVUxMIH0sCkBAIC0yNzcsMTQgKzI3OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZfbWF4X2FuaXNvdHJvcHkiKTsKIAogICAgaWYgKCBkcmlRdWVyeU9wdGlvbmIoICZybWVzYS0+b3B0aW9uQ2FjaGUsICJoeXBlcnoiICkgKSB7Ci0gICAgICBpZiAoIHNQcml2LT5kcm1NaW5vciA8IDEzICkKKyAgICAgIGlmICggc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yIDwgMTMgKQogCSBmcHJpbnRmKCBzdGRlcnIsICJEUk0gdmVyc2lvbiAxLiVkIHRvbyBvbGQgdG8gc3VwcG9ydCBIeXBlclosICIKLQkJCSAgImRpc2FibGluZy5cbiIsc1ByaXYtPmRybU1pbm9yICk7CisJCQkgICJkaXNhYmxpbmcuXG4iLCBzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgKTsKICAgICAgIGVsc2UKIAkgcm1lc2EtPnVzaW5nX2h5cGVyeiA9IEdMX1RSVUU7CiAgICB9CiAgCi0gICBpZiAoIHNQcml2LT5kcm1NaW5vciA+PSAxNSApCisgICBpZiAoIHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxNSApCiAgICAgICBybWVzYS0+dGV4bWljcm90aWxlID0gR0xfVFJVRTsKIAogICAgLyogSW5pdCBkZWZhdWx0IGRyaXZlciBmdW5jdGlvbnMgdGhlbiBwbHVnIGluIG91ciBSMjAwLXNwZWNpZmljIGZ1bmN0aW9ucwpAQCAtMzE3LDcgKzMxOSw3IEBACiAgICBybWVzYS0+ZHJpLmh3Q29udGV4dCA9IGRyaUNvbnRleHRQcml2LT5oSFdDb250ZXh0OwogICAgcm1lc2EtPmRyaS5od0xvY2sgPSAmc1ByaXYtPnBTQVJFQS0+bG9jazsKICAgIHJtZXNhLT5kcmkuZmQgPSBzUHJpdi0+ZmQ7Ci0gICBybWVzYS0+ZHJpLmRybU1pbm9yID0gc1ByaXYtPmRybU1pbm9yOworICAgcm1lc2EtPmRyaS5kcm1NaW5vciA9IHNQcml2LT5kcm1fdmVyc2lvbi5taW5vcjsKIAogICAgcm1lc2EtPnIyMDBTY3JlZW4gPSBzY3JlZW47CiAgICBybWVzYS0+c2FyZWEgPSAoZHJtX3JhZGVvbl9zYXJlYV90ICopKChHTHVieXRlICopc1ByaXYtPnBTQVJFQSArCkBAIC00OTksMTMgKzUwMSwxMCBAQAogCSAgICAgIGZ0aHJvdHRsZV9tb2RlLAogCSAgICAgIHJtZXNhLT5yMjAwU2NyZWVuLT5pcnEpOwogCi0gICBybWVzYS0+dmJsYW5rX2ZsYWdzID0gKHJtZXNhLT5yMjAwU2NyZWVuLT5pcnEgIT0gMCkKLSAgICAgICA/IGRyaUdldERlZmF1bHRWQmxhbmtGbGFncygmcm1lc2EtPm9wdGlvbkNhY2hlKSA6IFZCTEFOS19GTEFHX05PX0lSUTsKLQogICAgcm1lc2EtPnByZWZlcl9nYXJ0X2NsaWVudF90ZXh0dXJpbmcgPSAKICAgICAgIChnZXRlbnYoIlIyMDBfR0FSVF9DTElFTlRfVEVYVFVSRVMiKSAhPSAwKTsKIAotICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmIHJtZXNhLT5zd2FwX3VzdCApOworICAgKCpzUHJpdi0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF91c3QgKTsKIAogCiAjaWYgRE9fREVCVUcKQEAgLTY2NiwxNSArNjY1LDE4IEBACiAgICAgICBpZiAoUjIwMF9ERUJVRyAmIERFQlVHX0RSSSkKIAkgZnByaW50ZihzdGRlcnIsICIlcyBjdHggJXBcbiIsIF9fRlVOQ1RJT05fXywgKHZvaWQgKiluZXdDdHgtPmdsQ3R4KTsKIAotICAgICAgaWYgKCBuZXdDdHgtPmRyaS5kcmF3YWJsZSAhPSBkcmlEcmF3UHJpdiApIHsKLQkgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiwgbmV3Q3R4LT52YmxhbmtfZmxhZ3MsCi0JCQkJJm5ld0N0eC0+dmJsX3NlcSApOwotICAgICAgfQotCiAgICAgICBuZXdDdHgtPmRyaS5yZWFkYWJsZSA9IGRyaVJlYWRQcml2OwogCiAgICAgICBpZiAoIG5ld0N0eC0+ZHJpLmRyYXdhYmxlICE9IGRyaURyYXdQcml2IHx8CiAgICAgICAgICAgIG5ld0N0eC0+bGFzdFN0YW1wICE9IGRyaURyYXdQcml2LT5sYXN0U3RhbXAgKSB7CisJIGlmIChkcmlEcmF3UHJpdi0+c3dhcF9pbnRlcnZhbCA9PSAodW5zaWduZWQpLTEpIHsKKwkgICAgZHJpRHJhd1ByaXYtPnZibEZsYWdzID0gKG5ld0N0eC0+cjIwMFNjcmVlbi0+aXJxICE9IDApCisJICAgICAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZuZXdDdHgtPm9wdGlvbkNhY2hlKQorCSAgICAgICA6IFZCTEFOS19GTEFHX05PX0lSUTsKKworCSAgICBkcmlEcmF3YWJsZUluaXRWQmxhbmsoIGRyaURyYXdQcml2ICk7CisJIH0KKwogCSBuZXdDdHgtPmRyaS5kcmF3YWJsZSA9IGRyaURyYXdQcml2OwogCiAJIHIyMDBTZXRDbGlwcmVjdHMobmV3Q3R4KTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfY29udGV4dC5oCmluZGV4IGJlYzA5ZTguLmVlNDc4ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2NvbnRleHQuaApAQCAtMTc5LDYgKzE3OSw3IEBACiAKICAgIGRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2VbNl1bUkFERU9OX01BWF9URVhUVVJFX0xFVkVMU107CiAJCQkJCS8qIFNpeCwgZm9yIHRoZSBjdWJlIGZhY2VzICovCisgICBHTGJvb2xlYW4gaW1hZ2Vfb3ZlcnJpZGU7CQkvKiBJbWFnZSBvdmVycmlkZGVuIGJ5IEdMWF9FWFRfdGZwICovCiAKICAgIEdMdWludCBwcF90eGZpbHRlcjsJCSAgICAgICAgLyogaGFyZHdhcmUgcmVnaXN0ZXIgdmFsdWVzICovCiAgICBHTHVpbnQgcHBfdHhmb3JtYXQ7CkBAIC04OTIsMTEgKzg5Myw4IEBACiAgICBHTHVpbnQgVGV4R2VuQ29tcFNlbDsKICAgIEdMbWF0cml4IHRtcG1hdDsKIAotICAgLyogVkJJIC8gYnVmZmVyIHN3YXAKKyAgIC8qIGJ1ZmZlciBzd2FwCiAgICAgKi8KLSAgIEdMdWludCB2Ymxfc2VxOwotICAgR0x1aW50IHZibGFua19mbGFnczsKLQogICAgaW50NjRfdCBzd2FwX3VzdDsKICAgIGludDY0X3Qgc3dhcF9taXNzZWRfdXN0OwogCkBAIC05MjksNyArOTI3LDcgQEAKICNkZWZpbmUgUjIwMF9DT05URVhUKGN0eCkJCSgocjIwMENvbnRleHRQdHIpKGN0eC0+RHJpdmVyQ3R4KSkKIAogCi1zdGF0aWMgX19pbmxpbmUgR0x1aW50IHIyMDBQYWNrQ29sb3IoIEdMdWludCBjcHAsCitzdGF0aWMgSU5MSU5FIEdMdWludCByMjAwUGFja0NvbG9yKCBHTHVpbnQgY3BwLAogCQkJCQlHTHVieXRlIHIsIEdMdWJ5dGUgZywKIAkJCQkJR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQogewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2ZyYWdzaGFkZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9mcmFnc2hhZGVyLmMKaW5kZXggNWRkM2FkYS4uZDUxNGIyOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2ZyYWdzaGFkZXIuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfZnJhZ3NoYWRlci5jCkBAIC0yNCwxMyArMjQsMTMgQEAKICAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJnbGhlYWRlci5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgotI2luY2x1ZGUgImVudW1zLmgiCiAKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJtYWluL2VudW1zLmgiCiAjaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgotI2luY2x1ZGUgImF0aWZyYWdzaGFkZXIuaCIKLSNpbmNsdWRlICJwcm9ncmFtLmgiCisjaW5jbHVkZSAic2hhZGVyL2F0aWZyYWdzaGFkZXIuaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ3JhbS5oIgogI2luY2x1ZGUgInIyMDBfY29udGV4dC5oIgogI2luY2x1ZGUgInIyMDBfaW9jdGwuaCIKICNpbmNsdWRlICJyMjAwX3RleC5oIgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuYwppbmRleCBlZDU3ZGVmLi45MGM2OTVmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuYwpAQCAtNDE5LDEzICs0MTksMTQgQEAKIAogLyogQ29weSB0aGUgYmFjayBjb2xvciBidWZmZXIgdG8gdGhlIGZyb250IGNvbG9yIGJ1ZmZlci4KICAqLwotdm9pZCByMjAwQ29weUJ1ZmZlciggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LAordm9pZCByMjAwQ29weUJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LAogCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QJICpyZWN0KQogewogICAgcjIwMENvbnRleHRQdHIgcm1lc2E7CiAgICBHTGludCBuYm94LCBpLCByZXQ7CiAgICBHTGJvb2xlYW4gICBtaXNzZWRfdGFyZ2V0OwogICAgaW50NjRfdCB1c3Q7CisgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IGRQcml2LT5kcmlTY3JlZW5Qcml2OwogCiAgICBhc3NlcnQoZFByaXYpOwogICAgYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdik7CkBAIC00NDksNyArNDUwLDcgQEAKICAgIGlmICghcmVjdCkKICAgIHsKICAgICAgICBVTkxPQ0tfSEFSRFdBUkUoIHJtZXNhICk7Ci0gICAgICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICYgcm1lc2EtPnZibF9zZXEsIHJtZXNhLT52YmxhbmtfZmxhZ3MsICYgbWlzc2VkX3RhcmdldCApOworICAgICAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmIG1pc3NlZF90YXJnZXQgKTsKICAgICAgICBMT0NLX0hBUkRXQVJFKCBybWVzYSApOwogICAgfQogCkBAIC00NzYsMTYgKzQ3NywxOCBAQAogCSAgICAgaWYgKHJlY3QtPnkyIDwgYi0+eTIpCiAJCSBiLT55MiA9IHJlY3QtPnkyOwogCi0JICAgICBpZiAoYi0+eDEgPCBiLT54MiAmJiBiLT55MSA8IGItPnkyKQotCQkgYisrOworCSAgICAgaWYgKGItPngxID49IGItPngyIHx8IGItPnkxID49IGItPnkyKQorCQkgY29udGludWU7CiAJICB9Ci0JICBlbHNlCi0JICAgICAgYisrOwogCisJICBiKys7CiAJICBuKys7CiAgICAgICB9CiAgICAgICBybWVzYS0+c2FyZWEtPm5ib3ggPSBuOwogCisgICAgICBpZiAoIW4pCisJIGNvbnRpbnVlOworCiAgICAgICByZXQgPSBkcm1Db21tYW5kTm9uZSggcm1lc2EtPmRyaS5mZCwgRFJNX1JBREVPTl9TV0FQICk7CiAKICAgICAgIGlmICggcmV0ICkgewpAQCAtNTAxLDcgKzUwNCw3IEBACiAgICAgICAgcm1lc2EtPmh3LmFsbF9kaXJ0eSA9IEdMX1RSVUU7CiAKICAgICAgICBybWVzYS0+c3dhcF9jb3VudCsrOwotICAgICAgICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiB1c3QgKTsKKyAgICAgICAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJiB1c3QgKTsKICAgICAgICBpZiAoIG1pc3NlZF90YXJnZXQgKSB7CiAJICAgcm1lc2EtPnN3YXBfbWlzc2VkX2NvdW50Kys7CiAJICAgcm1lc2EtPnN3YXBfbWlzc2VkX3VzdCA9IHVzdCAtIHJtZXNhLT5zd2FwX3VzdDsKQEAgLTUxMywxMSArNTE2LDEyIEBACiAgICB9CiB9CiAKLXZvaWQgcjIwMFBhZ2VGbGlwKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKQordm9pZCByMjAwUGFnZUZsaXAoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiApCiB7CiAgICByMjAwQ29udGV4dFB0ciBybWVzYTsKICAgIEdMaW50IHJldDsKICAgIEdMYm9vbGVhbiAgIG1pc3NlZF90YXJnZXQ7CisgICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcCA9IGRQcml2LT5kcmlTY3JlZW5Qcml2OwogCiAgICBhc3NlcnQoZFByaXYpOwogICAgYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdik7CkBAIC01NTMsMTAgKzU1NywxMCBAQAogICAgICovCiAgICByMjAwV2FpdEZvckZyYW1lQ29tcGxldGlvbiggcm1lc2EgKTsKICAgIFVOTE9DS19IQVJEV0FSRSggcm1lc2EgKTsKLSAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmIHJtZXNhLT52Ymxfc2VxLCBybWVzYS0+dmJsYW5rX2ZsYWdzLCAmIG1pc3NlZF90YXJnZXQgKTsKKyAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmIG1pc3NlZF90YXJnZXQgKTsKICAgIGlmICggbWlzc2VkX3RhcmdldCApIHsKICAgICAgIHJtZXNhLT5zd2FwX21pc3NlZF9jb3VudCsrOwotICAgICAgKHZvaWQpICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF9taXNzZWRfdXN0ICk7CisgICAgICAodm9pZCkgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkoICYgcm1lc2EtPnN3YXBfbWlzc2VkX3VzdCApOwogICAgfQogICAgTE9DS19IQVJEV0FSRSggcm1lc2EgKTsKIApAQCAtNTcwLDcgKzU3NCw3IEBACiAgICB9CiAKICAgIHJtZXNhLT5zd2FwX2NvdW50Kys7Ci0gICAodm9pZCkgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmIHJtZXNhLT5zd2FwX3VzdCApOworICAgKHZvaWQpICgqcHNwLT5zeXN0ZW1UaW1lLT5nZXRVU1QpKCAmIHJtZXNhLT5zd2FwX3VzdCApOwogCiAjaWYgMDAwCiAgICBpZiAoIHJtZXNhLT5zYXJlYS0+cGZDdXJyZW50UGFnZSA9PSAxICkgewpAQCAtODU3LDcgKzg2MSw3IEBACiAgKiB0aGUga2VybmVsIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gZ2V0IHRoZQogICogZGV2aWNlIGZkLgogICovCi12b2lkICpyMjAwQWxsb2NhdGVNZW1vcnlNRVNBKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgR0xzaXplaSBzaXplLAordm9pZCAqcjIwMEFsbG9jYXRlTWVtb3J5TUVTQShfX0RSSXNjcmVlbiAqc2NyZWVuLCBHTHNpemVpIHNpemUsCiAJCQkgICAgIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCAKIAkJCSAgICAgR0xmbG9hdCBwcmlvcml0eSkKIHsKQEAgLTg5OSw3ICs5MDMsNyBAQAogCiAKIC8qIENhbGxlZCB2aWEgZ2xYRnJlZU1lbW9yeU1FU0EoKSAqLwotdm9pZCByMjAwRnJlZU1lbW9yeU1FU0EoX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBHTHZvaWQgKnBvaW50ZXIpCit2b2lkIHIyMDBGcmVlTWVtb3J5TUVTQShfX0RSSXNjcmVlbiAqc2NyZWVuLCBHTHZvaWQgKnBvaW50ZXIpCiB7CiAgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CiAgICByMjAwQ29udGV4dFB0ciBybWVzYTsKQEAgLTkzNiw3ICs5NDAsNyBAQAogfQogCiAvKiBDYWxsZWQgdmlhIGdsWEdldE1lbW9yeU9mZnNldE1FU0EoKSAqLwotR0x1aW50IHIyMDBHZXRNZW1vcnlPZmZzZXRNRVNBKF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgY29uc3QgR0x2b2lkICpwb2ludGVyKQorR0x1aW50IHIyMDBHZXRNZW1vcnlPZmZzZXRNRVNBKF9fRFJJc2NyZWVuICpzY3JlZW4sIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKIHsKICAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKICAgIHIyMDBDb250ZXh0UHRyIHJtZXNhOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX2lvY3RsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuaAppbmRleCA1ZWQxNTU1Li4zMTQzMWI3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfaW9jdGwuaApAQCAtODksMTkgKzg5LDE5IEBACiAJCQkJICAgIHN0cnVjdCByMjAwX2RtYV9yZWdpb24gKnJlZ2lvbiwKIAkJCQkgICAgY29uc3QgY2hhciAqY2FsbGVyICk7CiAKLWV4dGVybiB2b2lkIHIyMDBDb3B5QnVmZmVyKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJhd2FibGUsCitleHRlcm4gdm9pZCByMjAwQ29weUJ1ZmZlciggX19EUklkcmF3YWJsZVByaXZhdGUgKmRyYXdhYmxlLAogCQkJICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAgICAgICpyZWN0KTsKLWV4dGVybiB2b2lkIHIyMDBQYWdlRmxpcCggY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKmRyYXdhYmxlICk7CitleHRlcm4gdm9pZCByMjAwUGFnZUZsaXAoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkcmF3YWJsZSApOwogZXh0ZXJuIHZvaWQgcjIwMEZsdXNoKCBHTGNvbnRleHQgKmN0eCApOwogZXh0ZXJuIHZvaWQgcjIwMEZpbmlzaCggR0xjb250ZXh0ICpjdHggKTsKIGV4dGVybiB2b2lkIHIyMDBXYWl0Rm9ySWRsZUxvY2tlZCggcjIwMENvbnRleHRQdHIgcm1lc2EgKTsKIGV4dGVybiB2b2lkIHIyMDBXYWl0Rm9yVkJsYW5rKCByMjAwQ29udGV4dFB0ciBybWVzYSApOwogZXh0ZXJuIHZvaWQgcjIwMEluaXRJb2N0bEZ1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOwogCi1leHRlcm4gdm9pZCAqcjIwMEFsbG9jYXRlTWVtb3J5TUVTQSggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsCitleHRlcm4gdm9pZCAqcjIwMEFsbG9jYXRlTWVtb3J5TUVTQSggX19EUklzY3JlZW4gKnNjcmVlbiwgR0xzaXplaSBzaXplLCBHTGZsb2F0IHJlYWRmcmVxLAogCQkJCSAgIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5ICk7Ci1leHRlcm4gdm9pZCByMjAwRnJlZU1lbW9yeU1FU0EoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgR0x2b2lkICpwb2ludGVyICk7Ci1leHRlcm4gR0x1aW50IHIyMDBHZXRNZW1vcnlPZmZzZXRNRVNBKCBfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApOworZXh0ZXJuIHZvaWQgcjIwMEZyZWVNZW1vcnlNRVNBKCBfX0RSSXNjcmVlbiAqc2NyZWVuLCBHTHZvaWQgKnBvaW50ZXIgKTsKK2V4dGVybiBHTHVpbnQgcjIwMEdldE1lbW9yeU9mZnNldE1FU0EoIF9fRFJJc2NyZWVuICpzY3JlZW4sIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApOwogCiBleHRlcm4gR0xib29sZWFuIHIyMDBJc0dhcnRNZW1vcnkoIHIyMDBDb250ZXh0UHRyIHJtZXNhLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsCiAJCQkJICAgR0xpbnQgc2l6ZSApOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICBtZW1jcHkoIHJtZXNhLT5ody5BVE9NLmxhc3RjbWQsIHJtZXNhLT5ody5BVE9NLmNtZCwJXAogCSAgIHJtZXNhLT5ody5BVE9NLmNtZF9zaXplICogNCkKIAotc3RhdGljIF9faW5saW5lIGludCBSMjAwX0RCX1NUQVRFQ0hBTkdFKCAKK3N0YXRpYyBJTkxJTkUgaW50IFIyMDBfREJfU1RBVEVDSEFOR0UoIAogICAgcjIwMENvbnRleHRQdHIgcm1lc2EsCiAgICBzdHJ1Y3QgcjIwMF9zdGF0ZV9hdG9tICphdG9tICkKIHsKQEAgLTE4Myw3ICsxODMsNyBAQAogICogYW5kIGhhbmcgb24gdG8gdGhlIGxvY2sgdW50aWwgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgZmluaXNoZWQgYW5kIHdlIGZsdXNoCiAgKiB0aGUgYnVmZmVyIGFnYWluIGFuZCB1bmxvY2suCiAgKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIHIyMDBFbnN1cmVDbWRCdWZTcGFjZSggcjIwMENvbnRleHRQdHIgcm1lc2EsIGludCBieXRlcyApCitzdGF0aWMgSU5MSU5FIHZvaWQgcjIwMEVuc3VyZUNtZEJ1ZlNwYWNlKCByMjAwQ29udGV4dFB0ciBybWVzYSwgaW50IGJ5dGVzICkKIHsKICAgIGlmIChybWVzYS0+c3RvcmUuY21kX3VzZWQgKyBieXRlcyA+IFIyMDBfQ01EX0JVRl9TWikKICAgICAgIHIyMDBGbHVzaENtZEJ1Ziggcm1lc2EsIF9fRlVOQ1RJT05fXyApOwpAQCAtMTkyLDcgKzE5Miw3IEBACiAKIC8qIEFsbG9jIHNwYWNlIGluIHRoZSBjb21tYW5kIGJ1ZmZlcgogICovCi1zdGF0aWMgX19pbmxpbmUgY2hhciAqcjIwMEFsbG9jQ21kQnVmKCByMjAwQ29udGV4dFB0ciBybWVzYSwKK3N0YXRpYyBJTkxJTkUgY2hhciAqcjIwMEFsbG9jQ21kQnVmKCByMjAwQ29udGV4dFB0ciBybWVzYSwKIAkJCQkJIGludCBieXRlcywgY29uc3QgY2hhciAqd2hlcmUgKQogewogICAgY2hhciAqIGhlYWQ7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfcGl4ZWwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9waXhlbC5jCmluZGV4IDJmNWFhYjAuLjQ2ZDIzMDcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9waXhlbC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9waXhlbC5jCkBAIC0yOTQsNyArMjk0LDcgQEAKICAgIHIyMDBDb250ZXh0UHRyIHJtZXNhID0gUjIwMF9DT05URVhUKGN0eCk7CiAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBybWVzYS0+ZHJpLmRyYXdhYmxlOwogICAgZHJtX2NsaXBfcmVjdF90ICpib3ggPSBkUHJpdi0+cENsaXBSZWN0czsKLSAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXTsKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKICAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSByYjsKICAgIGludCBuYm94ID0gZFByaXYtPm51bUNsaXBSZWN0czsKICAgIGludCBpOwpAQCAtMzgyLDEzICszODIsMTMgQEAKICAgIEdMaW50IHBpdGNoID0gdW5wYWNrLT5Sb3dMZW5ndGggPyB1bnBhY2stPlJvd0xlbmd0aCA6IHdpZHRoOwogICAgR0x1aW50IHBsYW5lbWFzazsKICAgIEdMdWludCBjcHAgPSBybWVzYS0+cjIwMFNjcmVlbi0+Y3BwOwotICAgR0xpbnQgc2l6ZSA9IHdpZHRoICogcGl0Y2ggKiBjcHA7CisgICBHTGludCBzaXplID0gaGVpZ2h0ICogcGl0Y2ggKiBjcHA7CiAKICAgIGlmIChSMjAwX0RFQlVHICYgREVCVUdfUElYRUwpCiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIGRyYXdpbmcgdG8gZXhhY3RseSBvbmUgY29sb3IgYnVmZmVyICovCi0gICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVyc1swXSAhPSAxKQorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgIT0gMSkKICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogCiAgICBzd2l0Y2ggKGZvcm1hdCkgewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3NwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9zcGFuLmMKaW5kZXggZmU0MjdiZC4uM2Q3YTAwMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3NwYW4uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfc3Bhbi5jCkBAIC0xNzIsNiArMTcyLDcgQEAKIAogLyogMTYtYml0IGRlcHRoIGJ1ZmZlciBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdXNob3J0CiAKICNkZWZpbmUgV1JJVEVfREVQVEgoIF94LCBfeSwgZCApCQkJCQlcCiAgICAqKEdMdXNob3J0ICopKGJ1ZiArIHIyMDBfbWJhX3oxNiggZHJiLCBfeCArIHhvLCBfeSArIHlvICkpID0gZDsKQEAgLTE4NSw2ICsxODYsNyBAQAogCiAvKiAyNCBiaXQgZGVwdGgsIDggYml0IHN0ZW5jaWwgZGVwdGhidWZmZXIgZnVuY3Rpb25zCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKIAogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCkBAIC0yNTUsNyArMjU3LDcgQEAKICAgIHsKICAgICAgIGludCBwOwogICAgICAgZHJpUmVuZGVyYnVmZmVyICpkcmIgPQotCSAoZHJpUmVuZGVyYnVmZmVyICopIGN0eC0+V2luU3lzRHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF07CisJIChkcmlSZW5kZXJidWZmZXIgKikgY3R4LT5XaW5TeXNEcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKICAgICAgIHZvbGF0aWxlIGludCAqYnVmID0KIAkgKHZvbGF0aWxlIGludCAqKShybWVzYS0+ZHJpLnNjcmVlbi0+cEZCICsgZHJiLT5vZmZzZXQpOwogICAgICAgcCA9ICpidWY7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9zdGF0ZS5jCmluZGV4IGU5ZDJkOWEuLmFkZTI2YzIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF9zdGF0ZS5jCkBAIC0xODU5LDggKzE4NTksNyBAQAogICAgR0xmcmFtZWJ1ZmZlciAqY29uc3QgZHJhd19mYiA9IChHTGZyYW1lYnVmZmVyKikgZHJhd2FibGUtPmRyaXZlclByaXZhdGU7CiAgICBHTGZyYW1lYnVmZmVyICpjb25zdCByZWFkX2ZiID0gKEdMZnJhbWVidWZmZXIqKSByZWFkYWJsZS0+ZHJpdmVyUHJpdmF0ZTsKIAotICAgaWYgKGRyYXdfZmItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdCi0gICAgICAgPT0gQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKKyAgIGlmIChkcmF3X2ZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9PSBCVUZGRVJfQklUX0JBQ0tfTEVGVCkgewogICAgICAgLyogQ2FuJ3QgaWdub3JlIDJkIHdpbmRvd3MgaWYgd2UgYXJlIHBhZ2UgZmxpcHBpbmcuCiAgICAgICAgKi8KICAgICAgIGlmICggZHJhd2FibGUtPm51bUJhY2tDbGlwUmVjdHMgPT0gMCB8fCBybWVzYS0+ZG9QYWdlRmxpcCApIHsKQEAgLTE5MTAsMTcgKzE5MDksMTggQEAKIAogICAgUjIwMF9GSVJFVkVSVElDRVMocm1lc2EpOwkvKiBkb24ndCBwaXBlbGluZSBjbGlwcmVjdCBjaGFuZ2VzICovCiAKLSAgIC8qCi0gICAgKiBfQ29sb3JEcmF3QnVmZmVyTWFzayBpcyBlYXNpZXIgdG8gY29wZSB3aXRoIHRoYW4gPG1vZGU+LgotICAgICogQ2hlY2sgZm9yIHNvZnR3YXJlIGZhbGxiYWNrLCB1cGRhdGUgY2xpcHJlY3RzLgotICAgICovCi0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgIT0gMSkgeworICAgICAgLyogMCAoR0xfTk9ORSkgYnVmZmVycyBvciBtdWx0aXBsZSBjb2xvciBkcmF3aW5nIGJ1ZmZlcnMgKi8KKyAgICAgIEZBTExCQUNLKCBybWVzYSwgUjIwMF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfVFJVRSApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICkgeworICAgY2FzZSBCVUZGRVJfRlJPTlRfTEVGVDoKKyAgIGNhc2UgQlVGRkVSX0JBQ0tfTEVGVDoKICAgICAgIEZBTExCQUNLKCBybWVzYSwgUjIwMF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIC8qIDAgKEdMX05PTkUpIGJ1ZmZlcnMgb3IgbXVsdGlwbGUgY29sb3IgZHJhd2luZyBidWZmZXJzICovCiAgICAgICBGQUxMQkFDSyggcm1lc2EsIFIyMDBfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKICAgICAgIHJldHVybjsKICAgIH0KQEAgLTI0NDUsMTEgKzI0NDUsMTEgQEAKICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPkRyYXdCdWZmZXI7CiAgICBkcmlSZW5kZXJidWZmZXIgKmRyYjsKIAotICAgaWYgKGZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0ZST05UX0xFRlQpIHsKKyAgIGlmIChmYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0ZST05UX0xFRlQpIHsKICAgICAgIC8qIGRyYXcgdG8gZnJvbnQgKi8KICAgICAgIGRyYiA9IChkcmlSZW5kZXJidWZmZXIgKikgZmItPkF0dGFjaG1lbnRbQlVGRkVSX0ZST05UX0xFRlRdLlJlbmRlcmJ1ZmZlcjsKICAgIH0KLSAgIGVsc2UgaWYgKGZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0JBQ0tfTEVGVCkgeworICAgZWxzZSBpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdID09IEJVRkZFUl9CQUNLX0xFRlQpIHsKICAgICAgIC8qIGRyYXcgdG8gYmFjayAqLwogICAgICAgZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSBmYi0+QXR0YWNobWVudFtCVUZGRVJfQkFDS19MRUZUXS5SZW5kZXJidWZmZXI7CiAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGNsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGNsLmMKaW5kZXggMmFkMzVkNC4uNzgzNDdkMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RjbC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF90Y2wuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAKICAgIGZvciAoaSA9IDAgOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50IDsgaSsrKQogICAgewotICAgICAgR0x1aW50IHByaW0gPSBWQi0+UHJpbWl0aXZlW2ldLm1vZGU7CisgICAgICBHTHVpbnQgcHJpbSA9IF90bmxfdHJhbnNsYXRlX3ByaW0oJlZCLT5QcmltaXRpdmVbaV0pOwogICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgIEdMdWludCBsZW5ndGggPSBWQi0+UHJpbWl0aXZlW2ldLmNvdW50OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4LmMKaW5kZXggZTdhMzdkZC4uMjRiOWIzYiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF90ZXguYwpAQCAtMTAyLDM3ICsxMDIsMzkgQEAKICAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCBTIHdyYXAgbW9kZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICB9CiAKLSAgIHN3aXRjaCAoIHR3cmFwICkgewotICAgY2FzZSBHTF9SRVBFQVQ6Ci0gICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfV1JBUDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9DTEFNUDoKLSAgICAgIHQtPnBwX3R4ZmlsdGVyIHw9IFIyMDBfQ0xBTVBfVF9DTEFNUF9HTDsKLSAgICAgIGlzX2NsYW1wID0gR0xfVFJVRTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgotICAgICAgdC0+cHBfdHhmaWx0ZXIgfD0gUjIwMF9DTEFNUF9UX0NMQU1QX0xBU1Q7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgR0xfQ0xBTVBfVE9fQk9SREVSOgotICAgICAgdC0+cHBfdHhmaWx0ZXIgfD0gUjIwMF9DTEFNUF9UX0NMQU1QX0dMOwotICAgICAgaXNfY2xhbXBfdG9fYm9yZGVyID0gR0xfVFJVRTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6Ci0gICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfTUlSUk9SOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX01JUlJPUl9DTEFNUF9FWFQ6Ci0gICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfTUlSUk9SX0NMQU1QX0dMOwotICAgICAgaXNfY2xhbXAgPSBHTF9UUlVFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVDoKLSAgICAgIHQtPnBwX3R4ZmlsdGVyIHw9IFIyMDBfQ0xBTVBfVF9NSVJST1JfQ0xBTVBfTEFTVDsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVDoKLSAgICAgIHQtPnBwX3R4ZmlsdGVyIHw9IFIyMDBfQ0xBTVBfVF9NSVJST1JfQ0xBTVBfR0w7Ci0gICAgICBpc19jbGFtcF90b19ib3JkZXIgPSBHTF9UUlVFOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiYmFkIFQgd3JhcCBtb2RlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgIGlmICh0LT5iYXNlLnRPYmotPlRhcmdldCAhPSBHTF9URVhUVVJFXzFEKSB7CisgICAgICBzd2l0Y2ggKCB0d3JhcCApIHsKKyAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgdC0+cHBfdHhmaWx0ZXIgfD0gUjIwMF9DTEFNUF9UX1dSQVA7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQ0xBTVA6CisgICAgICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfQ0xBTVBfR0w7CisgICAgICAgICBpc19jbGFtcCA9IEdMX1RSVUU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgIHQtPnBwX3R4ZmlsdGVyIHw9IFIyMDBfQ0xBTVBfVF9DTEFNUF9MQVNUOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0NMQU1QX1RPX0JPUkRFUjoKKyAgICAgICAgIHQtPnBwX3R4ZmlsdGVyIHw9IFIyMDBfQ0xBTVBfVF9DTEFNUF9HTDsKKyAgICAgICAgIGlzX2NsYW1wX3RvX2JvcmRlciA9IEdMX1RSVUU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgdC0+cHBfdHhmaWx0ZXIgfD0gUjIwMF9DTEFNUF9UX01JUlJPUjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9NSVJST1JfQ0xBTVBfRVhUOgorICAgICAgICAgdC0+cHBfdHhmaWx0ZXIgfD0gUjIwMF9DTEFNUF9UX01JUlJPUl9DTEFNUF9HTDsKKyAgICAgICAgIGlzX2NsYW1wID0gR0xfVFJVRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9FWFQ6CisgICAgICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfTUlSUk9SX0NMQU1QX0xBU1Q7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTUlSUk9SX0NMQU1QX1RPX0JPUkRFUl9FWFQ6CisgICAgICAgICB0LT5wcF90eGZpbHRlciB8PSBSMjAwX0NMQU1QX1RfTUlSUk9SX0NMQU1QX0dMOworICAgICAgICAgaXNfY2xhbXBfdG9fYm9yZGVyID0gR0xfVFJVRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCBUIHdyYXAgbW9kZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB9CiAgICB9CiAKICAgIHQtPnBwX3R4Zm9ybWF0X3ggJj0gflIyMDBfQ0xBTVBfUV9NQVNLOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleC5oCmluZGV4IGU2YzBlMDAuLjEwZmY4ZTggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF90ZXguaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4LmgKQEAgLTM1LDYgKzM1LDEwIEBACiAjaWZuZGVmIF9fUjIwMF9URVhfSF9fCiAjZGVmaW5lIF9fUjIwMF9URVhfSF9fCiAKK2V4dGVybiB2b2lkIHIyMDBTZXRUZXhPZmZzZXQoX19EUkljb250ZXh0ICpwRFJJQ3R4LCBHTGludCB0ZXhuYW1lLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwKKwkJCSAgICAgR0x1aW50IHBpdGNoKTsKKwogZXh0ZXJuIHZvaWQgcjIwMFVwZGF0ZVRleHR1cmVTdGF0ZSggR0xjb250ZXh0ICpjdHggKTsKIAogZXh0ZXJuIGludCByMjAwVXBsb2FkVGV4SW1hZ2VzKCByMjAwQ29udGV4dFB0ciBybWVzYSwgcjIwMFRleE9ialB0ciB0LCBHTHVpbnQgZmFjZSApOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleG1lbS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleG1lbS5jCmluZGV4IGQ5MjYzMTMuLjE4M2M0Y2EgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF90ZXhtZW0uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4bWVtLmMKQEAgLTE4MSw3ICsxODEsOCBAQAogICAgICAgLyogSW4gdGhpcyBjYXNlLCBjb3VsZCBhbHNvIHVzZSBHQVJUIHRleHR1cmluZy4gIFRoaXMgaXMKICAgICAgICAqIGN1cnJlbnRseSBkaXNhYmxlZCwgYnV0IGhhcyBiZWVuIHRlc3RlZCAmIHdvcmtzLgogICAgICAgICovCi0gICAgICB0LT5wcF90eG9mZnNldCA9IHIyMDBHYXJ0T2Zmc2V0RnJvbVZpcnR1YWwoIHJtZXNhLCB0ZXhJbWFnZS0+RGF0YSApOworICAgICAgaWYgKCAhdC0+aW1hZ2Vfb3ZlcnJpZGUgKQorICAgICAgICAgdC0+cHBfdHhvZmZzZXQgPSByMjAwR2FydE9mZnNldEZyb21WaXJ0dWFsKCBybWVzYSwgdGV4SW1hZ2UtPkRhdGEgKTsKICAgICAgIHQtPnBwX3R4cGl0Y2ggPSB0ZXhJbWFnZS0+Um93U3RyaWRlICogdGV4Rm9ybWF0LT5UZXhlbEJ5dGVzIC0gMzI7CiAKICAgICAgIGlmIChSMjAwX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKQEAgLTQ2Nyw3ICs0NjgsNyBAQAogCSAgICAgICB0LT5iYXNlLmZpcnN0TGV2ZWwsIHQtPmJhc2UubGFzdExldmVsICk7CiAgICB9CiAKLSAgIGlmICggIXQgfHwgdC0+YmFzZS50b3RhbFNpemUgPT0gMCApCisgICBpZiAoICF0IHx8IHQtPmJhc2UudG90YWxTaXplID09IDAgfHwgdC0+aW1hZ2Vfb3ZlcnJpZGUgKQogICAgICAgcmV0dXJuIDA7CiAKICAgIGlmIChSMjAwX0RFQlVHICYgREVCVUdfU1lOQykgewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3RleHN0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4c3RhdGUuYwppbmRleCBhZTAyZWM0Li40ZWRmMzA0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4c3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMjAwL3IyMDBfdGV4c3RhdGUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJtYWNyb3MuaCIKICNpbmNsdWRlICJ0ZXhmb3JtYXQuaCIKKyNpbmNsdWRlICJ0ZXhvYmouaCIKICNpbmNsdWRlICJlbnVtcy5oIgogCiAjaW5jbHVkZSAicjIwMF9jb250ZXh0LmgiCkBAIC03MCwxMiArNzEsMTMgQEAKICNkZWZpbmUgX0lOVkFMSUQoZikgXAogICAgIFsgTUVTQV9GT1JNQVRfICMjIGYgXSA9IHsgMHhmZmZmZmZmZiwgMCB9CiAjZGVmaW5lIFZBTElEX0ZPUk1BVChmKSAoICgoZikgPD0gTUVTQV9GT1JNQVRfUkdCQV9EWFQ1KSBcCi0JCQkgICAgICYmICh0eF90YWJsZV9sZVtmXS5mb3JtYXQgIT0gMHhmZmZmZmZmZikgKQorCQkJICAgICAmJiAodHhfdGFibGVfYmVbZl0uZm9ybWF0ICE9IDB4ZmZmZmZmZmYpICkKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB7CitzdHJ1Y3QgdHhfdGFibGUgewogICAgR0x1aW50IGZvcm1hdCwgZmlsdGVyOwotfQotdHhfdGFibGVfYmVbXSA9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4X3RhYmxlIHR4X3RhYmxlX2JlW10gPQogewogICAgWyBNRVNBX0ZPUk1BVF9SR0JBODg4OCBdID0geyBSMjAwX1RYRk9STUFUX0FCR1I4ODg4IHwgUjIwMF9UWEZPUk1BVF9BTFBIQV9JTl9NQVAsIDAgfSwKICAgIF9BTFBIQV9SRVYoUkdCQTg4ODgpLApAQCAtMTA0LDE2ICsxMDYsMTMgQEAKICAgIF9BTFBIQShSR0JBX0RYVDUpLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICBHTHVpbnQgZm9ybWF0LCBmaWx0ZXI7Ci19Ci10eF90YWJsZV9sZVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhfdGFibGUgdHhfdGFibGVfbGVbXSA9CiB7CiAgICBfQUxQSEEoUkdCQTg4ODgpLAogICAgWyBNRVNBX0ZPUk1BVF9SR0JBODg4OF9SRVYgXSA9IHsgUjIwMF9UWEZPUk1BVF9BQkdSODg4OCB8IFIyMDBfVFhGT1JNQVRfQUxQSEFfSU5fTUFQLCAwIH0sCiAgICBfQUxQSEEoQVJHQjg4ODgpLAogICAgX0FMUEhBX1JFVihBUkdCODg4OCksCi0gICBfSU5WQUxJRChSR0I4ODgpLAorICAgWyBNRVNBX0ZPUk1BVF9SR0I4ODggXSA9IHsgUjIwMF9UWEZPUk1BVF9BUkdCODg4OCwgMCB9LAogICAgX0NPTE9SKFJHQjU2NSksCiAgICBfQ09MT1JfUkVWKFJHQjU2NSksCiAgICBfQUxQSEEoQVJHQjQ0NDQpLApAQCAtMTYwLDMwICsxNTksMjYgQEAKICAgIEdMaW50IGksIHRleGVsQnl0ZXM7CiAgICBHTGludCBudW1MZXZlbHM7CiAgICBHTGludCBsb2cyV2lkdGgsIGxvZzJIZWlnaHQsIGxvZzJEZXB0aDsKLSAgIGNvbnN0IEdMdWludCB1aSA9IDE7Ci0gICBjb25zdCBHTHVieXRlIGxpdHRsZUVuZGlhbiA9ICooKGNvbnN0IEdMdWJ5dGUgKikgJnVpKTsKIAogICAgLyogU2V0IHRoZSBoYXJkd2FyZSB0ZXh0dXJlIGZvcm1hdAogICAgICovCisgICBpZiAoICF0LT5pbWFnZV9vdmVycmlkZSApIHsKKyAgICAgIGlmICggVkFMSURfRk9STUFUKCBiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCApICkgeworCSBjb25zdCBzdHJ1Y3QgdHhfdGFibGUgKnRhYmxlID0gX21lc2FfbGl0dGxlX2VuZGlhbigpID8gdHhfdGFibGVfbGUgOgorCQkJCQkJCQl0eF90YWJsZV9iZTsKIAotICAgdC0+cHBfdHhmb3JtYXQgJj0gfihSMjAwX1RYRk9STUFUX0ZPUk1BVF9NQVNLIHwKLQkJICAgICAgIFIyMDBfVFhGT1JNQVRfQUxQSEFfSU5fTUFQKTsKLSAgIHQtPnBwX3R4ZmlsdGVyICY9IH5SMjAwX1lVVl9UT19SR0I7CisgICAgICAgICB0LT5wcF90eGZvcm1hdCAmPSB+KFIyMDBfVFhGT1JNQVRfRk9STUFUX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSMjAwX1RYRk9STUFUX0FMUEhBX0lOX01BUCk7CisgICAgICAgICB0LT5wcF90eGZpbHRlciAmPSB+UjIwMF9ZVVZfVE9fUkdCOwogCi0gICBpZiAoIFZBTElEX0ZPUk1BVCggYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgKSApIHsKLSAgICAgIGlmIChsaXR0bGVFbmRpYW4pIHsKLQkgdC0+cHBfdHhmb3JtYXQgfD0gdHhfdGFibGVfbGVbIGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0IF0uZm9ybWF0OwotCSB0LT5wcF90eGZpbHRlciB8PSB0eF90YWJsZV9sZVsgYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgXS5maWx0ZXI7CisJIHQtPnBwX3R4Zm9ybWF0IHw9IHRhYmxlWyBiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCBdLmZvcm1hdDsKKwkgdC0+cHBfdHhmaWx0ZXIgfD0gdGFibGVbIGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0IF0uZmlsdGVyOwogICAgICAgfQogICAgICAgZWxzZSB7Ci0JIHQtPnBwX3R4Zm9ybWF0IHw9IHR4X3RhYmxlX2JlWyBiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCBdLmZvcm1hdDsKLQkgdC0+cHBfdHhmaWx0ZXIgfD0gdHhfdGFibGVfYmVbIGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0IF0uZmlsdGVyOworICAgICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAidW5leHBlY3RlZCB0ZXh0dXJlIGZvcm1hdCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICB9Ci0gICBlbHNlIHsKLSAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgInVuZXhwZWN0ZWQgdGV4dHVyZSBmb3JtYXQgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuOwotICAgfQogCiAgICB0ZXhlbEJ5dGVzID0gYmFzZUltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXM7CiAKQEAgLTM4MCwxMSArMzc1LDEzIEBACiAgICAgKiByZXF1aXJlcyA2NC1ieXRlIGFsaWduZWQgcGl0Y2hlcywgYW5kIHdlIG1heS9tYXkgbm90IG5lZWQgdGhlCiAgICAgKiBibGl0dGVyLiAgIE5QT1Qgb25seSEKICAgICAqLwotICAgaWYgKGJhc2VJbWFnZS0+SXNDb21wcmVzc2VkKQotICAgICAgdC0+cHBfdHhwaXRjaCA9ICh0T2JqLT5JbWFnZVswXVt0LT5iYXNlLmZpcnN0TGV2ZWxdLT5XaWR0aCArIDYzKSAmIH4oNjMpOwotICAgZWxzZQotICAgICAgdC0+cHBfdHhwaXRjaCA9ICgodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggKiB0ZXhlbEJ5dGVzKSArIDYzKSAmIH4oNjMpOwotICAgdC0+cHBfdHhwaXRjaCAtPSAzMjsKKyAgIGlmICggIXQtPmltYWdlX292ZXJyaWRlICkgeworICAgICAgaWYgKGJhc2VJbWFnZS0+SXNDb21wcmVzc2VkKQorICAgICAgICAgdC0+cHBfdHhwaXRjaCA9ICh0T2JqLT5JbWFnZVswXVt0LT5iYXNlLmZpcnN0TGV2ZWxdLT5XaWR0aCArIDYzKSAmIH4oNjMpOworICAgICAgZWxzZQorICAgICAgICAgdC0+cHBfdHhwaXRjaCA9ICgodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggKiB0ZXhlbEJ5dGVzKSArIDYzKSAmIH4oNjMpOworICAgICAgdC0+cHBfdHhwaXRjaCAtPSAzMjsKKyAgIH0KIAogICAgdC0+ZGlydHlfc3RhdGUgPSBURVhfQUxMOwogCkBAIC05NzksNiArOTc2LDQ0IEBACiAgICByZXR1cm4gR0xfVFJVRTsKIH0KIAordm9pZCByMjAwU2V0VGV4T2Zmc2V0KF9fRFJJY29udGV4dCAqIHBEUklDdHgsIEdMaW50IHRleG5hbWUsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIEdMaW50IGRlcHRoLCBHTHVpbnQgcGl0Y2gpCit7CisJcjIwMENvbnRleHRQdHIgcm1lc2EgPSBwRFJJQ3R4LT5kcml2ZXJQcml2YXRlOworCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9CisJICAgIF9tZXNhX2xvb2t1cF90ZXh0dXJlKHJtZXNhLT5nbEN0eCwgdGV4bmFtZSk7CisJcjIwMFRleE9ialB0ciB0OworCisJaWYgKCF0T2JqKQorCQlyZXR1cm47CisKKwl0ID0gKHIyMDBUZXhPYmpQdHIpIHRPYmotPkRyaXZlckRhdGE7CisKKwl0LT5pbWFnZV9vdmVycmlkZSA9IEdMX1RSVUU7CisKKwlpZiAoIW9mZnNldCkKKwkJcmV0dXJuOworCisJdC0+cHBfdHhvZmZzZXQgPSBvZmZzZXQ7CisJdC0+cHBfdHhwaXRjaCA9IHBpdGNoIC0gMzI7CisKKwlzd2l0Y2ggKGRlcHRoKSB7CisJY2FzZSAzMjoKKwkJdC0+cHBfdHhmb3JtYXQgPSB0eF90YWJsZV9sZVtNRVNBX0ZPUk1BVF9BUkdCODg4OF0uZm9ybWF0OworCQl0LT5wcF90eGZpbHRlciB8PSB0eF90YWJsZV9sZVtNRVNBX0ZPUk1BVF9BUkdCODg4OF0uZmlsdGVyOworCQlicmVhazsKKwljYXNlIDI0OgorCWRlZmF1bHQ6CisJCXQtPnBwX3R4Zm9ybWF0ID0gdHhfdGFibGVfbGVbTUVTQV9GT1JNQVRfUkdCODg4XS5mb3JtYXQ7CisJCXQtPnBwX3R4ZmlsdGVyIHw9IHR4X3RhYmxlX2xlW01FU0FfRk9STUFUX1JHQjg4OF0uZmlsdGVyOworCQlicmVhazsKKwljYXNlIDE2OgorCQl0LT5wcF90eGZvcm1hdCA9IHR4X3RhYmxlX2xlW01FU0FfRk9STUFUX1JHQjU2NV0uZm9ybWF0OworCQl0LT5wcF90eGZpbHRlciB8PSB0eF90YWJsZV9sZVtNRVNBX0ZPUk1BVF9SR0I1NjVdLmZpbHRlcjsKKwkJYnJlYWs7CisJfQorfQorCiAjZGVmaW5lIFJFRl9DT0xPUiAxCiAjZGVmaW5lIFJFRl9BTFBIQSAyCiAKQEAgLTE1NjAsNyArMTU5NSw3IEBACiAgICAgICBSMjAwX0ZJUkVWRVJUSUNFUyggcm1lc2EgKTsKICAgICAgIHIyMDBTZXRUZXhJbWFnZXMoIHJtZXNhLCB0T2JqICk7CiAgICAgICByMjAwVXBsb2FkVGV4SW1hZ2VzKCBybWVzYSwgKHIyMDBUZXhPYmpQdHIpIHRPYmotPkRyaXZlckRhdGEsIDAgKTsKLSAgICAgIGlmICggIXQtPmJhc2UubWVtQmxvY2sgKSAKKyAgICAgIGlmICggIXQtPmJhc2UubWVtQmxvY2sgJiYgIXQtPmltYWdlX292ZXJyaWRlICkgCiAJIHJldHVybiBHTF9GQUxTRTsKICAgIH0KIApAQCAtMTY2OCw3ICsxNzAzLDkgQEAKICAgICAgIFIyMDBfRklSRVZFUlRJQ0VTKCBybWVzYSApOwogICAgICAgcjIwMFNldFRleEltYWdlcyggcm1lc2EsIHRPYmogKTsKICAgICAgIHIyMDBVcGxvYWRUZXhJbWFnZXMoIHJtZXNhLCAocjIwMFRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YSwgMCApOwotICAgICAgaWYgKCAhdC0+YmFzZS5tZW1CbG9jayAmJiAhcm1lc2EtPnByZWZlcl9nYXJ0X2NsaWVudF90ZXh0dXJpbmcgKSAKKyAgICAgIGlmICggIXQtPmJhc2UubWVtQmxvY2sgJiYKKyAgICAgICAgICAgIXQtPmltYWdlX292ZXJyaWRlICYmCisgICAgICAgICAgICFybWVzYS0+cHJlZmVyX2dhcnRfY2xpZW50X3RleHR1cmluZyApIAogCSByZXR1cm4gR0xfRkFMU0U7CiAgICB9CiAKQEAgLTE3NzgsNiArMTgxNSwxMiBAQAogICAgR0xib29sZWFuIG9rOwogICAgR0x1aW50IGRiZzsKIAorICAgLyogTk9URTogbXVzdCBub3QgbWFuaXB1bGF0ZSBybWVzYS0+c3RhdGUudGV4dHVyZS51bml0W10udW5pdG5lZWRlZCBvcgorICAgICAgcm1lc2EtPnN0YXRlLmVudm5lZWRlZCBiZWZvcmUgYSBSMjAwX1NUQVRFQ0hBTkdFIChvciBSMjAwX05FV1BSSU0pIHNpbmNlCisgICAgICB3ZSB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGlmIHdlIHdhbnQgdG8gZW1pdCB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZQorICAgICAgYXRvbXMuICovCisgICBSMjAwX05FV1BSSU0oIHJtZXNhICk7CisKICAgIGlmIChjdHgtPkFUSUZyYWdtZW50U2hhZGVyLl9FbmFibGVkKSB7CiAgICAgICBHTHVpbnQgaTsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBSMjAwX01BWF9URVhUVVJFX1VOSVRTOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IyMDAvcjIwMF92ZXJ0cHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3ZlcnRwcm9nLmMKaW5kZXggNjA4OWQ2MS4uNTYyOTkyZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3ZlcnRwcm9nLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjIwMC9yMjAwX3ZlcnRwcm9nLmMKQEAgLTMwLDEwICszMCwxMCBAQAogICogICBBYXBvIFRhaGtvbGEgPGFldEByYXN0ZXJidXJuLm9yZz4KICAqICAgUm9sYW5kIFNjaGVpZGVnZ2VyIDxyc2NoZWlkZWdnZXJfbGlzdHNAaGlzcGVlZC5jaD4KICAqLwotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAiZW51bXMuaCIKLSNpbmNsdWRlICJwcm9ncmFtLmgiCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAibWFpbi9lbnVtcy5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCiAjaW5jbHVkZSAic2hhZGVyL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKICNpbmNsdWRlICJzaGFkZXIvcHJvZ19wYXJhbWV0ZXIuaCIKICNpbmNsdWRlICJzaGFkZXIvcHJvZ19zdGF0ZXZhcnMuaCIKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBsb25nIHRfZHN0X21hc2soR0x1aW50IG1hc2spCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgdF9kc3RfbWFzayhHTHVpbnQgbWFzaykKIHsKICAgIC8qIFdSSVRFTUFTS18qIGlzIGVxdWl2YWxlbnQgdG8gVlNGX0ZMQUdfKiAqLwogICAgcmV0dXJuIG1hc2sgJiBWU0ZfRkxBR19BTEw7CkBAIC0yMTUsNiArMjE1LDcgQEAKICAgIGNhc2UgUFJPR1JBTV9MT0NBTF9QQVJBTToKICAgIGNhc2UgUFJPR1JBTV9FTlZfUEFSQU06CiAgICBjYXNlIFBST0dSQU1fTkFNRURfUEFSQU06CisgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6CiAgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgogICAgICAgcmV0dXJuIFZTRl9JTl9DTEFTU19QQVJBTTsKICAgIC8qCkBAIC0yMjgsNyArMjI5LDcgQEAKICAgIH0KIH0KIAotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgdF9zd2l6emxlKEdMdWJ5dGUgc3dpenpsZSkKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyB0X3N3aXp6bGUoR0x1Ynl0ZSBzd2l6emxlKQogewogLyogdGhpcyBpcyBpbiBmYWN0IGEgTk9QIGFzIHRoZSBNZXNhIFNXSVpaTEVfKiBhcmUgYWxsIGlkZW50aWNhbCB0byBWU0ZfSU5fQ09NUE9ORU5UXyogKi8KICAgIHJldHVybiBzd2l6emxlOwpAQCAtNDA4LDYgKzQwOSw3IEBACiAgICBpbnQgZm9nX3RlbXBfaSA9IDA7CiAgICBpbnQgZnJlZV9pbnB1dHM7CiAgICBpbnQgYXJyYXlfY291bnQgPSAwOworICAgaW50IHVfdGVtcF91c2VkOwogCiAgICB2cC0+bmF0aXZlID0gR0xfRkFMU0U7CiAgICB2cC0+dHJhbnNsYXRlZCA9IEdMX1RSVUU7CkBAIC03NDQsOSArNzQ2LDE2IEBACiAJIGdvdG8gbmV4dDsKIAogICAgICAgY2FzZSBPUENPREVfTUFEOgorCSAvKiBvbmx5IDIgcmVhZCBwb3J0cyBpbnRvIHRlbXAgbWVtb3J5IHRodXMgbWF5IG5lZWQgdGhlIG1hY3JvIG9wIE1BRF8yCisJICAgIGluc3RlYWQgKHJlcXVpcmluZyAyIGNsb2NrcykgaWYgYWxsIGlucHV0cyBhcmUgaW4gdGVtcCBtZW1vcnkKKwkgICAgKGFuZCwgb25seSBpZiB0aGV5IGFjdHVhbGx5IHJlZmVyZW5jZSAzIGRpc3RpbmN0IHRlbXBzKSAqLwogCSBod19vcD0oc3JjWzBdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKIAkgICAgc3JjWzFdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKLQkgICAgc3JjWzJdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpID8gUjIwMF9WUElfT1VUX09QX01BRF8yIDogUjIwMF9WUElfT1VUX09QX01BRDsKKwkgICAgc3JjWzJdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKKwkgICAgKCgoc3JjWzBdLlJlbEFkZHIgPDwgOCkgfCBzcmNbMF0uSW5kZXgpICE9ICgoc3JjWzFdLlJlbEFkZHIgPDwgOCkgfCBzcmNbMV0uSW5kZXgpKSAmJgorCSAgICAoKChzcmNbMF0uUmVsQWRkciA8PCA4KSB8IHNyY1swXS5JbmRleCkgIT0gKChzcmNbMl0uUmVsQWRkciA8PCA4KSB8IHNyY1syXS5JbmRleCkpICYmCisJICAgICgoKHNyY1sxXS5SZWxBZGRyIDw8IDgpIHwgc3JjWzFdLkluZGV4KSAhPSAoKHNyY1syXS5SZWxBZGRyIDw8IDgpIHwgc3JjWzJdLkluZGV4KSkpID8KKwkgICAgUjIwMF9WUElfT1VUX09QX01BRF8yIDogUjIwMF9WUElfT1VUX09QX01BRDsKIAogCSBvX2luc3QtPm9wID0gTUFLRV9WU0ZfT1AoaHdfb3AsIHRfZHN0KCZkc3QpLAogCSAgICB0X2RzdF9tYXNrKGRzdC5Xcml0ZU1hc2spKTsKQEAgLTg3NCw4ICs4ODMsMTEgQEAKICAgICAgIGNhc2UgT1BDT0RFX1hQRDoKIAkgLyogbXVsIHIwLCByMS55enh3LCByMi56eHl3CiAJICAgIG1hZCByMCwgLXIyLnl6eHcsIHIxLnp4eXcsIHIwCi0JICAgIE5PVEU6IG1pZ2h0IG5lZWQgTUFEXzIKIAkgICovCisJIGh3X29wPShzcmNbMF0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJgorCSAgICBzcmNbMV0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJgorCSAgICAoKChzcmNbMF0uUmVsQWRkciA8PCA4KSB8IHNyY1swXS5JbmRleCkgIT0gKChzcmNbMV0uUmVsQWRkciA8PCA4KSB8IHNyY1sxXS5JbmRleCkpKSA/CisJICAgIFIyMDBfVlBJX09VVF9PUF9NQURfMiA6IFIyMDBfVlBJX09VVF9PUF9NQUQ7CiAKIAkgb19pbnN0LT5vcCA9IE1BS0VfVlNGX09QKFIyMDBfVlBJX09VVF9PUF9NVUwsCiAJICAgICh1X3RlbXBfaSA8PCBSMjAwX1ZQSV9PVVRfUkVHX0lOREVYX1NISUZUKSB8IFIyMDBfVlNGX09VVF9DTEFTU19UTVAsCkBAIC05MDEsNyArOTEzLDcgQEAKIAkgb19pbnN0Kys7CiAJIHVfdGVtcF9pLS07CiAKLQkgb19pbnN0LT5vcCA9IE1BS0VfVlNGX09QKFIyMDBfVlBJX09VVF9PUF9NQUQsIHRfZHN0KCZkc3QpLAorCSBvX2luc3QtPm9wID0gTUFLRV9WU0ZfT1AoaHdfb3AsIHRfZHN0KCZkc3QpLAogCQl0X2RzdF9tYXNrKGRzdC5Xcml0ZU1hc2spKTsKIAogCSBvX2luc3QtPnNyYzAgPSBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMV0pLApAQCAtMTA1MSwxNCArMTA2MywxNSBAQAogICAgICAgICAgZG9mb2dmaXggPSAwOwogICAgICAgfQogCisgICAgICB1X3RlbXBfdXNlZCA9IChSMjAwX1ZTRl9NQVhfVEVNUFMgLSAxKSAtIHVfdGVtcF9pOwogICAgICAgaWYgKG1lc2FfdnAtPkJhc2UuTnVtTmF0aXZlVGVtcG9yYXJpZXMgPAotCSAobWVzYV92cC0+QmFzZS5OdW1UZW1wb3JhcmllcyArIChSMjAwX1ZTRl9NQVhfVEVNUFMgLSAxIC0gdV90ZW1wX2kpKSkgeworCSAobWVzYV92cC0+QmFzZS5OdW1UZW1wb3JhcmllcyArIHVfdGVtcF91c2VkKSkgewogCSBtZXNhX3ZwLT5CYXNlLk51bU5hdGl2ZVRlbXBvcmFyaWVzID0KLQkgICAgbWVzYV92cC0+QmFzZS5OdW1UZW1wb3JhcmllcyArIChSMjAwX1ZTRl9NQVhfVEVNUFMgLSAxIC0gdV90ZW1wX2kpOworCSAgICBtZXNhX3ZwLT5CYXNlLk51bVRlbXBvcmFyaWVzICsgdV90ZW1wX3VzZWQ7CiAgICAgICB9Ci0gICAgICBpZiAodV90ZW1wX2kgPCBtZXNhX3ZwLT5CYXNlLk51bVRlbXBvcmFyaWVzKSB7CisgICAgICBpZiAoKG1lc2FfdnAtPkJhc2UuTnVtVGVtcG9yYXJpZXMgKyB1X3RlbXBfdXNlZCkgPiBSMjAwX1ZTRl9NQVhfVEVNUFMpIHsKIAkgaWYgKFIyMDBfREVCVUcgJiBERUJVR19GQUxMQkFDS1MpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJSYW4gb3V0IG9mIHRlbXBzLCBudW0gdGVtcHMgJWQsIHVzICVkXG4iLCBtZXNhX3ZwLT5CYXNlLk51bVRlbXBvcmFyaWVzLCB1X3RlbXBfaSk7CisJICAgIGZwcmludGYoc3RkZXJyLCAiUmFuIG91dCBvZiB0ZW1wcywgbnVtIHRlbXBzICVkLCB1cyAlZFxuIiwgbWVzYV92cC0+QmFzZS5OdW1UZW1wb3JhcmllcywgdV90ZW1wX3VzZWQpOwogCSB9CiAJIHJldHVybiBHTF9GQUxTRTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL01ha2VmaWxlCmluZGV4IDQ0MjQ4OTYuLjZjYTkzNDIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvTWFrZWZpbGUKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9NYWtlZmlsZQpAQCAtMjgsNyArMjgsNiBAQAogCQkgcmFkZW9uX3NwYW4uYyBcCiAJCSByYWRlb25fc3RhdGUuYyBcCiAJCSByMzAwX21lbS5jIFwKLQkJIFwKIAkJIHIzMDBfY29udGV4dC5jIFwKIAkJIHIzMDBfaW9jdGwuYyBcCiAJCSByMzAwX2NtZGJ1Zi5jIFwKQEAgLTM3LDggKzM2LDE2IEBACiAJCSByMzAwX3RleG1lbS5jIFwKIAkJIHIzMDBfdGV4LmMgXAogCQkgcjMwMF90ZXhzdGF0ZS5jIFwKKwkJIHJhZGVvbl9wcm9ncmFtLmMgXAorCQkgcmFkZW9uX3Byb2dyYW1fYWx1LmMgXAorCQkgcmFkZW9uX3Byb2dyYW1fcGFpci5jIFwKKwkJIHJhZGVvbl9ucXNzYWRjZS5jIFwKIAkJIHIzMDBfdmVydHByb2cuYyBcCiAJCSByMzAwX2ZyYWdwcm9nLmMgXAorCQkgcjMwMF9mcmFncHJvZ19zd2l6emxlLmMgXAorCQkgcjMwMF9mcmFncHJvZ19lbWl0LmMgXAorCQkgcjUwMF9mcmFncHJvZy5jIFwKKwkJIHI1MDBfZnJhZ3Byb2dfZW1pdC5jIFwKIAkJIHIzMDBfc2hhZGVyLmMgXAogCQkgcjMwMF9lbWl0LmMgXAogCQkgcjMwMF9zd3RjbC5jIFwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jbWRidWYuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jbWRidWYuYwppbmRleCA5ZWNhNDFmLi5jMDY5NjYwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfY21kYnVmLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2NtZGJ1Zi5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGVuc3VyZWQgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGNvbW1hbmQKICAqIGJ1ZmZlci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHIzMDBFbWl0QXRvbXMocjMwMENvbnRleHRQdHIgcjMwMCwgR0xib29sZWFuIGRpcnR5KQorc3RhdGljIElOTElORSB2b2lkIHIzMDBFbWl0QXRvbXMocjMwMENvbnRleHRQdHIgcjMwMCwgR0xib29sZWFuIGRpcnR5KQogewogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gKmF0b207CiAJdWludDMyX3QgKmRlc3Q7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAlyMzAwLT5jbWRidWYuY291bnRfdXNlZCsrOwogCiAJLyogRW1pdCBjYWNoZSBmbHVzaCAqLwotCSpkZXN0ID0gY21kcGFja2V0MChSMzAwX1RYX0NOVEwsIDEpOworCSpkZXN0ID0gY21kcGFja2V0MChSMzAwX1RYX0lOVkFMVEFHUywgMSk7CiAJZGVzdCsrOwogCXIzMDAtPmNtZGJ1Zi5jb3VudF91c2VkKys7CiAKQEAgLTI0Miw2ICsyNDIsNyBAQAogCiAjZGVmaW5lIHBhY2tldDBfY291bnQocHRyKSAoKChkcm1fcjMwMF9jbWRfaGVhZGVyX3QqKShwdHIpKS0+cGFja2V0MC5jb3VudCkKICNkZWZpbmUgdnB1X2NvdW50KHB0cikgKCgoZHJtX3IzMDBfY21kX2hlYWRlcl90KikocHRyKSktPnZwdS5jb3VudCkKKyNkZWZpbmUgcjUwMGZwX2NvdW50KHB0cikgKCgoZHJtX3IzMDBfY21kX2hlYWRlcl90KikocHRyKSktPnI1MDBmcC5jb3VudCkKIAogc3RhdGljIGludCBjaGVja19hbHdheXMocjMwMENvbnRleHRQdHIgcjMwMCwgc3RydWN0IHIzMDBfc3RhdGVfYXRvbSAqYXRvbSkKIHsKQEAgLTI2Miw2ICsyNjMsMjAgQEAKIAlyZXR1cm4gY250ID8gKGNudCAqIDQpICsgMSA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgY2hlY2tfcjUwMGZwKHIzMDBDb250ZXh0UHRyIHIzMDAsIHN0cnVjdCByMzAwX3N0YXRlX2F0b20gKmF0b20pCit7CisJaW50IGNudDsKKwljbnQgPSByNTAwZnBfY291bnQoYXRvbS0+Y21kKTsKKwlyZXR1cm4gY250ID8gKGNudCAqIDYpICsgMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcjUwMGZwX2NvbnN0KHIzMDBDb250ZXh0UHRyIHIzMDAsIHN0cnVjdCByMzAwX3N0YXRlX2F0b20gKmF0b20pCit7CisJaW50IGNudDsKKwljbnQgPSByNTAwZnBfY291bnQoYXRvbS0+Y21kKTsKKwlyZXR1cm4gY250ID8gKGNudCAqIDQpICsgMSA6IDA7Cit9CisKICNkZWZpbmUgQUxMT0NfU1RBVEUoIEFUT00sIENISywgU1osIElEWCApCQkJCVwKICAgIGRvIHsJCQkJCQkJCQlcCiAgICAgICByMzAwLT5ody5BVE9NLmNtZF9zaXplID0gKFNaKTsJCQkJCVwKQEAgLTI4MSwxMCArMjk2LDE1IEBACiB7CiAJaW50IHNpemUsIG10dTsKIAlpbnQgaGFzX3RjbCA9IDE7CisJaW50IGlzX3I1MDAgPSAwOworCWludCBpOwogCiAJaWYgKCEocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mbGFncyAmIFJBREVPTl9DSElQU0VUX1RDTCkpCiAJCWhhc190Y2wgPSAwOwogCisJaWYgKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID49IENISVBfRkFNSUxZX1JWNTE1KQorCQlpc19yNTAwID0gMTsKKwogCXIzMDAtPmh3Lm1heF9zdGF0ZV9zaXplID0gMiArIDI7CS8qIHJlc2VydmUgZXh0cmEgc3BhY2UgZm9yIFdBSVRfSURMRSBhbmQgdGV4IGNhY2hlIGZsdXNoICovCiAKIAltdHUgPSByMzAwLT5yYWRlb24uZ2xDdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0czsKQEAgLTI5OSwzMiArMzE5LDM5IEBACiAJLyogSW5pdGlhbGl6ZSBzdGF0ZSBhdG9tcyAqLwogCUFMTE9DX1NUQVRFKHZwdCwgYWx3YXlzLCBSMzAwX1ZQVF9DTURTSVpFLCAwKTsKIAlyMzAwLT5ody52cHQuY21kW1IzMDBfVlBUX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9TRV9WUE9SVF9YU0NBTEUsIDYpOwotCUFMTE9DX1NUQVRFKHZhcF9jbnRsLCBhbHdheXMsIDIsIDApOwotCXIzMDAtPmh3LnZhcF9jbnRsLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9WQVBfQ05UTCwgMSk7CisJQUxMT0NfU1RBVEUodmFwX2NudGwsIGFsd2F5cywgUjMwMF9WQVBfQ05UTF9TSVpFLCAwKTsKKwlyMzAwLT5ody52YXBfY250bC5jbWRbUjMwMF9WQVBfQ05UTF9GTFVTSF0gPSBjbWRwYWNrZXQwKFIzMDBfVkFQX1BWU19TVEFURV9GTFVTSF9SRUcsIDEpOworCXIzMDAtPmh3LnZhcF9jbnRsLmNtZFtSMzAwX1ZBUF9DTlRMX0ZMVVNIXzFdID0gMDsKKwlyMzAwLT5ody52YXBfY250bC5jbWRbUjMwMF9WQVBfQ05UTF9DTURdID0gY21kcGFja2V0MChSMzAwX1ZBUF9DTlRMLCAxKTsKKwlpZiAoaXNfcjUwMCkgeworCSAgICBBTExPQ19TVEFURSh2YXBfaW5kZXhfb2Zmc2V0LCBhbHdheXMsIDIsIDApOworCSAgICByMzAwLT5ody52YXBfaW5kZXhfb2Zmc2V0LmNtZFswXSA9IGNtZHBhY2tldDAoUjUwMF9WQVBfSU5ERVhfT0ZGU0VULCAxKTsKKwkgICAgcjMwMC0+aHcudmFwX2luZGV4X29mZnNldC5jbWRbMV0gPSAwOworCX0KIAlBTExPQ19TVEFURSh2dGUsIGFsd2F5cywgMywgMCk7CiAJcjMwMC0+aHcudnRlLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9TRV9WVEVfQ05UTCwgMik7Ci0JQUxMT0NfU1RBVEUodW5rMjEzNCwgYWx3YXlzLCAzLCAwKTsKLQlyMzAwLT5ody51bmsyMTM0LmNtZFswXSA9IGNtZHBhY2tldDAoMHgyMTM0LCAyKTsKKwlBTExPQ19TVEFURSh2YXBfdmZfbWF4X3Z0eF9pbmR4LCBhbHdheXMsIDMsIDApOworCXIzMDAtPmh3LnZhcF92Zl9tYXhfdnR4X2luZHguY21kWzBdID0gY21kcGFja2V0MChSMzAwX1ZBUF9WRl9NQVhfVlRYX0lORFgsIDIpOwogCUFMTE9DX1NUQVRFKHZhcF9jbnRsX3N0YXR1cywgYWx3YXlzLCAyLCAwKTsKIAlyMzAwLT5ody52YXBfY250bF9zdGF0dXMuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1ZBUF9DTlRMX1NUQVRVUywgMSk7CiAJQUxMT0NfU1RBVEUodmlyWzBdLCB2YXJpYWJsZSwgUjMwMF9WSVJfQ01EU0laRSwgMCk7CiAJcjMwMC0+aHcudmlyWzBdLmNtZFtSMzAwX1ZJUl9DTURfMF0gPQotCSAgICBjbWRwYWNrZXQwKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCwgMSk7CisJICAgIGNtZHBhY2tldDAoUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF8wLCAxKTsKIAlBTExPQ19TVEFURSh2aXJbMV0sIHZhcmlhYmxlLCBSMzAwX1ZJUl9DTURTSVpFLCAxKTsKIAlyMzAwLT5ody52aXJbMV0uY21kW1IzMDBfVklSX0NNRF8wXSA9Ci0JICAgIGNtZHBhY2tldDAoUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wLCAxKTsKKwkgICAgY21kcGFja2V0MChSMzAwX1ZBUF9QUk9HX1NUUkVBTV9DTlRMX0VYVF8wLCAxKTsKIAlBTExPQ19TVEFURSh2aWMsIGFsd2F5cywgUjMwMF9WSUNfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcudmljLmNtZFtSMzAwX1ZJQ19DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVkFQX0lOUFVUX0NOVExfMCwgMik7Ci0JQUxMT0NfU1RBVEUodW5rMjFEQywgYWx3YXlzLCAyLCAwKTsKLQlyMzAwLT5ody51bmsyMURDLmNtZFswXSA9IGNtZHBhY2tldDAoMHgyMURDLCAxKTsKLQlBTExPQ19TVEFURSh1bmsyMjFDLCBhbHdheXMsIDIsIDApOwotCXIzMDAtPmh3LnVuazIyMUMuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1ZBUF9VTktOT1dOXzIyMUMsIDEpOwotCUFMTE9DX1NUQVRFKHZhcF9jbGlwLCBhbHdheXMsIDUsIDApOwotCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9WQVBfQ0xJUF9YXzAsIDQpOworCXIzMDAtPmh3LnZpYy5jbWRbUjMwMF9WSUNfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1ZBUF9WVFhfU1RBVEVfQ05UTCwgMik7CisJQUxMT0NfU1RBVEUodmFwX3BzY19zZ25fbm9ybV9jbnRsLCBhbHdheXMsIDIsIDApOworCXIzMDAtPmh3LnZhcF9wc2Nfc2duX25vcm1fY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfVkFQX1BTQ19TR05fTk9STV9DTlRMLCBTR05fTk9STV9aRVJPX0NMQU1QX01JTlVTX09ORSk7CiAKIAlpZiAoaGFzX3RjbCkgewotCQlBTExPQ19TVEFURSh1bmsyMjg4LCBhbHdheXMsIDIsIDApOwotCQlyMzAwLT5ody51bmsyMjg4LmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9WQVBfVU5LTk9XTl8yMjg4LCAxKTsKKwkJQUxMT0NfU1RBVEUodmFwX2NsaXBfY250bCwgYWx3YXlzLCAyLCAwKTsKKwkJcjMwMC0+aHcudmFwX2NsaXBfY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfVkFQX0NMSVBfQ05UTCwgMSk7CisJCUFMTE9DX1NUQVRFKHZhcF9jbGlwLCBhbHdheXMsIDUsIDApOworCQlyMzAwLT5ody52YXBfY2xpcC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfVkFQX0dCX1ZFUlRfQ0xJUF9BREosIDQpOworCQlBTExPQ19TVEFURSh2YXBfcHZzX3Z0eF90aW1lb3V0X3JlZywgYWx3YXlzLCAyLCAwKTsKKwkJcjMwMC0+aHcudmFwX3B2c192dHhfdGltZW91dF9yZWcuY21kWzBdID0gY21kcGFja2V0MChWQVBfUFZTX1ZUWF9USU1FT1VUX1JFRywgMSk7CiAJfQogCiAJQUxMT0NfU1RBVEUodm9mLCBhbHdheXMsIFIzMDBfVk9GX0NNRFNJWkUsIDApOwpAQCAtMzM0LDcgKzM2MSw3IEBACiAJaWYgKGhhc190Y2wpIHsKIAkJQUxMT0NfU1RBVEUocHZzLCBhbHdheXMsIFIzMDBfUFZTX0NNRFNJWkUsIDApOwogCQlyMzAwLT5ody5wdnMuY21kW1IzMDBfUFZTX0NNRF8wXSA9Ci0JCSAgICBjbWRwYWNrZXQwKFIzMDBfVkFQX1BWU19DTlRMXzEsIDMpOworCQkgICAgY21kcGFja2V0MChSMzAwX1ZBUF9QVlNfQ09ERV9DTlRMXzAsIDMpOwogCX0KIAogCUFMTE9DX1NUQVRFKGdiX2VuYWJsZSwgYWx3YXlzLCAyLCAwKTsKQEAgLTM0MywxMjEgKzM3MCwxODMgQEAKIAlyMzAwLT5ody5nYl9taXNjLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQl9NU1BPUzAsIDUpOwogCUFMTE9DX1NUQVRFKHR4ZSwgYWx3YXlzLCBSMzAwX1RYRV9DTURTSVpFLCAwKTsKIAlyMzAwLT5ody50eGUuY21kW1IzMDBfVFhFX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9UWF9FTkFCTEUsIDEpOwotCUFMTE9DX1NUQVRFKHVuazQyMDAsIGFsd2F5cywgNSwgMCk7Ci0JcjMwMC0+aHcudW5rNDIwMC5jbWRbMF0gPSBjbWRwYWNrZXQwKDB4NDIwMCwgNCk7Ci0JQUxMT0NfU1RBVEUodW5rNDIxNCwgYWx3YXlzLCAyLCAwKTsKLQlyMzAwLT5ody51bms0MjE0LmNtZFswXSA9IGNtZHBhY2tldDAoMHg0MjE0LCAxKTsKKwlBTExPQ19TVEFURShnYV9wb2ludF9zMCwgYWx3YXlzLCA1LCAwKTsKKwlyMzAwLT5ody5nYV9wb2ludF9zMC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfR0FfUE9JTlRfUzAsIDQpOworCUFMTE9DX1NUQVRFKGdhX3RyaWFuZ2xlX3N0aXBwbGUsIGFsd2F5cywgMiwgMCk7CisJcjMwMC0+aHcuZ2FfdHJpYW5nbGVfc3RpcHBsZS5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfR0FfVFJJQU5HTEVfU1RJUFBMRSwgMSk7CiAJQUxMT0NfU1RBVEUocHMsIGFsd2F5cywgUjMwMF9QU19DTURTSVpFLCAwKTsKLQlyMzAwLT5ody5wcy5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkVfUE9JTlRTSVpFLCAxKTsKLQlBTExPQ19TVEFURSh1bms0MjMwLCBhbHdheXMsIDQsIDApOwotCXIzMDAtPmh3LnVuazQyMzAuY21kWzBdID0gY21kcGFja2V0MCgweDQyMzAsIDMpOworCXIzMDAtPmh3LnBzLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQV9QT0lOVF9TSVpFLCAxKTsKKwlBTExPQ19TVEFURShnYV9wb2ludF9taW5tYXgsIGFsd2F5cywgNCwgMCk7CisJcjMwMC0+aHcuZ2FfcG9pbnRfbWlubWF4LmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQV9QT0lOVF9NSU5NQVgsIDMpOwogCUFMTE9DX1NUQVRFKGxjbnRsLCBhbHdheXMsIDIsIDApOwotCXIzMDAtPmh3LmxjbnRsLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9SRV9MSU5FX0NOVCwgMSk7Ci0JQUxMT0NfU1RBVEUodW5rNDI2MCwgYWx3YXlzLCA0LCAwKTsKLQlyMzAwLT5ody51bms0MjYwLmNtZFswXSA9IGNtZHBhY2tldDAoMHg0MjYwLCAzKTsKKwlyMzAwLT5ody5sY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfR0FfTElORV9DTlRMLCAxKTsKKwlBTExPQ19TVEFURShnYV9saW5lX3N0aXBwbGUsIGFsd2F5cywgNCwgMCk7CisJcjMwMC0+aHcuZ2FfbGluZV9zdGlwcGxlLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQV9MSU5FX1NUSVBQTEVfVkFMVUUsIDMpOwogCUFMTE9DX1NUQVRFKHNoYWRlLCBhbHdheXMsIDUsIDApOwotCXIzMDAtPmh3LnNoYWRlLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9SRV9TSEFERSwgNCk7CisJcjMwMC0+aHcuc2hhZGUuY21kWzBdID0gY21kcGFja2V0MChSMzAwX0dBX0VOSEFOQ0UsIDQpOwogCUFMTE9DX1NUQVRFKHBvbHlnb25fbW9kZSwgYWx3YXlzLCA0LCAwKTsKLQlyMzAwLT5ody5wb2x5Z29uX21vZGUuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1JFX1BPTFlHT05fTU9ERSwgMyk7CisJcjMwMC0+aHcucG9seWdvbl9tb2RlLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQV9QT0xZX01PREUsIDMpOwogCUFMTE9DX1NUQVRFKGZvZ3AsIGFsd2F5cywgMywgMCk7Ci0JcjMwMC0+aHcuZm9ncC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkVfRk9HX1NDQUxFLCAyKTsKKwlyMzAwLT5ody5mb2dwLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9HQV9GT0dfU0NBTEUsIDIpOwogCUFMTE9DX1NUQVRFKHpiaWFzX2NudGwsIGFsd2F5cywgMiwgMCk7Ci0JcjMwMC0+aHcuemJpYXNfY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkVfWkJJQVNfQ05UTCwgMSk7CisJcjMwMC0+aHcuemJpYXNfY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfU1VfVEVYX1dSQVAsIDEpOwogCUFMTE9DX1NUQVRFKHpicywgYWx3YXlzLCBSMzAwX1pCU19DTURTSVpFLCAwKTsKIAlyMzAwLT5ody56YnMuY21kW1IzMDBfWkJTX0NNRF8wXSA9Ci0JICAgIGNtZHBhY2tldDAoUjMwMF9SRV9aQklBU19UX0ZBQ1RPUiwgNCk7CisJICAgIGNtZHBhY2tldDAoUjMwMF9TVV9QT0xZX09GRlNFVF9GUk9OVF9TQ0FMRSwgNCk7CiAJQUxMT0NfU1RBVEUob2NjbHVzaW9uX2NudGwsIGFsd2F5cywgMiwgMCk7Ci0JcjMwMC0+aHcub2NjbHVzaW9uX2NudGwuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1JFX09DQ0xVU0lPTl9DTlRMLCAxKTsKKwlyMzAwLT5ody5vY2NsdXNpb25fY250bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfU1VfUE9MWV9PRkZTRVRfRU5BQkxFLCAxKTsKIAlBTExPQ19TVEFURShjdWwsIGFsd2F5cywgUjMwMF9DVUxfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcuY3VsLmNtZFtSMzAwX0NVTF9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkVfQ1VMTF9DTlRMLCAxKTsKLQlBTExPQ19TVEFURSh1bms0MkMwLCBhbHdheXMsIDMsIDApOwotCXIzMDAtPmh3LnVuazQyQzAuY21kWzBdID0gY21kcGFja2V0MCgweDQyQzAsIDIpOworCXIzMDAtPmh3LmN1bC5jbWRbUjMwMF9DVUxfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1NVX0NVTExfTU9ERSwgMSk7CisJQUxMT0NfU1RBVEUoc3VfZGVwdGhfc2NhbGUsIGFsd2F5cywgMywgMCk7CisJcjMwMC0+aHcuc3VfZGVwdGhfc2NhbGUuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1NVX0RFUFRIX1NDQUxFLCAyKTsKIAlBTExPQ19TVEFURShyYywgYWx3YXlzLCBSMzAwX1JDX0NNRFNJWkUsIDApOwotCXIzMDAtPmh3LnJjLmNtZFtSMzAwX1JDX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9SU19DTlRMXzAsIDIpOwotCUFMTE9DX1NUQVRFKHJpLCBhbHdheXMsIFIzMDBfUklfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcucmkuY21kW1IzMDBfUklfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JTX0lOVEVSUF8wLCA4KTsKLQlBTExPQ19TVEFURShyciwgdmFyaWFibGUsIFIzMDBfUlJfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JTX1JPVVRFXzAsIDEpOwotCUFMTE9DX1NUQVRFKHVuazQzQTQsIGFsd2F5cywgMywgMCk7Ci0JcjMwMC0+aHcudW5rNDNBNC5jbWRbMF0gPSBjbWRwYWNrZXQwKDB4NDNBNCwgMik7Ci0JQUxMT0NfU1RBVEUodW5rNDNFOCwgYWx3YXlzLCAyLCAwKTsKLQlyMzAwLT5ody51bms0M0U4LmNtZFswXSA9IGNtZHBhY2tldDAoMHg0M0U4LCAxKTsKLQlBTExPQ19TVEFURShmcCwgYWx3YXlzLCBSMzAwX0ZQX0NNRFNJWkUsIDApOwotCXIzMDAtPmh3LmZwLmNtZFtSMzAwX0ZQX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9QRlNfQ05UTF8wLCAzKTsKLQlyMzAwLT5ody5mcC5jbWRbUjMwMF9GUF9DTURfMV0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX05PREVfMCwgNCk7Ci0JQUxMT0NfU1RBVEUoZnB0LCB2YXJpYWJsZSwgUjMwMF9GUFRfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX1RFWElfMCwgMCk7Ci0JQUxMT0NfU1RBVEUodW5rNDZBNCwgYWx3YXlzLCA2LCAwKTsKLQlyMzAwLT5ody51bms0NkE0LmNtZFswXSA9IGNtZHBhY2tldDAoMHg0NkE0LCA1KTsKLQlBTExPQ19TVEFURShmcGlbMF0sIHZhcmlhYmxlLCBSMzAwX0ZQSV9DTURTSVpFLCAwKTsKLQlyMzAwLT5ody5mcGlbMF0uY21kW1IzMDBfRlBJX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9QRlNfSU5TVFIwXzAsIDEpOwotCUFMTE9DX1NUQVRFKGZwaVsxXSwgdmFyaWFibGUsIFIzMDBfRlBJX0NNRFNJWkUsIDEpOwotCXIzMDAtPmh3LmZwaVsxXS5jbWRbUjMwMF9GUElfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1BGU19JTlNUUjFfMCwgMSk7Ci0JQUxMT0NfU1RBVEUoZnBpWzJdLCB2YXJpYWJsZSwgUjMwMF9GUElfQ01EU0laRSwgMik7Ci0JcjMwMC0+aHcuZnBpWzJdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX0lOU1RSMl8wLCAxKTsKLQlBTExPQ19TVEFURShmcGlbM10sIHZhcmlhYmxlLCBSMzAwX0ZQSV9DTURTSVpFLCAzKTsKLQlyMzAwLT5ody5mcGlbM10uY21kW1IzMDBfRlBJX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9QRlNfSU5TVFIzXzAsIDEpOworCXIzMDAtPmh3LnJjLmNtZFtSMzAwX1JDX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9SU19DT1VOVCwgMik7CisJaWYgKGlzX3I1MDApIHsKKwkJQUxMT0NfU1RBVEUocmksIGFsd2F5cywgUjUwMF9SSV9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcucmkuY21kW1IzMDBfUklfQ01EXzBdID0gY21kcGFja2V0MChSNTAwX1JTX0lQXzAsIDE2KTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJcjMwMC0+aHcucmkuY21kW1IzMDBfUklfQ01EXzAgKyBpICsxXSA9CisJCQkgIChSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfU19TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUjUwMF9SU19JUF9QVFJfSzAgPDwgUjUwMF9SU19JUF9URVhfUFRSX1RfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFI1MDBfUlNfSVBfUFRSX0swIDw8IFI1MDBfUlNfSVBfVEVYX1BUUl9SX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChSNTAwX1JTX0lQX1BUUl9LMSA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUV9TSElGVCk7CisJCX0KKwkJQUxMT0NfU1RBVEUocnIsIHZhcmlhYmxlLCBSMzAwX1JSX0NNRFNJWkUsIDApOworCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9DTURfMF0gPSBjbWRwYWNrZXQwKFI1MDBfUlNfSU5TVF8wLCAxKTsKKwl9IGVsc2UgeworCQlBTExPQ19TVEFURShyaSwgYWx3YXlzLCBSMzAwX1JJX0NNRFNJWkUsIDApOworCQlyMzAwLT5ody5yaS5jbWRbUjMwMF9SSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUlNfSVBfMCwgOCk7CisJCUFMTE9DX1NUQVRFKHJyLCB2YXJpYWJsZSwgUjMwMF9SUl9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JTX0lOU1RfMCwgMSk7CisJfQorCUFMTE9DX1NUQVRFKHNjX2h5cGVyeiwgYWx3YXlzLCAzLCAwKTsKKwlyMzAwLT5ody5zY19oeXBlcnouY21kWzBdID0gY21kcGFja2V0MChSMzAwX1NDX0hZUEVSWiwgMik7CisJQUxMT0NfU1RBVEUoc2Nfc2NyZWVuZG9vciwgYWx3YXlzLCAyLCAwKTsKKwlyMzAwLT5ody5zY19zY3JlZW5kb29yLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9TQ19TQ1JFRU5ET09SLCAxKTsKKwlBTExPQ19TVEFURSh1c19vdXRfZm10LCBhbHdheXMsIDYsIDApOworCXIzMDAtPmh3LnVzX291dF9mbXQuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1VTX09VVF9GTVQsIDUpOworCisJaWYgKGlzX3I1MDApIHsKKwkJQUxMT0NfU1RBVEUoZnAsIGFsd2F5cywgUjUwMF9GUF9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcuZnAuY21kW1I1MDBfRlBfQ01EXzBdID0gY21kcGFja2V0MChSNTAwX1VTX0NPTkZJRywgMik7CisJCXIzMDAtPmh3LmZwLmNtZFtSNTAwX0ZQX0NOVExdID0gUjUwMF9aRVJPX1RJTUVTX0FOWVRISU5HX0VRVUFMU19aRVJPOworCQlyMzAwLT5ody5mcC5jbWRbUjUwMF9GUF9DTURfMV0gPSBjbWRwYWNrZXQwKFI1MDBfVVNfQ09ERV9BRERSLCAzKTsKKwkJcjMwMC0+aHcuZnAuY21kW1I1MDBfRlBfQ01EXzJdID0gY21kcGFja2V0MChSNTAwX1VTX0ZDX0NUUkwsIDEpOworCQlyMzAwLT5ody5mcC5jbWRbUjUwMF9GUF9GQ19DTlRMXSA9IDA7IC8qIEZJWE1FIHdoZW4gd2UgYWRkIGZsb3cgY29udHJvbCAqLworCisJCUFMTE9DX1NUQVRFKHI1MDBmcCwgcjUwMGZwLCBSNTAwX0ZQSV9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcucjUwMGZwLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRyNTAwZnAoMCwgMCwgMCwgMCk7CisJCUFMTE9DX1NUQVRFKHI1MDBmcF9jb25zdCwgcjUwMGZwX2NvbnN0LCBSNTAwX0ZQUF9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcucjUwMGZwX2NvbnN0LmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRyNTAwZnAoMCwgMCwgMSwgMCk7CisJfSBlbHNlIHsKKwkJQUxMT0NfU1RBVEUoZnAsIGFsd2F5cywgUjMwMF9GUF9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcuZnAuY21kW1IzMDBfRlBfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1VTX0NPTkZJRywgMyk7CisJCXIzMDAtPmh3LmZwLmNtZFtSMzAwX0ZQX0NNRF8xXSA9IGNtZHBhY2tldDAoUjMwMF9VU19DT0RFX0FERFJfMCwgNCk7CisJCUFMTE9DX1NUQVRFKGZwdCwgdmFyaWFibGUsIFIzMDBfRlBUX0NNRFNJWkUsIDApOworCQlyMzAwLT5ody5mcHQuY21kW1IzMDBfRlBUX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9VU19URVhfSU5TVF8wLCAwKTsKKworCQlBTExPQ19TVEFURShmcGlbMF0sIHZhcmlhYmxlLCBSMzAwX0ZQSV9DTURTSVpFLCAwKTsKKwkJcjMwMC0+aHcuZnBpWzBdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVVNfQUxVX1JHQl9JTlNUXzAsIDEpOworCQlBTExPQ19TVEFURShmcGlbMV0sIHZhcmlhYmxlLCBSMzAwX0ZQSV9DTURTSVpFLCAxKTsKKwkJcjMwMC0+aHcuZnBpWzFdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVVNfQUxVX1JHQl9BRERSXzAsIDEpOworCQlBTExPQ19TVEFURShmcGlbMl0sIHZhcmlhYmxlLCBSMzAwX0ZQSV9DTURTSVpFLCAyKTsKKwkJcjMwMC0+aHcuZnBpWzJdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVVNfQUxVX0FMUEhBX0lOU1RfMCwgMSk7CisJCUFMTE9DX1NUQVRFKGZwaVszXSwgdmFyaWFibGUsIFIzMDBfRlBJX0NNRFNJWkUsIDMpOworCQlyMzAwLT5ody5mcGlbM10uY21kW1IzMDBfRlBJX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9VU19BTFVfQUxQSEFfQUREUl8wLCAxKTsKKwkJQUxMT0NfU1RBVEUoZnBwLCB2YXJpYWJsZSwgUjMwMF9GUFBfQ01EU0laRSwgMCk7CisJCXIzMDAtPmh3LmZwcC5jbWRbUjMwMF9GUFBfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1BGU19QQVJBTV8wX1gsIDApOworCX0KIAlBTExPQ19TVEFURShmb2dzLCBhbHdheXMsIFIzMDBfRk9HU19DTURTSVpFLCAwKTsKLQlyMzAwLT5ody5mb2dzLmNtZFtSMzAwX0ZPR1NfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JFX0ZPR19TVEFURSwgMSk7CisJcjMwMC0+aHcuZm9ncy5jbWRbUjMwMF9GT0dTX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9GR19GT0dfQkxFTkQsIDEpOwogCUFMTE9DX1NUQVRFKGZvZ2MsIGFsd2F5cywgUjMwMF9GT0dDX0NNRFNJWkUsIDApOwotCXIzMDAtPmh3LmZvZ2MuY21kW1IzMDBfRk9HQ19DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfRk9HX0NPTE9SX1IsIDMpOworCXIzMDAtPmh3LmZvZ2MuY21kW1IzMDBfRk9HQ19DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfRkdfRk9HX0NPTE9SX1IsIDMpOwogCUFMTE9DX1NUQVRFKGF0LCBhbHdheXMsIFIzMDBfQVRfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcuYXQuY21kW1IzMDBfQVRfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1BQX0FMUEhBX1RFU1QsIDIpOwotCUFMTE9DX1NUQVRFKHVuazRCRDgsIGFsd2F5cywgMiwgMCk7Ci0JcjMwMC0+aHcudW5rNEJEOC5jbWRbMF0gPSBjbWRwYWNrZXQwKDB4NEJEOCwgMSk7Ci0JQUxMT0NfU1RBVEUoZnBwLCB2YXJpYWJsZSwgUjMwMF9GUFBfQ01EU0laRSwgMCk7Ci0JcjMwMC0+aHcuZnBwLmNtZFtSMzAwX0ZQUF9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX1BBUkFNXzBfWCwgMCk7Ci0JQUxMT0NfU1RBVEUodW5rNEUwMCwgYWx3YXlzLCAyLCAwKTsKLQlyMzAwLT5ody51bms0RTAwLmNtZFswXSA9IGNtZHBhY2tldDAoMHg0RTAwLCAxKTsKKwlyMzAwLT5ody5hdC5jbWRbUjMwMF9BVF9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfRkdfQUxQSEFfRlVOQywgMik7CisJQUxMT0NfU1RBVEUoZmdfZGVwdGhfc3JjLCBhbHdheXMsIDIsIDApOworCXIzMDAtPmh3LmZnX2RlcHRoX3NyYy5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfRkdfREVQVEhfU1JDLCAxKTsKKwlBTExPQ19TVEFURShyYjNkX2NjdGwsIGFsd2F5cywgMiwgMCk7CisJcjMwMC0+aHcucmIzZF9jY3RsLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9SQjNEX0NDVEwsIDEpOwogCUFMTE9DX1NUQVRFKGJsZCwgYWx3YXlzLCBSMzAwX0JMRF9DTURTSVpFLCAwKTsKIAlyMzAwLT5ody5ibGQuY21kW1IzMDBfQkxEX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9SQjNEX0NCTEVORCwgMik7CiAJQUxMT0NfU1RBVEUoY21rLCBhbHdheXMsIFIzMDBfQ01LX0NNRFNJWkUsIDApOwotCXIzMDAtPmh3LmNtay5jbWRbUjMwMF9DTUtfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JCM0RfQ09MT1JNQVNLLCAxKTsKLQlBTExPQ19TVEFURShibGVuZF9jb2xvciwgYWx3YXlzLCA0LCAwKTsKLQlyMzAwLT5ody5ibGVuZF9jb2xvci5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkIzRF9CTEVORF9DT0xPUiwgMyk7CisJcjMwMC0+aHcuY21rLmNtZFtSMzAwX0NNS19DTURfMF0gPSBjbWRwYWNrZXQwKFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLLCAxKTsKKwlpZiAoaXNfcjUwMCkgeworCQlBTExPQ19TVEFURShibGVuZF9jb2xvciwgYWx3YXlzLCAzLCAwKTsKKwkJcjMwMC0+aHcuYmxlbmRfY29sb3IuY21kWzBdID0gY21kcGFja2V0MChSNTAwX1JCM0RfQ09OU1RBTlRfQ09MT1JfQVIsIDIpOworCX0gZWxzZSB7CisJCUFMTE9DX1NUQVRFKGJsZW5kX2NvbG9yLCBhbHdheXMsIDIsIDApOworCQlyMzAwLT5ody5ibGVuZF9jb2xvci5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkIzRF9CTEVORF9DT0xPUiwgMSk7CisJfQorCUFMTE9DX1NUQVRFKHJvcCwgYWx3YXlzLCAyLCAwKTsKKwlyMzAwLT5ody5yb3AuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1JCM0RfUk9QQ05UTCwgMSk7CiAJQUxMT0NfU1RBVEUoY2IsIGFsd2F5cywgUjMwMF9DQl9DTURTSVpFLCAwKTsKIAlyMzAwLT5ody5jYi5jbWRbUjMwMF9DQl9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkIzRF9DT0xPUk9GRlNFVDAsIDEpOwogCXIzMDAtPmh3LmNiLmNtZFtSMzAwX0NCX0NNRF8xXSA9IGNtZHBhY2tldDAoUjMwMF9SQjNEX0NPTE9SUElUQ0gwLCAxKTsKLQlBTExPQ19TVEFURSh1bms0RTUwLCBhbHdheXMsIDEwLCAwKTsKLQlyMzAwLT5ody51bms0RTUwLmNtZFswXSA9IGNtZHBhY2tldDAoMHg0RTUwLCA5KTsKLQlBTExPQ19TVEFURSh1bms0RTg4LCBhbHdheXMsIDIsIDApOwotCXIzMDAtPmh3LnVuazRFODguY21kWzBdID0gY21kcGFja2V0MCgweDRFODgsIDEpOwotCUFMTE9DX1NUQVRFKHVuazRFQTAsIGFsd2F5cywgMywgMCk7Ci0JcjMwMC0+aHcudW5rNEVBMC5jbWRbMF0gPSBjbWRwYWNrZXQwKDB4NEVBMCwgMik7CisJQUxMT0NfU1RBVEUocmIzZF9kaXRoZXJfY3RsLCBhbHdheXMsIDEwLCAwKTsKKwlyMzAwLT5ody5yYjNkX2RpdGhlcl9jdGwuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1JCM0RfRElUSEVSX0NUTCwgOSk7CisJQUxMT0NfU1RBVEUocmIzZF9hYXJlc29sdmVfY3RsLCBhbHdheXMsIDIsIDApOworCXIzMDAtPmh3LnJiM2RfYWFyZXNvbHZlX2N0bC5jbWRbMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkIzRF9BQVJFU09MVkVfQ1RMLCAxKTsKKwlBTExPQ19TVEFURShyYjNkX2Rpc2NhcmRfc3JjX3BpeGVsX2x0ZV90aHJlc2hvbGQsIGFsd2F5cywgMywgMCk7CisJcjMwMC0+aHcucmIzZF9kaXNjYXJkX3NyY19waXhlbF9sdGVfdGhyZXNob2xkLmNtZFswXSA9IGNtZHBhY2tldDAoUjUwMF9SQjNEX0RJU0NBUkRfU1JDX1BJWEVMX0xURV9USFJFU0hPTEQsIDIpOwogCUFMTE9DX1NUQVRFKHpzLCBhbHdheXMsIFIzMDBfWlNfQ01EU0laRSwgMCk7CiAJcjMwMC0+aHcuenMuY21kW1IzMDBfWlNfQ01EXzBdID0KLQkgICAgY21kcGFja2V0MChSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wLCAzKTsKKwkgICAgY21kcGFja2V0MChSMzAwX1pCX0NOVEwsIDMpOwogCUFMTE9DX1NUQVRFKHpzdGVuY2lsX2Zvcm1hdCwgYWx3YXlzLCA1LCAwKTsKIAlyMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzBdID0KLQkgICAgY21kcGFja2V0MChSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFULCA0KTsKKwkgICAgY21kcGFja2V0MChSMzAwX1pCX0ZPUk1BVCwgNCk7CiAJQUxMT0NfU1RBVEUoemIsIGFsd2F5cywgUjMwMF9aQl9DTURTSVpFLCAwKTsKLQlyMzAwLT5ody56Yi5jbWRbUjMwMF9aQl9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUkIzRF9ERVBUSE9GRlNFVCwgMik7Ci0JQUxMT0NfU1RBVEUodW5rNEYyOCwgYWx3YXlzLCAyLCAwKTsKLQlyMzAwLT5ody51bms0RjI4LmNtZFswXSA9IGNtZHBhY2tldDAoMHg0RjI4LCAxKTsKKwlyMzAwLT5ody56Yi5jbWRbUjMwMF9aQl9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfWkJfREVQVEhPRkZTRVQsIDIpOworCUFMTE9DX1NUQVRFKHpiX2RlcHRoY2xlYXJ2YWx1ZSwgYWx3YXlzLCAyLCAwKTsKKwlyMzAwLT5ody56Yl9kZXB0aGNsZWFydmFsdWUuY21kWzBdID0gY21kcGFja2V0MChSMzAwX1pCX0RFUFRIQ0xFQVJWQUxVRSwgMSk7CiAJQUxMT0NfU1RBVEUodW5rNEYzMCwgYWx3YXlzLCAzLCAwKTsKIAlyMzAwLT5ody51bms0RjMwLmNtZFswXSA9IGNtZHBhY2tldDAoMHg0RjMwLCAyKTsKLQlBTExPQ19TVEFURSh1bms0RjQ0LCBhbHdheXMsIDIsIDApOwotCXIzMDAtPmh3LnVuazRGNDQuY21kWzBdID0gY21kcGFja2V0MCgweDRGNDQsIDEpOwotCUFMTE9DX1NUQVRFKHVuazRGNTQsIGFsd2F5cywgMiwgMCk7Ci0JcjMwMC0+aHcudW5rNEY1NC5jbWRbMF0gPSBjbWRwYWNrZXQwKDB4NEY1NCwgMSk7CisJQUxMT0NfU1RBVEUoemJfaGl6X29mZnNldCwgYWx3YXlzLCAyLCAwKTsKKwlyMzAwLT5ody56Yl9oaXpfb2Zmc2V0LmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9aQl9ISVpfT0ZGU0VULCAxKTsKKwlBTExPQ19TVEFURSh6Yl9oaXpfcGl0Y2gsIGFsd2F5cywgMiwgMCk7CisJcjMwMC0+aHcuemJfaGl6X3BpdGNoLmNtZFswXSA9IGNtZHBhY2tldDAoUjMwMF9aQl9ISVpfUElUQ0gsIDEpOwogCiAJLyogVlBVIG9ubHkgb24gVENMICovCiAJaWYgKGhhc190Y2wpIHsKKyAgIAkgICAgICAgIGludCBpOwogCQlBTExPQ19TVEFURSh2cGksIHZwdSwgUjMwMF9WUElfQ01EU0laRSwgMCk7CiAJCXIzMDAtPmh3LnZwaS5jbWRbUjMwMF9WUElfQ01EXzBdID0KLQkJICAgIGNtZHZwdShSMzAwX1BWU19VUExPQURfUFJPR1JBTSwgMCk7Ci0JCUFMTE9DX1NUQVRFKHZwcCwgdnB1LCBSMzAwX1ZQUF9DTURTSVpFLCAwKTsKLQkJcjMwMC0+aHcudnBwLmNtZFtSMzAwX1ZQUF9DTURfMF0gPQotCQkgICAgY21kdnB1KFIzMDBfUFZTX1VQTE9BRF9QQVJBTUVURVJTLCAwKTsKLQkJQUxMT0NfU1RBVEUodnBzLCB2cHUsIFIzMDBfVlBTX0NNRFNJWkUsIDApOwotCQlyMzAwLT5ody52cHMuY21kW1IzMDBfVlBTX0NNRF8wXSA9Ci0JCSAgICBjbWR2cHUoUjMwMF9QVlNfVVBMT0FEX1BPSU5UU0laRSwgMSk7CisJCSAgICBjbWR2cHUoUjMwMF9QVlNfQ09ERV9TVEFSVCwgMCk7CisKKwkJaWYgKGlzX3I1MDApIHsKKwkJICAgIEFMTE9DX1NUQVRFKHZwcCwgdnB1LCBSMzAwX1ZQUF9DTURTSVpFLCAwKTsKKwkJICAgIHIzMDAtPmh3LnZwcC5jbWRbUjMwMF9WUFBfQ01EXzBdID0KKwkJCWNtZHZwdShSNTAwX1BWU19DT05TVF9TVEFSVCwgMCk7CisKKwkJICAgIEFMTE9DX1NUQVRFKHZwcywgdnB1LCBSMzAwX1ZQU19DTURTSVpFLCAwKTsKKwkJICAgIHIzMDAtPmh3LnZwcy5jbWRbUjMwMF9WUFNfQ01EXzBdID0KKwkJCWNtZHZwdShSNTAwX1BPSU5UX1ZQT1JUX1NDQUxFX09GRlNFVCwgMSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCQlBTExPQ19TVEFURSh2cHVjcFtpXSwgdnB1LCBSMzAwX1ZQVUNQX0NNRFNJWkUsIDApOworCQkJCXIzMDAtPmh3LnZwdWNwW2ldLmNtZFtSMzAwX1ZQVUNQX0NNRF8wXSA9CisJCQkJCWNtZHZwdShSNTAwX1BWU19VQ1BfU1RBUlQgKyBpLCAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJICAgIEFMTE9DX1NUQVRFKHZwcCwgdnB1LCBSMzAwX1ZQUF9DTURTSVpFLCAwKTsKKwkJICAgIHIzMDAtPmh3LnZwcC5jbWRbUjMwMF9WUFBfQ01EXzBdID0KKwkJCWNtZHZwdShSMzAwX1BWU19DT05TVF9TVEFSVCwgMCk7CisKKwkJICAgIEFMTE9DX1NUQVRFKHZwcywgdnB1LCBSMzAwX1ZQU19DTURTSVpFLCAwKTsKKwkJICAgIHIzMDAtPmh3LnZwcy5jbWRbUjMwMF9WUFNfQ01EXzBdID0KKwkJCWNtZHZwdShSMzAwX1BPSU5UX1ZQT1JUX1NDQUxFX09GRlNFVCwgMSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCQlBTExPQ19TVEFURSh2cHVjcFtpXSwgdnB1LCBSMzAwX1ZQVUNQX0NNRFNJWkUsIDApOworCQkJCXIzMDAtPmh3LnZwdWNwW2ldLmNtZFtSMzAwX1ZQVUNQX0NNRF8wXSA9CisJCQkJCWNtZHZwdShSMzAwX1BWU19VQ1BfU1RBUlQgKyBpLCAxKTsKKwkJCX0KKwkJfQogCX0KIAogCS8qIFRleHR1cmVzICovCiAJQUxMT0NfU1RBVEUodGV4LmZpbHRlciwgdmFyaWFibGUsIG10dSArIDEsIDApOwogCXIzMDAtPmh3LnRleC5maWx0ZXIuY21kW1IzMDBfVEVYX0NNRF8wXSA9Ci0JICAgIGNtZHBhY2tldDAoUjMwMF9UWF9GSUxURVJfMCwgMCk7CisJICAgIGNtZHBhY2tldDAoUjMwMF9UWF9GSUxURVIwXzAsIDApOwogCiAJQUxMT0NfU1RBVEUodGV4LmZpbHRlcl8xLCB2YXJpYWJsZSwgbXR1ICsgMSwgMCk7CiAJcjMwMC0+aHcudGV4LmZpbHRlcl8xLmNtZFtSMzAwX1RFWF9DTURfMF0gPQpAQCAtNDcxLDcgKzU2MCw3IEBACiAJICAgIGNtZHBhY2tldDAoUjMwMF9UWF9GT1JNQVRfMCwgMCk7CiAKIAlBTExPQ19TVEFURSh0ZXgucGl0Y2gsIHZhcmlhYmxlLCBtdHUgKyAxLCAwKTsKLQlyMzAwLT5ody50ZXgucGl0Y2guY21kW1IzMDBfVEVYX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9UWF9QSVRDSF8wLCAwKTsKKwlyMzAwLT5ody50ZXgucGl0Y2guY21kW1IzMDBfVEVYX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9UWF9GT1JNQVQyXzAsIDApOwogCiAJQUxMT0NfU1RBVEUodGV4Lm9mZnNldCwgdmFyaWFibGUsIG10dSArIDEsIDApOwogCXIzMDAtPmh3LnRleC5vZmZzZXQuY21kW1IzMDBfVEVYX0NNRF8wXSA9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfY21kYnVmLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfY21kYnVmLmgKaW5kZXggYWNiNmUzOC4uYThlYWE1OCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2NtZGJ1Zi5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jbWRidWYuaApAQCAtNTIsNyArNTIsNyBAQAogICoKICAqIFxwYXJhbSBkd29yZHMgVGhlIG51bWJlciBvZiBkd29yZHMgd2UgbmVlZCB0byBiZSBmcmVlIG9uIHRoZSBjb21tYW5kIGJ1ZmZlcgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcjMwMEVuc3VyZUNtZEJ1ZlNwYWNlKHIzMDBDb250ZXh0UHRyIHIzMDAsCitzdGF0aWMgSU5MSU5FIHZvaWQgcjMwMEVuc3VyZUNtZEJ1ZlNwYWNlKHIzMDBDb250ZXh0UHRyIHIzMDAsCiAJCQkJCSAgICAgaW50IGR3b3JkcywgY29uc3QgY2hhciAqY2FsbGVyKQogewogCWFzc2VydChkd29yZHMgPCByMzAwLT5jbWRidWYuc2l6ZSk7CkBAIC02OCw3ICs2OCw3IEBACiAgKiBjYXVzZXMgc3RhdGUgcmVlbWlzc2lvbiBhZnRlciBhIGZsdXNoLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUKICAqIGNvcnJlY3QgaGFyZHdhcmUgc3RhdGUgYWZ0ZXIgYW4gdW5sb2NrLgogICovCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90ICpyMzAwUmF3QWxsb2NDbWRCdWYocjMwMENvbnRleHRQdHIgcjMwMCwKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QgKnIzMDBSYXdBbGxvY0NtZEJ1ZihyMzAwQ29udGV4dFB0ciByMzAwLAogCQkJCQkgICAgICAgaW50IGR3b3JkcywgY29uc3QgY2hhciAqY2FsbGVyKQogewogCXVpbnQzMl90ICpwdHI7CkBAIC04MCw3ICs4MCw3IEBACiAJcmV0dXJuIHB0cjsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCAqcjMwMEFsbG9jQ21kQnVmKHIzMDBDb250ZXh0UHRyIHIzMDAsCitzdGF0aWMgSU5MSU5FIHVpbnQzMl90ICpyMzAwQWxsb2NDbWRCdWYocjMwMENvbnRleHRQdHIgcjMwMCwKIAkJCQkJICAgIGludCBkd29yZHMsIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAl1aW50MzJfdCAqcHRyOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jb250ZXh0LmMKaW5kZXggMTRlMGYwNS4uZmNmNTcxZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfY29udGV4dC5jCkBAIC03OSwxMSArNzksMTMgQEAKIAogI2RlZmluZSBuZWVkX0dMX0VYVF9zdGVuY2lsX3R3b19zaWRlCiAjZGVmaW5lIG5lZWRfR0xfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIG5lZWRfR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKICNkZWZpbmUgbmVlZF9HTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbgogI2RlZmluZSBuZWVkX0dMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAogI2RlZmluZSBuZWVkX0dMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQogI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9taW5tYXgKIC8vI2RlZmluZSBuZWVkX0dMX0VYVF9mb2dfY29vcmQKKyNkZWZpbmUgbmVlZF9HTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKICNkZWZpbmUgbmVlZF9HTF9FWFRfc2Vjb25kYXJ5X2NvbG9yCiAjZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCiAjZGVmaW5lIG5lZWRfR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKQEAgLTkzLDggKzk1LDEzIEBACiAKIGNvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNhcmRfZXh0ZW5zaW9uc1tdID0gewogICAvKiAqSU5ERU5ULU9GRiogKi8KKyAgeyJHTF9BUkJfZGVwdGhfdGV4dHVyZSIsCQlOVUxMfSwKKyAgeyJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIsCQlOVUxMfSwKICAgeyJHTF9BUkJfbXVsdGlzYW1wbGUiLAkJR0xfQVJCX211bHRpc2FtcGxlX2Z1bmN0aW9uc30sCiAgIHsiR0xfQVJCX211bHRpdGV4dHVyZSIsCQlOVUxMfSwKKyAgeyJHTF9BUkJfcG9pbnRfcGFyYW1ldGVycyIsCQlHTF9BUkJfcG9pbnRfcGFyYW1ldGVyc19mdW5jdGlvbnN9LAorICB7IkdMX0FSQl9zaGFkb3ciLAkJCU5VTEx9LAorICB7IkdMX0FSQl9zaGFkb3dfYW1iaWVudCIsCQlOVUxMfSwKICAgeyJHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAiLAlOVUxMfSwKICAgeyJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiIsCUdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX2Z1bmN0aW9uc30sCiAgIHsiR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAiLAkJTlVMTH0sCkBAIC0xMDUsMTQgKzExMiwxNSBAQAogICB7IkdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCIsCU5VTEx9LAogICB7IkdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCIsCUdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdF9mdW5jdGlvbnN9LAogICB7IkdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbSIsCQlHTF9BUkJfdmVydGV4X3Byb2dyYW1fZnVuY3Rpb25zfSwKLSAgeyJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIsCQlOVUxMfSwKICAgeyJHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUiLAlHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGVfZnVuY3Rpb25zfSwKICAgeyJHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZSIsCUdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlX2Z1bmN0aW9uc30sCiAgIHsiR0xfRVhUX2JsZW5kX21pbm1heCIsCQlHTF9FWFRfYmxlbmRfbWlubWF4X2Z1bmN0aW9uc30sCiAgIHsiR0xfRVhUX2JsZW5kX3N1YnRyYWN0IiwJCU5VTEx9LAogLy8gIHsiR0xfRVhUX2ZvZ19jb29yZCIsCQkJR0xfRVhUX2ZvZ19jb29yZF9mdW5jdGlvbnMgfSwKKyAgeyJHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMiLAkJR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzX2Z1bmN0aW9uc30sCiAgIHsiR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMiLCAgICAgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnNfZnVuY3Rpb25zfSwKICAgeyJHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIiwgCQlHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yX2Z1bmN0aW9uc30sCisgIHsiR0xfRVhUX3NoYWRvd19mdW5jcyIsCQlOVUxMfSwKICAgeyJHTF9FWFRfc3RlbmNpbF90d29fc2lkZSIsCQlHTF9FWFRfc3RlbmNpbF90d29fc2lkZV9mdW5jdGlvbnN9LAogICB7IkdMX0VYVF9zdGVuY2lsX3dyYXAiLAkJTlVMTH0sCiAgIHsiR0xfRVhUX3RleHR1cmVfZWRnZV9jbGFtcCIsCQlOVUxMfSwKQEAgLTEzMCw2ICsxMzgsNyBAQAogICB7IkdMX05WX2JsZW5kX3NxdWFyZSIsCQlOVUxMfSwKICAgeyJHTF9OVl92ZXJ0ZXhfcHJvZ3JhbSIsCQlHTF9OVl92ZXJ0ZXhfcHJvZ3JhbV9mdW5jdGlvbnN9LAogICB7IkdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIiwJCU5VTEx9LAorICB7IkdMX1NHSVhfZGVwdGhfdGV4dHVyZSIsCQlOVUxMfSwKICAge05VTEwsCQkJCU5VTEx9CiAgIC8qICpJTkRFTlQtT04qICovCiB9OwpAQCAtMjczLDYgKzI4MiwxMiBAQAogCSAgICBNSU4yKGN0eC0+Q29uc3QuTWF4VGV4dHVyZUltYWdlVW5pdHMsCiAJCSBjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzKTsKIAljdHgtPkNvbnN0Lk1heFRleHR1cmVNYXhBbmlzb3Ryb3B5ID0gMTYuMDsKKwljdHgtPkNvbnN0Lk1heFRleHR1cmVMb2RCaWFzID0gMTYuMDsKKworCWlmIChzY3JlZW4tPmNoaXBfZmFtaWx5ID49IENISVBfRkFNSUxZX1JWNTE1KSB7CisJICAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscyA9IDEzOworCSAgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVSZWN0U2l6ZSA9IDQwOTY7CisJfQogCiAJY3R4LT5Db25zdC5NaW5Qb2ludFNpemUgPSAxLjA7CiAJY3R4LT5Db25zdC5NaW5Qb2ludFNpemVBQSA9IDEuMDsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfY29udGV4dC5oCmluZGV4IGJlNjkwOTcuLmQyMDE3ZjggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2NvbnRleHQuaApAQCAtNzMsMTIgKzczLDEyIEBACiAJfQogCiAjaW5jbHVkZSAicjMwMF92ZXJ0cHJvZy5oIgotI2luY2x1ZGUgInIzMDBfZnJhZ3Byb2cuaCIKKyNpbmNsdWRlICJyNTAwX2ZyYWdwcm9nLmgiCiAKIC8qKgogICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZsb2F0IGFuZCBwYWNrcyBpdCBpbnRvIGEgdWludDMyX3QKICAqLwotc3RhdGljIGlubGluZSB1aW50MzJfdCByMzAwUGFja0Zsb2F0MzIoZmxvYXQgZmwpCitzdGF0aWMgSU5MSU5FIHVpbnQzMl90IHIzMDBQYWNrRmxvYXQzMihmbG9hdCBmbCkKIHsKIAl1bmlvbiB7CiAJCWZsb2F0IGZsOwpAQCAtOTUsNyArOTUsNyBAQAogICogQnV0IGl0IHdvcmtzIGZvciBtb3N0IHRoaW5ncy4gIEknbGwgZml4IGl0IGxhdGVyIGlmIHNvbWVvbmUKICAqIGVsc2Ugd2l0aCBhIGJldHRlciBjbHVlIGRvZXNuJ3QKICAqLwotc3RhdGljIGlubGluZSB1aW50MzJfdCByMzAwUGFja0Zsb2F0MjQoZmxvYXQgZikKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QgcjMwMFBhY2tGbG9hdDI0KGZsb2F0IGYpCiB7CiAJZmxvYXQgbWFudGlzc2E7CiAJaW50IGV4cG9uZW50OwpAQCAtMTc4LDEzICsxNzgsNiBAQAogCUdMdWludCBidWZBZGRyOwkJLyogT2Zmc2V0IHRvIHN0YXJ0IG9mIGxvY2FsbHkKIAkJCQkgICBzaGFyZWQgdGV4dHVyZSBibG9jayAqLwogCi0JR0x1aW50IGRpcnR5X3N0YXRlOwkvKiBGbGFncyAoMSBwZXIgdGV4dW5pdCkgZm9yCi0JCQkJICAgd2hldGhlciBvciBub3QgdGhpcyB0ZXhvYmoKLQkJCQkgICBoYXMgZGlydHkgaGFyZHdhcmUgc3RhdGUKLQkJCQkgICAocHBfKikgdGhhdCBuZWVkcyB0byBiZQotCQkJCSAgIGJyb3VnaHQgaW50byB0aGUKLQkJCQkgICB0ZXh1bml0LiAqLwotCiAJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBpbWFnZVs2XVtSQURFT05fTUFYX1RFWFRVUkVfTEVWRUxTXTsKIAkvKiBTaXgsIGZvciB0aGUgY3ViZSBmYWNlcyAqLwogCkBAIC0zMzAsMTUgKzMyMywxNyBAQAogI2RlZmluZSBSMzAwX1JJX0lOVEVSUF83CTgKICNkZWZpbmUgUjMwMF9SSV9DTURTSVpFCQk5CiAKKyNkZWZpbmUgUjUwMF9SSV9DTURTSVpFCSAgICAgICAxNworCiAjZGVmaW5lIFIzMDBfUlJfQ01EXzAJCTAJLyogcnIgaXMgdmFyaWFibGUgc2l6ZSAoYXQgbGVhc3QgMSkgKi8KLSNkZWZpbmUgUjMwMF9SUl9ST1VURV8wCQkxCi0jZGVmaW5lIFIzMDBfUlJfUk9VVEVfMQkJMgotI2RlZmluZSBSMzAwX1JSX1JPVVRFXzIJCTMKLSNkZWZpbmUgUjMwMF9SUl9ST1VURV8zCQk0Ci0jZGVmaW5lIFIzMDBfUlJfUk9VVEVfNAkJNQotI2RlZmluZSBSMzAwX1JSX1JPVVRFXzUJCTYKLSNkZWZpbmUgUjMwMF9SUl9ST1VURV82CQk3Ci0jZGVmaW5lIFIzMDBfUlJfUk9VVEVfNwkJOAorI2RlZmluZSBSMzAwX1JSX0lOU1RfMAkJMQorI2RlZmluZSBSMzAwX1JSX0lOU1RfMQkJMgorI2RlZmluZSBSMzAwX1JSX0lOU1RfMgkJMworI2RlZmluZSBSMzAwX1JSX0lOU1RfMwkJNAorI2RlZmluZSBSMzAwX1JSX0lOU1RfNAkJNQorI2RlZmluZSBSMzAwX1JSX0lOU1RfNQkJNgorI2RlZmluZSBSMzAwX1JSX0lOU1RfNgkJNworI2RlZmluZSBSMzAwX1JSX0lOU1RfNwkJOAogI2RlZmluZSBSMzAwX1JSX0NNRFNJWkUJCTkKIAogI2RlZmluZSBSMzAwX0ZQX0NNRF8wCQkwCkBAIC0zNTIsNiArMzQ3LDE3IEBACiAjZGVmaW5lIFIzMDBfRlBfTk9ERTMJCTgKICNkZWZpbmUgUjMwMF9GUF9DTURTSVpFCQk5CiAKKyNkZWZpbmUgUjUwMF9GUF9DTURfMCAgICAgICAgICAgMAorI2RlZmluZSBSNTAwX0ZQX0NOVEwgICAgICAgICAgICAxCisjZGVmaW5lIFI1MDBfRlBfUElYU0laRSAgICAgICAgIDIKKyNkZWZpbmUgUjUwMF9GUF9DTURfMSAgICAgICAgICAgMworI2RlZmluZSBSNTAwX0ZQX0NPREVfQUREUiAgICAgICA0CisjZGVmaW5lIFI1MDBfRlBfQ09ERV9SQU5HRSAgICAgIDUKKyNkZWZpbmUgUjUwMF9GUF9DT0RFX09GRlNFVCAgICAgNgorI2RlZmluZSBSNTAwX0ZQX0NNRF8yICAgICAgICAgICA3CisjZGVmaW5lIFI1MDBfRlBfRkNfQ05UTCAgICAgICAgIDgKKyNkZWZpbmUgUjUwMF9GUF9DTURTSVpFICAgICAgICAgOQorCiAjZGVmaW5lIFIzMDBfRlBUX0NNRF8wCQkwCiAjZGVmaW5lIFIzMDBfRlBUX0lOU1RSXzAJMQogI2RlZmluZSBSMzAwX0ZQVF9DTURTSVpFCTY1CkBAIC0zNTksMTAgKzM2NSwxNCBAQAogI2RlZmluZSBSMzAwX0ZQSV9DTURfMAkJMAogI2RlZmluZSBSMzAwX0ZQSV9JTlNUUl8wCTEKICNkZWZpbmUgUjMwMF9GUElfQ01EU0laRQk2NQorLyogUjUwMCBoYXMgc3BhY2UgZm9yIDUxMiBpbnN0cnVjdGlvbnMgLSA2IGR3b3JkcyBwZXIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgUjUwMF9GUElfQ01EU0laRQkoNTEyKjYrMSkKIAogI2RlZmluZSBSMzAwX0ZQUF9DTURfMAkJMAogI2RlZmluZSBSMzAwX0ZQUF9QQVJBTV8wCTEKICNkZWZpbmUgUjMwMF9GUFBfQ01EU0laRQkoMzIqNCsxKQorLyogUjUwMCBoYXMgc3BjYWUgZm9yIDI1NiBjb25zdGFudHMgLSA0IGR3b3JkcyBwZXIgY29uc3RhbnQgKi8KKyNkZWZpbmUgUjUwMF9GUFBfQ01EU0laRQkoMjU2KjQrMSkKIAogI2RlZmluZSBSMzAwX0ZPR1NfQ01EXzAJCTAKICNkZWZpbmUgUjMwMF9GT0dTX1NUQVRFCQkxCkBAIC00MTAsNiArNDIwLDEyIEBACiAjZGVmaW5lIFIzMDBfWkJfUElUQ0gJCTIKICNkZWZpbmUgUjMwMF9aQl9DTURTSVpFCQkzCiAKKyNkZWZpbmUgUjMwMF9WQVBfQ05UTF9GTFVTSCAgICAgMAorI2RlZmluZSBSMzAwX1ZBUF9DTlRMX0ZMVVNIXzEgICAxCisjZGVmaW5lIFIzMDBfVkFQX0NOVExfQ01EICAgICAgIDIKKyNkZWZpbmUgUjMwMF9WQVBfQ05UTF9JTlNUUiAgICAgMworI2RlZmluZSBSMzAwX1ZBUF9DTlRMX1NJWkUgICAgICA0CisKICNkZWZpbmUgUjMwMF9WUElfQ01EXzAJCTAKICNkZWZpbmUgUjMwMF9WUElfSU5TVFJfMAkxCiAjZGVmaW5lIFIzMDBfVlBJX0NNRFNJWkUJMTAyNQkvKiAyNTYgMTYgYnl0ZSBpbnN0cnVjdGlvbnMgKi8KQEAgLTQxOCw2ICs0MzQsMTMgQEAKICNkZWZpbmUgUjMwMF9WUFBfUEFSQU1fMAkxCiAjZGVmaW5lIFIzMDBfVlBQX0NNRFNJWkUJMTAyNQkvKiAyNTYgNC1jb21wb25lbnQgcGFyYW1ldGVycyAqLwogCisjZGVmaW5lIFIzMDBfVlBVQ1BfQ01EXzAJCTAKKyNkZWZpbmUgUjMwMF9WUFVDUF9YICAgICAgICAgICAgMQorI2RlZmluZSBSMzAwX1ZQVUNQX1kgICAgICAgICAgICAyCisjZGVmaW5lIFIzMDBfVlBVQ1BfWiAgICAgICAgICAgIDMKKyNkZWZpbmUgUjMwMF9WUFVDUF9XICAgICAgICAgICAgNAorI2RlZmluZSBSMzAwX1ZQVUNQX0NNRFNJWkUJNQkvKiAyNTYgNC1jb21wb25lbnQgcGFyYW1ldGVycyAqLworCiAjZGVmaW5lIFIzMDBfVlBTX0NNRF8wCQkwCiAjZGVmaW5lIFIzMDBfVlBTX1pFUk9fMAkJMQogI2RlZmluZSBSMzAwX1ZQU19aRVJPXzEJCTIKQEAgLTQ0NCw2NyArNDY3LDcyIEBACiAKIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZwdDsJLyogdmlld3BvcnQgKDFEOTgpICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB2YXBfY250bDsKKyAgICAgICAgc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB2YXBfaW5kZXhfb2Zmc2V0OyAvKiAweDIwOGMgcjV4eCBvbmx5ICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB2b2Y7CS8qIFZBUCBvdXRwdXQgZm9ybWF0IHJlZ2lzdGVyIDB4MjA5MCAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdnRlOwkvKiAoMjBCMCkgKi8KLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazIxMzQ7CS8qICgyMTM0KSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdmFwX3ZmX21heF92dHhfaW5keDsJLyogTWF4aW11bSBWZXJ0ZXggSW5keCBDbGFtcCAoMjEzNCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZhcF9jbnRsX3N0YXR1czsKIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZpclsyXTsJLyogdmFwIGlucHV0IHJvdXRlICgyMTUwLzIxRTApICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB2aWM7CS8qIHZhcCBpbnB1dCBjb250cm9sICgyMTgwKSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rMjFEQzsJLyogKDIxREMpICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bmsyMjFDOwkvKiAoMjIxQykgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZhcF9wc2Nfc2duX25vcm1fY250bDsgLyogUHJvZ3JhbW1hYmxlIFN0cmVhbSBDb250cm9sIFNpZ25lZCBOb3JtYWxpemUgQ29udHJvbCAoMjFEQykgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZhcF9jbGlwX2NudGw7CiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB2YXBfY2xpcDsKLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazIyODg7CS8qICgyMjg4KSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdmFwX3B2c192dHhfdGltZW91dF9yZWc7CS8qIFZlcnRleCB0aW1lb3V0IHJlZ2lzdGVyICgyMjg4KSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gcHZzOwkvKiBwdnNfY250bCAoMjJEMCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGdiX2VuYWJsZTsJLyogKDQwMDgpICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBnYl9taXNjOwkvKiBNdWx0aXNhbXBsaW5nIHBvc2l0aW9uIHNoaWZ0cyA/ICg0MDEwKSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNDIwMDsJLyogKDQyMDApICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0MjE0OwkvKiAoNDIxNCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGdhX3BvaW50X3MwOwkvKiBTIFRleHR1cmUgQ29vcmRpbmF0ZSBvZiBWZXJ0ZXggMCBmb3IgUG9pbnQgdGV4dHVyZSBzdHVmZmluZyAoTExDKSAoNDIwMCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGdhX3RyaWFuZ2xlX3N0aXBwbGU7CS8qICg0MjE0KSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gcHM7CS8qIHBvaW50c2l6ZSAoNDIxQykgKi8KLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazQyMzA7CS8qICg0MjMwKSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gZ2FfcG9pbnRfbWlubWF4OwkvKiAoNDIzMCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGxjbnRsOwkvKiBsaW5lIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazQyNjA7CS8qICg0MjYwKSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gZ2FfbGluZV9zdGlwcGxlOwkvKiAoNDI2MCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHNoYWRlOwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gcG9seWdvbl9tb2RlOwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gZm9ncDsJLyogZm9nIHBhcmFtZXRlcnMgKDQyOTQpICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0MjlDOwkvKiAoNDI5QykgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGdhX3NvZnRfcmVzZXQ7CS8qICg0MjlDKSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gemJpYXNfY250bDsKIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHpiczsJLyogemJpYXMgKDQyQTQpICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBvY2NsdXNpb25fY250bDsKIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGN1bDsJLyogY3VsbCBjbnRsICg0MkI4KSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNDJDMDsJLyogKDQyQzApICovCisJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBzdV9kZXB0aF9zY2FsZTsJLyogKDQyQzApICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSByYzsJLyogcnMgY29udHJvbCAoNDMwMCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHJpOwkvKiBycyBpbnRlcnBvbGF0b3JzICg0MzEwKSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gcnI7CS8qIHJzIHJvdXRlICg0MzMwKSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNDNBNDsJLyogKDQzQTQpICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0M0U4OwkvKiAoNDNFOCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHNjX2h5cGVyejsJLyogKDQzQTQpICovCisJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBzY19zY3JlZW5kb29yOwkvKiAoNDNFOCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGZwOwkvKiBmcmFnbWVudCBwcm9ncmFtIGNudGwgKyBub2RlcyAoNDYwMCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGZwdDsJLyogdGV4aSAtICg0NjIwKSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNDZBNDsJLyogKDQ2QTQpICovCisJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1c19vdXRfZm10OwkvKiAoNDZBNCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHI1MDBmcDsJLyogcjUwMCBmcCBpbnN0cnVjdGlvbnMgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHI1MDBmcF9jb25zdDsJLyogcjUwMCBmcCBjb25zdGFudHMgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGZwaVs0XTsJLyogZnAgaW5zdHJ1Y3Rpb25zICg0NkMwLzQ3QzAvNDhDMC80OUMwKSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gZm9nczsJLyogZm9nIHN0YXRlICg0QkMwKSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gZm9nYzsJLyogZm9nIGNvbG9yICg0QkM4KSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gYXQ7CS8qIGFscGhhIHRlc3QgKDRCRDQpICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0QkQ4OwkvKiAoNEJEOCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIGZnX2RlcHRoX3NyYzsJLyogKDRCRDgpICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBmcHA7CS8qIDB4NEMwMCBhbmQgZm9sbG93aW5nICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0RTAwOwkvKiAoNEUwMCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHJiM2RfY2N0bDsJLyogKDRFMDApICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBibGQ7CS8qIGJsZW5kaW5nICg0RTA0KSAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gY21rOwkvKiBjb2xvcm1hc2sgKDRFMEMpICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSBibGVuZF9jb2xvcjsJLyogY29uc3RhbnQgYmxlbmQgY29sb3IgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHJvcDsJLyogcm9wY250bCAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gY2I7CS8qIGNvbG9yYnVmZmVyICg0RTI4KSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNEU1MDsJLyogKDRFNTApICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0RTg4OwkvKiAoNEU4OCkgKi8KLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazRFQTA7CS8qICg0RTg4KSBJIHNhdyBpdCBvbmx5IHdyaXR0ZW4gb24gUlYzNTAgaGFyZHdhcmUuLiAgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHJiM2RfZGl0aGVyX2N0bDsJLyogKDRFNTApICovCisJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSByYjNkX2FhcmVzb2x2ZV9jdGw7CS8qICg0RTg4KSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gcmIzZF9kaXNjYXJkX3NyY19waXhlbF9sdGVfdGhyZXNob2xkOwkvKiAoNEU4OCkgSSBzYXcgaXQgb25seSB3cml0dGVuIG9uIFJWMzUwIGhhcmR3YXJlLi4gICovCiAJc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB6czsJLyogenN0ZW5jaWwgY29udHJvbCAoNEYwMCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHpzdGVuY2lsX2Zvcm1hdDsKIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHpiOwkvKiB6IGJ1ZmZlciAoNEYyMCkgKi8KLQlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazRGMjg7CS8qICg0RjI4KSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gemJfZGVwdGhjbGVhcnZhbHVlOwkvKiAoNEYyOCkgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHVuazRGMzA7CS8qICg0RjMwKSAqLwotCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdW5rNEY0NDsJLyogKDRGNDQpICovCi0Jc3RydWN0IHIzMDBfc3RhdGVfYXRvbSB1bms0RjU0OwkvKiAoNEY1NCkgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHpiX2hpel9vZmZzZXQ7CS8qICg0RjQ0KSAqLworCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gemJfaGl6X3BpdGNoOwkvKiAoNEY1NCkgKi8KIAogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdnBpOwkvKiB2cCBpbnN0cnVjdGlvbnMgKi8KIAlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZwcDsJLyogdnAgcGFyYW1ldGVycyAqLwogCXN0cnVjdCByMzAwX3N0YXRlX2F0b20gdnBzOwkvKiB2ZXJ0ZXggcG9pbnQgc2l6ZSAoPykgKi8KKwlzdHJ1Y3QgcjMwMF9zdGF0ZV9hdG9tIHZwdWNwWzZdOwkvKiB2cCB1c2VyIGNsaXAgcGxhbmUgLSA2ICovCiAJLyogOCB0ZXh0dXJlIHVuaXRzICovCiAJLyogdGhlIHN0YXRlIGlzIGdyb3VwZWQgYnkgZnVuY3Rpb24gYW5kIG5vdCBieQogCSAgIHRleHR1cmUgdW5pdC4gVGhpcyBtYWtlcyBzaW5nbGUgdW5pdCB1cGRhdGVzCkBAIC01NDYsOSArNTc0LDcgQEAKIH07CiAKIHN0cnVjdCByMzAwX3N0ZW5jaWxidWZmZXJfc3RhdGUgewotCUdMdWludCBjbGVhcjsKIAlHTGJvb2xlYW4gaHdfc3RlbmNpbDsKLQogfTsKIAogLyogVmVydGV4IHNoYWRlciBzdGF0ZSAqLwpAQCAtNTk2LDYgKzYyMiw3IEBACiBzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbV9rZXkgewogCUdMdWludCBJbnB1dHNSZWFkOwogCUdMdWludCBPdXRwdXRzV3JpdHRlbjsKKwlHTHVpbnQgT3V0cHV0c0FkZGVkOwogfTsKIAogc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gewpAQCAtNjI3LDgyICs2NTQsNzUgQEAKICNkZWZpbmUgUEZTX05VTV9URU1QX1JFR1MJMzIKICNkZWZpbmUgUEZTX05VTV9DT05TVF9SRUdTCTE2CiAKLS8qIE1hcHBpbmcgTWVzYSByZWdpc3RlcnMgdG8gUjMwMCB0ZW1wb3JhcmllcyAqLwotc3RydWN0IHJlZ19hY2MgewotCWludCByZWc7CQkvKiBBc3NpZ25lZCBodyB0ZW1wICovCi0JdW5zaWduZWQgaW50IHJlZmNvdW50OwkvKiBOdW1iZXIgb2YgdXNlcyBieSBtZXNhIHByb2dyYW0gKi8KK3N0cnVjdCByMzAwX3Bmc19jb21waWxlX3N0YXRlOworCisKKy8qKgorICogU3RvcmVzIHN0YXRlIHRoYXQgaW5mbHVlbmNlcyB0aGUgY29tcGlsYXRpb24gb2YgYSBmcmFnbWVudCBwcm9ncmFtLgorICovCitzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2V4dGVybmFsX3N0YXRlIHsKKwlzdHJ1Y3QgeworCQkvKioKKwkJICogSWYgdGhlIHNhbXBsZXIgaXMgdXNlZCBhcyBhIHNoYWRvdyBzYW1wbGVyLAorCQkgKiB0aGlzIGZpZWxkIGlzOgorCQkgKiAgMCAtIEdMX0xVTUlOQU5DRQorCQkgKiAgMSAtIEdMX0lOVEVOU0lUWQorCQkgKiAgMiAtIEdMX0FMUEhBCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZGVwdGggdGV4dHVyZSBtb2RlLgorCQkgKi8KKwkJR0x1aW50IGRlcHRoX3RleHR1cmVfbW9kZSA6IDI7CisKKwkJLyoqCisJCSAqIElmIHRoZSBzYW1wbGVyIGlzIHVzZWQgYXMgYSBzaGFkb3cgc2FtcGxlciwKKwkJICogdGhpcyBmaWVsZCBpcyAodGV4dHVyZV9jb21wYXJlX2Z1bmMgLSBHTF9ORVZFUikuCisJCSAqIFtlLmcuIGlmIGNvbXBhcmUgZnVuY3Rpb24gaXMgR0xfTEVRVUFMLCB0aGlzIGZpZWxkIGlzIDNdCisJCSAqCisJCSAqIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyAwLgorCQkgKi8KKwkJR0x1aW50IHRleHR1cmVfY29tcGFyZV9mdW5jIDogMzsKKwl9IHVuaXRbMTZdOworfTsKKworCitzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX25vZGUgeworCWludCB0ZXhfb2Zmc2V0OyAvKio8IGZpcnN0IHRleCBpbnN0cnVjdGlvbiAqLworCWludCB0ZXhfZW5kOyAvKio8IGxhc3QgdGV4IGluc3RydWN0aW9uLCByZWxhdGl2ZSB0byB0ZXhfb2Zmc2V0ICovCisJaW50IGFsdV9vZmZzZXQ7IC8qKjwgZmlyc3QgQUxVIGluc3RydWN0aW9uICovCisJaW50IGFsdV9lbmQ7IC8qKjwgbGFzdCBBTFUgaW5zdHJ1Y3Rpb24sIHJlbGF0aXZlIHRvIGFsdV9vZmZzZXQgKi8KKwlpbnQgZmxhZ3M7CiB9OwogCiAvKioKLSAqIERlc2NyaWJlIHRoZSBjdXJyZW50IGxpZmV0aW1lIGluZm9ybWF0aW9uIGZvciBhbiBSMzAwIHRlbXBvcmFyeQorICogU3RvcmVzIGFuIFIzMDAgZnJhZ21lbnQgcHJvZ3JhbSBpbiBpdHMgY29tcGlsZWQtdG8taGFyZHdhcmUgZm9ybS4KICAqLwotc3RydWN0IHJlZ19saWZldGltZSB7Ci0JLyogSW5kZXggb2YgdGhlIGZpcnN0IHNsb3Qgd2hlcmUgdGhpcyByZWdpc3RlciBpcyBmcmVlIGluIHRoZSBzZW5zZQotCSAgIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYSBuZXcgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi0JICAgVGhpcyBpcyAtMSBpZiB0aGUgcmVnaXN0ZXIgaGFzIGJlZW4gYXNzaWduZWQgdG8gYSBNZXNhIHJlZ2lzdGVyCi0JICAgYW5kIHRoZSBsYXN0IGFjY2VzcyB0byB0aGUgcmVnaXN0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBlbWl0dGVkICovCi0JaW50IGZyZWU7CitzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgeworCXN0cnVjdCB7CisJCWludCBsZW5ndGg7IC8qKjwgdG90YWwgIyBvZiB0ZXh0dXJlIGluc3RydWN0aW9ucyB1c2VkICovCisJCUdMdWludCBpbnN0W1BGU19NQVhfVEVYX0lOU1RdOworCX0gdGV4OwogCi0JLyogSW5kZXggb2YgdGhlIGZpcnN0IHNsb3Qgd2hlcmUgdGhpcyByZWdpc3RlciBpcyBjdXJyZW50bHkgcmVzZXJ2ZWQuCi0JICAgVGhpcyBpcyB1c2VkIHRvIHN0b3AgZS5nLiBhIHNjYWxhciBvcGVyYXRpb24gZnJvbSBiZWluZyBtb3ZlZAotCSAgIGJlZm9yZSB0aGUgYWxsb2NhdGlvbiB0aW1lIG9mIGEgcmVnaXN0ZXIgdGhhdCB3YXMgZmlyc3QgYWxsb2NhdGVkCi0JICAgZm9yIGEgdmVjdG9yIG9wZXJhdGlvbi4gKi8KLQlpbnQgcmVzZXJ2ZWQ7CisJc3RydWN0IHsKKwkJaW50IGxlbmd0aDsgLyoqPCB0b3RhbCAjIG9mIEFMVSBpbnN0cnVjdGlvbnMgdXNlZCAqLworCQlzdHJ1Y3QgeworCQkJR0x1aW50IGluc3QwOworCQkJR0x1aW50IGluc3QxOworCQkJR0x1aW50IGluc3QyOworCQkJR0x1aW50IGluc3QzOworCQl9IGluc3RbUEZTX01BWF9BTFVfSU5TVF07CisJfSBhbHU7CiAKLQkvKiBJbmRleCBvZiB0aGUgZmlyc3Qgc2xvdCBpbiB3aGljaCB0aGUgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgYQotCSAgIHNvdXJjZSB3aXRob3V0IGxvc2luZyB0aGUgdmFsdWUgdGhhdCBpcyB3cml0dGVuIGJ5IHRoZSBsYXN0Ci0JICAgZW1pdHRlZCBpbnN0cnVjdGlvbiB0aGF0IHdyaXRlcyB0byB0aGUgcmVnaXN0ZXIgKi8KLQlpbnQgdmVjdG9yX3ZhbGlkOwotCWludCBzY2FsYXJfdmFsaWQ7CisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9ub2RlIG5vZGVbNF07CisJaW50IGN1cl9ub2RlOworCWludCBmaXJzdF9ub2RlX2hhc190ZXg7CiAKLQkvKiBJbmRleCB0byB0aGUgc2xvdCB3aGVyZSB0aGUgcmVnaXN0ZXIgd2FzIGxhc3QgcmVhZC4KLQkgICBUaGlzIGlzIGFsc28gdGhlIGZpcnN0IHNsb3QgaW4gd2hpY2ggdGhlIHJlZ2lzdGVyIG1heSBiZSB3cml0dGVuIGFnYWluICovCi0JaW50IHZlY3Rvcl9sYXN0cmVhZDsKLQlpbnQgc2NhbGFyX2xhc3RyZWFkOwotfTsKKwkvKioKKwkgKiBSZW1lbWJlciB3aGljaCBwcm9ncmFtIHJlZ2lzdGVyIGEgZ2l2ZW4gaGFyZHdhcmUgY29uc3RhbnQKKwkgKiBiZWxvbmdzIHRvLgorCSAqLworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBjb25zdGFudFtQRlNfTlVNX0NPTlNUX1JFR1NdOworCWludCBjb25zdF9ucjsKIAotLyoqCi0gKiBTdG9yZSB1c2FnZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBBTFUgaW5zdHJ1Y3Rpb24gc2xvdCBkdXJpbmcgdGhlCi0gKiBjb21waWxhdGlvbiBvZiBhIGZyYWdtZW50IHByb2dyYW0uCi0gKi8KLSNkZWZpbmUgU0xPVF9TUkNfVkVDVE9SICAoMTw8MCkKLSNkZWZpbmUgU0xPVF9TUkNfU0NBTEFSICAoMTw8MykKLSNkZWZpbmUgU0xPVF9TUkNfQk9USCAgICAoU0xPVF9TUkNfVkVDVE9SIHwgU0xPVF9TUkNfU0NBTEFSKQotI2RlZmluZSBTTE9UX09QX1ZFQ1RPUiAgICgxPDwxNikKLSNkZWZpbmUgU0xPVF9PUF9TQ0FMQVIgICAoMTw8MTcpCi0jZGVmaW5lIFNMT1RfT1BfQk9USCAgICAgKFNMT1RfT1BfVkVDVE9SIHwgU0xPVF9PUF9TQ0FMQVIpCi0KLXN0cnVjdCByMzAwX3Bmc19jb21waWxlX3Nsb3QgewotCS8qIEJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgc2xvdCBhcmUgdXNlZCwgdXNpbmcgU0xPVF8gY29uc3RhbnRzCi0JICAgZGVmaW5lZCBhYm92ZSAqLwotCXVuc2lnbmVkIGludCB1c2VkOwotCi0JLyogU2VsZWN0ZWQgc291cmNlcyAqLwotCWludCB2c3JjWzNdOwotCWludCBzc3JjWzNdOwotfTsKLQotLyoqCi0gKiBTdG9yZSBpbmZvcm1hdGlvbiBkdXJpbmcgY29tcGlsYXRpb24gb2YgZnJhZ21lbnQgcHJvZ3JhbXMuCi0gKi8KLXN0cnVjdCByMzAwX3Bmc19jb21waWxlX3N0YXRlIHsKLQlpbnQgbnJzbG90czsJCS8qIG51bWJlciBvZiBBTFUgc2xvdHMgdXNlZCBzbyBmYXIgKi8KLQotCS8qIFRyYWNrIHdoaWNoIChwYXJ0cyBvZikgc2xvdHMgYXJlIGFscmVhZHkgZmlsbGVkIHdpdGggaW5zdHJ1Y3Rpb25zICovCi0Jc3RydWN0IHIzMDBfcGZzX2NvbXBpbGVfc2xvdCBzbG90W1BGU19NQVhfQUxVX0lOU1RdOwotCi0JLyogVHJhY2sgdGhlIHZhbGlkaXR5IG9mIFIzMDAgdGVtcG9yYXJpZXMgKi8KLQlzdHJ1Y3QgcmVnX2xpZmV0aW1lIGh3dGVtcHNbUEZTX05VTV9URU1QX1JFR1NdOwotCi0JLyogVXNlZCB0byBtYXAgTWVzYSdzIGlucHV0cy90ZW1wcyBvbnRvIGhhcmR3YXJlIHRlbXBzICovCi0JaW50IHRlbXBfaW5fdXNlOwotCXN0cnVjdCByZWdfYWNjIHRlbXBzW1BGU19OVU1fVEVNUF9SRUdTXTsKLQlzdHJ1Y3QgcmVnX2FjYyBpbnB1dHNbMzJdOwkvKiBkb24ndCBhY3R1YWxseSBuZWVkIDMyLi4uICovCi0KLQkvKiBUcmFjayB1c2FnZSBvZiBoYXJkd2FyZSB0ZW1wcywgZm9yIHJlZ2lzdGVyIGFsbG9jYXRpb24sCi0JICogaW5kaXJlY3Rpb24gZGV0ZWN0aW9uLCBldGMuICovCi0JR0x1aW50IHVzZWRfaW5fbm9kZTsKLQlHTHVpbnQgZGVzdF9pbl9ub2RlOworCWludCBtYXhfdGVtcF9pZHg7CiB9OwogCiAvKioKQEAgLTcxMiw1MSArNzMyLDc1IEBACiBzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtIHsKIAlzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSBtZXNhX3Byb2dyYW07CiAKLQlHTGNvbnRleHQgKmN0eDsKIAlHTGJvb2xlYW4gdHJhbnNsYXRlZDsKIAlHTGJvb2xlYW4gZXJyb3I7Ci0Jc3RydWN0IHIzMDBfcGZzX2NvbXBpbGVfc3RhdGUgKmNzOwogCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9leHRlcm5hbF9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgY29kZTsKKworCUdMYm9vbGVhbiBXcml0ZXNEZXB0aDsKKwlHTHVpbnQgb3B0aW1pemF0aW9uOworfTsKKworc3RydWN0IHI1MDBfcGZzX2NvbXBpbGVfc3RhdGU7CisKK3N0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fZXh0ZXJuYWxfc3RhdGUgewogCXN0cnVjdCB7Ci0JCWludCBsZW5ndGg7Ci0JCUdMdWludCBpbnN0W1BGU19NQVhfVEVYX0lOU1RdOwotCX0gdGV4OworCQkvKioKKwkJICogSWYgdGhlIHNhbXBsZXIgaXMgdXNlZCBhcyBhIHNoYWRvdyBzYW1wbGVyLAorCQkgKiB0aGlzIGZpZWxkIGlzOgorCQkgKiAgMCAtIEdMX0xVTUlOQU5DRQorCQkgKiAgMSAtIEdMX0lOVEVOU0lUWQorCQkgKiAgMiAtIEdMX0FMUEhBCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZGVwdGggdGV4dHVyZSBtb2RlLgorCQkgKi8KKwkJR0x1aW50IGRlcHRoX3RleHR1cmVfbW9kZSA6IDI7CiAKKwkJLyoqCisJCSAqIElmIHRoZSBzYW1wbGVyIGlzIHVzZWQgYXMgYSBzaGFkb3cgc2FtcGxlciwKKwkJICogdGhpcyBmaWVsZCBpcyAodGV4dHVyZV9jb21wYXJlX2Z1bmMgLSBHTF9ORVZFUikuCisJCSAqIFtlLmcuIGlmIGNvbXBhcmUgZnVuY3Rpb24gaXMgR0xfTEVRVUFMLCB0aGlzIGZpZWxkIGlzIDNdCisJCSAqCisJCSAqIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyAwLgorCQkgKi8KKwkJR0x1aW50IHRleHR1cmVfY29tcGFyZV9mdW5jIDogMzsKKwl9IHVuaXRbMTZdOworfTsKKworc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlIHsKIAlzdHJ1Y3QgewotCQlzdHJ1Y3QgewotCQkJR0x1aW50IGluc3QwOwotCQkJR0x1aW50IGluc3QxOwotCQkJR0x1aW50IGluc3QyOwotCQkJR0x1aW50IGluc3QzOwotCQl9IGluc3RbUEZTX01BWF9BTFVfSU5TVF07Ci0JfSBhbHU7CisJCUdMdWludCBpbnN0MDsKKwkJR0x1aW50IGluc3QxOworCQlHTHVpbnQgaW5zdDI7CisJCUdMdWludCBpbnN0MzsKKwkJR0x1aW50IGluc3Q0OworCQlHTHVpbnQgaW5zdDU7CisJfSBpbnN0WzUxMl07CiAKLQlzdHJ1Y3QgewotCQlpbnQgdGV4X29mZnNldDsKLQkJaW50IHRleF9lbmQ7Ci0JCWludCBhbHVfb2Zmc2V0OwotCQlpbnQgYWx1X2VuZDsKLQkJaW50IGZsYWdzOwotCX0gbm9kZVs0XTsKLQlpbnQgY3VyX25vZGU7Ci0JaW50IGZpcnN0X25vZGVfaGFzX3RleDsKKwlpbnQgaW5zdF9vZmZzZXQ7CisJaW50IGluc3RfZW5kOwogCi0JaW50IGFsdV9vZmZzZXQ7Ci0JaW50IGFsdV9lbmQ7Ci0JaW50IHRleF9vZmZzZXQ7Ci0JaW50IHRleF9lbmQ7Ci0KLQkvKiBIYXJkd2FyZSBjb25zdGFudHMuCi0JICogQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZS4gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwb2ludGVyCi0JICogaXMgc3VwcG9zZWQgdG8gYmUgdXBkYXRlZCB3aGVuIEdMIHN0YXRlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5LCB0aGlzIGlzIGVpdGhlciBhIHBvaW50ZXIgaW50bwotCSAqIGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3Q6OlBhcmFtZXRlclZhbHVlcywgb3IgYSBwb2ludGVyIHRvIGEKLQkgKiBnbG9iYWwgY29uc3RhbnQgKGUuZy4gZm9yIHNpbi9jb3MtYXBwcm94aW1hdGlvbikKKwkvKioKKwkgKiBSZW1lbWJlciB3aGljaCBwcm9ncmFtIHJlZ2lzdGVyIGEgZ2l2ZW4gaGFyZHdhcmUgY29uc3RhbnQKKwkgKiBiZWxvbmdzIHRvLgogCSAqLwotCWNvbnN0IEdMZmxvYXQgKmNvbnN0YW50W1BGU19OVU1fQ09OU1RfUkVHU107CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIGNvbnN0YW50W1BGU19OVU1fQ09OU1RfUkVHU107CiAJaW50IGNvbnN0X25yOwogCiAJaW50IG1heF90ZW1wX2lkeDsKK307CisKK3N0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0geworCXN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtIG1lc2FfcHJvZ3JhbTsKKworCUdMY29udGV4dCAqY3R4OworCUdMYm9vbGVhbiB0cmFuc2xhdGVkOworCUdMYm9vbGVhbiBlcnJvcjsKKworCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fZXh0ZXJuYWxfc3RhdGUgc3RhdGU7CisJc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlIGNvZGU7CisKKwlHTGJvb2xlYW4gd3JpdGVzX2RlcHRoOwogCiAJR0x1aW50IG9wdGltaXphdGlvbjsKIH07CkBAIC03NzIsNyArODE2LDYgQEAKIAlzdHJ1Y3QgcjMwMF90ZXh0dXJlX3N0YXRlIHRleHR1cmU7CiAJaW50IHN3X3RjbF9pbnB1dHNbVkVSVF9BVFRSSUJfTUFYXTsKIAlzdHJ1Y3QgcjMwMF92ZXJ0ZXhfc2hhZGVyX3N0YXRlIHZlcnRleF9zaGFkZXI7Ci0Jc3RydWN0IHIzMDBfcGZzX2NvbXBpbGVfc3RhdGUgcGZzX2NvbXBpbGU7CiAJc3RydWN0IHIzMDBfZG1hX3JlZ2lvbiBhb3NbUjMwMF9NQVhfQU9TX0FSUkFZU107CiAJaW50IGFvc19jb3VudDsKIApAQCAtNzk1LDcgKzgzOCw3IEBACiAgKi8KIHN0cnVjdCByMzAwX3N3dGNsX2luZm8gewogICAgR0x1aW50IFJlbmRlckluZGV4OwotICAgCisKICAgIC8qKgogICAgICogU2l6ZSBvZiBhIGhhcmR3YXJlIHZlcnRleC4gIFRoaXMgaXMgY2FsY3VsYXRlZCB3aGVuIFxjIDo6dmVydGV4X2F0dHJzIGlzCiAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIE1lc2Egc3RhdGUgdmVjdG9yLgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2VtaXQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9lbWl0LmMKaW5kZXggNDI0YmY0NC4uMmVhMTdhZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2VtaXQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfZW1pdC5jCkBAIC0yMDcsNDkgKzIwNyw1NyBAQAogCX0KIH0KIAotc3RhdGljIEdMdWludCByMzAwVkFQSW5wdXRSb3V0ZTAodWludDMyX3QgKiBkc3QsIEdMdmVjdG9yNGYgKiogYXR0cmlicHRyLAorI2RlZmluZSBEV19TSVpFKHgpICgoaW5wdXRzW3RhYlsoeCldXSA8PCBSMzAwX0RTVF9WRUNfTE9DX1NISUZUKSB8CVwKKwkJICAgIChhdHRyaWJwdHJbdGFiWyh4KV1dLT5zaXplIC0gMSkgPDwgUjMwMF9EQVRBX1RZUEVfMF9TSElGVCkKKworR0x1aW50IHIzMDBWQVBJbnB1dFJvdXRlMCh1aW50MzJfdCAqIGRzdCwgR0x2ZWN0b3I0ZiAqKiBhdHRyaWJwdHIsCiAJCQkJIGludCAqaW5wdXRzLCBHTGludCAqIHRhYiwgR0x1aW50IG5yKQogewogCUdMdWludCBpLCBkdzsKIAogCS8qIHR5cGUsIGlucHV0cywgc3RvcCBiaXQsIHNpemUgKi8KLQlmb3IgKGkgPSAwOyBpICsgMSA8IG5yOyBpICs9IDIpIHsKLQkJZHcgPSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUIHwgKGlucHV0c1t0YWJbaV1dIDw8IDgpIHwgKGF0dHJpYnB0clt0YWJbaV1dLT5zaXplIC0gMSk7Ci0JCWR3IHw9IChSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUIHwgKGlucHV0c1t0YWJbaSArIDFdXSA8PCA4KSB8IChhdHRyaWJwdHJbdGFiW2kgKyAxXV0tPnNpemUgLSAxKSkgPDwgMTY7Ci0JCWlmIChpICsgMiA9PSBucikgewotCQkJZHcgfD0gKFIzMDBfVkFQX0lOUFVUX1JPVVRFX0VORCA8PCAxNik7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpICs9IDIpIHsKKwkJLyogbWFrZSBzdXJlIGlucHV0IGlzIHZhbGlkLCB3b3VsZCBsb2NrdXAgdGhlIGdwdSAqLworCQlhc3NlcnQoaW5wdXRzW3RhYltpXV0gIT0gLTEpOworCQlkdyA9IChSMzAwX1NJR05FRCB8IERXX1NJWkUoaSkpOworCQlpZiAoaSArIDEgPT0gbnIpIHsKKwkJCWR3IHw9IFIzMDBfTEFTVF9WRUMgPDwgUjMwMF9EQVRBX1RZUEVfMF9TSElGVDsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydChpbnB1dHNbdGFiW2kgKyAxXV0gIT0gLTEpOworCQkJZHcgfD0gKFIzMDBfU0lHTkVEIHwKKwkJCSAgICAgICBEV19TSVpFKGkgKyAxKSkgPDwgUjMwMF9EQVRBX1RZUEVfMV9TSElGVDsKKwkJCWlmIChpICsgMiA9PSBucikgeworCQkJCWR3IHw9IFIzMDBfTEFTVF9WRUMgPDwgUjMwMF9EQVRBX1RZUEVfMV9TSElGVDsKKwkJCX0KIAkJfQogCQlkc3RbaSA+PiAxXSA9IGR3OwogCX0KIAotCWlmIChuciAmIDEpIHsKLQkJZHcgPSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUIHwgKGlucHV0c1t0YWJbbnIgLSAxXV0gPDwgOCkgfCAoYXR0cmlicHRyW3RhYltuciAtIDFdXS0+c2l6ZSAtIDEpOwotCQlkdyB8PSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9FTkQ7Ci0JCWRzdFtuciA+PiAxXSA9IGR3OwotCX0KLQogCXJldHVybiAobnIgKyAxKSA+PiAxOwogfQogCiBzdGF0aWMgR0x1aW50IHIzMDBWQVBJbnB1dFJvdXRlMVN3aXp6bGUoaW50IHN3aXp6bGVbNF0pCiB7Ci0JcmV0dXJuIChzd2l6emxlWzBdIDw8IFIzMDBfSU5QVVRfUk9VVEVfWF9TSElGVCkgfAotCSAgICAoc3dpenpsZVsxXSA8PCBSMzAwX0lOUFVUX1JPVVRFX1lfU0hJRlQpIHwKLQkgICAgKHN3aXp6bGVbMl0gPDwgUjMwMF9JTlBVVF9ST1VURV9aX1NISUZUKSB8Ci0JICAgIChzd2l6emxlWzNdIDw8IFIzMDBfSU5QVVRfUk9VVEVfV19TSElGVCk7CisJcmV0dXJuIChzd2l6emxlWzBdIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfWF9TSElGVCkgfAorCSAgICAoc3dpenpsZVsxXSA8PCBSMzAwX1NXSVpaTEVfU0VMRUNUX1lfU0hJRlQpIHwKKwkgICAgKHN3aXp6bGVbMl0gPDwgUjMwMF9TV0laWkxFX1NFTEVDVF9aX1NISUZUKSB8CisJICAgIChzd2l6emxlWzNdIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfV19TSElGVCk7CiB9CiAKIEdMdWludCByMzAwVkFQSW5wdXRSb3V0ZTEodWludDMyX3QgKiBkc3QsIGludCBzd2l6emxlW11bNF0sIEdMdWludCBucikKIHsKLQlHTHVpbnQgaTsKKwlHTHVpbnQgaSwgZHc7CiAKLQlmb3IgKGkgPSAwOyBpICsgMSA8IG5yOyBpICs9IDIpIHsKLQkJZHN0W2kgPj4gMV0gPSByMzAwVkFQSW5wdXRSb3V0ZTFTd2l6emxlKHN3aXp6bGVbaV0pIHwgUjMwMF9JTlBVVF9ST1VURV9FTkFCTEU7Ci0JCWRzdFtpID4+IDFdIHw9IChyMzAwVkFQSW5wdXRSb3V0ZTFTd2l6emxlKHN3aXp6bGVbaSArIDFdKSB8IFIzMDBfSU5QVVRfUk9VVEVfRU5BQkxFKSA8PCAxNjsKLQl9Ci0KLQlpZiAobnIgJiAxKSB7Ci0JCWRzdFtuciA+PiAxXSA9IHIzMDBWQVBJbnB1dFJvdXRlMVN3aXp6bGUoc3dpenpsZVtuciAtIDFdKSB8IFIzMDBfSU5QVVRfUk9VVEVfRU5BQkxFOworCWZvciAoaSA9IDA7IGkgPCBucjsgaSArPSAyKSB7CisJCWR3ID0gKHIzMDBWQVBJbnB1dFJvdXRlMVN3aXp6bGUoc3dpenpsZVtpXSkgfAorCQkgICAgICAoKFIzMDBfV1JJVEVfRU5BX1ggfCBSMzAwX1dSSVRFX0VOQV9ZIHwKKwkJCVIzMDBfV1JJVEVfRU5BX1ogfCBSMzAwX1dSSVRFX0VOQV9XKSA8PCBSMzAwX1dSSVRFX0VOQV9TSElGVCkpIDw8IFIzMDBfU1dJWlpMRTBfU0hJRlQ7CisJCWlmIChpICsgMSA8IG5yKSB7CisJCQlkdyB8PSAocjMwMFZBUElucHV0Um91dGUxU3dpenpsZShzd2l6emxlW2kgKyAxXSkgfAorCQkJICAgICAgICgoUjMwMF9XUklURV9FTkFfWCB8IFIzMDBfV1JJVEVfRU5BX1kgfAorCQkJCSBSMzAwX1dSSVRFX0VOQV9aIHwgUjMwMF9XUklURV9FTkFfVykgPDwgUjMwMF9XUklURV9FTkFfU0hJRlQpKSA8PCBSMzAwX1NXSVpaTEUxX1NISUZUOworCQl9CisJCWRzdFtpID4+IDFdID0gZHc7CiAJfQogCiAJcmV0dXJuIChuciArIDEpID4+IDE7CkBAIC0yOTQsNyArMzAyLDcgQEAKIAkJcmV0IHw9IFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX1BPU19QUkVTRU5UOwogCiAJaWYgKE91dHB1dHNXcml0dGVuICYgKDEgPDwgVkVSVF9SRVNVTFRfQ09MMCkpCi0JCXJldCB8PSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UOworCQlyZXQgfD0gUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMF9QUkVTRU5UOwogCiAJaWYgKE91dHB1dHNXcml0dGVuICYgKDEgPDwgVkVSVF9SRVNVTFRfQ09MMSkpCiAJCXJldCB8PSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQ7CkBAIC01MzYsMTYgKzU0NCwxNiBAQAogCiB2b2lkIHIzMDBFbWl0Q2FjaGVGbHVzaChyMzAwQ29udGV4dFB0ciBybWVzYSkKIHsKLSAgICAgICAgaW50IGNtZF9yZXNlcnZlZCA9IDA7CisJaW50IGNtZF9yZXNlcnZlZCA9IDA7CiAJaW50IGNtZF93cml0dGVuID0gMDsKIAogCWRybV9yYWRlb25fY21kX2hlYWRlcl90ICpjbWQgPSBOVUxMOwogCiAJcmVnX3N0YXJ0KFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFULCAwKTsKLQllMzIoUjMwMF9SQjNEX0RTVENBQ0hFX1VOS05PV05fMEEpOworCWUzMihSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVF9EQ19GUkVFX0ZSRUVfM0RfVEFHUyB8CisJICAgIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUX0RDX0ZMVVNIX0ZMVVNIX0RJUlRZXzNEKTsKIAotCXJlZ19zdGFydChSMzAwX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDApOwotCWUzMihSMzAwX1JCM0RfWkNBQ0hFX1VOS05PV05fMDMpOwotCi0KKwlyZWdfc3RhcnQoUjMwMF9aQl9aQ0FDSEVfQ1RMU1RBVCwgMCk7CisJZTMyKFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfRkxVU0hfRkxVU0hfQU5EX0ZSRUUgfAorCSAgICBSMzAwX1pCX1pDQUNIRV9DVExTVEFUX1pDX0ZSRUVfRlJFRSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfZW1pdC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2VtaXQuaAppbmRleCBhNmQ2OWVjLi41OTUwNTM5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfZW1pdC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9lbWl0LmgKQEAgLTUwLDcgKzUwLDcgQEAKICNkZWZpbmUgQ1BfUEFDS0VUMyggcGt0LCBuICkJCQkJCQlcCiAJKFJBREVPTl9DUF9QQUNLRVQzIHwgKHBrdCkgfCAoKG4pIDw8IDE2KSkKIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBjbWRwYWNrZXQwKGludCByZWcsIGludCBjb3VudCkKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QgY21kcGFja2V0MChpbnQgcmVnLCBpbnQgY291bnQpCiB7CiAJZHJtX3IzMDBfY21kX2hlYWRlcl90IGNtZDsKIApAQCAtNjIsNyArNjIsNyBAQAogCXJldHVybiBjbWQudTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBjbWR2cHUoaW50IGFkZHIsIGludCBjb3VudCkKK3N0YXRpYyBJTkxJTkUgdWludDMyX3QgY21kdnB1KGludCBhZGRyLCBpbnQgY291bnQpCiB7CiAJZHJtX3IzMDBfY21kX2hlYWRlcl90IGNtZDsKIApAQCAtNzQsNyArNzQsMjEgQEAKIAlyZXR1cm4gY21kLnU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgY21kcGFja2V0MyhpbnQgcGFja2V0KQorc3RhdGljIElOTElORSB1aW50MzJfdCBjbWRyNTAwZnAoaW50IGFkZHIsIGludCBjb3VudCwgaW50IHR5cGUsIGludCBjbGFtcCkKK3sKKwlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgY21kOworCisJY21kLnI1MDBmcC5jbWRfdHlwZSA9IFIzMDBfQ01EX1I1MDBGUDsKKwljbWQucjUwMGZwLmNvdW50ID0gY291bnQ7CisJY21kLnI1MDBmcC5hZHJoaV9mbGFncyA9ICgodW5zaWduZWQgaW50KWFkZHIgJiAweDEwMCkgPj4gODsKKwljbWQucjUwMGZwLmFkcmhpX2ZsYWdzIHw9IHR5cGUgPyBSNTAwRlBfQ09OU1RBTlRfVFlQRSA6IDA7CisJY21kLnI1MDBmcC5hZHJoaV9mbGFncyB8PSBjbGFtcCA/IFI1MDBGUF9DT05TVEFOVF9DTEFNUCA6IDA7CisJY21kLnI1MDBmcC5hZHJsbyA9ICgodW5zaWduZWQgaW50KWFkZHIgJiAweDAwRkYpOworCisJcmV0dXJuIGNtZC51OworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMl90IGNtZHBhY2tldDMoaW50IHBhY2tldCkKIHsKIAlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgY21kOwogCkBAIC04NCw3ICs5OCw3IEBACiAJcmV0dXJuIGNtZC51OwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZGNwZGVsYXkodW5zaWduZWQgc2hvcnQgY291bnQpCitzdGF0aWMgSU5MSU5FIHVpbnQzMl90IGNtZGNwZGVsYXkodW5zaWduZWQgc2hvcnQgY291bnQpCiB7CiAJZHJtX3IzMDBfY21kX2hlYWRlcl90IGNtZDsKIApAQCAtOTQsNyArMTA4LDcgQEAKIAlyZXR1cm4gY21kLnU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgY21kd2FpdCh1bnNpZ25lZCBjaGFyIGZsYWdzKQorc3RhdGljIElOTElORSB1aW50MzJfdCBjbWR3YWl0KHVuc2lnbmVkIGNoYXIgZmxhZ3MpCiB7CiAJZHJtX3IzMDBfY21kX2hlYWRlcl90IGNtZDsKIApAQCAtMTA0LDcgKzExOCw3IEBACiAJcmV0dXJuIGNtZC51OwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZHBhY2lmeSh2b2lkKQorc3RhdGljIElOTElORSB1aW50MzJfdCBjbWRwYWNpZnkodm9pZCkKIHsKIAlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgY21kOwogCkBAIC0xNjYsNiArMTgwLDE5IEBACiAJCWNtZFswXS5pID0gY21kdnB1KChkZXN0KSwgX24vNCk7CQkJXAogCX0gd2hpbGUgKDApOwogCisjZGVmaW5lIHI1MDBmcF9zdGFydF9mcmFnbWVudChkZXN0LCBsZW5ndGgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWludCBfbjsJCQkJCQkJXAorCQlfbiA9IChsZW5ndGgpOwkJCQkJCVwKKwkJY21kID0gKGRybV9yYWRlb25fY21kX2hlYWRlcl90KikJCQlcCisJCQlyMzAwQWxsb2NDbWRCdWYocm1lc2EsCQkJCVwKKwkJCQkJKF9uKzEpLAkJCQlcCisJCQkJCV9fRlVOQ1RJT05fXyk7CQkJXAorCQljbWRfcmVzZXJ2ZWQgPSBfbisxOwkJCQkJXAorCQljbWRfd3JpdHRlbiA9MTsJCQkJCQlcCisJCWNtZFswXS5pID0gY21kcjUwMGZwKChkZXN0KSwgX24vNiwgMCwgMCk7CQlcCisJfSB3aGlsZSAoMCk7CisKICNkZWZpbmUgc3RhcnRfcGFja2V0MyhwYWNrZXQsIGNvdW50KQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJaW50IF9uOwkJCQkJCQlcCkBAIC0xOTEsNyArMjE4LDcgQEAKIC8qKgogICogTXVzdCBiZSBzZW50IHRvIHN3aXRjaCB0byAyZCBjb21tYW5kcwogICovCi12b2lkIHN0YXRpYyBpbmxpbmUgZW5kXzNkKHIzMDBDb250ZXh0UHRyIHJtZXNhKQordm9pZCBzdGF0aWMgSU5MSU5FIGVuZF8zZChyMzAwQ29udGV4dFB0ciBybWVzYSkKIHsKIAlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCAqY21kID0gTlVMTDsKIApAQCAtMjAwLDcgKzIyNyw3IEBACiAJY21kWzBdLmhlYWRlci5jbWRfdHlwZSA9IFIzMDBfQ01EX0VORDNEOwogfQogCi12b2lkIHN0YXRpYyBpbmxpbmUgY3BfZGVsYXkocjMwMENvbnRleHRQdHIgcm1lc2EsIHVuc2lnbmVkIHNob3J0IGNvdW50KQordm9pZCBzdGF0aWMgSU5MSU5FIGNwX2RlbGF5KHIzMDBDb250ZXh0UHRyIHJtZXNhLCB1bnNpZ25lZCBzaG9ydCBjb3VudCkKIHsKIAlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCAqY21kID0gTlVMTDsKIApAQCAtMjA5LDcgKzIzNiw3IEBACiAJY21kWzBdLmkgPSBjbWRjcGRlbGF5KGNvdW50KTsKIH0KIAotdm9pZCBzdGF0aWMgaW5saW5lIGNwX3dhaXQocjMwMENvbnRleHRQdHIgcm1lc2EsIHVuc2lnbmVkIGNoYXIgZmxhZ3MpCit2b2lkIHN0YXRpYyBJTkxJTkUgY3Bfd2FpdChyMzAwQ29udGV4dFB0ciBybWVzYSwgdW5zaWduZWQgY2hhciBmbGFncykKIHsKIAlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCAqY21kID0gTlVMTDsKIApAQCAtMjMwLDYgKzI1Nyw4IEBACiAKIGV4dGVybiB2b2lkIHIzMDBFbWl0Q2FjaGVGbHVzaChyMzAwQ29udGV4dFB0ciBybWVzYSk7CiAKK2V4dGVybiBHTHVpbnQgcjMwMFZBUElucHV0Um91dGUwKHVpbnQzMl90ICogZHN0LCBHTHZlY3RvcjRmICoqIGF0dHJpYnB0ciwKKwkJCQkgaW50ICppbnB1dHMsIEdMaW50ICogdGFiLCBHTHVpbnQgbnIpOwogZXh0ZXJuIEdMdWludCByMzAwVkFQSW5wdXRSb3V0ZTEodWludDMyX3QgKiBkc3QsIGludCBzd2l6emxlW11bNF0sIEdMdWludCBucik7CiBleHRlcm4gR0x1aW50IHIzMDBWQVBJbnB1dENudGwwKEdMY29udGV4dCAqIGN0eCwgR0x1aW50IElucHV0c1JlYWQpOwogZXh0ZXJuIEdMdWludCByMzAwVkFQSW5wdXRDbnRsMShHTGNvbnRleHQgKiBjdHgsIEdMdWludCBJbnB1dHNSZWFkKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9mcmFncHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmMKaW5kZXggY2NlOGU2OC4uNDUzZGRhNyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmMKQEAgLTI4LDE2ICsyOCwxMiBAQAogLyoqCiAgKiBcZmlsZQogICoKKyAqIEZyYWdtZW50IHByb2dyYW0gY29tcGlsZXIuIFBlcmZvcm0gdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBpbnRlcm1lZGlhdGUKKyAqIHJlcHJlc2VudGF0aW9uIHVudGlsIHRoZSBwcm9ncmFtIGlzIGluIGEgZm9ybSB3aGVyZSB3ZSBjYW4gdHJhbnNsYXRlCisgKiBpdCBtb3JlIG9yIGxlc3MgZGlyZWN0bHkgaW50byBtYWNoaW5lLXJlYWRhYmxlIGZvcm0uCisgKgogICogXGF1dGhvciBCZW4gU2tlZ2dzIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+Ci0gKgogICogXGF1dGhvciBKZXJvbWUgR2xpc3NlIDxqLmdsaXNzZUBnbWFpbC5jb20+Ci0gKgotICogXHRvZG8gRGVwdGggd3JpdGUsIFdQT1MvRk9HQyBpbnB1dHMKLSAqCi0gKiBcdG9kbyBGb2dPcHRpb24KLSAqCi0gKiBcdG9kbyBWZXJpZnkgcmVzdWx0cyBvZiBvcGNvZGVzIGZvciBhY2N1cmFjeSwgSSd2ZSBvbmx5IGNoZWNrZWQgdGhlbSBpbgotICogc3BlY2lmaWMgY2FzZXMuCiAgKi8KIAogI2luY2x1ZGUgImdsaGVhZGVyLmgiCkBAIC00OSwxOTUzICs0NSwyMzMgQEAKIAogI2luY2x1ZGUgInIzMDBfY29udGV4dC5oIgogI2luY2x1ZGUgInIzMDBfZnJhZ3Byb2cuaCIKLSNpbmNsdWRlICJyMzAwX3JlZy5oIgorI2luY2x1ZGUgInIzMDBfZnJhZ3Byb2dfc3dpenpsZS5oIgogI2luY2x1ZGUgInIzMDBfc3RhdGUuaCIKIAotLyoKLSAqIFVzZWZ1bGwgbWFjcm9zIGFuZCB2YWx1ZXMKLSAqLwotI2RlZmluZSBFUlJPUihmbXQsIGFyZ3MuLi4pIGRvIHsJCQlcCi0JCWZwcmludGYoc3RkZXJyLCAiJXM6OiVzKCk6ICIgZm10ICJcbiIsCVwKLQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sICMjYXJncyk7CVwKLQkJZnAtPmVycm9yID0gR0xfVFJVRTsJCQlcCi0JfSB3aGlsZSgwKQorI2luY2x1ZGUgInJhZGVvbl9ucXNzYWRjZS5oIgorI2luY2x1ZGUgInJhZGVvbl9wcm9ncmFtX2FsdS5oIgogCi0jZGVmaW5lIFBGU19JTlZBTCAweEZGRkZGRkZGCi0jZGVmaW5lIENPTVBJTEVfU1RBVEUgc3RydWN0IHIzMDBfcGZzX2NvbXBpbGVfc3RhdGUgKmNzID0gZnAtPmNzCiAKLSNkZWZpbmUgU1dJWlpMRV9YWVoJCTAKLSNkZWZpbmUgU1dJWlpMRV9YWFgJCTEKLSNkZWZpbmUgU1dJWlpMRV9ZWVkJCTIKLSNkZWZpbmUgU1dJWlpMRV9aWloJCTMKLSNkZWZpbmUgU1dJWlpMRV9XV1cJCTQKLSNkZWZpbmUgU1dJWlpMRV9ZWlgJCTUKLSNkZWZpbmUgU1dJWlpMRV9aWFkJCTYKLSNkZWZpbmUgU1dJWlpMRV9XWlkJCTcKLSNkZWZpbmUgU1dJWlpMRV8xMTEJCTgKLSNkZWZpbmUgU1dJWlpMRV8wMDAJCTkKLSNkZWZpbmUgU1dJWlpMRV9ISEgJCTEwCi0KLSNkZWZpbmUgc3dpenpsZShyLCB4LCB5LCB6LCB3KSBkb19zd2l6emxlKGZwLCByLAkJXAotCQkJCQkgICgoU1dJWlpMRV8jI3g8PDApfAlcCi0JCQkJCSAgIChTV0laWkxFXyMjeTw8Myl8CVwKLQkJCQkJICAgKFNXSVpaTEVfIyN6PDw2KXwJXAotCQkJCQkgICAoU1dJWlpMRV8jI3c8PDkpKSwJXAotCQkJCQkgIDApCi0KLSNkZWZpbmUgUkVHX1RZUEVfSU5QVVQJCTAKLSNkZWZpbmUgUkVHX1RZUEVfT1VUUFVUCQkxCi0jZGVmaW5lIFJFR19UWVBFX1RFTVAJCTIKLSNkZWZpbmUgUkVHX1RZUEVfQ09OU1QJCTMKLQotI2RlZmluZSBSRUdfVFlQRV9TSElGVAkJMAotI2RlZmluZSBSRUdfSU5ERVhfU0hJRlQJCTIKLSNkZWZpbmUgUkVHX1ZTV1pfU0hJRlQJCTgKLSNkZWZpbmUgUkVHX1NTV1pfU0hJRlQJCTEzCi0jZGVmaW5lIFJFR19ORUdWX1NISUZUCQkxOAotI2RlZmluZSBSRUdfTkVHU19TSElGVAkJMTkKLSNkZWZpbmUgUkVHX0FCU19TSElGVAkJMjAKLSNkZWZpbmUgUkVHX05PX1VTRV9TSElGVAkyMQkvLyBIYWNrIGZvciByZWZjb3VudGluZwotI2RlZmluZSBSRUdfVkFMSURfU0hJRlQJCTIyCS8vIERvZXMgdGhlIHJlZ2lzdGVyIGNvbnRhaW4gYSBkZWZpbmVkIHZhbHVlPwotI2RlZmluZSBSRUdfQlVJTFRJTl9TSElGVCAgIDIzCS8vIElzIGl0IGEgYnVpbHRpbiAobGlrZSBhbGwgemVyby9hbGwgb25lKT8KLQotI2RlZmluZSBSRUdfVFlQRV9NQVNLCQkoMHgwMyA8PCBSRUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgUkVHX0lOREVYX01BU0sJCSgweDNGIDw8IFJFR19JTkRFWF9TSElGVCkKLSNkZWZpbmUgUkVHX1ZTV1pfTUFTSwkJKDB4MUYgPDwgUkVHX1ZTV1pfU0hJRlQpCi0jZGVmaW5lIFJFR19TU1daX01BU0sJCSgweDFGIDw8IFJFR19TU1daX1NISUZUKQotI2RlZmluZSBSRUdfTkVHVl9NQVNLCQkoMHgwMSA8PCBSRUdfTkVHVl9TSElGVCkKLSNkZWZpbmUgUkVHX05FR1NfTUFTSwkJKDB4MDEgPDwgUkVHX05FR1NfU0hJRlQpCi0jZGVmaW5lIFJFR19BQlNfTUFTSwkJKDB4MDEgPDwgUkVHX0FCU19TSElGVCkKLSNkZWZpbmUgUkVHX05PX1VTRV9NQVNLCQkoMHgwMSA8PCBSRUdfTk9fVVNFX1NISUZUKQotI2RlZmluZSBSRUdfVkFMSURfTUFTSwkJKDB4MDEgPDwgUkVHX1ZBTElEX1NISUZUKQotI2RlZmluZSBSRUdfQlVJTFRJTl9NQVNLCSgweDAxIDw8IFJFR19CVUlMVElOX1NISUZUKQotCi0jZGVmaW5lIFJFRyh0eXBlLCBpbmRleCwgdnN3eiwgc3N3eiwgbm91c2UsIHZhbGlkLCBidWlsdGluKQlcCi0JKCgodHlwZSA8PCBSRUdfVFlQRV9TSElGVCkgJiBSRUdfVFlQRV9NQVNLKSB8CQkJXAotCSAoKGluZGV4IDw8IFJFR19JTkRFWF9TSElGVCkgJiBSRUdfSU5ERVhfTUFTSykgfAkJXAotCSAoKG5vdXNlIDw8IFJFR19OT19VU0VfU0hJRlQpICYgUkVHX05PX1VTRV9NQVNLKSB8CQlcCi0JICgodmFsaWQgPDwgUkVHX1ZBTElEX1NISUZUKSAmIFJFR19WQUxJRF9NQVNLKSB8CQlcCi0JICgoYnVpbHRpbiA8PCBSRUdfQlVJTFRJTl9TSElGVCkgJiBSRUdfQlVJTFRJTl9NQVNLKSB8CVwKLQkgKCh2c3d6IDw8IFJFR19WU1daX1NISUZUKSAmIFJFR19WU1daX01BU0spIHwJCQlcCi0JICgoc3N3eiA8PCBSRUdfU1NXWl9TSElGVCkgJiBSRUdfU1NXWl9NQVNLKSkKLSNkZWZpbmUgUkVHX0dFVF9UWVBFKHJlZykJCQkJCQlcCi0JKChyZWcgJiBSRUdfVFlQRV9NQVNLKSA+PiBSRUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9JTkRFWChyZWcpCQkJCQkJXAotCSgocmVnICYgUkVHX0lOREVYX01BU0spID4+IFJFR19JTkRFWF9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9WU1daKHJlZykJCQkJCQlcCi0JKChyZWcgJiBSRUdfVlNXWl9NQVNLKSA+PiBSRUdfVlNXWl9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9TU1daKHJlZykJCQkJCQlcCi0JKChyZWcgJiBSRUdfU1NXWl9NQVNLKSA+PiBSRUdfU1NXWl9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9OT19VU0UocmVnKQkJCQkJCVwKLQkoKHJlZyAmIFJFR19OT19VU0VfTUFTSykgPj4gUkVHX05PX1VTRV9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9WQUxJRChyZWcpCQkJCQkJXAotCSgocmVnICYgUkVHX1ZBTElEX01BU0spID4+IFJFR19WQUxJRF9TSElGVCkKLSNkZWZpbmUgUkVHX0dFVF9CVUlMVElOKHJlZykJCQkJCQlcCi0JKChyZWcgJiBSRUdfQlVJTFRJTl9NQVNLKSA+PiBSRUdfQlVJTFRJTl9TSElGVCkKLSNkZWZpbmUgUkVHX1NFVF9UWVBFKHJlZywgdHlwZSkJCQkJCQlcCi0JcmVnID0gKChyZWcgJiB+UkVHX1RZUEVfTUFTSykgfAkJCQkJXAotCSAgICAgICAoKHR5cGUgPDwgUkVHX1RZUEVfU0hJRlQpICYgUkVHX1RZUEVfTUFTSykpCi0jZGVmaW5lIFJFR19TRVRfSU5ERVgocmVnLCBpbmRleCkJCQkJCVwKLQlyZWcgPSAoKHJlZyAmIH5SRUdfSU5ERVhfTUFTSykgfAkJCQlcCi0JICAgICAgICgoaW5kZXggPDwgUkVHX0lOREVYX1NISUZUKSAmIFJFR19JTkRFWF9NQVNLKSkKLSNkZWZpbmUgUkVHX1NFVF9WU1daKHJlZywgdnN3eikJCQkJCQlcCi0JcmVnID0gKChyZWcgJiB+UkVHX1ZTV1pfTUFTSykgfAkJCQkJXAotCSAgICAgICAoKHZzd3ogPDwgUkVHX1ZTV1pfU0hJRlQpICYgUkVHX1ZTV1pfTUFTSykpCi0jZGVmaW5lIFJFR19TRVRfU1NXWihyZWcsIHNzd3opCQkJCQkJXAotCXJlZyA9ICgocmVnICYgflJFR19TU1daX01BU0spIHwJCQkJCVwKLQkgICAgICAgKChzc3d6IDw8IFJFR19TU1daX1NISUZUKSAmIFJFR19TU1daX01BU0spKQotI2RlZmluZSBSRUdfU0VUX05PX1VTRShyZWcsIG5vdXNlKQkJCQkJXAotCXJlZyA9ICgocmVnICYgflJFR19OT19VU0VfTUFTSykgfAkJCQlcCi0JICAgICAgICgobm91c2UgPDwgUkVHX05PX1VTRV9TSElGVCkgJiBSRUdfTk9fVVNFX01BU0spKQotI2RlZmluZSBSRUdfU0VUX1ZBTElEKHJlZywgdmFsaWQpCQkJCQlcCi0JcmVnID0gKChyZWcgJiB+UkVHX1ZBTElEX01BU0spIHwJCQkJXAotCSAgICAgICAoKHZhbGlkIDw8IFJFR19WQUxJRF9TSElGVCkgJiBSRUdfVkFMSURfTUFTSykpCi0jZGVmaW5lIFJFR19TRVRfQlVJTFRJTihyZWcsIGJ1aWx0aW4pCQkJCQlcCi0JcmVnID0gKChyZWcgJiB+UkVHX0JVSUxUSU5fTUFTSykgfAkJCQlcCi0JICAgICAgICgoYnVpbHRpbiA8PCBSRUdfQlVJTFRJTl9TSElGVCkgJiBSRUdfQlVJTFRJTl9NQVNLKSkKLSNkZWZpbmUgUkVHX0FCUyhyZWcpCQkJCQkJCVwKLQlyZWcgPSAocmVnIHwgUkVHX0FCU19NQVNLKQotI2RlZmluZSBSRUdfTkVHVihyZWcpCQkJCQkJCVwKLQlyZWcgPSAocmVnIHwgUkVHX05FR1ZfTUFTSykKLSNkZWZpbmUgUkVHX05FR1MocmVnKQkJCQkJCQlcCi0JcmVnID0gKHJlZyB8IFJFR19ORUdTX01BU0spCi0KLS8qCi0gKiBEYXRhcyBzdHJ1Y3R1cmVzIGZvciBmcmFnbWVudCBwcm9ncmFtIGdlbmVyYXRpb24KLSAqLwotCi0vKiBkZXNjcmlwdGlvbiBvZiByMzAwIG5hdGl2ZSBodyBpbnN0cnVjdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGFyZ2M7Ci0JaW50IHZfb3A7Ci0JaW50IHNfb3A7Ci19IHIzMDBfZnBvcFtdID0gewotCS8qICpJTkRFTlQtT0ZGKiAqLwotCXsiTUFEIiwgMywgUjMwMF9GUEkwX09VVENfTUFELCBSMzAwX0ZQSTJfT1VUQV9NQUR9LAotCXsiRFAzIiwgMiwgUjMwMF9GUEkwX09VVENfRFAzLCBSMzAwX0ZQSTJfT1VUQV9EUDR9LAotCXsiRFA0IiwgMiwgUjMwMF9GUEkwX09VVENfRFA0LCBSMzAwX0ZQSTJfT1VUQV9EUDR9LAotCXsiTUlOIiwgMiwgUjMwMF9GUEkwX09VVENfTUlOLCBSMzAwX0ZQSTJfT1VUQV9NSU59LAotCXsiTUFYIiwgMiwgUjMwMF9GUEkwX09VVENfTUFYLCBSMzAwX0ZQSTJfT1VUQV9NQVh9LAotCXsiQ01QIiwgMywgUjMwMF9GUEkwX09VVENfQ01QLCBSMzAwX0ZQSTJfT1VUQV9DTVB9LAotCXsiRlJDIiwgMSwgUjMwMF9GUEkwX09VVENfRlJDLCBSMzAwX0ZQSTJfT1VUQV9GUkN9LAotCXsiRVgyIiwgMSwgUjMwMF9GUEkwX09VVENfUkVQTF9BTFBIQSwgUjMwMF9GUEkyX09VVEFfRVgyfSwKLQl7IkxHMiIsIDEsIFIzMDBfRlBJMF9PVVRDX1JFUExfQUxQSEEsIFIzMDBfRlBJMl9PVVRBX0xHMn0sCi0JeyJSQ1AiLCAxLCBSMzAwX0ZQSTBfT1VUQ19SRVBMX0FMUEhBLCBSMzAwX0ZQSTJfT1VUQV9SQ1B9LAotCXsiUlNRIiwgMSwgUjMwMF9GUEkwX09VVENfUkVQTF9BTFBIQSwgUjMwMF9GUEkyX09VVEFfUlNRfSwKLQl7IlJFUExfQUxQSEEiLCAxLCBSMzAwX0ZQSTBfT1VUQ19SRVBMX0FMUEhBLCBQRlNfSU5WQUx9LAotCXsiQ01QSCIsIDMsIFIzMDBfRlBJMF9PVVRDX0NNUEgsIFBGU19JTlZBTH0sCi0JLyogKklOREVOVC1PTiogKi8KLX07Ci0KLS8qIHZlY3RvciBzd2l6emxlcyByMzAwIGNhbiBzdXBwb3J0IG5hdGl2ZWx5LCB3aXRoIGEgY291cGxlIG9mCi0gKiBjYXNlcyB3ZSBoYW5kbGUgc3BlY2lhbGx5Ci0gKgotICogUkVHX1ZTV1ovUkVHX1NTV1ogaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlCi0gKi8KLQotLyogbWFwcGluZyBmcm9tIFNXSVpaTEVfKiB0byByMzAwIG5hdGl2ZSB2YWx1ZXMgZm9yIHNjYWxhciBpbnNucyAqLwotI2RlZmluZSBTV0laWkxFX0hBTEYgNgotCi0jZGVmaW5lIE1BS0VfU1daMyh4LCB5LCB6KSAoTUFLRV9TV0laWkxFNChTV0laWkxFXyMjeCwgXAotCQkJCQkgIFNXSVpaTEVfIyN5LCBcCi0JCQkJCSAgU1dJWlpMRV8jI3osIFwKLQkJCQkJICBTV0laWkxFX1pFUk8pKQotLyogbmF0aXZlIHN3aXp6bGVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHIzMDBfcGZzX3N3aXp6bGUgewotCUdMdWludCBoYXNoOwkJLyogc3dpenpsZSB2YWx1ZSB0aGlzIG1hdGNoZXMgKi8KLQlHTHVpbnQgYmFzZTsJCS8qIGJhc2UgdmFsdWUgZm9yIGh3IHN3aXp6bGUgKi8KLQlHTHVpbnQgc3RyaWRlOwkJLyogZGlmZmVyZW5jZSBpbiBiYXNlIGJldHdlZW4gYXJnMC8xLzIgKi8KLQlHTHVpbnQgZmxhZ3M7Ci19IHZfc3dpeltdID0gewotCS8qICpJTkRFTlQtT0ZGKiAqLwotCXtNQUtFX1NXWjMoWCwgWSwgWiksIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1hZWiwgNCwgU0xPVF9TUkNfVkVDVE9SfSwKLQl7TUFLRV9TV1ozKFgsIFgsIFgpLCBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19YWFgsIDQsIFNMT1RfU1JDX1ZFQ1RPUn0sCi0Je01BS0VfU1daMyhZLCBZLCBZKSwgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVlZLCA0LCBTTE9UX1NSQ19WRUNUT1J9LAotCXtNQUtFX1NXWjMoWiwgWiwgWiksIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1paWiwgNCwgU0xPVF9TUkNfVkVDVE9SfSwKLQl7TUFLRV9TV1ozKFcsIFcsIFcpLCBSMzAwX0ZQSTBfQVJHQ19TUkMwQSwgMSwgU0xPVF9TUkNfU0NBTEFSfSwKLQl7TUFLRV9TV1ozKFksIFosIFgpLCBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19ZWlgsIDEsIFNMT1RfU1JDX1ZFQ1RPUn0sCi0Je01BS0VfU1daMyhaLCBYLCBZKSwgUjMwMF9GUEkwX0FSR0NfU1JDMENfWlhZLCAxLCBTTE9UX1NSQ19WRUNUT1J9LAotCXtNQUtFX1NXWjMoVywgWiwgWSksIFIzMDBfRlBJMF9BUkdDX1NSQzBDQV9XWlksIDEsIFNMT1RfU1JDX0JPVEh9LAotCXtNQUtFX1NXWjMoT05FLCBPTkUsIE9ORSksIFIzMDBfRlBJMF9BUkdDX09ORSwgMCwgMH0sCi0Je01BS0VfU1daMyhaRVJPLCBaRVJPLCBaRVJPKSwgUjMwMF9GUEkwX0FSR0NfWkVSTywgMCwgMH0sCi0Je01BS0VfU1daMyhIQUxGLCBIQUxGLCBIQUxGKSwgUjMwMF9GUEkwX0FSR0NfSEFMRiwgMCwgMH0sCi0Je1BGU19JTlZBTCwgMCwgMCwgMH0sCi0JLyogKklOREVOVC1PTiogKi8KLX07Ci0KLS8qIHVzZWQgZHVyaW5nIG1hdGNoaW5nIG9mIG5vbi1uYXRpdmUgc3dpenpsZXMgKi8KLSNkZWZpbmUgU1daX1hfTUFTSyAoNyA8PCAwKQotI2RlZmluZSBTV1pfWV9NQVNLICg3IDw8IDMpCi0jZGVmaW5lIFNXWl9aX01BU0sgKDcgPDwgNikKLSNkZWZpbmUgU1daX1dfTUFTSyAoNyA8PCA5KQotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JR0x1aW50IGhhc2g7CQkvKiB1c2VkIHRvIG1hc2sgbWF0Y2hpbmcgc3dpenpsZSBjb21wb25lbnRzICovCi0JaW50IG1hc2s7CQkvKiBhY3R1YWwgb3V0bWFzayAqLwotCWludCBjb3VudDsJCS8qIGNvdW50IG9mIGNvbXBvbmVudHMgbWF0Y2hlZCAqLwotfSBzX21hc2tbXSA9IHsKLQkvKiAqSU5ERU5ULU9GRiogKi8KLQl7U1daX1hfTUFTSyB8IFNXWl9ZX01BU0sgfCBTV1pfWl9NQVNLLCAxIHwgMiB8IDQsIDN9LAotCXtTV1pfWF9NQVNLIHwgU1daX1lfTUFTSywgMSB8IDIsIDJ9LAotCXtTV1pfWF9NQVNLIHwgU1daX1pfTUFTSywgMSB8IDQsIDJ9LAotCXtTV1pfWV9NQVNLIHwgU1daX1pfTUFTSywgMiB8IDQsIDJ9LAotCXtTV1pfWF9NQVNLLCAxLCAxfSwKLQl7U1daX1lfTUFTSywgMiwgMX0sCi0Je1NXWl9aX01BU0ssIDQsIDF9LAotCXtQRlNfSU5WQUwsIFBGU19JTlZBTCwgUEZTX0lOVkFMfQotCS8qICpJTkRFTlQtT04qICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQlpbnQgYmFzZTsJCS8qIGh3IHZhbHVlIG9mIHN3aXp6bGUgKi8KLQlpbnQgc3RyaWRlOwkJLyogZGlmZmVyZW5jZSBiZXR3ZWVuIFNSQzAvMS8yICovCi0JR0x1aW50IGZsYWdzOwotfSBzX3N3aXpbXSA9IHsKLQkvKiAqSU5ERU5ULU9GRiogKi8KLQl7UjMwMF9GUEkyX0FSR0FfU1JDMENfWCwgMywgU0xPVF9TUkNfVkVDVE9SfSwKLQl7UjMwMF9GUEkyX0FSR0FfU1JDMENfWSwgMywgU0xPVF9TUkNfVkVDVE9SfSwKLQl7UjMwMF9GUEkyX0FSR0FfU1JDMENfWiwgMywgU0xPVF9TUkNfVkVDVE9SfSwKLQl7UjMwMF9GUEkyX0FSR0FfU1JDMEEsIDEsIFNMT1RfU1JDX1NDQUxBUn0sCi0Je1IzMDBfRlBJMl9BUkdBX1pFUk8sIDAsIDB9LAotCXtSMzAwX0ZQSTJfQVJHQV9PTkUsIDAsIDB9LAotCXtSMzAwX0ZQSTJfQVJHQV9IQUxGLCAwLCAwfQotCS8qICpJTkRFTlQtT04qICovCi19OwotCi0vKiBib2lsZXItcGxhdGUgcmVnLCBmb3IgY29udmVuaWVuY2UgKi8KLXN0YXRpYyBjb25zdCBHTHVpbnQgdW5kZWYgPSBSRUcoUkVHX1RZUEVfVEVNUCwKLQkJCQkwLAotCQkJCVNXSVpaTEVfWFlaLAotCQkJCVNXSVpaTEVfVywKLQkJCQlHTF9GQUxTRSwKLQkJCQlHTF9GQUxTRSwKLQkJCQlHTF9GQUxTRSk7Ci0KLS8qIGNvbnN0YW50IG9uZSBzb3VyY2UgKi8KLXN0YXRpYyBjb25zdCBHTHVpbnQgcGZzX29uZSA9IFJFRyhSRUdfVFlQRV9DT05TVCwKLQkJCQkgIDAsCi0JCQkJICBTV0laWkxFXzExMSwKLQkJCQkgIFNXSVpaTEVfT05FLAotCQkJCSAgR0xfRkFMU0UsCi0JCQkJICBHTF9UUlVFLAotCQkJCSAgR0xfVFJVRSk7Ci0KLS8qIGNvbnN0YW50IGhhbGYgc291cmNlICovCi1zdGF0aWMgY29uc3QgR0x1aW50IHBmc19oYWxmID0gUkVHKFJFR19UWVBFX0NPTlNULAotCQkJCSAgIDAsCi0JCQkJICAgU1dJWlpMRV9ISEgsCi0JCQkJICAgU1dJWlpMRV9IQUxGLAotCQkJCSAgIEdMX0ZBTFNFLAotCQkJCSAgIEdMX1RSVUUsCi0JCQkJICAgR0xfVFJVRSk7Ci0KLS8qIGNvbnN0YW50IHplcm8gc291cmNlICovCi1zdGF0aWMgY29uc3QgR0x1aW50IHBmc196ZXJvID0gUkVHKFJFR19UWVBFX0NPTlNULAotCQkJCSAgIDAsCi0JCQkJICAgU1dJWlpMRV8wMDAsCi0JCQkJICAgU1dJWlpMRV9aRVJPLAotCQkJCSAgIEdMX0ZBTFNFLAotCQkJCSAgIEdMX1RSVUUsCi0JCQkJICAgR0xfVFJVRSk7Ci0KLS8qCi0gKiBDb21tb24gZnVuY3Rpb25zIHByb3RvdHlwZXMKLSAqLwotc3RhdGljIHZvaWQgZHVtcF9wcm9ncmFtKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKTsKLXN0YXRpYyB2b2lkIGVtaXRfYXJpdGgoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsIGludCBvcCwKLQkJICAgICAgIEdMdWludCBkZXN0LCBpbnQgbWFzaywKLQkJICAgICAgIEdMdWludCBzcmMwLCBHTHVpbnQgc3JjMSwgR0x1aW50IHNyYzIsIGludCBmbGFncyk7Ci0KLS8qKgotICogR2V0IGFuIFIzMDAgdGVtcG9yYXJ5IHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW4gdGhlIGdpdmVuIHNsb3QuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2h3X3RlbXAoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsIGludCBzbG90KQorc3RhdGljIHZvaWQgcmVzZXRfc3JjcmVnKHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciogcmVnKQogewotCUNPTVBJTEVfU1RBVEU7Ci0JaW50IHI7Ci0KLQlmb3IgKHIgPSAwOyByIDwgUEZTX05VTV9URU1QX1JFR1M7ICsrcikgewotCQlpZiAoY3MtPmh3dGVtcHNbcl0uZnJlZSA+PSAwICYmIGNzLT5od3RlbXBzW3JdLmZyZWUgPD0gc2xvdCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChyID49IFBGU19OVU1fVEVNUF9SRUdTKSB7Ci0JCUVSUk9SKCJPdXQgb2YgaGFyZHdhcmUgdGVtcHNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLy8gUmVzZXJ2ZWQgaXMgdXNlZCB0byBhdm9pZCB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotCS8vICBSMzAwIHRlbXBvcmFyeSBYIGlzIGZpcnN0IGFzc2lnbmVkIHRvIE1lc2EgdGVtcG9yYXJ5IFkgZHVyaW5nIHZlY3RvciBvcHMKLQkvLyAgUjMwMCB0ZW1wb3JhcnkgWCBpcyB0aGVuIGFzc2lnbmVkIHRvIE1lc2EgdGVtcG9yYXJ5IFogZm9yIGZ1cnRoZXIgdmVjdG9yIG9wcwotCS8vICBUaGVuIHNjYWxhciBvcHMgb24gTWVzYSB0ZW1wb3JhcnkgWiBhcmUgZW1pdHRlZCBhbmQgbW92ZSBiYWNrIGluIHRpbWUKLQkvLyAgdG8gb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiB0ZW1wb3JhcnkgWS4KLQkvLyBFbmQgc2NlbmFyaW8uCi0JY3MtPmh3dGVtcHNbcl0ucmVzZXJ2ZWQgPSBjcy0+aHd0ZW1wc1tyXS5mcmVlOwotCWNzLT5od3RlbXBzW3JdLmZyZWUgPSAtMTsKLQotCS8vIFJlc2V0IHRvIHNvbWUgdmFsdWUgdGhhdCB3b24ndCBtZXNzIHRoaW5ncyB1cCB3aGVuIHRoZSB1c2VyCi0JLy8gdHJpZXMgdG8gcmVhZCBmcm9tIGEgdGVtcG9yYXJ5IHRoYXQgaGFzbid0IGJlZW4gYXNzaWduZWQgYSB2YWx1ZSB5ZXQuCi0JLy8gSW4gdGhlIG5vcm1hbCBjYXNlLCB2ZWN0b3JfdmFsaWQgYW5kIHNjYWxhcl92YWxpZCBzaG91bGQgYmUgc2V0IHRvCi0JLy8gYSBzYW5lIHZhbHVlIGJ5IHRoZSBmaXJzdCBlbWl0IHRoYXQgd3JpdGVzIHRvIHRoaXMgdGVtcG9yYXJ5LgotCWNzLT5od3RlbXBzW3JdLnZlY3Rvcl92YWxpZCA9IDA7Ci0JY3MtPmh3dGVtcHNbcl0uc2NhbGFyX3ZhbGlkID0gMDsKLQotCWlmIChyID4gZnAtPm1heF90ZW1wX2lkeCkKLQkJZnAtPm1heF90ZW1wX2lkeCA9IHI7Ci0KLQlyZXR1cm4gcjsKKwlfbWVzYV9iemVybyhyZWcsIHNpemVvZigqcmVnKSk7CisJcmVnLT5Td2l6emxlID0gU1dJWlpMRV9OT09QOwogfQogCi0vKioKLSAqIEdldCBhbiBSMzAwIHRlbXBvcmFyeSB0aGF0IHdpbGwgYWN0IGFzIGEgVEVYIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgaW50IGdldF9od190ZW1wX3RleChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCkKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc2hhZG93X2FtYmllbnQoc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0sIGludCB0bXUpCiB7Ci0JQ09NUElMRV9TVEFURTsKLQlpbnQgcjsKKwlnbF9zdGF0ZV9pbmRleCBmYWlsX3ZhbHVlX3Rva2Vuc1tTVEFURV9MRU5HVEhdID0geworCQlTVEFURV9JTlRFUk5BTCwgU1RBVEVfU0hBRE9XX0FNQklFTlQsIDAsIDAsIDAKKwl9OworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciByZWcgPSB7IDAsIH07CiAKLQlmb3IgKHIgPSAwOyByIDwgUEZTX05VTV9URU1QX1JFR1M7ICsrcikgewotCQlpZiAoY3MtPnVzZWRfaW5fbm9kZSAmICgxIDw8IHIpKQotCQkJY29udGludWU7Ci0KLQkJLy8gTm90ZTogQmUgdmVyeSBjYXJlZnVsIGhlcmUKLQkJaWYgKGNzLT5od3RlbXBzW3JdLmZyZWUgPj0gMCAmJiBjcy0+aHd0ZW1wc1tyXS5mcmVlIDw9IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAociA+PSBQRlNfTlVNX1RFTVBfUkVHUykKLQkJcmV0dXJuIGdldF9od190ZW1wKGZwLCAwKTsJLyogV2lsbCBjYXVzZSBhbiBpbmRpcmVjdGlvbiAqLwotCi0JY3MtPmh3dGVtcHNbcl0ucmVzZXJ2ZWQgPSBjcy0+aHd0ZW1wc1tyXS5mcmVlOwotCWNzLT5od3RlbXBzW3JdLmZyZWUgPSAtMTsKLQotCS8vIFJlc2V0IHRvIHNvbWUgdmFsdWUgdGhhdCB3b24ndCBtZXNzIHRoaW5ncyB1cCB3aGVuIHRoZSB1c2VyCi0JLy8gdHJpZXMgdG8gcmVhZCBmcm9tIGEgdGVtcG9yYXJ5IHRoYXQgaGFzbid0IGJlZW4gYXNzaWduZWQgYSB2YWx1ZSB5ZXQuCi0JLy8gSW4gdGhlIG5vcm1hbCBjYXNlLCB2ZWN0b3JfdmFsaWQgYW5kIHNjYWxhcl92YWxpZCBzaG91bGQgYmUgc2V0IHRvCi0JLy8gYSBzYW5lIHZhbHVlIGJ5IHRoZSBmaXJzdCBlbWl0IHRoYXQgd3JpdGVzIHRvIHRoaXMgdGVtcG9yYXJ5LgotCWNzLT5od3RlbXBzW3JdLnZlY3Rvcl92YWxpZCA9IGNzLT5ucnNsb3RzOwotCWNzLT5od3RlbXBzW3JdLnNjYWxhcl92YWxpZCA9IGNzLT5ucnNsb3RzOwotCi0JaWYgKHIgPiBmcC0+bWF4X3RlbXBfaWR4KQotCQlmcC0+bWF4X3RlbXBfaWR4ID0gcjsKLQotCXJldHVybiByOwotfQotCi0vKioKLSAqIE1hcmsgdGhlIGdpdmVuIGhhcmR3YXJlIHJlZ2lzdGVyIGFzIGZyZWUuCi0gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaHdfdGVtcChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwgaW50IGlkeCkKLXsKLQlDT01QSUxFX1NUQVRFOwotCi0JLy8gQmUgdmVyeSBjYXJlZnVsIGhlcmUuIENvbnNpZGVyIHNlcXVlbmNlcyBsaWtlCi0JLy8gIE1BRCByMCwgcjEscjIscjMKLQkvLyAgVEVYIHI0LCAuLi4KLQkvLyBUaGUgVEVYIGluc3RydWN0aW9uIG1heSBiZSBtb3ZlZCBpbiBmcm9udCBvZiB0aGUgTUFEIGluc3RydWN0aW9uCi0JLy8gZHVlIHRvIHRoZSB3YXkgbm9kZXMgd29yay4gV2UgZG9uJ3Qgd2FudCB0byBhbGlhcyByMSBhbmQgcjQgaW4KLQkvLyB0aGlzIGNhc2UuCi0JLy8gSSdtIGNlcnRhaW4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gY291bGQgYmUgZnVydGhlciBzYW5pdGl6ZWQsCi0JLy8gYnV0IGl0J3MgdHJpY2t5IGJlY2F1c2Ugb2Ygc3R1ZmYgdGhhdCBjYW4gaGFwcGVuIGluc2lkZSBlbWl0X3RleAotCS8vIGFuZCBlbWl0X2FyaXRoLgotCWNzLT5od3RlbXBzW2lkeF0uZnJlZSA9IGNzLT5ucnNsb3RzICsgMTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgTWVzYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBHTHVpbnQgZ2V0X3RlbXBfcmVnKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKQotewotCUNPTVBJTEVfU1RBVEU7Ci0JR0x1aW50IHIgPSB1bmRlZjsKLQlHTHVpbnQgaW5kZXg7Ci0KLQlpbmRleCA9IGZmcyh+Y3MtPnRlbXBfaW5fdXNlKTsKLQlpZiAoIWluZGV4KSB7Ci0JCUVSUk9SKCJPdXQgb2YgcHJvZ3JhbSB0ZW1wc1xuIik7Ci0JCXJldHVybiByOwotCX0KLQotCWNzLT50ZW1wX2luX3VzZSB8PSAoMSA8PCAtLWluZGV4KTsKLQljcy0+dGVtcHNbaW5kZXhdLnJlZmNvdW50ID0gMHhGRkZGRkZGRjsKLQljcy0+dGVtcHNbaW5kZXhdLnJlZyA9IC0xOwotCi0JUkVHX1NFVF9UWVBFKHIsIFJFR19UWVBFX1RFTVApOwotCVJFR19TRVRfSU5ERVgociwgaW5kZXgpOwotCVJFR19TRVRfVkFMSUQociwgR0xfVFJVRSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IE1lc2EgdGVtcG9yYXJ5IHJlZ2lzdGVyIHRoYXQgd2lsbCBhY3QgYXMgdGhlIGRlc3RpbmF0aW9uCi0gKiByZWdpc3RlciBmb3IgYSB0ZXh0dXJlIHJlYWQuCi0gKi8KLXN0YXRpYyBHTHVpbnQgZ2V0X3RlbXBfcmVnX3RleChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCkKLXsKLQlDT01QSUxFX1NUQVRFOwotCUdMdWludCByID0gdW5kZWY7Ci0JR0x1aW50IGluZGV4OwotCi0JaW5kZXggPSBmZnMofmNzLT50ZW1wX2luX3VzZSk7Ci0JaWYgKCFpbmRleCkgewotCQlFUlJPUigiT3V0IG9mIHByb2dyYW0gdGVtcHNcbiIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQljcy0+dGVtcF9pbl91c2UgfD0gKDEgPDwgLS1pbmRleCk7Ci0JY3MtPnRlbXBzW2luZGV4XS5yZWZjb3VudCA9IDB4RkZGRkZGRkY7Ci0JY3MtPnRlbXBzW2luZGV4XS5yZWcgPSBnZXRfaHdfdGVtcF90ZXgoZnApOwotCi0JUkVHX1NFVF9UWVBFKHIsIFJFR19UWVBFX1RFTVApOwotCVJFR19TRVRfSU5ERVgociwgaW5kZXgpOwotCVJFR19TRVRfVkFMSUQociwgR0xfVFJVRSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLS8qKgotICogRnJlZSBhIE1lc2EgdGVtcG9yYXJ5IGFuZCB0aGUgYXNzb2NpYXRlZCBSMzAwIHRlbXBvcmFyeS4KLSAqLwotc3RhdGljIHZvaWQgZnJlZV90ZW1wKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLCBHTHVpbnQgcikKLXsKLQlDT01QSUxFX1NUQVRFOwotCUdMdWludCBpbmRleCA9IFJFR19HRVRfSU5ERVgocik7Ci0KLQlpZiAoIShjcy0+dGVtcF9pbl91c2UgJiAoMSA8PCBpbmRleCkpKQotCQlyZXR1cm47Ci0KLQlpZiAoUkVHX0dFVF9UWVBFKHIpID09IFJFR19UWVBFX1RFTVApIHsKLQkJZnJlZV9od190ZW1wKGZwLCBjcy0+dGVtcHNbaW5kZXhdLnJlZyk7Ci0JCWNzLT50ZW1wc1tpbmRleF0ucmVnID0gLTE7Ci0JCWNzLT50ZW1wX2luX3VzZSAmPSB+KDEgPDwgaW5kZXgpOwotCX0gZWxzZSBpZiAoUkVHX0dFVF9UWVBFKHIpID09IFJFR19UWVBFX0lOUFVUKSB7Ci0JCWZyZWVfaHdfdGVtcChmcCwgY3MtPmlucHV0c1tpbmRleF0ucmVnKTsKLQkJY3MtPmlucHV0c1tpbmRleF0ucmVnID0gLTE7Ci0JfQotfQotCi0vKioKLSAqIEVtaXQgYSBoYXJkd2FyZSBjb25zdGFudC9wYXJhbWV0ZXIuCi0gKgotICogXHAgY3AgU3RhYmxlIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgNCBmbG9hdHMuCi0gKiAgVGhlIHBvaW50ZXIgbXVzdCBiZSBzdGFibGUgaW4gdGhlIHNlbnNlIHRoYXQgaXQgcmVtYWlucyB0byBiZSB2YWxpZAotICogIGFuZCBob2xkIHRoZSBjb250ZW50cyBvZiB0aGUgY29uc3RhbnQvcGFyYW1ldGVyIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lCi0gKiAgb2YgdGhlIGZyYWdtZW50IHByb2dyYW0gKGFjdHVhbGx5LCB1cCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoZSBmcmFnbWVudAotICogIHByb2dyYW0gaXMgdHJhbnNsYXRlZCkuCi0gKi8KLXN0YXRpYyBHTHVpbnQgZW1pdF9jb25zdDRmdihzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwKLQkJCSAgICBjb25zdCBHTGZsb2F0ICogY3ApCi17Ci0JR0x1aW50IHJlZyA9IHVuZGVmOwotCWludCBpbmRleDsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGZwLT5jb25zdF9ucjsgKytpbmRleCkgewotCQlpZiAoZnAtPmNvbnN0YW50W2luZGV4XSA9PSBjcCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpbmRleCA+PSBmcC0+Y29uc3RfbnIpIHsKLQkJaWYgKGluZGV4ID49IFBGU19OVU1fQ09OU1RfUkVHUykgewotCQkJRVJST1IoIk91dCBvZiBodyBjb25zdGFudHMhXG4iKTsKLQkJCXJldHVybiByZWc7Ci0JCX0KLQotCQlmcC0+Y29uc3RfbnIrKzsKLQkJZnAtPmNvbnN0YW50W2luZGV4XSA9IGNwOwotCX0KLQotCVJFR19TRVRfVFlQRShyZWcsIFJFR19UWVBFX0NPTlNUKTsKLQlSRUdfU0VUX0lOREVYKHJlZywgaW5kZXgpOwotCVJFR19TRVRfVkFMSUQocmVnLCBHTF9UUlVFKTsKKwlmYWlsX3ZhbHVlX3Rva2Vuc1syXSA9IHRtdTsKKwlyZWcuRmlsZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCXJlZy5JbmRleCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZ3JhbS0+UGFyYW1ldGVycywgZmFpbF92YWx1ZV90b2tlbnMpOworCXJlZy5Td2l6emxlID0gU1dJWlpMRV9XV1dXOwogCXJldHVybiByZWc7CiB9CiAKLXN0YXRpYyBpbmxpbmUgR0x1aW50IG5lZ2F0ZShHTHVpbnQgcikKLXsKLQlSRUdfTkVHUyhyKTsKLQlSRUdfTkVHVihyKTsKLQlyZXR1cm4gcjsKLX0KLQotLyogSGFjaywgdG8gcHJldmVudCBjbG9iYmVyaW5nIHNvdXJjZXMgdXNlZCBtdWx0aXBsZSB0aW1lcyB3aGVuCi0gKiBlbXVsYXRpbmcgbm9uLW5hdGl2ZSBpbnN0cnVjdGlvbnMKLSAqLwotc3RhdGljIGlubGluZSBHTHVpbnQga2VlcChHTHVpbnQgcikKLXsKLQlSRUdfU0VUX05PX1VTRShyLCBHTF9UUlVFKTsKLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGlubGluZSBHTHVpbnQgYWJzb2x1dGUoR0x1aW50IHIpCi17Ci0JUkVHX0FCUyhyKTsKLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGludCBzd3pfbmF0aXZlKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkgICAgICBHTHVpbnQgc3JjLCBHTHVpbnQgKiByLCBHTHVpbnQgYXJibmVnKQotewotCS8qIE5hdGl2ZSBzd2l6emxlLCBoYW5kbGUgbmVnYXRpb24gKi8KLQlzcmMgPSAoc3JjICYgflJFR19ORUdTX01BU0spIHwgKCgoYXJibmVnID4+IDMpICYgMSkgPDwgUkVHX05FR1NfU0hJRlQpOwotCi0JaWYgKChhcmJuZWcgJiAweDcpID09IDB4MCkgewotCQlzcmMgPSBzcmMgJiB+UkVHX05FR1ZfTUFTSzsKLQkJKnIgPSBzcmM7Ci0JfSBlbHNlIGlmICgoYXJibmVnICYgMHg3KSA9PSAweDcpIHsKLQkJc3JjIHw9IFJFR19ORUdWX01BU0s7Ci0JCSpyID0gc3JjOwotCX0gZWxzZSB7Ci0JCWlmICghUkVHX0dFVF9WQUxJRCgqcikpCi0JCQkqciA9IGdldF90ZW1wX3JlZyhmcCk7Ci0JCXNyYyB8PSBSRUdfTkVHVl9NQVNLOwotCQllbWl0X2FyaXRoKGZwLAotCQkJICAgUEZTX09QX01BRCwKLQkJCSAgICpyLCBhcmJuZWcgJiAweDcsIGtlZXAoc3JjKSwgcGZzX29uZSwgcGZzX3plcm8sIDApOwotCQlzcmMgPSBzcmMgJiB+UkVHX05FR1ZfTUFTSzsKLQkJZW1pdF9hcml0aChmcCwKLQkJCSAgIFBGU19PUF9NQUQsCi0JCQkgICAqciwKLQkJCSAgIChhcmJuZWcgXiAweDcpIHwgV1JJVEVNQVNLX1csCi0JCQkgICBzcmMsIHBmc19vbmUsIHBmc196ZXJvLCAwKTsKLQl9Ci0KLQlyZXR1cm4gMzsKLX0KLQotc3RhdGljIGludCBzd3pfZW1pdF9wYXJ0aWFsKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkJICAgIEdMdWludCBzcmMsCi0JCQkgICAgR0x1aW50ICogciwgaW50IG1hc2ssIGludCBtYywgR0x1aW50IGFyYm5lZykKLXsKLQlHTHVpbnQgdG1wOwotCUdMdWludCB3bWFzayA9IDA7Ci0KLQlpZiAoIVJFR19HRVRfVkFMSUQoKnIpKQotCQkqciA9IGdldF90ZW1wX3JlZyhmcCk7Ci0KLQkvKiBBIHBhcnRpYWwgbWF0Y2gsIFZTV1ovbWFzayBkZWZpbmUgd2hhdCBwYXJ0cyBvZiB0aGUKLQkgKiBkZXNpcmVkIHN3aXp6bGUgd2UgbWF0Y2gKLQkgKi8KLQlpZiAobWMgKyBzX21hc2tbbWFza10uY291bnQgPT0gMykgewotCQl3bWFzayA9IFdSSVRFTUFTS19XOwotCQlzcmMgfD0gKChhcmJuZWcgPj4gMykgJiAxKSA8PCBSRUdfTkVHU19TSElGVDsKLQl9Ci0KLQl0bXAgPSBhcmJuZWcgJiBzX21hc2tbbWFza10ubWFzazsKLQlpZiAodG1wKSB7Ci0JCXRtcCA9IHRtcCBeIHNfbWFza1ttYXNrXS5tYXNrOwotCQlpZiAodG1wKSB7Ci0JCQllbWl0X2FyaXRoKGZwLAotCQkJCSAgIFBGU19PUF9NQUQsCi0JCQkJICAgKnIsCi0JCQkJICAgYXJibmVnICYgc19tYXNrW21hc2tdLm1hc2ssCi0JCQkJICAga2VlcChzcmMpIHwgUkVHX05FR1ZfTUFTSywKLQkJCQkgICBwZnNfb25lLCBwZnNfemVybywgMCk7Ci0JCQlpZiAoIXdtYXNrKSB7Ci0JCQkJUkVHX1NFVF9OT19VU0Uoc3JjLCBHTF9UUlVFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUkVHX1NFVF9OT19VU0Uoc3JjLCBHTF9GQUxTRSk7Ci0JCQl9Ci0JCQllbWl0X2FyaXRoKGZwLAotCQkJCSAgIFBGU19PUF9NQUQsCi0JCQkJICAgKnIsIHRtcCB8IHdtYXNrLCBzcmMsIHBmc19vbmUsIHBmc196ZXJvLCAwKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghd21hc2spIHsKLQkJCQlSRUdfU0VUX05PX1VTRShzcmMsIEdMX1RSVUUpOwotCQkJfSBlbHNlIHsKLQkJCQlSRUdfU0VUX05PX1VTRShzcmMsIEdMX0ZBTFNFKTsKLQkJCX0KLQkJCWVtaXRfYXJpdGgoZnAsCi0JCQkJICAgUEZTX09QX01BRCwKLQkJCQkgICAqciwKLQkJCQkgICAoYXJibmVnICYgc19tYXNrW21hc2tdLm1hc2spIHwgd21hc2ssCi0JCQkJICAgc3JjIHwgUkVHX05FR1ZfTUFTSywgcGZzX29uZSwgcGZzX3plcm8sIDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCF3bWFzaykgewotCQkJUkVHX1NFVF9OT19VU0Uoc3JjLCBHTF9UUlVFKTsKLQkJfSBlbHNlIHsKLQkJCVJFR19TRVRfTk9fVVNFKHNyYywgR0xfRkFMU0UpOwotCQl9Ci0JCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsCi0JCQkgICAqciwKLQkJCSAgIHNfbWFza1ttYXNrXS5tYXNrIHwgd21hc2ssCi0JCQkgICBzcmMsIHBmc19vbmUsIHBmc196ZXJvLCAwKTsKLQl9Ci0KLQlyZXR1cm4gc19tYXNrW21hc2tdLmNvdW50OwotfQotCi1zdGF0aWMgR0x1aW50IGRvX3N3aXp6bGUoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCi0JCQkgR0x1aW50IHNyYywgR0x1aW50IGFyYnN3eiwgR0x1aW50IGFyYm5lZykKLXsKLQlHTHVpbnQgciA9IHVuZGVmOwotCUdMdWludCB2c3d6OwotCWludCBjX21hc2sgPSAwOwotCWludCB2X21hdGNoID0gMDsKLQotCS8qIElmIHN3aXp6bGluZyBmcm9tIHNvbWV0aGluZyB3aXRob3V0IGFuIFhZWlcgbmF0aXZlIHN3aXp6bGUsCi0JICogZW1pdCByZXN1bHQgdG8gYSB0ZW1wLCBhbmQgZG8gbmV3IHN3aXp6bGUgZnJvbSB0aGUgdGVtcC4KLQkgKi8KLSNpZiAwCi0JaWYgKFJFR19HRVRfVlNXWihzcmMpICE9IFNXSVpaTEVfWFlaIHx8IFJFR19HRVRfU1NXWihzcmMpICE9IFNXSVpaTEVfVykgewotCQlHTHVpbnQgdGVtcCA9IGdldF90ZW1wX3JlZyhmcCk7Ci0JCWVtaXRfYXJpdGgoZnAsCi0JCQkgICBQRlNfT1BfTUFELAotCQkJICAgdGVtcCwgV1JJVEVNQVNLX1hZWlcsIHNyYywgcGZzX29uZSwgcGZzX3plcm8sIDApOwotCQlzcmMgPSB0ZW1wOwotCX0KLSNlbmRpZgotCi0JaWYgKFJFR19HRVRfVlNXWihzcmMpICE9IFNXSVpaTEVfWFlaIHx8IFJFR19HRVRfU1NXWihzcmMpICE9IFNXSVpaTEVfVykgewotCQlHTHVpbnQgdnNyY3N3eiA9Ci0JCSAgICAodl9zd2l6W1JFR19HRVRfVlNXWihzcmMpXS4KLQkJICAgICBoYXNoICYgKFNXWl9YX01BU0sgfCBTV1pfWV9NQVNLIHwgU1daX1pfTUFTSykpIHwKLQkJICAgIFJFR19HRVRfU1NXWihzcmMpIDw8IDk7Ci0JCUdMaW50IGk7Ci0KLQkJR0x1aW50IG5ld3N3eiA9IDA7Ci0JCUdMdWludCBvZmZzZXQ7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLQkJCW9mZnNldCA9IEdFVF9TV1ooYXJic3d6LCBpKTsKLQotCQkJbmV3c3d6IHw9Ci0JCQkgICAgKG9mZnNldCA8PSAzKSA/IEdFVF9TV1oodnNyY3N3eiwKLQkJCQkJCSAgICBvZmZzZXQpIDw8IGkgKgotCQkJICAgIDMgOiBvZmZzZXQgPDwgaSAqIDM7Ci0JCX0KLQotCQlhcmJzd3ogPSBuZXdzd3ogJiAoU1daX1hfTUFTSyB8IFNXWl9ZX01BU0sgfCBTV1pfWl9NQVNLKTsKLQkJUkVHX1NFVF9TU1daKHNyYywgR0VUX1NXWihuZXdzd3osIDMpKTsKLQl9IGVsc2UgewotCQkvKiBzZXQgc2NhbGFyIHN3aXp6bGluZyAqLwotCQlSRUdfU0VUX1NTV1ooc3JjLCBHRVRfU1daKGFyYnN3eiwgMykpOwotCi0JfQotCWRvIHsKLQkJdnN3eiA9IFJFR19HRVRfVlNXWihzcmMpOwotCQlkbyB7Ci0JCQlpbnQgY2hhc2g7Ci0KLQkJCVJFR19TRVRfVlNXWihzcmMsIHZzd3opOwotCQkJY2hhc2ggPSB2X3N3aXpbUkVHX0dFVF9WU1daKHNyYyldLmhhc2ggJgotCQkJICAgIHNfbWFza1tjX21hc2tdLmhhc2g7Ci0KLQkJCWlmIChjaGFzaCA9PSAoYXJic3d6ICYgc19tYXNrW2NfbWFza10uaGFzaCkpIHsKLQkJCQlpZiAoc19tYXNrW2NfbWFza10uY291bnQgPT0gMykgewotCQkJCQl2X21hdGNoICs9IHN3el9uYXRpdmUoZnAsCi0JCQkJCQkJICAgICAgc3JjLCAmciwgYXJibmVnKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2X21hdGNoICs9IHN3el9lbWl0X3BhcnRpYWwoZnAsCi0JCQkJCQkJCSAgICBzcmMsCi0JCQkJCQkJCSAgICAmciwKLQkJCQkJCQkJICAgIGNfbWFzaywKLQkJCQkJCQkJICAgIHZfbWF0Y2gsCi0JCQkJCQkJCSAgICBhcmJuZWcpOwotCQkJCX0KLQotCQkJCWlmICh2X21hdGNoID09IDMpCi0JCQkJCXJldHVybiByOwotCi0JCQkJLyogRmlsbCB3aXRoIHNvbWV0aGluZyBpbnZhbGlkLi4gYWxsIDAncyB3YXMKLQkJCQkgKiB3cm9uZyBiZWZvcmUsIG1hdGNoZWQgU1dJWlpMRV9YLiAgU28gYWxsCi0JCQkJICogMSdzIHdpbGwgYmUgb2theSBmb3Igbm93Ci0JCQkJICovCi0JCQkJYXJic3d6IHw9IChQRlNfSU5WQUwgJiBzX21hc2tbY19tYXNrXS5oYXNoKTsKLQkJCX0KLQkJfSB3aGlsZSAodl9zd2l6WysrdnN3el0uaGFzaCAhPSBQRlNfSU5WQUwpOwotCQlSRUdfU0VUX1ZTV1ooc3JjLCBTV0laWkxFX1hZWik7Ci0JfSB3aGlsZSAoc19tYXNrWysrY19tYXNrXS5oYXNoICE9IFBGU19JTlZBTCk7Ci0KLQlFUlJPUigic2hvdWxkIE5FVkVSIGdldCBoZXJlXG4iKTsKLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIEdMdWludCB0X3NyYyhzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwKLQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBmcHNyYykKLXsKLQlHTHVpbnQgciA9IHVuZGVmOwotCi0Jc3dpdGNoIChmcHNyYy5GaWxlKSB7Ci0JY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKLQkJUkVHX1NFVF9JTkRFWChyLCBmcHNyYy5JbmRleCk7Ci0JCVJFR19TRVRfVkFMSUQociwgR0xfVFJVRSk7Ci0JCVJFR19TRVRfVFlQRShyLCBSRUdfVFlQRV9URU1QKTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9HUkFNX0lOUFVUOgotCQlSRUdfU0VUX0lOREVYKHIsIGZwc3JjLkluZGV4KTsKLQkJUkVHX1NFVF9WQUxJRChyLCBHTF9UUlVFKTsKLQkJUkVHX1NFVF9UWVBFKHIsIFJFR19UWVBFX0lOUFVUKTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgotCQlyID0gZW1pdF9jb25zdDRmdihmcCwKLQkJCQkgIGZwLT5tZXNhX3Byb2dyYW0uQmFzZS5Mb2NhbFBhcmFtc1tmcHNyYy4KLQkJCQkJCQkJICAgIEluZGV4XSk7Ci0JCWJyZWFrOwotCWNhc2UgUFJPR1JBTV9FTlZfUEFSQU06Ci0JCXIgPSBlbWl0X2NvbnN0NGZ2KGZwLAotCQkJCSAgZnAtPmN0eC0+RnJhZ21lbnRQcm9ncmFtLlBhcmFtZXRlcnNbZnBzcmMuCi0JCQkJCQkJCSAgICAgIEluZGV4XSk7Ci0JCWJyZWFrOwotCWNhc2UgUFJPR1JBTV9TVEFURV9WQVI6Ci0JY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgotCQlyID0gZW1pdF9jb25zdDRmdihmcCwKLQkJCQkgIGZwLT5tZXNhX3Byb2dyYW0uQmFzZS5QYXJhbWV0ZXJzLT4KLQkJCQkgIFBhcmFtZXRlclZhbHVlc1tmcHNyYy5JbmRleF0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlFUlJPUigidW5rbm93biBTcmNSZWctPkZpbGUgJXhcbiIsIGZwc3JjLkZpbGUpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKiBubyBwb2ludCBzd2l6emxpbmcgT05FL1pFUk8vSEFMRiBjb25zdGFudHMuLi4gKi8KLQlpZiAoUkVHX0dFVF9WU1daKHIpIDwgU1dJWlpMRV8xMTEgfHwgUkVHX0dFVF9TU1daKHIpIDwgU1dJWlpMRV9aRVJPKQotCQlyID0gZG9fc3dpenpsZShmcCwgciwgZnBzcmMuU3dpenpsZSwgZnBzcmMuTmVnYXRlQmFzZSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBHTHVpbnQgdF9zY2FsYXJfc3JjKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkJICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIGZwc3JjKQotewotCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMgPSBmcHNyYzsKLQlpbnQgc2MgPSBHRVRfU1daKGZwc3JjLlN3aXp6bGUsIDApOwkvKiBYICovCi0KLQlzcmMuU3dpenpsZSA9ICgoc2MgPDwgMCkgfCAoc2MgPDwgMykgfCAoc2MgPDwgNikgfCAoc2MgPDwgOSkpOwotCi0JcmV0dXJuIHRfc3JjKGZwLCBzcmMpOwotfQotCi1zdGF0aWMgR0x1aW50IHRfZHN0KHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkgICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGRlc3QpCi17Ci0JR0x1aW50IHIgPSB1bmRlZjsKLQotCXN3aXRjaCAoZGVzdC5GaWxlKSB7Ci0JY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKLQkJUkVHX1NFVF9JTkRFWChyLCBkZXN0LkluZGV4KTsKLQkJUkVHX1NFVF9WQUxJRChyLCBHTF9UUlVFKTsKLQkJUkVHX1NFVF9UWVBFKHIsIFJFR19UWVBFX1RFTVApOwotCQlyZXR1cm4gcjsKLQljYXNlIFBST0dSQU1fT1VUUFVUOgotCQlSRUdfU0VUX1RZUEUociwgUkVHX1RZUEVfT1VUUFVUKTsKLQkJc3dpdGNoIChkZXN0LkluZGV4KSB7Ci0JCWNhc2UgRlJBR19SRVNVTFRfQ09MUjoKLQkJY2FzZSBGUkFHX1JFU1VMVF9ERVBSOgotCQkJUkVHX1NFVF9JTkRFWChyLCBkZXN0LkluZGV4KTsKLQkJCVJFR19TRVRfVkFMSUQociwgR0xfVFJVRSk7Ci0JCQlyZXR1cm4gcjsKLQkJZGVmYXVsdDoKLQkJCUVSUk9SKCJCYWQgRHN0UmVnLT5JbmRleCAweCV4XG4iLCBkZXN0LkluZGV4KTsKLQkJCXJldHVybiByOwotCQl9Ci0JZGVmYXVsdDoKLQkJRVJST1IoIkJhZCBEc3RSZWctPkZpbGUgMHgleFxuIiwgZGVzdC5GaWxlKTsKLQkJcmV0dXJuIHI7Ci0JfQotfQotCi1zdGF0aWMgaW50IHRfaHdfc3JjKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLCBHTHVpbnQgc3JjLCBHTGJvb2xlYW4gdGV4KQotewotCUNPTVBJTEVfU1RBVEU7Ci0JaW50IGlkeDsKLQlpbnQgaW5kZXggPSBSRUdfR0VUX0lOREVYKHNyYyk7Ci0KLQlzd2l0Y2ggKFJFR19HRVRfVFlQRShzcmMpKSB7Ci0JY2FzZSBSRUdfVFlQRV9URU1QOgotCQkvKiBOT1RFOiBpZiByZWc9PS0xIGhlcmUsIGEgc291cmNlIGlzIGJlaW5nIHJlYWQgdGhhdAotCQkgKiAgICAgICBoYXNuJ3QgYmVlbiB3cml0dGVuIHRvLiBVbmRlZmluZWQgcmVzdWx0cy4KLQkJICovCi0JCWlmIChjcy0+dGVtcHNbaW5kZXhdLnJlZyA9PSAtMSkKLQkJCWNzLT50ZW1wc1tpbmRleF0ucmVnID0gZ2V0X2h3X3RlbXAoZnAsIGNzLT5ucnNsb3RzKTsKLQotCQlpZHggPSBjcy0+dGVtcHNbaW5kZXhdLnJlZzsKLQotCQlpZiAoIVJFR19HRVRfTk9fVVNFKHNyYykgJiYgKC0tY3MtPnRlbXBzW2luZGV4XS5yZWZjb3VudCA9PSAwKSkKLQkJCWZyZWVfdGVtcChmcCwgc3JjKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRUdfVFlQRV9JTlBVVDoKLQkJaWR4ID0gY3MtPmlucHV0c1tpbmRleF0ucmVnOwotCi0JCWlmICghUkVHX0dFVF9OT19VU0Uoc3JjKSAmJiAoLS1jcy0+aW5wdXRzW2luZGV4XS5yZWZjb3VudCA9PSAwKSkKLQkJCWZyZWVfaHdfdGVtcChmcCwgY3MtPmlucHV0c1tpbmRleF0ucmVnKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRUdfVFlQRV9DT05TVDoKLQkJcmV0dXJuIChpbmRleCB8IFNSQ19DT05TVCk7Ci0JZGVmYXVsdDoKLQkJRVJST1IoIkludmFsaWQgdHlwZSBmb3Igc291cmNlIHJlZ1xuIik7Ci0JCXJldHVybiAoMCB8IFNSQ19DT05TVCk7Ci0JfQotCi0JaWYgKCF0ZXgpCi0JCWNzLT51c2VkX2luX25vZGUgfD0gKDEgPDwgaWR4KTsKLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQgdF9od19kc3Qoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCi0JCSAgICBHTHVpbnQgZGVzdCwgR0xib29sZWFuIHRleCwgaW50IHNsb3QpCi17Ci0JQ09NUElMRV9TVEFURTsKLQlpbnQgaWR4OwotCUdMdWludCBpbmRleCA9IFJFR19HRVRfSU5ERVgoZGVzdCk7Ci0JYXNzZXJ0KFJFR19HRVRfVkFMSUQoZGVzdCkpOwotCi0Jc3dpdGNoIChSRUdfR0VUX1RZUEUoZGVzdCkpIHsKLQljYXNlIFJFR19UWVBFX1RFTVA6Ci0JCWlmIChjcy0+dGVtcHNbUkVHX0dFVF9JTkRFWChkZXN0KV0ucmVnID09IC0xKSB7Ci0JCQlpZiAoIXRleCkgewotCQkJCWNzLT50ZW1wc1tpbmRleF0ucmVnID0gZ2V0X2h3X3RlbXAoZnAsIHNsb3QpOwotCQkJfSBlbHNlIHsKLQkJCQljcy0+dGVtcHNbaW5kZXhdLnJlZyA9IGdldF9od190ZW1wX3RleChmcCk7Ci0JCQl9Ci0JCX0KLQkJaWR4ID0gY3MtPnRlbXBzW2luZGV4XS5yZWc7Ci0KLQkJaWYgKCFSRUdfR0VUX05PX1VTRShkZXN0KSAmJiAoLS1jcy0+dGVtcHNbaW5kZXhdLnJlZmNvdW50ID09IDApKQotCQkJZnJlZV90ZW1wKGZwLCBkZXN0KTsKLQotCQljcy0+ZGVzdF9pbl9ub2RlIHw9ICgxIDw8IGlkeCk7Ci0JCWNzLT51c2VkX2luX25vZGUgfD0gKDEgPDwgaWR4KTsKLQkJYnJlYWs7Ci0JY2FzZSBSRUdfVFlQRV9PVVRQVVQ6Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBGUkFHX1JFU1VMVF9DT0xSOgotCQkJZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5mbGFncyB8PQotCQkJICAgIFIzMDBfUEZTX05PREVfT1VUUFVUX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgRlJBR19SRVNVTFRfREVQUjoKLQkJCWZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0uZmxhZ3MgfD0KLQkJCSAgICBSMzAwX1BGU19OT0RFX09VVFBVVF9ERVBUSDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpbmRleDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRVJST1IoImludmFsaWQgZGVzdCByZWcgdHlwZSAlZFxuIiwgUkVHX0dFVF9UWVBFKGRlc3QpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIHZvaWQgZW1pdF9ub3Aoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnApCi17Ci0JQ09NUElMRV9TVEFURTsKLQotCWlmIChjcy0+bnJzbG90cyA+PSBQRlNfTUFYX0FMVV9JTlNUKSB7Ci0JCUVSUk9SKCJPdXQgb2YgQUxVIGluc3RydWN0aW9uIHNsb3RzXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZwLT5hbHUuaW5zdFtjcy0+bnJzbG90c10uaW5zdDAgPSBOT1BfSU5TVDA7Ci0JZnAtPmFsdS5pbnN0W2NzLT5ucnNsb3RzXS5pbnN0MSA9IE5PUF9JTlNUMTsKLQlmcC0+YWx1Lmluc3RbY3MtPm5yc2xvdHNdLmluc3QyID0gTk9QX0lOU1QyOwotCWZwLT5hbHUuaW5zdFtjcy0+bnJzbG90c10uaW5zdDMgPSBOT1BfSU5TVDM7Ci0JY3MtPm5yc2xvdHMrKzsKLX0KLQotc3RhdGljIHZvaWQgZW1pdF90ZXgoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCi0JCSAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmZwaSwgaW50IG9wY29kZSkKLXsKLQlDT01QSUxFX1NUQVRFOwotCUdMdWludCBjb29yZCA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JR0x1aW50IGRlc3QgPSB1bmRlZiwgcmRlc3QgPSB1bmRlZjsKLQlHTHVpbnQgZGluLCB1aW47Ci0JaW50IHVuaXQgPSBmcGktPlRleFNyY1VuaXQ7Ci0JaW50IGh3c3JjLCBod2Rlc3Q7Ci0JR0x1aW50IHRlbXByZWcgPSAwOwotCi0JdWluID0gY3MtPnVzZWRfaW5fbm9kZTsKLQlkaW4gPSBjcy0+ZGVzdF9pbl9ub2RlOwotCi0JLyogUmVzb2x2ZSBzb3VyY2UvZGVzdCB0byBoYXJkd2FyZSByZWdpc3RlcnMgKi8KLQlpZiAob3Bjb2RlICE9IFIzMDBfRlBJVFhfT1BfS0lMKSB7Ci0JCWlmIChmcGktPlRleFNyY1RhcmdldCA9PSBURVhUVVJFX1JFQ1RfSU5ERVgpIHsKLQkJCS8qKgotCQkJICogSGFyZHdhcmUgdXNlcyBbMC4uMV14WzAuLjFdIHJhbmdlIGZvciByZWN0YW5nbGUgdGV4dHVyZXMKLQkJCSAqIGluc3RlYWQgb2YgWzAuLldpZHRoXXhbMC4uSGVpZ2h0XS4KLQkJCSAqIEFkZCBhIHNjYWxpbmcgaW5zdHJ1Y3Rpb24uCi0JCQkgKgotCQkJICogXHRvZG8gUmVmYWN0b3IgdGhpcyBvbmNlIHdlIGhhdmUgcHJvcGVyIHJld3JpdGluZy9vcHRpbWl6YXRpb24KLQkJCSAqIHN1cHBvcnQgZm9yIHByb2dyYW1zLgotCQkJICovCi0JCQlnbF9zdGF0ZV9pbmRleCB0b2tlbnNbU1RBVEVfTEVOR1RIXSA9IHsKLQkJCQlTVEFURV9JTlRFUk5BTCwgU1RBVEVfUjMwMF9URVhSRUNUX0ZBQ1RPUiwgMCwgMCwKLQkJCQkwCi0JCQl9OwotCQkJaW50IGZhY3Rvcl9pbmRleDsKLQkJCUdMdWludCBmYWN0b3JyZWc7Ci0KLQkJCXRva2Vuc1syXSA9IHVuaXQ7Ci0JCQlmYWN0b3JfaW5kZXggPQotCQkJICAgIF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UoZnAtPm1lc2FfcHJvZ3JhbS5CYXNlLgotCQkJCQkJICAgICAgUGFyYW1ldGVycywgdG9rZW5zKTsKLQkJCWZhY3RvcnJlZyA9Ci0JCQkgICAgZW1pdF9jb25zdDRmdihmcCwKLQkJCQkJICBmcC0+bWVzYV9wcm9ncmFtLkJhc2UuUGFyYW1ldGVycy0+Ci0JCQkJCSAgUGFyYW1ldGVyVmFsdWVzW2ZhY3Rvcl9pbmRleF0pOwotCQkJdGVtcHJlZyA9IGtlZXAoZ2V0X3RlbXBfcmVnKGZwKSk7Ci0KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXByZWcsIFdSSVRFTUFTS19YWVpXLAotCQkJCSAgIGNvb3JkLCBmYWN0b3JyZWcsIHBmc196ZXJvLCAwKTsKLQotCQkJLyogRW5zdXJlIGNvcnJlY3Qgbm9kZSBpbmRpcmVjdGlvbiAqLwotCQkJdWluID0gY3MtPnVzZWRfaW5fbm9kZTsKLQkJCWRpbiA9IGNzLT5kZXN0X2luX25vZGU7Ci0KLQkJCWh3c3JjID0gdF9od19zcmMoZnAsIHRlbXByZWcsIEdMX1RSVUUpOwotCQl9IGVsc2UgewotCQkJaHdzcmMgPSB0X2h3X3NyYyhmcCwgY29vcmQsIEdMX1RSVUUpOwotCQl9Ci0KLQkJZGVzdCA9IHRfZHN0KGZwLCBmcGktPkRzdFJlZyk7Ci0KLQkJLyogcjMwMCBkb2Vzbid0IHNlZW0gdG8gYmUgYWJsZSB0byBkbyBURVgtPm91dHB1dCByZWcgKi8KLQkJaWYgKFJFR19HRVRfVFlQRShkZXN0KSA9PSBSRUdfVFlQRV9PVVRQVVQpIHsKLQkJCXJkZXN0ID0gZGVzdDsKLQkJCWRlc3QgPSBnZXRfdGVtcF9yZWdfdGV4KGZwKTsKLQkJfQotCQlod2Rlc3QgPQotCQkgICAgdF9od19kc3QoZnAsIGRlc3QsIEdMX1RSVUUsCi0JCQkgICAgIGZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0uYWx1X29mZnNldCk7Ci0KLQkJLyogVXNlIGEgdGVtcCB0aGF0IGhhc24ndCBiZWVuIHVzZWQgaW4gdGhpcyBub2RlLCByYXRoZXIKLQkJICogdGhhbiBjYXVzaW5nIGFuIGluZGlyZWN0aW9uCi0JCSAqLwotCQlpZiAodWluICYgKDEgPDwgaHdkZXN0KSkgewotCQkJZnJlZV9od190ZW1wKGZwLCBod2Rlc3QpOwotCQkJaHdkZXN0ID0gZ2V0X2h3X3RlbXBfdGV4KGZwKTsKLQkJCWNzLT50ZW1wc1tSRUdfR0VUX0lOREVYKGRlc3QpXS5yZWcgPSBod2Rlc3Q7Ci0JCX0KLQl9IGVsc2UgewotCQlod2Rlc3QgPSAwOwotCQl1bml0ID0gMDsKLQkJaHdzcmMgPSB0X2h3X3NyYyhmcCwgY29vcmQsIEdMX1RSVUUpOwotCX0KLQotCS8qIEluZGlyZWN0aW9uIGlmIHNvdXJjZSBoYXMgYmVlbiB3cml0dGVuIGluIHRoaXMgbm9kZSwgb3IgaWYgdGhlCi0JICogZGVzdCBoYXMgYmVlbiByZWFkL3dyaXR0ZW4gaW4gdGhpcyBub2RlCi0JICovCi0JaWYgKChSRUdfR0VUX1RZUEUoY29vcmQpICE9IFJFR19UWVBFX0NPTlNUICYmCi0JICAgICAoZGluICYgKDEgPDwgaHdzcmMpKSkgfHwgKHVpbiAmICgxIDw8IGh3ZGVzdCkpKSB7Ci0KLQkJLyogRmluaXNoIG9mZiBjdXJyZW50IG5vZGUgKi8KLQkJaWYgKGZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0uYWx1X29mZnNldCA9PSBjcy0+bnJzbG90cykKLQkJCWVtaXRfbm9wKGZwKTsKLQotCQlmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLmFsdV9lbmQgPQotCQkgICAgY3MtPm5yc2xvdHMgLSBmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLmFsdV9vZmZzZXQgLSAxOwotCQlhc3NlcnQoZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5hbHVfZW5kID49IDApOwotCi0JCWlmICgrK2ZwLT5jdXJfbm9kZSA+PSBQRlNfTUFYX1RFWF9JTkRJUkVDVCkgewotCQkJRVJST1IoInRvbyBtYW55IGxldmVscyBvZiB0ZXh0dXJlIGluZGlyZWN0aW9uXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIFN0YXJ0IG5ldyBub2RlICovCi0JCWZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0udGV4X29mZnNldCA9IGZwLT50ZXgubGVuZ3RoOwotCQlmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLmFsdV9vZmZzZXQgPSBjcy0+bnJzbG90czsKLQkJZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS50ZXhfZW5kID0gLTE7Ci0JCWZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0uYWx1X2VuZCA9IC0xOwotCQlmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLmZsYWdzID0gMDsKLQkJY3MtPnVzZWRfaW5fbm9kZSA9IDA7Ci0JCWNzLT5kZXN0X2luX25vZGUgPSAwOwotCX0KLQotCWlmIChmcC0+Y3VyX25vZGUgPT0gMCkKLQkJZnAtPmZpcnN0X25vZGVfaGFzX3RleCA9IDE7Ci0KLQlmcC0+dGV4Lmluc3RbZnAtPnRleC5sZW5ndGgrK10gPSAwIHwgKGh3c3JjIDw8IFIzMDBfRlBJVFhfU1JDX1NISUZUKQotCSAgICB8IChod2Rlc3QgPDwgUjMwMF9GUElUWF9EU1RfU0hJRlQpCi0JICAgIHwgKHVuaXQgPDwgUjMwMF9GUElUWF9JTUFHRV9TSElGVCkKLQkgICAgLyogbm90IGVudGlyZWx5IHN1cmUgYWJvdXQgdGhpcyAqLwotCSAgICB8IChvcGNvZGUgPDwgUjMwMF9GUElUWF9PUENPREVfU0hJRlQpOwotCi0JY3MtPmRlc3RfaW5fbm9kZSB8PSAoMSA8PCBod2Rlc3QpOwotCWlmIChSRUdfR0VUX1RZUEUoY29vcmQpICE9IFJFR19UWVBFX0NPTlNUKQotCQljcy0+dXNlZF9pbl9ub2RlIHw9ICgxIDw8IGh3c3JjKTsKLQotCWZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0udGV4X2VuZCsrOwotCi0JLyogQ29weSBmcm9tIHRlbXAgdG8gb3V0cHV0IGlmIG5lZWRlZCAqLwotCWlmIChSRUdfR0VUX1ZBTElEKHJkZXN0KSkgewotCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCByZGVzdCwgV1JJVEVNQVNLX1hZWlcsIGRlc3QsCi0JCQkgICBwZnNfb25lLCBwZnNfemVybywgMCk7Ci0JCWZyZWVfdGVtcChmcCwgZGVzdCk7Ci0JfQotCi0JLyogRnJlZSB0ZW1wIHJlZ2lzdGVyICovCi0JaWYgKHRlbXByZWcgIT0gMCkKLQkJZnJlZV90ZW1wKGZwLCB0ZW1wcmVnKTsKLX0KLQogLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBzbG90IHdoZXJlIHdlIGNvdWxkIHBvc3NpYmx5IGFsbG93IHdyaXRpbmcgdG8gZGVzdCwKLSAqIGFjY29yZGluZyB0byByZWdpc3RlciBhbGxvY2F0aW9uLgorICogVHJhbnNmb3JtIFRFWCwgVFhQLCBUWEIsIGFuZCBLSUwgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogIC0gcHJlbXVsdGlwbHkgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgUkVDVAorICogIC0gZXh0cmFjdCBvcGVyYW5kIHN3aXp6bGVzCisgKiAgLSBpbnRyb2R1Y2UgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIgd2hlbiB3cml0ZSBtYXNrcyBhcmUgbmVlZGVkCisgKgorICogXHRvZG8gSWYvd2hlbiByNXh4IHVzZXMgdGhlIHJhZGVvbl9wcm9ncmFtIGFyY2hpdGVjdHVyZSwgdGhpcyBjYW4gcHJvYmFibHkKKyAqIGJlIHJldXNlZC4KICAqLwotc3RhdGljIGludCBnZXRfZWFybGllc3RfYWxsb3dlZF93cml0ZShzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwKLQkJCQkgICAgICBHTHVpbnQgZGVzdCwgaW50IG1hc2spCitzdGF0aWMgR0xib29sZWFuIHRyYW5zZm9ybV9URVgoCisJc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCAqdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogb3JpZ19pbnN0LCB2b2lkKiBkYXRhKQogewotCUNPTVBJTEVfU1RBVEU7Ci0JaW50IGlkeDsKLQlpbnQgcG9zOwotCUdMdWludCBpbmRleCA9IFJFR19HRVRfSU5ERVgoZGVzdCk7Ci0JYXNzZXJ0KFJFR19HRVRfVkFMSUQoZGVzdCkpOworCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIgKmNvbXBpbGVyID0KKwkJKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIqKWRhdGE7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gaW5zdCA9ICpvcmlnX2luc3Q7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIHRndDsKKwlHTGJvb2xlYW4gZGVzdHJlZGlyZWN0ID0gR0xfRkFMU0U7CiAKLQlzd2l0Y2ggKFJFR19HRVRfVFlQRShkZXN0KSkgewotCWNhc2UgUkVHX1RZUEVfVEVNUDoKLQkJaWYgKGNzLT50ZW1wc1tpbmRleF0ucmVnID09IC0xKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWR4ID0gY3MtPnRlbXBzW2luZGV4XS5yZWc7Ci0JCWJyZWFrOwotCWNhc2UgUkVHX1RZUEVfT1VUUFVUOgotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlFUlJPUigiaW52YWxpZCBkZXN0IHJlZyB0eXBlICVkXG4iLCBSRUdfR0VUX1RZUEUoZGVzdCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwb3MgPSBjcy0+aHd0ZW1wc1tpZHhdLnJlc2VydmVkOwotCWlmIChtYXNrICYgV1JJVEVNQVNLX1hZWikgewotCQlpZiAocG9zIDwgY3MtPmh3dGVtcHNbaWR4XS52ZWN0b3JfbGFzdHJlYWQpCi0JCQlwb3MgPSBjcy0+aHd0ZW1wc1tpZHhdLnZlY3Rvcl9sYXN0cmVhZDsKLQl9Ci0JaWYgKG1hc2sgJiBXUklURU1BU0tfVykgewotCQlpZiAocG9zIDwgY3MtPmh3dGVtcHNbaWR4XS5zY2FsYXJfbGFzdHJlYWQpCi0JCQlwb3MgPSBjcy0+aHd0ZW1wc1tpZHhdLnNjYWxhcl9sYXN0cmVhZDsKLQl9Ci0KLQlyZXR1cm4gcG9zOwotfQotCi0vKioKLSAqIEFsbG9jYXRlcyBhIHNsb3QgZm9yIGFuIEFMVSBpbnN0cnVjdGlvbiB0aGF0IGNhbiBjb25zaXN0IG9mCi0gKiBhIHZlcnRleCBwYXJ0IG9yIGEgc2NhbGFyIHBhcnQgb3IgYm90aC4KLSAqCi0gKiBTb3VyY2VzIGZyb20gc3JjIChzcmNbMF0gdG8gc3JjW2FyZ2MtMV0pIGFyZSBhZGRlZCB0byB0aGUgc2xvdCBpbiB0aGUKLSAqIGFwcHJvcHJpYXRlIHBvc2l0aW9uICh2ZWN0b3IgYW5kL29yIHNjYWxhciksIGFuZCB0aGVpciBwb3NpdGlvbnMgYXJlCi0gKiByZWNvcmRlZCBpbiB0aGUgc3JjcG9zIGFycmF5LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZW1pdHMgaW5zdHJ1Y3Rpb24gY29kZSBmb3IgdGhlIHNvdXJjZSBmZXRjaCBhbmQgdGhlCi0gKiBhcmd1bWVudCBzZWxlY3Rpb24uIEl0IGRvZXMgbm90IGVtaXQgaW5zdHJ1Y3Rpb24gY29kZSBmb3IgdGhlCi0gKiBvcGNvZGUgb3IgdGhlIGRlc3RpbmF0aW9uIHNlbGVjdGlvbi4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2xvdAotICovCi1zdGF0aWMgaW50IGZpbmRfYW5kX3ByZXBhcmVfc2xvdChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwKLQkJCQkgR0xib29sZWFuIGVtaXRfdm9wLAotCQkJCSBHTGJvb2xlYW4gZW1pdF9zb3AsCi0JCQkJIGludCBhcmdjLCBHTHVpbnQgKiBzcmMsIEdMdWludCBkZXN0LCBpbnQgbWFzaykKLXsKLQlDT01QSUxFX1NUQVRFOwotCWludCBod3NyY1szXTsKLQlpbnQgc3JjcG9zWzNdOwotCXVuc2lnbmVkIGludCB1c2VkOwotCWludCB0ZW1wdXNlZDsKLQlpbnQgdGVtcHZzcmNbM107Ci0JaW50IHRlbXBzc3JjWzNdOwotCWludCBwb3M7Ci0JaW50IHJlZ25yOwotCWludCBpLCBqOwotCi0JLy8gRGV0ZXJtaW5lIGluc3RydWN0aW9uIHNsb3RzLCB3aGV0aGVyIHNvdXJjZXMgYXJlIHJlcXVpcmVkIG9uCi0JLy8gdmVjdG9yIG9yIHNjYWxhciBzaWRlLCBhbmQgdGhlIHNtYWxsZXN0IHNsb3QgbnVtYmVyIHdoZXJlCi0JLy8gYWxsIHNvdXJjZSByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZQotCXVzZWQgPSAwOwotCWlmIChlbWl0X3ZvcCkKLQkJdXNlZCB8PSBTTE9UX09QX1ZFQ1RPUjsKLQlpZiAoZW1pdF9zb3ApCi0JCXVzZWQgfD0gU0xPVF9PUF9TQ0FMQVI7Ci0KLQlwb3MgPSBnZXRfZWFybGllc3RfYWxsb3dlZF93cml0ZShmcCwgZGVzdCwgbWFzayk7Ci0KLQlpZiAoZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5hbHVfb2Zmc2V0ID4gcG9zKQotCQlwb3MgPSBmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLmFsdV9vZmZzZXQ7Ci0JZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgewotCQlpZiAoIVJFR19HRVRfQlVJTFRJTihzcmNbaV0pKSB7Ci0JCQlpZiAoZW1pdF92b3ApCi0JCQkJdXNlZCB8PSB2X3N3aXpbUkVHX0dFVF9WU1daKHNyY1tpXSldLmZsYWdzIDw8IGk7Ci0JCQlpZiAoZW1pdF9zb3ApCi0JCQkJdXNlZCB8PSBzX3N3aXpbUkVHX0dFVF9TU1daKHNyY1tpXSldLmZsYWdzIDw8IGk7Ci0JCX0KLQotCQlod3NyY1tpXSA9IHRfaHdfc3JjKGZwLCBzcmNbaV0sIEdMX0ZBTFNFKTsJLyogTm90ZTogc2lkZWVmZmVjdHMgd3J0IHJlZmNvdW50aW5nISAqLwotCQlyZWduciA9IGh3c3JjW2ldICYgMzE7Ci0KLQkJaWYgKFJFR19HRVRfVFlQRShzcmNbaV0pID09IFJFR19UWVBFX1RFTVApIHsKLQkJCWlmICh1c2VkICYgKFNMT1RfU1JDX1ZFQ1RPUiA8PCBpKSkgewotCQkJCWlmIChjcy0+aHd0ZW1wc1tyZWducl0udmVjdG9yX3ZhbGlkID4gcG9zKQotCQkJCQlwb3MgPSBjcy0+aHd0ZW1wc1tyZWducl0udmVjdG9yX3ZhbGlkOwotCQkJfQotCQkJaWYgKHVzZWQgJiAoU0xPVF9TUkNfU0NBTEFSIDw8IGkpKSB7Ci0JCQkJaWYgKGNzLT5od3RlbXBzW3JlZ25yXS5zY2FsYXJfdmFsaWQgPiBwb3MpCi0JCQkJCXBvcyA9IGNzLT5od3RlbXBzW3JlZ25yXS5zY2FsYXJfdmFsaWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBGaW5kIGEgc2xvdCB0aGF0IGZpdHMKLQlmb3IgKDs7ICsrcG9zKSB7Ci0JCWlmIChjcy0+c2xvdFtwb3NdLnVzZWQgJiB1c2VkICYgU0xPVF9PUF9CT1RIKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBvcyA+PSBjcy0+bnJzbG90cykgewotCQkJaWYgKGNzLT5ucnNsb3RzID49IFBGU19NQVhfQUxVX0lOU1QpIHsKLQkJCQlFUlJPUigiT3V0IG9mIEFMVSBpbnN0cnVjdGlvbiBzbG90c1xuIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlmcC0+YWx1Lmluc3RbcG9zXS5pbnN0MCA9IE5PUF9JTlNUMDsKLQkJCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QxID0gTk9QX0lOU1QxOwotCQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDIgPSBOT1BfSU5TVDI7Ci0JCQlmcC0+YWx1Lmluc3RbcG9zXS5pbnN0MyA9IE5PUF9JTlNUMzsKLQotCQkJY3MtPm5yc2xvdHMrKzsKLQkJfQotCQkvLyBOb3RlOiBXaGVuIHdlIG5lZWQgYm90aCBwYXJ0cyAodmVjdG9yIGFuZCBzY2FsYXIpIG9mIGEgc291cmNlLAotCQkvLyB3ZSBhbHdheXMgdHJ5IHRvIHB1dCB0aGVtIGludG8gdGhlIHNhbWUgcG9zaXRpb24uIFRoaXMgbWFrZXMgdGhlCi0JCS8vIGNvZGUgZWFzaWVyIHRvIHJlYWQsIGFuZCBpdCBpcyBvcHRpbWFsIChpLmUuIG9uZSBkb2Vzbid0IGdhaW4KLQkJLy8gYW55dGhpbmcgYnkgc3BsaXR0aW5nIHRoZSBwYXJ0cykuCi0JCS8vIEl0IGFsc28gYXZvaWRzIGhlYWRhY2hlcyB3aXRoIHN3aXp6bGVzIHRoYXQgYWNjZXNzIGJvdGggcGFydHMgKGkuZSBXWFkpCi0JCXRlbXB1c2VkID0gY3MtPnNsb3RbcG9zXS51c2VkOwotCQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0JCQl0ZW1wdnNyY1tpXSA9IGNzLT5zbG90W3Bvc10udnNyY1tpXTsKLQkJCXRlbXBzc3JjW2ldID0gY3MtPnNsb3RbcG9zXS5zc3JjW2ldOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgewotCQkJaW50IGZsYWdzID0gKHVzZWQgPj4gaSkgJiBTTE9UX1NSQ19CT1RIOwotCi0JCQlpZiAoIWZsYWdzKSB7Ci0JCQkJc3JjcG9zW2ldID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChqID0gMDsgaiA8IDM7ICsraikgewotCQkJCWlmICgodGVtcHVzZWQgPj4gaikgJiBmbGFncyAmIFNMT1RfU1JDX1ZFQ1RPUikgewotCQkJCQlpZiAodGVtcHZzcmNbal0gIT0gaHdzcmNbaV0pCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHRlbXB1c2VkID4+IGopICYgZmxhZ3MgJiBTTE9UX1NSQ19TQ0FMQVIpIHsKLQkJCQkJaWYgKHRlbXBzc3JjW2pdICE9IGh3c3JjW2ldKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChqID09IDMpCi0JCQkJYnJlYWs7Ci0KLQkJCXNyY3Bvc1tpXSA9IGo7Ci0JCQl0ZW1wdXNlZCB8PSBmbGFncyA8PCBqOwotCQkJaWYgKGZsYWdzICYgU0xPVF9TUkNfVkVDVE9SKQotCQkJCXRlbXB2c3JjW2pdID0gaHdzcmNbaV07Ci0JCQlpZiAoZmxhZ3MgJiBTTE9UX1NSQ19TQ0FMQVIpCi0JCQkJdGVtcHNzcmNbal0gPSBod3NyY1tpXTsKLQkJfQotCi0JCWlmIChpID09IGFyZ2MpCi0JCQlicmVhazsKLQl9Ci0KLQkvLyBGb3VuZCBhIHNsb3QsIHJlc2VydmUgaXQKLQljcy0+c2xvdFtwb3NdLnVzZWQgPSB0ZW1wdXNlZCB8ICh1c2VkICYgU0xPVF9PUF9CT1RIKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0JCWNzLT5zbG90W3Bvc10udnNyY1tpXSA9IHRlbXB2c3JjW2ldOwotCQljcy0+c2xvdFtwb3NdLnNzcmNbaV0gPSB0ZW1wc3NyY1tpXTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7Ci0JCWlmIChSRUdfR0VUX1RZUEUoc3JjW2ldKSA9PSBSRUdfVFlQRV9URU1QKSB7Ci0JCQlpbnQgcmVnbnIgPSBod3NyY1tpXSAmIDMxOwotCi0JCQlpZiAodXNlZCAmIChTTE9UX1NSQ19WRUNUT1IgPDwgaSkpIHsKLQkJCQlpZiAoY3MtPmh3dGVtcHNbcmVnbnJdLnZlY3Rvcl9sYXN0cmVhZCA8IHBvcykKLQkJCQkJY3MtPmh3dGVtcHNbcmVnbnJdLnZlY3Rvcl9sYXN0cmVhZCA9Ci0JCQkJCSAgICBwb3M7Ci0JCQl9Ci0JCQlpZiAodXNlZCAmIChTTE9UX1NSQ19TQ0FMQVIgPDwgaSkpIHsKLQkJCQlpZiAoY3MtPmh3dGVtcHNbcmVnbnJdLnNjYWxhcl9sYXN0cmVhZCA8IHBvcykKLQkJCQkJY3MtPmh3dGVtcHNbcmVnbnJdLnNjYWxhcl9sYXN0cmVhZCA9Ci0JCQkJCSAgICBwb3M7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBFbWl0IHRoZSBzb3VyY2UgZmV0Y2ggY29kZQotCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QxICY9IH5SMzAwX0ZQSTFfU1JDX01BU0s7Ci0JZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDEgfD0KLQkgICAgKChjcy0+c2xvdFtwb3NdLnZzcmNbMF0gPDwgUjMwMF9GUEkxX1NSQzBDX1NISUZUKSB8Ci0JICAgICAoY3MtPnNsb3RbcG9zXS52c3JjWzFdIDw8IFIzMDBfRlBJMV9TUkMxQ19TSElGVCkgfAotCSAgICAgKGNzLT5zbG90W3Bvc10udnNyY1syXSA8PCBSMzAwX0ZQSTFfU1JDMkNfU0hJRlQpKTsKLQotCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QzICY9IH5SMzAwX0ZQSTNfU1JDX01BU0s7Ci0JZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDMgfD0KLQkgICAgKChjcy0+c2xvdFtwb3NdLnNzcmNbMF0gPDwgUjMwMF9GUEkzX1NSQzBBX1NISUZUKSB8Ci0JICAgICAoY3MtPnNsb3RbcG9zXS5zc3JjWzFdIDw8IFIzMDBfRlBJM19TUkMxQV9TSElGVCkgfAotCSAgICAgKGNzLT5zbG90W3Bvc10uc3NyY1syXSA8PCBSMzAwX0ZQSTNfU1JDMkFfU0hJRlQpKTsKLQotCS8vIEVtaXQgdGhlIGFyZ3VtZW50IHNlbGVjdGlvbiBjb2RlCi0JaWYgKGVtaXRfdm9wKSB7Ci0JCWludCBzd3pbM107Ci0KLQkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQkJaWYgKGkgPCBhcmdjKSB7Ci0JCQkJc3d6W2ldID0gKHZfc3dpeltSRUdfR0VUX1ZTV1ooc3JjW2ldKV0uYmFzZSArCi0JCQkJCSAgKHNyY3Bvc1tpXSAqCi0JCQkJCSAgIHZfc3dpeltSRUdfR0VUX1ZTV1ooc3JjW2ldKV0uCi0JCQkJCSAgIHN0cmlkZSkpIHwgKChzcmNbaV0gJiBSRUdfTkVHVl9NQVNLKQotCQkJCQkJICAgICAgID8gQVJHX05FRyA6IDApIHwgKChzcmNbaV0KLQkJCQkJCQkJCSAgJgotCQkJCQkJCQkJICBSRUdfQUJTX01BU0spCi0JCQkJCQkJCQkgPwotCQkJCQkJCQkJIEFSR19BQlMKLQkJCQkJCQkJCSA6IDApOwotCQkJfSBlbHNlIHsKLQkJCQlzd3pbaV0gPSBSMzAwX0ZQSTBfQVJHQ19aRVJPOwotCQkJfQotCQl9Ci0KLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDAgJj0KLQkJICAgIH4oUjMwMF9GUEkwX0FSRzBDX01BU0sgfCBSMzAwX0ZQSTBfQVJHMUNfTUFTSyB8Ci0JCSAgICAgIFIzMDBfRlBJMF9BUkcyQ19NQVNLKTsKLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDAgfD0KLQkJICAgIChzd3pbMF0gPDwgUjMwMF9GUEkwX0FSRzBDX1NISUZUKSB8IChzd3pbMV0gPDwKLQkJCQkJCQkgUjMwMF9GUEkwX0FSRzFDX1NISUZUKQotCQkgICAgfCAoc3d6WzJdIDw8IFIzMDBfRlBJMF9BUkcyQ19TSElGVCk7Ci0JfQotCi0JaWYgKGVtaXRfc29wKSB7Ci0JCWludCBzd3pbM107Ci0KLQkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQkJaWYgKGkgPCBhcmdjKSB7Ci0JCQkJc3d6W2ldID0gKHNfc3dpeltSRUdfR0VUX1NTV1ooc3JjW2ldKV0uYmFzZSArCi0JCQkJCSAgKHNyY3Bvc1tpXSAqCi0JCQkJCSAgIHNfc3dpeltSRUdfR0VUX1NTV1ooc3JjW2ldKV0uCi0JCQkJCSAgIHN0cmlkZSkpIHwgKChzcmNbaV0gJiBSRUdfTkVHVl9NQVNLKQotCQkJCQkJICAgICAgID8gQVJHX05FRyA6IDApIHwgKChzcmNbaV0KLQkJCQkJCQkJCSAgJgotCQkJCQkJCQkJICBSRUdfQUJTX01BU0spCi0JCQkJCQkJCQkgPwotCQkJCQkJCQkJIEFSR19BQlMKLQkJCQkJCQkJCSA6IDApOwotCQkJfSBlbHNlIHsKLQkJCQlzd3pbaV0gPSBSMzAwX0ZQSTJfQVJHQV9aRVJPOwotCQkJfQotCQl9Ci0KLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDIgJj0KLQkJICAgIH4oUjMwMF9GUEkyX0FSRzBBX01BU0sgfCBSMzAwX0ZQSTJfQVJHMUFfTUFTSyB8Ci0JCSAgICAgIFIzMDBfRlBJMl9BUkcyQV9NQVNLKTsKLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDIgfD0KLQkJICAgIChzd3pbMF0gPDwgUjMwMF9GUEkyX0FSRzBBX1NISUZUKSB8IChzd3pbMV0gPDwKLQkJCQkJCQkgUjMwMF9GUEkyX0FSRzFBX1NISUZUKQotCQkgICAgfCAoc3d6WzJdIDw8IFIzMDBfRlBJMl9BUkcyQV9TSElGVCk7Ci0JfQotCi0JcmV0dXJuIHBvczsKLX0KLQotLyoqCi0gKiBBcHBlbmQgYW4gQUxVIGluc3RydWN0aW9uIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0LgotICovCi1zdGF0aWMgdm9pZCBlbWl0X2FyaXRoKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkgICAgICAgaW50IG9wLAotCQkgICAgICAgR0x1aW50IGRlc3QsCi0JCSAgICAgICBpbnQgbWFzaywKLQkJICAgICAgIEdMdWludCBzcmMwLCBHTHVpbnQgc3JjMSwgR0x1aW50IHNyYzIsIGludCBmbGFncykKLXsKLQlDT01QSUxFX1NUQVRFOwotCUdMdWludCBzcmNbM10gPSB7IHNyYzAsIHNyYzEsIHNyYzIgfTsKLQlpbnQgaHdkZXN0OwotCUdMYm9vbGVhbiBlbWl0X3ZvcCwgZW1pdF9zb3A7Ci0JaW50IHZvcCwgc29wLCBhcmdjOwotCWludCBwb3M7Ci0KLQl2b3AgPSByMzAwX2Zwb3Bbb3BdLnZfb3A7Ci0Jc29wID0gcjMwMF9mcG9wW29wXS5zX29wOwotCWFyZ2MgPSByMzAwX2Zwb3Bbb3BdLmFyZ2M7Ci0KLQlpZiAoUkVHX0dFVF9UWVBFKGRlc3QpID09IFJFR19UWVBFX09VVFBVVCAmJgotCSAgICBSRUdfR0VUX0lOREVYKGRlc3QpID09IEZSQUdfUkVTVUxUX0RFUFIpIHsKLQkJaWYgKG1hc2sgJiBXUklURU1BU0tfWikgewotCQkJbWFzayA9IFdSSVRFTUFTS19XOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZW1pdF92b3AgPSBHTF9GQUxTRTsKLQllbWl0X3NvcCA9IEdMX0ZBTFNFOwotCWlmICgobWFzayAmIFdSSVRFTUFTS19YWVopIHx8IHZvcCA9PSBSMzAwX0ZQSTBfT1VUQ19EUDMpCi0JCWVtaXRfdm9wID0gR0xfVFJVRTsKLQlpZiAoKG1hc2sgJiBXUklURU1BU0tfVykgfHwgdm9wID09IFIzMDBfRlBJMF9PVVRDX1JFUExfQUxQSEEpCi0JCWVtaXRfc29wID0gR0xfVFJVRTsKLQotCXBvcyA9Ci0JICAgIGZpbmRfYW5kX3ByZXBhcmVfc2xvdChmcCwgZW1pdF92b3AsIGVtaXRfc29wLCBhcmdjLCBzcmMsIGRlc3QsCi0JCQkJICBtYXNrKTsKLQlpZiAocG9zIDwgMCkKLQkJcmV0dXJuOwotCi0JaHdkZXN0ID0gdF9od19kc3QoZnAsIGRlc3QsIEdMX0ZBTFNFLCBwb3MpOwkvKiBOb3RlOiBTaWRlIGVmZmVjdHMgd3J0IHJlZ2lzdGVyIGFsbG9jYXRpb24gKi8KLQotCWlmIChmbGFncyAmIFBGU19GTEFHX1NBVCkgewotCQl2b3AgfD0gUjMwMF9GUEkwX09VVENfU0FUOwotCQlzb3AgfD0gUjMwMF9GUEkyX09VVEFfU0FUOwotCX0KLQotCS8qIFRocm93IHRoZSBwaWVjZXMgdG9nZXRoZXIgYW5kIGdldCBGUEkwLzEgKi8KLQlpZiAoZW1pdF92b3ApIHsKLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDAgfD0gdm9wOwotCi0JCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QxIHw9IGh3ZGVzdCA8PCBSMzAwX0ZQSTFfRFNUQ19TSElGVDsKLQotCQlpZiAoUkVHX0dFVF9UWVBFKGRlc3QpID09IFJFR19UWVBFX09VVFBVVCkgewotCQkJaWYgKFJFR19HRVRfSU5ERVgoZGVzdCkgPT0gRlJBR19SRVNVTFRfQ09MUikgewotCQkJCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QxIHw9Ci0JCQkJICAgIChtYXNrICYgV1JJVEVNQVNLX1hZWikgPDwKLQkJCQkgICAgUjMwMF9GUEkxX0RTVENfT1VUUFVUX01BU0tfU0hJRlQ7Ci0JCQl9IGVsc2UKLQkJCQlhc3NlcnQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcC0+YWx1Lmluc3RbcG9zXS5pbnN0MSB8PQotCQkJICAgIChtYXNrICYgV1JJVEVNQVNLX1hZWikgPDwKLQkJCSAgICBSMzAwX0ZQSTFfRFNUQ19SRUdfTUFTS19TSElGVDsKLQotCQkJY3MtPmh3dGVtcHNbaHdkZXN0XS52ZWN0b3JfdmFsaWQgPSBwb3MgKyAxOwotCQl9Ci0JfQotCi0JLyogQW5kIG5vdyBGUEkyLzMgKi8KLQlpZiAoZW1pdF9zb3ApIHsKLQkJZnAtPmFsdS5pbnN0W3Bvc10uaW5zdDIgfD0gc29wOwotCi0JCWlmIChtYXNrICYgV1JJVEVNQVNLX1cpIHsKLQkJCWlmIChSRUdfR0VUX1RZUEUoZGVzdCkgPT0gUkVHX1RZUEVfT1VUUFVUKSB7Ci0JCQkJaWYgKFJFR19HRVRfSU5ERVgoZGVzdCkgPT0gRlJBR19SRVNVTFRfQ09MUikgewotCQkJCQlmcC0+YWx1Lmluc3RbcG9zXS5pbnN0MyB8PQotCQkJCQkgICAgKGh3ZGVzdCA8PCBSMzAwX0ZQSTNfRFNUQV9TSElGVCkgfAotCQkJCQkgICAgUjMwMF9GUEkzX0RTVEFfT1VUUFVUOwotCQkJCX0gZWxzZSBpZiAoUkVHX0dFVF9JTkRFWChkZXN0KSA9PQotCQkJCQkgICBGUkFHX1JFU1VMVF9ERVBSKSB7Ci0JCQkJCWZwLT5hbHUuaW5zdFtwb3NdLmluc3QzIHw9Ci0JCQkJCSAgICBSMzAwX0ZQSTNfRFNUQV9ERVBUSDsKLQkJCQl9IGVsc2UKLQkJCQkJYXNzZXJ0KDApOwotCQkJfSBlbHNlIHsKLQkJCQlmcC0+YWx1Lmluc3RbcG9zXS5pbnN0MyB8PQotCQkJCSAgICAoaHdkZXN0IDw8IFIzMDBfRlBJM19EU1RBX1NISUZUKSB8Ci0JCQkJICAgIFIzMDBfRlBJM19EU1RBX1JFRzsKLQotCQkJCWNzLT5od3RlbXBzW2h3ZGVzdF0uc2NhbGFyX3ZhbGlkID0gcG9zICsgMTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotI2lmIDAKLXN0YXRpYyBHTHVpbnQgZ2V0X2F0dHJpYihzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwgR0x1aW50IGF0dHIpCi17Ci0Jc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKm1wID0gJmZwLT5tZXNhX3Byb2dyYW07Ci0JR0x1aW50IHIgPSB1bmRlZjsKLQotCWlmICghKG1wLT5CYXNlLklucHV0c1JlYWQgJiAoMSA8PCBhdHRyKSkpIHsKLQkJRVJST1IoIkF0dHJpYnV0ZSAlZCB3YXMgbm90IHByb3ZpZGVkIVxuIiwgYXR0cik7Ci0JCXJldHVybiB1bmRlZjsKLQl9Ci0KLQlSRUdfU0VUX1RZUEUociwgUkVHX1RZUEVfSU5QVVQpOwotCVJFR19TRVRfSU5ERVgociwgYXR0cik7Ci0JUkVHX1NFVF9WQUxJRChyLCBHTF9UUlVFKTsKLQlyZXR1cm4gcjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgR0xmbG9hdCBTaW5Db3NDb25zdHNbMl1bNF0gPSB7Ci0JewotCSAxLjI3MzIzOTU0NSwJCS8vIDQvUEkKLQkgLTAuNDA1Mjg0NzM1LAkJLy8gLTQvKFBJKlBJKQotCSAzLjE0MTU5MjY1NCwJCS8vIFBJCi0JIDAuMjIyNQkJCS8vIHdlaWdodAotCSB9LAotCXsKLQkgMC43NSwKLQkgMC4wLAotCSAwLjE1OTE1NDk0MywJCS8vIDEvKDIqUEkpCi0JIDYuMjgzMTg1MzA3CQkvLyAyKlBJCi0JIH0KLX07Ci0KLS8qKgotICogRW1pdCBhIExJVCBpbnN0cnVjdGlvbi4KLSAqIFxwIGZsYWdzIG1heSBiZSBQRlNfRkxBR19TQVQKLSAqCi0gKiBEZWZpbml0aW9uIG9mIExJVCAoZnJvbSBBUkJfZnJhZ21lbnRfcHJvZ3JhbSk6Ci0gKiB0bXAgPSBWZWN0b3JMb2FkKG9wMCk7Ci0gKiBpZiAodG1wLnggPCAwKSB0bXAueCA9IDA7Ci0gKiBpZiAodG1wLnkgPCAwKSB0bXAueSA9IDA7Ci0gKiBpZiAodG1wLncgPCAtKDEyOC4wLWVwc2lsb24pKSB0bXAudyA9IC0oMTI4LjAtZXBzaWxvbik7Ci0gKiBlbHNlIGlmICh0bXAudyA+IDEyOC1lcHNpbG9uKSB0bXAudyA9IDEyOC1lcHNpbG9uOwotICogcmVzdWx0LnggPSAxLjA7Ci0gKiByZXN1bHQueSA9IHRtcC54OwotICogcmVzdWx0LnogPSAodG1wLnggPiAwKSA/IFJvdWdoQXBwcm94UG93ZXIodG1wLnksIHRtcC53KSA6IDAuMDsKLSAqIHJlc3VsdC53ID0gMS4wOwotICoKLSAqIFRoZSBsb25nZXN0IHBhdGggb2YgY29tcHV0YXRpb24gaXMgdGhlIG9uZSBsZWFkaW5nIHRvIHJlc3VsdC56LAotICogY29uc2lzdGluZyBvZiA1IG9wZXJhdGlvbnMuIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgTElUIHRha2VzCi0gKiA1IHNsb3RzLiBTbyB1bmxlc3MgdGhlcmUncyBzb21lIHNwZWNpYWwgdW5kb2N1bWVudGVkIG9wY29kZSwKLSAqIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgcG90ZW50aWFsbHkgb3B0aW1hbC4gVW5mb3J0dW5hdGVseSwKLSAqIGVtaXRfYXJpdGggaXMgYSBiaXQgdG9vIGNvbnNlcnZhdGl2ZSBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZAotICogcGFydGlhbCB3cml0ZXMgdG8gdGhlIHZlY3RvciBjb21wb25lbnQuCi0gKi8KLXN0YXRpYyBjb25zdCBHTGZsb2F0IExpdENvbnN0WzRdID0KLSAgICB7IDEyNy45OTk5OTksIDEyNy45OTk5OTksIDEyNy45OTk5OTksIC0xMjcuOTk5OTk5IH07Ci0KLXN0YXRpYyB2b2lkIGVtaXRfbGl0KHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAotCQkgICAgIEdMdWludCBkZXN0LCBpbnQgbWFzaywgR0x1aW50IHNyYywgaW50IGZsYWdzKQotewotCUNPTVBJTEVfU1RBVEU7Ci0JR0x1aW50IGNuc3Q7Ci0JaW50IG5lZWRUZW1wb3Jhcnk7Ci0JR0x1aW50IHRlbXA7Ci0KLQljbnN0ID0gZW1pdF9jb25zdDRmdihmcCwgTGl0Q29uc3QpOwotCi0JbmVlZFRlbXBvcmFyeSA9IDA7Ci0JaWYgKChtYXNrICYgV1JJVEVNQVNLX1hZWlcpICE9IFdSSVRFTUFTS19YWVpXKSB7Ci0JCW5lZWRUZW1wb3JhcnkgPSAxOwotCX0gZWxzZSBpZiAoUkVHX0dFVF9UWVBFKGRlc3QpID09IFJFR19UWVBFX09VVFBVVCkgewotCQkvLyBMSVQgaXMgdHlwaWNhbGx5IGZvbGxvd2VkIGJ5IERQMy9EUDQsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQKLQkJLy8gaW4gY3JlYXRpbmcgc3BlY2lhbCBjb2RlIGZvciB0aGlzIGNhc2UKLQkJbmVlZFRlbXBvcmFyeSA9IDE7Ci0JfQotCi0JaWYgKG5lZWRUZW1wb3JhcnkpIHsKLQkJdGVtcCA9IGtlZXAoZ2V0X3RlbXBfcmVnKGZwKSk7Ci0JfSBlbHNlIHsKLQkJdGVtcCA9IGtlZXAoZGVzdCk7Ci0JfQotCi0JLy8gTm90ZTogVGhlIG9yZGVyIG9mIGVtaXRfYXJpdGggaW5zaWRlIHRoZSBzbG90cyBpcyByZWxldmFudCwKLQkvLyBiZWNhdXNlIGVtaXRfYXJpdGggb25seSBsb29rcyBhdCBzY2FsYXIgdnMuIHZlY3RvciB3aGVuIHJlc29sdmluZwotCS8vIGRlcGVuZGVuY2llcywgYW5kIGl0IGRvZXMgbm90IGNvbnNpZGVyIGluZGl2aWR1YWwgdmVjdG9yIGNvbXBvbmVudHMsCi0JLy8gc28gc3dpenpsaW5nIGJldHdlZW4gdGhlIHR3byBwYXJ0cyBjYW4gY3JlYXRlIGZha2UgZGVwZW5kZW5jaWVzLgotCi0JLy8gRmlyc3Qgc2xvdAotCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQVgsIHRlbXAsIFdSSVRFTUFTS19YWSwKLQkJICAga2VlcChzcmMpLCBwZnNfemVybywgdW5kZWYsIDApOwotCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQVgsIHRlbXAsIFdSSVRFTUFTS19XLCBzcmMsIGNuc3QsIHVuZGVmLCAwKTsKLQotCS8vIFNlY29uZCBzbG90Ci0JZW1pdF9hcml0aChmcCwgUEZTX09QX01JTiwgdGVtcCwgV1JJVEVNQVNLX1osCi0JCSAgIHN3aXp6bGUodGVtcCwgVywgVywgVywgVyksIGNuc3QsIHVuZGVmLCAwKTsKLQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTEcyLCB0ZW1wLCBXUklURU1BU0tfVywKLQkJICAgc3dpenpsZSh0ZW1wLCBZLCBZLCBZLCBZKSwgdW5kZWYsIHVuZGVmLCAwKTsKLQotCS8vIFRoaXJkIHNsb3QKLQkvLyBJZiBkZXNpcmVkLCB3ZSBzYXR1cmF0ZSB0aGUgeSByZXN1bHQgaGVyZS4KLQkvLyBUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgdXNlIGFzIGEgY29uZGl0aW9uIHZhcmlhYmxlIGluIHRoZSBDTVAgbGF0ZXIKLQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wLCBXUklURU1BU0tfVywKLQkJICAgdGVtcCwgc3dpenpsZSh0ZW1wLCBaLCBaLCBaLCBaKSwgcGZzX3plcm8sIDApOwotCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXAsIFdSSVRFTUFTS19ZLAotCQkgICBzd2l6emxlKHRlbXAsIFgsIFgsIFgsIFgpLCBwZnNfb25lLCBwZnNfemVybywgZmxhZ3MpOwotCi0JLy8gRm91cnRoIHNsb3QKLQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wLCBXUklURU1BU0tfWCwKLQkJICAgcGZzX29uZSwgcGZzX29uZSwgcGZzX3plcm8sIDApOwotCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9FWDIsIHRlbXAsIFdSSVRFTUFTS19XLCB0ZW1wLCB1bmRlZiwgdW5kZWYsIDApOwotCi0JLy8gRmlmdGggc2xvdAotCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9DTVAsIHRlbXAsIFdSSVRFTUFTS19aLAotCQkgICBwZnNfemVybywgc3dpenpsZSh0ZW1wLCBXLCBXLCBXLCBXKSwKLQkJICAgbmVnYXRlKHN3aXp6bGUodGVtcCwgWSwgWSwgWSwgWSkpLCBmbGFncyk7Ci0JZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcCwgV1JJVEVNQVNLX1csIHBmc19vbmUsIHBmc19vbmUsCi0JCSAgIHBmc196ZXJvLCAwKTsKLQotCWlmIChuZWVkVGVtcG9yYXJ5KSB7Ci0JCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsIG1hc2ssCi0JCQkgICB0ZW1wLCBwZnNfb25lLCBwZnNfemVybywgZmxhZ3MpOwotCQlmcmVlX3RlbXAoZnAsIHRlbXApOwotCX0gZWxzZSB7Ci0JCS8vIERlY3JlYXNlIHJlZmNvdW50IG9mIHRoZSBkZXN0aW5hdGlvbgotCQl0X2h3X2RzdChmcCwgZGVzdCwgR0xfRkFMU0UsIGNzLT5ucnNsb3RzKTsKLQl9Ci19Ci0KLXN0YXRpYyBHTGJvb2xlYW4gcGFyc2VfcHJvZ3JhbShzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCkKLXsKLQlzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqbXAgPSAmZnAtPm1lc2FfcHJvZ3JhbTsKLQljb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IG1wLT5CYXNlLkluc3RydWN0aW9uczsKLQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZnBpOwotCUdMdWludCBzcmNbM10sIGRlc3QsIHRlbXBbMl07Ci0JaW50IGZsYWdzLCBtYXNrID0gMDsKLQlpbnQgY29uc3Rfc2luWzJdOwotCi0JaWYgKCFpbnN0IHx8IGluc3RbMF0uT3Bjb2RlID09IE9QQ09ERV9FTkQpIHsKLQkJRVJST1IoImVtcHR5IHByb2dyYW0/XG4iKTsKKwlpZiAoaW5zdC5PcGNvZGUgIT0gT1BDT0RFX1RFWCAmJgorCSAgICBpbnN0Lk9wY29kZSAhPSBPUENPREVfVFhCICYmCisJICAgIGluc3QuT3Bjb2RlICE9IE9QQ09ERV9UWFAgJiYKKwkgICAgaW5zdC5PcGNvZGUgIT0gT1BDT0RFX0tJTCkKIAkJcmV0dXJuIEdMX0ZBTFNFOworCisJaWYgKGluc3QuT3Bjb2RlICE9IE9QQ09ERV9LSUwgJiYKKwkgICAgdC0+UHJvZ3JhbS0+U2hhZG93U2FtcGxlcnMgJiAoMSA8PCBpbnN0LlRleFNyY1VuaXQpKSB7CisJCUdMdWludCBjb21wYXJlZnVuYyA9IEdMX05FVkVSICsgY29tcGlsZXItPmZwLT5zdGF0ZS51bml0W2luc3QuVGV4U3JjVW5pdF0udGV4dHVyZV9jb21wYXJlX2Z1bmM7CisKKwkJaWYgKGNvbXBhcmVmdW5jID09IEdMX05FVkVSIHx8IGNvbXBhcmVmdW5jID09IEdMX0FMV0FZUykgeworCQkJdGd0ID0gcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHQtPlByb2dyYW0sIDEpOworCisJCQl0Z3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJCQl0Z3QtPkRzdFJlZyA9IGluc3QuRHN0UmVnOworCQkJaWYgKGNvbXBhcmVmdW5jID09IEdMX0FMV0FZUykgeworCQkJCXRndC0+U3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX0JVSUxUSU47CisJCQkJdGd0LT5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfMTExMTsKKwkJCX0gZWxzZSB7CisJCQkJdGd0LT5TcmNSZWdbMF0gPSBzaGFkb3dfYW1iaWVudCh0LT5Qcm9ncmFtLCBpbnN0LlRleFNyY1VuaXQpOworCQkJfQorCQkJcmV0dXJuIEdMX1RSVUU7CisJCX0KKworCQlpbnN0LkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCWluc3QuRHN0UmVnLkluZGV4ID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisJCWluc3QuRHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19YWVpXOwogCX0KIAotCWZvciAoZnBpID0gbXAtPkJhc2UuSW5zdHJ1Y3Rpb25zOyBmcGktPk9wY29kZSAhPSBPUENPREVfRU5EOyBmcGkrKykgewotCQlpZiAoZnBpLT5TYXR1cmF0ZU1vZGUgPT0gU0FUVVJBVEVfWkVST19PTkUpCi0JCQlmbGFncyA9IFBGU19GTEFHX1NBVDsKKworCS8qIEhhcmR3YXJlIHVzZXMgWzAuLjFdeFswLi4xXSByYW5nZSBmb3IgcmVjdGFuZ2xlIHRleHR1cmVzCisJICogaW5zdGVhZCBvZiBbMC4uV2lkdGhdeFswLi5IZWlnaHRdLgorCSAqIEFkZCBhIHNjYWxpbmcgaW5zdHJ1Y3Rpb24uCisJICovCisJaWYgKGluc3QuT3Bjb2RlICE9IE9QQ09ERV9LSUwgJiYgaW5zdC5UZXhTcmNUYXJnZXQgPT0gVEVYVFVSRV9SRUNUX0lOREVYKSB7CisJCWdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdID0geworCQkJU1RBVEVfSU5URVJOQUwsIFNUQVRFX1IzMDBfVEVYUkVDVF9GQUNUT1IsIDAsIDAsCisJCQkwCisJCX07CisKKwkJaW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKwkJaW50IGZhY3Rvcl9pbmRleDsKKworCQl0b2tlbnNbMl0gPSBpbnN0LlRleFNyY1VuaXQ7CisJCWZhY3Rvcl9pbmRleCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UodC0+UHJvZ3JhbS0+UGFyYW1ldGVycywgdG9rZW5zKTsKKworCQl0Z3QgPSByYWRlb25BcHBlbmRJbnN0cnVjdGlvbnModC0+UHJvZ3JhbSwgMSk7CisKKwkJdGd0LT5PcGNvZGUgPSBPUENPREVfTVVMOworCQl0Z3QtPkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCXRndC0+RHN0UmVnLkluZGV4ID0gdGVtcHJlZzsKKwkJdGd0LT5TcmNSZWdbMF0gPSBpbnN0LlNyY1JlZ1swXTsKKwkJdGd0LT5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCQl0Z3QtPlNyY1JlZ1sxXS5JbmRleCA9IGZhY3Rvcl9pbmRleDsKKworCQlyZXNldF9zcmNyZWcoJmluc3QuU3JjUmVnWzBdKTsKKwkJaW5zdC5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQlpbnN0LlNyY1JlZ1swXS5JbmRleCA9IHRlbXByZWc7CisJfQorCisJaWYgKGluc3QuT3Bjb2RlICE9IE9QQ09ERV9LSUwpIHsKKwkJaWYgKGluc3QuRHN0UmVnLkZpbGUgIT0gUFJPR1JBTV9URU1QT1JBUlkgfHwKKwkJICAgIGluc3QuRHN0UmVnLldyaXRlTWFzayAhPSBXUklURU1BU0tfWFlaVykgeworCQkJaW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKworCQkJaW5zdC5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQkJaW5zdC5Ec3RSZWcuSW5kZXggPSB0ZW1wcmVnOworCQkJaW5zdC5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisJCQlkZXN0cmVkaXJlY3QgPSBHTF9UUlVFOworCQl9CisJfQorCisJdGd0ID0gcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHQtPlByb2dyYW0sIDEpOworCV9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKHRndCwgJmluc3QsIDEpOworCisJaWYgKGluc3QuT3Bjb2RlICE9IE9QQ09ERV9LSUwgJiYKKwkgICAgdC0+UHJvZ3JhbS0+U2hhZG93U2FtcGxlcnMgJiAoMSA8PCBpbnN0LlRleFNyY1VuaXQpKSB7CisJCUdMdWludCBjb21wYXJlZnVuYyA9IEdMX05FVkVSICsgY29tcGlsZXItPmZwLT5zdGF0ZS51bml0W2luc3QuVGV4U3JjVW5pdF0udGV4dHVyZV9jb21wYXJlX2Z1bmM7CisJCUdMdWludCBkZXB0aG1vZGUgPSBjb21waWxlci0+ZnAtPnN0YXRlLnVuaXRbaW5zdC5UZXhTcmNVbml0XS5kZXB0aF90ZXh0dXJlX21vZGU7CisJCWludCByY3B0ZW1wID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisJCWludCBwYXNzLCBmYWlsOworCisJCXRndCA9IHJhZGVvbkFwcGVuZEluc3RydWN0aW9ucyh0LT5Qcm9ncmFtLCAzKTsKKworCQl0Z3RbMF0uT3Bjb2RlID0gT1BDT0RFX1JDUDsKKwkJdGd0WzBdLkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCXRndFswXS5Ec3RSZWcuSW5kZXggPSByY3B0ZW1wOworCQl0Z3RbMF0uRHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19XOworCQl0Z3RbMF0uU3JjUmVnWzBdID0gaW5zdC5TcmNSZWdbMF07CisJCXRndFswXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKworCQl0Z3RbMV0uT3Bjb2RlID0gT1BDT0RFX01BRDsKKwkJdGd0WzFdLkRzdFJlZyA9IGluc3QuRHN0UmVnOworCQl0Z3RbMV0uRHN0UmVnLldyaXRlTWFzayA9IG9yaWdfaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKwkJdGd0WzFdLlNyY1JlZ1swXSA9IGluc3QuU3JjUmVnWzBdOworCQl0Z3RbMV0uU3JjUmVnWzBdLlN3aXp6bGUgPSBTV0laWkxFX1paWlo7CisJCXRndFsxXS5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQl0Z3RbMV0uU3JjUmVnWzFdLkluZGV4ID0gcmNwdGVtcDsKKwkJdGd0WzFdLlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9XV1dXOworCQl0Z3RbMV0uU3JjUmVnWzJdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwkJdGd0WzFdLlNyY1JlZ1syXS5JbmRleCA9IGluc3QuRHN0UmVnLkluZGV4OworCQlpZiAoZGVwdGhtb2RlID09IDApIC8qIEdMX0xVTUlOQU5DRSAqLworCQkJdGd0WzFdLlNyY1JlZ1syXS5Td2l6emxlID0gTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1opOworCQllbHNlIGlmIChkZXB0aG1vZGUgPT0gMikgLyogR0xfQUxQSEEgKi8KKwkJCXRndFsxXS5TcmNSZWdbMl0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKworCQkvKiBSZWNhbGwgdGhhdCBTcmNSZWdbMF0gaXMgdGV4LCBTcmNSZWdbMl0gaXMgciBhbmQ6CisJCSAqICAgciAgPCB0ZXggIDw9PiAgICAgIC10ZXgrciA8IDAKKwkJICogICByID49IHRleCAgPD0+IG5vdCAoLXRleCtyIDwgMCAqLworCQlpZiAoY29tcGFyZWZ1bmMgPT0gR0xfTEVTUyB8fCBjb21wYXJlZnVuYyA9PSBHTF9HRVFVQUwpCisJCQl0Z3RbMV0uU3JjUmVnWzJdLk5lZ2F0ZUJhc2UgPSB0Z3RbMF0uU3JjUmVnWzJdLk5lZ2F0ZUJhc2UgXiBORUdBVEVfWFlaVzsKIAkJZWxzZQotCQkJZmxhZ3MgPSAwOworCQkJdGd0WzFdLlNyY1JlZ1swXS5OZWdhdGVCYXNlID0gdGd0WzBdLlNyY1JlZ1swXS5OZWdhdGVCYXNlIF4gTkVHQVRFX1hZWlc7CiAKLQkJaWYgKGZwaS0+T3Bjb2RlICE9IE9QQ09ERV9LSUwpIHsKLQkJCWRlc3QgPSB0X2RzdChmcCwgZnBpLT5Ec3RSZWcpOwotCQkJbWFzayA9IGZwaS0+RHN0UmVnLldyaXRlTWFzazsKKwkJdGd0WzJdLk9wY29kZSA9IE9QQ09ERV9DTVA7CisJCXRndFsyXS5Ec3RSZWcgPSBvcmlnX2luc3QtPkRzdFJlZzsKKwkJdGd0WzJdLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCXRndFsyXS5TcmNSZWdbMF0uSW5kZXggPSB0Z3RbMV0uRHN0UmVnLkluZGV4OworCisJCWlmIChjb21wYXJlZnVuYyA9PSBHTF9MRVNTIHx8IGNvbXBhcmVmdW5jID09IEdMX0dSRUFURVIpIHsKKwkJCXBhc3MgPSAxOworCQkJZmFpbCA9IDI7CisJCX0gZWxzZSB7CisJCQlwYXNzID0gMjsKKwkJCWZhaWwgPSAxOwogCQl9CiAKLQkJc3dpdGNoIChmcGktPk9wY29kZSkgewotCQljYXNlIE9QQ09ERV9BQlM6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgZGVzdCwgbWFzaywKLQkJCQkgICBhYnNvbHV0ZShzcmNbMF0pLCBwZnNfb25lLCBwZnNfemVybywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0FERDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHBmc19vbmUsIHNyY1sxXSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0NNUDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJc3JjWzJdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzJdKTsKLQkJCS8qIEFSQl9mX3AgLSBpZiBzcmMwLmMgPCAwLjAgPyBzcmMxLmMgOiBzcmMyLmMKLQkJCSAqICAgIHIzMDAgLSBpZiBzcmMyLmMgPCAwLjAgPyBzcmMxLmMgOiBzcmMwLmMKLQkJCSAqLwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0NNUCwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMl0sIHNyY1sxXSwgc3JjWzBdLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfQ09TOgotCQkJLyoKLQkJCSAqIGNvcyB1c2luZyBhIHBhcmFib2xhIChzZWUgU0lOKToKLQkJCSAqIGNvcyh4KToKLQkJCSAqICAgeCA9ICh4LygyKlBJKSkrMC43NQotCQkJICogICB4ID0gZnJhYyh4KQotCQkJICogICB4ID0gKHgqMipQSSktUEkKLQkJCSAqICAgcmVzdWx0ID0gc2luKHgpCi0JCQkgKi8KLQkJCXRlbXBbMF0gPSBnZXRfdGVtcF9yZWcoZnApOwotCQkJY29uc3Rfc2luWzBdID0gZW1pdF9jb25zdDRmdihmcCwgU2luQ29zQ29uc3RzWzBdKTsKLQkJCWNvbnN0X3NpblsxXSA9IGVtaXRfY29uc3Q0ZnYoZnAsIFNpbkNvc0NvbnN0c1sxXSk7Ci0JCQlzcmNbMF0gPSB0X3NjYWxhcl9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKKwkJdGd0WzJdLlNyY1JlZ1twYXNzXS5GaWxlID0gUFJPR1JBTV9CVUlMVElOOworCQl0Z3RbMl0uU3JjUmVnW3Bhc3NdLlN3aXp6bGUgPSBTV0laWkxFXzExMTE7CisJCXRndFsyXS5TcmNSZWdbZmFpbF0gPSBzaGFkb3dfYW1iaWVudCh0LT5Qcm9ncmFtLCBpbnN0LlRleFNyY1VuaXQpOworCX0gZWxzZSBpZiAoZGVzdHJlZGlyZWN0KSB7CisJCXRndCA9IHJhZGVvbkFwcGVuZEluc3RydWN0aW9ucyh0LT5Qcm9ncmFtLCAxKTsKIAotCQkJLyogYWRkIDAuNSpQSSBhbmQgZG8gcmFuZ2UgcmVkdWN0aW9uICovCi0KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sIFdSSVRFTUFTS19YLAotCQkJCSAgIHN3aXp6bGUoc3JjWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkgICBzd2l6emxlKGNvbnN0X3NpblsxXSwgWiwgWiwgWiwgWiksCi0JCQkJICAgc3dpenpsZShjb25zdF9zaW5bMV0sIFgsIFgsIFgsIFgpLCAwKTsKLQotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0ZSQywgdGVtcFswXSwgV1JJVEVNQVNLX1gsCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkgICB1bmRlZiwgdW5kZWYsIDApOwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLCBXUklURU1BU0tfWiwgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwgc3dpenpsZShjb25zdF9zaW5bMV0sIFcsIFcsIFcsIFcpLAkvLzIqUEkKLQkJCQkgICBuZWdhdGUoc3dpenpsZShjb25zdF9zaW5bMF0sIFosIFosIFosIFopKSwJLy8tUEkKLQkJCQkgICAwKTsKLQotCQkJLyogU0lOICovCi0KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sCi0JCQkJICAgV1JJVEVNQVNLX1ggfCBXUklURU1BU0tfWSwgc3dpenpsZSh0ZW1wWzBdLAotCQkJCQkJCQkgICAgICBaLCBaLCBaLAotCQkJCQkJCQkgICAgICBaKSwKLQkJCQkgICBjb25zdF9zaW5bMF0sIHBmc196ZXJvLCAwKTsKLQotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwgV1JJVEVNQVNLX1gsCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBZLCBZLCBZLCBZKSwKLQkJCQkgICBhYnNvbHV0ZShzd2l6emxlKHRlbXBbMF0sIFosIFosIFosIFopKSwKLQkJCQkgICBzd2l6emxlKHRlbXBbMF0sIFgsIFgsIFgsIFgpLCAwKTsKLQotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwgV1JJVEVNQVNLX1ksCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkgICBhYnNvbHV0ZShzd2l6emxlKHRlbXBbMF0sIFgsIFgsIFgsIFgpKSwKLQkJCQkgICBuZWdhdGUoc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSksIDApOwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCBkZXN0LCBtYXNrLAotCQkJCSAgIHN3aXp6bGUodGVtcFswXSwgWSwgWSwgWSwgWSksCi0JCQkJICAgc3dpenpsZShjb25zdF9zaW5bMF0sIFcsIFcsIFcsIFcpLAotCQkJCSAgIHN3aXp6bGUodGVtcFswXSwgWCwgWCwgWCwgWCksIGZsYWdzKTsKLQotCQkJZnJlZV90ZW1wKGZwLCB0ZW1wWzBdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9EUDM6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJc3JjWzFdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzFdKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9EUDMsIGRlc3QsIG1hc2ssCi0JCQkJICAgc3JjWzBdLCBzcmNbMV0sIHVuZGVmLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfRFA0OgotCQkJc3JjWzBdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKLQkJCXNyY1sxXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1sxXSk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfRFA0LCBkZXN0LCBtYXNrLAotCQkJCSAgIHNyY1swXSwgc3JjWzFdLCB1bmRlZiwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0RQSDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJLyogc3JjMC54eXoxIC0+IHRlbXAKLQkJCSAqIERQNCBkZXN0LCB0ZW1wLCBzcmMxCi0JCQkgKi8KLSNpZiAwCi0JCQl0ZW1wWzBdID0gZ2V0X3RlbXBfcmVnKGZwKTsKLQkJCXNyY1swXS5zX3N3eiA9IFNXSVpaTEVfT05FOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHBmc19vbmUsIHBmc196ZXJvLCAwKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9EUDQsIGRlc3QsIG1hc2ssCi0JCQkJICAgdGVtcFswXSwgc3JjWzFdLCB1bmRlZiwgZmxhZ3MpOwotCQkJZnJlZV90ZW1wKGZwLCB0ZW1wWzBdKTsKLSNlbHNlCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfRFA0LCBkZXN0LCBtYXNrLAotCQkJCSAgIHN3aXp6bGUoc3JjWzBdLCBYLCBZLCBaLCBPTkUpLCBzcmNbMV0sCi0JCQkJICAgdW5kZWYsIGZsYWdzKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0RTVDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJLyogZGVzdC55ID0gc3JjMC55ICogc3JjMS55ICovCi0JCQlpZiAobWFzayAmIFdSSVRFTUFTS19ZKQotCQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsIFdSSVRFTUFTS19ZLAotCQkJCQkgICBrZWVwKHNyY1swXSksIGtlZXAoc3JjWzFdKSwKLQkJCQkJICAgcGZzX3plcm8sIGZsYWdzKTsKLQkJCS8qIGRlc3QueiA9IHNyYzAueiAqLwotCQkJaWYgKG1hc2sgJiBXUklURU1BU0tfWikKLQkJCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCBkZXN0LCBXUklURU1BU0tfWiwKLQkJCQkJICAgc3JjWzBdLCBwZnNfb25lLCBwZnNfemVybywgZmxhZ3MpOwotCQkJLyogcmVzdWx0LnggPSAxLjAKLQkJCSAqIHJlc3VsdC53ID0gc3JjMS53ICovCi0JCQlpZiAobWFzayAmIFdSSVRFTUFTS19YVykgewotCQkJCVJFR19TRVRfVlNXWihzcmNbMV0sIFNXSVpaTEVfMTExKTsJLypDaGVhdCAqLwotCQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsCi0JCQkJCSAgIG1hc2sgJiBXUklURU1BU0tfWFcsCi0JCQkJCSAgIHNyY1sxXSwgcGZzX29uZSwgcGZzX3plcm8sIGZsYWdzKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9FWDI6Ci0JCQlzcmNbMF0gPSB0X3NjYWxhcl9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9FWDIsIGRlc3QsIG1hc2ssCi0JCQkJICAgc3JjWzBdLCB1bmRlZiwgdW5kZWYsIGZsYWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9GTFI6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJdGVtcFswXSA9IGdldF90ZW1wX3JlZyhmcCk7Ci0JCQkvKiBGUkMgdGVtcCwgc3JjMAotCQkJICogTUFEIGRlc3QsIHNyYzAsIDEuMCwgLXRlbXAKLQkJCSAqLwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0ZSQywgdGVtcFswXSwgbWFzaywKLQkJCQkgICBrZWVwKHNyY1swXSksIHVuZGVmLCB1bmRlZiwgMCk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCBkZXN0LCBtYXNrLAotCQkJCSAgIHNyY1swXSwgcGZzX29uZSwgbmVnYXRlKHRlbXBbMF0pLCBmbGFncyk7Ci0JCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0ZSQzoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfRlJDLCBkZXN0LCBtYXNrLAotCQkJCSAgIHNyY1swXSwgdW5kZWYsIHVuZGVmLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfS0lMOgotCQkJZW1pdF90ZXgoZnAsIGZwaSwgUjMwMF9GUElUWF9PUF9LSUwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0xHMjoKLQkJCXNyY1swXSA9IHRfc2NhbGFyX3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0xHMiwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHVuZGVmLCB1bmRlZiwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX0xJVDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQllbWl0X2xpdChmcCwgZGVzdCwgbWFzaywgc3JjWzBdLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfTFJQOgotCQkJc3JjWzBdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKLQkJCXNyY1sxXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1sxXSk7Ci0JCQlzcmNbMl0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMl0pOwotCQkJLyogcmVzdWx0ID0gdG1wMHRtcDEgKyAoMSAtIHRtcDApdG1wMgotCQkJICogICAgICAgID0gdG1wMHRtcDEgKyB0bXAyICsgKC10bXAwKXRtcDIKLQkJCSAqICAgICBNQUQgdGVtcCwgLXRtcDAsIHRtcDIsIHRtcDIKLQkJCSAqICAgICBNQUQgcmVzdWx0LCB0bXAwLCB0bXAxLCB0ZW1wCi0JCQkgKi8KLQkJCXRlbXBbMF0gPSBnZXRfdGVtcF9yZWcoZnApOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwgbWFzaywKLQkJCQkgICBuZWdhdGUoa2VlcChzcmNbMF0pKSwga2VlcChzcmNbMl0pLCBzcmNbMl0sCi0JCQkJICAgMCk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCBkZXN0LCBtYXNrLAotCQkJCSAgIHNyY1swXSwgc3JjWzFdLCB0ZW1wWzBdLCBmbGFncyk7Ci0JCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX01BRDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJc3JjWzJdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzJdKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsIG1hc2ssCi0JCQkJICAgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX01BWDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BWCwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHNyY1sxXSwgdW5kZWYsIGZsYWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9NSU46Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJc3JjWzFdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzFdKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NSU4sIGRlc3QsIG1hc2ssCi0JCQkJICAgc3JjWzBdLCBzcmNbMV0sIHVuZGVmLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfTU9WOgotCQljYXNlIE9QQ09ERV9TV1o6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHBmc19vbmUsIHBmc196ZXJvLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfTVVMOgotCQkJc3JjWzBdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKLQkJCXNyY1sxXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1sxXSk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCBkZXN0LCBtYXNrLAotCQkJCSAgIHNyY1swXSwgc3JjWzFdLCBwZnNfemVybywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1BPVzoKLQkJCXNyY1swXSA9IHRfc2NhbGFyX3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJc3JjWzFdID0gdF9zY2FsYXJfc3JjKGZwLCBmcGktPlNyY1JlZ1sxXSk7Ci0JCQl0ZW1wWzBdID0gZ2V0X3RlbXBfcmVnKGZwKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9MRzIsIHRlbXBbMF0sIFdSSVRFTUFTS19XLAotCQkJCSAgIHNyY1swXSwgdW5kZWYsIHVuZGVmLCAwKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sIFdSSVRFTUFTS19XLAotCQkJCSAgIHRlbXBbMF0sIHNyY1sxXSwgcGZzX3plcm8sIDApOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0VYMiwgZGVzdCwgZnBpLT5Ec3RSZWcuV3JpdGVNYXNrLAotCQkJCSAgIHRlbXBbMF0sIHVuZGVmLCB1bmRlZiwgMCk7Ci0JCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1JDUDoKLQkJCXNyY1swXSA9IHRfc2NhbGFyX3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX1JDUCwgZGVzdCwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHVuZGVmLCB1bmRlZiwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1JTUToKLQkJCXNyY1swXSA9IHRfc2NhbGFyX3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX1JTUSwgZGVzdCwgbWFzaywKLQkJCQkgICBhYnNvbHV0ZShzcmNbMF0pLCBwZnNfemVybywgcGZzX3plcm8sIGZsYWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9TQ1M6Ci0JCQkvKgotCQkJICogc2NzIHVzaW5nIGEgcGFyYWJvbGEgOgotCQkJICogc2NzKHgpOgotCQkJICogICByZXN1bHQueCA9IHNpbigtYWJzKHgpKzAuNSpQSSkgIChjb3MpCi0JCQkgKiAgIHJlc3VsdC55ID0gc2luKHgpICAgICAgICAgICAgICAgKHNpbikKLQkJCSAqCi0JCQkgKi8KLQkJCXRlbXBbMF0gPSBnZXRfdGVtcF9yZWcoZnApOwotCQkJdGVtcFsxXSA9IGdldF90ZW1wX3JlZyhmcCk7Ci0JCQljb25zdF9zaW5bMF0gPSBlbWl0X2NvbnN0NGZ2KGZwLCBTaW5Db3NDb25zdHNbMF0pOwotCQkJY29uc3Rfc2luWzFdID0gZW1pdF9jb25zdDRmdihmcCwgU2luQ29zQ29uc3RzWzFdKTsKLQkJCXNyY1swXSA9IHRfc2NhbGFyX3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCi0JCQkvKiB4ID0gLWFicyh4KSswLjUqUEkgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sIFdSSVRFTUFTS19aLCBzd2l6emxlKGNvbnN0X3NpblswXSwgWiwgWiwgWiwgWiksCS8vUEkKLQkJCQkgICBwZnNfaGFsZiwKLQkJCQkgICBuZWdhdGUoYWJzCi0JCQkJCSAgKHN3aXp6bGUoa2VlcChzcmNbMF0pLCBYLCBYLCBYLCBYKSkpLAotCQkJCSAgIDApOwotCi0JCQkvKiBDKnggKHNpbikgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sIFdSSVRFTUFTS19XLAotCQkJCSAgIHN3aXp6bGUoY29uc3Rfc2luWzBdLCBZLCBZLCBZLCBZKSwKLQkJCQkgICBzd2l6emxlKGtlZXAoc3JjWzBdKSwgWCwgWCwgWCwgWCksCi0JCQkJICAgcGZzX3plcm8sIDApOwotCi0JCQkvKiBCKngsIEMqeCAoY29zKSAqLwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwKLQkJCQkgICBXUklURU1BU0tfWCB8IFdSSVRFTUFTS19ZLCBzd2l6emxlKHRlbXBbMF0sCi0JCQkJCQkJCSAgICAgIFosIFosIFosCi0JCQkJCQkJCSAgICAgIFopLAotCQkJCSAgIGNvbnN0X3NpblswXSwgcGZzX3plcm8sIDApOwotCi0JCQkvKiBCKnggKHNpbikgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMV0sIFdSSVRFTUFTS19XLAotCQkJCSAgIHN3aXp6bGUoY29uc3Rfc2luWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkgICBrZWVwKHNyY1swXSksIHBmc196ZXJvLCAwKTsKLQotCQkJLyogeSA9IEIqeCArIEMqeCphYnMoeCkgKHNpbikgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMV0sIFdSSVRFTUFTS19aLAotCQkJCSAgIGFic29sdXRlKHNyY1swXSksCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBXLCBXLCBXLCBXKSwKLQkJCQkgICBzd2l6emxlKHRlbXBbMV0sIFcsIFcsIFcsIFcpLCAwKTsKLQotCQkJLyogeSA9IEIqeCArIEMqeCphYnMoeCkgKGNvcykgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMV0sIFdSSVRFTUFTS19XLAotCQkJCSAgIHN3aXp6bGUodGVtcFswXSwgWSwgWSwgWSwgWSksCi0JCQkJICAgYWJzb2x1dGUoc3dpenpsZSh0ZW1wWzBdLCBaLCBaLCBaLCBaKSksCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwgMCk7Ci0KLQkJCS8qIHkqYWJzKHkpIC0geSAoY29zKSwgeSphYnMoeSkgLSB5IChzaW4pICovCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLAotCQkJCSAgIFdSSVRFTUFTS19YIHwgV1JJVEVNQVNLX1ksIHN3aXp6bGUodGVtcFsxXSwKLQkJCQkJCQkJICAgICAgVywgWiwgWSwKLQkJCQkJCQkJICAgICAgWCksCi0JCQkJICAgYWJzb2x1dGUoc3dpenpsZSh0ZW1wWzFdLCBXLCBaLCBZLCBYKSksCi0JCQkJICAgbmVnYXRlKHN3aXp6bGUodGVtcFsxXSwgVywgWiwgWSwgWCkpLCAwKTsKLQotCQkJLyogZGVzdC54eSA9IG1hZCh0ZW1wLnh5LCBQLCB0ZW1wMi53eikgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsCi0JCQkJICAgbWFzayAmIChXUklURU1BU0tfWCB8IFdSSVRFTUFTS19ZKSwgdGVtcFswXSwKLQkJCQkgICBzd2l6emxlKGNvbnN0X3NpblswXSwgVywgVywgVywgVyksCi0JCQkJICAgc3dpenpsZSh0ZW1wWzFdLCBXLCBaLCBZLCBYKSwgZmxhZ3MpOwotCi0JCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJZnJlZV90ZW1wKGZwLCB0ZW1wWzFdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9TR0U6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJc3JjWzFdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzFdKTsKLQkJCXRlbXBbMF0gPSBnZXRfdGVtcF9yZWcoZnApOwotCQkJLyogdGVtcCA9IHNyYzAgLSBzcmMxCi0JCQkgKiBkZXN0LmMgPSAodGVtcC5jIDwgMC4wKSA/IDAgOiAxCi0JCQkgKi8KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIHRlbXBbMF0sIG1hc2ssCi0JCQkJICAgc3JjWzBdLCBwZnNfb25lLCBuZWdhdGUoc3JjWzFdKSwgMCk7Ci0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfQ01QLCBkZXN0LCBtYXNrLAotCQkJCSAgIHBmc19vbmUsIHBmc196ZXJvLCB0ZW1wWzBdLCAwKTsKLQkJCWZyZWVfdGVtcChmcCwgdGVtcFswXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfU0lOOgotCQkJLyoKLQkJCSAqICB1c2luZyBhIHBhcmFib2xhOgotCQkJICogc2luKHgpID0gNC9waSAqIHggKyAtNC8ocGkqcGkpICogeCAqIGFicyh4KQotCQkJICogZXh0cmEgcHJlY2lzaW9uIGlzIG9idGFpbmVkIGJ5IHdlaWdodGluZyBhZ2FpbnN0Ci0JCQkgKiBpdHNlbGYgc3F1YXJlZC4KLQkJCSAqLwotCi0JCQl0ZW1wWzBdID0gZ2V0X3RlbXBfcmVnKGZwKTsKLQkJCWNvbnN0X3NpblswXSA9IGVtaXRfY29uc3Q0ZnYoZnAsIFNpbkNvc0NvbnN0c1swXSk7Ci0JCQljb25zdF9zaW5bMV0gPSBlbWl0X2NvbnN0NGZ2KGZwLCBTaW5Db3NDb25zdHNbMV0pOwotCQkJc3JjWzBdID0gdF9zY2FsYXJfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0KLQkJCS8qIGRvIHJhbmdlIHJlZHVjdGlvbiAqLwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLCBXUklURU1BU0tfWCwKLQkJCQkgICBzd2l6emxlKGtlZXAoc3JjWzBdKSwgWCwgWCwgWCwgWCksCi0JCQkJICAgc3dpenpsZShjb25zdF9zaW5bMV0sIFosIFosIFosIFopLAotCQkJCSAgIHBmc19oYWxmLCAwKTsKLQotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX0ZSQywgdGVtcFswXSwgV1JJVEVNQVNLX1gsCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwKLQkJCQkgICB1bmRlZiwgdW5kZWYsIDApOwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLCBXUklURU1BU0tfWiwgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwgc3dpenpsZShjb25zdF9zaW5bMV0sIFcsIFcsIFcsIFcpLAkvLzIqUEkKLQkJCQkgICBuZWdhdGUoc3dpenpsZShjb25zdF9zaW5bMF0sIFosIFosIFosIFopKSwJLy9QSQotCQkJCSAgIDApOwotCi0JCQkvKiBTSU4gKi8KLQotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwKLQkJCQkgICBXUklURU1BU0tfWCB8IFdSSVRFTUFTS19ZLCBzd2l6emxlKHRlbXBbMF0sCi0JCQkJCQkJCSAgICAgIFosIFosIFosCi0JCQkJCQkJCSAgICAgIFopLAotCQkJCSAgIGNvbnN0X3NpblswXSwgcGZzX3plcm8sIDApOwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLCBXUklURU1BU0tfWCwKLQkJCQkgICBzd2l6emxlKHRlbXBbMF0sIFksIFksIFksIFkpLAotCQkJCSAgIGFic29sdXRlKHN3aXp6bGUodGVtcFswXSwgWiwgWiwgWiwgWikpLAotCQkJCSAgIHN3aXp6bGUodGVtcFswXSwgWCwgWCwgWCwgWCksIDApOwotCi0JCQllbWl0X2FyaXRoKGZwLCBQRlNfT1BfTUFELCB0ZW1wWzBdLCBXUklURU1BU0tfWSwKLQkJCQkgICBzd2l6emxlKHRlbXBbMF0sIFgsIFgsIFgsIFgpLAotCQkJCSAgIGFic29sdXRlKHN3aXp6bGUodGVtcFswXSwgWCwgWCwgWCwgWCkpLAotCQkJCSAgIG5lZ2F0ZShzd2l6emxlKHRlbXBbMF0sIFgsIFgsIFgsIFgpKSwgMCk7Ci0KLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsIG1hc2ssCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBZLCBZLCBZLCBZKSwKLQkJCQkgICBzd2l6emxlKGNvbnN0X3NpblswXSwgVywgVywgVywgVyksCi0JCQkJICAgc3dpenpsZSh0ZW1wWzBdLCBYLCBYLCBYLCBYKSwgZmxhZ3MpOwotCi0JCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1NMVDoKLQkJCXNyY1swXSA9IHRfc3JjKGZwLCBmcGktPlNyY1JlZ1swXSk7Ci0JCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJdGVtcFswXSA9IGdldF90ZW1wX3JlZyhmcCk7Ci0JCQkvKiB0ZW1wID0gc3JjMCAtIHNyYzEKLQkJCSAqIGRlc3QuYyA9ICh0ZW1wLmMgPCAwLjApID8gMSA6IDAKLQkJCSAqLwotCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwgbWFzaywKLQkJCQkgICBzcmNbMF0sIHBmc19vbmUsIG5lZ2F0ZShzcmNbMV0pLCAwKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9DTVAsIGRlc3QsIG1hc2ssCi0JCQkJICAgcGZzX3plcm8sIHBmc19vbmUsIHRlbXBbMF0sIDApOwotCQkJZnJlZV90ZW1wKGZwLCB0ZW1wWzBdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9TVUI6Ci0JCQlzcmNbMF0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMF0pOwotCQkJc3JjWzFdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzFdKTsKLQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsIG1hc2ssCi0JCQkJICAgc3JjWzBdLCBwZnNfb25lLCBuZWdhdGUoc3JjWzFdKSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1RFWDoKLQkJCWVtaXRfdGV4KGZwLCBmcGksIFIzMDBfRlBJVFhfT1BfVEVYKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QQ09ERV9UWEI6Ci0JCQllbWl0X3RleChmcCwgZnBpLCBSMzAwX0ZQSVRYX09QX1RYQik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUENPREVfVFhQOgotCQkJZW1pdF90ZXgoZnAsIGZwaSwgUjMwMF9GUElUWF9PUF9UWFApOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BDT0RFX1hQRDp7Ci0JCQkJc3JjWzBdID0gdF9zcmMoZnAsIGZwaS0+U3JjUmVnWzBdKTsKLQkJCQlzcmNbMV0gPSB0X3NyYyhmcCwgZnBpLT5TcmNSZWdbMV0pOwotCQkJCXRlbXBbMF0gPSBnZXRfdGVtcF9yZWcoZnApOwotCQkJCS8qIHRlbXAgPSBzcmMwLnp4eSAqIHNyYzEueXp4ICovCi0JCQkJZW1pdF9hcml0aChmcCwgUEZTX09QX01BRCwgdGVtcFswXSwKLQkJCQkJICAgV1JJVEVNQVNLX1hZWiwgc3dpenpsZShrZWVwKHNyY1swXSksCi0JCQkJCQkJCSAgWiwgWCwgWSwgVyksCi0JCQkJCSAgIHN3aXp6bGUoa2VlcChzcmNbMV0pLCBZLCBaLCBYLCBXKSwKLQkJCQkJICAgcGZzX3plcm8sIDApOwotCQkJCS8qIGRlc3QueHl6ID0gc3JjMC55enggKiBzcmMxLnp4eSAtIHRlbXAKLQkJCQkgKiBkZXN0LncgICAgICAgPSB1bmRlZmluZWQKLQkJCQkgKiAqLwotCQkJCWVtaXRfYXJpdGgoZnAsIFBGU19PUF9NQUQsIGRlc3QsCi0JCQkJCSAgIG1hc2sgJiBXUklURU1BU0tfWFlaLCBzd2l6emxlKHNyY1swXSwKLQkJCQkJCQkJCSBZLCBaLAotCQkJCQkJCQkJIFgsIFcpLAotCQkJCQkgICBzd2l6emxlKHNyY1sxXSwgWiwgWCwgWSwgVyksCi0JCQkJCSAgIG5lZ2F0ZSh0ZW1wWzBdKSwgZmxhZ3MpOwotCQkJCS8qIGNsZWFudXAgKi8KLQkJCQlmcmVlX3RlbXAoZnAsIHRlbXBbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQlkZWZhdWx0OgotCQkJRVJST1IoInVua25vd24gZnBpLT5PcGNvZGUgJWRcbiIsIGZwaS0+T3Bjb2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGZwLT5lcnJvcikKLQkJCXJldHVybiBHTF9GQUxTRTsKLQorCQl0Z3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJCXRndC0+RHN0UmVnID0gb3JpZ19pbnN0LT5Ec3RSZWc7CisJCXRndC0+U3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwkJdGd0LT5TcmNSZWdbMF0uSW5kZXggPSBpbnN0LkRzdFJlZy5JbmRleDsKIAl9CiAKIAlyZXR1cm4gR0xfVFJVRTsKIH0KIAotc3RhdGljIHZvaWQgaW5zZXJ0X3dwb3Moc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYXJhbXMocjMwMENvbnRleHRQdHIgcjMwMCwgc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnApCiB7CisJc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKm1wID0gJmZwLT5tZXNhX3Byb2dyYW07CisKKwkvKiBBc2sgTWVzYSBuaWNlbHkgdG8gZmlsbCBpbiBQYXJhbWV0ZXJWYWx1ZXMgZm9yIHVzICovCisJaWYgKG1wLT5CYXNlLlBhcmFtZXRlcnMpCisJCV9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhyMzAwLT5yYWRlb24uZ2xDdHgsIG1wLT5CYXNlLlBhcmFtZXRlcnMpOworfQorCisKKy8qKgorICogVHJhbnNmb3JtIHRoZSBwcm9ncmFtIHRvIHN1cHBvcnQgZnJhZ21lbnQucG9zaXRpb24uCisgKgorICogSW50cm9kdWNlIGEgc21hbGwgZnJhZ21lbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIHRoYXQgd2lsbCBiZQorICogdGhlIG9ubHkgY29kZSB0aGF0IGRpcmVjdGx5IHJlYWRzIHRoZSBGUkFHX0FUVFJJQl9XUE9TIGlucHV0LgorICogQWxsIG90aGVyIGNvZGUgcGllY2VzIHRoYXQgcmVmZXJlbmNlIHRoYXQgaW5wdXQgd2lsbCBiZSByZXdyaXR0ZW4KKyAqIHRvIHJlYWQgZnJvbSBhIG5ld2x5IGFsbG9jYXRlZCB0ZW1wb3JhcnkuCisgKgorICogXHRvZG8gaWYvd2hlbiByNXh4IHN1cHBvcnRzIHRoZSByYWRlb25fcHJvZ3JhbSBhcmNoaXRlY3R1cmUsIHRoaXMgaXMgYQorICogbGlrZWx5IGNhbmRpZGF0ZSBmb3IgY29kZSBzaGFyaW5nLgorICovCitzdGF0aWMgdm9pZCBpbnNlcnRfV1BPU190cmFpbGVyKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIgKmNvbXBpbGVyKQoreworCUdMdWludCBJbnB1dHNSZWFkID0gY29tcGlsZXItPmZwLT5tZXNhX3Byb2dyYW0uQmFzZS5JbnB1dHNSZWFkOworCisJaWYgKCEoSW5wdXRzUmVhZCAmIEZSQUdfQklUX1dQT1MpKQorCQlyZXR1cm47CisKIAlzdGF0aWMgZ2xfc3RhdGVfaW5kZXggdG9rZW5zW1NUQVRFX0xFTkdUSF0gPSB7CiAJCVNUQVRFX0lOVEVSTkFMLCBTVEFURV9SMzAwX1dJTkRPV19ESU1FTlNJT04sIDAsIDAsIDAKIAl9OwogCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpmcGk7CiAJR0x1aW50IHdpbmRvd19pbmRleDsKIAlpbnQgaSA9IDA7Ci0JR0x1aW50IHRlbXByZWdpID0gcHJvZy0+TnVtVGVtcG9yYXJpZXM7Ci0JLyogc2hvdWxkIGRvIHNvbWV0aGluZyBlbHNlIGlmIG5vIHRlbXBzIGxlZnQuLi4gKi8KLQlwcm9nLT5OdW1UZW1wb3JhcmllcysrOworCUdMdWludCB0ZW1wcmVnaSA9IF9tZXNhX2ZpbmRfZnJlZV9yZWdpc3Rlcihjb21waWxlci0+cHJvZ3JhbSwgUFJPR1JBTV9URU1QT1JBUlkpOwogCi0JZnBpID0gX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKHByb2ctPk51bUluc3RydWN0aW9ucyArIDMpOwotCV9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKGZwaSwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zICsgMyk7CisJX21lc2FfaW5zZXJ0X2luc3RydWN0aW9ucyhjb21waWxlci0+cHJvZ3JhbSwgMCwgMyk7CisJZnBpID0gY29tcGlsZXItPnByb2dyYW0tPkluc3RydWN0aW9uczsKIAogCS8qIHBlcnNwZWN0aXZlIGRpdmlkZSAqLwogCWZwaVtpXS5PcGNvZGUgPSBPUENPREVfUkNQOwpAQCAtMjAyNyw3ICszMDMsNyBAQAogCWkrKzsKIAogCS8qIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uICovCi0Jd2luZG93X2luZGV4ID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCB0b2tlbnMpOworCXdpbmRvd19pbmRleCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UoY29tcGlsZXItPnByb2dyYW0tPlBhcmFtZXRlcnMsIHRva2Vucyk7CiAKIAlmcGlbaV0uT3Bjb2RlID0gT1BDT0RFX01BRDsKIApAQCAtMjA1MiwyNDIgKzMyOCwxODIgQEAKIAkgICAgTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1pFUk8pOwogCWkrKzsKIAotCV9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKCZmcGlbaV0sIHByb2ctPkluc3RydWN0aW9ucywKLQkJCQlwcm9nLT5OdW1JbnN0cnVjdGlvbnMpOwotCi0JZnJlZShwcm9nLT5JbnN0cnVjdGlvbnMpOwotCi0JcHJvZy0+SW5zdHJ1Y3Rpb25zID0gZnBpOwotCi0JcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zICs9IGk7Ci0JZnBpID0gJnByb2ctPkluc3RydWN0aW9uc1twcm9nLT5OdW1JbnN0cnVjdGlvbnMgLSAxXTsKLQotCWFzc2VydChmcGktPk9wY29kZSA9PSBPUENPREVfRU5EKTsKLQotCWZvciAoZnBpID0gJnByb2ctPkluc3RydWN0aW9uc1szXTsgZnBpLT5PcGNvZGUgIT0gT1BDT0RFX0VORDsgZnBpKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCWlmIChmcGktPlNyY1JlZ1tpXS5GaWxlID09IFBST0dSQU1fSU5QVVQgJiYKLQkJCSAgICBmcGktPlNyY1JlZ1tpXS5JbmRleCA9PSBGUkFHX0FUVFJJQl9XUE9TKSB7Ci0JCQkJZnBpLT5TcmNSZWdbaV0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOwotCQkJCWZwaS0+U3JjUmVnW2ldLkluZGV4ID0gdGVtcHJlZ2k7CisJZm9yICg7IGkgPCBjb21waWxlci0+cHJvZ3JhbS0+TnVtSW5zdHJ1Y3Rpb25zOyArK2kpIHsKKwkJaW50IHJlZzsKKwkJZm9yIChyZWcgPSAwOyByZWcgPCAzOyByZWcrKykgeworCQkJaWYgKGZwaVtpXS5TcmNSZWdbcmVnXS5GaWxlID09IFBST0dSQU1fSU5QVVQgJiYKKwkJCSAgICBmcGlbaV0uU3JjUmVnW3JlZ10uSW5kZXggPT0gRlJBR19BVFRSSUJfV1BPUykgeworCQkJCWZwaVtpXS5TcmNSZWdbcmVnXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCQkJZnBpW2ldLlNyY1JlZ1tyZWddLkluZGV4ID0gdGVtcHJlZ2k7CiAJCQl9CisJCX0KIAl9CiB9CiAKLS8qIC0gSW5pdCBzdHJ1Y3R1cmVzCi0gKiAtIERldGVybWluZSB3aGF0IGh3cmVncyBlYWNoIGlucHV0IGNvcnJlc3BvbmRzIHRvCisKK3N0YXRpYyB2b2lkIG5xc3NhZGNlX2luaXQoc3RydWN0IG5xc3NhZGNlX3N0YXRlKiBzKQoreworCXMtPk91dHB1dHNbRlJBR19SRVNVTFRfQ09MUl0uU291cmNlZCA9IFdSSVRFTUFTS19YWVpXOworCXMtPk91dHB1dHNbRlJBR19SRVNVTFRfREVQUl0uU291cmNlZCA9IFdSSVRFTUFTS19XOworfQorCisKK3N0YXRpYyBHTHVpbnQgYnVpbGRfZHRtKEdMdWludCBkZXB0aG1vZGUpCit7CisJc3dpdGNoKGRlcHRobW9kZSkgeworCWRlZmF1bHQ6CisJY2FzZSBHTF9MVU1JTkFOQ0U6IHJldHVybiAwOworCWNhc2UgR0xfSU5URU5TSVRZOiByZXR1cm4gMTsKKwljYXNlIEdMX0FMUEhBOiByZXR1cm4gMjsKKwl9Cit9CisKK3N0YXRpYyBHTHVpbnQgYnVpbGRfZnVuYyhHTHVpbnQgY29tcGFyZWZ1bmMpCit7CisJcmV0dXJuIGNvbXBhcmVmdW5jIC0gR0xfTkVWRVI7Cit9CisKKworLyoqCisgKiBDb2xsZWN0IGFsbCBleHRlcm5hbCBzdGF0ZSB0aGF0IGlzIHJlbGV2YW50IGZvciBjb21waWxpbmcgdGhlIGdpdmVuCisgKiBmcmFnbWVudCBwcm9ncmFtLgogICovCi1zdGF0aWMgdm9pZCBpbml0X3Byb2dyYW0ocjMwMENvbnRleHRQdHIgcjMwMCwgc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnApCitzdGF0aWMgdm9pZCBidWlsZF9zdGF0ZSgKKwlyMzAwQ29udGV4dFB0ciByMzAwLAorCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAorCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fZXh0ZXJuYWxfc3RhdGUgKnN0YXRlKQogewotCXN0cnVjdCByMzAwX3Bmc19jb21waWxlX3N0YXRlICpjcyA9IE5VTEw7Ci0Jc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKm1wID0gJmZwLT5tZXNhX3Byb2dyYW07Ci0Jc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmZwaTsKLQlHTHVpbnQgSW5wdXRzUmVhZCA9IG1wLT5CYXNlLklucHV0c1JlYWQ7Ci0JR0x1aW50IHRlbXBzX3VzZWQgPSAwOwkvKiBmb3IgZnAtPnRlbXBzW10gKi8KLQlpbnQgaSwgajsKKwlpbnQgdW5pdDsKIAotCS8qIE5ldyBjb21waWxlLCByZXNldCB0cmFja2luZyBkYXRhICovCi0JZnAtPm9wdGltaXphdGlvbiA9Ci0JICAgIGRyaVF1ZXJ5T3B0aW9uaSgmcjMwMC0+cmFkZW9uLm9wdGlvbkNhY2hlLCAiZnBfb3B0aW1pemF0aW9uIik7Ci0JZnAtPnRyYW5zbGF0ZWQgPSBHTF9GQUxTRTsKLQlmcC0+ZXJyb3IgPSBHTF9GQUxTRTsKLQlmcC0+Y3MgPSBjcyA9ICYoUjMwMF9DT05URVhUKGZwLT5jdHgpLT5zdGF0ZS5wZnNfY29tcGlsZSk7Ci0JZnAtPnRleC5sZW5ndGggPSAwOwotCWZwLT5jdXJfbm9kZSA9IDA7Ci0JZnAtPmZpcnN0X25vZGVfaGFzX3RleCA9IDA7Ci0JZnAtPmNvbnN0X25yID0gMDsKLQlmcC0+bWF4X3RlbXBfaWR4ID0gMDsKLQlmcC0+bm9kZVswXS5hbHVfZW5kID0gLTE7Ci0JZnAtPm5vZGVbMF0udGV4X2VuZCA9IC0xOworCV9tZXNhX2J6ZXJvKHN0YXRlLCBzaXplb2YoKnN0YXRlKSk7CiAKLQlfbWVzYV9tZW1zZXQoY3MsIDAsIHNpemVvZigqZnAtPmNzKSk7Ci0JZm9yIChpID0gMDsgaSA8IFBGU19NQVhfQUxVX0lOU1Q7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQljcy0+c2xvdFtpXS52c3JjW2pdID0gU1JDX0NPTlNUOwotCQkJY3MtPnNsb3RbaV0uc3NyY1tqXSA9IFNSQ19DT05TVDsKKwlmb3IodW5pdCA9IDA7IHVuaXQgPCAxNjsgKyt1bml0KSB7CisJCWlmIChmcC0+bWVzYV9wcm9ncmFtLkJhc2UuU2hhZG93U2FtcGxlcnMgJiAoMSA8PCB1bml0KSkgeworCQkJc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0KiB0ZXggPSByMzAwLT5yYWRlb24uZ2xDdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fQ3VycmVudDsKKworCQkJc3RhdGUtPnVuaXRbdW5pdF0uZGVwdGhfdGV4dHVyZV9tb2RlID0gYnVpbGRfZHRtKHRleC0+RGVwdGhNb2RlKTsKKwkJCXN0YXRlLT51bml0W3VuaXRdLnRleHR1cmVfY29tcGFyZV9mdW5jID0gYnVpbGRfZnVuYyh0ZXgtPkNvbXBhcmVGdW5jKTsKIAkJfQogCX0KLQotCS8qIFdvcmsgb3V0IHdoYXQgdGVtcHMgdGhlIE1lc2EgaW5wdXRzIGNvcnJlc3BvbmQgdG8sIHRoaXMgbXVzdCBtYXRjaAotCSAqIHdoYXQgc2V0dXBfcnNfdW5pdCBkb2VzLCB3aGljaCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGFzIHJzX3VuaXQKLQkgKiBjb25maWd1cmVzIGl0c2VsZiBiYXNlZCBvbiB0aGUgZnJhZ3Byb2cncyBJbnB1dHNSZWFkCi0JICoKLQkgKiBOT1RFOiB0aGlzIGRlcGVuZHMgb24gZ2V0X2h3X3RlbXAoKSBhbGxvY2F0aW5nIHJlZ2lzdGVycyBpbiBvcmRlciwKLQkgKiBzdGFydGluZyBmcm9tIHJlZ2lzdGVyIDAuCi0JICovCi0KLQkvKiBUZXhjb29yZHMgY29tZSBmaXJzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBmcC0+Y3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IGkrKykgewotCQlpZiAoSW5wdXRzUmVhZCAmIChGUkFHX0JJVF9URVgwIDw8IGkpKSB7Ci0JCQljcy0+aW5wdXRzW0ZSQUdfQVRUUklCX1RFWDAgKyBpXS5yZWZjb3VudCA9IDA7Ci0JCQljcy0+aW5wdXRzW0ZSQUdfQVRUUklCX1RFWDAgKyBpXS5yZWcgPQotCQkJICAgIGdldF9od190ZW1wKGZwLCAwKTsKLQkJfQotCX0KLQlJbnB1dHNSZWFkICY9IH5GUkFHX0JJVFNfVEVYX0FOWTsKLQotCS8qIGZyYWdtZW50IHBvc2l0aW9uIHRyZWF0ZWQgYXMgYSB0ZXhjb29yZCAqLwotCWlmIChJbnB1dHNSZWFkICYgRlJBR19CSVRfV1BPUykgewotCQljcy0+aW5wdXRzW0ZSQUdfQVRUUklCX1dQT1NdLnJlZmNvdW50ID0gMDsKLQkJY3MtPmlucHV0c1tGUkFHX0FUVFJJQl9XUE9TXS5yZWcgPSBnZXRfaHdfdGVtcChmcCwgMCk7Ci0JCWluc2VydF93cG9zKCZtcC0+QmFzZSk7Ci0JfQotCUlucHV0c1JlYWQgJj0gfkZSQUdfQklUX1dQT1M7Ci0KLQkvKiBUaGVuIHByaW1hcnkgY29sb3VyICovCi0JaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wwKSB7Ci0JCWNzLT5pbnB1dHNbRlJBR19BVFRSSUJfQ09MMF0ucmVmY291bnQgPSAwOwotCQljcy0+aW5wdXRzW0ZSQUdfQVRUUklCX0NPTDBdLnJlZyA9IGdldF9od190ZW1wKGZwLCAwKTsKLQl9Ci0JSW5wdXRzUmVhZCAmPSB+RlJBR19CSVRfQ09MMDsKLQotCS8qIFNlY29uZGFyeSBjb2xvciAqLwotCWlmIChJbnB1dHNSZWFkICYgRlJBR19CSVRfQ09MMSkgewotCQljcy0+aW5wdXRzW0ZSQUdfQVRUUklCX0NPTDFdLnJlZmNvdW50ID0gMDsKLQkJY3MtPmlucHV0c1tGUkFHX0FUVFJJQl9DT0wxXS5yZWcgPSBnZXRfaHdfdGVtcChmcCwgMCk7Ci0JfQotCUlucHV0c1JlYWQgJj0gfkZSQUdfQklUX0NPTDE7Ci0KLQkvKiBBbnl0aGluZyBlbHNlICovCi0JaWYgKElucHV0c1JlYWQpIHsKLQkJV0FSTl9PTkNFKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgaW5wdXRzIDB4JXhcbiIsIElucHV0c1JlYWQpOwotCQkvKiBmb3JjZSByZWFkIGZyb20gaHdyZWcgMCBmb3Igbm93ICovCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkJaWYgKElucHV0c1JlYWQgJiAoMSA8PCBpKSkKLQkJCQljcy0+aW5wdXRzW2ldLnJlZyA9IDA7Ci0JfQotCi0JLyogUHJlLXBhcnNlIHRoZSBtZXNhIHByb2dyYW0sIGdyYWJiaW5nIHJlZmNvdW50cyBvbiBpbnB1dC90ZW1wIHJlZ3MuCi0JICogVGhhdCB3YXksIHdlIGNhbiBmcmVlIHVwIHRoZSByZWcgd2hlbiBpdCdzIG5vIGxvbmdlciBuZWVkZWQKLQkgKi8KLQlpZiAoIW1wLT5CYXNlLkluc3RydWN0aW9ucykgewotCQlFUlJPUigiTm8gaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHByb2dyYW1cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChmcGkgPSBtcC0+QmFzZS5JbnN0cnVjdGlvbnM7IGZwaS0+T3Bjb2RlICE9IE9QQ09ERV9FTkQ7IGZwaSsrKSB7Ci0JCWludCBpZHg7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWR4ID0gZnBpLT5TcmNSZWdbaV0uSW5kZXg7Ci0JCQlzd2l0Y2ggKGZwaS0+U3JjUmVnW2ldLkZpbGUpIHsKLQkJCWNhc2UgUFJPR1JBTV9URU1QT1JBUlk6Ci0JCQkJaWYgKCEodGVtcHNfdXNlZCAmICgxIDw8IGlkeCkpKSB7Ci0JCQkJCWNzLT50ZW1wc1tpZHhdLnJlZyA9IC0xOwotCQkJCQljcy0+dGVtcHNbaWR4XS5yZWZjb3VudCA9IDE7Ci0JCQkJCXRlbXBzX3VzZWQgfD0gKDEgPDwgaWR4KTsKLQkJCQl9IGVsc2UKLQkJCQkJY3MtPnRlbXBzW2lkeF0ucmVmY291bnQrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJPR1JBTV9JTlBVVDoKLQkJCQljcy0+aW5wdXRzW2lkeF0ucmVmY291bnQrKzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZHggPSBmcGktPkRzdFJlZy5JbmRleDsKLQkJaWYgKGZwaS0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKLQkJCWlmICghKHRlbXBzX3VzZWQgJiAoMSA8PCBpZHgpKSkgewotCQkJCWNzLT50ZW1wc1tpZHhdLnJlZyA9IC0xOwotCQkJCWNzLT50ZW1wc1tpZHhdLnJlZmNvdW50ID0gMTsKLQkJCQl0ZW1wc191c2VkIHw9ICgxIDw8IGlkeCk7Ci0JCQl9IGVsc2UKLQkJCQljcy0+dGVtcHNbaWR4XS5yZWZjb3VudCsrOwotCQl9Ci0JfQotCWNzLT50ZW1wX2luX3VzZSA9IHRlbXBzX3VzZWQ7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9wYXJhbXMoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnApCi17Ci0Jc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKm1wID0gJmZwLT5tZXNhX3Byb2dyYW07Ci0KLQkvKiBBc2sgTWVzYSBuaWNlbHkgdG8gZmlsbCBpbiBQYXJhbWV0ZXJWYWx1ZXMgZm9yIHVzICovCi0JaWYgKG1wLT5CYXNlLlBhcmFtZXRlcnMpCi0JCV9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhmcC0+Y3R4LCBtcC0+QmFzZS5QYXJhbWV0ZXJzKTsKLX0KIAogdm9pZCByMzAwVHJhbnNsYXRlRnJhZ21lbnRTaGFkZXIocjMwMENvbnRleHRQdHIgcjMwMCwKIAkJCQkgc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnApCiB7Ci0Jc3RydWN0IHIzMDBfcGZzX2NvbXBpbGVfc3RhdGUgKmNzID0gTlVMTDsKKwlzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2V4dGVybmFsX3N0YXRlIHN0YXRlOwogCi0JaWYgKCFmcC0+dHJhbnNsYXRlZCkgewotCi0JCWluaXRfcHJvZ3JhbShyMzAwLCBmcCk7Ci0JCWNzID0gZnAtPmNzOwotCi0JCWlmIChwYXJzZV9wcm9ncmFtKGZwKSA9PSBHTF9GQUxTRSkgewotCQkJZHVtcF9wcm9ncmFtKGZwKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIEZpbmlzaCBvZmYgKi8KLQkJZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5hbHVfZW5kID0KLQkJICAgIGNzLT5ucnNsb3RzIC0gZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5hbHVfb2Zmc2V0IC0gMTsKLQkJaWYgKGZwLT5ub2RlW2ZwLT5jdXJfbm9kZV0udGV4X2VuZCA8IDApCi0JCQlmcC0+bm9kZVtmcC0+Y3VyX25vZGVdLnRleF9lbmQgPSAwOwotCQlmcC0+YWx1X29mZnNldCA9IDA7Ci0JCWZwLT5hbHVfZW5kID0gY3MtPm5yc2xvdHMgLSAxOwotCQlmcC0+dGV4X29mZnNldCA9IDA7Ci0JCWZwLT50ZXhfZW5kID0gZnAtPnRleC5sZW5ndGggPyBmcC0+dGV4Lmxlbmd0aCAtIDEgOiAwOwotCQlhc3NlcnQoZnAtPm5vZGVbZnAtPmN1cl9ub2RlXS5hbHVfZW5kID49IDApOwotCQlhc3NlcnQoZnAtPmFsdV9lbmQgPj0gMCk7Ci0KLQkJZnAtPnRyYW5zbGF0ZWQgPSBHTF9UUlVFOwotCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfUElYRUwpCi0JCQlkdW1wX3Byb2dyYW0oZnApOwotCQlyMzAwVXBkYXRlU3RhdGVQYXJhbWV0ZXJzKGZwLT5jdHgsIF9ORVdfUFJPR1JBTSk7CisJYnVpbGRfc3RhdGUocjMwMCwgZnAsICZzdGF0ZSk7CisJaWYgKF9tZXNhX21lbWNtcCgmZnAtPnN0YXRlLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpKSB7CisJCS8qIFRPRE86IGNhY2hlIGNvbXBpbGVkIHByb2dyYW1zICovCisJCWZwLT50cmFuc2xhdGVkID0gR0xfRkFMU0U7CisJCV9tZXNhX21lbWNweSgmZnAtPnN0YXRlLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOwogCX0KIAotCXVwZGF0ZV9wYXJhbXMoZnApOworCWlmICghZnAtPnRyYW5zbGF0ZWQpIHsKKwkJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb21waWxlciBjb21waWxlcjsKKworCQljb21waWxlci5yMzAwID0gcjMwMDsKKwkJY29tcGlsZXIuZnAgPSBmcDsKKwkJY29tcGlsZXIuY29kZSA9ICZmcC0+Y29kZTsKKwkJY29tcGlsZXIucHJvZ3JhbSA9IF9tZXNhX2Nsb25lX3Byb2dyYW0ocjMwMC0+cmFkZW9uLmdsQ3R4LCAmZnAtPm1lc2FfcHJvZ3JhbS5CYXNlKTsKKworCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfUElYRUwpIHsKKwkJCV9tZXNhX3ByaW50ZigiRnJhZ21lbnQgUHJvZ3JhbTogSW5pdGlhbCBwcm9ncmFtOlxuIik7CisJCQlfbWVzYV9wcmludF9wcm9ncmFtKGNvbXBpbGVyLnByb2dyYW0pOworCQl9CisKKwkJaW5zZXJ0X1dQT1NfdHJhaWxlcigmY29tcGlsZXIpOworCisJCXN0cnVjdCByYWRlb25fcHJvZ3JhbV90cmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbnNbXSA9IHsKKwkJCXsgJnRyYW5zZm9ybV9URVgsICZjb21waWxlciB9LAorCQkJeyAmcmFkZW9uVHJhbnNmb3JtQUxVLCAwIH0sCisJCQl7ICZyYWRlb25UcmFuc2Zvcm1UcmlnU2ltcGxlLCAwIH0KKwkJfTsKKwkJcmFkZW9uTG9jYWxUcmFuc2Zvcm0oCisJCQlyMzAwLT5yYWRlb24uZ2xDdHgsCisJCQljb21waWxlci5wcm9ncmFtLAorCQkJMywgdHJhbnNmb3JtYXRpb25zKTsKKworCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfUElYRUwpIHsKKwkJCV9tZXNhX3ByaW50ZigiRnJhZ21lbnQgUHJvZ3JhbTogQWZ0ZXIgbmF0aXZlIHJld3JpdGU6XG4iKTsKKwkJCV9tZXNhX3ByaW50X3Byb2dyYW0oY29tcGlsZXIucHJvZ3JhbSk7CisJCX0KKworCQlzdHJ1Y3QgcmFkZW9uX25xc3NhZGNlX2Rlc2NyIG5xc3NhZGNlID0geworCQkJLkluaXQgPSAmbnFzc2FkY2VfaW5pdCwKKwkJCS5Jc05hdGl2ZVN3aXp6bGUgPSAmcjMwMEZQSXNOYXRpdmVTd2l6emxlLAorCQkJLkJ1aWxkU3dpenpsZSA9ICZyMzAwRlBCdWlsZFN3aXp6bGUsCisJCQkuUmV3cml0ZURlcHRoT3V0ID0gR0xfVFJVRQorCQl9OworCQlyYWRlb25OcXNzYURjZShyMzAwLT5yYWRlb24uZ2xDdHgsIGNvbXBpbGVyLnByb2dyYW0sICZucXNzYWRjZSk7CisKKwkJaWYgKFJBREVPTl9ERUJVRyAmIERFQlVHX1BJWEVMKSB7CisJCQlfbWVzYV9wcmludGYoIkNvbXBpbGVyOiBhZnRlciBOcVNTQS1EQ0U6XG4iKTsKKwkJCV9tZXNhX3ByaW50X3Byb2dyYW0oY29tcGlsZXIucHJvZ3JhbSk7CisJCX0KKworCQlpZiAoIXIzMDBGcmFnbWVudFByb2dyYW1FbWl0KCZjb21waWxlcikpCisJCQlmcC0+ZXJyb3IgPSBHTF9UUlVFOworCisJCS8qIFN1YnRsZTogUmVzY3VlIGFueSBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGR1cmluZyB0cmFuc2Zvcm1hdGlvbnMgKi8KKwkJX21lc2FfZnJlZV9wYXJhbWV0ZXJfbGlzdChmcC0+bWVzYV9wcm9ncmFtLkJhc2UuUGFyYW1ldGVycyk7CisJCWZwLT5tZXNhX3Byb2dyYW0uQmFzZS5QYXJhbWV0ZXJzID0gY29tcGlsZXIucHJvZ3JhbS0+UGFyYW1ldGVyczsKKwkJY29tcGlsZXIucHJvZ3JhbS0+UGFyYW1ldGVycyA9IDA7CisKKwkJX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0ocjMwMC0+cmFkZW9uLmdsQ3R4LCAmY29tcGlsZXIucHJvZ3JhbSwgTlVMTCk7CisKKwkJaWYgKCFmcC0+ZXJyb3IpCisJCQlmcC0+dHJhbnNsYXRlZCA9IEdMX1RSVUU7CisJCWlmIChmcC0+ZXJyb3IgfHwgKFJBREVPTl9ERUJVRyAmIERFQlVHX1BJWEVMKSkKKwkJCXIzMDBGcmFnbWVudFByb2dyYW1EdW1wKGZwLCAmZnAtPmNvZGUpOworCQlyMzAwVXBkYXRlU3RhdGVQYXJhbWV0ZXJzKHIzMDAtPnJhZGVvbi5nbEN0eCwgX05FV19QUk9HUkFNKTsKKwl9CisKKwl1cGRhdGVfcGFyYW1zKHIzMDAsIGZwKTsKIH0KIAogLyoganVzdCBzb21lIHJhbmRvbSB0aGluZ3MuLi4gKi8KLXN0YXRpYyB2b2lkIGR1bXBfcHJvZ3JhbShzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtICpmcCkKK3ZvaWQgcjMwMEZyYWdtZW50UHJvZ3JhbUR1bXAoCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlKQogewogCWludCBuLCBpLCBqOwogCXN0YXRpYyBpbnQgcGMgPSAwOwogCiAJZnByaW50ZihzdGRlcnIsICJwYz0lZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIsIHBjKyspOwogCi0JZnByaW50ZihzdGRlcnIsICJNZXNhIHByb2dyYW06XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS1cbiIpOwotCV9tZXNhX3ByaW50X3Byb2dyYW0oJmZwLT5tZXNhX3Byb2dyYW0uQmFzZSk7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0KIAlmcHJpbnRmKHN0ZGVyciwgIkhhcmR3YXJlIHByb2dyYW1cbiIpOwogCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKLQlmb3IgKG4gPSAwOyBuIDwgKGZwLT5jdXJfbm9kZSArIDEpOyBuKyspIHsKKwlmb3IgKG4gPSAwOyBuIDwgKGNvZGUtPmN1cl9ub2RlICsgMSk7IG4rKykgewogCQlmcHJpbnRmKHN0ZGVyciwgIk5PREUgJWQ6IGFsdV9vZmZzZXQ6ICVkLCB0ZXhfb2Zmc2V0OiAlZCwgIgotCQkJImFsdV9lbmQ6ICVkLCB0ZXhfZW5kOiAlZFxuIiwgbiwKLQkJCWZwLT5ub2RlW25dLmFsdV9vZmZzZXQsCi0JCQlmcC0+bm9kZVtuXS50ZXhfb2Zmc2V0LAotCQkJZnAtPm5vZGVbbl0uYWx1X2VuZCwgZnAtPm5vZGVbbl0udGV4X2VuZCk7CisJCQkiYWx1X2VuZDogJWQsIHRleF9lbmQ6ICVkLCBmbGFnczogJTA4eFxuIiwgbiwKKwkJCWNvZGUtPm5vZGVbbl0uYWx1X29mZnNldCwKKwkJCWNvZGUtPm5vZGVbbl0udGV4X29mZnNldCwKKwkJCWNvZGUtPm5vZGVbbl0uYWx1X2VuZCwgY29kZS0+bm9kZVtuXS50ZXhfZW5kLAorCQkJY29kZS0+bm9kZVtuXS5mbGFncyk7CiAKLQkJaWYgKGZwLT50ZXgubGVuZ3RoKSB7CisJCWlmIChuID4gMCB8fCBjb2RlLT5maXJzdF9ub2RlX2hhc190ZXgpIHsKIAkJCWZwcmludGYoc3RkZXJyLCAiICBURVg6XG4iKTsKLQkJCWZvciAoaSA9IGZwLT5ub2RlW25dLnRleF9vZmZzZXQ7Ci0JCQkgICAgIGkgPD0gZnAtPm5vZGVbbl0udGV4X29mZnNldCArIGZwLT5ub2RlW25dLnRleF9lbmQ7CisJCQlmb3IgKGkgPSBjb2RlLT5ub2RlW25dLnRleF9vZmZzZXQ7CisJCQkgICAgIGkgPD0gY29kZS0+bm9kZVtuXS50ZXhfb2Zmc2V0ICsgY29kZS0+bm9kZVtuXS50ZXhfZW5kOwogCQkJICAgICArK2kpIHsKIAkJCQljb25zdCBjaGFyICppbnN0cjsKIAotCQkJCXN3aXRjaCAoKGZwLT50ZXguCi0JCQkJCSBpbnN0W2ldID4+IFIzMDBfRlBJVFhfT1BDT0RFX1NISUZUKSAmCisJCQkJc3dpdGNoICgoY29kZS0+dGV4LgorCQkJCQkgaW5zdFtpXSA+PiBSMzAwX1RFWF9JTlNUX1NISUZUKSAmCiAJCQkJCTE1KSB7Ci0JCQkJY2FzZSBSMzAwX0ZQSVRYX09QX1RFWDoKKwkJCQljYXNlIFIzMDBfVEVYX09QX0xEOgogCQkJCQlpbnN0ciA9ICJURVgiOwogCQkJCQlicmVhazsKLQkJCQljYXNlIFIzMDBfRlBJVFhfT1BfS0lMOgorCQkJCWNhc2UgUjMwMF9URVhfT1BfS0lMOgogCQkJCQlpbnN0ciA9ICJLSUwiOwogCQkJCQlicmVhazsKLQkJCQljYXNlIFIzMDBfRlBJVFhfT1BfVFhQOgorCQkJCWNhc2UgUjMwMF9URVhfT1BfVFhQOgogCQkJCQlpbnN0ciA9ICJUWFAiOwogCQkJCQlicmVhazsKLQkJCQljYXNlIFIzMDBfRlBJVFhfT1BfVFhCOgorCQkJCWNhc2UgUjMwMF9URVhfT1BfVFhCOgogCQkJCQlpbnN0ciA9ICJUWEIiOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgpAQCAtMjI5NywyMiArNTEzLDIwIEBACiAJCQkJZnByaW50ZihzdGRlcnIsCiAJCQkJCSIgICAgJXMgdCVpLCAlYyVpLCB0ZXh0dXJlWyVpXSAgICglMDh4KVxuIiwKIAkJCQkJaW5zdHIsCi0JCQkJCShmcC0+dGV4LgotCQkJCQkgaW5zdFtpXSA+PiBSMzAwX0ZQSVRYX0RTVF9TSElGVCkgJiAzMSwKLQkJCQkJKGZwLT50ZXguCi0JCQkJCSBpbnN0W2ldICYgUjMwMF9GUElUWF9TUkNfQ09OU1QpID8gJ2MnIDoKKwkJCQkJKGNvZGUtPnRleC4KKwkJCQkJIGluc3RbaV0gPj4gUjMwMF9EU1RfQUREUl9TSElGVCkgJiAzMSwKIAkJCQkJJ3QnLAotCQkJCQkoZnAtPnRleC4KLQkJCQkJIGluc3RbaV0gPj4gUjMwMF9GUElUWF9TUkNfU0hJRlQpICYgMzEsCi0JCQkJCShmcC0+dGV4LgotCQkJCQkgaW5zdFtpXSAmIFIzMDBfRlBJVFhfSU1BR0VfTUFTSykgPj4KLQkJCQkJUjMwMF9GUElUWF9JTUFHRV9TSElGVCwKLQkJCQkJZnAtPnRleC5pbnN0W2ldKTsKKwkJCQkJKGNvZGUtPnRleC4KKwkJCQkJIGluc3RbaV0gPj4gUjMwMF9TUkNfQUREUl9TSElGVCkgJiAzMSwKKwkJCQkJKGNvZGUtPnRleC4KKwkJCQkJIGluc3RbaV0gJiBSMzAwX1RFWF9JRF9NQVNLKSA+PgorCQkJCQlSMzAwX1RFWF9JRF9TSElGVCwKKwkJCQkJY29kZS0+dGV4Lmluc3RbaV0pOwogCQkJfQogCQl9CiAKLQkJZm9yIChpID0gZnAtPm5vZGVbbl0uYWx1X29mZnNldDsKLQkJICAgICBpIDw9IGZwLT5ub2RlW25dLmFsdV9vZmZzZXQgKyBmcC0+bm9kZVtuXS5hbHVfZW5kOyArK2kpIHsKKwkJZm9yIChpID0gY29kZS0+bm9kZVtuXS5hbHVfb2Zmc2V0OworCQkgICAgIGkgPD0gY29kZS0+bm9kZVtuXS5hbHVfb2Zmc2V0ICsgY29kZS0+bm9kZVtuXS5hbHVfZW5kOyArK2kpIHsKIAkJCWNoYXIgc3JjY1szXVsxMF0sIGRzdGNbMjBdOwogCQkJY2hhciBzcmNhWzNdWzEwXSwgZHN0YVsyMF07CiAJCQljaGFyIGFyZ2NbM11bMjBdOwpAQCAtMjMyMCw4ICs1MzQsOCBAQAogCQkJY2hhciBmbGFnc1s1XSwgdG1wWzEwXTsKIAogCQkJZm9yIChqID0gMDsgaiA8IDM7ICsraikgewotCQkJCWludCByZWdjID0gZnAtPmFsdS5pbnN0W2ldLmluc3QxID4+IChqICogNik7Ci0JCQkJaW50IHJlZ2EgPSBmcC0+YWx1Lmluc3RbaV0uaW5zdDMgPj4gKGogKiA2KTsKKwkJCQlpbnQgcmVnYyA9IGNvZGUtPmFsdS5pbnN0W2ldLmluc3QxID4+IChqICogNik7CisJCQkJaW50IHJlZ2EgPSBjb2RlLT5hbHUuaW5zdFtpXS5pbnN0MyA+PiAoaiAqIDYpOwogCiAJCQkJc3ByaW50ZihzcmNjW2pdLCAiJWMlaSIsCiAJCQkJCShyZWdjICYgMzIpID8gJ2MnIDogJ3QnLCByZWdjICYgMzEpOwpAQCAtMjMzMSw0NiArNTQ1LDQ2IEBACiAKIAkJCWRzdGNbMF0gPSAwOwogCQkJc3ByaW50ZihmbGFncywgIiVzJXMlcyIsCi0JCQkJKGZwLT5hbHUuaW5zdFtpXS4KLQkJCQkgaW5zdDEgJiBSMzAwX0ZQSTFfRFNUQ19SRUdfWCkgPyAieCIgOiAiIiwKLQkJCQkoZnAtPmFsdS5pbnN0W2ldLgotCQkJCSBpbnN0MSAmIFIzMDBfRlBJMV9EU1RDX1JFR19ZKSA/ICJ5IiA6ICIiLAotCQkJCShmcC0+YWx1Lmluc3RbaV0uCi0JCQkJIGluc3QxICYgUjMwMF9GUEkxX0RTVENfUkVHX1opID8gInoiIDogIiIpOworCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX1JFR19YKSA/ICJ4IiA6ICIiLAorCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX1JFR19ZKSA/ICJ5IiA6ICIiLAorCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX1JFR19aKSA/ICJ6IiA6ICIiKTsKIAkJCWlmIChmbGFnc1swXSAhPSAwKSB7CiAJCQkJc3ByaW50Zihkc3RjLCAidCVpLiVzICIsCi0JCQkJCShmcC0+YWx1Lmluc3RbaV0uCi0JCQkJCSBpbnN0MSA+PiBSMzAwX0ZQSTFfRFNUQ19TSElGVCkgJiAzMSwKKwkJCQkJKGNvZGUtPmFsdS5pbnN0W2ldLgorCQkJCQkgaW5zdDEgPj4gUjMwMF9BTFVfRFNUQ19TSElGVCkgJiAzMSwKIAkJCQkJZmxhZ3MpOwogCQkJfQogCQkJc3ByaW50ZihmbGFncywgIiVzJXMlcyIsCi0JCQkJKGZwLT5hbHUuaW5zdFtpXS4KLQkJCQkgaW5zdDEgJiBSMzAwX0ZQSTFfRFNUQ19PVVRQVVRfWCkgPyAieCIgOiAiIiwKLQkJCQkoZnAtPmFsdS5pbnN0W2ldLgotCQkJCSBpbnN0MSAmIFIzMDBfRlBJMV9EU1RDX09VVFBVVF9ZKSA/ICJ5IiA6ICIiLAotCQkJCShmcC0+YWx1Lmluc3RbaV0uCi0JCQkJIGluc3QxICYgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1opID8gInoiIDogIiIpOworCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX09VVFBVVF9YKSA/ICJ4IiA6ICIiLAorCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX09VVFBVVF9ZKSA/ICJ5IiA6ICIiLAorCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkgaW5zdDEgJiBSMzAwX0FMVV9EU1RDX09VVFBVVF9aKSA/ICJ6IiA6ICIiKTsKIAkJCWlmIChmbGFnc1swXSAhPSAwKSB7CiAJCQkJc3ByaW50Zih0bXAsICJvJWkuJXMiLAotCQkJCQkoZnAtPmFsdS5pbnN0W2ldLgotCQkJCQkgaW5zdDEgPj4gUjMwMF9GUEkxX0RTVENfU0hJRlQpICYgMzEsCisJCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkJIGluc3QxID4+IFIzMDBfQUxVX0RTVENfU0hJRlQpICYgMzEsCiAJCQkJCWZsYWdzKTsKIAkJCQlzdHJjYXQoZHN0YywgdG1wKTsKIAkJCX0KIAogCQkJZHN0YVswXSA9IDA7Ci0JCQlpZiAoZnAtPmFsdS5pbnN0W2ldLmluc3QzICYgUjMwMF9GUEkzX0RTVEFfUkVHKSB7CisJCQlpZiAoY29kZS0+YWx1Lmluc3RbaV0uaW5zdDMgJiBSMzAwX0FMVV9EU1RBX1JFRykgewogCQkJCXNwcmludGYoZHN0YSwgInQlaS53ICIsCi0JCQkJCShmcC0+YWx1Lmluc3RbaV0uCi0JCQkJCSBpbnN0MyA+PiBSMzAwX0ZQSTNfRFNUQV9TSElGVCkgJiAzMSk7CisJCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkJIGluc3QzID4+IFIzMDBfQUxVX0RTVEFfU0hJRlQpICYgMzEpOwogCQkJfQotCQkJaWYgKGZwLT5hbHUuaW5zdFtpXS5pbnN0MyAmIFIzMDBfRlBJM19EU1RBX09VVFBVVCkgeworCQkJaWYgKGNvZGUtPmFsdS5pbnN0W2ldLmluc3QzICYgUjMwMF9BTFVfRFNUQV9PVVRQVVQpIHsKIAkJCQlzcHJpbnRmKHRtcCwgIm8laS53ICIsCi0JCQkJCShmcC0+YWx1Lmluc3RbaV0uCi0JCQkJCSBpbnN0MyA+PiBSMzAwX0ZQSTNfRFNUQV9TSElGVCkgJiAzMSk7CisJCQkJCShjb2RlLT5hbHUuaW5zdFtpXS4KKwkJCQkJIGluc3QzID4+IFIzMDBfQUxVX0RTVEFfU0hJRlQpICYgMzEpOwogCQkJCXN0cmNhdChkc3RhLCB0bXApOwogCQkJfQotCQkJaWYgKGZwLT5hbHUuaW5zdFtpXS5pbnN0MyAmIFIzMDBfRlBJM19EU1RBX0RFUFRIKSB7CisJCQlpZiAoY29kZS0+YWx1Lmluc3RbaV0uaW5zdDMgJiBSMzAwX0FMVV9EU1RBX0RFUFRIKSB7CiAJCQkJc3RyY2F0KGRzdGEsICJaIik7CiAJCQl9CiAKQEAgLTIzNzgsMzEgKzU5MiwzMSBAQAogCQkJCSIlM2k6IHh5ejogJTNzICUzcyAlM3MgLT4gJS0yMHMgKCUwOHgpXG4iCiAJCQkJIiAgICAgICB3OiAlM3MgJTNzICUzcyAtPiAlLTIwcyAoJTA4eClcbiIsIGksCiAJCQkJc3JjY1swXSwgc3JjY1sxXSwgc3JjY1syXSwgZHN0YywKLQkJCQlmcC0+YWx1Lmluc3RbaV0uaW5zdDEsIHNyY2FbMF0sIHNyY2FbMV0sCi0JCQkJc3JjYVsyXSwgZHN0YSwgZnAtPmFsdS5pbnN0W2ldLmluc3QzKTsKKwkJCQljb2RlLT5hbHUuaW5zdFtpXS5pbnN0MSwgc3JjYVswXSwgc3JjYVsxXSwKKwkJCQlzcmNhWzJdLCBkc3RhLCBjb2RlLT5hbHUuaW5zdFtpXS5pbnN0Myk7CiAKIAkJCWZvciAoaiA9IDA7IGogPCAzOyArK2opIHsKLQkJCQlpbnQgcmVnYyA9IGZwLT5hbHUuaW5zdFtpXS5pbnN0MCA+PiAoaiAqIDcpOwotCQkJCWludCByZWdhID0gZnAtPmFsdS5pbnN0W2ldLmluc3QyID4+IChqICogNyk7CisJCQkJaW50IHJlZ2MgPSBjb2RlLT5hbHUuaW5zdFtpXS5pbnN0MCA+PiAoaiAqIDcpOworCQkJCWludCByZWdhID0gY29kZS0+YWx1Lmluc3RbaV0uaW5zdDIgPj4gKGogKiA3KTsKIAkJCQlpbnQgZDsKIAkJCQljaGFyIGJ1ZlsyMF07CiAKIAkJCQlkID0gcmVnYyAmIDMxOwogCQkJCWlmIChkIDwgMTIpIHsKIAkJCQkJc3dpdGNoIChkICUgNCkgewotCQkJCQljYXNlIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1hZWjoKKwkJCQkJY2FzZSBSMzAwX0FMVV9BUkdDX1NSQzBDX1hZWjoKIAkJCQkJCXNwcmludGYoYnVmLCAiJXMueHl6IiwKIAkJCQkJCQlzcmNjW2QgLyA0XSk7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19YWFg6CisJCQkJCWNhc2UgUjMwMF9BTFVfQVJHQ19TUkMwQ19YWFg6CiAJCQkJCQlzcHJpbnRmKGJ1ZiwgIiVzLnh4eCIsCiAJCQkJCQkJc3JjY1tkIC8gNF0pOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVlZOgorCQkJCQljYXNlIFIzMDBfQUxVX0FSR0NfU1JDMENfWVlZOgogCQkJCQkJc3ByaW50ZihidWYsICIlcy55eXkiLAogCQkJCQkJCXNyY2NbZCAvIDRdKTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1paWjoKKwkJCQkJY2FzZSBSMzAwX0FMVV9BUkdDX1NSQzBDX1paWjoKIAkJCQkJCXNwcmludGYoYnVmLCAiJXMuenp6IiwKIAkJCQkJCQlzcmNjW2QgLyA0XSk7CiAJCQkJCQlicmVhazsKQEAgLTI0NjUsOCArNjc5LDggQEAKIAkJCWZwcmludGYoc3RkZXJyLCAiICAgICB4eXo6ICU4cyAlOHMgJThzICAgIG9wOiAlMDh4XG4iCiAJCQkJIiAgICAgICB3OiAlOHMgJThzICU4cyAgICBvcDogJTA4eFxuIiwKIAkJCQlhcmdjWzBdLCBhcmdjWzFdLCBhcmdjWzJdLAotCQkJCWZwLT5hbHUuaW5zdFtpXS5pbnN0MCwgYXJnYVswXSwgYXJnYVsxXSwKLQkJCQlhcmdhWzJdLCBmcC0+YWx1Lmluc3RbaV0uaW5zdDIpOworCQkJCWNvZGUtPmFsdS5pbnN0W2ldLmluc3QwLCBhcmdhWzBdLCBhcmdhWzFdLAorCQkJCWFyZ2FbMl0sIGNvZGUtPmFsdS5pbnN0W2ldLmluc3QyKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9mcmFncHJvZy5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmgKaW5kZXggNzJmY2E3Ny4uYjNhM2NkMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nLmgKQEAgLTQwLDY1ICs0MCw5MyBAQAogI2luY2x1ZGUgInNoYWRlci9wcm9nX2luc3RydWN0aW9uLmgiCiAKICNpbmNsdWRlICJyMzAwX2NvbnRleHQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX3N3aXp6bGUgewotCUdMdWludCBsZW5ndGg7Ci0JR0x1aW50IHNyY1s0XTsKLQlHTHVpbnQgaW5zdFs4XTsKLX0gcjMwMF9mcmFnbWVudF9wcm9ncmFtX3N3aXp6bGVfdDsKLQotLyogc3VwcG9ydGVkIGh3IG9wY29kZXMgKi8KLSNkZWZpbmUgUEZTX09QX01BRCAwCi0jZGVmaW5lIFBGU19PUF9EUDMgMQotI2RlZmluZSBQRlNfT1BfRFA0IDIKLSNkZWZpbmUgUEZTX09QX01JTiAzCi0jZGVmaW5lIFBGU19PUF9NQVggNAotI2RlZmluZSBQRlNfT1BfQ01QIDUKLSNkZWZpbmUgUEZTX09QX0ZSQyA2Ci0jZGVmaW5lIFBGU19PUF9FWDIgNwotI2RlZmluZSBQRlNfT1BfTEcyIDgKLSNkZWZpbmUgUEZTX09QX1JDUCA5Ci0jZGVmaW5lIFBGU19PUF9SU1EgMTAKLSNkZWZpbmUgUEZTX09QX1JFUExfQUxQSEEgMTEKLSNkZWZpbmUgUEZTX09QX0NNUEggMTIKLSNkZWZpbmUgTUFYX1BGU19PUCAxMgotCi0jZGVmaW5lIFBGU19GTEFHX1NBVAkoMSA8PCAwKQotI2RlZmluZSBQRlNfRkxBR19BQlMJKDEgPDwgMSkKLQotI2RlZmluZSBBUkdfTkVHCQkJKDEgPDwgNSkKLSNkZWZpbmUgQVJHX0FCUwkJCSgxIDw8IDYpCi0jZGVmaW5lIEFSR19NQVNLCQkoMTI3IDw8IDApCi0jZGVmaW5lIEFSR19TVFJJREUJCTcKLSNkZWZpbmUgU1JDX0NPTlNUCQkoMSA8PCA1KQotI2RlZmluZSBTUkNfTUFTSwkJKDYzIDw8IDApCi0jZGVmaW5lIFNSQ19TVFJJREUJCTYKLQotI2RlZmluZSBOT1BfSU5TVDAgKAkJCQkJCSBcCi0JCShSMzAwX0ZQSTBfT1VUQ19NQUQpIHwJCQkJIFwKLQkJKFIzMDBfRlBJMF9BUkdDX1pFUk8gPDwgUjMwMF9GUEkwX0FSRzBDX1NISUZUKSB8IFwKLQkJKFIzMDBfRlBJMF9BUkdDX1pFUk8gPDwgUjMwMF9GUEkwX0FSRzFDX1NISUZUKSB8IFwKLQkJKFIzMDBfRlBJMF9BUkdDX1pFUk8gPDwgUjMwMF9GUEkwX0FSRzJDX1NISUZUKSkKLSNkZWZpbmUgTk9QX0lOU1QxICgJCQkJCSAgICAgXAotCQkoKDAgfCBTUkNfQ09OU1QpIDw8IFIzMDBfRlBJMV9TUkMwQ19TSElGVCkgfCBcCi0JCSgoMCB8IFNSQ19DT05TVCkgPDwgUjMwMF9GUEkxX1NSQzFDX1NISUZUKSB8IFwKLQkJKCgwIHwgU1JDX0NPTlNUKSA8PCBSMzAwX0ZQSTFfU1JDMkNfU0hJRlQpKQotI2RlZmluZSBOT1BfSU5TVDIgKCBcCi0JCShSMzAwX0ZQSTJfT1VUQV9NQUQpIHwJCQkJIFwKLQkJKFIzMDBfRlBJMl9BUkdBX1pFUk8gPDwgUjMwMF9GUEkyX0FSRzBBX1NISUZUKSB8IFwKLQkJKFIzMDBfRlBJMl9BUkdBX1pFUk8gPDwgUjMwMF9GUEkyX0FSRzFBX1NISUZUKSB8IFwKLQkJKFIzMDBfRlBJMl9BUkdBX1pFUk8gPDwgUjMwMF9GUEkyX0FSRzJBX1NISUZUKSkKLSNkZWZpbmUgTk9QX0lOU1QzICgJCQkJCSAgICAgXAotCQkoKDAgfCBTUkNfQ09OU1QpIDw8IFIzMDBfRlBJM19TUkMwQV9TSElGVCkgfCBcCi0JCSgoMCB8IFNSQ19DT05TVCkgPDwgUjMwMF9GUEkzX1NSQzFBX1NISUZUKSB8IFwKLQkJKCgwIHwgU1JDX0NPTlNUKSA8PCBSMzAwX0ZQSTNfU1JDMkFfU0hJRlQpKQorI2luY2x1ZGUgInJhZGVvbl9wcm9ncmFtLmgiCiAKICNkZWZpbmUgRFJJX0NPTkZfRlBfT1BUSU1JWkFUSU9OX1NQRUVEICAgMAogI2RlZmluZSBEUklfQ09ORl9GUF9PUFRJTUlaQVRJT05fUVVBTElUWSAxCiAKKyNpZiAxCisKKy8qKgorICogRnJhZ21lbnQgcHJvZ3JhbSBoZWxwZXIgbWFjcm9zCisgKi8KKworLyogUHJvZHVjZSB1bnNoaWZ0ZWQgc291cmNlIHNlbGVjdG9ycyAqLworI2RlZmluZSBGUF9UTVAoaWR4KSAoaWR4KQorI2RlZmluZSBGUF9DT05TVChpZHgpICgoaWR4KSB8ICgxIDw8IDUpKQorCisvKiBQcm9kdWNlIHNvdXJjZS9kZXN0IHNlbGVjdG9yIGR3b3JkICovCisjZGVmaW5lIEZQX1NFTENfTUFTS19OTwkJMAorI2RlZmluZSBGUF9TRUxDX01BU0tfWAkJMQorI2RlZmluZSBGUF9TRUxDX01BU0tfWQkJMgorI2RlZmluZSBGUF9TRUxDX01BU0tfWFkJCTMKKyNkZWZpbmUgRlBfU0VMQ19NQVNLX1oJCTQKKyNkZWZpbmUgRlBfU0VMQ19NQVNLX1haCQk1CisjZGVmaW5lIEZQX1NFTENfTUFTS19ZWgkJNgorI2RlZmluZSBGUF9TRUxDX01BU0tfWFlaCTcKKworI2RlZmluZSBGUF9TRUxDKGRlc3RpZHgscmVnbWFzayxvdXRtYXNrLHNyYzAsc3JjMSxzcmMyKSBcCisJKCgoZGVzdGlkeCkgPDwgUjMwMF9BTFVfRFNUQ19TSElGVCkgfAkJXAorCSAoRlBfU0VMQ19NQVNLXyMjcmVnbWFzayA8PCAyMykgfAkJXAorCSAoRlBfU0VMQ19NQVNLXyMjb3V0bWFzayA8PCAyNikgfAkJXAorCSAoKHNyYzApIDw8IFIzMDBfQUxVX1NSQzBDX1NISUZUKSB8CQlcCisJICgoc3JjMSkgPDwgUjMwMF9BTFVfU1JDMUNfU0hJRlQpIHwJCVwKKwkgKChzcmMyKSA8PCBSMzAwX0FMVV9TUkMyQ19TSElGVCkpCisKKyNkZWZpbmUgRlBfU0VMQV9NQVNLX05PCQkwCisjZGVmaW5lIEZQX1NFTEFfTUFTS19XCQkxCisKKyNkZWZpbmUgRlBfU0VMQShkZXN0aWR4LHJlZ21hc2ssb3V0bWFzayxzcmMwLHNyYzEsc3JjMikgXAorCSgoKGRlc3RpZHgpIDw8IFIzMDBfQUxVX0RTVEFfU0hJRlQpIHwJCVwKKwkgKEZQX1NFTEFfTUFTS18jI3JlZ21hc2sgPDwgMjMpIHwJCVwKKwkgKEZQX1NFTEFfTUFTS18jI291dG1hc2sgPDwgMjQpIHwJCVwKKwkgKChzcmMwKSA8PCBSMzAwX0FMVV9TUkMwQV9TSElGVCkgfAkJXAorCSAoKHNyYzEpIDw8IFIzMDBfQUxVX1NSQzFBX1NISUZUKSB8CQlcCisJICgoc3JjMikgPDwgUjMwMF9BTFVfU1JDMkFfU0hJRlQpKQorCisvKiBQcm9kdWNlIHVuc2hpZnRlZCBhcmd1bWVudCBzZWxlY3RvcnMgKi8KKyNkZWZpbmUgRlBfQVJHQyhzb3VyY2UpCVIzMDBfQUxVX0FSR0NfIyNzb3VyY2UKKyNkZWZpbmUgRlBfQVJHQShzb3VyY2UpIFIzMDBfQUxVX0FSR0FfIyNzb3VyY2UKKyNkZWZpbmUgRlBfQUJTKGFyZykgKChhcmcpIHwgKDEgPDwgNikpCisjZGVmaW5lIEZQX05FRyhhcmcpICgoYXJnKSBeICgxIDw8IDUpKQorCisvKiBQcm9kdWNlIGluc3RydWN0aW9uIGR3b3JkICovCisjZGVmaW5lIEZQX0lOU1RSQyhvcGNvZGUsYXJnMCxhcmcxLGFyZzIpIFwKKwkoUjMwMF9BTFVfT1VUQ18jI29wY29kZSB8IAkJXAorCSgoYXJnMCkgPDwgUjMwMF9BTFVfQVJHMENfU0hJRlQpIHwJXAorCSgoYXJnMSkgPDwgUjMwMF9BTFVfQVJHMUNfU0hJRlQpIHwJXAorCSgoYXJnMikgPDwgUjMwMF9BTFVfQVJHMkNfU0hJRlQpKQorCisjZGVmaW5lIEZQX0lOU1RSQShvcGNvZGUsYXJnMCxhcmcxLGFyZzIpIFwKKwkoUjMwMF9BTFVfT1VUQV8jI29wY29kZSB8IAkJXAorCSgoYXJnMCkgPDwgUjMwMF9BTFVfQVJHMEFfU0hJRlQpIHwJXAorCSgoYXJnMSkgPDwgUjMwMF9BTFVfQVJHMUFfU0hJRlQpIHwJXAorCSgoYXJnMikgPDwgUjMwMF9BTFVfQVJHMkFfU0hJRlQpKQorCisjZW5kaWYKKwogc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbTsKIAogZXh0ZXJuIHZvaWQgcjMwMFRyYW5zbGF0ZUZyYWdtZW50U2hhZGVyKHIzMDBDb250ZXh0UHRyIHIzMDAsCiAJCQkJCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKTsKIAorCisvKioKKyAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgcjMwMCBmcmFnbWVudCBwcm9ncmFtIGNvZGUgdG8gc3RvcmUgY29tcGlsZS10aW1lCisgKiBvbmx5IGRhdGEuCisgKi8KK3N0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIgeworCXIzMDBDb250ZXh0UHRyIHIzMDA7CisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnA7CisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlOworCXN0cnVjdCBnbF9wcm9ncmFtICpwcm9ncmFtOworfTsKKworZXh0ZXJuIEdMYm9vbGVhbiByMzAwRnJhZ21lbnRQcm9ncmFtRW1pdChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyICpjb21waWxlcik7CisKKworZXh0ZXJuIHZvaWQgcjMwMEZyYWdtZW50UHJvZ3JhbUR1bXAoCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfZnJhZ3Byb2dfZW1pdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nX2VtaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBiN2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nX2VtaXQuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZW4gU2tlZ2dzLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qKgorICogXGZpbGUKKyAqCisgKiBFbWl0IHRoZSByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29kZSB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGJ5IHRoZSBoYXJkd2FyZS4KKyAqIElucHV0IGlzIGEgcHJlLXRyYW5zZm9ybWVkIHJhZGVvbl9wcm9ncmFtLgorICoKKyAqIFxhdXRob3IgQmVuIFNrZWdncyA8ZGFya3RhbWFAaWluZXQubmV0LmF1PgorICoKKyAqIFxhdXRob3IgSmVyb21lIEdsaXNzZSA8ai5nbGlzc2VAZ21haWwuY29tPgorICoKKyAqIFx0b2RvIEZvZ09wdGlvbgorICovCisKKyNpbmNsdWRlICJyMzAwX2ZyYWdwcm9nLmgiCisKKyNpbmNsdWRlICJyYWRlb25fcHJvZ3JhbV9wYWlyLmgiCisjaW5jbHVkZSAicjMwMF9mcmFncHJvZ19zd2l6emxlLmgiCisjaW5jbHVkZSAicjMwMF9yZWcuaCIKKworCisjZGVmaW5lIFBST0dfQ09ERSBcCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb21waWxlciAqYyA9IChzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyKilkYXRhOyBcCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlID0gYy0+Y29kZQorCisjZGVmaW5lIGVycm9yKGZtdCwgYXJncy4uLikgZG8gewkJCVwKKwkJZnByaW50ZihzdGRlcnIsICIlczo6JXMoKTogIiBmbXQgIlxuIiwJXAorCQkJX19GSUxFX18sIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsJXAorCX0gd2hpbGUoMCkKKworCitzdGF0aWMgR0xib29sZWFuIGVtaXRfY29uc3Qodm9pZCogZGF0YSwgR0x1aW50IGZpbGUsIEdMdWludCBpbmRleCwgR0x1aW50ICpod2luZGV4KQoreworCVBST0dfQ09ERTsKKworCWZvciAoKmh3aW5kZXggPSAwOyAqaHdpbmRleCA8IGNvZGUtPmNvbnN0X25yOyArKypod2luZGV4KSB7CisJCWlmIChjb2RlLT5jb25zdGFudFsqaHdpbmRleF0uRmlsZSA9PSBmaWxlICYmCisJCSAgICBjb2RlLT5jb25zdGFudFsqaHdpbmRleF0uSW5kZXggPT0gaW5kZXgpCisJCQlicmVhazsKKwl9CisKKwlpZiAoKmh3aW5kZXggPj0gY29kZS0+Y29uc3RfbnIpIHsKKwkJaWYgKCpod2luZGV4ID49IFBGU19OVU1fQ09OU1RfUkVHUykgeworCQkJZXJyb3IoIk91dCBvZiBodyBjb25zdGFudHMhXG4iKTsKKwkJCXJldHVybiBHTF9GQUxTRTsKKwkJfQorCisJCWNvZGUtPmNvbnN0X25yKys7CisJCWNvZGUtPmNvbnN0YW50Wypod2luZGV4XS5GaWxlID0gZmlsZTsKKwkJY29kZS0+Y29uc3RhbnRbKmh3aW5kZXhdLkluZGV4ID0gaW5kZXg7CisJfQorCisJcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBNYXJrIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyIGFzIHVzZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzZV90ZW1wb3Jhcnkoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlLCBHTHVpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4ID4gY29kZS0+bWF4X3RlbXBfaWR4KQorCQljb2RlLT5tYXhfdGVtcF9pZHggPSBpbmRleDsKK30KKworCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9yZ2Jfb3Bjb2RlKEdMdWludCBvcGNvZGUpCit7CisJc3dpdGNoKG9wY29kZSkgeworCWNhc2UgT1BDT0RFX0NNUDogcmV0dXJuIFIzMDBfQUxVX09VVENfQ01QOworCWNhc2UgT1BDT0RFX0RQMzogcmV0dXJuIFIzMDBfQUxVX09VVENfRFAzOworCWNhc2UgT1BDT0RFX0RQNDogcmV0dXJuIFIzMDBfQUxVX09VVENfRFA0OworCWNhc2UgT1BDT0RFX0ZSQzogcmV0dXJuIFIzMDBfQUxVX09VVENfRlJDOworCWRlZmF1bHQ6CisJCWVycm9yKCJ0cmFuc2xhdGVfcmdiX29wY29kZSglaSk6IFVua25vd24gb3Bjb2RlIiwgb3Bjb2RlKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBPUENPREVfTk9QOgorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE9QQ09ERV9NQUQ6IHJldHVybiBSMzAwX0FMVV9PVVRDX01BRDsKKwljYXNlIE9QQ09ERV9NQVg6IHJldHVybiBSMzAwX0FMVV9PVVRDX01BWDsKKwljYXNlIE9QQ09ERV9NSU46IHJldHVybiBSMzAwX0FMVV9PVVRDX01JTjsKKwljYXNlIE9QQ09ERV9SRVBMX0FMUEhBOiByZXR1cm4gUjMwMF9BTFVfT1VUQ19SRVBMX0FMUEhBOworCX0KK30KKworc3RhdGljIEdMdWludCB0cmFuc2xhdGVfYWxwaGFfb3Bjb2RlKEdMdWludCBvcGNvZGUpCit7CisJc3dpdGNoKG9wY29kZSkgeworCWNhc2UgT1BDT0RFX0NNUDogcmV0dXJuIFIzMDBfQUxVX09VVEFfQ01QOworCWNhc2UgT1BDT0RFX0RQMzogcmV0dXJuIFIzMDBfQUxVX09VVEFfRFA0OworCWNhc2UgT1BDT0RFX0RQNDogcmV0dXJuIFIzMDBfQUxVX09VVEFfRFA0OworCWNhc2UgT1BDT0RFX0VYMjogcmV0dXJuIFIzMDBfQUxVX09VVEFfRVgyOworCWNhc2UgT1BDT0RFX0ZSQzogcmV0dXJuIFIzMDBfQUxVX09VVEFfRlJDOworCWNhc2UgT1BDT0RFX0xHMjogcmV0dXJuIFIzMDBfQUxVX09VVEFfTEcyOworCWRlZmF1bHQ6CisJCWVycm9yKCJ0cmFuc2xhdGVfcmdiX29wY29kZSglaSk6IFVua25vd24gb3Bjb2RlIiwgb3Bjb2RlKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBPUENPREVfTk9QOgorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE9QQ09ERV9NQUQ6IHJldHVybiBSMzAwX0FMVV9PVVRBX01BRDsKKwljYXNlIE9QQ09ERV9NQVg6IHJldHVybiBSMzAwX0FMVV9PVVRBX01BWDsKKwljYXNlIE9QQ09ERV9NSU46IHJldHVybiBSMzAwX0FMVV9PVVRBX01JTjsKKwljYXNlIE9QQ09ERV9SQ1A6IHJldHVybiBSMzAwX0FMVV9PVVRBX1JDUDsKKwljYXNlIE9QQ09ERV9SU1E6IHJldHVybiBSMzAwX0FMVV9PVVRBX1JTUTsKKwl9Cit9CisKKy8qKgorICogRW1pdCBvbmUgcGFpcmVkIEFMVSBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIEdMYm9vbGVhbiBlbWl0X2FsdSh2b2lkKiBkYXRhLCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJUFJPR19DT0RFOworCisJaWYgKGNvZGUtPmFsdS5sZW5ndGggPj0gUEZTX01BWF9BTFVfSU5TVCkgeworCQllcnJvcigiVG9vIG1hbnkgQUxVIGluc3RydWN0aW9ucyIpOworCQlyZXR1cm4gR0xfRkFMU0U7CisJfQorCisJaW50IGlwID0gY29kZS0+YWx1Lmxlbmd0aCsrOworCWludCBqOworCWNvZGUtPm5vZGVbY29kZS0+Y3VyX25vZGVdLmFsdV9lbmQrKzsKKworCWNvZGUtPmFsdS5pbnN0W2lwXS5pbnN0MCA9IHRyYW5zbGF0ZV9yZ2Jfb3Bjb2RlKGluc3QtPlJHQi5PcGNvZGUpOworCWNvZGUtPmFsdS5pbnN0W2lwXS5pbnN0MiA9IHRyYW5zbGF0ZV9hbHBoYV9vcGNvZGUoaW5zdC0+QWxwaGEuT3Bjb2RlKTsKKworCWZvcihqID0gMDsgaiA8IDM7ICsraikgeworCQlHTHVpbnQgc3JjID0gaW5zdC0+UkdCLlNyY1tqXS5JbmRleCB8IChpbnN0LT5SR0IuU3JjW2pdLkNvbnN0YW50IDw8IDUpOworCQlpZiAoIWluc3QtPlJHQi5TcmNbal0uQ29uc3RhbnQpCisJCQl1c2VfdGVtcG9yYXJ5KGNvZGUsIGluc3QtPlJHQi5TcmNbal0uSW5kZXgpOworCQljb2RlLT5hbHUuaW5zdFtpcF0uaW5zdDEgfD0gc3JjIDw8ICg2KmopOworCisJCXNyYyA9IGluc3QtPkFscGhhLlNyY1tqXS5JbmRleCB8IChpbnN0LT5BbHBoYS5TcmNbal0uQ29uc3RhbnQgPDwgNSk7CisJCWlmICghaW5zdC0+QWxwaGEuU3JjW2pdLkNvbnN0YW50KQorCQkJdXNlX3RlbXBvcmFyeShjb2RlLCBpbnN0LT5BbHBoYS5TcmNbal0uSW5kZXgpOworCQljb2RlLT5hbHUuaW5zdFtpcF0uaW5zdDMgfD0gc3JjIDw8ICg2KmopOworCisJCUdMdWludCBhcmcgPSByMzAwRlBUcmFuc2xhdGVSR0JTd2l6emxlKGluc3QtPlJHQi5Bcmdbal0uU291cmNlLCBpbnN0LT5SR0IuQXJnW2pdLlN3aXp6bGUpOworCQlhcmcgfD0gaW5zdC0+UkdCLkFyZ1tqXS5BYnMgPDwgNjsKKwkJYXJnIHw9IGluc3QtPlJHQi5Bcmdbal0uTmVnYXRlIDw8IDU7CisJCWNvZGUtPmFsdS5pbnN0W2lwXS5pbnN0MCB8PSBhcmcgPDwgKDcqaik7CisKKwkJYXJnID0gcjMwMEZQVHJhbnNsYXRlQWxwaGFTd2l6emxlKGluc3QtPkFscGhhLkFyZ1tqXS5Tb3VyY2UsIGluc3QtPkFscGhhLkFyZ1tqXS5Td2l6emxlKTsKKwkJYXJnIHw9IGluc3QtPkFscGhhLkFyZ1tqXS5BYnMgPDwgNjsKKwkJYXJnIHw9IGluc3QtPkFscGhhLkFyZ1tqXS5OZWdhdGUgPDwgNTsKKwkJY29kZS0+YWx1Lmluc3RbaXBdLmluc3QyIHw9IGFyZyA8PCAoNypqKTsKKwl9CisKKwlpZiAoaW5zdC0+UkdCLlNhdHVyYXRlKQorCQljb2RlLT5hbHUuaW5zdFtpcF0uaW5zdDAgfD0gUjMwMF9BTFVfT1VUQ19DTEFNUDsKKwlpZiAoaW5zdC0+QWxwaGEuU2F0dXJhdGUpCisJCWNvZGUtPmFsdS5pbnN0W2lwXS5pbnN0MiB8PSBSMzAwX0FMVV9PVVRBX0NMQU1QOworCisJaWYgKGluc3QtPlJHQi5Xcml0ZU1hc2spIHsKKwkJdXNlX3RlbXBvcmFyeShjb2RlLCBpbnN0LT5SR0IuRGVzdEluZGV4KTsKKwkJY29kZS0+YWx1Lmluc3RbaXBdLmluc3QxIHw9CisJCQkoaW5zdC0+UkdCLkRlc3RJbmRleCA8PCBSMzAwX0FMVV9EU1RDX1NISUZUKSB8CisJCQkoaW5zdC0+UkdCLldyaXRlTWFzayA8PCBSMzAwX0FMVV9EU1RDX1JFR19NQVNLX1NISUZUKTsKKwl9CisJaWYgKGluc3QtPlJHQi5PdXRwdXRXcml0ZU1hc2spIHsKKwkJY29kZS0+YWx1Lmluc3RbaXBdLmluc3QxIHw9IChpbnN0LT5SR0IuT3V0cHV0V3JpdGVNYXNrIDw8IFIzMDBfQUxVX0RTVENfT1VUUFVUX01BU0tfU0hJRlQpOworCQljb2RlLT5ub2RlW2NvZGUtPmN1cl9ub2RlXS5mbGFncyB8PSBSMzAwX1JHQkFfT1VUOworCX0KKworCWlmIChpbnN0LT5BbHBoYS5Xcml0ZU1hc2spIHsKKwkJdXNlX3RlbXBvcmFyeShjb2RlLCBpbnN0LT5BbHBoYS5EZXN0SW5kZXgpOworCQljb2RlLT5hbHUuaW5zdFtpcF0uaW5zdDMgfD0KKwkJCShpbnN0LT5BbHBoYS5EZXN0SW5kZXggPDwgUjMwMF9BTFVfRFNUQV9TSElGVCkgfAorCQkJUjMwMF9BTFVfRFNUQV9SRUc7CisJfQorCWlmIChpbnN0LT5BbHBoYS5PdXRwdXRXcml0ZU1hc2spIHsKKwkJY29kZS0+YWx1Lmluc3RbaXBdLmluc3QzIHw9IFIzMDBfQUxVX0RTVEFfT1VUUFVUOworCQljb2RlLT5ub2RlW2NvZGUtPmN1cl9ub2RlXS5mbGFncyB8PSBSMzAwX1JHQkFfT1VUOworCX0KKwlpZiAoaW5zdC0+QWxwaGEuRGVwdGhXcml0ZU1hc2spIHsKKwkJY29kZS0+YWx1Lmluc3RbaXBdLmluc3QzIHw9IFIzMDBfQUxVX0RTVEFfREVQVEg7CisJCWNvZGUtPm5vZGVbY29kZS0+Y3VyX25vZGVdLmZsYWdzIHw9IFIzMDBfV19PVVQ7CisJCWMtPmZwLT5Xcml0ZXNEZXB0aCA9IEdMX1RSVUU7CisJfQorCisJcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBGaW5pc2ggdGhlIGN1cnJlbnQgbm9kZSB3aXRob3V0IGFkdmFuY2luZyB0byB0aGUgbmV4dCBvbmUuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4gZmluaXNoX25vZGUoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb21waWxlciAqYykKK3sKKwlzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGUgPSBjLT5jb2RlOworCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fbm9kZSAqbm9kZSA9ICZjb2RlLT5ub2RlW2NvZGUtPmN1cl9ub2RlXTsKKworCWlmIChub2RlLT5hbHVfZW5kIDwgMCkgeworCQkvKiBHZW5lcmF0ZSBhIHNpbmdsZSBOT1AgZm9yIHRoaXMgbm9kZSAqLworCQlzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24gaW5zdDsKKwkJX21lc2FfYnplcm8oJmluc3QsIHNpemVvZihpbnN0KSk7CisJCWlmICghZW1pdF9hbHUoYywgJmluc3QpKQorCQkJcmV0dXJuIEdMX0ZBTFNFOworCX0KKworCWlmIChub2RlLT50ZXhfZW5kIDwgMCkgeworCQlpZiAoY29kZS0+Y3VyX25vZGUgPT0gMCkgeworCQkJbm9kZS0+dGV4X2VuZCA9IDA7CisJCX0gZWxzZSB7CisJCQllcnJvcigiTm9kZSAlaSBoYXMgbm8gVEVYIGluc3RydWN0aW9ucyIsIGNvZGUtPmN1cl9ub2RlKTsKKwkJCXJldHVybiBHTF9GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjb2RlLT5jdXJfbm9kZSA9PSAwKQorCQkJY29kZS0+Zmlyc3Rfbm9kZV9oYXNfdGV4ID0gMTsKKwl9CisKKwlyZXR1cm4gR0xfVFJVRTsKK30KKworCisvKioKKyAqIEJlZ2luIGEgYmxvY2sgb2YgdGV4dHVyZSBpbnN0cnVjdGlvbnMuCisgKiBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBpbmRpcmVjdGlvbi4KKyAqLworc3RhdGljIEdMYm9vbGVhbiBiZWdpbl90ZXgodm9pZCogZGF0YSkKK3sKKwlQUk9HX0NPREU7CisKKwlpZiAoY29kZS0+Y3VyX25vZGUgPT0gMCkgeworCQlpZiAoY29kZS0+bm9kZVswXS5hbHVfZW5kIDwgMCAmJgorCQkgICAgY29kZS0+bm9kZVswXS50ZXhfZW5kIDwgMCkKKwkJCXJldHVybiBHTF9UUlVFOworCX0KKworCWlmIChjb2RlLT5jdXJfbm9kZSA9PSAzKSB7CisJCWVycm9yKCJUb28gbWFueSB0ZXh0dXJlIGluZGlyZWN0aW9ucyIpOworCQlyZXR1cm4gR0xfRkFMU0U7CisJfQorCisJaWYgKCFmaW5pc2hfbm9kZShjKSkKKwkJcmV0dXJuIEdMX0ZBTFNFOworCisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9ub2RlICpub2RlID0gJmNvZGUtPm5vZGVbKytjb2RlLT5jdXJfbm9kZV07CisJbm9kZS0+YWx1X29mZnNldCA9IGNvZGUtPmFsdS5sZW5ndGg7CisJbm9kZS0+YWx1X2VuZCA9IC0xOworCW5vZGUtPnRleF9vZmZzZXQgPSBjb2RlLT50ZXgubGVuZ3RoOworCW5vZGUtPnRleF9lbmQgPSAtMTsKKwlyZXR1cm4gR0xfVFJVRTsKK30KKworCitzdGF0aWMgR0xib29sZWFuIGVtaXRfdGV4KHZvaWQqIGRhdGEsIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0KQoreworCVBST0dfQ09ERTsKKworCWlmIChjb2RlLT50ZXgubGVuZ3RoID49IFBGU19NQVhfVEVYX0lOU1QpIHsKKwkJZXJyb3IoIlRvbyBtYW55IFRFWCBpbnN0cnVjdGlvbnMiKTsKKwkJcmV0dXJuIEdMX0ZBTFNFOworCX0KKworCUdMdWludCB1bml0ID0gaW5zdC0+VGV4U3JjVW5pdDsKKwlHTHVpbnQgZGVzdCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKwlHTHVpbnQgb3Bjb2RlOworCisJc3dpdGNoKGluc3QtPk9wY29kZSkgeworCWNhc2UgT1BDT0RFX0tJTDogb3Bjb2RlID0gUjMwMF9URVhfT1BfS0lMOyBicmVhazsKKwljYXNlIE9QQ09ERV9URVg6IG9wY29kZSA9IFIzMDBfVEVYX09QX0xEOyBicmVhazsKKwljYXNlIE9QQ09ERV9UWEI6IG9wY29kZSA9IFIzMDBfVEVYX09QX1RYQjsgYnJlYWs7CisJY2FzZSBPUENPREVfVFhQOiBvcGNvZGUgPSBSMzAwX1RFWF9PUF9UWFA7IGJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJVbmtub3duIHRleHR1cmUgb3Bjb2RlICVpIiwgaW5zdC0+T3Bjb2RlKTsKKwkJcmV0dXJuIEdMX0ZBTFNFOworCX0KKworCWlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0tJTCkgeworCQl1bml0ID0gMDsKKwkJZGVzdCA9IDA7CisJfSBlbHNlIHsKKwkJdXNlX3RlbXBvcmFyeShjb2RlLCBkZXN0KTsKKwl9CisKKwl1c2VfdGVtcG9yYXJ5KGNvZGUsIGluc3QtPlNyY1JlZ1swXS5JbmRleCk7CisKKwljb2RlLT5ub2RlW2NvZGUtPmN1cl9ub2RlXS50ZXhfZW5kKys7CisJY29kZS0+dGV4Lmluc3RbY29kZS0+dGV4Lmxlbmd0aCsrXSA9CisJCShpbnN0LT5TcmNSZWdbMF0uSW5kZXggPDwgUjMwMF9TUkNfQUREUl9TSElGVCkgfAorCQkoZGVzdCA8PCBSMzAwX0RTVF9BRERSX1NISUZUKSB8CisJCSh1bml0IDw8IFIzMDBfVEVYX0lEX1NISUZUKSB8CisJCShvcGNvZGUgPDwgUjMwMF9URVhfSU5TVF9TSElGVCk7CisJcmV0dXJuIEdMX1RSVUU7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYWRlb25fcGFpcl9oYW5kbGVyIHBhaXJfaGFuZGxlciA9IHsKKwkuRW1pdENvbnN0ID0gJmVtaXRfY29uc3QsCisJLkVtaXRQYWlyZWQgPSAmZW1pdF9hbHUsCisJLkVtaXRUZXggPSAmZW1pdF90ZXgsCisJLkJlZ2luVGV4QmxvY2sgPSAmYmVnaW5fdGV4LAorCS5NYXhId1RlbXBzID0gUEZTX05VTV9URU1QX1JFR1MKK307CisKKy8qKgorICogRmluYWwgY29tcGlsYXRpb24gc3RlcDogVHVybiB0aGUgaW50ZXJtZWRpYXRlIHJhZGVvbl9wcm9ncmFtIGludG8KKyAqIG1hY2hpbmUtcmVhZGFibGUgaW5zdHJ1Y3Rpb25zLgorICovCitHTGJvb2xlYW4gcjMwMEZyYWdtZW50UHJvZ3JhbUVtaXQoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb21waWxlciAqY29tcGlsZXIpCit7CisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlICpjb2RlID0gY29tcGlsZXItPmNvZGU7CisKKwlfbWVzYV9iemVybyhjb2RlLCBzaXplb2Yoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlKSk7CisJY29kZS0+bm9kZVswXS5hbHVfZW5kID0gLTE7CisJY29kZS0+bm9kZVswXS50ZXhfZW5kID0gLTE7CisKKwlpZiAoIXJhZGVvblBhaXJQcm9ncmFtKGNvbXBpbGVyLT5yMzAwLT5yYWRlb24uZ2xDdHgsIGNvbXBpbGVyLT5wcm9ncmFtLCAmcGFpcl9oYW5kbGVyLCBjb21waWxlcikpCisJCXJldHVybiBHTF9GQUxTRTsKKworCWlmICghZmluaXNoX25vZGUoY29tcGlsZXIpKQorCQlyZXR1cm4gR0xfRkFMU0U7CisKKwlyZXR1cm4gR0xfVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nX3N3aXp6bGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9mcmFncHJvZ19zd2l6emxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2ZDJiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9mcmFncHJvZ19zd2l6emxlLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmljb2xhaSBIYWVobmxlLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qKgorICogQGZpbGUKKyAqIFV0aWxpdGllcyB0byBkZWFsIHdpdGggdGhlIHNvbWV3aGF0IG9kZCByZXN0cmljdGlvbiBvbiBSMzAwIGZyYWdtZW50CisgKiBwcm9ncmFtIHN3aXp6bGVzLgorICovCisKKyNpbmNsdWRlICJyMzAwX2ZyYWdwcm9nX3N3aXp6bGUuaCIKKworI2luY2x1ZGUgInIzMDBfcmVnLmgiCisjaW5jbHVkZSAicmFkZW9uX25xc3NhZGNlLmgiCisKKyNkZWZpbmUgTUFLRV9TV1ozKHgsIHksIHopIChNQUtFX1NXSVpaTEU0KFNXSVpaTEVfIyN4LCBTV0laWkxFXyMjeSwgU1dJWlpMRV8jI3osIFNXSVpaTEVfWkVSTykpCisKK3N0cnVjdCBzd2l6emxlX2RhdGEgeworCUdMdWludCBoYXNoOyAvKio8IHN3aXp6bGUgdmFsdWUgdGhpcyBtYXRjaGVzICovCisJR0x1aW50IGJhc2U7IC8qKjwgYmFzZSB2YWx1ZSBmb3IgaHcgc3dpenpsZSAqLworCUdMdWludCBzdHJpZGU7IC8qKjwgZGlmZmVyZW5jZSBpbiBiYXNlIGJldHdlZW4gYXJnMC8xLzIgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3dpenpsZV9kYXRhIG5hdGl2ZV9zd2l6emxlc1tdID0geworCXtNQUtFX1NXWjMoWCwgWSwgWiksIFIzMDBfQUxVX0FSR0NfU1JDMENfWFlaLCA0fSwKKwl7TUFLRV9TV1ozKFgsIFgsIFgpLCBSMzAwX0FMVV9BUkdDX1NSQzBDX1hYWCwgNH0sCisJe01BS0VfU1daMyhZLCBZLCBZKSwgUjMwMF9BTFVfQVJHQ19TUkMwQ19ZWVksIDR9LAorCXtNQUtFX1NXWjMoWiwgWiwgWiksIFIzMDBfQUxVX0FSR0NfU1JDMENfWlpaLCA0fSwKKwl7TUFLRV9TV1ozKFcsIFcsIFcpLCBSMzAwX0FMVV9BUkdDX1NSQzBBLCAxfSwKKwl7TUFLRV9TV1ozKFksIFosIFgpLCBSMzAwX0FMVV9BUkdDX1NSQzBDX1laWCwgMX0sCisJe01BS0VfU1daMyhaLCBYLCBZKSwgUjMwMF9BTFVfQVJHQ19TUkMwQ19aWFksIDF9LAorCXtNQUtFX1NXWjMoVywgWiwgWSksIFIzMDBfQUxVX0FSR0NfU1JDMENBX1daWSwgMX0sCisJe01BS0VfU1daMyhPTkUsIE9ORSwgT05FKSwgUjMwMF9BTFVfQVJHQ19PTkUsIDB9LAorCXtNQUtFX1NXWjMoWkVSTywgWkVSTywgWkVSTyksIFIzMDBfQUxVX0FSR0NfWkVSTywgMH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgbnVtX25hdGl2ZV9zd2l6emxlcyA9IHNpemVvZihuYXRpdmVfc3dpenpsZXMpL3NpemVvZihuYXRpdmVfc3dpenpsZXNbMF0pOworCisKKy8qKgorICogRmluZCBhIG5hdGl2ZSBSR0Igc3dpenpsZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHN3aXp6bGUuCisgKiBSZXR1cm5zIDAgaWYgbm9uZSBmb3VuZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzd2l6emxlX2RhdGEqIGxvb2t1cF9uYXRpdmVfc3dpenpsZShHTHVpbnQgc3dpenpsZSkKK3sKKwlpbnQgaSwgY29tcDsKKworCWZvcihpID0gMDsgaSA8IG51bV9uYXRpdmVfc3dpenpsZXM7ICsraSkgeworCQljb25zdCBzdHJ1Y3Qgc3dpenpsZV9kYXRhKiBzZCA9ICZuYXRpdmVfc3dpenpsZXNbaV07CisJCWZvcihjb21wID0gMDsgY29tcCA8IDM7ICsrY29tcCkgeworCQkJR0x1aW50IHN3eiA9IEdFVF9TV1ooc3dpenpsZSwgY29tcCk7CisJCQlpZiAoc3d6ID09IFNXSVpaTEVfTklMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN3eiAhPSBHRVRfU1daKHNkLT5oYXNoLCBjb21wKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoY29tcCA9PSAzKQorCQkJcmV0dXJuIHNkOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gc3VwcG9ydHMgdGhlIHN3aXp6bGUgYW5kIG5lZ2F0ZQorICogY29tYmluYXRpb25zIGluIHRoZSBnaXZlbiBzb3VyY2UgcmVnaXN0ZXIuCisgKi8KK0dMYm9vbGVhbiByMzAwRlBJc05hdGl2ZVN3aXp6bGUoR0x1aW50IG9wY29kZSwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHJlZykKK3sKKwlpZiAocmVnLkFicykKKwkJcmVnLk5lZ2F0ZUJhc2UgPSAwOworCisJaWYgKG9wY29kZSA9PSBPUENPREVfS0lMIHx8CisJICAgIG9wY29kZSA9PSBPUENPREVfVEVYIHx8CisJICAgIG9wY29kZSA9PSBPUENPREVfVFhCIHx8CisJICAgIG9wY29kZSA9PSBPUENPREVfVFhQKSB7CisJCWludCBqOworCisJCWlmIChyZWcuQWJzIHx8IHJlZy5OZWdhdGVCYXNlICE9ICgxNSpyZWcuTmVnYXRlQWJzKSkKKwkJCXJldHVybiBHTF9GQUxTRTsKKworCQlmb3IoaiA9IDA7IGogPCA0OyArK2opIHsKKwkJCUdMdWludCBzd3ogPSBHRVRfU1daKHJlZy5Td2l6emxlLCBqKTsKKwkJCWlmIChzd3ogPT0gU1dJWlpMRV9OSUwpCisJCQkJY29udGludWU7CisJCQlpZiAoc3d6ICE9IGopCisJCQkJcmV0dXJuIEdMX0ZBTFNFOworCQl9CisKKwkJcmV0dXJuIEdMX1RSVUU7CisJfQorCisJR0x1aW50IHJlbGV2YW50ID0gMDsKKwlpbnQgajsKKworCWZvcihqID0gMDsgaiA8IDM7ICsraikKKwkJaWYgKEdFVF9TV1oocmVnLlN3aXp6bGUsIGopICE9IFNXSVpaTEVfTklMKQorCQkJcmVsZXZhbnQgfD0gMSA8PCBqOworCisJaWYgKChyZWcuTmVnYXRlQmFzZSAmIHJlbGV2YW50KSAmJiAocmVnLk5lZ2F0ZUJhc2UgJiByZWxldmFudCkgIT0gcmVsZXZhbnQpCisJCXJldHVybiBHTF9GQUxTRTsKKworCWlmICghbG9va3VwX25hdGl2ZV9zd2l6emxlKHJlZy5Td2l6emxlKSkKKwkJcmV0dXJuIEdMX0ZBTFNFOworCisJcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSBNT1YgZHN0LCBzcmMgdXNpbmcgb25seSBuYXRpdmUgc3dpenpsZXMuCisgKi8KK3ZvaWQgcjMwMEZQQnVpbGRTd2l6emxlKHN0cnVjdCBucXNzYWRjZV9zdGF0ZSAqcywgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGRzdCwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYykKK3sKKwlpZiAoc3JjLkFicykKKwkJc3JjLk5lZ2F0ZUJhc2UgPSAwOworCisJd2hpbGUoZHN0LldyaXRlTWFzaykgeworCQljb25zdCBzdHJ1Y3Qgc3dpenpsZV9kYXRhICpiZXN0X3N3aXp6bGUgPSAwOworCQlHTHVpbnQgYmVzdF9tYXRjaGNvdW50ID0gMDsKKwkJR0x1aW50IGJlc3RfbWF0Y2htYXNrID0gMDsKKwkJR0xib29sZWFuIHJnYm5lZ2F0ZTsKKwkJaW50IGksIGNvbXA7CisKKwkJZm9yKGkgPSAwOyBpIDwgbnVtX25hdGl2ZV9zd2l6emxlczsgKytpKSB7CisJCQljb25zdCBzdHJ1Y3Qgc3dpenpsZV9kYXRhICpzZCA9ICZuYXRpdmVfc3dpenpsZXNbaV07CisJCQlHTHVpbnQgbWF0Y2hjb3VudCA9IDA7CisJCQlHTHVpbnQgbWF0Y2htYXNrID0gMDsKKwkJCWZvcihjb21wID0gMDsgY29tcCA8IDM7ICsrY29tcCkgeworCQkJCWlmICghR0VUX0JJVChkc3QuV3JpdGVNYXNrLCBjb21wKSkKKwkJCQkJY29udGludWU7CisJCQkJR0x1aW50IHN3eiA9IEdFVF9TV1ooc3JjLlN3aXp6bGUsIGNvbXApOworCQkJCWlmIChzd3ogPT0gU1dJWlpMRV9OSUwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChzd3ogPT0gR0VUX1NXWihzZC0+aGFzaCwgY29tcCkpIHsKKwkJCQkJbWF0Y2hjb3VudCsrOworCQkJCQltYXRjaG1hc2sgfD0gMSA8PCBjb21wOworCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaGNvdW50ID4gYmVzdF9tYXRjaGNvdW50KSB7CisJCQkJYmVzdF9zd2l6emxlID0gc2Q7CisJCQkJYmVzdF9tYXRjaGNvdW50ID0gbWF0Y2hjb3VudDsKKwkJCQliZXN0X21hdGNobWFzayA9IG1hdGNobWFzazsKKwkJCQlpZiAobWF0Y2htYXNrID09IChkc3QuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1hZWikpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKChzcmMuTmVnYXRlQmFzZSAmIGJlc3RfbWF0Y2htYXNrKSAhPSAwKSB7CisJCQliZXN0X21hdGNobWFzayAmPSBzcmMuTmVnYXRlQmFzZTsKKwkJCXJnYm5lZ2F0ZSA9ICFzcmMuTmVnYXRlQWJzOworCQl9IGVsc2UgeworCQkJcmdibmVnYXRlID0gc3JjLk5lZ2F0ZUFiczsKKwkJfQorCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0OworCisJCV9tZXNhX2luc2VydF9pbnN0cnVjdGlvbnMocy0+UHJvZ3JhbSwgcy0+SVAsIDEpOworCQlpbnN0ID0gcy0+UHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zICsgcy0+SVArKzsKKwkJaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkJaW5zdC0+RHN0UmVnID0gZHN0OworCQlpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICY9IChiZXN0X21hdGNobWFzayB8IFdSSVRFTUFTS19XKTsKKwkJaW5zdC0+U3JjUmVnWzBdID0gc3JjOworCQkvKiBOb3RlOiBXZSByZWx5IG9uIE5xU1NBL0RDRSB0byBzZXQgdW51c2VkIHN3aXp6bGUgY29tcG9uZW50cyB0byBOSUwgKi8KKworCQlkc3QuV3JpdGVNYXNrICY9IH5pbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworCX0KK30KKworCisvKioKKyAqIFRyYW5zbGF0ZSBhbiBSR0IgKFhZWikgc3dpenpsZSBpbnRvIHRoZSBoYXJkd2FyZSBjb2RlIGZvciB0aGUgZ2l2ZW4KKyAqIGluc3RydWN0aW9uIHNvdXJjZS4KKyAqLworR0x1aW50IHIzMDBGUFRyYW5zbGF0ZVJHQlN3aXp6bGUoR0x1aW50IHNyYywgR0x1aW50IHN3aXp6bGUpCit7CisJY29uc3Qgc3RydWN0IHN3aXp6bGVfZGF0YSogc2QgPSBsb29rdXBfbmF0aXZlX3N3aXp6bGUoc3dpenpsZSk7CisKKwlpZiAoIXNkKSB7CisJCV9tZXNhX3ByaW50ZigiTm90IGEgbmF0aXZlIHN3aXp6bGU6ICUwOHhcbiIsIHN3aXp6bGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc2QtPmJhc2UgKyBzcmMqc2QtPnN0cmlkZTsKK30KKworCisvKioKKyAqIFRyYW5zbGF0ZSBhbiBBbHBoYSAoVykgc3dpenpsZSBpbnRvIHRoZSBoYXJkd2FyZSBjb2RlIGZvciB0aGUgZ2l2ZW4KKyAqIGluc3RydWN0aW9uIHNvdXJjZS4KKyAqLworR0x1aW50IHIzMDBGUFRyYW5zbGF0ZUFscGhhU3dpenpsZShHTHVpbnQgc3JjLCBHTHVpbnQgc3dpenpsZSkKK3sKKwlpZiAoc3dpenpsZSA8IDMpCisJCXJldHVybiBzd2l6emxlICsgMypzcmM7CisKKwlzd2l0Y2goc3dpenpsZSkgeworCWNhc2UgU1dJWlpMRV9XOiByZXR1cm4gUjMwMF9BTFVfQVJHQV9TUkMwQSArIHNyYzsKKwljYXNlIFNXSVpaTEVfT05FOiByZXR1cm4gUjMwMF9BTFVfQVJHQV9PTkU7CisJY2FzZSBTV0laWkxFX1pFUk86IHJldHVybiBSMzAwX0FMVV9BUkdBX1pFUk87CisJZGVmYXVsdDogcmV0dXJuIFIzMDBfQUxVX0FSR0FfT05FOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL25vdXZlYXUvbm91dmVhdV9xdWVyeS5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nX3N3aXp6bGUuaApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcXVlcnkuaApyZW5hbWUgdG8gc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX2ZyYWdwcm9nX3N3aXp6bGUuaAppbmRleCAzZGVkNDE0Li4zZGE5OWE5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcXVlcnkuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfZnJhZ3Byb2dfc3dpenpsZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY29sYWkgSGFlaG5sZS4KICAqCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTI1LDE0ICsyNSwxOCBAQAogICoKICAqLwogCi0jaWZuZGVmIF9fTk9VVkVBVV9RVUVSWV9IX18KLSNkZWZpbmUgX19OT1VWRUFVX1FVRVJZX0hfXworI2lmbmRlZiBfX1IzMDBfRlJBR1BST0dfU1dJWlpMRV9IXworI2RlZmluZSBfX1IzMDBfRlJBR1BST0dfU1dJWlpMRV9IXwogCi10eXBlZGVmIHN0cnVjdCBub3V2ZWF1X3F1ZXJ5X29iamVjdF90IHsKLQlzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0IG1lc2E7CisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ19pbnN0cnVjdGlvbi5oIgogCi0JaW50IG5vdGlmaWVyX2lkOwotfSBub3V2ZWF1X3F1ZXJ5X29iamVjdDsKK3N0cnVjdCBucXNzYWRjZV9zdGF0ZTsKIAotZXh0ZXJuIHZvaWQgbm91dmVhdVF1ZXJ5SW5pdEZ1bmNzKEdMY29udGV4dCAqY3R4KTsKLSNlbmRpZgorR0xib29sZWFuIHIzMDBGUElzTmF0aXZlU3dpenpsZShHTHVpbnQgb3Bjb2RlLCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgcmVnKTsKK3ZvaWQgcjMwMEZQQnVpbGRTd2l6emxlKHN0cnVjdCBucXNzYWRjZV9zdGF0ZSosIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3QsIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMpOworCitHTHVpbnQgcjMwMEZQVHJhbnNsYXRlUkdCU3dpenpsZShHTHVpbnQgc3JjLCBHTHVpbnQgc3dpenpsZSk7CitHTHVpbnQgcjMwMEZQVHJhbnNsYXRlQWxwaGFTd2l6emxlKEdMdWludCBzcmMsIEdMdWludCBzd2l6emxlKTsKKworI2VuZGlmIC8qIF9fUjMwMF9GUkFHUFJPR19TV0laWkxFX0hfICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfaW9jdGwuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9pb2N0bC5jCmluZGV4IDkwZjUwMjcuLmJkN2YwNjAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9pb2N0bC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9pb2N0bC5jCkBAIC01MSw5ICs1MSwxMCBAQAogI2luY2x1ZGUgInIzMDBfaW9jdGwuaCIKICNpbmNsdWRlICJyMzAwX2NtZGJ1Zi5oIgogI2luY2x1ZGUgInIzMDBfc3RhdGUuaCIKLSNpbmNsdWRlICJyMzAwX3Byb2dyYW0uaCIKKyNpbmNsdWRlICJyMzAwX3ZlcnRwcm9nLmgiCiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInIzMDBfZW1pdC5oIgorI2luY2x1ZGUgInIzMDBfZnJhZ3Byb2cuaCIKIAogI2luY2x1ZGUgInZibGFuay5oIgogCkBAIC0xMDYsMTkgKzEwNywxOSBAQAogCWUzMihjYnBpdGNoKTsKIAogCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgY21rKTsKLQlyZWdfc3RhcnQoUjMwMF9SQjNEX0NPTE9STUFTSywgMCk7CisJcmVnX3N0YXJ0KFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLLCAwKTsKIAogCWlmIChmbGFncyAmIENMRUFSQlVGRkVSX0NPTE9SKSB7Ci0JCWUzMigoY3R4LT5Db2xvci5Db2xvck1hc2tbQkNPTVBdID8gUjMwMF9DT0xPUk1BU0swX0IgOiAwKSB8Ci0JCSAgICAoY3R4LT5Db2xvci5Db2xvck1hc2tbR0NPTVBdID8gUjMwMF9DT0xPUk1BU0swX0cgOiAwKSB8Ci0JCSAgICAoY3R4LT5Db2xvci5Db2xvck1hc2tbUkNPTVBdID8gUjMwMF9DT0xPUk1BU0swX1IgOiAwKSB8Ci0JCSAgICAoY3R4LT5Db2xvci5Db2xvck1hc2tbQUNPTVBdID8gUjMwMF9DT0xPUk1BU0swX0EgOiAwKSk7CisJCWUzMigoY3R4LT5Db2xvci5Db2xvck1hc2tbQkNPTVBdID8gUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfQkxVRV9NQVNLMCA6IDApIHwKKwkJICAgIChjdHgtPkNvbG9yLkNvbG9yTWFza1tHQ09NUF0gPyBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19HUkVFTl9NQVNLMCA6IDApIHwKKwkJICAgIChjdHgtPkNvbG9yLkNvbG9yTWFza1tSQ09NUF0gPyBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19SRURfTUFTSzAgOiAwKSB8CisJCSAgICAoY3R4LT5Db2xvci5Db2xvck1hc2tbQUNPTVBdID8gUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfQUxQSEFfTUFTSzAgOiAwKSk7CiAJfSBlbHNlIHsKIAkJZTMyKDB4MCk7CiAJfQogCiAJUjMwMF9TVEFURUNIQU5HRShyMzAwLCB6cyk7Ci0JcmVnX3N0YXJ0KFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzAsIDIpOworCXJlZ19zdGFydChSMzAwX1pCX0NOVEwsIDIpOwogCiAJewogCQl1aW50MzJfdCB0MSwgdDI7CkBAIC0xMjcsMzcgKzEyOCwyOCBAQAogCQl0MiA9IDB4MDsKIAogCQlpZiAoZmxhZ3MgJiBDTEVBUkJVRkZFUl9ERVBUSCkgewotCQkJdDEgfD0gUjMwMF9SQjNEX1pfV1JJVEVfT05MWTsKKwkJCXQxIHw9IFIzMDBfWl9FTkFCTEUgfCBSMzAwX1pfV1JJVEVfRU5BQkxFOwogCQkJdDIgfD0KLQkJCSAgICAoUjMwMF9aU19BTFdBWVMgPDwgUjMwMF9SQjNEX1pTMV9ERVBUSF9GVU5DX1NISUZUKTsKLQkJfSBlbHNlIHsKLQkJCXQxIHw9IFIzMDBfUkIzRF9aX0RJU0FCTEVEXzE7CS8vIGRpc2FibGUKKwkJCSAgICAoUjMwMF9aU19BTFdBWVMgPDwgUjMwMF9aX0ZVTkNfU0hJRlQpOwogCQl9CiAKIAkJaWYgKGZsYWdzICYgQ0xFQVJCVUZGRVJfU1RFTkNJTCkgewotCQkJdDEgfD0gUjMwMF9SQjNEX1NURU5DSUxfRU5BQkxFOworCQkJdDEgfD0gUjMwMF9TVEVOQ0lMX0VOQUJMRTsKIAkJCXQyIHw9CiAJCQkgICAgKFIzMDBfWlNfQUxXQVlTIDw8Ci0JCQkgICAgIFIzMDBfUkIzRF9aUzFfRlJPTlRfRlVOQ19TSElGVCkgfAorCQkJICAgICBSMzAwX1NfRlJPTlRfRlVOQ19TSElGVCkgfAogCQkJICAgIChSMzAwX1pTX1JFUExBQ0UgPDwKLQkJCSAgICAgUjMwMF9SQjNEX1pTMV9GUk9OVF9GQUlMX09QX1NISUZUKSB8CisJCQkgICAgIFIzMDBfU19GUk9OVF9TRkFJTF9PUF9TSElGVCkgfAogCQkJICAgIChSMzAwX1pTX1JFUExBQ0UgPDwKLQkJCSAgICAgUjMwMF9SQjNEX1pTMV9GUk9OVF9aUEFTU19PUF9TSElGVCkgfAorCQkJICAgICBSMzAwX1NfRlJPTlRfWlBBU1NfT1BfU0hJRlQpIHwKIAkJCSAgICAoUjMwMF9aU19SRVBMQUNFIDw8Ci0JCQkgICAgIFIzMDBfUkIzRF9aUzFfRlJPTlRfWkZBSUxfT1BfU0hJRlQpIHwKLQkJCSAgICAoUjMwMF9aU19BTFdBWVMgPDwKLQkJCSAgICAgUjMwMF9SQjNEX1pTMV9CQUNLX0ZVTkNfU0hJRlQpIHwKLQkJCSAgICAoUjMwMF9aU19SRVBMQUNFIDw8Ci0JCQkgICAgIFIzMDBfUkIzRF9aUzFfQkFDS19GQUlMX09QX1NISUZUKSB8Ci0JCQkgICAgKFIzMDBfWlNfUkVQTEFDRSA8PAotCQkJICAgICBSMzAwX1JCM0RfWlMxX0JBQ0tfWlBBU1NfT1BfU0hJRlQpIHwKLQkJCSAgICAoUjMwMF9aU19SRVBMQUNFIDw8Ci0JCQkgICAgIFIzMDBfUkIzRF9aUzFfQkFDS19aRkFJTF9PUF9TSElGVCk7CisJCQkgICAgIFIzMDBfU19GUk9OVF9aRkFJTF9PUF9TSElGVCk7CiAJCX0KIAogCQllMzIodDEpOwogCQllMzIodDIpOwotCQllMzIocjMwMC0+c3RhdGUuc3RlbmNpbC5jbGVhcik7CisJCWUzMigoKGN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMF0gJiBSMzAwX1NURU5DSUxSRUZfTUFTSykgPDwgUjMwMF9TVEVOQ0lMV1JJVEVNQVNLX1NISUZUKSB8CisJCSAgICAoY3R4LT5TdGVuY2lsLkNsZWFyICYgUjMwMF9TVEVOQ0lMUkVGX01BU0spKTsKIAl9CiAKIAljbWQyID0gKGRybV9yMzAwX2NtZF9oZWFkZXJfdCAqKSByMzAwQWxsb2NDbWRCdWYocjMwMCwgOSwgX19GVU5DVElPTl9fKTsKQEAgLTE4NiwxMCArMTc4LDE2IEBACiAJaW50IGNtZF93cml0dGVuID0gMDsKIAlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCAqY21kID0gTlVMTDsKIAlpbnQgaGFzX3RjbCA9IDE7CisJaW50IGlzX3I1MDAgPSAwOworCUdMdWludCB2YXBfY250bDsKIAogCWlmICghKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmxhZ3MgJiBSQURFT05fQ0hJUFNFVF9UQ0wpKQogCQloYXNfdGNsID0gMDsKIAorICAgICAgICBpZiAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPj0gQ0hJUF9GQU1JTFlfUlY1MTUpCisgICAgICAgICAgICAgICAgaXNfcjUwMCA9IDE7CisKKwogCS8qIEZJWE1FOiB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8wIGFuZAogCSAqIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMSBhcmUgaW4gZmFjdCBrbm93biwgaG93ZXZlciwgdGhlIHZhbHVlcyBhcmUKIAkgKiBxdWl0ZSBjb21wbGV4OyBzZWUgdGhlIGZ1bmN0aW9ucyBpbiByMzAwX2VtaXQuYy4KQEAgLTE5OSwyNSArMTk3LDM4IEBACiAJICogdGhlc2UgcmVnaXN0ZXJzLCBhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgZm9yIHJlbmRlcmluZy4KIAkgKi8KIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHZpclswXSk7Ci0JcmVnX3N0YXJ0KFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCwgMCk7CisJcmVnX3N0YXJ0KFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfMCwgMCk7CiAJaWYgKCFoYXNfdGNsKQotCQllMzIoMHgyMjAzMDAwMyk7CisJICAgIGUzMigoKCgoMCA8PCBSMzAwX0RTVF9WRUNfTE9DX1NISUZUKSB8IFIzMDBfREFUQV9UWVBFX0ZMT0FUXzQpIDw8IFIzMDBfREFUQV9UWVBFXzBfU0hJRlQpIHwKKwkJICgoUjMwMF9MQVNUX1ZFQyB8ICgyIDw8IFIzMDBfRFNUX1ZFQ19MT0NfU0hJRlQpIHwgUjMwMF9EQVRBX1RZUEVfRkxPQVRfNCkgPDwgUjMwMF9EQVRBX1RZUEVfMV9TSElGVCkpKTsKIAllbHNlCi0JCWUzMigweDIxMDMwMDAzKTsKKwkgICAgZTMyKCgoKCgwIDw8IFIzMDBfRFNUX1ZFQ19MT0NfU0hJRlQpIHwgUjMwMF9EQVRBX1RZUEVfRkxPQVRfNCkgPDwgUjMwMF9EQVRBX1RZUEVfMF9TSElGVCkgfAorCQkgKChSMzAwX0xBU1RfVkVDIHwgKDEgPDwgUjMwMF9EU1RfVkVDX0xPQ19TSElGVCkgfCBSMzAwX0RBVEFfVFlQRV9GTE9BVF80KSA8PCBSMzAwX0RBVEFfVFlQRV8xX1NISUZUKSkpOwogCiAJLyogZGlzYWJsZSBmb2cgKi8KIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZvZ3MpOwotCXJlZ19zdGFydChSMzAwX1JFX0ZPR19TVEFURSwgMCk7CisJcmVnX3N0YXJ0KFIzMDBfRkdfRk9HX0JMRU5ELCAwKTsKIAllMzIoMHgwKTsKIAogCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgdmlyWzFdKTsKLQlyZWdfc3RhcnQoUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wLCAwKTsKLQllMzIoMHhGNjg4RjY4OCk7CisJcmVnX3N0YXJ0KFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfRVhUXzAsIDApOworCWUzMigoKCgoUjMwMF9TV0laWkxFX1NFTEVDVF9YIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfWF9TSElGVCkgfAorCSAgICAgICAoUjMwMF9TV0laWkxFX1NFTEVDVF9ZIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfWV9TSElGVCkgfAorCSAgICAgICAoUjMwMF9TV0laWkxFX1NFTEVDVF9aIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfWl9TSElGVCkgfAorCSAgICAgICAoUjMwMF9TV0laWkxFX1NFTEVDVF9XIDw8IFIzMDBfU1dJWlpMRV9TRUxFQ1RfV19TSElGVCkgfAorCSAgICAgICAoKFIzMDBfV1JJVEVfRU5BX1ggfCBSMzAwX1dSSVRFX0VOQV9ZIHwgUjMwMF9XUklURV9FTkFfWiB8IFIzMDBfV1JJVEVfRU5BX1cpIDw8IFIzMDBfV1JJVEVfRU5BX1NISUZUKSkKKwkgICAgICA8PCBSMzAwX1NXSVpaTEUwX1NISUZUKSB8CisJICAgICAoKChSMzAwX1NXSVpaTEVfU0VMRUNUX1ggPDwgUjMwMF9TV0laWkxFX1NFTEVDVF9YX1NISUZUKSB8CisJICAgICAgIChSMzAwX1NXSVpaTEVfU0VMRUNUX1kgPDwgUjMwMF9TV0laWkxFX1NFTEVDVF9ZX1NISUZUKSB8CisJICAgICAgIChSMzAwX1NXSVpaTEVfU0VMRUNUX1ogPDwgUjMwMF9TV0laWkxFX1NFTEVDVF9aX1NISUZUKSB8CisJICAgICAgIChSMzAwX1NXSVpaTEVfU0VMRUNUX1cgPDwgUjMwMF9TV0laWkxFX1NFTEVDVF9XX1NISUZUKSB8CisJICAgICAgICgoUjMwMF9XUklURV9FTkFfWCB8IFIzMDBfV1JJVEVfRU5BX1kgfCBSMzAwX1dSSVRFX0VOQV9aIHwgUjMwMF9XUklURV9FTkFfVykgPDwgUjMwMF9XUklURV9FTkFfU0hJRlQpKQorCSAgICAgIDw8IFIzMDBfU1dJWlpMRTFfU0hJRlQpKSk7CiAKIAkvKiBSMzAwX1ZBUF9JTlBVVF9DTlRMXzAsIFIzMDBfVkFQX0lOUFVUX0NOVExfMSAqLwogCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgdmljKTsKLQlyZWdfc3RhcnQoUjMwMF9WQVBfSU5QVVRfQ05UTF8wLCAxKTsKLQllMzIoUjMwMF9JTlBVVF9DTlRMXzBfQ09MT1IpOworCXJlZ19zdGFydChSMzAwX1ZBUF9WVFhfU1RBVEVfQ05UTCwgMSk7CisJZTMyKChSMzAwX1NFTF9VU0VSX0NPTE9SXzAgPDwgUjMwMF9DT0xPUl8wX0FTU0VNQkxZX1NISUZUKSk7CiAJZTMyKFIzMDBfSU5QVVRfQ05UTF9QT1MgfCBSMzAwX0lOUFVUX0NOVExfQ09MT1IgfCBSMzAwX0lOUFVUX0NOVExfVEMwKTsKIAogCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgdnRlKTsKQEAgLTIyOSwxMyArMjQwLDEzIEBACiAJICAgIFIzMDBfVlBPUlRfWl9PRkZTRVRfRU5BKTsKIAllMzIoMHg4KTsKIAotCXJlZ19zdGFydCgweDIxZGMsIDApOworCXJlZ19zdGFydChSMzAwX1ZBUF9QU0NfU0dOX05PUk1fQ05UTCwgMCk7CiAJZTMyKDB4YWFhYWFhYWEpOwogCiAJUjMwMF9TVEFURUNIQU5HRShyMzAwLCB2b2YpOwogCXJlZ19zdGFydChSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wLCAxKTsKIAllMzIoUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUE9TX1BSRVNFTlQgfAotCSAgICBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UKTsKKwkgICAgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMF9QUkVTRU5UKTsKIAllMzIoMHgwKTsJCS8qIG5vIHRleHR1cmVzICovCiAKIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHR4ZSk7CkBAIC0yNTIsNyArMjYzLDcgQEAKIAllZmxvYXQoMC4wKTsKIAogCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgYXQpOwotCXJlZ19zdGFydChSMzAwX1BQX0FMUEhBX1RFU1QsIDApOworCXJlZ19zdGFydChSMzAwX0ZHX0FMUEhBX0ZVTkMsIDApOwogCWUzMigweDApOwogCiAJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBibGQpOwpAQCAtMjYwLDc4ICsyNzEsMTkyIEBACiAJZTMyKDB4MCk7CiAJZTMyKDB4MCk7CiAKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHVuazIyMUMpOwotCXJlZ19zdGFydChSMzAwX1ZBUF9VTktOT1dOXzIyMUMsIDApOwotCWUzMihSMzAwXzIyMUNfQ0xFQVIpOworCWlmIChoYXNfdGNsKSB7CisJICAgIFIzMDBfU1RBVEVDSEFOR0UocjMwMCwgdmFwX2NsaXBfY250bCk7CisJICAgIHJlZ19zdGFydChSMzAwX1ZBUF9DTElQX0NOVEwsIDApOworCSAgICBlMzIoUjMwMF9QU19VQ1BfTU9ERV9DTElQX0FTX1RSSUZBTiB8IFIzMDBfQ0xJUF9ESVNBQkxFKTsKKyAgICAgICAgfQogCiAJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBwcyk7Ci0JcmVnX3N0YXJ0KFIzMDBfUkVfUE9JTlRTSVpFLCAwKTsKKwlyZWdfc3RhcnQoUjMwMF9HQV9QT0lOVF9TSVpFLCAwKTsKIAllMzIoKChkUHJpdi0+dyAqIDYpIDw8IFIzMDBfUE9JTlRTSVpFX1hfU0hJRlQpIHwKIAkgICAgKChkUHJpdi0+aCAqIDYpIDw8IFIzMDBfUE9JTlRTSVpFX1lfU0hJRlQpKTsKIAotCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcmkpOwotCXJlZ19zdGFydChSMzAwX1JTX0lOVEVSUF8wLCA4KTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0JCWUzMihSMzAwX1JTX0lOVEVSUF9VU0VEKTsKKwlpZiAoIWlzX3I1MDApIHsKKwkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCByaSk7CisJCXJlZ19zdGFydChSMzAwX1JTX0lQXzAsIDcpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCQllMzIoUjMwMF9SU19TRUxfVCgxKSB8IFIzMDBfUlNfU0VMX1IoMikgfCBSMzAwX1JTX1NFTF9RKDMpKTsKKwkJfQorCisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcmMpOworCQkvKiBUaGUgc2Vjb25kIGNvbnN0YW50IGlzIG5lZWRlZCB0byBnZXQgZ2x4Z2VhcnMgZGlzcGxheSBhbnl0aGluZyAuLiAqLworCQlyZWdfc3RhcnQoUjMwMF9SU19DT1VOVCwgMSk7CisJCWUzMigoMSA8PCBSMzAwX0lDX0NPVU5UX1NISUZUKSB8IFIzMDBfSElSRVNfRU4pOworCQllMzIoMHgwKTsKKworCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHJyKTsKKwkJcmVnX3N0YXJ0KFIzMDBfUlNfSU5TVF8wLCAwKTsKKwkJZTMyKFIzMDBfUlNfSU5TVF9DT0xfQ05fV1JJVEUpOworCX0gZWxzZSB7CisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcmkpOworCQlyZWdfc3RhcnQoUjUwMF9SU19JUF8wLCA3KTsKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQkJZTMyKChSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfU19TSElGVCkgfAorCQkJICAgIChSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfVF9TSElGVCkgfAorCQkJICAgIChSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUl9TSElGVCkgfAorCQkJICAgIChSNTAwX1JTX0lQX1BUUl9LMSA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUV9TSElGVCkpOworCQl9CisKKwkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCByYyk7CisJCS8qIFRoZSBzZWNvbmQgY29uc3RhbnQgaXMgbmVlZGVkIHRvIGdldCBnbHhnZWFycyBkaXNwbGF5IGFueXRoaW5nIC4uICovCisJCXJlZ19zdGFydChSMzAwX1JTX0NPVU5ULCAxKTsKKwkJZTMyKCgxIDw8IFIzMDBfSUNfQ09VTlRfU0hJRlQpIHwgUjMwMF9ISVJFU19FTik7CisJCWUzMigweDApOworCisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcnIpOworCQlyZWdfc3RhcnQoUjUwMF9SU19JTlNUXzAsIDApOworCQllMzIoUjUwMF9SU19JTlNUX0NPTF9DTl9XUklURSk7CisKIAl9CiAKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHJjKTsKLQkvKiBUaGUgc2Vjb25kIGNvbnN0YW50IGlzIG5lZWRlZCB0byBnZXQgZ2x4Z2VhcnMgZGlzcGxheSBhbnl0aGluZyAuLiAqLwotCXJlZ19zdGFydChSMzAwX1JTX0NOVExfMCwgMSk7Ci0JZTMyKCgxIDw8IFIzMDBfUlNfQ05UTF9DSV9DTlRfU0hJRlQpIHwgUjMwMF9SU19DTlRMXzBfVU5LTk9XTl8xOCk7Ci0JZTMyKDB4MCk7CisJaWYgKCFpc19yNTAwKSB7CisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZnApOworCQlyZWdfc3RhcnQoUjMwMF9VU19DT05GSUcsIDIpOworCQllMzIoMHgwKTsKKwkJZTMyKDB4MCk7CisJCWUzMigweDApOworCQlyZWdfc3RhcnQoUjMwMF9VU19DT0RFX0FERFJfMCwgMyk7CisJCWUzMigweDApOworCQllMzIoMHgwKTsKKwkJZTMyKDB4MCk7CisJCWUzMihSMzAwX1JHQkFfT1VUKTsKIAotCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcnIpOwotCXJlZ19zdGFydChSMzAwX1JTX1JPVVRFXzAsIDApOwotCWUzMihSMzAwX1JTX1JPVVRFXzBfQ09MT1IpOworCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwaVswXSk7CisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZnBpWzFdKTsKKwkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBmcGlbMl0pOworCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwaVszXSk7CiAKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwKTsKLQlyZWdfc3RhcnQoUjMwMF9QRlNfQ05UTF8wLCAyKTsKLQllMzIoMHgwKTsKLQllMzIoMHgwKTsKLQllMzIoMHgwKTsKLQlyZWdfc3RhcnQoUjMwMF9QRlNfTk9ERV8wLCAzKTsKLQllMzIoMHgwKTsKLQllMzIoMHgwKTsKLQllMzIoMHgwKTsKLQllMzIoUjMwMF9QRlNfTk9ERV9PVVRQVVRfQ09MT1IpOworCQlyZWdfc3RhcnQoUjMwMF9VU19BTFVfUkdCX0lOU1RfMCwgMCk7CisJCWUzMihGUF9JTlNUUkMoTUFELCBGUF9BUkdDKFNSQzBDX1hZWiksIEZQX0FSR0MoT05FKSwgRlBfQVJHQyhaRVJPKSkpOwogCi0JUjMwMF9TVEFURUNIQU5HRShyMzAwLCBmcGlbMF0pOwotCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZnBpWzFdKTsKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwaVsyXSk7Ci0JUjMwMF9TVEFURUNIQU5HRShyMzAwLCBmcGlbM10pOworCQlyZWdfc3RhcnQoUjMwMF9VU19BTFVfUkdCX0FERFJfMCwgMCk7CisJCWUzMihGUF9TRUxDKDAsIE5PLCBYWVosIEZQX1RNUCgwKSwgMCwgMCkpOwogCi0JcmVnX3N0YXJ0KFIzMDBfUEZTX0lOU1RSMF8wLCAwKTsKLQllMzIoRlBfSU5TVFJDKE1BRCwgRlBfQVJHQyhTUkMwQ19YWVopLCBGUF9BUkdDKE9ORSksIEZQX0FSR0MoWkVSTykpKTsKKwkJcmVnX3N0YXJ0KFIzMDBfVVNfQUxVX0FMUEhBX0lOU1RfMCwgMCk7CisJCWUzMihGUF9JTlNUUkEoTUFELCBGUF9BUkdBKFNSQzBBKSwgRlBfQVJHQShPTkUpLCBGUF9BUkdBKFpFUk8pKSk7CiAKLQlyZWdfc3RhcnQoUjMwMF9QRlNfSU5TVFIxXzAsIDApOwotCWUzMihGUF9TRUxDKDAsIE5PLCBYWVosIEZQX1RNUCgwKSwgMCwgMCkpOworCQlyZWdfc3RhcnQoUjMwMF9VU19BTFVfQUxQSEFfQUREUl8wLCAwKTsKKwkJZTMyKEZQX1NFTEEoMCwgTk8sIFcsIEZQX1RNUCgwKSwgMCwgMCkpOworCX0gZWxzZSB7CisgCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwKTsKKyAJCXJlZ19zdGFydChSNTAwX1VTX0NPTkZJRywgMSk7CisgCQllMzIoUjUwMF9aRVJPX1RJTUVTX0FOWVRISU5HX0VRVUFMU19aRVJPKTsKKyAJCWUzMigweDApOworIAkJcmVnX3N0YXJ0KFI1MDBfVVNfQ09ERV9BRERSLCAyKTsKKyAJCWUzMihSNTAwX1VTX0NPREVfU1RBUlRfQUREUigwKSB8IFI1MDBfVVNfQ09ERV9FTkRfQUREUigxKSk7CisgCQllMzIoUjUwMF9VU19DT0RFX1JBTkdFX0FERFIoMCkgfCBSNTAwX1VTX0NPREVfUkFOR0VfU0laRSgxKSk7CisgCQllMzIoUjUwMF9VU19DT0RFX09GRlNFVF9BRERSKDApKTsKIAotCXJlZ19zdGFydChSMzAwX1BGU19JTlNUUjJfMCwgMCk7Ci0JZTMyKEZQX0lOU1RSQShNQUQsIEZQX0FSR0EoU1JDMEEpLCBGUF9BUkdBKE9ORSksIEZQX0FSR0EoWkVSTykpKTsKKwkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCByNTAwZnApOworCQlyNTAwZnBfc3RhcnRfZnJhZ21lbnQoMCwgNik7CiAKLQlyZWdfc3RhcnQoUjMwMF9QRlNfSU5TVFIzXzAsIDApOwotCWUzMihGUF9TRUxBKDAsIE5PLCBXLCBGUF9UTVAoMCksIDAsIDApKTsKKwkJZTMyKFI1MDBfSU5TVF9UWVBFX09VVCB8CisJCSAgICBSNTAwX0lOU1RfVEVYX1NFTV9XQUlUIHwKKwkJICAgIFI1MDBfSU5TVF9MQVNUIHwKKwkJICAgIFI1MDBfSU5TVF9SR0JfT01BU0tfUiB8CisJCSAgICBSNTAwX0lOU1RfUkdCX09NQVNLX0cgfAorCQkgICAgUjUwMF9JTlNUX1JHQl9PTUFTS19CIHwKKwkJICAgIFI1MDBfSU5TVF9BTFBIQV9PTUFTSyB8CisJCSAgICBSNTAwX0lOU1RfUkdCX0NMQU1QIHwKKwkJICAgIFI1MDBfSU5TVF9BTFBIQV9DTEFNUCk7CisKKwkJZTMyKFI1MDBfUkdCX0FERFIwKDApIHwKKwkJICAgIFI1MDBfUkdCX0FERFIxKDApIHwKKwkJICAgIFI1MDBfUkdCX0FERFIxX0NPTlNUIHwKKwkJICAgIFI1MDBfUkdCX0FERFIyKDApIHwKKwkJICAgIFI1MDBfUkdCX0FERFIyX0NPTlNUKTsKKworCQllMzIoUjUwMF9BTFBIQV9BRERSMCgwKSB8CisJCSAgICBSNTAwX0FMUEhBX0FERFIxKDApIHwKKwkJICAgIFI1MDBfQUxQSEFfQUREUjFfQ09OU1QgfAorCQkgICAgUjUwMF9BTFBIQV9BRERSMigwKSB8CisJCSAgICBSNTAwX0FMUEhBX0FERFIyX0NPTlNUKTsKKworCQllMzIoUjUwMF9BTFVfUkdCX1NFTF9BX1NSQzAgfAorCQkgICAgUjUwMF9BTFVfUkdCX1JfU1dJWl9BX1IgfAorCQkgICAgUjUwMF9BTFVfUkdCX0dfU1dJWl9BX0cgfAorCQkgICAgUjUwMF9BTFVfUkdCX0JfU1dJWl9BX0IgfAorCQkgICAgUjUwMF9BTFVfUkdCX1NFTF9CX1NSQzAgfAorCQkgICAgUjUwMF9BTFVfUkdCX1JfU1dJWl9CX1IgfAorCQkgICAgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX0cgfAorCQkgICAgUjUwMF9BTFVfUkdCX0dfU1dJWl9CX0IpOworCisJCWUzMihSNTAwX0FMUEhBX09QX0NNUCB8CisJCSAgICBSNTAwX0FMUEhBX1NXSVpfQV9BIHwKKwkJICAgIFI1MDBfQUxQSEFfU1dJWl9CX0EpOworCisJCWUzMihSNTAwX0FMVV9SR0JBX09QX0NNUCB8CisJCSAgICBSNTAwX0FMVV9SR0JBX1JfU1dJWl8wIHwKKwkJICAgIFI1MDBfQUxVX1JHQkFfR19TV0laXzAgfAorCQkgICAgUjUwMF9BTFVfUkdCQV9CX1NXSVpfMCB8CisJCSAgICBSNTAwX0FMVV9SR0JBX0FfU1dJWl8wKTsKKwl9CisKKwlyZWdfc3RhcnQoUjMwMF9WQVBfUFZTX1NUQVRFX0ZMVVNIX1JFRywgMCk7CisJZTMyKDB4MDAwMDAwMDApOworCWlmIChoYXNfdGNsKSB7CisJICAgIHZhcF9jbnRsID0gKCgxMCA8PCBSMzAwX1BWU19OVU1fU0xPVFNfU0hJRlQpIHwKKwkJCSg1IDw8IFIzMDBfUFZTX05VTV9DTlRMUlNfU0hJRlQpIHwKKwkJCSgxMiA8PCBSMzAwX1ZGX01BWF9WVFhfTlVNX1NISUZUKSk7CisJICAgIGlmIChyMzAwLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkKKwkJdmFwX2NudGwgfD0gUjUwMF9UQ0xfU1RBVEVfT1BUSU1JWkFUSU9OOworCX0gZWxzZQorCSAgICB2YXBfY250bCA9ICgoMTAgPDwgUjMwMF9QVlNfTlVNX1NMT1RTX1NISUZUKSB8CisJCQkoNSA8PCBSMzAwX1BWU19OVU1fQ05UTFJTX1NISUZUKSB8CisJCQkoNSA8PCBSMzAwX1ZGX01BWF9WVFhfTlVNX1NISUZUKSk7CisKKwlpZiAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1MTUpCisJICAgIHZhcF9jbnRsIHw9ICgyIDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKwllbHNlIGlmICgocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1MzApIHx8CisJCSAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1NjApIHx8CisJCSAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1NzApKQorCSAgICB2YXBfY250bCB8PSAoNSA8PCBSMzAwX1BWU19OVU1fRlBVU19TSElGVCk7CisJZWxzZSBpZiAoKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1JWNDEwKSB8fAorCQkgKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1I0MjApKQorCSAgICB2YXBfY250bCB8PSAoNiA8PCBSMzAwX1BWU19OVU1fRlBVU19TSElGVCk7CisJZWxzZSBpZiAoKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1I1MjApIHx8CisJCSAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjU4MCkpCisJICAgIHZhcF9jbnRsIHw9ICg4IDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKwllbHNlCisJICAgIHZhcF9jbnRsIHw9ICg0IDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKworCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIHZhcF9jbnRsKTsKKwlyZWdfc3RhcnQoUjMwMF9WQVBfQ05UTCwgMCk7CisJZTMyKHZhcF9jbnRsKTsKIAogCWlmIChoYXNfdGNsKSB7CiAJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcHZzKTsKLQkJcmVnX3N0YXJ0KFIzMDBfVkFQX1BWU19DTlRMXzEsIDIpOwotCQllMzIoKDAgPDwgUjMwMF9QVlNfQ05UTF8xX1BST0dSQU1fU1RBUlRfU0hJRlQpIHwKLQkJICAgICgwIDw8IFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUKSB8Ci0JCSAgICAoMSA8PCBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9FTkRfU0hJRlQpKTsKLQkJZTMyKDB4MCk7Ci0JCWUzMigxIDw8IFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV05fU0hJRlQpOworCQlyZWdfc3RhcnQoUjMwMF9WQVBfUFZTX0NPREVfQ05UTF8wLCAyKTsKKworCQllMzIoKDAgPDwgUjMwMF9QVlNfRklSU1RfSU5TVF9TSElGVCkgfAorCQkgICAgKDAgPDwgUjMwMF9QVlNfWFlaV19WQUxJRF9JTlNUX1NISUZUKSB8CisJCSAgICAoMSA8PCBSMzAwX1BWU19MQVNUX0lOU1RfU0hJRlQpKTsKKwkJZTMyKCgwIDw8IFIzMDBfUFZTX0NPTlNUX0JBU0VfT0ZGU0VUX1NISUZUKSB8CisJCSAgICAoMCA8PCBSMzAwX1BWU19NQVhfQ09OU1RfQUREUl9TSElGVCkpOworCQllMzIoMSA8PCBSMzAwX1BWU19MQVNUX1ZUWF9TUkNfSU5TVF9TSElGVCk7CiAKIAkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCB2cGkpOwogCQl2c2Zfc3RhcnRfZnJhZ21lbnQoMHgwLCA4KTsKLQkJZTMyKFZQX09VVChBREQsIE9VVCwgMCwgWFlaVykpOwotCQllMzIoVlBfSU4oSU4sIDApKTsKLQkJZTMyKFZQX1pFUk8oKSk7CisKKwkJZTMyKFBWU19PUF9EU1RfT1BFUkFORChWRV9BREQsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgMCwgMHhmLCBQVlNfRFNUX1JFR19PVVQpKTsKKwkJZTMyKFBWU19TUkNfT1BFUkFORCgwLCBQVlNfU1JDX1NFTEVDVF9YLCBQVlNfU1JDX1NFTEVDVF9ZLCBQVlNfU1JDX1NFTEVDVF9aLCBQVlNfU1JDX1NFTEVDVF9XLCBQVlNfU1JDX1JFR19JTlBVVCwgVlNGX0ZMQUdfTk9ORSkpOworCQllMzIoUFZTX1NSQ19PUEVSQU5EKDAsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzAsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzAsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzAsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzAsIFBWU19TUkNfUkVHX0lOUFVULCBWU0ZfRkxBR19OT05FKSk7CiAJCWUzMigweDApOwogCi0JCWUzMihWUF9PVVQoQURELCBPVVQsIDEsIFhZWlcpKTsKLQkJZTMyKFZQX0lOKElOLCAxKSk7Ci0JCWUzMihWUF9aRVJPKCkpOworCQllMzIoUFZTX09QX0RTVF9PUEVSQU5EKFZFX0FERCwgR0xfRkFMU0UsIEdMX0ZBTFNFLCAxLCAweGYsIFBWU19EU1RfUkVHX09VVCkpOworCQllMzIoUFZTX1NSQ19PUEVSQU5EKDEsIFBWU19TUkNfU0VMRUNUX1gsIFBWU19TUkNfU0VMRUNUX1ksIFBWU19TUkNfU0VMRUNUX1osIFBWU19TUkNfU0VMRUNUX1csIFBWU19TUkNfUkVHX0lOUFVULCBWU0ZfRkxBR19OT05FKSk7CisJCWUzMihQVlNfU1JDX09QRVJBTkQoMSwgUFZTX1NSQ19TRUxFQ1RfRk9SQ0VfMCwgUFZTX1NSQ19TRUxFQ1RfRk9SQ0VfMCwgUFZTX1NSQ19TRUxFQ1RfRk9SQ0VfMCwgUFZTX1NSQ19TRUxFQ1RfRk9SQ0VfMCwgUFZTX1NSQ19SRUdfSU5QVVQsIFZTRl9GTEFHX05PTkUpKTsKIAkJZTMyKDB4MCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3Byb2dyYW0uaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9wcm9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGQ3ODMuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3Byb2dyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotQ29weXJpZ2h0IChDKSAyMDA0IE5pY29sYWkgSGFlaG5sZS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLXBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi1FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKLUxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLU9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQXV0aG9yczoKLSAqICAgTmljb2xhaSBIYWVobmxlIDxwcmVmZWN0X0BnbXgubmV0PgotICovCi0KLSNpZm5kZWYgX19SMzAwX1BST0dSQU1fSF9fCi0jZGVmaW5lIF9fUjMwMF9QUk9HUkFNX0hfXwotCi0jaW5jbHVkZSAicjMwMF9yZWcuaCIKLQotLyoqCi0gKiBWZXJ0ZXggcHJvZ3JhbSBoZWxwZXIgbWFjcm9zCi0gKi8KLQotLyogUHJvZHVjZSBvdXQgZHdvcmQgKi8KLSNkZWZpbmUgVlBfT1VUQ0xBU1NfVE1QCQlSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX1RFTVBPUkFSWQotI2RlZmluZSBWUF9PVVRDTEFTU19PVVQJCVIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfUkVTVUxUCi0KLSNkZWZpbmUgVlBfT1VUTUFTS19YCVIzMDBfVlBJX09VVF9XUklURV9YCi0jZGVmaW5lIFZQX09VVE1BU0tfWQlSMzAwX1ZQSV9PVVRfV1JJVEVfWQotI2RlZmluZSBWUF9PVVRNQVNLX1oJUjMwMF9WUElfT1VUX1dSSVRFX1oKLSNkZWZpbmUgVlBfT1VUTUFTS19XCVIzMDBfVlBJX09VVF9XUklURV9XCi0jZGVmaW5lIFZQX09VVE1BU0tfWFkJKFZQX09VVE1BU0tfWHxWUF9PVVRNQVNLX1kpCi0jZGVmaW5lIFZQX09VVE1BU0tfWFoJKFZQX09VVE1BU0tfWHxWUF9PVVRNQVNLX1opCi0jZGVmaW5lIFZQX09VVE1BU0tfWFcJKFZQX09VVE1BU0tfWHxWUF9PVVRNQVNLX1cpCi0jZGVmaW5lIFZQX09VVE1BU0tfWFlaCShWUF9PVVRNQVNLX1hZfFZQX09VVE1BU0tfWikKLSNkZWZpbmUgVlBfT1VUTUFTS19YWVcJKFZQX09VVE1BU0tfWFl8VlBfT1VUTUFTS19XKQotI2RlZmluZSBWUF9PVVRNQVNLX1haVwkoVlBfT1VUTUFTS19YWnxWUF9PVVRNQVNLX1cpCi0jZGVmaW5lIFZQX09VVE1BU0tfWFlaVwkoVlBfT1VUTUFTS19YWVp8VlBfT1VUTUFTS19XKQotI2RlZmluZSBWUF9PVVRNQVNLX1laCShWUF9PVVRNQVNLX1l8VlBfT1VUTUFTS19aKQotI2RlZmluZSBWUF9PVVRNQVNLX1lXCShWUF9PVVRNQVNLX1l8VlBfT1VUTUFTS19XKQotI2RlZmluZSBWUF9PVVRNQVNLX1laVwkoVlBfT1VUTUFTS19ZWnxWUF9PVVRNQVNLX1cpCi0jZGVmaW5lIFZQX09VVE1BU0tfWlcJKFZQX09VVE1BU0tfWnxWUF9PVVRNQVNLX1cpCi0KLSNkZWZpbmUgVlBfT1VUKGluc3RyLG91dGNsYXNzLG91dGlkeCxvdXRtYXNrKSBcCi0JKFIzMDBfVlBJX09VVF9PUF8jI2luc3RyIHwJCQkJXAotCSgob3V0aWR4KSA8PCBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX1NISUZUKSB8CQlcCi0JVlBfT1VUQ0xBU1NfIyNvdXRjbGFzcyB8CQkJCVwKLQlWUF9PVVRNQVNLXyMjb3V0bWFzaykKLQotLyogUHJvZHVjZSBpbiBkd29yZCAqLwotI2RlZmluZSBWUF9JTkNMQVNTX1RNUAkJUjMwMF9WUElfSU5fUkVHX0NMQVNTX1RFTVBPUkFSWQotI2RlZmluZSBWUF9JTkNMQVNTX0lOCQlSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfQVRUUklCVVRFCi0jZGVmaW5lIFZQX0lOQ0xBU1NfQ09OU1QJUjMwMF9WUElfSU5fUkVHX0NMQVNTX1BBUkFNRVRFUgotCi0jZGVmaW5lIFZQX0lOKGNsYXNzLGlkeCkgXAotCSgoKGlkeCkgPDwgUjMwMF9WUElfSU5fUkVHX0lOREVYX1NISUZUKSB8CQlcCi0JVlBfSU5DTEFTU18jI2NsYXNzIHwJCQkJCVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX1ggPDwgUjMwMF9WUElfSU5fWF9TSElGVCkgfAkJXAotCShSMzAwX1ZQSV9JTl9TRUxFQ1RfWSA8PCBSMzAwX1ZQSV9JTl9ZX1NISUZUKSB8CQlcCi0JKFIzMDBfVlBJX0lOX1NFTEVDVF9aIDw8IFIzMDBfVlBJX0lOX1pfU0hJRlQpIHwJCVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX1cgPDwgUjMwMF9WUElfSU5fV19TSElGVCkpCi0jZGVmaW5lIFZQX1pFUk8oKSBcCi0JKChSMzAwX1ZQSV9JTl9TRUxFQ1RfWkVSTyA8PCBSMzAwX1ZQSV9JTl9YX1NISUZUKSB8CVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX1pFUk8gPDwgUjMwMF9WUElfSU5fWV9TSElGVCkgfAlcCi0JKFIzMDBfVlBJX0lOX1NFTEVDVF9aRVJPIDw8IFIzMDBfVlBJX0lOX1pfU0hJRlQpIHwJXAotCShSMzAwX1ZQSV9JTl9TRUxFQ1RfWkVSTyA8PCBSMzAwX1ZQSV9JTl9XX1NISUZUKSkKLSNkZWZpbmUgVlBfT05FKCkgXAotCSgoUjMwMF9WUElfSU5fU0VMRUNUX09ORSA8PCBSMzAwX1ZQSV9JTl9YX1NISUZUKSB8CVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX09ORSA8PCBSMzAwX1ZQSV9JTl9ZX1NISUZUKSB8CVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX09ORSA8PCBSMzAwX1ZQSV9JTl9aX1NISUZUKSB8CVwKLQkoUjMwMF9WUElfSU5fU0VMRUNUX09ORSA8PCBSMzAwX1ZQSV9JTl9XX1NISUZUKSkKLQotI2RlZmluZSBWUF9ORUcoaW4sY29tcCkJCSgoaW4pIF4gKFIzMDBfVlBJX0lOX05FR18jI2NvbXApKQotI2RlZmluZSBWUF9ORUdBTEwoaW4sY29tcCkJVlBfTkVHKFZQX05FRyhWUF9ORUcoVlBfTkVHKChpbiksWCksWSksWiksVykKLQotLyoqCi0gKiBGcmFnbWVudCBwcm9ncmFtIGhlbHBlciBtYWNyb3MKLSAqLwotCi0vKiBQcm9kdWNlIHVuc2hpZnRlZCBzb3VyY2Ugc2VsZWN0b3JzICovCi0jZGVmaW5lIEZQX1RNUChpZHgpIChpZHgpCi0jZGVmaW5lIEZQX0NPTlNUKGlkeCkgKChpZHgpIHwgKDEgPDwgNSkpCi0KLS8qIFByb2R1Y2Ugc291cmNlL2Rlc3Qgc2VsZWN0b3IgZHdvcmQgKi8KLSNkZWZpbmUgRlBfU0VMQ19NQVNLX05PCQkwCi0jZGVmaW5lIEZQX1NFTENfTUFTS19YCQkxCi0jZGVmaW5lIEZQX1NFTENfTUFTS19ZCQkyCi0jZGVmaW5lIEZQX1NFTENfTUFTS19YWQkJMwotI2RlZmluZSBGUF9TRUxDX01BU0tfWgkJNAotI2RlZmluZSBGUF9TRUxDX01BU0tfWFoJCTUKLSNkZWZpbmUgRlBfU0VMQ19NQVNLX1laCQk2Ci0jZGVmaW5lIEZQX1NFTENfTUFTS19YWVoJNwotCi0jZGVmaW5lIEZQX1NFTEMoZGVzdGlkeCxyZWdtYXNrLG91dG1hc2ssc3JjMCxzcmMxLHNyYzIpIFwKLQkoKChkZXN0aWR4KSA8PCBSMzAwX0ZQSTFfRFNUQ19TSElGVCkgfAkJXAotCSAoRlBfU0VMQ19NQVNLXyMjcmVnbWFzayA8PCAyMykgfAkJXAotCSAoRlBfU0VMQ19NQVNLXyMjb3V0bWFzayA8PCAyNikgfAkJXAotCSAoKHNyYzApIDw8IFIzMDBfRlBJMV9TUkMwQ19TSElGVCkgfAkJXAotCSAoKHNyYzEpIDw8IFIzMDBfRlBJMV9TUkMxQ19TSElGVCkgfAkJXAotCSAoKHNyYzIpIDw8IFIzMDBfRlBJMV9TUkMyQ19TSElGVCkpCi0KLSNkZWZpbmUgRlBfU0VMQV9NQVNLX05PCQkwCi0jZGVmaW5lIEZQX1NFTEFfTUFTS19XCQkxCi0KLSNkZWZpbmUgRlBfU0VMQShkZXN0aWR4LHJlZ21hc2ssb3V0bWFzayxzcmMwLHNyYzEsc3JjMikgXAotCSgoKGRlc3RpZHgpIDw8IFIzMDBfRlBJM19EU1RBX1NISUZUKSB8CQlcCi0JIChGUF9TRUxBX01BU0tfIyNyZWdtYXNrIDw8IDIzKSB8CQlcCi0JIChGUF9TRUxBX01BU0tfIyNvdXRtYXNrIDw8IDI0KSB8CQlcCi0JICgoc3JjMCkgPDwgUjMwMF9GUEkzX1NSQzBBX1NISUZUKSB8CQlcCi0JICgoc3JjMSkgPDwgUjMwMF9GUEkzX1NSQzFBX1NISUZUKSB8CQlcCi0JICgoc3JjMikgPDwgUjMwMF9GUEkzX1NSQzJBX1NISUZUKSkKLQotLyogUHJvZHVjZSB1bnNoaWZ0ZWQgYXJndW1lbnQgc2VsZWN0b3JzICovCi0jZGVmaW5lIEZQX0FSR0Moc291cmNlKQlSMzAwX0ZQSTBfQVJHQ18jI3NvdXJjZQotI2RlZmluZSBGUF9BUkdBKHNvdXJjZSkgUjMwMF9GUEkyX0FSR0FfIyNzb3VyY2UKLSNkZWZpbmUgRlBfQUJTKGFyZykgKChhcmcpIHwgKDEgPDwgNikpCi0jZGVmaW5lIEZQX05FRyhhcmcpICgoYXJnKSBeICgxIDw8IDUpKQotCi0vKiBQcm9kdWNlIGluc3RydWN0aW9uIGR3b3JkICovCi0jZGVmaW5lIEZQX0lOU1RSQyhvcGNvZGUsYXJnMCxhcmcxLGFyZzIpIFwKLQkoUjMwMF9GUEkwX09VVENfIyNvcGNvZGUgfCAJCVwKLQkoKGFyZzApIDw8IFIzMDBfRlBJMF9BUkcwQ19TSElGVCkgfAlcCi0JKChhcmcxKSA8PCBSMzAwX0ZQSTBfQVJHMUNfU0hJRlQpIHwJXAotCSgoYXJnMikgPDwgUjMwMF9GUEkwX0FSRzJDX1NISUZUKSkKLQotI2RlZmluZSBGUF9JTlNUUkEob3Bjb2RlLGFyZzAsYXJnMSxhcmcyKSBcCi0JKFIzMDBfRlBJMl9PVVRBXyMjb3Bjb2RlIHwgCQlcCi0JKChhcmcwKSA8PCBSMzAwX0ZQSTJfQVJHMEFfU0hJRlQpIHwJXAotCSgoYXJnMSkgPDwgUjMwMF9GUEkyX0FSRzFBX1NISUZUKSB8CVwKLQkoKGFyZzIpIDw8IFIzMDBfRlBJMl9BUkcyQV9TSElGVCkpCi0KLWV4dGVybiB2b2lkIGRlYnVnX3ZwKEdMY29udGV4dCAqIGN0eCwgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICp2cCk7Ci0KLSNlbmRpZgkJCQkvKiBfX1IzMDBfUFJPR1JBTV9IX18gKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9yZWcuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9yZWcuaAppbmRleCAxYmFhNzRjLi43NzhkYjk2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfcmVnLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3JlZy5oCkBAIC02Nyw5ICs2NywxNSBAQAogCiAvKgogICogVmVydGV4IEFycmF5IFByb2Nlc3NpbmcgKFZBUCkgQ29udHJvbAotICogU3RvbGVuIGZyb20gcjIwMCBjb2RlIGZyb20gQ2hyaXN0b3BoIEJyaWxsIChJdCdzIGEgZ3Vlc3MhKQogICovCiAjZGVmaW5lIFIzMDBfVkFQX0NOVEwJMHgyMDgwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19OVU1fU0xPVFNfU0hJRlQgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX05VTV9DTlRMUlNfU0hJRlQgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfTlVNX0ZQVVNfU0hJRlQgICAgICAgICAgICAgICAgICA4CisjICAgICAgIGRlZmluZSBSMzAwX1ZGX01BWF9WVFhfTlVNX1NISUZUICAgICAgICAgICAgICAgIDE4CisjICAgICAgIGRlZmluZSBSMzAwX0dMX0NMSVBfU1BBQ0VfREVGICAgICAgICAgICAgICAgICAgICgwIDw8IDIyKQorIyAgICAgICBkZWZpbmUgUjMwMF9EWF9DTElQX1NQQUNFX0RFRiAgICAgICAgICAgICAgICAgICAoMSA8PCAyMikKKyMgICAgICAgZGVmaW5lIFI1MDBfVENMX1NUQVRFX09QVElNSVpBVElPTiAgICAgICAgICAgICAgKDEgPDwgMjMpCiAKIC8qIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBkaXJlY3RseSBhbmQgYWxzbyBzdGFydHMgZGF0YSBzZWN0aW9uCiAgKiBpbiBtYW55IDNkIENQX1BBQ0tFVDMncwpAQCAtMTA2LDE0ICsxMTIsMTUgQEAKIAkvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KICMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgIDE2CiAKLS8qIEJFR0lOOiBXaWxkIGd1ZXNzZXMgKi8KKyNkZWZpbmUgUjUwMF9WQVBfSU5ERVhfT0ZGU0VUCQkgICAgMHgyMDhjCisKICNkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCAgICAgICAgICAgMHgyMDkwCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVCAgICAgKDE8PDApCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UICAgKDE8PDEpCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQgKDE8PDIpICAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMl9QUkVTRU5UICgxPDwzKSAgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzNfUFJFU0VOVCAoMTw8NCkgIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQgKDE8PDE2KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMF9QUkVTRU5UICgxPDwxKQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMV9QUkVTRU5UICgxPDwyKQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMl9QUkVTRU5UICgxPDwzKQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfM19QUkVTRU5UICgxPDw0KQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUFRfU0laRV9QUkVTRU5UICgxPDwxNikKIAogI2RlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xICAgICAgICAgICAweDIwOTQKIAkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMyBiaXRzIHdpZGUsIHNwZWNpZmllcyBudW1iZXIKQEAgLTEyNiwzMCArMTMzLDY0IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfNV9DT01QX0NOVF9TSElGVCAxNQogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzZfQ09NUF9DTlRfU0hJRlQgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF83X0NPTVBfQ05UX1NISUZUIDIxCi0vKiBFTkQ6IFdpbGQgZ3Vlc3NlcyAqLworIwlkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fTk9UX1BSRVNFTlQgIDAKKyMJZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfXzFfQ09NUE9ORU5UICAxCisjCWRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX18yX0NPTVBPTkVOVFMgMgorIwlkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fM19DT01QT05FTlRTIDMKKyMJZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfXzRfQ09NUE9ORU5UUyA0CiAKICNkZWZpbmUgUjMwMF9TRV9WVEVfQ05UTCAgICAgICAgICAgICAgICAgIDB4MjBiMAotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWF9TQ0FMRV9FTkEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWF9PRkZTRVRfRU5BICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWV9TQ0FMRV9FTkEgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWV9PRkZTRVRfRU5BICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWl9TQ0FMRV9FTkEgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWl9PRkZTRVRfRU5BICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotIwlkZWZpbmUgICAgIFIzMDBfVlRYX1hZX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotIwlkZWZpbmUgICAgIFIzMDBfVlRYX1pfRk1UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotIwlkZWZpbmUgICAgIFIzMDBfVlRYX1cwX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotIwlkZWZpbmUgICAgIFIzMDBfVlRYX1cwX05PUk1BTElaRSAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotIwlkZWZpbmUgICAgIFIzMDBfVlRYX1NUX0RFTk9STUFMSVpFRCAgICAgICAgICAgICAgMHgwMDAwMTAwMAorIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWF9TQ0FMRV9FTkEgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1hfT0ZGU0VUX0VOQSAgICAgICAgICAgICAgICgxIDw8IDEpCisjCWRlZmluZSAgICAgUjMwMF9WUE9SVF9ZX1NDQUxFX0VOQSAgICAgICAgICAgICAgICAoMSA8PCAyKQorIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWV9PRkZTRVRfRU5BICAgICAgICAgICAgICAgKDEgPDwgMykKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1pfU0NBTEVfRU5BICAgICAgICAgICAgICAgICgxIDw8IDQpCisjCWRlZmluZSAgICAgUjMwMF9WUE9SVF9aX09GRlNFVF9FTkEgICAgICAgICAgICAgICAoMSA8PCA1KQorIwlkZWZpbmUgICAgIFIzMDBfVlRYX1hZX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9aX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDkpCisjCWRlZmluZSAgICAgUjMwMF9WVFhfVzBfRk1UICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyMJZGVmaW5lICAgICBSMzAwX1NFUklBTF9QUk9DX0VOQSAgICAgICAgICAgICAgICAgICgxIDw8IDExKQogCiAvKiBCRUdJTjogVmVydGV4IGRhdGEgYXNzZW1ibHkgLSBsb3RzIG9mIHVuY2VydGFpbnRpZXMgKi8KIAogLyogZ2FwICovCiAKKy8qIE1heGltdW0gVmVydGV4IEluZHggQ2xhbXAgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVkZfTUFYX1ZUWF9JTkRYICAgICAgICAgMHgyMTM0CisvKiBNaW5pbXVtIFZlcnRleCBJbmR4IENsYW1wICovCisjZGVmaW5lIFIzMDBfVkFQX1ZGX01JTl9WVFhfSU5EWCAgICAgICAgIDB4MjEzOAorCisvKiogVmVydGV4IGFzc2VtYmxlci9wcm9jZXNzb3IgY29udHJvbCBzdGF0dXMgKi8KICNkZWZpbmUgUjMwMF9WQVBfQ05UTF9TVEFUVVMgICAgICAgICAgICAgIDB4MjE0MAorLyogTm8gc3dhcCBhdCBhbGwgKGRlZmF1bHQpICovCiAjCWRlZmluZSBSMzAwX1ZDX05PX1NXQVAgICAgICAgICAgICAgICAgICAoMCA8PCAwKQorLyogMTYtYml0IHN3YXA6IDB4QUFCQkNDREQgYmVjb21lcyAweEJCQUFERENDICovCiAjCWRlZmluZSBSMzAwX1ZDXzE2QklUX1NXQVAgICAgICAgICAgICAgICAoMSA8PCAwKQorLyogMzItYml0IHN3YXA6IDB4QUFCQkNDREQgYmVjb21lcyAweEREQ0NCQkFBICovCiAjCWRlZmluZSBSMzAwX1ZDXzMyQklUX1NXQVAgICAgICAgICAgICAgICAoMiA8PCAwKQorLyogSGFsZi1kd29yZCBzd2FwOiAweEFBQkJDQ0REIGJlY29tZXMgMHhDQ0REQUFCQiAqLworIwlkZWZpbmUgUjMwMF9WQ19IQUxGX0RXT1JEX1NXQVAgICAgICAgICAgKDMgPDwgMCkKKy8qIFRoZSBUQ0wgZW5naW5lIHdpbGwgbm90IGJlIHVzZWQgKGFzIGl0IGlzIGxvZ2ljYWxseSBvciBldmVuIHBoeXNpY2FsbHkgcmVtb3ZlZCkgKi8KICMJZGVmaW5lIFIzMDBfVkFQX1RDTF9CWVBBU1MJCSgxIDw8IDgpCisvKiBSZWFkIG9ubHkgZmxhZyBpZiBUQ0wgZW5naW5lIGlzIGJ1c3kuICovCisjCWRlZmluZSBSMzAwX1ZBUF9QVlNfQlVTWSAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKy8qIFRPRE86IGdhcCBmb3IgTUFYX01QUyAqLworLyogUmVhZCBvbmx5IGZsYWcgaWYgdGhlIHZlcnRleCBzdG9yZSBpcyBidXN5LiAqLworIwlkZWZpbmUgUjMwMF9WQVBfVlNfQlVTWSAgICAgICAgICAgICAgICAgKDEgPDwgMjQpCisvKiBSZWFkIG9ubHkgZmxhZyBpZiB0aGUgcmVjaXByb2NhbCBlbmdpbmUgaXMgYnVzeS4gKi8KKyMJZGVmaW5lIFIzMDBfVkFQX1JDUF9CVVNZICAgICAgICAgICAgICAgICgxIDw8IDI1KQorLyogUmVhZCBvbmx5IGZsYWcgaWYgdGhlIHZpZXdwb3J0IHRyYW5zZm9ybSBlbmdpbmUgaXMgYnVzeS4gKi8KKyMJZGVmaW5lIFIzMDBfVkFQX1ZURV9CVVNZICAgICAgICAgICAgICAgICgxIDw8IDI2KQorLyogUmVhZCBvbmx5IGZsYWcgaWYgdGhlIG1lbW9yeSBpbnRlcmZhY2UgdW5pdCBpcyBidXN5LiAqLworIwlkZWZpbmUgUjMwMF9WQVBfTVVJX0JVU1kgICAgICAgICAgICAgICAgKDEgPDwgMjcpCisvKiBSZWFkIG9ubHkgZmxhZyBpZiB0aGUgdmVydGV4IGNhY2hlIGlzIGJ1c3kuICovCisjCWRlZmluZSBSMzAwX1ZBUF9WQ19CVVNZICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKy8qIFJlYWQgb25seSBmbGFnIGlmIHRoZSB2ZXJ0ZXggZmV0Y2hlciBpcyBidXN5LiAqLworIwlkZWZpbmUgUjMwMF9WQVBfVkZfQlVTWSAgICAgICAgICAgICAgICAgKDEgPDwgMjkpCisvKiBSZWFkIG9ubHkgZmxhZyBpZiB0aGUgcmVnaXN0ZXIgcGlwZWxpbmUgaXMgYnVzeS4gKi8KKyMJZGVmaW5lIFIzMDBfVkFQX1JFR1BJUEVfQlVTWSAgICAgICAgICAgICgxIDw8IDMwKQorLyogUmVhZCBvbmx5IGZsYWcgaWYgdGhlIFZBUCBlbmdpbmUgaXMgYnVzeS4gKi8KKyMJZGVmaW5lIFIzMDBfVkFQX1ZBUF9CVVNZICAgICAgICAgICAgICAgICgxIDw8IDMxKQogCiAvKiBnYXAgKi8KIApAQCAtMTc3LDI3ICsyMTgsMzEgQEAKICAqIEFsd2F5cyBzZXQgQ09NUE9ORU5UU180IGluIGltbWVkaWF0ZSBtb2RlLgogICovCiAKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8wICAgICAgICAgICAgMHgyMTUwCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMSAgICAgKDAgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18yICAgICAoMSA8PCAwKQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzMgICAgICgyIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfNCAgICAgKDMgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU19SR0JBICAoNCA8PCAwKSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX1NISUZUICAgIDgKLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0lEWF9NQVNLICAgICAoMzEgPDwgOCkgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0VORCAgICAgICAgICAoMSA8PCAxMykKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfSU1NRURJQVRFX01PREUgICAoMCA8PCAxNCkgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVQgICAgICAgICAgICAoMSA8PCAxNCkgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfVU5TSUdORURfQllURSAgICAoMiA8PCAxNCkgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVRfQ09MT1IgICAgICAoMyA8PCAxNCkgLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8xICAgICAgICAgICAgMHgyMTU0Ci0jZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMiAgICAgICAgICAgIDB4MjE1OAotI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzMgICAgICAgICAgICAweDIxNUMKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF80ICAgICAgICAgICAgMHgyMTYwCi0jZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfNSAgICAgICAgICAgIDB4MjE2NAotI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzYgICAgICAgICAgICAweDIxNjgKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF83ICAgICAgICAgICAgMHgyMTZDCi0KKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF8wICAgICAgICAgICAgICAgICAgICAgMHgyMTUwCisjICAgICAgIGRlZmluZSBSMzAwX0RBVEFfVFlQRV8wX1NISUZUICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfREFUQV9UWVBFX0ZMT0FUXzEgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9EQVRBX1RZUEVfRkxPQVRfMiAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBSMzAwX0RBVEFfVFlQRV9GTE9BVF8zICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIFIzMDBfREFUQV9UWVBFX0ZMT0FUXzQgICAgICAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9EQVRBX1RZUEVfQllURSAgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBSMzAwX0RBVEFfVFlQRV9EM0RDT0xPUiAgICAgICAgICAgICAgICAgIDUKKyMgICAgICAgZGVmaW5lIFIzMDBfREFUQV9UWVBFX1NIT1JUXzIgICAgICAgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9EQVRBX1RZUEVfU0hPUlRfNCAgICAgICAgICAgICAgICAgICA3CisjICAgICAgIGRlZmluZSBSMzAwX0RBVEFfVFlQRV9WRUNUT1JfM19UVFQgICAgICAgICAgICAgIDgKKyMgICAgICAgZGVmaW5lIFIzMDBfREFUQV9UWVBFX1ZFQ1RPUl8zX0VFVCAgICAgICAgICAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9TS0lQX0RXT1JEU19TSElGVCAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9WRUNfTE9DX1NISUZUICAgICAgICAgICAgICAgICAgIDgKKyMgICAgICAgZGVmaW5lIFIzMDBfTEFTVF9WRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCisjICAgICAgIGRlZmluZSBSMzAwX1NJR05FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE0KQorIyAgICAgICBkZWZpbmUgUjMwMF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfREFUQV9UWVBFXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF8xICAgICAgICAgICAgICAgICAgICAgMHgyMTU0CisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfMiAgICAgICAgICAgICAgICAgICAgIDB4MjE1OAorI2RlZmluZSBSMzAwX1ZBUF9QUk9HX1NUUkVBTV9DTlRMXzMgICAgICAgICAgICAgICAgICAgICAweDIxNUMKKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF80ICAgICAgICAgICAgICAgICAgICAgMHgyMTYwCisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfNSAgICAgICAgICAgICAgICAgICAgIDB4MjE2NAorI2RlZmluZSBSMzAwX1ZBUF9QUk9HX1NUUkVBTV9DTlRMXzYgICAgICAgICAgICAgICAgICAgICAweDIxNjgKKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF83ICAgICAgICAgICAgICAgICAgICAgMHgyMTZDCiAvKiBnYXAgKi8KIAogLyogTm90ZXM6CkBAIC0yMDUsOSArMjUwLDI2IEBACiAgKiAgICBpZiB2ZXJ0ZXggcHJvZ3JhbSB1c2VzIG9ubHkgcG9zaXRpb24sIGZnbHJ4IHdpbGwgc2V0IG5vcm1hbCwgdG9vCiAgKiAgLSBJTlBVVF9DTlRMXzBfQ09MT1IgYW5kIElOUFVUX0NOVExfQ09MT1IgYml0cyBhcmUgYWx3YXlzIGVxdWFsLgogICovCi0jZGVmaW5lIFIzMDBfVkFQX0lOUFVUX0NOVExfMCAgICAgICAgICAgICAgIDB4MjE4MAotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMXzBfQ09MT1IgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfQ05UTF8xICAgICAgICAgICAgICAgMHgyMTg0CisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9TVEFURV9DTlRMICAgICAgICAgICAgICAgMHgyMTgwCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SXzBfQVNTRU1CTFlfU0hJRlQgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9TRUxfQ09MT1IgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfU0VMX1VTRVJfQ09MT1JfMCAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBSMzAwX1NFTF9VU0VSX0NPTE9SXzEgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl8xX0FTU0VNQkxZX1NISUZUICAgIDIKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfMl9BU1NFTUJMWV9TSElGVCAgICA0CisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SXzNfQVNTRU1CTFlfU0hJRlQgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl80X0FTU0VNQkxZX1NISUZUICAgIDgKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfNV9BU1NFTUJMWV9TSElGVCAgICAxMAorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl82X0FTU0VNQkxZX1NISUZUICAgIDEyCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SXzdfQVNTRU1CTFlfU0hJRlQgICAgMTQKKyMgICAgICAgZGVmaW5lIFIzMDBfVVBEQVRFX1VTRVJfQ09MT1JfMF9FTkEgICAoMSA8PCAxNikKKworLyoKKyAqIEVhY2ggYml0IGluIHRoaXMgZmllbGQgYXBwbGllcyB0byB0aGUgY29ycmVzcG9uZGluZyB2ZWN0b3IgaW4gdGhlIFZTTQorICogbWVtb3J5IChpLmUuIEJpdCAwIGFwcGxpZXMgdG8gVkVDVE9SXzAgKFBPU0lUSU9OKSwgZXRjLikuIElmIHRoZSBiaXQKKyAqIGlzIHNldCwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyA0LUR3b3JkIFZlY3RvciBpcyBvdXRwdXQgaW50byB0aGUgVmVydGV4IFN0cmVhbS4KKyAqLworI2RlZmluZSBSMzAwX1ZBUF9WU01fVlRYX0FTU00gICAgICAgICAgICAgICAweDIxODQKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9QT1MgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfTk9STUFMICAgICAgICAgICAgMHgwMDAwMDAwMgogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX0NPTE9SICAgICAgICAgICAgIDB4MDAwMDAwMDQKQEAgLTIyMCw2ICsyODIsMTIgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzYgICAgICAgICAgICAgICAweDAwMDEwMDAwIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM3ICAgICAgICAgICAgICAgMHgwMDAyMDAwMCAvKiBHVUVTUyAqLwogCisvKiBQcm9ncmFtbWFibGUgU3RyZWFtIENvbnRyb2wgU2lnbmVkIE5vcm1hbGl6ZSBDb250cm9sICovCisjZGVmaW5lIFIzMDBfVkFQX1BTQ19TR05fTk9STV9DTlRMICAgICAgICAgMHgyMWRjCisjCWRlZmluZSBTR05fTk9STV9aRVJPICAgICAgICAgICAgICAgICAwCisjCWRlZmluZSBTR05fTk9STV9aRVJPX0NMQU1QX01JTlVTX09ORSAxCisjCWRlZmluZSBTR05fTk9STV9OT19aRVJPICAgICAgICAgICAgICAyCisKIC8qIGdhcCAqLwogCiAvKiBXb3JkcyBwYXJhbGxlbCB0byBJTlBVVF9ST1VURV8wOyBBbGwgd29yZHMgdGhhdCBhcmUgYWN0aXZlIGluIElOUFVUX1JPVVRFXzAKQEAgLTIyOSwyNiArMjk3LDQwIEBACiAgKiBtb2RlLCB0aGUgc3dpenpsaW5nIHBhdHRlcm4gaXMgZS5nLiB1c2VkIHRvIHNldCB6dyBjb21wb25lbnRzIGluIHRleHR1cmUKICAqIGNvb3JkaW5hdGVzIHdpdGggb25seSB0d2VvIGNvbXBvbmVudHMuCiAgKi8KLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wICAgICAgICAgICAgMHgyMUUwCisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfRVhUXzAgICAgICAgICAgICAgICAgIDB4MjFlMAorIyAgICAgICBkZWZpbmUgUjMwMF9TV0laWkxFMF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX1NXSVpaTEVfU0VMRUNUX1hfU0hJRlQgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfU1dJWlpMRV9TRUxFQ1RfWV9TSElGVCAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9TV0laWkxFX1NFTEVDVF9aX1NISUZUICAgICAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX1NXSVpaTEVfU0VMRUNUX1dfU0hJRlQgICAgICAgICAgICAgIDkKKworIyAgICAgICBkZWZpbmUgUjMwMF9TV0laWkxFX1NFTEVDVF9YICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX1NXSVpaTEVfU0VMRUNUX1kgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIFIzMDBfU1dJWlpMRV9TRUxFQ1RfWiAgICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgUjMwMF9TV0laWkxFX1NFTEVDVF9XICAgICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBSMzAwX1NXSVpaTEVfU0VMRUNUX0ZQX1pFUk8gICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIFIzMDBfU1dJWlpMRV9TRUxFQ1RfRlBfT05FICAgICAgICAgICAgICAgNQorLyogYWx0ZXJuYXRlIGZvcm1zIGZvciByMzAwX2VtaXQuYyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfWCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9ZICAgIDEKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1ogICAgMgogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfVyAgICAzCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9aRVJPIDQKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX09ORSAgNQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfTUFTSyA3Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1hfU0hJRlQgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWV9TSElGVCAgICAgMwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9aX1NISUZUICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1dfU0hJRlQgICAgIDkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRU5BQkxFICAgICAgKDE1IDw8IDEyKQotI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzEgICAgICAgICAgICAweDIxRTQKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8yICAgICAgICAgICAgMHgyMUU4Ci0jZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMyAgICAgICAgICAgIDB4MjFFQwotI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzQgICAgICAgICAgICAweDIxRjAKLSNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV81ICAgICAgICAgICAgMHgyMUY0Ci0jZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfNiAgICAgICAgICAgIDB4MjFGOAotI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzcgICAgICAgICAgICAweDIxRkMKKworIyAgICAgICBkZWZpbmUgUjMwMF9XUklURV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9XUklURV9FTkFfWCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBSMzAwX1dSSVRFX0VOQV9ZICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIFIzMDBfV1JJVEVfRU5BX1ogICAgICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9XUklURV9FTkFfVyAgICAgICAgICAgICAgICAgICAgICAgICA4CisjICAgICAgIGRlZmluZSBSMzAwX1NXSVpaTEUxX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfRVhUXzEgICAgICAgICAgICAgICAgIDB4MjFlNAorI2RlZmluZSBSMzAwX1ZBUF9QUk9HX1NUUkVBTV9DTlRMX0VYVF8yICAgICAgICAgICAgICAgICAweDIxZTgKKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF9FWFRfMyAgICAgICAgICAgICAgICAgMHgyMWVjCisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfRVhUXzQgICAgICAgICAgICAgICAgIDB4MjFmMAorI2RlZmluZSBSMzAwX1ZBUF9QUk9HX1NUUkVBTV9DTlRMX0VYVF81ICAgICAgICAgICAgICAgICAweDIxZjQKKyNkZWZpbmUgUjMwMF9WQVBfUFJPR19TVFJFQU1fQ05UTF9FWFRfNiAgICAgICAgICAgICAgICAgMHgyMWY4CisjZGVmaW5lIFIzMDBfVkFQX1BST0dfU1RSRUFNX0NOVExfRVhUXzcgICAgICAgICAgICAgICAgIDB4MjFmYwogCiAvKiBFTkQ6IFZlcnRleCBkYXRhIGFzc2VtYmx5ICovCiAKQEAgLTI4MCwxOCArMzYyLDIwIEBACiAgKiBNdWx0aXBsZSB2ZXJ0ZXggcHJvZ3JhbXMgYW5kIHBhcmFtZXRlciBzZXRzIGNhbiBiZSBsb2FkZWQgYXQgb25jZSwKICAqIHdoaWNoIGNvdWxkIGV4cGxhaW4gdGhlIHNpemUgZGlzY3JlcGFuY3kuCiAgKi8KLSNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9BRERSRVNTICAgICAgICAgMHgyMjAwCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUFJPR1JBTSAgICAgICAgICAgMHgwMDAwMDAwMAotLyogZ2FwICovCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUEFSQU1FVEVSUyAgICAgICAgMHgwMDAwMDIwMAotLyogZ2FwICovCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfQ0xJUF9QTEFORTAgICAgICAgMHgwMDAwMDQwMAotIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX0NMSVBfUExBTkUxICAgICAgIDB4MDAwMDA0MDEKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9DTElQX1BMQU5FMiAgICAgICAweDAwMDAwNDAyCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfQ0xJUF9QTEFORTMgICAgICAgMHgwMDAwMDQwMwotIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX0NMSVBfUExBTkU0ICAgICAgIDB4MDAwMDA0MDQKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9DTElQX1BMQU5FNSAgICAgICAweDAwMDAwNDA1Ci0jICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUE9JTlRTSVpFICAgICAgICAgMHgwMDAwMDQwNgorI2RlZmluZSBSMzAwX1ZBUF9QVlNfVkVDVE9SX0lORFhfUkVHICAgICAgICAgMHgyMjAwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19DT0RFX1NUQVJUICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX01BWF9QVlNfQ09ERV9MSU5FUyAgICAgICAyNTYKKyMgICAgICAgZGVmaW5lIFI1MDBfTUFYX1BWU19DT0RFX0xJTkVTICAgICAgIDEwMjQKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NPTlNUX1NUQVJUICAgICAgICAgIDUxMgorIyAgICAgICBkZWZpbmUgUjUwMF9QVlNfQ09OU1RfU1RBUlQgICAgICAgICAgMTAyNAorIyAgICAgICBkZWZpbmUgUjMwMF9NQVhfUFZTX0NPTlNUX1ZFQ1MgICAgICAgMjU2CisjICAgICAgIGRlZmluZSBSNTAwX01BWF9QVlNfQ09OU1RfVkVDUyAgICAgICAxMDI0CisjICAgICAgIGRlZmluZSBSMzAwX1BWU19VQ1BfU1RBUlQgICAgICAgICAgICAxMDI0CisjICAgICAgIGRlZmluZSBSNTAwX1BWU19VQ1BfU1RBUlQgICAgICAgICAgICAxNTM2CisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UX1ZQT1JUX1NDQUxFX09GRlNFVCAxMDMwCisjICAgICAgIGRlZmluZSBSNTAwX1BPSU5UX1ZQT1JUX1NDQUxFX09GRlNFVCAxNTQyCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UX0dFTl9URVhfT0ZGU0VUICAgICAxMDMxCisjICAgICAgIGRlZmluZSBSNTAwX1BPSU5UX0dFTl9URVhfT0ZGU0VUICAgICAxNTQzCiAKIC8qCiAgKiBUaGVzZSBhcmUgb2Jzb2xldGUgZGVmaW5lcyBmb3JtIHIzMDBfY29udGV4dC5oLCBidXQgdGhleSBtaWdodCBnaXZlIHNvbWUKQEAgLTMxOSwxMCArNDAzLDI4IEBACiAvKiBJIGRvIG5vdCBrbm93IHRoZSBwdXJwb3NlIG9mIHRoaXMgcmVnaXN0ZXIuIEhvd2V2ZXIsIEkgZG8ga25vdyB0aGF0CiAgKiBpdCBpcyBzZXQgdG8gMjIxQ19DTEVBUiBmb3IgY2xlYXIgb3BlcmF0aW9ucyBhbmQgdG8gMjIxQ19OT1JNQUwKICAqIGZvciBub3JtYWwgcmVuZGVyaW5nLgorICoKKyAqIDIwMDctMTEtMDU6IFRoaXMgcmVnaXN0ZXIgaXMgdGhlIHVzZXIgY2xpcCBwbGFuZSBjb250cm9sIHJlZ2lzdGVyLCBidXQgdGhlcmUKKyAqIGFsc28gc2VlbXMgdG8gYmUgYSByZW5kZXJpbmcgbW9kZSBjb250cm9sOyB0aGUgTk9STUFML0NMRUFSIGRlZmluZXMuCisgKgorICogU2VlIGJ1ZyAjOTg3MS4gaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2F0dGFjaG1lbnQuY2dpP2lkPTEwNjcyJmFjdGlvbj12aWV3CiAgKi8KLSNkZWZpbmUgUjMwMF9WQVBfVU5LTk9XTl8yMjFDICAgICAgICAgICAgICAgMHgyMjFDCi0jICAgICAgIGRlZmluZSBSMzAwXzIyMUNfTk9STUFMICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotIyAgICAgICBkZWZpbmUgUjMwMF8yMjFDX0NMRUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMUMwMDAKKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAweDIyMUMKKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX1VDUF9FTkFCTEVfMCAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfVUNQX0VOQUJMRV8xICAgICAgICAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9VQ1BfRU5BQkxFXzIgICAgICAgICAgICAgKDEgPDwgMikKKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX1VDUF9FTkFCTEVfMyAgICAgICAgICAgICAoMSA8PCAzKQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfVUNQX0VOQUJMRV80ICAgICAgICAgICAgICgxIDw8IDQpCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9VQ1BfRU5BQkxFXzUgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfUFNfVUNQX01PREVfRElTVF9DT1AgICAgICAgICAoMCA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfUFNfVUNQX01PREVfUkFESVVTX0NPUCAgICAgICAoMSA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfUFNfVUNQX01PREVfUkFESVVTX0NPUF9DTElQICAoMiA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfUFNfVUNQX01PREVfQ0xJUF9BU19UUklGQU4gICAoMyA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfVUNQX0NVTExfT05MWV9FTkFCTEUgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQk9VTkRBUllfRURHRV9GTEFHX0VOQUJMRSAgICAoMSA8PCAxOCkKKyMgICAgICAgZGVmaW5lIFI1MDBfQ09MT1IyX0lTX1RFWFRVUkUgICAgICAgICAgICAoMSA8PCAyMCkKKyMgICAgICAgZGVmaW5lIFI1MDBfQ09MT1IzX0lTX1RFWFRVUkUgICAgICAgICAgICAoMSA8PCAyMSkKIAogLyogVGhlc2Ugc2VlbSB0byBiZSBwZXItcGl4ZWwgYW5kIHBlci12ZXJ0ZXggWCBhbmQgWSBjbGlwcGluZyBwbGFuZXMuIFRoZSBmaXJzdAogICogcGxhbmUgaXMgcGVyLXBpeGVsIGFuZCB0aGUgc2Vjb25kIHBsYW5lIGlzIHBlci12ZXJ0ZXguCkBAIC0zMzEsMTAgKzQzMywxMCBAQAogICoKICAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgY2FsbGVkIFhfUVVBRDBfMV9GTCB0byBYX1FVQUQwXzRfRkwgYnkgZ2x4dGVzdC4KICAqLwotI2RlZmluZSBSMzAwX1ZBUF9DTElQX1hfMCAgICAgICAgICAgICAgICAgICAweDIyMjAKLSNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9YXzEgICAgICAgICAgICAgICAgICAgMHgyMjI0Ci0jZGVmaW5lIFIzMDBfVkFQX0NMSVBfWV8wICAgICAgICAgICAgICAgICAgIDB4MjIyOAotI2RlZmluZSBSMzAwX1ZBUF9DTElQX1lfMSAgICAgICAgICAgICAgICAgICAweDIyMzAKKyNkZWZpbmUgUjMwMF9WQVBfR0JfVkVSVF9DTElQX0FESiAgICAgICAgICAgICAgICAgICAweDIyMjAKKyNkZWZpbmUgUjMwMF9WQVBfR0JfVkVSVF9ESVNDX0FESiAgICAgICAgICAgICAgICAgICAweDIyMjQKKyNkZWZpbmUgUjMwMF9WQVBfR0JfSE9SWl9DTElQX0FESiAgICAgICAgICAgICAgICAgICAweDIyMjgKKyNkZWZpbmUgUjMwMF9WQVBfR0JfSE9SWl9ESVNDX0FESiAgICAgICAgICAgICAgICAgICAweDIyMmMKIAogLyogZ2FwICovCiAKQEAgLTM0MywxMCArNDQ1LDE0IEBACiAgKiBUaGVyZWZvcmUsIEkgc3VzcGVjdCB3cml0aW5nIHplcm8gdG8gMHgyMjg0IHN5bmNocm9uaXplcyB0aGUgZW5naW5lIGFuZAogICogYXZvaWRzIGJ1Z3MgY2F1c2VkIGJ5IHN0aWxsIHJ1bm5pbmcgc2hhZGVycyByZWFkaW5nIGJhZCBkYXRhIGZyb20gbWVtb3J5LgogICovCi0jZGVmaW5lIFIzMDBfVkFQX1BWU19XQUlUSURMRSAgICAgICAgICAgICAgIDB4MjI4NCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1ZBUF9QVlNfU1RBVEVfRkxVU0hfUkVHICAgICAgICAweDIyODQKIAotLyogQWJzb2x1dGVseSBubyBjbHVlIHdoYXQgdGhpcyByZWdpc3RlciBpcyBhYm91dC4gKi8KLSNkZWZpbmUgUjMwMF9WQVBfVU5LTk9XTl8yMjg4ICAgICAgICAgICAgICAgMHgyMjg4CisvKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgY29yZSBjbG9ja3MgdG8gd2FpdCBmb3IgYQorICogdmVydGV4IHRvIGJlIHJlY2VpdmVkIGJ5IHRoZSBWQVAgaW5wdXQgY29udHJvbGxlciAod2hpbGUgdGhlIHByaW1pdGl2ZQorICogcGF0aCBpcyBiYWNrZWQgdXApIGJlZm9yZSBmb3JjaW5nIGFueSBhY2N1bXVsYXRlZCB2ZXJ0aWNlcyB0byBiZSBzdWJtaXR0ZWQKKyAqIHRvIHRoZSB2ZXJ0ZXggcHJvY2Vzc2luZyBwYXRoLgorICovCisjZGVmaW5lIFZBUF9QVlNfVlRYX1RJTUVPVVRfUkVHICAgICAgICAgICAgIDB4MjI4OAogIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1IzMDAgICAgICAgICAgICAgICAgICAgIDB4MDA3NTAwMDAgLyogLS0gbmggKi8KICMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SVjM1MCAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGIC8qIC0tIFZsYWRpbWlyICovCiAKQEAgLTM2OSwxNyArNDc1LDE3IEBACiAgKiBpcyBzb21ldGltZXMgYWNjZXB0ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBoYXZlIG5vIHJlbGF0aW9uc2hpcCB3aXRoCiAgKiBwb3NpdGlvbiBjYWxjdWxhdGlvbnMuCiAgKi8KLSNkZWZpbmUgUjMwMF9WQVBfUFZTX0NOVExfMSAgICAgICAgICAgICAgICAgMHgyMkQwCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUICAgICAgICAgMTAKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX0VORF9TSElGVCAgICAgMjAKKyNkZWZpbmUgUjMwMF9WQVBfUFZTX0NPREVfQ05UTF8wICAgICAgICAgICAgMHgyMkQwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19GSVJTVF9JTlNUX1NISUZUICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfWFlaV19WQUxJRF9JTlNUX1NISUZUICAgIDEwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19MQVNUX0lOU1RfU0hJRlQgICAgICAgICAgMjAKIC8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdGhlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzIGFyZWEuICovCi0jZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzIgICAgICAgICAgICAgICAgIDB4MjJENAotIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX09GRlNFVF9TSElGVCAwCi0jICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzJfUEFSQU1fQ09VTlRfU0hJRlQgIDE2Ci0jZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzMJICAgICAgICAgICAweDIyRDgKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV05fU0hJRlQgMTAKLSMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV04yX1NISUZUIDAKKyNkZWZpbmUgUjMwMF9WQVBfUFZTX0NPTlNUX0NOVEwgICAgICAgICAgICAgMHgyMkQ0CisjICAgICAgIGRlZmluZSBSMzAwX1BWU19DT05TVF9CQVNFX09GRlNFVF9TSElGVCAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfTUFYX0NPTlNUX0FERFJfU0hJRlQgICAgIDE2CisjZGVmaW5lIFIzMDBfVkFQX1BWU19DT0RFX0NOVExfMQkgICAgMHgyMkQ4CisjICAgICAgIGRlZmluZSBSMzAwX1BWU19MQVNUX1ZUWF9TUkNfSU5TVF9TSElGVCAgMAorI2RlZmluZSBSMzAwX1ZBUF9QVlNfRkxPV19DTlRMX09QQyAgICAgICAgICAweDIyREMKIAogLyogVGhlIGVudGlyZSByYW5nZSBmcm9tIDB4MjMwMCB0byAweDJBQyBpbmNsdXNpdmUgc2VlbXMgdG8gYmUgdXNlZCBmb3IKICAqIGltbWVkaWF0ZSB2ZXJ0aWNlcwpAQCAtNDI3LDE3ICs1MzMsMjMgQEAKICAqIChvciBzb21ldGhpbmcgY2xvc2VseSByZWxhdGVkIHRvIHRoYXQpLgogICogVGhpcyBiaXQgaXMgcmF0aGVyIGZhdGFsIGF0IHRoZSB0aW1lIGJlaW5nIGR1ZSB0byBsYWNraW5ncyBhdCBwaXhlbAogICogc2hhZGVyIHNpZGUKKyAqIFNwZWNpZmllcyB0b3Agb2YgUmFzdGVyIHBpcGUgc3BlY2lmaWMgZW5hYmxlIGNvbnRyb2xzLgogICovCiAjZGVmaW5lIFIzMDBfR0JfRU5BQkxFCTB4NDAwOAotIwlkZWZpbmUgUjMwMF9HQl9QT0lOVF9TVFVGRl9FTkFCTEUJKDE8PDApCi0jCWRlZmluZSBSMzAwX0dCX0xJTkVfU1RVRkZfRU5BQkxFCSgxPDwxKQotIwlkZWZpbmUgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9FTkFCTEUJKDE8PDIpCi0jCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19FTkFCTEUJKDE8PDQpCi0jCWRlZmluZSBSMzAwX0dCX1VOSzMxCQkJKDE8PDMxKQorIwlkZWZpbmUgUjMwMF9HQl9QT0lOVF9TVFVGRl9ESVNBQkxFICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQl9QT0lOVF9TVFVGRl9FTkFCTEUgICAgICAoMSA8PCAwKSAvKiBTcGVjaWZpZXMgaWYgcG9pbnRzIHdpbGwgaGF2ZSBzdHVmZmVkIHRleHR1cmUgY29vcmRpbmF0ZXMuICovCisjCWRlZmluZSBSMzAwX0dCX0xJTkVfU1RVRkZfRElTQUJMRSAgICAgICgwIDw8IDEpCisjCWRlZmluZSBSMzAwX0dCX0xJTkVfU1RVRkZfRU5BQkxFICAgICAgICgxIDw8IDEpIC8qIFNwZWNpZmllcyBpZiBsaW5lcyB3aWxsIGhhdmUgc3R1ZmZlZCB0ZXh0dXJlIGNvb3JkaW5hdGVzLiAqLworIwlkZWZpbmUgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9ESVNBQkxFICAoMCA8PCAyKQorIwlkZWZpbmUgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9FTkFCTEUgICAoMSA8PCAyKSAvKiBTcGVjaWZpZXMgaWYgdHJpYW5nbGVzIHdpbGwgaGF2ZSBzdHVmZmVkIHRleHR1cmUgY29vcmRpbmF0ZXMuICovCisjCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19ESVNBQkxFICAgICgwIDw8IDQpCisjCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19FTkFCTEUgICAgICgxIDw8IDQpIC8qIEVuYWJsZSBzdGVuY2lsIGF1dG8gaW5jL2RlYyBiYXNlZCBvbiB0cmlhbmdsZSBjdy9jY3csIGZvcmNlIGludG8gZHp5IGxvdyBiaXQuICovCisjCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19GT1JDRSAgICAgICgyIDw8IDQpIC8qIEZvcmNlIDAgaW50byBkenkgbG93IGJpdC4gKi8KKwogCS8qIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpcyAyIGJpdHMgd2lkZSAqLwotI2RlZmluZSBSMzAwX0dCX1RFWF9SRVBMSUNBVEUJMAotI2RlZmluZSBSMzAwX0dCX1RFWF9TVAkJMQotI2RlZmluZSBSMzAwX0dCX1RFWF9TVFIJCTIKKyNkZWZpbmUgUjMwMF9HQl9URVhfUkVQTElDQVRFCTAgLyogUmVwbGljYXRlIFZBUCBzb3VyY2UgdGV4dHVyZSBjb29yZGluYXRlcyAoUyxULFtSLFFdKS4gKi8KKyNkZWZpbmUgUjMwMF9HQl9URVhfU1QJCTEgLyogU3R1ZmYgd2l0aCBzb3VyY2UgdGV4dHVyZSBjb29yZGluYXRlcyAoUyxUKS4gKi8KKyNkZWZpbmUgUjMwMF9HQl9URVhfU1RSCQkyIC8qIFN0dWZmIHdpdGggc291cmNlIHRleHR1cmUgY29vcmRpbmF0ZXMgKFMsVCxSKS4gKi8KICMJZGVmaW5lIFIzMDBfR0JfVEVYMF9TT1VSQ0VfU0hJRlQJMTYKICMJZGVmaW5lIFIzMDBfR0JfVEVYMV9TT1VSQ0VfU0hJRlQJMTgKICMJZGVmaW5lIFIzMDBfR0JfVEVYMl9TT1VSQ0VfU0hJRlQJMjAKQEAgLTQ0OCw3ICs1NjAsNyBAQAogIwlkZWZpbmUgUjMwMF9HQl9URVg3X1NPVVJDRV9TSElGVAkzMAogCiAvKiBNU1BPUyAtIHBvc2l0aW9ucyBmb3IgbXVsdGlzYW1wbGUgYW50aWFsaWFzaW5nICg/KSAqLwotI2RlZmluZSBSMzAwX0dCX01TUE9TMAkweDQwMTAKKyNkZWZpbmUgUjMwMF9HQl9NU1BPUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMTAKIAkvKiBzaGlmdHMgLSBlYWNoIG9mIHRoZSBmaWVsZHMgaXMgNCBiaXRzICovCiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMF9fTVNfWDBfU0hJRlQJMAogIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzBfX01TX1kwX1NISUZUCTQKQEAgLTQ1OSw3ICs1NzEsNyBAQAogIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzBfX01TQkQwX1kJCTI0CiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMF9fTVNCRDBfWAkJMjgKIAotI2RlZmluZSBSMzAwX0dCX01TUE9TMQkweDQwMTQKKyNkZWZpbmUgUjMwMF9HQl9NU1BPUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMTQKICMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU19YM19TSElGVAkwCiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWTNfU0hJRlQJNAogIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzFfX01TX1g0X1NISUZUCTgKQEAgLTQ2OCwzMSArNTgwLDQ3IEBACiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWTVfU0hJRlQJMjAKICMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU0JEMQkJMjQKIAotCi0jZGVmaW5lIFIzMDBfR0JfVElMRV9DT05GSUcJMHg0MDE4Ci0jCWRlZmluZSBSMzAwX0dCX1RJTEVfRU5BQkxFCSgxPDwwKQotIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUlYzMDAJMAotIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUjMwMAkoMzw8MSkKLSMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1I0MjAJKDc8PDEpCi0jCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjQxMAkoMzw8MSkKLSMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzgJCTAKLSMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzE2CQkoMTw8NCkKLSMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzMyCQkoMjw8NCkKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8xCQkoMDw8NikKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8yCQkoMTw8NikKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV80CQkoMjw8NikKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV84CQkoMzw8NikKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8xNgkJKDQ8PDYpCi0jCWRlZmluZSBSMzAwX0dCX1NVUEVSX1NJWkVfMzIJCSg1PDw2KQotIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzY0CQkoNjw8NikKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8xMjgJCSg3PDw2KQorLyogU3BlY2lmaWVzIHRoZSBncmFwaGljcyBwaXBlbGluZSBjb25maWd1cmF0aW9uIGZvciByYXN0ZXJpemF0aW9uLiAqLworI2RlZmluZSBSMzAwX0dCX1RJTEVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4NDAxOAorIwlkZWZpbmUgUjMwMF9HQl9USUxFX0RJU0FCTEUgICAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjMwMAkoMCA8PCAxKSAvKiBSVjM1MCAoMSBwaXBlLCAxIGN0eCkgKi8KKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1IzMDAJKDMgPDwgMSkgLyogUjMwMCAoMiBwaXBlcywgMSBjdHgpICovCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SNDIwXzNQICAoNiA8PCAxKSAvKiBSNDIwLTNQICgzIHBpcGVzLCAxIGN0eCkgKi8KKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1I0MjAJKDcgPDwgMSkgLyogUjQyMCAoNCBwaXBlcywgMSBjdHgpICovCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfU0laRV84CQkoMCA8PCA0KQorIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfMTYJCSgxIDw8IDQpCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfU0laRV8zMgkJKDIgPDwgNCkKKyMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8xCQkoMCA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzIJCSgxIDw8IDYpCisjCWRlZmluZSBSMzAwX0dCX1NVUEVSX1NJWkVfNAkJKDIgPDwgNikKKyMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV84CQkoMyA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzE2CQkoNCA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzMyCQkoNSA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzY0CQkoNiA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzEyOAkJKDcgPDwgNikKICMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfWF9TSElGVAkJOQkvKiAzIGJpdHMgd2lkZSAqLwogIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9ZX1NISUZUCQkxMgkvKiAzIGJpdHMgd2lkZSAqLwotIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9USUxFX0EJCTAKLSMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfVElMRV9CCQkoMTw8MTUpCi0jCWRlZmluZSBSMzAwX0dCX1NVQlBJWEVMXzFfMTIJCTAKLSMJZGVmaW5lIFIzMDBfR0JfU1VCUElYRUxfMV8xNgkJKDE8PDE2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9USUxFX0EJCSgwIDw8IDE1KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9USUxFX0IJCSgxIDw8IDE1KQorIwlkZWZpbmUgUjMwMF9HQl9TVUJQSVhFTF8xXzEyCQkoMCA8PCAxNikKKyMJZGVmaW5lIFIzMDBfR0JfU1VCUElYRUxfMV8xNgkJKDEgPDwgMTYpCisjCWRlZmluZSBHQl9USUxFX0NPTkZJR19RVUFEU19QRVJfUkFTXzQgICAoMCA8PCAxNykKKyMJZGVmaW5lIEdCX1RJTEVfQ09ORklHX1FVQURTX1BFUl9SQVNfOCAgICgxIDw8IDE3KQorIwlkZWZpbmUgR0JfVElMRV9DT05GSUdfUVVBRFNfUEVSX1JBU18xNiAgKDIgPDwgMTcpCisjCWRlZmluZSBHQl9USUxFX0NPTkZJR19RVUFEU19QRVJfUkFTXzMyICAoMyA8PCAxNykKKyMJZGVmaW5lIEdCX1RJTEVfQ09ORklHX0JCX1NDQU5fSU5URVJDRVBUICgwIDw8IDE5KQorIwlkZWZpbmUgR0JfVElMRV9DT05GSUdfQkJfU0NBTl9CT1VORF9CT1ggKDEgPDwgMTkpCisjCWRlZmluZSBHQl9USUxFX0NPTkZJR19BTFRfU0NBTl9FTl9MUiAgICAoMCA8PCAyMCkKKyMJZGVmaW5lIEdCX1RJTEVfQ09ORklHX0FMVF9TQ0FOX0VOX0xSTCAgICgxIDw8IDIwKQorIwlkZWZpbmUgR0JfVElMRV9DT05GSUdfQUxUX09GRlNFVCAgICAgICAgKDAgPDwgMjEpCisjCWRlZmluZSBHQl9USUxFX0NPTkZJR19TVUJQUkVDSVNJT04gICAgICAoMCA8PCAyMikKKyMJZGVmaW5lIEdCX1RJTEVfQ09ORklHX0FMVF9USUxJTkdfREVGICAgICgwIDw8IDIzKQorIwlkZWZpbmUgR0JfVElMRV9DT05GSUdfQUxUX1RJTElOR18zXzIgICAgKDEgPDwgMjMpCisjCWRlZmluZSBHQl9USUxFX0NPTkZJR19aX0VYVEVOREVEXzI0XzEgICAoMCA8PCAyNCkKKyMJZGVmaW5lIEdCX1RJTEVfQ09ORklHX1pfRVhURU5ERURfUzI1XzEgICgxIDw8IDI0KQogCisvKiBTcGVjaWZpZXMgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIEZJRk9gcyBpbiB0aGUgc2MvcnMvdXMuIFRoaXMgcmVnaXN0ZXIgbXVzdCBiZSB0aGUgZmlyc3Qgb25lIHdyaXR0ZW4gKi8KICNkZWZpbmUgUjMwMF9HQl9GSUZPX1NJWkUJMHg0MDI0CiAJLyogZWFjaCBvZiB0aGUgZm9sbG93aW5nIGlzIDIgYml0cyB3aWRlICovCiAjZGVmaW5lIFIzMDBfR0JfRklGT19TSVpFXzMyCTAKQEAgLTUxNiwzMCArNjQ0LDEwMiBAQAogIwlkZWZpbmUgUjMwMF9PRklGT19ISUdIV0FURVJfU0hJRlQJMjIJLyogdHdvIGJpdHMgb25seSAqLwogIwlkZWZpbmUgUjMwMF9DVUJFX0ZJRk9fSElHSFdBVEVSX0NPTF9TSElGVAkyNAogCi0jZGVmaW5lIFIzMDBfR0JfU0VMRUNUCTB4NDAxQwotIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX0MwQQkJMAotIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX0MxQQkJMQotIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX0MyQQkJMgotIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX0MzQQkJMwotIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUXzFfMV9XCTQKLSMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9aCQk1Ci0jCWRlZmluZSBSMzAwX0dCX0RFUFRIX1NFTEVDVF9aCQkwCi0jCWRlZmluZSBSMzAwX0dCX0RFUFRIX1NFTEVDVF8xXzFfVwkoMTw8MykKLSMJZGVmaW5lIFIzMDBfR0JfV19TRUxFQ1RfMV9XCQkwCi0jCWRlZmluZSBSMzAwX0dCX1dfU0VMRUNUXzEJCSgxPDw0KQorI2RlZmluZSBHQl9aX1BFUV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAyOAorIwlkZWZpbmUgR0JfWl9QRVFfQ09ORklHX1pfUEVRX1NJWkVfNF80ICAgICgwIDw8IDApCisjCWRlZmluZSBHQl9aX1BFUV9DT05GSUdfWl9QRVFfU0laRV84XzggICAgKDEgPDwgMCkKIAotI2RlZmluZSBSMzAwX0dCX0FBX0NPTkZJRwkJMHg0MDIwCi0jCWRlZmluZSBSMzAwX0FBX0RJU0FCTEUJCQkweDAwCi0jCWRlZmluZSBSMzAwX0FBX0VOQUJMRQkJCTB4MDEKLSMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU18yCQkwCi0jCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfMwkJKDE8PDEpCi0jCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNAkJKDI8PDEpCi0jCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNgkJKDM8PDEpCisvKiBTcGVjaWZpZXMgdmFyaW91cyBwb2x5Z29uIHNwZWNpZmljIHNlbGVjdHMgKGZvZywgZGVwdGgsIHBlcnNwZWN0aXZlKS4gKi8KKyNkZWZpbmUgUjMwMF9HQl9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMWMKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DMEEJCSgwIDw8IDApCisjCWRlZmluZSBSMzAwX0dCX0ZPR19TRUxFQ1RfQzFBICAgICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX0MyQSAgICAgICAgICAgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DM0EgICAgICAgICAgICgzIDw8IDApCisjCWRlZmluZSBSMzAwX0dCX0ZPR19TRUxFQ1RfMV8xX1cgICAgICAgICAoNCA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQl9GT0dfU0VMRUNUX1oJCSg1IDw8IDApCisjCWRlZmluZSBSMzAwX0dCX0RFUFRIX1NFTEVDVF9aCQkoMCA8PCAzCisjCWRlZmluZSBSMzAwX0dCX0RFUFRIX1NFTEVDVF8xXzFfVwkoMSA8PCAzKQorIwlkZWZpbmUgUjMwMF9HQl9XX1NFTEVDVF8xX1cJCSgwIDw8IDQpCisjCWRlZmluZSBSMzAwX0dCX1dfU0VMRUNUXzEJCSgxIDw8IDQpCisjCWRlZmluZSBSMzAwX0dCX0ZPR19TVFVGRl9ESVNBQkxFICAgICAgICAoMCA8PCA1KQorIwlkZWZpbmUgUjMwMF9HQl9GT0dfU1RVRkZfRU5BQkxFICAgICAgICAgKDEgPDwgNSkKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NUVUZGX1RFWF9TSElGVCAgICAgIDYKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NUVUZGX1RFWF9NQVNLICAgICAgIDB4MDAwMDAzYzAKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NUVUZGX0NPTVBfU0hJRlQgICAgIDEwCisjCWRlZmluZSBSMzAwX0dCX0ZPR19TVFVGRl9DT01QX01BU0sgICAgICAweDAwMDAwYzAwCisKKy8qIFNwZWNpZmllcyB0aGUgZ3JhcGhpY3MgcGlwZWxpbmUgY29uZmlndXJhdGlvbiBmb3IgYW50aWFsaWFzaW5nLiAqLworI2RlZmluZSBHQl9BQV9DT05GSUcgICAJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAyMAorIwlkZWZpbmUgR0JfQUFfQ09ORklHX0FBX0RJU0FCTEUgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBHQl9BQV9DT05GSUdfQUFfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIEdCX0FBX0NPTkZJR19OVU1fQUFfU1VCU0FNUExFU18yICAoMCA8PCAxKQorIwlkZWZpbmUgR0JfQUFfQ09ORklHX05VTV9BQV9TVUJTQU1QTEVTXzMgICgxIDw8IDEpCisjCWRlZmluZSBHQl9BQV9DT05GSUdfTlVNX0FBX1NVQlNBTVBMRVNfNCAgKDIgPDwgMSkKKyMJZGVmaW5lIEdCX0FBX0NPTkZJR19OVU1fQUFfU1VCU0FNUExFU182ICAoMyA8PCAxKQorCisvKiBTZWxlY3RzIHdoaWNoIG9mIDQgcGlwZXMgYXJlIGFjdGl2ZS4gKi8KKyNkZWZpbmUgR0JfUElQRV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMmMKKyMJZGVmaW5lIEdCX1BJUEVfU0VMRUNUX1BJUEUwX0lEX1NISUZUICAwCisjCWRlZmluZSBHQl9QSVBFX1NFTEVDVF9QSVBFMV9JRF9TSElGVCAgMgorIwlkZWZpbmUgR0JfUElQRV9TRUxFQ1RfUElQRTJfSURfU0hJRlQgIDQKKyMJZGVmaW5lIEdCX1BJUEVfU0VMRUNUX1BJUEUzX0lEX1NISUZUICA2CisjCWRlZmluZSBHQl9QSVBFX1NFTEVDVF9QSVBFX01BU0tfU0hJRlQgOAorIwlkZWZpbmUgR0JfUElQRV9TRUxFQ1RfTUFYX1BJUEUgICAgICAgIDEyCisjCWRlZmluZSBHQl9QSVBFX1NFTEVDVF9CQURfUElQRVMgICAgICAgMTQKKyMJZGVmaW5lIEdCX1BJUEVfU0VMRUNUX0NPTkZJR19QSVBFUyAgICAxOAorCisKKy8qIFNwZWNpZmllcyB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgRklGT2BzIGluIHRoZSBzYy9ycy4gKi8KKyNkZWZpbmUgR0JfRklGT19TSVpFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwNzAKKy8qIEhpZ2ggd2F0ZXIgbWFyayBmb3IgU0MgaW5wdXQgZmlmbyAqLworIwlkZWZpbmUgR0JfRklGT19TSVpFMV9TQ19ISUdIV0FURVJfSUZJRk9fU0hJRlQgMAorIwlkZWZpbmUgR0JfRklGT19TSVpFMV9TQ19ISUdIV0FURVJfSUZJRk9fTUFTSyAgMHgwMDAwMDAzZgorLyogSGlnaCB3YXRlciBtYXJrIGZvciBTQyBpbnB1dCBmaWZvIChCKSAqLworIwlkZWZpbmUgR0JfRklGT19TSVpFMV9TQ19ISUdIV0FURVJfQkZJRk9fU0hJRlQgNgorIwlkZWZpbmUgR0JfRklGT19TSVpFMV9TQ19ISUdIV0FURVJfQkZJRk9fTUFTSyAgMHgwMDAwMGZjMAorLyogSGlnaCB3YXRlciBtYXJrIGZvciBSUyBjb2xvcnMnIGZpZm8gKi8KKyMJZGVmaW5lIEdCX0ZJRk9fU0laRTFfU0NfSElHSFdBVEVSX0NPTF9TSElGVCAgIDEyCisjCWRlZmluZSBHQl9GSUZPX1NJWkUxX1NDX0hJR0hXQVRFUl9DT0xfTUFTSyAgICAweDAwMDNmMDAwCisvKiBIaWdoIHdhdGVyIG1hcmsgZm9yIFJTIHRleHR1cmVzJyBmaWZvICovCisjCWRlZmluZSBHQl9GSUZPX1NJWkUxX1NDX0hJR0hXQVRFUl9URVhfU0hJRlQgICAxOAorIwlkZWZpbmUgR0JfRklGT19TSVpFMV9TQ19ISUdIV0FURVJfVEVYX01BU0sgICAgMHgwMGZjMDAwMAorCisvKiBUaGlzIHRhYmxlIHNwZWNpZmllcyB0aGUgc291cmNlIGxvY2F0aW9uIGFuZCBmb3JtYXQgZm9yIHVwIHRvIDE2IHRleHR1cmUKKyAqIGFkZHJlc3NlcyAoaVswXTppWzE1XSkgYW5kIGZvdXIgY29sb3JzIChjWzBdOmNbM10pCisgKi8KKyNkZWZpbmUgUjUwMF9SU19JUF8wCQkJCQkweDQwNzQKKyNkZWZpbmUgUjUwMF9SU19JUF8xCQkJCQkweDQwNzgKKyNkZWZpbmUgUjUwMF9SU19JUF8yCQkJCQkweDQwN0MKKyNkZWZpbmUgUjUwMF9SU19JUF8zCQkJCQkweDQwODAKKyNkZWZpbmUgUjUwMF9SU19JUF80CQkJCQkweDQwODQKKyNkZWZpbmUgUjUwMF9SU19JUF81CQkJCQkweDQwODgKKyNkZWZpbmUgUjUwMF9SU19JUF82CQkJCQkweDQwOEMKKyNkZWZpbmUgUjUwMF9SU19JUF83CQkJCQkweDQwOTAKKyNkZWZpbmUgUjUwMF9SU19JUF84CQkJCQkweDQwOTQKKyNkZWZpbmUgUjUwMF9SU19JUF85CQkJCQkweDQwOTgKKyNkZWZpbmUgUjUwMF9SU19JUF8xMAkJCQkJMHg0MDlDCisjZGVmaW5lIFI1MDBfUlNfSVBfMTEJCQkJCTB4NDBBMAorI2RlZmluZSBSNTAwX1JTX0lQXzEyCQkJCQkweDQwQTQKKyNkZWZpbmUgUjUwMF9SU19JUF8xMwkJCQkJMHg0MEE4CisjZGVmaW5lIFI1MDBfUlNfSVBfMTQJCQkJCTB4NDBBQworI2RlZmluZSBSNTAwX1JTX0lQXzE1CQkJCQkweDQwQjAKKyNkZWZpbmUgUjUwMF9SU19JUF9QVFJfSzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgUjUwMF9SU19JUF9QVFJfSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgUjUwMF9SU19JUF9URVhfUFRSX1NfU0hJRlQgCQkJMAorI2RlZmluZSBSNTAwX1JTX0lQX1RFWF9QVFJfVF9TSElGVCAJCQk2CisjZGVmaW5lIFI1MDBfUlNfSVBfVEVYX1BUUl9SX1NISUZUIAkJCTEyCisjZGVmaW5lIFI1MDBfUlNfSVBfVEVYX1BUUl9RX1NISUZUIAkJCTE4CisjZGVmaW5lIFI1MDBfUlNfSVBfQ09MX1BUUl9TSElGVCAJCQkyNAorI2RlZmluZSBSNTAwX1JTX0lQX0NPTF9GTVRfU0hJRlQgCQkJMjcKKyMJZGVmaW5lIFI1MDBfUlNfQ09MX1BUUih4KQkJICAgICAgICAoeCA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFI1MDBfUlNfQ09MX0ZNVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKHggPDwgMjcpCisvKiBnYXAgKi8KKyNkZWZpbmUgUjUwMF9SU19JUF9PRkZTRVRfRElTIAkJCQkoMCA8PCAzMSkKKyNkZWZpbmUgUjUwMF9SU19JUF9PRkZTRVRfRU4gCQkJCSgxIDw8IDMxKQogCiAvKiBnYXAgKi8KIAogLyogWmVybyB0byBmbHVzaCBjYWNoZXMuICovCi0jZGVmaW5lIFIzMDBfVFhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMAorI2RlZmluZSBSMzAwX1RYX0lOVkFMVEFHUyAgICAgICAgICAgICAgICAgICAweDQxMDAKICNkZWZpbmUgUjMwMF9UWF9GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgMHgwCiAKIC8qIFRoZSB1cHBlciBlbmFibGUgYml0cyBhcmUgZ3Vlc3NlZCwgYmFzZWQgb24gZmdscnggcmVwb3J0ZWQgbGltaXRzLiAqLwpAQCAtNTYxLDUzICs3NjEsMzM1IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV8xNCAgICAgICAgICAgICAgICAgKDEgPDwgMTQpCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV8xNSAgICAgICAgICAgICAgICAgKDEgPDwgMTUpCiAKLS8qIFRoZSBwb2ludHNpemUgaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuIFRoZSBwb2ludHNpemUgY2FuIGJlCi0gKiBlbm9ybW91czogQ2xlYXIoKSByZW5kZXJzIGEgc2luZ2xlIHBvaW50IHRoYXQgZmlsbHMgdGhlIGVudGlyZQotICogZnJhbWVidWZmZXIuCisjZGVmaW5lIFI1MDBfVFhfRklMVEVSXzQJCSAgICAweDQxMTAKKyMJZGVmaW5lIFI1MDBfVFhfV0VJR0hUXzFfU0hJRlQgICAgICAgICAgICAoMCkKKyMJZGVmaW5lIFI1MDBfVFhfV0VJR0hUXzBfU0hJRlQgICAgICAgICAgICAoMTEpCisjCWRlZmluZSBSNTAwX1RYX1dFSUdIVF9QQUlSICAgICAgICAgICAgICAgKDE8PDIyKQorIwlkZWZpbmUgUjUwMF9UWF9QSEFTRV9TSElGVCAgICAgICAgICAgICAgICgyMykKKyMJZGVmaW5lIFI1MDBfVFhfRElSRUNUSU9OX0hPUklaT05UQUwJICgwPDwyNykKKyMJZGVmaW5lIFI1MDBfVFhfRElSRUNUSU9OX1ZFUklUQ0FMCSAoMTw8MjcpCisKKy8qIFMgVGV4dHVyZSBDb29yZGluYXRlIG9mIFZlcnRleCAwIGZvciBQb2ludCB0ZXh0dXJlIHN0dWZmaW5nIChMTEMpICovCisjZGVmaW5lIFIzMDBfR0FfUE9JTlRfUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAKKworLyogVCBUZXh0dXJlIENvb3JkaW5hdGUgb2YgVmVydGV4IDAgZm9yIFBvaW50IHRleHR1cmUgc3R1ZmZpbmcgKExMQykgKi8KKyNkZWZpbmUgUjMwMF9HQV9QT0lOVF9UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwNAorCisvKiBTIFRleHR1cmUgQ29vcmRpbmF0ZSBvZiBWZXJ0ZXggMiBmb3IgUG9pbnQgdGV4dHVyZSBzdHVmZmluZyAoVVJDKSAqLworI2RlZmluZSBSMzAwX0dBX1BPSU5UX1MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjA4CisKKy8qIFQgVGV4dHVyZSBDb29yZGluYXRlIG9mIFZlcnRleCAyIGZvciBQb2ludCB0ZXh0dXJlIHN0dWZmaW5nIChVUkMpICovCisjZGVmaW5lIFIzMDBfR0FfUE9JTlRfVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMGMKKworLyogU3BlY2lmaWVzIGFtb3VudCB0byBzaGlmdCBpbnRlZ2VyIHBvc2l0aW9uIG9mIHZlcnRleCAoc2NyZWVuIHNwYWNlKSBiZWZvcmUKKyAqIGNvbnZlcnRpbmcgdG8gZmxvYXQgZm9yIHRyaWFuZ2xlIHN0aXBwbGUuCiAgKi8KLSNkZWZpbmUgUjMwMF9SRV9QT0lOVFNJWkUgICAgICAgICAgICAgICAgICAgMHg0MjFDCi0jICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX1NISUZUICAgICAgICAgICAgMAotIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfU0hJRlQgICAgICAgICAgICAxNgotIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMTYpIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfR0FfVFJJQU5HTEVfU1RJUFBMRSAgICAgICAgICAgIDB4NDIxNAorIwlkZWZpbmUgUjMwMF9HQV9UUklBTkdMRV9TVElQUExFX1hfU0hJRlRfU0hJRlQgMAorIwlkZWZpbmUgUjMwMF9HQV9UUklBTkdMRV9TVElQUExFX1hfU0hJRlRfTUFTSyAgMHgwMDAwMDAwZgorIwlkZWZpbmUgUjMwMF9HQV9UUklBTkdMRV9TVElQUExFX1lfU0hJRlRfU0hJRlQgMTYKKyMJZGVmaW5lIFIzMDBfR0FfVFJJQU5HTEVfU1RJUFBMRV9ZX1NISUZUX01BU0sgIDB4MDAwZjAwMDAKKworLyogVGhlIHBvaW50c2l6ZSBpcyBnaXZlbiBpbiBtdWx0aXBsZXMgb2YgNi4gVGhlIHBvaW50c2l6ZSBjYW4gYmUgZW5vcm1vdXM6CisgKiBDbGVhcigpIHJlbmRlcnMgYSBzaW5nbGUgcG9pbnQgdGhhdCBmaWxscyB0aGUgZW50aXJlIGZyYW1lYnVmZmVyLgorICogMS8yIEhlaWdodCBvZiBwb2ludDsgZml4ZWQgKDE2LjApLCBzdWJwaXhlbCBmb3JtYXQgKDEvMTIgb3IgMS8xNiwgZXZlbiBpZiBpbgorICogOGIgcHJlY2lzaW9uKS4KKyAqLworI2RlZmluZSBSMzAwX0dBX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgMHg0MjFDCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX1NISUZUICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9NQVNLICAgICAgICAgIDB4MDAwMGZmZmYKKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfU0hJRlQgICAgICAgICAxNgorIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9NQVNLICAgICAgICAgIDB4ZmZmZjAwMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX01BWCAgICAgICAgICAgICAoUjMwMF9QT0lOVFNJWkVfWV9NQVNLIC8gNikKIAotLyogVGhlIGxpbmUgd2lkdGggaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuCisvKiBCbHVlIGZpbGwgY29sb3IgKi8KKyNkZWZpbmUgUjUwMF9HQV9GSUxMX1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIyMAorCisvKiBCbHVlIGZpbGwgY29sb3IgKi8KKyNkZWZpbmUgUjUwMF9HQV9GSUxMX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIyNAorCisvKiBCbHVlIGZpbGwgY29sb3IgKi8KKyNkZWZpbmUgUjUwMF9HQV9GSUxMX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIyOAorCisvKiBBbHBoYSBmaWxsIGNvbG9yICovCisjZGVmaW5lIFI1MDBfR0FfRklMTF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMmMKKworCisvKiBTcGVjaWZpZXMgbWF4aW11bSBhbmQgbWluaW11bSBwb2ludCAmIHNwcml0ZSBzaXplcyBmb3IgcGVyIHZlcnRleCBzaXplCisgKiBzcGVjaWZpY2F0aW9uLiBUaGUgbG93ZXIgcGFydCAoMTU6MCkgaXMgTUlOIGFuZCAoMzE6MTYpIGlzIG1heC4KKyAqLworI2RlZmluZSBSMzAwX0dBX1BPSU5UX01JTk1BWCAgICAgICAgICAgICAgICAweDQyMzAKKyMgICAgICAgZGVmaW5lIFIzMDBfR0FfUE9JTlRfTUlOTUFYX01JTl9TSElGVCAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0dBX1BPSU5UX01JTk1BWF9NSU5fTUFTSyAgICAgICAgICAgKDB4RkZGRiA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9HQV9QT0lOVF9NSU5NQVhfTUFYX1NISUZUICAgICAgICAgIDE2CisjICAgICAgIGRlZmluZSBSMzAwX0dBX1BPSU5UX01JTk1BWF9NQVhfTUFTSyAgICAgICAgICAgKDB4RkZGRiA8PCAxNikKKworLyogMS8yIHdpZHRoIG9mIGxpbmUsIGluIHN1YnBpeGVscyAoMS8xMiBvciAxLzE2IG9ubHksIGV2ZW4gaW4gOGIKKyAqIHN1YnByZWNpc2lvbik7ICgxNi4wKSBmaXhlZCBmb3JtYXQuCisgKgorICogVGhlIGxpbmUgd2lkdGggaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuCiAgKiBJbiBkZWZhdWx0IG1vZGUgbGluZXMgYXJlIGNsYXNzaWZpZWQgYXMgdmVydGljYWwgbGluZXMuCiAgKiBITzogaG9yaXpvbnRhbAogICogVkU6IHZlcnRpY2FsIG9yIGhvcml6b250YWwKICAqIEhPICYgVkU6IG5vIGNsYXNzaWZpY2F0aW9uCiAgKi8KLSNkZWZpbmUgUjMwMF9SRV9MSU5FX0NOVCAgICAgICAgICAgICAgICAgICAgICAweDQyMzQKLSMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfU0hJRlQgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVggICAgICAgICAgICAgKFIzMDBfTElORVNJWkVfTUFTSyAvIDYpCisjZGVmaW5lIFIzMDBfR0FfTElORV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMzQKKyMgICAgICAgZGVmaW5lIFIzMDBfR0FfTElORV9DTlRMX1dJRFRIX1NISUZUICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfR0FfTElORV9DTlRMX1dJRFRIX01BU0sgICAgICAgIDB4MDAwMGZmZmYKKyMJZGVmaW5lIFIzMDBfR0FfTElORV9DTlRMX0VORF9UWVBFX0hPUiAgICAgICgwIDw8IDE2KQorIwlkZWZpbmUgUjMwMF9HQV9MSU5FX0NOVExfRU5EX1RZUEVfVkVSICAgICAgKDEgPDwgMTYpCisjCWRlZmluZSBSMzAwX0dBX0xJTkVfQ05UTF9FTkRfVFlQRV9TUVIgICAgICAoMiA8PCAxNikgLyogaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBkZXBlbmRpbmcgdXBvbiBzbG9wZSAqLworIwlkZWZpbmUgUjMwMF9HQV9MSU5FX0NOVExfRU5EX1RZUEVfQ09NUCAgICAgKDMgPDwgMTYpIC8qIENvbXB1dGVkIChwZXJwZW5kaWN1bGFyIHRvIHNsb3BlKSAqLworIwlkZWZpbmUgUjUwMF9HQV9MSU5FX0NOVExfU09SVF9OTyAgICAgICAgICAgKDAgPDwgMTgpCisjCWRlZmluZSBSNTAwX0dBX0xJTkVfQ05UTF9TT1JUX01JTlhfTUlOWSAgICAoMSA8PCAxOCkKKy8qKiBUT0RPOiBsb29rcyB3cm9uZyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVggICAgICAgICAgICAgIChSMzAwX0dBX0xJTkVfQ05UTF9XSURUSF9NQVNLIC8gNikKKy8qKiBUT0RPOiBsb29rcyB3cm9uZyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FX0NOVF9ITyAgICAgICAgICAgICAgICgxIDw8IDE2KQorLyoqIFRPRE86IGxvb2tzIHdyb25nICovCiAjICAgICAgIGRlZmluZSBSMzAwX0xJTkVfQ05UX1ZFICAgICAgICAgICAgICAgKDEgPDwgMTcpCiAKLS8qIFNvbWUgc29ydCBvZiBzY2FsZSBvciBjbGFtcCB2YWx1ZSBmb3IgdGV4Y29vcmRsZXNzIHRleHR1cmVzLiAqLwotI2RlZmluZSBSMzAwX1JFX1VOSzQyMzggICAgICAgICAgICAgICAgICAgICAgIDB4NDIzOAorLyogTGluZSBTdGlwcGxlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCisjZGVmaW5lIFIzMDBfR0FfTElORV9TVElQUExFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAweDQyMzgKKyMJZGVmaW5lIFIzMDBfR0FfTElORV9TVElQUExFX0NPTkZJR19MSU5FX1JFU0VUX05PICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQV9MSU5FX1NUSVBQTEVfQ09ORklHX0xJTkVfUkVTRVRfTElORSAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX0dBX0xJTkVfU1RJUFBMRV9DT05GSUdfTElORV9SRVNFVF9QQUNLRVQgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0FfTElORV9TVElQUExFX0NPTkZJR19TVElQUExFX1NDQUxFX1NISUZUIDIKKyMJZGVmaW5lIFIzMDBfR0FfTElORV9TVElQUExFX0NPTkZJR19TVElQUExFX1NDQUxFX01BU0sgIDB4ZmZmZmZmZmMKIAotLyogU29tZXRoaW5nIHNoYWRlIHJlbGF0ZWQgKi8KLSNkZWZpbmUgUjMwMF9SRV9TSEFERSAgICAgICAgICAgICAgICAgICAgICAgICAweDQyNzQKKy8qIFVzZWQgdG8gbG9hZCBVUyBpbnN0cnVjdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBSNTAwX0dBX1VTX1ZFQ1RPUl9JTkRFWCAgICAgICAgICAgICAgIDB4NDI1MAorIwlkZWZpbmUgUjUwMF9HQV9VU19WRUNUT1JfSU5ERVhfU0hJRlQgICAgICAgMAorIwlkZWZpbmUgUjUwMF9HQV9VU19WRUNUT1JfSU5ERVhfTUFTSyAgICAgICAgMHgwMDAwMDBmZgorIwlkZWZpbmUgUjUwMF9HQV9VU19WRUNUT1JfSU5ERVhfVFlQRV9JTlNUUiAgKDAgPDwgMTYpCisjCWRlZmluZSBSNTAwX0dBX1VTX1ZFQ1RPUl9JTkRFWF9UWVBFX0NPTlNUICAoMSA8PCAxNikKKyMJZGVmaW5lIFI1MDBfR0FfVVNfVkVDVE9SX0lOREVYX0NMQU1QX05PICAgICgwIDw8IDE3KQorIwlkZWZpbmUgUjUwMF9HQV9VU19WRUNUT1JfSU5ERVhfQ0xBTVBfQ09OU1QgKDEgPDwgMTcpCiAKLSNkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAweDQyNzgKLSMJZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUxfU01PT1RIICAgICAweDNhYWFhCi0jCWRlZmluZSBSMzAwX1JFX1NIQURFX01PREVMX0ZMQVQgICAgICAgMHgzOTU5NQorLyogRGF0YSByZWdpc3RlciBmb3IgbG9hZGluZyBVUyBpbnN0cnVjdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBSNTAwX0dBX1VTX1ZFQ1RPUl9EQVRBICAgICAgICAgICAgICAgIDB4NDI1NAogCi0vKiBEYW5nZXJvdXMgKi8KLSNkZWZpbmUgUjMwMF9SRV9QT0xZR09OX01PREUgICAgICAgICAgICAgICAgICAweDQyODgKLSMJZGVmaW5lIFIzMDBfUE1fRU5BQkxFRCAgICAgICAgICAgICAgICAoMSA8PCAwKQotIwlkZWZpbmUgUjMwMF9QTV9GUk9OVF9QT0lOVCAgICAgICAgICAgICgwIDw8IDApCi0jCWRlZmluZSBSMzAwX1BNX0JBQ0tfUE9JTlQgICAgICAgICAgICAgKDAgPDwgMCkKLSMJZGVmaW5lIFIzMDBfUE1fRlJPTlRfTElORSAgICAgICAgICAgICAoMSA8PCA0KQotIwlkZWZpbmUgUjMwMF9QTV9GUk9OVF9GSUxMICAgICAgICAgICAgICgxIDw8IDUpCi0jCWRlZmluZSBSMzAwX1BNX0JBQ0tfTElORSAgICAgICAgICAgICAgKDEgPDwgNykKLSMJZGVmaW5lIFIzMDBfUE1fQkFDS19GSUxMICAgICAgICAgICAgICAoMSA8PCA4KQorLyogU3BlY2lmaWVzIGNvbG9yIHByb3BlcnRpZXMgYW5kIG1hcHBpbmdzIG9mIHRleHR1cmVzLiAqLworI2RlZmluZSBSNTAwX0dBX0NPTE9SX0NPTlRST0xfUFMzICAgICAgICAgICAgICAgICAgICAgMHg0MjU4CisjCWRlZmluZSBSNTAwX1RFWDBfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFI1MDBfVEVYMF9TSEFESU5HX1BTM19GTEFUICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjUwMF9URVgwX1NIQURJTkdfUFMzX0dPVVJBVUQgICAgICgyIDw8IDApCisjCWRlZmluZSBSNTAwX1RFWDFfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMikKKyMJZGVmaW5lIFI1MDBfVEVYMV9TSEFESU5HX1BTM19GTEFUICAgICAgICAoMSA8PCAyKQorIwlkZWZpbmUgUjUwMF9URVgxX1NIQURJTkdfUFMzX0dPVVJBVUQgICAgICgyIDw8IDIpCisjCWRlZmluZSBSNTAwX1RFWDJfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgNCkKKyMJZGVmaW5lIFI1MDBfVEVYMl9TSEFESU5HX1BTM19GTEFUICAgICAgICAoMSA8PCA0KQorIwlkZWZpbmUgUjUwMF9URVgyX1NIQURJTkdfUFMzX0dPVVJBVUQgICAgICgyIDw8IDQpCisjCWRlZmluZSBSNTAwX1RFWDNfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgNikKKyMJZGVmaW5lIFI1MDBfVEVYM19TSEFESU5HX1BTM19GTEFUICAgICAgICAoMSA8PCA2KQorIwlkZWZpbmUgUjUwMF9URVgzX1NIQURJTkdfUFMzX0dPVVJBVUQgICAgICgyIDw8IDYpCisjCWRlZmluZSBSNTAwX1RFWDRfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgOCkKKyMJZGVmaW5lIFI1MDBfVEVYNF9TSEFESU5HX1BTM19GTEFUICAgICAgICAoMSA8PCA4KQorIwlkZWZpbmUgUjUwMF9URVg0X1NIQURJTkdfUFMzX0dPVVJBVUQgICAgICgyIDw8IDgpCisjCWRlZmluZSBSNTAwX1RFWDVfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMTApCisjCWRlZmluZSBSNTAwX1RFWDVfU0hBRElOR19QUzNfRkxBVCAgICAgICAgKDEgPDwgMTApCisjCWRlZmluZSBSNTAwX1RFWDVfU0hBRElOR19QUzNfR09VUkFVRCAgICAgKDIgPDwgMTApCisjCWRlZmluZSBSNTAwX1RFWDZfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMTIpCisjCWRlZmluZSBSNTAwX1RFWDZfU0hBRElOR19QUzNfRkxBVCAgICAgICAgKDEgPDwgMTIpCisjCWRlZmluZSBSNTAwX1RFWDZfU0hBRElOR19QUzNfR09VUkFVRCAgICAgKDIgPDwgMTIpCisjCWRlZmluZSBSNTAwX1RFWDdfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMTQpCisjCWRlZmluZSBSNTAwX1RFWDdfU0hBRElOR19QUzNfRkxBVCAgICAgICAgKDEgPDwgMTQpCisjCWRlZmluZSBSNTAwX1RFWDdfU0hBRElOR19QUzNfR09VUkFVRCAgICAgKDIgPDwgMTQpCisjCWRlZmluZSBSNTAwX1RFWDhfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMTYpCisjCWRlZmluZSBSNTAwX1RFWDhfU0hBRElOR19QUzNfRkxBVCAgICAgICAgKDEgPDwgMTYpCisjCWRlZmluZSBSNTAwX1RFWDhfU0hBRElOR19QUzNfR09VUkFVRCAgICAgKDIgPDwgMTYpCisjCWRlZmluZSBSNTAwX1RFWDlfU0hBRElOR19QUzNfU09MSUQgICAgICAgKDAgPDwgMTgpCisjCWRlZmluZSBSNTAwX1RFWDlfU0hBRElOR19QUzNfRkxBVCAgICAgICAgKDEgPDwgMTgpCisjCWRlZmluZSBSNTAwX1RFWDlfU0hBRElOR19QUzNfR09VUkFVRCAgICAgKDIgPDwgMTgpCisjCWRlZmluZSBSNTAwX1RFWDEwX1NIQURJTkdfUFMzX1NPTElEICAgICAgKDAgPDwgMjApCisjCWRlZmluZSBSNTAwX1RFWDEwX1NIQURJTkdfUFMzX0ZMQVQgICAgICAgKDEgPDwgMjApCisjCWRlZmluZSBSNTAwX1RFWDEwX1NIQURJTkdfUFMzX0dPVVJBVUQgICAgKDIgPDwgMjApCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfTk8gICAgICAgKDAgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzAgICAgKDEgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzEgICAgKDIgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzIgICAgKDMgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzMgICAgKDQgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzQgICAgKDUgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzUgICAgKDYgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzYgICAgKDcgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzcgICAgKDggPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzhfQzIgKDkgPDwgMjIpCisjCWRlZmluZSBSNTAwX0NPTE9SMF9URVhfT1ZFUlJJREVfVEVYXzlfQzMgKDEwIDw8IDIyKQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX05PICAgICAgICgwIDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF8wICAgICgxIDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF8xICAgICgyIDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF8yICAgICgzIDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF8zICAgICg0IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF80ICAgICg1IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF81ICAgICg2IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF82ICAgICg3IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF83ICAgICg4IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF84X0MyICg5IDw8IDI2KQorIwlkZWZpbmUgUjUwMF9DT0xPUjFfVEVYX09WRVJSSURFX1RFWF85X0MzICgxMCA8PCAyNikKIAotLyogRm9nIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgUjMwMF9SRV9GT0dfU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDQyOTQKLSNkZWZpbmUgUjMwMF9SRV9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDQyOTgKKy8qIFJldHVybnMgaWRsZSBzdGF0dXMgb2YgdmFyaW91cyBHM0QgYmxvY2ssIGNhcHR1cmVkIHdoZW4gR0FfSURMRSB3cml0dGVuIG9yCisgKiB3aGVuIGhhcmQgb3Igc29mdCByZXNldCBhc3NlcnRlZC4KKyAqLworI2RlZmluZSBSNTAwX0dBX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjVjCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTNfWl9JRExFICAoMCA8PCAwKQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUyX1pfSURMRSAgKDAgPDwgMSkKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFM19DRF9JRExFICgwIDw8IDIpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTJfQ0RfSURMRSAoMCA8PCAzKQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUzX0ZHX0lETEUgKDAgPDwgNCkKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFMl9GR19JRExFICgwIDw8IDUpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTNfVVNfSURMRSAoMCA8PCA2KQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUyX1VTX0lETEUgKDAgPDwgNykKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFM19TQ19JRExFICgwIDw8IDgpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTJfU0NfSURMRSAoMCA8PCA5KQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUzX1JTX0lETEUgKDAgPDwgMTApCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTJfUlNfSURMRSAoMCA8PCAxMSkKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFMV9aX0lETEUgICgwIDw8IDEyKQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUwX1pfSURMRSAgKDAgPDwgMTMpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTFfQ0RfSURMRSAoMCA8PCAxNCkKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFMF9DRF9JRExFICgwIDw8IDE1KQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUxX0ZHX0lETEUgKDAgPDwgMTYpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTBfRkdfSURMRSAoMCA8PCAxNykKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFMV9VU19JRExFICgwIDw8IDE4KQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUwX1VTX0lETEUgKDAgPDwgMTkpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTFfU0NfSURMRSAoMCA8PCAyMCkKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9QSVBFMF9TQ19JRExFICgwIDw8IDIxKQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX1BJUEUxX1JTX0lETEUgKDAgPDwgMjIpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfUElQRTBfUlNfSURMRSAoMCA8PCAyMykKKyMJZGVmaW5lIFI1MDBfR0FfSURMRV9TVV9JRExFICAgICAgICgwIDw8IDI0KQorIwlkZWZpbmUgUjUwMF9HQV9JRExFX0dBX0lETEUgICAgICAgKDAgPDwgMjUpCisjCWRlZmluZSBSNTAwX0dBX0lETEVfR0FfVU5JVDJfSURMRSAoMCA8PCAyNikKKworLyogQ3VycmVudCB2YWx1ZSBvZiBzdGlwcGxlIGFjY3VtdWxhdG9yLiAqLworI2RlZmluZSBSMzAwX0dBX0xJTkVfU1RJUFBMRV9WQUxVRSAgICAgICAgICAgIDB4NDI2MAorCisvKiBTIFRleHR1cmUgQ29vcmRpbmF0ZSBWYWx1ZSBmb3IgVmVydGV4IDAgb2YgTGluZSAoc3R1ZmYgdGV4dHVyZXMgLS0gaS5lLiBBQSkgKi8KKyNkZWZpbmUgUjMwMF9HQV9MSU5FX1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDI2NAorLyogUyBUZXh0dXJlIENvb3JkaW5hdGUgVmFsdWUgZm9yIFZlcnRleCAxIG9mIExpbmVzIChWMiBvZiBwYXJhbGxlbG9ncmFtIC0tIHN0dWZmIHRleHR1cmVzIC0tIGkuZS4gQUEpICovCisjZGVmaW5lIFIzMDBfR0FfTElORV9TMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyNjgKKworLyogR0EgSW5wdXQgZmlmbyBoaWdoIHdhdGVyIG1hcmtzICovCisjZGVmaW5lIFI1MDBfR0FfRklGT19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyNzAKKyMJZGVmaW5lIFI1MDBfR0FfRklGT19DTlRMX1ZFUlRFWF9GSUZPX01BU0sgICAweDAwMDAwMDA3CisjCWRlZmluZSBSNTAwX0dBX0ZJRk9fQ05UTF9WRVJURVhfRklGT19TSElGVCAgMAorIwlkZWZpbmUgUjUwMF9HQV9GSUZPX0NOVExfVkVSVEVYX0lOREVYX01BU0sgIDB4MDAwMDAwMzgKKyMJZGVmaW5lIFI1MDBfR0FfRklGT19DTlRMX1ZFUlRFWF9JTkRFWF9TSElGVCAzCisjCWRlZmluZSBSNTAwX0dBX0ZJRk9fQ05UTF9WRVJURVhfUkVHX01BU0sgICAgMHgwMDAwM2ZjMAorIwlkZWZpbmUgUjUwMF9HQV9GSUZPX0NOVExfVkVSVEVYX1JFR19TSElGVCAgIDYKKworLyogR0EgZW5oYW5jZS90d2Vha3MgKi8KKyNkZWZpbmUgUjMwMF9HQV9FTkhBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDI3NAorIwlkZWZpbmUgUjMwMF9HQV9FTkhBTkNFX0RFQURMT0NLX0NOVExfTk9fRUZGRUNUICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0FfRU5IQU5DRV9ERUFETE9DS19DTlRMX1BSRVZFTlRfVENMICgxIDw8IDApIC8qIFByZXZlbnRzIFRDTCBpbnRlcmZhY2UgZnJvbSBkZWFkbG9ja2luZyBvbiBHQSBzaWRlLiAqLworIwlkZWZpbmUgUjMwMF9HQV9FTkhBTkNFX0ZBU1RTWU5DX0NOVExfTk9fRUZGRUNUICAgKDAgPDwgMSkKKyMJZGVmaW5lIFIzMDBfR0FfRU5IQU5DRV9GQVNUU1lOQ19DTlRMX0VOQUJMRSAgICAgICgxIDw8IDEpIC8qIEVuYWJsZXMgaGlnaC1wZXJmb3JtYW5jZSByZWdpc3Rlci9wcmltaXRpdmUgc3dpdGNoaW5nLiAqLworIwlkZWZpbmUgUjUwMF9HQV9FTkhBTkNFX1JFR19SRUFEV1JJVEVfTk9fRUZGRUNUICAgKDAgPDwgMikgLyogUjUyMCsgb25seSAqLworIwlkZWZpbmUgUjUwMF9HQV9FTkhBTkNFX1JFR19SRUFEV1JJVEVfRU5BQkxFICAgICAgKDEgPDwgMikgLyogUjUyMCsgb25seSwgRW5hYmxlcyBHQSBzdXBwb3J0IG9mIHNpbXVsdGFuZW91cyByZWdpc3RlciByZWFkcyBhbmQgd3JpdGVzLiAqLworIwlkZWZpbmUgUjUwMF9HQV9FTkhBTkNFX1JFR19OT1NUQUxMX05PX0VGRkVDVCAgICAgKDAgPDwgMykKKyMJZGVmaW5lIFI1MDBfR0FfRU5IQU5DRV9SRUdfTk9TVEFMTF9FTkFCTEUgICAgICAgICgxIDw8IDMpIC8qIEVuYWJsZXMgR0Egc3VwcG9ydCBvZiBuby1zdGFsbCByZWFkcyBmb3IgcmVnaXN0ZXIgcmVhZCBiYWNrLiAqLworCisjZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAweDQyNzgKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IwX1NIQURJTkdfU09MSUQgICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQV9DT0xPUl9DT05UUk9MX1JHQjBfU0hBRElOR19GTEFUICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMF9TSEFESU5HX0dPVVJBVUQgICAgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTBfU0hBRElOR19TT0xJRCAgICAoMCA8PCAyKQorIwlkZWZpbmUgUjMwMF9HQV9DT0xPUl9DT05UUk9MX0FMUEhBMF9TSEFESU5HX0ZMQVQgICAgICgxIDw8IDIpCisjCWRlZmluZSBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEEwX1NIQURJTkdfR09VUkFVRCAgKDIgPDwgMikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IxX1NIQURJTkdfU09MSUQgICAgICAoMCA8PCA0KQorIwlkZWZpbmUgUjMwMF9HQV9DT0xPUl9DT05UUk9MX1JHQjFfU0hBRElOR19GTEFUICAgICAgICgxIDw8IDQpCisjCWRlZmluZSBSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMV9TSEFESU5HX0dPVVJBVUQgICAgKDIgPDwgNCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTFfU0hBRElOR19TT0xJRCAgICAoMCA8PCA2KQorIwlkZWZpbmUgUjMwMF9HQV9DT0xPUl9DT05UUk9MX0FMUEhBMV9TSEFESU5HX0ZMQVQgICAgICgxIDw8IDYpCisjCWRlZmluZSBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEExX1NIQURJTkdfR09VUkFVRCAgKDIgPDwgNikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IyX1NIQURJTkdfU09MSUQgICAgICAoMCA8PCA4KQorIwlkZWZpbmUgUjMwMF9HQV9DT0xPUl9DT05UUk9MX1JHQjJfU0hBRElOR19GTEFUICAgICAgICgxIDw8IDgpCisjCWRlZmluZSBSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMl9TSEFESU5HX0dPVVJBVUQgICAgKDIgPDwgOCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTJfU0hBRElOR19TT0xJRCAgICAoMCA8PCAxMCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTJfU0hBRElOR19GTEFUICAgICAoMSA8PCAxMCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTJfU0hBRElOR19HT1VSQVVEICAoMiA8PCAxMCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IzX1NIQURJTkdfU09MSUQgICAgICAoMCA8PCAxMikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IzX1NIQURJTkdfRkxBVCAgICAgICAoMSA8PCAxMikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IzX1NIQURJTkdfR09VUkFVRCAgICAoMiA8PCAxMikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTNfU0hBRElOR19TT0xJRCAgICAoMCA8PCAxNCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTNfU0hBRElOR19GTEFUICAgICAoMSA8PCAxNCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTNfU0hBRElOR19HT1VSQVVEICAoMiA8PCAxNCkKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9QUk9WT0tJTkdfVkVSVEVYX0ZJUlNUICAoMCA8PCAxNikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9QUk9WT0tJTkdfVkVSVEVYX1NFQ09ORCAoMSA8PCAxNikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9QUk9WT0tJTkdfVkVSVEVYX1RISVJEICAoMiA8PCAxNikKKyMJZGVmaW5lIFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9QUk9WT0tJTkdfVkVSVEVYX0xBU1QgICAoMyA8PCAxNikKKworLyoqIFRPRE86IG1pZ2h0IGJlIGNhbmRpZGF0ZSBmb3IgcmVtb3ZhbCAqLworIwlkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTF9TTU9PVEggICAgICggXAorCVIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IwX1NIQURJTkdfR09VUkFVRCB8IFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTBfU0hBRElOR19HT1VSQVVEIHwgXAorCVIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IxX1NIQURJTkdfR09VUkFVRCB8IFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTFfU0hBRElOR19HT1VSQVVEIHwgXAorCVIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IyX1NIQURJTkdfR09VUkFVRCB8IFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTJfU0hBRElOR19HT1VSQVVEIHwgXAorCVIzMDBfR0FfQ09MT1JfQ09OVFJPTF9SR0IzX1NIQURJTkdfR09VUkFVRCB8IFIzMDBfR0FfQ09MT1JfQ09OVFJPTF9BTFBIQTNfU0hBRElOR19HT1VSQVVEIHwgXAorCVIzMDBfR0FfQ09MT1JfQ09OVFJPTF9QUk9WT0tJTkdfVkVSVEVYX0xBU1QgKQorLyoqIFRPRE86IG1pZ2h0IGJlIGNhbmRpZGF0ZSBmb3IgcmVtb3ZhbCwgdGhlIEdPVVJBVUQgc3R1ZmYgYWxzbyBsb29rcyBidWdneSB0byBtZSAqLworIwlkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTF9GTEFUICAgICAoIFwKKwlSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMF9TSEFESU5HX0ZMQVQgfCBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEEwX1NIQURJTkdfRkxBVCB8IFwKKwlSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMV9TSEFESU5HX0ZMQVQgfCBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEExX1NIQURJTkdfR09VUkFVRCB8IFwKKwlSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCMl9TSEFESU5HX0ZMQVQgfCBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEEyX1NIQURJTkdfRkxBVCB8IFwKKwlSMzAwX0dBX0NPTE9SX0NPTlRST0xfUkdCM19TSEFESU5HX0ZMQVQgfCBSMzAwX0dBX0NPTE9SX0NPTlRST0xfQUxQSEEzX1NIQURJTkdfR09VUkFVRCB8IFwKKwlSMzAwX0dBX0NPTE9SX0NPTlRST0xfUFJPVk9LSU5HX1ZFUlRFWF9MQVNUICkKKworLyogU3BlY2lmaWVzIHJlZCAmIGdyZWVuIGNvbXBvbmVudHMgb2YgZmlsbCBjb2xvciAtLSBTMzEyIGZvcm1hdCAtLSBCYWNrd2FyZHMgY29tcC4gKi8KKyNkZWZpbmUgUjMwMF9HQV9TT0xJRF9SRyAgICAgICAgICAgICAgICAgICAgICAgICAweDQyN2MKKyMJZGVmaW5lIEdBX1NPTElEX1JHX0NPTE9SX0dSRUVOX1NISUZUIDAKKyMJZGVmaW5lIEdBX1NPTElEX1JHX0NPTE9SX0dSRUVOX01BU0sgIDB4MDAwMGZmZmYKKyMJZGVmaW5lIEdBX1NPTElEX1JHX0NPTE9SX1JFRF9TSElGVCAgIDE2CisjCWRlZmluZSBHQV9TT0xJRF9SR19DT0xPUl9SRURfTUFTSyAgICAweGZmZmYwMDAwCisvKiBTcGVjaWZpZXMgYmx1ZSAmIGFscGhhIGNvbXBvbmVudHMgb2YgZmlsbCBjb2xvciAtLSBTMzEyIGZvcm1hdCAtLSBCYWNrd2FyZHMgY29tcC4gKi8KKyNkZWZpbmUgUjMwMF9HQV9TT0xJRF9CQSAgICAgICAgICAgICAgICAgICAgICAgICAweDQyODAKKyMJZGVmaW5lIEdBX1NPTElEX0JBX0NPTE9SX0FMUEhBX1NISUZUIDAKKyMJZGVmaW5lIEdBX1NPTElEX0JBX0NPTE9SX0FMUEhBX01BU0sgIDB4MDAwMGZmZmYKKyMJZGVmaW5lIEdBX1NPTElEX0JBX0NPTE9SX0JMVUVfU0hJRlQgIDE2CisjCWRlZmluZSBHQV9TT0xJRF9CQV9DT0xPUl9CTFVFX01BU0sgICAweGZmZmYwMDAwCisKKy8qIFBvbHlnb24gTW9kZQorICogRGFuZ2Vyb3VzCisgKi8KKyNkZWZpbmUgUjMwMF9HQV9QT0xZX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDI4OAorIwlkZWZpbmUgUjMwMF9HQV9QT0xZX01PREVfRElTQUJMRSAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfR0FfUE9MWV9NT0RFX0RVQUwgICAgICAgICAgICAgICgxIDw8IDApIC8qIHNlbmQgMiBzZXRzIG9mIDMgcG9seXMgd2l0aCBzcGVjaWZpZWQgcG9seSB0eXBlICovCisvKiByZXNlcnZlZCAqLworIwlkZWZpbmUgUjMwMF9HQV9QT0xZX01PREVfRlJPTlRfUFRZUEVfUE9JTlQgKDAgPDwgNCkKKyMJZGVmaW5lIFIzMDBfR0FfUE9MWV9NT0RFX0ZST05UX1BUWVBFX0xJTkUgICgxIDw8IDQpCisjCWRlZmluZSBSMzAwX0dBX1BPTFlfTU9ERV9GUk9OVF9QVFlQRV9UUkkgICAoMiA8PCA0KQorLyogcmVzZXJ2ZWQgKi8KKyMJZGVmaW5lIFIzMDBfR0FfUE9MWV9NT0RFX0JBQ0tfUFRZUEVfUE9JTlQgICgwIDw8IDcpCisjCWRlZmluZSBSMzAwX0dBX1BPTFlfTU9ERV9CQUNLX1BUWVBFX0xJTkUgICAoMSA8PCA3KQorIwlkZWZpbmUgUjMwMF9HQV9QT0xZX01PREVfQkFDS19QVFlQRV9UUkkgICAgKDIgPDwgNykKKy8qIHJlc2VydmVkICovCisKKy8qIFNwZWNpZmllcyB0aGUgcm91ZGluZyBtb2RlIGZvciBnZW9tZXRyeSAmIGNvbG9yIFNQRlAgdG8gRlAgY29udmVyc2lvbnMuICovCisjZGVmaW5lIFIzMDBfR0FfUk9VTkRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyOGMKKyMJZGVmaW5lIFIzMDBfR0FfUk9VTkRfTU9ERV9HRU9NRVRSWV9ST1VORF9UUlVOQyAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0dBX1JPVU5EX01PREVfR0VPTUVUUllfUk9VTkRfTkVBUkVTVCAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9HQV9ST1VORF9NT0RFX0NPTE9SX1JPVU5EX1RSVU5DICAgICAgKDAgPDwgMikKKyMJZGVmaW5lIFIzMDBfR0FfUk9VTkRfTU9ERV9DT0xPUl9ST1VORF9ORUFSRVNUICAgICgxIDw8IDIpCisjCWRlZmluZSBSMzAwX0dBX1JPVU5EX01PREVfUkdCX0NMQU1QX1JHQiAgICAgICAgICAoMCA8PCA0KQorIwlkZWZpbmUgUjMwMF9HQV9ST1VORF9NT0RFX1JHQl9DTEFNUF9GUDIwICAgICAgICAgKDEgPDwgNCkKKyMJZGVmaW5lIFIzMDBfR0FfUk9VTkRfTU9ERV9BTFBIQV9DTEFNUF9SR0IgICAgICAgICgwIDw8IDUpCisjCWRlZmluZSBSMzAwX0dBX1JPVU5EX01PREVfQUxQSEFfQ0xBTVBfRlAyMCAgICAgICAoMSA8PCA1KQorIwlkZWZpbmUgUjUwMF9HQV9ST1VORF9NT0RFX0dFT01FVFJZX01BU0tfU0hJRlQgICAgNgorIwlkZWZpbmUgUjUwMF9HQV9ST1VORF9NT0RFX0dFT01FVFJZX01BU0tfTUFTSyAgICAgMHgwMDAwMDNjMAorCisvKiBTcGVjaWZpZXMgeCAmIHkgb2Zmc2V0cyBmb3IgdmVydGV4IGRhdGEgYWZ0ZXIgY29udmVyc2lvbiB0byBGUC4KKyAqIE9mZnNldHMgYXJlIGluIFMxNSBmb3JtYXQgKHN1YnBpeGVscyAtLSAxLzEyIG9yIDEvMTYsIGV2ZW4gaW4gOGIKKyAqIHN1YnByZWNpc2lvbikuCisgKi8KKyNkZWZpbmUgUjMwMF9HQV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDI5MAorIwlkZWZpbmUgUjMwMF9HQV9PRkZTRVRfWF9PRkZTRVRfU0hJRlQgMAorIwlkZWZpbmUgUjMwMF9HQV9PRkZTRVRfWF9PRkZTRVRfTUFTSyAgMHgwMDAwZmZmZgorIwlkZWZpbmUgUjMwMF9HQV9PRkZTRVRfWV9PRkZTRVRfU0hJRlQgMTYKKyMJZGVmaW5lIFIzMDBfR0FfT0ZGU0VUX1lfT0ZGU0VUX01BU0sgIDB4ZmZmZjAwMDAKKworLyogU3BlY2lmaWVzIHRoZSBzY2FsZSB0byBhcHBseSB0byBmb2cuICovCisjZGVmaW5lIFIzMDBfR0FfRk9HX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMHg0Mjk0CisvKiBTcGVjaWZpZXMgdGhlIG9mZnNldCB0byBhcHBseSB0byBmb2cuICovCisjZGVmaW5lIFIzMDBfR0FfRk9HX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHg0Mjk4CisvKiBTcGVjaWZpZXMgbnVtYmVyIG9mIGN5Y2xlcyB0byBhc3NlcnQgcmVzZXQsIGFuZCBhbHNvIGNhdXNlcyBSQjNEIHNvZnQgcmVzZXQgdG8gYXNzZXJ0LiAqLworI2RlZmluZSBSMzAwX0dBX1NPRlRfUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4NDI5YwogCiAvKiBOb3Qgc3VyZSB3aHkgdGhlcmUgYXJlIGR1cGxpY2F0ZSBvZiBmYWN0b3IgYW5kIGNvbnN0YW50IHZhbHVlcy4KICAqIE15IGJlc3QgZ3Vlc3Mgc28gZmFyIGlzIHRoYXQgdGhlcmUgYXJlIHNlcGVyYXRlIHpiaWFzZXMgZm9yIHRlc3QgYW5kIHdyaXRlLgpAQCAtNjE1LDExICsxMDk3LDExIEBACiAgKiBTb21lIG9mIHRoZSB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGZnbCBoYXMgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiB6YmlhcwogICogdmlhIHBpeGVsIHNoYWRlcnMuCiAgKi8KLSNkZWZpbmUgUjMwMF9SRV9aQklBU19DTlRMICAgICAgICAgICAgICAgICAgICAweDQyQTAgLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQTQKLSNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQTgKLSNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQUMKLSNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQjAKKyNkZWZpbmUgUjMwMF9TVV9URVhfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDQyQTAKKyNkZWZpbmUgUjMwMF9TVV9QT0xZX09GRlNFVF9GUk9OVF9TQ0FMRSAgICAgICAweDQyQTQKKyNkZWZpbmUgUjMwMF9TVV9QT0xZX09GRlNFVF9GUk9OVF9PRkZTRVQgICAgICAweDQyQTgKKyNkZWZpbmUgUjMwMF9TVV9QT0xZX09GRlNFVF9CQUNLX1NDQUxFICAgICAgICAweDQyQUMKKyNkZWZpbmUgUjMwMF9TVV9QT0xZX09GRlNFVF9CQUNLX09GRlNFVCAgICAgICAweDQyQjAKIAogLyogVGhpcyByZWdpc3RlciBuZWVkcyB0byBiZSBzZXQgdG8gKDE8PDEpIGZvciBSVjM1MCB0byBjb3JyZWN0bHkKICAqIHBlcmZvcm0gZGVwdGggdGVzdCAoc2VlIC0tdmItdHJpYW5nbGVzIGluIHIzMDBfZGVtbykKQEAgLTYzMCwzMSArMTExMiw0NCBAQAogICogIE9uZSB0byBlbmFibGUgZGVwdGggdGVzdCBhbmQgb25lIGZvciBkZXB0aCB3cml0ZS4KICAqIFlldCB0aGlzIGRvZXNudCBleHBsYWluIHdoeSBkZXB0aCB3cml0ZXMgd29yayAuLi4KICAqLwotI2RlZmluZSBSMzAwX1JFX09DQ0xVU0lPTl9DTlRMCQkgICAgMHg0MkI0Ci0jCWRlZmluZSBSMzAwX09DQ0xVU0lPTl9PTgkJKDE8PDEpCisjZGVmaW5lIFIzMDBfU1VfUE9MWV9PRkZTRVRfRU5BQkxFCSAgICAgICAweDQyQjQKKyMJZGVmaW5lIFIzMDBfRlJPTlRfRU5BQkxFCSAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9CQUNLX0VOQUJMRSAJICAgICAgICgxIDw8IDEpCisjCWRlZmluZSBSMzAwX1BBUkFfRU5BQkxFIAkgICAgICAgKDEgPDwgMikKIAotI2RlZmluZSBSMzAwX1JFX0NVTExfQ05UTCAgICAgICAgICAgICAgICAgICAweDQyQjgKKyNkZWZpbmUgUjMwMF9TVV9DVUxMX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg0MkI4CiAjICAgICAgIGRlZmluZSBSMzAwX0NVTExfRlJPTlQgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfQ1VMTF9CQUNLICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUk9OVF9GQUNFX0NDVyAgICAgICAgICAgICAgICgwIDw8IDIpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZST05UX0ZBQ0VfQ1cgICAgICAgICAgICAgICAgKDEgPDwgMikKIAorLyogU1UgRGVwdGggU2NhbGUgdmFsdWUgKi8KKyNkZWZpbmUgUjMwMF9TVV9ERVBUSF9TQ0FMRSAgICAgICAgICAgICAgICAgMHg0MmMwCisvKiBTVSBEZXB0aCBPZmZzZXQgdmFsdWUgKi8KKyNkZWZpbmUgUjMwMF9TVV9ERVBUSF9PRkZTRVQgICAgICAgICAgICAgICAgMHg0MmM0CisKIAogLyogQkVHSU46IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCiAKLS8qIDBfVU5LTk9XTl8xOCBoYXMgYWx3YXlzIGJlZW4gc2V0IGV4Y2VwdCBmb3IgY2xlYXIgb3BlcmF0aW9ucy4KKy8qCiAgKiBUQ19DTlQgaXMgdGhlIG51bWJlciBvZiBpbmNvbWluZyB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyAoaS5lLiBpdCBkZXBlbmRzCiAgKiBvbiB0aGUgdmVydGV4IHByb2dyYW0sICpub3QqIHRoZSBmcmFnbWVudCBwcm9ncmFtKQogICovCi0jZGVmaW5lIFIzMDBfUlNfQ05UTF8wICAgICAgICAgICAgICAgICAgICAgIDB4NDMwMAotIyAgICAgICBkZWZpbmUgUjMwMF9SU19DTlRMX1RDX0NOVF9TSElGVCAgICAgICAgIDIKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfQ05UTF9UQ19DTlRfTUFTSyAgICAgICAgICAoNyA8PCAyKQotCS8qIG51bWJlciBvZiBjb2xvciBpbnRlcnBvbGF0b3JzIHVzZWQgKi8KLSMJZGVmaW5lIFIzMDBfUlNfQ05UTF9DSV9DTlRfU0hJRlQgICAgICAgICA3Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfMF9VTktOT1dOXzE4ICAgICAgICAgKDEgPDwgMTgpCi0JLyogR3Vlc3M6IFJTX0NOVExfMSBob2xkcyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCBSU19ST1VURV9uCi0JICAgcmVnaXN0ZXIuICovCi0jZGVmaW5lIFIzMDBfUlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgIDB4NDMwNAorI2RlZmluZSBSMzAwX1JTX0NPVU5UICAgICAgICAgICAgICAgICAgICAgIDB4NDMwMAorIyAgICAgICBkZWZpbmUgUjMwMF9JVF9DT1VOVF9TSElGVCAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfSVRfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDdmCisjICAgICAgIGRlZmluZSBSMzAwX0lDX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgNworIyAgICAgICBkZWZpbmUgUjMwMF9JQ19DT1VOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDA3ODAKKyMgICAgICAgZGVmaW5lIFIzMDBfV19BRERSX1NISUZUICAgICAgICAgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9XX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwM2YwMDAKKyMgICAgICAgZGVmaW5lIFIzMDBfSElSRVNfRElTICAgICAgICAgICAgICAgICAgICAoMCA8PCAxOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfSElSRVNfRU4gICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkKKworI2RlZmluZSBSMzAwX1JTX0lOU1RfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDB4NDMwNAorIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlNUX0NPVU5UX1NISUZUICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5TVF9DT1VOVF9NQVNLICAgICAgICAgICAweDAwMDAwMDBmCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1RYX09GRlNFVF9TSElGVCAgICAgICAgICAgNQorIwlkZWZpbmUgUjMwMF9SU19UWF9PRkZTRVRfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZTAKIAogLyogZ2FwICovCiAKQEAgLTY3MSw2MyArMTE2NiwxMDggQEAKICAqIE5vdGU6IFRoZSBfVU5LTk9XTiBjb25zdGFudHMgYXJlIGFsd2F5cyBzZXQgaW4gdGhlaXIgcmVzcGVjdGl2ZQogICogcmVnaXN0ZXIuIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4KICAqLwotI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8wICAgICAgICAgICAgICAgICAgICAweDQzMTAKLSNkZWZpbmUgUjMwMF9SU19JTlRFUlBfMSAgICAgICAgICAgICAgICAgICAgMHg0MzE0Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF8xX1VOS05PV04gICAgICAgICAgMHg0MAotI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8yICAgICAgICAgICAgICAgICAgICAweDQzMTgKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQXzJfVU5LTk9XTiAgICAgICAgICAweDgwCi0jZGVmaW5lIFIzMDBfUlNfSU5URVJQXzMgICAgICAgICAgICAgICAgICAgIDB4NDMxQwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfM19VTktOT1dOICAgICAgICAgIDB4QzAKLSNkZWZpbmUgUjMwMF9SU19JTlRFUlBfNCAgICAgICAgICAgICAgICAgICAgMHg0MzIwCi0jZGVmaW5lIFIzMDBfUlNfSU5URVJQXzUgICAgICAgICAgICAgICAgICAgIDB4NDMyNAotI2RlZmluZSBSMzAwX1JTX0lOVEVSUF82ICAgICAgICAgICAgICAgICAgICAweDQzMjgKLSNkZWZpbmUgUjMwMF9SU19JTlRFUlBfNyAgICAgICAgICAgICAgICAgICAgMHg0MzJDCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF9TUkNfU0hJRlQgICAgICAgICAgMgotIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfU1JDX01BU0sgICAgICAgICAgICg3IDw8IDIpCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF9VU0VEICAgICAgICAgICAgICAgMHgwMEQxMDAwMAorI2RlZmluZSBSMzAwX1JTX0lQXzAJCQkJICAgICAgICAweDQzMTAKKyNkZWZpbmUgUjMwMF9SU19JUF8xCQkJCSAgICAgICAgMHg0MzE0CisjZGVmaW5lIFIzMDBfUlNfSVBfMgkJCQkgICAgICAgIDB4NDMxOAorI2RlZmluZSBSMzAwX1JTX0lQXzMJCQkJICAgICAgICAweDQzMUMKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQX1NSQ19TSElGVCAgICAgICAgICAyIC8qIFRPRE86IGNoZWNrIGZvciByZW1vdmFsICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF9TUkNfTUFTSyAgICAgICAgICAgKDcgPDwgMikgLyogVE9ETzogY2hlY2sgZm9yIHJlbW92YWwgKi8KKyMJZGVmaW5lIFIzMDBfUlNfVEVYX1BUUih4KQkJICAgICAgICAoeCA8PCAwKQorIwlkZWZpbmUgUjMwMF9SU19DT0xfUFRSKHgpCQkgICAgICAgICh4IDw8IDYpCisjCWRlZmluZSBSMzAwX1JTX0NPTF9GTVQoeCkJCSAgICAgICAgKHggPDwgOSkKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF9SR0JBCQkgICAgICAgIDAKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF9SR0IwCQkgICAgICAgIDEKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF9SR0IxCQkgICAgICAgIDIKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8wMDBBCQkgICAgICAgIDQKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8wMDAwCQkgICAgICAgIDUKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8wMDAxCQkgICAgICAgIDYKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8xMTFBCQkgICAgICAgIDgKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8xMTEwCQkgICAgICAgIDkKKyMJZGVmaW5lIFIzMDBfUlNfQ09MX0ZNVF8xMTExCQkgICAgICAgIDEwCisjCWRlZmluZSBSMzAwX1JTX1NFTF9TKHgpCQkgICAgICAgICAgICAgICAgKHggPDwgMTMpCisjCWRlZmluZSBSMzAwX1JTX1NFTF9UKHgpCQkgICAgICAgICAgICAgICAgKHggPDwgMTYpCisjCWRlZmluZSBSMzAwX1JTX1NFTF9SKHgpCQkgICAgICAgICAgICAgICAgKHggPDwgMTkpCisjCWRlZmluZSBSMzAwX1JTX1NFTF9RKHgpCQkgICAgICAgICAgICAgICAgKHggPDwgMjIpCisjCWRlZmluZSBSMzAwX1JTX1NFTF9DMAkJICAgICAgICAgICAgICAgIDAKKyMJZGVmaW5lIFIzMDBfUlNfU0VMX0MxCQkgICAgICAgICAgICAgICAgMQorIwlkZWZpbmUgUjMwMF9SU19TRUxfQzIJCSAgICAgICAgICAgICAgICAyCisjCWRlZmluZSBSMzAwX1JTX1NFTF9DMwkJICAgICAgICAgICAgICAgIDMKKyMJZGVmaW5lIFIzMDBfUlNfU0VMX0swCQkgICAgICAgICAgICAgICAgNAorIwlkZWZpbmUgUjMwMF9SU19TRUxfSzEJCSAgICAgICAgICAgICAgICA1CisKKworLyogICovCisjZGVmaW5lIFI1MDBfUlNfSU5TVF8wCQkJCQkweDQzMjAKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzEJCQkJCTB4NDMyNAorI2RlZmluZSBSNTAwX1JTX0lOU1RfMgkJCQkJMHg0MzI4CisjZGVmaW5lIFI1MDBfUlNfSU5TVF8zCQkJCQkweDQzMmMKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzQJCQkJCTB4NDMzMAorI2RlZmluZSBSNTAwX1JTX0lOU1RfNQkJCQkJMHg0MzM0CisjZGVmaW5lIFI1MDBfUlNfSU5TVF82CQkJCQkweDQzMzgKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzcJCQkJCTB4NDMzYworI2RlZmluZSBSNTAwX1JTX0lOU1RfOAkJCQkJMHg0MzQwCisjZGVmaW5lIFI1MDBfUlNfSU5TVF85CQkJCQkweDQzNDQKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzEwCQkJCQkweDQzNDgKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzExCQkJCQkweDQzNGMKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzEyCQkJCQkweDQzNTAKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzEzCQkJCQkweDQzNTQKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzE0CQkJCQkweDQzNTgKKyNkZWZpbmUgUjUwMF9SU19JTlNUXzE1CQkJCQkweDQzNWMKKyNkZWZpbmUgUjUwMF9SU19JTlNUX1RFWF9JRF9TSElGVAkJCTAKKyNkZWZpbmUgUjUwMF9SU19JTlNUX1RFWF9DTl9XUklURQkJCSgxIDw8IDQpCisjZGVmaW5lIFI1MDBfUlNfSU5TVF9URVhfQUREUl9TSElGVAkJCTUKKyNkZWZpbmUgUjUwMF9SU19JTlNUX0NPTF9JRF9TSElGVAkJCTEyCisjZGVmaW5lIFI1MDBfUlNfSU5TVF9DT0xfQ05fTk9fV1JJVEUJCQkoMCA8PCAxNikKKyNkZWZpbmUgUjUwMF9SU19JTlNUX0NPTF9DTl9XUklURQkJCSgxIDw8IDE2KQorI2RlZmluZSBSNTAwX1JTX0lOU1RfQ09MX0NOX1dSSVRFX0ZCVUZGRVIJCSgyIDw8IDE2KQorI2RlZmluZSBSNTAwX1JTX0lOU1RfQ09MX0NOX1dSSVRFX0JBQ0tGQUNFCQkoMyA8PCAxNikKKyNkZWZpbmUgUjUwMF9SU19JTlNUX0NPTF9BRERSX1NISUZUCQkJMTgKKyNkZWZpbmUgUjUwMF9SU19JTlNUX1RFWF9BREoJCQkJKDEgPDwgMjUpCisjZGVmaW5lIFI1MDBfUlNfSU5TVF9XX0NOCQkJCSgxIDw8IDI2KQogCiAvKiBUaGVzZSBEV09SRHMgY29udHJvbCBob3cgdmVydGV4IGRhdGEgaXMgcm91dGVkIGludG8gZnJhZ21lbnQgcHJvZ3JhbQogICogcmVnaXN0ZXJzLCBhZnRlciBpbnRlcnBvbGF0b3JzLgogICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfMCAgICAgICAgICAgICAgICAgICAgIDB4NDMzMAotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzEgICAgICAgICAgICAgICAgICAgICAweDQzMzQKLSNkZWZpbmUgUjMwMF9SU19ST1VURV8yICAgICAgICAgICAgICAgICAgICAgMHg0MzM4Ci0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQyAvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzQgICAgICAgICAgICAgICAgICAgICAweDQzNDAgLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV81ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ0IC8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OCAvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzcgICAgICAgICAgICAgICAgICAgICAweDQzNEMgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8wICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMSAgICAgMQotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzIgICAgIDIKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8zICAgICAzCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNCAgICAgNAotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzUgICAgIDUgLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF82ICAgICA2IC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNyAgICAgNyAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDMpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfU0hJRlQgICAgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9ERVNUX01BU0sgICAgICAgICAgICgzMSA8PCA2KSAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX0lOU1RfMCAgICAgICAgICAgICAgICAgICAgIDB4NDMzMAorI2RlZmluZSBSMzAwX1JTX0lOU1RfMSAgICAgICAgICAgICAgICAgICAgIDB4NDMzNAorI2RlZmluZSBSMzAwX1JTX0lOU1RfMiAgICAgICAgICAgICAgICAgICAgIDB4NDMzOAorI2RlZmluZSBSMzAwX1JTX0lOU1RfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX0lOU1RfNCAgICAgICAgICAgICAgICAgICAgIDB4NDM0MCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX0lOU1RfNSAgICAgICAgICAgICAgICAgICAgIDB4NDM0NCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX0lOU1RfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX0lOU1RfNyAgICAgICAgICAgICAgICAgICAgIDB4NDM0QyAvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9SU19JTlNUX1RFWF9JRCh4KSAgCQkoKHgpIDw8IDApCisjCWRlZmluZSBSMzAwX1JTX0lOU1RfVEVYX0NOX1dSSVRFIAkoMSA8PCAzKQorIwlkZWZpbmUgUjMwMF9SU19JTlNUX1RFWF9BRERSX1NISUZUIAk2CisjCWRlZmluZSBSMzAwX1JTX0lOU1RfQ09MX0lEKHgpCQkoKHgpIDw8IDExKQorIwlkZWZpbmUgUjMwMF9SU19JTlNUX0NPTF9DTl9XUklURQkoMSA8PCAxNCkKKyMJZGVmaW5lIFIzMDBfUlNfSU5TVF9DT0xfQUREUl9TSElGVAkxNworIwlkZWZpbmUgUjMwMF9SU19JTlNUX1RFWF9BREoJCSgxIDw8IDIyKQorIwlkZWZpbmUgUjMwMF9SU19DT0xfQklBU19VTlVTRURfU0hJRlQgICAgMjMKIAotLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgY29sb3I6IFdoZW4gdGhlIGZyYWdtZW50IHByb2dyYW0gdXNlcyBjb2xvciwKLSAqIHRoZSBST1VURV8wX0NPTE9SIGJpdCBpcyBzZXQgYW5kIFJPVVRFXzBfQ09MT1JfREVTVCBjb250YWlucyB0aGUKLSAqIGNvbG9yIHJlZ2lzdGVyIGluZGV4LgotICoKLSAqIEFwcGVyZW50bHkgeW91IG1heSBzZXQgdGhlIFIzMDBfUlNfUk9VVEVfMF9DT0xPUiBiaXQsIGJ1dCBub3QgcHJvdmlkZSBhbnkKLSAqIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUIHZhbHVlOyB0aGlzIHNldHVwIGlzIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBzdGF0ZS4KLSAqIFNlZSByMzAwX2lvY3RsLmM6cjMwMEVtaXRDbGVhclN0YXRlLiBJJ20gbm90IHN1cmUgaWYgdGhpcyBzZXR1cCBpcyBzdHJpY3RseQotICogY29ycmVjdCBvciBub3QuIC0gT2xpdmVyLgotICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1IgICAgICAgICAgICAgKDEgPDwgMTQpCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9TSElGVCAgMTcKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX01BU0sgICAoMzEgPDwgMTcpIC8qIEdVRVNTICovCi0vKiBBcyBhYm92ZSwgYnV0IGZvciBzZWNvbmRhcnkgY29sb3IgKi8KLSMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxICAgICAgICAgICAgKDEgPDwgMTQpCi0jCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX1NISUZUIDE3Ci0jCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX01BU0sgICgzMSA8PCAxNykKLSMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfVU5LTk9XTjExICAgICAgICAgKDEgPDwgMTEpCiAvKiBFTkQ6IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCiAKKy8qIEhpZXJhcmNoaWNhbCBaIEVuYWJsZSAqLworI2RlZmluZSBSMzAwX1NDX0hZUEVSWiAgICAgICAgICAgICAgICAgICAweDQzYTQKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX0RJU0FCTEUgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX1NDX0hZUEVSWl9FTkFCTEUgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9TQ19IWVBFUlpfTUlOICAgICAgICAgKDAgPDwgMSkKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX01BWCAgICAgICAgICgxIDw8IDEpCisjCWRlZmluZSBSMzAwX1NDX0hZUEVSWl9BREpfMjU2ICAgICAoMCA8PCAyKQorIwlkZWZpbmUgUjMwMF9TQ19IWVBFUlpfQURKXzEyOCAgICAgKDEgPDwgMikKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX0FESl82NCAgICAgICgyIDw8IDIpCisjCWRlZmluZSBSMzAwX1NDX0hZUEVSWl9BREpfMzIgICAgICAoMyA8PCAyKQorIwlkZWZpbmUgUjMwMF9TQ19IWVBFUlpfQURKXzE2ICAgICAgKDQgPDwgMikKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX0FESl84ICAgICAgICg1IDw8IDIpCisjCWRlZmluZSBSMzAwX1NDX0hZUEVSWl9BREpfNCAgICAgICAoNiA8PCAyKQorIwlkZWZpbmUgUjMwMF9TQ19IWVBFUlpfQURKXzIgICAgICAgKDcgPDwgMikKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX0haX1owTUlOX05PICgwIDw8IDUpCisjCWRlZmluZSBSMzAwX1NDX0hZUEVSWl9IWl9aME1JTiAgICAoMSA8PCA1KQorIwlkZWZpbmUgUjMwMF9TQ19IWVBFUlpfSFpfWjBNQVhfTk8gKDAgPDwgNikKKyMJZGVmaW5lIFIzMDBfU0NfSFlQRVJaX0haX1owTUFYICAgICgxIDw8IDYpCisKKyNkZWZpbmUgUjMwMF9TQ19FREdFUlVMRSAgICAgICAgICAgICAgICAgMHg0M2E4CisKIC8qIEJFR0lOOiBTY2lzc29ycyBhbmQgY2xpcHJlY3RzICovCiAKIC8qIFRoZXJlIGFyZSBmb3VyIGNsaXBwaW5nIHJlY3RhbmdsZXMuIFRoZWlyIGNvcm5lciBjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlLgpAQCAtNzQ0LDIxICsxMjg0LDIxIEBACiAgKiBGb3Igc29tZSByZWFzb24sIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lYnVmZmVyIGlzIGF0ICgxNDQwLCAxNDQwKQogICogZm9yIHRoZSBwdXJwb3NlIG9mIGNsaXBwaW5nIGFuZCBzY2lzc29ycy4KICAqLwotI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzAgICAgICAgICAgICAgICAweDQzQjAKLSNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9CUl8wICAgICAgICAgICAgICAgMHg0M0I0Ci0jZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMSAgICAgICAgICAgICAgIDB4NDNCOAotI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX0JSXzEgICAgICAgICAgICAgICAweDQzQkMKLSNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9UTF8yICAgICAgICAgICAgICAgMHg0M0MwCi0jZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfQlJfMiAgICAgICAgICAgICAgIDB4NDNDNAotI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzMgICAgICAgICAgICAgICAweDQzQzgKLSNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9CUl8zICAgICAgICAgICAgICAgMHg0M0NDCisjZGVmaW5lIFIzMDBfU0NfQ0xJUFJFQ1RfVExfMCAgICAgICAgICAgICAgIDB4NDNCMAorI2RlZmluZSBSMzAwX1NDX0NMSVBSRUNUX0JSXzAgICAgICAgICAgICAgICAweDQzQjQKKyNkZWZpbmUgUjMwMF9TQ19DTElQUkVDVF9UTF8xICAgICAgICAgICAgICAgMHg0M0I4CisjZGVmaW5lIFIzMDBfU0NfQ0xJUFJFQ1RfQlJfMSAgICAgICAgICAgICAgIDB4NDNCQworI2RlZmluZSBSMzAwX1NDX0NMSVBSRUNUX1RMXzIgICAgICAgICAgICAgICAweDQzQzAKKyNkZWZpbmUgUjMwMF9TQ19DTElQUkVDVF9CUl8yICAgICAgICAgICAgICAgMHg0M0M0CisjZGVmaW5lIFIzMDBfU0NfQ0xJUFJFQ1RfVExfMyAgICAgICAgICAgICAgIDB4NDNDOAorI2RlZmluZSBSMzAwX1NDX0NMSVBSRUNUX0JSXzMgICAgICAgICAgICAgICAweDQzQ0MKICMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUFJFQ1RfT0ZGU0VUICAgICAgICAgICAgICAxNDQwCiAjICAgICAgIGRlZmluZSBSMzAwX0NMSVBSRUNUX01BU0sgICAgICAgICAgICAgICAgMHgxRkZGCiAjICAgICAgIGRlZmluZSBSMzAwX0NMSVBSRUNUX1hfU0hJRlQgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9DTElQUkVDVF9YX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUFJFQ1RfWV9TSElGVCAgICAgICAgICAgICAxMwogIyAgICAgICBkZWZpbmUgUjMwMF9DTElQUkVDVF9ZX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMTMpCi0jZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfQ05UTCAgICAgICAgICAgICAgIDB4NDNEMAorI2RlZmluZSBSMzAwX1NDX0NMSVBfUlVMRSAgICAgICAgICAgICAgICAgICAweDQzRDAKICMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF9PVVQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9DTElQXzAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCiAjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKQEAgLTc3OCwxMyArMTMxOCwxNyBAQAogCiAvKiBnYXAgKi8KIAotI2RlZmluZSBSMzAwX1JFX1NDSVNTT1JTX1RMICAgICAgICAgICAgICAgICAweDQzRTAKLSNkZWZpbmUgUjMwMF9SRV9TQ0lTU09SU19CUiAgICAgICAgICAgICAgICAgMHg0M0U0CisjZGVmaW5lIFIzMDBfU0NfU0NJU1NPUlNfVEwgICAgICAgICAgICAgICAgIDB4NDNFMAorI2RlZmluZSBSMzAwX1NDX1NDSVNTT1JTX0JSICAgICAgICAgICAgICAgICAweDQzRTQKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfT0ZGU0VUICAgICAgICAgICAgICAxNDQwCiAjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX1hfU0hJRlQgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19YX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWV9TSElGVCAgICAgICAgICAgICAxMwogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19ZX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMTMpCisKKy8qIFNjcmVlbiBkb29yIHNhbXBsZSBtYXNrICovCisjZGVmaW5lIFIzMDBfU0NfU0NSRUVORE9PUiAgICAgICAgICAgICAgICAgMHg0M2U4CisKIC8qIEVORDogU2Npc3NvcnMgYW5kIGNsaXByZWN0cyAqLwogCiAvKiBCRUdJTjogVGV4dHVyZSBzcGVjaWZpY2F0aW9uICovCkBAIC03OTQsNDMgKzEzMzgsNTUgQEAKICAqIHVuaXQuIFRoaXMgbWVhbnMgdGhhdCBlLmcuIHRoZSBvZmZzZXQgZm9yIHRleHR1cmUgaW1hZ2UgdW5pdCBOIGlzIGZvdW5kIGluCiAgKiByZWdpc3RlciBUWF9PRkZTRVRfMCArICg0Kk4pCiAgKi8KLSNkZWZpbmUgUjMwMF9UWF9GSUxURVJfMCAgICAgICAgICAgICAgICAgICAgMHg0NDAwCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8wICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDAwCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDA0CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8yICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDA4CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8zICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDBjCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF80ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDEwCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF81ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDE0CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF82ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDE4CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF83ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDFjCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF84ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDIwCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF85ICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDI0CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xMCAgICAgICAgICAgICAgICAgICAgICAgMHg0NDI4CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xMSAgICAgICAgICAgICAgICAgICAgICAgMHg0NDJjCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xMiAgICAgICAgICAgICAgICAgICAgICAgMHg0NDMwCisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xMyAgICAgICAgICAgICAgICAgICAgICAgMHg0NDM0CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xNCAgICAgICAgICAgICAgICAgICAgICAgMHg0NDM4CisjZGVmaW5lIFIzMDBfVFhfRklMVEVSMF8xNSAgICAgICAgICAgICAgICAgICAgICAgMHg0NDNjCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSVJST1JFRCAgICAgICAgICAgICAgICAgIDEKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfQ0xBTVAgICAgICAgICAgICAgICAgICAgICA0CiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgMgorIwlkZWZpbmUgUjMwMF9UWF9NSVJST1JfT05DRV9UT19FREdFICAgICAgIDMKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfQ0xBTVAgICAgICAgICAgICAgICAgICAgICA0CisjCWRlZmluZSBSMzAwX1RYX01JUlJPUl9PTkNFICAgICAgICAgICAgICAgNQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9DTEFNUF9UT19CT1JERVIgICAgICAgICAgIDYKKyMJZGVmaW5lIFIzMDBfVFhfTUlSUk9SX09OQ0VfVE9fQk9SREVSICAgICA3CiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1dSQVBfU19TSElGVCAgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1NfTUFTSyAgICAgICAgICAgICAgICg3IDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1dSQVBfVF9TSElGVCAgICAgICAgICAgICAgMwogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1RfTUFTSyAgICAgICAgICAgICAgICg3IDw8IDMpCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1dSQVBfUV9TSElGVCAgICAgICAgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1FfTUFTSyAgICAgICAgICAgICAgICg3IDw8IDYpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX1dSQVBfUl9TSElGVCAgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1JfTUFTSyAgICAgICAgICAgICAgICg3IDw8IDYpCisjCWRlZmluZSBSMzAwX1RYX01BR19GSUxURVJfNCAgICAgICAgICAgICAgKDAgPDwgOSkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUFHX0ZJTFRFUl9ORUFSRVNUICAgICAgICAoMSA8PCA5KQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQUdfRklMVEVSX0xJTkVBUiAgICAgICAgICgyIDw8IDkpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01BR19GSUxURVJfQU5JU08gICAgICAgICAgKDMgPDwgOSkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLICAgICAgICAgICAoMyA8PCA5KQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1QgICAgICAgICgxIDw8IDExKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUiAgICAgICAgICgyIDw8IDExKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1RfTUlQX05FQVJFU1QgICAgICAgKDUgIDw8ICAxMSkKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9ORUFSRVNUX01JUF9MSU5FQVIgICAgICAgICg5ICA8PCAgMTEpCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTElORUFSX01JUF9ORUFSRVNUICAgICAgICAoNiAgPDwgIDExKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUl9NSVBfTElORUFSICAgICAgICAgKDEwIDw8ICAxMSkKLQotLyogTk9URTogTkVBUkVTVCBkb2VzbnQgc2VlbSB0byBleGlzdC4KLSAqIEltIG5vdCBzZXRpbmcgTUFHX0ZJTFRFUl9NQVNLIGFuZCAoMyA8PCAxMSkgb24gZm9yIGFsbAotICogYW5pc290cm9weSBtb2RlcyBiZWNhdXNlIHRoYXQgd291bGQgdm9pZCBzZWxlY3RlZCBtYWcgZmlsdGVyCi0gKi8KLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUICAgICAgICAgICAgICgwIDw8IDEzKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX0xJTkVBUiAgICAgICAgICAgICAgKDAgPDwgMTMpCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTkVBUkVTVCAoMSA8PCAxMykKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9MSU5FQVIgICgyIDw8IDEzKQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX01BU0sgICAoICgxNSA8PCAxMSkgfCAoMyA8PCAxMykgKQotIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fMV9UT18xICAoMCA8PCAyMSkKLSMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzJfVE9fMSAgKDIgPDwgMjEpCi0jCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT180X1RPXzEgICg0IDw8IDIxKQotIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fOF9UT18xICAoNiA8PCAyMSkKLSMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzE2X1RPXzEgKDggPDwgMjEpCi0jCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT19NQVNLICAgICgxNCA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTTyAgICAgICAgICAoMyA8PCAxMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLICAgICAgICAgICAoMyA8PCAxMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NSVBfTk9ORSAgICAgICAoMCA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NSVBfTkVBUkVTVCAgICAoMSA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NSVBfTElORUFSICAgICAoMiA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NSVBfTUFTSyAgICAgICAoMyA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzFfVE9fMSAgICAgICAgICAoMCA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzJfVE9fMSAgICAgICAgICAoMSA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzRfVE9fMSAgICAgICAgICAoMiA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzhfVE9fMSAgICAgICAgICAoMyA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzE2X1RPXzEgICAgICAgICAoNCA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPX01BU0sgICAgICAgICAgICAoNyA8PCAyMSkKIAogI2RlZmluZSBSMzAwX1RYX0ZJTFRFUjFfMCAgICAgICAgICAgICAgICAgICAgICAweDQ0NDAKICMJZGVmaW5lIFIzMDBfQ0hST01BX0tFWV9NT0RFX0RJU0FCTEUgICAgMApAQCAtODM4LDcgKzEzOTQsOCBAQAogIwlkZWZpbmUgUjMwMF9DSFJPTUFfS0VZX0JMRU5EICAgICAgICAgICAyCiAjCWRlZmluZSBSMzAwX01DX1JPVU5EX05PUk1BTCAgICAgICAgICAgICgwPDwyKQogIwlkZWZpbmUgUjMwMF9NQ19ST1VORF9NUEVHNCAgICAgICAgICAgICAoMTw8MikKLSMJZGVmaW5lIFIzMDBfTE9EX0JJQVNfTUFTSwkgICAgMHgxZmZmCisjCWRlZmluZSBSMzAwX0xPRF9CSUFTX1NISUZUICAgICAgICAgICAgIDMKKyMJZGVmaW5lIFIzMDBfTE9EX0JJQVNfTUFTSwkgICAgICAgMHgxZmY4CiAjCWRlZmluZSBSMzAwX0VER0VfQU5JU09fRURHRV9ESUFHICAgICAgICgwPDwxMykKICMJZGVmaW5lIFIzMDBfRURHRV9BTklTT19FREdFX09OTFkgICAgICAgKDE8PDEzKQogIwlkZWZpbmUgUjMwMF9NQ19DT09SRF9UUlVOQ0FURV9ESVNBQkxFICAoMDw8MTQpCkBAIC04NDksMTIgKzE0MDYsMTYgQEAKICMJZGVmaW5lIFIzMDBfVFhfVFJJX1BFUkZfM184ICAgICAgICAgICAgKDM8PDE1KQogIwlkZWZpbmUgUjMwMF9BTklTT19USFJFU0hPTERfTUFTSyAgICAgICAoNzw8MTcpCiAKKyMJZGVmaW5lIFI1MDBfTUFDUk9fU1dJVENIICAgICAgICAgICAgICAgKDE8PDIyKQorIwlkZWZpbmUgUjUwMF9CT1JERVJfRklYICAgICAgICAgICAgICAgICAoMTw8MzEpCisKICNkZWZpbmUgUjMwMF9UWF9TSVpFXzAgICAgICAgICAgICAgICAgICAgICAgMHg0NDgwCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1dJRFRITUFTS19TSElGVCAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XSURUSE1BU0tfTUFTSyAgICAgICAgICAgICgyMDQ3IDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0hFSUdIVE1BU0tfU0hJRlQgICAgICAgICAgMTEKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfSEVJR0hUTUFTS19NQVNLICAgICAgICAgICAoMjA0NyA8PCAxMSkKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfVU5LMjMgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMJZGVmaW5lIFIzMDBfVFhfREVQVEhNQVNLX1NISUZUCQkgMjIKKyMJZGVmaW5lIFIzMDBfVFhfREVQVEhNQVNLX01BU0sJCSAoMHhmIDw8IDIyKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQVhfTUlQX0xFVkVMX1NISUZUICAgICAgIDI2CiAjICAgICAgIGRlZmluZSBSMzAwX1RYX01BWF9NSVBfTEVWRUxfTUFTSyAgICAgICAgKDB4ZiA8PCAyNikKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9QUk9KRUNURUQgICAgICAgICAgICAoMTw8MzApCkBAIC04NjUsNyArMTQyNiw5IEBACiAJICAgVGhleSBhcmUgZ2l2ZW4gbWVhbmluZ3MgYXMgUiwgRywgQiBhbmQgQWxwaGEgYnkgdGhlIHN3aXp6bGUKIAkgICBzcGVjaWZpY2F0aW9uICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9YOAkJICAgIDB4MAorIwlkZWZpbmUgUjUwMF9UWF9GT1JNQVRfWDEJCSAgICAweDAgLy8gYml0IHNldCBpbiBmb3JtYXQgMgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWDE2CQkgICAgMHgxCisjCWRlZmluZSBSNTAwX1RYX0ZPUk1BVF9YMV9SRVYJCSAgICAweDAgLy8gYml0IHNldCBpbiBmb3JtYXQgMgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWTRYNAkJICAgIDB4MgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWThYOAkJICAgIDB4MwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWTE2WDE2CQkgICAgMHg0CkBAIC04ODYsOSArMTQ0OSwxNyBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQThSOEc4QjgJICAgIAkgICAgMHgxMyAgICAgLyogbm8gc3dpenpsZSAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQjhHOF9COEc4CSAgICAJICAgIDB4MTQgICAgIC8qIG5vIHN3aXp6bGUgKi8KICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0c4UjhfRzhCOAkgICAgCSAgICAweDE1ICAgICAvKiBubyBzd2l6emxlICovCisKKwkvKiBUaGVzZSB0d28gdmFsdWVzIGFyZSB3cm9uZywgYnV0IHRoZXkncmUgdGhlIG9ubHkgdmFsdWVzIHRoYXQKKwkgKiBwcm9kdWNlIGFueSBldmVuIHZhZ3VlbHkgY29ycmVjdCByZXN1bHRzLiAgQ2FuIHIzMDAgb25seSBkbyAxNi1iaXQKKwkgKiBkZXB0aCB0ZXh0dXJlcz8KKwkgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1gyNF9ZOAkgICAgCSAgICAweDFlCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9YMzIJICAgIAkgICAgMHgxZQorCiAJLyogMHgxNiAtIHNvbWUgMTYgYml0IGdyZWVuIGZvcm1hdC4uID8/ICovCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9VTksyNQkJICAgKDEgPDwgMjUpIC8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVQklDX01BUAkJICAgKDEgPDwgMjYpCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF8zRAkJICAgKDEgPDwgMjUpCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVUJJQ19NQVAJCSAgICgyIDw8IDI1KQogCiAJLyogZ2FwICovCiAJLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLwpAQCAtOTQxLDcgKzE1MTIsMTggQEAKIAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWVVWX01PREUJCTB4MDA4MDAwMDAKIAotI2RlZmluZSBSMzAwX1RYX1BJVENIXzAJCQkgICAgMHg0NTAwIC8qIG9idmlvdXMgbWlzc2luZyBpbiBnYXAgKi8KKyNkZWZpbmUgUjMwMF9UWF9GT1JNQVQyXzAJCSAgICAweDQ1MDAgLyogb2J2aW91cyBtaXNzaW5nIGluIGdhcCAqLworIyAgICAgICBkZWZpbmUgUjMwMF9UWF9QSVRDSE1BU0tfU0hJRlQgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfUElUQ0hNQVNLX01BU0sgICAgICAgICAgICAoMjA0NyA8PCAwKQorIwlkZWZpbmUgUjUwMF9UWEZPUk1BVF9NU0IJCSAoMSA8PCAxNCkKKyMJZGVmaW5lIFI1MDBfVFhXSURUSF9CSVQxMQkgICAgICAgICAoMSA8PCAxNSkKKyMJZGVmaW5lIFI1MDBfVFhIRUlHSFRfQklUMTEJICAgICAgICAgKDEgPDwgMTYpCisjCWRlZmluZSBSNTAwX1BPVzJGSVgyRkxUCQkJICgxIDw8IDE3KQorIwlkZWZpbmUgUjUwMF9TRUxfRklMVEVSNF9UQzAJCSAoMCA8PCAxOCkKKyMJZGVmaW5lIFI1MDBfU0VMX0ZJTFRFUjRfVEMxCQkgKDEgPDwgMTgpCisjCWRlZmluZSBSNTAwX1NFTF9GSUxURVI0X1RDMgkJICgyIDw8IDE4KQorIwlkZWZpbmUgUjUwMF9TRUxfRklMVEVSNF9UQzMJCSAoMyA8PCAxOCkKKwogI2RlZmluZSBSMzAwX1RYX09GRlNFVF8wICAgICAgICAgICAgICAgICAgICAweDQ1NDAKIAkvKiBCRUdJTjogR3Vlc3MgZnJvbSBSMjAwICovCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fTk9fU1dBUCAgICAgICAgICAgKDAgPDwgMCkKQEAgLTk0OSwxNSArMTUzMSw1MCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgICgyIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fSEFMRkRXX1NXQVAgICAgICAgKDMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX01BQ1JPX1RJTEUgICAgICAgICAgICAgICAoMSA8PCAyKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fTUlDUk9fVElMRV9MSU5FQVIgICAgICAgICgwIDw8IDMpCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19NSUNST19USUxFICAgICAgICAgICAgICAgKDEgPDwgMykKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhPX01JQ1JPX1RJTEVfU1FVQVJFICAgICAgICAoMiA8PCAzKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fT0ZGU0VUX01BU0sgICAgICAgICAgICAgIDB4ZmZmZmZmZTAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX09GRlNFVF9TSElGVCAgICAgICAgICAgICA1CiAJLyogRU5EOiBHdWVzcyBmcm9tIFIyMDAgKi8KIAogLyogMzIgYml0IGNocm9tYSBrZXkgKi8KICNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzAgICAgICAgICAgICAgICAgICAgICAgMHg0NTgwCisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8xICAgICAgICAgICAgICAgICAgICAgIDB4NDU4NAorI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfMiAgICAgICAgICAgICAgICAgICAgICAweDQ1ODgKKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzMgICAgICAgICAgICAgICAgICAgICAgMHg0NThjCisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV80ICAgICAgICAgICAgICAgICAgICAgIDB4NDU5MAorI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfNSAgICAgICAgICAgICAgICAgICAgICAweDQ1OTQKKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzYgICAgICAgICAgICAgICAgICAgICAgMHg0NTk4CisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV83ICAgICAgICAgICAgICAgICAgICAgIDB4NDU5YworI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfOCAgICAgICAgICAgICAgICAgICAgICAweDQ1YTAKKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzkgICAgICAgICAgICAgICAgICAgICAgMHg0NWE0CisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8xMCAgICAgICAgICAgICAgICAgICAgIDB4NDVhOAorI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfMTEgICAgICAgICAgICAgICAgICAgICAweDQ1YWMKKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzEyICAgICAgICAgICAgICAgICAgICAgMHg0NWIwCisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8xMyAgICAgICAgICAgICAgICAgICAgIDB4NDViNAorI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfMTQgICAgICAgICAgICAgICAgICAgICAweDQ1YjgKKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzE1ICAgICAgICAgICAgICAgICAgICAgMHg0NWJjCiAvKiBmZjAwZmYwMCA9PSB7IDAsIDEuMCwgMCwgMS4wIH0gKi8KLSNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMCAgICAgICAgICAgICAgMHg0NUMwCisKKy8qIEJvcmRlciBDb2xvciAqLworI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAweDQ1YzAKKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMSAgICAgICAgICAgICAgMHg0NWM0CisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzIgICAgICAgICAgICAgIDB4NDVjOAorI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8zICAgICAgICAgICAgICAweDQ1Y2MKKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfNCAgICAgICAgICAgICAgMHg0NWQwCisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzUgICAgICAgICAgICAgIDB4NDVkNAorI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl82ICAgICAgICAgICAgICAweDQ1ZDgKKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfNyAgICAgICAgICAgICAgMHg0NWRjCisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzggICAgICAgICAgICAgIDB4NDVlMAorI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl85ICAgICAgICAgICAgICAweDQ1ZTQKKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMTAgICAgICAgICAgICAgMHg0NWU4CisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzExICAgICAgICAgICAgIDB4NDVlYworI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8xMiAgICAgICAgICAgICAweDQ1ZjAKKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMTMgICAgICAgICAgICAgMHg0NWY0CisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzE0ICAgICAgICAgICAgIDB4NDVmOAorI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8xNSAgICAgICAgICAgICAweDQ1ZmMKKwogCiAvKiBFTkQ6IFRleHR1cmUgc3BlY2lmaWNhdGlvbiAqLwogCkBAIC05ODAsMjMgKzE1OTcsMjMgQEAKICAqIG9mZnNldHMgaW50byB0aGUgcmVzcGVjdGl2ZSBpbnN0cnVjdGlvbiBzdHJlYW1zLCB3aGlsZSAqX0VORCBwb2ludHMgdG8gdGhlCiAgKiBsYXN0IGluc3RydWN0aW9uIHJlbGF0aXZlIHRvIHRoaXMgb2Zmc2V0LgogICovCi0jZGVmaW5lIFIzMDBfUEZTX0NOVExfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYwMAorI2RlZmluZSBSMzAwX1VTX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDQ2MDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfTEFTVF9OT0RFU19TSElGVCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0xBU1RfTk9ERVNfTUFTSyAgICAgKDMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfRklSU1RfTk9ERV9IQVNfVEVYICAoMSA8PCAzKQotI2RlZmluZSBSMzAwX1BGU19DTlRMXzEgICAgICAgICAgICAgICAgICAgICAweDQ2MDQKKyNkZWZpbmUgUjMwMF9VU19QSVhTSVpFICAgICAgICAgICAgICAgICAgICAgMHg0NjA0CiAvKiBUaGVyZSBpcyBhbiB1bnNoaWZ0ZWQgdmFsdWUgaGVyZSB3aGljaCBoYXMgc28gZmFyIGFsd2F5cyBiZWVuIGVxdWFsIHRvIHRoZQogICogaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCB0ZW1wb3JhcnkgcmVnaXN0ZXIuCiAgKi8KLSNkZWZpbmUgUjMwMF9QRlNfQ05UTF8yICAgICAgICAgICAgICAgICAgICAgMHg0NjA4CisjZGVmaW5lIFIzMDBfVVNfQ09ERV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4NDYwOAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX1NISUZUICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX09GRlNFVF9NQVNLICAgICAoNjMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9TSElGVCAgICAgICA2CiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQgICAgMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQgICAgMTMKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTMpCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfU0hJRlQgICAgICAgMTgKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX0VORF9NQVNLICAgICAgICAoMzEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE4KQogCiAvKiBnYXAgKi8KIApAQCAtMTAwNyw0NSArMTYyNCw2NSBAQAogICoKICAqIE9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgb2Zmc2V0IGZyb20gUEZTX0NOVExfMi4KICAqLwotI2RlZmluZSBSMzAwX1BGU19OT0RFXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MTAKLSNkZWZpbmUgUjMwMF9QRlNfTk9ERV8xICAgICAgICAgICAgICAgICAgICAgMHg0NjE0Ci0jZGVmaW5lIFIzMDBfUEZTX05PREVfMiAgICAgICAgICAgICAgICAgICAgIDB4NDYxOAotI2RlZmluZSBSMzAwX1BGU19OT0RFXzMgICAgICAgICAgICAgICAgICAgICAweDQ2MUMKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfQUxVX09GRlNFVF9TSElGVCAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX0FMVV9PRkZTRVRfTUFTSyAgICAgKDYzIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX0FMVV9FTkRfU0hJRlQgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9BTFVfRU5EX01BU0sgICAgICAgICg2MyA8PCA2KQotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfT0ZGU0VUX1NISUZUICAgIDEyCi0jICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX1RFWF9PRkZTRVRfTUFTSyAgICAgKDMxIDw8IDEyKQotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfRU5EX1NISUZUICAgICAgIDE3Ci0jICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE3KQotIwkJZGVmaW5lIFIzMDBfUEZTX05PREVfT1VUUFVUX0NPTE9SICAgICAgICAoMSA8PCAyMikKLSMJCWRlZmluZSBSMzAwX1BGU19OT0RFX09VVFBVVF9ERVBUSCAgICAgICAgKDEgPDwgMjMpCisjZGVmaW5lIFIzMDBfVVNfQ09ERV9BRERSXzAgICAgICAgICAgICAgICAgIDB4NDYxMAorI2RlZmluZSBSMzAwX1VTX0NPREVfQUREUl8xICAgICAgICAgICAgICAgICAweDQ2MTQKKyNkZWZpbmUgUjMwMF9VU19DT0RFX0FERFJfMiAgICAgICAgICAgICAgICAgMHg0NjE4CisjZGVmaW5lIFIzMDBfVVNfQ09ERV9BRERSXzMgICAgICAgICAgICAgICAgIDB4NDYxQworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1RBUlRfU0hJRlQgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TVEFSVF9NQVNLICAgICAgICAgICg2MyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU0laRV9TSElGVCAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TSVpFX01BU0sgICAgICAgICAgICg2MyA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9URVhfU1RBUlRfU0hJRlQgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9URVhfU1RBUlRfTUFTSyAgICAgICAgICAoMzEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX1RFWF9TSVpFX1NISUZUICAgICAgICAgIDE3CisjICAgICAgIGRlZmluZSBSMzAwX1RFWF9TSVpFX01BU0sgICAgICAgICAgICgzMSA8PCAxNykKKyMJZGVmaW5lIFIzMDBfUkdCQV9PVVQgICAgICAgICAgICAgICAgKDEgPDwgMjIpCisjCWRlZmluZSBSMzAwX1dfT1VUICAgICAgICAgICAgICAgICAgICgxIDw8IDIzKQogCiAvKiBURVgKICAqIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0ZXh0dXJlIGluc3RydWN0aW9ucyBjYW5ub3Qgd3JpdGUgaW50byBvdXRwdXQKICAqIHJlZ2lzdGVycyBkaXJlY3RseS4gQSBzdWJzZXF1ZW50IEFMVSBpbnN0cnVjdGlvbiBpcyBhbHdheXMgbmVjZXNzYXJ5LAogICogZXZlbiBpZiBpdCdzIGp1c3QgTUFEIG8wLCByMCwgMSwgMAogICovCi0jZGVmaW5lIFIzMDBfUEZTX1RFWElfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYyMAotIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfU0hJRlQgICAgICAgICAgICAgIDAKLSMJZGVmaW5lIFIzMDBfRlBJVFhfU1JDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMCkKLQkvKiBHVUVTUyAqLwotIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfQ09OU1QgICAgICAgICAgICAgICgxIDw8IDUpCi0jCWRlZmluZSBSMzAwX0ZQSVRYX0RTVF9TSElGVCAgICAgICAgICAgICAgNgotIwlkZWZpbmUgUjMwMF9GUElUWF9EU1RfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCA2KQotIwlkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9TSElGVCAgICAgICAgICAgIDExCi0JLyogR1VFU1MgYmFzZWQgb24gbGF5b3V0IGFuZCBuYXRpdmUgbGltaXRzICovCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX01BU0sgICAgICAgICAgICAgKDE1IDw8IDExKQotLyogVW5zdXJlIGlmIHRoZXNlIGFyZSBvcGNvZGVzLCBvciBzb21lIGtpbmQgb2YgYml0ZmllbGQsIGJ1dCB0aGlzIGlzIGhvdwotICogdGhleSB3ZXJlIHNldCB3aGVuIEkgY2hlY2tlZAotICovCi0jCWRlZmluZSBSMzAwX0ZQSVRYX09QQ09ERV9TSElGVAkJMTUKLSMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RFWAkxCi0jCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9LSUwJMgotIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhQCTMKLSMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYQgk0Ci0jCWRlZmluZSBSMzAwX0ZQSVRYX09QQ09ERV9NQVNLICAgICAgICAgICAoNyA8PCAxNSkKKyNkZWZpbmUgUjMwMF9VU19URVhfSU5TVF8wICAgICAgICAgICAgICAgICAgMHg0NjIwCisjCWRlZmluZSBSMzAwX1NSQ19BRERSX1NISUZUICAgICAgICAgIDAKKyMJZGVmaW5lIFIzMDBfU1JDX0FERFJfTUFTSyAgICAgICAgICAgKDMxIDw8IDApCisjCWRlZmluZSBSMzAwX0RTVF9BRERSX1NISUZUICAgICAgICAgIDYKKyMJZGVmaW5lIFIzMDBfRFNUX0FERFJfTUFTSyAgICAgICAgICAgKDMxIDw8IDYpCisjCWRlZmluZSBSMzAwX1RFWF9JRF9TSElGVCAgICAgICAgICAgIDExCisjICAgICAgIGRlZmluZSBSMzAwX1RFWF9JRF9NQVNLICAgICAgICAgICAgICgxNSA8PCAxMSkKKyMJZGVmaW5lIFIzMDBfVEVYX0lOU1RfU0hJRlQJCTE1CisjCQlkZWZpbmUgUjMwMF9URVhfT1BfTk9QCSAgICAgICAgMAorIwkJZGVmaW5lIFIzMDBfVEVYX09QX0xECSAgICAgICAgMQorIwkJZGVmaW5lIFIzMDBfVEVYX09QX0tJTAkgICAgICAgIDIKKyMJCWRlZmluZSBSMzAwX1RFWF9PUF9UWFAJICAgICAgICAzCisjCQlkZWZpbmUgUjMwMF9URVhfT1BfVFhCCSAgICAgICAgNAorIwlkZWZpbmUgUjMwMF9URVhfSU5TVF9NQVNLICAgICAgICAgICAgICAgKDcgPDwgMTUpCisKKy8qIE91dHB1dCBmb3JtYXQgZnJvbSB0aGUgdW5maWVkIHNoYWRlciAqLworI2RlZmluZSBSMzAwX1VTX09VVF9GTVQgICAgICAgICAgICAgICAgICAgICAweDQ2QTQKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DNF84ICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DNF8xMCAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DNF8xMF9HQU1NQSAgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzE2ICAgICAgICAgKDMgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DMl8xNiAgICAgICAgKDQgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DNF8xNiAgICAgICAgKDUgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzE2X01QRUcgICAgKDYgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DMl8xNl9NUEVHICAgKDcgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DMl80ICAgICAgICAgKDggPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzNfM18yICAgICAgKDkgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzZfNV82ICAgICAgKDEwIDw8IDApCisjCWRlZmluZSBSMzAwX1VTX09VVF9GTVRfQ18xMV8xMV8xMCAgICgxMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9VU19PVVRfRk1UX0NfMTBfMTFfMTEgICAoMTIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzJfMTBfMTBfMTAgKDEzIDw8IDApCisvKiByZXNlcnZlZCAqLworIwlkZWZpbmUgUjMwMF9VU19PVVRfRk1UX1VOVVNFRCAgICAgICAoMTUgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzE2X0ZQICAgICAgKDE2IDw8IDApCisjCWRlZmluZSBSMzAwX1VTX09VVF9GTVRfQzJfMTZfRlAgICAgICgxNyA8PCAwKQorIwlkZWZpbmUgUjMwMF9VU19PVVRfRk1UX0M0XzE2X0ZQICAgICAoMTggPDwgMCkKKyMJZGVmaW5lIFIzMDBfVVNfT1VUX0ZNVF9DXzMyX0ZQICAgICAgKDE5IDw8IDApCisjCWRlZmluZSBSMzAwX1VTX09VVF9GTVRfQzJfMzJfRlAgICAgICgyMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9VU19PVVRfRk1UX0M0XzMyX0ZQICAgICAoMjAgPDwgMCkKIAogLyogQUxVCiAgKiBUaGUgQUxVIGluc3RydWN0aW9ucyByZWdpc3RlciBibG9ja3MgYXJlIGVudW1lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlcgpAQCAtMTExMSwxNzIgKzE3NDgsMjU2IEBACiAgKiAgLSBTZXQgRlBJMC9GUEkyX1NQRUNJQUxfTFJQCiAgKiBBcmJpdHJhcnkgTFJQIChpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc3dpenpsaW5nKSByZXF1aXJlcyB2YW5pbGxhIE1BRCtNQUQKICAqLwotI2RlZmluZSBSMzAwX1BGU19JTlNUUjFfMCAgICAgICAgICAgICAgICAgICAweDQ2QzAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMwQ19TSElGVCAgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfQ09OU1QgICAgICAgICAgICAgKDEgPDwgNSkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMxQ19TSElGVCAgICAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMUNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMUNfQ09OU1QgICAgICAgICAgICAgKDEgPDwgMTEpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfU0hJRlQgICAgICAgICAgICAgMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMyQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfQ09OU1QgICAgICAgICAgICAgKDEgPDwgMTcpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzZmZmZgotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfU0hJRlQgICAgICAgICAgICAgIDE4Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfRFNUQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDE4KQotIwkJZGVmaW5lIFIzMDBfRlBJMV9EU1RDX1JFR19NQVNLX1NISUZUICAgICAyMwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1ggICAgICAgICAgICAgICgxIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1kgICAgICAgICAgICAgICgxIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1ogICAgICAgICAgICAgICgxIDw8IDI1KQotIwkJZGVmaW5lIFIzMDBfRlBJMV9EU1RDX09VVFBVVF9NQVNLX1NISUZUICAyNgotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1ggICAgICAgICAgICgxIDw8IDI2KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1kgICAgICAgICAgICgxIDw8IDI3KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1ogICAgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBSMzAwX1VTX0FMVV9SR0JfQUREUl8wICAgICAgICAgICAgICAgICAgIDB4NDZDMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMENfU0hJRlQgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMENfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMwQ19DT05TVCAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMUNfU0hJRlQgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMUNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDYpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMxQ19DT05TVCAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQzJDX1NISUZUICAgICAgICAgICAgIDEyCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMyQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMyQ19DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQ19NQVNLICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0RTVENfU0hJRlQgICAgICAgICAgICAgIDE4CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9EU1RDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCisjCQlkZWZpbmUgUjMwMF9BTFVfRFNUQ19SRUdfTUFTS19TSElGVCAgICAgMjMKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0RTVENfUkVHX1ggICAgICAgICAgICAgICgxIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfRFNUQ19SRUdfWSAgICAgICAgICAgICAgKDEgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9EU1RDX1JFR19aICAgICAgICAgICAgICAoMSA8PCAyNSkKKyMJCWRlZmluZSBSMzAwX0FMVV9EU1RDX09VVFBVVF9NQVNLX1NISUZUICAyNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfRFNUQ19PVVRQVVRfWCAgICAgICAgICAgKDEgPDwgMjYpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9EU1RDX09VVFBVVF9ZICAgICAgICAgICAoMSA8PCAyNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0RTVENfT1VUUFVUX1ogICAgICAgICAgICgxIDw8IDI4KQogCi0jZGVmaW5lIFIzMDBfUEZTX0lOU1RSM18wICAgICAgICAgICAgICAgICAgIDB4NDdDMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzBBX1NISUZUICAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMwQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMwQV9DT05TVCAgICAgICAgICAgICAoMSA8PCA1KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzFBX1NISUZUICAgICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMxQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgNikKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMxQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxMSkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9TSElGVCAgICAgICAgICAgICAxMgotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxMikKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDNmZmZmCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9TSElGVCAgICAgICAgICAgICAgMTgKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9SRUcgICAgICAgICAgICAgICAgKDEgPDwgMjMpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9PVVRQVVQgICAgICAgICAgICAgKDEgPDwgMjQpCi0jCQlkZWZpbmUgUjMwMF9GUEkzX0RTVEFfREVQVEggICAgICAgICAgICAgICgxIDw8IDI3KQorI2RlZmluZSBSMzAwX1VTX0FMVV9BTFBIQV9BRERSXzAgICAgICAgICAgICAgICAgIDB4NDdDMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMEFfU0hJRlQgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMEFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMwQV9DT05TVCAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMUFfU0hJRlQgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDMUFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDYpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMxQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQzJBX1NISUZUICAgICAgICAgICAgIDEyCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMyQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkMyQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQ19NQVNLICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0RTVEFfU0hJRlQgICAgICAgICAgICAgIDE4CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9EU1RBX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9EU1RBX1JFRyAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0RTVEFfT1VUUFVUICAgICAgICAgICAgICgxIDw8IDI0KQorIwkJZGVmaW5lIFIzMDBfQUxVX0RTVEFfREVQVEggICAgICAgICAgICAgICgxIDw8IDI3KQogCi0jZGVmaW5lIFIzMDBfUEZTX0lOU1RSMF8wICAgICAgICAgICAgICAgICAgIDB4NDhDMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWFlaICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1hYWCAgICAgICAgICAxCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19ZWVkgICAgICAgICAgMgotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWlpaICAgICAgICAgIDMKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1hZWiAgICAgICAgICA0Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19YWFggICAgICAgICAgNQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfWVlZICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1paWiAgICAgICAgICA3Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMyQ19YWVogICAgICAgICAgOAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWFhYICAgICAgICAgIDkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1lZWSAgICAgICAgICAxMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWlpaICAgICAgICAgIDExCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQSAgICAgICAgICAgICAgMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFBICAgICAgICAgICAgICAxMwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkEgICAgICAgICAgICAgIDE0Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19MUlAgICAgICAgICAgMTUKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1pFUk8gICAgICAgICAgICAgICAyMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfT05FICAgICAgICAgICAgICAgIDIxCi0JLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX0hBTEYgICAgICAgICAgICAgICAyMgotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVpYICAgICAgICAgIDIzCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19ZWlggICAgICAgICAgMjQKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1laWCAgICAgICAgICAyNQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWlhZICAgICAgICAgIDI2Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19aWFkgICAgICAgICAgMjcKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1pYWSAgICAgICAgICAyOAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENBX1daWSAgICAgICAgIDI5Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ0FfV1pZICAgICAgICAgMzAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDQV9XWlkgICAgICAgICAzMQorI2RlZmluZSBSMzAwX1VTX0FMVV9SR0JfSU5TVF8wICAgICAgICAgICAgICAgICAgIDB4NDhDMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMwQ19YWVogICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMwQ19YWFggICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMwQ19ZWVkgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMwQ19aWlogICAgICAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMxQ19YWVogICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMxQ19YWFggICAgICAgICAgNQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMxQ19ZWVkgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMxQ19aWlogICAgICAgICAgNworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ19YWVogICAgICAgICAgOAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ19YWFggICAgICAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ19ZWVkgICAgICAgICAgMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDMkNfWlpaICAgICAgICAgIDExCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQzBBICAgICAgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMxQSAgICAgICAgICAgICAgMTMKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDMkEgICAgICAgICAgICAgIDE0CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQ1BfWFlaICAgICAgICAgICAxNQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkNQX1hYWCAgICAgICAgICAgMTYKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDUF9ZWVkgICAgICAgICAgIDE3CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQ1BfWlpaICAgICAgICAgICAxOAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkNQX1dXVyAgICAgICAgICAgMTkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfWkVSTyAgICAgICAgICAgICAgIDIwCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX09ORSAgICAgICAgICAgICAgICAyMQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19IQUxGICAgICAgICAgICAgICAgMjIKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDMENfWVpYICAgICAgICAgIDIzCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQzFDX1laWCAgICAgICAgICAyNAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ19ZWlggICAgICAgICAgMjUKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDMENfWlhZICAgICAgICAgIDI2CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQzFDX1pYWSAgICAgICAgICAyNworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ19aWFkgICAgICAgICAgMjgKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0NfU1JDMENBX1daWSAgICAgICAgIDI5CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdDX1NSQzFDQV9XWlkgICAgICAgICAzMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQ19TUkMyQ0FfV1pZICAgICAgICAgMzEKIAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzBDX1NISUZUICAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcwQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcwQ19ORUcgICAgICAgICAgICAgICAoMSA8PCA1KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzBDX0FCUyAgICAgICAgICAgICAgICgxIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHMUNfU0hJRlQgICAgICAgICAgICAgNwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzFDX01BU0sgICAgICAgICAgICAgICgzMSA8PCA3KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzFDX05FRyAgICAgICAgICAgICAgICgxIDw8IDEyKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzFDX0FCUyAgICAgICAgICAgICAgICgxIDw8IDEzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzJDX1NISUZUICAgICAgICAgICAgIDE0Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHMkNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDE0KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzJDX05FRyAgICAgICAgICAgICAgICgxIDw8IDE5KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzJDX0FCUyAgICAgICAgICAgICAgICgxIDw8IDIwKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX1NQRUNJQUxfTFJQICAgICAgICAgICAgICgxIDw8IDIxKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfTUFEICAgICAgICAgICAgICAgICgwIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfRFAzICAgICAgICAgICAgICAgICgxIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfRFA0ICAgICAgICAgICAgICAgICgyIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfTUlOICAgICAgICAgICAgICAgICg0IDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfTUFYICAgICAgICAgICAgICAgICg1IDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfQ01QSCAgICAgICAgICAgICAgICg3IDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfQ01QICAgICAgICAgICAgICAgICg4IDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfRlJDICAgICAgICAgICAgICAgICg5IDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfUkVQTF9BTFBIQSAgICAgICAgICgxMCA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX1NBVCAgICAgICAgICAgICAgICAoMSA8PCAzMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9JTlNFUlRfTk9QICAgICAgICAgICAgICAoMSA8PCAzMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzBDX1NISUZUICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzBDX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMENfTk9QICAgICAgICAgICAgICAgKDAgPDwgNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzBDX05FRyAgICAgICAgICAgICAgICgxIDw8IDUpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcwQ19BQlMgICAgICAgICAgICAgICAoMiA8PCA1KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMENfTkFCICAgICAgICAgICAgICAgKDMgPDwgNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzFDX1NISUZUICAgICAgICAgICAgIDcKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzFDX01BU0sgICAgICAgICAgICAgICgzMSA8PCA3KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMUNfTk9QICAgICAgICAgICAgICAgKDAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcxQ19ORUcgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzFDX0FCUyAgICAgICAgICAgICAgICgyIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMUNfTkFCICAgICAgICAgICAgICAgKDMgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcyQ19TSElGVCAgICAgICAgICAgICAxNAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMkNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDE0KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMkNfTk9QICAgICAgICAgICAgICAgKDAgPDwgMTkpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcyQ19ORUcgICAgICAgICAgICAgICAoMSA8PCAxOSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzJDX0FCUyAgICAgICAgICAgICAgICgyIDw8IDE5KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMkNfTkFCICAgICAgICAgICAgICAgKDMgPDwgMTkpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkNQXzFfTUlOVVNfMl9TUkMwICAgICAoMCA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQ1BfU1JDMV9NSU5VU19TUkMwICAgICgxIDw8IDIxKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDUF9TUkMxX1BMVVNfU1JDMCAgICAgKDIgPDwgMjEpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkNQXzFfTUlOVVNfU1JDMCAgICAgICAoMyA8PCAyMSkKIAotI2RlZmluZSBSMzAwX1BGU19JTlNUUjJfMCAgICAgICAgICAgICAgICAgICAweDQ5QzAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzBDX1ggICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMwQ19ZICAgICAgICAgICAgMQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMENfWiAgICAgICAgICAgIDIKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzFDX1ggICAgICAgICAgICAzCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMxQ19ZICAgICAgICAgICAgNAotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMUNfWiAgICAgICAgICAgIDUKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzJDX1ggICAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMyQ19ZICAgICAgICAgICAgNwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMkNfWiAgICAgICAgICAgIDgKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzBBICAgICAgICAgICAgICA5Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMxQSAgICAgICAgICAgICAgMTAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzJBICAgICAgICAgICAgICAxMQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMUFfTFJQICAgICAgICAgIDE1Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9aRVJPICAgICAgICAgICAgICAgMTYKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX09ORSAgICAgICAgICAgICAgICAxNwotCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9IQUxGICAgICAgICAgICAgICAgMTgKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9TSElGVCAgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTkVHICAgICAgICAgICAgICAgKDEgPDwgNSkKLQkvKiBHVUVTUyAqLwotIwlkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX0FCUwkJICgxIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfU0hJRlQgICAgICAgICAgICAgNwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX01BU0sgICAgICAgICAgICAgICgzMSA8PCA3KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX05FRyAgICAgICAgICAgICAgICgxIDw8IDEyKQotCS8qIEdVRVNTICovCi0jCWRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfQUJTCQkgKDEgPDwgMTMpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfU0hJRlQgICAgICAgICAgICAgMTQKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTQpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTkpCi0JLyogR1VFU1MgKi8KLSMJZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9BQlMJCSAoMSA8PCAyMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9TUEVDSUFMX0xSUCAgICAgICAgICAgICAoMSA8PCAyMSkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX01BRCAgICAgICAgICAgICAgICAoMCA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0RQNCAgICAgICAgICAgICAgICAoMSA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX01JTiAgICAgICAgICAgICAgICAoMiA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX01BWCAgICAgICAgICAgICAgICAoMyA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0NNUCAgICAgICAgICAgICAgICAoNiA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0ZSQyAgICAgICAgICAgICAgICAoNyA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0VYMiAgICAgICAgICAgICAgICAoOCA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0xHMiAgICAgICAgICAgICAgICAoOSA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX1JDUCAgICAgICAgICAgICAgICAoMTAgPDwgMjMpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9SU1EgICAgICAgICAgICAgICAgKDExIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfU0FUICAgICAgICAgICAgICAgICgxIDw8IDMwKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX1VOS05PV05fMzEgICAgICAgICAgICAgICgxIDw8IDMxKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19NQUQgICAgICAgICAgICAgICAgKDAgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX0RQMyAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVENfRFA0ICAgICAgICAgICAgICAgICgyIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19EMkEgICAgICAgICAgICAgICAgKDMgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX01JTiAgICAgICAgICAgICAgICAoNCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVENfTUFYICAgICAgICAgICAgICAgICg1IDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19DTVBIICAgICAgICAgICAgICAgKDcgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX0NNUCAgICAgICAgICAgICAgICAoOCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVENfRlJDICAgICAgICAgICAgICAgICg5IDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19SRVBMX0FMUEhBICAgICAgICAgKDEwIDw8IDIzKQorCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX01PRF9OT1AgICAgICAgICAgICAoMCA8PCAyNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVENfTU9EX01VTDIgICAgICAgICAgICgxIDw8IDI3KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19NT0RfTVVMNCAgICAgICAgICAgKDIgPDwgMjcpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX01PRF9NVUw4ICAgICAgICAgICAoMyA8PCAyNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVENfTU9EX0RJVjIgICAgICAgICAgICg0IDw8IDI3KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19NT0RfRElWNCAgICAgICAgICAgKDUgPDwgMjcpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRDX01PRF9ESVY4ICAgICAgICAgICAoNiA8PCAyNykKKworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQ19DTEFNUCAgICAgICAgICAgICAgKDEgPDwgMzApCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9JTlNFUlRfTk9QICAgICAgICAgICAgICAoMSA8PCAzMSkKKworI2RlZmluZSBSMzAwX1VTX0FMVV9BTFBIQV9JTlNUXzAgICAgICAgICAgICAgICAgIDB4NDlDMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMwQ19YICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMwQ19ZICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMwQ19aICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMxQ19YICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMxQ19ZICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMxQ19aICAgICAgICAgICAgNQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMyQ19YICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMyQ19ZICAgICAgICAgICAgNworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMyQ19aICAgICAgICAgICAgOAorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMwQSAgICAgICAgICAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkMxQSAgICAgICAgICAgICAgMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0FfU1JDMkEgICAgICAgICAgICAgIDExCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdBX1NSQ1BfWCAgICAgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9TUkNQX1kgICAgICAgICAgICAgMTMKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0FfU1JDUF9aICAgICAgICAgICAgIDE0CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdBX1NSQ1BfVyAgICAgICAgICAgICAxNQorCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkdBX1pFUk8gICAgICAgICAgICAgICAxNgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHQV9PTkUgICAgICAgICAgICAgICAgMTcKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSR0FfSEFMRiAgICAgICAgICAgICAgIDE4CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcwQV9TSElGVCAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcwQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzBBX05PUCAgICAgICAgICAgICAgICgwIDw8IDUpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcwQV9ORUcgICAgICAgICAgICAgICAoMSA8PCA1KQorIwlkZWZpbmUgUjMwMF9BTFVfQVJHMEFfQUJTCQkgKDIgPDwgNSkKKyMJZGVmaW5lIFIzMDBfQUxVX0FSRzBBX05BQgkJICgzIDw8IDUpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcxQV9TSElGVCAgICAgICAgICAgICA3CisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9BUkcxQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzFBX05PUCAgICAgICAgICAgICAgICgwIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMUFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjCWRlZmluZSBSMzAwX0FMVV9BUkcxQV9BQlMJCSAoMiA8PCAxMikKKyMJZGVmaW5lIFIzMDBfQUxVX0FSRzFBX05BQgkJICgzIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMkFfU0hJRlQgICAgICAgICAgICAgMTQKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX0FSRzJBX05PUCAgICAgICAgICAgICAgICgwIDw8IDE5KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfQVJHMkFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTkpCisjCWRlZmluZSBSMzAwX0FMVV9BUkcyQV9BQlMJCSAoMiA8PCAxOSkKKyMJZGVmaW5lIFIzMDBfQUxVX0FSRzJBX05BQgkJICgzIDw8IDE5KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDUF8xX01JTlVTXzJfU1JDMCAgICAgKDAgPDwgMjEpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9TUkNQX1NSQzFfTUlOVVNfU1JDMCAgICAoMSA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX1NSQ1BfU1JDMV9QTFVTX1NSQzAgICAgICgyIDw8IDIxKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfU1JDUF8xX01JTlVTX1NSQzAgICAgICAgKDMgPDwgMjEpCisKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfTUFEICAgICAgICAgICAgICAgICgwIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9EUDQgICAgICAgICAgICAgICAgKDEgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRBX01JTiAgICAgICAgICAgICAgICAoMiA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfTUFYICAgICAgICAgICAgICAgICgzIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9DTkQgICAgICAgICAgICAgICAgKDUgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRBX0NNUCAgICAgICAgICAgICAgICAoNiA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfRlJDICAgICAgICAgICAgICAgICg3IDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9FWDIgICAgICAgICAgICAgICAgKDggPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRBX0xHMiAgICAgICAgICAgICAgICAoOSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfUkNQICAgICAgICAgICAgICAgICgxMCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfUlNRICAgICAgICAgICAgICAgICgxMSA8PCAyMykKKworIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9NT0RfTk9QICAgICAgICAgICAgKDAgPDwgMjcpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRBX01PRF9NVUwyICAgICAgICAgICAoMSA8PCAyNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfTU9EX01VTDQgICAgICAgICAgICgyIDw8IDI3KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9NT0RfTVVMOCAgICAgICAgICAgKDMgPDwgMjcpCisjICAgICAgIGRlZmluZSBSMzAwX0FMVV9PVVRBX01PRF9ESVYyICAgICAgICAgICAoNCA8PCAyNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfTU9EX0RJVjQgICAgICAgICAgICg1IDw8IDI3KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFVfT1VUQV9NT0RfRElWOCAgICAgICAgICAgKDYgPDwgMjcpCisKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxVX09VVEFfQ0xBTVAgICAgICAgICAgICAgICgxIDw8IDMwKQogLyogRU5EOiBGcmFnbWVudCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLwogCi0vKiBGb2cgc3RhdGUgYW5kIGNvbG9yICovCi0jZGVmaW5lIFIzMDBfUkVfRk9HX1NUQVRFICAgICAgICAgICAgICAgICAgIDB4NEJDMAotIyAgICAgICBkZWZpbmUgUjMwMF9GT0dfRU5BQkxFICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jCWRlZmluZSBSMzAwX0ZPR19NT0RFX0xJTkVBUiAgICAgICAgICAgICAgKDAgPDwgMSkKLSMJZGVmaW5lIFIzMDBfRk9HX01PREVfRVhQICAgICAgICAgICAgICAgICAoMSA8PCAxKQotIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9FWFAyICAgICAgICAgICAgICAgICgyIDw8IDEpCi0jCWRlZmluZSBSMzAwX0ZPR19NT0RFX01BU0sgICAgICAgICAgICAgICAgKDMgPDwgMSkKLSNkZWZpbmUgUjMwMF9GT0dfQ09MT1JfUiAgICAgICAgICAgICAgICAgICAgMHg0QkM4Ci0jZGVmaW5lIFIzMDBfRk9HX0NPTE9SX0cgICAgICAgICAgICAgICAgICAgIDB4NEJDQwotI2RlZmluZSBSMzAwX0ZPR19DT0xPUl9CICAgICAgICAgICAgICAgICAgICAweDRCRDAKKy8qIEZvZzogRm9nIEJsZW5kaW5nIEVuYWJsZSAqLworI2RlZmluZSBSMzAwX0ZHX0ZPR19CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YmMwCisjICAgICAgIGRlZmluZSBSMzAwX0ZHX0ZPR19CTEVORF9ESVNBQkxFICAgICAgICAgICAgICAoMCA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19GT0dfQkxFTkRfRU5BQkxFICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfRkdfRk9HX0JMRU5EX0ZOX0xJTkVBUiAgICAgICAgICAgICgwIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZHX0ZPR19CTEVORF9GTl9FWFAgICAgICAgICAgICAgICAoMSA8PCAxKQorIwlkZWZpbmUgUjMwMF9GR19GT0dfQkxFTkRfRk5fRVhQMiAgICAgICAgICAgICAgKDIgPDwgMSkKKyMJZGVmaW5lIFIzMDBfRkdfRk9HX0JMRU5EX0ZOX0NPTlNUQU5UICAgICAgICAgICgzIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZHX0ZPR19CTEVORF9GTl9NQVNLICAgICAgICAgICAgICAoMyA8PCAxKQogCi0jZGVmaW5lIFIzMDBfUFBfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgIDB4NEJENAotIyAgICAgICBkZWZpbmUgUjMwMF9SRUZfQUxQSEFfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwZmYKLSMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9GQUlMICAgICAgICAgICAgICAoMCA8PCA4KQotIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0xFU1MgICAgICAgICAgICAgICgxIDw8IDgpCi0jICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfTEVRVUFMICAgICAgICAgICAgKDMgPDwgOCkKLSMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9FUVVBTCAgICAgICAgICAgICAoMiA8PCA4KQotIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0dFUVVBTCAgICAgICAgICAgICg2IDw8IDgpCi0jICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfR1JFQVRFUiAgICAgICAgICAgKDQgPDwgOCkKLSMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9ORVFVQUwgICAgICAgICAgICAoNSA8PCA4KQotIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX1BBU1MgICAgICAgICAgICAgICg3IDw8IDgpCi0jICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfT1BfTUFTSyAgICAgICAgICAgKDcgPDwgOCkKLSMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxMSkKKy8qIEZvZzogUmVkIENvbXBvbmVudCBvZiBGb2cgQ29sb3IgKi8KKyNkZWZpbmUgUjMwMF9GR19GT0dfQ09MT1JfUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGJjOAorLyogRm9nOiBHcmVlbiBDb21wb25lbnQgb2YgRm9nIENvbG9yICovCisjZGVmaW5lIFIzMDBfRkdfRk9HX0NPTE9SX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiY2MKKy8qIEZvZzogQmx1ZSBDb21wb25lbnQgb2YgRm9nIENvbG9yICovCisjZGVmaW5lIFIzMDBfRkdfRk9HX0NPTE9SX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiZDAKKyMJZGVmaW5lIFIzMDBfRkdfRk9HX0NPTE9SX01BU0sgMHgwMDAwMDNmZgorCisvKiBGb2c6IENvbnN0YW50IEZhY3RvciBmb3IgRm9nIEJsZW5kaW5nICovCisjZGVmaW5lIFIzMDBfRkdfRk9HX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiYzQKKyMJZGVmaW5lIEZHX0ZPR19GQUNUT1JfTUFTSyAweDAwMDAwM2ZmCisKKy8qIEZvZzogQWxwaGEgZnVuY3Rpb24gKi8KKyNkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGJkNAorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX1ZBTF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBmZgorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX05FVkVSICAgICAgICAgICAgICAgICAgICAgKDAgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRkdfQUxQSEFfRlVOQ19MRVNTICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0ZHX0FMUEhBX0ZVTkNfRVFVQUwgICAgICAgICAgICAgICAgICAgICAoMiA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX0xFICAgICAgICAgICAgICAgICAgICAgICAgKDMgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRkdfQUxQSEFfRlVOQ19HUkVBVEVSICAgICAgICAgICAgICAgICAgICg0IDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0ZHX0FMUEhBX0ZVTkNfTk9URVFVQUwgICAgICAgICAgICAgICAgICAoNSA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX0dFICAgICAgICAgICAgICAgICAgICAgICAgKDYgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRkdfQUxQSEFfRlVOQ19BTFdBWVMgICAgICAgICAgICAgICAgICAgICg3IDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoNyA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgKDAgPDwgMTEpCisjICAgICAgIGRlZmluZSBSMzAwX0ZHX0FMUEhBX0ZVTkNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKworIyAgICAgICBkZWZpbmUgUjUwMF9GR19BTFBIQV9GVU5DXzEwQklUICAgICAgICAgICAgICAgICAgICAgKDAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSNTAwX0ZHX0FMUEhBX0ZVTkNfOEJJVCAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKworIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX01BU0tfRElTQUJMRSAgICAgICAgICAgICAgKDAgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0ZHX0FMUEhBX0ZVTkNfTUFTS19FTkFCTEUgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfRkdfQUxQSEFfRlVOQ19DRkdfMl9PRl80ICAgICAgICAgICAgICAgICgwIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX0NGR18zX09GXzYgICAgICAgICAgICAgICAgKDEgPDwgMTcpCisKKyMgICAgICAgZGVmaW5lIFIzMDBfRkdfQUxQSEFfRlVOQ19ESVRIX0RJU0FCTEUgICAgICAgICAgICAgICgwIDw8IDIwKQorIyAgICAgICBkZWZpbmUgUjMwMF9GR19BTFBIQV9GVU5DX0RJVEhfRU5BQkxFICAgICAgICAgICAgICAgKDEgPDwgMjApCisKKyMgICAgICAgZGVmaW5lIFI1MDBfRkdfQUxQSEFfRlVOQ19PRkZTRVRfRElTQUJMRSAgICAgICAgICAgICgwIDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjUwMF9GR19BTFBIQV9GVU5DX09GRlNFVF9FTkFCTEUgICAgICAgICAgICAgKDEgPDwgMjQpIC8qIE5vdCBzdXBwb3J0ZWQgaW4gUjUyMCAqLworIyAgICAgICBkZWZpbmUgUjUwMF9GR19BTFBIQV9GVU5DX0RJU0NfWkVST19NQVNLX0RJU0FCTEUgICAgKDAgPDwgMjUpCisjICAgICAgIGRlZmluZSBSNTAwX0ZHX0FMUEhBX0ZVTkNfRElTQ19aRVJPX01BU0tfRU5BQkxFICAgICAoMSA8PCAyNSkKKworIyAgICAgICBkZWZpbmUgUjUwMF9GR19BTFBIQV9GVU5DX0ZQMTZfRElTQUJMRSAgICAgICAgICAgICAgKDAgPDwgMjgpCisjICAgICAgIGRlZmluZSBSNTAwX0ZHX0FMUEhBX0ZVTkNfRlAxNl9FTkFCTEUgICAgICAgICAgICAgICAoMSA8PCAyOCkKKworCisvKiBGb2c6IFdoZXJlIGRvZXMgdGhlIGRlcHRoIGNvbWUgZnJvbT8gKi8KKyNkZWZpbmUgUjMwMF9GR19ERVBUSF9TUkMgICAgICAgICAgICAgICAgICAweDRiZDgKKyMJZGVmaW5lIFIzMDBfRkdfREVQVEhfU1JDX1NDQU4gICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9GR19ERVBUSF9TUkNfU0hBREVSICgxIDw8IDApCisKKy8qIEZvZzogQWxwaGEgQ29tcGFyZSBWYWx1ZSAqLworI2RlZmluZSBSNTAwX0ZHX0FMUEhBX1ZBTFVFICAgICAgICAgICAgICAgIDB4NGJlMAorIwlkZWZpbmUgUjUwMF9GR19BTFBIQV9WQUxVRV9NQVNLIDB4MDAwMGZmZmYKIAogLyogZ2FwICovCiAKQEAgLTEyODUsMTIgKzIwMDYsMzMgQEAKICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMF9ZICAgICAgICAgICAgICAgICAgMHg0QzA0CiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfWiAgICAgICAgICAgICAgICAgIDB4NEMwOAogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8wX1cgICAgICAgICAgICAgICAgICAweDRDMEMKLS8qIEdVRVNTOiBQQVJBTV8zMSBpcyBsYXN0LCBiYXNlZCBvbiBuYXRpdmUgbGltaXRzIHJlcG9ydGVkIGJ5IGZnbHJ4ICovCisvKiBsYXN0IGNvbnN0cyAqLwogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8zMV9YICAgICAgICAgICAgICAgICAweDRERjAKICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMzFfWSAgICAgICAgICAgICAgICAgMHg0REY0CiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzMxX1ogICAgICAgICAgICAgICAgIDB4NERGOAogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8zMV9XICAgICAgICAgICAgICAgICAweDRERkMKIAorLyogVW5waXBlbGluZWQuICovCisjZGVmaW5lIFIzMDBfUkIzRF9DQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4NGUwMAorIwlkZWZpbmUgUjMwMF9SQjNEX0NDVExfTlVNX01VTFRJV1JJVEVTXzFfQlVGRkVSICAgICAgICAgICAgICAgICgwIDw8IDUpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9OVU1fTVVMVElXUklURVNfMl9CVUZGRVJTICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMJZGVmaW5lIFIzMDBfUkIzRF9DQ1RMX05VTV9NVUxUSVdSSVRFU18zX0JVRkZFUlMgICAgICAgICAgICAgICAoMiA8PCA1KQorIwlkZWZpbmUgUjMwMF9SQjNEX0NDVExfTlVNX01VTFRJV1JJVEVTXzRfQlVGRkVSUyAgICAgICAgICAgICAgICgzIDw8IDUpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9DTFJDTVBfRkxJUEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgKDAgPDwgNykKKyMJZGVmaW5lIFIzMDBfUkIzRF9DQ1RMX0NMUkNNUF9GTElQRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQorIwlkZWZpbmUgUjMwMF9SQjNEX0NDVExfQUFfQ09NUFJFU1NJT05fRElTQUJMRSAgICAgICAgICAgICAgICAgICgwIDw8IDkpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9BQV9DT01QUkVTU0lPTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyMJZGVmaW5lIFIzMDBfUkIzRF9DQ1RMX0NNQVNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAxMCkKKyMJZGVmaW5lIFIzMDBfUkIzRF9DQ1RMX0NNQVNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKy8qIHJlc2VydmVkICovCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9JTkRFUEVOREVOVF9DT0xPUl9DSEFOTkVMX01BU0tfRElTQUJMRSAgKDAgPDwgMTIpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9JTkRFUEVOREVOVF9DT0xPUl9DSEFOTkVMX01BU0tfRU5BQkxFICAgKDEgPDwgMTIpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9XUklURV9DT01QUkVTU0lPTl9FTkFCTEUgICAgICAgICAgICAgICAgKDAgPDwgMTMpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9XUklURV9DT01QUkVTU0lPTl9ESVNBQkxFICAgICAgICAgICAgICAgKDEgPDwgMTMpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9JTkRFUEVOREVOVF9DT0xPUkZPUk1BVF9FTkFCTEVfRElTQUJMRSAgKDAgPDwgMTQpCisjCWRlZmluZSBSMzAwX1JCM0RfQ0NUTF9JTkRFUEVOREVOVF9DT0xPUkZPUk1BVF9FTkFCTEVfRU5BQkxFICAgKDEgPDwgMTQpCisKKwogLyogTm90ZXM6CiAgKiAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX1VOS05PV04gd2hlbiBibGVuZGluZyBpcyB1c2VkIGluCiAgKiAgIHRoZSBhcHBsaWNhdGlvbgpAQCAtMTMwMiw5ICsyMDQ0LDE3IEBACiAjZGVmaW5lIFIzMDBfUkIzRF9DQkxFTkQgICAgICAgICAgICAgICAgICAgIDB4NEUwNAogI2RlZmluZSBSMzAwX1JCM0RfQUJMRU5EICAgICAgICAgICAgICAgICAgICAweDRFMDgKIC8qIHRoZSBmb2xsb3dpbmcgb25seSBhcHBlYXIgaW4gQ0JMRU5EICovCi0jICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICgzIDw8IDEpCi0jICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX05PX1NFUEFSQVRFICAgICAgICAgICAgICAgICgxIDw8IDMpCisjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX0JMRU5EX0VOQUJMRSAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1NFUEFSQVRFX0FMUEhBX0VOQUJMRSAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBSMzAwX1JFQURfRU5BQkxFICAgICAgICAgICAgICAgICgxIDw8IDIpCisjICAgICAgIGRlZmluZSBSMzAwX0RJU0NBUkRfU1JDX1BJWEVMU19ESVMgICAgICgwIDw8IDMpCisjICAgICAgIGRlZmluZSBSMzAwX0RJU0NBUkRfU1JDX1BJWEVMU19TUkNfQUxQSEFfMCAgICAgKDEgPDwgMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRElTQ0FSRF9TUkNfUElYRUxTX1NSQ19DT0xPUl8wICAgICAoMiA8PCAzKQorIyAgICAgICBkZWZpbmUgUjMwMF9ESVNDQVJEX1NSQ19QSVhFTFNfU1JDX0FMUEhBX0NPTE9SXzAgICAgICgzIDw8IDMpCisjICAgICAgIGRlZmluZSBSMzAwX0RJU0NBUkRfU1JDX1BJWEVMU19TUkNfQUxQSEFfMSAgICAgKDQgPDwgMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRElTQ0FSRF9TUkNfUElYRUxTX1NSQ19DT0xPUl8xICAgICAoNSA8PCAzKQorIyAgICAgICBkZWZpbmUgUjMwMF9ESVNDQVJEX1NSQ19QSVhFTFNfU1JDX0FMUEhBX0NPTE9SXzEgICAgICg2IDw8IDMpCisKIC8qIHRoZSBmb2xsb3dpbmcgYXJlIHNoYXJlZCBiZXR3ZWVuIENCTEVORCBhbmQgQUJMRU5EICovCiAjICAgICAgIGRlZmluZSBSMzAwX0ZDTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICgzICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fQUREX0NMQU1QICAgICAgICAgICAgICAgKDAgIDw8IDEyKQpAQCAtMTMzMyw2NyArMjA4MywyMTMgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDYzKQogIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfU0hJRlQgICAgICAgICAgICAgICAgICAoMTYpCiAjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9TSElGVCAgICAgICAgICAgICAgICAgICgyNCkKKworLyogQ29uc3RhbnQgY29sb3IgdXNlZCBieSB0aGUgYmxlbmRlci4gUGlwZWxpbmVkIHRocm91Z2ggdGhlIGJsZW5kZXIuCisgKiBOb3RlOiBGb3IgUjUyMCwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLCB1c2UgUkIzRF9DT05TVEFOVF9DT0xPUl9HQl9fQkxVRSwKKyAqIFJCM0RfQ09OU1RBTlRfQ09MT1JfR0JfX0dSRUVOLCBldGMuIGluc3RlYWQuCisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgMHg0RTEwCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk1BU0sgICAgICAgICAgICAgICAgIDB4NEUwQwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0IgICAgICAgICAgICAgICAgICgxPDwwKQotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0cgICAgICAgICAgICAgICAgICgxPDwxKQotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX1IgICAgICAgICAgICAgICAgICgxPDwyKQotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0EgICAgICAgICAgICAgICAgICgxPDwzKQorCisKKy8qIDNEIENvbG9yIENoYW5uZWwgTWFzay4gSWYgYWxsIHRoZSBjaGFubmVscyB1c2VkIGluIHRoZSBjdXJyZW50IGNvbG9yIGZvcm1hdAorICogYXJlIGRpc2FibGVkLCB0aGVuIHRoZSBjYiB3aWxsIGRpc2NhcmQgYWxsIHRoZSBpbmNvbWluZyBxdWFkcy4gUGlwZWxpbmVkCisgKiB0aHJvdWdoIHRoZSBibGVuZGVyLgorICovCisjZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLICAgICAgICAgICAgICAgICAgMHg0RTBDCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19CTFVFX01BU0swICAoMSA8PCAwKQorIwlkZWZpbmUgUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfR1JFRU5fTUFTSzAgKDEgPDwgMSkKKyMJZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX1JFRF9NQVNLMCAgICgxIDw8IDIpCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19BTFBIQV9NQVNLMCAoMSA8PCAzKQorIwlkZWZpbmUgUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfQkxVRV9NQVNLMSAgKDEgPDwgNCkKKyMJZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0dSRUVOX01BU0sxICgxIDw8IDUpCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19SRURfTUFTSzEgICAoMSA8PCA2KQorIwlkZWZpbmUgUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfQUxQSEFfTUFTSzEgKDEgPDwgNykKKyMJZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0JMVUVfTUFTSzIgICgxIDw8IDgpCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19HUkVFTl9NQVNLMiAoMSA8PCA5KQorIwlkZWZpbmUgUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfUkVEX01BU0syICAgKDEgPDwgMTApCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19BTFBIQV9NQVNLMiAoMSA8PCAxMSkKKyMJZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0JMVUVfTUFTSzMgICgxIDw8IDEyKQorIwlkZWZpbmUgUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfR1JFRU5fTUFTSzMgKDEgPDwgMTMpCisjCWRlZmluZSBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTS19SRURfTUFTSzMgICAoMSA8PCAxNCkKKyMJZGVmaW5lIFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0FMUEhBX01BU0szICgxIDw8IDE1KQorCisvKiBDbGVhciBjb2xvciB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgY29sb3IgbWFzayBpcyBzZXQgdG8gMDAuIFVucGlwZWxpbmVkLgorICogUHJvZ3JhbSB0aGlzIHJlZ2lzdGVyIHdpdGggYSAzMi1iaXQgdmFsdWUgaW4gQVJHQjg4ODggb3IgQVJHQjIxMDEwMTAKKyAqIGZvcm1hdHMsIGlnbm9yaW5nIHRoZSBmaWVsZHMuCisgKi8KKyNkZWZpbmUgUkIzRF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAweDRlMTQKIAogLyogZ2FwICovCiAKKy8qIENvbG9yIENvbXBhcmUgQ29sb3IuIFN0YWxscyB0aGUgMmQvM2QgZGF0YXBhdGggdW50aWwgaXQgaXMgaWRsZS4gKi8KKyNkZWZpbmUgUkIzRF9DTFJDTVBfQ0xSICAgICAgICAgICAgICAgICAgICAgMHg0ZTIwCisKKy8qIENvbG9yIENvbXBhcmUgTWFzay4gU3RhbGxzIHRoZSAyZC8zZCBkYXRhcGF0aCB1bnRpbCBpdCBpcyBpZGxlLiAqLworI2RlZmluZSBSQjNEX0NMUkNNUF9NU0sgICAgICAgICAgICAgICAgICAgICAweDRlMjQKKworLyogQ29sb3IgQnVmZmVyIEFkZHJlc3MgT2Zmc2V0IG9mIG11bHRpYnVmZmVyIDAuIFVucGlwZWxpbmVkLiAqLwogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQwICAgICAgICAgICAgICAweDRFMjgKLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JPRkZTRVRfTUFTSyAgICAgICAgICAgICAweEZGRkZGRkYwIC8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDEgICAgICAgICAgICAgIDB4NEUyQyAvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQyICAgICAgICAgICAgICAweDRFMzAgLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMyAgICAgICAgICAgICAgMHg0RTM0IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9ST0ZGU0VUX01BU0sgICAgICAgICAgICAgMHhGRkZGRkZFMAorLyogQ29sb3IgQnVmZmVyIEFkZHJlc3MgT2Zmc2V0IG9mIG11bHRpYnVmZmVyIDEuIFVucGlwZWxpbmVkLiAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQxICAgICAgICAgICAgICAweDRFMkMKKy8qIENvbG9yIEJ1ZmZlciBBZGRyZXNzIE9mZnNldCBvZiBtdWx0aWJ1ZmZlciAyLiBVbnBpcGVsaW5lZC4gKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMiAgICAgICAgICAgICAgMHg0RTMwCisvKiBDb2xvciBCdWZmZXIgQWRkcmVzcyBPZmZzZXQgb2YgbXVsdGlidWZmZXIgMy4gVW5waXBlbGluZWQuICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDMgICAgICAgICAgICAgIDB4NEUzNAogCi0vKiBnYXAgKi8KLQotLyogQml0IDE2OiBMYXJnZXIgdGlsZXMKKy8qIENvbG9yIGJ1ZmZlciBmb3JtYXQgYW5kIHRpbGluZyBjb250cm9sIGZvciBhbGwgdGhlIG11bHRpYnVmZmVycyBhbmQgdGhlCisgKiBwaXRjaCBvZiBtdWx0aWJ1ZmZlciAwIHRvIDMuIFVucGlwZWxpbmVkLiBUaGUgY2FjaGUgbXVzdCBiZSBlbXB0eSBiZWZvcmUgYW55CisgKiBvZiB0aGUgcmVnaXN0ZXJzIGFyZSBjaGFuZ2VkLgorICoKKyAqIEJpdCAxNjogTGFyZ2VyIHRpbGVzCiAgKiBCaXQgMTc6IDR4MiB0aWxlcwogICogQml0IDE4OiBFeHRyZW1lbHkgd2VpcmQgdGlsZSBsaWtlLCBidXQgc29tZSBwaXhlbHMgZHVwbGljYXRlZD8KICAqLwogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDAgICAgICAgICAgICAgICAweDRFMzgKLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9SR0I1NjUgICAgICAgICAgKDIgPDwgMjIpCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9BUkdCODg4OCAgICAgICAgKDMgPDwgMjIpCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMSAgICAgICAgICAgICAgIDB4NEUzQyAvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDIgICAgICAgICAgICAgICAweDRFNDAgLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gzICAgICAgICAgICAgICAgMHg0RTQ0IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwM0ZGRQorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9USUxFX0RJU0FCTEUgICAgICAgICAgICAoMCA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfVElMRV9FTkFCTEUgICAgICAgICAgICAgKDEgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX01JQ1JPVElMRV9ESVNBQkxFICAgICAgICgwIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9NSUNST1RJTEVfRU5BQkxFICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfTUlDUk9USUxFX0VOQUJMRV9TUVVBUkUgKDIgPDwgMTcpIC8qIE9ubHkgYXZhaWxhYmxlIGluIDE2LWJpdCAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fTk9fU1dBUCAgICAgICAgICAoMCA8PCAxOSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgKDEgPDwgMTkpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9EV09SRF9TV0FQICAgICAgICgyIDw8IDE5KQorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fSEFMRl9EV09SRF9TV0FQICAoMyA8PCAxOSkKKyMJZGVmaW5lIFI1MDBfQ09MT1JfRk9STUFUX0FSR0IxMDEwMTAxMCAgICAgKDAgPDwgMjEpCisjCWRlZmluZSBSNTAwX0NPTE9SX0ZPUk1BVF9VVjEwMTAgICAgICAgICAgICgxIDw8IDIxKQorIwlkZWZpbmUgUjUwMF9DT0xPUl9GT1JNQVRfQ0k4ICAgICAgICAgICAgICAoMiA8PCAyMSkgLyogMkQgb25seSAqLworIwlkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfQVJHQjE1NTUgICAgICAgICAoMyA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX1JHQjU2NSAgICAgICAgICAgKDQgPDwgMjEpCisjICAgICAgIGRlZmluZSBSNTAwX0NPTE9SX0ZPUk1BVF9BUkdCMjEwMTAxMCAgICAgICg1IDw8IDIxKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfQVJHQjg4ODggICAgICAgICAoNiA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX0FSR0IzMjMyMzIzMiAgICAgKDcgPDwgMjEpCisvKiByZXNlcnZlZCAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfSTggICAgICAgICAgICAgICAoOSA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX0FSR0IxNjE2MTYxNiAgICAgKDEwIDw8IDIxKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfVllVWSAgICAgICAgICAgICAoMTEgPDwgMjEpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9ZVllVICAgICAgICAgICAgICgxMiA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX1VWODggICAgICAgICAgICAgKDEzIDw8IDIxKQorIyAgICAgICBkZWZpbmUgUjUwMF9DT0xPUl9GT1JNQVRfSTEwICAgICAgICAgICAgICAoMTQgPDwgMjEpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9BUkdCNDQ0NCAgICAgICAgICgxNSA8PCAyMSkKKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gxICAgICAgICAgICAgICAgMHg0RTNDCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMiAgICAgICAgICAgICAgIDB4NEU0MAorI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDMgICAgICAgICAgICAgICAweDRFNDQKIAogLyogZ2FwICovCiAKLS8qIEd1ZXNzIGJ5IFZsYWRpbWlyLgorLyogRGVzdGluYXRpb24gQ29sb3IgQnVmZmVyIENhY2hlIENvbnRyb2wvU3RhdHVzLiBJZiB0aGUgY2IgaXMgaW4gZTIgbW9kZSwgdGhlbgorICogYSBmbHVzaCBvciBmcmVlIHdpbGwgbm90IG9jY3VyIHVwb24gYSB3cml0ZSB0byB0aGlzIHJlZ2lzdGVyLCBidXQgYSBzeW5jCisgKiB3aWxsIGJlIGltbWVkaWF0ZWx5IHNlbnQgaWYgb25lIGlzIHJlcXVlc3RlZC4gSWYgYm90aCBEQ19GTFVTSCBhbmQgRENfRlJFRQorICogYXJlIHplcm8gYnV0IERDX0ZJTklTSCBpcyBvbmUsIHRoZW4gYSBzeW5jIHdpbGwgYmUgc2VudCBpbW1lZGlhdGVseSAtLSB0aGUKKyAqIGNiIHdpbGwgbm90IHdhaXQgZm9yIGFsbCB0aGUgcHJldmlvdXMgb3BlcmF0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgc2VuZGluZworICogdGhlIHN5bmMuIFVucGlwZWxpbmVkIGV4Y2VwdCB3aGVuIERDX0ZJTklTSCBhbmQgRENfRlJFRSBhcmUgYm90aCBzZXQgdG8KKyAqIHplcm8uCisgKgogICogU2V0IHRvIDBBIGJlZm9yZSAzRCBvcGVyYXRpb25zLCBzZXQgdG8gMDIgYWZ0ZXJ3YXJkcy4KICAqLwotI2RlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCAgICAgICAgICAweDRFNEMKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzAyICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzBBICAgICAgICAgICAgIDB4MDAwMDAwMEEKKyNkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQgICAgICAgICAgICAgICAweDRlNGMKKyMJZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUX0RDX0ZMVVNIX05PX0VGRkVDVCAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVF9EQ19GTFVTSF9OT19FRkZFQ1RfMSAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVRfRENfRkxVU0hfRkxVU0hfRElSVFlfM0QgICAgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUX0RDX0ZMVVNIX0ZMVVNIX0RJUlRZXzNEXzEgICgzIDw8IDApCisjCWRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVF9EQ19GUkVFX05PX0VGRkVDVCAgICAgICAgICAoMCA8PCAyKQorIwlkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVRfRENfRlJFRV9OT19FRkZFQ1RfMSAgICAgICAgKDEgPDwgMikKKyMJZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUX0RDX0ZSRUVfRlJFRV8zRF9UQUdTICAgICAgICgyIDw8IDIpCisjCWRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVF9EQ19GUkVFX0ZSRUVfM0RfVEFHU18xICAgICAoMyA8PCAyKQorIwlkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVRfRENfRklOSVNIX05PX1NJR05BTCAgICAgICAgKDAgPDwgNCkKKyMJZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUX0RDX0ZJTklTSF9TSUdOQUwgICAgICAgICAgICgxIDw8IDQpCisKKyNkZWZpbmUgUjMwMF9SQjNEX0RJVEhFUl9DVEwgMHg0RTUwCisjCWRlZmluZSBSMzAwX1JCM0RfRElUSEVSX0NUTF9ESVRIRVJfTU9ERV9UUlVOQ0FURSAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX1JCM0RfRElUSEVSX0NUTF9ESVRIRVJfTU9ERV9ST1VORCAgICAgICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX1JCM0RfRElUSEVSX0NUTF9ESVRIRVJfTU9ERV9MVVQgICAgICAgICAgICAgICgyIDw8IDApCisvKiByZXNlcnZlZCAqLworIwlkZWZpbmUgUjMwMF9SQjNEX0RJVEhFUl9DVExfQUxQSEFfRElUSEVSX01PREVfVFJVTkNBVEUgICAoMCA8PCAyKQorIwlkZWZpbmUgUjMwMF9SQjNEX0RJVEhFUl9DVExfQUxQSEFfRElUSEVSX01PREVfUk9VTkQgICAgICAoMSA8PCAyKQorIwlkZWZpbmUgUjMwMF9SQjNEX0RJVEhFUl9DVExfQUxQSEFfRElUSEVSX01PREVfTFVUICAgICAgICAoMiA8PCAyKQorLyogcmVzZXJ2ZWQgKi8KKworLyogUmVzb2x2ZSBidWZmZXIgZGVzdGluYXRpb24gYWRkcmVzcy4gVGhlIGNhY2hlIG11c3QgYmUgZW1wdHkgYmVmb3JlIGNoYW5naW5nCisgKiB0aGlzIHJlZ2lzdGVyIGlmIHRoZSBjYiBpcyBpbiByZXNvbHZlIG1vZGUuIFVucGlwZWxpbmVkCisgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9PRkZTRVQgICAgICAgIDB4NGU4MAorIwlkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9PRkZTRVRfU0hJRlQgNQorIwlkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9PRkZTRVRfTUFTSyAweGZmZmZmZmUwIC8qIEF0IGxlYXN0IGFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb25zIG9mIENocmlzdG9waCBCcmlsbCAqLworCisvKiBSZXNvbHZlIEJ1ZmZlciBQaXRjaCBhbmQgVGlsaW5nIENvbnRyb2wuIFRoZSBjYWNoZSBtdXN0IGJlIGVtcHR5IGJlZm9yZQorICogY2hhbmdpbmcgdGhpcyByZWdpc3RlciBpZiB0aGUgY2IgaXMgaW4gcmVzb2x2ZSBtb2RlLiBVbnBpcGVsaW5lZAorICovCisjZGVmaW5lIFIzMDBfUkIzRF9BQVJFU09MVkVfUElUQ0ggICAgICAgICAweDRlODQKKyMJZGVmaW5lIFIzMDBfUkIzRF9BQVJFU09MVkVfUElUQ0hfU0hJRlQgMQorIwlkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9QSVRDSF9NQVNLICAweDAwMDAzZmZlIC8qIEF0IGxlYXN0IGFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb25zIG9mIENocmlzdG9waCBCcmlsbCAqLworCisvKiBSZXNvbHZlIEJ1ZmZlciBDb250cm9sLiBVbnBpcGVsaW5lZCAqLworI2RlZmluZSBSMzAwX1JCM0RfQUFSRVNPTFZFX0NUTCAgICAgICAgICAgMHg0ZTg4CisjCWRlZmluZSBSMzAwX1JCM0RfQUFSRVNPTFZFX0NUTF9BQVJFU09MVkVfTU9ERV9OT1JNQUwgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9DVExfQUFSRVNPTFZFX01PREVfUkVTT0xWRSAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfUkIzRF9BQVJFU09MVkVfQ1RMX0FBUkVTT0xWRV9HQU1NQV8xMCAgICAgICgwIDw8IDEpCisjCWRlZmluZSBSMzAwX1JCM0RfQUFSRVNPTFZFX0NUTF9BQVJFU09MVkVfR0FNTUFfMjIgICAgICAoMSA8PCAxKQorIwlkZWZpbmUgUjMwMF9SQjNEX0FBUkVTT0xWRV9DVExfQUFSRVNPTFZFX0FMUEhBX1NBTVBMRTAgKDAgPDwgMikKKyMJZGVmaW5lIFIzMDBfUkIzRF9BQVJFU09MVkVfQ1RMX0FBUkVTT0xWRV9BTFBIQV9BVkVSQUdFICgxIDw8IDIpCisKKworLyogRGlzY2FyZCBzcmMgcGl4ZWxzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aHJlc2hvbGQuICovCisjZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9MVEVfVEhSRVNIT0xEIDB4NGVhMAorLyogRGlzY2FyZCBzcmMgcGl4ZWxzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aHJlc2hvbGQuICovCisjZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9HVEVfVEhSRVNIT0xEIDB4NGVhNAorIwlkZWZpbmUgUjUwMF9SQjNEX0RJU0NBUkRfU1JDX1BJWEVMX1RIUkVTSE9MRF9CTFVFX1NISUZUIDAKKyMJZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9USFJFU0hPTERfQkxVRV9NQVNLIDB4MDAwMDAwZmYKKyMJZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9USFJFU0hPTERfR1JFRU5fU0hJRlQgOAorIwlkZWZpbmUgUjUwMF9SQjNEX0RJU0NBUkRfU1JDX1BJWEVMX1RIUkVTSE9MRF9HUkVFTl9NQVNLIDB4MDAwMGZmMDAKKyMJZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9USFJFU0hPTERfUkVEX1NISUZUIDE2CisjCWRlZmluZSBSNTAwX1JCM0RfRElTQ0FSRF9TUkNfUElYRUxfVEhSRVNIT0xEX1JFRF9NQVNLIDB4MDBmZjAwMDAKKyMJZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9USFJFU0hPTERfQUxQSEFfU0hJRlQgMjQKKyMJZGVmaW5lIFI1MDBfUkIzRF9ESVNDQVJEX1NSQ19QSVhFTF9USFJFU0hPTERfQUxQSEFfTUFTSyAweGZmMDAwMDAwCisKKy8qIDNEIFJPUCBDb250cm9sLiBTdGFsbHMgdGhlIDJkLzNkIGRhdGFwYXRoIHVudGlsIGl0IGlzIGlkbGUuICovCisjZGVmaW5lIFIzMDBfUkIzRF9ST1BDTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlMTgKKyMJZGVmaW5lIFIzMDBfUkIzRF9ST1BDTlRMX1JPUF9FTkFCTEUgICAgICAgICAgICAweDAwMDAwMDA0CisjCWRlZmluZSBSMzAwX1JCM0RfUk9QQ05UTF9ST1BfTUFTSyAgICAgICAgICAgICAgKDE1IDw8IDgpCisjCWRlZmluZSBSMzAwX1JCM0RfUk9QQ05UTF9ST1BfU0hJRlQgICAgICAgICAgICAgOAorCisvKiBDb2xvciBDb21wYXJlIEZsaXAuIFN0YWxscyB0aGUgMmQvM2QgZGF0YXBhdGggdW50aWwgaXQgaXMgaWRsZS4gKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NMUkNNUF9GTElQRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NGUxYworCisvKiBTZXRzIHRoZSBmaWZvIHNpemVzICovCisjZGVmaW5lIFI1MDBfUkIzRF9GSUZPX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlZjQKKyMJZGVmaW5lIFI1MDBfUkIzRF9GSUZPX1NJWkVfT1BfRklGT19TSVpFX0ZVTEwgICAoMCA8PCAwKQorIwlkZWZpbmUgUjUwMF9SQjNEX0ZJRk9fU0laRV9PUF9GSUZPX1NJWkVfSEFMRiAgICgxIDw8IDApCisjCWRlZmluZSBSNTAwX1JCM0RfRklGT19TSVpFX09QX0ZJRk9fU0laRV9RVUFURVIgKDIgPDwgMCkKKyMJZGVmaW5lIFI1MDBfUkIzRF9GSUZPX1NJWkVfT1BfRklGT19TSVpFX0VJR1RIUyAoMyA8PCAwKQorCisvKiBDb25zdGFudCBjb2xvciB1c2VkIGJ5IHRoZSBibGVuZGVyLiBQaXBlbGluZWQgdGhyb3VnaCB0aGUgYmxlbmRlci4gKi8KKyNkZWZpbmUgUjUwMF9SQjNEX0NPTlNUQU5UX0NPTE9SX0FSICAgICAgICAgICAgICAgICAgIDB4NGVmOAorIwlkZWZpbmUgUjUwMF9SQjNEX0NPTlNUQU5UX0NPTE9SX0FSX1JFRF9NQVNLICAgIDB4MDAwMGZmZmYKKyMJZGVmaW5lIFI1MDBfUkIzRF9DT05TVEFOVF9DT0xPUl9BUl9SRURfU0hJRlQgICAwCisjCWRlZmluZSBSNTAwX1JCM0RfQ09OU1RBTlRfQ09MT1JfQVJfQUxQSEFfTUFTSyAgMHhmZmZmMDAwMAorIwlkZWZpbmUgUjUwMF9SQjNEX0NPTlNUQU5UX0NPTE9SX0FSX0FMUEhBX1NISUZUIDE2CisKKy8qIENvbnN0YW50IGNvbG9yIHVzZWQgYnkgdGhlIGJsZW5kZXIuIFBpcGVsaW5lZCB0aHJvdWdoIHRoZSBibGVuZGVyLiAqLworI2RlZmluZSBSNTAwX1JCM0RfQ09OU1RBTlRfQ09MT1JfR0IgICAgICAgICAgICAgICAgICAgMHg0ZWZjCisjCWRlZmluZSBSNTAwX1JCM0RfQ09OU1RBTlRfQ09MT1JfQVJfQkxVRV9NQVNLICAgMHgwMDAwZmZmZgorIwlkZWZpbmUgUjUwMF9SQjNEX0NPTlNUQU5UX0NPTE9SX0FSX0JMVUVfU0hJRlQgIDAKKyMJZGVmaW5lIFI1MDBfUkIzRF9DT05TVEFOVF9DT0xPUl9BUl9HUkVFTl9NQVNLICAweGZmZmYwMDAwCisjCWRlZmluZSBSNTAwX1JCM0RfQ09OU1RBTlRfQ09MT1JfQVJfR1JFRU5fU0hJRlQgMTYKIAogLyogZ2FwICovCiAvKiBUaGVyZSBzZWVtcyB0byBiZSBubyAid3JpdGUgb25seSIgc2V0dGluZywgc28gdXNlIFotdGVzdCA9IEFMV0FZUwogICogZm9yIHRoaXMuCiAgKiBCaXQgKDE8PDgpIGlzIHRoZSAidGVzdCIgYml0LiBzbyBwbGFpbiB3cml0ZSBpcyA2ICAtIHZkCiAgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX1pTVEVOQ0lMX0NOVExfMCAgICAgICAgICAgICAgICAgICAweDRGMDAKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzEgICAgICAgICAgICAweDAwMDAwMDEwCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8yICAgICAgICAgICAgMHgwMDAwMDAxNAotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1RfQU5EX1dSSVRFICAgICAgICAweDAwMDAwMDE2Ci0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9XUklURV9PTkxZICAgICAgICAJIDB4MDAwMDAwMDYKKyNkZWZpbmUgUjMwMF9aQl9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRGMDAKKyMJZGVmaW5lIFIzMDBfU1RFTkNJTF9FTkFCTEUJCSAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9aX0VOQUJMRQkJICAgICAgICAgKDEgPDwgMSkKKyMJZGVmaW5lIFIzMDBfWl9XUklURV9FTkFCTEUJCSAoMSA8PCAyKQorIwlkZWZpbmUgUjMwMF9aX1NJR05FRF9DT01QQVJFCQkgKDEgPDwgMykKKyMJZGVmaW5lIFIzMDBfU1RFTkNJTF9GUk9OVF9CQUNLCQkgKDEgPDwgNCkKIAotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1RfQU5EX1dSSVRFICAgICAgICAweDAwMDAwMDE2Ci0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9XUklURV9PTkxZICAgICAgICAJIDB4MDAwMDAwMDYKLSMJZGVmaW5lIFIzMDBfUkIzRF9TVEVOQ0lMX0VOQUJMRQkJIDB4MDAwMDAwMDEKLQotI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8xICAgICAgICAgICAgICAgICAgIDB4NEYwNAorI2RlZmluZSBSMzAwX1pCX1pTVEVOQ0lMQ05UTCAgICAgICAgICAgICAgICAgICAweDRmMDQKIAkvKiBmdW5jdGlvbnMgKi8KICMJZGVmaW5lIFIzMDBfWlNfTkVWRVIJCQkwCiAjCWRlZmluZSBSMzAwX1pTX0xFU1MJCQkxCkBAIC0xNDEzLDE2MiArMjMwOSwzNDQgQEAKICMJZGVmaW5lIFIzMDBfWlNfSU5WRVJUCQkJNQogIwlkZWZpbmUgUjMwMF9aU19JTkNSX1dSQVAJCTYKICMJZGVmaW5lIFIzMDBfWlNfREVDUl9XUkFQCQk3CisjCWRlZmluZSBSMzAwX1pfRlVOQ19TSElGVAkJMAogCS8qIGZyb250IGFuZCBiYWNrIHJlZmVyIHRvIG9wZXJhdGlvbnMgZG9uZSBmb3IgZnJvbnQKIAkgICBhbmQgYmFjayBmYWNlcywgaS5lLiBzZXBhcmF0ZSBzdGVuY2lsIGZ1bmN0aW9uIHN1cHBvcnQgKi8KLSMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfREVQVEhfRlVOQ19TSElGVAkJMAotIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUCQkzCi0jCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX0ZBSUxfT1BfU0hJRlQJNgotIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9GUk9OVF9aUEFTU19PUF9TSElGVAk5Ci0jCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX1pGQUlMX09QX1NISUZUICAgICAgMTIKLSMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfQkFDS19GVU5DX1NISUZUICAgICAgICAgICAxNQotIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9CQUNLX0ZBSUxfT1BfU0hJRlQgICAgICAgIDE4Ci0jCWRlZmluZSBSMzAwX1JCM0RfWlMxX0JBQ0tfWlBBU1NfT1BfU0hJRlQgICAgICAgMjEKLSMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfQkFDS19aRkFJTF9PUF9TSElGVCAgICAgICAyNAorIwlkZWZpbmUgUjMwMF9TX0ZST05UX0ZVTkNfU0hJRlQJICAgICAgICAzCisjCWRlZmluZSBSMzAwX1NfRlJPTlRfU0ZBSUxfT1BfU0hJRlQJNgorIwlkZWZpbmUgUjMwMF9TX0ZST05UX1pQQVNTX09QX1NISUZUCTkKKyMJZGVmaW5lIFIzMDBfU19GUk9OVF9aRkFJTF9PUF9TSElGVCAgICAgIDEyCisjCWRlZmluZSBSMzAwX1NfQkFDS19GVU5DX1NISUZUICAgICAgICAgICAxNQorIwlkZWZpbmUgUjMwMF9TX0JBQ0tfU0ZBSUxfT1BfU0hJRlQgICAgICAgMTgKKyMJZGVmaW5lIFIzMDBfU19CQUNLX1pQQVNTX09QX1NISUZUICAgICAgIDIxCisjCWRlZmluZSBSMzAwX1NfQkFDS19aRkFJTF9PUF9TSElGVCAgICAgICAyNAogCi0jZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzIgICAgICAgICAgICAgICAgICAgMHg0RjA4Ci0jCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfUkVGX1NISUZUCQkwCi0jCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfTUFTSwkJMHhGRgotIwlkZWZpbmUgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX01BU0tfU0hJRlQJICAgICAgICA4Ci0jCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfV1JJVEVfTUFTS19TSElGVAkxNgorI2RlZmluZSBSMzAwX1pCX1NURU5DSUxSRUZNQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjA4CisjCWRlZmluZSBSMzAwX1NURU5DSUxSRUZfU0hJRlQgICAgICAgMAorIwlkZWZpbmUgUjMwMF9TVEVOQ0lMUkVGX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyMJZGVmaW5lIFIzMDBfU1RFTkNJTE1BU0tfU0hJRlQgICAgICA4CisjCWRlZmluZSBSMzAwX1NURU5DSUxNQVNLX01BU0sgICAgICAgMHgwMDAwZmYwMAorIwlkZWZpbmUgUjMwMF9TVEVOQ0lMV1JJVEVNQVNLX1NISUZUIDE2CisjCWRlZmluZSBSMzAwX1NURU5DSUxXUklURU1BU0tfTUFTSyAgMHgwMGZmMDAwMAogCiAvKiBnYXAgKi8KIAotI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFUICAgICAgICAgICAgICAgICAgIDB4NEYxMAotIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1ogICAgICgwIDw8IDApCi0jCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF8yNEJJVF9JTlRfWiAgICAgKDIgPDwgMCkKLQkvKiAxNiBiaXQgZm9ybWF0IG9yIHNvbWUgYWRpdGlvbmFsIGJpdCA/ICovCi0jCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF9VTkszMiAgICAgICAgICAoMzIgPDwgMCkKKyNkZWZpbmUgUjMwMF9aQl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGYxMAorIwlkZWZpbmUgUjMwMF9ERVBUSEZPUk1BVF8xNkJJVF9JTlRfWiAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0RFUFRIRk9STUFUXzE2QklUXzEzRTMgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfREVQVEhGT1JNQVRfMjRCSVRfSU5UX1pfOEJJVF9TVEVOQ0lMICAgKDIgPDwgMCkKKy8qIHJlc2VydmVkIHVwIHRvICgxNSA8PCAwKSAqLworIwlkZWZpbmUgUjMwMF9JTlZFUlRfMTNFM19MRUFESU5HX09ORVMgICgwIDw8IDQpCisjCWRlZmluZSBSMzAwX0lOVkVSVF8xM0UzX0xFQURJTkdfWkVST1MgKDEgPDwgNCkKIAotI2RlZmluZSBSMzAwX1JCM0RfRUFSTFlfWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NEYxNAotIwlkZWZpbmUgUjMwMF9FQVJMWV9aX0RJU0FCTEUgICAgICAgICAgICAgICgwIDw8IDApCi0jCWRlZmluZSBSMzAwX0VBUkxZX1pfRU5BQkxFICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUjMwMF9aQl9aVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRGMTQKKyMJZGVmaW5lIFIzMDBfWlRPUF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9aVE9QX0VOQUJMRSAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAKIC8qIGdhcCAqLwogCi0jZGVmaW5lIFIzMDBfUkIzRF9aQ0FDSEVfQ1RMU1RBVCAgICAgICAgICAgIDB4NEYxOCAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9VTktOT1dOXzAxICAweDEKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aQ0FDSEVfVU5LTk9XTl8wMyAgMHgzCisjZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVQgICAgICAgICAgICAweDRmMTgKKyMgICAgICAgZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfRkxVU0hfTk9fRUZGRUNUICAgICAgKDAgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfRkxVU0hfRkxVU0hfQU5EX0ZSRUUgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfRlJFRV9OT19FRkZFQ1QgICAgICAgKDAgPDwgMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfRlJFRV9GUkVFICAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfWkJfWkNBQ0hFX0NUTFNUQVRfWkNfQlVTWV9JRExFICAgICAgICAgICAgKDAgPDwgMzEpCisjICAgICAgIGRlZmluZSBSMzAwX1pCX1pDQUNIRV9DVExTVEFUX1pDX0JVU1lfQlVTWSAgICAgICAgICAgICgxIDw8IDMxKQorCisjZGVmaW5lIFIzMDBfWkJfQldfQ05UTCAgICAgICAgICAgICAgICAgICAgIDB4NGYxYworIwlkZWZpbmUgUjMwMF9ISVpfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0hJWl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfSElaX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAxKQorIwlkZWZpbmUgUjMwMF9ISVpfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZBU1RfRklMTF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgMikKKyMJZGVmaW5lIFIzMDBfRkFTVF9GSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorIwlkZWZpbmUgUjMwMF9SRF9DT01QX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDMpCisjCWRlZmluZSBSMzAwX1JEX0NPTVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyMJZGVmaW5lIFIzMDBfV1JfQ09NUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCA0KQorIwlkZWZpbmUgUjMwMF9XUl9DT01QX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjCWRlZmluZSBSMzAwX1pCX0NCX0NMRUFSX1JNVyAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgNSkKKyMJZGVmaW5lIFIzMDBfWkJfQ0JfQ0xFQVJfQ0FDSEVfTElORUFSICAgICAgICAgICAgICAgICAoMSA8PCA1KQorIwlkZWZpbmUgUjMwMF9GT1JDRV9DT01QUkVTU0VEX1NURU5DSUxfVkFMVUVfRElTQUJMRSAgICgwIDw8IDYpCisjCWRlZmluZSBSMzAwX0ZPUkNFX0NPTVBSRVNTRURfU1RFTkNJTF9WQUxVRV9FTkFCTEUgICAgKDEgPDwgNikKKworIwlkZWZpbmUgUjUwMF9aRVFVQUxfT1BUSU1JWkVfRU5BQkxFICAgICAgICAgICAgICAgICAgICgwIDw8IDcpCisjCWRlZmluZSBSNTAwX1pFUVVBTF9PUFRJTUlaRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKyMJZGVmaW5lIFI1MDBfU0VRVUFMX09QVElNSVpFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoMCA8PCA4KQorIwlkZWZpbmUgUjUwMF9TRVFVQUxfT1BUSU1JWkVfRElTQUJMRSAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisKKyMJZGVmaW5lIFI1MDBfQk1BU0tfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAxMCkKKyMJZGVmaW5lIFI1MDBfQk1BU0tfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyMJZGVmaW5lIFI1MDBfSElaX0VRVUFMX1JFSkVDVF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMCA8PCAxMSkKKyMJZGVmaW5lIFI1MDBfSElaX0VRVUFMX1JFSkVDVF9FTkFCTEUgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAoMCA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTXzEgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTXzIgICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTXzMgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTXzQgICAgICAgICAgICAgICAgICAgICAgICAoNCA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0VYUF9CSVRTXzUgICAgICAgICAgICAgICAgICAgICAgICAoNSA8PCAxMikKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0lOVkVSVF9MRUFESU5HX09ORVMgICAgICAgICAgICAgICAoMCA8PCAxNSkKKyMJZGVmaW5lIFI1MDBfSElaX0ZQX0lOVkVSVF9MRUFESU5HX1pFUk9TICAgICAgICAgICAgICAoMSA8PCAxNSkKKyMJZGVmaW5lIFI1MDBfVElMRV9PVkVSV1JJVEVfUkVDT01QUkVTU0lPTl9FTkFCTEUgICAgICAoMCA8PCAxNikKKyMJZGVmaW5lIFI1MDBfVElMRV9PVkVSV1JJVEVfUkVDT01QUkVTU0lPTl9ESVNBQkxFICAgICAoMSA8PCAxNikKKyMJZGVmaW5lIFI1MDBfQ09OVElHVU9VU182WEFBX1NBTVBMRVNfRU5BQkxFICAgICAgICAgICAoMCA8PCAxNykKKyMJZGVmaW5lIFI1MDBfQ09OVElHVU9VU182WEFBX1NBTVBMRVNfRElTQUJMRSAgICAgICAgICAoMSA8PCAxNykKKyMJZGVmaW5lIFI1MDBfUEVRX1BBQ0tJTkdfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAxOCkKKyMJZGVmaW5lIFI1MDBfUEVRX1BBQ0tJTkdfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkKKyMJZGVmaW5lIFI1MDBfQ09WRVJFRF9QVFJfTUFTS0lOR19ESVNBQkxFICAgICAgICAgICAgICAoMCA8PCAxOCkKKyMJZGVmaW5lIFI1MDBfQ09WRVJFRF9QVFJfTUFTS0lOR19FTkFCTEUgICAgICAgICAgICAgICAoMSA8PCAxOCkKKwogCiAvKiBnYXAgKi8KIAotI2RlZmluZSBSMzAwX1JCM0RfREVQVEhPRkZTRVQgICAgICAgICAgICAgICAweDRGMjAKLSNkZWZpbmUgUjMwMF9SQjNEX0RFUFRIUElUQ0ggICAgICAgICAgICAgICAgMHg0RjI0Ci0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOCAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KSAvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KSAvKiBHVUVTUyAqLwotCi0vKiBCRUdJTjogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCi0KLS8qIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6Ci0gKiAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKLSAqICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAotICogIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAotICogIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50Ci0gKgotICogTm90ZXM6Ci0gKiAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKLSAqICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybwotICogIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAotICogIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAotICogIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQKLSAqICAgIGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0Ci0gKiAgICByZWFkIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZQotICogICAgYWxsb3dlZAotICogIC0gcmVnaXN0ZXIgaW5kaWNlcyBzZWVtIHRvIGJlIHVucmVsYXRlZCB3aXRoIE9wZW5HTCBhbGlhc2luZyB0bwotICogICAgY29udmVudGlvbmFsIHN0YXRlCi0gKiAgLSBvbmx5IG9uZSBhdHRyaWJ1dGUgYW5kIG9uZSBwYXJhbWV0ZXIgY2FuIGJlIGxvYWRlZCBhdCBhIHRpbWU7IGhvd2V2ZXIsCi0gKiAgICB0aGUgc2FtZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGZvciBtb3JlIHRoYW4gb25lIGFyZ3VtZW50Ci0gKiAgLSB0aGUgc2Vjb25kIHNvZnR3YXJlIGFyZ3VtZW50IGZvciBQT1cgaXMgdGhlIHRoaXJkIGhhcmR3YXJlIGFyZ3VtZW50Ci0gKiAgICAobm8gaWRlYSB3aHkpCi0gKiAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgotICoKLSAqIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgotICogICBUaGUgc2luZ2xlIGFyZ3VtZW50IGlzIHJlcGxpY2F0ZWQgYWNyb3NzIGFsbCB0aHJlZSBpbnB1dHMsIGJ1dCBzd2l6emxlZDoKLSAqICAgICBGaXJzdCBhcmd1bWVudDogeHl6eQotICogICAgIFNlY29uZCBhcmd1bWVudDogeHl6eAotICogICAgIFRoaXJkIGFyZ3VtZW50OiB4eXp3Ci0gKiAgIFdoZW5ldmVyIHRoZSByZXN1bHQgaXMgdXNlZCBsYXRlciBpbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSwgZmdscnggZm9yY2VzCi0gKiAgIHggYW5kIHcgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMKLSAqICAgc3RyaWN0bHkgbmVjZXNzYXJ5CisvKiBaIEJ1ZmZlciBBZGRyZXNzIE9mZnNldC4KKyAqIEJpdHMgMzEgdG8gNSBhcmUgdXNlZCBmb3IgYWxpZ25lZCBaIGJ1ZmZlciBhZGRyZXNzIG9mZnNldCBmb3IgbWFjcm8gdGlsZXMuCiAgKi8KLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0RPVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NVUwgICAgICAgICAgICAgICAgICAgICAoMiA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfQUREICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01BRCAgICAgICAgICAgICAgICAgICAgICg0IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9EU1QgICAgICAgICAgICAgICAgICAgICAoNSA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRlJDICAgICAgICAgICAgICAgICAgICAgKDYgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01BWCAgICAgICAgICAgICAgICAgICAgICg3IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NSU4gICAgICAgICAgICAgICAgICAgICAoOCA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfU0dFICAgICAgICAgICAgICAgICAgICAgKDkgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1NMVCAgICAgICAgICAgICAgICAgICAgICgxMCA8PCAwKQotCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IpICovCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMiAgICAgICAgICAgICAgICAgICAoMTIgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0FSTCAgICAgICAgICAgICAgICAgICAgICgxMyA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRVhQICAgICAgICAgICAgICAgICAgICAgKDY1IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MT0cgICAgICAgICAgICAgICAgICAgICAoNjYgPDwgMCkKLQkvKiBVc2VkIGluIGZvZyBjb21wdXRhdGlvbnMsIHNjYWxhcihzY2FsYXIpICovCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks2NyAgICAgICAgICAgICAgICAgICAoNjcgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0xJVCAgICAgICAgICAgICAgICAgICAgICg2OCA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUE9XICAgICAgICAgICAgICAgICAgICAgKDY5IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9SQ1AgICAgICAgICAgICAgICAgICAgICAoNzAgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1JTUSAgICAgICAgICAgICAgICAgICAgICg3MiA8PCAwKQotCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCBzY2FsYXIoc2NhbGFyKSAqLwotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LNzMgICAgICAgICAgICAgICAgICAgKDczIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9FWDIgICAgICAgICAgICAgICAgICAgICAoNzUgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0xHMiAgICAgICAgICAgICAgICAgICAgICg3NiA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTUFEXzIgICAgICAgICAgICAgICAgICAgKDEyOCA8PCAwKQotCS8qIGFsbCB0ZW1wcywgdmVjdG9yKHNjYWxhciwgdmVjdG9yLCB2ZWN0b3IpICovCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMjkgICAgICAgICAgICAgICAgICAoMTI5IDw8IDApCisjZGVmaW5lIFIzMDBfWkJfREVQVEhPRkZTRVQgICAgICAgICAgICAgICAweDRmMjAKIAotI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX1RFTVBPUkFSWSAgICAgICAgKDAgPDwgOCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19BRERSICAgICAgICAgICAgICgxIDw8IDgpCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfUkVTVUxUICAgICAgICAgICAoMiA8PCA4KQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgKDMxIDw8IDgpCisvKiBaIEJ1ZmZlciBQaXRjaCBhbmQgRW5kaWFuIENvbnRyb2wgKi8KKyNkZWZpbmUgUjMwMF9aQl9ERVBUSFBJVENIICAgICAgICAgICAgICAgIDB4NGYyNAorIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSFBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDNGRkMKKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhNQUNST1RJTEVfRElTQUJMRSAgICAgICgwIDw8IDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSE1BQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRITUlDUk9USUxFX0xJTkVBUiAgICAgICAoMCA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhNSUNST1RJTEVfVElMRUQgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSE1JQ1JPVElMRV9USUxFRF9TUVVBUkUgKDIgPDwgMTcpCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhFTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KQorIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSEVORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIRU5ESUFOX0hBTEZfRFdPUkRfU1dBUCAoMyA8PCAxOCkKIAotI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX1NISUZUICAgICAgICAgICAgMTMKLQkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpCisvKiBaIEJ1ZmZlciBDbGVhciBWYWx1ZSAqLworI2RlZmluZSBSMzAwX1pCX0RFUFRIQ0xFQVJWQUxVRSAgICAgICAgICAgICAgICAgIDB4NGYyOAogCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9XUklURV9YICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX1dSSVRFX1kgICAgICAgICAgICAgICAgICAgICgxIDw8IDIxKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfWiAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjIpCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9XUklURV9XICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKy8qIEhpZXJhcmNoaWNhbCBaIE1lbW9yeSBPZmZzZXQgKi8KKyNkZWZpbmUgUjMwMF9aQl9ISVpfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDRmNDQKIAotI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfVEVNUE9SQVJZICAgICAgICAgKDAgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX0FUVFJJQlVURSAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19QQVJBTUVURVIgICAgICAgICAoMiA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfTk9ORSAgICAgICAgICAgICAgKDkgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQorLyogSGllcmFyY2hpY2FsIFogV3JpdGUgSW5kZXggKi8KKyNkZWZpbmUgUjMwMF9aQl9ISVpfV1JJTkRFWCAgICAgICAgICAgICAgICAgICAgICAweDRmNDgKIAotI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfU0hJRlQgICAgICAgICAgICAgNQotCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KLSNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0lOREVYX01BU0sgICAgICAgICAgICAgICgyNTUgPDwgNSkKKy8qIEhpZXJhcmNoaWNhbCBaIERhdGEgKi8KKyNkZWZpbmUgUjMwMF9aQl9ISVpfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAweDRmNGMKIAotLyogVGhlIFIzMDAgY2FuIHNlbGVjdCBjb21wb25lbnRzIGZyb20gdGhlIGlucHV0IHJlZ2lzdGVyIGFyYml0cmFyaWx5LgotICogVXNlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBzaGlmdGVkIGJ5IHRoZSBjb21wb25lbnQgc2hpZnQgeW91Ci0gKiB3YW50IHRvIHNlbGVjdAorLyogSGllcmFyY2hpY2FsIFogUmVhZCBJbmRleCAqLworI2RlZmluZSBSMzAwX1pCX0hJWl9SRElOREVYICAgICAgICAgICAgICAgICAgICAgIDB4NGY1MAorCisvKiBIaWVyYXJjaGljYWwgWiBQaXRjaCAqLworI2RlZmluZSBSMzAwX1pCX0hJWl9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgIDB4NGY1NAorCisvKiBaIEJ1ZmZlciBaIFBhc3MgQ291bnRlciBEYXRhICovCisjZGVmaW5lIFIzMDBfWkJfWlBBU1NfREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjU4CisKKy8qIFogQnVmZmVyIFogUGFzcyBDb3VudGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgUjMwMF9aQl9aUEFTU19BRERSICAgICAgICAgICAgICAgICAgICAgICAweDRmNWMKKworLyogRGVwdGggYnVmZmVyIFggYW5kIFkgY29vcmRpbmF0ZSBvZmZzZXQgKi8KKyNkZWZpbmUgUjMwMF9aQl9ERVBUSFhZX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDRmNjAKKyMJZGVmaW5lIFIzMDBfREVQVEhYX09GRlNFVF9TSElGVCAgMQorIwlkZWZpbmUgUjMwMF9ERVBUSFhfT0ZGU0VUX01BU0sgICAweDAwMDAwN0ZFCisjCWRlZmluZSBSMzAwX0RFUFRIWV9PRkZTRVRfU0hJRlQgIDE3CisjCWRlZmluZSBSMzAwX0RFUFRIWV9PRkZTRVRfTUFTSyAgIDB4MDdGRTAwMDAKKworLyogU2V0cyB0aGUgZmlmbyBzaXplcyAqLworI2RlZmluZSBSNTAwX1pCX0ZJRk9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NGZkMAorIwlkZWZpbmUgUjUwMF9PUF9GSUZPX1NJWkVfRlVMTCAgICgwIDw8IDApCisjCWRlZmluZSBSNTAwX09QX0ZJRk9fU0laRV9IQUxGICAgKDEgPDwgMCkKKyMJZGVmaW5lIFI1MDBfT1BfRklGT19TSVpFX1FVQVRFUiAoMiA8PCAwKQorIwlkZWZpbmUgUjUwMF9PUF9GSUZPX1NJWkVfRUlHVEhTICg0IDw8IDApCisKKy8qIFN0ZW5jaWwgUmVmZXJlbmNlIFZhbHVlIGFuZCBNYXNrIGZvciBiYWNrZmFjaW5nIHF1YWRzICovCisvKiBSMzAwX1pCX1NURU5DSUxSRUZNQVNLIGhhbmRsZXMgZnJvbnQgZmFjZSAqLworI2RlZmluZSBSNTAwX1pCX1NURU5DSUxSRUZNQVNLX0JGICAgICAgICAgICAgICAgIDB4NGZkNAorIwlkZWZpbmUgUjUwMF9TVEVOQ0lMUkVGX1NISUZUICAgICAgIDAKKyMJZGVmaW5lIFI1MDBfU1RFTkNJTFJFRl9NQVNLICAgICAgICAweDAwMDAwMGZmCisjCWRlZmluZSBSNTAwX1NURU5DSUxNQVNLX1NISUZUICAgICAgOAorIwlkZWZpbmUgUjUwMF9TVEVOQ0lMTUFTS19NQVNLICAgICAgIDB4MDAwMGZmMDAKKyMJZGVmaW5lIFI1MDBfU1RFTkNJTFdSSVRFTUFTS19TSElGVCAxNgorIwlkZWZpbmUgUjUwMF9TVEVOQ0lMV1JJVEVNQVNLX01BU0sgIDB4MDBmZjAwMDAKKworLyoqCisgKiBcZGVmZ3JvdXAgUjNYWF9SNVhYX1BST0dSQU1NQUJMRV9WRVJURVhfU0hBREVSX0RFU0NSSVBUSU9OIFIzWFgtUjVYWCBQUk9HUkFNTUFCTEUgVkVSVEVYIFNIQURFUiBERVNDUklQVElPTgorICoKKyAqIFRoZSBQVlNfRFNUX01BVEhfSU5TVCBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzIGEgVmVjdG9yCisgKiBFbmdpbmUgaW5zdHJ1Y3Rpb24gb3IgYSBNYXRoIEVuZ2luZSBpbnN0cnVjdGlvbi4KICAqLwotI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWCAgICAwCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9ZICAgIDEKLSNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1ogICAgMgotI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfVyAgICAzCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9aRVJPIDQKLSNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX09ORSAgNQotI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfTUFTSyA3CiAKLSNkZWZpbmUgUjMwMF9WUElfSU5fWF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBSMzAwX1ZQSV9JTl9aX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgUjMwMF9WUElfSU5fV19TSElGVCAgICAgICAgICAgICAgICAgICAgIDIyCisvKlx7Ki8KIAotI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfWCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCi0jZGVmaW5lIFIzMDBfVlBJX0lOX05FR19ZICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNikKLSNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1ogICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI3KQotI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfVyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpCi0vKiBFTkQ6IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLworZW51bSB7CisJLyogUjNYWCAqLworCVZFQ1RPUl9OT19PUAkJCT0gMCwKKwlWRV9ET1RfUFJPRFVDVAkJCT0gMSwKKwlWRV9NVUxUSVBMWQkJCT0gMiwKKwlWRV9BREQJCQkJPSAzLAorCVZFX01VTFRJUExZX0FERAkJCT0gNCwKKwlWRV9ESVNUQU5DRV9WRUNUT1IJCT0gNSwKKwlWRV9GUkFDVElPTgkJCT0gNiwKKwlWRV9NQVhJTVVNCQkJPSA3LAorCVZFX01JTklNVU0JCQk9IDgsCisJVkVfU0VUX0dSRUFURVJfVEhBTl9FUVVBTAk9IDksCisJVkVfU0VUX0xFU1NfVEhBTgkJPSAxMCwKKwlWRV9NVUxUSVBMWVgyX0FERAkJPSAxMSwKKwlWRV9NVUxUSVBMWV9DTEFNUAkJPSAxMiwKKwlWRV9GTFQyRklYX0RYCQkJPSAxMywKKwlWRV9GTFQyRklYX0RYX1JORAkJPSAxNCwKKwkvKiBSNVhYICovCisJVkVfUFJFRF9TRVRfRVFfUFVTSAkJPSAxNSwKKwlWRV9QUkVEX1NFVF9HVF9QVVNICQk9IDE2LAorCVZFX1BSRURfU0VUX0dURV9QVVNICQk9IDE3LAorCVZFX1BSRURfU0VUX05FUV9QVVNICQk9IDE4LAorCVZFX0NPTkRfV1JJVEVfRVEJCT0gMTksCisJVkVfQ09ORF9XUklURV9HVAkJPSAyMCwKKwlWRV9DT05EX1dSSVRFX0dURQkJPSAyMSwKKwlWRV9DT05EX1dSSVRFX05FUQkJPSAyMiwKKwlWRV9DT05EX01VWF9FUQkJCT0gMjMsCisJVkVfQ09ORF9NVVhfR1QJCQk9IDI0LAorCVZFX0NPTkRfTVVYX0dURQkJCT0gMjUsCisJVkVfU0VUX0dSRUFURVJfVEhBTgkJPSAyNiwKKwlWRV9TRVRfRVFVQUwJCQk9IDI3LAorCVZFX1NFVF9OT1RfRVFVQUwJCT0gMjgsCit9OworCitlbnVtIHsKKwkvKiBSM1hYICovCisJTUFUSF9OT19PUAkJCT0gMCwKKwlNRV9FWFBfQkFTRTJfRFgJCQk9IDEsCisJTUVfTE9HX0JBU0UyX0RYCQkJPSAyLAorCU1FX0VYUF9CQVNFRV9GRgkJCT0gMywKKwlNRV9MSUdIVF9DT0VGRl9EWAkJPSA0LAorCU1FX1BPV0VSX0ZVTkNfRkYJCT0gNSwKKwlNRV9SRUNJUF9EWAkJCT0gNiwKKwlNRV9SRUNJUF9GRgkJCT0gNywKKwlNRV9SRUNJUF9TUVJUX0RYCQk9IDgsCisJTUVfUkVDSVBfU1FSVF9GRgkJPSA5LAorCU1FX01VTFRJUExZCQkJPSAxMCwKKwlNRV9FWFBfQkFTRTJfRlVMTF9EWAkJPSAxMSwKKwlNRV9MT0dfQkFTRTJfRlVMTF9EWAkJPSAxMiwKKwlNRV9QT1dFUl9GVU5DX0ZGX0NMQU1QX0IJPSAxMywKKwlNRV9QT1dFUl9GVU5DX0ZGX0NMQU1QX0IxCT0gMTQsCisJTUVfUE9XRVJfRlVOQ19GRl9DTEFNUF8wMQk9IDE1LAorCU1FX1NJTgkJCQk9IDE2LAorCU1FX0NPUwkJCQk9IDE3LAorCS8qIFI1WFggKi8KKwlNRV9MT0dfQkFTRTJfSUVFRQkJPSAxOCwKKwlNRV9SRUNJUF9JRUVFCQkJPSAxOSwKKwlNRV9SRUNJUF9TUVJUX0lFRUUJCT0gMjAsCisJTUVfUFJFRF9TRVRfRVEJCQk9IDIxLAorCU1FX1BSRURfU0VUX0dUCQkJPSAyMiwKKwlNRV9QUkVEX1NFVF9HVEUJCQk9IDIzLAorCU1FX1BSRURfU0VUX05FUQkJCT0gMjQsCisJTUVfUFJFRF9TRVRfQ0xSCQkJPSAyNSwKKwlNRV9QUkVEX1NFVF9JTlYJCQk9IDI2LAorCU1FX1BSRURfU0VUX1BPUAkJCT0gMjcsCisJTUVfUFJFRF9TRVRfUkVTVE9SRQkJPSAyOCwKK307CisKK2VudW0geworCS8qIFIzWFggKi8KKwlQVlNfTUFDUk9fT1BfMkNMS19NQURECQk9IDAsCisJUFZTX01BQ1JPX09QXzJDTEtfTTJYX0FERAk9IDEsCit9OworCitlbnVtIHsKKwlQVlNfU1JDX1JFR19URU1QT1JBUlkJCT0gMCwJLyogSW50ZXJtZWRpYXRlIFN0b3JhZ2UgKi8KKwlQVlNfU1JDX1JFR19JTlBVVAkJPSAxLAkvKiBJbnB1dCBWZXJ0ZXggU3RvcmFnZSAqLworCVBWU19TUkNfUkVHX0NPTlNUQU5UCQk9IDIsCS8qIENvbnN0YW50IFN0YXRlIFN0b3JhZ2UgKi8KKwlQVlNfU1JDX1JFR19BTFRfVEVNUE9SQVJZCT0gMywJLyogQWx0ZXJuYXRlIEludGVybWVkaWF0ZSBTdG9yYWdlICovCit9OworCitlbnVtIHsKKwlQVlNfRFNUX1JFR19URU1QT1JBUlkJCT0gMCwJLyogSW50ZXJtZWRpYXRlIFN0b3JhZ2UgKi8KKwlQVlNfRFNUX1JFR19BMAkJCT0gMSwJLyogQWRkcmVzcyBSZWdpc3RlciBTdG9yYWdlICovCisJUFZTX0RTVF9SRUdfT1VUCQkJPSAyLAkvKiBPdXRwdXQgTWVtb3J5LiBVc2VkIGZvciBhbGwgb3V0cHV0cyAqLworCVBWU19EU1RfUkVHX09VVF9SRVBMX1gJCT0gMywJLyogT3V0cHV0IE1lbW9yeSAmIFJlcGxpY2F0ZSBYIHRvIGFsbCBjaGFubmVscyAqLworCVBWU19EU1RfUkVHX0FMVF9URU1QT1JBUlkJPSA0LAkvKiBBbHRlcm5hdGUgSW50ZXJtZWRpYXRlIFN0b3JhZ2UgKi8KKwlQVlNfRFNUX1JFR19JTlBVVAkJPSA1LAkvKiBPdXRwdXQgTWVtb3J5ICYgUmVwbGljYXRlIFggdG8gYWxsIGNoYW5uZWxzICovCit9OworCitlbnVtIHsKKwlQVlNfU1JDX1NFTEVDVF9YCQk9IDAsCS8qIFNlbGVjdCBYIENvbXBvbmVudCAqLworCVBWU19TUkNfU0VMRUNUX1kJCT0gMSwJLyogU2VsZWN0IFkgQ29tcG9uZW50ICovCisJUFZTX1NSQ19TRUxFQ1RfWgkJPSAyLAkvKiBTZWxlY3QgWiBDb21wb25lbnQgKi8KKwlQVlNfU1JDX1NFTEVDVF9XCQk9IDMsCS8qIFNlbGVjdCBXIENvbXBvbmVudCAqLworCVBWU19TUkNfU0VMRUNUX0ZPUkNFXzAJCT0gNCwJLyogRm9yY2UgQ29tcG9uZW50IHRvIDAuMCAqLworCVBWU19TUkNfU0VMRUNUX0ZPUkNFXzEJCT0gNSwJLyogRm9yY2UgQ29tcG9uZW50IHRvIDEuMCAqLworfTsKKworLyogUFZTIE9wY29kZSAmIERlc3RpbmF0aW9uIE9wZXJhbmQgRGVzY3JpcHRpb24gKi8KKworZW51bSB7CisJUFZTX0RTVF9PUENPREVfTUFTSwkJPSAweDNmLAorCVBWU19EU1RfT1BDT0RFX1NISUZUCQk9IDAsCisJUFZTX0RTVF9NQVRIX0lOU1RfTUFTSwkJPSAweDEsCisJUFZTX0RTVF9NQVRIX0lOU1RfU0hJRlQJCT0gNiwKKwlQVlNfRFNUX01BQ1JPX0lOU1RfTUFTSwkJPSAweDEsCisJUFZTX0RTVF9NQUNST19JTlNUX1NISUZUCT0gNywKKwlQVlNfRFNUX1JFR19UWVBFX01BU0sJCT0gMHhmLAorCVBWU19EU1RfUkVHX1RZUEVfU0hJRlQJCT0gOCwKKwlQVlNfRFNUX0FERFJfTU9ERV8xX01BU0sJPSAweDEsCisJUFZTX0RTVF9BRERSX01PREVfMV9TSElGVAk9IDEyLAorCVBWU19EU1RfT0ZGU0VUX01BU0sJCT0gMHg3ZiwKKwlQVlNfRFNUX09GRlNFVF9TSElGVAkJPSAxMywKKwlQVlNfRFNUX1dFX1hfTUFTSwkJPSAweDEsCisJUFZTX0RTVF9XRV9YX1NISUZUCQk9IDIwLAorCVBWU19EU1RfV0VfWV9NQVNLCQk9IDB4MSwKKwlQVlNfRFNUX1dFX1lfU0hJRlQJCT0gMjEsCisJUFZTX0RTVF9XRV9aX01BU0sJCT0gMHgxLAorCVBWU19EU1RfV0VfWl9TSElGVAkJPSAyMiwKKwlQVlNfRFNUX1dFX1dfTUFTSwkJPSAweDEsCisJUFZTX0RTVF9XRV9XX1NISUZUCQk9IDIzLAorCVBWU19EU1RfVkVfU0FUX01BU0sJCT0gMHgxLAorCVBWU19EU1RfVkVfU0FUX1NISUZUCQk9IDI0LAorCVBWU19EU1RfTUVfU0FUX01BU0sJCT0gMHgxLAorCVBWU19EU1RfTUVfU0FUX1NISUZUCQk9IDI1LAorCVBWU19EU1RfUFJFRF9FTkFCTEVfTUFTSwk9IDB4MSwKKwlQVlNfRFNUX1BSRURfRU5BQkxFX1NISUZUCT0gMjYsCisJUFZTX0RTVF9QUkVEX1NFTlNFX01BU0sJCT0gMHgxLAorCVBWU19EU1RfUFJFRF9TRU5TRV9TSElGVAk9IDI3LAorCVBWU19EU1RfRFVBTF9NQVRIX09QX01BU0sJPSAweDMsCisJUFZTX0RTVF9EVUFMX01BVEhfT1BfU0hJRlQJPSAyNywKKwlQVlNfRFNUX0FERFJfU0VMX01BU0sJCT0gMHgzLAorCVBWU19EU1RfQUREUl9TRUxfU0hJRlQJCT0gMjksCisJUFZTX0RTVF9BRERSX01PREVfMF9NQVNLCT0gMHgxLAorCVBWU19EU1RfQUREUl9NT0RFXzBfU0hJRlQJPSAzMSwKK307CisKKy8qIFBWUyBTb3VyY2UgT3BlcmFuZCBEZXNjcmlwdGlvbiAqLworCitlbnVtIHsKKwlQVlNfU1JDX1JFR19UWVBFX01BU0sJCT0gMHgzLAorCVBWU19TUkNfUkVHX1RZUEVfU0hJRlQJCT0gMCwKKwlTUEFSRV8wX01BU0sJCQk9IDB4MSwKKwlTUEFSRV8wX1NISUZUCQkJPSAyLAorCVBWU19TUkNfQUJTX1hZWldfTUFTSwkJPSAweDEsCisJUFZTX1NSQ19BQlNfWFlaV19TSElGVAkJPSAzLAorCVBWU19TUkNfQUREUl9NT0RFXzBfTUFTSwk9IDB4MSwKKwlQVlNfU1JDX0FERFJfTU9ERV8wX1NISUZUCT0gNCwKKwlQVlNfU1JDX09GRlNFVF9NQVNLCQk9IDB4ZmYsCisJUFZTX1NSQ19PRkZTRVRfU0hJRlQJCT0gNSwKKwlQVlNfU1JDX1NXSVpaTEVfWF9NQVNLCQk9IDB4NywKKwlQVlNfU1JDX1NXSVpaTEVfWF9TSElGVAkJPSAxMywKKwlQVlNfU1JDX1NXSVpaTEVfWV9NQVNLCQk9IDB4NywKKwlQVlNfU1JDX1NXSVpaTEVfWV9TSElGVAkJPSAxNiwKKwlQVlNfU1JDX1NXSVpaTEVfWl9NQVNLCQk9IDB4NywKKwlQVlNfU1JDX1NXSVpaTEVfWl9TSElGVAkJPSAxOSwKKwlQVlNfU1JDX1NXSVpaTEVfV19NQVNLCQk9IDB4NywKKwlQVlNfU1JDX1NXSVpaTEVfV19TSElGVAkJPSAyMiwKKwlQVlNfU1JDX01PRElGSUVSX1hfTUFTSwkJPSAweDEsCisJUFZTX1NSQ19NT0RJRklFUl9YX1NISUZUCT0gMjUsCisJUFZTX1NSQ19NT0RJRklFUl9ZX01BU0sJCT0gMHgxLAorCVBWU19TUkNfTU9ESUZJRVJfWV9TSElGVAk9IDI2LAorCVBWU19TUkNfTU9ESUZJRVJfWl9NQVNLCQk9IDB4MSwKKwlQVlNfU1JDX01PRElGSUVSX1pfU0hJRlQJPSAyNywKKwlQVlNfU1JDX01PRElGSUVSX1dfTUFTSwkJPSAweDEsCisJUFZTX1NSQ19NT0RJRklFUl9XX1NISUZUCT0gMjgsCisJUFZTX1NSQ19BRERSX1NFTF9NQVNLCQk9IDB4MywKKwlQVlNfU1JDX0FERFJfU0VMX1NISUZUCQk9IDI5LAorCVBWU19TUkNfQUREUl9NT0RFXzFfTUFTSwk9IDB4MCwKKwlQVlNfU1JDX0FERFJfTU9ERV8xX1NISUZUCT0gMzIsCit9OworCisvKlx9Ki8KIAogLyogQkVHSU46IFBhY2tldCAzIGNvbW1hbmRzICovCiAKQEAgLTE2MDEsMTMgKzI2NzksNTExIEBACiAjZGVmaW5lIFIzMDBfUFJJTV9OVU1fVkVSVElDRVNfU0hJRlQgICAgICAgICAgICAxNgogI2RlZmluZSBSMzAwX1BSSU1fTlVNX1ZFUlRJQ0VTX01BU0sgICAgICAgICAgICAgMHhmZmZmCiAKKworCisvKgorICogVGhlIFI1MDAgdW5pZmllZCBzaGFkZXIgKFVTKSByZWdpc3RlcnMgY29tZSBpbiBiYW5rcyBvZiA1MTIgZWFjaCwgb25lCisgKiBmb3IgZWFjaCBpbnN0cnVjdGlvbiBzbG90IGluIHRoZSBzaGFkZXIuICBZb3UgY2FuJ3QgdG91Y2ggdGhlbSBkaXJlY3RseS4KKyAqIFI1MDBfVVNfVkVDVE9SX0lOREVYKCkgc2V0cyB0aGUgYmFzZSBpbnN0cnVjdGlvbiB0byBtb2RpZnk7IHN1Y2Nlc3NpdmUKKyAqIHdyaXRlcyB0byBSNTAwX0dBX1VTX1ZFQ1RPUl9EQVRBIGF1dG9pbmNyZW1lbnQgdGhlIGluZGV4IGFmdGVyIHRoZQorICogaW5zdHJ1Y3Rpb24gaXMgZnVsbHkgc3BlY2lmaWVkLgorICovCisjZGVmaW5lIFI1MDBfVVNfQUxVX0FMUEhBX0lOU1RfMAkJCTB4YTgwMAorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09QX01BRAkJCQkwCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfRFAJCQkJMQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09QX01JTgkJCQkyCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfTUFYCQkJCTMKKy8qICNkZWZpbmUgUjUwMF9BTFBIQV9PUF9SRVNFUlZFRAkJCTQgKi8KKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9PUF9DTkQJCQkJNQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09QX0NNUAkJCQk2CisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfRlJDCQkJCTcKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9PUF9FWDIJCQkJOAorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09QX0xOMgkJCQk5CisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfUkNQCQkJCTEwCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfUlNRCQkJCTExCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfU0lOCQkJCTEyCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfQ09TCQkJCTEzCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfTURICQkJCTE0CisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT1BfTURWCQkJCTE1CisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUkQoeCkJCQkJKHggPDwgNCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9BRERSRF9SRUwJCQkJKDEgPDwgMTEpCisjICBkZWZpbmUgUjUwMF9BTFBIQV9TRUxfQV9TSElGVAkJCTEyCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU0VMX0FfU1JDMAkJCSgwIDw8IDEyKQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NFTF9BX1NSQzEJCQkoMSA8PCAxMikKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9TRUxfQV9TUkMyCQkJKDIgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU0VMX0FfU1JDUAkJCSgzIDw8IDEyKQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV9SCQkJCSgwIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV9HCQkJCSgxIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV9CCQkJCSgyIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV9BCQkJCSgzIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV8wCQkJCSg0IDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NXSVpfQV9IQUxGCQkJKDUgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9BXzEJCQkJKDYgPDwgMTQpCisvKiAjZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9BX1VOVVNFRAkJCSg3IDw8IDE0KSAqLworIyAgIGRlZmluZSBSNTAwX0FMUEhBX01PRF9BX05PUAkJCQkoMCA8PCAxNykKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9NT0RfQV9ORUcJCQkJKDEgPDwgMTcpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfTU9EX0FfQUJTCQkJCSgyIDw8IDE3KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX01PRF9BX05BQgkJCQkoMyA8PCAxNykKKyMgIGRlZmluZSBSNTAwX0FMUEhBX1NFTF9CX1NISUZUCQkJMTkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9TRUxfQl9TUkMwCQkJKDAgPDwgMTkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU0VMX0JfU1JDMQkJCSgxIDw8IDE5KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX1NFTF9CX1NSQzIJCQkoMiA8PCAxOSkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9TRUxfQl9TUkNQCQkJKDMgPDwgMTkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CX1IJCQkJKDAgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CX0cJCQkJKDEgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CX0IJCQkJKDIgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CX0EJCQkJKDMgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CXzAJCQkJKDQgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1dJWl9CX0hBTEYJCQkoNSA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9TV0laX0JfMQkJCQkoNiA8PCAyMSkKKy8qICNkZWZpbmUgUjUwMF9BTFBIQV9TV0laX0JfVU5VU0VECQkJKDcgPDwgMjEpICovCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfTU9EX0JfTk9QCQkJCSgwIDw8IDI0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX01PRF9CX05FRwkJCQkoMSA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9NT0RfQl9BQlMJCQkJKDIgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfTU9EX0JfTkFCCQkJCSgzIDw8IDI0KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09NT0RfSURFTlRJVFkJCQkoMCA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9PTU9EX01VTF8yCQkJKDEgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT01PRF9NVUxfNAkJCSgyIDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09NT0RfTVVMXzgJCQkoMyA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9PTU9EX0RJVl8yCQkJKDQgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfT01PRF9ESVZfNAkJCSg1IDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX0FMUEhBX09NT0RfRElWXzgJCQkoNiA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9PTU9EX0RJU0FCTEUJCQkoNyA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9UQVJHRVQoeCkJCQkJKHggPDwgMjkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfV19PTUFTSwkJCQkoMSA8PCAzMSkKKyNkZWZpbmUgUjUwMF9VU19BTFVfQUxQSEFfQUREUl8wCQkJMHg5ODAwCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjAoeCkJCQkJKHggPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9BRERSMF9DT05TVAkJCSgxIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjBfUkVMCQkJCSgxIDw8IDkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjEoeCkJCQkJKHggPDwgMTApCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjFfQ09OU1QJCQkoMSA8PCAxOCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9BRERSMV9SRUwJCQkJKDEgPDwgMTkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjIoeCkJCQkJKHggPDwgMjApCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfQUREUjJfQ09OU1QJCQkoMSA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9BRERSMl9SRUwJCQkJKDEgPDwgMjkpCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1JDUF9PUF8xX01JTlVTXzJBMAkJKDAgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1JDUF9PUF9BMV9NSU5VU19BMAkJKDEgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfQUxQSEFfU1JDUF9PUF9BMV9QTFVTX0EwCQkoMiA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9BTFBIQV9TUkNQX09QXzFfTUlOVVNfQTAJCSgzIDw8IDMwKQorI2RlZmluZSBSNTAwX1VTX0FMVV9SR0JBX0lOU1RfMAkJCQkweGIwMDAKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9NQUQJCQkJKDAgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9EUDMJCQkJKDEgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9EUDQJCQkJKDIgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9EMkEJCQkJKDMgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9NSU4JCQkJKDQgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9NQVgJCQkJKDUgPDwgMCkKKy8qICNkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9SRVNFUlZFRAkJCSg2IDw8IDApICovCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfT1BfQ05ECQkJCSg3IDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfT1BfQ01QCQkJCSg4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfT1BfRlJDCQkJCSg5IDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfT1BfU09QCQkJCSgxMCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX09QX01ESAkJCQkoMTEgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9PUF9NRFYJCQkJKDEyIDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQUREUkQoeCkJCQkoeCA8PCA0KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FERFJEX1JFTAkJCSgxIDw8IDExKQorIyAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfU0VMX0NfU0hJRlQJCQkxMgorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX1NFTF9DX1NSQzAJCQkoMCA8PCAxMikKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9TRUxfQ19TUkMxCQkJKDEgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfU0VMX0NfU1JDMgkJCSgyIDw8IDEyKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX1NFTF9DX1NSQ1AJCQkoMyA8PCAxMikKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9SX1NXSVpfUgkJCSgwIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX1JfU1dJWl9HCQkJKDEgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfUl9TV0laX0IJCQkoMiA8PCAxNCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9SX1NXSVpfQQkJCSgzIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX1JfU1dJWl8wCQkJKDQgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfUl9TV0laX0hBTEYJCQkoNSA8PCAxNCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9SX1NXSVpfMQkJCSg2IDw8IDE0KQorLyogI2RlZmluZSBSNTAwX0FMVV9SR0JBX1JfU1dJWl9VTlVTRUQJCQkoNyA8PCAxNCkgKi8KKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9HX1NXSVpfUgkJCSgwIDw8IDE3KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0dfU1dJWl9HCQkJKDEgPDwgMTcpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfR19TV0laX0IJCQkoMiA8PCAxNykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9HX1NXSVpfQQkJCSgzIDw8IDE3KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0dfU1dJWl8wCQkJKDQgPDwgMTcpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfR19TV0laX0hBTEYJCQkoNSA8PCAxNykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9HX1NXSVpfMQkJCSg2IDw8IDE3KQorLyogI2RlZmluZSBSNTAwX0FMVV9SR0JBX0dfU1dJWl9VTlVTRUQJCQkoNyA8PCAxNykgKi8KKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9CX1NXSVpfUgkJCSgwIDw8IDIwKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0JfU1dJWl9HCQkJKDEgPDwgMjApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQl9TV0laX0IJCQkoMiA8PCAyMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9CX1NXSVpfQQkJCSgzIDw8IDIwKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0JfU1dJWl8wCQkJKDQgPDwgMjApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQl9TV0laX0hBTEYJCQkoNSA8PCAyMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9CX1NXSVpfMQkJCSg2IDw8IDIwKQorLyogI2RlZmluZSBSNTAwX0FMVV9SR0JBX0JfU1dJWl9VTlVTRUQJCQkoNyA8PCAyMCkgKi8KKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9NT0RfQ19OT1AJCQkoMCA8PCAyMykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9NT0RfQ19ORUcJCQkoMSA8PCAyMykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9NT0RfQ19BQlMJCQkoMiA8PCAyMykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9NT0RfQ19OQUIJCQkoMyA8PCAyMykKKyMgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX1NFTF9DX1NISUZUCQkyNQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX1NFTF9DX1NSQzAJCSgwIDw8IDI1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX1NFTF9DX1NSQzEJCSgxIDw8IDI1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX1NFTF9DX1NSQzIJCSgyIDw8IDI1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX1NFTF9DX1NSQ1AJCSgzIDw8IDI1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FfU1dJWl9SCQkJKDAgPDwgMjcpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQV9TV0laX0cJCQkoMSA8PCAyNykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9BX1NXSVpfQgkJCSgyIDw8IDI3KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FfU1dJWl9BCQkJKDMgPDwgMjcpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQV9TV0laXzAJCQkoNCA8PCAyNykKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9BX1NXSVpfSEFMRgkJCSg1IDw8IDI3KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FfU1dJWl8xCQkJKDYgPDwgMjcpCisvKiAjZGVmaW5lIFI1MDBfQUxVX1JHQkFfQV9TV0laX1VOVVNFRAkJCSg3IDw8IDI3KSAqLworIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX01PRF9DX05PUAkJKDAgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQkFfQUxQSEFfTU9EX0NfTkVHCQkoMSA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCQV9BTFBIQV9NT0RfQ19BQlMJCSgyIDw8IDMwKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JBX0FMUEhBX01PRF9DX05BQgkJKDMgPDwgMzApCisjZGVmaW5lIFI1MDBfVVNfQUxVX1JHQl9JTlNUXzAJCQkJMHhhMDAwCisjICBkZWZpbmUgUjUwMF9BTFVfUkdCX1NFTF9BX1NISUZUCQkJMAorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0FfU1JDMAkJCSgwIDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9TRUxfQV9TUkMxCQkJKDEgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX1NFTF9BX1NSQzIJCQkoMiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0FfU1JDUAkJCSgzIDw8IDApCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9SX1NXSVpfQV9SCQkJKDAgPDwgMikKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX1JfU1dJWl9BX0cJCQkoMSA8PCAyKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0FfQgkJCSgyIDw8IDIpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9SX1NXSVpfQV9BCQkJKDMgPDwgMikKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX1JfU1dJWl9BXzAJCQkoNCA8PCAyKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0FfSEFMRgkJCSg1IDw8IDIpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9SX1NXSVpfQV8xCQkJKDYgPDwgMikKKy8qICNkZWZpbmUgUjUwMF9BTFVfUkdCX1JfU1dJWl9BX1VOVVNFRAkJCSg3IDw8IDIpICovCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQV9SCQkJKDAgPDwgNSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0dfU1dJWl9BX0cJCQkoMSA8PCA1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfR19TV0laX0FfQgkJCSgyIDw8IDUpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQV9BCQkJKDMgPDwgNSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0dfU1dJWl9BXzAJCQkoNCA8PCA1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfR19TV0laX0FfSEFMRgkJCSg1IDw8IDUpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQV8xCQkJKDYgPDwgNSkKKy8qICNkZWZpbmUgUjUwMF9BTFVfUkdCX0dfU1dJWl9BX1VOVVNFRAkJCSg3IDw8IDUpICovCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9CX1NXSVpfQV9SCQkJKDAgPDwgOCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9BX0cJCQkoMSA8PCA4KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfQl9TV0laX0FfQgkJCSgyIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9CX1NXSVpfQV9BCQkJKDMgPDwgOCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9BXzAJCQkoNCA8PCA4KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfQl9TV0laX0FfSEFMRgkJCSg1IDw8IDgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9CX1NXSVpfQV8xCQkJKDYgPDwgOCkKKy8qICNkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9BX1VOVVNFRAkJCSg3IDw8IDgpICovCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9NT0RfQV9OT1AJCQkoMCA8PCAxMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX01PRF9BX05FRwkJCSgxIDw8IDExKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfTU9EX0FfQUJTCQkJKDIgPDwgMTEpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9NT0RfQV9OQUIJCQkoMyA8PCAxMSkKKyMgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0JfU0hJRlQJCQkxMworIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0JfU1JDMAkJCSgwIDw8IDEzKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0JfU1JDMQkJCSgxIDw8IDEzKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0JfU1JDMgkJCSgyIDw8IDEzKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfU0VMX0JfU1JDUAkJCSgzIDw8IDEzKQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfUgkJCSgwIDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfRwkJCSgxIDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfQgkJCSgyIDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfQQkJCSgzIDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfMAkJCSg0IDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfSEFMRgkJCSg1IDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfMQkJCSg2IDw8IDE1KQorLyogI2RlZmluZSBSNTAwX0FMVV9SR0JfUl9TV0laX0JfVU5VU0VECQkJKDcgPDwgMTUpICovCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9SCQkJKDAgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9HCQkJKDEgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9CCQkJKDIgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9BCQkJKDMgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl8wCQkJKDQgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9IQUxGCQkJKDUgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl8xCQkJKDYgPDwgMTgpCisvKiAjZGVmaW5lIFI1MDBfQUxVX1JHQl9HX1NXSVpfQl9VTlVTRUQJCQkoNyA8PCAxOCkgKi8KKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX1IJCQkoMCA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX0cJCQkoMSA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX0IJCQkoMiA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX0EJCQkoMyA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CXzAJCQkoNCA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX0hBTEYJCQkoNSA8PCAyMSkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CXzEJCQkoNiA8PCAyMSkKKy8qICNkZWZpbmUgUjUwMF9BTFVfUkdCX0JfU1dJWl9CX1VOVVNFRAkJCSg3IDw8IDIxKSAqLworIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfTU9EX0JfTk9QCQkJKDAgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9NT0RfQl9ORUcJCQkoMSA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX01PRF9CX0FCUwkJCSgyIDw8IDI0KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfTU9EX0JfTkFCCQkJKDMgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX0lERU5USVRZCQkJKDAgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX01VTF8yCQkJKDEgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX01VTF80CQkJKDIgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX01VTF84CQkJKDMgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX0RJVl8yCQkJKDQgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX0RJVl80CQkJKDUgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX0RJVl84CQkJKDYgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfQUxVX1JHQl9PTU9EX0RJU0FCTEUJCQkoNyA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9BTFVfUkdCX1RBUkdFVCh4KQkJCSh4IDw8IDI5KQorIyAgIGRlZmluZSBSNTAwX0FMVV9SR0JfV01BU0sJCQkJKDEgPDwgMzEpCisjZGVmaW5lIFI1MDBfVVNfQUxVX1JHQl9BRERSXzAJCQkJMHg5MDAwCisjICAgZGVmaW5lIFI1MDBfUkdCX0FERFIwKHgpCQkJCSh4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfUkdCX0FERFIwX0NPTlNUCQkJCSgxIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfUkdCX0FERFIwX1JFTAkJCQkoMSA8PCA5KQorIyAgIGRlZmluZSBSNTAwX1JHQl9BRERSMSh4KQkJCQkoeCA8PCAxMCkKKyMgICBkZWZpbmUgUjUwMF9SR0JfQUREUjFfQ09OU1QJCQkJKDEgPDwgMTgpCisjICAgZGVmaW5lIFI1MDBfUkdCX0FERFIxX1JFTAkJCQkoMSA8PCAxOSkKKyMgICBkZWZpbmUgUjUwMF9SR0JfQUREUjIoeCkJCQkJKHggPDwgMjApCisjICAgZGVmaW5lIFI1MDBfUkdCX0FERFIyX0NPTlNUCQkJCSgxIDw8IDI4KQorIyAgIGRlZmluZSBSNTAwX1JHQl9BRERSMl9SRUwJCQkJKDEgPDwgMjkpCisjICAgZGVmaW5lIFI1MDBfUkdCX1NSQ1BfT1BfMV9NSU5VU18yUkdCMAkJKDAgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfUkdCX1NSQ1BfT1BfUkdCMV9NSU5VU19SR0IwCQkoMSA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9SR0JfU1JDUF9PUF9SR0IxX1BMVVNfUkdCMAkJKDIgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfUkdCX1NSQ1BfT1BfMV9NSU5VU19SR0IwCQkoMyA8PCAzMCkKKyNkZWZpbmUgUjUwMF9VU19DTU5fSU5TVF8wCQkJCTB4YjgwMAorIyAgZGVmaW5lIFI1MDBfSU5TVF9UWVBFX01BU0sJCQkJKDMgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX1RZUEVfQUxVCQkJCSgwIDw8IDApCisjICAgZGVmaW5lIFI1MDBfSU5TVF9UWVBFX09VVAkJCQkoMSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfVFlQRV9GQwkJCQkoMiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfVFlQRV9URVgJCQkJKDMgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX1RFWF9TRU1fV0FJVAkJCSgxIDw8IDIpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfTk9ORQkJCSgwIDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfUkdCQQkJCSgxIDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfUlJSUgkJCSgyIDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfR0dHRwkJCSgzIDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfQkJCQgkJCSg0IDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9TRUxfQUFBQQkJCSg1IDw8IDMpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfUFJFRF9JTlYJCQkoMSA8PCA2KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfV1JJVEVfSU5BQ1RJVkUJCQkoMSA8PCA3KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfTEFTVAkJCQkoMSA8PCA4KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfTk9QCQkJCSgxIDw8IDkpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9BTFVfV0FJVAkJCQkoMSA8PCAxMCkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX1JHQl9XTUFTS19SCQkJKDEgPDwgMTEpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfV01BU0tfRwkJCSgxIDw8IDEyKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfUkdCX1dNQVNLX0IJCQkoMSA8PCAxMykKKyMgICBkZWZpbmUgUjUwMF9JTlNUX0FMUEhBX1dNQVNLCQkJKDEgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9SR0JfT01BU0tfUgkJCSgxIDw8IDE1KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfUkdCX09NQVNLX0cJCQkoMSA8PCAxNikKKyMgICBkZWZpbmUgUjUwMF9JTlNUX1JHQl9PTUFTS19CCQkJKDEgPDwgMTcpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9BTFBIQV9PTUFTSwkJCSgxIDw8IDE4KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfUkdCX0NMQU1QCQkJCSgxIDw8IDE5KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxQSEFfQ0xBTVAJCQkoMSA8PCAyMCkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX0FMVV9SRVNVTFRfU0VMCQkJKDEgPDwgMjEpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9BTFBIQV9QUkVEX0lOVgkJCSgxIDw8IDIyKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxVX1JFU1VMVF9PUF9FUQkJCSgwIDw8IDIzKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxVX1JFU1VMVF9PUF9MVAkJCSgxIDw8IDIzKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxVX1JFU1VMVF9PUF9HRQkJCSgyIDw8IDIzKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxVX1JFU1VMVF9PUF9ORQkJCSgzIDw8IDIzKQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxQSEFfUFJFRF9TRUxfTk9ORQkJKDAgPDwgMjUpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9BTFBIQV9QUkVEX1NFTF9SR0JBCQkoMSA8PCAyNSkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX0FMUEhBX1BSRURfU0VMX1JSUlIJCSgyIDw8IDI1KQorIyAgIGRlZmluZSBSNTAwX0lOU1RfQUxQSEFfUFJFRF9TRUxfR0dHRwkJKDMgPDwgMjUpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9BTFBIQV9QUkVEX1NFTF9CQkJCCQkoNCA8PCAyNSkKKyMgICBkZWZpbmUgUjUwMF9JTlNUX0FMUEhBX1BSRURfU0VMX0FBQUEJCSg1IDw8IDI1KQorLyogWFhYIG5leHQgZm91ciBhcmUga2luZCBvZiBndWVzc2VkICovCisjICAgZGVmaW5lIFI1MDBfSU5TVF9TVEFUX1dFX1IJCQkJKDEgPDwgMjgpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9TVEFUX1dFX0cJCQkJKDEgPDwgMjkpCisjICAgZGVmaW5lIFI1MDBfSU5TVF9TVEFUX1dFX0IJCQkJKDEgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfSU5TVF9TVEFUX1dFX0EJCQkJKDEgPDwgMzEpCisKKy8qIG5vdGUgdGhhdCB0aGVzZSBhcmUgOCBiaXQgbGVuZ3RocywgZGVzcGl0ZSB0aGUgb2Zmc2V0cywgYXQgbGVhc3QgZm9yIFI1MDAgKi8KKyNkZWZpbmUgUjUwMF9VU19DT0RFX0FERFIJCQkJMHg0NjMwCisjICAgZGVmaW5lIFI1MDBfVVNfQ09ERV9TVEFSVF9BRERSKHgpCQkJKHggPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9VU19DT0RFX0VORF9BRERSKHgpCQkJKHggPDwgMTYpCisjZGVmaW5lIFI1MDBfVVNfQ09ERV9PRkZTRVQJCQkJMHg0NjM4CisjICAgZGVmaW5lIFI1MDBfVVNfQ09ERV9PRkZTRVRfQUREUih4KQkJCSh4IDw8IDApCisjZGVmaW5lIFI1MDBfVVNfQ09ERV9SQU5HRQkJCQkweDQ2MzQKKyMgICBkZWZpbmUgUjUwMF9VU19DT0RFX1JBTkdFX0FERFIoeCkJCQkoeCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX1VTX0NPREVfUkFOR0VfU0laRSh4KQkJCSh4IDw8IDE2KQorI2RlZmluZSBSNTAwX1VTX0NPTkZJRwkJCQkJMHg0NjAwCisjICAgZGVmaW5lIFI1MDBfWkVST19USU1FU19BTllUSElOR19FUVVBTFNfWkVSTwkJKDEgPDwgMSkKKyNkZWZpbmUgUjUwMF9VU19GQ19BRERSXzAJCQkJMHhhMDAwCisjICAgZGVmaW5lIFI1MDBfRkNfQk9PTF9BRERSKHgpCQkJCSh4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfRkNfSU5UX0FERFIoeCkJCQkJKHggPDwgOCkKKyMgICBkZWZpbmUgUjUwMF9GQ19KVU1QX0FERFIoeCkJCQkJKHggPDwgMTYpCisjICAgZGVmaW5lIFI1MDBfRkNfSlVNUF9HTE9CQUwJCQkJKDEgPDwgMzEpCisjZGVmaW5lIFI1MDBfVVNfRkNfQk9PTF9DT05TVAkJCQkweDQ2MjAKKyMgICBkZWZpbmUgUjUwMF9GQ19LQk9PTCh4KQkJCQkoeCkKKyNkZWZpbmUgUjUwMF9VU19GQ19DVFJMCQkJCQkweDQ2MjQKKyMgICBkZWZpbmUgUjUwMF9GQ19URVNUX0VOCQkJCSgxIDw8IDMwKQorIyAgIGRlZmluZSBSNTAwX0ZDX0ZVTExfRkNfRU4JCQkJKDEgPDwgMzEpCisjZGVmaW5lIFI1MDBfVVNfRkNfSU5TVF8wCQkJCTB4OTgwMAorIyAgIGRlZmluZSBSNTAwX0ZDX09QX0pVTVAJCQkJKDAgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9GQ19PUF9MT09QCQkJCSgxIDw8IDApCisjICAgZGVmaW5lIFI1MDBfRkNfT1BfRU5ETE9PUAkJCQkoMiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0ZDX09QX1JFUAkJCQkoMyA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0ZDX09QX0VORFJFUAkJCQkoNCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0ZDX09QX0JSRUFLTE9PUAkJCQkoNSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0ZDX09QX0JSRUFLUkVQCQkJCSg2IDw8IDApCisjICAgZGVmaW5lIFI1MDBfRkNfT1BfQ09OVElOVUUJCQkJKDcgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9GQ19CX0VMU0UJCQkJKDEgPDwgNCkKKyMgICBkZWZpbmUgUjUwMF9GQ19KVU1QX0FOWQkJCQkoMSA8PCA1KQorIyAgIGRlZmluZSBSNTAwX0ZDX0FfT1BfTk9ORQkJCQkoMCA8PCA2KQorIyAgIGRlZmluZSBSNTAwX0ZDX0FfT1BfUE9QCQkJCSgxIDw8IDYpCisjICAgZGVmaW5lIFI1MDBfRkNfQV9PUF9QVVNICQkJCSgyIDw8IDYpCisjICAgZGVmaW5lIFI1MDBfRkNfSlVNUF9GVU5DKHgpCQkJCSh4IDw8IDgpCisjICAgZGVmaW5lIFI1MDBfRkNfQl9QT1BfQ05UKHgpCQkJCSh4IDw8IDE2KQorIyAgIGRlZmluZSBSNTAwX0ZDX0JfT1AwX05PTkUJCQkJKDAgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfRkNfQl9PUDBfREVDUgkJCQkoMSA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9GQ19CX09QMF9JTkNSCQkJCSgyIDw8IDI0KQorIyAgIGRlZmluZSBSNTAwX0ZDX0JfT1AxX0RFQ1IJCQkJKDAgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfRkNfQl9PUDFfTk9ORQkJCQkoMSA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9GQ19CX09QMV9JTkNSCQkJCSgyIDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX0ZDX0lHTk9SRV9VTkNPVkVSRUQJCQkoMSA8PCAyOCkKKyNkZWZpbmUgUjUwMF9VU19GQ19JTlRfQ09OU1RfMAkJCQkweDRjMDAKKyMgICBkZWZpbmUgUjUwMF9GQ19JTlRfQ09OU1RfS1IoeCkJCQkoeCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0ZDX0lOVF9DT05TVF9LRyh4KQkJCSh4IDw8IDgpCisjICAgZGVmaW5lIFI1MDBfRkNfSU5UX0NPTlNUX0tCKHgpCQkJKHggPDwgMTYpCisvKiBfMCB0aHJvdWdoIF8xNSAqLworI2RlZmluZSBSNTAwX1VTX0ZPUk1BVDBfMAkJCQkweDQ2NDAKKyMgICBkZWZpbmUgUjUwMF9GT1JNQVRfVFhXSURUSCh4KQkJCSh4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfRk9STUFUX1RYSEVJR0hUKHgpCQkJKHggPDwgMTEpCisjICAgZGVmaW5lIFI1MDBfRk9STUFUX1RYREVQVEgoeCkJCQkoeCA8PCAyMikKKy8qIF8wIHRocm91Z2ggXzMgKi8KKyNkZWZpbmUgUjUwMF9VU19PVVRfRk1UXzAJCQkJMHg0NmE0CisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DNF84CQkJCSgwIDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DNF8xMAkJCQkoMSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQzRfMTBfR0FNTUEJCQkoMiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18xNgkJCQkoMyA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQzJfMTYJCQkJKDQgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9PVVRfRk1UX0M0XzE2CQkJCSg1IDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DXzE2X01QRUcJCQkoNiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQzJfMTZfTVBFRwkJCSg3IDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DMl80CQkJCSg4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DXzNfM18yCQkJCSg5IDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DXzZfNV82CQkJCSgxMCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18xMV8xMV8xMAkJCSgxMSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18xMF8xMV8xMQkJCSgxMiA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18yXzEwXzEwXzEwCQkJKDEzIDw8IDApCisvKiAjZGVmaW5lIFI1MDBfT1VUX0ZNVF9SRVNFUlZFRAkJCSgxNCA8PCAwKSAqLworIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfVU5VU0VECQkJCSgxNSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18xNl9GUAkJCQkoMTYgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9PVVRfRk1UX0MyXzE2X0ZQCQkJKDE3IDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DNF8xNl9GUAkJCSgxOCA8PCAwKQorIyAgIGRlZmluZSBSNTAwX09VVF9GTVRfQ18zMl9GUAkJCQkoMTkgPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9PVVRfRk1UX0MyXzMyX0ZQCQkJKDIwIDw8IDApCisjICAgZGVmaW5lIFI1MDBfT1VUX0ZNVF9DNF8zMl9GUAkJCSgyMSA8PCAwKQorIyAgIGRlZmluZSBSNTAwX0MwX1NFTF9BCQkJCSgwIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfQzBfU0VMX1IJCQkJKDEgPDwgOCkKKyMgICBkZWZpbmUgUjUwMF9DMF9TRUxfRwkJCQkoMiA8PCA4KQorIyAgIGRlZmluZSBSNTAwX0MwX1NFTF9CCQkJCSgzIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfQzFfU0VMX0EJCQkJKDAgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfQzFfU0VMX1IJCQkJKDEgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfQzFfU0VMX0cJCQkJKDIgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfQzFfU0VMX0IJCQkJKDMgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfQzJfU0VMX0EJCQkJKDAgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQzJfU0VMX1IJCQkJKDEgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQzJfU0VMX0cJCQkJKDIgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQzJfU0VMX0IJCQkJKDMgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfQzNfU0VMX0EJCQkJKDAgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQzNfU0VMX1IJCQkJKDEgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQzNfU0VMX0cJCQkJKDIgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfQzNfU0VMX0IJCQkJKDMgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfT1VUX1NJR04oeCkJCQkJKHggPDwgMTYpCisjICAgZGVmaW5lIFI1MDBfUk9VTkRfQURKCQkJCSgxIDw8IDIwKQorI2RlZmluZSBSNTAwX1VTX1BJWFNJWkUJCQkJCTB4NDYwNAorIyAgIGRlZmluZSBSNTAwX1BJWF9TSVpFKHgpCQkJCSh4KQorI2RlZmluZSBSNTAwX1VTX1RFWF9BRERSXzAJCQkJMHg5ODAwCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19BRERSKHgpCQkJCSh4IDw8IDApCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19BRERSX1JFTAkJCSgxIDw8IDcpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19TX1NXSVpfUgkJCSgwIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19TX1NXSVpfRwkJCSgxIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19TX1NXSVpfQgkJCSgyIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19TX1NXSVpfQQkJCSgzIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19UX1NXSVpfUgkJCSgwIDw8IDEwKQorIyAgIGRlZmluZSBSNTAwX1RFWF9TUkNfVF9TV0laX0cJCQkoMSA8PCAxMCkKKyMgICBkZWZpbmUgUjUwMF9URVhfU1JDX1RfU1dJWl9CCQkJKDIgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19UX1NXSVpfQQkJCSgzIDw8IDEwKQorIyAgIGRlZmluZSBSNTAwX1RFWF9TUkNfUl9TV0laX1IJCQkoMCA8PCAxMikKKyMgICBkZWZpbmUgUjUwMF9URVhfU1JDX1JfU1dJWl9HCQkJKDEgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19SX1NXSVpfQgkJCSgyIDw8IDEyKQorIyAgIGRlZmluZSBSNTAwX1RFWF9TUkNfUl9TV0laX0EJCQkoMyA8PCAxMikKKyMgICBkZWZpbmUgUjUwMF9URVhfU1JDX1FfU1dJWl9SCQkJKDAgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfVEVYX1NSQ19RX1NXSVpfRwkJCSgxIDw8IDE0KQorIyAgIGRlZmluZSBSNTAwX1RFWF9TUkNfUV9TV0laX0IJCQkoMiA8PCAxNCkKKyMgICBkZWZpbmUgUjUwMF9URVhfU1JDX1FfU1dJWl9BCQkJKDMgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9BRERSKHgpCQkJCSh4IDw8IDE2KQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfQUREUl9SRUwJCQkoMSA8PCAyMykKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX1JfU1dJWl9SCQkJKDAgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9SX1NXSVpfRwkJCSgxIDw8IDI0KQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfUl9TV0laX0IJCQkoMiA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX1JfU1dJWl9BCQkJKDMgPDwgMjQpCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9HX1NXSVpfUgkJCSgwIDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfR19TV0laX0cJCQkoMSA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX0dfU1dJWl9CCQkJKDIgPDwgMjYpCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9HX1NXSVpfQQkJCSgzIDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfQl9TV0laX1IJCQkoMCA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX0JfU1dJWl9HCQkJKDEgPDwgMjgpCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9CX1NXSVpfQgkJCSgyIDw8IDI4KQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfQl9TV0laX0EJCQkoMyA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX0FfU1dJWl9SCQkJKDAgPDwgMzApCisjICAgZGVmaW5lIFI1MDBfVEVYX0RTVF9BX1NXSVpfRwkJCSgxIDw8IDMwKQorIyAgIGRlZmluZSBSNTAwX1RFWF9EU1RfQV9TV0laX0IJCQkoMiA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9URVhfRFNUX0FfU1dJWl9BCQkJKDMgPDwgMzApCisjZGVmaW5lIFI1MDBfVVNfVEVYX0FERFJfRFhEWV8wCQkJCTB4YTAwMAorIyAgIGRlZmluZSBSNTAwX0RYX0FERFIoeCkJCQkJKHggPDwgMCkKKyMgICBkZWZpbmUgUjUwMF9EWF9BRERSX1JFTAkJCQkoMSA8PCA3KQorIyAgIGRlZmluZSBSNTAwX0RYX1NfU1dJWl9SCQkJCSgwIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfRFhfU19TV0laX0cJCQkJKDEgPDwgOCkKKyMgICBkZWZpbmUgUjUwMF9EWF9TX1NXSVpfQgkJCQkoMiA8PCA4KQorIyAgIGRlZmluZSBSNTAwX0RYX1NfU1dJWl9BCQkJCSgzIDw8IDgpCisjICAgZGVmaW5lIFI1MDBfRFhfVF9TV0laX1IJCQkJKDAgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfRFhfVF9TV0laX0cJCQkJKDEgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfRFhfVF9TV0laX0IJCQkJKDIgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfRFhfVF9TV0laX0EJCQkJKDMgPDwgMTApCisjICAgZGVmaW5lIFI1MDBfRFhfUl9TV0laX1IJCQkJKDAgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfRFhfUl9TV0laX0cJCQkJKDEgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfRFhfUl9TV0laX0IJCQkJKDIgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfRFhfUl9TV0laX0EJCQkJKDMgPDwgMTIpCisjICAgZGVmaW5lIFI1MDBfRFhfUV9TV0laX1IJCQkJKDAgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfRFhfUV9TV0laX0cJCQkJKDEgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfRFhfUV9TV0laX0IJCQkJKDIgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfRFhfUV9TV0laX0EJCQkJKDMgPDwgMTQpCisjICAgZGVmaW5lIFI1MDBfRFlfQUREUih4KQkJCQkoeCA8PCAxNikKKyMgICBkZWZpbmUgUjUwMF9EWV9BRERSX1JFTAkJCQkoMSA8PCAxNykKKyMgICBkZWZpbmUgUjUwMF9EWV9TX1NXSVpfUgkJCQkoMCA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9EWV9TX1NXSVpfRwkJCQkoMSA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9EWV9TX1NXSVpfQgkJCQkoMiA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9EWV9TX1NXSVpfQQkJCQkoMyA8PCAyNCkKKyMgICBkZWZpbmUgUjUwMF9EWV9UX1NXSVpfUgkJCQkoMCA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9EWV9UX1NXSVpfRwkJCQkoMSA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9EWV9UX1NXSVpfQgkJCQkoMiA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9EWV9UX1NXSVpfQQkJCQkoMyA8PCAyNikKKyMgICBkZWZpbmUgUjUwMF9EWV9SX1NXSVpfUgkJCQkoMCA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9EWV9SX1NXSVpfRwkJCQkoMSA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9EWV9SX1NXSVpfQgkJCQkoMiA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9EWV9SX1NXSVpfQQkJCQkoMyA8PCAyOCkKKyMgICBkZWZpbmUgUjUwMF9EWV9RX1NXSVpfUgkJCQkoMCA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9EWV9RX1NXSVpfRwkJCQkoMSA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9EWV9RX1NXSVpfQgkJCQkoMiA8PCAzMCkKKyMgICBkZWZpbmUgUjUwMF9EWV9RX1NXSVpfQQkJCQkoMyA8PCAzMCkKKyNkZWZpbmUgUjUwMF9VU19URVhfSU5TVF8wCQkJCTB4OTAwMAorIyAgIGRlZmluZSBSNTAwX1RFWF9JRCh4KQkJCQkoeCA8PCAxNikKKyMgICBkZWZpbmUgUjUwMF9URVhfSU5TVF9OT1AJCQkJKDAgPDwgMjIpCisjICAgZGVmaW5lIFI1MDBfVEVYX0lOU1RfTEQJCQkJKDEgPDwgMjIpCisjICAgZGVmaW5lIFI1MDBfVEVYX0lOU1RfVEVYS0lMTAkJCSgyIDw8IDIyKQorIyAgIGRlZmluZSBSNTAwX1RFWF9JTlNUX1BST0oJCQkJKDMgPDwgMjIpCisjICAgZGVmaW5lIFI1MDBfVEVYX0lOU1RfTE9EQklBUwkJCSg0IDw8IDIyKQorIyAgIGRlZmluZSBSNTAwX1RFWF9JTlNUX0xPRAkJCQkoNSA8PCAyMikKKyMgICBkZWZpbmUgUjUwMF9URVhfSU5TVF9EWERZCQkJCSg2IDw8IDIyKQorIyAgIGRlZmluZSBSNTAwX1RFWF9TRU1fQUNRVUlSRQkJCQkoMSA8PCAyNSkKKyMgICBkZWZpbmUgUjUwMF9URVhfSUdOT1JFX1VOQ09WRVJFRAkJCSgxIDw8IDI2KQorIyAgIGRlZmluZSBSNTAwX1RFWF9VTlNDQUxFRAkJCQkoMSA8PCAyNykKKyNkZWZpbmUgUjMwMF9VU19XX0ZNVAkJCQkJMHg0NmI0CisjICAgZGVmaW5lIFIzMDBfV19GTVRfVzAJCQkJKDAgPDwgMCkKKyMgICBkZWZpbmUgUjMwMF9XX0ZNVF9XMjQJCQkJKDEgPDwgMCkKKyMgICBkZWZpbmUgUjMwMF9XX0ZNVF9XMjRGUAkJCQkoMiA8PCAwKQorIyAgIGRlZmluZSBSMzAwX1dfU1JDX1VTCQkJCSgwIDw8IDIpCisjICAgZGVmaW5lIFIzMDBfV19TUkNfUkFTCQkJCSgxIDw8IDIpCisKKwogLyogRHJhdyBhIHByaW1pdGl2ZSBmcm9tIHZlcnRleCBkYXRhIGluIGFycmF5cyBsb2FkZWQgdmlhIDNEX0xPQURfVkJQTlRSLgogICogVHdvIHBhcmFtZXRlciBkd29yZHM6Ci0gKiAwLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGFwcGVhcnMgdG8gYmUgYWx3YXlzIDAKLSAqIDEuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorICogMC4gVkFQX1ZUWF9GTVQ6IFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgbm90IHdyaXR0ZW4gdG8gaGFyZHdhcmUKKyAqIDEuIFZBUF9WRl9DVEw6IFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgogICovCiAjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9EUkFXX1ZCVUYgICAgICAgICAgIDB4MDAwMDI4MDAKIAorLyogRHJhdyBhIHByaW1pdGl2ZSBmcm9tIGltbWVkaWF0ZSB2ZXJ0aWNlcyBpbiB0aGlzIHBhY2tldAorICogVXAgdG8gMTYzODIgZHdvcmRzOgorICogMC4gVkFQX1ZUWF9GTVQ6IFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgbm90IHdyaXR0ZW4gdG8gaGFyZHdhcmUKKyAqIDEuIFZBUF9WRl9DVEw6IFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorICogMiB0byBlbmQ6IFVwIHRvIDE2MzgwIGR3b3JkcyBvZiB2ZXJ0ZXggZGF0YS4KKyAqLworI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTU1EICAgICAgICAgICAweDAwMDAyOTAwCisKKy8qIERyYXcgYSBwcmltaXRpdmUgZnJvbSB2ZXJ0ZXggZGF0YSBpbiBhcnJheXMgbG9hZGVkIHZpYSAzRF9MT0FEX1ZCUE5UUiBhbmQKKyAqIGltbWVkaWF0ZSB2ZXJ0aWNlcyBpbiB0aGlzIHBhY2tldAorICogVXAgdG8gMTYzODIgZHdvcmRzOgorICogMC4gVkFQX1ZUWF9GTVQ6IFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgbm90IHdyaXR0ZW4gdG8gaGFyZHdhcmUKKyAqIDEuIFZBUF9WRl9DVEw6IFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorICogMiB0byBlbmQ6IFVwIHRvIDE2MzgwIGR3b3JkcyBvZiB2ZXJ0ZXggZGF0YS4KKyAqLworI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTkRYICAgICAgICAgICAweDAwMDAyQTAwCisKKwogLyogU3BlY2lmeSB0aGUgZnVsbCBzZXQgb2YgdmVydGV4IGFycmF5cyBhcyAoYWRkcmVzcywgc3RyaWRlKS4KICAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiB2ZXJ0ZXggYXJyYXlzIHNwZWNpZmllZC4KICAqIFRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGxpc3Qgb2YgYmxvY2tzLCB3aGVyZQpAQCAtMTYyOCw5ICszMjA0LDI5IEBACiAjICAgIGRlZmluZSBSMzAwX0VCX1VOSzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMjQKICMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMSAgICAgICAgICAgICAgICAgICAgKDB4ODA8PDI0KQogIyAgICBkZWZpbmUgUjMwMF9FQl9VTksyICAgICAgICAgICAgICAgICAgICAgICAgMHgwODEwCisKKy8qIFNhbWUgYXMgUjMwMF9QQUNLRVQzXzNEX0RSQVdfVkJVRiBidXQgd2l0aG91dCBWQVBfVlRYX0ZNVCAqLwogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19WQlVGXzIgICAgICAgICAweDAwMDAzNDAwCisvKiBTYW1lIGFzIFIzMDBfUEFDS0VUM18zRF9EUkFXX0lNTUQgYnV0IHdpdGhvdXQgVkFQX1ZUWF9GTVQgKi8KKyNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfSU1NRF8yICAgICAgICAgMHgwMDAwMzUwMAorLyogU2FtZSBhcyBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTkRYIGJ1dCB3aXRob3V0IFZBUF9WVFhfRk1UICovCiAjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9EUkFXX0lORFhfMiAgICAgICAgIDB4MDAwMDM2MDAKIAorLyogQ2xlYXJzIGEgcG9ydGlvbiBvZiBoaWVyYWNoaWNhbCBaIFJBTQorICogMyBkd29yZCBwYXJhbWV0ZXJzCisgKiAwLiBTVEFSVAorICogMS4gQ09VTlQ6IDEzOjAgKG1heCBpcyAweDNGRkYpCisgKiAyLiBDTEVBUl9WQUxVRTogVmFsdWUgdG8gd3JpdGUgaW50byBISVogUkFNLgorICovCisjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9DTEVBUl9ISVogICAgICAgICAgIDB4MDAwMDM3MDAKKworLyogRHJhd3MgYSBzZXQgb2YgcHJpbWl0aXZlcyB1c2luZyB2ZXJ0ZXggYnVmZmVycyBwb2ludGVkIGJ5IHRoZSBzdGF0ZSBkYXRhLgorICogQXQgbGVhc3QgMiBQYXJhbWV0ZXJzOgorICogMC4gVkFQX1ZGX0NOVEw6IFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBzdGFuZGFyZCBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuCisgKiAyIHRvIGVuZDogRGF0YSBvciBpbmRpY2VzIChzZWUgb3RoZXIgM0RfRFJBV18qIHBhY2tldHMgZm9yIGRldGFpbHMpCisgKi8KKyNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfMTI4ICAgICAgICAgICAgMHgwMDAwMzkwMAorCiAvKiBFTkQ6IFBhY2tldCAzIGNvbW1hbmRzICovCiAKIApAQCAtMTY1MiwzICszMjQ4LDUgQEAKICNlbmRpZiAvKiBfUjMwMF9SRUdfSCAqLwogCiAvKiAqSU5ERU5ULU9OKiAqLworCisvKiB2aW06IHNldCBmb2xkZW5hYmxlIGZvbGRtYXJrZXI9XFx7LFxcfSBmb2xkbWV0aG9kPW1hcmtlciA6ICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfcmVuZGVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfcmVuZGVyLmMKaW5kZXggYzgwOTY3OS4uMGExOTllNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3JlbmRlci5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9yZW5kZXIuYwpAQCAtNzQsNiArNzQsNyBAQAogI2luY2x1ZGUgInIzMDBfcmVnLmgiCiAjaW5jbHVkZSAicjMwMF90ZXguaCIKICNpbmNsdWRlICJyMzAwX2VtaXQuaCIKKyNpbmNsdWRlICJyMzAwX2ZyYWdwcm9nLmgiCiBleHRlcm4gaW50IGZ1dHVyZV9od190Y2xfb247CiAKIC8qKgpAQCAtMjY4LDEzICsyNjksMjQgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHZiLT5FbHRzKSB7Ci0JCXIzMDBFbWl0QU9TKHJtZXNhLCBybWVzYS0+c3RhdGUuYW9zX2NvdW50LCBzdGFydCk7CiAJCWlmIChudW1fdmVydHMgPiA2NTUzNSkgewogCQkJLyogbm90IGltcGxlbWVudGVkIHlldCAqLwogCQkJV0FSTl9PTkNFKCJUb28gbWFueSBlbHRzXG4iKTsKIAkJCXJldHVybjsKIAkJfQorCQkvKiBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGluY29ycmVjdCwgYnV0IGl0J3MgdGhlIGJlc3QgSSBjYW4gZG8KKwkJICogd2l0aG91dCBhIG1ham9yIHJlZmFjdG9yaW5nIG9mIGhvdyBETUEgbWVtb3J5IGlzIGhhbmRsZWQuCisJCSAqIFRoZSBwcm9ibGVtOiBFbnN1cmluZyB0aGF0IGJvdGggdmVydGV4IGFycmF5cyAqYW5kKiBpbmRleAorCQkgKiBhcnJheXMgYXJlIGF0IHRoZSByaWdodCBwb3NpdGlvbiwgYW5kIHRoZW4gZW5zdXJpbmcgdGhhdAorCQkgKiB0aGUgTE9BRF9WQlBOVFIsIERSQVdfSU5EWCBhbmQgSU5EWF9CVUZGRVIgcGFja2V0cyBhcmUgZW1pdHRlZAorCQkgKiBhdCBvbmNlLgorCQkgKgorCQkgKiBTbyB3aHkgaXMgdGhlIGZvbGxvd2luZyBpbmNvcnJlY3Q/IFdlbGwsIGl0IHNlZW1zIGxpa2UKKwkJICogYWxsb2NhdGluZyB0aGUgaW5kZXggYXJyYXkgbWlnaHQgYWN0dWFsbHkgZXZpY3QgdGhlIHZlcnRleAorCQkgKiBhcnJheXMuICpzaWdoKgorCQkgKi8KIAkJcjMwMEVtaXRFbHRzKGN0eCwgdmItPkVsdHMsIG51bV92ZXJ0cyk7CisJCXIzMDBFbWl0QU9TKHJtZXNhLCBybWVzYS0+c3RhdGUuYW9zX2NvdW50LCBzdGFydCk7CiAJCXIzMDBGaXJlRUIocm1lc2EsIHJtZXNhLT5zdGF0ZS5lbHRfZG1hLmFvc19vZmZzZXQsIG51bV92ZXJ0cywgdHlwZSk7CiAJfSBlbHNlIHsKIAkJcjMwMEVtaXRBT1Mocm1lc2EsIHJtZXNhLT5zdGF0ZS5hb3NfY291bnQsIHN0YXJ0KTsKQEAgLTMzNCwxMyArMzQ2LDI2IEBACiBzdGF0aWMgaW50IHIzMDBGYWxsYmFjayhHTGNvbnRleHQgKiBjdHgpCiB7CiAJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOwotCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKikKKwkvKiBEbyB3ZSBuZWVkIHRvIHVzZSBuZXctc3R5bGUgc2hhZGVycz8KKwkgKiBBbHNvIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzPyAqLworCWlmIChyMzAwLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkgeworCQlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtICpmcCA9IChzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtICopCiAJICAgIChjaGFyICopY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQ7Ci0KLQlpZiAoZnApIHsKLQkJaWYgKCFmcC0+dHJhbnNsYXRlZCkKLQkJCXIzMDBUcmFuc2xhdGVGcmFnbWVudFNoYWRlcihyMzAwLCBmcCk7Ci0JCUZBTExCQUNLX0lGKCFmcC0+dHJhbnNsYXRlZCk7CisJCWlmIChmcCkgeworCQkJaWYgKCFmcC0+dHJhbnNsYXRlZCkgeworCQkJCXI1MDBUcmFuc2xhdGVGcmFnbWVudFNoYWRlcihyMzAwLCBmcCk7CisJCQkJRkFMTEJBQ0tfSUYoIWZwLT50cmFuc2xhdGVkKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKikKKwkgICAgKGNoYXIgKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKwkJaWYgKGZwKSB7CisJCQlpZiAoIWZwLT50cmFuc2xhdGVkKSB7CisJCQkJcjMwMFRyYW5zbGF0ZUZyYWdtZW50U2hhZGVyKHIzMDAsIGZwKTsKKwkJCQlGQUxMQkFDS19JRighZnAtPnRyYW5zbGF0ZWQpOworCQkJfQorCQl9CiAJfQogCiAJRkFMTEJBQ0tfSUYoY3R4LT5SZW5kZXJNb2RlICE9IEdMX1JFTkRFUik7CkBAIC0zNTIsOCArMzc3LDYgQEAKIAkJCXx8IGN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMF0gIT0KIAkJCWN0eC0+U3RlbmNpbC5Xcml0ZU1hc2tbMV0pKTsKIAotCUZBTExCQUNLX0lGKGN0eC0+Q29sb3IuQ29sb3JMb2dpY09wRW5hYmxlZCk7Ci0KIAlpZiAoY3R4LT5FeHRlbnNpb25zLk5WX3BvaW50X3Nwcml0ZSB8fCBjdHgtPkV4dGVuc2lvbnMuQVJCX3BvaW50X3Nwcml0ZSkKIAkJRkFMTEJBQ0tfSUYoY3R4LT5Qb2ludC5Qb2ludFNwcml0ZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zaGFkZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zaGFkZXIuYwppbmRleCA1ZjVhYzdjLi5mMzBmZDk4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfc2hhZGVyLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3NoYWRlci5jCkBAIC0xLDggKzEsNyBAQAotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAibWFjcm9zLmgiCi0jaW5jbHVkZSAiZW51bXMuaCIKIAotI2luY2x1ZGUgInByb2dyYW0uaCIKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ3JhbS5oIgogI2luY2x1ZGUgInRubC90bmwuaCIKICNpbmNsdWRlICJyMzAwX2NvbnRleHQuaCIKICNpbmNsdWRlICJyMzAwX2ZyYWdwcm9nLmgiCkBAIC0xMCw4ICs5LDEwIEBACiBzdGF0aWMgc3RydWN0IGdsX3Byb2dyYW0gKnIzMDBOZXdQcm9ncmFtKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwKIAkJCQkJIEdMdWludCBpZCkKIHsKKwlyMzAwQ29udGV4dFB0ciBybWVzYSA9IFIzMDBfQ09OVEVYVChjdHgpOwogCXN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtX2NvbnQgKnZwOwotCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwOworCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKnIzMDBfZnA7CisJc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbSAqcjUwMF9mcDsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBHTF9WRVJURVhfU1RBVEVfUFJPR1JBTV9OVjoKQEAgLTIwLDE0ICsyMSwyNyBAQAogCQlyZXR1cm4gX21lc2FfaW5pdF92ZXJ0ZXhfcHJvZ3JhbShjdHgsICZ2cC0+bWVzYV9wcm9ncmFtLAogCQkJCQkJIHRhcmdldCwgaWQpOwogCWNhc2UgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkI6Ci0JCWZwID0gQ0FMTE9DX1NUUlVDVChyMzAwX2ZyYWdtZW50X3Byb2dyYW0pOwotCQlmcC0+Y3R4ID0gY3R4OwotCQlyZXR1cm4gX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKGN0eCwgJmZwLT5tZXNhX3Byb2dyYW0sCi0JCQkJCQkgICB0YXJnZXQsIGlkKTsKKwkJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkgeworCQkJcjUwMF9mcCA9IENBTExPQ19TVFJVQ1QocjUwMF9mcmFnbWVudF9wcm9ncmFtKTsKKwkJCXI1MDBfZnAtPmN0eCA9IGN0eDsKKwkJCXJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LCAmcjUwMF9mcC0+bWVzYV9wcm9ncmFtLAorCQkJCQkJCSAgIHRhcmdldCwgaWQpOworCQl9IGVsc2UgeworCQkJcjMwMF9mcCA9IENBTExPQ19TVFJVQ1QocjMwMF9mcmFnbWVudF9wcm9ncmFtKTsKKwkJCXJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LCAmcjMwMF9mcC0+bWVzYV9wcm9ncmFtLAorCQkJCQkJCSAgIHRhcmdldCwgaWQpOworCQl9CisKIAljYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlY6Ci0JCWZwID0gQ0FMTE9DX1NUUlVDVChyMzAwX2ZyYWdtZW50X3Byb2dyYW0pOwotCQlyZXR1cm4gX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKGN0eCwgJmZwLT5tZXNhX3Byb2dyYW0sCi0JCQkJCQkgICB0YXJnZXQsIGlkKTsKKwkJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkgeworCQkJcjUwMF9mcCA9IENBTExPQ19TVFJVQ1QocjUwMF9mcmFnbWVudF9wcm9ncmFtKTsKKwkJCXJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LCAmcjUwMF9mcC0+bWVzYV9wcm9ncmFtLAorCQkJCQkJCSAgIHRhcmdldCwgaWQpOworCQl9IGVsc2UgeworCQkJcjMwMF9mcCA9IENBTExPQ19TVFJVQ1QocjMwMF9mcmFnbWVudF9wcm9ncmFtKTsKKwkJCXJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LCAmcjMwMF9mcC0+bWVzYV9wcm9ncmFtLAorCQkJCQkJCSAgIHRhcmdldCwgaWQpOworCQl9CiAJZGVmYXVsdDoKIAkJX21lc2FfcHJvYmxlbShjdHgsICJCYWQgdGFyZ2V0IGluIHIzMDBOZXdQcm9ncmFtIik7CiAJfQpAQCAtNDMsMTUgKzU3LDIwIEBACiBzdGF0aWMgdm9pZAogcjMwMFByb2dyYW1TdHJpbmdOb3RpZnkoR0xjb250ZXh0ICogY3R4LCBHTGVudW0gdGFyZ2V0LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKIHsKKwlyMzAwQ29udGV4dFB0ciBybWVzYSA9IFIzMDBfQ09OVEVYVChjdHgpOwogCXN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtX2NvbnQgKnZwID0gKHZvaWQgKilwcm9nOwotCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKilwcm9nOworCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKnIzMDBfZnAgPSAoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqKXByb2c7CisJc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbSAqcjUwMF9mcCA9IChzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtICopcHJvZzsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6CiAJCXZwLT5wcm9ncyA9IE5VTEw7CiAJCWJyZWFrOwogCWNhc2UgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkI6Ci0JCWZwLT50cmFuc2xhdGVkID0gR0xfRkFMU0U7CisJCWlmIChybWVzYS0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPj0gQ0hJUF9GQU1JTFlfUlY1MTUpCisJCQlyNTAwX2ZwLT50cmFuc2xhdGVkID0gR0xfRkFMU0U7CisJCWVsc2UKKwkJCXIzMDBfZnAtPnRyYW5zbGF0ZWQgPSBHTF9GQUxTRTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zdGF0ZS5jCmluZGV4IDA4ODIxNmMuLjE1Y2QwNTMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zdGF0ZS5jCkBAIC03MCwyMCArNzAsMjggQEAKIAogc3RhdGljIHZvaWQgcjMwMEJsZW5kQ29sb3IoR0xjb250ZXh0ICogY3R4LCBjb25zdCBHTGZsb2F0IGNmWzRdKQogewotCUdMdWJ5dGUgY29sb3JbNF07CiAJcjMwMENvbnRleHRQdHIgcm1lc2EgPSBSMzAwX0NPTlRFWFQoY3R4KTsKIAogCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIGJsZW5kX2NvbG9yKTsKIAotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY29sb3JbMF0sIGNmWzBdKTsKLQlDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGNvbG9yWzFdLCBjZlsxXSk7Ci0JQ0xBTVBFRF9GTE9BVF9UT19VQllURShjb2xvclsyXSwgY2ZbMl0pOwotCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY29sb3JbM10sIGNmWzNdKTsKKwlpZiAocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID49IENISVBfRkFNSUxZX1JWNTE1KSB7CisJCUdMdWludCByID0gSVJPVU5EKGNmWzBdKjEwMjMuMGYpOworCQlHTHVpbnQgZyA9IElST1VORChjZlsxXSoxMDIzLjBmKTsKKwkJR0x1aW50IGIgPSBJUk9VTkQoY2ZbMl0qMTAyMy4wZik7CisJCUdMdWludCBhID0gSVJPVU5EKGNmWzNdKjEwMjMuMGYpOwogCi0Jcm1lc2EtPmh3LmJsZW5kX2NvbG9yLmNtZFsxXSA9IFBBQ0tfQ09MT1JfODg4OChjb2xvclszXSwgY29sb3JbMF0sCi0JCQkJCQkgICAgICAgY29sb3JbMV0sIGNvbG9yWzJdKTsKLQlybWVzYS0+aHcuYmxlbmRfY29sb3IuY21kWzJdID0gMDsKLQlybWVzYS0+aHcuYmxlbmRfY29sb3IuY21kWzNdID0gMDsKKwkJcm1lc2EtPmh3LmJsZW5kX2NvbG9yLmNtZFsxXSA9IHIgfCAoYSA8PCAxNik7CisJCXJtZXNhLT5ody5ibGVuZF9jb2xvci5jbWRbMl0gPSBiIHwgKGcgPDwgMTYpOworCX0gZWxzZSB7CisJCUdMdWJ5dGUgY29sb3JbNF07CisJCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY29sb3JbMF0sIGNmWzBdKTsKKwkJQ0xBTVBFRF9GTE9BVF9UT19VQllURShjb2xvclsxXSwgY2ZbMV0pOworCQlDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKGNvbG9yWzJdLCBjZlsyXSk7CisJCUNMQU1QRURfRkxPQVRfVE9fVUJZVEUoY29sb3JbM10sIGNmWzNdKTsKKworCQlybWVzYS0+aHcuYmxlbmRfY29sb3IuY21kWzFdID0gUEFDS19DT0xPUl84ODg4KGNvbG9yWzNdLCBjb2xvclswXSwKKwkJCQkJCQljb2xvclsxXSwgY29sb3JbMl0pOworCX0KIH0KIAogLyoqCkBAIC0xODksNyArMTk3LDcgQEAKIAkgKi8KICNpZiAwCiAJaWYgKG5ld19hYmxlbmQgPT0gbmV3X2NibGVuZCkgewotCQluZXdfY2JsZW5kIHw9IFIzMDBfQkxFTkRfTk9fU0VQQVJBVEU7CisJCW5ld19jYmxlbmQgfD0gUjMwMF9ESVNDQVJEX1NSQ19QSVhFTFNfU1JDX0FMUEhBXzA7CiAJfQogI2VuZGlmCiAJbmV3X2NibGVuZCB8PSBjYml0czsKQEAgLTI5NSw3ICszMDMsOSBAQAogCiAJcjMwMFNldEJsZW5kQ250bChyMzAwLAogCQkJIGZ1bmMsIGVxbiwKLQkJCSBSMzAwX0JMRU5EX1VOS05PV04gfCBSMzAwX0JMRU5EX0VOQUJMRSwgZnVuY0EsIGVxbkEpOworCQkJIChSMzAwX1NFUEFSQVRFX0FMUEhBX0VOQUJMRSB8CisJCQkgIFIzMDBfUkVBRF9FTkFCTEUgfAorCQkJICBSMzAwX0FMUEhBX0JMRU5EX0VOQUJMRSksIGZ1bmNBLCBlcW5BKTsKIH0KIAogc3RhdGljIHZvaWQgcjMwMEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGNvbnRleHQgKiBjdHgsCkBAIC0zMTIsNiArMzIyLDgzIEBACiB9CiAKIC8qKgorICogVHJhbnNsYXRlIExvZ2ljT3AgZW51bXMgaW50byBoYXJkd2FyZSByZXByZXNlbnRhdGlvbi4KKyAqIEJvdGggdXNlIGEgdmVyeSBsb2dpY2FsIGJpdC13aXNlIGxheW91dCwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIG9yZGVyCisgKiBvZiBiaXRzIGlzIHJldmVyc2VkLgorICovCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9sb2dpY29wKEdMZW51bSBsb2dpY29wKQoreworCUdMdWludCBiaXRzID0gbG9naWNvcCAtIEdMX0NMRUFSOworCWJpdHMgPSAoKGJpdHMgJiAxKSA8PCAzKSB8ICgoYml0cyAmIDIpIDw8IDEpIHwgKChiaXRzICYgNCkgPj4gMSkgfCAoKGJpdHMgJiA4KSA+PiAzKTsKKwlyZXR1cm4gYml0cyA8PCBSMzAwX1JCM0RfUk9QQ05UTF9ST1BfU0hJRlQ7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5IHRvIHVwZGF0ZSB0aGUgcjMwMC0+aHcgaGFyZHdhcmUgc3RhdGUgdG8gbWF0Y2ggdGhlCisgKiBjdXJyZW50IE9wZW5HTCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgcjMwMFNldExvZ2ljT3BTdGF0ZShHTGNvbnRleHQgKmN0eCkKK3sKKwlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CisJUjMwMF9TVEFURUNIQU5HRShyMzAwLCByb3ApOworCWlmIChSR0JBX0xPR0lDT1BfRU5BQkxFRChjdHgpKSB7CisJCXIzMDAtPmh3LnJvcC5jbWRbMV0gPSBSMzAwX1JCM0RfUk9QQ05UTF9ST1BfRU5BQkxFIHwKKwkJCXRyYW5zbGF0ZV9sb2dpY29wKGN0eC0+Q29sb3IuTG9naWNPcCk7CisJfSBlbHNlIHsKKwkJcjMwMC0+aHcucm9wLmNtZFsxXSA9IDA7CisJfQorfQorCisvKioKKyAqIENhbGxlZCBieSBNZXNhIHdoZW4gYW4gYXBwbGljYXRpb24gcHJvZ3JhbSBjaGFuZ2VzIHRoZSBMb2dpY09wIHN0YXRlCisgKiB2aWEgZ2xMb2dpY09wLgorICovCitzdGF0aWMgdm9pZCByMzAwTG9naWNPcGNvZGUoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBsb2dpY29wKQoreworCWlmIChSR0JBX0xPR0lDT1BfRU5BQkxFRChjdHgpKQorCQlyMzAwU2V0TG9naWNPcFN0YXRlKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIHIzMDBDbGlwUGxhbmUoIEdMY29udGV4dCAqY3R4LCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxICkKK3sKKwlyMzAwQ29udGV4dFB0ciBybWVzYSA9IFIzMDBfQ09OVEVYVChjdHgpOworCUdMaW50IHA7CisJR0xpbnQgKmlwOworCisJLyogbm8gVkFQIFVDUCBvbiBub24tVENMIGNoaXBzZXRzICovCisJaWYgKCEocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmxhZ3MgJiBSQURFT05fQ0hJUFNFVF9UQ0wpKQorCQkJcmV0dXJuOworCisJcCA9IChHTGludCkgcGxhbmUgLSAoR0xpbnQpIEdMX0NMSVBfUExBTkUwOworCWlwID0gKEdMaW50ICopY3R4LT5UcmFuc2Zvcm0uX0NsaXBVc2VyUGxhbmVbcF07CisKKwlSMzAwX1NUQVRFQ0hBTkdFKCBybWVzYSwgdnB1Y3BbcF0gKTsKKwlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfWF0gPSBpcFswXTsKKwlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfWV0gPSBpcFsxXTsKKwlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfWl0gPSBpcFsyXTsKKwlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfV10gPSBpcFszXTsKK30KKworc3RhdGljIHZvaWQgcjMwMFNldENsaXBQbGFuZVN0YXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQoreworCXIzMDBDb250ZXh0UHRyIHIzMDAgPSBSMzAwX0NPTlRFWFQoY3R4KTsKKwlHTHVpbnQgcDsKKworCS8qIG5vIFZBUCBVQ1Agb24gbm9uLVRDTCBjaGlwc2V0cyAqLworCWlmICghKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmxhZ3MgJiBSQURFT05fQ0hJUFNFVF9UQ0wpKQorCQlyZXR1cm47CisKKwlwID0gY2FwIC0gR0xfQ0xJUF9QTEFORTA7CisJUjMwMF9TVEFURUNIQU5HRShyMzAwLCB2YXBfY2xpcF9jbnRsKTsKKwlpZiAoc3RhdGUpIHsKKwkJcjMwMC0+aHcudmFwX2NsaXBfY250bC5jbWRbMV0gfD0gKFIzMDBfVkFQX1VDUF9FTkFCTEVfMCA8PCBwKTsKKwkJcjMwMENsaXBQbGFuZShjdHgsIGNhcCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJcjMwMC0+aHcudmFwX2NsaXBfY250bC5jbWRbMV0gJj0gfihSMzAwX1ZBUF9VQ1BfRU5BQkxFXzAgPDwgcCk7CisJfQorfQorCisvKioKICAqIFVwZGF0ZSBvdXIgdHJhY2tlZCBjdWxsaW5nIHN0YXRlIGJhc2VkIG9uIE1lc2EncyBzdGF0ZS4KICAqLwogc3RhdGljIHZvaWQgcjMwMFVwZGF0ZUN1bGxpbmcoR0xjb250ZXh0ICogY3R4KQpAQCAtMzUwLDQ0ICs0MzcsNTIgQEAKIAlyMzAwLT5ody5jdWwuY21kW1IzMDBfQ1VMX0NVTExdID0gdmFsOwogfQogCi1zdGF0aWMgdm9pZCByMzAwU2V0RWFybHlaU3RhdGUoR0xjb250ZXh0ICogY3R4KQorc3RhdGljIHZvaWQgcjMwMFNldFBvbHlnb25PZmZzZXRTdGF0ZShHTGNvbnRleHQgKiBjdHgsIEdMYm9vbGVhbiBzdGF0ZSkKIHsKLQkvKiB1cGRhdGVzIHJlZ2lzdGVyIFIzMDBfUkIzRF9FQVJMWV9aICgweDRGMTQpCi0JICAgaWYgZGVwdGggdGVzdCBpcyBub3QgZW5hYmxlZCBpdCBzaG91bGQgYmUgUjMwMF9FQVJMWV9aX0RJU0FCTEUKLQkgICBpZiBkZXB0aCBpcyBlbmFibGVkIGFuZCBhbHBoYSBub3QgaXQgc2hvdWxkIGJlIFIzMDBfRUFSTFlfWl9FTkFCTEUKLQkgICBpZiBkZXB0aCBhbmQgYWxwaGEgaXMgZW5hYmxlZCBpdCBzaG91bGQgYmUgUjMwMF9FQVJMWV9aX0RJU0FCTEUKLQkgKi8KIAlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CiAKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHpzdGVuY2lsX2Zvcm1hdCk7Ci0Jc3dpdGNoIChjdHgtPlZpc3VhbC5kZXB0aEJpdHMpIHsKLQljYXNlIDE2OgotCQlyMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzFdID0gUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1o7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbMV0gPSBSMzAwX0RFUFRIX0ZPUk1BVF8yNEJJVF9JTlRfWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5zdXBwb3J0ZWQgZGVwdGggJWQuLi4gZXhpdGluZ1xuIiwgY3R4LT5WaXN1YWwuZGVwdGhCaXRzKTsKLQkJX21lc2FfZXhpdCgtMSk7CisJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBvY2NsdXNpb25fY250bCk7CisJaWYgKHN0YXRlKSB7CisJCXIzMDAtPmh3Lm9jY2x1c2lvbl9jbnRsLmNtZFsxXSB8PSAoMyA8PCAwKTsKKwl9IGVsc2UgeworCQlyMzAwLT5ody5vY2NsdXNpb25fY250bC5jbWRbMV0gJj0gfigzIDw8IDApOwogCX0KK30KIAotCS8vIHIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbMV0gfD0gUjMwMF9ERVBUSF9GT1JNQVRfVU5LMzI7CitzdGF0aWMgR0xib29sZWFuIGN1cnJlbnRfZnJhZ21lbnRfcHJvZ3JhbV93cml0ZXNfZGVwdGgoR0xjb250ZXh0KiBjdHgpCit7CisJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOworCisJaWYgKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5IDwgQ0hJUF9GQU1JTFlfUlY1MTUpIHsKKwkJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqKQorCQkJKGNoYXIgKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKwkJcmV0dXJuIChmcCAmJiBmcC0+V3JpdGVzRGVwdGgpOworCX0gZWxzZSB7CisJCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0qIGZwID0KKwkJCShzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtKikoY2hhciopCisJCQljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKwkJcmV0dXJuIChmcCAmJiBmcC0+d3JpdGVzX2RlcHRoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHIzMDBTZXRFYXJseVpTdGF0ZShHTGNvbnRleHQgKiBjdHgpCit7CisJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOworCUdMdWludCB0b3BaID0gUjMwMF9aVE9QX0VOQUJMRTsKIAogCWlmIChjdHgtPkNvbG9yLkFscGhhRW5hYmxlZCAmJiBjdHgtPkNvbG9yLkFscGhhRnVuYyAhPSBHTF9BTFdBWVMpCi0JCS8qIGRpc2FibGUgZWFybHkgWiAqLwotCQlyMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzJdID0gUjMwMF9FQVJMWV9aX0RJU0FCTEU7Ci0JZWxzZSB7Ci0JCWlmIChjdHgtPkRlcHRoLlRlc3QgJiYgY3R4LT5EZXB0aC5GdW5jICE9IEdMX05FVkVSKQotCQkJLyogZW5hYmxlIGVhcmx5IFogKi8KLQkJCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbMl0gPSBSMzAwX0VBUkxZX1pfRU5BQkxFOwotCQllbHNlCi0JCQkvKiBkaXNhYmxlIGVhcmx5IFogKi8KLQkJCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbMl0gPSBSMzAwX0VBUkxZX1pfRElTQUJMRTsKLQl9CisJCXRvcFogPSBSMzAwX1pUT1BfRElTQUJMRTsKKwlpZiAoY3VycmVudF9mcmFnbWVudF9wcm9ncmFtX3dyaXRlc19kZXB0aChjdHgpKQorCQl0b3BaID0gUjMwMF9aVE9QX0RJU0FCTEU7CiAKLQlyMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzNdID0gMHgwMDAwMDAwMzsKLQlyMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzRdID0gMHgwMDAwMDAwMDsKKwlpZiAodG9wWiAhPSByMzAwLT5ody56c3RlbmNpbF9mb3JtYXQuY21kWzJdKSB7CisJCS8qIE5vdGU6IFRoaXMgY29tcGxldGVseSByZWVtaXRzIHRoZSBzdGVuY2lsIGZvcm1hdC4KKwkJICogSSBoYXZlIG5vdCB0ZXN0ZWQgd2hldGhlciB0aGlzIGlzIHN0cmljdGx5IG5lY2Vzc2FyeSwKKwkJICogb3IgaWYgZW1pdHRpbmcgYSB3cml0ZSB0byBaQl9aVE9QIGlzIGVub3VnaC4KKwkJICovCisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgenN0ZW5jaWxfZm9ybWF0KTsKKwkJcjMwMC0+aHcuenN0ZW5jaWxfZm9ybWF0LmNtZFsyXSA9IHRvcFo7CisJfQogfQogCiBzdGF0aWMgdm9pZCByMzAwU2V0QWxwaGFTdGF0ZShHTGNvbnRleHQgKiBjdHgpCkBAIC00MDEsMzUgKzQ5NiwzNiBAQAogCiAJc3dpdGNoIChjdHgtPkNvbG9yLkFscGhhRnVuYykgewogCWNhc2UgR0xfTkVWRVI6Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0ZBSUw7CisJCXBwX21pc2MgfD0gUjMwMF9GR19BTFBIQV9GVU5DX05FVkVSOwogCQlicmVhazsKIAljYXNlIEdMX0xFU1M6Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0xFU1M7CisJCXBwX21pc2MgfD0gUjMwMF9GR19BTFBIQV9GVU5DX0xFU1M7CiAJCWJyZWFrOwogCWNhc2UgR0xfRVFVQUw6Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0VRVUFMOworCQlwcF9taXNjIHw9IFIzMDBfRkdfQUxQSEFfRlVOQ19FUVVBTDsKIAkJYnJlYWs7CiAJY2FzZSBHTF9MRVFVQUw6Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0xFUVVBTDsKKwkJcHBfbWlzYyB8PSBSMzAwX0ZHX0FMUEhBX0ZVTkNfTEU7CiAJCWJyZWFrOwogCWNhc2UgR0xfR1JFQVRFUjoKLQkJcHBfbWlzYyB8PSBSMzAwX0FMUEhBX1RFU1RfR1JFQVRFUjsKKwkJcHBfbWlzYyB8PSBSMzAwX0ZHX0FMUEhBX0ZVTkNfR1JFQVRFUjsKIAkJYnJlYWs7CiAJY2FzZSBHTF9OT1RFUVVBTDoKLQkJcHBfbWlzYyB8PSBSMzAwX0FMUEhBX1RFU1RfTkVRVUFMOworCQlwcF9taXNjIHw9IFIzMDBfRkdfQUxQSEFfRlVOQ19OT1RFUVVBTDsKIAkJYnJlYWs7CiAJY2FzZSBHTF9HRVFVQUw6Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0dFUVVBTDsKKwkJcHBfbWlzYyB8PSBSMzAwX0ZHX0FMUEhBX0ZVTkNfR0U7CiAJCWJyZWFrOwogCWNhc2UgR0xfQUxXQVlTOgotCQkvKnBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX1BBU1M7ICovCisJCS8qcHBfbWlzYyB8PSBGR19BTFBIQV9GVU5DX0FMV0FZUzsgKi8KIAkJcmVhbGx5X2VuYWJsZWQgPSBHTF9GQUxTRTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHJlYWxseV9lbmFibGVkKSB7Ci0JCXBwX21pc2MgfD0gUjMwMF9BTFBIQV9URVNUX0VOQUJMRTsKLQkJcHBfbWlzYyB8PSAocmVmQnl0ZSAmIFIzMDBfUkVGX0FMUEhBX01BU0spOworCQlwcF9taXNjIHw9IFIzMDBfRkdfQUxQSEFfRlVOQ19FTkFCTEU7CisJCXBwX21pc2MgfD0gUjUwMF9GR19BTFBIQV9GVU5DXzhCSVQ7CisJCXBwX21pc2MgfD0gKHJlZkJ5dGUgJiBSMzAwX0ZHX0FMUEhBX0ZVTkNfVkFMX01BU0spOwogCX0gZWxzZSB7CiAJCXBwX21pc2MgPSAweDA7CiAJfQpAQCAtNDc2LDM4ICs1NzIsNTMgQEAKIAlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CiAKIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHpzKTsKLQlyMzAwLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzBdICY9IFIzMDBfUkIzRF9TVEVOQ0lMX0VOQUJMRTsKLQlyMzAwLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzFdICY9Ci0JICAgIH4oUjMwMF9aU19NQVNLIDw8IFIzMDBfUkIzRF9aUzFfREVQVEhfRlVOQ19TSElGVCk7CisJcjMwMC0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8wXSAmPSBSMzAwX1NURU5DSUxfRU5BQkxFfFIzMDBfU1RFTkNJTF9GUk9OVF9CQUNLOworCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMV0gJj0gfihSMzAwX1pTX01BU0sgPDwgUjMwMF9aX0ZVTkNfU0hJRlQpOwogCi0JaWYgKGN0eC0+RGVwdGguVGVzdCAmJiBjdHgtPkRlcHRoLkZ1bmMgIT0gR0xfTkVWRVIpIHsKKwlpZiAoY3R4LT5EZXB0aC5UZXN0KSB7CisJCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMF0gfD0gUjMwMF9aX0VOQUJMRTsKIAkJaWYgKGN0eC0+RGVwdGguTWFzaykKLQkJCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMF0gfD0KLQkJCSAgICBSMzAwX1JCM0RfWl9URVNUX0FORF9XUklURTsKLQkJZWxzZQotCQkJcjMwMC0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8wXSB8PSBSMzAwX1JCM0RfWl9URVNUOwotCisJCQlyMzAwLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzBdIHw9IFIzMDBfWl9XUklURV9FTkFCTEU7CiAJCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMV0gfD0KLQkJICAgIHRyYW5zbGF0ZV9mdW5jKGN0eC0+RGVwdGguCi0JCQkJICAgRnVuYykgPDwgUjMwMF9SQjNEX1pTMV9ERVBUSF9GVU5DX1NISUZUOwotCX0gZWxzZSB7Ci0JCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMF0gfD0gUjMwMF9SQjNEX1pfRElTQUJMRURfMTsKLQkJcjMwMC0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8xXSB8PQotCQkgICAgdHJhbnNsYXRlX2Z1bmMoR0xfTkVWRVIpIDw8IFIzMDBfUkIzRF9aUzFfREVQVEhfRlVOQ19TSElGVDsKKwkJICAgIHRyYW5zbGF0ZV9mdW5jKGN0eC0+RGVwdGguRnVuYykgPDwgUjMwMF9aX0ZVTkNfU0hJRlQ7CiAJfQogCiAJcjMwMFNldEVhcmx5WlN0YXRlKGN0eCk7CiB9CiAKK3N0YXRpYyB2b2lkIHIzMDBTZXRTdGVuY2lsU3RhdGUoR0xjb250ZXh0ICogY3R4LCBHTGJvb2xlYW4gc3RhdGUpCit7CisJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOworCisJaWYgKHIzMDAtPnN0YXRlLnN0ZW5jaWwuaHdfc3RlbmNpbCkgeworCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHpzKTsKKwkJaWYgKHN0YXRlKSB7CisJCQlyMzAwLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzBdIHw9CisJCQkgICAgUjMwMF9TVEVOQ0lMX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMF0gJj0KKwkJCSAgICB+UjMwMF9TVEVOQ0lMX0VOQUJMRTsKKwkJfQorCX0gZWxzZSB7CisjaWYgUjIwMF9NRVJHRUQKKwkJRkFMTEJBQ0soJnIzMDAtPnJhZGVvbiwgUkFERU9OX0ZBTExCQUNLX1NURU5DSUwsIHN0YXRlKTsKKyNlbmRpZgorCX0KK30KKwogc3RhdGljIHZvaWQgcjMwMFVwZGF0ZVBvbHlnb25Nb2RlKEdMY29udGV4dCAqIGN0eCkKIHsKIAlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7Ci0JdWludDMyX3QgaHdfbW9kZSA9IDA7CisJdWludDMyX3QgaHdfbW9kZSA9IFIzMDBfR0FfUE9MWV9NT0RFX0RJU0FCTEU7CiAKKwkvKiBPbmx5IGRvIHNvbWV0aGluZyBpZiBhIHBvbHlnb24gbW9kZSBpcyB3YW50ZWQsIGRlZmF1bHQgaXMgR0xfRklMTCAqLwogCWlmIChjdHgtPlBvbHlnb24uRnJvbnRNb2RlICE9IEdMX0ZJTEwgfHwKIAkgICAgY3R4LT5Qb2x5Z29uLkJhY2tNb2RlICE9IEdMX0ZJTEwpIHsKIAkJR0xlbnVtIGYsIGI7CiAKKwkJLyogSGFuZGxlIEdMX0NXIChjbG9jayB3aXNlIGFuZCBHTF9DQ1cgKGNvdW50ZXIgY2xvY2sgd2lzZSkKKwkJICogY29ycmVjdGx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVjdCBmcm9udCBhbmQgYmFjayBmYWNlCisJCSAqLwogCQlpZiAoY3R4LT5Qb2x5Z29uLkZyb250RmFjZSA9PSBHTF9DQ1cpIHsKIAkJCWYgPSBjdHgtPlBvbHlnb24uRnJvbnRNb2RlOwogCQkJYiA9IGN0eC0+UG9seWdvbi5CYWNrTW9kZTsKQEAgLTUxNiwyOSArNjI3LDMwIEBACiAJCQliID0gY3R4LT5Qb2x5Z29uLkZyb250TW9kZTsKIAkJfQogCi0JCWh3X21vZGUgfD0gUjMwMF9QTV9FTkFCTEVEOworCQkvKiBFbmFibGUgcG9seWdvbiBtb2RlICovCisJCWh3X21vZGUgfD0gUjMwMF9HQV9QT0xZX01PREVfRFVBTDsKIAogCQlzd2l0Y2ggKGYpIHsKIAkJY2FzZSBHTF9MSU5FOgotCQkJaHdfbW9kZSB8PSBSMzAwX1BNX0ZST05UX0xJTkU7CisJCQlod19tb2RlIHw9IFIzMDBfR0FfUE9MWV9NT0RFX0ZST05UX1BUWVBFX0xJTkU7CiAJCQlicmVhazsKLQkJY2FzZSBHTF9QT0lOVDoJLyogbm9vcCAqLwotCQkJaHdfbW9kZSB8PSBSMzAwX1BNX0ZST05UX1BPSU5UOworCQljYXNlIEdMX1BPSU5UOgorCQkJaHdfbW9kZSB8PSBSMzAwX0dBX1BPTFlfTU9ERV9GUk9OVF9QVFlQRV9QT0lOVDsKIAkJCWJyZWFrOwogCQljYXNlIEdMX0ZJTEw6Ci0JCQlod19tb2RlIHw9IFIzMDBfUE1fRlJPTlRfRklMTDsKKwkJCWh3X21vZGUgfD0gUjMwMF9HQV9QT0xZX01PREVfRlJPTlRfUFRZUEVfVFJJOwogCQkJYnJlYWs7CiAJCX0KIAogCQlzd2l0Y2ggKGIpIHsKIAkJY2FzZSBHTF9MSU5FOgotCQkJaHdfbW9kZSB8PSBSMzAwX1BNX0JBQ0tfTElORTsKKwkJCWh3X21vZGUgfD0gUjMwMF9HQV9QT0xZX01PREVfQkFDS19QVFlQRV9MSU5FOwogCQkJYnJlYWs7Ci0JCWNhc2UgR0xfUE9JTlQ6CS8qIG5vb3AgKi8KLQkJCWh3X21vZGUgfD0gUjMwMF9QTV9CQUNLX1BPSU5UOworCQljYXNlIEdMX1BPSU5UOgorCQkJaHdfbW9kZSB8PSBSMzAwX0dBX1BPTFlfTU9ERV9CQUNLX1BUWVBFX1BPSU5UOwogCQkJYnJlYWs7CiAJCWNhc2UgR0xfRklMTDoKLQkJCWh3X21vZGUgfD0gUjMwMF9QTV9CQUNLX0ZJTEw7CisJCQlod19tb2RlIHw9IFIzMDBfR0FfUE9MWV9NT0RFX0JBQ0tfUFRZUEVfVFJJOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC02MDYsOSArNzE4LDEwIEBACiAJCQkgIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKQogewogCXIzMDBDb250ZXh0UHRyIHIzMDAgPSBSMzAwX0NPTlRFWFQoY3R4KTsKLQlpbnQgbWFzayA9IChyID8gUjMwMF9DT0xPUk1BU0swX1IgOiAwKSB8Ci0JICAgIChnID8gUjMwMF9DT0xPUk1BU0swX0cgOiAwKSB8Ci0JICAgIChiID8gUjMwMF9DT0xPUk1BU0swX0IgOiAwKSB8IChhID8gUjMwMF9DT0xPUk1BU0swX0EgOiAwKTsKKwlpbnQgbWFzayA9IChyID8gUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfUkVEX01BU0swIDogMCkgfAorCSAgICAoZyA/IFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0dSRUVOX01BU0swIDogMCkgfAorCSAgICAoYiA/IFJCM0RfQ09MT1JfQ0hBTk5FTF9NQVNLX0JMVUVfTUFTSzAgOiAwKSB8CisJICAgIChhID8gUkIzRF9DT0xPUl9DSEFOTkVMX01BU0tfQUxQSEFfTUFTSzAgOiAwKTsKIAogCWlmIChtYXNrICE9IHIzMDAtPmh3LmNtay5jbWRbUjMwMF9DTUtfQ09MT1JNQVNLXSkgewogCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGNtayk7CkBAIC02MzQsMTUgKzc0NywxMyBAQAogCiAJc3dpdGNoIChwbmFtZSkgewogCWNhc2UgR0xfRk9HX01PREU6Ci0JCWlmICghY3R4LT5Gb2cuRW5hYmxlZCkKLQkJCXJldHVybjsKIAkJc3dpdGNoIChjdHgtPkZvZy5Nb2RlKSB7CiAJCWNhc2UgR0xfTElORUFSOgogCQkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBmb2dzKTsKIAkJCXIzMDAtPmh3LmZvZ3MuY21kW1IzMDBfRk9HU19TVEFURV0gPQogCQkJICAgIChyMzAwLT5ody5mb2dzLgotCQkJICAgICBjbWRbUjMwMF9GT0dTX1NUQVRFXSAmIH5SMzAwX0ZPR19NT0RFX01BU0spIHwKLQkJCSAgICBSMzAwX0ZPR19NT0RFX0xJTkVBUjsKKwkJCSAgICAgY21kW1IzMDBfRk9HU19TVEFURV0gJiB+UjMwMF9GR19GT0dfQkxFTkRfRk5fTUFTSykgfAorCQkJICAgIFIzMDBfRkdfRk9HX0JMRU5EX0ZOX0xJTkVBUjsKIAogCQkJaWYgKGN0eC0+Rm9nLlN0YXJ0ID09IGN0eC0+Rm9nLkVuZCkgewogCQkJCWZvZ1NjYWxlLmYgPSAtMS4wOwpAQCAtNjU5LDggKzc3MCw4IEBACiAJCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZvZ3MpOwogCQkJcjMwMC0+aHcuZm9ncy5jbWRbUjMwMF9GT0dTX1NUQVRFXSA9CiAJCQkgICAgKHIzMDAtPmh3LmZvZ3MuCi0JCQkgICAgIGNtZFtSMzAwX0ZPR1NfU1RBVEVdICYgflIzMDBfRk9HX01PREVfTUFTSykgfAotCQkJICAgIFIzMDBfRk9HX01PREVfRVhQOworCQkJICAgICBjbWRbUjMwMF9GT0dTX1NUQVRFXSAmIH5SMzAwX0ZHX0ZPR19CTEVORF9GTl9NQVNLKSB8CisJCQkgICAgUjMwMF9GR19GT0dfQkxFTkRfRk5fRVhQOwogCQkJZm9nU2NhbGUuZiA9IDAuMDkzMyAqIGN0eC0+Rm9nLkRlbnNpdHk7CiAJCQlmb2dTdGFydC5mID0gMC4wOwogCQkJYnJlYWs7CkBAIC02NjgsOCArNzc5LDggQEAKIAkJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZm9ncyk7CiAJCQlyMzAwLT5ody5mb2dzLmNtZFtSMzAwX0ZPR1NfU1RBVEVdID0KIAkJCSAgICAocjMwMC0+aHcuZm9ncy4KLQkJCSAgICAgY21kW1IzMDBfRk9HU19TVEFURV0gJiB+UjMwMF9GT0dfTU9ERV9NQVNLKSB8Ci0JCQkgICAgUjMwMF9GT0dfTU9ERV9FWFAyOworCQkJICAgICBjbWRbUjMwMF9GT0dTX1NUQVRFXSAmIH5SMzAwX0ZHX0ZPR19CTEVORF9GTl9NQVNLKSB8CisJCQkgICAgUjMwMF9GR19GT0dfQkxFTkRfRk5fRVhQMjsKIAkJCWZvZ1NjYWxlLmYgPSAwLjMgKiBjdHgtPkZvZy5EZW5zaXR5OwogCQkJZm9nU3RhcnQuZiA9IDAuMDsKIAkJZGVmYXVsdDoKQEAgLTcyNyw2ICs4MzgsMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHIzMDBTZXRGb2dTdGF0ZShHTGNvbnRleHQgKiBjdHgsIEdMYm9vbGVhbiBzdGF0ZSkKK3sKKwlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CisKKwlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZvZ3MpOworCWlmIChzdGF0ZSkgeworCQlyMzAwLT5ody5mb2dzLmNtZFtSMzAwX0ZPR1NfU1RBVEVdIHw9IFIzMDBfRkdfRk9HX0JMRU5EX0VOQUJMRTsKKworCQlyMzAwRm9nZnYoY3R4LCBHTF9GT0dfTU9ERSwgTlVMTCk7CisJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19ERU5TSVRZLCAmY3R4LT5Gb2cuRGVuc2l0eSk7CisJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19TVEFSVCwgJmN0eC0+Rm9nLlN0YXJ0KTsKKwkJcjMwMEZvZ2Z2KGN0eCwgR0xfRk9HX0VORCwgJmN0eC0+Rm9nLkVuZCk7CisJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19DT0xPUiwgY3R4LT5Gb2cuQ29sb3IpOworCX0gZWxzZSB7CisJCXIzMDAtPmh3LmZvZ3MuY21kW1IzMDBfRk9HU19TVEFURV0gJj0gflIzMDBfRkdfRk9HX0JMRU5EX0VOQUJMRTsKKwl9Cit9CisKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFBvaW50IHN0YXRlCiAgKi8KQEAgLTc0Miw2ICs4NzEsMzEgQEAKIAkgICAgKChpbnQpKHNpemUgKiA2KSA8PCBSMzAwX1BPSU5UU0laRV9ZX1NISUZUKTsKIH0KIAorc3RhdGljIHZvaWQgcjMwMFBvaW50UGFyYW1ldGVyKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICogcGFyYW0pCit7CisJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOworCisJc3dpdGNoIChwbmFtZSkgeworCWNhc2UgR0xfUE9JTlRfU0laRV9NSU46CisJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZ2FfcG9pbnRfbWlubWF4KTsKKwkJcjMwMC0+aHcuZ2FfcG9pbnRfbWlubWF4LmNtZFsxXSAmPSB+UjMwMF9HQV9QT0lOVF9NSU5NQVhfTUlOX01BU0s7CisJCXIzMDAtPmh3LmdhX3BvaW50X21pbm1heC5jbWRbMV0gfD0gKEdMdWludCkoY3R4LT5Qb2ludC5NaW5TaXplICogNi4wKTsKKwkJYnJlYWs7CisJY2FzZSBHTF9QT0lOVF9TSVpFX01BWDoKKwkJUjMwMF9TVEFURUNIQU5HRShyMzAwLCBnYV9wb2ludF9taW5tYXgpOworCQlyMzAwLT5ody5nYV9wb2ludF9taW5tYXguY21kWzFdICY9IH5SMzAwX0dBX1BPSU5UX01JTk1BWF9NQVhfTUFTSzsKKwkJcjMwMC0+aHcuZ2FfcG9pbnRfbWlubWF4LmNtZFsxXSB8PSAoR0x1aW50KShjdHgtPlBvaW50Lk1heFNpemUgKiA2LjApCisJCQk8PCBSMzAwX0dBX1BPSU5UX01JTk1BWF9NQVhfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT046CisJCWJyZWFrOworCWNhc2UgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBMaW5lIHN0YXRlCiAgKi8KQEAgLTgyMSwzNyArOTc1LDM2IEBACiAJcjMwMENvbnRleHRQdHIgcm1lc2EgPSBSMzAwX0NPTlRFWFQoY3R4KTsKIAlHTHVpbnQgcmVmbWFzayA9CiAJICAgICgoKGN0eC0+U3RlbmNpbC4KLQkgICAgICAgUmVmWzBdICYgMHhmZikgPDwgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX1JFRl9TSElGVCkgfCAoKGN0eC0+Ci0JCQkJCQkJCSAgICAgIFN0ZW5jaWwuCi0JCQkJCQkJCSAgICAgIFZhbHVlTWFzawotCQkJCQkJCQkgICAgICBbMF0gJgotCQkJCQkJCQkgICAgICAweGZmKQotCQkJCQkJCQkgICAgIDw8Ci0JCQkJCQkJCSAgICAgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX01BU0tfU0hJRlQpKTsKKwkgICAgICAgUmVmWzBdICYgMHhmZikgPDwgUjMwMF9TVEVOQ0lMUkVGX1NISUZUKSB8ICgoY3R4LT4KKwkJCQkJCQkgICAgU3RlbmNpbC4KKwkJCQkJCQkgICAgVmFsdWVNYXNrCisJCQkJCQkJICAgIFswXSAmCisJCQkJCQkJICAgIDB4ZmYpCisJCQkJCQkJICAgPDwKKwkJCQkJCQkgICBSMzAwX1NURU5DSUxNQVNLX1NISUZUKSk7CiAKIAlHTHVpbnQgZmxhZzsKIAogCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIHpzKTsKLQorCXJtZXNhLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzBdIHw9IFIzMDBfU1RFTkNJTF9GUk9OVF9CQUNLOwogCXJtZXNhLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzFdICY9IH4oKFIzMDBfWlNfTUFTSyA8PAotCQkJCQkgICAgICAgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUKQorCQkJCQkgICAgICAgUjMwMF9TX0ZST05UX0ZVTkNfU0hJRlQpCiAJCQkJCSAgICAgIHwgKFIzMDBfWlNfTUFTSyA8PAotCQkJCQkJIFIzMDBfUkIzRF9aUzFfQkFDS19GVU5DX1NISUZUKSk7CisJCQkJCQkgUjMwMF9TX0JBQ0tfRlVOQ19TSElGVCkpOwogCiAJcm1lc2EtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMl0gJj0KLQkgICAgfigoUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX01BU0sgPDwKLQkgICAgICAgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX1JFRl9TSElGVCkgfAotCSAgICAgIChSMzAwX1JCM0RfWlMyX1NURU5DSUxfTUFTSyA8PCBSMzAwX1JCM0RfWlMyX1NURU5DSUxfTUFTS19TSElGVCkpOworCSAgICB+KChSMzAwX1NURU5DSUxSRUZfTUFTSyA8PCBSMzAwX1NURU5DSUxSRUZfU0hJRlQpIHwKKwkgICAgICAoUjMwMF9TVEVOQ0lMUkVGX01BU0sgPDwgUjMwMF9TVEVOQ0lMTUFTS19TSElGVCkpOwogCiAJZmxhZyA9IHRyYW5zbGF0ZV9mdW5jKGN0eC0+U3RlbmNpbC5GdW5jdGlvblswXSk7CiAJcm1lc2EtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMV0gfD0KLQkgICAgKGZsYWcgPDwgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUKTsKKwkgICAgKGZsYWcgPDwgUjMwMF9TX0ZST05UX0ZVTkNfU0hJRlQpOwogCiAJaWYgKGN0eC0+U3RlbmNpbC5fVGVzdFR3b1NpZGUpCiAJCWZsYWcgPSB0cmFuc2xhdGVfZnVuYyhjdHgtPlN0ZW5jaWwuRnVuY3Rpb25bMV0pOwogCiAJcm1lc2EtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMV0gfD0KLQkgICAgKGZsYWcgPDwgUjMwMF9SQjNEX1pTMV9CQUNLX0ZVTkNfU0hJRlQpOworCSAgICAoZmxhZyA8PCBSMzAwX1NfQkFDS19GVU5DX1NISUZUKTsKIAlybWVzYS0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8yXSB8PSByZWZtYXNrOwogfQogCkBAIC04NjEsMTEgKzEwMTQsMTIgQEAKIAogCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIHpzKTsKIAlybWVzYS0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8yXSAmPQotCSAgICB+KFIzMDBfUkIzRF9aUzJfU1RFTkNJTF9NQVNLIDw8Ci0JICAgICAgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX1dSSVRFX01BU0tfU0hJRlQpOworCSAgICB+KFIzMDBfU1RFTkNJTFJFRl9NQVNLIDw8CisJICAgICAgUjMwMF9TVEVOQ0lMV1JJVEVNQVNLX1NISUZUKTsKIAlybWVzYS0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8yXSB8PQogCSAgICAoY3R4LT5TdGVuY2lsLgotCSAgICAgV3JpdGVNYXNrWzBdICYgMHhmZikgPDwgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX1dSSVRFX01BU0tfU0hJRlQ7CisJICAgICBXcml0ZU1hc2tbMF0gJiBSMzAwX1NURU5DSUxSRUZfTUFTSykgPDwKKwkgICAgIFIzMDBfU1RFTkNJTFdSSVRFTUFTS19TSElGVDsKIH0KIAogc3RhdGljIHZvaWQgcjMwMFN0ZW5jaWxPcFNlcGFyYXRlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGZhY2UsCkBAIC04NzYsNDkgKzEwMzAsMzcgQEAKIAlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCB6cyk7CiAJLyogSXQgaXMgZWFzaWVyIHRvIG1hc2sgd2hhdCdzIGxlZnQuLiAqLwogCXJtZXNhLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzFdICY9Ci0JICAgIChSMzAwX1pTX01BU0sgPDwgUjMwMF9SQjNEX1pTMV9ERVBUSF9GVU5DX1NISUZUKSB8Ci0JICAgIChSMzAwX1pTX01BU0sgPDwgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUKSB8Ci0JICAgIChSMzAwX1pTX01BU0sgPDwgUjMwMF9SQjNEX1pTMV9CQUNLX0ZVTkNfU0hJRlQpOworCSAgICAoUjMwMF9aU19NQVNLIDw8IFIzMDBfWl9GVU5DX1NISUZUKSB8CisJICAgIChSMzAwX1pTX01BU0sgPDwgUjMwMF9TX0ZST05UX0ZVTkNfU0hJRlQpIHwKKwkgICAgKFIzMDBfWlNfTUFTSyA8PCBSMzAwX1NfQkFDS19GVU5DX1NISUZUKTsKIAogCXJtZXNhLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzFdIHw9CiAJICAgICh0cmFuc2xhdGVfc3RlbmNpbF9vcChjdHgtPlN0ZW5jaWwuRmFpbEZ1bmNbMF0pIDw8Ci0JICAgICBSMzAwX1JCM0RfWlMxX0ZST05UX0ZBSUxfT1BfU0hJRlQpCisJICAgICBSMzAwX1NfRlJPTlRfU0ZBSUxfT1BfU0hJRlQpCiAJICAgIHwgKHRyYW5zbGF0ZV9zdGVuY2lsX29wKGN0eC0+U3RlbmNpbC5aRmFpbEZ1bmNbMF0pIDw8Ci0JICAgICAgIFIzMDBfUkIzRF9aUzFfRlJPTlRfWkZBSUxfT1BfU0hJRlQpCisJICAgICAgIFIzMDBfU19GUk9OVF9aRkFJTF9PUF9TSElGVCkKIAkgICAgfCAodHJhbnNsYXRlX3N0ZW5jaWxfb3AoY3R4LT5TdGVuY2lsLlpQYXNzRnVuY1swXSkgPDwKLQkgICAgICAgUjMwMF9SQjNEX1pTMV9GUk9OVF9aUEFTU19PUF9TSElGVCk7CisJICAgICAgIFIzMDBfU19GUk9OVF9aUEFTU19PUF9TSElGVCk7CiAKIAlpZiAoY3R4LT5TdGVuY2lsLl9UZXN0VHdvU2lkZSkgewogCQlybWVzYS0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8xXSB8PQogCQkgICAgKHRyYW5zbGF0ZV9zdGVuY2lsX29wKGN0eC0+U3RlbmNpbC5GYWlsRnVuY1sxXSkgPDwKLQkJICAgICBSMzAwX1JCM0RfWlMxX0JBQ0tfRkFJTF9PUF9TSElGVCkKKwkJICAgICBSMzAwX1NfQkFDS19TRkFJTF9PUF9TSElGVCkKIAkJICAgIHwgKHRyYW5zbGF0ZV9zdGVuY2lsX29wKGN0eC0+U3RlbmNpbC5aRmFpbEZ1bmNbMV0pIDw8Ci0JCSAgICAgICBSMzAwX1JCM0RfWlMxX0JBQ0tfWkZBSUxfT1BfU0hJRlQpCisJCSAgICAgICBSMzAwX1NfQkFDS19aRkFJTF9PUF9TSElGVCkKIAkJICAgIHwgKHRyYW5zbGF0ZV9zdGVuY2lsX29wKGN0eC0+U3RlbmNpbC5aUGFzc0Z1bmNbMV0pIDw8Ci0JCSAgICAgICBSMzAwX1JCM0RfWlMxX0JBQ0tfWlBBU1NfT1BfU0hJRlQpOworCQkgICAgICAgUjMwMF9TX0JBQ0tfWlBBU1NfT1BfU0hJRlQpOwogCX0gZWxzZSB7CiAJCXJtZXNhLT5ody56cy5jbWRbUjMwMF9aU19DTlRMXzFdIHw9CiAJCSAgICAodHJhbnNsYXRlX3N0ZW5jaWxfb3AoY3R4LT5TdGVuY2lsLkZhaWxGdW5jWzBdKSA8PAotCQkgICAgIFIzMDBfUkIzRF9aUzFfQkFDS19GQUlMX09QX1NISUZUKQorCQkgICAgIFIzMDBfU19CQUNLX1NGQUlMX09QX1NISUZUKQogCQkgICAgfCAodHJhbnNsYXRlX3N0ZW5jaWxfb3AoY3R4LT5TdGVuY2lsLlpGYWlsRnVuY1swXSkgPDwKLQkJICAgICAgIFIzMDBfUkIzRF9aUzFfQkFDS19aRkFJTF9PUF9TSElGVCkKKwkJICAgICAgIFIzMDBfU19CQUNLX1pGQUlMX09QX1NISUZUKQogCQkgICAgfCAodHJhbnNsYXRlX3N0ZW5jaWxfb3AoY3R4LT5TdGVuY2lsLlpQYXNzRnVuY1swXSkgPDwKLQkJICAgICAgIFIzMDBfUkIzRF9aUzFfQkFDS19aUEFTU19PUF9TSElGVCk7CisJCSAgICAgICBSMzAwX1NfQkFDS19aUEFTU19PUF9TSElGVCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCByMzAwQ2xlYXJTdGVuY2lsKEdMY29udGV4dCAqIGN0eCwgR0xpbnQgcykKLXsKLQlyMzAwQ29udGV4dFB0ciBybWVzYSA9IFIzMDBfQ09OVEVYVChjdHgpOwotCi0Jcm1lc2EtPnN0YXRlLnN0ZW5jaWwuY2xlYXIgPQotCSAgICAoKEdMdWludCkgKGN0eC0+U3RlbmNpbC5DbGVhciAmIDB4ZmYpIHwKLQkgICAgIChSMzAwX1JCM0RfWlMyX1NURU5DSUxfTUFTSyA8PAotCSAgICAgIFIzMDBfUkIzRF9aUzJfU1RFTkNJTF9NQVNLX1NISUZUKSB8ICgoY3R4LT5TdGVuY2lsLgotCQkJCQkJICAgIFdyaXRlTWFza1swXSAmIDB4ZmYpIDw8Ci0JCQkJCQkgICBSMzAwX1JCM0RfWlMyX1NURU5DSUxfV1JJVEVfTUFTS19TSElGVCkpOwotfQotCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBXaW5kb3cgcG9zaXRpb24gYW5kIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uCiAgKi8KQEAgLTEwMDYsMTIgKzExNDgsMTIgQEAKIAlzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOwogCWRyaVJlbmRlcmJ1ZmZlciAqZHJiOwogCi0JaWYgKGZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0ZST05UX0xFRlQpIHsKKwlpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdID09IEJVRkZFUl9GUk9OVF9MRUZUKSB7CiAJCS8qIGRyYXcgdG8gZnJvbnQgKi8KIAkJZHJiID0KIAkJICAgIChkcmlSZW5kZXJidWZmZXIgKikgZmItPkF0dGFjaG1lbnRbQlVGRkVSX0ZST05UX0xFRlRdLgogCQkgICAgUmVuZGVyYnVmZmVyOwotCX0gZWxzZSBpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdID09IEJVRkZFUl9CSVRfQkFDS19MRUZUKSB7CisJfSBlbHNlIGlmIChmYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0JBQ0tfTEVGVCkgewogCQkvKiBkcmF3IHRvIGJhY2sgKi8KIAkJZHJiID0KIAkJICAgIChkcmlSZW5kZXJidWZmZXIgKikgZmItPkF0dGFjaG1lbnRbQlVGRkVSX0JBQ0tfTEVGVF0uCkBAIC0xMTgzLDggKzEzMjUsOCBAQAogCSAgICAoUjMwMF9UWF9DTEFNUCA8PCBSMzAwX1RYX1dSQVBfVF9TSElGVCkpIHsKIAkJbmVlZHNfZml4aW5nIHw9IDI7CiAJfQotCWlmICgoZiAmICgoNyAtIDEpIDw8IFIzMDBfVFhfV1JBUF9RX1NISUZUKSkgPT0KLQkgICAgKFIzMDBfVFhfQ0xBTVAgPDwgUjMwMF9UWF9XUkFQX1FfU0hJRlQpKSB7CisJaWYgKChmICYgKCg3IC0gMSkgPDwgUjMwMF9UWF9XUkFQX1JfU0hJRlQpKSA9PQorCSAgICAoUjMwMF9UWF9DTEFNUCA8PCBSMzAwX1RYX1dSQVBfUl9TSElGVCkpIHsKIAkJbmVlZHNfZml4aW5nIHw9IDQ7CiAJfQogCkBAIC0xMTkyLDcgKzEzMzQsNyBAQAogCQlyZXR1cm4gZjsKIAogCW1hZyA9IGYgJiBSMzAwX1RYX01BR19GSUxURVJfTUFTSzsKLQltaW4gPSBmICYgUjMwMF9UWF9NSU5fRklMVEVSX01BU0s7CisJbWluID0gZiAmIChSMzAwX1RYX01JTl9GSUxURVJfTUFTS3xSMzAwX1RYX01JTl9GSUxURVJfTUlQX01BU0spOwogCiAJLyogVE9ETzogQ2hlY2sgZm9yIGFuaXN0byBmaWx0ZXJzIHRvbyAqLwogCWlmICgobWFnICE9IFIzMDBfVFhfTUFHX0ZJTFRFUl9ORUFSRVNUKQpAQCAtMTIyNCwxMiArMTM2NiwxMDAgQEAKIAkJZiB8PSBSMzAwX1RYX0NMQU1QX1RPX0VER0UgPDwgUjMwMF9UWF9XUkFQX1RfU0hJRlQ7CiAJfQogCWlmIChuZWVkc19maXhpbmcgJiA0KSB7Ci0JCWYgJj0gfigoNyAtIDEpIDw8IFIzMDBfVFhfV1JBUF9RX1NISUZUKTsKLQkJZiB8PSBSMzAwX1RYX0NMQU1QX1RPX0VER0UgPDwgUjMwMF9UWF9XUkFQX1FfU0hJRlQ7CisJCWYgJj0gfigoNyAtIDEpIDw8IFIzMDBfVFhfV1JBUF9SX1NISUZUKTsKKwkJZiB8PSBSMzAwX1RYX0NMQU1QX1RPX0VER0UgPDwgUjMwMF9UWF9XUkFQX1JfU0hJRlQ7CiAJfQogCXJldHVybiBmOwogfQogCitzdGF0aWMgdm9pZCByMzAwU2V0dXBGcmFnbWVudFNoYWRlclRleHR1cmVzKEdMY29udGV4dCAqY3R4LCBpbnQgKnRtdV9tYXBwaW5ncykKK3sKKwlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CisJaW50IGk7CisJc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IHIzMDBfZnJhZ21lbnRfcHJvZ3JhbSAqKQorCSAgICAoY2hhciAqKWN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50OworCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW1fY29kZSAqY29kZSA9ICZmcC0+Y29kZTsKKworCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZnB0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb2RlLT50ZXgubGVuZ3RoOyBpKyspIHsKKwkJaW50IHVuaXQ7CisJCWludCBvcGNvZGU7CisJCXVuc2lnbmVkIGxvbmcgdmFsOworCisJCXVuaXQgPSBjb2RlLT50ZXguaW5zdFtpXSA+PiBSMzAwX1RFWF9JRF9TSElGVDsKKwkJdW5pdCAmPSAxNTsKKworCQl2YWwgPSBjb2RlLT50ZXguaW5zdFtpXTsKKwkJdmFsICY9IH5SMzAwX1RFWF9JRF9NQVNLOworCisJCW9wY29kZSA9CisJCQkodmFsICYgUjMwMF9URVhfSU5TVF9NQVNLKSA+PiBSMzAwX1RFWF9JTlNUX1NISUZUOworCQlpZiAob3Bjb2RlID09IFIzMDBfVEVYX09QX0tJTCkgeworCQkJcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9JTlNUUl8wICsgaV0gPSB2YWw7CisJCX0gZWxzZSB7CisJCQlpZiAodG11X21hcHBpbmdzW3VuaXRdID49IDApIHsKKwkJCQl2YWwgfD0KKwkJCQkJdG11X21hcHBpbmdzW3VuaXRdIDw8CisJCQkJCVIzMDBfVEVYX0lEX1NISUZUOworCQkJCXIzMDAtPmh3LmZwdC5jbWRbUjMwMF9GUFRfSU5TVFJfMCArIGldID0gdmFsOworCQkJfSBlbHNlIHsKKwkJCQkvLyBXZSBnZXQgaGVyZSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHRleHR1cmUgaW1hZ2UgaXMgaW5jb21wbGV0ZQorCQkJCS8vIChlLmcuIGluY29tcGxldGUgbWlwbWFwcyBldGMuKQorCQkJCXIzMDAtPmh3LmZwdC5jbWRbUjMwMF9GUFRfSU5TVFJfMCArIGldID0gdmFsOworCQkJfQorCQl9CisJfQorCisJcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9DTURfMF0gPQorCQljbWRwYWNrZXQwKFIzMDBfVVNfVEVYX0lOU1RfMCwgY29kZS0+dGV4Lmxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHI1MDBTZXR1cEZyYWdtZW50U2hhZGVyVGV4dHVyZXMoR0xjb250ZXh0ICpjdHgsIGludCAqdG11X21hcHBpbmdzKQoreworCWludCBpOworCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0gKikKKwkgICAgKGNoYXIgKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGUgPSAmZnAtPmNvZGU7CisKKwkvKiBmaW5kIGFsbCB0aGUgdGV4dHVyZSBpbnN0cnVjdGlvbnMgYW5kIHJlbG9jYXRlIHRoZSB0ZXh0dXJlIHVuaXRzICovCisJZm9yIChpID0gMDsgaSA8IGNvZGUtPmluc3RfZW5kICsgMTsgaSsrKSB7CisJCWlmICgoY29kZS0+aW5zdFtpXS5pbnN0MCAmIDB4MykgPT0gUjUwMF9JTlNUX1RZUEVfVEVYKSB7CisJCQl1aW50MzJfdCB2YWw7CisJCQlpbnQgdW5pdCwgb3Bjb2RlLCBuZXdfdW5pdDsKKworCQkJdmFsID0gY29kZS0+aW5zdFtpXS5pbnN0MTsKKworCQkJdW5pdCA9ICh2YWwgPj4gMTYpICYgMHhmOworCisJCQl2YWwgJj0gfigweGYgPDwgMTYpOworCisJCQlvcGNvZGUgPSB2YWwgJiAoMHg3IDw8IDIyKTsKKwkJCWlmIChvcGNvZGUgPT0gUjUwMF9URVhfSU5TVF9URVhLSUxMKSB7CisJCQkJbmV3X3VuaXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodG11X21hcHBpbmdzW3VuaXRdID49IDApIHsKKwkJCQkJbmV3X3VuaXQgPSB0bXVfbWFwcGluZ3NbdW5pdF07CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3X3VuaXQgPSAwOworCQkJCX0KKwkJCX0KKwkJCXZhbCB8PSBSNTAwX1RFWF9JRChuZXdfdW5pdCk7CisJCQljb2RlLT5pbnN0W2ldLmluc3QxID0gdmFsOworCQl9CisJfQorfQorCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9sb2RfYmlhcyhHTGZsb2F0IGJpYXMpCit7CisJR0xpbnQgYiA9IChpbnQpKGJpYXMqMzIpOworCWlmIChiID49ICgxIDw8IDkpKQorCQliID0gKDEgPDwgOSktMTsKKwllbHNlIGlmIChiIDwgLSgxIDw8IDkpKQorCQliID0gLSgxIDw8IDkpOworCXJldHVybiAoKChHTHVpbnQpYikgPDwgUjMwMF9MT0RfQklBU19TSElGVCkgJiBSMzAwX0xPRF9CSUFTX01BU0s7Cit9CisKIHN0YXRpYyB2b2lkIHIzMDBTZXR1cFRleHR1cmVzKEdMY29udGV4dCAqIGN0eCkKIHsKIAlpbnQgaSwgbXR1OwpAQCAtMTI5Myw4ICsxNTIzLDE0IEBACiAJCQlyMzAwLT5ody50ZXguZmlsdGVyLmNtZFtSMzAwX1RFWF9WQUxVRV8wICsKIAkJCQkJCWh3X3RtdV0gPQogCQkJICAgIGdlbl9maXhlZF9maWx0ZXIodC0+ZmlsdGVyKSB8IChod190bXUgPDwgMjgpOwotCQkJLyogQ3VycmVudGx5IGRpc2FibGVkISAqLwotCQkJcjMwMC0+aHcudGV4LmZpbHRlcl8xLmNtZFtSMzAwX1RFWF9WQUxVRV8wICsgaHdfdG11XSA9IDB4MDsJLy8weDIwNTAxZjgwOworCQkJLyogTm90ZTogVGhlcmUgaXMgYSBMT0QgYmlhcyBwZXIgdGV4dHVyZSB1bml0IGFuZCBhIExPRCBiaWFzCisJCQkgKiBwZXIgdGV4dHVyZSBvYmplY3QuIFdlIGFkZCB0aGVtIGhlcmUgdG8gZ2V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ci4KKwkJCSAqIChUaGUgcGVyLXRleHR1cmUgb2JqZWN0IExPRCBiaWFzIHdhcyBpbnRyb2R1Y2VkIGluIE9wZW5HTCAxLjQKKwkJCSAqIGFuZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgRVhUX3RleHR1cmVfb2JqZWN0IGV4dGVuc2lvbikuCisJCQkgKi8KKwkJCXIzMDAtPmh3LnRleC5maWx0ZXJfMS5jbWRbUjMwMF9URVhfVkFMVUVfMCArIGh3X3RtdV0gPQorCQkJCXQtPmZpbHRlcl8xIHwKKwkJCQl0cmFuc2xhdGVfbG9kX2JpYXMoY3R4LT5UZXh0dXJlLlVuaXRbaV0uTG9kQmlhcyArIHQtPmJhc2UudE9iai0+TG9kQmlhcyk7CiAJCQlyMzAwLT5ody50ZXguc2l6ZS5jbWRbUjMwMF9URVhfVkFMVUVfMCArIGh3X3RtdV0gPQogCQkJICAgIHQtPnNpemU7CiAJCQlyMzAwLT5ody50ZXguZm9ybWF0LmNtZFtSMzAwX1RFWF9WQUxVRV8wICsKQEAgLTEzMjUsNyArMTU2MSw3IEBACiAJfQogCiAJcjMwMC0+aHcudGV4LmZpbHRlci5jbWRbUjMwMF9URVhfQ01EXzBdID0KLQkgICAgY21kcGFja2V0MChSMzAwX1RYX0ZJTFRFUl8wLCBsYXN0X2h3X3RtdSArIDEpOworCSAgICBjbWRwYWNrZXQwKFIzMDBfVFhfRklMVEVSMF8wLCBsYXN0X2h3X3RtdSArIDEpOwogCXIzMDAtPmh3LnRleC5maWx0ZXJfMS5jbWRbUjMwMF9URVhfQ01EXzBdID0KIAkgICAgY21kcGFja2V0MChSMzAwX1RYX0ZJTFRFUjFfMCwgbGFzdF9od190bXUgKyAxKTsKIAlyMzAwLT5ody50ZXguc2l6ZS5jbWRbUjMwMF9URVhfQ01EXzBdID0KQEAgLTEzMzMsNyArMTU2OSw3IEBACiAJcjMwMC0+aHcudGV4LmZvcm1hdC5jbWRbUjMwMF9URVhfQ01EXzBdID0KIAkgICAgY21kcGFja2V0MChSMzAwX1RYX0ZPUk1BVF8wLCBsYXN0X2h3X3RtdSArIDEpOwogCXIzMDAtPmh3LnRleC5waXRjaC5jbWRbUjMwMF9URVhfQ01EXzBdID0KLQkgICAgY21kcGFja2V0MChSMzAwX1RYX1BJVENIXzAsIGxhc3RfaHdfdG11ICsgMSk7CisJICAgIGNtZHBhY2tldDAoUjMwMF9UWF9GT1JNQVQyXzAsIGxhc3RfaHdfdG11ICsgMSk7CiAJcjMwMC0+aHcudGV4Lm9mZnNldC5jbWRbUjMwMF9URVhfQ01EXzBdID0KIAkgICAgY21kcGFja2V0MChSMzAwX1RYX09GRlNFVF8wLCBsYXN0X2h3X3RtdSArIDEpOwogCXIzMDAtPmh3LnRleC5jaHJvbWFfa2V5LmNtZFtSMzAwX1RFWF9DTURfMF0gPQpAQCAtMTM0NCwzOSArMTU4MCwxOCBAQAogCWlmICghZnApCQkvKiBzaG91bGQgb25seSBoYXBwZW5lbiBvbmNlLCBqdXN0IGFmdGVyIGNvbnRleHQgaXMgY3JlYXRlZCAqLwogCQlyZXR1cm47CiAKLQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIGZwdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZnAtPnRleC5sZW5ndGg7IGkrKykgewotCQlpbnQgdW5pdDsKLQkJaW50IG9wY29kZTsKLQkJdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQkJdW5pdCA9IGZwLT50ZXguaW5zdFtpXSA+PiBSMzAwX0ZQSVRYX0lNQUdFX1NISUZUOwotCQl1bml0ICY9IDE1OwotCi0JCXZhbCA9IGZwLT50ZXguaW5zdFtpXTsKLQkJdmFsICY9IH5SMzAwX0ZQSVRYX0lNQUdFX01BU0s7Ci0KLQkJb3Bjb2RlID0KLQkJICAgICh2YWwgJiBSMzAwX0ZQSVRYX09QQ09ERV9NQVNLKSA+PiBSMzAwX0ZQSVRYX09QQ09ERV9TSElGVDsKLQkJaWYgKG9wY29kZSA9PSBSMzAwX0ZQSVRYX09QX0tJTCkgewotCQkJcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9JTlNUUl8wICsgaV0gPSB2YWw7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodG11X21hcHBpbmdzW3VuaXRdID49IDApIHsKLQkJCQl2YWwgfD0KLQkJCQkgICAgdG11X21hcHBpbmdzW3VuaXRdIDw8Ci0JCQkJICAgIFIzMDBfRlBJVFhfSU1BR0VfU0hJRlQ7Ci0JCQkJcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9JTlNUUl8wICsgaV0gPSB2YWw7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFdlIGdldCBoZXJlIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgdGV4dHVyZSBpbWFnZSBpcyBpbmNvbXBsZXRlCi0JCQkJLy8gKGUuZy4gaW5jb21wbGV0ZSBtaXBtYXBzIGV0Yy4pCi0JCQkJcjMwMC0+aHcuZnB0LmNtZFtSMzAwX0ZQVF9JTlNUUl8wICsgaV0gPSB2YWw7Ci0JCQl9CisJaWYgKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5IDwgQ0hJUF9GQU1JTFlfUlY1MTUpIHsKKwkJaWYgKGZwLT5tZXNhX3Byb2dyYW0uVXNlc0tpbGwgJiYgbGFzdF9od190bXUgPCAwKSB7CisJCQkvLyBUaGUgS0lMTCBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIGZpcnN0IHRleHR1cmUgdW5pdAorCQkJLy8gdG8gYmUgZW5hYmxlZC4KKwkJCXIzMDAtPmh3LnR4ZS5jbWRbUjMwMF9UWEVfRU5BQkxFXSB8PSAxOworCQkJcjMwMC0+aHcudGV4LmZpbHRlci5jbWRbUjMwMF9URVhfVkFMVUVfMF0gPSAwOworCQkJcjMwMC0+aHcudGV4LmZpbHRlci5jbWRbUjMwMF9URVhfQ01EXzBdID0KKwkJCQljbWRwYWNrZXQwKFIzMDBfVFhfRklMVEVSMF8wLCAxKTsKIAkJfQotCX0KLQotCXIzMDAtPmh3LmZwdC5jbWRbUjMwMF9GUFRfQ01EXzBdID0KLQkgICAgY21kcGFja2V0MChSMzAwX1BGU19URVhJXzAsIGZwLT50ZXgubGVuZ3RoKTsKKwkJcjMwMFNldHVwRnJhZ21lbnRTaGFkZXJUZXh0dXJlcyhjdHgsIHRtdV9tYXBwaW5ncyk7CisJfSBlbHNlCisJCXI1MDBTZXR1cEZyYWdtZW50U2hhZGVyVGV4dHVyZXMoY3R4LCB0bXVfbWFwcGluZ3MpOwogCiAJaWYgKFJBREVPTl9ERUJVRyAmIERFQlVHX1NUQVRFKQogCQlmcHJpbnRmKHN0ZGVyciwgIlRYX0VOQUJMRTogJTA4eCAgbGFzdF9od190bXU9JWRcbiIsCkBAIC0xMzk2LDIxICsxNjExLDE3IEBACiB7CiAJcjMwMENvbnRleHRQdHIgcjMwMCA9IFIzMDBfQ09OVEVYVChjdHgpOwogCS8qIEknbSBzdGlsbCB1bnN1cmUgaWYgdGhlc2UgYXJlIG5lZWRlZCAqLwotCUdMdWludCBpbnRlcnBfbWFnaWNbOF0gPSB7Ci0JCTB4MDAsCi0JCVIzMDBfUlNfSU5URVJQXzFfVU5LTk9XTiwKLQkJUjMwMF9SU19JTlRFUlBfMl9VTktOT1dOLAotCQlSMzAwX1JTX0lOVEVSUF8zX1VOS05PV04sCi0JCTB4MDAsCi0JCTB4MDAsCi0JCTB4MDAsCi0JCTB4MDAKLQl9OworCUdMdWludCBpbnRlcnBfY29sWzhdOworICAgICAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOworCXN0cnVjdCB2ZXJ0ZXhfYnVmZmVyICpWQiA9ICZ0bmwtPnZiOwogCXVuaW9uIHIzMDBfb3V0cHV0c193cml0dGVuIE91dHB1dHNXcml0dGVuOwogCUdMdWludCBJbnB1dHNSZWFkOwogCWludCBmcF9yZWcsIGhpZ2hfcnI7Ci0JaW50IGluX3RleGNvb3JkcywgY29sX2ludGVycF9ucjsKLQlpbnQgaTsKKwlpbnQgY29sX2ludGVycF9ucjsKKwlpbnQgcnNfdGV4X2NvdW50ID0gMCwgcnNfY29sX2NvdW50ID0gMDsKKwlpbnQgaSwgY291bnQ7CisKKwltZW1zZXQoaW50ZXJwX2NvbCwgMCwgc2l6ZW9mKGludGVycF9jb2wpKTsKIAogCWlmIChod190Y2xfb24pCiAJCU91dHB1dHNXcml0dGVuLnZwX291dHB1dHMgPSBDVVJSRU5UX1ZFUlRFWF9TSEFERVIoY3R4KS0+a2V5Lk91dHB1dHNXcml0dGVuOwpAQCAtMTQyOCw5ICsxNjM5LDkgQEAKIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHJjKTsKIAlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIHJyKTsKIAotCWZwX3JlZyA9IGluX3RleGNvb3JkcyA9IGNvbF9pbnRlcnBfbnIgPSBoaWdoX3JyID0gMDsKKwlmcF9yZWcgPSBjb2xfaW50ZXJwX25yID0gaGlnaF9yciA9IDA7CiAKLQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9ST1VURV8xXSA9IDA7CisJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8xXSA9IDA7CiAKIAlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX1dQT1MpIHsKIAkJZm9yIChpID0gMDsgaSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyBpKyspCkBAIC0xNDQ2LDE1ICsxNjU3LDUzIEBACiAJCUlucHV0c1JlYWQgJj0gfkZSQUdfQklUX1dQT1M7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyBpKyspIHsKLQkJcjMwMC0+aHcucmkuY21kW1IzMDBfUklfSU5URVJQXzAgKyBpXSA9IDAgfCBSMzAwX1JTX0lOVEVSUF9VU0VEIHwgKGluX3RleGNvb3JkcyA8PCBSMzAwX1JTX0lOVEVSUF9TUkNfU0hJRlQpCi0JCSAgICB8IGludGVycF9tYWdpY1tpXTsKKwlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDApIHsKKwkJY291bnQgPSBWQi0+QXR0cmliUHRyW19UTkxfQVRUUklCX0NPTE9SMF0tPnNpemU7CisJCWludGVycF9jb2xbMF0gfD0gUjMwMF9SU19DT0xfUFRSKHJzX2NvbF9jb3VudCk7CisJCWlmIChjb3VudCA9PSAzKQorCQkJaW50ZXJwX2NvbFswXSB8PSBSMzAwX1JTX0NPTF9GTVQoUjMwMF9SU19DT0xfRk1UX1JHQjEpOworCQlyc19jb2xfY291bnQgKz0gY291bnQ7CisJfQorCWVsc2UKKwkJaW50ZXJwX2NvbFswXSA9IFIzMDBfUlNfQ09MX0ZNVChSMzAwX1JTX0NPTF9GTVRfMDAwMSk7CiAKLQkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfUk9VVEVfMCArIGZwX3JlZ10gPSAwOworCWlmIChJbnB1dHNSZWFkICYgRlJBR19CSVRfQ09MMSkgeworCQljb3VudCA9IFZCLT5BdHRyaWJQdHJbX1ROTF9BVFRSSUJfQ09MT1IxXS0+c2l6ZTsKKwkJaWYgKGNvdW50ID09IDMpCisJCQlpbnRlcnBfY29sWzFdIHw9IFIzMDBfUlNfQ09MX0ZNVChSMzAwX1JTX0NPTF9GTVRfUkdCMCk7CisJCWludGVycF9jb2xbMV0gfD0gUjMwMF9SU19DT0xfUFRSKDEpOworCQlyc19jb2xfY291bnQgKz0gY291bnQ7CisJfQorCisKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IGkrKykgeworCQlpbnQgc3dpejsKKworCQkvKiB3aXRoIFRDTCB3ZSBhbHdheXMgc2VlbSB0byByb3V0ZSA0IGNvbXBvbmVudHMgKi8KKwkJaWYgKGh3X3RjbF9vbikKKwkJICBjb3VudCA9IDQ7CisJCWVsc2UKKwkJICBjb3VudCA9IFZCLT5BdHRyaWJQdHJbX1ROTF9BVFRSSUJfVEVYKGkpXS0+c2l6ZTsKKworCQlyMzAwLT5ody5yaS5jbWRbUjMwMF9SSV9JTlRFUlBfMCArIGldID0gaW50ZXJwX2NvbFtpXSB8IHJzX3RleF9jb3VudDsKKwkJc3dpdGNoKGNvdW50KSB7CisJCWNhc2UgNDogc3dpeiA9IFIzMDBfUlNfU0VMX1MoMCkgfCBSMzAwX1JTX1NFTF9UKDEpIHwgUjMwMF9SU19TRUxfUigyKSB8IFIzMDBfUlNfU0VMX1EoMyk7IGJyZWFrOworCQljYXNlIDM6IHN3aXogPSBSMzAwX1JTX1NFTF9TKDApIHwgUjMwMF9SU19TRUxfVCgxKSB8IFIzMDBfUlNfU0VMX1IoMikgfCBSMzAwX1JTX1NFTF9RKFIzMDBfUlNfU0VMX0sxKTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMToKKwkJY2FzZSAyOiBzd2l6ID0gUjMwMF9SU19TRUxfUygwKSB8IFIzMDBfUlNfU0VMX1QoMSkgfCBSMzAwX1JTX1NFTF9SKFIzMDBfUlNfU0VMX0swKSB8IFIzMDBfUlNfU0VMX1EoUjMwMF9SU19TRUxfSzEpOyBicmVhazsKKwkJfTsKKworCQlyMzAwLT5ody5yaS5jbWRbUjMwMF9SSV9JTlRFUlBfMCArIGldIHw9IHN3aXo7CisKKwkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8wICsgZnBfcmVnXSA9IDA7CiAJCWlmIChJbnB1dHNSZWFkICYgKEZSQUdfQklUX1RFWDAgPDwgaSkpIHsKKworCQkJcnNfdGV4X2NvdW50ICs9IGNvdW50OworCiAJCQkvL2Fzc2VydChyMzAwLT5zdGF0ZS50ZXh0dXJlLnRjX2NvdW50ICE9IDApOwotCQkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfUk9VVEVfMCArIGZwX3JlZ10gfD0gUjMwMF9SU19ST1VURV9FTkFCTEUgfCBpCS8qIHNvdXJjZSBJTlRFUlAgKi8KLQkJCSAgICB8IChmcF9yZWcgPDwgUjMwMF9SU19ST1VURV9ERVNUX1NISUZUKTsKKwkJCXIzMDAtPmh3LnJyLmNtZFtSMzAwX1JSX0lOU1RfMCArIGZwX3JlZ10gfD0gUjMwMF9SU19JTlNUX1RFWF9DTl9XUklURSB8IGkJLyogc291cmNlIElOVEVSUCAqLworCQkJICAgIHwgKGZwX3JlZyA8PCBSMzAwX1JTX0lOU1RfVEVYX0FERFJfU0hJRlQpOwogCQkJaGlnaF9yciA9IGZwX3JlZzsKIAogCQkJLyogUGFzc2luZyBpbnZhbGlkIGRhdGEgaGVyZSBjYW4gbG9jayB0aGUgR1BVLiAqLwpAQCAtMTQ2NSwxNSArMTcxNCwxMSBAQAogCQkJCVdBUk5fT05DRSgiZnJhZ3Byb2cgd2FudHMgY29vcmRzIGZvciB0ZXglZCwgdnAgZG9lc24ndCBwcm92aWRlIHRoZW0hXG4iLCBpKTsKIAkJCX0KIAkJfQotCQkvKiBOZWVkIHRvIGNvdW50IGFsbCBjb29yZHMgZW5hYmxlZCBhdCB2b2YgKi8KLQkJaWYgKFIzMDBfT1VUUFVUU19XUklUVEVOX1RFU1QoT3V0cHV0c1dyaXR0ZW4sIFZFUlRfUkVTVUxUX1RFWDAgKyBpLCBfVE5MX0FUVFJJQl9URVgoaSkpKSB7Ci0JCQlpbl90ZXhjb29yZHMrKzsKLQkJfQogCX0KIAogCWlmIChJbnB1dHNSZWFkICYgRlJBR19CSVRfQ09MMCkgewogCQlpZiAoUjMwMF9PVVRQVVRTX1dSSVRURU5fVEVTVChPdXRwdXRzV3JpdHRlbiwgVkVSVF9SRVNVTFRfQ09MMCwgX1ROTF9BVFRSSUJfQ09MT1IwKSkgewotCQkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfUk9VVEVfMF0gfD0gMCB8IFIzMDBfUlNfUk9VVEVfMF9DT0xPUiB8IChmcF9yZWcrKyA8PCBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9TSElGVCk7CisJCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9JTlNUXzBdIHw9IFIzMDBfUlNfSU5TVF9DT0xfSUQoMCkgfCBSMzAwX1JTX0lOU1RfQ09MX0NOX1dSSVRFIHwgKGZwX3JlZysrIDw8IFIzMDBfUlNfSU5TVF9DT0xfQUREUl9TSElGVCk7CiAJCQlJbnB1dHNSZWFkICY9IH5GUkFHX0JJVF9DT0wwOwogCQkJY29sX2ludGVycF9ucisrOwogCQl9IGVsc2UgewpAQCAtMTQ4Myw3ICsxNzI4LDE2NyBAQAogCiAJaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wxKSB7CiAJCWlmIChSMzAwX09VVFBVVFNfV1JJVFRFTl9URVNUKE91dHB1dHNXcml0dGVuLCBWRVJUX1JFU1VMVF9DT0wxLCBfVE5MX0FUVFJJQl9DT0xPUjEpKSB7Ci0JCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9ST1VURV8xXSB8PSBSMzAwX1JTX1JPVVRFXzFfVU5LTk9XTjExIHwgUjMwMF9SU19ST1VURV8xX0NPTE9SMSB8IChmcF9yZWcrKyA8PCBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxX0RFU1RfU0hJRlQpOworCQkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8xXSB8PSBSMzAwX1JTX0lOU1RfQ09MX0lEKDEpIHwgUjMwMF9SU19JTlNUX0NPTF9DTl9XUklURSB8IChmcF9yZWcrKyA8PCBSMzAwX1JTX0lOU1RfQ09MX0FERFJfU0hJRlQpOworCQkJSW5wdXRzUmVhZCAmPSB+RlJBR19CSVRfQ09MMTsKKwkJCWlmIChoaWdoX3JyIDwgMSkKKwkJCQloaWdoX3JyID0gMTsKKwkJCWNvbF9pbnRlcnBfbnIrKzsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT05DRSgiZnJhZ3Byb2cgd2FudHMgY29sMSwgdnAgZG9lc24ndCBwcm92aWRlIGl0XG4iKTsKKwkJfQorCX0KKworCS8qIE5lZWQgYXQgbGVhc3Qgb25lLiBUaGlzIG1pZ2h0IHN0aWxsIGxvY2sgYXMgdGhlIHZhbHVlcyBhcmUgdW5kZWZpbmVkLi4uICovCisJaWYgKHJzX3RleF9jb3VudCA9PSAwICYmIGNvbF9pbnRlcnBfbnIgPT0gMCkgeworCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9JTlNUXzBdIHw9IFIzMDBfUlNfSU5TVF9DT0xfSUQoMCkgfCBSMzAwX1JTX0lOU1RfQ09MX0NOX1dSSVRFIHwgKGZwX3JlZysrIDw8IFIzMDBfUlNfSU5TVF9DT0xfQUREUl9TSElGVCk7CisJCWNvbF9pbnRlcnBfbnIrKzsKKwl9CisKKwlyMzAwLT5ody5yYy5jbWRbMV0gPSAwIHwgKHJzX3RleF9jb3VudCA8PCBSMzAwX0lUX0NPVU5UX1NISUZUKQorCSAgfCAoY29sX2ludGVycF9uciA8PCBSMzAwX0lDX0NPVU5UX1NISUZUKQorCSAgfCBSMzAwX0hJUkVTX0VOOworCisJYXNzZXJ0KGhpZ2hfcnIgPj0gMCk7CisJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1JTX0lOU1RfMCwgaGlnaF9yciArIDEpOworCXIzMDAtPmh3LnJjLmNtZFsyXSA9IGhpZ2hfcnI7CisKKwlpZiAoSW5wdXRzUmVhZCkKKwkJV0FSTl9PTkNFKCJEb24ndCBrbm93IGhvdyB0byBzYXRpc2Z5IElucHV0c1JlYWQ9MHglMDh4XG4iLCBJbnB1dHNSZWFkKTsKK30KKworc3RhdGljIHZvaWQgcjUwMFNldHVwUlNVbml0KEdMY29udGV4dCAqIGN0eCkKK3sKKwlyMzAwQ29udGV4dFB0ciByMzAwID0gUjMwMF9DT05URVhUKGN0eCk7CisJLyogSSdtIHN0aWxsIHVuc3VyZSBpZiB0aGVzZSBhcmUgbmVlZGVkICovCisJR0x1aW50IGludGVycF9jb2xbOF07CisJdW5pb24gcjMwMF9vdXRwdXRzX3dyaXR0ZW4gT3V0cHV0c1dyaXR0ZW47CisgICAgICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CisJc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJnRubC0+dmI7CisJR0x1aW50IElucHV0c1JlYWQ7CisJaW50IGZwX3JlZywgaGlnaF9ycjsKKwlpbnQgcnNfY29sX2NvdW50ID0gMDsKKwlpbnQgaW5fdGV4Y29vcmRzLCBjb2xfaW50ZXJwX25yOworCWludCBpLCBjb3VudDsKKworCW1lbXNldChpbnRlcnBfY29sLCAwLCBzaXplb2YoaW50ZXJwX2NvbCkpOworCWlmIChod190Y2xfb24pCisJCU91dHB1dHNXcml0dGVuLnZwX291dHB1dHMgPSBDVVJSRU5UX1ZFUlRFWF9TSEFERVIoY3R4KS0+a2V5Lk91dHB1dHNXcml0dGVuOworCWVsc2UKKwkJUkVOREVSSU5QVVRTX0NPUFkoT3V0cHV0c1dyaXR0ZW4uaW5kZXhfYml0c2V0LCByMzAwLT5zdGF0ZS5yZW5kZXJfaW5wdXRzX2JpdHNldCk7CisKKwlpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQpCisJCUlucHV0c1JlYWQgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudC0+QmFzZS5JbnB1dHNSZWFkOworCWVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50ISFcbiIpOworCQlyZXR1cm47CQkvKiBUaGlzIHNob3VsZCBvbmx5IGV2ZXIgaGFwcGVuIG9uY2UuLiAqLworCX0KKworCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcmkpOworCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcmMpOworCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgcnIpOworCisJZnBfcmVnID0gY29sX2ludGVycF9uciA9IGhpZ2hfcnIgPSBpbl90ZXhjb29yZHMgPSAwOworCisJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8xXSA9IDA7CisKKwlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX1dQT1MpIHsKKwkJZm9yIChpID0gMDsgaSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyBpKyspCisJCQlpZiAoIShJbnB1dHNSZWFkICYgKEZSQUdfQklUX1RFWDAgPDwgaSkpKQorCQkJCWJyZWFrOworCisJCWlmIChpID09IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlx0bm8gZnJlZSB0ZXhjb29yZCBmb3VuZC4uLlxuIik7CisJCQlfbWVzYV9leGl0KC0xKTsKKwkJfQorCisJCUlucHV0c1JlYWQgfD0gKEZSQUdfQklUX1RFWDAgPDwgaSk7CisJCUlucHV0c1JlYWQgJj0gfkZSQUdfQklUX1dQT1M7CisJfQorCisJaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wwKSB7CisJCWNvdW50ID0gVkItPkF0dHJpYlB0cltfVE5MX0FUVFJJQl9DT0xPUjBdLT5zaXplOworCQlpbnRlcnBfY29sWzBdIHw9IFI1MDBfUlNfQ09MX1BUUihyc19jb2xfY291bnQpOworCQlpZiAoY291bnQgPT0gMykKKwkJCWludGVycF9jb2xbMF0gfD0gUjUwMF9SU19DT0xfRk1UKFIzMDBfUlNfQ09MX0ZNVF9SR0IxKTsKKwkJcnNfY29sX2NvdW50ICs9IGNvdW50OworCX0KKwllbHNlCisJCWludGVycF9jb2xbMF0gPSBSNTAwX1JTX0NPTF9GTVQoUjMwMF9SU19DT0xfRk1UXzAwMDEpOworCisJaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wxKSB7CisJCWNvdW50ID0gVkItPkF0dHJpYlB0cltfVE5MX0FUVFJJQl9DT0xPUjFdLT5zaXplOworCQlpbnRlcnBfY29sWzFdIHw9IFI1MDBfUlNfQ09MX1BUUigxKTsKKwkJaWYgKGNvdW50ID09IDMpCisJCQlpbnRlcnBfY29sWzFdIHw9IFI1MDBfUlNfQ09MX0ZNVChSMzAwX1JTX0NPTF9GTVRfUkdCMCk7CisJCXJzX2NvbF9jb3VudCArPSBjb3VudDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IGkrKykgeworCQlHTHVpbnQgc3dpeiA9IDA7CisKKwkJLyogd2l0aCBUQ0wgd2UgYWx3YXlzIHNlZW0gdG8gcm91dGUgNCBjb21wb25lbnRzICovCisJCWlmIChJbnB1dHNSZWFkICYgKEZSQUdfQklUX1RFWDAgPDwgaSkpIHsKKworCQkgIGlmIChod190Y2xfb24pCisJCSAgICBjb3VudCA9IDQ7CisJCSAgZWxzZQorCQkgICAgY291bnQgPSBWQi0+QXR0cmliUHRyW19UTkxfQVRUUklCX1RFWChpKV0tPnNpemU7CisKKwkJICAvKiBhbHdheXMgaGF2ZSBvbiB0ZXhjb29yZCAqLworCQkgIHN3aXogfD0gaW5fdGV4Y29vcmRzKysgPDwgUjUwMF9SU19JUF9URVhfUFRSX1NfU0hJRlQ7CisJCSAgaWYgKGNvdW50ID49IDIpCisJCSAgICBzd2l6IHw9IGluX3RleGNvb3JkcysrIDw8IFI1MDBfUlNfSVBfVEVYX1BUUl9UX1NISUZUOworCQkgIGVsc2UKKwkJICAgIHN3aXogfD0gUjUwMF9SU19JUF9QVFJfSzAgPDwgUjUwMF9SU19JUF9URVhfUFRSX1RfU0hJRlQ7CisKKwkJICBpZiAoY291bnQgPj0gMykKKwkJICAgIHN3aXogfD0gaW5fdGV4Y29vcmRzKysgPDwgUjUwMF9SU19JUF9URVhfUFRSX1JfU0hJRlQ7CisJCSAgZWxzZQorCQkgICAgc3dpeiB8PSBSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUl9TSElGVDsKKworCQkgIGlmIChjb3VudCA9PSA0KQorCQkgICAgc3dpeiB8PSBpbl90ZXhjb29yZHMrKyA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUV9TSElGVDsKKwkJICBlbHNlCisJCSAgICBzd2l6IHw9IFI1MDBfUlNfSVBfUFRSX0sxIDw8IFI1MDBfUlNfSVBfVEVYX1BUUl9RX1NISUZUOworCisJCX0gZWxzZQorCQkgICBzd2l6ID0gKFI1MDBfUlNfSVBfUFRSX0swIDw8IFI1MDBfUlNfSVBfVEVYX1BUUl9TX1NISUZUKSB8CisJCSAgICAgICAgICAoUjUwMF9SU19JUF9QVFJfSzAgPDwgUjUwMF9SU19JUF9URVhfUFRSX1RfU0hJRlQpIHwKKwkJICAgICAgICAgIChSNTAwX1JTX0lQX1BUUl9LMCA8PCBSNTAwX1JTX0lQX1RFWF9QVFJfUl9TSElGVCkgfAorCQkgICAgICAgICAgKFI1MDBfUlNfSVBfUFRSX0sxIDw8IFI1MDBfUlNfSVBfVEVYX1BUUl9RX1NISUZUKTsKKworCQlyMzAwLT5ody5yaS5jbWRbUjMwMF9SSV9JTlRFUlBfMCArIGldID0gaW50ZXJwX2NvbFtpXSB8IHN3aXo7CisKKwkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8wICsgZnBfcmVnXSA9IDA7CisJCWlmIChJbnB1dHNSZWFkICYgKEZSQUdfQklUX1RFWDAgPDwgaSkpIHsKKwkJCS8vYXNzZXJ0KHIzMDAtPnN0YXRlLnRleHR1cmUudGNfY291bnQgIT0gMCk7CisJCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9JTlNUXzAgKyBmcF9yZWddIHw9IFI1MDBfUlNfSU5TVF9URVhfQ05fV1JJVEUgfCBpCS8qIHNvdXJjZSBJTlRFUlAgKi8KKwkJCSAgICB8IChmcF9yZWcgPDwgUjUwMF9SU19JTlNUX1RFWF9BRERSX1NISUZUKTsKKwkJCWhpZ2hfcnIgPSBmcF9yZWc7CisKKwkJCS8qIFBhc3NpbmcgaW52YWxpZCBkYXRhIGhlcmUgY2FuIGxvY2sgdGhlIEdQVS4gKi8KKwkJCWlmIChSMzAwX09VVFBVVFNfV1JJVFRFTl9URVNUKE91dHB1dHNXcml0dGVuLCBWRVJUX1JFU1VMVF9URVgwICsgaSwgX1ROTF9BVFRSSUJfVEVYKGkpKSkgeworCQkJCUlucHV0c1JlYWQgJj0gfihGUkFHX0JJVF9URVgwIDw8IGkpOworCQkJCWZwX3JlZysrOworCQkJfSBlbHNlIHsKKwkJCQlXQVJOX09OQ0UoImZyYWdwcm9nIHdhbnRzIGNvb3JkcyBmb3IgdGV4JWQsIHZwIGRvZXNuJ3QgcHJvdmlkZSB0aGVtIVxuIiwgaSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDApIHsKKwkJaWYgKFIzMDBfT1VUUFVUU19XUklUVEVOX1RFU1QoT3V0cHV0c1dyaXR0ZW4sIFZFUlRfUkVTVUxUX0NPTDAsIF9UTkxfQVRUUklCX0NPTE9SMCkpIHsKKwkJCXIzMDAtPmh3LnJyLmNtZFtSMzAwX1JSX0lOU1RfMF0gfD0gUjUwMF9SU19JTlNUX0NPTF9DTl9XUklURSB8IChmcF9yZWcrKyA8PCBSNTAwX1JTX0lOU1RfQ09MX0FERFJfU0hJRlQpOworCQkJSW5wdXRzUmVhZCAmPSB+RlJBR19CSVRfQ09MMDsKKwkJCWNvbF9pbnRlcnBfbnIrKzsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT05DRSgiZnJhZ3Byb2cgd2FudHMgY29sMCwgdnAgZG9lc24ndCBwcm92aWRlIGl0XG4iKTsKKwkJfQorCX0KKworCWlmIChJbnB1dHNSZWFkICYgRlJBR19CSVRfQ09MMSkgeworCQlpZiAoUjMwMF9PVVRQVVRTX1dSSVRURU5fVEVTVChPdXRwdXRzV3JpdHRlbiwgVkVSVF9SRVNVTFRfQ09MMSwgX1ROTF9BVFRSSUJfQ09MT1IxKSkgeworCQkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8xXSB8PSAoMSA8PCAxMikgfCBSNTAwX1JTX0lOU1RfQ09MX0NOX1dSSVRFIHwgIChmcF9yZWcrKyA8PCBSNTAwX1JTX0lOU1RfQ09MX0FERFJfU0hJRlQpOwogCQkJSW5wdXRzUmVhZCAmPSB+RlJBR19CSVRfQ09MMTsKIAkJCWlmIChoaWdoX3JyIDwgMSkKIAkJCQloaWdoX3JyID0gMTsKQEAgLTE0OTUsMjIgKzE5MDAsMjUgQEAKIAogCS8qIE5lZWQgYXQgbGVhc3Qgb25lLiBUaGlzIG1pZ2h0IHN0aWxsIGxvY2sgYXMgdGhlIHZhbHVlcyBhcmUgdW5kZWZpbmVkLi4uICovCiAJaWYgKGluX3RleGNvb3JkcyA9PSAwICYmIGNvbF9pbnRlcnBfbnIgPT0gMCkgewotCQlyMzAwLT5ody5yci5jbWRbUjMwMF9SUl9ST1VURV8wXSB8PSAwIHwgUjMwMF9SU19ST1VURV8wX0NPTE9SIHwgKGZwX3JlZysrIDw8IFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX1NISUZUKTsKKwkJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfSU5TVF8wXSB8PSAwIHwgUjUwMF9SU19JTlNUX0NPTF9DTl9XUklURSB8IChmcF9yZWcrKyA8PCBSNTAwX1JTX0lOU1RfQ09MX0FERFJfU0hJRlQpOwogCQljb2xfaW50ZXJwX25yKys7CiAJfQogCi0JcjMwMC0+aHcucmMuY21kWzFdID0gMCB8IChpbl90ZXhjb29yZHMgPDwgUjMwMF9SU19DTlRMX1RDX0NOVF9TSElGVCkKLQkgICAgfCAoY29sX2ludGVycF9uciA8PCBSMzAwX1JTX0NOVExfQ0lfQ05UX1NISUZUKQotCSAgICB8IFIzMDBfUlNfQ05UTF8wX1VOS05PV05fMTg7CisJcjMwMC0+aHcucmMuY21kWzFdID0gMCB8IChpbl90ZXhjb29yZHMgPDwgUjMwMF9JVF9DT1VOVF9TSElGVCkKKwkgIHwgKGNvbF9pbnRlcnBfbnIgPDwgUjMwMF9JQ19DT1VOVF9TSElGVCkKKwkgIHwgUjMwMF9ISVJFU19FTjsKIAogCWFzc2VydChoaWdoX3JyID49IDApOwotCXIzMDAtPmh3LnJyLmNtZFtSMzAwX1JSX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9SU19ST1VURV8wLCBoaWdoX3JyICsgMSk7CisJcjMwMC0+aHcucnIuY21kW1IzMDBfUlJfQ01EXzBdID0gY21kcGFja2V0MChSNTAwX1JTX0lOU1RfMCwgaGlnaF9yciArIDEpOwogCXIzMDAtPmh3LnJjLmNtZFsyXSA9IDB4QzAgfCBoaWdoX3JyOwogCiAJaWYgKElucHV0c1JlYWQpCiAJCVdBUk5fT05DRSgiRG9uJ3Qga25vdyBob3cgdG8gc2F0aXNmeSBJbnB1dHNSZWFkPTB4JTA4eFxuIiwgSW5wdXRzUmVhZCk7CiB9CiAKKworCisKICNkZWZpbmUgYnVtcF92cHVfY291bnQocHRyLCBuZXdfY291bnQpICAgZG97XAogCWRybV9yMzAwX2NtZF9oZWFkZXJfdCogX3A9KChkcm1fcjMwMF9jbWRfaGVhZGVyX3QqKShwdHIpKTtcCiAJaW50IF9uYz0obmV3X2NvdW50KS80OyBcCkBAIC0xNTE4LDcgKzE5MjYsNyBAQAogCWlmKF9uYz5fcC0+dnB1LmNvdW50KV9wLT52cHUuY291bnQ9X25jO1wKIAl9d2hpbGUoMCkKIAotc3RhdGljIGlubGluZSB2b2lkIHIzMDBTZXR1cFZlcnRleFByb2dyYW1GcmFnbWVudChyMzAwQ29udGV4dFB0ciByMzAwLCBpbnQgZGVzdCwgc3RydWN0IHIzMDBfdmVydGV4X3NoYWRlcl9mcmFnbWVudCAqdnNmKQorc3RhdGljIElOTElORSB2b2lkIHIzMDBTZXR1cFZlcnRleFByb2dyYW1GcmFnbWVudChyMzAwQ29udGV4dFB0ciByMzAwLCBpbnQgZGVzdCwgc3RydWN0IHIzMDBfdmVydGV4X3NoYWRlcl9mcmFnbWVudCAqdnNmKQogewogCWludCBpOwogCkBAIC0xNTU2LDEwICsxOTY0LDY4IEBACiAJfQogfQogCisjZGVmaW5lIE1JTjMoYSwgYiwgYykJKChhKSA8IChiKSA/IE1JTjIoYSwgYykgOiBNSU4yKGIsIGMpKQorCisKK3N0YXRpYyB2b2lkIHIzMDBWYXBDbnRsKHIzMDBDb250ZXh0UHRyIHJtZXNhLCBHTHVpbnQgaW5wdXRfY291bnQsCisJCQlHTHVpbnQgb3V0cHV0X2NvdW50LCBHTHVpbnQgdGVtcF9jb3VudCkKK3sKKyAgICBpbnQgdnR4X21lbV9zaXplOworICAgIGludCBwdnNfbnVtX3Nsb3RzOworICAgIGludCBwdnNfbnVtX2NudHJsczsKKworICAgIC8qIEZsdXNoIFBWUyBlbmdpbmUgYmVmb3JlIGNoYW5naW5nIFBWU19OVU1fU0xPVFMsIFBWU19OVU1fQ05UUkxTLgorICAgICAqIFNlZSByNTAwIGRvY3MgNi41LjIgLSBkb25lIGluIGVtaXQgKi8KKworICAgIC8qIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gKi8KKyAgICBpZiAoaW5wdXRfY291bnQgPT0gMCkgaW5wdXRfY291bnQgPSAxOworICAgIGlmIChvdXRwdXRfY291bnQgPT0gMCkgb3V0cHV0X2NvdW50ID0gMTsKKyAgICBpZiAodGVtcF9jb3VudCA9PSAwKSB0ZW1wX2NvdW50ID0gMTsKKworICAgIGlmIChybWVzYS0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPj0gQ0hJUF9GQU1JTFlfUlY1MTUpCisJdnR4X21lbV9zaXplID0gMTI4OworICAgIGVsc2UKKwl2dHhfbWVtX3NpemUgPSA3MjsKKworICAgIHB2c19udW1fc2xvdHMgPSBNSU4zKDEwLCB2dHhfbWVtX3NpemUvaW5wdXRfY291bnQsIHZ0eF9tZW1fc2l6ZS9vdXRwdXRfY291bnQpOworICAgIHB2c19udW1fY250cmxzID0gTUlOMig2LCB2dHhfbWVtX3NpemUvdGVtcF9jb3VudCk7CisKKyAgICBSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCB2YXBfY250bCk7CisgICAgaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZsYWdzICYgUkFERU9OX0NISVBTRVRfVENMKSB7CisJcm1lc2EtPmh3LnZhcF9jbnRsLmNtZFtSMzAwX1ZBUF9DTlRMX0lOU1RSXSA9CisJICAgIChwdnNfbnVtX3Nsb3RzIDw8IFIzMDBfUFZTX05VTV9TTE9UU19TSElGVCkgfAorCSAgICAocHZzX251bV9jbnRybHMgPDwgUjMwMF9QVlNfTlVNX0NOVExSU19TSElGVCkgfAorCSAgICAoMTIgPDwgUjMwMF9WRl9NQVhfVlRYX05VTV9TSElGVCk7CisJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkKKwkgICAgcm1lc2EtPmh3LnZhcF9jbnRsLmNtZFtSMzAwX1ZBUF9DTlRMX0lOU1RSXSB8PSBSNTAwX1RDTF9TVEFURV9PUFRJTUlaQVRJT047CisgICAgfSBlbHNlCisJLyogbm90IHN1cmUgYWJvdXQgbm9uLXRjbCAqLworCXJtZXNhLT5ody52YXBfY250bC5jbWRbUjMwMF9WQVBfQ05UTF9JTlNUUl0gPSAoKDEwIDw8IFIzMDBfUFZTX05VTV9TTE9UU19TSElGVCkgfAorCQkJCSAgICAoNSA8PCBSMzAwX1BWU19OVU1fQ05UTFJTX1NISUZUKSB8CisJCQkJICAgICg1IDw8IFIzMDBfVkZfTUFYX1ZUWF9OVU1fU0hJRlQpKTsKKworICAgIGlmIChybWVzYS0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1MTUpCisJcm1lc2EtPmh3LnZhcF9jbnRsLmNtZFtSMzAwX1ZBUF9DTlRMX0lOU1RSXSB8PSAoMiA8PCBSMzAwX1BWU19OVU1fRlBVU19TSElGVCk7CisgICAgZWxzZSBpZiAoKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjUzMCkgfHwKKwkgICAgIChybWVzYS0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlY1NjApIHx8CisJICAgICAocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1JWNTcwKSkKKwlybWVzYS0+aHcudmFwX2NudGwuY21kW1IzMDBfVkFQX0NOVExfSU5TVFJdIHw9ICg1IDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKyAgICBlbHNlIGlmICgocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1JWNDEwKSB8fAorCSAgICAgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA9PSBDSElQX0ZBTUlMWV9SNDIwKSkKKwlybWVzYS0+aHcudmFwX2NudGwuY21kW1IzMDBfVkFQX0NOVExfSU5TVFJdIHw9ICg2IDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKyAgICBlbHNlIGlmICgocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1I1MjApIHx8CisJICAgICAocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1I1ODApKQorCXJtZXNhLT5ody52YXBfY250bC5jbWRbUjMwMF9WQVBfQ05UTF9JTlNUUl0gfD0gKDggPDwgUjMwMF9QVlNfTlVNX0ZQVVNfU0hJRlQpOworICAgIGVsc2UKKwlybWVzYS0+aHcudmFwX2NudGwuY21kW1IzMDBfVkFQX0NOVExfSU5TVFJdIHw9ICg0IDw8IFIzMDBfUFZTX05VTV9GUFVTX1NISUZUKTsKKworfQorCiBzdGF0aWMgdm9pZCByMzAwU2V0dXBEZWZhdWx0VmVydGV4UHJvZ3JhbShyMzAwQ29udGV4dFB0ciBybWVzYSkKIHsKIAlzdHJ1Y3QgcjMwMF92ZXJ0ZXhfc2hhZGVyX3N0YXRlICpwcm9nID0gJihybWVzYS0+c3RhdGUudmVydGV4X3NoYWRlcik7CiAJR0x1aW50IG9fcmVnID0gMDsKKwlHTHVpbnQgaV9yZWcgPSAwOwogCWludCBpOwogCWludCBpbnN0X2NvdW50ID0gMDsKIAlpbnQgcGFyYW1fY291bnQgPSAwOwpAQCAtMTU2NywzMSArMjAzMyw0MiBAQAogCiAJZm9yIChpID0gVkVSVF9BVFRSSUJfUE9TOyBpIDwgVkVSVF9BVFRSSUJfTUFYOyBpKyspIHsKIAkJaWYgKHJtZXNhLT5zdGF0ZS5zd190Y2xfaW5wdXRzW2ldICE9IC0xKSB7Ci0JCQlwcm9nLT5wcm9ncmFtLmJvZHkuaVtwcm9ncmFtX2VuZCArIDBdID0gRUFTWV9WU0ZfT1AoTVVMLCBvX3JlZysrLCBBTEwsIFJFU1VMVCk7Ci0JCQlwcm9nLT5wcm9ncmFtLmJvZHkuaVtwcm9ncmFtX2VuZCArIDFdID0gVlNGX1JFRyhybWVzYS0+c3RhdGUuc3dfdGNsX2lucHV0c1tpXSk7Ci0JCQlwcm9nLT5wcm9ncmFtLmJvZHkuaVtwcm9ncmFtX2VuZCArIDJdID0gVlNGX0FUVFJfVU5JVFkocm1lc2EtPnN0YXRlLnN3X3RjbF9pbnB1dHNbaV0pOwotCQkJcHJvZy0+cHJvZ3JhbS5ib2R5LmlbcHJvZ3JhbV9lbmQgKyAzXSA9IFZTRl9VTklUWShybWVzYS0+c3RhdGUuc3dfdGNsX2lucHV0c1tpXSk7CisJCQlwcm9nLT5wcm9ncmFtLmJvZHkuaVtwcm9ncmFtX2VuZCArIDBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX01VTFRJUExZLCBHTF9GQUxTRSwgR0xfRkFMU0UsIG9fcmVnKyssIFZTRl9GTEFHX0FMTCwgUFZTX0RTVF9SRUdfT1VUKTsKKwkJCXByb2ctPnByb2dyYW0uYm9keS5pW3Byb2dyYW1fZW5kICsgMV0gPSBQVlNfU1JDX09QRVJBTkQocm1lc2EtPnN0YXRlLnN3X3RjbF9pbnB1dHNbaV0sIFBWU19TUkNfU0VMRUNUX1gsIFBWU19TUkNfU0VMRUNUX1ksIFBWU19TUkNfU0VMRUNUX1osIFBWU19TUkNfU0VMRUNUX1csIFBWU19TUkNfUkVHX0lOUFVULCBWU0ZfRkxBR19OT05FKTsKKwkJCXByb2ctPnByb2dyYW0uYm9keS5pW3Byb2dyYW1fZW5kICsgMl0gPSBQVlNfU1JDX09QRVJBTkQocm1lc2EtPnN0YXRlLnN3X3RjbF9pbnB1dHNbaV0sIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfUkVHX0lOUFVULCBWU0ZfRkxBR19OT05FKTsKKwkJCXByb2ctPnByb2dyYW0uYm9keS5pW3Byb2dyYW1fZW5kICsgM10gPSBQVlNfU1JDX09QRVJBTkQocm1lc2EtPnN0YXRlLnN3X3RjbF9pbnB1dHNbaV0sIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzEsIFBWU19TUkNfUkVHX0lOUFVULCBWU0ZfRkxBR19OT05FKTsKIAkJCXByb2dyYW1fZW5kICs9IDQ7CisJCQlpX3JlZysrOwogCQl9CiAJfQogCiAJcHJvZy0+cHJvZ3JhbS5sZW5ndGggPSBwcm9ncmFtX2VuZDsKIAotCXIzMDBTZXR1cFZlcnRleFByb2dyYW1GcmFnbWVudChybWVzYSwgUjMwMF9QVlNfVVBMT0FEX1BST0dSQU0sCisJcjMwMFNldHVwVmVydGV4UHJvZ3JhbUZyYWdtZW50KHJtZXNhLCBSMzAwX1BWU19DT0RFX1NUQVJULAogCQkJCSAgICAgICAmKHByb2ctPnByb2dyYW0pKTsKIAlpbnN0X2NvdW50ID0gKHByb2ctPnByb2dyYW0ubGVuZ3RoIC8gNCkgLSAxOwogCisJcjMwMFZhcENudGwocm1lc2EsIGlfcmVnLCBvX3JlZywgMCk7CisKIAlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCBwdnMpOwogCXJtZXNhLT5ody5wdnMuY21kW1IzMDBfUFZTX0NOVExfMV0gPQotCSAgICAoMCA8PCBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCkgfAotCSAgICAoaW5zdF9jb3VudCA8PCBSMzAwX1BWU19DTlRMXzFfUE9TX0VORF9TSElGVCkgfAotCSAgICAoaW5zdF9jb3VudCA8PCBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9FTkRfU0hJRlQpOworCSAgICAoMCA8PCBSMzAwX1BWU19GSVJTVF9JTlNUX1NISUZUKSB8CisJICAgIChpbnN0X2NvdW50IDw8IFIzMDBfUFZTX1hZWldfVkFMSURfSU5TVF9TSElGVCkgfAorCSAgICAoaW5zdF9jb3VudCA8PCBSMzAwX1BWU19MQVNUX0lOU1RfU0hJRlQpOwogCXJtZXNhLT5ody5wdnMuY21kW1IzMDBfUFZTX0NOVExfMl0gPQotCSAgICAoMCA8PCBSMzAwX1BWU19DTlRMXzJfUEFSQU1fT0ZGU0VUX1NISUZUKSB8Ci0JICAgIChwYXJhbV9jb3VudCA8PCBSMzAwX1BWU19DTlRMXzJfUEFSQU1fQ09VTlRfU0hJRlQpOworCSAgICAoMCA8PCBSMzAwX1BWU19DT05TVF9CQVNFX09GRlNFVF9TSElGVCkgfAorCSAgICAocGFyYW1fY291bnQgPDwgUjMwMF9QVlNfTUFYX0NPTlNUX0FERFJfU0hJRlQpOwogCXJtZXNhLT5ody5wdnMuY21kW1IzMDBfUFZTX0NOVExfM10gPQotCSAgICAoaW5zdF9jb3VudCA8PCBSMzAwX1BWU19DTlRMXzNfUFJPR1JBTV9VTktOT1dOX1NISUZUKSB8Ci0JICAgIChpbnN0X2NvdW50IDw8IFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV04yX1NISUZUKTsKKwkgICAgKGluc3RfY291bnQgPDwgUjMwMF9QVlNfTEFTVF9WVFhfU1JDX0lOU1RfU0hJRlQpOworfQorCitzdGF0aWMgaW50IGJpdF9jb3VudCAoaW50IHgpCit7CisgICAgeCA9ICgoeCAmIDB4YWFhYWFhYWFVKSA+PiAxKSArICh4ICYgMHg1NTU1NTU1NVUpOworICAgIHggPSAoKHggJiAweGNjY2NjY2NjVSkgPj4gMikgKyAoeCAmIDB4MzMzMzMzMzNVKTsKKyAgICB4ID0gKHggPj4gMTYpICsgKHggJiAweGZmZmYpOworICAgIHggPSAoKHggJiAweGYwZjApID4+IDQpICsgKHggJiAweDBmMGYpOworICAgIHJldHVybiAoeCA+PiA4KSArICh4ICYgMHgwMGZmKTsKIH0KIAogc3RhdGljIHZvaWQgcjMwMFNldHVwUmVhbFZlcnRleFByb2dyYW0ocjMwMENvbnRleHRQdHIgcm1lc2EpCkBAIC0xNjEyLDIwICsyMDg5LDIyIEBACiAJYnVtcF92cHVfY291bnQocm1lc2EtPmh3LnZwcC5jbWQsIHBhcmFtX2NvdW50KTsKIAlwYXJhbV9jb3VudCAvPSA0OwogCi0JcjMwMFNldHVwVmVydGV4UHJvZ3JhbUZyYWdtZW50KHJtZXNhLCBSMzAwX1BWU19VUExPQURfUFJPR1JBTSwgJihwcm9nLT5wcm9ncmFtKSk7CisJcjMwMFNldHVwVmVydGV4UHJvZ3JhbUZyYWdtZW50KHJtZXNhLCBSMzAwX1BWU19DT0RFX1NUQVJULCAmKHByb2ctPnByb2dyYW0pKTsKIAlpbnN0X2NvdW50ID0gKHByb2ctPnByb2dyYW0ubGVuZ3RoIC8gNCkgLSAxOwogCisJcjMwMFZhcENudGwocm1lc2EsIGJpdF9jb3VudChwcm9nLT5rZXkuSW5wdXRzUmVhZCksCisJCSAgICBiaXRfY291bnQocHJvZy0+a2V5Lk91dHB1dHNXcml0dGVuKSwgcHJvZy0+bnVtX3RlbXBvcmFyaWVzKTsKKwogCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIHB2cyk7CiAJcm1lc2EtPmh3LnB2cy5jbWRbUjMwMF9QVlNfQ05UTF8xXSA9Ci0JICAoMCA8PCBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCkgfAotCSAgKGluc3RfY291bnQgPDwgUjMwMF9QVlNfQ05UTF8xX1BPU19FTkRfU0hJRlQpIHwKLQkgIChpbnN0X2NvdW50IDw8IFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX0VORF9TSElGVCk7CisJICAoMCA8PCBSMzAwX1BWU19GSVJTVF9JTlNUX1NISUZUKSB8CisJICAoaW5zdF9jb3VudCA8PCBSMzAwX1BWU19YWVpXX1ZBTElEX0lOU1RfU0hJRlQpIHwKKwkgIChpbnN0X2NvdW50IDw8IFIzMDBfUFZTX0xBU1RfSU5TVF9TSElGVCk7CiAJcm1lc2EtPmh3LnB2cy5jbWRbUjMwMF9QVlNfQ05UTF8yXSA9Ci0JICAoMCA8PCBSMzAwX1BWU19DTlRMXzJfUEFSQU1fT0ZGU0VUX1NISUZUKSB8Ci0JICAocGFyYW1fY291bnQgPDwgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX0NPVU5UX1NISUZUKTsKKwkgICgwIDw8IFIzMDBfUFZTX0NPTlNUX0JBU0VfT0ZGU0VUX1NISUZUKSB8CisJICAocGFyYW1fY291bnQgPDwgUjMwMF9QVlNfTUFYX0NPTlNUX0FERFJfU0hJRlQpOwogCXJtZXNhLT5ody5wdnMuY21kW1IzMDBfUFZTX0NOVExfM10gPQotCSAgKGluc3RfY291bnQgPDwgUjMwMF9QVlNfQ05UTF8zX1BST0dSQU1fVU5LTk9XTl9TSElGVCkgfAotCSAgKGluc3RfY291bnQgPDwgUjMwMF9QVlNfQ05UTF8zX1BST0dSQU1fVU5LTk9XTjJfU0hJRlQpOworCSAgKGluc3RfY291bnQgPDwgUjMwMF9QVlNfTEFTVF9WVFhfU1JDX0lOU1RfU0hJRlQpOwogfQogCiBzdGF0aWMgdm9pZCByMzAwU2V0dXBWZXJ0ZXhQcm9ncmFtKHIzMDBDb250ZXh0UHRyIHJtZXNhKQpAQCAtMTY0OCwxMyArMjEyNyw2IEBACiAJCXIzMDBTZXR1cERlZmF1bHRWZXJ0ZXhQcm9ncmFtKHJtZXNhKTsKIAl9CiAKLQotCS8qIEZJWE1FOiBUaGlzIGlzIGRvbmUgZm9yIHZlcnRleCBzaGFkZXIgZnJhZ21lbnRzLCBidXQgYWxzbyBuZWVkcyB0byBiZQotCSAqIGRvbmUgZm9yIHZhcF9wdnMsIHNvIEkgbGVhdmUgaXQgYXMgYSByZW1pbmRlci4gKi8KLSNpZiAwCi0JcmVnX3N0YXJ0KFIzMDBfVkFQX1BWU19XQUlUSURMRSwgMCk7Ci0JZTMyKDB4MDAwMDAwMDApOwotI2VuZGlmCiB9CiAKIC8qKgpAQCAtMTY2NCw4NCArMjEzNiw1NCBAQAogICovCiBzdGF0aWMgdm9pZCByMzAwRW5hYmxlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKQogewotCXIzMDBDb250ZXh0UHRyIHIzMDAgPSBSMzAwX0NPTlRFWFQoY3R4KTsKLQogCWlmIChSQURFT05fREVCVUcgJiBERUJVR19TVEFURSkKIAkJZnByaW50ZihzdGRlcnIsICIlcyggJXMgPSAlcyApXG4iLCBfX0ZVTkNUSU9OX18sCiAJCQlfbWVzYV9sb29rdXBfZW51bV9ieV9ucihjYXApLAogCQkJc3RhdGUgPyAiR0xfVFJVRSIgOiAiR0xfRkFMU0UiKTsKIAogCXN3aXRjaCAoY2FwKSB7Ci0JCS8qIEZhc3QgdHJhY2sgdGhpcyBvbmUuLi4KLQkJICovCiAJY2FzZSBHTF9URVhUVVJFXzFEOgogCWNhc2UgR0xfVEVYVFVSRV8yRDoKIAljYXNlIEdMX1RFWFRVUkVfM0Q6CisJCS8qIGVtcHR5ICovCiAJCWJyZWFrOwotCiAJY2FzZSBHTF9GT0c6Ci0JCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgZm9ncyk7Ci0JCWlmIChzdGF0ZSkgewotCQkJcjMwMC0+aHcuZm9ncy5jbWRbUjMwMF9GT0dTX1NUQVRFXSB8PSBSMzAwX0ZPR19FTkFCTEU7Ci0KLQkJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19NT0RFLCBOVUxMKTsKLQkJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19ERU5TSVRZLCAmY3R4LT5Gb2cuRGVuc2l0eSk7Ci0JCQlyMzAwRm9nZnYoY3R4LCBHTF9GT0dfU1RBUlQsICZjdHgtPkZvZy5TdGFydCk7Ci0JCQlyMzAwRm9nZnYoY3R4LCBHTF9GT0dfRU5ELCAmY3R4LT5Gb2cuRW5kKTsKLQkJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19DT0xPUiwgY3R4LT5Gb2cuQ29sb3IpOwotCQl9IGVsc2UgewotCQkJcjMwMC0+aHcuZm9ncy5jbWRbUjMwMF9GT0dTX1NUQVRFXSAmPSB+UjMwMF9GT0dfRU5BQkxFOwotCQl9Ci0KKwkJcjMwMFNldEZvZ1N0YXRlKGN0eCwgc3RhdGUpOwogCQlicmVhazsKLQogCWNhc2UgR0xfQUxQSEFfVEVTVDoKIAkJcjMwMFNldEFscGhhU3RhdGUoY3R4KTsKIAkJYnJlYWs7Ci0KLQljYXNlIEdMX0JMRU5EOgogCWNhc2UgR0xfQ09MT1JfTE9HSUNfT1A6CisJCXIzMDBTZXRMb2dpY09wU3RhdGUoY3R4KTsKKwkJLyogZmFsbC10aHJvdWdoLCBiZWNhdXNlIGxvZ2ljIG9wIG92ZXJyaWRlcyBibGVuZGluZyAqLworCWNhc2UgR0xfQkxFTkQ6CiAJCXIzMDBTZXRCbGVuZFN0YXRlKGN0eCk7CiAJCWJyZWFrOwotCisJY2FzZSBHTF9DTElQX1BMQU5FMDoKKwljYXNlIEdMX0NMSVBfUExBTkUxOgorCWNhc2UgR0xfQ0xJUF9QTEFORTI6CisJY2FzZSBHTF9DTElQX1BMQU5FMzoKKwljYXNlIEdMX0NMSVBfUExBTkU0OgorCWNhc2UgR0xfQ0xJUF9QTEFORTU6CisJCXIzMDBTZXRDbGlwUGxhbmVTdGF0ZShjdHgsIGNhcCwgc3RhdGUpOworCQlicmVhazsKIAljYXNlIEdMX0RFUFRIX1RFU1Q6CiAJCXIzMDBTZXREZXB0aFN0YXRlKGN0eCk7CiAJCWJyZWFrOwotCiAJY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6Ci0JCWlmIChyMzAwLT5zdGF0ZS5zdGVuY2lsLmh3X3N0ZW5jaWwpIHsKLQkJCVIzMDBfU1RBVEVDSEFOR0UocjMwMCwgenMpOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJcjMwMC0+aHcuenMuY21kW1IzMDBfWlNfQ05UTF8wXSB8PQotCQkJCSAgICBSMzAwX1JCM0RfU1RFTkNJTF9FTkFCTEU7Ci0JCQl9IGVsc2UgewotCQkJCXIzMDAtPmh3LnpzLmNtZFtSMzAwX1pTX0NOVExfMF0gJj0KLQkJCQkgICAgflIzMDBfUkIzRF9TVEVOQ0lMX0VOQUJMRTsKLQkJCX0KLQkJfSBlbHNlIHsKLSNpZiBSMjAwX01FUkdFRAotCQkJRkFMTEJBQ0soJnIzMDAtPnJhZGVvbiwgUkFERU9OX0ZBTExCQUNLX1NURU5DSUwsIHN0YXRlKTsKLSNlbmRpZgotCQl9CisJCXIzMDBTZXRTdGVuY2lsU3RhdGUoY3R4LCBzdGF0ZSk7CiAJCWJyZWFrOwotCiAJY2FzZSBHTF9DVUxMX0ZBQ0U6CiAJCXIzMDBVcGRhdGVDdWxsaW5nKGN0eCk7CiAJCWJyZWFrOwotCiAJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9QT0lOVDoKIAljYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkU6CiAJY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOgotCQlSMzAwX1NUQVRFQ0hBTkdFKHIzMDAsIG9jY2x1c2lvbl9jbnRsKTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlyMzAwLT5ody5vY2NsdXNpb25fY250bC5jbWRbMV0gfD0gKDMgPDwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlyMzAwLT5ody5vY2NsdXNpb25fY250bC5jbWRbMV0gJj0gfigzIDw8IDApOwotCQl9CisJCXIzMDBTZXRQb2x5Z29uT2Zmc2V0U3RhdGUoY3R4LCBzdGF0ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJhZGVvbkVuYWJsZShjdHgsIGNhcCwgc3RhdGUpOwotCQlyZXR1cm47CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMTc4NCwxNSArMjIyNiwxMSBAQAogCXIzMDBVcGRhdGVUZXh0dXJlU3RhdGUoY3R4KTsKIAogCXIzMDBTZXRCbGVuZFN0YXRlKGN0eCk7CisJcjMwMFNldExvZ2ljT3BTdGF0ZShjdHgpOwogCiAJcjMwMEFscGhhRnVuYyhjdHgsIGN0eC0+Q29sb3IuQWxwaGFGdW5jLCBjdHgtPkNvbG9yLkFscGhhUmVmKTsKIAlyMzAwRW5hYmxlKGN0eCwgR0xfQUxQSEFfVEVTVCwgY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQpOwogCi0JaWYgKCFoYXNfdGNsKQotCQlyMzAwLT5ody52YXBfY250bC5jbWRbMV0gPSAweDAwMTQwNDVhOwotCWVsc2UKLQkJcjMwMC0+aHcudmFwX2NudGwuY21kWzFdID0gMHgwMDMwMDQ1QTsJLy8weDAwMzAwNjVhIC8qIERhbmdlcm91cyAqLwotCiAJcjMwMC0+aHcudnRlLmNtZFsxXSA9IFIzMDBfVlBPUlRfWF9TQ0FMRV9FTkEKIAkgICAgfCBSMzAwX1ZQT1JUX1hfT0ZGU0VUX0VOQQogCSAgICB8IFIzMDBfVlBPUlRfWV9TQ0FMRV9FTkEKQEAgLTE4MDEsOCArMjIzOSw4IEBACiAJICAgIHwgUjMwMF9WUE9SVF9aX09GRlNFVF9FTkEgfCBSMzAwX1ZUWF9XMF9GTVQ7CiAJcjMwMC0+aHcudnRlLmNtZFsyXSA9IDB4MDAwMDAwMDg7CiAKLQlyMzAwLT5ody51bmsyMTM0LmNtZFsxXSA9IDB4MDBGRkZGRkY7Ci0JcjMwMC0+aHcudW5rMjEzNC5jbWRbMl0gPSAweDAwMDAwMDAwOworCXIzMDAtPmh3LnZhcF92Zl9tYXhfdnR4X2luZHguY21kWzFdID0gMHgwMEZGRkZGRjsKKwlyMzAwLT5ody52YXBfdmZfbWF4X3Z0eF9pbmR4LmNtZFsyXSA9IDB4MDAwMDAwMDA7CiAKICNpZmRlZiBNRVNBX0xJVFRMRV9FTkRJQU4KIAlyMzAwLT5ody52YXBfY250bF9zdGF0dXMuY21kWzFdID0gUjMwMF9WQ19OT19TV0FQOwpAQCAtMTgxNCw4MSArMjI1Miw4MCBAQAogCWlmICghaGFzX3RjbCkKIAkJcjMwMC0+aHcudmFwX2NudGxfc3RhdHVzLmNtZFsxXSB8PSBSMzAwX1ZBUF9UQ0xfQllQQVNTOwogCi0JcjMwMC0+aHcudW5rMjFEQy5jbWRbMV0gPSAweEFBQUFBQUFBOwotCi0JcjMwMC0+aHcudW5rMjIxQy5jbWRbMV0gPSBSMzAwXzIyMUNfTk9STUFMOwotCi0JcjMwMC0+aHcudmFwX2NsaXAuY21kWzFdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCk7IC8qIFggKi8KLQlyMzAwLT5ody52YXBfY2xpcC5jbWRbMl0gPSByMzAwUGFja0Zsb2F0MzIoMS4wKTsgLyogWCAqLwotCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFszXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOyAvKiBZICovCi0JcjMwMC0+aHcudmFwX2NsaXAuY21kWzRdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCk7IC8qIFkgKi8KKwlyMzAwLT5ody52YXBfcHNjX3Nnbl9ub3JtX2NudGwuY21kWzFdID0gMHhBQUFBQUFBQTsKIAogCS8qIFhYWDogT3RoZXIgZmFtaWxpZXM/ICovCiAJaWYgKGhhc190Y2wpIHsKKwkJcjMwMC0+aHcudmFwX2NsaXBfY250bC5jbWRbMV0gPSBSMzAwX1BTX1VDUF9NT0RFX0RJU1RfQ09QOworCisJCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFsxXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOyAvKiBYICovCisJCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFsyXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOyAvKiBYICovCisJCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFszXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOyAvKiBZICovCisJCXIzMDAtPmh3LnZhcF9jbGlwLmNtZFs0XSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOyAvKiBZICovCisKIAkJc3dpdGNoIChyMzAwLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSkgewogCQljYXNlIENISVBfRkFNSUxZX1IzMDA6Ci0JCQlyMzAwLT5ody51bmsyMjg4LmNtZFsxXSA9IFIzMDBfMjI4OF9SMzAwOworCQkJcjMwMC0+aHcudmFwX3B2c192dHhfdGltZW91dF9yZWcuY21kWzFdID0gUjMwMF8yMjg4X1IzMDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXIzMDAtPmh3LnVuazIyODguY21kWzFdID0gUjMwMF8yMjg4X1JWMzUwOworCQkJcjMwMC0+aHcudmFwX3B2c192dHhfdGltZW91dF9yZWcuY21kWzFdID0gUjMwMF8yMjg4X1JWMzUwOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKIAlyMzAwLT5ody5nYl9lbmFibGUuY21kWzFdID0gUjMwMF9HQl9QT0lOVF9TVFVGRl9FTkFCTEUKIAkgICAgfCBSMzAwX0dCX0xJTkVfU1RVRkZfRU5BQkxFCi0JICAgIHwgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9FTkFCTEUgLyp8IFIzMDBfR0JfVU5LMzEgKi8gOworCSAgICB8IFIzMDBfR0JfVFJJQU5HTEVfU1RVRkZfRU5BQkxFOwogCiAJcjMwMC0+aHcuZ2JfbWlzYy5jbWRbUjMwMF9HQl9NSVNDX01TUE9TXzBdID0gMHg2NjY2NjY2NjsKIAlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfTVNQT1NfMV0gPSAweDA2NjY2NjY2OwogCi0JLyogWFhYOiBPdGhlciBmYW1pbGllcz8gKi8KIAlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddID0KLQkgICAgUjMwMF9HQl9USUxFX0VOQUJMRSB8IFIzMDBfR0JfVElMRV9TSVpFXzE2OwotCXN3aXRjaCAocjMwMC0+cmFkZW9uLnJhZGVvblNjcmVlbi0+Y2hpcF9mYW1pbHkpIHsKLQljYXNlIENISVBfRkFNSUxZX1IzMDA6Ci0JY2FzZSBDSElQX0ZBTUlMWV9SMzUwOgotCQlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddIHw9Ci0JCSAgICBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SMzAwOwotCQlicmVhazsKLQljYXNlIENISVBfRkFNSUxZX1JWNDEwOgotCQlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddIHw9Ci0JCSAgICBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjQxMDsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0ZBTUlMWV9SNDIwOgotCQlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddIHw9Ci0JCSAgICBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SNDIwOwotCQlicmVhazsKKwkgICAgUjMwMF9HQl9USUxFX0VOQUJMRSB8IFIzMDBfR0JfVElMRV9TSVpFXzE2IC8qfCBSMzAwX0dCX1NVQlBJWEVMXzFfMTYqLzsKKwlzd2l0Y2ggKHIzMDAtPnJhZGVvbi5yYWRlb25TY3JlZW4tPm51bV9nYl9waXBlcykgeworCWNhc2UgMToKIAlkZWZhdWx0OgogCQlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddIHw9CiAJCSAgICBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjMwMDsKIAkJYnJlYWs7CisJY2FzZSAyOgorCQlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfVElMRV9DT05GSUddIHw9CisJCSAgICBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SMzAwOworCQlicmVhazsKKwljYXNlIDM6CisJCXIzMDAtPmh3LmdiX21pc2MuY21kW1IzMDBfR0JfTUlTQ19USUxFX0NPTkZJR10gfD0KKwkJICAgIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1I0MjBfM1A7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcjMwMC0+aHcuZ2JfbWlzYy5jbWRbUjMwMF9HQl9NSVNDX1RJTEVfQ09ORklHXSB8PQorCQkgICAgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUjQyMDsKKwkJYnJlYWs7CiAJfQogCiAJLyogWFhYOiBzZXQgdG8gMCB3aGVuIGZvZyBpcyBkaXNhYmxlZD8gKi8KIAlyMzAwLT5ody5nYl9taXNjLmNtZFtSMzAwX0dCX01JU0NfU0VMRUNUXSA9IFIzMDBfR0JfRk9HX1NFTEVDVF8xXzFfVzsKIAogCS8qIFhYWDogRW5hYmxlIGFudGktYWxpYXNpbmc/ICovCi0JcjMwMC0+aHcuZ2JfbWlzYy5jbWRbUjMwMF9HQl9NSVNDX0FBX0NPTkZJR10gPSBSMzAwX0FBX0RJU0FCTEU7CisJcjMwMC0+aHcuZ2JfbWlzYy5jbWRbUjMwMF9HQl9NSVNDX0FBX0NPTkZJR10gPSBHQl9BQV9DT05GSUdfQUFfRElTQUJMRTsKIAotCXIzMDAtPmh3LnVuazQyMDAuY21kWzFdID0gcjMwMFBhY2tGbG9hdDMyKDAuMCk7Ci0JcjMwMC0+aHcudW5rNDIwMC5jbWRbMl0gPSByMzAwUGFja0Zsb2F0MzIoMC4wKTsKLQlyMzAwLT5ody51bms0MjAwLmNtZFszXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOwotCXIzMDAtPmh3LnVuazQyMDAuY21kWzRdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCk7CisJcjMwMC0+aHcuZ2FfcG9pbnRfczAuY21kWzFdID0gcjMwMFBhY2tGbG9hdDMyKDAuMCk7CisJcjMwMC0+aHcuZ2FfcG9pbnRfczAuY21kWzJdID0gcjMwMFBhY2tGbG9hdDMyKDAuMCk7CisJcjMwMC0+aHcuZ2FfcG9pbnRfczAuY21kWzNdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCk7CisJcjMwMC0+aHcuZ2FfcG9pbnRfczAuY21kWzRdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCk7CiAKLQlyMzAwLT5ody51bms0MjE0LmNtZFsxXSA9IDB4MDAwNTAwMDU7CisJcjMwMC0+aHcuZ2FfdHJpYW5nbGVfc3RpcHBsZS5jbWRbMV0gPSAweDAwMDUwMDA1OwogCiAJcjMwMFBvaW50U2l6ZShjdHgsIDEuMCk7CiAKLQlyMzAwLT5ody51bms0MjMwLmNtZFsxXSA9IDB4MTgwMDAwMDY7Ci0JcjMwMC0+aHcudW5rNDIzMC5jbWRbMl0gPSAweDAwMDIwMDA2OwotCXIzMDAtPmh3LnVuazQyMzAuY21kWzNdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCAvIDE5Mi4wKTsKKwlyMzAwLT5ody5nYV9wb2ludF9taW5tYXguY21kWzFdID0gMHgxODAwMDAwNjsKKwlyMzAwLT5ody5nYV9wb2ludF9taW5tYXguY21kWzJdID0gMHgwMDAyMDAwNjsKKwlyMzAwLT5ody5nYV9wb2ludF9taW5tYXguY21kWzNdID0gcjMwMFBhY2tGbG9hdDMyKDEuMCAvIDE5Mi4wKTsKIAogCXIzMDBMaW5lV2lkdGgoY3R4LCAxLjApOwogCi0JcjMwMC0+aHcudW5rNDI2MC5jbWRbMV0gPSAwOwotCXIzMDAtPmh3LnVuazQyNjAuY21kWzJdID0gcjMwMFBhY2tGbG9hdDMyKDAuMCk7Ci0JcjMwMC0+aHcudW5rNDI2MC5jbWRbM10gPSByMzAwUGFja0Zsb2F0MzIoMS4wKTsKKwlyMzAwLT5ody5nYV9saW5lX3N0aXBwbGUuY21kWzFdID0gMDsKKwlyMzAwLT5ody5nYV9saW5lX3N0aXBwbGUuY21kWzJdID0gcjMwMFBhY2tGbG9hdDMyKDAuMCk7CisJcjMwMC0+aHcuZ2FfbGluZV9zdGlwcGxlLmNtZFszXSA9IHIzMDBQYWNrRmxvYXQzMigxLjApOwogCiAJcjMwMFNoYWRlTW9kZWwoY3R4LCBjdHgtPkxpZ2h0LlNoYWRlTW9kZWwpOwogCkBAIC0xOTAyLDE5ICsyMzM5LDIzIEBACiAJcjMwMEVuYWJsZShjdHgsIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUsIGN0eC0+UG9seWdvbi5PZmZzZXRMaW5lKTsKIAlyMzAwRW5hYmxlKGN0eCwgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCwgY3R4LT5Qb2x5Z29uLk9mZnNldEZpbGwpOwogCi0JcjMwMC0+aHcudW5rNDJDMC5jbWRbMV0gPSAweDRCN0ZGRkZGOwotCXIzMDAtPmh3LnVuazQyQzAuY21kWzJdID0gMHgwMDAwMDAwMDsKKwlyMzAwLT5ody5zdV9kZXB0aF9zY2FsZS5jbWRbMV0gPSAweDRCN0ZGRkZGOworCXIzMDAtPmh3LnN1X2RlcHRoX3NjYWxlLmNtZFsyXSA9IDB4MDAwMDAwMDA7CiAKLQlyMzAwLT5ody51bms0M0E0LmNtZFsxXSA9IDB4MDAwMDAwMUM7Ci0JcjMwMC0+aHcudW5rNDNBNC5jbWRbMl0gPSAweDJEQTQ5NTI1OworCXIzMDAtPmh3LnNjX2h5cGVyei5jbWRbMV0gPSAweDAwMDAwMDFDOworCXIzMDAtPmh3LnNjX2h5cGVyei5jbWRbMl0gPSAweDJEQTQ5NTI1OwogCi0JcjMwMC0+aHcudW5rNDNFOC5jbWRbMV0gPSAweDAwRkZGRkZGOworCXIzMDAtPmh3LnNjX3NjcmVlbmRvb3IuY21kWzFdID0gMHgwMEZGRkZGRjsKIAotCXIzMDAtPmh3LnVuazQ2QTQuY21kWzFdID0gMHgwMDAwMUIwMTsKLQlyMzAwLT5ody51bms0NkE0LmNtZFsyXSA9IDB4MDAwMDFCMEY7Ci0JcjMwMC0+aHcudW5rNDZBNC5jbWRbM10gPSAweDAwMDAxQjBGOwotCXIzMDAtPmh3LnVuazQ2QTQuY21kWzRdID0gMHgwMDAwMUIwRjsKLQlyMzAwLT5ody51bms0NkE0LmNtZFs1XSA9IDB4MDAwMDAwMDE7CisJcjMwMC0+aHcudXNfb3V0X2ZtdC5jbWRbMV0gPSBSNTAwX09VVF9GTVRfQzRfOCAgfAorCSAgUjUwMF9DMF9TRUxfQiB8IFI1MDBfQzFfU0VMX0cgfCBSNTAwX0MyX1NFTF9SIHwgUjUwMF9DM19TRUxfQTsKKwlyMzAwLT5ody51c19vdXRfZm10LmNtZFsyXSA9IFI1MDBfT1VUX0ZNVF9VTlVTRUQgfAorCSAgUjUwMF9DMF9TRUxfQiB8IFI1MDBfQzFfU0VMX0cgfCBSNTAwX0MyX1NFTF9SIHwgUjUwMF9DM19TRUxfQTsKKwlyMzAwLT5ody51c19vdXRfZm10LmNtZFszXSA9IFI1MDBfT1VUX0ZNVF9VTlVTRUQgfAorCSAgUjUwMF9DMF9TRUxfQiB8IFI1MDBfQzFfU0VMX0cgfCBSNTAwX0MyX1NFTF9SIHwgUjUwMF9DM19TRUxfQTsKKwlyMzAwLT5ody51c19vdXRfZm10LmNtZFs0XSA9IFI1MDBfT1VUX0ZNVF9VTlVTRUQgfAorCSAgUjUwMF9DMF9TRUxfQiB8IFI1MDBfQzFfU0VMX0cgfCBSNTAwX0MyX1NFTF9SIHwgUjUwMF9DM19TRUxfQTsKKwlyMzAwLT5ody51c19vdXRfZm10LmNtZFs1XSA9IFIzMDBfV19GTVRfVzI0OwogCiAJcjMwMEVuYWJsZShjdHgsIEdMX0ZPRywgY3R4LT5Gb2cuRW5hYmxlZCk7CiAJcjMwMEZvZ2Z2KGN0eCwgR0xfRk9HX01PREUsIE5VTEwpOwpAQCAtMTkyNCw5ICsyMzY1LDkgQEAKIAlyMzAwRm9nZnYoY3R4LCBHTF9GT0dfQ09MT1IsIGN0eC0+Rm9nLkNvbG9yKTsKIAlyMzAwRm9nZnYoY3R4LCBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBOVUxMKTsKIAotCXIzMDAtPmh3LnVuazRCRDguY21kWzFdID0gMDsKKwlyMzAwLT5ody5mZ19kZXB0aF9zcmMuY21kWzFdID0gMDsKIAotCXIzMDAtPmh3LnVuazRFMDAuY21kWzFdID0gMDsKKwlyMzAwLT5ody5yYjNkX2NjdGwuY21kWzFdID0gMDsKIAogCXIzMDBCbGVuZENvbG9yKGN0eCwgY3R4LT5Db2xvci5CbGVuZENvbG9yKTsKIApAQCAtMTk0NCwyMCArMjM4NSwyMCBAQAogCWlmIChyMzAwLT5yYWRlb24uc2FyZWEtPnRpbGluZ19lbmFibGVkKQogCQlyMzAwLT5ody5jYi5jbWRbUjMwMF9DQl9QSVRDSF0gfD0gUjMwMF9DT0xPUl9USUxFX0VOQUJMRTsKIAotCXIzMDAtPmh3LnVuazRFNTAuY21kWzFdID0gMDsKLQlyMzAwLT5ody51bms0RTUwLmNtZFsyXSA9IDA7Ci0JcjMwMC0+aHcudW5rNEU1MC5jbWRbM10gPSAwOwotCXIzMDAtPmh3LnVuazRFNTAuY21kWzRdID0gMDsKLQlyMzAwLT5ody51bms0RTUwLmNtZFs1XSA9IDA7Ci0JcjMwMC0+aHcudW5rNEU1MC5jbWRbNl0gPSAwOwotCXIzMDAtPmh3LnVuazRFNTAuY21kWzddID0gMDsKLQlyMzAwLT5ody51bms0RTUwLmNtZFs4XSA9IDA7Ci0JcjMwMC0+aHcudW5rNEU1MC5jbWRbOV0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbMV0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbMl0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbM10gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbNF0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbNV0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbNl0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbN10gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbOF0gPSAwOworCXIzMDAtPmh3LnJiM2RfZGl0aGVyX2N0bC5jbWRbOV0gPSAwOwogCi0JcjMwMC0+aHcudW5rNEU4OC5jbWRbMV0gPSAwOworCXIzMDAtPmh3LnJiM2RfYWFyZXNvbHZlX2N0bC5jbWRbMV0gPSAwOwogCi0JcjMwMC0+aHcudW5rNEVBMC5jbWRbMV0gPSAweDAwMDAwMDAwOwotCXIzMDAtPmh3LnVuazRFQTAuY21kWzJdID0gMHhmZmZmZmZmZjsKKwlyMzAwLT5ody5yYjNkX2Rpc2NhcmRfc3JjX3BpeGVsX2x0ZV90aHJlc2hvbGQuY21kWzFdID0gMHgwMDAwMDAwMDsKKwlyMzAwLT5ody5yYjNkX2Rpc2NhcmRfc3JjX3BpeGVsX2x0ZV90aHJlc2hvbGQuY21kWzJdID0gMHhmZmZmZmZmZjsKIAogCXIzMDAtPmh3LnpiLmNtZFtSMzAwX1pCX09GRlNFVF0gPQogCSAgICByMzAwLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5kZXB0aE9mZnNldCArCkBAIC0xOTY2LDIyICsyNDA3LDQwIEBACiAKIAlpZiAocjMwMC0+cmFkZW9uLnNhcmVhLT50aWxpbmdfZW5hYmxlZCkgewogCQkvKiBYWFg6IFR1cm4gb2ZmIHdoZW4gY2xlYXJpbmcgYnVmZmVycyA/ICovCi0JCXIzMDAtPmh3LnpiLmNtZFtSMzAwX1pCX1BJVENIXSB8PSBSMzAwX0RFUFRIX1RJTEVfRU5BQkxFOworCQlyMzAwLT5ody56Yi5jbWRbUjMwMF9aQl9QSVRDSF0gfD0gUjMwMF9ERVBUSE1BQ1JPVElMRV9FTkFCTEU7CiAKIAkJaWYgKGN0eC0+VmlzdWFsLmRlcHRoQml0cyA9PSAyNCkKIAkJCXIzMDAtPmh3LnpiLmNtZFtSMzAwX1pCX1BJVENIXSB8PQotCQkJICAgIFIzMDBfREVQVEhfTUlDUk9USUxFX0VOQUJMRTsKKwkJCSAgICBSMzAwX0RFUFRITUlDUk9USUxFX1RJTEVEOwogCX0KIAotCXIzMDAtPmh3LnVuazRGMjguY21kWzFdID0gMDsKKwlyMzAwLT5ody56Yl9kZXB0aGNsZWFydmFsdWUuY21kWzFdID0gMDsKKworCXN3aXRjaCAoY3R4LT5WaXN1YWwuZGVwdGhCaXRzKSB7CisJY2FzZSAxNjoKKwkJcjMwMC0+aHcuenN0ZW5jaWxfZm9ybWF0LmNtZFsxXSA9IFIzMDBfREVQVEhGT1JNQVRfMTZCSVRfSU5UX1o7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbMV0gPSBSMzAwX0RFUFRIRk9STUFUXzI0QklUX0lOVF9aXzhCSVRfU1RFTkNJTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5zdXBwb3J0ZWQgZGVwdGggJWQuLi4gZXhpdGluZ1xuIiwgY3R4LT5WaXN1YWwuZGVwdGhCaXRzKTsKKwkJX21lc2FfZXhpdCgtMSk7CisJfQorCisJcjMwMC0+aHcuenN0ZW5jaWxfZm9ybWF0LmNtZFsyXSA9IFIzMDBfWlRPUF9ESVNBQkxFOworCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbM10gPSAweDAwMDAwMDAzOworCXIzMDAtPmh3LnpzdGVuY2lsX2Zvcm1hdC5jbWRbNF0gPSAweDAwMDAwMDAwOworCXIzMDBTZXRFYXJseVpTdGF0ZShjdHgpOwogCiAJcjMwMC0+aHcudW5rNEYzMC5jbWRbMV0gPSAwOwogCXIzMDAtPmh3LnVuazRGMzAuY21kWzJdID0gMDsKIAotCXIzMDAtPmh3LnVuazRGNDQuY21kWzFdID0gMDsKKwlyMzAwLT5ody56Yl9oaXpfb2Zmc2V0LmNtZFsxXSA9IDA7CiAKLQlyMzAwLT5ody51bms0RjU0LmNtZFsxXSA9IDA7CisJcjMwMC0+aHcuemJfaGl6X3BpdGNoLmNtZFsxXSA9IDA7CiAKKwlyMzAwVmFwQ250bChyMzAwLCAwLCAwLCAwKTsKIAlpZiAoaGFzX3RjbCkgewogCQlyMzAwLT5ody52cHMuY21kW1IzMDBfVlBTX1pFUk9fMF0gPSAwOwogCQlyMzAwLT5ody52cHMuY21kW1IzMDBfVlBTX1pFUk9fMV0gPSAwOwpAQCAtMjAyNywxNyArMjQ4Niw0MCBAQAogCQkJaHdfdGNsX29uID0gZnV0dXJlX2h3X3RjbF9vbiA9IDA7CiAJCQlyMzAwUmVzZXRId1N0YXRlKHJtZXNhKTsKIAorCQkJcjMwMFVwZGF0ZVN0YXRlUGFyYW1ldGVycyhjdHgsIF9ORVdfUFJPR1JBTSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJcjMwMFVwZGF0ZVN0YXRlUGFyYW1ldGVycyhjdHgsIF9ORVdfUFJPR1JBTSk7CisJfQorCXIzMDBVcGRhdGVTdGF0ZVBhcmFtZXRlcnMoY3R4LCBfTkVXX1BST0dSQU0pOworfQorCitzdGF0aWMgY29uc3QgR0xmbG9hdCAqZ2V0X2ZyYWdtZW50cHJvZ3JhbV9jb25zdGFudChHTGNvbnRleHQgKmN0eCwKKwlzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY3JlZykKK3sKKwlzdGF0aWMgY29uc3QgR0xmbG9hdCBkdW1teVs0XSA9IHsgMCwgMCwgMCwgMCB9OworCisJc3dpdGNoKHNyY3JlZy5GaWxlKSB7CisJY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgorCQlyZXR1cm4gcHJvZ3JhbS0+TG9jYWxQYXJhbXNbc3JjcmVnLkluZGV4XTsKKwljYXNlIFBST0dSQU1fRU5WX1BBUkFNOgorCQlyZXR1cm4gY3R4LT5GcmFnbWVudFByb2dyYW0uUGFyYW1ldGVyc1tzcmNyZWcuSW5kZXhdOworCWNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CisJY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgorCWNhc2UgUFJPR1JBTV9DT05TVEFOVDoKKwkJcmV0dXJuIHByb2dyYW0tPlBhcmFtZXRlcnMtPlBhcmFtZXRlclZhbHVlc1tzcmNyZWcuSW5kZXhdOworCWRlZmF1bHQ6CisJCV9tZXNhX3Byb2JsZW0oY3R4LCAiZ2V0X2ZyYWdtZW50cHJvZ3JhbV9jb25zdGFudDogVW5rbm93blxuIik7CisJCXJldHVybiBkdW1teTsKIAl9CiB9CiAKKwogc3RhdGljIHZvaWQgcjMwMFNldHVwUGl4ZWxTaGFkZXIocjMwMENvbnRleHRQdHIgcm1lc2EpCiB7CiAJR0xjb250ZXh0ICpjdHggPSBybWVzYS0+cmFkZW9uLmdsQ3R4OwogCXN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gKHN0cnVjdCByMzAwX2ZyYWdtZW50X3Byb2dyYW0gKikKIAkgICAgKGNoYXIgKiljdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKwlzdHJ1Y3QgcjMwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGU7CiAJaW50IGksIGs7CiAKIAlpZiAoIWZwKQkJLyogc2hvdWxkIG9ubHkgaGFwcGVuZW4gb25jZSwganVzdCBhZnRlciBjb250ZXh0IGlzIGNyZWF0ZWQgKi8KQEAgLTIwNDksNzYgKzI1MzEsMTc0IEBACiAJCQlfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CiAJfQorCWNvZGUgPSAmZnAtPmNvZGU7CisKKwlyMzAwU2V0dXBUZXh0dXJlcyhjdHgpOwogCiAJUjMwMF9TVEFURUNIQU5HRShybWVzYSwgZnBpWzBdKTsKLQlybWVzYS0+aHcuZnBpWzBdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX0lOU1RSMF8wLCBmcC0+YWx1X2VuZCArIDEpOwotCWZvciAoaSA9IDA7IGkgPD0gZnAtPmFsdV9lbmQ7IGkrKykgewotCQlybWVzYS0+aHcuZnBpWzBdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBmcC0+YWx1Lmluc3RbaV0uaW5zdDA7Ci0JfQotCiAJUjMwMF9TVEFURUNIQU5HRShybWVzYSwgZnBpWzFdKTsKLQlybWVzYS0+aHcuZnBpWzFdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX0lOU1RSMV8wLCBmcC0+YWx1X2VuZCArIDEpOwotCWZvciAoaSA9IDA7IGkgPD0gZnAtPmFsdV9lbmQ7IGkrKykgewotCQlybWVzYS0+aHcuZnBpWzFdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBmcC0+YWx1Lmluc3RbaV0uaW5zdDE7Ci0JfQotCiAJUjMwMF9TVEFURUNIQU5HRShybWVzYSwgZnBpWzJdKTsKLQlybWVzYS0+aHcuZnBpWzJdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX0lOU1RSMl8wLCBmcC0+YWx1X2VuZCArIDEpOwotCWZvciAoaSA9IDA7IGkgPD0gZnAtPmFsdV9lbmQ7IGkrKykgewotCQlybWVzYS0+aHcuZnBpWzJdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBmcC0+YWx1Lmluc3RbaV0uaW5zdDI7Ci0JfQotCiAJUjMwMF9TVEFURUNIQU5HRShybWVzYSwgZnBpWzNdKTsKLQlybWVzYS0+aHcuZnBpWzNdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX0lOU1RSM18wLCBmcC0+YWx1X2VuZCArIDEpOwotCWZvciAoaSA9IDA7IGkgPD0gZnAtPmFsdV9lbmQ7IGkrKykgewotCQlybWVzYS0+aHcuZnBpWzNdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBmcC0+YWx1Lmluc3RbaV0uaW5zdDM7CisJcm1lc2EtPmh3LmZwaVswXS5jbWRbUjMwMF9GUElfQ01EXzBdID0gY21kcGFja2V0MChSMzAwX1VTX0FMVV9SR0JfSU5TVF8wLCBjb2RlLT5hbHUubGVuZ3RoKTsKKwlybWVzYS0+aHcuZnBpWzFdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVVNfQUxVX1JHQl9BRERSXzAsIGNvZGUtPmFsdS5sZW5ndGgpOworCXJtZXNhLT5ody5mcGlbMl0uY21kW1IzMDBfRlBJX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9VU19BTFVfQUxQSEFfSU5TVF8wLCBjb2RlLT5hbHUubGVuZ3RoKTsKKwlybWVzYS0+aHcuZnBpWzNdLmNtZFtSMzAwX0ZQSV9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfVVNfQUxVX0FMUEhBX0FERFJfMCwgY29kZS0+YWx1Lmxlbmd0aCk7CisJZm9yIChpID0gMDsgaSA8IGNvZGUtPmFsdS5sZW5ndGg7IGkrKykgeworCQlybWVzYS0+aHcuZnBpWzBdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBjb2RlLT5hbHUuaW5zdFtpXS5pbnN0MDsKKwkJcm1lc2EtPmh3LmZwaVsxXS5jbWRbUjMwMF9GUElfSU5TVFJfMCArIGldID0gY29kZS0+YWx1Lmluc3RbaV0uaW5zdDE7CisJCXJtZXNhLT5ody5mcGlbMl0uY21kW1IzMDBfRlBJX0lOU1RSXzAgKyBpXSA9IGNvZGUtPmFsdS5pbnN0W2ldLmluc3QyOworCQlybWVzYS0+aHcuZnBpWzNdLmNtZFtSMzAwX0ZQSV9JTlNUUl8wICsgaV0gPSBjb2RlLT5hbHUuaW5zdFtpXS5pbnN0MzsKIAl9CiAKIAlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCBmcCk7Ci0Jcm1lc2EtPmh3LmZwLmNtZFtSMzAwX0ZQX0NOVEwwXSA9IGZwLT5jdXJfbm9kZSB8IChmcC0+Zmlyc3Rfbm9kZV9oYXNfdGV4IDw8IDMpOwotCXJtZXNhLT5ody5mcC5jbWRbUjMwMF9GUF9DTlRMMV0gPSBmcC0+bWF4X3RlbXBfaWR4OworCXJtZXNhLT5ody5mcC5jbWRbUjMwMF9GUF9DTlRMMF0gPSBjb2RlLT5jdXJfbm9kZSB8IChjb2RlLT5maXJzdF9ub2RlX2hhc190ZXggPDwgMyk7CisJcm1lc2EtPmh3LmZwLmNtZFtSMzAwX0ZQX0NOVEwxXSA9IGNvZGUtPm1heF90ZW1wX2lkeDsKIAlybWVzYS0+aHcuZnAuY21kW1IzMDBfRlBfQ05UTDJdID0KLQkgIChmcC0+YWx1X29mZnNldCA8PCBSMzAwX1BGU19DTlRMX0FMVV9PRkZTRVRfU0hJRlQpIHwKLQkgIChmcC0+YWx1X2VuZCA8PCBSMzAwX1BGU19DTlRMX0FMVV9FTkRfU0hJRlQpIHwKLQkgIChmcC0+dGV4X29mZnNldCA8PCBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQpIHwKLQkgIChmcC0+dGV4X2VuZCA8PCBSMzAwX1BGU19DTlRMX1RFWF9FTkRfU0hJRlQpOworCSAgKDAgPDwgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX1NISUZUKSB8CisJICAoKGNvZGUtPmFsdS5sZW5ndGgtMSkgPDwgUjMwMF9QRlNfQ05UTF9BTFVfRU5EX1NISUZUKSB8CisJICAoMCA8PCBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQpIHwKKwkgICgoY29kZS0+dGV4Lmxlbmd0aCA/IGNvZGUtPnRleC5sZW5ndGgtMSA6IDApIDw8IFIzMDBfUEZTX0NOVExfVEVYX0VORF9TSElGVCk7CiAJLyogSSBqdXN0IHdhbnQgdG8gc2F5LCB0aGUgd2F5IHRoZXNlIG5vZGVzIGFyZSBzdG9yZWQuLiB3ZWlyZC4uICovCi0JZm9yIChpID0gMCwgayA9ICg0IC0gKGZwLT5jdXJfbm9kZSArIDEpKTsgaSA8IDQ7IGkrKywgaysrKSB7Ci0JCWlmIChpIDwgKGZwLT5jdXJfbm9kZSArIDEpKSB7CisJZm9yIChpID0gMCwgayA9ICg0IC0gKGNvZGUtPmN1cl9ub2RlICsgMSkpOyBpIDwgNDsgaSsrLCBrKyspIHsKKwkJaWYgKGkgPCAoY29kZS0+Y3VyX25vZGUgKyAxKSkgewogCQkJcm1lc2EtPmh3LmZwLmNtZFtSMzAwX0ZQX05PREUwICsga10gPQotCQkJICAoZnAtPm5vZGVbaV0uYWx1X29mZnNldCA8PCBSMzAwX1BGU19OT0RFX0FMVV9PRkZTRVRfU0hJRlQpIHwKLQkJCSAgKGZwLT5ub2RlW2ldLmFsdV9lbmQgPDwgUjMwMF9QRlNfTk9ERV9BTFVfRU5EX1NISUZUKSB8Ci0JCQkgIChmcC0+bm9kZVtpXS50ZXhfb2Zmc2V0IDw8IFIzMDBfUEZTX05PREVfVEVYX09GRlNFVF9TSElGVCkgfAotCQkJICAoZnAtPm5vZGVbaV0udGV4X2VuZCA8PCBSMzAwX1BGU19OT0RFX1RFWF9FTkRfU0hJRlQpIHwKLQkJCSAgZnAtPm5vZGVbaV0uZmxhZ3M7CisJCQkgIChjb2RlLT5ub2RlW2ldLmFsdV9vZmZzZXQgPDwgUjMwMF9BTFVfU1RBUlRfU0hJRlQpIHwKKwkJCSAgKGNvZGUtPm5vZGVbaV0uYWx1X2VuZCA8PCBSMzAwX0FMVV9TSVpFX1NISUZUKSB8CisJCQkgIChjb2RlLT5ub2RlW2ldLnRleF9vZmZzZXQgPDwgUjMwMF9URVhfU1RBUlRfU0hJRlQpIHwKKwkJCSAgKGNvZGUtPm5vZGVbaV0udGV4X2VuZCA8PCBSMzAwX1RFWF9TSVpFX1NISUZUKSB8CisJCQkgIGNvZGUtPm5vZGVbaV0uZmxhZ3M7CiAJCX0gZWxzZSB7CiAJCQlybWVzYS0+aHcuZnAuY21kW1IzMDBfRlBfTk9ERTAgKyAoMyAtIGkpXSA9IDA7CiAJCX0KIAl9CiAKIAlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCBmcHApOwotCXJtZXNhLT5ody5mcHAuY21kW1IzMDBfRlBQX0NNRF8wXSA9IGNtZHBhY2tldDAoUjMwMF9QRlNfUEFSQU1fMF9YLCBmcC0+Y29uc3RfbnIgKiA0KTsKLQlmb3IgKGkgPSAwOyBpIDwgZnAtPmNvbnN0X25yOyBpKyspIHsKLQkJcm1lc2EtPmh3LmZwcC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgMF0gPSByMzAwUGFja0Zsb2F0MjQoZnAtPmNvbnN0YW50W2ldWzBdKTsKLQkJcm1lc2EtPmh3LmZwcC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgMV0gPSByMzAwUGFja0Zsb2F0MjQoZnAtPmNvbnN0YW50W2ldWzFdKTsKLQkJcm1lc2EtPmh3LmZwcC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgMl0gPSByMzAwUGFja0Zsb2F0MjQoZnAtPmNvbnN0YW50W2ldWzJdKTsKLQkJcm1lc2EtPmh3LmZwcC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgM10gPSByMzAwUGFja0Zsb2F0MjQoZnAtPmNvbnN0YW50W2ldWzNdKTsKKwlybWVzYS0+aHcuZnBwLmNtZFtSMzAwX0ZQUF9DTURfMF0gPSBjbWRwYWNrZXQwKFIzMDBfUEZTX1BBUkFNXzBfWCwgY29kZS0+Y29uc3RfbnIgKiA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZS0+Y29uc3RfbnI7IGkrKykgeworCQljb25zdCBHTGZsb2F0ICpjb25zdGFudCA9IGdldF9mcmFnbWVudHByb2dyYW1fY29uc3RhbnQoY3R4LAorCQkJJmZwLT5tZXNhX3Byb2dyYW0uQmFzZSwgY29kZS0+Y29uc3RhbnRbaV0pOworCQlybWVzYS0+aHcuZnBwLmNtZFtSMzAwX0ZQUF9QQVJBTV8wICsgNCAqIGkgKyAwXSA9IHIzMDBQYWNrRmxvYXQyNChjb25zdGFudFswXSk7CisJCXJtZXNhLT5ody5mcHAuY21kW1IzMDBfRlBQX1BBUkFNXzAgKyA0ICogaSArIDFdID0gcjMwMFBhY2tGbG9hdDI0KGNvbnN0YW50WzFdKTsKKwkJcm1lc2EtPmh3LmZwcC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgMl0gPSByMzAwUGFja0Zsb2F0MjQoY29uc3RhbnRbMl0pOworCQlybWVzYS0+aHcuZnBwLmNtZFtSMzAwX0ZQUF9QQVJBTV8wICsgNCAqIGkgKyAzXSA9IHIzMDBQYWNrRmxvYXQyNChjb25zdGFudFszXSk7CiAJfQogfQogCisjZGVmaW5lIGJ1bXBfcjUwMGZwX2NvdW50KHB0ciwgbmV3X2NvdW50KSAgIGRve1wKKwlkcm1fcjMwMF9jbWRfaGVhZGVyX3QqIF9wPSgoZHJtX3IzMDBfY21kX2hlYWRlcl90KikocHRyKSk7XAorCWludCBfbmM9KG5ld19jb3VudCkvNjsgXAorCWFzc2VydChfbmMgPCAyNTYpOyBcCisJaWYoX25jPl9wLT5yNTAwZnAuY291bnQpX3AtPnI1MDBmcC5jb3VudD1fbmM7XAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGJ1bXBfcjUwMGZwX2NvbnN0X2NvdW50KHB0ciwgbmV3X2NvdW50KSAgIGRve1wKKwlkcm1fcjMwMF9jbWRfaGVhZGVyX3QqIF9wPSgoZHJtX3IzMDBfY21kX2hlYWRlcl90KikocHRyKSk7XAorCWludCBfbmM9KG5ld19jb3VudCkvNDsgXAorCWFzc2VydChfbmMgPCAyNTYpOyBcCisJaWYoX25jPl9wLT5yNTAwZnAuY291bnQpX3AtPnI1MDBmcC5jb3VudD1fbmM7XAorfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCByNTAwU2V0dXBQaXhlbFNoYWRlcihyMzAwQ29udGV4dFB0ciBybWVzYSkKK3sKKwlHTGNvbnRleHQgKmN0eCA9IHJtZXNhLT5yYWRlb24uZ2xDdHg7CisJc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbSAqKQorCSAgICAoY2hhciAqKWN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50OworCWludCBpOworCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29kZSAqY29kZTsKKworCWlmICghZnApCQkvKiBzaG91bGQgb25seSBoYXBwZW5lbiBvbmNlLCBqdXN0IGFmdGVyIGNvbnRleHQgaXMgY3JlYXRlZCAqLworCQlyZXR1cm47CisKKwkoKGRybV9yMzAwX2NtZF9oZWFkZXJfdCAqKSBybWVzYS0+aHcucjUwMGZwLmNtZCktPnI1MDBmcC5jb3VudCA9IDA7CisJKChkcm1fcjMwMF9jbWRfaGVhZGVyX3QgKikgcm1lc2EtPmh3LnI1MDBmcF9jb25zdC5jbWQpLT5yNTAwZnAuY291bnQgPSAwOworCisJcjUwMFRyYW5zbGF0ZUZyYWdtZW50U2hhZGVyKHJtZXNhLCBmcCk7CisJaWYgKCFmcC0+dHJhbnNsYXRlZCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBObyB2YWxpZCBmcmFnbWVudCBzaGFkZXIsIGV4aXRpbmdcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWNvZGUgPSAmZnAtPmNvZGU7CisKKwlpZiAoZnAtPm1lc2FfcHJvZ3JhbS5Gb2dPcHRpb24gIT0gR0xfTk9ORSkgeworCQkvKiBFbmFibGUgSFcgZm9nLiBUcnkgbm90IHRvIHNxdWlzaCBHTCBjb250ZXh0LgorCQkgKiAoQW55Ym9keSBzYW5lIHJlbWVtYmVyZWQgdG8gc2V0IGdsRm9nKCkgb3B0cyBmaXJzdCEpICovCisJCXIzMDBTZXRGb2dTdGF0ZShjdHgsIEdMX1RSVUUpOworCQljdHgtPkZvZy5Nb2RlID0gZnAtPm1lc2FfcHJvZ3JhbS5Gb2dPcHRpb247CisJCXIzMDBGb2dmdihjdHgsIEdMX0ZPR19NT0RFLCBOVUxMKTsKKwl9IGVsc2UKKwkJLyogTWFrZSBzdXJlIEhXIGlzIG1hdGNoaW5nIEdMIGNvbnRleHQuICovCisJCXIzMDBTZXRGb2dTdGF0ZShjdHgsIGN0eC0+Rm9nLkVuYWJsZWQpOworCisJcjMwMFNldHVwVGV4dHVyZXMoY3R4KTsKKworCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIGZwKTsKKwlybWVzYS0+aHcuZnAuY21kW1I1MDBfRlBfUElYU0laRV0gPSBjb2RlLT5tYXhfdGVtcF9pZHg7CisKKwlybWVzYS0+aHcuZnAuY21kW1I1MDBfRlBfQ09ERV9BRERSXSA9CisJICAgIFI1MDBfVVNfQ09ERV9TVEFSVF9BRERSKGNvZGUtPmluc3Rfb2Zmc2V0KSB8CisJICAgIFI1MDBfVVNfQ09ERV9FTkRfQUREUihjb2RlLT5pbnN0X2VuZCk7CisJcm1lc2EtPmh3LmZwLmNtZFtSNTAwX0ZQX0NPREVfUkFOR0VdID0KKwkgICAgUjUwMF9VU19DT0RFX1JBTkdFX0FERFIoY29kZS0+aW5zdF9vZmZzZXQpIHwKKwkgICAgUjUwMF9VU19DT0RFX1JBTkdFX1NJWkUoY29kZS0+aW5zdF9lbmQpOworCXJtZXNhLT5ody5mcC5jbWRbUjUwMF9GUF9DT0RFX09GRlNFVF0gPQorCSAgICBSNTAwX1VTX0NPREVfT0ZGU0VUX0FERFIoMCk7IC8qIEZJWE1FIHdoZW4gd2UgYWRkIGZsb3cgY29udHJvbCAqLworCisJUjMwMF9TVEFURUNIQU5HRShybWVzYSwgcjUwMGZwKTsKKwkvKiBFbWl0IG91ciBzaGFkZXIuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29kZS0+aW5zdF9lbmQrMTsgaSsrKSB7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNisxXSA9IGNvZGUtPmluc3RbaV0uaW5zdDA7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNisyXSA9IGNvZGUtPmluc3RbaV0uaW5zdDE7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNiszXSA9IGNvZGUtPmluc3RbaV0uaW5zdDI7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNis0XSA9IGNvZGUtPmluc3RbaV0uaW5zdDM7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNis1XSA9IGNvZGUtPmluc3RbaV0uaW5zdDQ7CisJCXJtZXNhLT5ody5yNTAwZnAuY21kW2kqNis2XSA9IGNvZGUtPmluc3RbaV0uaW5zdDU7CisJfQorCisJYnVtcF9yNTAwZnBfY291bnQocm1lc2EtPmh3LnI1MDBmcC5jbWQsIChjb2RlLT5pbnN0X2VuZCArIDEpICogNik7CisKKwlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCByNTAwZnBfY29uc3QpOworCWZvciAoaSA9IDA7IGkgPCBjb2RlLT5jb25zdF9ucjsgaSsrKSB7CisJCWNvbnN0IEdMZmxvYXQgKmNvbnN0YW50ID0gZ2V0X2ZyYWdtZW50cHJvZ3JhbV9jb25zdGFudChjdHgsCisJCQkmZnAtPm1lc2FfcHJvZ3JhbS5CYXNlLCBjb2RlLT5jb25zdGFudFtpXSk7CisJCXJtZXNhLT5ody5yNTAwZnBfY29uc3QuY21kW1IzMDBfRlBQX1BBUkFNXzAgKyA0ICogaSArIDBdID0gcjMwMFBhY2tGbG9hdDMyKGNvbnN0YW50WzBdKTsKKwkJcm1lc2EtPmh3LnI1MDBmcF9jb25zdC5jbWRbUjMwMF9GUFBfUEFSQU1fMCArIDQgKiBpICsgMV0gPSByMzAwUGFja0Zsb2F0MzIoY29uc3RhbnRbMV0pOworCQlybWVzYS0+aHcucjUwMGZwX2NvbnN0LmNtZFtSMzAwX0ZQUF9QQVJBTV8wICsgNCAqIGkgKyAyXSA9IHIzMDBQYWNrRmxvYXQzMihjb25zdGFudFsyXSk7CisJCXJtZXNhLT5ody5yNTAwZnBfY29uc3QuY21kW1IzMDBfRlBQX1BBUkFNXzAgKyA0ICogaSArIDNdID0gcjMwMFBhY2tGbG9hdDMyKGNvbnN0YW50WzNdKTsKKwl9CisJYnVtcF9yNTAwZnBfY29uc3RfY291bnQocm1lc2EtPmh3LnI1MDBmcF9jb25zdC5jbWQsIGNvZGUtPmNvbnN0X25yICogNCk7CisKK30KKwogdm9pZCByMzAwVXBkYXRlU2hhZGVyU3RhdGVzKHIzMDBDb250ZXh0UHRyIHJtZXNhKQogewogCUdMY29udGV4dCAqY3R4OwogCWN0eCA9IHJtZXNhLT5yYWRlb24uZ2xDdHg7CiAKIAlyMzAwVXBkYXRlVGV4dHVyZVN0YXRlKGN0eCk7CisJcjMwMFNldEVhcmx5WlN0YXRlKGN0eCk7CiAKLQlyMzAwU2V0dXBQaXhlbFNoYWRlcihybWVzYSk7Ci0JcjMwMFNldHVwVGV4dHVyZXMoY3R4KTsKKwlHTHVpbnQgZmdkZXB0aHNyYyA9IFIzMDBfRkdfREVQVEhfU1JDX1NDQU47CisJaWYgKGN1cnJlbnRfZnJhZ21lbnRfcHJvZ3JhbV93cml0ZXNfZGVwdGgoY3R4KSkKKwkJZmdkZXB0aHNyYyA9IFIzMDBfRkdfREVQVEhfU1JDX1NIQURFUjsKKwlpZiAoZmdkZXB0aHNyYyAhPSBybWVzYS0+aHcuZmdfZGVwdGhfc3JjLmNtZFsxXSkgeworCQlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCBmZ19kZXB0aF9zcmMpOworCQlybWVzYS0+aHcuZmdfZGVwdGhfc3JjLmNtZFsxXSA9IGZnZGVwdGhzcmM7CisJfQorCisJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkKKwkJcjUwMFNldHVwUGl4ZWxTaGFkZXIocm1lc2EpOworCWVsc2UKKwkJcjMwMFNldHVwUGl4ZWxTaGFkZXIocm1lc2EpOworCisJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkKKwkJcjUwMFNldHVwUlNVbml0KGN0eCk7CisJZWxzZQorCQlyMzAwU2V0dXBSU1VuaXQoY3R4KTsKIAogCWlmICgocm1lc2EtPnJhZGVvbi5yYWRlb25TY3JlZW4tPmNoaXBfZmxhZ3MgJiBSQURFT05fQ0hJUFNFVF9UQ0wpKQogCQlyMzAwU2V0dXBWZXJ0ZXhQcm9ncmFtKHJtZXNhKTsKLQlyMzAwU2V0dXBSU1VuaXQoY3R4KTsKKwogfQogCiAvKioKQEAgLTIxNTgsMTMgKzI3MzgsMTEgQEAKIAlzd2l0Y2ggKGN0eC0+VmlzdWFsLmRlcHRoQml0cykgewogCWNhc2UgMTY6CiAJCXIzMDAtPnN0YXRlLmRlcHRoLnNjYWxlID0gMS4wIC8gKEdMZmxvYXQpIDB4ZmZmZjsKLQkJZGVwdGhfZm10ID0gUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1o7Ci0JCXIzMDAtPnN0YXRlLnN0ZW5jaWwuY2xlYXIgPSAweDAwMDAwMDAwOworCQlkZXB0aF9mbXQgPSBSMzAwX0RFUFRIRk9STUFUXzE2QklUX0lOVF9aOwogCQlicmVhazsKIAljYXNlIDI0OgogCQlyMzAwLT5zdGF0ZS5kZXB0aC5zY2FsZSA9IDEuMCAvIChHTGZsb2F0KSAweGZmZmZmZjsKLQkJZGVwdGhfZm10ID0gUjMwMF9ERVBUSF9GT1JNQVRfMjRCSVRfSU5UX1o7Ci0JCXIzMDAtPnN0YXRlLnN0ZW5jaWwuY2xlYXIgPSAweDAwZmYwMDAwOworCQlkZXB0aF9mbXQgPSBSMzAwX0RFUFRIRk9STUFUXzI0QklUX0lOVF9aXzhCSVRfU1RFTkNJTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5zdXBwb3J0ZWQgZGVwdGggJWQuLi4gZXhpdGluZ1xuIiwKQEAgLTIxODgsNiArMjc2NiwyNCBAQAogCSh2b2lkKW1vZGU7CiB9CiAKK3ZvaWQgcjMwMFVwZGF0ZUNsaXBQbGFuZXMoIEdMY29udGV4dCAqY3R4ICkKK3sKKwlyMzAwQ29udGV4dFB0ciBybWVzYSA9IFIzMDBfQ09OVEVYVChjdHgpOworCUdMdWludCBwOworCisJZm9yIChwID0gMDsgcCA8IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsgcCsrKSB7CisJCWlmIChjdHgtPlRyYW5zZm9ybS5DbGlwUGxhbmVzRW5hYmxlZCAmICgxIDw8IHApKSB7CisJCQlHTGludCAqaXAgPSAoR0xpbnQgKiljdHgtPlRyYW5zZm9ybS5fQ2xpcFVzZXJQbGFuZVtwXTsKKworCQkJUjMwMF9TVEFURUNIQU5HRSggcm1lc2EsIHZwdWNwW3BdICk7CisJCQlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfWF0gPSBpcFswXTsKKwkJCXJtZXNhLT5ody52cHVjcFtwXS5jbWRbUjMwMF9WUFVDUF9ZXSA9IGlwWzFdOworCQkJcm1lc2EtPmh3LnZwdWNwW3BdLmNtZFtSMzAwX1ZQVUNQX1pdID0gaXBbMl07CisJCQlybWVzYS0+aHcudnB1Y3BbcF0uY21kW1IzMDBfVlBVQ1BfV10gPSBpcFszXTsKKwkJfQorCX0KK30KKwogLyoqCiAgKiBJbml0aWFsaXplIGRyaXZlcidzIHN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9ucwogICovCkBAIC0yMjA4LDkgKzI4MDQsMTIgQEAKIAlmdW5jdGlvbnMtPkZvZ2Z2ID0gcjMwMEZvZ2Z2OwogCWZ1bmN0aW9ucy0+RnJvbnRGYWNlID0gcjMwMEZyb250RmFjZTsKIAlmdW5jdGlvbnMtPlNoYWRlTW9kZWwgPSByMzAwU2hhZGVNb2RlbDsKKwlmdW5jdGlvbnMtPkxvZ2ljT3Bjb2RlID0gcjMwMExvZ2ljT3Bjb2RlOworCisJLyogQVJCX3BvaW50X3BhcmFtZXRlcnMgKi8KKwlmdW5jdGlvbnMtPlBvaW50UGFyYW1ldGVyZnYgPSByMzAwUG9pbnRQYXJhbWV0ZXI7CiAKIAkvKiBTdGVuY2lsIHJlbGF0ZWQgKi8KLQlmdW5jdGlvbnMtPkNsZWFyU3RlbmNpbCA9IHIzMDBDbGVhclN0ZW5jaWw7CiAJZnVuY3Rpb25zLT5TdGVuY2lsRnVuY1NlcGFyYXRlID0gcjMwMFN0ZW5jaWxGdW5jU2VwYXJhdGU7CiAJZnVuY3Rpb25zLT5TdGVuY2lsTWFza1NlcGFyYXRlID0gcjMwMFN0ZW5jaWxNYXNrU2VwYXJhdGU7CiAJZnVuY3Rpb25zLT5TdGVuY2lsT3BTZXBhcmF0ZSA9IHIzMDBTdGVuY2lsT3BTZXBhcmF0ZTsKQEAgLTIyMjUsNCArMjgyNCw2IEBACiAJZnVuY3Rpb25zLT5Qb2x5Z29uTW9kZSA9IHIzMDBQb2x5Z29uTW9kZTsKIAogCWZ1bmN0aW9ucy0+UmVuZGVyTW9kZSA9IHIzMDBSZW5kZXJNb2RlOworCisJZnVuY3Rpb25zLT5DbGlwUGxhbmUgPSByMzAwQ2xpcFBsYW5lOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3N0YXRlLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfc3RhdGUuaAppbmRleCAzNjVmN2VjLi4wNTg5YWI3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfc3RhdGUuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfc3RhdGUuaApAQCAtNjUsMTMgKzY1LDE2IEBACiAgICAgXAogfSB3aGlsZSAoMCkKIAotZXh0ZXJuIHZvaWQgcjMwMFVwZGF0ZVN0YXRlUGFyYW1ldGVycyhHTGNvbnRleHQgKiBjdHgsIEdMdWludCBuZXdfc3RhdGUpOwotZXh0ZXJuIHZvaWQgcjMwMEluaXRTdGF0ZShyMzAwQ29udGV4dFB0ciByMzAwKTsKLWV4dGVybiB2b2lkIHIzMDBJbml0U3RhdGVGdW5jcyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyk7Ci1leHRlcm4gdm9pZCByMzAwVXBkYXRlVmlld3BvcnRPZmZzZXQoR0xjb250ZXh0ICogY3R4KTsKLWV4dGVybiB2b2lkIHIzMDBVcGRhdGVEcmF3QnVmZmVyKEdMY29udGV4dCAqIGN0eCk7Ci0KLWV4dGVybiB2b2lkIHIzMDBVcGRhdGVTaGFkZXJzKHIzMDBDb250ZXh0UHRyIHJtZXNhKTsKLWV4dGVybiB2b2lkIHIzMDBVcGRhdGVTaGFkZXJTdGF0ZXMocjMwMENvbnRleHRQdHIgcm1lc2EpOworLy8gcjMwMF9zdGF0ZS5jCitleHRlcm4gaW50IGZ1dHVyZV9od190Y2xfb247Cit2b2lkIF90bmxfVXBkYXRlRml4ZWRGdW5jdGlvblByb2dyYW0gKEdMY29udGV4dCAqIGN0eCk7Cit2b2lkIHIzMDBVcGRhdGVWaWV3cG9ydE9mZnNldCAoR0xjb250ZXh0ICogY3R4KTsKK3ZvaWQgcjMwMFVwZGF0ZURyYXdCdWZmZXIgKEdMY29udGV4dCAqIGN0eCk7Cit2b2lkIHIzMDBVcGRhdGVTdGF0ZVBhcmFtZXRlcnMgKEdMY29udGV4dCAqIGN0eCwgR0x1aW50IG5ld19zdGF0ZSk7Cit2b2lkIHIzMDBVcGRhdGVTaGFkZXJzIChyMzAwQ29udGV4dFB0ciBybWVzYSk7Cit2b2lkIHIzMDBVcGRhdGVTaGFkZXJTdGF0ZXMgKHIzMDBDb250ZXh0UHRyIHJtZXNhKTsKK3ZvaWQgcjMwMEluaXRTdGF0ZSAocjMwMENvbnRleHRQdHIgcjMwMCk7Cit2b2lkIHIzMDBVcGRhdGVDbGlwUGxhbmVzIChHTGNvbnRleHQgKiBjdHgpOwordm9pZCByMzAwSW5pdFN0YXRlRnVuY3MgKHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKTsKIAogI2VuZGlmCQkJCS8qIF9fUjMwMF9TVEFURV9IX18gKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF9zd3RjbC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3N3dGNsLmMKaW5kZXggYzk0OWYzMy4uOGFlYmQ5YiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3N3dGNsLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3N3dGNsLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICJlbnVtcy5oIgogI2luY2x1ZGUgImltYWdlLmgiCiAjaW5jbHVkZSAiaW1wb3J0cy5oIgorI2luY2x1ZGUgImxpZ2h0LmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCiAKICNpbmNsdWRlICJzd3Jhc3Qvc19jb250ZXh0LmgiCkBAIC03NywzMSArNzgsNiBAQAogICAgcm1lc2EtPnN3dGNsLnZlcnRleF9hdHRyX2NvdW50Kys7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0vKiB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgVklSMCBpbiBlbWl0LmMgLSBUT0RPIG1lcmdlIHRoZW0gdXNpbmcgYW5vdGhlciBvcHRpb24gKi8KLXN0YXRpYyBHTHVpbnQgcjMwMFZBUElucHV0Um91dGUwKHVpbnQzMl90ICogZHN0LCBHTHZlY3RvcjRmICoqIGF0dHJpYnB0ciwKLQkJCQkgaW50ICppbnB1dHMsIEdMaW50ICogdGFiLCBHTHVpbnQgbnIpCi17Ci0JR0x1aW50IGksIGR3OwotCi0JLyogdHlwZSwgaW5wdXRzLCBzdG9wIGJpdCwgc2l6ZSAqLwotCWZvciAoaSA9IDA7IGkgKyAxIDwgbnI7IGkgKz0gMikgewotCQlkdyA9IChpbnB1dHNbdGFiW2ldXSA8PCA4KSB8IDB4MzsKLQkJZHcgfD0gKChpbnB1dHNbdGFiW2kgKyAxXV0gPDwgOCkgfCAweDMpIDw8IDE2OwotCQlpZiAoaSArIDIgPT0gbnIpIHsKLQkJCWR3IHw9IChSMzAwX1ZBUF9JTlBVVF9ST1VURV9FTkQgPDwgMTYpOwotCQl9Ci0JCWRzdFtpID4+IDFdID0gZHc7Ci0JfQotCi0JaWYgKG5yICYgMSkgewotCQlkdyA9IChpbnB1dHNbdGFiW25yIC0gMV1dIDw8IDgpIHwgMHgzOwotCQlkdyB8PSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9FTkQ7Ci0JCWRzdFtuciA+PiAxXSA9IGR3OwotCX0KLQotCXJldHVybiAobnIgKyAxKSA+PiAxOwotfQotCiBzdGF0aWMgdm9pZCByMzAwU2V0VmVydGV4Rm9ybWF0KCBHTGNvbnRleHQgKmN0eCApCiB7CiAJcjMwMENvbnRleHRQdHIgcm1lc2EgPSBSMzAwX0NPTlRFWFQoIGN0eCApOwpAQCAtMTE3LDE5ICs5MywyNCBAQAogCUdMaW50IHRhYltWRVJUX0FUVFJJQl9NQVhdOwogCWludCBzd2l6emxlW1ZFUlRfQVRUUklCX01BWF1bNF07CiAJR0x1aW50IGksIG5yOworCUdMdWludCBzeiwgdmFwX2ZtdF8xID0gMDsKIAogCURFQ0xBUkVfUkVOREVSSU5QVVRTKHJlbmRlcl9pbnB1dHNfYml0c2V0KTsKIAlSRU5ERVJJTlBVVFNfQ09QWShyZW5kZXJfaW5wdXRzX2JpdHNldCwgdG5sLT5yZW5kZXJfaW5wdXRzX2JpdHNldCk7CiAJUkVOREVSSU5QVVRTX0NPUFkoIGluZGV4X2JpdHNldCwgdG5sLT5yZW5kZXJfaW5wdXRzX2JpdHNldCApOwogCVJFTkRFUklOUFVUU19DT1BZKHJtZXNhLT5zdGF0ZS5yZW5kZXJfaW5wdXRzX2JpdHNldCwgcmVuZGVyX2lucHV0c19iaXRzZXQpOwogCisJdnRlID0gcm1lc2EtPmh3LnZ0ZS5jbWRbMV07CisJdnRlICY9IH4oUjMwMF9WVFhfWFlfRk1UIHwgUjMwMF9WVFhfWl9GTVQgfCBSMzAwX1ZUWF9XMF9GTVQpOwogCS8qIEltcG9ydGFudDoKIAkgKi8KIAlpZiAoIFZCLT5OZGNQdHIgIT0gTlVMTCApIHsKIAkJVkItPkF0dHJpYlB0cltWRVJUX0FUVFJJQl9QT1NdID0gVkItPk5kY1B0cjsKKwkJdnRlIHw9IFIzMDBfVlRYX1hZX0ZNVCB8IFIzMDBfVlRYX1pfRk1UOwogCX0KIAllbHNlIHsKIAkJVkItPkF0dHJpYlB0cltWRVJUX0FUVFJJQl9QT1NdID0gVkItPkNsaXBQdHI7CisJCXZ0ZSB8PSBSMzAwX1ZUWF9XMF9GTVQ7CiAJfQogCiAJYXNzZXJ0KCBWQi0+QXR0cmliUHRyW1ZFUlRfQVRUUklCX1BPU10gIT0gTlVMTCApOwpAQCAtMTM5LDE0ICsxMjAsMTUgQEAKIAkgKiBidWlsZCB1cCBhIGhhcmR3YXJlIHZlcnRleC4KIAkgKi8KIAlpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfUE9TKSkgewotCQl2YXBfdnRlX2NudGwgfD0gUjMwMF9WVFhfVzBfRk1UOworCQlzeiA9IFZCLT5BdHRyaWJQdHJbVkVSVF9BVFRSSUJfUE9TXS0+c2l6ZTsKIAkJSW5wdXRzUmVhZCB8PSAxIDw8IFZFUlRfQVRUUklCX1BPUzsKIAkJT3V0cHV0c1dyaXR0ZW4gfD0gMSA8PCBWRVJUX1JFU1VMVF9IUE9TOwotCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF80RiApOwotCX0gZWxzZQorCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPUywgRU1JVF8xRiArIHN6IC0gMSApOworCQlvZmZzZXQgPSBzejsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSA0OwogCQlFTUlUX1BBRCg0ICogc2l6ZW9mKGZsb2F0KSk7Ci0KLQlvZmZzZXQgPSA0OworCX0KIAogCWlmIChSRU5ERVJJTlBVVFNfVEVTVCggaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9QT0lOVFNJWkUgKSkgewogCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1BPSU5UU0laRSwgRU1JVF8xRiApOwpAQCAtMTU1LDE4ICsxMzcsMTkgQEAKIAl9CiAKIAlpZiAoUkVOREVSSU5QVVRTX1RFU1QoaW5kZXhfYml0c2V0LCBfVE5MX0FUVFJJQl9DT0xPUjApKSB7CisJCXN6ID0gVkItPkF0dHJpYlB0cltWRVJUX0FUVFJJQl9DT0xPUjBdLT5zaXplOwogCSAgICAgICAgcm1lc2EtPnN3dGNsLmNvbG9yb2Zmc2V0ID0gb2Zmc2V0OwogCQlJbnB1dHNSZWFkIHw9IDEgPDwgVkVSVF9BVFRSSUJfQ09MT1IwOwogCQlPdXRwdXRzV3JpdHRlbiB8PSAxIDw8IFZFUlRfUkVTVUxUX0NPTDA7Ci0JCUVNSVRfQVRUUiggX1ROTF9BVFRSSUJfQ09MT1IwLCBFTUlUXzRGICk7CisJCUVNSVRfQVRUUiggX1ROTF9BVFRSSUJfQ09MT1IwLCBFTUlUXzFGICsgc3ogLSAxICk7CisJCW9mZnNldCArPSBzejsKIAl9CiAKLQlvZmZzZXQgKz0gNDsKLQogCXJtZXNhLT5zd3RjbC5zcGVjb2Zmc2V0ID0gMDsKIAlpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfQ09MT1IxICkpIHsKKwkJc3ogPSBWQi0+QXR0cmliUHRyW1ZFUlRfQVRUUklCX0NPTE9SMV0tPnNpemU7CiAJCXJtZXNhLT5zd3RjbC5zcGVjb2Zmc2V0ID0gb2Zmc2V0OwotCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0NPTE9SMSwgRU1JVF80RiApOworCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX0NPTE9SMSwgRU1JVF8xRiArIHN6IC0gMSApOwogCQlJbnB1dHNSZWFkIHw9IDEgPDwgVkVSVF9BVFRSSUJfQ09MT1IxOwogCQlPdXRwdXRzV3JpdHRlbiB8PSAxIDw8IFZFUlRfUkVTVUxUX0NPTDE7CiAJfQpAQCAtMTc2LDkgKzE1OSwxMSBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0czsgaSsrKSB7CiAJCQlpZiAoUkVOREVSSU5QVVRTX1RFU1QoIGluZGV4X2JpdHNldCwgX1ROTF9BVFRSSUJfVEVYKGkpICkpIHsKKwkJCQlzeiA9IFZCLT5UZXhDb29yZFB0cltpXS0+c2l6ZTsKIAkJCQlJbnB1dHNSZWFkIHw9IDEgPDwgKFZFUlRfQVRUUklCX1RFWDAgKyBpKTsKIAkJCQlPdXRwdXRzV3JpdHRlbiB8PSAxIDw8IChWRVJUX1JFU1VMVF9URVgwICsgaSk7Ci0JCQkJRU1JVF9BVFRSKCBfVE5MX0FUVFJJQl9URVgwK2ksIEVNSVRfNEYgKTsKKwkJCQlFTUlUX0FUVFIoIF9UTkxfQVRUUklCX1RFWDAraSwgRU1JVF8xRiArIHN6IC0gMSApOworCQkJCXZhcF9mbXRfMSB8PSBzeiA8PCAoMyAqIGkpOwogCQkJfQogCQl9CiAJfQpAQCAtMjM3LDcgKzIyMiw3IEBACiAgICAKIAlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCB2b2YpOwogCXJtZXNhLT5ody52b2YuY21kW1IzMDBfVk9GX0NOVExfMF0gPSByMzAwVkFQT3V0cHV0Q250bDAoY3R4LCBPdXRwdXRzV3JpdHRlbik7Ci0Jcm1lc2EtPmh3LnZvZi5jbWRbUjMwMF9WT0ZfQ05UTF8xXSA9IHIzMDBWQVBPdXRwdXRDbnRsMShjdHgsIE91dHB1dHNXcml0dGVuKTsKKwlybWVzYS0+aHcudm9mLmNtZFtSMzAwX1ZPRl9DTlRMXzFdID0gdmFwX2ZtdF8xOwogICAgCiAJcm1lc2EtPnN3dGNsLnZlcnRleF9zaXplID0KIAkJX3RubF9pbnN0YWxsX2F0dHJzKCBjdHgsCkBAIC0yNDksNyArMjM0LDcgQEAKIAogCVJFTkRFUklOUFVUU19DT1BZKCBybWVzYS0+dG5sX2luZGV4X2JpdHNldCwgaW5kZXhfYml0c2V0ICk7CiAKLQl2dGUgPSBybWVzYS0+aHcudnRlLmNtZFsxXTsKKwogCVIzMDBfU1RBVEVDSEFOR0Uocm1lc2EsIHZ0ZSk7CiAJcm1lc2EtPmh3LnZ0ZS5jbWRbMV0gPSB2dGU7CiAJcm1lc2EtPmh3LnZ0ZS5jbWRbMl0gPSBybWVzYS0+c3d0Y2wudmVydGV4X3NpemU7CkBAIC01OTAsNiArNTc1LDcgQEAKIAlyMzAwQ2hvb3NlUmVuZGVyU3RhdGUoY3R4KTsJCiAJcjMwMFNldFZlcnRleEZvcm1hdChjdHgpOwogCisJcjMwMFVwZGF0ZVNoYWRlcnMocm1lc2EpOwogCXIzMDBVcGRhdGVTaGFkZXJTdGF0ZXMocm1lc2EpOwogCiAJcjMwMEVtaXRDYWNoZUZsdXNoKHJtZXNhKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXguYwppbmRleCAxODA1Y2VjLi5mN2Y0OTcyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3RleC5jCkBAIC01MiwxMjkgKzUyLDU5IEBACiAKICNpbmNsdWRlICJ4bWxwb29sLmgiCiAKLS8qKgotICogU2V0IHRoZSB0ZXh0dXJlIHdyYXAgbW9kZXMuCi0gKgotICogXHBhcmFtIHQgVGV4dHVyZSBvYmplY3Qgd2hvc2Ugd3JhcCBtb2RlcyBhcmUgdG8gYmUgc2V0Ci0gKiBccGFyYW0gc3dyYXAgV3JhcCBtb2RlIGZvciB0aGUgXGEgcyB0ZXh0dXJlIGNvb3JkaW5hdGUKLSAqIFxwYXJhbSB0d3JhcCBXcmFwIG1vZGUgZm9yIHRoZSBcYSB0IHRleHR1cmUgY29vcmRpbmF0ZQotICovCiAKLXN0YXRpYyB2b2lkIHIzMDBTZXRUZXhXcmFwKHIzMDBUZXhPYmpQdHIgdCwgR0xlbnVtIHN3cmFwLCBHTGVudW0gdHdyYXAsCi0JCQkgICBHTGVudW0gcndyYXApCitzdGF0aWMgdW5zaWduZWQgaW50IHRyYW5zbGF0ZV93cmFwX21vZGUoR0xlbnVtIHdyYXBtb2RlKQogewotCXVuc2lnbmVkIGxvbmcgaHdfc3dyYXAgPSAwLCBod190d3JhcCA9IDAsIGh3X3F3cmFwID0gMDsKLQotCXQtPmZpbHRlciAmPQotCSAgICB+KFIzMDBfVFhfV1JBUF9TX01BU0sgfCBSMzAwX1RYX1dSQVBfVF9NQVNLIHwgUjMwMF9UWF9XUkFQX1FfTUFTSyk7Ci0KLQlzd2l0Y2ggKHN3cmFwKSB7Ci0JY2FzZSBHTF9SRVBFQVQ6Ci0JCWh3X3N3cmFwIHw9IFIzMDBfVFhfUkVQRUFUOwotCQlicmVhazsKLQljYXNlIEdMX0NMQU1QOgotCQlod19zd3JhcCB8PSBSMzAwX1RYX0NMQU1QOwotCQlicmVhazsKLQljYXNlIEdMX0NMQU1QX1RPX0VER0U6Ci0JCWh3X3N3cmFwIHw9IFIzMDBfVFhfQ0xBTVBfVE9fRURHRTsKLQkJYnJlYWs7Ci0JY2FzZSBHTF9DTEFNUF9UT19CT1JERVI6Ci0JCWh3X3N3cmFwIHw9IFIzMDBfVFhfQ0xBTVBfVE9fQk9SREVSOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKLQkJaHdfc3dyYXAgfD0gUjMwMF9UWF9SRVBFQVQgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUl9DTEFNUF9FWFQ6Ci0JCWh3X3N3cmFwIHw9IFIzMDBfVFhfQ0xBTVAgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVDoKLQkJaHdfc3dyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19FREdFIHwgUjMwMF9UWF9NSVJST1JFRDsKLQkJYnJlYWs7Ci0JY2FzZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVDoKLQkJaHdfc3dyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19CT1JERVIgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKKwlzd2l0Y2god3JhcG1vZGUpIHsKKwljYXNlIEdMX1JFUEVBVDogcmV0dXJuIFIzMDBfVFhfUkVQRUFUOworCWNhc2UgR0xfQ0xBTVA6IHJldHVybiBSMzAwX1RYX0NMQU1QOworCWNhc2UgR0xfQ0xBTVBfVE9fRURHRTogcmV0dXJuIFIzMDBfVFhfQ0xBTVBfVE9fRURHRTsKKwljYXNlIEdMX0NMQU1QX1RPX0JPUkRFUjogcmV0dXJuIFIzMDBfVFhfQ0xBTVBfVE9fQk9SREVSOworCWNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOiByZXR1cm4gUjMwMF9UWF9SRVBFQVQgfCBSMzAwX1RYX01JUlJPUkVEOworCWNhc2UgR0xfTUlSUk9SX0NMQU1QX0VYVDogcmV0dXJuIFIzMDBfVFhfQ0xBTVAgfCBSMzAwX1RYX01JUlJPUkVEOworCWNhc2UgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUOiByZXR1cm4gUjMwMF9UWF9DTEFNUF9UT19FREdFIHwgUjMwMF9UWF9NSVJST1JFRDsKKwljYXNlIEdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUOiByZXR1cm4gUjMwMF9UWF9DTEFNUF9UT19CT1JERVIgfCBSMzAwX1RYX01JUlJPUkVEOwogCWRlZmF1bHQ6Ci0JCV9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCBTIHdyYXAgbW9kZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisJCV9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCB3cmFwIG1vZGUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMDsKIAl9Ci0KLQlzd2l0Y2ggKHR3cmFwKSB7Ci0JY2FzZSBHTF9SRVBFQVQ6Ci0JCWh3X3R3cmFwIHw9IFIzMDBfVFhfUkVQRUFUOwotCQlicmVhazsKLQljYXNlIEdMX0NMQU1QOgotCQlod190d3JhcCB8PSBSMzAwX1RYX0NMQU1QOwotCQlicmVhazsKLQljYXNlIEdMX0NMQU1QX1RPX0VER0U6Ci0JCWh3X3R3cmFwIHw9IFIzMDBfVFhfQ0xBTVBfVE9fRURHRTsKLQkJYnJlYWs7Ci0JY2FzZSBHTF9DTEFNUF9UT19CT1JERVI6Ci0JCWh3X3R3cmFwIHw9IFIzMDBfVFhfQ0xBTVBfVE9fQk9SREVSOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKLQkJaHdfdHdyYXAgfD0gUjMwMF9UWF9SRVBFQVQgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUl9DTEFNUF9FWFQ6Ci0JCWh3X3R3cmFwIHw9IFIzMDBfVFhfQ0xBTVAgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVDoKLQkJaHdfdHdyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19FREdFIHwgUjMwMF9UWF9NSVJST1JFRDsKLQkJYnJlYWs7Ci0JY2FzZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVDoKLQkJaHdfdHdyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19CT1JERVIgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlfbWVzYV9wcm9ibGVtKE5VTEwsICJiYWQgVCB3cmFwIG1vZGUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotCX0KLQotCXN3aXRjaCAocndyYXApIHsKLQljYXNlIEdMX1JFUEVBVDoKLQkJaHdfcXdyYXAgfD0gUjMwMF9UWF9SRVBFQVQ7Ci0JCWJyZWFrOwotCWNhc2UgR0xfQ0xBTVA6Ci0JCWh3X3F3cmFwIHw9IFIzMDBfVFhfQ0xBTVA7Ci0JCWJyZWFrOwotCWNhc2UgR0xfQ0xBTVBfVE9fRURHRToKLQkJaHdfcXdyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19FREdFOwotCQlicmVhazsKLQljYXNlIEdMX0NMQU1QX1RPX0JPUkRFUjoKLQkJaHdfcXdyYXAgfD0gUjMwMF9UWF9DTEFNUF9UT19CT1JERVI7Ci0JCWJyZWFrOwotCWNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgotCQlod19xd3JhcCB8PSBSMzAwX1RYX1JFUEVBVCB8IFIzMDBfVFhfTUlSUk9SRUQ7Ci0JCWJyZWFrOwotCWNhc2UgR0xfTUlSUk9SX0NMQU1QX0VYVDoKLQkJaHdfcXdyYXAgfD0gUjMwMF9UWF9DTEFNUCB8IFIzMDBfVFhfTUlSUk9SRUQ7Ci0JCWJyZWFrOwotCWNhc2UgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUOgotCQlod19xd3JhcCB8PSBSMzAwX1RYX0NMQU1QX1RPX0VER0UgfCBSMzAwX1RYX01JUlJPUkVEOwotCQlicmVhazsKLQljYXNlIEdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUOgotCQlod19xd3JhcCB8PSBSMzAwX1RYX0NMQU1QX1RPX0JPUkRFUiB8IFIzMDBfVFhfTUlSUk9SRUQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCV9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCBSIHdyYXAgbW9kZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotCi0JdC0+ZmlsdGVyIHw9IGh3X3N3cmFwIDw8IFIzMDBfVFhfV1JBUF9TX1NISUZUOwotCXQtPmZpbHRlciB8PSBod190d3JhcCA8PCBSMzAwX1RYX1dSQVBfVF9TSElGVDsKLQl0LT5maWx0ZXIgfD0gaHdfcXdyYXAgPDwgUjMwMF9UWF9XUkFQX1FfU0hJRlQ7CiB9CiAKLXN0YXRpYyB2b2lkIHIzMDBTZXRUZXhNYXhBbmlzb3Ryb3B5KHIzMDBUZXhPYmpQdHIgdCwgR0xmbG9hdCBtYXgpCisKKy8qKgorICogVXBkYXRlIHRoZSBjYWNoZWQgaGFyZHdhcmUgcmVnaXN0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRleHR1cmUgd3JhcCBtb2Rlcy4KKyAqCisgKiBccGFyYW0gdCBUZXh0dXJlIG9iamVjdCB3aG9zZSB3cmFwIG1vZGVzIGFyZSB0byBiZSBzZXQKKyAqLworc3RhdGljIHZvaWQgcjMwMFVwZGF0ZVRleFdyYXAocjMwMFRleE9ialB0ciB0KQogeworCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9IHQtPmJhc2UudE9iajsKIAotCXQtPmZpbHRlciAmPSB+UjMwMF9UWF9NQVhfQU5JU09fTUFTSzsKKwl0LT5maWx0ZXIgJj0KKwkgICAgfihSMzAwX1RYX1dSQVBfU19NQVNLIHwgUjMwMF9UWF9XUkFQX1RfTUFTSyB8IFIzMDBfVFhfV1JBUF9SX01BU0spOwogCi0JaWYgKG1heCA8PSAxLjApIHsKLQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUFYX0FOSVNPXzFfVE9fMTsKLQl9IGVsc2UgaWYgKG1heCA8PSAyLjApIHsKLQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUFYX0FOSVNPXzJfVE9fMTsKLQl9IGVsc2UgaWYgKG1heCA8PSA0LjApIHsKLQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUFYX0FOSVNPXzRfVE9fMTsKLQl9IGVsc2UgaWYgKG1heCA8PSA4LjApIHsKLQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUFYX0FOSVNPXzhfVE9fMTsKKwl0LT5maWx0ZXIgfD0gdHJhbnNsYXRlX3dyYXBfbW9kZSh0T2JqLT5XcmFwUykgPDwgUjMwMF9UWF9XUkFQX1NfU0hJRlQ7CisKKwlpZiAodE9iai0+VGFyZ2V0ICE9IEdMX1RFWFRVUkVfMUQpIHsKKwkJdC0+ZmlsdGVyIHw9IHRyYW5zbGF0ZV93cmFwX21vZGUodE9iai0+V3JhcFQpIDw8IFIzMDBfVFhfV1JBUF9UX1NISUZUOworCisJCWlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV8zRCkKKwkJCXQtPmZpbHRlciB8PSB0cmFuc2xhdGVfd3JhcF9tb2RlKHRPYmotPldyYXBSKSA8PCBSMzAwX1RYX1dSQVBfUl9TSElGVDsKKwl9Cit9CisKK3N0YXRpYyBHTHVpbnQgYW5pc29fZmlsdGVyKEdMZmxvYXQgYW5pc290cm9weSkKK3sKKwlpZiAoYW5pc290cm9weSA+PSAxNi4wKSB7CisJCXJldHVybiBSMzAwX1RYX01BWF9BTklTT18xNl9UT18xOworCX0gZWxzZSBpZiAoYW5pc290cm9weSA+PSA4LjApIHsKKwkJcmV0dXJuIFIzMDBfVFhfTUFYX0FOSVNPXzhfVE9fMTsKKwl9IGVsc2UgaWYgKGFuaXNvdHJvcHkgPj0gNC4wKSB7CisJCXJldHVybiBSMzAwX1RYX01BWF9BTklTT180X1RPXzE7CisJfSBlbHNlIGlmIChhbmlzb3Ryb3B5ID49IDIuMCkgeworCQlyZXR1cm4gUjMwMF9UWF9NQVhfQU5JU09fMl9UT18xOwogCX0gZWxzZSB7Ci0JCXQtPmZpbHRlciB8PSBSMzAwX1RYX01BWF9BTklTT18xNl9UT18xOworCQlyZXR1cm4gUjMwMF9UWF9NQVhfQU5JU09fMV9UT18xOwogCX0KIH0KIApAQCAtMTg0LDU0ICsxMTQsNDcgQEAKICAqIFxwYXJhbSB0IFRleHR1cmUgd2hvc2UgZmlsdGVyIG1vZGVzIGFyZSB0byBiZSBzZXQKICAqIFxwYXJhbSBtaW5mIFRleHR1cmUgbWluaWZpY2F0aW9uIG1vZGUKICAqIFxwYXJhbSBtYWdmIFRleHR1cmUgbWFnbmlmaWNhdGlvbiBtb2RlCisgKiBccGFyYW0gYW5pc290cm9weSBNYXhpbXVtIGFuaXNvdHJvcHkgbGV2ZWwKICAqLwotCi1zdGF0aWMgdm9pZCByMzAwU2V0VGV4RmlsdGVyKHIzMDBUZXhPYmpQdHIgdCwgR0xlbnVtIG1pbmYsIEdMZW51bSBtYWdmKQorc3RhdGljIHZvaWQgcjMwMFNldFRleEZpbHRlcihyMzAwVGV4T2JqUHRyIHQsIEdMZW51bSBtaW5mLCBHTGVudW0gbWFnZiwgR0xmbG9hdCBhbmlzb3Ryb3B5KQogewotCUdMdWludCBhbmlzb3Ryb3B5ID0gKHQtPmZpbHRlciAmIFIzMDBfVFhfTUFYX0FOSVNPX01BU0spOworCXQtPmZpbHRlciAmPSB+KFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLIHwgUjMwMF9UWF9NSU5fRklMVEVSX01JUF9NQVNLIHwgUjMwMF9UWF9NQUdfRklMVEVSX01BU0sgfCBSMzAwX1RYX01BWF9BTklTT19NQVNLKTsKKwl0LT5maWx0ZXJfMSAmPSB+UjMwMF9FREdFX0FOSVNPX0VER0VfT05MWTsKIAotCXQtPmZpbHRlciAmPSB+KFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLIHwgUjMwMF9UWF9NQUdfRklMVEVSX01BU0spOworCS8qIE5vdGUgdGhhdCBFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgaXMgZXh0cmVtZWx5IHZhZ3VlIGFib3V0CisJICogaG93IGFuaXNvdHJvcGljIGZpbHRlcmluZyBpbnRlcmFjdHMgd2l0aCB0aGUgIm5vcm1hbCIgZmlsdGVyIG1vZGVzLgorCSAqIFdoZW4gYW5pc290cm9waWMgZmlsdGVyaW5nIGlzIGVuYWJsZWQsIHdlIG92ZXJyaWRlIG1pbiBhbmQgbWFnCisJICogZmlsdGVyIHNldHRpbmdzIGNvbXBsZXRlbHkuIFRoaXMgaW5jbHVkZXMgZHJpY29uZidzIHNldHRpbmdzLgorCSAqLworCWlmIChhbmlzb3Ryb3B5ID49IDIuMCAmJiAobWluZiAhPSBHTF9ORUFSRVNUKSAmJiAobWFnZiAhPSBHTF9ORUFSRVNUKSkgeworCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NQUdfRklMVEVSX0FOSVNPCisJCQl8IFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTTworCQkJfCBSMzAwX1RYX01JTl9GSUxURVJfTUlQX0xJTkVBUgorCQkJfCBhbmlzb19maWx0ZXIoYW5pc290cm9weSk7CisJCWlmIChSQURFT05fREVCVUcgJiBERUJVR19URVhUVVJFKQorCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBtYXhpbXVtIGFuaXNvdHJvcHkgb2YgJWZcbiIsIGFuaXNvdHJvcHkpOworCQlyZXR1cm47CisJfQogCi0JaWYgKGFuaXNvdHJvcHkgPT0gUjMwMF9UWF9NQVhfQU5JU09fMV9UT18xKSB7Ci0JCXN3aXRjaCAobWluZikgewotCQljYXNlIEdMX05FQVJFU1Q6Ci0JCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9MSU5FQVI6Ci0JCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUjsKLQkJCWJyZWFrOwotCQljYXNlIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q6Ci0JCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1RfTUlQX05FQVJFU1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVI6Ci0JCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1RfTUlQX0xJTkVBUjsKLQkJCWJyZWFrOwotCQljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKLQkJCXQtPmZpbHRlciB8PSBSMzAwX1RYX01JTl9GSUxURVJfTElORUFSX01JUF9ORUFSRVNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfTElORUFSX01JUE1BUF9MSU5FQVI6Ci0JCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUl9NSVBfTElORUFSOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKG1pbmYpIHsKLQkJY2FzZSBHTF9ORUFSRVNUOgotCQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfTElORUFSOgotCQkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19MSU5FQVI7Ci0JCQlicmVhazsKLQkJY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUOgotCQljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKLQkJCXQtPmZpbHRlciB8PQotCQkJICAgIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9ORUFSRVNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgotCQljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSOgotCQkJdC0+ZmlsdGVyIHw9Ci0JCQkgICAgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX0xJTkVBUjsKLQkJCWJyZWFrOwotCQl9CisJc3dpdGNoIChtaW5mKSB7CisJY2FzZSBHTF9ORUFSRVNUOgorCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1Q7CisJCWJyZWFrOworCWNhc2UgR0xfTElORUFSOgorCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUjsKKwkJYnJlYWs7CisJY2FzZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUOgorCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1R8UjMwMF9UWF9NSU5fRklMVEVSX01JUF9ORUFSRVNUOworCQlicmVhazsKKwljYXNlIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUjoKKwkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUlOX0ZJTFRFUl9ORUFSRVNUfFIzMDBfVFhfTUlOX0ZJTFRFUl9NSVBfTElORUFSOworCQlicmVhazsKKwljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDoKKwkJdC0+ZmlsdGVyIHw9IFIzMDBfVFhfTUlOX0ZJTFRFUl9MSU5FQVJ8UjMwMF9UWF9NSU5fRklMVEVSX01JUF9ORUFSRVNUOworCQlicmVhazsKKwljYXNlIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSOgorCQl0LT5maWx0ZXIgfD0gUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUnxSMzAwX1RYX01JTl9GSUxURVJfTUlQX0xJTkVBUjsKKwkJYnJlYWs7CiAJfQogCiAJLyogTm90ZSB3ZSBkb24ndCBoYXZlIDNEIG1pcG1hcHMgc28gb25seSB1c2UgdGhlIG1hZyBmaWx0ZXIgc2V0dGluZwpAQCAtMjQ5LDcgKzE3Miw3IEBACiAKIHN0YXRpYyB2b2lkIHIzMDBTZXRUZXhCb3JkZXJDb2xvcihyMzAwVGV4T2JqUHRyIHQsIEdMdWJ5dGUgY1s0XSkKIHsKLQl0LT5wcF9ib3JkZXJfY29sb3IgPSBQQUNLX0NPTE9SXzg4ODgoY1swXSwgY1sxXSwgY1syXSwgY1szXSk7CisJdC0+cHBfYm9yZGVyX2NvbG9yID0gUEFDS19DT0xPUl84ODg4KGNbM10sIGNbMF0sIGNbMV0sIGNbMl0pOwogfQogCiAvKioKQEAgLTI3Nyw5ICsyMDAsOCBAQAogCiAJCW1ha2VfZW1wdHlfbGlzdCgmdC0+YmFzZSk7CiAKLQkJcjMwMFNldFRleFdyYXAodCwgdGV4T2JqLT5XcmFwUywgdGV4T2JqLT5XcmFwVCwgdGV4T2JqLT5XcmFwUik7Ci0JCXIzMDBTZXRUZXhNYXhBbmlzb3Ryb3B5KHQsIHRleE9iai0+TWF4QW5pc290cm9weSk7Ci0JCXIzMDBTZXRUZXhGaWx0ZXIodCwgdGV4T2JqLT5NaW5GaWx0ZXIsIHRleE9iai0+TWFnRmlsdGVyKTsKKwkJcjMwMFVwZGF0ZVRleFdyYXAodCk7CisJCXIzMDBTZXRUZXhGaWx0ZXIodCwgdGV4T2JqLT5NaW5GaWx0ZXIsIHRleE9iai0+TWFnRmlsdGVyLCB0ZXhPYmotPk1heEFuaXNvdHJvcHkpOwogCQlyMzAwU2V0VGV4Qm9yZGVyQ29sb3IodCwgdGV4T2JqLT5fQm9yZGVyQ2hhbik7CiAJfQogCkBAIC00ODIsNiArNDA0LDI1IEBACiAJY2FzZSBHTF9SR0JBMzJGX0FSQjoKIAkJcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfcmdiYV9mbG9hdDMyOwogCisJY2FzZSBHTF9ERVBUSF9DT01QT05FTlQ6CisJY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNjoKKwljYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDI0OgorCWNhc2UgR0xfREVQVEhfQ09NUE9ORU5UMzI6CisjaWYgMAorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorCQljYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorCQkJcmV0dXJuICZfbWVzYV90ZXhmb3JtYXRfejE2OworCQljYXNlIEdMX1VOU0lHTkVEX0lOVDoKKwkJCXJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3ozMjsKKwkJY2FzZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9FWFQ6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gJl9tZXNhX3RleGZvcm1hdF96MjRfczg7CisJCX0KKyNlbHNlCisJCXJldHVybiAmX21lc2FfdGV4Zm9ybWF0X3oxNjsKKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJX21lc2FfcHJvYmxlbShjdHgsCiAJCQkgICAgICAidW5leHBlY3RlZCBpbnRlcm5hbEZvcm1hdCAweCV4IGluIHIzMDBDaG9vc2VUZXh0dXJlRm9ybWF0IiwKQEAgLTk1Nyw2MCArODk4LDYgQEAKIAl0LT5kaXJ0eV9pbWFnZXNbMF0gfD0gKDEgPDwgbGV2ZWwpOwogfQogCi1zdGF0aWMgdm9pZCByMzAwVGV4RW52KEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwKLQkJICAgICAgIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqIHBhcmFtKQotewotCWlmIChSQURFT05fREVCVUcgJiBERUJVR19TVEFURSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzKCAlcyApXG4iLAotCQkJX19GVU5DVElPTl9fLCBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihwbmFtZSkpOwotCX0KLQotCS8qIFRoaXMgaXMgaW5jb3JyZWN0OiBOZWVkIHRvIG1haW50YWluIHRoaXMgZGF0YSBmb3IgZWFjaCBvZgotCSAqIEdMX1RFWFRVUkVfezEyM31ELCBHTF9URVhUVVJFX1JFQ1RBTkdMRV9OViwgZXRjLCBhbmQgc3dpdGNoCi0JICogYmV0d2VlbiB0aGVtIGFjY29yZGluZyB0byBfUmVhbGx5RW5hYmxlZC4KLQkgKi8KLQlzd2l0Y2ggKHBuYW1lKSB7Ci0JY2FzZSBHTF9URVhUVVJFX0xPRF9CSUFTX0VYVDp7Ci0jaWYgMAkJCQkvKiBOZWVkcyB0byBiZSByZWxvY2F0ZWQgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcmlnaHQgdG11ICovCi0JCQlHTGZsb2F0IGJpYXMsIG1pbjsKLQkJCUdMdWludCBiOwotCi0JCQkvKiBUaGUgUjMwMCdzIExPRCBiaWFzIGlzIGEgc2lnbmVkIDIncyBjb21wbGVtZW50IHZhbHVlIHdpdGggYQotCQkJICogcmFuZ2Ugb2YgLTE2LjAgPD0gYmlhcyA8IDE2LjAuCi0JCQkgKgotCQkJICogTk9URTogQWRkIGEgc21hbGwgYmlhcyB0byB0aGUgYmlhcyBmb3IgY29uZm9ybSBtaXBzZWwuYyB0ZXN0LgotCQkJICovCi0JCQliaWFzID0gKnBhcmFtICsgLjAxOwotCQkJbWluID0KLQkJCSAgICBkcmlRdWVyeU9wdGlvbmIoJnJtZXNhLT5yYWRlb24ub3B0aW9uQ2FjaGUsCi0JCQkJCSAgICAibm9fbmVnX2xvZF9iaWFzIikgPyAwLjAgOiAtMTYuMDsKLQkJCWJpYXMgPSBDTEFNUChiaWFzLCBtaW4sIDE2LjApOwotCi0JCQkvKiAwLjAgLSAxNi4wID09IDB4MCAtIDB4MTAwMCAqLwotCQkJLyogMC4wIC0gLTE2LjAgPT0gMHgxMDAxIC0gMHgxZmZmICovCi0JCQliID0gMHgxMDAwIC8gMTYuMCAqIGJpYXM7Ci0JCQliICY9IFIzMDBfTE9EX0JJQVNfTUFTSzsKLQotCQkJaWYgKGIgIT0KLQkJCSAgICAocm1lc2EtPmh3LnRleC51bmtub3duMS4KLQkJCSAgICAgY21kW1IzMDBfVEVYX1ZBTFVFXzAgKwotCQkJCSB1bml0XSAmIFIzMDBfTE9EX0JJQVNfTUFTSykpIHsKLQkJCQlSMzAwX1NUQVRFQ0hBTkdFKHJtZXNhLCB0ZXgudW5rbm93bjEpOwotCQkJCXJtZXNhLT5ody50ZXgudW5rbm93bjEuY21kW1IzMDBfVEVYX1ZBTFVFXzAgKwotCQkJCQkJCSAgIHVuaXRdICY9Ci0JCQkJICAgIH5SMzAwX0xPRF9CSUFTX01BU0s7Ci0JCQkJcm1lc2EtPmh3LnRleC51bmtub3duMS5jbWRbUjMwMF9URVhfVkFMVUVfMCArCi0JCQkJCQkJICAgdW5pdF0gfD0gYjsKLQkJCX0KLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci19Ci0KIC8qKgogICogQ2hhbmdlcyB2YXJpYWJsZXMgYW5kIGZsYWdzIGZvciBhIHN0YXRlIHVwZGF0ZSwgd2hpY2ggd2lsbCBoYXBwZW4gYXQgdGhlCiAgKiBuZXh0IFVwZGF0ZVRleHR1cmVTdGF0ZQpAQCAtMTAzMSwxNCArOTE4LDEzIEBACiAJY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6CiAJY2FzZSBHTF9URVhUVVJFX01BR19GSUxURVI6CiAJY2FzZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDoKLQkJcjMwMFNldFRleE1heEFuaXNvdHJvcHkodCwgdGV4T2JqLT5NYXhBbmlzb3Ryb3B5KTsKLQkJcjMwMFNldFRleEZpbHRlcih0LCB0ZXhPYmotPk1pbkZpbHRlciwgdGV4T2JqLT5NYWdGaWx0ZXIpOworCQlyMzAwU2V0VGV4RmlsdGVyKHQsIHRleE9iai0+TWluRmlsdGVyLCB0ZXhPYmotPk1hZ0ZpbHRlciwgdGV4T2JqLT5NYXhBbmlzb3Ryb3B5KTsKIAkJYnJlYWs7CiAKIAljYXNlIEdMX1RFWFRVUkVfV1JBUF9TOgogCWNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6CiAJY2FzZSBHTF9URVhUVVJFX1dSQVBfUjoKLQkJcjMwMFNldFRleFdyYXAodCwgdGV4T2JqLT5XcmFwUywgdGV4T2JqLT5XcmFwVCwgdGV4T2JqLT5XcmFwUik7CisJCXIzMDBVcGRhdGVUZXhXcmFwKHQpOwogCQlicmVhazsKIAogCWNhc2UgR0xfVEVYVFVSRV9CT1JERVJfQ09MT1I6CkBAIC0xMDU3LDEzICs5NDMsMjQgQEAKIAkJZHJpU3dhcE91dFRleHR1cmVPYmplY3QoKGRyaVRleHR1cmVPYmplY3QgKikgdCk7CiAJCWJyZWFrOwogCisJY2FzZSBHTF9ERVBUSF9URVhUVVJFX01PREU6CisJCWlmICghdGV4T2JqLT5JbWFnZVswXVt0ZXhPYmotPkJhc2VMZXZlbF0pCisJCQlyZXR1cm47CisJCWlmICh0ZXhPYmotPkltYWdlWzBdW3RleE9iai0+QmFzZUxldmVsXS0+VGV4Rm9ybWF0LT5CYXNlRm9ybWF0CisJCSAgICA9PSBHTF9ERVBUSF9DT01QT05FTlQpIHsKKwkJCXIzMDBTZXREZXB0aFRleE1vZGUodGV4T2JqKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJLyogSWYgdGhlIHRleHR1cmUgaXNuJ3QgYSBkZXB0aCB0ZXh0dXJlLCBjaGFuZ2luZyB0aGlzCisJCQkgKiBzdGF0ZSB3b24ndCBjYXVzZSBhbnkgY2hhbmdlcyB0byB0aGUgaGFyZHdhcmUuCisJCQkgKiBEb24ndCBmb3JjZSBhIGZsdXNoIG9mIHRleHR1cmUgc3RhdGUuCisJCQkgKi8KKwkJCXJldHVybjsKKwkJfQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KLQotCS8qIE1hcmsgdGhpcyB0ZXhvYmogYXMgZGlydHkgKG9uZSBiaXQgcGVyIHRleCB1bml0KQotCSAqLwotCXQtPmRpcnR5X3N0YXRlID0gVEVYX0FMTDsKIH0KIAogc3RhdGljIHZvaWQgcjMwMEJpbmRUZXh0dXJlKEdMY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwKQEAgLTExNDYsNyArMTA0Myw2IEBACiAJZnVuY3Rpb25zLT5EZWxldGVUZXh0dXJlID0gcjMwMERlbGV0ZVRleHR1cmU7CiAJZnVuY3Rpb25zLT5Jc1RleHR1cmVSZXNpZGVudCA9IGRyaUlzVGV4dHVyZVJlc2lkZW50OwogCi0JZnVuY3Rpb25zLT5UZXhFbnYgPSByMzAwVGV4RW52OwogCWZ1bmN0aW9ucy0+VGV4UGFyYW1ldGVyID0gcjMwMFRleFBhcmFtZXRlcjsKIAogCWZ1bmN0aW9ucy0+Q29tcHJlc3NlZFRleEltYWdlMkQgPSByMzAwQ29tcHJlc3NlZFRleEltYWdlMkQ7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdGV4LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdGV4LmgKaW5kZXggZjY3YThlNi4uYjg2ZDQ1YiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3RleC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXguaApAQCAtMzUsNiArMzUsOCBAQAogI2lmbmRlZiBfX3IzMDBfVEVYX0hfXwogI2RlZmluZSBfX3IzMDBfVEVYX0hfXwogCitleHRlcm4gdm9pZCByMzAwU2V0RGVwdGhUZXhNb2RlKHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaik7CisKIGV4dGVybiB2b2lkIHIzMDBTZXRUZXhPZmZzZXQoX19EUkljb250ZXh0ICpwRFJJQ3R4LCBHTGludCB0ZXhuYW1lLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwKIAkJCSAgICAgR0x1aW50IHBpdGNoKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXhtZW0uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXhtZW0uYwppbmRleCAzOGYwZGE4Li42OTg0N2E0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdGV4bWVtLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3RleG1lbS5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlpbWFnZVdpZHRoID0gdGV4SW1hZ2UtPldpZHRoOwogCWltYWdlSGVpZ2h0ID0gdGV4SW1hZ2UtPkhlaWdodDsKIAotCW9mZnNldCA9IHQtPmJ1ZkFkZHIgKyB0LT5iYXNlLnRvdGFsU2l6ZSAvIDYgKiBmYWNlOworCW9mZnNldCA9IHQtPmJ1ZkFkZHI7CiAKIAlpZiAoUkFERU9OX0RFQlVHICYgKERFQlVHX1RFWFRVUkUgfCBERUJVR19JT0NUTCkpIHsKIAkJR0xpbnQgaW1hZ2VYID0gMDsKQEAgLTUwNSw3ICs1MDUsNyBAQAogCQkJdC0+YmFzZS5sYXN0TGV2ZWwpOwogCX0KIAotCWlmICghdCB8fCB0LT5iYXNlLnRvdGFsU2l6ZSA9PSAwKQorCWlmICh0LT5iYXNlLnRvdGFsU2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCWlmIChSQURFT05fREVCVUcgJiBERUJVR19TWU5DKSB7CkBAIC01MzQsMTAgKzUzNCw2IEBACiAJCQkvKiBob3BlIGl0J3Mgc2FmZSB0byBhZGQgdGhhdCBoZXJlLi4uICovCiAJCQl0LT5vZmZzZXQgfD0gdC0+dGlsZV9iaXRzOwogCQl9Ci0KLQkJLyogTWFyayB0aGlzIHRleG9iaiBhcyBkaXJ0eSBvbiBhbGwgdW5pdHM6Ci0JCSAqLwotCQl0LT5kaXJ0eV9zdGF0ZSA9IFRFWF9BTEw7CiAJfQogCiAJLyogTGV0IHRoZSB3b3JsZCBrbm93IHdlJ3ZlIHVzZWQgdGhpcyBtZW1vcnkgcmVjZW50bHkuCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdGV4c3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXhzdGF0ZS5jCmluZGV4IDFkMjkwOWYuLmQxOTgzMmYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXhzdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF90ZXhzdGF0ZS5jCkBAIC0xMTUsMTEgKzExNSwxODYgQEAKIAlfQVNTSUdOKExVTUlOQU5DRV9BTFBIQV9GTE9BVDE2LCBSMzAwX0VBU1lfVFhfRk9STUFUKFgsIFgsIFgsIFksIEZMX0kxNkExNikpLAogCV9BU1NJR04oSU5URU5TSVRZX0ZMT0FUMzIsIFIzMDBfRUFTWV9UWF9GT1JNQVQoWCwgWCwgWCwgWCwgRkxfSTMyKSksCiAJX0FTU0lHTihJTlRFTlNJVFlfRkxPQVQxNiwgUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBYLCBGTF9JMTYpKSwKKwlfQVNTSUdOKFoxNiwgUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBYLCBYMTYpKSwKKwlfQVNTSUdOKFoyNF9TOCwgUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBYLCBYMjRfWTgpKSwKKwlfQVNTSUdOKFozMiwgUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBYLCBYMzIpKSwKIAkvKiAqSU5ERU5ULU9OKiAqLwogfTsKIAogI3VuZGVmIF9BU1NJR04KIAordm9pZCByMzAwU2V0RGVwdGhUZXhNb2RlKHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaikKK3sKKwlzdGF0aWMgY29uc3QgR0x1aW50IGZvcm1hdHNbM11bM10gPSB7CisJCXsKKwkJCVIzMDBfRUFTWV9UWF9GT1JNQVQoWCwgWCwgWCwgT05FLCBYMTYpLAorCQkJUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBYLCBYMTYpLAorCQkJUjMwMF9FQVNZX1RYX0ZPUk1BVChaRVJPLCBaRVJPLCBaRVJPLCBYLCBYMTYpLAorCQl9LAorCQl7CisJCQlSMzAwX0VBU1lfVFhfRk9STUFUKFgsIFgsIFgsIE9ORSwgWDI0X1k4KSwKKwkJCVIzMDBfRUFTWV9UWF9GT1JNQVQoWCwgWCwgWCwgWCwgWDI0X1k4KSwKKwkJCVIzMDBfRUFTWV9UWF9GT1JNQVQoWkVSTywgWkVSTywgWkVSTywgWCwgWDI0X1k4KSwKKwkJfSwKKwkJeworCQkJUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBYLCBYLCBPTkUsIFgzMiksCisJCQlSMzAwX0VBU1lfVFhfRk9STUFUKFgsIFgsIFgsIFgsIFgzMiksCisJCQlSMzAwX0VBU1lfVFhfRk9STUFUKFpFUk8sIFpFUk8sIFpFUk8sIFgsIFgzMiksCisJCX0sCisJfTsKKwljb25zdCBHTHVpbnQgKmZvcm1hdDsKKwlyMzAwVGV4T2JqUHRyIHQ7CisKKwlpZiAoIXRPYmopCisJCXJldHVybjsKKworCXQgPSAocjMwMFRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YTsKKworCisJc3dpdGNoICh0T2JqLT5JbWFnZVswXVt0T2JqLT5CYXNlTGV2ZWxdLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQpIHsKKwljYXNlIE1FU0FfRk9STUFUX1oxNjoKKwkJZm9ybWF0ID0gZm9ybWF0c1swXTsKKwkJYnJlYWs7CisJY2FzZSBNRVNBX0ZPUk1BVF9aMjRfUzg6CisJCWZvcm1hdCA9IGZvcm1hdHNbMV07CisJCWJyZWFrOworCWNhc2UgTUVTQV9GT1JNQVRfWjMyOgorCQlmb3JtYXQgPSBmb3JtYXRzWzJdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBFcnJvci4uLndoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYnkgaGlnaGVyCisJCSAqIGxldmVscyBvZiBNZXNhLgorCQkgKi8KKwkJQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh0T2JqLT5EZXB0aE1vZGUpIHsKKwljYXNlIEdMX0xVTUlOQU5DRToKKwkJdC0+Zm9ybWF0ID0gZm9ybWF0WzBdOworCQlicmVhazsKKwljYXNlIEdMX0lOVEVOU0lUWToKKwkJdC0+Zm9ybWF0ID0gZm9ybWF0WzFdOworCQlicmVhazsKKwljYXNlIEdMX0FMUEhBOgorCQl0LT5mb3JtYXQgPSBmb3JtYXRbMl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEVycm9yLi4ud2hpY2ggc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBieSBoaWdoZXIKKwkJICogbGV2ZWxzIG9mIE1lc2EuCisJCSAqLworCQlBU1NFUlQoMCk7CisJCXJldHVybjsKKwl9Cit9CisKKworLyoqCisgKiBDb21wdXRlIHNpemVzIGFuZCBmaWxsIGluIG9mZnNldCBhbmQgYmxpdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuCisgKiBpbWFnZSAoZGV0ZXJtaW5lZCBieSBccCBmYWNlIGFuZCBccCBsZXZlbCkuCisgKgorICogXHBhcmFtIGN1ck9mZnNldCBwb2ludHMgdG8gdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgaW1hZ2UgaXMgdG8gYmUgc3RvcmVkCisgKiBhbmQgaXMgdXBkYXRlZCBieSB0aGlzIGZ1bmN0aW9uIGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfdGV4X2ltYWdlX29mZnNldCgKKwlzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmosCisJR0x1aW50IGZhY2UsCisJR0xpbnQgbGV2ZWwsCisJR0xpbnQqIGN1ck9mZnNldCkKK3sKKwlyMzAwVGV4T2JqUHRyIHQgPSAocjMwMFRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YTsKKwljb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSogdGV4SW1hZ2U7CisJR0x1aW50IGJsaXRXaWR0aCA9IFIzMDBfQkxJVF9XSURUSF9CWVRFUzsKKwlHTHVpbnQgdGV4ZWxCeXRlczsKKwlHTHVpbnQgc2l6ZTsKKworCXRleEltYWdlID0gdE9iai0+SW1hZ2VbMF1bbGV2ZWwgKyB0LT5iYXNlLmZpcnN0TGV2ZWxdOworCWlmICghdGV4SW1hZ2UpCisJCXJldHVybjsKKworCXRleGVsQnl0ZXMgPSB0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5UZXhlbEJ5dGVzOworCisJLyogZmluZCBpbWFnZSBzaXplIGluIGJ5dGVzICovCisJaWYgKHRleEltYWdlLT5Jc0NvbXByZXNzZWQpIHsKKwkJaWYgKCh0LT5mb3JtYXQgJiBSMzAwX1RYX0ZPUk1BVF9EWFQxKSA9PQorCQkJUjMwMF9UWF9GT1JNQVRfRFhUMSkgeworCQkJLy8gZnByaW50ZihzdGRlcnIsIkRYVCAxICVkICUwOFhcbiIsIHRleEltYWdlLT5XaWR0aCwgdC0+Zm9ybWF0KTsKKwkJCWlmICgodGV4SW1hZ2UtPldpZHRoICsgMykgPCA4KQkvKiB3aWR0aCBvbmUgYmxvY2sgKi8KKwkJCQlzaXplID0gdGV4SW1hZ2UtPkNvbXByZXNzZWRTaXplICogNDsKKwkJCWVsc2UgaWYgKCh0ZXhJbWFnZS0+V2lkdGggKyAzKSA8IDE2KQorCQkJCXNpemUgPSB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemUgKiAyOworCQkJZWxzZQorCQkJCXNpemUgPSB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemU7CisJCX0gZWxzZSB7CisJCQkvKiBEWFQzLzUsIDE2IGJ5dGVzIHBlciBibG9jayAqLworCQkJV0FSTl9PTkNFCisJCQkJKCJEWFQgMy81IHN1ZmZlcnMgZnJvbSBtdWx0aXRleHR1cmluZyBwcm9ibGVtcyFcbiIpOworCQkJLy8gZnByaW50ZihzdGRlcnIsIkRYVCAzLzUgJWRcbiIsIHRleEltYWdlLT5XaWR0aCk7CisJCQlpZiAoKHRleEltYWdlLT5XaWR0aCArIDMpIDwgOCkKKwkJCQlzaXplID0gdGV4SW1hZ2UtPkNvbXByZXNzZWRTaXplICogMjsKKwkJCWVsc2UKKwkJCQlzaXplID0gdGV4SW1hZ2UtPkNvbXByZXNzZWRTaXplOworCQl9CisJfSBlbHNlIGlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV9SRUNUQU5HTEVfTlYpIHsKKwkJc2l6ZSA9CisJCQkoKHRleEltYWdlLT5XaWR0aCAqIHRleGVsQnl0ZXMgKworCQkJNjMpICYgfjYzKSAqIHRleEltYWdlLT5IZWlnaHQ7CisJCWJsaXRXaWR0aCA9IDY0IC8gdGV4ZWxCeXRlczsKKwl9IGVsc2UgaWYgKHQtPnRpbGVfYml0cyAmIFIzMDBfVFhPX01JQ1JPX1RJTEUpIHsKKwkJLyogdGlsZSBwYXR0ZXJuIGlzIDE2IGJ5dGVzIHgyLiBtaXBtYXBzIHN0YXkgMzIgYnl0ZSBhbGlnbmVkLAorCQkJdGhvdWdoIHRoZSBhY3R1YWwgb2Zmc2V0IG1heSBiZSBkaWZmZXJlbnQgKGlmIHRleHR1cmUgaXMgbGVzcyB0aGFuCisJCQkzMiBieXRlcyB3aWR0aCkgdG8gdGhlIHVudGlsZWQgY2FzZSAqLworCQlpbnQgdyA9ICh0ZXhJbWFnZS0+V2lkdGggKiB0ZXhlbEJ5dGVzICogMiArIDMxKSAmIH4zMTsKKwkJc2l6ZSA9CisJCQkodyAqICgodGV4SW1hZ2UtPkhlaWdodCArIDEpIC8gMikpICoKKwkJCXRleEltYWdlLT5EZXB0aDsKKwkJYmxpdFdpZHRoID0gTUFYMih0ZXhJbWFnZS0+V2lkdGgsIDY0IC8gdGV4ZWxCeXRlcyk7CisJfSBlbHNlIHsKKwkJaW50IHcgPSAodGV4SW1hZ2UtPldpZHRoICogdGV4ZWxCeXRlcyArIDMxKSAmIH4zMTsKKwkJc2l6ZSA9IHcgKiB0ZXhJbWFnZS0+SGVpZ2h0ICogdGV4SW1hZ2UtPkRlcHRoOworCQlibGl0V2lkdGggPSBNQVgyKHRleEltYWdlLT5XaWR0aCwgNjQgLyB0ZXhlbEJ5dGVzKTsKKwl9CisJYXNzZXJ0KHNpemUgPiAwKTsKKworCWlmIChSQURFT05fREVCVUcgJiBERUJVR19URVhUVVJFKQorCQlmcHJpbnRmKHN0ZGVyciwgInc9JWQgaD0lZCBkPSVkIHRiPSVkIGludEZvcm1hdD0lZFxuIiwKKwkJCXRleEltYWdlLT5XaWR0aCwgdGV4SW1hZ2UtPkhlaWdodCwKKwkJCXRleEltYWdlLT5EZXB0aCwKKwkJCXRleEltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXMsCisJCQl0ZXhJbWFnZS0+SW50ZXJuYWxGb3JtYXQpOworCisJLyogQWxsIGltYWdlcyBhcmUgYWxpZ25lZCB0byBhIDMyLWJ5dGUgb2Zmc2V0ICovCisJKmN1ck9mZnNldCA9ICgqY3VyT2Zmc2V0ICsgMHgxZikgJiB+MHgxZjsKKworCWlmICh0ZXhlbEJ5dGVzKSB7CisJCS8qIGZpeCB4IGFuZCB5IGNvb3JkcyB1cCBsYXRlciB0b2dldGhlciB3aXRoIG9mZnNldCAqLworCQl0LT5pbWFnZVtmYWNlXVtsZXZlbF0ueCA9ICpjdXJPZmZzZXQ7CisJCXQtPmltYWdlW2ZhY2VdW2xldmVsXS55ID0gMDsKKwkJdC0+aW1hZ2VbZmFjZV1bbGV2ZWxdLndpZHRoID0KKwkJCU1JTjIoc2l6ZSAvIHRleGVsQnl0ZXMsIGJsaXRXaWR0aCk7CisJCXQtPmltYWdlW2ZhY2VdW2xldmVsXS5oZWlnaHQgPQorCQkJKHNpemUgLyB0ZXhlbEJ5dGVzKSAvIHQtPmltYWdlW2ZhY2VdW2xldmVsXS53aWR0aDsKKwl9IGVsc2UgeworCQl0LT5pbWFnZVtmYWNlXVtsZXZlbF0ueCA9ICpjdXJPZmZzZXQgJSBSMzAwX0JMSVRfV0lEVEhfQllURVM7CisJCXQtPmltYWdlW2ZhY2VdW2xldmVsXS55ID0gKmN1ck9mZnNldCAvIFIzMDBfQkxJVF9XSURUSF9CWVRFUzsKKwkJdC0+aW1hZ2VbZmFjZV1bbGV2ZWxdLndpZHRoID0KKwkJCU1JTjIoc2l6ZSwgUjMwMF9CTElUX1dJRFRIX0JZVEVTKTsKKwkJdC0+aW1hZ2VbZmFjZV1bbGV2ZWxdLmhlaWdodCA9IHNpemUgLyB0LT5pbWFnZVtmYWNlXVtsZXZlbF0ud2lkdGg7CisJfQorCisJaWYgKFJBREVPTl9ERUJVRyAmIERFQlVHX1RFWFRVUkUpCisJCWZwcmludGYoc3RkZXJyLAorCQkJImxldmVsICVkLCBmYWNlICVkOiAlZHglZCB4PSVkIHk9JWQgdz0lZCBoPSVkIHNpemU9JWQgYXQgJWRcbiIsCisJCQlsZXZlbCwgZmFjZSwgdGV4SW1hZ2UtPldpZHRoLCB0ZXhJbWFnZS0+SGVpZ2h0LAorCQkJdC0+aW1hZ2VbZmFjZV1bbGV2ZWxdLngsIHQtPmltYWdlW2ZhY2VdW2xldmVsXS55LAorCQkJdC0+aW1hZ2VbZmFjZV1bbGV2ZWxdLndpZHRoLCB0LT5pbWFnZVtmYWNlXVtsZXZlbF0uaGVpZ2h0LAorCQkJc2l6ZSwgKmN1ck9mZnNldCk7CisKKwkqY3VyT2Zmc2V0ICs9IHNpemU7Cit9CisKKworCiAvKioKICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIG5lZWRlZCBmb3IKICAqIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdCAoYWxsIG1pcG1hcCBsZXZlbHMsIGFsbCBjdWJlIGZhY2VzKS4KQEAgLTEzNyw3ICszMTIsNyBAQAogCXIzMDBUZXhPYmpQdHIgdCA9IChyMzAwVGV4T2JqUHRyKSB0T2JqLT5Ecml2ZXJEYXRhOwogCWNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICpiYXNlSW1hZ2UgPQogCSAgICB0T2JqLT5JbWFnZVswXVt0T2JqLT5CYXNlTGV2ZWxdOwotCUdMaW50IGN1ck9mZnNldCwgYmxpdFdpZHRoOworCUdMaW50IGN1ck9mZnNldDsKIAlHTGludCBpLCB0ZXhlbEJ5dGVzOwogCUdMaW50IG51bUxldmVsczsKIAlHTGludCBsb2cyV2lkdGgsIGxvZzJIZWlnaHQsIGxvZzJEZXB0aDsKQEAgLTE0Niw3ICszMjEsMTIgQEAKIAkgKi8KIAlpZiAoIXQtPmltYWdlX292ZXJyaWRlCiAJICAgICYmIFZBTElEX0ZPUk1BVChiYXNlSW1hZ2UtPlRleEZvcm1hdC0+TWVzYUZvcm1hdCkpIHsKLQkJdC0+Zm9ybWF0ID0gdHhfdGFibGVbYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXRdLmZvcm1hdDsKKwkJaWYgKGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCkgeworCQkJcjMwMFNldERlcHRoVGV4TW9kZSh0T2JqKTsKKwkJfSBlbHNlIHsKKwkJCXQtPmZvcm1hdCA9IHR4X3RhYmxlW2Jhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0XS5mb3JtYXQ7CisJCX0KKwogCQl0LT5maWx0ZXIgfD0gdHhfdGFibGVbYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXRdLmZpbHRlcjsKIAl9IGVsc2UgaWYgKCF0LT5pbWFnZV9vdmVycmlkZSkgewogCQlfbWVzYV9wcm9ibGVtKE5VTEwsICJ1bmV4cGVjdGVkIHRleHR1cmUgZm9ybWF0IGluICVzIiwKQEAgLTE3MSw4ICszNTEsNiBAQAogCSAqIFRoZSBpZGVhIGlzIHRoYXQgd2UgbGF5IG91dCB0aGUgbWlwbWFwIGxldmVscyB3aXRoaW4gYSBibG9jayBvZgogCSAqIG1lbW9yeSBvcmdhbml6ZWQgYXMgYSByZWN0YW5nbGUgb2Ygd2lkdGggQkxJVF9XSURUSF9CWVRFUy4KIAkgKi8KLQljdXJPZmZzZXQgPSAwOwotCWJsaXRXaWR0aCA9IFIzMDBfQkxJVF9XSURUSF9CWVRFUzsKIAl0LT50aWxlX2JpdHMgPSAwOwogCiAJLyogZmlndXJlIG91dCBpZiB0aGlzIHRleHR1cmUgaXMgc3VpdGFibGUgZm9yIHRpbGluZy4gKi8KQEAgLTIwMiw5NCArMzgwLDIzIEBACiAJfQogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtTGV2ZWxzOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlOwotCQlHTHVpbnQgc2l6ZTsKKwljdXJPZmZzZXQgPSAwOwogCi0JCXRleEltYWdlID0gdE9iai0+SW1hZ2VbMF1baSArIHQtPmJhc2UuZmlyc3RMZXZlbF07Ci0JCWlmICghdGV4SW1hZ2UpCi0JCQlicmVhazsKKwlpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApIHsKKwkJQVNTRVJUKGxvZzJXaWR0aCA9PSBsb2cySGVpZ2h0KTsKKwkJdC0+Zm9ybWF0IHw9IFIzMDBfVFhfRk9STUFUX0NVQklDX01BUDsKIAotCQkvKiBmaW5kIGltYWdlIHNpemUgaW4gYnl0ZXMgKi8KLQkJaWYgKHRleEltYWdlLT5Jc0NvbXByZXNzZWQpIHsKLQkJCWlmICgodC0+Zm9ybWF0ICYgUjMwMF9UWF9GT1JNQVRfRFhUMSkgPT0KLQkJCSAgICBSMzAwX1RYX0ZPUk1BVF9EWFQxKSB7Ci0JCQkJLy8gZnByaW50ZihzdGRlcnIsIkRYVCAxICVkICUwOFhcbiIsIHRleEltYWdlLT5XaWR0aCwgdC0+Zm9ybWF0KTsKLQkJCQlpZiAoKHRleEltYWdlLT5XaWR0aCArIDMpIDwgOCkJLyogd2lkdGggb25lIGJsb2NrICovCi0JCQkJCXNpemUgPSB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemUgKiA0OwotCQkJCWVsc2UgaWYgKCh0ZXhJbWFnZS0+V2lkdGggKyAzKSA8IDE2KQotCQkJCQlzaXplID0gdGV4SW1hZ2UtPkNvbXByZXNzZWRTaXplICogMjsKLQkJCQllbHNlCi0JCQkJCXNpemUgPSB0ZXhJbWFnZS0+Q29tcHJlc3NlZFNpemU7Ci0JCQl9IGVsc2UgewotCQkJCS8qIERYVDMvNSwgMTYgYnl0ZXMgcGVyIGJsb2NrICovCi0JCQkJV0FSTl9PTkNFCi0JCQkJICAgICgiRFhUIDMvNSBzdWZmZXJzIGZyb20gbXVsdGl0ZXh0dXJpbmcgcHJvYmxlbXMhXG4iKTsKLQkJCQkvLyBmcHJpbnRmKHN0ZGVyciwiRFhUIDMvNSAlZFxuIiwgdGV4SW1hZ2UtPldpZHRoKTsKLQkJCQlpZiAoKHRleEltYWdlLT5XaWR0aCArIDMpIDwgOCkKLQkJCQkJc2l6ZSA9IHRleEltYWdlLT5Db21wcmVzc2VkU2l6ZSAqIDI7Ci0JCQkJZWxzZQotCQkJCQlzaXplID0gdGV4SW1hZ2UtPkNvbXByZXNzZWRTaXplOwotCQkJfQotCQl9IGVsc2UgaWYgKHRPYmotPlRhcmdldCA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9OVikgewotCQkJc2l6ZSA9Ci0JCQkgICAgKCh0ZXhJbWFnZS0+V2lkdGggKiB0ZXhlbEJ5dGVzICsKLQkJCSAgICAgIDYzKSAmIH42MykgKiB0ZXhJbWFnZS0+SGVpZ2h0OwotCQkJYmxpdFdpZHRoID0gNjQgLyB0ZXhlbEJ5dGVzOwotCQl9IGVsc2UgaWYgKHQtPnRpbGVfYml0cyAmIFIzMDBfVFhPX01JQ1JPX1RJTEUpIHsKLQkJCS8qIHRpbGUgcGF0dGVybiBpcyAxNiBieXRlcyB4Mi4gbWlwbWFwcyBzdGF5IDMyIGJ5dGUgYWxpZ25lZCwKLQkJCSAgIHRob3VnaCB0aGUgYWN0dWFsIG9mZnNldCBtYXkgYmUgZGlmZmVyZW50IChpZiB0ZXh0dXJlIGlzIGxlc3MgdGhhbgotCQkJICAgMzIgYnl0ZXMgd2lkdGgpIHRvIHRoZSB1bnRpbGVkIGNhc2UgKi8KLQkJCWludCB3ID0gKHRleEltYWdlLT5XaWR0aCAqIHRleGVsQnl0ZXMgKiAyICsgMzEpICYgfjMxOwotCQkJc2l6ZSA9Ci0JCQkgICAgKHcgKiAoKHRleEltYWdlLT5IZWlnaHQgKyAxKSAvIDIpKSAqCi0JCQkgICAgdGV4SW1hZ2UtPkRlcHRoOwotCQkJYmxpdFdpZHRoID0gTUFYMih0ZXhJbWFnZS0+V2lkdGgsIDY0IC8gdGV4ZWxCeXRlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdyA9ICh0ZXhJbWFnZS0+V2lkdGggKiB0ZXhlbEJ5dGVzICsgMzEpICYgfjMxOwotCQkJc2l6ZSA9IHcgKiB0ZXhJbWFnZS0+SGVpZ2h0ICogdGV4SW1hZ2UtPkRlcHRoOwotCQkJYmxpdFdpZHRoID0gTUFYMih0ZXhJbWFnZS0+V2lkdGgsIDY0IC8gdGV4ZWxCeXRlcyk7CisJCWZvcihpID0gMDsgaSA8IG51bUxldmVsczsgaSsrKSB7CisJCQlHTHVpbnQgZmFjZTsKKwkJCWZvcihmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKKwkJCQljb21wdXRlX3RleF9pbWFnZV9vZmZzZXQodE9iaiwgZmFjZSwgaSwgJmN1ck9mZnNldCk7CiAJCX0KLQkJYXNzZXJ0KHNpemUgPiAwKTsKKwl9IGVsc2UgeworCQlpZiAodE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfM0QpCisgICAgICAgICAgICAgICAgCXQtPmZvcm1hdCB8PSBSMzAwX1RYX0ZPUk1BVF8zRDsKIAotCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKLQkJCWZwcmludGYoc3RkZXJyLCAidz0lZCBoPSVkIGQ9JWQgdGI9JWQgaW50Rm9ybWF0PSVkXG4iLAotCQkJCXRleEltYWdlLT5XaWR0aCwgdGV4SW1hZ2UtPkhlaWdodCwKLQkJCQl0ZXhJbWFnZS0+RGVwdGgsCi0JCQkJdGV4SW1hZ2UtPlRleEZvcm1hdC0+VGV4ZWxCeXRlcywKLQkJCQl0ZXhJbWFnZS0+SW50ZXJuYWxGb3JtYXQpOwotCi0JCS8qIEFsaWduIHRvIDMyLWJ5dGUgb2Zmc2V0LiAgSXQgaXMgZmFzdGVyIHRvIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5Ci0JCSAqIChubyBicmFuY2ggcGVuYWx0eSkuCi0JCSAqLwotCi0JCWN1ck9mZnNldCA9IChjdXJPZmZzZXQgKyAweDFmKSAmIH4weDFmOwotCi0JCWlmICh0ZXhlbEJ5dGVzKSB7Ci0JCQkvKiBmaXggeCBhbmQgeSBjb29yZHMgdXAgbGF0ZXIgdG9nZXRoZXIgd2l0aCBvZmZzZXQgKi8KLQkJCXQtPmltYWdlWzBdW2ldLnggPSBjdXJPZmZzZXQ7Ci0JCQl0LT5pbWFnZVswXVtpXS55ID0gMDsKLQkJCXQtPmltYWdlWzBdW2ldLndpZHRoID0KLQkJCSAgICBNSU4yKHNpemUgLyB0ZXhlbEJ5dGVzLCBibGl0V2lkdGgpOwotCQkJdC0+aW1hZ2VbMF1baV0uaGVpZ2h0ID0KLQkJCSAgICAoc2l6ZSAvIHRleGVsQnl0ZXMpIC8gdC0+aW1hZ2VbMF1baV0ud2lkdGg7Ci0JCX0gZWxzZSB7Ci0JCQl0LT5pbWFnZVswXVtpXS54ID0gY3VyT2Zmc2V0ICUgUjMwMF9CTElUX1dJRFRIX0JZVEVTOwotCQkJdC0+aW1hZ2VbMF1baV0ueSA9IGN1ck9mZnNldCAvIFIzMDBfQkxJVF9XSURUSF9CWVRFUzsKLQkJCXQtPmltYWdlWzBdW2ldLndpZHRoID0KLQkJCSAgICBNSU4yKHNpemUsIFIzMDBfQkxJVF9XSURUSF9CWVRFUyk7Ci0JCQl0LT5pbWFnZVswXVtpXS5oZWlnaHQgPSBzaXplIC8gdC0+aW1hZ2VbMF1baV0ud2lkdGg7Ci0JCX0KLQotCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfVEVYVFVSRSkKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSJsZXZlbCAlZDogJWR4JWQgeD0lZCB5PSVkIHc9JWQgaD0lZCBzaXplPSVkIGF0ICVkXG4iLAotCQkJCWksIHRleEltYWdlLT5XaWR0aCwgdGV4SW1hZ2UtPkhlaWdodCwKLQkJCQl0LT5pbWFnZVswXVtpXS54LCB0LT5pbWFnZVswXVtpXS55LAotCQkJCXQtPmltYWdlWzBdW2ldLndpZHRoLCB0LT5pbWFnZVswXVtpXS5oZWlnaHQsCi0JCQkJc2l6ZSwgY3VyT2Zmc2V0KTsKLQotCQljdXJPZmZzZXQgKz0gc2l6ZTsKKwkJZm9yIChpID0gMDsgaSA8IG51bUxldmVsczsgaSsrKQorCQkJY29tcHV0ZV90ZXhfaW1hZ2Vfb2Zmc2V0KHRPYmosIDAsIGksICZjdXJPZmZzZXQpOwogCX0KIAogCS8qIEFsaWduIHRoZSB0b3RhbCBzaXplIG9mIHRleHR1cmUgbWVtb3J5IGJsb2NrLgpAQCAtMjk3LDQzICs0MDQsMjcgQEAKIAl0LT5iYXNlLnRvdGFsU2l6ZSA9CiAJICAgIChjdXJPZmZzZXQgKyBSQURFT05fT0ZGU0VUX01BU0spICYgflJBREVPTl9PRkZTRVRfTUFTSzsKIAotCS8qIFNldHVwIHJlbWFpbmluZyBjdWJlIGZhY2UgYmxpdHMsIGlmIG5lZWRlZCAqLwotCWlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUCkgewotCQlHTHVpbnQgZmFjZTsKLQkJZm9yIChmYWNlID0gMTsgZmFjZSA8IDY7IGZhY2UrKykgewotCQkJZm9yIChpID0gMDsgaSA8IG51bUxldmVsczsgaSsrKSB7Ci0JCQkJdC0+aW1hZ2VbZmFjZV1baV0ueCA9IHQtPmltYWdlWzBdW2ldLng7Ci0JCQkJdC0+aW1hZ2VbZmFjZV1baV0ueSA9IHQtPmltYWdlWzBdW2ldLnk7Ci0JCQkJdC0+aW1hZ2VbZmFjZV1baV0ud2lkdGggPSB0LT5pbWFnZVswXVtpXS53aWR0aDsKLQkJCQl0LT5pbWFnZVtmYWNlXVtpXS5oZWlnaHQgPQotCQkJCSAgICB0LT5pbWFnZVswXVtpXS5oZWlnaHQ7Ci0JCQl9Ci0JCX0KLQkJdC0+YmFzZS50b3RhbFNpemUgKj0gNjsJLyogdG90YWwgdGV4bWVtIG5lZWRlZCAqLwotCX0KLQotCWlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUCkgewotCQlBU1NFUlQobG9nMldpZHRoID09IGxvZzJIZWlnaHQpOwotCQl0LT5mb3JtYXQgfD0gUjMwMF9UWF9GT1JNQVRfQ1VCSUNfTUFQOwotCX0KLQogCXQtPnNpemUgPQogCSAgICAoKCh0T2JqLT5JbWFnZVswXVt0LT5iYXNlLmZpcnN0TGV2ZWxdLT5XaWR0aCAtCiAJICAgICAgIDEpIDw8IFIzMDBfVFhfV0lEVEhNQVNLX1NISUZUKQogCSAgICAgfCAoKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPkhlaWdodCAtIDEpIDw8Ci0JCVIzMDBfVFhfSEVJR0hUTUFTS19TSElGVCkpCisJCVIzMDBfVFhfSEVJR0hUTUFTS19TSElGVCkKKwkgICAgIHwgKCh0T2JqLT5JbWFnZVswXVt0LT5iYXNlLmZpcnN0TGV2ZWxdLT5EZXB0aExvZzIpIDw8CisJCVIzMDBfVFhfREVQVEhNQVNLX1NISUZUKSkKIAkgICAgfCAoKG51bUxldmVscyAtIDEpIDw8IFIzMDBfVFhfTUFYX01JUF9MRVZFTF9TSElGVCk7CiAKKwl0LT5waXRjaCA9IDA7CisKIAkvKiBPbmx5IG5lZWQgdG8gcm91bmQgdG8gbmVhcmVzdCAzMiBmb3IgdGV4dHVyZXMsIGJ1dCB0aGUgYmxpdHRlcgogCSAqIHJlcXVpcmVzIDY0LWJ5dGUgYWxpZ25lZCBwaXRjaGVzLCBhbmQgd2UgbWF5L21heSBub3QgbmVlZCB0aGUKIAkgKiBibGl0dGVyLiAgIE5QT1Qgb25seSEKIAkgKi8KIAlpZiAoYmFzZUltYWdlLT5Jc0NvbXByZXNzZWQpIHsKLQkJdC0+cGl0Y2ggPQorCQl0LT5waXRjaCB8PQogCQkgICAgKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPldpZHRoICsgNjMpICYgfig2Myk7CiAJfSBlbHNlIGlmICh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV9SRUNUQU5HTEVfTlYpIHsKLQkJdW5zaWduZWQgaW50IGFsaWduID0gYmxpdFdpZHRoIC0gMTsKLQkJdC0+cGl0Y2ggPSAoKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPldpZHRoICoKKwkJdW5zaWduZWQgaW50IGFsaWduID0gKDY0IC8gdGV4ZWxCeXRlcykgLSAxOworCQl0LT5waXRjaCB8PSAoKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPldpZHRoICoKIAkJCSAgICAgdGV4ZWxCeXRlcykgKyA2MykgJiB+KDYzKTsKIAkJdC0+c2l6ZSB8PSBSMzAwX1RYX1NJWkVfVFhQSVRDSF9FTjsKIAkJaWYgKCF0LT5pbWFnZV9vdmVycmlkZSkKQEAgLTM0MSwxNCArNDMyLDE3IEBACiAJCQkgICAgKCgodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGgpICsKIAkJCSAgICAgIGFsaWduKSAmIH5hbGlnbikgLSAxOwogCX0gZWxzZSB7Ci0JCXQtPnBpdGNoID0KKwkJdC0+cGl0Y2ggfD0KIAkJICAgICgodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggKgogCQkgICAgICB0ZXhlbEJ5dGVzKSArIDYzKSAmIH4oNjMpOwogCX0KIAotCXQtPmRpcnR5X3N0YXRlID0gVEVYX0FMTDsKLQotCS8qIEZZSTogcjMwMFVwbG9hZFRleEltYWdlcyggcm1lc2EsIHQgKSB1c2VkIHRvIGJlIGNhbGxlZCBoZXJlICovCisJaWYgKHJtZXNhLT5yYWRlb24ucmFkZW9uU2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkgeworCSAgICBpZiAodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggPiAyMDQ4KQorCQl0LT5waXRjaF9yZWcgfD0gUjUwMF9UWFdJRFRIX0JJVDExOworCSAgICBpZiAodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+SGVpZ2h0ID4gMjA0OCkKKwkJdC0+cGl0Y2hfcmVnIHw9IFI1MDBfVFhIRUlHSFRfQklUMTE7CisJfQogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00ODUsNyArNTc5LDYgQEAKIAogCQlybWVzYS0+c3RhdGUudGV4dHVyZS51bml0W3VuaXRdLnRleG9iaiA9IHQ7CiAJCXQtPmJhc2UuYm91bmQgfD0gKDEgPDwgdW5pdCk7Ci0JCXQtPmRpcnR5X3N0YXRlIHw9IDEgPDwgdW5pdDsKIAkJZHJpVXBkYXRlVGV4dHVyZUxSVSgoZHJpVGV4dHVyZU9iamVjdCAqKSB0KTsJLyogWFhYOiBzaG91bGQgYmUgbG9ja2VkISAqLwogCX0KIApAQCAtNDk1LDEyICs1ODgsMTEgQEAKIHZvaWQgcjMwMFNldFRleE9mZnNldChfX0RSSWNvbnRleHQgKiBwRFJJQ3R4LCBHTGludCB0ZXhuYW1lLAogCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwgR0x1aW50IHBpdGNoKQogewotCXIzMDBDb250ZXh0UHRyIHJtZXNhID0KLQkgICAgKHIzMDBDb250ZXh0UHRyKSAoKF9fRFJJY29udGV4dFByaXZhdGUgKikgcERSSUN0eC0+cHJpdmF0ZSktPgotCSAgICBkcml2ZXJQcml2YXRlOworCXIzMDBDb250ZXh0UHRyIHJtZXNhID0gcERSSUN0eC0+ZHJpdmVyUHJpdmF0ZTsKIAlzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRPYmogPQogCSAgICBfbWVzYV9sb29rdXBfdGV4dHVyZShybWVzYS0+cmFkZW9uLmdsQ3R4LCB0ZXhuYW1lKTsKIAlyMzAwVGV4T2JqUHRyIHQ7CisJdWludDMyX3QgcGl0Y2hfdmFsOwogCiAJaWYgKCF0T2JqKQogCQlyZXR1cm47CkBAIC01MTMsMjggKzYwNSwzMCBAQAogCQlyZXR1cm47CiAKIAl0LT5vZmZzZXQgPSBvZmZzZXQ7Ci0JdC0+cGl0Y2hfcmVnID0gcGl0Y2g7CisJdC0+cGl0Y2hfcmVnICY9ICgxIDw8IDEzKSAtMTsKKwlwaXRjaF92YWwgPSBwaXRjaDsKIAogCXN3aXRjaCAoZGVwdGgpIHsKIAljYXNlIDMyOgogCQl0LT5mb3JtYXQgPSBSMzAwX0VBU1lfVFhfRk9STUFUKFgsIFksIFosIFcsIFc4WjhZOFg4KTsKIAkJdC0+ZmlsdGVyIHw9IHR4X3RhYmxlWzJdLmZpbHRlcjsKLQkJdC0+cGl0Y2hfcmVnIC89IDQ7CisJCXBpdGNoX3ZhbCAvPSA0OwogCQlicmVhazsKIAljYXNlIDI0OgogCWRlZmF1bHQ6CiAJCXQtPmZvcm1hdCA9IFIzMDBfRUFTWV9UWF9GT1JNQVQoWCwgWSwgWiwgT05FLCBXOFo4WThYOCk7CiAJCXQtPmZpbHRlciB8PSB0eF90YWJsZVs0XS5maWx0ZXI7Ci0JCXQtPnBpdGNoX3JlZyAvPSA0OworCQlwaXRjaF92YWwgLz0gNDsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKIAkJdC0+Zm9ybWF0ID0gUjMwMF9FQVNZX1RYX0ZPUk1BVChYLCBZLCBaLCBPTkUsIFo1WTZYNSk7CiAJCXQtPmZpbHRlciB8PSB0eF90YWJsZVs1XS5maWx0ZXI7Ci0JCXQtPnBpdGNoX3JlZyAvPSAyOworCQlwaXRjaF92YWwgLz0gMjsKIAkJYnJlYWs7CiAJfQorCXBpdGNoX3ZhbC0tOwogCi0JdC0+cGl0Y2hfcmVnLS07CisJdC0+cGl0Y2hfcmVnIHw9IHBpdGNoX3ZhbDsKIH0KIAogc3RhdGljIEdMYm9vbGVhbiByMzAwVXBkYXRlVGV4dHVyZVVuaXQoR0xjb250ZXh0ICogY3R4LCBpbnQgdW5pdCkKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF92ZXJ0cHJvZy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3ZlcnRwcm9nLmMKaW5kZXggN2Q0ZThjOS4uYzRlMzI1ZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3ZlcnRwcm9nLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yMzAwX3ZlcnRwcm9nLmMKQEAgLTEsNiArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotQ29weXJpZ2h0IChDKSAyMDA1IEFhcG8gVGFoa29sYS4KK0NvcHlyaWdodCAoQykgMjAwNSAgQWFwbyBUYWhrb2xhIDxhZXRAcmFzdGVyYnVybi5vcmc+CitDb3B5cmlnaHQgKEMpIDIwMDggIE9saXZlciBNY0ZhZGRlbiA8ejNyby5nZWVrQGdtYWlsLmNvbT4KIAogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIApAQCAtMjUsMjAgKzI2LDEyIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKioKLSAqIFxmaWxlCi0gKgotICogXGF1dGhvciBBYXBvIFRhaGtvbGEgPGFldEByYXN0ZXJidXJuLm9yZz4KLSAqCi0gKiBcYXV0aG9yIE9saXZlciBNY0ZhZGRlbiA8ejNyby5nZWVrQGdtYWlsLmNvbT4KLSAqCi0gKiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0IHNlZSByMzAwX3JlZy5oLgotICovCisvKiBSYWRlb24gUjV4eCBBY2NlbGVyYXRpb24sIFJldmlzaW9uIDEuMiAqLwogCi0jaW5jbHVkZSAiZ2xoZWFkZXIuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJlbnVtcy5oIgotI2luY2x1ZGUgInByb2dyYW0uaCIKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJtYWluL2VudW1zLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dyYW0uaCIKICNpbmNsdWRlICJzaGFkZXIvcHJvZ19pbnN0cnVjdGlvbi5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX3N0YXRldmFycy5oIgpAQCAtNDYsNzEgKzM5LDM4IEBACiAKICNpbmNsdWRlICJyMzAwX2NvbnRleHQuaCIKIAotI2lmIFNXSVpaTEVfWCAhPSBWU0ZfSU5fQ09NUE9ORU5UX1ggfHwgXAotICAgIFNXSVpaTEVfWSAhPSBWU0ZfSU5fQ09NUE9ORU5UX1kgfHwgXAotICAgIFNXSVpaTEVfWiAhPSBWU0ZfSU5fQ09NUE9ORU5UX1ogfHwgXAotICAgIFNXSVpaTEVfVyAhPSBWU0ZfSU5fQ09NUE9ORU5UX1cgfHwgXAotICAgIFNXSVpaTEVfWkVSTyAhPSBWU0ZfSU5fQ09NUE9ORU5UX1pFUk8gfHwgXAotICAgIFNXSVpaTEVfT05FICE9IFZTRl9JTl9DT01QT05FTlRfT05FIHx8IFwKLSAgICBXUklURU1BU0tfWCAhPSBWU0ZfRkxBR19YIHx8IFwKLSAgICBXUklURU1BU0tfWSAhPSBWU0ZfRkxBR19ZIHx8IFwKLSAgICBXUklURU1BU0tfWiAhPSBWU0ZfRkxBR19aIHx8IFwKLSAgICBXUklURU1BU0tfVyAhPSBWU0ZfRkxBR19XCi0jZXJyb3IgQ2Fubm90IGNoYW5nZSB0aGVzZSEKLSNlbmRpZgotCiAvKiBUT0RPOiBHZXQgcmlkIG9mIHRfc3JjX2NsYXNzIGNhbGwgKi8KICNkZWZpbmUgQ01QX1NSQ1MoYSwgYikgKChhLlJlbEFkZHIgIT0gYi5SZWxBZGRyKSB8fCAoYS5JbmRleCAhPSBiLkluZGV4ICYmIFwKLQkJICAgICAgICgodF9zcmNfY2xhc3MoYS5GaWxlKSA9PSBWU0ZfSU5fQ0xBU1NfUEFSQU0gJiYgXAotCQkJIHRfc3JjX2NsYXNzKGIuRmlsZSkgPT0gVlNGX0lOX0NMQVNTX1BBUkFNKSB8fCBcCi0JCQkodF9zcmNfY2xhc3MoYS5GaWxlKSA9PSBWU0ZfSU5fQ0xBU1NfQVRUUiAmJiBcCi0JCQkgdF9zcmNfY2xhc3MoYi5GaWxlKSA9PSBWU0ZfSU5fQ0xBU1NfQVRUUikpKSkgXAorCQkgICAgICAgKCh0X3NyY19jbGFzcyhhLkZpbGUpID09IFBWU19TUkNfUkVHX0NPTlNUQU5UICYmIFwKKwkJCSB0X3NyY19jbGFzcyhiLkZpbGUpID09IFBWU19TUkNfUkVHX0NPTlNUQU5UKSB8fCBcCisJCQkodF9zcmNfY2xhc3MoYS5GaWxlKSA9PSBQVlNfU1JDX1JFR19JTlBVVCAmJiBcCisJCQkgdF9zcmNfY2xhc3MoYi5GaWxlKSA9PSBQVlNfU1JDX1JFR19JTlBVVCkpKSkgXAogCi0jZGVmaW5lIFpFUk9fU1JDXzAgKE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksIFwKLQkJCQkgICAgU1dJWlpMRV9aRVJPLCBTV0laWkxFX1pFUk8sIFwKLQkJCQkgICAgU1dJWlpMRV9aRVJPLCBTV0laWkxFX1pFUk8sIFwKLQkJCQkgICAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLCBWU0ZfRkxBR19OT05FKSB8IChzcmNbMF0uUmVsQWRkciA8PCA0KSkKLQotI2RlZmluZSBaRVJPX1NSQ18xIChNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMV0pLCBcCi0JCQkJICAgIFNXSVpaTEVfWkVSTywgU1dJWlpMRV9aRVJPLCBcCi0JCQkJICAgIFNXSVpaTEVfWkVSTywgU1dJWlpMRV9aRVJPLCBcCi0JCQkJICAgIHRfc3JjX2NsYXNzKHNyY1sxXS5GaWxlKSwgVlNGX0ZMQUdfTk9ORSkgfCAoc3JjWzFdLlJlbEFkZHIgPDwgNCkpCi0KLSNkZWZpbmUgWkVST19TUkNfMiAoTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzJdKSwgXAotCQkJCSAgICBTV0laWkxFX1pFUk8sIFNXSVpaTEVfWkVSTywgXAotCQkJCSAgICBTV0laWkxFX1pFUk8sIFNXSVpaTEVfWkVSTywgXAotCQkJCSAgICB0X3NyY19jbGFzcyhzcmNbMl0uRmlsZSksIFZTRl9GTEFHX05PTkUpIHwgKHNyY1syXS5SZWxBZGRyIDw8IDQpKQotCi0jZGVmaW5lIE9ORV9TUkNfMCAoTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwgXAotCQkJCSAgICBTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUsIFwKLQkJCQkgICAgU1dJWlpMRV9PTkUsIFNXSVpaTEVfT05FLCBcCi0JCQkJICAgIHRfc3JjX2NsYXNzKHNyY1swXS5GaWxlKSwgVlNGX0ZMQUdfTk9ORSkgfCAoc3JjWzBdLlJlbEFkZHIgPDwgNCkpCi0KLSNkZWZpbmUgT05FX1NSQ18xIChNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMV0pLCBcCi0JCQkJICAgIFNXSVpaTEVfT05FLCBTV0laWkxFX09ORSwgXAotCQkJCSAgICBTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUsIFwKLQkJCQkgICAgdF9zcmNfY2xhc3Moc3JjWzFdLkZpbGUpLCBWU0ZfRkxBR19OT05FKSB8IChzcmNbMV0uUmVsQWRkciA8PCA0KSkKLQotI2RlZmluZSBPTkVfU1JDXzIgKE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1syXSksIFwKLQkJCQkgICAgU1dJWlpMRV9PTkUsIFNXSVpaTEVfT05FLCBcCi0JCQkJICAgIFNXSVpaTEVfT05FLCBTV0laWkxFX09ORSwgXAotCQkJCSAgICB0X3NyY19jbGFzcyhzcmNbMl0uRmlsZSksIFZTRl9GTEFHX05PTkUpIHwgKHNyY1syXS5SZWxBZGRyIDw8IDQpKQotCi0vKiBEUDQgdmVyc2lvbiBzZWVtcyB0byB0cmlnZ2VyIHNvbWUgaHcgcGVjdWxpYXJpdHkgKi8KLS8vI2RlZmluZSBQUkVGRVJfRFA0CisvKgorICogVGFrZSBhbiBhbHJlYWR5LXNldHVwIGFuZCB2YWxpZCBzb3VyY2UgdGhlbiBzd2l6emxlIGl0IGFwcHJvcHJpYXRlbHkgdG8KKyAqIG9idGFpbiBhIGNvbnN0YW50IFpFUk8gb3IgT05FIHNvdXJjZS4KKyAqLworI2RlZmluZSBfX0NPTlNUKHgsIHkpCVwKKwkoUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjW3hdKSwJXAorCQkJICAgdF9zd2l6emxlKHkpLAlcCisJCQkgICB0X3N3aXp6bGUoeSksCVwKKwkJCSAgIHRfc3dpenpsZSh5KSwJXAorCQkJICAgdF9zd2l6emxlKHkpLAlcCisJCQkgICB0X3NyY19jbGFzcyhzcmNbeF0uRmlsZSksIFwKKwkJCSAgIFZTRl9GTEFHX05PTkUpIHwgKHNyY1t4XS5SZWxBZGRyIDw8IDQpKQogCiAjZGVmaW5lIEZSRUVfVEVNUFMoKSBcCiAJZG8geyBcCi0JCWlmKHVfdGVtcF9pIDwgdnAtPm51bV90ZW1wb3JhcmllcykgeyBcCi0JCQlXQVJOX09OQ0UoIlJhbiBvdXQgb2YgdGVtcHMsIG51bSB0ZW1wcyAlZCwgdXMgJWRcbiIsIHZwLT5udW1fdGVtcG9yYXJpZXMsIHVfdGVtcF9pKTsgXAorCQlpbnQgdV90ZW1wX3VzZWQgPSAoVlNGX01BWF9GUkFHTUVOVF9URU1QUyAtIDEpIC0gdV90ZW1wX2k7IFwKKwkJaWYoKHZwLT5udW1fdGVtcG9yYXJpZXMgKyB1X3RlbXBfdXNlZCkgPiBWU0ZfTUFYX0ZSQUdNRU5UX1RFTVBTKSB7IFwKKwkJCVdBUk5fT05DRSgiUmFuIG91dCBvZiB0ZW1wcywgbnVtIHRlbXBzICVkLCB1cyAlZFxuIiwgdnAtPm51bV90ZW1wb3JhcmllcywgdV90ZW1wX3VzZWQpOyBcCiAJCQl2cC0+bmF0aXZlID0gR0xfRkFMU0U7IFwKIAkJfSBcCiAJCXVfdGVtcF9pPVZTRl9NQVhfRlJBR01FTlRfVEVNUFMtMTsgXAogCX0gd2hpbGUgKDApCiAKIGludCByMzAwVmVydGV4UHJvZ1VwZGF0ZVBhcmFtcyhHTGNvbnRleHQgKiBjdHgsCi0JCQkgICAgICAgc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW1fY29udCAqdnAsCi0JCQkgICAgICAgZmxvYXQgKmRzdCkKKwkJCSAgICAgICBzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbV9jb250ICp2cCwgZmxvYXQgKmRzdCkKIHsKIAlpbnQgcGk7CiAJc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICptZXNhX3ZwID0gJnZwLT5tZXNhX3Byb2dyYW07CkBAIC0xNDEsNyArMTAxLDYgQEAKIAlwYXJhbUxpc3QgPSBtZXNhX3ZwLT5CYXNlLlBhcmFtZXRlcnM7CiAJZm9yIChwaSA9IDA7IHBpIDwgcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzOyBwaSsrKSB7CiAJCXN3aXRjaCAocGFyYW1MaXN0LT5QYXJhbWV0ZXJzW3BpXS5UeXBlKSB7Ci0KIAkJY2FzZSBQUk9HUkFNX1NUQVRFX1ZBUjoKIAkJY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgogCQkJLy9mcHJpbnRmKHN0ZGVyciwgIiVzIiwgdnAtPlBhcmFtZXRlcnMtPlBhcmFtZXRlcnNbcGldLk5hbWUpOwpAQCAtMTUxLDcgKzExMCw2IEBACiAJCQkqZHN0KysgPSBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1twaV1bMl07CiAJCQkqZHN0KysgPSBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1twaV1bM107CiAJCQlicmVhazsKLQogCQlkZWZhdWx0OgogCQkJX21lc2FfcHJvYmxlbShOVUxMLCAiQmFkIHBhcmFtIHR5cGUgaW4gJXMiLAogCQkJCSAgICAgIF9fRlVOQ1RJT05fXyk7CkBAIC0xNzMsMTEgKzEzMSwxMSBAQAogCiAJc3dpdGNoIChmaWxlKSB7CiAJY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKLQkJcmV0dXJuIFZTRl9PVVRfQ0xBU1NfVE1QOworCQlyZXR1cm4gUFZTX0RTVF9SRUdfVEVNUE9SQVJZOwogCWNhc2UgUFJPR1JBTV9PVVRQVVQ6Ci0JCXJldHVybiBWU0ZfT1VUX0NMQVNTX1JFU1VMVDsKKwkJcmV0dXJuIFBWU19EU1RfUkVHX09VVDsKIAljYXNlIFBST0dSQU1fQUREUkVTUzoKLQkJcmV0dXJuIFZTRl9PVVRfQ0xBU1NfQUREUjsKKwkJcmV0dXJuIFBWU19EU1RfUkVHX0EwOwogCQkvKgogCQkgICBjYXNlIFBST0dSQU1fSU5QVVQ6CiAJCSAgIGNhc2UgUFJPR1JBTV9MT0NBTF9QQVJBTToKQEAgLTIwNSwxOSArMTYzLDE3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRfc3JjX2NsYXNzKGVudW0gcmVnaXN0ZXJfZmlsZSBmaWxlKQogewotCiAJc3dpdGNoIChmaWxlKSB7CiAJY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKLQkJcmV0dXJuIFZTRl9JTl9DTEFTU19UTVA7Ci0KKwkJcmV0dXJuIFBWU19TUkNfUkVHX1RFTVBPUkFSWTsKIAljYXNlIFBST0dSQU1fSU5QVVQ6Ci0JCXJldHVybiBWU0ZfSU5fQ0xBU1NfQVRUUjsKLQorCQlyZXR1cm4gUFZTX1NSQ19SRUdfSU5QVVQ7CiAJY2FzZSBQUk9HUkFNX0xPQ0FMX1BBUkFNOgogCWNhc2UgUFJPR1JBTV9FTlZfUEFSQU06CiAJY2FzZSBQUk9HUkFNX05BTUVEX1BBUkFNOgorCWNhc2UgUFJPR1JBTV9DT05TVEFOVDoKIAljYXNlIFBST0dSQU1fU1RBVEVfVkFSOgotCQlyZXR1cm4gVlNGX0lOX0NMQVNTX1BBUkFNOworCQlyZXR1cm4gUFZTX1NSQ19SRUdfQ09OU1RBTlQ7CiAJCS8qCiAJCSAgIGNhc2UgUFJPR1JBTV9PVVRQVVQ6CiAJCSAgIGNhc2UgUFJPR1JBTV9XUklURV9PTkxZOgpAQCAtMjMwLDcgKzE4Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdF9zd2l6emxlKEdMdWJ5dGUgc3dpenpsZSkKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyB0X3N3aXp6bGUoR0x1Ynl0ZSBzd2l6emxlKQogewogLyogdGhpcyBpcyBpbiBmYWN0IGEgTk9QIGFzIHRoZSBNZXNhIFNXSVpaTEVfKiBhcmUgYWxsIGlkZW50aWNhbCB0byBWU0ZfSU5fQ09NUE9ORU5UXyogKi8KIAlyZXR1cm4gc3dpenpsZTsKQEAgLTI0Miw4ICsxOTgsOCBAQAogCWludCBpOwogCiAJaWYgKHZwID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ2cCBudWxsIGluIGNhbGwgdG8gJXMgZnJvbSAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgY2FsbGVyKTsKKwkJZnByaW50ZihzdGRlcnIsICJ2cCBudWxsIGluIGNhbGwgdG8gJXMgZnJvbSAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJY2FsbGVyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjkyLDcgKzI0OCw3IEBACiAJLyogc3JjLT5OZWdhdGVCYXNlIHVzZXMgdGhlIE5FR0FURV8gZmxhZ3MgZnJvbSBwcm9ncmFtX2luc3RydWN0aW9uLmgsCiAJICogd2hpY2ggZXF1YWwgb3VyIFZTRl9GTEFHU18gdmFsdWVzLCBzbyBpdCdzIHNhZmUgdG8ganVzdCBwYXNzIGl0IGhlcmUuCiAJICovCi0JcmV0dXJuIE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgc3JjKSwKKwlyZXR1cm4gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCBzcmMpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMCkpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMSkpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMikpLApAQCAtMzA3LDcgKzI2Myw3IEBACiAJLyogc3JjLT5OZWdhdGVCYXNlIHVzZXMgdGhlIE5FR0FURV8gZmxhZ3MgZnJvbSBwcm9ncmFtX2luc3RydWN0aW9uLmgsCiAJICogd2hpY2ggZXF1YWwgb3VyIFZTRl9GTEFHU18gdmFsdWVzLCBzbyBpdCdzIHNhZmUgdG8ganVzdCBwYXNzIGl0IGhlcmUuCiAJICovCi0JcmV0dXJuIE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgc3JjKSwKKwlyZXR1cm4gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCBzcmMpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMCkpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMCkpLAogCQkJICAgICAgIHRfc3dpenpsZShHRVRfU1daKHNyYy0+U3dpenpsZSwgMCkpLApAQCAtMzMwLDM5NyArMjg2LDM2NCBAQAogCXJldHVybiBHTF9UUlVFOwogfQogCi0vKgotICogSW5zdHJ1Y3Rpb24gICAgSW5wdXRzICBPdXRwdXQgICBEZXNjcmlwdGlvbgotICogLS0tLS0tLS0tLS0gICAgLS0tLS0tICAtLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQUJTICAgICAgICAgICAgdiAgICAgICB2ICAgICAgICBhYnNvbHV0ZSB2YWx1ZQotICogQUREICAgICAgICAgICAgdix2ICAgICB2ICAgICAgICBhZGQKLSAqIEFSTCAgICAgICAgICAgIHMgICAgICAgYSAgICAgICAgYWRkcmVzcyByZWdpc3RlciBsb2FkCi0gKiBEUDMgICAgICAgICAgICB2LHYgICAgIHNzc3MgICAgIDMtY29tcG9uZW50IGRvdCBwcm9kdWN0Ci0gKiBEUDQgICAgICAgICAgICB2LHYgICAgIHNzc3MgICAgIDQtY29tcG9uZW50IGRvdCBwcm9kdWN0Ci0gKiBEUEggICAgICAgICAgICB2LHYgICAgIHNzc3MgICAgIGhvbW9nZW5lb3VzIGRvdCBwcm9kdWN0Ci0gKiBEU1QgICAgICAgICAgICB2LHYgICAgIHYgICAgICAgIGRpc3RhbmNlIHZlY3RvcgotICogRVgyICAgICAgICAgICAgcyAgICAgICBzc3NzICAgICBleHBvbmVudGlhbCBiYXNlIDIKLSAqIEVYUCAgICAgICAgICAgIHMgICAgICAgdiAgICAgICAgZXhwb25lbnRpYWwgYmFzZSAyIChhcHByb3hpbWF0ZSkKLSAqIEZMUiAgICAgICAgICAgIHYgICAgICAgdiAgICAgICAgZmxvb3IKLSAqIEZSQyAgICAgICAgICAgIHYgICAgICAgdiAgICAgICAgZnJhY3Rpb24KLSAqIExHMiAgICAgICAgICAgIHMgICAgICAgc3NzcyAgICAgbG9nYXJpdGhtIGJhc2UgMgotICogTElUICAgICAgICAgICAgdiAgICAgICB2ICAgICAgICBjb21wdXRlIGxpZ2h0IGNvZWZmaWNpZW50cwotICogTE9HICAgICAgICAgICAgcyAgICAgICB2ICAgICAgICBsb2dhcml0aG0gYmFzZSAyIChhcHByb3hpbWF0ZSkKLSAqIE1BRCAgICAgICAgICAgIHYsdix2ICAgdiAgICAgICAgbXVsdGlwbHkgYW5kIGFkZAotICogTUFYICAgICAgICAgICAgdix2ICAgICB2ICAgICAgICBtYXhpbXVtCi0gKiBNSU4gICAgICAgICAgICB2LHYgICAgIHYgICAgICAgIG1pbmltdW0KLSAqIE1PViAgICAgICAgICAgIHYgICAgICAgdiAgICAgICAgbW92ZQotICogTVVMICAgICAgICAgICAgdix2ICAgICB2ICAgICAgICBtdWx0aXBseQotICogUE9XICAgICAgICAgICAgcyxzICAgICBzc3NzICAgICBleHBvbmVudGlhdGUKLSAqIFJDUCAgICAgICAgICAgIHMgICAgICAgc3NzcyAgICAgcmVjaXByb2NhbAotICogUlNRICAgICAgICAgICAgcyAgICAgICBzc3NzICAgICByZWNpcHJvY2FsIHNxdWFyZSByb290Ci0gKiBTR0UgICAgICAgICAgICB2LHYgICAgIHYgICAgICAgIHNldCBvbiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAqIFNMVCAgICAgICAgICAgIHYsdiAgICAgdiAgICAgICAgc2V0IG9uIGxlc3MgdGhhbgotICogU1VCICAgICAgICAgICAgdix2ICAgICB2ICAgICAgICBzdWJ0cmFjdAotICogU1daICAgICAgICAgICAgdiAgICAgICB2ICAgICAgICBleHRlbmRlZCBzd2l6emxlCi0gKiBYUEQgICAgICAgICAgICB2LHYgICAgIHYgICAgICAgIGNyb3NzIHByb2R1Y3QKLSAqCi0gKiBUYWJsZSBYLjU6ICBTdW1tYXJ5IG9mIHZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9ucy4gICJ2IiBpbmRpY2F0ZXMgYQotICogZmxvYXRpbmctcG9pbnQgdmVjdG9yIGlucHV0IG9yIG91dHB1dCwgInMiIGluZGljYXRlcyBhIGZsb2F0aW5nLXBvaW50Ci0gKiBzY2FsYXIgaW5wdXQsICJzc3NzIiBpbmRpY2F0ZXMgYSBzY2FsYXIgb3V0cHV0IHJlcGxpY2F0ZWQgYWNyb3NzIGEKLSAqIDQtY29tcG9uZW50IHJlc3VsdCB2ZWN0b3IsIGFuZCAiYSIgaW5kaWNhdGVzIGEgc2luZ2xlIGFkZHJlc3MgcmVnaXN0ZXIKLSAqIGNvbXBvbmVudC4KLSAqLwotCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9hYnMoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVBQlMoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewogCS8vTUFYIFJFU1VMVCAxLlggWSBaIFcgUEFSQU0gMHt9IHtYIFkgWiBXfSBQQVJBTSAwe1ggWSBaIFcgfSB7WCBZIFogV30gbmVnIFhuZWcgWW5lZyBabmVnIFcKIAotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfTUFYLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfTUFYSU1VTSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmModnAsICZzcmNbMF0pOwotCWluc3RbMl0gPQotCSAgICBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMikpLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAzKSksCi0JCQkgICAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAotCQkJICAgICghc3JjWzBdLgotCQkJICAgICBOZWdhdGVCYXNlKSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKKwlpbnN0WzJdID0gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMSkpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDIpKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAzKSksCisJCQkJICB0X3NyY19jbGFzcyhzcmNbMF0uRmlsZSksCisJCQkJICAoIXNyY1swXS4KKwkJCQkgICBOZWdhdGVCYXNlKSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKIAkgICAgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwogCWluc3RbM10gPSAwOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2FkZChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZUFERChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7Ci0JdW5zaWduZWQgbG9uZyBod19vcDsKLQotI2lmIDEKLQlod19vcCA9IChzcmNbMF0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWQotCQkgJiYgc3JjWzFdLkZpbGUgPT0KLQkJIFBST0dSQU1fVEVNUE9SQVJZKSA/IFIzMDBfVlBJX09VVF9PUF9NQURfMiA6Ci0JICAgIFIzMDBfVlBJX09VVF9PUF9NQUQ7Ci0KLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoaHdfb3AsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwotCWluc3RbMV0gPSBPTkVfU1JDXzA7Ci0JaW5zdFsyXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzNdID0gdF9zcmModnAsICZzcmNbMV0pOwotI2Vsc2UKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0FERCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9BREQsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKIAlpbnN0WzJdID0gdF9zcmModnAsICZzcmNbMV0pOwotCWluc3RbM10gPSBaRVJPX1NSQ18xOwotCi0jZW5kaWYKKwlpbnN0WzNdID0gX19DT05TVCgxLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2FybChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZUFSTChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7Ci0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF9BUkwsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwotCisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9GTFQyRklYX0RYLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9IFpFUk9fU1JDXzA7Ci0JaW5zdFszXSA9IFpFUk9fU1JDXzA7CisJaW5zdFsyXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKKwlpbnN0WzNdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2RwMyhzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZURQMyhzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7CiAJLy9ET1QgUkVTVUxUIDEuWCBZIFogVyBQQVJBTSAwe30ge1ggWSBaIFpFUk99IFBBUkFNIDB7fSB7WCBZIFogWkVST30KIAotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfRE9ULCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQotCWluc3RbMV0gPQotCSAgICBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMikpLAotCQkJICAgIFNXSVpaTEVfWkVSTywgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAotCQkJICAgIHNyY1swXS4KLQkJCSAgICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfWFlaIDogVlNGX0ZMQUdfTk9ORSkgfAorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfRE9UX1BST0RVQ1QsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFsxXSA9IFBWU19TUkNfT1BFUkFORCh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAyKSksCisJCQkJICBTV0laWkxFX1pFUk8sCisJCQkJICB0X3NyY19jbGFzcyhzcmNbMF0uRmlsZSksCisJCQkJICBzcmNbMF0uCisJCQkJICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfWFlaIDogVlNGX0ZMQUdfTk9ORSkgfAogCSAgICAoc3JjWzBdLlJlbEFkZHIgPDwgNCk7Ci0KIAlpbnN0WzJdID0KLQkgICAgTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzFdKSwKKwkgICAgUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzFdKSwKIAkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMCkpLAogCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAxKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDIpKSwKLQkJCSAgICBTV0laWkxFX1pFUk8sIHRfc3JjX2NsYXNzKHNyY1sxXS5GaWxlKSwKKwkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMikpLCBTV0laWkxFX1pFUk8sCisJCQkgICAgdF9zcmNfY2xhc3Moc3JjWzFdLkZpbGUpLAogCQkJICAgIHNyY1sxXS4KIAkJCSAgICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfWFlaIDogVlNGX0ZMQUdfTk9ORSkgfAogCSAgICAoc3JjWzFdLlJlbEFkZHIgPDwgNCk7Ci0KLQlpbnN0WzNdID0gWkVST19TUkNfMTsKKwlpbnN0WzNdID0gX19DT05TVCgxLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2RwNChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZURQNChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7Ci0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF9ET1QsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwotCisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9ET1RfUFJPRFVDVCwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmModnAsICZzcmNbMF0pOwogCWluc3RbMl0gPSB0X3NyYyh2cCwgJnNyY1sxXSk7Ci0JaW5zdFszXSA9IFpFUk9fU1JDXzE7CisJaW5zdFszXSA9IF9fQ09OU1QoMSwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9kcGgoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVEUEgoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewogCS8vRE9UIFJFU1VMVCAxLlggWSBaIFcgUEFSQU0gMHt9IHtYIFkgWiBPTkV9IFBBUkFNIDB7fSB7WCBZIFogV30KLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0RPVCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KLQlpbnN0WzFdID0KLQkgICAgTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAxKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDIpKSwKLQkJCSAgICBWU0ZfSU5fQ09NUE9ORU5UX09ORSwgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAotCQkJICAgIHNyY1swXS4KLQkJCSAgICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfWFlaIDogVlNGX0ZMQUdfTk9ORSkgfAorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfRE9UX1BST0RVQ1QsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFsxXSA9IFBWU19TUkNfT1BFUkFORCh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAyKSksCisJCQkJICBQVlNfU1JDX1NFTEVDVF9GT1JDRV8xLAorCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAorCQkJCSAgc3JjWzBdLgorCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX1hZWiA6IFZTRl9GTEFHX05PTkUpIHwKIAkgICAgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwogCWluc3RbMl0gPSB0X3NyYyh2cCwgJnNyY1sxXSk7Ci0JaW5zdFszXSA9IFpFUk9fU1JDXzE7CisJaW5zdFszXSA9IF9fQ09OU1QoMSwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9kc3Qoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVEU1Qoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfRFNULCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfRElTVEFOQ0VfVkVDVE9SLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7CiAJaW5zdFsyXSA9IHRfc3JjKHZwLCAmc3JjWzFdKTsKLQlpbnN0WzNdID0gWkVST19TUkNfMTsKKwlpbnN0WzNdID0gX19DT05TVCgxLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2V4MihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZUVYMihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7Ci0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF9FWDIsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwotCisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChNRV9FWFBfQkFTRTJfRlVMTF9EWCwKKwkJCQkgICAgIEdMX1RSVUUsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyY19zY2FsYXIodnAsICZzcmNbMF0pOwotCWluc3RbMl0gPSBaRVJPX1NSQ18wOwotCWluc3RbM10gPSBaRVJPX1NSQ18wOworCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJaW5zdFszXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9leHAoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVFWFAoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfRVhQLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoTUVfRVhQX0JBU0UyX0RYLAorCQkJCSAgICAgR0xfVFJVRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjX3NjYWxhcih2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9IFpFUk9fU1JDXzA7Ci0JaW5zdFszXSA9IFpFUk9fU1JDXzA7CisJaW5zdFsyXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKKwlpbnN0WzNdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX2ZscihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdLCBpbnQgKnVfdGVtcF9pKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZUZMUihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10sCisJCQkJICAgICAgaW50ICp1X3RlbXBfaSkKIHsKIAkvKiBGUkMgVE1QIDAuWCBZIFogVyBQQVJBTSAwe30ge1ggWSBaIFd9CiAJICAgQUREIFJFU1VMVCAxLlggWSBaIFcgUEFSQU0gMHt9IHtYIFkgWiBXfSBUTVAgMHtYIFkgWiBXIH0ge1ggWSBaIFd9IG5lZyBYbmVnIFluZWcgWm5lZyBXICovCiAKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0ZSQywgKnVfdGVtcF9pLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJVlNGX09VVF9DTEFTU19UTVApOwotCisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9GUkFDVElPTiwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICAqdV90ZW1wX2ksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICBQVlNfRFNUX1JFR19URU1QT1JBUlkpOwogCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9IFpFUk9fU1JDXzA7Ci0JaW5zdFszXSA9IFpFUk9fU1JDXzA7CisJaW5zdFsyXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKKwlpbnN0WzNdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOwogCWluc3QgKz0gNDsKIAotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfQURELCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfQURELAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9Ci0JICAgIE1BS0VfVlNGX1NPVVJDRSgqdV90ZW1wX2ksIFZTRl9JTl9DT01QT05FTlRfWCwKLQkJCSAgICBWU0ZfSU5fQ09NUE9ORU5UX1ksIFZTRl9JTl9DT01QT05FTlRfWiwKLQkJCSAgICBWU0ZfSU5fQ09NUE9ORU5UX1csIFZTRl9JTl9DTEFTU19UTVAsCi0JCQkgICAgLyogTm90IDEwMCUgc3VyZSBhYm91dCB0aGlzICovCi0JCQkgICAgKCFzcmNbMF0uCi0JCQkgICAgIE5lZ2F0ZUJhc2UpID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORQotCQkJICAgIC8qVlNGX0ZMQUdfQUxMICovICk7Ci0KLQlpbnN0WzNdID0gWkVST19TUkNfMDsKKwlpbnN0WzJdID0gUFZTX1NSQ19PUEVSQU5EKCp1X3RlbXBfaSwKKwkJCQkgIFBWU19TUkNfU0VMRUNUX1gsCisJCQkJICBQVlNfU1JDX1NFTEVDVF9ZLAorCQkJCSAgUFZTX1NSQ19TRUxFQ1RfWiwKKwkJCQkgIFBWU19TUkNfU0VMRUNUX1csIFBWU19TUkNfUkVHX1RFTVBPUkFSWSwKKwkJCQkgIC8qIE5vdCAxMDAlIHN1cmUgYWJvdXQgdGhpcyAqLworCQkJCSAgKCFzcmNbMF0uCisJCQkJICAgTmVnYXRlQmFzZSkgPyBWU0ZfRkxBR19BTEwgOiBWU0ZfRkxBR19OT05FCisJCQkJICAvKlZTRl9GTEFHX0FMTCAqLyApOworCWluc3RbM10gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CiAJKCp1X3RlbXBfaSktLTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9mcmMoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVGUkMoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfRlJDLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfRlJBQ1RJT04sCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzJdID0gWkVST19TUkNfMDsKLQlpbnN0WzNdID0gWkVST19TUkNfMDsKKwlpbnN0WzJdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOworCWluc3RbM10gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfbGcyKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlTEcyKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKIAkvLyBMRzIgUkVTVUxUIDEuWCBZIFogVyBQQVJBTSAwe30ge1ggWCBYIFh9CiAKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0xHMiwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KLQlpbnN0WzFdID0KLQkgICAgTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDApKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAotCQkJICAgIHRfc3JjX2NsYXNzKHNyY1swXS5GaWxlKSwKLQkJCSAgICBzcmNbMF0uCi0JCQkgICAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKE1FX0xPR19CQVNFMl9GVUxMX0RYLAorCQkJCSAgICAgR0xfVFJVRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFsxXSA9IFBWU19TUkNfT1BFUkFORCh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDApKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAorCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAorCQkJCSAgc3JjWzBdLgorCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKIAkgICAgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwotCWluc3RbMl0gPSBaRVJPX1NSQ18wOwotCWluc3RbM10gPSBaRVJPX1NSQ18wOworCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJaW5zdFszXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9saXQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVMSVQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewogCS8vTElUIFRNUCAxLlkgWiBUTVAgMXt9IHtYIFcgWiBZfSBUTVAgMXt9IHtZIFcgWiBYfSBUTVAgMXt9IHtZIFggWiBXfQogCi0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF9MSVQsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOworCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoTUVfTElHSFRfQ09FRkZfRFgsCisJCQkJICAgICBHTF9UUlVFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAkvKiBOT1RFOiBVc2VycyBzd2l6emxpbmcgbWlnaHQgbm90IHdvcmsuICovCi0JaW5zdFsxXSA9IE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCS8vIHgKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAzKSksCS8vIHcKLQkJCQkgIFZTRl9JTl9DT01QT05FTlRfWkVSTywJLy8gegotCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwJLy8geQorCWluc3RbMV0gPSBQVlNfU1JDX09QRVJBTkQodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLCB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAkvLyBYCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMykpLAkvLyBXCisJCQkJICBQVlNfU1JDX1NFTEVDVF9GT1JDRV8wLAkvLyBaCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMSkpLAkvLyBZCiAJCQkJICB0X3NyY19jbGFzcyhzcmNbMF0uRmlsZSksCiAJCQkJICBzcmNbMF0uCi0JCQkJICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfQUxMIDoKLQkJCQkgIFZTRl9GTEFHX05PTkUpIHwgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwotCWluc3RbMl0gPSBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLCB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMSkpLAkvLyB5Ci0JCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMykpLAkvLyB3Ci0JCQkJICBWU0ZfSU5fQ09NUE9ORU5UX1pFUk8sCS8vIHoKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCS8vIHgKKwkJCQkgIE5lZ2F0ZUJhc2UgPyBWU0ZfRkxBR19BTEwgOiBWU0ZfRkxBR19OT05FKSB8CisJICAgIChzcmNbMF0uUmVsQWRkciA8PCA0KTsKKwlpbnN0WzJdID0gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwJLy8gWQorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDMpKSwJLy8gVworCQkJCSAgUFZTX1NSQ19TRUxFQ1RfRk9SQ0VfMCwJLy8gWgorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDApKSwJLy8gWAogCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAogCQkJCSAgc3JjWzBdLgotCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6Ci0JCQkJICBWU0ZfRkxBR19OT05FKSB8IChzcmNbMF0uUmVsQWRkciA8PCA0KTsKLQlpbnN0WzNdID0gTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwJLy8geQotCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDApKSwJLy8geAotCQkJCSAgVlNGX0lOX0NPTVBPTkVOVF9aRVJPLAkvLyB6Ci0JCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMykpLAkvLyB3CisJCQkJICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORSkgfAorCSAgICAoc3JjWzBdLlJlbEFkZHIgPDwgNCk7CisJaW5zdFszXSA9IFBWU19TUkNfT1BFUkFORCh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAxKSksCS8vIFkKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCS8vIFgKKwkJCQkgIFBWU19TUkNfU0VMRUNUX0ZPUkNFXzAsCS8vIFoKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAzKSksCS8vIFcKIAkJCQkgIHRfc3JjX2NsYXNzKHNyY1swXS5GaWxlKSwKIAkJCQkgIHNyY1swXS4KLQkJCQkgIE5lZ2F0ZUJhc2UgPyBWU0ZfRkxBR19BTEwgOgotCQkJCSAgVlNGX0ZMQUdfTk9ORSkgfCAoc3JjWzBdLlJlbEFkZHIgPDwgNCk7CisJCQkJICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORSkgfAorCSAgICAoc3JjWzBdLlJlbEFkZHIgPDwgNCk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfbG9nKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlTE9HKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0xPRywgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKE1FX0xPR19CQVNFMl9EWCwKKwkJCQkgICAgIEdMX1RSVUUsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyY19zY2FsYXIodnAsICZzcmNbMF0pOwotCWluc3RbMl0gPSBaRVJPX1NSQ18wOwotCWluc3RbM10gPSBaRVJPX1NSQ18wOworCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJaW5zdFszXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9tYWQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVNQUQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewotCXVuc2lnbmVkIGxvbmcgaHdfb3A7Ci0KLQlod19vcCA9IChzcmNbMF0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWQotCQkgJiYgc3JjWzFdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkKLQkJICYmIHNyY1syXS5GaWxlID09Ci0JCSBQUk9HUkFNX1RFTVBPUkFSWSkgPyBSMzAwX1ZQSV9PVVRfT1BfTUFEXzIgOgotCSAgICBSMzAwX1ZQSV9PVVRfT1BfTUFEOwotCi0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKGh3X29wLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFBWU19NQUNST19PUF8yQ0xLX01BREQsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX1RSVUUsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmModnAsICZzcmNbMF0pOwogCWluc3RbMl0gPSB0X3NyYyh2cCwgJnNyY1sxXSk7CiAJaW5zdFszXSA9IHRfc3JjKHZwLCAmc3JjWzJdKTsKQEAgLTcyOCwzMjMgKzY1MSwzMDIgQEAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfbWF4KHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlTUFYKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX01BWCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX01BWElNVU0sCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKIAlpbnN0WzJdID0gdF9zcmModnAsICZzcmNbMV0pOwotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfbWluKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlTUlOKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX01JTiwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX01JTklNVU0sCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKIAlpbnN0WzJdID0gdF9zcmModnAsICZzcmNbMV0pOwotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfbW92KHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlTU9WKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKIAkvL0FERCBSRVNVTFQgMS5YIFkgWiBXIFBBUkFNIDB7fSB7WCBZIFogV30gUEFSQU0gMHt9IHtaRVJPIFpFUk8gWkVSTyBaRVJPfQogCi0jaWYgMQotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfQURELCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX0FERCwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmModnAsICZzcmNbMF0pOwotCWluc3RbMl0gPSBaRVJPX1NSQ18wOwotCWluc3RbM10gPSBaRVJPX1NSQ18wOwotI2Vsc2UKLQlod19vcCA9Ci0JICAgIChzcmNbMF0uRmlsZSA9PQotCSAgICAgUFJPR1JBTV9URU1QT1JBUlkpID8gUjMwMF9WUElfT1VUX09QX01BRF8yIDoKLQkgICAgUjMwMF9WUElfT1VUX09QX01BRDsKLQotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChod19vcCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0JaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzJdID0gT05FX1NSQ18wOwotCWluc3RbM10gPSBaRVJPX1NSQ18wOwotI2VuZGlmCisJaW5zdFsyXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKKwlpbnN0WzNdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOwogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX211bChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZU1VTChzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7Ci0JdW5zaWduZWQgbG9uZyBod19vcDsKLQotCS8vIEhXIG11bCBjYW4gdGFrZSB0aGlyZCBhcmcgYnV0IGFwcGVhcnMgdG8gaGF2ZSBzb21lIG90aGVyIGxpbWl0YXRpb25zLgotCi0JaHdfb3AgPSAoc3JjWzBdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkKLQkJICYmIHNyY1sxXS5GaWxlID09Ci0JCSBQUk9HUkFNX1RFTVBPUkFSWSkgPyBSMzAwX1ZQSV9PVVRfT1BfTUFEXzIgOgotCSAgICBSMzAwX1ZQSV9PVVRfT1BfTUFEOwotCi0JaW5zdFswXSA9Ci0JICAgIE1BS0VfVlNGX09QKGh3X29wLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX01VTFRJUExZLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwogCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7CiAJaW5zdFsyXSA9IHRfc3JjKHZwLCAmc3JjWzFdKTsKLQotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfcG93KHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlUE9XKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX1BPVywgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChNRV9QT1dFUl9GVU5DX0ZGLAorCQkJCSAgICAgR0xfVFJVRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjX3NjYWxhcih2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9IFpFUk9fU1JDXzA7CisJaW5zdFsyXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAlpbnN0WzNdID0gdF9zcmNfc2NhbGFyKHZwLCAmc3JjWzFdKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV9yY3Aoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVSQ1Aoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQogewotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfUkNQLCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQorCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoTUVfUkVDSVBfRFgsCisJCQkJICAgICBHTF9UUlVFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmNfc2NhbGFyKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzJdID0gWkVST19TUkNfMDsKLQlpbnN0WzNdID0gWkVST19TUkNfMDsKKwlpbnN0WzJdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOworCWluc3RbM10gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfcnNxKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlUlNRKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX1JTUSwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKE1FX1JFQ0lQX1NRUlRfRFgsCisJCQkJICAgICBHTF9UUlVFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmNfc2NhbGFyKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzJdID0gWkVST19TUkNfMDsKLQlpbnN0WzNdID0gWkVST19TUkNfMDsKKwlpbnN0WzJdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOworCWluc3RbM10gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfc2dlKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlU0dFKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX1NHRSwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX1NFVF9HUkVBVEVSX1RIQU5fRVFVQUwsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKIAlpbnN0WzJdID0gdF9zcmModnAsICZzcmNbMV0pOwotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfc2x0KHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlU0xUKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX1NMVCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX1NFVF9MRVNTX1RIQU4sCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKIAlpbnN0WzJdID0gdF9zcmModnAsICZzcmNbMV0pOwotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAKIAlyZXR1cm4gaW5zdDsKIH0KIAotc3RhdGljIEdMdWludCAqdF9vcGNvZGVfc3ViKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLCBHTHVpbnQgKiBpbnN0LAotCQkJICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCitzdGF0aWMgR0x1aW50ICpyMzAwVHJhbnNsYXRlT3Bjb2RlU1VCKHN0cnVjdCByMzAwX3ZlcnRleF9wcm9ncmFtICp2cCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpLAorCQkJCSAgICAgIEdMdWludCAqIGluc3QsCisJCQkJICAgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSkKIHsKLQl1bnNpZ25lZCBsb25nIGh3X29wOwotCiAJLy9BREQgUkVTVUxUIDEuWCBZIFogVyBUTVAgMHt9IHtYIFkgWiBXfSBQQVJBTSAxe1ggWSBaIFcgfSB7WCBZIFogV30gbmVnIFhuZWcgWW5lZyBabmVnIFcKIAotI2lmIDEKLQlod19vcCA9IChzcmNbMF0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWQotCQkgJiYgc3JjWzFdLkZpbGUgPT0KLQkJIFBST0dSQU1fVEVNUE9SQVJZKSA/IFIzMDBfVlBJX09VVF9PUF9NQURfMiA6Ci0JICAgIFIzMDBfVlBJX09VVF9PUF9NQUQ7Ci0KLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoaHdfb3AsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOworI2lmIDAKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX0FERCwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKKwkJCQkgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCQkgICAgIHRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKIAlpbnN0WzFdID0gdF9zcmModnAsICZzcmNbMF0pOwotCWluc3RbMl0gPSBPTkVfU1JDXzA7Ci0JaW5zdFszXSA9Ci0JICAgIE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1sxXSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDApKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMSkpLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAyKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDMpKSwKLQkJCSAgICB0X3NyY19jbGFzcyhzcmNbMV0uRmlsZSksCi0JCQkgICAgKCFzcmNbMV0uCi0JCQkgICAgIE5lZ2F0ZUJhc2UpID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORSkgfAotCSAgICAoc3JjWzFdLlJlbEFkZHIgPDwgNCk7Ci0jZWxzZQotCWluc3RbMF0gPQotCSAgICBNQUtFX1ZTRl9PUChSMzAwX1ZQSV9PVVRfT1BfQURELCB0X2RzdF9pbmRleCh2cCwgJnZwaS0+RHN0UmVnKSwKLQkJCXRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKLQkJCXRfZHN0X2NsYXNzKHZwaS0+RHN0UmVnLkZpbGUpKTsKLQotCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9Ci0JICAgIE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1sxXSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDApKSwKLQkJCSAgICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMSkpLAotCQkJICAgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAyKSksCi0JCQkgICAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDMpKSwKLQkJCSAgICB0X3NyY19jbGFzcyhzcmNbMV0uRmlsZSksCi0JCQkgICAgKCFzcmNbMV0uCi0JCQkgICAgIE5lZ2F0ZUJhc2UpID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORSkgfAorCWluc3RbMl0gPSBQVlNfU1JDX09QRVJBTkQodF9zcmNfaW5kZXgodnAsICZzcmNbMV0pLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDApKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAxKSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMikpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDMpKSwKKwkJCQkgIHRfc3JjX2NsYXNzKHNyY1sxXS5GaWxlKSwKKwkJCQkgICghc3JjWzFdLgorCQkJCSAgIE5lZ2F0ZUJhc2UpID8gVlNGX0ZMQUdfQUxMIDogVlNGX0ZMQUdfTk9ORSkgfAogCSAgICAoc3JjWzFdLlJlbEFkZHIgPDwgNCk7CiAJaW5zdFszXSA9IDA7CisjZWxzZQorCWluc3RbMF0gPQorCSAgICBQVlNfT1BfRFNUX09QRVJBTkQoVkVfTVVMVElQTFlfQURELAorCQkJICAgICAgIEdMX0ZBTFNFLAorCQkJICAgICAgIEdMX0ZBTFNFLAorCQkJICAgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJICAgICAgIHRfZHN0X21hc2sodnBpLT5Ec3RSZWcuV3JpdGVNYXNrKSwKKwkJCSAgICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKKwlpbnN0WzJdID0gX19DT05TVCgwLCBTV0laWkxFX09ORSk7CisJaW5zdFszXSA9IFBWU19TUkNfT1BFUkFORCh0X3NyY19pbmRleCh2cCwgJnNyY1sxXSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMCkpLAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDEpKSwKKwkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAyKSksCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMykpLAorCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzFdLkZpbGUpLAorCQkJCSAgKCFzcmNbMV0uCisJCQkJICAgTmVnYXRlQmFzZSkgPyBWU0ZfRkxBR19BTEwgOiBWU0ZfRkxBR19OT05FKSB8CisJICAgIChzcmNbMV0uUmVsQWRkciA8PCA0KTsKICNlbmRpZgogCiAJcmV0dXJuIGluc3Q7CiB9CiAKLXN0YXRpYyBHTHVpbnQgKnRfb3Bjb2RlX3N3eihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCi0JCQkgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwgR0x1aW50ICogaW5zdCwKLQkJCSAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdKQorc3RhdGljIEdMdWludCAqcjMwMFRyYW5zbGF0ZU9wY29kZVNXWihzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnAsCisJCQkJICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaSwKKwkJCQkgICAgICBHTHVpbnQgKiBpbnN0LAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmNbM10pCiB7CiAJLy9BREQgUkVTVUxUIDEuWCBZIFogVyBQQVJBTSAwe30ge1ggWSBaIFd9IFBBUkFNIDB7fSB7WkVSTyBaRVJPIFpFUk8gWkVST30KIAotI2lmIDEKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0FERCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CisJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9BREQsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICB0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7CiAJaW5zdFsxXSA9IHRfc3JjKHZwLCAmc3JjWzBdKTsKLQlpbnN0WzJdID0gWkVST19TUkNfMDsKLQlpbnN0WzNdID0gWkVST19TUkNfMDsKLSNlbHNlCi0JaHdfb3AgPQotCSAgICAoc3JjWzBdLkZpbGUgPT0KLQkgICAgIFBST0dSQU1fVEVNUE9SQVJZKSA/IFIzMDBfVlBJX09VVF9PUF9NQURfMiA6Ci0JICAgIFIzMDBfVlBJX09VVF9PUF9NQUQ7Ci0KLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoaHdfb3AsIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOwotCWluc3RbMV0gPSB0X3NyYyh2cCwgJnNyY1swXSk7Ci0JaW5zdFsyXSA9IE9ORV9TUkNfMDsKLQlpbnN0WzNdID0gWkVST19TUkNfMDsKLSNlbmRpZgorCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJaW5zdFszXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAogCXJldHVybiBpbnN0OwogfQogCi1zdGF0aWMgR0x1aW50ICp0X29wY29kZV94cGQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksIEdMdWludCAqIGluc3QsCi0JCQkgICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY1szXSwgaW50ICp1X3RlbXBfaSkKK3N0YXRpYyBHTHVpbnQgKnIzMDBUcmFuc2xhdGVPcGNvZGVYUEQoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAorCQkJCSAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGksCisJCQkJICAgICAgR0x1aW50ICogaW5zdCwKKwkJCQkgICAgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjWzNdLAorCQkJCSAgICAgIGludCAqdV90ZW1wX2kpCiB7CiAJLyogbXVsIHIwLCByMS55enh3LCByMi56eHl3CiAJICAgbWFkIHIwLCAtcjIueXp4dywgcjEuenh5dywgcjAKLQkgICBOT1RFOiBtaWdodCBuZWVkIE1BRF8yCiAJICovCiAKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX01BRCwgKnVfdGVtcF9pLAotCQkJdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAotCQkJVlNGX09VVF9DTEFTU19UTVApOwotCi0JaW5zdFsxXSA9IE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1swXSksIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAxKSksCS8vIHkKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAyKSksCS8vIHoKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAwKSksCS8vIHgKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1swXS5Td2l6emxlLCAzKSksCS8vIHcKKwlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX01VTFRJUExZX0FERCwKKwkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICAqdV90ZW1wX2ksCisJCQkJICAgICB0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCisJCQkJICAgICBQVlNfRFNUX1JFR19URU1QT1JBUlkpOworCWluc3RbMV0gPSBQVlNfU1JDX09QRVJBTkQodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLCB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMSkpLAkvLyBZCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMikpLAkvLyBaCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAkvLyBYCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMykpLAkvLyBXCiAJCQkJICB0X3NyY19jbGFzcyhzcmNbMF0uRmlsZSksCiAJCQkJICBzcmNbMF0uCi0JCQkJICBOZWdhdGVCYXNlID8gVlNGX0ZMQUdfQUxMIDoKLQkJCQkgIFZTRl9GTEFHX05PTkUpIHwgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwotCi0JaW5zdFsyXSA9IE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleCh2cCwgJnNyY1sxXSksIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAyKSksCS8vIHoKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAwKSksCS8vIHgKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAxKSksCS8vIHkKLQkJCQkgIHRfc3dpenpsZShHRVRfU1daKHNyY1sxXS5Td2l6emxlLCAzKSksCS8vIHcKKwkJCQkgIE5lZ2F0ZUJhc2UgPyBWU0ZfRkxBR19BTEwgOiBWU0ZfRkxBR19OT05FKSB8CisJICAgIChzcmNbMF0uUmVsQWRkciA8PCA0KTsKKwlpbnN0WzJdID0gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzFdKSwgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDIpKSwJLy8gWgorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDApKSwJLy8gWAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDEpKSwJLy8gWQorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDMpKSwJLy8gVwogCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzFdLkZpbGUpLAogCQkJCSAgc3JjWzFdLgotCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6Ci0JCQkJICBWU0ZfRkxBR19OT05FKSB8IChzcmNbMV0uUmVsQWRkciA8PCA0KTsKLQotCWluc3RbM10gPSBaRVJPX1NSQ18xOworCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKKwkgICAgKHNyY1sxXS5SZWxBZGRyIDw8IDQpOworCWluc3RbM10gPSBfX0NPTlNUKDEsIFNXSVpaTEVfWkVSTyk7CiAJaW5zdCArPSA0OwotCSgqdV90ZW1wX2kpLS07CiAKLQlpbnN0WzBdID0KLQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX01BRCwgdF9kc3RfaW5kZXgodnAsICZ2cGktPkRzdFJlZyksCi0JCQl0X2RzdF9tYXNrKHZwaS0+RHN0UmVnLldyaXRlTWFzayksCi0JCQl0X2RzdF9jbGFzcyh2cGktPkRzdFJlZy5GaWxlKSk7Ci0KLQlpbnN0WzFdID0gTUFLRV9WU0ZfU09VUkNFKHRfc3JjX2luZGV4KHZwLCAmc3JjWzFdKSwgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDEpKSwJLy8geQotCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDIpKSwJLy8gegotCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDApKSwJLy8geAotCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzFdLlN3aXp6bGUsIDMpKSwJLy8gdworCWluc3RbMF0gPSBQVlNfT1BfRFNUX09QRVJBTkQoVkVfTVVMVElQTFlfQURELAorCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkgICAgIHRfZHN0X2luZGV4KHZwLCAmdnBpLT5Ec3RSZWcpLAorCQkJCSAgICAgdF9kc3RfbWFzayh2cGktPkRzdFJlZy5Xcml0ZU1hc2spLAorCQkJCSAgICAgdF9kc3RfY2xhc3ModnBpLT5Ec3RSZWcuRmlsZSkpOworCWluc3RbMV0gPSBQVlNfU1JDX09QRVJBTkQodF9zcmNfaW5kZXgodnAsICZzcmNbMV0pLCB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMSkpLAkvLyBZCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMikpLAkvLyBaCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMCkpLAkvLyBYCisJCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMV0uU3dpenpsZSwgMykpLAkvLyBXCiAJCQkJICB0X3NyY19jbGFzcyhzcmNbMV0uRmlsZSksCiAJCQkJICAoIXNyY1sxXS4KLQkJCQkgICBOZWdhdGVCYXNlKSA/IFZTRl9GTEFHX0FMTCA6Ci0JCQkJICBWU0ZfRkxBR19OT05FKSB8IChzcmNbMV0uUmVsQWRkciA8PCA0KTsKLQotCWluc3RbMl0gPSBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLCB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMikpLAkvLyB6Ci0JCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMCkpLAkvLyB4Ci0JCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMSkpLAkvLyB5Ci0JCQkJICB0X3N3aXp6bGUoR0VUX1NXWihzcmNbMF0uU3dpenpsZSwgMykpLAkvLyB3CisJCQkJICAgTmVnYXRlQmFzZSkgPyBWU0ZfRkxBR19BTEwgOiBWU0ZfRkxBR19OT05FKSB8CisJICAgIChzcmNbMV0uUmVsQWRkciA8PCA0KTsKKwlpbnN0WzJdID0gUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzBdKSwgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDIpKSwJLy8gWgorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDApKSwJLy8gWAorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDEpKSwJLy8gWQorCQkJCSAgdF9zd2l6emxlKEdFVF9TV1ooc3JjWzBdLlN3aXp6bGUsIDMpKSwJLy8gVwogCQkJCSAgdF9zcmNfY2xhc3Moc3JjWzBdLkZpbGUpLAogCQkJCSAgc3JjWzBdLgotCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6Ci0JCQkJICBWU0ZfRkxBR19OT05FKSB8IChzcmNbMF0uUmVsQWRkciA8PCA0KTsKLQorCQkJCSAgTmVnYXRlQmFzZSA/IFZTRl9GTEFHX0FMTCA6IFZTRl9GTEFHX05PTkUpIHwKKwkgICAgKHNyY1swXS5SZWxBZGRyIDw8IDQpOwogCWluc3RbM10gPQotCSAgICBNQUtFX1ZTRl9TT1VSQ0UoKnVfdGVtcF9pICsgMSwgVlNGX0lOX0NPTVBPTkVOVF9YLAotCQkJICAgIFZTRl9JTl9DT01QT05FTlRfWSwgVlNGX0lOX0NPTVBPTkVOVF9aLAotCQkJICAgIFZTRl9JTl9DT01QT05FTlRfVywgVlNGX0lOX0NMQVNTX1RNUCwKLQkJCSAgICBWU0ZfRkxBR19OT05FKTsKKwkgICAgUFZTX1NSQ19PUEVSQU5EKCp1X3RlbXBfaSwgUFZTX1NSQ19TRUxFQ1RfWCwgUFZTX1NSQ19TRUxFQ1RfWSwKKwkJCSAgICBQVlNfU1JDX1NFTEVDVF9aLCBQVlNfU1JDX1NFTEVDVF9XLAorCQkJICAgIFBWU19TUkNfUkVHX1RFTVBPUkFSWSwgVlNGX0ZMQUdfTk9ORSk7CisKKwkoKnVfdGVtcF9pKS0tOwogCiAJcmV0dXJuIGluc3Q7CiB9CkBAIC0xMTQ1LDIzICsxMDQ3LDI0IEBACiAJCWlmIChudW1fb3BlcmFuZHMgPT0gMykgewkvKiBUT0RPOiBzY2FsYXJzICovCiAJCQlpZiAoQ01QX1NSQ1Moc3JjWzFdLCBzcmNbMl0pCiAJCQkgICAgfHwgQ01QX1NSQ1Moc3JjWzBdLCBzcmNbMl0pKSB7Ci0JCQkJaW5zdFswXSA9Ci0JCQkJICAgIE1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF9BREQsCi0JCQkJCQl1X3RlbXBfaSwgVlNGX0ZMQUdfQUxMLAotCQkJCQkJVlNGX09VVF9DTEFTU19UTVApOwotCisJCQkJaW5zdFswXSA9IFBWU19PUF9EU1RfT1BFUkFORChWRV9BREQsCisJCQkJCQkJICAgICBHTF9GQUxTRSwKKwkJCQkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCQkJCSAgICAgdV90ZW1wX2ksCisJCQkJCQkJICAgICBWU0ZfRkxBR19BTEwsCisJCQkJCQkJICAgICBQVlNfRFNUX1JFR19URU1QT1JBUlkpOwogCQkJCWluc3RbMV0gPQotCQkJCSAgICBNQUtFX1ZTRl9TT1VSQ0UodF9zcmNfaW5kZXgKLQkJCQkJCSAgICAodnAsICZzcmNbMl0pLAotCQkJCQkJICAgIFNXSVpaTEVfWCwgU1dJWlpMRV9ZLAotCQkJCQkJICAgIFNXSVpaTEVfWiwgU1dJWlpMRV9XLAotCQkJCQkJICAgIHRfc3JjX2NsYXNzKHNyY1syXS4KLQkJCQkJCQkJRmlsZSksCi0JCQkJCQkgICAgVlNGX0ZMQUdfTk9ORSkgfAotCQkJCSAgICAoc3JjWzJdLlJlbEFkZHIgPDwgNCk7Ci0KLQkJCQlpbnN0WzJdID0gWkVST19TUkNfMjsKLQkJCQlpbnN0WzNdID0gWkVST19TUkNfMjsKKwkJCQkgICAgUFZTX1NSQ19PUEVSQU5EKHRfc3JjX2luZGV4KHZwLCAmc3JjWzJdKSwKKwkJCQkJCSAgICBTV0laWkxFX1gsCisJCQkJCQkgICAgU1dJWlpMRV9ZLAorCQkJCQkJICAgIFNXSVpaTEVfWiwKKwkJCQkJCSAgICBTV0laWkxFX1csCisJCQkJCQkgICAgdF9zcmNfY2xhc3Moc3JjWzJdLkZpbGUpLAorCQkJCQkJICAgIFZTRl9GTEFHX05PTkUpIHwgKHNyY1syXS4KKwkJCQkJCQkJICAgICAgUmVsQWRkciA8PAorCQkJCQkJCQkgICAgICA0KTsKKwkJCQlpbnN0WzJdID0gX19DT05TVCgyLCBTV0laWkxFX1pFUk8pOworCQkJCWluc3RbM10gPSBfX0NPTlNUKDIsIFNXSVpaTEVfWkVSTyk7CiAJCQkJaW5zdCArPSA0OwogCiAJCQkJc3JjWzJdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKQEAgLTExNzMsMjMgKzEwNzYsMjQgQEAKIAogCQlpZiAobnVtX29wZXJhbmRzID49IDIpIHsKIAkJCWlmIChDTVBfU1JDUyhzcmNbMV0sIHNyY1swXSkpIHsKLQkJCQlpbnN0WzBdID0KLQkJCQkgICAgTUFLRV9WU0ZfT1AoUjMwMF9WUElfT1VUX09QX0FERCwKLQkJCQkJCXVfdGVtcF9pLCBWU0ZfRkxBR19BTEwsCi0JCQkJCQlWU0ZfT1VUX0NMQVNTX1RNUCk7Ci0KKwkJCQlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX0FERCwKKwkJCQkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJCQkJICAgICB1X3RlbXBfaSwKKwkJCQkJCQkgICAgIFZTRl9GTEFHX0FMTCwKKwkJCQkJCQkgICAgIFBWU19EU1RfUkVHX1RFTVBPUkFSWSk7CiAJCQkJaW5zdFsxXSA9Ci0JCQkJICAgIE1BS0VfVlNGX1NPVVJDRSh0X3NyY19pbmRleAotCQkJCQkJICAgICh2cCwgJnNyY1swXSksCi0JCQkJCQkgICAgU1dJWlpMRV9YLCBTV0laWkxFX1ksCi0JCQkJCQkgICAgU1dJWlpMRV9aLCBTV0laWkxFX1csCi0JCQkJCQkgICAgdF9zcmNfY2xhc3Moc3JjWzBdLgotCQkJCQkJCQlGaWxlKSwKLQkJCQkJCSAgICBWU0ZfRkxBR19OT05FKSB8Ci0JCQkJICAgIChzcmNbMF0uUmVsQWRkciA8PCA0KTsKLQotCQkJCWluc3RbMl0gPSBaRVJPX1NSQ18wOwotCQkJCWluc3RbM10gPSBaRVJPX1NSQ18wOworCQkJCSAgICBQVlNfU1JDX09QRVJBTkQodF9zcmNfaW5kZXgodnAsICZzcmNbMF0pLAorCQkJCQkJICAgIFNXSVpaTEVfWCwKKwkJCQkJCSAgICBTV0laWkxFX1ksCisJCQkJCQkgICAgU1dJWlpMRV9aLAorCQkJCQkJICAgIFNXSVpaTEVfVywKKwkJCQkJCSAgICB0X3NyY19jbGFzcyhzcmNbMF0uRmlsZSksCisJCQkJCQkgICAgVlNGX0ZMQUdfTk9ORSkgfCAoc3JjWzBdLgorCQkJCQkJCQkgICAgICBSZWxBZGRyIDw8CisJCQkJCQkJCSAgICAgIDQpOworCQkJCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJCQkJaW5zdFszXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKIAkJCQlpbnN0ICs9IDQ7CiAKIAkJCQlzcmNbMF0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOwpAQCAtMTIwMSw4OSArMTEwNSw4NyBAQAogCiAJCXN3aXRjaCAodnBpLT5PcGNvZGUpIHsKIAkJY2FzZSBPUENPREVfQUJTOgotCQkJaW5zdCA9IHRfb3Bjb2RlX2Ficyh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVBQlModnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9BREQ6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfYWRkKHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZUFERCh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX0FSTDoKLQkJCWluc3QgPSB0X29wY29kZV9hcmwodnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlQVJMKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfRFAzOgotCQkJaW5zdCA9IHRfb3Bjb2RlX2RwMyh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVEUDModnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9EUDQ6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfZHA0KHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZURQNCh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX0RQSDoKLQkJCWluc3QgPSB0X29wY29kZV9kcGgodnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlRFBIKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfRFNUOgotCQkJaW5zdCA9IHRfb3Bjb2RlX2RzdCh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVEU1QodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9FWDI6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfZXgyKHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZUVYMih2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX0VYUDoKLQkJCWluc3QgPSB0X29wY29kZV9leHAodnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlRVhQKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfRkxSOgotCQkJaW5zdCA9Ci0JCQkgICAgdF9vcGNvZGVfZmxyKHZwLCB2cGksIGluc3QsIHNyYywgLyogRklYTUUgKi8KLQkJCQkJICZ1X3RlbXBfaSk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZUZMUih2cCwgdnBpLCBpbnN0LCBzcmMsCS8qIEZJWE1FICovCisJCQkJCQkgICAgICAmdV90ZW1wX2kpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX0ZSQzoKLQkJCWluc3QgPSB0X29wY29kZV9mcmModnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlRlJDKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfTEcyOgotCQkJaW5zdCA9IHRfb3Bjb2RlX2xnMih2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVMRzIodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9MSVQ6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfbGl0KHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZUxJVCh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX0xPRzoKLQkJCWluc3QgPSB0X29wY29kZV9sb2codnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlTE9HKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfTUFEOgotCQkJaW5zdCA9IHRfb3Bjb2RlX21hZCh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVNQUQodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9NQVg6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfbWF4KHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZU1BWCh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX01JTjoKLQkJCWluc3QgPSB0X29wY29kZV9taW4odnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlTUlOKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfTU9WOgotCQkJaW5zdCA9IHRfb3Bjb2RlX21vdih2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVNT1YodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9NVUw6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfbXVsKHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZU1VTCh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX1BPVzoKLQkJCWluc3QgPSB0X29wY29kZV9wb3codnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlUE9XKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfUkNQOgotCQkJaW5zdCA9IHRfb3Bjb2RlX3JjcCh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVSQ1AodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9SU1E6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfcnNxKHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZVJTUSh2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX1NHRToKLQkJCWluc3QgPSB0X29wY29kZV9zZ2UodnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlU0dFKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfU0xUOgotCQkJaW5zdCA9IHRfb3Bjb2RlX3NsdCh2cCwgdnBpLCBpbnN0LCBzcmMpOworCQkJaW5zdCA9IHIzMDBUcmFuc2xhdGVPcGNvZGVTTFQodnAsIHZwaSwgaW5zdCwgc3JjKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QQ09ERV9TVUI6Ci0JCQlpbnN0ID0gdF9vcGNvZGVfc3ViKHZwLCB2cGksIGluc3QsIHNyYyk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZVNVQih2cCwgdnBpLCBpbnN0LCBzcmMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BDT0RFX1NXWjoKLQkJCWluc3QgPSB0X29wY29kZV9zd3oodnAsIHZwaSwgaW5zdCwgc3JjKTsKKwkJCWluc3QgPSByMzAwVHJhbnNsYXRlT3Bjb2RlU1daKHZwLCB2cGksIGluc3QsIHNyYyk7CiAJCQlicmVhazsKIAkJY2FzZSBPUENPREVfWFBEOgotCQkJaW5zdCA9Ci0JCQkgICAgdF9vcGNvZGVfeHBkKHZwLCB2cGksIGluc3QsIHNyYywgLyogRklYTUUgKi8KLQkJCQkJICZ1X3RlbXBfaSk7CisJCQlpbnN0ID0gcjMwMFRyYW5zbGF0ZU9wY29kZVhQRCh2cCwgdnBpLCBpbnN0LCBzcmMsCS8qIEZJWE1FICovCisJCQkJCQkgICAgICAmdV90ZW1wX2kpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlhc3NlcnQoMCk7CkBAIC0xMjkxLDYgKzExOTMsMjMgQEAKIAkJfQogCX0KIAorCS8qIFNvbWUgb3V0cHV0cyBtYXkgYmUgYXJ0aWZpY2lhbGx5IGFkZGVkLCB0byBtYXRjaCB0aGUgaW5wdXRzCisJICAgb2YgdGhlIGZyYWdtZW50IHByb2dyYW0uIEJsYW5rIHRoZSBvdXRwdXRzIGhlcmUuICovCisJZm9yIChpID0gMDsgaSA8IFZFUlRfUkVTVUxUX01BWDsgaSsrKSB7CisJCWlmICh2cC0+a2V5Lk91dHB1dHNBZGRlZCAmICgxIDw8IGkpKSB7CisJCQlpbnN0WzBdID0gUFZTX09QX0RTVF9PUEVSQU5EKFZFX0FERCwKKwkJCQkJCSAgICAgR0xfRkFMU0UsCisJCQkJCQkgICAgIEdMX0ZBTFNFLAorCQkJCQkJICAgICB2cC0+b3V0cHV0c1tpXSwKKwkJCQkJCSAgICAgVlNGX0ZMQUdfQUxMLAorCQkJCQkJICAgICBQVlNfRFNUX1JFR19PVVQpOworCQkJaW5zdFsxXSA9IF9fQ09OU1QoMCwgU1dJWlpMRV9aRVJPKTsKKwkJCWluc3RbMl0gPSBfX0NPTlNUKDAsIFNXSVpaTEVfWkVSTyk7CisJCQlpbnN0WzNdID0gX19DT05TVCgwLCBTV0laWkxFX1pFUk8pOworCQkJaW5zdCArPSA0OworCQl9CisJfQorCiAJdnAtPnByb2dyYW0ubGVuZ3RoID0gKGluc3QgLSB2cC0+cHJvZ3JhbS5ib2R5LmkpOwogCWlmICh2cC0+cHJvZ3JhbS5sZW5ndGggPj0gVlNGX01BWF9GUkFHTUVOVF9MRU5HVEgpIHsKIAkJdnAtPnByb2dyYW0ubGVuZ3RoID0gMDsKQEAgLTEzMDMsMTQgKzEyMjIsMTYgQEAKICNlbmRpZgogfQogCisvKiBEUDQgdmVyc2lvbiBzZWVtcyB0byB0cmlnZ2VyIHNvbWUgaHcgcGVjdWxpYXJpdHkgKi8KKy8vI2RlZmluZSBQUkVGRVJfRFA0CisKIHN0YXRpYyB2b2lkIHBvc2l0aW9uX2ludmFyaWFudChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKIHsKIAlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpOwogCXN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3Q7CiAJaW50IGk7CiAKLQlnbF9zdGF0ZV9pbmRleCB0b2tlbnNbU1RBVEVfTEVOR1RIXSA9Ci0JICAgIHsgU1RBVEVfTVZQX01BVFJJWCwgMCwgMCwgMCwgMCB9OworCWdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdID0geyBTVEFURV9NVlBfTUFUUklYLCAwLCAwLCAwLCAwIH07CiAKIAkvKiB0b2tlbnNbNF0gPSBtYXRyaXggbW9kaWZpZXIgKi8KICNpZmRlZiBQUkVGRVJfRFA0CkBAIC0xMzkwLDggKzEzMTEsOCBAQAogCWFzc2VydCh2cGktPk9wY29kZSA9PSBPUENPREVfRU5EKTsKIH0KIAotc3RhdGljIHZvaWQgaW5zZXJ0X3dwb3Moc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLAotCQkJc3RydWN0IGdsX3Byb2dyYW0gKnByb2csIEdMdWludCB0ZW1wX2luZGV4KQorc3RhdGljIHZvaWQgaW5zZXJ0X3dwb3Moc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW0gKnZwLCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKwkJCUdMdWludCB0ZW1wX2luZGV4KQogewogCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICp2cGk7CiAJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKnZwaV9pbnNlcnQ7CkBAIC0xNDA0LDggKzEzMjUsOCBAQAogCQkJCXByb2ctPk51bUluc3RydWN0aW9ucyAtIDEpOwogCS8qIEVORCAqLwogCV9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKCZ2cGlbcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zICsgMV0sCi0JCQkJJnByb2ctPkluc3RydWN0aW9uc1twcm9nLT5OdW1JbnN0cnVjdGlvbnMgLQotCQkJCQkJICAgIDFdLCAxKTsKKwkJCQkmcHJvZy0+SW5zdHJ1Y3Rpb25zW3Byb2ctPk51bUluc3RydWN0aW9ucyAtIDFdLAorCQkJCTEpOwogCXZwaV9pbnNlcnQgPSAmdnBpW3Byb2ctPk51bUluc3RydWN0aW9ucyAtIDFdOwogCiAJdnBpX2luc2VydFtpXS5PcGNvZGUgPSBPUENPREVfTU9WOwpAQCAtMTQ4NSw2ICsxNDA2LDE1IEBACiAJcmV0dXJuIHZwOwogfQogCitzdGF0aWMgdm9pZCBhZGRfb3V0cHV0cyhzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbV9rZXkgKmtleSwgR0xpbnQgdmVydCkKK3sKKwlpZiAoa2V5LT5PdXRwdXRzV3JpdHRlbiAmICgxIDw8IHZlcnQpKQorCQlyZXR1cm47CisKKwlrZXktPk91dHB1dHNXcml0dGVuIHw9IDEgPDwgdmVydDsKKwlrZXktPk91dHB1dHNBZGRlZCB8PSAxIDw8IHZlcnQ7Cit9CisKIHZvaWQgcjMwMFNlbGVjdFZlcnRleFNoYWRlcihyMzAwQ29udGV4dFB0ciByMzAwKQogewogCUdMY29udGV4dCAqY3R4ID0gY3R4ID0gcjMwMC0+cmFkZW9uLmdsQ3R4OwpAQCAtMTQ5NSw4ICsxNDI1LDkgQEAKIAlzdHJ1Y3QgcjMwMF92ZXJ0ZXhfcHJvZ3JhbSAqdnA7CiAJR0xpbnQgd3Bvc19pZHg7CiAKLQl2cGMgPQotCSAgICAoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW1fY29udCAqKWN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudDsKKwl2cGMgPSAoc3RydWN0IHIzMDBfdmVydGV4X3Byb2dyYW1fY29udCAqKWN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudDsKKwl3YW50ZWRfa2V5LklucHV0c1JlYWQgPSB2cGMtPm1lc2FfcHJvZ3JhbS5CYXNlLklucHV0c1JlYWQ7CisJd2FudGVkX2tleS5PdXRwdXRzV3JpdHRlbiA9IHZwYy0+bWVzYV9wcm9ncmFtLkJhc2UuT3V0cHV0c1dyaXR0ZW47CiAJSW5wdXRzUmVhZCA9IGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LT5CYXNlLklucHV0c1JlYWQ7CiAKIAl3cG9zX2lkeCA9IC0xOwpAQCAtMTUxMCwzMyArMTQ0MSwyOSBAQAogCQkJX21lc2FfZXhpdCgtMSk7CiAJCX0KIAotCQlJbnB1dHNSZWFkIHw9IChGUkFHX0JJVF9URVgwIDw8IGkpOworCQl3YW50ZWRfa2V5Lk91dHB1dHNXcml0dGVuIHw9IDEgPDwgKFZFUlRfUkVTVUxUX1RFWDAgKyBpKTsKIAkJd3Bvc19pZHggPSBpOwogCX0KLQl3YW50ZWRfa2V5LklucHV0c1JlYWQgPSB2cGMtPm1lc2FfcHJvZ3JhbS5CYXNlLklucHV0c1JlYWQ7Ci0Jd2FudGVkX2tleS5PdXRwdXRzV3JpdHRlbiA9IHZwYy0+bWVzYV9wcm9ncmFtLkJhc2UuT3V0cHV0c1dyaXR0ZW47CiAKLQl3YW50ZWRfa2V5Lk91dHB1dHNXcml0dGVuIHw9IDEgPDwgVkVSVF9SRVNVTFRfSFBPUzsKKwlhZGRfb3V0cHV0cygmd2FudGVkX2tleSwgVkVSVF9SRVNVTFRfSFBPUyk7CiAKIAlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDApIHsKLQkJd2FudGVkX2tleS5PdXRwdXRzV3JpdHRlbiB8PSAxIDw8IFZFUlRfUkVTVUxUX0NPTDA7CisJCWFkZF9vdXRwdXRzKCZ3YW50ZWRfa2V5LCBWRVJUX1JFU1VMVF9DT0wwKTsKIAl9CiAKLQlpZiAoKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wxKSkgewotCQl3YW50ZWRfa2V5Lk91dHB1dHNXcml0dGVuIHw9IDEgPDwgVkVSVF9SRVNVTFRfQ09MMTsKKwlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDEpIHsKKwkJYWRkX291dHB1dHMoJndhbnRlZF9rZXksIFZFUlRfUkVTVUxUX0NPTDEpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0czsgaSsrKSB7CiAJCWlmIChJbnB1dHNSZWFkICYgKEZSQUdfQklUX1RFWDAgPDwgaSkpIHsKLQkJCXdhbnRlZF9rZXkuT3V0cHV0c1dyaXR0ZW4gfD0KLQkJCSAgICAxIDw8IChWRVJUX1JFU1VMVF9URVgwICsgaSk7CisJCQlhZGRfb3V0cHV0cygmd2FudGVkX2tleSwgVkVSVF9SRVNVTFRfVEVYMCArIGkpOwogCQl9CiAJfQogCiAJaWYgKHZwYy0+bWVzYV9wcm9ncmFtLklzUG9zaXRpb25JbnZhcmlhbnQpIHsKIAkJLyogd2Ugd2FuJ3QgcG9zaXRpb24gZG9uJ3Qgd2UgPyAqLwogCQl3YW50ZWRfa2V5LklucHV0c1JlYWQgfD0gKDEgPDwgVkVSVF9BVFRSSUJfUE9TKTsKLQkJd2FudGVkX2tleS5PdXRwdXRzV3JpdHRlbiB8PSAoMSA8PCBWRVJUX1JFU1VMVF9IUE9TKTsKIAl9CiAKIAlmb3IgKHZwID0gdnBjLT5wcm9nczsgdnA7IHZwID0gdnAtPm5leHQpCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3IzMDBfdmVydHByb2cuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF92ZXJ0cHJvZy5oCmluZGV4IDNkZjBlZWUuLjJmMzVmMDIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF92ZXJ0cHJvZy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcjMwMF92ZXJ0cHJvZy5oCkBAIC0zLDYgKzMsMjUgQEAKIAogI2luY2x1ZGUgInIzMDBfcmVnLmgiCiAKKyNkZWZpbmUgUFZTX09QX0RTVF9PUEVSQU5EKG9wY29kZSwgbWF0aF9pbnN0LCBtYWNyb19pbnN0LCByZWdfaW5kZXgsIHJlZ193cml0ZW1hc2ssIHJlZ19jbGFzcykJXAorCSAoKChvcGNvZGUgJiBQVlNfRFNUX09QQ09ERV9NQVNLKSA8PCBQVlNfRFNUX09QQ09ERV9TSElGVCkJXAorCSB8ICgobWF0aF9pbnN0ICYgUFZTX0RTVF9NQVRIX0lOU1RfTUFTSykgPDwgUFZTX0RTVF9NQVRIX0lOU1RfU0hJRlQpCVwKKwkgfCAoKG1hY3JvX2luc3QgJiBQVlNfRFNUX01BQ1JPX0lOU1RfTUFTSykgPDwgUFZTX0RTVF9NQUNST19JTlNUX1NISUZUKQlcCisJIHwgKChyZWdfaW5kZXggJiBQVlNfRFNUX09GRlNFVF9NQVNLKSA8PCBQVlNfRFNUX09GRlNFVF9TSElGVCkJXAorCSB8ICgocmVnX3dyaXRlbWFzayAmIDB4ZikgPDwgUFZTX0RTVF9XRV9YX1NISUZUKQkvKiBYIFkgWiBXICovCVwKKwkgfCAoKHJlZ19jbGFzcyAmIFBWU19EU1RfUkVHX1RZUEVfTUFTSykgPDwgUFZTX0RTVF9SRUdfVFlQRV9TSElGVCkpCisKKyNkZWZpbmUgUFZTX1NSQ19PUEVSQU5EKGluX3JlZ19pbmRleCwgY29tcF94LCBjb21wX3ksIGNvbXBfeiwgY29tcF93LCByZWdfY2xhc3MsIG5lZ2F0ZSkJXAorCSgoKGluX3JlZ19pbmRleCAmIFBWU19TUkNfT0ZGU0VUX01BU0spIDw8IFBWU19TUkNfT0ZGU0VUX1NISUZUKQkJCQlcCisJIHwgKChjb21wX3ggJiBQVlNfU1JDX1NXSVpaTEVfWF9NQVNLKSA8PCBQVlNfU1JDX1NXSVpaTEVfWF9TSElGVCkJCQlcCisJIHwgKChjb21wX3kgJiBQVlNfU1JDX1NXSVpaTEVfWV9NQVNLKSA8PCBQVlNfU1JDX1NXSVpaTEVfWV9TSElGVCkJCQlcCisJIHwgKChjb21wX3ogJiBQVlNfU1JDX1NXSVpaTEVfWl9NQVNLKSA8PCBQVlNfU1JDX1NXSVpaTEVfWl9TSElGVCkJCQlcCisJIHwgKChjb21wX3cgJiBQVlNfU1JDX1NXSVpaTEVfV19NQVNLKSA8PCBQVlNfU1JDX1NXSVpaTEVfV19TSElGVCkJCQlcCisJIHwgKChuZWdhdGUgJiAweGYpIDw8IFBWU19TUkNfTU9ESUZJRVJfWF9TSElGVCkJLyogWCBZIFogVyAqLwkJCQlcCisJIHwgKChyZWdfY2xhc3MgJiBQVlNfU1JDX1JFR19UWVBFX01BU0spIDw8IFBWU19TUkNfUkVHX1RZUEVfU0hJRlQpKQorCisjaWYgMQorCiAjZGVmaW5lIFZTRl9GTEFHX1gJMQogI2RlZmluZSBWU0ZfRkxBR19ZCTIKICNkZWZpbmUgVlNGX0ZMQUdfWgk0CkBAIC0xMSw3NCArMzAsNiBAQAogI2RlZmluZSBWU0ZfRkxBR19BTEwgIDB4ZgogI2RlZmluZSBWU0ZfRkxBR19OT05FICAwCiAKLSNkZWZpbmUgVlNGX09VVF9DTEFTU19UTVAJMAotI2RlZmluZSBWU0ZfT1VUX0NMQVNTX0FERFIJMQotI2RlZmluZSBWU0ZfT1VUX0NMQVNTX1JFU1VMVAkyCi0KLS8qIGZpcnN0IERXT1JEIG9mIGFuIGluc3RydWN0aW9uICovCi0KLS8qIHBvc3NpYmxlIG9wZXJhdGlvbnM6IAotICAgIERPVCwgTVVMLCBBREQsIE1BRCwgRlJDLCBNQVgsIE1JTiwgU0dFLCBTTFQsIEVYUCwgTE9HLCBMSVQsIFBPVywgUkNQLCBSU1EsIEVYMiwKLSAgICBMRzIsIE1BRF8yICovCi0KLSNkZWZpbmUgTUFLRV9WU0ZfT1Aob3AsIG91dF9yZWdfaW5kZXgsIG91dF9yZWdfZmllbGRzLCBjbGFzcykgXAotICAgKChvcCkgIFwKLSAgCXwgKChvdXRfcmVnX2luZGV4KSA8PCBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX1NISUZUKSAJXAotIAkgfCAoKG91dF9yZWdfZmllbGRzKSA8PCAyMCkgCVwKLSAgCXwgKCAoY2xhc3MpIDw8IDggKSApCi0KLSNkZWZpbmUgRUFTWV9WU0ZfT1Aob3AsIG91dF9yZWdfaW5kZXgsIG91dF9yZWdfZmllbGRzLCBjbGFzcykgXAotCU1BS0VfVlNGX09QKFIzMDBfVlBJX09VVF9PUF8jI29wLCBvdXRfcmVnX2luZGV4LCBWU0ZfRkxBR18jI291dF9yZWdfZmllbGRzLCBWU0ZfT1VUX0NMQVNTXyMjY2xhc3MpIFwKLQotLyogYWNjb3JkaW5nIHRvIE5pa29sYWksIHRoZSBzdWJzZXF1ZW50IDMgRFdPUkRzIGFyZSBzb3VyY2VzLCB1c2Ugc2FtZSBkZWZpbmUgZm9yIGVhY2ggKi8KLQotI2RlZmluZSBWU0ZfSU5fQ0xBU1NfVE1QCTAKLSNkZWZpbmUgVlNGX0lOX0NMQVNTX0FUVFIJMQotI2RlZmluZSBWU0ZfSU5fQ0xBU1NfUEFSQU0JMgotI2RlZmluZSBWU0ZfSU5fQ0xBU1NfTk9ORQk5Ci0KLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9YCTAKLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9ZCTEKLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9aCTIKLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9XCTMKLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9aRVJPCTQKLSNkZWZpbmUgVlNGX0lOX0NPTVBPTkVOVF9PTkUJNQotCi0jZGVmaW5lIE1BS0VfVlNGX1NPVVJDRShpbl9yZWdfaW5kZXgsIGNvbXBfeCwgY29tcF95LCBjb21wX3osIGNvbXBfdywgY2xhc3MsIG5lZ2F0ZSkgXAotCSggKChpbl9yZWdfaW5kZXgpPDxSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfU0hJRlQpIFwKLQkgICB8ICgoY29tcF94KTw8UjMwMF9WUElfSU5fWF9TSElGVCkgXAotCSAgIHwgKChjb21wX3kpPDxSMzAwX1ZQSV9JTl9ZX1NISUZUKSBcCi0JICAgfCAoKGNvbXBfeik8PFIzMDBfVlBJX0lOX1pfU0hJRlQpIFwKLQkgICB8ICgoY29tcF93KTw8UjMwMF9WUElfSU5fV19TSElGVCkgXAotCSAgIHwgKChuZWdhdGUpPDwyNSkgfCAoKGNsYXNzKSkpCi0KLSNkZWZpbmUgRUFTWV9WU0ZfU09VUkNFKGluX3JlZ19pbmRleCwgY29tcF94LCBjb21wX3ksIGNvbXBfeiwgY29tcF93LCBjbGFzcywgbmVnYXRlKSBcCi0JTUFLRV9WU0ZfU09VUkNFKGluX3JlZ19pbmRleCwgXAotCQlWU0ZfSU5fQ09NUE9ORU5UXyMjY29tcF94LCBcCi0JCVZTRl9JTl9DT01QT05FTlRfIyNjb21wX3ksIFwKLQkJVlNGX0lOX0NPTVBPTkVOVF8jI2NvbXBfeiwgXAotCQlWU0ZfSU5fQ09NUE9ORU5UXyMjY29tcF93LCBcCi0JCVZTRl9JTl9DTEFTU18jI2NsYXNzLCBWU0ZfRkxBR18jI25lZ2F0ZSkKLQotLyogc3BlY2lhbCBzb3VyY2VzOiAqLwotCi0vKiAoMS4wLDEuMCwxLjAsMS4wKSB2ZWN0b3IgKEFUVFIsIHBsYWluICkgKi8KLSNkZWZpbmUgVlNGX0FUVFJfVU5JVFkocmVnKSAJRUFTWV9WU0ZfU09VUkNFKHJlZywgT05FLCBPTkUsIE9ORSwgT05FLCBBVFRSLCBOT05FKQotI2RlZmluZSBWU0ZfVU5JVFkocmVnKSAJRUFTWV9WU0ZfU09VUkNFKHJlZywgT05FLCBPTkUsIE9ORSwgT05FLCBOT05FLCBOT05FKQotCi0vKiBjb250ZW50cyBvZiB1bm1vZGlmaWVkIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZTRl9SRUcocmVnKSAJRUFTWV9WU0ZfU09VUkNFKHJlZywgWCwgWSwgWiwgVywgQVRUUiwgTk9ORSkKLQotLyogY29udGVudHMgb2YgdW5tb2RpZmllZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgVlNGX1BBUkFNKHJlZykgCUVBU1lfVlNGX1NPVVJDRShyZWcsIFgsIFksIFosIFcsIFBBUkFNLCBOT05FKQotCi0vKiBjb250ZW50cyBvZiB1bm1vZGlmaWVkIHRlbXBvcmFyeSByZWdpc3RlciAqLwotI2RlZmluZSBWU0ZfVE1QKHJlZykgCUVBU1lfVlNGX1NPVVJDRShyZWcsIFgsIFksIFosIFcsIFRNUCwgTk9ORSkKLQotLyogY29tcG9uZW50cyBvZiBBVFRSIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZTRl9BVFRSX1gocmVnKSBFQVNZX1ZTRl9TT1VSQ0UocmVnLCBYLCBYLCBYLCBYLCBBVFRSLCBOT05FKQotI2RlZmluZSBWU0ZfQVRUUl9ZKHJlZykgRUFTWV9WU0ZfU09VUkNFKHJlZywgWSwgWSwgWSwgWSwgQVRUUiwgTk9ORSkKLSNkZWZpbmUgVlNGX0FUVFJfWihyZWcpIEVBU1lfVlNGX1NPVVJDRShyZWcsIFosIFosIFosIFosIEFUVFIsIE5PTkUpCi0jZGVmaW5lIFZTRl9BVFRSX1cocmVnKSBFQVNZX1ZTRl9TT1VSQ0UocmVnLCBXLCBXLCBXLCBXLCBBVFRSLCBOT05FKQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3I1MDBfZnJhZ3Byb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWRhZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDb3JiaW4gU2ltcHNvbiA8TW9zdEF3ZXNvbWVEdWRlQGdtYWlsLmNvbT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAicjUwMF9mcmFncHJvZy5oIgorCisjaW5jbHVkZSAicmFkZW9uX25xc3NhZGNlLmgiCisjaW5jbHVkZSAicmFkZW9uX3Byb2dyYW1fYWx1LmgiCisKKworc3RhdGljIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzaGFkb3dfYW1iaWVudChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSwgaW50IHRtdSkKK3sKKwlnbF9zdGF0ZV9pbmRleCBmYWlsX3ZhbHVlX3Rva2Vuc1tTVEFURV9MRU5HVEhdID0geworCQlTVEFURV9JTlRFUk5BTCwgU1RBVEVfU0hBRE9XX0FNQklFTlQsIDAsIDAsIDAKKwl9OworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciByZWcgPSB7IDAsIH07CisKKwlmYWlsX3ZhbHVlX3Rva2Vuc1syXSA9IHRtdTsKKwlyZWcuRmlsZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCXJlZy5JbmRleCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZ3JhbS0+UGFyYW1ldGVycywgZmFpbF92YWx1ZV90b2tlbnMpOworCXJlZy5Td2l6emxlID0gU1dJWlpMRV9XV1dXOworCXJldHVybiByZWc7Cit9CisKKy8qKgorICogVHJhbnNmb3JtIFRFWCwgVFhQLCBUWEIsIGFuZCBLSUwgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogIC0gcHJlbXVsdGlwbHkgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgUkVDVAorICogIC0gZXh0cmFjdCBvcGVyYW5kIHN3aXp6bGVzCisgKiAgLSBpbnRyb2R1Y2UgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIgd2hlbiB3cml0ZSBtYXNrcyBhcmUgbmVlZGVkCisgKgorICovCitzdGF0aWMgR0xib29sZWFuIHRyYW5zZm9ybV9URVgoCisJc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCAqdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogb3JpZ19pbnN0LCB2b2lkKiBkYXRhKQoreworCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIgKmNvbXBpbGVyID0KKwkJKHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIqKWRhdGE7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gaW5zdCA9ICpvcmlnX2luc3Q7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIHRndDsKKwlHTGJvb2xlYW4gZGVzdHJlZGlyZWN0ID0gR0xfRkFMU0U7CisKKwlpZiAoaW5zdC5PcGNvZGUgIT0gT1BDT0RFX1RFWCAmJgorCSAgICBpbnN0Lk9wY29kZSAhPSBPUENPREVfVFhCICYmCisJICAgIGluc3QuT3Bjb2RlICE9IE9QQ09ERV9UWFAgJiYKKwkgICAgaW5zdC5PcGNvZGUgIT0gT1BDT0RFX0tJTCkKKwkJcmV0dXJuIEdMX0ZBTFNFOworCisJLyogQVJCX3NoYWRvdyAmIEVYVF9zaGFkb3dfZnVuY3MgKi8KKwlpZiAoaW5zdC5PcGNvZGUgIT0gT1BDT0RFX0tJTCAmJgorCSAgICB0LT5Qcm9ncmFtLT5TaGFkb3dTYW1wbGVycyAmICgxIDw8IGluc3QuVGV4U3JjVW5pdCkpIHsKKwkJR0x1aW50IGNvbXBhcmVmdW5jID0gR0xfTkVWRVIgKyBjb21waWxlci0+ZnAtPnN0YXRlLnVuaXRbaW5zdC5UZXhTcmNVbml0XS50ZXh0dXJlX2NvbXBhcmVfZnVuYzsKKworCQlpZiAoY29tcGFyZWZ1bmMgPT0gR0xfTkVWRVIgfHwgY29tcGFyZWZ1bmMgPT0gR0xfQUxXQVlTKSB7CisJCQl0Z3QgPSByYWRlb25BcHBlbmRJbnN0cnVjdGlvbnModC0+UHJvZ3JhbSwgMSk7CisKKwkJCXRndC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkJCXRndC0+RHN0UmVnID0gaW5zdC5Ec3RSZWc7CisJCQlpZiAoY29tcGFyZWZ1bmMgPT0gR0xfQUxXQVlTKSB7CisJCQkJdGd0LT5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fQlVJTFRJTjsKKwkJCQl0Z3QtPlNyY1JlZ1swXS5Td2l6emxlID0gU1dJWlpMRV8xMTExOworCQkJfSBlbHNlIHsKKwkJCQl0Z3QtPlNyY1JlZ1swXSA9IHNoYWRvd19hbWJpZW50KHQtPlByb2dyYW0sIGluc3QuVGV4U3JjVW5pdCk7CisJCQl9CisJCQlyZXR1cm4gR0xfVFJVRTsKKwkJfQorCisJCWluc3QuRHN0UmVnLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwkJaW5zdC5Ec3RSZWcuSW5kZXggPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKwkJaW5zdC5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisJfSBlbHNlIGlmIChpbnN0Lk9wY29kZSAhPSBPUENPREVfS0lMICYmIGluc3QuRHN0UmVnLkZpbGUgIT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKwkJaW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKworCQlpbnN0LkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCWluc3QuRHN0UmVnLkluZGV4ID0gdGVtcHJlZzsKKwkJaW5zdC5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisJCWRlc3RyZWRpcmVjdCA9IEdMX1RSVUU7CisJfQorCisJdGd0ID0gcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHQtPlByb2dyYW0sIDEpOworCV9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKHRndCwgJmluc3QsIDEpOworCisJaWYgKGluc3QuT3Bjb2RlICE9IE9QQ09ERV9LSUwgJiYKKwkgICAgdC0+UHJvZ3JhbS0+U2hhZG93U2FtcGxlcnMgJiAoMSA8PCBpbnN0LlRleFNyY1VuaXQpKSB7CisJCUdMdWludCBjb21wYXJlZnVuYyA9IEdMX05FVkVSICsgY29tcGlsZXItPmZwLT5zdGF0ZS51bml0W2luc3QuVGV4U3JjVW5pdF0udGV4dHVyZV9jb21wYXJlX2Z1bmM7CisJCUdMdWludCBkZXB0aG1vZGUgPSBjb21waWxlci0+ZnAtPnN0YXRlLnVuaXRbaW5zdC5UZXhTcmNVbml0XS5kZXB0aF90ZXh0dXJlX21vZGU7CisJCWludCByY3B0ZW1wID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisJCWludCBwYXNzLCBmYWlsOworCisJCXRndCA9IHJhZGVvbkFwcGVuZEluc3RydWN0aW9ucyh0LT5Qcm9ncmFtLCAzKTsKKworCQl0Z3RbMF0uT3Bjb2RlID0gT1BDT0RFX1JDUDsKKwkJdGd0WzBdLkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCXRndFswXS5Ec3RSZWcuSW5kZXggPSByY3B0ZW1wOworCQl0Z3RbMF0uRHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19XOworCQl0Z3RbMF0uU3JjUmVnWzBdID0gaW5zdC5TcmNSZWdbMF07CisJCXRndFswXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKworCQl0Z3RbMV0uT3Bjb2RlID0gT1BDT0RFX01BRDsKKwkJdGd0WzFdLkRzdFJlZyA9IGluc3QuRHN0UmVnOworCQl0Z3RbMV0uRHN0UmVnLldyaXRlTWFzayA9IG9yaWdfaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKwkJdGd0WzFdLlNyY1JlZ1swXSA9IGluc3QuU3JjUmVnWzBdOworCQl0Z3RbMV0uU3JjUmVnWzBdLlN3aXp6bGUgPSBTV0laWkxFX1paWlo7CisJCXRndFsxXS5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQl0Z3RbMV0uU3JjUmVnWzFdLkluZGV4ID0gcmNwdGVtcDsKKwkJdGd0WzFdLlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9XV1dXOworCQl0Z3RbMV0uU3JjUmVnWzJdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwkJdGd0WzFdLlNyY1JlZ1syXS5JbmRleCA9IGluc3QuRHN0UmVnLkluZGV4OworCQlpZiAoZGVwdGhtb2RlID09IDApIC8qIEdMX0xVTUlOQU5DRSAqLworCQkJdGd0WzFdLlNyY1JlZ1syXS5Td2l6emxlID0gTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1opOworCQllbHNlIGlmIChkZXB0aG1vZGUgPT0gMikgLyogR0xfQUxQSEEgKi8KKwkJCXRndFsxXS5TcmNSZWdbMl0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKworCQkvKiBSZWNhbGwgdGhhdCBTcmNSZWdbMF0gaXMgdGV4LCBTcmNSZWdbMl0gaXMgciBhbmQ6CisJCSAqICAgciAgPCB0ZXggIDw9PiAgICAgIC10ZXgrciA8IDAKKwkJICogICByID49IHRleCAgPD0+IG5vdCAoLXRleCtyIDwgMCAqLworCQlpZiAoY29tcGFyZWZ1bmMgPT0gR0xfTEVTUyB8fCBjb21wYXJlZnVuYyA9PSBHTF9HRVFVQUwpCisJCQl0Z3RbMV0uU3JjUmVnWzJdLk5lZ2F0ZUJhc2UgPSB0Z3RbMF0uU3JjUmVnWzJdLk5lZ2F0ZUJhc2UgXiBORUdBVEVfWFlaVzsKKwkJZWxzZQorCQkJdGd0WzFdLlNyY1JlZ1swXS5OZWdhdGVCYXNlID0gdGd0WzBdLlNyY1JlZ1swXS5OZWdhdGVCYXNlIF4gTkVHQVRFX1hZWlc7CisKKwkJdGd0WzJdLk9wY29kZSA9IE9QQ09ERV9DTVA7CisJCXRndFsyXS5Ec3RSZWcgPSBvcmlnX2luc3QtPkRzdFJlZzsKKwkJdGd0WzJdLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCXRndFsyXS5TcmNSZWdbMF0uSW5kZXggPSB0Z3RbMV0uRHN0UmVnLkluZGV4OworCisJCWlmIChjb21wYXJlZnVuYyA9PSBHTF9MRVNTIHx8IGNvbXBhcmVmdW5jID09IEdMX0dSRUFURVIpIHsKKwkJCXBhc3MgPSAxOworCQkJZmFpbCA9IDI7CisJCX0gZWxzZSB7CisJCQlwYXNzID0gMjsKKwkJCWZhaWwgPSAxOworCQl9CisKKwkJdGd0WzJdLlNyY1JlZ1twYXNzXS5GaWxlID0gUFJPR1JBTV9CVUlMVElOOworCQl0Z3RbMl0uU3JjUmVnW3Bhc3NdLlN3aXp6bGUgPSBTV0laWkxFXzExMTE7CisJCXRndFsyXS5TcmNSZWdbZmFpbF0gPSBzaGFkb3dfYW1iaWVudCh0LT5Qcm9ncmFtLCBpbnN0LlRleFNyY1VuaXQpOworCX0gZWxzZSBpZiAoZGVzdHJlZGlyZWN0KSB7CisJCXRndCA9IHJhZGVvbkFwcGVuZEluc3RydWN0aW9ucyh0LT5Qcm9ncmFtLCAxKTsKKworCQl0Z3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJCXRndC0+RHN0UmVnID0gb3JpZ19pbnN0LT5Ec3RSZWc7CisJCXRndC0+U3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwkJdGd0LT5TcmNSZWdbMF0uSW5kZXggPSBpbnN0LkRzdFJlZy5JbmRleDsKKwl9CisKKwlyZXR1cm4gR0xfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCB1cGRhdGVfcGFyYW1zKHIzMDBDb250ZXh0UHRyIHIzMDAsIHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKQoreworCXN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICptcCA9ICZmcC0+bWVzYV9wcm9ncmFtOworCisJLyogQXNrIE1lc2EgbmljZWx5IHRvIGZpbGwgaW4gUGFyYW1ldGVyVmFsdWVzIGZvciB1cyAqLworCWlmIChtcC0+QmFzZS5QYXJhbWV0ZXJzKQorCQlfbWVzYV9sb2FkX3N0YXRlX3BhcmFtZXRlcnMocjMwMC0+cmFkZW9uLmdsQ3R4LCBtcC0+QmFzZS5QYXJhbWV0ZXJzKTsKK30KKworCisvKioKKyAqIFRyYW5zZm9ybSB0aGUgcHJvZ3JhbSB0byBzdXBwb3J0IGZyYWdtZW50LnBvc2l0aW9uLgorICoKKyAqIEludHJvZHVjZSBhIHNtYWxsIGZyYWdtZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdpbGwgYmUKKyAqIHRoZSBvbmx5IGNvZGUgdGhhdCBkaXJlY3RseSByZWFkcyB0aGUgRlJBR19BVFRSSUJfV1BPUyBpbnB1dC4KKyAqIEFsbCBvdGhlciBjb2RlIHBpZWNlcyB0aGF0IHJlZmVyZW5jZSB0aGF0IGlucHV0IHdpbGwgYmUgcmV3cml0dGVuCisgKiB0byByZWFkIGZyb20gYSBuZXdseSBhbGxvY2F0ZWQgdGVtcG9yYXJ5LgorICoKKyAqIFx0b2RvIGlmL3doZW4gcjV4eCBzdXBwb3J0cyB0aGUgcmFkZW9uX3Byb2dyYW0gYXJjaGl0ZWN0dXJlLCB0aGlzIGlzIGEKKyAqIGxpa2VseSBjYW5kaWRhdGUgZm9yIGNvZGUgc2hhcmluZy4KKyAqLworc3RhdGljIHZvaWQgaW5zZXJ0X1dQT1NfdHJhaWxlcihzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyICpjb21waWxlcikKK3sKKwlHTHVpbnQgSW5wdXRzUmVhZCA9IGNvbXBpbGVyLT5mcC0+bWVzYV9wcm9ncmFtLkJhc2UuSW5wdXRzUmVhZDsKKworCWlmICghKElucHV0c1JlYWQgJiBGUkFHX0JJVF9XUE9TKSkKKwkJcmV0dXJuOworCisJc3RhdGljIGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdID0geworCQlTVEFURV9JTlRFUk5BTCwgU1RBVEVfUjMwMF9XSU5ET1dfRElNRU5TSU9OLCAwLCAwLCAwCisJfTsKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZnBpOworCUdMdWludCB3aW5kb3dfaW5kZXg7CisJaW50IGkgPSAwOworCUdMdWludCB0ZW1wcmVnaSA9IF9tZXNhX2ZpbmRfZnJlZV9yZWdpc3Rlcihjb21waWxlci0+cHJvZ3JhbSwgUFJPR1JBTV9URU1QT1JBUlkpOworCisJX21lc2FfaW5zZXJ0X2luc3RydWN0aW9ucyhjb21waWxlci0+cHJvZ3JhbSwgMCwgMyk7CisJZnBpID0gY29tcGlsZXItPnByb2dyYW0tPkluc3RydWN0aW9uczsKKworCS8qIHBlcnNwZWN0aXZlIGRpdmlkZSAqLworCWZwaVtpXS5PcGNvZGUgPSBPUENPREVfUkNQOworCisJZnBpW2ldLkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJZnBpW2ldLkRzdFJlZy5JbmRleCA9IHRlbXByZWdpOworCWZwaVtpXS5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1c7CisJZnBpW2ldLkRzdFJlZy5Db25kTWFzayA9IENPTkRfVFI7CisKKwlmcGlbaV0uU3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX0lOUFVUOworCWZwaVtpXS5TcmNSZWdbMF0uSW5kZXggPSBGUkFHX0FUVFJJQl9XUE9TOworCWZwaVtpXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKwlpKys7CisKKwlmcGlbaV0uT3Bjb2RlID0gT1BDT0RFX01VTDsKKworCWZwaVtpXS5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCWZwaVtpXS5Ec3RSZWcuSW5kZXggPSB0ZW1wcmVnaTsKKwlmcGlbaV0uRHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19YWVo7CisJZnBpW2ldLkRzdFJlZy5Db25kTWFzayA9IENPTkRfVFI7CisKKwlmcGlbaV0uU3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX0lOUFVUOworCWZwaVtpXS5TcmNSZWdbMF0uSW5kZXggPSBGUkFHX0FUVFJJQl9XUE9TOworCWZwaVtpXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKworCWZwaVtpXS5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCWZwaVtpXS5TcmNSZWdbMV0uSW5kZXggPSB0ZW1wcmVnaTsKKwlmcGlbaV0uU3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX1dXV1c7CisJaSsrOworCisJLyogdmlld3BvcnQgdHJhbnNmb3JtYXRpb24gKi8KKwl3aW5kb3dfaW5kZXggPSBfbWVzYV9hZGRfc3RhdGVfcmVmZXJlbmNlKGNvbXBpbGVyLT5wcm9ncmFtLT5QYXJhbWV0ZXJzLCB0b2tlbnMpOworCisJZnBpW2ldLk9wY29kZSA9IE9QQ09ERV9NQUQ7CisKKwlmcGlbaV0uRHN0UmVnLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwlmcGlbaV0uRHN0UmVnLkluZGV4ID0gdGVtcHJlZ2k7CisJZnBpW2ldLkRzdFJlZy5Xcml0ZU1hc2sgPSBXUklURU1BU0tfWFlaOworCWZwaVtpXS5Ec3RSZWcuQ29uZE1hc2sgPSBDT05EX1RSOworCisJZnBpW2ldLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJZnBpW2ldLlNyY1JlZ1swXS5JbmRleCA9IHRlbXByZWdpOworCWZwaVtpXS5TcmNSZWdbMF0uU3dpenpsZSA9CisJICAgIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9aRVJPKTsKKworCWZwaVtpXS5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCWZwaVtpXS5TcmNSZWdbMV0uSW5kZXggPSB3aW5kb3dfaW5kZXg7CisJZnBpW2ldLlNyY1JlZ1sxXS5Td2l6emxlID0KKwkgICAgTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1pFUk8pOworCisJZnBpW2ldLlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisJZnBpW2ldLlNyY1JlZ1syXS5JbmRleCA9IHdpbmRvd19pbmRleDsKKwlmcGlbaV0uU3JjUmVnWzJdLlN3aXp6bGUgPQorCSAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfWkVSTyk7CisJaSsrOworCisJZm9yICg7IGkgPCBjb21waWxlci0+cHJvZ3JhbS0+TnVtSW5zdHJ1Y3Rpb25zOyArK2kpIHsKKwkJaW50IHJlZzsKKwkJZm9yIChyZWcgPSAwOyByZWcgPCAzOyByZWcrKykgeworCQkJaWYgKGZwaVtpXS5TcmNSZWdbcmVnXS5GaWxlID09IFBST0dSQU1fSU5QVVQgJiYKKwkJCSAgICBmcGlbaV0uU3JjUmVnW3JlZ10uSW5kZXggPT0gRlJBR19BVFRSSUJfV1BPUykgeworCQkJCWZwaVtpXS5TcmNSZWdbcmVnXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisJCQkJZnBpW2ldLlNyY1JlZ1tyZWddLkluZGV4ID0gdGVtcHJlZ2k7CisJCQl9CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgbnFzc2FkY2VfaW5pdChzdHJ1Y3QgbnFzc2FkY2Vfc3RhdGUqIHMpCit7CisJcy0+T3V0cHV0c1tGUkFHX1JFU1VMVF9DT0xSXS5Tb3VyY2VkID0gV1JJVEVNQVNLX1hZWlc7CisJcy0+T3V0cHV0c1tGUkFHX1JFU1VMVF9ERVBSXS5Tb3VyY2VkID0gV1JJVEVNQVNLX1c7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4gaXNfbmF0aXZlX3N3aXp6bGUoR0x1aW50IG9wY29kZSwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHJlZykKK3sKKwlHTHVpbnQgcmVsZXZhbnQ7CisJaW50IGk7CisKKwlpZiAob3Bjb2RlID09IE9QQ09ERV9URVggfHwKKwkgICAgb3Bjb2RlID09IE9QQ09ERV9UWEIgfHwKKwkgICAgb3Bjb2RlID09IE9QQ09ERV9UWFAgfHwKKwkgICAgb3Bjb2RlID09IE9QQ09ERV9LSUwpIHsKKwkJaWYgKHJlZy5BYnMpCisJCQlyZXR1cm4gR0xfRkFMU0U7CisKKwkJaWYgKHJlZy5OZWdhdGVBYnMpCisJCQlyZWcuTmVnYXRlQmFzZSBePSAxNTsKKworCQlpZiAob3Bjb2RlID09IE9QQ09ERV9LSUwpIHsKKwkJCWlmIChyZWcuU3dpenpsZSAhPSBTV0laWkxFX05PT1ApCisJCQkJcmV0dXJuIEdMX0ZBTFNFOworCQl9IGVsc2UgeworCQkJZm9yKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCQkJR0x1aW50IHN3eiA9IEdFVF9TV1oocmVnLlN3aXp6bGUsIGkpOworCQkJCWlmIChzd3ogPT0gU1dJWlpMRV9OSUwpIHsKKwkJCQkJcmVnLk5lZ2F0ZUJhc2UgJj0gfigxIDw8IGkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHN3eiA+PSA0KQorCQkJCQlyZXR1cm4gR0xfRkFMU0U7CisJCQl9CisJCX0KKworCQlpZiAocmVnLk5lZ2F0ZUJhc2UpCisJCQlyZXR1cm4gR0xfRkFMU0U7CisKKwkJcmV0dXJuIEdMX1RSVUU7CisJfSBlbHNlIGlmIChvcGNvZGUgPT0gT1BDT0RFX0REWCB8fCBvcGNvZGUgPT0gT1BDT0RFX0REWSkgeworCQkvKiBERFgvTURIIGFuZCBERFkvTURWIGV4cGxpY2l0bHkgaWdub3JlIGluY29taW5nIHN3aXp6bGVzOworCQkgKiBpZiBpdCBkb2Vzbid0IGZpdCBwZXJmZWN0bHkgaW50byBhIC54eXp3IGNhc2UuLi4gKi8KKwkJaWYgKHJlZy5Td2l6emxlID09IFNXSVpaTEVfTk9PUCAmJiAhcmVnLkFicworCQkJCSYmICFyZWcuTmVnYXRlQmFzZSAmJiAhcmVnLk5lZ2F0ZUFicykKKwkJCXJldHVybiBHTF9UUlVFOworCisJCXJldHVybiBHTF9GQUxTRTsKKwl9IGVsc2UgeworCQkvKiBBTFUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnQgYWxtb3N0IGV2ZXJ5dGhpbmcgKi8KKwkJaWYgKHJlZy5BYnMpCisJCQlyZXR1cm4gR0xfVFJVRTsKKworCQlyZWxldmFudCA9IDA7CisJCWZvcihpID0gMDsgaSA8IDM7ICsraSkgeworCQkJR0x1aW50IHN3eiA9IEdFVF9TV1oocmVnLlN3aXp6bGUsIGkpOworCQkJaWYgKHN3eiAhPSBTV0laWkxFX05JTCAmJiBzd3ogIT0gU1dJWlpMRV9aRVJPKQorCQkJCXJlbGV2YW50IHw9IDEgPDwgaTsKKwkJfQorCQlpZiAoKHJlZy5OZWdhdGVCYXNlICYgcmVsZXZhbnQpICYmICgocmVnLk5lZ2F0ZUJhc2UgJiByZWxldmFudCkgIT0gcmVsZXZhbnQpKQorCQkJcmV0dXJuIEdMX0ZBTFNFOworCisJCXJldHVybiBHTF9UUlVFOworCX0KK30KKworLyoqCisgKiBJbXBsZW1lbnQgYSBNT1Ygd2l0aCBhIHBvdGVudGlhbGx5IG5vbi1uYXRpdmUgc3dpenpsZS4KKyAqCisgKiBUaGUgb25seSB0aGluZyB3ZSAqY2Fubm90KiBkbyBpbiBhbiBBTFUgaW5zdHJ1Y3Rpb24gaXMgcGVyLWNvbXBvbmVudAorICogbmVnYXRpb24uIFRoZXJlZm9yZSwgd2Ugc3BsaXQgdGhlIE1PViBpbnRvIHR3byBpbnN0cnVjdGlvbnMgd2hlbiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyB2b2lkIG5xc3NhZGNlX2J1aWxkX3N3aXp6bGUoc3RydWN0IG5xc3NhZGNlX3N0YXRlICpzLAorCXN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3QsIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMpCit7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3Q7CisJR0x1aW50IG5lZ2F0ZWJhc2VbMl0gPSB7IDAsIDAgfTsKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7ICsraSkgeworCQlHTHVpbnQgc3d6ID0gR0VUX1NXWihzcmMuU3dpenpsZSwgaSk7CisJCWlmIChzd3ogPT0gU1dJWlpMRV9OSUwpCisJCQljb250aW51ZTsKKwkJbmVnYXRlYmFzZVtHRVRfQklUKHNyYy5OZWdhdGVCYXNlLCBpKV0gfD0gMSA8PCBpOworCX0KKworCV9tZXNhX2luc2VydF9pbnN0cnVjdGlvbnMocy0+UHJvZ3JhbSwgcy0+SVAsIChuZWdhdGViYXNlWzBdID8gMSA6IDApICsgKG5lZ2F0ZWJhc2VbMV0gPyAxIDogMCkpOworCWluc3QgPSBzLT5Qcm9ncmFtLT5JbnN0cnVjdGlvbnMgKyBzLT5JUDsKKworCWZvcihpID0gMDsgaSA8PSAxOyArK2kpIHsKKwkJaWYgKCFuZWdhdGViYXNlW2ldKQorCQkJY29udGludWU7CisKKwkJaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkJaW5zdC0+RHN0UmVnID0gZHN0OworCQlpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID0gbmVnYXRlYmFzZVtpXTsKKwkJaW5zdC0+U3JjUmVnWzBdID0gc3JjOworCQlpbnN0Kys7CisJCXMtPklQKys7CisJfQorfQorCitzdGF0aWMgR0x1aW50IGJ1aWxkX2R0bShHTHVpbnQgZGVwdGhtb2RlKQoreworCXN3aXRjaChkZXB0aG1vZGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgR0xfTFVNSU5BTkNFOiByZXR1cm4gMDsKKwljYXNlIEdMX0lOVEVOU0lUWTogcmV0dXJuIDE7CisJY2FzZSBHTF9BTFBIQTogcmV0dXJuIDI7CisJfQorfQorCitzdGF0aWMgR0x1aW50IGJ1aWxkX2Z1bmMoR0x1aW50IGNvbXBhcmVmdW5jKQoreworCXJldHVybiBjb21wYXJlZnVuYyAtIEdMX05FVkVSOworfQorCisKKy8qKgorICogQ29sbGVjdCBhbGwgZXh0ZXJuYWwgc3RhdGUgdGhhdCBpcyByZWxldmFudCBmb3IgY29tcGlsaW5nIHRoZSBnaXZlbgorICogZnJhZ21lbnQgcHJvZ3JhbS4KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfc3RhdGUoCisJcjMwMENvbnRleHRQdHIgcjMwMCwKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtICpmcCwKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2V4dGVybmFsX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgdW5pdDsKKworCV9tZXNhX2J6ZXJvKHN0YXRlLCBzaXplb2YoKnN0YXRlKSk7CisKKwlmb3IodW5pdCA9IDA7IHVuaXQgPCAxNjsgKyt1bml0KSB7CisJCWlmIChmcC0+bWVzYV9wcm9ncmFtLkJhc2UuU2hhZG93U2FtcGxlcnMgJiAoMSA8PCB1bml0KSkgeworCQkJc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0KiB0ZXggPSByMzAwLT5yYWRlb24uZ2xDdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fQ3VycmVudDsKKworCQkJc3RhdGUtPnVuaXRbdW5pdF0uZGVwdGhfdGV4dHVyZV9tb2RlID0gYnVpbGRfZHRtKHRleC0+RGVwdGhNb2RlKTsKKwkJCXN0YXRlLT51bml0W3VuaXRdLnRleHR1cmVfY29tcGFyZV9mdW5jID0gYnVpbGRfZnVuYyh0ZXgtPkNvbXBhcmVGdW5jKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9wcm9ncmFtKHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29kZSAqY29kZSk7CisKK3ZvaWQgcjUwMFRyYW5zbGF0ZUZyYWdtZW50U2hhZGVyKHIzMDBDb250ZXh0UHRyIHIzMDAsCisJCQkJIHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKQoreworCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fZXh0ZXJuYWxfc3RhdGUgc3RhdGU7CisKKwlidWlsZF9zdGF0ZShyMzAwLCBmcCwgJnN0YXRlKTsKKwlpZiAoX21lc2FfbWVtY21wKCZmcC0+c3RhdGUsICZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSkpIHsKKwkJLyogVE9ETzogY2FjaGUgY29tcGlsZWQgcHJvZ3JhbXMgKi8KKwkJZnAtPnRyYW5zbGF0ZWQgPSBHTF9GQUxTRTsKKwkJX21lc2FfbWVtY3B5KCZmcC0+c3RhdGUsICZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSk7CisJfQorCisJaWYgKCFmcC0+dHJhbnNsYXRlZCkgeworCQlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyIGNvbXBpbGVyOworCisJCWNvbXBpbGVyLnIzMDAgPSByMzAwOworCQljb21waWxlci5mcCA9IGZwOworCQljb21waWxlci5jb2RlID0gJmZwLT5jb2RlOworCQljb21waWxlci5wcm9ncmFtID0gX21lc2FfY2xvbmVfcHJvZ3JhbShyMzAwLT5yYWRlb24uZ2xDdHgsICZmcC0+bWVzYV9wcm9ncmFtLkJhc2UpOworCisJCWlmIChSQURFT05fREVCVUcgJiBERUJVR19QSVhFTCkgeworCQkJX21lc2FfcHJpbnRmKCJDb21waWxlcjogSW5pdGlhbCBwcm9ncmFtOlxuIik7CisJCQlfbWVzYV9wcmludF9wcm9ncmFtKGNvbXBpbGVyLnByb2dyYW0pOworCQl9CisKKwkJaW5zZXJ0X1dQT1NfdHJhaWxlcigmY29tcGlsZXIpOworCisJCXN0cnVjdCByYWRlb25fcHJvZ3JhbV90cmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbnNbXSA9IHsKKwkJCXsgJnRyYW5zZm9ybV9URVgsICZjb21waWxlciB9LAorCQkJeyAmcmFkZW9uVHJhbnNmb3JtQUxVLCAwIH0sCisJCQl7ICZyYWRlb25UcmFuc2Zvcm1EZXJpdiwgMCB9LAorCQkJeyAmcmFkZW9uVHJhbnNmb3JtVHJpZ1NjYWxlLCAwIH0KKwkJfTsKKwkJcmFkZW9uTG9jYWxUcmFuc2Zvcm0ocjMwMC0+cmFkZW9uLmdsQ3R4LCBjb21waWxlci5wcm9ncmFtLAorCQkJNCwgdHJhbnNmb3JtYXRpb25zKTsKKworCQlpZiAoUkFERU9OX0RFQlVHICYgREVCVUdfUElYRUwpIHsKKwkJCV9tZXNhX3ByaW50ZigiQ29tcGlsZXI6IGFmdGVyIG5hdGl2ZSByZXdyaXRlOlxuIik7CisJCQlfbWVzYV9wcmludF9wcm9ncmFtKGNvbXBpbGVyLnByb2dyYW0pOworCQl9CisKKwkJc3RydWN0IHJhZGVvbl9ucXNzYWRjZV9kZXNjciBucXNzYWRjZSA9IHsKKwkJCS5Jbml0ID0gJm5xc3NhZGNlX2luaXQsCisJCQkuSXNOYXRpdmVTd2l6emxlID0gJmlzX25hdGl2ZV9zd2l6emxlLAorCQkJLkJ1aWxkU3dpenpsZSA9ICZucXNzYWRjZV9idWlsZF9zd2l6emxlLAorCQkJLlJld3JpdGVEZXB0aE91dCA9IEdMX1RSVUUKKwkJfTsKKwkJcmFkZW9uTnFzc2FEY2UocjMwMC0+cmFkZW9uLmdsQ3R4LCBjb21waWxlci5wcm9ncmFtLCAmbnFzc2FkY2UpOworCisJCWlmIChSQURFT05fREVCVUcgJiBERUJVR19QSVhFTCkgeworCQkJX21lc2FfcHJpbnRmKCJDb21waWxlcjogYWZ0ZXIgTnFTU0EtRENFOlxuIik7CisJCQlfbWVzYV9wcmludF9wcm9ncmFtKGNvbXBpbGVyLnByb2dyYW0pOworCQl9CisKKwkJZnAtPnRyYW5zbGF0ZWQgPSByNTAwRnJhZ21lbnRQcm9ncmFtRW1pdCgmY29tcGlsZXIpOworCisJCS8qIFN1YnRsZTogUmVzY3VlIGFueSBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGR1cmluZyB0cmFuc2Zvcm1hdGlvbnMgKi8KKwkJX21lc2FfZnJlZV9wYXJhbWV0ZXJfbGlzdChmcC0+bWVzYV9wcm9ncmFtLkJhc2UuUGFyYW1ldGVycyk7CisJCWZwLT5tZXNhX3Byb2dyYW0uQmFzZS5QYXJhbWV0ZXJzID0gY29tcGlsZXIucHJvZ3JhbS0+UGFyYW1ldGVyczsKKwkJY29tcGlsZXIucHJvZ3JhbS0+UGFyYW1ldGVycyA9IDA7CisKKwkJX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0ocjMwMC0+cmFkZW9uLmdsQ3R4LCAmY29tcGlsZXIucHJvZ3JhbSwgMCk7CisKKwkJcjMwMFVwZGF0ZVN0YXRlUGFyYW1ldGVycyhyMzAwLT5yYWRlb24uZ2xDdHgsIF9ORVdfUFJPR1JBTSk7CisKKwkJaWYgKFJBREVPTl9ERUJVRyAmIERFQlVHX1BJWEVMKSB7CisJCQlpZiAoZnAtPnRyYW5zbGF0ZWQpIHsKKwkJCQlfbWVzYV9wcmludGYoIk1hY2hpbmUtcmVhZGFibGUgY29kZTpcbiIpOworCQkJCWR1bXBfcHJvZ3JhbSgmZnAtPmNvZGUpOworCQkJfQorCQl9CisKKwl9CisKKwl1cGRhdGVfcGFyYW1zKHIzMDAsIGZwKTsKKworfQorCitzdGF0aWMgY2hhciAqdG9zd2l6KGludCBzd2l6X3ZhbCkgeworICBzd2l0Y2goc3dpel92YWwpIHsKKyAgY2FzZSAwOiByZXR1cm4gIlIiOworICBjYXNlIDE6IHJldHVybiAiRyI7CisgIGNhc2UgMjogcmV0dXJuICJCIjsKKyAgY2FzZSAzOiByZXR1cm4gIkEiOworICBjYXNlIDQ6IHJldHVybiAiMCI7CisgIGNhc2UgNTogcmV0dXJuICIxLzIiOworICBjYXNlIDY6IHJldHVybiAiMSI7CisgIGNhc2UgNzogcmV0dXJuICJVIjsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKnRvb3AoaW50IG9wX3ZhbCkKK3sKKyAgY2hhciAqc3RyID0gTlVMTDsKKyAgc3dpdGNoIChvcF92YWwpIHsKKyAgY2FzZSAwOiBzdHIgPSAiTUFEIjsgYnJlYWs7CisgIGNhc2UgMTogc3RyID0gIkRQMyI7IGJyZWFrOworICBjYXNlIDI6IHN0ciA9ICJEUDQiOyBicmVhazsKKyAgY2FzZSAzOiBzdHIgPSAiRDJBIjsgYnJlYWs7CisgIGNhc2UgNDogc3RyID0gIk1JTiI7IGJyZWFrOworICBjYXNlIDU6IHN0ciA9ICJNQVgiOyBicmVhazsKKyAgY2FzZSA2OiBzdHIgPSAiUmVzZXJ2ZWQiOyBicmVhazsKKyAgY2FzZSA3OiBzdHIgPSAiQ05EIjsgYnJlYWs7CisgIGNhc2UgODogc3RyID0gIkNNUCI7IGJyZWFrOworICBjYXNlIDk6IHN0ciA9ICJGUkMiOyBicmVhazsKKyAgY2FzZSAxMDogc3RyID0gIlNPUCI7IGJyZWFrOworICBjYXNlIDExOiBzdHIgPSAiTURIIjsgYnJlYWs7CisgIGNhc2UgMTI6IHN0ciA9ICJNRFYiOyBicmVhazsKKyAgfQorICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqdG9fYWxwaGFfb3AoaW50IG9wX3ZhbCkKK3sKKyAgY2hhciAqc3RyID0gTlVMTDsKKyAgc3dpdGNoIChvcF92YWwpIHsKKyAgY2FzZSAwOiBzdHIgPSAiTUFEIjsgYnJlYWs7CisgIGNhc2UgMTogc3RyID0gIkRQIjsgYnJlYWs7CisgIGNhc2UgMjogc3RyID0gIk1JTiI7IGJyZWFrOworICBjYXNlIDM6IHN0ciA9ICJNQVgiOyBicmVhazsKKyAgY2FzZSA0OiBzdHIgPSAiUmVzZXJ2ZWQiOyBicmVhazsKKyAgY2FzZSA1OiBzdHIgPSAiQ05EIjsgYnJlYWs7CisgIGNhc2UgNjogc3RyID0gIkNNUCI7IGJyZWFrOworICBjYXNlIDc6IHN0ciA9ICJGUkMiOyBicmVhazsKKyAgY2FzZSA4OiBzdHIgPSAiRVgyIjsgYnJlYWs7CisgIGNhc2UgOTogc3RyID0gIkxOMiI7IGJyZWFrOworICBjYXNlIDEwOiBzdHIgPSAiUkNQIjsgYnJlYWs7CisgIGNhc2UgMTE6IHN0ciA9ICJSU1EiOyBicmVhazsKKyAgY2FzZSAxMjogc3RyID0gIlNJTiI7IGJyZWFrOworICBjYXNlIDEzOiBzdHIgPSAiQ09TIjsgYnJlYWs7CisgIGNhc2UgMTQ6IHN0ciA9ICJNREgiOyBicmVhazsKKyAgY2FzZSAxNTogc3RyID0gIk1EViI7IGJyZWFrOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBjaGFyICp0b19tYXNrKGludCB2YWwpCit7CisgIGNoYXIgKnN0ciA9IE5VTEw7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSAwOiBzdHIgPSAiTk9ORSI7IGJyZWFrOworICBjYXNlIDE6IHN0ciA9ICJSIjsgYnJlYWs7CisgIGNhc2UgMjogc3RyID0gIkciOyBicmVhazsKKyAgY2FzZSAzOiBzdHIgPSAiUkciOyBicmVhazsKKyAgY2FzZSA0OiBzdHIgPSAiQiI7IGJyZWFrOworICBjYXNlIDU6IHN0ciA9ICJSQiI7IGJyZWFrOworICBjYXNlIDY6IHN0ciA9ICJHQiI7IGJyZWFrOworICBjYXNlIDc6IHN0ciA9ICJSR0IiOyBicmVhazsKKyAgY2FzZSA4OiBzdHIgPSAiQSI7IGJyZWFrOworICBjYXNlIDk6IHN0ciA9ICJBUiI7IGJyZWFrOworICBjYXNlIDEwOiBzdHIgPSAiQUciOyBicmVhazsKKyAgY2FzZSAxMTogc3RyID0gIkFSRyI7IGJyZWFrOworICBjYXNlIDEyOiBzdHIgPSAiQUIiOyBicmVhazsKKyAgY2FzZSAxMzogc3RyID0gIkFSQiI7IGJyZWFrOworICBjYXNlIDE0OiBzdHIgPSAiQUdCIjsgYnJlYWs7CisgIGNhc2UgMTU6IHN0ciA9ICJBUkdCIjsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGNoYXIgKnRvX3RleG9wKGludCB2YWwpCit7CisgIHN3aXRjaCh2YWwpIHsKKyAgY2FzZSAwOiByZXR1cm4gIk5PUCI7CisgIGNhc2UgMTogcmV0dXJuICJMRCI7CisgIGNhc2UgMjogcmV0dXJuICJURVhLSUxMIjsKKyAgY2FzZSAzOiByZXR1cm4gIlBST0oiOworICBjYXNlIDQ6IHJldHVybiAiTE9EQklBUyI7CisgIGNhc2UgNTogcmV0dXJuICJMT0QiOworICBjYXNlIDY6IHJldHVybiAiRFhEWSI7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcHJvZ3JhbShzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGUpCit7CisKKyAgZnByaW50ZihzdGRlcnIsICJSNTAwIEZyYWdtZW50IFByb2dyYW06XG4tLS0tLS0tLVxuIik7CisKKyAgaW50IG47CisgIHVpbnQzMl90IGluc3Q7CisgIHVpbnQzMl90IGluc3QwOworICBjaGFyICpzdHIgPSBOVUxMOworCisgIGlmIChjb2RlLT5jb25zdF9ucikgeworICAgIGZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS1cbkNvbnN0YW50czpcbiIpOworICAgIGZvciAobiA9IDA7IG4gPCBjb2RlLT5jb25zdF9ucjsgbisrKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbnN0YW50ICVkOiAlaVslaV1cbiIsIG4sCisgICAgICAgIGNvZGUtPmNvbnN0YW50W25dLkZpbGUsIGNvZGUtPmNvbnN0YW50W25dLkluZGV4KTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICItLS0tLS0tLVxuIik7CisgIH0KKworICBmb3IgKG4gPSAwOyBuIDwgY29kZS0+aW5zdF9lbmQrMTsgbisrKSB7CisgICAgaW5zdDAgPSBpbnN0ID0gY29kZS0+aW5zdFtuXS5pbnN0MDsKKyAgICBmcHJpbnRmKHN0ZGVyciwiJWRcdDA6Q01OX0lOU1QgICAweCUwOHg6IiwgbiwgaW5zdCk7CisgICAgc3dpdGNoKGluc3QgJiAweDMpIHsKKyAgICBjYXNlIFI1MDBfSU5TVF9UWVBFX0FMVTogc3RyID0gIkFMVSI7IGJyZWFrOworICAgIGNhc2UgUjUwMF9JTlNUX1RZUEVfT1VUOiBzdHIgPSAiT1VUIjsgYnJlYWs7CisgICAgY2FzZSBSNTAwX0lOU1RfVFlQRV9GQzogc3RyID0gIkZDIjsgYnJlYWs7CisgICAgY2FzZSBSNTAwX0lOU1RfVFlQRV9URVg6IHN0ciA9ICJURVgiOyBicmVhazsKKyAgICB9OworICAgIGZwcmludGYoc3RkZXJyLCIlcyAlcyAlcyAlcyAlcyAiLCBzdHIsCisJICAgIGluc3QgJiBSNTAwX0lOU1RfVEVYX1NFTV9XQUlUID8gIlRFWF9XQUlUIiA6ICIiLAorCSAgICBpbnN0ICYgUjUwMF9JTlNUX0xBU1QgPyAiTEFTVCIgOiAiIiwKKwkgICAgaW5zdCAmIFI1MDBfSU5TVF9OT1AgPyAiTk9QIiA6ICIiLAorCSAgICBpbnN0ICYgUjUwMF9JTlNUX0FMVV9XQUlUID8gIkFMVSBXQUlUIiA6ICIiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwid21hc2s6ICVzIG9tYXNrOiAlc1xuIiwgdG9fbWFzaygoaW5zdCA+PiAxMSkgJiAweGYpLAorCSAgICB0b19tYXNrKChpbnN0ID4+IDE1KSAmIDB4ZikpOworCisgICAgc3dpdGNoKGluc3QwICYgMHgzKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIGZwcmludGYoc3RkZXJyLCJcdDE6UkdCX0FERFIgICAweCUwOHg6IiwgY29kZS0+aW5zdFtuXS5pbnN0MSk7CisgICAgICBpbnN0ID0gY29kZS0+aW5zdFtuXS5pbnN0MTsKKworICAgICAgZnByaW50ZihzdGRlcnIsIkFkZHIwOiAlZCVjLCBBZGRyMTogJWQlYywgQWRkcjI6ICVkJWMsIHNyY3A6JWRcbiIsCisJICAgICAgaW5zdCAmIDB4ZmYsIChpbnN0ICYgKDE8PDgpKSA/ICdjJyA6ICd0JywKKwkgICAgICAoaW5zdCA+PiAxMCkgJiAweGZmLCAoaW5zdCAmICgxPDwxOCkpID8gJ2MnIDogJ3QnLAorCSAgICAgIChpbnN0ID4+IDIwKSAmIDB4ZmYsIChpbnN0ICYgKDE8PDI4KSkgPyAnYycgOiAndCcsCisJICAgICAgKGluc3QgPj4gMzApKTsKKworICAgICAgZnByaW50ZihzdGRlcnIsIlx0MjpBTFBIQV9BRERSIDB4JTA4eDoiLCBjb2RlLT5pbnN0W25dLmluc3QyKTsKKyAgICAgIGluc3QgPSBjb2RlLT5pbnN0W25dLmluc3QyOworICAgICAgZnByaW50ZihzdGRlcnIsIkFkZHIwOiAlZCVjLCBBZGRyMTogJWQlYywgQWRkcjI6ICVkJWMsIHNyY3A6JWRcbiIsCisJICAgICAgaW5zdCAmIDB4ZmYsIChpbnN0ICYgKDE8PDgpKSA/ICdjJyA6ICd0JywKKwkgICAgICAoaW5zdCA+PiAxMCkgJiAweGZmLCAoaW5zdCAmICgxPDwxOCkpID8gJ2MnIDogJ3QnLAorCSAgICAgIChpbnN0ID4+IDIwKSAmIDB4ZmYsIChpbnN0ICYgKDE8PDI4KSkgPyAnYycgOiAndCcsCisJICAgICAgKGluc3QgPj4gMzApKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJcdDMgUkdCX0lOU1Q6ICAweCUwOHg6IiwgY29kZS0+aW5zdFtuXS5pbnN0Myk7CisgICAgICBpbnN0ID0gY29kZS0+aW5zdFtuXS5pbnN0MzsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJyZ2JfQV9zcmM6JWQgJXMvJXMvJXMgJWQgcmdiX0Jfc3JjOiVkICVzLyVzLyVzICVkXG4iLAorCSAgICAgIChpbnN0KSAmIDB4MywgdG9zd2l6KChpbnN0ID4+IDIpICYgMHg3KSwgdG9zd2l6KChpbnN0ID4+IDUpICYgMHg3KSwgdG9zd2l6KChpbnN0ID4+IDgpICYgMHg3KSwKKwkgICAgICAoaW5zdCA+PiAxMSkgJiAweDMsCisJICAgICAgKGluc3QgPj4gMTMpICYgMHgzLCB0b3N3aXooKGluc3QgPj4gMTUpICYgMHg3KSwgdG9zd2l6KChpbnN0ID4+IDE4KSAmIDB4NyksIHRvc3dpeigoaW5zdCA+PiAyMSkgJiAweDcpLAorCSAgICAgIChpbnN0ID4+IDI0KSAmIDB4Myk7CisKKworICAgICAgZnByaW50ZihzdGRlcnIsIlx0NCBBTFBIQV9JTlNUOjB4JTA4eDoiLCBjb2RlLT5pbnN0W25dLmluc3Q0KTsKKyAgICAgIGluc3QgPSBjb2RlLT5pbnN0W25dLmluc3Q0OworICAgICAgZnByaW50ZihzdGRlcnIsIiVzIGRlc3Q6JWQlcyBhbHBfQV9zcmM6JWQgJXMgJWQgYWxwX0Jfc3JjOiVkICVzICVkIHc6JWRcbiIsIHRvX2FscGhhX29wKGluc3QgJiAweGYpLAorCSAgICAgIChpbnN0ID4+IDQpICYgMHg3ZiwgaW5zdCAmICgxPDwxMSkgPyAiKHJlbCkiOiIiLAorCSAgICAgIChpbnN0ID4+IDEyKSAmIDB4MywgdG9zd2l6KChpbnN0ID4+IDE0KSAmIDB4NyksIChpbnN0ID4+IDE3KSAmIDB4MywKKwkgICAgICAoaW5zdCA+PiAxOSkgJiAweDMsIHRvc3dpeigoaW5zdCA+PiAyMSkgJiAweDcpLCAoaW5zdCA+PiAyNCkgJiAweDMsCisJICAgICAgKGluc3QgPj4gMzEpICYgMHgxKTsKKworICAgICAgZnByaW50ZihzdGRlcnIsIlx0NSBSR0JBX0lOU1Q6IDB4JTA4eDoiLCBjb2RlLT5pbnN0W25dLmluc3Q1KTsKKyAgICAgIGluc3QgPSBjb2RlLT5pbnN0W25dLmluc3Q1OworICAgICAgZnByaW50ZihzdGRlcnIsIiVzIGRlc3Q6JWQlcyByZ2JfQ19zcmM6JWQgJXMvJXMvJXMgJWQgYWxwX0Nfc3JjOiVkICVzICVkXG4iLCB0b29wKGluc3QgJiAweGYpLAorCSAgICAgIChpbnN0ID4+IDQpICYgMHg3ZiwgaW5zdCAmICgxPDwxMSkgPyAiKHJlbCkiOiIiLAorCSAgICAgIChpbnN0ID4+IDEyKSAmIDB4MywgdG9zd2l6KChpbnN0ID4+IDE0KSAmIDB4NyksIHRvc3dpeigoaW5zdCA+PiAxNykgJiAweDcpLCB0b3N3aXooKGluc3QgPj4gMjApICYgMHg3KSwKKwkgICAgICAoaW5zdCA+PiAyMykgJiAweDMsCisJICAgICAgKGluc3QgPj4gMjUpICYgMHgzLCB0b3N3aXooKGluc3QgPj4gMjcpICYgMHg3KSwgKGluc3QgPj4gMzApICYgMHgzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGluc3QgPSBjb2RlLT5pbnN0W25dLmluc3QxOworICAgICAgZnByaW50ZihzdGRlcnIsIlx0MTpURVhfSU5TVDogIDB4JTA4eDogaWQ6ICVkIG9wOiVzLCAlcywgJXMgJXNcbiIsIGluc3QsIChpbnN0ID4+IDE2KSAmIDB4ZiwKKwkgICAgICB0b190ZXhvcCgoaW5zdCA+PiAyMikgJiAweDcpLCAoaW5zdCAmICgxPDwyNSkpID8gIkFDUSIgOiAiIiwKKwkgICAgICAoaW5zdCAmICgxPDwyNikpID8gIklHTlVOQyIgOiAiIiwgKGluc3QgJiAoMTw8MjcpKSA/ICJVTlNDQUxFRCIgOiAiU0NBTEVEIik7CisgICAgICBpbnN0ID0gY29kZS0+aW5zdFtuXS5pbnN0MjsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJcdDI6VEVYX0FERFI6ICAweCUwOHg6IHNyYzogJWQlcyAlcy8lcy8lcy8lcyBkc3Q6ICVkJXMgJXMvJXMvJXMvJXNcbiIsIGluc3QsCisJICAgICAgaW5zdCAmIDEyNywgaW5zdCAmICgxPDw3KSA/ICIocmVsKSIgOiAiIiwKKwkgICAgICB0b3N3aXooKGluc3QgPj4gOCkgJiAweDMpLCB0b3N3aXooKGluc3QgPj4gMTApICYgMHgzKSwKKwkgICAgICB0b3N3aXooKGluc3QgPj4gMTIpICYgMHgzKSwgdG9zd2l6KChpbnN0ID4+IDE0KSAmIDB4MyksCisJICAgICAgKGluc3QgPj4gMTYpICYgMTI3LCBpbnN0ICYgKDE8PDIzKSA/ICIocmVsKSIgOiAiIiwKKwkgICAgICB0b3N3aXooKGluc3QgPj4gMjQpICYgMHgzKSwgdG9zd2l6KChpbnN0ID4+IDI2KSAmIDB4MyksCisJICAgICAgdG9zd2l6KChpbnN0ID4+IDI4KSAmIDB4MyksIHRvc3dpeigoaW5zdCA+PiAzMCkgJiAweDMpKTsKKworICAgICAgZnByaW50ZihzdGRlcnIsIlx0MzpURVhfRFhEWTogIDB4JTA4eFxuIiwgY29kZS0+aW5zdFtuXS5pbnN0Myk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3I1MDBfZnJhZ3Byb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQxY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZW4gU2tlZ2dzLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBBdXRob3JzOgorICogICBCZW4gU2tlZ2dzIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+CisgKiAgIEplcm9tZSBHbGlzc2UgPGouZ2xpc3NlQGdtYWlsLmNvbT4KKyAqLworI2lmbmRlZiBfX1I1MDBfRlJBR1BST0dfSF8KKyNkZWZpbmUgX19SNTAwX0ZSQUdQUk9HX0hfCisKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgImVudW1zLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfcGFyYW1ldGVyLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ3JhbS5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9nX2luc3RydWN0aW9uLmgiCisKKyNpbmNsdWRlICJyMzAwX2NvbnRleHQuaCIKKyNpbmNsdWRlICJyMzAwX3N0YXRlLmgiCisjaW5jbHVkZSAicmFkZW9uX3Byb2dyYW0uaCIKKworc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbTsKKworZXh0ZXJuIHZvaWQgcjUwMFRyYW5zbGF0ZUZyYWdtZW50U2hhZGVyKHIzMDBDb250ZXh0UHRyIHIzMDAsCisJCQkJCXN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW0gKmZwKTsKKworc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbV9jb21waWxlciB7CisJcjMwMENvbnRleHRQdHIgcjMwMDsKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtICpmcDsKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGU7CisJc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW07Cit9OworCitleHRlcm4gR0xib29sZWFuIHI1MDBGcmFnbWVudFByb2dyYW1FbWl0KHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIgKmNvbXBpbGVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3I1MDBfZnJhZ3Byb2dfZW1pdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nX2VtaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjMxMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yNTAwX2ZyYWdwcm9nX2VtaXQuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZW4gU2tlZ2dzLgorICoKKyAqIENvcHlyaWdodCAyMDA4IENvcmJpbiBTaW1wc29uIDxNb3N0QXdlc29tZUR1ZGVAZ21haWwuY29tPgorICogQWRhcHRhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIGZvciBBVEkvQU1EIFJhZGVvbiBSNTAwIEdQVSBjaGlwc2V0cy4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKioKKyAqIFxmaWxlCisgKgorICogXGF1dGhvciBCZW4gU2tlZ2dzIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+CisgKgorICogXGF1dGhvciBKZXJvbWUgR2xpc3NlIDxqLmdsaXNzZUBnbWFpbC5jb20+CisgKgorICogXGF1dGhvciBDb3JiaW4gU2ltcHNvbiA8TW9zdEF3ZXNvbWVEdWRlQGdtYWlsLmNvbT4KKyAqCisgKiBcdG9kbyBEZXB0aCB3cml0ZSwgV1BPUy9GT0dDIGlucHV0cworICoKKyAqIFx0b2RvIEZvZ09wdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAicjUwMF9mcmFncHJvZy5oIgorCisjaW5jbHVkZSAicmFkZW9uX3Byb2dyYW1fcGFpci5oIgorCisKKyNkZWZpbmUgUFJPR19DT0RFIFwKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyICpjID0gKHN0cnVjdCByNTAwX2ZyYWdtZW50X3Byb2dyYW1fY29tcGlsZXIqKWRhdGE7IFwKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGUgPSBjLT5jb2RlCisKKyNkZWZpbmUgZXJyb3IoZm10LCBhcmdzLi4uKSBkbyB7CQkJXAorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOjolcygpOiAiIGZtdCAiXG4iLAlcCisJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCAjI2FyZ3MpOwlcCisJfSB3aGlsZSgwKQorCisKKy8qKgorICogQ2FsbGJhY2sgdG8gcmVnaXN0ZXIgaGFyZHdhcmUgY29uc3RhbnRzLgorICovCitzdGF0aWMgR0xib29sZWFuIGVtaXRfY29uc3Qodm9pZCAqZGF0YSwgR0x1aW50IGZpbGUsIEdMdWludCBpZHgsIEdMdWludCAqaHdpbmRleCkKK3sKKwlQUk9HX0NPREU7CisKKwlmb3IgKCpod2luZGV4ID0gMDsgKmh3aW5kZXggPCBjb2RlLT5jb25zdF9ucjsgKysqaHdpbmRleCkgeworCQlpZiAoY29kZS0+Y29uc3RhbnRbKmh3aW5kZXhdLkZpbGUgPT0gZmlsZSAmJgorCQkgICAgY29kZS0+Y29uc3RhbnRbKmh3aW5kZXhdLkluZGV4ID09IGlkeCkKKwkJCWJyZWFrOworCX0KKworCWlmICgqaHdpbmRleCA+PSBjb2RlLT5jb25zdF9ucikgeworCQlpZiAoKmh3aW5kZXggPj0gUEZTX05VTV9DT05TVF9SRUdTKSB7CisJCQllcnJvcigiT3V0IG9mIGh3IGNvbnN0YW50cyFcbiIpOworCQkJcmV0dXJuIEdMX0ZBTFNFOworCQl9CisKKwkJY29kZS0+Y29uc3RfbnIrKzsKKwkJY29kZS0+Y29uc3RhbnRbKmh3aW5kZXhdLkZpbGUgPSBmaWxlOworCQljb2RlLT5jb25zdGFudFsqaHdpbmRleF0uSW5kZXggPSBpZHg7CisJfQorCisJcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBHTHVpbnQgdHJhbnNsYXRlX3JnYl9vcChHTHVpbnQgb3Bjb2RlKQoreworCXN3aXRjaChvcGNvZGUpIHsKKwljYXNlIE9QQ09ERV9DTVA6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX0NNUDsKKwljYXNlIE9QQ09ERV9ERFg6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX01ESDsKKwljYXNlIE9QQ09ERV9ERFk6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX01EVjsKKwljYXNlIE9QQ09ERV9EUDM6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX0RQMzsKKwljYXNlIE9QQ09ERV9EUDQ6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX0RQNDsKKwljYXNlIE9QQ09ERV9GUkM6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX0ZSQzsKKwlkZWZhdWx0OgorCQllcnJvcigidHJhbnNsYXRlX3JnYl9vcCglZCk6IHVua25vd24gb3Bjb2RlXG4iLCBvcGNvZGUpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE9QQ09ERV9OT1A6CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgT1BDT0RFX01BRDogcmV0dXJuIFI1MDBfQUxVX1JHQkFfT1BfTUFEOworCWNhc2UgT1BDT0RFX01BWDogcmV0dXJuIFI1MDBfQUxVX1JHQkFfT1BfTUFYOworCWNhc2UgT1BDT0RFX01JTjogcmV0dXJuIFI1MDBfQUxVX1JHQkFfT1BfTUlOOworCWNhc2UgT1BDT0RFX1JFUExfQUxQSEE6IHJldHVybiBSNTAwX0FMVV9SR0JBX09QX1NPUDsKKwl9Cit9CisKK3N0YXRpYyBHTHVpbnQgdHJhbnNsYXRlX2FscGhhX29wKEdMdWludCBvcGNvZGUpCit7CisJc3dpdGNoKG9wY29kZSkgeworCWNhc2UgT1BDT0RFX0NNUDogcmV0dXJuIFI1MDBfQUxQSEFfT1BfQ01QOworCWNhc2UgT1BDT0RFX0NPUzogcmV0dXJuIFI1MDBfQUxQSEFfT1BfQ09TOworCWNhc2UgT1BDT0RFX0REWDogcmV0dXJuIFI1MDBfQUxQSEFfT1BfTURIOworCWNhc2UgT1BDT0RFX0REWTogcmV0dXJuIFI1MDBfQUxQSEFfT1BfTURWOworCWNhc2UgT1BDT0RFX0RQMzogcmV0dXJuIFI1MDBfQUxQSEFfT1BfRFA7CisJY2FzZSBPUENPREVfRFA0OiByZXR1cm4gUjUwMF9BTFBIQV9PUF9EUDsKKwljYXNlIE9QQ09ERV9FWDI6IHJldHVybiBSNTAwX0FMUEhBX09QX0VYMjsKKwljYXNlIE9QQ09ERV9GUkM6IHJldHVybiBSNTAwX0FMUEhBX09QX0ZSQzsKKwljYXNlIE9QQ09ERV9MRzI6IHJldHVybiBSNTAwX0FMUEhBX09QX0xOMjsKKwlkZWZhdWx0OgorCQllcnJvcigidHJhbnNsYXRlX2FscGhhX29wKCVkKTogdW5rbm93biBvcGNvZGVcbiIsIG9wY29kZSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgT1BDT0RFX05PUDoKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBPUENPREVfTUFEOiByZXR1cm4gUjUwMF9BTFBIQV9PUF9NQUQ7CisJY2FzZSBPUENPREVfTUFYOiByZXR1cm4gUjUwMF9BTFBIQV9PUF9NQVg7CisJY2FzZSBPUENPREVfTUlOOiByZXR1cm4gUjUwMF9BTFBIQV9PUF9NSU47CisJY2FzZSBPUENPREVfUkNQOiByZXR1cm4gUjUwMF9BTFBIQV9PUF9SQ1A7CisJY2FzZSBPUENPREVfUlNROiByZXR1cm4gUjUwMF9BTFBIQV9PUF9SU1E7CisJY2FzZSBPUENPREVfU0lOOiByZXR1cm4gUjUwMF9BTFBIQV9PUF9TSU47CisJfQorfQorCitzdGF0aWMgR0x1aW50IGZpeF9od19zd2l6emxlKEdMdWludCBzd3opCit7CisJaWYgKHN3eiA9PSA1KSBzd3ogPSA2OworCWlmIChzd3ogPT0gU1dJWlpMRV9OSUwpIHN3eiA9IDQ7CisJcmV0dXJuIHN3ejsKK30KKworc3RhdGljIEdMdWludCB0cmFuc2xhdGVfYXJnX3JnYihzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24gKmluc3QsIGludCBhcmcpCit7CisJR0x1aW50IHQgPSBpbnN0LT5SR0IuQXJnW2FyZ10uU291cmNlOworCWludCBjb21wOworCXQgfD0gaW5zdC0+UkdCLkFyZ1thcmddLk5lZ2F0ZSA8PCAxMTsKKwl0IHw9IGluc3QtPlJHQi5BcmdbYXJnXS5BYnMgPDwgMTI7CisKKwlmb3IoY29tcCA9IDA7IGNvbXAgPCAzOyArK2NvbXApCisJCXQgfD0gZml4X2h3X3N3aXp6bGUoR0VUX1NXWihpbnN0LT5SR0IuQXJnW2FyZ10uU3dpenpsZSwgY29tcCkpIDw8ICgzKmNvbXAgKyAyKTsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9hcmdfYWxwaGEoc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uICppbnN0LCBpbnQgaSkKK3sKKwlHTHVpbnQgdCA9IGluc3QtPkFscGhhLkFyZ1tpXS5Tb3VyY2U7CisJdCB8PSBmaXhfaHdfc3dpenpsZShpbnN0LT5BbHBoYS5BcmdbaV0uU3dpenpsZSkgPDwgMjsKKwl0IHw9IGluc3QtPkFscGhhLkFyZ1tpXS5OZWdhdGUgPDwgNTsKKwl0IHw9IGluc3QtPkFscGhhLkFyZ1tpXS5BYnMgPDwgNjsKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIHZvaWQgdXNlX3RlbXBvcmFyeShzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUqIGNvZGUsIEdMdWludCBpbmRleCkKK3sKKwlpZiAoaW5kZXggPiBjb2RlLT5tYXhfdGVtcF9pZHgpCisJCWNvZGUtPm1heF90ZW1wX2lkeCA9IGluZGV4OworfQorCitzdGF0aWMgR0x1aW50IHVzZV9zb3VyY2Uoc3RydWN0IHI1MDBfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlKiBjb2RlLCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb25fc291cmNlIHNyYykKK3sKKwlpZiAoIXNyYy5Db25zdGFudCkKKwkJdXNlX3RlbXBvcmFyeShjb2RlLCBzcmMuSW5kZXgpOworCXJldHVybiBzcmMuSW5kZXggfCBzcmMuQ29uc3RhbnQgPDwgODsKK30KKworCisvKioKKyAqIEVtaXQgYSBwYWlyZWQgQUxVIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgR0xib29sZWFuIGVtaXRfcGFpcmVkKHZvaWQgKmRhdGEsIHN0cnVjdCByYWRlb25fcGFpcl9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKwlQUk9HX0NPREU7CisKKwlpZiAoY29kZS0+aW5zdF9lbmQgPj0gNTExKSB7CisJCWVycm9yKCJlbWl0X2FsdTogVG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIik7CisJCXJldHVybiBHTF9GQUxTRTsKKwl9CisKKwlpbnQgaXAgPSArK2NvZGUtPmluc3RfZW5kOworCisJY29kZS0+aW5zdFtpcF0uaW5zdDUgPSB0cmFuc2xhdGVfcmdiX29wKGluc3QtPlJHQi5PcGNvZGUpOworCWNvZGUtPmluc3RbaXBdLmluc3Q0ID0gdHJhbnNsYXRlX2FscGhhX29wKGluc3QtPkFscGhhLk9wY29kZSk7CisKKwlpZiAoaW5zdC0+UkdCLk91dHB1dFdyaXRlTWFzayB8fCBpbnN0LT5BbHBoYS5PdXRwdXRXcml0ZU1hc2sgfHwgaW5zdC0+QWxwaGEuRGVwdGhXcml0ZU1hc2spCisJCWNvZGUtPmluc3RbaXBdLmluc3QwID0gUjUwMF9JTlNUX1RZUEVfT1VUOworCWVsc2UKKwkJY29kZS0+aW5zdFtpcF0uaW5zdDAgPSBSNTAwX0lOU1RfVFlQRV9BTFU7CisJY29kZS0+aW5zdFtpcF0uaW5zdDAgfD0gUjUwMF9JTlNUX1RFWF9TRU1fV0FJVDsKKworCWNvZGUtPmluc3RbaXBdLmluc3QwIHw9IChpbnN0LT5SR0IuV3JpdGVNYXNrIDw8IDExKSB8IChpbnN0LT5BbHBoYS5Xcml0ZU1hc2sgPDwgMTQpOworCWNvZGUtPmluc3RbaXBdLmluc3QwIHw9IChpbnN0LT5SR0IuT3V0cHV0V3JpdGVNYXNrIDw8IDE1KSB8IChpbnN0LT5BbHBoYS5PdXRwdXRXcml0ZU1hc2sgPDwgMTgpOworCWlmIChpbnN0LT5BbHBoYS5EZXB0aFdyaXRlTWFzaykgeworCQljb2RlLT5pbnN0W2lwXS5pbnN0NCB8PSBSNTAwX0FMUEhBX1dfT01BU0s7CisJCWMtPmZwLT53cml0ZXNfZGVwdGggPSBHTF9UUlVFOworCX0KKworCWNvZGUtPmluc3RbaXBdLmluc3Q0IHw9IFI1MDBfQUxQSEFfQUREUkQoaW5zdC0+QWxwaGEuRGVzdEluZGV4KTsKKwljb2RlLT5pbnN0W2lwXS5pbnN0NSB8PSBSNTAwX0FMVV9SR0JBX0FERFJEKGluc3QtPlJHQi5EZXN0SW5kZXgpOworCXVzZV90ZW1wb3JhcnkoY29kZSwgaW5zdC0+QWxwaGEuRGVzdEluZGV4KTsKKwl1c2VfdGVtcG9yYXJ5KGNvZGUsIGluc3QtPlJHQi5EZXN0SW5kZXgpOworCisJaWYgKGluc3QtPlJHQi5TYXR1cmF0ZSkKKwkJY29kZS0+aW5zdFtpcF0uaW5zdDAgfD0gUjUwMF9JTlNUX1JHQl9DTEFNUDsKKwlpZiAoaW5zdC0+QWxwaGEuU2F0dXJhdGUpCisJCWNvZGUtPmluc3RbaXBdLmluc3QwIHw9IFI1MDBfSU5TVF9BTFBIQV9DTEFNUDsKKworCWNvZGUtPmluc3RbaXBdLmluc3QxIHw9IFI1MDBfUkdCX0FERFIwKHVzZV9zb3VyY2UoY29kZSwgaW5zdC0+UkdCLlNyY1swXSkpOworCWNvZGUtPmluc3RbaXBdLmluc3QxIHw9IFI1MDBfUkdCX0FERFIxKHVzZV9zb3VyY2UoY29kZSwgaW5zdC0+UkdCLlNyY1sxXSkpOworCWNvZGUtPmluc3RbaXBdLmluc3QxIHw9IFI1MDBfUkdCX0FERFIyKHVzZV9zb3VyY2UoY29kZSwgaW5zdC0+UkdCLlNyY1syXSkpOworCisJY29kZS0+aW5zdFtpcF0uaW5zdDIgfD0gUjUwMF9BTFBIQV9BRERSMCh1c2Vfc291cmNlKGNvZGUsIGluc3QtPkFscGhhLlNyY1swXSkpOworCWNvZGUtPmluc3RbaXBdLmluc3QyIHw9IFI1MDBfQUxQSEFfQUREUjEodXNlX3NvdXJjZShjb2RlLCBpbnN0LT5BbHBoYS5TcmNbMV0pKTsKKwljb2RlLT5pbnN0W2lwXS5pbnN0MiB8PSBSNTAwX0FMUEhBX0FERFIyKHVzZV9zb3VyY2UoY29kZSwgaW5zdC0+QWxwaGEuU3JjWzJdKSk7CisKKwljb2RlLT5pbnN0W2lwXS5pbnN0MyB8PSB0cmFuc2xhdGVfYXJnX3JnYihpbnN0LCAwKSA8PCBSNTAwX0FMVV9SR0JfU0VMX0FfU0hJRlQ7CisJY29kZS0+aW5zdFtpcF0uaW5zdDMgfD0gdHJhbnNsYXRlX2FyZ19yZ2IoaW5zdCwgMSkgPDwgUjUwMF9BTFVfUkdCX1NFTF9CX1NISUZUOworCWNvZGUtPmluc3RbaXBdLmluc3Q1IHw9IHRyYW5zbGF0ZV9hcmdfcmdiKGluc3QsIDIpIDw8IFI1MDBfQUxVX1JHQkFfU0VMX0NfU0hJRlQ7CisKKwljb2RlLT5pbnN0W2lwXS5pbnN0NCB8PSB0cmFuc2xhdGVfYXJnX2FscGhhKGluc3QsIDApIDw8IFI1MDBfQUxQSEFfU0VMX0FfU0hJRlQ7CisJY29kZS0+aW5zdFtpcF0uaW5zdDQgfD0gdHJhbnNsYXRlX2FyZ19hbHBoYShpbnN0LCAxKSA8PCBSNTAwX0FMUEhBX1NFTF9CX1NISUZUOworCWNvZGUtPmluc3RbaXBdLmluc3Q1IHw9IHRyYW5zbGF0ZV9hcmdfYWxwaGEoaW5zdCwgMikgPDwgUjUwMF9BTFVfUkdCQV9BTFBIQV9TRUxfQ19TSElGVDsKKworCXJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgR0x1aW50IHRyYW5zbGF0ZV9zdHJxX3N3aXp6bGUoc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYykKK3sKKwlHTHVpbnQgc3dpeiA9IDA7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJc3dpeiB8PSAoR0VUX1NXWihzcmMuU3dpenpsZSwgaSkgJiAweDMpIDw8IGkqMjsKKwlyZXR1cm4gc3dpejsKK30KKworLyoqCisgKiBFbWl0IGEgc2luZ2xlIFRFWCBpbnN0cnVjdGlvbgorICovCitzdGF0aWMgR0xib29sZWFuIGVtaXRfdGV4KHZvaWQgKmRhdGEsIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworCVBST0dfQ09ERTsKKworCWlmIChjb2RlLT5pbnN0X2VuZCA+PSA1MTEpIHsKKwkJZXJyb3IoImVtaXRfdGV4OiBUb28gbWFueSBpbnN0cnVjdGlvbnMiKTsKKwkJcmV0dXJuIEdMX0ZBTFNFOworCX0KKworCWludCBpcCA9ICsrY29kZS0+aW5zdF9lbmQ7CisKKwljb2RlLT5pbnN0W2lwXS5pbnN0MCA9IFI1MDBfSU5TVF9UWVBFX1RFWAorCQl8IChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrIDw8IDExKQorCQl8IFI1MDBfSU5TVF9URVhfU0VNX1dBSVQ7CisJY29kZS0+aW5zdFtpcF0uaW5zdDEgPSBSNTAwX1RFWF9JRChpbnN0LT5UZXhTcmNVbml0KQorCQl8IFI1MDBfVEVYX1NFTV9BQ1FVSVJFIHwgUjUwMF9URVhfSUdOT1JFX1VOQ09WRVJFRDsKKworCWlmIChpbnN0LT5UZXhTcmNUYXJnZXQgPT0gVEVYVFVSRV9SRUNUX0lOREVYKQorCSAgICAgICAgY29kZS0+aW5zdFtpcF0uaW5zdDEgfD0gUjUwMF9URVhfVU5TQ0FMRUQ7CisKKwlzd2l0Y2ggKGluc3QtPk9wY29kZSkgeworCWNhc2UgT1BDT0RFX0tJTDoKKwkJY29kZS0+aW5zdFtpcF0uaW5zdDEgfD0gUjUwMF9URVhfSU5TVF9URVhLSUxMOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9URVg6CisJCWNvZGUtPmluc3RbaXBdLmluc3QxIHw9IFI1MDBfVEVYX0lOU1RfTEQ7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX1RYQjoKKwkJY29kZS0+aW5zdFtpcF0uaW5zdDEgfD0gUjUwMF9URVhfSU5TVF9MT0RCSUFTOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9UWFA6CisJCWNvZGUtPmluc3RbaXBdLmluc3QxIHw9IFI1MDBfVEVYX0lOU1RfUFJPSjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoImVtaXRfdGV4IGNhbid0IGhhbmRsZSBvcGNvZGUgJXhcbiIsIGluc3QtPk9wY29kZSk7CisJfQorCisJY29kZS0+aW5zdFtpcF0uaW5zdDIgPSBSNTAwX1RFWF9TUkNfQUREUihpbnN0LT5TcmNSZWdbMF0uSW5kZXgpCisJCXwgKHRyYW5zbGF0ZV9zdHJxX3N3aXp6bGUoaW5zdC0+U3JjUmVnWzBdKSA8PCA4KQorCQl8IFI1MDBfVEVYX0RTVF9BRERSKGluc3QtPkRzdFJlZy5JbmRleCkKKwkJfCBSNTAwX1RFWF9EU1RfUl9TV0laX1IgfCBSNTAwX1RFWF9EU1RfR19TV0laX0cKKwkJfCBSNTAwX1RFWF9EU1RfQl9TV0laX0IgfCBSNTAwX1RFWF9EU1RfQV9TV0laX0E7CisKKwlyZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByYWRlb25fcGFpcl9oYW5kbGVyIHBhaXJfaGFuZGxlciA9IHsKKwkuRW1pdENvbnN0ID0gZW1pdF9jb25zdCwKKwkuRW1pdFBhaXJlZCA9IGVtaXRfcGFpcmVkLAorCS5FbWl0VGV4ID0gZW1pdF90ZXgsCisJLk1heEh3VGVtcHMgPSAxMjgKK307CisKK0dMYm9vbGVhbiByNTAwRnJhZ21lbnRQcm9ncmFtRW1pdChzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvbXBpbGVyICpjb21waWxlcikKK3sKKwlzdHJ1Y3QgcjUwMF9mcmFnbWVudF9wcm9ncmFtX2NvZGUgKmNvZGUgPSBjb21waWxlci0+Y29kZTsKKworCV9tZXNhX2J6ZXJvKGNvZGUsIHNpemVvZigqY29kZSkpOworCWNvZGUtPm1heF90ZW1wX2lkeCA9IDE7CisJY29kZS0+aW5zdF9vZmZzZXQgPSAwOworCWNvZGUtPmluc3RfZW5kID0gLTE7CisKKwlpZiAoIXJhZGVvblBhaXJQcm9ncmFtKGNvbXBpbGVyLT5yMzAwLT5yYWRlb24uZ2xDdHgsIGNvbXBpbGVyLT5wcm9ncmFtLCAmcGFpcl9oYW5kbGVyLCBjb21waWxlcikpCisJCXJldHVybiBHTF9GQUxTRTsKKworCWlmICgoY29kZS0+aW5zdFtjb2RlLT5pbnN0X2VuZF0uaW5zdDAgJiBSNTAwX0lOU1RfVFlQRV9NQVNLKSAhPSBSNTAwX0lOU1RfVFlQRV9PVVQpIHsKKwkJLyogVGhpcyBtYXkgaGFwcGVuIHdoZW4gZGVhZC1jb2RlIGVsaW1pbmF0aW9uIGlzIGRpc2FibGVkIG9yCisJCSAqIHdoZW4gbW9zdCBvZiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSBsb2dpYyBpcyBsZWFkaW5nIHRvIGEgS0lMICovCisJCWlmIChjb2RlLT5pbnN0X2VuZCA+PSA1MTEpIHsKKwkJCWVycm9yKCJJbnRyb2R1Y2luZyBmYWtlIE9VVDogVG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIik7CisJCQlyZXR1cm4gR0xfRkFMU0U7CisJCX0KKworCQlpbnQgaXAgPSArK2NvZGUtPmluc3RfZW5kOworCQljb2RlLT5pbnN0W2lwXS5pbnN0MCA9IFI1MDBfSU5TVF9UWVBFX09VVCB8IFI1MDBfSU5TVF9URVhfU0VNX1dBSVQ7CisJfQorCisJcmV0dXJuIEdMX1RSVUU7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9jb250ZXh0LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9jb250ZXh0LmMKaW5kZXggZTk2MzRiNC4uM2ZjNzI0YSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2NvbnRleHQuYwpAQCAtMTM1LDYgKzEzNSw3IEBACiAJLyogRmlsbCBpbiBhZGRpdGlvbmFsIHN0YW5kYXJkIGZ1bmN0aW9ucy4gKi8KIAlyYWRlb25Jbml0RHJpdmVyRnVuY3MoZnVuY3Rpb25zKTsKIAorCXJhZGVvbi0+cmFkZW9uU2NyZWVuID0gc2NyZWVuOwogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBNZXNhIGNvbnRleHQgKi8KIAlpZiAoc2hhcmVkQ29udGV4dFByaXZhdGUpCiAJCXNoYXJlQ3R4ID0gKChyYWRlb25Db250ZXh0UHRyKXNoYXJlZENvbnRleHRQcml2YXRlKS0+Z2xDdHg7CkBAIC0xNTYsOSArMTU3LDggQEAKIAlyYWRlb24tPmRyaS5od0NvbnRleHQgPSBkcmlDb250ZXh0UHJpdi0+aEhXQ29udGV4dDsKIAlyYWRlb24tPmRyaS5od0xvY2sgPSAmc1ByaXYtPnBTQVJFQS0+bG9jazsKIAlyYWRlb24tPmRyaS5mZCA9IHNQcml2LT5mZDsKLQlyYWRlb24tPmRyaS5kcm1NaW5vciA9IHNQcml2LT5kcm1NaW5vcjsKKwlyYWRlb24tPmRyaS5kcm1NaW5vciA9IHNQcml2LT5kcm1fdmVyc2lvbi5taW5vcjsKIAotCXJhZGVvbi0+cmFkZW9uU2NyZWVuID0gc2NyZWVuOwogCXJhZGVvbi0+c2FyZWEgPSAoZHJtX3JhZGVvbl9zYXJlYV90ICopICgoR0x1Ynl0ZSAqKSBzUHJpdi0+cFNBUkVBICsKIAkJCQkJICAgICAgIHNjcmVlbi0+c2FyZWFfcHJpdl9vZmZzZXQpOwogCkBAIC0xNzcsMTAgKzE3Nyw3IEBACiAJCQlyYWRlb24tPmRvX3VzbGVlcHMgPyAidXNsZWVwcyIgOiAiYnVzeSB3YWl0cyIsCiAJCQlmdGhyb3R0bGVfbW9kZSwgcmFkZW9uLT5yYWRlb25TY3JlZW4tPmlycSk7CiAKLQlyYWRlb24tPnZibGFua19mbGFncyA9IChyYWRlb24tPnJhZGVvblNjcmVlbi0+aXJxICE9IDApCi0JICAgID8gZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZyYWRlb24tPm9wdGlvbkNhY2hlKSA6IFZCTEFOS19GTEFHX05PX0lSUTsKLQotCSgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSAoJnJhZGVvbi0+c3dhcF91c3QpOworCSgqc1ByaXYtPnN5c3RlbVRpbWUtPmdldFVTVCkgKCZyYWRlb24tPnN3YXBfdXN0KTsKIAogCXJldHVybiBHTF9UUlVFOwogfQpAQCAtMjc3LDkgKzI3NCwxNSBAQAogCQkJCXJhZGVvbi0+Z2xDdHgpOwogCiAJCWlmIChyYWRlb24tPmRyaS5kcmF3YWJsZSAhPSBkcmlEcmF3UHJpdikgewotCQkJZHJpRHJhd2FibGVJbml0VkJsYW5rKGRyaURyYXdQcml2LAotCQkJCQkgICAgICByYWRlb24tPnZibGFua19mbGFncywKLQkJCQkJICAgICAgJnJhZGVvbi0+dmJsX3NlcSk7CisJCQlpZiAoZHJpRHJhd1ByaXYtPnN3YXBfaW50ZXJ2YWwgPT0gKHVuc2lnbmVkKS0xKSB7CisJCQkJZHJpRHJhd1ByaXYtPnZibEZsYWdzID0KKwkJCQkJKHJhZGVvbi0+cmFkZW9uU2NyZWVuLT5pcnEgIT0gMCkKKwkJCQkJPyBkcmlHZXREZWZhdWx0VkJsYW5rRmxhZ3MoJnJhZGVvbi0+CisJCQkJCQkJCSAgIG9wdGlvbkNhY2hlKQorCQkJCQk6IFZCTEFOS19GTEFHX05PX0lSUTsKKworCQkJCWRyaURyYXdhYmxlSW5pdFZCbGFuayhkcmlEcmF3UHJpdik7CisJCQl9CiAJCX0KIAogCQlyYWRlb24tPmRyaS5yZWFkYWJsZSA9IGRyaVJlYWRQcml2OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fY29udGV4dC5oCmluZGV4IDJmMjM5NDEuLjc0NThkNjMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2NvbnRleHQuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9jb250ZXh0LmgKQEAgLTUzLDE2ICs1Myw2IEBACiB0eXBlZGVmIHN0cnVjdCByYWRlb25fY29udGV4dCByYWRlb25Db250ZXh0UmVjOwogdHlwZWRlZiBzdHJ1Y3QgcmFkZW9uX2NvbnRleHQgKnJhZGVvbkNvbnRleHRQdHI7CiAKLSNkZWZpbmUgVEVYXzAgICAweDEKLSNkZWZpbmUgVEVYXzEgICAweDIKLSNkZWZpbmUgVEVYXzIJMHg0Ci0jZGVmaW5lIFRFWF8zCTB4OAotI2RlZmluZSBURVhfNAkweDEwCi0jZGVmaW5lIFRFWF81CTB4MjAKLSNkZWZpbmUgVEVYXzYJMHg0MAotI2RlZmluZSBURVhfNwkweDgwCi0jZGVmaW5lIFRFWF9BTEwgMHhmZgotCiAvKiBSYXN0ZXJpemluZyBmYWxsYmFja3MgKi8KIC8qIFNlZSBjb3JyZXBvbmRpbmcgc3RyaW5ncyBpbiByMjAwX3N3dGNsLmMgKi8KICNkZWZpbmUgUkFERU9OX0ZBTExCQUNLX1RFWFRVUkUJCTB4MDAwMQpAQCAtMTgyLDEwICsxNzIsNyBAQAogCUdMdWludCBpcnFzRW1pdHRlZDsKIAlkcm1fcmFkZW9uX2lycV93YWl0X3QgaXc7CiAKLQkvKiBWQkkgLyBidWZmZXIgc3dhcCAqLwotCUdMdWludCB2Ymxfc2VxOwotCUdMdWludCB2YmxhbmtfZmxhZ3M7Ci0KKwkvKiBidWZmZXIgc3dhcCAqLwogCWludDY0X3Qgc3dhcF91c3Q7CiAJaW50NjRfdCBzd2FwX21pc3NlZF91c3Q7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9pb2N0bC5jCmluZGV4IDBiODY1NmIuLjBjMWExOTUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2lvY3RsLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25faW9jdGwuYwpAQCAtMTU3LDEzICsxNTcsMTQgQEAKIAogLyogQ29weSB0aGUgYmFjayBjb2xvciBidWZmZXIgdG8gdGhlIGZyb250IGNvbG9yIGJ1ZmZlci4KICAqLwotdm9pZCByYWRlb25Db3B5QnVmZmVyKGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICogZFByaXYsCit2b2lkIHJhZGVvbkNvcHlCdWZmZXIoX19EUklkcmF3YWJsZVByaXZhdGUgKiBkUHJpdiwKIAkJICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90CSAqIHJlY3QpCiB7CiAJcmFkZW9uQ29udGV4dFB0ciByYWRlb247CiAJR0xpbnQgbmJveCwgaSwgcmV0OwogCUdMYm9vbGVhbiBtaXNzZWRfdGFyZ2V0OwogCWludDY0X3QgdXN0OworCV9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwID0gZFByaXYtPmRyaVNjcmVlblByaXY7CiAKIAlhc3NlcnQoZFByaXYpOwogCWFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYpOwpAQCAtMTg3LDggKzE4OCw3IEBACiAJaWYgKCFyZWN0KQogCXsKIAkgICAgVU5MT0NLX0hBUkRXQVJFKHJhZGVvbik7Ci0JICAgIGRyaVdhaXRGb3JWQmxhbmsoZFByaXYsICZyYWRlb24tPnZibF9zZXEsIHJhZGVvbi0+dmJsYW5rX2ZsYWdzLAotCQkJICAgICAmbWlzc2VkX3RhcmdldCk7CisJICAgIGRyaVdhaXRGb3JWQmxhbmsoZFByaXYsICZtaXNzZWRfdGFyZ2V0KTsKIAkgICAgTE9DS19IQVJEV0FSRShyYWRlb24pOwogCX0KIApAQCAtMjE1LDE2ICsyMTUsMTggQEAKIAkJCWlmIChyZWN0LT55MiA8IGItPnkyKQogCQkJICAgIGItPnkyID0gcmVjdC0+eTI7CiAKLQkJCWlmIChiLT54MSA8IGItPngyICYmIGItPnkxIDwgYi0+eTIpCi0JCQkgICAgYisrOworCQkJaWYgKGItPngxID49IGItPngyIHx8IGItPnkxID49IGItPnkyKQorCQkJICAgIGNvbnRpbnVlOwogCQkgICAgfQotCQkgICAgZWxzZQotCQkJYisrOwogCisJCSAgICBiKys7CiAJCSAgICBuKys7CiAJCX0KIAkJcmFkZW9uLT5zYXJlYS0+bmJveCA9IG47CiAKKwkJaWYgKCFuKQorCQkgICBjb250aW51ZTsKKwogCQlyZXQgPSBkcm1Db21tYW5kTm9uZShyYWRlb24tPmRyaS5mZCwgRFJNX1JBREVPTl9TV0FQKTsKIAogCQlpZiAocmV0KSB7CkBAIC0yNDEsNyArMjQzLDcgQEAKIAkgICAgKChyMzAwQ29udGV4dFB0cilyYWRlb24pLT5ody5hbGxfZGlydHkgPSBHTF9UUlVFOwogCiAJICAgIHJhZGVvbi0+c3dhcF9jb3VudCsrOwotCSAgICAoKmRyaV9pbnRlcmZhY2UtPmdldFVTVCkgKCZ1c3QpOworCSAgICAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSAoJnVzdCk7CiAJICAgIGlmIChtaXNzZWRfdGFyZ2V0KSB7CiAJCXJhZGVvbi0+c3dhcF9taXNzZWRfY291bnQrKzsKIAkJcmFkZW9uLT5zd2FwX21pc3NlZF91c3QgPSB1c3QgLSByYWRlb24tPnN3YXBfdXN0OwpAQCAtMjUzLDExICsyNTUsMTIgQEAKIAl9CiB9CiAKLXZvaWQgcmFkZW9uUGFnZUZsaXAoY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKiBkUHJpdikKK3ZvaWQgcmFkZW9uUGFnZUZsaXAoX19EUklkcmF3YWJsZVByaXZhdGUgKiBkUHJpdikKIHsKIAlyYWRlb25Db250ZXh0UHRyIHJhZGVvbjsKIAlHTGludCByZXQ7CiAJR0xib29sZWFuIG1pc3NlZF90YXJnZXQ7CisJX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKIAogCWFzc2VydChkUHJpdik7CiAJYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdik7CkBAIC0yOTMsMTEgKzI5NiwxMCBAQAogCSAqLwogCXJhZGVvbldhaXRGb3JGcmFtZUNvbXBsZXRpb24ocmFkZW9uKTsKIAlVTkxPQ0tfSEFSRFdBUkUocmFkZW9uKTsKLQlkcmlXYWl0Rm9yVkJsYW5rKGRQcml2LCAmcmFkZW9uLT52Ymxfc2VxLCByYWRlb24tPnZibGFua19mbGFncywKLQkJCSAmbWlzc2VkX3RhcmdldCk7CisJZHJpV2FpdEZvclZCbGFuayhkUHJpdiwgJm1pc3NlZF90YXJnZXQpOwogCWlmIChtaXNzZWRfdGFyZ2V0KSB7CiAJCXJhZGVvbi0+c3dhcF9taXNzZWRfY291bnQrKzsKLQkJKHZvaWQpKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpICgmcmFkZW9uLT5zd2FwX21pc3NlZF91c3QpOworCQkodm9pZCkoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSAoJnJhZGVvbi0+c3dhcF9taXNzZWRfdXN0KTsKIAl9CiAJTE9DS19IQVJEV0FSRShyYWRlb24pOwogCkBAIC0zMTEsNyArMzEzLDcgQEAKIAl9CiAKIAlyYWRlb24tPnN3YXBfY291bnQrKzsKLQkodm9pZCkoKmRyaV9pbnRlcmZhY2UtPmdldFVTVCkgKCZyYWRlb24tPnN3YXBfdXN0KTsKKwkodm9pZCkoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSAoJnJhZGVvbi0+c3dhcF91c3QpOwogCiAgICAgICAgIGRyaUZsaXBSZW5kZXJidWZmZXJzKHJhZGVvbi0+Z2xDdHgtPldpblN5c0RyYXdCdWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRlb24tPnNhcmVhLT5wZkN1cnJlbnRQYWdlKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2lvY3RsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9pb2N0bC5oCmluZGV4IDNhODBkMzYuLjIxMDAwMWUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2lvY3RsLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25faW9jdGwuaApAQCAtNDYsOSArNDYsOSBAQAogI2VuZGlmCiAjaW5jbHVkZSAicmFkZW9uX2RybS5oIgogCi1leHRlcm4gdm9pZCByYWRlb25Db3B5QnVmZmVyKGNvbnN0IF9fRFJJZHJhd2FibGVQcml2YXRlICogZHJhd2FibGUsCitleHRlcm4gdm9pZCByYWRlb25Db3B5QnVmZmVyKF9fRFJJZHJhd2FibGVQcml2YXRlICogZHJhd2FibGUsCiAJCQkgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdAkqIHJlY3QpOwotZXh0ZXJuIHZvaWQgcmFkZW9uUGFnZUZsaXAoY29uc3QgX19EUklkcmF3YWJsZVByaXZhdGUgKiBkcmF3YWJsZSk7CitleHRlcm4gdm9pZCByYWRlb25QYWdlRmxpcChfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqIGRyYXdhYmxlKTsKIGV4dGVybiB2b2lkIHJhZGVvbkZsdXNoKEdMY29udGV4dCAqIGN0eCk7CiBleHRlcm4gdm9pZCByYWRlb25GaW5pc2goR0xjb250ZXh0ICogY3R4KTsKIGV4dGVybiB2b2lkIHJhZGVvbldhaXRGb3JJZGxlTG9ja2VkKHJhZGVvbkNvbnRleHRQdHIgcmFkZW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2xvY2suYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX2xvY2suYwppbmRleCBiYzNjMmQ2Li5kNTRhODIxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9sb2NrLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fbG9jay5jCkBAIC02OCw4ICs2OCw4IEBACiAJfQogCiAJdXNlX2JhY2sgPSBybWVzYS0+Z2xDdHgtPkRyYXdCdWZmZXIgPwotCSAgICAocm1lc2EtPmdsQ3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PQotCSAgICAgQlVGRkVSX0JJVF9CQUNLX0xFRlQpIDogMTsKKwkgICAgKHJtZXNhLT5nbEN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0KKwkgICAgIEJVRkZFUl9CQUNLX0xFRlQpIDogMTsKIAl1c2VfYmFjayBePSAocm1lc2EtPnNhcmVhLT5wZkN1cnJlbnRQYWdlID09IDEpOwogCiAJaWYgKHVzZV9iYWNrKSB7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9ucXNzYWRjZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fbnFzc2FkY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2NlMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fbnFzc2FkY2UuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOaWNvbGFpIEhhZWhubGUuCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqCisgKiBAZmlsZQorICoKKyAqICJOb3QtcXVpdGUgU1NBIiBhbmQgRGVhZC1Db2RlIEVsaW1pbmF0aW9uLgorICoKKyAqIEBub3RlIFRoaXMgY29kZSB1c2VzIFNXSVpaTEVfTklMIGluIGEgc291cmNlIHJlZ2lzdGVyIHRvIGluZGljYXRlIHRoYXQKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBvbmVudCBpcyBpZ25vcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uLgorICovCisKKyNpbmNsdWRlICJyYWRlb25fbnFzc2FkY2UuaCIKKworCisvKioKKyAqIFJldHVybiB0aGUgQHJlZiByZWdpc3Rlcl9zdGF0ZSBmb3IgdGhlIGdpdmVuIHJlZ2lzdGVyIChvciAwIGZvciB1bnRyYWNrZWQKKyAqIHJlZ2lzdGVycywgaS5lLiBjb25zdGFudHMpLgorICovCitzdGF0aWMgc3RydWN0IHJlZ2lzdGVyX3N0YXRlICpnZXRfcmVnX3N0YXRlKHN0cnVjdCBucXNzYWRjZV9zdGF0ZSogcywgR0x1aW50IGZpbGUsIEdMdWludCBpbmRleCkKK3sKKwlzd2l0Y2goZmlsZSkgeworCWNhc2UgUFJPR1JBTV9URU1QT1JBUlk6IHJldHVybiAmcy0+VGVtcHNbaW5kZXhdOworCWNhc2UgUFJPR1JBTV9PVVRQVVQ6IHJldHVybiAmcy0+T3V0cHV0c1tpbmRleF07CisJZGVmYXVsdDogcmV0dXJuIDA7CisJfQorfQorCisKKy8qKgorICogTGVmdCBtdWx0aXBsaWNhdGlvbiBvZiBhIHJlZ2lzdGVyIHdpdGggYSBzd2l6emxlCisgKgorICogQG5vdGUgV29ya3MgY29ycmVjdGx5IG9ubHkgZm9yIFgsIFksIFosIFcgc3dpenpsZXMsIG5vdCBmb3IgY29uc3RhbnQgc3dpenpsZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgbG11bF9zd2l6emxlKEdMdWludCBzd2l6emxlLCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjcmVnKQoreworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciB0bXAgPSBzcmNyZWc7CisJaW50IGk7CisJdG1wLlN3aXp6bGUgPSAwOworCXRtcC5OZWdhdGVCYXNlID0gMDsKKwlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJR0x1aW50IHN3eiA9IEdFVF9TV1ooc3dpenpsZSwgaSk7CisJCWlmIChzd3ogPCA0KSB7CisJCQl0bXAuU3dpenpsZSB8PSBHRVRfU1daKHNyY3JlZy5Td2l6emxlLCBzd3opIDw8IChpKjMpOworCQkJdG1wLk5lZ2F0ZUJhc2UgfD0gR0VUX0JJVChzcmNyZWcuTmVnYXRlQmFzZSwgc3d6KSA8PCBpOworCQl9IGVsc2UgeworCQkJdG1wLlN3aXp6bGUgfD0gc3d6IDw8IChpKjMpOworCQl9CisJfQorCXJldHVybiB0bXA7Cit9CisKKworc3RhdGljIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiB0cmFja191c2VkX3NyY3JlZyhzdHJ1Y3QgbnFzc2FkY2Vfc3RhdGUqIHMsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsIEdMaW50IHNyYywgR0x1aW50IHNvdXJjZWQpCit7CisJaW50IGk7CisJR0x1aW50IGRlc3d6X3NvdXJjZSA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJaWYgKEdFVF9CSVQoc291cmNlZCwgaSkpIHsKKwkJCUdMdWludCBzd3ogPSBHRVRfU1daKGluc3QtPlNyY1JlZ1tzcmNdLlN3aXp6bGUsIGkpOworCQkJZGVzd3pfc291cmNlIHw9IDEgPDwgc3d6OworCQl9IGVsc2UgeworCQkJaW5zdC0+U3JjUmVnW3NyY10uU3dpenpsZSAmPSB+KDcgPDwgKDMqaSkpOworCQkJaW5zdC0+U3JjUmVnW3NyY10uU3dpenpsZSB8PSBTV0laWkxFX05JTCA8PCAoMyppKTsKKwkJfQorCX0KKworCWlmICghcy0+RGVzY3ItPklzTmF0aXZlU3dpenpsZShpbnN0LT5PcGNvZGUsIGluc3QtPlNyY1JlZ1tzcmNdKSkgeworCQlzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgZHN0cmVnID0gaW5zdC0+RHN0UmVnOworCQlkc3RyZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQlkc3RyZWcuSW5kZXggPSBfbWVzYV9maW5kX2ZyZWVfcmVnaXN0ZXIocy0+UHJvZ3JhbSwgUFJPR1JBTV9URU1QT1JBUlkpOworCQlkc3RyZWcuV3JpdGVNYXNrID0gc291cmNlZDsKKworCQlzLT5EZXNjci0+QnVpbGRTd2l6emxlKHMsIGRzdHJlZywgaW5zdC0+U3JjUmVnW3NyY10pOworCisJCWluc3QgPSBzLT5Qcm9ncmFtLT5JbnN0cnVjdGlvbnMgKyBzLT5JUDsKKwkJaW5zdC0+U3JjUmVnW3NyY10uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworCQlpbnN0LT5TcmNSZWdbc3JjXS5JbmRleCA9IGRzdHJlZy5JbmRleDsKKwkJaW5zdC0+U3JjUmVnW3NyY10uU3dpenpsZSA9IDA7CisJCWluc3QtPlNyY1JlZ1tzcmNdLk5lZ2F0ZUJhc2UgPSAwOworCQlpbnN0LT5TcmNSZWdbc3JjXS5BYnMgPSAwOworCQlpbnN0LT5TcmNSZWdbc3JjXS5OZWdhdGVBYnMgPSAwOworCQlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWlmIChHRVRfQklUKHNvdXJjZWQsIGkpKQorCQkJCWluc3QtPlNyY1JlZ1tzcmNdLlN3aXp6bGUgfD0gaSA8PCAoMyppKTsKKwkJCWVsc2UKKwkJCQlpbnN0LT5TcmNSZWdbc3JjXS5Td2l6emxlIHw9IFNXSVpaTEVfTklMIDw8ICgzKmkpOworCQl9CisJCWRlc3d6X3NvdXJjZSA9IHNvdXJjZWQ7CisJfQorCisJc3RydWN0IHJlZ2lzdGVyX3N0YXRlICpyZWdzdGF0ZSA9IGdldF9yZWdfc3RhdGUocywgaW5zdC0+U3JjUmVnW3NyY10uRmlsZSwgaW5zdC0+U3JjUmVnW3NyY10uSW5kZXgpOworCWlmIChyZWdzdGF0ZSkKKwkJcmVnc3RhdGUtPlNvdXJjZWQgfD0gZGVzd3pfc291cmNlICYgMHhmOworCisJcmV0dXJuIGluc3Q7Cit9CisKKworc3RhdGljIHZvaWQgcmV3cml0ZV9kZXB0aF9vdXQoc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisJaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWikgeworCQlpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1c7CisJfSBlbHNlIHsKKwkJaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9IDA7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGluc3QtPk9wY29kZSkgeworCWNhc2UgT1BDT0RFX0ZSQzoKKwljYXNlIE9QQ09ERV9NT1Y6CisJCWluc3QtPlNyY1JlZ1swXSA9IGxtdWxfc3dpenpsZShTV0laWkxFX1paWlosIGluc3QtPlNyY1JlZ1swXSk7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0FERDoKKwljYXNlIE9QQ09ERV9NQVg6CisJY2FzZSBPUENPREVfTUlOOgorCWNhc2UgT1BDT0RFX01VTDoKKwkJaW5zdC0+U3JjUmVnWzBdID0gbG11bF9zd2l6emxlKFNXSVpaTEVfWlpaWiwgaW5zdC0+U3JjUmVnWzBdKTsKKwkJaW5zdC0+U3JjUmVnWzFdID0gbG11bF9zd2l6emxlKFNXSVpaTEVfWlpaWiwgaW5zdC0+U3JjUmVnWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBPUENPREVfQ01QOgorCWNhc2UgT1BDT0RFX01BRDoKKwkJaW5zdC0+U3JjUmVnWzBdID0gbG11bF9zd2l6emxlKFNXSVpaTEVfWlpaWiwgaW5zdC0+U3JjUmVnWzBdKTsKKwkJaW5zdC0+U3JjUmVnWzFdID0gbG11bF9zd2l6emxlKFNXSVpaTEVfWlpaWiwgaW5zdC0+U3JjUmVnWzFdKTsKKwkJaW5zdC0+U3JjUmVnWzJdID0gbG11bF9zd2l6emxlKFNXSVpaTEVfWlpaWiwgaW5zdC0+U3JjUmVnWzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLy8gU2NhbGFyIGluc3RydWN0aW9ucyBuZWVkbid0IGJlIHJlc3dpenpsZWQKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB1bmFsaWFzX3NyY3JlZ3Moc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsIEdMdWludCBvbGRpbmRleCwgR0x1aW50IG5ld2luZGV4KQoreworCWludCBuc3JjID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKwlpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBuc3JjOyArK2kpCisJCWlmIChpbnN0LT5TcmNSZWdbaV0uRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJiBpbnN0LT5TcmNSZWdbaV0uSW5kZXggPT0gb2xkaW5kZXgpCisJCQlpbnN0LT5TcmNSZWdbaV0uSW5kZXggPSBuZXdpbmRleDsKK30KKworc3RhdGljIHZvaWQgdW5hbGlhc190ZW1wb3Jhcnkoc3RydWN0IG5xc3NhZGNlX3N0YXRlKiBzLCBHTHVpbnQgb2xkaW5kZXgpCit7CisJR0x1aW50IG5ld2luZGV4ID0gX21lc2FfZmluZF9mcmVlX3JlZ2lzdGVyKHMtPlByb2dyYW0sIFBST0dSQU1fVEVNUE9SQVJZKTsKKwlpbnQgaXA7CisJZm9yKGlwID0gMDsgaXAgPCBzLT5JUDsgKytpcCkgeworCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucyArIGlwOworCQlpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYgaW5zdC0+RHN0UmVnLkluZGV4ID09IG9sZGluZGV4KQorCQkJaW5zdC0+RHN0UmVnLkluZGV4ID0gbmV3aW5kZXg7CisJCXVuYWxpYXNfc3JjcmVncyhpbnN0LCBvbGRpbmRleCwgbmV3aW5kZXgpOworCX0KKwl1bmFsaWFzX3NyY3JlZ3Mocy0+UHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zICsgcy0+SVAsIG9sZGluZGV4LCBuZXdpbmRleCk7Cit9CisKKworLyoqCisgKiBIYW5kbGUgb25lIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2luc3RydWN0aW9uKHN0cnVjdCBucXNzYWRjZV9zdGF0ZSogcykKK3sKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucyArIHMtPklQOworCisJaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfRU5EKQorCQlyZXR1cm47CisKKwlpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9LSUwpIHsKKwkJaWYgKHMtPkRlc2NyLT5SZXdyaXRlRGVwdGhPdXQpIHsKKwkJCWlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX09VVFBVVCAmJiBpbnN0LT5Ec3RSZWcuSW5kZXggPT0gRlJBR19SRVNVTFRfREVQUikKKwkJCQlyZXdyaXRlX2RlcHRoX291dChpbnN0KTsKKwkJfQorCisJCXN0cnVjdCByZWdpc3Rlcl9zdGF0ZSAqcmVnc3RhdGUgPSBnZXRfcmVnX3N0YXRlKHMsIGluc3QtPkRzdFJlZy5GaWxlLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOworCQlpZiAoIXJlZ3N0YXRlKSB7CisJCQlfbWVzYV9wcm9ibGVtKHMtPkN0eCwgIk5xc3NhRGNlOiBiYWQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKCVpWyVpXSlcbiIsCisJCQkJaW5zdC0+RHN0UmVnLkZpbGUsIGluc3QtPkRzdFJlZy5JbmRleCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICY9IHJlZ3N0YXRlLT5Tb3VyY2VkOworCQlyZWdzdGF0ZS0+U291cmNlZCAmPSB+aW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKworCQlpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9PSAwKSB7CisJCQlfbWVzYV9kZWxldGVfaW5zdHJ1Y3Rpb25zKHMtPlByb2dyYW0sIHMtPklQLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJiAhcmVnc3RhdGUtPlNvdXJjZWQpCisJCQl1bmFsaWFzX3RlbXBvcmFyeShzLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOworCX0KKworCS8qIEF0dGVudGlvbjogRHVlIHRvIHN3aXp6bGUgZW11bGF0aW9uIGNvZGUsIHRoZSBmb2xsb3dpbmcKKwkgKiBtaWdodCBjaGFuZ2UgdGhlIGluc3RydWN0aW9uIHN0cmVhbSB1bmRlciB1cywgc28gd2UgaGF2ZQorCSAqIHRvIGJlIGNhcmVmdWwgd2l0aCB0aGUgaW5zdCBwb2ludGVyLiAqLworCXN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7CisJY2FzZSBPUENPREVfRERYOgorCWNhc2UgT1BDT0RFX0REWToKKwljYXNlIE9QQ09ERV9GUkM6CisJY2FzZSBPUENPREVfTU9WOgorCQlpbnN0ID0gdHJhY2tfdXNlZF9zcmNyZWcocywgaW5zdCwgMCwgaW5zdC0+RHN0UmVnLldyaXRlTWFzayk7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0FERDoKKwljYXNlIE9QQ09ERV9NQVg6CisJY2FzZSBPUENPREVfTUlOOgorCWNhc2UgT1BDT0RFX01VTDoKKwkJaW5zdCA9IHRyYWNrX3VzZWRfc3JjcmVnKHMsIGluc3QsIDAsIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2spOworCQlpbnN0ID0gdHJhY2tfdXNlZF9zcmNyZWcocywgaW5zdCwgMSwgaW5zdC0+RHN0UmVnLldyaXRlTWFzayk7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0NNUDoKKwljYXNlIE9QQ09ERV9NQUQ6CisJCWluc3QgPSB0cmFja191c2VkX3NyY3JlZyhzLCBpbnN0LCAwLCBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrKTsKKwkJaW5zdCA9IHRyYWNrX3VzZWRfc3JjcmVnKHMsIGluc3QsIDEsIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2spOworCQlpbnN0ID0gdHJhY2tfdXNlZF9zcmNyZWcocywgaW5zdCwgMiwgaW5zdC0+RHN0UmVnLldyaXRlTWFzayk7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0NPUzoKKwljYXNlIE9QQ09ERV9FWDI6CisJY2FzZSBPUENPREVfTEcyOgorCWNhc2UgT1BDT0RFX1JDUDoKKwljYXNlIE9QQ09ERV9SU1E6CisJY2FzZSBPUENPREVfU0lOOgorCQlpbnN0ID0gdHJhY2tfdXNlZF9zcmNyZWcocywgaW5zdCwgMCwgMHgxKTsKKwkJYnJlYWs7CisJY2FzZSBPUENPREVfRFAzOgorCQlpbnN0ID0gdHJhY2tfdXNlZF9zcmNyZWcocywgaW5zdCwgMCwgMHg3KTsKKwkJaW5zdCA9IHRyYWNrX3VzZWRfc3JjcmVnKHMsIGluc3QsIDEsIDB4Nyk7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0RQNDoKKwkJaW5zdCA9IHRyYWNrX3VzZWRfc3JjcmVnKHMsIGluc3QsIDAsIDB4Zik7CisJCWluc3QgPSB0cmFja191c2VkX3NyY3JlZyhzLCBpbnN0LCAxLCAweGYpOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9LSUw6CisJY2FzZSBPUENPREVfVEVYOgorCWNhc2UgT1BDT0RFX1RYQjoKKwljYXNlIE9QQ09ERV9UWFA6CisJCWluc3QgPSB0cmFja191c2VkX3NyY3JlZyhzLCBpbnN0LCAwLCAweGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlfbWVzYV9wcm9ibGVtKHMtPkN0eCwgIk5xc3NhRGNlOiBVbmtub3duIG9wY29kZSAlZFxuIiwgaW5zdC0+T3Bjb2RlKTsKKwkJcmV0dXJuOworCX0KK30KKworCit2b2lkIHJhZGVvbk5xc3NhRGNlKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcCwgc3RydWN0IHJhZGVvbl9ucXNzYWRjZV9kZXNjciogZGVzY3IpCit7CisJc3RydWN0IG5xc3NhZGNlX3N0YXRlIHM7CisKKwlfbWVzYV9iemVybygmcywgc2l6ZW9mKHMpKTsKKwlzLkN0eCA9IGN0eDsKKwlzLlByb2dyYW0gPSBwOworCXMuRGVzY3IgPSBkZXNjcjsKKwlzLkRlc2NyLT5Jbml0KCZzKTsKKwlzLklQID0gcC0+TnVtSW5zdHJ1Y3Rpb25zOworCisJd2hpbGUocy5JUCA+IDApIHsKKwkJcy5JUC0tOworCQlwcm9jZXNzX2luc3RydWN0aW9uKCZzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9ucXNzYWRjZS5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fbnFzc2FkY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY5NGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fbnFzc2FkY2UuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY29sYWkgSGFlaG5sZS4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fUkFERU9OX1BST0dSQU1fTlFTU0FEQ0VfSF8KKyNkZWZpbmUgX19SQURFT05fUFJPR1JBTV9OUVNTQURDRV9IXworCisjaW5jbHVkZSAicmFkZW9uX3Byb2dyYW0uaCIKKworCitzdHJ1Y3QgcmVnaXN0ZXJfc3RhdGUgeworCS8qKgorCSAqIEJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBjb21wb25lbnRzIG9mIHRoZSByZWdpc3RlciBhcmUgc291cmNlZAorCSAqIGJ5IGxhdGVyIGluc3RydWN0aW9ucy4KKwkgKi8KKwlHTHVpbnQgU291cmNlZCA6IDQ7Cit9OworCisvKioKKyAqIE1haW50YWluIHN0YXRlIHN1Y2ggYXMgd2hpY2ggcmVnaXN0ZXJzIGFyZSB1c2VkLCB3aGljaCByZWdpc3RlcnMgYXJlCisgKiByZWFkIGZyb20sIGV0Yy4KKyAqLworc3RydWN0IG5xc3NhZGNlX3N0YXRlIHsKKwlHTGNvbnRleHQgKkN0eDsKKwlzdHJ1Y3QgZ2xfcHJvZ3JhbSAqUHJvZ3JhbTsKKwlzdHJ1Y3QgcmFkZW9uX25xc3NhZGNlX2Rlc2NyICpEZXNjcjsKKworCS8qKgorCSAqIEFsbCBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhpcyBpbnN0cnVjdGlvbiBwb2ludGVyIGhhdmUgYmVlbiBkZWFsdCB3aXRoLgorCSAqLworCWludCBJUDsKKworCS8qKgorCSAqIFdoaWNoIHJlZ2lzdGVycyBhcmUgcmVhZCBieSBzdWJzZXF1ZW50IGluc3RydWN0aW9ucz8KKwkgKi8KKwlzdHJ1Y3QgcmVnaXN0ZXJfc3RhdGUgVGVtcHNbTUFYX1BST0dSQU1fVEVNUFNdOworCXN0cnVjdCByZWdpc3Rlcl9zdGF0ZSBPdXRwdXRzW1ZFUlRfUkVTVUxUX01BWF07Cit9OworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaGFyZHdhcmUgaW4tc28tZmFyIGFzCisgKiBpdCBpcyByZXF1aXJlZCBmb3IgdGhlIE5xU1NBLURDRSBwYXNzLgorICovCitzdHJ1Y3QgcmFkZW9uX25xc3NhZGNlX2Rlc2NyIHsKKwkvKioKKwkgKiBGaWxsIGluIHdoaWNoIG91dHB1dHMKKwkgKi8KKwl2b2lkICgqSW5pdCkoc3RydWN0IG5xc3NhZGNlX3N0YXRlICopOworCisJLyoqCisJICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gc3dpenpsZSwgYWJzb2x1dGUgYW5kIG5lZ2F0ZSBjb21iaW5hdGlvbgorCSAqIGNhbiBiZSBpbXBsZW1lbnRlZCBuYXRpdmVseSBieSB0aGUgaGFyZHdhcmUgZm9yIHRoaXMgb3Bjb2RlLgorCSAqLworCUdMYm9vbGVhbiAoKklzTmF0aXZlU3dpenpsZSkoR0x1aW50IG9wY29kZSwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHJlZyk7CisKKwkvKioKKwkgKiBFbWl0IChhdCB0aGUgY3VycmVudCBJUCkgdGhlIGluc3RydWN0aW9uIE1PViBkc3QsIHNyYzsKKwkgKiBUaGUgdHJhbnNmb3JtYXRpb24gd2lsbCB3b3JrIHJlY3Vyc2l2ZWx5IG9uIHRoZSBlbWl0dGVkIGluc3RydWN0aW9uKHMpLgorCSAqLworCXZvaWQgKCpCdWlsZFN3aXp6bGUpKHN0cnVjdCBucXNzYWRjZV9zdGF0ZSosIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3QsIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMpOworCisJLyoqCisJICogUmV3cml0ZSBpbnN0cnVjdGlvbnMgdGhhdCB3cml0ZSB0byBERVBSLnogdG8gd3JpdGUgdG8gREVQUi53CisJICogaW5zdGVhZCAocmV3cml0aW5nIGlzIGRvbmUgKmJlZm9yZSogdGhlIFdyaXRlTWFzayB0ZXN0KS4KKwkgKi8KKwlHTGJvb2xlYW4gUmV3cml0ZURlcHRoT3V0OworCXZvaWQgKkRhdGE7Cit9OworCit2b2lkIHJhZGVvbk5xc3NhRGNlKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcCwgc3RydWN0IHJhZGVvbl9ucXNzYWRjZV9kZXNjciogZGVzY3IpOworCisjZW5kaWYgLyogX19SQURFT05fUFJPR1JBTV9OUVNTQURDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWU3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmljb2xhaSBIYWVobmxlLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJyYWRlb25fcHJvZ3JhbS5oIgorCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfcHJpbnQuaCIKKworCisvKioKKyAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gY2xhdXNlIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogIDEuIFJlcGxhY2UgaXQgd2l0aCBhbiBlbXB0eSBjbGF1c2UKKyAqICAyLiBGb3IgZXZlcnkgaW5zdHJ1Y3Rpb24gaW4gdGhlIG9yaWdpbmFsIGNsYXVzZSwgdHJ5IHRoZSBnaXZlbgorICogICAgIHRyYW5zZm9ybWF0aW9ucyBpbiBvcmRlci4KKyAqICAzLiBJZiBvbmUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyByZXR1cm5zIEdMX1RSVUUsIGFzc3VtZSB0aGF0IGl0CisgKiAgICAgaGFzIGVtaXR0ZWQgdGhlIGFwcHJvcHJpYXRlIGluc3RydWN0aW9uKHMpIGludG8gdGhlIG5ldyBjbGF1c2U7CisgKiAgICAgb3RoZXJ3aXNlLCBjb3B5IHRoZSBpbnN0cnVjdGlvbiB2ZXJiYXRpbS4KKyAqCisgKiBcbm90ZSBUaGUgdHJhbnNmb3JtYXRpb24gaXMgY3VycmVudGx5IG5vdCByZWN1cnNpdmU7IGluIG90aGVyIHdvcmRzLAorICogaW5zdHJ1Y3Rpb25zIGVtaXR0ZWQgYnkgdHJhbnNmb3JtYXRpb25zIGFyZSBub3QgdHJhbnNmb3JtZWQuCisgKgorICogXG5vdGUgVGhlIHRyYW5zZm9ybSBpcyBjYWxsZWQgJ2xvY2FsJyBiZWNhdXNlIGl0IGNhbiBvbmx5IGxvb2sgYXQKKyAqIG9uZSBpbnN0cnVjdGlvbiBhdCBhIHRpbWUuCisgKi8KK3ZvaWQgcmFkZW9uTG9jYWxUcmFuc2Zvcm0oCisJR0xjb250ZXh0ICpDdHgsCisJc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0sCisJaW50IG51bV90cmFuc2Zvcm1hdGlvbnMsCisJc3RydWN0IHJhZGVvbl9wcm9ncmFtX3RyYW5zZm9ybWF0aW9uKiB0cmFuc2Zvcm1hdGlvbnMpCit7CisJc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCBjdHg7CisJaW50IGlwOworCisJY3R4LkN0eCA9IEN0eDsKKwljdHguUHJvZ3JhbSA9IHByb2dyYW07CisJY3R4Lk9sZEluc3RydWN0aW9ucyA9IHByb2dyYW0tPkluc3RydWN0aW9uczsKKwljdHguT2xkTnVtSW5zdHJ1Y3Rpb25zID0gcHJvZ3JhbS0+TnVtSW5zdHJ1Y3Rpb25zOworCisJcHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zID0gMDsKKwlwcm9ncmFtLT5OdW1JbnN0cnVjdGlvbnMgPSAwOworCisJZm9yKGlwID0gMDsgaXAgPCBjdHguT2xkTnVtSW5zdHJ1Y3Rpb25zOyArK2lwKSB7CisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ciA9IGN0eC5PbGRJbnN0cnVjdGlvbnMgKyBpcDsKKwkJaW50IGk7CisKKwkJZm9yKGkgPSAwOyBpIDwgbnVtX3RyYW5zZm9ybWF0aW9uczsgKytpKSB7CisJCQlzdHJ1Y3QgcmFkZW9uX3Byb2dyYW1fdHJhbnNmb3JtYXRpb24qIHQgPSB0cmFuc2Zvcm1hdGlvbnMgKyBpOworCisJCQlpZiAodC0+ZnVuY3Rpb24oJmN0eCwgaW5zdHIsIHQtPnVzZXJEYXRhKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID49IG51bV90cmFuc2Zvcm1hdGlvbnMpIHsKKwkJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBkZXN0ID0gcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHByb2dyYW0sIDEpOworCQkJX21lc2FfY29weV9pbnN0cnVjdGlvbnMoZGVzdCwgaW5zdHIsIDEpOworCQl9CisJfQorCisJX21lc2FfZnJlZV9pbnN0cnVjdGlvbnMoY3R4Lk9sZEluc3RydWN0aW9ucywgY3R4Lk9sZE51bUluc3RydWN0aW9ucyk7Cit9CisKKworc3RhdGljIHZvaWQgc2Nhbl9pbnN0cnVjdGlvbnMoR0xib29sZWFuKiB1c2VkLCBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdHMsIEdMdWludCBjb3VudCkKK3sKKwlHTHVpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IGluc3RzICsgaTsKKwkJY29uc3QgR0x1aW50IG4gPSBfbWVzYV9udW1faW5zdF9zcmNfcmVncyhpbnN0LT5PcGNvZGUpOworCQlHTHVpbnQgazsKKworCQlmb3IgKGsgPSAwOyBrIDwgbjsgaysrKSB7CisJCQlpZiAoaW5zdC0+U3JjUmVnW2tdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpCisJCQkJdXNlZFtpbnN0LT5TcmNSZWdba10uSW5kZXhdID0gR0xfVFJVRTsKKwkJfQorCX0KK30KKworR0xpbnQgcmFkZW9uRmluZEZyZWVUZW1wb3Jhcnkoc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCAqdCkKK3sKKwlHTGJvb2xlYW4gdXNlZFtNQVhfUFJPR1JBTV9URU1QU107CisJR0x1aW50IGk7CisKKwlfbWVzYV9tZW1zZXQodXNlZCwgMCwgc2l6ZW9mKHVzZWQpKTsKKwlzY2FuX2luc3RydWN0aW9ucyh1c2VkLCB0LT5Qcm9ncmFtLT5JbnN0cnVjdGlvbnMsIHQtPlByb2dyYW0tPk51bUluc3RydWN0aW9ucyk7CisJc2Nhbl9pbnN0cnVjdGlvbnModXNlZCwgdC0+T2xkSW5zdHJ1Y3Rpb25zLCB0LT5PbGROdW1JbnN0cnVjdGlvbnMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9QUk9HUkFNX1RFTVBTOyBpKyspIHsKKwkJaWYgKCF1c2VkW2ldKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogQXBwZW5kIHRoZSBnaXZlbiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBwcm9ncmFtIGFuZCByZXR1cm4gYQorICogcG9pbnRlciB0byB0aGUgZmlyc3QgbmV3IGluc3RydWN0aW9uLgorICovCitzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9ncmFtLCBpbnQgY291bnQpCit7CisJaW50IG9sZG51bSA9IHByb2dyYW0tPk51bUluc3RydWN0aW9uczsKKwlfbWVzYV9pbnNlcnRfaW5zdHJ1Y3Rpb25zKHByb2dyYW0sIG9sZG51bSwgY291bnQpOworCXJldHVybiBwcm9ncmFtLT5JbnN0cnVjdGlvbnMgKyBvbGRudW07Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwMWRkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX3Byb2dyYW0uaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY29sYWkgSGFlaG5sZS4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fUkFERU9OX1BST0dSQU1fSF8KKyNkZWZpbmUgX19SQURFT05fUFJPR1JBTV9IXworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJlbnVtcy5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9ncmFtLmgiCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKKworCitlbnVtIHsKKwlDTEFVU0VfTUlYRUQgPSAwLAorCUNMQVVTRV9BTFUsCisJQ0xBVVNFX1RFWAorfTsKKworZW51bSB7CisJUFJPR1JBTV9CVUlMVElOID0gUFJPR1JBTV9GSUxFX01BWCAvKio8IG5vdCBhIHJlYWwgcmVnaXN0ZXIsIGJ1dCBhIHNwZWNpYWwgc3dpenpsZSBjb25zdGFudCAqLworfTsKKworZW51bSB7CisJT1BDT0RFX1JFUExfQUxQSEEgPSBNQVhfT1BDT0RFIC8qKjwgdXNlZCBpbiBwYWlyZWQgaW5zdHJ1Y3Rpb25zICovCit9OworCisjZGVmaW5lIFNXSVpaTEVfMDAwMCBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWkVSTywgU1dJWlpMRV9aRVJPLCBTV0laWkxFX1pFUk8sIFNXSVpaTEVfWkVSTykKKyNkZWZpbmUgU1dJWlpMRV8xMTExIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9PTkUsIFNXSVpaTEVfT05FLCBTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUpCisKKy8qKgorICogVHJhbnNmb3JtYXRpb24gY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byBsb2NhbCB0cmFuc2Zvcm1hdGlvbnMuCisgKgorICogQ2FyZSBtdXN0IGJlIHRha2VuIHdpdGggc29tZSBvcGVyYXRpb25zIGR1cmluZyB0cmFuc2Zvcm1hdGlvbiwKKyAqIGUuZy4gZmluZGluZyBuZXcgdGVtcG9yYXJ5IHJlZ2lzdGVycyBtdXN0IHVzZSBAcmVmIHJhZGVvbkZpbmRGcmVlVGVtcG9yYXJ5CisgKi8KK3N0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQgeworCUdMY29udGV4dCAqQ3R4OworCXN0cnVjdCBnbF9wcm9ncmFtICpQcm9ncmFtOworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpPbGRJbnN0cnVjdGlvbnM7CisJR0x1aW50IE9sZE51bUluc3RydWN0aW9uczsKK307CisKKy8qKgorICogQSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gXHJlZiByYWRlb25Mb2NhbFRyYW5zZm9ybS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KKyAqIEl0IGhhcyB0byBlaXRoZXIgZW1pdCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNmb3JtZWQgY29kZSBmb3IgdGhlIGluc3RydWN0aW9uCisgKiBhbmQgcmV0dXJuIEdMX1RSVUUsIG9yIHJldHVybiBHTF9GQUxTRSBpZiBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlCisgKiBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUgZnVuY3Rpb24gZ2V0cyBwYXNzZWQgdGhlIHVzZXJEYXRhIGFzIGxhc3QgcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgcmFkZW9uX3Byb2dyYW1fdHJhbnNmb3JtYXRpb24geworCUdMYm9vbGVhbiAoKmZ1bmN0aW9uKSgKKwkJc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCosCisJCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiwKKwkJdm9pZCopOworCXZvaWQgKnVzZXJEYXRhOworfTsKKwordm9pZCByYWRlb25Mb2NhbFRyYW5zZm9ybSgKKwlHTGNvbnRleHQqIGN0eCwKKwlzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSwKKwlpbnQgbnVtX3RyYW5zZm9ybWF0aW9ucywKKwlzdHJ1Y3QgcmFkZW9uX3Byb2dyYW1fdHJhbnNmb3JtYXRpb24qIHRyYW5zZm9ybWF0aW9ucyk7CisKKy8qKgorICogRmluZCBhIHVzYWJsZSBmcmVlIHRlbXBvcmFyeSByZWdpc3RlciBkdXJpbmcgcHJvZ3JhbSB0cmFuc2Zvcm1hdGlvbgorICovCitHTGludCByYWRlb25GaW5kRnJlZVRlbXBvcmFyeShzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0ICpjdHgpOworCitzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqcmFkZW9uQXBwZW5kSW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9ncmFtLCBpbnQgY291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX3Byb2dyYW1fYWx1LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtX2FsdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjcxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtX2FsdS5jCkBAIC0wLDAgKzEsNjU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY29sYWkgSGFlaG5sZS4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKioKKyAqIEBmaWxlCisgKgorICogU2hhcmVhYmxlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IHRyYW5zZm9ybSAic3BlY2lhbCIgQUxVIGluc3RydWN0aW9ucworICogaW50byBBTFUgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInJhZGVvbl9wcm9ncmFtX2FsdS5oIgorCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfcGFyYW1ldGVyLmgiCisKKworc3RhdGljIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICplbWl0MShzdHJ1Y3QgZ2xfcHJvZ3JhbSogcCwKKwlnbF9pbnN0X29wY29kZSBPcGNvZGUsIEdMdWludCBTYXR1cmF0ZSwgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIERzdFJlZywKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgU3JjUmVnKQoreworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpmcGkgPSByYWRlb25BcHBlbmRJbnN0cnVjdGlvbnMocCwgMSk7CisKKwlmcGktPk9wY29kZSA9IE9wY29kZTsKKwlmcGktPlNhdHVyYXRlTW9kZSA9IFNhdHVyYXRlOworCWZwaS0+RHN0UmVnID0gRHN0UmVnOworCWZwaS0+U3JjUmVnWzBdID0gU3JjUmVnOworCXJldHVybiBmcGk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZW1pdDIoc3RydWN0IGdsX3Byb2dyYW0qIHAsCisJZ2xfaW5zdF9vcGNvZGUgT3Bjb2RlLCBHTHVpbnQgU2F0dXJhdGUsIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBEc3RSZWcsCisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIFNyY1JlZzAsIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBTcmNSZWcxKQoreworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpmcGkgPSByYWRlb25BcHBlbmRJbnN0cnVjdGlvbnMocCwgMSk7CisKKwlmcGktPk9wY29kZSA9IE9wY29kZTsKKwlmcGktPlNhdHVyYXRlTW9kZSA9IFNhdHVyYXRlOworCWZwaS0+RHN0UmVnID0gRHN0UmVnOworCWZwaS0+U3JjUmVnWzBdID0gU3JjUmVnMDsKKwlmcGktPlNyY1JlZ1sxXSA9IFNyY1JlZzE7CisJcmV0dXJuIGZwaTsKK30KKworc3RhdGljIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICplbWl0MyhzdHJ1Y3QgZ2xfcHJvZ3JhbSogcCwKKwlnbF9pbnN0X29wY29kZSBPcGNvZGUsIEdMdWludCBTYXR1cmF0ZSwgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIERzdFJlZywKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgU3JjUmVnMCwgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIFNyY1JlZzEsCisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIFNyY1JlZzIpCit7CisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmZwaSA9IHJhZGVvbkFwcGVuZEluc3RydWN0aW9ucyhwLCAxKTsKKworCWZwaS0+T3Bjb2RlID0gT3Bjb2RlOworCWZwaS0+U2F0dXJhdGVNb2RlID0gU2F0dXJhdGU7CisJZnBpLT5Ec3RSZWcgPSBEc3RSZWc7CisJZnBpLT5TcmNSZWdbMF0gPSBTcmNSZWcwOworCWZwaS0+U3JjUmVnWzFdID0gU3JjUmVnMTsKKwlmcGktPlNyY1JlZ1syXSA9IFNyY1JlZzI7CisJcmV0dXJuIGZwaTsKK30KKworc3RhdGljIHZvaWQgc2V0X3N3aXp6bGUoc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpTcmNSZWcsIGludCBjb29yZGluYXRlLCBpbnQgc3d6KQoreworCVNyY1JlZy0+U3dpenpsZSAmPSB+KDcgPDwgKDMqY29vcmRpbmF0ZSkpOworCVNyY1JlZy0+U3dpenpsZSB8PSBzd3ogPDwgKDMqY29vcmRpbmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9uZWdhdGVfYmFzZShzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKlNyY1JlZywgaW50IGNvb3JkaW5hdGUsIGludCBuZWdhdGUpCit7CisJU3JjUmVnLT5OZWdhdGVCYXNlICY9IH4oMSA8PCBjb29yZGluYXRlKTsKKwlTcmNSZWctPk5lZ2F0ZUJhc2UgfD0gKG5lZ2F0ZSA8PCBjb29yZGluYXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3RyZWcoaW50IGZpbGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgZHN0OworCWRzdC5GaWxlID0gZmlsZTsKKwlkc3QuSW5kZXggPSBpbmRleDsKKwlkc3QuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisJZHN0LkNvbmRNYXNrID0gQ09ORF9UUjsKKwlkc3QuQ29uZFN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisJZHN0LkNvbmRTcmMgPSAwOworCWRzdC5wYWQgPSAwOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgZHN0cmVndG1wbWFzayhpbnQgaW5kZXgsIGludCBtYXNrKQoreworCXN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3Q7CisJZHN0LkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKwlkc3QuSW5kZXggPSBpbmRleDsKKwlkc3QuV3JpdGVNYXNrID0gbWFzazsKKwlkc3QuQ29uZE1hc2sgPSBDT05EX1RSOworCWRzdC5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKwlkc3QuQ29uZFNyYyA9IDA7CisJZHN0LnBhZCA9IDA7CisJcmV0dXJuIGRzdDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBidWlsdGluX3plcm8gPSB7CisJLkZpbGUgPSBQUk9HUkFNX0JVSUxUSU4sCisJLkluZGV4ID0gMCwKKwkuU3dpenpsZSA9IFNXSVpaTEVfMDAwMAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgYnVpbHRpbl9vbmUgPSB7CisJLkZpbGUgPSBQUk9HUkFNX0JVSUxUSU4sCisJLkluZGV4ID0gMCwKKwkuU3dpenpsZSA9IFNXSVpaTEVfMTExMQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjcmVnX3VuZGVmaW5lZCA9IHsKKwkuRmlsZSA9IFBST0dSQU1fVU5ERUZJTkVELAorCS5JbmRleCA9IDAsCisJLlN3aXp6bGUgPSBTV0laWkxFX05PT1AKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjcmVnKGludCBmaWxlLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYyA9IHNyY3JlZ191bmRlZmluZWQ7CisJc3JjLkZpbGUgPSBmaWxlOworCXNyYy5JbmRleCA9IGluZGV4OworCXJldHVybiBzcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjcmVnc3d6KGludCBmaWxlLCBpbnQgaW5kZXgsIGludCBzd3opCit7CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYyA9IHNyY3JlZ191bmRlZmluZWQ7CisJc3JjLkZpbGUgPSBmaWxlOworCXNyYy5JbmRleCA9IGluZGV4OworCXNyYy5Td2l6emxlID0gc3d6OworCXJldHVybiBzcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgYWJzb2x1dGUoc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHJlZykKK3sKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgbmV3cmVnID0gcmVnOworCW5ld3JlZy5BYnMgPSAxOworCW5ld3JlZy5OZWdhdGVCYXNlID0gMDsKKwluZXdyZWcuTmVnYXRlQWJzID0gMDsKKwlyZXR1cm4gbmV3cmVnOworfQorCitzdGF0aWMgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIG5lZ2F0ZShzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgcmVnKQoreworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBuZXdyZWcgPSByZWc7CisJbmV3cmVnLk5lZ2F0ZUFicyA9ICFuZXdyZWcuTmVnYXRlQWJzOworCXJldHVybiBuZXdyZWc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3dpenpsZShzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgcmVnLCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdykKK3sKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3dpenpsZWQgPSByZWc7CisJc3dpenpsZWQuU3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoCisJCXggPj0gNCA/IHggOiBHRVRfU1daKHJlZy5Td2l6emxlLCB4KSwKKwkJeSA+PSA0ID8geSA6IEdFVF9TV1oocmVnLlN3aXp6bGUsIHkpLAorCQl6ID49IDQgPyB6IDogR0VUX1NXWihyZWcuU3dpenpsZSwgeiksCisJCXcgPj0gNCA/IHcgOiBHRVRfU1daKHJlZy5Td2l6emxlLCB3KSk7CisJcmV0dXJuIHN3aXp6bGVkOworfQorCitzdGF0aWMgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNjYWxhcihzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgcmVnKQoreworCXJldHVybiBzd2l6emxlKHJlZywgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX0FCUyhzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0KQoreworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMgPSBpbnN0LT5TcmNSZWdbMF07CisJc3JjLkFicyA9IDE7CisJc3JjLk5lZ2F0ZUJhc2UgPSAwOworCXNyYy5OZWdhdGVBYnMgPSAwOworCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9NT1YsIGluc3QtPlNhdHVyYXRlTW9kZSwgaW5zdC0+RHN0UmVnLCBzcmMpOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fRFBIKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYzAgPSBpbnN0LT5TcmNSZWdbMF07CisJaWYgKHNyYzAuTmVnYXRlQWJzKSB7CisJCWlmIChzcmMwLkFicykgeworCQkJaW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKwkJCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9NT1YsIDAsIGRzdHJlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIHNyYzApOworCQkJc3JjMCA9IHNyY3JlZyhzcmMwLkZpbGUsIHNyYzAuSW5kZXgpOworCQl9IGVsc2UgeworCQkJc3JjMC5OZWdhdGVBYnMgPSAwOworCQkJc3JjMC5OZWdhdGVCYXNlIF49IE5FR0FURV9YWVpXOworCQl9CisJfQorCXNldF9zd2l6emxlKCZzcmMwLCAzLCBTV0laWkxFX09ORSk7CisJc2V0X25lZ2F0ZV9iYXNlKCZzcmMwLCAzLCAwKTsKKwllbWl0Mih0LT5Qcm9ncmFtLCBPUENPREVfRFA0LCBpbnN0LT5TYXR1cmF0ZU1vZGUsIGluc3QtPkRzdFJlZywgc3JjMCwgaW5zdC0+U3JjUmVnWzFdKTsKK30KKworLyoqCisgKiBbMSwgc3JjMC55KnNyYzEueSwgc3JjMC56LCBzcmMxLnddCisgKiBTbyBiYXNpY2FsbHkgTVVMIHdpdGggbG90c2Egc3dpenpsaW5nLgorICovCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fRFNUKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX01VTCwgaW5zdC0+U2F0dXJhdGVNb2RlLCBpbnN0LT5Ec3RSZWcsCisJCXN3aXp6bGUoaW5zdC0+U3JjUmVnWzBdLCBTV0laWkxFX09ORSwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfT05FKSwKKwkJc3dpenpsZShpbnN0LT5TcmNSZWdbMV0sIFNXSVpaTEVfT05FLCBTV0laWkxFX1ksIFNXSVpaTEVfT05FLCBTV0laWkxFX1cpKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX0ZMUihzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0KQoreworCWludCB0ZW1wcmVnID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX0ZSQywgMCwgZHN0cmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgaW5zdC0+U3JjUmVnWzBdKTsKKwllbWl0Mih0LT5Qcm9ncmFtLCBPUENPREVfQURELCBpbnN0LT5TYXR1cmF0ZU1vZGUsIGluc3QtPkRzdFJlZywKKwkJaW5zdC0+U3JjUmVnWzBdLCBuZWdhdGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSkpOworfQorCisvKioKKyAqIERlZmluaXRpb24gb2YgTElUIChmcm9tIEFSQl9mcmFnbWVudF9wcm9ncmFtKToKKyAqCisgKiAgdG1wID0gVmVjdG9yTG9hZChvcDApOworICogIGlmICh0bXAueCA8IDApIHRtcC54ID0gMDsKKyAqICBpZiAodG1wLnkgPCAwKSB0bXAueSA9IDA7CisgKiAgaWYgKHRtcC53IDwgLSgxMjguMC1lcHNpbG9uKSkgdG1wLncgPSAtKDEyOC4wLWVwc2lsb24pOworICogIGVsc2UgaWYgKHRtcC53ID4gMTI4LWVwc2lsb24pIHRtcC53ID0gMTI4LWVwc2lsb247CisgKiAgcmVzdWx0LnggPSAxLjA7CisgKiAgcmVzdWx0LnkgPSB0bXAueDsKKyAqICByZXN1bHQueiA9ICh0bXAueCA+IDApID8gUm91Z2hBcHByb3hQb3dlcih0bXAueSwgdG1wLncpIDogMC4wOworICogIHJlc3VsdC53ID0gMS4wOworICoKKyAqIFRoZSBsb25nZXN0IHBhdGggb2YgY29tcHV0YXRpb24gaXMgdGhlIG9uZSBsZWFkaW5nIHRvIHJlc3VsdC56LAorICogY29uc2lzdGluZyBvZiA1IG9wZXJhdGlvbnMuIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgTElUIHRha2VzCisgKiA1IHNsb3RzLCBpZiB0aGUgc3Vic2VxdWVudCBvcHRpbWl6YXRpb24gcGFzc2VzIGFyZSBjbGV2ZXIgZW5vdWdoCisgKiB0byBwYWlyIGluc3RydWN0aW9ucyBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHRyYW5zZm9ybV9MSVQoc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCogdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCkKK3sKKwlzdGF0aWMgY29uc3QgR0xmbG9hdCBMaXRDb25zdFs0XSA9IHsgLTEyNy45OTk5OTkgfTsKKworCUdMdWludCBjb25zdGFudDsKKwlHTHVpbnQgY29uc3RhbnRfc3dpenpsZTsKKwlHTHVpbnQgdGVtcDsKKwlpbnQgbmVlZFRlbXBvcmFyeSA9IDA7CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyY3RlbXA7CisKKwljb25zdGFudCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHQtPlByb2dyYW0tPlBhcmFtZXRlcnMsIExpdENvbnN0LCAxLCAmY29uc3RhbnRfc3dpenpsZSk7CisKKwlpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAhPSBXUklURU1BU0tfWFlaVykgeworCQluZWVkVGVtcG9yYXJ5ID0gMTsKKwl9IGVsc2UgaWYgKGluc3QtPkRzdFJlZy5GaWxlICE9IFBST0dSQU1fVEVNUE9SQVJZKSB7CisJCS8vIExJVCBpcyB0eXBpY2FsbHkgZm9sbG93ZWQgYnkgRFAzL0RQNCwgc28gdGhlcmUncyBubyBwb2ludAorCQkvLyBpbiBjcmVhdGluZyBzcGVjaWFsIGNvZGUgZm9yIHRoaXMgY2FzZQorCQluZWVkVGVtcG9yYXJ5ID0gMTsKKwl9CisKKwlpZiAobmVlZFRlbXBvcmFyeSkgeworCQl0ZW1wID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisJfSBlbHNlIHsKKwkJdGVtcCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKwl9CisJc3JjdGVtcCA9IHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcCk7CisKKwkvLyB0bXAueCA9IG1heCgwLjAsIFNyYy54KTsKKwkvLyB0bXAueSA9IG1heCgwLjAsIFNyYy55KTsKKwkvLyB0bXAudyA9IGNsYW1wKFNyYy56LCAtMTI4K2VwcywgMTI4LWVwcyk7CisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX01BWCwgMCwKKwkJZHN0cmVndG1wbWFzayh0ZW1wLCBXUklURU1BU0tfWFlXKSwKKwkJaW5zdC0+U3JjUmVnWzBdLAorCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudCksCisJCQlTV0laWkxFX1pFUk8sIFNXSVpaTEVfWkVSTywgU1dJWlpMRV9aRVJPLCBjb25zdGFudF9zd2l6emxlJjMpKTsKKwllbWl0Mih0LT5Qcm9ncmFtLCBPUENPREVfTUlOLCAwLAorCQlkc3RyZWd0bXBtYXNrKHRlbXAsIFdSSVRFTUFTS19aKSwKKwkJc3dpenpsZShzcmN0ZW1wLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpLAorCQluZWdhdGUoc3JjcmVnc3d6KFBST0dSQU1fQ09OU1RBTlQsIGNvbnN0YW50LCBjb25zdGFudF9zd2l6emxlKSkpOworCisJLy8gdG1wLncgPSBQb3codG1wLnksIHRtcC53KQorCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9MRzIsIDAsCisJCWRzdHJlZ3RtcG1hc2sodGVtcCwgV1JJVEVNQVNLX1cpLAorCQlzd2l6emxlKHNyY3RlbXAsIFNXSVpaTEVfWSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSkpOworCWVtaXQyKHQtPlByb2dyYW0sIE9QQ09ERV9NVUwsIDAsCisJCWRzdHJlZ3RtcG1hc2sodGVtcCwgV1JJVEVNQVNLX1cpLAorCQlzd2l6emxlKHNyY3RlbXAsIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVyksCisJCXN3aXp6bGUoc3JjdGVtcCwgU1dJWlpMRV9aLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aKSk7CisJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX0VYMiwgMCwKKwkJZHN0cmVndG1wbWFzayh0ZW1wLCBXUklURU1BU0tfVyksCisJCXN3aXp6bGUoc3JjdGVtcCwgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XKSk7CisKKwkvLyB0bXAueiA9ICh0bXAueCA+IDApID8gdG1wLncgOiAwLjAKKwllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfQ01QLCBpbnN0LT5TYXR1cmF0ZU1vZGUsCisJCWRzdHJlZ3RtcG1hc2sodGVtcCwgV1JJVEVNQVNLX1opLAorCQluZWdhdGUoc3dpenpsZShzcmN0ZW1wLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gpKSwKKwkJc3dpenpsZShzcmN0ZW1wLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpLAorCQlidWlsdGluX3plcm8pOworCisJLy8gdG1wLngsIHRtcC55LCB0bXAudyA9IDEuMCwgdG1wLngsIDEuMAorCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9NT1YsIGluc3QtPlNhdHVyYXRlTW9kZSwKKwkJZHN0cmVndG1wbWFzayh0ZW1wLCBXUklURU1BU0tfWFlXKSwKKwkJc3dpenpsZShzcmN0ZW1wLCBTV0laWkxFX09ORSwgU1dJWlpMRV9YLCBTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUpKTsKKworCWlmIChuZWVkVGVtcG9yYXJ5KQorCQllbWl0MSh0LT5Qcm9ncmFtLCBPUENPREVfTU9WLCAwLCBpbnN0LT5Ec3RSZWcsIHNyY3RlbXApOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fTFJQKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJaW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKworCWVtaXQyKHQtPlByb2dyYW0sIE9QQ09ERV9BREQsIDAsCisJCWRzdHJlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksCisJCWluc3QtPlNyY1JlZ1sxXSwgbmVnYXRlKGluc3QtPlNyY1JlZ1syXSkpOworCWVtaXQzKHQtPlByb2dyYW0sIE9QQ09ERV9NQUQsIGluc3QtPlNhdHVyYXRlTW9kZSwKKwkJaW5zdC0+RHN0UmVnLAorCQlpbnN0LT5TcmNSZWdbMF0sIHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIGluc3QtPlNyY1JlZ1syXSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybV9QT1coc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCogdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCkKK3sKKwlpbnQgdGVtcHJlZyA9IHJhZGVvbkZpbmRGcmVlVGVtcG9yYXJ5KHQpOworCXN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciB0ZW1wZHN0ID0gZHN0cmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKTsKKwlzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgdGVtcHNyYyA9IHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyk7CisJdGVtcGRzdC5Xcml0ZU1hc2sgPSBXUklURU1BU0tfVzsKKwl0ZW1wc3JjLlN3aXp6bGUgPSBTV0laWkxFX1dXV1c7CisKKwllbWl0MSh0LT5Qcm9ncmFtLCBPUENPREVfTEcyLCAwLCB0ZW1wZHN0LCBzY2FsYXIoaW5zdC0+U3JjUmVnWzBdKSk7CisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX01VTCwgMCwgdGVtcGRzdCwgdGVtcHNyYywgc2NhbGFyKGluc3QtPlNyY1JlZ1sxXSkpOworCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9FWDIsIGluc3QtPlNhdHVyYXRlTW9kZSwgaW5zdC0+RHN0UmVnLCB0ZW1wc3JjKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX1JTUShzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0KQoreworCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9SU1EsIGluc3QtPlNhdHVyYXRlTW9kZSwgaW5zdC0+RHN0UmVnLCBhYnNvbHV0ZShpbnN0LT5TcmNSZWdbMF0pKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX1NHRShzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0KQoreworCWludCB0ZW1wcmVnID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisKKwllbWl0Mih0LT5Qcm9ncmFtLCBPUENPREVfQURELCAwLCBkc3RyZWcoUFJPR1JBTV9URU1QT1JBUlksIHRlbXByZWcpLCBpbnN0LT5TcmNSZWdbMF0sIG5lZ2F0ZShpbnN0LT5TcmNSZWdbMV0pKTsKKwllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfQ01QLCBpbnN0LT5TYXR1cmF0ZU1vZGUsIGluc3QtPkRzdFJlZywKKwkJc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgYnVpbHRpbl96ZXJvLCBidWlsdGluX29uZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybV9TTFQoc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCogdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCkKK3sKKwlpbnQgdGVtcHJlZyA9IHJhZGVvbkZpbmRGcmVlVGVtcG9yYXJ5KHQpOworCisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX0FERCwgMCwgZHN0cmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgaW5zdC0+U3JjUmVnWzBdLCBuZWdhdGUoaW5zdC0+U3JjUmVnWzFdKSk7CisJZW1pdDModC0+UHJvZ3JhbSwgT1BDT0RFX0NNUCwgaW5zdC0+U2F0dXJhdGVNb2RlLCBpbnN0LT5Ec3RSZWcsCisJCXNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIGJ1aWx0aW5fb25lLCBidWlsdGluX3plcm8pOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fU1VCKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX0FERCwgaW5zdC0+U2F0dXJhdGVNb2RlLCBpbnN0LT5Ec3RSZWcsIGluc3QtPlNyY1JlZ1swXSwgbmVnYXRlKGluc3QtPlNyY1JlZ1sxXSkpOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fU1daKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qIGluc3QpCit7CisJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX01PViwgaW5zdC0+U2F0dXJhdGVNb2RlLCBpbnN0LT5Ec3RSZWcsIGluc3QtPlNyY1JlZ1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybV9YUEQoc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCogdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCkKK3sKKwlpbnQgdGVtcHJlZyA9IHJhZGVvbkZpbmRGcmVlVGVtcG9yYXJ5KHQpOworCisJZW1pdDIodC0+UHJvZ3JhbSwgT1BDT0RFX01VTCwgMCwgZHN0cmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwKKwkJc3dpenpsZShpbnN0LT5TcmNSZWdbMF0sIFNXSVpaTEVfWiwgU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfVyksCisJCXN3aXp6bGUoaW5zdC0+U3JjUmVnWzFdLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9YLCBTV0laWkxFX1cpKTsKKwllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfTUFELCBpbnN0LT5TYXR1cmF0ZU1vZGUsIGluc3QtPkRzdFJlZywKKwkJc3dpenpsZShpbnN0LT5TcmNSZWdbMF0sIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1gsIFNXSVpaTEVfVyksCisJCXN3aXp6bGUoaW5zdC0+U3JjUmVnWzFdLCBTV0laWkxFX1osIFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1cpLAorCQluZWdhdGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSkpOworfQorCisKKy8qKgorICogQ2FuIGJlIHVzZWQgYXMgYSB0cmFuc2Zvcm1hdGlvbiBmb3IgQHJlZiByYWRlb25DbGF1c2VMb2NhbFRyYW5zZm9ybSwKKyAqIG5vIHVzZXJEYXRhIG5lY2Vzc2FyeS4KKyAqCisgKiBFbGltaW5hdGVzIHRoZSBmb2xsb3dpbmcgQUxVIGluc3RydWN0aW9uczoKKyAqICBBQlMsIERQSCwgRFNULCBGTFIsIExJVCwgTFJQLCBQT1csIFNHRSwgU0xULCBTVUIsIFNXWiwgWFBECisgKiB1c2luZzoKKyAqICBNT1YsIEFERCwgTVVMLCBNQUQsIEZSQywgRFAzLCBMRzIsIEVYMiwgQ01QCisgKgorICogVHJhbnNmb3JtcyBSU1EgdG8gUmFkZW9uJ3MgbmF0aXZlIFJTUSBieSBleHBsaWNpdGx5IHNldHRpbmcKKyAqIGFic29sdXRlIHZhbHVlLgorICoKKyAqIEBub3RlIHNob3VsZCBiZSBhcHBsaWNhYmxlIHRvIFIzMDAgYW5kIFI1MDAgZnJhZ21lbnQgcHJvZ3JhbXMuCisgKi8KK0dMYm9vbGVhbiByYWRlb25UcmFuc2Zvcm1BTFUoc3RydWN0IHJhZGVvbl90cmFuc2Zvcm1fY29udGV4dCogdCwKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiogaW5zdCwKKwl2b2lkKiB1bnVzZWQpCit7CisJc3dpdGNoKGluc3QtPk9wY29kZSkgeworCWNhc2UgT1BDT0RFX0FCUzogdHJhbnNmb3JtX0FCUyh0LCBpbnN0KTsgcmV0dXJuIEdMX1RSVUU7CisJY2FzZSBPUENPREVfRFBIOiB0cmFuc2Zvcm1fRFBIKHQsIGluc3QpOyByZXR1cm4gR0xfVFJVRTsKKwljYXNlIE9QQ09ERV9EU1Q6IHRyYW5zZm9ybV9EU1QodCwgaW5zdCk7IHJldHVybiBHTF9UUlVFOworCWNhc2UgT1BDT0RFX0ZMUjogdHJhbnNmb3JtX0ZMUih0LCBpbnN0KTsgcmV0dXJuIEdMX1RSVUU7CisJY2FzZSBPUENPREVfTElUOiB0cmFuc2Zvcm1fTElUKHQsIGluc3QpOyByZXR1cm4gR0xfVFJVRTsKKwljYXNlIE9QQ09ERV9MUlA6IHRyYW5zZm9ybV9MUlAodCwgaW5zdCk7IHJldHVybiBHTF9UUlVFOworCWNhc2UgT1BDT0RFX1BPVzogdHJhbnNmb3JtX1BPVyh0LCBpbnN0KTsgcmV0dXJuIEdMX1RSVUU7CisJY2FzZSBPUENPREVfUlNROiB0cmFuc2Zvcm1fUlNRKHQsIGluc3QpOyByZXR1cm4gR0xfVFJVRTsKKwljYXNlIE9QQ09ERV9TR0U6IHRyYW5zZm9ybV9TR0UodCwgaW5zdCk7IHJldHVybiBHTF9UUlVFOworCWNhc2UgT1BDT0RFX1NMVDogdHJhbnNmb3JtX1NMVCh0LCBpbnN0KTsgcmV0dXJuIEdMX1RSVUU7CisJY2FzZSBPUENPREVfU1VCOiB0cmFuc2Zvcm1fU1VCKHQsIGluc3QpOyByZXR1cm4gR0xfVFJVRTsKKwljYXNlIE9QQ09ERV9TV1o6IHRyYW5zZm9ybV9TV1oodCwgaW5zdCk7IHJldHVybiBHTF9UUlVFOworCWNhc2UgT1BDT0RFX1hQRDogdHJhbnNmb3JtX1hQRCh0LCBpbnN0KTsgcmV0dXJuIEdMX1RSVUU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEdMX0ZBTFNFOworCX0KK30KKworCitzdGF0aWMgdm9pZCBzaW5jb3NfY29uc3RhbnRzKHN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQqIHQsIEdMdWludCAqY29uc3RhbnRzKQoreworCXN0YXRpYyBjb25zdCBHTGZsb2F0IFNpbkNvc0NvbnN0c1syXVs0XSA9IHsKKwkJeworCQkJMS4yNzMyMzk1NDUsCQkvLyA0L1BJCisJCQktMC40MDUyODQ3MzUsCQkvLyAtNC8oUEkqUEkpCisJCQkzLjE0MTU5MjY1NCwJCS8vIFBJCisJCQkwLjIyMjUJCQkvLyB3ZWlnaHQKKwkJfSwKKwkJeworCQkJMC43NSwKKwkJCTAuNSwKKwkJCTAuMTU5MTU0OTQzLAkJLy8gMS8oMipQSSkKKwkJCTYuMjgzMTg1MzA3CQkvLyAyKlBJCisJCX0KKwl9OworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCUdMdWludCBzd3o7CisJCWNvbnN0YW50c1tpXSA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHQtPlByb2dyYW0tPlBhcmFtZXRlcnMsIFNpbkNvc0NvbnN0c1tpXSwgNCwgJnN3eik7CisJCUFTU0VSVChzd3ogPT0gU1dJWlpMRV9OT09QKTsKKwl9Cit9CisKKy8qKgorICogQXBwcm94aW1hdGUgc2luKHgpLCB3aGVyZSB4IGlzIGNsYW1wZWQgdG8gKC1waS8yLCBwaS8yKS4KKyAqCisgKiBNVUwgdG1wLnh5LCBzcmMsIHsgNC9QSSwgLTQvKFBJXjIpIH0KKyAqIE1BRCB0bXAueCwgdG1wLnksIHxzcmN8LCB0bXAueAorICogTUFEIHRtcC55LCB0bXAueCwgfHRtcC54fCwgLXRtcC54CisgKiBNQUQgZGVzdCwgdG1wLnksIHdlaWdodCwgdG1wLngKKyAqLworc3RhdGljIHZvaWQgc2luX2FwcHJveChzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBkc3QsIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmMsIGNvbnN0IEdMdWludCogY29uc3RhbnRzKQoreworCUdMdWludCB0ZW1wcmVnID0gcmFkZW9uRmluZEZyZWVUZW1wb3JhcnkodCk7CisKKwllbWl0Mih0LT5Qcm9ncmFtLCBPUENPREVfTVVMLCAwLCBkc3RyZWd0bXBtYXNrKHRlbXByZWcsIFdSSVRFTUFTS19YWSksCisJCXN3aXp6bGUoc3JjLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gpLAorCQlzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzBdKSk7CisJZW1pdDModC0+UHJvZ3JhbSwgT1BDT0RFX01BRCwgMCwgZHN0cmVndG1wbWFzayh0ZW1wcmVnLCBXUklURU1BU0tfWCksCisJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSwgU1dJWlpMRV9ZKSwKKwkJYWJzb2x1dGUoc3dpenpsZShzcmMsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCkpLAorCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCkpOworCWVtaXQzKHQtPlByb2dyYW0sIE9QQ09ERV9NQUQsIDAsIGRzdHJlZ3RtcG1hc2sodGVtcHJlZywgV1JJVEVNQVNLX1kpLAorCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCksCisJCWFic29sdXRlKHN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKSksCisJCW5lZ2F0ZShzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCkpKTsKKwllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfTUFELCAwLCBkc3QsCisJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSwgU1dJWlpMRV9ZKSwKKwkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzBdKSwgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XKSwKKwkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9URU1QT1JBUlksIHRlbXByZWcpLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gpKTsKK30KKworLyoqCisgKiBUcmFuc2xhdGUgdGhlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIENPUywgU0lOLCBhbmQgU0NTCisgKiB1c2luZyBvbmx5IHRoZSBiYXNpYyBpbnN0cnVjdGlvbnMKKyAqICBNT1YsIEFERCwgTVVMLCBNQUQsIEZSQworICovCitHTGJvb2xlYW4gcmFkZW9uVHJhbnNmb3JtVHJpZ1NpbXBsZShzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0LAorCXZvaWQqIHVudXNlZCkKK3sKKwlpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9DT1MgJiYKKwkgICAgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9TSU4gJiYKKwkgICAgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9TQ1MpCisJCXJldHVybiBHTF9GQUxTRTsKKworCUdMdWludCBjb25zdGFudHNbMl07CisJR0x1aW50IHRlbXByZWcgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKworCXNpbmNvc19jb25zdGFudHModCwgY29uc3RhbnRzKTsKKworCWlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0NPUykgeworCQkvLyBNQUQgdG1wLngsIHNyYywgMS8oMipQSSksIDAuNzUKKwkJLy8gRlJDIHRtcC54LCB0bXAueAorCQkvLyBNQUQgdG1wLnosIHRtcC54LCAyKlBJLCAtUEkKKwkJZW1pdDModC0+UHJvZ3JhbSwgT1BDT0RFX01BRCwgMCwgZHN0cmVndG1wbWFzayh0ZW1wcmVnLCBXUklURU1BU0tfVyksCisJCQlzd2l6emxlKGluc3QtPlNyY1JlZ1swXSwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKSwKKwkJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fQ09OU1RBTlQsIGNvbnN0YW50c1sxXSksIFNXSVpaTEVfWiwgU1dJWlpMRV9aLCBTV0laWkxFX1osIFNXSVpaTEVfWiksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudHNbMV0pLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gpKTsKKwkJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX0ZSQywgMCwgZHN0cmVndG1wbWFzayh0ZW1wcmVnLCBXUklURU1BU0tfVyksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVykpOworCQllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfTUFELCAwLCBkc3RyZWd0bXBtYXNrKHRlbXByZWcsIFdSSVRFTUFTS19XKSwKKwkJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XKSwKKwkJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fQ09OU1RBTlQsIGNvbnN0YW50c1sxXSksIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVyksCisJCQluZWdhdGUoc3dpenpsZShzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzBdKSwgU1dJWlpMRV9aLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aKSkpOworCisJCXNpbl9hcHByb3godCwgaW5zdC0+RHN0UmVnLAorCQkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9URU1QT1JBUlksIHRlbXByZWcpLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpLAorCQkJY29uc3RhbnRzKTsKKwl9IGVsc2UgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfU0lOKSB7CisJCWVtaXQzKHQtPlByb2dyYW0sIE9QQ09ERV9NQUQsIDAsIGRzdHJlZ3RtcG1hc2sodGVtcHJlZywgV1JJVEVNQVNLX1cpLAorCQkJc3dpenpsZShpbnN0LT5TcmNSZWdbMF0sIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudHNbMV0pLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aLCBTV0laWkxFX1opLAorCQkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzFdKSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSwgU1dJWlpMRV9ZKSk7CisJCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9GUkMsIDAsIGRzdHJlZ3RtcG1hc2sodGVtcHJlZywgV1JJVEVNQVNLX1cpLAorCQkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9URU1QT1JBUlksIHRlbXByZWcpLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpKTsKKwkJZW1pdDModC0+UHJvZ3JhbSwgT1BDT0RFX01BRCwgMCwgZHN0cmVndG1wbWFzayh0ZW1wcmVnLCBXUklURU1BU0tfVyksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVyksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudHNbMV0pLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpLAorCQkJbmVnYXRlKHN3aXp6bGUoc3JjcmVnKFBST0dSQU1fQ09OU1RBTlQsIGNvbnN0YW50c1swXSksIFNXSVpaTEVfWiwgU1dJWlpMRV9aLCBTV0laWkxFX1osIFNXSVpaTEVfWikpKTsKKworCQlzaW5fYXBwcm94KHQsIGluc3QtPkRzdFJlZywKKwkJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XKSwKKwkJCWNvbnN0YW50cyk7CisJfSBlbHNlIHsKKwkJZW1pdDModC0+UHJvZ3JhbSwgT1BDT0RFX01BRCwgMCwgZHN0cmVndG1wbWFzayh0ZW1wcmVnLCBXUklURU1BU0tfWFkpLAorCQkJc3dpenpsZShpbnN0LT5TcmNSZWdbMF0sIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCksCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudHNbMV0pLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aLCBTV0laWkxFX1opLAorCQkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzFdKSwgU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9XKSk7CisJCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9GUkMsIDAsIGRzdHJlZ3RtcG1hc2sodGVtcHJlZywgV1JJVEVNQVNLX1hZKSwKKwkJCXNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZykpOworCQllbWl0Myh0LT5Qcm9ncmFtLCBPUENPREVfTUFELCAwLCBkc3RyZWd0bXBtYXNrKHRlbXByZWcsIFdSSVRFTUFTS19YWSksCisJCQlzcmNyZWcoUFJPR1JBTV9URU1QT1JBUlksIHRlbXByZWcpLAorCQkJc3dpenpsZShzcmNyZWcoUFJPR1JBTV9DT05TVEFOVCwgY29uc3RhbnRzWzFdKSwgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XKSwKKwkJCW5lZ2F0ZShzd2l6emxlKHNyY3JlZyhQUk9HUkFNX0NPTlNUQU5ULCBjb25zdGFudHNbMF0pLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aLCBTV0laWkxFX1opKSk7CisKKwkJc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGRzdCA9IGluc3QtPkRzdFJlZzsKKworCQlkc3QuV3JpdGVNYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19YOworCQlzaW5fYXBwcm94KHQsIGRzdCwKKwkJCXN3aXp6bGUoc3JjcmVnKFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wcmVnKSwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKSwKKwkJCWNvbnN0YW50cyk7CisKKwkJZHN0LldyaXRlTWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWTsKKwkJc2luX2FwcHJveCh0LCBkc3QsCisJCQlzd2l6emxlKHNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcHJlZyksIFNXSVpaTEVfWSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSksCisJCQljb25zdGFudHMpOworCX0KKworCXJldHVybiBHTF9UUlVFOworfQorCisKKy8qKgorICogVHJhbnNmb3JtIHRoZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyBDT1MsIFNJTiwgYW5kIFNDUworICogdG8gaW5jbHVkZSBwcmUtc2NhbGluZyBieSAxLygyKlBJKSBhbmQgdGFraW5nIHRoZSBmcmFjdGlvbmFsCisgKiBwYXJ0LCBzbyB0aGF0IHRoZSBpbnB1dCB0byBDT1MgYW5kIFNJTiBpcyBhbHdheXMgaW4gdGhlIHJhbmdlIFswLDEpLgorICogU0NTIGlzIHJlcGxhY2VkIGJ5IG9uZSBDT1MgYW5kIG9uZSBTSU4gaW5zdHJ1Y3Rpb24uCisgKgorICogQHdhcm5pbmcgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpbXBsaWNpdGx5IGNoYW5nZXMgdGhlIHNlbWFudGljcyBvZiBTSU4gYW5kIENPUyEKKyAqLworR0xib29sZWFuIHJhZGVvblRyYW5zZm9ybVRyaWdTY2FsZShzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0LAorCXZvaWQqIHVudXNlZCkKK3sKKwlpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9DT1MgJiYKKwkgICAgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9TSU4gJiYKKwkgICAgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9TQ1MpCisJCXJldHVybiBHTF9GQUxTRTsKKworCXN0YXRpYyBjb25zdCBHTGZsb2F0IFJDUF8yUElbXSA9IHsgMC4xNTkxNTQ5NDMwOTE4OTUzNSB9OworCUdMdWludCB0ZW1wOworCUdMdWludCBjb25zdGFudDsKKwlHTHVpbnQgY29uc3RhbnRfc3dpenpsZTsKKworCXRlbXAgPSByYWRlb25GaW5kRnJlZVRlbXBvcmFyeSh0KTsKKwljb25zdGFudCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHQtPlByb2dyYW0tPlBhcmFtZXRlcnMsIFJDUF8yUEksIDEsICZjb25zdGFudF9zd2l6emxlKTsKKworCWVtaXQyKHQtPlByb2dyYW0sIE9QQ09ERV9NVUwsIDAsIGRzdHJlZ3RtcG1hc2sodGVtcCwgV1JJVEVNQVNLX1cpLAorCQlzd2l6emxlKGluc3QtPlNyY1JlZ1swXSwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKSwKKwkJc3JjcmVnc3d6KFBST0dSQU1fQ09OU1RBTlQsIGNvbnN0YW50LCBjb25zdGFudF9zd2l6emxlKSk7CisJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX0ZSQywgMCwgZHN0cmVndG1wbWFzayh0ZW1wLCBXUklURU1BU0tfVyksCisJCXNyY3JlZyhQUk9HUkFNX1RFTVBPUkFSWSwgdGVtcCkpOworCisJaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfQ09TKSB7CisJCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9DT1MsIGluc3QtPlNhdHVyYXRlTW9kZSwgaW5zdC0+RHN0UmVnLAorCQkJc3JjcmVnc3d6KFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wLCBTV0laWkxFX1dXV1cpKTsKKwl9IGVsc2UgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfU0lOKSB7CisJCWVtaXQxKHQtPlByb2dyYW0sIE9QQ09ERV9TSU4sIGluc3QtPlNhdHVyYXRlTW9kZSwKKwkJCWluc3QtPkRzdFJlZywgc3JjcmVnc3d6KFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wLCBTV0laWkxFX1dXV1cpKTsKKwl9IGVsc2UgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfU0NTKSB7CisJCXN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciBtb2Rkc3QgPSBpbnN0LT5Ec3RSZWc7CisKKwkJaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiBXUklURU1BU0tfWCkgeworCQkJbW9kZHN0LldyaXRlTWFzayA9IFdSSVRFTUFTS19YOworCQkJZW1pdDEodC0+UHJvZ3JhbSwgT1BDT0RFX0NPUywgaW5zdC0+U2F0dXJhdGVNb2RlLCBtb2Rkc3QsCisJCQkJc3JjcmVnc3d6KFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wLCBTV0laWkxFX1dXV1cpKTsKKwkJfQorCQlpZiAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19ZKSB7CisJCQltb2Rkc3QuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1k7CisJCQllbWl0MSh0LT5Qcm9ncmFtLCBPUENPREVfU0lOLCBpbnN0LT5TYXR1cmF0ZU1vZGUsIG1vZGRzdCwKKwkJCQlzcmNyZWdzd3ooUFJPR1JBTV9URU1QT1JBUlksIHRlbXAsIFNXSVpaTEVfV1dXVykpOworCQl9CisJfQorCisJcmV0dXJuIEdMX1RSVUU7Cit9CisKKy8qKgorICogUmV3cml0ZSBERFgvRERZIGluc3RydWN0aW9ucyB0byBwcm9wZXJseSB3b3JrIHdpdGggcjV4eCBzaGFkZXJzLgorICogVGhlIHI1eHggTURIL01EViBpbnN0cnVjdGlvbiBwcm92aWRlcyBwZXItcXVhZCBwYXJ0aWFsIGRlcml2YXRpdmVzLgorICogSXQgdGFrZXMgdGhlIGZvcm0gQSpCK0MuIEEgYW5kIEMgYXJlIHNldCBieSBzZXR0aW5nIHNyYzAuIEIgc2hvdWxkIGJlIC0xLgorICoKKyAqIEB3YXJuaW5nIFRoaXMgZXhwbGljaXRseSBjaGFuZ2VzIHRoZSBmb3JtIG9mIEREWCBhbmQgRERZIQorICovCisKK0dMYm9vbGVhbiByYWRlb25UcmFuc2Zvcm1EZXJpdihzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0KiB0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiBpbnN0LAorCXZvaWQqIHVudXNlZCkKK3sKKwlpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9ERFggJiYgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9ERFkpCisJCXJldHVybiBHTF9GQUxTRTsKKworCXN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBCID0gaW5zdC0+U3JjUmVnWzFdOworCisJQi5Td2l6emxlID0gTUFLRV9TV0laWkxFNChTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUsCisJCQkJCQlTV0laWkxFX09ORSwgU1dJWlpMRV9PTkUpOworCUIuTmVnYXRlQmFzZSA9IE5FR0FURV9YWVpXOworCisJZW1pdDIodC0+UHJvZ3JhbSwgaW5zdC0+T3Bjb2RlLCBpbnN0LT5TYXR1cmF0ZU1vZGUsIGluc3QtPkRzdFJlZywKKwkJaW5zdC0+U3JjUmVnWzBdLCBCKTsKKworCXJldHVybiBHTF9UUlVFOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3F1ZXJ5LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtX2FsdS5oCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBzcmMvbWVzYS9kcml2ZXJzL2RyaS9ub3V2ZWF1L25vdXZlYXVfcXVlcnkuaApjb3B5IHRvIHNyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX3Byb2dyYW1fYWx1LmgKaW5kZXggM2RlZDQxNC4uYjQ1OTU4MSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvbm91dmVhdS9ub3V2ZWF1X3F1ZXJ5LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbV9hbHUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOaWNvbGFpIEhhZWhubGUuCiAgKgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0yNSwxNCArMjUsMjkgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfX05PVVZFQVVfUVVFUllfSF9fCi0jZGVmaW5lIF9fTk9VVkVBVV9RVUVSWV9IX18KKyNpZm5kZWYgX19SQURFT05fUFJPR1JBTV9BTFVfSF8KKyNkZWZpbmUgX19SQURFT05fUFJPR1JBTV9BTFVfSF8KIAotdHlwZWRlZiBzdHJ1Y3Qgbm91dmVhdV9xdWVyeV9vYmplY3RfdCB7Ci0Jc3RydWN0IGdsX3F1ZXJ5X29iamVjdCBtZXNhOworI2luY2x1ZGUgInJhZGVvbl9wcm9ncmFtLmgiCiAKLQlpbnQgbm90aWZpZXJfaWQ7Ci19IG5vdXZlYXVfcXVlcnlfb2JqZWN0OworR0xib29sZWFuIHJhZGVvblRyYW5zZm9ybUFMVSgKKwlzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0ICp0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiwKKwl2b2lkKik7CiAKLWV4dGVybiB2b2lkIG5vdXZlYXVRdWVyeUluaXRGdW5jcyhHTGNvbnRleHQgKmN0eCk7Ci0jZW5kaWYKK0dMYm9vbGVhbiByYWRlb25UcmFuc2Zvcm1UcmlnU2ltcGxlKAorCXN0cnVjdCByYWRlb25fdHJhbnNmb3JtX2NvbnRleHQgKnQsCisJc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24qLAorCXZvaWQqKTsKKworR0xib29sZWFuIHJhZGVvblRyYW5zZm9ybVRyaWdTY2FsZSgKKwlzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0ICp0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiwKKwl2b2lkKik7CisKK0dMYm9vbGVhbiByYWRlb25UcmFuc2Zvcm1EZXJpdigKKwlzdHJ1Y3QgcmFkZW9uX3RyYW5zZm9ybV9jb250ZXh0ICp0LAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uKiwKKwl2b2lkKik7CisKKyNlbmRpZiAvKiBfX1JBREVPTl9QUk9HUkFNX0FMVV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbV9wYWlyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtX3BhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQ1MGQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbV9wYWlyLmMKQEAgLTAsMCArMSwxMDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY29sYWkgSGFlaG5sZS4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKioKKyAqIEBmaWxlCisgKgorICogUGVyZm9ybSB0ZW1wb3JhcnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBhbmQgYXR0ZW1wdCB0byBwYWlyIG9mZiBpbnN0cnVjdGlvbnMKKyAqIGluIFJHQiBhbmQgQWxwaGEgcGFpcnMuIEFsc28gYXR0ZW1wdHMgdG8gb3B0aW1pemUgdGhlIFRFWCBpbnN0cnVjdGlvbgorICogdnMuIEFMVSBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorICovCisKKyNpbmNsdWRlICJyYWRlb25fcHJvZ3JhbV9wYWlyLmgiCisKKyNpbmNsdWRlICJyYWRlb25fY29udGV4dC5oIgorCisjaW5jbHVkZSAic2hhZGVyL3Byb2dfcHJpbnQuaCIKKworI2RlZmluZSBlcnJvcihmbXQsIGFyZ3MuLi4pIGRvIHsgXAorCV9tZXNhX3Byb2JsZW0ocy0+Q3R4LCAiJXM6OiVzKCk6ICIgZm10ICJcbiIsCVwKKwkJX19GSUxFX18sIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsJXAorCXMtPkVycm9yID0gR0xfVFJVRTsJCQkJXAorfSB3aGlsZSgwKQorCitzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiB7CisJR0x1aW50IElzVGV4OjE7IC8qKjwgSXMgYSB0ZXh0dXJlIGluc3RydWN0aW9uICovCisJR0x1aW50IE5lZWRSR0I6MTsgLyoqPCBOZWVkcyB0aGUgUkdCIEFMVSAqLworCUdMdWludCBOZWVkQWxwaGE6MTsgLyoqPCBOZWVkcyB0aGUgQWxwaGEgQUxVICovCisJR0x1aW50IElzVHJhbnNjZW5kZW50OjE7IC8qKjwgSXMgYSBzcGVjaWFsIHRyYW5zY2VuZGVudCBpbnN0cnVjdGlvbiAqLworCisJLyoqCisJICogTnVtYmVyIG9mIChyZWFkIGFuZCB3cml0ZSkgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUKKwkgKiB0aGlzIGluc3RydWN0aW9uIGNhbiBiZSBzY2hlZHVsZWQuCisJICovCisJR0x1aW50IE51bURlcGVuZGVuY2llczo1OworCisJLyoqCisJICogTmV4dCBpbnN0cnVjdGlvbiBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgcmVhZHkgaW5zdHJ1Y3Rpb25zLgorCSAqLworCXN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpOZXh0UmVhZHk7CisKKwkvKioKKwkgKiBWYWx1ZXMgdGhhdCB0aGlzIGluc3RydWN0aW9uIHdyaXRlcworCSAqLworCXN0cnVjdCByZWdfdmFsdWUgKlZhbHVlc1s0XTsKK307CisKKworLyoqCisgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaW5zdHJ1Y3Rpb25zIHJlYWQgYSB2YWx1ZS4KKyAqLworc3RydWN0IHJlZ192YWx1ZV9yZWFkZXIgeworCUdMdWludCBJUDsgLyoqPCBJUCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBwZXJmb3JtcyB0aGlzIGFjY2VzcyAqLworCXN0cnVjdCByZWdfdmFsdWVfcmVhZGVyICpOZXh0OworfTsKKworLyoqCisgKiBVc2VkIHRvIGtlZXAgdHJhY2sgd2hpY2ggdmFsdWVzIGFyZSBzdG9yZWQgaW4gZWFjaCBjb21wb25lbnQgb2YgYQorICogUFJPR1JBTV9URU1QT1JBUlkuCisgKi8KK3N0cnVjdCByZWdfdmFsdWUgeworCUdMdWludCBJUDsgLyoqPCBJUCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB3cml0ZXMgdGhpcyB2YWx1ZSAqLworCXN0cnVjdCByZWdfdmFsdWUgKk5leHQ7IC8qKjwgUG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzYW1lIFBST0dSQU1fVEVNUE9SQVJZIGNvbXBvbmVudCAqLworCisJLyoqCisJICogVW5vcmRlcmVkIGxpbmtlZCBsaXN0IG9mIGluc3RydWN0aW9ucyB0aGF0IHJlYWQgZnJvbSB0aGlzIHZhbHVlLgorCSAqLworCXN0cnVjdCByZWdfdmFsdWVfcmVhZGVyICpSZWFkZXJzOworCisJLyoqCisJICogTnVtYmVyIG9mIHJlYWRlcnMgb2YgdGhpcyB2YWx1ZS4gVGhpcyBpcyBjYWxjdWxhdGVkIGR1cmluZyBAcmVmIHNjYW5faW5zdHJ1Y3Rpb25zCisJICogYW5kIGNvbnRpbnVhbGx5IGRlY3JlbWVudGVkIGR1cmluZyBjb2RlIGVtaXNzaW9uLgorCSAqIFdoZW4gdGhpcyBjb3VudCByZWFjaGVzIHplcm8sIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHdyaXRlcyB0aGUgQHJlZiBOZXh0IHZhbHVlCisJICogY2FuIGJlIHNjaGVkdWxlZC4KKwkgKi8KKwlHTHVpbnQgTnVtUmVhZGVyczsKK307CisKKy8qKgorICogVXNlZCB0byB0cmFuc2xhdGUgYSBQUk9HUkFNX0lOUFVUIG9yIFBST0dSQU1fVEVNUE9SQVJZIE1lc2EgcmVnaXN0ZXIKKyAqIHRvIHRoZSBwcm9wZXIgaGFyZHdhcmUgdGVtcG9yYXJ5LgorICovCitzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiB7CisJR0x1aW50IEFsbG9jYXRlZDoxOworCUdMdWludCBId0luZGV4Ojg7CisJR0x1aW50IFJlZkNvdW50OjIzOyAvKio8ICMgb2YgdGltZXMgdGhpcyBvY2N1cnMgaW4gYW4gdW5zY2hlZHVsZWQgaW5zdHJ1Y3Rpb24gU3JjUmVnIG9yIERzdFJlZyAqLworCisJLyoqCisJICogTm90ZXMgdGhlIHZhbHVlIHRoYXQgaXMgY3VycmVudGx5IGNvbnRhaW5lZCBpbiBlYWNoIGNvbXBvbmVudAorCSAqIChvbmx5IHVzZWQgZm9yIFBST0dSQU1fVEVNUE9SQVJZIHJlZ2lzdGVycykuCisJICovCisJc3RydWN0IHJlZ192YWx1ZSAqVmFsdWVbNF07Cit9OworCitzdHJ1Y3QgcGFpcl9zdGF0ZSB7CisJR0xjb250ZXh0ICpDdHg7CisJc3RydWN0IGdsX3Byb2dyYW0gKlByb2dyYW07CisJY29uc3Qgc3RydWN0IHJhZGVvbl9wYWlyX2hhbmRsZXIgKkhhbmRsZXI7CisJR0xib29sZWFuIEVycm9yOworCUdMYm9vbGVhbiBEZWJ1ZzsKKwlHTGJvb2xlYW4gVmVyYm9zZTsKKwl2b2lkICpVc2VyRGF0YTsKKworCS8qKgorCSAqIFRyYW5zbGF0ZSBNZXNhIHJlZ2lzdGVycyB0byBoYXJkd2FyZSByZWdpc3RlcnMKKwkgKi8KKwlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiBJbnB1dHNbRlJBR19BVFRSSUJfTUFYXTsKKwlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiBUZW1wc1tNQVhfUFJPR1JBTV9URU1QU107CisKKwkvKioKKwkgKiBEZXJpdmVkIGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgorCSAqLworCXN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpJbnN0cnVjdGlvbnM7CisKKwlzdHJ1Y3QgeworCQlHTHVpbnQgUmVmQ291bnQ7IC8qKjwgIyBvZiB0aW1lcyB0aGlzIG9jY3VycyBpbiBhbiB1bnNjaGVkdWxlZCBTcmNSZWcgb3IgRHN0UmVnICovCisJfSBId1RlbXBzWzEyOF07CisKKwkvKioKKwkgKiBMaW5rZWQgbGlzdCBvZiBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgc2NoZWR1bGVkIHJpZ2h0IG5vdywKKwkgKiBiYXNlZCBvbiB3aGljaCBBTFUvVEVYIHJlc291cmNlcyB0aGV5IHJlcXVpcmUuCisJICovCisJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKlJlYWR5RnVsbEFMVTsKKwlzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqUmVhZHlSR0I7CisJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKlJlYWR5QWxwaGE7CisJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKlJlYWR5VEVYOworCisJLyoqCisJICogUG9vbCBvZiBAcmVmIHJlZ192YWx1ZSBzdHJ1Y3R1cmVzIGZvciBmYXN0IGFsbG9jYXRpb24uCisJICovCisJc3RydWN0IHJlZ192YWx1ZSAqVmFsdWVQb29sOworCUdMdWludCBWYWx1ZVBvb2xVc2VkOworCXN0cnVjdCByZWdfdmFsdWVfcmVhZGVyICpSZWFkZXJQb29sOworCUdMdWludCBSZWFkZXJQb29sVXNlZDsKK307CisKKworc3RhdGljIHN0cnVjdCBwYWlyX3JlZ2lzdGVyX3RyYW5zbGF0aW9uICpnZXRfcmVnaXN0ZXIoc3RydWN0IHBhaXJfc3RhdGUgKnMsIEdMdWludCBmaWxlLCBHTHVpbnQgaW5kZXgpCit7CisJc3dpdGNoKGZpbGUpIHsKKwljYXNlIFBST0dSQU1fVEVNUE9SQVJZOiByZXR1cm4gJnMtPlRlbXBzW2luZGV4XTsKKwljYXNlIFBST0dSQU1fSU5QVVQ6IHJldHVybiAmcy0+SW5wdXRzW2luZGV4XTsKKwlkZWZhdWx0OiByZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX2h3X3JlZyhzdHJ1Y3QgcGFpcl9zdGF0ZSAqcywgR0x1aW50IGZpbGUsIEdMdWludCBpbmRleCwgR0x1aW50IGh3aW5kZXgpCit7CisJc3RydWN0IHBhaXJfcmVnaXN0ZXJfdHJhbnNsYXRpb24gKnQgPSBnZXRfcmVnaXN0ZXIocywgZmlsZSwgaW5kZXgpOworCUFTU0VSVCghcy0+SHdUZW1wc1tod2luZGV4XS5SZWZDb3VudCk7CisJQVNTRVJUKCF0LT5BbGxvY2F0ZWQpOworCXMtPkh3VGVtcHNbaHdpbmRleF0uUmVmQ291bnQgPSB0LT5SZWZDb3VudDsKKwl0LT5BbGxvY2F0ZWQgPSAxOworCXQtPkh3SW5kZXggPSBod2luZGV4OworfQorCitzdGF0aWMgR0x1aW50IGdldF9od19yZWcoc3RydWN0IHBhaXJfc3RhdGUgKnMsIEdMdWludCBmaWxlLCBHTHVpbnQgaW5kZXgpCit7CisJR0x1aW50IGh3aW5kZXg7CisKKwlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiAqdCA9IGdldF9yZWdpc3RlcihzLCBmaWxlLCBpbmRleCk7CisJaWYgKCF0KSB7CisJCV9tZXNhX3Byb2JsZW0ocy0+Q3R4LCAiZ2V0X2h3X3JlZzogJWlbJWldXG4iLCBmaWxlLCBpbmRleCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh0LT5BbGxvY2F0ZWQpCisJCXJldHVybiB0LT5Id0luZGV4OworCisJZm9yKGh3aW5kZXggPSAwOyBod2luZGV4IDwgcy0+SGFuZGxlci0+TWF4SHdUZW1wczsgKytod2luZGV4KQorCQlpZiAoIXMtPkh3VGVtcHNbaHdpbmRleF0uUmVmQ291bnQpCisJCQlicmVhazsKKworCWlmIChod2luZGV4ID49IHMtPkhhbmRsZXItPk1heEh3VGVtcHMpIHsKKwkJZXJyb3IoIlJhbiBvdXQgb2YgaGFyZHdhcmUgdGVtcG9yYXJpZXMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYWxsb2NfaHdfcmVnKHMsIGZpbGUsIGluZGV4LCBod2luZGV4KTsKKwlyZXR1cm4gaHdpbmRleDsKK30KKworCitzdGF0aWMgdm9pZCBkZXJlZl9od19yZWcoc3RydWN0IHBhaXJfc3RhdGUgKnMsIEdMdWludCBod2luZGV4KQoreworCWlmICghcy0+SHdUZW1wc1tod2luZGV4XS5SZWZDb3VudCkgeworCQllcnJvcigiSHdpbmRleCAlaSByZWZjb3VudCBlcnJvciIsIGh3aW5kZXgpOworCQlyZXR1cm47CisJfQorCisJcy0+SHdUZW1wc1tod2luZGV4XS5SZWZDb3VudC0tOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGFpcmluc3RfdG9fbGlzdChzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqKmxpc3QsIHN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpwYWlyaW5zdCkKK3sKKwlwYWlyaW5zdC0+TmV4dFJlYWR5ID0gKmxpc3Q7CisJKmxpc3QgPSBwYWlyaW5zdDsKK30KKworLyoqCisgKiBUaGUgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuIElQIGhhcyBiZWNvbWUgcmVhZHkuIExpbmsgaXQgaW50byB0aGUgcmVhZHkKKyAqIGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgaW5zdHJ1Y3Rpb25fcmVhZHkoc3RydWN0IHBhaXJfc3RhdGUgKnMsIGludCBpcCkKK3sKKwlzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqcGFpcmluc3QgPSBzLT5JbnN0cnVjdGlvbnMgKyBpcDsKKworCWlmIChzLT5WZXJib3NlKQorCQlfbWVzYV9wcmludGYoImluc3RydWN0aW9uX3JlYWR5KCVpKVxuIiwgaXApOworCisJaWYgKHBhaXJpbnN0LT5Jc1RleCkKKwkJYWRkX3BhaXJpbnN0X3RvX2xpc3QoJnMtPlJlYWR5VEVYLCBwYWlyaW5zdCk7CisJZWxzZSBpZiAoIXBhaXJpbnN0LT5OZWVkQWxwaGEpCisJCWFkZF9wYWlyaW5zdF90b19saXN0KCZzLT5SZWFkeVJHQiwgcGFpcmluc3QpOworCWVsc2UgaWYgKCFwYWlyaW5zdC0+TmVlZFJHQikKKwkJYWRkX3BhaXJpbnN0X3RvX2xpc3QoJnMtPlJlYWR5QWxwaGEsIHBhaXJpbnN0KTsKKwllbHNlCisJCWFkZF9wYWlyaW5zdF90b19saXN0KCZzLT5SZWFkeUZ1bGxBTFUsIHBhaXJpbnN0KTsKK30KKworCisvKioKKyAqIEZpbmFsbHkgcmV3cml0ZSBBREQsIE1PViwgTVVMIGFzIHRoZSBhcHByb3ByaWF0ZSBuYXRpdmUgaW5zdHJ1Y3Rpb24KKyAqIGFuZCByZXZlcnNlIHRoZSBvcmRlciBvZiBhcmd1bWVudHMgZm9yIENNUC4KKyAqLworc3RhdGljIHZvaWQgZmluYWxfcmV3cml0ZShzdHJ1Y3QgcGFpcl9zdGF0ZSAqcywgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHRtcDsKKworCXN3aXRjaChpbnN0LT5PcGNvZGUpIHsKKwljYXNlIE9QQ09ERV9BREQ6CisJCWluc3QtPlNyY1JlZ1syXSA9IGluc3QtPlNyY1JlZ1sxXTsKKwkJaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX0JVSUxUSU47CisJCWluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV8xMTExOworCQlpbnN0LT5TcmNSZWdbMV0uTmVnYXRlQmFzZSA9IDA7CisJCWluc3QtPlNyY1JlZ1sxXS5OZWdhdGVBYnMgPSAwOworCQlpbnN0LT5PcGNvZGUgPSBPUENPREVfTUFEOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9DTVA6CisJCXRtcCA9IGluc3QtPlNyY1JlZ1syXTsKKwkJaW5zdC0+U3JjUmVnWzJdID0gaW5zdC0+U3JjUmVnWzBdOworCQlpbnN0LT5TcmNSZWdbMF0gPSB0bXA7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX01PVjoKKwkJLyogQU1EIHNheSB3ZSBzaG91bGQgdXNlIENNUC4KKwkJICogSG93ZXZlciwgd2hlbiB3ZSB0cmFuc2Zvcm0KKwkJICogIEtJTCAtcjA7CisJCSAqIGludG8KKwkJICogIENNUCB0bXAsIC1yMCwgLXIwLCAwOworCQkgKiAgS0lMIHRtcDsKKwkJICogd2UgZ2V0IGluY29ycmVjdCBiZWhhdmlvdXIgb24gUjUwMCB3aGVuIHIwID09IDAuMC4KKwkJICogSXQgYXBwZWFycyB0aGF0IHRoZSBSNTAwIEtJTCBoYXJkd2FyZSB0cmVhdHMgLTAuMCBhcyBsZXNzCisJCSAqIHRoYW4gemVyby4KKwkJICovCisJCWluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9CVUlMVElOOworCQlpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfMTExMTsKKwkJaW5zdC0+U3JjUmVnWzJdLkZpbGUgPSBQUk9HUkFNX0JVSUxUSU47CisJCWluc3QtPlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV8wMDAwOworCQlpbnN0LT5PcGNvZGUgPSBPUENPREVfTUFEOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9NVUw6CisJCWluc3QtPlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9CVUlMVElOOworCQlpbnN0LT5TcmNSZWdbMl0uU3dpenpsZSA9IFNXSVpaTEVfMDAwMDsKKwkJaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01BRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90aGluZyB0byBkbyAqLworCQlicmVhazsKKwl9Cit9CisKKworLyoqCisgKiBDbGFzc2lmeSBhbiBpbnN0cnVjdGlvbiBhY2NvcmRpbmcgdG8gd2hpY2ggQUxVcyBldGMuIGl0IG5lZWRzCisgKi8KK3N0YXRpYyB2b2lkIGNsYXNzaWZ5X2luc3RydWN0aW9uKHN0cnVjdCBwYWlyX3N0YXRlICpzLAorCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0LCBzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqcGFpcmluc3QpCit7CisJcGFpcmluc3QtPk5lZWRSR0IgPSAoaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIFdSSVRFTUFTS19YWVopID8gMSA6IDA7CisJcGFpcmluc3QtPk5lZWRBbHBoYSA9IChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1cpID8gMSA6IDA7CisKKwlzd2l0Y2goaW5zdC0+T3Bjb2RlKSB7CisJY2FzZSBPUENPREVfQUREOgorCWNhc2UgT1BDT0RFX0NNUDoKKwljYXNlIE9QQ09ERV9ERFg6CisJY2FzZSBPUENPREVfRERZOgorCWNhc2UgT1BDT0RFX0ZSQzoKKwljYXNlIE9QQ09ERV9NQUQ6CisJY2FzZSBPUENPREVfTUFYOgorCWNhc2UgT1BDT0RFX01JTjoKKwljYXNlIE9QQ09ERV9NT1Y6CisJY2FzZSBPUENPREVfTVVMOgorCQlicmVhazsKKwljYXNlIE9QQ09ERV9DT1M6CisJY2FzZSBPUENPREVfRVgyOgorCWNhc2UgT1BDT0RFX0xHMjoKKwljYXNlIE9QQ09ERV9SQ1A6CisJY2FzZSBPUENPREVfUlNROgorCWNhc2UgT1BDT0RFX1NJTjoKKwkJcGFpcmluc3QtPklzVHJhbnNjZW5kZW50ID0gMTsKKwkJcGFpcmluc3QtPk5lZWRBbHBoYSA9IDE7CisJCWJyZWFrOworCWNhc2UgT1BDT0RFX0RQNDoKKwkJcGFpcmluc3QtPk5lZWRBbHBoYSA9IDE7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgT1BDT0RFX0RQMzoKKwkJcGFpcmluc3QtPk5lZWRSR0IgPSAxOworCQlicmVhazsKKwljYXNlIE9QQ09ERV9LSUw6CisJY2FzZSBPUENPREVfVEVYOgorCWNhc2UgT1BDT0RFX1RYQjoKKwljYXNlIE9QQ09ERV9UWFA6CisJY2FzZSBPUENPREVfRU5EOgorCQlwYWlyaW5zdC0+SXNUZXggPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiVW5rbm93biBvcGNvZGUgJWRcbiIsIGluc3QtPk9wY29kZSk7CisJCWJyZWFrOworCX0KK30KKworCisvKioKKyAqIENvdW50IHdoaWNoIChpbnB1dCwgdGVtcG9yYXJ5KSByZWdpc3RlciBpcyByZWFkIGFuZCB3cml0dGVuIGhvdyBvZnRlbiwKKyAqIGFuZCBzY2FuIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gdG8gZmluZCBkZXBlbmRlbmNpZXMuCisgKi8KK3N0YXRpYyB2b2lkIHNjYW5faW5zdHJ1Y3Rpb25zKHN0cnVjdCBwYWlyX3N0YXRlICpzKQoreworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0OworCXN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpwYWlyaW5zdDsKKwlHTHVpbnQgaXA7CisKKwlmb3IoaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucywgcGFpcmluc3QgPSBzLT5JbnN0cnVjdGlvbnMsIGlwID0gMDsKKwkgICAgaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9FTkQ7CisJICAgICsraW5zdCwgKytwYWlyaW5zdCwgKytpcCkgeworCQlmaW5hbF9yZXdyaXRlKHMsIGluc3QpOworCQljbGFzc2lmeV9pbnN0cnVjdGlvbihzLCBpbnN0LCBwYWlyaW5zdCk7CisKKwkJaW50IG5zcmMgPSBfbWVzYV9udW1faW5zdF9zcmNfcmVncyhpbnN0LT5PcGNvZGUpOworCQlpbnQgajsKKwkJZm9yKGogPSAwOyBqIDwgbnNyYzsgaisrKSB7CisJCQlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiAqdCA9CisJCQkJZ2V0X3JlZ2lzdGVyKHMsIGluc3QtPlNyY1JlZ1tqXS5GaWxlLCBpbnN0LT5TcmNSZWdbal0uSW5kZXgpOworCQkJaWYgKCF0KQorCQkJCWNvbnRpbnVlOworCisJCQl0LT5SZWZDb3VudCsrOworCisJCQlpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCQkJR0x1aW50IHN3eiA9IEdFVF9TV1ooaW5zdC0+U3JjUmVnW2pdLlN3aXp6bGUsIGkpOworCQkJCQlpZiAoc3d6ID49IDQpCisJCQkJCQljb250aW51ZTsgLyogY29uc3RhbnQgb3IgTklMIHN3aXp6bGUgKi8KKwkJCQkJaWYgKCF0LT5WYWx1ZVtzd3pdKQorCQkJCQkJY29udGludWU7IC8qIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHJlYWQgKi8KKworCQkJCQkvKiBEbyBub3QgYWRkIGEgZGVwZW5kZW5jeSBpZiB0aGlzIGluc3RydWN0aW9uCisJCQkJCSAqIGFsc28gcmV3cml0ZXMgdGhlIHZhbHVlLiBUaGUgY29kZSBiZWxvdyBhZGRzCisJCQkJCSAqIGEgZGVwZW5kZW5jeSBmb3IgdGhlIERzdFJlZywgd2hpY2ggaXMgYSBzdXBlcnNldAorCQkJCQkgKiBvZiB0aGUgU3JjUmVnIGRlcGVuZGVuY3kuICovCisJCQkJCWlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJgorCQkJCQkgICAgaW5zdC0+RHN0UmVnLkluZGV4ID09IGluc3QtPlNyY1JlZ1tqXS5JbmRleCAmJgorCQkJCQkgICAgR0VUX0JJVChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrLCBzd3opKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3RydWN0IHJlZ192YWx1ZV9yZWFkZXIqIHIgPSAmcy0+UmVhZGVyUG9vbFtzLT5SZWFkZXJQb29sVXNlZCsrXTsKKwkJCQkJcGFpcmluc3QtPk51bURlcGVuZGVuY2llcysrOworCQkJCQl0LT5WYWx1ZVtzd3pdLT5OdW1SZWFkZXJzKys7CisJCQkJCXItPklQID0gaXA7CisJCQkJCXItPk5leHQgPSB0LT5WYWx1ZVtzd3pdLT5SZWFkZXJzOworCQkJCQl0LT5WYWx1ZVtzd3pdLT5SZWFkZXJzID0gcjsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpbnQgbmRzdCA9IF9tZXNhX251bV9pbnN0X2RzdF9yZWdzKGluc3QtPk9wY29kZSk7CisJCWlmIChuZHN0KSB7CisJCQlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiAqdCA9CisJCQkJZ2V0X3JlZ2lzdGVyKHMsIGluc3QtPkRzdFJlZy5GaWxlLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOworCQkJaWYgKHQpIHsKKwkJCQl0LT5SZWZDb3VudCsrOworCisJCQkJaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSB7CisJCQkJCWludCBqOworCQkJCQlmb3IoaiA9IDA7IGogPCA0OyArK2opIHsKKwkJCQkJCWlmICghR0VUX0JJVChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrLCBqKSkKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkJc3RydWN0IHJlZ192YWx1ZSogdiA9ICZzLT5WYWx1ZVBvb2xbcy0+VmFsdWVQb29sVXNlZCsrXTsKKwkJCQkJCXYtPklQID0gaXA7CisJCQkJCQlpZiAodC0+VmFsdWVbal0pIHsKKwkJCQkJCQlwYWlyaW5zdC0+TnVtRGVwZW5kZW5jaWVzKys7CisJCQkJCQkJdC0+VmFsdWVbal0tPk5leHQgPSB2OworCQkJCQkJfQorCQkJCQkJdC0+VmFsdWVbal0gPSB2OworCQkJCQkJcGFpcmluc3QtPlZhbHVlc1tqXSA9IHY7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocy0+VmVyYm9zZSkKKwkJCV9tZXNhX3ByaW50Zigic2NhbiglaSk6IE51bURlcHMgPSAlaVxuIiwgaXAsIHBhaXJpbnN0LT5OdW1EZXBlbmRlbmNpZXMpOworCisJCWlmICghcGFpcmluc3QtPk51bURlcGVuZGVuY2llcykKKwkJCWluc3RydWN0aW9uX3JlYWR5KHMsIGlwKTsKKwl9CisKKwkvKiBDbGVhciB0aGUgUFJPR1JBTV9URU1QT1JBUlkgc3RhdGUgKi8KKwlpbnQgaSwgajsKKwlmb3IoaSA9IDA7IGkgPCBNQVhfUFJPR1JBTV9URU1QUzsgKytpKSB7CisJCWZvcihqID0gMDsgaiA8IDQ7ICsraikKKwkJCXMtPlRlbXBzW2ldLlZhbHVlW2pdID0gMDsKKwl9Cit9CisKKworLyoqCisgKiBSZXNlcnZlIGhhcmR3YXJlIHRlbXBvcmFyeSByZWdpc3RlcnMgZm9yIHRoZSBwcm9ncmFtIGlucHV0cy4KKyAqCisgKiBAbm90ZSBUaGlzIGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkIGV4cGxpY2l0bHksIGJlY2F1c2UgdGhlIG9yZGVyIG9mIGlucHV0cworICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgUlMgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2lucHV0X3JlZ2lzdGVycyhzdHJ1Y3QgcGFpcl9zdGF0ZSAqcykKK3sKKwlHTHVpbnQgSW5wdXRzUmVhZCA9IHMtPlByb2dyYW0tPklucHV0c1JlYWQ7CisJaW50IGk7CisJR0x1aW50IGh3aW5kZXggPSAwOworCisJLyogVGV4Y29vcmRzIGNvbWUgZmlyc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcy0+Q3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IGkrKykgeworCQlpZiAoSW5wdXRzUmVhZCAmIChGUkFHX0JJVF9URVgwIDw8IGkpKQorCQkJYWxsb2NfaHdfcmVnKHMsIFBST0dSQU1fSU5QVVQsIEZSQUdfQVRUUklCX1RFWDAraSwgaHdpbmRleCsrKTsKKwl9CisJSW5wdXRzUmVhZCAmPSB+RlJBR19CSVRTX1RFWF9BTlk7CisKKwkvKiBmcmFnbWVudCBwb3NpdGlvbiB0cmVhdGVkIGFzIGEgdGV4Y29vcmQgKi8KKwlpZiAoSW5wdXRzUmVhZCAmIEZSQUdfQklUX1dQT1MpCisJCWFsbG9jX2h3X3JlZyhzLCBQUk9HUkFNX0lOUFVULCBGUkFHX0FUVFJJQl9XUE9TLCBod2luZGV4KyspOworCUlucHV0c1JlYWQgJj0gfkZSQUdfQklUX1dQT1M7CisKKwkvKiBUaGVuIHByaW1hcnkgY29sb3VyICovCisJaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wwKQorCQlhbGxvY19od19yZWcocywgUFJPR1JBTV9JTlBVVCwgRlJBR19BVFRSSUJfQ09MMCwgaHdpbmRleCsrKTsKKwlJbnB1dHNSZWFkICY9IH5GUkFHX0JJVF9DT0wwOworCisJLyogU2Vjb25kYXJ5IGNvbG9yICovCisJaWYgKElucHV0c1JlYWQgJiBGUkFHX0JJVF9DT0wxKQorCQlhbGxvY19od19yZWcocywgUFJPR1JBTV9JTlBVVCwgRlJBR19BVFRSSUJfQ09MMSwgaHdpbmRleCsrKTsKKwlJbnB1dHNSZWFkICY9IH5GUkFHX0JJVF9DT0wxOworCisJLyogQW55dGhpbmcgZWxzZSAqLworCWlmIChJbnB1dHNSZWFkKQorCQllcnJvcigiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGlucHV0cyAweCV4XG4iLCBJbnB1dHNSZWFkKTsKK30KKworCitzdGF0aWMgdm9pZCBkZWNyZW1lbnRfZGVwZW5kZW5jaWVzKHN0cnVjdCBwYWlyX3N0YXRlICpzLCBpbnQgaXApCit7CisJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKnBhaXJpbnN0ID0gcy0+SW5zdHJ1Y3Rpb25zICsgaXA7CisJQVNTRVJUKHBhaXJpbnN0LT5OdW1EZXBlbmRlbmNpZXMgPiAwKTsKKwlpZiAoIS0tcGFpcmluc3QtPk51bURlcGVuZGVuY2llcykKKwkJaW5zdHJ1Y3Rpb25fcmVhZHkocywgaXApOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgZGVwZW5kZW5jeSB0cmFja2luZyBzdGF0ZSBiYXNlZCBvbiB3aGF0IHRoZSBpbnN0cnVjdGlvbgorICogYXQgdGhlIGdpdmVuIElQIGRvZXMuCisgKi8KK3N0YXRpYyB2b2lkIGNvbW1pdF9pbnN0cnVjdGlvbihzdHJ1Y3QgcGFpcl9zdGF0ZSAqcywgaW50IGlwKQoreworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcy0+UHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zICsgaXA7CisJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKnBhaXJpbnN0ID0gcy0+SW5zdHJ1Y3Rpb25zICsgaXA7CisKKwlpZiAocy0+VmVyYm9zZSkKKwkJX21lc2FfcHJpbnRmKCJjb21taXRfaW5zdHJ1Y3Rpb24oJWkpXG4iLCBpcCk7CisKKwlpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKwkJc3RydWN0IHBhaXJfcmVnaXN0ZXJfdHJhbnNsYXRpb24gKnQgPSAmcy0+VGVtcHNbaW5zdC0+RHN0UmVnLkluZGV4XTsKKwkJZGVyZWZfaHdfcmVnKHMsIHQtPkh3SW5kZXgpOworCisJCWludCBpOworCQlmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWlmICghR0VUX0JJVChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrLCBpKSkKKwkJCQljb250aW51ZTsKKworCQkJdC0+VmFsdWVbaV0gPSBwYWlyaW5zdC0+VmFsdWVzW2ldOworCQkJaWYgKHQtPlZhbHVlW2ldLT5OdW1SZWFkZXJzKSB7CisJCQkJc3RydWN0IHJlZ192YWx1ZV9yZWFkZXIgKnI7CisJCQkJZm9yKHIgPSBwYWlyaW5zdC0+VmFsdWVzW2ldLT5SZWFkZXJzOyByOyByID0gci0+TmV4dCkKKwkJCQkJZGVjcmVtZW50X2RlcGVuZGVuY2llcyhzLCByLT5JUCk7CisJCQl9IGVsc2UgaWYgKHQtPlZhbHVlW2ldLT5OZXh0KSB7CisJCQkJLyogVGhpcyBoYXBwZW5zIHdoZW4gdGhlIG9ubHkgcmVhZGVyIHdyaXRlcworCQkJCSAqIHRoZSByZWdpc3RlciBhdCB0aGUgc2FtZSB0aW1lICovCisJCQkJZGVjcmVtZW50X2RlcGVuZGVuY2llcyhzLCB0LT5WYWx1ZVtpXS0+TmV4dC0+SVApOworCQkJfQorCQl9CisJfQorCisJaW50IG5zcmMgPSBfbWVzYV9udW1faW5zdF9zcmNfcmVncyhpbnN0LT5PcGNvZGUpOworCWludCBpOworCWZvcihpID0gMDsgaSA8IG5zcmM7IGkrKykgeworCQlzdHJ1Y3QgcGFpcl9yZWdpc3Rlcl90cmFuc2xhdGlvbiAqdCA9IGdldF9yZWdpc3RlcihzLCBpbnN0LT5TcmNSZWdbaV0uRmlsZSwgaW5zdC0+U3JjUmVnW2ldLkluZGV4KTsKKwkJaWYgKCF0KQorCQkJY29udGludWU7CisKKwkJZGVyZWZfaHdfcmVnKHMsIGdldF9od19yZWcocywgaW5zdC0+U3JjUmVnW2ldLkZpbGUsIGluc3QtPlNyY1JlZ1tpXS5JbmRleCkpOworCisJCWlmIChpbnN0LT5TcmNSZWdbaV0uRmlsZSAhPSBQUk9HUkFNX1RFTVBPUkFSWSkKKwkJCWNvbnRpbnVlOworCisJCWludCBqOworCQlmb3IoaiA9IDA7IGogPCA0OyArK2opIHsKKwkJCUdMdWludCBzd3ogPSBHRVRfU1daKGluc3QtPlNyY1JlZ1tpXS5Td2l6emxlLCBqKTsKKwkJCWlmIChzd3ogPj0gNCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghdC0+VmFsdWVbc3d6XSkKKwkJCQljb250aW51ZTsKKworCQkJLyogRG8gbm90IGZyZWUgYSBkZXBlbmRlbmN5IGlmIHRoaXMgaW5zdHJ1Y3Rpb24KKwkJCSAqIGFsc28gcmV3cml0ZXMgdGhlIHZhbHVlLiBTZWUgc2Nhbl9pbnN0cnVjdGlvbnMuICovCisJCQlpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKKwkJCSAgICBpbnN0LT5Ec3RSZWcuSW5kZXggPT0gaW5zdC0+U3JjUmVnW2ldLkluZGV4ICYmCisJCQkgICAgR0VUX0JJVChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrLCBzd3opKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIS0tdC0+VmFsdWVbc3d6XS0+TnVtUmVhZGVycykgeworCQkJCWlmICh0LT5WYWx1ZVtzd3pdLT5OZXh0KQorCQkJCQlkZWNyZW1lbnRfZGVwZW5kZW5jaWVzKHMsIHQtPlZhbHVlW3N3el0tPk5leHQtPklQKTsKKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqIEVtaXQgYWxsIHJlYWR5IHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlIGJsb2NrLgorICoKKyAqIEVtaXQgYXMgYSBzaW5nbGUgYmxvY2sgdG8gKGhvcGVmdWxseSkgc2FtcGxlIG1hbnkgdGV4dHVyZXMgaW4gcGFyYWxsZWwsCisgKiBhbmQgdG8gYXZvaWQgaGFyZHdhcmUgaW5kaXJlY3Rpb25zIG9uIFIzMDAuCisgKgorICogSW4gUjUwMCwgd2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hlbiB0aGUgcmVzdWx0IG9mIGEgdGV4dHVyZSBpbnN0cnVjdGlvbgorICogYXJyaXZlcy4gU28gYWxsb2NhdGUgYWxsIGRlc3RpbmF0aW9ucyBmaXJzdCwgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90CisgKiBhcnJpdmUgZWFybHkgYW5kIG92ZXJ3cml0ZSBhIHRleHR1cmUgY29vcmRpbmF0ZSB3ZSdyZSBnb2luZyB0byB1c2UgbGF0ZXIKKyAqIGluIHRoZSBibG9jay4KKyAqLworc3RhdGljIHZvaWQgZW1pdF9hbGxfdGV4KHN0cnVjdCBwYWlyX3N0YXRlICpzKQoreworCXN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpyZWFkeXRleDsKKwlzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqcGFpcmluc3Q7CisKKwlBU1NFUlQocy0+UmVhZHlURVgpOworCisJLy8gRG9uJ3QgbGV0IHRoZSByZWFkeSBsaXN0IGNoYW5nZSB1bmRlciB1cyEKKwlyZWFkeXRleCA9IHMtPlJlYWR5VEVYOworCXMtPlJlYWR5VEVYID0gMDsKKworCS8vIEFsbG9jYXRlIGRlc3RpbmF0aW9uIGhhcmR3YXJlIHJlZ2lzdGVycyBpbiBvbmUgYmxvY2sgdG8gYXZvaWQgY29uZmxpY3RzLgorCWZvcihwYWlyaW5zdCA9IHJlYWR5dGV4OyBwYWlyaW5zdDsgcGFpcmluc3QgPSBwYWlyaW5zdC0+TmV4dFJlYWR5KSB7CisJCWludCBpcCA9IHBhaXJpbnN0IC0gcy0+SW5zdHJ1Y3Rpb25zOworCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucyArIGlwOworCQlpZiAoaW5zdC0+T3Bjb2RlICE9IE9QQ09ERV9LSUwpCisJCQlnZXRfaHdfcmVnKHMsIGluc3QtPkRzdFJlZy5GaWxlLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOworCX0KKworCWlmIChzLT5EZWJ1ZykKKwkJX21lc2FfcHJpbnRmKCIgQkVHSU5fVEVYXG4iKTsKKworCWlmIChzLT5IYW5kbGVyLT5CZWdpblRleEJsb2NrKQorCQlzLT5FcnJvciA9IHMtPkVycm9yIHx8ICFzLT5IYW5kbGVyLT5CZWdpblRleEJsb2NrKHMtPlVzZXJEYXRhKTsKKworCWZvcihwYWlyaW5zdCA9IHJlYWR5dGV4OyBwYWlyaW5zdDsgcGFpcmluc3QgPSBwYWlyaW5zdC0+TmV4dFJlYWR5KSB7CisJCWludCBpcCA9IHBhaXJpbnN0IC0gcy0+SW5zdHJ1Y3Rpb25zOworCQlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucyArIGlwOworCQljb21taXRfaW5zdHJ1Y3Rpb24ocywgaXApOworCisJCWlmIChpbnN0LT5PcGNvZGUgIT0gT1BDT0RFX0tJTCkKKwkJCWluc3QtPkRzdFJlZy5JbmRleCA9IGdldF9od19yZWcocywgaW5zdC0+RHN0UmVnLkZpbGUsIGluc3QtPkRzdFJlZy5JbmRleCk7CisJCWluc3QtPlNyY1JlZ1swXS5JbmRleCA9IGdldF9od19yZWcocywgaW5zdC0+U3JjUmVnWzBdLkZpbGUsIGluc3QtPlNyY1JlZ1swXS5JbmRleCk7CisKKwkJaWYgKHMtPkRlYnVnKSB7CisJCQlfbWVzYV9wcmludGYoIiAgICIpOworCQkJX21lc2FfcHJpbnRfaW5zdHJ1Y3Rpb24oaW5zdCk7CisJCX0KKwkJcy0+RXJyb3IgPSBzLT5FcnJvciB8fCAhcy0+SGFuZGxlci0+RW1pdFRleChzLT5Vc2VyRGF0YSwgaW5zdCk7CisJfQorCisJaWYgKHMtPkRlYnVnKQorCQlfbWVzYV9wcmludGYoIiBFTkRfVEVYXG4iKTsKK30KKworCitzdGF0aWMgaW50IGFsbG9jX3BhaXJfc291cmNlKHN0cnVjdCBwYWlyX3N0YXRlICpzLCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24gKnBhaXIsCisJc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIHNyYywgR0xib29sZWFuIHJnYiwgR0xib29sZWFuIGFscGhhKQoreworCWludCBjYW5kaWRhdGUgPSAtMTsKKwlpbnQgY2FuZGlkYXRlX3F1YWxpdHkgPSAtMTsKKwlpbnQgaTsKKworCWlmICghcmdiICYmICFhbHBoYSkKKwkJcmV0dXJuIDA7CisKKwlHTHVpbnQgY29uc3RhbnQ7CisJR0x1aW50IGluZGV4OworCisJaWYgKHNyYy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZIHx8IHNyYy5GaWxlID09IFBST0dSQU1fSU5QVVQpIHsKKwkJY29uc3RhbnQgPSAwOworCQlpbmRleCA9IGdldF9od19yZWcocywgc3JjLkZpbGUsIHNyYy5JbmRleCk7CisJfSBlbHNlIHsKKwkJY29uc3RhbnQgPSAxOworCQlzLT5FcnJvciB8PSAhcy0+SGFuZGxlci0+RW1pdENvbnN0KHMtPlVzZXJEYXRhLCBzcmMuRmlsZSwgc3JjLkluZGV4LCAmaW5kZXgpOworCX0KKworCWZvcihpID0gMDsgaSA8IDM7ICsraSkgeworCQlpbnQgcSA9IDA7CisJCWlmIChyZ2IpIHsKKwkJCWlmIChwYWlyLT5SR0IuU3JjW2ldLlVzZWQpIHsKKwkJCQlpZiAocGFpci0+UkdCLlNyY1tpXS5Db25zdGFudCAhPSBjb25zdGFudCB8fAorCQkJCSAgICBwYWlyLT5SR0IuU3JjW2ldLkluZGV4ICE9IGluZGV4KQorCQkJCQljb250aW51ZTsKKwkJCQlxKys7CisJCQl9CisJCX0KKwkJaWYgKGFscGhhKSB7CisJCQlpZiAocGFpci0+QWxwaGEuU3JjW2ldLlVzZWQpIHsKKwkJCQlpZiAocGFpci0+QWxwaGEuU3JjW2ldLkNvbnN0YW50ICE9IGNvbnN0YW50IHx8CisJCQkJICAgIHBhaXItPkFscGhhLlNyY1tpXS5JbmRleCAhPSBpbmRleCkKKwkJCQkJY29udGludWU7CisJCQkJcSsrOworCQkJfQorCQl9CisJCWlmIChxID4gY2FuZGlkYXRlX3F1YWxpdHkpIHsKKwkJCWNhbmRpZGF0ZV9xdWFsaXR5ID0gcTsKKwkJCWNhbmRpZGF0ZSA9IGk7CisJCX0KKwl9CisKKwlpZiAoY2FuZGlkYXRlID49IDApIHsKKwkJaWYgKHJnYikgeworCQkJcGFpci0+UkdCLlNyY1tjYW5kaWRhdGVdLlVzZWQgPSAxOworCQkJcGFpci0+UkdCLlNyY1tjYW5kaWRhdGVdLkNvbnN0YW50ID0gY29uc3RhbnQ7CisJCQlwYWlyLT5SR0IuU3JjW2NhbmRpZGF0ZV0uSW5kZXggPSBpbmRleDsKKwkJfQorCQlpZiAoYWxwaGEpIHsKKwkJCXBhaXItPkFscGhhLlNyY1tjYW5kaWRhdGVdLlVzZWQgPSAxOworCQkJcGFpci0+QWxwaGEuU3JjW2NhbmRpZGF0ZV0uQ29uc3RhbnQgPSBjb25zdGFudDsKKwkJCXBhaXItPkFscGhhLlNyY1tjYW5kaWRhdGVdLkluZGV4ID0gaW5kZXg7CisJCX0KKwl9CisKKwlyZXR1cm4gY2FuZGlkYXRlOworfQorCisvKioKKyAqIEZpbGwgdGhlIGdpdmVuIEFMVSBpbnN0cnVjdGlvbidzIG9wY29kZXMgYW5kIHNvdXJjZSBvcGVyYW5kcyBpbnRvIHRoZSBnaXZlbiBwYWlyLAorICogaWYgcG9zc2libGUuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4gZmlsbF9pbnN0cnVjdGlvbl9pbnRvX3BhaXIoc3RydWN0IHBhaXJfc3RhdGUgKnMsIHN0cnVjdCByYWRlb25fcGFpcl9pbnN0cnVjdGlvbiAqcGFpciwgaW50IGlwKQoreworCXN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uICpwYWlyaW5zdCA9IHMtPkluc3RydWN0aW9ucyArIGlwOworCXN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcy0+UHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zICsgaXA7CisKKwlBU1NFUlQoIXBhaXJpbnN0LT5OZWVkUkdCIHx8IHBhaXItPlJHQi5PcGNvZGUgPT0gT1BDT0RFX05PUCk7CisJQVNTRVJUKCFwYWlyaW5zdC0+TmVlZEFscGhhIHx8IHBhaXItPkFscGhhLk9wY29kZSA9PSBPUENPREVfTk9QKTsKKworCWlmIChwYWlyaW5zdC0+TmVlZFJHQikgeworCQlpZiAocGFpcmluc3QtPklzVHJhbnNjZW5kZW50KQorCQkJcGFpci0+UkdCLk9wY29kZSA9IE9QQ09ERV9SRVBMX0FMUEhBOworCQllbHNlCisJCQlwYWlyLT5SR0IuT3Bjb2RlID0gaW5zdC0+T3Bjb2RlOworCQlpZiAoaW5zdC0+U2F0dXJhdGVNb2RlID09IFNBVFVSQVRFX1pFUk9fT05FKQorCQkJcGFpci0+UkdCLlNhdHVyYXRlID0gMTsKKwl9CisJaWYgKHBhaXJpbnN0LT5OZWVkQWxwaGEpIHsKKwkJcGFpci0+QWxwaGEuT3Bjb2RlID0gaW5zdC0+T3Bjb2RlOworCQlpZiAoaW5zdC0+U2F0dXJhdGVNb2RlID09IFNBVFVSQVRFX1pFUk9fT05FKQorCQkJcGFpci0+QWxwaGEuU2F0dXJhdGUgPSAxOworCX0KKworCWludCBuYXJncyA9IF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7CisJaW50IGk7CisKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIEREWC9ERFkgKE1ESC9NRFYpLiAqLworCWlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0REWCB8fCBpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0REWSkgeworCQlpZiAocGFpci0+UkdCLlNyY1swXS5Vc2VkIHx8IHBhaXItPkFscGhhLlNyY1swXS5Vc2VkKQorCQkJcmV0dXJuIEdMX0ZBTFNFOworCQllbHNlCisJCQluYXJncysrOworCX0KKworCWZvcihpID0gMDsgaSA8IG5hcmdzOyArK2kpIHsKKwkJaW50IHNvdXJjZTsKKwkJaWYgKHBhaXJpbnN0LT5OZWVkUkdCICYmICFwYWlyaW5zdC0+SXNUcmFuc2NlbmRlbnQpIHsKKwkJCUdMYm9vbGVhbiBzcmNyZ2IgPSBHTF9GQUxTRTsKKwkJCUdMYm9vbGVhbiBzcmNhbHBoYSA9IEdMX0ZBTFNFOworCQkJR0x1aW50IG5lZ2F0ZWJhc2UgPSAwOworCQkJaW50IGo7CisJCQlmb3IoaiA9IDA7IGogPCAzOyArK2opIHsKKwkJCQlHTHVpbnQgc3d6ID0gR0VUX1NXWihpbnN0LT5TcmNSZWdbaV0uU3dpenpsZSwgaik7CisJCQkJaWYgKHN3eiA8IDMpCisJCQkJCXNyY3JnYiA9IEdMX1RSVUU7CisJCQkJZWxzZSBpZiAoc3d6IDwgNCkKKwkJCQkJc3JjYWxwaGEgPSBHTF9UUlVFOworCQkJCWlmIChzd3ogIT0gU1dJWlpMRV9OSUwgJiYgR0VUX0JJVChpbnN0LT5TcmNSZWdbaV0uTmVnYXRlQmFzZSwgaikpCisJCQkJCW5lZ2F0ZWJhc2UgPSAxOworCQkJfQorCQkJc291cmNlID0gYWxsb2NfcGFpcl9zb3VyY2UocywgcGFpciwgaW5zdC0+U3JjUmVnW2ldLCBzcmNyZ2IsIHNyY2FscGhhKTsKKwkJCWlmIChzb3VyY2UgPCAwKQorCQkJCXJldHVybiBHTF9GQUxTRTsKKwkJCXBhaXItPlJHQi5BcmdbaV0uU291cmNlID0gc291cmNlOworCQkJcGFpci0+UkdCLkFyZ1tpXS5Td2l6emxlID0gaW5zdC0+U3JjUmVnW2ldLlN3aXp6bGUgJiAweDFmZjsKKwkJCXBhaXItPlJHQi5BcmdbaV0uQWJzID0gaW5zdC0+U3JjUmVnW2ldLkFiczsKKwkJCXBhaXItPlJHQi5BcmdbaV0uTmVnYXRlID0gKG5lZ2F0ZWJhc2UgJiB+cGFpci0+UkdCLkFyZ1tpXS5BYnMpIF4gaW5zdC0+U3JjUmVnW2ldLk5lZ2F0ZUFiczsKKwkJfQorCQlpZiAocGFpcmluc3QtPk5lZWRBbHBoYSkgeworCQkJR0xib29sZWFuIHNyY3JnYiA9IEdMX0ZBTFNFOworCQkJR0xib29sZWFuIHNyY2FscGhhID0gR0xfRkFMU0U7CisJCQlHTHVpbnQgbmVnYXRlYmFzZSA9IEdFVF9CSVQoaW5zdC0+U3JjUmVnW2ldLk5lZ2F0ZUJhc2UsIHBhaXJpbnN0LT5Jc1RyYW5zY2VuZGVudCA/IDAgOiAzKTsKKwkJCUdMdWludCBzd3ogPSBHRVRfU1daKGluc3QtPlNyY1JlZ1tpXS5Td2l6emxlLCBwYWlyaW5zdC0+SXNUcmFuc2NlbmRlbnQgPyAwIDogMyk7CisJCQlpZiAoc3d6IDwgMykKKwkJCQlzcmNyZ2IgPSBHTF9UUlVFOworCQkJZWxzZSBpZiAoc3d6IDwgNCkKKwkJCQlzcmNhbHBoYSA9IEdMX1RSVUU7CisJCQlzb3VyY2UgPSBhbGxvY19wYWlyX3NvdXJjZShzLCBwYWlyLCBpbnN0LT5TcmNSZWdbaV0sIHNyY3JnYiwgc3JjYWxwaGEpOworCQkJaWYgKHNvdXJjZSA8IDApCisJCQkJcmV0dXJuIEdMX0ZBTFNFOworCQkJcGFpci0+QWxwaGEuQXJnW2ldLlNvdXJjZSA9IHNvdXJjZTsKKwkJCXBhaXItPkFscGhhLkFyZ1tpXS5Td2l6emxlID0gc3d6OworCQkJcGFpci0+QWxwaGEuQXJnW2ldLkFicyA9IGluc3QtPlNyY1JlZ1tpXS5BYnM7CisJCQlwYWlyLT5BbHBoYS5BcmdbaV0uTmVnYXRlID0gKG5lZ2F0ZWJhc2UgJiB+cGFpci0+UkdCLkFyZ1tpXS5BYnMpIF4gaW5zdC0+U3JjUmVnW2ldLk5lZ2F0ZUFiczsKKwkJfQorCX0KKworCXJldHVybiBHTF9UUlVFOworfQorCisKKy8qKgorICogRmlsbCBpbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBpcyBzcGxpdCBmcm9tIGZpbGxpbmcgaW4gc291cmNlIHJlZ2lzdGVycyBiZWNhdXNlIHdlIHdhbnQKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgaGFyZHdhcmUgdGVtcG9yYXJpZXMgZm9yIGRlc3RpbmF0aW9ucyB1bnRpbAorICogd2UgYXJlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IHdlJ3JlIGdvaW5nIHRvIGVtaXQgYSBjZXJ0YWluCisgKiBpbnN0cnVjdGlvbiBwYWlyaW5nLgorICovCitzdGF0aWMgdm9pZCBmaWxsX2Rlc3RfaW50b19wYWlyKHN0cnVjdCBwYWlyX3N0YXRlICpzLCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24gKnBhaXIsIGludCBpcCkKK3sKKwlzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqcGFpcmluc3QgPSBzLT5JbnN0cnVjdGlvbnMgKyBpcDsKKwlzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHMtPlByb2dyYW0tPkluc3RydWN0aW9ucyArIGlwOworCisJaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fT1VUUFVUKSB7CisJCWlmIChpbnN0LT5Ec3RSZWcuSW5kZXggPT0gRlJBR19SRVNVTFRfQ09MUikgeworCQkJcGFpci0+UkdCLk91dHB1dFdyaXRlTWFzayB8PSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1hZWjsKKwkJCXBhaXItPkFscGhhLk91dHB1dFdyaXRlTWFzayB8PSBHRVRfQklUKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2ssIDMpOworCQl9IGVsc2UgaWYgKGluc3QtPkRzdFJlZy5JbmRleCA9PSBGUkFHX1JFU1VMVF9ERVBSKSB7CisJCQlwYWlyLT5BbHBoYS5EZXB0aFdyaXRlTWFzayB8PSBHRVRfQklUKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2ssIDMpOworCQl9CisJfSBlbHNlIHsKKwkJR0x1aW50IGh3aW5kZXggPSBnZXRfaHdfcmVnKHMsIGluc3QtPkRzdFJlZy5GaWxlLCBpbnN0LT5Ec3RSZWcuSW5kZXgpOworCQlpZiAocGFpcmluc3QtPk5lZWRSR0IpIHsKKwkJCXBhaXItPlJHQi5EZXN0SW5kZXggPSBod2luZGV4OworCQkJcGFpci0+UkdCLldyaXRlTWFzayB8PSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgV1JJVEVNQVNLX1hZWjsKKwkJfQorCQlpZiAocGFpcmluc3QtPk5lZWRBbHBoYSkgeworCQkJcGFpci0+QWxwaGEuRGVzdEluZGV4ID0gaHdpbmRleDsKKwkJCXBhaXItPkFscGhhLldyaXRlTWFzayB8PSBHRVRfQklUKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2ssIDMpOworCQl9CisJfQorfQorCisKKy8qKgorICogRmluZCBhIGdvb2QgQUxVIGluc3RydWN0aW9uIG9yIHBhaXIgb2YgQUxVIGluc3RydWN0aW9uIGFuZCBlbWl0IGl0LgorICoKKyAqIFByZWZlciBlbWl0dGluZyBmdWxsIEFMVSBpbnN0cnVjdGlvbnMsIHNvIHRoYXQgd2hlbiB3ZSByZWFjaCBhIHBvaW50CisgKiB3aGVyZSBubyBmdWxsIEFMVSBpbnN0cnVjdGlvbiBjYW4gYmUgZW1pdHRlZCwgd2UgaGF2ZSBtb3JlIGNhbmRpZGF0ZXMKKyAqIGZvciBSR0IvQWxwaGEgcGFpcmluZy4KKyAqLworc3RhdGljIHZvaWQgZW1pdF9hbHUoc3RydWN0IHBhaXJfc3RhdGUgKnMpCit7CisJc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uIHBhaXI7CisKKwlpZiAocy0+UmVhZHlGdWxsQUxVIHx8ICEocy0+UmVhZHlSR0IgJiYgcy0+UmVhZHlBbHBoYSkpIHsKKwkJaW50IGlwOworCQlpZiAocy0+UmVhZHlGdWxsQUxVKSB7CisJCQlpcCA9IHMtPlJlYWR5RnVsbEFMVSAtIHMtPkluc3RydWN0aW9uczsKKwkJCXMtPlJlYWR5RnVsbEFMVSA9IHMtPlJlYWR5RnVsbEFMVS0+TmV4dFJlYWR5OworCQl9IGVsc2UgaWYgKHMtPlJlYWR5UkdCKSB7CisJCQlpcCA9IHMtPlJlYWR5UkdCIC0gcy0+SW5zdHJ1Y3Rpb25zOworCQkJcy0+UmVhZHlSR0IgPSBzLT5SZWFkeVJHQi0+TmV4dFJlYWR5OworCQl9IGVsc2UgeworCQkJaXAgPSBzLT5SZWFkeUFscGhhIC0gcy0+SW5zdHJ1Y3Rpb25zOworCQkJcy0+UmVhZHlBbHBoYSA9IHMtPlJlYWR5QWxwaGEtPk5leHRSZWFkeTsKKwkJfQorCisJCV9tZXNhX2J6ZXJvKCZwYWlyLCBzaXplb2YocGFpcikpOworCQlmaWxsX2luc3RydWN0aW9uX2ludG9fcGFpcihzLCAmcGFpciwgaXApOworCQlmaWxsX2Rlc3RfaW50b19wYWlyKHMsICZwYWlyLCBpcCk7CisJCWNvbW1pdF9pbnN0cnVjdGlvbihzLCBpcCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHBhaXJfc3RhdGVfaW5zdHJ1Y3Rpb24gKipwcmdiOworCQlzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbiAqKnBhbHBoYTsKKworCQkvKiBTb21lIHBhaXJpbmdzIG1pZ2h0IGZhaWwgYmVjYXVzZSB0aGV5IHJlcXVpcmUgdG9vCisJCSAqIG1hbnkgc291cmNlIHNsb3RzOyB0cnkgYWxsIHBvc3NpYmxlIHBhaXJpbmdzIGlmIG5lY2Vzc2FyeSAqLworCQlmb3IocHJnYiA9ICZzLT5SZWFkeVJHQjsgKnByZ2I7IHByZ2IgPSAmKCpwcmdiKS0+TmV4dFJlYWR5KSB7CisJCQlmb3IocGFscGhhID0gJnMtPlJlYWR5QWxwaGE7ICpwYWxwaGE7IHBhbHBoYSA9ICYoKnBhbHBoYSktPk5leHRSZWFkeSkgeworCQkJCWludCByZ2JpcCA9ICpwcmdiIC0gcy0+SW5zdHJ1Y3Rpb25zOworCQkJCWludCBhbHBoYWlwID0gKnBhbHBoYSAtIHMtPkluc3RydWN0aW9uczsKKwkJCQlfbWVzYV9iemVybygmcGFpciwgc2l6ZW9mKHBhaXIpKTsKKwkJCQlmaWxsX2luc3RydWN0aW9uX2ludG9fcGFpcihzLCAmcGFpciwgcmdiaXApOworCQkJCWlmICghZmlsbF9pbnN0cnVjdGlvbl9pbnRvX3BhaXIocywgJnBhaXIsIGFscGhhaXApKQorCQkJCQljb250aW51ZTsKKwkJCQkqcHJnYiA9ICgqcHJnYiktPk5leHRSZWFkeTsKKwkJCQkqcGFscGhhID0gKCpwYWxwaGEpLT5OZXh0UmVhZHk7CisJCQkJZmlsbF9kZXN0X2ludG9fcGFpcihzLCAmcGFpciwgcmdiaXApOworCQkJCWZpbGxfZGVzdF9pbnRvX3BhaXIocywgJnBhaXIsIGFscGhhaXApOworCQkJCWNvbW1pdF9pbnN0cnVjdGlvbihzLCByZ2JpcCk7CisJCQkJY29tbWl0X2luc3RydWN0aW9uKHMsIGFscGhhaXApOworCQkJCWdvdG8gc3VjY2VzczsKKwkJCX0KKwkJfQorCisJCS8qIE5vIHN1Y2Nlc3MgaW4gcGFpcmluZzsganVzdCB0YWtlIHRoZSBmaXJzdCBSR0IgaW5zdHJ1Y3Rpb24gKi8KKwkJaW50IGlwID0gcy0+UmVhZHlSR0IgLSBzLT5JbnN0cnVjdGlvbnM7CisJCXMtPlJlYWR5UkdCID0gcy0+UmVhZHlSR0ItPk5leHRSZWFkeTsKKwkJX21lc2FfYnplcm8oJnBhaXIsIHNpemVvZihwYWlyKSk7CisJCWZpbGxfaW5zdHJ1Y3Rpb25faW50b19wYWlyKHMsICZwYWlyLCBpcCk7CisJCWZpbGxfZGVzdF9pbnRvX3BhaXIocywgJnBhaXIsIGlwKTsKKwkJY29tbWl0X2luc3RydWN0aW9uKHMsIGlwKTsKKwlzdWNjZXNzOiA7CisJfQorCisJaWYgKHMtPkRlYnVnKQorCQlyYWRlb25QcmludFBhaXJJbnN0cnVjdGlvbigmcGFpcik7CisKKwlzLT5FcnJvciA9IHMtPkVycm9yIHx8ICFzLT5IYW5kbGVyLT5FbWl0UGFpcmVkKHMtPlVzZXJEYXRhLCAmcGFpcik7Cit9CisKKworR0xib29sZWFuIHJhZGVvblBhaXJQcm9ncmFtKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSwKKwljb25zdCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaGFuZGxlciogaGFuZGxlciwgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHBhaXJfc3RhdGUgczsKKworCV9tZXNhX2J6ZXJvKCZzLCBzaXplb2YocykpOworCXMuQ3R4ID0gY3R4OworCXMuUHJvZ3JhbSA9IHByb2dyYW07CisJcy5IYW5kbGVyID0gaGFuZGxlcjsKKwlzLlVzZXJEYXRhID0gdXNlcmRhdGE7CisJcy5EZWJ1ZyA9IChSQURFT05fREVCVUcgJiBERUJVR19QSVhFTCkgPyBHTF9UUlVFIDogR0xfRkFMU0U7CisJcy5WZXJib3NlID0gR0xfRkFMU0UgJiYgcy5EZWJ1ZzsKKworCXMuSW5zdHJ1Y3Rpb25zID0gKHN0cnVjdCBwYWlyX3N0YXRlX2luc3RydWN0aW9uKilfbWVzYV9jYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgcGFpcl9zdGF0ZV9pbnN0cnVjdGlvbikqcy5Qcm9ncmFtLT5OdW1JbnN0cnVjdGlvbnMpOworCXMuVmFsdWVQb29sID0gKHN0cnVjdCByZWdfdmFsdWUqKV9tZXNhX2NhbGxvYyhzaXplb2Yoc3RydWN0IHJlZ192YWx1ZSkqcy5Qcm9ncmFtLT5OdW1JbnN0cnVjdGlvbnMqNCk7CisJcy5SZWFkZXJQb29sID0gKHN0cnVjdCByZWdfdmFsdWVfcmVhZGVyKilfbWVzYV9jYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgcmVnX3ZhbHVlX3JlYWRlcikqcy5Qcm9ncmFtLT5OdW1JbnN0cnVjdGlvbnMqMTIpOworCisJaWYgKHMuRGVidWcpCisJCV9tZXNhX3ByaW50ZigiRW1pdCBwYWlyZWQgcHJvZ3JhbVxuIik7CisKKwlzY2FuX2luc3RydWN0aW9ucygmcyk7CisJYWxsb2NhdGVfaW5wdXRfcmVnaXN0ZXJzKCZzKTsKKworCXdoaWxlKCFzLkVycm9yICYmCisJICAgICAgKHMuUmVhZHlURVggfHwgcy5SZWFkeVJHQiB8fCBzLlJlYWR5QWxwaGEgfHwgcy5SZWFkeUZ1bGxBTFUpKSB7CisJCWlmIChzLlJlYWR5VEVYKQorCQkJZW1pdF9hbGxfdGV4KCZzKTsKKworCQl3aGlsZShzLlJlYWR5RnVsbEFMVSB8fCBzLlJlYWR5UkdCIHx8IHMuUmVhZHlBbHBoYSkKKwkJCWVtaXRfYWx1KCZzKTsKKwl9CisKKwlpZiAocy5EZWJ1ZykKKwkJX21lc2FfcHJpbnRmKCIgRU5EXG4iKTsKKworCV9tZXNhX2ZyZWUocy5JbnN0cnVjdGlvbnMpOworCV9tZXNhX2ZyZWUocy5WYWx1ZVBvb2wpOworCV9tZXNhX2ZyZWUocy5SZWFkZXJQb29sKTsKKworCXJldHVybiAhcy5FcnJvcjsKK30KKworCitzdGF0aWMgdm9pZCBwcmludF9wYWlyX3NyYyhpbnQgaSwgc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uX3NvdXJjZSogc3JjKQoreworCV9tZXNhX3ByaW50ZigiICBTcmMlaSA9ICVzWyVpXSIsIGksIHNyYy0+Q29uc3RhbnQgPyAiQ05TVCIgOiAiVEVNUCIsIHNyYy0+SW5kZXgpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogb3Bjb2RlX3N0cmluZyhHTHVpbnQgb3Bjb2RlKQoreworCWlmIChvcGNvZGUgPT0gT1BDT0RFX1JFUExfQUxQSEEpCisJCXJldHVybiAiU09QIjsKKwllbHNlCisJCXJldHVybiBfbWVzYV9vcGNvZGVfc3RyaW5nKG9wY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgbnVtX3BhaXJpbnN0X2FyZ3MoR0x1aW50IG9wY29kZSkKK3sKKwlpZiAob3Bjb2RlID09IE9QQ09ERV9SRVBMX0FMUEhBKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBfbWVzYV9udW1faW5zdF9zcmNfcmVncyhvcGNvZGUpOworfQorCitzdGF0aWMgY2hhciBzd2l6emxlX2NoYXIoR0x1aW50IHN3eikKK3sKKwlzd2l0Y2goc3d6KSB7CisJY2FzZSBTV0laWkxFX1g6IHJldHVybiAneCc7CisJY2FzZSBTV0laWkxFX1k6IHJldHVybiAneSc7CisJY2FzZSBTV0laWkxFX1o6IHJldHVybiAneic7CisJY2FzZSBTV0laWkxFX1c6IHJldHVybiAndyc7CisJY2FzZSBTV0laWkxFX1pFUk86IHJldHVybiAnMCc7CisJY2FzZSBTV0laWkxFX09ORTogcmV0dXJuICcxJzsKKwljYXNlIFNXSVpaTEVfTklMOiByZXR1cm4gJ18nOworCWRlZmF1bHQ6IHJldHVybiAnPyc7CisJfQorfQorCit2b2lkIHJhZGVvblByaW50UGFpckluc3RydWN0aW9uKHN0cnVjdCByYWRlb25fcGFpcl9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKwlpbnQgbmFyZ3M7CisJaW50IGk7CisKKwlfbWVzYV9wcmludGYoIiAgICAgICBSR0I6ICAiKTsKKwlmb3IoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJaWYgKGluc3QtPlJHQi5TcmNbaV0uVXNlZCkKKwkJCXByaW50X3BhaXJfc3JjKGksIGluc3QtPlJHQi5TcmMgKyBpKTsKKwl9CisJX21lc2FfcHJpbnRmKCJcbiIpOworCV9tZXNhX3ByaW50ZigiICAgICAgIEFscGhhOiIpOworCWZvcihpID0gMDsgaSA8IDM7ICsraSkgeworCQlpZiAoaW5zdC0+QWxwaGEuU3JjW2ldLlVzZWQpCisJCQlwcmludF9wYWlyX3NyYyhpLCBpbnN0LT5BbHBoYS5TcmMgKyBpKTsKKwl9CisJX21lc2FfcHJpbnRmKCJcbiIpOworCisJX21lc2FfcHJpbnRmKCIgICVzJXMiLCBvcGNvZGVfc3RyaW5nKGluc3QtPlJHQi5PcGNvZGUpLCBpbnN0LT5SR0IuU2F0dXJhdGUgPyAiX1NBVCIgOiAiIik7CisJaWYgKGluc3QtPlJHQi5Xcml0ZU1hc2spCisJCV9tZXNhX3ByaW50ZigiIFRFTVBbJWldLiVzJXMlcyIsIGluc3QtPlJHQi5EZXN0SW5kZXgsCisJCQkoaW5zdC0+UkdCLldyaXRlTWFzayAmIDEpID8gIngiIDogIiIsCisJCQkoaW5zdC0+UkdCLldyaXRlTWFzayAmIDIpID8gInkiIDogIiIsCisJCQkoaW5zdC0+UkdCLldyaXRlTWFzayAmIDQpID8gInoiIDogIiIpOworCWlmIChpbnN0LT5SR0IuT3V0cHV0V3JpdGVNYXNrKQorCQlfbWVzYV9wcmludGYoIiBDT0xPUi4lcyVzJXMiLAorCQkJKGluc3QtPlJHQi5PdXRwdXRXcml0ZU1hc2sgJiAxKSA/ICJ4IiA6ICIiLAorCQkJKGluc3QtPlJHQi5PdXRwdXRXcml0ZU1hc2sgJiAyKSA/ICJ5IiA6ICIiLAorCQkJKGluc3QtPlJHQi5PdXRwdXRXcml0ZU1hc2sgJiA0KSA/ICJ6IiA6ICIiKTsKKwluYXJncyA9IG51bV9wYWlyaW5zdF9hcmdzKGluc3QtPlJHQi5PcGNvZGUpOworCWZvcihpID0gMDsgaSA8IG5hcmdzOyArK2kpIHsKKwkJY29uc3QgY2hhciogYWJzID0gaW5zdC0+UkdCLkFyZ1tpXS5BYnMgPyAifCIgOiAiIjsKKwkJY29uc3QgY2hhciogbmVnID0gaW5zdC0+UkdCLkFyZ1tpXS5OZWdhdGUgPyAiLSIgOiAiIjsKKwkJX21lc2FfcHJpbnRmKCIsICVzJXNTcmMlaS4lYyVjJWMlcyIsIG5lZywgYWJzLCBpbnN0LT5SR0IuQXJnW2ldLlNvdXJjZSwKKwkJCXN3aXp6bGVfY2hhcihHRVRfU1daKGluc3QtPlJHQi5BcmdbaV0uU3dpenpsZSwgMCkpLAorCQkJc3dpenpsZV9jaGFyKEdFVF9TV1ooaW5zdC0+UkdCLkFyZ1tpXS5Td2l6emxlLCAxKSksCisJCQlzd2l6emxlX2NoYXIoR0VUX1NXWihpbnN0LT5SR0IuQXJnW2ldLlN3aXp6bGUsIDIpKSwKKwkJCWFicyk7CisJfQorCV9tZXNhX3ByaW50ZigiXG4iKTsKKworCV9tZXNhX3ByaW50ZigiICAlcyVzIiwgb3Bjb2RlX3N0cmluZyhpbnN0LT5BbHBoYS5PcGNvZGUpLCBpbnN0LT5BbHBoYS5TYXR1cmF0ZSA/ICJfU0FUIiA6ICIiKTsKKwlpZiAoaW5zdC0+QWxwaGEuV3JpdGVNYXNrKQorCQlfbWVzYV9wcmludGYoIiBURU1QWyVpXS53IiwgaW5zdC0+QWxwaGEuRGVzdEluZGV4KTsKKwlpZiAoaW5zdC0+QWxwaGEuT3V0cHV0V3JpdGVNYXNrKQorCQlfbWVzYV9wcmludGYoIiBDT0xPUi53Iik7CisJaWYgKGluc3QtPkFscGhhLkRlcHRoV3JpdGVNYXNrKQorCQlfbWVzYV9wcmludGYoIiBERVBUSC53Iik7CisJbmFyZ3MgPSBudW1fcGFpcmluc3RfYXJncyhpbnN0LT5BbHBoYS5PcGNvZGUpOworCWZvcihpID0gMDsgaSA8IG5hcmdzOyArK2kpIHsKKwkJY29uc3QgY2hhciogYWJzID0gaW5zdC0+QWxwaGEuQXJnW2ldLkFicyA/ICJ8IiA6ICIiOworCQljb25zdCBjaGFyKiBuZWcgPSBpbnN0LT5BbHBoYS5BcmdbaV0uTmVnYXRlID8gIi0iIDogIiI7CisJCV9tZXNhX3ByaW50ZigiLCAlcyVzU3JjJWkuJWMlcyIsIG5lZywgYWJzLCBpbnN0LT5BbHBoYS5BcmdbaV0uU291cmNlLAorCQkJc3dpenpsZV9jaGFyKGluc3QtPkFscGhhLkFyZ1tpXS5Td2l6emxlKSwgYWJzKTsKKwl9CisJX21lc2FfcHJpbnRmKCJcbiIpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbV9wYWlyLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9wcm9ncmFtX3BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI0YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fcHJvZ3JhbV9wYWlyLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmljb2xhaSBIYWVobmxlLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19SQURFT05fUFJPR1JBTV9QQUlSX0hfCisjZGVmaW5lIF9fUkFERU9OX1BST0dSQU1fUEFJUl9IXworCisjaW5jbHVkZSAicmFkZW9uX3Byb2dyYW0uaCIKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBwYWlyZWQgaW5zdHJ1Y3Rpb24sIGFzIGZvdW5kIGluIFIzMDAgYW5kIFI1MDAKKyAqIGZyYWdtZW50IHByb2dyYW1zLgorICovCitzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb25fc291cmNlIHsKKwlHTHVpbnQgSW5kZXg6ODsKKwlHTHVpbnQgQ29uc3RhbnQ6MTsKKwlHTHVpbnQgVXNlZDoxOworfTsKKworc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uX3JnYiB7CisJR0x1aW50IE9wY29kZTo4OworCUdMdWludCBEZXN0SW5kZXg6ODsKKwlHTHVpbnQgV3JpdGVNYXNrOjM7CisJR0x1aW50IE91dHB1dFdyaXRlTWFzazozOworCUdMdWludCBTYXR1cmF0ZToxOworCisJc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uX3NvdXJjZSBTcmNbM107CisKKwlzdHJ1Y3QgeworCQlHTHVpbnQgU291cmNlOjI7CisJCUdMdWludCBTd2l6emxlOjk7CisJCUdMdWludCBBYnM6MTsKKwkJR0x1aW50IE5lZ2F0ZToxOworCX0gQXJnWzNdOworfTsKKworc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uX2FscGhhIHsKKwlHTHVpbnQgT3Bjb2RlOjg7CisJR0x1aW50IERlc3RJbmRleDo4OworCUdMdWludCBXcml0ZU1hc2s6MTsKKwlHTHVpbnQgT3V0cHV0V3JpdGVNYXNrOjE7CisJR0x1aW50IERlcHRoV3JpdGVNYXNrOjE7CisJR0x1aW50IFNhdHVyYXRlOjE7CisKKwlzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb25fc291cmNlIFNyY1szXTsKKworCXN0cnVjdCB7CisJCUdMdWludCBTb3VyY2U6MjsKKwkJR0x1aW50IFN3aXp6bGU6MzsKKwkJR0x1aW50IEFiczoxOworCQlHTHVpbnQgTmVnYXRlOjE7CisJfSBBcmdbM107Cit9OworCitzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24geworCXN0cnVjdCByYWRlb25fcGFpcl9pbnN0cnVjdGlvbl9yZ2IgUkdCOworCXN0cnVjdCByYWRlb25fcGFpcl9pbnN0cnVjdGlvbl9hbHBoYSBBbHBoYTsKK307CisKKworLyoqCisgKgorICovCitzdHJ1Y3QgcmFkZW9uX3BhaXJfaGFuZGxlciB7CisJLyoqCisJICogRmlsbCBpbiB0aGUgcHJvcGVyIGhhcmR3YXJlIGluZGV4IGZvciB0aGUgZ2l2ZW4gY29uc3RhbnQgcmVnaXN0ZXIuCisJICoKKwkgKiBAcmV0dXJuIEdMX0ZBTFNFIG9uIGVycm9yLgorCSAqLworCUdMYm9vbGVhbiAoKkVtaXRDb25zdCkodm9pZCosIEdMdWludCBmaWxlLCBHTHVpbnQgaW5kZXgsIEdMdWludCAqaHdpbmRleCk7CisKKwkvKioKKwkgKiBXcml0ZSBhIHBhaXJlZCBpbnN0cnVjdGlvbiB0byB0aGUgaGFyZHdhcmUuCisJICoKKwkgKiBAcmV0dXJuIEdMX0ZBTFNFIG9uIGVycm9yLgorCSAqLworCUdMYm9vbGVhbiAoKkVtaXRQYWlyZWQpKHZvaWQqLCBzdHJ1Y3QgcmFkZW9uX3BhaXJfaW5zdHJ1Y3Rpb24qKTsKKworCS8qKgorCSAqIFdyaXRlIGEgdGV4dHVyZSBpbnN0cnVjdGlvbiB0byB0aGUgaGFyZHdhcmUuCisJICogUmVnaXN0ZXIgaW5kaWNlcyBoYXZlIGFscmVhZHkgYmVlbiByZXdyaXR0ZW4gdG8gdGhlIGFsbG9jYXRlZAorCSAqIGhhcmR3YXJlIHJlZ2lzdGVyIG51bWJlcnMuCisJICoKKwkgKiBAcmV0dXJuIEdMX0ZBTFNFIG9uIGVycm9yLgorCSAqLworCUdMYm9vbGVhbiAoKkVtaXRUZXgpKHZvaWQqLCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiopOworCisJLyoqCisJICogQ2FsbGVkIGJlZm9yZSBhIGJsb2NrIG9mIGNvbnRpZ3VvdXMsIGluZGVwZW5kZW50IHRleHR1cmUKKwkgKiBpbnN0cnVjdGlvbnMgaXMgZW1pdHRlZC4KKwkgKi8KKwlHTGJvb2xlYW4gKCpCZWdpblRleEJsb2NrKSh2b2lkKik7CisKKwlHTHVpbnQgTWF4SHdUZW1wczsKK307CisKK0dMYm9vbGVhbiByYWRlb25QYWlyUHJvZ3JhbShHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0sCisJY29uc3Qgc3RydWN0IHJhZGVvbl9wYWlyX2hhbmRsZXIqLCB2b2lkICp1c2VyZGF0YSk7CisKK3ZvaWQgcmFkZW9uUHJpbnRQYWlySW5zdHJ1Y3Rpb24oc3RydWN0IHJhZGVvbl9wYWlyX2luc3RydWN0aW9uICppbnN0KTsKKworI2VuZGlmIC8qIF9fUkFERU9OX1BST0dSQU1fUEFJUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fc3Bhbi5jCmluZGV4IGVhZTA5ZDYuLjM2MTZkOGIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX3NwYW4uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9zcGFuLmMKQEAgLTE3Miw2ICsxNzIsOCBAQAogCiAvKiAxNi1iaXQgZGVwdGggYnVmZmVyIGZ1bmN0aW9ucwogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJCQkJCVwKICAgICooR0x1c2hvcnQgKikoYnVmICsgcmFkZW9uX21iYV96MTYoIGRyYiwgX3ggKyB4bywgX3kgKyB5byApKSA9IGQ7CiAKQEAgLTE4Niw2ICsxODgsOCBAQAogICogQ2FyZWZ1bDogSXQgbG9va3MgbGlrZSB0aGUgUjMwMCB1c2VzIFpaWlMgYnl0ZSBvcmRlciB3aGlsZSB0aGUgUjIwMAogICogdXNlcyBTWlpaIGZvciAyNCBiaXQgZGVwdGgsIDggYml0IHN0ZW5jaWwgbW9kZS4KICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjaWZkZWYgQ09NUElMRV9SMzAwCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKQEAgLTI4Miw2ICsyODYsMzAgQEAKICNlbmRpZgogCUxPQ0tfSEFSRFdBUkUocm1lc2EpOwogCXJhZGVvbldhaXRGb3JJZGxlTG9ja2VkKHJtZXNhKTsKKworCS8qIFJlYWQgdGhlIGZpcnN0IHBpeGVsIGluIHRoZSBmcmFtZSBidWZmZXIuICBUaGlzIHNob3VsZAorCSAqIGJlIGEgbm9vcCwgcmlnaHQ/ICBJbiBmYWN0IHdpdGhvdXQgdGhpcyBjb25mb3JtIGZhaWxzIGFzIHJlYWRpbmcKKwkgKiBmcm9tIHRoZSBmcmFtZWJ1ZmZlciBzb21ldGltZXMgcHJvZHVjZXMgb2xkIHJlc3VsdHMgLS0gdGhlCisJICogb24tY2FyZCByZWFkIGNhY2hlIGdldHMgbWl4ZWQgdXAgYW5kIGRvZXNuJ3Qgbm90aWNlIHRoYXQgdGhlCisJICogZnJhbWVidWZmZXIgaGFzIGJlZW4gdXBkYXRlZC4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBzaG91bGQgcHJvYmFibHkgYmUgcmVhZGluZyBzb21lIG90aGVyd2lzZSB1bnVzZWQKKwkgKiByZWdpb24gb2YgVlJBTSwgb3RoZXJ3aXNlIHdlIG1pZ2h0IGdldCBpbmNvcnJlY3QgcmVzdWx0cyB3aGVuCisJICogcmVhZGluZyBwaXhlbHMgZnJvbSB0aGUgdG9wIGxlZnQgb2YgdGhlIHNjcmVlbi4KKwkgKgorCSAqIEkgZm91bmQgdGhpcyBwcm9ibGVtIG9uIGFuIFI0MjAgd2l0aCBnbGVhbidzIHRleEN1YmUgdGVzdC4KKwkgKiBOb3RlIHRoYXQgdGhlIFIyMDAgc3BhbiBjb2RlIGFsc28gKndyaXRlcyogdGhlIGZpcnN0IHBpeGVsIGluIHRoZQorCSAqIGZyYW1lYnVmZmVyLCBidXQgSSd2ZSBmb3VuZCB0aGlzIHRvIGJlIHVubmVjZXNzYXJ5LgorCSAqICAtLSBOaWNvbGFpIEjDpGhubGUsIEp1bmUgMjAwOAorCSAqLworCXsKKwkJaW50IHA7CisJCWRyaVJlbmRlcmJ1ZmZlciAqZHJiID0KKwkJCShkcmlSZW5kZXJidWZmZXIgKikgY3R4LT5XaW5TeXNEcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKKwkJdm9sYXRpbGUgaW50ICpidWYgPQorCQkJKHZvbGF0aWxlIGludCAqKShybWVzYS0+ZHJpLnNjcmVlbi0+cEZCICsgZHJiLT5vZmZzZXQpOworCQlwID0gKmJ1ZjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHJhZGVvblNwYW5SZW5kZXJGaW5pc2goR0xjb250ZXh0ICogY3R4KQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fc3RhdGUuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3IzMDAvcmFkZW9uX3N0YXRlLmMKaW5kZXggODJiZmQ5NS4uZDgxMzE4YyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcjMwMC9yYWRlb25fc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yMzAwL3JhZGVvbl9zdGF0ZS5jCkBAIC0xMjUsOCArMTI1LDggQEAKIAogCQlyYWRlb24tPnN0YXRlLnNjaXNzb3IucmVjdC54MSA9IHgxOwogCQlyYWRlb24tPnN0YXRlLnNjaXNzb3IucmVjdC55MSA9IHkxOwotCQlyYWRlb24tPnN0YXRlLnNjaXNzb3IucmVjdC54MiA9IHgxICsgY3R4LT5TY2lzc29yLldpZHRoIC0gMTsKLQkJcmFkZW9uLT5zdGF0ZS5zY2lzc29yLnJlY3QueTIgPSB5MSArIGN0eC0+U2Npc3Nvci5IZWlnaHQgLSAxOworCQlyYWRlb24tPnN0YXRlLnNjaXNzb3IucmVjdC54MiA9IHgxICsgY3R4LT5TY2lzc29yLldpZHRoOworCQlyYWRlb24tPnN0YXRlLnNjaXNzb3IucmVjdC55MiA9IHkxICsgY3R4LT5TY2lzc29yLkhlaWdodDsKIAogCQlyYWRlb25SZWNhbGNTY2lzc29yUmVjdHMocmFkZW9uKTsKIAl9CkBAIC0xNTIsNyArMTUyLDcgQEAKIAlHTGZyYW1lYnVmZmVyICpjb25zdCBkcmF3X2ZiID0gKEdMZnJhbWVidWZmZXIqKWRyYXdhYmxlLT5kcml2ZXJQcml2YXRlOwogCUdMZnJhbWVidWZmZXIgKmNvbnN0IHJlYWRfZmIgPSAoR0xmcmFtZWJ1ZmZlciopcmVhZGFibGUtPmRyaXZlclByaXZhdGU7CiAKLQlpZiAoZHJhd19mYi0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gPT0gQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKKwlpZiAoZHJhd19mYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0JBQ0tfTEVGVCkgewogCQkvKiBDYW4ndCBpZ25vcmUgMmQgd2luZG93cyBpZiB3ZSBhcmUgcGFnZSBmbGlwcGluZy4gKi8KIAkJaWYgKGRyYXdhYmxlLT5udW1CYWNrQ2xpcFJlY3RzID09IDAgfHwgcmFkZW9uLT5kb1BhZ2VGbGlwIHx8CiAJCSAgICByYWRlb24tPnNhcmVhLT5wZkN1cnJlbnRQYWdlID09IDEpIHsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fY2hpcHNldC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jaGlwc2V0LmgKaW5kZXggNzMxODA5OS4uNTVhNzNlYSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jaGlwc2V0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jaGlwc2V0LmgKQEAgLTEwNiw2ICsxMDYsNyBAQAogI2RlZmluZSBQQ0lfQ0hJUF9SVjQxMF81NjRGCQkweDU2NEYKICNkZWZpbmUgUENJX0NISVBfUlY0MTBfNTY1MgkJMHg1NjUyCiAjZGVmaW5lIFBDSV9DSElQX1JWNDEwXzU2NTMJCTB4NTY1MworI2RlZmluZSBQQ0lfQ0hJUF9SVjQxMF81NjU3CQkweDU2NTcKICNkZWZpbmUgUENJX0NISVBfUlMzMDBfNTgzNAkJMHg1ODM0CiAjZGVmaW5lIFBDSV9DSElQX1JTMzAwXzU4MzUJCTB4NTgzNQogI2RlZmluZSBQQ0lfQ0hJUF9SUzQ4MF81OTU0CQkweDU5NTQKQEAgLTE0NSw4ICsxNDYsMTEyIEBACiAjZGVmaW5lIFBDSV9DSElQX1JWNDEwXzVFNEMJCTB4NUU0QwogI2RlZmluZSBQQ0lfQ0hJUF9SVjQxMF81RTRECQkweDVFNEQKICNkZWZpbmUgUENJX0NISVBfUlY0MTBfNUU0RgkJMHg1RTRGCisKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTAwICAgICAgICAgICAgICAweDcxMDAKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTAxICAgICAgICAgICAgICAweDcxMDEKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTAyICAgICAgICAgICAgICAweDcxMDIKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTAzICAgICAgICAgICAgICAweDcxMDMKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTA0ICAgICAgICAgICAgICAweDcxMDQKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTA1ICAgICAgICAgICAgICAweDcxMDUKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTA2ICAgICAgICAgICAgICAweDcxMDYKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTA4ICAgICAgICAgICAgICAweDcxMDgKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTA5ICAgICAgICAgICAgICAweDcxMDkKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTBBICAgICAgICAgICAgICAweDcxMEEKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTBCICAgICAgICAgICAgICAweDcxMEIKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTBDICAgICAgICAgICAgICAweDcxMEMKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTBFICAgICAgICAgICAgICAweDcxMEUKKyNkZWZpbmUgUENJX0NISVBfUjUyMF83MTBGICAgICAgICAgICAgICAweDcxMEYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0MCAgICAgICAgICAgICAweDcxNDAKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0MSAgICAgICAgICAgICAweDcxNDEKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0MiAgICAgICAgICAgICAweDcxNDIKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0MyAgICAgICAgICAgICAweDcxNDMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0NCAgICAgICAgICAgICAweDcxNDQKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0NSAgICAgICAgICAgICAweDcxNDUKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0NiAgICAgICAgICAgICAweDcxNDYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0NyAgICAgICAgICAgICAweDcxNDcKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0OSAgICAgICAgICAgICAweDcxNDkKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0QSAgICAgICAgICAgICAweDcxNEEKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0QiAgICAgICAgICAgICAweDcxNEIKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0QyAgICAgICAgICAgICAweDcxNEMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0RCAgICAgICAgICAgICAweDcxNEQKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0RSAgICAgICAgICAgICAweDcxNEUKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE0RiAgICAgICAgICAgICAweDcxNEYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE1MSAgICAgICAgICAgICAweDcxNTEKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE1MiAgICAgICAgICAgICAweDcxNTIKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE1MyAgICAgICAgICAgICAweDcxNTMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE1RSAgICAgICAgICAgICAweDcxNUUKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE1RiAgICAgICAgICAgICAweDcxNUYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4MCAgICAgICAgICAgICAweDcxODAKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4MSAgICAgICAgICAgICAweDcxODEKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4MyAgICAgICAgICAgICAweDcxODMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4NiAgICAgICAgICAgICAweDcxODYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4NyAgICAgICAgICAgICAweDcxODcKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4OCAgICAgICAgICAgICAweDcxODgKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4QSAgICAgICAgICAgICAweDcxOEEKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4QiAgICAgICAgICAgICAweDcxOEIKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4QyAgICAgICAgICAgICAweDcxOEMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4RCAgICAgICAgICAgICAweDcxOEQKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE4RiAgICAgICAgICAgICAweDcxOEYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE5MyAgICAgICAgICAgICAweDcxOTMKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE5NiAgICAgICAgICAgICAweDcxOTYKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE5QiAgICAgICAgICAgICAweDcxOUIKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzE5RiAgICAgICAgICAgICAweDcxOUYKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDMCAgICAgICAgICAgICAweDcxQzAKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDMSAgICAgICAgICAgICAweDcxQzEKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDMiAgICAgICAgICAgICAweDcxQzIKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDMyAgICAgICAgICAgICAweDcxQzMKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDNCAgICAgICAgICAgICAweDcxQzQKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDNSAgICAgICAgICAgICAweDcxQzUKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDNiAgICAgICAgICAgICAweDcxQzYKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDNyAgICAgICAgICAgICAweDcxQzcKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDRCAgICAgICAgICAgICAweDcxQ0QKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFDRSAgICAgICAgICAgICAweDcxQ0UKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFEMiAgICAgICAgICAgICAweDcxRDIKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFENCAgICAgICAgICAgICAweDcxRDQKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFENSAgICAgICAgICAgICAweDcxRDUKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFENiAgICAgICAgICAgICAweDcxRDYKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFEQSAgICAgICAgICAgICAweDcxREEKKyNkZWZpbmUgUENJX0NISVBfUlY1MzBfNzFERSAgICAgICAgICAgICAweDcxREUKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzIwMCAgICAgICAgICAgICAweDcyMDAKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzIxMCAgICAgICAgICAgICAweDcyMTAKKyNkZWZpbmUgUENJX0NISVBfUlY1MTVfNzIxMSAgICAgICAgICAgICAweDcyMTEKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQwICAgICAgICAgICAgICAweDcyNDAKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQzICAgICAgICAgICAgICAweDcyNDMKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ0ICAgICAgICAgICAgICAweDcyNDQKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ1ICAgICAgICAgICAgICAweDcyNDUKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ2ICAgICAgICAgICAgICAweDcyNDYKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ3ICAgICAgICAgICAgICAweDcyNDcKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ4ICAgICAgICAgICAgICAweDcyNDgKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjQ5ICAgICAgICAgICAgICAweDcyNDkKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjRBICAgICAgICAgICAgICAweDcyNEEKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjRCICAgICAgICAgICAgICAweDcyNEIKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjRDICAgICAgICAgICAgICAweDcyNEMKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjREICAgICAgICAgICAgICAweDcyNEQKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjRFICAgICAgICAgICAgICAweDcyNEUKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83MjRGICAgICAgICAgICAgICAweDcyNEYKKyNkZWZpbmUgUENJX0NISVBfUlY1NzBfNzI4MCAgICAgICAgICAgICAweDcyODAKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI4MSAgICAgICAgICAgICAweDcyODEKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI4MyAgICAgICAgICAgICAweDcyODMKKyNkZWZpbmUgUENJX0NISVBfUjU4MF83Mjg0ICAgICAgICAgICAgICAweDcyODQKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI4NyAgICAgICAgICAgICAweDcyODcKKyNkZWZpbmUgUENJX0NISVBfUlY1NzBfNzI4OCAgICAgICAgICAgICAweDcyODgKKyNkZWZpbmUgUENJX0NISVBfUlY1NzBfNzI4OSAgICAgICAgICAgICAweDcyODkKKyNkZWZpbmUgUENJX0NISVBfUlY1NzBfNzI4QiAgICAgICAgICAgICAweDcyOEIKKyNkZWZpbmUgUENJX0NISVBfUlY1NzBfNzI4QyAgICAgICAgICAgICAweDcyOEMKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI5MCAgICAgICAgICAgICAweDcyOTAKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI5MSAgICAgICAgICAgICAweDcyOTEKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI5MyAgICAgICAgICAgICAweDcyOTMKKyNkZWZpbmUgUENJX0NISVBfUlY1NjBfNzI5NyAgICAgICAgICAgICAweDcyOTcKKwogI2RlZmluZSBQQ0lfQ0hJUF9SUzM1MF83ODM0CQkweDc4MzQKICNkZWZpbmUgUENJX0NISVBfUlMzNTBfNzgzNQkJMHg3ODM1CisjZGVmaW5lIFBDSV9DSElQX1JTNjkwXzc5MUUgICAgICAgICAgICAgMHg3OTFFCisjZGVmaW5lIFBDSV9DSElQX1JTNjkwXzc5MUYgICAgICAgICAgICAgMHg3OTFGCisjZGVmaW5lIFBDSV9DSElQX1JTNzQwXzc5NkMgICAgICAgICAgICAgMHg3OTZDCisjZGVmaW5lIFBDSV9DSElQX1JTNzQwXzc5NkQgICAgICAgICAgICAgMHg3OTZECisjZGVmaW5lIFBDSV9DSElQX1JTNzQwXzc5NkUgICAgICAgICAgICAgMHg3OTZFCisjZGVmaW5lIFBDSV9DSElQX1JTNzQwXzc5NkYgICAgICAgICAgICAgMHg3OTZGCisKIAogZW51bSB7CiAgICBDSElQX0ZBTUlMWV9SMTAwLApAQCAtMTY1LDYgKzI3MCwxNCBAQAogICAgQ0hJUF9GQU1JTFlfUjQyMCwKICAgIENISVBfRkFNSUxZX1JWNDEwLAogICAgQ0hJUF9GQU1JTFlfUlM0MDAsCisgICBDSElQX0ZBTUlMWV9SUzY5MCwKKyAgIENISVBfRkFNSUxZX1JTNzQwLAorICAgQ0hJUF9GQU1JTFlfUlY1MTUsCisgICBDSElQX0ZBTUlMWV9SNTIwLAorICAgQ0hJUF9GQU1JTFlfUlY1MzAsCisgICBDSElQX0ZBTUlMWV9SNTgwLAorICAgQ0hJUF9GQU1JTFlfUlY1NjAsCisgICBDSElQX0ZBTUlMWV9SVjU3MCwKICAgIENISVBfRkFNSUxZX0xBU1QKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fY29udGV4dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmMKaW5kZXggYmE5M2EwNS4uMWU5OTJjMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmMKQEAgLTM0LDE0ICszNCwxNSBAQAogICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CiAgKi8KIAotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAiYXBpX2FycmF5ZWx0LmgiCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgInNpbXBsZV9saXN0LmgiCi0jaW5jbHVkZSAiaW1wb3J0cy5oIgotI2luY2x1ZGUgIm1hdHJpeC5oIgotI2luY2x1ZGUgImV4dGVuc2lvbnMuaCIKLSNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2FwaV9hcnJheWVsdC5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorI2luY2x1ZGUgIm1haW4vc2ltcGxlX2xpc3QuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL21hdHJpeC5oIgorI2luY2x1ZGUgIm1haW4vZXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIm1haW4vZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJtYWluL3N0YXRlLmgiCiAKICNpbmNsdWRlICJzd3Jhc3Qvc3dyYXN0LmgiCiAjaW5jbHVkZSAic3dyYXN0X3NldHVwL3N3cmFzdF9zZXR1cC5oIgpAQCAtMjMxLDE0ICsyMzIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmX21heF9hbmlzb3Ryb3B5Iik7CiAKICAgIGlmICggZHJpUXVlcnlPcHRpb25iKCAmcm1lc2EtPm9wdGlvbkNhY2hlLCAiaHlwZXJ6IiApICkgewotICAgICAgaWYgKCBzUHJpdi0+ZHJtTWlub3IgPCAxMyApCisgICAgICBpZiAoIHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA8IDEzICkKIAkgZnByaW50Ziggc3RkZXJyLCAiRFJNIHZlcnNpb24gMS4lZCB0b28gb2xkIHRvIHN1cHBvcnQgSHlwZXJaLCAiCi0JCQkgICJkaXNhYmxpbmcuXG4iLHNQcml2LT5kcm1NaW5vciApOworCQkJICAiZGlzYWJsaW5nLlxuIiwgc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yICk7CiAgICAgICBlbHNlCiAJIHJtZXNhLT51c2luZ19oeXBlcnogPSBHTF9UUlVFOwogICAgfQogCi0gICBpZiAoIHNQcml2LT5kcm1NaW5vciA+PSAxNSApCisgICBpZiAoIHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxNSApCiAgICAgICBybWVzYS0+dGV4bWljcm90aWxlID0gR0xfVFJVRTsKIAogICAgLyogSW5pdCBkZWZhdWx0IGRyaXZlciBmdW5jdGlvbnMgdGhlbiBwbHVnIGluIG91ciBSYWRlb24tc3BlY2lmaWMgZnVuY3Rpb25zCkBAIC0yNjksNyArMjcwLDcgQEAKICAgIHJtZXNhLT5kcmkuaHdDb250ZXh0ID0gZHJpQ29udGV4dFByaXYtPmhIV0NvbnRleHQ7CiAgICBybWVzYS0+ZHJpLmh3TG9jayA9ICZzUHJpdi0+cFNBUkVBLT5sb2NrOwogICAgcm1lc2EtPmRyaS5mZCA9IHNQcml2LT5mZDsKLSAgIHJtZXNhLT5kcmkuZHJtTWlub3IgPSBzUHJpdi0+ZHJtTWlub3I7CisgICBybWVzYS0+ZHJpLmRybU1pbm9yID0gc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yOwogCiAgICBybWVzYS0+cmFkZW9uU2NyZWVuID0gc2NyZWVuOwogICAgcm1lc2EtPnNhcmVhID0gKGRybV9yYWRlb25fc2FyZWFfdCAqKSgoR0x1Ynl0ZSAqKXNQcml2LT5wU0FSRUEgKwpAQCAtNDIyLDEwICs0MjMsNyBAQAogCiAgICBybWVzYS0+ZG9fdXNsZWVwcyA9IChmdGhyb3R0bGVfbW9kZSA9PSBEUklfQ09ORl9GVEhST1RUTEVfVVNMRUVQUyk7CiAKLSAgIHJtZXNhLT52YmxhbmtfZmxhZ3MgPSAocm1lc2EtPnJhZGVvblNjcmVlbi0+aXJxICE9IDApCi0gICAgICAgPyBkcmlHZXREZWZhdWx0VkJsYW5rRmxhZ3MoJnJtZXNhLT5vcHRpb25DYWNoZSkgOiBWQkxBTktfRkxBR19OT19JUlE7Ci0KLSAgICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF91c3QgKTsKKyAgICgqc1ByaXYtPnN5c3RlbVRpbWUtPmdldFVTVCkoICYgcm1lc2EtPnN3YXBfdXN0ICk7CiAKIAogI2lmIERPX0RFQlVHCkBAIC01OTAsMTYgKzU4OCwxOCBAQAogICAgICAgaWYgKFJBREVPTl9ERUJVRyAmIERFQlVHX0RSSSkKIAkgZnByaW50ZihzdGRlcnIsICIlcyBjdHggJXBcbiIsIF9fRlVOQ1RJT05fXywgKHZvaWQgKikgbmV3Q3R4LT5nbEN0eCk7CiAKLSAgICAgIGlmICggbmV3Q3R4LT5kcmkuZHJhd2FibGUgIT0gZHJpRHJhd1ByaXYgKSB7Ci0gICAgICAgICAvKiBYWFggd2UgbWF5IG5lZWQgdG8gdmFsaWRhdGUgdGhlIGRyYXdhYmxlIGhlcmUhISEgKi8KLQkgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiwgbmV3Q3R4LT52YmxhbmtfZmxhZ3MsCi0JCQkJJm5ld0N0eC0+dmJsX3NlcSApOwotICAgICAgfQotCiAgICAgICBuZXdDdHgtPmRyaS5yZWFkYWJsZSA9IGRyaVJlYWRQcml2OwogCiAgICAgICBpZiAoIChuZXdDdHgtPmRyaS5kcmF3YWJsZSAhPSBkcmlEcmF3UHJpdikgfHwKICAgICAgICAgICAgbmV3Q3R4LT5sYXN0U3RhbXAgIT0gZHJpRHJhd1ByaXYtPmxhc3RTdGFtcCApIHsKKwkgaWYgKGRyaURyYXdQcml2LT5zd2FwX2ludGVydmFsID09ICh1bnNpZ25lZCktMSkgeworCSAgICBkcmlEcmF3UHJpdi0+dmJsRmxhZ3MgPSAobmV3Q3R4LT5yYWRlb25TY3JlZW4tPmlycSAhPSAwKQorCSAgICAgICA/IGRyaUdldERlZmF1bHRWQmxhbmtGbGFncygmbmV3Q3R4LT5vcHRpb25DYWNoZSkKKwkgICAgICAgOiBWQkxBTktfRkxBR19OT19JUlE7CisKKwkgICAgZHJpRHJhd2FibGVJbml0VkJsYW5rKCBkcmlEcmF3UHJpdiApOworCSB9CisKIAkgbmV3Q3R4LT5kcmkuZHJhd2FibGUgPSBkcmlEcmF3UHJpdjsKIAogCSByYWRlb25TZXRDbGlwcmVjdHMobmV3Q3R4KTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmgKaW5kZXggOGRlZGQ2Ni4uYmM0M2ZjNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9jb250ZXh0LmgKQEAgLTE2MSw2ICsxNjEsOCBAQAogCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2VbNl1bUkFERU9OX01BWF9URVhUVVJFX0xFVkVMU107CiAJLyogU2l4LCBmb3IgdGhlIGN1YmUgZmFjZXMgKi8KIAorCUdMYm9vbGVhbiBpbWFnZV9vdmVycmlkZTsgLyogSW1hZ2Ugb3ZlcnJpZGRlbiBieSBHTFhfRVhUX3RmcCAqLworCiAJR0x1aW50IHBwX3R4ZmlsdGVyOwkvKiBoYXJkd2FyZSByZWdpc3RlciB2YWx1ZXMgKi8KIAlHTHVpbnQgcHBfdHhmb3JtYXQ7CiAJR0x1aW50IHBwX3R4b2Zmc2V0OwkvKiBJbWFnZSBsb2NhdGlvbiBpbiB0ZXhtZW0uCkBAIC02NjcsOSArNjY5LDYgQEAKIAogCS8qIFZCSQogCSAqLwotCUdMdWludCB2Ymxfc2VxOwotCUdMdWludCB2YmxhbmtfZmxhZ3M7Ci0KIAlpbnQ2NF90IHN3YXBfdXN0OwogCWludDY0X3Qgc3dhcF9taXNzZWRfdXN0OwogCkBAIC03MDgsOSArNzA3LDkgQEAKIAogI2RlZmluZSBSQURFT05fQ09OVEVYVChjdHgpCQkoKHJhZGVvbkNvbnRleHRQdHIpKGN0eC0+RHJpdmVyQ3R4KSkKIAotc3RhdGljIF9faW5saW5lIEdMdWludCByYWRlb25QYWNrQ29sb3IoR0x1aW50IGNwcCwKLQkJCQkgICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCi0JCQkJICAgICAgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhKQorc3RhdGljIElOTElORSBHTHVpbnQgcmFkZW9uUGFja0NvbG9yKEdMdWludCBjcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEpCiB7CiAJc3dpdGNoIChjcHApIHsKIAljYXNlIDI6CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX2lvY3RsLmMKaW5kZXggYTBjNTYzYy4uZTY4MWNhMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9pb2N0bC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25faW9jdGwuYwpAQCAtODYyLDEzICs4NjIsMTQgQEAKIAogLyogQ29weSB0aGUgYmFjayBjb2xvciBidWZmZXIgdG8gdGhlIGZyb250IGNvbG9yIGJ1ZmZlci4KICAqLwotdm9pZCByYWRlb25Db3B5QnVmZmVyKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsCit2b2lkIHJhZGVvbkNvcHlCdWZmZXIoIF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdiwKIAkJICAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdAkgICpyZWN0KQogewogICAgcmFkZW9uQ29udGV4dFB0ciBybWVzYTsKICAgIEdMaW50IG5ib3gsIGksIHJldDsKICAgIEdMYm9vbGVhbiAgIG1pc3NlZF90YXJnZXQ7CiAgICBpbnQ2NF90IHVzdDsKKyAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwOwogCiAgICBhc3NlcnQoZFByaXYpOwogICAgYXNzZXJ0KGRQcml2LT5kcmlDb250ZXh0UHJpdik7CkBAIC04OTAsNyArODkxLDcgQEAKICAgIGlmICghcmVjdCkKICAgIHsKICAgICAgICBVTkxPQ0tfSEFSRFdBUkUoIHJtZXNhICk7Ci0gICAgICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICYgcm1lc2EtPnZibF9zZXEsIHJtZXNhLT52YmxhbmtfZmxhZ3MsICYgbWlzc2VkX3RhcmdldCApOworICAgICAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmIG1pc3NlZF90YXJnZXQgKTsKICAgICAgICBMT0NLX0hBUkRXQVJFKCBybWVzYSApOwogICAgfQogCkBAIC05MTcsMTYgKzkxOCwxOCBAQAogCSAgICAgIGlmIChyZWN0LT55MiA8IGItPnkyKQogCQkgIGItPnkyID0gcmVjdC0+eTI7CiAKLQkgICAgICBpZiAoYi0+eDEgPCBiLT54MiAmJiBiLT55MSA8IGItPnkyKQotCQkgIGIrKzsKKwkgICAgICBpZiAoYi0+eDEgPj0gYi0+eDIgfHwgYi0+eTEgPj0gYi0+eTIpCisJCSAgY29udGludWU7CiAJICB9Ci0JICBlbHNlCi0JICAgICAgYisrOwogCisJICBiKys7CiAJICBuKys7CiAgICAgICB9CiAgICAgICBybWVzYS0+c2FyZWEtPm5ib3ggPSBuOwogCisgICAgICBpZiAoIW4pCisJIGNvbnRpbnVlOworCiAgICAgICByZXQgPSBkcm1Db21tYW5kTm9uZSggcm1lc2EtPmRyaS5mZCwgRFJNX1JBREVPTl9TV0FQICk7CiAKICAgICAgIGlmICggcmV0ICkgewpAQCAtOTM5LDggKzk0Miw5IEBACiAgICBVTkxPQ0tfSEFSRFdBUkUoIHJtZXNhICk7CiAgICBpZiAoIXJlY3QpCiAgICB7CisgICAgICAgcHNwID0gZFByaXYtPmRyaVNjcmVlblByaXY7CiAgICAgICAgcm1lc2EtPnN3YXBfY291bnQrKzsKLSAgICAgICAoKmRyaV9pbnRlcmZhY2UtPmdldFVTVCkoICYgdXN0ICk7CisgICAgICAgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkoICYgdXN0ICk7CiAgICAgICAgaWYgKCBtaXNzZWRfdGFyZ2V0ICkgewogCSAgIHJtZXNhLT5zd2FwX21pc3NlZF9jb3VudCsrOwogCSAgIHJtZXNhLT5zd2FwX21pc3NlZF91c3QgPSB1c3QgLSBybWVzYS0+c3dhcF91c3Q7CkBAIC05NTEsMTcgKzk1NSwxOSBAQAogICAgfQogfQogCi12b2lkIHJhZGVvblBhZ2VGbGlwKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgKQordm9pZCByYWRlb25QYWdlRmxpcCggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ICkKIHsKICAgIHJhZGVvbkNvbnRleHRQdHIgcm1lc2E7CiAgICBHTGludCByZXQ7CiAgICBHTGJvb2xlYW4gICBtaXNzZWRfdGFyZ2V0OworICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7CiAKICAgIGFzc2VydChkUHJpdik7CiAgICBhc3NlcnQoZFByaXYtPmRyaUNvbnRleHRQcml2KTsKICAgIGFzc2VydChkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGUpOwogCiAgICBybWVzYSA9IChyYWRlb25Db250ZXh0UHRyKSBkUHJpdi0+ZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7CisgICBwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKIAogICAgaWYgKCBSQURFT05fREVCVUcgJiBERUJVR19JT0NUTCApIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBmQ3VycmVudFBhZ2U6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCkBAIC05ODYsMTAgKzk5MiwxMCBAQAogICAgICovCiAgICByYWRlb25XYWl0Rm9yRnJhbWVDb21wbGV0aW9uKCBybWVzYSApOwogICAgVU5MT0NLX0hBUkRXQVJFKCBybWVzYSApOwotICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICYgcm1lc2EtPnZibF9zZXEsIHJtZXNhLT52YmxhbmtfZmxhZ3MsICYgbWlzc2VkX3RhcmdldCApOworICAgZHJpV2FpdEZvclZCbGFuayggZFByaXYsICYgbWlzc2VkX3RhcmdldCApOwogICAgaWYgKCBtaXNzZWRfdGFyZ2V0ICkgewogICAgICAgcm1lc2EtPnN3YXBfbWlzc2VkX2NvdW50Kys7Ci0gICAgICAodm9pZCkgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmIHJtZXNhLT5zd2FwX21pc3NlZF91c3QgKTsKKyAgICAgICh2b2lkKSAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF9taXNzZWRfdXN0ICk7CiAgICB9CiAgICBMT0NLX0hBUkRXQVJFKCBybWVzYSApOwogCkBAIC0xMDAzLDcgKzEwMDksNyBAQAogICAgfQogCiAgICBybWVzYS0+c3dhcF9jb3VudCsrOwotICAgKHZvaWQpICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF91c3QgKTsKKyAgICh2b2lkKSAoKnBzcC0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJiBybWVzYS0+c3dhcF91c3QgKTsKIAogICAgLyogR2V0IHJlYWR5IGZvciBkcmF3aW5nIG5leHQgZnJhbWUuICBVcGRhdGUgdGhlIHJlbmRlcmJ1ZmZlcnMnCiAgICAgKiBmbGlwcGVkT2Zmc2V0L1BpdGNoIGZpZWxkcyBzbyB3ZSBkcmF3IGludG8gdGhlIHJpZ2h0IHBsYWNlLgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9pb2N0bC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9pb2N0bC5oCmluZGV4IDAyMGE1YzIuLmY4Yzk2YWYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25faW9jdGwuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX2lvY3RsLmgKQEAgLTg2LDkgKzg2LDkgQEAKIAkJCQkgICAgc3RydWN0IHJhZGVvbl9kbWFfcmVnaW9uICpyZWdpb24sCiAJCQkJICAgIGNvbnN0IGNoYXIgKmNhbGxlciApOwogCi1leHRlcm4gdm9pZCByYWRlb25Db3B5QnVmZmVyKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJhd2FibGUsCitleHRlcm4gdm9pZCByYWRlb25Db3B5QnVmZmVyKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJhd2FibGUsCiAJCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QJICpyZWN0KTsKLWV4dGVybiB2b2lkIHJhZGVvblBhZ2VGbGlwKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJhd2FibGUgKTsKK2V4dGVybiB2b2lkIHJhZGVvblBhZ2VGbGlwKCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHJhd2FibGUgKTsKIGV4dGVybiB2b2lkIHJhZGVvbkZsdXNoKCBHTGNvbnRleHQgKmN0eCApOwogZXh0ZXJuIHZvaWQgcmFkZW9uRmluaXNoKCBHTGNvbnRleHQgKmN0eCApOwogZXh0ZXJuIHZvaWQgcmFkZW9uV2FpdEZvcklkbGVMb2NrZWQoIHJhZGVvbkNvbnRleHRQdHIgcm1lc2EgKTsKQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgbWVtY3B5KCBybWVzYS0+aHcuQVRPTS5sYXN0Y21kLCBybWVzYS0+aHcuQVRPTS5jbWQsCVwKIAkgICBybWVzYS0+aHcuQVRPTS5jbWRfc2l6ZSAqIDQpCiAKLXN0YXRpYyBfX2lubGluZSBpbnQgUkFERU9OX0RCX1NUQVRFQ0hBTkdFKCAKK3N0YXRpYyBJTkxJTkUgaW50IFJBREVPTl9EQl9TVEFURUNIQU5HRSggCiAgICByYWRlb25Db250ZXh0UHRyIHJtZXNhLAogICAgc3RydWN0IHJhZGVvbl9zdGF0ZV9hdG9tICphdG9tICkKIHsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICogYW5kIGhhbmcgb24gdG8gdGhlIGxvY2sgdW50aWwgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgZmluaXNoZWQgYW5kIHdlIGZsdXNoCiAgKiB0aGUgYnVmZmVyIGFnYWluIGFuZCB1bmxvY2suCiAgKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIHJhZGVvbkVuc3VyZUNtZEJ1ZlNwYWNlKCByYWRlb25Db250ZXh0UHRyIHJtZXNhLAorc3RhdGljIElOTElORSB2b2lkIHJhZGVvbkVuc3VyZUNtZEJ1ZlNwYWNlKCByYWRlb25Db250ZXh0UHRyIHJtZXNhLAogCQkJCQkgICAgICBpbnQgYnl0ZXMgKQogewogICAgaWYgKHJtZXNhLT5zdG9yZS5jbWRfdXNlZCArIGJ5dGVzID4gUkFERU9OX0NNRF9CVUZfU1opCkBAIC0xODYsNyArMTg2LDcgQEAKIAogLyogQWxsb2Mgc3BhY2UgaW4gdGhlIGNvbW1hbmQgYnVmZmVyCiAgKi8KLXN0YXRpYyBfX2lubGluZSBjaGFyICpyYWRlb25BbGxvY0NtZEJ1ZiggcmFkZW9uQ29udGV4dFB0ciBybWVzYSwKK3N0YXRpYyBJTkxJTkUgY2hhciAqcmFkZW9uQWxsb2NDbWRCdWYoIHJhZGVvbkNvbnRleHRQdHIgcm1lc2EsCiAJCQkJCSBpbnQgYnl0ZXMsIGNvbnN0IGNoYXIgKndoZXJlICkKIHsKICAgIGlmIChybWVzYS0+c3RvcmUuY21kX3VzZWQgKyBieXRlcyA+IFJBREVPTl9DTURfQlVGX1NaKQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9zY3JlZW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc2NyZWVuLmMKaW5kZXggNzYyODQ4Zi4uZWRmODA0YyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9zY3JlZW4uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3NjcmVlbi5jCkBAIC00OCwxMCArNDgsMTIgQEAKICNpZiAhUkFERU9OX0NPTU1PTgogI2luY2x1ZGUgInJhZGVvbl9jb250ZXh0LmgiCiAjaW5jbHVkZSAicmFkZW9uX3NwYW4uaCIKKyNpbmNsdWRlICJyYWRlb25fdGV4LmgiCiAjZWxpZiBSQURFT05fQ09NTU9OICYmIGRlZmluZWQoUkFERU9OX0NPTU1PTl9GT1JfUjIwMCkKICNpbmNsdWRlICJyMjAwX2NvbnRleHQuaCIKICNpbmNsdWRlICJyMjAwX2lvY3RsLmgiCiAjaW5jbHVkZSAicjIwMF9zcGFuLmgiCisjaW5jbHVkZSAicjIwMF90ZXguaCIKICNlbGlmIFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMzAwKQogI2luY2x1ZGUgInIzMDBfY29udGV4dC5oIgogI2luY2x1ZGUgInIzMDBfZnJhZ3Byb2cuaCIKQEAgLTg4LDcgKzkwLDcgQEAKICAgICAgICAgRFJJX0NPTkZfQ09MT1JfUkVEVUNUSU9OKERSSV9DT05GX0NPTE9SX1JFRFVDVElPTl9ESVRIRVIpCiAgICAgICAgIERSSV9DT05GX1JPVU5EX01PREUoRFJJX0NPTkZfUk9VTkRfVFJVTkMpCiAgICAgICAgIERSSV9DT05GX0RJVEhFUl9NT0RFKERSSV9DT05GX0RJVEhFUl9YRVJST1JESUZGKQotICAgICAgICBEUklfQ09ORl9BTExPV19MQVJHRV9URVhUVVJFUygxKQorICAgICAgICBEUklfQ09ORl9BTExPV19MQVJHRV9URVhUVVJFUygyKQogICAgIERSSV9DT05GX1NFQ1RJT05fRU5ECiAgICAgRFJJX0NPTkZfU0VDVElPTl9ERUJVRwogICAgICAgICBEUklfQ09ORl9OT19SQVNUKGZhbHNlKQpAQCAtMTE1LDcgKzExNyw3IEBACiAgICAgICAgIERSSV9DT05GX0NPTE9SX1JFRFVDVElPTihEUklfQ09ORl9DT0xPUl9SRURVQ1RJT05fRElUSEVSKQogICAgICAgICBEUklfQ09ORl9ST1VORF9NT0RFKERSSV9DT05GX1JPVU5EX1RSVU5DKQogICAgICAgICBEUklfQ09ORl9ESVRIRVJfTU9ERShEUklfQ09ORl9ESVRIRVJfWEVSUk9SRElGRikKLSAgICAgICAgRFJJX0NPTkZfQUxMT1dfTEFSR0VfVEVYVFVSRVMoMSkKKyAgICAgICAgRFJJX0NPTkZfQUxMT1dfTEFSR0VfVEVYVFVSRVMoMikKICAgICAgICAgRFJJX0NPTkZfVEVYVFVSRV9CTEVORF9RVUFMSVRZKDEuMCwiMC4wOjEuMCIpCiAgICAgRFJJX0NPTkZfU0VDVElPTl9FTkQKICAgICBEUklfQ09ORl9TRUNUSU9OX0RFQlVHCkBAIC0xNzcsNyArMTc5LDcgQEAKICAgICAgICAgRFJJX0NPTkZfREVTQ19FTkQgXAogRFJJX0NPTkZfT1BUX0VORAogCi1jb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdID0KK1BVQkxJQyBjb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdID0KIERSSV9DT05GX0JFR0lOCiAJRFJJX0NPTkZfU0VDVElPTl9QRVJGT1JNQU5DRQogCQlEUklfQ09ORl9UQ0xfTU9ERShEUklfQ09ORl9UQ0xfQ09ERUdFTikKQEAgLTE4NiwxNCArMTg4LDEzIEBACiAJCURSSV9DT05GX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTKDgsIDIsIDgpCiAJCURSSV9DT05GX01BWF9URVhUVVJFX0NPT1JEX1VOSVRTKDgsIDIsIDgpCiAJCURSSV9DT05GX0NPTU1BTkRfQlVGRkVSX1NJWkUoOCwgOCwgMzIpCi0JCURSSV9DT05GX0RJU0FCTEVfRkFMTEJBQ0soZmFsc2UpCisJCURSSV9DT05GX0RJU0FCTEVfRkFMTEJBQ0sodHJ1ZSkKIAkJRFJJX0NPTkZfRElTQUJMRV9ET1VCTEVfU0lERV9TVEVOQ0lMKGZhbHNlKQogCURSSV9DT05GX1NFQ1RJT05fRU5ECiAJRFJJX0NPTkZfU0VDVElPTl9RVUFMSVRZCiAJCURSSV9DT05GX1RFWFRVUkVfREVQVEgoRFJJX0NPTkZfVEVYVFVSRV9ERVBUSF9GQikKIAkJRFJJX0NPTkZfREVGX01BWF9BTklTT1RST1BZKDEuMCwgIjEuMCwyLjAsNC4wLDguMCwxNi4wIikKLQkJRFJJX0NPTkZfTk9fTkVHX0xPRF9CSUFTKGZhbHNlKQotICAgICAgICAgICAgICAgIERSSV9DT05GX0ZPUkNFX1MzVENfRU5BQkxFKGZhbHNlKQorCQlEUklfQ09ORl9GT1JDRV9TM1RDX0VOQUJMRShmYWxzZSkKIAkJRFJJX0NPTkZfRElTQUJMRV9TM1RDKGZhbHNlKQogCQlEUklfQ09ORl9DT0xPUl9SRURVQ1RJT04oRFJJX0NPTkZfQ09MT1JfUkVEVUNUSU9OX0RJVEhFUikKIAkJRFJJX0NPTkZfUk9VTkRfTU9ERShEUklfQ09ORl9ST1VORF9UUlVOQykKQEAgLTIwNCw3ICsyMDUsNyBAQAogCQlEUklfQ09ORl9OT19SQVNUKGZhbHNlKQogCURSSV9DT05GX1NFQ1RJT05fRU5ECiBEUklfQ09ORl9FTkQ7Ci1zdGF0aWMgY29uc3QgR0x1aW50IF9fZHJpTkNvbmZpZ09wdGlvbnMgPSAxODsKK3N0YXRpYyBjb25zdCBHTHVpbnQgX19kcmlOQ29uZmlnT3B0aW9ucyA9IDE3OwogCiAjaWZuZGVmIFJBREVPTl9ERUJVRwogaW50IFJBREVPTl9ERUJVRyA9IDA7CkBAIC0yNDIsMjUgKzI0MywyNiBAQAogewogICBpbnQgcmV0OwogICBkcm1fcmFkZW9uX2dldHBhcmFtX3QgZ3A7Ci0gIAorCiAgIGdwLnBhcmFtID0gcGFyYW07CiAgIGdwLnZhbHVlID0gdmFsdWU7Ci0gIAorCiAgIHJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoIGZkLCBEUk1fUkFERU9OX0dFVFBBUkFNLCAmZ3AsIHNpemVvZihncCkpOwogICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi1yYWRlb25GaWxsSW5Nb2RlcyggdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKLQkJIHVuc2lnbmVkIHN0ZW5jaWxfYml0cywgR0xib29sZWFuIGhhdmVfYmFja19idWZmZXIgKQorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCityYWRlb25GaWxsSW5Nb2RlcyggX19EUklzY3JlZW5Qcml2YXRlICpwc3AsCisJCSAgIHVuc2lnbmVkIHBpeGVsX2JpdHMsIHVuc2lnbmVkIGRlcHRoX2JpdHMsCisJCSAgIHVuc2lnbmVkIHN0ZW5jaWxfYml0cywgR0xib29sZWFuIGhhdmVfYmFja19idWZmZXIgKQogewotICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlczsKLSAgICBfX0dMY29udGV4dE1vZGVzICogbTsKLSAgICB1bnNpZ25lZCBudW1fbW9kZXM7CisgICAgX19EUkljb25maWcgKipjb25maWdzOworICAgIF9fR0xjb250ZXh0TW9kZXMgKm07CiAgICAgdW5zaWduZWQgZGVwdGhfYnVmZmVyX2ZhY3RvcjsKICAgICB1bnNpZ25lZCBiYWNrX2J1ZmZlcl9mYWN0b3I7CiAgICAgR0xlbnVtIGZiX2Zvcm1hdDsKICAgICBHTGVudW0gZmJfdHlwZTsKKyAgICBpbnQgaTsKIAogICAgIC8qIFJpZ2h0IG5vdyBHTFhfU1dBUF9DT1BZX09NTCBpc24ndCBzdXBwb3J0ZWQsIGJ1dCBpdCB3b3VsZCBiZSBlYXN5CiAgICAgICogZW5vdWdoIHRvIGFkZCBzdXBwb3J0LiAgQmFzaWNhbGx5LCBpZiBhIGNvbnRleHQgaXMgY3JlYXRlZCB3aXRoIGFuCkBAIC0yNzcsNyArMjc5LDcgQEAKIAogICAgIGRlcHRoX2JpdHNfYXJyYXlbMF0gPSBkZXB0aF9iaXRzOwogICAgIGRlcHRoX2JpdHNfYXJyYXlbMV0gPSBkZXB0aF9iaXRzOwotICAgIAorCiAgICAgLyogSnVzdCBsaWtlIHdpdGggdGhlIGFjY3VtdWxhdGlvbiBidWZmZXIsIGFsd2F5cyBwcm92aWRlIHNvbWUgbW9kZXMKICAgICAgKiB3aXRoIGEgc3RlbmNpbCBidWZmZXIuICBJdCB3aWxsIGJlIGEgc3cgZmFsbGJhY2ssIGJ1dCBzb21lIGFwcHMgd29uJ3QKICAgICAgKiBjYXJlIGFib3V0IHRoYXQuCkBAIC0yODgsOCArMjkwLDYgQEAKICAgICBkZXB0aF9idWZmZXJfZmFjdG9yID0gKChkZXB0aF9iaXRzICE9IDApIHx8IChzdGVuY2lsX2JpdHMgIT0gMCkpID8gMiA6IDE7CiAgICAgYmFja19idWZmZXJfZmFjdG9yICA9IChoYXZlX2JhY2tfYnVmZmVyKSA/IDIgOiAxOwogCi0gICAgbnVtX21vZGVzID0gZGVwdGhfYnVmZmVyX2ZhY3RvciAqIGJhY2tfYnVmZmVyX2ZhY3RvciAqIDQ7Ci0KICAgICBpZiAoIHBpeGVsX2JpdHMgPT0gMTYgKSB7CiAgICAgICAgIGZiX2Zvcm1hdCA9IEdMX1JHQjsKICAgICAgICAgZmJfdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OwpAQCAtMjk5LDIxICsyOTksMTEgQEAKICAgICAgICAgZmJfdHlwZSA9IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVjsKICAgICB9CiAKLSAgICBtb2RlcyA9ICgqZHJpX2ludGVyZmFjZS0+Y3JlYXRlQ29udGV4dE1vZGVzKSggbnVtX21vZGVzLCBzaXplb2YoIF9fR0xjb250ZXh0TW9kZXMgKSApOwotICAgIG0gPSBtb2RlczsKLSAgICBpZiAoICEgZHJpRmlsbEluTW9kZXMoICYgbSwgZmJfZm9ybWF0LCBmYl90eXBlLAotCQkJICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9UUlVFX0NPTE9SICkgKSB7Ci0JZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCi0JCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoICEgZHJpRmlsbEluTW9kZXMoICYgbSwgZmJfZm9ybWF0LCBmYl90eXBlLAotCQkJICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9ESVJFQ1RfQ09MT1IgKSApIHsKKyAgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsCisJCQkgICAgICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LAorCQkJICAgICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCisJCQkgICAgICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3Rvcik7CisgICAgaWYgKGNvbmZpZ3MgPT0gTlVMTCkgewogCWZwcmludGYoIHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLAogCQkgX19mdW5jX18sIF9fTElORV9fICk7CiAJcmV0dXJuIE5VTEw7CkBAIC0zMjEsMTUgKzMxMSw0MyBAQAogCiAgICAgLyogTWFyayB0aGUgdmlzdWFsIGFzIHNsb3cgaWYgdGhlcmUgYXJlICJmYWtlIiBzdGVuY2lsIGJpdHMuCiAgICAgICovCi0gICAgZm9yICggbSA9IG1vZGVzIDsgbSAhPSBOVUxMIDsgbSA9IG0tPm5leHQgKSB7Ci0JaWYgKCAobS0+c3RlbmNpbEJpdHMgIT0gMCkgJiYgKG0tPnN0ZW5jaWxCaXRzICE9IHN0ZW5jaWxfYml0cykgKSB7CisgICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisJbSA9ICZjb25maWdzW2ldLT5tb2RlczsKKwlpZiAoKG0tPnN0ZW5jaWxCaXRzICE9IDApICYmIChtLT5zdGVuY2lsQml0cyAhPSBzdGVuY2lsX2JpdHMpKSB7CiAJICAgIG0tPnZpc3VhbFJhdGluZyA9IEdMWF9TTE9XX0NPTkZJRzsKIAl9CiAgICAgfQogCi0gICAgcmV0dXJuIG1vZGVzOworICAgIHJldHVybiAoY29uc3QgX19EUkljb25maWcgKiopIGNvbmZpZ3M7CiB9CiAKKyNpZiAhUkFERU9OX0NPTU1PTgorc3RhdGljIGNvbnN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uIHJhZGVvblRleE9mZnNldEV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX1RFWF9PRkZTRVQsIF9fRFJJX1RFWF9PRkZTRVRfVkVSU0lPTiB9LAorICAgIHJhZGVvblNldFRleE9mZnNldCwKK307CisjZW5kaWYKKworI2lmIFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMjAwKQorc3RhdGljIGNvbnN0IF9fRFJJYWxsb2NhdGVFeHRlbnNpb24gcjIwMEFsbG9jYXRlRXh0ZW5zaW9uID0geworICAgIHsgX19EUklfQUxMT0NBVEUsIF9fRFJJX0FMTE9DQVRFX1ZFUlNJT04gfSwKKyAgICByMjAwQWxsb2NhdGVNZW1vcnlNRVNBLAorICAgIHIyMDBGcmVlTWVtb3J5TUVTQSwKKyAgICByMjAwR2V0TWVtb3J5T2Zmc2V0TUVTQQorfTsKKworc3RhdGljIGNvbnN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uIHIyMDB0ZXhPZmZzZXRFeHRlbnNpb24gPSB7CisgICAgeyBfX0RSSV9URVhfT0ZGU0VULCBfX0RSSV9URVhfT0ZGU0VUX1ZFUlNJT04gfSwKKyAgIHIyMDBTZXRUZXhPZmZzZXQsCit9OworI2VuZGlmCisKKyNpZiBSQURFT05fQ09NTU9OICYmIGRlZmluZWQoUkFERU9OX0NPTU1PTl9GT1JfUjMwMCkKK3N0YXRpYyBjb25zdCBfX0RSSXRleE9mZnNldEV4dGVuc2lvbiByMzAwdGV4T2Zmc2V0RXh0ZW5zaW9uID0geworICAgIHsgX19EUklfVEVYX09GRlNFVCwgX19EUklfVEVYX09GRlNFVF9WRVJTSU9OIH0sCisgICByMzAwU2V0VGV4T2Zmc2V0LAorfTsKKyNlbmRpZgogCiAvKiBDcmVhdGUgdGhlIGRldmljZSBzcGVjaWZpYyBzY3JlZW4gcHJpdmF0ZSBkYXRhIHN0cnVjdC4KICAqLwpAQCAtMzM5LDkgKzM1Nyw5IEBACiAgICByYWRlb25TY3JlZW5QdHIgc2NyZWVuOwogICAgUkFERU9ORFJJUHRyIGRyaV9wcml2ID0gKFJBREVPTkRSSVB0cilzUHJpdi0+cERldlByaXY7CiAgICB1bnNpZ25lZCBjaGFyICpSQURFT05NTUlPOwotICAgUEZOR0xYU0NSRU5BQkxFRVhURU5TSU9OUFJPQyBnbHhfZW5hYmxlX2V4dGVuc2lvbiA9Ci0gICAgIChQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DKSAoKmRyaV9pbnRlcmZhY2UtPmdldFByb2NBZGRyZXNzKCJnbHhFbmFibGVFeHRlbnNpb24iKSk7Ci0gICB2b2lkICogY29uc3QgcHNjID0gc1ByaXYtPnBzYy0+c2NyZWVuQ29uZmlnczsKKyAgIGludCBpOworICAgaW50IHJldDsKKyAgIHVpbnQzMl90IHRlbXA7CiAKICAgIGlmIChzUHJpdi0+ZGV2UHJpdlNpemUgIT0gc2l6ZW9mKFJBREVPTkRSSVJlYykpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCJcbkVSUk9SISAgc2l6ZW9mKFJBREVPTkRSSVJlYykgZG9lcyBub3QgbWF0Y2ggcGFzc2VkIHNpemUgZnJvbSBkZXZpY2UgZHJpdmVyXG4iKTsKQEAgLTM3Miw3ICszOTAsNyBAQAogICAgICAgaW50IHJldDsKICAgICAgIHJldCA9IHJhZGVvbkdldFBhcmFtKCBzUHJpdi0+ZmQsIFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQsCiAJCQkgICAgJnNjcmVlbi0+Z2FydF9idWZmZXJfb2Zmc2V0KTsKLQkKKwogICAgICAgaWYgKHJldCkgewogCSBGUkVFKCBzY3JlZW4gKTsKIAkgZnByaW50ZihzdGRlcnIsICJkcm1fcmFkZW9uX2dldHBhcmFtX3QgKFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQpOiAlZFxuIiwgcmV0KTsKQEAgLTM5NCwxMyArNDEyLDEzIEBACiAJIGZwcmludGYoc3RkZXJyLCAiZHJtX3JhZGVvbl9nZXRwYXJhbV90IChSQURFT05fUEFSQU1fSVJRX05SKTogJWRcbiIsIHJldCk7CiAJIHJldHVybiBOVUxMOwogICAgICAgfQotICAgICAgc2NyZWVuLT5kcm1TdXBwb3J0c0N1YmVNYXBzUjIwMCA9IChzUHJpdi0+ZHJtTWlub3IgPj0gNyk7Ci0gICAgICBzY3JlZW4tPmRybVN1cHBvcnRzQmxlbmRDb2xvciA9IChzUHJpdi0+ZHJtTWlub3IgPj0gMTEpOwotICAgICAgc2NyZWVuLT5kcm1TdXBwb3J0c1RyaVBlcmYgPSAoc1ByaXYtPmRybU1pbm9yID49IDE2KTsKLSAgICAgIHNjcmVlbi0+ZHJtU3VwcG9ydHNGcmFnU2hhZGVyID0gKHNQcml2LT5kcm1NaW5vciA+PSAxOCk7Ci0gICAgICBzY3JlZW4tPmRybVN1cHBvcnRzUG9pbnRTcHJpdGVzID0gKHNQcml2LT5kcm1NaW5vciA+PSAxMyk7Ci0gICAgICBzY3JlZW4tPmRybVN1cHBvcnRzQ3ViZU1hcHNSMTAwID0gKHNQcml2LT5kcm1NaW5vciA+PSAxNSk7Ci0gICAgICBzY3JlZW4tPmRybVN1cHBvcnRzVmVydGV4UHJvZ3JhbSA9IChzUHJpdi0+ZHJtTWlub3IgPj0gMjUpOworICAgICAgc2NyZWVuLT5kcm1TdXBwb3J0c0N1YmVNYXBzUjIwMCA9IChzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gNyk7CisgICAgICBzY3JlZW4tPmRybVN1cHBvcnRzQmxlbmRDb2xvciA9IChzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gMTEpOworICAgICAgc2NyZWVuLT5kcm1TdXBwb3J0c1RyaVBlcmYgPSAoc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yID49IDE2KTsKKyAgICAgIHNjcmVlbi0+ZHJtU3VwcG9ydHNGcmFnU2hhZGVyID0gKHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxOCk7CisgICAgICBzY3JlZW4tPmRybVN1cHBvcnRzUG9pbnRTcHJpdGVzID0gKHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxMyk7CisgICAgICBzY3JlZW4tPmRybVN1cHBvcnRzQ3ViZU1hcHNSMTAwID0gKHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxNSk7CisgICAgICBzY3JlZW4tPmRybVN1cHBvcnRzVmVydGV4UHJvZ3JhbSA9IChzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gMjUpOwogICAgfQogCiAgICBzY3JlZW4tPm1taW8uaGFuZGxlID0gZHJpX3ByaXYtPnJlZ2lzdGVySGFuZGxlOwpAQCAtNTM0LDcgKzU1MiwxMSBAQAogICAgICAgc2NyZWVuLT5jaGlwX2ZhbWlseSA9IENISVBfRkFNSUxZX1JTMzAwOwogICAgICAgYnJlYWs7CiAKKyAgICAgIC8qIDk1MDAgd2l0aCAxIHBpcGUgdmVyaWZpZWQgYnk6IFJlaWQgTGlubmVtYW5uIDxscmVpZEBjcy5va3N0YXRlLmVkdT4gKi8KICAgIGNhc2UgUENJX0NISVBfUjMwMF9BRDoKKyAgICAgIHNjcmVlbi0+Y2hpcF9mYW1pbHkgPSBDSElQX0ZBTUlMWV9SVjM1MDsKKyAgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyA9IFJBREVPTl9DSElQU0VUX1RDTDsKKyAgICAgIGJyZWFrOwogICAgY2FzZSBQQ0lfQ0hJUF9SMzAwX0FFOgogICAgY2FzZSBQQ0lfQ0hJUF9SMzAwX0FGOgogICAgY2FzZSBQQ0lfQ0hJUF9SMzAwX0FHOgpAQCAtNjMyLDE3ICs2NTQsMTggQEAKICAgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyA9IFJBREVPTl9DSElQU0VUX1RDTDsKICAgICAgIGJyZWFrOwogCisgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEM6CisgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEY6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NEE6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NEI6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NEY6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NTI6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NTM6CisgICBjYXNlIFBDSV9DSElQX1JWNDEwXzU2NTc6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNDg6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEE6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEI6Ci0gICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEM6CiAgICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEQ6Ci0gICBjYXNlIFBDSV9DSElQX1JWNDEwXzVFNEY6CiAgICAgICBzY3JlZW4tPmNoaXBfZmFtaWx5ID0gQ0hJUF9GQU1JTFlfUlY0MTA7CiAgICAgICBzY3JlZW4tPmNoaXBfZmxhZ3MgPSBSQURFT05fQ0hJUFNFVF9UQ0w7CiAgICAgICBicmVhazsKQEAgLTY1Niw3ICs2NzksMTMyIEBACiAgICBjYXNlIFBDSV9DSElQX1JDNDEwXzVBNjE6CiAgICBjYXNlIFBDSV9DSElQX1JDNDEwXzVBNjI6CiAgICAgICBzY3JlZW4tPmNoaXBfZmFtaWx5ID0gQ0hJUF9GQU1JTFlfUlM0MDA7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmcsIHhwcmVzczIwMCBkZXRlY3RlZC5cbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUENJX0NISVBfUlM2OTBfNzkxRToKKyAgIGNhc2UgUENJX0NISVBfUlM2OTBfNzkxRjoKKyAgICAgIHNjcmVlbi0+Y2hpcF9mYW1pbHkgPSBDSElQX0ZBTUlMWV9SUzY5MDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBQQ0lfQ0hJUF9SUzc0MF83OTZDOgorICAgY2FzZSBQQ0lfQ0hJUF9SUzc0MF83OTZEOgorICAgY2FzZSBQQ0lfQ0hJUF9SUzc0MF83OTZFOgorICAgY2FzZSBQQ0lfQ0hJUF9SUzc0MF83OTZGOgorICAgICAgc2NyZWVuLT5jaGlwX2ZhbWlseSA9IENISVBfRkFNSUxZX1JTNzQwOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUENJX0NISVBfUjUyMF83MTAwOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTIwXzcxMDE6CisgICBjYXNlIFBDSV9DSElQX1I1MjBfNzEwMjoKKyAgIGNhc2UgUENJX0NISVBfUjUyMF83MTAzOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTIwXzcxMDQ6CisgICBjYXNlIFBDSV9DSElQX1I1MjBfNzEwNToKKyAgIGNhc2UgUENJX0NISVBfUjUyMF83MTA2OgorICAgY2FzZSBQQ0lfQ0hJUF9SNTIwXzcxMDg6CisgICBjYXNlIFBDSV9DSElQX1I1MjBfNzEwOToKKyAgIGNhc2UgUENJX0NISVBfUjUyMF83MTBBOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTIwXzcxMEI6CisgICBjYXNlIFBDSV9DSElQX1I1MjBfNzEwQzoKKyAgIGNhc2UgUENJX0NISVBfUjUyMF83MTBFOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTIwXzcxMEY6CisgICAgICBzY3JlZW4tPmNoaXBfZmFtaWx5ID0gQ0hJUF9GQU1JTFlfUjUyMDsKKyAgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyA9IFJBREVPTl9DSElQU0VUX1RDTDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDA6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDE6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDI6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDQ6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDU6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDc6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNDk6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEE6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEI6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEQ6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEU6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNEY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNTE6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNTI6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNTM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNUU6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxNUY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODA6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODE6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODc6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxODg6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOEE6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOEI6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOEM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOEQ6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOEY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOTM6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOTY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOUI6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcxOUY6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcyMDA6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcyMTA6CisgICBjYXNlIFBDSV9DSElQX1JWNTE1XzcyMTE6CisgICAgICBzY3JlZW4tPmNoaXBfZmFtaWx5ID0gQ0hJUF9GQU1JTFlfUlY1MTU7CisgICAgICBzY3JlZW4tPmNoaXBfZmxhZ3MgPSBSQURFT05fQ0hJUFNFVF9UQ0w7CisgICAgICBicmVhazsKKworICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUMwOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUMxOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUMyOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUMzOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUM0OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUM1OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUM2OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUM3OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUNEOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUNFOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUQyOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUQ0OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUQ1OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MUQ2OgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MURBOgorICAgY2FzZSBQQ0lfQ0hJUF9SVjUzMF83MURFOgorICAgICAgc2NyZWVuLT5jaGlwX2ZhbWlseSA9IENISVBfRkFNSUxZX1JWNTMwOworICAgICAgc2NyZWVuLT5jaGlwX2ZsYWdzID0gUkFERU9OX0NISVBTRVRfVENMOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUENJX0NISVBfUjU4MF83MjQwOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTgwXzcyNDM6CisgICBjYXNlIFBDSV9DSElQX1I1ODBfNzI0NDoKKyAgIGNhc2UgUENJX0NISVBfUjU4MF83MjQ1OgorICAgY2FzZSBQQ0lfQ0hJUF9SNTgwXzcyNDY6CisgICBjYXNlIFBDSV9DSElQX1I1ODBfNzI0NzoKKyAgIGNhc2UgUENJX0NISVBfUjU4MF83MjQ4OgorICAgY2FzZSBQQ0lfQ0hJUF9SNTgwXzcyNDk6CisgICBjYXNlIFBDSV9DSElQX1I1ODBfNzI0QToKKyAgIGNhc2UgUENJX0NISVBfUjU4MF83MjRCOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTgwXzcyNEM6CisgICBjYXNlIFBDSV9DSElQX1I1ODBfNzI0RDoKKyAgIGNhc2UgUENJX0NISVBfUjU4MF83MjRFOgorICAgY2FzZSBQQ0lfQ0hJUF9SNTgwXzcyNEY6CisgICBjYXNlIFBDSV9DSElQX1I1ODBfNzI4NDoKKyAgICAgIHNjcmVlbi0+Y2hpcF9mYW1pbHkgPSBDSElQX0ZBTUlMWV9SNTgwOworICAgICAgc2NyZWVuLT5jaGlwX2ZsYWdzID0gUkFERU9OX0NISVBTRVRfVENMOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUENJX0NISVBfUlY1NzBfNzI4MDoKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI4MToKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI4MzoKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI4NzoKKyAgIGNhc2UgUENJX0NISVBfUlY1NzBfNzI4ODoKKyAgIGNhc2UgUENJX0NISVBfUlY1NzBfNzI4OToKKyAgIGNhc2UgUENJX0NISVBfUlY1NzBfNzI4QjoKKyAgIGNhc2UgUENJX0NISVBfUlY1NzBfNzI4QzoKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI5MDoKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI5MToKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI5MzoKKyAgIGNhc2UgUENJX0NISVBfUlY1NjBfNzI5NzoKKyAgICAgIHNjcmVlbi0+Y2hpcF9mYW1pbHkgPSBDSElQX0ZBTUlMWV9SVjU2MDsKKyAgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyA9IFJBREVPTl9DSElQU0VUX1RDTDsKICAgICAgIGJyZWFrOwogCiAgICBkZWZhdWx0OgpAQCAtNjY1LDExICs4MTMsMTkgQEAKICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKChzY3JlZW4tPmNoaXBfZmFtaWx5ID09IENISVBfRkFNSUxZX1IzNTAgfHwgc2NyZWVuLT5jaGlwX2ZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzAwKSAmJgotICAgICAgIHNQcml2LT5kZHhNaW5vciA8IDIpIHsKKyAgICAgICBzUHJpdi0+ZGR4X3ZlcnNpb24ubWlub3IgPCAyKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwgInhmODYtdmlkZW8tYXRpLTYuNi4yIG9yIG5ld2VyIG5lZWRlZCBmb3IgUmFkZW9uIDk1MDAvOTcwMC85ODAwIGNhcmRzLlxuIik7CiAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KIAorICAgaWYgKChzUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPCAyOSkgJiYgKHNjcmVlbi0+Y2hpcF9mYW1pbHkgPj0gQ0hJUF9GQU1JTFlfUlY1MTUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlI1MDAgc3VwcG9ydCByZXF1aXJlcyBhIG5ld2VyIGRybS5cbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmIChnZXRlbnYoIlIzMDBfTk9fVENMIikpCisgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyAmPSB+UkFERU9OX0NISVBTRVRfVENMOworCiAgICBpZiAoc2NyZWVuLT5jaGlwX2ZhbWlseSA8PSBDSElQX0ZBTUlMWV9SUzIwMCkKICAgICAgIHNjcmVlbi0+Y2hpcF9mbGFncyB8PSBSQURFT05fQ0xBU1NfUjEwMDsKICAgIGVsc2UgaWYgKHNjcmVlbi0+Y2hpcF9mYW1pbHkgPD0gQ0hJUF9GQU1JTFlfUlYyODApCkBAIC02ODAsOSArODM2LDUxIEBACiAgICBzY3JlZW4tPmNwcCA9IGRyaV9wcml2LT5icHAgLyA4OwogICAgc2NyZWVuLT5BR1BNb2RlID0gZHJpX3ByaXYtPkFHUE1vZGU7CiAKLSAgIHNjcmVlbi0+ZmJMb2NhdGlvbgk9ICggSU5SRUcoIFJBREVPTl9NQ19GQl9MT0NBVElPTiApICYgMHhmZmZmICkgPDwgMTY7CisgICByZXQgPSByYWRlb25HZXRQYXJhbSggc1ByaXYtPmZkLCBSQURFT05fUEFSQU1fRkJfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXApOworICAgaWYgKHJldCkgeworICAgICAgIGlmIChzY3JlZW4tPmNoaXBfZmFtaWx5IDwgQ0hJUF9GQU1JTFlfUlM2OTApCisJICAgc2NyZWVuLT5mYkxvY2F0aW9uICAgICAgPSAoIElOUkVHKCBSQURFT05fTUNfRkJfTE9DQVRJT04gKSAmIDB4ZmZmZikgPDwgMTY7CisgICAgICAgZWxzZSB7CisgICAgICAgICAgIEZSRUUoIHNjcmVlbiApOworICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBnZXQgZmIgbG9jYXRpb24gbmVlZCBuZXdlciBkcm1cbiIpOworICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICB9CisgICB9IGVsc2UgeworICAgICAgIHNjcmVlbi0+ZmJMb2NhdGlvbiA9ICh0ZW1wICYgMHhmZmZmKSA8PCAxNjsKKyAgIH0KIAotICAgaWYgKCBzUHJpdi0+ZHJtTWlub3IgPj0gMTAgKSB7CisgICBpZiAoc2NyZWVuLT5jaGlwX2ZhbWlseSA+PSBDSElQX0ZBTUlMWV9SVjUxNSkgeworICAgICAgIHJldCA9IHJhZGVvbkdldFBhcmFtKCBzUHJpdi0+ZmQsIFJBREVPTl9QQVJBTV9OVU1fR0JfUElQRVMsCisJCQkgICAgICZ0ZW1wKTsKKyAgICAgICBpZiAocmV0KSB7CisJICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZ2V0IG51bV9waXBlcywgbmVlZCBuZXdlciBkcm1cbiIpOworCSAgIHN3aXRjaCAoc2NyZWVuLT5jaGlwX2ZhbWlseSkgeworCSAgIGNhc2UgQ0hJUF9GQU1JTFlfUjMwMDoKKwkgICBjYXNlIENISVBfRkFNSUxZX1IzNTA6CisJICAgICAgIHNjcmVlbi0+bnVtX2diX3BpcGVzID0gMjsKKwkgICAgICAgYnJlYWs7CisJICAgY2FzZSBDSElQX0ZBTUlMWV9SNDIwOgorCSAgIGNhc2UgQ0hJUF9GQU1JTFlfUjUyMDoKKwkgICBjYXNlIENISVBfRkFNSUxZX1I1ODA6CisJICAgY2FzZSBDSElQX0ZBTUlMWV9SVjU2MDoKKwkgICBjYXNlIENISVBfRkFNSUxZX1JWNTcwOgorCSAgICAgICBzY3JlZW4tPm51bV9nYl9waXBlcyA9IDQ7CisJICAgICAgIGJyZWFrOworCSAgIGNhc2UgQ0hJUF9GQU1JTFlfUlYzNTA6CisJICAgY2FzZSBDSElQX0ZBTUlMWV9SVjUxNToKKwkgICBjYXNlIENISVBfRkFNSUxZX1JWNTMwOgorCSAgIGNhc2UgQ0hJUF9GQU1JTFlfUlY0MTA6CisJICAgZGVmYXVsdDoKKwkgICAgICAgc2NyZWVuLT5udW1fZ2JfcGlwZXMgPSAxOworCSAgICAgICBicmVhazsKKwkgICB9CisgICAgICAgfSBlbHNlIHsKKwkgICBzY3JlZW4tPm51bV9nYl9waXBlcyA9IHRlbXA7CisgICAgICAgfQorICAgfQorCisgICBpZiAoIHNQcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAxMCApIHsKICAgICAgIGRybV9yYWRlb25fc2V0cGFyYW1fdCBzcDsKIAogICAgICAgc3AucGFyYW0gPSBSQURFT05fU0VUUEFSQU1fRkJfTE9DQVRJT047CkBAIC03MDAsOCArODk4LDExIEBACiAgICBzY3JlZW4tPmRlcHRoUGl0Y2gJPSBkcmlfcHJpdi0+ZGVwdGhQaXRjaDsKIAogICAgLyogQ2hlY2sgaWYgZGR4IGhhcyBzZXQgdXAgYSBzdXJmYWNlIHJlZyB0byBjb3ZlciBkZXB0aCBidWZmZXIgKi8KLSAgIHNjcmVlbi0+ZGVwdGhIYXNTdXJmYWNlID0gKChzUHJpdi0+ZGR4TWFqb3IgPiA0KSAmJgotICAgICAgKHNjcmVlbi0+Y2hpcF9mbGFncyAmIFJBREVPTl9DSElQU0VUX1RDTCkpOworICAgc2NyZWVuLT5kZXB0aEhhc1N1cmZhY2UgPSAoc1ByaXYtPmRkeF92ZXJzaW9uLm1ham9yID4gNCkgfHwKKyAgICAgIC8qIHRoZXNlIGNoaXBzIGRvbid0IHVzZSB0aWxlZCB6IHdpdGhvdXQgaHlwZXJ6LiBTbyBhbHdheXMgcHJldGVuZAorICAgICAgICAgd2UgaGF2ZSBzZXQgdXAgYSBzdXJmYWNlIHdoaWNoIHdpbGwgY2F1c2UgbGluZWFyIHJlYWRzL3dyaXRlcyAqLworICAgICAgKChzY3JlZW4tPmNoaXBfZmFtaWx5ICYgUkFERU9OX0NMQVNTX1IxMDApICYmCisgICAgICAhKHNjcmVlbi0+Y2hpcF9mbGFncyAmIFJBREVPTl9DSElQU0VUX1RDTCkpOwogCiAgICBpZiAoIGRyaV9wcml2LT50ZXh0dXJlU2l6ZSA9PSAwICkgewogICAgICAgc2NyZWVuLT50ZXhPZmZzZXRbUkFERU9OX0xPQ0FMX1RFWF9IRUFQXSA9IHNjcmVlbi0+Z2FydF90ZXh0dXJlX29mZnNldDsKQEAgLTczMCwyOSArOTMxLDM0IEBACiAJIGRyaV9wcml2LT5sb2cyR0FSVFRleEdyYW47CiAgICB9CiAKLSAgIGlmICggZ2x4X2VuYWJsZV9leHRlbnNpb24gIT0gTlVMTCApIHsKLSAgICAgIGlmICggc2NyZWVuLT5pcnEgIT0gMCApIHsKLQkgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9TR0lfc3dhcF9jb250cm9sIiApOwotCSAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV92aWRlb19zeW5jIiApOwotCSAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX01FU0Ffc3dhcF9jb250cm9sIiApOwotICAgICAgfQorICAgaSA9IDA7CisgICBzY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlDb3B5U3ViQnVmZmVyRXh0ZW5zaW9uLmJhc2U7CisgICBzY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uLmJhc2U7CisgICBzY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlSZWFkRHJhd2FibGVFeHRlbnNpb247CiAKLSAgICAgICgqZ2x4X2VuYWJsZV9leHRlbnNpb24pKCBwc2MsICJHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlIiApOwotICAgICAgaWYgKElTX1IyMDBfQ0xBU1Moc2NyZWVuKSkKLQkgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX2FsbG9jYXRlX21lbW9yeSIgKTsKLQotICAgICAgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlciIgKTsKLSAgICAgICgqZ2x4X2VuYWJsZV9leHRlbnNpb24pKCBwc2MsICJHTFhfU0dJX21ha2VfY3VycmVudF9yZWFkIiApOworICAgaWYgKCBzY3JlZW4tPmlycSAhPSAwICkgeworICAgICAgIHNjcmVlbi0+ZXh0ZW5zaW9uc1tpKytdID0gJmRyaVN3YXBDb250cm9sRXh0ZW5zaW9uLmJhc2U7CisgICAgICAgc2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmZHJpTWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uLmJhc2U7CiAgICB9CiAKKyNpZiAhUkFERU9OX0NPTU1PTgorICAgc2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmcmFkZW9uVGV4T2Zmc2V0RXh0ZW5zaW9uLmJhc2U7CisjZW5kaWYKKwogI2lmIFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMjAwKQotICAgaWYgKElTX1IyMDBfQ0xBU1Moc2NyZWVuKSkgewotICAgICAgc1ByaXYtPnBzYy0+YWxsb2NhdGVNZW1vcnkgPSAodm9pZCAqKSByMjAwQWxsb2NhdGVNZW1vcnlNRVNBOwotICAgICAgc1ByaXYtPnBzYy0+ZnJlZU1lbW9yeSAgICAgPSAodm9pZCAqKSByMjAwRnJlZU1lbW9yeU1FU0E7Ci0gICAgICBzUHJpdi0+cHNjLT5tZW1vcnlPZmZzZXQgICA9ICh2b2lkICopIHIyMDBHZXRNZW1vcnlPZmZzZXRNRVNBOwotICAgfQorICAgaWYgKElTX1IyMDBfQ0xBU1Moc2NyZWVuKSkKKyAgICAgICBzY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZyMjAwQWxsb2NhdGVFeHRlbnNpb24uYmFzZTsKKworICAgc2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmcjIwMHRleE9mZnNldEV4dGVuc2lvbi5iYXNlOwogI2VuZGlmCiAKKyNpZiBSQURFT05fQ09NTU9OICYmIGRlZmluZWQoUkFERU9OX0NPTU1PTl9GT1JfUjMwMCkKKyAgIHNjcmVlbi0+ZXh0ZW5zaW9uc1tpKytdID0gJnIzMDB0ZXhPZmZzZXRFeHRlbnNpb24uYmFzZTsKKyNlbmRpZgorCisgICBzY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9IE5VTEw7CisgICBzUHJpdi0+ZXh0ZW5zaW9ucyA9IHNjcmVlbi0+ZXh0ZW5zaW9uczsKKwogICAgc2NyZWVuLT5kcmlTY3JlZW4gPSBzUHJpdjsKICAgIHNjcmVlbi0+c2FyZWFfcHJpdl9vZmZzZXQgPSBkcmlfcHJpdi0+c2FyZWFfcHJpdl9vZmZzZXQ7CiAgICByZXR1cm4gc2NyZWVuOwpAQCAtOTM1LDcxICsxMTQxLDE2IEBACiAKICNlbmRpZgogCi0jaWYgIVJBREVPTl9DT01NT04gfHwgKFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMzAwKSkKLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgcmFkZW9uQVBJID0gewotICAgLkluaXREcml2ZXIgICAgICA9IHJhZGVvbkluaXREcml2ZXIsCi0gICAuRGVzdHJveVNjcmVlbiAgID0gcmFkZW9uRGVzdHJveVNjcmVlbiwKLSAgIC5DcmVhdGVDb250ZXh0ICAgPSByYWRlb25DcmVhdGVDb250ZXh0LAotICAgLkRlc3Ryb3lDb250ZXh0ICA9IHJhZGVvbkRlc3Ryb3lDb250ZXh0LAotICAgLkNyZWF0ZUJ1ZmZlciAgICA9IHJhZGVvbkNyZWF0ZUJ1ZmZlciwKLSAgIC5EZXN0cm95QnVmZmVyICAgPSByYWRlb25EZXN0cm95QnVmZmVyLAotICAgLlN3YXBCdWZmZXJzICAgICA9IHJhZGVvblN3YXBCdWZmZXJzLAotICAgLk1ha2VDdXJyZW50ICAgICA9IHJhZGVvbk1ha2VDdXJyZW50LAotICAgLlVuYmluZENvbnRleHQgICA9IHJhZGVvblVuYmluZENvbnRleHQsCi0gICAuR2V0U3dhcEluZm8gICAgID0gZ2V0U3dhcEluZm8sCi0gICAuR2V0TVNDICAgICAgICAgID0gZHJpR2V0TVNDMzIsCi0gICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAotICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCi0gICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTCwKLSAgIC5Db3B5U3ViQnVmZmVyICAgPSByYWRlb25Db3B5U3ViQnVmZmVyLAotI2lmIFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMzAwKQotICAgLnNldFRleE9mZnNldCAgICA9IHIzMDBTZXRUZXhPZmZzZXQsCi0jZW5kaWYKLX07Ci0jZWxzZQotc3RhdGljIGNvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyByMjAwQVBJID0gewotICAgLkluaXREcml2ZXIgICAgICA9IHJhZGVvbkluaXREcml2ZXIsCi0gICAuRGVzdHJveVNjcmVlbiAgID0gcmFkZW9uRGVzdHJveVNjcmVlbiwKLSAgIC5DcmVhdGVDb250ZXh0ICAgPSByMjAwQ3JlYXRlQ29udGV4dCwKLSAgIC5EZXN0cm95Q29udGV4dCAgPSByMjAwRGVzdHJveUNvbnRleHQsCi0gICAuQ3JlYXRlQnVmZmVyICAgID0gcmFkZW9uQ3JlYXRlQnVmZmVyLAotICAgLkRlc3Ryb3lCdWZmZXIgICA9IHJhZGVvbkRlc3Ryb3lCdWZmZXIsCi0gICAuU3dhcEJ1ZmZlcnMgICAgID0gcjIwMFN3YXBCdWZmZXJzLAotICAgLk1ha2VDdXJyZW50ICAgICA9IHIyMDBNYWtlQ3VycmVudCwKLSAgIC5VbmJpbmRDb250ZXh0ICAgPSByMjAwVW5iaW5kQ29udGV4dCwKLSAgIC5HZXRTd2FwSW5mbyAgICAgPSBnZXRTd2FwSW5mbywKLSAgIC5HZXRNU0MgICAgICAgICAgPSBkcmlHZXRNU0MzMiwKLSAgIC5XYWl0Rm9yTVNDICAgICAgPSBkcmlXYWl0Rm9yTVNDMzIsCi0gICAuV2FpdEZvclNCQyAgICAgID0gTlVMTCwKLSAgIC5Td2FwQnVmZmVyc01TQyAgPSBOVUxMLAotICAgLkNvcHlTdWJCdWZmZXIgICA9IHIyMDBDb3B5U3ViQnVmZmVyCi19OwotI2VuZGlmCi0KIC8qKgotICogVGhpcyBpcyB0aGUgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciB0aGUgZHJpdmVyLiAgbGliR0wgc3VwcGxpZXMgYWxsIG9mIHRoZQotICogcmVxdWlzaXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0sIGFuZCB0aGUgZHJpdmVyIGluaXRpYWxpemVzIGl0c2VsZi4KLSAqIFRoaXMgcm91dGluZSBhbHNvIGZpbGxzIGluIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVkIHRvIGJ5IFxjIGRyaXZlcl9tb2RlcwotICogd2l0aCB0aGUgXGMgX19HTGNvbnRleHRNb2RlcyB0aGF0IHRoZSBkcml2ZXIgY2FuIHN1cHBvcnQgZm9yIHdpbmRvd3Mgb3IKLSAqIHBidWZmZXJzLgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KICAqCi0gKiBccmV0dXJuIEEgcG9pbnRlciB0byBhIFxjIF9fRFJJc2NyZWVuUHJpdmF0ZSBvbiBzdWNjZXNzLCBvciBcYyBOVUxMIG9uIAotICogICAgICAgICBmYWlsdXJlLgorICogXHRvZG8gbWF5YmUgZm9sZCB0aGlzIGludG8gaW50ZWxJbml0RHJpdmVyCisgKgorICogXHJldHVybiB0aGUgX19HTGNvbnRleHRNb2RlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKICAqLwotUFVCTElDIHZvaWQgKgotX19kcmlDcmVhdGVOZXdTY3JlZW5fMjAwNTA3MjcoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NybiwgX19EUklzY3JlZW4gKnBzYywKLQkJCSAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkZHhfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICogZnJhbWVfYnVmZmVyLAotCQkJICAgICBkcm1BZGRyZXNzIHBTQVJFQSwgaW50IGZkLAotCQkJICAgICBpbnQgaW50ZXJuYWxfYXBpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJaW50ZXJmYWNlTWV0aG9kcyAqIGludGVyZmFjZSwKLQkJCSAgICAgX19HTGNvbnRleHRNb2RlcyAqKiBkcml2ZXJfbW9kZXMgKQorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCityYWRlb25Jbml0U2NyZWVuKF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwKQogewotICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7CiAjaWYgIVJBREVPTl9DT01NT04KICAgIHN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJSYWRlb24iOwogICAgc3RhdGljIGNvbnN0IF9fRFJJdXRpbHZlcnNpb24yIGRkeF9leHBlY3RlZCA9IHsgNCwgNSwgMCwgMCB9OwpAQCAtMTAxNiw1NyArMTE2Nyw0MiBAQAogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7IDQsIDAsIDAgfTsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJtX2V4cGVjdGVkID0geyAxLCAyNCwgMCB9OwogI2VuZGlmCi0KLSAgIGRyaV9pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICBSQURFT05EUklQdHIgZHJpX3ByaXYgPSAoUkFERU9ORFJJUHRyKSBwc3AtPnBEZXZQcml2OwogCiAgICBpZiAoICEgZHJpQ2hlY2tEcmlEZHhEcm1WZXJzaW9uczMoIGRyaXZlcl9uYW1lLAotCQkJCSAgICAgIGRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKLQkJCQkgICAgICBkZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCi0JCQkJICAgICAgZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKSB7CisJCQkJICAgICAgJnBzcC0+ZHJpX3ZlcnNpb24sICYgZHJpX2V4cGVjdGVkLAorCQkJCSAgICAgICZwc3AtPmRkeF92ZXJzaW9uLCAmIGRkeF9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kcm1fdmVyc2lvbiwgJiBkcm1fZXhwZWN0ZWQgKSApIHsKICAgICAgIHJldHVybiBOVUxMOwogICAgfQotI2lmICFSQURFT05fQ09NTU9OIHx8IChSQURFT05fQ09NTU9OICYmIGRlZmluZWQoUkFERU9OX0NPTU1PTl9GT1JfUjMwMCkpCi0gICBwc3AgPSBfX2RyaVV0aWxDcmVhdGVOZXdTY3JlZW4oZHB5LCBzY3JuLCBwc2MsIE5VTEwsCi0JCQkJICBkZHhfdmVyc2lvbiwgZHJpX3ZlcnNpb24sIGRybV92ZXJzaW9uLAotCQkJCSAgZnJhbWVfYnVmZmVyLCBwU0FSRUEsIGZkLAotCQkJCSAgaW50ZXJuYWxfYXBpX3ZlcnNpb24sICZyYWRlb25BUEkpOwotI2VsaWYgUkFERU9OX0NPTU1PTiAmJiBkZWZpbmVkKFJBREVPTl9DT01NT05fRk9SX1IyMDApCi0gICBwc3AgPSBfX2RyaVV0aWxDcmVhdGVOZXdTY3JlZW4oZHB5LCBzY3JuLCBwc2MsIE5VTEwsCi0JCQkJICBkZHhfdmVyc2lvbiwgZHJpX3ZlcnNpb24sIGRybV92ZXJzaW9uLAotCQkJCSAgZnJhbWVfYnVmZmVyLCBwU0FSRUEsIGZkLAotCQkJCSAgaW50ZXJuYWxfYXBpX3ZlcnNpb24sICZyMjAwQVBJKTsKLSNlbmRpZgogCi0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgUkFERU9ORFJJUHRyIGRyaV9wcml2ID0gKFJBREVPTkRSSVB0cikgcHNwLT5wRGV2UHJpdjsKLSAgICAgIGlmIChkcml2ZXJfbW9kZXMpIHsKLSAgICAgICAgICpkcml2ZXJfbW9kZXMgPSByYWRlb25GaWxsSW5Nb2RlcyggZHJpX3ByaXYtPmJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyaV9wcml2LT5icHAgPT0gMTYpID8gMTYgOiAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyaV9wcml2LT5icHAgPT0gMTYpID8gMCAgOiA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJpX3ByaXYtPmJhY2tPZmZzZXQgIT0gZHJpX3ByaXYtPmRlcHRoT2Zmc2V0KSApOwotICAgICAgfQotCi0gICAgICAvKiBDYWxsaW5nIGRyaUluaXRFeHRlbnNpb25zIGhlcmUsIHdpdGggYSBOVUxMIGNvbnRleHQgcG9pbnRlciwKLSAgICAgICAqIGRvZXMgbm90IGFjdHVhbGx5IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucy4gIEl0IGp1c3QgbWFrZXMgc3VyZQotICAgICAgICogdGhhdCBhbGwgdGhlIGRpc3BhdGNoIG9mZnNldHMgZm9yIGFsbCB0aGUgZXh0ZW5zaW9ucyB0aGF0Ci0gICAgICAgKiAqbWlnaHQqIGJlIGVuYWJsZXMgYXJlIGtub3duLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUKLSAgICAgICAqIGRpc3BhdGNoIG9mZnNldHMgbmVlZCB0byBiZSBrbm93biB3aGVuIF9tZXNhX2NvbnRleHRfY3JlYXRlCi0gICAgICAgKiBpcyBjYWxsZWQsIGJ1dCB3ZSBjYW4ndCBlbmFibGUgdGhlIGV4dGVuc2lvbnMgdW50aWwgd2UgaGF2ZSBhCi0gICAgICAgKiBjb250ZXh0IHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KLSAgICAgICAqLwotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKKyAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLAorICAgICogZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlCisgICAgKiB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQKKyAgICAqICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQorICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUKKyAgICAqIGlzIGNhbGxlZCwgYnV0IHdlIGNhbid0IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEKKyAgICAqIGNvbnRleHQgcG9pbnRlci4KKyAgICAqCisgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PworICAgICovCisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwogI2lmIFJBREVPTl9DT01NT04gJiYgZGVmaW5lZChSQURFT05fQ09NTU9OX0ZPUl9SMjAwKQotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGJsZW5kX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7Ci0gICAgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBOVUxMLCBBUkJfdnBfZXh0ZW5zaW9uICk7Ci0gICAgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBOVUxMLCBOVl92cF9leHRlbnNpb24gKTsKLSAgICAgIGRyaUluaXRTaW5nbGVFeHRlbnNpb24oIE5VTEwsIEFUSV9mc19leHRlbnNpb24gKTsKLSAgICAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBwb2ludF9leHRlbnNpb25zLCBHTF9GQUxTRSApOworICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGJsZW5kX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBOVUxMLCBBUkJfdnBfZXh0ZW5zaW9uICk7CisgICBkcmlJbml0U2luZ2xlRXh0ZW5zaW9uKCBOVUxMLCBOVl92cF9leHRlbnNpb24gKTsKKyAgIGRyaUluaXRTaW5nbGVFeHRlbnNpb24oIE5VTEwsIEFUSV9mc19leHRlbnNpb24gKTsKKyAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBwb2ludF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwogI2VuZGlmCi0gICB9CiAKLSAgIHJldHVybiAodm9pZCAqKSBwc3A7CisgICBpZiAoIXJhZGVvbkluaXREcml2ZXIocHNwKSkKKyAgICAgICByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuIHJhZGVvbkZpbGxJbk1vZGVzKCBwc3AsCisJCQkgICAgIGRyaV9wcml2LT5icHAsCisJCQkgICAgIChkcmlfcHJpdi0+YnBwID09IDE2KSA/IDE2IDogMjQsCisJCQkgICAgIChkcmlfcHJpdi0+YnBwID09IDE2KSA/IDAgIDogOCwKKwkJCSAgICAgKGRyaV9wcml2LT5iYWNrT2Zmc2V0ICE9IGRyaV9wcml2LT5kZXB0aE9mZnNldCkgKTsKIH0KIAogCkBAIC0xMDk5LDMgKzEyMzUsNDEgQEAKIAogICAgcmV0dXJuIDA7CiB9CisKKyNpZiAhUkFERU9OX0NPTU1PTiB8fCAoUkFERU9OX0NPTU1PTiAmJiBkZWZpbmVkKFJBREVPTl9DT01NT05fRk9SX1IzMDApKQorY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGRyaURyaXZlckFQSSA9IHsKKyAgIC5Jbml0U2NyZWVuICAgICAgPSByYWRlb25Jbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gICA9IHJhZGVvbkRlc3Ryb3lTY3JlZW4sCisgICAuQ3JlYXRlQ29udGV4dCAgID0gcmFkZW9uQ3JlYXRlQ29udGV4dCwKKyAgIC5EZXN0cm95Q29udGV4dCAgPSByYWRlb25EZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICAgPSByYWRlb25DcmVhdGVCdWZmZXIsCisgICAuRGVzdHJveUJ1ZmZlciAgID0gcmFkZW9uRGVzdHJveUJ1ZmZlciwKKyAgIC5Td2FwQnVmZmVycyAgICAgPSByYWRlb25Td2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudCAgICAgPSByYWRlb25NYWtlQ3VycmVudCwKKyAgIC5VbmJpbmRDb250ZXh0ICAgPSByYWRlb25VbmJpbmRDb250ZXh0LAorICAgLkdldFN3YXBJbmZvICAgICA9IGdldFN3YXBJbmZvLAorICAgLkdldERyYXdhYmxlTVNDICA9IGRyaURyYXdhYmxlR2V0TVNDMzIsCisgICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAorICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCisgICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTCwKKyAgIC5Db3B5U3ViQnVmZmVyICAgPSByYWRlb25Db3B5U3ViQnVmZmVyLAorfTsKKyNlbHNlCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4gICAgICA9IHJhZGVvbkluaXRTY3JlZW4sCisgICAuRGVzdHJveVNjcmVlbiAgID0gcmFkZW9uRGVzdHJveVNjcmVlbiwKKyAgIC5DcmVhdGVDb250ZXh0ICAgPSByMjAwQ3JlYXRlQ29udGV4dCwKKyAgIC5EZXN0cm95Q29udGV4dCAgPSByMjAwRGVzdHJveUNvbnRleHQsCisgICAuQ3JlYXRlQnVmZmVyICAgID0gcmFkZW9uQ3JlYXRlQnVmZmVyLAorICAgLkRlc3Ryb3lCdWZmZXIgICA9IHJhZGVvbkRlc3Ryb3lCdWZmZXIsCisgICAuU3dhcEJ1ZmZlcnMgICAgID0gcjIwMFN3YXBCdWZmZXJzLAorICAgLk1ha2VDdXJyZW50ICAgICA9IHIyMDBNYWtlQ3VycmVudCwKKyAgIC5VbmJpbmRDb250ZXh0ICAgPSByMjAwVW5iaW5kQ29udGV4dCwKKyAgIC5HZXRTd2FwSW5mbyAgICAgPSBnZXRTd2FwSW5mbywKKyAgIC5HZXREcmF3YWJsZU1TQyAgPSBkcmlEcmF3YWJsZUdldE1TQzMyLAorICAgLldhaXRGb3JNU0MgICAgICA9IGRyaVdhaXRGb3JNU0MzMiwKKyAgIC5XYWl0Rm9yU0JDICAgICAgPSBOVUxMLAorICAgLlN3YXBCdWZmZXJzTVNDICA9IE5VTEwsCisgICAuQ29weVN1YkJ1ZmZlciAgID0gcjIwMENvcHlTdWJCdWZmZXIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3NjcmVlbi5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9zY3JlZW4uaAppbmRleCBjOWIwYzNhLi5iODRjNzBiIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3NjcmVlbi5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc2NyZWVuLmgKQEAgLTEwMiw2ICsxMDIsMTAgQEAKIAogICAgLyogQ29uZmlndXJhdGlvbiBjYWNoZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgY29udGV4dHMgKi8KICAgIGRyaU9wdGlvbkNhY2hlIG9wdGlvbkNhY2hlOworCisgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqZXh0ZW5zaW9uc1s4XTsKKworICAgaW50IG51bV9nYl9waXBlczsKIH0gcmFkZW9uU2NyZWVuUmVjLCAqcmFkZW9uU2NyZWVuUHRyOwogCiAjZGVmaW5lIElTX1IxMDBfQ0xBU1Moc2NyZWVuKSBcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3NwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc3Bhbi5jCmluZGV4IDczMmE4NWUuLmU3YWIzNjcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc3Bhbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc3Bhbi5jCkBAIC0xNzMsNiArMTczLDggQEAKIAogLyogMTYtYml0IGRlcHRoIGJ1ZmZlciBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdXNob3J0CisKICNkZWZpbmUgV1JJVEVfREVQVEgoIF94LCBfeSwgZCApCQkJCQlcCiAgICAqKEdMdXNob3J0ICopKGJ1ZiArIHJhZGVvbl9tYmFfejE2KCBkcmIsIF94ICsgeG8sIF95ICsgeW8gKSkgPSBkOwogCkBAIC0xODcsNiArMTg5LDggQEAKICAqIENhcmVmdWw6IEl0IGxvb2tzIGxpa2UgdGhlIFIzMDAgdXNlcyBaWlpTIGJ5dGUgb3JkZXIgd2hpbGUgdGhlIFIyMDAKICAqIHVzZXMgU1paWiBmb3IgMjQgYml0IGRlcHRoLCA4IGJpdCBzdGVuY2lsIG1vZGUuCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2lmZGVmIENPTVBJTEVfUjMwMAogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKaW5kZXggMWZlNWMyNC4uMzQzN2RlMSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fc3RhdGUuYwpAQCAtMTYzOSw4ICsxNjM5LDcgQEAKICAgIEdMZnJhbWVidWZmZXIgKmNvbnN0IGRyYXdfZmIgPSAoR0xmcmFtZWJ1ZmZlciopIGRyYXdhYmxlLT5kcml2ZXJQcml2YXRlOwogICAgR0xmcmFtZWJ1ZmZlciAqY29uc3QgcmVhZF9mYiA9IChHTGZyYW1lYnVmZmVyKikgcmVhZGFibGUtPmRyaXZlclByaXZhdGU7CiAKLSAgIGlmIChkcmF3X2ZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXQotICAgICAgID09IEJVRkZFUl9CSVRfQkFDS19MRUZUKSB7CisgICBpZiAoZHJhd19mYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0JBQ0tfTEVGVCkgewogICAgICAgLyogQ2FuJ3QgaWdub3JlIDJkIHdpbmRvd3MgaWYgd2UgYXJlIHBhZ2UgZmxpcHBpbmcuCiAgICAgICAgKi8KICAgICAgIGlmICggZHJhd2FibGUtPm51bUJhY2tDbGlwUmVjdHMgPT0gMCB8fCBybWVzYS0+ZG9QYWdlRmxpcCApIHsKQEAgLTE2OTIsMTcgKzE2OTEsMTggQEAKIAogICAgUkFERU9OX0ZJUkVWRVJUSUNFUyhybWVzYSk7CS8qIGRvbid0IHBpcGVsaW5lIGNsaXByZWN0IGNoYW5nZXMgKi8KIAotICAgLyoKLSAgICAqIF9Db2xvckRyYXdCdWZmZXJNYXNrIGlzIGVhc2llciB0byBjb3BlIHdpdGggdGhhbiA8bW9kZT4uCi0gICAgKiBDaGVjayBmb3Igc29mdHdhcmUgZmFsbGJhY2ssIHVwZGF0ZSBjbGlwcmVjdHMuCi0gICAgKi8KLSAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKLSAgIGNhc2UgQlVGRkVSX0JJVF9CQUNLX0xFRlQ6CisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyAhPSAxKSB7CisgICAgICAvKiAwIChHTF9OT05FKSBidWZmZXJzIG9yIG11bHRpcGxlIGNvbG9yIGRyYXdpbmcgYnVmZmVycyAqLworICAgICAgRkFMTEJBQ0soIHJtZXNhLCBSQURFT05fRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSApIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CisgICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6CiAgICAgICBGQUxMQkFDSyggcm1lc2EsIFJBREVPTl9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIC8qIDAgKEdMX05PTkUpIGJ1ZmZlcnMgb3IgbXVsdGlwbGUgY29sb3IgZHJhd2luZyBidWZmZXJzICovCiAgICAgICBGQUxMQkFDSyggcm1lc2EsIFJBREVPTl9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfVFJVRSApOwogICAgICAgcmV0dXJuOwogICAgfQpAQCAtMjIyMSwxMSArMjIyMSwxMSBAQAogICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiA9IGN0eC0+RHJhd0J1ZmZlcjsKICAgIGRyaVJlbmRlcmJ1ZmZlciAqZHJiOwogCi0gICBpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdID09IEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkgeworICAgaWYgKGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9PSBCVUZGRVJfRlJPTlRfTEVGVCkgewogICAgICAgLyogZHJhdyB0byBmcm9udCAqLwogICAgICAgZHJiID0gKGRyaVJlbmRlcmJ1ZmZlciAqKSBmYi0+QXR0YWNobWVudFtCVUZGRVJfRlJPTlRfTEVGVF0uUmVuZGVyYnVmZmVyOwogICAgfQotICAgZWxzZSBpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdID09IEJVRkZFUl9CSVRfQkFDS19MRUZUKSB7CisgICBlbHNlIGlmIChmYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0JBQ0tfTEVGVCkgewogICAgICAgLyogZHJhdyB0byBiYWNrICovCiAgICAgICBkcmIgPSAoZHJpUmVuZGVyYnVmZmVyICopIGZiLT5BdHRhY2htZW50W0JVRkZFUl9CQUNLX0xFRlRdLlJlbmRlcmJ1ZmZlcjsKICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fdGNsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3RjbC5jCmluZGV4IGQzNWJlMWMuLjRjMTFmZjcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fdGNsLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90Y2wuYwpAQCAtNDE3LDcgKzQxNyw3IEBACiAKICAgIGZvciAoaSA9IDAgOyBpIDwgVkItPlByaW1pdGl2ZUNvdW50IDsgaSsrKQogICAgewotICAgICAgR0x1aW50IHByaW0gPSBWQi0+UHJpbWl0aXZlW2ldLm1vZGU7CisgICAgICBHTHVpbnQgcHJpbSA9IF90bmxfdHJhbnNsYXRlX3ByaW0oJlZCLT5QcmltaXRpdmVbaV0pOwogICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgIEdMdWludCBsZW5ndGggPSBWQi0+UHJpbWl0aXZlW2ldLmNvdW50OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3RleC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90ZXguaAppbmRleCBiZGYwODZkLi44MDAwODgwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3RleC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fdGV4LmgKQEAgLTM3LDYgKzM3LDEwIEBACiAjaWZuZGVmIF9fUkFERU9OX1RFWF9IX18KICNkZWZpbmUgX19SQURFT05fVEVYX0hfXwogCitleHRlcm4gdm9pZCByYWRlb25TZXRUZXhPZmZzZXQoX19EUkljb250ZXh0ICpwRFJJQ3R4LCBHTGludCB0ZXhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIEdMaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBwaXRjaCk7CisKIGV4dGVybiB2b2lkIHJhZGVvblVwZGF0ZVRleHR1cmVTdGF0ZSggR0xjb250ZXh0ICpjdHggKTsKIAogZXh0ZXJuIGludCByYWRlb25VcGxvYWRUZXhJbWFnZXMoIHJhZGVvbkNvbnRleHRQdHIgcm1lc2EsIHJhZGVvblRleE9ialB0ciB0LApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90ZXhtZW0uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fdGV4bWVtLmMKaW5kZXggZjc1MjBmMS4uNTIzYzU5NyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90ZXhtZW0uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3RleG1lbS5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIHsKICAgIGludCBudW1MZXZlbHM7CiAKLSAgIGlmICggIXQgfHwgdC0+YmFzZS50b3RhbFNpemUgPT0gMCApCisgICBpZiAoICF0IHx8IHQtPmJhc2UudG90YWxTaXplID09IDAgfHwgdC0+aW1hZ2Vfb3ZlcnJpZGUgKQogICAgICAgcmV0dXJuIDA7CiAKICAgIGlmICggUkFERU9OX0RFQlVHICYgKERFQlVHX1RFWFRVUkV8REVCVUdfSU9DVEwpICkgewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90ZXhzdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvcmFkZW9uL3JhZGVvbl90ZXhzdGF0ZS5jCmluZGV4IGFlOGQ1MjcuLjkwYzYzNzkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3JhZGVvbi9yYWRlb25fdGV4c3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9yYWRlb24vcmFkZW9uX3RleHN0YXRlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJjb250ZXh0LmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCiAjaW5jbHVkZSAidGV4Zm9ybWF0LmgiCisjaW5jbHVkZSAidGV4b2JqLmgiCiAjaW5jbHVkZSAiZW51bXMuaCIKIAogI2luY2x1ZGUgInJhZGVvbl9jb250ZXh0LmgiCkBAIC04Myw3ICs4NCw3IEBACiAgICBfQUxQSEFfUkVWKFJHQkE4ODg4KSwKICAgIF9BTFBIQShBUkdCODg4OCksCiAgICBfQUxQSEFfUkVWKEFSR0I4ODg4KSwKLSAgIF9JTlZBTElEKFJHQjg4OCksCisgICBbIE1FU0FfRk9STUFUX1JHQjg4OCBdID0geyBSQURFT05fVFhGT1JNQVRfQVJHQjg4ODgsIDAgfSwKICAgIF9DT0xPUihSR0I1NjUpLAogICAgX0NPTE9SX1JFVihSR0I1NjUpLAogICAgX0FMUEhBKEFSR0I0NDQ0KSwKQEAgLTEzMywxOCArMTM0LDE5IEBACiAKICAgIC8qIFNldCB0aGUgaGFyZHdhcmUgdGV4dHVyZSBmb3JtYXQKICAgICAqLworICAgaWYgKCAhdC0+aW1hZ2Vfb3ZlcnJpZGUgKSB7CisgICAgICB0LT5wcF90eGZvcm1hdCAmPSB+KFJBREVPTl9UWEZPUk1BVF9GT1JNQVRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJBREVPTl9UWEZPUk1BVF9BTFBIQV9JTl9NQVApOworICAgICAgdC0+cHBfdHhmaWx0ZXIgJj0gflJBREVPTl9ZVVZfVE9fUkdCOwogCi0gICB0LT5wcF90eGZvcm1hdCAmPSB+KFJBREVPTl9UWEZPUk1BVF9GT1JNQVRfTUFTSyB8Ci0JCSAgICAgICBSQURFT05fVFhGT1JNQVRfQUxQSEFfSU5fTUFQKTsKLSAgIHQtPnBwX3R4ZmlsdGVyICY9IH5SQURFT05fWVVWX1RPX1JHQjsKLQotICAgaWYgKCBWQUxJRF9GT1JNQVQoIGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ICkgKSB7Ci0gICAgICB0LT5wcF90eGZvcm1hdCB8PSB0eF90YWJsZVsgYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgXS5mb3JtYXQ7Ci0gICAgICB0LT5wcF90eGZpbHRlciB8PSB0eF90YWJsZVsgYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgXS5maWx0ZXI7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgInVuZXhwZWN0ZWQgdGV4dHVyZSBmb3JtYXQgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuOworICAgICAgaWYgKCBWQUxJRF9GT1JNQVQoIGJhc2VJbWFnZS0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0ICkgKSB7CisgICAgICAgICB0LT5wcF90eGZvcm1hdCB8PSB0eF90YWJsZVsgYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgXS5mb3JtYXQ7CisgICAgICAgICB0LT5wcF90eGZpbHRlciB8PSB0eF90YWJsZVsgYmFzZUltYWdlLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQgXS5maWx0ZXI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgInVuZXhwZWN0ZWQgdGV4dHVyZSBmb3JtYXQgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgfQogCiAgICB0ZXhlbEJ5dGVzID0gYmFzZUltYWdlLT5UZXhGb3JtYXQtPlRleGVsQnl0ZXM7CkBAIC0zNDAsMTEgKzM0MiwxMyBAQAogICAgICogcmVxdWlyZXMgNjQtYnl0ZSBhbGlnbmVkIHBpdGNoZXMsIGFuZCB3ZSBtYXkvbWF5IG5vdCBuZWVkIHRoZQogICAgICogYmxpdHRlci4gICBOUE9UIG9ubHkhCiAgICAgKi8KLSAgIGlmIChiYXNlSW1hZ2UtPklzQ29tcHJlc3NlZCkKLSAgICAgIHQtPnBwX3R4cGl0Y2ggPSAodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggKyA2MykgJiB+KDYzKTsKLSAgIGVsc2UKLSAgICAgIHQtPnBwX3R4cGl0Y2ggPSAoKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPldpZHRoICogdGV4ZWxCeXRlcykgKyA2MykgJiB+KDYzKTsKLSAgIHQtPnBwX3R4cGl0Y2ggLT0gMzI7CisgICBpZiAoICF0LT5pbWFnZV9vdmVycmlkZSApIHsKKyAgICAgIGlmIChiYXNlSW1hZ2UtPklzQ29tcHJlc3NlZCkKKyAgICAgICAgIHQtPnBwX3R4cGl0Y2ggPSAodE9iai0+SW1hZ2VbMF1bdC0+YmFzZS5maXJzdExldmVsXS0+V2lkdGggKyA2MykgJiB+KDYzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHQtPnBwX3R4cGl0Y2ggPSAoKHRPYmotPkltYWdlWzBdW3QtPmJhc2UuZmlyc3RMZXZlbF0tPldpZHRoICogdGV4ZWxCeXRlcykgKyA2MykgJiB+KDYzKTsKKyAgICAgIHQtPnBwX3R4cGl0Y2ggLT0gMzI7CisgICB9CiAKICAgIHQtPmRpcnR5X3N0YXRlID0gVEVYX0FMTDsKIApAQCAtODM5LDYgKzg0Myw0NCBAQAogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKK3ZvaWQgcmFkZW9uU2V0VGV4T2Zmc2V0KF9fRFJJY29udGV4dCAqIHBEUklDdHgsIEdMaW50IHRleG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwgR0x1aW50IHBpdGNoKQoreworCXJhZGVvbkNvbnRleHRQdHIgcm1lc2EgPSBwRFJJQ3R4LT5kcml2ZXJQcml2YXRlOworCXN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiA9CisJICAgIF9tZXNhX2xvb2t1cF90ZXh0dXJlKHJtZXNhLT5nbEN0eCwgdGV4bmFtZSk7CisJcmFkZW9uVGV4T2JqUHRyIHQ7CisKKwlpZiAodE9iaiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0ID0gKHJhZGVvblRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YTsKKworCXQtPmltYWdlX292ZXJyaWRlID0gR0xfVFJVRTsKKworCWlmICghb2Zmc2V0KQorCQlyZXR1cm47CisKKwl0LT5wcF90eG9mZnNldCA9IG9mZnNldDsKKwl0LT5wcF90eHBpdGNoID0gcGl0Y2ggLSAzMjsKKworCXN3aXRjaCAoZGVwdGgpIHsKKwljYXNlIDMyOgorCQl0LT5wcF90eGZvcm1hdCA9IHR4X3RhYmxlW01FU0FfRk9STUFUX0FSR0I4ODg4XS5mb3JtYXQ7CisJCXQtPnBwX3R4ZmlsdGVyIHw9IHR4X3RhYmxlW01FU0FfRk9STUFUX0FSR0I4ODg4XS5maWx0ZXI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJZGVmYXVsdDoKKwkJdC0+cHBfdHhmb3JtYXQgPSB0eF90YWJsZVtNRVNBX0ZPUk1BVF9SR0I4ODhdLmZvcm1hdDsKKwkJdC0+cHBfdHhmaWx0ZXIgfD0gdHhfdGFibGVbTUVTQV9GT1JNQVRfUkdCODg4XS5maWx0ZXI7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXQtPnBwX3R4Zm9ybWF0ID0gdHhfdGFibGVbTUVTQV9GT1JNQVRfUkdCNTY1XS5mb3JtYXQ7CisJCXQtPnBwX3R4ZmlsdGVyIHw9IHR4X3RhYmxlW01FU0FfRk9STUFUX1JHQjU2NV0uZmlsdGVyOworCQlicmVhazsKKwl9Cit9CisKICNkZWZpbmUgVEVYT0JKX1RYRklMVEVSX01BU0sgKFJBREVPTl9NQVhfTUlQX0xFVkVMX01BU0sgfAlcCiAJCQkgICAgICBSQURFT05fTUlOX0ZJTFRFUl9NQVNLIHwgCQlcCiAJCQkgICAgICBSQURFT05fTUFHX0ZJTFRFUl9NQVNLIHwJCVwKQEAgLTExMzUsNyArMTE3Nyw3IEBACiAgICAgICBSQURFT05fRklSRVZFUlRJQ0VTKCBybWVzYSApOwogICAgICAgcmFkZW9uU2V0VGV4SW1hZ2VzKCBybWVzYSwgdE9iaiApOwogICAgICAgcmFkZW9uVXBsb2FkVGV4SW1hZ2VzKCBybWVzYSwgKHJhZGVvblRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YSwgMCApOwotICAgICAgaWYgKCAhdC0+YmFzZS5tZW1CbG9jayApIAorICAgICAgaWYgKCAhdC0+YmFzZS5tZW1CbG9jayAmJiAhdC0+aW1hZ2Vfb3ZlcnJpZGUgKSAKIAlyZXR1cm4gR0xfRkFMU0U7CiAgICB9CiAKQEAgLTEyMDIsNyArMTI0NCw4IEBACiAgICAgICBSQURFT05fRklSRVZFUlRJQ0VTKCBybWVzYSApOwogICAgICAgcmFkZW9uU2V0VGV4SW1hZ2VzKCBybWVzYSwgdE9iaiApOwogICAgICAgcmFkZW9uVXBsb2FkVGV4SW1hZ2VzKCBybWVzYSwgKHJhZGVvblRleE9ialB0cikgdE9iai0+RHJpdmVyRGF0YSwgMCApOwotICAgICAgaWYgKCAhdC0+YmFzZS5tZW1CbG9jayAvKiAmJiAhcm1lc2EtPnByZWZlcl9nYXJ0X2NsaWVudF90ZXh0dXJpbmcgIEZJWE1FICovICkgeworICAgICAgaWYgKCAhdC0+YmFzZS5tZW1CbG9jayAmJgorICAgICAgICAgICAhdC0+aW1hZ2Vfb3ZlcnJpZGUgLyogJiYgIXJtZXNhLT5wcmVmZXJfZ2FydF9jbGllbnRfdGV4dHVyaW5nICBGSVhNRSAqLyApIHsKIAkgZnByaW50ZihzdGRlcnIsICIlczogdXBsb2FkIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9jb250ZXh0LmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X2NvbnRleHQuaAppbmRleCA2ZjUyN2YzLi5lZDY5ODEwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X2NvbnRleHQuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X2NvbnRleHQuaApAQCAtNDE5LDkgKzQxOSw5IEBACiAjZGVmaW5lIFMzVklSR0VQQUNLQ09MT1I0NDQ0KCByLCBnLCBiLCBhICkgXAogICAgICgoKChhKSAmIDB4ZjApIDw8IDgpIHwgKCgocikgJiAweGYwKSA8PCA0KSB8ICgoZykgJiAweGYwKSB8ICgoYikgPj4gNCkpCiAKLXN0YXRpYyBfX2lubGluZSBHTHVpbnQgczN2UGFja0NvbG9yKCBHTHVpbnQgY3BwLAotCQkJCQlHTHVieXRlIHIsIEdMdWJ5dGUgZywKLQkJCQkJR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQorc3RhdGljIElOTElORSBHTHVpbnQgczN2UGFja0NvbG9yKCBHTHVpbnQgY3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEgKQogewogCXVuc2lnbmVkIGludCByZXQ7CiAJREVCVUcoKCJjcHAgPSAlaSwgcj0weCV4LCBnPTB4JXgsIGI9MHgleCwgYT0weCV4XG4iLCBjcHAsIHIsIGcsIGIsIGEpKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3ZfbWFjcm9zLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X21hY3Jvcy5oCmluZGV4IDNiYzg3MWIuLjdlOWI0NTIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3ZfbWFjcm9zLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9tYWNyb3MuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjZW5kaWYKIAorI3VuZGVmIERFQlVHCiAjaWYgR0VORVJJQ19ERUJVRwogI2RlZmluZSBERUJVRyhzdHIpIHByaW50ZiBzdHIKICNlbHNlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X3JlbmRlci5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9yZW5kZXIuYwppbmRleCA2YWFhOTQ5Li5mYTNmODVlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X3JlbmRlci5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3ZfcmVuZGVyLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAlQcmltVHlwZV9Qb2x5Z29uCiB9OwogCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBzM3ZTdGFydFByaW1pdGl2ZSggczN2Q29udGV4dFB0ciB2bWVzYSwgR0xlbnVtIHByaW0gKQorc3RhdGljIElOTElORSB2b2lkIHMzdlN0YXJ0UHJpbWl0aXZlKCBzM3ZDb250ZXh0UHRyIHZtZXNhLCBHTGVudW0gcHJpbSApCiB7CiAJX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2ID0gdm1lc2EtPmRyaURyYXdhYmxlOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKIAl2bWVzYS0+cmVzdG9yZV9wcmltaXRpdmUgPSBfaHdfcHJpbTsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgczN2RW5kUHJpbWl0aXZlKCBzM3ZDb250ZXh0UHRyIHZtZXNhICkKK3N0YXRpYyBJTkxJTkUgdm9pZCBzM3ZFbmRQcmltaXRpdmUoIHMzdkNvbnRleHRQdHIgdm1lc2EgKQogewogLyoJR0xjb250ZXh0ICpjdHggPSB2bWVzYS0+Z2xDdHg7ICovCiAJREVCVUcoKCJzM3ZFbmRQcmltaXRpdmVcbiIpKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCiAJZm9yIChpID0gMCA7IGkgPCBWQi0+UHJpbWl0aXZlQ291bnQgOyBpKysgKQogCXsKLSAgICAgICAgICAgICAgICBHTHVpbnQgcHJpbSA9IFZCLT5QcmltaXRpdmVbaV0ubW9kZTsKKwkJR0x1aW50IHByaW0gPSBfdG5sX3RyYW5zbGF0ZV9wcmltKCZWQi0+UHJpbWl0aXZlW2ldKTsKIAkJR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKIAkJR0x1aW50IGxlbmd0aCA9IFZCLT5QcmltaXRpdmVbaV0uY291bnQ7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3Zfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9zcGFuLmMKaW5kZXggZGU3OGY5Zi4uZjlmN2MwZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9zcGFuLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl9zcGFuLmMKQEAgLTEyOCw2ICsxMjgsOCBAQAogCiAvKiAxNiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgXAogICAgKihHTHVzaG9ydCAqKShidWYgKyBfeCoyICsgX3kqZFByaXYtPncqMikgPSBkCiAKQEAgLTE0Myw2ICsxNDUsOCBAQAogLyogMzIgYml0IGRlcHRoYnVmZmVyIGZ1bmN0aW9ucy4KICAqLwogI2lmIDAKKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJXAogICAgKihHTHVpbnQgKikoYnVmICsgX3gqNCArIF95KnBpdGNoKSA9IGQ7CiAKQEAgLTE1Nyw2ICsxNjEsOCBAQAogLyogMjQvOCBiaXQgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKICAqLwogI2lmIDAKKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgeyBcCiAgICBHTHVpbnQgdG1wID0gKihHTHVpbnQgKikoYnVmICsgX3gqNCArIF95KnBpdGNoKTsJXAogICAgdG1wICY9IDB4ZmY7IFwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3ZfeG1lc2EuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Mzdi9zM3ZfeG1lc2EuYwppbmRleCBjNjZmZDZkLi42NjNkYWJkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zM3YvczN2X3htZXNhLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvczN2L3Mzdl94bWVzYS5jCkBAIC0xNyw4ICsxNyw4IEBACiAKIC8qICNkZWZpbmUgREVCVUcoc3RyKSBwcmludGYgc3RyICovCiAKLXN0YXRpYyBHTGJvb2xlYW4gCi1zM3ZJbml0RHJpdmVyKF9fRFJJc2NyZWVuUHJpdmF0ZSAqc1ByaXYpCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK3MzdkluaXRTY3JlZW4oX19EUklzY3JlZW4gKnNQcml2KQogewogICAgIHNQcml2LT5wcml2YXRlID0gKHZvaWQgKikgczN2Q3JlYXRlU2NyZWVuKCBzUHJpdiApOwogCkBAIC0yNyw3ICsyNyw3IEBACiAJcmV0dXJuIEdMX0ZBTFNFOwogICAgIH0KIAotICAgIHJldHVybiBHTF9UUlVFOworICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIApAQCAtMzI3LDM0ICszMjcsMTQgQEAKICAgIHJldHVybiBHTF9UUlVFOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgczN2QVBJID0gewotICAgczN2SW5pdERyaXZlciwKLSAgIHMzdkRlc3Ryb3lTY3JlZW4sCi0gICBzM3ZDcmVhdGVDb250ZXh0LAotICAgczN2RGVzdHJveUNvbnRleHQsCi0gICBzM3ZDcmVhdGVCdWZmZXIsCi0gICBzM3ZEZXN0cm95QnVmZmVyLAotICAgczN2U3dhcEJ1ZmZlcnMsCi0gICBzM3ZNYWtlQ3VycmVudCwKLSAgIHMzdlVuYmluZENvbnRleHQsCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4JICAgPSBzM3ZJbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gID0gczN2RGVzdHJveVNjcmVlbiwKKyAgIC5DcmVhdGVDb250ZXh0ICA9IHMzdkNyZWF0ZUNvbnRleHQsCisgICAuRGVzdHJveUNvbnRleHQgPSBzM3ZEZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICA9IHMzdkNyZWF0ZUJ1ZmZlciwKKyAgIC5EZXN0cm95QnVmZmVyICA9IHMzdkRlc3Ryb3lCdWZmZXIsCisgICAuU3dhcEJ1ZmZlcnMJICAgPSBzM3ZTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudAkgICA9IHMzdk1ha2VDdXJyZW50LAorICAgLlVuYmluZENvbnRleHQgID0gczN2VW5iaW5kQ29udGV4dCwKIH07Ci0KLQotI2lmIDAKLS8qCi0gKiBUaGlzIGlzIHRoZSBib290c3RyYXAgZnVuY3Rpb24gZm9yIHRoZSBkcml2ZXIuCi0gKiBUaGUgX19kcmlDcmVhdGVTY3JlZW4gbmFtZSBpcyB0aGUgc3ltYm9sIHRoYXQgbGliR0wuc28gZmV0Y2hlcy4KLSAqIFJldHVybjogIHBvaW50ZXIgdG8gYSBfX0RSSXNjcmVlblByaXZhdGUuCi0gKi8KLXZvaWQgKl9fZHJpQ3JlYXRlU2NyZWVuKERpc3BsYXkgKmRweSwgaW50IHNjcm4sIF9fRFJJc2NyZWVuICpwc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQ29uZmlncywgX19HTFh2aXN1YWxDb25maWcgKmNvbmZpZykKLXsKLSAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwPU5VTEw7Ci0KLSAgIERFQlVHKCgiX19kcmlDcmVhdGVTY3JlZW46IHBzcCA9ICVwXG4iLCBwc3ApKTsKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZVNjcmVlbihkcHksIHNjcm4sIHBzYywgbnVtQ29uZmlncywgY29uZmlnLCAmczN2QVBJKTsKLSAgIERFQlVHKCgiX19kcmlDcmVhdGVTY3JlZW46IHBzcCA9ICVwXG4iLCBwc3ApKTsKLSAgIHJldHVybiAodm9pZCAqKSBwc3A7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VfeG1lc2EuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VfeG1lc2EuYwppbmRleCAwMDE3MTI1Li4wNGMxYmQ2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlX3htZXNhLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZV94bWVzYS5jCkBAIC0xNjgsMTYgKzE2OCwxNyBAQAogfTsKIAogCi0vKiB0aGlzIGlzIGZpcnN0IGZ1bmN0aW9uIGNhbGxlZCBpbiBkaXJ2ZXIqLworUFVCTElDIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpzYXZhZ2VTY3JlZW5FeHRlbnNpb25zW10gPSB7CisgICAgJmRyaUNvcmVFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpTGVnYWN5RXh0ZW5zaW9uLmJhc2UsCisgICAgJmRyaVJlYWREcmF3YWJsZUV4dGVuc2lvbiwKK307CiAKIHN0YXRpYyBHTGJvb2xlYW4KIHNhdmFnZUluaXREcml2ZXIoX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdikKIHsKICAgc2F2YWdlU2NyZWVuUHJpdmF0ZSAqc2F2YWdlU2NyZWVuOwogICBTQVZBR0VEUklQdHIgICAgICAgICBnRFJJUHJpdiA9IChTQVZBR0VEUklQdHIpc1ByaXYtPnBEZXZQcml2OwotICAgUEZOR0xYU0NSRU5BQkxFRVhURU5TSU9OUFJPQyBnbHhfZW5hYmxlX2V4dGVuc2lvbiA9Ci0gICAgIChQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DKSAoKmRyaV9pbnRlcmZhY2UtPmdldFByb2NBZGRyZXNzKCJnbHhFbmFibGVFeHRlbnNpb24iKSk7Ci0KIAogICAgaWYgKHNQcml2LT5kZXZQcml2U2l6ZSAhPSBzaXplb2YoU0FWQUdFRFJJUmVjKSkgewogICAgICAgZnByaW50ZihzdGRlcnIsIlxuRVJST1IhICBzaXplb2YoU0FWQUdFRFJJUmVjKSBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgc2l6ZSBmcm9tIGRldmljZSBkcml2ZXJcbiIpOwpAQCAtMjY1LDEwICsyNjYsNyBAQAogICAgZHJpUGFyc2VPcHRpb25JbmZvICgmc2F2YWdlU2NyZWVuLT5vcHRpb25DYWNoZSwKIAkJICAgICAgIF9fZHJpQ29uZmlnT3B0aW9ucywgX19kcmlOQ29uZmlnT3B0aW9ucyk7CiAKLSAgIGlmIChnbHhfZW5hYmxlX2V4dGVuc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKShzUHJpdi0+cHNjLT5zY3JlZW5Db25maWdzLAotCQkJICAgICAgIkdMWF9TR0lfbWFrZV9jdXJyZW50X3JlYWQiKTsKLSAgIH0KKyAgIHNQcml2LT5leHRlbnNpb25zID0gc2F2YWdlU2NyZWVuRXh0ZW5zaW9uczsKIAogI2lmIDAKICAgIHNhdmFnZURERmFzdFBhdGhJbml0KCk7CkBAIC0yOTUsMzQgKzI5Myw2IEBACiAgICBzUHJpdi0+cHJpdmF0ZSA9IE5VTEw7CiB9CiAKLSNpZiAwCi1HTHZpc3VhbCAqWE1lc2FDcmVhdGVWaXN1YWwoRGlzcGxheSAqZHB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqZHJpU2NyblByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWFZpc3VhbEluZm8gKnZpc2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19HTFh2aXN1YWxDb25maWcgKmNvbmZpZykKLXsKLSAgIC8qIERyaXZlcnMgbWF5IGNoYW5nZSB0aGUgYXJncyB0byBfbWVzYV9jcmVhdGVfdmlzdWFsKCkgaW4gb3JkZXIgdG8KLSAgICAqIHNldHVwIHNwZWNpYWwgdmlzdWFscy4KLSAgICAqLwotICAgcmV0dXJuIF9tZXNhX2NyZWF0ZV92aXN1YWwoIGNvbmZpZy0+cmdiYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmRvdWJsZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9iaXRjb3VudCh2aXNpbmZvLT5yZWRfbWFzayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2FfYml0Y291bnQodmlzaW5mby0+Z3JlZW5fbWFzayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2FfYml0Y291bnQodmlzaW5mby0+Ymx1ZV9tYXNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFscGhhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBpbmRleCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kZXB0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zdGVuY2lsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFjY3VtUmVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFjY3VtR3JlZW5TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YWNjdW1CbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFjY3VtQWxwaGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbnVtIHNhbXBsZXMgKi8gKTsKLX0KLSNlbmRpZgotCi0KIHN0YXRpYyBHTGJvb2xlYW4KIHNhdmFnZUNyZWF0ZUNvbnRleHQoIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKm1lc2FWaXMsCiAJCSAgICAgX19EUkljb250ZXh0UHJpdmF0ZSAqZHJpQ29udGV4dFByaXYsCkBAIC01MjUsNyArNDk1LDcgQEAKIAkJCQkJICAgICJlbmFibGVfZmFzdHBhdGgiKTsKICAgIC8qIERSTSB2ZXJzaW9ucyBiZWZvcmUgMi4xLjMgd291bGQgb25seSByZW5kZXIgdHJpYW5nbGUgbGlzdHMuIEVMVFMKICAgICAqIHN1cHBvcnQgd2FzIGFkZGVkIGluIDIuMi4wLiAqLwotICAgaWYgKGltZXNhLT5lbmFibGVfZmFzdHBhdGggJiYgc1ByaXYtPmRybU1pbm9yIDwgMikgeworICAgaWYgKGltZXNhLT5lbmFibGVfZmFzdHBhdGggJiYgc1ByaXYtPmRybV92ZXJzaW9uLm1pbm9yIDwgMikgewogICAgICAgZnByaW50ZiAoc3RkZXJyLAogCSAgICAgICAiKioqIERpc2FibGluZyBmYXN0IHBhdGggYmVjYXVzZSB5b3VyIERSTSB2ZXJzaW9uIGlzIGJ1Z2d5ICIKIAkgICAgICAgIm9yIGRvZXNuJ3RcbioqKiBzdXBwb3J0IEVMVFMuIFlvdSBuZWVkIGF0IGxlYXN0IFNhdmFnZSBEUk0gIgpAQCAtNzMyLDcgKzcwMiw3IEBACiAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYgPSBpbWVzYS0+ZHJpRHJhd2FibGU7CiAKICAgIGlmICgoZFByaXYtPm51bUJhY2tDbGlwUmVjdHMgPT0gMCkKLSAgICAgICB8fCAoaW1lc2EtPmdsQ3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9PSBCVUZGRVJfQklUX0ZST05UX0xFRlQpKSB7CisgICAgICAgfHwgKGltZXNhLT5nbEN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0ZST05UX0xFRlQpKSB7CiAgICAgICBpbWVzYS0+bnVtQ2xpcFJlY3RzID0gZFByaXYtPm51bUNsaXBSZWN0czsKICAgICAgIGltZXNhLT5wQ2xpcFJlY3RzID0gZFByaXYtPnBDbGlwUmVjdHM7CiAgICAgICBpbWVzYS0+ZHJhd1ggPSBkUHJpdi0+eDsKQEAgLTkxNywzMiArODg3LDE4IEBACiAgICB9CiB9CiAKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIHNhdmFnZUFQSSA9IHsKLSAgIHNhdmFnZUluaXREcml2ZXIsCi0gICBzYXZhZ2VEZXN0cm95U2NyZWVuLAotICAgc2F2YWdlQ3JlYXRlQ29udGV4dCwKLSAgIHNhdmFnZURlc3Ryb3lDb250ZXh0LAotICAgc2F2YWdlQ3JlYXRlQnVmZmVyLAotICAgc2F2YWdlRGVzdHJveUJ1ZmZlciwKLSAgIHNhdmFnZVN3YXBCdWZmZXJzLAotICAgc2F2YWdlTWFrZUN1cnJlbnQsCi0gICBzYXZhZ2VVbmJpbmRDb250ZXh0Ci19OwotCi0KLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICoKLXNhdmFnZUZpbGxJbk1vZGVzKCB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAorc3RhdGljIGNvbnN0ICBfX0RSSWNvbmZpZyAqKgorc2F2YWdlRmlsbEluTW9kZXMoIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwLAorCQkgICB1bnNpZ25lZCBwaXhlbF9iaXRzLCB1bnNpZ25lZCBkZXB0aF9iaXRzLAogCQkgICB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyICkKIHsKLSAgICBfX0dMY29udGV4dE1vZGVzICogbW9kZXM7CisgICAgX19EUkljb25maWcgKipjb25maWdzOwogICAgIF9fR0xjb250ZXh0TW9kZXMgKiBtOwotICAgIHVuc2lnbmVkIG51bV9tb2RlczsKICAgICB1bnNpZ25lZCBkZXB0aF9idWZmZXJfZmFjdG9yOwogICAgIHVuc2lnbmVkIGJhY2tfYnVmZmVyX2ZhY3RvcjsKICAgICBHTGVudW0gZmJfZm9ybWF0OwogICAgIEdMZW51bSBmYl90eXBlOworICAgIGludCBpOwogCiAgICAgLyogUmlnaHQgbm93IEdMWF9TV0FQX0NPUFlfT01MIGlzbid0IHN1cHBvcnRlZCwgYnV0IGl0IHdvdWxkIGJlIGVhc3kKICAgICAgKiBlbm91Z2ggdG8gYWRkIHN1cHBvcnQuICBCYXNpY2FsbHksIGlmIGEgY29udGV4dCBpcyBjcmVhdGVkIHdpdGggYW4KQEAgLTk3Myw4ICs5MjksNiBAQAogICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IgPSAoKGRlcHRoX2JpdHMgIT0gMCkgfHwgKHN0ZW5jaWxfYml0cyAhPSAwKSkgPyAyIDogMTsKICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgID0gKGhhdmVfYmFja19idWZmZXIpID8gMiA6IDE7CiAKLSAgICBudW1fbW9kZXMgPSBkZXB0aF9idWZmZXJfZmFjdG9yICogYmFja19idWZmZXJfZmFjdG9yICogNDsKLQogICAgIGlmICggcGl4ZWxfYml0cyA9PSAxNiApIHsKICAgICAgICAgZmJfZm9ybWF0ID0gR0xfUkdCOwogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CkBAIC05ODQsMjEgKzkzOCwxMSBAQAogICAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwogICAgIH0KIAotICAgIG1vZGVzID0gKCpkcmlfaW50ZXJmYWNlLT5jcmVhdGVDb250ZXh0TW9kZXMpKCBudW1fbW9kZXMsIHNpemVvZiggX19HTGNvbnRleHRNb2RlcyApICk7Ci0gICAgbSA9IG1vZGVzOwotICAgIGlmICggISBkcmlGaWxsSW5Nb2RlcyggJiBtLCBmYl9mb3JtYXQsIGZiX3R5cGUsCi0JCQkgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICAgR0xYX1RSVUVfQ09MT1IgKSApIHsKLQlmcHJpbnRmKCBzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXyApOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICggISBkcmlGaWxsSW5Nb2RlcyggJiBtLCBmYl9mb3JtYXQsIGZiX3R5cGUsCi0JCQkgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCi0JCQkgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkJICAgR0xYX0RJUkVDVF9DT0xPUiApICkgeworICAgIGNvbmZpZ3MgPSBkcmlDcmVhdGVDb25maWdzKGZiX2Zvcm1hdCwgZmJfdHlwZSwKKwkJCSAgICAgICBkZXB0aF9iaXRzX2FycmF5LCBzdGVuY2lsX2JpdHNfYXJyYXksCisJCQkgICAgICAgZGVwdGhfYnVmZmVyX2ZhY3RvciwKKwkJCSAgICAgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yKTsKKyAgICBpZiAoY29uZmlncyA9PSBOVUxMKSB7CiAJZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCiAJCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKIAlyZXR1cm4gTlVMTDsKQEAgLTEwMDYsNzQgKzk1MCw2OCBAQAogCiAgICAgLyogTWFyayB0aGUgdmlzdWFsIGFzIHNsb3cgaWYgdGhlcmUgYXJlICJmYWtlIiBzdGVuY2lsIGJpdHMuCiAgICAgICovCi0gICAgZm9yICggbSA9IG1vZGVzIDsgbSAhPSBOVUxMIDsgbSA9IG0tPm5leHQgKSB7Ci0JaWYgKCAobS0+c3RlbmNpbEJpdHMgIT0gMCkgJiYgKG0tPnN0ZW5jaWxCaXRzICE9IHN0ZW5jaWxfYml0cykgKSB7CisgICAgZm9yIChpID0gMDsgY29uZmlnc1tpXTsgaSsrKSB7CisJbSA9ICZjb25maWdzW2ldLT5tb2RlczsKKwlpZiAoKG0tPnN0ZW5jaWxCaXRzICE9IDApICYmIChtLT5zdGVuY2lsQml0cyAhPSBzdGVuY2lsX2JpdHMpKSB7CiAJICAgIG0tPnZpc3VhbFJhdGluZyA9IEdMWF9TTE9XX0NPTkZJRzsKIAl9CiAgICAgfQogCi0gICAgcmV0dXJuIG1vZGVzOworICAgIHJldHVybiAoY29uc3QgX19EUkljb25maWcgKiopIGNvbmZpZ3M7CiB9CiAKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBib290c3RyYXAgZnVuY3Rpb24gZm9yIHRoZSBkcml2ZXIuICBsaWJHTCBzdXBwbGllcyBhbGwgb2YgdGhlCi0gKiByZXF1aXNpdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSwgYW5kIHRoZSBkcml2ZXIgaW5pdGlhbGl6ZXMgaXRzZWxmLgotICogVGhpcyByb3V0aW5lIGFsc28gZmlsbHMgaW4gdGhlIGxpbmtlZCBsaXN0IHBvaW50ZWQgdG8gYnkgXGMgZHJpdmVyX21vZGVzCi0gKiB3aXRoIHRoZSBcYyBfX0dMY29udGV4dE1vZGVzIHRoYXQgdGhlIGRyaXZlciBjYW4gc3VwcG9ydCBmb3Igd2luZG93cyBvcgotICogcGJ1ZmZlcnMuCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3BlY2lmaWMgcGFydCBvZiB0aGUgY3JlYXRlTmV3U2NyZWVuIGVudHJ5IHBvaW50LgogICogCi0gKiBccmV0dXJuIEEgcG9pbnRlciB0byBhIFxjIF9fRFJJc2NyZWVuUHJpdmF0ZSBvbiBzdWNjZXNzLCBvciBcYyBOVUxMIG9uIAotICogICAgICAgICBmYWlsdXJlLgorICogXHRvZG8gbWF5YmUgZm9sZCB0aGlzIGludG8gaW50ZWxJbml0RHJpdmVyCisgKgorICogXHJldHVybiB0aGUgX19HTGNvbnRleHRNb2RlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKICAqLwotUFVCTElDCi12b2lkICogX19kcmlDcmVhdGVOZXdTY3JlZW5fMjAwNTA3MjcoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwgX19EUklzY3JlZW4gKnBzYywKLQkJCSAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkZHhfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICogZnJhbWVfYnVmZmVyLAotCQkJICAgICBkcm1BZGRyZXNzIHBTQVJFQSwgaW50IGZkLCAKLQkJCSAgICAgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWludGVyZmFjZU1ldGhvZHMgKiBpbnRlcmZhY2UsCi0JCQkgICAgIF9fR0xjb250ZXh0TW9kZXMgKiogZHJpdmVyX21vZGVzICkKLQkJCSAgICAgCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK3NhdmFnZUluaXRTY3JlZW4oX19EUklzY3JlZW5Qcml2YXRlICpwc3ApCiB7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0geyAyLCAwLCAwIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRyaV9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OwogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcm1fZXhwZWN0ZWQgPSB7IDIsIDEsIDAgfTsKLQotICAgZHJpX2ludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgIFNBVkFHRURSSVB0ciBkcmlfcHJpdiA9IChTQVZBR0VEUklQdHIpcHNwLT5wRGV2UHJpdjsKIAogICAgaWYgKCAhIGRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKCAiU2F2YWdlIiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgeworCQkJCSAgICAgICZwc3AtPmRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKQogICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICAgICAKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJnNhdmFnZUFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgU0FWQUdFRFJJUHRyIGRyaV9wcml2ID0gKFNBVkFHRURSSVB0cilwc3AtPnBEZXZQcml2OwotICAgICAgKmRyaXZlcl9tb2RlcyA9IHNhdmFnZUZpbGxJbk1vZGVzKCBkcmlfcHJpdi0+Y3BwKjgsCi0JCQkJCSAoZHJpX3ByaXYtPmNwcCA9PSAyKSA/IDE2IDogMjQsCi0JCQkJCSAoZHJpX3ByaXYtPmNwcCA9PSAyKSA/IDAgIDogOCwKLQkJCQkJIChkcmlfcHJpdi0+YmFja09mZnNldCAhPSBkcmlfcHJpdi0+ZGVwdGhPZmZzZXQpICk7CiAKLSAgICAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLCBkb2VzIG5vdCBhY3R1YWxseQotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwKLSAgICAgICAqIHRoZSBleHRlbnNpb25zIHRoYXQgKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCi0gICAgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcyBjYWxsZWQsIGJ1dCB3ZSBjYW4ndAotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYSBjb250ZXh0IHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KLSAgICAgICAqLwotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLSAgIH0KKyAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLAorICAgICogZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlCisgICAgKiB0aGF0IGFsbCB0aGUgZGlzcGF0Y2ggb2Zmc2V0cyBmb3IgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQKKyAgICAqICptaWdodCogYmUgZW5hYmxlcyBhcmUga25vd24uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZQorICAgICogZGlzcGF0Y2ggb2Zmc2V0cyBuZWVkIHRvIGJlIGtub3duIHdoZW4gX21lc2FfY29udGV4dF9jcmVhdGUgaXMKKyAgICAqIGNhbGxlZCwgYnV0IHdlIGNhbid0IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucyB1bnRpbCB3ZSBoYXZlIGEKKyAgICAqIGNvbnRleHQgcG9pbnRlci4KKyAgICAqCisgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PworICAgICovCisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwogCi0gICByZXR1cm4gKHZvaWQgKikgcHNwOworICAgaWYgKCFzYXZhZ2VJbml0RHJpdmVyKHBzcCkpCisgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBzYXZhZ2VGaWxsSW5Nb2RlcyggcHNwLAorCQkJICAgICBkcmlfcHJpdi0+Y3BwKjgsCisJCQkgICAgIChkcmlfcHJpdi0+Y3BwID09IDIpID8gMTYgOiAyNCwKKwkJCSAgICAgKGRyaV9wcml2LT5jcHAgPT0gMikgPyAwICA6IDgsCisJCQkgICAgIChkcmlfcHJpdi0+YmFja09mZnNldCAhPSBkcmlfcHJpdi0+ZGVwdGhPZmZzZXQpICk7CiB9CisKK2NvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyBkcmlEcml2ZXJBUEkgPSB7CisgICBzYXZhZ2VJbml0U2NyZWVuLCAKKyAgIHNhdmFnZURlc3Ryb3lTY3JlZW4sCisgICBzYXZhZ2VDcmVhdGVDb250ZXh0LAorICAgc2F2YWdlRGVzdHJveUNvbnRleHQsCisgICBzYXZhZ2VDcmVhdGVCdWZmZXIsCisgICBzYXZhZ2VEZXN0cm95QnVmZmVyLAorICAgc2F2YWdlU3dhcEJ1ZmZlcnMsCisgICBzYXZhZ2VNYWtlQ3VycmVudCwKKyAgIHNhdmFnZVVuYmluZENvbnRleHQKK307CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlaW9jdGwuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2Vpb2N0bC5oCmluZGV4IDk4NjI5MDQuLjYzOTYwNWMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2Vpb2N0bC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2Vpb2N0bC5oCkBAIC02NCwxOSArNjQsMTkgQEAKIAogZXh0ZXJuIHZvaWQgc2F2YWdlR2V0RE1BQnVmZmVyKCBzYXZhZ2VDb250ZXh0UHRyIGltZXNhICk7CiAKLXN0YXRpYyBfX2lubGluZQorc3RhdGljIElOTElORQogdm9pZCBzYXZhZ2VSZWxlYXNlSW5kZXhlZFZlcnRzKCBzYXZhZ2VDb250ZXh0UHRyIGltZXNhICkKIHsKICAgICBpbWVzYS0+Zmlyc3RFbHQgPSAtMTsKIH0KIAotc3RhdGljIF9faW5saW5lCitzdGF0aWMgSU5MSU5FCiBHTGJvb2xlYW4gc2F2YWdlSGF2ZUluZGV4ZWRWZXJ0cyggc2F2YWdlQ29udGV4dFB0ciBpbWVzYSApCiB7CiAgICAgcmV0dXJuIChpbWVzYS0+Zmlyc3RFbHQgIT0gLTEpOwogfQogCi1zdGF0aWMgX19pbmxpbmUKK3N0YXRpYyBJTkxJTkUKIHVpbnQzMl90ICpzYXZhZ2VBbGxvY1Z0eEJ1Ziggc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwgR0x1aW50IHdvcmRzICkKIHsKICAgIHN0cnVjdCBzYXZhZ2VfdnR4YnVmX3QgKmJ1ZmZlciA9IGltZXNhLT52dHhCdWY7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgIHJldHVybiBoZWFkOwogfQogCi1zdGF0aWMgX19pbmxpbmUKK3N0YXRpYyBJTkxJTkUKIHVpbnQzMl90ICpzYXZhZ2VBbGxvY0luZGV4ZWRWZXJ0cyggc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwgR0x1aW50IG4gKQogewogICAgIHVpbnQzMl90ICpyZXQ7CkBAIC0xMzEsNyArMTMxLDcgQEAKICAqIC0gQWN0dWFsbHkgYWxsb2NhdGUgZW50cmllcyBmb3IgdGhlIGluZGljZXMgaW4gdGhlIGNvbW1hbmQgYnVmZmVyLgogICogICAoVGhpcyBhbGxvY2F0aW9uIG11c3Qgc3VjY2VlZCB3aXRob3V0IHdyYXBwaW5nIHRoZSBjbWQgYnVmZmVyISkKICAqLwotc3RhdGljIF9faW5saW5lCitzdGF0aWMgSU5MSU5FCiB2b2lkIHNhdmFnZUZsdXNoRWx0cyggc2F2YWdlQ29udGV4dFB0ciBpbWVzYSApCiB7CiAgICAgaWYgKGltZXNhLT5lbHRzLmNtZCkgewpAQCAtMTQ4LDcgKzE0OCw3IEBACiAvKiBBbGxvY2F0ZSBhIGNvbW1hbmQgYnVmZmVyIGVudHJ5IHdpdGggPGJ5dGVzPiBieXRlcyBvZiBhcmd1bWVudHM6CiAgKiAtIGltcGxpZXMgc2F2YWdlRmx1c2hFbHRzCiAgKi8KLXN0YXRpYyBfX2lubGluZQorc3RhdGljIElOTElORQogZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKnNhdmFnZUFsbG9jQ21kQnVmKCBzYXZhZ2VDb250ZXh0UHRyIGltZXNhLCBHTHVpbnQgYnl0ZXMgKQogewogICAgIGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpyZXQ7CkBAIC0xNzEsNyArMTcxLDcgQEAKICAqICAgaW5jb21wbGV0ZSBpbmRleGVkIGRyYXdpbmcgY29tbWFuZCB5ZXQKICAqIC0gaW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGVsdHMuIEZpbmFsIGFsbG9jYXRpb24gaXMgZG9uZSBpbiBzYXZhZ2VGbHVzaEVsdHMKICAqLwotc3RhdGljIF9faW5saW5lCitzdGF0aWMgSU5MSU5FCiB1aW50MTZfdCAqc2F2YWdlQWxsb2NFbHRzKCBzYXZhZ2VDb250ZXh0UHRyIGltZXNhLCBHTHVpbnQgbiApCiB7CiAgICAgdWludDE2X3QgKnJldDsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VyZW5kZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VyZW5kZXIuYwppbmRleCA1MTQ0MzRjLi5mMmYxOTk4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlcmVuZGVyLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXJlbmRlci5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogICAgZm9yIChpID0gMCA7IGkgPCBWQi0+UHJpbWl0aXZlQ291bnQgOyBpKyspCiAgICB7Ci0gICAgICBHTHVpbnQgcHJpbSA9IFZCLT5QcmltaXRpdmVbaV0ubW9kZTsKKyAgICAgIEdMdWludCBwcmltID0gX3RubF90cmFuc2xhdGVfcHJpbSgmVkItPlByaW1pdGl2ZVtpXSk7CiAgICAgICBHTHVpbnQgc3RhcnQgPSBWQi0+UHJpbWl0aXZlW2ldLnN0YXJ0OwogICAgICAgR0x1aW50IGxlbmd0aCA9IFZCLT5QcmltaXRpdmVbaV0uY291bnQ7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VzcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3Bhbi5jCmluZGV4IDYxYWI5ZTYuLjAwZmQxMjUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VzcGFuLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXNwYW4uYwpAQCAtOTMsNiArOTMsOCBAQAogLyogMTYgYml0IGludGVnZXIgZGVwdGhidWZmZXIgZnVuY3Rpb25zCiAgKiBEZXB0aCByYW5nZSBpcyByZXZlcnNlZC4gU2VlIGFsc28gc2F2YWdlQ2FsY1ZpZXdwb3J0LgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgXAogICAgICooR0x1c2hvcnQgKikoYnVmICsgKChfeCk8PDEpICsgKF95KSpwaXRjaCkgPSAweEZGRkYgLSBkCiAKQEAgLTEwNyw2ICsxMDksOCBAQAogCiAvKiAxNiBiaXQgZmxvYXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVzaG9ydAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSBcCiAgICAgKihHTHVzaG9ydCAqKShidWYgKyAoKF94KTw8MSkgKyAoX3kpKnBpdGNoKSA9IFwKICAgICAgICAgc2F2YWdlRW5jb2RlRmxvYXQxNiggMS4wIC0gKEdMZmxvYXQpZC82NTUzNS4wICkKQEAgLTEyNSw2ICsxMjksOCBAQAogLyogOC1iaXQgc3RlbmNpbCAvMjQtYml0IGludGVnZXIgZGVwdGggZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICogRGVwdGggcmFuZ2UgaXMgcmV2ZXJzZWQuIFNlZSBhbHNvIHNhdmFnZUNhbGNWaWV3cG9ydC4KICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSBkbyB7CQkJCVwKICAgIEdMdWludCB0bXAgPSAqKEdMdWludCAqKShidWYgKyAoKF94KTw8MikgKyAoX3kpKnBpdGNoKTsJXAogICAgdG1wICY9IDB4RkYwMDAwMDA7CQkJCQkJXApAQCAtMTQzLDYgKzE0OSw4IEBACiAKIC8qIDI0IGJpdCBmbG9hdCBkZXB0aGJ1ZmZlciBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSBkbyB7CQkJCVwKICAgICBHTHVpbnQgdG1wID0gKihHTHVpbnQgKikoYnVmICsgKChfeCk8PDIpICsgKF95KSpwaXRjaCk7CVwKICAgICB0bXAgJj0gMHhGRjAwMDAwMDsJCQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3Bhbi5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXNwYW4uaAppbmRleCBmNmEzMTJlLi41M2E3ZjhiIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3Bhbi5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2VzcGFuLmgKQEAgLTU1LDcgKzU1LDcgQEAKICAqCiAgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZW5jb2RpbmcgZm9yIG51bWJlcnMgPCAyXi0xNi4KICAqLwotc3RhdGljIF9faW5saW5lIEdMdWludCBzYXZhZ2VFbmNvZGVGbG9hdDE2KCBHTGRvdWJsZSB4ICkKK3N0YXRpYyBJTkxJTkUgR0x1aW50IHNhdmFnZUVuY29kZUZsb2F0MTYoIEdMZG91YmxlIHggKQogewogICAgIEdMaW50IHIgPSAoR0xpbnQpKHggKiAweDEwMDAwMDAwKTsKICAgICBHTGludCBleHAgPSAwOwpAQCAtNjcsNyArNjcsNyBAQAogICAgIH0KICAgICByZXR1cm4gZXhwID4gMHhmID8gMHhmZmZmIDogKHIgLSAweDEwMDApIHwgKGV4cCA8PCAxMik7CiB9Ci1zdGF0aWMgX19pbmxpbmUgR0xkb3VibGUgc2F2YWdlRGVjb2RlRmxvYXQxNiggR0x1aW50IHggKQorc3RhdGljIElOTElORSBHTGRvdWJsZSBzYXZhZ2VEZWNvZGVGbG9hdDE2KCBHTHVpbnQgeCApCiB7CiAgICAgc3RhdGljIGNvbnN0IEdMZG91YmxlIHBvdzJbMTZdID0gewogCTEuMC8oMTw8MjgpLCAxLjAvKDE8PDI3KSwgMS4wLygxPDwyNiksIDEuMC8oMTw8MjUpLApAQCAtOTIsNyArOTIsNyBAQAogICoKICAqIERldGFpbHMgYW5hbG9nb3VzIHRvIHRoZSAxNi1iaXQgZm9ybWF0LgogICovCi1zdGF0aWMgX19pbmxpbmUgR0x1aW50IHNhdmFnZUVuY29kZUZsb2F0MjQoIEdMZG91YmxlIHggKQorc3RhdGljIElOTElORSBHTHVpbnQgc2F2YWdlRW5jb2RlRmxvYXQyNCggR0xkb3VibGUgeCApCiB7CiAgICAgaW50NjRfdCByID0gKGludDY0X3QpKHggKiAoKGludDY0X3QpMSA8PCAoMTkrMzIpKSk7CiAgICAgR0xpbnQgZXhwID0gMDsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIHJldHVybiBleHAgPiAweDFmID8gMHhmZmZmZmYgOiAociAtIDB4ODAwMDApIHwgKGV4cCA8PCAxOSk7CiB9CiAjZGVmaW5lIF8xIChpbnQ2NF90KTEKLXN0YXRpYyBfX2lubGluZSBHTGRvdWJsZSBzYXZhZ2VEZWNvZGVGbG9hdDI0KCBHTHVpbnQgeCApCitzdGF0aWMgSU5MSU5FIEdMZG91YmxlIHNhdmFnZURlY29kZUZsb2F0MjQoIEdMdWludCB4ICkKIHsKICAgICBzdGF0aWMgY29uc3QgR0xkb3VibGUgcG93MlszMl0gPSB7CiAJMS4wLyhfMTw8NTEpLCAxLjAvKF8xPDw1MCksIDEuMC8oXzE8PDQ5KSwgMS4wLyhfMTw8NDgpLApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXN0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3RhdGUuYwppbmRleCA4NGZkMzE1Li5jZWVmMzRjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdlc3RhdGUuYwpAQCAtNzYsNyArNzYsNyBAQAogc3RhdGljIHZvaWQgc2F2YWdlQmxlbmRGdW5jX3M0KEdMY29udGV4dCAqKTsKIHN0YXRpYyB2b2lkIHNhdmFnZUJsZW5kRnVuY19zM2QoR0xjb250ZXh0ICopOwogCi1zdGF0aWMgX19pbmxpbmVfXyBHTHVpbnQgc2F2YWdlUGFja0NvbG9yKEdMdWludCBmb3JtYXQsIAorc3RhdGljIElOTElORSBHTHVpbnQgc2F2YWdlUGFja0NvbG9yKEdMdWludCBmb3JtYXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhKQogewpAQCAtNjQwLDE1ICs2NDAsMTcgQEAKICAgICBzYXZhZ2VDb250ZXh0UHRyIGltZXNhID0gU0FWQUdFX0NPTlRFWFQoY3R4KTsKICAgICB1aW50MzJfdCBkZXN0Q3RybCA9IGltZXNhLT5yZWdzLnM0LmRlc3RDdHJsLnVpOwogCi0gICAgLyoKLSAgICAgKiBfRHJhd0Rlc3RNYXNrIGlzIGVhc2llciB0byBjb3BlIHdpdGggdGhhbiA8bW9kZT4uCi0gICAgICovCi0gICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSApIHsKLSAgICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyAhPSAxKSB7CisJRkFMTEJBQ0soIGN0eCwgU0FWQUdFX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICkgeworICAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICAgIGltZXNhLT5Jc0RvdWJsZSA9IEdMX0ZBTFNFOwogCWltZXNhLT5yZWdzLnM0LmRlc3RDdHJsLm5pLm9mZnNldCA9IGltZXNhLT5zYXZhZ2VTY3JlZW4tPmZyb250T2Zmc2V0Pj4xMTsKIAlicmVhazsKLSAgICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgIGNhc2UgQlVGRkVSX0JBQ0tfTEVGVDoKICAgICAgICAgaW1lc2EtPklzRG91YmxlID0gR0xfVFJVRTsKIAlpbWVzYS0+cmVncy5zNC5kZXN0Q3RybC5uaS5vZmZzZXQgPSBpbWVzYS0+c2F2YWdlU2NyZWVuLT5iYWNrT2Zmc2V0Pj4xMTsKIAlicmVhazsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2V0ZXguYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2V0ZXguYwppbmRleCBkYmUzMGQ0Li4xZDRiZmE1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdldGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXRleC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKICAqIFxwYXJhbSB3ICAgd2lkdGggaW4gYnl0ZXMKICAqLwogI2RlZmluZSBTVUJUSUxFX0ZVTkModyxoKQkJCQkJXAotc3RhdGljIF9faW5saW5lIEdMdWJ5dGUgKnNhdmFnZVVwbG9hZFN1YnRpbGVfIyN3IyN4IyNoCQlcCitzdGF0aWMgSU5MSU5FIEdMdWJ5dGUgKnNhdmFnZVVwbG9hZFN1YnRpbGVfIyN3IyN4IyNoCQlcCiAoR0x1Ynl0ZSAqZGVzdCwgR0x1Ynl0ZSAqc3JjLCBHTHVpbnQgc3JjU3RyaWRlKQkJCVwKIHsJCQkJCQkJCVwKICAgICBHTHVpbnQgeTsJCQkJCQkJXApAQCAtMTAxNiw3ICsxMDE2LDcgQEAKICAgICAgIC8qIEhlYXAgdGltZXN0YW1wcyBhcmUgb25seSByZWxpYWJsZSB3aXRoIFNhdmFnZSBEUk0gMi4zLnggb3IKICAgICAgICAqIGxhdGVyLiBFYXJsaWVyIHZlcnNpb25zIGhhZCBvbmx5IDE2IGJpdCB0aW1lIHN0YW1wcyB3aGljaAogICAgICAgICogd291bGQgd3JhcCB0b28gZnJlcXVlbnRseS4gKi8KLSAgICAgIGlmIChpbWVzYS0+c2F2YWdlU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZHJtTWlub3IgPj0gMykgeworICAgICAgaWYgKGltZXNhLT5zYXZhZ2VTY3JlZW4tPmRyaVNjcm5Qcml2LT5kcm1fdmVyc2lvbi5taW5vciA+PSAzKSB7CiAJICB1bnNpZ25lZCBpbnQgaGVhcCA9IHQtPmJhc2UuaGVhcC0+aGVhcElkOwogCSAgTE9DS19IQVJEV0FSRShpbWVzYSk7CiAJICBzYXZhZ2VXYWl0RXZlbnQgKGltZXNhLCBpbWVzYS0+dGV4dHVyZUhlYXBzW2hlYXBdLT50aW1lc3RhbXApOwpAQCAtMTcxMyw3ICsxNzEzLDcgQEAKICAgICAqIE9ubHkgdXNlZnVsIHdpdGggbG9uZy1saXZlZCAzMi1iaXQgZXZlbnQgdGFncyBhdmFpbGFibGUKICAgICAqIHdpdGggU2F2YWdlIERSTSAyLjMueCBvciBsYXRlci4gKi8KICAgIGlmICgoaW1lc2EtPkN1cnJlbnRUZXhPYmpbMF0gfHwgaW1lc2EtPkN1cnJlbnRUZXhPYmpbMV0pICYmCi0gICAgICAgaW1lc2EtPnNhdmFnZVNjcmVlbi0+ZHJpU2NyblByaXYtPmRybU1pbm9yID49IDMpIHsKKyAgICAgICBpbWVzYS0+c2F2YWdlU2NyZWVuLT5kcmlTY3JuUHJpdi0+ZHJtX3ZlcnNpb24ubWlub3IgPj0gMykgewogICAgICAgIHVuc2lnbmVkIGludCBlOwogICAgICAgIEZMVVNIX0JBVENIKGltZXNhKTsKICAgICAgICBlID0gc2F2YWdlRW1pdEV2ZW50KGltZXNhLCBTQVZBR0VfV0FJVF8zRCk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdldHJpcy5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2F2YWdlL3NhdmFnZXRyaXMuYwppbmRleCBhMWM3YmIxLi4zOWI3NDI4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zYXZhZ2Uvc2F2YWdldHJpcy5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3NhdmFnZS9zYXZhZ2V0cmlzLmMKQEAgLTk1LDcgKzk1LDcgQEAKIH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBzYXZhZ2VfZHJhd190cmlhbmdsZSAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKK3N0YXRpYyB2b2lkIElOTElORSBzYXZhZ2VfZHJhd190cmlhbmdsZSAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKIAkJCQkJICAgICBzYXZhZ2VWZXJ0ZXhQdHIgdjAsCiAJCQkJCSAgICAgc2F2YWdlVmVydGV4UHRyIHYxLAogCQkJCQkgICAgIHNhdmFnZVZlcnRleFB0ciB2MikgewpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICBFTUlUX1ZFUlQgKGosIHZiLCB2ZXJ0c2l6ZSwgMCwgdjIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2lubGluZV9fIHNhdmFnZV9kcmF3X3F1YWQgKHNhdmFnZUNvbnRleHRQdHIgaW1lc2EsCitzdGF0aWMgdm9pZCBJTkxJTkUgc2F2YWdlX2RyYXdfcXVhZCAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKIAkJCQkJIHNhdmFnZVZlcnRleFB0ciB2MCwKIAkJCQkJIHNhdmFnZVZlcnRleFB0ciB2MSwKIAkJCQkJIHNhdmFnZVZlcnRleFB0ciB2MiwKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgRU1JVF9WRVJUIChqLCB2YiwgdmVydHNpemUsIDAsIHYzKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBzYXZhZ2VfZHJhd19wb2ludCAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKK3N0YXRpYyBJTkxJTkUgdm9pZCBzYXZhZ2VfZHJhd19wb2ludCAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKIAkJCQkJICBzYXZhZ2VWZXJ0ZXhQdHIgdG1wKSB7CiAgICBHTHVpbnQgdmVydHNpemUgPSBpbWVzYS0+SHdWZXJ0ZXhTaXplOwogICAgdWludDMyX3QgKnZiID0gc2F2YWdlQWxsb2NWdHhCdWYgKGltZXNhLCA2KnZlcnRzaXplKTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgRU1JVF9WRVJUIChqLCB2YiwgdmVydHNpemUsIDIsIHRtcCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2F2YWdlX2RyYXdfbGluZSAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKK3N0YXRpYyBJTkxJTkUgdm9pZCBzYXZhZ2VfZHJhd19saW5lIChzYXZhZ2VDb250ZXh0UHRyIGltZXNhLAogCQkJCQkgc2F2YWdlVmVydGV4UHRyIHYwLAogCQkJCQkgc2F2YWdlVmVydGV4UHRyIHYxICkgewogICAgR0x1aW50IHZlcnRzaXplID0gaW1lc2EtPkh3VmVydGV4U2l6ZTsKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgdG1wLmZbdmVydGV4X3NpemUtMV0gKj0gcmh3OwkJCQlcCiB9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZCBfX2lubGluZV9fIHNhdmFnZV9wdGV4X3RyaSAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKK3N0YXRpYyB2b2lkIElOTElORSBzYXZhZ2VfcHRleF90cmkgKHNhdmFnZUNvbnRleHRQdHIgaW1lc2EsCiAJCQkJCXNhdmFnZVZlcnRleFB0ciB2MCwKIAkJCQkJc2F2YWdlVmVydGV4UHRyIHYxLAogCQkJCQlzYXZhZ2VWZXJ0ZXhQdHIgdjIpIHsKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgUFRFWF9WRVJURVggKGosIHRtcCwgdmVydHNpemUsIDAsIHYyKTsgRU1JVF9WRVJUIChqLCB2YiwgdmVydHNpemUsIDAsICZ0bXApOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNhdmFnZV9wdGV4X2xpbmUgKHNhdmFnZUNvbnRleHRQdHIgaW1lc2EsCitzdGF0aWMgSU5MSU5FIHZvaWQgc2F2YWdlX3B0ZXhfbGluZSAoc2F2YWdlQ29udGV4dFB0ciBpbWVzYSwKIAkJCQkJIHNhdmFnZVZlcnRleFB0ciB2MCwKIAkJCQkJIHNhdmFnZVZlcnRleFB0ciB2MSApIHsKICAgIEdMdWludCB2ZXJ0c2l6ZSA9IGltZXNhLT5Id1ZlcnRleFNpemU7CkBAIC0yODEsNyArMjgxLDcgQEAKICAgIEVNSVRfVkVSVCAoaiwgdmIsIHZlcnRzaXplLCAyLCAmdG1wMSk7CiB9IAogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNhdmFnZV9wdGV4X3BvaW50IChzYXZhZ2VDb250ZXh0UHRyIGltZXNhLAorc3RhdGljIElOTElORSB2b2lkIHNhdmFnZV9wdGV4X3BvaW50IChzYXZhZ2VDb250ZXh0UHRyIGltZXNhLAogCQkJCQkgIHNhdmFnZVZlcnRleFB0ciB2MCkgewogICAgR0x1aW50IHZlcnRzaXplID0gaW1lc2EtPkh3VmVydGV4U2l6ZTsKICAgIHVpbnQzMl90ICp2YiA9IHNhdmFnZUFsbG9jVnR4QnVmIChpbWVzYSwgNip2ZXJ0c2l6ZSk7CkBAIC05MzQsNyArOTM0LDcgQEAKICNkZWZpbmUgU0FWQUdFX0VNSVRfU1QxICAweDAzMDAKIAogCi1zdGF0aWMgX19pbmxpbmVfXyBHTHVpbnQgc2F2YWdlQ2hvb3NlVmVydGV4Rm9ybWF0X3MzZCggR0xjb250ZXh0ICpjdHggKQorc3RhdGljIElOTElORSBHTHVpbnQgc2F2YWdlQ2hvb3NlVmVydGV4Rm9ybWF0X3MzZCggR0xjb250ZXh0ICpjdHggKQogewogICAgc2F2YWdlQ29udGV4dFB0ciBpbWVzYSA9IFNBVkFHRV9DT05URVhUKGN0eCk7CiAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwpAQCAtOTk3LDcgKzk5Nyw3IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gR0x1aW50IHNhdmFnZUNob29zZVZlcnRleEZvcm1hdF9zNCggR0xjb250ZXh0ICpjdHggKQorc3RhdGljIElOTElORSBHTHVpbnQgc2F2YWdlQ2hvb3NlVmVydGV4Rm9ybWF0X3M0KCBHTGNvbnRleHQgKmN0eCApCiB7CiAgICBzYXZhZ2VDb250ZXh0UHRyIGltZXNhID0gU0FWQUdFX0NPTlRFWFQoY3R4KTsKICAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzNjMyNl9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3NpczYzMjZfc3RhdGUuYwppbmRleCAwODQwMmZiLi5lNDdlNjYzIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzNjMyNl9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXM2MzI2X3N0YXRlLmMKQEAgLTQ5NywyNSArNDk3LDI3IEBACiAgICBfX0dMU2lTSGFyZHdhcmUgKmN1cnJlbnQgPSAmc21lc2EtPmN1cnJlbnQ7CiAKICAgIGlmKGdldGVudigiU0lTX0RSQVdfRlJPTlQiKSkKLSAgICAgIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gPSBHTF9GUk9OVF9MRUZUOworICAgICAgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9IEJVRkZFUl9GUk9OVF9MRUZUOwogCi0gICAvKgotICAgICogX0RyYXdEZXN0TWFzayBpcyBlYXNpZXIgdG8gY29wZSB3aXRoIHRoYW4gPG1vZGU+LgotICAgICovCisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA+IDEpIHsKKyAgICAgIEZBTExCQUNLKCBzbWVzYSwgU0lTX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CisgICAgICByZXR1cm47CisgICB9CisKICAgIGN1cnJlbnQtPmh3RHN0U2V0ICY9IH5NQVNLX0RzdEJ1ZmZlclBpdGNoOwotICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSApIHsKLSAgIGNhc2UgQlVGRkVSX0JJVF9GUk9OVF9MRUZUOgorCisgICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICkgeworICAgY2FzZSBCVUZGRVJfRlJPTlRfTEVGVDoKICAgICAgIGN1cnJlbnQtPmh3T2Zmc2V0RGVzdCA9IHNtZXNhLT5mcm9udC5vZmZzZXQ7CiAgICAgICBjdXJyZW50LT5od0RzdFNldCB8PSBzbWVzYS0+ZnJvbnQucGl0Y2g7CiAgICAgICBGQUxMQkFDSyggc21lc2EsIFNJU19GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIGJyZWFrOwotICAgY2FzZSBCVUZGRVJfQklUX0JBQ0tfTEVGVDoKKyAgIGNhc2UgQlVGRkVSX0JBQ0tfTEVGVDoKICAgICAgIGN1cnJlbnQtPmh3T2Zmc2V0RGVzdCA9IHNtZXNhLT5iYWNrLm9mZnNldDsKICAgICAgIGN1cnJlbnQtPmh3RHN0U2V0IHw9IHNtZXNhLT5iYWNrLnBpdGNoOwogICAgICAgRkFMTEJBQ0soIHNtZXNhLCBTSVNfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX0ZBTFNFICk7CiAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBHTF9OT05FIG9yIEdMX0ZST05UX0FORF9CQUNLIG9yIHN0ZXJlbyBsZWZ0JnJpZ2h0LCBldGMgKi8KICAgICAgIEZBTExCQUNLKCBzbWVzYSwgU0lTX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9UUlVFICk7CiAgICAgICByZXR1cm47CiAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX2NvbnRleHQuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfY29udGV4dC5oCmluZGV4IGI4MTgxMmQuLjg5NWU0YWIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfY29udGV4dC5oCkBAIC00MDAsOCArNDAwLDEwIEBACiAjZGVmaW5lIE1NSU9fUkVBRChyZWcpICoodm9sYXRpbGUgR0xpbnQgKikoc21lc2EtPklPQmFzZSArIChyZWcpKQogI2RlZmluZSBNTUlPX1JFQURmKHJlZykgKih2b2xhdGlsZSBHTGZsb2F0ICopKHNtZXNhLT5JT0Jhc2UgKyAocmVnKSkKIAotI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKICNkZWZpbmUgTU1JT19XTUIoKQlfX2FzbSBfX3ZvbGF0aWxlKCIiIDogOiA6ICJtZW1vcnkiKQorI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyNkZWZpbmUgTU1JT19XTUIoKQlfX2FzbSBfX3ZvbGF0aWxlKCJtZiIgOiA6IDogIm1lbW9yeSIpCiAjZWxzZQogI2Vycm9yIHBsYXRmb3JtIG5lZWRzIFdNQgogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3NjcmVlbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc19zY3JlZW4uYwppbmRleCBmNTUwMjdlLi41ODg4OTk2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3NjcmVlbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfc2NyZWVuLmMKQEAgLTY0LDEyICs2NCwxMCBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gY2FyZF9leHRlbnNpb25zW107CiAKLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICoKLXNpc0ZpbGxJbk1vZGVzKGludCBicHApCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK3Npc0ZpbGxJbk1vZGVzKF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwLCBpbnQgYnBwKQogewotICAgX19HTGNvbnRleHRNb2RlcyAqbW9kZXM7Ci0gICBfX0dMY29udGV4dE1vZGVzICptOwotICAgdW5zaWduZWQgbnVtX21vZGVzOworICAgX19EUkljb25maWcgKipjb25maWdzOwogICAgdW5zaWduZWQgZGVwdGhfYnVmZmVyX2ZhY3RvcjsKICAgIHVuc2lnbmVkIGJhY2tfYnVmZmVyX2ZhY3RvcjsKICAgIEdMZW51bSBmYl9mb3JtYXQ7CkBAIC05Miw5ICs5MCw2IEBACiAgICBkZXB0aF9idWZmZXJfZmFjdG9yID0gNDsKICAgIGJhY2tfYnVmZmVyX2ZhY3RvciA9IDI7CiAKLSAgIC8qIExhc3QgNCBpcyBmb3IgR0xYX1RSVUVfQ09MT1IgJiBHTFhfRElSRUNUX0NPTE9SLCB3aXRoL3dpdGhvdXQgYWNjdW0gKi8KLSAgIG51bV9tb2RlcyA9IGRlcHRoX2J1ZmZlcl9mYWN0b3IgKiBiYWNrX2J1ZmZlcl9mYWN0b3IgKiA0OwotCiAgICBpZiAoYnBwID09IDE2KSB7CiAgICAgICBmYl9mb3JtYXQgPSBHTF9SR0I7CiAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CkBAIC0xMDMsMjUgKzk4LDE1IEBACiAgICAgICBmYl90eXBlID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwogICAgfQogCi0gICBtb2RlcyA9ICgqZHJpX2ludGVyZmFjZS0+Y3JlYXRlQ29udGV4dE1vZGVzKShudW1fbW9kZXMsIHNpemVvZihfX0dMY29udGV4dE1vZGVzKSk7Ci0gICBtID0gbW9kZXM7Ci0gICBpZiAoIWRyaUZpbGxJbk1vZGVzKCZtLCBmYl9mb3JtYXQsIGZiX3R5cGUsIGRlcHRoX2JpdHNfYXJyYXksCi0JCSAgICAgICBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCi0JCSAgICAgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yLAotCQkgICAgICAgR0xYX1RSVUVfQ09MT1IpKSB7CisgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsIGRlcHRoX2JpdHNfYXJyYXksCisJCQkgICAgICBzdGVuY2lsX2JpdHNfYXJyYXksIGRlcHRoX2J1ZmZlcl9mYWN0b3IsCisJCQkgICAgICBiYWNrX2J1ZmZlcl9tb2RlcywgYmFja19idWZmZXJfZmFjdG9yKTsKKyAgIGlmIChjb25maWdzID09IE5VTEwpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KIAotICAgaWYgKCFkcmlGaWxsSW5Nb2RlcygmbSwgZmJfZm9ybWF0LCBmYl90eXBlLCBkZXB0aF9iaXRzX2FycmF5LAotCQkgICAgICAgc3RlbmNpbF9iaXRzX2FycmF5LCBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkgICAgICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJICAgICAgIEdMWF9ESVJFQ1RfQ09MT1IpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0KLSAgIHJldHVybiBtb2RlczsKKyAgIHJldHVybiAoY29uc3QgX19EUkljb25maWcgKiopIGNvbmZpZ3M7CiB9CiAKIApAQCAtMjg3LDIzICsyNzIsNTIgQEAKIH0KIAogCi0vKiBJbml0aWFsaXplIHRoZSBkcml2ZXIgc3BlY2lmaWMgc2NyZWVuIHByaXZhdGUgZGF0YS4KKy8qKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KKyAqIAorICogXHRvZG8gbWF5YmUgZm9sZCB0aGlzIGludG8gaW50ZWxJbml0RHJpdmVyCisgKgorICogXHJldHVybiB0aGUgX19HTGNvbnRleHRNb2RlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKICAqLwotc3RhdGljIEdMYm9vbGVhbgotc2lzSW5pdERyaXZlciggX19EUklzY3JlZW5Qcml2YXRlICpzUHJpdiApCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK3Npc0luaXRTY3JlZW4oX19EUklzY3JlZW5Qcml2YXRlICpwc3ApCiB7Ci0gICBzUHJpdi0+cHJpdmF0ZSA9ICh2b2lkICopIHNpc0NyZWF0ZVNjcmVlbiggc1ByaXYgKTsKKyAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0gezAsIDgsIDB9OworICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7NCwgMCwgMH07CisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsxLCAwLCAwfTsKKyAgIHN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJTaVMiOworICAgU0lTRFJJUHRyIGRyaV9wcml2ID0gKFNJU0RSSVB0cilwc3AtPnBEZXZQcml2OwogCi0gICBpZiAoICFzUHJpdi0+cHJpdmF0ZSApIHsKLSAgICAgIHNpc0Rlc3Ryb3lTY3JlZW4oIHNQcml2ICk7Ci0gICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBpZiAoIWRyaUNoZWNrRHJpRGR4RHJtVmVyc2lvbnMyKGRyaXZlcl9uYW1lLAorCQkJCSAgICZwc3AtPmRyaV92ZXJzaW9uLCAmZHJpX2V4cGVjdGVkLAorCQkJCSAgICZwc3AtPmRkeF92ZXJzaW9uLCAmZGR4X2V4cGVjdGVkLAorCQkJCSAgICZwc3AtPmRybV92ZXJzaW9uLCAmZHJtX2V4cGVjdGVkKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBDYWxsaW5nIGRyaUluaXRFeHRlbnNpb25zIGhlcmUsIHdpdGggYSBOVUxMIGNvbnRleHQgcG9pbnRlciwKKyAgICAqIGRvZXMgbm90IGFjdHVhbGx5IGVuYWJsZSB0aGUgZXh0ZW5zaW9ucy4gIEl0IGp1c3QgbWFrZXMgc3VyZQorICAgICogdGhhdCBhbGwgdGhlIGRpc3BhdGNoIG9mZnNldHMgZm9yIGFsbCB0aGUgZXh0ZW5zaW9ucyB0aGF0CisgICAgKiAqbWlnaHQqIGJlIGVuYWJsZXMgYXJlIGtub3duLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUKKyAgICAqIGRpc3BhdGNoIG9mZnNldHMgbmVlZCB0byBiZSBrbm93biB3aGVuIF9tZXNhX2NvbnRleHRfY3JlYXRlIGlzCisgICAgKiBjYWxsZWQsIGJ1dCB3ZSBjYW4ndCBlbmFibGUgdGhlIGV4dGVuc2lvbnMgdW50aWwgd2UgaGF2ZSBhCisgICAgKiBjb250ZXh0IHBvaW50ZXIuCisgICAgKgorICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KKyAgICAqLworICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKKworICAgcHNwLT5wcml2YXRlID0gc2lzQ3JlYXRlU2NyZWVuKHBzcCk7CisKKyAgIGlmICghcHNwLT5wcml2YXRlKSB7CisgICAgICBzaXNEZXN0cm95U2NyZWVuKHBzcCk7CisgICAgICByZXR1cm4gTlVMTDsKICAgIH0KIAotICAgcmV0dXJuIEdMX1RSVUU7CisgICByZXR1cm4gc2lzRmlsbEluTW9kZXMocHNwLCBkcmlfcHJpdi0+Ynl0ZXNQZXJQaXhlbCAqIDgpOwogfQogCi1zdGF0aWMgc3RydWN0IF9fRHJpdmVyQVBJUmVjIHNpc0FQSSA9IHsKLSAgIC5Jbml0RHJpdmVyICAgICAgPSBzaXNJbml0RHJpdmVyLAorY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGRyaURyaXZlckFQSSA9IHsKKyAgIC5Jbml0U2NyZWVuICAgICAgPSBzaXNJbml0U2NyZWVuLAogICAgLkRlc3Ryb3lTY3JlZW4gICA9IHNpc0Rlc3Ryb3lTY3JlZW4sCiAgICAuQ3JlYXRlQ29udGV4dCAgID0gc2lzQ3JlYXRlQ29udGV4dCwKICAgIC5EZXN0cm95Q29udGV4dCAgPSBzaXNEZXN0cm95Q29udGV4dCwKQEAgLTMxMyw2OSArMzI3LDkgQEAKICAgIC5NYWtlQ3VycmVudCAgICAgPSBzaXNNYWtlQ3VycmVudCwKICAgIC5VbmJpbmRDb250ZXh0ICAgPSBzaXNVbmJpbmRDb250ZXh0LAogICAgLkdldFN3YXBJbmZvICAgICA9IE5VTEwsCi0gICAuR2V0TVNDICAgICAgICAgID0gTlVMTCwKKyAgIC5HZXREcmF3YWJsZU1TQyAgPSBOVUxMLAogICAgLldhaXRGb3JNU0MgICAgICA9IE5VTEwsCiAgICAuV2FpdEZvclNCQyAgICAgID0gTlVMTCwKICAgIC5Td2FwQnVmZmVyc01TQyAgPSBOVUxMCiAKIH07Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBib290c3RyYXAgZnVuY3Rpb24gZm9yIHRoZSBkcml2ZXIuICBsaWJHTCBzdXBwbGllcyBhbGwgb2YgdGhlCi0gKiByZXF1aXNpdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSwgYW5kIHRoZSBkcml2ZXIgaW5pdGlhbGl6ZXMgaXRzZWxmLgotICogVGhpcyByb3V0aW5lIGFsc28gZmlsbHMgaW4gdGhlIGxpbmtlZCBsaXN0IHBvaW50ZWQgdG8gYnkgXGMgZHJpdmVyX21vZGVzCi0gKiB3aXRoIHRoZSBcYyBfX0dMY29udGV4dE1vZGVzIHRoYXQgdGhlIGRyaXZlciBjYW4gc3VwcG9ydCBmb3Igd2luZG93cyBvcgotICogcGJ1ZmZlcnMuCi0gKgotICogXHJldHVybiBBIHBvaW50ZXIgdG8gYSBcYyBfX0RSSXNjcmVlblByaXZhdGUgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiAKLSAqICAgICAgICAgZmFpbHVyZS4KLSAqLwotUFVCTElDCi12b2lkICogX19kcmlDcmVhdGVOZXdTY3JlZW5fMjAwNTA3MjcoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwKLQkJCSAgICAgX19EUklzY3JlZW4gKnBzYywKLQkJCSAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqbW9kZXMsCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqZGR4X3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqZHJpX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqZHJtX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKmZyYW1lX2J1ZmZlciwKLQkJCSAgICAgZHJtQWRkcmVzcyBwU0FSRUEsIGludCBmZCwKLQkJCSAgICAgaW50IGludGVybmFsX2FwaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSWludGVyZmFjZU1ldGhvZHMgKiBpbnRlcmZhY2UsCi0JCQkgICAgIF9fR0xjb250ZXh0TW9kZXMgKipkcml2ZXJfbW9kZXMgKQotCi17Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKLSAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0gezAsIDgsIDB9OwotICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7NCwgMCwgMH07Ci0gICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsxLCAwLCAwfTsKLSAgIHN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJTaVMiOwotICAgZHJpX2ludGVyZmFjZSA9IGludGVyZmFjZTsKLQotICAgaWYgKCFkcmlDaGVja0RyaURkeERybVZlcnNpb25zMihkcml2ZXJfbmFtZSwgZHJpX3ZlcnNpb24sICZkcmlfZXhwZWN0ZWQsCi0JCQkJICAgZGR4X3ZlcnNpb24sICZkZHhfZXhwZWN0ZWQsCi0JCQkJICAgZHJtX3ZlcnNpb24sICZkcm1fZXhwZWN0ZWQpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgcHNwID0gX19kcmlVdGlsQ3JlYXRlTmV3U2NyZWVuKGRweSwgc2NybiwgcHNjLCBOVUxMLAotCQkJCSAgZGR4X3ZlcnNpb24sIGRyaV92ZXJzaW9uLCBkcm1fdmVyc2lvbiwKLQkJCQkgIGZyYW1lX2J1ZmZlciwgcFNBUkVBLCBmZCwKLQkJCQkgIGludGVybmFsX2FwaV92ZXJzaW9uLCAmc2lzQVBJKTsKLSAgIGlmIChwc3AgIT0gTlVMTCkgewotICAgICAgU0lTRFJJUHRyIGRyaV9wcml2ID0gKFNJU0RSSVB0cilwc3AtPnBEZXZQcml2OwotICAgICAgKmRyaXZlcl9tb2RlcyA9IHNpc0ZpbGxJbk1vZGVzKGRyaV9wcml2LT5ieXRlc1BlclBpeGVsICogOCk7Ci0KLSAgICAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLCBkb2VzIG5vdCBhY3R1YWxseQotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwKLSAgICAgICAqIHRoZSBleHRlbnNpb25zIHRoYXQgKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCi0gICAgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcyBjYWxsZWQsIGJ1dCB3ZSBjYW4ndAotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYSBjb250ZXh0IHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KLSAgICAgICAqLwotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLSAgIH0KLQotICAgcmV0dXJuICh2b2lkICopcHNwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc19zcGFuLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3NwYW4uYwppbmRleCBkYzUwYmRhLi45ZTlhNTA5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3NwYW4uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3NwYW4uYwpAQCAtODQsNiArODQsOCBAQAogCiAvKiAxNiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJXAogICAgKihHTHVzaG9ydCAqKShidWYgKyAoX3gpKjIgKyAoX3kpKnNyYi0+cGl0Y2gpID0gZDsKIApAQCAtOTYsNiArOTgsOCBAQAogCiAvKiAzMiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1aW50CisKICNkZWZpbmUgV1JJVEVfREVQVEgoIF94LCBfeSwgZCApCVwKICAgICooR0x1aW50ICopKGJ1ZiArIChfeCkqNCArIChfeSkqc3JiLT5waXRjaCkgPSBkOwogCkBAIC0xMDgsNiArMTEyLDggQEAKIAogLyogOC8yNCBiaXQgaW50ZXJsZWF2ZWQgZGVwdGgvc3RlbmNpbCBmdW5jdGlvbnMKICAqLworI2RlZmluZSBWQUxVRV9UWVBFIEdMdWludAorCiAjZGVmaW5lIFdSSVRFX0RFUFRIKCBfeCwgX3ksIGQgKSB7CQkJCVwKICAgIEdMdWludCB0bXAgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKnNyYi0+cGl0Y2gpOwlcCiAgICB0bXAgJj0gMHhmZjAwMDAwMDsJCQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3N0YXRlLmMKaW5kZXggMzA1YzYzZi4uY2I2NzJjMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc19zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfc3RhdGUuYwpAQCAtNTQ2LDIzICs1NDYsMjQgQEAKICAgIF9fR0xTaVNIYXJkd2FyZSAqcHJldiA9ICZzbWVzYS0+cHJldjsKICAgIF9fR0xTaVNIYXJkd2FyZSAqY3VycmVudCA9ICZzbWVzYS0+Y3VycmVudDsKIAotICAgLyoKLSAgICAqIF9EcmF3RGVzdE1hc2sgaXMgZWFzaWVyIHRvIGNvcGUgd2l0aCB0aGFuIDxtb2RlPi4KLSAgICAqLworICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgIT0gMSkgeworICAgICAgRkFMTEJBQ0soIHNtZXNhLCBTSVNfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKwogICAgY3VycmVudC0+aHdEc3RTZXQgJj0gfk1BU0tfRHN0QnVmZmVyUGl0Y2g7Ci0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6CisgICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICkgeworICAgY2FzZSBCVUZGRVJfRlJPTlRfTEVGVDoKICAgICAgIEZBTExCQUNLKCBzbWVzYSwgU0lTX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9GQUxTRSApOwogICAgICAgY3VycmVudC0+aHdPZmZzZXREZXN0ID0gc21lc2EtPmZyb250Lm9mZnNldCA+PiAxOwogICAgICAgY3VycmVudC0+aHdEc3RTZXQgfD0gc21lc2EtPmZyb250LnBpdGNoID4+IDI7CiAgICAgICBicmVhazsKLSAgIGNhc2UgQlVGRkVSX0JJVF9CQUNLX0xFRlQ6CisgICBjYXNlIEJVRkZFUl9CQUNLX0xFRlQ6CiAgICAgICBGQUxMQkFDSyggc21lc2EsIFNJU19GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIGN1cnJlbnQtPmh3T2Zmc2V0RGVzdCA9IHNtZXNhLT5iYWNrLm9mZnNldCA+PiAxOwogICAgICAgY3VycmVudC0+aHdEc3RTZXQgfD0gc21lc2EtPmJhY2sucGl0Y2ggPj4gMjsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKLSAgICAgIC8qIEdMX05PTkUgb3IgR0xfRlJPTlRfQU5EX0JBQ0sgb3Igc3RlcmVvIGxlZnQmcmlnaHQsIGV0YyAqLwogICAgICAgRkFMTEJBQ0soIHNtZXNhLCBTSVNfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKICAgICAgIHJldHVybjsKICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdGV4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RleC5jCmluZGV4IDVlMTBjNjEuLmE5OGRmYTMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc190ZXguYwpAQCAtMTI5LDYgKzEyOSw4IEBACiBzdGF0aWMgdm9pZAogc2lzRnJlZVRleEltYWdlKCBzaXNDb250ZXh0UHRyIHNtZXNhLCBzaXNUZXhPYmpQdHIgdCwgaW50IGxldmVsICkKIHsKKyAgIGFzc2VydChsZXZlbCA+PSAwKTsKKyAgIGFzc2VydChsZXZlbCA8IFNJU19NQVhfVEVYVFVSRV9MRVZFTFMpOwogICAgaWYgKHQtPmltYWdlW2xldmVsXS5EYXRhID09IE5VTEwpCiAgICAgICByZXR1cm47CiAKQEAgLTIxMiw3ICsyMTQsNyBAQAogICAgICAgICovCiAgICAgICByZXR1cm47CiAgICB9Ci0gICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVfTEVWRUxTOyBpKyspIHsKKyAgIGZvciAoaSA9IDA7IGkgPCBTSVNfTUFYX1RFWFRVUkVfTEVWRUxTOyBpKyspIHsKICAgICAgIHNpc0ZyZWVUZXhJbWFnZSggc21lc2EsIHQsIGkgKTsKICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc190cmlzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RyaXMuYwppbmRleCBhMGUzOWRjLi5hZGJiYjhhIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RyaXMuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RyaXMuYwpAQCAtODQ4LDcgKzg0OCw3IEBACiAKICAgIFJFTkRFUklOUFVUU19DT1BZKCBpbmRleF9iaXRzZXQsIHRubC0+cmVuZGVyX2lucHV0c19iaXRzZXQgKTsKIAotICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gPT0gQlVGRkVSX0JJVF9GUk9OVF9MRUZUICYmIAorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0ZST05UX0xFRlQgJiYgCiAgICAgICBzbWVzYS0+ZHJpRHJhd2FibGUtPm51bUNsaXBSZWN0cyAhPSAwKQogICAgewogICAgICAgbXVsdGlwYXNzX2NsaXByZWN0KGN0eCwgMCk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RyaXMuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdHJpcy5oCmluZGV4IDQ5OWViNGQuLjdlZTI3NmMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdHJpcy5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdHJpcy5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICBzaXNGbHVzaFByaW1zKHNtZXNhKTsJCQkJXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIF9faW5saW5lIEdMdWludCAqc2lzQWxsb2NEbWFMb3coc2lzQ29udGV4dFB0ciBzbWVzYSwgaW50IGJ5dGVzKQorc3RhdGljIElOTElORSBHTHVpbnQgKnNpc0FsbG9jRG1hTG93KHNpc0NvbnRleHRQdHIgc21lc2EsIGludCBieXRlcykKIHsKICAgIEdMdWludCAqc3RhcnQ7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdHJpdG1wLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zaXMvc2lzX3RyaXRtcC5oCmluZGV4IGU2NzBhNWIuLmY3NWUxNzMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3Npcy9zaXNfdHJpdG1wLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc2lzL3Npc190cml0bXAuaApAQCAtMjM0LDcgKzIzNCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIF9faW5saW5lIHZvaWQgVEFHKHNpc192ZXJ0X2luaXQpKCB2b2lkICkKK3N0YXRpYyBJTkxJTkUgdm9pZCBUQUcoc2lzX3ZlcnRfaW5pdCkoIHZvaWQgKQogewogICAgc2lzX3RyaV9mdW5jX21taW9bU0lTX1NUQVRFU10gPSBUQUcoc2lzX2RyYXdfdHJpX21taW8pOwogICAgc2lzX2xpbmVfZnVuY19tbWlvW1NJU19TVEFURVNdID0gVEFHKHNpc19kcmF3X2xpbmVfbW1pbyk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zd3Jhc3QvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zd3Jhc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzYTRmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIHNyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9NYWtlZmlsZQorCitUT1AgPSAuLi8uLi8uLi8uLi8uLgoraW5jbHVkZSAkKFRPUCkvY29uZmlncy9jdXJyZW50CisKK0xJQk5BTUUgPSBzd3Jhc3RfZHJpLnNvCisKK0RSSVZFUl9TT1VSQ0VTID0gXAorCXN3cmFzdC5jIFwKKwlzd3Jhc3Rfc3Bhbi5jCisKK0NfU09VUkNFUyA9IFwKKwkkKFNXUkFTVF9DT01NT05fU09VUkNFUykgXAorCSQoRFJJVkVSX1NPVVJDRVMpCisKK0FTTV9TT1VSQ0VTID0KKworU1dSQVNUX0NPTU1PTl9TT1VSQ0VTID0gXAorCS4uLy4uL2NvbW1vbi9kcml2ZXJmdW5jcy5jIFwKKwkuLi9jb21tb24vdXRpbHMuYworCitpbmNsdWRlIC4uL01ha2VmaWxlLnRlbXBsYXRlCisKK3N5bWxpbmtzOgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvc3dyYXN0L3N3cmFzdC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc3dyYXN0L3N3cmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGQwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zd3Jhc3Qvc3dyYXN0LmMKQEAgLTAsMCArMSw3MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR2VvcmdlIFNhcG91bnR6aXMgPGdzYXA3QHlhaG9vLmdyPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogQlJJQU4gUEFVTCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBEUkkgc29mdHdhcmUgcmFzdGVyaXplcgorICoKKyAqIFRoaXMgaXMgdGhlIG1lc2Egc3dyYXN0IG1vZHVsZSBwYWNrYWdlZCBpbnRvIGEgRFJJIGRyaXZlciBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGZyb250LWJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIGxvYWRlci4gVGhlIGxvYWRlciBwcm92aWRlcyByZWFkL3dyaXRlCisgKiBjYWxsYmFja3MgZm9yIGFjY2VzcyB0byB0aGUgZnJvbnQtYnVmZmVyLiBUaGUgZHJpdmVyIHVzZXMgYSBzY3JhdGNoIHJvdyBmb3IKKyAqIGZyb250LWJ1ZmZlciByZW5kZXJpbmcgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIGxvYWRlci4KKyAqCisgKiBUaGUgYmFjay1idWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIGlzIHByaXZhdGUuCisgKi8KKworI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJleHRlbnNpb25zLmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAicmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgorI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKKyNpbmNsdWRlICJ0bmwvdG5sLmgiCisjaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgorI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCisjaW5jbHVkZSAidmJvL3Ziby5oIgorI2luY2x1ZGUgImRyaXZlcnMvY29tbW9uL2RyaXZlcmZ1bmNzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgInN3cmFzdF9wcml2LmgiCisKKworI2RlZmluZSBuZWVkX0dMX1ZFUlNJT05fMV8zCisjZGVmaW5lIG5lZWRfR0xfVkVSU0lPTl8xXzQKKyNkZWZpbmUgbmVlZF9HTF9WRVJTSU9OXzFfNQorI2RlZmluZSBuZWVkX0dMX1ZFUlNJT05fMl8wCisjZGVmaW5lIG5lZWRfR0xfVkVSU0lPTl8yXzEKKworLyogc3cgZXh0ZW5zaW9ucyBmb3IgaW1hZ2luZyAqLworI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9jb2xvcgorI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgbmVlZF9HTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgbmVlZF9HTF9FWFRfaGlzdG9ncmFtCisjZGVmaW5lIG5lZWRfR0xfU0dJX2NvbG9yX3RhYmxlCisKKy8qIHN3IGV4dGVuc2lvbnMgbm90IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdMIHZlcnNpb24gKi8KKyNkZWZpbmUgbmVlZF9HTF9BUkJfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgbmVlZF9HTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIG5lZWRfR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBuZWVkX0dMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdAorI2RlZmluZSBuZWVkX0dMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QKKyNkZWZpbmUgbmVlZF9HTF9FWFRfZnJhbWVidWZmZXJfYmxpdAorI2RlZmluZSBuZWVkX0dMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzCisjZGVmaW5lIG5lZWRfR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgbmVlZF9HTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZGVmaW5lIG5lZWRfR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2RlZmluZSBuZWVkX0dMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIG5lZWRfR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbQorCisjaW5jbHVkZSAiZXh0ZW5zaW9uX2hlbHBlci5oIgorCitjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBjYXJkX2V4dGVuc2lvbnNbXSA9Cit7CisgICAgeyAiR0xfVkVSU0lPTl8xXzMiLAkJCUdMX1ZFUlNJT05fMV8zX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX1ZFUlNJT05fMV80IiwJCQlHTF9WRVJTSU9OXzFfNF9mdW5jdGlvbnMgfSwKKyAgICB7ICJHTF9WRVJTSU9OXzFfNSIsCQkJR0xfVkVSU0lPTl8xXzVfZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfVkVSU0lPTl8yXzAiLAkJCUdMX1ZFUlNJT05fMl8wX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX1ZFUlNJT05fMl8xIiwJCQlHTF9WRVJTSU9OXzJfMV9mdW5jdGlvbnMgfSwKKworICAgIHsgIkdMX0VYVF9ibGVuZF9jb2xvciIsCQlHTF9FWFRfYmxlbmRfY29sb3JfZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfRVhUX2JsZW5kX21pbm1heCIsCQlHTF9FWFRfYmxlbmRfbWlubWF4X2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX0VYVF9jb252b2x1dGlvbiIsCQlHTF9FWFRfY29udm9sdXRpb25fZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfRVhUX2hpc3RvZ3JhbSIsCQlHTF9FWFRfaGlzdG9ncmFtX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX1NHSV9jb2xvcl90YWJsZSIsCQlHTF9TR0lfY29sb3JfdGFibGVfZnVuY3Rpb25zIH0sCisKKyAgICB7ICJHTF9BUkJfc2hhZGVyX29iamVjdHMiLAkJR0xfQVJCX3NoYWRlcl9vYmplY3RzX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbSIsCQlHTF9BUkJfdmVydGV4X3Byb2dyYW1fZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdCIsCUdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3RfZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfQVRJX2ZyYWdtZW50X3NoYWRlciIsCQlHTF9BVElfZnJhZ21lbnRfc2hhZGVyX2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdCIsCUdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdF9mdW5jdGlvbnMgfSwKKyAgICB7ICJHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IiwJR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdF9mdW5jdGlvbnMgfSwKKyAgICB7ICJHTF9FWFRfZnJhbWVidWZmZXJfYmxpdCIsCUdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0X2Z1bmN0aW9ucyB9LAorICAgIHsgIkdMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzIiwJR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnNfZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUiLAlHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZV9mdW5jdGlvbnMgfSwKKyAgICB7ICJHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzIiwJR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5c19mdW5jdGlvbnMgfSwKKyAgICB7ICJHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzIiwJCUdMX01FU0FfcmVzaXplX2J1ZmZlcnNfZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfTlZfdmVydGV4X3Byb2dyYW0iLAkJR0xfTlZfdmVydGV4X3Byb2dyYW1fZnVuY3Rpb25zIH0sCisgICAgeyAiR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbSIsCQlHTF9OVl9mcmFnbWVudF9wcm9ncmFtX2Z1bmN0aW9ucyB9LAorICAgIHsgTlVMTCwJCQkJTlVMTCB9Cit9OworCisKKy8qKgorICogU2NyZWVuIGFuZCBjb25maWctcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZAorc2V0dXBMb2FkZXJFeHRlbnNpb25zKF9fRFJJc2NyZWVuICpwc3AsCisJCSAgICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZXh0ZW5zaW9ucykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGV4dGVuc2lvbnNbaV07IGkrKykgeworCWlmIChzdHJjbXAoZXh0ZW5zaW9uc1tpXS0+bmFtZSwgX19EUklfU1dSQVNUX0xPQURFUikgPT0gMCkKKwkgICAgcHNwLT5zd3Jhc3RfbG9hZGVyID0gKF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uICopIGV4dGVuc2lvbnNbaV07CisgICAgfQorfQorCitzdGF0aWMgX19EUkljb25maWcgKioKK3N3cmFzdEZpbGxJbk1vZGVzKF9fRFJJc2NyZWVuICpwc3AsCisJCSAgdW5zaWduZWQgcGl4ZWxfYml0cywgdW5zaWduZWQgZGVwdGhfYml0cywKKwkJICB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyKQoreworICAgIF9fRFJJY29uZmlnICoqY29uZmlnczsKKyAgICB1bnNpZ25lZCBkZXB0aF9idWZmZXJfZmFjdG9yOworICAgIHVuc2lnbmVkIGJhY2tfYnVmZmVyX2ZhY3RvcjsKKyAgICBHTGVudW0gZmJfZm9ybWF0OworICAgIEdMZW51bSBmYl90eXBlOworCisgICAgLyogR0xYX1NXQVBfQ09QWV9PTUwgaXMgb25seSBzdXBwb3J0ZWQgYmVjYXVzZSB0aGUgSW50ZWwgZHJpdmVyIGRvZXNuJ3QKKyAgICAgKiBzdXBwb3J0IHBhZ2VmbGlwcGluZyBhdCBhbGwuCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IEdMZW51bSBiYWNrX2J1ZmZlcl9tb2Rlc1tdID0geworCUdMWF9OT05FLCBHTFhfU1dBUF9VTkRFRklORURfT01MCisgICAgfTsKKworICAgIHVfaW50OF90IGRlcHRoX2JpdHNfYXJyYXlbNF07CisgICAgdV9pbnQ4X3Qgc3RlbmNpbF9iaXRzX2FycmF5WzRdOworCisgICAgZGVwdGhfYml0c19hcnJheVswXSA9IDA7CisgICAgZGVwdGhfYml0c19hcnJheVsxXSA9IDA7CisgICAgZGVwdGhfYml0c19hcnJheVsyXSA9IGRlcHRoX2JpdHM7CisgICAgZGVwdGhfYml0c19hcnJheVszXSA9IGRlcHRoX2JpdHM7CisKKyAgICAvKiBKdXN0IGxpa2Ugd2l0aCB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlciwgYWx3YXlzIHByb3ZpZGUgc29tZSBtb2RlcworICAgICAqIHdpdGggYSBzdGVuY2lsIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGVuY2lsX2JpdHNfYXJyYXlbMF0gPSAwOworICAgIHN0ZW5jaWxfYml0c19hcnJheVsxXSA9IChzdGVuY2lsX2JpdHMgPT0gMCkgPyA4IDogc3RlbmNpbF9iaXRzOworICAgIHN0ZW5jaWxfYml0c19hcnJheVsyXSA9IDA7CisgICAgc3RlbmNpbF9iaXRzX2FycmF5WzNdID0gKHN0ZW5jaWxfYml0cyA9PSAwKSA/IDggOiBzdGVuY2lsX2JpdHM7CisKKyAgICBkZXB0aF9idWZmZXJfZmFjdG9yID0gNDsKKyAgICBiYWNrX2J1ZmZlcl9mYWN0b3IgPSAyOworCisgICAgaWYgKHBpeGVsX2JpdHMgPT0gOCkgeworCWZiX2Zvcm1hdCA9IEdMX1JHQjsKKwlmYl90eXBlID0gR0xfVU5TSUdORURfQllURV8yXzNfM19SRVY7CisgICAgfQorICAgIGVsc2UgaWYgKHBpeGVsX2JpdHMgPT0gMTYpIHsKKwlmYl9mb3JtYXQgPSBHTF9SR0I7CisJZmJfdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OworICAgIH0KKyAgICBlbHNlIHsKKwlmYl9mb3JtYXQgPSBHTF9CR1JBOworCWZiX3R5cGUgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY7CisgICAgfQorCisgICAgY29uZmlncyA9IGRyaUNyZWF0ZUNvbmZpZ3MoZmJfZm9ybWF0LCBmYl90eXBlLAorCQkJICAgICAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwKKwkJCSAgICAgICBkZXB0aF9idWZmZXJfZmFjdG9yLCBiYWNrX2J1ZmZlcl9tb2RlcywKKwkJCSAgICAgICBiYWNrX2J1ZmZlcl9mYWN0b3IpOworICAgIGlmIChjb25maWdzID09IE5VTEwpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlslczoldV0gRXJyb3IgY3JlYXRpbmcgRkJDb25maWchXG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18pOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjb25maWdzOworfQorCitzdGF0aWMgX19EUklzY3JlZW4gKgorZHJpQ3JlYXRlTmV3U2NyZWVuKGludCBzY3JuLCBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnMsCisJCSAgIGNvbnN0IF9fRFJJY29uZmlnICoqKmRyaXZlcl9jb25maWdzLCB2b2lkICpkYXRhKQoreworICAgIHN0YXRpYyBjb25zdCBfX0RSSWV4dGVuc2lvbiAqZW1wdHlFeHRlbnNpb25MaXN0W10gPSB7IE5VTEwgfTsKKyAgICBfX0RSSXNjcmVlbiAqcHNwOworICAgIF9fRFJJY29uZmlnICoqY29uZmlnczgsICoqY29uZmlnczE2LCAqKmNvbmZpZ3MzMjsKKworICAgICh2b2lkKSBkYXRhOworCisgICAgVFJBQ0U7CisKKyAgICBwc3AgPSBfbWVzYV9jYWxsb2Moc2l6ZW9mKCpwc3ApKTsKKyAgICBpZiAoIXBzcCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHNldHVwTG9hZGVyRXh0ZW5zaW9ucyhwc3AsIGV4dGVuc2lvbnMpOworCisgICAgcHNwLT5udW0gPSBzY3JuOworICAgIHBzcC0+ZXh0ZW5zaW9ucyA9IGVtcHR5RXh0ZW5zaW9uTGlzdDsKKworICAgIGNvbmZpZ3M4ICA9IHN3cmFzdEZpbGxJbk1vZGVzKHBzcCwgIDgsICA4LCAwLCAxKTsKKyAgICBjb25maWdzMTYgPSBzd3Jhc3RGaWxsSW5Nb2Rlcyhwc3AsIDE2LCAxNiwgMCwgMSk7CisgICAgY29uZmlnczMyID0gc3dyYXN0RmlsbEluTW9kZXMocHNwLCAzMiwgMjQsIDgsIDEpOworCisgICAgY29uZmlnczE2ID0gKF9fRFJJY29uZmlnICoqKWRyaUNvbmNhdENvbmZpZ3MoY29uZmlnczgsIGNvbmZpZ3MxNik7CisKKyAgICAqZHJpdmVyX2NvbmZpZ3MgPSBkcmlDb25jYXRDb25maWdzKGNvbmZpZ3MxNiwgY29uZmlnczMyKTsKKworICAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBjYXJkX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisKKyAgICByZXR1cm4gcHNwOworfQorCitzdGF0aWMgdm9pZCBkcmlEZXN0cm95U2NyZWVuKF9fRFJJc2NyZWVuICpwc3ApCit7CisgICAgVFJBQ0U7CisKKyAgICBpZiAocHNwKSB7CisJX21lc2FfZnJlZShwc3ApOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZHJpR2V0RXh0ZW5zaW9ucyhfX0RSSXNjcmVlbiAqcHNwKQoreworICAgIFRSQUNFOworCisgICAgcmV0dXJuIHBzcC0+ZXh0ZW5zaW9uczsKK30KKworCisvKioKKyAqIEZyYW1lYnVmZmVyIGFuZCByZW5kZXJidWZmZXItcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIEdMdWludAorY2hvb3NlX3BpeGVsX2Zvcm1hdChjb25zdCBHTHZpc3VhbCAqdikKK3sKKyAgICBpZiAodi0+cmdiTW9kZSkgeworCWludCBicHAgPSB2LT5yZ2JCaXRzOworCisJaWYgKGJwcCA9PSAzMgorCSAgICAmJiB2LT5yZWRNYXNrICAgPT0gMHhmZjAwMDAKKwkgICAgJiYgdi0+Z3JlZW5NYXNrID09IDB4MDBmZjAwCisJICAgICYmIHYtPmJsdWVNYXNrICA9PSAweDAwMDBmZikKKwkgICAgcmV0dXJuIFBGX0E4UjhHOEI4OworCWVsc2UgaWYgKGJwcCA9PSAxNgorCSAgICAmJiB2LT5yZWRNYXNrICAgPT0gMHhmODAwCisJICAgICYmIHYtPmdyZWVuTWFzayA9PSAweDA3ZTAKKwkgICAgJiYgdi0+Ymx1ZU1hc2sgID09IDB4MDAxZikKKwkgICAgcmV0dXJuIFBGX1I1RzZCNTsKKwllbHNlIGlmIChicHAgPT0gOAorCSAgICAmJiB2LT5yZWRNYXNrICAgPT0gMHgwNworCSAgICAmJiB2LT5ncmVlbk1hc2sgPT0gMHgzOAorCSAgICAmJiB2LT5ibHVlTWFzayAgPT0gMHhjMCkKKwkgICAgcmV0dXJuIFBGX1IzRzNCMjsKKyAgICB9CisgICAgZWxzZSB7CisJaWYgKHYtPmluZGV4Qml0cyA9PSA4KQorCSAgICByZXR1cm4gUEZfQ0k4OworICAgIH0KKworICAgIF9tZXNhX3Byb2JsZW0oIE5VTEwsICJ1bmV4cGVjdGVkIGZvcm1hdCBpbiAlcyIsIF9fRlVOQ1RJT05fXyApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc3dyYXN0X2RlbGV0ZV9yZW5kZXJidWZmZXIoc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpCit7CisgICAgVFJBQ0U7CisKKyAgICBfbWVzYV9mcmVlKHJiLT5EYXRhKTsKKyAgICBfbWVzYV9mcmVlKHJiKTsKK30KKworc3RhdGljIEdMYm9vbGVhbgorc3dyYXN0X2FsbG9jX2Zyb250X3N0b3JhZ2UoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiLAorCQkJICAgR0xlbnVtIGludGVybmFsRm9ybWF0LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpCit7CisgICAgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiA9IHN3cmFzdF9yZW5kZXJidWZmZXIocmIpOworICAgIGludCBicHA7CisgICAgdW5zaWduZWQgbWFzayA9IFBJVENIX0FMSUdOX0JJVFMgLSAxOworCisgICAgVFJBQ0U7CisKKyAgICByYi0+RGF0YSA9IE5VTEw7CisgICAgcmItPldpZHRoID0gd2lkdGg7CisgICAgcmItPkhlaWdodCA9IGhlaWdodDsKKworICAgIHN3aXRjaCAoaW50ZXJuYWxGb3JtYXQpIHsKKyAgICBjYXNlIEdMX1JHQjoKKwlicHAgPSByYi0+UmVkQml0cyArIHJiLT5HcmVlbkJpdHMgKyByYi0+Qmx1ZUJpdHM7CisJYnJlYWs7CisgICAgY2FzZSBHTF9SR0JBOgorCWJwcCA9IHJiLT5SZWRCaXRzICsgcmItPkdyZWVuQml0cyArIHJiLT5CbHVlQml0cyArIHJiLT5BbHBoYUJpdHM7CisJYnJlYWs7CisgICAgY2FzZSBHTF9DT0xPUl9JTkRFWDhfRVhUOgorCWJwcCA9IHJiLT5JbmRleEJpdHM7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlfbWVzYV9wcm9ibGVtKCBOVUxMLCAidW5leHBlY3RlZCBmb3JtYXQgaW4gJXMiLCBfX0ZVTkNUSU9OX18gKTsKKwlyZXR1cm4gR0xfRkFMU0U7CisgICAgfQorCisgICAgLyogYWx3YXlzIHBhZCB0byBQSVRDSF9BTElHTl9CSVRTICovCisgICAgeHJiLT5waXRjaCA9ICgod2lkdGggKiBicHAgKyBtYXNrKSAmIH5tYXNrKSAvIDg7CisKKyAgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIEdMYm9vbGVhbgorc3dyYXN0X2FsbG9jX2JhY2tfc3RvcmFnZShHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisJCQkgIEdMZW51bSBpbnRlcm5hbEZvcm1hdCwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KQoreworICAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBzd3Jhc3RfcmVuZGVyYnVmZmVyKHJiKTsKKworICAgIFRSQUNFOworCisgICAgX21lc2FfZnJlZShyYi0+RGF0YSk7CisKKyAgICBzd3Jhc3RfYWxsb2NfZnJvbnRfc3RvcmFnZShjdHgsIHJiLCBpbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICByYi0+RGF0YSA9IF9tZXNhX21hbGxvYyhoZWlnaHQgKiB4cmItPnBpdGNoKTsKKworICAgIHJldHVybiBHTF9UUlVFOworfQorCitzdGF0aWMgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKgorc3dyYXN0X25ld19yZW5kZXJidWZmZXIoY29uc3QgR0x2aXN1YWwgKnZpc3VhbCwgR0xib29sZWFuIGZyb250KQoreworICAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBfbWVzYV9jYWxsb2Moc2l6ZW9mICp4cmIpOworICAgIEdMdWludCBwaXhlbF9mb3JtYXQ7CisKKyAgICBUUkFDRTsKKworICAgIGlmICgheHJiKQorCXJldHVybiBOVUxMOworCisgICAgX21lc2FfaW5pdF9yZW5kZXJidWZmZXIoJnhyYi0+QmFzZSwgMCk7CisKKyAgICBwaXhlbF9mb3JtYXQgPSBjaG9vc2VfcGl4ZWxfZm9ybWF0KHZpc3VhbCk7CisKKyAgICB4cmItPkJhc2UuRGVsZXRlID0gc3dyYXN0X2RlbGV0ZV9yZW5kZXJidWZmZXI7CisgICAgaWYgKGZyb250KSB7CisJeHJiLT5CYXNlLkFsbG9jU3RvcmFnZSA9IHN3cmFzdF9hbGxvY19mcm9udF9zdG9yYWdlOworCXN3cmFzdF9zZXRfc3Bhbl9mdW5jc19mcm9udCh4cmIsIHBpeGVsX2Zvcm1hdCk7CisgICAgfQorICAgIGVsc2UgeworCXhyYi0+QmFzZS5BbGxvY1N0b3JhZ2UgPSBzd3Jhc3RfYWxsb2NfYmFja19zdG9yYWdlOworCXN3cmFzdF9zZXRfc3Bhbl9mdW5jc19iYWNrKHhyYiwgcGl4ZWxfZm9ybWF0KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBpeGVsX2Zvcm1hdCkgeworICAgIGNhc2UgUEZfQThSOEc4Qjg6CisJeHJiLT5CYXNlLkludGVybmFsRm9ybWF0ID0gR0xfUkdCQTsKKwl4cmItPkJhc2UuX0Jhc2VGb3JtYXQgPSBHTF9SR0JBOworCXhyYi0+QmFzZS5EYXRhVHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisJeHJiLT5CYXNlLlJlZEJpdHMgICA9IDggKiBzaXplb2YoR0x1Ynl0ZSk7CisJeHJiLT5CYXNlLkdyZWVuQml0cyA9IDggKiBzaXplb2YoR0x1Ynl0ZSk7CisJeHJiLT5CYXNlLkJsdWVCaXRzICA9IDggKiBzaXplb2YoR0x1Ynl0ZSk7CisJeHJiLT5CYXNlLkFscGhhQml0cyA9IDggKiBzaXplb2YoR0x1Ynl0ZSk7CisJYnJlYWs7CisgICAgY2FzZSBQRl9SNUc2QjU6CisJeHJiLT5CYXNlLkludGVybmFsRm9ybWF0ID0gR0xfUkdCOworCXhyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX1JHQjsKKwl4cmItPkJhc2UuRGF0YVR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworCXhyYi0+QmFzZS5SZWRCaXRzICAgPSA1ICogc2l6ZW9mKEdMdWJ5dGUpOworCXhyYi0+QmFzZS5HcmVlbkJpdHMgPSA2ICogc2l6ZW9mKEdMdWJ5dGUpOworCXhyYi0+QmFzZS5CbHVlQml0cyAgPSA1ICogc2l6ZW9mKEdMdWJ5dGUpOworCXhyYi0+QmFzZS5BbHBoYUJpdHMgPSAwOworCWJyZWFrOworICAgIGNhc2UgUEZfUjNHM0IyOgorCXhyYi0+QmFzZS5JbnRlcm5hbEZvcm1hdCA9IEdMX1JHQjsKKwl4cmItPkJhc2UuX0Jhc2VGb3JtYXQgPSBHTF9SR0I7CisJeHJiLT5CYXNlLkRhdGFUeXBlID0gR0xfVU5TSUdORURfQllURTsKKwl4cmItPkJhc2UuUmVkQml0cyAgID0gMyAqIHNpemVvZihHTHVieXRlKTsKKwl4cmItPkJhc2UuR3JlZW5CaXRzID0gMyAqIHNpemVvZihHTHVieXRlKTsKKwl4cmItPkJhc2UuQmx1ZUJpdHMgID0gMiAqIHNpemVvZihHTHVieXRlKTsKKwl4cmItPkJhc2UuQWxwaGFCaXRzID0gMDsKKwlicmVhazsKKyAgICBjYXNlIFBGX0NJODoKKwl4cmItPkJhc2UuSW50ZXJuYWxGb3JtYXQgPSBHTF9DT0xPUl9JTkRFWDhfRVhUOworCXhyYi0+QmFzZS5fQmFzZUZvcm1hdCA9IEdMX0NPTE9SX0lOREVYOworCXhyYi0+QmFzZS5EYXRhVHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisJeHJiLT5CYXNlLkluZGV4Qml0cyA9IDggKiBzaXplb2YoR0x1Ynl0ZSk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4geHJiOworfQorCitzdGF0aWMgX19EUklkcmF3YWJsZSAqCitkcmlDcmVhdGVOZXdEcmF3YWJsZShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkgICAgIGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsIHZvaWQgKmRhdGEpCit7CisgICAgX19EUklkcmF3YWJsZSAqYnVmOworICAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICpmcm9udHJiLCAqYmFja3JiOworCisgICAgVFJBQ0U7CisKKyAgICBidWYgPSBfbWVzYV9jYWxsb2Moc2l6ZW9mICpidWYpOworICAgIGlmICghYnVmKQorCXJldHVybiBOVUxMOworCisgICAgYnVmLT5sb2FkZXJQcml2YXRlID0gZGF0YTsKKworICAgIGJ1Zi0+ZHJpU2NyZWVuUHJpdiA9IHNjcmVlbjsKKworICAgIGJ1Zi0+cm93ID0gX21lc2FfbWFsbG9jKE1BWF9XSURUSCAqIDQpOworCisgICAgLyogYmFzaWMgZnJhbWVidWZmZXIgc2V0dXAgKi8KKyAgICBfbWVzYV9pbml0aWFsaXplX2ZyYW1lYnVmZmVyKCZidWYtPkJhc2UsICZjb25maWctPm1vZGVzKTsKKworICAgIC8qIGFkZCBmcm9udCByZW5kZXJidWZmZXIgKi8KKyAgICBmcm9udHJiID0gc3dyYXN0X25ld19yZW5kZXJidWZmZXIoJmNvbmZpZy0+bW9kZXMsIEdMX1RSVUUpOworICAgIF9tZXNhX2FkZF9yZW5kZXJidWZmZXIoJmJ1Zi0+QmFzZSwgQlVGRkVSX0ZST05UX0xFRlQsICZmcm9udHJiLT5CYXNlKTsKKworICAgIC8qIGFkZCBiYWNrIHJlbmRlcmJ1ZmZlciAqLworICAgIGlmIChjb25maWctPm1vZGVzLmRvdWJsZUJ1ZmZlck1vZGUpIHsKKwliYWNrcmIgPSBzd3Jhc3RfbmV3X3JlbmRlcmJ1ZmZlcigmY29uZmlnLT5tb2RlcywgR0xfRkFMU0UpOworCV9tZXNhX2FkZF9yZW5kZXJidWZmZXIoJmJ1Zi0+QmFzZSwgQlVGRkVSX0JBQ0tfTEVGVCwgJmJhY2tyYi0+QmFzZSk7CisgICAgfQorCisgICAgLyogYWRkIHNvZnR3YXJlIHJlbmRlcmJ1ZmZlcnMgKi8KKyAgICBfbWVzYV9hZGRfc29mdF9yZW5kZXJidWZmZXJzKCZidWYtPkJhc2UsCisJCQkJIEdMX0ZBTFNFLCAvKiBjb2xvciAqLworCQkJCSBjb25maWctPm1vZGVzLmhhdmVEZXB0aEJ1ZmZlciwKKwkJCQkgY29uZmlnLT5tb2Rlcy5oYXZlU3RlbmNpbEJ1ZmZlciwKKwkJCQkgY29uZmlnLT5tb2Rlcy5oYXZlQWNjdW1CdWZmZXIsCisJCQkJIEdMX0ZBTFNFLCAvKiBhbHBoYSAqLworCQkJCSBHTF9GQUxTRSAvKiBhdXggYnVmcyAqLyk7CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZAorZHJpRGVzdHJveURyYXdhYmxlKF9fRFJJZHJhd2FibGUgKmJ1ZikKK3sKKyAgICBUUkFDRTsKKworICAgIGlmIChidWYpIHsKKwlzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gJmJ1Zi0+QmFzZTsKKworCV9tZXNhX2ZyZWUoYnVmLT5yb3cpOworCisJZmItPkRlbGV0ZVBlbmRpbmcgPSBHTF9UUlVFOworCV9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZmYik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmlTd2FwQnVmZmVycyhfX0RSSWRyYXdhYmxlICpidWYpCit7CisgICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworCisgICAgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKmZyb250cmIgPQorCXN3cmFzdF9yZW5kZXJidWZmZXIoYnVmLT5CYXNlLkF0dGFjaG1lbnRbQlVGRkVSX0ZST05UX0xFRlRdLlJlbmRlcmJ1ZmZlcik7CisgICAgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKmJhY2tyYiA9CisJc3dyYXN0X3JlbmRlcmJ1ZmZlcihidWYtPkJhc2UuQXR0YWNobWVudFtCVUZGRVJfQkFDS19MRUZUXS5SZW5kZXJidWZmZXIpOworCisgICAgX19EUklzY3JlZW4gKnNjcmVlbiA9IGJ1Zi0+ZHJpU2NyZWVuUHJpdjsKKworICAgIFRSQUNFOworCisgICAgLyogY2hlY2sgZm9yIHNpZ25sZS1idWZmZXJlZCAqLworICAgIGlmIChiYWNrcmIgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAvKiBjaGVjayBpZiBzd2FwcGluZyBjdXJyZW50bHkgYm91bmQgYnVmZmVyICovCisgICAgaWYgKGN0eCAmJiBjdHgtPkRyYXdCdWZmZXIgPT0gJihidWYtPkJhc2UpKSB7CisJLyogZmx1c2ggcGVuZGluZyByZW5kZXJpbmcgKi8KKwlfbWVzYV9ub3RpZnlTd2FwQnVmZmVycyhjdHgpOworICAgIH0KKworICAgIHNjcmVlbi0+c3dyYXN0X2xvYWRlci0+cHV0SW1hZ2UoYnVmLCBfX0RSSV9TV1JBU1RfSU1BR0VfT1BfU1dBUCwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgZnJvbnRyYi0+QmFzZS5XaWR0aCwKKwkJCQkgICAgZnJvbnRyYi0+QmFzZS5IZWlnaHQsCisJCQkJICAgIGJhY2tyYi0+QmFzZS5EYXRhLAorCQkJCSAgICBidWYtPmxvYWRlclByaXZhdGUpOworfQorCisKKy8qKgorICogR2VuZXJhbCBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZAorZ2V0X3dpbmRvd19zaXplKCBHTGZyYW1lYnVmZmVyICpmYiwgR0xzaXplaSAqdywgR0xzaXplaSAqaCApCit7CisgICAgX19EUklkcmF3YWJsZSAqYnVmID0gc3dyYXN0X2RyYXdhYmxlKGZiKTsKKyAgICBfX0RSSXNjcmVlbiAqc2NyZWVuID0gYnVmLT5kcmlTY3JlZW5Qcml2OworICAgIGludCB4LCB5OworCisgICAgc2NyZWVuLT5zd3Jhc3RfbG9hZGVyLT5nZXREcmF3YWJsZUluZm8oYnVmLAorCQkJCQkgICAmeCwgJnksIHcsIGgsCisJCQkJCSAgIGJ1Zi0+bG9hZGVyUHJpdmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitzd3Jhc3RfY2hlY2tfYW5kX3VwZGF0ZV93aW5kb3dfc2l6ZSggR0xjb250ZXh0ICpjdHgsIEdMZnJhbWVidWZmZXIgKmZiICkKK3sKKyAgICBHTHNpemVpIHdpZHRoLCBoZWlnaHQ7CisKKyAgICBnZXRfd2luZG93X3NpemUoZmIsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKGZiLT5XaWR0aCAhPSB3aWR0aCB8fCBmYi0+SGVpZ2h0ICE9IGhlaWdodCkgeworCV9tZXNhX3Jlc2l6ZV9mcmFtZWJ1ZmZlcihjdHgsIGZiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBHTHVieXRlICoKK2dldF9zdHJpbmcoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSkKK3sKKyAgICAodm9pZCkgY3R4OworICAgIHN3aXRjaCAocG5hbWUpIHsKKwljYXNlIEdMX1ZFTkRPUjoKKwkgICAgcmV0dXJuIChjb25zdCBHTHVieXRlICopICJNZXNhIFByb2plY3QiOworCWNhc2UgR0xfUkVOREVSRVI6CisJICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSAqKSAiU29mdHdhcmUgUmFzdGVyaXplciI7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3N0YXRlKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IG5ld19zdGF0ZSApCit7CisgICAgLyogbm90IG11Y2ggdG8gZG8gaGVyZSAtIHBhc3MgaXQgb24gKi8KKyAgICBfc3dyYXN0X0ludmFsaWRhdGVTdGF0ZSggY3R4LCBuZXdfc3RhdGUgKTsKKyAgICBfc3dzZXR1cF9JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7CisgICAgX3Zib19JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7CisgICAgX3RubF9JbnZhbGlkYXRlU3RhdGUoIGN0eCwgbmV3X3N0YXRlICk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWV3cG9ydChHTGNvbnRleHQgKmN0eCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCit7CisgICAgR0xmcmFtZWJ1ZmZlciAqZHJhdyA9IGN0eC0+V2luU3lzRHJhd0J1ZmZlcjsKKyAgICBHTGZyYW1lYnVmZmVyICpyZWFkID0gY3R4LT5XaW5TeXNSZWFkQnVmZmVyOworCisgICAgc3dyYXN0X2NoZWNrX2FuZF91cGRhdGVfd2luZG93X3NpemUoY3R4LCBkcmF3KTsKKyAgICBzd3Jhc3RfY2hlY2tfYW5kX3VwZGF0ZV93aW5kb3dfc2l6ZShjdHgsIHJlYWQpOworfQorCitzdGF0aWMgdm9pZAorc3dyYXN0X2luaXRfZHJpdmVyX2Z1bmN0aW9ucyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmRyaXZlcikKK3sKKyAgICBkcml2ZXItPkdldFN0cmluZyA9IGdldF9zdHJpbmc7CisgICAgZHJpdmVyLT5VcGRhdGVTdGF0ZSA9IHVwZGF0ZV9zdGF0ZTsKKyAgICBkcml2ZXItPkdldEJ1ZmZlclNpemUgPSBOVUxMOworICAgIGRyaXZlci0+Vmlld3BvcnQgPSB2aWV3cG9ydDsKK30KKworCisvKioKKyAqIENvbnRleHQtcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIF9fRFJJY29udGV4dCAqCitkcmlDcmVhdGVOZXdDb250ZXh0KF9fRFJJc2NyZWVuICpzY3JlZW4sIGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCSAgICBfX0RSSWNvbnRleHQgKnNoYXJlZCwgdm9pZCAqZGF0YSkKK3sKKyAgICBfX0RSSWNvbnRleHQgKmN0eDsKKyAgICBHTGNvbnRleHQgKm1lc2FDdHg7CisgICAgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlIGZ1bmN0aW9uczsKKworICAgIFRSQUNFOworCisgICAgY3R4ID0gX21lc2FfY2FsbG9jKHNpemVvZiAqY3R4KTsKKyAgICBpZiAoIWN0eCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGN0eC0+bG9hZGVyUHJpdmF0ZSA9IGRhdGE7CisKKyAgICBjdHgtPmRyaVNjcmVlblByaXYgPSBzY3JlZW47CisKKyAgICAvKiBidWlsZCB0YWJsZSBvZiBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9ucyAqLworICAgIF9tZXNhX2luaXRfZHJpdmVyX2Z1bmN0aW9ucygmZnVuY3Rpb25zKTsKKyAgICBzd3Jhc3RfaW5pdF9kcml2ZXJfZnVuY3Rpb25zKCZmdW5jdGlvbnMpOworCisgICAgaWYgKCFfbWVzYV9pbml0aWFsaXplX2NvbnRleHQoJmN0eC0+QmFzZSwgJmNvbmZpZy0+bW9kZXMsCisJCQkJICBzaGFyZWQgPyAmc2hhcmVkLT5CYXNlIDogTlVMTCwKKwkJCQkgICZmdW5jdGlvbnMsICh2b2lkICopIGN0eCkpIHsKKyAgICAgIF9tZXNhX2ZyZWUoY3R4KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lc2FDdHggPSAmY3R4LT5CYXNlOworCisgICAgLyogZG8gYm91bmRzIGNoZWNraW5nIHRvIHByZXZlbnQgc2VnZmF1bHRzIGFuZCBzZXJ2ZXIgY3Jhc2hlcyEgKi8KKyAgICBtZXNhQ3R4LT5Db25zdC5DaGVja0FycmF5Qm91bmRzID0gR0xfVFJVRTsKKworICAgIC8qIGNyZWF0ZSBtb2R1bGUgY29udGV4dHMgKi8KKyAgICBfc3dyYXN0X0NyZWF0ZUNvbnRleHQoIG1lc2FDdHggKTsKKyAgICBfdmJvX0NyZWF0ZUNvbnRleHQoIG1lc2FDdHggKTsKKyAgICBfdG5sX0NyZWF0ZUNvbnRleHQoIG1lc2FDdHggKTsKKyAgICBfc3dzZXR1cF9DcmVhdGVDb250ZXh0KCBtZXNhQ3R4ICk7CisgICAgX3N3c2V0dXBfV2FrZXVwKCBtZXNhQ3R4ICk7CisKKyAgICAvKiB1c2UgZGVmYXVsdCBUQ0wgcGlwZWxpbmUgKi8KKyAgICB7CisgICAgICAgVE5MY29udGV4dCAqdG5sID0gVE5MX0NPTlRFWFQobWVzYUN0eCk7CisgICAgICAgdG5sLT5Ecml2ZXIuUnVuUGlwZWxpbmUgPSBfdG5sX3J1bl9waXBlbGluZTsKKyAgICB9CisKKyAgICBfbWVzYV9lbmFibGVfc3dfZXh0ZW5zaW9ucyhtZXNhQ3R4KTsKKyAgICBfbWVzYV9lbmFibGVfMV8zX2V4dGVuc2lvbnMobWVzYUN0eCk7CisgICAgX21lc2FfZW5hYmxlXzFfNF9leHRlbnNpb25zKG1lc2FDdHgpOworICAgIF9tZXNhX2VuYWJsZV8xXzVfZXh0ZW5zaW9ucyhtZXNhQ3R4KTsKKyAgICBfbWVzYV9lbmFibGVfMl8wX2V4dGVuc2lvbnMobWVzYUN0eCk7CisgICAgX21lc2FfZW5hYmxlXzJfMV9leHRlbnNpb25zKG1lc2FDdHgpOworCisgICAgcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHZvaWQKK2RyaURlc3Ryb3lDb250ZXh0KF9fRFJJY29udGV4dCAqY3R4KQoreworICAgIEdMY29udGV4dCAqbWVzYUN0eDsKKyAgICBUUkFDRTsKKworICAgIGlmIChjdHgpIHsKKwltZXNhQ3R4ID0gJmN0eC0+QmFzZTsKKwlfc3dzZXR1cF9EZXN0cm95Q29udGV4dCggbWVzYUN0eCApOworCV9zd3Jhc3RfRGVzdHJveUNvbnRleHQoIG1lc2FDdHggKTsKKwlfdG5sX0Rlc3Ryb3lDb250ZXh0KCBtZXNhQ3R4ICk7CisJX3Zib19EZXN0cm95Q29udGV4dCggbWVzYUN0eCApOworCV9tZXNhX2Rlc3Ryb3lfY29udGV4dCggbWVzYUN0eCApOworICAgIH0KK30KKworc3RhdGljIGludAorZHJpQ29weUNvbnRleHQoX19EUkljb250ZXh0ICpkc3QsIF9fRFJJY29udGV4dCAqc3JjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisgICAgVFJBQ0U7CisKKyAgICBfbWVzYV9jb3B5X2NvbnRleHQoJnNyYy0+QmFzZSwgJmRzdC0+QmFzZSwgbWFzayk7CisgICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBpbnQgZHJpQmluZENvbnRleHQoX19EUkljb250ZXh0ICpjdHgsCisJCQkgIF9fRFJJZHJhd2FibGUgKmRyYXcsCisJCQkgIF9fRFJJZHJhd2FibGUgKnJlYWQpCit7CisgICAgR0xjb250ZXh0ICptZXNhQ3R4OworICAgIEdMZnJhbWVidWZmZXIgKm1lc2FEcmF3OworICAgIEdMZnJhbWVidWZmZXIgKm1lc2FSZWFkOworICAgIFRSQUNFOworCisgICAgaWYgKGN0eCkgeworCWlmICghZHJhdyB8fCAhcmVhZCkKKwkgICAgcmV0dXJuIEdMX0ZBTFNFOworCisJbWVzYUN0eCA9ICZjdHgtPkJhc2U7CisJbWVzYURyYXcgPSAmZHJhdy0+QmFzZTsKKwltZXNhUmVhZCA9ICZyZWFkLT5CYXNlOworCisJLyogY2hlY2sgZm9yIHNhbWUgY29udGV4dCBhbmQgYnVmZmVyICovCisJaWYgKG1lc2FDdHggPT0gX21lc2FfZ2V0X2N1cnJlbnRfY29udGV4dCgpCisJICAgICYmIG1lc2FDdHgtPkRyYXdCdWZmZXIgPT0gbWVzYURyYXcKKwkgICAgJiYgbWVzYUN0eC0+UmVhZEJ1ZmZlciA9PSBtZXNhUmVhZCkgeworCSAgICByZXR1cm4gR0xfVFJVRTsKKwl9CisKKwlfZ2xhcGlfY2hlY2tfbXVsdGl0aHJlYWQoKTsKKworCXN3cmFzdF9jaGVja19hbmRfdXBkYXRlX3dpbmRvd19zaXplKG1lc2FDdHgsIG1lc2FEcmF3KTsKKwlpZiAocmVhZCAhPSBkcmF3KQorCSAgICBzd3Jhc3RfY2hlY2tfYW5kX3VwZGF0ZV93aW5kb3dfc2l6ZShtZXNhQ3R4LCBtZXNhUmVhZCk7CisKKwlfbWVzYV9tYWtlX2N1cnJlbnQoIG1lc2FDdHgsCisJCQkgICAgbWVzYURyYXcsCisJCQkgICAgbWVzYVJlYWQgKTsKKyAgICB9CisgICAgZWxzZSB7CisJLyogdW5iaW5kICovCisJX21lc2FfbWFrZV9jdXJyZW50KCBOVUxMLCBOVUxMLCBOVUxMICk7CisgICAgfQorCisgICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBpbnQgZHJpVW5iaW5kQ29udGV4dChfX0RSSWNvbnRleHQgKmN0eCkKK3sKKyAgICBUUkFDRTsKKyAgICAodm9pZCkgY3R4OworICAgIHJldHVybiBHTF9UUlVFOworfQorCisKK3N0YXRpYyBjb25zdCBfX0RSSWNvcmVFeHRlbnNpb24gZHJpQ29yZUV4dGVuc2lvbiA9IHsKKyAgICB7IF9fRFJJX0NPUkUsIF9fRFJJX0NPUkVfVkVSU0lPTiB9LAorICAgIE5VTEwsIC8qIGRyaUNyZWF0ZU5ld1NjcmVlbiAqLworICAgIGRyaURlc3Ryb3lTY3JlZW4sCisgICAgZHJpR2V0RXh0ZW5zaW9ucywKKyAgICBkcmlHZXRDb25maWdBdHRyaWIsCisgICAgZHJpSW5kZXhDb25maWdBdHRyaWIsCisgICAgTlVMTCwgLyogZHJpQ3JlYXRlTmV3RHJhd2FibGUgKi8KKyAgICBkcmlEZXN0cm95RHJhd2FibGUsCisgICAgZHJpU3dhcEJ1ZmZlcnMsCisgICAgZHJpQ3JlYXRlTmV3Q29udGV4dCwKKyAgICBkcmlDb3B5Q29udGV4dCwKKyAgICBkcmlEZXN0cm95Q29udGV4dCwKKyAgICBkcmlCaW5kQ29udGV4dCwKKyAgICBkcmlVbmJpbmRDb250ZXh0Cit9OworCitzdGF0aWMgY29uc3QgX19EUklzd3Jhc3RFeHRlbnNpb24gZHJpU1dSYXN0RXh0ZW5zaW9uID0geworICAgIHsgX19EUklfU1dSQVNULCBfX0RSSV9TV1JBU1RfVkVSU0lPTiB9LAorICAgIGRyaUNyZWF0ZU5ld1NjcmVlbiwKKyAgICBkcmlDcmVhdGVOZXdEcmF3YWJsZQorfTsKKworLyogVGhpcyBpcyB0aGUgdGFibGUgb2YgZXh0ZW5zaW9ucyB0aGF0IHRoZSBsb2FkZXIgd2lsbCBkbHN5bSgpIGZvci4gKi8KK1BVQkxJQyBjb25zdCBfX0RSSWV4dGVuc2lvbiAqX19kcmlEcml2ZXJFeHRlbnNpb25zW10gPSB7CisgICAgJmRyaUNvcmVFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpU1dSYXN0RXh0ZW5zaW9uLmJhc2UsCisgICAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9zd3Jhc3RfcHJpdi5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc3dyYXN0L3N3cmFzdF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxNDgyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9zd3Jhc3RfcHJpdi5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICogVmVyc2lvbjogIDcuMQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICAgIEdlb3JnZSBTYXBvdW50emlzIDxnc2FwN0B5YWhvby5ncj4KKyAqLworCisKKyNpZm5kZWYgX1NXUkFTVF9QUklWX0gKKyNkZWZpbmUgX1NXUkFTVF9QUklWX0gKKworI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8R0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgIm10eXBlcy5oIgorCisKKy8qKgorICogRGVidWdnaW5nCisgKi8KKyNkZWZpbmUgREVCVUdfQ09SRQkwCisjZGVmaW5lIERFQlVHX1NQQU4JMAorCisjaWYgREVCVUdfQ09SRQorI2RlZmluZSBUUkFDRSBfbWVzYV9wcmludGYoIi0tPiAlc1xuIiwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgVFJBQ0UKKyNlbmRpZgorCisjaWYgREVCVUdfU1BBTgorI2RlZmluZSBUUkFDRV9TUEFOIF9tZXNhX3ByaW50ZigiLS0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSBUUkFDRV9TUEFOCisjZW5kaWYKKworCisvKioKKyAqIERhdGEgdHlwZXMKKyAqLworc3RydWN0IF9fRFJJc2NyZWVuUmVjIHsKKyAgICBpbnQgbnVtOworCisgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zOworCisgICAgY29uc3QgX19EUklzd3Jhc3RMb2FkZXJFeHRlbnNpb24gKnN3cmFzdF9sb2FkZXI7Cit9OworCitzdHJ1Y3QgX19EUkljb250ZXh0UmVjIHsKKyAgICBHTGNvbnRleHQgQmFzZTsKKworICAgIHZvaWQgKmxvYWRlclByaXZhdGU7CisKKyAgICBfX0RSSXNjcmVlbiAqZHJpU2NyZWVuUHJpdjsKK307CisKK3N0cnVjdCBfX0RSSWRyYXdhYmxlUmVjIHsKKyAgICBHTGZyYW1lYnVmZmVyIEJhc2U7CisKKyAgICB2b2lkICpsb2FkZXJQcml2YXRlOworCisgICAgX19EUklzY3JlZW4gKmRyaVNjcmVlblByaXY7CisKKyAgICAvKiBzY3JhdGNoIHJvdyBmb3Igb3B0aW1pemVkIGZyb250LWJ1ZmZlciByZW5kZXJpbmcgKi8KKyAgICBjaGFyICpyb3c7Cit9OworCitzdHJ1Y3Qgc3dyYXN0X3JlbmRlcmJ1ZmZlciB7CisgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciBCYXNlOworCisgICAgLyogcmVuZGVyYnVmZmVyIHBpdGNoIChpbiBieXRlcykgKi8KKyAgICBHTHVpbnQgcGl0Y2g7Cit9OworCitzdGF0aWMgSU5MSU5FIF9fRFJJY29udGV4dCAqCitzd3Jhc3RfY29udGV4dChHTGNvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gKF9fRFJJY29udGV4dCAqKSBjdHg7Cit9CisKK3N0YXRpYyBJTkxJTkUgX19EUklkcmF3YWJsZSAqCitzd3Jhc3RfZHJhd2FibGUoR0xmcmFtZWJ1ZmZlciAqZmIpCit7CisgICAgcmV0dXJuIChfX0RSSWRyYXdhYmxlICopIGZiOworfQorCitzdGF0aWMgSU5MSU5FIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICoKK3N3cmFzdF9yZW5kZXJidWZmZXIoc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIpCit7CisgICAgcmV0dXJuIChzdHJ1Y3Qgc3dyYXN0X3JlbmRlcmJ1ZmZlciAqKSByYjsKK30KKworCisvKioKKyAqIFBpeGVsIGZvcm1hdHMgd2Ugc3VwcG9ydAorICovCisjZGVmaW5lIFBGX0NJOCAgICAgICAgMQkJLyoqPCBDb2xvciBJbmRleCBtb2RlICovCisjZGVmaW5lIFBGX0E4UjhHOEI4ICAgMgkJLyoqPCAzMi1iaXQgVHJ1ZUNvbG9yOiAgOC1BLCA4LVIsIDgtRywgOC1CIGJpdHMgKi8KKyNkZWZpbmUgUEZfUjVHNkI1ICAgICAzCQkvKio8IDE2LWJpdCBUcnVlQ29sb3I6ICA1LVIsIDYtRywgNS1CIGJpdHMgKi8KKyNkZWZpbmUgUEZfUjNHM0IyICAgICA0CQkvKio8ICA4LWJpdCBUcnVlQ29sb3I6ICAzLVIsIDMtRywgMi1CIGJpdHMgKi8KKworCisvKioKKyAqIFJlbmRlcmJ1ZmZlciBwaXRjaCBhbGlnbm1lbnQgKGluIGJpdHMpLgorICoKKyAqIFRoZSB4b3JnIGxvYWRlciByZXF1aXJlcyBwYWRkaW5nIGltYWdlcyB0byAzMiBiaXRzLiBIb3dldmVyLCB0aGlzIHNob3VsZAorICogYmVjb21lIGEgc2NyZWVuL2RyYXdhYmxlIHBhcmFtZXRlciBYWFgKKyAqLworI2RlZmluZSBQSVRDSF9BTElHTl9CSVRTIDMyCisKKworLyogc3dyYXN0X3NwYW4uYyAqLworCitleHRlcm4gdm9pZAorc3dyYXN0X3NldF9zcGFuX2Z1bmNzX2JhY2soc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiwKKwkJCSAgIEdMdWludCBwaXhlbF9mb3JtYXQpOworCitleHRlcm4gdm9pZAorc3dyYXN0X3NldF9zcGFuX2Z1bmNzX2Zyb250KHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIsCisJCQkgICAgR0x1aW50IHBpeGVsX2Zvcm1hdCk7CisKKyNlbmRpZiAvKiBfU1dSQVNUX1BSSVZfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9zd3Jhc3Rfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvc3dyYXN0L3N3cmFzdF9zcGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5OTAzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9zd3Jhc3Rfc3Bhbi5jCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICogVmVyc2lvbjogIDcuMQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICAgIEdlb3JnZSBTYXBvdW50emlzIDxnc2FwN0B5YWhvby5ncj4KKyAqLworCisjaW5jbHVkZSAic3dyYXN0X3ByaXYuaCIKKworI2RlZmluZSBZRkxJUChfeHJiLCBZKSAoKF94cmIpLT5CYXNlLkhlaWdodCAtIChZKSAtIDEpCisKKy8qCisgKiBEaXRoZXJpbmcgc3VwcG9ydCB0YWtlcyB0aGUgImNvbXB1dGF0aW9uIiBleHRyZW1lIGluIHRoZSAiY29tcHV0YXRpb24gdnMuCisgKiBzdG9yYWdlIiB0cmFkZS1vZmYuIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBzaW1wbGUgdG8gaW1wbGVtZW50IGFuZCBhbnkKKyAqIGNvbXB1dGF0aW9uYWwgb3ZlcmhlYWQgc2hvdWxkIGJlIGFjY2VwdGFibGUuIFhNZXNhIHVzZXMgdGFibGUgbG9va3VwcyBmb3IKKyAqIGFyb3VuZCA4S0Igb2Ygc3RvcmFnZSBvdmVyaGVhZCBwZXIgdmlzdWFsLgorICovCisjZGVmaW5lIERJVEhFUiAxCisKK3N0YXRpYyBjb25zdCBHTHVieXRlIGtlcm5lbFsxNl0gPSB7CisgICAgMCoxNiwgIDgqMTYsICAyKjE2LCAxMCoxNiwKKyAgIDEyKjE2LCAgNCoxNiwgMTQqMTYsICA2KjE2LAorICAgIDMqMTYsIDExKjE2LCAgMSoxNiwgIDkqMTYsCisgICAxNSoxNiwgIDcqMTYsIDEzKjE2LCAgNSoxNiwKK307CisKKyNpZiBESVRIRVIKKyNkZWZpbmUgRElUSEVSX0NPTVAoWCwgWSkga2VybmVsWygoWCkgJiAweDMpIHwgKCgoWSkgJiAweDMpIDw8IDIpXQorCisjZGVmaW5lIERJVEhFUl9DTEFNUChYKSAoKChYKSA8IENIQU5fTUFYKSA/IChYKSA6IENIQU5fTUFYKQorI2Vsc2UKKyNkZWZpbmUgRElUSEVSX0NPTVAoWCwgWSkgMAorCisjZGVmaW5lIERJVEhFUl9DTEFNUChYKSAoWCkKKyNlbmRpZgorCisKKy8qCisgKiBQaXhlbCBtYWNyb3Mgc2hhcmVkIGFjcm9zcyBmcm9udC9iYWNrIGJ1ZmZlciBzcGFuIGZ1bmN0aW9ucy4KKyAqLworCisvKiAzMi1iaXQgQkdSQSAqLworI2RlZmluZSBTVE9SRV9QSVhFTF9BOFI4RzhCOChEU1QsIFgsIFksIFZBTFVFKSBcCisgICBEU1RbM10gPSBWQUxVRVtBQ09NUF07IFwKKyAgIERTVFsyXSA9IFZBTFVFW1JDT01QXTsgXAorICAgRFNUWzFdID0gVkFMVUVbR0NPTVBdOyBcCisgICBEU1RbMF0gPSBWQUxVRVtCQ09NUF0KKyNkZWZpbmUgU1RPUkVfUElYRUxfUkdCX0E4UjhHOEI4KERTVCwgWCwgWSwgVkFMVUUpIFwKKyAgIERTVFszXSA9IDB4ZmY7IFwKKyAgIERTVFsyXSA9IFZBTFVFW1JDT01QXTsgXAorICAgRFNUWzFdID0gVkFMVUVbR0NPTVBdOyBcCisgICBEU1RbMF0gPSBWQUxVRVtCQ09NUF0KKyNkZWZpbmUgRkVUQ0hfUElYRUxfQThSOEc4QjgoRFNULCBTUkMpIFwKKyAgIERTVFtBQ09NUF0gPSBTUkNbM107IFwKKyAgIERTVFtSQ09NUF0gPSBTUkNbMl07IFwKKyAgIERTVFtHQ09NUF0gPSBTUkNbMV07IFwKKyAgIERTVFtCQ09NUF0gPSBTUkNbMF0KKworCisvKiAxNi1iaXQgQkdSICovCisjZGVmaW5lIFNUT1JFX1BJWEVMX1I1RzZCNShEU1QsIFgsIFksIFZBTFVFKSBcCisgICBkbyB7IFwKKyAgIGludCBkID0gRElUSEVSX0NPTVAoWCwgWSkgPj4gNjsgXAorICAgR0x1c2hvcnQgKnAgPSAoR0x1c2hvcnQgKilEU1Q7IFwKKyAgICpwID0gKCAoKERJVEhFUl9DTEFNUCgoVkFMVUVbUkNPTVBdKSArIGQpICYgMHhmOCkgPDwgOCkgfCBcCisJICAoKERJVEhFUl9DTEFNUCgoVkFMVUVbR0NPTVBdKSArIGQpICYgMHhmYykgPDwgMykgfCBcCisJICAoKERJVEhFUl9DTEFNUCgoVkFMVUVbQkNPTVBdKSArIGQpICYgMHhmOCkgPj4gMykgKTsgXAorICAgfSB3aGlsZSgwKQorI2RlZmluZSBGRVRDSF9QSVhFTF9SNUc2QjUoRFNULCBTUkMpIFwKKyAgIGRvIHsgXAorICAgR0x1c2hvcnQgcCA9ICooR0x1c2hvcnQgKilTUkM7IFwKKyAgIERTVFtBQ09NUF0gPSAweGZmOyBcCisgICBEU1RbUkNPTVBdID0gKChwID4+IDgpICYgMHhmOCkgKiAyNTUgLyAweGY4OyBcCisgICBEU1RbR0NPTVBdID0gKChwID4+IDMpICYgMHhmYykgKiAyNTUgLyAweGZjOyBcCisgICBEU1RbQkNPTVBdID0gKChwIDw8IDMpICYgMHhmOCkgKiAyNTUgLyAweGY4OyBcCisgICB9IHdoaWxlKDApCisKKworLyogOC1iaXQgQkdSICovCisjZGVmaW5lIFNUT1JFX1BJWEVMX1IzRzNCMihEU1QsIFgsIFksIFZBTFVFKSBcCisgICBkbyB7IFwKKyAgIGludCBkID0gRElUSEVSX0NPTVAoWCwgWSkgPj4gMzsgXAorICAgR0x1Ynl0ZSAqcCA9IChHTHVieXRlICopRFNUOyBcCisgICAqcCA9ICggKChESVRIRVJfQ0xBTVAoKFZBTFVFW1JDT01QXSkgKyBkKSAmIDB4ZTApID4+IDUpIHwgXAorCSAgKChESVRIRVJfQ0xBTVAoKFZBTFVFW0dDT01QXSkgKyBkKSAmIDB4ZTApID4+IDIpIHwgXAorCSAgKChESVRIRVJfQ0xBTVAoKFZBTFVFW0JDT01QXSkgKyBkKSAmIDB4YzApID4+IDApICk7IFwKKyAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgRkVUQ0hfUElYRUxfUjNHM0IyKERTVCwgU1JDKSBcCisgICBkbyB7IFwKKyAgIEdMdWJ5dGUgcCA9ICooR0x1Ynl0ZSAqKVNSQzsgXAorICAgRFNUW0FDT01QXSA9IDB4ZmY7IFwKKyAgIERTVFtSQ09NUF0gPSAoKHAgPDwgNSkgJiAweGUwKSAqIDI1NSAvIDB4ZTA7IFwKKyAgIERTVFtHQ09NUF0gPSAoKHAgPDwgMikgJiAweGUwKSAqIDI1NSAvIDB4ZTA7IFwKKyAgIERTVFtCQ09NUF0gPSAoKHAgPDwgMCkgJiAweGMwKSAqIDI1NSAvIDB4YzA7IFwKKyAgIH0gd2hpbGUoMCkKKworCisvKgorICogR2VuZXJhdGUgY29kZSBmb3IgYmFjay1idWZmZXIgc3BhbiBmdW5jdGlvbnMuCisgKi8KKworLyogMzItYml0IEJHUkEgKi8KKyNkZWZpbmUgTkFNRShGVU5DKSBGVU5DIyNfQThSOEc4QjgKKyNkZWZpbmUgUkJfVFlQRSBHTHVieXRlCisjZGVmaW5lIFNQQU5fVkFSUyBcCisgICBzdHJ1Y3Qgc3dyYXN0X3JlbmRlcmJ1ZmZlciAqeHJiID0gc3dyYXN0X3JlbmRlcmJ1ZmZlcihyYik7CisjZGVmaW5lIElOSVRfUElYRUxfUFRSKFAsIFgsIFkpIFwKKyAgIEdMdWJ5dGUgKlAgPSAoR0x1Ynl0ZSAqKXhyYi0+QmFzZS5EYXRhICsgWUZMSVAoeHJiLCBZKSAqIHhyYi0+cGl0Y2ggKyAoWCkgKiA0OworI2RlZmluZSBJTkNfUElYRUxfUFRSKFApIFAgKz0gNAorI2RlZmluZSBTVE9SRV9QSVhFTChEU1QsIFgsIFksIFZBTFVFKSBcCisgICBTVE9SRV9QSVhFTF9BOFI4RzhCOChEU1QsIFgsIFksIFZBTFVFKQorI2RlZmluZSBTVE9SRV9QSVhFTF9SR0IoRFNULCBYLCBZLCBWQUxVRSkgXAorICAgU1RPUkVfUElYRUxfUkdCX0E4UjhHOEI4KERTVCwgWCwgWSwgVkFMVUUpCisjZGVmaW5lIEZFVENIX1BJWEVMKERTVCwgU1JDKSBcCisgICBGRVRDSF9QSVhFTF9BOFI4RzhCOChEU1QsIFNSQykKKworI2luY2x1ZGUgInN3cmFzdC9zX3NwYW50ZW1wLmgiCisKKworLyogMTYtYml0IEJHUiAqLworI2RlZmluZSBOQU1FKEZVTkMpIEZVTkMjI19SNUc2QjUKKyNkZWZpbmUgUkJfVFlQRSBHTHVieXRlCisjZGVmaW5lIFNQQU5fVkFSUyBcCisgICBzdHJ1Y3Qgc3dyYXN0X3JlbmRlcmJ1ZmZlciAqeHJiID0gc3dyYXN0X3JlbmRlcmJ1ZmZlcihyYik7CisjZGVmaW5lIElOSVRfUElYRUxfUFRSKFAsIFgsIFkpIFwKKyAgIEdMdWJ5dGUgKlAgPSAoR0x1Ynl0ZSAqKXhyYi0+QmFzZS5EYXRhICsgWUZMSVAoeHJiLCBZKSAqIHhyYi0+cGl0Y2ggKyAoWCkgKiAyOworI2RlZmluZSBJTkNfUElYRUxfUFRSKFApIFAgKz0gMgorI2RlZmluZSBTVE9SRV9QSVhFTChEU1QsIFgsIFksIFZBTFVFKSBcCisgICBTVE9SRV9QSVhFTF9SNUc2QjUoRFNULCBYLCBZLCBWQUxVRSkKKyNkZWZpbmUgRkVUQ0hfUElYRUwoRFNULCBTUkMpIFwKKyAgIEZFVENIX1BJWEVMX1I1RzZCNShEU1QsIFNSQykKKworI2luY2x1ZGUgInN3cmFzdC9zX3NwYW50ZW1wLmgiCisKKworLyogOC1iaXQgQkdSICovCisjZGVmaW5lIE5BTUUoRlVOQykgRlVOQyMjX1IzRzNCMgorI2RlZmluZSBSQl9UWVBFIEdMdWJ5dGUKKyNkZWZpbmUgU1BBTl9WQVJTIFwKKyAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBzd3Jhc3RfcmVuZGVyYnVmZmVyKHJiKTsKKyNkZWZpbmUgSU5JVF9QSVhFTF9QVFIoUCwgWCwgWSkgXAorICAgR0x1Ynl0ZSAqUCA9IChHTHVieXRlICopeHJiLT5CYXNlLkRhdGEgKyBZRkxJUCh4cmIsIFkpICogeHJiLT5waXRjaCArIChYKSAqIDE7CisjZGVmaW5lIElOQ19QSVhFTF9QVFIoUCkgUCArPSAxCisjZGVmaW5lIFNUT1JFX1BJWEVMKERTVCwgWCwgWSwgVkFMVUUpIFwKKyAgIFNUT1JFX1BJWEVMX1IzRzNCMihEU1QsIFgsIFksIFZBTFVFKQorI2RlZmluZSBGRVRDSF9QSVhFTChEU1QsIFNSQykgXAorICAgRkVUQ0hfUElYRUxfUjNHM0IyKERTVCwgU1JDKQorCisjaW5jbHVkZSAic3dyYXN0L3Nfc3BhbnRlbXAuaCIKKworCisvKiA4LWJpdCBjb2xvciBpbmRleCAqLworI2RlZmluZSBOQU1FKEZVTkMpIEZVTkMjI19DSTgKKyNkZWZpbmUgQ0lfTU9ERQorI2RlZmluZSBSQl9UWVBFIEdMdWJ5dGUKKyNkZWZpbmUgU1BBTl9WQVJTIFwKKyAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBzd3Jhc3RfcmVuZGVyYnVmZmVyKHJiKTsKKyNkZWZpbmUgSU5JVF9QSVhFTF9QVFIoUCwgWCwgWSkgXAorICAgR0x1Ynl0ZSAqUCA9IChHTHVieXRlICopeHJiLT5CYXNlLkRhdGEgKyBZRkxJUCh4cmIsIFkpICogeHJiLT5waXRjaCArIChYKTsKKyNkZWZpbmUgSU5DX1BJWEVMX1BUUihQKSBQICs9IDEKKyNkZWZpbmUgU1RPUkVfUElYRUwoRFNULCBYLCBZLCBWQUxVRSkgXAorICAgKkRTVCA9IFZBTFVFWzBdCisjZGVmaW5lIEZFVENIX1BJWEVMKERTVCwgU1JDKSBcCisgICBEU1QgPSBTUkNbMF0KKworI2luY2x1ZGUgInN3cmFzdC9zX3NwYW50ZW1wLmgiCisKKworLyoKKyAqIEdlbmVyYXRlIGNvZGUgZm9yIGZyb250LWJ1ZmZlciBzcGFuIGZ1bmN0aW9ucy4KKyAqLworCisvKiAzMi1iaXQgQkdSQSAqLworI2RlZmluZSBOQU1FKEZVTkMpIEZVTkMjI19BOFI4RzhCOF9mcm9udAorI2RlZmluZSBSQl9UWVBFIEdMdWJ5dGUKKyNkZWZpbmUgU1BBTl9WQVJTIFwKKyAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBzd3Jhc3RfcmVuZGVyYnVmZmVyKHJiKTsKKyNkZWZpbmUgSU5JVF9QSVhFTF9QVFIoUCwgWCwgWSkgXAorICAgR0x1Ynl0ZSAqUCA9IChHTHVieXRlICopcm93OworI2RlZmluZSBJTkNfUElYRUxfUFRSKFApIFAgKz0gNAorI2RlZmluZSBTVE9SRV9QSVhFTChEU1QsIFgsIFksIFZBTFVFKSBcCisgICBTVE9SRV9QSVhFTF9BOFI4RzhCOChEU1QsIFgsIFksIFZBTFVFKQorI2RlZmluZSBTVE9SRV9QSVhFTF9SR0IoRFNULCBYLCBZLCBWQUxVRSkgXAorICAgU1RPUkVfUElYRUxfUkdCX0E4UjhHOEI4KERTVCwgWCwgWSwgVkFMVUUpCisjZGVmaW5lIEZFVENIX1BJWEVMKERTVCwgU1JDKSBcCisgICBGRVRDSF9QSVhFTF9BOFI4RzhCOChEU1QsIFNSQykKKworI2luY2x1ZGUgInN3cmFzdF9zcGFudGVtcC5oIgorCisKKy8qIDE2LWJpdCBCR1IgKi8KKyNkZWZpbmUgTkFNRShGVU5DKSBGVU5DIyNfUjVHNkI1X2Zyb250CisjZGVmaW5lIFJCX1RZUEUgR0x1Ynl0ZQorI2RlZmluZSBTUEFOX1ZBUlMgXAorICAgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiA9IHN3cmFzdF9yZW5kZXJidWZmZXIocmIpOworI2RlZmluZSBJTklUX1BJWEVMX1BUUihQLCBYLCBZKSBcCisgICBHTHVieXRlICpQID0gKEdMdWJ5dGUgKilyb3c7CisjZGVmaW5lIElOQ19QSVhFTF9QVFIoUCkgUCArPSAyCisjZGVmaW5lIFNUT1JFX1BJWEVMKERTVCwgWCwgWSwgVkFMVUUpIFwKKyAgIFNUT1JFX1BJWEVMX1I1RzZCNShEU1QsIFgsIFksIFZBTFVFKQorI2RlZmluZSBGRVRDSF9QSVhFTChEU1QsIFNSQykgXAorICAgRkVUQ0hfUElYRUxfUjVHNkI1KERTVCwgU1JDKQorCisjaW5jbHVkZSAic3dyYXN0X3NwYW50ZW1wLmgiCisKKworLyogOC1iaXQgQkdSICovCisjZGVmaW5lIE5BTUUoRlVOQykgRlVOQyMjX1IzRzNCMl9mcm9udAorI2RlZmluZSBSQl9UWVBFIEdMdWJ5dGUKKyNkZWZpbmUgU1BBTl9WQVJTIFwKKyAgIHN0cnVjdCBzd3Jhc3RfcmVuZGVyYnVmZmVyICp4cmIgPSBzd3Jhc3RfcmVuZGVyYnVmZmVyKHJiKTsKKyNkZWZpbmUgSU5JVF9QSVhFTF9QVFIoUCwgWCwgWSkgXAorICAgR0x1Ynl0ZSAqUCA9IChHTHVieXRlICopcm93OworI2RlZmluZSBJTkNfUElYRUxfUFRSKFApIFAgKz0gMQorI2RlZmluZSBTVE9SRV9QSVhFTChEU1QsIFgsIFksIFZBTFVFKSBcCisgICBTVE9SRV9QSVhFTF9SM0czQjIoRFNULCBYLCBZLCBWQUxVRSkKKyNkZWZpbmUgRkVUQ0hfUElYRUwoRFNULCBTUkMpIFwKKyAgIEZFVENIX1BJWEVMX1IzRzNCMihEU1QsIFNSQykKKworI2luY2x1ZGUgInN3cmFzdF9zcGFudGVtcC5oIgorCisKKy8qIDgtYml0IGNvbG9yIGluZGV4ICovCisjZGVmaW5lIE5BTUUoRlVOQykgRlVOQyMjX0NJOF9mcm9udAorI2RlZmluZSBDSV9NT0RFCisjZGVmaW5lIFJCX1RZUEUgR0x1Ynl0ZQorI2RlZmluZSBTUEFOX1ZBUlMgXAorICAgc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiA9IHN3cmFzdF9yZW5kZXJidWZmZXIocmIpOworI2RlZmluZSBJTklUX1BJWEVMX1BUUihQLCBYLCBZKSBcCisgICBHTHVieXRlICpQID0gKEdMdWJ5dGUgKilyb3c7CisjZGVmaW5lIElOQ19QSVhFTF9QVFIoUCkgUCArPSAxCisjZGVmaW5lIFNUT1JFX1BJWEVMKERTVCwgWCwgWSwgVkFMVUUpIFwKKyAgICpEU1QgPSBWQUxVRVswXQorI2RlZmluZSBGRVRDSF9QSVhFTChEU1QsIFNSQykgXAorICAgRFNUID0gU1JDWzBdCisKKyNpbmNsdWRlICJzd3Jhc3Rfc3BhbnRlbXAuaCIKKworCisvKgorICogQmFjay1idWZmZXJzIGFyZSBtYWxsb2NlZCBtZW1vcnkgYW5kIGFsd2F5cyBwcml2YXRlLgorICoKKyAqIEJBQ0tfUElYTUFQIChub3Qgc3VwcG9ydGVkKQorICogQkFDS19YSU1BR0UKKyAqLwordm9pZAorc3dyYXN0X3NldF9zcGFuX2Z1bmNzX2JhY2soc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiwKKwkJCSAgIEdMdWludCBwaXhlbF9mb3JtYXQpCit7CisgICAgc3dpdGNoIChwaXhlbF9mb3JtYXQpIHsKKyAgICBjYXNlIFBGX0E4UjhHOEI4OgorCXhyYi0+QmFzZS5HZXRSb3cgPSBnZXRfcm93X0E4UjhHOEI4OworCXhyYi0+QmFzZS5HZXRWYWx1ZXMgPSBnZXRfdmFsdWVzX0E4UjhHOEI4OworCXhyYi0+QmFzZS5QdXRSb3cgPSBwdXRfcm93X0E4UjhHOEI4OworCXhyYi0+QmFzZS5QdXRSb3dSR0IgPSBwdXRfcm93X3JnYl9BOFI4RzhCODsKKwl4cmItPkJhc2UuUHV0TW9ub1JvdyA9IHB1dF9tb25vX3Jvd19BOFI4RzhCODsKKwl4cmItPkJhc2UuUHV0VmFsdWVzID0gcHV0X3ZhbHVlc19BOFI4RzhCODsKKwl4cmItPkJhc2UuUHV0TW9ub1ZhbHVlcyA9IHB1dF9tb25vX3ZhbHVlc19BOFI4RzhCODsKKwlicmVhazsKKyAgICBjYXNlIFBGX1I1RzZCNToKKwl4cmItPkJhc2UuR2V0Um93ID0gZ2V0X3Jvd19SNUc2QjU7CisJeHJiLT5CYXNlLkdldFZhbHVlcyA9IGdldF92YWx1ZXNfUjVHNkI1OworCXhyYi0+QmFzZS5QdXRSb3cgPSBwdXRfcm93X1I1RzZCNTsKKwl4cmItPkJhc2UuUHV0Um93UkdCID0gcHV0X3Jvd19yZ2JfUjVHNkI1OworCXhyYi0+QmFzZS5QdXRNb25vUm93ID0gcHV0X21vbm9fcm93X1I1RzZCNTsKKwl4cmItPkJhc2UuUHV0VmFsdWVzID0gcHV0X3ZhbHVlc19SNUc2QjU7CisJeHJiLT5CYXNlLlB1dE1vbm9WYWx1ZXMgPSBwdXRfbW9ub192YWx1ZXNfUjVHNkI1OworCWJyZWFrOworICAgIGNhc2UgUEZfUjNHM0IyOgorCXhyYi0+QmFzZS5HZXRSb3cgPSBnZXRfcm93X1IzRzNCMjsKKwl4cmItPkJhc2UuR2V0VmFsdWVzID0gZ2V0X3ZhbHVlc19SM0czQjI7CisJeHJiLT5CYXNlLlB1dFJvdyA9IHB1dF9yb3dfUjNHM0IyOworCXhyYi0+QmFzZS5QdXRSb3dSR0IgPSBwdXRfcm93X3JnYl9SM0czQjI7CisJeHJiLT5CYXNlLlB1dE1vbm9Sb3cgPSBwdXRfbW9ub19yb3dfUjNHM0IyOworCXhyYi0+QmFzZS5QdXRWYWx1ZXMgPSBwdXRfdmFsdWVzX1IzRzNCMjsKKwl4cmItPkJhc2UuUHV0TW9ub1ZhbHVlcyA9IHB1dF9tb25vX3ZhbHVlc19SM0czQjI7CisJYnJlYWs7CisgICAgY2FzZSBQRl9DSTg6CisJeHJiLT5CYXNlLkdldFJvdyA9IGdldF9yb3dfQ0k4OworCXhyYi0+QmFzZS5HZXRWYWx1ZXMgPSBnZXRfdmFsdWVzX0NJODsKKwl4cmItPkJhc2UuUHV0Um93ID0gcHV0X3Jvd19DSTg7CisJeHJiLT5CYXNlLlB1dE1vbm9Sb3cgPSBwdXRfbW9ub19yb3dfQ0k4OworCXhyYi0+QmFzZS5QdXRWYWx1ZXMgPSBwdXRfdmFsdWVzX0NJODsKKwl4cmItPkJhc2UuUHV0TW9ub1ZhbHVlcyA9IHB1dF9tb25vX3ZhbHVlc19DSTg7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlhc3NlcnQoMCk7CisJcmV0dXJuOworICAgIH0KK30KKworCisvKgorICogRnJvbnQtYnVmZmVycyBhcmUgcHJvdmlkZWQgYnkgdGhlIGxvYWRlciwgdGhlIHhvcmcgbG9hZGVyIHVzZXMgcGl4bWFwcy4KKyAqCisgKiBXSU5ET1csICAgICAgICAgIEFuIFggd2luZG93CisgKiBHTFhXSU5ET1csICAgICAgIEdMWCB3aW5kb3cKKyAqIFBJWE1BUCwgICAgICAgICAgR0xYIHBpeG1hcAorICogUEJVRkZFUiAgICAgICAgICBHTFggUGJ1ZmZlcgorICovCit2b2lkCitzd3Jhc3Rfc2V0X3NwYW5fZnVuY3NfZnJvbnQoc3RydWN0IHN3cmFzdF9yZW5kZXJidWZmZXIgKnhyYiwKKwkJCSAgICBHTHVpbnQgcGl4ZWxfZm9ybWF0KQoreworICAgIHN3aXRjaCAocGl4ZWxfZm9ybWF0KSB7CisgICAgY2FzZSBQRl9BOFI4RzhCODoKKwl4cmItPkJhc2UuR2V0Um93ID0gZ2V0X3Jvd19BOFI4RzhCOF9mcm9udDsKKwl4cmItPkJhc2UuR2V0VmFsdWVzID0gZ2V0X3ZhbHVlc19BOFI4RzhCOF9mcm9udDsKKwl4cmItPkJhc2UuUHV0Um93ID0gcHV0X3Jvd19BOFI4RzhCOF9mcm9udDsKKwl4cmItPkJhc2UuUHV0Um93UkdCID0gcHV0X3Jvd19yZ2JfQThSOEc4QjhfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dE1vbm9Sb3cgPSBwdXRfbW9ub19yb3dfQThSOEc4QjhfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dFZhbHVlcyA9IHB1dF92YWx1ZXNfQThSOEc4QjhfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dE1vbm9WYWx1ZXMgPSBwdXRfbW9ub192YWx1ZXNfQThSOEc4QjhfZnJvbnQ7CisJYnJlYWs7CisgICAgY2FzZSBQRl9SNUc2QjU6CisJeHJiLT5CYXNlLkdldFJvdyA9IGdldF9yb3dfUjVHNkI1X2Zyb250OworCXhyYi0+QmFzZS5HZXRWYWx1ZXMgPSBnZXRfdmFsdWVzX1I1RzZCNV9mcm9udDsKKwl4cmItPkJhc2UuUHV0Um93ID0gcHV0X3Jvd19SNUc2QjVfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dFJvd1JHQiA9IHB1dF9yb3dfcmdiX1I1RzZCNV9mcm9udDsKKwl4cmItPkJhc2UuUHV0TW9ub1JvdyA9IHB1dF9tb25vX3Jvd19SNUc2QjVfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dFZhbHVlcyA9IHB1dF92YWx1ZXNfUjVHNkI1X2Zyb250OworCXhyYi0+QmFzZS5QdXRNb25vVmFsdWVzID0gcHV0X21vbm9fdmFsdWVzX1I1RzZCNV9mcm9udDsKKwlicmVhazsKKyAgICBjYXNlIFBGX1IzRzNCMjoKKwl4cmItPkJhc2UuR2V0Um93ID0gZ2V0X3Jvd19SM0czQjJfZnJvbnQ7CisJeHJiLT5CYXNlLkdldFZhbHVlcyA9IGdldF92YWx1ZXNfUjNHM0IyX2Zyb250OworCXhyYi0+QmFzZS5QdXRSb3cgPSBwdXRfcm93X1IzRzNCMl9mcm9udDsKKwl4cmItPkJhc2UuUHV0Um93UkdCID0gcHV0X3Jvd19yZ2JfUjNHM0IyX2Zyb250OworCXhyYi0+QmFzZS5QdXRNb25vUm93ID0gcHV0X21vbm9fcm93X1IzRzNCMl9mcm9udDsKKwl4cmItPkJhc2UuUHV0VmFsdWVzID0gcHV0X3ZhbHVlc19SM0czQjJfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dE1vbm9WYWx1ZXMgPSBwdXRfbW9ub192YWx1ZXNfUjNHM0IyX2Zyb250OworCWJyZWFrOworICAgIGNhc2UgUEZfQ0k4OgorCXhyYi0+QmFzZS5HZXRSb3cgPSBnZXRfcm93X0NJOF9mcm9udDsKKwl4cmItPkJhc2UuR2V0VmFsdWVzID0gZ2V0X3ZhbHVlc19DSThfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dFJvdyA9IHB1dF9yb3dfQ0k4X2Zyb250OworCXhyYi0+QmFzZS5QdXRNb25vUm93ID0gcHV0X21vbm9fcm93X0NJOF9mcm9udDsKKwl4cmItPkJhc2UuUHV0VmFsdWVzID0gcHV0X3ZhbHVlc19DSThfZnJvbnQ7CisJeHJiLT5CYXNlLlB1dE1vbm9WYWx1ZXMgPSBwdXRfbW9ub192YWx1ZXNfQ0k4X2Zyb250OworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJYXNzZXJ0KDApOworCXJldHVybjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zd3Jhc3Qvc3dyYXN0X3NwYW50ZW1wLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS9zd3Jhc3Qvc3dyYXN0X3NwYW50ZW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3YTI0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3N3cmFzdC9zd3Jhc3Rfc3BhbnRlbXAuaApAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqIFZlcnNpb246ICA2LjUuMQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qCisgKiBNb2RpZmllZCB2ZXJzaW9uIG9mIHN3cmFzdC9zX3NwYW50ZW1wLmggZm9yIGZyb250LWJ1ZmZlciByZW5kZXJpbmcuIFRoZQorICogbm8tbWFzayBwYXRocyB1c2UgYSBzY3JhdGNoIHJvdyB0byBhdm9pZCByZXBlYXRlZCBjYWxscyB0byB0aGUgbG9hZGVyLgorICoKKyAqIEZvciB0aGUgbWFzayBwYXRocyB3ZSBhbHdheXMgdXNlIGFuIGFycmF5IG9mIDQgZWxlbWVudHMgb2YgUkJfVFlQRS4gVGhpcyBpcworICogdG8gc2F0aXNmeSB0aGUgeG9yZyBsb2FkZXIgcmVxdWlyZW1lbnQgb2YgYW4gaW1hZ2UgcGl0Y2ggb2YgMzIgYml0cyBhbmQKKyAqIHNob3VsZCBiZSBvayBmb3Igb3RoZXIgbG9hZGVycyBhbHNvLgorICovCisKKworI2lmbmRlZiBfU1dSQVNUX1NQQU5URU1QX09OQ0UKKyNkZWZpbmUgX1NXUkFTVF9TUEFOVEVNUF9PTkNFCisKK3N0YXRpYyBJTkxJTkUgdm9pZAorUFVUX1BJWEVMKCBHTGNvbnRleHQgKmdsQ3R4LCBHTGludCB4LCBHTGludCB5LCBHTHVieXRlICpwICkKK3sKKyAgICBfX0RSSWNvbnRleHQgKmN0eCA9IHN3cmFzdF9jb250ZXh0KGdsQ3R4KTsKKyAgICBfX0RSSWRyYXdhYmxlICpkcmF3ID0gc3dyYXN0X2RyYXdhYmxlKGdsQ3R4LT5EcmF3QnVmZmVyKTsKKworICAgIF9fRFJJc2NyZWVuICpzY3JlZW4gPSBjdHgtPmRyaVNjcmVlblByaXY7CisKKyAgICBzY3JlZW4tPnN3cmFzdF9sb2FkZXItPnB1dEltYWdlKGRyYXcsIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9EUkFXLAorCQkJCSAgICB4LCB5LCAxLCAxLCAoY2hhciAqKXAsCisJCQkJICAgIGRyYXctPmxvYWRlclByaXZhdGUpOworfQorCisKK3N0YXRpYyBJTkxJTkUgdm9pZAorR0VUX1BJWEVMKCBHTGNvbnRleHQgKmdsQ3R4LCBHTGludCB4LCBHTGludCB5LCBHTHVieXRlICpwICkKK3sKKyAgICBfX0RSSWNvbnRleHQgKmN0eCA9IHN3cmFzdF9jb250ZXh0KGdsQ3R4KTsKKyAgICBfX0RSSWRyYXdhYmxlICpyZWFkID0gc3dyYXN0X2RyYXdhYmxlKGdsQ3R4LT5SZWFkQnVmZmVyKTsKKworICAgIF9fRFJJc2NyZWVuICpzY3JlZW4gPSBjdHgtPmRyaVNjcmVlblByaXY7CisKKyAgICBzY3JlZW4tPnN3cmFzdF9sb2FkZXItPmdldEltYWdlKHJlYWQsIHgsIHksIDEsIDEsIChjaGFyICopcCwKKwkJCQkgICAgcmVhZC0+bG9hZGVyUHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZAorUFVUX1JPVyggR0xjb250ZXh0ICpnbEN0eCwgR0xpbnQgeCwgR0xpbnQgeSwgR0x1aW50IG4sIGNoYXIgKnJvdyApCit7CisgICAgX19EUkljb250ZXh0ICpjdHggPSBzd3Jhc3RfY29udGV4dChnbEN0eCk7CisgICAgX19EUklkcmF3YWJsZSAqZHJhdyA9IHN3cmFzdF9kcmF3YWJsZShnbEN0eC0+RHJhd0J1ZmZlcik7CisKKyAgICBfX0RSSXNjcmVlbiAqc2NyZWVuID0gY3R4LT5kcmlTY3JlZW5Qcml2OworCisgICAgc2NyZWVuLT5zd3Jhc3RfbG9hZGVyLT5wdXRJbWFnZShkcmF3LCBfX0RSSV9TV1JBU1RfSU1BR0VfT1BfRFJBVywKKwkJCQkgICAgeCwgeSwgbiwgMSwgcm93LAorCQkJCSAgICBkcmF3LT5sb2FkZXJQcml2YXRlKTsKK30KKworc3RhdGljIElOTElORSB2b2lkCitHRVRfUk9XKCBHTGNvbnRleHQgKmdsQ3R4LCBHTGludCB4LCBHTGludCB5LCBHTHVpbnQgbiwgY2hhciAqcm93ICkKK3sKKyAgICBfX0RSSWNvbnRleHQgKmN0eCA9IHN3cmFzdF9jb250ZXh0KGdsQ3R4KTsKKyAgICBfX0RSSWRyYXdhYmxlICpyZWFkID0gc3dyYXN0X2RyYXdhYmxlKGdsQ3R4LT5SZWFkQnVmZmVyKTsKKworICAgIF9fRFJJc2NyZWVuICpzY3JlZW4gPSBjdHgtPmRyaVNjcmVlblByaXY7CisKKyAgICBzY3JlZW4tPnN3cmFzdF9sb2FkZXItPmdldEltYWdlKHJlYWQsIHgsIHksIG4sIDEsIHJvdywKKwkJCQkgICAgcmVhZC0+bG9hZGVyUHJpdmF0ZSk7Cit9CisKKyNlbmRpZiAvKiBfU1dSQVNUX1NQQU5URU1QX09OQ0UgKi8KKworCisvKgorICogVGVtcGxhdGVzIGZvciB0aGUgc3Bhbi9waXhlbC1hcnJheSB3cml0ZS9yZWFkIGZ1bmN0aW9ucyBjYWxsZWQgdmlhCisgKiB0aGUgZ2xfcmVuZGVyYnVmZmVyJ3MgR2V0Um93LCBHZXRWYWx1ZXMsIFB1dFJvdywgUHV0TW9ub1JvdywgUHV0VmFsdWVzCisgKiBhbmQgUHV0TW9ub1ZhbHVlcyBmdW5jdGlvbnMuCisgKgorICogRGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlOgorICogICBOQU1FKEJBU0UpICB0byBnZW5lcmF0ZSB0aGUgZnVuY3Rpb24gbmFtZSAoaS5lLiBhZGQgcHJlZml4IG9yIHN1ZmZpeCkKKyAqICAgUkJfVFlQRSAgdGhlIHJlbmRlcmJ1ZmZlciBEYXRhVHlwZQorICogICBDSV9NT0RFICBpZiBzZXQsIGNvbG9yIGluZGV4IG1vZGUsIGVsc2UgUkdCQQorICogICBTUEFOX1ZBUlMgIHRvIGRlY2xhcmUgYW55IGxvY2FsIHZhcmlhYmxlcworICogICBJTklUX1BJWEVMX1BUUihQLCBYLCBZKSAgdG8gaW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYSBwaXhlbAorICogICBJTkNfUElYRUxfUFRSKFApICB0byBpbmNyZW1lbnQgYSBwaXhlbCBwb2ludGVyIGJ5IG9uZSBwaXhlbAorICogICBTVE9SRV9QSVhFTChEU1QsIFgsIFksIFZBTFVFKSAgdG8gc3RvcmUgcGl4ZWwgdmFsdWVzIGluIGJ1ZmZlcgorICogICBGRVRDSF9QSVhFTChEU1QsIFNSQykgIHRvIGZldGNoIHBpeGVsIHZhbHVlcyBmcm9tIGJ1ZmZlcgorICoKKyAqIE5vdGUgdGhhdCBpbiB0aGUgU1RPUkVfUElYRUwgbWFjcm9zLCB3ZSBhbHNvIHBhc3MgaW4gdGhlIChYLFkpIGNvb3JkaW5hdGVzCisgKiBmb3IgdGhlIHBpeGVscyB0byBiZSBzdG9yZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGRpdGhlcmluZyBhbmQgcHJvYmFibHkKKyAqIGlnbm9yZWQgb3RoZXJ3aXNlLgorICovCisKKyNpbmNsdWRlICJtYWNyb3MuaCIKKworCisjaWZkZWYgQ0lfTU9ERQorI2RlZmluZSBSQl9DT01QT05FTlRTIDEKKyNlbGlmICFkZWZpbmVkKFJCX0NPTVBPTkVOVFMpCisjZGVmaW5lIFJCX0NPTVBPTkVOVFMgNAorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK05BTUUoZ2V0X3JvdykoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgIEdMdWludCBjb3VudCwgR0xpbnQgeCwgR0xpbnQgeSwgdm9pZCAqdmFsdWVzICkKK3sKKyNpZmRlZiBTUEFOX1ZBUlMKKyAgIFNQQU5fVkFSUworI2VuZGlmCisjaWZkZWYgQ0lfTU9ERQorICAgUkJfVFlQRSAqZGVzdCA9IChSQl9UWVBFICopIHZhbHVlczsKKyNlbHNlCisgICBSQl9UWVBFICgqZGVzdClbUkJfQ09NUE9ORU5UU10gPSAoUkJfVFlQRSAoKilbUkJfQ09NUE9ORU5UU10pIHZhbHVlczsKKyNlbmRpZgorICAgR0x1aW50IGk7CisgICBjaGFyICpyb3cgPSBzd3Jhc3RfZHJhd2FibGUoY3R4LT5SZWFkQnVmZmVyKS0+cm93OworICAgSU5JVF9QSVhFTF9QVFIocGl4ZWwsIHgsIHkpOworICAgR0VUX1JPVyggY3R4LCB4LCBZRkxJUCh4cmIsIHkpLCBjb3VudCwgcm93ICk7CisgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgRkVUQ0hfUElYRUwoZGVzdFtpXSwgcGl4ZWwpOworICAgICAgSU5DX1BJWEVMX1BUUihwaXhlbCk7CisgICB9CisgICAodm9pZCkgcmI7Cit9CisKKworc3RhdGljIHZvaWQKK05BTUUoZ2V0X3ZhbHVlcykoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBjb3VudCwgY29uc3QgR0xpbnQgeFtdLCBjb25zdCBHTGludCB5W10sIHZvaWQgKnZhbHVlcyApCit7CisjaWZkZWYgU1BBTl9WQVJTCisgICBTUEFOX1ZBUlMKKyNlbmRpZgorI2lmZGVmIENJX01PREUKKyAgIFJCX1RZUEUgKmRlc3QgPSAoUkJfVFlQRSAqKSB2YWx1ZXM7CisjZWxzZQorICAgUkJfVFlQRSAoKmRlc3QpW1JCX0NPTVBPTkVOVFNdID0gKFJCX1RZUEUgKCopW1JCX0NPTVBPTkVOVFNdKSB2YWx1ZXM7CisjZW5kaWYKKyAgIEdMdWludCBpOworICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIFJCX1RZUEUgcGl4ZWxbNF07CisgICAgICBHRVRfUElYRUwoY3R4LCB4W2ldLCBZRkxJUCh4cmIsIHlbaV0pLCBwaXhlbCk7CisgICAgICBGRVRDSF9QSVhFTChkZXN0W2ldLCBwaXhlbCk7CisgICB9CisgICAodm9pZCkgcmI7Cit9CisKKworc3RhdGljIHZvaWQKK05BTUUocHV0X3JvdykoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgIEdMdWludCBjb3VudCwgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlcywgY29uc3QgR0x1Ynl0ZSBtYXNrW10gKQoreworI2lmZGVmIFNQQU5fVkFSUworICAgU1BBTl9WQVJTCisjZW5kaWYKKyAgIGNvbnN0IFJCX1RZUEUgKCpzcmMpW1JCX0NPTVBPTkVOVFNdID0gKGNvbnN0IFJCX1RZUEUgKCopW1JCX0NPTVBPTkVOVFNdKSB2YWx1ZXM7CisgICBHTHVpbnQgaTsKKyAgIGlmIChtYXNrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgaWYgKG1hc2tbaV0pIHsKKyAgICAgICAgICAgIFJCX1RZUEUgcGl4ZWxbNF07CisgICAgICAgICAgICBTVE9SRV9QSVhFTChwaXhlbCwgeCArIGksIHksIHNyY1tpXSk7CisgICAgICAgICAgICBQVVRfUElYRUwoY3R4LCB4ICsgaSwgWUZMSVAoeHJiLCB5KSwgcGl4ZWwpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBjaGFyICpyb3cgPSBzd3Jhc3RfZHJhd2FibGUoY3R4LT5EcmF3QnVmZmVyKS0+cm93OworICAgICAgSU5JVF9QSVhFTF9QVFIocGl4ZWwsIHgsIHkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgIFNUT1JFX1BJWEVMKHBpeGVsLCB4ICsgaSwgeSwgc3JjW2ldKTsKKyAgICAgICAgIElOQ19QSVhFTF9QVFIocGl4ZWwpOworICAgICAgfQorICAgICAgUFVUX1JPVyggY3R4LCB4LCBZRkxJUCh4cmIsIHkpLCBjb3VudCwgcm93ICk7CisgICB9CisgICAodm9pZCkgcmI7Cit9CisKKworI2lmICFkZWZpbmVkKENJX01PREUpCitzdGF0aWMgdm9pZAorTkFNRShwdXRfcm93X3JnYikoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgICAgICBHTHVpbnQgY291bnQsIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWVzLCBjb25zdCBHTHVieXRlIG1hc2tbXSApCit7CisjaWZkZWYgU1BBTl9WQVJTCisgICBTUEFOX1ZBUlMKKyNlbmRpZgorICAgY29uc3QgUkJfVFlQRSAoKnNyYylbM10gPSAoY29uc3QgUkJfVFlQRSAoKilbM10pIHZhbHVlczsKKyAgIEdMdWludCBpOworICAgaWYgKG1hc2spIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICBpZiAobWFza1tpXSkgeworICAgICAgICAgICAgUkJfVFlQRSBwaXhlbFs0XTsKKyNpZmRlZiBTVE9SRV9QSVhFTF9SR0IKKyAgICAgICAgICAgIFNUT1JFX1BJWEVMX1JHQihwaXhlbCwgeCArIGksIHksIHNyY1tpXSk7CisjZWxzZQorICAgICAgICAgICAgU1RPUkVfUElYRUwocGl4ZWwsIHggKyBpLCB5LCBzcmNbaV0pOworI2VuZGlmCisgICAgICAgICAgICBQVVRfUElYRUwoY3R4LCB4ICsgaSwgWUZMSVAoeHJiLCB5KSwgcGl4ZWwpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBjaGFyICpyb3cgPSBzd3Jhc3RfZHJhd2FibGUoY3R4LT5EcmF3QnVmZmVyKS0+cm93OworICAgICAgSU5JVF9QSVhFTF9QVFIocGl4ZWwsIHgsIHkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyNpZmRlZiBTVE9SRV9QSVhFTF9SR0IKKyAgICAgICAgIFNUT1JFX1BJWEVMX1JHQihwaXhlbCwgeCArIGksIHksIHNyY1tpXSk7CisjZWxzZQorICAgICAgICAgU1RPUkVfUElYRUwocGl4ZWwsIHggKyBpLCB5LCBzcmNbaV0pOworI2VuZGlmCisgICAgICAgICBJTkNfUElYRUxfUFRSKHBpeGVsKTsKKyAgICAgIH0KKyAgICAgIFBVVF9ST1coIGN0eCwgeCwgWUZMSVAoeHJiLCB5KSwgY291bnQsIHJvdyApOworICAgfQorICAgKHZvaWQpIHJiOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK05BTUUocHV0X21vbm9fcm93KSggR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiLAorICAgICAgICAgICAgICAgICAgICBHTHVpbnQgY291bnQsIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBjb25zdCBHTHVieXRlIG1hc2tbXSApCit7CisjaWZkZWYgU1BBTl9WQVJTCisgICBTUEFOX1ZBUlMKKyNlbmRpZgorICAgY29uc3QgUkJfVFlQRSAqc3JjID0gKGNvbnN0IFJCX1RZUEUgKikgdmFsdWU7CisgICBHTHVpbnQgaTsKKyAgIGlmIChtYXNrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgaWYgKG1hc2tbaV0pIHsKKyAgICAgICAgICAgIFJCX1RZUEUgcGl4ZWxbNF07CisgICAgICAgICAgICBTVE9SRV9QSVhFTChwaXhlbCwgeCArIGksIHksIHNyYyk7CisgICAgICAgICAgICBQVVRfUElYRUwoY3R4LCB4ICsgaSwgWUZMSVAoeHJiLCB5KSwgcGl4ZWwpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBjaGFyICpyb3cgPSBzd3Jhc3RfZHJhd2FibGUoY3R4LT5EcmF3QnVmZmVyKS0+cm93OworICAgICAgSU5JVF9QSVhFTF9QVFIocGl4ZWwsIHgsIHkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgIFNUT1JFX1BJWEVMKHBpeGVsLCB4ICsgaSwgeSwgc3JjKTsKKyAgICAgICAgIElOQ19QSVhFTF9QVFIocGl4ZWwpOworICAgICAgfQorICAgICAgUFVUX1JPVyggY3R4LCB4LCBZRkxJUCh4cmIsIHkpLCBjb3VudCwgcm93ICk7CisgICB9CisgICAodm9pZCkgcmI7Cit9CisKKworc3RhdGljIHZvaWQKK05BTUUocHV0X3ZhbHVlcykoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBjb3VudCwgY29uc3QgR0xpbnQgeFtdLCBjb25zdCBHTGludCB5W10sCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZXMsIGNvbnN0IEdMdWJ5dGUgbWFza1tdICkKK3sKKyNpZmRlZiBTUEFOX1ZBUlMKKyAgIFNQQU5fVkFSUworI2VuZGlmCisgICBjb25zdCBSQl9UWVBFICgqc3JjKVtSQl9DT01QT05FTlRTXSA9IChjb25zdCBSQl9UWVBFICgqKVtSQl9DT01QT05FTlRTXSkgdmFsdWVzOworICAgR0x1aW50IGk7CisgICBBU1NFUlQobWFzayk7CisgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgaWYgKG1hc2tbaV0pIHsKKyAgICAgICAgIFJCX1RZUEUgcGl4ZWxbNF07CisgICAgICAgICBTVE9SRV9QSVhFTChwaXhlbCwgeFtpXSwgeVtpXSwgc3JjW2ldKTsKKyAgICAgICAgIFBVVF9QSVhFTChjdHgsIHhbaV0sIFlGTElQKHhyYiwgeVtpXSksIHBpeGVsKTsKKyAgICAgIH0KKyAgIH0KKyAgICh2b2lkKSByYjsKK30KKworCitzdGF0aWMgdm9pZAorTkFNRShwdXRfbW9ub192YWx1ZXMpKCBHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBjb3VudCwgY29uc3QgR0xpbnQgeFtdLCBjb25zdCBHTGludCB5W10sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBjb25zdCBHTHVieXRlIG1hc2tbXSApCit7CisjaWZkZWYgU1BBTl9WQVJTCisgICBTUEFOX1ZBUlMKKyNlbmRpZgorICAgY29uc3QgUkJfVFlQRSAqc3JjID0gKGNvbnN0IFJCX1RZUEUgKikgdmFsdWU7CisgICBHTHVpbnQgaTsKKyAgIEFTU0VSVChtYXNrKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBpZiAobWFza1tpXSkgeworICAgICAgICAgUkJfVFlQRSBwaXhlbFs0XTsKKyAgICAgICAgIFNUT1JFX1BJWEVMKHBpeGVsLCB4W2ldLCB5W2ldLCBzcmMpOworICAgICAgICAgUFVUX1BJWEVMKGN0eCwgeFtpXSwgWUZMSVAoeHJiLCB5W2ldKSwgcGl4ZWwpOworICAgICAgfQorICAgfQorICAgKHZvaWQpIHJiOworfQorCisKKyN1bmRlZiBOQU1FCisjdW5kZWYgUkJfVFlQRQorI3VuZGVmIFJCX0NPTVBPTkVOVFMKKyN1bmRlZiBDSV9NT0RFCisjdW5kZWYgU1BBTl9WQVJTCisjdW5kZWYgSU5JVF9QSVhFTF9QVFIKKyN1bmRlZiBJTkNfUElYRUxfUFRSCisjdW5kZWYgU1RPUkVfUElYRUwKKyN1bmRlZiBTVE9SRV9QSVhFTF9SR0IKKyN1bmRlZiBGRVRDSF9QSVhFTApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X2NvbnRleHQuaCBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RkZngvdGRmeF9jb250ZXh0LmgKaW5kZXggMDU2NzNjZC4uYzg4YTNlZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X2NvbnRleHQuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfY29udGV4dC5oCkBAIC05ODMsOSArOTgzLDkgQEAKICNkZWZpbmUgVERGWFBBQ0tDT0xPUjQ0NDQoIHIsIGcsIGIsIGEgKQkJCQkJICAgXAogICAgKCgoKGEpICYgMHhmMCkgPDwgOCkgfCAoKChiKSAmIDB4ZjApIDw8IDQpIHwgKChnKSAmIDB4ZjApIHwgKChyKSA+PiA0KSkKIAotc3RhdGljIF9faW5saW5lX18gR3JDb2xvcl90IHRkZnhQYWNrQ29sb3IoIEdMdWludCBjcHAsCi0JCQkJCSAgIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLAotCQkJCQkgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSApCitzdGF0aWMgSU5MSU5FIEdyQ29sb3JfdCB0ZGZ4UGFja0NvbG9yKCBHTHVpbnQgY3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSByLCBHTHVieXRlIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSApCiB7CiAgICBzd2l0Y2ggKCBjcHAgKSB7CiAgICBjYXNlIDI6CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfcmVuZGVyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfcmVuZGVyLmMKaW5kZXggZTM3NGYwOS4uY2Y4NDBjNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X3JlbmRlci5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RkZngvdGRmeF9yZW5kZXIuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhNZXNhLT5Db2xvci5DbGVhckFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TWVzYS0+RGVwdGguQ2xlYXIpOwogCSBGWF9nckNvbG9yTWFza3ZfTm9Mb2NrKGN0eCwgdHJ1ZTQpOwotCSBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSAmIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkKKwkgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0ZST05UX0xFRlQpCiAgICAgICAgICAgICBmeE1lc2EtPkdsaWRlLmdyUmVuZGVyQnVmZmVyKEdSX0JVRkZFUl9GUk9OVEJVRkZFUik7CiAJIGlmICghY3R4LT5EZXB0aC5UZXN0IHx8ICFjdHgtPkRlcHRoLk1hc2spCiAJICAgIGZ4TWVzYS0+R2xpZGUuZ3JEZXB0aE1hc2soRlhGQUxTRSk7CkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICAgICAgICAgICAgIGZ4TWVzYS0+R2xpZGUuZ3JEZXB0aE1hc2soRlhUUlVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZYX2dyQ29sb3JNYXNrdl9Ob0xvY2soY3R4LCB0cnVlNCk7Ci0gICAgICAgICAgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSAmIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkKKyAgICAgICAgICAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdID09IEJVRkZFUl9GUk9OVF9MRUZUKQogICAgICAgICAgICAgICAgZnhNZXNhLT5HbGlkZS5nclJlbmRlckJ1ZmZlcihHUl9CVUZGRVJfRlJPTlRCVUZGRVIpOwogICAgICAgICAgfQogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X3NjcmVlbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X3NjcmVlbi5jCmluZGV4IDc3NjE2NjQuLjRlNjdiNWQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RkZngvdGRmeF9zY3JlZW4uYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfc2NyZWVuLmMKQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgRFJJX0NPTkZfU0VDVElPTl9FTkQKIERSSV9DT05GX0VORDsKIAorc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICp0ZGZ4RXh0ZW5zaW9uc1tdID0geworICAgICZkcmlSZWFkRHJhd2FibGVFeHRlbnNpb24sCit9OworCiBzdGF0aWMgY29uc3QgR0x1aW50IF9fZHJpTkNvbmZpZ09wdGlvbnMgPSAxOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRyaV9leHRlbnNpb24gY2FyZF9leHRlbnNpb25zW107CkBAIC03Miw5ICs3Niw2IEBACiB7CiAgICB0ZGZ4U2NyZWVuUHJpdmF0ZSAqZnhTY3JlZW47CiAgICBUREZYRFJJUHRyIGZ4RFJJUHJpdiA9IChUREZYRFJJUHRyKSBzUHJpdi0+cERldlByaXY7Ci0gICBQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DIGdseF9lbmFibGVfZXh0ZW5zaW9uID0KLSAgICAgKFBGTkdMWFNDUkVOQUJMRUVYVEVOU0lPTlBST0MpICgqZHJpX2ludGVyZmFjZS0+Z2V0UHJvY0FkZHJlc3MoImdseEVuYWJsZUV4dGVuc2lvbiIpKTsKLSAgIHZvaWQgKmNvbnN0IHBzYyA9IHNQcml2LT5wc2MtPnNjcmVlbkNvbmZpZ3M7CiAKICAgIGlmIChzUHJpdi0+ZGV2UHJpdlNpemUgIT0gc2l6ZW9mKFRERlhEUklSZWMpKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5FUlJPUiEgIHNpemVvZihUREZYRFJJUmVjKSBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgc2l6ZSBmcm9tIGRldmljZSBkcml2ZXJcbiIpOwpAQCAtMTE1LDkgKzExNiw3IEBACiAgICAgICByZXR1cm4gR0xfRkFMU0U7CiAgICB9CiAKLSAgIGlmIChnbHhfZW5hYmxlX2V4dGVuc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKShwc2MsICJHTFhfU0dJX21ha2VfY3VycmVudF9yZWFkIik7Ci0gICB9CisgICBzUHJpdi0+ZXh0ZW5zaW9ucyA9IHRkZnhFeHRlbnNpb25zOwogCiAgICByZXR1cm4gR0xfVFJVRTsKIH0KQEAgLTM0MywzMSArMzQyLDE0IEBACiAgICB9CiB9CiAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBfX0RyaXZlckFQSVJlYyB0ZGZ4QVBJID0gewotICAgLkluaXREcml2ZXIgICAgICA9IHRkZnhJbml0RHJpdmVyLAotICAgLkRlc3Ryb3lTY3JlZW4gICA9IHRkZnhEZXN0cm95U2NyZWVuLAotICAgLkNyZWF0ZUNvbnRleHQgICA9IHRkZnhDcmVhdGVDb250ZXh0LAotICAgLkRlc3Ryb3lDb250ZXh0ICA9IHRkZnhEZXN0cm95Q29udGV4dCwKLSAgIC5DcmVhdGVCdWZmZXIgICAgPSB0ZGZ4Q3JlYXRlQnVmZmVyLAotICAgLkRlc3Ryb3lCdWZmZXIgICA9IHRkZnhEZXN0cm95QnVmZmVyLAotICAgLlN3YXBCdWZmZXJzICAgICA9IHRkZnhTd2FwQnVmZmVycywKLSAgIC5NYWtlQ3VycmVudCAgICAgPSB0ZGZ4TWFrZUN1cnJlbnQsCi0gICAuVW5iaW5kQ29udGV4dCAgID0gdGRmeFVuYmluZENvbnRleHQsCi0gICAuR2V0U3dhcEluZm8gICAgID0gTlVMTCwKLSAgIC5HZXRNU0MgICAgICAgICAgPSBOVUxMLAotICAgLldhaXRGb3JNU0MgICAgICA9IE5VTEwsCi0gICAuV2FpdEZvclNCQyAgICAgID0gTlVMTCwKLSAgIC5Td2FwQnVmZmVyc01TQyAgPSBOVUxMCi19OwotCi0KLXN0YXRpYyBfX0dMY29udGV4dE1vZGVzICp0ZGZ4RmlsbEluTW9kZXModW5zaWduZWQgcGl4ZWxfYml0cywKLQkJCQkJIHVuc2lnbmVkIGRlcHRoX2JpdHMsCi0JCQkJCSB1bnNpZ25lZCBzdGVuY2lsX2JpdHMsCi0JCQkJCSBHTGJvb2xlYW4gaGF2ZV9iYWNrX2J1ZmZlcikKK3N0YXRpYyBjb25zdCBfX0RSSWNvbmZpZyAqKgordGRmeEZpbGxJbk1vZGVzKF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwLAorCQl1bnNpZ25lZCBwaXhlbF9iaXRzLAorCQl1bnNpZ25lZCBkZXB0aF9iaXRzLAorCQl1bnNpZ25lZCBzdGVuY2lsX2JpdHMsCisJCUdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyKQogewotCV9fR0xjb250ZXh0TW9kZXMgKm1vZGVzOworCV9fRFJJY29uZmlnICoqY29uZmlncywgKipjOwogCV9fR0xjb250ZXh0TW9kZXMgKm07CiAJdW5zaWduZWQgbnVtX21vZGVzOwogCXVuc2lnbmVkIHZpc1syXSA9IHsgR0xYX1RSVUVfQ09MT1IsIEdMWF9ESVJFQ1RfQ09MT1IgfTsKQEAgLTM4MiwxNCArMzY0LDE2IEBACiAKIAludW1fbW9kZXMgPSAoZGVwdGhfYml0cyA9PSAxNikgPyAzMiA6IDE2OwogCi0JbW9kZXMgPSAoKmRyaV9pbnRlcmZhY2UtPmNyZWF0ZUNvbnRleHRNb2RlcykobnVtX21vZGVzLCBzaXplb2YoX19HTGNvbnRleHRNb2RlcykpOwotCW0gPSBtb2RlczsKKwljb25maWdzID0gX21lc2FfbWFsbG9jKG51bV9tb2RlcyAqIHNpemVvZiAqY29uZmlncyk7CisJYyA9IGNvbmZpZ3M7CiAKIAlmb3IgKGkgPSAwOyBpIDw9IDE7IGkrKykgewogCSAgICBmb3IgKGRiID0gMDsgZGIgPD0gMTsgZGIrKykgewogCQlmb3IgKGRlcHRoID0gMDsgZGVwdGggPD0gMTsgZGVwdGgrKykgewogCQkgICAgZm9yIChhY2N1bSA9IDA7IGFjY3VtIDw9IDE7IGFjY3VtKyspIHsKIAkJCWZvciAoc3RlbmNpbCA9IDA7IHN0ZW5jaWwgPD0gIWRlZXA7IHN0ZW5jaWwrKykgeworCQkJICAgICpjID0gX21lc2FfbWFsbG9jKHNpemVvZiAqKmMpOworCQkJICAgIG0gPSAmKCpjKyspLT5tb2RlczsKIAkJCSAgICBpZiAoZGVlcCkgc3RlbmNpbCA9IGRlcHRoOwogCQkJICAgIG0tPnJlZEJpdHMJCT0gZGVlcCA/IDggOiA1OwogCQkJICAgIG0tPmdyZWVuQml0cwk9IGRlZXAgPyA4IDogNjsKQEAgLTQxOSw3ICs0MDMsNiBAQAogCQkJICAgIG0tPnZpc3VhbFJhdGluZwk9ICgoc3RlbmNpbCAmJiAhZGVlcCkgfHwgYWNjdW0pCiAJCQkgICAgCQkJICA/IEdMWF9TTE9XX0NPTkZJRwogCQkJCQkJICA6IEdMWF9OT05FOwotCQkJICAgIG0gPSBtLT5uZXh0OwogCQkJICAgIGlmIChkZWVwKSBzdGVuY2lsID0gMDsKIAkJCX0KIAkJICAgIH0KQEAgLTQyNyw3MyArNDEwLDcxIEBACiAJICAgIH0KIAl9CiAKLQlyZXR1cm4gbW9kZXM7CisJcmV0dXJuIChjb25zdCBfX0RSSWNvbmZpZyAqKikgY29uZmlnczsKIH0KIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBib290c3RyYXAgZnVuY3Rpb24gZm9yIHRoZSBkcml2ZXIuICBsaWJHTCBzdXBwbGllcyBhbGwgb2YgdGhlCi0gKiByZXF1aXNpdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSwgYW5kIHRoZSBkcml2ZXIgaW5pdGlhbGl6ZXMgaXRzZWxmLgotICogVGhpcyByb3V0aW5lIGFsc28gZmlsbHMgaW4gdGhlIGxpbmtlZCBsaXN0IHBvaW50ZWQgdG8gYnkgXGMgZHJpdmVyX21vZGVzCi0gKiB3aXRoIHRoZSBcYyBfX0dMY29udGV4dE1vZGVzIHRoYXQgdGhlIGRyaXZlciBjYW4gc3VwcG9ydCBmb3Igd2luZG93cyBvcgotICogcGJ1ZmZlcnMuCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3BlY2lmaWMgcGFydCBvZiB0aGUgY3JlYXRlTmV3U2NyZWVuIGVudHJ5IHBvaW50LgorICogCisgKiBcdG9kbyBtYXliZSBmb2xkIHRoaXMgaW50byBpbnRlbEluaXREcml2ZXIKICAqCi0gKiBccmV0dXJuIEEgcG9pbnRlciB0byBhIFxjIF9fRFJJc2NyZWVuUHJpdmF0ZSBvbiBzdWNjZXNzLCBvciBcYyBOVUxMIG9uCi0gKiAgICAgICAgIGZhaWx1cmUuCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgogICovCi1QVUJMSUMKLXZvaWQgKiBfX2RyaUNyZWF0ZU5ld1NjcmVlbl8yMDA1MDcyNyggX19EUkluYXRpdmVEaXNwbGF5ICpkcHksIGludCBzY3JuLCBfX0RSSXNjcmVlbiAqcHNjLAotCQkJICAgICBjb25zdCBfX0dMY29udGV4dE1vZGVzICogbW9kZXMsCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRkeF92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcmlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJtX3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJZnJhbWVidWZmZXIgKiBmcmFtZV9idWZmZXIsCi0JCQkgICAgIGRybUFkZHJlc3MgcFNBUkVBLCBpbnQgZmQsCi0JCQkgICAgIGludCBpbnRlcm5hbF9hcGlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotCQkJICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCitzdGF0aWMgY29uc3QgX19EUkljb25maWcgKioKK3RkZnhJbml0U2NyZWVuKF9fRFJJc2NyZWVuICpwc3ApCiB7Ci0gICBfX0RSSXNjcmVlblByaXZhdGUgKnBzcDsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZGR4X2V4cGVjdGVkID0geyAxLCAxLCAwIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRyaV9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OwogICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcm1fZXhwZWN0ZWQgPSB7IDEsIDAsIDAgfTsKIAotICAgZHJpX2ludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgIC8qIGRpdmluZWQgZnJvbSB0ZGZ4X2RyaS5jLCBza2V0Y2h5ICovCisgICBUREZYRFJJUHRyIGRyaV9wcml2ID0gKFRERlhEUklQdHIpIHBzcC0+cERldlByaXY7CisKKyAgIC8qIFhYWCBpIHdpc2ggaXQgd2FzIGxpa2UgdGhpcyAqLworICAgLyogYnBwID0gZHJpX3ByaXYtPmJwcCAqLworICAgaW50IGJwcCA9IChkcmlfcHJpdi0+Y3BwID4gMikgPyAyNCA6IDE2OwogCiAgICBpZiAoICEgZHJpQ2hlY2tEcmlEZHhEcm1WZXJzaW9uczIoICJ0ZGZ4IiwKLQkJCQkgICAgICBkcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCi0JCQkJICAgICAgZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAotCQkJCSAgICAgIGRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkgeworCQkJCSAgICAgICZwc3AtPmRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKKwkJCQkgICAgICAmcHNwLT5kZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKQogICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9CiAKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLSAgIAkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJnRkZnhBUEkpOworICAgLyogQ2FsbGluZyBkcmlJbml0RXh0ZW5zaW9ucyBoZXJlLCB3aXRoIGEgTlVMTCBjb250ZXh0IHBvaW50ZXIsCisgICAgKiBkb2VzIG5vdCBhY3R1YWxseSBlbmFibGUgdGhlIGV4dGVuc2lvbnMuICBJdCBqdXN0IG1ha2VzIHN1cmUKKyAgICAqIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdAorICAgICogKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCisgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcworICAgICogY2FsbGVkLCBidXQgd2UgY2FuJ3QgZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYQorICAgICogY29udGV4dCBwb2ludGVyLgorICAgICoKKyAgICAqIEhlbGxvIGNoaWNrZW4uICBIZWxsbyBlZ2cuICBIb3cgYXJlIHlvdSB0d28gdG9kYXk/CisgICAgKi8KKyAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBjYXJkX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CisgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgbmFwYWxtX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CiAKLSAgIGlmIChwc3AgIT0gTlVMTCkgewotICAgICAgLyogZGl2aW5lZCBmcm9tIHRkZnhfZHJpLmMsIHNrZXRjaHkgKi8KLSAgICAgIFRERlhEUklQdHIgZHJpX3ByaXYgPSAoVERGWERSSVB0cikgcHNwLT5wRGV2UHJpdjsKLSAgICAgIGludCBicHAgPSAoZHJpX3ByaXYtPmNwcCA+IDIpID8gMjQgOiAxNjsKLQotICAgICAgLyogWFhYIGkgd2lzaCBpdCB3YXMgbGlrZSB0aGlzICovCi0gICAgICAvKiBicHAgPSBkcmlfcHJpdi0+YnBwICovCisgICBpZiAoIXRkZnhJbml0RHJpdmVyKHBzcCkpCisgICAgICByZXR1cm4gTlVMTDsKICAgICAgIAotICAgICAgKmRyaXZlcl9tb2RlcyA9IHRkZnhGaWxsSW5Nb2RlcyhicHAsIChicHAgPT0gMTYpID8gMTYgOiAyNCwKLQkJCQkoYnBwID09IDE2KSA/IDAgOiA4LAotCQkJCShkcmlfcHJpdi0+YmFja09mZnNldCE9ZHJpX3ByaXYtPmRlcHRoT2Zmc2V0KSk7Ci0KLSAgICAgIC8qIENhbGxpbmcgZHJpSW5pdEV4dGVuc2lvbnMgaGVyZSwgd2l0aCBhIE5VTEwgY29udGV4dCBwb2ludGVyLCBkb2VzIG5vdCBhY3R1YWxseQotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zLiAgSXQganVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwKLSAgICAgICAqIHRoZSBleHRlbnNpb25zIHRoYXQgKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCi0gICAgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcyBjYWxsZWQsIGJ1dCB3ZSBjYW4ndAotICAgICAgICogZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYSBjb250ZXh0IHBvaW50ZXIuCi0gICAgICAgKgotICAgICAgICogSGVsbG8gY2hpY2tlbi4gIEhlbGxvIGVnZy4gIEhvdyBhcmUgeW91IHR3byB0b2RheT8KLSAgICAgICAqLwotICAgICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLSAgICAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBuYXBhbG1fZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKLSAgIH0KLQotICAgcmV0dXJuICh2b2lkICopcHNwOworICAgcmV0dXJuIHRkZnhGaWxsSW5Nb2Rlcyhwc3AsCisJCQkgIGJwcCwgKGJwcCA9PSAxNikgPyAxNiA6IDI0LAorCQkJICAoYnBwID09IDE2KSA/IDAgOiA4LAorCQkJICAoZHJpX3ByaXYtPmJhY2tPZmZzZXQhPWRyaV9wcml2LT5kZXB0aE9mZnNldCkpOwogfQorCitjb25zdCBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgZHJpRHJpdmVyQVBJID0geworICAgLkluaXRTY3JlZW4gICAgICA9IHRkZnhJbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gICA9IHRkZnhEZXN0cm95U2NyZWVuLAorICAgLkNyZWF0ZUNvbnRleHQgICA9IHRkZnhDcmVhdGVDb250ZXh0LAorICAgLkRlc3Ryb3lDb250ZXh0ICA9IHRkZnhEZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICAgPSB0ZGZ4Q3JlYXRlQnVmZmVyLAorICAgLkRlc3Ryb3lCdWZmZXIgICA9IHRkZnhEZXN0cm95QnVmZmVyLAorICAgLlN3YXBCdWZmZXJzICAgICA9IHRkZnhTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudCAgICAgPSB0ZGZ4TWFrZUN1cnJlbnQsCisgICAuVW5iaW5kQ29udGV4dCAgID0gdGRmeFVuYmluZENvbnRleHQsCisgICAuR2V0U3dhcEluZm8gICAgID0gTlVMTCwKKyAgIC5HZXREcmF3YWJsZU1TQyAgPSBOVUxMLAorICAgLldhaXRGb3JNU0MgICAgICA9IE5VTEwsCisgICAuV2FpdEZvclNCQyAgICAgID0gTlVMTCwKKyAgIC5Td2FwQnVmZmVyc01TQyAgPSBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdGRmeC90ZGZ4X3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfc3RhdGUuYwppbmRleCAzNjg4Yzc2Li43ODE5NjRlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfc3RhdGUuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90ZGZ4L3RkZnhfc3RhdGUuYwpAQCAtMTAzMiwyMSArMTAzMiwyMyBAQAogCiAgICBGTFVTSF9CQVRDSCggZnhNZXNhICk7CiAKLSAgIC8qCi0gICAgKiBfQ29sb3JEcmF3QnVmZmVyTWFzayBpcyBlYXNpZXIgdG8gY29wZSB3aXRoIHRoYW4gPG1vZGU+LgotICAgICovCi0gICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICkgewotICAgY2FzZSBCVUZGRVJfQklUX0ZST05UX0xFRlQ6CisgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA+IDEpIHsKKyAgICAgIEZBTExCQUNLKCBmeE1lc2EsIFRERlhfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3dpdGNoICggY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSApIHsKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICBmeE1lc2EtPkRyYXdCdWZmZXIgPSBmeE1lc2EtPlJlYWRCdWZmZXIgPSBHUl9CVUZGRVJfRlJPTlRCVUZGRVI7CiAgICAgICBmeE1lc2EtPm5ld19zdGF0ZSB8PSBUREZYX05FV19SRU5ERVI7CiAgICAgICBGQUxMQkFDSyggZnhNZXNhLCBUREZYX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9GQUxTRSApOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOgogICAgICAgZnhNZXNhLT5EcmF3QnVmZmVyID0gZnhNZXNhLT5SZWFkQnVmZmVyID0gR1JfQlVGRkVSX0JBQ0tCVUZGRVI7CiAgICAgICBmeE1lc2EtPm5ld19zdGF0ZSB8PSBUREZYX05FV19SRU5ERVI7CiAgICAgICBGQUxMQkFDSyggZnhNZXNhLCBUREZYX0ZBTExCQUNLX0RSQVdfQlVGRkVSLCBHTF9GQUxTRSApOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIDA6CisgICBjYXNlIC0xOgogICAgICAgRlhfZ3JDb2xvck1hc2t2KCBjdHgsIGZhbHNlNCApOwogICAgICAgRkFMTEJBQ0soIGZ4TWVzYSwgVERGWF9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UgKTsKICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X2NvbnRleHQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RyaWRlbnQvdHJpZGVudF9jb250ZXh0LmMKaW5kZXggOGRjN2YwZC4uMmI2ZDE5YyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS90cmlkZW50L3RyaWRlbnRfY29udGV4dC5jCkBAIC00MTcsOCArNDE3LDQwIEBACiAgICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgdHJpZGVudEFQSSA9IHsKLSAgIHRyaWRlbnRJbml0RHJpdmVyLAorLyoqCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgc3BlY2lmaWMgcGFydCBvZiB0aGUgY3JlYXRlTmV3U2NyZWVuIGVudHJ5IHBvaW50LgorICogCisgKiBcdG9kbyBtYXliZSBmb2xkIHRoaXMgaW50byBpbnRlbEluaXREcml2ZXIKKyAqCisgKiBccmV0dXJuIHRoZSBfX0dMY29udGV4dE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICovCitjb25zdCBfX0RSSWNvbmZpZyAqKnRyaWRlbnRJbml0U2NyZWVuKF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwKQoreworICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkZHhfZXhwZWN0ZWQgPSB7IDQsIDAsIDAgfTsKKyAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJpX2V4cGVjdGVkID0geyAzLCAxLCAwIH07CisgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsgMSwgMCwgMCB9OworICAgCisgICBpZiAoICEgZHJpQ2hlY2tEcmlEZHhEcm1WZXJzaW9uczIoICJUcmlkZW50IiwKKwkJCQkgICAgICAmcHNwLT5kcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAorCQkJCSAgICAgICZwc3AtPmRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCApICkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoIXRyaWRlbnRJbml0RHJpdmVyKHBzcCkpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBXYWl0Li4uIHdoYXQ/ICBUaGlzIGRyaXZlciBkb2Vzbid0IHJlcG9ydCBhbnkgbW9kZXMuLi4gKi8KKyNpZiAwCisgICBUUklERU5URFJJUHRyIGRyaV9wcml2ID0gKFRSSURFTlREUklQdHIpIHBzcC0+cERldlByaXY7CisgICAqZHJpdmVyX21vZGVzID0gdHJpZGVudEZpbGxJbk1vZGVzKCBkcmlfcHJpdi0+Ynl0ZXNQZXJQaXhlbCAqIDgsCisJCQkJICAgICAgIEdMX1RSVUUgKTsKKyNlbmRpZgorCisgICByZXR1cm4gTlVMTDsKK30KKworY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGRyaURyaXZlckFQSSA9IHsKKyAgIHRyaWRlbnRJbml0U2NyZWVuLAogICAgdHJpZGVudERlc3Ryb3lTY3JlZW4sCiAgICB0cmlkZW50Q3JlYXRlQ29udGV4dCwKICAgIHRyaWRlbnREZXN0cm95Q29udGV4dCwKQEAgLTQyOCw0NSArNDYwLDMgQEAKICAgIHRyaWRlbnRNYWtlQ3VycmVudCwKICAgIHRyaWRlbnRVbmJpbmRDb250ZXh0LAogfTsKLQotCi1QVUJMSUMgdm9pZCAqX19kcmlDcmVhdGVOZXdTY3JlZW5fMjAwNTA3MjcoIF9fRFJJbmF0aXZlRGlzcGxheSAqZHB5LCBpbnQgc2NybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19EUklzY3JlZW4gKnBzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19HTGNvbnRleHRNb2RlcyAqIG1vZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkZHhfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZHJpX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRybV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICogZnJhbWVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1BZGRyZXNzIHBTQVJFQSwgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJuYWxfYXBpX3ZlcnNpb24sCi0JCQkJICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCi17Ci0gICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7Ci0gICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRkeF9leHBlY3RlZCA9IHsgNCwgMCwgMCB9OwotICAgc3RhdGljIGNvbnN0IF9fRFJJdmVyc2lvbiBkcmlfZXhwZWN0ZWQgPSB7IDMsIDEsIDAgfTsKLSAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJtX2V4cGVjdGVkID0geyAxLCAwLCAwIH07Ci0KLSAgIGRyaV9pbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0KLSAgIGlmICggISBkcmlDaGVja0RyaURkeERybVZlcnNpb25zMiggIlRyaWRlbnQiLAotCQkJCSAgICAgIGRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKLQkJCQkgICAgICBkZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCi0JCQkJICAgICAgZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkICkgKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGR4X3ZlcnNpb24sIGRyaV92ZXJzaW9uLCBkcm1fdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfYnVmZmVyLCBwU0FSRUEsIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJnRyaWRlbnRBUEkpOwotCi0gICAgaWYgKCBwc3AgIT0gTlVMTCApIHsKLSNpZiAwCi0gICAgICAgVFJJREVOVERSSVB0ciBkcmlfcHJpdiA9IChUUklERU5URFJJUHRyKSBwc3AtPnBEZXZQcml2OwotICAgICAgICpkcml2ZXJfbW9kZXMgPSB0cmlkZW50RmlsbEluTW9kZXMoIGRyaV9wcml2LT5ieXRlc1BlclBpeGVsICogOCwKLQkJCQkJICAgR0xfVFJVRSApOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybiAodm9pZCAqKSBwc3A7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS90cmlkZW50L3RyaWRlbnRfY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X2NvbnRleHQuaAppbmRleCAxZDNjYTg0Li44MmI1M2RmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS90cmlkZW50L3RyaWRlbnRfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RyaWRlbnQvdHJpZGVudF9jb250ZXh0LmgKQEAgLTU0LDE0ICs1NCwxNCBAQAogI3VuZGVmIFRBRwogCiAvKiB0aGVzZSByZXF1aXJlIHRoYXQgYmFzZSBiZSBkd29yZC1hbGlnbmVkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgTU1JT19PVVQzMih1bnNpZ25lZCBjaGFyICpiYXNlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorc3RhdGljIElOTElORSB2b2lkIE1NSU9fT1VUMzIodW5zaWduZWQgY2hhciAqYmFzZSwgdW5zaWduZWQgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwpCiB7CiAgICAgdW5zaWduZWQgaW50ICphZGRyID0gKHVuc2lnbmVkIGludCAqKShiYXNlICsgb2Zmc2V0KTsKICAgICAqYWRkciA9IHZhbDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgTU1JT19JTjMyKHVuc2lnbmVkIGNoYXIgKmJhc2UsIHVuc2lnbmVkIGludCBvZmZzZXQpCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBNTUlPX0lOMzIodW5zaWduZWQgY2hhciAqYmFzZSwgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKICAgICB1bnNpZ25lZCBpbnQgKmFkZHIgPSAodW5zaWduZWQgaW50ICopKGJhc2UgKyBvZmZzZXQpOwogICAgIHJldHVybiAqYWRkcjsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3RyaWRlbnQvdHJpZGVudF9zdGF0ZS5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X3N0YXRlLmMKaW5kZXggNTMwM2JkNC4uY2MyZTUyYSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X3N0YXRlLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdHJpZGVudC90cmlkZW50X3N0YXRlLmMKQEAgLTUxLDkgKzUxLDkgQEAKICNkZWZpbmUgVFJJREVOVFBBQ0tDT0xPUjQ0NDQociwgZywgYiwgYSkJCQkJCVwKICAgICgoKChhKSAmIDB4ZjApIDw8IDgpIHwgKCgocikgJiAweGYwKSA8PCA0KSB8ICgoZykgJiAweGYwKSB8ICgoYikgPj4gNCkpCiAKLXN0YXRpYyBfX2lubGluZV9fIEdMdWludCB0cmlkZW50UGFja0NvbG9yKCBHTHVpbnQgY3BwLAotCQkJCQkgIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLAotCQkJCQkgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhICkKK3N0YXRpYyBJTkxJTkUgR0x1aW50IHRyaWRlbnRQYWNrQ29sb3IoIEdMdWludCBjcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhICkKIHsKICAgIHN3aXRjaCAoIGNwcCApIHsKICAgIGNhc2UgMjoKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfY29udGV4dC5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmMKaW5kZXggNGQyNWQzMi4uZWQ3MDAxZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogICogCiAgKiBccmV0dXJucyBBIHBpeGVsIHdpZHRoIHRoYXQgbWVldHMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkCiBidWZmZXJfYWxpZ24oIHVuc2lnbmVkIHdpZHRoICkKIHsKICAgICByZXR1cm4gKHdpZHRoICsgMHgwZikgJiB+MHgwZjsKQEAgLTYwMSw5ICs2MDEsNiBAQAogICAgIF90bmxfYWxsb3dfcGl4ZWxfZm9nKGN0eCwgR0xfRkFMU0UpOwogICAgIF90bmxfYWxsb3dfdmVydGV4X2ZvZyhjdHgsIEdMX1RSVUUpOwogCi0vKiAgICAgdm1lc2EtPmRpc3BsYXkgPSBkcHk7ICovCi0gICAgdm1lc2EtPmRpc3BsYXkgPSBzUHJpdi0+ZGlzcGxheTsKLSAgICAKICAgICB2bWVzYS0+aEhXQ29udGV4dCA9IGRyaUNvbnRleHRQcml2LT5oSFdDb250ZXh0OwogICAgIHZtZXNhLT5kcmlGZCA9IHNQcml2LT5mZDsKICAgICB2bWVzYS0+ZHJpSHdMb2NrID0gJnNQcml2LT5wU0FSRUEtPmxvY2s7CkBAIC02NjEsMTQgKzY1OCwxMCBAQAogICAgICAgICBkcmlRdWVyeU9wdGlvbmIoJnZtZXNhLT5vcHRpb25DYWNoZSwgIm5vX3Jhc3QiKSkKICAgICAgICBGQUxMQkFDSyh2bWVzYSwgVklBX0ZBTExCQUNLX1VTRVJfRElTQUJMRSwgMSk7CiAKLSAgICB2bWVzYS0+dmJsYW5rX2ZsYWdzID0KLSAgICAgICB2bWVzYS0+dmlhU2NyZWVuLT5pcnFFbmFibGVkID8KLSAgICAgICAgZHJpR2V0RGVmYXVsdFZCbGFua0ZsYWdzKCZ2bWVzYS0+b3B0aW9uQ2FjaGUpIDogVkJMQU5LX0ZMQUdfTk9fSVJROwotCiAgICAgaWYgKGdldGVudigiVklBX1BBR0VGTElQIikpCiAgICAgICAgdm1lc2EtPmFsbG93UGFnZUZsaXAgPSAxOwogCi0gICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmdm1lc2EtPnN3YXBfdXN0ICk7CisgICAgKCpzUHJpdi0+c3lzdGVtVGltZS0+Z2V0VVNUKSggJnZtZXNhLT5zd2FwX3VzdCApOwogCiAKICAgICB2bWVzYS0+cmVnTU1JT0Jhc2UgPSAoR0x1aW50ICopKCh1bnNpZ25lZCBsb25nKXZpYVNjcmVlbi0+cmVnKTsKQEAgLTY4Niw0NiArNjc5LDQ4IEBACiB2aWFEZXN0cm95Q29udGV4dChfX0RSSWNvbnRleHRQcml2YXRlICpkcmlDb250ZXh0UHJpdikKIHsKICAgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7Ci0gICAgc3RydWN0IHZpYV9jb250ZXh0ICp2bWVzYSA9IAorICAgIHN0cnVjdCB2aWFfY29udGV4dCAqdm1lc2EgPQogICAgICAgIChzdHJ1Y3QgdmlhX2NvbnRleHQgKilkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKICAgICBzdHJ1Y3QgdmlhX2NvbnRleHQgKmN1cnJlbnQgPSBjdHggPyBWSUFfQ09OVEVYVChjdHgpIDogTlVMTDsKKwogICAgIGFzc2VydCh2bWVzYSk7IC8qIHNob3VsZCBuZXZlciBiZSBudWxsICovCiAKKyAgICBpZiAodm1lc2EtPmRyaURyYXdhYmxlKSB7CisgICAgICAgdmlhV2FpdElkbGUodm1lc2EsIEdMX0ZBTFNFKTsKKworICAgICAgIGlmICh2bWVzYS0+ZG9QYWdlRmxpcCkgeworCSAgTE9DS19IQVJEV0FSRSh2bWVzYSk7CisJICBpZiAodm1lc2EtPnBmQ3VycmVudE9mZnNldCAhPSAwKSB7CisJICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIC0gcmVzZXQgcGZcbiIsIF9fRlVOQ1RJT05fXyk7CisJICAgICB2aWFSZXNldFBhZ2VGbGlwcGluZ0xvY2tlZCh2bWVzYSk7CisJICB9CisJICBVTkxPQ0tfSEFSRFdBUkUodm1lc2EpOworICAgICAgIH0KKyAgICB9CisKICAgICAvKiBjaGVjayBpZiB3ZSdyZSBkZWxldGluZyB0aGUgY3VycmVudGx5IGJvdW5kIGNvbnRleHQgKi8KICAgICBpZiAodm1lc2EgPT0gY3VycmVudCkgewogICAgICAgVklBX0ZMVVNIX0RNQSh2bWVzYSk7CiAgICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgfQogCi0gICAgaWYgKHZtZXNhKSB7Ci0gICAgICAgIHZpYVdhaXRJZGxlKHZtZXNhLCBHTF9GQUxTRSk7Ci0JaWYgKHZtZXNhLT5kb1BhZ2VGbGlwKSB7Ci0JICAgTE9DS19IQVJEV0FSRSh2bWVzYSk7Ci0JICAgaWYgKHZtZXNhLT5wZkN1cnJlbnRPZmZzZXQgIT0gMCkgewotCSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgLSByZXNldCBwZlxuIiwgX19GVU5DVElPTl9fKTsKLQkgICAgICB2aWFSZXNldFBhZ2VGbGlwcGluZ0xvY2tlZCh2bWVzYSk7Ci0JICAgfQotCSAgIFVOTE9DS19IQVJEV0FSRSh2bWVzYSk7Ci0JfQotCQotCV9zd3NldHVwX0Rlc3Ryb3lDb250ZXh0KHZtZXNhLT5nbEN0eCk7Ci0gICAgICAgIF90bmxfRGVzdHJveUNvbnRleHQodm1lc2EtPmdsQ3R4KTsKLSAgICAgICAgX3Zib19EZXN0cm95Q29udGV4dCh2bWVzYS0+Z2xDdHgpOwotICAgICAgICBfc3dyYXN0X0Rlc3Ryb3lDb250ZXh0KHZtZXNhLT5nbEN0eCk7Ci0gICAgICAgIC8qIGZyZWUgdGhlIE1lc2EgY29udGV4dCAqLwotCV9tZXNhX2Rlc3Ryb3lfY29udGV4dCh2bWVzYS0+Z2xDdHgpOwotCS8qIHJlbGVhc2Ugb3VyIGRhdGEgKi8KLQlGcmVlQnVmZmVyKHZtZXNhKTsKKyAgICBfc3dzZXR1cF9EZXN0cm95Q29udGV4dCh2bWVzYS0+Z2xDdHgpOworICAgIF90bmxfRGVzdHJveUNvbnRleHQodm1lc2EtPmdsQ3R4KTsKKyAgICBfdmJvX0Rlc3Ryb3lDb250ZXh0KHZtZXNhLT5nbEN0eCk7CisgICAgX3N3cmFzdF9EZXN0cm95Q29udGV4dCh2bWVzYS0+Z2xDdHgpOworICAgIC8qIGZyZWUgdGhlIE1lc2EgY29udGV4dCAqLworICAgIF9tZXNhX2Rlc3Ryb3lfY29udGV4dCh2bWVzYS0+Z2xDdHgpOworICAgIC8qIHJlbGVhc2Ugb3VyIGRhdGEgKi8KKyAgICBGcmVlQnVmZmVyKHZtZXNhKTsKIAotCWFzc2VydCAoaXNfZW1wdHlfbGlzdCgmdm1lc2EtPnRleF9pbWFnZV9saXN0W1ZJQV9NRU1fQUdQXSkpOwotCWFzc2VydCAoaXNfZW1wdHlfbGlzdCgmdm1lc2EtPnRleF9pbWFnZV9saXN0W1ZJQV9NRU1fVklERU9dKSk7Ci0JYXNzZXJ0IChpc19lbXB0eV9saXN0KCZ2bWVzYS0+dGV4X2ltYWdlX2xpc3RbVklBX01FTV9TWVNURU1dKSk7Ci0JYXNzZXJ0IChpc19lbXB0eV9saXN0KCZ2bWVzYS0+ZnJlZWRfdGV4X2J1ZmZlcnMpKTsKKyAgICBhc3NlcnQgKGlzX2VtcHR5X2xpc3QoJnZtZXNhLT50ZXhfaW1hZ2VfbGlzdFtWSUFfTUVNX0FHUF0pKTsKKyAgICBhc3NlcnQgKGlzX2VtcHR5X2xpc3QoJnZtZXNhLT50ZXhfaW1hZ2VfbGlzdFtWSUFfTUVNX1ZJREVPXSkpOworICAgIGFzc2VydCAoaXNfZW1wdHlfbGlzdCgmdm1lc2EtPnRleF9pbWFnZV9saXN0W1ZJQV9NRU1fU1lTVEVNXSkpOworICAgIGFzc2VydCAoaXNfZW1wdHlfbGlzdCgmdm1lc2EtPmZyZWVkX3RleF9idWZmZXJzKSk7CiAKLQlkcmlEZXN0cm95T3B0aW9uQ2FjaGUoJnZtZXNhLT5vcHRpb25DYWNoZSk7CisgICAgZHJpRGVzdHJveU9wdGlvbkNhY2hlKCZ2bWVzYS0+b3B0aW9uQ2FjaGUpOwogCi0JRlJFRSh2bWVzYSk7Ci0gICAgfQorICAgIEZSRUUodm1lc2EpOwogfQogCiAKQEAgLTczMywxNyArNzI4LDE4IEBACiB7CiAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqY29uc3QgZHJhd2FibGUgPSB2bWVzYS0+ZHJpRHJhd2FibGU7CiAgICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqY29uc3QgcmVhZGFibGUgPSB2bWVzYS0+ZHJpUmVhZGFibGU7Ci0gICBzdHJ1Y3QgdmlhX3JlbmRlcmJ1ZmZlciAqY29uc3QgZHJhd19idWZmZXIgPSAKLSAgICAgKHN0cnVjdCB2aWFfcmVuZGVyYnVmZmVyICopIGRyYXdhYmxlLT5kcml2ZXJQcml2YXRlOwotICAgc3RydWN0IHZpYV9yZW5kZXJidWZmZXIgKmNvbnN0IHJlYWRfYnVmZmVyID0KLSAgICAgKHN0cnVjdCB2aWFfcmVuZGVyYnVmZmVyICopIHJlYWRhYmxlLT5kcml2ZXJQcml2YXRlOworICAgc3RydWN0IHZpYV9yZW5kZXJidWZmZXIgKiBkcmF3X2J1ZmZlcjsKKyAgIHN0cnVjdCB2aWFfcmVuZGVyYnVmZmVyICogcmVhZF9idWZmZXI7CiAgICBHTHVpbnQgYnl0ZVBlclBpeGVsID0gdm1lc2EtPnZpYVNjcmVlbi0+Yml0c1BlclBpeGVsID4+IDM7CiAKICAgIGlmICghZHJhd2FibGUpCiAgICAgICByZXR1cm47CisKKyAgIGRyYXdfYnVmZmVyID0gIChzdHJ1Y3QgdmlhX3JlbmRlcmJ1ZmZlciAqKSBkcmF3YWJsZS0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHJlYWRfYnVmZmVyID0gIChzdHJ1Y3QgdmlhX3JlbmRlcmJ1ZmZlciAqKSByZWFkYWJsZS0+ZHJpdmVyUHJpdmF0ZTsKICAgIAotICAgc3dpdGNoICh2bWVzYS0+Z2xDdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOiAKKyAgIHN3aXRjaCAodm1lc2EtPmdsQ3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSkgeworICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOiAKICAgICAgIGlmIChkcmF3YWJsZS0+bnVtQmFja0NsaXBSZWN0cyA9PSAwKSB7CiAJIHZtZXNhLT5udW1DbGlwUmVjdHMgPSBkcmF3YWJsZS0+bnVtQ2xpcFJlY3RzOwogCSB2bWVzYS0+cENsaXBSZWN0cyA9IGRyYXdhYmxlLT5wQ2xpcFJlY3RzOwpAQCAtNzUzLDcgKzc0OSw3IEBACiAJIHZtZXNhLT5wQ2xpcFJlY3RzID0gZHJhd2FibGUtPnBCYWNrQ2xpcFJlY3RzOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgIGNhc2UgQlVGRkVSX0ZST05UX0xFRlQ6CiAgICAgICB2bWVzYS0+bnVtQ2xpcFJlY3RzID0gZHJhd2FibGUtPm51bUNsaXBSZWN0czsKICAgICAgIHZtZXNhLT5wQ2xpcFJlY3RzID0gZHJhd2FibGUtPnBDbGlwUmVjdHM7CiAgICAgICBicmVhazsKQEAgLTgzOSwxMyArODM1LDE3IEBACiAgICAgICAgIGRyYXdCdWZmZXIgPSAoR0xmcmFtZWJ1ZmZlciAqKWRyaURyYXdQcml2LT5kcml2ZXJQcml2YXRlOwogICAgICAgICByZWFkQnVmZmVyID0gKEdMZnJhbWVidWZmZXIgKilkcmlSZWFkUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKIAotCWlmICh2bWVzYS0+ZHJpRHJhd2FibGUgIT0gZHJpRHJhd1ByaXYpIHsKLQkgICBkcmlEcmF3YWJsZUluaXRWQmxhbmsoZHJpRHJhd1ByaXYsIHZtZXNhLT52YmxhbmtfZmxhZ3MsCi0JCQkJICZ2bWVzYS0+dmJsX3NlcSk7Ci0JfQotCiAgICAgICAgaWYgKCh2bWVzYS0+ZHJpRHJhd2FibGUgIT0gZHJpRHJhd1ByaXYpCiAJICAgfHwgKHZtZXNhLT5kcmlSZWFkYWJsZSAhPSBkcmlSZWFkUHJpdikpIHsKKwkgIGlmIChkcmlEcmF3UHJpdi0+c3dhcF9pbnRlcnZhbCA9PSAodW5zaWduZWQpLTEpIHsKKwkgICAgIGRyaURyYXdQcml2LT52YmxGbGFncyA9CisJCXZtZXNhLT52aWFTY3JlZW4tPmlycUVuYWJsZWQgPworCQlkcmlHZXREZWZhdWx0VkJsYW5rRmxhZ3MoJnZtZXNhLT5vcHRpb25DYWNoZSkgOgorCQlWQkxBTktfRkxBR19OT19JUlE7CisKKwkgICAgIGRyaURyYXdhYmxlSW5pdFZCbGFuayhkcmlEcmF3UHJpdik7CisJICB9CisKIAkgIHZtZXNhLT5kcmlEcmF3YWJsZSA9IGRyaURyYXdQcml2OwogCSAgdm1lc2EtPmRyaVJlYWRhYmxlID0gZHJpUmVhZFByaXY7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfY29udGV4dC5oIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmgKaW5kZXggZmVjZDI3OC4uYWNkNmYyZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9jb250ZXh0LmgKQEAgLTI4OSw3ICsyODksNiBAQAogICAgZHJtX2NvbnRleHRfdCBoSFdDb250ZXh0OwogICAgZHJtX2h3X2xvY2tfdCAqZHJpSHdMb2NrOwogICAgaW50IGRyaUZkOwotICAgX19EUkluYXRpdmVEaXNwbGF5ICpkaXNwbGF5OwogCiAgICAvKioKICAgICAqIERSSSBkcmF3YWJsZSBib3VuZCB0byB0aGlzIGNvbnRleHQgZm9yIGRyYXdpbmcuCkBAIC0zMjIsOSArMzIxLDYgQEAKICAgICAqLwogICAgZHJpT3B0aW9uQ2FjaGUgb3B0aW9uQ2FjaGU7CiAKLSAgIEdMdWludCB2YmxhbmtfZmxhZ3M7Ci0gICBHTHVpbnQgdmJsX3NlcTsKLQogICAgaW50NjRfdCBzd2FwX3VzdDsKICAgIGludDY0X3Qgc3dhcF9taXNzZWRfdXN0OwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX2lvY3RsLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX2lvY3RsLmMKaW5kZXggNGE3MzNmYi4uNDgyYTFhNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9pb2N0bC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfaW9jdGwuYwpAQCAtNTA3LDExICs1MDcsMTIgQEAKICAqIGV4Y2VwdCB0aGF0IFdBSVRfSURMRSgpIHdpbGwgc3BpbiB0aGUgQ1BVIHBvbGxpbmcsIHdoaWxlIHRoaXMgaXMKICAqIElSUSBkcml2ZW4uCiAgKi8KLXN0YXRpYyB2b2lkIHZpYVdhaXRJZGxlVkJsYW5rKCBjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsIAorc3RhdGljIHZvaWQgdmlhV2FpdElkbGVWQmxhbmsoICBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYsIAogCQkJICAgICAgIHN0cnVjdCB2aWFfY29udGV4dCAqdm1lc2EsCiAJCQkgICAgICAgR0x1aW50IHZhbHVlICkKIHsKICAgIEdMYm9vbGVhbiBtaXNzZWRfdGFyZ2V0OworICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3AgPSBkUHJpdi0+ZHJpU2NyZWVuUHJpdjsKIAogICAgVklBX0ZMVVNIX0RNQSh2bWVzYSk7IAogCkBAIC01MjMsMTEgKzUyNCwxMCBAQAogCSAgdm1lc2EtPnRocmFzaGluZykKIAkgdmlhU3dhcE91dFdvcmsodm1lc2EpOwogCi0gICAgICBkcmlXYWl0Rm9yVkJsYW5rKCBkUHJpdiwgJiB2bWVzYS0+dmJsX3NlcSwgCi0JCQl2bWVzYS0+dmJsYW5rX2ZsYWdzLCAmIG1pc3NlZF90YXJnZXQgKTsKKyAgICAgIGRyaVdhaXRGb3JWQmxhbmsoIGRQcml2LCAmIG1pc3NlZF90YXJnZXQgKTsKICAgICAgIGlmICggbWlzc2VkX3RhcmdldCApIHsKIAkgdm1lc2EtPnN3YXBfbWlzc2VkX2NvdW50Kys7Ci0JICgqZHJpX2ludGVyZmFjZS0+Z2V0VVNUKSggJnZtZXNhLT5zd2FwX21pc3NlZF91c3QgKTsKKwkgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkoICZ2bWVzYS0+c3dhcF9taXNzZWRfdXN0ICk7CiAgICAgICB9CiAgICB9IAogICAgd2hpbGUgKCF2aWFDaGVja0JyZWFkY3J1bWIodm1lc2EsIHZhbHVlKSk7CSAKQEAgLTU5MSwxMCArNTkxLDExIEBACiAvKgogICogQ29weSB0aGUgYmFjayBidWZmZXIgdG8gdGhlIGZyb250IGJ1ZmZlci4gCiAgKi8KLXZvaWQgdmlhQ29weUJ1ZmZlcihjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYpCit2b2lkIHZpYUNvcHlCdWZmZXIoX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2KQogewogICAgc3RydWN0IHZpYV9jb250ZXh0ICp2bWVzYSA9IAogICAgICAgKHN0cnVjdCB2aWFfY29udGV4dCAqKWRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwID0gZFByaXYtPmRyaVNjcmVlblByaXY7CiAKICAgIGlmIChWSUFfREVCVUcgJiBERUJVR19JT0NUTCkKICAgICAgIGZwcmludGYoc3RkZXJyLCAKQEAgLTYwNyw3ICs2MDgsNyBAQAogCiAgICBWSUFfRkxVU0hfRE1BKHZtZXNhKTsKIAotICAgaWYgKHZtZXNhLT52YmxhbmtfZmxhZ3MgPT0gVkJMQU5LX0ZMQUdfU1lOQyAmJgorICAgaWYgKGRQcml2LT52YmxGbGFncyA9PSBWQkxBTktfRkxBR19TWU5DICYmCiAgICAgICAgdm1lc2EtPmxhc3RCcmVhZGNydW1iV3JpdGUgPiAxKQogICAgICAgdmlhV2FpdElkbGVWQmxhbmsoZFByaXYsIHZtZXNhLCB2bWVzYS0+bGFzdEJyZWFkY3J1bWJXcml0ZS0xKTsKICAgIGVsc2UKQEAgLTYzMCwxOCArNjMxLDE5IEBACiAgICB2aWFFbWl0QnJlYWRjcnVtYkxvY2tlZCh2bWVzYSk7CiAgICBVTkxPQ0tfSEFSRFdBUkUodm1lc2EpOwogCi0gICAoKmRyaV9pbnRlcmZhY2UtPmdldFVTVCkoICZ2bWVzYS0+c3dhcF91c3QgKTsKKyAgICgqcHNwLT5zeXN0ZW1UaW1lLT5nZXRVU1QpKCAmdm1lc2EtPnN3YXBfdXN0ICk7CiB9CiAKIAotdm9pZCB2aWFQYWdlRmxpcChjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZFByaXYpCit2b2lkIHZpYVBhZ2VGbGlwKF9fRFJJZHJhd2FibGVQcml2YXRlICpkUHJpdikKIHsKICAgICBzdHJ1Y3QgdmlhX2NvbnRleHQgKnZtZXNhID0gCiAgICAgICAgKHN0cnVjdCB2aWFfY29udGV4dCAqKWRQcml2LT5kcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKICAgICBzdHJ1Y3QgdmlhX3JlbmRlcmJ1ZmZlciBidWZmZXJfdG1wOworICAgIF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwID0gZFByaXYtPmRyaVNjcmVlblByaXY7CiAKICAgICBWSUFfRkxVU0hfRE1BKHZtZXNhKTsKLSAgIGlmICh2bWVzYS0+dmJsYW5rX2ZsYWdzID09IFZCTEFOS19GTEFHX1NZTkMgJiYKKyAgIGlmIChkUHJpdi0+dmJsRmxhZ3MgPT0gVkJMQU5LX0ZMQUdfU1lOQyAmJgogICAgICAgIHZtZXNhLT5sYXN0QnJlYWRjcnVtYldyaXRlID4gMSkKICAgICAgIHZpYVdhaXRJZGxlVkJsYW5rKGRQcml2LCB2bWVzYSwgdm1lc2EtPmxhc3RCcmVhZGNydW1iV3JpdGUgLSAxKTsKICAgIGVsc2UKQEAgLTY1NCw3ICs2NTYsNyBAQAogICAgIHZpYUVtaXRCcmVhZGNydW1iTG9ja2VkKHZtZXNhKTsKICAgICBVTkxPQ0tfSEFSRFdBUkUodm1lc2EpOwogCi0gICAgKCpkcmlfaW50ZXJmYWNlLT5nZXRVU1QpKCAmdm1lc2EtPnN3YXBfdXN0ICk7CisgICAgKCpwc3AtPnN5c3RlbVRpbWUtPmdldFVTVCkoICZ2bWVzYS0+c3dhcF91c3QgKTsKIAogCiAgICAgLyogS1c6IEZJWE1FOiBXaGVuIGJ1ZmZlcnMgYXJlIGZyZWVkLCBjb3VsZCBmcmVlIGZyb250YnVmZmVyIGJ5CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX2lvY3RsLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX2lvY3RsLmgKaW5kZXggYTgxYjQyNy4uMTRhODMzYSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9pb2N0bC5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfaW9jdGwuaApAQCAtMzMsOCArMzMsOCBAQAogdm9pZCB2aWFGbHVzaERtYUxvY2tlZChzdHJ1Y3QgdmlhX2NvbnRleHQgKnZtZXNhLCBHTHVpbnQgZmxhZ3MpOwogCiB2b2lkIHZpYUluaXRJb2N0bEZ1bmNzKEdMY29udGV4dCAqY3R4KTsKLXZvaWQgdmlhQ29weUJ1ZmZlcihjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHByaXYpOwotdm9pZCB2aWFQYWdlRmxpcChjb25zdCBfX0RSSWRyYXdhYmxlUHJpdmF0ZSAqZHByaXYpOwordm9pZCB2aWFDb3B5QnVmZmVyKF9fRFJJZHJhd2FibGVQcml2YXRlICpkcHJpdik7Cit2b2lkIHZpYVBhZ2VGbGlwKF9fRFJJZHJhd2FibGVQcml2YXRlICpkcHJpdik7CiB2b2lkIHZpYUNoZWNrRG1hKHN0cnVjdCB2aWFfY29udGV4dCAqdm1lc2EsIEdMdWludCBieXRlcyk7CiB2b2lkIHZpYVJlc2V0UGFnZUZsaXBwaW5nTG9ja2VkKHN0cnVjdCB2aWFfY29udGV4dCAqdm1lc2EpOwogdm9pZCB2aWFXYWl0SWRsZShzdHJ1Y3QgdmlhX2NvbnRleHQgKnZtZXNhLCBHTGJvb2xlYW4gbGlnaHQpOwpAQCAtNTgsNyArNTgsNyBAQAogCiB2b2lkIHZpYVdyYXBQcmltaXRpdmUoIHN0cnVjdCB2aWFfY29udGV4dCAqdm1lc2EgKTsKIAotc3RhdGljIF9faW5saW5lX18gR0x1aW50ICp2aWFBbGxvY0RtYShzdHJ1Y3QgdmlhX2NvbnRleHQgKnZtZXNhLCBpbnQgYnl0ZXMpCitzdGF0aWMgSU5MSU5FIEdMdWludCAqdmlhQWxsb2NEbWEoc3RydWN0IHZpYV9jb250ZXh0ICp2bWVzYSwgaW50IGJ5dGVzKQogewogICAgaWYgKHZtZXNhLT5kbWFMb3cgKyBieXRlcyA+IFZJQV9ETUFfSElHSFdBVEVSKSB7CiAgICAgICB2aWFGbHVzaERtYSh2bWVzYSk7CkBAIC03Miw3ICs3Miw3IEBACiB9CiAKIAotc3RhdGljIEdMdWludCBfX2lubGluZV9fICp2aWFFeHRlbmRQcmltaXRpdmUoc3RydWN0IHZpYV9jb250ZXh0ICp2bWVzYSwgaW50IGJ5dGVzKQorc3RhdGljIEdMdWludCBJTkxJTkUgKnZpYUV4dGVuZFByaW1pdGl2ZShzdHJ1Y3QgdmlhX2NvbnRleHQgKnZtZXNhLCBpbnQgYnl0ZXMpCiB7CiAgICBpZiAodm1lc2EtPmRtYUxvdyArIGJ5dGVzID4gVklBX0RNQV9ISUdIV0FURVIpIHsKICAgICAgIHZpYVdyYXBQcmltaXRpdmUodm1lc2EpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9yZW5kZXIuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfcmVuZGVyLmMKaW5kZXggMzg3NDczZS4uZDdlMzczZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9yZW5kZXIuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3JlbmRlci5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICB0bmwtPmNsaXBzcGFjZS5uZXdfaW5wdXRzIHw9IFZFUlRfQklUX1BPUzsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBWQi0+UHJpbWl0aXZlQ291bnQ7ICsraSkgewotICAgICAgICBHTHVpbnQgbW9kZSA9IFZCLT5QcmltaXRpdmVbaV0ubW9kZTsKKyAgICAgICAgR0x1aW50IG1vZGUgPSBfdG5sX3RyYW5zbGF0ZV9wcmltKCZWQi0+UHJpbWl0aXZlW2ldKTsKICAgICAgICAgR0x1aW50IHN0YXJ0ID0gVkItPlByaW1pdGl2ZVtpXS5zdGFydDsKICAgICAgICAgR0x1aW50IGxlbmd0aCA9IFZCLT5QcmltaXRpdmVbaV0uY291bnQ7CiAgICAgICAgIGlmIChsZW5ndGgpCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3NjcmVlbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zY3JlZW4uYwppbmRleCBiODE1NDlkLi45YzhlYjkwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3NjcmVlbi5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfc2NyZWVuLmMKQEAgLTI0LDggKzI0LDggQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlICJ1dGlscy5oIgogI2luY2x1ZGUgImRyaV91dGlsLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJnbGhlYWRlci5oIgogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgpAQCAtNDgsNyArNDgsNyBAQAogCiAjaW5jbHVkZSAieG1scG9vbC5oIgogCi1jb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdID0KK1BVQkxJQyBjb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdID0KIERSSV9DT05GX0JFR0lOCiAgICAgRFJJX0NPTkZfU0VDVElPTl9QRVJGT1JNQU5DRQogICAgICAgICBEUklfQ09ORl9WQkxBTktfTU9ERShEUklfQ09ORl9WQkxBTktfREVGX0lOVEVSVkFMXzApCkBAIC02NCw4ICs2NCw2IEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZHJpX2V4dGVuc2lvbiBjYXJkX2V4dGVuc2lvbnNbXTsKIAotc3RhdGljIGludCBnZXRTd2FwSW5mbyggX19EUklkcmF3YWJsZVByaXZhdGUgKmRQcml2LCBfX0RSSXN3YXBJbmZvICogc0luZm8gKTsKLQogc3RhdGljIGRybUJ1Zk1hcFB0ciB2aWFfY3JlYXRlX2VtcHR5X2J1ZmZlcnModm9pZCkKIHsKICAgICBkcm1CdWZNYXBQdHIgcmV0dmFsOwpAQCAtOTgsOSArOTYsNyBAQAogewogICAgIHZpYVNjcmVlblByaXZhdGUgKnZpYVNjcmVlbjsKICAgICBWSUFEUklQdHIgZ0RSSVByaXYgPSAoVklBRFJJUHRyKXNQcml2LT5wRGV2UHJpdjsKLSAgICBQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DIGdseF9lbmFibGVfZXh0ZW5zaW9uID0KLSAgICAgIChQRk5HTFhTQ1JFTkFCTEVFWFRFTlNJT05QUk9DKSAoKmRyaV9pbnRlcmZhY2UtPmdldFByb2NBZGRyZXNzKCJnbHhFbmFibGVFeHRlbnNpb24iKSk7Ci0gICAgdm9pZCAqIGNvbnN0IHBzYyA9IHNQcml2LT5wc2MtPnNjcmVlbkNvbmZpZ3M7CisgICAgaW50IGk7CiAKICAgICBpZiAoc1ByaXYtPmRldlByaXZTaXplICE9IHNpemVvZihWSUFEUklSZWMpKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5FUlJPUiEgIHNpemVvZihWSUFEUklSZWMpIGRvZXMgbm90IG1hdGNoIHBhc3NlZCBzaXplIGZyb20gZGV2aWNlIGRyaXZlclxuIik7CkBAIC0xNzUsMTcgKzE3MSwxNyBAQAogCiAgICAgdmlhU2NyZWVuLT5zYXJlYVByaXZPZmZzZXQgPSBnRFJJUHJpdi0+c2FyZWFfcHJpdl9vZmZzZXQ7CiAKLSAgICBpZiAoIGdseF9lbmFibGVfZXh0ZW5zaW9uICE9IE5VTEwgKSB7Ci0gICAgICAgaWYgKCB2aWFTY3JlZW4tPmlycUVuYWJsZWQgKSB7Ci0JICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV9zd2FwX2NvbnRyb2wiICk7Ci0JICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV92aWRlb19zeW5jIiApOwotCSAgKCpnbHhfZW5hYmxlX2V4dGVuc2lvbikoIHBzYywgIkdMWF9NRVNBX3N3YXBfY29udHJvbCIgKTsKLSAgICAgICB9Ci0KLSAgICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZCIgKTsKLSAgICAgICAoKmdseF9lbmFibGVfZXh0ZW5zaW9uKSggcHNjLCAiR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSIgKTsKKyAgICBpID0gMDsKKyAgICB2aWFTY3JlZW4tPmV4dGVuc2lvbnNbaSsrXSA9ICZkcmlGcmFtZVRyYWNraW5nRXh0ZW5zaW9uLmJhc2U7CisgICAgdmlhU2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmZHJpUmVhZERyYXdhYmxlRXh0ZW5zaW9uOworICAgIGlmICggdmlhU2NyZWVuLT5pcnFFbmFibGVkICkgeworCXZpYVNjcmVlbi0+ZXh0ZW5zaW9uc1tpKytdID0gJmRyaVN3YXBDb250cm9sRXh0ZW5zaW9uLmJhc2U7CisJdmlhU2NyZWVuLT5leHRlbnNpb25zW2krK10gPSAmZHJpTWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uLmJhc2U7CiAgICAgfQogCisgICAgdmlhU2NyZWVuLT5leHRlbnNpb25zW2krK10gPSBOVUxMOworICAgIHNQcml2LT5leHRlbnNpb25zID0gdmlhU2NyZWVuLT5leHRlbnNpb25zOworCiAgICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKQEAgLTMyMywzMiArMzE5LDExIEBACiAgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigoR0xmcmFtZWJ1ZmZlciAqKikoJihkcmlEcmF3UHJpdi0+ZHJpdmVyUHJpdmF0ZSkpKTsKIH0KIAotCi0KLXN0YXRpYyBzdHJ1Y3QgX19Ecml2ZXJBUElSZWMgdmlhQVBJID0gewotICAgLkluaXREcml2ZXIgICAgICA9IHZpYUluaXREcml2ZXIsCi0gICAuRGVzdHJveVNjcmVlbiAgID0gdmlhRGVzdHJveVNjcmVlbiwKLSAgIC5DcmVhdGVDb250ZXh0ICAgPSB2aWFDcmVhdGVDb250ZXh0LAotICAgLkRlc3Ryb3lDb250ZXh0ICA9IHZpYURlc3Ryb3lDb250ZXh0LAotICAgLkNyZWF0ZUJ1ZmZlciAgICA9IHZpYUNyZWF0ZUJ1ZmZlciwKLSAgIC5EZXN0cm95QnVmZmVyICAgPSB2aWFEZXN0cm95QnVmZmVyLAotICAgLlN3YXBCdWZmZXJzICAgICA9IHZpYVN3YXBCdWZmZXJzLAotICAgLk1ha2VDdXJyZW50ICAgICA9IHZpYU1ha2VDdXJyZW50LAotICAgLlVuYmluZENvbnRleHQgICA9IHZpYVVuYmluZENvbnRleHQsCi0gICAuR2V0U3dhcEluZm8gICAgID0gZ2V0U3dhcEluZm8sCi0gICAuR2V0TVNDICAgICAgICAgID0gZHJpR2V0TVNDMzIsCi0gICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAotICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCi0gICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAotfTsKLQotCi1zdGF0aWMgX19HTGNvbnRleHRNb2RlcyAqCi12aWFGaWxsSW5Nb2RlcyggdW5zaWduZWQgcGl4ZWxfYml0cywgR0xib29sZWFuIGhhdmVfYmFja19idWZmZXIgKQorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCit2aWFGaWxsSW5Nb2RlcyggX19EUklzY3JlZW5Qcml2YXRlICpwc3AsCisJCXVuc2lnbmVkIHBpeGVsX2JpdHMsIEdMYm9vbGVhbiBoYXZlX2JhY2tfYnVmZmVyICkKIHsKLSAgICBfX0dMY29udGV4dE1vZGVzICogbW9kZXM7Ci0gICAgX19HTGNvbnRleHRNb2RlcyAqIG07Ci0gICAgdW5zaWduZWQgbnVtX21vZGVzOworICAgIF9fRFJJY29uZmlnICoqY29uZmlnczsKICAgICBjb25zdCB1bnNpZ25lZCBiYWNrX2J1ZmZlcl9mYWN0b3IgPSAoaGF2ZV9iYWNrX2J1ZmZlcikgPyAyIDogMTsKICAgICBHTGVudW0gZmJfZm9ybWF0OwogICAgIEdMZW51bSBmYl90eXBlOwpAQCAtMzY5LDkgKzM0NCw2IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RlbmNpbF9iaXRzX2FycmF5WzRdID0geyAwLCAgMCwgIDgsICAwIH07CiAgICAgY29uc3QgdW5zaWduZWQgZGVwdGhfYnVmZmVyX2ZhY3RvciA9IDM7CiAKLQotICAgIG51bV9tb2RlcyA9IGRlcHRoX2J1ZmZlcl9mYWN0b3IgKiBiYWNrX2J1ZmZlcl9mYWN0b3IgKiA0OwotCiAgICAgaWYgKCBwaXhlbF9iaXRzID09IDE2ICkgewogICAgICAgICBmYl9mb3JtYXQgPSBHTF9SR0I7CiAgICAgICAgIGZiX3R5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKQEAgLTM4MSw5NCArMzUzLDYxIEBACiAgICAgICAgIGZiX3R5cGUgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVY7CiAgICAgfQogCi0gICAgbW9kZXMgPSAoKmRyaV9pbnRlcmZhY2UtPmNyZWF0ZUNvbnRleHRNb2RlcykoIG51bV9tb2Rlcywgc2l6ZW9mKCBfX0dMY29udGV4dE1vZGVzICkgKTsKLSAgICBtID0gbW9kZXM7Ci0gICAgaWYgKCAhIGRyaUZpbGxJbk1vZGVzKCAmIG0sIGZiX2Zvcm1hdCwgZmJfdHlwZSwKLQkJCSAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwgCi0JCQkgICBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9UUlVFX0NPTE9SICkgKSB7Ci0JZnByaW50Ziggc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsCi0JCSBfX2Z1bmNfXywgX19MSU5FX18gKTsKKyAgICBjb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmYl9mb3JtYXQsIGZiX3R5cGUsCisJCQkgICAgICAgZGVwdGhfYml0c19hcnJheSwgc3RlbmNpbF9iaXRzX2FycmF5LAorCQkJICAgICAgIGRlcHRoX2J1ZmZlcl9mYWN0b3IsIGJhY2tfYnVmZmVyX21vZGVzLAorCQkJICAgICAgIGJhY2tfYnVmZmVyX2ZhY3Rvcik7CisgICAgaWYgKGNvbmZpZ3MgPT0gTlVMTCkgeworCWZwcmludGYoc3RkZXJyLCAiWyVzOiV1XSBFcnJvciBjcmVhdGluZyBGQkNvbmZpZyFcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXyk7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKCAhIGRyaUZpbGxJbk1vZGVzKCAmIG0sIGZiX2Zvcm1hdCwgZmJfdHlwZSwKLQkJCSAgIGRlcHRoX2JpdHNfYXJyYXksIHN0ZW5jaWxfYml0c19hcnJheSwgCi0JCQkgICBkZXB0aF9idWZmZXJfZmFjdG9yLAotCQkJICAgYmFja19idWZmZXJfbW9kZXMsIGJhY2tfYnVmZmVyX2ZhY3RvciwKLQkJCSAgIEdMWF9ESVJFQ1RfQ09MT1IgKSApIHsKLQlmcHJpbnRmKCBzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXyApOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtb2RlczsKKyAgICByZXR1cm4gKGNvbnN0IF9fRFJJY29uZmlnICoqKSBjb25maWdzOwogfQogCiAKIC8qKgotICogVGhpcyBpcyB0aGUgYm9vdHN0cmFwIGZ1bmN0aW9uIGZvciB0aGUgZHJpdmVyLiAgbGliR0wgc3VwcGxpZXMgYWxsIG9mIHRoZQotICogcmVxdWlzaXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0sIGFuZCB0aGUgZHJpdmVyIGluaXRpYWxpemVzIGl0c2VsZi4KLSAqIFRoaXMgcm91dGluZSBhbHNvIGZpbGxzIGluIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVkIHRvIGJ5IFxjIGRyaXZlcl9tb2RlcwotICogd2l0aCB0aGUgXGMgX19HTGNvbnRleHRNb2RlcyB0aGF0IHRoZSBkcml2ZXIgY2FuIHN1cHBvcnQgZm9yIHdpbmRvd3Mgb3IKLSAqIHBidWZmZXJzLgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KICAqIAotICogXHJldHVybiBBIHBvaW50ZXIgdG8gYSBcYyBfX0RSSXNjcmVlblByaXZhdGUgb24gc3VjY2Vzcywgb3IgXGMgTlVMTCBvbiAKLSAqICAgICAgICAgZmFpbHVyZS4KKyAqIFx0b2RvIG1heWJlIGZvbGQgdGhpcyBpbnRvIGludGVsSW5pdERyaXZlcgorICoKKyAqIFxyZXR1cm4gdGhlIF9fR0xjb250ZXh0TW9kZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCiAgKi8KLVBVQkxJQwotdm9pZCAqIF9fZHJpQ3JlYXRlTmV3U2NyZWVuXzIwMDUwNzI3KCBfX0RSSW5hdGl2ZURpc3BsYXkgKmRweSwgaW50IHNjcm4sCi0JCQkgICAgIF9fRFJJc2NyZWVuICpwc2MsCi0JCQkgICAgIGNvbnN0IF9fR0xjb250ZXh0TW9kZXMgKiBtb2RlcywKLQkJCSAgICAgY29uc3QgX19EUkl2ZXJzaW9uICogZGR4X3ZlcnNpb24sCi0JCQkgICAgIGNvbnN0IF9fRFJJdmVyc2lvbiAqIGRyaV92ZXJzaW9uLAotCQkJICAgICBjb25zdCBfX0RSSXZlcnNpb24gKiBkcm1fdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklmcmFtZWJ1ZmZlciAqIGZyYW1lX2J1ZmZlciwKLQkJCSAgICAgZHJtQWRkcmVzcyBwU0FSRUEsIGludCBmZCwgCi0JCQkgICAgIGludCBpbnRlcm5hbF9hcGlfdmVyc2lvbiwKLQkJCSAgICAgY29uc3QgX19EUklpbnRlcmZhY2VNZXRob2RzICogaW50ZXJmYWNlLAotCQkJICAgICBfX0dMY29udGV4dE1vZGVzICoqIGRyaXZlcl9tb2RlcyApCi0JCQkgICAgIAorc3RhdGljIGNvbnN0IF9fRFJJY29uZmlnICoqCit2aWFJbml0U2NyZWVuKF9fRFJJc2NyZWVuUHJpdmF0ZSAqcHNwKQogewotICAgX19EUklzY3JlZW5Qcml2YXRlICpwc3A7CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRkeF9leHBlY3RlZCA9IHsgVklBX0RSSUREWF9WRVJTSU9OX01BSk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJQV9EUklERFhfVkVSU0lPTl9NSU5PUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSUFfRFJJRERYX1ZFUlNJT05fUEFUQ0ggfTsKICAgIHN0YXRpYyBjb25zdCBfX0RSSXZlcnNpb24gZHJpX2V4cGVjdGVkID0geyA0LCAwLCAwIH07CiAgICBzdGF0aWMgY29uc3QgX19EUkl2ZXJzaW9uIGRybV9leHBlY3RlZCA9IHsgMiwgMywgMCB9OwogICAgc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lID0gIlVuaWNocm9tZSI7Ci0KLSAgIGRyaV9pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICBWSUFEUklQdHIgZHJpX3ByaXYgPSAoVklBRFJJUHRyKSBwc3AtPnBEZXZQcml2OwogCiAgICBpZiAoICEgZHJpQ2hlY2tEcmlEZHhEcm1WZXJzaW9uczIoIGRyaXZlcl9uYW1lLAotCQkJCSAgICAgIGRyaV92ZXJzaW9uLCAmIGRyaV9leHBlY3RlZCwKLQkJCQkgICAgICBkZHhfdmVyc2lvbiwgJiBkZHhfZXhwZWN0ZWQsCi0JCQkJICAgICAgZHJtX3ZlcnNpb24sICYgZHJtX2V4cGVjdGVkKSApIHsKKwkJCQkgICAgICAmcHNwLT5kcmlfdmVyc2lvbiwgJiBkcmlfZXhwZWN0ZWQsCisJCQkJICAgICAgJnBzcC0+ZGR4X3ZlcnNpb24sICYgZGR4X2V4cGVjdGVkLAorCQkJCSAgICAgICZwc3AtPmRybV92ZXJzaW9uLCAmIGRybV9leHBlY3RlZCkgKQogICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICAgICAKLSAgIHBzcCA9IF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbihkcHksIHNjcm4sIHBzYywgTlVMTCwKLQkJCQkgIGRkeF92ZXJzaW9uLCBkcmlfdmVyc2lvbiwgZHJtX3ZlcnNpb24sCi0JCQkJICBmcmFtZV9idWZmZXIsIHBTQVJFQSwgZmQsCi0JCQkJICBpbnRlcm5hbF9hcGlfdmVyc2lvbiwgJnZpYUFQSSk7Ci0gICBpZiAoIHBzcCAhPSBOVUxMICkgewotICAgICAgVklBRFJJUHRyIGRyaV9wcml2ID0gKFZJQURSSVB0cikgcHNwLT5wRGV2UHJpdjsKLSAgICAgICpkcml2ZXJfbW9kZXMgPSB2aWFGaWxsSW5Nb2RlcyggZHJpX3ByaXYtPmJ5dGVzUGVyUGl4ZWwgKiA4LAotCQkJCSAgICAgIEdMX1RSVUUgKTsKIAotICAgICAgLyogQ2FsbGluZyBkcmlJbml0RXh0ZW5zaW9ucyBoZXJlLCB3aXRoIGEgTlVMTCBjb250ZXh0IHBvaW50ZXIsIGRvZXMgbm90IGFjdHVhbGx5Ci0gICAgICAgKiBlbmFibGUgdGhlIGV4dGVuc2lvbnMuICBJdCBqdXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIGRpc3BhdGNoIG9mZnNldHMgZm9yIGFsbAotICAgICAgICogdGhlIGV4dGVuc2lvbnMgdGhhdCAqbWlnaHQqIGJlIGVuYWJsZXMgYXJlIGtub3duLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUKLSAgICAgICAqIGRpc3BhdGNoIG9mZnNldHMgbmVlZCB0byBiZSBrbm93biB3aGVuIF9tZXNhX2NvbnRleHRfY3JlYXRlIGlzIGNhbGxlZCwgYnV0IHdlIGNhbid0Ci0gICAgICAgKiBlbmFibGUgdGhlIGV4dGVuc2lvbnMgdW50aWwgd2UgaGF2ZSBhIGNvbnRleHQgcG9pbnRlci4KLSAgICAgICAqCi0gICAgICAgKiBIZWxsbyBjaGlja2VuLiAgSGVsbG8gZWdnLiAgSG93IGFyZSB5b3UgdHdvIHRvZGF5PwotICAgICAgICovCi0gICAgICBkcmlJbml0RXh0ZW5zaW9ucyggTlVMTCwgY2FyZF9leHRlbnNpb25zLCBHTF9GQUxTRSApOwotICAgfQorICAgLyogQ2FsbGluZyBkcmlJbml0RXh0ZW5zaW9ucyBoZXJlLCB3aXRoIGEgTlVMTCBjb250ZXh0IHBvaW50ZXIsCisgICAgKiBkb2VzIG5vdCBhY3R1YWxseSBlbmFibGUgdGhlIGV4dGVuc2lvbnMuICBJdCBqdXN0IG1ha2VzIHN1cmUKKyAgICAqIHRoYXQgYWxsIHRoZSBkaXNwYXRjaCBvZmZzZXRzIGZvciBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdAorICAgICogKm1pZ2h0KiBiZSBlbmFibGVzIGFyZSBrbm93bi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlCisgICAgKiBkaXNwYXRjaCBvZmZzZXRzIG5lZWQgdG8gYmUga25vd24gd2hlbiBfbWVzYV9jb250ZXh0X2NyZWF0ZSBpcworICAgICogY2FsbGVkLCBidXQgd2UgY2FuJ3QgZW5hYmxlIHRoZSBleHRlbnNpb25zIHVudGlsIHdlIGhhdmUgYQorICAgICogY29udGV4dCBwb2ludGVyLgorICAgICoKKyAgICAqIEhlbGxvIGNoaWNrZW4uICBIZWxsbyBlZ2cuICBIb3cgYXJlIHlvdSB0d28gdG9kYXk/CisgICAgKi8KKyAgIGRyaUluaXRFeHRlbnNpb25zKCBOVUxMLCBjYXJkX2V4dGVuc2lvbnMsIEdMX0ZBTFNFICk7CiAKLSAgIHJldHVybiAodm9pZCAqKSBwc3A7CisgICBpZiAoIXZpYUluaXREcml2ZXIocHNwKSkKKyAgICAgICByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuIHZpYUZpbGxJbk1vZGVzKCBwc3AsIGRyaV9wcml2LT5ieXRlc1BlclBpeGVsICogOCwgR0xfVFJVRSApOworCiB9CiAKIApAQCAtNDk3LDMgKzQzNiwyMCBAQAogCiAgICByZXR1cm4gMDsKIH0KKworY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGRyaURyaXZlckFQSSA9IHsKKyAgIC5Jbml0U2NyZWVuICAgICAgPSB2aWFJbml0U2NyZWVuLAorICAgLkRlc3Ryb3lTY3JlZW4gICA9IHZpYURlc3Ryb3lTY3JlZW4sCisgICAuQ3JlYXRlQ29udGV4dCAgID0gdmlhQ3JlYXRlQ29udGV4dCwKKyAgIC5EZXN0cm95Q29udGV4dCAgPSB2aWFEZXN0cm95Q29udGV4dCwKKyAgIC5DcmVhdGVCdWZmZXIgICAgPSB2aWFDcmVhdGVCdWZmZXIsCisgICAuRGVzdHJveUJ1ZmZlciAgID0gdmlhRGVzdHJveUJ1ZmZlciwKKyAgIC5Td2FwQnVmZmVycyAgICAgPSB2aWFTd2FwQnVmZmVycywKKyAgIC5NYWtlQ3VycmVudCAgICAgPSB2aWFNYWtlQ3VycmVudCwKKyAgIC5VbmJpbmRDb250ZXh0ICAgPSB2aWFVbmJpbmRDb250ZXh0LAorICAgLkdldFN3YXBJbmZvICAgICA9IGdldFN3YXBJbmZvLAorICAgLkdldERyYXdhYmxlTVNDICA9IGRyaURyYXdhYmxlR2V0TVNDMzIsCisgICAuV2FpdEZvck1TQyAgICAgID0gZHJpV2FpdEZvck1TQzMyLAorICAgLldhaXRGb3JTQkMgICAgICA9IE5VTEwsCisgICAuU3dhcEJ1ZmZlcnNNU0MgID0gTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfc2NyZWVuLmggYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3NjcmVlbi5oCmluZGV4IDg0YWE1YWUuLmMzZWY3MjIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfc2NyZWVuLmgKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zY3JlZW4uaApAQCAtNzAsNiArNzAsOCBAQAogCiAgICAgLyogQ29uZmlndXJhdGlvbiBjYWNoZSB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgY29udGV4dHMgKi8KICAgICBkcmlPcHRpb25DYWNoZSBvcHRpb25DYWNoZTsKKworICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICpleHRlbnNpb25zWzVdOwogfSB2aWFTY3JlZW5Qcml2YXRlOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfc3Bhbi5jIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zcGFuLmMKaW5kZXggM2ExNmRhZC4uMTVlMjljNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zcGFuLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zcGFuLmMKQEAgLTg2LDYgKzg2LDcgQEAKIAogI2RlZmluZSBMT0NBTF9TVEVOQ0lMX1ZBUlMgTE9DQUxfREVQVEhfVkFSUyAKIAorI2RlZmluZSBWQUxVRV9UWVBFIEdMdXNob3J0CiAKICNkZWZpbmUgV1JJVEVfREVQVEgoX3gsIF95LCBkKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKihHTHVzaG9ydCAqKShidWYgKyAoX3gpICogMiArIChfeSkgKiBkZXB0aF9waXRjaCkgPSBkOwpAQCAtOTgsNiArOTksOCBAQAogCiAvKiAzMiBiaXQgZGVwdGhidWZmZXIgZnVuY3Rpb25zLgogICovCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1aW50CisKICNkZWZpbmUgV1JJVEVfREVQVEgoX3gsIF95LCBkKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKihHTHVpbnQgKikoYnVmICsgKF94KSAqIDQgKyAoX3kpICogZGVwdGhfcGl0Y2gpID0gZDsKIApAQCAtMTExLDYgKzExNCw4IEBACiAKIC8qIDI0LzggYml0IGludGVybGVhdmVkIGRlcHRoL3N0ZW5jaWwgZnVuY3Rpb25zCiAgKi8KKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkgewkJCVwKICAgIEdMdWludCB0bXAgPSAqKEdMdWludCAqKShidWYgKyAoX3gpKjQgKyAoX3kpKmRlcHRoX3BpdGNoKTsJXAogICAgdG1wICY9IDB4MDAwMDAwZmY7CQkJCQlcCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3N0YXRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3N0YXRlLmMKaW5kZXggNWIwNDUzNC4uNzk1NzAwMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV9zdGF0ZS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfc3RhdGUuYwpAQCAtNTExLDkgKzUxMSw5IEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lX18gR0x1aW50IHZpYVBhY2tDb2xvcihHTHVpbnQgYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSBiLCBHTHVieXRlIGEpCitzdGF0aWMgSU5MSU5FIEdMdWludCB2aWFQYWNrQ29sb3IoR0x1aW50IGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIHIsIEdMdWJ5dGUgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGIsIEdMdWJ5dGUgYSkKIHsKICAgICBzd2l0Y2ggKGJwcCkgewogICAgIGNhc2UgMTY6CkBAIC02NTYsMTMgKzY1NiwxOCBAQAogICAgaWYgKCFjdHgtPkRyYXdCdWZmZXIpCiAgICAgICByZXR1cm47CiAKLSAgIHN3aXRjaCAoIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gKSB7Ci0gICBjYXNlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVDoKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzICE9IDEpIHsKKyAgICAgIEZBTExCQUNLKHZtZXNhLCBWSUFfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX1RSVUUpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBzd2l0Y2ggKCBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICkgeworICAgY2FzZSBCVUZGRVJfRlJPTlRfTEVGVDoKICAgICAgIFZJQV9GTFVTSF9ETUEodm1lc2EpOwogICAgICAgdm1lc2EtPmRyYXdCdWZmZXIgPSAmdm1lc2EtPmZyb250OwogICAgICAgRkFMTEJBQ0sodm1lc2EsIFZJQV9GQUxMQkFDS19EUkFXX0JVRkZFUiwgR0xfRkFMU0UpOwogICAgICAgYnJlYWs7Ci0gICBjYXNlIEJVRkZFUl9CSVRfQkFDS19MRUZUOgorICAgY2FzZSBCVUZGRVJfQkFDS19MRUZUOgogICAgICAgVklBX0ZMVVNIX0RNQSh2bWVzYSk7CiAgICAgICB2bWVzYS0+ZHJhd0J1ZmZlciA9ICZ2bWVzYS0+YmFjazsKICAgICAgIEZBTExCQUNLKHZtZXNhLCBWSUFfRkFMTEJBQ0tfRFJBV19CVUZGRVIsIEdMX0ZBTFNFKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfdGV4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3RleC5jCmluZGV4IDAyNjFhM2YuLjE1ZjE1YTggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZHJpL3VuaWNocm9tZS92aWFfdGV4LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV90ZXguYwpAQCAtODIwLDkgKzgyMCw3IEBACiAKICAgIC8qIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwICovCiAgICBpZiAobGV2ZWwgPT0gdGV4T2JqLT5CYXNlTGV2ZWwgJiYgdGV4T2JqLT5HZW5lcmF0ZU1pcG1hcCkgewotICAgICAgX21lc2FfZ2VuZXJhdGVfbWlwbWFwKGN0eCwgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPlRleHR1cmUuVW5pdFtjdHgtPlRleHR1cmUuQ3VycmVudFVuaXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleE9iaik7CisgICAgICBfbWVzYV9nZW5lcmF0ZV9taXBtYXAoY3R4LCB0YXJnZXQsIHRleE9iaik7CiAgICB9CiAKICAgIF9tZXNhX3VubWFwX3RleGltYWdlX3BibyhjdHgsIHBhY2tpbmcpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9kcmkvdW5pY2hyb21lL3ZpYV90cmlzLmMgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3RyaXMuYwppbmRleCA0Y2M3OTQyLi5iOTdkYWNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3RyaXMuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL2RyaS91bmljaHJvbWUvdmlhX3RyaXMuYwpAQCAtNjI1LDEzICs2MjUsMTIgQEAKICAgICB9CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgQ2hvb3NlIHJlbmRlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLQotCiAjZGVmaW5lIF9WSUFfTkVXX1ZFUlRFWCAoX05FV19URVhUVVJFIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIF9ERF9ORVdfU0VQQVJBVEVfU1BFQ1VMQVIgfCAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRERfTkVXX1RSSV9VTkZJTExFRCB8ICAgICAgICAgICAgICAgICBcCkBAIC02NjUsMTQgKzY2NCwxNyBAQAogICAgICAgdm1lc2EtPmRyYXdUcmkgPSB2aWFfZHJhd190cmlhbmdsZTsKICAgIH0KIAotICAgaWYgKGZsYWdzICYgKEFOWV9GQUxMQkFDS19GTEFHU3xBTllfUkFTVEVSX0ZMQUdTKSkgewotICAgICAgaWYgKGZsYWdzICYgRERfVFJJX0xJR0hUX1RXT1NJREUpICAgIGluZGV4IHw9IFZJQV9UV09TSURFX0JJVDsKLSAgICAgIGlmIChmbGFncyAmIEREX1RSSV9PRkZTRVQpICAgICAgICAgICBpbmRleCB8PSBWSUFfT0ZGU0VUX0JJVDsKLSAgICAgIGlmIChmbGFncyAmIEREX1RSSV9VTkZJTExFRCkgICAgICAgICBpbmRleCB8PSBWSUFfVU5GSUxMRURfQklUOwotICAgICAgaWYgKGZsYWdzICYgQU5ZX0ZBTExCQUNLX0ZMQUdTKSAgICAgIGluZGV4IHw9IFZJQV9GQUxMQkFDS19CSVQ7CisgICBpZiAoZmxhZ3MgJiAoQU5ZX0ZBTExCQUNLX0ZMQUdTIHwgQU5ZX1JBU1RFUl9GTEFHUykpIHsKKyAgICAgIGlmIChjdHgtPkxpZ2h0LkVuYWJsZWQgJiYgY3R4LT5MaWdodC5Nb2RlbC5Ud29TaWRlKQorICAgICAgICAgaW5kZXggfD0gVklBX1RXT1NJREVfQklUOworICAgICAgaWYgKGN0eC0+UG9seWdvbi5Gcm9udE1vZGUgIT0gR0xfRklMTCB8fCBjdHgtPlBvbHlnb24uQmFja01vZGUgIT0gR0xfRklMTCkKKyAgICAgICAgIGluZGV4IHw9IFZJQV9VTkZJTExFRF9CSVQ7CisgICAgICBpZiAoZmxhZ3MgJiBERF9UUklfT0ZGU0VUKQorICAgICAgICAgaW5kZXggfD0gVklBX09GRlNFVF9CSVQ7CisgICAgICBpZiAoZmxhZ3MgJiBBTllfRkFMTEJBQ0tfRkxBR1MpCisgICAgICAgICBpbmRleCB8PSBWSUFfRkFMTEJBQ0tfQklUOwogCi0gICAgICAvKiBIb29rIGluIGZhbGxiYWNrcyBmb3Igc3BlY2lmaWMgcHJpbWl0aXZlcy4KLSAgICAgICAqLworICAgICAgLyogSG9vayBpbiBmYWxsYmFja3MgZm9yIHNwZWNpZmljIHByaW1pdGl2ZXMuICovCiAgICAgICBpZiAoZmxhZ3MgJiBQT0lOVF9GQUxMQkFDSykKIAkgdm1lc2EtPmRyYXdQb2ludCA9IHZpYV9mYWxsYmFja19wb2ludDsKICAgICAgIApAQCAtNjgzLDExICs2ODUsOCBAQAogCSB2bWVzYS0+ZHJhd1RyaSA9IHZpYV9mYWxsYmFja190cmk7CiAgICB9CiAKLQotICAgaWYgKChmbGFncyAmIEREX1NFUEFSQVRFX1NQRUNVTEFSKSAmJgotICAgICAgIGN0eC0+TGlnaHQuU2hhZGVNb2RlbCA9PSBHTF9GTEFUKSB7CisgICBpZiAoKGZsYWdzICYgRERfU0VQQVJBVEVfU1BFQ1VMQVIpICYmIGN0eC0+TGlnaHQuU2hhZGVNb2RlbCA9PSBHTF9GTEFUKQogICAgICAgaW5kZXggPSBWSUFfTUFYX1RSSUZVTkM7CS8qIGZsYXQgc3BlY3VsYXIgKi8KLSAgIH0KIAogICAgaWYgKHZtZXNhLT5yZW5kZXJJbmRleCAhPSBpbmRleCkgewogICAgICAgdm1lc2EtPnJlbmRlckluZGV4ID0gaW5kZXg7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2ZiZGV2L01ha2VmaWxlIGIvc3JjL21lc2EvZHJpdmVycy9mYmRldi9NYWtlZmlsZQppbmRleCBjMGVmNTRmLi5lZTczZjI5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2ZiZGV2L01ha2VmaWxlCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZmJkZXYvTWFrZWZpbGUKQEAgLTI1LDggKzI1LDcgQEAKIAogCiAkKFRPUCkvJChMSUJfRElSKS8kKEdMX0xJQl9OQU1FKTogJChDT1JFX01FU0EpICQoT0JKRUNUUykKLQlAICQoVE9QKS9iaW4vbWtsaWIgLW8gJChHTF9MSUIpIFwKLQkJLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCisJQCAkKE1LTElCKSAtbyAkKEdMX0xJQikgLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCiAJCS1tYWpvciAkKE1FU0FfTUFKT1IpIC1taW5vciAkKE1FU0FfTUlOT1IpIC1wYXRjaCAkKE1FU0FfVElOWSkgXAogCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAkKE1LTElCX09QVElPTlMpIFwKIAkJJChDT1JFX01FU0EpICQoT0JKRUNUUykgJChHTF9MSUJfREVQUykKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZmJkZXYvZ2xmYmRldi5jIGIvc3JjL21lc2EvZHJpdmVycy9mYmRldi9nbGZiZGV2LmMKaW5kZXggZTk1YTQyNC4uZjNkYTRhNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9mYmRldi9nbGZiZGV2LmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9mYmRldi9nbGZiZGV2LmMKQEAgLTc5MCw2ICs3OTAsMTEgQEAKICAgIH0KIAogICAgX21lc2FfZW5hYmxlX3N3X2V4dGVuc2lvbnMoZ2xjdHgpOworICAgX21lc2FfZW5hYmxlXzFfM19leHRlbnNpb25zKGdsY3R4KTsKKyAgIF9tZXNhX2VuYWJsZV8xXzRfZXh0ZW5zaW9ucyhnbGN0eCk7CisgICBfbWVzYV9lbmFibGVfMV81X2V4dGVuc2lvbnMoZ2xjdHgpOworICAgX21lc2FfZW5hYmxlXzJfMF9leHRlbnNpb25zKGdsY3R4KTsKKyAgIF9tZXNhX2VuYWJsZV8yXzFfZXh0ZW5zaW9ucyhnbGN0eCk7CiAKICAgIHJldHVybiBjdHg7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL2dsaWRlL2Z4ZGQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvZnhkZC5jCmluZGV4IDRlNTZmN2IuLmMwODJmZDggMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvZnhkZC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvZnhkZC5jCkBAIC0xOTU1LDggKzE5NTUsOCBAQAogICAgICAgcmV0dXJuIEZYX0ZBTExCQUNLX1NURU5DSUw7CiAgICB9CiAKLSAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdICE9IEJVRkZFUl9CSVRfRlJPTlRfTEVGVCAmJgotICAgICAgIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gIT0gQlVGRkVSX0JJVF9CQUNLX0xFRlQpIHsKKyAgIGlmICgoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSAhPSBCVUZGRVJfQklUX0ZST05UX0xFRlQpICYmCisgICAgICAgKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gIT0gQlVGRkVSX0JJVF9CQUNLX0xFRlQpKSB7CiAgICAgICByZXR1cm4gRlhfRkFMTEJBQ0tfRFJBV19CVUZGRVI7CiAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvZnhkZHNwYW4uYyBiL3NyYy9tZXNhL2RyaXZlcnMvZ2xpZGUvZnhkZHNwYW4uYwppbmRleCAzZWE5ZjczLi5kM2E1OGEzIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL2dsaWRlL2Z4ZGRzcGFuLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9nbGlkZS9meGRkc3Bhbi5jCkBAIC0yNzUsNiArMjc1LDggQEAKICN1bmRlZiBCWVRFU1BFUlBJWEVMCiAjZGVmaW5lIEJZVEVTUEVSUElYRUwgMgogCisjZGVmaW5lIFZBTFVFX1RZUEUgR0x1c2hvcnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJCQkJCVwKICAgICAqKEdMdXNob3J0ICopKGJ1ZiArIF94KkJZVEVTUEVSUElYRUwgKyBfeSpwaXRjaCkgPSBkCiAKQEAgLTMwMiw2ICszMDQsOCBAQAogI3VuZGVmIEJZVEVTUEVSUElYRUwKICNkZWZpbmUgQllURVNQRVJQSVhFTCA0CiAKKyNkZWZpbmUgVkFMVUVfVFlQRSBHTHVpbnQKKwogI2RlZmluZSBXUklURV9ERVBUSCggX3gsIF95LCBkICkJCQkJCVwKICAgICAqKEdMdWludCAqKShidWYgKyBfeCpCWVRFU1BFUlBJWEVMICsgX3kqcGl0Y2gpID0gZCA8PCA4CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvZ2xzbGNvbXBpbGVyL01ha2VmaWxlIGIvc3JjL21lc2EvZHJpdmVycy9nbHNsY29tcGlsZXIvTWFrZWZpbGUKaW5kZXggODU4NDU3ZC4uZGM0YWJkNCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9nbHNsY29tcGlsZXIvTWFrZWZpbGUKKysrIGIvc3JjL21lc2EvZHJpdmVycy9nbHNsY29tcGlsZXIvTWFrZWZpbGUKQEAgLTQxLDQgKzQxLDQgQEAKIAogCiBjbGVhbjoKLQlybSAtZiAqLm8gKn4gJChQUk9HUkFNKQorCS1ybSAtZiAqLm8gKn4gJChQUk9HUkFNKQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9vc21lc2EvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9NYWtlZmlsZQppbmRleCBmYThkZmZjLi5kNmExOGIxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9NYWtlZmlsZQpAQCAtNDUsMTEgKzQ1LDEwIEBACiBvc21lc2E4OiAkKFRPUCkvbGliLyQoT1NNRVNBX0xJQl9OQU1FKQogCiAkKFRPUCkvbGliLyQoT1NNRVNBX0xJQl9OQU1FKTogJChPQkpFQ1RTKQotCSQoVE9QKS9iaW4vbWtsaWIgLW8gJChPU01FU0FfTElCKSBcCi0JCS1saW5rZXIgIiQoQ0MpIiBcCisJJChNS0xJQikgLW8gJChPU01FU0FfTElCKSAtbGlua2VyICckKENDKScgLWxkZmxhZ3MgJyQoTERGTEFHUyknIFwKIAkJLW1ham9yICQoTUVTQV9NQUpPUikgLW1pbm9yICQoTUVTQV9NSU5PUikgLXBhdGNoICQoTUVTQV9USU5ZKSBcCi0JCS1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpIFwKLQkJJChNS0xJQl9PUFRJT05TKSBcCisJCS1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpICQoTUtMSUJfT1BUSU9OUykgXAorCQktaWQgJChJTlNUQUxMX0xJQl9ESVIpL2xpYiQoT1NNRVNBX0xJQikuJChNRVNBX01BSk9SKS5keWxpYiBcCiAJCSQoT1NNRVNBX0xJQl9ERVBTKSAkKE9CSkVDVFMpCiAKIApAQCAtNTgsMTEgKzU3LDEwIEBACiAjIFRoZSBsaWJPU01lc2ExNi9saWJPU01lc2EzMiBsaWJyYXJpZXMgZG8gbm90IHVzZSBsaWJHTCBidXQgcmF0aGVyIGFyZSBidWlsdAogIyB3aXRoIGFsbCB0aGUgb3RoZXIgTWVzYSBzb3VyY2VzIChjb21waWxlZCB3aXRoIC1EQ0hBTl9CSVRTPTE2LzMyCiBvc21lc2ExNjogJChPQkpFQ1RTKSAkKENPUkVfTUVTQSkKLQkkKFRPUCkvYmluL21rbGliIC1vICQoT1NNRVNBX0xJQikgXAotCQktbGlua2VyICIkKENDKSIgXAorCSQoTUtMSUIpIC1vICQoT1NNRVNBX0xJQikgLWxpbmtlciAnJChDQyknIC1sZGZsYWdzICckKExERkxBR1MpJyBcCiAJCS1tYWpvciAkKE1FU0FfTUFKT1IpIC1taW5vciAkKE1FU0FfTUlOT1IpIC1wYXRjaCAkKE1FU0FfVElOWSkgXAotCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSBcCi0JCSQoTUtMSUJfT1BUSU9OUykgXAorCQktaW5zdGFsbCAkKFRPUCkvJChMSUJfRElSKSAkKE1LTElCX09QVElPTlMpIFwKKwkJLWlkICQoSU5TVEFMTF9MSUJfRElSKS9saWIkKE9TTUVTQV9MSUIpLiQoTUVTQV9NQUpPUikuZHlsaWIgXAogCQkkKE9TTUVTQV9MSUJfREVQUykgJChPQkpFQ1RTKSAkKENPUkVfTUVTQSkKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9kZXNjcmlwLm1tcyBiL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmYzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDQ1IEBACisjIE1ha2VmaWxlIGZvciBjb3JlIGxpYnJhcnkgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCByZXZpc2lvbiA6IDMgT2N0b2JlciAyMDA3CisKKy5maXJzdAorCWRlZmluZSBnbCBbLS0tLS5pbmNsdWRlLmdsXQorCWRlZmluZSBtYXRoIFstLS5tYXRoXQorCWRlZmluZSB0bmwgWy0tLnRubF0KKwlkZWZpbmUgdmJvIFstLS52Ym9dCisJZGVmaW5lIHN3cmFzdCBbLS0uc3dyYXN0XQorCWRlZmluZSBzd3Jhc3Rfc2V0dXAgWy0tLnN3cmFzdF9zZXR1cF0KKwlkZWZpbmUgYXJyYXlfY2FjaGUgWy0tLmFycmF5X2NhY2hlXQorCWRlZmluZSBkcml2ZXJzIFstXQorCWRlZmluZSBnbGFwaSBbLS0uZ2xhcGldCisJZGVmaW5lIG1haW4gWy0tLm1haW5dCisJZGVmaW5lIHNoYWRlciBbLS0uc2hhZGVyXQorCisuaW5jbHVkZSBbLS0tLV1tbXMtY29uZmlnLgorCisjIyMjIyBNQUNST1MgIyMjIyMKKworVlBBVEggPSBSQ1MKKworSU5DRElSID0gWy0tLS0uaW5jbHVkZV0sWy0tLm1haW5dLFstLS5nbGFwaV0sWy0tLnNoYWRlcl0KK0xJQkRJUiA9IFstLS0tLmxpYl0KK0NGTEFHUyA9IC9pbmNsdWRlPSgkKElOQ0RJUiksW10pL2RlZmluZT0oUFRIUkVBRFM9MSkvbmFtZT0oYXNfaXMsc2hvcnQpL2Zsb2F0PWllZWUvaWVlZT1kZW5vcm0KKworU09VUkNFUyA9IG9zbWVzYS5jCisKK09CSkVDVFMgPSBvc21lc2Eub2JqCisKKyMjIyMjIFJVTEVTICMjIyMjCisKK1ZFUlNJT049TWVzYSBWMy40CisKKyMjIyMjIFRBUkdFVFMgIyMjIyMKKyMgTWFrZSB0aGUgbGlicmFyeQorJChMSUJESVIpJChHTF9MSUIpIDogJChPQkpFQ1RTKQorICBAIGxpYnJhcnkgJChMSUJESVIpJChHTF9MSUIpICQoT0JKRUNUUykKKworY2xlYW4gOgorCXB1cmdlCisJZGVsZXRlICoub2JqOyoKKworb3NtZXNhLm9iaiA6IG9zbWVzYS5jCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL29zbWVzYS9vc21lc2EuYyBiL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL29zbWVzYS5jCmluZGV4IDM5OTk5N2IuLmYyMzY3YmIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL29zbWVzYS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvb3NtZXNhL29zbWVzYS5jCkBAIC0xMjI2LDYgKzEyMjYsOCBAQAogICAgICAgX21lc2FfZW5hYmxlXzFfM19leHRlbnNpb25zKCYob3NtZXNhLT5tZXNhKSk7CiAgICAgICBfbWVzYV9lbmFibGVfMV80X2V4dGVuc2lvbnMoJihvc21lc2EtPm1lc2EpKTsKICAgICAgIF9tZXNhX2VuYWJsZV8xXzVfZXh0ZW5zaW9ucygmKG9zbWVzYS0+bWVzYSkpOworICAgICAgX21lc2FfZW5hYmxlXzJfMF9leHRlbnNpb25zKCYob3NtZXNhLT5tZXNhKSk7CisgICAgICBfbWVzYV9lbmFibGVfMl8xX2V4dGVuc2lvbnMoJihvc21lc2EtPm1lc2EpKTsKIAogICAgICAgb3NtZXNhLT5nbF9idWZmZXIgPSBfbWVzYV9jcmVhdGVfZnJhbWVidWZmZXIob3NtZXNhLT5nbF92aXN1YWwpOwogICAgICAgaWYgKCFvc21lc2EtPmdsX2J1ZmZlcikgewpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy9zdmdhL3N2Z2FtZXNhMjQuYyBiL3NyYy9tZXNhL2RyaXZlcnMvc3ZnYS9zdmdhbWVzYTI0LmMKaW5kZXggYzdjMDk1My4uZjJlYzljMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy9zdmdhL3N2Z2FtZXNhMjQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL3N2Z2Evc3ZnYW1lc2EyNC5jCkBAIC0zOSw3ICszOSw3IEBACiAKICNpZiAwCiAvKiB0aGlzIGRvZXNuJ3QgY29tcGlsZSB3aXRoIEdDQyBvbiBSZWRIYXQgNi4xICovCi1zdGF0aWMgaW5saW5lIGludCBSR0IyQkdSMjQoaW50IGMpCitzdGF0aWMgSU5MSU5FIGludCBSR0IyQkdSMjQoaW50IGMpCiB7CiAJYXNtKCJyb3J3ICAkOCwgJTBcbiIJIAogCSAgICAicm9ybCAkMTYsICUwXG4iCSAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvc3ZnYS9zdmdhbWVzYTMyLmMgYi9zcmMvbWVzYS9kcml2ZXJzL3N2Z2Evc3ZnYW1lc2EzMi5jCmluZGV4IGQwODljMjAuLjhlZWEzY2IgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMvc3ZnYS9zdmdhbWVzYTMyLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy9zdmdhL3N2Z2FtZXNhMzIuYwpAQCAtMzksNyArMzksNyBAQAogCiAjaWYgMAogLyogdGhpcyBkb2Vzbid0IGNvbXBpbGUgd2l0aCBHQ0Mgb24gUmVkSGF0IDYuMSAqLwotc3RhdGljIGlubGluZSBpbnQgUkdCMkJHUjMyKGludCBjKQorc3RhdGljIElOTElORSBpbnQgUkdCMkJHUjMyKGludCBjKQogewogCWFzbSgicm9ydyAgJDgsICUwXG4iCSAKIAkgICAgInJvcmwgJDE2LCAlMFxuIgkgCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvZ2RpL21lc2EuZGVmIGIvc3JjL21lc2EvZHJpdmVycy93aW5kb3dzL2dkaS9tZXNhLmRlZgppbmRleCBjNTI1OTQ1Li4zZjJkNjQ0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvZ2RpL21lc2EuZGVmCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvd2luZG93cy9nZGkvbWVzYS5kZWYKQEAgLTg2Nyw4ICs4NjcsNiBAQAogCV9nbGFwaV9nZXRfcHJvY19hZGRyZXNzCiAJX21lc2FfYWRkX3NvZnRfcmVuZGVyYnVmZmVycwogCV9tZXNhX2FkZF9yZW5kZXJidWZmZXIKLQlfbWVzYV9hdHRhY2hfc2hhZGVyCi0JX21lc2FfYmluZF9hdHRyaWJfbG9jYXRpb24KIAlfbWVzYV9idWZmZXJfZGF0YQogCV9tZXNhX2J1ZmZlcl9nZXRfc3ViZGF0YQogCV9tZXNhX2J1ZmZlcl9tYXAKQEAgLTg3NywyNCArODc1LDIwIEBACiAJX21lc2FfYnplcm8KIAlfbWVzYV9jYWxsb2MKIAlfbWVzYV9jaG9vc2VfdGV4X2Zvcm1hdAotCV9tZXNhX2NvbXBpbGVfc2hhZGVyCiAJX21lc2FfY29tcHJlc3NlZF90ZXh0dXJlX3NpemUKIAlfbWVzYV9jcmVhdGVfZnJhbWVidWZmZXIKLQlfbWVzYV9jcmVhdGVfcHJvZ3JhbQotCV9tZXNhX2NyZWF0ZV9zaGFkZXIKIAlfbWVzYV9jcmVhdGVfdmlzdWFsCiAJX21lc2FfZGVsZXRlX2FycmF5X29iamVjdAogCV9tZXNhX2RlbGV0ZV9idWZmZXJfb2JqZWN0CiAJX21lc2FfZGVsZXRlX3Byb2dyYW0KLQlfbWVzYV9kZWxldGVfcHJvZ3JhbTIKLQlfbWVzYV9kZWxldGVfc2hhZGVyCiAJX21lc2FfZGVsZXRlX3RleHR1cmVfb2JqZWN0CiAJX21lc2FfZGVzdHJveV9mcmFtZWJ1ZmZlcgogCV9tZXNhX2Rlc3Ryb3lfdmlzdWFsCi0JX21lc2FfZGV0YWNoX3NoYWRlcgogCV9tZXNhX2VuYWJsZV8xXzNfZXh0ZW5zaW9ucwogCV9tZXNhX2VuYWJsZV8xXzRfZXh0ZW5zaW9ucwogCV9tZXNhX2VuYWJsZV8xXzVfZXh0ZW5zaW9ucworCV9tZXNhX2VuYWJsZV8yXzBfZXh0ZW5zaW9ucworCV9tZXNhX2VuYWJsZV8yXzFfZXh0ZW5zaW9ucwogCV9tZXNhX2VuYWJsZV9zd19leHRlbnNpb25zCiAJX21lc2FfZXJyb3IKIAlfbWVzYV9maW5pc2hfcmVuZGVyX3RleHR1cmUKQEAgLTkwMiwyOCArODk2LDE1IEBACiAJX21lc2FfZnJlZQogCV9tZXNhX2ZyZWVfY29udGV4dF9kYXRhCiAJX21lc2FfZnJlZV90ZXh0dXJlX2ltYWdlX2RhdGEKLQlfbWVzYV9nZXRfYWN0aXZlX2F0dHJpYgotCV9tZXNhX2dldF9hY3RpdmVfdW5pZm9ybSAKLQlfbWVzYV9nZXRfYXR0YWNoZWRfc2hhZGVycwotCV9tZXNhX2dldF9hdHRyaWJfbG9jYXRpb24KKwlfbWVzYV9nZW5lcmF0ZV9taXBtYXAKIAlfbWVzYV9nZXRfY29tcHJlc3NlZF90ZXhpbWFnZQogCV9tZXNhX2dldF9jdXJyZW50X2NvbnRleHQKLQlfbWVzYV9nZXRfaGFuZGxlCi0JX21lc2FfZ2V0X3Byb2dyYW1pdgotCV9tZXNhX2dldF9wcm9ncmFtX2luZm9fbG9nCiAJX21lc2FfZ2V0X3Byb2dyYW1fcmVnaXN0ZXIKLQlfbWVzYV9nZXRfc2hhZGVyaXYKLQlfbWVzYV9nZXRfc2hhZGVyX2luZm9fbG9nCi0JX21lc2FfZ2V0X3NoYWRlcl9zb3VyY2UKIAlfbWVzYV9nZXRfdGV4aW1hZ2UKLQlfbWVzYV9nZXRfdW5pZm9ybWZ2Ci0JX21lc2FfZ2V0X3VuaWZvcm1fbG9jYXRpb24KIAlfbWVzYV9pbml0X2RyaXZlcl9mdW5jdGlvbnMKKwlfbWVzYV9pbml0X2dsc2xfZHJpdmVyX2Z1bmN0aW9ucwogCV9tZXNhX2luaXRfcmVuZGVyYnVmZmVyCiAJX21lc2FfaW5pdGlhbGl6ZV9jb250ZXh0Ci0JX21lc2FfaXNfcHJvZ3JhbQotCV9tZXNhX2lzX3NoYWRlcgotCV9tZXNhX2xpbmtfcHJvZ3JhbQogCV9tZXNhX21ha2VfY3VycmVudAogCV9tZXNhX21lbWNweQogCV9tZXNhX21lbXNldApAQCAtOTQyLDcgKzkyMyw2IEBACiAJX21lc2FfcmVuZGVyX3RleHR1cmUKIAlfbWVzYV9SZXNpemVCdWZmZXJzTUVTQQogCV9tZXNhX3Jlc2l6ZV9mcmFtZWJ1ZmZlcgotCV9tZXNhX3NoYWRlcl9zb3VyY2UKIAlfbWVzYV9zdG9yZV9jb21wcmVzc2VkX3RleGltYWdlMWQKIAlfbWVzYV9zdG9yZV9jb21wcmVzc2VkX3RleGltYWdlMmQKIAlfbWVzYV9zdG9yZV9jb21wcmVzc2VkX3RleGltYWdlM2QKQEAgLTk1NywxMiArOTM3LDkgQEAKIAlfbWVzYV9zdG9yZV90ZXhzdWJpbWFnZTNkCiAJX21lc2Ffc3RyY21wCiAJX21lc2FfdGVzdF9wcm94eV90ZXhpbWFnZQotCV9tZXNhX3VuaWZvcm0KLQlfbWVzYV91bmlmb3JtX21hdHJpeAogCV9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyCiAJX21lc2FfdXBkYXRlX2ZyYW1lYnVmZmVyX3Zpc3VhbAogCV9tZXNhX3VzZV9wcm9ncmFtCi0JX21lc2FfdmFsaWRhdGVfcHJvZ3JhbQogCV9tZXNhX1ZpZXdwb3J0CiAJX3N3cmFzdF9BY2N1bQogCV9zd3Jhc3RfQml0bWFwCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvZ2RpL3dnbC5jIGIvc3JjL21lc2EvZHJpdmVycy93aW5kb3dzL2dkaS93Z2wuYwppbmRleCA2ZTAwZDA4Li45ZjBiYjkxIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvZ2RpL3dnbC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMvd2luZG93cy9nZGkvd2dsLmMKQEAgLTU0LDcgKzU0LDcgQEAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKICNlbmRpZgotCisjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiZ2xhcGkuaCIKICNpbmNsdWRlICJHTC93bWVzYS5oIiAgIC8qIHByb3RvcyBmb3Igd21lc2EqIGZ1bmN0aW9ucyAqLwogCkBAIC02OSwxMCArNjksMTIgQEAKICAgICBHTGJvb2xlYW4gZG91YmxlQnVmZmVyZWQ7CiB9OwogCisKKwogLyogVGhlc2UgYXJlIHRoZSBQRkQncyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuICovCiBzdHJ1Y3QgX19waXhlbGZvcm1hdF9fCXBmZFtdID0KIHsKLSNpZiAwCisjaWYgMCAKICAgICAvKiBEb3VibGUgQnVmZmVyLCBhbHBoYSAqLwogICAgIHsJCiAJewkKQEAgLTg2LDcgKzg4LDcgQEAKIAkgICAgOCwgMTYsCQogCSAgICA4LCAyNCwKIAkgICAgMCwgMCwgMCwgMCwgMCwJCi0JICAgIDE2LAk4LAkKKwkgICAgREVGQVVMVF9TT0ZUV0FSRV9ERVBUSF9CSVRTLAk4LAkKIAkgICAgMCwgMCwgMCwJCiAJICAgIDAsIDAsIDAgCiAJfSwKQEAgLTEwNSwxMyArMTA3LDEzIEBACiAJICAgIDgsIDE2LAkKIAkgICAgOCwgMjQsCiAJICAgIDAsIDAsIDAsIDAsCTAsCQotCSAgICAxNiwJOCwKKwkgICAgREVGQVVMVF9TT0ZUV0FSRV9ERVBUSF9CSVRTLAk4LAkKIAkgICAgMCwgMCwgMCwJCiAJICAgIDAsIDAsIDAKIAl9LAogICAgICAgICBHTF9GQUxTRQogICAgIH0sCi0jZW5kaWYKKyNlbmRpZiAKICAgICAvKiBEb3VibGUgQnVmZmVyLCBubyBhbHBoYSAqLwogICAgIHsJCiAJewkKQEAgLTEyNSw3ICsxMjcsNyBAQAogCSAgICA4LCAxNiwKIAkgICAgMCwgMCwKIAkgICAgMCwgMCwgMCwgMCwJMCwKLQkgICAgMTYsCTgsCisJICAgIERFRkFVTFRfU09GVFdBUkVfREVQVEhfQklUUywJOCwJCiAJICAgIDAsIDAsIDAsIAogCSAgICAwLCAwLCAwIAogCX0sCkBAIC0xNDQsNyArMTQ2LDcgQEAKIAkgICAgOCwgMTYsCiAJICAgIDAsIDAsCiAJICAgIDAsIDAsIDAsIDAsCTAsCi0JICAgIDE2LAk4LAorCSAgICBERUZBVUxUX1NPRlRXQVJFX0RFUFRIX0JJVFMsCTgsCQogCSAgICAwLCAwLCAwLAogCSAgICAwLCAwLCAwIAogCX0sCkBAIC01NzgsNiArNTgwLDEzIEBACiAgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKK1dJTkdESUFQSSBCT09MIEdMQVBJRU5UUlkgd2dsU2hhcmVMaXN0cyhIR0xSQyBoZ2xyYzEsCisJCQkJCUhHTFJDIGhnbHJjMikKK3sKKyAgICBXTWVzYVNoYXJlTGlzdHMoKFdNZXNhQ29udGV4dCloZ2xyYzEsIChXTWVzYUNvbnRleHQpaGdscmMyKTsKKyAgICByZXR1cm4oVFJVRSk7Cit9CisKIAogCiAvKiBOT1QgSU1QTEVNRU5URUQgWUVUICovCkBAIC01OTcsMTMgKzYwNiw2IEBACiAgICAgcmV0dXJuKE5VTEwpOwogfQogCi1XSU5HRElBUEkgQk9PTCBHTEFQSUVOVFJZIHdnbFNoYXJlTGlzdHMoSEdMUkMgaGdscmMxLAotCQkJCQlIR0xSQyBoZ2xyYzIpCi17Ci0gICAgKHZvaWQpIGhnbHJjMTsgKHZvaWQpIGhnbHJjMjsKLSAgICByZXR1cm4oVFJVRSk7Ci19Ci0KIAogV0lOR0RJQVBJIEJPT0wgR0xBUElFTlRSWSB3Z2xVc2VGb250Qml0bWFwc1coSERDIGhkYywKIAkJCQkJICAgICBEV09SRCBmaXJzdCwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMvd2luZG93cy9nZGkvd21lc2EuYyBiL3NyYy9tZXNhL2RyaXZlcnMvd2luZG93cy9nZGkvd21lc2EuYwppbmRleCA1YjY3NDM5Li4xYzE3OWViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3dpbmRvd3MvZ2RpL3dtZXNhLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy93aW5kb3dzL2dkaS93bWVzYS5jCkBAIC00NTgsMjMgKzQ1OCw4NCBAQAogCQkJCSAgIGNvbnN0IEdMdWJ5dGUgcmdiYVtdWzRdLCAKIAkJCQkgICBjb25zdCBHTHVieXRlIG1hc2tbXSApCiB7Ci0gICAgV01lc2FDb250ZXh0IHB3YyA9IHdtZXNhX2NvbnRleHQoY3R4KTsKLSAgICBHTHVpbnQgaTsKLSAgICAKLSAgICAodm9pZCkgY3R4OwotICAgIHk9RkxJUCh5KTsKLSAgICBpZiAobWFzaykgewotCWZvciAoaT0wOyBpPG47IGkrKykKLQkgICAgaWYgKG1hc2tbaV0pCi0JCVNldFBpeGVsKHB3Yy0+aERDLCB4K2ksIHksIFJHQihyZ2JhW2ldW1JDT01QXSwgcmdiYVtpXVtHQ09NUF0sIAotCQkJCQkgICAgICAgcmdiYVtpXVtCQ09NUF0pKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZm9yIChpPTA7IGk8bjsgaSsrKQotCSAgICBTZXRQaXhlbChwd2MtPmhEQywgeCtpLCB5LCBSR0IocmdiYVtpXVtSQ09NUF0sIHJnYmFbaV1bR0NPTVBdLCAKLQkJCQkJICAgcmdiYVtpXVtCQ09NUF0pKTsKLSAgICB9Ci0gICAgCisgICBXTWVzYUNvbnRleHQgcHdjID0gd21lc2FfY29udGV4dChjdHgpOworICAgV01lc2FGcmFtZWJ1ZmZlciBwd2ZiID0gd21lc2FfbG9va3VwX2ZyYW1lYnVmZmVyKHB3Yy0+aERDKTsKKyAgIENPTlNUIEJJVE1BUElORk8gYm1pPQorICAgeworICAgICAgeworICAgICAgICAgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLAorICAgICAgICAgbiwgMSwgMSwgMzIsIEJJX1JHQiwgMCwgMSwgMSwgMCwgMAorICAgICAgfQorICAgfTsKKyAgIEhCSVRNQVAgYm1wPTA7CisgICBIREMgbWRjPTA7CisgICB0eXBlZGVmIHVuaW9uCisgICB7CisgICAgICB1bnNpZ25lZCBpOworICAgICAgc3RydWN0IHsKKyAgICAgICAgIHVuc2lnbmVkIGI6OCwgZzo4LCByOjgsIGE6ODsKKyAgICAgIH07CisgICB9IEJHUkE7CisgICBCR1JBICpiZ3JhLCBjOworICAgaW50IGk7CisKKyAgIGlmIChuIDwgMTYpIHsgICAvLyB0aGUgdmFsdWUgMTYgaXMganVzdCBndWVzc2VkCisgICAgICB5PUZMSVAoeSk7CisgICAgICBpZiAobWFzaykgeworICAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKQorICAgICAgICAgICAgaWYgKG1hc2tbaV0pCisgICAgICAgICAgICAgICBTZXRQaXhlbChwd2MtPmhEQywgeCtpLCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgUkdCKHJnYmFbaV1bUkNPTVBdLCByZ2JhW2ldW0dDT01QXSwgcmdiYVtpXVtCQ09NUF0pKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKQorICAgICAgICAgICAgU2V0UGl4ZWwocHdjLT5oREMsIHgraSwgeSwKKyAgICAgICAgICAgICAgICAgICAgIFJHQihyZ2JhW2ldW1JDT01QXSwgcmdiYVtpXVtHQ09NUF0sIHJnYmFbaV1bQkNPTVBdKSk7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIGlmICghcHdmYikgeworICAgICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAid21lc2E6IHdyaXRlX3JnYmFfc3Bhbl9mcm9udCBvbiB1bmtub3duIGhkYyIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYmdyYT1tYWxsb2MobipzaXplb2YoQkdSQSkpOworICAgICAgaWYgKCFiZ3JhKSB7CisgICAgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsICJ3bWVzYTogd3JpdGVfcmdiYV9zcGFuX2Zyb250OiBvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjLmE9MDsKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtYXNrW2ldKSB7CisgICAgICAgICAgICAgICBjLnI9cmdiYVtpXVtSQ09NUF07CisgICAgICAgICAgICAgICBjLmc9cmdiYVtpXVtHQ09NUF07CisgICAgICAgICAgICAgICBjLmI9cmdiYVtpXVtCQ09NUF07CisgICAgICAgICAgICAgICBjLmE9cmdiYVtpXVtBQ09NUF07CisgICAgICAgICAgICAgICBiZ3JhW2ldPWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBiZ3JhW2ldLmk9MDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICBjLnI9cmdiYVtpXVtSQ09NUF07CisgICAgICAgICAgICBjLmc9cmdiYVtpXVtHQ09NUF07CisgICAgICAgICAgICBjLmI9cmdiYVtpXVtCQ09NUF07CisgICAgICAgICAgICBjLmE9cmdiYVtpXVtBQ09NUF07CisgICAgICAgICAgICBiZ3JhW2ldPWM7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBibXA9Q3JlYXRlQml0bWFwKG4sIDEsICAxLCAzMiwgYmdyYSk7CisgICAgICBtZGM9Q3JlYXRlQ29tcGF0aWJsZURDKHB3ZmItPmhEQyk7CisgICAgICBTZWxlY3RPYmplY3QobWRjLCBibXApOworICAgICAgeT1GTElQKHkpOworICAgICAgQml0Qmx0KHB3ZmItPmhEQywgeCwgeSwgbiwgMSwgbWRjLCAwLCAwLCBTUkNDT1BZKTsKKyAgICAgIFNlbGVjdE9iamVjdChtZGMsIDApOworICAgICAgRGVsZXRlT2JqZWN0KGJtcCk7CisgICAgICBEZWxldGVEQyhtZGMpOworICAgICAgZnJlZShiZ3JhKTsKKyAgIH0KIH0KIAogLyogV3JpdGUgYSBob3Jpem9udGFsIHNwYW4gb2YgUkdCIGNvbG9yIHBpeGVscyB3aXRoIGEgYm9vbGVhbiBtYXNrLiAqLwpAQCAtMTQwMSw2ICsxNDYyLDExIEBACiAgICAgfQogfQogCit2b2lkIFdNZXNhU2hhcmVMaXN0cyhXTWVzYUNvbnRleHQgY3R4X3RvX3NoYXJlLCBXTWVzYUNvbnRleHQgY3R4KQoreworCV9tZXNhX3NoYXJlX3N0YXRlKCZjdHgtPmdsX2N0eCwgJmN0eF90b19zaGFyZS0+Z2xfY3R4KTsJCit9CisKIC8qIFRoaXMgaXMgaG9wZWZ1bGx5IGEgdGVtcG9yYXJ5IGhhY2sgdG8gZGVmaW5lIHNvbWUgbmVlZGVkIGRpc3BhdGNoCiAgKiB0YWJsZSBlbnRyaWVzLiAgSG9wZWZ1bGx5LCBJJ2xsIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24uICBUaGUKICAqIGRpc3BhdGNoIHRhYmxlIGdlbmVyYXRpb24gc2NyaXB0cyBvdWdodCB0byBiZSBtYWtpbmcgdGhlc2UgZHVtbXkKQEAgLTE0MzksMTUgKzE1MDUsMTkgQEAKIHZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl82NTEodm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzY1Mih2b2lkKXt9CiB2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNjUzKHZvaWQpe30KK3ZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83MzModm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzczNCh2b2lkKXt9CiB2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNzM1KHZvaWQpe30KIHZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83MzYodm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzczNyh2b2lkKXt9CiB2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNzM4KHZvaWQpe30KK3ZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83NDQodm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzc0NSh2b2lkKXt9CiB2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNzQ2KHZvaWQpe30KIHZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83NjAodm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzc2MSh2b2lkKXt9Cit2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNzYzKHZvaWQpe30KK3ZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83NjUodm9pZCl7fQogdm9pZCBnbF9kaXNwYXRjaF9zdHViXzc2Nih2b2lkKXt9CiB2b2lkIGdsX2Rpc3BhdGNoX3N0dWJfNzY3KHZvaWQpe30KIHZvaWQgZ2xfZGlzcGF0Y2hfc3R1Yl83Njgodm9pZCl7fQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy94MTEvTWFrZWZpbGUgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS9NYWtlZmlsZQppbmRleCA1MTIyNmVlLi5kMjc4MGU2IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS9NYWtlZmlsZQpAQCAtNTUsMTEgKzU1LDExIEBACiAKIAogJChUT1ApLyQoTElCX0RJUikvJChHTF9MSUJfTkFNRSk6ICQoT0JKRUNUUykgJChDT1JFX01FU0EpCi0JQCAkKFRPUCkvYmluL21rbGliIC1vICQoR0xfTElCKSBcCi0JCS1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAorCUAgJChNS0xJQikgLW8gJChHTF9MSUIpIC1saW5rZXIgJyQoQ0MpJyAtbGRmbGFncyAnJChMREZMQUdTKScgXAogCQktbWFqb3IgJChHTF9NQUpPUikgLW1pbm9yICQoR0xfTUlOT1IpIC1wYXRjaCAkKEdMX1RJTlkpIFwKLQkJLWluc3RhbGwgJChUT1ApLyQoTElCX0RJUikgXAotCQkkKE1LTElCX09QVElPTlMpICQoR0xfTElCX0RFUFMpICQoT0JKRUNUUykgJChDT1JFX01FU0EpCisJCS1pbnN0YWxsICQoVE9QKS8kKExJQl9ESVIpICQoTUtMSUJfT1BUSU9OUykgXAorCQktaWQgJChJTlNUQUxMX0xJQl9ESVIpL2xpYiQoR0xfTElCKS4kKEdMX01BSk9SKS5keWxpYiBcCisJCSQoR0xfTElCX0RFUFMpICQoT0JKRUNUUykgJChDT1JFX01FU0EpCiAKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS9kZXNjcmlwLm1tcyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGY2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDU1IEBACisjIE1ha2VmaWxlIGZvciBjb3JlIGxpYnJhcnkgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCByZXZpc2lvbiA6IDMgT2N0b2JlciAyMDA3CisKKy5maXJzdAorCWRlZmluZSBnbCBbLS0tLS5pbmNsdWRlLmdsXQorCWRlZmluZSBtYXRoIFstLS5tYXRoXQorCWRlZmluZSB0bmwgWy0tLnRubF0KKwlkZWZpbmUgdmJvIFstLS52Ym9dCisJZGVmaW5lIHN3cmFzdCBbLS0uc3dyYXN0XQorCWRlZmluZSBzd3Jhc3Rfc2V0dXAgWy0tLnN3cmFzdF9zZXR1cF0KKwlkZWZpbmUgYXJyYXlfY2FjaGUgWy0tLmFycmF5X2NhY2hlXQorCWRlZmluZSBkcml2ZXJzIFstXQorCWRlZmluZSBnbGFwaSBbLS0uZ2xhcGldCisJZGVmaW5lIG1haW4gWy0tLm1haW5dCisJZGVmaW5lIHNoYWRlciBbLS0uc2hhZGVyXQorCisuaW5jbHVkZSBbLS0tLV1tbXMtY29uZmlnLgorCisjIyMjIyBNQUNST1MgIyMjIyMKKworVlBBVEggPSBSQ1MKKworSU5DRElSID0gWy0tLS0uaW5jbHVkZV0sWy0tLm1haW5dLFstLS5nbGFwaV0sWy0tLnNoYWRlcl0KK0xJQkRJUiA9IFstLS0tLmxpYl0KK0NGTEFHUyA9L2luY2x1ZGU9KCQoSU5DRElSKSxbXSkvZGVmaW5lPShQVEhSRUFEUz0xKS9uYW1lPShhc19pcyxzaG9ydCkvZmxvYXQ9aWVlZS9pZWVlPWRlbm9ybQorCitTT1VSQ0VTID0gZmFrZWdseC5jIGdseGFwaS5jIHhmb250cy5jIHhtX2FwaS5jIHhtX2RkLmMgeG1fbGluZS5jIHhtX3NwYW4uY1wKKwl4bV90cmkuYyB4bV9idWZmZXIuYworCitPQkpFQ1RTID1mYWtlZ2x4Lm9iaixnbHhhcGkub2JqLHhmb250cy5vYmoseG1fYXBpLm9iaix4bV9kZC5vYmoseG1fbGluZS5vYmosXAorCXhtX3NwYW4ub2JqLHhtX3RyaS5vYmoseG1fYnVmZmVyLm9iagorCisjIyMjIyBSVUxFUyAjIyMjIworCitWRVJTSU9OPU1lc2EgVjMuNAorCisjIyMjIyBUQVJHRVRTICMjIyMjCisjIE1ha2UgdGhlIGxpYnJhcnkKKyQoTElCRElSKSQoR0xfTElCKSA6ICQoT0JKRUNUUykKKyAgQCBsaWJyYXJ5ICQoTElCRElSKSQoR0xfTElCKSAkKE9CSkVDVFMpCisKK2NsZWFuIDoKKwlwdXJnZQorCWRlbGV0ZSAqLm9iajsqCisKK2Zha2VnbHgub2JqIDogZmFrZWdseC5jCitnbHhhcGkub2JqIDogZ2x4YXBpLmMKK3hmb250cy5vYmogOiB4Zm9udHMuYworeG1fYXBpLm9iaiA6IHhtX2FwaS5jCit4bV9idWZmZXIub2JqIDogeG1fYnVmZmVyLmMKK3htX2RkLm9iaiA6IHhtX2RkLmMKK3htX2xpbmUub2JqIDogeG1fbGluZS5jCit4bV9zcGFuLm9iaiA6IHhtX3NwYW4uYworeG1fdHJpLm9iaiA6IHhtX3RyaS5jCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS9mYWtlZ2x4LmMgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS9mYWtlZ2x4LmMKaW5kZXggN2ExNzBiNC4uZTVjZDhmMCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy94MTEvZmFrZWdseC5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL2Zha2VnbHguYwpAQCAtMTE4MywxMSArMTE4MywxMiBAQAogICAgICAgICAgICogR0xYX0FSQl9tdWx0aXNhbXBsZQogICAgICAgICAgICovCiAgICAgICAgICBjYXNlIEdMWF9TQU1QTEVfQlVGRkVSU19BUkI6Ci0gICAgICAgICAgICAvKiBtcyBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgIGNhc2UgR0xYX1NBTVBMRVNfQVJCOgotICAgICAgICAgICAgLyogbXMgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJICAgIHBhcnNlbGlzdCsrOworCSAgICBpZiAoKnBhcnNlbGlzdCsrICE9IDApCisJICAgICAgIC8qIG1zIG5vdCBzdXBwb3J0ZWQgKi8KKwkgICAgICAgcmV0dXJuIE5VTEw7CisJICAgIGJyZWFrOwogCiAgICAgICAgICAvKgogICAgICAgICAgICogRkJDb25maWcgYXR0cmlicy4KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMveDExL2dseGFwaS5jIGIvc3JjL21lc2EvZHJpdmVycy94MTEvZ2x4YXBpLmMKaW5kZXggMzA5YTAwMC4uYzJjY2NlNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy94MTEvZ2x4YXBpLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy94MTEvZ2x4YXBpLmMKQEAgLTM0LDggKzM0LDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImdsaGVhZGVyLmgiCi0jaW5jbHVkZSAiZ2xhcGkuaCIKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAiZ2xhcGkvZ2xhcGkuaCIKICNpbmNsdWRlICJnbHhhcGkuaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS9nbHhoZWFkZXIuaCBiL3NyYy9tZXNhL2RyaXZlcnMveDExL2dseGhlYWRlci5oCmluZGV4IGE0MDIxOTEuLjE1ZTgzOTAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMveDExL2dseGhlYWRlci5oCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL2dseGhlYWRlci5oCkBAIC0zNCw2ICszNCw3IEBACiAKICNpZmRlZiBYRnJlZTg2U2VydmVyCiAKKyMgaW5jbHVkZSAieG9yZy1zZXJ2ZXIuaCIKICMgaW5jbHVkZSAicmVzb3VyY2UuaCIKICMgaW5jbHVkZSAid2luZG93c3RyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3NvdXJjZXMgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzZkNjVlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3NvdXJjZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgTm90ZTogb25seSBsaXN0aW5nIHNvdXJjZXMgbmVlZGVkIGZvciBYIHNlcnZlciByZW5kZXJlcgotTUVTQV9EUklWRVJfWDExX1NPVVJDRVMgPSBcCi14bV9hcGkuYyBcCi14bV9idWZmZXIuYyBcCi14bV9kZC5jIFwKLXhtX2xpbmUuYyBcCi14bV9zcGFuLmMgXAoteG1fdHJpLmMKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2FwaS5jIGIvc3JjL21lc2EvZHJpdmVycy94MTEveG1fYXBpLmMKaW5kZXggMThiMDMzNi4uMmViODhjMTUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2FwaS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2FwaS5jCkBAIC02NSwxNCArNjUsMTQgQEAKICNpbmNsdWRlICJnbHhoZWFkZXIuaCIKICNpbmNsdWRlICJHTC94bWVzYS5oIgogI2luY2x1ZGUgInhtZXNhUC5oIgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJleHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKLSNpbmNsdWRlICJnbHRocmVhZC5oIgotI2luY2x1ZGUgImltcG9ydHMuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKLSNpbmNsdWRlICJyZW5kZXJidWZmZXIuaCIKLSNpbmNsdWRlICJ0ZXhpbWFnZS5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorI2luY2x1ZGUgIm1haW4vZXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIm1haW4vZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJnbGFwaS9nbHRocmVhZC5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAibWFpbi9yZW5kZXJidWZmZXIuaCIKKyNpbmNsdWRlICJtYWluL3RleGltYWdlLmgiCiAjaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgogI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKICNpbmNsdWRlICJ2Ym8vdmJvLmgiCkBAIC0xMzM5LDYgKzEzMzksNjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyNpZmRlZiBJTl9EUklfRFJJVkVSCisjZGVmaW5lIG5lZWRfR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgbmVlZF9HTF9WRVJTSU9OXzFfNAorI2RlZmluZSBuZWVkX0dMX1ZFUlNJT05fMV81CisjZGVmaW5lIG5lZWRfR0xfVkVSU0lPTl8yXzAKKworLyogc3cgZXh0ZW5zaW9ucyBmb3IgaW1hZ2luZyAqLworI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9jb2xvcgorI2RlZmluZSBuZWVkX0dMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgbmVlZF9HTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgbmVlZF9HTF9FWFRfaGlzdG9ncmFtCisjZGVmaW5lIG5lZWRfR0xfU0dJX2NvbG9yX3RhYmxlCisKKy8qIHN3IGV4dGVuc2lvbnMgbm90IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdMIHZlcnNpb24gKi8KKyNkZWZpbmUgbmVlZF9HTF9BUkJfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgbmVlZF9HTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgbmVlZF9HTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIG5lZWRfR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBuZWVkX0dMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdAorI2RlZmluZSBuZWVkX0dMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QKKyNkZWZpbmUgbmVlZF9HTF9FWFRfZnJhbWVidWZmZXJfYmxpdAorI2RlZmluZSBuZWVkX0dMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzCisjZGVmaW5lIG5lZWRfR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgbmVlZF9HTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZGVmaW5lIG5lZWRfR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2RlZmluZSBuZWVkX0dMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIG5lZWRfR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbQorCisjaW5jbHVkZSAiZXh0ZW5zaW9uX2hlbHBlci5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK2NvbnN0IHN0cnVjdCBkcmlfZXh0ZW5zaW9uIGNhcmRfZXh0ZW5zaW9uc1tdID0KK3sKKyAgIHsgIkdMX1ZFUlNJT05fMV8zIiwJCQlHTF9WRVJTSU9OXzFfM19mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX1ZFUlNJT05fMV80IiwJCQlHTF9WRVJTSU9OXzFfNF9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX1ZFUlNJT05fMV81IiwJCQlHTF9WRVJTSU9OXzFfNV9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX1ZFUlNJT05fMl8wIiwJCQlHTF9WRVJTSU9OXzJfMF9mdW5jdGlvbnMgfSwKKworICAgeyAiR0xfRVhUX2JsZW5kX2NvbG9yIiwJCUdMX0VYVF9ibGVuZF9jb2xvcl9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX0VYVF9ibGVuZF9taW5tYXgiLAkJR0xfRVhUX2JsZW5kX21pbm1heF9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX0VYVF9jb252b2x1dGlvbiIsCQlHTF9FWFRfY29udm9sdXRpb25fZnVuY3Rpb25zIH0sCisgICB7ICJHTF9FWFRfaGlzdG9ncmFtIiwJCUdMX0VYVF9oaXN0b2dyYW1fZnVuY3Rpb25zIH0sCisgICB7ICJHTF9TR0lfY29sb3JfdGFibGUiLAkJR0xfU0dJX2NvbG9yX3RhYmxlX2Z1bmN0aW9ucyB9LAorCisgICB7ICJHTF9BUkJfc2hhZGVyX29iamVjdHMiLAkJR0xfQVJCX3NoYWRlcl9vYmplY3RzX2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwJCUdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbV9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3QiLAlHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0X2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfQVRJX2ZyYWdtZW50X3NoYWRlciIsCQlHTF9BVElfZnJhZ21lbnRfc2hhZGVyX2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0IiwJR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0X2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCIsCUdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3RfZnVuY3Rpb25zIH0sCisgICB7ICJHTF9FWFRfZnJhbWVidWZmZXJfYmxpdCIsCQlHTF9FWFRfZnJhbWVidWZmZXJfYmxpdF9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzIiwJR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnNfZnVuY3Rpb25zIH0sCisgICB7ICJHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZSIsCQlHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZV9mdW5jdGlvbnMgfSwKKyAgIHsgIkdMX0lCTV9tdWx0aW1vZGVfZHJhd19hcnJheXMiLAlHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzX2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfTUVTQV9yZXNpemVfYnVmZmVycyIsCQlHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzX2Z1bmN0aW9ucyB9LAorICAgeyAiR0xfTlZfdmVydGV4X3Byb2dyYW0iLAkJR0xfTlZfdmVydGV4X3Byb2dyYW1fZnVuY3Rpb25zIH0sCisgICB7ICJHTF9OVl9mcmFnbWVudF9wcm9ncmFtIiwJCUdMX05WX2ZyYWdtZW50X3Byb2dyYW1fZnVuY3Rpb25zIH0sCisgICB7IE5VTEwsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCiAvKgogICogQ3JlYXRlIGEgbmV3IFgvTWVzYSB2aXN1YWwuCiAgKiBJbnB1dDogIGRpc3BsYXkgLSBYMTEgZGlzcGxheQpAQCAtMTM4NCw2ICsxNDQ1LDE0IEBACiAgICBYTWVzYVZpc3VhbCB2OwogICAgR0xpbnQgcmVkX2JpdHMsIGdyZWVuX2JpdHMsIGJsdWVfYml0cywgYWxwaGFfYml0czsKIAorI2lmZGVmIElOX0RSSV9EUklWRVIKKyAgIC8qIGRyaUluaXRFeHRlbnNpb25zKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlciBzY3JlZW4gdG8gc2V0dXAgZXh0ZW5zaW9uCisgICAgKiBpbmRpY2VzLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGl0IHdoZW4gdGhlIGNvbnRleHQgaXMgY3JlYXRlZCBzaW5jZQorICAgICogWE1lc2EgZW5hYmxlcyBtZXNhIHN3IGV4dGVuc2lvbnMgb24gaXRzIG93bi4KKyAgICAqLworICAgZHJpSW5pdEV4dGVuc2lvbnMoIE5VTEwsIGNhcmRfZXh0ZW5zaW9ucywgR0xfRkFMU0UgKTsKKyNlbmRpZgorCiAjaWZuZGVmIFhGcmVlODZTZXJ2ZXIKICAgIC8qIEZvciBkZWJ1Z2dpbmcgb25seSAqLwogICAgaWYgKF9tZXNhX2dldGVudigiTUVTQV9YU1lOQyIpKSB7CkBAIC0xNTcwLDggKzE2MzksOSBAQAogICAgX21lc2FfZW5hYmxlXzFfNF9leHRlbnNpb25zKG1lc2FDdHgpOwogICAgX21lc2FfZW5hYmxlXzFfNV9leHRlbnNpb25zKG1lc2FDdHgpOwogICAgX21lc2FfZW5hYmxlXzJfMF9leHRlbnNpb25zKG1lc2FDdHgpOworICAgX21lc2FfZW5hYmxlXzJfMV9leHRlbnNpb25zKG1lc2FDdHgpOwogI2lmIEVOQUJMRV9FWFRfdGV4dXJlX2NvbXByZXNzaW9uX3MzdGMKLSAgICBpZiAoYy0+TWVzYV9EWFRuKSB7CisgICAgaWYgKG1lc2FDdHgtPk1lc2FfRFhUbikgewogICAgICAgIF9tZXNhX2VuYWJsZV9leHRlbnNpb24obWVzYUN0eCwgIkdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMiKTsKICAgICAgICBfbWVzYV9lbmFibGVfZXh0ZW5zaW9uKG1lc2FDdHgsICJHTF9TM19zM3RjIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy94MTEveG1fZGQuYyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2RkLmMKaW5kZXggMzQyODdlZi4uZWMwOTRiNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZHJpdmVycy94MTEveG1fZGQuYworKysgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bV9kZC5jCkBAIC00MjQsNyArNDI0LDQyIEBACiAKIAogI2lmbmRlZiBYRnJlZTg2U2VydmVyCi0vKiBYWFggdGhpcyB3YXMgbmV2ZXIgdGVzdGVkIGluIHRoZSBYc2VydmVyIGVudmlyb25tZW50ICovCisvKiBYWFggdGhlc2UgZnVuY3Rpb25zIGhhdmVuJ3QgYmVlbiB0ZXN0ZWQgaW4gdGhlIFhzZXJ2ZXIgZW52aXJvbm1lbnQgKi8KKworCisvKioKKyAqIENoZWNrIGlmIHdlIGNhbiBkbyBhbiBvcHRpbWl6ZWQgZ2xEcmF3UGl4ZWxzIGludG8gYW4gOFI4RzhCIHZpc3VhbC4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorY2FuX2RvX0RyYXdQaXhlbHNfOFI4RzhCKEdMY29udGV4dCAqY3R4LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSkKK3sKKyAgIGlmIChmb3JtYXQgPT0gR0xfQkdSQSAmJgorICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgorICAgICAgIGN0eC0+RHJhd0J1ZmZlciAmJgorICAgICAgIGN0eC0+RHJhd0J1ZmZlci0+TmFtZSA9PSAwICYmCisgICAgICAgY3R4LT5QaXhlbC5ab29tWCA9PSAxLjAgJiYgICAgICAgIC8qIG5vIHpvb21pbmcgKi8KKyAgICAgICBjdHgtPlBpeGVsLlpvb21ZID09IDEuMCAmJgorICAgICAgIGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSA9PSAwIC8qIG5vIGNvbG9yIHRhYmxlcywgc2NhbGUvYmlhcywgZXRjICovKSB7CisgICAgICBjb25zdCBTV2NvbnRleHQgKnN3cmFzdCA9IFNXUkFTVF9DT05URVhUKGN0eCk7CisKKyAgICAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlKQorICAgICAgICAgX3N3cmFzdF92YWxpZGF0ZV9kZXJpdmVkKCBjdHggKTsKKyAgICAgIAorICAgICAgaWYgKChzd3Jhc3QtPl9SYXN0ZXJNYXNrICYgfkNMSVBfQklUKSA9PSAwKSAvKiBubyBibGVuZCwgei10ZXN0LCBldGMgKi8geworICAgICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdOworICAgICAgICAgaWYgKHJiKSB7CisgICAgICAgICAgICBzdHJ1Y3QgeG1lc2FfcmVuZGVyYnVmZmVyICp4cmIgPSB4bWVzYV9yZW5kZXJidWZmZXIocmItPldyYXBwZWQpOworICAgICAgICAgICAgaWYgKHhyYiAmJgorICAgICAgICAgICAgICAgIHhyYi0+cGl4bWFwICYmIC8qIGRyYXdpbmcgdG8gcGl4bWFwIG9yIHdpbmRvdyAqLworICAgICAgICAgICAgICAgIHhyYi0+QmFzZS5BbHBoYUJpdHMgPT0gMCkgeworICAgICAgICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKIAogLyoqCiAgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZ2xEcmF3UGl4ZWxzKCkgd2l0aCBhbiBYUHV0SW1hZ2UgY2FsbCB3aGVuCkBAIC00MzgsMzcgKzQ3MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKIHsKLSAgIGNvbnN0IFNXY29udGV4dCAqc3dyYXN0ID0gU1dSQVNUX0NPTlRFWFQoIGN0eCApOwotICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdOwotICAgc3RydWN0IHhtZXNhX3JlbmRlcmJ1ZmZlciAqeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKHJiLT5XcmFwcGVkKTsKLQotICAgaWYgKHN3cmFzdC0+TmV3U3RhdGUpCi0gICAgICBfc3dyYXN0X3ZhbGlkYXRlX2Rlcml2ZWQoIGN0eCApOwotCi0gICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5OYW1lID09IDAgJiYKLSAgICAgICBmb3JtYXQgPT0gR0xfQkdSQSAmJgotICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgotICAgICAgIChzd3Jhc3QtPl9SYXN0ZXJNYXNrICYgfkNMSVBfQklUKSA9PSAwICYmIC8qIG5vIGJsZW5kLCB6LXRlc3QsIGV0YyAqLwotICAgICAgIGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSA9PSAwICYmICAvKiBubyBjb2xvciB0YWJsZXMsIHNjYWxlL2JpYXMsIGV0YyAqLwotICAgICAgIGN0eC0+UGl4ZWwuWm9vbVggPT0gMS4wICYmICAgICAgICAvKiBubyB6b29taW5nICovCi0gICAgICAgY3R4LT5QaXhlbC5ab29tWSA9PSAxLjAgJiYKLSAgICAgICB4cmItPnBpeG1hcCAmJiAgICAgICAgICAgICAgICAgICAgLyogZHJhd2luZyB0byBwaXhtYXAgb3Igd2luZG93ICovCi0gICAgICAgeHJiLT5TdC5CYXNlLkFscGhhQml0cyA9PSAwKQotICAgewotICAgICAgY29uc3QgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwotICAgICAgWE1lc2FCdWZmZXIgeG1idWYgPSBYTUVTQV9CVUZGRVIoY3R4LT5EcmF3QnVmZmVyKTsKLSAgICAgIFhNZXNhRGlzcGxheSAqZHB5ID0geG1lc2EtPnhtX3Zpc3VhbC0+ZGlzcGxheTsKLSAgICAgIGNvbnN0IFhNZXNhR0MgZ2MgPSB4bWJ1Zi0+Y2xlYXJnYzsgIC8qIGVmZmVjdGVkIGJ5IGdsQ29sb3JNYXNrICovCisgICBpZiAoY2FuX2RvX0RyYXdQaXhlbHNfOFI4RzhCKGN0eCwgZm9ybWF0LCB0eXBlKSkgeworICAgICAgY29uc3QgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVCggY3R4ICk7CisgICAgICBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgY2xpcHBlZFVucGFjayA9ICp1bnBhY2s7CiAgICAgICBpbnQgZHN0WCA9IHg7CiAgICAgICBpbnQgZHN0WSA9IHk7CiAgICAgICBpbnQgdyA9IHdpZHRoOwogICAgICAgaW50IGggPSBoZWlnaHQ7Ci0gICAgICBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgY2xpcHBlZFVucGFjayA9ICp1bnBhY2s7CiAKLSAgICAgIEFTU0VSVCh4bWVzYS0+eG1fdmlzdWFsLT5kaXRoZXJlZF9wZiA9PSBQRl84UjhHOEIpOwotICAgICAgQVNTRVJUKHhtZXNhLT54bV92aXN1YWwtPnVuZGl0aGVyZWRfcGYgPT0gUEZfOFI4RzhCKTsKLSAgICAgIEFTU0VSVChkcHkpOwotICAgICAgQVNTRVJUKGdjKTsKKyAgICAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlKQorICAgICAgICAgX3N3cmFzdF92YWxpZGF0ZV9kZXJpdmVkKCBjdHggKTsKIAogICAgICAgaWYgKHVucGFjay0+QnVmZmVyT2JqLT5OYW1lKSB7CiAgICAgICAgICAvKiB1bnBhY2sgZnJvbSBQQk8gKi8KQEAgLTQ5MywxNCArNTA3LDI2IEBACiAgICAgICB9CiAKICAgICAgIGlmIChfbWVzYV9jbGlwX2RyYXdwaXhlbHMoY3R4LCAmZHN0WCwgJmRzdFksICZ3LCAmaCwgJmNsaXBwZWRVbnBhY2spKSB7CisgICAgICAgICBjb25zdCBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CisgICAgICAgICBYTWVzYURpc3BsYXkgKmRweSA9IHhtZXNhLT54bV92aXN1YWwtPmRpc3BsYXk7CisgICAgICAgICBYTWVzYUJ1ZmZlciB4bWJ1ZiA9IFhNRVNBX0JVRkZFUihjdHgtPkRyYXdCdWZmZXIpOworICAgICAgICAgY29uc3QgWE1lc2FHQyBnYyA9IHhtYnVmLT5jbGVhcmdjOyAgLyogZWZmZWN0ZWQgYnkgZ2xDb2xvck1hc2sgKi8KKyAgICAgICAgIHN0cnVjdCB4bWVzYV9yZW5kZXJidWZmZXIgKnhyYgorICAgICAgICAgICAgPSB4bWVzYV9yZW5kZXJidWZmZXIoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXS0+V3JhcHBlZCk7CisgICAgICAgICBjb25zdCBpbnQgc3JjWCA9IGNsaXBwZWRVbnBhY2suU2tpcFBpeGVsczsKKyAgICAgICAgIGNvbnN0IGludCBzcmNZID0gY2xpcHBlZFVucGFjay5Ta2lwUm93czsKKyAgICAgICAgIGNvbnN0IGludCByb3dMZW5ndGggPSBjbGlwcGVkVW5wYWNrLlJvd0xlbmd0aDsKKyAgICAgICAgIFhNZXNhSW1hZ2UgeGltYWdlOworCisgICAgICAgICBBU1NFUlQoeG1lc2EtPnhtX3Zpc3VhbC0+ZGl0aGVyZWRfcGYgPT0gUEZfOFI4RzhCKTsKKyAgICAgICAgIEFTU0VSVCh4bWVzYS0+eG1fdmlzdWFsLT51bmRpdGhlcmVkX3BmID09IFBGXzhSOEc4Qik7CisgICAgICAgICBBU1NFUlQoZHB5KTsKKyAgICAgICAgIEFTU0VSVChnYyk7CisKICAgICAgICAgIC8qIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5IHNpbmNlIGFsbCBjb29yZGluYXRlcyB1cCB0byBub3cgaGF2ZQogICAgICAgICAgICogYmVlbiBpbiB0aGUgT3BlbkdMIGJvdHRvbS10by10b3Agb3JpZW50YXRpb24uICBYIGlzIHRvcC10by1ib3R0b20KICAgICAgICAgICAqIHNvIHdlIGhhdmUgdG8gY2FyZWZ1bGx5IGNvbXB1dGUgdGhlIFkgY29vcmRpbmF0ZXMvYWRkcmVzc2VzIGhlcmUuCiAgICAgICAgICAgKi8KLSAgICAgICAgIGludCBzcmNYID0gY2xpcHBlZFVucGFjay5Ta2lwUGl4ZWxzOwotICAgICAgICAgaW50IHNyY1kgPSBjbGlwcGVkVW5wYWNrLlNraXBSb3dzOwotICAgICAgICAgaW50IHJvd0xlbmd0aCA9IGNsaXBwZWRVbnBhY2suUm93TGVuZ3RoOwotICAgICAgICAgWE1lc2FJbWFnZSB4aW1hZ2U7CiAgICAgICAgICBNRU1TRVQoJnhpbWFnZSwgMCwgc2l6ZW9mKFhNZXNhSW1hZ2UpKTsKICAgICAgICAgIHhpbWFnZS53aWR0aCA9IHdpZHRoOwogICAgICAgICAgeGltYWdlLmhlaWdodCA9IGhlaWdodDsKQEAgLTUxMSw5ICs1MzcsOSBAQAogICAgICAgICAgeGltYWdlLmJpdG1hcF91bml0ID0gMzI7CiAgICAgICAgICB4aW1hZ2UuYml0bWFwX2JpdF9vcmRlciA9IExTQkZpcnN0OwogICAgICAgICAgeGltYWdlLmJpdG1hcF9wYWQgPSAzMjsKLSAgICAgICAgIHhpbWFnZS5kZXB0aCA9IDI0OwotICAgICAgICAgeGltYWdlLmJ5dGVzX3Blcl9saW5lID0gLXJvd0xlbmd0aCAqIDQ7IC8qIG5lZ2F0aXZlIHRvIGZsaXAgaW1hZ2UgKi8KKyAgICAgICAgIHhpbWFnZS5kZXB0aCA9IDMyOwogICAgICAgICAgeGltYWdlLmJpdHNfcGVyX3BpeGVsID0gMzI7CisgICAgICAgICB4aW1hZ2UuYnl0ZXNfcGVyX2xpbmUgPSAtcm93TGVuZ3RoICogNDsgLyogbmVnYXRpdmUgdG8gZmxpcCBpbWFnZSAqLwogICAgICAgICAgLyogaXQgc2VlbXMgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHhpbWFnZS5yZWQvZ3JlZW4vYmx1ZV9tYXNrIGZpZWxkcyAqLwogICAgICAgICAgLyogZmxpcCBZIGF4aXMgZm9yIGRlc3QgcG9zaXRpb24gKi8KICAgICAgICAgIGRzdFkgPSBZRkxJUCh4cmIsIGRzdFkpIC0gaCArIDE7CkBAIC01MzUsNiArNTYxLDQxIEBACiAKIAogLyoqCisgKiBDaGVjayBpZiB3ZSBjYW4gZG8gYW4gb3B0aW1pemVkIGdsRHJhd1BpeGVscyBpbnRvIGFuIDVSNkc1QiB2aXN1YWwuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK2Nhbl9kb19EcmF3UGl4ZWxzXzVSNkc1QihHTGNvbnRleHQgKmN0eCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICBpZiAoZm9ybWF0ID09IEdMX1JHQiAmJgorICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKKyAgICAgICAhY3R4LT5Db2xvci5EaXRoZXJGbGFnICYmICAvKiBubyBkaXRoZXJpbmcgKi8KKyAgICAgICBjdHgtPkRyYXdCdWZmZXIgJiYKKyAgICAgICBjdHgtPkRyYXdCdWZmZXItPk5hbWUgPT0gMCAmJgorICAgICAgIGN0eC0+UGl4ZWwuWm9vbVggPT0gMS4wICYmICAgICAgICAvKiBubyB6b29taW5nICovCisgICAgICAgY3R4LT5QaXhlbC5ab29tWSA9PSAxLjAgJiYKKyAgICAgICBjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgPT0gMCAvKiBubyBjb2xvciB0YWJsZXMsIHNjYWxlL2JpYXMsIGV0YyAqLykgeworICAgICAgY29uc3QgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVChjdHgpOworCisgICAgICBpZiAoc3dyYXN0LT5OZXdTdGF0ZSkKKyAgICAgICAgIF9zd3Jhc3RfdmFsaWRhdGVfZGVyaXZlZCggY3R4ICk7CisgICAgICAKKyAgICAgIGlmICgoc3dyYXN0LT5fUmFzdGVyTWFzayAmIH5DTElQX0JJVCkgPT0gMCkgLyogbm8gYmxlbmQsIHotdGVzdCwgZXRjICovIHsKKyAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKKyAgICAgICAgIGlmIChyYikgeworICAgICAgICAgICAgc3RydWN0IHhtZXNhX3JlbmRlcmJ1ZmZlciAqeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKHJiLT5XcmFwcGVkKTsKKyAgICAgICAgICAgIGlmICh4cmIgJiYKKyAgICAgICAgICAgICAgICB4cmItPnBpeG1hcCAmJiAvKiBkcmF3aW5nIHRvIHBpeG1hcCBvciB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICB4cmItPkJhc2UuQWxwaGFCaXRzID09IDApIHsKKyAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCisKKy8qKgogICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGdsRHJhd1BpeGVscygpIHdpdGggYW4gWFB1dEltYWdlIGNhbGwgd2hlbgogICogZHJhd2luZyB0byB0aGUgZnJvbnQgYnVmZmVyIChYIFdpbmRvdyBkcmF3YWJsZSkuICBUaGUgaW1hZ2UgZm9ybWF0CiAgKiBtdXN0IGJlIEdMX1JHQiBhbmQgaW1hZ2UgdHlwZSBtdXN0IGJlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IHRvCkBAIC01NDcsMzUgKzYwOCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKIHsKLSAgIHN0cnVjdCB4bWVzYV9yZW5kZXJidWZmZXIgKnhyYgotICAgICAgPSB4bWVzYV9yZW5kZXJidWZmZXIoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXS0+V3JhcHBlZCk7Ci0gICBjb25zdCBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7Ci0gICBjb25zdCBTV2NvbnRleHQgKnN3cmFzdCA9IFNXUkFTVF9DT05URVhUKCBjdHggKTsKLSAgIFhNZXNhRGlzcGxheSAqZHB5ID0geG1lc2EtPnhtX3Zpc3VhbC0+ZGlzcGxheTsKLSAgIFhNZXNhQnVmZmVyIHhtYnVmID0gWE1FU0FfQlVGRkVSKGN0eC0+RHJhd0J1ZmZlcik7Ci0gICBjb25zdCBYTWVzYUdDIGdjID0geG1idWYtPmNsZWFyZ2M7ICAvKiBlZmZlY3RlZCBieSBnbENvbG9yTWFzayAqLwotCi0gICBBU1NFUlQoZHB5KTsKLSAgIEFTU0VSVChnYyk7Ci0gICBBU1NFUlQoeG1lc2EtPnhtX3Zpc3VhbC0+dW5kaXRoZXJlZF9wZiA9PSBQRl81UjZHNUIpOwotCi0gICBpZiAoc3dyYXN0LT5OZXdTdGF0ZSkKLSAgICAgIF9zd3Jhc3RfdmFsaWRhdGVfZGVyaXZlZCggY3R4ICk7Ci0KLSAgIGlmICh4cmItPnBpeG1hcCAmJiAgICAgICAvKiBkcmF3aW5nIHRvIHBpeG1hcCBvciB3aW5kb3cgKi8KLSAgICAgICBmb3JtYXQgPT0gR0xfUkdCICYmCi0gICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICFjdHgtPkNvbG9yLkRpdGhlckZsYWcgJiYgIC8qIG5vIGRpdGhlcmluZyAqLwotICAgICAgIChzd3Jhc3QtPl9SYXN0ZXJNYXNrICYgfkNMSVBfQklUKSA9PSAwICYmIC8qIG5vIGJsZW5kLCB6LXRlc3QsIGV0YyAqLwotICAgICAgIGN0eC0+X0ltYWdlVHJhbnNmZXJTdGF0ZSA9PSAwICYmICAvKiBubyBjb2xvciB0YWJsZXMsIHNjYWxlL2JpYXMsIGV0YyAqLwotICAgICAgIGN0eC0+UGl4ZWwuWm9vbVggPT0gMS4wICYmICAgICAgICAvKiBubyB6b29taW5nICovCi0gICAgICAgY3R4LT5QaXhlbC5ab29tWSA9PSAxLjApIHsKKyAgIGlmIChjYW5fZG9fRHJhd1BpeGVsc181UjZHNUIoY3R4LCBmb3JtYXQsIHR5cGUpKSB7CisgICAgICBjb25zdCBTV2NvbnRleHQgKnN3cmFzdCA9IFNXUkFTVF9DT05URVhUKCBjdHggKTsKKyAgICAgIHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiBjbGlwcGVkVW5wYWNrID0gKnVucGFjazsKICAgICAgIGludCBkc3RYID0geDsKICAgICAgIGludCBkc3RZID0geTsKICAgICAgIGludCB3ID0gd2lkdGg7CiAgICAgICBpbnQgaCA9IGhlaWdodDsKLSAgICAgIHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiBjbGlwcGVkVW5wYWNrID0gKnVucGFjazsKIAorICAgICAgaWYgKHN3cmFzdC0+TmV3U3RhdGUpCisgICAgICAgICBfc3dyYXN0X3ZhbGlkYXRlX2Rlcml2ZWQoIGN0eCApOworICAgICAgCiAgICAgICBpZiAodW5wYWNrLT5CdWZmZXJPYmotPk5hbWUpIHsKICAgICAgICAgIC8qIHVucGFjayBmcm9tIFBCTyAqLwogICAgICAgICAgR0x1Ynl0ZSAqYnVmOwpAQCAtNTk5LDE0ICs2NDIsMjUgQEAKICAgICAgIH0KIAogICAgICAgaWYgKF9tZXNhX2NsaXBfZHJhd3BpeGVscyhjdHgsICZkc3RYLCAmZHN0WSwgJncsICZoLCAmY2xpcHBlZFVucGFjaykpIHsKKyAgICAgICAgIGNvbnN0IFhNZXNhQ29udGV4dCB4bWVzYSA9IFhNRVNBX0NPTlRFWFQoY3R4KTsKKyAgICAgICAgIFhNZXNhRGlzcGxheSAqZHB5ID0geG1lc2EtPnhtX3Zpc3VhbC0+ZGlzcGxheTsKKyAgICAgICAgIFhNZXNhQnVmZmVyIHhtYnVmID0gWE1FU0FfQlVGRkVSKGN0eC0+RHJhd0J1ZmZlcik7CisgICAgICAgICBjb25zdCBYTWVzYUdDIGdjID0geG1idWYtPmNsZWFyZ2M7ICAvKiBlZmZlY3RlZCBieSBnbENvbG9yTWFzayAqLworICAgICAgICAgc3RydWN0IHhtZXNhX3JlbmRlcmJ1ZmZlciAqeHJiCisgICAgICAgICAgICA9IHhtZXNhX3JlbmRlcmJ1ZmZlcihjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdLT5XcmFwcGVkKTsKKyAgICAgICAgIGNvbnN0IGludCBzcmNYID0gY2xpcHBlZFVucGFjay5Ta2lwUGl4ZWxzOworICAgICAgICAgY29uc3QgaW50IHNyY1kgPSBjbGlwcGVkVW5wYWNrLlNraXBSb3dzOworICAgICAgICAgY29uc3QgaW50IHJvd0xlbmd0aCA9IGNsaXBwZWRVbnBhY2suUm93TGVuZ3RoOworICAgICAgICAgWE1lc2FJbWFnZSB4aW1hZ2U7CisKKyAgICAgICAgIEFTU0VSVCh4bWVzYS0+eG1fdmlzdWFsLT51bmRpdGhlcmVkX3BmID09IFBGXzVSNkc1Qik7CisgICAgICAgICBBU1NFUlQoZHB5KTsKKyAgICAgICAgIEFTU0VSVChnYyk7CisKICAgICAgICAgIC8qIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5IHNpbmNlIGFsbCBjb29yZGluYXRlcyB1cCB0byBub3cgaGF2ZQogICAgICAgICAgICogYmVlbiBpbiB0aGUgT3BlbkdMIGJvdHRvbS10by10b3Agb3JpZW50YXRpb24uICBYIGlzIHRvcC10by1ib3R0b20KICAgICAgICAgICAqIHNvIHdlIGhhdmUgdG8gY2FyZWZ1bGx5IGNvbXB1dGUgdGhlIFkgY29vcmRpbmF0ZXMvYWRkcmVzc2VzIGhlcmUuCiAgICAgICAgICAgKi8KLSAgICAgICAgIGludCBzcmNYID0gY2xpcHBlZFVucGFjay5Ta2lwUGl4ZWxzOwotICAgICAgICAgaW50IHNyY1kgPSBjbGlwcGVkVW5wYWNrLlNraXBSb3dzOwotICAgICAgICAgaW50IHJvd0xlbmd0aCA9IGNsaXBwZWRVbnBhY2suUm93TGVuZ3RoOwotICAgICAgICAgWE1lc2FJbWFnZSB4aW1hZ2U7CiAgICAgICAgICBNRU1TRVQoJnhpbWFnZSwgMCwgc2l6ZW9mKFhNZXNhSW1hZ2UpKTsKICAgICAgICAgIHhpbWFnZS53aWR0aCA9IHdpZHRoOwogICAgICAgICAgeGltYWdlLmhlaWdodCA9IGhlaWdodDsKQEAgLTYxOCw4ICs2NzIsOCBAQAogICAgICAgICAgeGltYWdlLmJpdG1hcF9iaXRfb3JkZXIgPSBMU0JGaXJzdDsKICAgICAgICAgIHhpbWFnZS5iaXRtYXBfcGFkID0gMTY7CiAgICAgICAgICB4aW1hZ2UuZGVwdGggPSAxNjsKLSAgICAgICAgIHhpbWFnZS5ieXRlc19wZXJfbGluZSA9IC1yb3dMZW5ndGggKiAyOyAvKiBuZWdhdGl2ZSB0byBmbGlwIGltYWdlICovCiAgICAgICAgICB4aW1hZ2UuYml0c19wZXJfcGl4ZWwgPSAxNjsKKyAgICAgICAgIHhpbWFnZS5ieXRlc19wZXJfbGluZSA9IC1yb3dMZW5ndGggKiAyOyAvKiBuZWdhdGl2ZSB0byBmbGlwIGltYWdlICovCiAgICAgICAgICAvKiBpdCBzZWVtcyB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgeGltYWdlLnJlZC9ncmVlbi9ibHVlX21hc2sgZmllbGRzICovCiAgICAgICAgICAvKiBmbGlwIFkgYXhpcyBmb3IgZGVzdCBwb3NpdGlvbiAqLwogICAgICAgICAgZHN0WSA9IFlGTElQKHhyYiwgZHN0WSkgLSBoICsgMTsKQEAgLTYzOSw2ICs2OTMsNDIgQEAKIH0KIAogCisvKioKKyAqIERldGVybWluZSBpZiB3ZSBjYW4gZG8gYW4gb3B0aW1pemVkIGdsQ29weVBpeGVscy4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorY2FuX2RvX0NvcHlQaXhlbHMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSB0eXBlKQoreworICAgaWYgKHR5cGUgPT0gR0xfQ09MT1IgJiYKKyAgICAgICBjdHgtPl9JbWFnZVRyYW5zZmVyU3RhdGUgPT0gMCAmJiAgLyogbm8gY29sb3IgdGFibGVzLCBzY2FsZS9iaWFzLCBldGMgKi8KKyAgICAgICBjdHgtPlBpeGVsLlpvb21YID09IDEuMCAmJiAgICAgICAgLyogbm8gem9vbWluZyAqLworICAgICAgIGN0eC0+UGl4ZWwuWm9vbVkgPT0gMS4wICYmCisgICAgICAgY3R4LT5Db2xvci5EcmF3QnVmZmVyWzBdID09IEdMX0ZST05UICYmICAvKiBjb3B5IHRvIGZyb250IGJ1ZiAqLworICAgICAgIGN0eC0+UGl4ZWwuUmVhZEJ1ZmZlciA9PSBHTF9GUk9OVCAmJiAgICAvKiBjb3B5IGZyb20gZnJvbnQgYnVmICovCisgICAgICAgY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JSZWFkQnVmZmVyICYmCisgICAgICAgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXSkgeworICAgICAgY29uc3QgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVCggY3R4ICk7CisKKyAgICAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlKQorICAgICAgICAgX3N3cmFzdF92YWxpZGF0ZV9kZXJpdmVkKCBjdHggKTsKKworICAgICAgaWYgKChzd3Jhc3QtPl9SYXN0ZXJNYXNrICYgfkNMSVBfQklUKSA9PSAweDAgJiYKKyAgICAgICAgICBjdHgtPlJlYWRCdWZmZXIgJiYKKyAgICAgICAgICBjdHgtPlJlYWRCdWZmZXItPl9Db2xvclJlYWRCdWZmZXIgJiYKKyAgICAgICAgICBjdHgtPkRyYXdCdWZmZXIgJiYKKyAgICAgICAgICBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdKSB7CisgICAgICAgICBzdHJ1Y3QgeG1lc2FfcmVuZGVyYnVmZmVyICpzcmNYcmIKKyAgICAgICAgICAgID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+UmVhZEJ1ZmZlci0+X0NvbG9yUmVhZEJ1ZmZlci0+V3JhcHBlZCk7CisgICAgICAgICBzdHJ1Y3QgeG1lc2FfcmVuZGVyYnVmZmVyICpkc3RYcmIKKyAgICAgICAgICAgID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPldyYXBwZWQpOworICAgICAgICAgaWYgKHNyY1hyYi0+cGl4bWFwICYmIGRzdFhyYi0+cGl4bWFwKSB7CisgICAgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBHTF9GQUxTRTsKK30KKwogCiAvKioKICAqIEltcGxlbWVudCBnbENvcHlQaXhlbHMgZm9yIHRoZSBmcm9udCBjb2xvciBidWZmZXIgKG9yIGJhY2sgYnVmZmVyIFBpeG1hcCkKQEAgLTY1MCwzMSArNzQwLDE5IEBACiAgICAgICAgICAgICAgICAgICBHTGludCBzcmN4LCBHTGludCBzcmN5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKICAgICAgICAgICAgICAgICAgIEdMaW50IGRlc3R4LCBHTGludCBkZXN0eSwgR0xlbnVtIHR5cGUgKQogewotICAgY29uc3QgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwotICAgY29uc3QgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVCggY3R4ICk7Ci0gICBYTWVzYURpc3BsYXkgKmRweSA9IHhtZXNhLT54bV92aXN1YWwtPmRpc3BsYXk7Ci0gICBYTWVzYUJ1ZmZlciB4bWJ1ZiA9IFhNRVNBX0JVRkZFUihjdHgtPkRyYXdCdWZmZXIpOwotICAgY29uc3QgWE1lc2FHQyBnYyA9IHhtYnVmLT5jbGVhcmdjOyAgLyogZWZmZWN0ZWQgYnkgZ2xDb2xvck1hc2sgKi8KLSAgIHN0cnVjdCB4bWVzYV9yZW5kZXJidWZmZXIgKnNyY1hyYgotICAgICAgPSB4bWVzYV9yZW5kZXJidWZmZXIoY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JSZWFkQnVmZmVyLT5XcmFwcGVkKTsKLSAgIHN0cnVjdCB4bWVzYV9yZW5kZXJidWZmZXIgKmRzdFhyYgotICAgICAgPSB4bWVzYV9yZW5kZXJidWZmZXIoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXS0+V3JhcHBlZCk7CisgICBpZiAoY2FuX2RvX0NvcHlQaXhlbHMoY3R4LCB0eXBlKSkgeworICAgICAgY29uc3QgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOworICAgICAgWE1lc2FEaXNwbGF5ICpkcHkgPSB4bWVzYS0+eG1fdmlzdWFsLT5kaXNwbGF5OworICAgICAgWE1lc2FCdWZmZXIgeG1idWYgPSBYTUVTQV9CVUZGRVIoY3R4LT5EcmF3QnVmZmVyKTsKKyAgICAgIGNvbnN0IFhNZXNhR0MgZ2MgPSB4bWJ1Zi0+Y2xlYXJnYzsgIC8qIGVmZmVjdGVkIGJ5IGdsQ29sb3JNYXNrICovCisgICAgICBzdHJ1Y3QgeG1lc2FfcmVuZGVyYnVmZmVyICpzcmNYcmIKKyAgICAgICAgID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+UmVhZEJ1ZmZlci0+X0NvbG9yUmVhZEJ1ZmZlci0+V3JhcHBlZCk7CisgICAgICBzdHJ1Y3QgeG1lc2FfcmVuZGVyYnVmZmVyICpkc3RYcmIKKyAgICAgICAgID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPldyYXBwZWQpOwogCi0gICBBU1NFUlQoZHB5KTsKLSAgIEFTU0VSVChnYyk7CisgICAgICBBU1NFUlQoZHB5KTsKKyAgICAgIEFTU0VSVChnYyk7CiAKLSAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlKQotICAgICAgX3N3cmFzdF92YWxpZGF0ZV9kZXJpdmVkKCBjdHggKTsKLQotICAgaWYgKGN0eC0+Q29sb3IuRHJhd0J1ZmZlclswXSA9PSBHTF9GUk9OVCAmJgotICAgICAgIGN0eC0+UGl4ZWwuUmVhZEJ1ZmZlciA9PSBHTF9GUk9OVCAmJgotICAgICAgIHNyY1hyYi0+cGl4bWFwICYmCi0gICAgICAgZHN0WHJiLT5waXhtYXAgJiYKLSAgICAgICB0eXBlID09IEdMX0NPTE9SICYmCi0gICAgICAgKHN3cmFzdC0+X1Jhc3Rlck1hc2sgJiB+Q0xJUF9CSVQpID09IDAgJiYgLyogbm8gYmxlbmQsIHotdGVzdCwgZXRjICovCi0gICAgICAgY3R4LT5fSW1hZ2VUcmFuc2ZlclN0YXRlID09IDAgJiYgIC8qIG5vIGNvbG9yIHRhYmxlcywgc2NhbGUvYmlhcywgZXRjICovCi0gICAgICAgY3R4LT5QaXhlbC5ab29tWCA9PSAxLjAgJiYgICAgICAgIC8qIG5vIHpvb21pbmcgKi8KLSAgICAgICBjdHgtPlBpeGVsLlpvb21ZID09IDEuMCkgewogICAgICAgLyogTm90ZTogd2UgZG9uJ3QgZG8gYW55IHNwZWNpYWwgY2xpcHBpbmcgd29yayBoZXJlLiAgV2UgY291bGQsCiAgICAgICAgKiBidXQgWCB3aWxsIGRvIGl0IGZvciB1cy4KICAgICAgICAqLwpAQCAtNjg3LDYgKzc2NSw3IEBACiAgICAgICBfc3dyYXN0X0NvcHlQaXhlbHMoY3R4LCBzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0eCwgZGVzdHksIHR5cGUgKTsKICAgIH0KIH0KKwogI2VuZGlmIC8qIFhGcmVlODZTZXJ2ZXIgKi8KIAogCkBAIC0xMDc5LDcgKzExNTgsOCBAQAogI2lmbmRlZiBYRnJlZTg2U2VydmVyCiAgICBkcml2ZXItPkNvcHlQaXhlbHMgPSB4bWVzYV9Db3B5UGl4ZWxzOwogICAgaWYgKHhtdmlzdWFsLT51bmRpdGhlcmVkX3BmID09IFBGXzhSOEc4QiAmJgotICAgICAgIHhtdmlzdWFsLT5kaXRoZXJlZF9wZiA9PSBQRl84UjhHOEIpIHsKKyAgICAgICB4bXZpc3VhbC0+ZGl0aGVyZWRfcGYgPT0gUEZfOFI4RzhCICYmCisgICAgICAgeG12aXN1YWwtPkJpdHNQZXJQaXhlbCA9PSAzMikgewogICAgICAgZHJpdmVyLT5EcmF3UGl4ZWxzID0geG1lc2FfRHJhd1BpeGVsc184UjhHOEI7CiAgICB9CiAgICBlbHNlIGlmICh4bXZpc3VhbC0+dW5kaXRoZXJlZF9wZiA9PSBQRl81UjZHNUIpIHsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2dsaWRlLmMgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bV9nbGlkZS5jCmluZGV4IGFlNGY0MjguLmNiZDY5YjAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2dsaWRlLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy94MTEveG1fZ2xpZGUuYwpAQCAtNjQsNyArNjQsOCBAQAogICAgICAgIGF0dHJpYnNbbnVtQXR0cmlicysrXSA9IEZYTUVTQV9OT05FOwogCiAgICAgICAgLyogW2RCb3JjYV0gd2Ugc2hvdWxkIHRha2UgYW4gZW52dmFyIGZvciBgZnhNZXNhU2VsZWN0Q3VycmVudEJvYXJkJyEhISAqLwotICAgICAgIGh3ID0gZnhNZXNhU2VsZWN0Q3VycmVudEJvYXJkKDApOworLyogICAgICAgaHcgPSBmeE1lc2FTZWxlY3RDdXJyZW50Qm9hcmQoMCk7ICovCisgICAgICAgaHcgPSBHUl9TU1RUWVBFX1Zvb2RvbzI7CiAKICAgICAgICAvKiBpZiB0aGVzZSBmYWlsLCB0aGVyZSdzIGEgbmV3IGJ1ZyBzb21ld2hlcmUgKi8KICAgICAgICBBU1NFUlQoYi0+bWVzYV9idWZmZXIuV2lkdGggPiAwKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2xpbmUuYyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX2xpbmUuYwppbmRleCBkZWVhZTUwLi45ODMzYjRjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bV9saW5lLmMKKysrIGIvc3JjL21lc2EvZHJpdmVycy94MTEveG1fbGluZS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCiAjZGVmaW5lIEdFVF9YUkIoWFJCKSAgc3RydWN0IHhtZXNhX3JlbmRlcmJ1ZmZlciAqWFJCID0gXAotICAgeG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF0tPldyYXBwZWQpCisgICB4bWVzYV9yZW5kZXJidWZmZXIoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXS0+V3JhcHBlZCkKIAogCiAvKgpAQCAtNTg3LDggKzU4Nyw4IEBACiAgICBjb25zdCBpbnQgZGVwdGggPSBHRVRfVklTVUFMX0RFUFRIKHhtZXNhLT54bV92aXN1YWwpOwogICAgY29uc3Qgc3RydWN0IHhtZXNhX3JlbmRlcmJ1ZmZlciAqeHJiOwogCi0gICBpZiAoKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0KLSAgICAgICAgJiAoQlVGRkVSX0JJVF9GUk9OVF9MRUZUIHwgQlVGRkVSX0JJVF9CQUNLX0xFRlQpKSA9PSAwKQorICAgaWYgKChjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICE9IEJVRkZFUl9CSVRfRlJPTlRfTEVGVCkgJiYKKyAgICAgICAoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSAhPSBCVUZGRVJfQklUX0JBQ0tfTEVGVCkpCiAgICAgICByZXR1cm4gKHN3cmFzdF9saW5lX2Z1bmMpIE5VTEw7CiAgICBpZiAoY3R4LT5SZW5kZXJNb2RlICE9IEdMX1JFTkRFUikgICAgICByZXR1cm4gKHN3cmFzdF9saW5lX2Z1bmMpIE5VTEw7CiAgICBpZiAoY3R4LT5MaW5lLlNtb290aEZsYWcpICAgICAgICAgICAgICByZXR1cm4gKHN3cmFzdF9saW5lX2Z1bmMpIE5VTEw7CkBAIC01OTgsNyArNTk4LDcgQEAKICAgIGlmIChzd3Jhc3QtPl9SYXN0ZXJNYXNrICYgTVVMVElfRFJBV19CSVQpIHJldHVybiAoc3dyYXN0X2xpbmVfZnVuYykgTlVMTDsKICAgIGlmICh4bWJ1Zi0+c3dBbHBoYSkgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3dyYXN0X2xpbmVfZnVuYykgTlVMTDsKIAotICAgeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF0tPldyYXBwZWQpOworICAgeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPldyYXBwZWQpOwogCiAgICBpZiAoeHJiLT54aW1hZ2UKICAgICAgICAmJiBzd3Jhc3QtPl9SYXN0ZXJNYXNrPT1ERVBUSF9CSVQKQEAgLTY2MSw4ICs2NjEsOCBAQAogICAgfQogCiAjaWZuZGVmIFhGcmVlODZTZXJ2ZXIKLSAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzWzBdID09IDEKLSAgICAgICAmJiBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdID09IEJVRkZFUl9CSVRfRlJPTlRfTEVGVAorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgPT0gMQorICAgICAgICYmIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPT0gQlVGRkVSX0ZST05UX0xFRlQKICAgICAgICAmJiBzd3Jhc3QtPl9SYXN0ZXJNYXNrID09IExPR0lDX09QX0JJVAogICAgICAgICYmIGN0eC0+Q29sb3IuTG9naWNPcCA9PSBHTF9YT1IKICAgICAgICAmJiAhY3R4LT5MaW5lLlN0aXBwbGVGbGFnCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bV90cmkuYyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX3RyaS5jCmluZGV4IDlmMTcwODMuLjE1OGYyODQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX3RyaS5jCisrKyBiL3NyYy9tZXNhL2RyaXZlcnMveDExL3htX3RyaS5jCkBAIC00NSw3ICs0NSw3IEBACiAKIAogI2RlZmluZSBHRVRfWFJCKFhSQikgIHN0cnVjdCB4bWVzYV9yZW5kZXJidWZmZXIgKlhSQiA9IFwKLSAgIHhtZXNhX3JlbmRlcmJ1ZmZlcihjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdLT5XcmFwcGVkKQorICAgeG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPldyYXBwZWQpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02Niw3ICs2Niw3IEBACiAgICBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CQkJXAogICAgR0VUX1hSQih4cmIpOwogCi0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXApAQCAtODIsNyArODIsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAKICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQkJXAogICAgICAgY29uc3QgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CQlcCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCiAgICAgICBzcGFuLmFscGhhICs9IHNwYW4uYWxwaGFTdGVwOwkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQkJCVwKLSAgIH0KKyAgIH0gfQogCiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCkBAIC0xMzcsNyArMTM3LDcgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsKIAotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJCVwKICAgICAgIGNvbnN0IERFUFRIX1RZUEUgeiA9IEZpeGVkVG9EZXB0aChzcGFuLnopOwkJXApAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAogICAgICAgc3Bhbi5hbHBoYSArPSBzcGFuLmFscGhhU3RlcDsJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KIAogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIApAQCAtMTcxLDcgKzE3MSw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7CiAKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJCQlcCiAgICAgICBjb25zdCBERVBUSF9UWVBFIHogPSBGaXhlZFRvRGVwdGgoc3Bhbi56KTsJCVwKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAKICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJCVwKICAgICAgIGNvbnN0IERFUFRIX1RZUEUgeiA9IEZpeGVkVG9EZXB0aChzcGFuLnopOwkJXApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMjMyLDcgKzIzMiw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CQkJXAogICAgR0VUX1hSQih4cmIpOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKQEAgLTI0OCw3ICsyNDgsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTI2NSw3ICsyNjUsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQkJXAogICAgICAgY29uc3QgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CQlcCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC0yOTYsNyArMjk2LDcgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIFhNZXNhQ29udGV4dCB4bWVzYSA9IFhNRVNBX0NPTlRFWFQoY3R4KTsJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXApAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAjZGVmaW5lIEJZVEVTX1BFUl9ST1cgKHhyYi0+eGltYWdlLT5ieXRlc19wZXJfbGluZSkKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwkJCVwKICAgIFhESVRIRVJfU0VUVVAoeSk7CQkJCQkJXApAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMzU3LDcgKzM1Nyw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7CQkJCQkJXAogICAgWE1lc2FJbWFnZSAqaW1nID0geHJiLT54aW1hZ2U7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJCQlcCiAgICBYRElUSEVSX1NFVFVQKHkpOwkJCQkJCVwKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTM5MCw3ICszOTAsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgTE9PS1VQX1NFVFVQOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJCVwKQEAgLTQwNCw3ICs0MDQsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTQyMiw3ICs0MjIsNyBAQAogI2RlZmluZSBTRVRVUF9DT0RFCQkJCQkJXAogICAgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwkJCVwKICAgIEdFVF9YUkIoeHJiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrLCB4KyspIHsJCQlcCkBAIC00MzYsNyArNDM2LDcgQEAKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC00NTMsNyArNDUzLDcgQEAKICAgIFhNZXNhSW1hZ2UgKmltZyA9IHhyYi0+eGltYWdlOwkJCQlcCiAgICB1bnNpZ25lZCBsb25nIHBpeGVsOwkJCQkJCVwKICAgIFBBQ0tfVFJVRUNPTE9SKHBpeGVsLCB2Mi0+Y29sb3JbMF0sIHYyLT5jb2xvclsxXSwgdjItPmNvbG9yWzJdKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrLCB4KyspIHsJCQlcCkBAIC00NjMsNyArNDYzLDcgQEAKICAgICAgICAgIHpSb3dbaV0gPSB6OwkJCQkJCVwKICAgICAgIH0JCQkJCQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTQ4MSw3ICs0ODEsNyBAQAogICAgR0VUX1hSQih4cmIpOwkJCQkJXAogICAgR0x1aW50IHAgPSBQQUNLXzhBOEI4RzhSKCB2Mi0+Y29sb3JbMF0sIHYyLT5jb2xvclsxXSxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLT5jb2xvclsyXSwgdjItPmNvbG9yWzNdKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJCVwKICAgICAgIGNvbnN0IERFUFRIX1RZUEUgeiA9IEZpeGVkVG9EZXB0aChzcGFuLnopOwlcCkBAIC00OTAsNyArNDkwLDcgQEAKICAgICAgICAgIHpSb3dbaV0gPSB6OwkJCQkJXAogICAgICAgfQkJCQkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgR0VUX1hSQih4cmIpOwkJCQkJXAogICAgR0x1aW50IHAgPSBQQUNLXzhBOFI4RzhCKHYyLT5jb2xvclswXSwgdjItPmNvbG9yWzFdLAlcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjItPmNvbG9yWzJdLCB2Mi0+Y29sb3JbM10pOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCVwKICAgIEdMdWludCBpOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJXAogICAgICAgY29uc3QgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CVwKQEAgLTUxNyw3ICs1MTcsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQlcCiAgICAgICB9CQkJCQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNTM0LDcgKzUzNCw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCVwKICAgIEdMdWludCBwID0gUEFDS184UjhHOEIoIHYyLT5jb2xvclswXSwgdjItPmNvbG9yWzFdLCB2Mi0+Y29sb3JbMl0gKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJXAogICAgR0x1aW50IGk7CQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJXAogICAgICAgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CVwKQEAgLTU0Myw3ICs1NDMsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCVwKICAgICAgIH0JCQkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQlcCi0gICB9CisgICB9IH0KIAogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIApAQCAtNTYxLDcgKzU2MSw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCVwKICAgIGNvbnN0IEdMdWJ5dGUgKmNvbG9yID0gdjItPmNvbG9yOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCVwKICAgIEdMdWludCBpOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJXAogICAgICAgY29uc3QgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CVwKQEAgLTU3Myw3ICs1NzMsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQlcCiAgICAgICB9CQkJCQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNTg4LDcgKzU4OCw3IEBACiAgICBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CQkJXAogICAgR0VUX1hSQih4cmIpOwkJCQkJCVwKICAgIFhNZXNhSW1hZ2UgKmltZyA9IHhyYi0+eGltYWdlOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKQEAgLTYwMSw3ICs2MDEsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQkJXAogICAgICAgfQkJCQkJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNjE4LDcgKzYxOCw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCVwKICAgIEdMdXNob3J0IHAgPSBQQUNLXzVSNkc1QiggdjItPmNvbG9yWzBdLCB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCVwKICAgIEdMdWludCBpOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJXAogICAgICAgY29uc3QgREVQVEhfVFlQRSB6ID0gRml4ZWRUb0RlcHRoKHNwYW4ueik7CVwKQEAgLTYyNyw3ICs2MjcsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQlcCiAgICAgICB9CQkJCQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNjQ1LDcgKzY0NSw3IEBACiAgICBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CQkJXAogICAgR0VUX1hSQih4cmIpOwkJCQkJCVwKICAgIGNvbnN0IEdMdWJ5dGUgKmNvbG9yID0gdjItPmNvbG9yOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQkJXAogICAgICAgfQkJCQkJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNjczLDcgKzY3Myw3IEBACiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7CQkJCQkJXAogICAgRkxBVF9ESVRIRVJfU0VUVVAoIHYyLT5jb2xvclswXSwgdjItPmNvbG9yWzFdLCB2Mi0+Y29sb3JbMl0gKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwkJCVwKICAgIEZMQVRfRElUSEVSX1JPV19TRVRVUChZRkxJUCh4cmIsIHkpKTsJCQlcCkBAIC02ODQsNyArNjg0LDcgQEAKICAgICAgICAgIHpSb3dbaV0gPSB6OwkJCQkJCVwKICAgICAgIH0JCQkJCQkJCVwKICAgICAgIHNwYW4ueiArPSBzcGFuLnpTdGVwOwkJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTY5OSw3ICs2OTksNyBAQAogICAgR0VUX1hSQih4cmIpOwkJCQkJXAogICAgWE1lc2FJbWFnZSAqaW1nID0geHJiLT54aW1hZ2U7CQlcCiAgICBGTEFUX0RJVEhFUl9TRVRVUCggdjItPmNvbG9yWzBdLCB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CVwKICAgIEZMQVRfRElUSEVSX1JPV19TRVRVUCh5KTsJCQkJCVwKQEAgLTcxMSw3ICs3MTEsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQkJXAogICAgICAgfQkJCQkJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNzMxLDcgKzczMSw3IEBACiAgICBHTHVieXRlIHIgPSB2Mi0+Y29sb3JbMF07CQkJCQlcCiAgICBHTHVieXRlIGcgPSB2Mi0+Y29sb3JbMV07CQkJCQlcCiAgICBHTHVieXRlIGIgPSB2Mi0+Y29sb3JbMl07Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgICAgICAgelJvd1tpXSA9IHo7CQkJCQkJXAogICAgICAgfQkJCQkJCQkJXAogICAgICAgc3Bhbi56ICs9IHNwYW4uelN0ZXA7CQkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtNzYyLDcgKzc2Miw3IEBACiAgICBHTHVieXRlIGcgPSB2Mi0+Y29sb3JbMV07CQkJCVwKICAgIEdMdWJ5dGUgYiA9IHYyLT5jb2xvclsyXTsJCQkJXAogICAgR0x1Ynl0ZSBwID0gTE9PS1VQKHIsZyxiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJCVwKICAgICAgIGNvbnN0IERFUFRIX1RZUEUgeiA9IEZpeGVkVG9EZXB0aChzcGFuLnopOwlcCkBAIC03NzEsNyArNzcxLDcgQEAKICAgICAgICAgIHpSb3dbaV0gPSB6OwkJCQkJXAogICAgICAgfQkJCQkJCQlcCiAgICAgICBzcGFuLnogKz0gc3Bhbi56U3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTc4NSw3ICs3ODUsNyBAQAogICAgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCQlcCiAgICBYTWVzYUltYWdlICppbWcgPSB4cmItPnhpbWFnZTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXApAQCAtNzk2LDcgKzc5Niw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTgxMiw3ICs4MTIsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQkJXAogICAgICAgcFJvd1tpXSA9IFBBQ0tfOEE4QjhHOFIoRml4ZWRUb0ludChzcGFuLnJlZCksCQlcCkBAIC04MjIsNyArODIyLDcgQEAKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCiAgICAgICBzcGFuLmFscGhhICs9IHNwYW4uYWxwaGFTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtODM4LDcgKzgzOCw3IEBACiAjZGVmaW5lIEJZVEVTX1BFUl9ST1cgKHhyYi0+eGltYWdlLT5ieXRlc19wZXJfbGluZSkKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJCQlcCiAgICAgICBwUm93W2ldID0gUEFDS184QThSOEc4QihGaXhlZFRvSW50KHNwYW4ucmVkKSwJCVwKQEAgLTg0OCw3ICs4NDgsNyBAQAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYWxwaGEgKz0gc3Bhbi5hbHBoYVN0ZXA7CQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC04NjMsNyArODYzLDcgQEAKICNkZWZpbmUgQllURVNfUEVSX1JPVyAoeHJiLT54aW1hZ2UtPmJ5dGVzX3Blcl9saW5lKQogI2RlZmluZSBTRVRVUF9DT0RFCQkJCQkJXAogICAgR0VUX1hSQih4cmIpOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJCVwKICAgICAgIHBSb3dbaV0gPSBQQUNLXzhSOEc4QihGaXhlZFRvSW50KHNwYW4ucmVkKSwJCVwKQEAgLTg3MSw3ICs4NzEsNyBAQAogICAgICAgc3Bhbi5yZWQgKz0gc3Bhbi5yZWRTdGVwOwkJCQkJXAogICAgICAgc3Bhbi5ncmVlbiArPSBzcGFuLmdyZWVuU3RlcDsJCQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC04ODYsNyArODg2LDcgQEAKICNkZWZpbmUgQllURVNfUEVSX1JPVyAoeHJiLT54aW1hZ2UtPmJ5dGVzX3Blcl9saW5lKQogI2RlZmluZSBTRVRVUF9DT0RFCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJXAogICAgUElYRUxfVFlQRSAqcGl4ZWwgPSBwUm93OwkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgcGl4ZWwrKykgewkJXApAQCAtODk2LDcgKzg5Niw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCVwKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJXAogICAgICAgc3Bhbi5ibHVlICs9IHNwYW4uYmx1ZVN0ZXA7CQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTkxMCw3ICs5MTAsNyBAQAogICAgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCQlcCiAgICBYTWVzYUltYWdlICppbWcgPSB4cmItPnhpbWFnZTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXApAQCAtOTIxLDcgKzkyMSw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTkzNiw3ICs5MzYsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQkJXAogICAgICAgcFJvd1tpXSA9IChQSVhFTF9UWVBFKSBQQUNLXzVSNkc1QihGaXhlZFRvSW50KHNwYW4ucmVkKSwJXApAQCAtOTQ0LDcgKzk0NCw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTk2MCw3ICs5NjAsNyBAQAogI2RlZmluZSBTRVRVUF9DT0RFCQkJCQkJXAogICAgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwkJCVwKICAgIEdFVF9YUkIoeHJiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXApAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTk4NCw3ICs5ODQsNyBAQAogI2RlZmluZSBCWVRFU19QRVJfUk9XICh4cmItPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUpCiAjZGVmaW5lIFNFVFVQX0NPREUJCQkJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJXAogICAgWERJVEhFUl9TRVRVUCh5KTsJCQkJCQlcCkBAIC05OTQsNyArOTk0LDcgQEAKICAgICAgIHNwYW4ucmVkICs9IHNwYW4ucmVkU3RlcDsJCQkJCVwKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTAwNyw3ICsxMDA3LDcgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCQlcCiAgICBYTWVzYUltYWdlICppbWcgPSB4cmItPnhpbWFnZTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBYRElUSEVSX1NFVFVQKHkpOwkJCQkJCVwKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAjZGVmaW5lIEJZVEVTX1BFUl9ST1cgKHhyYi0+eGltYWdlLT5ieXRlc19wZXJfbGluZSkKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBMT09LVVBfU0VUVVA7CQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQkJXApAQCAtMTA0Miw3ICsxMDQyLDcgQEAKICAgICAgIHNwYW4ucmVkICs9IHNwYW4ucmVkU3RlcDsJCQkJCVwKICAgICAgIHNwYW4uZ3JlZW4gKz0gc3Bhbi5ncmVlblN0ZXA7CQkJCVwKICAgICAgIHNwYW4uYmx1ZSArPSBzcGFuLmJsdWVTdGVwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTA1OCw3ICsxMDU4LDcgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIFhNZXNhQ29udGV4dCB4bWVzYSA9IFhNRVNBX0NPTlRFWFQoY3R4KTsJCQlcCiAgICBHRVRfWFJCKHhyYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAgICAgICBzcGFuLnJlZCArPSBzcGFuLnJlZFN0ZXA7CQkJCQlcCiAgICAgICBzcGFuLmdyZWVuICs9IHNwYW4uZ3JlZW5TdGVwOwkJCQlcCiAgICAgICBzcGFuLmJsdWUgKz0gc3Bhbi5ibHVlU3RlcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTEwODIsMTIgKzEwODIsMTIgQEAKICAgIFhNZXNhSW1hZ2UgKmltZyA9IHhyYi0+eGltYWdlOwkJCQlcCiAgICB1bnNpZ25lZCBsb25nIHBpeGVsOwkJCQkJCVwKICAgIFBBQ0tfVFJVRUNPTE9SKHBpeGVsLCB2Mi0+Y29sb3JbMF0sIHYyLT5jb2xvclsxXSwgdjItPmNvbG9yWzJdKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXAogICAgICAgWE1lc2FQdXRQaXhlbChpbWcsIHgsIHksIHBpeGVsKTsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTExMDMsMTEgKzExMDMsMTEgQEAKICAgIEdFVF9YUkIoeHJiKTsJCQkJCVwKICAgIHVuc2lnbmVkIGxvbmcgcCA9IFBBQ0tfOEI4RzhSKCB2Mi0+Y29sb3JbMF0sCQlcCiAJCSB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCVwKICAgIEdMdWludCBpOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJXAogICAgICAgcFJvd1tpXSA9IChQSVhFTF9UWVBFKSBwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTEyMywxMSArMTEyMywxMSBAQAogICAgR0VUX1hSQih4cmIpOwkJCQkJXAogICAgdW5zaWduZWQgbG9uZyBwID0gUEFDS184UjhHOEIoIHYyLT5jb2xvclswXSwJCVwKIAkJIHYyLT5jb2xvclsxXSwgdjItPmNvbG9yWzJdICk7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQlcCiAgICAgICBwUm93W2ldID0gKFBJWEVMX1RZUEUpIHA7CQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC0xMTQzLDExICsxMTQzLDExIEBACiAgICBHRVRfWFJCKHhyYik7CQkJCQlcCiAgICB1bnNpZ25lZCBsb25nIHAgPSBQQUNLXzhSOEc4QiggdjItPmNvbG9yWzBdLAkJXAogCQkgdjItPmNvbG9yWzFdLCB2Mi0+Y29sb3JbMl0gKTsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKykgewkJCVwKICAgICAgIHBSb3dbaV0gPSAoUElYRUxfVFlQRSkgcDsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTExNjIsMTQgKzExNjIsMTQgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJXAogICAgR0VUX1hSQih4cmIpOwkJCQkJXAogICAgY29uc3QgR0x1Ynl0ZSAqY29sb3IgPSB2Mi0+Y29sb3I7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJXAogICAgUElYRUxfVFlQRSAqcGl4ZWwgPSBwUm93OwkJCQlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgcGl4ZWwrKykgewkJXAogICAgICAgcGl4ZWwtPnIgPSBjb2xvcltSQ09NUF07CQkJCVwKICAgICAgIHBpeGVsLT5nID0gY29sb3JbR0NPTVBdOwkJCQlcCiAgICAgICBwaXhlbC0+YiA9IGNvbG9yW0JDT01QXTsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTExODIsNyArMTE4Miw3IEBACiAgICBYTWVzYUNvbnRleHQgeG1lc2EgPSBYTUVTQV9DT05URVhUKGN0eCk7CQkJXAogICAgR0VUX1hSQih4cmIpOwkJCQkJCVwKICAgIFhNZXNhSW1hZ2UgKmltZyA9IHhyYi0+eGltYWdlOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrLCB4KyspIHsJCQlcCkBAIC0xMTkwLDcgKzExOTAsNyBAQAogICAgICAgUEFDS19UUlVFRElUSEVSKHAsIHgsIHksIHYyLT5jb2xvclswXSwJCQlcCiAgICAgICAgICAgICAgICB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwkJCVwKICAgICAgIFhNZXNhUHV0UGl4ZWwoaW1nLCB4LCB5LCBwKTsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTEyMDYsMTEgKzEyMDYsMTEgQEAKICAgIEdFVF9YUkIoeHJiKTsJCQkJCVwKICAgIHVuc2lnbmVkIGxvbmcgcCA9IFBBQ0tfNVI2RzVCKCB2Mi0+Y29sb3JbMF0sCQlcCiAJCSB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCVwKICAgIEdMdWludCBpOwkJCQkJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrKSB7CQkJXAogICAgICAgcFJvd1tpXSA9IChQSVhFTF9UWVBFKSBwOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTIyNiwxMyArMTIyNiwxMyBAQAogICAgWE1lc2FDb250ZXh0IHhtZXNhID0gWE1FU0FfQ09OVEVYVChjdHgpOwkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCQlcCiAgICBjb25zdCBHTHVieXRlICpjb2xvciA9IHYyLT5jb2xvcjsKLSNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKQkJCQkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsJCQkJCVwKICAgIEdMdWludCBpOwkJCQkJCQlcCiAgICBHTGludCB4ID0gc3Bhbi54LCB5ID0gWUZMSVAoeHJiLCBzcGFuLnkpOwlcCiAgICBmb3IgKGkgPSAwOyBpIDwgc3Bhbi5lbmQ7IGkrKywgeCsrKSB7CQkJXAogICAgICAgUEFDS19UUlVFRElUSEVSKHBSb3dbaV0sIHgsIHksIGNvbG9yW1JDT01QXSwJCVwKICAgICAgICAgIGNvbG9yW0dDT01QXSwgY29sb3JbQkNPTVBdKTsJCQkJXAotICAgfQorICAgfSB9CiAjaW5jbHVkZSAic3dyYXN0L3NfdHJpdGVtcC5oIgogCiAKQEAgLTEyNDcsMTMgKzEyNDcsMTMgQEAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCVwKICAgIEdFVF9YUkIoeHJiKTsJCQkJCQlcCiAgICBGTEFUX0RJVEhFUl9TRVRVUCggdjItPmNvbG9yWzBdLCB2Mi0+Y29sb3JbMV0sIHYyLT5jb2xvclsyXSApOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CVwKICAgIEZMQVRfRElUSEVSX1JPV19TRVRVUChZRkxJUCh4cmIsIHkpKTsJCVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrLCB4KyspIHsJCQlcCiAgICAgICBwUm93W2ldID0gKFBJWEVMX1RZUEUpIEZMQVRfRElUSEVSKHgpOwkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC0xMjY2LDE0ICsxMjY2LDE0IEBACiAgICBHRVRfWFJCKHhyYik7CQkJCQkJXAogICAgWE1lc2FJbWFnZSAqaW1nID0geHJiLT54aW1hZ2U7CQkJCVwKICAgIEZMQVRfRElUSEVSX1NFVFVQKCB2Mi0+Y29sb3JbMF0sIHYyLT5jb2xvclsxXSwgdjItPmNvbG9yWzJdICk7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkJCQkJCVwKKyNkZWZpbmUgUkVOREVSX1NQQU4oIHNwYW4gKSB7CQkJCQlcCiAgICBHTHVpbnQgaTsJCQkJCQkJXAogICAgR0xpbnQgeCA9IHNwYW4ueCwgeSA9IFlGTElQKHhyYiwgc3Bhbi55KTsJXAogICAgRkxBVF9ESVRIRVJfUk9XX1NFVFVQKHkpOwkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyssIHgrKykgewkJCVwKICAgICAgIHVuc2lnbmVkIGxvbmcgcCA9IEZMQVRfRElUSEVSKHgpOwkJCQlcCiAgICAgICBYTWVzYVB1dFBpeGVsKGltZywgeCwgeSwgcCApOwkJCQlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTI5MSwxMiArMTI5MSwxMiBAQAogICAgR0x1Ynl0ZSByID0gdjItPmNvbG9yWzBdOwkJCQkJXAogICAgR0x1Ynl0ZSBnID0gdjItPmNvbG9yWzFdOwkJCQkJXAogICAgR0x1Ynl0ZSBiID0gdjItPmNvbG9yWzJdOwotI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApCQkJCQlcCisjZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgewkJCQkJXAogICAgR0x1aW50IGk7CQkJCQkJCVwKICAgIEdMaW50IHggPSBzcGFuLngsIHkgPSBZRkxJUCh4cmIsIHNwYW4ueSk7CVwKICAgIGZvciAoaSA9IDA7IGkgPCBzcGFuLmVuZDsgaSsrLCB4KyspIHsJCQlcCiAgICAgICBwUm93W2ldID0gKFBJWEVMX1RZUEUpIERJVEhFUl9IUENSKHgsIHksIHIsIGcsIGIpOwlcCi0gICB9CisgICB9IH0KICNpbmNsdWRlICJzd3Jhc3Qvc190cml0ZW1wLmgiCiAKIApAQCAtMTMxNSwxMSArMTMxNSwxMSBAQAogICAgR0x1Ynl0ZSBnID0gdjItPmNvbG9yWzFdOwkJCQlcCiAgICBHTHVieXRlIGIgPSB2Mi0+Y29sb3JbMl07CQkJCVwKICAgIEdMdWJ5dGUgcCA9IExPT0tVUChyLGcsYik7Ci0jZGVmaW5lIFJFTkRFUl9TUEFOKCBzcGFuICkgICAgICAgICAJIAkJXAorI2RlZmluZSBSRU5ERVJfU1BBTiggc3BhbiApIHsgICAgICAgICAJIAkJXAogICAgR0x1aW50IGk7CQkJCQkJXAogICAgZm9yIChpID0gMDsgaSA8IHNwYW4uZW5kOyBpKyspIHsJCQlcCiAgICAgICBwUm93W2ldID0gKFBJWEVMX1RZUEUpIHA7CQkJCVwKLSAgIH0KKyAgIH0gfQogI2luY2x1ZGUgInN3cmFzdC9zX3RyaXRlbXAuaCIKIAogCkBAIC0xNTAyLDggKzE1MDIsOCBAQAogI2VuZGlmCiAKICAgIC8qIHRyaXZpYWwgZmFsbGJhY2sgdGVzdHMgKi8KLSAgIGlmICgoY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXQotICAgICAgICAmIChCVUZGRVJfQklUX0ZST05UX0xFRlQgfCBCVUZGRVJfQklUX0JBQ0tfTEVGVCkpID09IDApCisgICBpZiAoKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gIT0gQlVGRkVSX0JJVF9GUk9OVF9MRUZUKSAmJgorICAgICAgIChjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdICE9IEJVRkZFUl9CSVRfQkFDS19MRUZUKSkKICAgICAgIHJldHVybiAoc3dyYXN0X3RyaV9mdW5jKSBOVUxMOwogICAgaWYgKGN0eC0+UmVuZGVyTW9kZSAhPSBHTF9SRU5ERVIpCiAgICAgICByZXR1cm4gKHN3cmFzdF90cmlfZnVuYykgTlVMTDsKQEAgLTE1MTksNyArMTUxOSw3IEBACiAgICBpZiAoeG1idWYtPnN3QWxwaGEpCiAgICAgICByZXR1cm4gKHN3cmFzdF90cmlfZnVuYykgTlVMTDsKIAotICAgeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF0tPldyYXBwZWQpOworICAgeHJiID0geG1lc2FfcmVuZGVyYnVmZmVyKGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPldyYXBwZWQpOwogCiAgICBpZiAoeHJiLT54aW1hZ2UpIHsKICAgICAgIGlmICggICBjdHgtPkxpZ2h0LlNoYWRlTW9kZWw9PUdMX1NNT09USApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZHJpdmVycy94MTEveG1lc2FQLmggYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bWVzYVAuaAppbmRleCBmZDJkZmNkLi5lMGU2OTI3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bWVzYVAuaAorKysgYi9zcmMvbWVzYS9kcml2ZXJzL3gxMS94bWVzYVAuaApAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAogLyoqCi0gKiBDb250ZXh0IGluZm8sIGREZXJpdmVkIGZyb20gR0xjb250ZXh0LgorICogQ29udGV4dCBpbmZvLCBkZXJpdmVkIGZyb20gR0xjb250ZXh0LgogICogQmFzaWNhbGx5IGNvcnJlc3BvbmRzIHRvIGEgR0xYQ29udGV4dC4KICAqLwogc3RydWN0IHhtZXNhX2NvbnRleHQgewpAQCAtNTQ5LDcgKzU0OSw2IEBACiAvKioKICAqIFJldHVybiBwb2ludGVyIHRvIFhNZXNhQ29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgTWVzYSBHTGNvbnRleHQuCiAgKiBTaW5jZSB3ZSdyZSB1c2luZyBzdHJ1Y3R1cmUgY29udGFpbm1lbnQsIGl0J3MganVzdCBhIGNhc3QhLgotICogWFhYIHNob3VsZCB1c2UgaW5saW5lZCBmdW5jdGlvbiBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5LgogICovCiBzdGF0aWMgSU5MSU5FIFhNZXNhQ29udGV4dAogWE1FU0FfQ09OVEVYVChHTGNvbnRleHQgKmN0eCkKQEAgLTU2MSw3ICs1NjAsNiBAQAogLyoqCiAgKiBSZXR1cm4gcG9pbnRlciB0byBYTWVzYUJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIGEgTWVzYSBHTGZyYW1lYnVmZmVyLgogICogU2luY2Ugd2UncmUgdXNpbmcgc3RydWN0dXJlIGNvbnRhaW5tZW50LCBpdCdzIGp1c3QgYSBjYXN0IS4KLSAqIFhYWCBzaG91bGQgdXNlIGlubGluZWQgZnVuY3Rpb24gZm9yIGJldHRlciB0eXBlIHNhZmV0eS4KICAqLwogc3RhdGljIElOTElORSBYTWVzYUJ1ZmZlcgogWE1FU0FfQlVGRkVSKEdMZnJhbWVidWZmZXIgKmIpCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9nbC5wYy5pbiBiL3NyYy9tZXNhL2dsLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Mjc4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9nbC5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QElOU1RBTExfRElSQAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9QElOU1RBTExfTElCX0RJUkAKK2luY2x1ZGVkaXI9QElOU1RBTExfSU5DX0RJUkAKKworTmFtZTogZ2wKK0Rlc2NyaXB0aW9uOiBNZXNhIE9wZW5HTCBsaWJyYXJ5CitSZXF1aXJlczoKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxHTAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2dsYXBpL0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QueG1sIGIvc3JjL21lc2EvZ2xhcGkvRVhUX2ZyYW1lYnVmZmVyX29iamVjdC54bWwKaW5kZXggNjZmMjUwYy4uMWIwZGUyYSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZ2xhcGkvRVhUX2ZyYW1lYnVmZmVyX29iamVjdC54bWwKKysrIGIvc3JjL21lc2EvZ2xhcGkvRVhUX2ZyYW1lYnVmZmVyX29iamVjdC54bWwKQEAgLTU5LDEyICs1OSwxOCBAQAogICAgIDxlbnVtIG5hbWU9IkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfRVhUIiAgIHZhbHVlPSIweDhDREMiLz4KICAgICA8ZW51bSBuYW1lPSJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9FWFQiICAgICAgICAgICAgICB2YWx1ZT0iMHg4Q0REIi8+CiAgICAgPGVudW0gbmFtZT0iRlJBTUVCVUZGRVJfU1RBVFVTX0VSUk9SX0VYVCIgICAgICAgICAgICAgdmFsdWU9IjB4OENERSIvPgotCi0gICAgPGVudW0gbmFtZT0iRlJBTUVCVUZGRVJfQklORElOR19FWFQiICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4OENBNiIvPgotICAgIDxlbnVtIG5hbWU9IlJFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCIgICAgICAgICAgICAgICAgIHZhbHVlPSIweDhDQTciLz4KLSAgICA8ZW51bSBuYW1lPSJNQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUIiAgICAgICAgICAgICAgICB2YWx1ZT0iMHg4Q0RGIi8+Ci0gICAgPGVudW0gbmFtZT0iTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCIgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODRFOCIvPgotCisgICAgPGVudW0gbmFtZT0iRlJBTUVCVUZGRVJfQklORElOR19FWFQiICAgICAgICBjb3VudD0iMSIgdmFsdWU9IjB4OENBNiI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IlJFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCIgICAgICAgY291bnQ9IjEiIHZhbHVlPSIweDhDQTciPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJNQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUIiAgICAgIGNvdW50PSIxIiB2YWx1ZT0iMHg4Q0RGIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CisgICAgPGVudW0gbmFtZT0iTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCIgICAgICBjb3VudD0iMSIgdmFsdWU9IjB4ODRFOCI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCIgICAgICAgIHZhbHVlPSIweDA1MDYiLz4KIAogICAgIDxmdW5jdGlvbiBuYW1lPSJJc1JlbmRlcmJ1ZmZlckVYVCIgb2Zmc2V0PSJhc3NpZ24iPgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZ2xhcGkvTWFrZWZpbGUgYi9zcmMvbWVzYS9nbGFwaS9NYWtlZmlsZQppbmRleCBjNTJjMDkwLi5hZGM1M2Q5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9nbGFwaS9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS9nbGFwaS9NYWtlZmlsZQpAQCAtMjAsMTcgKzIwLDMwIEBACiAJLi4vLi4vZ2x4L3gxMS9pbmRpcmVjdF9zaXplLmMKIAogCi0jWE9SR19CQVNFID0gL2hvbWUvaWRyL2RldmVsL2dyYXBoaWNzL1hvcmcveHNlcnZlci94b3JnCi1HTFhfRElSICAgPSAkKFhPUkdfQkFTRSkvR0wvZ2x4CitHTFhfRElSID0gJChYT1JHX0JBU0UpL2dseAogCi1TRVJWRVJfT1VUUFVUUyA9ICQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2guYyBcCitTRVJWRVJfR0xBUElfRklMRVMgPSBcCisJJChHTFhfRElSKS9nbGFwaS5oIFwKKwkkKEdMWF9ESVIpL2dsYXBpLmMgXAorCSQoR0xYX0RJUikvZ2x0aHJlYWQuYyBcCisJJChHTFhfRElSKS9nbHRocmVhZC5oCisKK1NFUlZFUl9PVVRQVVRTID0gXAorCSQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2guYyBcCiAJJChHTFhfRElSKS9pbmRpcmVjdF9kaXNwYXRjaF9zd2FwLmMgXAogCSQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2guaCBcCiAJJChHTFhfRElSKS9pbmRpcmVjdF9yZXFzaXplLmMgXAogCSQoR0xYX0RJUikvaW5kaXJlY3RfcmVxc2l6ZS5oIFwKKwkkKEdMWF9ESVIpL2luZGlyZWN0X3NpemUuaCBcCiAJJChHTFhfRElSKS9pbmRpcmVjdF9zaXplX2dldC5jIFwKIAkkKEdMWF9ESVIpL2luZGlyZWN0X3NpemVfZ2V0LmggXAotCSQoR0xYX0RJUikvaW5kaXJlY3RfdGFibGUuYworCSQoR0xYX0RJUikvaW5kaXJlY3RfdGFibGUuYyBcCisJJChHTFhfRElSKS9nbGFwaXRlbXAuaCBcCisJJChHTFhfRElSKS9nbGFwaXRhYmxlLmggXAorCSQoR0xYX0RJUikvZ2xhcGlvZmZzZXRzLmggXAorCSQoR0xYX0RJUikvZ2xwcm9jcy5oIFwKKwkkKEdMWF9ESVIpL2Rpc3BhdGNoLmggXAorCSQoU0VSVkVSX0dMQVBJX0ZJTEVTKQogCiBBUElfWE1MID0gZ2xfQVBJLnhtbCBcCiAJRVhUX2ZyYW1lYnVmZmVyX29iamVjdC54bWwgXApAQCAtMzksODIgKzUyLDk0IEBACiBDT01NT04gPSBnbF9YTUwucHkgZ2xYX1hNTC5weSBsaWNlbnNlLnB5ICQoQVBJX1hNTCkgdHlwZWV4cHIucHkKIENPTU1PTl9HTFggPSAkKENPTU1PTikgZ2xYX0FQSS54bWwgZ2xYX1hNTC5weSBnbFhfcHJvdG9fY29tbW9uLnB5CiAKLUlOREVOVF9GTEFHUyA9IC1pNCAtbnV0IC1iciAtYnJzIC1ucGNzIC1jZSAtVCBHTHVieXRlIC1UIEdMYnl0ZSAtVCBCb29sCithbGw6IGNoZWNrLXhvcmctc291cmNlICQoT1VUUFVUUykgJChTRVJWRVJfT1VUUFVUUykKIAotYWxsOiAkKE9VVFBVVFMpCitjaGVjay14b3JnLXNvdXJjZToKKwlAaWYgISB0ZXN0IC1kICQoR0xYX0RJUik7IHRoZW4gXAorCQllY2hvICJFUlJPUjogTXVzdCBzcGVjaWZ5IHBhdGggdG8geHNlcnZlciBjaGVja291dDsgc2V0IFhPUkdfQkFTRS4iOyBcCisJCWV4aXQgMTsgXAorCWZpCiAKLXNlcnZlcjogJChTRVJWRVJfT1VUUFVUUykKKyQoR0xYX0RJUikvJS5jOiAlLmMKKwljcCAkPCAkQAogCi1nbHByb2NzLmg6ICQoQ09NTU9OKSBnbF9wcm9jcy5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsX3Byb2NzLnB5ID4gZ2xwcm9jcy5oCiskKEdMWF9ESVIpLyUuaDogJS5oCisJY3AgJDwgJEAKIAotZ2xhcGl0ZW1wLmg6ICQoQ09NTU9OKSBnbF9hcGl0ZW1wLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xfYXBpdGVtcC5weSA+IGdsYXBpdGVtcC5oCitnbHByb2NzLmggJChHTFhfRElSKS9nbHByb2NzLmg6IGdsX3Byb2NzLnB5ICQoQ09NTU9OKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8ID4gJEAKIAotZ2xhcGlvZmZzZXRzLmg6ICQoQ09NTU9OKSBnbF9vZmZzZXRzLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xfb2Zmc2V0cy5weSA+IGdsYXBpb2Zmc2V0cy5oCitnbGFwaXRlbXAuaCAkKEdMWF9ESVIpL2dsYXBpdGVtcC5oOiBnbF9hcGl0ZW1wLnB5ICQoQ09NTU9OKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8ID4gJEAKIAotZ2xhcGl0YWJsZS5oOiAkKENPTU1PTikgZ2xfdGFibGUucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbF90YWJsZS5weSA+IGdsYXBpdGFibGUuaAorZ2xhcGlvZmZzZXRzLmggJChHTFhfRElSKS9nbGFwaW9mZnNldHMuaDogZ2xfb2Zmc2V0cy5weSAkKENPTU1PTikKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCA+ICRACiAKLWRpc3BhdGNoLmg6ICQoQ09NTU9OKSBnbF90YWJsZS5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsX3RhYmxlLnB5IC1tIHJlbWFwX3RhYmxlID4gZGlzcGF0Y2guaAorZ2xhcGl0YWJsZS5oICQoR0xYX0RJUikvZ2xhcGl0YWJsZS5oOiBnbF90YWJsZS5weSAkKENPTU1PTikKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCA+ICRACiAKLS4uL21haW4vZW51bXMuYzogJChDT01NT04pIGdsX2VudW1zLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xfZW51bXMucHkgPiAuLi9tYWluL2VudW1zLmMKK2Rpc3BhdGNoLmggJChHTFhfRElSKS9kaXNwYXRjaC5oOiBnbF90YWJsZS5weSAkKENPTU1PTikKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCAtbSByZW1hcF90YWJsZSA+ICRACiAKLS4uL3g4Ni9nbGFwaV94ODYuUzogJChDT01NT04pIGdsX3g4Nl9hc20ucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbF94ODZfYXNtLnB5ID4gLi4veDg2L2dsYXBpX3g4Ni5TCisuLi9tYWluL2VudW1zLmM6IGdsX2VudW1zLnB5ICQoQ09NTU9OKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8ID4gJEAKIAotLi4veDg2LTY0L2dsYXBpX3g4Ni02NC5TOiAkKENPTU1PTikgZ2xfeDg2LTY0X2FzbS5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsX3g4Ni02NF9hc20ucHkgPiAuLi94ODYtNjQvZ2xhcGlfeDg2LTY0LlMKKy4uL3g4Ni9nbGFwaV94ODYuUzogZ2xfeDg2X2FzbS5weSAkKENPTU1PTikKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCA+ICRACiAKLS4uL3NwYXJjL2dsYXBpX3NwYXJjLlM6ICQoQ09NTU9OKSBnbF9TUEFSQ19hc20ucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbF9TUEFSQ19hc20ucHkgPiAuLi9zcGFyYy9nbGFwaV9zcGFyYy5TCisuLi94ODYtNjQvZ2xhcGlfeDg2LTY0LlM6IGdsX3g4Ni02NF9hc20ucHkgJChDT01NT04pCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgPiAkQAorCisuLi9zcGFyYy9nbGFwaV9zcGFyYy5TOiBnbF9TUEFSQ19hc20ucHkgJChDT01NT04pCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgPiAkQAogCiAKLS4uL2RyaXZlcnMvZHJpL2NvbW1vbi9leHRlbnNpb25faGVscGVyLmg6ICQoQ09NTU9OKSBleHRlbnNpb25faGVscGVyLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZXh0ZW5zaW9uX2hlbHBlci5weSA+IC4uL2RyaXZlcnMvZHJpL2NvbW1vbi9leHRlbnNpb25faGVscGVyLmgKKy4uL2RyaXZlcnMvZHJpL2NvbW1vbi9leHRlbnNpb25faGVscGVyLmg6IGV4dGVuc2lvbl9oZWxwZXIucHkgJChDT01NT04pCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgPiAkQAogCi0uLi8uLi9nbHgveDExL2luZGlyZWN0LmM6ICQoQ09NTU9OX0dMWCkgZ2xYX3Byb3RvX3NlbmQucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbFhfcHJvdG9fc2VuZC5weSAtbSBwcm90byB8IGluZGVudCAkKElOREVOVF9GTEFHUykgPiAuLi8uLi9nbHgveDExL2luZGlyZWN0LmMKKy4uLy4uL2dseC94MTEvaW5kaXJlY3QuYzogZ2xYX3Byb3RvX3NlbmQucHkgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1tIHByb3RvIHwgJChJTkRFTlQpICQoSU5ERU5UX0ZMQUdTKSA+ICRACiAKLS4uLy4uL2dseC94MTEvaW5kaXJlY3QuaDogJChDT01NT05fR0xYKSBnbFhfcHJvdG9fc2VuZC5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9wcm90b19zZW5kLnB5IC1tIGluaXRfaCA+IC4uLy4uL2dseC94MTEvaW5kaXJlY3QuaAorLi4vLi4vZ2x4L3gxMS9pbmRpcmVjdC5oOiBnbFhfcHJvdG9fc2VuZC5weSAkKENPTU1PTl9HTFgpCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgLW0gaW5pdF9oID4gJEAKIAotLi4vLi4vZ2x4L3gxMS9pbmRpcmVjdF9pbml0LmM6ICQoQ09NTU9OX0dMWCkgZ2xYX3Byb3RvX3NlbmQucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbFhfcHJvdG9fc2VuZC5weSAtbSBpbml0X2MgPiAuLi8uLi9nbHgveDExL2luZGlyZWN0X2luaXQuYworLi4vLi4vZ2x4L3gxMS9pbmRpcmVjdF9pbml0LmM6IGdsWF9wcm90b19zZW5kLnB5ICQoQ09NTU9OX0dMWCkKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCAtbSBpbml0X2MgPiAkQAogCi0uLi8uLi9nbHgveDExL2luZGlyZWN0X3NpemUuaDogJChDT01NT05fR0xYKSBnbFhfcHJvdG9fc2l6ZS5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9wcm90b19zaXplLnB5IC1tIHNpemVfaCAtLW9ubHktc2V0IC1oIF9JTkRJUkVDVF9TSVpFX0hfIHwgaW5kZW50ICQoSU5ERU5UX0ZMQUdTKSA+IC4uLy4uL2dseC94MTEvaW5kaXJlY3Rfc2l6ZS5oCisuLi8uLi9nbHgveDExL2luZGlyZWN0X3NpemUuaCAkKEdMWF9ESVIpL2luZGlyZWN0X3NpemUuaDogZ2xYX3Byb3RvX3NpemUucHkgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1tIHNpemVfaCAtLW9ubHktc2V0IC1oIF9JTkRJUkVDVF9TSVpFX0hfIFwKKwkgIHwgJChJTkRFTlQpICQoSU5ERU5UX0ZMQUdTKSA+ICRACiAKLS4uLy4uL2dseC94MTEvaW5kaXJlY3Rfc2l6ZS5jOiAkKENPTU1PTl9HTFgpIGdsWF9wcm90b19zaXplLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xYX3Byb3RvX3NpemUucHkgLW0gc2l6ZV9jIC0tb25seS1zZXQgfCBpbmRlbnQgJChJTkRFTlRfRkxBR1MpID4gLi4vLi4vZ2x4L3gxMS9pbmRpcmVjdF9zaXplLmMKKy4uLy4uL2dseC94MTEvaW5kaXJlY3Rfc2l6ZS5jOiBnbFhfcHJvdG9fc2l6ZS5weSAkKENPTU1PTl9HTFgpCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgLW0gc2l6ZV9jIC0tb25seS1zZXQgXAorCSAgfCAkKElOREVOVCkgJChJTkRFTlRfRkxBR1MpID4gJEAKIAotJChHTFhfRElSKS9pbmRpcmVjdF9kaXNwYXRjaC5jOiAkKENPTU1PTl9HTFgpIGdsWF9wcm90b19yZWN2LnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xYX3Byb3RvX3JlY3YucHkgLW0gZGlzcGF0Y2hfYyA+ICRACiskKEdMWF9ESVIpL2luZGlyZWN0X2Rpc3BhdGNoLmM6IGdsWF9wcm90b19yZWN2LnB5ICQoQ09NTU9OX0dMWCkKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCAtbSBkaXNwYXRjaF9jID4gJEAKIAotJChHTFhfRElSKS9pbmRpcmVjdF9kaXNwYXRjaF9zd2FwLmM6ICQoQ09NTU9OX0dMWCkgZ2xYX3Byb3RvX3JlY3YucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbFhfcHJvdG9fcmVjdi5weSAtbSBkaXNwYXRjaF9jIC1zID4gJEAKKyQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2hfc3dhcC5jOiBnbFhfcHJvdG9fcmVjdi5weSAkKENPTU1PTl9HTFgpCisJJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgJDwgLW0gZGlzcGF0Y2hfYyAtcyA+ICRACiAKLSQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2guaDogJChDT01NT05fR0xYKSBnbFhfcHJvdG9fcmVjdi5weSBnbFhfQVBJLnhtbAotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9wcm90b19yZWN2LnB5IC1tIGRpc3BhdGNoX2ggLWYgZ2xfYW5kX2dsWF9BUEkueG1sIC1zID4gJEAKKyQoR0xYX0RJUikvaW5kaXJlY3RfZGlzcGF0Y2guaDogZ2xYX3Byb3RvX3JlY3YucHkgZ2xfYW5kX2dsWF9BUEkueG1sICQoQ09NTU9OX0dMWCkKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCAtbSBkaXNwYXRjaF9oIC1mIGdsX2FuZF9nbFhfQVBJLnhtbCAtcyA+ICRACiAKLSQoR0xYX0RJUikvaW5kaXJlY3Rfc2l6ZV9nZXQuaDogJChDT01NT05fR0xYKSBnbFhfcHJvdG9fc2l6ZS5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9wcm90b19zaXplLnB5IC1tIHNpemVfaCAtLW9ubHktZ2V0IC1oICdfSU5ESVJFQ1RfU0laRV9HRVRfSF8nIHwgaW5kZW50ICQoSU5ERU5UX0ZMQUdTKSA+ICRACiskKEdMWF9ESVIpL2luZGlyZWN0X3NpemVfZ2V0Lmg6IGdsWF9wcm90b19zaXplLnB5ICQoQ09NTU9OX0dMWCkKKwkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSAkPCAtbSBzaXplX2ggLS1vbmx5LWdldCAtaCAnX0lORElSRUNUX1NJWkVfR0VUX0hfJyBcCisJICB8ICQoSU5ERU5UKSAkKElOREVOVF9GTEFHUykgPiAkQAogCi0kKEdMWF9ESVIpL2luZGlyZWN0X3NpemVfZ2V0LmM6ICQoQ09NTU9OX0dMWCkgZ2xYX3Byb3RvX3NpemUucHkKLQkkKFBZVEhPTjIpICQoUFlUSE9OX0ZMQUdTKSBnbFhfcHJvdG9fc2l6ZS5weSAtbSBzaXplX2MgfCBpbmRlbnQgJChJTkRFTlRfRkxBR1MpID4gJEAKKyQoR0xYX0RJUikvaW5kaXJlY3Rfc2l6ZV9nZXQuYzogZ2xYX3Byb3RvX3NpemUucHkgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1tIHNpemVfYyB8ICQoSU5ERU5UKSAkKElOREVOVF9GTEFHUykgPiAkQAogCi0kKEdMWF9ESVIpL2luZGlyZWN0X3JlcXNpemUuaDogJChDT01NT05fR0xYKSBnbFhfcHJvdG9fc2l6ZS5weQotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9wcm90b19zaXplLnB5IC1tIHJlcXNpemVfaCAtLW9ubHktZ2V0IC1oICdfSU5ESVJFQ1RfU0laRV9HRVRfSF8nIHwgaW5kZW50ICQoSU5ERU5UX0ZMQUdTKSAtbDIwMCA+ICRACiskKEdMWF9ESVIpL2luZGlyZWN0X3JlcXNpemUuaDogZ2xYX3Byb3RvX3NpemUucHkgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1tIHJlcXNpemVfaCAtLW9ubHktZ2V0IC1oICdfSU5ESVJFQ1RfU0laRV9HRVRfSF8nIFwKKwkgIHwgJChJTkRFTlQpICQoSU5ERU5UX0ZMQUdTKSAtbDIwMCA+ICRACiAKLSQoR0xYX0RJUikvaW5kaXJlY3RfcmVxc2l6ZS5jOiAkKENPTU1PTl9HTFgpIGdsWF9wcm90b19zaXplLnB5Ci0JJChQWVRIT04yKSAkKFBZVEhPTl9GTEFHUykgZ2xYX3Byb3RvX3NpemUucHkgLW0gcmVxc2l6ZV9jIHwgaW5kZW50ICQoSU5ERU5UX0ZMQUdTKSA+ICRACiskKEdMWF9ESVIpL2luZGlyZWN0X3JlcXNpemUuYzogZ2xYX3Byb3RvX3NpemUucHkgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1tIHJlcXNpemVfYyB8ICQoSU5ERU5UKSAkKElOREVOVF9GTEFHUykgPiAkQAogCi0kKEdMWF9ESVIpL2luZGlyZWN0X3RhYmxlLmM6ICQoQ09NTU9OX0dMWCkgZ2xYX3NlcnZlcl90YWJsZS5weSBnbFhfQVBJLnhtbAotCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpIGdsWF9zZXJ2ZXJfdGFibGUucHkgLWYgZ2xfYW5kX2dsWF9BUEkueG1sID4gJEAKKyQoR0xYX0RJUikvaW5kaXJlY3RfdGFibGUuYzogZ2xYX3NlcnZlcl90YWJsZS5weSBnbF9hbmRfZ2xYX0FQSS54bWwgJChDT01NT05fR0xYKQorCSQoUFlUSE9OMikgJChQWVRIT05fRkxBR1MpICQ8IC1mIGdsX2FuZF9nbFhfQVBJLnhtbCA+ICRACiAKIGNsZWFuOgotCXJtIC1mICp+ICoucHlvCi0Jcm0gLWYgJChPVVRQVVRTKQorCS1ybSAtZiAqfiAqLnB5bworCS1ybSAtZiAkKE9VVFBVVFMpCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9nbGFwaS9nbFhfQVBJLnhtbCBiL3NyYy9tZXNhL2dsYXBpL2dsWF9BUEkueG1sCmluZGV4IDQ1NWZjNmEuLjllMDJhYTQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2dsYXBpL2dsWF9BUEkueG1sCisrKyBiL3NyYy9tZXNhL2dsYXBpL2dsWF9BUEkueG1sCkBAIC0xODMsNyArMTgzLDYgQEAKICAgICA8L2Z1bmN0aW9uPgogPC9jYXRlZ29yeT4KIAotPCEtLQogPGNhdGVnb3J5IG5hbWU9IkdMWF9TR0lYX3BidWZmZXIiIG51bWJlcj0iNTAiIHdpbmRvd19zeXN0ZW09ImdsWCI+CiAgICAgPGZ1bmN0aW9uIG5hbWU9IkNyZWF0ZUdMWFBidWZmZXJTR0lYIj4KICAgICAgICAgPGdseCB2ZW5kb3Jwcml2PSI2NTU0MyIvPgpAQCAtMjAxLDcgKzIwMCw2IEBACiAgICAgICAgIDxnbHggdmVuZG9ycHJpdj0iNjU1NDYiLz4KICAgICA8L2Z1bmN0aW9uPgogPC9jYXRlZ29yeT4KLS0tPgogCiA8Y2F0ZWdvcnkgbmFtZT0iR0xYX01FU0FfY29weV9zdWJfYnVmZmVyIiBudW1iZXI9IjIxNSI+CiAgICAgPGZ1bmN0aW9uIG5hbWU9IkNvcHlTdWJCdWZmZXJNRVNBIj4KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2dsYXBpL2dsWF9YTUwucHkgYi9zcmMvbWVzYS9nbGFwaS9nbFhfWE1MLnB5CmluZGV4IDFiNWMzMjMuLjRjMmUwZjkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2dsYXBpL2dsWF9YTUwucHkKKysrIGIvc3JjL21lc2EvZ2xhcGkvZ2xYX1hNTC5weQpAQCAtMTE1LDcgKzExNSwxMiBAQAogCWRlZiBwcm9jZXNzX2VsZW1lbnQoc2VsZiwgZWxlbWVudCk6CiAJCWdsX1hNTC5nbF9mdW5jdGlvbi5wcm9jZXNzX2VsZW1lbnQoc2VsZiwgZWxlbWVudCkKIAotCQlzZWxmLnZlY3RvcmVxdWl2ID0gZWxlbWVudC5uc1Byb3AoICJ2ZWN0b3JlcXVpdiIsIE5vbmUgKQorCQkjIElmIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGhhcyBhIHZlY3RvciBlcXVpdmFsZW50IHNldCwgZG9uJ3QKKwkJIyBzZXQgaXQgYWdhaW4uICBUaGlzIGNhbiBoYXBwZW4gaWYgYW4gYWxpYXMgdG8gYSBmdW5jdGlvbgorCQkjIGFwcGVhcnMgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRoYXQgaXQgYWxpYXNlcy4KKworCQlpZiBub3Qgc2VsZi52ZWN0b3JlcXVpdjoKKwkJCXNlbGYudmVjdG9yZXF1aXYgPSBlbGVtZW50Lm5zUHJvcCgidmVjdG9yZXF1aXYiLCBOb25lKQogCiAKIAkJbmFtZSA9IGVsZW1lbnQubnNQcm9wKCJuYW1lIiwgTm9uZSkKQEAgLTEzMiw0OCArMTM3LDQ3IEBACiAKIAkJY2hpbGQgPSBlbGVtZW50LmNoaWxkcmVuCiAJCXdoaWxlIGNoaWxkOgotCQkJaWYgY2hpbGQudHlwZSA9PSAiZWxlbWVudCI6Ci0JCQkJaWYgY2hpbGQubmFtZSA9PSAiZ2x4IjoKLQkJCQkJcm9wID0gY2hpbGQubnNQcm9wKCAncm9wJywgTm9uZSApCi0JCQkJCXNvcCA9IGNoaWxkLm5zUHJvcCggJ3NvcCcsIE5vbmUgKQotCQkJCQl2b3AgPSBjaGlsZC5uc1Byb3AoICd2ZW5kb3Jwcml2JywgTm9uZSApCisJCQlpZiBjaGlsZC50eXBlID09ICJlbGVtZW50IiBhbmQgY2hpbGQubmFtZSA9PSAiZ2x4IjoKKwkJCQlyb3AgPSBjaGlsZC5uc1Byb3AoICdyb3AnLCBOb25lICkKKwkJCQlzb3AgPSBjaGlsZC5uc1Byb3AoICdzb3AnLCBOb25lICkKKwkJCQl2b3AgPSBjaGlsZC5uc1Byb3AoICd2ZW5kb3Jwcml2JywgTm9uZSApCiAKLQkJCQkJaWYgcm9wOgotCQkJCQkJc2VsZi5nbHhfcm9wID0gaW50KHJvcCkKKwkJCQlpZiByb3A6CisJCQkJCXNlbGYuZ2x4X3JvcCA9IGludChyb3ApCiAKLQkJCQkJaWYgc29wOgotCQkJCQkJc2VsZi5nbHhfc29wID0gaW50KHNvcCkKKwkJCQlpZiBzb3A6CisJCQkJCXNlbGYuZ2x4X3NvcCA9IGludChzb3ApCiAKLQkJCQkJaWYgdm9wOgotCQkJCQkJc2VsZi5nbHhfdmVuZG9ycHJpdiA9IGludCh2b3ApCi0JCQkJCQlzZWxmLmdseF92ZW5kb3Jwcml2X25hbWVzLmFwcGVuZChuYW1lKQorCQkJCWlmIHZvcDoKKwkJCQkJc2VsZi5nbHhfdmVuZG9ycHJpdiA9IGludCh2b3ApCisJCQkJCXNlbGYuZ2x4X3ZlbmRvcnByaXZfbmFtZXMuYXBwZW5kKG5hbWUpCiAKLQkJCQkJc2VsZi5pbWdfcmVzZXQgPSBjaGlsZC5uc1Byb3AoICdpbWdfcmVzZXQnLCBOb25lICkKKwkJCQlzZWxmLmltZ19yZXNldCA9IGNoaWxkLm5zUHJvcCggJ2ltZ19yZXNldCcsIE5vbmUgKQogCi0JCQkJCSMgVGhlICdoYW5kY29kZScgYXR0cmlidXRlIGNhbiBiZSBvbmUgb2YgJ3RydWUnLAotCQkJCQkjICdmYWxzZScsICdjbGllbnQnLCBvciAnc2VydmVyJy4KKwkJCQkjIFRoZSAnaGFuZGNvZGUnIGF0dHJpYnV0ZSBjYW4gYmUgb25lIG9mICd0cnVlJywKKwkJCQkjICdmYWxzZScsICdjbGllbnQnLCBvciAnc2VydmVyJy4KIAotCQkJCQloYW5kY29kZSA9IGNoaWxkLm5zUHJvcCggJ2hhbmRjb2RlJywgTm9uZSApCi0JCQkJCWlmIGhhbmRjb2RlID09ICJmYWxzZSI6Ci0JCQkJCQlzZWxmLnNlcnZlcl9oYW5kY29kZSA9IDAKLQkJCQkJCXNlbGYuY2xpZW50X2hhbmRjb2RlID0gMAotCQkJCQllbGlmIGhhbmRjb2RlID09ICJ0cnVlIjoKLQkJCQkJCXNlbGYuc2VydmVyX2hhbmRjb2RlID0gMQotCQkJCQkJc2VsZi5jbGllbnRfaGFuZGNvZGUgPSAxCi0JCQkJCWVsaWYgaGFuZGNvZGUgPT0gImNsaWVudCI6Ci0JCQkJCQlzZWxmLnNlcnZlcl9oYW5kY29kZSA9IDAKLQkJCQkJCXNlbGYuY2xpZW50X2hhbmRjb2RlID0gMQotCQkJCQllbGlmIGhhbmRjb2RlID09ICJzZXJ2ZXIiOgotCQkJCQkJc2VsZi5zZXJ2ZXJfaGFuZGNvZGUgPSAxCi0JCQkJCQlzZWxmLmNsaWVudF9oYW5kY29kZSA9IDAKLQkJCQkJZWxzZToKLQkJCQkJCXJhaXNlIFJ1bnRpbWVFcnJvcignSW52YWxpZCBoYW5kY29kZSBtb2RlICIlcyIgaW4gZnVuY3Rpb24gIiVzIi4nICUgKGhhbmRjb2RlLCBzZWxmLm5hbWUpKQorCQkJCWhhbmRjb2RlID0gY2hpbGQubnNQcm9wKCAnaGFuZGNvZGUnLCBOb25lICkKKwkJCQlpZiBoYW5kY29kZSA9PSAiZmFsc2UiOgorCQkJCQlzZWxmLnNlcnZlcl9oYW5kY29kZSA9IDAKKwkJCQkJc2VsZi5jbGllbnRfaGFuZGNvZGUgPSAwCisJCQkJZWxpZiBoYW5kY29kZSA9PSAidHJ1ZSI6CisJCQkJCXNlbGYuc2VydmVyX2hhbmRjb2RlID0gMQorCQkJCQlzZWxmLmNsaWVudF9oYW5kY29kZSA9IDEKKwkJCQllbGlmIGhhbmRjb2RlID09ICJjbGllbnQiOgorCQkJCQlzZWxmLnNlcnZlcl9oYW5kY29kZSA9IDAKKwkJCQkJc2VsZi5jbGllbnRfaGFuZGNvZGUgPSAxCisJCQkJZWxpZiBoYW5kY29kZSA9PSAic2VydmVyIjoKKwkJCQkJc2VsZi5zZXJ2ZXJfaGFuZGNvZGUgPSAxCisJCQkJCXNlbGYuY2xpZW50X2hhbmRjb2RlID0gMAorCQkJCWVsc2U6CisJCQkJCXJhaXNlIFJ1bnRpbWVFcnJvcignSW52YWxpZCBoYW5kY29kZSBtb2RlICIlcyIgaW4gZnVuY3Rpb24gIiVzIi4nICUgKGhhbmRjb2RlLCBzZWxmLm5hbWUpKQogCi0JCQkJCXNlbGYuaWdub3JlICAgICAgICAgICAgICAgPSBnbF9YTUwuaXNfYXR0cl90cnVlKCBjaGlsZCwgJ2lnbm9yZScgKQotCQkJCQlzZWxmLmNhbl9iZV9sYXJnZSAgICAgICAgID0gZ2xfWE1MLmlzX2F0dHJfdHJ1ZSggY2hpbGQsICdsYXJnZScgKQotCQkJCQlzZWxmLmdseF9kb3VibGVzX2luX29yZGVyID0gZ2xfWE1MLmlzX2F0dHJfdHJ1ZSggY2hpbGQsICdkb3VibGVzX2luX29yZGVyJyApCi0JCQkJCXNlbGYucmVwbHlfYWx3YXlzX2FycmF5ICAgPSBnbF9YTUwuaXNfYXR0cl90cnVlKCBjaGlsZCwgJ2Fsd2F5c19hcnJheScgKQotCQkJCQlzZWxmLmRpbWVuc2lvbnNfaW5fcmVwbHkgID0gZ2xfWE1MLmlzX2F0dHJfdHJ1ZSggY2hpbGQsICdkaW1lbnNpb25zX2luX3JlcGx5JyApCisJCQkJc2VsZi5pZ25vcmUgICAgICAgICAgICAgICA9IGdsX1hNTC5pc19hdHRyX3RydWUoIGNoaWxkLCAnaWdub3JlJyApCisJCQkJc2VsZi5jYW5fYmVfbGFyZ2UgICAgICAgICA9IGdsX1hNTC5pc19hdHRyX3RydWUoIGNoaWxkLCAnbGFyZ2UnICkKKwkJCQlzZWxmLmdseF9kb3VibGVzX2luX29yZGVyID0gZ2xfWE1MLmlzX2F0dHJfdHJ1ZSggY2hpbGQsICdkb3VibGVzX2luX29yZGVyJyApCisJCQkJc2VsZi5yZXBseV9hbHdheXNfYXJyYXkgICA9IGdsX1hNTC5pc19hdHRyX3RydWUoIGNoaWxkLCAnYWx3YXlzX2FycmF5JyApCisJCQkJc2VsZi5kaW1lbnNpb25zX2luX3JlcGx5ICA9IGdsX1hNTC5pc19hdHRyX3RydWUoIGNoaWxkLCAnZGltZW5zaW9uc19pbl9yZXBseScgKQogCiAJCQljaGlsZCA9IGNoaWxkLm5leHQKIApAQCAtNTUzLDYgKzU1Nyw3IEBACiAKIAlkZWYgbmV4dChzZWxmKToKIAkJZiA9IHNlbGYuaXRlcmF0b3IubmV4dCgpCisKIAkJaWYgZi5jbGllbnRfc3VwcG9ydGVkX2Zvcl9pbmRpcmVjdCgpOgogCQkJcmV0dXJuIGYKIAkJZWxzZToKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2dsYXBpL2dsWF9wcm90b19zZW5kLnB5IGIvc3JjL21lc2EvZ2xhcGkvZ2xYX3Byb3RvX3NlbmQucHkKaW5kZXggMWI2YTVmMy4uYjAwYjhhMSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZ2xhcGkvZ2xYX3Byb3RvX3NlbmQucHkKKysrIGIvc3JjL21lc2EvZ2xhcGkvZ2xYX3Byb3RvX3NlbmQucHkKQEAgLTM3Myw3ICszNzMsNyBAQAogCQkJCXByaW50ICd7JwogCQkJCXByaW50ICcgICAgX19HTFhjb250ZXh0ICogY29uc3QgZ2MgPSBfX2dsWEdldEN1cnJlbnRDb250ZXh0KCk7JwogCQkJCXByaW50ICcnCi0JCQkJcHJpbnQgJyAgICBpZiAoZ2MtPmlzRGlyZWN0KSB7JworCQkJCXByaW50ICcgICAgaWYgKGdjLT5kcmlDb250ZXh0KSB7JwogCQkJCXByaW50ICcgICAgJXNDQUxMXyVzKEdFVF9ESVNQQVRDSCgpLCAoJXMpKTsnICUgKHJldF9zdHJpbmcsIGZ1bmMubmFtZSwgZnVuYy5nZXRfY2FsbGVkX3BhcmFtZXRlcl9zdHJpbmcoKSkKIAkJCQlwcmludCAnICAgIH0gZWxzZSB7JwogCQkJCWZvb3RlciA9ICd9XG59XG4nCkBAIC01MTEsNyArNTExLDcgQEAKIAkJcmV0dXJuCiAKIAotCWRlZiBjb21tb25fZnVuY19wcmludF9qdXN0X3N0YXJ0KHNlbGYsIGYpOgorCWRlZiBjb21tb25fZnVuY19wcmludF9qdXN0X3N0YXJ0KHNlbGYsIGYsIG5hbWUpOgogCQlwcmludCAnICAgIF9fR0xYY29udGV4dCAqIGNvbnN0IGdjID0gX19nbFhHZXRDdXJyZW50Q29udGV4dCgpOycKIAogCQkjIFRoZSBvbmx5IHJlYXNvbiB0aGF0IHNpbmdsZSBhbmQgdmVuZG9yIHByaXZhdGUgY29tbWFuZHMgbmVlZApAQCAtNTI5LDcgKzUyOSw3IEBACiAKIAkJaWYgbm90IGYuZ2x4X3JvcDoKIAkJCWZvciBwIGluIGYucGFyYW1ldGVySXRlcmF0ZU91dHB1dHMoKToKLQkJCQlpZiBwLmlzX2ltYWdlKCk6CisJCQkJaWYgcC5pc19pbWFnZSgpIGFuZCAocC5pbWdfZm9ybWF0ICE9ICJHTF9DT0xPUl9JTkRFWCIgb3IgcC5pbWdfdHlwZSAhPSAiR0xfQklUTUFQIik6CiAJCQkJCXByaW50ICcgICAgY29uc3QgX19HTFhhdHRyaWJ1dGUgKiBjb25zdCBzdGF0ZSA9IGdjLT5jbGllbnRfc3RhdGVfcHJpdmF0ZTsnCiAJCQkJCWJyZWFrCiAKQEAgLTU0NSwxMSArNTQ1LDIzIEBACiAJCQlwcmludCAnICAgICVzIHJldHZhbCA9ICglcykgMDsnICUgKGYucmV0dXJuX3R5cGUsIGYucmV0dXJuX3R5cGUpCiAKIAorCQlpZiBuYW1lICE9IE5vbmUgYW5kIG5hbWUgbm90IGluIGYuZ2x4X3ZlbmRvcnByaXZfbmFtZXM6CisJCQlwcmludCAnI2lmbmRlZiBVU0VfWENCJwogCQlzZWxmLmVtaXRfcGFja2V0X3NpemVfY2FsY3VsYXRpb24oZiwgMCkKKwkJaWYgbmFtZSAhPSBOb25lIGFuZCBuYW1lIG5vdCBpbiBmLmdseF92ZW5kb3Jwcml2X25hbWVzOgorCQkJcHJpbnQgJyNlbmRpZicKIAogCQljb25kaXRpb25fbGlzdCA9IFtdCiAJCWZvciBwIGluIGYucGFyYW1ldGVySXRlcmF0ZUNvdW50ZXJzKCk6CiAJCQljb25kaXRpb25fbGlzdC5hcHBlbmQoICIlcyA+PSAwIiAlIChwLm5hbWUpICkKKwkJCSMgJ2NvdW50ZXInIHBhcmFtZXRlcnMgY2Fubm90IGJlIG5lZ2F0aXZlCisJCQlwcmludCAiICAgIGlmICglcyA8IDApIHsiICUgcC5uYW1lCisJCQlwcmludCAiICAgICAgICBfX2dsWFNldEVycm9yKGdjLCBHTF9JTlZBTElEX1ZBTFVFKTsiCisJCQlpZiBmLnJldHVybl90eXBlICE9ICd2b2lkJzoKKwkJCQlwcmludCAiICAgICAgICByZXR1cm4gMDsiCisJCQllbHNlOgorCQkJCXByaW50ICIgICAgICAgIHJldHVybjsiCisJCQlwcmludCAiICAgIH0iCiAKIAkJaWYgc2tpcF9jb25kaXRpb246CiAJCQljb25kaXRpb25fbGlzdC5hcHBlbmQoIHNraXBfY29uZGl0aW9uICkKQEAgLTU2Nyw3ICs1NzksNyBAQAogCiAKIAlkZWYgcHJpbnRTaW5nbGVGdW5jdGlvbihzZWxmLCBmLCBuYW1lKToKLQkJc2VsZi5jb21tb25fZnVuY19wcmludF9qdXN0X3N0YXJ0KGYpCisJCXNlbGYuY29tbW9uX2Z1bmNfcHJpbnRfanVzdF9zdGFydChmLCBuYW1lKQogCiAJCWlmIHNlbGYuZGVidWc6CiAJCQlwcmludCAnICAgICAgICBwcmludGYoICJFbnRlciAlJXMuLi5cXG4iLCAiZ2wlcyIgKTsnICUgKGYubmFtZSkKQEAgLTczOSw3ICs3NTEsNyBAQAogCQkJcmV0dXJuCiAKIAotCQlpZiBzZWxmLmNvbW1vbl9mdW5jX3ByaW50X2p1c3Rfc3RhcnQoZik6CisJCWlmIHNlbGYuY29tbW9uX2Z1bmNfcHJpbnRfanVzdF9zdGFydChmLCBOb25lKToKIAkJCXRyYWlsZXIgPSAiICAgIH0iCiAJCWVsc2U6CiAJCQl0cmFpbGVyID0gTm9uZQpAQCAtNzkxLDcgKzgwMyw3IEBACiAJCQkJCXByaW50ICcgICAgZ2VuZXJpY18ldV9ieXRlKCAlcywgJXMgKTsnICUgKGNtZGxlbiwgZi5vcGNvZGVfcmVhbF9uYW1lKCksIHAubmFtZSkKIAkJCQkJcmV0dXJuCiAKLQkJaWYgc2VsZi5jb21tb25fZnVuY19wcmludF9qdXN0X3N0YXJ0KGYpOgorCQlpZiBzZWxmLmNvbW1vbl9mdW5jX3ByaW50X2p1c3Rfc3RhcnQoZiwgTm9uZSk6CiAJCQl0cmFpbGVyID0gIiAgICB9IgogCQllbHNlOgogCQkJdHJhaWxlciA9IE5vbmUKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL2dsYXBpL2dsX0FQSS54bWwgYi9zcmMvbWVzYS9nbGFwaS9nbF9BUEkueG1sCmluZGV4IGVmNGEzMDkuLjJkOGE5NjcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL2dsYXBpL2dsX0FQSS54bWwKKysrIGIvc3JjL21lc2EvZ2xhcGkvZ2xfQVBJLnhtbApAQCAtMzM4MCw3ICszMzgwLDkgQEAKICAgICAgICAgPHNpemUgbmFtZT0iR2V0VGV4UGFyYW1ldGVyZnYiIG1vZGU9ImdldCIvPgogICAgICAgICA8c2l6ZSBuYW1lPSJHZXRUZXhQYXJhbWV0ZXJpdiIgbW9kZT0iZ2V0Ii8+CiAgICAgPC9lbnVtPgotICAgIDxlbnVtIG5hbWU9Ik1BWF8zRF9URVhUVVJFX1NJWkUiICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDgwNzMiLz4KKyAgICA8ZW51bSBuYW1lPSJNQVhfM0RfVEVYVFVSRV9TSVpFIiAgICAgICAgICAgY291bnQ9IjEiICB2YWx1ZT0iMHg4MDczIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CiAgICAgPGVudW0gbmFtZT0iVU5TSUdORURfQllURV8yXzNfM19SRVYiICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODM2MiIvPgogICAgIDxlbnVtIG5hbWU9IlVOU0lHTkVEX1NIT1JUXzVfNl81IiAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDgzNjMiLz4KICAgICA8ZW51bSBuYW1lPSJVTlNJR05FRF9TSE9SVF81XzZfNV9SRVYiICAgICAgICAgICAgICAgICB2YWx1ZT0iMHg4MzY0Ii8+CkBAIC00NTI3LDE1ICs0NTI5LDE5IEBACiAgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IlBPSU5UX1NJWkVfTUlOIiAgICAgICAgICAgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDgxMjYiPgogICAgICAgICA8c2l6ZSBuYW1lPSJQb2ludFBhcmFtZXRlcmZ2RVhUIi8+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CiAgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IlBPSU5UX1NJWkVfTUFYIiAgICAgICAgICAgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDgxMjciPgogICAgICAgICA8c2l6ZSBuYW1lPSJQb2ludFBhcmFtZXRlcmZ2RVhUIi8+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CiAgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IlBPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUiICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDgxMjgiPgogICAgICAgICA8c2l6ZSBuYW1lPSJQb2ludFBhcmFtZXRlcmZ2RVhUIi8+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CiAgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IlBPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OIiAgICBjb3VudD0iMyIgIHZhbHVlPSIweDgxMjkiPgogICAgICAgICA8c2l6ZSBuYW1lPSJQb2ludFBhcmFtZXRlcmZ2RVhUIi8+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CiAgICAgPC9lbnVtPgogICAgIDxlbnVtIG5hbWU9IkdFTkVSQVRFX01JUE1BUCIgICAgICAgICAgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDgxOTEiPgogICAgICAgICA8c2l6ZSBuYW1lPSJUZXhQYXJhbWV0ZXJmdiIvPgpAQCAtNzI4NSwyNyArNzI5MSw1OSBAQAogPC9jYXRlZ29yeT4KIAogPGNhdGVnb3J5IG5hbWU9IkdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCIgbnVtYmVyPSIyOCI+Ci0gICAgPGVudW0gbmFtZT0iQlVGRkVSX1NJWkVfQVJCIiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODc2NCIvPgotICAgIDxlbnVtIG5hbWU9IkJVRkZFUl9VU0FHRV9BUkIiICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg3NjUiLz4KLSAgICA8ZW51bSBuYW1lPSJBUlJBWV9CVUZGRVJfQVJCIiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iMHg4ODkyIi8+Ci0gICAgPGVudW0gbmFtZT0iRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCIiAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODg5MyIvPgotICAgIDxlbnVtIG5hbWU9IkFSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg4OTQiLz4KLSAgICA8ZW51bSBuYW1lPSJFTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgICAgICAgICB2YWx1ZT0iMHg4ODk1Ii8+Ci0gICAgPGVudW0gbmFtZT0iVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgICAgICAgICAgdmFsdWU9IjB4ODg5NiIvPgotICAgIDxlbnVtIG5hbWU9Ik5PUk1BTF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiICAgICAgICAgIHZhbHVlPSIweDg4OTciLz4KLSAgICA8ZW51bSBuYW1lPSJDT0xPUl9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiICAgICAgICAgICB2YWx1ZT0iMHg4ODk4Ii8+Ci0gICAgPGVudW0gbmFtZT0iSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiAgICAgICAgICAgdmFsdWU9IjB4ODg5OSIvPgotICAgIDxlbnVtIG5hbWU9IlRFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiAgIHZhbHVlPSIweDg4OUEiLz4KLSAgICA8ZW51bSBuYW1lPSJFREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiAgICAgICB2YWx1ZT0iMHg4ODlCIi8+Ci0gICAgPGVudW0gbmFtZT0iU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgdmFsdWU9IjB4ODg5QyIvPgotICAgIDxlbnVtIG5hbWU9IkZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgIHZhbHVlPSIweDg4OUQiLz4KLSAgICA8ZW51bSBuYW1lPSJXRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiAgICAgICAgICB2YWx1ZT0iMHg4ODlFIi8+Ci0gICAgPGVudW0gbmFtZT0iVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiICAgdmFsdWU9IjB4ODg5RiIvPgorICAgIDxlbnVtIG5hbWU9IkJVRkZFUl9TSVpFX0FSQiIgICAgICAgICAgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDg3NjQiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQiIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IkJVRkZFUl9VU0FHRV9BUkIiICAgICAgICAgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDg3NjUiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQiIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IkFSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgICAgICBjb3VudD0iMSIgIHZhbHVlPSIweDg4OTQiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJFTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgY291bnQ9IjEiIHZhbHVlPSIweDg4OTUiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJWRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiBjb3VudD0iMSIgdmFsdWU9IjB4ODg5NiI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9Ik5PUk1BTF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiIGNvdW50PSIxIiB2YWx1ZT0iMHg4ODk3Ij4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CisgICAgPGVudW0gbmFtZT0iQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiBjb3VudD0iMSIgdmFsdWU9IjB4ODg5OCI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IklOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgY291bnQ9IjEiIHZhbHVlPSIweDg4OTkiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJURVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiIgY291bnQ9IjEiIHZhbHVlPSIweDg4OUEiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJFREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiBjb3VudD0iMSIgdmFsdWU9IjB4ODg5QiI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IlNFQ09OREFSWV9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiIGNvdW50PSIxIiB2YWx1ZT0iMHg4ODlDIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CisgICAgPGVudW0gbmFtZT0iRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIiBjb3VudD0iMSIgdmFsdWU9IjB4ODg5RCI+CisgICAgICAgIDxzaXplIG5hbWU9IkdldCIgbW9kZT0iZ2V0Ii8+CisgICAgPC9lbnVtPgorICAgIDxlbnVtIG5hbWU9IldFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiIGNvdW50PSIxIiB2YWx1ZT0iMHg4ODlFIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CisgICAgPGVudW0gbmFtZT0iVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElOR19BUkIiIGNvdW50PSIxIiB2YWx1ZT0iMHg4ODlGIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0VmVydGV4QXR0cmliZHZBUkIiIG1vZGU9ImdldCIvPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXRWZXJ0ZXhBdHRyaWJmdkFSQiIgbW9kZT0iZ2V0Ii8+CisgICAgICAgIDxzaXplIG5hbWU9IkdldFZlcnRleEF0dHJpYml2QVJCIiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CiAgICAgPGVudW0gbmFtZT0iUkVBRF9PTkxZX0FSQiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODhCOCIvPgogICAgIDxlbnVtIG5hbWU9IldSSVRFX09OTFlfQVJCIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg4QjkiLz4KICAgICA8ZW51bSBuYW1lPSJSRUFEX1dSSVRFX0FSQiIgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iMHg4OEJBIi8+Ci0gICAgPGVudW0gbmFtZT0iQlVGRkVSX0FDQ0VTU19BUkIiICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODhCQiIvPgotICAgIDxlbnVtIG5hbWU9IkJVRkZFUl9NQVBQRURfQVJCIiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg4QkMiLz4KKyAgICA8ZW51bSBuYW1lPSJCVUZGRVJfQUNDRVNTX0FSQiIgICAgICAgICAgICAgY291bnQ9IjEiICB2YWx1ZT0iMHg4OEJCIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KKyAgICA8ZW51bSBuYW1lPSJCVUZGRVJfTUFQUEVEX0FSQiIgICAgICAgICAgICAgY291bnQ9IjEiICB2YWx1ZT0iMHg4OEJDIj4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KICAgICA8ZW51bSBuYW1lPSJCVUZGRVJfTUFQX1BPSU5URVJfQVJCIiAgICAgICAgICAgICAgICAgICB2YWx1ZT0iMHg4OEJEIi8+CiAgICAgPGVudW0gbmFtZT0iU1RSRUFNX0RSQVdfQVJCIiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODhFMCIvPgogICAgIDxlbnVtIG5hbWU9IlNUUkVBTV9SRUFEX0FSQiIgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg4RTEiLz4KQEAgLTczMTcsOCArNzM1NSw4IEBACiAgICAgPGVudW0gbmFtZT0iRFlOQU1JQ19SRUFEX0FSQiIgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjB4ODhFOSIvPgogICAgIDxlbnVtIG5hbWU9IkRZTkFNSUNfQ09QWV9BUkIiICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIweDg4RUEiLz4KIAotICAgIDx0eXBlIG5hbWU9ImludHB0ckFSQiIgICAgICAgICAgICAgICAgICAgc2l6ZT0iNCIvPgotICAgIDx0eXBlIG5hbWU9InNpemVpcHRyQVJCIiB1bnNpZ25lZD0idHJ1ZSIgc2l6ZT0iNCIvPgorICAgIDx0eXBlIG5hbWU9ImludHB0ckFSQiIgICBzaXplPSI0IiAgICAgICAgICAgICAgICAgIGdseF9uYW1lPSJDQVJEMzIiLz4KKyAgICA8dHlwZSBuYW1lPSJzaXplaXB0ckFSQiIgc2l6ZT0iNCIgIHVuc2lnbmVkPSJ0cnVlIiBnbHhfbmFtZT0iQ0FSRDMyIi8+CiAKICAgICA8ZnVuY3Rpb24gbmFtZT0iQmluZEJ1ZmZlckFSQiIgb2Zmc2V0PSJhc3NpZ24iPgogICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB0eXBlPSJHTGVudW0iLz4KQEAgLTczMjgsOCArNzM2Niw4IEBACiAKICAgICA8ZnVuY3Rpb24gbmFtZT0iQnVmZmVyRGF0YUFSQiIgb2Zmc2V0PSJhc3NpZ24iPgogICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB0eXBlPSJHTGVudW0iLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9InNpemUiIHR5cGU9IkdMc2l6ZWlwdHJBUkIiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImRhdGEiIHR5cGU9ImNvbnN0IEdMdm9pZCAqIi8+CisgICAgICAgIDxwYXJhbSBuYW1lPSJzaXplIiB0eXBlPSJHTHNpemVpcHRyQVJCIiBjb3VudGVyPSJ0cnVlIi8+CisgICAgICAgIDxwYXJhbSBuYW1lPSJkYXRhIiB0eXBlPSJjb25zdCBHTHZvaWQgKiIgY291bnQ9InNpemUiIGltZ19udWxsX2ZsYWc9InRydWUiLz4KICAgICAgICAgPHBhcmFtIG5hbWU9InVzYWdlIiB0eXBlPSJHTGVudW0iLz4KICAgICAgICAgPGdseCBpZ25vcmU9InRydWUiLz4KICAgICA8L2Z1bmN0aW9uPgpAQCAtNzMzNywxNCArNzM3NSwxNCBAQAogICAgIDxmdW5jdGlvbiBuYW1lPSJCdWZmZXJTdWJEYXRhQVJCIiBvZmZzZXQ9ImFzc2lnbiI+CiAgICAgICAgIDxwYXJhbSBuYW1lPSJ0YXJnZXQiIHR5cGU9IkdMZW51bSIvPgogICAgICAgICA8cGFyYW0gbmFtZT0ib2Zmc2V0IiB0eXBlPSJHTGludHB0ckFSQiIvPgotICAgICAgICA8cGFyYW0gbmFtZT0ic2l6ZSIgdHlwZT0iR0xzaXplaXB0ckFSQiIvPgotICAgICAgICA8cGFyYW0gbmFtZT0iZGF0YSIgdHlwZT0iY29uc3QgR0x2b2lkICoiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9InNpemUiIHR5cGU9IkdMc2l6ZWlwdHJBUkIiIGNvdW50ZXI9InRydWUiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9ImRhdGEiIHR5cGU9ImNvbnN0IEdMdm9pZCAqIiBjb3VudD0ic2l6ZSIvPgogICAgICAgICA8Z2x4IGlnbm9yZT0idHJ1ZSIvPgogICAgIDwvZnVuY3Rpb24+CiAKICAgICA8ZnVuY3Rpb24gbmFtZT0iRGVsZXRlQnVmZmVyc0FSQiIgb2Zmc2V0PSJhc3NpZ24iPgotICAgICAgICA8cGFyYW0gbmFtZT0ibiIgdHlwZT0iR0xzaXplaSIvPgotICAgICAgICA8cGFyYW0gbmFtZT0iYnVmZmVyIiB0eXBlPSJjb25zdCBHTHVpbnQgKiIvPgorICAgICAgICA8cGFyYW0gbmFtZT0ibiIgdHlwZT0iR0xzaXplaSIgY291bnRlcj0idHJ1ZSIvPgorICAgICAgICA8cGFyYW0gbmFtZT0iYnVmZmVyIiB0eXBlPSJjb25zdCBHTHVpbnQgKiIgY291bnQ9Im4iLz4KICAgICAgICAgPGdseCBpZ25vcmU9InRydWUiLz4KICAgICA8L2Z1bmN0aW9uPgogCkBAIC03MzU3LDcgKzczOTUsNyBAQAogICAgIDxmdW5jdGlvbiBuYW1lPSJHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQiIgb2Zmc2V0PSJhc3NpZ24iPgogICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB0eXBlPSJHTGVudW0iLz4KICAgICAgICAgPHBhcmFtIG5hbWU9InBuYW1lIiB0eXBlPSJHTGVudW0iLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9InBhcmFtcyIgdHlwZT0iR0xpbnQgKiIgb3V0cHV0PSJ0cnVlIi8+CisgICAgICAgIDxwYXJhbSBuYW1lPSJwYXJhbXMiIHR5cGU9IkdMaW50ICoiIG91dHB1dD0idHJ1ZSIgdmFyaWFibGVfcGFyYW09InBuYW1lIi8+CiAgICAgICAgIDxnbHggaWdub3JlPSJ0cnVlIi8+CiAgICAgPC9mdW5jdGlvbj4KIApAQCAtNzM3MSw4ICs3NDA5LDggQEAKICAgICA8ZnVuY3Rpb24gbmFtZT0iR2V0QnVmZmVyU3ViRGF0YUFSQiIgb2Zmc2V0PSJhc3NpZ24iPgogICAgICAgICA8cGFyYW0gbmFtZT0idGFyZ2V0IiB0eXBlPSJHTGVudW0iLz4KICAgICAgICAgPHBhcmFtIG5hbWU9Im9mZnNldCIgdHlwZT0iR0xpbnRwdHJBUkIiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9InNpemUiIHR5cGU9IkdMc2l6ZWlwdHJBUkIiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImRhdGEiIHR5cGU9IkdMdm9pZCAqIiBvdXRwdXQ9InRydWUiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9InNpemUiIHR5cGU9IkdMc2l6ZWlwdHJBUkIiIGNvdW50ZXI9InRydWUiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9ImRhdGEiIHR5cGU9IkdMdm9pZCAqIiBvdXRwdXQ9InRydWUiIGNvdW50PSJzaXplIi8+CiAgICAgICAgIDxnbHggaWdub3JlPSJ0cnVlIi8+CiAgICAgPC9mdW5jdGlvbj4KIApAQCAtMTIxMjksOCArMTIxNjcsMTIgQEAKIDxjYXRlZ29yeSBuYW1lPSJHTF9FWFRfZnJhbWVidWZmZXJfYmxpdCIgbnVtYmVyPSIzMTYiPgogICAgIDxlbnVtIG5hbWU9IlJFQURfRlJBTUVCVUZGRVJfRVhUIiB2YWx1ZT0iMHg4Q0E4Ii8+CiAgICAgPGVudW0gbmFtZT0iRFJBV19GUkFNRUJVRkZFUl9FWFQiIHZhbHVlPSIweDhDQTkiLz4KLSAgICA8ZW51bSBuYW1lPSJEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUIiB2YWx1ZT0iMHg4Q0E2Ii8+Ci0gICAgPGVudW0gbmFtZT0iUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCIgdmFsdWU9IjB4OENBQSIvPgorICAgIDxlbnVtIG5hbWU9IkRSQVdfRlJBTUVCVUZGRVJfQklORElOR19FWFQiIGNvdW50PSIxIiB2YWx1ZT0iMHg4Q0E2Ij4KKyAgICAgICAgPHNpemUgbmFtZT0iR2V0IiBtb2RlPSJnZXQiLz4KKyAgICA8L2VudW0+CisgICAgPGVudW0gbmFtZT0iUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCIgY291bnQ9IjEiIHZhbHVlPSIweDhDQUEiPgorICAgICAgICA8c2l6ZSBuYW1lPSJHZXQiIG1vZGU9ImdldCIvPgorICAgIDwvZW51bT4KICAgICA8ZnVuY3Rpb24gbmFtZT0iQmxpdEZyYW1lYnVmZmVyRVhUIiBvZmZzZXQ9ImFzc2lnbiIgc3RhdGljX2Rpc3BhdGNoPSJmYWxzZSI+CiAgICAgICAgIDxwYXJhbSBuYW1lPSJzcmNYMCIgdHlwZT0iR0xpbnQiLz4KICAgICAgICAgPHBhcmFtIG5hbWU9InNyY1kwIiB0eXBlPSJHTGludCIvPgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZ2xhcGkvZ2xhcGkuYyBiL3NyYy9tZXNhL2dsYXBpL2dsYXBpLmMKaW5kZXggNTNlZmQ3ZS4uMzg1OGE0ZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZ2xhcGkvZ2xhcGkuYworKysgYi9zcmMvbWVzYS9nbGFwaS9nbGFwaS5jCkBAIC01MCw3ICs1MCwyMyBAQAogCiAKIAorI2lmZGVmIEhBVkVfRElYX0NPTkZJR19ICisKKyNpbmNsdWRlIDxkaXgtY29uZmlnLmg+CisjZGVmaW5lIFBVQkxJQworCisjZWxzZQorCiAjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIERFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwogI2luY2x1ZGUgImdsYXBpLmgiCiAjaW5jbHVkZSAiZ2xhcGlvZmZzZXRzLmgiCiAjaW5jbHVkZSAiZ2xhcGl0YWJsZS5oIgpAQCAtMzczLDYgKzM4OSw0NTAgQEAKIAogCiAvKioKKyAqIFRyYWNrIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24gYWRkZWQgdG8gdGhlIEdMIEFQSS4KKyAqLworc3RydWN0IF9nbGFwaV9mdW5jdGlvbiB7CisgICAvKioKKyAgICAqIE5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBjb25zdCBjaGFyICogbmFtZTsKKworCisgICAvKioKKyAgICAqIFRleHQgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlCisgICAgKiBuYW1lZCBmdW5jdGlvbi4gICBQYXJhbWV0ZXIgdHlwZXMgYXJlIGNvbnZlcnRlZCB0byBjaGFyYWN0ZXJzIHVzaW5nIHRoZQorICAgICogZm9sbG93aW5nIHJ1bGVzOgorICAgICogICAtICdpJyBmb3IgXGMgR0xpbnQsIFxjIEdMdWludCwgYW5kIFxjIEdMZW51bQorICAgICogICAtICdwJyBmb3IgYW55IHBvaW50ZXIgdHlwZQorICAgICogICAtICdmJyBmb3IgXGMgR0xmbG9hdCBhbmQgXGMgR0xjbGFtcGYKKyAgICAqICAgLSAnZCcgZm9yIFxjIEdMZG91YmxlIGFuZCBcYyBHTGNsYW1wZAorICAgICovCisgICBjb25zdCBjaGFyICogcGFyYW1ldGVyX3NpZ25hdHVyZTsKKworCisgICAvKioKKyAgICAqIE9mZnNldCBpbiB0aGUgZGlzcGF0Y2ggdGFibGUgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlYWwgZnVuY3Rpb24gaXMKKyAgICAqIGxvY2F0ZWQuICBJZiB0aGUgZHJpdmVyIGhhcyBub3QgcmVxdWVzdGVkIHRoYXQgdGhlIG5hbWVkIGZ1bmN0aW9uIGJlCisgICAgKiBhZGRlZCB0byB0aGUgZGlzcGF0Y2ggdGFibGUsIHRoaXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSB+MC4KKyAgICAqLworICAgdW5zaWduZWQgZGlzcGF0Y2hfb2Zmc2V0OworCisKKyAgIC8qKgorICAgICogUG9pbnRlciB0byB0aGUgZGlzcGF0Y2ggc3R1YiBmb3IgdGhlIG5hbWVkIGZ1bmN0aW9uLgorICAgICogCisgICAgKiBcdG9kbworICAgICogVGhlIHNlbWFudGljIG9mIHRoaXMgZmllbGQgc2hvdWxkIGJlIGNoYW5nZWQgc2xpZ2h0bHkuICBDdXJyZW50bHksIGl0CisgICAgKiBpcyBhbHdheXMgZXhwZWN0ZWQgdG8gYmUgbm9uLVxjIE5VTEwuICBIb3dldmVyLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8KKyAgICAqIG9ubHkgYWxsb2NhdGUgdGhlIGVudHJ5LXBvaW50IHN0dWIgd2hlbiB0aGUgYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlCisgICAgKiBmdW5jdGlvbiB2aWEgXGMgZ2xYR2V0UHJvY0FkZHJlc3MuICBUaGlzIHdvdWxkIHNhdmUgbWVtb3J5IGZvciBhbGwgdGhlCisgICAgKiBmdW5jdGlvbnMgdGhhdCB0aGUgZHJpdmVyIGV4cG9ydHMgYnV0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIG5ldmVyIHdhbnRzCisgICAgKiB0byBjYWxsLgorICAgICovCisgICBfZ2xhcGlfcHJvYyBkaXNwYXRjaF9zdHViOworfTsKKworCitzdGF0aWMgc3RydWN0IF9nbGFwaV9mdW5jdGlvbiBFeHRFbnRyeVRhYmxlW01BWF9FWFRFTlNJT05fRlVOQ1NdOworc3RhdGljIEdMdWludCBOdW1FeHRFbnRyeVBvaW50cyA9IDA7CisKKyNpZmRlZiBVU0VfU1BBUkNfQVNNCitleHRlcm4gdm9pZCBfX2dsYXBpX3NwYXJjX2ljYWNoZV9mbHVzaCh1bnNpZ25lZCBpbnQgKik7CisjZW5kaWYKKworLyoqCisgKiBHZW5lcmF0ZSBhIGRpc3BhdGNoIGZ1bmN0aW9uIChlbnRyeXBvaW50KSB3aGljaCBqdW1wcyB0aHJvdWdoCisgKiB0aGUgZ2l2ZW4gc2xvdCBudW1iZXIgKG9mZnNldCkgaW4gdGhlIGN1cnJlbnQgZGlzcGF0Y2ggdGFibGUuCisgKiBXZSBuZWVkIGFzc2VtYmx5IGxhbmd1YWdlIGluIG9yZGVyIHRvIGFjY29tcGxpc2ggdGhpcy4KKyAqLworc3RhdGljIF9nbGFwaV9wcm9jCitnZW5lcmF0ZV9lbnRyeXBvaW50KEdMdWludCBmdW5jdGlvbk9mZnNldCkKK3sKKyNpZiBkZWZpbmVkKFVTRV9YODZfQVNNKQorICAgLyogMzIgaXMgY2hvc2VuIGFzIHNvbWV0aGluZyBvZiBhIG1hZ2ljIG9mZnNldC4gIEZvciB4ODYsIHRoZSBkaXNwYXRjaAorICAgICogYXQgb2Zmc2V0IDMyIGlzIHRoZSBmaXJzdCBvbmUgd2hlcmUgdGhlIG9mZnNldCBpbiB0aGUKKyAgICAqICJqbXAgT0ZGU0VUKjQoJWVheCkiIGNhbid0IGJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZS4KKyAgICAqLworICAgY29uc3QgR0x1Ynl0ZSAqIGNvbnN0IHRlbXBsYXRlX2Z1bmMgPSBnbF9kaXNwYXRjaF9mdW5jdGlvbnNfc3RhcnQgCisgICAgICsgKERJU1BBVENIX0ZVTkNUSU9OX1NJWkUgKiAzMik7CisgICBHTHVieXRlICogY29uc3QgY29kZSA9IChHTHVieXRlICopIG1hbGxvYyhESVNQQVRDSF9GVU5DVElPTl9TSVpFKTsKKworCisgICBpZiAoIGNvZGUgIT0gTlVMTCApIHsKKyAgICAgICh2b2lkKSBtZW1jcHkoY29kZSwgdGVtcGxhdGVfZnVuYywgRElTUEFUQ0hfRlVOQ1RJT05fU0laRSk7CisgICAgICBmaWxsX2luX2VudHJ5cG9pbnRfb2Zmc2V0KCAoX2dsYXBpX3Byb2MpIGNvZGUsIGZ1bmN0aW9uT2Zmc2V0ICk7CisgICB9CisKKyAgIHJldHVybiAoX2dsYXBpX3Byb2MpIGNvZGU7CisjZWxpZiBkZWZpbmVkKFVTRV9TUEFSQ19BU00pCisKKyNpZmRlZiBfX2FyY2g2NF9fCisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGluc25fdGVtcGxhdGVbXSA9IHsKKwkgICAweDA1MDAwMDAwLAkvKiBzZXRoaQkldWhpKF9nbGFwaV9EaXNwYXRjaCksICVnMgkqLworCSAgIDB4MDMwMDAwMDAsCS8qIHNldGhpCSVoaShfZ2xhcGlfRGlzcGF0Y2gpLCAlZzEJKi8KKwkgICAweDg0MTBhMDAwLAkvKiBvcgkJJWcyLCAldWxvKF9nbGFwaV9EaXNwYXRjaCksICVnMgkqLworCSAgIDB4ODIxMDYwMDAsCS8qIG9yCQklZzEsICVsbyhfZ2xhcGlfRGlzcGF0Y2gpLCAlZzEJKi8KKwkgICAweDg1MjhiMDIwLAkvKiBzbGx4CQklZzIsIDMyLCAlZzIJCQkqLworCSAgIDB4YzI1ODQwMDIsCS8qIGxkeAkJWyVnMSArICVnMl0sICVnMQkJKi8KKwkgICAweDA1MDAwMDAwLAkvKiBzZXRoaQklaGkoOCAqIGdsYXBpb2Zmc2V0KSwgJWcyCSovCisJICAgMHg4NDEwYTAwMCwJLyogb3IJCSVnMiwgJWxvKDggKiBnbGFwaW9mZnNldCksICVnMgkqLworCSAgIDB4YzY1ODQwMDIsCS8qIGxkeAkJWyVnMSArICVnMl0sICVnMwkJKi8KKwkgICAweDgxYzBjMDAwLAkvKiBqbXBsCQklZzMsICVnMAkJCSovCisJICAgMHgwMTAwMDAwMAkvKiAgbm9wCQkJCQkJKi8KKyAgIH07CisjZWxzZQorICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnNuX3RlbXBsYXRlW10gPSB7CisJICAgMHgwMzAwMDAwMCwJLyogc2V0aGkJJWhpKF9nbGFwaV9EaXNwYXRjaCksICVnMQkgICovCisJICAgMHhjMjAwNjAwMCwJLyogbGQJCVslZzEgKyAlbG8oX2dsYXBpX0Rpc3BhdGNoKV0sICVnMSAqLworCSAgIDB4YzYwMDYwMDAsCS8qIGxkCQlbJWcxICsgJWxvKDQqZ2xhcGlvZmZzZXQpXSwgJWczCSAgKi8KKwkgICAweDgxYzBjMDAwLAkvKiBqbXBsCQklZzMsICVnMAkJCSAgKi8KKwkgICAweDAxMDAwMDAwCS8qICBub3AJCQkJCQkgICovCisgICB9OworI2VuZGlmIC8qIF9fYXJjaDY0X18gKi8KKyAgIHVuc2lnbmVkIGludCAqY29kZSA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZihpbnNuX3RlbXBsYXRlKSk7CisgICB1bnNpZ25lZCBsb25nIGdsYXBpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgJl9nbGFwaV9EaXNwYXRjaDsKKyAgIGlmIChjb2RlKSB7CisgICAgICBtZW1jcHkoY29kZSwgaW5zbl90ZW1wbGF0ZSwgc2l6ZW9mKGluc25fdGVtcGxhdGUpKTsKKworI2lmZGVmIF9fYXJjaDY0X18KKyAgICAgIGNvZGVbMF0gfD0gKGdsYXBpX2FkZHIgPj4gKDMyICsgMTApKTsKKyAgICAgIGNvZGVbMV0gfD0gKChnbGFwaV9hZGRyICYgMHhmZmZmZmZmZikgPj4gMTApOworICAgICAgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2goJmNvZGVbMF0pOworICAgICAgY29kZVsyXSB8PSAoKGdsYXBpX2FkZHIgPj4gMzIpICYgKCgxIDw8IDEwKSAtIDEpKTsKKyAgICAgIGNvZGVbM10gfD0gKGdsYXBpX2FkZHIgJiAoKDEgPDwgMTApIC0gMSkpOworICAgICAgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2goJmNvZGVbMl0pOworICAgICAgY29kZVs2XSB8PSAoKGZ1bmN0aW9uT2Zmc2V0ICogOCkgPj4gMTApOworICAgICAgY29kZVs3XSB8PSAoKGZ1bmN0aW9uT2Zmc2V0ICogOCkgJiAoKDEgPDwgMTApIC0gMSkpOworICAgICAgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2goJmNvZGVbNl0pOworI2Vsc2UKKyAgICAgIGNvZGVbMF0gfD0gKGdsYXBpX2FkZHIgPj4gMTApOworICAgICAgY29kZVsxXSB8PSAoZ2xhcGlfYWRkciAmICgoMSA8PCAxMCkgLSAxKSk7CisgICAgICBfX2dsYXBpX3NwYXJjX2ljYWNoZV9mbHVzaCgmY29kZVswXSk7CisgICAgICBjb2RlWzJdIHw9IChmdW5jdGlvbk9mZnNldCAqIDQpOworICAgICAgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2goJmNvZGVbMl0pOworI2VuZGlmIC8qIF9fYXJjaDY0X18gKi8KKyAgIH0KKyAgIHJldHVybiAoX2dsYXBpX3Byb2MpIGNvZGU7CisjZWxzZQorICAgKHZvaWQpIGZ1bmN0aW9uT2Zmc2V0OworICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogVVNFXypfQVNNICovCit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYSBuZXcgZGlzcGF0Y2ggb2Zmc2V0IGludG8gdGhlIGFzc2VtYmx5IGxhbmd1YWdlCisgKiBzdHViIHRoYXQgd2FzIGdlbmVyYXRlZCB3aXRoIHRoZSBwcmVjZWVkaW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZAorZmlsbF9pbl9lbnRyeXBvaW50X29mZnNldChfZ2xhcGlfcHJvYyBlbnRyeXBvaW50LCBHTHVpbnQgb2Zmc2V0KQoreworI2lmIGRlZmluZWQoVVNFX1g4Nl9BU00pCisgICBHTHVieXRlICogY29uc3QgY29kZSA9IChHTHVieXRlICopIGVudHJ5cG9pbnQ7CisKKyNpZiBESVNQQVRDSF9GVU5DVElPTl9TSVpFID09IDMyCisgICAqKCh1bnNpZ25lZCBpbnQgKikoY29kZSArIDExKSkgPSA0ICogb2Zmc2V0OworICAgKigodW5zaWduZWQgaW50ICopKGNvZGUgKyAyMikpID0gNCAqIG9mZnNldDsKKyNlbGlmIERJU1BBVENIX0ZVTkNUSU9OX1NJWkUgPT0gMTYgJiYgZGVmaW5lZCggR0xYX1VTRV9UTFMgKQorICAgKigodW5zaWduZWQgaW50ICopKGNvZGUgKyAgOCkpID0gNCAqIG9mZnNldDsKKyNlbGlmIERJU1BBVENIX0ZVTkNUSU9OX1NJWkUgPT0gMTYKKyAgICooKHVuc2lnbmVkIGludCAqKShjb2RlICsgIDcpKSA9IDQgKiBvZmZzZXQ7CisjZWxzZQorIyBlcnJvciBJbnZhbGlkIERJU1BBVENIX0ZVTkNUSU9OX1NJWkUhCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChVU0VfU1BBUkNfQVNNKQorCisgICAvKiBYWFggdGhpcyBoYXNuJ3QgYmVlbiB0ZXN0ZWQhICovCisgICB1bnNpZ25lZCBpbnQgKmNvZGUgPSAodW5zaWduZWQgaW50ICopIGVudHJ5cG9pbnQ7CisjaWZkZWYgX19hcmNoNjRfXworICAgY29kZVs2XSA9IDB4MDUwMDAwMDA7ICAvKiBzZXRoaQklaGkoOCAqIGdsYXBpb2Zmc2V0KSwgJWcyCSovCisgICBjb2RlWzddID0gMHg4NDEwYTAwMDsgIC8qIG9yCQklZzIsICVsbyg4ICogZ2xhcGlvZmZzZXQpLCAlZzIJKi8KKyAgIGNvZGVbNl0gfD0gKChvZmZzZXQgKiA4KSA+PiAxMCk7CisgICBjb2RlWzddIHw9ICgob2Zmc2V0ICogOCkgJiAoKDEgPDwgMTApIC0gMSkpOworICAgX19nbGFwaV9zcGFyY19pY2FjaGVfZmx1c2goJmNvZGVbNl0pOworI2Vsc2UgLyogX19hcmNoNjRfXyAqLworICAgY29kZVsyXSA9IDB4YzYwMDYwMDA7ICAvKiBsZAkJWyVnMSArICVsbyg0KmdsYXBpb2Zmc2V0KV0sICVnMwkgICovCisgICBjb2RlWzJdIHw9IChvZmZzZXQgKiA0KTsKKyAgIF9fZ2xhcGlfc3BhcmNfaWNhY2hlX2ZsdXNoKCZjb2RlWzJdKTsKKyNlbmRpZiAvKiBfX2FyY2g2NF9fICovCisKKyNlbHNlCisKKyAgIC8qIGFuIHVuaW1wbGVtZW50ZWQgYXJjaGl0ZWN0dXJlICovCisgICAodm9pZCkgZW50cnlwb2ludDsKKyAgICh2b2lkKSBvZmZzZXQ7CisKKyNlbmRpZiAvKiBVU0VfKl9BU00gKi8KK30KKworCisvKioKKyAqIEdlbmVyYXRlIG5ldyBlbnRyeXBvaW50CisgKgorICogVXNlIGEgdGVtcG9yYXJ5IGRpc3BhdGNoIG9mZnNldCBvZiB+MCAoaS5lLiAtMSkuICBMYXRlciwgd2hlbiB0aGUgZHJpdmVyCisgKiBjYWxscyBcYyBfZ2xhcGlfYWRkX2Rpc3BhdGNoIHdlJ2xsIHB1dCBpbiB0aGUgcHJvcGVyIG9mZnNldC4gIElmIHRoYXQKKyAqIG5ldmVyIGhhcHBlbnMsIGFuZCB0aGUgdXNlciBjYWxscyB0aGlzIGZ1bmN0aW9uLCBoZSdsbCBzZWdmYXVsdC4gIFRoYXQncworICogd2hhdCB5b3UgZ2V0IHdoZW4geW91IHRyeSBjYWxsaW5nIGEgR0wgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IHJlYWxseSBleGlzdC4KKyAqIAorICogXHBhcmFtIGZ1bmNOYW1lICBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gZW50cnktcG9pbnQgZm9yLgorICogCisgKiBcc2EgX2dsYXBpX2FkZF9lbnRyeXBvaW50CisgKi8KKworc3RhdGljIHN0cnVjdCBfZ2xhcGlfZnVuY3Rpb24gKgorYWRkX2Z1bmN0aW9uX25hbWUoIGNvbnN0IGNoYXIgKiBmdW5jTmFtZSApCit7CisgICBzdHJ1Y3QgX2dsYXBpX2Z1bmN0aW9uICogZW50cnkgPSBOVUxMOworICAgCisgICBpZiAoTnVtRXh0RW50cnlQb2ludHMgPCBNQVhfRVhURU5TSU9OX0ZVTkNTKSB7CisgICAgICBfZ2xhcGlfcHJvYyBlbnRyeXBvaW50ID0gZ2VuZXJhdGVfZW50cnlwb2ludCh+MCk7CisgICAgICBpZiAoZW50cnlwb2ludCAhPSBOVUxMKSB7CisJIGVudHJ5ID0gJiBFeHRFbnRyeVRhYmxlW051bUV4dEVudHJ5UG9pbnRzXTsKKworCSBFeHRFbnRyeVRhYmxlW051bUV4dEVudHJ5UG9pbnRzXS5uYW1lID0gc3RyX2R1cChmdW5jTmFtZSk7CisJIEV4dEVudHJ5VGFibGVbTnVtRXh0RW50cnlQb2ludHNdLnBhcmFtZXRlcl9zaWduYXR1cmUgPSBOVUxMOworCSBFeHRFbnRyeVRhYmxlW051bUV4dEVudHJ5UG9pbnRzXS5kaXNwYXRjaF9vZmZzZXQgPSB+MDsKKwkgRXh0RW50cnlUYWJsZVtOdW1FeHRFbnRyeVBvaW50c10uZGlzcGF0Y2hfc3R1YiA9IGVudHJ5cG9pbnQ7CisJIE51bUV4dEVudHJ5UG9pbnRzKys7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBlbnRyeTsKK30KKworCisvKioKKyAqIEZpbGwtaW4gdGhlIGRpc3BhdGNoIHN0dWIgZm9yIHRoZSBuYW1lZCBmdW5jdGlvbi4KKyAqIAorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgYSBoYXJkd2FyZSBkcml2ZXIuICBXaGVuIGNhbGxlZCwKKyAqIGEgZGlzcGF0Y2ggc3R1YiBtYXkgYmUgY3JlYXRlZCBjcmVhdGVkIGZvciB0aGUgZnVuY3Rpb24uICBBIHBvaW50ZXIgdG8gdGhpcworICogZGlzcGF0Y2ggZnVuY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBieSBnbFhHZXRQcm9jQWRkcmVzcy4KKyAqCisgKiBccGFyYW0gZnVuY3Rpb25fbmFtZXMgICAgICAgQXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb24gbmFtZXMgdGhhdCBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSBhIGNvbW1vbiBkaXNwYXRjaCBvZmZzZXQuCisgKiBccGFyYW0gcGFyYW1ldGVyX3NpZ25hdHVyZSAgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIG5hbWVkIGZ1bmN0aW9uLiAgUGFyYW1ldGVyIHR5cGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNvbnZlcnRlZCB0byBjaGFyYWN0ZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2knIGZvciBcYyBHTGludCwgXGMgR0x1aW50LCBhbmQgXGMgR0xlbnVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICdwJyBmb3IgYW55IHBvaW50ZXIgdHlwZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnZicgZm9yIFxjIEdMZmxvYXQgYW5kIFxjIEdMY2xhbXBmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICdkJyBmb3IgXGMgR0xkb3VibGUgYW5kIFxjIEdMY2xhbXBkCisgKgorICogXHJldHVybnMKKyAqIFRoZSBvZmZzZXQgaW4gdGhlIGRpc3BhdGNoIHRhYmxlIG9mIHRoZSBuYW1lZCBmdW5jdGlvbi4gIEEgcG9pbnRlciB0byB0aGUKKyAqIGRyaXZlcidzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBuYW1lZCBmdW5jdGlvbiBzaG91bGQgYmUgc3RvcmVkIGF0CisgKiBcYyBkaXNwYXRjaF90YWJsZVtcYyBvZmZzZXRdLiAgUmV0dXJuIC0xIGlmIGVycm9yL3Byb2JsZW0uCisgKgorICogXHNhIGdsWEdldFByb2NBZGRyZXNzCisgKgorICogXHdhcm5pbmcKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgaGFuZGxlIHVwIHRvIDggbmFtZXMgYXQgYSB0aW1lLiAgQXMgZmFyIGFzIEkga25vdywKKyAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW1lcyBldmVyIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBHTCBmdW5jdGlvbiBpcworICogNCAoXGMgZ2xQb2ludFBhcmFtZXRlcmZTR0lTLCBcYyBnbFBvaW50UGFyYW1ldGVyZkVYVCwKKyAqIFxjIGdsUG9pbnRQYXJhbWV0ZXJmQVJCLCBhbmQgXGMgZ2xQb2ludFBhcmFtZXRlcmYpLCBzbyB0aGlzIHNob3VsZCBub3QgYmUKKyAqIHRvbyBwYWluZnVsIG9mIGEgbGltaXRhdGlvbi4KKyAqCisgKiBcdG9kbworICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IFxjIHBhcmFtZXRlcl9zaWduYXR1cmUgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUKKyAqIFxjIE5VTEwuICBJdCBkb2Vzbid0IHNlZW0gbGlrZSBtdWNoIG9mIGEgaGFyZHNoaXAgZm9yIGRyaXZlcnMgdG8gaGF2ZSB0bworICogcGFzcyBpbiBhbiBlbXB0eSBzdHJpbmcuCisgKgorICogXHRvZG8KKyAqIERldGVybWluZSBpZiBjb2RlIHNob3VsZCBiZSBhZGRlZCB0byByZWplY3QgZnVuY3Rpb24gbmFtZXMgdGhhdCBzdGFydCB3aXRoCisgKiAnZ2xYJy4KKyAqIAorICogXGJ1ZworICogQWRkIGNvZGUgdG8gY29tcGFyZSBcYyBwYXJhbWV0ZXJfc2lnbmF0dXJlIHdpdGggdGhlIHBhcmFtZXRlciBzaWduYXR1cmUgb2YKKyAqIGEgc3RhdGljIGZ1bmN0aW9uLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZCB0byBmaW5kIGEgd2F5IHRvIFxiIGdldAorICogdGhlIHBhcmFtZXRlciBzaWduYXR1cmUgb2YgYSBzdGF0aWMgZnVuY3Rpb24uCisgKi8KKworUFVCTElDIGludAorX2dsYXBpX2FkZF9kaXNwYXRjaCggY29uc3QgY2hhciAqIGNvbnN0ICogZnVuY3Rpb25fbmFtZXMsCisJCSAgICAgY29uc3QgY2hhciAqIHBhcmFtZXRlcl9zaWduYXR1cmUgKQoreworICAgc3RhdGljIGludCBuZXh0X2R5bmFtaWNfb2Zmc2V0ID0gX2dsb2Zmc2V0X0ZJUlNUX0RZTkFNSUM7CisgICBjb25zdCBjaGFyICogY29uc3QgcmVhbF9zaWcgPSAocGFyYW1ldGVyX3NpZ25hdHVyZSAhPSBOVUxMKQorICAgICA/IHBhcmFtZXRlcl9zaWduYXR1cmUgOiAiIjsKKyAgIHN0cnVjdCBfZ2xhcGlfZnVuY3Rpb24gKiBlbnRyeVs4XTsKKyAgIEdMYm9vbGVhbiBpc19zdGF0aWNbOF07CisgICB1bnNpZ25lZCBpOworICAgdW5zaWduZWQgajsKKyAgIGludCBvZmZzZXQgPSB+MDsKKyAgIGludCBuZXdfb2Zmc2V0OworCisKKyAgICh2b2lkKSBtZW1zZXQoIGlzX3N0YXRpYywgMCwgc2l6ZW9mKCBpc19zdGF0aWMgKSApOworICAgKHZvaWQpIG1lbXNldCggZW50cnksIDAsIHNpemVvZiggZW50cnkgKSApOworCisgICBmb3IgKCBpID0gMCA7IGZ1bmN0aW9uX25hbWVzW2ldICE9IE5VTEwgOyBpKysgKSB7CisgICAgICAvKiBEbyBzb21lIHRyaXZpYWwgdmFsaWRhdGlvbiBvbiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgKi8KKworICAgICAgaWYgKCFmdW5jdGlvbl9uYW1lc1tpXSB8fCBmdW5jdGlvbl9uYW1lc1tpXVswXSAhPSAnZycgfHwgZnVuY3Rpb25fbmFtZXNbaV1bMV0gIT0gJ2wnKQorICAgICAgICAgcmV0dXJuIC0xOworICAgCisgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIG5hbWVkIGZ1bmN0aW9uIGFscmVhZHkgZXhpc3RzLiAgSWYgdGhlIGZ1bmN0aW9uIGRvZXMKKyAgICAgICAqIGV4aXN0LCBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgcGFyYW1ldGVyIHNpZ25hdHVyZSBhcyB0aGUgZnVuY3Rpb24KKyAgICAgICAqIGJlaW5nIGFkZGVkLgorICAgICAgICovCisKKyAgICAgIG5ld19vZmZzZXQgPSBnZXRfc3RhdGljX3Byb2Nfb2Zmc2V0KGZ1bmN0aW9uX25hbWVzW2ldKTsKKyAgICAgIGlmIChuZXdfb2Zmc2V0ID49IDApIHsKKwkgLyogRklYTUU6IE1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVyIHNpZ25hdHVyZXMgbWF0Y2ghICBIb3cgZG8gd2UgZ2V0CisJICAqIEZJWE1FOiB0aGUgcGFyYW1ldGVyIHNpZ25hdHVyZSBmb3Igc3RhdGljIGZ1bmN0aW9ucz8KKwkgICovCisKKwkgaWYgKCAob2Zmc2V0ICE9IH4wKSAmJiAobmV3X29mZnNldCAhPSBvZmZzZXQpICkgeworCSAgICByZXR1cm4gLTE7CisJIH0KKworCSBpc19zdGF0aWNbaV0gPSBHTF9UUlVFOworCSBvZmZzZXQgPSBuZXdfb2Zmc2V0OworICAgICAgfQorICAgCisgICAKKyAgICAgIGZvciAoIGogPSAwIDsgaiA8IE51bUV4dEVudHJ5UG9pbnRzIDsgaisrICkgeworCSBpZiAoc3RyY21wKEV4dEVudHJ5VGFibGVbal0ubmFtZSwgZnVuY3Rpb25fbmFtZXNbaV0pID09IDApIHsKKwkgICAgLyogVGhlIG9mZnNldCBtYXkgYmUgfjAgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgd2FzIGFkZGVkIGJ5CisJICAgICAqIGdsWEdldFByb2NBZGRyZXNzIGJ1dCBuZXZlciBmaWxsZWQgaW4gYnkgdGhlIGRyaXZlci4KKwkgICAgICovCisKKwkgICAgaWYgKEV4dEVudHJ5VGFibGVbal0uZGlzcGF0Y2hfb2Zmc2V0ICE9IH4wKSB7CisJICAgICAgIGlmIChzdHJjbXAocmVhbF9zaWcsIEV4dEVudHJ5VGFibGVbal0ucGFyYW1ldGVyX3NpZ25hdHVyZSkgCisJCSAgICE9IDApIHsKKwkJICByZXR1cm4gLTE7CisJICAgICAgIH0KKworCSAgICAgICBpZiAoIChvZmZzZXQgIT0gfjApICYmIChFeHRFbnRyeVRhYmxlW2pdLmRpc3BhdGNoX29mZnNldCAhPSBvZmZzZXQpICkgeworCQkgIHJldHVybiAtMTsKKwkgICAgICAgfQorCisJICAgICAgIG9mZnNldCA9IEV4dEVudHJ5VGFibGVbal0uZGlzcGF0Y2hfb2Zmc2V0OworCSAgICB9CisJICAgIAorCSAgICBlbnRyeVtpXSA9ICYgRXh0RW50cnlUYWJsZVtqXTsKKwkgICAgYnJlYWs7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKG9mZnNldCA9PSB+MCkgeworICAgICAgb2Zmc2V0ID0gbmV4dF9keW5hbWljX29mZnNldDsKKyAgICAgIG5leHRfZHluYW1pY19vZmZzZXQrKzsKKyAgIH0KKworICAgZm9yICggaSA9IDAgOyBmdW5jdGlvbl9uYW1lc1tpXSAhPSBOVUxMIDsgaSsrICkgeworICAgICAgaWYgKCEgaXNfc3RhdGljW2ldICkgeworCSBpZiAoZW50cnlbaV0gPT0gTlVMTCkgeworCSAgICBlbnRyeVtpXSA9IGFkZF9mdW5jdGlvbl9uYW1lKCBmdW5jdGlvbl9uYW1lc1tpXSApOworCSAgICBpZiAoZW50cnlbaV0gPT0gTlVMTCkgeworCSAgICAgICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsgaGVyZS4KKwkJKi8KKwkgICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJIH0KKworCSBlbnRyeVtpXS0+cGFyYW1ldGVyX3NpZ25hdHVyZSA9IHN0cl9kdXAocmVhbF9zaWcpOworCSBmaWxsX2luX2VudHJ5cG9pbnRfb2Zmc2V0KGVudHJ5W2ldLT5kaXNwYXRjaF9zdHViLCBvZmZzZXQpOworCSBlbnRyeVtpXS0+ZGlzcGF0Y2hfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgfQorICAgfQorICAgCisgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKgorICogUmV0dXJuIG9mZnNldCBvZiBlbnRyeXBvaW50IGZvciBuYW1lZCBmdW5jdGlvbiB3aXRoaW4gZGlzcGF0Y2ggdGFibGUuCisgKi8KK1BVQkxJQyBHTGludAorX2dsYXBpX2dldF9wcm9jX29mZnNldChjb25zdCBjaGFyICpmdW5jTmFtZSkKK3sKKyAgIC8qIHNlYXJjaCBleHRlbnNpb24gZnVuY3Rpb25zIGZpcnN0ICovCisgICBHTHVpbnQgaTsKKyAgIGZvciAoaSA9IDA7IGkgPCBOdW1FeHRFbnRyeVBvaW50czsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKEV4dEVudHJ5VGFibGVbaV0ubmFtZSwgZnVuY05hbWUpID09IDApIHsKKyAgICAgICAgIHJldHVybiBFeHRFbnRyeVRhYmxlW2ldLmRpc3BhdGNoX29mZnNldDsKKyAgICAgIH0KKyAgIH0KKyAgIC8qIHNlYXJjaCBzdGF0aWMgZnVuY3Rpb25zICovCisgICByZXR1cm4gZ2V0X3N0YXRpY19wcm9jX29mZnNldChmdW5jTmFtZSk7Cit9CisKKworCisvKioKKyAqIFJldHVybiBwb2ludGVyIHRvIHRoZSBuYW1lZCBmdW5jdGlvbi4gIElmIHRoZSBmdW5jdGlvbiBuYW1lIGlzbid0IGZvdW5kCisgKiBpbiB0aGUgbmFtZSBvZiBzdGF0aWMgZnVuY3Rpb25zLCB0cnkgZ2VuZXJhdGluZyBhIG5ldyBBUEkgZW50cnlwb2ludCBvbgorICogdGhlIGZseSB3aXRoIGFzc2VtYmx5IGxhbmd1YWdlLgorICovCitfZ2xhcGlfcHJvYworX2dsYXBpX2dldF9wcm9jX2FkZHJlc3MoY29uc3QgY2hhciAqZnVuY05hbWUpCit7CisgICBzdHJ1Y3QgX2dsYXBpX2Z1bmN0aW9uICogZW50cnk7CisgICBHTHVpbnQgaTsKKworI2lmZGVmIE1BTkdMRQorICAgaWYgKGZ1bmNOYW1lWzBdICE9ICdtJyB8fCBmdW5jTmFtZVsxXSAhPSAnZycgfHwgZnVuY05hbWVbMl0gIT0gJ2wnKQorICAgICAgcmV0dXJuIE5VTEw7CisjZWxzZQorICAgaWYgKGZ1bmNOYW1lWzBdICE9ICdnJyB8fCBmdW5jTmFtZVsxXSAhPSAnbCcpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorCisgICAvKiBzZWFyY2ggZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmaXJzdCAqLworICAgZm9yIChpID0gMDsgaSA8IE51bUV4dEVudHJ5UG9pbnRzOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoRXh0RW50cnlUYWJsZVtpXS5uYW1lLCBmdW5jTmFtZSkgPT0gMCkgeworICAgICAgICAgcmV0dXJuIEV4dEVudHJ5VGFibGVbaV0uZGlzcGF0Y2hfc3R1YjsKKyAgICAgIH0KKyAgIH0KKworI2lmICFkZWZpbmVkKCBYRnJlZTg2U2VydmVyICkgJiYgIWRlZmluZWQoIFhHTFNlcnZlciApCisgICAvKiBzZWFyY2ggc3RhdGljIGZ1bmN0aW9ucyAqLworICAgeworICAgICAgY29uc3QgX2dsYXBpX3Byb2MgZnVuYyA9IGdldF9zdGF0aWNfcHJvY19hZGRyZXNzKGZ1bmNOYW1lKTsKKyAgICAgIGlmIChmdW5jKQorICAgICAgICAgcmV0dXJuIGZ1bmM7CisgICB9CisjZW5kaWYgLyogIWRlZmluZWQoIFhGcmVlODZTZXJ2ZXIgKSAqLworCisgICBlbnRyeSA9IGFkZF9mdW5jdGlvbl9uYW1lKGZ1bmNOYW1lKTsKKyAgIHJldHVybiAoZW50cnkgPT0gTlVMTCkgPyBOVUxMIDogZW50cnktPmRpc3BhdGNoX3N0dWI7Cit9CisKKworCisvKioKKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXQgdGhlIGdpdmVuIGRpc3BhdGNoIG9mZnNldC4KKyAqIFRoaXMgaXMgb25seSBpbnRlbmRlZCBmb3IgZGVidWdnaW5nLgorICovCitjb25zdCBjaGFyICoKK19nbGFwaV9nZXRfcHJvY19uYW1lKEdMdWludCBvZmZzZXQpCit7CisgICBHTHVpbnQgaTsKKyAgIGNvbnN0IGNoYXIgKiBuOworCisgICAvKiBzZWFyY2ggYnVpbHQtaW4gZnVuY3Rpb25zICovCisgICBuID0gZ2V0X3N0YXRpY19wcm9jX25hbWUob2Zmc2V0KTsKKyAgIGlmICggbiAhPSBOVUxMICkgeworICAgICAgcmV0dXJuIG47CisgICB9CisKKyAgIC8qIHNlYXJjaCBhZGRlZCBleHRlbnNpb24gZnVuY3Rpb25zICovCisgICBmb3IgKGkgPSAwOyBpIDwgTnVtRXh0RW50cnlQb2ludHM7IGkrKykgeworICAgICAgaWYgKEV4dEVudHJ5VGFibGVbaV0uZGlzcGF0Y2hfb2Zmc2V0ID09IG9mZnNldCkgeworICAgICAgICAgcmV0dXJuIEV4dEVudHJ5VGFibGVbaV0ubmFtZTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBOVUxMOworfQorCisKKworLyoqCiAgKiBSZXR1cm4gc2l6ZSBvZiBkaXNwYXRjaCB0YWJsZSBzdHJ1Y3QgYXMgbnVtYmVyIG9mIGZ1bmN0aW9ucyAob3IKICAqIHNsb3RzKS4KICAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZ2xhcGkvZ2x0aHJlYWQuYyBiL3NyYy9tZXNhL2dsYXBpL2dsdGhyZWFkLmMKaW5kZXggMDljYzhjZi4uODEzZDZmOSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZ2xhcGkvZ2x0aHJlYWQuYworKysgYi9zcmMvbWVzYS9nbGFwaS9nbHRocmVhZC5jCkBAIC0yNSwxMSArMjUsMTUgQEAKIAogLyoKICAqIFhYWCBUaGVyZSdzIHByb2JhYmx5IHNvbWUgd29yayB0byBkbyBpbiBvcmRlciB0byBtYWtlIHRoaXMgZmlsZQotICogdHJ1bHkgcmV1c2FibGUgb3V0c2lkZSBvZiBNZXNhLiAgRmlyc3QsIHRoZSBnbGhlYWRlci5oIGluY2x1ZGUgbXVzdCBnby4KKyAqIHRydWx5IHJldXNhYmxlIG91dHNpZGUgb2YgTWVzYS4KICAqLwogCiAKLSNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaWZkZWYgSEFWRV9ESVhfQ09ORklHX0gKKyNpbmNsdWRlIDxkaXgtY29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImdsdGhyZWFkLmgiCiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvZ2xhcGkvZ2x0aHJlYWQuaCBiL3NyYy9tZXNhL2dsYXBpL2dsdGhyZWFkLmgKaW5kZXggYWQyYTYzNS4uN2Y4MTAyMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvZ2xhcGkvZ2x0aHJlYWQuaAorKysgYi9zcmMvbWVzYS9nbGFwaS9nbHRocmVhZC5oCkBAIC0yOTksMTEgKzI5OSwxMSBAQAogICogVEhSRUFEUyBub3QgZGVmaW5lZAogICovCiAKLXR5cGVkZWYgR0x1aW50IF9nbHRocmVhZF9UU0Q7Cit0eXBlZGVmIGludCBfZ2x0aHJlYWRfVFNEOwogCi10eXBlZGVmIEdMdWludCBfZ2x0aHJlYWRfVGhyZWFkOwordHlwZWRlZiBpbnQgX2dsdGhyZWFkX1RocmVhZDsKIAotdHlwZWRlZiBHTHVpbnQgX2dsdGhyZWFkX011dGV4OwordHlwZWRlZiBpbnQgX2dsdGhyZWFkX011dGV4OwogCiAjZGVmaW5lIF9nbHRocmVhZF9ERUNMQVJFX1NUQVRJQ19NVVRFWChuYW1lKSAgc3RhdGljIF9nbHRocmVhZF9NdXRleCBuYW1lID0gMAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9nbGFwaS9zb3VyY2VzIGIvc3JjL21lc2EvZ2xhcGkvc291cmNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1YzI1Mi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9nbGFwaS9zb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTUVTQV9HTEFQSV9TT1VSQ0VTID0gXAotZ2xhcGkuYyBcCi1nbHRocmVhZC5jCi0KLU1FU0FfR0xBUElfSEVBREVSUyA9IFwKLWRpc3BhdGNoLmggXAotZ2xhcGkuaCBcCi1nbGFwaW9mZnNldHMuaCBcCi1nbGFwaXRhYmxlLmggXAotZ2xhcGl0ZW1wLmggXAotZ2xwcm9jcy5oIFwKLWdsdGhyZWFkLmgKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vYXBpX3ZhbGlkYXRlLmMgYi9zcmMvbWVzYS9tYWluL2FwaV92YWxpZGF0ZS5jCmluZGV4IDJlYjk2YWUuLmJiYzU5MzMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vYXBpX3ZhbGlkYXRlLmMKKysrIGIvc3JjL21lc2EvbWFpbi9hcGlfdmFsaWRhdGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNy4wLjEKKyAqIFZlcnNpb246ICA3LjEKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMzAsNiArMzAsNTUgQEAKICNpbmNsdWRlICJzdGF0ZS5oIgogCiAKKy8qKgorICogRmluZCB0aGUgbWF4IGluZGV4IGluIHRoZSBnaXZlbiBlbGVtZW50L2luZGV4IGJ1ZmZlcgorICovCitzdGF0aWMgR0x1aW50CittYXhfYnVmZmVyX2luZGV4KEdMY29udGV4dCAqY3R4LCBHTHVpbnQgY291bnQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppbmRpY2VzLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqZWxlbWVudEJ1ZikKK3sKKyAgIGNvbnN0IEdMdWJ5dGUgKm1hcCA9IE5VTEw7CisgICBHTHVpbnQgbWF4ID0gMDsKKyAgIEdMaW50IGk7CisKKyAgIGlmIChlbGVtZW50QnVmLT5OYW1lKSB7CisgICAgICAvKiBlbGVtZW50cyBhcmUgaW4gYSB1c2VyLWRlZmluZWQgYnVmZmVyIG9iamVjdC4gIG5lZWQgdG8gbWFwIGl0ICovCisgICAgICBtYXAgPSBjdHgtPkRyaXZlci5NYXBCdWZmZXIoY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SRUFEX09OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEJ1Zik7CisgICAgICAvKiBBY3R1YWwgYWRkcmVzcyBpcyB0aGUgc3VtIG9mIHBvaW50ZXJzICovCisgICAgICBpbmRpY2VzID0gKGNvbnN0IEdMdm9pZCAqKSBBRERfUE9JTlRFUlMobWFwLCAoY29uc3QgR0x1Ynl0ZSAqKSBpbmRpY2VzKTsKKyAgIH0KKworICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfSU5UKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgIGlmICgoKEdMdWludCAqKSBpbmRpY2VzKVtpXSA+IG1heCkKKyAgICAgICAgICAgIG1heCA9ICgoR0x1aW50ICopIGluZGljZXMpW2ldOworICAgfQorICAgZWxzZSBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICBpZiAoKChHTHVzaG9ydCAqKSBpbmRpY2VzKVtpXSA+IG1heCkKKyAgICAgICAgICAgIG1heCA9ICgoR0x1c2hvcnQgKikgaW5kaWNlcylbaV07CisgICB9CisgICBlbHNlIHsKKyAgICAgIEFTU0VSVCh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICBpZiAoKChHTHVieXRlICopIGluZGljZXMpW2ldID4gbWF4KQorICAgICAgICAgICAgbWF4ID0gKChHTHVieXRlICopIGluZGljZXMpW2ldOworICAgfQorCisgICBpZiAobWFwKSB7CisgICAgICBjdHgtPkRyaXZlci5Vbm1hcEJ1ZmZlcihjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkFycmF5LkVsZW1lbnRBcnJheUJ1ZmZlck9iaik7CisgICB9CisKKyAgIHJldHVybiBtYXg7Cit9CisKKwogR0xib29sZWFuCiBfbWVzYV92YWxpZGF0ZV9EcmF3RWxlbWVudHMoR0xjb250ZXh0ICpjdHgsCiAJCQkgICAgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLApAQCAtNjcsMTYgKzExNiwxNSBAQAogCiAgICAvKiBWZXJ0ZXggYnVmZmVyIG9iamVjdCB0ZXN0cyAqLwogICAgaWYgKGN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqLT5OYW1lKSB7CisgICAgICAvKiB1c2UgaW5kaWNlcyBpbiB0aGUgYnVmZmVyIG9iamVjdCAqLwogICAgICAgR0x1aW50IGluZGV4Qnl0ZXM7CiAKLSAgICAgIC8qIHVzZSBpbmRpY2VzIGluIHRoZSBidWZmZXIgb2JqZWN0ICovCiAgICAgICBpZiAoIWN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqLT5TaXplKSB7CiAgICAgICAgICBfbWVzYV93YXJuaW5nKGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgImdsRHJhd0VsZW1lbnRzIGNhbGxlZCB3aXRoIGVtcHR5IGFycmF5IGVsZW1lbnRzIGJ1ZmZlciIpOwogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgfQogCi0gICAgICAvKiBtYWtlIHN1cmUgY291bnQgZG9lc24ndCBnbyBvdXRzaWRlIGJ1ZmZlciBib3VuZHMgKi8KICAgICAgIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX0lOVCkgewogICAgICAgICAgaW5kZXhCeXRlcyA9IGNvdW50ICogc2l6ZW9mKEdMdWludCk7CiAgICAgICB9CkBAIC04OCw2ICsxMzYsNyBAQAogICAgICAgICAgaW5kZXhCeXRlcyA9IGNvdW50ICogc2l6ZW9mKEdMdXNob3J0KTsKICAgICAgIH0KIAorICAgICAgLyogbWFrZSBzdXJlIGNvdW50IGRvZXNuJ3QgZ28gb3V0c2lkZSBidWZmZXIgYm91bmRzICovCiAgICAgICBpZiAoaW5kZXhCeXRlcyA+IChHTHVpbnQpIGN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqLT5TaXplKSB7CiAgICAgICAgICBfbWVzYV93YXJuaW5nKGN0eCwgImdsRHJhd0VsZW1lbnRzIGluZGV4IG91dCBvZiBidWZmZXIgYm91bmRzIik7CiAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CkBAIC0xMDEsMzkgKzE1MCw4IEBACiAKICAgIGlmIChjdHgtPkNvbnN0LkNoZWNrQXJyYXlCb3VuZHMpIHsKICAgICAgIC8qIGZpbmQgbWF4IGFycmF5IGluZGV4ICovCi0gICAgICBjb25zdCBHTHVieXRlICptYXA7Ci0gICAgICBHTHVpbnQgbWF4ID0gMDsKLSAgICAgIEdMaW50IGk7Ci0KLSAgICAgIG1hcCA9IGN0eC0+RHJpdmVyLk1hcEJ1ZmZlcihjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFQURfT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkFycmF5LkVsZW1lbnRBcnJheUJ1ZmZlck9iaik7Ci0KLSAgICAgIC8qIEFjdHVhbCBhZGRyZXNzIGlzIHRoZSBzdW0gb2YgcG9pbnRlcnMgKi8KLSAgICAgIGluZGljZXMgPSAoY29uc3QgR0x2b2lkICopIEFERF9QT0lOVEVSUyhtYXAsIChjb25zdCBHTHVieXRlICopIGluZGljZXMpOwotCi0gICAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9JTlQpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgaWYgKCgoR0x1aW50ICopIGluZGljZXMpW2ldID4gbWF4KQotICAgICAgICAgICAgICAgbWF4ID0gKChHTHVpbnQgKikgaW5kaWNlcylbaV07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKSB7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgIGlmICgoKEdMdXNob3J0ICopIGluZGljZXMpW2ldID4gbWF4KQotICAgICAgICAgICAgICAgbWF4ID0gKChHTHVzaG9ydCAqKSBpbmRpY2VzKVtpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgQVNTRVJUKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgIGlmICgoKEdMdWJ5dGUgKikgaW5kaWNlcylbaV0gPiBtYXgpCi0gICAgICAgICAgICAgICBtYXggPSAoKEdMdWJ5dGUgKikgaW5kaWNlcylbaV07Ci0gICAgICB9Ci0KLSAgICAgIGN0eC0+RHJpdmVyLlVubWFwQnVmZmVyKGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqKTsKLQorICAgICAgR0x1aW50IG1heCA9IG1heF9idWZmZXJfaW5kZXgoY3R4LCBjb3VudCwgdHlwZSwgaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqKTsKICAgICAgIGlmIChtYXggPj0gY3R4LT5BcnJheS5fTWF4RWxlbWVudCkgewogICAgICAgICAgLyogdGhlIG1heCBlbGVtZW50IGlzIG91dCBvZiBib3VuZHMgb2Ygb25lIG9yIG1vcmUgZW5hYmxlZCBhcnJheXMgKi8KICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKQEAgLTE4NiwzNiArMjA0LDM1IEBACiAKICAgIC8qIFZlcnRleCBidWZmZXIgb2JqZWN0IHRlc3RzICovCiAgICBpZiAoY3R4LT5BcnJheS5FbGVtZW50QXJyYXlCdWZmZXJPYmotPk5hbWUpIHsKLSAgICAgIC8qIFhYWCByZS11c2UgY29kZSBmcm9tIGFib3ZlPyAqLworICAgICAgLyogdXNlIGluZGljZXMgaW4gdGhlIGJ1ZmZlciBvYmplY3QgKi8KKyAgICAgIEdMdWludCBpbmRleEJ5dGVzOworCisgICAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9JTlQpIHsKKyAgICAgICAgIGluZGV4Qnl0ZXMgPSBjb3VudCAqIHNpemVvZihHTHVpbnQpOworICAgICAgfQorICAgICAgZWxzZSBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB7CisgICAgICAgICBpbmRleEJ5dGVzID0gY291bnQgKiBzaXplb2YoR0x1Ynl0ZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIEFTU0VSVCh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKTsKKyAgICAgICAgIGluZGV4Qnl0ZXMgPSBjb3VudCAqIHNpemVvZihHTHVzaG9ydCk7CisgICAgICB9CisKKyAgICAgIC8qIG1ha2Ugc3VyZSBjb3VudCBkb2Vzbid0IGdvIG91dHNpZGUgYnVmZmVyIGJvdW5kcyAqLworICAgICAgaWYgKGluZGV4Qnl0ZXMgPiBjdHgtPkFycmF5LkVsZW1lbnRBcnJheUJ1ZmZlck9iai0+U2l6ZSkgeworICAgICAgICAgX21lc2Ffd2FybmluZyhjdHgsICJnbERyYXdSYW5nZUVsZW1lbnRzIGluZGV4IG91dCBvZiBidWZmZXIgYm91bmRzIik7CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CiAgICB9CiAgICBlbHNlIHsKLSAgICAgIC8qIG5vdCB1c2luZyBWQk8gKi8KKyAgICAgIC8qIG5vdCB1c2luZyBhIFZCTyAqLwogICAgICAgaWYgKCFpbmRpY2VzKQogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgfQogCiAgICBpZiAoY3R4LT5Db25zdC5DaGVja0FycmF5Qm91bmRzKSB7Ci0gICAgICAvKiBGaW5kIG1heCBhcnJheSBpbmRleC4KLSAgICAgICAqIFdlIGRvbid0IHRydXN0IHRoZSB1c2VyJ3Mgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuCi0gICAgICAgKi8KLSAgICAgIEdMdWludCBtYXggPSAwOwotICAgICAgR0xpbnQgaTsKLSAgICAgIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX0lOVCkgewotICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBpZiAoKChHTHVpbnQgKikgaW5kaWNlcylbaV0gPiBtYXgpCi0gICAgICAgICAgICAgICBtYXggPSAoKEdMdWludCAqKSBpbmRpY2VzKVtpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgaWYgKCgoR0x1c2hvcnQgKikgaW5kaWNlcylbaV0gPiBtYXgpCi0gICAgICAgICAgICAgICBtYXggPSAoKEdMdXNob3J0ICopIGluZGljZXMpW2ldOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBBU1NFUlQodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgaWYgKCgoR0x1Ynl0ZSAqKSBpbmRpY2VzKVtpXSA+IG1heCkKLSAgICAgICAgICAgICAgIG1heCA9ICgoR0x1Ynl0ZSAqKSBpbmRpY2VzKVtpXTsKLSAgICAgIH0KKyAgICAgIEdMdWludCBtYXggPSBtYXhfYnVmZmVyX2luZGV4KGN0eCwgY291bnQsIHR5cGUsIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkFycmF5LkVsZW1lbnRBcnJheUJ1ZmZlck9iaik7CiAgICAgICBpZiAobWF4ID49IGN0eC0+QXJyYXkuX01heEVsZW1lbnQpIHsKICAgICAgICAgIC8qIHRoZSBtYXggZWxlbWVudCBpcyBvdXQgb2YgYm91bmRzIG9mIG9uZSBvciBtb3JlIGVuYWJsZWQgYXJyYXlzICovCiAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CkBAIC0yMzYsOCArMjUzLDkgQEAKIHsKICAgIEFTU0VSVF9PVVRTSURFX0JFR0lOX0VORF9XSVRIX1JFVFZBTChjdHgsIEdMX0ZBTFNFKTsKIAotICAgaWYgKGNvdW50IDwgMCkgewotICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX1ZBTFVFLCAiZ2xEcmF3QXJyYXlzKGNvdW50KSIgKTsKKyAgIGlmIChjb3VudCA8PSAwKSB7CisgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX1ZBTFVFLCAiZ2xEcmF3QXJyYXlzKGNvdW50KSIgKTsKICAgICAgIHJldHVybiBHTF9GQUxTRTsKICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9hdHRyaWIuYyBiL3NyYy9tZXNhL21haW4vYXR0cmliLmMKaW5kZXggYjk5MDM2OS4uY2UwNzMzOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9hdHRyaWIuYworKysgYi9zcmMvbWVzYS9tYWluL2F0dHJpYi5jCkBAIC01Myw5ICs1MywyNyBAQAogI2luY2x1ZGUgInRleG9iai5oIgogI2luY2x1ZGUgInRleHBhcmFtLmgiCiAjaW5jbHVkZSAidGV4c3RhdGUuaCIKKyNpbmNsdWRlICJ2YXJyYXkuaCIKICNpbmNsdWRlICJtdHlwZXMuaCIKICNpbmNsdWRlICJtYXRoL21feGZvcm0uaCIKIAorLyoqCisgKiBTcGVjaWFsIHN0cnVjdCBmb3Igc2F2aW5nL3Jlc3RvcmluZyB0ZXh0dXJlIHN0YXRlIChHTF9URVhUVVJFX0JJVCkKKyAqLworc3RydWN0IHRleHR1cmVfc3RhdGUKK3sKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2F0dHJpYiBUZXh0dXJlOyAgLyoqPCBUaGUgdXN1YWwgY29udGV4dCBzdGF0ZSAqLworCisgICAvKiogdG8gc2F2ZSBwZXIgdGV4dHVyZSBvYmplY3Qgc3RhdGUgKHdyYXAgbW9kZXMsIGZpbHRlcnMsIGV0Yyk6ICovCisgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgU2F2ZWRPYmpbTUFYX1RFWFRVUkVfVU5JVFNdW05VTV9URVhUVVJFX1RBUkdFVFNdOworCisgICAvKioKKyAgICAqIFRvIHNhdmUgcmVmZXJlbmNlcyB0byB0ZXh0dXJlIG9iamVjdHMgKHNvIHRoZXkgZG9uJ3QgZ2V0IGFjY2lkZW50YWxseQorICAgICogZGVsZXRlZCB3aGlsZSBzYXZlZCBpbiB0aGUgYXR0cmlidXRlIHN0YWNrKS4KKyAgICAqLworICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpTYXZlZFRleFJlZltNQVhfVEVYVFVSRV9VTklUU11bTlVNX1RFWFRVUkVfVEFSR0VUU107Cit9OworCiAKIC8qKgogICogQWxsb2NhdGUgYSBuZXcgYXR0cmlidXRlIHN0YXRlIG5vZGUuICBUaGVzZSBub2RlcyBoYXZlIGEKQEAgLTM0NSw0NyArMzYzLDYxIEBACiAgICB9CiAKICAgIGlmIChtYXNrICYgR0xfVEVYVFVSRV9CSVQpIHsKLSAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2F0dHJpYiAqYXR0cjsKKyAgICAgIHN0cnVjdCB0ZXh0dXJlX3N0YXRlICp0ZXhzdGF0ZSA9IENBTExPQ19TVFJVQ1QodGV4dHVyZV9zdGF0ZSk7CiAgICAgICBHTHVpbnQgdTsKIAotICAgICAgX21lc2FfbG9ja19jb250ZXh0X3RleHR1cmVzKGN0eCk7Ci0gICAgICAvKiBCdW1wIHRoZSB0ZXh0dXJlIG9iamVjdCByZWZlcmVuY2UgY291bnRzIHNvIHRoYXQgdGhleSBkb24ndAotICAgICAgICogaW5hZHZlcnRhbnRseSBnZXQgZGVsZXRlZC4KLSAgICAgICAqLwotICAgICAgZm9yICh1ID0gMDsgdSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1KyspIHsKLQkgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDFELT5SZWZDb3VudCsrOwotCSBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50MkQtPlJlZkNvdW50Kys7Ci0JIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQzRC0+UmVmQ291bnQrKzsKLQkgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudEN1YmVNYXAtPlJlZkNvdW50Kys7Ci0JIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnRSZWN0LT5SZWZDb3VudCsrOwotCSBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50MURBcnJheS0+UmVmQ291bnQrKzsKLQkgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDJEQXJyYXktPlJlZkNvdW50Kys7CisgICAgICBpZiAoIXRleHN0YXRlKSB7CisgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbFB1c2hBdHRyaWIoR0xfVEVYVFVSRV9CSVQpIik7CisgICAgICAgICBnb3RvIGVuZDsKICAgICAgIH0KIAotICAgICAgYXR0ciA9IE1BTExPQ19TVFJVQ1QoIGdsX3RleHR1cmVfYXR0cmliICk7Ci0gICAgICBNRU1DUFkoIGF0dHIsICZjdHgtPlRleHR1cmUsIHNpemVvZihzdHJ1Y3QgZ2xfdGV4dHVyZV9hdHRyaWIpICk7Ci0gICAgICAvKiBjb3B5IHN0YXRlIG9mIHRoZSBjdXJyZW50bHkgYm91bmQgdGV4dHVyZSBvYmplY3RzICovCisgICAgICBfbWVzYV9sb2NrX2NvbnRleHRfdGV4dHVyZXMoY3R4KTsKKworICAgICAgLyogY29weS9zYXZlIHRoZSBidWxrIG9mIHRleHR1cmUgc3RhdGUgaGVyZSAqLworICAgICAgX21lc2FfbWVtY3B5KCZ0ZXhzdGF0ZS0+VGV4dHVyZSwgJmN0eC0+VGV4dHVyZSwgc2l6ZW9mKGN0eC0+VGV4dHVyZSkpOworCisgICAgICAvKiBTYXZlIHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnRseSBib3VuZCB0ZXh0dXJlIG9iamVjdHMgc28gdGhleSBkb24ndAorICAgICAgICogYWNjaWRlbnRhbGx5IGdldCBkZWxldGVkIHdoaWxlIHJlZmVyZW5jZWQgaW4gdGhlIGF0dHJpYnV0ZSBzdGFjay4KKyAgICAgICAqLwogICAgICAgZm9yICh1ID0gMDsgdSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1KyspIHsKLSAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJmF0dHItPlVuaXRbdV0uU2F2ZWQxRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+VW5pdFt1XS5DdXJyZW50MUQpOwotICAgICAgICAgX21lc2FfY29weV90ZXh0dXJlX29iamVjdCgmYXR0ci0+VW5pdFt1XS5TYXZlZDJELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLT5Vbml0W3VdLkN1cnJlbnQyRCk7Ci0gICAgICAgICBfbWVzYV9jb3B5X3RleHR1cmVfb2JqZWN0KCZhdHRyLT5Vbml0W3VdLlNhdmVkM0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHItPlVuaXRbdV0uQ3VycmVudDNEKTsKLSAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJmF0dHItPlVuaXRbdV0uU2F2ZWRDdWJlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLT5Vbml0W3VdLkN1cnJlbnRDdWJlTWFwKTsKLSAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJmF0dHItPlVuaXRbdV0uU2F2ZWRSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLT5Vbml0W3VdLkN1cnJlbnRSZWN0KTsKLSAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJmF0dHItPlVuaXRbdV0uU2F2ZWQxREFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLT5Vbml0W3VdLkN1cnJlbnQxREFycmF5KTsKLSAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJmF0dHItPlVuaXRbdV0uU2F2ZWQyREFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLT5Vbml0W3VdLkN1cnJlbnQyREFycmF5KTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleHN0YXRlLT5TYXZlZFRleFJlZlt1XVtURVhUVVJFXzFEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDFEKTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleHN0YXRlLT5TYXZlZFRleFJlZlt1XVtURVhUVVJFXzJEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDJEKTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleHN0YXRlLT5TYXZlZFRleFJlZlt1XVtURVhUVVJFXzNEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDNEKTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleHN0YXRlLT5TYXZlZFRleFJlZlt1XVtURVhUVVJFX0NVQkVfSU5ERVhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50Q3ViZU1hcCk7CisgICAgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhzdGF0ZS0+U2F2ZWRUZXhSZWZbdV1bVEVYVFVSRV9SRUNUX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudFJlY3QpOworICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3RleG9iaigmdGV4c3RhdGUtPlNhdmVkVGV4UmVmW3VdW1RFWFRVUkVfMURfQVJSQVlfSU5ERVhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50MURBcnJheSk7CisgICAgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhzdGF0ZS0+U2F2ZWRUZXhSZWZbdV1bVEVYVFVSRV8yRF9BUlJBWV9JTkRFWF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQyREFycmF5KTsKKyAgICAgIH0KKworICAgICAgLyogY29weSBzdGF0ZS9jb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGJvdW5kIHRleHR1cmUgb2JqZWN0cyAqLworICAgICAgZm9yICh1ID0gMDsgdSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1KyspIHsKKyAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJnRleHN0YXRlLT5TYXZlZE9ialt1XVtURVhUVVJFXzFEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDFEKTsKKyAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJnRleHN0YXRlLT5TYXZlZE9ialt1XVtURVhUVVJFXzJEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDJEKTsKKyAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJnRleHN0YXRlLT5TYXZlZE9ialt1XVtURVhUVVJFXzNEX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudDNEKTsKKyAgICAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9vYmplY3QoJnRleHN0YXRlLT5TYXZlZE9ialt1XVtURVhUVVJFX0NVQkVfSU5ERVhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50Q3ViZU1hcCk7CisgICAgICAgICBfbWVzYV9jb3B5X3RleHR1cmVfb2JqZWN0KCZ0ZXhzdGF0ZS0+U2F2ZWRPYmpbdV1bVEVYVFVSRV9SRUNUX0lOREVYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudFJlY3QpOworICAgICAgICAgX21lc2FfY29weV90ZXh0dXJlX29iamVjdCgmdGV4c3RhdGUtPlNhdmVkT2JqW3VdW1RFWFRVUkVfMURfQVJSQVlfSU5ERVhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50MURBcnJheSk7CisgICAgICAgICBfbWVzYV9jb3B5X3RleHR1cmVfb2JqZWN0KCZ0ZXhzdGF0ZS0+U2F2ZWRPYmpbdV1bVEVYVFVSRV8yRF9BUlJBWV9JTkRFWF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQyREFycmF5KTsKICAgICAgIH0KIAogICAgICAgX21lc2FfdW5sb2NrX2NvbnRleHRfdGV4dHVyZXMoY3R4KTsKIAogICAgICAgbmV3bm9kZSA9IG5ld19hdHRyaWJfbm9kZSggR0xfVEVYVFVSRV9CSVQgKTsKLSAgICAgIG5ld25vZGUtPmRhdGEgPSBhdHRyOworICAgICAgbmV3bm9kZS0+ZGF0YSA9IHRleHN0YXRlOwogICAgICAgbmV3bm9kZS0+bmV4dCA9IGhlYWQ7CiAgICAgICBoZWFkID0gbmV3bm9kZTsKICAgIH0KQEAgLTQyMSw2ICs0NTMsNyBAQAogICAgICAgaGVhZCA9IG5ld25vZGU7CiAgICB9CiAKK2VuZDoKICAgIGN0eC0+QXR0cmliU3RhY2tbY3R4LT5BdHRyaWJTdGFja0RlcHRoXSA9IGhlYWQ7CiAgICBjdHgtPkF0dHJpYlN0YWNrRGVwdGgrKzsKIH0KQEAgLTYzMCwxNCArNjYzLDE5IEBACiB9CiAKIAorLyoqCisgKiBQb3AvcmVzdG9yZSB0ZXh0dXJlIGF0dHJpYnV0ZS9ncm91cCBzdGF0ZS4KKyAqLwogc3RhdGljIHZvaWQKLXBvcF90ZXh0dXJlX2dyb3VwKEdMY29udGV4dCAqY3R4LCBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9hdHRyaWIgKnRleEF0dHJpYikKK3BvcF90ZXh0dXJlX2dyb3VwKEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgdGV4dHVyZV9zdGF0ZSAqdGV4c3RhdGUpCiB7CiAgICBHTHVpbnQgdTsKIAorICAgX21lc2FfbG9ja19jb250ZXh0X3RleHR1cmVzKGN0eCk7CisKICAgIGZvciAodSA9IDA7IHUgPCBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0czsgdSsrKSB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp1bml0ID0gJnRleEF0dHJpYi0+VW5pdFt1XTsKLSAgICAgIEdMdWludCBpOworICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdW5pdCA9ICZ0ZXhzdGF0ZS0+VGV4dHVyZS5Vbml0W3VdOworICAgICAgR0x1aW50IHRndDsKIAogICAgICAgX21lc2FfQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyB1KTsKICAgICAgIF9tZXNhX3NldF9lbmFibGUoY3R4LCBHTF9URVhUVVJFXzFELApAQCAtNzMwLDUyICs3NjgsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCB1bml0LT5Db21iaW5lLlNjYWxlU2hpZnRBKTsKICAgICAgIH0KIAotICAgICAgLyogUmVzdG9yZSB0ZXh0dXJlIG9iamVjdCBzdGF0ZSAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9URVhUVVJFX1RBUkdFVFM7IGkrKykgewotICAgICAgICAgR0xlbnVtIHRhcmdldCA9IDA7CisgICAgICAvKiBSZXN0b3JlIHRleHR1cmUgb2JqZWN0IHN0YXRlIGZvciBlYWNoIHRhcmdldCAqLworICAgICAgZm9yICh0Z3QgPSAwOyB0Z3QgPCBOVU1fVEVYVFVSRV9UQVJHRVRTOyB0Z3QrKykgewogICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpvYmogPSBOVUxMOwogICAgICAgICAgR0xmbG9hdCBib3JkQ29sb3JbNF07CisgICAgICAgICBHTGVudW0gdGFyZ2V0OwogCi0gICAgICAgICBzd2l0Y2ggKGkpIHsKLSAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHRhcmdldCA9IEdMX1RFWFRVUkVfMUQ7Ci0gICAgICAgICAgICBvYmogPSAmdW5pdC0+U2F2ZWQxRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdGFyZ2V0ID0gR0xfVEVYVFVSRV8yRDsKLSAgICAgICAgICAgIG9iaiA9ICZ1bml0LT5TYXZlZDJEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB0YXJnZXQgPSBHTF9URVhUVVJFXzNEOwotICAgICAgICAgICAgb2JqID0gJnVuaXQtPlNhdmVkM0Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmICghY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2N1YmVfbWFwKQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB0YXJnZXQgPSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQjsKLSAgICAgICAgICAgIG9iaiA9ICZ1bml0LT5TYXZlZEN1YmVNYXA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmICghY3R4LT5FeHRlbnNpb25zLk5WX3RleHR1cmVfcmVjdGFuZ2xlKQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB0YXJnZXQgPSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9OVjsKLSAgICAgICAgICAgIG9iaiA9ICZ1bml0LT5TYXZlZFJlY3Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGlmICghY3R4LT5FeHRlbnNpb25zLk1FU0FfdGV4dHVyZV9hcnJheSkKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgdGFyZ2V0ID0gR0xfVEVYVFVSRV8xRF9BUlJBWV9FWFQ7Ci0gICAgICAgICAgICBvYmogPSAmdW5pdC0+U2F2ZWQxREFycmF5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBpZiAoIWN0eC0+RXh0ZW5zaW9ucy5NRVNBX3RleHR1cmVfYXJyYXkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHRhcmdldCA9IEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUOwotICAgICAgICAgICAgb2JqID0gJnVuaXQtPlNhdmVkMkRBcnJheTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIDsgLyogc2lsZW5jZSB3YXJuaW5ncyAqLworICAgICAgICAgb2JqID0gJnRleHN0YXRlLT5TYXZlZE9ialt1XVt0Z3RdOworCisgICAgICAgICAvKiBkb24ndCByZXN0b3JlIHN0YXRlIGZvciB1bnN1cHBvcnRlZCB0YXJnZXRzIHRvIHByZXZlbnQKKyAgICAgICAgICAqIHJhaXNpbmcgR0wgZXJyb3JzLgorICAgICAgICAgICovCisgICAgICAgICBpZiAob2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIgJiYKKyAgICAgICAgICAgICAhY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2N1YmVfbWFwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKG9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICYmCisgICAgICAgICAgICAgICAgICAhY3R4LT5FeHRlbnNpb25zLk5WX3RleHR1cmVfcmVjdGFuZ2xlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKChvYmotPlRhcmdldCA9PSBHTF9URVhUVVJFXzFEX0FSUkFZX0VYVCB8fAorICAgICAgICAgICAgICAgICAgIG9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUKSAmJgorICAgICAgICAgICAgICAgICAgIWN0eC0+RXh0ZW5zaW9ucy5NRVNBX3RleHR1cmVfYXJyYXkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICAgICB0YXJnZXQgPSBvYmotPlRhcmdldDsKIAogICAgICAgICAgX21lc2FfQmluZFRleHR1cmUodGFyZ2V0LCBvYmotPk5hbWUpOwogCkBAIC03ODQsOCArODAyLDggQEAKICAgICAgICAgIGJvcmRDb2xvclsyXSA9IENIQU5fVE9fRkxPQVQob2JqLT5Cb3JkZXJDb2xvclsyXSk7CiAgICAgICAgICBib3JkQ29sb3JbM10gPSBDSEFOX1RPX0ZMT0FUKG9iai0+Qm9yZGVyQ29sb3JbM10pOwogCi0gICAgICAgICBfbWVzYV9UZXhQYXJhbWV0ZXJmKHRhcmdldCwgR0xfVEVYVFVSRV9QUklPUklUWSwgb2JqLT5Qcmlvcml0eSk7CiAgICAgICAgICBfbWVzYV9UZXhQYXJhbWV0ZXJmdih0YXJnZXQsIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SLCBib3JkQ29sb3IpOworICAgICAgICAgX21lc2FfVGV4UGFyYW1ldGVyZih0YXJnZXQsIEdMX1RFWFRVUkVfUFJJT1JJVFksIG9iai0+UHJpb3JpdHkpOwogICAgICAgICAgX21lc2FfVGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfV1JBUF9TLCBvYmotPldyYXBTKTsKICAgICAgICAgIF9tZXNhX1RleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX1dSQVBfVCwgb2JqLT5XcmFwVCk7CiAgICAgICAgICBfbWVzYV9UZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1IsIG9iai0+V3JhcFIpOwpAQCAtODExLDI1ICs4MjksMTcgQEAKICAgICAgICAgICAgIF9tZXNhX1RleFBhcmFtZXRlcmYodGFyZ2V0LCBHTF9TSEFET1dfQU1CSUVOVF9TR0lYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPlNoYWRvd0FtYmllbnQpOwogICAgICAgICAgfQorICAgICAgfQogCisgICAgICAvKiByZW1vdmUgc2F2ZWQgcmVmZXJlbmNlcyB0byB0aGUgdGV4dHVyZSBvYmplY3RzICovCisgICAgICBmb3IgKHRndCA9IDA7IHRndCA8IE5VTV9URVhUVVJFX1RBUkdFVFM7IHRndCsrKSB7CisgICAgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhzdGF0ZS0+U2F2ZWRUZXhSZWZbdV1bdGd0XSwgTlVMTCk7CiAgICAgICB9CiAgICB9Ci0gICBfbWVzYV9BY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQgotICAgICAgICAgICAgICAgICAgICAgICAgICArIHRleEF0dHJpYi0+Q3VycmVudFVuaXQpOwogCi0gICAvKiAidW4tYnVtcCIgdGhlIHRleHR1cmUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudHMuICBXZSBkaWQgdGhhdCBzbyB0aGV5Ci0gICAgKiB3b3VsZG4ndCBpbmFkdmVydGFudGx5IGdldCBkZWxldGVkIHdoaWxlIHRoZXkgd2VyZSBzdGlsbCByZWZlcmVuY2VkCi0gICAgKiBpbnNpZGUgdGhlIGF0dHJpYnV0ZSBzdGF0ZSBzdGFjay4KLSAgICAqLwotICAgZm9yICh1ID0gMDsgdSA8IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOyB1KyspIHsKLSAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQxRC0+UmVmQ291bnQtLTsKLSAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQyRC0+UmVmQ291bnQtLTsKLSAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQzRC0+UmVmQ291bnQtLTsKLSAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnRDdWJlTWFwLT5SZWZDb3VudC0tOwotICAgICAgY3R4LT5UZXh0dXJlLlVuaXRbdV0uQ3VycmVudFJlY3QtPlJlZkNvdW50LS07Ci0gICAgICBjdHgtPlRleHR1cmUuVW5pdFt1XS5DdXJyZW50MURBcnJheS0+UmVmQ291bnQtLTsKLSAgICAgIGN0eC0+VGV4dHVyZS5Vbml0W3VdLkN1cnJlbnQyREFycmF5LT5SZWZDb3VudC0tOwotICAgfQorICAgX21lc2FfQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyB0ZXhzdGF0ZS0+VGV4dHVyZS5DdXJyZW50VW5pdCk7CisKKyAgIF9tZXNhX3VubG9ja19jb250ZXh0X3RleHR1cmVzKGN0eCk7CiB9CiAKIApAQCAtMTA5OCwxMCArMTEwOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0xpbnQpIHBvaW50LT5Db29yZFJlcGxhY2VbdV0pOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgX21lc2Ffc2V0X2VuYWJsZShjdHgsIEdMX1BPSU5UX1NQUklURV9OVixwb2ludC0+UG9pbnRTcHJpdGUpOwotICAgICAgICAgICAgICAgICAgX21lc2FfUG9pbnRQYXJhbWV0ZXJpKEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Qb2ludC5TcHJpdGVSTW9kZSk7Ci0gICAgICAgICAgICAgICAgICBfbWVzYV9Qb2ludFBhcmFtZXRlcmYoR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0xmbG9hdCljdHgtPlBvaW50LlNwcml0ZU9yaWdpbik7CisgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5FeHRlbnNpb25zLk5WX3BvaW50X3Nwcml0ZSkKKyAgICAgICAgICAgICAgICAgICAgIF9tZXNhX1BvaW50UGFyYW1ldGVyaU5WKEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlBvaW50LlNwcml0ZVJNb2RlKTsKKyAgICAgICAgICAgICAgICAgIF9tZXNhX1BvaW50UGFyYW1ldGVyZkVYVChHTF9QT0lOVF9TUFJJVEVfQ09PUkRfT1JJR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHTGZsb2F0KWN0eC0+UG9pbnQuU3ByaXRlT3JpZ2luKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwOCw5ICsxMjE5LDkgQEAKICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9CSVQ6CiAgICAgICAgICAgICAvKiBUYWtlIGNhcmUgb2YgdGV4dHVyZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50ZXJzICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9hdHRyaWIgKnRleHR1cmU7Ci0gICAgICAgICAgICAgICB0ZXh0dXJlID0gKGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2F0dHJpYiAqKSBhdHRyLT5kYXRhOwotICAgICAgICAgICAgICAgcG9wX3RleHR1cmVfZ3JvdXAoY3R4LCB0ZXh0dXJlKTsKKyAgICAgICAgICAgICAgIHN0cnVjdCB0ZXh0dXJlX3N0YXRlICp0ZXhzdGF0ZQorICAgICAgICAgICAgICAgICAgPSAoc3RydWN0IHRleHR1cmVfc3RhdGUgKikgYXR0ci0+ZGF0YTsKKyAgICAgICAgICAgICAgIHBvcF90ZXh0dXJlX2dyb3VwKGN0eCwgdGV4c3RhdGUpOwogCSAgICAgICBjdHgtPk5ld1N0YXRlIHw9IF9ORVdfVEVYVFVSRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM5NCw4ICsxNDA1LDEwIEBACiAgICAgICAgICAgICBhZGp1c3RfYnVmZmVyX29iamVjdF9yZWZfY291bnRzKCZjdHgtPkFycmF5LCAtMSk7CiAJIAogICAgICAgICAgICAgY3R4LT5BcnJheS5BY3RpdmVUZXh0dXJlID0gZGF0YS0+QWN0aXZlVGV4dHVyZTsKLQkgICAgY3R4LT5BcnJheS5Mb2NrRmlyc3QgPSBkYXRhLT5Mb2NrRmlyc3Q7Ci0JICAgIGN0eC0+QXJyYXkuTG9ja0NvdW50ID0gZGF0YS0+TG9ja0NvdW50OworCSAgICBpZiAoZGF0YS0+TG9ja0NvdW50ICE9IDApCisJICAgICAgIF9tZXNhX0xvY2tBcnJheXNFWFQoZGF0YS0+TG9ja0ZpcnN0LCBkYXRhLT5Mb2NrQ291bnQpOworCSAgICBlbHNlIGlmIChjdHgtPkFycmF5LkxvY2tDb3VudCkKKwkgICAgICAgX21lc2FfVW5sb2NrQXJyYXlzRVhUKCk7CiAKIAkgICAgX21lc2FfQmluZFZlcnRleEFycmF5QVBQTEUoIGRhdGEtPkFycmF5T2JqLT5OYW1lICk7CiAJICAgIApAQCAtMTQzMiw2ICsxNDQ1LDQyIEBACiB9CiAKIAorLyoqCisgKiBGcmVlIGFueSBhdHRyaWJ1dGUgc3RhdGUgZGF0YSB0aGF0IG1pZ2h0IGJlIGF0dGFjaGVkIHRvIHRoZSBjb250ZXh0LgorICovCit2b2lkCitfbWVzYV9mcmVlX2F0dHJpYl9kYXRhKEdMY29udGV4dCAqY3R4KQoreworICAgd2hpbGUgKGN0eC0+QXR0cmliU3RhY2tEZXB0aCA+IDApIHsKKyAgICAgIHN0cnVjdCBnbF9hdHRyaWJfbm9kZSAqYXR0ciwgKm5leHQ7CisKKyAgICAgIGN0eC0+QXR0cmliU3RhY2tEZXB0aC0tOworICAgICAgYXR0ciA9IGN0eC0+QXR0cmliU3RhY2tbY3R4LT5BdHRyaWJTdGFja0RlcHRoXTsKKworICAgICAgd2hpbGUgKGF0dHIpIHsKKyAgICAgICAgIGlmIChhdHRyLT5raW5kID09IEdMX1RFWFRVUkVfQklUKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdGV4dHVyZV9zdGF0ZSAqdGV4c3RhdGUgPSAoc3RydWN0IHRleHR1cmVfc3RhdGUqKWF0dHItPmRhdGE7CisgICAgICAgICAgICBHTHVpbnQgdSwgdGd0OworICAgICAgICAgICAgLyogY2xlYXIgcmVmZXJlbmNlcyB0byB0aGUgc2F2ZWQgdGV4dHVyZSBvYmplY3RzICovCisgICAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IHUrKykgeworICAgICAgICAgICAgICAgZm9yICh0Z3QgPSAwOyB0Z3QgPCBOVU1fVEVYVFVSRV9UQVJHRVRTOyB0Z3QrKykgeworICAgICAgICAgICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3RleG9iaigmdGV4c3RhdGUtPlNhdmVkVGV4UmVmW3VdW3RndF0sIE5VTEwpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBhbnkgb3RoZXIgY2h1bmtzIG9mIHN0YXRlIHRoYXQgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZz8gKi8KKyAgICAgICAgIH0KKworICAgICAgICAgbmV4dCA9IGF0dHItPm5leHQ7CisgICAgICAgICBfbWVzYV9mcmVlKGF0dHItPmRhdGEpOworICAgICAgICAgX21lc2FfZnJlZShhdHRyKTsKKyAgICAgICAgIGF0dHIgPSBuZXh0OworICAgICAgfQorICAgfQorfQorCisKIHZvaWQgX21lc2FfaW5pdF9hdHRyaWIoIEdMY29udGV4dCAqY3R4ICkKIHsKICAgIC8qIFJlbmRlcmVyIGFuZCBjbGllbnQgYXR0cmlidXRlIHN0YWNrcyAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9hdHRyaWIuaCBiL3NyYy9tZXNhL21haW4vYXR0cmliLmgKaW5kZXggMDlkNzUxOS4uMmNmOGZlNiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9hdHRyaWIuaAorKysgYi9zcmMvbWVzYS9tYWluL2F0dHJpYi5oCkBAIC0xLDE4ICsxLDggQEAKLS8qKgotICogXGZpbGUgYXR0cmliLmgKLSAqIEF0dHJpYnV0ZSBzdGFja3MuCi0gKiAKLSAqIFxpZiBzdWJzZXQKLSAqIChOby1vcCkKLSAqCi0gKiBcZW5kaWYKLSAqLwotCiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDUuMQorICogVmVyc2lvbjogIDcuMQogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTMyLDggKzIyLDYgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAotCi0KICNpZm5kZWYgQVRUUklCX0gKICNkZWZpbmUgQVRUUklCX0gKIApAQCAtNTgsMTAgKzQ2LDE0IEBACiBleHRlcm4gdm9pZCAKIF9tZXNhX2luaXRfYXR0cmliKCBHTGNvbnRleHQgKmN0eCApOwogCitleHRlcm4gdm9pZCAKK19tZXNhX2ZyZWVfYXR0cmliX2RhdGEoIEdMY29udGV4dCAqY3R4ICk7CisKICNlbHNlCiAKIC8qKiBOby1vcCAqLwogI2RlZmluZSBfbWVzYV9pbml0X2F0dHJpYiggYyApICgodm9pZCkwKQorI2RlZmluZSBfbWVzYV9mcmVlX2F0dHJpYl9kYXRhKCBjICkgKCh2b2lkKTApCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2J1ZmZlcm9iai5jIGIvc3JjL21lc2EvbWFpbi9idWZmZXJvYmouYwppbmRleCBkYzAzMDdmLi44ZDNkZGFmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2J1ZmZlcm9iai5jCisrKyBiL3NyYy9tZXNhL21haW4vYnVmZmVyb2JqLmMKQEAgLTQwOSw2ICs0MDksMTAxIEBACiAgICBjdHgtPkFycmF5LkVsZW1lbnRBcnJheUJ1ZmZlck9iaiA9IGN0eC0+QXJyYXkuTnVsbEJ1ZmZlck9iajsKIH0KIAorLyoqCisgKiBCaW5kIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRvIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorYmluZF9idWZmZXJfb2JqZWN0KEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKQoreworICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9sZEJ1Zk9iajsKKyAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpuZXdCdWZPYmogPSBOVUxMOworICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKipiaW5kVGFyZ2V0ID0gTlVMTDsKKworICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgIGNhc2UgR0xfQVJSQVlfQlVGRkVSX0FSQjoKKyAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5BcnJheS5BcnJheUJ1ZmZlck9iajsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkI6CisgICAgICBiaW5kVGFyZ2V0ID0gJmN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0VYVDoKKyAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5QYWNrLkJ1ZmZlck9iajsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0VYVDoKKyAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5VbnBhY2suQnVmZmVyT2JqOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX0VOVU0sICJnbEJpbmRCdWZmZXJBUkIodGFyZ2V0KSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBHZXQgcG9pbnRlciB0byBvbGQgYnVmZmVyIG9iamVjdCAodG8gYmUgdW5ib3VuZCkgKi8KKyAgIG9sZEJ1Zk9iaiA9IGdldF9idWZmZXIoY3R4LCB0YXJnZXQpOworICAgaWYgKG9sZEJ1Zk9iaiAmJiBvbGRCdWZPYmotPk5hbWUgPT0gYnVmZmVyKQorICAgICAgcmV0dXJuOyAgIC8qIHJlYmluZGluZyB0aGUgc2FtZSBidWZmZXIgb2JqZWN0LSBubyBjaGFuZ2UgKi8KKworICAgLyoKKyAgICAqIEdldCBwb2ludGVyIHRvIG5ldyBidWZmZXIgb2JqZWN0IChuZXdCdWZPYmopCisgICAgKi8KKyAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgLyogVGhlIHNwZWMgc2F5cyB0aGVyZSdzIG5vdCBhIGJ1ZmZlciBvYmplY3QgbmFtZWQgMCwgYnV0IHdlIHVzZQorICAgICAgICogb25lIGludGVybmFsbHkgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoaW5ncy4KKyAgICAgICAqLworICAgICAgbmV3QnVmT2JqID0gY3R4LT5BcnJheS5OdWxsQnVmZmVyT2JqOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBub24tZGVmYXVsdCBidWZmZXIgb2JqZWN0ICovCisgICAgICBuZXdCdWZPYmogPSBfbWVzYV9sb29rdXBfYnVmZmVyb2JqKGN0eCwgYnVmZmVyKTsKKyAgICAgIGlmICghbmV3QnVmT2JqKSB7CisgICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbmV3IGJ1ZmZlciBvYmplY3QgaWQsIGFsbG9jYXRlIGEgYnVmZmVyIG9iamVjdCBub3cgKi8KKyAgICAgICAgIEFTU0VSVChjdHgtPkRyaXZlci5OZXdCdWZmZXJPYmplY3QpOworICAgICAgICAgbmV3QnVmT2JqID0gY3R4LT5Ecml2ZXIuTmV3QnVmZmVyT2JqZWN0KGN0eCwgYnVmZmVyLCB0YXJnZXQpOworICAgICAgICAgaWYgKCFuZXdCdWZPYmopIHsKKyAgICAgICAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImdsQmluZEJ1ZmZlckFSQiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgICAgX21lc2Ffc2F2ZV9idWZmZXJfb2JqZWN0KGN0eCwgbmV3QnVmT2JqKTsKKyAgICAgIH0KKyAgIH0KKyAgIAorICAgLyogTWFrZSBuZXcgYmluZGluZyAqLworICAgKmJpbmRUYXJnZXQgPSBuZXdCdWZPYmo7CisgICBuZXdCdWZPYmotPlJlZkNvdW50Kys7CisKKyAgIC8qIFBhc3MgQmluZEJ1ZmZlciBjYWxsIHRvIGRldmljZSBkcml2ZXIgKi8KKyAgIGlmIChjdHgtPkRyaXZlci5CaW5kQnVmZmVyICYmIG5ld0J1Zk9iaikKKyAgICAgIGN0eC0+RHJpdmVyLkJpbmRCdWZmZXIoIGN0eCwgdGFyZ2V0LCBuZXdCdWZPYmogKTsKKworICAgLyogZGVjciByZWYgY291bnQgb24gb2xkIGJ1ZmZlciBvYmosIGRlbGV0ZSBpZiBuZWVkZWQgKi8KKyAgIGlmIChvbGRCdWZPYmopIHsKKyAgICAgIG9sZEJ1Zk9iai0+UmVmQ291bnQtLTsKKyAgICAgIGFzc2VydChvbGRCdWZPYmotPlJlZkNvdW50ID49IDApOworICAgICAgaWYgKG9sZEJ1Zk9iai0+UmVmQ291bnQgPT0gMCkgeworICAgICAgICAgYXNzZXJ0KG9sZEJ1Zk9iai0+TmFtZSAhPSAwKTsKKyAgICAgICAgIEFTU0VSVChjdHgtPkRyaXZlci5EZWxldGVCdWZmZXIpOworICAgICAgICAgY3R4LT5Ecml2ZXIuRGVsZXRlQnVmZmVyKCBjdHgsIG9sZEJ1Zk9iaiApOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogVXBkYXRlIHRoZSBkZWZhdWx0IGJ1ZmZlciBvYmplY3RzIGluIHRoZSBnaXZlbiBjb250ZXh0IHRvIHJlZmVyZW5jZSB0aG9zZQorICogc3BlY2lmaWVkIGluIHRoZSBzaGFyZWQgc3RhdGUgYW5kIHJlbGVhc2UgdGhvc2UgcmVmZXJlbmNpbmcgdGhlIG9sZCAKKyAqIHNoYXJlZCBzdGF0ZS4KKyAqLwordm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19idWZmZXJfb2JqZWN0cyhHTGNvbnRleHQgKmN0eCkKK3sKKyAgIC8qIEJpbmQgdGhlIE51bGxCdWZmZXJPYmogdG8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhvc2UKKyAgICAqIGluIHRoZSBzaGFyZWQgY29udGV4dCBoYXNoIHRhYmxlLgorICAgICovCisgICBiaW5kX2J1ZmZlcl9vYmplY3QoIGN0eCwgR0xfQVJSQVlfQlVGRkVSX0FSQiwgMCk7CisgICBiaW5kX2J1ZmZlcl9vYmplY3QoIGN0eCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCLCAwKTsKKyAgIGJpbmRfYnVmZmVyX29iamVjdCggY3R4LCBHTF9QSVhFTF9QQUNLX0JVRkZFUl9BUkIsIDApOworICAgYmluZF9idWZmZXJfb2JqZWN0KCBjdHgsIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQVJCLCAwKTsKK30KKwogCiAvKioKICAqIFdoZW4gd2UncmUgYWJvdXQgdG8gcmVhZCBwaXhlbCBkYXRhIG91dCBvZiBhIFBCTyAodmlhIGdsRHJhd1BpeGVscywKQEAgLTYzMCw3NiArNzI1LDkgQEAKIF9tZXNhX0JpbmRCdWZmZXJBUkIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKIHsKICAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKLSAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvbGRCdWZPYmo7Ci0gICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqbmV3QnVmT2JqID0gTlVMTDsKLSAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICoqYmluZFRhcmdldCA9IE5VTEw7CiAgICBBU1NFUlRfT1VUU0lERV9CRUdJTl9FTkQoY3R4KTsKIAotICAgc3dpdGNoICh0YXJnZXQpIHsKLSAgICAgIGNhc2UgR0xfQVJSQVlfQlVGRkVSX0FSQjoKLSAgICAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5BcnJheS5BcnJheUJ1ZmZlck9iajsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkI6Ci0gICAgICAgICBiaW5kVGFyZ2V0ID0gJmN0eC0+QXJyYXkuRWxlbWVudEFycmF5QnVmZmVyT2JqOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0VYVDoKLSAgICAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5QYWNrLkJ1ZmZlck9iajsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0VYVDoKLSAgICAgICAgIGJpbmRUYXJnZXQgPSAmY3R4LT5VbnBhY2suQnVmZmVyT2JqOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX0VOVU0sICJnbEJpbmRCdWZmZXJBUkIodGFyZ2V0KSIpOwotICAgICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBHZXQgcG9pbnRlciB0byBvbGQgYnVmZmVyIG9iamVjdCAodG8gYmUgdW5ib3VuZCkgKi8KLSAgIG9sZEJ1Zk9iaiA9IGdldF9idWZmZXIoY3R4LCB0YXJnZXQpOwotICAgaWYgKG9sZEJ1Zk9iaiAmJiBvbGRCdWZPYmotPk5hbWUgPT0gYnVmZmVyKQotICAgICAgcmV0dXJuOyAgIC8qIHJlYmluZGluZyB0aGUgc2FtZSBidWZmZXIgb2JqZWN0LSBubyBjaGFuZ2UgKi8KLQotICAgLyoKLSAgICAqIEdldCBwb2ludGVyIHRvIG5ldyBidWZmZXIgb2JqZWN0IChuZXdCdWZPYmopCi0gICAgKi8KLSAgIGlmIChidWZmZXIgPT0gMCkgewotICAgICAgLyogVGhlIHNwZWMgc2F5cyB0aGVyZSdzIG5vdCBhIGJ1ZmZlciBvYmplY3QgbmFtZWQgMCwgYnV0IHdlIHVzZQotICAgICAgICogb25lIGludGVybmFsbHkgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoaW5ncy4KLSAgICAgICAqLwotICAgICAgbmV3QnVmT2JqID0gY3R4LT5BcnJheS5OdWxsQnVmZmVyT2JqOwotICAgfQotICAgZWxzZSB7Ci0gICAgICAvKiBub24tZGVmYXVsdCBidWZmZXIgb2JqZWN0ICovCi0gICAgICBuZXdCdWZPYmogPSBfbWVzYV9sb29rdXBfYnVmZmVyb2JqKGN0eCwgYnVmZmVyKTsKLSAgICAgIGlmICghbmV3QnVmT2JqKSB7Ci0gICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbmV3IGJ1ZmZlciBvYmplY3QgaWQsIGFsbG9jYXRlIGEgYnVmZmVyIG9iamVjdCBub3cgKi8KLSAgICAgICAgIEFTU0VSVChjdHgtPkRyaXZlci5OZXdCdWZmZXJPYmplY3QpOwotCSBuZXdCdWZPYmogPSBjdHgtPkRyaXZlci5OZXdCdWZmZXJPYmplY3QoY3R4LCBidWZmZXIsIHRhcmdldCk7Ci0gICAgICAgICBpZiAoIW5ld0J1Zk9iaikgewotICAgICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLCAiZ2xCaW5kQnVmZmVyQVJCIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICB9Ci0gICAgICAgICBfbWVzYV9zYXZlX2J1ZmZlcl9vYmplY3QoY3R4LCBuZXdCdWZPYmopOwotICAgICAgfQotICAgfQotICAgCi0gICAvKiBNYWtlIG5ldyBiaW5kaW5nICovCi0gICAqYmluZFRhcmdldCA9IG5ld0J1Zk9iajsKLSAgIG5ld0J1Zk9iai0+UmVmQ291bnQrKzsKLQotICAgLyogUGFzcyBCaW5kQnVmZmVyIGNhbGwgdG8gZGV2aWNlIGRyaXZlciAqLwotICAgaWYgKGN0eC0+RHJpdmVyLkJpbmRCdWZmZXIgJiYgbmV3QnVmT2JqKQotICAgICAgY3R4LT5Ecml2ZXIuQmluZEJ1ZmZlciggY3R4LCB0YXJnZXQsIG5ld0J1Zk9iaiApOwotCi0gICAvKiBkZWNyIHJlZiBjb3VudCBvbiBvbGQgYnVmZmVyIG9iaiwgZGVsZXRlIGlmIG5lZWRlZCAqLwotICAgaWYgKG9sZEJ1Zk9iaikgewotICAgICAgb2xkQnVmT2JqLT5SZWZDb3VudC0tOwotICAgICAgYXNzZXJ0KG9sZEJ1Zk9iai0+UmVmQ291bnQgPj0gMCk7Ci0gICAgICBpZiAob2xkQnVmT2JqLT5SZWZDb3VudCA9PSAwKSB7Ci0JIGFzc2VydChvbGRCdWZPYmotPk5hbWUgIT0gMCk7Ci0JIEFTU0VSVChjdHgtPkRyaXZlci5EZWxldGVCdWZmZXIpOwotCSBjdHgtPkRyaXZlci5EZWxldGVCdWZmZXIoIGN0eCwgb2xkQnVmT2JqICk7Ci0gICAgICB9Ci0gICB9CisgICBiaW5kX2J1ZmZlcl9vYmplY3QoY3R4LCB0YXJnZXQsIGJ1ZmZlcik7CiB9CiAKIApAQCAtNzk1LDkgKzgyMyw5IEBACiAgICAgICAgICAgICBfbWVzYV9CaW5kQnVmZmVyQVJCKCBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0VYVCwgMCApOwogICAgICAgICAgfQogCi0JIC8qIFRoZSBJRCBpcyBpbW1lZGlhdGVseSBmcmVlZCBmb3IgcmUtdXNlICovCi0JIF9tZXNhX3JlbW92ZV9idWZmZXJfb2JqZWN0KGN0eCwgYnVmT2JqKTsKLQkgX21lc2FfdW5iaW5kX2J1ZmZlcl9vYmplY3QoY3R4LCBidWZPYmopOworICAgICAgICAgLyogVGhlIElEIGlzIGltbWVkaWF0ZWx5IGZyZWVkIGZvciByZS11c2UgKi8KKyAgICAgICAgIF9tZXNhX3JlbW92ZV9idWZmZXJfb2JqZWN0KGN0eCwgYnVmT2JqKTsKKyAgICAgICAgIF9tZXNhX3VuYmluZF9idWZmZXJfb2JqZWN0KGN0eCwgYnVmT2JqKTsKICAgICAgIH0KICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9idWZmZXJvYmouaCBiL3NyYy9tZXNhL21haW4vYnVmZmVyb2JqLmgKaW5kZXggMDI0ZTVhOC4uNTM3YjI0MCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9idWZmZXJvYmouaAorKysgYi9zcmMvbWVzYS9tYWluL2J1ZmZlcm9iai5oCkBAIC0zOCw2ICszOCw5IEBACiBleHRlcm4gdm9pZAogX21lc2FfaW5pdF9idWZmZXJfb2JqZWN0cyggR0xjb250ZXh0ICpjdHggKTsKIAorZXh0ZXJuIHZvaWQKK19tZXNhX3VwZGF0ZV9kZWZhdWx0X29iamVjdHNfYnVmZmVyX29iamVjdHMoR0xjb250ZXh0ICpjdHgpOworCiBleHRlcm4gc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKgogX21lc2FfbmV3X2J1ZmZlcl9vYmplY3QoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgbmFtZSwgR0xlbnVtIHRhcmdldCApOwogCkBAIC0xMDQsNyArMTA3LDYgQEAKIF9tZXNhX3VubWFwX2RyYXdwaXhfcGJvKEdMY29udGV4dCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2spOwogCi0KIGV4dGVybiB2b2lkICoKIF9tZXNhX21hcF9yZWFkcGl4X3BibyhHTGNvbnRleHQgKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2ssCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2J1ZmZlcnMuYyBiL3NyYy9tZXNhL21haW4vYnVmZmVycy5jCmluZGV4IDFkMDdjNjguLjVkZDg1ZGUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vYnVmZmVycy5jCisrKyBiL3NyYy9tZXNhL21haW4vYnVmZmVycy5jCkBAIC0xMzMsNiArMTMzLDE0IEBACiAgICAgICAgICByZXR1cm4gQlVGRkVSX0JJVF9DT0xPUjI7CiAgICAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVDoKICAgICAgICAgIHJldHVybiBCVUZGRVJfQklUX0NPTE9SMzsKKyAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDRfRVhUOgorICAgICAgICAgcmV0dXJuIEJVRkZFUl9CSVRfQ09MT1I0OworICAgICAgY2FzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQ6CisgICAgICAgICByZXR1cm4gQlVGRkVSX0JJVF9DT0xPUjU7CisgICAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVDoKKyAgICAgICAgIHJldHVybiBCVUZGRVJfQklUX0NPTE9SNjsKKyAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDdfRVhUOgorICAgICAgICAgcmV0dXJuIEJVRkZFUl9CSVRfQ09MT1I3OwogICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8qIGVycm9yICovCiAgICAgICAgICByZXR1cm4gQkFEX01BU0s7CkBAIC0xODIsNiArMTkwLDE0IEBACiAgICAgICAgICByZXR1cm4gQlVGRkVSX0NPTE9SMjsKICAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDNfRVhUOgogICAgICAgICAgcmV0dXJuIEJVRkZFUl9DT0xPUjM7CisgICAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X0VYVDoKKyAgICAgICAgIHJldHVybiBCVUZGRVJfQ09MT1I0OworICAgICAgY2FzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQ6CisgICAgICAgICByZXR1cm4gQlVGRkVSX0NPTE9SNTsKKyAgICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDZfRVhUOgorICAgICAgICAgcmV0dXJuIEJVRkZFUl9DT0xPUjY7CisgICAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X0VYVDoKKyAgICAgICAgIHJldHVybiBCVUZGRVJfQ09MT1I3OwogICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8qIGVycm9yICovCiAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xOTYsNiArMjEyLDIwIEBACiAgKiBcc2EgX21lc2FfRHJhd0J1ZmZlcnNBUkIKICAqCiAgKiBccGFyYW0gYnVmZmVyICBidWZmZXIgdG9rZW4gc3VjaCBhcyBHTF9MRUZUIG9yIEdMX0ZST05UX0FORF9CQUNLLCBldGMuCisgKgorICogTm90ZSB0aGF0IHRoZSBiZWhhdmlvdXIgb2YgdGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlCisgKiBjdXJyZW50IGN0eC0+RHJhd0J1ZmZlciBpcyBhIHdpbmRvdy1zeXN0ZW0gZnJhbWVidWZmZXIgKE5hbWU9MCkgb3IKKyAqIGEgdXNlci1jcmVhdGVkIGZyYW1lYnVmZmVyIG9iamVjdCAoTmFtZSE9MCkuCisgKiAgIEluIHRoZSBmb3JtZXIgY2FzZSwgd2UgdXBkYXRlIHRoZSBwZXItY29udGV4dCBjdHgtPkNvbG9yLkRyYXdCdWZmZXIKKyAqICAgc3RhdGUgdmFyIF9hbmRfIHRoZSBGQidzIENvbG9yRHJhd0J1ZmZlciBzdGF0ZS4KKyAqICAgSW4gdGhlIGxhdGVyIGNhc2UsIHdlIHVwZGF0ZSB0aGUgRkIncyBDb2xvckRyYXdCdWZmZXIgc3RhdGUgb25seS4KKyAqCisgKiBGdXJ0aGVybW9yZSwgdXBvbiBhIE1ha2VDdXJyZW50KCkgb3IgQmluZEZyYW1lYnVmZmVyKCkgY2FsbCwgaWYgdGhlCisgKiBuZXcgRkIgaXMgYSB3aW5kb3cgc3lzdGVtIEZCLCB3ZSBuZWVkIHRvIHJlLXVwZGF0ZSB0aGUgRkIncworICogQ29sb3JEcmF3QnVmZmVyIHN0YXRlIHRvIG1hdGNoIHRoZSBjb250ZXh0LiAgVGhpcyBpcyBoYW5kbGVkIGluCisgKiBfbWVzYV91cGRhdGVfZnJhbWVidWZmZXIoKS4KKyAqCisgKiBTZWUgdGhlIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3Qgc3BlYyBmb3IgbW9yZSBpbmZvLgogICovCiB2b2lkIEdMQVBJRU5UUlkKIF9tZXNhX0RyYXdCdWZmZXIoR0xlbnVtIGJ1ZmZlcikKQEAgLTMxNSw0NSArMzQ1LDE2IEBACiAKIAogLyoqCi0gKiBTZXQgY29sb3Igb3V0cHV0IHN0YXRlLiAgVHJhZGl0aW9uYWxseSwgdGhlcmUgd2FzIG9ubHkgb25lIGNvbG9yCi0gKiBvdXRwdXQsIGJ1dCBmcmFnbWVudCBwcm9ncmFtcyBjYW4gbm93IGhhdmUgc2V2ZXJhbCBkaXN0aW5jdCBjb2xvcgotICogb3V0cHV0cyAoc2VlIEdMX0FSQl9kcmF3X2J1ZmZlcnMpLiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0ZQotICogZm9yIG9uZSBzdWNoIGNvbG9yIG91dHB1dC4KLSAqIFxwYXJhbSBjdHggIGN1cnJlbnQgY29udGV4dAotICogXHBhcmFtIG91dHB1dCAgd2hpY2ggZnJhZ21lbnQgcHJvZ3JhbSBvdXRwdXQKLSAqIFxwYXJhbSBidWZmZXIgIGJ1ZmZlciB0byB3cml0ZSB0byAobGlrZSBHTF9MRUZUKQotICogXHBhcmFtIGRlc3RNYXNrICBCVUZGRVJfKiBiaXRtYXNrCi0gKiAgICAgICAgICAgICAgICAgIChsaWtlIEJVRkZFUl9CSVRfRlJPTlRfTEVGVCB8IEJVRkZFUl9CSVRfQkFDS19MRUZUKS4KLSAqLwotc3RhdGljIHZvaWQKLXNldF9jb2xvcl9vdXRwdXQoR0xjb250ZXh0ICpjdHgsIEdMdWludCBvdXRwdXQsIEdMZW51bSBidWZmZXIsCi0gICAgICAgICAgICAgICAgIEdMYml0ZmllbGQgZGVzdE1hc2spCi17Ci0gICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOwotCi0gICBBU1NFUlQob3V0cHV0IDwgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycyk7Ci0KLSAgIC8qIFNldCBwZXItRkJPIHN0YXRlICovCi0gICBmYi0+Q29sb3JEcmF3QnVmZmVyW291dHB1dF0gPSBidWZmZXI7Ci0gICBmYi0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbb3V0cHV0XSA9IGRlc3RNYXNrOwotICAgLyogbm90IHJlYWxseSBuZWVkZWQsIHdpbGwgYmUgc2V0IGxhdGVyICovCi0gICBmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnNbb3V0cHV0XSA9IDA7Ci0KLSAgIGlmIChmYi0+TmFtZSA9PSAwKQotICAgLyogU2V0IHRyYWRpdGlvbmFsIHN0YXRlIHZhciAqLwotICAgICAgY3R4LT5Db2xvci5EcmF3QnVmZmVyW291dHB1dF0gPSBidWZmZXI7Ci19Ci0KLQotLyoqCi0gKiBIZWxwZXIgcm91dGluZSB1c2VkIGJ5IF9tZXNhX0RyYXdCdWZmZXIsIF9tZXNhX0RyYXdCdWZmZXJzQVJCIGFuZAotICogb3RoZXIgcGxhY2VzICh3aW5kb3cgZmJvIGZpeHVwKSB0byBzZXQgZmJvIChhbmQgdGhlIG9sZCBjdHgpIGZpZWxkcy4KKyAqIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgdGhlIEdMX0RSQVdfQlVGRkVSIHN0YXRlIGluIHRoZSBjb250ZXh0IGFuZAorICogY3VycmVudCBGQk8uCisgKgogICogQWxsIGVycm9yIGNoZWNraW5nIHdpbGwgaGF2ZSBiZWVuIGRvbmUgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uCiAgKiBzbyBub3RoaW5nIHNob3VsZCBnbyB3cm9uZyBhdCB0aGlzIHBvaW50LgorICoKICAqIFxwYXJhbSBjdHggIGN1cnJlbnQgY29udGV4dAogICogXHBhcmFtIG4gICAgbnVtYmVyIG9mIGNvbG9yIG91dHB1dHMgdG8gc2V0CiAgKiBccGFyYW0gYnVmZmVycyAgYXJyYXlbbl0gb2YgY29sb3JidWZmZXIgbmFtZXMsIGxpa2UgR0xfTEVGVC4KLSAqIFxwYXJhbSBkZXN0TWFzayAgYXJyYXlbbl0gb2YgQlVGRkVSXyogYml0bWFza3Mgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUKKyAqIFxwYXJhbSBkZXN0TWFzayAgYXJyYXlbbl0gb2YgQlVGRkVSX0JJVF8qIGJpdG1hc2tzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlCiAgKiAgICAgICAgICAgICAgICAgIGNvbG9yYnVmZmVyIG5hbWVzLiAgKGkuZS4gR0xfRlJPTlRfQU5EX0JBQ0sgPT4KICAqICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9GUk9OVF9MRUZUIHwgQlVGRkVSX0JJVF9CQUNLX0xFRlQpLgogICovCkBAIC0zNjEsMTMgKzM2MiwxMyBAQAogX21lc2FfZHJhd2J1ZmZlcnMoR0xjb250ZXh0ICpjdHgsIEdMdWludCBuLCBjb25zdCBHTGVudW0gKmJ1ZmZlcnMsCiAgICAgICAgICAgICAgICAgICBjb25zdCBHTGJpdGZpZWxkICpkZXN0TWFzaykKIHsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPkRyYXdCdWZmZXI7CiAgICBHTGJpdGZpZWxkIG1hc2tbTUFYX0RSQVdfQlVGRkVSU107Ci0gICBHTHVpbnQgb3V0cHV0OwogCiAgICBpZiAoIWRlc3RNYXNrKSB7CiAgICAgICAvKiBjb21wdXRlIGRlc3RNYXNrIHZhbHVlcyBub3cgKi8KLSAgICAgIGNvbnN0IEdMYml0ZmllbGQgc3VwcG9ydGVkTWFzawotICAgICAgICAgPSBzdXBwb3J0ZWRfYnVmZmVyX2JpdG1hc2soY3R4LCBjdHgtPkRyYXdCdWZmZXIpOworICAgICAgY29uc3QgR0xiaXRmaWVsZCBzdXBwb3J0ZWRNYXNrID0gc3VwcG9ydGVkX2J1ZmZlcl9iaXRtYXNrKGN0eCwgZmIpOworICAgICAgR0x1aW50IG91dHB1dDsKICAgICAgIGZvciAob3V0cHV0ID0gMDsgb3V0cHV0IDwgbjsgb3V0cHV0KyspIHsKICAgICAgICAgIG1hc2tbb3V0cHV0XSA9IGRyYXdfYnVmZmVyX2VudW1fdG9fYml0bWFzayhidWZmZXJzW291dHB1dF0pOwogICAgICAgICAgQVNTRVJUKG1hc2tbb3V0cHV0XSAhPSBCQURfTUFTSyk7CkBAIC0zNzYsMjUgKzM3Nyw5NCBAQAogICAgICAgZGVzdE1hc2sgPSBtYXNrOwogICAgfQogCi0gICBmb3IgKG91dHB1dCA9IDA7IG91dHB1dCA8IG47IG91dHB1dCsrKSB7Ci0gICAgICBzZXRfY29sb3Jfb3V0cHV0KGN0eCwgb3V0cHV0LCBidWZmZXJzW291dHB1dF0sIGRlc3RNYXNrW291dHB1dF0pOworICAgaWYgKG4gPT0gMSkgeworICAgICAgR0x1aW50IGJ1ZiwgY291bnQgPSAwOworICAgICAgLyogaW5pdCB0byAtMSB0byBoZWxwIGNhdGNoIGVycm9ycyAqLworICAgICAgZmItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdID0gLTE7CisgICAgICBmb3IgKGJ1ZiA9IDA7IGJ1ZiA8IEJVRkZFUl9DT1VOVDsgYnVmKyspIHsKKyAgICAgICAgIGlmIChkZXN0TWFza1swXSAmICgxIDw8IGJ1ZikpIHsKKyAgICAgICAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1tjb3VudF0gPSBidWY7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZmItPkNvbG9yRHJhd0J1ZmZlclswXSA9IGJ1ZmZlcnNbMF07CisgICAgICBmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnMgPSBjb3VudDsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgR0x1aW50IGJ1ZiwgY291bnQgPSAwOworICAgICAgZm9yIChidWYgPSAwOyBidWYgPCBuOyBidWYrKyApIHsKKyAgICAgICAgIGlmIChkZXN0TWFza1tidWZdKSB7CisgICAgICAgICAgICBmYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbYnVmXSA9IF9tZXNhX2ZmcyhkZXN0TWFza1tidWZdKSAtIDE7CisgICAgICAgICAgICBmYi0+Q29sb3JEcmF3QnVmZmVyW2J1Zl0gPSBidWZmZXJzW2J1Zl07CisgICAgICAgICAgICBjb3VudCA9IGJ1ZiArIDE7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1tidWZdID0gLTE7CisgICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBzZXQgcmVtYWluaW5nIG91dHB1dHMgdG8gLTEgKEdMX05PTkUpICovCisgICAgICB3aGlsZSAoYnVmIDwgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycykgeworICAgICAgICAgZmItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzW2J1Zl0gPSAtMTsKKyAgICAgICAgIGZiLT5Db2xvckRyYXdCdWZmZXJbYnVmXSA9IEdMX05PTkU7CisgICAgICAgICBidWYrKzsKKyAgICAgIH0KKyAgICAgIGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA9IGNvdW50OwogICAgfQogCi0gICAvKiBzZXQgcmVtYWluaW5nIGNvbG9yIG91dHB1dHMgdG8gTk9ORSAqLwotICAgZm9yIChvdXRwdXQgPSBuOyBvdXRwdXQgPCBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOyBvdXRwdXQrKykgewotICAgICAgc2V0X2NvbG9yX291dHB1dChjdHgsIG91dHB1dCwgR0xfTk9ORSwgMHgwKTsKKyAgIGlmIChmYi0+TmFtZSA9PSAwKSB7CisgICAgICAvKiBhbHNvIHNldCBjb250ZXh0IGRyYXdidWZmZXIgc3RhdGUgKi8KKyAgICAgIEdMdWludCBidWY7CisgICAgICBmb3IgKGJ1ZiA9IDA7IGJ1ZiA8IGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnM7IGJ1ZisrKSB7CisgICAgICAgICBjdHgtPkNvbG9yLkRyYXdCdWZmZXJbYnVmXSA9IGZiLT5Db2xvckRyYXdCdWZmZXJbYnVmXTsKKyAgICAgIH0KICAgIH0KIAogICAgY3R4LT5OZXdTdGF0ZSB8PSBfTkVXX0JVRkZFUlM7CiB9CiAKIAotR0xib29sZWFuCi1fbWVzYV9yZWFkYnVmZmVyX3VwZGF0ZV9maWVsZHMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIpCisvKioKKyAqIExpa2UgXHNhIF9tZXNhX2RyYXdidWZmZXJzKCksIHRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAqIEdMX1JFQURfQlVGRkVSIHN0YXRlIGluIHRoZSBjb250ZXh0IGFuZCBjdXJyZW50IEZCTy4KKyAqIFxwYXJhbSBjdHggIHRoZSByZW5kZXJpbmcgY29udGV4dAorICogXHBhcmFtIGJ1ZmZlciAgR0xfRlJPTlQsIEdMX0JBQ0ssIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBldGMuCisgKiBccGFyYW0gYnVmZmVySW5kZXggIHRoZSBudW1lcmljYWwgaW5kZXggY29ycmVzcG9uZGluZyB0byAnYnVmZmVyJworICovCit2b2lkCitfbWVzYV9yZWFkYnVmZmVyKEdMY29udGV4dCAqY3R4LCBHTGVudW0gYnVmZmVyLCBHTGludCBidWZmZXJJbmRleCkKK3sKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPlJlYWRCdWZmZXI7CisKKyAgIGlmIChmYi0+TmFtZSA9PSAwKSB7CisgICAgICAvKiBPbmx5IHVwZGF0ZSB0aGUgcGVyLWNvbnRleHQgUkVBRF9CVUZGRVIgc3RhdGUgaWYgd2UncmUgYm91bmQgdG8KKyAgICAgICAqIGEgd2luZG93LXN5c3RlbSBmcmFtZWJ1ZmZlci4KKyAgICAgICAqLworICAgICAgY3R4LT5QaXhlbC5SZWFkQnVmZmVyID0gYnVmZmVyOworICAgfQorCisgICBmYi0+Q29sb3JSZWFkQnVmZmVyID0gYnVmZmVyOworICAgZmItPl9Db2xvclJlYWRCdWZmZXJJbmRleCA9IGJ1ZmZlckluZGV4OworCisgICBjdHgtPk5ld1N0YXRlIHw9IF9ORVdfUElYRUw7Cit9CisKKworCisvKioKKyAqIENhbGxlZCBieSBnbFJlYWRCdWZmZXIgdG8gc2V0IHRoZSBzb3VyY2UgcmVuZGVyYnVmZmVyIGZvciByZWFkaW5nIHBpeGVscy4KKyAqIFxwYXJhbSBtb2RlIGNvbG9yIGJ1ZmZlciBzdWNoIGFzIEdMX0ZST05ULCBHTF9CQUNLLCBldGMuCisgKi8KK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUmVhZEJ1ZmZlcihHTGVudW0gYnVmZmVyKQogewogICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYjsKICAgIEdMYml0ZmllbGQgc3VwcG9ydGVkTWFzazsKICAgIEdMaW50IHNyY0J1ZmZlcjsKKyAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKyAgIEFTU0VSVF9PVVRTSURFX0JFR0lOX0VORF9BTkRfRkxVU0goY3R4KTsKKworICAgaWYgKE1FU0FfVkVSQk9TRSAmIFZFUkJPU0VfQVBJKQorICAgICAgX21lc2FfZGVidWcoY3R4LCAiZ2xSZWFkQnVmZmVyICVzXG4iLCBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihidWZmZXIpKTsKIAogICAgZmIgPSBjdHgtPlJlYWRCdWZmZXI7CiAKQEAgLTQwOSw0MyArNDc5LDIxIEBACiAgICAgICAvKiBnZW5lcmFsIGNhc2UgLyB3aW5kb3ctc3lzdGVtIGZyYW1lYnVmZmVyICovCiAgICAgICBzcmNCdWZmZXIgPSByZWFkX2J1ZmZlcl9lbnVtX3RvX2luZGV4KGJ1ZmZlcik7CiAgICAgICBpZiAoc3JjQnVmZmVyID09IC0xKSB7Ci0gICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRU5VTSwgImdsUmVhZEJ1ZmZlcihidWZmZXI9MHgleCkiLCBidWZmZXIpOwotICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX0VOVU0sCisgICAgICAgICAgICAgICAgICAgICAiZ2xSZWFkQnVmZmVyKGJ1ZmZlcj0weCV4KSIsIGJ1ZmZlcik7CisgICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBzdXBwb3J0ZWRNYXNrID0gc3VwcG9ydGVkX2J1ZmZlcl9iaXRtYXNrKGN0eCwgZmIpOwogICAgICAgaWYgKCgoMSA8PCBzcmNCdWZmZXIpICYgc3VwcG9ydGVkTWFzaykgPT0gMCkgewotICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgImdsUmVhZEJ1ZmZlcihidWZmZXI9MHgleCkiLCBidWZmZXIpOwotICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICJnbFJlYWRCdWZmZXIoYnVmZmVyPTB4JXgpIiwgYnVmZmVyKTsKKyAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgIH0KIAotICAgaWYgKGZiLT5OYW1lID09IDApIHsKLSAgICAgIGN0eC0+UGl4ZWwuUmVhZEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgIH0KLSAgIGZiLT5Db2xvclJlYWRCdWZmZXIgPSBidWZmZXI7Ci0gICBmYi0+X0NvbG9yUmVhZEJ1ZmZlckluZGV4ID0gc3JjQnVmZmVyOworICAgLyogT0ssIGFsbCBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBjb21wbGV0ZWQgbm93ICovCiAKLSAgIHJldHVybiBHTF9UUlVFOwotfQotCi0KLQotLyoqCi0gKiBDYWxsZWQgYnkgZ2xSZWFkQnVmZmVyIHRvIHNldCB0aGUgc291cmNlIHJlbmRlcmJ1ZmZlciBmb3IgcmVhZGluZyBwaXhlbHMuCi0gKiBccGFyYW0gbW9kZSBjb2xvciBidWZmZXIgc3VjaCBhcyBHTF9GUk9OVCwgR0xfQkFDSywgZXRjLgotICovCi12b2lkIEdMQVBJRU5UUlkKLV9tZXNhX1JlYWRCdWZmZXIoR0xlbnVtIGJ1ZmZlcikKLXsKLSAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKLSAgIEFTU0VSVF9PVVRTSURFX0JFR0lOX0VORF9BTkRfRkxVU0goY3R4KTsKLQotICAgaWYgKE1FU0FfVkVSQk9TRSAmIFZFUkJPU0VfQVBJKQotICAgICAgX21lc2FfZGVidWcoY3R4LCAiZ2xSZWFkQnVmZmVyICVzXG4iLCBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihidWZmZXIpKTsKLQotICAgaWYgKCFfbWVzYV9yZWFkYnVmZmVyX3VwZGF0ZV9maWVsZHMoY3R4LCBidWZmZXIpKQotICAgICAgcmV0dXJuOwotCisgICBfbWVzYV9yZWFkYnVmZmVyKGN0eCwgYnVmZmVyLCBzcmNCdWZmZXIpOwogICAgY3R4LT5OZXdTdGF0ZSB8PSBfTkVXX0JVRkZFUlM7CiAKICAgIC8qCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2J1ZmZlcnMuaCBiL3NyYy9tZXNhL21haW4vYnVmZmVycy5oCmluZGV4IDUzZDVmYjguLjhhN2U3YjUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vYnVmZmVycy5oCisrKyBiL3NyYy9tZXNhL21haW4vYnVmZmVycy5oCkBAIC01LDkgKzUsOSBAQAogCiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNQorICogVmVyc2lvbjogIDcuMQogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTQ2LDggKzQ2LDggQEAKIF9tZXNhX2RyYXdidWZmZXJzKEdMY29udGV4dCAqY3R4LCBHTHVpbnQgbiwgY29uc3QgR0xlbnVtICpidWZmZXJzLAogICAgICAgICAgICAgICAgICAgY29uc3QgR0xiaXRmaWVsZCAqZGVzdE1hc2spOwogCi1leHRlcm4gR0xib29sZWFuCi1fbWVzYV9yZWFkYnVmZmVyX3VwZGF0ZV9maWVsZHMoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIpOworZXh0ZXJuIHZvaWQKK19tZXNhX3JlYWRidWZmZXIoR0xjb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIsIEdMaW50IGJ1ZmZlckluZGV4KTsKIAogZXh0ZXJuIHZvaWQgR0xBUElFTlRSWQogX21lc2FfUmVhZEJ1ZmZlciggR0xlbnVtIG1vZGUgKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vY2xlYXIuYyBiL3NyYy9tZXNhL21haW4vY2xlYXIuYwppbmRleCA0MzQ2ODU5Li5hNjI1N2Y5IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2NsZWFyLmMKKysrIGIvc3JjL21lc2EvbWFpbi9jbGVhci5jCkBAIC0xMTQsOCArMTE0LDYgQEAKICAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKICAgIEFTU0VSVF9PVVRTSURFX0JFR0lOX0VORF9BTkRfRkxVU0goY3R4KTsKIAotICAgRkxVU0hfQ1VSUkVOVChjdHgsIDApOwotCiAgICBpZiAoTUVTQV9WRVJCT1NFICYgVkVSQk9TRV9BUEkpCiAgICAgICBfbWVzYV9kZWJ1ZyhjdHgsICJnbENsZWFyIDB4JXhcbiIsIG1hc2spOwogCkBAIC0xMzgsNyArMTM2LDkgQEAKICAgICAgIHJldHVybjsKICAgIH0KIAotICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+V2lkdGggPT0gMCB8fCBjdHgtPkRyYXdCdWZmZXItPkhlaWdodCA9PSAwKQorICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+V2lkdGggPT0gMCB8fCBjdHgtPkRyYXdCdWZmZXItPkhlaWdodCA9PSAwIHx8CisgICAgICAgY3R4LT5EcmF3QnVmZmVyLT5fWG1pbiA+PSBjdHgtPkRyYXdCdWZmZXItPl9YbWF4IHx8CisgICAgICAgY3R4LT5EcmF3QnVmZmVyLT5fWW1pbiA+PSBjdHgtPkRyYXdCdWZmZXItPl9ZbWF4KQogICAgICAgcmV0dXJuOwogCiAgICBpZiAoY3R4LT5SZW5kZXJNb2RlID09IEdMX1JFTkRFUikgewpAQCAtMTU1LDcgKzE1NSwxMCBAQAogICAgICAgICovCiAgICAgICBidWZmZXJNYXNrID0gMDsKICAgICAgIGlmIChtYXNrICYgR0xfQ09MT1JfQlVGRkVSX0JJVCkgewotICAgICAgICAgYnVmZmVyTWFzayB8PSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJNYXNrWzBdOworICAgICAgICAgR0x1aW50IGk7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXJNYXNrIHw9ICgxIDw8IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbaV0pOworICAgICAgICAgfQogICAgICAgfQogCiAgICAgICBpZiAoKG1hc2sgJiBHTF9ERVBUSF9CVUZGRVJfQklUKQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9jb25maWcuaCBiL3NyYy9tZXNhL21haW4vY29uZmlnLmgKaW5kZXggZjgxMDllYy4uODgyZTJmMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9jb25maWcuaAorKysgYi9zcmMvbWVzYS9tYWluL2NvbmZpZy5oCkBAIC0yMTgsNyArMjE4LDcgQEAKIC8qKiBGb3IgR0xfQVJCX3ZlcnRleF9zaGFkZXIgKi8KIC8qQHsqLwogI2RlZmluZSBNQVhfVkVSVEVYX0FUVFJJQlMgMTYKLSNkZWZpbmUgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIDAKKyNkZWZpbmUgTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIE1BWF9URVhUVVJFX1VOSVRTCiAjZGVmaW5lIE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIChNQVhfVEVYVFVSRV9JTUFHRV9VTklUUyArIE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUykKIC8qQH0qLwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2NvbnRleHQuYyBiL3NyYy9tZXNhL21haW4vY29udGV4dC5jCmluZGV4IGVkM2ZhZWMuLjk2YThjMzAgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL21haW4vY29udGV4dC5jCkBAIC02LDkgKzYsOSBAQAogCiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNQorICogVmVyc2lvbjogIDcuMQogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTgwOSw3ICs4MDksNyBAQAogICAgfQogCiAgICAvKiByZWRvIHNwZWNpYWwgY2FzZXM6ICovCi0gICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfV0VJR0hUXSwgMS4wLCAwLjAsIDAuMCwgMS4wICk7CisgICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfV0VJR0hUXSwgMS4wLCAwLjAsIDAuMCwgMC4wICk7CiAgICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfTk9STUFMXSwgMC4wLCAwLjAsIDEuMCwgMS4wICk7CiAgICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfQ09MT1IwXSwgMS4wLCAxLjAsIDEuMCwgMS4wICk7CiAgICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfQ09MT1IxXSwgMC4wLCAwLjAsIDAuMCwgMS4wICk7CkBAIC0xMDY0LDcgKzEwNjQsMjggQEAKICAgIC8qIE1pc2NlbGxhbmVvdXMgKi8KICAgIGN0eC0+TmV3U3RhdGUgPSBfTkVXX0FMTDsKICAgIGN0eC0+RXJyb3JWYWx1ZSA9IChHTGVudW0pIEdMX05PX0VSUk9SOwotICAgY3R4LT5fRmFjaW5nID0gMDsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBVcGRhdGUgZGVmYXVsdCBvYmplY3RzIGluIGEgR0wgY29udGV4dCB3aXRoIHJlc3BlY3QgdG8gc2hhcmVkIHN0YXRlLgorICoKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqCisgKiBSZW1vdmVzIHJlZmVyZW5jZXMgdG8gb2xkIGRlZmF1bHQgb2JqZWN0cywgKHRleHR1cmUgb2JqZWN0cywgcHJvZ3JhbQorICogb2JqZWN0cywgZXRjLikgYW5kIGNoYW5nZXMgdG8gcmVmZXJlbmNlIHRob3NlIGZyb20gdGhlIGN1cnJlbnQgc2hhcmVkCisgKiBzdGF0ZS4KKyAqLworc3RhdGljIEdMYm9vbGVhbgordXBkYXRlX2RlZmF1bHRfb2JqZWN0cyhHTGNvbnRleHQgKmN0eCkKK3sKKyAgIGFzc2VydChjdHgpOworCisgICBfbWVzYV91cGRhdGVfZGVmYXVsdF9vYmplY3RzX3Byb2dyYW0oY3R4KTsKKyAgIF9tZXNhX3VwZGF0ZV9kZWZhdWx0X29iamVjdHNfdGV4dHVyZShjdHgpOworICAgX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19idWZmZXJfb2JqZWN0cyhjdHgpOwogCiAgICByZXR1cm4gR0xfVFJVRTsKIH0KQEAgLTEyNzQsMTcgKzEyOTUsMTggQEAKIHZvaWQKIF9tZXNhX2ZyZWVfY29udGV4dF9kYXRhKCBHTGNvbnRleHQgKmN0eCApCiB7Ci0gICAvKiBpZiB3ZSdyZSBkZXN0cm95aW5nIHRoZSBjdXJyZW50IGNvbnRleHQsIHVuYmluZCBpdCBmaXJzdCAqLwotICAgaWYgKGN0eCA9PSBfbWVzYV9nZXRfY3VycmVudF9jb250ZXh0KCkpIHsKLSAgICAgIF9tZXNhX21ha2VfY3VycmVudChOVUxMLCBOVUxMLCBOVUxMKTsKKyAgIGlmICghX21lc2FfZ2V0X2N1cnJlbnRfY29udGV4dCgpKXsKKyAgICAgIC8qIE5vIGN1cnJlbnQgY29udGV4dCwgYnV0IHdlIG1heSBuZWVkIG9uZSBpbiBvcmRlciB0byBkZWxldGUKKyAgICAgICAqIHRleHR1cmUgb2JqcywgZXRjLiAgU28gdGVtcG9yYXJpbHkgYmluZCB0aGUgY29udGV4dCBub3cuCisgICAgICAgKi8KKyAgICAgIF9tZXNhX21ha2VfY3VycmVudChjdHgsIE5VTEwsIE5VTEwpOwogICAgfQotICAgZWxzZSB7Ci0gICAgICAvKiB1bnJlZmVyZW5jZSBXaW5TeXNEcmF3L1JlYWQgYnVmZmVycyAqLwotICAgICAgX21lc2FfdW5yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+V2luU3lzRHJhd0J1ZmZlcik7Ci0gICAgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmY3R4LT5XaW5TeXNSZWFkQnVmZmVyKTsKLSAgICAgIF9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZjdHgtPkRyYXdCdWZmZXIpOwotICAgICAgX21lc2FfdW5yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+UmVhZEJ1ZmZlcik7Ci0gICB9CisKKyAgIC8qIHVucmVmZXJlbmNlIFdpblN5c0RyYXcvUmVhZCBidWZmZXJzICovCisgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmY3R4LT5XaW5TeXNEcmF3QnVmZmVyKTsKKyAgIF9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZjdHgtPldpblN5c1JlYWRCdWZmZXIpOworICAgX21lc2FfdW5yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+RHJhd0J1ZmZlcik7CisgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmY3R4LT5SZWFkQnVmZmVyKTsKIAogICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5DdXJyZW50LCBOVUxMKTsKICAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQsIE5VTEwpOwpAQCAtMTI5NCw2ICsxMzE2LDcgQEAKICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7CiAgICBfbWVzYV9yZWZlcmVuY2VfZnJhZ3Byb2coY3R4LCAmY3R4LT5GcmFnbWVudFByb2dyYW0uX1RleEVudlByb2dyYW0sIE5VTEwpOwogCisgICBfbWVzYV9mcmVlX2F0dHJpYl9kYXRhKGN0eCk7CiAgICBfbWVzYV9mcmVlX2xpZ2h0aW5nX2RhdGEoIGN0eCApOwogI2lmIEZFQVRVUkVfZXZhbHVhdG9ycwogICAgX21lc2FfZnJlZV9ldmFsX2RhdGEoIGN0eCApOwpAQCAtMTMzMSw2ICsxMzU0LDExIEBACiAKICAgIGlmIChjdHgtPkV4dGVuc2lvbnMuU3RyaW5nKQogICAgICAgX21lc2FfZnJlZSgodm9pZCAqKSBjdHgtPkV4dGVuc2lvbnMuU3RyaW5nKTsKKworICAgLyogdW5iaW5kIHRoZSBjb250ZXh0IGlmIGl0J3MgY3VycmVudGx5IGJvdW5kICovCisgICBpZiAoY3R4ID09IF9tZXNhX2dldF9jdXJyZW50X2NvbnRleHQoKSkgeworICAgICAgX21lc2FfbWFrZV9jdXJyZW50KE5VTEwsIE5VTEwsIE5VTEwpOworICAgfQogfQogCiAKQEAgLTE1NjIsOCArMTU5MCw2IEBACiBfbWVzYV9tYWtlX2N1cnJlbnQoIEdMY29udGV4dCAqbmV3Q3R4LCBHTGZyYW1lYnVmZmVyICpkcmF3QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICBHTGZyYW1lYnVmZmVyICpyZWFkQnVmZmVyICkKIHsKLSAgIEdFVF9DVVJSRU5UX0NPTlRFWFQob2xkQ3R4KTsKLQogICAgaWYgKE1FU0FfVkVSQk9TRSAmIFZFUkJPU0VfQVBJKQogICAgICAgX21lc2FfZGVidWcobmV3Q3R4LCAiX21lc2FfbWFrZV9jdXJyZW50KClcbiIpOwogCkBAIC0xNTg4LDEzICsxNjE0LDYgQEAKICAgIF9nbGFwaV9zZXRfY29udGV4dCgodm9pZCAqKSBuZXdDdHgpOwogICAgQVNTRVJUKF9tZXNhX2dldF9jdXJyZW50X2NvbnRleHQoKSA9PSBuZXdDdHgpOwogCi0gICBpZiAob2xkQ3R4KSB7Ci0gICAgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmb2xkQ3R4LT5XaW5TeXNEcmF3QnVmZmVyKTsKLSAgICAgIF9tZXNhX3VucmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZvbGRDdHgtPldpblN5c1JlYWRCdWZmZXIpOwotICAgICAgX21lc2FfdW5yZWZlcmVuY2VfZnJhbWVidWZmZXIoJm9sZEN0eC0+RHJhd0J1ZmZlcik7Ci0gICAgICBfbWVzYV91bnJlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmb2xkQ3R4LT5SZWFkQnVmZmVyKTsKLSAgIH0KLSAgICAgICAgIAogICAgaWYgKCFuZXdDdHgpIHsKICAgICAgIF9nbGFwaV9zZXRfZGlzcGF0Y2goTlVMTCk7ICAvKiBub25lIGN1cnJlbnQgKi8KICAgIH0KQEAgLTE2MTQsMTAgKzE2MzMsMTIgQEAKICAgICAgICAgICAqIG9yIG5vdCBib3VuZCB0byBhIHVzZXItY3JlYXRlZCBGQk8uCiAgICAgICAgICAgKi8KICAgICAgICAgIGlmICghbmV3Q3R4LT5EcmF3QnVmZmVyIHx8IG5ld0N0eC0+RHJhd0J1ZmZlci0+TmFtZSA9PSAwKSB7Ci0gICAgICAgICAvKiBmaXggdXAgdGhlIGZiIGZpZWxkcyAtIHRoZXNlIHdpbGwgZW5kIHVwIHdyb25nIG90aGVyd2lzZQotICAgICAgICAgICogaWYgdGhlIERSSWRyYXdhYmxlIGNoYW5nZXMsIGFuZCBldmVyeXRoaW5nIHJlbGllcyBvbiB0aGVtLgotICAgICAgICAgICogVGhpcyBpcyBhIGJpdCBtZXNzeSAoc2FtZSBhcyBuZWVkZWQgaW4gX21lc2FfQmluZEZyYW1lYnVmZmVyRVhUKQotCSAgKi8KKyAgICAgICAgICAgIC8qIEtXOiBtZXJnZSBjb25mbGljdCBoZXJlLCByZXZpc2l0LiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogZml4IHVwIHRoZSBmYiBmaWVsZHMgLSB0aGVzZSB3aWxsIGVuZCB1cCB3cm9uZyBvdGhlcndpc2UKKyAgICAgICAgICAgICAqIGlmIHRoZSBEUklkcmF3YWJsZSBjaGFuZ2VzLCBhbmQgZXZlcnl0aGluZyByZWxpZXMgb24gdGhlbS4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgYSBiaXQgbWVzc3kgKHNhbWUgYXMgbmVlZGVkIGluIF9tZXNhX0JpbmRGcmFtZWJ1ZmZlckVYVCkKKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgICAgICAgICBHTGVudW0gYnVmZmVyc1tNQVhfRFJBV19CVUZGRVJTXTsKIApAQCAtMTYzMSw5ICsxNjUyLDExIEBACiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIW5ld0N0eC0+UmVhZEJ1ZmZlciB8fCBuZXdDdHgtPlJlYWRCdWZmZXItPk5hbWUgPT0gMCkgewogICAgICAgICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZuZXdDdHgtPlJlYWRCdWZmZXIsIHJlYWRCdWZmZXIpOwotICAgICAgICAgICAgX21lc2FfcmVhZGJ1ZmZlcl91cGRhdGVfZmllbGRzKG5ld0N0eCwgbmV3Q3R4LT5QaXhlbC5SZWFkQnVmZmVyKTsKICAgICAgICAgIH0KIAorICAgICAgICAgLyogWFhYIG9ubHkgc2V0IHRoaXMgZmxhZyBpZiB3ZSdyZSByZWFsbHkgY2hhbmdpbmcgdGhlIGRyYXcvcmVhZAorICAgICAgICAgICogZnJhbWVidWZmZXIgYmluZGluZ3MuCisgICAgICAgICAgKi8KIAkgbmV3Q3R4LT5OZXdTdGF0ZSB8PSBfTkVXX0JVRkZFUlM7CiAKICNpZiAxCkBAIC0xNzAxLDEyICsxNzI0LDE4IEBACiBfbWVzYV9zaGFyZV9zdGF0ZShHTGNvbnRleHQgKmN0eCwgR0xjb250ZXh0ICpjdHhUb1NoYXJlKQogewogICAgaWYgKGN0eCAmJiBjdHhUb1NoYXJlICYmIGN0eC0+U2hhcmVkICYmIGN0eFRvU2hhcmUtPlNoYXJlZCkgewotICAgICAgY3R4LT5TaGFyZWQtPlJlZkNvdW50LS07Ci0gICAgICBpZiAoY3R4LT5TaGFyZWQtPlJlZkNvdW50ID09IDApIHsKLSAgICAgICAgIGZyZWVfc2hhcmVkX3N0YXRlKGN0eCwgY3R4LT5TaGFyZWQpOwotICAgICAgfQorICAgICAgc3RydWN0IGdsX3NoYXJlZF9zdGF0ZSAqb2xkU2hhcmVkU3RhdGUgPSBjdHgtPlNoYXJlZDsKKwogICAgICAgY3R4LT5TaGFyZWQgPSBjdHhUb1NoYXJlLT5TaGFyZWQ7CiAgICAgICBjdHgtPlNoYXJlZC0+UmVmQ291bnQrKzsKKworICAgICAgdXBkYXRlX2RlZmF1bHRfb2JqZWN0cyhjdHgpOworCisgICAgICBvbGRTaGFyZWRTdGF0ZS0+UmVmQ291bnQtLTsKKyAgICAgIGlmIChvbGRTaGFyZWRTdGF0ZS0+UmVmQ291bnQgPT0gMCkgeworICAgICAgICAgZnJlZV9zaGFyZWRfc3RhdGUoY3R4LCBvbGRTaGFyZWRTdGF0ZSk7CisgICAgICB9CisKICAgICAgIHJldHVybiBHTF9UUlVFOwogICAgfQogICAgZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2NvbnRleHQuaCBiL3NyYy9tZXNhL21haW4vY29udGV4dC5oCmluZGV4IDk0MjNiNjYuLjU0ZjFhZjkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL21haW4vY29udGV4dC5oCkBAIC0yNzUsMTAgKzI3NSwxMiBAQAogICAgKCgoQ1RYKS0+TGlnaHQuRW5hYmxlZCAmJgkJCQkJCVwKICAgICAgKENUWCktPkxpZ2h0Lk1vZGVsLkNvbG9yQ29udHJvbCA9PSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUikJXAogICAgIHx8IChDVFgpLT5Gb2cuQ29sb3JTdW1FbmFibGVkCQkJCQlcCi0gICAgfHwgKChDVFgpLT5WZXJ0ZXhQcm9ncmFtLl9FbmFibGVkICYmCQkJCVwKLSAgICAgICAgKChDVFgpLT5WZXJ0ZXhQcm9ncmFtLkN1cnJlbnQtPkJhc2UuSW5wdXRzUmVhZCAmIFZFUlRfQklUX0NPTE9SMSkpIFwKLSAgICB8fCAoKENUWCktPkZyYWdtZW50UHJvZ3JhbS5fRW5hYmxlZCAmJgkJCQlcCi0gICAgICAgICgoQ1RYKS0+RnJhZ21lbnRQcm9ncmFtLkN1cnJlbnQtPkJhc2UuSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDEpKSBcCisgICAgfHwgKChDVFgpLT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50ICYmCQkJCVwKKyAgICAgICAgKChDVFgpLT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50ICE9IChDVFgpLT5WZXJ0ZXhQcm9ncmFtLl9UbmxQcm9ncmFtKSAmJiAgICBcCisgICAgICAgICgoQ1RYKS0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudC0+QmFzZS5JbnB1dHNSZWFkICYgVkVSVF9CSVRfQ09MT1IxKSkgXAorICAgIHx8ICgoQ1RYKS0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50ICYmCQkJCVwKKyAgICAgICAgKChDVFgpLT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQgIT0gKENUWCktPkZyYWdtZW50UHJvZ3JhbS5fVGV4RW52UHJvZ3JhbSkgJiYgIFwKKyAgICAgICAgKChDVFgpLT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQtPkJhc2UuSW5wdXRzUmVhZCAmIEZSQUdfQklUX0NPTDEpKSBcCiAgICApCiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9kZC5oIGIvc3JjL21lc2EvbWFpbi9kZC5oCmluZGV4IDdmYjBhMjEuLmRkYjM4MDMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vZGQuaAorKysgYi9zcmMvbWVzYS9tYWluL2RkLmgKQEAgLTQ1Niw4ICs0NTYsOCBAQAogICAgICovCiAgICB2b2lkICgqR2V0Q29tcHJlc3NlZFRleEltYWdlKShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKmltZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKIAogICAgLyoqCiAgICAgKiBDYWxsZWQgdG8gcXVlcnkgbnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgbmVlZGVkIHRvIHN0b3JlIHRoZQpAQCAtNTA0LDYgKzUwNCwxMSBAQAogICAgICovCiAgICB2b2lkICgqRnJlZVRleEltYWdlRGF0YSkoIEdMY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdEltYWdlICk7CiAKKyAgIC8qKiBNYXAgdGV4dHVyZSBpbWFnZSBkYXRhIGludG8gdXNlciBzcGFjZSAqLworICAgdm9pZCAoKk1hcFRleHR1cmUpKCBHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0T2JqICk7CisgICAvKiogVW5tYXAgdGV4dHVyZSBpbWFnZXMgZnJvbSB1c2VyIHNwYWNlICovCisgICB2b2lkICgqVW5tYXBUZXh0dXJlKSggR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiApOworCiAgICAvKioKICAgICAqIE5vdGU6IG5vIGNvbnRleHQgYXJndW1lbnQuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaW5pdGlhbGx5IGxvb2sKICAgICAqIGxpa2UgaXQgYmVsb25ncyBoZXJlLCBleGNlcHQgdGhhdCB0aGUgZHJpdmVyIGlzIHRoZSBvbmx5IGVudGl0eQpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9kZXB0aHN0ZW5jaWwuYyBiL3NyYy9tZXNhL21haW4vZGVwdGhzdGVuY2lsLmMKaW5kZXggZDQ5OTBiYi4uZmI1NGQ2MSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9kZXB0aHN0ZW5jaWwuYworKysgYi9zcmMvbWVzYS9tYWluL2RlcHRoc3RlbmNpbC5jCkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlcywgY29uc3QgR0x1Ynl0ZSAqbWFzaykKIHsKICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKmRzcmIgPSB6MjRyYi0+V3JhcHBlZDsKLSAgIGNvbnN0IEdMdWJ5dGUgKnNyYyA9IChjb25zdCBHTHVieXRlICopIHZhbHVlczsKKyAgIGNvbnN0IEdMdWludCAqc3JjID0gKGNvbnN0IEdMdWludCAqKSB2YWx1ZXM7CiAgICBBU1NFUlQoejI0cmItPkRhdGFUeXBlID09IEdMX1VOU0lHTkVEX0lOVCk7CiAgICBBU1NFUlQoZHNyYi0+X0FjdHVhbEZvcm1hdCA9PSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCk7CiAgICBBU1NFUlQoZHNyYi0+RGF0YVR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzI0XzhfRVhUKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vZGVzY3JpcC5tbXMgYi9zcmMvbWVzYS9tYWluL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9tYWluL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsMjI4IEBACisjIE1ha2VmaWxlIGZvciBjb3JlIGxpYnJhcnkgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCByZXZpc2lvbiA6IDIgT2N0b2JlciAyMDA3CisKKy5maXJzdAorCWRlZmluZSBnbCBbLS0tLmluY2x1ZGUuZ2xdCisJZGVmaW5lIG1hdGggWy0ubWF0aF0KKwlkZWZpbmUgc2hhZGVyIFstLnNoYWRlcl0KKwlkZWZpbmUgZ2xhcGkgWy0uZ2xhcGldCisJZGVmaW5lIG1haW4gWy0ubWFpbl0KKworLmluY2x1ZGUgWy0tLV1tbXMtY29uZmlnLgorCisjIyMjIyBNQUNST1MgIyMjIyMKKworVlBBVEggPSBSQ1MKKworSU5DRElSID0gWy0tLS5pbmNsdWRlXSxbLS5nbGFwaV0sWy0uc2hhZGVyXQorTElCRElSID0gWy0tLS5saWJdCitDRkxBR1MgPSAvaW5jbHVkZT0oJChJTkNESVIpLFtdKS9kZWZpbmU9KFBUSFJFQURTPTEpL25hbWU9KGFzX2lzLHNob3J0KS9mbG9hdD1pZWVlL2llZWU9ZGVub3JtCisKK1NPVVJDRVMgPWFjY3VtLmMgXAorCWFwaV9hcnJheWVsdC5jIFwKKwlhcGlfbG9vcGJhY2suYyBcCisJYXBpX25vb3AuYyBcCisJYXBpX3ZhbGlkYXRlLmMgXAorIAlhdHRyaWIuYyBcCisJYXJyYXlvYmouYyBcCisJYmxlbmQuYyBcCisJYnVmZmVyb2JqLmMgXAorCWJ1ZmZlcnMuYyBcCisJY2xpcC5jIFwKKwljb2xvcnRhYi5jIFwKKwljb250ZXh0LmMgXAorCWNvbnZvbHZlLmMgXAorCWRlYnVnLmMgXAorCWRlcHRoLmMgXAorCWRlcHRoc3RlbmNpbC5jIFwKKwlkaXNwYXRjaC5jIFwKKwlkbGlzdC5jIFwKKwlkcmF3cGl4LmMgXAorCWVuYWJsZS5jIFwKKwllbnVtcy5jIFwKKwlldmFsLmMgXAorCWV4ZWNtZW0uYyBcCisJZXh0ZW5zaW9ucy5jIFwKKwlmYm9iamVjdC5jIFwKKwlmZWVkYmFjay5jIFwKKwlmb2cuYyBcCisJZnJhbWVidWZmZXIuYyBcCisJZ2V0LmMgXAorCWdldHN0cmluZy5jIFwKKwloYXNoLmMgXAorCWhpbnQuYyBcCisJaGlzdG9ncmFtLmMgXAorCWltYWdlLmMgXAorCWltcG9ydHMuYyBcCisJbGlnaHQuYyBcCisJbGluZXMuYyBcCisJbWF0cml4LmMgXAorCW1pcG1hcC5jIFwKKwltbS5jIFwKKwlwaXhlbC5jIFwKKwlwb2ludHMuYyBcCisJcG9seWdvbi5jIFwKKwlyYXN0cG9zLmMgXAorCXJiYWRhcHRvcnMuYyBcCisJcmVuZGVyYnVmZmVyLmMgXAorCXNoYWRlcnMuYyBcCisJc3RhdGUuYyBcCisJc3RlbmNpbC5jIFwKKwl0ZXhjb21wcmVzcy5jIFwKKwl0ZXhjb21wcmVzc19meHQxLmMgXAorCXRleGNvbXByZXNzX3MzdGMuYyBcCisJdGV4ZW52cHJvZ3JhbS5jIFwKKwl0ZXhmb3JtYXQuYyBcCisJdGV4aW1hZ2UuYyBcCisJdGV4b2JqLmMgXAorCXRleHJlbmRlci5jIFwKKwl0ZXhzdGF0ZS5jIFwKKwl0ZXhzdG9yZS5jIFwKKwl2YXJyYXkuYyBcCisJdnR4Zm10LmMgXAorCXF1ZXJ5b2JqLmMgXAorCXJiYWRhcHRvcnMuYworCitPQkpFQ1RTPWFjY3VtLm9iaixcCithcGlfYXJyYXllbHQub2JqLFwKK2FwaV9sb29wYmFjay5vYmosXAorYXBpX25vb3Aub2JqLFwKK2FwaV92YWxpZGF0ZS5vYmosXAorYXJyYXlvYmoub2JqLFwKK2F0dHJpYi5vYmosXAorYmxlbmQub2JqLFwKK2J1ZmZlcm9iai5vYmosXAorYnVmZmVycy5vYmosXAorY2xpcC5vYmosXAorY29sb3J0YWIub2JqLFwKK2NvbnRleHQub2JqLFwKK2NvbnZvbHZlLm9iaixcCitkZWJ1Zy5vYmosXAorZGVwdGgub2JqLFwKK2RlcHRoc3RlbmNpbC5vYmosXAorZGlzcGF0Y2gub2JqLFwKK2RsaXN0Lm9iaixcCitkcmF3cGl4Lm9iaixcCitlbmFibGUub2JqLFwKK2VudW1zLm9iaixcCitldmFsLm9iaixcCitleGVjbWVtLm9iaixcCitleHRlbnNpb25zLm9iaixcCitmYm9iamVjdC5vYmosXAorZmVlZGJhY2sub2JqLFwKK2ZvZy5vYmosXAorZnJhbWVidWZmZXIub2JqLFwKK2dldC5vYmosXAorZ2V0c3RyaW5nLm9iaixcCitoYXNoLm9iaixcCitoaW50Lm9iaixcCitoaXN0b2dyYW0ub2JqLFwKK2ltYWdlLm9iaixcCitpbXBvcnRzLm9iaixcCitsaWdodC5vYmosXAorbGluZXMub2JqLFwKK21hdHJpeC5vYmosXAorbWlwbWFwLm9iaixcCittbS5vYmosXAorcGl4ZWwub2JqLFwKK3BvaW50cy5vYmosXAorcG9seWdvbi5vYmosXAorcmFzdHBvcy5vYmosXAorcmVuZGVyYnVmZmVyLm9iaixcCitzaGFkZXJzLm9iaixcCitzdGF0ZS5vYmosXAorc3RlbmNpbC5vYmosXAordGV4Y29tcHJlc3Mub2JqLFwKK3RleGNvbXByZXNzX2Z4dDEub2JqLFwKK3RleGNvbXByZXNzX3MzdGMub2JqLFwKK3RleGVudnByb2dyYW0ub2JqLFwKK3RleGZvcm1hdC5vYmosXAordGV4aW1hZ2Uub2JqLFwKK3RleG9iai5vYmosXAordGV4cmVuZGVyLm9iaixcCit0ZXhzdGF0ZS5vYmosXAordGV4c3RvcmUub2JqLFwKK3ZhcnJheS5vYmosXAordnR4Zm10Lm9iaixcCitxdWVyeW9iai5vYmosXAorcmJhZGFwdG9ycy5vYmoKKworIyMjIyMgUlVMRVMgIyMjIyMKKworVkVSU0lPTj1NZXNhIFYzLjQKKworIyMjIyMgVEFSR0VUUyAjIyMjIworIyBNYWtlIHRoZSBsaWJyYXJ5CiskKExJQkRJUikkKEdMX0xJQikgOiAkKE9CSkVDVFMpCisgIEAgJChNQUtFTElCKSAkKExJQkRJUikkKEdMX0xJQikgJChPQkpFQ1RTKQorCitjbGVhbiA6CisJcHVyZ2UKKwlkZWxldGUgKi5vYmo7KgorCithY2N1bS5vYmogOiBhY2N1bS5jCithcGlfYXJyYXllbHQub2JqIDogYXBpX2FycmF5ZWx0LmMKK2FwaV9sb29wYmFjay5vYmogOiBhcGlfbG9vcGJhY2suYworYXBpX25vb3Aub2JqIDogYXBpX25vb3AuYworYXBpX3ZhbGlkYXRlLm9iaiA6IGFwaV92YWxpZGF0ZS5jCithcnJheW9iai5vYmogOiBhcnJheW9iai5jCithdHRyaWIub2JqIDogYXR0cmliLmMKK2JsZW5kLm9iaiA6IGJsZW5kLmMKK2J1ZmZlcm9iai5vYmogOiBidWZmZXJvYmouYworYnVmZmVycy5vYmogOiBidWZmZXJzLmMKK2NsaXAub2JqIDogY2xpcC5jCitjb2xvcnRhYi5vYmogOiBjb2xvcnRhYi5jCitjb250ZXh0Lm9iaiA6IGNvbnRleHQuYworY29udm9sdmUub2JqIDogY29udm9sdmUuYworZGVidWcub2JqIDogZGVidWcuYworZGVwdGgub2JqIDogZGVwdGguYworZGVwdGhzdGVuY2lsLm9iaiA6IGRlcHRoc3RlbmNpbC5jCitkaXNwYXRjaC5vYmogOiBkaXNwYXRjaC5jCitkbGlzdC5vYmogOiBkbGlzdC5jCitkcmF3cGl4Lm9iaiA6IGRyYXdwaXguYworZW5hYmxlLm9iaiA6IGVuYWJsZS5jCitlbnVtcy5vYmogOiBlbnVtcy5jCitldmFsLm9iaiA6IGV2YWwuYworZXhlY21lbS5vYmogOiBleGVjbWVtLmMKK2V4dGVuc2lvbnMub2JqIDogZXh0ZW5zaW9ucy5jCitmYm9iamVjdC5vYmogOiBmYm9iamVjdC5jCitmZWVkYmFjay5vYmogOiBmZWVkYmFjay5jCitmb2cub2JqIDogZm9nLmMKK2ZyYW1lYnVmZmVyLm9iaiA6IGZyYW1lYnVmZmVyLmMKK2dldC5vYmogOiBnZXQuYworZ2V0c3RyaW5nLm9iaiA6IGdldHN0cmluZy5jCitoYXNoLm9iaiA6IGhhc2guYworaGludC5vYmogOiBoaW50LmMKK2hpc3RvZ3JhbS5vYmogOiBoaXN0b2dyYW0uYworaW1hZ2Uub2JqIDogaW1hZ2UuYworaW1wb3J0cy5vYmogOiBpbXBvcnRzLmMgdnNucHJpbnRmLmMKK2xpZ2h0Lm9iaiA6IGxpZ2h0LmMKK2xpbmVzLm9iaiA6IGxpbmVzLmMKK21hdHJpeC5vYmogOiBtYXRyaXguYworbWlwbWFwLm9iaiA6IG1pcG1hcC5jCittbS5vYmogOiBtbS5jCitwaXhlbC5vYmogOiBwaXhlbC5jCitwb2ludHMub2JqIDogcG9pbnRzLmMKK3BvbHlnb24ub2JqIDogcG9seWdvbi5jCityYXN0cG9zLm9iaiA6IHJhc3Rwb3MuYworcmJhZGFwdG9ycy5vYmogOiByYmFkYXB0b3JzLmMKK3JlbmRlcmJ1ZmZlci5vYmogOiByZW5kZXJidWZmZXIuYworc3RhdGUub2JqIDogc3RhdGUuYworc3RlbmNpbC5vYmogOiBzdGVuY2lsLmMKK3RleGNvbXByZXNzLm9iaiA6IHRleGNvbXByZXNzLmMKK3RleGNvbXByZXNzX2Z4dDEub2JqIDogdGV4Y29tcHJlc3NfZnh0MS5jCisJY2MkKENGTEFHUykvd2Fybj0oZGlzYWJsZT1TSElGVENPVU5UKSB0ZXhjb21wcmVzc19meHQxLmMKK3RleGNvbXByZXNzX3MzdGMub2JqIDogdGV4Y29tcHJlc3NfczN0Yy5jCit0ZXhlbnZwcm9ncmFtLm9iaiA6IHRleGVudnByb2dyYW0uYwordGV4Zm9ybWF0Lm9iaiA6IHRleGZvcm1hdC5jCit0ZXhpbWFnZS5vYmogOiB0ZXhpbWFnZS5jCit0ZXhvYmoub2JqIDogdGV4b2JqLmMKK3RleHJlbmRlci5vYmogOiB0ZXhyZW5kZXIuYwordGV4c3RhdGUub2JqIDogdGV4c3RhdGUuYwordGV4c3RvcmUub2JqIDogdGV4c3RvcmUuYwordmFycmF5Lm9iaiA6IHZhcnJheS5jCit2dHhmbXQub2JqIDogdnR4Zm10LmMKK3NoYWRlcnMub2JqIDogc2hhZGVycy5jCitxdWVyeW9iai5vYmogOiBxdWVyeW9iai5jCityYmFkYXB0b3JzLm9iaiA6IHJiYWRhcHRvcnMuYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9kbGlzdC5jIGIvc3JjL21lc2EvbWFpbi9kbGlzdC5jCmluZGV4IGI0ZWQzMDAuLmNhZmU4MDcgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vZGxpc3QuYworKysgYi9zcmMvbWVzYS9tYWluL2RsaXN0LmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4xCisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtNjEyLDkgKzYxMiw5IEBACiAKIAogLyoKLSAqIFRyYW5zbGF0ZSB0aGUgbnRoIGVsZW1lbnQgb2YgbGlzdCBmcm9tIHR5cGUgdG8gR0x1aW50LgorICogVHJhbnNsYXRlIHRoZSBudGggZWxlbWVudCBvZiBsaXN0IGZyb20gPHR5cGU+IHRvIEdMaW50LgogICovCi1zdGF0aWMgR0x1aW50CitzdGF0aWMgR0xpbnQKIHRyYW5zbGF0ZV9pZChHTHNpemVpIG4sIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKiBsaXN0KQogewogICAgR0xieXRlICpicHRyOwpAQCAtNjI4LDM3ICs2MjgsNDAgQEAKICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBHTF9CWVRFOgogICAgICAgYnB0ciA9IChHTGJ5dGUgKikgbGlzdDsKLSAgICAgIHJldHVybiAoR0x1aW50KSAqKGJwdHIgKyBuKTsKKyAgICAgIHJldHVybiAoR0xpbnQpIGJwdHJbbl07CiAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CiAgICAgICB1YnB0ciA9IChHTHVieXRlICopIGxpc3Q7Ci0gICAgICByZXR1cm4gKEdMdWludCkgKih1YnB0ciArIG4pOworICAgICAgcmV0dXJuIChHTGludCkgdWJwdHJbbl07CiAgICBjYXNlIEdMX1NIT1JUOgogICAgICAgc3B0ciA9IChHTHNob3J0ICopIGxpc3Q7Ci0gICAgICByZXR1cm4gKEdMdWludCkgKihzcHRyICsgbik7CisgICAgICByZXR1cm4gKEdMaW50KSBzcHRyW25dOwogICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKICAgICAgIHVzcHRyID0gKEdMdXNob3J0ICopIGxpc3Q7Ci0gICAgICByZXR1cm4gKEdMdWludCkgKih1c3B0ciArIG4pOworICAgICAgcmV0dXJuIChHTGludCkgdXNwdHJbbl07CiAgICBjYXNlIEdMX0lOVDoKICAgICAgIGlwdHIgPSAoR0xpbnQgKikgbGlzdDsKLSAgICAgIHJldHVybiAoR0x1aW50KSAqKGlwdHIgKyBuKTsKKyAgICAgIHJldHVybiBpcHRyW25dOwogICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6CiAgICAgICB1aXB0ciA9IChHTHVpbnQgKikgbGlzdDsKLSAgICAgIHJldHVybiAoR0x1aW50KSAqKHVpcHRyICsgbik7CisgICAgICByZXR1cm4gKEdMaW50KSB1aXB0cltuXTsKICAgIGNhc2UgR0xfRkxPQVQ6CiAgICAgICBmcHRyID0gKEdMZmxvYXQgKikgbGlzdDsKLSAgICAgIHJldHVybiAoR0x1aW50KSAqKGZwdHIgKyBuKTsKKyAgICAgIHJldHVybiAoR0xpbnQpIEZMT09SRihmcHRyW25dKTsKICAgIGNhc2UgR0xfMl9CWVRFUzoKICAgICAgIHVicHRyID0gKChHTHVieXRlICopIGxpc3QpICsgMiAqIG47Ci0gICAgICByZXR1cm4gKEdMdWludCkgKnVicHRyICogMjU2ICsgKEdMdWludCkgKiAodWJwdHIgKyAxKTsKKyAgICAgIHJldHVybiAoR0xpbnQpIHVicHRyWzBdICogMjU2CisgICAgICAgICAgICsgKEdMaW50KSB1YnB0clsxXTsKICAgIGNhc2UgR0xfM19CWVRFUzoKICAgICAgIHVicHRyID0gKChHTHVieXRlICopIGxpc3QpICsgMyAqIG47Ci0gICAgICByZXR1cm4gKEdMdWludCkgKiB1YnB0ciAqIDY1NTM2Ci0gICAgICAgICAgICsgKEdMdWludCkgKih1YnB0ciArIDEpICogMjU2ICsgKEdMdWludCkgKiAodWJwdHIgKyAyKTsKKyAgICAgIHJldHVybiAoR0xpbnQpIHVicHRyWzBdICogNjU1MzYKKyAgICAgICAgICAgKyAoR0xpbnQpIHVicHRyWzFdICogMjU2CisgICAgICAgICAgICsgKEdMaW50KSB1YnB0clsyXTsKICAgIGNhc2UgR0xfNF9CWVRFUzoKICAgICAgIHVicHRyID0gKChHTHVieXRlICopIGxpc3QpICsgNCAqIG47Ci0gICAgICByZXR1cm4gKEdMdWludCkgKnVicHRyICogMTY3NzcyMTYKLSAgICAgICAgICAgKyAoR0x1aW50KSAqKHVicHRyICsgMSkgKiA2NTUzNgotICAgICAgICAgICArIChHTHVpbnQpICoodWJwdHIgKyAyKSAqIDI1NiArIChHTHVpbnQpICogKHVicHRyICsgMyk7CisgICAgICByZXR1cm4gKEdMaW50KSB1YnB0clswXSAqIDE2Nzc3MjE2CisgICAgICAgICAgICsgKEdMaW50KSB1YnB0clsxXSAqIDY1NTM2CisgICAgICAgICAgICsgKEdMaW50KSB1YnB0clsyXSAqIDI1NgorICAgICAgICAgICArIChHTGludCkgdWJwdHJbM107CiAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIDA7CiAgICB9CkBAIC0xMDAwLDEwICsxMDAzLDEwIEBACiAgICB9CiAKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgIEdMdWludCBsaXN0ID0gdHJhbnNsYXRlX2lkKGksIHR5cGUsIGxpc3RzKTsKKyAgICAgIEdMaW50IGxpc3QgPSB0cmFuc2xhdGVfaWQoaSwgdHlwZSwgbGlzdHMpOwogICAgICAgTm9kZSAqbiA9IEFMTE9DX0lOU1RSVUNUSU9OKGN0eCwgT1BDT0RFX0NBTExfTElTVF9PRkZTRVQsIDIpOwogICAgICAgaWYgKG4pIHsKLSAgICAgICAgIG5bMV0udWkgPSBsaXN0OworICAgICAgICAgblsxXS5pID0gbGlzdDsKICAgICAgICAgIG5bMl0uYiA9IHR5cGVFcnJvckZsYWc7CiAgICAgICB9CiAgICB9CkBAIC0yNzIzLDIxICsyNzI2LDIwIEBACiB9CiAKIAotLyoKLSAqIFBvbHlnb24gc3RpcHBsZSBtdXN0IGhhdmUgYmVlbiB1cGFja2VkIGFscmVhZHkhCi0gKi8KIHN0YXRpYyB2b2lkIEdMQVBJRU5UUlkKIHNhdmVfUG9seWdvblN0aXBwbGUoY29uc3QgR0x1Ynl0ZSAqIHBhdHRlcm4pCiB7CiAgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CisgICBHTHZvaWQgKmltYWdlID0gdW5wYWNrX2ltYWdlKDIsIDMyLCAzMiwgMSwgR0xfQ09MT1JfSU5ERVgsIEdMX0JJVE1BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgJmN0eC0+VW5wYWNrKTsKICAgIE5vZGUgKm47CiAgICBBU1NFUlRfT1VUU0lERV9TQVZFX0JFR0lOX0VORF9BTkRfRkxVU0goY3R4KTsKICAgIG4gPSBBTExPQ19JTlNUUlVDVElPTihjdHgsIE9QQ09ERV9QT0xZR09OX1NUSVBQTEUsIDEpOwogICAgaWYgKG4pIHsKLSAgICAgIHZvaWQgKmRhdGE7Ci0gICAgICBuWzFdLmRhdGEgPSBfbWVzYV9tYWxsb2MoMzIgKiA0KTsKLSAgICAgIGRhdGEgPSBuWzFdLmRhdGE7ICAgICAgICAgLyogVGhpcyBuZWVkZWQgZm9yIEFjb3JuIGNvbXBpbGVyICovCi0gICAgICBNRU1DUFkoZGF0YSwgcGF0dGVybiwgMzIgKiA0KTsKKyAgICAgIG5bMV0uZGF0YSA9IGltYWdlOyAKKyAgIH0KKyAgIGVsc2UgaWYgKGltYWdlKSB7CisgICAgICBfbWVzYV9mcmVlKGltYWdlKTsKICAgIH0KICAgIGlmIChjdHgtPkV4ZWN1dGVGbGFnKSB7CiAgICAgICBDQUxMX1BvbHlnb25TdGlwcGxlKGN0eC0+RXhlYywgKChHTHVieXRlICopIHBhdHRlcm4pKTsKQEAgLTMyNTQsNiArMzI1NiwzNiBAQAogCiAKIHN0YXRpYyB2b2lkIEdMQVBJRU5UUlkKK3NhdmVfU3RlbmNpbEZ1bmNTZXBhcmF0ZUFUSShHTGVudW0gZnJvbnRmdW5jLCBHTGVudW0gYmFja2Z1bmMsIEdMaW50IHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbWFzaykKK3sKKyAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKyAgIE5vZGUgKm47CisgICBBU1NFUlRfT1VUU0lERV9TQVZFX0JFR0lOX0VORF9BTkRfRkxVU0goY3R4KTsKKyAgIC8qIEdMX0ZST05UICovCisgICBuID0gQUxMT0NfSU5TVFJVQ1RJT04oY3R4LCBPUENPREVfU1RFTkNJTF9GVU5DX1NFUEFSQVRFLCA0KTsKKyAgIGlmIChuKSB7CisgICAgICBuWzFdLmUgPSBHTF9GUk9OVDsKKyAgICAgIG5bMl0uZSA9IGZyb250ZnVuYzsKKyAgICAgIG5bM10uaSA9IHJlZjsKKyAgICAgIG5bNF0udWkgPSBtYXNrOworICAgfQorICAgLyogR0xfQkFDSyAqLworICAgbiA9IEFMTE9DX0lOU1RSVUNUSU9OKGN0eCwgT1BDT0RFX1NURU5DSUxfRlVOQ19TRVBBUkFURSwgNCk7CisgICBpZiAobikgeworICAgICAgblsxXS5lID0gR0xfQkFDSzsKKyAgICAgIG5bMl0uZSA9IGJhY2tmdW5jOworICAgICAgblszXS5pID0gcmVmOworICAgICAgbls0XS51aSA9IG1hc2s7CisgICB9CisgICBpZiAoY3R4LT5FeGVjdXRlRmxhZykgeworICAgICAgQ0FMTF9TdGVuY2lsRnVuY1NlcGFyYXRlKGN0eC0+RXhlYywgKEdMX0ZST05ULCBmcm9udGZ1bmMsIHJlZiwgbWFzaykpOworICAgICAgQ0FMTF9TdGVuY2lsRnVuY1NlcGFyYXRlKGN0eC0+RXhlYywgKEdMX0JBQ0ssIGJhY2tmdW5jLCByZWYsIG1hc2spKTsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZCBHTEFQSUVOVFJZCiBzYXZlX1N0ZW5jaWxNYXNrU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQogewogICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOwpAQCAtNTU4Nyw2ICs1NjE5LDI3IEBACiB9CiAKIAorLyogR0xfQVJCX3NoYWRlcl9vYmplY3RzLCBHTF9BUkJfdmVydGV4L2ZyYWdtZW50X3NoYWRlciAqLworCitzdGF0aWMgdm9pZCBHTEFQSUVOVFJZCitleGVjX0JpbmRBdHRyaWJMb2NhdGlvbkFSQihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIgKm5hbWUpCit7CisgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CisgICBGTFVTSF9WRVJUSUNFUyhjdHgsIDApOworICAgQ0FMTF9CaW5kQXR0cmliTG9jYXRpb25BUkIoY3R4LT5FeGVjLCAocHJvZ3JhbSwgaW5kZXgsIG5hbWUpKTsKK30KKworc3RhdGljIEdMaW50IEdMQVBJRU5UUlkKK2V4ZWNfR2V0QXR0cmliTG9jYXRpb25BUkIoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSkKK3sKKyAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKyAgIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgMCk7CisgICByZXR1cm4gQ0FMTF9HZXRBdHRyaWJMb2NhdGlvbkFSQihjdHgtPkV4ZWMsIChwcm9ncmFtLCBuYW1lKSk7Cit9CisvKiBYWFggbW9yZSBzaGFkZXIgZnVuY3Rpb25zIG5lZWRlZCBoZXJlICovCisKKworCiAjaWYgRkVBVFVSRV9FWFRfZnJhbWVidWZmZXJfYmxpdAogc3RhdGljIHZvaWQgR0xBUElFTlRSWQogc2F2ZV9CbGl0RnJhbWVidWZmZXJFWFQoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsCkBAIC01Njk1LDcgKzU3NDgsNyBAQAogICAgaWYgKCFkbGlzdCkKICAgICAgIHJldHVybjsKIAotICAgY3R4LT5MaXN0U3RhdGUuQ2FsbFN0YWNrW2N0eC0+TGlzdFN0YXRlLkNhbGxEZXB0aCsrXSA9IGRsaXN0OworICAgY3R4LT5MaXN0U3RhdGUuQ2FsbERlcHRoKys7CiAKICAgIGlmIChjdHgtPkRyaXZlci5CZWdpbkNhbGxMaXN0KQogICAgICAgY3R4LT5Ecml2ZXIuQmVnaW5DYWxsTGlzdChjdHgsIGRsaXN0KTsKQEAgLTU3NjIsNyArNTgxNSw4IEBACiAgICAgICAgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRU5VTSwgImdsQ2FsbExpc3RzKHR5cGUpIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChjdHgtPkxpc3RTdGF0ZS5DYWxsRGVwdGggPCBNQVhfTElTVF9ORVNUSU5HKSB7Ci0gICAgICAgICAgICAgICBleGVjdXRlX2xpc3QoY3R4LCBjdHgtPkxpc3QuTGlzdEJhc2UgKyBuWzFdLnVpKTsKKyAgICAgICAgICAgICAgIEdMdWludCBsaXN0ID0gKEdMdWludCkgKGN0eC0+TGlzdC5MaXN0QmFzZSArIG5bMV0uaSk7CisgICAgICAgICAgICAgICBleGVjdXRlX2xpc3QoY3R4LCBsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUENPREVfQ0xFQVI6CkBAIC02MTI2LDcgKzYxODAsMTIgQEAKICAgICAgICAgICAgIENBTExfUG9seWdvbk1vZGUoY3R4LT5FeGVjLCAoblsxXS5lLCBuWzJdLmUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUENPREVfUE9MWUdPTl9TVElQUExFOgotICAgICAgICAgICAgQ0FMTF9Qb2x5Z29uU3RpcHBsZShjdHgtPkV4ZWMsICgoR0x1Ynl0ZSAqKSBuWzFdLmRhdGEpKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiBzYXZlID0gY3R4LT5VbnBhY2s7CisgICAgICAgICAgICAgICBjdHgtPlVucGFjayA9IGN0eC0+RGVmYXVsdFBhY2tpbmc7CisgICAgICAgICAgICAgICBDQUxMX1BvbHlnb25TdGlwcGxlKGN0eC0+RXhlYywgKChHTHVieXRlICopIG5bMV0uZGF0YSkpOworICAgICAgICAgICAgICAgY3R4LT5VbnBhY2sgPSBzYXZlOyAgICAgIC8qIHJlc3RvcmUgKi8KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUENPREVfUE9MWUdPTl9PRkZTRVQ6CiAgICAgICAgICAgICBDQUxMX1BvbHlnb25PZmZzZXQoY3R4LT5FeGVjLCAoblsxXS5mLCBuWzJdLmYpKTsKQEAgLTY1NzcsNyArNjYzNiw3IEBACiAgICBpZiAoY3R4LT5Ecml2ZXIuRW5kQ2FsbExpc3QpCiAgICAgICBjdHgtPkRyaXZlci5FbmRDYWxsTGlzdChjdHgpOwogCi0gICBjdHgtPkxpc3RTdGF0ZS5DYWxsU3RhY2tbY3R4LT5MaXN0U3RhdGUuQ2FsbERlcHRoLS1dID0gTlVMTDsKKyAgIGN0eC0+TGlzdFN0YXRlLkNhbGxEZXB0aC0tOwogfQogCiAKQEAgLTY4MDUsNyArNjg2NCw2IEBACiBfbWVzYV9DYWxsTGlzdHMoR0xzaXplaSBuLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICogbGlzdHMpCiB7CiAgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7Ci0gICBHTHVpbnQgbGlzdDsKICAgIEdMaW50IGk7CiAgICBHTGJvb2xlYW4gc2F2ZV9jb21waWxlX2ZsYWc7CiAKQEAgLTY4MzcsOCArNjg5NSw4IEBACiAgICBjdHgtPkNvbXBpbGVGbGFnID0gR0xfRkFMU0U7CiAKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgIGxpc3QgPSB0cmFuc2xhdGVfaWQoaSwgdHlwZSwgbGlzdHMpOwotICAgICAgZXhlY3V0ZV9saXN0KGN0eCwgY3R4LT5MaXN0Lkxpc3RCYXNlICsgbGlzdCk7CisgICAgICBHTHVpbnQgbGlzdCA9IChHTHVpbnQpIChjdHgtPkxpc3QuTGlzdEJhc2UgKyB0cmFuc2xhdGVfaWQoaSwgdHlwZSwgbGlzdHMpKTsKKyAgICAgIGV4ZWN1dGVfbGlzdChjdHgsIGxpc3QpOwogICAgfQogCiAgICBjdHgtPkNvbXBpbGVGbGFnID0gc2F2ZV9jb21waWxlX2ZsYWc7CkBAIC03ODE4LDYgKzc4NzYsOSBAQAogICAgU0VUX1N0ZW5jaWxNYXNrU2VwYXJhdGUodGFibGUsIHNhdmVfU3RlbmNpbE1hc2tTZXBhcmF0ZSk7CiAgICBTRVRfU3RlbmNpbE9wU2VwYXJhdGUodGFibGUsIHNhdmVfU3RlbmNpbE9wU2VwYXJhdGUpOwogCisgICAvKiBBVElfc2VwYXJhdGVfc3RlbmNpbCAqLyAKKyAgIFNFVF9TdGVuY2lsRnVuY1NlcGFyYXRlQVRJKHRhYmxlLCBzYXZlX1N0ZW5jaWxGdW5jU2VwYXJhdGVBVEkpOworCiAgICAvKiBHTF9BUkJfaW1hZ2luZyAqLwogICAgLyogTm90IGFsbCBhcmUgc3VwcG9ydGVkICovCiAgICBTRVRfQmxlbmRDb2xvcih0YWJsZSwgc2F2ZV9CbGVuZENvbG9yKTsKQEAgLTgxMTUsNiArODE3NiwxMSBAQAogICAgU0VUX0JsaXRGcmFtZWJ1ZmZlckVYVCh0YWJsZSwgc2F2ZV9CbGl0RnJhbWVidWZmZXJFWFQpOwogI2VuZGlmCiAKKyAgIC8qIEFSQiAzMC8zMS8zMi4gR0xfQVJCX3NoYWRlcl9vYmplY3RzLCBHTF9BUkJfdmVydGV4L2ZyYWdtZW50X3NoYWRlciAqLworICAgU0VUX0JpbmRBdHRyaWJMb2NhdGlvbkFSQih0YWJsZSwgZXhlY19CaW5kQXR0cmliTG9jYXRpb25BUkIpOworICAgU0VUX0dldEF0dHJpYkxvY2F0aW9uQVJCKHRhYmxlLCBleGVjX0dldEF0dHJpYkxvY2F0aW9uQVJCKTsKKyAgIC8qIFhYWCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGhlcmUhICovCisKICAgIC8qIDI5OS4gR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCiAgICBTRVRfQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUKHRhYmxlLCBzYXZlX0JsZW5kRXF1YXRpb25TZXBhcmF0ZUVYVCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vZHJhd3BpeC5jIGIvc3JjL21lc2EvbWFpbi9kcmF3cGl4LmMKaW5kZXggNmRiMTk4ZS4uMTNjZmEwZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9kcmF3cGl4LmMKKysrIGIvc3JjL21lc2EvbWFpbi9kcmF3cGl4LmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCiAgICBpZiAoY3R4LT5SZW5kZXJNb2RlID09IEdMX1JFTkRFUikgewogICAgICAgLyogVHJ1bmNhdGUsIHRvIHNhdGlzZnkgY29uZm9ybWFuY2UgdGVzdHMgKG1hdGNoZXMgU0dJJ3MgT3BlbkdMKS4gKi8KLSAgICAgIGNvbnN0IEdMZmxvYXQgZXBzaWxvbiA9IChjb25zdCBHTGZsb2F0KTAuMDAwMTsKKyAgICAgIGNvbnN0IEdMZmxvYXQgZXBzaWxvbiA9IDAuMDAwMUY7CiAgICAgICBHTGludCB4ID0gSUZMT09SKGN0eC0+Q3VycmVudC5SYXN0ZXJQb3NbMF0gKyBlcHNpbG9uIC0geG9yaWcpOwogICAgICAgR0xpbnQgeSA9IElGTE9PUihjdHgtPkN1cnJlbnQuUmFzdGVyUG9zWzFdICsgZXBzaWxvbiAtIHlvcmlnKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9lbmFibGUuYyBiL3NyYy9tZXNhL21haW4vZW5hYmxlLmMKaW5kZXggOWRjNTVkNC4uMjQ4ZGYxYiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9lbmFibGUuYworKysgYi9zcmMvbWVzYS9tYWluL2VuYWJsZS5jCkBAIC01LDkgKzUsOSBAQAogCiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4xCisgKiBWZXJzaW9uOiAgNy4wLjMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSAiZW51bXMuaCIKICNpbmNsdWRlICJtYXRoL21fbWF0cml4LmgiCiAjaW5jbHVkZSAibWF0aC9tX3hmb3JtLmgiCisjaW5jbHVkZSAiYXBpX2FycmF5ZWx0LmgiCiAKIAogCkBAIC0xMzYsNiArMTM3LDkgQEAKIAogICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0FSUkFZKTsKICAgIGN0eC0+QXJyYXkuTmV3U3RhdGUgfD0gZmxhZzsKKworICAgX2FlX2ludmFsaWRhdGVfc3RhdGUoY3R4LCBfTkVXX0FSUkFZKTsKKwogICAgKnZhciA9IHN0YXRlOwogCiAgICBpZiAoc3RhdGUpCkBAIC0zNzMsMTggKzM3NywyNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0xJR0hUKTsKICAgICAgICAgIGN0eC0+TGlnaHQuRW5hYmxlZCA9IHN0YXRlOworICAgICAgICAgaWYgKGN0eC0+TGlnaHQuRW5hYmxlZCAmJiBjdHgtPkxpZ2h0Lk1vZGVsLlR3b1NpZGUpCisgICAgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgfD0gRERfVFJJX0xJR0hUX1RXT1NJREU7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgJj0gfkREX1RSSV9MSUdIVF9UV09TSURFOwogICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX0xJTkVfU01PT1RIOgogICAgICAgICAgaWYgKGN0eC0+TGluZS5TbW9vdGhGbGFnID09IHN0YXRlKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0xJTkUpOwogICAgICAgICAgY3R4LT5MaW5lLlNtb290aEZsYWcgPSBzdGF0ZTsKKyAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyBePSBERF9MSU5FX1NNT09USDsKICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBHTF9MSU5FX1NUSVBQTEU6CiAgICAgICAgICBpZiAoY3R4LT5MaW5lLlN0aXBwbGVGbGFnID09IHN0YXRlKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0xJTkUpOwogICAgICAgICAgY3R4LT5MaW5lLlN0aXBwbGVGbGFnID0gc3RhdGU7CisgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgXj0gRERfTElORV9TVElQUExFOwogICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX0lOREVYX0xPR0lDX09QOgogICAgICAgICAgaWYgKGN0eC0+Q29sb3IuSW5kZXhMb2dpY09wRW5hYmxlZCA9PSBzdGF0ZSkKQEAgLTUyMywxOCArNTMzLDIxIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBGTFVTSF9WRVJUSUNFUyhjdHgsIF9ORVdfUE9JTlQpOwogICAgICAgICAgY3R4LT5Qb2ludC5TbW9vdGhGbGFnID0gc3RhdGU7CisgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgXj0gRERfUE9JTlRfU01PT1RIOwogICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX1BPTFlHT05fU01PT1RIOgogICAgICAgICAgaWYgKGN0eC0+UG9seWdvbi5TbW9vdGhGbGFnID09IHN0YXRlKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX1BPTFlHT04pOwogICAgICAgICAgY3R4LT5Qb2x5Z29uLlNtb290aEZsYWcgPSBzdGF0ZTsKKyAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyBePSBERF9UUklfU01PT1RIOwogICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX1BPTFlHT05fU1RJUFBMRToKICAgICAgICAgIGlmIChjdHgtPlBvbHlnb24uU3RpcHBsZUZsYWcgPT0gc3RhdGUpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBGTFVTSF9WRVJUSUNFUyhjdHgsIF9ORVdfUE9MWUdPTik7CiAgICAgICAgICBjdHgtPlBvbHlnb24uU3RpcHBsZUZsYWcgPSBzdGF0ZTsKKyAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyBePSBERF9UUklfU1RJUFBMRTsKICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9QT0lOVDoKICAgICAgICAgIGlmIChjdHgtPlBvbHlnb24uT2Zmc2V0UG9pbnQgPT0gc3RhdGUpCkBAIC04ODUsNiArODk4LDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBGTFVTSF9WRVJUSUNFUyhjdHgsIF9ORVdfU1RFTkNJTCk7CiAgICAgICAgICBjdHgtPlN0ZW5jaWwuVGVzdFR3b1NpZGUgPSBzdGF0ZTsKKyAgICAgICAgIGlmIChzdGF0ZSkKKyAgICAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyB8PSBERF9UUklfVFdPU1RFTkNJTDsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyAmPSB+RERfVFJJX1RXT1NURU5DSUw7CiAgICAgICAgICBicmVhazsKIAogI2lmIEZFQVRVUkVfQVJCX2ZyYWdtZW50X3Byb2dyYW0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vZW51bXMuYyBiL3NyYy9tZXNhL21haW4vZW51bXMuYwppbmRleCA4Y2U2YjUxLi4xNWU3ZDViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2VudW1zLmMKKysrIGIvc3JjL21lc2EvbWFpbi9lbnVtcy5jCkBAIC04OCw3ICs4OCw2IEBACiAgICAiR0xfQU5EX0lOVkVSVEVEXDAiCiAgICAiR0xfQU5EX1JFVkVSU0VcMCIKICAgICJHTF9BUlJBWV9CVUZGRVJcMCIKLSAgICJHTF9BUlJBWV9CVUZGRVJfQVJCXDAiCiAgICAiR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkdcMCIKICAgICJHTF9BUlJBWV9CVUZGRVJfQklORElOR19BUkJcMCIKICAgICJHTF9BVFRBQ0hFRF9TSEFERVJTXDAiCkBAIC00NTYsNyArNDU1LDYgQEAKICAgICJHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUlwwIgogICAgIkdMX0VER0VfRkxBR19BUlJBWV9TVFJJREVcMCIKICAgICJHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUlwwIgotICAgIkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQlwwIgogICAgIkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdcMCIKICAgICJHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQlwwIgogICAgIkdMX0VNSVNTSU9OXDAiCkBAIC0xNzg3LDcgKzE3ODUsNyBAQAogICAgIkdMX1pPT01fWVwwIgogICAgOwogCi1zdGF0aWMgY29uc3QgZW51bV9lbHQgYWxsX2VudW1zWzE3NTBdID0KK3N0YXRpYyBjb25zdCBlbnVtX2VsdCBhbGxfZW51bXNbMTc0OF0gPQogewogICAgeyAgICAgMCwgMHgwMDAwMDYwMCB9LCAvKiBHTF8yRCAqLwogICAgeyAgICAgNiwgMHgwMDAwMTQwNyB9LCAvKiBHTF8yX0JZVEVTICovCkBAIC0xODQyLDI5OTAgKzE4NDAsMjk4OCBAQAogICAgeyAgIDgzMCwgMHgwMDAwMTUwNCB9LCAvKiBHTF9BTkRfSU5WRVJURUQgKi8KICAgIHsgICA4NDYsIDB4MDAwMDE1MDIgfSwgLyogR0xfQU5EX1JFVkVSU0UgKi8KICAgIHsgICA4NjEsIDB4MDAwMDg4OTIgfSwgLyogR0xfQVJSQVlfQlVGRkVSICovCi0gICB7ICAgODc3LCAweDAwMDA4ODkyIH0sIC8qIEdMX0FSUkFZX0JVRkZFUl9BUkIgKi8KLSAgIHsgICA4OTcsIDB4MDAwMDg4OTQgfSwgLyogR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgIHsgICA5MjEsIDB4MDAwMDg4OTQgfSwgLyogR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCi0gICB7ICAgOTQ5LCAweDAwMDA4Qjg1IH0sIC8qIEdMX0FUVEFDSEVEX1NIQURFUlMgKi8KLSAgIHsgICA5NjksIDB4MDAwMDg2NDUgfSwgLyogR0xfQVRUUklCX0FSUkFZX1BPSU5URVJfTlYgKi8KLSAgIHsgICA5OTYsIDB4MDAwMDg2MjMgfSwgLyogR0xfQVRUUklCX0FSUkFZX1NJWkVfTlYgKi8KLSAgIHsgIDEwMjAsIDB4MDAwMDg2MjQgfSwgLyogR0xfQVRUUklCX0FSUkFZX1NUUklERV9OViAqLwotICAgeyAgMTA0NiwgMHgwMDAwODYyNSB9LCAvKiBHTF9BVFRSSUJfQVJSQVlfVFlQRV9OViAqLwotICAgeyAgMTA3MCwgMHgwMDAwMEJCMCB9LCAvKiBHTF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KLSAgIHsgIDEwOTIsIDB4MDAwMDBEODAgfSwgLyogR0xfQVVUT19OT1JNQUwgKi8KLSAgIHsgIDExMDcsIDB4MDAwMDA0MDkgfSwgLyogR0xfQVVYMCAqLwotICAgeyAgMTExNSwgMHgwMDAwMDQwQSB9LCAvKiBHTF9BVVgxICovCi0gICB7ICAxMTIzLCAweDAwMDAwNDBCIH0sIC8qIEdMX0FVWDIgKi8KLSAgIHsgIDExMzEsIDB4MDAwMDA0MEMgfSwgLyogR0xfQVVYMyAqLwotICAgeyAgMTEzOSwgMHgwMDAwMEMwMCB9LCAvKiBHTF9BVVhfQlVGRkVSUyAqLwotICAgeyAgMTE1NCwgMHgwMDAwMDQwNSB9LCAvKiBHTF9CQUNLICovCi0gICB7ICAxMTYyLCAweDAwMDAwNDAyIH0sIC8qIEdMX0JBQ0tfTEVGVCAqLwotICAgeyAgMTE3NSwgMHgwMDAwMDQwMyB9LCAvKiBHTF9CQUNLX1JJR0hUICovCi0gICB7ICAxMTg5LCAweDAwMDA4MEUwIH0sIC8qIEdMX0JHUiAqLwotICAgeyAgMTE5NiwgMHgwMDAwODBFMSB9LCAvKiBHTF9CR1JBICovCi0gICB7ICAxMjA0LCAweDAwMDAxQTAwIH0sIC8qIEdMX0JJVE1BUCAqLwotICAgeyAgMTIxNCwgMHgwMDAwMDcwNCB9LCAvKiBHTF9CSVRNQVBfVE9LRU4gKi8KLSAgIHsgIDEyMzAsIDB4MDAwMDBCRTIgfSwgLyogR0xfQkxFTkQgKi8KLSAgIHsgIDEyMzksIDB4MDAwMDgwMDUgfSwgLyogR0xfQkxFTkRfQ09MT1IgKi8KLSAgIHsgIDEyNTQsIDB4MDAwMDgwMDUgfSwgLyogR0xfQkxFTkRfQ09MT1JfRVhUICovCi0gICB7ICAxMjczLCAweDAwMDAwQkUwIH0sIC8qIEdMX0JMRU5EX0RTVCAqLwotICAgeyAgMTI4NiwgMHgwMDAwODBDQSB9LCAvKiBHTF9CTEVORF9EU1RfQUxQSEEgKi8KLSAgIHsgIDEzMDUsIDB4MDAwMDgwQzggfSwgLyogR0xfQkxFTkRfRFNUX1JHQiAqLwotICAgeyAgMTMyMiwgMHgwMDAwODAwOSB9LCAvKiBHTF9CTEVORF9FUVVBVElPTiAqLwotICAgeyAgMTM0MCwgMHgwMDAwODgzRCB9LCAvKiBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAqLwotICAgeyAgMTM2NCwgMHgwMDAwODgzRCB9LCAvKiBHTF9CTEVORF9FUVVBVElPTl9BTFBIQV9FWFQgKi8KLSAgIHsgIDEzOTIsIDB4MDAwMDgwMDkgfSwgLyogR0xfQkxFTkRfRVFVQVRJT05fRVhUICovCi0gICB7ICAxNDE0LCAweDAwMDA4MDA5IH0sIC8qIEdMX0JMRU5EX0VRVUFUSU9OX1JHQl9FWFQgKi8KLSAgIHsgIDE0NDAsIDB4MDAwMDBCRTEgfSwgLyogR0xfQkxFTkRfU1JDICovCi0gICB7ICAxNDUzLCAweDAwMDA4MENCIH0sIC8qIEdMX0JMRU5EX1NSQ19BTFBIQSAqLwotICAgeyAgMTQ3MiwgMHgwMDAwODBDOSB9LCAvKiBHTF9CTEVORF9TUkNfUkdCICovCi0gICB7ICAxNDg5LCAweDAwMDAxOTA1IH0sIC8qIEdMX0JMVUUgKi8KLSAgIHsgIDE0OTcsIDB4MDAwMDBEMUIgfSwgLyogR0xfQkxVRV9CSUFTICovCi0gICB7ICAxNTEwLCAweDAwMDAwRDU0IH0sIC8qIEdMX0JMVUVfQklUUyAqLwotICAgeyAgMTUyMywgMHgwMDAwMEQxQSB9LCAvKiBHTF9CTFVFX1NDQUxFICovCi0gICB7ICAxNTM3LCAweDAwMDA4QjU2IH0sIC8qIEdMX0JPT0wgKi8KLSAgIHsgIDE1NDUsIDB4MDAwMDhCNTYgfSwgLyogR0xfQk9PTF9BUkIgKi8KLSAgIHsgIDE1NTcsIDB4MDAwMDhCNTcgfSwgLyogR0xfQk9PTF9WRUMyICovCi0gICB7ICAxNTcwLCAweDAwMDA4QjU3IH0sIC8qIEdMX0JPT0xfVkVDMl9BUkIgKi8KLSAgIHsgIDE1ODcsIDB4MDAwMDhCNTggfSwgLyogR0xfQk9PTF9WRUMzICovCi0gICB7ICAxNjAwLCAweDAwMDA4QjU4IH0sIC8qIEdMX0JPT0xfVkVDM19BUkIgKi8KLSAgIHsgIDE2MTcsIDB4MDAwMDhCNTkgfSwgLyogR0xfQk9PTF9WRUM0ICovCi0gICB7ICAxNjMwLCAweDAwMDA4QjU5IH0sIC8qIEdMX0JPT0xfVkVDNF9BUkIgKi8KLSAgIHsgIDE2NDcsIDB4MDAwMDg4QkIgfSwgLyogR0xfQlVGRkVSX0FDQ0VTUyAqLwotICAgeyAgMTY2NCwgMHgwMDAwODhCQiB9LCAvKiBHTF9CVUZGRVJfQUNDRVNTX0FSQiAqLwotICAgeyAgMTY4NSwgMHgwMDAwODhCQyB9LCAvKiBHTF9CVUZGRVJfTUFQUEVEICovCi0gICB7ICAxNzAyLCAweDAwMDA4OEJDIH0sIC8qIEdMX0JVRkZFUl9NQVBQRURfQVJCICovCi0gICB7ICAxNzIzLCAweDAwMDA4OEJEIH0sIC8qIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAqLwotICAgeyAgMTc0NSwgMHgwMDAwODhCRCB9LCAvKiBHTF9CVUZGRVJfTUFQX1BPSU5URVJfQVJCICovCi0gICB7ICAxNzcxLCAweDAwMDA4NzY0IH0sIC8qIEdMX0JVRkZFUl9TSVpFICovCi0gICB7ICAxNzg2LCAweDAwMDA4NzY0IH0sIC8qIEdMX0JVRkZFUl9TSVpFX0FSQiAqLwotICAgeyAgMTgwNSwgMHgwMDAwODc2NSB9LCAvKiBHTF9CVUZGRVJfVVNBR0UgKi8KLSAgIHsgIDE4MjEsIDB4MDAwMDg3NjUgfSwgLyogR0xfQlVGRkVSX1VTQUdFX0FSQiAqLwotICAgeyAgMTg0MSwgMHgwMDAwMTQwMCB9LCAvKiBHTF9CWVRFICovCi0gICB7ICAxODQ5LCAweDAwMDAyQTI0IH0sIC8qIEdMX0MzRl9WM0YgKi8KLSAgIHsgIDE4NjAsIDB4MDAwMDJBMjYgfSwgLyogR0xfQzRGX04zRl9WM0YgKi8KLSAgIHsgIDE4NzUsIDB4MDAwMDJBMjIgfSwgLyogR0xfQzRVQl9WMkYgKi8KLSAgIHsgIDE4ODcsIDB4MDAwMDJBMjMgfSwgLyogR0xfQzRVQl9WM0YgKi8KLSAgIHsgIDE4OTksIDB4MDAwMDA5MDEgfSwgLyogR0xfQ0NXICovCi0gICB7ICAxOTA2LCAweDAwMDAyOTAwIH0sIC8qIEdMX0NMQU1QICovCi0gICB7ICAxOTE1LCAweDAwMDA4MTJEIH0sIC8qIEdMX0NMQU1QX1RPX0JPUkRFUiAqLwotICAgeyAgMTkzNCwgMHgwMDAwODEyRCB9LCAvKiBHTF9DTEFNUF9UT19CT1JERVJfQVJCICovCi0gICB7ICAxOTU3LCAweDAwMDA4MTJEIH0sIC8qIEdMX0NMQU1QX1RPX0JPUkRFUl9TR0lTICovCi0gICB7ICAxOTgxLCAweDAwMDA4MTJGIH0sIC8qIEdMX0NMQU1QX1RPX0VER0UgKi8KLSAgIHsgIDE5OTgsIDB4MDAwMDgxMkYgfSwgLyogR0xfQ0xBTVBfVE9fRURHRV9TR0lTICovCi0gICB7ICAyMDIwLCAweDAwMDAxNTAwIH0sIC8qIEdMX0NMRUFSICovCi0gICB7ICAyMDI5LCAweDAwMDA4NEUxIH0sIC8qIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAqLwotICAgeyAgMjA1NCwgMHgwMDAwODRFMSB9LCAvKiBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkVfQVJCICovCi0gICB7ICAyMDgzLCAweEZGRkZGRkZGIH0sIC8qIEdMX0NMSUVOVF9BTExfQVRUUklCX0JJVFMgKi8KLSAgIHsgIDIxMDksIDB4MDAwMDBCQjEgfSwgLyogR0xfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSCAqLwotICAgeyAgMjEzOCwgMHgwMDAwMDAwMSB9LCAvKiBHTF9DTElFTlRfUElYRUxfU1RPUkVfQklUICovCi0gICB7ICAyMTY0LCAweDAwMDAwMDAyIH0sIC8qIEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUICovCi0gICB7ICAyMTkxLCAweDAwMDAzMDAwIH0sIC8qIEdMX0NMSVBfUExBTkUwICovCi0gICB7ICAyMjA2LCAweDAwMDAzMDAxIH0sIC8qIEdMX0NMSVBfUExBTkUxICovCi0gICB7ICAyMjIxLCAweDAwMDAzMDAyIH0sIC8qIEdMX0NMSVBfUExBTkUyICovCi0gICB7ICAyMjM2LCAweDAwMDAzMDAzIH0sIC8qIEdMX0NMSVBfUExBTkUzICovCi0gICB7ICAyMjUxLCAweDAwMDAzMDA0IH0sIC8qIEdMX0NMSVBfUExBTkU0ICovCi0gICB7ICAyMjY2LCAweDAwMDAzMDA1IH0sIC8qIEdMX0NMSVBfUExBTkU1ICovCi0gICB7ICAyMjgxLCAweDAwMDA4MEYwIH0sIC8qIEdMX0NMSVBfVk9MVU1FX0NMSVBQSU5HX0hJTlRfRVhUICovCi0gICB7ICAyMzE0LCAweDAwMDAwQTAwIH0sIC8qIEdMX0NPRUZGICovCi0gICB7ICAyMzIzLCAweDAwMDAxODAwIH0sIC8qIEdMX0NPTE9SICovCi0gICB7ICAyMzMyLCAweDAwMDA4MDc2IH0sIC8qIEdMX0NPTE9SX0FSUkFZICovCi0gICB7ICAyMzQ3LCAweDAwMDA4ODk4IH0sIC8qIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7ICAyMzc3LCAweDAwMDA4ODk4IH0sIC8qIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAgMjQxMSwgMHgwMDAwODA5MCB9LCAvKiBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCi0gICB7ICAyNDM0LCAweDAwMDA4MDgxIH0sIC8qIEdMX0NPTE9SX0FSUkFZX1NJWkUgKi8KLSAgIHsgIDI0NTQsIDB4MDAwMDgwODMgfSwgLyogR0xfQ09MT1JfQVJSQVlfU1RSSURFICovCi0gICB7ICAyNDc2LCAweDAwMDA4MDgyIH0sIC8qIEdMX0NPTE9SX0FSUkFZX1RZUEUgKi8KLSAgIHsgIDI0OTYsIDB4MDAwMDhDRTAgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhUICovCi0gICB7ICAyNTIxLCAweDAwMDA4Q0VBIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9FWFQgKi8KLSAgIHsgIDI1NDcsIDB4MDAwMDhDRUIgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDExX0VYVCAqLwotICAgeyAgMjU3MywgMHgwMDAwOENFQyB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfRVhUICovCi0gICB7ICAyNTk5LCAweDAwMDA4Q0VEIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19FWFQgKi8KLSAgIHsgIDI2MjUsIDB4MDAwMDhDRUUgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDE0X0VYVCAqLwotICAgeyAgMjY1MSwgMHgwMDAwOENFRiB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfRVhUICovCi0gICB7ICAyNjc3LCAweDAwMDA4Q0UxIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxX0VYVCAqLwotICAgeyAgMjcwMiwgMHgwMDAwOENFMiB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9FWFQgKi8KLSAgIHsgIDI3MjcsIDB4MDAwMDhDRTMgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDNfRVhUICovCi0gICB7ICAyNzUyLCAweDAwMDA4Q0U0IH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X0VYVCAqLwotICAgeyAgMjc3NywgMHgwMDAwOENFNSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQgKi8KLSAgIHsgIDI4MDIsIDB4MDAwMDhDRTYgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDZfRVhUICovCi0gICB7ICAyODI3LCAweDAwMDA4Q0U3IH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X0VYVCAqLwotICAgeyAgMjg1MiwgMHgwMDAwOENFOCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9FWFQgKi8KLSAgIHsgIDI4NzcsIDB4MDAwMDhDRTkgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDlfRVhUICovCi0gICB7ICAyOTAyLCAweDAwMDA0MDAwIH0sIC8qIEdMX0NPTE9SX0JVRkZFUl9CSVQgKi8KLSAgIHsgIDI5MjIsIDB4MDAwMDBDMjIgfSwgLyogR0xfQ09MT1JfQ0xFQVJfVkFMVUUgKi8KLSAgIHsgIDI5NDMsIDB4MDAwMDE5MDAgfSwgLyogR0xfQ09MT1JfSU5ERVggKi8KLSAgIHsgIDI5NTgsIDB4MDAwMDE2MDMgfSwgLyogR0xfQ09MT1JfSU5ERVhFUyAqLwotICAgeyAgMjk3NSwgMHgwMDAwMEJGMiB9LCAvKiBHTF9DT0xPUl9MT0dJQ19PUCAqLwotICAgeyAgMjk5MywgMHgwMDAwMEI1NyB9LCAvKiBHTF9DT0xPUl9NQVRFUklBTCAqLwotICAgeyAgMzAxMSwgMHgwMDAwMEI1NSB9LCAvKiBHTF9DT0xPUl9NQVRFUklBTF9GQUNFICovCi0gICB7ICAzMDM0LCAweDAwMDAwQjU2IH0sIC8qIEdMX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUiAqLwotICAgeyAgMzA2MiwgMHgwMDAwODBCMSB9LCAvKiBHTF9DT0xPUl9NQVRSSVggKi8KLSAgIHsgIDMwNzgsIDB4MDAwMDgwQjEgfSwgLyogR0xfQ09MT1JfTUFUUklYX1NHSSAqLwotICAgeyAgMzA5OCwgMHgwMDAwODBCMiB9LCAvKiBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KLSAgIHsgIDMxMjYsIDB4MDAwMDgwQjIgfSwgLyogR0xfQ09MT1JfTUFUUklYX1NUQUNLX0RFUFRIX1NHSSAqLwotICAgeyAgMzE1OCwgMHgwMDAwODQ1OCB9LCAvKiBHTF9DT0xPUl9TVU0gKi8KLSAgIHsgIDMxNzEsIDB4MDAwMDg0NTggfSwgLyogR0xfQ09MT1JfU1VNX0FSQiAqLwotICAgeyAgMzE4OCwgMHgwMDAwODBEMCB9LCAvKiBHTF9DT0xPUl9UQUJMRSAqLwotICAgeyAgMzIwMywgMHgwMDAwODBERCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFICovCi0gICB7ICAzMjI5LCAweDAwMDA4MEREIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0FMUEhBX1NJWkVfRVhUICovCi0gICB7ICAzMjU5LCAweDAwMDA4MEREIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0FMUEhBX1NJWkVfU0dJICovCi0gICB7ICAzMjg5LCAweDAwMDA4MEQ3IH0sIC8qIEdMX0NPTE9SX1RBQkxFX0JJQVMgKi8KLSAgIHsgIDMzMDksIDB4MDAwMDgwRDcgfSwgLyogR0xfQ09MT1JfVEFCTEVfQklBU19TR0kgKi8KLSAgIHsgIDMzMzMsIDB4MDAwMDgwREMgfSwgLyogR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFICovCi0gICB7ICAzMzU4LCAweDAwMDA4MERDIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9FWFQgKi8KLSAgIHsgIDMzODcsIDB4MDAwMDgwREMgfSwgLyogR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFX1NHSSAqLwotICAgeyAgMzQxNiwgMHgwMDAwODBEOCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9GT1JNQVQgKi8KLSAgIHsgIDM0MzgsIDB4MDAwMDgwRDggfSwgLyogR0xfQ09MT1JfVEFCTEVfRk9STUFUX0VYVCAqLwotICAgeyAgMzQ2NCwgMHgwMDAwODBEOCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9GT1JNQVRfU0dJICovCi0gICB7ICAzNDkwLCAweDAwMDA4MERCIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUgKi8KLSAgIHsgIDM1MTYsIDB4MDAwMDgwREIgfSwgLyogR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRV9FWFQgKi8KLSAgIHsgIDM1NDYsIDB4MDAwMDgwREIgfSwgLyogR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRV9TR0kgKi8KLSAgIHsgIDM1NzYsIDB4MDAwMDgwREYgfSwgLyogR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkUgKi8KLSAgIHsgIDM2MDYsIDB4MDAwMDgwREYgfSwgLyogR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkVfRVhUICovCi0gICB7ICAzNjQwLCAweDAwMDA4MERGIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX1NHSSAqLwotICAgeyAgMzY3NCwgMHgwMDAwODBERSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRSAqLwotICAgeyAgMzcwNCwgMHgwMDAwODBERSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRV9FWFQgKi8KLSAgIHsgIDM3MzgsIDB4MDAwMDgwREUgfSwgLyogR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfU0dJICovCi0gICB7ICAzNzcyLCAweDAwMDA4MERBIH0sIC8qIEdMX0NPTE9SX1RBQkxFX1JFRF9TSVpFICovCi0gICB7ICAzNzk2LCAweDAwMDA4MERBIH0sIC8qIEdMX0NPTE9SX1RBQkxFX1JFRF9TSVpFX0VYVCAqLwotICAgeyAgMzgyNCwgMHgwMDAwODBEQSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9SRURfU0laRV9TR0kgKi8KLSAgIHsgIDM4NTIsIDB4MDAwMDgwRDYgfSwgLyogR0xfQ09MT1JfVEFCTEVfU0NBTEUgKi8KLSAgIHsgIDM4NzMsIDB4MDAwMDgwRDYgfSwgLyogR0xfQ09MT1JfVEFCTEVfU0NBTEVfU0dJICovCi0gICB7ICAzODk4LCAweDAwMDA4MEQ5IH0sIC8qIEdMX0NPTE9SX1RBQkxFX1dJRFRIICovCi0gICB7ICAzOTE5LCAweDAwMDA4MEQ5IH0sIC8qIEdMX0NPTE9SX1RBQkxFX1dJRFRIX0VYVCAqLwotICAgeyAgMzk0NCwgMHgwMDAwODBEOSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9XSURUSF9TR0kgKi8KLSAgIHsgIDM5NjksIDB4MDAwMDBDMjMgfSwgLyogR0xfQ09MT1JfV1JJVEVNQVNLICovCi0gICB7ICAzOTg4LCAweDAwMDA4NTcwIH0sIC8qIEdMX0NPTUJJTkUgKi8KLSAgIHsgIDM5OTksIDB4MDAwMDg1MDMgfSwgLyogR0xfQ09NQklORTQgKi8KLSAgIHsgIDQwMTEsIDB4MDAwMDg1NzIgfSwgLyogR0xfQ09NQklORV9BTFBIQSAqLwotICAgeyAgNDAyOCwgMHgwMDAwODU3MiB9LCAvKiBHTF9DT01CSU5FX0FMUEhBX0FSQiAqLwotICAgeyAgNDA0OSwgMHgwMDAwODU3MiB9LCAvKiBHTF9DT01CSU5FX0FMUEhBX0VYVCAqLwotICAgeyAgNDA3MCwgMHgwMDAwODU3MCB9LCAvKiBHTF9DT01CSU5FX0FSQiAqLwotICAgeyAgNDA4NSwgMHgwMDAwODU3MCB9LCAvKiBHTF9DT01CSU5FX0VYVCAqLwotICAgeyAgNDEwMCwgMHgwMDAwODU3MSB9LCAvKiBHTF9DT01CSU5FX1JHQiAqLwotICAgeyAgNDExNSwgMHgwMDAwODU3MSB9LCAvKiBHTF9DT01CSU5FX1JHQl9BUkIgKi8KLSAgIHsgIDQxMzQsIDB4MDAwMDg1NzEgfSwgLyogR0xfQ09NQklORV9SR0JfRVhUICovCi0gICB7ICA0MTUzLCAweDAwMDA4ODRFIH0sIC8qIEdMX0NPTVBBUkVfUkVGX0RFUFRIX1RPX1RFWFRVUkVfRVhUICovCi0gICB7ICA0MTg5LCAweDAwMDA4ODRFIH0sIC8qIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICovCi0gICB7ICA0MjEzLCAweDAwMDA4ODRFIH0sIC8qIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFX0FSQiAqLwotICAgeyAgNDI0MSwgMHgwMDAwMTMwMCB9LCAvKiBHTF9DT01QSUxFICovCi0gICB7ICA0MjUyLCAweDAwMDAxMzAxIH0sIC8qIEdMX0NPTVBJTEVfQU5EX0VYRUNVVEUgKi8KLSAgIHsgIDQyNzUsIDB4MDAwMDhCODEgfSwgLyogR0xfQ09NUElMRV9TVEFUVVMgKi8KLSAgIHsgIDQyOTMsIDB4MDAwMDg0RTkgfSwgLyogR0xfQ09NUFJFU1NFRF9BTFBIQSAqLwotICAgeyAgNDMxMywgMHgwMDAwODRFOSB9LCAvKiBHTF9DT01QUkVTU0VEX0FMUEhBX0FSQiAqLwotICAgeyAgNDMzNywgMHgwMDAwODRFQyB9LCAvKiBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAqLwotICAgeyAgNDM2MSwgMHgwMDAwODRFQyB9LCAvKiBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWV9BUkIgKi8KLSAgIHsgIDQzODksIDB4MDAwMDg0RUEgfSwgLyogR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0UgKi8KLSAgIHsgIDQ0MTMsIDB4MDAwMDg0RUIgfSwgLyogR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEEgKi8KLSAgIHsgIDQ0NDMsIDB4MDAwMDg0RUIgfSwgLyogR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEFfQVJCICovCi0gICB7ICA0NDc3LCAweDAwMDA4NEVBIH0sIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FSQiAqLwotICAgeyAgNDUwNSwgMHgwMDAwODRFRCB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQiAqLwotICAgeyAgNDUyMywgMHgwMDAwODRFRSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkEgKi8KLSAgIHsgIDQ1NDIsIDB4MDAwMDg0RUUgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JBX0FSQiAqLwotICAgeyAgNDU2NSwgMHgwMDAwODZCMSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICovCi0gICB7ICA0NTk0LCAweDAwMDA4M0YxIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUICovCi0gICB7ICA0NjI3LCAweDAwMDA4M0YyIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUICovCi0gICB7ICA0NjYwLCAweDAwMDA4M0YzIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICovCi0gICB7ICA0NjkzLCAweDAwMDA4NEVEIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCX0FSQiAqLwotICAgeyAgNDcxNSwgMHgwMDAwODZCMCB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQl9GWFQxXzNERlggKi8KLSAgIHsgIDQ3NDMsIDB4MDAwMDgzRjAgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCAqLwotICAgeyAgNDc3NSwgMHgwMDAwODZBMyB9LCAvKiBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAqLwotICAgeyAgNDgwNSwgMHgwMDAwODU3NiB9LCAvKiBHTF9DT05TVEFOVCAqLwotICAgeyAgNDgxNywgMHgwMDAwODAwMyB9LCAvKiBHTF9DT05TVEFOVF9BTFBIQSAqLwotICAgeyAgNDgzNSwgMHgwMDAwODAwMyB9LCAvKiBHTF9DT05TVEFOVF9BTFBIQV9FWFQgKi8KLSAgIHsgIDQ4NTcsIDB4MDAwMDg1NzYgfSwgLyogR0xfQ09OU1RBTlRfQVJCICovCi0gICB7ICA0ODczLCAweDAwMDAxMjA3IH0sIC8qIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICovCi0gICB7ICA0ODk3LCAweDAwMDA4MTUxIH0sIC8qIEdMX0NPTlNUQU5UX0JPUkRFUl9IUCAqLwotICAgeyAgNDkxOSwgMHgwMDAwODAwMSB9LCAvKiBHTF9DT05TVEFOVF9DT0xPUiAqLwotICAgeyAgNDkzNywgMHgwMDAwODAwMSB9LCAvKiBHTF9DT05TVEFOVF9DT0xPUl9FWFQgKi8KLSAgIHsgIDQ5NTksIDB4MDAwMDg1NzYgfSwgLyogR0xfQ09OU1RBTlRfRVhUICovCi0gICB7ICA0OTc1LCAweDAwMDA4MDEwIH0sIC8qIEdMX0NPTlZPTFVUSU9OXzFEICovCi0gICB7ICA0OTkzLCAweDAwMDA4MDExIH0sIC8qIEdMX0NPTlZPTFVUSU9OXzJEICovCi0gICB7ICA1MDExLCAweDAwMDA4MTU0IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAqLwotICAgeyAgNTAzOSwgMHgwMDAwODE1NCB9LCAvKiBHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1JfSFAgKi8KLSAgIHsgIDUwNzAsIDB4MDAwMDgwMTMgfSwgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUgKi8KLSAgIHsgIDUwOTcsIDB4MDAwMDgwMTMgfSwgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREVfRVhUICovCi0gICB7ICA1MTI4LCAweDAwMDA4MDE1IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTICovCi0gICB7ICA1MTU1LCAweDAwMDA4MDE1IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTX0VYVCAqLwotICAgeyAgNTE4NiwgMHgwMDAwODAxNCB9LCAvKiBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEUgKi8KLSAgIHsgIDUyMTQsIDB4MDAwMDgwMTQgfSwgLyogR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFX0VYVCAqLwotICAgeyAgNTI0NiwgMHgwMDAwODAxNyB9LCAvKiBHTF9DT05WT0xVVElPTl9GT1JNQVQgKi8KLSAgIHsgIDUyNjgsIDB4MDAwMDgwMTcgfSwgLyogR0xfQ09OVk9MVVRJT05fRk9STUFUX0VYVCAqLwotICAgeyAgNTI5NCwgMHgwMDAwODAxOSB9LCAvKiBHTF9DT05WT0xVVElPTl9IRUlHSFQgKi8KLSAgIHsgIDUzMTYsIDB4MDAwMDgwMTkgfSwgLyogR0xfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAqLwotICAgeyAgNTM0MiwgMHgwMDAwODAxOCB9LCAvKiBHTF9DT05WT0xVVElPTl9XSURUSCAqLwotICAgeyAgNTM2MywgMHgwMDAwODAxOCB9LCAvKiBHTF9DT05WT0xVVElPTl9XSURUSF9FWFQgKi8KLSAgIHsgIDUzODgsIDB4MDAwMDg4NjIgfSwgLyogR0xfQ09PUkRfUkVQTEFDRSAqLwotICAgeyAgNTQwNSwgMHgwMDAwODg2MiB9LCAvKiBHTF9DT09SRF9SRVBMQUNFX0FSQiAqLwotICAgeyAgNTQyNiwgMHgwMDAwODg2MiB9LCAvKiBHTF9DT09SRF9SRVBMQUNFX05WICovCi0gICB7ICA1NDQ2LCAweDAwMDAxNTAzIH0sIC8qIEdMX0NPUFkgKi8KLSAgIHsgIDU0NTQsIDB4MDAwMDE1MEMgfSwgLyogR0xfQ09QWV9JTlZFUlRFRCAqLwotICAgeyAgNTQ3MSwgMHgwMDAwMDcwNiB9LCAvKiBHTF9DT1BZX1BJWEVMX1RPS0VOICovCi0gICB7ICA1NDkxLCAweDAwMDAwQjQ0IH0sIC8qIEdMX0NVTExfRkFDRSAqLwotICAgeyAgNTUwNCwgMHgwMDAwMEI0NSB9LCAvKiBHTF9DVUxMX0ZBQ0VfTU9ERSAqLwotICAgeyAgNTUyMiwgMHgwMDAwODFBQSB9LCAvKiBHTF9DVUxMX1ZFUlRFWF9FWFQgKi8KLSAgIHsgIDU1NDEsIDB4MDAwMDgxQUMgfSwgLyogR0xfQ1VMTF9WRVJURVhfRVlFX1BPU0lUSU9OX0VYVCAqLwotICAgeyAgNTU3MywgMHgwMDAwODFBQiB9LCAvKiBHTF9DVUxMX1ZFUlRFWF9PQkpFQ1RfUE9TSVRJT05fRVhUICovCi0gICB7ICA1NjA4LCAweDAwMDA4NjI2IH0sIC8qIEdMX0NVUlJFTlRfQVRUUklCX05WICovCi0gICB7ICA1NjI5LCAweDAwMDAwMDAxIH0sIC8qIEdMX0NVUlJFTlRfQklUICovCi0gICB7ICA1NjQ0LCAweDAwMDAwQjAwIH0sIC8qIEdMX0NVUlJFTlRfQ09MT1IgKi8KLSAgIHsgIDU2NjEsIDB4MDAwMDg0NTMgfSwgLyogR0xfQ1VSUkVOVF9GT0dfQ09PUkQgKi8KLSAgIHsgIDU2ODIsIDB4MDAwMDg0NTMgfSwgLyogR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURSAqLwotICAgeyAgNTcwOCwgMHgwMDAwMEIwMSB9LCAvKiBHTF9DVVJSRU5UX0lOREVYICovCi0gICB7ICA1NzI1LCAweDAwMDA4NjQxIH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAqLwotICAgeyAgNTc0NywgMHgwMDAwODg0NSB9LCAvKiBHTF9DVVJSRU5UX01BVFJJWF9JTkRFWF9BUkIgKi8KLSAgIHsgIDU3NzUsIDB4MDAwMDg2NDEgfSwgLyogR0xfQ1VSUkVOVF9NQVRSSVhfTlYgKi8KLSAgIHsgIDU3OTYsIDB4MDAwMDg2NDAgfSwgLyogR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCICovCi0gICB7ICA1ODMwLCAweDAwMDA4NjQwIH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX1NUQUNLX0RFUFRIX05WICovCi0gICB7ICA1ODYzLCAweDAwMDAwQjAyIH0sIC8qIEdMX0NVUlJFTlRfTk9STUFMICovCi0gICB7ICA1ODgxLCAweDAwMDA4ODQzIH0sIC8qIEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfQVJCICovCi0gICB7ICA1OTExLCAweDAwMDA4QjhEIH0sIC8qIEdMX0NVUlJFTlRfUFJPR1JBTSAqLwotICAgeyAgNTkzMCwgMHgwMDAwODg2NSB9LCAvKiBHTF9DVVJSRU5UX1FVRVJZICovCi0gICB7ICA1OTQ3LCAweDAwMDA4ODY1IH0sIC8qIEdMX0NVUlJFTlRfUVVFUllfQVJCICovCi0gICB7ICA1OTY4LCAweDAwMDAwQjA0IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0NPTE9SICovCi0gICB7ICA1OTkyLCAweDAwMDAwQjA5IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0RJU1RBTkNFICovCi0gICB7ICA2MDE5LCAweDAwMDAwQjA1IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0lOREVYICovCi0gICB7ICA2MDQzLCAweDAwMDAwQjA3IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OICovCi0gICB7ICA2MDcwLCAweDAwMDAwQjA4IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OX1ZBTElEICovCi0gICB7ICA2MTAzLCAweDAwMDAwQjA2IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1RFWFRVUkVfQ09PUkRTICovCi0gICB7ICA2MTM2LCAweDAwMDA4NDU5IH0sIC8qIEdMX0NVUlJFTlRfU0VDT05EQVJZX0NPTE9SICovCi0gICB7ICA2MTYzLCAweDAwMDAwQjAzIH0sIC8qIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgKi8KLSAgIHsgIDYxODksIDB4MDAwMDg2MjYgfSwgLyogR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICovCi0gICB7ICA2MjE0LCAweDAwMDA4NjI2IH0sIC8qIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQl9BUkIgKi8KLSAgIHsgIDYyNDMsIDB4MDAwMDg2QTggfSwgLyogR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICovCi0gICB7ICA2MjY1LCAweDAwMDAwOTAwIH0sIC8qIEdMX0NXICovCi0gICB7ICA2MjcxLCAweDAwMDA4NzVCIH0sIC8qIEdMX0RFQlVHX0FTU0VSVF9NRVNBICovCi0gICB7ICA2MjkyLCAweDAwMDA4NzU5IH0sIC8qIEdMX0RFQlVHX09CSkVDVF9NRVNBICovCi0gICB7ICA2MzEzLCAweDAwMDA4NzVBIH0sIC8qIEdMX0RFQlVHX1BSSU5UX01FU0EgKi8KLSAgIHsgIDYzMzMsIDB4MDAwMDIxMDEgfSwgLyogR0xfREVDQUwgKi8KLSAgIHsgIDYzNDIsIDB4MDAwMDFFMDMgfSwgLyogR0xfREVDUiAqLwotICAgeyAgNjM1MCwgMHgwMDAwODUwOCB9LCAvKiBHTF9ERUNSX1dSQVAgKi8KLSAgIHsgIDYzNjMsIDB4MDAwMDg1MDggfSwgLyogR0xfREVDUl9XUkFQX0VYVCAqLwotICAgeyAgNjM4MCwgMHgwMDAwOEI4MCB9LCAvKiBHTF9ERUxFVEVfU1RBVFVTICovCi0gICB7ICA2Mzk3LCAweDAwMDAxODAxIH0sIC8qIEdMX0RFUFRIICovCi0gICB7ICA2NDA2LCAweDAwMDA4RDAwIH0sIC8qIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhUICovCi0gICB7ICA2NDMwLCAweDAwMDAwRDFGIH0sIC8qIEdMX0RFUFRIX0JJQVMgKi8KLSAgIHsgIDY0NDQsIDB4MDAwMDBENTYgfSwgLyogR0xfREVQVEhfQklUUyAqLwotICAgeyAgNjQ1OCwgMHgwMDAwODg5MSB9LCAvKiBHTF9ERVBUSF9CT1VORFNfRVhUICovCi0gICB7ICA2NDc4LCAweDAwMDA4ODkwIH0sIC8qIEdMX0RFUFRIX0JPVU5EU19URVNUX0VYVCAqLwotICAgeyAgNjUwMywgMHgwMDAwMDEwMCB9LCAvKiBHTF9ERVBUSF9CVUZGRVJfQklUICovCi0gICB7ICA2NTIzLCAweDAwMDA4NjRGIH0sIC8qIEdMX0RFUFRIX0NMQU1QX05WICovCi0gICB7ICA2NTQxLCAweDAwMDAwQjczIH0sIC8qIEdMX0RFUFRIX0NMRUFSX1ZBTFVFICovCi0gICB7ICA2NTYyLCAweDAwMDAxOTAyIH0sIC8qIEdMX0RFUFRIX0NPTVBPTkVOVCAqLwotICAgeyAgNjU4MSwgMHgwMDAwODFBNSB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQxNiAqLwotICAgeyAgNjYwMiwgMHgwMDAwODFBNSB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQxNl9BUkIgKi8KLSAgIHsgIDY2MjcsIDB4MDAwMDgxQTUgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMTZfU0dJWCAqLwotICAgeyAgNjY1MywgMHgwMDAwODFBNiB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQyNCAqLwotICAgeyAgNjY3NCwgMHgwMDAwODFBNiB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgKi8KLSAgIHsgIDY2OTksIDB4MDAwMDgxQTYgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMjRfU0dJWCAqLwotICAgeyAgNjcyNSwgMHgwMDAwODFBNyB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQzMiAqLwotICAgeyAgNjc0NiwgMHgwMDAwODFBNyB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQzMl9BUkIgKi8KLSAgIHsgIDY3NzEsIDB4MDAwMDgxQTcgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzJfU0dJWCAqLwotICAgeyAgNjc5NywgMHgwMDAwMEI3NCB9LCAvKiBHTF9ERVBUSF9GVU5DICovCi0gICB7ICA2ODExLCAweDAwMDAwQjcwIH0sIC8qIEdMX0RFUFRIX1JBTkdFICovCi0gICB7ICA2ODI2LCAweDAwMDAwRDFFIH0sIC8qIEdMX0RFUFRIX1NDQUxFICovCi0gICB7ICA2ODQxLCAweDAwMDA4NEY5IH0sIC8qIEdMX0RFUFRIX1NURU5DSUxfTlYgKi8KLSAgIHsgIDY4NjEsIDB4MDAwMDg4NkYgfSwgLyogR0xfREVQVEhfU1RFTkNJTF9UT19CR1JBX05WICovCi0gICB7ICA2ODg5LCAweDAwMDA4ODZFIH0sIC8qIEdMX0RFUFRIX1NURU5DSUxfVE9fUkdCQV9OViAqLwotICAgeyAgNjkxNywgMHgwMDAwMEI3MSB9LCAvKiBHTF9ERVBUSF9URVNUICovCi0gICB7ICA2OTMxLCAweDAwMDA4ODRCIH0sIC8qIEdMX0RFUFRIX1RFWFRVUkVfTU9ERSAqLwotICAgeyAgNjk1MywgMHgwMDAwODg0QiB9LCAvKiBHTF9ERVBUSF9URVhUVVJFX01PREVfQVJCICovCi0gICB7ICA2OTc5LCAweDAwMDAwQjcyIH0sIC8qIEdMX0RFUFRIX1dSSVRFTUFTSyAqLwotICAgeyAgNjk5OCwgMHgwMDAwMTIwMSB9LCAvKiBHTF9ESUZGVVNFICovCi0gICB7ICA3MDA5LCAweDAwMDAwQkQwIH0sIC8qIEdMX0RJVEhFUiAqLwotICAgeyAgNzAxOSwgMHgwMDAwMEEwMiB9LCAvKiBHTF9ET01BSU4gKi8KLSAgIHsgIDcwMjksIDB4MDAwMDExMDAgfSwgLyogR0xfRE9OVF9DQVJFICovCi0gICB7ICA3MDQyLCAweDAwMDA4NkFFIH0sIC8qIEdMX0RPVDNfUkdCICovCi0gICB7ICA3MDU0LCAweDAwMDA4NkFGIH0sIC8qIEdMX0RPVDNfUkdCQSAqLwotICAgeyAgNzA2NywgMHgwMDAwODZBRiB9LCAvKiBHTF9ET1QzX1JHQkFfQVJCICovCi0gICB7ICA3MDg0LCAweDAwMDA4NzQxIH0sIC8qIEdMX0RPVDNfUkdCQV9FWFQgKi8KLSAgIHsgIDcxMDEsIDB4MDAwMDg2QUUgfSwgLyogR0xfRE9UM19SR0JfQVJCICovCi0gICB7ICA3MTE3LCAweDAwMDA4NzQwIH0sIC8qIEdMX0RPVDNfUkdCX0VYVCAqLwotICAgeyAgNzEzMywgMHgwMDAwMTQwQSB9LCAvKiBHTF9ET1VCTEUgKi8KLSAgIHsgIDcxNDMsIDB4MDAwMDBDMzIgfSwgLyogR0xfRE9VQkxFQlVGRkVSICovCi0gICB7ICA3MTU5LCAweDAwMDAwQzAxIH0sIC8qIEdMX0RSQVdfQlVGRkVSICovCi0gICB7ICA3MTc0LCAweDAwMDA4ODI1IH0sIC8qIEdMX0RSQVdfQlVGRkVSMCAqLwotICAgeyAgNzE5MCwgMHgwMDAwODgyNSB9LCAvKiBHTF9EUkFXX0JVRkZFUjBfQVJCICovCi0gICB7ICA3MjEwLCAweDAwMDA4ODI1IH0sIC8qIEdMX0RSQVdfQlVGRkVSMF9BVEkgKi8KLSAgIHsgIDcyMzAsIDB4MDAwMDg4MjYgfSwgLyogR0xfRFJBV19CVUZGRVIxICovCi0gICB7ICA3MjQ2LCAweDAwMDA4ODJGIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTAgKi8KLSAgIHsgIDcyNjMsIDB4MDAwMDg4MkYgfSwgLyogR0xfRFJBV19CVUZGRVIxMF9BUkIgKi8KLSAgIHsgIDcyODQsIDB4MDAwMDg4MkYgfSwgLyogR0xfRFJBV19CVUZGRVIxMF9BVEkgKi8KLSAgIHsgIDczMDUsIDB4MDAwMDg4MzAgfSwgLyogR0xfRFJBV19CVUZGRVIxMSAqLwotICAgeyAgNzMyMiwgMHgwMDAwODgzMCB9LCAvKiBHTF9EUkFXX0JVRkZFUjExX0FSQiAqLwotICAgeyAgNzM0MywgMHgwMDAwODgzMCB9LCAvKiBHTF9EUkFXX0JVRkZFUjExX0FUSSAqLwotICAgeyAgNzM2NCwgMHgwMDAwODgzMSB9LCAvKiBHTF9EUkFXX0JVRkZFUjEyICovCi0gICB7ICA3MzgxLCAweDAwMDA4ODMxIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTJfQVJCICovCi0gICB7ICA3NDAyLCAweDAwMDA4ODMxIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTJfQVRJICovCi0gICB7ICA3NDIzLCAweDAwMDA4ODMyIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTMgKi8KLSAgIHsgIDc0NDAsIDB4MDAwMDg4MzIgfSwgLyogR0xfRFJBV19CVUZGRVIxM19BUkIgKi8KLSAgIHsgIDc0NjEsIDB4MDAwMDg4MzIgfSwgLyogR0xfRFJBV19CVUZGRVIxM19BVEkgKi8KLSAgIHsgIDc0ODIsIDB4MDAwMDg4MzMgfSwgLyogR0xfRFJBV19CVUZGRVIxNCAqLwotICAgeyAgNzQ5OSwgMHgwMDAwODgzMyB9LCAvKiBHTF9EUkFXX0JVRkZFUjE0X0FSQiAqLwotICAgeyAgNzUyMCwgMHgwMDAwODgzMyB9LCAvKiBHTF9EUkFXX0JVRkZFUjE0X0FUSSAqLwotICAgeyAgNzU0MSwgMHgwMDAwODgzNCB9LCAvKiBHTF9EUkFXX0JVRkZFUjE1ICovCi0gICB7ICA3NTU4LCAweDAwMDA4ODM0IH0sIC8qIEdMX0RSQVdfQlVGRkVSMTVfQVJCICovCi0gICB7ICA3NTc5LCAweDAwMDA4ODM0IH0sIC8qIEdMX0RSQVdfQlVGRkVSMTVfQVRJICovCi0gICB7ICA3NjAwLCAweDAwMDA4ODI2IH0sIC8qIEdMX0RSQVdfQlVGRkVSMV9BUkIgKi8KLSAgIHsgIDc2MjAsIDB4MDAwMDg4MjYgfSwgLyogR0xfRFJBV19CVUZGRVIxX0FUSSAqLwotICAgeyAgNzY0MCwgMHgwMDAwODgyNyB9LCAvKiBHTF9EUkFXX0JVRkZFUjIgKi8KLSAgIHsgIDc2NTYsIDB4MDAwMDg4MjcgfSwgLyogR0xfRFJBV19CVUZGRVIyX0FSQiAqLwotICAgeyAgNzY3NiwgMHgwMDAwODgyNyB9LCAvKiBHTF9EUkFXX0JVRkZFUjJfQVRJICovCi0gICB7ICA3Njk2LCAweDAwMDA4ODI4IH0sIC8qIEdMX0RSQVdfQlVGRkVSMyAqLwotICAgeyAgNzcxMiwgMHgwMDAwODgyOCB9LCAvKiBHTF9EUkFXX0JVRkZFUjNfQVJCICovCi0gICB7ICA3NzMyLCAweDAwMDA4ODI4IH0sIC8qIEdMX0RSQVdfQlVGRkVSM19BVEkgKi8KLSAgIHsgIDc3NTIsIDB4MDAwMDg4MjkgfSwgLyogR0xfRFJBV19CVUZGRVI0ICovCi0gICB7ICA3NzY4LCAweDAwMDA4ODI5IH0sIC8qIEdMX0RSQVdfQlVGRkVSNF9BUkIgKi8KLSAgIHsgIDc3ODgsIDB4MDAwMDg4MjkgfSwgLyogR0xfRFJBV19CVUZGRVI0X0FUSSAqLwotICAgeyAgNzgwOCwgMHgwMDAwODgyQSB9LCAvKiBHTF9EUkFXX0JVRkZFUjUgKi8KLSAgIHsgIDc4MjQsIDB4MDAwMDg4MkEgfSwgLyogR0xfRFJBV19CVUZGRVI1X0FSQiAqLwotICAgeyAgNzg0NCwgMHgwMDAwODgyQSB9LCAvKiBHTF9EUkFXX0JVRkZFUjVfQVRJICovCi0gICB7ICA3ODY0LCAweDAwMDA4ODJCIH0sIC8qIEdMX0RSQVdfQlVGRkVSNiAqLwotICAgeyAgNzg4MCwgMHgwMDAwODgyQiB9LCAvKiBHTF9EUkFXX0JVRkZFUjZfQVJCICovCi0gICB7ICA3OTAwLCAweDAwMDA4ODJCIH0sIC8qIEdMX0RSQVdfQlVGRkVSNl9BVEkgKi8KLSAgIHsgIDc5MjAsIDB4MDAwMDg4MkMgfSwgLyogR0xfRFJBV19CVUZGRVI3ICovCi0gICB7ICA3OTM2LCAweDAwMDA4ODJDIH0sIC8qIEdMX0RSQVdfQlVGRkVSN19BUkIgKi8KLSAgIHsgIDc5NTYsIDB4MDAwMDg4MkMgfSwgLyogR0xfRFJBV19CVUZGRVI3X0FUSSAqLwotICAgeyAgNzk3NiwgMHgwMDAwODgyRCB9LCAvKiBHTF9EUkFXX0JVRkZFUjggKi8KLSAgIHsgIDc5OTIsIDB4MDAwMDg4MkQgfSwgLyogR0xfRFJBV19CVUZGRVI4X0FSQiAqLwotICAgeyAgODAxMiwgMHgwMDAwODgyRCB9LCAvKiBHTF9EUkFXX0JVRkZFUjhfQVRJICovCi0gICB7ICA4MDMyLCAweDAwMDA4ODJFIH0sIC8qIEdMX0RSQVdfQlVGRkVSOSAqLwotICAgeyAgODA0OCwgMHgwMDAwODgyRSB9LCAvKiBHTF9EUkFXX0JVRkZFUjlfQVJCICovCi0gICB7ICA4MDY4LCAweDAwMDA4ODJFIH0sIC8qIEdMX0RSQVdfQlVGRkVSOV9BVEkgKi8KLSAgIHsgIDgwODgsIDB4MDAwMDhDQTYgfSwgLyogR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAqLwotICAgeyAgODEyMCwgMHgwMDAwOENBOSB9LCAvKiBHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCAqLwotICAgeyAgODE0NCwgMHgwMDAwMDcwNSB9LCAvKiBHTF9EUkFXX1BJWEVMX1RPS0VOICovCi0gICB7ICA4MTY0LCAweDAwMDAwMzA0IH0sIC8qIEdMX0RTVF9BTFBIQSAqLwotICAgeyAgODE3NywgMHgwMDAwMDMwNiB9LCAvKiBHTF9EU1RfQ09MT1IgKi8KLSAgIHsgIDgxOTAsIDB4MDAwMDg4RUEgfSwgLyogR0xfRFlOQU1JQ19DT1BZICovCi0gICB7ICA4MjA2LCAweDAwMDA4OEVBIH0sIC8qIEdMX0RZTkFNSUNfQ09QWV9BUkIgKi8KLSAgIHsgIDgyMjYsIDB4MDAwMDg4RTggfSwgLyogR0xfRFlOQU1JQ19EUkFXICovCi0gICB7ICA4MjQyLCAweDAwMDA4OEU4IH0sIC8qIEdMX0RZTkFNSUNfRFJBV19BUkIgKi8KLSAgIHsgIDgyNjIsIDB4MDAwMDg4RTkgfSwgLyogR0xfRFlOQU1JQ19SRUFEICovCi0gICB7ICA4Mjc4LCAweDAwMDA4OEU5IH0sIC8qIEdMX0RZTkFNSUNfUkVBRF9BUkIgKi8KLSAgIHsgIDgyOTgsIDB4MDAwMDBCNDMgfSwgLyogR0xfRURHRV9GTEFHICovCi0gICB7ICA4MzExLCAweDAwMDA4MDc5IH0sIC8qIEdMX0VER0VfRkxBR19BUlJBWSAqLwotICAgeyAgODMzMCwgMHgwMDAwODg5QiB9LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgIHsgIDgzNjQsIDB4MDAwMDg4OUIgfSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAgODQwMiwgMHgwMDAwODA5MyB9LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUiAqLwotICAgeyAgODQyOSwgMHgwMDAwODA4QyB9LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0gICB7ICA4NDU1LCAweDAwMDA4ODkzIH0sIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICovCi0gICB7ICA4NDc5LCAweDAwMDA4ODkzIH0sIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiAqLwotICAgeyAgODUwNywgMHgwMDAwODg5NSB9LCAvKiBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7ICA4NTM5LCAweDAwMDA4ODk1IH0sIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCi0gICB7ICA4NTc1LCAweDAwMDAxNjAwIH0sIC8qIEdMX0VNSVNTSU9OICovCi0gICB7ICA4NTg3LCAweDAwMDAyMDAwIH0sIC8qIEdMX0VOQUJMRV9CSVQgKi8KLSAgIHsgIDg2MDEsIDB4MDAwMDAyMDIgfSwgLyogR0xfRVFVQUwgKi8KLSAgIHsgIDg2MTAsIDB4MDAwMDE1MDkgfSwgLyogR0xfRVFVSVYgKi8KLSAgIHsgIDg2MTksIDB4MDAwMTAwMDAgfSwgLyogR0xfRVZBTF9CSVQgKi8KLSAgIHsgIDg2MzEsIDB4MDAwMDA4MDAgfSwgLyogR0xfRVhQICovCi0gICB7ICA4NjM4LCAweDAwMDAwODAxIH0sIC8qIEdMX0VYUDIgKi8KLSAgIHsgIDg2NDYsIDB4MDAwMDFGMDMgfSwgLyogR0xfRVhURU5TSU9OUyAqLwotICAgeyAgODY2MCwgMHgwMDAwMjQwMCB9LCAvKiBHTF9FWUVfTElORUFSICovCi0gICB7ICA4Njc0LCAweDAwMDAyNTAyIH0sIC8qIEdMX0VZRV9QTEFORSAqLwotICAgeyAgODY4NywgMHgwMDAwODU1QyB9LCAvKiBHTF9FWUVfUExBTkVfQUJTT0xVVEVfTlYgKi8KLSAgIHsgIDg3MTIsIDB4MDAwMDg1NUIgfSwgLyogR0xfRVlFX1JBRElBTF9OViAqLwotICAgeyAgODcyOSwgMHgwMDAwMDAwMCB9LCAvKiBHTF9GQUxTRSAqLwotICAgeyAgODczOCwgMHgwMDAwMTEwMSB9LCAvKiBHTF9GQVNURVNUICovCi0gICB7ICA4NzQ5LCAweDAwMDAxQzAxIH0sIC8qIEdMX0ZFRURCQUNLICovCi0gICB7ICA4NzYxLCAweDAwMDAwREYwIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSICovCi0gICB7ICA4Nzg4LCAweDAwMDAwREYxIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFICovCi0gICB7ICA4ODEyLCAweDAwMDAwREYyIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFICovCi0gICB7ICA4ODM2LCAweDAwMDAxQjAyIH0sIC8qIEdMX0ZJTEwgKi8KLSAgIHsgIDg4NDQsIDB4MDAwMDFEMDAgfSwgLyogR0xfRkxBVCAqLwotICAgeyAgODg1MiwgMHgwMDAwMTQwNiB9LCAvKiBHTF9GTE9BVCAqLwotICAgeyAgODg2MSwgMHgwMDAwOEI1QSB9LCAvKiBHTF9GTE9BVF9NQVQyICovCi0gICB7ICA4ODc1LCAweDAwMDA4QjVBIH0sIC8qIEdMX0ZMT0FUX01BVDJfQVJCICovCi0gICB7ICA4ODkzLCAweDAwMDA4QjVCIH0sIC8qIEdMX0ZMT0FUX01BVDMgKi8KLSAgIHsgIDg5MDcsIDB4MDAwMDhCNUIgfSwgLyogR0xfRkxPQVRfTUFUM19BUkIgKi8KLSAgIHsgIDg5MjUsIDB4MDAwMDhCNUMgfSwgLyogR0xfRkxPQVRfTUFUNCAqLwotICAgeyAgODkzOSwgMHgwMDAwOEI1QyB9LCAvKiBHTF9GTE9BVF9NQVQ0X0FSQiAqLwotICAgeyAgODk1NywgMHgwMDAwOEI1MCB9LCAvKiBHTF9GTE9BVF9WRUMyICovCi0gICB7ICA4OTcxLCAweDAwMDA4QjUwIH0sIC8qIEdMX0ZMT0FUX1ZFQzJfQVJCICovCi0gICB7ICA4OTg5LCAweDAwMDA4QjUxIH0sIC8qIEdMX0ZMT0FUX1ZFQzMgKi8KLSAgIHsgIDkwMDMsIDB4MDAwMDhCNTEgfSwgLyogR0xfRkxPQVRfVkVDM19BUkIgKi8KLSAgIHsgIDkwMjEsIDB4MDAwMDhCNTIgfSwgLyogR0xfRkxPQVRfVkVDNCAqLwotICAgeyAgOTAzNSwgMHgwMDAwOEI1MiB9LCAvKiBHTF9GTE9BVF9WRUM0X0FSQiAqLwotICAgeyAgOTA1MywgMHgwMDAwMEI2MCB9LCAvKiBHTF9GT0cgKi8KLSAgIHsgIDkwNjAsIDB4MDAwMDAwODAgfSwgLyogR0xfRk9HX0JJVCAqLwotICAgeyAgOTA3MSwgMHgwMDAwMEI2NiB9LCAvKiBHTF9GT0dfQ09MT1IgKi8KLSAgIHsgIDkwODQsIDB4MDAwMDg0NTEgfSwgLyogR0xfRk9HX0NPT1JEICovCi0gICB7ICA5MDk3LCAweDAwMDA4NDUxIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFICovCi0gICB7ICA5MTE1LCAweDAwMDA4NDU3IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZICovCi0gICB7ICA5MTM5LCAweDAwMDA4ODlEIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7ICA5MTc4LCAweDAwMDA4ODlEIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAgOTIyMSwgMHgwMDAwODQ1NiB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICovCi0gICB7ICA5MjUzLCAweDAwMDA4NDU1IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERSAqLwotICAgeyAgOTI4NCwgMHgwMDAwODQ1NCB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFICovCi0gICB7ICA5MzEzLCAweDAwMDA4NDUwIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRSAqLwotICAgeyAgOTMzOCwgMHgwMDAwODQ1NyB9LCAvKiBHTF9GT0dfQ09PUkRfQVJSQVkgKi8KLSAgIHsgIDkzNTcsIDB4MDAwMDg4OUQgfSwgLyogR0xfRk9HX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7ICA5MzkxLCAweDAwMDA4NDU2IH0sIC8qIEdMX0ZPR19DT09SRF9BUlJBWV9QT0lOVEVSICovCi0gICB7ICA5NDE4LCAweDAwMDA4NDU1IH0sIC8qIEdMX0ZPR19DT09SRF9BUlJBWV9TVFJJREUgKi8KLSAgIHsgIDk0NDQsIDB4MDAwMDg0NTQgfSwgLyogR0xfRk9HX0NPT1JEX0FSUkFZX1RZUEUgKi8KLSAgIHsgIDk0NjgsIDB4MDAwMDg0NTAgfSwgLyogR0xfRk9HX0NPT1JEX1NSQyAqLwotICAgeyAgOTQ4NSwgMHgwMDAwMEI2MiB9LCAvKiBHTF9GT0dfREVOU0lUWSAqLwotICAgeyAgOTUwMCwgMHgwMDAwODU1QSB9LCAvKiBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAqLwotICAgeyAgOTUyNCwgMHgwMDAwMEI2NCB9LCAvKiBHTF9GT0dfRU5EICovCi0gICB7ICA5NTM1LCAweDAwMDAwQzU0IH0sIC8qIEdMX0ZPR19ISU5UICovCi0gICB7ICA5NTQ3LCAweDAwMDAwQjYxIH0sIC8qIEdMX0ZPR19JTkRFWCAqLwotICAgeyAgOTU2MCwgMHgwMDAwMEI2NSB9LCAvKiBHTF9GT0dfTU9ERSAqLwotICAgeyAgOTU3MiwgMHgwMDAwODE5OCB9LCAvKiBHTF9GT0dfT0ZGU0VUX1NHSVggKi8KLSAgIHsgIDk1OTEsIDB4MDAwMDgxOTkgfSwgLyogR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICovCi0gICB7ICA5NjE2LCAweDAwMDAwQjYzIH0sIC8qIEdMX0ZPR19TVEFSVCAqLwotICAgeyAgOTYyOSwgMHgwMDAwODQ1MiB9LCAvKiBHTF9GUkFHTUVOVF9ERVBUSCAqLwotICAgeyAgOTY0NywgMHgwMDAwODgwNCB9LCAvKiBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAqLwotICAgeyAgOTY3MSwgMHgwMDAwOEIzMCB9LCAvKiBHTF9GUkFHTUVOVF9TSEFERVIgKi8KLSAgIHsgIDk2OTAsIDB4MDAwMDhCMzAgfSwgLyogR0xfRlJBR01FTlRfU0hBREVSX0FSQiAqLwotICAgeyAgOTcxMywgMHgwMDAwOEI4QiB9LCAvKiBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UICovCi0gICB7ICA5NzQ4LCAweDAwMDA4Q0QxIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfRVhUICovCi0gICB7ICA5NzkwLCAweDAwMDA4Q0QwIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUICovCi0gICB7ICA5ODMyLCAweDAwMDA4Q0Q0IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCAqLwotICAgeyAgOTg4MSwgMHgwMDAwOENEMyB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9FWFQgKi8KLSAgIHsgIDk5MzMsIDB4MDAwMDhDRDQgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAqLwotICAgeyAgOTk3NywgMHgwMDAwOENEMiB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfRVhUICovCi0gICB7IDEwMDIxLCAweDAwMDA4Q0E2IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUICovCi0gICB7IDEwMDQ4LCAweDAwMDA4Q0Q1IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCAqLwotICAgeyAxMDA3NiwgMHgwMDAwOEQ0MCB9LCAvKiBHTF9GUkFNRUJVRkZFUl9FWFQgKi8KLSAgIHsgMTAwOTUsIDB4MDAwMDhDRDYgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX0VYVCAqLwotICAgeyAxMDEzNiwgMHgwMDAwOENEOSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfRVhUICovCi0gICB7IDEwMTc3LCAweDAwMDA4Q0RCIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfRVhUICovCi0gICB7IDEwMjE5LCAweDAwMDA4Q0Q4IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFVQTElDQVRFX0FUVEFDSE1FTlRfRVhUICovCi0gICB7IDEwMjcwLCAweDAwMDA4Q0RBIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFQgKi8KLSAgIHsgMTAzMDgsIDB4MDAwMDhDRDcgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUICovCi0gICB7IDEwMzU3LCAweDAwMDA4Q0RDIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfRVhUICovCi0gICB7IDEwMzk5LCAweDAwMDA4Q0RFIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX1NUQVRVU19FUlJPUl9FWFQgKi8KLSAgIHsgMTA0MzEsIDB4MDAwMDhDREQgfSwgLyogR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfRVhUICovCi0gICB7IDEwNDYyLCAweDAwMDAwNDA0IH0sIC8qIEdMX0ZST05UICovCi0gICB7IDEwNDcxLCAweDAwMDAwNDA4IH0sIC8qIEdMX0ZST05UX0FORF9CQUNLICovCi0gICB7IDEwNDg5LCAweDAwMDAwQjQ2IH0sIC8qIEdMX0ZST05UX0ZBQ0UgKi8KLSAgIHsgMTA1MDMsIDB4MDAwMDA0MDAgfSwgLyogR0xfRlJPTlRfTEVGVCAqLwotICAgeyAxMDUxNywgMHgwMDAwMDQwMSB9LCAvKiBHTF9GUk9OVF9SSUdIVCAqLwotICAgeyAxMDUzMiwgMHgwMDAwODAwNiB9LCAvKiBHTF9GVU5DX0FERCAqLwotICAgeyAxMDU0NCwgMHgwMDAwODAwNiB9LCAvKiBHTF9GVU5DX0FERF9FWFQgKi8KLSAgIHsgMTA1NjAsIDB4MDAwMDgwMEIgfSwgLyogR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICovCi0gICB7IDEwNTg1LCAweDAwMDA4MDBCIH0sIC8qIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF9FWFQgKi8KLSAgIHsgMTA2MTQsIDB4MDAwMDgwMEEgfSwgLyogR0xfRlVOQ19TVUJUUkFDVCAqLwotICAgeyAxMDYzMSwgMHgwMDAwODAwQSB9LCAvKiBHTF9GVU5DX1NVQlRSQUNUX0VYVCAqLwotICAgeyAxMDY1MiwgMHgwMDAwODE5MSB9LCAvKiBHTF9HRU5FUkFURV9NSVBNQVAgKi8KLSAgIHsgMTA2NzEsIDB4MDAwMDgxOTIgfSwgLyogR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgKi8KLSAgIHsgMTA2OTUsIDB4MDAwMDgxOTIgfSwgLyogR0xfR0VORVJBVEVfTUlQTUFQX0hJTlRfU0dJUyAqLwotICAgeyAxMDcyNCwgMHgwMDAwODE5MSB9LCAvKiBHTF9HRU5FUkFURV9NSVBNQVBfU0dJUyAqLwotICAgeyAxMDc0OCwgMHgwMDAwMDIwNiB9LCAvKiBHTF9HRVFVQUwgKi8KLSAgIHsgMTA3NTgsIDB4MDAwMDgwMDkgfSwgLyogR0xfR0xfQkxFTkRfRVFVQVRJT05fUkdCICovCi0gICB7IDEwNzgzLCAweDAwMDA4QzRBIH0sIC8qIEdMX0dMX0NPTVBSRVNTRURfU0xVTUlOQU5DRSAqLwotICAgeyAxMDgxMSwgMHgwMDAwOEM0QiB9LCAvKiBHTF9HTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfQUxQSEEgKi8KLSAgIHsgMTA4NDUsIDB4MDAwMDhDNDggfSwgLyogR0xfR0xfQ09NUFJFU1NFRF9TUkdCICovCi0gICB7IDEwODY3LCAweDAwMDA4QzQ5IH0sIC8qIEdMX0dMX0NPTVBSRVNTRURfU1JHQl9BTFBIQSAqLwotICAgeyAxMDg5NSwgMHgwMDAwODQ1RiB9LCAvKiBHTF9HTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgKi8KLSAgIHsgMTA5MzIsIDB4MDAwMDhCNjUgfSwgLyogR0xfR0xfRkxPQVRfTUFUMngzICovCi0gICB7IDEwOTUxLCAweDAwMDA4QjY2IH0sIC8qIEdMX0dMX0ZMT0FUX01BVDJ4NCAqLwotICAgeyAxMDk3MCwgMHgwMDAwOEI2NyB9LCAvKiBHTF9HTF9GTE9BVF9NQVQzeDIgKi8KLSAgIHsgMTA5ODksIDB4MDAwMDhCNjggfSwgLyogR0xfR0xfRkxPQVRfTUFUM3g0ICovCi0gICB7IDExMDA4LCAweDAwMDA4QjY5IH0sIC8qIEdMX0dMX0ZMT0FUX01BVDR4MiAqLwotICAgeyAxMTAyNywgMHgwMDAwOEI2QSB9LCAvKiBHTF9HTF9GTE9BVF9NQVQ0eDMgKi8KLSAgIHsgMTEwNDYsIDB4MDAwMDg4RUIgfSwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVIgKi8KLSAgIHsgMTEwNzAsIDB4MDAwMDg4RUQgfSwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElORyAqLwotICAgeyAxMTEwMiwgMHgwMDAwODhFQyB9LCAvKiBHTF9HTF9QSVhFTF9VTlBBQ0tfQlVGRkVSICovCi0gICB7IDExMTI4LCAweDAwMDA4OEVGIH0sIC8qIEdMX0dMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElORyAqLwotICAgeyAxMTE2MiwgMHgwMDAwOEM0NiB9LCAvKiBHTF9HTF9TTFVNSU5BTkNFICovCi0gICB7IDExMTc5LCAweDAwMDA4QzQ3IH0sIC8qIEdMX0dMX1NMVU1JTkFOQ0U4ICovCi0gICB7IDExMTk3LCAweDAwMDA4QzQ1IH0sIC8qIEdMX0dMX1NMVU1JTkFOQ0U4X0FMUEhBOCAqLwotICAgeyAxMTIyMiwgMHgwMDAwOEM0NCB9LCAvKiBHTF9HTF9TTFVNSU5BTkNFX0FMUEhBICovCi0gICB7IDExMjQ1LCAweDAwMDA4QzQwIH0sIC8qIEdMX0dMX1NSR0IgKi8KLSAgIHsgMTEyNTYsIDB4MDAwMDhDNDEgfSwgLyogR0xfR0xfU1JHQjggKi8KLSAgIHsgMTEyNjgsIDB4MDAwMDhDNDMgfSwgLyogR0xfR0xfU1JHQjhfQUxQSEE4ICovCi0gICB7IDExMjg3LCAweDAwMDA4QzQyIH0sIC8qIEdMX0dMX1NSR0JfQUxQSEEgKi8KLSAgIHsgMTEzMDQsIDB4MDAwMDAyMDQgfSwgLyogR0xfR1JFQVRFUiAqLwotICAgeyAxMTMxNSwgMHgwMDAwMTkwNCB9LCAvKiBHTF9HUkVFTiAqLwotICAgeyAxMTMyNCwgMHgwMDAwMEQxOSB9LCAvKiBHTF9HUkVFTl9CSUFTICovCi0gICB7IDExMzM4LCAweDAwMDAwRDUzIH0sIC8qIEdMX0dSRUVOX0JJVFMgKi8KLSAgIHsgMTEzNTIsIDB4MDAwMDBEMTggfSwgLyogR0xfR1JFRU5fU0NBTEUgKi8KLSAgIHsgMTEzNjcsIDB4MDAwMDgwMDAgfSwgLyogR0xfSElOVF9CSVQgKi8KLSAgIHsgMTEzNzksIDB4MDAwMDgwMjQgfSwgLyogR0xfSElTVE9HUkFNICovCi0gICB7IDExMzkyLCAweDAwMDA4MDJCIH0sIC8qIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFICovCi0gICB7IDExNDE2LCAweDAwMDA4MDJCIH0sIC8qIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFX0VYVCAqLwotICAgeyAxMTQ0NCwgMHgwMDAwODAyQSB9LCAvKiBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICovCi0gICB7IDExNDY3LCAweDAwMDA4MDJBIH0sIC8qIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkVfRVhUICovCi0gICB7IDExNDk0LCAweDAwMDA4MDI0IH0sIC8qIEdMX0hJU1RPR1JBTV9FWFQgKi8KLSAgIHsgMTE1MTEsIDB4MDAwMDgwMjcgfSwgLyogR0xfSElTVE9HUkFNX0ZPUk1BVCAqLwotICAgeyAxMTUzMSwgMHgwMDAwODAyNyB9LCAvKiBHTF9ISVNUT0dSQU1fRk9STUFUX0VYVCAqLwotICAgeyAxMTU1NSwgMHgwMDAwODAyOSB9LCAvKiBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRSAqLwotICAgeyAxMTU3OSwgMHgwMDAwODAyOSB9LCAvKiBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRV9FWFQgKi8KLSAgIHsgMTE2MDcsIDB4MDAwMDgwMkMgfSwgLyogR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICovCi0gICB7IDExNjM1LCAweDAwMDA4MDJDIH0sIC8qIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRV9FWFQgKi8KLSAgIHsgMTE2NjcsIDB4MDAwMDgwMjggfSwgLyogR0xfSElTVE9HUkFNX1JFRF9TSVpFICovCi0gICB7IDExNjg5LCAweDAwMDA4MDI4IH0sIC8qIEdMX0hJU1RPR1JBTV9SRURfU0laRV9FWFQgKi8KLSAgIHsgMTE3MTUsIDB4MDAwMDgwMkQgfSwgLyogR0xfSElTVE9HUkFNX1NJTksgKi8KLSAgIHsgMTE3MzMsIDB4MDAwMDgwMkQgfSwgLyogR0xfSElTVE9HUkFNX1NJTktfRVhUICovCi0gICB7IDExNzU1LCAweDAwMDA4MDI2IH0sIC8qIEdMX0hJU1RPR1JBTV9XSURUSCAqLwotICAgeyAxMTc3NCwgMHgwMDAwODAyNiB9LCAvKiBHTF9ISVNUT0dSQU1fV0lEVEhfRVhUICovCi0gICB7IDExNzk3LCAweDAwMDA4NjJBIH0sIC8qIEdMX0lERU5USVRZX05WICovCi0gICB7IDExODEyLCAweDAwMDA4MTUwIH0sIC8qIEdMX0lHTk9SRV9CT1JERVJfSFAgKi8KLSAgIHsgMTE4MzIsIDB4MDAwMDhCOUIgfSwgLyogR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICovCi0gICB7IDExODcyLCAweDAwMDA4QjlBIH0sIC8qIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgKi8KLSAgIHsgMTE5MTAsIDB4MDAwMDFFMDIgfSwgLyogR0xfSU5DUiAqLwotICAgeyAxMTkxOCwgMHgwMDAwODUwNyB9LCAvKiBHTF9JTkNSX1dSQVAgKi8KLSAgIHsgMTE5MzEsIDB4MDAwMDg1MDcgfSwgLyogR0xfSU5DUl9XUkFQX0VYVCAqLwotICAgeyAxMTk0OCwgMHgwMDAwODA3NyB9LCAvKiBHTF9JTkRFWF9BUlJBWSAqLwotICAgeyAxMTk2MywgMHgwMDAwODg5OSB9LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgeyAxMTk5MywgMHgwMDAwODg5OSB9LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KLSAgIHsgMTIwMjcsIDB4MDAwMDgwOTEgfSwgLyogR0xfSU5ERVhfQVJSQVlfUE9JTlRFUiAqLwotICAgeyAxMjA1MCwgMHgwMDAwODA4NiB9LCAvKiBHTF9JTkRFWF9BUlJBWV9TVFJJREUgKi8KLSAgIHsgMTIwNzIsIDB4MDAwMDgwODUgfSwgLyogR0xfSU5ERVhfQVJSQVlfVFlQRSAqLwotICAgeyAxMjA5MiwgMHgwMDAwMEQ1MSB9LCAvKiBHTF9JTkRFWF9CSVRTICovCi0gICB7IDEyMTA2LCAweDAwMDAwQzIwIH0sIC8qIEdMX0lOREVYX0NMRUFSX1ZBTFVFICovCi0gICB7IDEyMTI3LCAweDAwMDAwQkYxIH0sIC8qIEdMX0lOREVYX0xPR0lDX09QICovCi0gICB7IDEyMTQ1LCAweDAwMDAwQzMwIH0sIC8qIEdMX0lOREVYX01PREUgKi8KLSAgIHsgMTIxNTksIDB4MDAwMDBEMTMgfSwgLyogR0xfSU5ERVhfT0ZGU0VUICovCi0gICB7IDEyMTc1LCAweDAwMDAwRDEyIH0sIC8qIEdMX0lOREVYX1NISUZUICovCi0gICB7IDEyMTkwLCAweDAwMDAwQzIxIH0sIC8qIEdMX0lOREVYX1dSSVRFTUFTSyAqLwotICAgeyAxMjIwOSwgMHgwMDAwOEI4NCB9LCAvKiBHTF9JTkZPX0xPR19MRU5HVEggKi8KLSAgIHsgMTIyMjgsIDB4MDAwMDE0MDQgfSwgLyogR0xfSU5UICovCi0gICB7IDEyMjM1LCAweDAwMDA4MDQ5IH0sIC8qIEdMX0lOVEVOU0lUWSAqLwotICAgeyAxMjI0OCwgMHgwMDAwODA0QyB9LCAvKiBHTF9JTlRFTlNJVFkxMiAqLwotICAgeyAxMjI2MywgMHgwMDAwODA0QyB9LCAvKiBHTF9JTlRFTlNJVFkxMl9FWFQgKi8KLSAgIHsgMTIyODIsIDB4MDAwMDgwNEQgfSwgLyogR0xfSU5URU5TSVRZMTYgKi8KLSAgIHsgMTIyOTcsIDB4MDAwMDgwNEQgfSwgLyogR0xfSU5URU5TSVRZMTZfRVhUICovCi0gICB7IDEyMzE2LCAweDAwMDA4MDRBIH0sIC8qIEdMX0lOVEVOU0lUWTQgKi8KLSAgIHsgMTIzMzAsIDB4MDAwMDgwNEEgfSwgLyogR0xfSU5URU5TSVRZNF9FWFQgKi8KLSAgIHsgMTIzNDgsIDB4MDAwMDgwNEIgfSwgLyogR0xfSU5URU5TSVRZOCAqLwotICAgeyAxMjM2MiwgMHgwMDAwODA0QiB9LCAvKiBHTF9JTlRFTlNJVFk4X0VYVCAqLwotICAgeyAxMjM4MCwgMHgwMDAwODA0OSB9LCAvKiBHTF9JTlRFTlNJVFlfRVhUICovCi0gICB7IDEyMzk3LCAweDAwMDA4NTc1IH0sIC8qIEdMX0lOVEVSUE9MQVRFICovCi0gICB7IDEyNDEyLCAweDAwMDA4NTc1IH0sIC8qIEdMX0lOVEVSUE9MQVRFX0FSQiAqLwotICAgeyAxMjQzMSwgMHgwMDAwODU3NSB9LCAvKiBHTF9JTlRFUlBPTEFURV9FWFQgKi8KLSAgIHsgMTI0NTAsIDB4MDAwMDhCNTMgfSwgLyogR0xfSU5UX1ZFQzIgKi8KLSAgIHsgMTI0NjIsIDB4MDAwMDhCNTMgfSwgLyogR0xfSU5UX1ZFQzJfQVJCICovCi0gICB7IDEyNDc4LCAweDAwMDA4QjU0IH0sIC8qIEdMX0lOVF9WRUMzICovCi0gICB7IDEyNDkwLCAweDAwMDA4QjU0IH0sIC8qIEdMX0lOVF9WRUMzX0FSQiAqLwotICAgeyAxMjUwNiwgMHgwMDAwOEI1NSB9LCAvKiBHTF9JTlRfVkVDNCAqLwotICAgeyAxMjUxOCwgMHgwMDAwOEI1NSB9LCAvKiBHTF9JTlRfVkVDNF9BUkIgKi8KLSAgIHsgMTI1MzQsIDB4MDAwMDA1MDAgfSwgLyogR0xfSU5WQUxJRF9FTlVNICovCi0gICB7IDEyNTUwLCAweDAwMDAwNTA2IH0sIC8qIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAqLwotICAgeyAxMjU4NywgMHgwMDAwMDUwMiB9LCAvKiBHTF9JTlZBTElEX09QRVJBVElPTiAqLwotICAgeyAxMjYwOCwgMHgwMDAwMDUwMSB9LCAvKiBHTF9JTlZBTElEX1ZBTFVFICovCi0gICB7IDEyNjI1LCAweDAwMDA4NjJCIH0sIC8qIEdMX0lOVkVSU0VfTlYgKi8KLSAgIHsgMTI2MzksIDB4MDAwMDg2MkQgfSwgLyogR0xfSU5WRVJTRV9UUkFOU1BPU0VfTlYgKi8KLSAgIHsgMTI2NjMsIDB4MDAwMDE1MEEgfSwgLyogR0xfSU5WRVJUICovCi0gICB7IDEyNjczLCAweDAwMDAxRTAwIH0sIC8qIEdMX0tFRVAgKi8KLSAgIHsgMTI2ODEsIDB4MDAwMDA0MDYgfSwgLyogR0xfTEVGVCAqLwotICAgeyAxMjY4OSwgMHgwMDAwMDIwMyB9LCAvKiBHTF9MRVFVQUwgKi8KLSAgIHsgMTI2OTksIDB4MDAwMDAyMDEgfSwgLyogR0xfTEVTUyAqLwotICAgeyAxMjcwNywgMHgwMDAwNDAwMCB9LCAvKiBHTF9MSUdIVDAgKi8KLSAgIHsgMTI3MTcsIDB4MDAwMDQwMDEgfSwgLyogR0xfTElHSFQxICovCi0gICB7IDEyNzI3LCAweDAwMDA0MDAyIH0sIC8qIEdMX0xJR0hUMiAqLwotICAgeyAxMjczNywgMHgwMDAwNDAwMyB9LCAvKiBHTF9MSUdIVDMgKi8KLSAgIHsgMTI3NDcsIDB4MDAwMDQwMDQgfSwgLyogR0xfTElHSFQ0ICovCi0gICB7IDEyNzU3LCAweDAwMDA0MDA1IH0sIC8qIEdMX0xJR0hUNSAqLwotICAgeyAxMjc2NywgMHgwMDAwNDAwNiB9LCAvKiBHTF9MSUdIVDYgKi8KLSAgIHsgMTI3NzcsIDB4MDAwMDQwMDcgfSwgLyogR0xfTElHSFQ3ICovCi0gICB7IDEyNzg3LCAweDAwMDAwQjUwIH0sIC8qIEdMX0xJR0hUSU5HICovCi0gICB7IDEyNzk5LCAweDAwMDAwMDQwIH0sIC8qIEdMX0xJR0hUSU5HX0JJVCAqLwotICAgeyAxMjgxNSwgMHgwMDAwMEI1MyB9LCAvKiBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICovCi0gICB7IDEyODM4LCAweDAwMDA4MUY4IH0sIC8qIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wgKi8KLSAgIHsgMTI4NjcsIDB4MDAwMDgxRjggfSwgLyogR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTF9FWFQgKi8KLSAgIHsgMTI5MDAsIDB4MDAwMDBCNTEgfSwgLyogR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0gICB7IDEyOTI4LCAweDAwMDAwQjUyIH0sIC8qIEdMX0xJR0hUX01PREVMX1RXT19TSURFICovCi0gICB7IDEyOTUyLCAweDAwMDAxQjAxIH0sIC8qIEdMX0xJTkUgKi8KLSAgIHsgMTI5NjAsIDB4MDAwMDI2MDEgfSwgLyogR0xfTElORUFSICovCi0gICB7IDEyOTcwLCAweDAwMDAxMjA4IH0sIC8qIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAqLwotICAgeyAxMjk5MiwgMHgwMDAwODE3MCB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9MSU5FQVJfU0dJWCAqLwotICAgeyAxMzAyMiwgMHgwMDAwODQ0RiB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9ORUFSRVNUX1NHSVggKi8KLSAgIHsgMTMwNTMsIDB4MDAwMDI3MDMgfSwgLyogR0xfTElORUFSX01JUE1BUF9MSU5FQVIgKi8KLSAgIHsgMTMwNzcsIDB4MDAwMDI3MDEgfSwgLyogR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICovCi0gICB7IDEzMTAyLCAweDAwMDAwMDAxIH0sIC8qIEdMX0xJTkVTICovCi0gICB7IDEzMTExLCAweDAwMDAwMDA0IH0sIC8qIEdMX0xJTkVfQklUICovCi0gICB7IDEzMTIzLCAweDAwMDAwMDAyIH0sIC8qIEdMX0xJTkVfTE9PUCAqLwotICAgeyAxMzEzNiwgMHgwMDAwMDcwNyB9LCAvKiBHTF9MSU5FX1JFU0VUX1RPS0VOICovCi0gICB7IDEzMTU2LCAweDAwMDAwQjIwIH0sIC8qIEdMX0xJTkVfU01PT1RIICovCi0gICB7IDEzMTcxLCAweDAwMDAwQzUyIH0sIC8qIEdMX0xJTkVfU01PT1RIX0hJTlQgKi8KLSAgIHsgMTMxOTEsIDB4MDAwMDBCMjQgfSwgLyogR0xfTElORV9TVElQUExFICovCi0gICB7IDEzMjA3LCAweDAwMDAwQjI1IH0sIC8qIEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOICovCi0gICB7IDEzMjMxLCAweDAwMDAwQjI2IH0sIC8qIEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgKi8KLSAgIHsgMTMyNTQsIDB4MDAwMDAwMDMgfSwgLyogR0xfTElORV9TVFJJUCAqLwotICAgeyAxMzI2OCwgMHgwMDAwMDcwMiB9LCAvKiBHTF9MSU5FX1RPS0VOICovCi0gICB7IDEzMjgyLCAweDAwMDAwQjIxIH0sIC8qIEdMX0xJTkVfV0lEVEggKi8KLSAgIHsgMTMyOTYsIDB4MDAwMDBCMjMgfSwgLyogR0xfTElORV9XSURUSF9HUkFOVUxBUklUWSAqLwotICAgeyAxMzMyMiwgMHgwMDAwMEIyMiB9LCAvKiBHTF9MSU5FX1dJRFRIX1JBTkdFICovCi0gICB7IDEzMzQyLCAweDAwMDA4QjgyIH0sIC8qIEdMX0xJTktfU1RBVFVTICovCi0gICB7IDEzMzU3LCAweDAwMDAwQjMyIH0sIC8qIEdMX0xJU1RfQkFTRSAqLwotICAgeyAxMzM3MCwgMHgwMDAyMDAwMCB9LCAvKiBHTF9MSVNUX0JJVCAqLwotICAgeyAxMzM4MiwgMHgwMDAwMEIzMyB9LCAvKiBHTF9MSVNUX0lOREVYICovCi0gICB7IDEzMzk2LCAweDAwMDAwQjMwIH0sIC8qIEdMX0xJU1RfTU9ERSAqLwotICAgeyAxMzQwOSwgMHgwMDAwMDEwMSB9LCAvKiBHTF9MT0FEICovCi0gICB7IDEzNDE3LCAweDAwMDAwQkYxIH0sIC8qIEdMX0xPR0lDX09QICovCi0gICB7IDEzNDI5LCAweDAwMDAwQkYwIH0sIC8qIEdMX0xPR0lDX09QX01PREUgKi8KLSAgIHsgMTM0NDYsIDB4MDAwMDhDQTEgfSwgLyogR0xfTE9XRVJfTEVGVCAqLwotICAgeyAxMzQ2MCwgMHgwMDAwMTkwOSB9LCAvKiBHTF9MVU1JTkFOQ0UgKi8KLSAgIHsgMTM0NzMsIDB4MDAwMDgwNDEgfSwgLyogR0xfTFVNSU5BTkNFMTIgKi8KLSAgIHsgMTM0ODgsIDB4MDAwMDgwNDcgfSwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEExMiAqLwotICAgeyAxMzUxMSwgMHgwMDAwODA0NyB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyX0VYVCAqLwotICAgeyAxMzUzOCwgMHgwMDAwODA0NiB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTQgKi8KLSAgIHsgMTM1NjAsIDB4MDAwMDgwNDYgfSwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEE0X0VYVCAqLwotICAgeyAxMzU4NiwgMHgwMDAwODA0MSB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9FWFQgKi8KLSAgIHsgMTM2MDUsIDB4MDAwMDgwNDIgfSwgLyogR0xfTFVNSU5BTkNFMTYgKi8KLSAgIHsgMTM2MjAsIDB4MDAwMDgwNDggfSwgLyogR0xfTFVNSU5BTkNFMTZfQUxQSEExNiAqLwotICAgeyAxMzY0MywgMHgwMDAwODA0OCB9LCAvKiBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2X0VYVCAqLwotICAgeyAxMzY3MCwgMHgwMDAwODA0MiB9LCAvKiBHTF9MVU1JTkFOQ0UxNl9FWFQgKi8KLSAgIHsgMTM2ODksIDB4MDAwMDgwM0YgfSwgLyogR0xfTFVNSU5BTkNFNCAqLwotICAgeyAxMzcwMywgMHgwMDAwODA0MyB9LCAvKiBHTF9MVU1JTkFOQ0U0X0FMUEhBNCAqLwotICAgeyAxMzcyNCwgMHgwMDAwODA0MyB9LCAvKiBHTF9MVU1JTkFOQ0U0X0FMUEhBNF9FWFQgKi8KLSAgIHsgMTM3NDksIDB4MDAwMDgwM0YgfSwgLyogR0xfTFVNSU5BTkNFNF9FWFQgKi8KLSAgIHsgMTM3NjcsIDB4MDAwMDgwNDQgfSwgLyogR0xfTFVNSU5BTkNFNl9BTFBIQTIgKi8KLSAgIHsgMTM3ODgsIDB4MDAwMDgwNDQgfSwgLyogR0xfTFVNSU5BTkNFNl9BTFBIQTJfRVhUICovCi0gICB7IDEzODEzLCAweDAwMDA4MDQwIH0sIC8qIEdMX0xVTUlOQU5DRTggKi8KLSAgIHsgMTM4MjcsIDB4MDAwMDgwNDUgfSwgLyogR0xfTFVNSU5BTkNFOF9BTFBIQTggKi8KLSAgIHsgMTM4NDgsIDB4MDAwMDgwNDUgfSwgLyogR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICovCi0gICB7IDEzODczLCAweDAwMDA4MDQwIH0sIC8qIEdMX0xVTUlOQU5DRThfRVhUICovCi0gICB7IDEzODkxLCAweDAwMDAxOTBBIH0sIC8qIEdMX0xVTUlOQU5DRV9BTFBIQSAqLwotICAgeyAxMzkxMCwgMHgwMDAwMEQ5MCB9LCAvKiBHTF9NQVAxX0NPTE9SXzQgKi8KLSAgIHsgMTM5MjYsIDB4MDAwMDBERDAgfSwgLyogR0xfTUFQMV9HUklEX0RPTUFJTiAqLwotICAgeyAxMzk0NiwgMHgwMDAwMEREMSB9LCAvKiBHTF9NQVAxX0dSSURfU0VHTUVOVFMgKi8KLSAgIHsgMTM5NjgsIDB4MDAwMDBEOTEgfSwgLyogR0xfTUFQMV9JTkRFWCAqLwotICAgeyAxMzk4MiwgMHgwMDAwMEQ5MiB9LCAvKiBHTF9NQVAxX05PUk1BTCAqLwotICAgeyAxMzk5NywgMHgwMDAwMEQ5MyB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotICAgeyAxNDAyMSwgMHgwMDAwMEQ5NCB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLwotICAgeyAxNDA0NSwgMHgwMDAwMEQ5NSB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMyAqLwotICAgeyAxNDA2OSwgMHgwMDAwMEQ5NiB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotICAgeyAxNDA5MywgMHgwMDAwMEQ5NyB9LCAvKiBHTF9NQVAxX1ZFUlRFWF8zICovCi0gICB7IDE0MTEwLCAweDAwMDAwRDk4IH0sIC8qIEdMX01BUDFfVkVSVEVYXzQgKi8KLSAgIHsgMTQxMjcsIDB4MDAwMDg2NjAgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMF80X05WICovCi0gICB7IDE0MTU1LCAweDAwMDA4NjZBIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEwXzRfTlYgKi8KLSAgIHsgMTQxODQsIDB4MDAwMDg2NkIgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAqLwotICAgeyAxNDIxMywgMHgwMDAwODY2QyB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICovCi0gICB7IDE0MjQyLCAweDAwMDA4NjZEIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEzXzRfTlYgKi8KLSAgIHsgMTQyNzEsIDB4MDAwMDg2NkUgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAqLwotICAgeyAxNDMwMCwgMHgwMDAwODY2RiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICovCi0gICB7IDE0MzI5LCAweDAwMDA4NjYxIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjFfNF9OViAqLwotICAgeyAxNDM1NywgMHgwMDAwODY2MiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIyXzRfTlYgKi8KLSAgIHsgMTQzODUsIDB4MDAwMDg2NjMgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCM180X05WICovCi0gICB7IDE0NDEzLCAweDAwMDA4NjY0IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjRfNF9OViAqLwotICAgeyAxNDQ0MSwgMHgwMDAwODY2NSB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI1XzRfTlYgKi8KLSAgIHsgMTQ0NjksIDB4MDAwMDg2NjYgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCNl80X05WICovCi0gICB7IDE0NDk3LCAweDAwMDA4NjY3IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjdfNF9OViAqLwotICAgeyAxNDUyNSwgMHgwMDAwODY2OCB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI4XzRfTlYgKi8KLSAgIHsgMTQ1NTMsIDB4MDAwMDg2NjkgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCOV80X05WICovCi0gICB7IDE0NTgxLCAweDAwMDAwREIwIH0sIC8qIEdMX01BUDJfQ09MT1JfNCAqLwotICAgeyAxNDU5NywgMHgwMDAwMEREMiB9LCAvKiBHTF9NQVAyX0dSSURfRE9NQUlOICovCi0gICB7IDE0NjE3LCAweDAwMDAwREQzIH0sIC8qIEdMX01BUDJfR1JJRF9TRUdNRU5UUyAqLwotICAgeyAxNDYzOSwgMHgwMDAwMERCMSB9LCAvKiBHTF9NQVAyX0lOREVYICovCi0gICB7IDE0NjUzLCAweDAwMDAwREIyIH0sIC8qIEdMX01BUDJfTk9STUFMICovCi0gICB7IDE0NjY4LCAweDAwMDAwREIzIH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xICovCi0gICB7IDE0NjkyLCAweDAwMDAwREI0IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0gICB7IDE0NzE2LCAweDAwMDAwREI1IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCi0gICB7IDE0NzQwLCAweDAwMDAwREI2IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF80ICovCi0gICB7IDE0NzY0LCAweDAwMDAwREI3IH0sIC8qIEdMX01BUDJfVkVSVEVYXzMgKi8KLSAgIHsgMTQ3ODEsIDB4MDAwMDBEQjggfSwgLyogR0xfTUFQMl9WRVJURVhfNCAqLwotICAgeyAxNDc5OCwgMHgwMDAwODY3MCB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlYgKi8KLSAgIHsgMTQ4MjYsIDB4MDAwMDg2N0EgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAqLwotICAgeyAxNDg1NSwgMHgwMDAwODY3QiB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICovCi0gICB7IDE0ODg0LCAweDAwMDA4NjdDIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEyXzRfTlYgKi8KLSAgIHsgMTQ5MTMsIDB4MDAwMDg2N0QgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAqLwotICAgeyAxNDk0MiwgMHgwMDAwODY3RSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICovCi0gICB7IDE0OTcxLCAweDAwMDA4NjdGIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE1XzRfTlYgKi8KLSAgIHsgMTUwMDAsIDB4MDAwMDg2NzEgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMV80X05WICovCi0gICB7IDE1MDI4LCAweDAwMDA4NjcyIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjJfNF9OViAqLwotICAgeyAxNTA1NiwgMHgwMDAwODY3MyB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlYgKi8KLSAgIHsgMTUwODQsIDB4MDAwMDg2NzQgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCNF80X05WICovCi0gICB7IDE1MTEyLCAweDAwMDA4Njc1IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjVfNF9OViAqLwotICAgeyAxNTE0MCwgMHgwMDAwODY3NiB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlYgKi8KLSAgIHsgMTUxNjgsIDB4MDAwMDg2NzcgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCN180X05WICovCi0gICB7IDE1MTk2LCAweDAwMDA4Njc4IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjhfNF9OViAqLwotICAgeyAxNTIyNCwgMHgwMDAwODY3OSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI5XzRfTlYgKi8KLSAgIHsgMTUyNTIsIDB4MDAwMDBEMTAgfSwgLyogR0xfTUFQX0NPTE9SICovCi0gICB7IDE1MjY1LCAweDAwMDAwRDExIH0sIC8qIEdMX01BUF9TVEVOQ0lMICovCi0gICB7IDE1MjgwLCAweDAwMDA4OEMwIH0sIC8qIEdMX01BVFJJWDBfQVJCICovCi0gICB7IDE1Mjk1LCAweDAwMDA4NjMwIH0sIC8qIEdMX01BVFJJWDBfTlYgKi8KLSAgIHsgMTUzMDksIDB4MDAwMDg4Q0EgfSwgLyogR0xfTUFUUklYMTBfQVJCICovCi0gICB7IDE1MzI1LCAweDAwMDA4OENCIH0sIC8qIEdMX01BVFJJWDExX0FSQiAqLwotICAgeyAxNTM0MSwgMHgwMDAwODhDQyB9LCAvKiBHTF9NQVRSSVgxMl9BUkIgKi8KLSAgIHsgMTUzNTcsIDB4MDAwMDg4Q0QgfSwgLyogR0xfTUFUUklYMTNfQVJCICovCi0gICB7IDE1MzczLCAweDAwMDA4OENFIH0sIC8qIEdMX01BVFJJWDE0X0FSQiAqLwotICAgeyAxNTM4OSwgMHgwMDAwODhDRiB9LCAvKiBHTF9NQVRSSVgxNV9BUkIgKi8KLSAgIHsgMTU0MDUsIDB4MDAwMDg4RDAgfSwgLyogR0xfTUFUUklYMTZfQVJCICovCi0gICB7IDE1NDIxLCAweDAwMDA4OEQxIH0sIC8qIEdMX01BVFJJWDE3X0FSQiAqLwotICAgeyAxNTQzNywgMHgwMDAwODhEMiB9LCAvKiBHTF9NQVRSSVgxOF9BUkIgKi8KLSAgIHsgMTU0NTMsIDB4MDAwMDg4RDMgfSwgLyogR0xfTUFUUklYMTlfQVJCICovCi0gICB7IDE1NDY5LCAweDAwMDA4OEMxIH0sIC8qIEdMX01BVFJJWDFfQVJCICovCi0gICB7IDE1NDg0LCAweDAwMDA4NjMxIH0sIC8qIEdMX01BVFJJWDFfTlYgKi8KLSAgIHsgMTU0OTgsIDB4MDAwMDg4RDQgfSwgLyogR0xfTUFUUklYMjBfQVJCICovCi0gICB7IDE1NTE0LCAweDAwMDA4OEQ1IH0sIC8qIEdMX01BVFJJWDIxX0FSQiAqLwotICAgeyAxNTUzMCwgMHgwMDAwODhENiB9LCAvKiBHTF9NQVRSSVgyMl9BUkIgKi8KLSAgIHsgMTU1NDYsIDB4MDAwMDg4RDcgfSwgLyogR0xfTUFUUklYMjNfQVJCICovCi0gICB7IDE1NTYyLCAweDAwMDA4OEQ4IH0sIC8qIEdMX01BVFJJWDI0X0FSQiAqLwotICAgeyAxNTU3OCwgMHgwMDAwODhEOSB9LCAvKiBHTF9NQVRSSVgyNV9BUkIgKi8KLSAgIHsgMTU1OTQsIDB4MDAwMDg4REEgfSwgLyogR0xfTUFUUklYMjZfQVJCICovCi0gICB7IDE1NjEwLCAweDAwMDA4OERCIH0sIC8qIEdMX01BVFJJWDI3X0FSQiAqLwotICAgeyAxNTYyNiwgMHgwMDAwODhEQyB9LCAvKiBHTF9NQVRSSVgyOF9BUkIgKi8KLSAgIHsgMTU2NDIsIDB4MDAwMDg4REQgfSwgLyogR0xfTUFUUklYMjlfQVJCICovCi0gICB7IDE1NjU4LCAweDAwMDA4OEMyIH0sIC8qIEdMX01BVFJJWDJfQVJCICovCi0gICB7IDE1NjczLCAweDAwMDA4NjMyIH0sIC8qIEdMX01BVFJJWDJfTlYgKi8KLSAgIHsgMTU2ODcsIDB4MDAwMDg4REUgfSwgLyogR0xfTUFUUklYMzBfQVJCICovCi0gICB7IDE1NzAzLCAweDAwMDA4OERGIH0sIC8qIEdMX01BVFJJWDMxX0FSQiAqLwotICAgeyAxNTcxOSwgMHgwMDAwODhDMyB9LCAvKiBHTF9NQVRSSVgzX0FSQiAqLwotICAgeyAxNTczNCwgMHgwMDAwODYzMyB9LCAvKiBHTF9NQVRSSVgzX05WICovCi0gICB7IDE1NzQ4LCAweDAwMDA4OEM0IH0sIC8qIEdMX01BVFJJWDRfQVJCICovCi0gICB7IDE1NzYzLCAweDAwMDA4NjM0IH0sIC8qIEdMX01BVFJJWDRfTlYgKi8KLSAgIHsgMTU3NzcsIDB4MDAwMDg4QzUgfSwgLyogR0xfTUFUUklYNV9BUkIgKi8KLSAgIHsgMTU3OTIsIDB4MDAwMDg2MzUgfSwgLyogR0xfTUFUUklYNV9OViAqLwotICAgeyAxNTgwNiwgMHgwMDAwODhDNiB9LCAvKiBHTF9NQVRSSVg2X0FSQiAqLwotICAgeyAxNTgyMSwgMHgwMDAwODYzNiB9LCAvKiBHTF9NQVRSSVg2X05WICovCi0gICB7IDE1ODM1LCAweDAwMDA4OEM3IH0sIC8qIEdMX01BVFJJWDdfQVJCICovCi0gICB7IDE1ODUwLCAweDAwMDA4NjM3IH0sIC8qIEdMX01BVFJJWDdfTlYgKi8KLSAgIHsgMTU4NjQsIDB4MDAwMDg4QzggfSwgLyogR0xfTUFUUklYOF9BUkIgKi8KLSAgIHsgMTU4NzksIDB4MDAwMDg4QzkgfSwgLyogR0xfTUFUUklYOV9BUkIgKi8KLSAgIHsgMTU4OTQsIDB4MDAwMDg4NDQgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX0FSQiAqLwotICAgeyAxNTkyMCwgMHgwMDAwODg0OSB9LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgKi8KLSAgIHsgMTU5NTQsIDB4MDAwMDg4NDYgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfQVJCICovCi0gICB7IDE1OTg1LCAweDAwMDA4ODQ4IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfQVJCICovCi0gICB7IDE2MDE4LCAweDAwMDA4ODQ3IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX0FSQiAqLwotICAgeyAxNjA0OSwgMHgwMDAwMEJBMCB9LCAvKiBHTF9NQVRSSVhfTU9ERSAqLwotICAgeyAxNjA2NCwgMHgwMDAwODg0MCB9LCAvKiBHTF9NQVRSSVhfUEFMRVRURV9BUkIgKi8KLSAgIHsgMTYwODYsIDB4MDAwMDgwMDggfSwgLyogR0xfTUFYICovCi0gICB7IDE2MDkzLCAweDAwMDA4MDczIH0sIC8qIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgKi8KLSAgIHsgMTYxMTYsIDB4MDAwMDg4RkYgfSwgLyogR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCAqLwotICAgeyAxNjE0OCwgMHgwMDAwMEQzNSB9LCAvKiBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIICovCi0gICB7IDE2MTc0LCAweDAwMDAwRDNCIH0sIC8qIEdMX01BWF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIICovCi0gICB7IDE2MjA3LCAweDAwMDA4MTc3IH0sIC8qIEdMX01BWF9DTElQTUFQX0RFUFRIX1NHSVggKi8KLSAgIHsgMTYyMzMsIDB4MDAwMDgxNzggfSwgLyogR0xfTUFYX0NMSVBNQVBfVklSVFVBTF9ERVBUSF9TR0lYICovCi0gICB7IDE2MjY3LCAweDAwMDAwRDMyIH0sIC8qIEdMX01BWF9DTElQX1BMQU5FUyAqLwotICAgeyAxNjI4NiwgMHgwMDAwOENERiB9LCAvKiBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUICovCi0gICB7IDE2MzE1LCAweDAwMDA4MEIzIH0sIC8qIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KLSAgIHsgMTYzNDcsIDB4MDAwMDgwQjMgfSwgLyogR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgKi8KLSAgIHsgMTYzODMsIDB4MDAwMDhCNEQgfSwgLyogR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KLSAgIHsgMTY0MTksIDB4MDAwMDhCNEQgfSwgLyogR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCi0gICB7IDE2NDU5LCAweDAwMDA4MDFCIH0sIC8qIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQgKi8KLSAgIHsgMTY0ODUsIDB4MDAwMDgwMUIgfSwgLyogR0xfTUFYX0NPTlZPTFVUSU9OX0hFSUdIVF9FWFQgKi8KLSAgIHsgMTY1MTUsIDB4MDAwMDgwMUEgfSwgLyogR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIICovCi0gICB7IDE2NTQwLCAweDAwMDA4MDFBIH0sIC8qIEdMX01BWF9DT05WT0xVVElPTl9XSURUSF9FWFQgKi8KLSAgIHsgMTY1NjksIDB4MDAwMDg1MUMgfSwgLyogR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAqLwotICAgeyAxNjU5OCwgMHgwMDAwODUxQyB9LCAvKiBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX0FSQiAqLwotICAgeyAxNjYzMSwgMHgwMDAwODgyNCB9LCAvKiBHTF9NQVhfRFJBV19CVUZGRVJTICovCi0gICB7IDE2NjUxLCAweDAwMDA4ODI0IH0sIC8qIEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCICovCi0gICB7IDE2Njc1LCAweDAwMDA4ODI0IH0sIC8qIEdMX01BWF9EUkFXX0JVRkZFUlNfQVRJICovCi0gICB7IDE2Njk5LCAweDAwMDA4MEU5IH0sIC8qIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICovCi0gICB7IDE2NzIzLCAweDAwMDA4MEU4IH0sIC8qIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAqLwotICAgeyAxNjc0OCwgMHgwMDAwMEQzMCB9LCAvKiBHTF9NQVhfRVZBTF9PUkRFUiAqLwotICAgeyAxNjc2NiwgMHgwMDAwODAwOCB9LCAvKiBHTF9NQVhfRVhUICovCi0gICB7IDE2Nzc3LCAweDAwMDA4QjQ5IH0sIC8qIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KLSAgIHsgMTY4MTIsIDB4MDAwMDhCNDkgfSwgLyogR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgKi8KLSAgIHsgMTY4NTEsIDB4MDAwMDBEMzEgfSwgLyogR0xfTUFYX0xJR0hUUyAqLwotICAgeyAxNjg2NSwgMHgwMDAwMEIzMSB9LCAvKiBHTF9NQVhfTElTVF9ORVNUSU5HICovCi0gICB7IDE2ODg1LCAweDAwMDA4ODQxIH0sIC8qIEdMX01BWF9NQVRSSVhfUEFMRVRURV9TVEFDS19ERVBUSF9BUkIgKi8KLSAgIHsgMTY5MjMsIDB4MDAwMDBEMzYgfSwgLyogR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAqLwotICAgeyAxNjk1MiwgMHgwMDAwMEQzNyB9LCAvKiBHTF9NQVhfTkFNRV9TVEFDS19ERVBUSCAqLwotICAgeyAxNjk3NiwgMHgwMDAwODg0MiB9LCAvKiBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19BUkIgKi8KLSAgIHsgMTcwMDQsIDB4MDAwMDBEMzQgfSwgLyogR0xfTUFYX1BJWEVMX01BUF9UQUJMRSAqLwotICAgeyAxNzAyNywgMHgwMDAwODhCMSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KLSAgIHsgMTcwNjQsIDB4MDAwMDg4MEIgfSwgLyogR0xfTUFYX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgIHsgMTcxMDAsIDB4MDAwMDg4QUQgfSwgLyogR0xfTUFYX1BST0dSQU1fQVRUUklCU19BUkIgKi8KLSAgIHsgMTcxMjcsIDB4MDAwMDg4RjUgfSwgLyogR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLwotICAgeyAxNzE1NiwgMHgwMDAwODhCNSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgKi8KLSAgIHsgMTcxOTAsIDB4MDAwMDg4RjQgfSwgLyogR0xfTUFYX1BST0dSQU1fRVhFQ19JTlNUUlVDVElPTlNfTlYgKi8KLSAgIHsgMTcyMjYsIDB4MDAwMDg4RjYgfSwgLyogR0xfTUFYX1BST0dSQU1fSUZfREVQVEhfTlYgKi8KLSAgIHsgMTcyNTMsIDB4MDAwMDg4QTEgfSwgLyogR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgeyAxNzI4NSwgMHgwMDAwODhCNCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQiAqLwotICAgeyAxNzMyMSwgMHgwMDAwODhGOCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICovCi0gICB7IDE3MzUwLCAweDAwMDA4OEY3IH0sIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgKi8KLSAgIHsgMTczNzksIDB4MDAwMDg2MkYgfSwgLyogR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICovCi0gICB7IDE3NDA3LCAweDAwMDA4NjJFIH0sIC8qIEdMX01BWF9QUk9HUkFNX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgKi8KLSAgIHsgMTc0NDUsIDB4MDAwMDg4QjMgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLwotICAgeyAxNzQ4OSwgMHgwMDAwODgwRSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgIHsgMTc1MzIsIDB4MDAwMDg4QUYgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCi0gICB7IDE3NTY2LCAweDAwMDA4OEEzIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCICovCi0gICB7IDE3NjA1LCAweDAwMDA4OEFCIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAqLwotICAgeyAxNzY0MiwgMHgwMDAwODhBNyB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCICovCi0gICB7IDE3NjgwLCAweDAwMDA4ODEwIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5ESVJFQ1RJT05TX0FSQiAqLwotICAgeyAxNzcyMywgMHgwMDAwODgwRiB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgIHsgMTc3NjYsIDB4MDAwMDg4QTkgfSwgLyogR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KLSAgIHsgMTc3OTYsIDB4MDAwMDg4QTUgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCi0gICB7IDE3ODI3LCAweDAwMDA4ODBEIH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICB7IDE3ODYzLCAweDAwMDA4ODBDIH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCi0gICB7IDE3ODk5LCAweDAwMDAwRDM4IH0sIC8qIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICovCi0gICB7IDE3OTI5LCAweDAwMDA4NEY4IH0sIC8qIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAqLwotICAgeyAxNzk2MywgMHgwMDAwODRGOCB9LCAvKiBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9OViAqLwotICAgeyAxNzk5NiwgMHgwMDAwODRFOCB9LCAvKiBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfRVhUICovCi0gICB7IDE4MDI1LCAweDAwMDA4NTA0IH0sIC8qIEdMX01BWF9TSElOSU5FU1NfTlYgKi8KLSAgIHsgMTgwNDUsIDB4MDAwMDg1MDUgfSwgLyogR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgKi8KLSAgIHsgMTgwNjksIDB4MDAwMDg4NzEgfSwgLyogR0xfTUFYX1RFWFRVUkVfQ09PUkRTICovCi0gICB7IDE4MDkxLCAweDAwMDA4ODcxIH0sIC8qIEdMX01BWF9URVhUVVJFX0NPT1JEU19BUkIgKi8KLSAgIHsgMTgxMTcsIDB4MDAwMDg4NzIgfSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KLSAgIHsgMTgxNDQsIDB4MDAwMDg4NzIgfSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCi0gICB7IDE4MTc1LCAweDAwMDA4NEZEIH0sIC8qIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICovCi0gICB7IDE4MTk5LCAweDAwMDA4NEZGIH0sIC8qIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAqLwotICAgeyAxODIzMywgMHgwMDAwMEQzMyB9LCAvKiBHTF9NQVhfVEVYVFVSRV9TSVpFICovCi0gICB7IDE4MjUzLCAweDAwMDAwRDM5IH0sIC8qIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICovCi0gICB7IDE4MjgwLCAweDAwMDA4NEUyIH0sIC8qIEdMX01BWF9URVhUVVJFX1VOSVRTICovCi0gICB7IDE4MzAxLCAweDAwMDA4NEUyIH0sIC8qIEdMX01BWF9URVhUVVJFX1VOSVRTX0FSQiAqLwotICAgeyAxODMyNiwgMHgwMDAwODYyRiB9LCAvKiBHTF9NQVhfVFJBQ0tfTUFUUklDRVNfTlYgKi8KLSAgIHsgMTgzNTEsIDB4MDAwMDg2MkUgfSwgLyogR0xfTUFYX1RSQUNLX01BVFJJWF9TVEFDS19ERVBUSF9OViAqLwotICAgeyAxODM4NiwgMHgwMDAwOEI0QiB9LCAvKiBHTF9NQVhfVkFSWUlOR19GTE9BVFMgKi8KLSAgIHsgMTg0MDgsIDB4MDAwMDhCNEIgfSwgLyogR0xfTUFYX1ZBUllJTkdfRkxPQVRTX0FSQiAqLwotICAgeyAxODQzNCwgMHgwMDAwODg2OSB9LCAvKiBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgKi8KLSAgIHsgMTg0NTYsIDB4MDAwMDg4NjkgfSwgLyogR0xfTUFYX1ZFUlRFWF9BVFRSSUJTX0FSQiAqLwotICAgeyAxODQ4MiwgMHgwMDAwOEI0QyB9LCAvKiBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KLSAgIHsgMTg1MTYsIDB4MDAwMDhCNEMgfSwgLyogR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAqLwotICAgeyAxODU1NCwgMHgwMDAwOEI0QSB9LCAvKiBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAqLwotICAgeyAxODU4NywgMHgwMDAwOEI0QSB9LCAvKiBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgKi8KLSAgIHsgMTg2MjQsIDB4MDAwMDg2QTQgfSwgLyogR0xfTUFYX1ZFUlRFWF9VTklUU19BUkIgKi8KLSAgIHsgMTg2NDgsIDB4MDAwMDBEM0EgfSwgLyogR0xfTUFYX1ZJRVdQT1JUX0RJTVMgKi8KLSAgIHsgMTg2NjksIDB4MDAwMDgwMDcgfSwgLyogR0xfTUlOICovCi0gICB7IDE4Njc2LCAweDAwMDA4MDJFIH0sIC8qIEdMX01JTk1BWCAqLwotICAgeyAxODY4NiwgMHgwMDAwODAyRSB9LCAvKiBHTF9NSU5NQVhfRVhUICovCi0gICB7IDE4NzAwLCAweDAwMDA4MDJGIH0sIC8qIEdMX01JTk1BWF9GT1JNQVQgKi8KLSAgIHsgMTg3MTcsIDB4MDAwMDgwMkYgfSwgLyogR0xfTUlOTUFYX0ZPUk1BVF9FWFQgKi8KLSAgIHsgMTg3MzgsIDB4MDAwMDgwMzAgfSwgLyogR0xfTUlOTUFYX1NJTksgKi8KLSAgIHsgMTg3NTMsIDB4MDAwMDgwMzAgfSwgLyogR0xfTUlOTUFYX1NJTktfRVhUICovCi0gICB7IDE4NzcyLCAweDAwMDA4MDA3IH0sIC8qIEdMX01JTl9FWFQgKi8KLSAgIHsgMTg3ODMsIDB4MDAwMDgzNzAgfSwgLyogR0xfTUlSUk9SRURfUkVQRUFUICovCi0gICB7IDE4ODAyLCAweDAwMDA4MzcwIH0sIC8qIEdMX01JUlJPUkVEX1JFUEVBVF9BUkIgKi8KLSAgIHsgMTg4MjUsIDB4MDAwMDgzNzAgfSwgLyogR0xfTUlSUk9SRURfUkVQRUFUX0lCTSAqLwotICAgeyAxODg0OCwgMHgwMDAwODc0MiB9LCAvKiBHTF9NSVJST1JfQ0xBTVBfQVRJICovCi0gICB7IDE4ODY4LCAweDAwMDA4NzQyIH0sIC8qIEdMX01JUlJPUl9DTEFNUF9FWFQgKi8KLSAgIHsgMTg4ODgsIDB4MDAwMDg5MTIgfSwgLyogR0xfTUlSUk9SX0NMQU1QX1RPX0JPUkRFUl9FWFQgKi8KLSAgIHsgMTg5MTgsIDB4MDAwMDg3NDMgfSwgLyogR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfQVRJICovCi0gICB7IDE4OTQ2LCAweDAwMDA4NzQzIH0sIC8qIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVCAqLwotICAgeyAxODk3NCwgMHgwMDAwMTcwMCB9LCAvKiBHTF9NT0RFTFZJRVcgKi8KLSAgIHsgMTg5ODcsIDB4MDAwMDE3MDAgfSwgLyogR0xfTU9ERUxWSUVXMF9BUkIgKi8KLSAgIHsgMTkwMDUsIDB4MDAwMDg3MkEgfSwgLyogR0xfTU9ERUxWSUVXMTBfQVJCICovCi0gICB7IDE5MDI0LCAweDAwMDA4NzJCIH0sIC8qIEdMX01PREVMVklFVzExX0FSQiAqLwotICAgeyAxOTA0MywgMHgwMDAwODcyQyB9LCAvKiBHTF9NT0RFTFZJRVcxMl9BUkIgKi8KLSAgIHsgMTkwNjIsIDB4MDAwMDg3MkQgfSwgLyogR0xfTU9ERUxWSUVXMTNfQVJCICovCi0gICB7IDE5MDgxLCAweDAwMDA4NzJFIH0sIC8qIEdMX01PREVMVklFVzE0X0FSQiAqLwotICAgeyAxOTEwMCwgMHgwMDAwODcyRiB9LCAvKiBHTF9NT0RFTFZJRVcxNV9BUkIgKi8KLSAgIHsgMTkxMTksIDB4MDAwMDg3MzAgfSwgLyogR0xfTU9ERUxWSUVXMTZfQVJCICovCi0gICB7IDE5MTM4LCAweDAwMDA4NzMxIH0sIC8qIEdMX01PREVMVklFVzE3X0FSQiAqLwotICAgeyAxOTE1NywgMHgwMDAwODczMiB9LCAvKiBHTF9NT0RFTFZJRVcxOF9BUkIgKi8KLSAgIHsgMTkxNzYsIDB4MDAwMDg3MzMgfSwgLyogR0xfTU9ERUxWSUVXMTlfQVJCICovCi0gICB7IDE5MTk1LCAweDAwMDA4NTBBIH0sIC8qIEdMX01PREVMVklFVzFfQVJCICovCi0gICB7IDE5MjEzLCAweDAwMDA4NzM0IH0sIC8qIEdMX01PREVMVklFVzIwX0FSQiAqLwotICAgeyAxOTIzMiwgMHgwMDAwODczNSB9LCAvKiBHTF9NT0RFTFZJRVcyMV9BUkIgKi8KLSAgIHsgMTkyNTEsIDB4MDAwMDg3MzYgfSwgLyogR0xfTU9ERUxWSUVXMjJfQVJCICovCi0gICB7IDE5MjcwLCAweDAwMDA4NzM3IH0sIC8qIEdMX01PREVMVklFVzIzX0FSQiAqLwotICAgeyAxOTI4OSwgMHgwMDAwODczOCB9LCAvKiBHTF9NT0RFTFZJRVcyNF9BUkIgKi8KLSAgIHsgMTkzMDgsIDB4MDAwMDg3MzkgfSwgLyogR0xfTU9ERUxWSUVXMjVfQVJCICovCi0gICB7IDE5MzI3LCAweDAwMDA4NzNBIH0sIC8qIEdMX01PREVMVklFVzI2X0FSQiAqLwotICAgeyAxOTM0NiwgMHgwMDAwODczQiB9LCAvKiBHTF9NT0RFTFZJRVcyN19BUkIgKi8KLSAgIHsgMTkzNjUsIDB4MDAwMDg3M0MgfSwgLyogR0xfTU9ERUxWSUVXMjhfQVJCICovCi0gICB7IDE5Mzg0LCAweDAwMDA4NzNEIH0sIC8qIEdMX01PREVMVklFVzI5X0FSQiAqLwotICAgeyAxOTQwMywgMHgwMDAwODcyMiB9LCAvKiBHTF9NT0RFTFZJRVcyX0FSQiAqLwotICAgeyAxOTQyMSwgMHgwMDAwODczRSB9LCAvKiBHTF9NT0RFTFZJRVczMF9BUkIgKi8KLSAgIHsgMTk0NDAsIDB4MDAwMDg3M0YgfSwgLyogR0xfTU9ERUxWSUVXMzFfQVJCICovCi0gICB7IDE5NDU5LCAweDAwMDA4NzIzIH0sIC8qIEdMX01PREVMVklFVzNfQVJCICovCi0gICB7IDE5NDc3LCAweDAwMDA4NzI0IH0sIC8qIEdMX01PREVMVklFVzRfQVJCICovCi0gICB7IDE5NDk1LCAweDAwMDA4NzI1IH0sIC8qIEdMX01PREVMVklFVzVfQVJCICovCi0gICB7IDE5NTEzLCAweDAwMDA4NzI2IH0sIC8qIEdMX01PREVMVklFVzZfQVJCICovCi0gICB7IDE5NTMxLCAweDAwMDA4NzI3IH0sIC8qIEdMX01PREVMVklFVzdfQVJCICovCi0gICB7IDE5NTQ5LCAweDAwMDA4NzI4IH0sIC8qIEdMX01PREVMVklFVzhfQVJCICovCi0gICB7IDE5NTY3LCAweDAwMDA4NzI5IH0sIC8qIEdMX01PREVMVklFVzlfQVJCICovCi0gICB7IDE5NTg1LCAweDAwMDAwQkE2IH0sIC8qIEdMX01PREVMVklFV19NQVRSSVggKi8KLSAgIHsgMTk2MDUsIDB4MDAwMDg2MjkgfSwgLyogR0xfTU9ERUxWSUVXX1BST0pFQ1RJT05fTlYgKi8KLSAgIHsgMTk2MzIsIDB4MDAwMDBCQTMgfSwgLyogR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICovCi0gICB7IDE5NjU3LCAweDAwMDAyMTAwIH0sIC8qIEdMX01PRFVMQVRFICovCi0gICB7IDE5NjY5LCAweDAwMDA4NzQ0IH0sIC8qIEdMX01PRFVMQVRFX0FERF9BVEkgKi8KLSAgIHsgMTk2ODksIDB4MDAwMDg3NDUgfSwgLyogR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgKi8KLSAgIHsgMTk3MTYsIDB4MDAwMDg3NDYgfSwgLyogR0xfTU9EVUxBVEVfU1VCVFJBQ1RfQVRJICovCi0gICB7IDE5NzQxLCAweDAwMDAwMTAzIH0sIC8qIEdMX01VTFQgKi8KLSAgIHsgMTk3NDksIDB4MDAwMDgwOUQgfSwgLyogR0xfTVVMVElTQU1QTEUgKi8KLSAgIHsgMTk3NjQsIDB4MDAwMDg2QjIgfSwgLyogR0xfTVVMVElTQU1QTEVfM0RGWCAqLwotICAgeyAxOTc4NCwgMHgwMDAwODA5RCB9LCAvKiBHTF9NVUxUSVNBTVBMRV9BUkIgKi8KLSAgIHsgMTk4MDMsIDB4MjAwMDAwMDAgfSwgLyogR0xfTVVMVElTQU1QTEVfQklUICovCi0gICB7IDE5ODIyLCAweDIwMDAwMDAwIH0sIC8qIEdMX01VTFRJU0FNUExFX0JJVF8zREZYICovCi0gICB7IDE5ODQ2LCAweDIwMDAwMDAwIH0sIC8qIEdMX01VTFRJU0FNUExFX0JJVF9BUkIgKi8KLSAgIHsgMTk4NjksIDB4MDAwMDg1MzQgfSwgLyogR0xfTVVMVElTQU1QTEVfRklMVEVSX0hJTlRfTlYgKi8KLSAgIHsgMTk4OTksIDB4MDAwMDJBMjUgfSwgLyogR0xfTjNGX1YzRiAqLwotICAgeyAxOTkxMCwgMHgwMDAwMEQ3MCB9LCAvKiBHTF9OQU1FX1NUQUNLX0RFUFRIICovCi0gICB7IDE5OTMwLCAweDAwMDAxNTBFIH0sIC8qIEdMX05BTkQgKi8KLSAgIHsgMTk5MzgsIDB4MDAwMDI2MDAgfSwgLyogR0xfTkVBUkVTVCAqLwotICAgeyAxOTk0OSwgMHgwMDAwODQ0RSB9LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggKi8KLSAgIHsgMTk5ODAsIDB4MDAwMDg0NEQgfSwgLyogR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWCAqLwotICAgeyAyMDAxMiwgMHgwMDAwMjcwMiB9LCAvKiBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgKi8KLSAgIHsgMjAwMzcsIDB4MDAwMDI3MDAgfSwgLyogR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAqLwotICAgeyAyMDA2MywgMHgwMDAwMDIwMCB9LCAvKiBHTF9ORVZFUiAqLwotICAgeyAyMDA3MiwgMHgwMDAwMTEwMiB9LCAvKiBHTF9OSUNFU1QgKi8KLSAgIHsgMjAwODIsIDB4MDAwMDAwMDAgfSwgLyogR0xfTk9ORSAqLwotICAgeyAyMDA5MCwgMHgwMDAwMTUwNSB9LCAvKiBHTF9OT09QICovCi0gICB7IDIwMDk4LCAweDAwMDAxNTA4IH0sIC8qIEdMX05PUiAqLwotICAgeyAyMDEwNSwgMHgwMDAwMEJBMSB9LCAvKiBHTF9OT1JNQUxJWkUgKi8KLSAgIHsgMjAxMTgsIDB4MDAwMDgwNzUgfSwgLyogR0xfTk9STUFMX0FSUkFZICovCi0gICB7IDIwMTM0LCAweDAwMDA4ODk3IH0sIC8qIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgeyAyMDE2NSwgMHgwMDAwODg5NyB9LCAvKiBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCi0gICB7IDIwMjAwLCAweDAwMDA4MDhGIH0sIC8qIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCi0gICB7IDIwMjI0LCAweDAwMDA4MDdGIH0sIC8qIEdMX05PUk1BTF9BUlJBWV9TVFJJREUgKi8KLSAgIHsgMjAyNDcsIDB4MDAwMDgwN0UgfSwgLyogR0xfTk9STUFMX0FSUkFZX1RZUEUgKi8KLSAgIHsgMjAyNjgsIDB4MDAwMDg1MTEgfSwgLyogR0xfTk9STUFMX01BUCAqLwotICAgeyAyMDI4MiwgMHgwMDAwODUxMSB9LCAvKiBHTF9OT1JNQUxfTUFQX0FSQiAqLwotICAgeyAyMDMwMCwgMHgwMDAwODUxMSB9LCAvKiBHTF9OT1JNQUxfTUFQX05WICovCi0gICB7IDIwMzE3LCAweDAwMDAwMjA1IH0sIC8qIEdMX05PVEVRVUFMICovCi0gICB7IDIwMzI5LCAweDAwMDAwMDAwIH0sIC8qIEdMX05PX0VSUk9SICovCi0gICB7IDIwMzQxLCAweDAwMDA4NkEyIH0sIC8qIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAqLwotICAgeyAyMDM3NSwgMHgwMDAwODZBMiB9LCAvKiBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfQVJCICovCi0gICB7IDIwNDEzLCAweDAwMDA4Qjg5IH0sIC8qIEdMX09CSkVDVF9BQ1RJVkVfQVRUUklCVVRFU19BUkIgKi8KLSAgIHsgMjA0NDUsIDB4MDAwMDhCOEEgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSF9BUkIgKi8KLSAgIHsgMjA0ODcsIDB4MDAwMDhCODYgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNU19BUkIgKi8KLSAgIHsgMjA1MTcsIDB4MDAwMDhCODcgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhfQVJCICovCi0gICB7IDIwNTU3LCAweDAwMDA4Qjg1IH0sIC8qIEdMX09CSkVDVF9BVFRBQ0hFRF9PQkpFQ1RTX0FSQiAqLwotICAgeyAyMDU4OCwgMHgwMDAwOEI4MSB9LCAvKiBHTF9PQkpFQ1RfQ09NUElMRV9TVEFUVVNfQVJCICovCi0gICB7IDIwNjE3LCAweDAwMDA4QjgwIH0sIC8qIEdMX09CSkVDVF9ERUxFVEVfU1RBVFVTX0FSQiAqLwotICAgeyAyMDY0NSwgMHgwMDAwOEI4NCB9LCAvKiBHTF9PQkpFQ1RfSU5GT19MT0dfTEVOR1RIX0FSQiAqLwotICAgeyAyMDY3NSwgMHgwMDAwMjQwMSB9LCAvKiBHTF9PQkpFQ1RfTElORUFSICovCi0gICB7IDIwNjkyLCAweDAwMDA4QjgyIH0sIC8qIEdMX09CSkVDVF9MSU5LX1NUQVRVU19BUkIgKi8KLSAgIHsgMjA3MTgsIDB4MDAwMDI1MDEgfSwgLyogR0xfT0JKRUNUX1BMQU5FICovCi0gICB7IDIwNzM0LCAweDAwMDA4Qjg4IH0sIC8qIEdMX09CSkVDVF9TSEFERVJfU09VUkNFX0xFTkdUSF9BUkIgKi8KLSAgIHsgMjA3NjksIDB4MDAwMDhCNEYgfSwgLyogR0xfT0JKRUNUX1NVQlRZUEVfQVJCICovCi0gICB7IDIwNzkxLCAweDAwMDA4QjRFIH0sIC8qIEdMX09CSkVDVF9UWVBFX0FSQiAqLwotICAgeyAyMDgxMCwgMHgwMDAwOEI4MyB9LCAvKiBHTF9PQkpFQ1RfVkFMSURBVEVfU1RBVFVTX0FSQiAqLwotICAgeyAyMDg0MCwgMHgwMDAwODE2NSB9LCAvKiBHTF9PQ0NMVVNJT05fVEVTVF9IUCAqLwotICAgeyAyMDg2MSwgMHgwMDAwODE2NiB9LCAvKiBHTF9PQ0NMVVNJT05fVEVTVF9SRVNVTFRfSFAgKi8KLSAgIHsgMjA4ODksIDB4MDAwMDAwMDEgfSwgLyogR0xfT05FICovCi0gICB7IDIwODk2LCAweDAwMDA4MDA0IH0sIC8qIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAqLwotICAgeyAyMDkyNCwgMHgwMDAwODAwNCB9LCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFfRVhUICovCi0gICB7IDIwOTU2LCAweDAwMDA4MDAyIH0sIC8qIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAqLwotICAgeyAyMDk4NCwgMHgwMDAwODAwMiB9LCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfRVhUICovCi0gICB7IDIxMDE2LCAweDAwMDAwMzA1IH0sIC8qIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KLSAgIHsgMjEwMzksIDB4MDAwMDAzMDcgfSwgLyogR0xfT05FX01JTlVTX0RTVF9DT0xPUiAqLwotICAgeyAyMTA2MiwgMHgwMDAwMDMwMyB9LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCi0gICB7IDIxMDg1LCAweDAwMDAwMzAxIH0sIC8qIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgKi8KLSAgIHsgMjExMDgsIDB4MDAwMDg1OTggfSwgLyogR0xfT1BFUkFORDBfQUxQSEEgKi8KLSAgIHsgMjExMjYsIDB4MDAwMDg1OTggfSwgLyogR0xfT1BFUkFORDBfQUxQSEFfQVJCICovCi0gICB7IDIxMTQ4LCAweDAwMDA4NTk4IH0sIC8qIEdMX09QRVJBTkQwX0FMUEhBX0VYVCAqLwotICAgeyAyMTE3MCwgMHgwMDAwODU5MCB9LCAvKiBHTF9PUEVSQU5EMF9SR0IgKi8KLSAgIHsgMjExODYsIDB4MDAwMDg1OTAgfSwgLyogR0xfT1BFUkFORDBfUkdCX0FSQiAqLwotICAgeyAyMTIwNiwgMHgwMDAwODU5MCB9LCAvKiBHTF9PUEVSQU5EMF9SR0JfRVhUICovCi0gICB7IDIxMjI2LCAweDAwMDA4NTk5IH0sIC8qIEdMX09QRVJBTkQxX0FMUEhBICovCi0gICB7IDIxMjQ0LCAweDAwMDA4NTk5IH0sIC8qIEdMX09QRVJBTkQxX0FMUEhBX0FSQiAqLwotICAgeyAyMTI2NiwgMHgwMDAwODU5OSB9LCAvKiBHTF9PUEVSQU5EMV9BTFBIQV9FWFQgKi8KLSAgIHsgMjEyODgsIDB4MDAwMDg1OTEgfSwgLyogR0xfT1BFUkFORDFfUkdCICovCi0gICB7IDIxMzA0LCAweDAwMDA4NTkxIH0sIC8qIEdMX09QRVJBTkQxX1JHQl9BUkIgKi8KLSAgIHsgMjEzMjQsIDB4MDAwMDg1OTEgfSwgLyogR0xfT1BFUkFORDFfUkdCX0VYVCAqLwotICAgeyAyMTM0NCwgMHgwMDAwODU5QSB9LCAvKiBHTF9PUEVSQU5EMl9BTFBIQSAqLwotICAgeyAyMTM2MiwgMHgwMDAwODU5QSB9LCAvKiBHTF9PUEVSQU5EMl9BTFBIQV9BUkIgKi8KLSAgIHsgMjEzODQsIDB4MDAwMDg1OUEgfSwgLyogR0xfT1BFUkFORDJfQUxQSEFfRVhUICovCi0gICB7IDIxNDA2LCAweDAwMDA4NTkyIH0sIC8qIEdMX09QRVJBTkQyX1JHQiAqLwotICAgeyAyMTQyMiwgMHgwMDAwODU5MiB9LCAvKiBHTF9PUEVSQU5EMl9SR0JfQVJCICovCi0gICB7IDIxNDQyLCAweDAwMDA4NTkyIH0sIC8qIEdMX09QRVJBTkQyX1JHQl9FWFQgKi8KLSAgIHsgMjE0NjIsIDB4MDAwMDg1OUIgfSwgLyogR0xfT1BFUkFORDNfQUxQSEFfTlYgKi8KLSAgIHsgMjE0ODMsIDB4MDAwMDg1OTMgfSwgLyogR0xfT1BFUkFORDNfUkdCX05WICovCi0gICB7IDIxNTAyLCAweDAwMDAxNTA3IH0sIC8qIEdMX09SICovCi0gICB7IDIxNTA4LCAweDAwMDAwQTAxIH0sIC8qIEdMX09SREVSICovCi0gICB7IDIxNTE3LCAweDAwMDAxNTBEIH0sIC8qIEdMX09SX0lOVkVSVEVEICovCi0gICB7IDIxNTMyLCAweDAwMDAxNTBCIH0sIC8qIEdMX09SX1JFVkVSU0UgKi8KLSAgIHsgMjE1NDYsIDB4MDAwMDA1MDUgfSwgLyogR0xfT1VUX09GX01FTU9SWSAqLwotICAgeyAyMTU2MywgMHgwMDAwMEQwNSB9LCAvKiBHTF9QQUNLX0FMSUdOTUVOVCAqLwotICAgeyAyMTU4MSwgMHgwMDAwODA2QyB9LCAvKiBHTF9QQUNLX0lNQUdFX0hFSUdIVCAqLwotICAgeyAyMTYwMiwgMHgwMDAwODc1OCB9LCAvKiBHTF9QQUNLX0lOVkVSVF9NRVNBICovCi0gICB7IDIxNjIyLCAweDAwMDAwRDAxIH0sIC8qIEdMX1BBQ0tfTFNCX0ZJUlNUICovCi0gICB7IDIxNjQwLCAweDAwMDAwRDAyIH0sIC8qIEdMX1BBQ0tfUk9XX0xFTkdUSCAqLwotICAgeyAyMTY1OSwgMHgwMDAwODA2QiB9LCAvKiBHTF9QQUNLX1NLSVBfSU1BR0VTICovCi0gICB7IDIxNjc5LCAweDAwMDAwRDA0IH0sIC8qIEdMX1BBQ0tfU0tJUF9QSVhFTFMgKi8KLSAgIHsgMjE2OTksIDB4MDAwMDBEMDMgfSwgLyogR0xfUEFDS19TS0lQX1JPV1MgKi8KLSAgIHsgMjE3MTcsIDB4MDAwMDBEMDAgfSwgLyogR0xfUEFDS19TV0FQX0JZVEVTICovCi0gICB7IDIxNzM2LCAweDAwMDA4QjkyIH0sIC8qIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAqLwotICAgeyAyMTc2MSwgMHgwMDAwOEI5NCB9LCAvKiBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAqLwotICAgeyAyMTc4NSwgMHgwMDAwOEI5MCB9LCAvKiBHTF9QQUxFVFRFNF9SR0I4X09FUyAqLwotICAgeyAyMTgwNiwgMHgwMDAwOEI5MyB9LCAvKiBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgKi8KLSAgIHsgMjE4MjgsIDB4MDAwMDhCOTEgfSwgLyogR0xfUEFMRVRURTRfUkdCQThfT0VTICovCi0gICB7IDIxODUwLCAweDAwMDA4Qjk3IH0sIC8qIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAqLwotICAgeyAyMTg3NSwgMHgwMDAwOEI5OSB9LCAvKiBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAqLwotICAgeyAyMTg5OSwgMHgwMDAwOEI5NSB9LCAvKiBHTF9QQUxFVFRFOF9SR0I4X09FUyAqLwotICAgeyAyMTkyMCwgMHgwMDAwOEI5OCB9LCAvKiBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgKi8KLSAgIHsgMjE5NDIsIDB4MDAwMDhCOTYgfSwgLyogR0xfUEFMRVRURThfUkdCQThfT0VTICovCi0gICB7IDIxOTY0LCAweDAwMDAwNzAwIH0sIC8qIEdMX1BBU1NfVEhST1VHSF9UT0tFTiAqLwotICAgeyAyMTk4NiwgMHgwMDAwMEM1MCB9LCAvKiBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KLSAgIHsgMjIwMTcsIDB4MDAwMDBDNzkgfSwgLyogR0xfUElYRUxfTUFQX0FfVE9fQSAqLwotICAgeyAyMjAzNywgMHgwMDAwMENCOSB9LCAvKiBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgKi8KLSAgIHsgMjIwNjIsIDB4MDAwMDBDNzggfSwgLyogR0xfUElYRUxfTUFQX0JfVE9fQiAqLwotICAgeyAyMjA4MiwgMHgwMDAwMENCOCB9LCAvKiBHTF9QSVhFTF9NQVBfQl9UT19CX1NJWkUgKi8KLSAgIHsgMjIxMDcsIDB4MDAwMDBDNzcgfSwgLyogR0xfUElYRUxfTUFQX0dfVE9fRyAqLwotICAgeyAyMjEyNywgMHgwMDAwMENCNyB9LCAvKiBHTF9QSVhFTF9NQVBfR19UT19HX1NJWkUgKi8KLSAgIHsgMjIxNTIsIDB4MDAwMDBDNzUgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQSAqLwotICAgeyAyMjE3MiwgMHgwMDAwMENCNSB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19BX1NJWkUgKi8KLSAgIHsgMjIxOTcsIDB4MDAwMDBDNzQgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQiAqLwotICAgeyAyMjIxNywgMHgwMDAwMENCNCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkUgKi8KLSAgIHsgMjIyNDIsIDB4MDAwMDBDNzMgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fRyAqLwotICAgeyAyMjI2MiwgMHgwMDAwMENCMyB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgKi8KLSAgIHsgMjIyODcsIDB4MDAwMDBDNzAgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fSSAqLwotICAgeyAyMjMwNywgMHgwMDAwMENCMCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgKi8KLSAgIHsgMjIzMzIsIDB4MDAwMDBDNzIgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fUiAqLwotICAgeyAyMjM1MiwgMHgwMDAwMENCMiB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19SX1NJWkUgKi8KLSAgIHsgMjIzNzcsIDB4MDAwMDBDNzYgfSwgLyogR0xfUElYRUxfTUFQX1JfVE9fUiAqLwotICAgeyAyMjM5NywgMHgwMDAwMENCNiB9LCAvKiBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgKi8KLSAgIHsgMjI0MjIsIDB4MDAwMDBDNzEgfSwgLyogR0xfUElYRUxfTUFQX1NfVE9fUyAqLwotICAgeyAyMjQ0MiwgMHgwMDAwMENCMSB9LCAvKiBHTF9QSVhFTF9NQVBfU19UT19TX1NJWkUgKi8KLSAgIHsgMjI0NjcsIDB4MDAwMDAwMjAgfSwgLyogR0xfUElYRUxfTU9ERV9CSVQgKi8KLSAgIHsgMjI0ODUsIDB4MDAwMDg4RUQgfSwgLyogR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19FWFQgKi8KLSAgIHsgMjI1MTgsIDB4MDAwMDg4RUIgfSwgLyogR0xfUElYRUxfUEFDS19CVUZGRVJfRVhUICovCi0gICB7IDIyNTQzLCAweDAwMDA4OEVGIH0sIC8qIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElOR19FWFQgKi8KLSAgIHsgMjI1NzgsIDB4MDAwMDg4RUMgfSwgLyogR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9FWFQgKi8KLSAgIHsgMjI2MDUsIDB4MDAwMDFCMDAgfSwgLyogR0xfUE9JTlQgKi8KLSAgIHsgMjI2MTQsIDB4MDAwMDAwMDAgfSwgLyogR0xfUE9JTlRTICovCi0gICB7IDIyNjI0LCAweDAwMDAwMDAyIH0sIC8qIEdMX1BPSU5UX0JJVCAqLwotICAgeyAyMjYzNywgMHgwMDAwODEyOSB9LCAvKiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAqLwotICAgeyAyMjY2NywgMHgwMDAwODEyOSB9LCAvKiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIgKi8KLSAgIHsgMjI3MDEsIDB4MDAwMDgxMjkgfSwgLyogR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fRVhUICovCi0gICB7IDIyNzM1LCAweDAwMDA4MTI5IH0sIC8qIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX1NHSVMgKi8KLSAgIHsgMjI3NzAsIDB4MDAwMDgxMjggfSwgLyogR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAqLwotICAgeyAyMjc5OSwgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0FSQiAqLwotICAgeyAyMjgzMiwgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0VYVCAqLwotICAgeyAyMjg2NSwgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX1NHSVMgKi8KLSAgIHsgMjI4OTksIDB4MDAwMDBCMTEgfSwgLyogR0xfUE9JTlRfU0laRSAqLwotICAgeyAyMjkxMywgMHgwMDAwMEIxMyB9LCAvKiBHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCi0gICB7IDIyOTM5LCAweDAwMDA4MTI3IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUFYICovCi0gICB7IDIyOTU3LCAweDAwMDA4MTI3IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUFYX0FSQiAqLwotICAgeyAyMjk3OSwgMHgwMDAwODEyNyB9LCAvKiBHTF9QT0lOVF9TSVpFX01BWF9FWFQgKi8KLSAgIHsgMjMwMDEsIDB4MDAwMDgxMjcgfSwgLyogR0xfUE9JTlRfU0laRV9NQVhfU0dJUyAqLwotICAgeyAyMzAyNCwgMHgwMDAwODEyNiB9LCAvKiBHTF9QT0lOVF9TSVpFX01JTiAqLwotICAgeyAyMzA0MiwgMHgwMDAwODEyNiB9LCAvKiBHTF9QT0lOVF9TSVpFX01JTl9BUkIgKi8KLSAgIHsgMjMwNjQsIDB4MDAwMDgxMjYgfSwgLyogR0xfUE9JTlRfU0laRV9NSU5fRVhUICovCi0gICB7IDIzMDg2LCAweDAwMDA4MTI2IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUlOX1NHSVMgKi8KLSAgIHsgMjMxMDksIDB4MDAwMDBCMTIgfSwgLyogR0xfUE9JTlRfU0laRV9SQU5HRSAqLwotICAgeyAyMzEyOSwgMHgwMDAwMEIxMCB9LCAvKiBHTF9QT0lOVF9TTU9PVEggKi8KLSAgIHsgMjMxNDUsIDB4MDAwMDBDNTEgfSwgLyogR0xfUE9JTlRfU01PT1RIX0hJTlQgKi8KLSAgIHsgMjMxNjYsIDB4MDAwMDg4NjEgfSwgLyogR0xfUE9JTlRfU1BSSVRFICovCi0gICB7IDIzMTgyLCAweDAwMDA4ODYxIH0sIC8qIEdMX1BPSU5UX1NQUklURV9BUkIgKi8KLSAgIHsgMjMyMDIsIDB4MDAwMDhDQTAgfSwgLyogR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAqLwotICAgeyAyMzIzMSwgMHgwMDAwODg2MSB9LCAvKiBHTF9QT0lOVF9TUFJJVEVfTlYgKi8KLSAgIHsgMjMyNTAsIDB4MDAwMDg4NjMgfSwgLyogR0xfUE9JTlRfU1BSSVRFX1JfTU9ERV9OViAqLwotICAgeyAyMzI3NiwgMHgwMDAwMDcwMSB9LCAvKiBHTF9QT0lOVF9UT0tFTiAqLwotICAgeyAyMzI5MSwgMHgwMDAwMDAwOSB9LCAvKiBHTF9QT0xZR09OICovCi0gICB7IDIzMzAyLCAweDAwMDAwMDA4IH0sIC8qIEdMX1BPTFlHT05fQklUICovCi0gICB7IDIzMzE3LCAweDAwMDAwQjQwIH0sIC8qIEdMX1BPTFlHT05fTU9ERSAqLwotICAgeyAyMzMzMywgMHgwMDAwODAzOSB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9CSUFTICovCi0gICB7IDIzMzU2LCAweDAwMDA4MDM4IH0sIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAqLwotICAgeyAyMzM4MSwgMHgwMDAwODAzNyB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0gICB7IDIzNDA0LCAweDAwMDAyQTAyIH0sIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgKi8KLSAgIHsgMjM0MjcsIDB4MDAwMDJBMDEgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQgKi8KLSAgIHsgMjM0NTEsIDB4MDAwMDJBMDAgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgKi8KLSAgIHsgMjM0NzUsIDB4MDAwMDBCNDEgfSwgLyogR0xfUE9MWUdPTl9TTU9PVEggKi8KLSAgIHsgMjM0OTMsIDB4MDAwMDBDNTMgfSwgLyogR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAqLwotICAgeyAyMzUxNiwgMHgwMDAwMEI0MiB9LCAvKiBHTF9QT0xZR09OX1NUSVBQTEUgKi8KLSAgIHsgMjM1MzUsIDB4MDAwMDAwMTAgfSwgLyogR0xfUE9MWUdPTl9TVElQUExFX0JJVCAqLwotICAgeyAyMzU1OCwgMHgwMDAwMDcwMyB9LCAvKiBHTF9QT0xZR09OX1RPS0VOICovCi0gICB7IDIzNTc1LCAweDAwMDAxMjAzIH0sIC8qIEdMX1BPU0lUSU9OICovCi0gICB7IDIzNTg3LCAweDAwMDA4MEJCIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVMgKi8KLSAgIHsgMjM2MTksIDB4MDAwMDgwQkIgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBU19TR0kgKi8KLSAgIHsgMjM2NTUsIDB4MDAwMDgwQjcgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUgKi8KLSAgIHsgMjM2ODgsIDB4MDAwMDgwQjcgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEVfU0dJICovCi0gICB7IDIzNzI1LCAweDAwMDA4MEJBIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBUyAqLwotICAgeyAyMzc1NiwgMHgwMDAwODBCQSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVNfU0dJICovCi0gICB7IDIzNzkxLCAweDAwMDA4MEI2IH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgKi8KLSAgIHsgMjM4MjMsIDB4MDAwMDgwQjYgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRV9TR0kgKi8KLSAgIHsgMjM4NTksIDB4MDAwMDgwRDIgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgKi8KLSAgIHsgMjM4OTIsIDB4MDAwMDgwQjkgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAqLwotICAgeyAyMzkyNCwgMHgwMDAwODBCOSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTX1NHSSAqLwotICAgeyAyMzk2MCwgMHgwMDAwODBCNSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRSAqLwotICAgeyAyMzk5MywgMHgwMDAwODBCNSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRV9TR0kgKi8KLSAgIHsgMjQwMzAsIDB4MDAwMDgwQjggfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVMgKi8KLSAgIHsgMjQwNjAsIDB4MDAwMDgwQjggfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVNfU0dJICovCi0gICB7IDI0MDk0LCAweDAwMDA4MEI0IH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRSAqLwotICAgeyAyNDEyNSwgMHgwMDAwODBCNCB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEVfU0dJICovCi0gICB7IDI0MTYwLCAweDAwMDA4MDIzIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfQklBUyAqLwotICAgeyAyNDE5MSwgMHgwMDAwODAyMyB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNfRVhUICovCi0gICB7IDI0MjI2LCAweDAwMDA4MDFGIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgKi8KLSAgIHsgMjQyNTgsIDB4MDAwMDgwMUYgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRV9FWFQgKi8KLSAgIHsgMjQyOTQsIDB4MDAwMDgwMjIgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgKi8KLSAgIHsgMjQzMjQsIDB4MDAwMDgwMjIgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNfRVhUICovCi0gICB7IDI0MzU4LCAweDAwMDA4MDFFIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRSAqLwotICAgeyAyNDM4OSwgMHgwMDAwODAxRSB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEVfRVhUICovCi0gICB7IDI0NDI0LCAweDAwMDA4MEQxIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUgKi8KLSAgIHsgMjQ0NTYsIDB4MDAwMDgwMjEgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTICovCi0gICB7IDI0NDg3LCAweDAwMDA4MDIxIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBU19FWFQgKi8KLSAgIHsgMjQ1MjIsIDB4MDAwMDgwMUQgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRSAqLwotICAgeyAyNDU1NCwgMHgwMDAwODAxRCB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFX0VYVCAqLwotICAgeyAyNDU5MCwgMHgwMDAwODAyMCB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTICovCi0gICB7IDI0NjE5LCAweDAwMDA4MDIwIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVNfRVhUICovCi0gICB7IDI0NjUyLCAweDAwMDA4MDFDIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICovCi0gICB7IDI0NjgyLCAweDAwMDA4MDFDIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFX0VYVCAqLwotICAgeyAyNDcxNiwgMHgwMDAwODE3QiB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfUkFOR0VfU0dJWCAqLwotICAgeyAyNDc1NSwgMHgwMDAwODE3OSB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfU0dJWCAqLwotICAgeyAyNDc4OCwgMHgwMDAwODE3QyB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVggKi8KLSAgIHsgMjQ4MjgsIDB4MDAwMDgxN0EgfSwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9TR0lYICovCi0gICB7IDI0ODYyLCAweDAwMDA4NTc4IH0sIC8qIEdMX1BSRVZJT1VTICovCi0gICB7IDI0ODc0LCAweDAwMDA4NTc4IH0sIC8qIEdMX1BSRVZJT1VTX0FSQiAqLwotICAgeyAyNDg5MCwgMHgwMDAwODU3OCB9LCAvKiBHTF9QUkVWSU9VU19FWFQgKi8KLSAgIHsgMjQ5MDYsIDB4MDAwMDg1NzcgfSwgLyogR0xfUFJJTUFSWV9DT0xPUiAqLwotICAgeyAyNDkyMywgMHgwMDAwODU3NyB9LCAvKiBHTF9QUklNQVJZX0NPTE9SX0FSQiAqLwotICAgeyAyNDk0NCwgMHgwMDAwODU3NyB9LCAvKiBHTF9QUklNQVJZX0NPTE9SX0VYVCAqLwotICAgeyAyNDk2NSwgMHgwMDAwODhCMCB9LCAvKiBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLwotICAgeyAyNDk5OCwgMHgwMDAwODgwNSB9LCAvKiBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCi0gICB7IDI1MDMwLCAweDAwMDA4OEFDIH0sIC8qIEdMX1BST0dSQU1fQVRUUklCU19BUkIgKi8KLSAgIHsgMjUwNTMsIDB4MDAwMDg2NzcgfSwgLyogR0xfUFJPR1JBTV9CSU5ESU5HX0FSQiAqLwotICAgeyAyNTA3NiwgMHgwMDAwODY0QiB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQiAqLwotICAgeyAyNTEwNiwgMHgwMDAwODY0QiB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX05WICovCi0gICB7IDI1MTM1LCAweDAwMDA4ODc0IH0sIC8qIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAqLwotICAgeyAyNTE2MywgMHgwMDAwODg3NiB9LCAvKiBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgKi8KLSAgIHsgMjUxODUsIDB4MDAwMDg4NzUgfSwgLyogR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICovCi0gICB7IDI1MjEzLCAweDAwMDA4OEEwIH0sIC8qIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgeyAyNTI0MSwgMHgwMDAwODYyNyB9LCAvKiBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgKi8KLSAgIHsgMjUyNjMsIDB4MDAwMDg2MjcgfSwgLyogR0xfUFJPR1JBTV9MRU5HVEhfTlYgKi8KLSAgIHsgMjUyODQsIDB4MDAwMDg4QjIgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCICovCi0gICB7IDI1MzI0LCAweDAwMDA4ODA4IH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCi0gICB7IDI1MzYzLCAweDAwMDA4OEFFIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCi0gICB7IDI1MzkzLCAweDAwMDA4OEEyIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgIHsgMjU0MjgsIDB4MDAwMDg4QUEgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfUEFSQU1FVEVSU19BUkIgKi8KLSAgIHsgMjU0NjEsIDB4MDAwMDg4QTYgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCICovCi0gICB7IDI1NDk1LCAweDAwMDA4ODBBIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICB7IDI1NTM0LCAweDAwMDA4ODA5IH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCi0gICB7IDI1NTczLCAweDAwMDA4QjQwIH0sIC8qIEdMX1BST0dSQU1fT0JKRUNUX0FSQiAqLwotICAgeyAyNTU5NSwgMHgwMDAwODhBOCB9LCAvKiBHTF9QUk9HUkFNX1BBUkFNRVRFUlNfQVJCICovCi0gICB7IDI1NjIxLCAweDAwMDA4NjQ0IH0sIC8qIEdMX1BST0dSQU1fUEFSQU1FVEVSX05WICovCi0gICB7IDI1NjQ1LCAweDAwMDA4NjQ3IH0sIC8qIEdMX1BST0dSQU1fUkVTSURFTlRfTlYgKi8KLSAgIHsgMjU2NjgsIDB4MDAwMDg2MjggfSwgLyogR0xfUFJPR1JBTV9TVFJJTkdfQVJCICovCi0gICB7IDI1NjkwLCAweDAwMDA4NjI4IH0sIC8qIEdMX1BST0dSQU1fU1RSSU5HX05WICovCi0gICB7IDI1NzExLCAweDAwMDA4NjQ2IH0sIC8qIEdMX1BST0dSQU1fVEFSR0VUX05WICovCi0gICB7IDI1NzMyLCAweDAwMDA4OEE0IH0sIC8qIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCi0gICB7IDI1NzU5LCAweDAwMDA4ODA3IH0sIC8qIEdMX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgKi8KLSAgIHsgMjU3OTEsIDB4MDAwMDg4MDYgfSwgLyogR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgeyAyNTgyMywgMHgwMDAwODhCNiB9LCAvKiBHTF9QUk9HUkFNX1VOREVSX05BVElWRV9MSU1JVFNfQVJCICovCi0gICB7IDI1ODU4LCAweDAwMDAxNzAxIH0sIC8qIEdMX1BST0pFQ1RJT04gKi8KLSAgIHsgMjU4NzIsIDB4MDAwMDBCQTcgfSwgLyogR0xfUFJPSkVDVElPTl9NQVRSSVggKi8KLSAgIHsgMjU4OTMsIDB4MDAwMDBCQTQgfSwgLyogR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLwotICAgeyAyNTkxOSwgMHgwMDAwODBEMyB9LCAvKiBHTF9QUk9YWV9DT0xPUl9UQUJMRSAqLwotICAgeyAyNTk0MCwgMHgwMDAwODAyNSB9LCAvKiBHTF9QUk9YWV9ISVNUT0dSQU0gKi8KLSAgIHsgMjU5NTksIDB4MDAwMDgwMjUgfSwgLyogR0xfUFJPWFlfSElTVE9HUkFNX0VYVCAqLwotICAgeyAyNTk4MiwgMHgwMDAwODBENSB9LCAvKiBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAqLwotICAgeyAyNjAyMSwgMHgwMDAwODBENCB9LCAvKiBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICovCi0gICB7IDI2MDU5LCAweDAwMDA4MDYzIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfMUQgKi8KLSAgIHsgMjYwNzksIDB4MDAwMDhDMTkgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQgKi8KLSAgIHsgMjYxMDksIDB4MDAwMDgwNjMgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRF9FWFQgKi8KLSAgIHsgMjYxMzMsIDB4MDAwMDgwNjQgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRCAqLwotICAgeyAyNjE1MywgMHgwMDAwOEMxQiB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX0FSUkFZX0VYVCAqLwotICAgeyAyNjE4MywgMHgwMDAwODA2NCB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX0VYVCAqLwotICAgeyAyNjIwNywgMHgwMDAwODA3MCB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzNEICovCi0gICB7IDI2MjI3LCAweDAwMDA4MEJEIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICovCi0gICB7IDI2MjYwLCAweDAwMDA4NTFCIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgKi8KLSAgIHsgMjYyODYsIDB4MDAwMDg1MUIgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUF9BUkIgKi8KLSAgIHsgMjYzMTYsIDB4MDAwMDg0RjcgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCi0gICB7IDI2MzQ3LCAweDAwMDA4NEY3IH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfUkVDVEFOR0xFX05WICovCi0gICB7IDI2Mzc3LCAweDAwMDAyMDAzIH0sIC8qIEdMX1EgKi8KLSAgIHsgMjYzODIsIDB4MDAwMDEyMDkgfSwgLyogR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICovCi0gICB7IDI2NDA3LCAweDAwMDAwMDA3IH0sIC8qIEdMX1FVQURTICovCi0gICB7IDI2NDE2LCAweDAwMDA4NjE0IH0sIC8qIEdMX1FVQURfTUVTSF9TVU4gKi8KLSAgIHsgMjY0MzMsIDB4MDAwMDAwMDggfSwgLyogR0xfUVVBRF9TVFJJUCAqLwotICAgeyAyNjQ0NywgMHgwMDAwODg2NCB9LCAvKiBHTF9RVUVSWV9DT1VOVEVSX0JJVFMgKi8KLSAgIHsgMjY0NjksIDB4MDAwMDg4NjQgfSwgLyogR0xfUVVFUllfQ09VTlRFUl9CSVRTX0FSQiAqLwotICAgeyAyNjQ5NSwgMHgwMDAwODg2NiB9LCAvKiBHTF9RVUVSWV9SRVNVTFQgKi8KLSAgIHsgMjY1MTEsIDB4MDAwMDg4NjYgfSwgLyogR0xfUVVFUllfUkVTVUxUX0FSQiAqLwotICAgeyAyNjUzMSwgMHgwMDAwODg2NyB9LCAvKiBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICovCi0gICB7IDI2NTU3LCAweDAwMDA4ODY3IH0sIC8qIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEVfQVJCICovCi0gICB7IDI2NTg3LCAweDAwMDAyMDAyIH0sIC8qIEdMX1IgKi8KLSAgIHsgMjY1OTIsIDB4MDAwMDJBMTAgfSwgLyogR0xfUjNfRzNfQjIgKi8KLSAgIHsgMjY2MDQsIDB4MDAwMTkyNjIgfSwgLyogR0xfUkFTVEVSX1BPU0lUSU9OX1VOQ0xJUFBFRF9JQk0gKi8KLSAgIHsgMjY2MzcsIDB4MDAwMDBDMDIgfSwgLyogR0xfUkVBRF9CVUZGRVIgKi8KLSAgIHsgMjY2NTIsIDB4MDAwMDhDQUEgfSwgLyogR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAqLwotICAgeyAyNjY4NCwgMHgwMDAwOENBOCB9LCAvKiBHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCAqLwotICAgeyAyNjcwOCwgMHgwMDAwODhCOCB9LCAvKiBHTF9SRUFEX09OTFkgKi8KLSAgIHsgMjY3MjEsIDB4MDAwMDg4QjggfSwgLyogR0xfUkVBRF9PTkxZX0FSQiAqLwotICAgeyAyNjczOCwgMHgwMDAwODhCQSB9LCAvKiBHTF9SRUFEX1dSSVRFICovCi0gICB7IDI2NzUyLCAweDAwMDA4OEJBIH0sIC8qIEdMX1JFQURfV1JJVEVfQVJCICovCi0gICB7IDI2NzcwLCAweDAwMDAxOTAzIH0sIC8qIEdMX1JFRCAqLwotICAgeyAyNjc3NywgMHgwMDAwODAxNiB9LCAvKiBHTF9SRURVQ0UgKi8KLSAgIHsgMjY3ODcsIDB4MDAwMDgwMTYgfSwgLyogR0xfUkVEVUNFX0VYVCAqLwotICAgeyAyNjgwMSwgMHgwMDAwMEQxNSB9LCAvKiBHTF9SRURfQklBUyAqLwotICAgeyAyNjgxMywgMHgwMDAwMEQ1MiB9LCAvKiBHTF9SRURfQklUUyAqLwotICAgeyAyNjgyNSwgMHgwMDAwMEQxNCB9LCAvKiBHTF9SRURfU0NBTEUgKi8KLSAgIHsgMjY4MzgsIDB4MDAwMDg1MTIgfSwgLyogR0xfUkVGTEVDVElPTl9NQVAgKi8KLSAgIHsgMjY4NTYsIDB4MDAwMDg1MTIgfSwgLyogR0xfUkVGTEVDVElPTl9NQVBfQVJCICovCi0gICB7IDI2ODc4LCAweDAwMDA4NTEyIH0sIC8qIEdMX1JFRkxFQ1RJT05fTUFQX05WICovCi0gICB7IDI2ODk5LCAweDAwMDAxQzAwIH0sIC8qIEdMX1JFTkRFUiAqLwotICAgeyAyNjkwOSwgMHgwMDAwOENBNyB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfQklORElOR19FWFQgKi8KLSAgIHsgMjY5MzcsIDB4MDAwMDhENDEgfSwgLyogR0xfUkVOREVSQlVGRkVSX0VYVCAqLwotICAgeyAyNjk1NywgMHgwMDAwOEQ0MyB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX0VYVCAqLwotICAgeyAyNjk4NCwgMHgwMDAwOEQ0NCB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX0VYVCAqLwotICAgeyAyNzAyMCwgMHgwMDAwOEQ0MiB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfRVhUICovCi0gICB7IDI3MDQ2LCAweDAwMDAxRjAxIH0sIC8qIEdMX1JFTkRFUkVSICovCi0gICB7IDI3MDU4LCAweDAwMDAwQzQwIH0sIC8qIEdMX1JFTkRFUl9NT0RFICovCi0gICB7IDI3MDczLCAweDAwMDAyOTAxIH0sIC8qIEdMX1JFUEVBVCAqLwotICAgeyAyNzA4MywgMHgwMDAwMUUwMSB9LCAvKiBHTF9SRVBMQUNFICovCi0gICB7IDI3MDk0LCAweDAwMDA4MDYyIH0sIC8qIEdMX1JFUExBQ0VfRVhUICovCi0gICB7IDI3MTA5LCAweDAwMDA4MTUzIH0sIC8qIEdMX1JFUExJQ0FURV9CT1JERVJfSFAgKi8KLSAgIHsgMjcxMzIsIDB4MDAwMDgwM0EgfSwgLyogR0xfUkVTQ0FMRV9OT1JNQUwgKi8KLSAgIHsgMjcxNTAsIDB4MDAwMDgwM0EgfSwgLyogR0xfUkVTQ0FMRV9OT1JNQUxfRVhUICovCi0gICB7IDI3MTcyLCAweDAwMDAwMTAyIH0sIC8qIEdMX1JFVFVSTiAqLwotICAgeyAyNzE4MiwgMHgwMDAwMTkwNyB9LCAvKiBHTF9SR0IgKi8KLSAgIHsgMjcxODksIDB4MDAwMDgwNTIgfSwgLyogR0xfUkdCMTAgKi8KLSAgIHsgMjcxOTgsIDB4MDAwMDgwNTkgfSwgLyogR0xfUkdCMTBfQTIgKi8KLSAgIHsgMjcyMTAsIDB4MDAwMDgwNTkgfSwgLyogR0xfUkdCMTBfQTJfRVhUICovCi0gICB7IDI3MjI2LCAweDAwMDA4MDUyIH0sIC8qIEdMX1JHQjEwX0VYVCAqLwotICAgeyAyNzIzOSwgMHgwMDAwODA1MyB9LCAvKiBHTF9SR0IxMiAqLwotICAgeyAyNzI0OCwgMHgwMDAwODA1MyB9LCAvKiBHTF9SR0IxMl9FWFQgKi8KLSAgIHsgMjcyNjEsIDB4MDAwMDgwNTQgfSwgLyogR0xfUkdCMTYgKi8KLSAgIHsgMjcyNzAsIDB4MDAwMDgwNTQgfSwgLyogR0xfUkdCMTZfRVhUICovCi0gICB7IDI3MjgzLCAweDAwMDA4MDRFIH0sIC8qIEdMX1JHQjJfRVhUICovCi0gICB7IDI3Mjk1LCAweDAwMDA4MDRGIH0sIC8qIEdMX1JHQjQgKi8KLSAgIHsgMjczMDMsIDB4MDAwMDgwNEYgfSwgLyogR0xfUkdCNF9FWFQgKi8KLSAgIHsgMjczMTUsIDB4MDAwMDgzQTEgfSwgLyogR0xfUkdCNF9TM1RDICovCi0gICB7IDI3MzI4LCAweDAwMDA4MDUwIH0sIC8qIEdMX1JHQjUgKi8KLSAgIHsgMjczMzYsIDB4MDAwMDgwNTcgfSwgLyogR0xfUkdCNV9BMSAqLwotICAgeyAyNzM0NywgMHgwMDAwODA1NyB9LCAvKiBHTF9SR0I1X0ExX0VYVCAqLwotICAgeyAyNzM2MiwgMHgwMDAwODA1MCB9LCAvKiBHTF9SR0I1X0VYVCAqLwotICAgeyAyNzM3NCwgMHgwMDAwODA1MSB9LCAvKiBHTF9SR0I4ICovCi0gICB7IDI3MzgyLCAweDAwMDA4MDUxIH0sIC8qIEdMX1JHQjhfRVhUICovCi0gICB7IDI3Mzk0LCAweDAwMDAxOTA4IH0sIC8qIEdMX1JHQkEgKi8KLSAgIHsgMjc0MDIsIDB4MDAwMDgwNUEgfSwgLyogR0xfUkdCQTEyICovCi0gICB7IDI3NDEyLCAweDAwMDA4MDVBIH0sIC8qIEdMX1JHQkExMl9FWFQgKi8KLSAgIHsgMjc0MjYsIDB4MDAwMDgwNUIgfSwgLyogR0xfUkdCQTE2ICovCi0gICB7IDI3NDM2LCAweDAwMDA4MDVCIH0sIC8qIEdMX1JHQkExNl9FWFQgKi8KLSAgIHsgMjc0NTAsIDB4MDAwMDgwNTUgfSwgLyogR0xfUkdCQTIgKi8KLSAgIHsgMjc0NTksIDB4MDAwMDgwNTUgfSwgLyogR0xfUkdCQTJfRVhUICovCi0gICB7IDI3NDcyLCAweDAwMDA4MDU2IH0sIC8qIEdMX1JHQkE0ICovCi0gICB7IDI3NDgxLCAweDAwMDA4M0E1IH0sIC8qIEdMX1JHQkE0X0RYVDVfUzNUQyAqLwotICAgeyAyNzUwMCwgMHgwMDAwODA1NiB9LCAvKiBHTF9SR0JBNF9FWFQgKi8KLSAgIHsgMjc1MTMsIDB4MDAwMDgzQTMgfSwgLyogR0xfUkdCQTRfUzNUQyAqLwotICAgeyAyNzUyNywgMHgwMDAwODA1OCB9LCAvKiBHTF9SR0JBOCAqLwotICAgeyAyNzUzNiwgMHgwMDAwODA1OCB9LCAvKiBHTF9SR0JBOF9FWFQgKi8KLSAgIHsgMjc1NDksIDB4MDAwMDgzQTQgfSwgLyogR0xfUkdCQV9EWFQ1X1MzVEMgKi8KLSAgIHsgMjc1NjcsIDB4MDAwMDBDMzEgfSwgLyogR0xfUkdCQV9NT0RFICovCi0gICB7IDI3NTgwLCAweDAwMDA4M0EyIH0sIC8qIEdMX1JHQkFfUzNUQyAqLwotICAgeyAyNzU5MywgMHgwMDAwODNBMCB9LCAvKiBHTF9SR0JfUzNUQyAqLwotICAgeyAyNzYwNSwgMHgwMDAwODU3MyB9LCAvKiBHTF9SR0JfU0NBTEUgKi8KLSAgIHsgMjc2MTgsIDB4MDAwMDg1NzMgfSwgLyogR0xfUkdCX1NDQUxFX0FSQiAqLwotICAgeyAyNzYzNSwgMHgwMDAwODU3MyB9LCAvKiBHTF9SR0JfU0NBTEVfRVhUICovCi0gICB7IDI3NjUyLCAweDAwMDAwNDA3IH0sIC8qIEdMX1JJR0hUICovCi0gICB7IDI3NjYxLCAweDAwMDAyMDAwIH0sIC8qIEdMX1MgKi8KLSAgIHsgMjc2NjYsIDB4MDAwMDhCNUQgfSwgLyogR0xfU0FNUExFUl8xRCAqLwotICAgeyAyNzY4MCwgMHgwMDAwOEI2MSB9LCAvKiBHTF9TQU1QTEVSXzFEX1NIQURPVyAqLwotICAgeyAyNzcwMSwgMHgwMDAwOEI1RSB9LCAvKiBHTF9TQU1QTEVSXzJEICovCi0gICB7IDI3NzE1LCAweDAwMDA4QjYyIH0sIC8qIEdMX1NBTVBMRVJfMkRfU0hBRE9XICovCi0gICB7IDI3NzM2LCAweDAwMDA4QjVGIH0sIC8qIEdMX1NBTVBMRVJfM0QgKi8KLSAgIHsgMjc3NTAsIDB4MDAwMDhCNjAgfSwgLyogR0xfU0FNUExFUl9DVUJFICovCi0gICB7IDI3NzY2LCAweDAwMDA4MEE5IH0sIC8qIEdMX1NBTVBMRVMgKi8KLSAgIHsgMjc3NzcsIDB4MDAwMDg2QjQgfSwgLyogR0xfU0FNUExFU18zREZYICovCi0gICB7IDI3NzkzLCAweDAwMDA4MEE5IH0sIC8qIEdMX1NBTVBMRVNfQVJCICovCi0gICB7IDI3ODA4LCAweDAwMDA4OTE0IH0sIC8qIEdMX1NBTVBMRVNfUEFTU0VEICovCi0gICB7IDI3ODI2LCAweDAwMDA4OTE0IH0sIC8qIEdMX1NBTVBMRVNfUEFTU0VEX0FSQiAqLwotICAgeyAyNzg0OCwgMHgwMDAwODA5RSB9LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKi8KLSAgIHsgMjc4NzYsIDB4MDAwMDgwOUUgfSwgLyogR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFX0FSQiAqLwotICAgeyAyNzkwOCwgMHgwMDAwODA5RiB9LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICovCi0gICB7IDI3OTMxLCAweDAwMDA4MDlGIH0sIC8qIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfQVJCICovCi0gICB7IDI3OTU4LCAweDAwMDA4MEE4IH0sIC8qIEdMX1NBTVBMRV9CVUZGRVJTICovCi0gICB7IDI3OTc2LCAweDAwMDA4NkIzIH0sIC8qIEdMX1NBTVBMRV9CVUZGRVJTXzNERlggKi8KLSAgIHsgMjc5OTksIDB4MDAwMDgwQTggfSwgLyogR0xfU0FNUExFX0JVRkZFUlNfQVJCICovCi0gICB7IDI4MDIxLCAweDAwMDA4MEEwIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRSAqLwotICAgeyAyODA0MCwgMHgwMDAwODBBMCB9LCAvKiBHTF9TQU1QTEVfQ09WRVJBR0VfQVJCICovCi0gICB7IDI4MDYzLCAweDAwMDA4MEFCIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgKi8KLSAgIHsgMjgwODksIDB4MDAwMDgwQUIgfSwgLyogR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF9BUkIgKi8KLSAgIHsgMjgxMTksIDB4MDAwMDgwQUEgfSwgLyogR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICovCi0gICB7IDI4MTQ0LCAweDAwMDA4MEFBIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV9BUkIgKi8KLSAgIHsgMjgxNzMsIDB4MDAwODAwMDAgfSwgLyogR0xfU0NJU1NPUl9CSVQgKi8KLSAgIHsgMjgxODgsIDB4MDAwMDBDMTAgfSwgLyogR0xfU0NJU1NPUl9CT1ggKi8KLSAgIHsgMjgyMDMsIDB4MDAwMDBDMTEgfSwgLyogR0xfU0NJU1NPUl9URVNUICovCi0gICB7IDI4MjE5LCAweDAwMDA4NDVFIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWSAqLwotICAgeyAyODI0NCwgMHgwMDAwODg5QyB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgIHsgMjgyODQsIDB4MDAwMDg4OUMgfSwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAyODMyOCwgMHgwMDAwODQ1RCB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAqLwotICAgeyAyODM2MSwgMHgwMDAwODQ1QSB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRSAqLwotICAgeyAyODM5MSwgMHgwMDAwODQ1QyB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICovCi0gICB7IDI4NDIzLCAweDAwMDA4NDVCIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICovCi0gICB7IDI4NDUzLCAweDAwMDAxQzAyIH0sIC8qIEdMX1NFTEVDVCAqLwotICAgeyAyODQ2MywgMHgwMDAwMERGMyB9LCAvKiBHTF9TRUxFQ1RJT05fQlVGRkVSX1BPSU5URVIgKi8KLSAgIHsgMjg0OTEsIDB4MDAwMDBERjQgfSwgLyogR0xfU0VMRUNUSU9OX0JVRkZFUl9TSVpFICovCi0gICB7IDI4NTE2LCAweDAwMDA4MDEyIH0sIC8qIEdMX1NFUEFSQUJMRV8yRCAqLwotICAgeyAyODUzMiwgMHgwMDAwODFGQSB9LCAvKiBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUiAqLwotICAgeyAyODU1OSwgMHgwMDAwODFGQSB9LCAvKiBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUl9FWFQgKi8KLSAgIHsgMjg1OTAsIDB4MDAwMDE1MEYgfSwgLyogR0xfU0VUICovCi0gICB7IDI4NTk3LCAweDAwMDA4QjQ4IH0sIC8qIEdMX1NIQURFUl9PQkpFQ1RfQVJCICovCi0gICB7IDI4NjE4LCAweDAwMDA4Qjg4IH0sIC8qIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICovCi0gICB7IDI4NjQyLCAweDAwMDA4QjRGIH0sIC8qIEdMX1NIQURFUl9UWVBFICovCi0gICB7IDI4NjU3LCAweDAwMDAwQjU0IH0sIC8qIEdMX1NIQURFX01PREVMICovCi0gICB7IDI4NjcyLCAweDAwMDA4QjhDIH0sIC8qIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAqLwotICAgeyAyODcwMCwgMHgwMDAwODBCRiB9LCAvKiBHTF9TSEFET1dfQU1CSUVOVF9TR0lYICovCi0gICB7IDI4NzIzLCAweDAwMDA4MUZCIH0sIC8qIEdMX1NIQVJFRF9URVhUVVJFX1BBTEVUVEVfRVhUICovCi0gICB7IDI4NzUzLCAweDAwMDAxNjAxIH0sIC8qIEdMX1NISU5JTkVTUyAqLwotICAgeyAyODc2NiwgMHgwMDAwMTQwMiB9LCAvKiBHTF9TSE9SVCAqLwotICAgeyAyODc3NSwgMHgwMDAwODFGOSB9LCAvKiBHTF9TSU5HTEVfQ09MT1IgKi8KLSAgIHsgMjg3OTEsIDB4MDAwMDgxRjkgfSwgLyogR0xfU0lOR0xFX0NPTE9SX0VYVCAqLwotICAgeyAyODgxMSwgMHgwMDAwODVDQyB9LCAvKiBHTF9TTElDRV9BQ0NVTV9TVU4gKi8KLSAgIHsgMjg4MzAsIDB4MDAwMDFEMDEgfSwgLyogR0xfU01PT1RIICovCi0gICB7IDI4ODQwLCAweDAwMDAwQjIzIH0sIC8qIEdMX1NNT09USF9MSU5FX1dJRFRIX0dSQU5VTEFSSVRZICovCi0gICB7IDI4ODczLCAweDAwMDAwQjIyIH0sIC8qIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICovCi0gICB7IDI4OTAwLCAweDAwMDAwQjEzIH0sIC8qIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCi0gICB7IDI4OTMzLCAweDAwMDAwQjEyIH0sIC8qIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICovCi0gICB7IDI4OTYwLCAweDAwMDA4NTg4IH0sIC8qIEdMX1NPVVJDRTBfQUxQSEEgKi8KLSAgIHsgMjg5NzcsIDB4MDAwMDg1ODggfSwgLyogR0xfU09VUkNFMF9BTFBIQV9BUkIgKi8KLSAgIHsgMjg5OTgsIDB4MDAwMDg1ODggfSwgLyogR0xfU09VUkNFMF9BTFBIQV9FWFQgKi8KLSAgIHsgMjkwMTksIDB4MDAwMDg1ODAgfSwgLyogR0xfU09VUkNFMF9SR0IgKi8KLSAgIHsgMjkwMzQsIDB4MDAwMDg1ODAgfSwgLyogR0xfU09VUkNFMF9SR0JfQVJCICovCi0gICB7IDI5MDUzLCAweDAwMDA4NTgwIH0sIC8qIEdMX1NPVVJDRTBfUkdCX0VYVCAqLwotICAgeyAyOTA3MiwgMHgwMDAwODU4OSB9LCAvKiBHTF9TT1VSQ0UxX0FMUEhBICovCi0gICB7IDI5MDg5LCAweDAwMDA4NTg5IH0sIC8qIEdMX1NPVVJDRTFfQUxQSEFfQVJCICovCi0gICB7IDI5MTEwLCAweDAwMDA4NTg5IH0sIC8qIEdMX1NPVVJDRTFfQUxQSEFfRVhUICovCi0gICB7IDI5MTMxLCAweDAwMDA4NTgxIH0sIC8qIEdMX1NPVVJDRTFfUkdCICovCi0gICB7IDI5MTQ2LCAweDAwMDA4NTgxIH0sIC8qIEdMX1NPVVJDRTFfUkdCX0FSQiAqLwotICAgeyAyOTE2NSwgMHgwMDAwODU4MSB9LCAvKiBHTF9TT1VSQ0UxX1JHQl9FWFQgKi8KLSAgIHsgMjkxODQsIDB4MDAwMDg1OEEgfSwgLyogR0xfU09VUkNFMl9BTFBIQSAqLwotICAgeyAyOTIwMSwgMHgwMDAwODU4QSB9LCAvKiBHTF9TT1VSQ0UyX0FMUEhBX0FSQiAqLwotICAgeyAyOTIyMiwgMHgwMDAwODU4QSB9LCAvKiBHTF9TT1VSQ0UyX0FMUEhBX0VYVCAqLwotICAgeyAyOTI0MywgMHgwMDAwODU4MiB9LCAvKiBHTF9TT1VSQ0UyX1JHQiAqLwotICAgeyAyOTI1OCwgMHgwMDAwODU4MiB9LCAvKiBHTF9TT1VSQ0UyX1JHQl9BUkIgKi8KLSAgIHsgMjkyNzcsIDB4MDAwMDg1ODIgfSwgLyogR0xfU09VUkNFMl9SR0JfRVhUICovCi0gICB7IDI5Mjk2LCAweDAwMDA4NThCIH0sIC8qIEdMX1NPVVJDRTNfQUxQSEFfTlYgKi8KLSAgIHsgMjkzMTYsIDB4MDAwMDg1ODMgfSwgLyogR0xfU09VUkNFM19SR0JfTlYgKi8KLSAgIHsgMjkzMzQsIDB4MDAwMDEyMDIgfSwgLyogR0xfU1BFQ1VMQVIgKi8KLSAgIHsgMjkzNDYsIDB4MDAwMDI0MDIgfSwgLyogR0xfU1BIRVJFX01BUCAqLwotICAgeyAyOTM2MCwgMHgwMDAwMTIwNiB9LCAvKiBHTF9TUE9UX0NVVE9GRiAqLwotICAgeyAyOTM3NSwgMHgwMDAwMTIwNCB9LCAvKiBHTF9TUE9UX0RJUkVDVElPTiAqLwotICAgeyAyOTM5MywgMHgwMDAwMTIwNSB9LCAvKiBHTF9TUE9UX0VYUE9ORU5UICovCi0gICB7IDI5NDEwLCAweDAwMDA4NTg4IH0sIC8qIEdMX1NSQzBfQUxQSEEgKi8KLSAgIHsgMjk0MjQsIDB4MDAwMDg1ODAgfSwgLyogR0xfU1JDMF9SR0IgKi8KLSAgIHsgMjk0MzYsIDB4MDAwMDg1ODkgfSwgLyogR0xfU1JDMV9BTFBIQSAqLwotICAgeyAyOTQ1MCwgMHgwMDAwODU4MSB9LCAvKiBHTF9TUkMxX1JHQiAqLwotICAgeyAyOTQ2MiwgMHgwMDAwODU4QSB9LCAvKiBHTF9TUkMyX0FMUEhBICovCi0gICB7IDI5NDc2LCAweDAwMDA4NTgyIH0sIC8qIEdMX1NSQzJfUkdCICovCi0gICB7IDI5NDg4LCAweDAwMDAwMzAyIH0sIC8qIEdMX1NSQ19BTFBIQSAqLwotICAgeyAyOTUwMSwgMHgwMDAwMDMwOCB9LCAvKiBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgKi8KLSAgIHsgMjk1MjMsIDB4MDAwMDAzMDAgfSwgLyogR0xfU1JDX0NPTE9SICovCi0gICB7IDI5NTM2LCAweDAwMDAwNTAzIH0sIC8qIEdMX1NUQUNLX09WRVJGTE9XICovCi0gICB7IDI5NTU0LCAweDAwMDAwNTA0IH0sIC8qIEdMX1NUQUNLX1VOREVSRkxPVyAqLwotICAgeyAyOTU3MywgMHgwMDAwODhFNiB9LCAvKiBHTF9TVEFUSUNfQ09QWSAqLwotICAgeyAyOTU4OCwgMHgwMDAwODhFNiB9LCAvKiBHTF9TVEFUSUNfQ09QWV9BUkIgKi8KLSAgIHsgMjk2MDcsIDB4MDAwMDg4RTQgfSwgLyogR0xfU1RBVElDX0RSQVcgKi8KLSAgIHsgMjk2MjIsIDB4MDAwMDg4RTQgfSwgLyogR0xfU1RBVElDX0RSQVdfQVJCICovCi0gICB7IDI5NjQxLCAweDAwMDA4OEU1IH0sIC8qIEdMX1NUQVRJQ19SRUFEICovCi0gICB7IDI5NjU2LCAweDAwMDA4OEU1IH0sIC8qIEdMX1NUQVRJQ19SRUFEX0FSQiAqLwotICAgeyAyOTY3NSwgMHgwMDAwMTgwMiB9LCAvKiBHTF9TVEVOQ0lMICovCi0gICB7IDI5Njg2LCAweDAwMDA4RDIwIH0sIC8qIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQgKi8KLSAgIHsgMjk3MTIsIDB4MDAwMDg4MDEgfSwgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUwgKi8KLSAgIHsgMjk3MzMsIDB4MDAwMDg4MDEgfSwgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUxfQVRJICovCi0gICB7IDI5NzU4LCAweDAwMDA4ODAwIH0sIC8qIEdMX1NURU5DSUxfQkFDS19GVU5DICovCi0gICB7IDI5Nzc5LCAweDAwMDA4ODAwIH0sIC8qIEdMX1NURU5DSUxfQkFDS19GVU5DX0FUSSAqLwotICAgeyAyOTgwNCwgMHgwMDAwODgwMiB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICovCi0gICB7IDI5ODM2LCAweDAwMDA4ODAyIH0sIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUxfQVRJICovCi0gICB7IDI5ODcyLCAweDAwMDA4ODAzIH0sIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgKi8KLSAgIHsgMjk5MDQsIDB4MDAwMDg4MDMgfSwgLyogR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU19BVEkgKi8KLSAgIHsgMjk5NDAsIDB4MDAwMDhDQTMgfSwgLyogR0xfU1RFTkNJTF9CQUNLX1JFRiAqLwotICAgeyAyOTk2MCwgMHgwMDAwOENBNCB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAqLwotICAgeyAyOTk4NywgMHgwMDAwOENBNSB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICovCi0gICB7IDMwMDEzLCAweDAwMDAwRDU3IH0sIC8qIEdMX1NURU5DSUxfQklUUyAqLwotICAgeyAzMDAyOSwgMHgwMDAwMDQwMCB9LCAvKiBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KLSAgIHsgMzAwNTEsIDB4MDAwMDBCOTEgfSwgLyogR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAqLwotICAgeyAzMDA3NCwgMHgwMDAwMEI5NCB9LCAvKiBHTF9TVEVOQ0lMX0ZBSUwgKi8KLSAgIHsgMzAwOTAsIDB4MDAwMDBCOTIgfSwgLyogR0xfU1RFTkNJTF9GVU5DICovCi0gICB7IDMwMTA2LCAweDAwMDAxOTAxIH0sIC8qIEdMX1NURU5DSUxfSU5ERVggKi8KLSAgIHsgMzAxMjMsIDB4MDAwMDhENDkgfSwgLyogR0xfU1RFTkNJTF9JTkRFWDE2X0VYVCAqLwotICAgeyAzMDE0NiwgMHgwMDAwOEQ0NiB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYMV9FWFQgKi8KLSAgIHsgMzAxNjgsIDB4MDAwMDhENDcgfSwgLyogR0xfU1RFTkNJTF9JTkRFWDRfRVhUICovCi0gICB7IDMwMTkwLCAweDAwMDA4RDQ4IH0sIC8qIEdMX1NURU5DSUxfSU5ERVg4X0VYVCAqLwotICAgeyAzMDIxMiwgMHgwMDAwOEQ0NSB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYX0VYVCAqLwotICAgeyAzMDIzMywgMHgwMDAwMEI5NSB9LCAvKiBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAqLwotICAgeyAzMDI2MCwgMHgwMDAwMEI5NiB9LCAvKiBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAqLwotICAgeyAzMDI4NywgMHgwMDAwMEI5NyB9LCAvKiBHTF9TVEVOQ0lMX1JFRiAqLwotICAgeyAzMDMwMiwgMHgwMDAwMEI5MCB9LCAvKiBHTF9TVEVOQ0lMX1RFU1QgKi8KLSAgIHsgMzAzMTgsIDB4MDAwMDg5MTAgfSwgLyogR0xfU1RFTkNJTF9URVNUX1RXT19TSURFX0VYVCAqLwotICAgeyAzMDM0NywgMHgwMDAwMEI5MyB9LCAvKiBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgKi8KLSAgIHsgMzAzNjksIDB4MDAwMDBCOTggfSwgLyogR0xfU1RFTkNJTF9XUklURU1BU0sgKi8KLSAgIHsgMzAzOTAsIDB4MDAwMDBDMzMgfSwgLyogR0xfU1RFUkVPICovCi0gICB7IDMwNDAwLCAweDAwMDA4OEUyIH0sIC8qIEdMX1NUUkVBTV9DT1BZICovCi0gICB7IDMwNDE1LCAweDAwMDA4OEUyIH0sIC8qIEdMX1NUUkVBTV9DT1BZX0FSQiAqLwotICAgeyAzMDQzNCwgMHgwMDAwODhFMCB9LCAvKiBHTF9TVFJFQU1fRFJBVyAqLwotICAgeyAzMDQ0OSwgMHgwMDAwODhFMCB9LCAvKiBHTF9TVFJFQU1fRFJBV19BUkIgKi8KLSAgIHsgMzA0NjgsIDB4MDAwMDg4RTEgfSwgLyogR0xfU1RSRUFNX1JFQUQgKi8KLSAgIHsgMzA0ODMsIDB4MDAwMDg4RTEgfSwgLyogR0xfU1RSRUFNX1JFQURfQVJCICovCi0gICB7IDMwNTAyLCAweDAwMDAwRDUwIH0sIC8qIEdMX1NVQlBJWEVMX0JJVFMgKi8KLSAgIHsgMzA1MTksIDB4MDAwMDg0RTcgfSwgLyogR0xfU1VCVFJBQ1QgKi8KLSAgIHsgMzA1MzEsIDB4MDAwMDg0RTcgfSwgLyogR0xfU1VCVFJBQ1RfQVJCICovCi0gICB7IDMwNTQ3LCAweDAwMDAyMDAxIH0sIC8qIEdMX1QgKi8KLSAgIHsgMzA1NTIsIDB4MDAwMDJBMkEgfSwgLyogR0xfVDJGX0MzRl9WM0YgKi8KLSAgIHsgMzA1NjcsIDB4MDAwMDJBMkMgfSwgLyogR0xfVDJGX0M0Rl9OM0ZfVjNGICovCi0gICB7IDMwNTg2LCAweDAwMDAyQTI5IH0sIC8qIEdMX1QyRl9DNFVCX1YzRiAqLwotICAgeyAzMDYwMiwgMHgwMDAwMkEyQiB9LCAvKiBHTF9UMkZfTjNGX1YzRiAqLwotICAgeyAzMDYxNywgMHgwMDAwMkEyNyB9LCAvKiBHTF9UMkZfVjNGICovCi0gICB7IDMwNjI4LCAweDAwMDAyQTJEIH0sIC8qIEdMX1Q0Rl9DNEZfTjNGX1Y0RiAqLwotICAgeyAzMDY0NywgMHgwMDAwMkEyOCB9LCAvKiBHTF9UNEZfVjRGICovCi0gICB7IDMwNjU4LCAweDAwMDA4MDMxIH0sIC8qIEdMX1RBQkxFX1RPT19MQVJHRV9FWFQgKi8KLSAgIHsgMzA2ODEsIDB4MDAwMDE3MDIgfSwgLyogR0xfVEVYVFVSRSAqLwotICAgeyAzMDY5MiwgMHgwMDAwODRDMCB9LCAvKiBHTF9URVhUVVJFMCAqLwotICAgeyAzMDcwNCwgMHgwMDAwODRDMCB9LCAvKiBHTF9URVhUVVJFMF9BUkIgKi8KLSAgIHsgMzA3MjAsIDB4MDAwMDg0QzEgfSwgLyogR0xfVEVYVFVSRTEgKi8KLSAgIHsgMzA3MzIsIDB4MDAwMDg0Q0EgfSwgLyogR0xfVEVYVFVSRTEwICovCi0gICB7IDMwNzQ1LCAweDAwMDA4NENBIH0sIC8qIEdMX1RFWFRVUkUxMF9BUkIgKi8KLSAgIHsgMzA3NjIsIDB4MDAwMDg0Q0IgfSwgLyogR0xfVEVYVFVSRTExICovCi0gICB7IDMwNzc1LCAweDAwMDA4NENCIH0sIC8qIEdMX1RFWFRVUkUxMV9BUkIgKi8KLSAgIHsgMzA3OTIsIDB4MDAwMDg0Q0MgfSwgLyogR0xfVEVYVFVSRTEyICovCi0gICB7IDMwODA1LCAweDAwMDA4NENDIH0sIC8qIEdMX1RFWFRVUkUxMl9BUkIgKi8KLSAgIHsgMzA4MjIsIDB4MDAwMDg0Q0QgfSwgLyogR0xfVEVYVFVSRTEzICovCi0gICB7IDMwODM1LCAweDAwMDA4NENEIH0sIC8qIEdMX1RFWFRVUkUxM19BUkIgKi8KLSAgIHsgMzA4NTIsIDB4MDAwMDg0Q0UgfSwgLyogR0xfVEVYVFVSRTE0ICovCi0gICB7IDMwODY1LCAweDAwMDA4NENFIH0sIC8qIEdMX1RFWFRVUkUxNF9BUkIgKi8KLSAgIHsgMzA4ODIsIDB4MDAwMDg0Q0YgfSwgLyogR0xfVEVYVFVSRTE1ICovCi0gICB7IDMwODk1LCAweDAwMDA4NENGIH0sIC8qIEdMX1RFWFRVUkUxNV9BUkIgKi8KLSAgIHsgMzA5MTIsIDB4MDAwMDg0RDAgfSwgLyogR0xfVEVYVFVSRTE2ICovCi0gICB7IDMwOTI1LCAweDAwMDA4NEQwIH0sIC8qIEdMX1RFWFRVUkUxNl9BUkIgKi8KLSAgIHsgMzA5NDIsIDB4MDAwMDg0RDEgfSwgLyogR0xfVEVYVFVSRTE3ICovCi0gICB7IDMwOTU1LCAweDAwMDA4NEQxIH0sIC8qIEdMX1RFWFRVUkUxN19BUkIgKi8KLSAgIHsgMzA5NzIsIDB4MDAwMDg0RDIgfSwgLyogR0xfVEVYVFVSRTE4ICovCi0gICB7IDMwOTg1LCAweDAwMDA4NEQyIH0sIC8qIEdMX1RFWFRVUkUxOF9BUkIgKi8KLSAgIHsgMzEwMDIsIDB4MDAwMDg0RDMgfSwgLyogR0xfVEVYVFVSRTE5ICovCi0gICB7IDMxMDE1LCAweDAwMDA4NEQzIH0sIC8qIEdMX1RFWFRVUkUxOV9BUkIgKi8KLSAgIHsgMzEwMzIsIDB4MDAwMDg0QzEgfSwgLyogR0xfVEVYVFVSRTFfQVJCICovCi0gICB7IDMxMDQ4LCAweDAwMDA4NEMyIH0sIC8qIEdMX1RFWFRVUkUyICovCi0gICB7IDMxMDYwLCAweDAwMDA4NEQ0IH0sIC8qIEdMX1RFWFRVUkUyMCAqLwotICAgeyAzMTA3MywgMHgwMDAwODRENCB9LCAvKiBHTF9URVhUVVJFMjBfQVJCICovCi0gICB7IDMxMDkwLCAweDAwMDA4NEQ1IH0sIC8qIEdMX1RFWFRVUkUyMSAqLwotICAgeyAzMTEwMywgMHgwMDAwODRENSB9LCAvKiBHTF9URVhUVVJFMjFfQVJCICovCi0gICB7IDMxMTIwLCAweDAwMDA4NEQ2IH0sIC8qIEdMX1RFWFRVUkUyMiAqLwotICAgeyAzMTEzMywgMHgwMDAwODRENiB9LCAvKiBHTF9URVhUVVJFMjJfQVJCICovCi0gICB7IDMxMTUwLCAweDAwMDA4NEQ3IH0sIC8qIEdMX1RFWFRVUkUyMyAqLwotICAgeyAzMTE2MywgMHgwMDAwODRENyB9LCAvKiBHTF9URVhUVVJFMjNfQVJCICovCi0gICB7IDMxMTgwLCAweDAwMDA4NEQ4IH0sIC8qIEdMX1RFWFRVUkUyNCAqLwotICAgeyAzMTE5MywgMHgwMDAwODREOCB9LCAvKiBHTF9URVhUVVJFMjRfQVJCICovCi0gICB7IDMxMjEwLCAweDAwMDA4NEQ5IH0sIC8qIEdMX1RFWFRVUkUyNSAqLwotICAgeyAzMTIyMywgMHgwMDAwODREOSB9LCAvKiBHTF9URVhUVVJFMjVfQVJCICovCi0gICB7IDMxMjQwLCAweDAwMDA4NERBIH0sIC8qIEdMX1RFWFRVUkUyNiAqLwotICAgeyAzMTI1MywgMHgwMDAwODREQSB9LCAvKiBHTF9URVhUVVJFMjZfQVJCICovCi0gICB7IDMxMjcwLCAweDAwMDA4NERCIH0sIC8qIEdMX1RFWFRVUkUyNyAqLwotICAgeyAzMTI4MywgMHgwMDAwODREQiB9LCAvKiBHTF9URVhUVVJFMjdfQVJCICovCi0gICB7IDMxMzAwLCAweDAwMDA4NERDIH0sIC8qIEdMX1RFWFRVUkUyOCAqLwotICAgeyAzMTMxMywgMHgwMDAwODREQyB9LCAvKiBHTF9URVhUVVJFMjhfQVJCICovCi0gICB7IDMxMzMwLCAweDAwMDA4NEREIH0sIC8qIEdMX1RFWFRVUkUyOSAqLwotICAgeyAzMTM0MywgMHgwMDAwODRERCB9LCAvKiBHTF9URVhUVVJFMjlfQVJCICovCi0gICB7IDMxMzYwLCAweDAwMDA4NEMyIH0sIC8qIEdMX1RFWFRVUkUyX0FSQiAqLwotICAgeyAzMTM3NiwgMHgwMDAwODRDMyB9LCAvKiBHTF9URVhUVVJFMyAqLwotICAgeyAzMTM4OCwgMHgwMDAwODRERSB9LCAvKiBHTF9URVhUVVJFMzAgKi8KLSAgIHsgMzE0MDEsIDB4MDAwMDg0REUgfSwgLyogR0xfVEVYVFVSRTMwX0FSQiAqLwotICAgeyAzMTQxOCwgMHgwMDAwODRERiB9LCAvKiBHTF9URVhUVVJFMzEgKi8KLSAgIHsgMzE0MzEsIDB4MDAwMDg0REYgfSwgLyogR0xfVEVYVFVSRTMxX0FSQiAqLwotICAgeyAzMTQ0OCwgMHgwMDAwODRDMyB9LCAvKiBHTF9URVhUVVJFM19BUkIgKi8KLSAgIHsgMzE0NjQsIDB4MDAwMDg0QzQgfSwgLyogR0xfVEVYVFVSRTQgKi8KLSAgIHsgMzE0NzYsIDB4MDAwMDg0QzQgfSwgLyogR0xfVEVYVFVSRTRfQVJCICovCi0gICB7IDMxNDkyLCAweDAwMDA4NEM1IH0sIC8qIEdMX1RFWFRVUkU1ICovCi0gICB7IDMxNTA0LCAweDAwMDA4NEM1IH0sIC8qIEdMX1RFWFRVUkU1X0FSQiAqLwotICAgeyAzMTUyMCwgMHgwMDAwODRDNiB9LCAvKiBHTF9URVhUVVJFNiAqLwotICAgeyAzMTUzMiwgMHgwMDAwODRDNiB9LCAvKiBHTF9URVhUVVJFNl9BUkIgKi8KLSAgIHsgMzE1NDgsIDB4MDAwMDg0QzcgfSwgLyogR0xfVEVYVFVSRTcgKi8KLSAgIHsgMzE1NjAsIDB4MDAwMDg0QzcgfSwgLyogR0xfVEVYVFVSRTdfQVJCICovCi0gICB7IDMxNTc2LCAweDAwMDA4NEM4IH0sIC8qIEdMX1RFWFRVUkU4ICovCi0gICB7IDMxNTg4LCAweDAwMDA4NEM4IH0sIC8qIEdMX1RFWFRVUkU4X0FSQiAqLwotICAgeyAzMTYwNCwgMHgwMDAwODRDOSB9LCAvKiBHTF9URVhUVVJFOSAqLwotICAgeyAzMTYxNiwgMHgwMDAwODRDOSB9LCAvKiBHTF9URVhUVVJFOV9BUkIgKi8KLSAgIHsgMzE2MzIsIDB4MDAwMDBERTAgfSwgLyogR0xfVEVYVFVSRV8xRCAqLwotICAgeyAzMTY0NiwgMHgwMDAwOEMxOCB9LCAvKiBHTF9URVhUVVJFXzFEX0FSUkFZX0VYVCAqLwotICAgeyAzMTY3MCwgMHgwMDAwMERFMSB9LCAvKiBHTF9URVhUVVJFXzJEICovCi0gICB7IDMxNjg0LCAweDAwMDA4QzFBIH0sIC8qIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICovCi0gICB7IDMxNzA4LCAweDAwMDA4MDZGIH0sIC8qIEdMX1RFWFRVUkVfM0QgKi8KLSAgIHsgMzE3MjIsIDB4MDAwMDgwNUYgfSwgLyogR0xfVEVYVFVSRV9BTFBIQV9TSVpFICovCi0gICB7IDMxNzQ0LCAweDAwMDA4MDVGIH0sIC8qIEdMX1RFWFRVUkVfQUxQSEFfU0laRV9FWFQgKi8KLSAgIHsgMzE3NzAsIDB4MDAwMDgxM0MgfSwgLyogR0xfVEVYVFVSRV9CQVNFX0xFVkVMICovCi0gICB7IDMxNzkyLCAweDAwMDA4MDY4IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18xRCAqLwotICAgeyAzMTgxNCwgMHgwMDAwOEMxQyB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVlfRVhUICovCi0gICB7IDMxODQ2LCAweDAwMDA4MDY5IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotICAgeyAzMTg2OCwgMHgwMDAwOEMxRCB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMkRfQVJSQVlfRVhUICovCi0gICB7IDMxOTAwLCAweDAwMDA4MDZBIH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18zRCAqLwotICAgeyAzMTkyMiwgMHgwMDAwODUxNCB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgKi8KLSAgIHsgMzE5NTAsIDB4MDAwMDg1MTQgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSQiAqLwotICAgeyAzMTk4MiwgMHgwMDAwODRGNiB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFX0FSQiAqLwotICAgeyAzMjAxNSwgMHgwMDAwODRGNiB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFX05WICovCi0gICB7IDMyMDQ3LCAweDAwMDQwMDAwIH0sIC8qIEdMX1RFWFRVUkVfQklUICovCi0gICB7IDMyMDYyLCAweDAwMDA4MDVFIH0sIC8qIEdMX1RFWFRVUkVfQkxVRV9TSVpFICovCi0gICB7IDMyMDgzLCAweDAwMDA4MDVFIH0sIC8qIEdMX1RFWFRVUkVfQkxVRV9TSVpFX0VYVCAqLwotICAgeyAzMjEwOCwgMHgwMDAwMTAwNSB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUiAqLwotICAgeyAzMjEyNiwgMHgwMDAwMTAwNCB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiAqLwotICAgeyAzMjE1MCwgMHgwMDAwODE3MSB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfQ0VOVEVSX1NHSVggKi8KLSAgIHsgMzIxODEsIDB4MDAwMDgxNzYgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggKi8KLSAgIHsgMzIyMTEsIDB4MDAwMDgxNzIgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggKi8KLSAgIHsgMzIyNDEsIDB4MDAwMDgxNzUgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAqLwotICAgeyAzMjI3NiwgMHgwMDAwODE3MyB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfT0ZGU0VUX1NHSVggKi8KLSAgIHsgMzIzMDcsIDB4MDAwMDgxNzQgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLwotICAgeyAzMjM0NSwgMHgwMDAwODBCQyB9LCAvKiBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAqLwotICAgeyAzMjM3MiwgMHgwMDAwODFFRiB9LCAvKiBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICovCi0gICB7IDMyNDA0LCAweDAwMDA4MEJGIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAqLwotICAgeyAzMjQzOCwgMHgwMDAwODg0RCB9LCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAqLwotICAgeyAzMjQ2MiwgMHgwMDAwODg0RCB9LCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQ19BUkIgKi8KLSAgIHsgMzI0OTAsIDB4MDAwMDg4NEMgfSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX01PREUgKi8KLSAgIHsgMzI1MTQsIDB4MDAwMDg4NEMgfSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX01PREVfQVJCICovCi0gICB7IDMyNTQyLCAweDAwMDA4MTlCIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9PUEVSQVRPUl9TR0lYICovCi0gICB7IDMyNTc1LCAweDAwMDA4MTlBIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICovCi0gICB7IDMyNTk5LCAweDAwMDAxMDAzIH0sIC8qIEdMX1RFWFRVUkVfQ09NUE9ORU5UUyAqLwotICAgeyAzMjYyMSwgMHgwMDAwODZBMSB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRUQgKi8KLSAgIHsgMzI2NDMsIDB4MDAwMDg2QTEgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0FSQiAqLwotICAgeyAzMjY2OSwgMHgwMDAwODZBMyB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRURfRk9STUFUU19BUkIgKi8KLSAgIHsgMzI3MDMsIDB4MDAwMDg2QTAgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUgKi8KLSAgIHsgMzI3MzYsIDB4MDAwMDg2QTAgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVfQVJCICovCi0gICB7IDMyNzczLCAweDAwMDA4NEVGIH0sIC8qIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVCAqLwotICAgeyAzMjgwMSwgMHgwMDAwODRFRiB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlRfQVJCICovCi0gICB7IDMyODMzLCAweDAwMDA4MDc4IH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgKi8KLSAgIHsgMzI4NTYsIDB4MDAwMDg4OUEgfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgeyAzMjg5NCwgMHgwMDAwODg5QSB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAzMjkzNiwgMHgwMDAwODA5MiB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KLSAgIHsgMzI5NjcsIDB4MDAwMDgwODggfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0gICB7IDMyOTk1LCAweDAwMDA4MDhBIH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0gICB7IDMzMDI1LCAweDAwMDA4MDg5IH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAqLwotICAgeyAzMzA1MywgMHgwMDAwODUxMyB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQICovCi0gICB7IDMzMDczLCAweDAwMDA4NTEzIH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCICovCi0gICB7IDMzMDk3LCAweDAwMDA4NTE2IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAqLwotICAgeyAzMzEyOCwgMHgwMDAwODUxNiB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCICovCi0gICB7IDMzMTYzLCAweDAwMDA4NTE4IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAqLwotICAgeyAzMzE5NCwgMHgwMDAwODUxOCB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCICovCi0gICB7IDMzMjI5LCAweDAwMDA4NTFBIH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAqLwotICAgeyAzMzI2MCwgMHgwMDAwODUxQSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCICovCi0gICB7IDMzMjk1LCAweDAwMDA4NTE1IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAqLwotICAgeyAzMzMyNiwgMHgwMDAwODUxNSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCICovCi0gICB7IDMzMzYxLCAweDAwMDA4NTE3IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAqLwotICAgeyAzMzM5MiwgMHgwMDAwODUxNyB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCICovCi0gICB7IDMzNDI3LCAweDAwMDA4NTE5IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAqLwotICAgeyAzMzQ1OCwgMHgwMDAwODUxOSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCICovCi0gICB7IDMzNDkzLCAweDAwMDA4MDcxIH0sIC8qIEdMX1RFWFRVUkVfREVQVEggKi8KLSAgIHsgMzM1MTAsIDB4MDAwMDg4NEEgfSwgLyogR0xfVEVYVFVSRV9ERVBUSF9TSVpFICovCi0gICB7IDMzNTMyLCAweDAwMDA4ODRBIH0sIC8qIEdMX1RFWFRVUkVfREVQVEhfU0laRV9BUkIgKi8KLSAgIHsgMzM1NTgsIDB4MDAwMDIzMDAgfSwgLyogR0xfVEVYVFVSRV9FTlYgKi8KLSAgIHsgMzM1NzMsIDB4MDAwMDIyMDEgfSwgLyogR0xfVEVYVFVSRV9FTlZfQ09MT1IgKi8KLSAgIHsgMzM1OTQsIDB4MDAwMDIyMDAgfSwgLyogR0xfVEVYVFVSRV9FTlZfTU9ERSAqLwotICAgeyAzMzYxNCwgMHgwMDAwODUwMCB9LCAvKiBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MICovCi0gICB7IDMzNjQwLCAweDAwMDAyNTAwIH0sIC8qIEdMX1RFWFRVUkVfR0VOX01PREUgKi8KLSAgIHsgMzM2NjAsIDB4MDAwMDBDNjMgfSwgLyogR0xfVEVYVFVSRV9HRU5fUSAqLwotICAgeyAzMzY3NywgMHgwMDAwMEM2MiB9LCAvKiBHTF9URVhUVVJFX0dFTl9SICovCi0gICB7IDMzNjk0LCAweDAwMDAwQzYwIH0sIC8qIEdMX1RFWFRVUkVfR0VOX1MgKi8KLSAgIHsgMzM3MTEsIDB4MDAwMDBDNjEgfSwgLyogR0xfVEVYVFVSRV9HRU5fVCAqLwotICAgeyAzMzcyOCwgMHgwMDAwODE5RCB9LCAvKiBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggKi8KLSAgIHsgMzM3NTMsIDB4MDAwMDgwNUQgfSwgLyogR0xfVEVYVFVSRV9HUkVFTl9TSVpFICovCi0gICB7IDMzNzc1LCAweDAwMDA4MDVEIH0sIC8qIEdMX1RFWFRVUkVfR1JFRU5fU0laRV9FWFQgKi8KLSAgIHsgMzM4MDEsIDB4MDAwMDEwMDEgfSwgLyogR0xfVEVYVFVSRV9IRUlHSFQgKi8KLSAgIHsgMzM4MTksIDB4MDAwMDgwRUQgfSwgLyogR0xfVEVYVFVSRV9JTkRFWF9TSVpFX0VYVCAqLwotICAgeyAzMzg0NSwgMHgwMDAwODA2MSB9LCAvKiBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFICovCi0gICB7IDMzODcxLCAweDAwMDA4MDYxIH0sIC8qIEdMX1RFWFRVUkVfSU5URU5TSVRZX1NJWkVfRVhUICovCi0gICB7IDMzOTAxLCAweDAwMDAxMDAzIH0sIC8qIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUICovCi0gICB7IDMzOTI4LCAweDAwMDA4MTlDIH0sIC8qIEdMX1RFWFRVUkVfTEVRVUFMX1JfU0dJWCAqLwotICAgeyAzMzk1MywgMHgwMDAwODUwMSB9LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTICovCi0gICB7IDMzOTczLCAweDAwMDA4NTAxIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhUICovCi0gICB7IDMzOTk3LCAweDAwMDA4MTkwIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICovCi0gICB7IDM0MDI0LCAweDAwMDA4MThFIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfU19TR0lYICovCi0gICB7IDM0MDUxLCAweDAwMDA4MThGIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYICovCi0gICB7IDM0MDc4LCAweDAwMDA4MDYwIH0sIC8qIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkUgKi8KLSAgIHsgMzQxMDQsIDB4MDAwMDgwNjAgfSwgLyogR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRV9FWFQgKi8KLSAgIHsgMzQxMzQsIDB4MDAwMDI4MDAgfSwgLyogR0xfVEVYVFVSRV9NQUdfRklMVEVSICovCi0gICB7IDM0MTU2LCAweDAwMDAwQkE4IH0sIC8qIEdMX1RFWFRVUkVfTUFUUklYICovCi0gICB7IDM0MTc0LCAweDAwMDA4NEZFIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICovCi0gICB7IDM0MjA0LCAweDAwMDA4MzZCIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1JfU0dJWCAqLwotICAgeyAzNDIzMiwgMHgwMDAwODM2OSB9LCAvKiBHTF9URVhUVVJFX01BWF9DTEFNUF9TX1NHSVggKi8KLSAgIHsgMzQyNjAsIDB4MDAwMDgzNkEgfSwgLyogR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICovCi0gICB7IDM0Mjg4LCAweDAwMDA4MTNEIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0xFVkVMICovCi0gICB7IDM0MzA5LCAweDAwMDA4MTNCIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0xPRCAqLwotICAgeyAzNDMyOCwgMHgwMDAwMjgwMSB9LCAvKiBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KLSAgIHsgMzQzNTAsIDB4MDAwMDgxM0EgfSwgLyogR0xfVEVYVFVSRV9NSU5fTE9EICovCi0gICB7IDM0MzY5LCAweDAwMDA4MDY2IH0sIC8qIEdMX1RFWFRVUkVfUFJJT1JJVFkgKi8KLSAgIHsgMzQzODksIDB4MDAwMDg0RjUgfSwgLyogR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCi0gICB7IDM0NDE0LCAweDAwMDA4NEY1IH0sIC8qIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICovCi0gICB7IDM0NDM4LCAweDAwMDA4MDVDIH0sIC8qIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KLSAgIHsgMzQ0NTgsIDB4MDAwMDgwNUMgfSwgLyogR0xfVEVYVFVSRV9SRURfU0laRV9FWFQgKi8KLSAgIHsgMzQ0ODIsIDB4MDAwMDgwNjcgfSwgLyogR0xfVEVYVFVSRV9SRVNJREVOVCAqLwotICAgeyAzNDUwMiwgMHgwMDAwMEJBNSB9LCAvKiBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICovCi0gICB7IDM0NTI1LCAweDAwMDA4MDY1IH0sIC8qIEdMX1RFWFRVUkVfVE9PX0xBUkdFX0VYVCAqLwotICAgeyAzNDU1MCwgMHgwMDAwODg4RiB9LCAvKiBHTF9URVhUVVJFX1VOU0lHTkVEX1JFTUFQX01PREVfTlYgKi8KLSAgIHsgMzQ1ODQsIDB4MDAwMDEwMDAgfSwgLyogR0xfVEVYVFVSRV9XSURUSCAqLwotICAgeyAzNDYwMSwgMHgwMDAwODA3MiB9LCAvKiBHTF9URVhUVVJFX1dSQVBfUiAqLwotICAgeyAzNDYxOSwgMHgwMDAwMjgwMiB9LCAvKiBHTF9URVhUVVJFX1dSQVBfUyAqLwotICAgeyAzNDYzNywgMHgwMDAwMjgwMyB9LCAvKiBHTF9URVhUVVJFX1dSQVBfVCAqLwotICAgeyAzNDY1NSwgMHgwMDAwODhCRiB9LCAvKiBHTF9USU1FX0VMQVBTRURfRVhUICovCi0gICB7IDM0Njc1LCAweDAwMDA4NjQ4IH0sIC8qIEdMX1RSQUNLX01BVFJJWF9OViAqLwotICAgeyAzNDY5NCwgMHgwMDAwODY0OSB9LCAvKiBHTF9UUkFDS19NQVRSSVhfVFJBTlNGT1JNX05WICovCi0gICB7IDM0NzIzLCAweDAwMDAxMDAwIH0sIC8qIEdMX1RSQU5TRk9STV9CSVQgKi8KLSAgIHsgMzQ3NDAsIDB4MDAwMDg0RTYgfSwgLyogR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWCAqLwotICAgeyAzNDc2NiwgMHgwMDAwODRFNiB9LCAvKiBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYX0FSQiAqLwotICAgeyAzNDc5NiwgMHgwMDAwODhCNyB9LCAvKiBHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCICovCi0gICB7IDM0ODI4LCAweDAwMDA4NEUzIH0sIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYICovCi0gICB7IDM0ODU4LCAweDAwMDA4NEUzIH0sIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYX0FSQiAqLwotICAgeyAzNDg5MiwgMHgwMDAwODYyQyB9LCAvKiBHTF9UUkFOU1BPU0VfTlYgKi8KLSAgIHsgMzQ5MDgsIDB4MDAwMDg0RTQgfSwgLyogR0xfVFJBTlNQT1NFX1BST0pFQ1RJT05fTUFUUklYICovCi0gICB7IDM0OTM5LCAweDAwMDA4NEU0IH0sIC8qIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWF9BUkIgKi8KLSAgIHsgMzQ5NzQsIDB4MDAwMDg0RTUgfSwgLyogR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICovCi0gICB7IDM1MDAyLCAweDAwMDA4NEU1IH0sIC8qIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWF9BUkIgKi8KLSAgIHsgMzUwMzQsIDB4MDAwMDAwMDQgfSwgLyogR0xfVFJJQU5HTEVTICovCi0gICB7IDM1MDQ3LCAweDAwMDAwMDA2IH0sIC8qIEdMX1RSSUFOR0xFX0ZBTiAqLwotICAgeyAzNTA2MywgMHgwMDAwODYxNSB9LCAvKiBHTF9UUklBTkdMRV9NRVNIX1NVTiAqLwotICAgeyAzNTA4NCwgMHgwMDAwMDAwNSB9LCAvKiBHTF9UUklBTkdMRV9TVFJJUCAqLwotICAgeyAzNTEwMiwgMHgwMDAwMDAwMSB9LCAvKiBHTF9UUlVFICovCi0gICB7IDM1MTEwLCAweDAwMDAwQ0Y1IH0sIC8qIEdMX1VOUEFDS19BTElHTk1FTlQgKi8KLSAgIHsgMzUxMzAsIDB4MDAwMDgwNkUgfSwgLyogR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAqLwotICAgeyAzNTE1MywgMHgwMDAwMENGMSB9LCAvKiBHTF9VTlBBQ0tfTFNCX0ZJUlNUICovCi0gICB7IDM1MTczLCAweDAwMDAwQ0YyIH0sIC8qIEdMX1VOUEFDS19ST1dfTEVOR1RIICovCi0gICB7IDM1MTk0LCAweDAwMDA4MDZEIH0sIC8qIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAqLwotICAgeyAzNTIxNiwgMHgwMDAwMENGNCB9LCAvKiBHTF9VTlBBQ0tfU0tJUF9QSVhFTFMgKi8KLSAgIHsgMzUyMzgsIDB4MDAwMDBDRjMgfSwgLyogR0xfVU5QQUNLX1NLSVBfUk9XUyAqLwotICAgeyAzNTI1OCwgMHgwMDAwMENGMCB9LCAvKiBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLwotICAgeyAzNTI3OSwgMHgwMDAwMTQwMSB9LCAvKiBHTF9VTlNJR05FRF9CWVRFICovCi0gICB7IDM1Mjk2LCAweDAwMDA4MzYyIH0sIC8qIEdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWICovCi0gICB7IDM1MzIzLCAweDAwMDA4MDMyIH0sIC8qIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgKi8KLSAgIHsgMzUzNDYsIDB4MDAwMDE0MDUgfSwgLyogR0xfVU5TSUdORURfSU5UICovCi0gICB7IDM1MzYyLCAweDAwMDA4MDM2IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yICovCi0gICB7IDM1Mzg5LCAweDAwMDA4NEZBIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICovCi0gICB7IDM1NDEzLCAweDAwMDA4MzY4IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFViAqLwotICAgeyAzNTQ0NCwgMHgwMDAwODAzNSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCAqLwotICAgeyAzNTQ2OCwgMHgwMDAwODM2NyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgKi8KLSAgIHsgMzU0OTYsIDB4MDAwMDE0MDMgfSwgLyogR0xfVU5TSUdORURfU0hPUlQgKi8KLSAgIHsgMzU1MTQsIDB4MDAwMDgzNjYgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYgKi8KLSAgIHsgMzU1NDQsIDB4MDAwMDgwMzMgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAqLwotICAgeyAzNTU3MCwgMHgwMDAwODM2NSB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViAqLwotICAgeyAzNTYwMCwgMHgwMDAwODAzNCB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICovCi0gICB7IDM1NjI2LCAweDAwMDA4MzYzIH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICovCi0gICB7IDM1NjUwLCAweDAwMDA4MzY0IH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAqLwotICAgeyAzNTY3OCwgMHgwMDAwODVCQSB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgKi8KLSAgIHsgMzU3MDYsIDB4MDAwMDg1QkEgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgKi8KLSAgIHsgMzU3MzMsIDB4MDAwMDg1QkIgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSAqLwotICAgeyAzNTc2NSwgMHgwMDAwODVCQiB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX01FU0EgKi8KLSAgIHsgMzU3OTYsIDB4MDAwMDhDQTIgfSwgLyogR0xfVVBQRVJfTEVGVCAqLwotICAgeyAzNTgxMCwgMHgwMDAwMkEyMCB9LCAvKiBHTF9WMkYgKi8KLSAgIHsgMzU4MTcsIDB4MDAwMDJBMjEgfSwgLyogR0xfVjNGICovCi0gICB7IDM1ODI0LCAweDAwMDA4QjgzIH0sIC8qIEdMX1ZBTElEQVRFX1NUQVRVUyAqLwotICAgeyAzNTg0MywgMHgwMDAwMUYwMCB9LCAvKiBHTF9WRU5ET1IgKi8KLSAgIHsgMzU4NTMsIDB4MDAwMDFGMDIgfSwgLyogR0xfVkVSU0lPTiAqLwotICAgeyAzNTg2NCwgMHgwMDAwODA3NCB9LCAvKiBHTF9WRVJURVhfQVJSQVkgKi8KLSAgIHsgMzU4ODAsIDB4MDAwMDg1QjUgfSwgLyogR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfQVBQTEUgKi8KLSAgIHsgMzU5MTAsIDB4MDAwMDg4OTYgfSwgLyogR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7IDM1OTQxLCAweDAwMDA4ODk2IH0sIC8qIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KLSAgIHsgMzU5NzYsIDB4MDAwMDgwOEUgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KLSAgIHsgMzYwMDAsIDB4MDAwMDgwN0EgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1NJWkUgKi8KLSAgIHsgMzYwMjEsIDB4MDAwMDgwN0MgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1NUUklERSAqLwotICAgeyAzNjA0NCwgMHgwMDAwODA3QiB9LCAvKiBHTF9WRVJURVhfQVJSQVlfVFlQRSAqLwotICAgeyAzNjA2NSwgMHgwMDAwODY1MCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMF9OViAqLwotICAgeyAzNjA5MiwgMHgwMDAwODY1QSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgKi8KLSAgIHsgMzYxMjAsIDB4MDAwMDg2NUIgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTExX05WICovCi0gICB7IDM2MTQ4LCAweDAwMDA4NjVDIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAqLwotICAgeyAzNjE3NiwgMHgwMDAwODY1RCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgKi8KLSAgIHsgMzYyMDQsIDB4MDAwMDg2NUUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE0X05WICovCi0gICB7IDM2MjMyLCAweDAwMDA4NjVGIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAqLwotICAgeyAzNjI2MCwgMHgwMDAwODY1MSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAqLwotICAgeyAzNjI4NywgMHgwMDAwODY1MiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAqLwotICAgeyAzNjMxNCwgMHgwMDAwODY1MyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZM19OViAqLwotICAgeyAzNjM0MSwgMHgwMDAwODY1NCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAqLwotICAgeyAzNjM2OCwgMHgwMDAwODY1NSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAqLwotICAgeyAzNjM5NSwgMHgwMDAwODY1NiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNl9OViAqLwotICAgeyAzNjQyMiwgMHgwMDAwODY1NyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAqLwotICAgeyAzNjQ0OSwgMHgwMDAwODY1OCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAqLwotICAgeyAzNjQ3NiwgMHgwMDAwODY1OSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOV9OViAqLwotICAgeyAzNjUwMywgMHgwMDAwODg5RiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICB7IDM2NTQxLCAweDAwMDA4ODlGIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCi0gICB7IDM2NTgzLCAweDAwMDA4NjIyIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAqLwotICAgeyAzNjYxNCwgMHgwMDAwODYyMiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRURfQVJCICovCi0gICB7IDM2NjQ5LCAweDAwMDA4ODZBIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAqLwotICAgeyAzNjY4MywgMHgwMDAwODg2QSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURfQVJCICovCi0gICB7IDM2NzIxLCAweDAwMDA4NjQ1IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAqLwotICAgeyAzNjc1MiwgMHgwMDAwODY0NSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJfQVJCICovCi0gICB7IDM2Nzg3LCAweDAwMDA4NjIzIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAqLwotICAgeyAzNjgxNSwgMHgwMDAwODYyMyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkVfQVJCICovCi0gICB7IDM2ODQ3LCAweDAwMDA4NjI0IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICovCi0gICB7IDM2ODc3LCAweDAwMDA4NjI0IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFX0FSQiAqLwotICAgeyAzNjkxMSwgMHgwMDAwODYyNSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgKi8KLSAgIHsgMzY5MzksIDB4MDAwMDg2MjUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFX0FSQiAqLwotICAgeyAzNjk3MSwgMHgwMDAwODZBNyB9LCAvKiBHTF9WRVJURVhfQkxFTkRfQVJCICovCi0gICB7IDM2OTkxLCAweDAwMDA4NjIwIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAqLwotICAgeyAzNzAxMywgMHgwMDAwODY0QSB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9CSU5ESU5HX05WICovCi0gICB7IDM3MDQyLCAweDAwMDA4NjIwIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX05WICovCi0gICB7IDM3MDYzLCAweDAwMDA4NjQyIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUgKi8KLSAgIHsgMzcwOTIsIDB4MDAwMDg2NDIgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIgKi8KLSAgIHsgMzcxMjUsIDB4MDAwMDg2NDIgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9OViAqLwotICAgeyAzNzE1NywgMHgwMDAwODY0MyB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAqLwotICAgeyAzNzE4NCwgMHgwMDAwODY0MyB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERV9BUkIgKi8KLSAgIHsgMzcyMTUsIDB4MDAwMDg2NDMgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfTlYgKi8KLSAgIHsgMzcyNDUsIDB4MDAwMDhCMzEgfSwgLyogR0xfVkVSVEVYX1NIQURFUiAqLwotICAgeyAzNzI2MiwgMHgwMDAwOEIzMSB9LCAvKiBHTF9WRVJURVhfU0hBREVSX0FSQiAqLwotICAgeyAzNzI4MywgMHgwMDAwODYyMSB9LCAvKiBHTF9WRVJURVhfU1RBVEVfUFJPR1JBTV9OViAqLwotICAgeyAzNzMxMCwgMHgwMDAwMEJBMiB9LCAvKiBHTF9WSUVXUE9SVCAqLwotICAgeyAzNzMyMiwgMHgwMDAwMDgwMCB9LCAvKiBHTF9WSUVXUE9SVF9CSVQgKi8KLSAgIHsgMzczMzgsIDB4MDAwMDg2QUQgfSwgLyogR0xfV0VJR0hUX0FSUkFZX0FSQiAqLwotICAgeyAzNzM1OCwgMHgwMDAwODg5RSB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgIHsgMzczODksIDB4MDAwMDg4OUUgfSwgLyogR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLwotICAgeyAzNzQyNCwgMHgwMDAwODZBQyB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9BUkIgKi8KLSAgIHsgMzc0NTIsIDB4MDAwMDg2QUIgfSwgLyogR0xfV0VJR0hUX0FSUkFZX1NJWkVfQVJCICovCi0gICB7IDM3NDc3LCAweDAwMDA4NkFBIH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICovCi0gICB7IDM3NTA0LCAweDAwMDA4NkE5IH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9UWVBFX0FSQiAqLwotICAgeyAzNzUyOSwgMHgwMDAwODZBNiB9LCAvKiBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAqLwotICAgeyAzNzU1MywgMHgwMDAwODFENCB9LCAvKiBHTF9XUkFQX0JPUkRFUl9TVU4gKi8KLSAgIHsgMzc1NzIsIDB4MDAwMDg4QjkgfSwgLyogR0xfV1JJVEVfT05MWSAqLwotICAgeyAzNzU4NiwgMHgwMDAwODhCOSB9LCAvKiBHTF9XUklURV9PTkxZX0FSQiAqLwotICAgeyAzNzYwNCwgMHgwMDAwMTUwNiB9LCAvKiBHTF9YT1IgKi8KLSAgIHsgMzc2MTEsIDB4MDAwMDg1QjkgfSwgLyogR0xfWUNCQ1JfNDIyX0FQUExFICovCi0gICB7IDM3NjMwLCAweDAwMDA4NzU3IH0sIC8qIEdMX1lDQkNSX01FU0EgKi8KLSAgIHsgMzc2NDQsIDB4MDAwMDAwMDAgfSwgLyogR0xfWkVSTyAqLwotICAgeyAzNzY1MiwgMHgwMDAwMEQxNiB9LCAvKiBHTF9aT09NX1ggKi8KLSAgIHsgMzc2NjIsIDB4MDAwMDBEMTcgfSwgLyogR0xfWk9PTV9ZICovCisgICB7ICAgODc3LCAweDAwMDA4ODk0IH0sIC8qIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7ICAgOTAxLCAweDAwMDA4ODk0IH0sIC8qIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLworICAgeyAgIDkyOSwgMHgwMDAwOEI4NSB9LCAvKiBHTF9BVFRBQ0hFRF9TSEFERVJTICovCisgICB7ICAgOTQ5LCAweDAwMDA4NjQ1IH0sIC8qIEdMX0FUVFJJQl9BUlJBWV9QT0lOVEVSX05WICovCisgICB7ICAgOTc2LCAweDAwMDA4NjIzIH0sIC8qIEdMX0FUVFJJQl9BUlJBWV9TSVpFX05WICovCisgICB7ICAxMDAwLCAweDAwMDA4NjI0IH0sIC8qIEdMX0FUVFJJQl9BUlJBWV9TVFJJREVfTlYgKi8KKyAgIHsgIDEwMjYsIDB4MDAwMDg2MjUgfSwgLyogR0xfQVRUUklCX0FSUkFZX1RZUEVfTlYgKi8KKyAgIHsgIDEwNTAsIDB4MDAwMDBCQjAgfSwgLyogR0xfQVRUUklCX1NUQUNLX0RFUFRIICovCisgICB7ICAxMDcyLCAweDAwMDAwRDgwIH0sIC8qIEdMX0FVVE9fTk9STUFMICovCisgICB7ICAxMDg3LCAweDAwMDAwNDA5IH0sIC8qIEdMX0FVWDAgKi8KKyAgIHsgIDEwOTUsIDB4MDAwMDA0MEEgfSwgLyogR0xfQVVYMSAqLworICAgeyAgMTEwMywgMHgwMDAwMDQwQiB9LCAvKiBHTF9BVVgyICovCisgICB7ICAxMTExLCAweDAwMDAwNDBDIH0sIC8qIEdMX0FVWDMgKi8KKyAgIHsgIDExMTksIDB4MDAwMDBDMDAgfSwgLyogR0xfQVVYX0JVRkZFUlMgKi8KKyAgIHsgIDExMzQsIDB4MDAwMDA0MDUgfSwgLyogR0xfQkFDSyAqLworICAgeyAgMTE0MiwgMHgwMDAwMDQwMiB9LCAvKiBHTF9CQUNLX0xFRlQgKi8KKyAgIHsgIDExNTUsIDB4MDAwMDA0MDMgfSwgLyogR0xfQkFDS19SSUdIVCAqLworICAgeyAgMTE2OSwgMHgwMDAwODBFMCB9LCAvKiBHTF9CR1IgKi8KKyAgIHsgIDExNzYsIDB4MDAwMDgwRTEgfSwgLyogR0xfQkdSQSAqLworICAgeyAgMTE4NCwgMHgwMDAwMUEwMCB9LCAvKiBHTF9CSVRNQVAgKi8KKyAgIHsgIDExOTQsIDB4MDAwMDA3MDQgfSwgLyogR0xfQklUTUFQX1RPS0VOICovCisgICB7ICAxMjEwLCAweDAwMDAwQkUyIH0sIC8qIEdMX0JMRU5EICovCisgICB7ICAxMjE5LCAweDAwMDA4MDA1IH0sIC8qIEdMX0JMRU5EX0NPTE9SICovCisgICB7ICAxMjM0LCAweDAwMDA4MDA1IH0sIC8qIEdMX0JMRU5EX0NPTE9SX0VYVCAqLworICAgeyAgMTI1MywgMHgwMDAwMEJFMCB9LCAvKiBHTF9CTEVORF9EU1QgKi8KKyAgIHsgIDEyNjYsIDB4MDAwMDgwQ0EgfSwgLyogR0xfQkxFTkRfRFNUX0FMUEhBICovCisgICB7ICAxMjg1LCAweDAwMDA4MEM4IH0sIC8qIEdMX0JMRU5EX0RTVF9SR0IgKi8KKyAgIHsgIDEzMDIsIDB4MDAwMDgwMDkgfSwgLyogR0xfQkxFTkRfRVFVQVRJT04gKi8KKyAgIHsgIDEzMjAsIDB4MDAwMDg4M0QgfSwgLyogR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgKi8KKyAgIHsgIDEzNDQsIDB4MDAwMDg4M0QgfSwgLyogR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfRVhUICovCisgICB7ICAxMzcyLCAweDAwMDA4MDA5IH0sIC8qIEdMX0JMRU5EX0VRVUFUSU9OX0VYVCAqLworICAgeyAgMTM5NCwgMHgwMDAwODAwOSB9LCAvKiBHTF9CTEVORF9FUVVBVElPTl9SR0JfRVhUICovCisgICB7ICAxNDIwLCAweDAwMDAwQkUxIH0sIC8qIEdMX0JMRU5EX1NSQyAqLworICAgeyAgMTQzMywgMHgwMDAwODBDQiB9LCAvKiBHTF9CTEVORF9TUkNfQUxQSEEgKi8KKyAgIHsgIDE0NTIsIDB4MDAwMDgwQzkgfSwgLyogR0xfQkxFTkRfU1JDX1JHQiAqLworICAgeyAgMTQ2OSwgMHgwMDAwMTkwNSB9LCAvKiBHTF9CTFVFICovCisgICB7ICAxNDc3LCAweDAwMDAwRDFCIH0sIC8qIEdMX0JMVUVfQklBUyAqLworICAgeyAgMTQ5MCwgMHgwMDAwMEQ1NCB9LCAvKiBHTF9CTFVFX0JJVFMgKi8KKyAgIHsgIDE1MDMsIDB4MDAwMDBEMUEgfSwgLyogR0xfQkxVRV9TQ0FMRSAqLworICAgeyAgMTUxNywgMHgwMDAwOEI1NiB9LCAvKiBHTF9CT09MICovCisgICB7ICAxNTI1LCAweDAwMDA4QjU2IH0sIC8qIEdMX0JPT0xfQVJCICovCisgICB7ICAxNTM3LCAweDAwMDA4QjU3IH0sIC8qIEdMX0JPT0xfVkVDMiAqLworICAgeyAgMTU1MCwgMHgwMDAwOEI1NyB9LCAvKiBHTF9CT09MX1ZFQzJfQVJCICovCisgICB7ICAxNTY3LCAweDAwMDA4QjU4IH0sIC8qIEdMX0JPT0xfVkVDMyAqLworICAgeyAgMTU4MCwgMHgwMDAwOEI1OCB9LCAvKiBHTF9CT09MX1ZFQzNfQVJCICovCisgICB7ICAxNTk3LCAweDAwMDA4QjU5IH0sIC8qIEdMX0JPT0xfVkVDNCAqLworICAgeyAgMTYxMCwgMHgwMDAwOEI1OSB9LCAvKiBHTF9CT09MX1ZFQzRfQVJCICovCisgICB7ICAxNjI3LCAweDAwMDA4OEJCIH0sIC8qIEdMX0JVRkZFUl9BQ0NFU1MgKi8KKyAgIHsgIDE2NDQsIDB4MDAwMDg4QkIgfSwgLyogR0xfQlVGRkVSX0FDQ0VTU19BUkIgKi8KKyAgIHsgIDE2NjUsIDB4MDAwMDg4QkMgfSwgLyogR0xfQlVGRkVSX01BUFBFRCAqLworICAgeyAgMTY4MiwgMHgwMDAwODhCQyB9LCAvKiBHTF9CVUZGRVJfTUFQUEVEX0FSQiAqLworICAgeyAgMTcwMywgMHgwMDAwODhCRCB9LCAvKiBHTF9CVUZGRVJfTUFQX1BPSU5URVIgKi8KKyAgIHsgIDE3MjUsIDB4MDAwMDg4QkQgfSwgLyogR0xfQlVGRkVSX01BUF9QT0lOVEVSX0FSQiAqLworICAgeyAgMTc1MSwgMHgwMDAwODc2NCB9LCAvKiBHTF9CVUZGRVJfU0laRSAqLworICAgeyAgMTc2NiwgMHgwMDAwODc2NCB9LCAvKiBHTF9CVUZGRVJfU0laRV9BUkIgKi8KKyAgIHsgIDE3ODUsIDB4MDAwMDg3NjUgfSwgLyogR0xfQlVGRkVSX1VTQUdFICovCisgICB7ICAxODAxLCAweDAwMDA4NzY1IH0sIC8qIEdMX0JVRkZFUl9VU0FHRV9BUkIgKi8KKyAgIHsgIDE4MjEsIDB4MDAwMDE0MDAgfSwgLyogR0xfQllURSAqLworICAgeyAgMTgyOSwgMHgwMDAwMkEyNCB9LCAvKiBHTF9DM0ZfVjNGICovCisgICB7ICAxODQwLCAweDAwMDAyQTI2IH0sIC8qIEdMX0M0Rl9OM0ZfVjNGICovCisgICB7ICAxODU1LCAweDAwMDAyQTIyIH0sIC8qIEdMX0M0VUJfVjJGICovCisgICB7ICAxODY3LCAweDAwMDAyQTIzIH0sIC8qIEdMX0M0VUJfVjNGICovCisgICB7ICAxODc5LCAweDAwMDAwOTAxIH0sIC8qIEdMX0NDVyAqLworICAgeyAgMTg4NiwgMHgwMDAwMjkwMCB9LCAvKiBHTF9DTEFNUCAqLworICAgeyAgMTg5NSwgMHgwMDAwODEyRCB9LCAvKiBHTF9DTEFNUF9UT19CT1JERVIgKi8KKyAgIHsgIDE5MTQsIDB4MDAwMDgxMkQgfSwgLyogR0xfQ0xBTVBfVE9fQk9SREVSX0FSQiAqLworICAgeyAgMTkzNywgMHgwMDAwODEyRCB9LCAvKiBHTF9DTEFNUF9UT19CT1JERVJfU0dJUyAqLworICAgeyAgMTk2MSwgMHgwMDAwODEyRiB9LCAvKiBHTF9DTEFNUF9UT19FREdFICovCisgICB7ICAxOTc4LCAweDAwMDA4MTJGIH0sIC8qIEdMX0NMQU1QX1RPX0VER0VfU0dJUyAqLworICAgeyAgMjAwMCwgMHgwMDAwMTUwMCB9LCAvKiBHTF9DTEVBUiAqLworICAgeyAgMjAwOSwgMHgwMDAwODRFMSB9LCAvKiBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgKi8KKyAgIHsgIDIwMzQsIDB4MDAwMDg0RTEgfSwgLyogR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQiAqLworICAgeyAgMjA2MywgMHhGRkZGRkZGRiB9LCAvKiBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTICovCisgICB7ICAyMDg5LCAweDAwMDAwQkIxIH0sIC8qIEdMX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KKyAgIHsgIDIxMTgsIDB4MDAwMDAwMDEgfSwgLyogR0xfQ0xJRU5UX1BJWEVMX1NUT1JFX0JJVCAqLworICAgeyAgMjE0NCwgMHgwMDAwMDAwMiB9LCAvKiBHTF9DTElFTlRfVkVSVEVYX0FSUkFZX0JJVCAqLworICAgeyAgMjE3MSwgMHgwMDAwMzAwMCB9LCAvKiBHTF9DTElQX1BMQU5FMCAqLworICAgeyAgMjE4NiwgMHgwMDAwMzAwMSB9LCAvKiBHTF9DTElQX1BMQU5FMSAqLworICAgeyAgMjIwMSwgMHgwMDAwMzAwMiB9LCAvKiBHTF9DTElQX1BMQU5FMiAqLworICAgeyAgMjIxNiwgMHgwMDAwMzAwMyB9LCAvKiBHTF9DTElQX1BMQU5FMyAqLworICAgeyAgMjIzMSwgMHgwMDAwMzAwNCB9LCAvKiBHTF9DTElQX1BMQU5FNCAqLworICAgeyAgMjI0NiwgMHgwMDAwMzAwNSB9LCAvKiBHTF9DTElQX1BMQU5FNSAqLworICAgeyAgMjI2MSwgMHgwMDAwODBGMCB9LCAvKiBHTF9DTElQX1ZPTFVNRV9DTElQUElOR19ISU5UX0VYVCAqLworICAgeyAgMjI5NCwgMHgwMDAwMEEwMCB9LCAvKiBHTF9DT0VGRiAqLworICAgeyAgMjMwMywgMHgwMDAwMTgwMCB9LCAvKiBHTF9DT0xPUiAqLworICAgeyAgMjMxMiwgMHgwMDAwODA3NiB9LCAvKiBHTF9DT0xPUl9BUlJBWSAqLworICAgeyAgMjMyNywgMHgwMDAwODg5OCB9LCAvKiBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAgMjM1NywgMHgwMDAwODg5OCB9LCAvKiBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KKyAgIHsgIDIzOTEsIDB4MDAwMDgwOTAgfSwgLyogR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAqLworICAgeyAgMjQxNCwgMHgwMDAwODA4MSB9LCAvKiBHTF9DT0xPUl9BUlJBWV9TSVpFICovCisgICB7ICAyNDM0LCAweDAwMDA4MDgzIH0sIC8qIEdMX0NPTE9SX0FSUkFZX1NUUklERSAqLworICAgeyAgMjQ1NiwgMHgwMDAwODA4MiB9LCAvKiBHTF9DT0xPUl9BUlJBWV9UWVBFICovCisgICB7ICAyNDc2LCAweDAwMDA4Q0UwIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCAqLworICAgeyAgMjUwMSwgMHgwMDAwOENFQSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfRVhUICovCisgICB7ICAyNTI3LCAweDAwMDA4Q0VCIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9FWFQgKi8KKyAgIHsgIDI1NTMsIDB4MDAwMDhDRUMgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDEyX0VYVCAqLworICAgeyAgMjU3OSwgMHgwMDAwOENFRCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfRVhUICovCisgICB7ICAyNjA1LCAweDAwMDA4Q0VFIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9FWFQgKi8KKyAgIHsgIDI2MzEsIDB4MDAwMDhDRUYgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDE1X0VYVCAqLworICAgeyAgMjY1NywgMHgwMDAwOENFMSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9FWFQgKi8KKyAgIHsgIDI2ODIsIDB4MDAwMDhDRTIgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDJfRVhUICovCisgICB7ICAyNzA3LCAweDAwMDA4Q0UzIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVCAqLworICAgeyAgMjczMiwgMHgwMDAwOENFNCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNF9FWFQgKi8KKyAgIHsgIDI3NTcsIDB4MDAwMDhDRTUgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDVfRVhUICovCisgICB7ICAyNzgyLCAweDAwMDA4Q0U2IH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVCAqLworICAgeyAgMjgwNywgMHgwMDAwOENFNyB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UN19FWFQgKi8KKyAgIHsgIDI4MzIsIDB4MDAwMDhDRTggfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDhfRVhUICovCisgICB7ICAyODU3LCAweDAwMDA4Q0U5IH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X0VYVCAqLworICAgeyAgMjg4MiwgMHgwMDAwNDAwMCB9LCAvKiBHTF9DT0xPUl9CVUZGRVJfQklUICovCisgICB7ICAyOTAyLCAweDAwMDAwQzIyIH0sIC8qIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICovCisgICB7ICAyOTIzLCAweDAwMDAxOTAwIH0sIC8qIEdMX0NPTE9SX0lOREVYICovCisgICB7ICAyOTM4LCAweDAwMDAxNjAzIH0sIC8qIEdMX0NPTE9SX0lOREVYRVMgKi8KKyAgIHsgIDI5NTUsIDB4MDAwMDBCRjIgfSwgLyogR0xfQ09MT1JfTE9HSUNfT1AgKi8KKyAgIHsgIDI5NzMsIDB4MDAwMDBCNTcgfSwgLyogR0xfQ09MT1JfTUFURVJJQUwgKi8KKyAgIHsgIDI5OTEsIDB4MDAwMDBCNTUgfSwgLyogR0xfQ09MT1JfTUFURVJJQUxfRkFDRSAqLworICAgeyAgMzAxNCwgMHgwMDAwMEI1NiB9LCAvKiBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIgKi8KKyAgIHsgIDMwNDIsIDB4MDAwMDgwQjEgfSwgLyogR0xfQ09MT1JfTUFUUklYICovCisgICB7ICAzMDU4LCAweDAwMDA4MEIxIH0sIC8qIEdMX0NPTE9SX01BVFJJWF9TR0kgKi8KKyAgIHsgIDMwNzgsIDB4MDAwMDgwQjIgfSwgLyogR0xfQ09MT1JfTUFUUklYX1NUQUNLX0RFUFRIICovCisgICB7ICAzMTA2LCAweDAwMDA4MEIyIH0sIC8qIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgKi8KKyAgIHsgIDMxMzgsIDB4MDAwMDg0NTggfSwgLyogR0xfQ09MT1JfU1VNICovCisgICB7ICAzMTUxLCAweDAwMDA4NDU4IH0sIC8qIEdMX0NPTE9SX1NVTV9BUkIgKi8KKyAgIHsgIDMxNjgsIDB4MDAwMDgwRDAgfSwgLyogR0xfQ09MT1JfVEFCTEUgKi8KKyAgIHsgIDMxODMsIDB4MDAwMDgwREQgfSwgLyogR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAqLworICAgeyAgMzIwOSwgMHgwMDAwODBERCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFX0VYVCAqLworICAgeyAgMzIzOSwgMHgwMDAwODBERCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFX1NHSSAqLworICAgeyAgMzI2OSwgMHgwMDAwODBENyB9LCAvKiBHTF9DT0xPUl9UQUJMRV9CSUFTICovCisgICB7ICAzMjg5LCAweDAwMDA4MEQ3IH0sIC8qIEdMX0NPTE9SX1RBQkxFX0JJQVNfU0dJICovCisgICB7ICAzMzEzLCAweDAwMDA4MERDIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAqLworICAgeyAgMzMzOCwgMHgwMDAwODBEQyB9LCAvKiBHTF9DT0xPUl9UQUJMRV9CTFVFX1NJWkVfRVhUICovCisgICB7ICAzMzY3LCAweDAwMDA4MERDIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9TR0kgKi8KKyAgIHsgIDMzOTYsIDB4MDAwMDgwRDggfSwgLyogR0xfQ09MT1JfVEFCTEVfRk9STUFUICovCisgICB7ICAzNDE4LCAweDAwMDA4MEQ4IH0sIC8qIEdMX0NPTE9SX1RBQkxFX0ZPUk1BVF9FWFQgKi8KKyAgIHsgIDM0NDQsIDB4MDAwMDgwRDggfSwgLyogR0xfQ09MT1JfVEFCTEVfRk9STUFUX1NHSSAqLworICAgeyAgMzQ3MCwgMHgwMDAwODBEQiB9LCAvKiBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFICovCisgICB7ICAzNDk2LCAweDAwMDA4MERCIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfRVhUICovCisgICB7ICAzNTI2LCAweDAwMDA4MERCIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfU0dJICovCisgICB7ICAzNTU2LCAweDAwMDA4MERGIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICovCisgICB7ICAzNTg2LCAweDAwMDA4MERGIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX0VYVCAqLworICAgeyAgMzYyMCwgMHgwMDAwODBERiB9LCAvKiBHTF9DT0xPUl9UQUJMRV9JTlRFTlNJVFlfU0laRV9TR0kgKi8KKyAgIHsgIDM2NTQsIDB4MDAwMDgwREUgfSwgLyogR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkUgKi8KKyAgIHsgIDM2ODQsIDB4MDAwMDgwREUgfSwgLyogR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfRVhUICovCisgICB7ICAzNzE4LCAweDAwMDA4MERFIH0sIC8qIEdMX0NPTE9SX1RBQkxFX0xVTUlOQU5DRV9TSVpFX1NHSSAqLworICAgeyAgMzc1MiwgMHgwMDAwODBEQSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9SRURfU0laRSAqLworICAgeyAgMzc3NiwgMHgwMDAwODBEQSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9SRURfU0laRV9FWFQgKi8KKyAgIHsgIDM4MDQsIDB4MDAwMDgwREEgfSwgLyogR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfU0dJICovCisgICB7ICAzODMyLCAweDAwMDA4MEQ2IH0sIC8qIEdMX0NPTE9SX1RBQkxFX1NDQUxFICovCisgICB7ICAzODUzLCAweDAwMDA4MEQ2IH0sIC8qIEdMX0NPTE9SX1RBQkxFX1NDQUxFX1NHSSAqLworICAgeyAgMzg3OCwgMHgwMDAwODBEOSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9XSURUSCAqLworICAgeyAgMzg5OSwgMHgwMDAwODBEOSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9XSURUSF9FWFQgKi8KKyAgIHsgIDM5MjQsIDB4MDAwMDgwRDkgfSwgLyogR0xfQ09MT1JfVEFCTEVfV0lEVEhfU0dJICovCisgICB7ICAzOTQ5LCAweDAwMDAwQzIzIH0sIC8qIEdMX0NPTE9SX1dSSVRFTUFTSyAqLworICAgeyAgMzk2OCwgMHgwMDAwODU3MCB9LCAvKiBHTF9DT01CSU5FICovCisgICB7ICAzOTc5LCAweDAwMDA4NTAzIH0sIC8qIEdMX0NPTUJJTkU0ICovCisgICB7ICAzOTkxLCAweDAwMDA4NTcyIH0sIC8qIEdMX0NPTUJJTkVfQUxQSEEgKi8KKyAgIHsgIDQwMDgsIDB4MDAwMDg1NzIgfSwgLyogR0xfQ09NQklORV9BTFBIQV9BUkIgKi8KKyAgIHsgIDQwMjksIDB4MDAwMDg1NzIgfSwgLyogR0xfQ09NQklORV9BTFBIQV9FWFQgKi8KKyAgIHsgIDQwNTAsIDB4MDAwMDg1NzAgfSwgLyogR0xfQ09NQklORV9BUkIgKi8KKyAgIHsgIDQwNjUsIDB4MDAwMDg1NzAgfSwgLyogR0xfQ09NQklORV9FWFQgKi8KKyAgIHsgIDQwODAsIDB4MDAwMDg1NzEgfSwgLyogR0xfQ09NQklORV9SR0IgKi8KKyAgIHsgIDQwOTUsIDB4MDAwMDg1NzEgfSwgLyogR0xfQ09NQklORV9SR0JfQVJCICovCisgICB7ICA0MTE0LCAweDAwMDA4NTcxIH0sIC8qIEdMX0NPTUJJTkVfUkdCX0VYVCAqLworICAgeyAgNDEzMywgMHgwMDAwODg0RSB9LCAvKiBHTF9DT01QQVJFX1JFRl9ERVBUSF9UT19URVhUVVJFX0VYVCAqLworICAgeyAgNDE2OSwgMHgwMDAwODg0RSB9LCAvKiBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRSAqLworICAgeyAgNDE5MywgMHgwMDAwODg0RSB9LCAvKiBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgKi8KKyAgIHsgIDQyMjEsIDB4MDAwMDEzMDAgfSwgLyogR0xfQ09NUElMRSAqLworICAgeyAgNDIzMiwgMHgwMDAwMTMwMSB9LCAvKiBHTF9DT01QSUxFX0FORF9FWEVDVVRFICovCisgICB7ICA0MjU1LCAweDAwMDA4QjgxIH0sIC8qIEdMX0NPTVBJTEVfU1RBVFVTICovCisgICB7ICA0MjczLCAweDAwMDA4NEU5IH0sIC8qIEdMX0NPTVBSRVNTRURfQUxQSEEgKi8KKyAgIHsgIDQyOTMsIDB4MDAwMDg0RTkgfSwgLyogR0xfQ09NUFJFU1NFRF9BTFBIQV9BUkIgKi8KKyAgIHsgIDQzMTcsIDB4MDAwMDg0RUMgfSwgLyogR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFkgKi8KKyAgIHsgIDQzNDEsIDB4MDAwMDg0RUMgfSwgLyogR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFlfQVJCICovCisgICB7ICA0MzY5LCAweDAwMDA4NEVBIH0sIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFICovCisgICB7ICA0MzkzLCAweDAwMDA4NEVCIH0sIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBICovCisgICB7ICA0NDIzLCAweDAwMDA4NEVCIH0sIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBX0FSQiAqLworICAgeyAgNDQ1NywgMHgwMDAwODRFQSB9LCAvKiBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BUkIgKi8KKyAgIHsgIDQ0ODUsIDB4MDAwMDg0RUQgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0IgKi8KKyAgIHsgIDQ1MDMsIDB4MDAwMDg0RUUgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JBICovCisgICB7ICA0NTIyLCAweDAwMDA4NEVFIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9BUkIgKi8KKyAgIHsgIDQ1NDUsIDB4MDAwMDg2QjEgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JBX0ZYVDFfM0RGWCAqLworICAgeyAgNDU3NCwgMHgwMDAwODNGMSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAqLworICAgeyAgNDYwNywgMHgwMDAwODNGMiB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCAqLworICAgeyAgNDY0MCwgMHgwMDAwODNGMyB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCAqLworICAgeyAgNDY3MywgMHgwMDAwODRFRCB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQl9BUkIgKi8KKyAgIHsgIDQ2OTUsIDB4MDAwMDg2QjAgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICovCisgICB7ICA0NzIzLCAweDAwMDA4M0YwIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgKi8KKyAgIHsgIDQ3NTUsIDB4MDAwMDg2QTMgfSwgLyogR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgKi8KKyAgIHsgIDQ3ODUsIDB4MDAwMDg1NzYgfSwgLyogR0xfQ09OU1RBTlQgKi8KKyAgIHsgIDQ3OTcsIDB4MDAwMDgwMDMgfSwgLyogR0xfQ09OU1RBTlRfQUxQSEEgKi8KKyAgIHsgIDQ4MTUsIDB4MDAwMDgwMDMgfSwgLyogR0xfQ09OU1RBTlRfQUxQSEFfRVhUICovCisgICB7ICA0ODM3LCAweDAwMDA4NTc2IH0sIC8qIEdMX0NPTlNUQU5UX0FSQiAqLworICAgeyAgNDg1MywgMHgwMDAwMTIwNyB9LCAvKiBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAqLworICAgeyAgNDg3NywgMHgwMDAwODE1MSB9LCAvKiBHTF9DT05TVEFOVF9CT1JERVJfSFAgKi8KKyAgIHsgIDQ4OTksIDB4MDAwMDgwMDEgfSwgLyogR0xfQ09OU1RBTlRfQ09MT1IgKi8KKyAgIHsgIDQ5MTcsIDB4MDAwMDgwMDEgfSwgLyogR0xfQ09OU1RBTlRfQ09MT1JfRVhUICovCisgICB7ICA0OTM5LCAweDAwMDA4NTc2IH0sIC8qIEdMX0NPTlNUQU5UX0VYVCAqLworICAgeyAgNDk1NSwgMHgwMDAwODAxMCB9LCAvKiBHTF9DT05WT0xVVElPTl8xRCAqLworICAgeyAgNDk3MywgMHgwMDAwODAxMSB9LCAvKiBHTF9DT05WT0xVVElPTl8yRCAqLworICAgeyAgNDk5MSwgMHgwMDAwODE1NCB9LCAvKiBHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1IgKi8KKyAgIHsgIDUwMTksIDB4MDAwMDgxNTQgfSwgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX0NPTE9SX0hQICovCisgICB7ICA1MDUwLCAweDAwMDA4MDEzIH0sIC8qIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFICovCisgICB7ICA1MDc3LCAweDAwMDA4MDEzIH0sIC8qIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFX0VYVCAqLworICAgeyAgNTEwOCwgMHgwMDAwODAxNSB9LCAvKiBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUyAqLworICAgeyAgNTEzNSwgMHgwMDAwODAxNSB9LCAvKiBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBU19FWFQgKi8KKyAgIHsgIDUxNjYsIDB4MDAwMDgwMTQgfSwgLyogR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICovCisgICB7ICA1MTk0LCAweDAwMDA4MDE0IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9TQ0FMRV9FWFQgKi8KKyAgIHsgIDUyMjYsIDB4MDAwMDgwMTcgfSwgLyogR0xfQ09OVk9MVVRJT05fRk9STUFUICovCisgICB7ICA1MjQ4LCAweDAwMDA4MDE3IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0ZPUk1BVF9FWFQgKi8KKyAgIHsgIDUyNzQsIDB4MDAwMDgwMTkgfSwgLyogR0xfQ09OVk9MVVRJT05fSEVJR0hUICovCisgICB7ICA1Mjk2LCAweDAwMDA4MDE5IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0hFSUdIVF9FWFQgKi8KKyAgIHsgIDUzMjIsIDB4MDAwMDgwMTggfSwgLyogR0xfQ09OVk9MVVRJT05fV0lEVEggKi8KKyAgIHsgIDUzNDMsIDB4MDAwMDgwMTggfSwgLyogR0xfQ09OVk9MVVRJT05fV0lEVEhfRVhUICovCisgICB7ICA1MzY4LCAweDAwMDA4ODYyIH0sIC8qIEdMX0NPT1JEX1JFUExBQ0UgKi8KKyAgIHsgIDUzODUsIDB4MDAwMDg4NjIgfSwgLyogR0xfQ09PUkRfUkVQTEFDRV9BUkIgKi8KKyAgIHsgIDU0MDYsIDB4MDAwMDg4NjIgfSwgLyogR0xfQ09PUkRfUkVQTEFDRV9OViAqLworICAgeyAgNTQyNiwgMHgwMDAwMTUwMyB9LCAvKiBHTF9DT1BZICovCisgICB7ICA1NDM0LCAweDAwMDAxNTBDIH0sIC8qIEdMX0NPUFlfSU5WRVJURUQgKi8KKyAgIHsgIDU0NTEsIDB4MDAwMDA3MDYgfSwgLyogR0xfQ09QWV9QSVhFTF9UT0tFTiAqLworICAgeyAgNTQ3MSwgMHgwMDAwMEI0NCB9LCAvKiBHTF9DVUxMX0ZBQ0UgKi8KKyAgIHsgIDU0ODQsIDB4MDAwMDBCNDUgfSwgLyogR0xfQ1VMTF9GQUNFX01PREUgKi8KKyAgIHsgIDU1MDIsIDB4MDAwMDgxQUEgfSwgLyogR0xfQ1VMTF9WRVJURVhfRVhUICovCisgICB7ICA1NTIxLCAweDAwMDA4MUFDIH0sIC8qIEdMX0NVTExfVkVSVEVYX0VZRV9QT1NJVElPTl9FWFQgKi8KKyAgIHsgIDU1NTMsIDB4MDAwMDgxQUIgfSwgLyogR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAqLworICAgeyAgNTU4OCwgMHgwMDAwODYyNiB9LCAvKiBHTF9DVVJSRU5UX0FUVFJJQl9OViAqLworICAgeyAgNTYwOSwgMHgwMDAwMDAwMSB9LCAvKiBHTF9DVVJSRU5UX0JJVCAqLworICAgeyAgNTYyNCwgMHgwMDAwMEIwMCB9LCAvKiBHTF9DVVJSRU5UX0NPTE9SICovCisgICB7ICA1NjQxLCAweDAwMDA4NDUzIH0sIC8qIEdMX0NVUlJFTlRfRk9HX0NPT1JEICovCisgICB7ICA1NjYyLCAweDAwMDA4NDUzIH0sIC8qIEdMX0NVUlJFTlRfRk9HX0NPT1JESU5BVEUgKi8KKyAgIHsgIDU2ODgsIDB4MDAwMDBCMDEgfSwgLyogR0xfQ1VSUkVOVF9JTkRFWCAqLworICAgeyAgNTcwNSwgMHgwMDAwODY0MSB9LCAvKiBHTF9DVVJSRU5UX01BVFJJWF9BUkIgKi8KKyAgIHsgIDU3MjcsIDB4MDAwMDg4NDUgfSwgLyogR0xfQ1VSUkVOVF9NQVRSSVhfSU5ERVhfQVJCICovCisgICB7ICA1NzU1LCAweDAwMDA4NjQxIH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX05WICovCisgICB7ICA1Nzc2LCAweDAwMDA4NjQwIH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAqLworICAgeyAgNTgxMCwgMHgwMDAwODY0MCB9LCAvKiBHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9OViAqLworICAgeyAgNTg0MywgMHgwMDAwMEIwMiB9LCAvKiBHTF9DVVJSRU5UX05PUk1BTCAqLworICAgeyAgNTg2MSwgMHgwMDAwODg0MyB9LCAvKiBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX0FSQiAqLworICAgeyAgNTg5MSwgMHgwMDAwOEI4RCB9LCAvKiBHTF9DVVJSRU5UX1BST0dSQU0gKi8KKyAgIHsgIDU5MTAsIDB4MDAwMDg4NjUgfSwgLyogR0xfQ1VSUkVOVF9RVUVSWSAqLworICAgeyAgNTkyNywgMHgwMDAwODg2NSB9LCAvKiBHTF9DVVJSRU5UX1FVRVJZX0FSQiAqLworICAgeyAgNTk0OCwgMHgwMDAwMEIwNCB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUiAqLworICAgeyAgNTk3MiwgMHgwMDAwMEIwOSB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSAqLworICAgeyAgNTk5OSwgMHgwMDAwMEIwNSB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWCAqLworICAgeyAgNjAyMywgMHgwMDAwMEIwNyB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTiAqLworICAgeyAgNjA1MCwgMHgwMDAwMEIwOCB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRCAqLworICAgeyAgNjA4MywgMHgwMDAwMEIwNiB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyAqLworICAgeyAgNjExNiwgMHgwMDAwODQ1OSB9LCAvKiBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUiAqLworICAgeyAgNjE0MywgMHgwMDAwMEIwMyB9LCAvKiBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICovCisgICB7ICA2MTY5LCAweDAwMDA4NjI2IH0sIC8qIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAqLworICAgeyAgNjE5NCwgMHgwMDAwODYyNiB9LCAvKiBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUJfQVJCICovCisgICB7ICA2MjIzLCAweDAwMDA4NkE4IH0sIC8qIEdMX0NVUlJFTlRfV0VJR0hUX0FSQiAqLworICAgeyAgNjI0NSwgMHgwMDAwMDkwMCB9LCAvKiBHTF9DVyAqLworICAgeyAgNjI1MSwgMHgwMDAwODc1QiB9LCAvKiBHTF9ERUJVR19BU1NFUlRfTUVTQSAqLworICAgeyAgNjI3MiwgMHgwMDAwODc1OSB9LCAvKiBHTF9ERUJVR19PQkpFQ1RfTUVTQSAqLworICAgeyAgNjI5MywgMHgwMDAwODc1QSB9LCAvKiBHTF9ERUJVR19QUklOVF9NRVNBICovCisgICB7ICA2MzEzLCAweDAwMDAyMTAxIH0sIC8qIEdMX0RFQ0FMICovCisgICB7ICA2MzIyLCAweDAwMDAxRTAzIH0sIC8qIEdMX0RFQ1IgKi8KKyAgIHsgIDYzMzAsIDB4MDAwMDg1MDggfSwgLyogR0xfREVDUl9XUkFQICovCisgICB7ICA2MzQzLCAweDAwMDA4NTA4IH0sIC8qIEdMX0RFQ1JfV1JBUF9FWFQgKi8KKyAgIHsgIDYzNjAsIDB4MDAwMDhCODAgfSwgLyogR0xfREVMRVRFX1NUQVRVUyAqLworICAgeyAgNjM3NywgMHgwMDAwMTgwMSB9LCAvKiBHTF9ERVBUSCAqLworICAgeyAgNjM4NiwgMHgwMDAwOEQwMCB9LCAvKiBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCAqLworICAgeyAgNjQxMCwgMHgwMDAwMEQxRiB9LCAvKiBHTF9ERVBUSF9CSUFTICovCisgICB7ICA2NDI0LCAweDAwMDAwRDU2IH0sIC8qIEdMX0RFUFRIX0JJVFMgKi8KKyAgIHsgIDY0MzgsIDB4MDAwMDg4OTEgfSwgLyogR0xfREVQVEhfQk9VTkRTX0VYVCAqLworICAgeyAgNjQ1OCwgMHgwMDAwODg5MCB9LCAvKiBHTF9ERVBUSF9CT1VORFNfVEVTVF9FWFQgKi8KKyAgIHsgIDY0ODMsIDB4MDAwMDAxMDAgfSwgLyogR0xfREVQVEhfQlVGRkVSX0JJVCAqLworICAgeyAgNjUwMywgMHgwMDAwODY0RiB9LCAvKiBHTF9ERVBUSF9DTEFNUF9OViAqLworICAgeyAgNjUyMSwgMHgwMDAwMEI3MyB9LCAvKiBHTF9ERVBUSF9DTEVBUl9WQUxVRSAqLworICAgeyAgNjU0MiwgMHgwMDAwMTkwMiB9LCAvKiBHTF9ERVBUSF9DT01QT05FTlQgKi8KKyAgIHsgIDY1NjEsIDB4MDAwMDgxQTUgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMTYgKi8KKyAgIHsgIDY1ODIsIDB4MDAwMDgxQTUgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMTZfQVJCICovCisgICB7ICA2NjA3LCAweDAwMDA4MUE1IH0sIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDE2X1NHSVggKi8KKyAgIHsgIDY2MzMsIDB4MDAwMDgxQTYgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMjQgKi8KKyAgIHsgIDY2NTQsIDB4MDAwMDgxQTYgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICovCisgICB7ICA2Njc5LCAweDAwMDA4MUE2IH0sIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDI0X1NHSVggKi8KKyAgIHsgIDY3MDUsIDB4MDAwMDgxQTcgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzIgKi8KKyAgIHsgIDY3MjYsIDB4MDAwMDgxQTcgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzJfQVJCICovCisgICB7ICA2NzUxLCAweDAwMDA4MUE3IH0sIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDMyX1NHSVggKi8KKyAgIHsgIDY3NzcsIDB4MDAwMDBCNzQgfSwgLyogR0xfREVQVEhfRlVOQyAqLworICAgeyAgNjc5MSwgMHgwMDAwMEI3MCB9LCAvKiBHTF9ERVBUSF9SQU5HRSAqLworICAgeyAgNjgwNiwgMHgwMDAwMEQxRSB9LCAvKiBHTF9ERVBUSF9TQ0FMRSAqLworICAgeyAgNjgyMSwgMHgwMDAwODRGOSB9LCAvKiBHTF9ERVBUSF9TVEVOQ0lMX05WICovCisgICB7ICA2ODQxLCAweDAwMDA4ODZGIH0sIC8qIEdMX0RFUFRIX1NURU5DSUxfVE9fQkdSQV9OViAqLworICAgeyAgNjg2OSwgMHgwMDAwODg2RSB9LCAvKiBHTF9ERVBUSF9TVEVOQ0lMX1RPX1JHQkFfTlYgKi8KKyAgIHsgIDY4OTcsIDB4MDAwMDBCNzEgfSwgLyogR0xfREVQVEhfVEVTVCAqLworICAgeyAgNjkxMSwgMHgwMDAwODg0QiB9LCAvKiBHTF9ERVBUSF9URVhUVVJFX01PREUgKi8KKyAgIHsgIDY5MzMsIDB4MDAwMDg4NEIgfSwgLyogR0xfREVQVEhfVEVYVFVSRV9NT0RFX0FSQiAqLworICAgeyAgNjk1OSwgMHgwMDAwMEI3MiB9LCAvKiBHTF9ERVBUSF9XUklURU1BU0sgKi8KKyAgIHsgIDY5NzgsIDB4MDAwMDEyMDEgfSwgLyogR0xfRElGRlVTRSAqLworICAgeyAgNjk4OSwgMHgwMDAwMEJEMCB9LCAvKiBHTF9ESVRIRVIgKi8KKyAgIHsgIDY5OTksIDB4MDAwMDBBMDIgfSwgLyogR0xfRE9NQUlOICovCisgICB7ICA3MDA5LCAweDAwMDAxMTAwIH0sIC8qIEdMX0RPTlRfQ0FSRSAqLworICAgeyAgNzAyMiwgMHgwMDAwODZBRSB9LCAvKiBHTF9ET1QzX1JHQiAqLworICAgeyAgNzAzNCwgMHgwMDAwODZBRiB9LCAvKiBHTF9ET1QzX1JHQkEgKi8KKyAgIHsgIDcwNDcsIDB4MDAwMDg2QUYgfSwgLyogR0xfRE9UM19SR0JBX0FSQiAqLworICAgeyAgNzA2NCwgMHgwMDAwODc0MSB9LCAvKiBHTF9ET1QzX1JHQkFfRVhUICovCisgICB7ICA3MDgxLCAweDAwMDA4NkFFIH0sIC8qIEdMX0RPVDNfUkdCX0FSQiAqLworICAgeyAgNzA5NywgMHgwMDAwODc0MCB9LCAvKiBHTF9ET1QzX1JHQl9FWFQgKi8KKyAgIHsgIDcxMTMsIDB4MDAwMDE0MEEgfSwgLyogR0xfRE9VQkxFICovCisgICB7ICA3MTIzLCAweDAwMDAwQzMyIH0sIC8qIEdMX0RPVUJMRUJVRkZFUiAqLworICAgeyAgNzEzOSwgMHgwMDAwMEMwMSB9LCAvKiBHTF9EUkFXX0JVRkZFUiAqLworICAgeyAgNzE1NCwgMHgwMDAwODgyNSB9LCAvKiBHTF9EUkFXX0JVRkZFUjAgKi8KKyAgIHsgIDcxNzAsIDB4MDAwMDg4MjUgfSwgLyogR0xfRFJBV19CVUZGRVIwX0FSQiAqLworICAgeyAgNzE5MCwgMHgwMDAwODgyNSB9LCAvKiBHTF9EUkFXX0JVRkZFUjBfQVRJICovCisgICB7ICA3MjEwLCAweDAwMDA4ODI2IH0sIC8qIEdMX0RSQVdfQlVGRkVSMSAqLworICAgeyAgNzIyNiwgMHgwMDAwODgyRiB9LCAvKiBHTF9EUkFXX0JVRkZFUjEwICovCisgICB7ICA3MjQzLCAweDAwMDA4ODJGIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTBfQVJCICovCisgICB7ICA3MjY0LCAweDAwMDA4ODJGIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTBfQVRJICovCisgICB7ICA3Mjg1LCAweDAwMDA4ODMwIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTEgKi8KKyAgIHsgIDczMDIsIDB4MDAwMDg4MzAgfSwgLyogR0xfRFJBV19CVUZGRVIxMV9BUkIgKi8KKyAgIHsgIDczMjMsIDB4MDAwMDg4MzAgfSwgLyogR0xfRFJBV19CVUZGRVIxMV9BVEkgKi8KKyAgIHsgIDczNDQsIDB4MDAwMDg4MzEgfSwgLyogR0xfRFJBV19CVUZGRVIxMiAqLworICAgeyAgNzM2MSwgMHgwMDAwODgzMSB9LCAvKiBHTF9EUkFXX0JVRkZFUjEyX0FSQiAqLworICAgeyAgNzM4MiwgMHgwMDAwODgzMSB9LCAvKiBHTF9EUkFXX0JVRkZFUjEyX0FUSSAqLworICAgeyAgNzQwMywgMHgwMDAwODgzMiB9LCAvKiBHTF9EUkFXX0JVRkZFUjEzICovCisgICB7ICA3NDIwLCAweDAwMDA4ODMyIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTNfQVJCICovCisgICB7ICA3NDQxLCAweDAwMDA4ODMyIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTNfQVRJICovCisgICB7ICA3NDYyLCAweDAwMDA4ODMzIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTQgKi8KKyAgIHsgIDc0NzksIDB4MDAwMDg4MzMgfSwgLyogR0xfRFJBV19CVUZGRVIxNF9BUkIgKi8KKyAgIHsgIDc1MDAsIDB4MDAwMDg4MzMgfSwgLyogR0xfRFJBV19CVUZGRVIxNF9BVEkgKi8KKyAgIHsgIDc1MjEsIDB4MDAwMDg4MzQgfSwgLyogR0xfRFJBV19CVUZGRVIxNSAqLworICAgeyAgNzUzOCwgMHgwMDAwODgzNCB9LCAvKiBHTF9EUkFXX0JVRkZFUjE1X0FSQiAqLworICAgeyAgNzU1OSwgMHgwMDAwODgzNCB9LCAvKiBHTF9EUkFXX0JVRkZFUjE1X0FUSSAqLworICAgeyAgNzU4MCwgMHgwMDAwODgyNiB9LCAvKiBHTF9EUkFXX0JVRkZFUjFfQVJCICovCisgICB7ICA3NjAwLCAweDAwMDA4ODI2IH0sIC8qIEdMX0RSQVdfQlVGRkVSMV9BVEkgKi8KKyAgIHsgIDc2MjAsIDB4MDAwMDg4MjcgfSwgLyogR0xfRFJBV19CVUZGRVIyICovCisgICB7ICA3NjM2LCAweDAwMDA4ODI3IH0sIC8qIEdMX0RSQVdfQlVGRkVSMl9BUkIgKi8KKyAgIHsgIDc2NTYsIDB4MDAwMDg4MjcgfSwgLyogR0xfRFJBV19CVUZGRVIyX0FUSSAqLworICAgeyAgNzY3NiwgMHgwMDAwODgyOCB9LCAvKiBHTF9EUkFXX0JVRkZFUjMgKi8KKyAgIHsgIDc2OTIsIDB4MDAwMDg4MjggfSwgLyogR0xfRFJBV19CVUZGRVIzX0FSQiAqLworICAgeyAgNzcxMiwgMHgwMDAwODgyOCB9LCAvKiBHTF9EUkFXX0JVRkZFUjNfQVRJICovCisgICB7ICA3NzMyLCAweDAwMDA4ODI5IH0sIC8qIEdMX0RSQVdfQlVGRkVSNCAqLworICAgeyAgNzc0OCwgMHgwMDAwODgyOSB9LCAvKiBHTF9EUkFXX0JVRkZFUjRfQVJCICovCisgICB7ICA3NzY4LCAweDAwMDA4ODI5IH0sIC8qIEdMX0RSQVdfQlVGRkVSNF9BVEkgKi8KKyAgIHsgIDc3ODgsIDB4MDAwMDg4MkEgfSwgLyogR0xfRFJBV19CVUZGRVI1ICovCisgICB7ICA3ODA0LCAweDAwMDA4ODJBIH0sIC8qIEdMX0RSQVdfQlVGRkVSNV9BUkIgKi8KKyAgIHsgIDc4MjQsIDB4MDAwMDg4MkEgfSwgLyogR0xfRFJBV19CVUZGRVI1X0FUSSAqLworICAgeyAgNzg0NCwgMHgwMDAwODgyQiB9LCAvKiBHTF9EUkFXX0JVRkZFUjYgKi8KKyAgIHsgIDc4NjAsIDB4MDAwMDg4MkIgfSwgLyogR0xfRFJBV19CVUZGRVI2X0FSQiAqLworICAgeyAgNzg4MCwgMHgwMDAwODgyQiB9LCAvKiBHTF9EUkFXX0JVRkZFUjZfQVRJICovCisgICB7ICA3OTAwLCAweDAwMDA4ODJDIH0sIC8qIEdMX0RSQVdfQlVGRkVSNyAqLworICAgeyAgNzkxNiwgMHgwMDAwODgyQyB9LCAvKiBHTF9EUkFXX0JVRkZFUjdfQVJCICovCisgICB7ICA3OTM2LCAweDAwMDA4ODJDIH0sIC8qIEdMX0RSQVdfQlVGRkVSN19BVEkgKi8KKyAgIHsgIDc5NTYsIDB4MDAwMDg4MkQgfSwgLyogR0xfRFJBV19CVUZGRVI4ICovCisgICB7ICA3OTcyLCAweDAwMDA4ODJEIH0sIC8qIEdMX0RSQVdfQlVGRkVSOF9BUkIgKi8KKyAgIHsgIDc5OTIsIDB4MDAwMDg4MkQgfSwgLyogR0xfRFJBV19CVUZGRVI4X0FUSSAqLworICAgeyAgODAxMiwgMHgwMDAwODgyRSB9LCAvKiBHTF9EUkFXX0JVRkZFUjkgKi8KKyAgIHsgIDgwMjgsIDB4MDAwMDg4MkUgfSwgLyogR0xfRFJBV19CVUZGRVI5X0FSQiAqLworICAgeyAgODA0OCwgMHgwMDAwODgyRSB9LCAvKiBHTF9EUkFXX0JVRkZFUjlfQVRJICovCisgICB7ICA4MDY4LCAweDAwMDA4Q0E2IH0sIC8qIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19FWFQgKi8KKyAgIHsgIDgxMDAsIDB4MDAwMDhDQTkgfSwgLyogR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQgKi8KKyAgIHsgIDgxMjQsIDB4MDAwMDA3MDUgfSwgLyogR0xfRFJBV19QSVhFTF9UT0tFTiAqLworICAgeyAgODE0NCwgMHgwMDAwMDMwNCB9LCAvKiBHTF9EU1RfQUxQSEEgKi8KKyAgIHsgIDgxNTcsIDB4MDAwMDAzMDYgfSwgLyogR0xfRFNUX0NPTE9SICovCisgICB7ICA4MTcwLCAweDAwMDA4OEVBIH0sIC8qIEdMX0RZTkFNSUNfQ09QWSAqLworICAgeyAgODE4NiwgMHgwMDAwODhFQSB9LCAvKiBHTF9EWU5BTUlDX0NPUFlfQVJCICovCisgICB7ICA4MjA2LCAweDAwMDA4OEU4IH0sIC8qIEdMX0RZTkFNSUNfRFJBVyAqLworICAgeyAgODIyMiwgMHgwMDAwODhFOCB9LCAvKiBHTF9EWU5BTUlDX0RSQVdfQVJCICovCisgICB7ICA4MjQyLCAweDAwMDA4OEU5IH0sIC8qIEdMX0RZTkFNSUNfUkVBRCAqLworICAgeyAgODI1OCwgMHgwMDAwODhFOSB9LCAvKiBHTF9EWU5BTUlDX1JFQURfQVJCICovCisgICB7ICA4Mjc4LCAweDAwMDAwQjQzIH0sIC8qIEdMX0VER0VfRkxBRyAqLworICAgeyAgODI5MSwgMHgwMDAwODA3OSB9LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVkgKi8KKyAgIHsgIDgzMTAsIDB4MDAwMDg4OUIgfSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7ICA4MzQ0LCAweDAwMDA4ODlCIH0sIC8qIEdMX0VER0VfRkxBR19BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KKyAgIHsgIDgzODIsIDB4MDAwMDgwOTMgfSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVIgKi8KKyAgIHsgIDg0MDksIDB4MDAwMDgwOEMgfSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERSAqLworICAgeyAgODQzNSwgMHgwMDAwODg5MyB9LCAvKiBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAqLworICAgeyAgODQ1OSwgMHgwMDAwODg5NSB9LCAvKiBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7ICA4NDkxLCAweDAwMDA4ODk1IH0sIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCisgICB7ICA4NTI3LCAweDAwMDAxNjAwIH0sIC8qIEdMX0VNSVNTSU9OICovCisgICB7ICA4NTM5LCAweDAwMDAyMDAwIH0sIC8qIEdMX0VOQUJMRV9CSVQgKi8KKyAgIHsgIDg1NTMsIDB4MDAwMDAyMDIgfSwgLyogR0xfRVFVQUwgKi8KKyAgIHsgIDg1NjIsIDB4MDAwMDE1MDkgfSwgLyogR0xfRVFVSVYgKi8KKyAgIHsgIDg1NzEsIDB4MDAwMTAwMDAgfSwgLyogR0xfRVZBTF9CSVQgKi8KKyAgIHsgIDg1ODMsIDB4MDAwMDA4MDAgfSwgLyogR0xfRVhQICovCisgICB7ICA4NTkwLCAweDAwMDAwODAxIH0sIC8qIEdMX0VYUDIgKi8KKyAgIHsgIDg1OTgsIDB4MDAwMDFGMDMgfSwgLyogR0xfRVhURU5TSU9OUyAqLworICAgeyAgODYxMiwgMHgwMDAwMjQwMCB9LCAvKiBHTF9FWUVfTElORUFSICovCisgICB7ICA4NjI2LCAweDAwMDAyNTAyIH0sIC8qIEdMX0VZRV9QTEFORSAqLworICAgeyAgODYzOSwgMHgwMDAwODU1QyB9LCAvKiBHTF9FWUVfUExBTkVfQUJTT0xVVEVfTlYgKi8KKyAgIHsgIDg2NjQsIDB4MDAwMDg1NUIgfSwgLyogR0xfRVlFX1JBRElBTF9OViAqLworICAgeyAgODY4MSwgMHgwMDAwMDAwMCB9LCAvKiBHTF9GQUxTRSAqLworICAgeyAgODY5MCwgMHgwMDAwMTEwMSB9LCAvKiBHTF9GQVNURVNUICovCisgICB7ICA4NzAxLCAweDAwMDAxQzAxIH0sIC8qIEdMX0ZFRURCQUNLICovCisgICB7ICA4NzEzLCAweDAwMDAwREYwIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSICovCisgICB7ICA4NzQwLCAweDAwMDAwREYxIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFICovCisgICB7ICA4NzY0LCAweDAwMDAwREYyIH0sIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFICovCisgICB7ICA4Nzg4LCAweDAwMDAxQjAyIH0sIC8qIEdMX0ZJTEwgKi8KKyAgIHsgIDg3OTYsIDB4MDAwMDFEMDAgfSwgLyogR0xfRkxBVCAqLworICAgeyAgODgwNCwgMHgwMDAwMTQwNiB9LCAvKiBHTF9GTE9BVCAqLworICAgeyAgODgxMywgMHgwMDAwOEI1QSB9LCAvKiBHTF9GTE9BVF9NQVQyICovCisgICB7ICA4ODI3LCAweDAwMDA4QjVBIH0sIC8qIEdMX0ZMT0FUX01BVDJfQVJCICovCisgICB7ICA4ODQ1LCAweDAwMDA4QjVCIH0sIC8qIEdMX0ZMT0FUX01BVDMgKi8KKyAgIHsgIDg4NTksIDB4MDAwMDhCNUIgfSwgLyogR0xfRkxPQVRfTUFUM19BUkIgKi8KKyAgIHsgIDg4NzcsIDB4MDAwMDhCNUMgfSwgLyogR0xfRkxPQVRfTUFUNCAqLworICAgeyAgODg5MSwgMHgwMDAwOEI1QyB9LCAvKiBHTF9GTE9BVF9NQVQ0X0FSQiAqLworICAgeyAgODkwOSwgMHgwMDAwOEI1MCB9LCAvKiBHTF9GTE9BVF9WRUMyICovCisgICB7ICA4OTIzLCAweDAwMDA4QjUwIH0sIC8qIEdMX0ZMT0FUX1ZFQzJfQVJCICovCisgICB7ICA4OTQxLCAweDAwMDA4QjUxIH0sIC8qIEdMX0ZMT0FUX1ZFQzMgKi8KKyAgIHsgIDg5NTUsIDB4MDAwMDhCNTEgfSwgLyogR0xfRkxPQVRfVkVDM19BUkIgKi8KKyAgIHsgIDg5NzMsIDB4MDAwMDhCNTIgfSwgLyogR0xfRkxPQVRfVkVDNCAqLworICAgeyAgODk4NywgMHgwMDAwOEI1MiB9LCAvKiBHTF9GTE9BVF9WRUM0X0FSQiAqLworICAgeyAgOTAwNSwgMHgwMDAwMEI2MCB9LCAvKiBHTF9GT0cgKi8KKyAgIHsgIDkwMTIsIDB4MDAwMDAwODAgfSwgLyogR0xfRk9HX0JJVCAqLworICAgeyAgOTAyMywgMHgwMDAwMEI2NiB9LCAvKiBHTF9GT0dfQ09MT1IgKi8KKyAgIHsgIDkwMzYsIDB4MDAwMDg0NTEgfSwgLyogR0xfRk9HX0NPT1JEICovCisgICB7ICA5MDQ5LCAweDAwMDA4NDUxIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFICovCisgICB7ICA5MDY3LCAweDAwMDA4NDU3IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZICovCisgICB7ICA5MDkxLCAweDAwMDA4ODlEIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7ICA5MTMwLCAweDAwMDA4ODlEIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLworICAgeyAgOTE3MywgMHgwMDAwODQ1NiB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICovCisgICB7ICA5MjA1LCAweDAwMDA4NDU1IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERSAqLworICAgeyAgOTIzNiwgMHgwMDAwODQ1NCB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFICovCisgICB7ICA5MjY1LCAweDAwMDA4NDUwIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRSAqLworICAgeyAgOTI5MCwgMHgwMDAwODQ1NyB9LCAvKiBHTF9GT0dfQ09PUkRfQVJSQVkgKi8KKyAgIHsgIDkzMDksIDB4MDAwMDg4OUQgfSwgLyogR0xfRk9HX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7ICA5MzQzLCAweDAwMDA4NDU2IH0sIC8qIEdMX0ZPR19DT09SRF9BUlJBWV9QT0lOVEVSICovCisgICB7ICA5MzcwLCAweDAwMDA4NDU1IH0sIC8qIEdMX0ZPR19DT09SRF9BUlJBWV9TVFJJREUgKi8KKyAgIHsgIDkzOTYsIDB4MDAwMDg0NTQgfSwgLyogR0xfRk9HX0NPT1JEX0FSUkFZX1RZUEUgKi8KKyAgIHsgIDk0MjAsIDB4MDAwMDg0NTAgfSwgLyogR0xfRk9HX0NPT1JEX1NSQyAqLworICAgeyAgOTQzNywgMHgwMDAwMEI2MiB9LCAvKiBHTF9GT0dfREVOU0lUWSAqLworICAgeyAgOTQ1MiwgMHgwMDAwODU1QSB9LCAvKiBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAqLworICAgeyAgOTQ3NiwgMHgwMDAwMEI2NCB9LCAvKiBHTF9GT0dfRU5EICovCisgICB7ICA5NDg3LCAweDAwMDAwQzU0IH0sIC8qIEdMX0ZPR19ISU5UICovCisgICB7ICA5NDk5LCAweDAwMDAwQjYxIH0sIC8qIEdMX0ZPR19JTkRFWCAqLworICAgeyAgOTUxMiwgMHgwMDAwMEI2NSB9LCAvKiBHTF9GT0dfTU9ERSAqLworICAgeyAgOTUyNCwgMHgwMDAwODE5OCB9LCAvKiBHTF9GT0dfT0ZGU0VUX1NHSVggKi8KKyAgIHsgIDk1NDMsIDB4MDAwMDgxOTkgfSwgLyogR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICovCisgICB7ICA5NTY4LCAweDAwMDAwQjYzIH0sIC8qIEdMX0ZPR19TVEFSVCAqLworICAgeyAgOTU4MSwgMHgwMDAwODQ1MiB9LCAvKiBHTF9GUkFHTUVOVF9ERVBUSCAqLworICAgeyAgOTU5OSwgMHgwMDAwODgwNCB9LCAvKiBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAqLworICAgeyAgOTYyMywgMHgwMDAwOEIzMCB9LCAvKiBHTF9GUkFHTUVOVF9TSEFERVIgKi8KKyAgIHsgIDk2NDIsIDB4MDAwMDhCMzAgfSwgLyogR0xfRlJBR01FTlRfU0hBREVSX0FSQiAqLworICAgeyAgOTY2NSwgMHgwMDAwOEI4QiB9LCAvKiBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UICovCisgICB7ICA5NzAwLCAweDAwMDA4Q0QxIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfRVhUICovCisgICB7ICA5NzQyLCAweDAwMDA4Q0QwIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUICovCisgICB7ICA5Nzg0LCAweDAwMDA4Q0Q0IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCAqLworICAgeyAgOTgzMywgMHgwMDAwOENEMyB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9FWFQgKi8KKyAgIHsgIDk4ODUsIDB4MDAwMDhDRDQgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAqLworICAgeyAgOTkyOSwgMHgwMDAwOENEMiB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfRVhUICovCisgICB7ICA5OTczLCAweDAwMDA4Q0E2IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUICovCisgICB7IDEwMDAwLCAweDAwMDA4Q0Q1IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCAqLworICAgeyAxMDAyOCwgMHgwMDAwOEQ0MCB9LCAvKiBHTF9GUkFNRUJVRkZFUl9FWFQgKi8KKyAgIHsgMTAwNDcsIDB4MDAwMDhDRDYgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX0VYVCAqLworICAgeyAxMDA4OCwgMHgwMDAwOENEOSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfRVhUICovCisgICB7IDEwMTI5LCAweDAwMDA4Q0RCIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfRVhUICovCisgICB7IDEwMTcxLCAweDAwMDA4Q0Q4IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFVQTElDQVRFX0FUVEFDSE1FTlRfRVhUICovCisgICB7IDEwMjIyLCAweDAwMDA4Q0RBIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFQgKi8KKyAgIHsgMTAyNjAsIDB4MDAwMDhDRDcgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUICovCisgICB7IDEwMzA5LCAweDAwMDA4Q0RDIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfRVhUICovCisgICB7IDEwMzUxLCAweDAwMDA4Q0RFIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX1NUQVRVU19FUlJPUl9FWFQgKi8KKyAgIHsgMTAzODMsIDB4MDAwMDhDREQgfSwgLyogR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfRVhUICovCisgICB7IDEwNDE0LCAweDAwMDAwNDA0IH0sIC8qIEdMX0ZST05UICovCisgICB7IDEwNDIzLCAweDAwMDAwNDA4IH0sIC8qIEdMX0ZST05UX0FORF9CQUNLICovCisgICB7IDEwNDQxLCAweDAwMDAwQjQ2IH0sIC8qIEdMX0ZST05UX0ZBQ0UgKi8KKyAgIHsgMTA0NTUsIDB4MDAwMDA0MDAgfSwgLyogR0xfRlJPTlRfTEVGVCAqLworICAgeyAxMDQ2OSwgMHgwMDAwMDQwMSB9LCAvKiBHTF9GUk9OVF9SSUdIVCAqLworICAgeyAxMDQ4NCwgMHgwMDAwODAwNiB9LCAvKiBHTF9GVU5DX0FERCAqLworICAgeyAxMDQ5NiwgMHgwMDAwODAwNiB9LCAvKiBHTF9GVU5DX0FERF9FWFQgKi8KKyAgIHsgMTA1MTIsIDB4MDAwMDgwMEIgfSwgLyogR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICovCisgICB7IDEwNTM3LCAweDAwMDA4MDBCIH0sIC8qIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF9FWFQgKi8KKyAgIHsgMTA1NjYsIDB4MDAwMDgwMEEgfSwgLyogR0xfRlVOQ19TVUJUUkFDVCAqLworICAgeyAxMDU4MywgMHgwMDAwODAwQSB9LCAvKiBHTF9GVU5DX1NVQlRSQUNUX0VYVCAqLworICAgeyAxMDYwNCwgMHgwMDAwODE5MSB9LCAvKiBHTF9HRU5FUkFURV9NSVBNQVAgKi8KKyAgIHsgMTA2MjMsIDB4MDAwMDgxOTIgfSwgLyogR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgKi8KKyAgIHsgMTA2NDcsIDB4MDAwMDgxOTIgfSwgLyogR0xfR0VORVJBVEVfTUlQTUFQX0hJTlRfU0dJUyAqLworICAgeyAxMDY3NiwgMHgwMDAwODE5MSB9LCAvKiBHTF9HRU5FUkFURV9NSVBNQVBfU0dJUyAqLworICAgeyAxMDcwMCwgMHgwMDAwMDIwNiB9LCAvKiBHTF9HRVFVQUwgKi8KKyAgIHsgMTA3MTAsIDB4MDAwMDgwMDkgfSwgLyogR0xfR0xfQkxFTkRfRVFVQVRJT05fUkdCICovCisgICB7IDEwNzM1LCAweDAwMDA4QzRBIH0sIC8qIEdMX0dMX0NPTVBSRVNTRURfU0xVTUlOQU5DRSAqLworICAgeyAxMDc2MywgMHgwMDAwOEM0QiB9LCAvKiBHTF9HTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfQUxQSEEgKi8KKyAgIHsgMTA3OTcsIDB4MDAwMDhDNDggfSwgLyogR0xfR0xfQ09NUFJFU1NFRF9TUkdCICovCisgICB7IDEwODE5LCAweDAwMDA4QzQ5IH0sIC8qIEdMX0dMX0NPTVBSRVNTRURfU1JHQl9BTFBIQSAqLworICAgeyAxMDg0NywgMHgwMDAwODQ1RiB9LCAvKiBHTF9HTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgKi8KKyAgIHsgMTA4ODQsIDB4MDAwMDhCNjUgfSwgLyogR0xfR0xfRkxPQVRfTUFUMngzICovCisgICB7IDEwOTAzLCAweDAwMDA4QjY2IH0sIC8qIEdMX0dMX0ZMT0FUX01BVDJ4NCAqLworICAgeyAxMDkyMiwgMHgwMDAwOEI2NyB9LCAvKiBHTF9HTF9GTE9BVF9NQVQzeDIgKi8KKyAgIHsgMTA5NDEsIDB4MDAwMDhCNjggfSwgLyogR0xfR0xfRkxPQVRfTUFUM3g0ICovCisgICB7IDEwOTYwLCAweDAwMDA4QjY5IH0sIC8qIEdMX0dMX0ZMT0FUX01BVDR4MiAqLworICAgeyAxMDk3OSwgMHgwMDAwOEI2QSB9LCAvKiBHTF9HTF9GTE9BVF9NQVQ0eDMgKi8KKyAgIHsgMTA5OTgsIDB4MDAwMDg4RUIgfSwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVIgKi8KKyAgIHsgMTEwMjIsIDB4MDAwMDg4RUQgfSwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElORyAqLworICAgeyAxMTA1NCwgMHgwMDAwODhFQyB9LCAvKiBHTF9HTF9QSVhFTF9VTlBBQ0tfQlVGRkVSICovCisgICB7IDExMDgwLCAweDAwMDA4OEVGIH0sIC8qIEdMX0dMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElORyAqLworICAgeyAxMTExNCwgMHgwMDAwOEM0NiB9LCAvKiBHTF9HTF9TTFVNSU5BTkNFICovCisgICB7IDExMTMxLCAweDAwMDA4QzQ3IH0sIC8qIEdMX0dMX1NMVU1JTkFOQ0U4ICovCisgICB7IDExMTQ5LCAweDAwMDA4QzQ1IH0sIC8qIEdMX0dMX1NMVU1JTkFOQ0U4X0FMUEhBOCAqLworICAgeyAxMTE3NCwgMHgwMDAwOEM0NCB9LCAvKiBHTF9HTF9TTFVNSU5BTkNFX0FMUEhBICovCisgICB7IDExMTk3LCAweDAwMDA4QzQwIH0sIC8qIEdMX0dMX1NSR0IgKi8KKyAgIHsgMTEyMDgsIDB4MDAwMDhDNDEgfSwgLyogR0xfR0xfU1JHQjggKi8KKyAgIHsgMTEyMjAsIDB4MDAwMDhDNDMgfSwgLyogR0xfR0xfU1JHQjhfQUxQSEE4ICovCisgICB7IDExMjM5LCAweDAwMDA4QzQyIH0sIC8qIEdMX0dMX1NSR0JfQUxQSEEgKi8KKyAgIHsgMTEyNTYsIDB4MDAwMDAyMDQgfSwgLyogR0xfR1JFQVRFUiAqLworICAgeyAxMTI2NywgMHgwMDAwMTkwNCB9LCAvKiBHTF9HUkVFTiAqLworICAgeyAxMTI3NiwgMHgwMDAwMEQxOSB9LCAvKiBHTF9HUkVFTl9CSUFTICovCisgICB7IDExMjkwLCAweDAwMDAwRDUzIH0sIC8qIEdMX0dSRUVOX0JJVFMgKi8KKyAgIHsgMTEzMDQsIDB4MDAwMDBEMTggfSwgLyogR0xfR1JFRU5fU0NBTEUgKi8KKyAgIHsgMTEzMTksIDB4MDAwMDgwMDAgfSwgLyogR0xfSElOVF9CSVQgKi8KKyAgIHsgMTEzMzEsIDB4MDAwMDgwMjQgfSwgLyogR0xfSElTVE9HUkFNICovCisgICB7IDExMzQ0LCAweDAwMDA4MDJCIH0sIC8qIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFICovCisgICB7IDExMzY4LCAweDAwMDA4MDJCIH0sIC8qIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFX0VYVCAqLworICAgeyAxMTM5NiwgMHgwMDAwODAyQSB9LCAvKiBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICovCisgICB7IDExNDE5LCAweDAwMDA4MDJBIH0sIC8qIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkVfRVhUICovCisgICB7IDExNDQ2LCAweDAwMDA4MDI0IH0sIC8qIEdMX0hJU1RPR1JBTV9FWFQgKi8KKyAgIHsgMTE0NjMsIDB4MDAwMDgwMjcgfSwgLyogR0xfSElTVE9HUkFNX0ZPUk1BVCAqLworICAgeyAxMTQ4MywgMHgwMDAwODAyNyB9LCAvKiBHTF9ISVNUT0dSQU1fRk9STUFUX0VYVCAqLworICAgeyAxMTUwNywgMHgwMDAwODAyOSB9LCAvKiBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRSAqLworICAgeyAxMTUzMSwgMHgwMDAwODAyOSB9LCAvKiBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRV9FWFQgKi8KKyAgIHsgMTE1NTksIDB4MDAwMDgwMkMgfSwgLyogR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICovCisgICB7IDExNTg3LCAweDAwMDA4MDJDIH0sIC8qIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRV9FWFQgKi8KKyAgIHsgMTE2MTksIDB4MDAwMDgwMjggfSwgLyogR0xfSElTVE9HUkFNX1JFRF9TSVpFICovCisgICB7IDExNjQxLCAweDAwMDA4MDI4IH0sIC8qIEdMX0hJU1RPR1JBTV9SRURfU0laRV9FWFQgKi8KKyAgIHsgMTE2NjcsIDB4MDAwMDgwMkQgfSwgLyogR0xfSElTVE9HUkFNX1NJTksgKi8KKyAgIHsgMTE2ODUsIDB4MDAwMDgwMkQgfSwgLyogR0xfSElTVE9HUkFNX1NJTktfRVhUICovCisgICB7IDExNzA3LCAweDAwMDA4MDI2IH0sIC8qIEdMX0hJU1RPR1JBTV9XSURUSCAqLworICAgeyAxMTcyNiwgMHgwMDAwODAyNiB9LCAvKiBHTF9ISVNUT0dSQU1fV0lEVEhfRVhUICovCisgICB7IDExNzQ5LCAweDAwMDA4NjJBIH0sIC8qIEdMX0lERU5USVRZX05WICovCisgICB7IDExNzY0LCAweDAwMDA4MTUwIH0sIC8qIEdMX0lHTk9SRV9CT1JERVJfSFAgKi8KKyAgIHsgMTE3ODQsIDB4MDAwMDhCOUIgfSwgLyogR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICovCisgICB7IDExODI0LCAweDAwMDA4QjlBIH0sIC8qIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgKi8KKyAgIHsgMTE4NjIsIDB4MDAwMDFFMDIgfSwgLyogR0xfSU5DUiAqLworICAgeyAxMTg3MCwgMHgwMDAwODUwNyB9LCAvKiBHTF9JTkNSX1dSQVAgKi8KKyAgIHsgMTE4ODMsIDB4MDAwMDg1MDcgfSwgLyogR0xfSU5DUl9XUkFQX0VYVCAqLworICAgeyAxMTkwMCwgMHgwMDAwODA3NyB9LCAvKiBHTF9JTkRFWF9BUlJBWSAqLworICAgeyAxMTkxNSwgMHgwMDAwODg5OSB9LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAxMTk0NSwgMHgwMDAwODg5OSB9LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KKyAgIHsgMTE5NzksIDB4MDAwMDgwOTEgfSwgLyogR0xfSU5ERVhfQVJSQVlfUE9JTlRFUiAqLworICAgeyAxMjAwMiwgMHgwMDAwODA4NiB9LCAvKiBHTF9JTkRFWF9BUlJBWV9TVFJJREUgKi8KKyAgIHsgMTIwMjQsIDB4MDAwMDgwODUgfSwgLyogR0xfSU5ERVhfQVJSQVlfVFlQRSAqLworICAgeyAxMjA0NCwgMHgwMDAwMEQ1MSB9LCAvKiBHTF9JTkRFWF9CSVRTICovCisgICB7IDEyMDU4LCAweDAwMDAwQzIwIH0sIC8qIEdMX0lOREVYX0NMRUFSX1ZBTFVFICovCisgICB7IDEyMDc5LCAweDAwMDAwQkYxIH0sIC8qIEdMX0lOREVYX0xPR0lDX09QICovCisgICB7IDEyMDk3LCAweDAwMDAwQzMwIH0sIC8qIEdMX0lOREVYX01PREUgKi8KKyAgIHsgMTIxMTEsIDB4MDAwMDBEMTMgfSwgLyogR0xfSU5ERVhfT0ZGU0VUICovCisgICB7IDEyMTI3LCAweDAwMDAwRDEyIH0sIC8qIEdMX0lOREVYX1NISUZUICovCisgICB7IDEyMTQyLCAweDAwMDAwQzIxIH0sIC8qIEdMX0lOREVYX1dSSVRFTUFTSyAqLworICAgeyAxMjE2MSwgMHgwMDAwOEI4NCB9LCAvKiBHTF9JTkZPX0xPR19MRU5HVEggKi8KKyAgIHsgMTIxODAsIDB4MDAwMDE0MDQgfSwgLyogR0xfSU5UICovCisgICB7IDEyMTg3LCAweDAwMDA4MDQ5IH0sIC8qIEdMX0lOVEVOU0lUWSAqLworICAgeyAxMjIwMCwgMHgwMDAwODA0QyB9LCAvKiBHTF9JTlRFTlNJVFkxMiAqLworICAgeyAxMjIxNSwgMHgwMDAwODA0QyB9LCAvKiBHTF9JTlRFTlNJVFkxMl9FWFQgKi8KKyAgIHsgMTIyMzQsIDB4MDAwMDgwNEQgfSwgLyogR0xfSU5URU5TSVRZMTYgKi8KKyAgIHsgMTIyNDksIDB4MDAwMDgwNEQgfSwgLyogR0xfSU5URU5TSVRZMTZfRVhUICovCisgICB7IDEyMjY4LCAweDAwMDA4MDRBIH0sIC8qIEdMX0lOVEVOU0lUWTQgKi8KKyAgIHsgMTIyODIsIDB4MDAwMDgwNEEgfSwgLyogR0xfSU5URU5TSVRZNF9FWFQgKi8KKyAgIHsgMTIzMDAsIDB4MDAwMDgwNEIgfSwgLyogR0xfSU5URU5TSVRZOCAqLworICAgeyAxMjMxNCwgMHgwMDAwODA0QiB9LCAvKiBHTF9JTlRFTlNJVFk4X0VYVCAqLworICAgeyAxMjMzMiwgMHgwMDAwODA0OSB9LCAvKiBHTF9JTlRFTlNJVFlfRVhUICovCisgICB7IDEyMzQ5LCAweDAwMDA4NTc1IH0sIC8qIEdMX0lOVEVSUE9MQVRFICovCisgICB7IDEyMzY0LCAweDAwMDA4NTc1IH0sIC8qIEdMX0lOVEVSUE9MQVRFX0FSQiAqLworICAgeyAxMjM4MywgMHgwMDAwODU3NSB9LCAvKiBHTF9JTlRFUlBPTEFURV9FWFQgKi8KKyAgIHsgMTI0MDIsIDB4MDAwMDhCNTMgfSwgLyogR0xfSU5UX1ZFQzIgKi8KKyAgIHsgMTI0MTQsIDB4MDAwMDhCNTMgfSwgLyogR0xfSU5UX1ZFQzJfQVJCICovCisgICB7IDEyNDMwLCAweDAwMDA4QjU0IH0sIC8qIEdMX0lOVF9WRUMzICovCisgICB7IDEyNDQyLCAweDAwMDA4QjU0IH0sIC8qIEdMX0lOVF9WRUMzX0FSQiAqLworICAgeyAxMjQ1OCwgMHgwMDAwOEI1NSB9LCAvKiBHTF9JTlRfVkVDNCAqLworICAgeyAxMjQ3MCwgMHgwMDAwOEI1NSB9LCAvKiBHTF9JTlRfVkVDNF9BUkIgKi8KKyAgIHsgMTI0ODYsIDB4MDAwMDA1MDAgfSwgLyogR0xfSU5WQUxJRF9FTlVNICovCisgICB7IDEyNTAyLCAweDAwMDAwNTA2IH0sIC8qIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAqLworICAgeyAxMjUzOSwgMHgwMDAwMDUwMiB9LCAvKiBHTF9JTlZBTElEX09QRVJBVElPTiAqLworICAgeyAxMjU2MCwgMHgwMDAwMDUwMSB9LCAvKiBHTF9JTlZBTElEX1ZBTFVFICovCisgICB7IDEyNTc3LCAweDAwMDA4NjJCIH0sIC8qIEdMX0lOVkVSU0VfTlYgKi8KKyAgIHsgMTI1OTEsIDB4MDAwMDg2MkQgfSwgLyogR0xfSU5WRVJTRV9UUkFOU1BPU0VfTlYgKi8KKyAgIHsgMTI2MTUsIDB4MDAwMDE1MEEgfSwgLyogR0xfSU5WRVJUICovCisgICB7IDEyNjI1LCAweDAwMDAxRTAwIH0sIC8qIEdMX0tFRVAgKi8KKyAgIHsgMTI2MzMsIDB4MDAwMDA0MDYgfSwgLyogR0xfTEVGVCAqLworICAgeyAxMjY0MSwgMHgwMDAwMDIwMyB9LCAvKiBHTF9MRVFVQUwgKi8KKyAgIHsgMTI2NTEsIDB4MDAwMDAyMDEgfSwgLyogR0xfTEVTUyAqLworICAgeyAxMjY1OSwgMHgwMDAwNDAwMCB9LCAvKiBHTF9MSUdIVDAgKi8KKyAgIHsgMTI2NjksIDB4MDAwMDQwMDEgfSwgLyogR0xfTElHSFQxICovCisgICB7IDEyNjc5LCAweDAwMDA0MDAyIH0sIC8qIEdMX0xJR0hUMiAqLworICAgeyAxMjY4OSwgMHgwMDAwNDAwMyB9LCAvKiBHTF9MSUdIVDMgKi8KKyAgIHsgMTI2OTksIDB4MDAwMDQwMDQgfSwgLyogR0xfTElHSFQ0ICovCisgICB7IDEyNzA5LCAweDAwMDA0MDA1IH0sIC8qIEdMX0xJR0hUNSAqLworICAgeyAxMjcxOSwgMHgwMDAwNDAwNiB9LCAvKiBHTF9MSUdIVDYgKi8KKyAgIHsgMTI3MjksIDB4MDAwMDQwMDcgfSwgLyogR0xfTElHSFQ3ICovCisgICB7IDEyNzM5LCAweDAwMDAwQjUwIH0sIC8qIEdMX0xJR0hUSU5HICovCisgICB7IDEyNzUxLCAweDAwMDAwMDQwIH0sIC8qIEdMX0xJR0hUSU5HX0JJVCAqLworICAgeyAxMjc2NywgMHgwMDAwMEI1MyB9LCAvKiBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICovCisgICB7IDEyNzkwLCAweDAwMDA4MUY4IH0sIC8qIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wgKi8KKyAgIHsgMTI4MTksIDB4MDAwMDgxRjggfSwgLyogR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTF9FWFQgKi8KKyAgIHsgMTI4NTIsIDB4MDAwMDBCNTEgfSwgLyogR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCisgICB7IDEyODgwLCAweDAwMDAwQjUyIH0sIC8qIEdMX0xJR0hUX01PREVMX1RXT19TSURFICovCisgICB7IDEyOTA0LCAweDAwMDAxQjAxIH0sIC8qIEdMX0xJTkUgKi8KKyAgIHsgMTI5MTIsIDB4MDAwMDI2MDEgfSwgLyogR0xfTElORUFSICovCisgICB7IDEyOTIyLCAweDAwMDAxMjA4IH0sIC8qIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAqLworICAgeyAxMjk0NCwgMHgwMDAwODE3MCB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9MSU5FQVJfU0dJWCAqLworICAgeyAxMjk3NCwgMHgwMDAwODQ0RiB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9ORUFSRVNUX1NHSVggKi8KKyAgIHsgMTMwMDUsIDB4MDAwMDI3MDMgfSwgLyogR0xfTElORUFSX01JUE1BUF9MSU5FQVIgKi8KKyAgIHsgMTMwMjksIDB4MDAwMDI3MDEgfSwgLyogR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICovCisgICB7IDEzMDU0LCAweDAwMDAwMDAxIH0sIC8qIEdMX0xJTkVTICovCisgICB7IDEzMDYzLCAweDAwMDAwMDA0IH0sIC8qIEdMX0xJTkVfQklUICovCisgICB7IDEzMDc1LCAweDAwMDAwMDAyIH0sIC8qIEdMX0xJTkVfTE9PUCAqLworICAgeyAxMzA4OCwgMHgwMDAwMDcwNyB9LCAvKiBHTF9MSU5FX1JFU0VUX1RPS0VOICovCisgICB7IDEzMTA4LCAweDAwMDAwQjIwIH0sIC8qIEdMX0xJTkVfU01PT1RIICovCisgICB7IDEzMTIzLCAweDAwMDAwQzUyIH0sIC8qIEdMX0xJTkVfU01PT1RIX0hJTlQgKi8KKyAgIHsgMTMxNDMsIDB4MDAwMDBCMjQgfSwgLyogR0xfTElORV9TVElQUExFICovCisgICB7IDEzMTU5LCAweDAwMDAwQjI1IH0sIC8qIEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOICovCisgICB7IDEzMTgzLCAweDAwMDAwQjI2IH0sIC8qIEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgKi8KKyAgIHsgMTMyMDYsIDB4MDAwMDAwMDMgfSwgLyogR0xfTElORV9TVFJJUCAqLworICAgeyAxMzIyMCwgMHgwMDAwMDcwMiB9LCAvKiBHTF9MSU5FX1RPS0VOICovCisgICB7IDEzMjM0LCAweDAwMDAwQjIxIH0sIC8qIEdMX0xJTkVfV0lEVEggKi8KKyAgIHsgMTMyNDgsIDB4MDAwMDBCMjMgfSwgLyogR0xfTElORV9XSURUSF9HUkFOVUxBUklUWSAqLworICAgeyAxMzI3NCwgMHgwMDAwMEIyMiB9LCAvKiBHTF9MSU5FX1dJRFRIX1JBTkdFICovCisgICB7IDEzMjk0LCAweDAwMDA4QjgyIH0sIC8qIEdMX0xJTktfU1RBVFVTICovCisgICB7IDEzMzA5LCAweDAwMDAwQjMyIH0sIC8qIEdMX0xJU1RfQkFTRSAqLworICAgeyAxMzMyMiwgMHgwMDAyMDAwMCB9LCAvKiBHTF9MSVNUX0JJVCAqLworICAgeyAxMzMzNCwgMHgwMDAwMEIzMyB9LCAvKiBHTF9MSVNUX0lOREVYICovCisgICB7IDEzMzQ4LCAweDAwMDAwQjMwIH0sIC8qIEdMX0xJU1RfTU9ERSAqLworICAgeyAxMzM2MSwgMHgwMDAwMDEwMSB9LCAvKiBHTF9MT0FEICovCisgICB7IDEzMzY5LCAweDAwMDAwQkYxIH0sIC8qIEdMX0xPR0lDX09QICovCisgICB7IDEzMzgxLCAweDAwMDAwQkYwIH0sIC8qIEdMX0xPR0lDX09QX01PREUgKi8KKyAgIHsgMTMzOTgsIDB4MDAwMDhDQTEgfSwgLyogR0xfTE9XRVJfTEVGVCAqLworICAgeyAxMzQxMiwgMHgwMDAwMTkwOSB9LCAvKiBHTF9MVU1JTkFOQ0UgKi8KKyAgIHsgMTM0MjUsIDB4MDAwMDgwNDEgfSwgLyogR0xfTFVNSU5BTkNFMTIgKi8KKyAgIHsgMTM0NDAsIDB4MDAwMDgwNDcgfSwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEExMiAqLworICAgeyAxMzQ2MywgMHgwMDAwODA0NyB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyX0VYVCAqLworICAgeyAxMzQ5MCwgMHgwMDAwODA0NiB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTQgKi8KKyAgIHsgMTM1MTIsIDB4MDAwMDgwNDYgfSwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEE0X0VYVCAqLworICAgeyAxMzUzOCwgMHgwMDAwODA0MSB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9FWFQgKi8KKyAgIHsgMTM1NTcsIDB4MDAwMDgwNDIgfSwgLyogR0xfTFVNSU5BTkNFMTYgKi8KKyAgIHsgMTM1NzIsIDB4MDAwMDgwNDggfSwgLyogR0xfTFVNSU5BTkNFMTZfQUxQSEExNiAqLworICAgeyAxMzU5NSwgMHgwMDAwODA0OCB9LCAvKiBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2X0VYVCAqLworICAgeyAxMzYyMiwgMHgwMDAwODA0MiB9LCAvKiBHTF9MVU1JTkFOQ0UxNl9FWFQgKi8KKyAgIHsgMTM2NDEsIDB4MDAwMDgwM0YgfSwgLyogR0xfTFVNSU5BTkNFNCAqLworICAgeyAxMzY1NSwgMHgwMDAwODA0MyB9LCAvKiBHTF9MVU1JTkFOQ0U0X0FMUEhBNCAqLworICAgeyAxMzY3NiwgMHgwMDAwODA0MyB9LCAvKiBHTF9MVU1JTkFOQ0U0X0FMUEhBNF9FWFQgKi8KKyAgIHsgMTM3MDEsIDB4MDAwMDgwM0YgfSwgLyogR0xfTFVNSU5BTkNFNF9FWFQgKi8KKyAgIHsgMTM3MTksIDB4MDAwMDgwNDQgfSwgLyogR0xfTFVNSU5BTkNFNl9BTFBIQTIgKi8KKyAgIHsgMTM3NDAsIDB4MDAwMDgwNDQgfSwgLyogR0xfTFVNSU5BTkNFNl9BTFBIQTJfRVhUICovCisgICB7IDEzNzY1LCAweDAwMDA4MDQwIH0sIC8qIEdMX0xVTUlOQU5DRTggKi8KKyAgIHsgMTM3NzksIDB4MDAwMDgwNDUgfSwgLyogR0xfTFVNSU5BTkNFOF9BTFBIQTggKi8KKyAgIHsgMTM4MDAsIDB4MDAwMDgwNDUgfSwgLyogR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICovCisgICB7IDEzODI1LCAweDAwMDA4MDQwIH0sIC8qIEdMX0xVTUlOQU5DRThfRVhUICovCisgICB7IDEzODQzLCAweDAwMDAxOTBBIH0sIC8qIEdMX0xVTUlOQU5DRV9BTFBIQSAqLworICAgeyAxMzg2MiwgMHgwMDAwMEQ5MCB9LCAvKiBHTF9NQVAxX0NPTE9SXzQgKi8KKyAgIHsgMTM4NzgsIDB4MDAwMDBERDAgfSwgLyogR0xfTUFQMV9HUklEX0RPTUFJTiAqLworICAgeyAxMzg5OCwgMHgwMDAwMEREMSB9LCAvKiBHTF9NQVAxX0dSSURfU0VHTUVOVFMgKi8KKyAgIHsgMTM5MjAsIDB4MDAwMDBEOTEgfSwgLyogR0xfTUFQMV9JTkRFWCAqLworICAgeyAxMzkzNCwgMHgwMDAwMEQ5MiB9LCAvKiBHTF9NQVAxX05PUk1BTCAqLworICAgeyAxMzk0OSwgMHgwMDAwMEQ5MyB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLworICAgeyAxMzk3MywgMHgwMDAwMEQ5NCB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLworICAgeyAxMzk5NywgMHgwMDAwMEQ5NSB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMyAqLworICAgeyAxNDAyMSwgMHgwMDAwMEQ5NiB9LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLworICAgeyAxNDA0NSwgMHgwMDAwMEQ5NyB9LCAvKiBHTF9NQVAxX1ZFUlRFWF8zICovCisgICB7IDE0MDYyLCAweDAwMDAwRDk4IH0sIC8qIEdMX01BUDFfVkVSVEVYXzQgKi8KKyAgIHsgMTQwNzksIDB4MDAwMDg2NjAgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMF80X05WICovCisgICB7IDE0MTA3LCAweDAwMDA4NjZBIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEwXzRfTlYgKi8KKyAgIHsgMTQxMzYsIDB4MDAwMDg2NkIgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAqLworICAgeyAxNDE2NSwgMHgwMDAwODY2QyB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICovCisgICB7IDE0MTk0LCAweDAwMDA4NjZEIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEzXzRfTlYgKi8KKyAgIHsgMTQyMjMsIDB4MDAwMDg2NkUgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAqLworICAgeyAxNDI1MiwgMHgwMDAwODY2RiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICovCisgICB7IDE0MjgxLCAweDAwMDA4NjYxIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjFfNF9OViAqLworICAgeyAxNDMwOSwgMHgwMDAwODY2MiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIyXzRfTlYgKi8KKyAgIHsgMTQzMzcsIDB4MDAwMDg2NjMgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCM180X05WICovCisgICB7IDE0MzY1LCAweDAwMDA4NjY0IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjRfNF9OViAqLworICAgeyAxNDM5MywgMHgwMDAwODY2NSB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI1XzRfTlYgKi8KKyAgIHsgMTQ0MjEsIDB4MDAwMDg2NjYgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCNl80X05WICovCisgICB7IDE0NDQ5LCAweDAwMDA4NjY3IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjdfNF9OViAqLworICAgeyAxNDQ3NywgMHgwMDAwODY2OCB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI4XzRfTlYgKi8KKyAgIHsgMTQ1MDUsIDB4MDAwMDg2NjkgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCOV80X05WICovCisgICB7IDE0NTMzLCAweDAwMDAwREIwIH0sIC8qIEdMX01BUDJfQ09MT1JfNCAqLworICAgeyAxNDU0OSwgMHgwMDAwMEREMiB9LCAvKiBHTF9NQVAyX0dSSURfRE9NQUlOICovCisgICB7IDE0NTY5LCAweDAwMDAwREQzIH0sIC8qIEdMX01BUDJfR1JJRF9TRUdNRU5UUyAqLworICAgeyAxNDU5MSwgMHgwMDAwMERCMSB9LCAvKiBHTF9NQVAyX0lOREVYICovCisgICB7IDE0NjA1LCAweDAwMDAwREIyIH0sIC8qIEdMX01BUDJfTk9STUFMICovCisgICB7IDE0NjIwLCAweDAwMDAwREIzIH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xICovCisgICB7IDE0NjQ0LCAweDAwMDAwREI0IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCisgICB7IDE0NjY4LCAweDAwMDAwREI1IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCisgICB7IDE0NjkyLCAweDAwMDAwREI2IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF80ICovCisgICB7IDE0NzE2LCAweDAwMDAwREI3IH0sIC8qIEdMX01BUDJfVkVSVEVYXzMgKi8KKyAgIHsgMTQ3MzMsIDB4MDAwMDBEQjggfSwgLyogR0xfTUFQMl9WRVJURVhfNCAqLworICAgeyAxNDc1MCwgMHgwMDAwODY3MCB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlYgKi8KKyAgIHsgMTQ3NzgsIDB4MDAwMDg2N0EgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAqLworICAgeyAxNDgwNywgMHgwMDAwODY3QiB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICovCisgICB7IDE0ODM2LCAweDAwMDA4NjdDIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEyXzRfTlYgKi8KKyAgIHsgMTQ4NjUsIDB4MDAwMDg2N0QgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAqLworICAgeyAxNDg5NCwgMHgwMDAwODY3RSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICovCisgICB7IDE0OTIzLCAweDAwMDA4NjdGIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE1XzRfTlYgKi8KKyAgIHsgMTQ5NTIsIDB4MDAwMDg2NzEgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMV80X05WICovCisgICB7IDE0OTgwLCAweDAwMDA4NjcyIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjJfNF9OViAqLworICAgeyAxNTAwOCwgMHgwMDAwODY3MyB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlYgKi8KKyAgIHsgMTUwMzYsIDB4MDAwMDg2NzQgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCNF80X05WICovCisgICB7IDE1MDY0LCAweDAwMDA4Njc1IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjVfNF9OViAqLworICAgeyAxNTA5MiwgMHgwMDAwODY3NiB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlYgKi8KKyAgIHsgMTUxMjAsIDB4MDAwMDg2NzcgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCN180X05WICovCisgICB7IDE1MTQ4LCAweDAwMDA4Njc4IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjhfNF9OViAqLworICAgeyAxNTE3NiwgMHgwMDAwODY3OSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI5XzRfTlYgKi8KKyAgIHsgMTUyMDQsIDB4MDAwMDBEMTAgfSwgLyogR0xfTUFQX0NPTE9SICovCisgICB7IDE1MjE3LCAweDAwMDAwRDExIH0sIC8qIEdMX01BUF9TVEVOQ0lMICovCisgICB7IDE1MjMyLCAweDAwMDA4OEMwIH0sIC8qIEdMX01BVFJJWDBfQVJCICovCisgICB7IDE1MjQ3LCAweDAwMDA4NjMwIH0sIC8qIEdMX01BVFJJWDBfTlYgKi8KKyAgIHsgMTUyNjEsIDB4MDAwMDg4Q0EgfSwgLyogR0xfTUFUUklYMTBfQVJCICovCisgICB7IDE1Mjc3LCAweDAwMDA4OENCIH0sIC8qIEdMX01BVFJJWDExX0FSQiAqLworICAgeyAxNTI5MywgMHgwMDAwODhDQyB9LCAvKiBHTF9NQVRSSVgxMl9BUkIgKi8KKyAgIHsgMTUzMDksIDB4MDAwMDg4Q0QgfSwgLyogR0xfTUFUUklYMTNfQVJCICovCisgICB7IDE1MzI1LCAweDAwMDA4OENFIH0sIC8qIEdMX01BVFJJWDE0X0FSQiAqLworICAgeyAxNTM0MSwgMHgwMDAwODhDRiB9LCAvKiBHTF9NQVRSSVgxNV9BUkIgKi8KKyAgIHsgMTUzNTcsIDB4MDAwMDg4RDAgfSwgLyogR0xfTUFUUklYMTZfQVJCICovCisgICB7IDE1MzczLCAweDAwMDA4OEQxIH0sIC8qIEdMX01BVFJJWDE3X0FSQiAqLworICAgeyAxNTM4OSwgMHgwMDAwODhEMiB9LCAvKiBHTF9NQVRSSVgxOF9BUkIgKi8KKyAgIHsgMTU0MDUsIDB4MDAwMDg4RDMgfSwgLyogR0xfTUFUUklYMTlfQVJCICovCisgICB7IDE1NDIxLCAweDAwMDA4OEMxIH0sIC8qIEdMX01BVFJJWDFfQVJCICovCisgICB7IDE1NDM2LCAweDAwMDA4NjMxIH0sIC8qIEdMX01BVFJJWDFfTlYgKi8KKyAgIHsgMTU0NTAsIDB4MDAwMDg4RDQgfSwgLyogR0xfTUFUUklYMjBfQVJCICovCisgICB7IDE1NDY2LCAweDAwMDA4OEQ1IH0sIC8qIEdMX01BVFJJWDIxX0FSQiAqLworICAgeyAxNTQ4MiwgMHgwMDAwODhENiB9LCAvKiBHTF9NQVRSSVgyMl9BUkIgKi8KKyAgIHsgMTU0OTgsIDB4MDAwMDg4RDcgfSwgLyogR0xfTUFUUklYMjNfQVJCICovCisgICB7IDE1NTE0LCAweDAwMDA4OEQ4IH0sIC8qIEdMX01BVFJJWDI0X0FSQiAqLworICAgeyAxNTUzMCwgMHgwMDAwODhEOSB9LCAvKiBHTF9NQVRSSVgyNV9BUkIgKi8KKyAgIHsgMTU1NDYsIDB4MDAwMDg4REEgfSwgLyogR0xfTUFUUklYMjZfQVJCICovCisgICB7IDE1NTYyLCAweDAwMDA4OERCIH0sIC8qIEdMX01BVFJJWDI3X0FSQiAqLworICAgeyAxNTU3OCwgMHgwMDAwODhEQyB9LCAvKiBHTF9NQVRSSVgyOF9BUkIgKi8KKyAgIHsgMTU1OTQsIDB4MDAwMDg4REQgfSwgLyogR0xfTUFUUklYMjlfQVJCICovCisgICB7IDE1NjEwLCAweDAwMDA4OEMyIH0sIC8qIEdMX01BVFJJWDJfQVJCICovCisgICB7IDE1NjI1LCAweDAwMDA4NjMyIH0sIC8qIEdMX01BVFJJWDJfTlYgKi8KKyAgIHsgMTU2MzksIDB4MDAwMDg4REUgfSwgLyogR0xfTUFUUklYMzBfQVJCICovCisgICB7IDE1NjU1LCAweDAwMDA4OERGIH0sIC8qIEdMX01BVFJJWDMxX0FSQiAqLworICAgeyAxNTY3MSwgMHgwMDAwODhDMyB9LCAvKiBHTF9NQVRSSVgzX0FSQiAqLworICAgeyAxNTY4NiwgMHgwMDAwODYzMyB9LCAvKiBHTF9NQVRSSVgzX05WICovCisgICB7IDE1NzAwLCAweDAwMDA4OEM0IH0sIC8qIEdMX01BVFJJWDRfQVJCICovCisgICB7IDE1NzE1LCAweDAwMDA4NjM0IH0sIC8qIEdMX01BVFJJWDRfTlYgKi8KKyAgIHsgMTU3MjksIDB4MDAwMDg4QzUgfSwgLyogR0xfTUFUUklYNV9BUkIgKi8KKyAgIHsgMTU3NDQsIDB4MDAwMDg2MzUgfSwgLyogR0xfTUFUUklYNV9OViAqLworICAgeyAxNTc1OCwgMHgwMDAwODhDNiB9LCAvKiBHTF9NQVRSSVg2X0FSQiAqLworICAgeyAxNTc3MywgMHgwMDAwODYzNiB9LCAvKiBHTF9NQVRSSVg2X05WICovCisgICB7IDE1Nzg3LCAweDAwMDA4OEM3IH0sIC8qIEdMX01BVFJJWDdfQVJCICovCisgICB7IDE1ODAyLCAweDAwMDA4NjM3IH0sIC8qIEdMX01BVFJJWDdfTlYgKi8KKyAgIHsgMTU4MTYsIDB4MDAwMDg4QzggfSwgLyogR0xfTUFUUklYOF9BUkIgKi8KKyAgIHsgMTU4MzEsIDB4MDAwMDg4QzkgfSwgLyogR0xfTUFUUklYOV9BUkIgKi8KKyAgIHsgMTU4NDYsIDB4MDAwMDg4NDQgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX0FSQiAqLworICAgeyAxNTg3MiwgMHgwMDAwODg0OSB9LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgKi8KKyAgIHsgMTU5MDYsIDB4MDAwMDg4NDYgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfQVJCICovCisgICB7IDE1OTM3LCAweDAwMDA4ODQ4IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfQVJCICovCisgICB7IDE1OTcwLCAweDAwMDA4ODQ3IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX0FSQiAqLworICAgeyAxNjAwMSwgMHgwMDAwMEJBMCB9LCAvKiBHTF9NQVRSSVhfTU9ERSAqLworICAgeyAxNjAxNiwgMHgwMDAwODg0MCB9LCAvKiBHTF9NQVRSSVhfUEFMRVRURV9BUkIgKi8KKyAgIHsgMTYwMzgsIDB4MDAwMDgwMDggfSwgLyogR0xfTUFYICovCisgICB7IDE2MDQ1LCAweDAwMDA4MDczIH0sIC8qIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgKi8KKyAgIHsgMTYwNjgsIDB4MDAwMDg4RkYgfSwgLyogR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCAqLworICAgeyAxNjEwMCwgMHgwMDAwMEQzNSB9LCAvKiBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIICovCisgICB7IDE2MTI2LCAweDAwMDAwRDNCIH0sIC8qIEdMX01BWF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIICovCisgICB7IDE2MTU5LCAweDAwMDA4MTc3IH0sIC8qIEdMX01BWF9DTElQTUFQX0RFUFRIX1NHSVggKi8KKyAgIHsgMTYxODUsIDB4MDAwMDgxNzggfSwgLyogR0xfTUFYX0NMSVBNQVBfVklSVFVBTF9ERVBUSF9TR0lYICovCisgICB7IDE2MjE5LCAweDAwMDAwRDMyIH0sIC8qIEdMX01BWF9DTElQX1BMQU5FUyAqLworICAgeyAxNjIzOCwgMHgwMDAwOENERiB9LCAvKiBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUICovCisgICB7IDE2MjY3LCAweDAwMDA4MEIzIH0sIC8qIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KKyAgIHsgMTYyOTksIDB4MDAwMDgwQjMgfSwgLyogR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgKi8KKyAgIHsgMTYzMzUsIDB4MDAwMDhCNEQgfSwgLyogR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKyAgIHsgMTYzNzEsIDB4MDAwMDhCNEQgfSwgLyogR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCisgICB7IDE2NDExLCAweDAwMDA4MDFCIH0sIC8qIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQgKi8KKyAgIHsgMTY0MzcsIDB4MDAwMDgwMUIgfSwgLyogR0xfTUFYX0NPTlZPTFVUSU9OX0hFSUdIVF9FWFQgKi8KKyAgIHsgMTY0NjcsIDB4MDAwMDgwMUEgfSwgLyogR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIICovCisgICB7IDE2NDkyLCAweDAwMDA4MDFBIH0sIC8qIEdMX01BWF9DT05WT0xVVElPTl9XSURUSF9FWFQgKi8KKyAgIHsgMTY1MjEsIDB4MDAwMDg1MUMgfSwgLyogR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAqLworICAgeyAxNjU1MCwgMHgwMDAwODUxQyB9LCAvKiBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX0FSQiAqLworICAgeyAxNjU4MywgMHgwMDAwODgyNCB9LCAvKiBHTF9NQVhfRFJBV19CVUZGRVJTICovCisgICB7IDE2NjAzLCAweDAwMDA4ODI0IH0sIC8qIEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCICovCisgICB7IDE2NjI3LCAweDAwMDA4ODI0IH0sIC8qIEdMX01BWF9EUkFXX0JVRkZFUlNfQVRJICovCisgICB7IDE2NjUxLCAweDAwMDA4MEU5IH0sIC8qIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICovCisgICB7IDE2Njc1LCAweDAwMDA4MEU4IH0sIC8qIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAqLworICAgeyAxNjcwMCwgMHgwMDAwMEQzMCB9LCAvKiBHTF9NQVhfRVZBTF9PUkRFUiAqLworICAgeyAxNjcxOCwgMHgwMDAwODAwOCB9LCAvKiBHTF9NQVhfRVhUICovCisgICB7IDE2NzI5LCAweDAwMDA4QjQ5IH0sIC8qIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKyAgIHsgMTY3NjQsIDB4MDAwMDhCNDkgfSwgLyogR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgKi8KKyAgIHsgMTY4MDMsIDB4MDAwMDBEMzEgfSwgLyogR0xfTUFYX0xJR0hUUyAqLworICAgeyAxNjgxNywgMHgwMDAwMEIzMSB9LCAvKiBHTF9NQVhfTElTVF9ORVNUSU5HICovCisgICB7IDE2ODM3LCAweDAwMDA4ODQxIH0sIC8qIEdMX01BWF9NQVRSSVhfUEFMRVRURV9TVEFDS19ERVBUSF9BUkIgKi8KKyAgIHsgMTY4NzUsIDB4MDAwMDBEMzYgfSwgLyogR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAqLworICAgeyAxNjkwNCwgMHgwMDAwMEQzNyB9LCAvKiBHTF9NQVhfTkFNRV9TVEFDS19ERVBUSCAqLworICAgeyAxNjkyOCwgMHgwMDAwODg0MiB9LCAvKiBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19BUkIgKi8KKyAgIHsgMTY5NTYsIDB4MDAwMDBEMzQgfSwgLyogR0xfTUFYX1BJWEVMX01BUF9UQUJMRSAqLworICAgeyAxNjk3OSwgMHgwMDAwODhCMSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KKyAgIHsgMTcwMTYsIDB4MDAwMDg4MEIgfSwgLyogR0xfTUFYX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMTcwNTIsIDB4MDAwMDg4QUQgfSwgLyogR0xfTUFYX1BST0dSQU1fQVRUUklCU19BUkIgKi8KKyAgIHsgMTcwNzksIDB4MDAwMDg4RjUgfSwgLyogR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLworICAgeyAxNzEwOCwgMHgwMDAwODhCNSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMTcxNDIsIDB4MDAwMDg4RjQgfSwgLyogR0xfTUFYX1BST0dSQU1fRVhFQ19JTlNUUlVDVElPTlNfTlYgKi8KKyAgIHsgMTcxNzgsIDB4MDAwMDg4RjYgfSwgLyogR0xfTUFYX1BST0dSQU1fSUZfREVQVEhfTlYgKi8KKyAgIHsgMTcyMDUsIDB4MDAwMDg4QTEgfSwgLyogR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAxNzIzNywgMHgwMDAwODhCNCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQiAqLworICAgeyAxNzI3MywgMHgwMDAwODhGOCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICovCisgICB7IDE3MzAyLCAweDAwMDA4OEY3IH0sIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgKi8KKyAgIHsgMTczMzEsIDB4MDAwMDg2MkYgfSwgLyogR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICovCisgICB7IDE3MzU5LCAweDAwMDA4NjJFIH0sIC8qIEdMX01BWF9QUk9HUkFNX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgKi8KKyAgIHsgMTczOTcsIDB4MDAwMDg4QjMgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLworICAgeyAxNzQ0MSwgMHgwMDAwODgwRSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMTc0ODQsIDB4MDAwMDg4QUYgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCisgICB7IDE3NTE4LCAweDAwMDA4OEEzIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDE3NTU3LCAweDAwMDA4OEFCIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAqLworICAgeyAxNzU5NCwgMHgwMDAwODhBNyB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDE3NjMyLCAweDAwMDA4ODEwIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5ESVJFQ1RJT05TX0FSQiAqLworICAgeyAxNzY3NSwgMHgwMDAwODgwRiB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMTc3MTgsIDB4MDAwMDg4QTkgfSwgLyogR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMTc3NDgsIDB4MDAwMDg4QTUgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDE3Nzc5LCAweDAwMDA4ODBEIH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICB7IDE3ODE1LCAweDAwMDA4ODBDIH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDE3ODUxLCAweDAwMDAwRDM4IH0sIC8qIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICovCisgICB7IDE3ODgxLCAweDAwMDA4NEY4IH0sIC8qIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAqLworICAgeyAxNzkxNSwgMHgwMDAwODRGOCB9LCAvKiBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9OViAqLworICAgeyAxNzk0OCwgMHgwMDAwODRFOCB9LCAvKiBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfRVhUICovCisgICB7IDE3OTc3LCAweDAwMDA4NTA0IH0sIC8qIEdMX01BWF9TSElOSU5FU1NfTlYgKi8KKyAgIHsgMTc5OTcsIDB4MDAwMDg1MDUgfSwgLyogR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgKi8KKyAgIHsgMTgwMjEsIDB4MDAwMDg4NzEgfSwgLyogR0xfTUFYX1RFWFRVUkVfQ09PUkRTICovCisgICB7IDE4MDQzLCAweDAwMDA4ODcxIH0sIC8qIEdMX01BWF9URVhUVVJFX0NPT1JEU19BUkIgKi8KKyAgIHsgMTgwNjksIDB4MDAwMDg4NzIgfSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKyAgIHsgMTgwOTYsIDB4MDAwMDg4NzIgfSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCisgICB7IDE4MTI3LCAweDAwMDA4NEZEIH0sIC8qIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICovCisgICB7IDE4MTUxLCAweDAwMDA4NEZGIH0sIC8qIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAqLworICAgeyAxODE4NSwgMHgwMDAwMEQzMyB9LCAvKiBHTF9NQVhfVEVYVFVSRV9TSVpFICovCisgICB7IDE4MjA1LCAweDAwMDAwRDM5IH0sIC8qIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICovCisgICB7IDE4MjMyLCAweDAwMDA4NEUyIH0sIC8qIEdMX01BWF9URVhUVVJFX1VOSVRTICovCisgICB7IDE4MjUzLCAweDAwMDA4NEUyIH0sIC8qIEdMX01BWF9URVhUVVJFX1VOSVRTX0FSQiAqLworICAgeyAxODI3OCwgMHgwMDAwODYyRiB9LCAvKiBHTF9NQVhfVFJBQ0tfTUFUUklDRVNfTlYgKi8KKyAgIHsgMTgzMDMsIDB4MDAwMDg2MkUgfSwgLyogR0xfTUFYX1RSQUNLX01BVFJJWF9TVEFDS19ERVBUSF9OViAqLworICAgeyAxODMzOCwgMHgwMDAwOEI0QiB9LCAvKiBHTF9NQVhfVkFSWUlOR19GTE9BVFMgKi8KKyAgIHsgMTgzNjAsIDB4MDAwMDhCNEIgfSwgLyogR0xfTUFYX1ZBUllJTkdfRkxPQVRTX0FSQiAqLworICAgeyAxODM4NiwgMHgwMDAwODg2OSB9LCAvKiBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgKi8KKyAgIHsgMTg0MDgsIDB4MDAwMDg4NjkgfSwgLyogR0xfTUFYX1ZFUlRFWF9BVFRSSUJTX0FSQiAqLworICAgeyAxODQzNCwgMHgwMDAwOEI0QyB9LCAvKiBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKyAgIHsgMTg0NjgsIDB4MDAwMDhCNEMgfSwgLyogR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAqLworICAgeyAxODUwNiwgMHgwMDAwOEI0QSB9LCAvKiBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworICAgeyAxODUzOSwgMHgwMDAwOEI0QSB9LCAvKiBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgKi8KKyAgIHsgMTg1NzYsIDB4MDAwMDg2QTQgfSwgLyogR0xfTUFYX1ZFUlRFWF9VTklUU19BUkIgKi8KKyAgIHsgMTg2MDAsIDB4MDAwMDBEM0EgfSwgLyogR0xfTUFYX1ZJRVdQT1JUX0RJTVMgKi8KKyAgIHsgMTg2MjEsIDB4MDAwMDgwMDcgfSwgLyogR0xfTUlOICovCisgICB7IDE4NjI4LCAweDAwMDA4MDJFIH0sIC8qIEdMX01JTk1BWCAqLworICAgeyAxODYzOCwgMHgwMDAwODAyRSB9LCAvKiBHTF9NSU5NQVhfRVhUICovCisgICB7IDE4NjUyLCAweDAwMDA4MDJGIH0sIC8qIEdMX01JTk1BWF9GT1JNQVQgKi8KKyAgIHsgMTg2NjksIDB4MDAwMDgwMkYgfSwgLyogR0xfTUlOTUFYX0ZPUk1BVF9FWFQgKi8KKyAgIHsgMTg2OTAsIDB4MDAwMDgwMzAgfSwgLyogR0xfTUlOTUFYX1NJTksgKi8KKyAgIHsgMTg3MDUsIDB4MDAwMDgwMzAgfSwgLyogR0xfTUlOTUFYX1NJTktfRVhUICovCisgICB7IDE4NzI0LCAweDAwMDA4MDA3IH0sIC8qIEdMX01JTl9FWFQgKi8KKyAgIHsgMTg3MzUsIDB4MDAwMDgzNzAgfSwgLyogR0xfTUlSUk9SRURfUkVQRUFUICovCisgICB7IDE4NzU0LCAweDAwMDA4MzcwIH0sIC8qIEdMX01JUlJPUkVEX1JFUEVBVF9BUkIgKi8KKyAgIHsgMTg3NzcsIDB4MDAwMDgzNzAgfSwgLyogR0xfTUlSUk9SRURfUkVQRUFUX0lCTSAqLworICAgeyAxODgwMCwgMHgwMDAwODc0MiB9LCAvKiBHTF9NSVJST1JfQ0xBTVBfQVRJICovCisgICB7IDE4ODIwLCAweDAwMDA4NzQyIH0sIC8qIEdMX01JUlJPUl9DTEFNUF9FWFQgKi8KKyAgIHsgMTg4NDAsIDB4MDAwMDg5MTIgfSwgLyogR0xfTUlSUk9SX0NMQU1QX1RPX0JPUkRFUl9FWFQgKi8KKyAgIHsgMTg4NzAsIDB4MDAwMDg3NDMgfSwgLyogR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfQVRJICovCisgICB7IDE4ODk4LCAweDAwMDA4NzQzIH0sIC8qIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVCAqLworICAgeyAxODkyNiwgMHgwMDAwMTcwMCB9LCAvKiBHTF9NT0RFTFZJRVcgKi8KKyAgIHsgMTg5MzksIDB4MDAwMDE3MDAgfSwgLyogR0xfTU9ERUxWSUVXMF9BUkIgKi8KKyAgIHsgMTg5NTcsIDB4MDAwMDg3MkEgfSwgLyogR0xfTU9ERUxWSUVXMTBfQVJCICovCisgICB7IDE4OTc2LCAweDAwMDA4NzJCIH0sIC8qIEdMX01PREVMVklFVzExX0FSQiAqLworICAgeyAxODk5NSwgMHgwMDAwODcyQyB9LCAvKiBHTF9NT0RFTFZJRVcxMl9BUkIgKi8KKyAgIHsgMTkwMTQsIDB4MDAwMDg3MkQgfSwgLyogR0xfTU9ERUxWSUVXMTNfQVJCICovCisgICB7IDE5MDMzLCAweDAwMDA4NzJFIH0sIC8qIEdMX01PREVMVklFVzE0X0FSQiAqLworICAgeyAxOTA1MiwgMHgwMDAwODcyRiB9LCAvKiBHTF9NT0RFTFZJRVcxNV9BUkIgKi8KKyAgIHsgMTkwNzEsIDB4MDAwMDg3MzAgfSwgLyogR0xfTU9ERUxWSUVXMTZfQVJCICovCisgICB7IDE5MDkwLCAweDAwMDA4NzMxIH0sIC8qIEdMX01PREVMVklFVzE3X0FSQiAqLworICAgeyAxOTEwOSwgMHgwMDAwODczMiB9LCAvKiBHTF9NT0RFTFZJRVcxOF9BUkIgKi8KKyAgIHsgMTkxMjgsIDB4MDAwMDg3MzMgfSwgLyogR0xfTU9ERUxWSUVXMTlfQVJCICovCisgICB7IDE5MTQ3LCAweDAwMDA4NTBBIH0sIC8qIEdMX01PREVMVklFVzFfQVJCICovCisgICB7IDE5MTY1LCAweDAwMDA4NzM0IH0sIC8qIEdMX01PREVMVklFVzIwX0FSQiAqLworICAgeyAxOTE4NCwgMHgwMDAwODczNSB9LCAvKiBHTF9NT0RFTFZJRVcyMV9BUkIgKi8KKyAgIHsgMTkyMDMsIDB4MDAwMDg3MzYgfSwgLyogR0xfTU9ERUxWSUVXMjJfQVJCICovCisgICB7IDE5MjIyLCAweDAwMDA4NzM3IH0sIC8qIEdMX01PREVMVklFVzIzX0FSQiAqLworICAgeyAxOTI0MSwgMHgwMDAwODczOCB9LCAvKiBHTF9NT0RFTFZJRVcyNF9BUkIgKi8KKyAgIHsgMTkyNjAsIDB4MDAwMDg3MzkgfSwgLyogR0xfTU9ERUxWSUVXMjVfQVJCICovCisgICB7IDE5Mjc5LCAweDAwMDA4NzNBIH0sIC8qIEdMX01PREVMVklFVzI2X0FSQiAqLworICAgeyAxOTI5OCwgMHgwMDAwODczQiB9LCAvKiBHTF9NT0RFTFZJRVcyN19BUkIgKi8KKyAgIHsgMTkzMTcsIDB4MDAwMDg3M0MgfSwgLyogR0xfTU9ERUxWSUVXMjhfQVJCICovCisgICB7IDE5MzM2LCAweDAwMDA4NzNEIH0sIC8qIEdMX01PREVMVklFVzI5X0FSQiAqLworICAgeyAxOTM1NSwgMHgwMDAwODcyMiB9LCAvKiBHTF9NT0RFTFZJRVcyX0FSQiAqLworICAgeyAxOTM3MywgMHgwMDAwODczRSB9LCAvKiBHTF9NT0RFTFZJRVczMF9BUkIgKi8KKyAgIHsgMTkzOTIsIDB4MDAwMDg3M0YgfSwgLyogR0xfTU9ERUxWSUVXMzFfQVJCICovCisgICB7IDE5NDExLCAweDAwMDA4NzIzIH0sIC8qIEdMX01PREVMVklFVzNfQVJCICovCisgICB7IDE5NDI5LCAweDAwMDA4NzI0IH0sIC8qIEdMX01PREVMVklFVzRfQVJCICovCisgICB7IDE5NDQ3LCAweDAwMDA4NzI1IH0sIC8qIEdMX01PREVMVklFVzVfQVJCICovCisgICB7IDE5NDY1LCAweDAwMDA4NzI2IH0sIC8qIEdMX01PREVMVklFVzZfQVJCICovCisgICB7IDE5NDgzLCAweDAwMDA4NzI3IH0sIC8qIEdMX01PREVMVklFVzdfQVJCICovCisgICB7IDE5NTAxLCAweDAwMDA4NzI4IH0sIC8qIEdMX01PREVMVklFVzhfQVJCICovCisgICB7IDE5NTE5LCAweDAwMDA4NzI5IH0sIC8qIEdMX01PREVMVklFVzlfQVJCICovCisgICB7IDE5NTM3LCAweDAwMDAwQkE2IH0sIC8qIEdMX01PREVMVklFV19NQVRSSVggKi8KKyAgIHsgMTk1NTcsIDB4MDAwMDg2MjkgfSwgLyogR0xfTU9ERUxWSUVXX1BST0pFQ1RJT05fTlYgKi8KKyAgIHsgMTk1ODQsIDB4MDAwMDBCQTMgfSwgLyogR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICovCisgICB7IDE5NjA5LCAweDAwMDAyMTAwIH0sIC8qIEdMX01PRFVMQVRFICovCisgICB7IDE5NjIxLCAweDAwMDA4NzQ0IH0sIC8qIEdMX01PRFVMQVRFX0FERF9BVEkgKi8KKyAgIHsgMTk2NDEsIDB4MDAwMDg3NDUgfSwgLyogR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgKi8KKyAgIHsgMTk2NjgsIDB4MDAwMDg3NDYgfSwgLyogR0xfTU9EVUxBVEVfU1VCVFJBQ1RfQVRJICovCisgICB7IDE5NjkzLCAweDAwMDAwMTAzIH0sIC8qIEdMX01VTFQgKi8KKyAgIHsgMTk3MDEsIDB4MDAwMDgwOUQgfSwgLyogR0xfTVVMVElTQU1QTEUgKi8KKyAgIHsgMTk3MTYsIDB4MDAwMDg2QjIgfSwgLyogR0xfTVVMVElTQU1QTEVfM0RGWCAqLworICAgeyAxOTczNiwgMHgwMDAwODA5RCB9LCAvKiBHTF9NVUxUSVNBTVBMRV9BUkIgKi8KKyAgIHsgMTk3NTUsIDB4MjAwMDAwMDAgfSwgLyogR0xfTVVMVElTQU1QTEVfQklUICovCisgICB7IDE5Nzc0LCAweDIwMDAwMDAwIH0sIC8qIEdMX01VTFRJU0FNUExFX0JJVF8zREZYICovCisgICB7IDE5Nzk4LCAweDIwMDAwMDAwIH0sIC8qIEdMX01VTFRJU0FNUExFX0JJVF9BUkIgKi8KKyAgIHsgMTk4MjEsIDB4MDAwMDg1MzQgfSwgLyogR0xfTVVMVElTQU1QTEVfRklMVEVSX0hJTlRfTlYgKi8KKyAgIHsgMTk4NTEsIDB4MDAwMDJBMjUgfSwgLyogR0xfTjNGX1YzRiAqLworICAgeyAxOTg2MiwgMHgwMDAwMEQ3MCB9LCAvKiBHTF9OQU1FX1NUQUNLX0RFUFRIICovCisgICB7IDE5ODgyLCAweDAwMDAxNTBFIH0sIC8qIEdMX05BTkQgKi8KKyAgIHsgMTk4OTAsIDB4MDAwMDI2MDAgfSwgLyogR0xfTkVBUkVTVCAqLworICAgeyAxOTkwMSwgMHgwMDAwODQ0RSB9LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggKi8KKyAgIHsgMTk5MzIsIDB4MDAwMDg0NEQgfSwgLyogR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWCAqLworICAgeyAxOTk2NCwgMHgwMDAwMjcwMiB9LCAvKiBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgKi8KKyAgIHsgMTk5ODksIDB4MDAwMDI3MDAgfSwgLyogR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAqLworICAgeyAyMDAxNSwgMHgwMDAwMDIwMCB9LCAvKiBHTF9ORVZFUiAqLworICAgeyAyMDAyNCwgMHgwMDAwMTEwMiB9LCAvKiBHTF9OSUNFU1QgKi8KKyAgIHsgMjAwMzQsIDB4MDAwMDAwMDAgfSwgLyogR0xfTk9ORSAqLworICAgeyAyMDA0MiwgMHgwMDAwMTUwNSB9LCAvKiBHTF9OT09QICovCisgICB7IDIwMDUwLCAweDAwMDAxNTA4IH0sIC8qIEdMX05PUiAqLworICAgeyAyMDA1NywgMHgwMDAwMEJBMSB9LCAvKiBHTF9OT1JNQUxJWkUgKi8KKyAgIHsgMjAwNzAsIDB4MDAwMDgwNzUgfSwgLyogR0xfTk9STUFMX0FSUkFZICovCisgICB7IDIwMDg2LCAweDAwMDA4ODk3IH0sIC8qIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAyMDExNywgMHgwMDAwODg5NyB9LCAvKiBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCisgICB7IDIwMTUyLCAweDAwMDA4MDhGIH0sIC8qIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCisgICB7IDIwMTc2LCAweDAwMDA4MDdGIH0sIC8qIEdMX05PUk1BTF9BUlJBWV9TVFJJREUgKi8KKyAgIHsgMjAxOTksIDB4MDAwMDgwN0UgfSwgLyogR0xfTk9STUFMX0FSUkFZX1RZUEUgKi8KKyAgIHsgMjAyMjAsIDB4MDAwMDg1MTEgfSwgLyogR0xfTk9STUFMX01BUCAqLworICAgeyAyMDIzNCwgMHgwMDAwODUxMSB9LCAvKiBHTF9OT1JNQUxfTUFQX0FSQiAqLworICAgeyAyMDI1MiwgMHgwMDAwODUxMSB9LCAvKiBHTF9OT1JNQUxfTUFQX05WICovCisgICB7IDIwMjY5LCAweDAwMDAwMjA1IH0sIC8qIEdMX05PVEVRVUFMICovCisgICB7IDIwMjgxLCAweDAwMDAwMDAwIH0sIC8qIEdMX05PX0VSUk9SICovCisgICB7IDIwMjkzLCAweDAwMDA4NkEyIH0sIC8qIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAqLworICAgeyAyMDMyNywgMHgwMDAwODZBMiB9LCAvKiBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfQVJCICovCisgICB7IDIwMzY1LCAweDAwMDA4Qjg5IH0sIC8qIEdMX09CSkVDVF9BQ1RJVkVfQVRUUklCVVRFU19BUkIgKi8KKyAgIHsgMjAzOTcsIDB4MDAwMDhCOEEgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSF9BUkIgKi8KKyAgIHsgMjA0MzksIDB4MDAwMDhCODYgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNU19BUkIgKi8KKyAgIHsgMjA0NjksIDB4MDAwMDhCODcgfSwgLyogR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhfQVJCICovCisgICB7IDIwNTA5LCAweDAwMDA4Qjg1IH0sIC8qIEdMX09CSkVDVF9BVFRBQ0hFRF9PQkpFQ1RTX0FSQiAqLworICAgeyAyMDU0MCwgMHgwMDAwOEI4MSB9LCAvKiBHTF9PQkpFQ1RfQ09NUElMRV9TVEFUVVNfQVJCICovCisgICB7IDIwNTY5LCAweDAwMDA4QjgwIH0sIC8qIEdMX09CSkVDVF9ERUxFVEVfU1RBVFVTX0FSQiAqLworICAgeyAyMDU5NywgMHgwMDAwOEI4NCB9LCAvKiBHTF9PQkpFQ1RfSU5GT19MT0dfTEVOR1RIX0FSQiAqLworICAgeyAyMDYyNywgMHgwMDAwMjQwMSB9LCAvKiBHTF9PQkpFQ1RfTElORUFSICovCisgICB7IDIwNjQ0LCAweDAwMDA4QjgyIH0sIC8qIEdMX09CSkVDVF9MSU5LX1NUQVRVU19BUkIgKi8KKyAgIHsgMjA2NzAsIDB4MDAwMDI1MDEgfSwgLyogR0xfT0JKRUNUX1BMQU5FICovCisgICB7IDIwNjg2LCAweDAwMDA4Qjg4IH0sIC8qIEdMX09CSkVDVF9TSEFERVJfU09VUkNFX0xFTkdUSF9BUkIgKi8KKyAgIHsgMjA3MjEsIDB4MDAwMDhCNEYgfSwgLyogR0xfT0JKRUNUX1NVQlRZUEVfQVJCICovCisgICB7IDIwNzQzLCAweDAwMDA4QjRFIH0sIC8qIEdMX09CSkVDVF9UWVBFX0FSQiAqLworICAgeyAyMDc2MiwgMHgwMDAwOEI4MyB9LCAvKiBHTF9PQkpFQ1RfVkFMSURBVEVfU1RBVFVTX0FSQiAqLworICAgeyAyMDc5MiwgMHgwMDAwODE2NSB9LCAvKiBHTF9PQ0NMVVNJT05fVEVTVF9IUCAqLworICAgeyAyMDgxMywgMHgwMDAwODE2NiB9LCAvKiBHTF9PQ0NMVVNJT05fVEVTVF9SRVNVTFRfSFAgKi8KKyAgIHsgMjA4NDEsIDB4MDAwMDAwMDEgfSwgLyogR0xfT05FICovCisgICB7IDIwODQ4LCAweDAwMDA4MDA0IH0sIC8qIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAqLworICAgeyAyMDg3NiwgMHgwMDAwODAwNCB9LCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFfRVhUICovCisgICB7IDIwOTA4LCAweDAwMDA4MDAyIH0sIC8qIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAqLworICAgeyAyMDkzNiwgMHgwMDAwODAwMiB9LCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfRVhUICovCisgICB7IDIwOTY4LCAweDAwMDAwMzA1IH0sIC8qIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKyAgIHsgMjA5OTEsIDB4MDAwMDAzMDcgfSwgLyogR0xfT05FX01JTlVTX0RTVF9DT0xPUiAqLworICAgeyAyMTAxNCwgMHgwMDAwMDMwMyB9LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisgICB7IDIxMDM3LCAweDAwMDAwMzAxIH0sIC8qIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgKi8KKyAgIHsgMjEwNjAsIDB4MDAwMDg1OTggfSwgLyogR0xfT1BFUkFORDBfQUxQSEEgKi8KKyAgIHsgMjEwNzgsIDB4MDAwMDg1OTggfSwgLyogR0xfT1BFUkFORDBfQUxQSEFfQVJCICovCisgICB7IDIxMTAwLCAweDAwMDA4NTk4IH0sIC8qIEdMX09QRVJBTkQwX0FMUEhBX0VYVCAqLworICAgeyAyMTEyMiwgMHgwMDAwODU5MCB9LCAvKiBHTF9PUEVSQU5EMF9SR0IgKi8KKyAgIHsgMjExMzgsIDB4MDAwMDg1OTAgfSwgLyogR0xfT1BFUkFORDBfUkdCX0FSQiAqLworICAgeyAyMTE1OCwgMHgwMDAwODU5MCB9LCAvKiBHTF9PUEVSQU5EMF9SR0JfRVhUICovCisgICB7IDIxMTc4LCAweDAwMDA4NTk5IH0sIC8qIEdMX09QRVJBTkQxX0FMUEhBICovCisgICB7IDIxMTk2LCAweDAwMDA4NTk5IH0sIC8qIEdMX09QRVJBTkQxX0FMUEhBX0FSQiAqLworICAgeyAyMTIxOCwgMHgwMDAwODU5OSB9LCAvKiBHTF9PUEVSQU5EMV9BTFBIQV9FWFQgKi8KKyAgIHsgMjEyNDAsIDB4MDAwMDg1OTEgfSwgLyogR0xfT1BFUkFORDFfUkdCICovCisgICB7IDIxMjU2LCAweDAwMDA4NTkxIH0sIC8qIEdMX09QRVJBTkQxX1JHQl9BUkIgKi8KKyAgIHsgMjEyNzYsIDB4MDAwMDg1OTEgfSwgLyogR0xfT1BFUkFORDFfUkdCX0VYVCAqLworICAgeyAyMTI5NiwgMHgwMDAwODU5QSB9LCAvKiBHTF9PUEVSQU5EMl9BTFBIQSAqLworICAgeyAyMTMxNCwgMHgwMDAwODU5QSB9LCAvKiBHTF9PUEVSQU5EMl9BTFBIQV9BUkIgKi8KKyAgIHsgMjEzMzYsIDB4MDAwMDg1OUEgfSwgLyogR0xfT1BFUkFORDJfQUxQSEFfRVhUICovCisgICB7IDIxMzU4LCAweDAwMDA4NTkyIH0sIC8qIEdMX09QRVJBTkQyX1JHQiAqLworICAgeyAyMTM3NCwgMHgwMDAwODU5MiB9LCAvKiBHTF9PUEVSQU5EMl9SR0JfQVJCICovCisgICB7IDIxMzk0LCAweDAwMDA4NTkyIH0sIC8qIEdMX09QRVJBTkQyX1JHQl9FWFQgKi8KKyAgIHsgMjE0MTQsIDB4MDAwMDg1OUIgfSwgLyogR0xfT1BFUkFORDNfQUxQSEFfTlYgKi8KKyAgIHsgMjE0MzUsIDB4MDAwMDg1OTMgfSwgLyogR0xfT1BFUkFORDNfUkdCX05WICovCisgICB7IDIxNDU0LCAweDAwMDAxNTA3IH0sIC8qIEdMX09SICovCisgICB7IDIxNDYwLCAweDAwMDAwQTAxIH0sIC8qIEdMX09SREVSICovCisgICB7IDIxNDY5LCAweDAwMDAxNTBEIH0sIC8qIEdMX09SX0lOVkVSVEVEICovCisgICB7IDIxNDg0LCAweDAwMDAxNTBCIH0sIC8qIEdMX09SX1JFVkVSU0UgKi8KKyAgIHsgMjE0OTgsIDB4MDAwMDA1MDUgfSwgLyogR0xfT1VUX09GX01FTU9SWSAqLworICAgeyAyMTUxNSwgMHgwMDAwMEQwNSB9LCAvKiBHTF9QQUNLX0FMSUdOTUVOVCAqLworICAgeyAyMTUzMywgMHgwMDAwODA2QyB9LCAvKiBHTF9QQUNLX0lNQUdFX0hFSUdIVCAqLworICAgeyAyMTU1NCwgMHgwMDAwODc1OCB9LCAvKiBHTF9QQUNLX0lOVkVSVF9NRVNBICovCisgICB7IDIxNTc0LCAweDAwMDAwRDAxIH0sIC8qIEdMX1BBQ0tfTFNCX0ZJUlNUICovCisgICB7IDIxNTkyLCAweDAwMDAwRDAyIH0sIC8qIEdMX1BBQ0tfUk9XX0xFTkdUSCAqLworICAgeyAyMTYxMSwgMHgwMDAwODA2QiB9LCAvKiBHTF9QQUNLX1NLSVBfSU1BR0VTICovCisgICB7IDIxNjMxLCAweDAwMDAwRDA0IH0sIC8qIEdMX1BBQ0tfU0tJUF9QSVhFTFMgKi8KKyAgIHsgMjE2NTEsIDB4MDAwMDBEMDMgfSwgLyogR0xfUEFDS19TS0lQX1JPV1MgKi8KKyAgIHsgMjE2NjksIDB4MDAwMDBEMDAgfSwgLyogR0xfUEFDS19TV0FQX0JZVEVTICovCisgICB7IDIxNjg4LCAweDAwMDA4QjkyIH0sIC8qIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAqLworICAgeyAyMTcxMywgMHgwMDAwOEI5NCB9LCAvKiBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAqLworICAgeyAyMTczNywgMHgwMDAwOEI5MCB9LCAvKiBHTF9QQUxFVFRFNF9SR0I4X09FUyAqLworICAgeyAyMTc1OCwgMHgwMDAwOEI5MyB9LCAvKiBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgKi8KKyAgIHsgMjE3ODAsIDB4MDAwMDhCOTEgfSwgLyogR0xfUEFMRVRURTRfUkdCQThfT0VTICovCisgICB7IDIxODAyLCAweDAwMDA4Qjk3IH0sIC8qIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAqLworICAgeyAyMTgyNywgMHgwMDAwOEI5OSB9LCAvKiBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAqLworICAgeyAyMTg1MSwgMHgwMDAwOEI5NSB9LCAvKiBHTF9QQUxFVFRFOF9SR0I4X09FUyAqLworICAgeyAyMTg3MiwgMHgwMDAwOEI5OCB9LCAvKiBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgKi8KKyAgIHsgMjE4OTQsIDB4MDAwMDhCOTYgfSwgLyogR0xfUEFMRVRURThfUkdCQThfT0VTICovCisgICB7IDIxOTE2LCAweDAwMDAwNzAwIH0sIC8qIEdMX1BBU1NfVEhST1VHSF9UT0tFTiAqLworICAgeyAyMTkzOCwgMHgwMDAwMEM1MCB9LCAvKiBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KKyAgIHsgMjE5NjksIDB4MDAwMDBDNzkgfSwgLyogR0xfUElYRUxfTUFQX0FfVE9fQSAqLworICAgeyAyMTk4OSwgMHgwMDAwMENCOSB9LCAvKiBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgKi8KKyAgIHsgMjIwMTQsIDB4MDAwMDBDNzggfSwgLyogR0xfUElYRUxfTUFQX0JfVE9fQiAqLworICAgeyAyMjAzNCwgMHgwMDAwMENCOCB9LCAvKiBHTF9QSVhFTF9NQVBfQl9UT19CX1NJWkUgKi8KKyAgIHsgMjIwNTksIDB4MDAwMDBDNzcgfSwgLyogR0xfUElYRUxfTUFQX0dfVE9fRyAqLworICAgeyAyMjA3OSwgMHgwMDAwMENCNyB9LCAvKiBHTF9QSVhFTF9NQVBfR19UT19HX1NJWkUgKi8KKyAgIHsgMjIxMDQsIDB4MDAwMDBDNzUgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQSAqLworICAgeyAyMjEyNCwgMHgwMDAwMENCNSB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19BX1NJWkUgKi8KKyAgIHsgMjIxNDksIDB4MDAwMDBDNzQgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQiAqLworICAgeyAyMjE2OSwgMHgwMDAwMENCNCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkUgKi8KKyAgIHsgMjIxOTQsIDB4MDAwMDBDNzMgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fRyAqLworICAgeyAyMjIxNCwgMHgwMDAwMENCMyB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgKi8KKyAgIHsgMjIyMzksIDB4MDAwMDBDNzAgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fSSAqLworICAgeyAyMjI1OSwgMHgwMDAwMENCMCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgKi8KKyAgIHsgMjIyODQsIDB4MDAwMDBDNzIgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fUiAqLworICAgeyAyMjMwNCwgMHgwMDAwMENCMiB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19SX1NJWkUgKi8KKyAgIHsgMjIzMjksIDB4MDAwMDBDNzYgfSwgLyogR0xfUElYRUxfTUFQX1JfVE9fUiAqLworICAgeyAyMjM0OSwgMHgwMDAwMENCNiB9LCAvKiBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgKi8KKyAgIHsgMjIzNzQsIDB4MDAwMDBDNzEgfSwgLyogR0xfUElYRUxfTUFQX1NfVE9fUyAqLworICAgeyAyMjM5NCwgMHgwMDAwMENCMSB9LCAvKiBHTF9QSVhFTF9NQVBfU19UT19TX1NJWkUgKi8KKyAgIHsgMjI0MTksIDB4MDAwMDAwMjAgfSwgLyogR0xfUElYRUxfTU9ERV9CSVQgKi8KKyAgIHsgMjI0MzcsIDB4MDAwMDg4RUQgfSwgLyogR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19FWFQgKi8KKyAgIHsgMjI0NzAsIDB4MDAwMDg4RUIgfSwgLyogR0xfUElYRUxfUEFDS19CVUZGRVJfRVhUICovCisgICB7IDIyNDk1LCAweDAwMDA4OEVGIH0sIC8qIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElOR19FWFQgKi8KKyAgIHsgMjI1MzAsIDB4MDAwMDg4RUMgfSwgLyogR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9FWFQgKi8KKyAgIHsgMjI1NTcsIDB4MDAwMDFCMDAgfSwgLyogR0xfUE9JTlQgKi8KKyAgIHsgMjI1NjYsIDB4MDAwMDAwMDAgfSwgLyogR0xfUE9JTlRTICovCisgICB7IDIyNTc2LCAweDAwMDAwMDAyIH0sIC8qIEdMX1BPSU5UX0JJVCAqLworICAgeyAyMjU4OSwgMHgwMDAwODEyOSB9LCAvKiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAqLworICAgeyAyMjYxOSwgMHgwMDAwODEyOSB9LCAvKiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIgKi8KKyAgIHsgMjI2NTMsIDB4MDAwMDgxMjkgfSwgLyogR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fRVhUICovCisgICB7IDIyNjg3LCAweDAwMDA4MTI5IH0sIC8qIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX1NHSVMgKi8KKyAgIHsgMjI3MjIsIDB4MDAwMDgxMjggfSwgLyogR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAqLworICAgeyAyMjc1MSwgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0FSQiAqLworICAgeyAyMjc4NCwgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0VYVCAqLworICAgeyAyMjgxNywgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX1NHSVMgKi8KKyAgIHsgMjI4NTEsIDB4MDAwMDBCMTEgfSwgLyogR0xfUE9JTlRfU0laRSAqLworICAgeyAyMjg2NSwgMHgwMDAwMEIxMyB9LCAvKiBHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCisgICB7IDIyODkxLCAweDAwMDA4MTI3IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUFYICovCisgICB7IDIyOTA5LCAweDAwMDA4MTI3IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUFYX0FSQiAqLworICAgeyAyMjkzMSwgMHgwMDAwODEyNyB9LCAvKiBHTF9QT0lOVF9TSVpFX01BWF9FWFQgKi8KKyAgIHsgMjI5NTMsIDB4MDAwMDgxMjcgfSwgLyogR0xfUE9JTlRfU0laRV9NQVhfU0dJUyAqLworICAgeyAyMjk3NiwgMHgwMDAwODEyNiB9LCAvKiBHTF9QT0lOVF9TSVpFX01JTiAqLworICAgeyAyMjk5NCwgMHgwMDAwODEyNiB9LCAvKiBHTF9QT0lOVF9TSVpFX01JTl9BUkIgKi8KKyAgIHsgMjMwMTYsIDB4MDAwMDgxMjYgfSwgLyogR0xfUE9JTlRfU0laRV9NSU5fRVhUICovCisgICB7IDIzMDM4LCAweDAwMDA4MTI2IH0sIC8qIEdMX1BPSU5UX1NJWkVfTUlOX1NHSVMgKi8KKyAgIHsgMjMwNjEsIDB4MDAwMDBCMTIgfSwgLyogR0xfUE9JTlRfU0laRV9SQU5HRSAqLworICAgeyAyMzA4MSwgMHgwMDAwMEIxMCB9LCAvKiBHTF9QT0lOVF9TTU9PVEggKi8KKyAgIHsgMjMwOTcsIDB4MDAwMDBDNTEgfSwgLyogR0xfUE9JTlRfU01PT1RIX0hJTlQgKi8KKyAgIHsgMjMxMTgsIDB4MDAwMDg4NjEgfSwgLyogR0xfUE9JTlRfU1BSSVRFICovCisgICB7IDIzMTM0LCAweDAwMDA4ODYxIH0sIC8qIEdMX1BPSU5UX1NQUklURV9BUkIgKi8KKyAgIHsgMjMxNTQsIDB4MDAwMDhDQTAgfSwgLyogR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAqLworICAgeyAyMzE4MywgMHgwMDAwODg2MSB9LCAvKiBHTF9QT0lOVF9TUFJJVEVfTlYgKi8KKyAgIHsgMjMyMDIsIDB4MDAwMDg4NjMgfSwgLyogR0xfUE9JTlRfU1BSSVRFX1JfTU9ERV9OViAqLworICAgeyAyMzIyOCwgMHgwMDAwMDcwMSB9LCAvKiBHTF9QT0lOVF9UT0tFTiAqLworICAgeyAyMzI0MywgMHgwMDAwMDAwOSB9LCAvKiBHTF9QT0xZR09OICovCisgICB7IDIzMjU0LCAweDAwMDAwMDA4IH0sIC8qIEdMX1BPTFlHT05fQklUICovCisgICB7IDIzMjY5LCAweDAwMDAwQjQwIH0sIC8qIEdMX1BPTFlHT05fTU9ERSAqLworICAgeyAyMzI4NSwgMHgwMDAwODAzOSB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9CSUFTICovCisgICB7IDIzMzA4LCAweDAwMDA4MDM4IH0sIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAqLworICAgeyAyMzMzMywgMHgwMDAwODAzNyB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCisgICB7IDIzMzU2LCAweDAwMDAyQTAyIH0sIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgKi8KKyAgIHsgMjMzNzksIDB4MDAwMDJBMDEgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQgKi8KKyAgIHsgMjM0MDMsIDB4MDAwMDJBMDAgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgKi8KKyAgIHsgMjM0MjcsIDB4MDAwMDBCNDEgfSwgLyogR0xfUE9MWUdPTl9TTU9PVEggKi8KKyAgIHsgMjM0NDUsIDB4MDAwMDBDNTMgfSwgLyogR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAqLworICAgeyAyMzQ2OCwgMHgwMDAwMEI0MiB9LCAvKiBHTF9QT0xZR09OX1NUSVBQTEUgKi8KKyAgIHsgMjM0ODcsIDB4MDAwMDAwMTAgfSwgLyogR0xfUE9MWUdPTl9TVElQUExFX0JJVCAqLworICAgeyAyMzUxMCwgMHgwMDAwMDcwMyB9LCAvKiBHTF9QT0xZR09OX1RPS0VOICovCisgICB7IDIzNTI3LCAweDAwMDAxMjAzIH0sIC8qIEdMX1BPU0lUSU9OICovCisgICB7IDIzNTM5LCAweDAwMDA4MEJCIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVMgKi8KKyAgIHsgMjM1NzEsIDB4MDAwMDgwQkIgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBU19TR0kgKi8KKyAgIHsgMjM2MDcsIDB4MDAwMDgwQjcgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUgKi8KKyAgIHsgMjM2NDAsIDB4MDAwMDgwQjcgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEVfU0dJICovCisgICB7IDIzNjc3LCAweDAwMDA4MEJBIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBUyAqLworICAgeyAyMzcwOCwgMHgwMDAwODBCQSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVNfU0dJICovCisgICB7IDIzNzQzLCAweDAwMDA4MEI2IH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgKi8KKyAgIHsgMjM3NzUsIDB4MDAwMDgwQjYgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRV9TR0kgKi8KKyAgIHsgMjM4MTEsIDB4MDAwMDgwRDIgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgKi8KKyAgIHsgMjM4NDQsIDB4MDAwMDgwQjkgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAqLworICAgeyAyMzg3NiwgMHgwMDAwODBCOSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTX1NHSSAqLworICAgeyAyMzkxMiwgMHgwMDAwODBCNSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRSAqLworICAgeyAyMzk0NSwgMHgwMDAwODBCNSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRV9TR0kgKi8KKyAgIHsgMjM5ODIsIDB4MDAwMDgwQjggfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVMgKi8KKyAgIHsgMjQwMTIsIDB4MDAwMDgwQjggfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVNfU0dJICovCisgICB7IDI0MDQ2LCAweDAwMDA4MEI0IH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRSAqLworICAgeyAyNDA3NywgMHgwMDAwODBCNCB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEVfU0dJICovCisgICB7IDI0MTEyLCAweDAwMDA4MDIzIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfQklBUyAqLworICAgeyAyNDE0MywgMHgwMDAwODAyMyB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNfRVhUICovCisgICB7IDI0MTc4LCAweDAwMDA4MDFGIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgKi8KKyAgIHsgMjQyMTAsIDB4MDAwMDgwMUYgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRV9FWFQgKi8KKyAgIHsgMjQyNDYsIDB4MDAwMDgwMjIgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgKi8KKyAgIHsgMjQyNzYsIDB4MDAwMDgwMjIgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNfRVhUICovCisgICB7IDI0MzEwLCAweDAwMDA4MDFFIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRSAqLworICAgeyAyNDM0MSwgMHgwMDAwODAxRSB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEVfRVhUICovCisgICB7IDI0Mzc2LCAweDAwMDA4MEQxIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUgKi8KKyAgIHsgMjQ0MDgsIDB4MDAwMDgwMjEgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTICovCisgICB7IDI0NDM5LCAweDAwMDA4MDIxIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBU19FWFQgKi8KKyAgIHsgMjQ0NzQsIDB4MDAwMDgwMUQgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRSAqLworICAgeyAyNDUwNiwgMHgwMDAwODAxRCB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFX0VYVCAqLworICAgeyAyNDU0MiwgMHgwMDAwODAyMCB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTICovCisgICB7IDI0NTcxLCAweDAwMDA4MDIwIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVNfRVhUICovCisgICB7IDI0NjA0LCAweDAwMDA4MDFDIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICovCisgICB7IDI0NjM0LCAweDAwMDA4MDFDIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFX0VYVCAqLworICAgeyAyNDY2OCwgMHgwMDAwODE3QiB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfUkFOR0VfU0dJWCAqLworICAgeyAyNDcwNywgMHgwMDAwODE3OSB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfU0dJWCAqLworICAgeyAyNDc0MCwgMHgwMDAwODE3QyB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVggKi8KKyAgIHsgMjQ3ODAsIDB4MDAwMDgxN0EgfSwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9TR0lYICovCisgICB7IDI0ODE0LCAweDAwMDA4NTc4IH0sIC8qIEdMX1BSRVZJT1VTICovCisgICB7IDI0ODI2LCAweDAwMDA4NTc4IH0sIC8qIEdMX1BSRVZJT1VTX0FSQiAqLworICAgeyAyNDg0MiwgMHgwMDAwODU3OCB9LCAvKiBHTF9QUkVWSU9VU19FWFQgKi8KKyAgIHsgMjQ4NTgsIDB4MDAwMDg1NzcgfSwgLyogR0xfUFJJTUFSWV9DT0xPUiAqLworICAgeyAyNDg3NSwgMHgwMDAwODU3NyB9LCAvKiBHTF9QUklNQVJZX0NPTE9SX0FSQiAqLworICAgeyAyNDg5NiwgMHgwMDAwODU3NyB9LCAvKiBHTF9QUklNQVJZX0NPTE9SX0VYVCAqLworICAgeyAyNDkxNywgMHgwMDAwODhCMCB9LCAvKiBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLworICAgeyAyNDk1MCwgMHgwMDAwODgwNSB9LCAvKiBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDI0OTgyLCAweDAwMDA4OEFDIH0sIC8qIEdMX1BST0dSQU1fQVRUUklCU19BUkIgKi8KKyAgIHsgMjUwMDUsIDB4MDAwMDg2NzcgfSwgLyogR0xfUFJPR1JBTV9CSU5ESU5HX0FSQiAqLworICAgeyAyNTAyOCwgMHgwMDAwODY0QiB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQiAqLworICAgeyAyNTA1OCwgMHgwMDAwODY0QiB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX05WICovCisgICB7IDI1MDg3LCAweDAwMDA4ODc0IH0sIC8qIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAqLworICAgeyAyNTExNSwgMHgwMDAwODg3NiB9LCAvKiBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgKi8KKyAgIHsgMjUxMzcsIDB4MDAwMDg4NzUgfSwgLyogR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICovCisgICB7IDI1MTY1LCAweDAwMDA4OEEwIH0sIC8qIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAyNTE5MywgMHgwMDAwODYyNyB9LCAvKiBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgKi8KKyAgIHsgMjUyMTUsIDB4MDAwMDg2MjcgfSwgLyogR0xfUFJPR1JBTV9MRU5HVEhfTlYgKi8KKyAgIHsgMjUyMzYsIDB4MDAwMDg4QjIgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCICovCisgICB7IDI1Mjc2LCAweDAwMDA4ODA4IH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDI1MzE1LCAweDAwMDA4OEFFIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCisgICB7IDI1MzQ1LCAweDAwMDA4OEEyIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjUzODAsIDB4MDAwMDg4QUEgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMjU0MTMsIDB4MDAwMDg4QTYgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDI1NDQ3LCAweDAwMDA4ODBBIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICB7IDI1NDg2LCAweDAwMDA4ODA5IH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDI1NTI1LCAweDAwMDA4QjQwIH0sIC8qIEdMX1BST0dSQU1fT0JKRUNUX0FSQiAqLworICAgeyAyNTU0NywgMHgwMDAwODhBOCB9LCAvKiBHTF9QUk9HUkFNX1BBUkFNRVRFUlNfQVJCICovCisgICB7IDI1NTczLCAweDAwMDA4NjQ0IH0sIC8qIEdMX1BST0dSQU1fUEFSQU1FVEVSX05WICovCisgICB7IDI1NTk3LCAweDAwMDA4NjQ3IH0sIC8qIEdMX1BST0dSQU1fUkVTSURFTlRfTlYgKi8KKyAgIHsgMjU2MjAsIDB4MDAwMDg2MjggfSwgLyogR0xfUFJPR1JBTV9TVFJJTkdfQVJCICovCisgICB7IDI1NjQyLCAweDAwMDA4NjI4IH0sIC8qIEdMX1BST0dSQU1fU1RSSU5HX05WICovCisgICB7IDI1NjYzLCAweDAwMDA4NjQ2IH0sIC8qIEdMX1BST0dSQU1fVEFSR0VUX05WICovCisgICB7IDI1Njg0LCAweDAwMDA4OEE0IH0sIC8qIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDI1NzExLCAweDAwMDA4ODA3IH0sIC8qIEdMX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgKi8KKyAgIHsgMjU3NDMsIDB4MDAwMDg4MDYgfSwgLyogR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAyNTc3NSwgMHgwMDAwODhCNiB9LCAvKiBHTF9QUk9HUkFNX1VOREVSX05BVElWRV9MSU1JVFNfQVJCICovCisgICB7IDI1ODEwLCAweDAwMDAxNzAxIH0sIC8qIEdMX1BST0pFQ1RJT04gKi8KKyAgIHsgMjU4MjQsIDB4MDAwMDBCQTcgfSwgLyogR0xfUFJPSkVDVElPTl9NQVRSSVggKi8KKyAgIHsgMjU4NDUsIDB4MDAwMDBCQTQgfSwgLyogR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLworICAgeyAyNTg3MSwgMHgwMDAwODBEMyB9LCAvKiBHTF9QUk9YWV9DT0xPUl9UQUJMRSAqLworICAgeyAyNTg5MiwgMHgwMDAwODAyNSB9LCAvKiBHTF9QUk9YWV9ISVNUT0dSQU0gKi8KKyAgIHsgMjU5MTEsIDB4MDAwMDgwMjUgfSwgLyogR0xfUFJPWFlfSElTVE9HUkFNX0VYVCAqLworICAgeyAyNTkzNCwgMHgwMDAwODBENSB9LCAvKiBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAqLworICAgeyAyNTk3MywgMHgwMDAwODBENCB9LCAvKiBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICovCisgICB7IDI2MDExLCAweDAwMDA4MDYzIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfMUQgKi8KKyAgIHsgMjYwMzEsIDB4MDAwMDhDMTkgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQgKi8KKyAgIHsgMjYwNjEsIDB4MDAwMDgwNjMgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRF9FWFQgKi8KKyAgIHsgMjYwODUsIDB4MDAwMDgwNjQgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRCAqLworICAgeyAyNjEwNSwgMHgwMDAwOEMxQiB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX0FSUkFZX0VYVCAqLworICAgeyAyNjEzNSwgMHgwMDAwODA2NCB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX0VYVCAqLworICAgeyAyNjE1OSwgMHgwMDAwODA3MCB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzNEICovCisgICB7IDI2MTc5LCAweDAwMDA4MEJEIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICovCisgICB7IDI2MjEyLCAweDAwMDA4NTFCIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgKi8KKyAgIHsgMjYyMzgsIDB4MDAwMDg1MUIgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUF9BUkIgKi8KKyAgIHsgMjYyNjgsIDB4MDAwMDg0RjcgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCisgICB7IDI2Mjk5LCAweDAwMDA4NEY3IH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfUkVDVEFOR0xFX05WICovCisgICB7IDI2MzI5LCAweDAwMDAyMDAzIH0sIC8qIEdMX1EgKi8KKyAgIHsgMjYzMzQsIDB4MDAwMDEyMDkgfSwgLyogR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICovCisgICB7IDI2MzU5LCAweDAwMDAwMDA3IH0sIC8qIEdMX1FVQURTICovCisgICB7IDI2MzY4LCAweDAwMDA4NjE0IH0sIC8qIEdMX1FVQURfTUVTSF9TVU4gKi8KKyAgIHsgMjYzODUsIDB4MDAwMDAwMDggfSwgLyogR0xfUVVBRF9TVFJJUCAqLworICAgeyAyNjM5OSwgMHgwMDAwODg2NCB9LCAvKiBHTF9RVUVSWV9DT1VOVEVSX0JJVFMgKi8KKyAgIHsgMjY0MjEsIDB4MDAwMDg4NjQgfSwgLyogR0xfUVVFUllfQ09VTlRFUl9CSVRTX0FSQiAqLworICAgeyAyNjQ0NywgMHgwMDAwODg2NiB9LCAvKiBHTF9RVUVSWV9SRVNVTFQgKi8KKyAgIHsgMjY0NjMsIDB4MDAwMDg4NjYgfSwgLyogR0xfUVVFUllfUkVTVUxUX0FSQiAqLworICAgeyAyNjQ4MywgMHgwMDAwODg2NyB9LCAvKiBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICovCisgICB7IDI2NTA5LCAweDAwMDA4ODY3IH0sIC8qIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEVfQVJCICovCisgICB7IDI2NTM5LCAweDAwMDAyMDAyIH0sIC8qIEdMX1IgKi8KKyAgIHsgMjY1NDQsIDB4MDAwMDJBMTAgfSwgLyogR0xfUjNfRzNfQjIgKi8KKyAgIHsgMjY1NTYsIDB4MDAwMTkyNjIgfSwgLyogR0xfUkFTVEVSX1BPU0lUSU9OX1VOQ0xJUFBFRF9JQk0gKi8KKyAgIHsgMjY1ODksIDB4MDAwMDBDMDIgfSwgLyogR0xfUkVBRF9CVUZGRVIgKi8KKyAgIHsgMjY2MDQsIDB4MDAwMDhDQUEgfSwgLyogR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAqLworICAgeyAyNjYzNiwgMHgwMDAwOENBOCB9LCAvKiBHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCAqLworICAgeyAyNjY2MCwgMHgwMDAwODhCOCB9LCAvKiBHTF9SRUFEX09OTFkgKi8KKyAgIHsgMjY2NzMsIDB4MDAwMDg4QjggfSwgLyogR0xfUkVBRF9PTkxZX0FSQiAqLworICAgeyAyNjY5MCwgMHgwMDAwODhCQSB9LCAvKiBHTF9SRUFEX1dSSVRFICovCisgICB7IDI2NzA0LCAweDAwMDA4OEJBIH0sIC8qIEdMX1JFQURfV1JJVEVfQVJCICovCisgICB7IDI2NzIyLCAweDAwMDAxOTAzIH0sIC8qIEdMX1JFRCAqLworICAgeyAyNjcyOSwgMHgwMDAwODAxNiB9LCAvKiBHTF9SRURVQ0UgKi8KKyAgIHsgMjY3MzksIDB4MDAwMDgwMTYgfSwgLyogR0xfUkVEVUNFX0VYVCAqLworICAgeyAyNjc1MywgMHgwMDAwMEQxNSB9LCAvKiBHTF9SRURfQklBUyAqLworICAgeyAyNjc2NSwgMHgwMDAwMEQ1MiB9LCAvKiBHTF9SRURfQklUUyAqLworICAgeyAyNjc3NywgMHgwMDAwMEQxNCB9LCAvKiBHTF9SRURfU0NBTEUgKi8KKyAgIHsgMjY3OTAsIDB4MDAwMDg1MTIgfSwgLyogR0xfUkVGTEVDVElPTl9NQVAgKi8KKyAgIHsgMjY4MDgsIDB4MDAwMDg1MTIgfSwgLyogR0xfUkVGTEVDVElPTl9NQVBfQVJCICovCisgICB7IDI2ODMwLCAweDAwMDA4NTEyIH0sIC8qIEdMX1JFRkxFQ1RJT05fTUFQX05WICovCisgICB7IDI2ODUxLCAweDAwMDAxQzAwIH0sIC8qIEdMX1JFTkRFUiAqLworICAgeyAyNjg2MSwgMHgwMDAwOENBNyB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfQklORElOR19FWFQgKi8KKyAgIHsgMjY4ODksIDB4MDAwMDhENDEgfSwgLyogR0xfUkVOREVSQlVGRkVSX0VYVCAqLworICAgeyAyNjkwOSwgMHgwMDAwOEQ0MyB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX0VYVCAqLworICAgeyAyNjkzNiwgMHgwMDAwOEQ0NCB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX0VYVCAqLworICAgeyAyNjk3MiwgMHgwMDAwOEQ0MiB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfRVhUICovCisgICB7IDI2OTk4LCAweDAwMDAxRjAxIH0sIC8qIEdMX1JFTkRFUkVSICovCisgICB7IDI3MDEwLCAweDAwMDAwQzQwIH0sIC8qIEdMX1JFTkRFUl9NT0RFICovCisgICB7IDI3MDI1LCAweDAwMDAyOTAxIH0sIC8qIEdMX1JFUEVBVCAqLworICAgeyAyNzAzNSwgMHgwMDAwMUUwMSB9LCAvKiBHTF9SRVBMQUNFICovCisgICB7IDI3MDQ2LCAweDAwMDA4MDYyIH0sIC8qIEdMX1JFUExBQ0VfRVhUICovCisgICB7IDI3MDYxLCAweDAwMDA4MTUzIH0sIC8qIEdMX1JFUExJQ0FURV9CT1JERVJfSFAgKi8KKyAgIHsgMjcwODQsIDB4MDAwMDgwM0EgfSwgLyogR0xfUkVTQ0FMRV9OT1JNQUwgKi8KKyAgIHsgMjcxMDIsIDB4MDAwMDgwM0EgfSwgLyogR0xfUkVTQ0FMRV9OT1JNQUxfRVhUICovCisgICB7IDI3MTI0LCAweDAwMDAwMTAyIH0sIC8qIEdMX1JFVFVSTiAqLworICAgeyAyNzEzNCwgMHgwMDAwMTkwNyB9LCAvKiBHTF9SR0IgKi8KKyAgIHsgMjcxNDEsIDB4MDAwMDgwNTIgfSwgLyogR0xfUkdCMTAgKi8KKyAgIHsgMjcxNTAsIDB4MDAwMDgwNTkgfSwgLyogR0xfUkdCMTBfQTIgKi8KKyAgIHsgMjcxNjIsIDB4MDAwMDgwNTkgfSwgLyogR0xfUkdCMTBfQTJfRVhUICovCisgICB7IDI3MTc4LCAweDAwMDA4MDUyIH0sIC8qIEdMX1JHQjEwX0VYVCAqLworICAgeyAyNzE5MSwgMHgwMDAwODA1MyB9LCAvKiBHTF9SR0IxMiAqLworICAgeyAyNzIwMCwgMHgwMDAwODA1MyB9LCAvKiBHTF9SR0IxMl9FWFQgKi8KKyAgIHsgMjcyMTMsIDB4MDAwMDgwNTQgfSwgLyogR0xfUkdCMTYgKi8KKyAgIHsgMjcyMjIsIDB4MDAwMDgwNTQgfSwgLyogR0xfUkdCMTZfRVhUICovCisgICB7IDI3MjM1LCAweDAwMDA4MDRFIH0sIC8qIEdMX1JHQjJfRVhUICovCisgICB7IDI3MjQ3LCAweDAwMDA4MDRGIH0sIC8qIEdMX1JHQjQgKi8KKyAgIHsgMjcyNTUsIDB4MDAwMDgwNEYgfSwgLyogR0xfUkdCNF9FWFQgKi8KKyAgIHsgMjcyNjcsIDB4MDAwMDgzQTEgfSwgLyogR0xfUkdCNF9TM1RDICovCisgICB7IDI3MjgwLCAweDAwMDA4MDUwIH0sIC8qIEdMX1JHQjUgKi8KKyAgIHsgMjcyODgsIDB4MDAwMDgwNTcgfSwgLyogR0xfUkdCNV9BMSAqLworICAgeyAyNzI5OSwgMHgwMDAwODA1NyB9LCAvKiBHTF9SR0I1X0ExX0VYVCAqLworICAgeyAyNzMxNCwgMHgwMDAwODA1MCB9LCAvKiBHTF9SR0I1X0VYVCAqLworICAgeyAyNzMyNiwgMHgwMDAwODA1MSB9LCAvKiBHTF9SR0I4ICovCisgICB7IDI3MzM0LCAweDAwMDA4MDUxIH0sIC8qIEdMX1JHQjhfRVhUICovCisgICB7IDI3MzQ2LCAweDAwMDAxOTA4IH0sIC8qIEdMX1JHQkEgKi8KKyAgIHsgMjczNTQsIDB4MDAwMDgwNUEgfSwgLyogR0xfUkdCQTEyICovCisgICB7IDI3MzY0LCAweDAwMDA4MDVBIH0sIC8qIEdMX1JHQkExMl9FWFQgKi8KKyAgIHsgMjczNzgsIDB4MDAwMDgwNUIgfSwgLyogR0xfUkdCQTE2ICovCisgICB7IDI3Mzg4LCAweDAwMDA4MDVCIH0sIC8qIEdMX1JHQkExNl9FWFQgKi8KKyAgIHsgMjc0MDIsIDB4MDAwMDgwNTUgfSwgLyogR0xfUkdCQTIgKi8KKyAgIHsgMjc0MTEsIDB4MDAwMDgwNTUgfSwgLyogR0xfUkdCQTJfRVhUICovCisgICB7IDI3NDI0LCAweDAwMDA4MDU2IH0sIC8qIEdMX1JHQkE0ICovCisgICB7IDI3NDMzLCAweDAwMDA4M0E1IH0sIC8qIEdMX1JHQkE0X0RYVDVfUzNUQyAqLworICAgeyAyNzQ1MiwgMHgwMDAwODA1NiB9LCAvKiBHTF9SR0JBNF9FWFQgKi8KKyAgIHsgMjc0NjUsIDB4MDAwMDgzQTMgfSwgLyogR0xfUkdCQTRfUzNUQyAqLworICAgeyAyNzQ3OSwgMHgwMDAwODA1OCB9LCAvKiBHTF9SR0JBOCAqLworICAgeyAyNzQ4OCwgMHgwMDAwODA1OCB9LCAvKiBHTF9SR0JBOF9FWFQgKi8KKyAgIHsgMjc1MDEsIDB4MDAwMDgzQTQgfSwgLyogR0xfUkdCQV9EWFQ1X1MzVEMgKi8KKyAgIHsgMjc1MTksIDB4MDAwMDBDMzEgfSwgLyogR0xfUkdCQV9NT0RFICovCisgICB7IDI3NTMyLCAweDAwMDA4M0EyIH0sIC8qIEdMX1JHQkFfUzNUQyAqLworICAgeyAyNzU0NSwgMHgwMDAwODNBMCB9LCAvKiBHTF9SR0JfUzNUQyAqLworICAgeyAyNzU1NywgMHgwMDAwODU3MyB9LCAvKiBHTF9SR0JfU0NBTEUgKi8KKyAgIHsgMjc1NzAsIDB4MDAwMDg1NzMgfSwgLyogR0xfUkdCX1NDQUxFX0FSQiAqLworICAgeyAyNzU4NywgMHgwMDAwODU3MyB9LCAvKiBHTF9SR0JfU0NBTEVfRVhUICovCisgICB7IDI3NjA0LCAweDAwMDAwNDA3IH0sIC8qIEdMX1JJR0hUICovCisgICB7IDI3NjEzLCAweDAwMDAyMDAwIH0sIC8qIEdMX1MgKi8KKyAgIHsgMjc2MTgsIDB4MDAwMDhCNUQgfSwgLyogR0xfU0FNUExFUl8xRCAqLworICAgeyAyNzYzMiwgMHgwMDAwOEI2MSB9LCAvKiBHTF9TQU1QTEVSXzFEX1NIQURPVyAqLworICAgeyAyNzY1MywgMHgwMDAwOEI1RSB9LCAvKiBHTF9TQU1QTEVSXzJEICovCisgICB7IDI3NjY3LCAweDAwMDA4QjYyIH0sIC8qIEdMX1NBTVBMRVJfMkRfU0hBRE9XICovCisgICB7IDI3Njg4LCAweDAwMDA4QjVGIH0sIC8qIEdMX1NBTVBMRVJfM0QgKi8KKyAgIHsgMjc3MDIsIDB4MDAwMDhCNjAgfSwgLyogR0xfU0FNUExFUl9DVUJFICovCisgICB7IDI3NzE4LCAweDAwMDA4MEE5IH0sIC8qIEdMX1NBTVBMRVMgKi8KKyAgIHsgMjc3MjksIDB4MDAwMDg2QjQgfSwgLyogR0xfU0FNUExFU18zREZYICovCisgICB7IDI3NzQ1LCAweDAwMDA4MEE5IH0sIC8qIEdMX1NBTVBMRVNfQVJCICovCisgICB7IDI3NzYwLCAweDAwMDA4OTE0IH0sIC8qIEdMX1NBTVBMRVNfUEFTU0VEICovCisgICB7IDI3Nzc4LCAweDAwMDA4OTE0IH0sIC8qIEdMX1NBTVBMRVNfUEFTU0VEX0FSQiAqLworICAgeyAyNzgwMCwgMHgwMDAwODA5RSB9LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKi8KKyAgIHsgMjc4MjgsIDB4MDAwMDgwOUUgfSwgLyogR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFX0FSQiAqLworICAgeyAyNzg2MCwgMHgwMDAwODA5RiB9LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICovCisgICB7IDI3ODgzLCAweDAwMDA4MDlGIH0sIC8qIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfQVJCICovCisgICB7IDI3OTEwLCAweDAwMDA4MEE4IH0sIC8qIEdMX1NBTVBMRV9CVUZGRVJTICovCisgICB7IDI3OTI4LCAweDAwMDA4NkIzIH0sIC8qIEdMX1NBTVBMRV9CVUZGRVJTXzNERlggKi8KKyAgIHsgMjc5NTEsIDB4MDAwMDgwQTggfSwgLyogR0xfU0FNUExFX0JVRkZFUlNfQVJCICovCisgICB7IDI3OTczLCAweDAwMDA4MEEwIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRSAqLworICAgeyAyNzk5MiwgMHgwMDAwODBBMCB9LCAvKiBHTF9TQU1QTEVfQ09WRVJBR0VfQVJCICovCisgICB7IDI4MDE1LCAweDAwMDA4MEFCIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgKi8KKyAgIHsgMjgwNDEsIDB4MDAwMDgwQUIgfSwgLyogR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF9BUkIgKi8KKyAgIHsgMjgwNzEsIDB4MDAwMDgwQUEgfSwgLyogR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICovCisgICB7IDI4MDk2LCAweDAwMDA4MEFBIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV9BUkIgKi8KKyAgIHsgMjgxMjUsIDB4MDAwODAwMDAgfSwgLyogR0xfU0NJU1NPUl9CSVQgKi8KKyAgIHsgMjgxNDAsIDB4MDAwMDBDMTAgfSwgLyogR0xfU0NJU1NPUl9CT1ggKi8KKyAgIHsgMjgxNTUsIDB4MDAwMDBDMTEgfSwgLyogR0xfU0NJU1NPUl9URVNUICovCisgICB7IDI4MTcxLCAweDAwMDA4NDVFIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWSAqLworICAgeyAyODE5NiwgMHgwMDAwODg5QyB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMjgyMzYsIDB4MDAwMDg4OUMgfSwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLworICAgeyAyODI4MCwgMHgwMDAwODQ1RCB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAqLworICAgeyAyODMxMywgMHgwMDAwODQ1QSB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRSAqLworICAgeyAyODM0MywgMHgwMDAwODQ1QyB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICovCisgICB7IDI4Mzc1LCAweDAwMDA4NDVCIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICovCisgICB7IDI4NDA1LCAweDAwMDAxQzAyIH0sIC8qIEdMX1NFTEVDVCAqLworICAgeyAyODQxNSwgMHgwMDAwMERGMyB9LCAvKiBHTF9TRUxFQ1RJT05fQlVGRkVSX1BPSU5URVIgKi8KKyAgIHsgMjg0NDMsIDB4MDAwMDBERjQgfSwgLyogR0xfU0VMRUNUSU9OX0JVRkZFUl9TSVpFICovCisgICB7IDI4NDY4LCAweDAwMDA4MDEyIH0sIC8qIEdMX1NFUEFSQUJMRV8yRCAqLworICAgeyAyODQ4NCwgMHgwMDAwODFGQSB9LCAvKiBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUiAqLworICAgeyAyODUxMSwgMHgwMDAwODFGQSB9LCAvKiBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUl9FWFQgKi8KKyAgIHsgMjg1NDIsIDB4MDAwMDE1MEYgfSwgLyogR0xfU0VUICovCisgICB7IDI4NTQ5LCAweDAwMDA4QjQ4IH0sIC8qIEdMX1NIQURFUl9PQkpFQ1RfQVJCICovCisgICB7IDI4NTcwLCAweDAwMDA4Qjg4IH0sIC8qIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICovCisgICB7IDI4NTk0LCAweDAwMDA4QjRGIH0sIC8qIEdMX1NIQURFUl9UWVBFICovCisgICB7IDI4NjA5LCAweDAwMDAwQjU0IH0sIC8qIEdMX1NIQURFX01PREVMICovCisgICB7IDI4NjI0LCAweDAwMDA4QjhDIH0sIC8qIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAqLworICAgeyAyODY1MiwgMHgwMDAwODBCRiB9LCAvKiBHTF9TSEFET1dfQU1CSUVOVF9TR0lYICovCisgICB7IDI4Njc1LCAweDAwMDA4MUZCIH0sIC8qIEdMX1NIQVJFRF9URVhUVVJFX1BBTEVUVEVfRVhUICovCisgICB7IDI4NzA1LCAweDAwMDAxNjAxIH0sIC8qIEdMX1NISU5JTkVTUyAqLworICAgeyAyODcxOCwgMHgwMDAwMTQwMiB9LCAvKiBHTF9TSE9SVCAqLworICAgeyAyODcyNywgMHgwMDAwODFGOSB9LCAvKiBHTF9TSU5HTEVfQ09MT1IgKi8KKyAgIHsgMjg3NDMsIDB4MDAwMDgxRjkgfSwgLyogR0xfU0lOR0xFX0NPTE9SX0VYVCAqLworICAgeyAyODc2MywgMHgwMDAwODVDQyB9LCAvKiBHTF9TTElDRV9BQ0NVTV9TVU4gKi8KKyAgIHsgMjg3ODIsIDB4MDAwMDFEMDEgfSwgLyogR0xfU01PT1RIICovCisgICB7IDI4NzkyLCAweDAwMDAwQjIzIH0sIC8qIEdMX1NNT09USF9MSU5FX1dJRFRIX0dSQU5VTEFSSVRZICovCisgICB7IDI4ODI1LCAweDAwMDAwQjIyIH0sIC8qIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICovCisgICB7IDI4ODUyLCAweDAwMDAwQjEzIH0sIC8qIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCisgICB7IDI4ODg1LCAweDAwMDAwQjEyIH0sIC8qIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICovCisgICB7IDI4OTEyLCAweDAwMDA4NTg4IH0sIC8qIEdMX1NPVVJDRTBfQUxQSEEgKi8KKyAgIHsgMjg5MjksIDB4MDAwMDg1ODggfSwgLyogR0xfU09VUkNFMF9BTFBIQV9BUkIgKi8KKyAgIHsgMjg5NTAsIDB4MDAwMDg1ODggfSwgLyogR0xfU09VUkNFMF9BTFBIQV9FWFQgKi8KKyAgIHsgMjg5NzEsIDB4MDAwMDg1ODAgfSwgLyogR0xfU09VUkNFMF9SR0IgKi8KKyAgIHsgMjg5ODYsIDB4MDAwMDg1ODAgfSwgLyogR0xfU09VUkNFMF9SR0JfQVJCICovCisgICB7IDI5MDA1LCAweDAwMDA4NTgwIH0sIC8qIEdMX1NPVVJDRTBfUkdCX0VYVCAqLworICAgeyAyOTAyNCwgMHgwMDAwODU4OSB9LCAvKiBHTF9TT1VSQ0UxX0FMUEhBICovCisgICB7IDI5MDQxLCAweDAwMDA4NTg5IH0sIC8qIEdMX1NPVVJDRTFfQUxQSEFfQVJCICovCisgICB7IDI5MDYyLCAweDAwMDA4NTg5IH0sIC8qIEdMX1NPVVJDRTFfQUxQSEFfRVhUICovCisgICB7IDI5MDgzLCAweDAwMDA4NTgxIH0sIC8qIEdMX1NPVVJDRTFfUkdCICovCisgICB7IDI5MDk4LCAweDAwMDA4NTgxIH0sIC8qIEdMX1NPVVJDRTFfUkdCX0FSQiAqLworICAgeyAyOTExNywgMHgwMDAwODU4MSB9LCAvKiBHTF9TT1VSQ0UxX1JHQl9FWFQgKi8KKyAgIHsgMjkxMzYsIDB4MDAwMDg1OEEgfSwgLyogR0xfU09VUkNFMl9BTFBIQSAqLworICAgeyAyOTE1MywgMHgwMDAwODU4QSB9LCAvKiBHTF9TT1VSQ0UyX0FMUEhBX0FSQiAqLworICAgeyAyOTE3NCwgMHgwMDAwODU4QSB9LCAvKiBHTF9TT1VSQ0UyX0FMUEhBX0VYVCAqLworICAgeyAyOTE5NSwgMHgwMDAwODU4MiB9LCAvKiBHTF9TT1VSQ0UyX1JHQiAqLworICAgeyAyOTIxMCwgMHgwMDAwODU4MiB9LCAvKiBHTF9TT1VSQ0UyX1JHQl9BUkIgKi8KKyAgIHsgMjkyMjksIDB4MDAwMDg1ODIgfSwgLyogR0xfU09VUkNFMl9SR0JfRVhUICovCisgICB7IDI5MjQ4LCAweDAwMDA4NThCIH0sIC8qIEdMX1NPVVJDRTNfQUxQSEFfTlYgKi8KKyAgIHsgMjkyNjgsIDB4MDAwMDg1ODMgfSwgLyogR0xfU09VUkNFM19SR0JfTlYgKi8KKyAgIHsgMjkyODYsIDB4MDAwMDEyMDIgfSwgLyogR0xfU1BFQ1VMQVIgKi8KKyAgIHsgMjkyOTgsIDB4MDAwMDI0MDIgfSwgLyogR0xfU1BIRVJFX01BUCAqLworICAgeyAyOTMxMiwgMHgwMDAwMTIwNiB9LCAvKiBHTF9TUE9UX0NVVE9GRiAqLworICAgeyAyOTMyNywgMHgwMDAwMTIwNCB9LCAvKiBHTF9TUE9UX0RJUkVDVElPTiAqLworICAgeyAyOTM0NSwgMHgwMDAwMTIwNSB9LCAvKiBHTF9TUE9UX0VYUE9ORU5UICovCisgICB7IDI5MzYyLCAweDAwMDA4NTg4IH0sIC8qIEdMX1NSQzBfQUxQSEEgKi8KKyAgIHsgMjkzNzYsIDB4MDAwMDg1ODAgfSwgLyogR0xfU1JDMF9SR0IgKi8KKyAgIHsgMjkzODgsIDB4MDAwMDg1ODkgfSwgLyogR0xfU1JDMV9BTFBIQSAqLworICAgeyAyOTQwMiwgMHgwMDAwODU4MSB9LCAvKiBHTF9TUkMxX1JHQiAqLworICAgeyAyOTQxNCwgMHgwMDAwODU4QSB9LCAvKiBHTF9TUkMyX0FMUEhBICovCisgICB7IDI5NDI4LCAweDAwMDA4NTgyIH0sIC8qIEdMX1NSQzJfUkdCICovCisgICB7IDI5NDQwLCAweDAwMDAwMzAyIH0sIC8qIEdMX1NSQ19BTFBIQSAqLworICAgeyAyOTQ1MywgMHgwMDAwMDMwOCB9LCAvKiBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgKi8KKyAgIHsgMjk0NzUsIDB4MDAwMDAzMDAgfSwgLyogR0xfU1JDX0NPTE9SICovCisgICB7IDI5NDg4LCAweDAwMDAwNTAzIH0sIC8qIEdMX1NUQUNLX09WRVJGTE9XICovCisgICB7IDI5NTA2LCAweDAwMDAwNTA0IH0sIC8qIEdMX1NUQUNLX1VOREVSRkxPVyAqLworICAgeyAyOTUyNSwgMHgwMDAwODhFNiB9LCAvKiBHTF9TVEFUSUNfQ09QWSAqLworICAgeyAyOTU0MCwgMHgwMDAwODhFNiB9LCAvKiBHTF9TVEFUSUNfQ09QWV9BUkIgKi8KKyAgIHsgMjk1NTksIDB4MDAwMDg4RTQgfSwgLyogR0xfU1RBVElDX0RSQVcgKi8KKyAgIHsgMjk1NzQsIDB4MDAwMDg4RTQgfSwgLyogR0xfU1RBVElDX0RSQVdfQVJCICovCisgICB7IDI5NTkzLCAweDAwMDA4OEU1IH0sIC8qIEdMX1NUQVRJQ19SRUFEICovCisgICB7IDI5NjA4LCAweDAwMDA4OEU1IH0sIC8qIEdMX1NUQVRJQ19SRUFEX0FSQiAqLworICAgeyAyOTYyNywgMHgwMDAwMTgwMiB9LCAvKiBHTF9TVEVOQ0lMICovCisgICB7IDI5NjM4LCAweDAwMDA4RDIwIH0sIC8qIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQgKi8KKyAgIHsgMjk2NjQsIDB4MDAwMDg4MDEgfSwgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUwgKi8KKyAgIHsgMjk2ODUsIDB4MDAwMDg4MDEgfSwgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUxfQVRJICovCisgICB7IDI5NzEwLCAweDAwMDA4ODAwIH0sIC8qIEdMX1NURU5DSUxfQkFDS19GVU5DICovCisgICB7IDI5NzMxLCAweDAwMDA4ODAwIH0sIC8qIEdMX1NURU5DSUxfQkFDS19GVU5DX0FUSSAqLworICAgeyAyOTc1NiwgMHgwMDAwODgwMiB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICovCisgICB7IDI5Nzg4LCAweDAwMDA4ODAyIH0sIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUxfQVRJICovCisgICB7IDI5ODI0LCAweDAwMDA4ODAzIH0sIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgKi8KKyAgIHsgMjk4NTYsIDB4MDAwMDg4MDMgfSwgLyogR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU19BVEkgKi8KKyAgIHsgMjk4OTIsIDB4MDAwMDhDQTMgfSwgLyogR0xfU1RFTkNJTF9CQUNLX1JFRiAqLworICAgeyAyOTkxMiwgMHgwMDAwOENBNCB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAqLworICAgeyAyOTkzOSwgMHgwMDAwOENBNSB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICovCisgICB7IDI5OTY1LCAweDAwMDAwRDU3IH0sIC8qIEdMX1NURU5DSUxfQklUUyAqLworICAgeyAyOTk4MSwgMHgwMDAwMDQwMCB9LCAvKiBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KKyAgIHsgMzAwMDMsIDB4MDAwMDBCOTEgfSwgLyogR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAqLworICAgeyAzMDAyNiwgMHgwMDAwMEI5NCB9LCAvKiBHTF9TVEVOQ0lMX0ZBSUwgKi8KKyAgIHsgMzAwNDIsIDB4MDAwMDBCOTIgfSwgLyogR0xfU1RFTkNJTF9GVU5DICovCisgICB7IDMwMDU4LCAweDAwMDAxOTAxIH0sIC8qIEdMX1NURU5DSUxfSU5ERVggKi8KKyAgIHsgMzAwNzUsIDB4MDAwMDhENDkgfSwgLyogR0xfU1RFTkNJTF9JTkRFWDE2X0VYVCAqLworICAgeyAzMDA5OCwgMHgwMDAwOEQ0NiB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYMV9FWFQgKi8KKyAgIHsgMzAxMjAsIDB4MDAwMDhENDcgfSwgLyogR0xfU1RFTkNJTF9JTkRFWDRfRVhUICovCisgICB7IDMwMTQyLCAweDAwMDA4RDQ4IH0sIC8qIEdMX1NURU5DSUxfSU5ERVg4X0VYVCAqLworICAgeyAzMDE2NCwgMHgwMDAwOEQ0NSB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYX0VYVCAqLworICAgeyAzMDE4NSwgMHgwMDAwMEI5NSB9LCAvKiBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAqLworICAgeyAzMDIxMiwgMHgwMDAwMEI5NiB9LCAvKiBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAqLworICAgeyAzMDIzOSwgMHgwMDAwMEI5NyB9LCAvKiBHTF9TVEVOQ0lMX1JFRiAqLworICAgeyAzMDI1NCwgMHgwMDAwMEI5MCB9LCAvKiBHTF9TVEVOQ0lMX1RFU1QgKi8KKyAgIHsgMzAyNzAsIDB4MDAwMDg5MTAgfSwgLyogR0xfU1RFTkNJTF9URVNUX1RXT19TSURFX0VYVCAqLworICAgeyAzMDI5OSwgMHgwMDAwMEI5MyB9LCAvKiBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgKi8KKyAgIHsgMzAzMjEsIDB4MDAwMDBCOTggfSwgLyogR0xfU1RFTkNJTF9XUklURU1BU0sgKi8KKyAgIHsgMzAzNDIsIDB4MDAwMDBDMzMgfSwgLyogR0xfU1RFUkVPICovCisgICB7IDMwMzUyLCAweDAwMDA4OEUyIH0sIC8qIEdMX1NUUkVBTV9DT1BZICovCisgICB7IDMwMzY3LCAweDAwMDA4OEUyIH0sIC8qIEdMX1NUUkVBTV9DT1BZX0FSQiAqLworICAgeyAzMDM4NiwgMHgwMDAwODhFMCB9LCAvKiBHTF9TVFJFQU1fRFJBVyAqLworICAgeyAzMDQwMSwgMHgwMDAwODhFMCB9LCAvKiBHTF9TVFJFQU1fRFJBV19BUkIgKi8KKyAgIHsgMzA0MjAsIDB4MDAwMDg4RTEgfSwgLyogR0xfU1RSRUFNX1JFQUQgKi8KKyAgIHsgMzA0MzUsIDB4MDAwMDg4RTEgfSwgLyogR0xfU1RSRUFNX1JFQURfQVJCICovCisgICB7IDMwNDU0LCAweDAwMDAwRDUwIH0sIC8qIEdMX1NVQlBJWEVMX0JJVFMgKi8KKyAgIHsgMzA0NzEsIDB4MDAwMDg0RTcgfSwgLyogR0xfU1VCVFJBQ1QgKi8KKyAgIHsgMzA0ODMsIDB4MDAwMDg0RTcgfSwgLyogR0xfU1VCVFJBQ1RfQVJCICovCisgICB7IDMwNDk5LCAweDAwMDAyMDAxIH0sIC8qIEdMX1QgKi8KKyAgIHsgMzA1MDQsIDB4MDAwMDJBMkEgfSwgLyogR0xfVDJGX0MzRl9WM0YgKi8KKyAgIHsgMzA1MTksIDB4MDAwMDJBMkMgfSwgLyogR0xfVDJGX0M0Rl9OM0ZfVjNGICovCisgICB7IDMwNTM4LCAweDAwMDAyQTI5IH0sIC8qIEdMX1QyRl9DNFVCX1YzRiAqLworICAgeyAzMDU1NCwgMHgwMDAwMkEyQiB9LCAvKiBHTF9UMkZfTjNGX1YzRiAqLworICAgeyAzMDU2OSwgMHgwMDAwMkEyNyB9LCAvKiBHTF9UMkZfVjNGICovCisgICB7IDMwNTgwLCAweDAwMDAyQTJEIH0sIC8qIEdMX1Q0Rl9DNEZfTjNGX1Y0RiAqLworICAgeyAzMDU5OSwgMHgwMDAwMkEyOCB9LCAvKiBHTF9UNEZfVjRGICovCisgICB7IDMwNjEwLCAweDAwMDA4MDMxIH0sIC8qIEdMX1RBQkxFX1RPT19MQVJHRV9FWFQgKi8KKyAgIHsgMzA2MzMsIDB4MDAwMDE3MDIgfSwgLyogR0xfVEVYVFVSRSAqLworICAgeyAzMDY0NCwgMHgwMDAwODRDMCB9LCAvKiBHTF9URVhUVVJFMCAqLworICAgeyAzMDY1NiwgMHgwMDAwODRDMCB9LCAvKiBHTF9URVhUVVJFMF9BUkIgKi8KKyAgIHsgMzA2NzIsIDB4MDAwMDg0QzEgfSwgLyogR0xfVEVYVFVSRTEgKi8KKyAgIHsgMzA2ODQsIDB4MDAwMDg0Q0EgfSwgLyogR0xfVEVYVFVSRTEwICovCisgICB7IDMwNjk3LCAweDAwMDA4NENBIH0sIC8qIEdMX1RFWFRVUkUxMF9BUkIgKi8KKyAgIHsgMzA3MTQsIDB4MDAwMDg0Q0IgfSwgLyogR0xfVEVYVFVSRTExICovCisgICB7IDMwNzI3LCAweDAwMDA4NENCIH0sIC8qIEdMX1RFWFRVUkUxMV9BUkIgKi8KKyAgIHsgMzA3NDQsIDB4MDAwMDg0Q0MgfSwgLyogR0xfVEVYVFVSRTEyICovCisgICB7IDMwNzU3LCAweDAwMDA4NENDIH0sIC8qIEdMX1RFWFRVUkUxMl9BUkIgKi8KKyAgIHsgMzA3NzQsIDB4MDAwMDg0Q0QgfSwgLyogR0xfVEVYVFVSRTEzICovCisgICB7IDMwNzg3LCAweDAwMDA4NENEIH0sIC8qIEdMX1RFWFRVUkUxM19BUkIgKi8KKyAgIHsgMzA4MDQsIDB4MDAwMDg0Q0UgfSwgLyogR0xfVEVYVFVSRTE0ICovCisgICB7IDMwODE3LCAweDAwMDA4NENFIH0sIC8qIEdMX1RFWFRVUkUxNF9BUkIgKi8KKyAgIHsgMzA4MzQsIDB4MDAwMDg0Q0YgfSwgLyogR0xfVEVYVFVSRTE1ICovCisgICB7IDMwODQ3LCAweDAwMDA4NENGIH0sIC8qIEdMX1RFWFRVUkUxNV9BUkIgKi8KKyAgIHsgMzA4NjQsIDB4MDAwMDg0RDAgfSwgLyogR0xfVEVYVFVSRTE2ICovCisgICB7IDMwODc3LCAweDAwMDA4NEQwIH0sIC8qIEdMX1RFWFRVUkUxNl9BUkIgKi8KKyAgIHsgMzA4OTQsIDB4MDAwMDg0RDEgfSwgLyogR0xfVEVYVFVSRTE3ICovCisgICB7IDMwOTA3LCAweDAwMDA4NEQxIH0sIC8qIEdMX1RFWFRVUkUxN19BUkIgKi8KKyAgIHsgMzA5MjQsIDB4MDAwMDg0RDIgfSwgLyogR0xfVEVYVFVSRTE4ICovCisgICB7IDMwOTM3LCAweDAwMDA4NEQyIH0sIC8qIEdMX1RFWFRVUkUxOF9BUkIgKi8KKyAgIHsgMzA5NTQsIDB4MDAwMDg0RDMgfSwgLyogR0xfVEVYVFVSRTE5ICovCisgICB7IDMwOTY3LCAweDAwMDA4NEQzIH0sIC8qIEdMX1RFWFRVUkUxOV9BUkIgKi8KKyAgIHsgMzA5ODQsIDB4MDAwMDg0QzEgfSwgLyogR0xfVEVYVFVSRTFfQVJCICovCisgICB7IDMxMDAwLCAweDAwMDA4NEMyIH0sIC8qIEdMX1RFWFRVUkUyICovCisgICB7IDMxMDEyLCAweDAwMDA4NEQ0IH0sIC8qIEdMX1RFWFRVUkUyMCAqLworICAgeyAzMTAyNSwgMHgwMDAwODRENCB9LCAvKiBHTF9URVhUVVJFMjBfQVJCICovCisgICB7IDMxMDQyLCAweDAwMDA4NEQ1IH0sIC8qIEdMX1RFWFRVUkUyMSAqLworICAgeyAzMTA1NSwgMHgwMDAwODRENSB9LCAvKiBHTF9URVhUVVJFMjFfQVJCICovCisgICB7IDMxMDcyLCAweDAwMDA4NEQ2IH0sIC8qIEdMX1RFWFRVUkUyMiAqLworICAgeyAzMTA4NSwgMHgwMDAwODRENiB9LCAvKiBHTF9URVhUVVJFMjJfQVJCICovCisgICB7IDMxMTAyLCAweDAwMDA4NEQ3IH0sIC8qIEdMX1RFWFRVUkUyMyAqLworICAgeyAzMTExNSwgMHgwMDAwODRENyB9LCAvKiBHTF9URVhUVVJFMjNfQVJCICovCisgICB7IDMxMTMyLCAweDAwMDA4NEQ4IH0sIC8qIEdMX1RFWFRVUkUyNCAqLworICAgeyAzMTE0NSwgMHgwMDAwODREOCB9LCAvKiBHTF9URVhUVVJFMjRfQVJCICovCisgICB7IDMxMTYyLCAweDAwMDA4NEQ5IH0sIC8qIEdMX1RFWFRVUkUyNSAqLworICAgeyAzMTE3NSwgMHgwMDAwODREOSB9LCAvKiBHTF9URVhUVVJFMjVfQVJCICovCisgICB7IDMxMTkyLCAweDAwMDA4NERBIH0sIC8qIEdMX1RFWFRVUkUyNiAqLworICAgeyAzMTIwNSwgMHgwMDAwODREQSB9LCAvKiBHTF9URVhUVVJFMjZfQVJCICovCisgICB7IDMxMjIyLCAweDAwMDA4NERCIH0sIC8qIEdMX1RFWFRVUkUyNyAqLworICAgeyAzMTIzNSwgMHgwMDAwODREQiB9LCAvKiBHTF9URVhUVVJFMjdfQVJCICovCisgICB7IDMxMjUyLCAweDAwMDA4NERDIH0sIC8qIEdMX1RFWFRVUkUyOCAqLworICAgeyAzMTI2NSwgMHgwMDAwODREQyB9LCAvKiBHTF9URVhUVVJFMjhfQVJCICovCisgICB7IDMxMjgyLCAweDAwMDA4NEREIH0sIC8qIEdMX1RFWFRVUkUyOSAqLworICAgeyAzMTI5NSwgMHgwMDAwODRERCB9LCAvKiBHTF9URVhUVVJFMjlfQVJCICovCisgICB7IDMxMzEyLCAweDAwMDA4NEMyIH0sIC8qIEdMX1RFWFRVUkUyX0FSQiAqLworICAgeyAzMTMyOCwgMHgwMDAwODRDMyB9LCAvKiBHTF9URVhUVVJFMyAqLworICAgeyAzMTM0MCwgMHgwMDAwODRERSB9LCAvKiBHTF9URVhUVVJFMzAgKi8KKyAgIHsgMzEzNTMsIDB4MDAwMDg0REUgfSwgLyogR0xfVEVYVFVSRTMwX0FSQiAqLworICAgeyAzMTM3MCwgMHgwMDAwODRERiB9LCAvKiBHTF9URVhUVVJFMzEgKi8KKyAgIHsgMzEzODMsIDB4MDAwMDg0REYgfSwgLyogR0xfVEVYVFVSRTMxX0FSQiAqLworICAgeyAzMTQwMCwgMHgwMDAwODRDMyB9LCAvKiBHTF9URVhUVVJFM19BUkIgKi8KKyAgIHsgMzE0MTYsIDB4MDAwMDg0QzQgfSwgLyogR0xfVEVYVFVSRTQgKi8KKyAgIHsgMzE0MjgsIDB4MDAwMDg0QzQgfSwgLyogR0xfVEVYVFVSRTRfQVJCICovCisgICB7IDMxNDQ0LCAweDAwMDA4NEM1IH0sIC8qIEdMX1RFWFRVUkU1ICovCisgICB7IDMxNDU2LCAweDAwMDA4NEM1IH0sIC8qIEdMX1RFWFRVUkU1X0FSQiAqLworICAgeyAzMTQ3MiwgMHgwMDAwODRDNiB9LCAvKiBHTF9URVhUVVJFNiAqLworICAgeyAzMTQ4NCwgMHgwMDAwODRDNiB9LCAvKiBHTF9URVhUVVJFNl9BUkIgKi8KKyAgIHsgMzE1MDAsIDB4MDAwMDg0QzcgfSwgLyogR0xfVEVYVFVSRTcgKi8KKyAgIHsgMzE1MTIsIDB4MDAwMDg0QzcgfSwgLyogR0xfVEVYVFVSRTdfQVJCICovCisgICB7IDMxNTI4LCAweDAwMDA4NEM4IH0sIC8qIEdMX1RFWFRVUkU4ICovCisgICB7IDMxNTQwLCAweDAwMDA4NEM4IH0sIC8qIEdMX1RFWFRVUkU4X0FSQiAqLworICAgeyAzMTU1NiwgMHgwMDAwODRDOSB9LCAvKiBHTF9URVhUVVJFOSAqLworICAgeyAzMTU2OCwgMHgwMDAwODRDOSB9LCAvKiBHTF9URVhUVVJFOV9BUkIgKi8KKyAgIHsgMzE1ODQsIDB4MDAwMDBERTAgfSwgLyogR0xfVEVYVFVSRV8xRCAqLworICAgeyAzMTU5OCwgMHgwMDAwOEMxOCB9LCAvKiBHTF9URVhUVVJFXzFEX0FSUkFZX0VYVCAqLworICAgeyAzMTYyMiwgMHgwMDAwMERFMSB9LCAvKiBHTF9URVhUVVJFXzJEICovCisgICB7IDMxNjM2LCAweDAwMDA4QzFBIH0sIC8qIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICovCisgICB7IDMxNjYwLCAweDAwMDA4MDZGIH0sIC8qIEdMX1RFWFRVUkVfM0QgKi8KKyAgIHsgMzE2NzQsIDB4MDAwMDgwNUYgfSwgLyogR0xfVEVYVFVSRV9BTFBIQV9TSVpFICovCisgICB7IDMxNjk2LCAweDAwMDA4MDVGIH0sIC8qIEdMX1RFWFRVUkVfQUxQSEFfU0laRV9FWFQgKi8KKyAgIHsgMzE3MjIsIDB4MDAwMDgxM0MgfSwgLyogR0xfVEVYVFVSRV9CQVNFX0xFVkVMICovCisgICB7IDMxNzQ0LCAweDAwMDA4MDY4IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18xRCAqLworICAgeyAzMTc2NiwgMHgwMDAwOEMxQyB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVlfRVhUICovCisgICB7IDMxNzk4LCAweDAwMDA4MDY5IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18yRCAqLworICAgeyAzMTgyMCwgMHgwMDAwOEMxRCB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMkRfQVJSQVlfRVhUICovCisgICB7IDMxODUyLCAweDAwMDA4MDZBIH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18zRCAqLworICAgeyAzMTg3NCwgMHgwMDAwODUxNCB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgKi8KKyAgIHsgMzE5MDIsIDB4MDAwMDg1MTQgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSQiAqLworICAgeyAzMTkzNCwgMHgwMDAwODRGNiB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFX0FSQiAqLworICAgeyAzMTk2NywgMHgwMDAwODRGNiB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFX05WICovCisgICB7IDMxOTk5LCAweDAwMDQwMDAwIH0sIC8qIEdMX1RFWFRVUkVfQklUICovCisgICB7IDMyMDE0LCAweDAwMDA4MDVFIH0sIC8qIEdMX1RFWFRVUkVfQkxVRV9TSVpFICovCisgICB7IDMyMDM1LCAweDAwMDA4MDVFIH0sIC8qIEdMX1RFWFRVUkVfQkxVRV9TSVpFX0VYVCAqLworICAgeyAzMjA2MCwgMHgwMDAwMTAwNSB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUiAqLworICAgeyAzMjA3OCwgMHgwMDAwMTAwNCB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiAqLworICAgeyAzMjEwMiwgMHgwMDAwODE3MSB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfQ0VOVEVSX1NHSVggKi8KKyAgIHsgMzIxMzMsIDB4MDAwMDgxNzYgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggKi8KKyAgIHsgMzIxNjMsIDB4MDAwMDgxNzIgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggKi8KKyAgIHsgMzIxOTMsIDB4MDAwMDgxNzUgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAqLworICAgeyAzMjIyOCwgMHgwMDAwODE3MyB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfT0ZGU0VUX1NHSVggKi8KKyAgIHsgMzIyNTksIDB4MDAwMDgxNzQgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLworICAgeyAzMjI5NywgMHgwMDAwODBCQyB9LCAvKiBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAqLworICAgeyAzMjMyNCwgMHgwMDAwODFFRiB9LCAvKiBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICovCisgICB7IDMyMzU2LCAweDAwMDA4MEJGIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAqLworICAgeyAzMjM5MCwgMHgwMDAwODg0RCB9LCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAqLworICAgeyAzMjQxNCwgMHgwMDAwODg0RCB9LCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQ19BUkIgKi8KKyAgIHsgMzI0NDIsIDB4MDAwMDg4NEMgfSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX01PREUgKi8KKyAgIHsgMzI0NjYsIDB4MDAwMDg4NEMgfSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX01PREVfQVJCICovCisgICB7IDMyNDk0LCAweDAwMDA4MTlCIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9PUEVSQVRPUl9TR0lYICovCisgICB7IDMyNTI3LCAweDAwMDA4MTlBIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICovCisgICB7IDMyNTUxLCAweDAwMDAxMDAzIH0sIC8qIEdMX1RFWFRVUkVfQ09NUE9ORU5UUyAqLworICAgeyAzMjU3MywgMHgwMDAwODZBMSB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRUQgKi8KKyAgIHsgMzI1OTUsIDB4MDAwMDg2QTEgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0FSQiAqLworICAgeyAzMjYyMSwgMHgwMDAwODZBMyB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRURfRk9STUFUU19BUkIgKi8KKyAgIHsgMzI2NTUsIDB4MDAwMDg2QTAgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUgKi8KKyAgIHsgMzI2ODgsIDB4MDAwMDg2QTAgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVfQVJCICovCisgICB7IDMyNzI1LCAweDAwMDA4NEVGIH0sIC8qIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVCAqLworICAgeyAzMjc1MywgMHgwMDAwODRFRiB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlRfQVJCICovCisgICB7IDMyNzg1LCAweDAwMDA4MDc4IH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgKi8KKyAgIHsgMzI4MDgsIDB4MDAwMDg4OUEgfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAzMjg0NiwgMHgwMDAwODg5QSB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLworICAgeyAzMjg4OCwgMHgwMDAwODA5MiB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KKyAgIHsgMzI5MTksIDB4MDAwMDgwODggfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCisgICB7IDMyOTQ3LCAweDAwMDA4MDhBIH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCisgICB7IDMyOTc3LCAweDAwMDA4MDg5IH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAqLworICAgeyAzMzAwNSwgMHgwMDAwODUxMyB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQICovCisgICB7IDMzMDI1LCAweDAwMDA4NTEzIH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCICovCisgICB7IDMzMDQ5LCAweDAwMDA4NTE2IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAqLworICAgeyAzMzA4MCwgMHgwMDAwODUxNiB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCICovCisgICB7IDMzMTE1LCAweDAwMDA4NTE4IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAqLworICAgeyAzMzE0NiwgMHgwMDAwODUxOCB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCICovCisgICB7IDMzMTgxLCAweDAwMDA4NTFBIH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAqLworICAgeyAzMzIxMiwgMHgwMDAwODUxQSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCICovCisgICB7IDMzMjQ3LCAweDAwMDA4NTE1IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAqLworICAgeyAzMzI3OCwgMHgwMDAwODUxNSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCICovCisgICB7IDMzMzEzLCAweDAwMDA4NTE3IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAqLworICAgeyAzMzM0NCwgMHgwMDAwODUxNyB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCICovCisgICB7IDMzMzc5LCAweDAwMDA4NTE5IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAqLworICAgeyAzMzQxMCwgMHgwMDAwODUxOSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCICovCisgICB7IDMzNDQ1LCAweDAwMDA4MDcxIH0sIC8qIEdMX1RFWFRVUkVfREVQVEggKi8KKyAgIHsgMzM0NjIsIDB4MDAwMDg4NEEgfSwgLyogR0xfVEVYVFVSRV9ERVBUSF9TSVpFICovCisgICB7IDMzNDg0LCAweDAwMDA4ODRBIH0sIC8qIEdMX1RFWFRVUkVfREVQVEhfU0laRV9BUkIgKi8KKyAgIHsgMzM1MTAsIDB4MDAwMDIzMDAgfSwgLyogR0xfVEVYVFVSRV9FTlYgKi8KKyAgIHsgMzM1MjUsIDB4MDAwMDIyMDEgfSwgLyogR0xfVEVYVFVSRV9FTlZfQ09MT1IgKi8KKyAgIHsgMzM1NDYsIDB4MDAwMDIyMDAgfSwgLyogR0xfVEVYVFVSRV9FTlZfTU9ERSAqLworICAgeyAzMzU2NiwgMHgwMDAwODUwMCB9LCAvKiBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MICovCisgICB7IDMzNTkyLCAweDAwMDAyNTAwIH0sIC8qIEdMX1RFWFRVUkVfR0VOX01PREUgKi8KKyAgIHsgMzM2MTIsIDB4MDAwMDBDNjMgfSwgLyogR0xfVEVYVFVSRV9HRU5fUSAqLworICAgeyAzMzYyOSwgMHgwMDAwMEM2MiB9LCAvKiBHTF9URVhUVVJFX0dFTl9SICovCisgICB7IDMzNjQ2LCAweDAwMDAwQzYwIH0sIC8qIEdMX1RFWFRVUkVfR0VOX1MgKi8KKyAgIHsgMzM2NjMsIDB4MDAwMDBDNjEgfSwgLyogR0xfVEVYVFVSRV9HRU5fVCAqLworICAgeyAzMzY4MCwgMHgwMDAwODE5RCB9LCAvKiBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggKi8KKyAgIHsgMzM3MDUsIDB4MDAwMDgwNUQgfSwgLyogR0xfVEVYVFVSRV9HUkVFTl9TSVpFICovCisgICB7IDMzNzI3LCAweDAwMDA4MDVEIH0sIC8qIEdMX1RFWFRVUkVfR1JFRU5fU0laRV9FWFQgKi8KKyAgIHsgMzM3NTMsIDB4MDAwMDEwMDEgfSwgLyogR0xfVEVYVFVSRV9IRUlHSFQgKi8KKyAgIHsgMzM3NzEsIDB4MDAwMDgwRUQgfSwgLyogR0xfVEVYVFVSRV9JTkRFWF9TSVpFX0VYVCAqLworICAgeyAzMzc5NywgMHgwMDAwODA2MSB9LCAvKiBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFICovCisgICB7IDMzODIzLCAweDAwMDA4MDYxIH0sIC8qIEdMX1RFWFRVUkVfSU5URU5TSVRZX1NJWkVfRVhUICovCisgICB7IDMzODUzLCAweDAwMDAxMDAzIH0sIC8qIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUICovCisgICB7IDMzODgwLCAweDAwMDA4MTlDIH0sIC8qIEdMX1RFWFRVUkVfTEVRVUFMX1JfU0dJWCAqLworICAgeyAzMzkwNSwgMHgwMDAwODUwMSB9LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTICovCisgICB7IDMzOTI1LCAweDAwMDA4NTAxIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhUICovCisgICB7IDMzOTQ5LCAweDAwMDA4MTkwIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICovCisgICB7IDMzOTc2LCAweDAwMDA4MThFIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfU19TR0lYICovCisgICB7IDM0MDAzLCAweDAwMDA4MThGIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYICovCisgICB7IDM0MDMwLCAweDAwMDA4MDYwIH0sIC8qIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkUgKi8KKyAgIHsgMzQwNTYsIDB4MDAwMDgwNjAgfSwgLyogR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRV9FWFQgKi8KKyAgIHsgMzQwODYsIDB4MDAwMDI4MDAgfSwgLyogR0xfVEVYVFVSRV9NQUdfRklMVEVSICovCisgICB7IDM0MTA4LCAweDAwMDAwQkE4IH0sIC8qIEdMX1RFWFRVUkVfTUFUUklYICovCisgICB7IDM0MTI2LCAweDAwMDA4NEZFIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICovCisgICB7IDM0MTU2LCAweDAwMDA4MzZCIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1JfU0dJWCAqLworICAgeyAzNDE4NCwgMHgwMDAwODM2OSB9LCAvKiBHTF9URVhUVVJFX01BWF9DTEFNUF9TX1NHSVggKi8KKyAgIHsgMzQyMTIsIDB4MDAwMDgzNkEgfSwgLyogR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICovCisgICB7IDM0MjQwLCAweDAwMDA4MTNEIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0xFVkVMICovCisgICB7IDM0MjYxLCAweDAwMDA4MTNCIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0xPRCAqLworICAgeyAzNDI4MCwgMHgwMDAwMjgwMSB9LCAvKiBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KKyAgIHsgMzQzMDIsIDB4MDAwMDgxM0EgfSwgLyogR0xfVEVYVFVSRV9NSU5fTE9EICovCisgICB7IDM0MzIxLCAweDAwMDA4MDY2IH0sIC8qIEdMX1RFWFRVUkVfUFJJT1JJVFkgKi8KKyAgIHsgMzQzNDEsIDB4MDAwMDg0RjUgfSwgLyogR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCisgICB7IDM0MzY2LCAweDAwMDA4NEY1IH0sIC8qIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICovCisgICB7IDM0MzkwLCAweDAwMDA4MDVDIH0sIC8qIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KKyAgIHsgMzQ0MTAsIDB4MDAwMDgwNUMgfSwgLyogR0xfVEVYVFVSRV9SRURfU0laRV9FWFQgKi8KKyAgIHsgMzQ0MzQsIDB4MDAwMDgwNjcgfSwgLyogR0xfVEVYVFVSRV9SRVNJREVOVCAqLworICAgeyAzNDQ1NCwgMHgwMDAwMEJBNSB9LCAvKiBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICovCisgICB7IDM0NDc3LCAweDAwMDA4MDY1IH0sIC8qIEdMX1RFWFRVUkVfVE9PX0xBUkdFX0VYVCAqLworICAgeyAzNDUwMiwgMHgwMDAwODg4RiB9LCAvKiBHTF9URVhUVVJFX1VOU0lHTkVEX1JFTUFQX01PREVfTlYgKi8KKyAgIHsgMzQ1MzYsIDB4MDAwMDEwMDAgfSwgLyogR0xfVEVYVFVSRV9XSURUSCAqLworICAgeyAzNDU1MywgMHgwMDAwODA3MiB9LCAvKiBHTF9URVhUVVJFX1dSQVBfUiAqLworICAgeyAzNDU3MSwgMHgwMDAwMjgwMiB9LCAvKiBHTF9URVhUVVJFX1dSQVBfUyAqLworICAgeyAzNDU4OSwgMHgwMDAwMjgwMyB9LCAvKiBHTF9URVhUVVJFX1dSQVBfVCAqLworICAgeyAzNDYwNywgMHgwMDAwODhCRiB9LCAvKiBHTF9USU1FX0VMQVBTRURfRVhUICovCisgICB7IDM0NjI3LCAweDAwMDA4NjQ4IH0sIC8qIEdMX1RSQUNLX01BVFJJWF9OViAqLworICAgeyAzNDY0NiwgMHgwMDAwODY0OSB9LCAvKiBHTF9UUkFDS19NQVRSSVhfVFJBTlNGT1JNX05WICovCisgICB7IDM0Njc1LCAweDAwMDAxMDAwIH0sIC8qIEdMX1RSQU5TRk9STV9CSVQgKi8KKyAgIHsgMzQ2OTIsIDB4MDAwMDg0RTYgfSwgLyogR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWCAqLworICAgeyAzNDcxOCwgMHgwMDAwODRFNiB9LCAvKiBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYX0FSQiAqLworICAgeyAzNDc0OCwgMHgwMDAwODhCNyB9LCAvKiBHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCICovCisgICB7IDM0NzgwLCAweDAwMDA4NEUzIH0sIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYICovCisgICB7IDM0ODEwLCAweDAwMDA4NEUzIH0sIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYX0FSQiAqLworICAgeyAzNDg0NCwgMHgwMDAwODYyQyB9LCAvKiBHTF9UUkFOU1BPU0VfTlYgKi8KKyAgIHsgMzQ4NjAsIDB4MDAwMDg0RTQgfSwgLyogR0xfVFJBTlNQT1NFX1BST0pFQ1RJT05fTUFUUklYICovCisgICB7IDM0ODkxLCAweDAwMDA4NEU0IH0sIC8qIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWF9BUkIgKi8KKyAgIHsgMzQ5MjYsIDB4MDAwMDg0RTUgfSwgLyogR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICovCisgICB7IDM0OTU0LCAweDAwMDA4NEU1IH0sIC8qIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWF9BUkIgKi8KKyAgIHsgMzQ5ODYsIDB4MDAwMDAwMDQgfSwgLyogR0xfVFJJQU5HTEVTICovCisgICB7IDM0OTk5LCAweDAwMDAwMDA2IH0sIC8qIEdMX1RSSUFOR0xFX0ZBTiAqLworICAgeyAzNTAxNSwgMHgwMDAwODYxNSB9LCAvKiBHTF9UUklBTkdMRV9NRVNIX1NVTiAqLworICAgeyAzNTAzNiwgMHgwMDAwMDAwNSB9LCAvKiBHTF9UUklBTkdMRV9TVFJJUCAqLworICAgeyAzNTA1NCwgMHgwMDAwMDAwMSB9LCAvKiBHTF9UUlVFICovCisgICB7IDM1MDYyLCAweDAwMDAwQ0Y1IH0sIC8qIEdMX1VOUEFDS19BTElHTk1FTlQgKi8KKyAgIHsgMzUwODIsIDB4MDAwMDgwNkUgfSwgLyogR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAqLworICAgeyAzNTEwNSwgMHgwMDAwMENGMSB9LCAvKiBHTF9VTlBBQ0tfTFNCX0ZJUlNUICovCisgICB7IDM1MTI1LCAweDAwMDAwQ0YyIH0sIC8qIEdMX1VOUEFDS19ST1dfTEVOR1RIICovCisgICB7IDM1MTQ2LCAweDAwMDA4MDZEIH0sIC8qIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAqLworICAgeyAzNTE2OCwgMHgwMDAwMENGNCB9LCAvKiBHTF9VTlBBQ0tfU0tJUF9QSVhFTFMgKi8KKyAgIHsgMzUxOTAsIDB4MDAwMDBDRjMgfSwgLyogR0xfVU5QQUNLX1NLSVBfUk9XUyAqLworICAgeyAzNTIxMCwgMHgwMDAwMENGMCB9LCAvKiBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLworICAgeyAzNTIzMSwgMHgwMDAwMTQwMSB9LCAvKiBHTF9VTlNJR05FRF9CWVRFICovCisgICB7IDM1MjQ4LCAweDAwMDA4MzYyIH0sIC8qIEdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWICovCisgICB7IDM1Mjc1LCAweDAwMDA4MDMyIH0sIC8qIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgKi8KKyAgIHsgMzUyOTgsIDB4MDAwMDE0MDUgfSwgLyogR0xfVU5TSUdORURfSU5UICovCisgICB7IDM1MzE0LCAweDAwMDA4MDM2IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yICovCisgICB7IDM1MzQxLCAweDAwMDA4NEZBIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICovCisgICB7IDM1MzY1LCAweDAwMDA4MzY4IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFViAqLworICAgeyAzNTM5NiwgMHgwMDAwODAzNSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCAqLworICAgeyAzNTQyMCwgMHgwMDAwODM2NyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgKi8KKyAgIHsgMzU0NDgsIDB4MDAwMDE0MDMgfSwgLyogR0xfVU5TSUdORURfU0hPUlQgKi8KKyAgIHsgMzU0NjYsIDB4MDAwMDgzNjYgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYgKi8KKyAgIHsgMzU0OTYsIDB4MDAwMDgwMzMgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAqLworICAgeyAzNTUyMiwgMHgwMDAwODM2NSB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViAqLworICAgeyAzNTU1MiwgMHgwMDAwODAzNCB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICovCisgICB7IDM1NTc4LCAweDAwMDA4MzYzIH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICovCisgICB7IDM1NjAyLCAweDAwMDA4MzY0IH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAqLworICAgeyAzNTYzMCwgMHgwMDAwODVCQSB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgKi8KKyAgIHsgMzU2NTgsIDB4MDAwMDg1QkEgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgKi8KKyAgIHsgMzU2ODUsIDB4MDAwMDg1QkIgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSAqLworICAgeyAzNTcxNywgMHgwMDAwODVCQiB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX01FU0EgKi8KKyAgIHsgMzU3NDgsIDB4MDAwMDhDQTIgfSwgLyogR0xfVVBQRVJfTEVGVCAqLworICAgeyAzNTc2MiwgMHgwMDAwMkEyMCB9LCAvKiBHTF9WMkYgKi8KKyAgIHsgMzU3NjksIDB4MDAwMDJBMjEgfSwgLyogR0xfVjNGICovCisgICB7IDM1Nzc2LCAweDAwMDA4QjgzIH0sIC8qIEdMX1ZBTElEQVRFX1NUQVRVUyAqLworICAgeyAzNTc5NSwgMHgwMDAwMUYwMCB9LCAvKiBHTF9WRU5ET1IgKi8KKyAgIHsgMzU4MDUsIDB4MDAwMDFGMDIgfSwgLyogR0xfVkVSU0lPTiAqLworICAgeyAzNTgxNiwgMHgwMDAwODA3NCB9LCAvKiBHTF9WRVJURVhfQVJSQVkgKi8KKyAgIHsgMzU4MzIsIDB4MDAwMDg1QjUgfSwgLyogR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfQVBQTEUgKi8KKyAgIHsgMzU4NjIsIDB4MDAwMDg4OTYgfSwgLyogR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDM1ODkzLCAweDAwMDA4ODk2IH0sIC8qIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgKi8KKyAgIHsgMzU5MjgsIDB4MDAwMDgwOEUgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KKyAgIHsgMzU5NTIsIDB4MDAwMDgwN0EgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1NJWkUgKi8KKyAgIHsgMzU5NzMsIDB4MDAwMDgwN0MgfSwgLyogR0xfVkVSVEVYX0FSUkFZX1NUUklERSAqLworICAgeyAzNTk5NiwgMHgwMDAwODA3QiB9LCAvKiBHTF9WRVJURVhfQVJSQVlfVFlQRSAqLworICAgeyAzNjAxNywgMHgwMDAwODY1MCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMF9OViAqLworICAgeyAzNjA0NCwgMHgwMDAwODY1QSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgKi8KKyAgIHsgMzYwNzIsIDB4MDAwMDg2NUIgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTExX05WICovCisgICB7IDM2MTAwLCAweDAwMDA4NjVDIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAqLworICAgeyAzNjEyOCwgMHgwMDAwODY1RCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgKi8KKyAgIHsgMzYxNTYsIDB4MDAwMDg2NUUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE0X05WICovCisgICB7IDM2MTg0LCAweDAwMDA4NjVGIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAqLworICAgeyAzNjIxMiwgMHgwMDAwODY1MSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAqLworICAgeyAzNjIzOSwgMHgwMDAwODY1MiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAqLworICAgeyAzNjI2NiwgMHgwMDAwODY1MyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZM19OViAqLworICAgeyAzNjI5MywgMHgwMDAwODY1NCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAqLworICAgeyAzNjMyMCwgMHgwMDAwODY1NSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAqLworICAgeyAzNjM0NywgMHgwMDAwODY1NiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNl9OViAqLworICAgeyAzNjM3NCwgMHgwMDAwODY1NyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAqLworICAgeyAzNjQwMSwgMHgwMDAwODY1OCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAqLworICAgeyAzNjQyOCwgMHgwMDAwODY1OSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOV9OViAqLworICAgeyAzNjQ1NSwgMHgwMDAwODg5RiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDM2NDkzLCAweDAwMDA4ODlGIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICovCisgICB7IDM2NTM1LCAweDAwMDA4NjIyIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAqLworICAgeyAzNjU2NiwgMHgwMDAwODYyMiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRURfQVJCICovCisgICB7IDM2NjAxLCAweDAwMDA4ODZBIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAqLworICAgeyAzNjYzNSwgMHgwMDAwODg2QSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURfQVJCICovCisgICB7IDM2NjczLCAweDAwMDA4NjQ1IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAqLworICAgeyAzNjcwNCwgMHgwMDAwODY0NSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJfQVJCICovCisgICB7IDM2NzM5LCAweDAwMDA4NjIzIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAqLworICAgeyAzNjc2NywgMHgwMDAwODYyMyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkVfQVJCICovCisgICB7IDM2Nzk5LCAweDAwMDA4NjI0IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICovCisgICB7IDM2ODI5LCAweDAwMDA4NjI0IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFX0FSQiAqLworICAgeyAzNjg2MywgMHgwMDAwODYyNSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgKi8KKyAgIHsgMzY4OTEsIDB4MDAwMDg2MjUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFX0FSQiAqLworICAgeyAzNjkyMywgMHgwMDAwODZBNyB9LCAvKiBHTF9WRVJURVhfQkxFTkRfQVJCICovCisgICB7IDM2OTQzLCAweDAwMDA4NjIwIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAqLworICAgeyAzNjk2NSwgMHgwMDAwODY0QSB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9CSU5ESU5HX05WICovCisgICB7IDM2OTk0LCAweDAwMDA4NjIwIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX05WICovCisgICB7IDM3MDE1LCAweDAwMDA4NjQyIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUgKi8KKyAgIHsgMzcwNDQsIDB4MDAwMDg2NDIgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIgKi8KKyAgIHsgMzcwNzcsIDB4MDAwMDg2NDIgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9OViAqLworICAgeyAzNzEwOSwgMHgwMDAwODY0MyB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAqLworICAgeyAzNzEzNiwgMHgwMDAwODY0MyB9LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERV9BUkIgKi8KKyAgIHsgMzcxNjcsIDB4MDAwMDg2NDMgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfTlYgKi8KKyAgIHsgMzcxOTcsIDB4MDAwMDhCMzEgfSwgLyogR0xfVkVSVEVYX1NIQURFUiAqLworICAgeyAzNzIxNCwgMHgwMDAwOEIzMSB9LCAvKiBHTF9WRVJURVhfU0hBREVSX0FSQiAqLworICAgeyAzNzIzNSwgMHgwMDAwODYyMSB9LCAvKiBHTF9WRVJURVhfU1RBVEVfUFJPR1JBTV9OViAqLworICAgeyAzNzI2MiwgMHgwMDAwMEJBMiB9LCAvKiBHTF9WSUVXUE9SVCAqLworICAgeyAzNzI3NCwgMHgwMDAwMDgwMCB9LCAvKiBHTF9WSUVXUE9SVF9CSVQgKi8KKyAgIHsgMzcyOTAsIDB4MDAwMDg2QUQgfSwgLyogR0xfV0VJR0hUX0FSUkFZX0FSQiAqLworICAgeyAzNzMxMCwgMHgwMDAwODg5RSB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMzczNDEsIDB4MDAwMDg4OUUgfSwgLyogR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAqLworICAgeyAzNzM3NiwgMHgwMDAwODZBQyB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9BUkIgKi8KKyAgIHsgMzc0MDQsIDB4MDAwMDg2QUIgfSwgLyogR0xfV0VJR0hUX0FSUkFZX1NJWkVfQVJCICovCisgICB7IDM3NDI5LCAweDAwMDA4NkFBIH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICovCisgICB7IDM3NDU2LCAweDAwMDA4NkE5IH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9UWVBFX0FSQiAqLworICAgeyAzNzQ4MSwgMHgwMDAwODZBNiB9LCAvKiBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAqLworICAgeyAzNzUwNSwgMHgwMDAwODFENCB9LCAvKiBHTF9XUkFQX0JPUkRFUl9TVU4gKi8KKyAgIHsgMzc1MjQsIDB4MDAwMDg4QjkgfSwgLyogR0xfV1JJVEVfT05MWSAqLworICAgeyAzNzUzOCwgMHgwMDAwODhCOSB9LCAvKiBHTF9XUklURV9PTkxZX0FSQiAqLworICAgeyAzNzU1NiwgMHgwMDAwMTUwNiB9LCAvKiBHTF9YT1IgKi8KKyAgIHsgMzc1NjMsIDB4MDAwMDg1QjkgfSwgLyogR0xfWUNCQ1JfNDIyX0FQUExFICovCisgICB7IDM3NTgyLCAweDAwMDA4NzU3IH0sIC8qIEdMX1lDQkNSX01FU0EgKi8KKyAgIHsgMzc1OTYsIDB4MDAwMDAwMDAgfSwgLyogR0xfWkVSTyAqLworICAgeyAzNzYwNCwgMHgwMDAwMEQxNiB9LCAvKiBHTF9aT09NX1ggKi8KKyAgIHsgMzc2MTQsIDB4MDAwMDBEMTcgfSwgLyogR0xfWk9PTV9ZICovCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgcmVkdWNlZF9lbnVtc1sxMjg0XSA9CiB7Ci0gICAgICAgNDM2LCAvKiBHTF9GQUxTRSAqLwotICAgICAgIDY0NSwgLyogR0xfTElORVMgKi8KLSAgICAgICA2NDcsIC8qIEdMX0xJTkVfTE9PUCAqLwotICAgICAgIDY1NCwgLyogR0xfTElORV9TVFJJUCAqLwotICAgICAgMTY0MSwgLyogR0xfVFJJQU5HTEVTICovCi0gICAgICAxNjQ0LCAvKiBHTF9UUklBTkdMRV9TVFJJUCAqLwotICAgICAgMTY0MiwgLyogR0xfVFJJQU5HTEVfRkFOICovCi0gICAgICAxMjExLCAvKiBHTF9RVUFEUyAqLwotICAgICAgMTIxMywgLyogR0xfUVVBRF9TVFJJUCAqLwotICAgICAgMTA5OSwgLyogR0xfUE9MWUdPTiAqLwotICAgICAgMTExMSwgLyogR0xfUE9MWUdPTl9TVElQUExFX0JJVCAqLwotICAgICAgMTA2NCwgLyogR0xfUElYRUxfTU9ERV9CSVQgKi8KLSAgICAgICA2MzIsIC8qIEdMX0xJR0hUSU5HX0JJVCAqLwotICAgICAgIDQ1OCwgLyogR0xfRk9HX0JJVCAqLworICAgICAgIDQzNCwgLyogR0xfRkFMU0UgKi8KKyAgICAgICA2NDMsIC8qIEdMX0xJTkVTICovCisgICAgICAgNjQ1LCAvKiBHTF9MSU5FX0xPT1AgKi8KKyAgICAgICA2NTIsIC8qIEdMX0xJTkVfU1RSSVAgKi8KKyAgICAgIDE2MzksIC8qIEdMX1RSSUFOR0xFUyAqLworICAgICAgMTY0MiwgLyogR0xfVFJJQU5HTEVfU1RSSVAgKi8KKyAgICAgIDE2NDAsIC8qIEdMX1RSSUFOR0xFX0ZBTiAqLworICAgICAgMTIwOSwgLyogR0xfUVVBRFMgKi8KKyAgICAgIDEyMTEsIC8qIEdMX1FVQURfU1RSSVAgKi8KKyAgICAgIDEwOTcsIC8qIEdMX1BPTFlHT04gKi8KKyAgICAgIDExMDksIC8qIEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgKi8KKyAgICAgIDEwNjIsIC8qIEdMX1BJWEVMX01PREVfQklUICovCisgICAgICAgNjMwLCAvKiBHTF9MSUdIVElOR19CSVQgKi8KKyAgICAgICA0NTYsIC8qIEdMX0ZPR19CSVQgKi8KICAgICAgICAgIDgsIC8qIEdMX0FDQ1VNICovCi0gICAgICAgNjY0LCAvKiBHTF9MT0FEICovCi0gICAgICAxMjUzLCAvKiBHTF9SRVRVUk4gKi8KLSAgICAgICA5MzcsIC8qIEdMX01VTFQgKi8KKyAgICAgICA2NjIsIC8qIEdMX0xPQUQgKi8KKyAgICAgIDEyNTEsIC8qIEdMX1JFVFVSTiAqLworICAgICAgIDkzNSwgLyogR0xfTVVMVCAqLwogICAgICAgICAyMywgLyogR0xfQUREICovCi0gICAgICAgOTUzLCAvKiBHTF9ORVZFUiAqLwotICAgICAgIDYyMiwgLyogR0xfTEVTUyAqLwotICAgICAgIDQyNiwgLyogR0xfRVFVQUwgKi8KLSAgICAgICA2MjEsIC8qIEdMX0xFUVVBTCAqLwotICAgICAgIDU0NywgLyogR0xfR1JFQVRFUiAqLwotICAgICAgIDk2OCwgLyogR0xfTk9URVFVQUwgKi8KLSAgICAgICA1MjIsIC8qIEdMX0dFUVVBTCAqLworICAgICAgIDk1MSwgLyogR0xfTkVWRVIgKi8KKyAgICAgICA2MjAsIC8qIEdMX0xFU1MgKi8KKyAgICAgICA0MjQsIC8qIEdMX0VRVUFMICovCisgICAgICAgNjE5LCAvKiBHTF9MRVFVQUwgKi8KKyAgICAgICA1NDUsIC8qIEdMX0dSRUFURVIgKi8KKyAgICAgICA5NjYsIC8qIEdMX05PVEVRVUFMICovCisgICAgICAgNTIwLCAvKiBHTF9HRVFVQUwgKi8KICAgICAgICAgNDYsIC8qIEdMX0FMV0FZUyAqLwotICAgICAgMTM4NiwgLyogR0xfU1JDX0NPTE9SICovCi0gICAgICAgOTk3LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICovCi0gICAgICAxMzg0LCAvKiBHTF9TUkNfQUxQSEEgKi8KLSAgICAgICA5OTYsIC8qIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KLSAgICAgICA0MDYsIC8qIEdMX0RTVF9BTFBIQSAqLwotICAgICAgIDk5NCwgLyogR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLwotICAgICAgIDQwNywgLyogR0xfRFNUX0NPTE9SICovCi0gICAgICAgOTk1LCAvKiBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICovCi0gICAgICAxMzg1LCAvKiBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgKi8KLSAgICAgICA1MTAsIC8qIEdMX0ZST05UX0xFRlQgKi8KLSAgICAgICA1MTEsIC8qIEdMX0ZST05UX1JJR0hUICovCi0gICAgICAgIDY5LCAvKiBHTF9CQUNLX0xFRlQgKi8KLSAgICAgICAgNzAsIC8qIEdMX0JBQ0tfUklHSFQgKi8KLSAgICAgICA1MDcsIC8qIEdMX0ZST05UICovCi0gICAgICAgIDY4LCAvKiBHTF9CQUNLICovCi0gICAgICAgNjIwLCAvKiBHTF9MRUZUICovCi0gICAgICAxMjkzLCAvKiBHTF9SSUdIVCAqLwotICAgICAgIDUwOCwgLyogR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLSAgICAgICAgNjMsIC8qIEdMX0FVWDAgKi8KLSAgICAgICAgNjQsIC8qIEdMX0FVWDEgKi8KLSAgICAgICAgNjUsIC8qIEdMX0FVWDIgKi8KLSAgICAgICAgNjYsIC8qIEdMX0FVWDMgKi8KLSAgICAgICA2MTIsIC8qIEdMX0lOVkFMSURfRU5VTSAqLwotICAgICAgIDYxNSwgLyogR0xfSU5WQUxJRF9WQUxVRSAqLwotICAgICAgIDYxNCwgLyogR0xfSU5WQUxJRF9PUEVSQVRJT04gKi8KLSAgICAgIDEzODcsIC8qIEdMX1NUQUNLX09WRVJGTE9XICovCi0gICAgICAxMzg4LCAvKiBHTF9TVEFDS19VTkRFUkZMT1cgKi8KLSAgICAgIDEwMjIsIC8qIEdMX09VVF9PRl9NRU1PUlkgKi8KLSAgICAgICA2MTMsIC8qIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAqLworICAgICAgMTM4NCwgLyogR0xfU1JDX0NPTE9SICovCisgICAgICAgOTk1LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICovCisgICAgICAxMzgyLCAvKiBHTF9TUkNfQUxQSEEgKi8KKyAgICAgICA5OTQsIC8qIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKyAgICAgICA0MDUsIC8qIEdMX0RTVF9BTFBIQSAqLworICAgICAgIDk5MiwgLyogR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLworICAgICAgIDQwNiwgLyogR0xfRFNUX0NPTE9SICovCisgICAgICAgOTkzLCAvKiBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICovCisgICAgICAxMzgzLCAvKiBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgKi8KKyAgICAgICA1MDgsIC8qIEdMX0ZST05UX0xFRlQgKi8KKyAgICAgICA1MDksIC8qIEdMX0ZST05UX1JJR0hUICovCisgICAgICAgIDY4LCAvKiBHTF9CQUNLX0xFRlQgKi8KKyAgICAgICAgNjksIC8qIEdMX0JBQ0tfUklHSFQgKi8KKyAgICAgICA1MDUsIC8qIEdMX0ZST05UICovCisgICAgICAgIDY3LCAvKiBHTF9CQUNLICovCisgICAgICAgNjE4LCAvKiBHTF9MRUZUICovCisgICAgICAxMjkxLCAvKiBHTF9SSUdIVCAqLworICAgICAgIDUwNiwgLyogR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKyAgICAgICAgNjIsIC8qIEdMX0FVWDAgKi8KKyAgICAgICAgNjMsIC8qIEdMX0FVWDEgKi8KKyAgICAgICAgNjQsIC8qIEdMX0FVWDIgKi8KKyAgICAgICAgNjUsIC8qIEdMX0FVWDMgKi8KKyAgICAgICA2MTAsIC8qIEdMX0lOVkFMSURfRU5VTSAqLworICAgICAgIDYxMywgLyogR0xfSU5WQUxJRF9WQUxVRSAqLworICAgICAgIDYxMiwgLyogR0xfSU5WQUxJRF9PUEVSQVRJT04gKi8KKyAgICAgIDEzODUsIC8qIEdMX1NUQUNLX09WRVJGTE9XICovCisgICAgICAxMzg2LCAvKiBHTF9TVEFDS19VTkRFUkZMT1cgKi8KKyAgICAgIDEwMjAsIC8qIEdMX09VVF9PRl9NRU1PUlkgKi8KKyAgICAgICA2MTEsIC8qIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAqLwogICAgICAgICAgMCwgLyogR0xfMkQgKi8KICAgICAgICAgIDIsIC8qIEdMXzNEICovCiAgICAgICAgICAzLCAvKiBHTF8zRF9DT0xPUiAqLwogICAgICAgICAgNCwgLyogR0xfM0RfQ09MT1JfVEVYVFVSRSAqLwogICAgICAgICAgNiwgLyogR0xfNERfQ09MT1JfVEVYVFVSRSAqLwotICAgICAgMTA0MiwgLyogR0xfUEFTU19USFJPVUdIX1RPS0VOICovCi0gICAgICAxMDk4LCAvKiBHTF9QT0lOVF9UT0tFTiAqLwotICAgICAgIDY1NSwgLyogR0xfTElORV9UT0tFTiAqLwotICAgICAgMTExMiwgLyogR0xfUE9MWUdPTl9UT0tFTiAqLwotICAgICAgICA3NCwgLyogR0xfQklUTUFQX1RPS0VOICovCi0gICAgICAgNDA1LCAvKiBHTF9EUkFXX1BJWEVMX1RPS0VOICovCi0gICAgICAgMjcxLCAvKiBHTF9DT1BZX1BJWEVMX1RPS0VOICovCi0gICAgICAgNjQ4LCAvKiBHTF9MSU5FX1JFU0VUX1RPS0VOICovCi0gICAgICAgNDI5LCAvKiBHTF9FWFAgKi8KLSAgICAgICA0MzAsIC8qIEdMX0VYUDIgKi8KLSAgICAgICAzMDQsIC8qIEdMX0NXICovCi0gICAgICAgMTE2LCAvKiBHTF9DQ1cgKi8KLSAgICAgICAxMzcsIC8qIEdMX0NPRUZGICovCi0gICAgICAxMDE5LCAvKiBHTF9PUkRFUiAqLwotICAgICAgIDM0NCwgLyogR0xfRE9NQUlOICovCi0gICAgICAgMjc5LCAvKiBHTF9DVVJSRU5UX0NPTE9SICovCi0gICAgICAgMjgyLCAvKiBHTF9DVVJSRU5UX0lOREVYICovCi0gICAgICAgMjg4LCAvKiBHTF9DVVJSRU5UX05PUk1BTCAqLwotICAgICAgIDMwMCwgLyogR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAqLwotICAgICAgIDI5MywgLyogR0xfQ1VSUkVOVF9SQVNURVJfQ09MT1IgKi8KLSAgICAgICAyOTUsIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0lOREVYICovCi0gICAgICAgMjk4LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyAqLwotICAgICAgIDI5NiwgLyogR0xfQ1VSUkVOVF9SQVNURVJfUE9TSVRJT04gKi8KLSAgICAgICAyOTcsIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OX1ZBTElEICovCi0gICAgICAgMjk0LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSAqLwotICAgICAgMTA5MSwgLyogR0xfUE9JTlRfU01PT1RIICovCi0gICAgICAxMDgwLCAvKiBHTF9QT0lOVF9TSVpFICovCi0gICAgICAxMDkwLCAvKiBHTF9QT0lOVF9TSVpFX1JBTkdFICovCi0gICAgICAxMDgxLCAvKiBHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCi0gICAgICAgNjQ5LCAvKiBHTF9MSU5FX1NNT09USCAqLwotICAgICAgIDY1NiwgLyogR0xfTElORV9XSURUSCAqLwotICAgICAgIDY1OCwgLyogR0xfTElORV9XSURUSF9SQU5HRSAqLwotICAgICAgIDY1NywgLyogR0xfTElORV9XSURUSF9HUkFOVUxBUklUWSAqLwotICAgICAgIDY1MSwgLyogR0xfTElORV9TVElQUExFICovCi0gICAgICAgNjUyLCAvKiBHTF9MSU5FX1NUSVBQTEVfUEFUVEVSTiAqLwotICAgICAgIDY1MywgLyogR0xfTElORV9TVElQUExFX1JFUEVBVCAqLwotICAgICAgIDY2MywgLyogR0xfTElTVF9NT0RFICovCi0gICAgICAgODIyLCAvKiBHTF9NQVhfTElTVF9ORVNUSU5HICovCi0gICAgICAgNjYwLCAvKiBHTF9MSVNUX0JBU0UgKi8KLSAgICAgICA2NjIsIC8qIEdMX0xJU1RfSU5ERVggKi8KLSAgICAgIDExMDEsIC8qIEdMX1BPTFlHT05fTU9ERSAqLwotICAgICAgMTEwOCwgLyogR0xfUE9MWUdPTl9TTU9PVEggKi8KLSAgICAgIDExMTAsIC8qIEdMX1BPTFlHT05fU1RJUFBMRSAqLwotICAgICAgIDQxNCwgLyogR0xfRURHRV9GTEFHICovCi0gICAgICAgMjcyLCAvKiBHTF9DVUxMX0ZBQ0UgKi8KLSAgICAgICAyNzMsIC8qIEdMX0NVTExfRkFDRV9NT0RFICovCi0gICAgICAgNTA5LCAvKiBHTF9GUk9OVF9GQUNFICovCi0gICAgICAgNjMxLCAvKiBHTF9MSUdIVElORyAqLwotICAgICAgIDYzNiwgLyogR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0gICAgICAgNjM3LCAvKiBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLwotICAgICAgIDYzMywgLyogR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLwotICAgICAgMTMzOSwgLyogR0xfU0hBREVfTU9ERUwgKi8KLSAgICAgICAxNjgsIC8qIEdMX0NPTE9SX01BVEVSSUFMX0ZBQ0UgKi8KLSAgICAgICAxNjksIC8qIEdMX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUiAqLwotICAgICAgIDE2NywgLyogR0xfQ09MT1JfTUFURVJJQUwgKi8KLSAgICAgICA0NTcsIC8qIEdMX0ZPRyAqLwotICAgICAgIDQ3OSwgLyogR0xfRk9HX0lOREVYICovCi0gICAgICAgNDc1LCAvKiBHTF9GT0dfREVOU0lUWSAqLwotICAgICAgIDQ4MywgLyogR0xfRk9HX1NUQVJUICovCi0gICAgICAgNDc3LCAvKiBHTF9GT0dfRU5EICovCi0gICAgICAgNDgwLCAvKiBHTF9GT0dfTU9ERSAqLwotICAgICAgIDQ1OSwgLyogR0xfRk9HX0NPTE9SICovCi0gICAgICAgMzMzLCAvKiBHTF9ERVBUSF9SQU5HRSAqLwotICAgICAgIDMzOCwgLyogR0xfREVQVEhfVEVTVCAqLwotICAgICAgIDM0MSwgLyogR0xfREVQVEhfV1JJVEVNQVNLICovCi0gICAgICAgMzIxLCAvKiBHTF9ERVBUSF9DTEVBUl9WQUxVRSAqLwotICAgICAgIDMzMiwgLyogR0xfREVQVEhfRlVOQyAqLworICAgICAgMTA0MCwgLyogR0xfUEFTU19USFJPVUdIX1RPS0VOICovCisgICAgICAxMDk2LCAvKiBHTF9QT0lOVF9UT0tFTiAqLworICAgICAgIDY1MywgLyogR0xfTElORV9UT0tFTiAqLworICAgICAgMTExMCwgLyogR0xfUE9MWUdPTl9UT0tFTiAqLworICAgICAgICA3MywgLyogR0xfQklUTUFQX1RPS0VOICovCisgICAgICAgNDA0LCAvKiBHTF9EUkFXX1BJWEVMX1RPS0VOICovCisgICAgICAgMjcwLCAvKiBHTF9DT1BZX1BJWEVMX1RPS0VOICovCisgICAgICAgNjQ2LCAvKiBHTF9MSU5FX1JFU0VUX1RPS0VOICovCisgICAgICAgNDI3LCAvKiBHTF9FWFAgKi8KKyAgICAgICA0MjgsIC8qIEdMX0VYUDIgKi8KKyAgICAgICAzMDMsIC8qIEdMX0NXICovCisgICAgICAgMTE1LCAvKiBHTF9DQ1cgKi8KKyAgICAgICAxMzYsIC8qIEdMX0NPRUZGICovCisgICAgICAxMDE3LCAvKiBHTF9PUkRFUiAqLworICAgICAgIDM0MywgLyogR0xfRE9NQUlOICovCisgICAgICAgMjc4LCAvKiBHTF9DVVJSRU5UX0NPTE9SICovCisgICAgICAgMjgxLCAvKiBHTF9DVVJSRU5UX0lOREVYICovCisgICAgICAgMjg3LCAvKiBHTF9DVVJSRU5UX05PUk1BTCAqLworICAgICAgIDI5OSwgLyogR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAqLworICAgICAgIDI5MiwgLyogR0xfQ1VSUkVOVF9SQVNURVJfQ09MT1IgKi8KKyAgICAgICAyOTQsIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0lOREVYICovCisgICAgICAgMjk3LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyAqLworICAgICAgIDI5NSwgLyogR0xfQ1VSUkVOVF9SQVNURVJfUE9TSVRJT04gKi8KKyAgICAgICAyOTYsIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OX1ZBTElEICovCisgICAgICAgMjkzLCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSAqLworICAgICAgMTA4OSwgLyogR0xfUE9JTlRfU01PT1RIICovCisgICAgICAxMDc4LCAvKiBHTF9QT0lOVF9TSVpFICovCisgICAgICAxMDg4LCAvKiBHTF9QT0lOVF9TSVpFX1JBTkdFICovCisgICAgICAxMDc5LCAvKiBHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICovCisgICAgICAgNjQ3LCAvKiBHTF9MSU5FX1NNT09USCAqLworICAgICAgIDY1NCwgLyogR0xfTElORV9XSURUSCAqLworICAgICAgIDY1NiwgLyogR0xfTElORV9XSURUSF9SQU5HRSAqLworICAgICAgIDY1NSwgLyogR0xfTElORV9XSURUSF9HUkFOVUxBUklUWSAqLworICAgICAgIDY0OSwgLyogR0xfTElORV9TVElQUExFICovCisgICAgICAgNjUwLCAvKiBHTF9MSU5FX1NUSVBQTEVfUEFUVEVSTiAqLworICAgICAgIDY1MSwgLyogR0xfTElORV9TVElQUExFX1JFUEVBVCAqLworICAgICAgIDY2MSwgLyogR0xfTElTVF9NT0RFICovCisgICAgICAgODIwLCAvKiBHTF9NQVhfTElTVF9ORVNUSU5HICovCisgICAgICAgNjU4LCAvKiBHTF9MSVNUX0JBU0UgKi8KKyAgICAgICA2NjAsIC8qIEdMX0xJU1RfSU5ERVggKi8KKyAgICAgIDEwOTksIC8qIEdMX1BPTFlHT05fTU9ERSAqLworICAgICAgMTEwNiwgLyogR0xfUE9MWUdPTl9TTU9PVEggKi8KKyAgICAgIDExMDgsIC8qIEdMX1BPTFlHT05fU1RJUFBMRSAqLworICAgICAgIDQxMywgLyogR0xfRURHRV9GTEFHICovCisgICAgICAgMjcxLCAvKiBHTF9DVUxMX0ZBQ0UgKi8KKyAgICAgICAyNzIsIC8qIEdMX0NVTExfRkFDRV9NT0RFICovCisgICAgICAgNTA3LCAvKiBHTF9GUk9OVF9GQUNFICovCisgICAgICAgNjI5LCAvKiBHTF9MSUdIVElORyAqLworICAgICAgIDYzNCwgLyogR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCisgICAgICAgNjM1LCAvKiBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLworICAgICAgIDYzMSwgLyogR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLworICAgICAgMTMzNywgLyogR0xfU0hBREVfTU9ERUwgKi8KKyAgICAgICAxNjcsIC8qIEdMX0NPTE9SX01BVEVSSUFMX0ZBQ0UgKi8KKyAgICAgICAxNjgsIC8qIEdMX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUiAqLworICAgICAgIDE2NiwgLyogR0xfQ09MT1JfTUFURVJJQUwgKi8KKyAgICAgICA0NTUsIC8qIEdMX0ZPRyAqLworICAgICAgIDQ3NywgLyogR0xfRk9HX0lOREVYICovCisgICAgICAgNDczLCAvKiBHTF9GT0dfREVOU0lUWSAqLworICAgICAgIDQ4MSwgLyogR0xfRk9HX1NUQVJUICovCisgICAgICAgNDc1LCAvKiBHTF9GT0dfRU5EICovCisgICAgICAgNDc4LCAvKiBHTF9GT0dfTU9ERSAqLworICAgICAgIDQ1NywgLyogR0xfRk9HX0NPTE9SICovCisgICAgICAgMzMyLCAvKiBHTF9ERVBUSF9SQU5HRSAqLworICAgICAgIDMzNywgLyogR0xfREVQVEhfVEVTVCAqLworICAgICAgIDM0MCwgLyogR0xfREVQVEhfV1JJVEVNQVNLICovCisgICAgICAgMzIwLCAvKiBHTF9ERVBUSF9DTEVBUl9WQUxVRSAqLworICAgICAgIDMzMSwgLyogR0xfREVQVEhfRlVOQyAqLwogICAgICAgICAxMiwgLyogR0xfQUNDVU1fQ0xFQVJfVkFMVUUgKi8KLSAgICAgIDE0MjIsIC8qIEdMX1NURU5DSUxfVEVTVCAqLwotICAgICAgMTQxMCwgLyogR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAqLwotICAgICAgMTQxMiwgLyogR0xfU1RFTkNJTF9GVU5DICovCi0gICAgICAxNDI0LCAvKiBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgKi8KLSAgICAgIDE0MTEsIC8qIEdMX1NURU5DSUxfRkFJTCAqLwotICAgICAgMTQxOSwgLyogR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgKi8KLSAgICAgIDE0MjAsIC8qIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTICovCi0gICAgICAxNDIxLCAvKiBHTF9TVEVOQ0lMX1JFRiAqLwotICAgICAgMTQyNSwgLyogR0xfU1RFTkNJTF9XUklURU1BU0sgKi8KLSAgICAgICA3OTEsIC8qIEdMX01BVFJJWF9NT0RFICovCi0gICAgICAgOTU4LCAvKiBHTF9OT1JNQUxJWkUgKi8KLSAgICAgIDE3MzEsIC8qIEdMX1ZJRVdQT1JUICovCi0gICAgICAgOTMyLCAvKiBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggKi8KLSAgICAgIDExOTEsIC8qIEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggKi8KLSAgICAgIDE2MjAsIC8qIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggKi8KLSAgICAgICA5MzAsIC8qIEdMX01PREVMVklFV19NQVRSSVggKi8KLSAgICAgIDExOTAsIC8qIEdMX1BST0pFQ1RJT05fTUFUUklYICovCi0gICAgICAxNjA1LCAvKiBHTF9URVhUVVJFX01BVFJJWCAqLwotICAgICAgICA2MSwgLyogR0xfQVRUUklCX1NUQUNLX0RFUFRIICovCi0gICAgICAgMTI3LCAvKiBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIICovCisgICAgICAxNDIwLCAvKiBHTF9TVEVOQ0lMX1RFU1QgKi8KKyAgICAgIDE0MDgsIC8qIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgKi8KKyAgICAgIDE0MTAsIC8qIEdMX1NURU5DSUxfRlVOQyAqLworICAgICAgMTQyMiwgLyogR0xfU1RFTkNJTF9WQUxVRV9NQVNLICovCisgICAgICAxNDA5LCAvKiBHTF9TVEVOQ0lMX0ZBSUwgKi8KKyAgICAgIDE0MTcsIC8qIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICovCisgICAgICAxNDE4LCAvKiBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAqLworICAgICAgMTQxOSwgLyogR0xfU1RFTkNJTF9SRUYgKi8KKyAgICAgIDE0MjMsIC8qIEdMX1NURU5DSUxfV1JJVEVNQVNLICovCisgICAgICAgNzg5LCAvKiBHTF9NQVRSSVhfTU9ERSAqLworICAgICAgIDk1NiwgLyogR0xfTk9STUFMSVpFICovCisgICAgICAxNzI5LCAvKiBHTF9WSUVXUE9SVCAqLworICAgICAgIDkzMCwgLyogR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICovCisgICAgICAxMTg5LCAvKiBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICovCisgICAgICAxNjE4LCAvKiBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICovCisgICAgICAgOTI4LCAvKiBHTF9NT0RFTFZJRVdfTUFUUklYICovCisgICAgICAxMTg4LCAvKiBHTF9QUk9KRUNUSU9OX01BVFJJWCAqLworICAgICAgMTYwMywgLyogR0xfVEVYVFVSRV9NQVRSSVggKi8KKyAgICAgICAgNjAsIC8qIEdMX0FUVFJJQl9TVEFDS19ERVBUSCAqLworICAgICAgIDEyNiwgLyogR0xfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSCAqLwogICAgICAgICA0MywgLyogR0xfQUxQSEFfVEVTVCAqLwogICAgICAgICA0NCwgLyogR0xfQUxQSEFfVEVTVF9GVU5DICovCiAgICAgICAgIDQ1LCAvKiBHTF9BTFBIQV9URVNUX1JFRiAqLwotICAgICAgIDM0MywgLyogR0xfRElUSEVSICovCi0gICAgICAgIDc4LCAvKiBHTF9CTEVORF9EU1QgKi8KLSAgICAgICAgODYsIC8qIEdMX0JMRU5EX1NSQyAqLwotICAgICAgICA3NSwgLyogR0xfQkxFTkQgKi8KLSAgICAgICA2NjYsIC8qIEdMX0xPR0lDX09QX01PREUgKi8KLSAgICAgICA1ODYsIC8qIEdMX0lOREVYX0xPR0lDX09QICovCi0gICAgICAgMTY2LCAvKiBHTF9DT0xPUl9MT0dJQ19PUCAqLwotICAgICAgICA2NywgLyogR0xfQVVYX0JVRkZFUlMgKi8KLSAgICAgICAzNTQsIC8qIEdMX0RSQVdfQlVGRkVSICovCi0gICAgICAxMjIzLCAvKiBHTF9SRUFEX0JVRkZFUiAqLwotICAgICAgMTMyMCwgLyogR0xfU0NJU1NPUl9CT1ggKi8KLSAgICAgIDEzMjEsIC8qIEdMX1NDSVNTT1JfVEVTVCAqLwotICAgICAgIDU4NSwgLyogR0xfSU5ERVhfQ0xFQVJfVkFMVUUgKi8KLSAgICAgICA1OTAsIC8qIEdMX0lOREVYX1dSSVRFTUFTSyAqLwotICAgICAgIDE2MywgLyogR0xfQ09MT1JfQ0xFQVJfVkFMVUUgKi8KLSAgICAgICAyMDUsIC8qIEdMX0NPTE9SX1dSSVRFTUFTSyAqLwotICAgICAgIDU4NywgLyogR0xfSU5ERVhfTU9ERSAqLwotICAgICAgMTI4NywgLyogR0xfUkdCQV9NT0RFICovCi0gICAgICAgMzUzLCAvKiBHTF9ET1VCTEVCVUZGRVIgKi8KLSAgICAgIDE0MjYsIC8qIEdMX1NURVJFTyAqLwotICAgICAgMTI0NiwgLyogR0xfUkVOREVSX01PREUgKi8KLSAgICAgIDEwNDMsIC8qIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAqLwotICAgICAgMTA5MiwgLyogR0xfUE9JTlRfU01PT1RIX0hJTlQgKi8KLSAgICAgICA2NTAsIC8qIEdMX0xJTkVfU01PT1RIX0hJTlQgKi8KLSAgICAgIDExMDksIC8qIEdMX1BPTFlHT05fU01PT1RIX0hJTlQgKi8KLSAgICAgICA0NzgsIC8qIEdMX0ZPR19ISU5UICovCi0gICAgICAxNTg2LCAvKiBHTF9URVhUVVJFX0dFTl9TICovCi0gICAgICAxNTg3LCAvKiBHTF9URVhUVVJFX0dFTl9UICovCi0gICAgICAxNTg1LCAvKiBHTF9URVhUVVJFX0dFTl9SICovCi0gICAgICAxNTg0LCAvKiBHTF9URVhUVVJFX0dFTl9RICovCi0gICAgICAxMDU2LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19JICovCi0gICAgICAxMDYyLCAvKiBHTF9QSVhFTF9NQVBfU19UT19TICovCi0gICAgICAxMDU4LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19SICovCi0gICAgICAxMDU0LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19HICovCi0gICAgICAxMDUyLCAvKiBHTF9QSVhFTF9NQVBfSV9UT19CICovCi0gICAgICAxMDUwLCAvKiBHTF9QSVhFTF9NQVBfSV9UT19BICovCi0gICAgICAxMDYwLCAvKiBHTF9QSVhFTF9NQVBfUl9UT19SICovCi0gICAgICAxMDQ4LCAvKiBHTF9QSVhFTF9NQVBfR19UT19HICovCi0gICAgICAxMDQ2LCAvKiBHTF9QSVhFTF9NQVBfQl9UT19CICovCi0gICAgICAxMDQ0LCAvKiBHTF9QSVhFTF9NQVBfQV9UT19BICovCi0gICAgICAxMDU3LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgKi8KLSAgICAgIDEwNjMsIC8qIEdMX1BJWEVMX01BUF9TX1RPX1NfU0laRSAqLwotICAgICAgMTA1OSwgLyogR0xfUElYRUxfTUFQX0lfVE9fUl9TSVpFICovCi0gICAgICAxMDU1LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgKi8KLSAgICAgIDEwNTMsIC8qIEdMX1BJWEVMX01BUF9JX1RPX0JfU0laRSAqLwotICAgICAgMTA1MSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQV9TSVpFICovCi0gICAgICAxMDYxLCAvKiBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgKi8KLSAgICAgIDEwNDksIC8qIEdMX1BJWEVMX01BUF9HX1RPX0dfU0laRSAqLwotICAgICAgMTA0NywgLyogR0xfUElYRUxfTUFQX0JfVE9fQl9TSVpFICovCi0gICAgICAxMDQ1LCAvKiBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgKi8KLSAgICAgIDE2NTMsIC8qIEdMX1VOUEFDS19TV0FQX0JZVEVTICovCi0gICAgICAxNjQ4LCAvKiBHTF9VTlBBQ0tfTFNCX0ZJUlNUICovCi0gICAgICAxNjQ5LCAvKiBHTF9VTlBBQ0tfUk9XX0xFTkdUSCAqLwotICAgICAgMTY1MiwgLyogR0xfVU5QQUNLX1NLSVBfUk9XUyAqLwotICAgICAgMTY1MSwgLyogR0xfVU5QQUNLX1NLSVBfUElYRUxTICovCi0gICAgICAxNjQ2LCAvKiBHTF9VTlBBQ0tfQUxJR05NRU5UICovCi0gICAgICAxMDMxLCAvKiBHTF9QQUNLX1NXQVBfQllURVMgKi8KLSAgICAgIDEwMjYsIC8qIEdMX1BBQ0tfTFNCX0ZJUlNUICovCi0gICAgICAxMDI3LCAvKiBHTF9QQUNLX1JPV19MRU5HVEggKi8KLSAgICAgIDEwMzAsIC8qIEdMX1BBQ0tfU0tJUF9ST1dTICovCi0gICAgICAxMDI5LCAvKiBHTF9QQUNLX1NLSVBfUElYRUxTICovCi0gICAgICAxMDIzLCAvKiBHTF9QQUNLX0FMSUdOTUVOVCAqLwotICAgICAgIDc0NCwgLyogR0xfTUFQX0NPTE9SICovCi0gICAgICAgNzQ1LCAvKiBHTF9NQVBfU1RFTkNJTCAqLwotICAgICAgIDU4OSwgLyogR0xfSU5ERVhfU0hJRlQgKi8KLSAgICAgICA1ODgsIC8qIEdMX0lOREVYX09GRlNFVCAqLwotICAgICAgMTIzNSwgLyogR0xfUkVEX1NDQUxFICovCi0gICAgICAxMjMzLCAvKiBHTF9SRURfQklBUyAqLwotICAgICAgMTc0OCwgLyogR0xfWk9PTV9YICovCi0gICAgICAxNzQ5LCAvKiBHTF9aT09NX1kgKi8KLSAgICAgICA1NTEsIC8qIEdMX0dSRUVOX1NDQUxFICovCi0gICAgICAgNTQ5LCAvKiBHTF9HUkVFTl9CSUFTICovCi0gICAgICAgIDkyLCAvKiBHTF9CTFVFX1NDQUxFICovCi0gICAgICAgIDkwLCAvKiBHTF9CTFVFX0JJQVMgKi8KKyAgICAgICAzNDIsIC8qIEdMX0RJVEhFUiAqLworICAgICAgICA3NywgLyogR0xfQkxFTkRfRFNUICovCisgICAgICAgIDg1LCAvKiBHTF9CTEVORF9TUkMgKi8KKyAgICAgICAgNzQsIC8qIEdMX0JMRU5EICovCisgICAgICAgNjY0LCAvKiBHTF9MT0dJQ19PUF9NT0RFICovCisgICAgICAgNTg0LCAvKiBHTF9JTkRFWF9MT0dJQ19PUCAqLworICAgICAgIDE2NSwgLyogR0xfQ09MT1JfTE9HSUNfT1AgKi8KKyAgICAgICAgNjYsIC8qIEdMX0FVWF9CVUZGRVJTICovCisgICAgICAgMzUzLCAvKiBHTF9EUkFXX0JVRkZFUiAqLworICAgICAgMTIyMSwgLyogR0xfUkVBRF9CVUZGRVIgKi8KKyAgICAgIDEzMTgsIC8qIEdMX1NDSVNTT1JfQk9YICovCisgICAgICAxMzE5LCAvKiBHTF9TQ0lTU09SX1RFU1QgKi8KKyAgICAgICA1ODMsIC8qIEdMX0lOREVYX0NMRUFSX1ZBTFVFICovCisgICAgICAgNTg4LCAvKiBHTF9JTkRFWF9XUklURU1BU0sgKi8KKyAgICAgICAxNjIsIC8qIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICovCisgICAgICAgMjA0LCAvKiBHTF9DT0xPUl9XUklURU1BU0sgKi8KKyAgICAgICA1ODUsIC8qIEdMX0lOREVYX01PREUgKi8KKyAgICAgIDEyODUsIC8qIEdMX1JHQkFfTU9ERSAqLworICAgICAgIDM1MiwgLyogR0xfRE9VQkxFQlVGRkVSICovCisgICAgICAxNDI0LCAvKiBHTF9TVEVSRU8gKi8KKyAgICAgIDEyNDQsIC8qIEdMX1JFTkRFUl9NT0RFICovCisgICAgICAxMDQxLCAvKiBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KKyAgICAgIDEwOTAsIC8qIEdMX1BPSU5UX1NNT09USF9ISU5UICovCisgICAgICAgNjQ4LCAvKiBHTF9MSU5FX1NNT09USF9ISU5UICovCisgICAgICAxMTA3LCAvKiBHTF9QT0xZR09OX1NNT09USF9ISU5UICovCisgICAgICAgNDc2LCAvKiBHTF9GT0dfSElOVCAqLworICAgICAgMTU4NCwgLyogR0xfVEVYVFVSRV9HRU5fUyAqLworICAgICAgMTU4NSwgLyogR0xfVEVYVFVSRV9HRU5fVCAqLworICAgICAgMTU4MywgLyogR0xfVEVYVFVSRV9HRU5fUiAqLworICAgICAgMTU4MiwgLyogR0xfVEVYVFVSRV9HRU5fUSAqLworICAgICAgMTA1NCwgLyogR0xfUElYRUxfTUFQX0lfVE9fSSAqLworICAgICAgMTA2MCwgLyogR0xfUElYRUxfTUFQX1NfVE9fUyAqLworICAgICAgMTA1NiwgLyogR0xfUElYRUxfTUFQX0lfVE9fUiAqLworICAgICAgMTA1MiwgLyogR0xfUElYRUxfTUFQX0lfVE9fRyAqLworICAgICAgMTA1MCwgLyogR0xfUElYRUxfTUFQX0lfVE9fQiAqLworICAgICAgMTA0OCwgLyogR0xfUElYRUxfTUFQX0lfVE9fQSAqLworICAgICAgMTA1OCwgLyogR0xfUElYRUxfTUFQX1JfVE9fUiAqLworICAgICAgMTA0NiwgLyogR0xfUElYRUxfTUFQX0dfVE9fRyAqLworICAgICAgMTA0NCwgLyogR0xfUElYRUxfTUFQX0JfVE9fQiAqLworICAgICAgMTA0MiwgLyogR0xfUElYRUxfTUFQX0FfVE9fQSAqLworICAgICAgMTA1NSwgLyogR0xfUElYRUxfTUFQX0lfVE9fSV9TSVpFICovCisgICAgICAxMDYxLCAvKiBHTF9QSVhFTF9NQVBfU19UT19TX1NJWkUgKi8KKyAgICAgIDEwNTcsIC8qIEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRSAqLworICAgICAgMTA1MywgLyogR0xfUElYRUxfTUFQX0lfVE9fR19TSVpFICovCisgICAgICAxMDUxLCAvKiBHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkUgKi8KKyAgICAgIDEwNDksIC8qIEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRSAqLworICAgICAgMTA1OSwgLyogR0xfUElYRUxfTUFQX1JfVE9fUl9TSVpFICovCisgICAgICAxMDQ3LCAvKiBHTF9QSVhFTF9NQVBfR19UT19HX1NJWkUgKi8KKyAgICAgIDEwNDUsIC8qIEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRSAqLworICAgICAgMTA0MywgLyogR0xfUElYRUxfTUFQX0FfVE9fQV9TSVpFICovCisgICAgICAxNjUxLCAvKiBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLworICAgICAgMTY0NiwgLyogR0xfVU5QQUNLX0xTQl9GSVJTVCAqLworICAgICAgMTY0NywgLyogR0xfVU5QQUNLX1JPV19MRU5HVEggKi8KKyAgICAgIDE2NTAsIC8qIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KKyAgICAgIDE2NDksIC8qIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAqLworICAgICAgMTY0NCwgLyogR0xfVU5QQUNLX0FMSUdOTUVOVCAqLworICAgICAgMTAyOSwgLyogR0xfUEFDS19TV0FQX0JZVEVTICovCisgICAgICAxMDI0LCAvKiBHTF9QQUNLX0xTQl9GSVJTVCAqLworICAgICAgMTAyNSwgLyogR0xfUEFDS19ST1dfTEVOR1RIICovCisgICAgICAxMDI4LCAvKiBHTF9QQUNLX1NLSVBfUk9XUyAqLworICAgICAgMTAyNywgLyogR0xfUEFDS19TS0lQX1BJWEVMUyAqLworICAgICAgMTAyMSwgLyogR0xfUEFDS19BTElHTk1FTlQgKi8KKyAgICAgICA3NDIsIC8qIEdMX01BUF9DT0xPUiAqLworICAgICAgIDc0MywgLyogR0xfTUFQX1NURU5DSUwgKi8KKyAgICAgICA1ODcsIC8qIEdMX0lOREVYX1NISUZUICovCisgICAgICAgNTg2LCAvKiBHTF9JTkRFWF9PRkZTRVQgKi8KKyAgICAgIDEyMzMsIC8qIEdMX1JFRF9TQ0FMRSAqLworICAgICAgMTIzMSwgLyogR0xfUkVEX0JJQVMgKi8KKyAgICAgIDE3NDYsIC8qIEdMX1pPT01fWCAqLworICAgICAgMTc0NywgLyogR0xfWk9PTV9ZICovCisgICAgICAgNTQ5LCAvKiBHTF9HUkVFTl9TQ0FMRSAqLworICAgICAgIDU0NywgLyogR0xfR1JFRU5fQklBUyAqLworICAgICAgICA5MSwgLyogR0xfQkxVRV9TQ0FMRSAqLworICAgICAgICA4OSwgLyogR0xfQkxVRV9CSUFTICovCiAgICAgICAgIDQyLCAvKiBHTF9BTFBIQV9TQ0FMRSAqLwogICAgICAgICA0MCwgLyogR0xfQUxQSEFfQklBUyAqLwotICAgICAgIDMzNCwgLyogR0xfREVQVEhfU0NBTEUgKi8KLSAgICAgICAzMTUsIC8qIEdMX0RFUFRIX0JJQVMgKi8KLSAgICAgICA4MTcsIC8qIEdMX01BWF9FVkFMX09SREVSICovCi0gICAgICAgODIxLCAvKiBHTF9NQVhfTElHSFRTICovCi0gICAgICAgODAwLCAvKiBHTF9NQVhfQ0xJUF9QTEFORVMgKi8KLSAgICAgICA4NjUsIC8qIEdMX01BWF9URVhUVVJFX1NJWkUgKi8KLSAgICAgICA4MjcsIC8qIEdMX01BWF9QSVhFTF9NQVBfVEFCTEUgKi8KLSAgICAgICA3OTYsIC8qIEdMX01BWF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KLSAgICAgICA4MjQsIC8qIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggKi8KLSAgICAgICA4MjUsIC8qIEdMX01BWF9OQU1FX1NUQUNLX0RFUFRIICovCi0gICAgICAgODUzLCAvKiBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLwotICAgICAgIDg2NiwgLyogR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggKi8KLSAgICAgICA4ODAsIC8qIEdMX01BWF9WSUVXUE9SVF9ESU1TICovCi0gICAgICAgNzk3LCAvKiBHTF9NQVhfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSCAqLwotICAgICAgMTQzMywgLyogR0xfU1VCUElYRUxfQklUUyAqLwotICAgICAgIDU4NCwgLyogR0xfSU5ERVhfQklUUyAqLwotICAgICAgMTIzNCwgLyogR0xfUkVEX0JJVFMgKi8KLSAgICAgICA1NTAsIC8qIEdMX0dSRUVOX0JJVFMgKi8KLSAgICAgICAgOTEsIC8qIEdMX0JMVUVfQklUUyAqLworICAgICAgIDMzMywgLyogR0xfREVQVEhfU0NBTEUgKi8KKyAgICAgICAzMTQsIC8qIEdMX0RFUFRIX0JJQVMgKi8KKyAgICAgICA4MTUsIC8qIEdMX01BWF9FVkFMX09SREVSICovCisgICAgICAgODE5LCAvKiBHTF9NQVhfTElHSFRTICovCisgICAgICAgNzk4LCAvKiBHTF9NQVhfQ0xJUF9QTEFORVMgKi8KKyAgICAgICA4NjMsIC8qIEdMX01BWF9URVhUVVJFX1NJWkUgKi8KKyAgICAgICA4MjUsIC8qIEdMX01BWF9QSVhFTF9NQVBfVEFCTEUgKi8KKyAgICAgICA3OTQsIC8qIEdMX01BWF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KKyAgICAgICA4MjIsIC8qIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggKi8KKyAgICAgICA4MjMsIC8qIEdMX01BWF9OQU1FX1NUQUNLX0RFUFRIICovCisgICAgICAgODUxLCAvKiBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLworICAgICAgIDg2NCwgLyogR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggKi8KKyAgICAgICA4NzgsIC8qIEdMX01BWF9WSUVXUE9SVF9ESU1TICovCisgICAgICAgNzk1LCAvKiBHTF9NQVhfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSCAqLworICAgICAgMTQzMSwgLyogR0xfU1VCUElYRUxfQklUUyAqLworICAgICAgIDU4MiwgLyogR0xfSU5ERVhfQklUUyAqLworICAgICAgMTIzMiwgLyogR0xfUkVEX0JJVFMgKi8KKyAgICAgICA1NDgsIC8qIEdMX0dSRUVOX0JJVFMgKi8KKyAgICAgICAgOTAsIC8qIEdMX0JMVUVfQklUUyAqLwogICAgICAgICA0MSwgLyogR0xfQUxQSEFfQklUUyAqLwotICAgICAgIDMxNiwgLyogR0xfREVQVEhfQklUUyAqLwotICAgICAgMTQwOCwgLyogR0xfU1RFTkNJTF9CSVRTICovCisgICAgICAgMzE1LCAvKiBHTF9ERVBUSF9CSVRTICovCisgICAgICAxNDA2LCAvKiBHTF9TVEVOQ0lMX0JJVFMgKi8KICAgICAgICAgMTQsIC8qIEdMX0FDQ1VNX1JFRF9CSVRTICovCiAgICAgICAgIDEzLCAvKiBHTF9BQ0NVTV9HUkVFTl9CSVRTICovCiAgICAgICAgIDEwLCAvKiBHTF9BQ0NVTV9CTFVFX0JJVFMgKi8KICAgICAgICAgIDksIC8qIEdMX0FDQ1VNX0FMUEhBX0JJVFMgKi8KLSAgICAgICA5NDYsIC8qIEdMX05BTUVfU1RBQ0tfREVQVEggKi8KLSAgICAgICAgNjIsIC8qIEdMX0FVVE9fTk9STUFMICovCi0gICAgICAgNjkwLCAvKiBHTF9NQVAxX0NPTE9SXzQgKi8KLSAgICAgICA2OTMsIC8qIEdMX01BUDFfSU5ERVggKi8KLSAgICAgICA2OTQsIC8qIEdMX01BUDFfTk9STUFMICovCi0gICAgICAgNjk1LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotICAgICAgIDY5NiwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KLSAgICAgICA2OTcsIC8qIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zICovCi0gICAgICAgNjk4LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotICAgICAgIDY5OSwgLyogR0xfTUFQMV9WRVJURVhfMyAqLwotICAgICAgIDcwMCwgLyogR0xfTUFQMV9WRVJURVhfNCAqLwotICAgICAgIDcxNywgLyogR0xfTUFQMl9DT0xPUl80ICovCi0gICAgICAgNzIwLCAvKiBHTF9NQVAyX0lOREVYICovCi0gICAgICAgNzIxLCAvKiBHTF9NQVAyX05PUk1BTCAqLwotICAgICAgIDcyMiwgLyogR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEgKi8KLSAgICAgICA3MjMsIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0gICAgICAgNzI0LCAvKiBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyAqLwotICAgICAgIDcyNSwgLyogR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQgKi8KLSAgICAgICA3MjYsIC8qIEdMX01BUDJfVkVSVEVYXzMgKi8KLSAgICAgICA3MjcsIC8qIEdMX01BUDJfVkVSVEVYXzQgKi8KLSAgICAgICA2OTEsIC8qIEdMX01BUDFfR1JJRF9ET01BSU4gKi8KLSAgICAgICA2OTIsIC8qIEdMX01BUDFfR1JJRF9TRUdNRU5UUyAqLwotICAgICAgIDcxOCwgLyogR0xfTUFQMl9HUklEX0RPTUFJTiAqLwotICAgICAgIDcxOSwgLyogR0xfTUFQMl9HUklEX1NFR01FTlRTICovCi0gICAgICAxNTEwLCAvKiBHTF9URVhUVVJFXzFEICovCi0gICAgICAxNTEyLCAvKiBHTF9URVhUVVJFXzJEICovCi0gICAgICAgNDM5LCAvKiBHTF9GRUVEQkFDS19CVUZGRVJfUE9JTlRFUiAqLwotICAgICAgIDQ0MCwgLyogR0xfRkVFREJBQ0tfQlVGRkVSX1NJWkUgKi8KLSAgICAgICA0NDEsIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFICovCi0gICAgICAxMzMwLCAvKiBHTF9TRUxFQ1RJT05fQlVGRkVSX1BPSU5URVIgKi8KLSAgICAgIDEzMzEsIC8qIEdMX1NFTEVDVElPTl9CVUZGRVJfU0laRSAqLwotICAgICAgMTYyMywgLyogR0xfVEVYVFVSRV9XSURUSCAqLwotICAgICAgMTU5MSwgLyogR0xfVEVYVFVSRV9IRUlHSFQgKi8KLSAgICAgIDE1NDcsIC8qIEdMX1RFWFRVUkVfQ09NUE9ORU5UUyAqLwotICAgICAgMTUzMSwgLyogR0xfVEVYVFVSRV9CT1JERVJfQ09MT1IgKi8KLSAgICAgIDE1MzAsIC8qIEdMX1RFWFRVUkVfQk9SREVSICovCi0gICAgICAgMzQ1LCAvKiBHTF9ET05UX0NBUkUgKi8KLSAgICAgICA0MzcsIC8qIEdMX0ZBU1RFU1QgKi8KLSAgICAgICA5NTQsIC8qIEdMX05JQ0VTVCAqLworICAgICAgIDk0NCwgLyogR0xfTkFNRV9TVEFDS19ERVBUSCAqLworICAgICAgICA2MSwgLyogR0xfQVVUT19OT1JNQUwgKi8KKyAgICAgICA2ODgsIC8qIEdMX01BUDFfQ09MT1JfNCAqLworICAgICAgIDY5MSwgLyogR0xfTUFQMV9JTkRFWCAqLworICAgICAgIDY5MiwgLyogR0xfTUFQMV9OT1JNQUwgKi8KKyAgICAgICA2OTMsIC8qIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xICovCisgICAgICAgNjk0LCAvKiBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLworICAgICAgIDY5NSwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KKyAgICAgICA2OTYsIC8qIEdMX01BUDFfVEVYVFVSRV9DT09SRF80ICovCisgICAgICAgNjk3LCAvKiBHTF9NQVAxX1ZFUlRFWF8zICovCisgICAgICAgNjk4LCAvKiBHTF9NQVAxX1ZFUlRFWF80ICovCisgICAgICAgNzE1LCAvKiBHTF9NQVAyX0NPTE9SXzQgKi8KKyAgICAgICA3MTgsIC8qIEdMX01BUDJfSU5ERVggKi8KKyAgICAgICA3MTksIC8qIEdMX01BUDJfTk9STUFMICovCisgICAgICAgNzIwLCAvKiBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSAqLworICAgICAgIDcyMSwgLyogR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIgKi8KKyAgICAgICA3MjIsIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCisgICAgICAgNzIzLCAvKiBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCAqLworICAgICAgIDcyNCwgLyogR0xfTUFQMl9WRVJURVhfMyAqLworICAgICAgIDcyNSwgLyogR0xfTUFQMl9WRVJURVhfNCAqLworICAgICAgIDY4OSwgLyogR0xfTUFQMV9HUklEX0RPTUFJTiAqLworICAgICAgIDY5MCwgLyogR0xfTUFQMV9HUklEX1NFR01FTlRTICovCisgICAgICAgNzE2LCAvKiBHTF9NQVAyX0dSSURfRE9NQUlOICovCisgICAgICAgNzE3LCAvKiBHTF9NQVAyX0dSSURfU0VHTUVOVFMgKi8KKyAgICAgIDE1MDgsIC8qIEdMX1RFWFRVUkVfMUQgKi8KKyAgICAgIDE1MTAsIC8qIEdMX1RFWFRVUkVfMkQgKi8KKyAgICAgICA0MzcsIC8qIEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSICovCisgICAgICAgNDM4LCAvKiBHTF9GRUVEQkFDS19CVUZGRVJfU0laRSAqLworICAgICAgIDQzOSwgLyogR0xfRkVFREJBQ0tfQlVGRkVSX1RZUEUgKi8KKyAgICAgIDEzMjgsIC8qIEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUiAqLworICAgICAgMTMyOSwgLyogR0xfU0VMRUNUSU9OX0JVRkZFUl9TSVpFICovCisgICAgICAxNjIxLCAvKiBHTF9URVhUVVJFX1dJRFRIICovCisgICAgICAxNTg5LCAvKiBHTF9URVhUVVJFX0hFSUdIVCAqLworICAgICAgMTU0NSwgLyogR0xfVEVYVFVSRV9DT01QT05FTlRTICovCisgICAgICAxNTI5LCAvKiBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiAqLworICAgICAgMTUyOCwgLyogR0xfVEVYVFVSRV9CT1JERVIgKi8KKyAgICAgICAzNDQsIC8qIEdMX0RPTlRfQ0FSRSAqLworICAgICAgIDQzNSwgLyogR0xfRkFTVEVTVCAqLworICAgICAgIDk1MiwgLyogR0xfTklDRVNUICovCiAgICAgICAgIDQ3LCAvKiBHTF9BTUJJRU5UICovCi0gICAgICAgMzQyLCAvKiBHTF9ESUZGVVNFICovCi0gICAgICAxMzczLCAvKiBHTF9TUEVDVUxBUiAqLwotICAgICAgMTExMywgLyogR0xfUE9TSVRJT04gKi8KLSAgICAgIDEzNzYsIC8qIEdMX1NQT1RfRElSRUNUSU9OICovCi0gICAgICAxMzc3LCAvKiBHTF9TUE9UX0VYUE9ORU5UICovCi0gICAgICAxMzc1LCAvKiBHTF9TUE9UX0NVVE9GRiAqLwotICAgICAgIDI0NSwgLyogR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gKi8KLSAgICAgICA2NDAsIC8qIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAqLwotICAgICAgMTIxMCwgLyogR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICovCi0gICAgICAgMjE5LCAvKiBHTF9DT01QSUxFICovCi0gICAgICAgMjIwLCAvKiBHTF9DT01QSUxFX0FORF9FWEVDVVRFICovCi0gICAgICAgMTExLCAvKiBHTF9CWVRFICovCi0gICAgICAxNjU0LCAvKiBHTF9VTlNJR05FRF9CWVRFICovCi0gICAgICAxMzQ0LCAvKiBHTF9TSE9SVCAqLwotICAgICAgMTY2MywgLyogR0xfVU5TSUdORURfU0hPUlQgKi8KLSAgICAgICA1OTIsIC8qIEdMX0lOVCAqLwotICAgICAgMTY1NywgLyogR0xfVU5TSUdORURfSU5UICovCi0gICAgICAgNDQ0LCAvKiBHTF9GTE9BVCAqLworICAgICAgIDM0MSwgLyogR0xfRElGRlVTRSAqLworICAgICAgMTM3MSwgLyogR0xfU1BFQ1VMQVIgKi8KKyAgICAgIDExMTEsIC8qIEdMX1BPU0lUSU9OICovCisgICAgICAxMzc0LCAvKiBHTF9TUE9UX0RJUkVDVElPTiAqLworICAgICAgMTM3NSwgLyogR0xfU1BPVF9FWFBPTkVOVCAqLworICAgICAgMTM3MywgLyogR0xfU1BPVF9DVVRPRkYgKi8KKyAgICAgICAyNDQsIC8qIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICovCisgICAgICAgNjM4LCAvKiBHTF9MSU5FQVJfQVRURU5VQVRJT04gKi8KKyAgICAgIDEyMDgsIC8qIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAqLworICAgICAgIDIxOCwgLyogR0xfQ09NUElMRSAqLworICAgICAgIDIxOSwgLyogR0xfQ09NUElMRV9BTkRfRVhFQ1VURSAqLworICAgICAgIDExMCwgLyogR0xfQllURSAqLworICAgICAgMTY1MiwgLyogR0xfVU5TSUdORURfQllURSAqLworICAgICAgMTM0MiwgLyogR0xfU0hPUlQgKi8KKyAgICAgIDE2NjEsIC8qIEdMX1VOU0lHTkVEX1NIT1JUICovCisgICAgICAgNTkwLCAvKiBHTF9JTlQgKi8KKyAgICAgIDE2NTUsIC8qIEdMX1VOU0lHTkVEX0lOVCAqLworICAgICAgIDQ0MiwgLyogR0xfRkxPQVQgKi8KICAgICAgICAgIDEsIC8qIEdMXzJfQllURVMgKi8KICAgICAgICAgIDUsIC8qIEdMXzNfQllURVMgKi8KICAgICAgICAgIDcsIC8qIEdMXzRfQllURVMgKi8KLSAgICAgICAzNTIsIC8qIEdMX0RPVUJMRSAqLwotICAgICAgIDEyMywgLyogR0xfQ0xFQVIgKi8KKyAgICAgICAzNTEsIC8qIEdMX0RPVUJMRSAqLworICAgICAgIDEyMiwgLyogR0xfQ0xFQVIgKi8KICAgICAgICAgNDksIC8qIEdMX0FORCAqLwogICAgICAgICA1MSwgLyogR0xfQU5EX1JFVkVSU0UgKi8KLSAgICAgICAyNjksIC8qIEdMX0NPUFkgKi8KKyAgICAgICAyNjgsIC8qIEdMX0NPUFkgKi8KICAgICAgICAgNTAsIC8qIEdMX0FORF9JTlZFUlRFRCAqLwotICAgICAgIDk1NiwgLyogR0xfTk9PUCAqLwotICAgICAgMTc0NCwgLyogR0xfWE9SICovCi0gICAgICAxMDE4LCAvKiBHTF9PUiAqLwotICAgICAgIDk1NywgLyogR0xfTk9SICovCi0gICAgICAgNDI3LCAvKiBHTF9FUVVJViAqLwotICAgICAgIDYxOCwgLyogR0xfSU5WRVJUICovCi0gICAgICAxMDIxLCAvKiBHTF9PUl9SRVZFUlNFICovCi0gICAgICAgMjcwLCAvKiBHTF9DT1BZX0lOVkVSVEVEICovCi0gICAgICAxMDIwLCAvKiBHTF9PUl9JTlZFUlRFRCAqLwotICAgICAgIDk0NywgLyogR0xfTkFORCAqLwotICAgICAgMTMzNSwgLyogR0xfU0VUICovCi0gICAgICAgNDI0LCAvKiBHTF9FTUlTU0lPTiAqLwotICAgICAgMTM0MywgLyogR0xfU0hJTklORVNTICovCisgICAgICAgOTU0LCAvKiBHTF9OT09QICovCisgICAgICAxNzQyLCAvKiBHTF9YT1IgKi8KKyAgICAgIDEwMTYsIC8qIEdMX09SICovCisgICAgICAgOTU1LCAvKiBHTF9OT1IgKi8KKyAgICAgICA0MjUsIC8qIEdMX0VRVUlWICovCisgICAgICAgNjE2LCAvKiBHTF9JTlZFUlQgKi8KKyAgICAgIDEwMTksIC8qIEdMX09SX1JFVkVSU0UgKi8KKyAgICAgICAyNjksIC8qIEdMX0NPUFlfSU5WRVJURUQgKi8KKyAgICAgIDEwMTgsIC8qIEdMX09SX0lOVkVSVEVEICovCisgICAgICAgOTQ1LCAvKiBHTF9OQU5EICovCisgICAgICAxMzMzLCAvKiBHTF9TRVQgKi8KKyAgICAgICA0MjIsIC8qIEdMX0VNSVNTSU9OICovCisgICAgICAxMzQxLCAvKiBHTF9TSElOSU5FU1MgKi8KICAgICAgICAgNDgsIC8qIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLSAgICAgICAxNjUsIC8qIEdMX0NPTE9SX0lOREVYRVMgKi8KLSAgICAgICA4OTcsIC8qIEdMX01PREVMVklFVyAqLwotICAgICAgMTE4OSwgLyogR0xfUFJPSkVDVElPTiAqLwotICAgICAgMTQ0NSwgLyogR0xfVEVYVFVSRSAqLwotICAgICAgIDEzOCwgLyogR0xfQ09MT1IgKi8KLSAgICAgICAzMTMsIC8qIEdMX0RFUFRIICovCi0gICAgICAxMzk1LCAvKiBHTF9TVEVOQ0lMICovCi0gICAgICAgMTY0LCAvKiBHTF9DT0xPUl9JTkRFWCAqLwotICAgICAgMTQxMywgLyogR0xfU1RFTkNJTF9JTkRFWCAqLwotICAgICAgIDMyMiwgLyogR0xfREVQVEhfQ09NUE9ORU5UICovCi0gICAgICAxMjMwLCAvKiBHTF9SRUQgKi8KLSAgICAgICA1NDgsIC8qIEdMX0dSRUVOICovCi0gICAgICAgIDg5LCAvKiBHTF9CTFVFICovCisgICAgICAgMTY0LCAvKiBHTF9DT0xPUl9JTkRFWEVTICovCisgICAgICAgODk1LCAvKiBHTF9NT0RFTFZJRVcgKi8KKyAgICAgIDExODcsIC8qIEdMX1BST0pFQ1RJT04gKi8KKyAgICAgIDE0NDMsIC8qIEdMX1RFWFRVUkUgKi8KKyAgICAgICAxMzcsIC8qIEdMX0NPTE9SICovCisgICAgICAgMzEyLCAvKiBHTF9ERVBUSCAqLworICAgICAgMTM5MywgLyogR0xfU1RFTkNJTCAqLworICAgICAgIDE2MywgLyogR0xfQ09MT1JfSU5ERVggKi8KKyAgICAgIDE0MTEsIC8qIEdMX1NURU5DSUxfSU5ERVggKi8KKyAgICAgICAzMjEsIC8qIEdMX0RFUFRIX0NPTVBPTkVOVCAqLworICAgICAgMTIyOCwgLyogR0xfUkVEICovCisgICAgICAgNTQ2LCAvKiBHTF9HUkVFTiAqLworICAgICAgICA4OCwgLyogR0xfQkxVRSAqLwogICAgICAgICAzMSwgLyogR0xfQUxQSEEgKi8KLSAgICAgIDEyNTQsIC8qIEdMX1JHQiAqLwotICAgICAgMTI3MywgLyogR0xfUkdCQSAqLwotICAgICAgIDY2OCwgLyogR0xfTFVNSU5BTkNFICovCi0gICAgICAgNjg5LCAvKiBHTF9MVU1JTkFOQ0VfQUxQSEEgKi8KLSAgICAgICAgNzMsIC8qIEdMX0JJVE1BUCAqLwotICAgICAgMTA2OSwgLyogR0xfUE9JTlQgKi8KLSAgICAgICA2MzgsIC8qIEdMX0xJTkUgKi8KLSAgICAgICA0NDIsIC8qIEdMX0ZJTEwgKi8KLSAgICAgIDEyMzksIC8qIEdMX1JFTkRFUiAqLwotICAgICAgIDQzOCwgLyogR0xfRkVFREJBQ0sgKi8KLSAgICAgIDEzMjksIC8qIEdMX1NFTEVDVCAqLwotICAgICAgIDQ0MywgLyogR0xfRkxBVCAqLwotICAgICAgMTM0OCwgLyogR0xfU01PT1RIICovCi0gICAgICAgNjE5LCAvKiBHTF9LRUVQICovCi0gICAgICAxMjQ4LCAvKiBHTF9SRVBMQUNFICovCi0gICAgICAgNTc1LCAvKiBHTF9JTkNSICovCi0gICAgICAgMzA5LCAvKiBHTF9ERUNSICovCi0gICAgICAxNjc4LCAvKiBHTF9WRU5ET1IgKi8KLSAgICAgIDEyNDUsIC8qIEdMX1JFTkRFUkVSICovCi0gICAgICAxNjc5LCAvKiBHTF9WRVJTSU9OICovCi0gICAgICAgNDMxLCAvKiBHTF9FWFRFTlNJT05TICovCi0gICAgICAxMjk0LCAvKiBHTF9TICovCi0gICAgICAxNDM2LCAvKiBHTF9UICovCi0gICAgICAxMjIwLCAvKiBHTF9SICovCi0gICAgICAxMjA5LCAvKiBHTF9RICovCi0gICAgICAgOTMzLCAvKiBHTF9NT0RVTEFURSAqLwotICAgICAgIDMwOCwgLyogR0xfREVDQUwgKi8KLSAgICAgIDE1ODEsIC8qIEdMX1RFWFRVUkVfRU5WX01PREUgKi8KLSAgICAgIDE1ODAsIC8qIEdMX1RFWFRVUkVfRU5WX0NPTE9SICovCi0gICAgICAxNTc5LCAvKiBHTF9URVhUVVJFX0VOViAqLwotICAgICAgIDQzMiwgLyogR0xfRVlFX0xJTkVBUiAqLwotICAgICAgIDk4MCwgLyogR0xfT0JKRUNUX0xJTkVBUiAqLwotICAgICAgMTM3NCwgLyogR0xfU1BIRVJFX01BUCAqLwotICAgICAgMTU4MywgLyogR0xfVEVYVFVSRV9HRU5fTU9ERSAqLwotICAgICAgIDk4MiwgLyogR0xfT0JKRUNUX1BMQU5FICovCi0gICAgICAgNDMzLCAvKiBHTF9FWUVfUExBTkUgKi8KLSAgICAgICA5NDgsIC8qIEdMX05FQVJFU1QgKi8KLSAgICAgICA2MzksIC8qIEdMX0xJTkVBUiAqLwotICAgICAgIDk1MiwgLyogR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAqLwotICAgICAgIDY0NCwgLyogR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICovCi0gICAgICAgOTUxLCAvKiBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgKi8KLSAgICAgICA2NDMsIC8qIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICovCi0gICAgICAxNjA0LCAvKiBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLSAgICAgIDE2MTIsIC8qIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotICAgICAgMTYyNSwgLyogR0xfVEVYVFVSRV9XUkFQX1MgKi8KLSAgICAgIDE2MjYsIC8qIEdMX1RFWFRVUkVfV1JBUF9UICovCi0gICAgICAgMTE3LCAvKiBHTF9DTEFNUCAqLwotICAgICAgMTI0NywgLyogR0xfUkVQRUFUICovCi0gICAgICAxMTA3LCAvKiBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAqLwotICAgICAgMTEwNiwgLyogR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQgKi8KLSAgICAgIDExMDUsIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgKi8KLSAgICAgIDEyMjEsIC8qIEdMX1IzX0czX0IyICovCi0gICAgICAxNjc1LCAvKiBHTF9WMkYgKi8KLSAgICAgIDE2NzYsIC8qIEdMX1YzRiAqLwotICAgICAgIDExNCwgLyogR0xfQzRVQl9WMkYgKi8KLSAgICAgICAxMTUsIC8qIEdMX0M0VUJfVjNGICovCi0gICAgICAgMTEyLCAvKiBHTF9DM0ZfVjNGICovCi0gICAgICAgOTQ1LCAvKiBHTF9OM0ZfVjNGICovCi0gICAgICAgMTEzLCAvKiBHTF9DNEZfTjNGX1YzRiAqLwotICAgICAgMTQ0MSwgLyogR0xfVDJGX1YzRiAqLwotICAgICAgMTQ0MywgLyogR0xfVDRGX1Y0RiAqLwotICAgICAgMTQzOSwgLyogR0xfVDJGX0M0VUJfVjNGICovCi0gICAgICAxNDM3LCAvKiBHTF9UMkZfQzNGX1YzRiAqLwotICAgICAgMTQ0MCwgLyogR0xfVDJGX04zRl9WM0YgKi8KLSAgICAgIDE0MzgsIC8qIEdMX1QyRl9DNEZfTjNGX1YzRiAqLwotICAgICAgMTQ0MiwgLyogR0xfVDRGX0M0Rl9OM0ZfVjRGICovCi0gICAgICAgMTMwLCAvKiBHTF9DTElQX1BMQU5FMCAqLwotICAgICAgIDEzMSwgLyogR0xfQ0xJUF9QTEFORTEgKi8KLSAgICAgICAxMzIsIC8qIEdMX0NMSVBfUExBTkUyICovCi0gICAgICAgMTMzLCAvKiBHTF9DTElQX1BMQU5FMyAqLwotICAgICAgIDEzNCwgLyogR0xfQ0xJUF9QTEFORTQgKi8KLSAgICAgICAxMzUsIC8qIEdMX0NMSVBfUExBTkU1ICovCi0gICAgICAgNjIzLCAvKiBHTF9MSUdIVDAgKi8KLSAgICAgICA2MjQsIC8qIEdMX0xJR0hUMSAqLwotICAgICAgIDYyNSwgLyogR0xfTElHSFQyICovCi0gICAgICAgNjI2LCAvKiBHTF9MSUdIVDMgKi8KLSAgICAgICA2MjcsIC8qIEdMX0xJR0hUNCAqLwotICAgICAgIDYyOCwgLyogR0xfTElHSFQ1ICovCi0gICAgICAgNjI5LCAvKiBHTF9MSUdIVDYgKi8KLSAgICAgICA2MzAsIC8qIEdMX0xJR0hUNyAqLwotICAgICAgIDU1MiwgLyogR0xfSElOVF9CSVQgKi8KLSAgICAgICAyNDcsIC8qIEdMX0NPTlNUQU5UX0NPTE9SICovCi0gICAgICAgOTkyLCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgKi8KLSAgICAgICAyNDIsIC8qIEdMX0NPTlNUQU5UX0FMUEhBICovCi0gICAgICAgOTkwLCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgKi8KLSAgICAgICAgNzYsIC8qIEdMX0JMRU5EX0NPTE9SICovCi0gICAgICAgNTEyLCAvKiBHTF9GVU5DX0FERCAqLwotICAgICAgIDg4MSwgLyogR0xfTUlOICovCi0gICAgICAgNzkzLCAvKiBHTF9NQVggKi8KLSAgICAgICAgODEsIC8qIEdMX0JMRU5EX0VRVUFUSU9OICovCi0gICAgICAgNTE2LCAvKiBHTF9GVU5DX1NVQlRSQUNUICovCi0gICAgICAgNTE0LCAvKiBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgKi8KLSAgICAgICAyNTAsIC8qIEdMX0NPTlZPTFVUSU9OXzFEICovCi0gICAgICAgMjUxLCAvKiBHTF9DT05WT0xVVElPTl8yRCAqLwotICAgICAgMTMzMiwgLyogR0xfU0VQQVJBQkxFXzJEICovCi0gICAgICAgMjU0LCAvKiBHTF9DT05WT0xVVElPTl9CT1JERVJfTU9ERSAqLwotICAgICAgIDI1OCwgLyogR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICovCi0gICAgICAgMjU2LCAvKiBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUyAqLwotICAgICAgMTIzMSwgLyogR0xfUkVEVUNFICovCi0gICAgICAgMjYwLCAvKiBHTF9DT05WT0xVVElPTl9GT1JNQVQgKi8KLSAgICAgICAyNjQsIC8qIEdMX0NPTlZPTFVUSU9OX1dJRFRIICovCi0gICAgICAgMjYyLCAvKiBHTF9DT05WT0xVVElPTl9IRUlHSFQgKi8KLSAgICAgICA4MDgsIC8qIEdMX01BWF9DT05WT0xVVElPTl9XSURUSCAqLwotICAgICAgIDgwNiwgLyogR0xfTUFYX0NPTlZPTFVUSU9OX0hFSUdIVCAqLwotICAgICAgMTE0NiwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEUgKi8KLSAgICAgIDExNDIsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fU0NBTEUgKi8KLSAgICAgIDExMzcsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRSAqLwotICAgICAgMTEzMywgLyogR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRSAqLwotICAgICAgMTE0NCwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUyAqLwotICAgICAgMTE0MCwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTICovCi0gICAgICAxMTM1LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfQklBUyAqLwotICAgICAgMTEzMSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTICovCi0gICAgICAgNTUzLCAvKiBHTF9ISVNUT0dSQU0gKi8KLSAgICAgIDExOTMsIC8qIEdMX1BST1hZX0hJU1RPR1JBTSAqLwotICAgICAgIDU2OSwgLyogR0xfSElTVE9HUkFNX1dJRFRIICovCi0gICAgICAgNTU5LCAvKiBHTF9ISVNUT0dSQU1fRk9STUFUICovCi0gICAgICAgNTY1LCAvKiBHTF9ISVNUT0dSQU1fUkVEX1NJWkUgKi8KLSAgICAgICA1NjEsIC8qIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFICovCi0gICAgICAgNTU2LCAvKiBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICovCi0gICAgICAgNTU0LCAvKiBHTF9ISVNUT0dSQU1fQUxQSEFfU0laRSAqLwotICAgICAgIDU2MywgLyogR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICovCi0gICAgICAgNTY3LCAvKiBHTF9ISVNUT0dSQU1fU0lOSyAqLwotICAgICAgIDg4MiwgLyogR0xfTUlOTUFYICovCi0gICAgICAgODg0LCAvKiBHTF9NSU5NQVhfRk9STUFUICovCi0gICAgICAgODg2LCAvKiBHTF9NSU5NQVhfU0lOSyAqLwotICAgICAgMTQ0NCwgLyogR0xfVEFCTEVfVE9PX0xBUkdFX0VYVCAqLwotICAgICAgMTY1NiwgLyogR0xfVU5TSUdORURfQllURV8zXzNfMiAqLwotICAgICAgMTY2NSwgLyogR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAqLwotICAgICAgMTY2NywgLyogR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAqLwotICAgICAgMTY2MSwgLyogR0xfVU5TSUdORURfSU5UXzhfOF84XzggKi8KLSAgICAgIDE2NTgsIC8qIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yICovCi0gICAgICAxMTA0LCAvKiBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0gICAgICAxMTAzLCAvKiBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KLSAgICAgIDExMDIsIC8qIEdMX1BPTFlHT05fT0ZGU0VUX0JJQVMgKi8KLSAgICAgIDEyNTEsIC8qIEdMX1JFU0NBTEVfTk9STUFMICovCisgICAgICAxMjUyLCAvKiBHTF9SR0IgKi8KKyAgICAgIDEyNzEsIC8qIEdMX1JHQkEgKi8KKyAgICAgICA2NjYsIC8qIEdMX0xVTUlOQU5DRSAqLworICAgICAgIDY4NywgLyogR0xfTFVNSU5BTkNFX0FMUEhBICovCisgICAgICAgIDcyLCAvKiBHTF9CSVRNQVAgKi8KKyAgICAgIDEwNjcsIC8qIEdMX1BPSU5UICovCisgICAgICAgNjM2LCAvKiBHTF9MSU5FICovCisgICAgICAgNDQwLCAvKiBHTF9GSUxMICovCisgICAgICAxMjM3LCAvKiBHTF9SRU5ERVIgKi8KKyAgICAgICA0MzYsIC8qIEdMX0ZFRURCQUNLICovCisgICAgICAxMzI3LCAvKiBHTF9TRUxFQ1QgKi8KKyAgICAgICA0NDEsIC8qIEdMX0ZMQVQgKi8KKyAgICAgIDEzNDYsIC8qIEdMX1NNT09USCAqLworICAgICAgIDYxNywgLyogR0xfS0VFUCAqLworICAgICAgMTI0NiwgLyogR0xfUkVQTEFDRSAqLworICAgICAgIDU3MywgLyogR0xfSU5DUiAqLworICAgICAgIDMwOCwgLyogR0xfREVDUiAqLworICAgICAgMTY3NiwgLyogR0xfVkVORE9SICovCisgICAgICAxMjQzLCAvKiBHTF9SRU5ERVJFUiAqLworICAgICAgMTY3NywgLyogR0xfVkVSU0lPTiAqLworICAgICAgIDQyOSwgLyogR0xfRVhURU5TSU9OUyAqLworICAgICAgMTI5MiwgLyogR0xfUyAqLworICAgICAgMTQzNCwgLyogR0xfVCAqLworICAgICAgMTIxOCwgLyogR0xfUiAqLworICAgICAgMTIwNywgLyogR0xfUSAqLworICAgICAgIDkzMSwgLyogR0xfTU9EVUxBVEUgKi8KKyAgICAgICAzMDcsIC8qIEdMX0RFQ0FMICovCisgICAgICAxNTc5LCAvKiBHTF9URVhUVVJFX0VOVl9NT0RFICovCisgICAgICAxNTc4LCAvKiBHTF9URVhUVVJFX0VOVl9DT0xPUiAqLworICAgICAgMTU3NywgLyogR0xfVEVYVFVSRV9FTlYgKi8KKyAgICAgICA0MzAsIC8qIEdMX0VZRV9MSU5FQVIgKi8KKyAgICAgICA5NzgsIC8qIEdMX09CSkVDVF9MSU5FQVIgKi8KKyAgICAgIDEzNzIsIC8qIEdMX1NQSEVSRV9NQVAgKi8KKyAgICAgIDE1ODEsIC8qIEdMX1RFWFRVUkVfR0VOX01PREUgKi8KKyAgICAgICA5ODAsIC8qIEdMX09CSkVDVF9QTEFORSAqLworICAgICAgIDQzMSwgLyogR0xfRVlFX1BMQU5FICovCisgICAgICAgOTQ2LCAvKiBHTF9ORUFSRVNUICovCisgICAgICAgNjM3LCAvKiBHTF9MSU5FQVIgKi8KKyAgICAgICA5NTAsIC8qIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgKi8KKyAgICAgICA2NDIsIC8qIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAqLworICAgICAgIDk0OSwgLyogR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICovCisgICAgICAgNjQxLCAvKiBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAqLworICAgICAgMTYwMiwgLyogR0xfVEVYVFVSRV9NQUdfRklMVEVSICovCisgICAgICAxNjEwLCAvKiBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KKyAgICAgIDE2MjMsIC8qIEdMX1RFWFRVUkVfV1JBUF9TICovCisgICAgICAxNjI0LCAvKiBHTF9URVhUVVJFX1dSQVBfVCAqLworICAgICAgIDExNiwgLyogR0xfQ0xBTVAgKi8KKyAgICAgIDEyNDUsIC8qIEdMX1JFUEVBVCAqLworICAgICAgMTEwNSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgKi8KKyAgICAgIDExMDQsIC8qIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UICovCisgICAgICAxMTAzLCAvKiBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCisgICAgICAxMjE5LCAvKiBHTF9SM19HM19CMiAqLworICAgICAgMTY3MywgLyogR0xfVjJGICovCisgICAgICAxNjc0LCAvKiBHTF9WM0YgKi8KKyAgICAgICAxMTMsIC8qIEdMX0M0VUJfVjJGICovCisgICAgICAgMTE0LCAvKiBHTF9DNFVCX1YzRiAqLworICAgICAgIDExMSwgLyogR0xfQzNGX1YzRiAqLworICAgICAgIDk0MywgLyogR0xfTjNGX1YzRiAqLworICAgICAgIDExMiwgLyogR0xfQzRGX04zRl9WM0YgKi8KKyAgICAgIDE0MzksIC8qIEdMX1QyRl9WM0YgKi8KKyAgICAgIDE0NDEsIC8qIEdMX1Q0Rl9WNEYgKi8KKyAgICAgIDE0MzcsIC8qIEdMX1QyRl9DNFVCX1YzRiAqLworICAgICAgMTQzNSwgLyogR0xfVDJGX0MzRl9WM0YgKi8KKyAgICAgIDE0MzgsIC8qIEdMX1QyRl9OM0ZfVjNGICovCisgICAgICAxNDM2LCAvKiBHTF9UMkZfQzRGX04zRl9WM0YgKi8KKyAgICAgIDE0NDAsIC8qIEdMX1Q0Rl9DNEZfTjNGX1Y0RiAqLworICAgICAgIDEyOSwgLyogR0xfQ0xJUF9QTEFORTAgKi8KKyAgICAgICAxMzAsIC8qIEdMX0NMSVBfUExBTkUxICovCisgICAgICAgMTMxLCAvKiBHTF9DTElQX1BMQU5FMiAqLworICAgICAgIDEzMiwgLyogR0xfQ0xJUF9QTEFORTMgKi8KKyAgICAgICAxMzMsIC8qIEdMX0NMSVBfUExBTkU0ICovCisgICAgICAgMTM0LCAvKiBHTF9DTElQX1BMQU5FNSAqLworICAgICAgIDYyMSwgLyogR0xfTElHSFQwICovCisgICAgICAgNjIyLCAvKiBHTF9MSUdIVDEgKi8KKyAgICAgICA2MjMsIC8qIEdMX0xJR0hUMiAqLworICAgICAgIDYyNCwgLyogR0xfTElHSFQzICovCisgICAgICAgNjI1LCAvKiBHTF9MSUdIVDQgKi8KKyAgICAgICA2MjYsIC8qIEdMX0xJR0hUNSAqLworICAgICAgIDYyNywgLyogR0xfTElHSFQ2ICovCisgICAgICAgNjI4LCAvKiBHTF9MSUdIVDcgKi8KKyAgICAgICA1NTAsIC8qIEdMX0hJTlRfQklUICovCisgICAgICAgMjQ2LCAvKiBHTF9DT05TVEFOVF9DT0xPUiAqLworICAgICAgIDk5MCwgLyogR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SICovCisgICAgICAgMjQxLCAvKiBHTF9DT05TVEFOVF9BTFBIQSAqLworICAgICAgIDk4OCwgLyogR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICovCisgICAgICAgIDc1LCAvKiBHTF9CTEVORF9DT0xPUiAqLworICAgICAgIDUxMCwgLyogR0xfRlVOQ19BREQgKi8KKyAgICAgICA4NzksIC8qIEdMX01JTiAqLworICAgICAgIDc5MSwgLyogR0xfTUFYICovCisgICAgICAgIDgwLCAvKiBHTF9CTEVORF9FUVVBVElPTiAqLworICAgICAgIDUxNCwgLyogR0xfRlVOQ19TVUJUUkFDVCAqLworICAgICAgIDUxMiwgLyogR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICovCisgICAgICAgMjQ5LCAvKiBHTF9DT05WT0xVVElPTl8xRCAqLworICAgICAgIDI1MCwgLyogR0xfQ09OVk9MVVRJT05fMkQgKi8KKyAgICAgIDEzMzAsIC8qIEdMX1NFUEFSQUJMRV8yRCAqLworICAgICAgIDI1MywgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUgKi8KKyAgICAgICAyNTcsIC8qIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9TQ0FMRSAqLworICAgICAgIDI1NSwgLyogR0xfQ09OVk9MVVRJT05fRklMVEVSX0JJQVMgKi8KKyAgICAgIDEyMjksIC8qIEdMX1JFRFVDRSAqLworICAgICAgIDI1OSwgLyogR0xfQ09OVk9MVVRJT05fRk9STUFUICovCisgICAgICAgMjYzLCAvKiBHTF9DT05WT0xVVElPTl9XSURUSCAqLworICAgICAgIDI2MSwgLyogR0xfQ09OVk9MVVRJT05fSEVJR0hUICovCisgICAgICAgODA2LCAvKiBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEggKi8KKyAgICAgICA4MDQsIC8qIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQgKi8KKyAgICAgIDExNDQsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICovCisgICAgICAxMTQwLCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFICovCisgICAgICAxMTM1LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEUgKi8KKyAgICAgIDExMzEsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgKi8KKyAgICAgIDExNDIsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVMgKi8KKyAgICAgIDExMzgsIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBUyAqLworICAgICAgMTEzMywgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgKi8KKyAgICAgIDExMjksIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfQklBUyAqLworICAgICAgIDU1MSwgLyogR0xfSElTVE9HUkFNICovCisgICAgICAxMTkxLCAvKiBHTF9QUk9YWV9ISVNUT0dSQU0gKi8KKyAgICAgICA1NjcsIC8qIEdMX0hJU1RPR1JBTV9XSURUSCAqLworICAgICAgIDU1NywgLyogR0xfSElTVE9HUkFNX0ZPUk1BVCAqLworICAgICAgIDU2MywgLyogR0xfSElTVE9HUkFNX1JFRF9TSVpFICovCisgICAgICAgNTU5LCAvKiBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRSAqLworICAgICAgIDU1NCwgLyogR0xfSElTVE9HUkFNX0JMVUVfU0laRSAqLworICAgICAgIDU1MiwgLyogR0xfSElTVE9HUkFNX0FMUEhBX1NJWkUgKi8KKyAgICAgICA1NjEsIC8qIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRSAqLworICAgICAgIDU2NSwgLyogR0xfSElTVE9HUkFNX1NJTksgKi8KKyAgICAgICA4ODAsIC8qIEdMX01JTk1BWCAqLworICAgICAgIDg4MiwgLyogR0xfTUlOTUFYX0ZPUk1BVCAqLworICAgICAgIDg4NCwgLyogR0xfTUlOTUFYX1NJTksgKi8KKyAgICAgIDE0NDIsIC8qIEdMX1RBQkxFX1RPT19MQVJHRV9FWFQgKi8KKyAgICAgIDE2NTQsIC8qIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgKi8KKyAgICAgIDE2NjMsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgKi8KKyAgICAgIDE2NjUsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgKi8KKyAgICAgIDE2NTksIC8qIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICovCisgICAgICAxNjU2LCAvKiBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMiAqLworICAgICAgMTEwMiwgLyogR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAqLworICAgICAgMTEwMSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICovCisgICAgICAxMTAwLCAvKiBHTF9QT0xZR09OX09GRlNFVF9CSUFTICovCisgICAgICAxMjQ5LCAvKiBHTF9SRVNDQUxFX05PUk1BTCAqLwogICAgICAgICAzNiwgLyogR0xfQUxQSEE0ICovCiAgICAgICAgIDM4LCAvKiBHTF9BTFBIQTggKi8KICAgICAgICAgMzIsIC8qIEdMX0FMUEhBMTIgKi8KICAgICAgICAgMzQsIC8qIEdMX0FMUEhBMTYgKi8KLSAgICAgICA2NzksIC8qIEdMX0xVTUlOQU5DRTQgKi8KLSAgICAgICA2ODUsIC8qIEdMX0xVTUlOQU5DRTggKi8KLSAgICAgICA2NjksIC8qIEdMX0xVTUlOQU5DRTEyICovCi0gICAgICAgNjc1LCAvKiBHTF9MVU1JTkFOQ0UxNiAqLwotICAgICAgIDY4MCwgLyogR0xfTFVNSU5BTkNFNF9BTFBIQTQgKi8KLSAgICAgICA2ODMsIC8qIEdMX0xVTUlOQU5DRTZfQUxQSEEyICovCi0gICAgICAgNjg2LCAvKiBHTF9MVU1JTkFOQ0U4X0FMUEhBOCAqLwotICAgICAgIDY3MiwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEE0ICovCi0gICAgICAgNjcwLCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyICovCi0gICAgICAgNjc2LCAvKiBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2ICovCi0gICAgICAgNTkzLCAvKiBHTF9JTlRFTlNJVFkgKi8KLSAgICAgICA1OTgsIC8qIEdMX0lOVEVOU0lUWTQgKi8KLSAgICAgICA2MDAsIC8qIEdMX0lOVEVOU0lUWTggKi8KLSAgICAgICA1OTQsIC8qIEdMX0lOVEVOU0lUWTEyICovCi0gICAgICAgNTk2LCAvKiBHTF9JTlRFTlNJVFkxNiAqLwotICAgICAgMTI2MywgLyogR0xfUkdCMl9FWFQgKi8KLSAgICAgIDEyNjQsIC8qIEdMX1JHQjQgKi8KLSAgICAgIDEyNjcsIC8qIEdMX1JHQjUgKi8KLSAgICAgIDEyNzEsIC8qIEdMX1JHQjggKi8KLSAgICAgIDEyNTUsIC8qIEdMX1JHQjEwICovCi0gICAgICAxMjU5LCAvKiBHTF9SR0IxMiAqLwotICAgICAgMTI2MSwgLyogR0xfUkdCMTYgKi8KLSAgICAgIDEyNzgsIC8qIEdMX1JHQkEyICovCi0gICAgICAxMjgwLCAvKiBHTF9SR0JBNCAqLwotICAgICAgMTI2OCwgLyogR0xfUkdCNV9BMSAqLwotICAgICAgMTI4NCwgLyogR0xfUkdCQTggKi8KLSAgICAgIDEyNTYsIC8qIEdMX1JHQjEwX0EyICovCi0gICAgICAxMjc0LCAvKiBHTF9SR0JBMTIgKi8KLSAgICAgIDEyNzYsIC8qIEdMX1JHQkExNiAqLwotICAgICAgMTYxNywgLyogR0xfVEVYVFVSRV9SRURfU0laRSAqLwotICAgICAgMTU4OSwgLyogR0xfVEVYVFVSRV9HUkVFTl9TSVpFICovCi0gICAgICAxNTI4LCAvKiBHTF9URVhUVVJFX0JMVUVfU0laRSAqLwotICAgICAgMTUxNSwgLyogR0xfVEVYVFVSRV9BTFBIQV9TSVpFICovCi0gICAgICAxNjAyLCAvKiBHTF9URVhUVVJFX0xVTUlOQU5DRV9TSVpFICovCi0gICAgICAxNTkzLCAvKiBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFICovCi0gICAgICAxMjQ5LCAvKiBHTF9SRVBMQUNFX0VYVCAqLwotICAgICAgMTE5NywgLyogR0xfUFJPWFlfVEVYVFVSRV8xRCAqLwotICAgICAgMTIwMCwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRCAqLwotICAgICAgMTYyMSwgLyogR0xfVEVYVFVSRV9UT09fTEFSR0VfRVhUICovCi0gICAgICAxNjE0LCAvKiBHTF9URVhUVVJFX1BSSU9SSVRZICovCi0gICAgICAxNjE5LCAvKiBHTF9URVhUVVJFX1JFU0lERU5UICovCi0gICAgICAxNTE4LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KLSAgICAgIDE1MjAsIC8qIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotICAgICAgMTUyMiwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzNEICovCi0gICAgICAxMDI4LCAvKiBHTF9QQUNLX1NLSVBfSU1BR0VTICovCi0gICAgICAxMDI0LCAvKiBHTF9QQUNLX0lNQUdFX0hFSUdIVCAqLwotICAgICAgMTY1MCwgLyogR0xfVU5QQUNLX1NLSVBfSU1BR0VTICovCi0gICAgICAxNjQ3LCAvKiBHTF9VTlBBQ0tfSU1BR0VfSEVJR0hUICovCi0gICAgICAxNTE0LCAvKiBHTF9URVhUVVJFXzNEICovCi0gICAgICAxMjAzLCAvKiBHTF9QUk9YWV9URVhUVVJFXzNEICovCi0gICAgICAxNTc2LCAvKiBHTF9URVhUVVJFX0RFUFRIICovCi0gICAgICAxNjI0LCAvKiBHTF9URVhUVVJFX1dSQVBfUiAqLwotICAgICAgIDc5NCwgLyogR0xfTUFYXzNEX1RFWFRVUkVfU0laRSAqLwotICAgICAgMTY4MCwgLyogR0xfVkVSVEVYX0FSUkFZICovCi0gICAgICAgOTU5LCAvKiBHTF9OT1JNQUxfQVJSQVkgKi8KLSAgICAgICAxMzksIC8qIEdMX0NPTE9SX0FSUkFZICovCi0gICAgICAgNTc4LCAvKiBHTF9JTkRFWF9BUlJBWSAqLwotICAgICAgMTU1NSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotICAgICAgIDQxNSwgLyogR0xfRURHRV9GTEFHX0FSUkFZICovCi0gICAgICAxNjg1LCAvKiBHTF9WRVJURVhfQVJSQVlfU0laRSAqLwotICAgICAgMTY4NywgLyogR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KLSAgICAgIDE2ODYsIC8qIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KLSAgICAgICA5NjQsIC8qIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCi0gICAgICAgOTYzLCAvKiBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCi0gICAgICAgMTQzLCAvKiBHTF9DT0xPUl9BUlJBWV9TSVpFICovCi0gICAgICAgMTQ1LCAvKiBHTF9DT0xPUl9BUlJBWV9UWVBFICovCi0gICAgICAgMTQ0LCAvKiBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KLSAgICAgICA1ODMsIC8qIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KLSAgICAgICA1ODIsIC8qIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLwotICAgICAgMTU1OSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0gICAgICAxNTYxLCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KLSAgICAgIDE1NjAsIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0gICAgICAgNDE5LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0gICAgICAxNjg0LCAvKiBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAqLwotICAgICAgIDk2MiwgLyogR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgKi8KLSAgICAgICAxNDIsIC8qIEdMX0NPTE9SX0FSUkFZX1BPSU5URVIgKi8KLSAgICAgICA1ODEsIC8qIEdMX0lOREVYX0FSUkFZX1BPSU5URVIgKi8KLSAgICAgIDE1NTgsIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAqLwotICAgICAgIDQxOCwgLyogR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVIgKi8KLSAgICAgICA5MzgsIC8qIEdMX01VTFRJU0FNUExFICovCi0gICAgICAxMzA2LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKi8KLSAgICAgIDEzMDgsIC8qIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgKi8KLSAgICAgIDEzMTMsIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRSAqLwotICAgICAgMTMxMCwgLyogR0xfU0FNUExFX0JVRkZFUlMgKi8KLSAgICAgIDEzMDEsIC8qIEdMX1NBTVBMRVMgKi8KLSAgICAgIDEzMTcsIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAqLwotICAgICAgMTMxNSwgLyogR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAqLwotICAgICAgIDE3MCwgLyogR0xfQ09MT1JfTUFUUklYICovCi0gICAgICAgMTcyLCAvKiBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KLSAgICAgICA4MDIsIC8qIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KLSAgICAgIDExMjksIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRSAqLwotICAgICAgMTEyNSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fU0NBTEUgKi8KLSAgICAgIDExMjAsIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgKi8KLSAgICAgIDExMTYsIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFICovCi0gICAgICAxMTI3LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAqLwotICAgICAgMTEyMywgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAqLwotICAgICAgMTExOCwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTICovCi0gICAgICAxMTE0LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICovCi0gICAgICAxNTM4LCAvKiBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAqLwotICAgICAgMTIwNCwgLyogR0xfUFJPWFlfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0kgKi8KLSAgICAgIDE1NDAsIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAqLwotICAgICAgICA4MCwgLyogR0xfQkxFTkRfRFNUX1JHQiAqLwotICAgICAgICA4OCwgLyogR0xfQkxFTkRfU1JDX1JHQiAqLwotICAgICAgICA3OSwgLyogR0xfQkxFTkRfRFNUX0FMUEhBICovCi0gICAgICAgIDg3LCAvKiBHTF9CTEVORF9TUkNfQUxQSEEgKi8KLSAgICAgICAxNzYsIC8qIEdMX0NPTE9SX1RBQkxFICovCi0gICAgICAxMTM5LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICovCi0gICAgICAxMTIyLCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAqLwotICAgICAgMTE5MiwgLyogR0xfUFJPWFlfQ09MT1JfVEFCTEUgKi8KLSAgICAgIDExOTYsIC8qIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUgKi8KLSAgICAgIDExOTUsIC8qIEdMX1BST1hZX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFICovCi0gICAgICAgMjAwLCAvKiBHTF9DT0xPUl9UQUJMRV9TQ0FMRSAqLwotICAgICAgIDE4MCwgLyogR0xfQ09MT1JfVEFCTEVfQklBUyAqLwotICAgICAgIDE4NSwgLyogR0xfQ09MT1JfVEFCTEVfRk9STUFUICovCi0gICAgICAgMjAyLCAvKiBHTF9DT0xPUl9UQUJMRV9XSURUSCAqLwotICAgICAgIDE5NywgLyogR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgKi8KLSAgICAgICAxODgsIC8qIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUgKi8KLSAgICAgICAxODIsIC8qIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAqLwotICAgICAgIDE3NywgLyogR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAqLwotICAgICAgIDE5NCwgLyogR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkUgKi8KLSAgICAgICAxOTEsIC8qIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICovCi0gICAgICAgIDcxLCAvKiBHTF9CR1IgKi8KLSAgICAgICAgNzIsIC8qIEdMX0JHUkEgKi8KLSAgICAgICA4MTYsIC8qIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAqLwotICAgICAgIDgxNSwgLyogR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgKi8KLSAgICAgIDE1OTIsIC8qIEdMX1RFWFRVUkVfSU5ERVhfU0laRV9FWFQgKi8KLSAgICAgICAxMzYsIC8qIEdMX0NMSVBfVk9MVU1FX0NMSVBQSU5HX0hJTlRfRVhUICovCi0gICAgICAxMDg2LCAvKiBHTF9QT0lOVF9TSVpFX01JTiAqLwotICAgICAgMTA4MiwgLyogR0xfUE9JTlRfU0laRV9NQVggKi8KLSAgICAgIDEwNzYsIC8qIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgKi8KLSAgICAgIDEwNzIsIC8qIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OICovCi0gICAgICAgMTE4LCAvKiBHTF9DTEFNUF9UT19CT1JERVIgKi8KLSAgICAgICAxMjEsIC8qIEdMX0NMQU1QX1RPX0VER0UgKi8KLSAgICAgIDE2MTMsIC8qIEdMX1RFWFRVUkVfTUlOX0xPRCAqLwotICAgICAgMTYxMSwgLyogR0xfVEVYVFVSRV9NQVhfTE9EICovCi0gICAgICAxNTE3LCAvKiBHTF9URVhUVVJFX0JBU0VfTEVWRUwgKi8KLSAgICAgIDE2MTAsIC8qIEdMX1RFWFRVUkVfTUFYX0xFVkVMICovCi0gICAgICAgNTcyLCAvKiBHTF9JR05PUkVfQk9SREVSX0hQICovCi0gICAgICAgMjQ2LCAvKiBHTF9DT05TVEFOVF9CT1JERVJfSFAgKi8KLSAgICAgIDEyNTAsIC8qIEdMX1JFUExJQ0FURV9CT1JERVJfSFAgKi8KLSAgICAgICAyNTIsIC8qIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAqLwotICAgICAgIDk4NywgLyogR0xfT0NDTFVTSU9OX1RFU1RfSFAgKi8KLSAgICAgICA5ODgsIC8qIEdMX09DQ0xVU0lPTl9URVNUX1JFU1VMVF9IUCAqLwotICAgICAgIDY0MSwgLyogR0xfTElORUFSX0NMSVBNQVBfTElORUFSX1NHSVggKi8KLSAgICAgIDE1MzIsIC8qIEdMX1RFWFRVUkVfQ0xJUE1BUF9DRU5URVJfU0dJWCAqLwotICAgICAgMTUzNCwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggKi8KLSAgICAgIDE1MzYsIC8qIEdMX1RFWFRVUkVfQ0xJUE1BUF9PRkZTRVRfU0dJWCAqLwotICAgICAgMTUzNywgLyogR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLwotICAgICAgMTUzNSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAqLwotICAgICAgMTUzMywgLyogR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggKi8KLSAgICAgICA3OTgsIC8qIEdMX01BWF9DTElQTUFQX0RFUFRIX1NHSVggKi8KLSAgICAgICA3OTksIC8qIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLwotICAgICAgMTE0OSwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1NHSVggKi8KLSAgICAgIDExNTEsIC8qIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfU0NBTEVfU0dJWCAqLwotICAgICAgMTE0OCwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1JBTkdFX1NHSVggKi8KLSAgICAgIDExNTAsIC8qIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfU0NBTEVfUkFOR0VfU0dJWCAqLwotICAgICAgMTYwMCwgLyogR0xfVEVYVFVSRV9MT0RfQklBU19TX1NHSVggKi8KLSAgICAgIDE2MDEsIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYICovCi0gICAgICAxNTk5LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTX1JfU0dJWCAqLwotICAgICAgIDUxOCwgLyogR0xfR0VORVJBVEVfTUlQTUFQICovCi0gICAgICAgNTE5LCAvKiBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAqLwotICAgICAgIDQ4MSwgLyogR0xfRk9HX09GRlNFVF9TR0lYICovCi0gICAgICAgNDgyLCAvKiBHTF9GT0dfT0ZGU0VUX1ZBTFVFX1NHSVggKi8KLSAgICAgIDE1NDYsIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICovCi0gICAgICAxNTQ1LCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfT1BFUkFUT1JfU0dJWCAqLwotICAgICAgMTU5NiwgLyogR0xfVEVYVFVSRV9MRVFVQUxfUl9TR0lYICovCi0gICAgICAxNTg4LCAvKiBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggKi8KLSAgICAgICAzMjMsIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICovCi0gICAgICAgMzI2LCAvKiBHTF9ERVBUSF9DT01QT05FTlQyNCAqLwotICAgICAgIDMyOSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzIgKi8KLSAgICAgICAyNzQsIC8qIEdMX0NVTExfVkVSVEVYX0VYVCAqLwotICAgICAgIDI3NiwgLyogR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAqLwotICAgICAgIDI3NSwgLyogR0xfQ1VMTF9WRVJURVhfRVlFX1BPU0lUSU9OX0VYVCAqLwotICAgICAgMTc0MSwgLyogR0xfV1JBUF9CT1JERVJfU1VOICovCi0gICAgICAxNTM5LCAvKiBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICovCi0gICAgICAgNjM0LCAvKiBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MICovCi0gICAgICAxMzQ1LCAvKiBHTF9TSU5HTEVfQ09MT1IgKi8KLSAgICAgIDEzMzMsIC8qIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SICovCi0gICAgICAxMzQyLCAvKiBHTF9TSEFSRURfVEVYVFVSRV9QQUxFVFRFX0VYVCAqLwotICAgICAgMTY1NSwgLyogR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgKi8KLSAgICAgIDE2NjgsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICovCi0gICAgICAxNjY5LCAvKiBHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVYgKi8KLSAgICAgIDE2NjYsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWICovCi0gICAgICAxNjY0LCAvKiBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAqLwotICAgICAgMTY2MiwgLyogR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWICovCi0gICAgICAxNjYwLCAvKiBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgKi8KLSAgICAgIDE2MDgsIC8qIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1NfU0dJWCAqLwotICAgICAgMTYwOSwgLyogR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICovCi0gICAgICAxNjA3LCAvKiBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggKi8KLSAgICAgICA4ODksIC8qIEdMX01JUlJPUkVEX1JFUEVBVCAqLwotICAgICAgMTI4OSwgLyogR0xfUkdCX1MzVEMgKi8KLSAgICAgIDEyNjYsIC8qIEdMX1JHQjRfUzNUQyAqLwotICAgICAgMTI4OCwgLyogR0xfUkdCQV9TM1RDICovCi0gICAgICAxMjgzLCAvKiBHTF9SR0JBNF9TM1RDICovCi0gICAgICAxMjg2LCAvKiBHTF9SR0JBX0RYVDVfUzNUQyAqLwotICAgICAgMTI4MSwgLyogR0xfUkdCQTRfRFhUNV9TM1RDICovCi0gICAgICAgMjM5LCAvKiBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUICovCi0gICAgICAgMjM0LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAqLwotICAgICAgIDIzNSwgLyogR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgKi8KLSAgICAgICAyMzYsIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICovCi0gICAgICAgOTUwLCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTkVBUkVTVF9TR0lYICovCi0gICAgICAgOTQ5LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggKi8KLSAgICAgICA2NDIsIC8qIEdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWCAqLwotICAgICAgIDQ2OCwgLyogR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFICovCi0gICAgICAgNDYwLCAvKiBHTF9GT0dfQ09PUkQgKi8KLSAgICAgICA0ODQsIC8qIEdMX0ZSQUdNRU5UX0RFUFRIICovCi0gICAgICAgMjgwLCAvKiBHTF9DVVJSRU5UX0ZPR19DT09SRCAqLwotICAgICAgIDQ2NywgLyogR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRSAqLwotICAgICAgIDQ2NiwgLyogR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFICovCi0gICAgICAgNDY1LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICovCi0gICAgICAgNDYyLCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWSAqLwotICAgICAgIDE3NCwgLyogR0xfQ09MT1JfU1VNICovCi0gICAgICAgMjk5LCAvKiBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUiAqLwotICAgICAgMTMyNiwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NJWkUgKi8KLSAgICAgIDEzMjgsIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICovCi0gICAgICAxMzI3LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICovCi0gICAgICAxMzI1LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAqLwotICAgICAgMTMyMiwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZICovCi0gICAgICAgNTI4LCAvKiBHTF9HTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgKi8KKyAgICAgICA2NzcsIC8qIEdMX0xVTUlOQU5DRTQgKi8KKyAgICAgICA2ODMsIC8qIEdMX0xVTUlOQU5DRTggKi8KKyAgICAgICA2NjcsIC8qIEdMX0xVTUlOQU5DRTEyICovCisgICAgICAgNjczLCAvKiBHTF9MVU1JTkFOQ0UxNiAqLworICAgICAgIDY3OCwgLyogR0xfTFVNSU5BTkNFNF9BTFBIQTQgKi8KKyAgICAgICA2ODEsIC8qIEdMX0xVTUlOQU5DRTZfQUxQSEEyICovCisgICAgICAgNjg0LCAvKiBHTF9MVU1JTkFOQ0U4X0FMUEhBOCAqLworICAgICAgIDY3MCwgLyogR0xfTFVNSU5BTkNFMTJfQUxQSEE0ICovCisgICAgICAgNjY4LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyICovCisgICAgICAgNjc0LCAvKiBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2ICovCisgICAgICAgNTkxLCAvKiBHTF9JTlRFTlNJVFkgKi8KKyAgICAgICA1OTYsIC8qIEdMX0lOVEVOU0lUWTQgKi8KKyAgICAgICA1OTgsIC8qIEdMX0lOVEVOU0lUWTggKi8KKyAgICAgICA1OTIsIC8qIEdMX0lOVEVOU0lUWTEyICovCisgICAgICAgNTk0LCAvKiBHTF9JTlRFTlNJVFkxNiAqLworICAgICAgMTI2MSwgLyogR0xfUkdCMl9FWFQgKi8KKyAgICAgIDEyNjIsIC8qIEdMX1JHQjQgKi8KKyAgICAgIDEyNjUsIC8qIEdMX1JHQjUgKi8KKyAgICAgIDEyNjksIC8qIEdMX1JHQjggKi8KKyAgICAgIDEyNTMsIC8qIEdMX1JHQjEwICovCisgICAgICAxMjU3LCAvKiBHTF9SR0IxMiAqLworICAgICAgMTI1OSwgLyogR0xfUkdCMTYgKi8KKyAgICAgIDEyNzYsIC8qIEdMX1JHQkEyICovCisgICAgICAxMjc4LCAvKiBHTF9SR0JBNCAqLworICAgICAgMTI2NiwgLyogR0xfUkdCNV9BMSAqLworICAgICAgMTI4MiwgLyogR0xfUkdCQTggKi8KKyAgICAgIDEyNTQsIC8qIEdMX1JHQjEwX0EyICovCisgICAgICAxMjcyLCAvKiBHTF9SR0JBMTIgKi8KKyAgICAgIDEyNzQsIC8qIEdMX1JHQkExNiAqLworICAgICAgMTYxNSwgLyogR0xfVEVYVFVSRV9SRURfU0laRSAqLworICAgICAgMTU4NywgLyogR0xfVEVYVFVSRV9HUkVFTl9TSVpFICovCisgICAgICAxNTI2LCAvKiBHTF9URVhUVVJFX0JMVUVfU0laRSAqLworICAgICAgMTUxMywgLyogR0xfVEVYVFVSRV9BTFBIQV9TSVpFICovCisgICAgICAxNjAwLCAvKiBHTF9URVhUVVJFX0xVTUlOQU5DRV9TSVpFICovCisgICAgICAxNTkxLCAvKiBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFICovCisgICAgICAxMjQ3LCAvKiBHTF9SRVBMQUNFX0VYVCAqLworICAgICAgMTE5NSwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRCAqLworICAgICAgMTE5OCwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRCAqLworICAgICAgMTYxOSwgLyogR0xfVEVYVFVSRV9UT09fTEFSR0VfRVhUICovCisgICAgICAxNjEyLCAvKiBHTF9URVhUVVJFX1BSSU9SSVRZICovCisgICAgICAxNjE3LCAvKiBHTF9URVhUVVJFX1JFU0lERU5UICovCisgICAgICAxNTE2LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KKyAgICAgIDE1MTgsIC8qIEdMX1RFWFRVUkVfQklORElOR18yRCAqLworICAgICAgMTUyMCwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzNEICovCisgICAgICAxMDI2LCAvKiBHTF9QQUNLX1NLSVBfSU1BR0VTICovCisgICAgICAxMDIyLCAvKiBHTF9QQUNLX0lNQUdFX0hFSUdIVCAqLworICAgICAgMTY0OCwgLyogR0xfVU5QQUNLX1NLSVBfSU1BR0VTICovCisgICAgICAxNjQ1LCAvKiBHTF9VTlBBQ0tfSU1BR0VfSEVJR0hUICovCisgICAgICAxNTEyLCAvKiBHTF9URVhUVVJFXzNEICovCisgICAgICAxMjAxLCAvKiBHTF9QUk9YWV9URVhUVVJFXzNEICovCisgICAgICAxNTc0LCAvKiBHTF9URVhUVVJFX0RFUFRIICovCisgICAgICAxNjIyLCAvKiBHTF9URVhUVVJFX1dSQVBfUiAqLworICAgICAgIDc5MiwgLyogR0xfTUFYXzNEX1RFWFRVUkVfU0laRSAqLworICAgICAgMTY3OCwgLyogR0xfVkVSVEVYX0FSUkFZICovCisgICAgICAgOTU3LCAvKiBHTF9OT1JNQUxfQVJSQVkgKi8KKyAgICAgICAxMzgsIC8qIEdMX0NPTE9SX0FSUkFZICovCisgICAgICAgNTc2LCAvKiBHTF9JTkRFWF9BUlJBWSAqLworICAgICAgMTU1MywgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLworICAgICAgIDQxNCwgLyogR0xfRURHRV9GTEFHX0FSUkFZICovCisgICAgICAxNjgzLCAvKiBHTF9WRVJURVhfQVJSQVlfU0laRSAqLworICAgICAgMTY4NSwgLyogR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KKyAgICAgIDE2ODQsIC8qIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KKyAgICAgICA5NjIsIC8qIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCisgICAgICAgOTYxLCAvKiBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCisgICAgICAgMTQyLCAvKiBHTF9DT0xPUl9BUlJBWV9TSVpFICovCisgICAgICAgMTQ0LCAvKiBHTF9DT0xPUl9BUlJBWV9UWVBFICovCisgICAgICAgMTQzLCAvKiBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KKyAgICAgICA1ODEsIC8qIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KKyAgICAgICA1ODAsIC8qIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLworICAgICAgMTU1NywgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCisgICAgICAxNTU5LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KKyAgICAgIDE1NTgsIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCisgICAgICAgNDE4LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCisgICAgICAxNjgyLCAvKiBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAqLworICAgICAgIDk2MCwgLyogR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgKi8KKyAgICAgICAxNDEsIC8qIEdMX0NPTE9SX0FSUkFZX1BPSU5URVIgKi8KKyAgICAgICA1NzksIC8qIEdMX0lOREVYX0FSUkFZX1BPSU5URVIgKi8KKyAgICAgIDE1NTYsIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAqLworICAgICAgIDQxNywgLyogR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVIgKi8KKyAgICAgICA5MzYsIC8qIEdMX01VTFRJU0FNUExFICovCisgICAgICAxMzA0LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKi8KKyAgICAgIDEzMDYsIC8qIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgKi8KKyAgICAgIDEzMTEsIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRSAqLworICAgICAgMTMwOCwgLyogR0xfU0FNUExFX0JVRkZFUlMgKi8KKyAgICAgIDEyOTksIC8qIEdMX1NBTVBMRVMgKi8KKyAgICAgIDEzMTUsIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAqLworICAgICAgMTMxMywgLyogR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAqLworICAgICAgIDE2OSwgLyogR0xfQ09MT1JfTUFUUklYICovCisgICAgICAgMTcxLCAvKiBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KKyAgICAgICA4MDAsIC8qIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KKyAgICAgIDExMjcsIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRSAqLworICAgICAgMTEyMywgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fU0NBTEUgKi8KKyAgICAgIDExMTgsIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgKi8KKyAgICAgIDExMTQsIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFICovCisgICAgICAxMTI1LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAqLworICAgICAgMTEyMSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAqLworICAgICAgMTExNiwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTICovCisgICAgICAxMTEyLCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICovCisgICAgICAxNTM2LCAvKiBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAqLworICAgICAgMTIwMiwgLyogR0xfUFJPWFlfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0kgKi8KKyAgICAgIDE1MzgsIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAqLworICAgICAgICA3OSwgLyogR0xfQkxFTkRfRFNUX1JHQiAqLworICAgICAgICA4NywgLyogR0xfQkxFTkRfU1JDX1JHQiAqLworICAgICAgICA3OCwgLyogR0xfQkxFTkRfRFNUX0FMUEhBICovCisgICAgICAgIDg2LCAvKiBHTF9CTEVORF9TUkNfQUxQSEEgKi8KKyAgICAgICAxNzUsIC8qIEdMX0NPTE9SX1RBQkxFICovCisgICAgICAxMTM3LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICovCisgICAgICAxMTIwLCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAqLworICAgICAgMTE5MCwgLyogR0xfUFJPWFlfQ09MT1JfVEFCTEUgKi8KKyAgICAgIDExOTQsIC8qIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUgKi8KKyAgICAgIDExOTMsIC8qIEdMX1BST1hZX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFICovCisgICAgICAgMTk5LCAvKiBHTF9DT0xPUl9UQUJMRV9TQ0FMRSAqLworICAgICAgIDE3OSwgLyogR0xfQ09MT1JfVEFCTEVfQklBUyAqLworICAgICAgIDE4NCwgLyogR0xfQ09MT1JfVEFCTEVfRk9STUFUICovCisgICAgICAgMjAxLCAvKiBHTF9DT0xPUl9UQUJMRV9XSURUSCAqLworICAgICAgIDE5NiwgLyogR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgKi8KKyAgICAgICAxODcsIC8qIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUgKi8KKyAgICAgICAxODEsIC8qIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAqLworICAgICAgIDE3NiwgLyogR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAqLworICAgICAgIDE5MywgLyogR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkUgKi8KKyAgICAgICAxOTAsIC8qIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICovCisgICAgICAgIDcwLCAvKiBHTF9CR1IgKi8KKyAgICAgICAgNzEsIC8qIEdMX0JHUkEgKi8KKyAgICAgICA4MTQsIC8qIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAqLworICAgICAgIDgxMywgLyogR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgKi8KKyAgICAgIDE1OTAsIC8qIEdMX1RFWFRVUkVfSU5ERVhfU0laRV9FWFQgKi8KKyAgICAgICAxMzUsIC8qIEdMX0NMSVBfVk9MVU1FX0NMSVBQSU5HX0hJTlRfRVhUICovCisgICAgICAxMDg0LCAvKiBHTF9QT0lOVF9TSVpFX01JTiAqLworICAgICAgMTA4MCwgLyogR0xfUE9JTlRfU0laRV9NQVggKi8KKyAgICAgIDEwNzQsIC8qIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgKi8KKyAgICAgIDEwNzAsIC8qIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OICovCisgICAgICAgMTE3LCAvKiBHTF9DTEFNUF9UT19CT1JERVIgKi8KKyAgICAgICAxMjAsIC8qIEdMX0NMQU1QX1RPX0VER0UgKi8KKyAgICAgIDE2MTEsIC8qIEdMX1RFWFRVUkVfTUlOX0xPRCAqLworICAgICAgMTYwOSwgLyogR0xfVEVYVFVSRV9NQVhfTE9EICovCisgICAgICAxNTE1LCAvKiBHTF9URVhUVVJFX0JBU0VfTEVWRUwgKi8KKyAgICAgIDE2MDgsIC8qIEdMX1RFWFRVUkVfTUFYX0xFVkVMICovCisgICAgICAgNTcwLCAvKiBHTF9JR05PUkVfQk9SREVSX0hQICovCisgICAgICAgMjQ1LCAvKiBHTF9DT05TVEFOVF9CT1JERVJfSFAgKi8KKyAgICAgIDEyNDgsIC8qIEdMX1JFUExJQ0FURV9CT1JERVJfSFAgKi8KKyAgICAgICAyNTEsIC8qIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAqLworICAgICAgIDk4NSwgLyogR0xfT0NDTFVTSU9OX1RFU1RfSFAgKi8KKyAgICAgICA5ODYsIC8qIEdMX09DQ0xVU0lPTl9URVNUX1JFU1VMVF9IUCAqLworICAgICAgIDYzOSwgLyogR0xfTElORUFSX0NMSVBNQVBfTElORUFSX1NHSVggKi8KKyAgICAgIDE1MzAsIC8qIEdMX1RFWFRVUkVfQ0xJUE1BUF9DRU5URVJfU0dJWCAqLworICAgICAgMTUzMiwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggKi8KKyAgICAgIDE1MzQsIC8qIEdMX1RFWFRVUkVfQ0xJUE1BUF9PRkZTRVRfU0dJWCAqLworICAgICAgMTUzNSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLworICAgICAgMTUzMywgLyogR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAqLworICAgICAgMTUzMSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggKi8KKyAgICAgICA3OTYsIC8qIEdMX01BWF9DTElQTUFQX0RFUFRIX1NHSVggKi8KKyAgICAgICA3OTcsIC8qIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLworICAgICAgMTE0NywgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1NHSVggKi8KKyAgICAgIDExNDksIC8qIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfU0NBTEVfU0dJWCAqLworICAgICAgMTE0NiwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1JBTkdFX1NHSVggKi8KKyAgICAgIDExNDgsIC8qIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfU0NBTEVfUkFOR0VfU0dJWCAqLworICAgICAgMTU5OCwgLyogR0xfVEVYVFVSRV9MT0RfQklBU19TX1NHSVggKi8KKyAgICAgIDE1OTksIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYICovCisgICAgICAxNTk3LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTX1JfU0dJWCAqLworICAgICAgIDUxNiwgLyogR0xfR0VORVJBVEVfTUlQTUFQICovCisgICAgICAgNTE3LCAvKiBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAqLworICAgICAgIDQ3OSwgLyogR0xfRk9HX09GRlNFVF9TR0lYICovCisgICAgICAgNDgwLCAvKiBHTF9GT0dfT0ZGU0VUX1ZBTFVFX1NHSVggKi8KKyAgICAgIDE1NDQsIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICovCisgICAgICAxNTQzLCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfT1BFUkFUT1JfU0dJWCAqLworICAgICAgMTU5NCwgLyogR0xfVEVYVFVSRV9MRVFVQUxfUl9TR0lYICovCisgICAgICAxNTg2LCAvKiBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggKi8KKyAgICAgICAzMjIsIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICovCisgICAgICAgMzI1LCAvKiBHTF9ERVBUSF9DT01QT05FTlQyNCAqLworICAgICAgIDMyOCwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzIgKi8KKyAgICAgICAyNzMsIC8qIEdMX0NVTExfVkVSVEVYX0VYVCAqLworICAgICAgIDI3NSwgLyogR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAqLworICAgICAgIDI3NCwgLyogR0xfQ1VMTF9WRVJURVhfRVlFX1BPU0lUSU9OX0VYVCAqLworICAgICAgMTczOSwgLyogR0xfV1JBUF9CT1JERVJfU1VOICovCisgICAgICAxNTM3LCAvKiBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICovCisgICAgICAgNjMyLCAvKiBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MICovCisgICAgICAxMzQzLCAvKiBHTF9TSU5HTEVfQ09MT1IgKi8KKyAgICAgIDEzMzEsIC8qIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SICovCisgICAgICAxMzQwLCAvKiBHTF9TSEFSRURfVEVYVFVSRV9QQUxFVFRFX0VYVCAqLworICAgICAgMTY1MywgLyogR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgKi8KKyAgICAgIDE2NjYsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICovCisgICAgICAxNjY3LCAvKiBHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVYgKi8KKyAgICAgIDE2NjQsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWICovCisgICAgICAxNjYyLCAvKiBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAqLworICAgICAgMTY2MCwgLyogR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWICovCisgICAgICAxNjU4LCAvKiBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgKi8KKyAgICAgIDE2MDYsIC8qIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1NfU0dJWCAqLworICAgICAgMTYwNywgLyogR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICovCisgICAgICAxNjA1LCAvKiBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggKi8KKyAgICAgICA4ODcsIC8qIEdMX01JUlJPUkVEX1JFUEVBVCAqLworICAgICAgMTI4NywgLyogR0xfUkdCX1MzVEMgKi8KKyAgICAgIDEyNjQsIC8qIEdMX1JHQjRfUzNUQyAqLworICAgICAgMTI4NiwgLyogR0xfUkdCQV9TM1RDICovCisgICAgICAxMjgxLCAvKiBHTF9SR0JBNF9TM1RDICovCisgICAgICAxMjg0LCAvKiBHTF9SR0JBX0RYVDVfUzNUQyAqLworICAgICAgMTI3OSwgLyogR0xfUkdCQTRfRFhUNV9TM1RDICovCisgICAgICAgMjM4LCAvKiBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUICovCisgICAgICAgMjMzLCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAqLworICAgICAgIDIzNCwgLyogR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgKi8KKyAgICAgICAyMzUsIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICovCisgICAgICAgOTQ4LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTkVBUkVTVF9TR0lYICovCisgICAgICAgOTQ3LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggKi8KKyAgICAgICA2NDAsIC8qIEdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWCAqLworICAgICAgIDQ2NiwgLyogR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFICovCisgICAgICAgNDU4LCAvKiBHTF9GT0dfQ09PUkQgKi8KKyAgICAgICA0ODIsIC8qIEdMX0ZSQUdNRU5UX0RFUFRIICovCisgICAgICAgMjc5LCAvKiBHTF9DVVJSRU5UX0ZPR19DT09SRCAqLworICAgICAgIDQ2NSwgLyogR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRSAqLworICAgICAgIDQ2NCwgLyogR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFICovCisgICAgICAgNDYzLCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICovCisgICAgICAgNDYwLCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWSAqLworICAgICAgIDE3MywgLyogR0xfQ09MT1JfU1VNICovCisgICAgICAgMjk4LCAvKiBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUiAqLworICAgICAgMTMyNCwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NJWkUgKi8KKyAgICAgIDEzMjYsIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICovCisgICAgICAxMzI1LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICovCisgICAgICAxMzIzLCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAqLworICAgICAgMTMyMCwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZICovCisgICAgICAgNTI2LCAvKiBHTF9HTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgKi8KICAgICAgICAgMjgsIC8qIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAqLwogICAgICAgICAyNywgLyogR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICovCi0gICAgICAxNDQ2LCAvKiBHTF9URVhUVVJFMCAqLwotICAgICAgMTQ0OCwgLyogR0xfVEVYVFVSRTEgKi8KLSAgICAgIDE0NzAsIC8qIEdMX1RFWFRVUkUyICovCi0gICAgICAxNDkyLCAvKiBHTF9URVhUVVJFMyAqLwotICAgICAgMTQ5OCwgLyogR0xfVEVYVFVSRTQgKi8KLSAgICAgIDE1MDAsIC8qIEdMX1RFWFRVUkU1ICovCi0gICAgICAxNTAyLCAvKiBHTF9URVhUVVJFNiAqLwotICAgICAgMTUwNCwgLyogR0xfVEVYVFVSRTcgKi8KLSAgICAgIDE1MDYsIC8qIEdMX1RFWFRVUkU4ICovCi0gICAgICAxNTA4LCAvKiBHTF9URVhUVVJFOSAqLwotICAgICAgMTQ0OSwgLyogR0xfVEVYVFVSRTEwICovCi0gICAgICAxNDUxLCAvKiBHTF9URVhUVVJFMTEgKi8KLSAgICAgIDE0NTMsIC8qIEdMX1RFWFRVUkUxMiAqLwotICAgICAgMTQ1NSwgLyogR0xfVEVYVFVSRTEzICovCi0gICAgICAxNDU3LCAvKiBHTF9URVhUVVJFMTQgKi8KLSAgICAgIDE0NTksIC8qIEdMX1RFWFRVUkUxNSAqLwotICAgICAgMTQ2MSwgLyogR0xfVEVYVFVSRTE2ICovCi0gICAgICAxNDYzLCAvKiBHTF9URVhUVVJFMTcgKi8KLSAgICAgIDE0NjUsIC8qIEdMX1RFWFRVUkUxOCAqLwotICAgICAgMTQ2NywgLyogR0xfVEVYVFVSRTE5ICovCi0gICAgICAxNDcxLCAvKiBHTF9URVhUVVJFMjAgKi8KLSAgICAgIDE0NzMsIC8qIEdMX1RFWFRVUkUyMSAqLwotICAgICAgMTQ3NSwgLyogR0xfVEVYVFVSRTIyICovCi0gICAgICAxNDc3LCAvKiBHTF9URVhUVVJFMjMgKi8KLSAgICAgIDE0NzksIC8qIEdMX1RFWFRVUkUyNCAqLwotICAgICAgMTQ4MSwgLyogR0xfVEVYVFVSRTI1ICovCi0gICAgICAxNDgzLCAvKiBHTF9URVhUVVJFMjYgKi8KLSAgICAgIDE0ODUsIC8qIEdMX1RFWFRVUkUyNyAqLwotICAgICAgMTQ4NywgLyogR0xfVEVYVFVSRTI4ICovCi0gICAgICAxNDg5LCAvKiBHTF9URVhUVVJFMjkgKi8KLSAgICAgIDE0OTMsIC8qIEdMX1RFWFRVUkUzMCAqLwotICAgICAgMTQ5NSwgLyogR0xfVEVYVFVSRTMxICovCisgICAgICAxNDQ0LCAvKiBHTF9URVhUVVJFMCAqLworICAgICAgMTQ0NiwgLyogR0xfVEVYVFVSRTEgKi8KKyAgICAgIDE0NjgsIC8qIEdMX1RFWFRVUkUyICovCisgICAgICAxNDkwLCAvKiBHTF9URVhUVVJFMyAqLworICAgICAgMTQ5NiwgLyogR0xfVEVYVFVSRTQgKi8KKyAgICAgIDE0OTgsIC8qIEdMX1RFWFRVUkU1ICovCisgICAgICAxNTAwLCAvKiBHTF9URVhUVVJFNiAqLworICAgICAgMTUwMiwgLyogR0xfVEVYVFVSRTcgKi8KKyAgICAgIDE1MDQsIC8qIEdMX1RFWFRVUkU4ICovCisgICAgICAxNTA2LCAvKiBHTF9URVhUVVJFOSAqLworICAgICAgMTQ0NywgLyogR0xfVEVYVFVSRTEwICovCisgICAgICAxNDQ5LCAvKiBHTF9URVhUVVJFMTEgKi8KKyAgICAgIDE0NTEsIC8qIEdMX1RFWFRVUkUxMiAqLworICAgICAgMTQ1MywgLyogR0xfVEVYVFVSRTEzICovCisgICAgICAxNDU1LCAvKiBHTF9URVhUVVJFMTQgKi8KKyAgICAgIDE0NTcsIC8qIEdMX1RFWFRVUkUxNSAqLworICAgICAgMTQ1OSwgLyogR0xfVEVYVFVSRTE2ICovCisgICAgICAxNDYxLCAvKiBHTF9URVhUVVJFMTcgKi8KKyAgICAgIDE0NjMsIC8qIEdMX1RFWFRVUkUxOCAqLworICAgICAgMTQ2NSwgLyogR0xfVEVYVFVSRTE5ICovCisgICAgICAxNDY5LCAvKiBHTF9URVhUVVJFMjAgKi8KKyAgICAgIDE0NzEsIC8qIEdMX1RFWFRVUkUyMSAqLworICAgICAgMTQ3MywgLyogR0xfVEVYVFVSRTIyICovCisgICAgICAxNDc1LCAvKiBHTF9URVhUVVJFMjMgKi8KKyAgICAgIDE0NzcsIC8qIEdMX1RFWFRVUkUyNCAqLworICAgICAgMTQ3OSwgLyogR0xfVEVYVFVSRTI1ICovCisgICAgICAxNDgxLCAvKiBHTF9URVhUVVJFMjYgKi8KKyAgICAgIDE0ODMsIC8qIEdMX1RFWFRVUkUyNyAqLworICAgICAgMTQ4NSwgLyogR0xfVEVYVFVSRTI4ICovCisgICAgICAxNDg3LCAvKiBHTF9URVhUVVJFMjkgKi8KKyAgICAgIDE0OTEsIC8qIEdMX1RFWFRVUkUzMCAqLworICAgICAgMTQ5MywgLyogR0xfVEVYVFVSRTMxICovCiAgICAgICAgIDE4LCAvKiBHTF9BQ1RJVkVfVEVYVFVSRSAqLwotICAgICAgIDEyNCwgLyogR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFICovCi0gICAgICAgODY3LCAvKiBHTF9NQVhfVEVYVFVSRV9VTklUUyAqLwotICAgICAgMTYzNCwgLyogR0xfVFJBTlNQT1NFX01PREVMVklFV19NQVRSSVggKi8KLSAgICAgIDE2MzcsIC8qIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWCAqLwotICAgICAgMTYzOSwgLyogR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICovCi0gICAgICAxNjMxLCAvKiBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYICovCi0gICAgICAxNDM0LCAvKiBHTF9TVUJUUkFDVCAqLwotICAgICAgIDg1NiwgLyogR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCAqLwotICAgICAgIDIyMiwgLyogR0xfQ09NUFJFU1NFRF9BTFBIQSAqLwotICAgICAgIDIyNiwgLyogR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0UgKi8KLSAgICAgICAyMjcsIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBICovCi0gICAgICAgMjI0LCAvKiBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAqLwotICAgICAgIDIzMCwgLyogR0xfQ09NUFJFU1NFRF9SR0IgKi8KLSAgICAgICAyMzEsIC8qIEdMX0NPTVBSRVNTRURfUkdCQSAqLwotICAgICAgMTU1MywgLyogR0xfVEVYVFVSRV9DT01QUkVTU0lPTl9ISU5UICovCi0gICAgICAxNjE1LCAvKiBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgKi8KLSAgICAgIDE1MjUsIC8qIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVfQVJCICovCi0gICAgICAxMjA3LCAvKiBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgKi8KLSAgICAgICA4NTQsIC8qIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAqLwotICAgICAgIDMzNSwgLyogR0xfREVQVEhfU1RFTkNJTF9OViAqLwotICAgICAgMTY1OSwgLyogR0xfVU5TSUdORURfSU5UXzI0XzhfTlYgKi8KLSAgICAgICA4NjMsIC8qIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICovCi0gICAgICAxNjA2LCAvKiBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAqLwotICAgICAgIDg2NCwgLyogR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICovCi0gICAgICAxNTgyLCAvKiBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MICovCi0gICAgICAxNTk3LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTICovCi0gICAgICAgMjA3LCAvKiBHTF9DT01CSU5FNCAqLwotICAgICAgIDg1NywgLyogR0xfTUFYX1NISU5JTkVTU19OViAqLwotICAgICAgIDg1OCwgLyogR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgKi8KLSAgICAgICA1NzYsIC8qIEdMX0lOQ1JfV1JBUCAqLwotICAgICAgIDMxMCwgLyogR0xfREVDUl9XUkFQICovCi0gICAgICAgOTA5LCAvKiBHTF9NT0RFTFZJRVcxX0FSQiAqLwotICAgICAgIDk2NSwgLyogR0xfTk9STUFMX01BUCAqLwotICAgICAgMTIzNiwgLyogR0xfUkVGTEVDVElPTl9NQVAgKi8KLSAgICAgIDE1NjIsIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVAgKi8KLSAgICAgIDE1MjMsIC8qIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAqLwotICAgICAgMTU3MCwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICovCi0gICAgICAxNTY0LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggKi8KLSAgICAgIDE1NzIsIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAqLwotICAgICAgMTU2NiwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICovCi0gICAgICAxNTc0LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogKi8KLSAgICAgIDE1NjgsIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAqLwotICAgICAgMTIwNSwgLyogR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUCAqLwotICAgICAgIDgxMCwgLyogR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAqLwotICAgICAgIDk0NCwgLyogR0xfTVVMVElTQU1QTEVfRklMVEVSX0hJTlRfTlYgKi8KLSAgICAgICA0NzYsIC8qIEdMX0ZPR19ESVNUQU5DRV9NT0RFX05WICovCi0gICAgICAgNDM1LCAvKiBHTF9FWUVfUkFESUFMX05WICovCi0gICAgICAgNDM0LCAvKiBHTF9FWUVfUExBTkVfQUJTT0xVVEVfTlYgKi8KLSAgICAgICAyMDYsIC8qIEdMX0NPTUJJTkUgKi8KLSAgICAgICAyMTMsIC8qIEdMX0NPTUJJTkVfUkdCICovCi0gICAgICAgMjA4LCAvKiBHTF9DT01CSU5FX0FMUEhBICovCi0gICAgICAxMjkwLCAvKiBHTF9SR0JfU0NBTEUgKi8KKyAgICAgICAxMjMsIC8qIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAqLworICAgICAgIDg2NSwgLyogR0xfTUFYX1RFWFRVUkVfVU5JVFMgKi8KKyAgICAgIDE2MzIsIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYICovCisgICAgICAxNjM1LCAvKiBHTF9UUkFOU1BPU0VfUFJPSkVDVElPTl9NQVRSSVggKi8KKyAgICAgIDE2MzcsIC8qIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWCAqLworICAgICAgMTYyOSwgLyogR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWCAqLworICAgICAgMTQzMiwgLyogR0xfU1VCVFJBQ1QgKi8KKyAgICAgICA4NTQsIC8qIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9FWFQgKi8KKyAgICAgICAyMjEsIC8qIEdMX0NPTVBSRVNTRURfQUxQSEEgKi8KKyAgICAgICAyMjUsIC8qIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFICovCisgICAgICAgMjI2LCAvKiBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQSAqLworICAgICAgIDIyMywgLyogR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFkgKi8KKyAgICAgICAyMjksIC8qIEdMX0NPTVBSRVNTRURfUkdCICovCisgICAgICAgMjMwLCAvKiBHTF9DT01QUkVTU0VEX1JHQkEgKi8KKyAgICAgIDE1NTEsIC8qIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVCAqLworICAgICAgMTYxMywgLyogR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCisgICAgICAxNTIzLCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFX0FSQiAqLworICAgICAgMTIwNSwgLyogR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICovCisgICAgICAgODUyLCAvKiBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9BUkIgKi8KKyAgICAgICAzMzQsIC8qIEdMX0RFUFRIX1NURU5DSUxfTlYgKi8KKyAgICAgIDE2NTcsIC8qIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICovCisgICAgICAgODYxLCAvKiBHTF9NQVhfVEVYVFVSRV9MT0RfQklBUyAqLworICAgICAgMTYwNCwgLyogR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKi8KKyAgICAgICA4NjIsIC8qIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAqLworICAgICAgMTU4MCwgLyogR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTCAqLworICAgICAgMTU5NSwgLyogR0xfVEVYVFVSRV9MT0RfQklBUyAqLworICAgICAgIDIwNiwgLyogR0xfQ09NQklORTQgKi8KKyAgICAgICA4NTUsIC8qIEdMX01BWF9TSElOSU5FU1NfTlYgKi8KKyAgICAgICA4NTYsIC8qIEdMX01BWF9TUE9UX0VYUE9ORU5UX05WICovCisgICAgICAgNTc0LCAvKiBHTF9JTkNSX1dSQVAgKi8KKyAgICAgICAzMDksIC8qIEdMX0RFQ1JfV1JBUCAqLworICAgICAgIDkwNywgLyogR0xfTU9ERUxWSUVXMV9BUkIgKi8KKyAgICAgICA5NjMsIC8qIEdMX05PUk1BTF9NQVAgKi8KKyAgICAgIDEyMzQsIC8qIEdMX1JFRkxFQ1RJT05fTUFQICovCisgICAgICAxNTYwLCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQICovCisgICAgICAxNTIxLCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgKi8KKyAgICAgIDE1NjgsIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAqLworICAgICAgMTU2MiwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICovCisgICAgICAxNTcwLCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgKi8KKyAgICAgIDE1NjQsIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAqLworICAgICAgMTU3MiwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICovCisgICAgICAxNTY2LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogKi8KKyAgICAgIDEyMDMsIC8qIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgKi8KKyAgICAgICA4MDgsIC8qIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgKi8KKyAgICAgICA5NDIsIC8qIEdMX01VTFRJU0FNUExFX0ZJTFRFUl9ISU5UX05WICovCisgICAgICAgNDc0LCAvKiBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAqLworICAgICAgIDQzMywgLyogR0xfRVlFX1JBRElBTF9OViAqLworICAgICAgIDQzMiwgLyogR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WICovCisgICAgICAgMjA1LCAvKiBHTF9DT01CSU5FICovCisgICAgICAgMjEyLCAvKiBHTF9DT01CSU5FX1JHQiAqLworICAgICAgIDIwNywgLyogR0xfQ09NQklORV9BTFBIQSAqLworICAgICAgMTI4OCwgLyogR0xfUkdCX1NDQUxFICovCiAgICAgICAgIDI0LCAvKiBHTF9BRERfU0lHTkVEICovCi0gICAgICAgNjAzLCAvKiBHTF9JTlRFUlBPTEFURSAqLwotICAgICAgIDI0MSwgLyogR0xfQ09OU1RBTlQgKi8KLSAgICAgIDExNTUsIC8qIEdMX1BSSU1BUllfQ09MT1IgKi8KLSAgICAgIDExNTIsIC8qIEdMX1BSRVZJT1VTICovCi0gICAgICAxMzU2LCAvKiBHTF9TT1VSQ0UwX1JHQiAqLwotICAgICAgMTM2MiwgLyogR0xfU09VUkNFMV9SR0IgKi8KLSAgICAgIDEzNjgsIC8qIEdMX1NPVVJDRTJfUkdCICovCi0gICAgICAxMzcyLCAvKiBHTF9TT1VSQ0UzX1JHQl9OViAqLwotICAgICAgMTM1MywgLyogR0xfU09VUkNFMF9BTFBIQSAqLwotICAgICAgMTM1OSwgLyogR0xfU09VUkNFMV9BTFBIQSAqLwotICAgICAgMTM2NSwgLyogR0xfU09VUkNFMl9BTFBIQSAqLwotICAgICAgMTM3MSwgLyogR0xfU09VUkNFM19BTFBIQV9OViAqLwotICAgICAgMTAwMSwgLyogR0xfT1BFUkFORDBfUkdCICovCi0gICAgICAxMDA3LCAvKiBHTF9PUEVSQU5EMV9SR0IgKi8KLSAgICAgIDEwMTMsIC8qIEdMX09QRVJBTkQyX1JHQiAqLwotICAgICAgMTAxNywgLyogR0xfT1BFUkFORDNfUkdCX05WICovCi0gICAgICAgOTk4LCAvKiBHTF9PUEVSQU5EMF9BTFBIQSAqLwotICAgICAgMTAwNCwgLyogR0xfT1BFUkFORDFfQUxQSEEgKi8KLSAgICAgIDEwMTAsIC8qIEdMX09QRVJBTkQyX0FMUEhBICovCi0gICAgICAxMDE2LCAvKiBHTF9PUEVSQU5EM19BTFBIQV9OViAqLwotICAgICAgMTY4MSwgLyogR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfQVBQTEUgKi8KLSAgICAgIDE3NDUsIC8qIEdMX1lDQkNSXzQyMl9BUFBMRSAqLwotICAgICAgMTY3MCwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X0FQUExFICovCi0gICAgICAxNjcyLCAvKiBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX0FQUExFICovCi0gICAgICAxMzQ3LCAvKiBHTF9TTElDRV9BQ0NVTV9TVU4gKi8KLSAgICAgIDEyMTIsIC8qIEdMX1FVQURfTUVTSF9TVU4gKi8KLSAgICAgIDE2NDMsIC8qIEdMX1RSSUFOR0xFX01FU0hfU1VOICovCi0gICAgICAxNzE5LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9BUkIgKi8KLSAgICAgIDE3MzAsIC8qIEdMX1ZFUlRFWF9TVEFURV9QUk9HUkFNX05WICovCi0gICAgICAxNzA2LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgKi8KLSAgICAgIDE3MTIsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAqLwotICAgICAgMTcxNCwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgKi8KLSAgICAgIDE3MTYsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAqLwotICAgICAgIDMwMSwgLyogR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICovCi0gICAgICAxMTY4LCAvKiBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgKi8KLSAgICAgIDExODIsIC8qIEdMX1BST0dSQU1fU1RSSU5HX0FSQiAqLwotICAgICAgIDkzMSwgLyogR0xfTU9ERUxWSUVXX1BST0pFQ1RJT05fTlYgKi8KLSAgICAgICA1NzEsIC8qIEdMX0lERU5USVRZX05WICovCi0gICAgICAgNjE2LCAvKiBHTF9JTlZFUlNFX05WICovCi0gICAgICAxNjM2LCAvKiBHTF9UUkFOU1BPU0VfTlYgKi8KLSAgICAgICA2MTcsIC8qIEdMX0lOVkVSU0VfVFJBTlNQT1NFX05WICovCi0gICAgICAgODQwLCAvKiBHTF9NQVhfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCICovCi0gICAgICAgODM5LCAvKiBHTF9NQVhfUFJPR1JBTV9NQVRSSUNFU19BUkIgKi8KLSAgICAgICA3NDcsIC8qIEdMX01BVFJJWDBfTlYgKi8KLSAgICAgICA3NTksIC8qIEdMX01BVFJJWDFfTlYgKi8KLSAgICAgICA3NzEsIC8qIEdMX01BVFJJWDJfTlYgKi8KLSAgICAgICA3NzUsIC8qIEdMX01BVFJJWDNfTlYgKi8KLSAgICAgICA3NzcsIC8qIEdMX01BVFJJWDRfTlYgKi8KLSAgICAgICA3NzksIC8qIEdMX01BVFJJWDVfTlYgKi8KLSAgICAgICA3ODEsIC8qIEdMX01BVFJJWDZfTlYgKi8KLSAgICAgICA3ODMsIC8qIEdMX01BVFJJWDdfTlYgKi8KLSAgICAgICAyODYsIC8qIEdMX0NVUlJFTlRfTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAqLwotICAgICAgIDI4MywgLyogR0xfQ1VSUkVOVF9NQVRSSVhfQVJCICovCi0gICAgICAxNzIyLCAvKiBHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9TSVpFICovCi0gICAgICAxNzI1LCAvKiBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAqLwotICAgICAgMTE4MCwgLyogR0xfUFJPR1JBTV9QQVJBTUVURVJfTlYgKi8KLSAgICAgIDE3MTAsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAqLwotICAgICAgMTE4NCwgLyogR0xfUFJPR1JBTV9UQVJHRVRfTlYgKi8KLSAgICAgIDExODEsIC8qIEdMX1BST0dSQU1fUkVTSURFTlRfTlYgKi8KLSAgICAgIDE2MjgsIC8qIEdMX1RSQUNLX01BVFJJWF9OViAqLwotICAgICAgMTYyOSwgLyogR0xfVFJBQ0tfTUFUUklYX1RSQU5TRk9STV9OViAqLwotICAgICAgMTcyMCwgLyogR0xfVkVSVEVYX1BST0dSQU1fQklORElOR19OViAqLwotICAgICAgMTE2MiwgLyogR0xfUFJPR1JBTV9FUlJPUl9QT1NJVElPTl9BUkIgKi8KLSAgICAgICAzMjAsIC8qIEdMX0RFUFRIX0NMQU1QX05WICovCi0gICAgICAxNjg4LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMF9OViAqLwotICAgICAgMTY5NSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTFfTlYgKi8KLSAgICAgIDE2OTYsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkyX05WICovCi0gICAgICAxNjk3LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZM19OViAqLwotICAgICAgMTY5OCwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTRfTlYgKi8KLSAgICAgIDE2OTksIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk1X05WICovCi0gICAgICAxNzAwLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNl9OViAqLwotICAgICAgMTcwMSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTdfTlYgKi8KLSAgICAgIDE3MDIsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk4X05WICovCi0gICAgICAxNzAzLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOV9OViAqLwotICAgICAgMTY4OSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEwX05WICovCi0gICAgICAxNjkwLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTFfTlYgKi8KLSAgICAgIDE2OTEsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAqLwotICAgICAgMTY5MiwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEzX05WICovCi0gICAgICAxNjkzLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTRfTlYgKi8KLSAgICAgIDE2OTQsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAqLwotICAgICAgIDcwMSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMF80X05WICovCi0gICAgICAgNzA4LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxXzRfTlYgKi8KLSAgICAgICA3MDksIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjJfNF9OViAqLwotICAgICAgIDcxMCwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCM180X05WICovCi0gICAgICAgNzExLCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI0XzRfTlYgKi8KLSAgICAgICA3MTIsIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjVfNF9OViAqLwotICAgICAgIDcxMywgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCNl80X05WICovCi0gICAgICAgNzE0LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI3XzRfTlYgKi8KLSAgICAgICA3MTUsIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjhfNF9OViAqLwotICAgICAgIDcxNiwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCOV80X05WICovCi0gICAgICAgNzAyLCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMF80X05WICovCi0gICAgICAgNzAzLCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMV80X05WICovCi0gICAgICAgNzA0LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICovCi0gICAgICAgNzA1LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxM180X05WICovCi0gICAgICAgNzA2LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNF80X05WICovCi0gICAgICAgNzA3LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICovCi0gICAgICAgNzI4LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlYgKi8KLSAgICAgICA3MzUsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjFfNF9OViAqLwotICAgICAgIDczNiwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMl80X05WICovCi0gICAgICAgNzM3LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlYgKi8KLSAgICAgICA3MzgsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjRfNF9OViAqLwotICAgICAgIDczOSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCNV80X05WICovCi0gICAgICAgNzQwLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlYgKi8KLSAgICAgIDExNjEsIC8qIEdMX1BST0dSQU1fQklORElOR19BUkIgKi8KLSAgICAgICA3NDIsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjhfNF9OViAqLwotICAgICAgIDc0MywgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCOV80X05WICovCi0gICAgICAgNzI5LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMF80X05WICovCi0gICAgICAgNzMwLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICovCi0gICAgICAgNzMxLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMl80X05WICovCi0gICAgICAgNzMyLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxM180X05WICovCi0gICAgICAgNzMzLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICovCi0gICAgICAgNzM0LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNV80X05WICovCi0gICAgICAxNTUxLCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRURfSU1BR0VfU0laRSAqLwotICAgICAgMTU0OCwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEICovCi0gICAgICAgOTcwLCAvKiBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgKi8KLSAgICAgICAyNDAsIC8qIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICovCi0gICAgICAgODc5LCAvKiBHTF9NQVhfVkVSVEVYX1VOSVRTX0FSQiAqLworICAgICAgIDYwMSwgLyogR0xfSU5URVJQT0xBVEUgKi8KKyAgICAgICAyNDAsIC8qIEdMX0NPTlNUQU5UICovCisgICAgICAxMTUzLCAvKiBHTF9QUklNQVJZX0NPTE9SICovCisgICAgICAxMTUwLCAvKiBHTF9QUkVWSU9VUyAqLworICAgICAgMTM1NCwgLyogR0xfU09VUkNFMF9SR0IgKi8KKyAgICAgIDEzNjAsIC8qIEdMX1NPVVJDRTFfUkdCICovCisgICAgICAxMzY2LCAvKiBHTF9TT1VSQ0UyX1JHQiAqLworICAgICAgMTM3MCwgLyogR0xfU09VUkNFM19SR0JfTlYgKi8KKyAgICAgIDEzNTEsIC8qIEdMX1NPVVJDRTBfQUxQSEEgKi8KKyAgICAgIDEzNTcsIC8qIEdMX1NPVVJDRTFfQUxQSEEgKi8KKyAgICAgIDEzNjMsIC8qIEdMX1NPVVJDRTJfQUxQSEEgKi8KKyAgICAgIDEzNjksIC8qIEdMX1NPVVJDRTNfQUxQSEFfTlYgKi8KKyAgICAgICA5OTksIC8qIEdMX09QRVJBTkQwX1JHQiAqLworICAgICAgMTAwNSwgLyogR0xfT1BFUkFORDFfUkdCICovCisgICAgICAxMDExLCAvKiBHTF9PUEVSQU5EMl9SR0IgKi8KKyAgICAgIDEwMTUsIC8qIEdMX09QRVJBTkQzX1JHQl9OViAqLworICAgICAgIDk5NiwgLyogR0xfT1BFUkFORDBfQUxQSEEgKi8KKyAgICAgIDEwMDIsIC8qIEdMX09QRVJBTkQxX0FMUEhBICovCisgICAgICAxMDA4LCAvKiBHTF9PUEVSQU5EMl9BTFBIQSAqLworICAgICAgMTAxNCwgLyogR0xfT1BFUkFORDNfQUxQSEFfTlYgKi8KKyAgICAgIDE2NzksIC8qIEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HX0FQUExFICovCisgICAgICAxNzQzLCAvKiBHTF9ZQ0JDUl80MjJfQVBQTEUgKi8KKyAgICAgIDE2NjgsIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSAqLworICAgICAgMTY3MCwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSAqLworICAgICAgMTM0NSwgLyogR0xfU0xJQ0VfQUNDVU1fU1VOICovCisgICAgICAxMjEwLCAvKiBHTF9RVUFEX01FU0hfU1VOICovCisgICAgICAxNjQxLCAvKiBHTF9UUklBTkdMRV9NRVNIX1NVTiAqLworICAgICAgMTcxNywgLyogR0xfVkVSVEVYX1BST0dSQU1fQVJCICovCisgICAgICAxNzI4LCAvKiBHTF9WRVJURVhfU1RBVEVfUFJPR1JBTV9OViAqLworICAgICAgMTcwNCwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICovCisgICAgICAxNzEwLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgKi8KKyAgICAgIDE3MTIsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICovCisgICAgICAxNzE0LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgKi8KKyAgICAgICAzMDAsIC8qIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAqLworICAgICAgMTE2NiwgLyogR0xfUFJPR1JBTV9MRU5HVEhfQVJCICovCisgICAgICAxMTgwLCAvKiBHTF9QUk9HUkFNX1NUUklOR19BUkIgKi8KKyAgICAgICA5MjksIC8qIEdMX01PREVMVklFV19QUk9KRUNUSU9OX05WICovCisgICAgICAgNTY5LCAvKiBHTF9JREVOVElUWV9OViAqLworICAgICAgIDYxNCwgLyogR0xfSU5WRVJTRV9OViAqLworICAgICAgMTYzNCwgLyogR0xfVFJBTlNQT1NFX05WICovCisgICAgICAgNjE1LCAvKiBHTF9JTlZFUlNFX1RSQU5TUE9TRV9OViAqLworICAgICAgIDgzOCwgLyogR0xfTUFYX1BST0dSQU1fTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAqLworICAgICAgIDgzNywgLyogR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICovCisgICAgICAgNzQ1LCAvKiBHTF9NQVRSSVgwX05WICovCisgICAgICAgNzU3LCAvKiBHTF9NQVRSSVgxX05WICovCisgICAgICAgNzY5LCAvKiBHTF9NQVRSSVgyX05WICovCisgICAgICAgNzczLCAvKiBHTF9NQVRSSVgzX05WICovCisgICAgICAgNzc1LCAvKiBHTF9NQVRSSVg0X05WICovCisgICAgICAgNzc3LCAvKiBHTF9NQVRSSVg1X05WICovCisgICAgICAgNzc5LCAvKiBHTF9NQVRSSVg2X05WICovCisgICAgICAgNzgxLCAvKiBHTF9NQVRSSVg3X05WICovCisgICAgICAgMjg1LCAvKiBHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgKi8KKyAgICAgICAyODIsIC8qIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAqLworICAgICAgMTcyMCwgLyogR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSAqLworICAgICAgMTcyMywgLyogR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREUgKi8KKyAgICAgIDExNzgsIC8qIEdMX1BST0dSQU1fUEFSQU1FVEVSX05WICovCisgICAgICAxNzA4LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIgKi8KKyAgICAgIDExODIsIC8qIEdMX1BST0dSQU1fVEFSR0VUX05WICovCisgICAgICAxMTc5LCAvKiBHTF9QUk9HUkFNX1JFU0lERU5UX05WICovCisgICAgICAxNjI2LCAvKiBHTF9UUkFDS19NQVRSSVhfTlYgKi8KKyAgICAgIDE2MjcsIC8qIEdMX1RSQUNLX01BVFJJWF9UUkFOU0ZPUk1fTlYgKi8KKyAgICAgIDE3MTgsIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX0JJTkRJTkdfTlYgKi8KKyAgICAgIDExNjAsIC8qIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fQVJCICovCisgICAgICAgMzE5LCAvKiBHTF9ERVBUSF9DTEFNUF9OViAqLworICAgICAgMTY4NiwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTBfTlYgKi8KKyAgICAgIDE2OTMsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxX05WICovCisgICAgICAxNjk0LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAqLworICAgICAgMTY5NSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTNfTlYgKi8KKyAgICAgIDE2OTYsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk0X05WICovCisgICAgICAxNjk3LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAqLworICAgICAgMTY5OCwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTZfTlYgKi8KKyAgICAgIDE2OTksIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk3X05WICovCisgICAgICAxNzAwLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAqLworICAgICAgMTcwMSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTlfTlYgKi8KKyAgICAgIDE2ODcsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMF9OViAqLworICAgICAgMTY4OCwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTExX05WICovCisgICAgICAxNjg5LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTJfTlYgKi8KKyAgICAgIDE2OTAsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxM19OViAqLworICAgICAgMTY5MSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE0X05WICovCisgICAgICAxNjkyLCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTVfTlYgKi8KKyAgICAgICA2OTksIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjBfNF9OViAqLworICAgICAgIDcwNiwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMV80X05WICovCisgICAgICAgNzA3LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIyXzRfTlYgKi8KKyAgICAgICA3MDgsIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjNfNF9OViAqLworICAgICAgIDcwOSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCNF80X05WICovCisgICAgICAgNzEwLCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI1XzRfTlYgKi8KKyAgICAgICA3MTEsIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjZfNF9OViAqLworICAgICAgIDcxMiwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCN180X05WICovCisgICAgICAgNzEzLCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI4XzRfTlYgKi8KKyAgICAgICA3MTQsIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjlfNF9OViAqLworICAgICAgIDcwMCwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTBfNF9OViAqLworICAgICAgIDcwMSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAqLworICAgICAgIDcwMiwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTJfNF9OViAqLworICAgICAgIDcwMywgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTNfNF9OViAqLworICAgICAgIDcwNCwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAqLworICAgICAgIDcwNSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTVfNF9OViAqLworICAgICAgIDcyNiwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMF80X05WICovCisgICAgICAgNzMzLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxXzRfTlYgKi8KKyAgICAgICA3MzQsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjJfNF9OViAqLworICAgICAgIDczNSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCM180X05WICovCisgICAgICAgNzM2LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI0XzRfTlYgKi8KKyAgICAgICA3MzcsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjVfNF9OViAqLworICAgICAgIDczOCwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCNl80X05WICovCisgICAgICAxMTU5LCAvKiBHTF9QUk9HUkFNX0JJTkRJTkdfQVJCICovCisgICAgICAgNzQwLCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI4XzRfTlYgKi8KKyAgICAgICA3NDEsIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjlfNF9OViAqLworICAgICAgIDcyNywgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAqLworICAgICAgIDcyOCwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTFfNF9OViAqLworICAgICAgIDcyOSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTJfNF9OViAqLworICAgICAgIDczMCwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAqLworICAgICAgIDczMSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTRfNF9OViAqLworICAgICAgIDczMiwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTVfNF9OViAqLworICAgICAgMTU0OSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUgKi8KKyAgICAgIDE1NDYsIC8qIEdMX1RFWFRVUkVfQ09NUFJFU1NFRCAqLworICAgICAgIDk2OCwgLyogR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICovCisgICAgICAgMjM5LCAvKiBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAqLworICAgICAgIDg3NywgLyogR0xfTUFYX1ZFUlRFWF9VTklUU19BUkIgKi8KICAgICAgICAgMjIsIC8qIEdMX0FDVElWRV9WRVJURVhfVU5JVFNfQVJCICovCi0gICAgICAxNzQwLCAvKiBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAqLwotICAgICAgMTcxOCwgLyogR0xfVkVSVEVYX0JMRU5EX0FSQiAqLwotICAgICAgIDMwMywgLyogR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICovCi0gICAgICAxNzM5LCAvKiBHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkIgKi8KLSAgICAgIDE3MzgsIC8qIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICovCi0gICAgICAxNzM3LCAvKiBHTF9XRUlHSFRfQVJSQVlfU0laRV9BUkIgKi8KLSAgICAgIDE3MzYsIC8qIEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX0FSQiAqLwotICAgICAgMTczMywgLyogR0xfV0VJR0hUX0FSUkFZX0FSQiAqLwotICAgICAgIDM0NiwgLyogR0xfRE9UM19SR0IgKi8KLSAgICAgICAzNDcsIC8qIEdMX0RPVDNfUkdCQSAqLwotICAgICAgIDIzOCwgLyogR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICovCi0gICAgICAgMjMzLCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICovCi0gICAgICAgOTM5LCAvKiBHTF9NVUxUSVNBTVBMRV8zREZYICovCi0gICAgICAxMzExLCAvKiBHTF9TQU1QTEVfQlVGRkVSU18zREZYICovCi0gICAgICAxMzAyLCAvKiBHTF9TQU1QTEVTXzNERlggKi8KLSAgICAgICA5MjAsIC8qIEdMX01PREVMVklFVzJfQVJCICovCi0gICAgICAgOTIzLCAvKiBHTF9NT0RFTFZJRVczX0FSQiAqLwotICAgICAgIDkyNCwgLyogR0xfTU9ERUxWSUVXNF9BUkIgKi8KLSAgICAgICA5MjUsIC8qIEdMX01PREVMVklFVzVfQVJCICovCi0gICAgICAgOTI2LCAvKiBHTF9NT0RFTFZJRVc2X0FSQiAqLwotICAgICAgIDkyNywgLyogR0xfTU9ERUxWSUVXN19BUkIgKi8KLSAgICAgICA5MjgsIC8qIEdMX01PREVMVklFVzhfQVJCICovCi0gICAgICAgOTI5LCAvKiBHTF9NT0RFTFZJRVc5X0FSQiAqLwotICAgICAgIDg5OSwgLyogR0xfTU9ERUxWSUVXMTBfQVJCICovCi0gICAgICAgOTAwLCAvKiBHTF9NT0RFTFZJRVcxMV9BUkIgKi8KLSAgICAgICA5MDEsIC8qIEdMX01PREVMVklFVzEyX0FSQiAqLwotICAgICAgIDkwMiwgLyogR0xfTU9ERUxWSUVXMTNfQVJCICovCi0gICAgICAgOTAzLCAvKiBHTF9NT0RFTFZJRVcxNF9BUkIgKi8KLSAgICAgICA5MDQsIC8qIEdMX01PREVMVklFVzE1X0FSQiAqLwotICAgICAgIDkwNSwgLyogR0xfTU9ERUxWSUVXMTZfQVJCICovCi0gICAgICAgOTA2LCAvKiBHTF9NT0RFTFZJRVcxN19BUkIgKi8KLSAgICAgICA5MDcsIC8qIEdMX01PREVMVklFVzE4X0FSQiAqLwotICAgICAgIDkwOCwgLyogR0xfTU9ERUxWSUVXMTlfQVJCICovCi0gICAgICAgOTEwLCAvKiBHTF9NT0RFTFZJRVcyMF9BUkIgKi8KLSAgICAgICA5MTEsIC8qIEdMX01PREVMVklFVzIxX0FSQiAqLwotICAgICAgIDkxMiwgLyogR0xfTU9ERUxWSUVXMjJfQVJCICovCi0gICAgICAgOTEzLCAvKiBHTF9NT0RFTFZJRVcyM19BUkIgKi8KLSAgICAgICA5MTQsIC8qIEdMX01PREVMVklFVzI0X0FSQiAqLwotICAgICAgIDkxNSwgLyogR0xfTU9ERUxWSUVXMjVfQVJCICovCi0gICAgICAgOTE2LCAvKiBHTF9NT0RFTFZJRVcyNl9BUkIgKi8KLSAgICAgICA5MTcsIC8qIEdMX01PREVMVklFVzI3X0FSQiAqLwotICAgICAgIDkxOCwgLyogR0xfTU9ERUxWSUVXMjhfQVJCICovCi0gICAgICAgOTE5LCAvKiBHTF9NT0RFTFZJRVcyOV9BUkIgKi8KLSAgICAgICA5MjEsIC8qIEdMX01PREVMVklFVzMwX0FSQiAqLwotICAgICAgIDkyMiwgLyogR0xfTU9ERUxWSUVXMzFfQVJCICovCi0gICAgICAgMzUxLCAvKiBHTF9ET1QzX1JHQl9FWFQgKi8KLSAgICAgICAzNDksIC8qIEdMX0RPVDNfUkdCQV9FWFQgKi8KLSAgICAgICA4OTMsIC8qIEdMX01JUlJPUl9DTEFNUF9FWFQgKi8KLSAgICAgICA4OTYsIC8qIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVCAqLwotICAgICAgIDkzNCwgLyogR0xfTU9EVUxBVEVfQUREX0FUSSAqLwotICAgICAgIDkzNSwgLyogR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgKi8KLSAgICAgICA5MzYsIC8qIEdMX01PRFVMQVRFX1NVQlRSQUNUX0FUSSAqLwotICAgICAgMTc0NiwgLyogR0xfWUNCQ1JfTUVTQSAqLwotICAgICAgMTAyNSwgLyogR0xfUEFDS19JTlZFUlRfTUVTQSAqLwotICAgICAgIDMwNiwgLyogR0xfREVCVUdfT0JKRUNUX01FU0EgKi8KLSAgICAgICAzMDcsIC8qIEdMX0RFQlVHX1BSSU5UX01FU0EgKi8KLSAgICAgICAzMDUsIC8qIEdMX0RFQlVHX0FTU0VSVF9NRVNBICovCi0gICAgICAgMTA3LCAvKiBHTF9CVUZGRVJfU0laRSAqLwotICAgICAgIDEwOSwgLyogR0xfQlVGRkVSX1VTQUdFICovCi0gICAgICAxMzk5LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAqLwotICAgICAgMTM5NywgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUwgKi8KLSAgICAgIDE0MDEsIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgKi8KLSAgICAgIDE0MDMsIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgKi8KLSAgICAgICA0ODUsIC8qIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCICovCi0gICAgICAxMTU5LCAvKiBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCi0gICAgICAxMTg3LCAvKiBHTF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCi0gICAgICAxMTg2LCAvKiBHTF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICAgICAxMTcxLCAvKiBHTF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgMTE3NywgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgICAgIDExNzYsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICAgICAgODI5LCAvKiBHTF9NQVhfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgIDg1MiwgLyogR0xfTUFYX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgICAgICA4NTEsIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICAgICAgODQyLCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgICAgICA4NDgsIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgIDg0NywgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCi0gICAgICAgODEyLCAvKiBHTF9NQVhfRFJBV19CVUZGRVJTICovCi0gICAgICAgMzU1LCAvKiBHTF9EUkFXX0JVRkZFUjAgKi8KLSAgICAgICAzNTgsIC8qIEdMX0RSQVdfQlVGRkVSMSAqLwotICAgICAgIDM3OSwgLyogR0xfRFJBV19CVUZGRVIyICovCi0gICAgICAgMzgyLCAvKiBHTF9EUkFXX0JVRkZFUjMgKi8KLSAgICAgICAzODUsIC8qIEdMX0RSQVdfQlVGRkVSNCAqLwotICAgICAgIDM4OCwgLyogR0xfRFJBV19CVUZGRVI1ICovCi0gICAgICAgMzkxLCAvKiBHTF9EUkFXX0JVRkZFUjYgKi8KLSAgICAgICAzOTQsIC8qIEdMX0RSQVdfQlVGRkVSNyAqLwotICAgICAgIDM5NywgLyogR0xfRFJBV19CVUZGRVI4ICovCi0gICAgICAgNDAwLCAvKiBHTF9EUkFXX0JVRkZFUjkgKi8KLSAgICAgICAzNTksIC8qIEdMX0RSQVdfQlVGRkVSMTAgKi8KLSAgICAgICAzNjIsIC8qIEdMX0RSQVdfQlVGRkVSMTEgKi8KLSAgICAgICAzNjUsIC8qIEdMX0RSQVdfQlVGRkVSMTIgKi8KLSAgICAgICAzNjgsIC8qIEdMX0RSQVdfQlVGRkVSMTMgKi8KLSAgICAgICAzNzEsIC8qIEdMX0RSQVdfQlVGRkVSMTQgKi8KLSAgICAgICAzNzQsIC8qIEdMX0RSQVdfQlVGRkVSMTUgKi8KLSAgICAgICAgODIsIC8qIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICovCi0gICAgICAgNzkyLCAvKiBHTF9NQVRSSVhfUEFMRVRURV9BUkIgKi8KLSAgICAgICA4MjMsIC8qIEdMX01BWF9NQVRSSVhfUEFMRVRURV9TVEFDS19ERVBUSF9BUkIgKi8KLSAgICAgICA4MjYsIC8qIEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX0FSQiAqLwotICAgICAgIDI4OSwgLyogR0xfQ1VSUkVOVF9QQUxFVFRFX01BVFJJWF9BUkIgKi8KLSAgICAgICA3ODYsIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9BUkIgKi8KLSAgICAgICAyODQsIC8qIEdMX0NVUlJFTlRfTUFUUklYX0lOREVYX0FSQiAqLwotICAgICAgIDc4OCwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfQVJCICovCi0gICAgICAgNzkwLCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9BUkIgKi8KLSAgICAgICA3ODksIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfQVJCICovCi0gICAgICAgNzg3LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgKi8KLSAgICAgIDE1NzcsIC8qIEdMX1RFWFRVUkVfREVQVEhfU0laRSAqLwotICAgICAgIDMzOSwgLyogR0xfREVQVEhfVEVYVFVSRV9NT0RFICovCi0gICAgICAxNTQzLCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERSAqLwotICAgICAgMTU0MSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkMgKi8KLSAgICAgICAyMTcsIC8qIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICovCi0gICAgICAxMDkzLCAvKiBHTF9QT0lOVF9TUFJJVEUgKi8KLSAgICAgICAyNjYsIC8qIEdMX0NPT1JEX1JFUExBQ0UgKi8KLSAgICAgIDEwOTcsIC8qIEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYgKi8KLSAgICAgIDEyMTQsIC8qIEdMX1FVRVJZX0NPVU5URVJfQklUUyAqLwotICAgICAgIDI5MSwgLyogR0xfQ1VSUkVOVF9RVUVSWSAqLwotICAgICAgMTIxNiwgLyogR0xfUVVFUllfUkVTVUxUICovCi0gICAgICAxMjE4LCAvKiBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICovCi0gICAgICAgODczLCAvKiBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgKi8KLSAgICAgIDE3MDgsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAqLwotICAgICAgIDMzNywgLyogR0xfREVQVEhfU1RFTkNJTF9UT19SR0JBX05WICovCi0gICAgICAgMzM2LCAvKiBHTF9ERVBUSF9TVEVOQ0lMX1RPX0JHUkFfTlYgKi8KLSAgICAgICA4NTksIC8qIEdMX01BWF9URVhUVVJFX0NPT1JEUyAqLwotICAgICAgIDg2MSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KLSAgICAgIDExNjQsIC8qIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAqLwotICAgICAgMTE2NiwgLyogR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICovCi0gICAgICAxMTY1LCAvKiBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgKi8KLSAgICAgIDE2MjIsIC8qIEdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OViAqLwotICAgICAgIDMxOCwgLyogR0xfREVQVEhfQk9VTkRTX1RFU1RfRVhUICovCi0gICAgICAgMzE3LCAvKiBHTF9ERVBUSF9CT1VORFNfRVhUICovCisgICAgICAxNzM4LCAvKiBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAqLworICAgICAgMTcxNiwgLyogR0xfVkVSVEVYX0JMRU5EX0FSQiAqLworICAgICAgIDMwMiwgLyogR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICovCisgICAgICAxNzM3LCAvKiBHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkIgKi8KKyAgICAgIDE3MzYsIC8qIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICovCisgICAgICAxNzM1LCAvKiBHTF9XRUlHSFRfQVJSQVlfU0laRV9BUkIgKi8KKyAgICAgIDE3MzQsIC8qIEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX0FSQiAqLworICAgICAgMTczMSwgLyogR0xfV0VJR0hUX0FSUkFZX0FSQiAqLworICAgICAgIDM0NSwgLyogR0xfRE9UM19SR0IgKi8KKyAgICAgICAzNDYsIC8qIEdMX0RPVDNfUkdCQSAqLworICAgICAgIDIzNywgLyogR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICovCisgICAgICAgMjMyLCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICovCisgICAgICAgOTM3LCAvKiBHTF9NVUxUSVNBTVBMRV8zREZYICovCisgICAgICAxMzA5LCAvKiBHTF9TQU1QTEVfQlVGRkVSU18zREZYICovCisgICAgICAxMzAwLCAvKiBHTF9TQU1QTEVTXzNERlggKi8KKyAgICAgICA5MTgsIC8qIEdMX01PREVMVklFVzJfQVJCICovCisgICAgICAgOTIxLCAvKiBHTF9NT0RFTFZJRVczX0FSQiAqLworICAgICAgIDkyMiwgLyogR0xfTU9ERUxWSUVXNF9BUkIgKi8KKyAgICAgICA5MjMsIC8qIEdMX01PREVMVklFVzVfQVJCICovCisgICAgICAgOTI0LCAvKiBHTF9NT0RFTFZJRVc2X0FSQiAqLworICAgICAgIDkyNSwgLyogR0xfTU9ERUxWSUVXN19BUkIgKi8KKyAgICAgICA5MjYsIC8qIEdMX01PREVMVklFVzhfQVJCICovCisgICAgICAgOTI3LCAvKiBHTF9NT0RFTFZJRVc5X0FSQiAqLworICAgICAgIDg5NywgLyogR0xfTU9ERUxWSUVXMTBfQVJCICovCisgICAgICAgODk4LCAvKiBHTF9NT0RFTFZJRVcxMV9BUkIgKi8KKyAgICAgICA4OTksIC8qIEdMX01PREVMVklFVzEyX0FSQiAqLworICAgICAgIDkwMCwgLyogR0xfTU9ERUxWSUVXMTNfQVJCICovCisgICAgICAgOTAxLCAvKiBHTF9NT0RFTFZJRVcxNF9BUkIgKi8KKyAgICAgICA5MDIsIC8qIEdMX01PREVMVklFVzE1X0FSQiAqLworICAgICAgIDkwMywgLyogR0xfTU9ERUxWSUVXMTZfQVJCICovCisgICAgICAgOTA0LCAvKiBHTF9NT0RFTFZJRVcxN19BUkIgKi8KKyAgICAgICA5MDUsIC8qIEdMX01PREVMVklFVzE4X0FSQiAqLworICAgICAgIDkwNiwgLyogR0xfTU9ERUxWSUVXMTlfQVJCICovCisgICAgICAgOTA4LCAvKiBHTF9NT0RFTFZJRVcyMF9BUkIgKi8KKyAgICAgICA5MDksIC8qIEdMX01PREVMVklFVzIxX0FSQiAqLworICAgICAgIDkxMCwgLyogR0xfTU9ERUxWSUVXMjJfQVJCICovCisgICAgICAgOTExLCAvKiBHTF9NT0RFTFZJRVcyM19BUkIgKi8KKyAgICAgICA5MTIsIC8qIEdMX01PREVMVklFVzI0X0FSQiAqLworICAgICAgIDkxMywgLyogR0xfTU9ERUxWSUVXMjVfQVJCICovCisgICAgICAgOTE0LCAvKiBHTF9NT0RFTFZJRVcyNl9BUkIgKi8KKyAgICAgICA5MTUsIC8qIEdMX01PREVMVklFVzI3X0FSQiAqLworICAgICAgIDkxNiwgLyogR0xfTU9ERUxWSUVXMjhfQVJCICovCisgICAgICAgOTE3LCAvKiBHTF9NT0RFTFZJRVcyOV9BUkIgKi8KKyAgICAgICA5MTksIC8qIEdMX01PREVMVklFVzMwX0FSQiAqLworICAgICAgIDkyMCwgLyogR0xfTU9ERUxWSUVXMzFfQVJCICovCisgICAgICAgMzUwLCAvKiBHTF9ET1QzX1JHQl9FWFQgKi8KKyAgICAgICAzNDgsIC8qIEdMX0RPVDNfUkdCQV9FWFQgKi8KKyAgICAgICA4OTEsIC8qIEdMX01JUlJPUl9DTEFNUF9FWFQgKi8KKyAgICAgICA4OTQsIC8qIEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0VYVCAqLworICAgICAgIDkzMiwgLyogR0xfTU9EVUxBVEVfQUREX0FUSSAqLworICAgICAgIDkzMywgLyogR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgKi8KKyAgICAgICA5MzQsIC8qIEdMX01PRFVMQVRFX1NVQlRSQUNUX0FUSSAqLworICAgICAgMTc0NCwgLyogR0xfWUNCQ1JfTUVTQSAqLworICAgICAgMTAyMywgLyogR0xfUEFDS19JTlZFUlRfTUVTQSAqLworICAgICAgIDMwNSwgLyogR0xfREVCVUdfT0JKRUNUX01FU0EgKi8KKyAgICAgICAzMDYsIC8qIEdMX0RFQlVHX1BSSU5UX01FU0EgKi8KKyAgICAgICAzMDQsIC8qIEdMX0RFQlVHX0FTU0VSVF9NRVNBICovCisgICAgICAgMTA2LCAvKiBHTF9CVUZGRVJfU0laRSAqLworICAgICAgIDEwOCwgLyogR0xfQlVGRkVSX1VTQUdFICovCisgICAgICAxMzk3LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAqLworICAgICAgMTM5NSwgLyogR0xfU1RFTkNJTF9CQUNLX0ZBSUwgKi8KKyAgICAgIDEzOTksIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgKi8KKyAgICAgIDE0MDEsIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgKi8KKyAgICAgICA0ODMsIC8qIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCICovCisgICAgICAxMTU3LCAvKiBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCisgICAgICAxMTg1LCAvKiBHTF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCisgICAgICAxMTg0LCAvKiBHTF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICAgICAxMTY5LCAvKiBHTF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgMTE3NSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgICAgIDExNzQsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICAgICAgODI3LCAvKiBHTF9NQVhfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgIDg1MCwgLyogR0xfTUFYX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgICAgICA4NDksIC8qIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICAgICAgODQwLCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgICAgICA4NDYsIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgIDg0NSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCICovCisgICAgICAgODEwLCAvKiBHTF9NQVhfRFJBV19CVUZGRVJTICovCisgICAgICAgMzU0LCAvKiBHTF9EUkFXX0JVRkZFUjAgKi8KKyAgICAgICAzNTcsIC8qIEdMX0RSQVdfQlVGRkVSMSAqLworICAgICAgIDM3OCwgLyogR0xfRFJBV19CVUZGRVIyICovCisgICAgICAgMzgxLCAvKiBHTF9EUkFXX0JVRkZFUjMgKi8KKyAgICAgICAzODQsIC8qIEdMX0RSQVdfQlVGRkVSNCAqLworICAgICAgIDM4NywgLyogR0xfRFJBV19CVUZGRVI1ICovCisgICAgICAgMzkwLCAvKiBHTF9EUkFXX0JVRkZFUjYgKi8KKyAgICAgICAzOTMsIC8qIEdMX0RSQVdfQlVGRkVSNyAqLworICAgICAgIDM5NiwgLyogR0xfRFJBV19CVUZGRVI4ICovCisgICAgICAgMzk5LCAvKiBHTF9EUkFXX0JVRkZFUjkgKi8KKyAgICAgICAzNTgsIC8qIEdMX0RSQVdfQlVGRkVSMTAgKi8KKyAgICAgICAzNjEsIC8qIEdMX0RSQVdfQlVGRkVSMTEgKi8KKyAgICAgICAzNjQsIC8qIEdMX0RSQVdfQlVGRkVSMTIgKi8KKyAgICAgICAzNjcsIC8qIEdMX0RSQVdfQlVGRkVSMTMgKi8KKyAgICAgICAzNzAsIC8qIEdMX0RSQVdfQlVGRkVSMTQgKi8KKyAgICAgICAzNzMsIC8qIEdMX0RSQVdfQlVGRkVSMTUgKi8KKyAgICAgICAgODEsIC8qIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICovCisgICAgICAgNzkwLCAvKiBHTF9NQVRSSVhfUEFMRVRURV9BUkIgKi8KKyAgICAgICA4MjEsIC8qIEdMX01BWF9NQVRSSVhfUEFMRVRURV9TVEFDS19ERVBUSF9BUkIgKi8KKyAgICAgICA4MjQsIC8qIEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX0FSQiAqLworICAgICAgIDI4OCwgLyogR0xfQ1VSUkVOVF9QQUxFVFRFX01BVFJJWF9BUkIgKi8KKyAgICAgICA3ODQsIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9BUkIgKi8KKyAgICAgICAyODMsIC8qIEdMX0NVUlJFTlRfTUFUUklYX0lOREVYX0FSQiAqLworICAgICAgIDc4NiwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfQVJCICovCisgICAgICAgNzg4LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9BUkIgKi8KKyAgICAgICA3ODcsIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfQVJCICovCisgICAgICAgNzg1LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgKi8KKyAgICAgIDE1NzUsIC8qIEdMX1RFWFRVUkVfREVQVEhfU0laRSAqLworICAgICAgIDMzOCwgLyogR0xfREVQVEhfVEVYVFVSRV9NT0RFICovCisgICAgICAxNTQxLCAvKiBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERSAqLworICAgICAgMTUzOSwgLyogR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkMgKi8KKyAgICAgICAyMTYsIC8qIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICovCisgICAgICAxMDkxLCAvKiBHTF9QT0lOVF9TUFJJVEUgKi8KKyAgICAgICAyNjUsIC8qIEdMX0NPT1JEX1JFUExBQ0UgKi8KKyAgICAgIDEwOTUsIC8qIEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYgKi8KKyAgICAgIDEyMTIsIC8qIEdMX1FVRVJZX0NPVU5URVJfQklUUyAqLworICAgICAgIDI5MCwgLyogR0xfQ1VSUkVOVF9RVUVSWSAqLworICAgICAgMTIxNCwgLyogR0xfUVVFUllfUkVTVUxUICovCisgICAgICAxMjE2LCAvKiBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICovCisgICAgICAgODcxLCAvKiBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgKi8KKyAgICAgIDE3MDYsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAqLworICAgICAgIDMzNiwgLyogR0xfREVQVEhfU1RFTkNJTF9UT19SR0JBX05WICovCisgICAgICAgMzM1LCAvKiBHTF9ERVBUSF9TVEVOQ0lMX1RPX0JHUkFfTlYgKi8KKyAgICAgICA4NTcsIC8qIEdMX01BWF9URVhUVVJFX0NPT1JEUyAqLworICAgICAgIDg1OSwgLyogR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKyAgICAgIDExNjIsIC8qIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAqLworICAgICAgMTE2NCwgLyogR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICovCisgICAgICAxMTYzLCAvKiBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgKi8KKyAgICAgIDE2MjAsIC8qIEdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OViAqLworICAgICAgIDMxNywgLyogR0xfREVQVEhfQk9VTkRTX1RFU1RfRVhUICovCisgICAgICAgMzE2LCAvKiBHTF9ERVBUSF9CT1VORFNfRVhUICovCiAgICAgICAgIDUyLCAvKiBHTF9BUlJBWV9CVUZGRVIgKi8KLSAgICAgICA0MjAsIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICovCi0gICAgICAgIDU0LCAvKiBHTF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgICAgIDQyMiwgLyogR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgICAgMTY4MiwgLyogR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICAgICAgOTYwLCAvKiBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgICAgICAxNDAsIC8qIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICAgICAgNTc5LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgICAgMTU1NiwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAqLwotICAgICAgIDQxNiwgLyogR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICAgICAxMzIzLCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgICAgICA0NjMsIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCi0gICAgICAxNzM0LCAvKiBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgICAgIDE3MDQsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KLSAgICAgIDExNjcsIC8qIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgIDgzNSwgLyogR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgMTE3MywgLyogR0xfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAqLwotICAgICAgIDg0NCwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KLSAgICAgIDExODUsIC8qIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCi0gICAgICAgODUwLCAvKiBHTF9NQVhfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgKi8KLSAgICAgIDExNzUsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAqLwotICAgICAgIDg0NiwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAqLwotICAgICAgMTE3OSwgLyogR0xfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAqLwotICAgICAgIDg0OSwgLyogR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KLSAgICAgIDExNzQsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICovCi0gICAgICAgODQ1LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfUEFSQU1FVEVSU19BUkIgKi8KLSAgICAgIDExNjAsIC8qIEdMX1BST0dSQU1fQVRUUklCU19BUkIgKi8KLSAgICAgICA4MzAsIC8qIEdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCICovCi0gICAgICAxMTcyLCAvKiBHTF9QUk9HUkFNX05BVElWRV9BVFRSSUJTX0FSQiAqLwotICAgICAgIDg0MywgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCi0gICAgICAxMTU4LCAvKiBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLwotICAgICAgIDgyOCwgLyogR0xfTUFYX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICovCi0gICAgICAxMTcwLCAvKiBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KLSAgICAgICA4NDEsIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KLSAgICAgICA4MzYsIC8qIEdMX01BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfQVJCICovCi0gICAgICAgODMyLCAvKiBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgKi8KLSAgICAgIDExODgsIC8qIEdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkIgKi8KLSAgICAgIDE2MzMsIC8qIEdMX1RSQU5TUE9TRV9DVVJSRU5UX01BVFJJWF9BUkIgKi8KLSAgICAgIDEyMjYsIC8qIEdMX1JFQURfT05MWSAqLwotICAgICAgMTc0MiwgLyogR0xfV1JJVEVfT05MWSAqLwotICAgICAgMTIyOCwgLyogR0xfUkVBRF9XUklURSAqLwotICAgICAgIDEwMSwgLyogR0xfQlVGRkVSX0FDQ0VTUyAqLwotICAgICAgIDEwMywgLyogR0xfQlVGRkVSX01BUFBFRCAqLwotICAgICAgIDEwNSwgLyogR0xfQlVGRkVSX01BUF9QT0lOVEVSICovCi0gICAgICAxNjI3LCAvKiBHTF9USU1FX0VMQVBTRURfRVhUICovCi0gICAgICAgNzQ2LCAvKiBHTF9NQVRSSVgwX0FSQiAqLwotICAgICAgIDc1OCwgLyogR0xfTUFUUklYMV9BUkIgKi8KLSAgICAgICA3NzAsIC8qIEdMX01BVFJJWDJfQVJCICovCi0gICAgICAgNzc0LCAvKiBHTF9NQVRSSVgzX0FSQiAqLwotICAgICAgIDc3NiwgLyogR0xfTUFUUklYNF9BUkIgKi8KLSAgICAgICA3NzgsIC8qIEdMX01BVFJJWDVfQVJCICovCi0gICAgICAgNzgwLCAvKiBHTF9NQVRSSVg2X0FSQiAqLwotICAgICAgIDc4MiwgLyogR0xfTUFUUklYN19BUkIgKi8KLSAgICAgICA3ODQsIC8qIEdMX01BVFJJWDhfQVJCICovCi0gICAgICAgNzg1LCAvKiBHTF9NQVRSSVg5X0FSQiAqLwotICAgICAgIDc0OCwgLyogR0xfTUFUUklYMTBfQVJCICovCi0gICAgICAgNzQ5LCAvKiBHTF9NQVRSSVgxMV9BUkIgKi8KLSAgICAgICA3NTAsIC8qIEdMX01BVFJJWDEyX0FSQiAqLwotICAgICAgIDc1MSwgLyogR0xfTUFUUklYMTNfQVJCICovCi0gICAgICAgNzUyLCAvKiBHTF9NQVRSSVgxNF9BUkIgKi8KLSAgICAgICA3NTMsIC8qIEdMX01BVFJJWDE1X0FSQiAqLwotICAgICAgIDc1NCwgLyogR0xfTUFUUklYMTZfQVJCICovCi0gICAgICAgNzU1LCAvKiBHTF9NQVRSSVgxN19BUkIgKi8KLSAgICAgICA3NTYsIC8qIEdMX01BVFJJWDE4X0FSQiAqLwotICAgICAgIDc1NywgLyogR0xfTUFUUklYMTlfQVJCICovCi0gICAgICAgNzYwLCAvKiBHTF9NQVRSSVgyMF9BUkIgKi8KLSAgICAgICA3NjEsIC8qIEdMX01BVFJJWDIxX0FSQiAqLwotICAgICAgIDc2MiwgLyogR0xfTUFUUklYMjJfQVJCICovCi0gICAgICAgNzYzLCAvKiBHTF9NQVRSSVgyM19BUkIgKi8KLSAgICAgICA3NjQsIC8qIEdMX01BVFJJWDI0X0FSQiAqLwotICAgICAgIDc2NSwgLyogR0xfTUFUUklYMjVfQVJCICovCi0gICAgICAgNzY2LCAvKiBHTF9NQVRSSVgyNl9BUkIgKi8KLSAgICAgICA3NjcsIC8qIEdMX01BVFJJWDI3X0FSQiAqLwotICAgICAgIDc2OCwgLyogR0xfTUFUUklYMjhfQVJCICovCi0gICAgICAgNzY5LCAvKiBHTF9NQVRSSVgyOV9BUkIgKi8KLSAgICAgICA3NzIsIC8qIEdMX01BVFJJWDMwX0FSQiAqLwotICAgICAgIDc3MywgLyogR0xfTUFUUklYMzFfQVJCICovCi0gICAgICAxNDI5LCAvKiBHTF9TVFJFQU1fRFJBVyAqLwotICAgICAgMTQzMSwgLyogR0xfU1RSRUFNX1JFQUQgKi8KLSAgICAgIDE0MjcsIC8qIEdMX1NUUkVBTV9DT1BZICovCi0gICAgICAxMzkxLCAvKiBHTF9TVEFUSUNfRFJBVyAqLwotICAgICAgMTM5MywgLyogR0xfU1RBVElDX1JFQUQgKi8KLSAgICAgIDEzODksIC8qIEdMX1NUQVRJQ19DT1BZICovCi0gICAgICAgNDEwLCAvKiBHTF9EWU5BTUlDX0RSQVcgKi8KLSAgICAgICA0MTIsIC8qIEdMX0RZTkFNSUNfUkVBRCAqLwotICAgICAgIDQwOCwgLyogR0xfRFlOQU1JQ19DT1BZICovCi0gICAgICAgNTM1LCAvKiBHTF9HTF9QSVhFTF9QQUNLX0JVRkZFUiAqLwotICAgICAgIDUzNywgLyogR0xfR0xfUElYRUxfVU5QQUNLX0JVRkZFUiAqLwotICAgICAgIDUzNiwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElORyAqLwotICAgICAgIDUzOCwgLyogR0xfR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HICovCi0gICAgICAgODMzLCAvKiBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAqLwotICAgICAgIDgzMSwgLyogR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLwotICAgICAgIDgzNCwgLyogR0xfTUFYX1BST0dSQU1fSUZfREVQVEhfTlYgKi8KLSAgICAgICA4MzgsIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgKi8KLSAgICAgICA4MzcsIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfQ09VTlRfTlYgKi8KLSAgICAgICA3OTUsIC8qIEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSU19FWFQgKi8KLSAgICAgIDE0MjMsIC8qIEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQgKi8KKyAgICAgICA0MTksIC8qIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICovCisgICAgICAgIDUzLCAvKiBHTF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgICAgIDQyMCwgLyogR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgICAgMTY4MCwgLyogR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICAgICAgOTU4LCAvKiBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgICAgICAxMzksIC8qIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICAgICAgNTc3LCAvKiBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgICAgMTU1NCwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgICAgIDQxNSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICAgICAxMzIxLCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgICAgICA0NjEsIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICAgICAxNzMyLCAvKiBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgICAgIDE3MDIsIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgICAgIDExNjUsIC8qIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgIDgzMywgLyogR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgMTE3MSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgICAgIDg0MiwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgICAgIDExODMsIC8qIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCisgICAgICAgODQ4LCAvKiBHTF9NQVhfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgKi8KKyAgICAgIDExNzMsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAqLworICAgICAgIDg0NCwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAqLworICAgICAgMTE3NywgLyogR0xfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAqLworICAgICAgIDg0NywgLyogR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KKyAgICAgIDExNzIsIC8qIEdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICovCisgICAgICAgODQzLCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfUEFSQU1FVEVSU19BUkIgKi8KKyAgICAgIDExNTgsIC8qIEdMX1BST0dSQU1fQVRUUklCU19BUkIgKi8KKyAgICAgICA4MjgsIC8qIEdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCICovCisgICAgICAxMTcwLCAvKiBHTF9QUk9HUkFNX05BVElWRV9BVFRSSUJTX0FSQiAqLworICAgICAgIDg0MSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCisgICAgICAxMTU2LCAvKiBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLworICAgICAgIDgyNiwgLyogR0xfTUFYX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICovCisgICAgICAxMTY4LCAvKiBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KKyAgICAgICA4MzksIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KKyAgICAgICA4MzQsIC8qIEdMX01BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfQVJCICovCisgICAgICAgODMwLCAvKiBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgKi8KKyAgICAgIDExODYsIC8qIEdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkIgKi8KKyAgICAgIDE2MzEsIC8qIEdMX1RSQU5TUE9TRV9DVVJSRU5UX01BVFJJWF9BUkIgKi8KKyAgICAgIDEyMjQsIC8qIEdMX1JFQURfT05MWSAqLworICAgICAgMTc0MCwgLyogR0xfV1JJVEVfT05MWSAqLworICAgICAgMTIyNiwgLyogR0xfUkVBRF9XUklURSAqLworICAgICAgIDEwMCwgLyogR0xfQlVGRkVSX0FDQ0VTUyAqLworICAgICAgIDEwMiwgLyogR0xfQlVGRkVSX01BUFBFRCAqLworICAgICAgIDEwNCwgLyogR0xfQlVGRkVSX01BUF9QT0lOVEVSICovCisgICAgICAxNjI1LCAvKiBHTF9USU1FX0VMQVBTRURfRVhUICovCisgICAgICAgNzQ0LCAvKiBHTF9NQVRSSVgwX0FSQiAqLworICAgICAgIDc1NiwgLyogR0xfTUFUUklYMV9BUkIgKi8KKyAgICAgICA3NjgsIC8qIEdMX01BVFJJWDJfQVJCICovCisgICAgICAgNzcyLCAvKiBHTF9NQVRSSVgzX0FSQiAqLworICAgICAgIDc3NCwgLyogR0xfTUFUUklYNF9BUkIgKi8KKyAgICAgICA3NzYsIC8qIEdMX01BVFJJWDVfQVJCICovCisgICAgICAgNzc4LCAvKiBHTF9NQVRSSVg2X0FSQiAqLworICAgICAgIDc4MCwgLyogR0xfTUFUUklYN19BUkIgKi8KKyAgICAgICA3ODIsIC8qIEdMX01BVFJJWDhfQVJCICovCisgICAgICAgNzgzLCAvKiBHTF9NQVRSSVg5X0FSQiAqLworICAgICAgIDc0NiwgLyogR0xfTUFUUklYMTBfQVJCICovCisgICAgICAgNzQ3LCAvKiBHTF9NQVRSSVgxMV9BUkIgKi8KKyAgICAgICA3NDgsIC8qIEdMX01BVFJJWDEyX0FSQiAqLworICAgICAgIDc0OSwgLyogR0xfTUFUUklYMTNfQVJCICovCisgICAgICAgNzUwLCAvKiBHTF9NQVRSSVgxNF9BUkIgKi8KKyAgICAgICA3NTEsIC8qIEdMX01BVFJJWDE1X0FSQiAqLworICAgICAgIDc1MiwgLyogR0xfTUFUUklYMTZfQVJCICovCisgICAgICAgNzUzLCAvKiBHTF9NQVRSSVgxN19BUkIgKi8KKyAgICAgICA3NTQsIC8qIEdMX01BVFJJWDE4X0FSQiAqLworICAgICAgIDc1NSwgLyogR0xfTUFUUklYMTlfQVJCICovCisgICAgICAgNzU4LCAvKiBHTF9NQVRSSVgyMF9BUkIgKi8KKyAgICAgICA3NTksIC8qIEdMX01BVFJJWDIxX0FSQiAqLworICAgICAgIDc2MCwgLyogR0xfTUFUUklYMjJfQVJCICovCisgICAgICAgNzYxLCAvKiBHTF9NQVRSSVgyM19BUkIgKi8KKyAgICAgICA3NjIsIC8qIEdMX01BVFJJWDI0X0FSQiAqLworICAgICAgIDc2MywgLyogR0xfTUFUUklYMjVfQVJCICovCisgICAgICAgNzY0LCAvKiBHTF9NQVRSSVgyNl9BUkIgKi8KKyAgICAgICA3NjUsIC8qIEdMX01BVFJJWDI3X0FSQiAqLworICAgICAgIDc2NiwgLyogR0xfTUFUUklYMjhfQVJCICovCisgICAgICAgNzY3LCAvKiBHTF9NQVRSSVgyOV9BUkIgKi8KKyAgICAgICA3NzAsIC8qIEdMX01BVFJJWDMwX0FSQiAqLworICAgICAgIDc3MSwgLyogR0xfTUFUUklYMzFfQVJCICovCisgICAgICAxNDI3LCAvKiBHTF9TVFJFQU1fRFJBVyAqLworICAgICAgMTQyOSwgLyogR0xfU1RSRUFNX1JFQUQgKi8KKyAgICAgIDE0MjUsIC8qIEdMX1NUUkVBTV9DT1BZICovCisgICAgICAxMzg5LCAvKiBHTF9TVEFUSUNfRFJBVyAqLworICAgICAgMTM5MSwgLyogR0xfU1RBVElDX1JFQUQgKi8KKyAgICAgIDEzODcsIC8qIEdMX1NUQVRJQ19DT1BZICovCisgICAgICAgNDA5LCAvKiBHTF9EWU5BTUlDX0RSQVcgKi8KKyAgICAgICA0MTEsIC8qIEdMX0RZTkFNSUNfUkVBRCAqLworICAgICAgIDQwNywgLyogR0xfRFlOQU1JQ19DT1BZICovCisgICAgICAgNTMzLCAvKiBHTF9HTF9QSVhFTF9QQUNLX0JVRkZFUiAqLworICAgICAgIDUzNSwgLyogR0xfR0xfUElYRUxfVU5QQUNLX0JVRkZFUiAqLworICAgICAgIDUzNCwgLyogR0xfR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElORyAqLworICAgICAgIDUzNiwgLyogR0xfR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HICovCisgICAgICAgODMxLCAvKiBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAqLworICAgICAgIDgyOSwgLyogR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLworICAgICAgIDgzMiwgLyogR0xfTUFYX1BST0dSQU1fSUZfREVQVEhfTlYgKi8KKyAgICAgICA4MzYsIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgKi8KKyAgICAgICA4MzUsIC8qIEdMX01BWF9QUk9HUkFNX0xPT1BfQ09VTlRfTlYgKi8KKyAgICAgICA3OTMsIC8qIEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSU19FWFQgKi8KKyAgICAgIDE0MjEsIC8qIEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQgKi8KICAgICAgICAgMTcsIC8qIEdMX0FDVElWRV9TVEVOQ0lMX0ZBQ0VfRVhUICovCi0gICAgICAgODk0LCAvKiBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVCAqLwotICAgICAgMTMwNCwgLyogR0xfU0FNUExFU19QQVNTRUQgKi8KLSAgICAgICA0ODYsIC8qIEdMX0ZSQUdNRU5UX1NIQURFUiAqLwotICAgICAgMTcyOCwgLyogR0xfVkVSVEVYX1NIQURFUiAqLwotICAgICAgMTE3OCwgLyogR0xfUFJPR1JBTV9PQkpFQ1RfQVJCICovCi0gICAgICAxMzM2LCAvKiBHTF9TSEFERVJfT0JKRUNUX0FSQiAqLwotICAgICAgIDgxOSwgLyogR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAqLwotICAgICAgIDg3NywgLyogR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KLSAgICAgICA4NzEsIC8qIEdMX01BWF9WQVJZSU5HX0ZMT0FUUyAqLwotICAgICAgIDg3NSwgLyogR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICovCi0gICAgICAgODA0LCAvKiBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAqLwotICAgICAgIDk4NSwgLyogR0xfT0JKRUNUX1RZUEVfQVJCICovCi0gICAgICAxMzM4LCAvKiBHTF9TSEFERVJfVFlQRSAqLwotICAgICAgIDQ1MSwgLyogR0xfRkxPQVRfVkVDMiAqLwotICAgICAgIDQ1MywgLyogR0xfRkxPQVRfVkVDMyAqLwotICAgICAgIDQ1NSwgLyogR0xfRkxPQVRfVkVDNCAqLwotICAgICAgIDYwNiwgLyogR0xfSU5UX1ZFQzIgKi8KLSAgICAgICA2MDgsIC8qIEdMX0lOVF9WRUMzICovCi0gICAgICAgNjEwLCAvKiBHTF9JTlRfVkVDNCAqLwotICAgICAgICA5MywgLyogR0xfQk9PTCAqLwotICAgICAgICA5NSwgLyogR0xfQk9PTF9WRUMyICovCi0gICAgICAgIDk3LCAvKiBHTF9CT09MX1ZFQzMgKi8KLSAgICAgICAgOTksIC8qIEdMX0JPT0xfVkVDNCAqLwotICAgICAgIDQ0NSwgLyogR0xfRkxPQVRfTUFUMiAqLwotICAgICAgIDQ0NywgLyogR0xfRkxPQVRfTUFUMyAqLwotICAgICAgIDQ0OSwgLyogR0xfRkxPQVRfTUFUNCAqLwotICAgICAgMTI5NSwgLyogR0xfU0FNUExFUl8xRCAqLwotICAgICAgMTI5NywgLyogR0xfU0FNUExFUl8yRCAqLwotICAgICAgMTI5OSwgLyogR0xfU0FNUExFUl8zRCAqLwotICAgICAgMTMwMCwgLyogR0xfU0FNUExFUl9DVUJFICovCi0gICAgICAxMjk2LCAvKiBHTF9TQU1QTEVSXzFEX1NIQURPVyAqLwotICAgICAgMTI5OCwgLyogR0xfU0FNUExFUl8yRF9TSEFET1cgKi8KLSAgICAgICA1MjksIC8qIEdMX0dMX0ZMT0FUX01BVDJ4MyAqLwotICAgICAgIDUzMCwgLyogR0xfR0xfRkxPQVRfTUFUMng0ICovCi0gICAgICAgNTMxLCAvKiBHTF9HTF9GTE9BVF9NQVQzeDIgKi8KLSAgICAgICA1MzIsIC8qIEdMX0dMX0ZMT0FUX01BVDN4NCAqLwotICAgICAgIDUzMywgLyogR0xfR0xfRkxPQVRfTUFUNHgyICovCi0gICAgICAgNTM0LCAvKiBHTF9HTF9GTE9BVF9NQVQ0eDMgKi8KLSAgICAgICAzMTIsIC8qIEdMX0RFTEVURV9TVEFUVVMgKi8KLSAgICAgICAyMjEsIC8qIEdMX0NPTVBJTEVfU1RBVFVTICovCi0gICAgICAgNjU5LCAvKiBHTF9MSU5LX1NUQVRVUyAqLwotICAgICAgMTY3NywgLyogR0xfVkFMSURBVEVfU1RBVFVTICovCi0gICAgICAgNTkxLCAvKiBHTF9JTkZPX0xPR19MRU5HVEggKi8KLSAgICAgICAgNTYsIC8qIEdMX0FUVEFDSEVEX1NIQURFUlMgKi8KKyAgICAgICA4OTIsIC8qIEdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUICovCisgICAgICAxMzAyLCAvKiBHTF9TQU1QTEVTX1BBU1NFRCAqLworICAgICAgIDQ4NCwgLyogR0xfRlJBR01FTlRfU0hBREVSICovCisgICAgICAxNzI2LCAvKiBHTF9WRVJURVhfU0hBREVSICovCisgICAgICAxMTc2LCAvKiBHTF9QUk9HUkFNX09CSkVDVF9BUkIgKi8KKyAgICAgIDEzMzQsIC8qIEdMX1NIQURFUl9PQkpFQ1RfQVJCICovCisgICAgICAgODE3LCAvKiBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTICovCisgICAgICAgODc1LCAvKiBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworICAgICAgIDg2OSwgLyogR0xfTUFYX1ZBUllJTkdfRkxPQVRTICovCisgICAgICAgODczLCAvKiBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKyAgICAgICA4MDIsIC8qIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICovCisgICAgICAgOTgzLCAvKiBHTF9PQkpFQ1RfVFlQRV9BUkIgKi8KKyAgICAgIDEzMzYsIC8qIEdMX1NIQURFUl9UWVBFICovCisgICAgICAgNDQ5LCAvKiBHTF9GTE9BVF9WRUMyICovCisgICAgICAgNDUxLCAvKiBHTF9GTE9BVF9WRUMzICovCisgICAgICAgNDUzLCAvKiBHTF9GTE9BVF9WRUM0ICovCisgICAgICAgNjA0LCAvKiBHTF9JTlRfVkVDMiAqLworICAgICAgIDYwNiwgLyogR0xfSU5UX1ZFQzMgKi8KKyAgICAgICA2MDgsIC8qIEdMX0lOVF9WRUM0ICovCisgICAgICAgIDkyLCAvKiBHTF9CT09MICovCisgICAgICAgIDk0LCAvKiBHTF9CT09MX1ZFQzIgKi8KKyAgICAgICAgOTYsIC8qIEdMX0JPT0xfVkVDMyAqLworICAgICAgICA5OCwgLyogR0xfQk9PTF9WRUM0ICovCisgICAgICAgNDQzLCAvKiBHTF9GTE9BVF9NQVQyICovCisgICAgICAgNDQ1LCAvKiBHTF9GTE9BVF9NQVQzICovCisgICAgICAgNDQ3LCAvKiBHTF9GTE9BVF9NQVQ0ICovCisgICAgICAxMjkzLCAvKiBHTF9TQU1QTEVSXzFEICovCisgICAgICAxMjk1LCAvKiBHTF9TQU1QTEVSXzJEICovCisgICAgICAxMjk3LCAvKiBHTF9TQU1QTEVSXzNEICovCisgICAgICAxMjk4LCAvKiBHTF9TQU1QTEVSX0NVQkUgKi8KKyAgICAgIDEyOTQsIC8qIEdMX1NBTVBMRVJfMURfU0hBRE9XICovCisgICAgICAxMjk2LCAvKiBHTF9TQU1QTEVSXzJEX1NIQURPVyAqLworICAgICAgIDUyNywgLyogR0xfR0xfRkxPQVRfTUFUMngzICovCisgICAgICAgNTI4LCAvKiBHTF9HTF9GTE9BVF9NQVQyeDQgKi8KKyAgICAgICA1MjksIC8qIEdMX0dMX0ZMT0FUX01BVDN4MiAqLworICAgICAgIDUzMCwgLyogR0xfR0xfRkxPQVRfTUFUM3g0ICovCisgICAgICAgNTMxLCAvKiBHTF9HTF9GTE9BVF9NQVQ0eDIgKi8KKyAgICAgICA1MzIsIC8qIEdMX0dMX0ZMT0FUX01BVDR4MyAqLworICAgICAgIDMxMSwgLyogR0xfREVMRVRFX1NUQVRVUyAqLworICAgICAgIDIyMCwgLyogR0xfQ09NUElMRV9TVEFUVVMgKi8KKyAgICAgICA2NTcsIC8qIEdMX0xJTktfU1RBVFVTICovCisgICAgICAxNjc1LCAvKiBHTF9WQUxJREFURV9TVEFUVVMgKi8KKyAgICAgICA1ODksIC8qIEdMX0lORk9fTE9HX0xFTkdUSCAqLworICAgICAgICA1NSwgLyogR0xfQVRUQUNIRURfU0hBREVSUyAqLwogICAgICAgICAyMCwgLyogR0xfQUNUSVZFX1VOSUZPUk1TICovCiAgICAgICAgIDIxLCAvKiBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICovCi0gICAgICAxMzM3LCAvKiBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAqLworICAgICAgMTMzNSwgLyogR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggKi8KICAgICAgICAgMTUsIC8qIEdMX0FDVElWRV9BVFRSSUJVVEVTICovCiAgICAgICAgIDE2LCAvKiBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggKi8KLSAgICAgICA0ODgsIC8qIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlQgKi8KLSAgICAgIDEzNDAsIC8qIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAqLwotICAgICAgIDI5MCwgLyogR0xfQ1VSUkVOVF9QUk9HUkFNICovCi0gICAgICAxMDM0LCAvKiBHTF9QQUxFVFRFNF9SR0I4X09FUyAqLwotICAgICAgMTAzNiwgLyogR0xfUEFMRVRURTRfUkdCQThfT0VTICovCi0gICAgICAxMDMyLCAvKiBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgKi8KLSAgICAgIDEwMzUsIC8qIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAqLwotICAgICAgMTAzMywgLyogR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgKi8KLSAgICAgIDEwMzksIC8qIEdMX1BBTEVUVEU4X1JHQjhfT0VTICovCi0gICAgICAxMDQxLCAvKiBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgKi8KLSAgICAgIDEwMzcsIC8qIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAqLwotICAgICAgMTA0MCwgLyogR0xfUEFMRVRURThfUkdCQTRfT0VTICovCi0gICAgICAxMDM4LCAvKiBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAqLwotICAgICAgIDU3NCwgLyogR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAqLwotICAgICAgIDU3MywgLyogR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICovCi0gICAgICAxNTExLCAvKiBHTF9URVhUVVJFXzFEX0FSUkFZX0VYVCAqLwotICAgICAgMTE5OCwgLyogR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQgKi8KLSAgICAgIDE1MTMsIC8qIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICovCi0gICAgICAxMjAxLCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX0FSUkFZX0VYVCAqLwotICAgICAgMTUxOSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZX0VYVCAqLwotICAgICAgMTUyMSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZX0VYVCAqLwotICAgICAgIDU0MywgLyogR0xfR0xfU1JHQiAqLwotICAgICAgIDU0NCwgLyogR0xfR0xfU1JHQjggKi8KLSAgICAgICA1NDYsIC8qIEdMX0dMX1NSR0JfQUxQSEEgKi8KLSAgICAgICA1NDUsIC8qIEdMX0dMX1NSR0I4X0FMUEhBOCAqLwotICAgICAgIDU0MiwgLyogR0xfR0xfU0xVTUlOQU5DRV9BTFBIQSAqLwotICAgICAgIDU0MSwgLyogR0xfR0xfU0xVTUlOQU5DRThfQUxQSEE4ICovCi0gICAgICAgNTM5LCAvKiBHTF9HTF9TTFVNSU5BTkNFICovCi0gICAgICAgNTQwLCAvKiBHTF9HTF9TTFVNSU5BTkNFOCAqLwotICAgICAgIDUyNiwgLyogR0xfR0xfQ09NUFJFU1NFRF9TUkdCICovCi0gICAgICAgNTI3LCAvKiBHTF9HTF9DT01QUkVTU0VEX1NSR0JfQUxQSEEgKi8KLSAgICAgICA1MjQsIC8qIEdMX0dMX0NPTVBSRVNTRURfU0xVTUlOQU5DRSAqLwotICAgICAgIDUyNSwgLyogR0xfR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0FMUEhBICovCi0gICAgICAxMDk1LCAvKiBHTF9QT0lOVF9TUFJJVEVfQ09PUkRfT1JJR0lOICovCi0gICAgICAgNjY3LCAvKiBHTF9MT1dFUl9MRUZUICovCi0gICAgICAxNjc0LCAvKiBHTF9VUFBFUl9MRUZUICovCi0gICAgICAxNDA1LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfUkVGICovCi0gICAgICAxNDA2LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAqLwotICAgICAgMTQwNywgLyogR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyAqLwotICAgICAgIDQwMywgLyogR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAqLwotICAgICAgMTI0MCwgLyogR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfRVhUICovCi0gICAgICAxMjI1LCAvKiBHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCAqLwotICAgICAgIDQwNCwgLyogR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQgKi8KLSAgICAgIDEyMjQsIC8qIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19FWFQgKi8KLSAgICAgICA0OTAsIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUICovCi0gICAgICAgNDg5LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX0VYVCAqLwotICAgICAgIDQ5NCwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX0VYVCAqLwotICAgICAgIDQ5MiwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfRVhUICovCi0gICAgICAgNDkxLCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9FWFQgKi8KLSAgICAgICA0OTYsIC8qIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCAqLwotICAgICAgIDQ5OCwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX0VYVCAqLwotICAgICAgIDUwMywgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUICovCi0gICAgICAgNTAxLCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RVUExJQ0FURV9BVFRBQ0hNRU5UX0VYVCAqLwotICAgICAgIDQ5OSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX0VYVCAqLwotICAgICAgIDUwMiwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX0VYVCAqLwotICAgICAgIDUwMCwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EUkFXX0JVRkZFUl9FWFQgKi8KLSAgICAgICA1MDQsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfRVhUICovCi0gICAgICAgNTA2LCAvKiBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9FWFQgKi8KLSAgICAgICA1MDUsIC8qIEdMX0ZSQU1FQlVGRkVSX1NUQVRVU19FUlJPUl9FWFQgKi8KLSAgICAgICA4MDEsIC8qIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19FWFQgKi8KLSAgICAgICAxNDYsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCAqLwotICAgICAgIDE1MywgLyogR0xfQ09MT1JfQVRUQUNITUVOVDFfRVhUICovCi0gICAgICAgMTU0LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9FWFQgKi8KLSAgICAgICAxNTUsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVCAqLwotICAgICAgIDE1NiwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDRfRVhUICovCi0gICAgICAgMTU3LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQgKi8KLSAgICAgICAxNTgsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVCAqLwotICAgICAgIDE1OSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDdfRVhUICovCi0gICAgICAgMTYwLCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9FWFQgKi8KLSAgICAgICAxNjEsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X0VYVCAqLwotICAgICAgIDE0NywgLyogR0xfQ09MT1JfQVRUQUNITUVOVDEwX0VYVCAqLwotICAgICAgIDE0OCwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDExX0VYVCAqLwotICAgICAgIDE0OSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDEyX0VYVCAqLwotICAgICAgIDE1MCwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDEzX0VYVCAqLwotICAgICAgIDE1MSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDE0X0VYVCAqLwotICAgICAgIDE1MiwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDE1X0VYVCAqLwotICAgICAgIDMxNCwgLyogR0xfREVQVEhfQVRUQUNITUVOVF9FWFQgKi8KLSAgICAgIDEzOTYsIC8qIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQgKi8KLSAgICAgICA0OTcsIC8qIEdMX0ZSQU1FQlVGRkVSX0VYVCAqLwotICAgICAgMTI0MSwgLyogR0xfUkVOREVSQlVGRkVSX0VYVCAqLwotICAgICAgMTI0NCwgLyogR0xfUkVOREVSQlVGRkVSX1dJRFRIX0VYVCAqLwotICAgICAgMTI0MiwgLyogR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9FWFQgKi8KLSAgICAgIDEyNDMsIC8qIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfRVhUICovCi0gICAgICAxNDE4LCAvKiBHTF9TVEVOQ0lMX0lOREVYX0VYVCAqLwotICAgICAgMTQxNSwgLyogR0xfU1RFTkNJTF9JTkRFWDFfRVhUICovCi0gICAgICAxNDE2LCAvKiBHTF9TVEVOQ0lMX0lOREVYNF9FWFQgKi8KLSAgICAgIDE0MTcsIC8qIEdMX1NURU5DSUxfSU5ERVg4X0VYVCAqLwotICAgICAgMTQxNCwgLyogR0xfU1RFTkNJTF9JTkRFWDE2X0VYVCAqLwotICAgICAgIDQyOCwgLyogR0xfRVZBTF9CSVQgKi8KLSAgICAgIDEyMjIsIC8qIEdMX1JBU1RFUl9QT1NJVElPTl9VTkNMSVBQRURfSUJNICovCi0gICAgICAgNjYxLCAvKiBHTF9MSVNUX0JJVCAqLwotICAgICAgMTUyNywgLyogR0xfVEVYVFVSRV9CSVQgKi8KLSAgICAgIDEzMTksIC8qIEdMX1NDSVNTT1JfQklUICovCisgICAgICAgNDg2LCAvKiBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UICovCisgICAgICAxMzM4LCAvKiBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gKi8KKyAgICAgICAyODksIC8qIEdMX0NVUlJFTlRfUFJPR1JBTSAqLworICAgICAgMTAzMiwgLyogR0xfUEFMRVRURTRfUkdCOF9PRVMgKi8KKyAgICAgIDEwMzQsIC8qIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAqLworICAgICAgMTAzMCwgLyogR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICovCisgICAgICAxMDMzLCAvKiBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgKi8KKyAgICAgIDEwMzEsIC8qIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICovCisgICAgICAxMDM3LCAvKiBHTF9QQUxFVFRFOF9SR0I4X09FUyAqLworICAgICAgMTAzOSwgLyogR0xfUEFMRVRURThfUkdCQThfT0VTICovCisgICAgICAxMDM1LCAvKiBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgKi8KKyAgICAgIDEwMzgsIC8qIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAqLworICAgICAgMTAzNiwgLyogR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgKi8KKyAgICAgICA1NzIsIC8qIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgKi8KKyAgICAgICA1NzEsIC8qIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAqLworICAgICAgMTUwOSwgLyogR0xfVEVYVFVSRV8xRF9BUlJBWV9FWFQgKi8KKyAgICAgIDExOTYsIC8qIEdMX1BST1hZX1RFWFRVUkVfMURfQVJSQVlfRVhUICovCisgICAgICAxNTExLCAvKiBHTF9URVhUVVJFXzJEX0FSUkFZX0VYVCAqLworICAgICAgMTE5OSwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQgKi8KKyAgICAgIDE1MTcsIC8qIEdMX1RFWFRVUkVfQklORElOR18xRF9BUlJBWV9FWFQgKi8KKyAgICAgIDE1MTksIC8qIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWV9FWFQgKi8KKyAgICAgICA1NDEsIC8qIEdMX0dMX1NSR0IgKi8KKyAgICAgICA1NDIsIC8qIEdMX0dMX1NSR0I4ICovCisgICAgICAgNTQ0LCAvKiBHTF9HTF9TUkdCX0FMUEhBICovCisgICAgICAgNTQzLCAvKiBHTF9HTF9TUkdCOF9BTFBIQTggKi8KKyAgICAgICA1NDAsIC8qIEdMX0dMX1NMVU1JTkFOQ0VfQUxQSEEgKi8KKyAgICAgICA1MzksIC8qIEdMX0dMX1NMVU1JTkFOQ0U4X0FMUEhBOCAqLworICAgICAgIDUzNywgLyogR0xfR0xfU0xVTUlOQU5DRSAqLworICAgICAgIDUzOCwgLyogR0xfR0xfU0xVTUlOQU5DRTggKi8KKyAgICAgICA1MjQsIC8qIEdMX0dMX0NPTVBSRVNTRURfU1JHQiAqLworICAgICAgIDUyNSwgLyogR0xfR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBICovCisgICAgICAgNTIyLCAvKiBHTF9HTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0UgKi8KKyAgICAgICA1MjMsIC8qIEdMX0dMX0NPTVBSRVNTRURfU0xVTUlOQU5DRV9BTFBIQSAqLworICAgICAgMTA5MywgLyogR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAqLworICAgICAgIDY2NSwgLyogR0xfTE9XRVJfTEVGVCAqLworICAgICAgMTY3MiwgLyogR0xfVVBQRVJfTEVGVCAqLworICAgICAgMTQwMywgLyogR0xfU1RFTkNJTF9CQUNLX1JFRiAqLworICAgICAgMTQwNCwgLyogR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgKi8KKyAgICAgIDE0MDUsIC8qIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgKi8KKyAgICAgICA0MDIsIC8qIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19FWFQgKi8KKyAgICAgIDEyMzgsIC8qIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCAqLworICAgICAgMTIyMywgLyogR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQgKi8KKyAgICAgICA0MDMsIC8qIEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhUICovCisgICAgICAxMjIyLCAvKiBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUICovCisgICAgICAgNDg4LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX0VYVCAqLworICAgICAgIDQ4NywgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9FWFQgKi8KKyAgICAgICA0OTIsIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9FWFQgKi8KKyAgICAgICA0OTAsIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX0VYVCAqLworICAgICAgIDQ4OSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFXzNEX1pPRkZTRVRfRVhUICovCisgICAgICAgNDk0LCAvKiBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQgKi8KKyAgICAgICA0OTYsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9FWFQgKi8KKyAgICAgICA1MDEsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX0VYVCAqLworICAgICAgIDQ5OSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EVVBMSUNBVEVfQVRUQUNITUVOVF9FWFQgKi8KKyAgICAgICA0OTcsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19FWFQgKi8KKyAgICAgICA1MDAsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFQgKi8KKyAgICAgICA0OTgsIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfRVhUICovCisgICAgICAgNTAyLCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX0VYVCAqLworICAgICAgIDUwNCwgLyogR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfRVhUICovCisgICAgICAgNTAzLCAvKiBHTF9GUkFNRUJVRkZFUl9TVEFUVVNfRVJST1JfRVhUICovCisgICAgICAgNzk5LCAvKiBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUICovCisgICAgICAgMTQ1LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQgKi8KKyAgICAgICAxNTIsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxX0VYVCAqLworICAgICAgIDE1MywgLyogR0xfQ09MT1JfQVRUQUNITUVOVDJfRVhUICovCisgICAgICAgMTU0LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UM19FWFQgKi8KKyAgICAgICAxNTUsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X0VYVCAqLworICAgICAgIDE1NiwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDVfRVhUICovCisgICAgICAgMTU3LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9FWFQgKi8KKyAgICAgICAxNTgsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X0VYVCAqLworICAgICAgIDE1OSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDhfRVhUICovCisgICAgICAgMTYwLCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9FWFQgKi8KKyAgICAgICAxNDYsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9FWFQgKi8KKyAgICAgICAxNDcsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9FWFQgKi8KKyAgICAgICAxNDgsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9FWFQgKi8KKyAgICAgICAxNDksIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19FWFQgKi8KKyAgICAgICAxNTAsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9FWFQgKi8KKyAgICAgICAxNTEsIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9FWFQgKi8KKyAgICAgICAzMTMsIC8qIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhUICovCisgICAgICAxMzk0LCAvKiBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhUICovCisgICAgICAgNDk1LCAvKiBHTF9GUkFNRUJVRkZFUl9FWFQgKi8KKyAgICAgIDEyMzksIC8qIEdMX1JFTkRFUkJVRkZFUl9FWFQgKi8KKyAgICAgIDEyNDIsIC8qIEdMX1JFTkRFUkJVRkZFUl9XSURUSF9FWFQgKi8KKyAgICAgIDEyNDAsIC8qIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfRVhUICovCisgICAgICAxMjQxLCAvKiBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX0VYVCAqLworICAgICAgMTQxNiwgLyogR0xfU1RFTkNJTF9JTkRFWF9FWFQgKi8KKyAgICAgIDE0MTMsIC8qIEdMX1NURU5DSUxfSU5ERVgxX0VYVCAqLworICAgICAgMTQxNCwgLyogR0xfU1RFTkNJTF9JTkRFWDRfRVhUICovCisgICAgICAxNDE1LCAvKiBHTF9TVEVOQ0lMX0lOREVYOF9FWFQgKi8KKyAgICAgIDE0MTIsIC8qIEdMX1NURU5DSUxfSU5ERVgxNl9FWFQgKi8KKyAgICAgICA0MjYsIC8qIEdMX0VWQUxfQklUICovCisgICAgICAxMjIwLCAvKiBHTF9SQVNURVJfUE9TSVRJT05fVU5DTElQUEVEX0lCTSAqLworICAgICAgIDY1OSwgLyogR0xfTElTVF9CSVQgKi8KKyAgICAgIDE1MjUsIC8qIEdMX1RFWFRVUkVfQklUICovCisgICAgICAxMzE3LCAvKiBHTF9TQ0lTU09SX0JJVCAqLwogICAgICAgICAyOSwgLyogR0xfQUxMX0FUVFJJQl9CSVRTICovCi0gICAgICAgOTQxLCAvKiBHTF9NVUxUSVNBTVBMRV9CSVQgKi8KKyAgICAgICA5MzksIC8qIEdMX01VTFRJU0FNUExFX0JJVCAqLwogICAgICAgICAzMCwgLyogR0xfQUxMX0NMSUVOVF9BVFRSSUJfQklUUyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9leGVjbWVtLmMgYi9zcmMvbWVzYS9tYWluL2V4ZWNtZW0uYwppbmRleCAwZmU4NWFmLi5mOTVjMzE4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2V4ZWNtZW0uYworKysgYi9zcmMvbWVzYS9tYWluL2V4ZWNtZW0uYwpAQCAtNjUsOSArNjUsMTcgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpleGVjX21lbSA9IE5VTEw7CiAKIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGluaXRfaGVhcCh2b2lkKQogeworI2lmZGVmIE1FU0FfU0VMSU5VWAorICAgaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisgICAgICBpZiAoIXNlY3VyaXR5X2dldF9ib29sZWFuX2FjdGl2ZSgiYWxsb3dfZXhlY21lbSIpIHx8CisJICAhc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZygiYWxsb3dfZXhlY21lbSIpKQorICAgICAgICAgcmV0dXJuIDA7CisgICB9CisjZW5kaWYKKwogICAgaWYgKCFleGVjX2hlYXApCiAgICAgICBleGVjX2hlYXAgPSBtbUluaXQoIDAsIEVYRUNfSEVBUF9TSVpFICk7CiAgICAKQEAgLTc1LDYgKzgzLDggQEAKICAgICAgIGV4ZWNfbWVtID0gKHVuc2lnbmVkIGNoYXIgKikgbW1hcCgwLCBFWEVDX0hFQVBfU0laRSwgCiAJCQkJCVBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIAogCQkJCQlNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKworICAgcmV0dXJuIChleGVjX21lbSAhPSBOVUxMKTsKIH0KIAogCkBAIC04Niw3ICs5Niw4IEBACiAKICAgIF9nbHRocmVhZF9MT0NLX01VVEVYKGV4ZWNfbXV0ZXgpOwogCi0gICBpbml0X2hlYXAoKTsKKyAgIGlmICghaW5pdF9oZWFwKCkpCisgICAgICBnb3RvIGJhaWw7CiAKICAgIGlmIChleGVjX2hlYXApIHsKICAgICAgIHNpemUgPSAoc2l6ZSArIDMxKSAmIH4zMTsKQEAgLTk3LDcgKzEwOCw4IEBACiAgICAgICBhZGRyID0gZXhlY19tZW0gKyBibG9jay0+b2ZzOwogICAgZWxzZSAKICAgICAgIF9tZXNhX3ByaW50ZigiX21lc2FfZXhlY19tYWxsb2MgZmFpbGVkXG4iKTsKLSAgIAorCitiYWlsOgogICAgX2dsdGhyZWFkX1VOTE9DS19NVVRFWChleGVjX211dGV4KTsKICAgIAogICAgcmV0dXJuIGFkZHI7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2V4dGVuc2lvbnMuYyBiL3NyYy9tZXNhL21haW4vZXh0ZW5zaW9ucy5jCmluZGV4IGU1Mjc5ZTcuLjQwYTJjMWIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vZXh0ZW5zaW9ucy5jCisrKyBiL3NyYy9tZXNhL21haW4vZXh0ZW5zaW9ucy5jCkBAIC0yMDQsNyArMjA0LDcgQEAKICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGluZ19sYW5ndWFnZV8xMDAgPSBHTF9UUlVFOwogI2VuZGlmCiAjaWYgRkVBVFVSRV9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMjAKLSAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGluZ19sYW5ndWFnZV8xMjAgPSBHTF9UUlVFOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9zaGFkaW5nX2xhbmd1YWdlXzEyMCA9IEdMX0ZBTFNFOyAvKiBub3QgcXVpdGUgZG9uZSAqLwogI2VuZGlmCiAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRvdyA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfYm9yZGVyX2NsYW1wID0gR0xfVFJVRTsKQEAgLTMwOSw2ICszMDksNyBAQAogewogICAgY3R4LT5FeHRlbnNpb25zLkFSQl9pbWFnaW5nID0gR0xfVFJVRTsKICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfYmxlbmRfY29sb3IgPSBHTF9UUlVFOworICAgY3R4LT5FeHRlbnNpb25zLkVYVF9ibGVuZF9sb2dpY19vcCA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX21pbm1heCA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX3N1YnRyYWN0ID0gR0xfVFJVRTsKICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfY29udm9sdXRpb24gPSBHTF9UUlVFOwpAQCAtMzUzLDcgKzM1NCw2IEBACiAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3dpbmRvd19wb3MgPSBHTF9UUlVFOwogICAgY3R4LT5FeHRlbnNpb25zLkVYVF9ibGVuZF9jb2xvciA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUgPSBHTF9UUlVFOwotICAgY3R4LT5FeHRlbnNpb25zLkVYVF9ibGVuZF9sb2dpY19vcCA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX21pbm1heCA9IEdMX1RSVUU7CiAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX3N1YnRyYWN0ID0gR0xfVFJVRTsKICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfZm9nX2Nvb3JkID0gR0xfVFJVRTsKQEAgLTQxOSw3ICs0MTksNyBAQAogICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlX3NSR0IgPSBHTF9UUlVFOwogI2VuZGlmCiAjaWZkZWYgRkVBVFVSRV9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMjAKLSAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGluZ19sYW5ndWFnZV8xMjAgPSBHTF9UUlVFOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9zaGFkaW5nX2xhbmd1YWdlXzEyMCA9IEdMX0ZBTFNFOyAvKiBub3QgcXVpdGUgZG9uZSAqLwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vZmJvYmplY3QuYyBiL3NyYy9tZXNhL21haW4vZmJvYmplY3QuYwppbmRleCBiNTYwNWExLi5kZDA2MzI3IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2Zib2JqZWN0LmMKKysrIGIvc3JjL21lc2EvbWFpbi9mYm9iamVjdC5jCkBAIC05ODMsOSArOTgzLDExIEBACiAgICB9CiAKICAgIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgX05FV19CVUZGRVJTKTsKKwogICAgaWYgKGN0eC0+RHJpdmVyLkZsdXNoKSB7ICAKICAgICAgIGN0eC0+RHJpdmVyLkZsdXNoKGN0eCk7CiAgICB9CisKICAgIGlmIChmcmFtZWJ1ZmZlcikgewogICAgICAgLyogQmluZGluZyBhIHVzZXItY3JlYXRlZCBmcmFtZWJ1ZmZlciBvYmplY3QgKi8KICAgICAgIG5ld0ZiID0gX21lc2FfbG9va3VwX2ZyYW1lYnVmZmVyKGN0eCwgZnJhbWVidWZmZXIpOwpAQCAtMTAxOSwzMiArMTAyMSwxOCBAQAogICAgICogWFhYIGNoZWNrIGlmIHJlLWJpbmRpbmcgc2FtZSBidWZmZXIgYW5kIHNraXAgc29tZSBvZiB0aGlzIGNvZGUuCiAgICAgKi8KIAotICAgLyogZm9yIHdpbmRvdy1mcmFtZWJ1ZmZlcnMsIHJlLWluaXRpYWxpemUgdGhlIGZibyB2YWx1ZXMsIGFzIHRoZXkKLSAgICAgIGNvdWxkIGJlIHdyb25nIChtYWtlY3VycmVudCB3aXRoIGEgbmV3IGRyYXdhYmxlIHdoaWxlIHN0aWxsIGEgZmJvCi0gICAgICB3YXMgYm91bmQgd2lsbCBsZWFkIHRvIGRlZmF1bHQgaW5pdCBmYm8gdmFsdWVzKS4KLSAgICAgIG5vdGUgdGhhdCB0aGVyZWZvcmUgdGhlIGNvbnRleHQgUmVhZEJ1ZmZlci9EcmF3QnVmZmVyIHZhbHVlcyBhcmUgbm90Ci0gICAgICB2YWxpZCB3aGlsZSBmYm8ncyBhcmUgYm91bmQhISEgKi8KICAgIGlmIChiaW5kUmVhZEJ1ZikgewogICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZjdHgtPlJlYWRCdWZmZXIsIG5ld0ZicmVhZCk7Ci0gICAgICBpZiAoIW5ld0ZicmVhZC0+TmFtZSkgewotICAgICAgICAgX21lc2FfcmVhZGJ1ZmZlcl91cGRhdGVfZmllbGRzKGN0eCwgY3R4LT5QaXhlbC5SZWFkQnVmZmVyKTsKLSAgICAgIH0KICAgIH0KIAogICAgaWYgKGJpbmREcmF3QnVmKSB7CiAgICAgICAvKiBjaGVjayBpZiBvbGQgRkIgaGFkIGFueSB0ZXh0dXJlIGF0dGFjaG1lbnRzICovCiAgICAgICBjaGVja19lbmRfdGV4dHVyZV9yZW5kZXIoY3R4LCBjdHgtPkRyYXdCdWZmZXIpOworCiAgICAgICAvKiBjaGVjayBpZiB0aW1lIHRvIGRlbGV0ZSB0aGlzIGZyYW1lYnVmZmVyICovCiAgICAgICBfbWVzYV9yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+RHJhd0J1ZmZlciwgbmV3RmIpOwotICAgICAgaWYgKCFuZXdGYi0+TmFtZSkgewotICAgICAgICAgR0x1aW50IGk7Ci0gICAgICAgICBHTGVudW0gYnVmZmVyc1tNQVhfRFJBV19CVUZGRVJTXTsKLSAgICAgICAgIGZvcihpID0gMDsgaSA8IGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnM7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyc1tpXSA9IGN0eC0+Q29sb3IuRHJhd0J1ZmZlcltpXTsKLSAgICAgICAgIH0KLSAgICAgICAgIF9tZXNhX2RyYXdidWZmZXJzKGN0eCwgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycywgYnVmZmVycywgTlVMTCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKworICAgICAgaWYgKG5ld0ZiLT5OYW1lICE9IDApIHsKICAgICAgICAgIC8qIGNoZWNrIGlmIG5ld2x5IGJvdW5kIGZyYW1lYnVmZmVyIGhhcyBhbnkgdGV4dHVyZSBhdHRhY2htZW50cyAqLwogICAgICAgICAgY2hlY2tfYmVnaW5fdGV4dHVyZV9yZW5kZXIoY3R4LCBuZXdGYik7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2ZyYW1lYnVmZmVyLmMgYi9zcmMvbWVzYS9tYWluL2ZyYW1lYnVmZmVyLmMKaW5kZXggZGFiNDQ5Zi4uYWJhODg3YSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9mcmFtZWJ1ZmZlci5jCisrKyBiL3NyYy9tZXNhL21haW4vZnJhbWVidWZmZXIuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKICNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJkZXB0aHN0ZW5jaWwuaCIKICNpbmNsdWRlICJtdHlwZXMuaCIKQEAgLTEwOCw4ICsxMDksOSBAQAogICAgaWYgKGZiKSB7CiAgICAgICBmYi0+TmFtZSA9IG5hbWU7CiAgICAgICBmYi0+UmVmQ291bnQgPSAxOworICAgICAgZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzID0gMTsKICAgICAgIGZiLT5Db2xvckRyYXdCdWZmZXJbMF0gPSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQ7Ci0gICAgICBmYi0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gPSBCVUZGRVJfQklUX0NPTE9SMDsKKyAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1swXSA9IEJVRkZFUl9DT0xPUjA7CiAgICAgICBmYi0+Q29sb3JSZWFkQnVmZmVyID0gR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhUOwogICAgICAgZmItPl9Db2xvclJlYWRCdWZmZXJJbmRleCA9IEJVRkZFUl9DT0xPUjA7CiAgICAgICBmYi0+RGVsZXRlID0gX21lc2FfZGVzdHJveV9mcmFtZWJ1ZmZlcjsKQEAgLTEzOCwxNiArMTQwLDE4IEBACiAgICAvKiBzYXZlIHRoZSB2aXN1YWwgKi8KICAgIGZiLT5WaXN1YWwgPSAqdmlzdWFsOwogCi0gICAvKiBJbml0IGdsUmVhZC9EcmF3QnVmZmVyIHN0YXRlICovCisgICAvKiBJbml0IHJlYWQvZHJhdyByZW5kZXJidWZmZXIgc3RhdGUgKi8KICAgIGlmICh2aXN1YWwtPmRvdWJsZUJ1ZmZlck1vZGUpIHsKKyAgICAgIGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA9IDE7CiAgICAgICBmYi0+Q29sb3JEcmF3QnVmZmVyWzBdID0gR0xfQkFDSzsKLSAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSA9IEJVRkZFUl9CSVRfQkFDS19MRUZUOworICAgICAgZmItPl9Db2xvckRyYXdCdWZmZXJJbmRleGVzWzBdID0gQlVGRkVSX0JBQ0tfTEVGVDsKICAgICAgIGZiLT5Db2xvclJlYWRCdWZmZXIgPSBHTF9CQUNLOwogICAgICAgZmItPl9Db2xvclJlYWRCdWZmZXJJbmRleCA9IEJVRkZFUl9CQUNLX0xFRlQ7CiAgICB9CiAgICBlbHNlIHsKKyAgICAgIGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA9IDE7CiAgICAgICBmYi0+Q29sb3JEcmF3QnVmZmVyWzBdID0gR0xfRlJPTlQ7Ci0gICAgICBmYi0+X0NvbG9yRHJhd0J1ZmZlck1hc2tbMF0gPSBCVUZGRVJfQklUX0ZST05UX0xFRlQ7CisgICAgICBmYi0+X0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbMF0gPSBCVUZGRVJfRlJPTlRfTEVGVDsKICAgICAgIGZiLT5Db2xvclJlYWRCdWZmZXIgPSBHTF9GUk9OVDsKICAgICAgIGZiLT5fQ29sb3JSZWFkQnVmZmVySW5kZXggPSBCVUZGRVJfRlJPTlRfTEVGVDsKICAgIH0KQEAgLTY2MCw4ICs2NjQsNTMgQEAKIH0KIAogCisvKgorICogRXhhbXBsZSBEcmF3QnVmZmVycyBzY2VuYXJpb3M6CisgKgorICogMS4gZ2xEcmF3QnVmZmVyKEdMX0ZST05UX0FORF9CQUNLKSwgZml4ZWQtZnVuYyBvciBzaGFkZXIgd3JpdGVzIHRvCisgKiAiZ2xfRnJhZ0NvbG9yIiBvciBwcm9ncmFtIHdyaXRlcyB0byB0aGUgInJlc3VsdC5jb2xvciIgcmVnaXN0ZXI6CisgKgorICogICBmcmFnbWVudCBjb2xvciBvdXRwdXQgICByZW5kZXJidWZmZXIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgIGNvbG9yWzBdICAgICAgICAgICAgICAgIEZyb250LCBCYWNrCisgKgorICoKKyAqIDIuIGdsRHJhd0J1ZmZlcnMoMywgW0dMX0ZST05ULCBHTF9BVVgwLCBHTF9BVVgxXSksIHNoYWRlciB3cml0ZXMgdG8KKyAqIGdsX0ZyYWdEYXRhW2ldIG9yIHByb2dyYW0gd3JpdGVzIHRvIHJlc3VsdC5jb2xvcltpXSByZWdpc3RlcnM6CisgKgorICogICBmcmFnbWVudCBjb2xvciBvdXRwdXQgICByZW5kZXJidWZmZXIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgIGNvbG9yWzBdICAgICAgICAgICAgICAgIEZyb250CisgKiAgIGNvbG9yWzFdICAgICAgICAgICAgICAgIEF1eDAKKyAqICAgY29sb3JbM10gICAgICAgICAgICAgICAgQXV4MQorICoKKyAqCisgKiAzLiBnbERyYXdCdWZmZXJzKDMsIFtHTF9GUk9OVCwgR0xfQVVYMCwgR0xfQVVYMV0pIGFuZCBzaGFkZXIgd3JpdGVzIHRvCisgKiBnbF9GcmFnQ29sb3IsIG9yIGZpeGVkIGZ1bmN0aW9uOgorICoKKyAqICAgZnJhZ21lbnQgY29sb3Igb3V0cHV0ICAgcmVuZGVyYnVmZmVyCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLQorICogICBjb2xvclswXSAgICAgICAgICAgICAgICBGcm9udCwgQXV4MCwgQXV4MQorICoKKyAqCisgKiBJbiBlaXRoZXIgY2FzZSwgdGhlIGxpc3Qgb2YgcmVuZGVyYnVmZmVycyBpcyBzdG9yZWQgaW4gdGhlCisgKiBmcmFtZWJ1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbXSBhcnJheSBhbmQKKyAqIGZyYW1lYnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBidWZmZXJzLgorICogVGhlIHJlbmRlcmVyIChsaWtlIHN3cmFzdCkgaGFzIHRvIGxvb2sgYXQgdGhlIGN1cnJlbnQgZnJhZ21lbnQgc2hhZGVyCisgKiB0byBzZWUgaWYgaXQgd3JpdGVzIHRvIGdsX0ZyYWdDb2xvciB2cy4gZ2xfRnJhZ0RhdGFbaV0gdG8gZGV0ZXJtaW5lCisgKiBob3cgdG8gbWFwIGNvbG9yIG91dHB1dHMgdG8gcmVuZGVyYnVmZmVycy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgdHdvIGNhbGxzIGFyZSBlcXVpdmFsZW50IChmb3IgZml4ZWQgZnVuY3Rpb24gZnJhZ21lbnQKKyAqIHNoYWRpbmcgYW55d2F5KToKKyAqICAgYSkgIGdsRHJhd0J1ZmZlcihHTF9GUk9OVF9BTkRfQkFDSyk7ICAoYXNzdW1pbmcgbm9uLXN0ZXJlbyBmcmFtZWJ1ZmZlcikKKyAqICAgYikgIGdsRHJhd0J1ZmZlcnMoMiwgW0dMX0ZST05UX0xFRlQsIEdMX0JBQ0tfTEVGVF0pOworICovCisKKworCisKIC8qKgotICogVXBkYXRlIHRoZSBsaXN0IG9mIGNvbG9yIGRyYXdpbmcgcmVuZGVyYnVmZmVyIHBvaW50ZXJzLgorICogVXBkYXRlIHRoZSAoZGVyaXZlZCkgbGlzdCBvZiBjb2xvciBkcmF3aW5nIHJlbmRlcmJ1ZmZlciBwb2ludGVycy4KICAqIExhdGVyLCB3aGVuIHdlJ3JlIHJlbmRlcmluZyB3ZSdsbCBsb29wIGZyb20gMCB0byBfTnVtQ29sb3JEcmF3QnVmZmVycwogICogd3JpdGluZyBjb2xvcnMuCiAgKi8KQEAgLTY3MCw0MiArNzE5LDIzIEBACiB7CiAgICBHTHVpbnQgb3V0cHV0OwogCi0gICAvKgotICAgICogRnJhZ21lbnQgcHJvZ3JhbXMgY2FuIHdyaXRlIHRvIG11bHRpcGxlIGNvbG9yYnVmZmVycyB3aXRoCi0gICAgKiB0aGUgR0xfQVJCX2RyYXdfYnVmZmVycyBleHRlbnNpb24uCi0gICAgKi8KLSAgIGZvciAob3V0cHV0ID0gMDsgb3V0cHV0IDwgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVyczsgb3V0cHV0KyspIHsKLSAgICAgIEdMYml0ZmllbGQgYnVmZmVyTWFzayA9IGZiLT5fQ29sb3JEcmF3QnVmZmVyTWFza1tvdXRwdXRdOwotICAgICAgR0x1aW50IGNvdW50ID0gMDsKLSAgICAgIEdMdWludCBpOwotICAgICAgaWYgKCFmYi0+RGVsZXRlUGVuZGluZykgewotICAgICAgICAgLyogV2UgbmVlZCB0aGUgaW5uZXIgbG9vcCBoZXJlIGJlY2F1c2UgZ2xEcmF3QnVmZmVyKEdMX0ZST05UX0FORF9CQUNLKQotICAgICAgICAgICogY2FuIHNwZWNpZnkgd3JpdGluZyB0byB0d28gb3IgZm91ciBjb2xvciBidWZmZXJzIChmb3IgZXhhbXBsZSkuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGZvciAoaSA9IDA7IGJ1ZmZlck1hc2sgJiYgaSA8IEJVRkZFUl9DT1VOVDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBHTHVpbnQgYnVmZmVyQml0ID0gMSA8PCBpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlckJpdCAmIGJ1ZmZlck1hc2spIHsKLSAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gZmItPkF0dGFjaG1lbnRbaV0uUmVuZGVyYnVmZmVyOwotICAgICAgICAgICAgICAgaWYgKHJiICYmIHJiLT5XaWR0aCA+IDAgJiYgcmItPkhlaWdodCA+IDApIHsKLSAgICAgICAgICAgICAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVyc1tvdXRwdXRdW2NvdW50XSA9IHJiOwotICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgIF9tZXNhX3dhcm5pbmcoY3R4LCAiRHJhd0J1ZmZlciBuYW1lcyBhIG1pc3NpbmcgYnVmZmVyIVxuIik7Ci0gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYnVmZmVyTWFzayAmPSB+YnVmZmVyQml0OwotICAgICAgICAgICAgfQotICAgICAgICAgfQorICAgLyogc2V0IDB0aCBidWZmZXIgdG8gTlVMTCBub3cgaW4gY2FzZSBfTnVtQ29sb3JEcmF3QnVmZmVycyBpcyB6ZXJvICovCisgICBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0gPSBOVUxMOworCisgICBmb3IgKG91dHB1dCA9IDA7IG91dHB1dCA8IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgb3V0cHV0KyspIHsKKyAgICAgIEdMaW50IGJ1ZiA9IGZiLT5fQ29sb3JEcmF3QnVmZmVySW5kZXhlc1tvdXRwdXRdOworICAgICAgaWYgKGJ1ZiA+PSAwKSB7CisgICAgICAgICBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbb3V0cHV0XSA9IGZiLT5BdHRhY2htZW50W2J1Zl0uUmVuZGVyYnVmZmVyOwogICAgICAgfQotICAgICAgZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzW291dHB1dF0gPSBjb3VudDsKKyAgICAgIGVsc2UgeworICAgICAgICAgZmItPl9Db2xvckRyYXdCdWZmZXJzW291dHB1dF0gPSBOVUxMOworICAgICAgfQogICAgfQogfQogCiAKIC8qKgotICogVXBkYXRlIHRoZSBjb2xvciByZWFkIHJlbmRlcmJ1ZmZlciBwb2ludGVyLgorICogVXBkYXRlIHRoZSAoZGVyaXZlZCkgY29sb3IgcmVhZCByZW5kZXJidWZmZXIgcG9pbnRlci4KICAqIFVubGlrZSB0aGUgRHJhd0J1ZmZlciwgd2UgY2FuIG9ubHkgcmVhZCBmcm9tIG9uZSAob3IgemVybykgY29sb3IgYnVmZmVycy4KICAqLwogc3RhdGljIHZvaWQKQEAgLTcyNywxOSArNzU3LDUxIEBACiB9CiAKIAorLyoqCisgKiBVcGRhdGUgYSBnbF9mcmFtZWJ1ZmZlcidzIGRlcml2ZWQgc3RhdGUuCisgKgorICogU3BlY2lmaWNhbGx5LCB1cGRhdGUgdGhlc2UgZnJhbWVidWZmZXIgZmllbGRzOgorICogICAgX0NvbG9yRHJhd0J1ZmZlcnMKKyAqICAgIF9OdW1Db2xvckRyYXdCdWZmZXJzCisgKiAgICBfQ29sb3JSZWFkQnVmZmVyCisgKiAgICBfRGVwdGhCdWZmZXIKKyAqICAgIF9TdGVuY2lsQnVmZmVyCisgKgorICogSWYgdGhlIGZyYW1lYnVmZmVyIGlzIHVzZXItY3JlYXRlZCwgbWFrZSBzdXJlIGl0J3MgY29tcGxldGUuCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgKGF0IGxlYXN0KSBjYW4gZWZmZWN0IGZyYW1lYnVmZmVyIHN0YXRlOgorICogZ2xSZWFkQnVmZmVyLCBnbERyYXdCdWZmZXIsIGdsRHJhd0J1ZmZlcnNBUkIsIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQsCisgKiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQuCisgKi8KIHN0YXRpYyB2b2lkCiB1cGRhdGVfZnJhbWVidWZmZXIoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIpCiB7Ci0gICAvKiBDb21wbGV0ZW5lc3Mgb25seSBtYXR0ZXJzIGZvciB1c2VyLWNyZWF0ZWQgZnJhbWVidWZmZXJzICovCi0gICBpZiAoZmItPk5hbWUgIT0gMCkgewotICAgICAgLyogWFhYOiBFWFRfZnJhbWVidWZmZXJfYmxpdDoKLSAgICAgICAgIGZyYW1lYnVmZmVyIG11c3Qgc3RpbGwgYmUgY29tcGxldGUgd3J0IHJlYWQvZHJhdz8gKi8KKyAgIGlmIChmYi0+TmFtZSA9PSAwKSB7CisgICAgICAvKiBUaGlzIGlzIGEgd2luZG93LXN5c3RlbSBmcmFtZWJ1ZmZlciAqLworICAgICAgLyogTmVlZCB0byB1cGRhdGUgdGhlIEZCJ3MgR0xfRFJBV19CVUZGRVIgc3RhdGUgdG8gbWF0Y2ggdGhlCisgICAgICAgKiBjb250ZXh0IHN0YXRlIChHTF9SRUFEX0JVRkZFUiB0b28pLgorICAgICAgICovCisgICAgICBpZiAoZmItPkNvbG9yRHJhd0J1ZmZlclswXSAhPSBjdHgtPkNvbG9yLkRyYXdCdWZmZXJbMF0pIHsKKyAgICAgICAgIF9tZXNhX2RyYXdidWZmZXJzKGN0eCwgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29sb3IuRHJhd0J1ZmZlciwgTlVMTCk7CisgICAgICB9CisgICAgICBpZiAoZmItPkNvbG9yUmVhZEJ1ZmZlciAhPSBjdHgtPlBpeGVsLlJlYWRCdWZmZXIpIHsKKyAgICAgICAgIAorICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBUaGlzIGlzIGEgdXNlci1jcmVhdGVkIGZyYW1lYnVmZmVyLgorICAgICAgICogQ29tcGxldGVuZXNzIG9ubHkgbWF0dGVycyBmb3IgdXNlci1jcmVhdGVkIGZyYW1lYnVmZmVycy4KKyAgICAgICAqLwogICAgICAgX21lc2FfdGVzdF9mcmFtZWJ1ZmZlcl9jb21wbGV0ZW5lc3MoY3R4LCBmYik7CiAgICAgICBfbWVzYV91cGRhdGVfZnJhbWVidWZmZXJfdmlzdWFsKGZiKTsKICAgIH0KIAotICAgLyogdXBkYXRlX2NvbG9yX2RyYXcvcmVhZF9idWZmZXJzIG5vdCBuZWVkZWQgZm9yCi0gICAgICByZWFkL2RyYXcgb25seSBmYiwgYnV0IHNob3VsZG4ndCBodXJ0ID8/PyAqLworICAgLyogU3RyaWN0bHkgc3BlYWtpbmcsIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSBkcmF3LXN0YXRlCisgICAgKiBpZiB0aGlzIEZCIGlzIGJvdW5kIGFzIGN0eC0+UmVhZEJ1ZmZlciAoYW5kIGNvbnZlcnNlbHksIHRoZQorICAgICogcmVhZC1zdGF0ZSBpZiB0aGlzIEZCIGlzIGJvdW5kIGFzIGN0eC0+RHJhd0J1ZmZlciksIGJ1dCBubworICAgICogaGFybS4KKyAgICAqLwogICAgdXBkYXRlX2NvbG9yX2RyYXdfYnVmZmVycyhjdHgsIGZiKTsKICAgIHVwZGF0ZV9jb2xvcl9yZWFkX2J1ZmZlcihjdHgsIGZiKTsKICAgIF9tZXNhX3VwZGF0ZV9kZXB0aF9idWZmZXIoY3R4LCBmYiwgQlVGRkVSX0RFUFRIKTsKQEAgLTc0OCwyOCArODEwLDE5IEBACiAgICBjb21wdXRlX2RlcHRoX21heChmYik7CiB9CiAKKwogLyoqCiAgKiBVcGRhdGUgc3RhdGUgcmVsYXRlZCB0byB0aGUgY3VycmVudCBkcmF3L3JlYWQgZnJhbWVidWZmZXJzLgotICogU3BlY2lmaWNhbGx5LCB1cGRhdGUgdGhlc2UgZnJhbWVidWZmZXIgZmllbGRzOgotICogICAgX0NvbG9yRHJhd0J1ZmZlcnMKLSAqICAgIF9OdW1Db2xvckRyYXdCdWZmZXJzCi0gKiAgICBfQ29sb3JSZWFkQnVmZmVyCi0gKiAgICBfRGVwdGhCdWZmZXIKLSAqICAgIF9TdGVuY2lsQnVmZmVyCi0gKiBJZiB0aGUgY3VycmVudCBmcmFtZWJ1ZmZlciBpcyB1c2VyLWNyZWF0ZWQsIG1ha2Ugc3VyZSBpdCdzIGNvbXBsZXRlLgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGVmZmVjdCB0aGlzIHN0YXRlOiAgZ2xSZWFkQnVmZmVyLAotICogZ2xEcmF3QnVmZmVyLCBnbERyYXdCdWZmZXJzQVJCLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhULAotICogZ2xSZW5kZXJidWZmZXJTdG9yYWdlRVhULgogICovCiB2b2lkCiBfbWVzYV91cGRhdGVfZnJhbWVidWZmZXIoR0xjb250ZXh0ICpjdHgpCiB7Ci0gICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOwotICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYnJlYWQgPSBjdHgtPlJlYWRCdWZmZXI7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmRyYXdGYiA9IGN0eC0+RHJhd0J1ZmZlcjsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqcmVhZEZiID0gY3R4LT5SZWFkQnVmZmVyOwogCi0gICB1cGRhdGVfZnJhbWVidWZmZXIoY3R4LCBmYik7Ci0gICBpZiAoZmJyZWFkICE9IGZiKQotICAgICAgdXBkYXRlX2ZyYW1lYnVmZmVyKGN0eCwgZmJyZWFkKTsKKyAgIHVwZGF0ZV9mcmFtZWJ1ZmZlcihjdHgsIGRyYXdGYik7CisgICBpZiAocmVhZEZiICE9IGRyYXdGYikKKyAgICAgIHVwZGF0ZV9mcmFtZWJ1ZmZlcihjdHgsIHJlYWRGYik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9nZXQuYyBiL3NyYy9tZXNhL21haW4vZ2V0LmMKaW5kZXggNDY3NGM0NC4uYWU2YWZlZiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9nZXQuYworKysgYi9zcmMvbWVzYS9tYWluL2dldC5jCkBAIC0xODczLDYgKzE4NzMsMTAgQEAKICAgICAgICAgIENIRUNLX0VYVDEoRVhUX2ZyYW1lYnVmZmVyX29iamVjdCwgIkdldEJvb2xlYW52Iik7CiAgICAgICAgICBwYXJhbXNbMF0gPSBJTlRfVE9fQk9PTEVBTihjdHgtPkNvbnN0Lk1heFJlbmRlcmJ1ZmZlclNpemUpOwogICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19FWFQ6CisgICAgICAgICBDSEVDS19FWFQxKEVYVF9mcmFtZWJ1ZmZlcl9ibGl0LCAiR2V0Qm9vbGVhbnYiKTsKKyAgICAgICAgIHBhcmFtc1swXSA9IElOVF9UT19CT09MRUFOKGN0eC0+UmVhZEJ1ZmZlci0+TmFtZSk7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UU19BUkI6CiAgICAgICAgICBDSEVDS19FWFQxKEFSQl9mcmFnbWVudF9zaGFkZXIsICJHZXRCb29sZWFudiIpOwogICAgICAgICAgcGFyYW1zWzBdID0gSU5UX1RPX0JPT0xFQU4oY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4VW5pZm9ybUNvbXBvbmVudHMpOwpAQCAtMzcxNyw2ICszNzIxLDEwIEBACiAgICAgICAgICBDSEVDS19FWFQxKEVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QsICJHZXRGbG9hdHYiKTsKICAgICAgICAgIHBhcmFtc1swXSA9IChHTGZsb2F0KShjdHgtPkNvbnN0Lk1heFJlbmRlcmJ1ZmZlclNpemUpOwogICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19FWFQ6CisgICAgICAgICBDSEVDS19FWFQxKEVYVF9mcmFtZWJ1ZmZlcl9ibGl0LCAiR2V0RmxvYXR2Iik7CisgICAgICAgICBwYXJhbXNbMF0gPSAoR0xmbG9hdCkoY3R4LT5SZWFkQnVmZmVyLT5OYW1lKTsKKyAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTX0FSQjoKICAgICAgICAgIENIRUNLX0VYVDEoQVJCX2ZyYWdtZW50X3NoYWRlciwgIkdldEZsb2F0diIpOwogICAgICAgICAgcGFyYW1zWzBdID0gKEdMZmxvYXQpKGN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heFVuaWZvcm1Db21wb25lbnRzKTsKQEAgLTU1NjEsNiArNTU2OSwxMCBAQAogICAgICAgICAgQ0hFQ0tfRVhUMShFWFRfZnJhbWVidWZmZXJfb2JqZWN0LCAiR2V0SW50ZWdlcnYiKTsKICAgICAgICAgIHBhcmFtc1swXSA9IGN0eC0+Q29uc3QuTWF4UmVuZGVyYnVmZmVyU2l6ZTsKICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUOgorICAgICAgICAgQ0hFQ0tfRVhUMShFWFRfZnJhbWVidWZmZXJfYmxpdCwgIkdldEludGVnZXJ2Iik7CisgICAgICAgICBwYXJhbXNbMF0gPSBjdHgtPlJlYWRCdWZmZXItPk5hbWU7CisgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UU19BUkI6CiAgICAgICAgICBDSEVDS19FWFQxKEFSQl9mcmFnbWVudF9zaGFkZXIsICJHZXRJbnRlZ2VydiIpOwogICAgICAgICAgcGFyYW1zWzBdID0gY3R4LT5Db25zdC5GcmFnbWVudFByb2dyYW0uTWF4VW5pZm9ybUNvbXBvbmVudHM7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2dldF9nZW4ucHkgYi9zcmMvbWVzYS9tYWluL2dldF9nZW4ucHkKaW5kZXggNjUzZGVlZi4uZGVjYzlkZCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9nZXRfZ2VuLnB5CisrKyBiL3NyYy9tZXNhL21haW4vZ2V0X2dlbi5weQpAQCAtOTgwLDYgKzk4MCwxMSBAQAogCSAgWyJjdHgtPkNvbnN0Lk1heFJlbmRlcmJ1ZmZlclNpemUiXSwgIiIsCiAJICBbIkVYVF9mcmFtZWJ1ZmZlcl9vYmplY3QiXSApLAogCisJIyBHTF9FWFRfZnJhbWVidWZmZXJfYmxpdAorCSMgTk9URTogR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCA9PSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVAorCSggIkdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19FWFQiLCBHTGludCwgWyJjdHgtPlJlYWRCdWZmZXItPk5hbWUiXSwgIiIsCisJICBbIkVYVF9mcmFtZWJ1ZmZlcl9ibGl0Il0gKSwKKwogCSMgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgogCSggIkdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIiwgR0xpbnQsCiAJICBbImN0eC0+Q29uc3QuRnJhZ21lbnRQcm9ncmFtLk1heFVuaWZvcm1Db21wb25lbnRzIl0sICIiLApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi9nZXRzdHJpbmcuYyBiL3NyYy9tZXNhL21haW4vZ2V0c3RyaW5nLmMKaW5kZXggODlkYWEwZS4uNDhjODE1NyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9nZXRzdHJpbmcuYworKysgYi9zcmMvbWVzYS9tYWluL2dldHN0cmluZy5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICA2LjUuMgorICogVmVyc2lvbjogIDcuMQogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vZ2xoZWFkZXIuaCBiL3NyYy9tZXNhL21haW4vZ2xoZWFkZXIuaAppbmRleCBmMGY5N2MyLi4zZDQxMzY1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2dsaGVhZGVyLmgKKysrIGIvc3JjL21lc2EvbWFpbi9nbGhlYWRlci5oCkBAIC00NiwxMSArNDYsNiBAQAogI2lmbmRlZiBHTEhFQURFUl9ICiAjZGVmaW5lIEdMSEVBREVSX0gKIAotLyogVGhpcyBhbGxvd3MgTWVzYSB0byBiZSBpbnRlZ3JhdGVkIGludG8gWEZyZWU4NiAqLwotI2lmZGVmIEhBVkVfRElYX0NPTkZJR19ICi0jaW5jbHVkZSAiZGl4LWNvbmZpZy5oIgotI2VuZGlmCi0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiBkZWZpbmVkKENDUE1MKQpAQCAtOTgsNiArOTMsMzAgQEAKICMgIGluY2x1ZGUgPHN0ZGludC5oPgogI2VuZGlmCiAKKy8qIEZvciBwbGF0Zm9ybXMgdGhhdCBoYXZlIHRoZSBDOTkgc3RhbmRhcmQgdWludCpfdCwKKyAgIGJ1dCBub3QgdGhlIGNvbW1vbmx5IHVzZWQgdV9pbnQqX3QgKi8KKyNpZiBkZWZpbmVkKF9fc3VuKQorIyBkZWZpbmUgdV9pbnQ4X3QgdWludDhfdAorIyBkZWZpbmUgdV9pbnQxNl90IHVpbnQxNl90CisjIGRlZmluZSB1X2ludDMyX3QgdWludDMyX3QKKyMgZGVmaW5lIHVfaW50NjRfdCB1aW50NjRfdAorIyBkZWZpbmUgdV9pbnRwdHJfdCB1aW50cHRyX3QKKyNlbmRpZgorCisvKiBTdW4gY29tcGlsZXJzIGRlZmluZSBfX2kzODYgaW5zdGVhZCBvZiB0aGUgZ2NjLXN0eWxlIF9faTM4Nl9fICovCisjaWZkZWYgX19TVU5QUk9fQworIyBpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChfX2kzODYpCisjICBkZWZpbmUgX19pMzg2X18KKyMgZWxpZiAhZGVmaW5lZChfX2FtZDY0X18pICYmIGRlZmluZWQoX19hbWQ2NCkKKyMgIGRlZmluZSBfX2FtZDY0X18KKyMgZWxpZiAhZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19zcGFyYykKKyMgIGRlZmluZSBfX3NwYXJjX18KKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQoX192b2xhdGlsZSkKKyMgIGRlZmluZSBfX3ZvbGF0aWxlIHZvbGF0aWxlCisjIGVuZGlmCisjZW5kaWYKKwogI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKEJVSUxEX0ZPUl9TTkFQKQogIyAgZGVmaW5lIF9fV0lOMzJfXwogIyAgZGVmaW5lIGZpbml0ZSBfZmluaXRlCkBAIC0yMzYsNiArMjU1LDEyIEBACiAjICBkZWZpbmUgSU5MSU5FIGlubGluZQogI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgKF9fV0FUQ09NQ19fID49IDExMDApCiAjICBkZWZpbmUgSU5MSU5FIF9faW5saW5lCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIGRlZmluZWQoX19DOTlGRUFUVVJFU19fKQorIyAgZGVmaW5lIElOTElORSBpbmxpbmUKKyMgIGRlZmluZSBfX2lubGluZSBpbmxpbmUKKyMgIGRlZmluZSBfX2lubGluZV9fIGlubGluZQorI2VsaWYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkgLyogQzk5ICovCisjICBkZWZpbmUgSU5MSU5FIGlubGluZQogI2Vsc2UKICMgIGRlZmluZSBJTkxJTkUKICNlbmRpZgpAQCAtMjc1LDcgKzMwMCw3IEBACiAjZW5kaWYKIAogCi0jaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAzCisjaWYgKCFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDMpICYmICghZGVmaW5lZChfX0lCTUNfXykgfHwgX19JQk1DX18gPCA5MDApCiAjICBkZWZpbmUgX19idWlsdGluX2V4cGVjdCh4LCB5KSB4CiAjZW5kaWYKIApAQCAtMjgzLDEyICszMDgsMTcgQEAKICAqIElmIHdlJ3JlIG5vdCB1c2luZyBnY2MsIGRlZmluZSBfX0ZVTkNUSU9OX18gYXMgYSBjcHAgc3ltYm9sIGhlcmUuCiAgKiBEb24ndCBkZWZpbmUgaXQgaWYgdXNpbmcgYSBuZXdlciBXaW5kb3dzIGNvbXBpbGVyLgogICovCi0jaWYgZGVmaW5lZChfX1ZNUykKLSMgZGVmaW5lIF9fRlVOQ1RJT05fXyAiVk1TJE5MOiIKLSNlbGlmIF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMCi0jIGlmICgoIWRlZmluZWQgX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpKSAmJiAoIWRlZmluZWQgX194bENfXykgJiYgXAorI2lmbmRlZiBfX0ZVTkNUSU9OX18KKyMgaWYgZGVmaW5lZChfX1ZNUykKKyMgIGRlZmluZSBfX0ZVTkNUSU9OX18gIlZNUyROTDoiCisjIGVsaWYgKCghZGVmaW5lZCBfX0dOVUNfXykgfHwgKF9fR05VQ19fIDwgMikpICYmICghZGVmaW5lZCBfX3hsQ19fKSAmJiBcCiAgICAgICAoIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSIDwgMTMwMCkKLSMgIGRlZmluZSBfX0ZVTkNUSU9OX18gIjx1bmtub3duPiIKKyMgIGlmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qIEM5OSAqLyB8fCBcCisgICAgKGRlZmluZWQoX19TVU5QUk9fQykgJiYgZGVmaW5lZChfX0M5OUZFQVRVUkVTX18pKQorIyAgIGRlZmluZSBfX0ZVTkNUSU9OX18gX19mdW5jX18KKyMgIGVsc2UKKyMgICBkZWZpbmUgX19GVU5DVElPTl9fICI8dW5rbm93bj4iCisjICBlbmRpZgogIyBlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vaW1hZ2UuYyBiL3NyYy9tZXNhL21haW4vaW1hZ2UuYwppbmRleCA1MmM0OTk5Li5iZDM4ZTBjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2ltYWdlLmMKKysrIGIvc3JjL21lc2EvbWFpbi9pbWFnZS5jCkBAIC04NDksNyArODQ5LDcgQEAKICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQogCi0gICAgICBpZiAocGFja2luZy0+U2tpcFBpeGVscyA9PSAwKSB7CisgICAgICBpZiAoKHBhY2tpbmctPlNraXBQaXhlbHMgJiA3KSA9PSAwKSB7CiAgICAgICAgICBfbWVzYV9tZW1jcHkoIGRzdCwgc3JjLCB3aWR0aF9pbl9ieXRlcyApOwogICAgICAgICAgaWYgKHBhY2tpbmctPkxzYkZpcnN0KSB7CiAgICAgICAgICAgICBmbGlwX2J5dGVzKCBkc3QsIHdpZHRoX2luX2J5dGVzICk7CkBAIC05NDEsNyArOTQxLDcgQEAKICAgICAgIGlmICghZHN0KQogICAgICAgICAgcmV0dXJuOwogCi0gICAgICBpZiAocGFja2luZy0+U2tpcFBpeGVscyA9PSAwKSB7CisgICAgICBpZiAoKHBhY2tpbmctPlNraXBQaXhlbHMgJiA3KSA9PSAwKSB7CiAgICAgICAgICBfbWVzYV9tZW1jcHkoIGRzdCwgc3JjLCB3aWR0aF9pbl9ieXRlcyApOwogICAgICAgICAgaWYgKHBhY2tpbmctPkxzYkZpcnN0KSB7CiAgICAgICAgICAgICBmbGlwX2J5dGVzKCBkc3QsIHdpZHRoX2luX2J5dGVzICk7CkBAIC05NjAsMjAgKzk2MCwyMCBAQAogICAgICAgICAgICAgICAgaWYgKCpzICYgc3JjTWFzaykgewogICAgICAgICAgICAgICAgICAgKmQgfD0gZHN0TWFzazsKICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChzcmNNYXNrID09IDEyOCkgewotICAgICAgICAgICAgICAgICAgc3JjTWFzayA9IDE7CisgICAgICAgICAgICAgICBpZiAoc3JjTWFzayA9PSAxKSB7CisgICAgICAgICAgICAgICAgICBzcmNNYXNrID0gMTI4OwogICAgICAgICAgICAgICAgICAgcysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBzcmNNYXNrID0gc3JjTWFzayA8PCAxOworICAgICAgICAgICAgICAgICAgc3JjTWFzayA9IHNyY01hc2sgPj4gMTsKICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChkc3RNYXNrID09IDEpIHsKLSAgICAgICAgICAgICAgICAgIGRzdE1hc2sgPSAxMjg7CisgICAgICAgICAgICAgICBpZiAoZHN0TWFzayA9PSAxMjgpIHsKKyAgICAgICAgICAgICAgICAgIGRzdE1hc2sgPSAxOwogICAgICAgICAgICAgICAgICAgZCsrOwogICAgICAgICAgICAgICAgICAgKmQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBkc3RNYXNrID0gZHN0TWFzayA+PiAxOworICAgICAgICAgICAgICAgICAgZHN0TWFzayA9IGRzdE1hc2sgPDwgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgIH0KQEAgLTQyMTQsNyArNDIxNCw3IEBACiAKICAgIHN3aXRjaCAoZHN0VHlwZSkgewogICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAgaWYgKHNpemVvZihHTHN0ZW5jaWwpID09IDgpIHsKKyAgICAgIGlmIChzaXplb2YoR0xzdGVuY2lsKSA9PSAxKSB7CiAgICAgICAgICBfbWVzYV9tZW1jcHkoIGRlc3QsIHNvdXJjZSwgbiApOwogICAgICAgfQogICAgICAgZWxzZSB7CkBAIC00MjI2LDE0ICs0MjI2LDExIEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgIGNhc2UgR0xfQllURToKLSAgICAgIGlmIChzaXplb2YoR0xzdGVuY2lsKSA9PSA4KSB7Ci0gICAgICAgICBfbWVzYV9tZW1jcHkoIGRlc3QsIHNvdXJjZSwgbiApOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB7CiAgICAgICAgICBHTGJ5dGUgKmRzdCA9IChHTGJ5dGUgKikgZGVzdDsKICAgICAgICAgIEdMdWludCBpOwogICAgICAgICAgZm9yIChpPTA7aTxuO2krKykgewotICAgICAgICAgICAgZHN0W2ldID0gKEdMYnl0ZSkgc291cmNlW2ldOworICAgICAgICAgICAgZHN0W2ldID0gKEdMYnl0ZSkgKHNvdXJjZVtpXSAmIDB4N2YpOwogICAgICAgICAgfQogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC00Mjc4LDcgKzQyNzUsNyBAQAogICAgICAgICAgR0xpbnQgKmRzdCA9IChHTGludCAqKSBkZXN0OwogICAgICAgICAgR0x1aW50IGk7CiAgICAgICAgICBmb3IgKGk9MDtpPG47aSsrKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSAoR0xpbnQpIHNvdXJjZVtpXTsKKyAgICAgICAgICAgIGRzdFtpXSA9IChHTGludCkgc291cmNlW2ldOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRzdFBhY2tpbmctPlN3YXBCeXRlcykgewogICAgICAgICAgICAgX21lc2Ffc3dhcDQoIChHTHVpbnQgKikgZHN0LCBuICk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2ltcG9ydHMuYyBiL3NyYy9tZXNhL21haW4vaW1wb3J0cy5jCmluZGV4IDcyMzFmYTYuLjEzMDdiYWUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vaW1wb3J0cy5jCisrKyBiL3NyYy9tZXNhL21haW4vaW1wb3J0cy5jCkBAIC0xMDQsNiArMTA0LDggQEAKIAogICAgKHZvaWQpIHBvc2l4X21lbWFsaWduKCYgbWVtLCBhbGlnbm1lbnQsIGJ5dGVzKTsKICAgIHJldHVybiBtZW07CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgIHJldHVybiBfYWxpZ25lZF9tYWxsb2MoYnl0ZXMsIGFsaWdubWVudCk7CiAjZWxzZQogICAgdWludHB0cl90IHB0ciwgYnVmOwogCkBAIC0xNDQsNiArMTQ2LDE1IEBACiAgICB9CiAKICAgIHJldHVybiBtZW07CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgIHZvaWQgKm1lbTsKKworICAgbWVtID0gX2FsaWduZWRfbWFsbG9jKGJ5dGVzLCBhbGlnbm1lbnQpOworICAgaWYgKG1lbSAhPSBOVUxMKSB7CisgICAgICAodm9pZCkgbWVtc2V0KG1lbSwgMCwgYnl0ZXMpOworICAgfQorCisgICByZXR1cm4gbWVtOwogI2Vsc2UKICAgIHVpbnRwdHJfdCBwdHIsIGJ1ZjsKIApAQCAtMTgwLDYgKzE5MSw4IEBACiB7CiAjaWYgZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKQogICAgZnJlZShwdHIpOworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX01TQ19WRVIpCisgICBfYWxpZ25lZF9mcmVlKHB0cik7CiAjZWxzZQogICAgdm9pZCAqKmN1YmJ5SG9sZSA9ICh2b2lkICoqKSAoKGNoYXIgKikgcHRyIC0gc2l6ZW9mKHZvaWQgKikpOwogICAgdm9pZCAqcmVhbEFkZHIgPSAqY3ViYnlIb2xlOwpAQCAtMTk0LDYgKzIwNywxMCBAQAogX21lc2FfYWxpZ25fcmVhbGxvYyh2b2lkICpvbGRCdWZmZXIsIHNpemVfdCBvbGRTaXplLCBzaXplX3QgbmV3U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQpCiB7CisjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX01TQ19WRVIpCisgICAodm9pZCkgb2xkU2l6ZTsKKyAgIHJldHVybiBfYWxpZ25lZF9yZWFsbG9jKG9sZEJ1ZmZlciwgbmV3U2l6ZSwgYWxpZ25tZW50KTsKKyNlbHNlCiAgICBjb25zdCBzaXplX3QgY29weVNpemUgPSAob2xkU2l6ZSA8IG5ld1NpemUpID8gb2xkU2l6ZSA6IG5ld1NpemU7CiAgICB2b2lkICpuZXdCdWYgPSBfbWVzYV9hbGlnbl9tYWxsb2MobmV3U2l6ZSwgYWxpZ25tZW50KTsKICAgIGlmIChuZXdCdWYgJiYgb2xkQnVmZmVyICYmIGNvcHlTaXplID4gMCkgewpAQCAtMjAyLDYgKzIxOSw3IEBACiAgICBpZiAob2xkQnVmZmVyKQogICAgICAgX21lc2FfYWxpZ25fZnJlZShvbGRCdWZmZXIpOwogICAgcmV0dXJuIG5ld0J1ZjsKKyNlbmRpZgogfQogCiAKQEAgLTU0MiwyNCArNTYwLDI3IEBACiBfbWVzYV9mZnMoaW50MzJfdCBpKQogewogI2lmIChkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pICkgfHwgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQotICAgcmVnaXN0ZXIgaW50MzJfdCBiaXQgPSAxOwotICAgaWYgKChpICYgMHhmZmZmKSA9PSAwKSB7Ci0gICAgICBiaXQgKz0gMTY7Ci0gICAgICBpID4+PSAxNjsKKyAgIHJlZ2lzdGVyIGludCBiaXQgPSAwOworICAgaWYgKGkgIT0gMCkgeworICAgICAgaWYgKChpICYgMHhmZmZmKSA9PSAwKSB7CisgICAgICAgICBiaXQgKz0gMTY7CisgICAgICAgICBpID4+PSAxNjsKKyAgICAgIH0KKyAgICAgIGlmICgoaSAmIDB4ZmYpID09IDApIHsKKyAgICAgICAgIGJpdCArPSA4OworICAgICAgICAgaSA+Pj0gODsKKyAgICAgIH0KKyAgICAgIGlmICgoaSAmIDB4ZikgPT0gMCkgeworICAgICAgICAgYml0ICs9IDQ7CisgICAgICAgICBpID4+PSA0OworICAgICAgfQorICAgICAgd2hpbGUgKChpICYgMSkgPT0gMCkgeworICAgICAgICAgYml0Kys7CisgICAgICAgICBpID4+PSAxOworICAgICAgfQorICAgICAgYml0Kys7CiAgICB9Ci0gICBpZiAoKGkgJiAweGZmKSA9PSAwKSB7Ci0gICAgICBiaXQgKz0gODsKLSAgICAgIGkgPj49IDg7Ci0gICB9Ci0gICBpZiAoKGkgJiAweGYpID09IDApIHsKLSAgICAgIGJpdCArPSA0OwotICAgICAgaSA+Pj0gNDsKLSAgIH0KLSAgIGlmICgoaSAmIDB4MykgPT0gMCkgewotICAgICAgYml0ICs9IDI7Ci0gICAgICBpID4+PSAyOwotICAgfQotICAgcmV0dXJuIChpKSA/IChiaXQgKyAoKGkgKyAxKSAmIDB4MDEpKSA6IDA7CisgICByZXR1cm4gYml0OwogI2Vsc2UKICAgIHJldHVybiBmZnMoaSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vaW1wb3J0cy5oIGIvc3JjL21lc2EvbWFpbi9pbXBvcnRzLmgKaW5kZXggZDkxYTEzNi4uMGU2ZTMwMSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9pbXBvcnRzLmgKKysrIGIvc3JjL21lc2EvbWFpbi9pbXBvcnRzLmgKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4yCisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTU5LDEyICsxNTksMTMgQEAKICAqKiovCiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfXzM4Nl9fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgXAogICAgIGRlZmluZWQoX19zMzkweF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBcCi0gICAgZGVmaW5lZChfX2FtZDY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0X18pIHx8IFwKICAgICBkZWZpbmVkKGlhNjQpIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IFwKICAgICBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKGhwdXgpIHx8IFwKICAgICBkZWZpbmVkKF9fbWlwcykgfHwgZGVmaW5lZChfTUlQU19BUkNIKSB8fCBcCiAgICAgZGVmaW5lZChfX2FybV9fKSB8fCBcCiAgICAgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX19tMzJyX18pIHx8IFwKKyAgICAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfSUVFRV83NTQpKSB8fCBcCiAgICAgKGRlZmluZWQoX19hbHBoYV9fKSAmJiAoZGVmaW5lZChfX0lFRUVfRkxPQVQpIHx8ICFkZWZpbmVkKFZNUykpKQogI2RlZmluZSBVU0VfSUVFRQogI2RlZmluZSBJRUVFX09ORSAweDNmODAwMDAwCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL2xpZ2h0LmMgYi9zcmMvbWVzYS9tYWluL2xpZ2h0LmMKaW5kZXggZjM3ZDFmMi4uMzBlMTkwOCAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9saWdodC5jCisrKyBiL3NyYy9tZXNhL21haW4vbGlnaHQuYwpAQCAtNTMsNiArNTMsMTEgQEAKIAogICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0xJR0hUKTsKICAgIGN0eC0+TGlnaHQuU2hhZGVNb2RlbCA9IG1vZGU7CisgICBpZiAobW9kZSA9PSBHTF9GTEFUKQorICAgICAgY3R4LT5fVHJpYW5nbGVDYXBzIHw9IEREX0ZMQVRTSEFERTsKKyAgIGVsc2UKKyAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyAmPSB+RERfRkxBVFNIQURFOworCiAgICBpZiAoY3R4LT5Ecml2ZXIuU2hhZGVNb2RlbCkKICAgICAgIGN0eC0+RHJpdmVyLlNoYWRlTW9kZWwoIGN0eCwgbW9kZSApOwogfQpAQCAtNDQxLDYgKzQ0NiwxMCBAQAogCSAgICByZXR1cm47CiAJIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgX05FV19MSUdIVCk7CiAJIGN0eC0+TGlnaHQuTW9kZWwuVHdvU2lkZSA9IG5ld2Jvb2w7CisgICAgICAgICBpZiAoY3R4LT5MaWdodC5FbmFibGVkICYmIGN0eC0+TGlnaHQuTW9kZWwuVHdvU2lkZSkKKyAgICAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyB8PSBERF9UUklfTElHSFRfVFdPU0lERTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyAmPSB+RERfVFJJX0xJR0hUX1RXT1NJREU7CiAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTDoKICAgICAgICAgIGlmIChwYXJhbXNbMF0gPT0gKEdMZmxvYXQpIEdMX1NJTkdMRV9DT0xPUikKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vbGluZXMuYyBiL3NyYy9tZXNhL21haW4vbGluZXMuYwppbmRleCAwYzJkYmY5Li44MWQwZDMzIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL2xpbmVzLmMKKysrIGIvc3JjL21lc2EvbWFpbi9saW5lcy5jCkBAIC01Niw2ICs1NiwxMSBAQAogICAgRkxVU0hfVkVSVElDRVMoY3R4LCBfTkVXX0xJTkUpOwogICAgY3R4LT5MaW5lLldpZHRoID0gd2lkdGg7CiAKKyAgIGlmICh3aWR0aCAhPSAxLjBGKQorICAgICAgY3R4LT5fVHJpYW5nbGVDYXBzIHw9IEREX0xJTkVfV0lEVEg7CisgICBlbHNlCisgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgJj0gfkREX0xJTkVfV0lEVEg7CisKICAgIGlmIChjdHgtPkRyaXZlci5MaW5lV2lkdGgpCiAgICAgICBjdHgtPkRyaXZlci5MaW5lV2lkdGgoY3R4LCB3aWR0aCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL21pcG1hcC5jIGIvc3JjL21lc2EvbWFpbi9taXBtYXAuYwppbmRleCAwNjEzNzhmLi4xMDMyZTliIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL21pcG1hcC5jCisrKyBiL3NyYy9tZXNhL21haW4vbWlwbWFwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4yCisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtNDczLDcgKzQ3Myw3IEBACiAgICAvKiBDb21wdXRlIHNyYyBhbmQgZHN0IHBvaW50ZXJzLCBza2lwcGluZyBhbnkgYm9yZGVyICovCiAgICBzcmNBID0gc3JjUHRyICsgYm9yZGVyICogKChzcmNXaWR0aCArIDEpICogYnB0KTsKICAgIGlmIChzcmNIZWlnaHQgPiAxKSAKLSAgICAgIHNyY0IgPSBzcmNBICsgc3JjUm93U3RyaWRlOworICAgICAgc3JjQiA9IHNyY0EgKyBzcmNSb3dCeXRlczsKICAgIGVsc2UKICAgICAgIHNyY0IgPSBzcmNBOwogICAgZHN0ID0gZHN0UHRyICsgYm9yZGVyICogKChkc3RXaWR0aCArIDEpICogYnB0KTsKQEAgLTQ4MSw5ICs0ODEsOSBAQAogICAgZm9yIChyb3cgPSAwOyByb3cgPCBkc3RIZWlnaHROQjsgcm93KyspIHsKICAgICAgIGRvX3JvdyhkYXRhdHlwZSwgY29tcHMsIHNyY1dpZHRoTkIsIHNyY0EsIHNyY0IsCiAgICAgICAgICAgICAgZHN0V2lkdGhOQiwgZHN0KTsKLSAgICAgIHNyY0EgKz0gMiAqIHNyY1Jvd1N0cmlkZTsKLSAgICAgIHNyY0IgKz0gMiAqIHNyY1Jvd1N0cmlkZTsKLSAgICAgIGRzdCArPSBkc3RSb3dTdHJpZGU7CisgICAgICBzcmNBICs9IDIgKiBzcmNSb3dCeXRlczsKKyAgICAgIHNyY0IgKz0gMiAqIHNyY1Jvd0J5dGVzOworICAgICAgZHN0ICs9IGRzdFJvd0J5dGVzOwogICAgfQogCiAgICAvKiBUaGlzIGlzIHVnbHkgYnV0IHByb2JhYmx5IHdvbid0IGJlIHVzZWQgbXVjaCAqLwpAQCAtNzMxLDggKzczMSw4IEBACiAgICBjb25zdCBHTGludCBzcmNXaWR0aE5CID0gc3JjV2lkdGggLSAyICogYm9yZGVyOyAgLyogc2l6ZXMgdy9vdXQgYm9yZGVyICovCiAgICBjb25zdCBHTGludCBkc3RXaWR0aE5CID0gZHN0V2lkdGggLSAyICogYm9yZGVyOwogICAgY29uc3QgR0xpbnQgZHN0SGVpZ2h0TkIgPSBkc3RIZWlnaHQgLSAyICogYm9yZGVyOwotICAgY29uc3QgR0xpbnQgc3JjUm93U3RyaWRlID0gYnB0ICogc3JjV2lkdGg7Ci0gICBjb25zdCBHTGludCBkc3RSb3dTdHJpZGUgPSBicHQgKiBkc3RXaWR0aDsKKyAgIGNvbnN0IEdMaW50IHNyY1Jvd0J5dGVzID0gYnB0ICogc3JjUm93U3RyaWRlOworICAgY29uc3QgR0xpbnQgZHN0Um93Qnl0ZXMgPSBicHQgKiBkc3RSb3dTdHJpZGU7CiAgICBjb25zdCBHTHVieXRlICpzcmM7CiAgICBHTHVieXRlICpkc3Q7CiAgICBHTGludCByb3c7CkBAIC03NDQsOCArNzQ0LDggQEAKICAgIGZvciAocm93ID0gMDsgcm93IDwgZHN0SGVpZ2h0TkI7IHJvdysrKSB7CiAgICAgICBkb19yb3coZGF0YXR5cGUsIGNvbXBzLCBzcmNXaWR0aE5CLCBzcmMsIHNyYywKICAgICAgICAgICAgICBkc3RXaWR0aE5CLCBkc3QpOwotICAgICAgc3JjICs9IHNyY1Jvd1N0cmlkZTsKLSAgICAgIGRzdCArPSBkc3RSb3dTdHJpZGU7CisgICAgICBzcmMgKz0gc3JjUm93Qnl0ZXM7CisgICAgICBkc3QgKz0gZHN0Um93Qnl0ZXM7CiAgICB9CiAKICAgIGlmIChib3JkZXIpIHsKQEAgLTc5Miw3ICs3OTIsNyBAQAogICAgLyogQ29tcHV0ZSBzcmMgYW5kIGRzdCBwb2ludGVycywgc2tpcHBpbmcgYW55IGJvcmRlciAqLwogICAgc3JjQSA9IHNyY1B0ciArIGJvcmRlciAqICgoc3JjV2lkdGggKyAxKSAqIGJwdCk7CiAgICBpZiAoc3JjSGVpZ2h0ID4gMSkgCi0gICAgICBzcmNCID0gc3JjQSArIHNyY1Jvd1N0cmlkZTsKKyAgICAgIHNyY0IgPSBzcmNBICsgc3JjUm93Qnl0ZXM7CiAgICBlbHNlCiAgICAgICBzcmNCID0gc3JjQTsKICAgIGRzdCA9IGRzdFB0ciArIGJvcmRlciAqICgoZHN0V2lkdGggKyAxKSAqIGJwdCk7CkBAIC04MDEsOSArODAxLDkgQEAKICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgZHN0SGVpZ2h0TkI7IHJvdysrKSB7CiAgICAgICAgICBkb19yb3coZGF0YXR5cGUsIGNvbXBzLCBzcmNXaWR0aE5CLCBzcmNBLCBzcmNCLAogICAgICAgICAgICAgICAgIGRzdFdpZHRoTkIsIGRzdCk7Ci0gICAgICAgICBzcmNBICs9IDIgKiBzcmNSb3dTdHJpZGU7Ci0gICAgICAgICBzcmNCICs9IDIgKiBzcmNSb3dTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0Um93U3RyaWRlOworICAgICAgICAgc3JjQSArPSAyICogc3JjUm93Qnl0ZXM7CisgICAgICAgICBzcmNCICs9IDIgKiBzcmNSb3dCeXRlczsKKyAgICAgICAgIGRzdCArPSBkc3RSb3dCeXRlczsKICAgICAgIH0KIAogICAgICAgLyogVGhpcyBpcyB1Z2x5IGJ1dCBwcm9iYWJseSB3b24ndCBiZSB1c2VkIG11Y2ggKi8KQEAgLTk5MSw3ICs5OTEsOCBAQAogICAgICAgR0xpbnQgIGNvbXBvbmVudHMsIHNpemU7CiAgICAgICBHTGNoYW4gKmRzdDsKIAotICAgICAgYXNzZXJ0KHRleE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpOworICAgICAgYXNzZXJ0KHRleE9iai0+VGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQgfHwKKyAgICAgICAgICAgICB0ZXhPYmotPlRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQik7CiAKICAgICAgIGlmIChzcmNJbWFnZS0+X0Jhc2VGb3JtYXQgPT0gR0xfUkdCKSB7CiAgICAgICAgICBjb252ZXJ0Rm9ybWF0ID0gJl9tZXNhX3RleGZvcm1hdF9yZ2I7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL210eXBlcy5oIGIvc3JjL21lc2EvbWFpbi9tdHlwZXMuaAppbmRleCA3MWE0Y2E1Li4zMDAwMTBjIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL210eXBlcy5oCisrKyBiL3NyYy9tZXNhL21haW4vbXR5cGVzLmgKQEAgLTEzNjksNyArMTM2OSw3IEBACiAgICBHTGJvb2xlYW4gSXNDb21wcmVzc2VkOwkvKio8IEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uICovCiAgICBHTHVpbnQgQ29tcHJlc3NlZFNpemU7CS8qKjwgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24gKi8KIAotICAgR0x1aW50IFJvd1N0cmlkZTsJCS8qKjwgPT0gV2lkdGggdW5sZXNzIElzQ2xpZW50RGF0YSBhbmQgcGFkZGVkICovCisgICBHTHVpbnQgUm93U3RyaWRlOwkJLyoqPCBQYWRkZWQgd2lkdGggaW4gdW5pdHMgb2YgdGV4ZWxzICovCiAgICBHTHVpbnQgKkltYWdlT2Zmc2V0czsgICAgICAgIC8qKjwgaWYgM0QgdGV4dHVyZTogYXJyYXkgW0RlcHRoXSBvZiBvZmZzZXRzIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCAyRCBzbGljZSBpbiAnRGF0YScsIGluIHRleGVscyAqLwogICAgR0x2b2lkICpEYXRhOwkJLyoqPCBJbWFnZSBkYXRhLCBhY2Nlc3NlZCB2aWEgRmV0Y2hUZXhlbCgpICovCkBAIC0xNTQwLDE3ICsxNTQwLDYgQEAKIAogICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpfQ3VycmVudDsgLyoqPCBQb2ludHMgdG8gcmVhbGx5IGVuYWJsZWQgdGV4IG9iaiAqLwogCi0gICAvKiogVGhlc2UgYXJlIHVzZWQgZm9yIGdsUHVzaC9Qb3BBdHRyaWIgKi8KLSAgIC8qQHsqLwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0IFNhdmVkMUQ7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgU2F2ZWQyRDsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCBTYXZlZDNEOwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0IFNhdmVkQ3ViZU1hcDsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCBTYXZlZFJlY3Q7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgU2F2ZWQxREFycmF5OwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0IFNhdmVkMkRBcnJheTsKLSAgIC8qQH0qLwotCiAgICAvKiogR0xfU0dJX3RleHR1cmVfY29sb3JfdGFibGUgKi8KICAgIC8qQHsqLwogICAgc3RydWN0IGdsX2NvbG9yX3RhYmxlIENvbG9yVGFibGU7CkBAIC0xNTYwLDYgKzE1NDksNyBAQAogfTsKIAogCisKIC8qKgogICogVGV4dHVyZSBhdHRyaWJ1dGUgZ3JvdXAgKEdMX1RFWFRVUkVfQklUKS4KICAqLwpAQCAtMTU3OSwxNyArMTU2OSw3IEBACiAKICAgIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgVW5pdFtNQVhfVEVYVFVSRV9VTklUU107CiAKLSNpZiAwCi0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5MUQ7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5MkQ7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5M0Q7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5Q3ViZU1hcDsKLSAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqUHJveHlSZWN0OwotICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpQcm94eTFEQXJyYXk7Ci0gICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5MkRBcnJheTsKLSNlbHNlCiAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKlByb3h5VGV4W05VTV9URVhUVVJFX1RBUkdFVFNdOwotI2VuZGlmCiAKICAgIC8qKiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZSAqLwogICAgR0xib29sZWFuIFNoYXJlZFBhbGV0dGU7CkBAIC0yNDIxLDEzICsyNDAxLDExIEBACiAgICBHTGVudW0gQ29sb3JEcmF3QnVmZmVyW01BWF9EUkFXX0JVRkZFUlNdOwogICAgR0xlbnVtIENvbG9yUmVhZEJ1ZmZlcjsKIAotICAgLyogVGhlc2UgYXJlIGNvbXB1dGVkIGZyb20gQ29sb3JEcmF3QnVmZmVyIGFuZCBDb2xvclJlYWRCdWZmZXIgKi8KLSAgIEdMYml0ZmllbGQgX0NvbG9yRHJhd0J1ZmZlck1hc2tbTUFYX0RSQVdfQlVGRkVSU107IC8qIE1hc2sgb2YgQlVGRkVSX0JJVF8qIGZsYWdzICovCisgICAvKiogQ29tcHV0ZWQgZnJvbSBDb2xvckRyYXcvUmVhZEJ1ZmZlciBhYm92ZSAqLworICAgR0x1aW50IF9OdW1Db2xvckRyYXdCdWZmZXJzOworICAgR0xpbnQgX0NvbG9yRHJhd0J1ZmZlckluZGV4ZXNbTUFYX0RSQVdfQlVGRkVSU107IC8qKjwgQlVGRkVSX3ggb3IgLTEgKi8KICAgIEdMaW50IF9Db2xvclJlYWRCdWZmZXJJbmRleDsgLyogLTEgPSBOb25lICovCi0KLSAgIC8qIFRoZXNlIGFyZSBjb21wdXRlZCBmcm9tIF9Db2xvckRyYXdCdWZmZXJNYXNrIGFuZCBfQ29sb3JSZWFkQnVmZmVySW5kZXggKi8KLSAgIEdMdWludCBfTnVtQ29sb3JEcmF3QnVmZmVyc1tNQVhfRFJBV19CVUZGRVJTXTsKLSAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKl9Db2xvckRyYXdCdWZmZXJzW01BWF9EUkFXX0JVRkZFUlNdWzRdOworICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqX0NvbG9yRHJhd0J1ZmZlcnNbTUFYX0RSQVdfQlVGRkVSU107CiAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpfQ29sb3JSZWFkQnVmZmVyOwogCiAgICAvKiogVGhlIEFjdHVhbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgdG8gdXNlLiAgTWF5IGJlIHdyYXBwZXJzIGFyb3VuZCB0aGUKQEAgLTI4OTQsNyArMjg3Miw2IEBACiAgKi8KIHN0cnVjdCBnbF9kbGlzdF9zdGF0ZQogewotICAgc3RydWN0IG1lc2FfZGlzcGxheV9saXN0ICpDYWxsU3RhY2tbTUFYX0xJU1RfTkVTVElOR107CiAgICBHTHVpbnQgQ2FsbERlcHRoOwkJLyoqPCBDdXJyZW50IHJlY3Vyc2lvbiBjYWxsaW5nIGRlcHRoICovCiAKICAgIHN0cnVjdCBtZXNhX2Rpc3BsYXlfbGlzdCAqQ3VycmVudExpc3Q7CkBAIC0zMDY5LDcgKzMwNDYsMTAgQEAKIAogICAgLyoqIFxuYW1lIERlcml2ZWQgc3RhdGUgKi8KICAgIC8qQHsqLwotICAgR0xiaXRmaWVsZCBfVHJpYW5nbGVDYXBzOyAgICAgIC8qKjwgYml0d2lzZS1vciBvZiBERF8qIGZsYWdzICovCisgICAvKiogQml0d2lzZS1vciBvZiBERF8qIGZsYWdzLiAgTm90ZSB0aGF0IHRoaXMgYml0ZmllbGQgbWF5IGJlIHVzZWQgYmVmb3JlCisgICAgKiBzdGF0ZSB2YWxpZGF0aW9uIHNvIHRoZXkgbmVlZCB0byBhbHdheXMgYmUgY3VycmVudC4KKyAgICAqLworICAgR0xiaXRmaWVsZCBfVHJpYW5nbGVDYXBzOwogICAgR0xiaXRmaWVsZCBfSW1hZ2VUcmFuc2ZlclN0YXRlOy8qKjwgYml0d2lzZS1vciBvZiBJTUFHRV8qX0JJVCBmbGFncyAqLwogICAgR0xmbG9hdCBfRXllWkRpclszXTsKICAgIEdMZmxvYXQgX01vZGVsVmlld0ludlNjYWxlOwpAQCAtMzA4NSwxMiArMzA2NSw2IEBACiAKICAgIHN0cnVjdCBnbF9saXN0X2V4dGVuc2lvbnMgTGlzdEV4dDsgLyoqPCBkcml2ZXIgZGxpc3QgZXh0ZW5zaW9ucyAqLwogCi0KLSAgIEdMdWludCBfRmFjaW5nOyAvKio8IFRoaXMgaXMgYSBoYWNrIGZvciAyLXNpZGVkIHN0ZW5jaWwgdGVzdC4KLQkJICAgICoKLQkJICAgICogV2UgZG9uJ3QgaGF2ZSBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgdGhpcyB2YWx1ZSBmcm9tCi0JCSAgICAqIHN3cmFzdF9zZXR1cCB0byBzd3Jhc3QuICovCi0KICAgIC8qKiBcbmFtZSBGb3IgZGVidWdnaW5nL2RldmVsb3BtZW50IG9ubHkgKi8KICAgIC8qQHsqLwogICAgR0xib29sZWFuIEZpcnN0VGltZUN1cnJlbnQ7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL3BvaW50cy5jIGIvc3JjL21lc2EvbWFpbi9wb2ludHMuYwppbmRleCBmYmVkYmNiLi43ZTE4OWEwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3BvaW50cy5jCisrKyBiL3NyYy9tZXNhL21haW4vcG9pbnRzLmMKQEAgLTUsNyArNSw3IEBACiAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNy4wCisgKiBWZXJzaW9uOiAgNy4xCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTc3LDggKzc3LDEzIEBACiB2b2lkIEdMQVBJRU5UUlkKIF9tZXNhX1BvaW50UGFyYW1ldGVyaXYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApCiB7Ci0gICBjb25zdCBHTGZsb2F0IHZhbHVlID0gKEdMZmxvYXQpIHBhcmFtc1swXTsKLSAgIF9tZXNhX1BvaW50UGFyYW1ldGVyZnYocG5hbWUsICZ2YWx1ZSk7CisgICBHTGZsb2F0IHBbM107CisgICBwWzBdID0gKEdMZmxvYXQpIHBhcmFtc1swXTsKKyAgIGlmIChwbmFtZSA9PSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9FWFQpIHsKKyAgICAgIHBbMV0gPSAoR0xmbG9hdCkgcGFyYW1zWzFdOworICAgICAgcFsyXSA9IChHTGZsb2F0KSBwYXJhbXNbMl07CisgICB9CisgICBfbWVzYV9Qb2ludFBhcmFtZXRlcmZ2KHBuYW1lLCBwKTsKIH0KIAogCkBAIC0xMDUsNiArMTEwLDExIEBACiAgICAgICAgICAgICBjdHgtPlBvaW50Ll9BdHRlbnVhdGVkID0gKGN0eC0+UG9pbnQuUGFyYW1zWzBdICE9IDEuMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlBvaW50LlBhcmFtc1sxXSAhPSAwLjAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Qb2ludC5QYXJhbXNbMl0gIT0gMC4wKTsKKworICAgICAgICAgICAgaWYgKGN0eC0+UG9pbnQuX0F0dGVudWF0ZWQpCisgICAgICAgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgfD0gRERfUE9JTlRfQVRURU47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgJj0gfkREX1BPSU5UX0FUVEVOOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRU5VTSwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vcG9seWdvbi5jIGIvc3JjL21lc2EvbWFpbi9wb2x5Z29uLmMKaW5kZXggZmQwMmU1YS4uNTY0MjUwYiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi9wb2x5Z29uLmMKKysrIGIvc3JjL21lc2EvbWFpbi9wb2x5Z29uLmMKQEAgLTE2Nyw2ICsxNjcsMTEgQEAKICAgICAgIHJldHVybjsKICAgIH0KIAorICAgaWYgKGN0eC0+UG9seWdvbi5Gcm9udE1vZGUgPT0gR0xfRklMTCAmJiBjdHgtPlBvbHlnb24uQmFja01vZGUgPT0gR0xfRklMTCkKKyAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyAmPSB+RERfVFJJX1VORklMTEVEOworICAgZWxzZQorICAgICAgY3R4LT5fVHJpYW5nbGVDYXBzIHw9IEREX1RSSV9VTkZJTExFRDsKKwogICAgaWYgKGN0eC0+RHJpdmVyLlBvbHlnb25Nb2RlKQogICAgICAgY3R4LT5Ecml2ZXIuUG9seWdvbk1vZGUoY3R4LCBmYWNlLCBtb2RlKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vc3RhdGUuYyBiL3NyYy9tZXNhL21haW4vc3RhdGUuYwppbmRleCAzNDRhZjkxLi41ODI3ZjIyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3N0YXRlLmMKKysrIGIvc3JjL21lc2EvbWFpbi9zdGF0ZS5jCkBAIC01MSw2ICs1MSwxOCBAQAogI2luY2x1ZGUgInRleHN0YXRlLmgiCiAKIAorCisKK3N0YXRpYyB2b2lkCit1cGRhdGVfc2VwYXJhdGVfc3BlY3VsYXIoR0xjb250ZXh0ICpjdHgpCit7CisgICBpZiAoTkVFRF9TRUNPTkRBUllfQ09MT1IoY3R4KSkKKyAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyB8PSBERF9TRVBBUkFURV9TUEVDVUxBUjsKKyAgIGVsc2UKKyAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyAmPSB+RERfU0VQQVJBVEVfU1BFQ1VMQVI7Cit9CisKKwogLyoqCiAgKiBVcGRhdGUgc3RhdGUgZGVwZW5kZW50IG9uIHZlcnRleCBhcnJheXMuCiAgKi8KQEAgLTE3Niw3ICsxODgsNyBAQAogICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0VuYWJsZWQgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5FbmFibGVkCiAgICAgICAmJiBjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50LT5CYXNlLkluc3RydWN0aW9uczsKICAgIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuX0VuYWJsZWQgPSBjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkVuYWJsZWQKLSAgICAgICYmIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudC0+SW5zdHJ1Y3Rpb25zOworICAgICAgJiYgY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50LT5JbnN0cnVjdGlvbnNbMF07CiAKICAgIC8qCiAgICAgKiBTZXQgdGhlIGN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudCBhbmQgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQKQEAgLTE5NCw3NyArMjA2LDY1IEBACiAgICAgKiBjb21lIHVwLCBvciBtYXR0ZXIuCiAgICAgKi8KIAotICAgLyoqCi0gICAgKiogRnJhZ21lbnQgcHJvZ3JhbQotICAgICoqLwotI2lmIDEKLSAgIC8qIFhYWCBnZXQgcmlkIG9mIHRoaXMgc29tZWRheT8gKi8KLSAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9BY3RpdmUgPSBHTF9GQUxTRTsKLSNlbmRpZgotICAgaWYgKHNoUHJvZyAmJiBzaFByb2ctPkxpbmtTdGF0dXMgJiYgc2hQcm9nLT5GcmFnbWVudFByb2dyYW0pIHsKLSAgICAgIC8qIHVzZXItZGVmaW5lZCBmcmFnbWVudCBzaGFkZXIgKi8KKyAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7CisKKyAgIGlmIChzaFByb2cgJiYgc2hQcm9nLT5MaW5rU3RhdHVzKSB7CisgICAgICAvKiBVc2Ugc2hhZGVyIHByb2dyYW1zICovCisgICAgICAvKiBYWFggdGhpcyBpc24ndCBxdWl0ZSByaWdodCwgc2luY2Ugd2UgbWF5IGhhdmUgZWl0aGVyIGEgdmVydGV4CisgICAgICAgKiBfb3JfIGZyYWdtZW50IHNoYWRlciAobm90IGFsd2F5cyBib3RoKS4KKyAgICAgICAqLworICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaFByb2ctPlZlcnRleFByb2dyYW0pOwogICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoUHJvZy0+RnJhZ21lbnRQcm9ncmFtKTsKICAgIH0KLSAgIGVsc2UgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9FbmFibGVkKSB7Ci0gICAgICAvKiB1c2UgdXNlci1kZWZpbmVkIGZyYWdtZW50IHByb2dyYW0gKi8KLSAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50KTsKLSAgIH0KLSAgIGVsc2UgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9NYWludGFpblRleEVudlByb2dyYW0pIHsKLSAgICAgIC8qIGZyYWdtZW50IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gZml4ZWQtZnVuY3Rpb24gc3RhdGUgKi8KLSAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9nZXRfZml4ZWRfZnVuY19mcmFnbWVudF9wcm9ncmFtKGN0eCkpOwotICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLl9UZXhFbnZQcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50KTsKKyAgIGVsc2UgeworICAgICAgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5fRW5hYmxlZCkgeworICAgICAgICAgLyogdXNlIHVzZXItZGVmaW5lZCB2ZXJ0ZXggcHJvZ3JhbSAqLworICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uX01haW50YWluVG5sUHJvZ3JhbSkgeworICAgICAgICAgLyogVXNlIHZlcnRleCBwcm9ncmFtIGdlbmVyYXRlZCBmcm9tIGZpeGVkLWZ1bmN0aW9uIHN0YXRlLgorICAgICAgICAgICogVGhlIF9DdXJyZW50IHBvaW50ZXIgd2lsbCBnZXQgc2V0IGluCisgICAgICAgICAgKiBfdG5sX1VwZGF0ZUZpeGVkRnVuY3Rpb25Qcm9ncmFtKCkgbGF0ZXIgaWYgYXBwcm9wcmlhdGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQsIE5VTEwpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAvKiBubyB2ZXJ0ZXggcHJvZ3JhbSAqLworICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7CisgICAgICB9CiAKLSAgICAgIC8qIFhYWCBnZXQgcmlkIG9mIHRoaXMgY29uZnVzaW5nIHN0dWZmIHNvbWVkYXk/ICovCi0gICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQWN0aXZlID0gY3R4LT5GcmFnbWVudFByb2dyYW0uX0VuYWJsZWQ7CisgICAgICBpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0VuYWJsZWQpIHsKKyAgICAgICAgIC8qIHVzZSB1c2VyLWRlZmluZWQgdmVydGV4IHByb2dyYW0gKi8KKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9NYWludGFpblRleEVudlByb2dyYW0pIHsKKyAgICAgICAgIC8qIFVzZSBmcmFnbWVudCBwcm9ncmFtIGdlbmVyYXRlZCBmcm9tIGZpeGVkLWZ1bmN0aW9uIHN0YXRlLgorICAgICAgICAgICogVGhlIF9DdXJyZW50IHBvaW50ZXIgd2lsbCBnZXQgc2V0IGluIF9tZXNhX1VwZGF0ZVRleEVudlByb2dyYW0oKQorICAgICAgICAgICogbGF0ZXIgaWYgYXBwcm9wcmlhdGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIG5vIGZyYWdtZW50IHByb2dyYW0gKi8KKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQpCisgICAgICBhc3NlcnQoY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LT5CYXNlLlBhcmFtZXRlcnMpOworICAgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50KQorICAgICAgYXNzZXJ0KGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LT5CYXNlLlBhcmFtZXRlcnMpOworCisKKyAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9BY3RpdmUgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fRW5hYmxlZDsKKyAgIGlmIChjdHgtPkZyYWdtZW50UHJvZ3JhbS5fTWFpbnRhaW5UZXhFbnZQcm9ncmFtICYmCisgICAgICAgIWN0eC0+RnJhZ21lbnRQcm9ncmFtLl9FbmFibGVkKSB7CiAgICAgICBpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX1VzZVRleEVudlByb2dyYW0pCi0gICAgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQWN0aXZlID0gR0xfVFJVRTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgLyogbm8gZnJhZ21lbnQgcHJvZ3JhbSAqLwotICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LCBOVUxMKTsKLSAgIH0KLQotICAgaWYgKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50ICE9IHByZXZGUCAmJiBjdHgtPkRyaXZlci5CaW5kUHJvZ3JhbSkgewotICAgICAgY3R4LT5Ecml2ZXIuQmluZFByb2dyYW0oY3R4LCBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGdsX3Byb2dyYW0gKikgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQpOwotICAgfQotCi0gICAvKioKLSAgICAqKiBWZXJ0ZXggcHJvZ3JhbQotICAgICoqLwotI2lmIDEKLSAgIC8qIFhYWCBnZXQgcmlkIG9mIHRoaXMgc29tZWRheT8gKi8KLSAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uX1RubFByb2dyYW0sIE5VTEwpOwotI2VuZGlmCi0gICBpZiAoc2hQcm9nICYmIHNoUHJvZy0+TGlua1N0YXR1cyAmJiBzaFByb2ctPlZlcnRleFByb2dyYW0pIHsKLSAgICAgIC8qIHVzZXItZGVmaW5lZCB2ZXJ0ZXggc2hhZGVyICovCi0gICAgICBfbWVzYV9yZWZlcmVuY2VfdmVydHByb2coY3R4LCAmY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoUHJvZy0+VmVydGV4UHJvZ3JhbSk7Ci0gICB9Ci0gICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uX0VuYWJsZWQpIHsKLSAgICAgIC8qIHVzZSB1c2VyLWRlZmluZWQgdmVydGV4IHByb2dyYW0gKi8KLSAgICAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLkN1cnJlbnQpOwotICAgfQotICAgZWxzZSBpZiAoY3R4LT5WZXJ0ZXhQcm9ncmFtLl9NYWludGFpblRubFByb2dyYW0pIHsKLSAgICAgIC8qIHZlcnRleCBwcm9ncmFtIGdlbmVyYXRlZCBmcm9tIGZpeGVkLWZ1bmN0aW9uIHN0YXRlICovCi0gICAgICBfbWVzYV9yZWZlcmVuY2VfdmVydHByb2coY3R4LCAmY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX2dldF9maXhlZF9mdW5jX3ZlcnRleF9wcm9ncmFtKGN0eCkpOwotICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fVG5sUHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICAvKiBubyB2ZXJ0ZXggcHJvZ3JhbSAvIHVzZWQgZml4ZWQtZnVuY3Rpb24gY29kZSAqLwotICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fQ3VycmVudCwgTlVMTCk7Ci0gICB9Ci0KLSAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQgIT0gcHJldlZQICYmIGN0eC0+RHJpdmVyLkJpbmRQcm9ncmFtKSB7Ci0gICAgICBjdHgtPkRyaXZlci5CaW5kUHJvZ3JhbShjdHgsIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqKSBjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQpOworCSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQWN0aXZlID0gR0xfVFJVRTsKICAgIH0KIH0KIApAQCAtMzE1LDYgKzMxNSwyNCBAQAogfQogCiAKKy8qCisgKiBDaGVjayBwb2x5Z29uIHN0YXRlIGFuZCBzZXQgRERfVFJJX0NVTExfRlJPTlRfQkFDSyBhbmQvb3IgRERfVFJJX09GRlNFVAorICogaW4gY3R4LT5fVHJpYW5nbGVDYXBzIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9wb2x5Z29uKEdMY29udGV4dCAqY3R4KQoreworICAgY3R4LT5fVHJpYW5nbGVDYXBzICY9IH4oRERfVFJJX0NVTExfRlJPTlRfQkFDSyB8IEREX1RSSV9PRkZTRVQpOworCisgICBpZiAoY3R4LT5Qb2x5Z29uLkN1bGxGbGFnICYmIGN0eC0+UG9seWdvbi5DdWxsRmFjZU1vZGUgPT0gR0xfRlJPTlRfQU5EX0JBQ0spCisgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgfD0gRERfVFJJX0NVTExfRlJPTlRfQkFDSzsKKworICAgaWYgKCAgIGN0eC0+UG9seWdvbi5PZmZzZXRQb2ludAorICAgICAgIHx8IGN0eC0+UG9seWdvbi5PZmZzZXRMaW5lCisgICAgICAgfHwgY3R4LT5Qb2x5Z29uLk9mZnNldEZpbGwpCisgICAgICBjdHgtPl9UcmlhbmdsZUNhcHMgfD0gRERfVFJJX09GRlNFVDsKK30KKwogCiAvKioKICAqIFVwZGF0ZSB0aGUgY3R4LT5fVHJpYW5nbGVDYXBzIGJpdGZpZWxkLgpAQCAtMzIyLDYgKzM0MCw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIG90aGVyIHVwZGF0ZV8qKCkgZnVuY3Rpb25zIHNpbmNlCiAgKiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIG9uIHNvbWUgb3RoZXIgZGVyaXZlZCB2YWx1ZXMuCiAgKi8KKyNpZiAwCiBzdGF0aWMgdm9pZAogdXBkYXRlX3RyaWNhcHMoR0xjb250ZXh0ICpjdHgsIEdMYml0ZmllbGQgbmV3X3N0YXRlKQogewpAQCAtMzg3LDYgKzQwNiw3IEBACiAgICBpZiAoY3R4LT5TdGVuY2lsLl9UZXN0VHdvU2lkZSkKICAgICAgIGN0eC0+X1RyaWFuZ2xlQ2FwcyB8PSBERF9UUklfVFdPU1RFTkNJTDsKIH0KKyNlbmRpZgogCiAKIC8qKgpAQCAtNDIyLDYgKzQ0Miw5IEBACiAgICBpZiAobmV3X3N0YXRlICYgKF9ORVdfU0NJU1NPUiB8IF9ORVdfQlVGRkVSUyB8IF9ORVdfVklFV1BPUlQpKQogICAgICAgX21lc2FfdXBkYXRlX2RyYXdfYnVmZmVyX2JvdW5kcyggY3R4ICk7CiAKKyAgIGlmIChuZXdfc3RhdGUgJiBfTkVXX1BPTFlHT04pCisgICAgICB1cGRhdGVfcG9seWdvbiggY3R4ICk7CisKICAgIGlmIChuZXdfc3RhdGUgJiBfTkVXX0xJR0hUKQogICAgICAgX21lc2FfdXBkYXRlX2xpZ2h0aW5nKCBjdHggKTsKIApAQCAtNDMzLDYgKzQ1Niw5IEBACiAgICAgICBfbWVzYV91cGRhdGVfcGl4ZWwoIGN0eCwgbmV3X3N0YXRlICk7CiAjZW5kaWYKIAorICAgaWYgKG5ld19zdGF0ZSAmIF9ERF9ORVdfU0VQQVJBVEVfU1BFQ1VMQVIpCisgICAgICB1cGRhdGVfc2VwYXJhdGVfc3BlY3VsYXIoIGN0eCApOworCiAgICBpZiAobmV3X3N0YXRlICYgKF9ORVdfQVJSQVkgfCBfTkVXX1BST0dSQU0pKQogICAgICAgdXBkYXRlX2FycmF5cyggY3R4ICk7CiAKQEAgLTQ0NSw5ICs0NzEsMTEgQEAKICAgIGlmIChuZXdfc3RhdGUgJiBfTkVXX0NPTE9SKQogICAgICAgdXBkYXRlX2NvbG9yKCBjdHggKTsKIAorI2lmIDAKICAgIGlmIChuZXdfc3RhdGUgJiAoX05FV19QT0lOVCB8IF9ORVdfTElORSB8IF9ORVdfUE9MWUdPTiB8IF9ORVdfTElHSFQKICAgICAgICAgICAgICAgICAgICAgfCBfTkVXX1NURU5DSUwgfCBfRERfTkVXX1NFUEFSQVRFX1NQRUNVTEFSKSkKICAgICAgIHVwZGF0ZV90cmljYXBzKCBjdHgsIG5ld19zdGF0ZSApOworI2VuZGlmCiAKICAgIC8qIGN0eC0+X05lZWRFeWVDb29yZHMgaXMgbm93IHVwIHRvIGRhdGUuCiAgICAgKgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi90ZXhjb21wcmVzc19meHQxLmMgYi9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX2Z4dDEuYwppbmRleCAxNmEzYmEwLi5mYzE1MTYwIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX2Z4dDEuYworKysgYi9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX2Z4dDEuYwpAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41CisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi90ZXhjb21wcmVzc19zM3RjLmMgYi9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX3MzdGMuYwppbmRleCBjNDgwNjNkLi40ZjMyOWNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX3MzdGMuYworKysgYi9zcmMvbWVzYS9tYWluL3RleGNvbXByZXNzX3MzdGMuYwpAQCAtNTc3LDYgKzU3NywzMiBAQAogICAgTlVMTAkJCQkJLyogU3RvcmVUZXhlbCAqLwogfTsKIAorI2lmIEZFQVRVUkVfRVhUX3RleHR1cmVfc1JHQgorY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfZm9ybWF0IF9tZXNhX3RleGZvcm1hdF9zcmdiX2R4dDEgPSB7CisgICBNRVNBX0ZPUk1BVF9TUkdCX0RYVDEsCQkvKiBNZXNhRm9ybWF0ICovCisgICBHTF9SR0IsCQkJCS8qIEJhc2VGb3JtYXQgKi8KKyAgIEdMX1VOU0lHTkVEX05PUk1BTElaRURfQVJCLAkJLyogRGF0YVR5cGUgKi8KKyAgIDQsIC8qYXBwcm94Ki8JCQkvKiBSZWRCaXRzICovCisgICA0LCAvKmFwcHJveCovCQkJLyogR3JlZW5CaXRzICovCisgICA0LCAvKmFwcHJveCovCQkJLyogQmx1ZUJpdHMgKi8KKyAgIDAsCQkJCQkvKiBBbHBoYUJpdHMgKi8KKyAgIDAsCQkJCQkvKiBMdW1pbmFuY2VCaXRzICovCisgICAwLAkJCQkJLyogSW50ZW5zaXR5Qml0cyAqLworICAgMCwJCQkJCS8qIEluZGV4Qml0cyAqLworICAgMCwJCQkJCS8qIERlcHRoQml0cyAqLworICAgMCwJCQkJCS8qIFN0ZW5jaWxCaXRzICovCisgICAwLAkJCQkJLyogVGV4ZWxCeXRlcyAqLworICAgdGV4c3RvcmVfcmdiX2R4dDEsCQkJLyogU3RvcmVUZXhJbWFnZUZ1bmMgKi8KKyAgIE5VTEwsIC8qaW1wb3NzaWJsZSovIAkJLyogRmV0Y2hUZXhlbDFEICovCisgICBmZXRjaF90ZXhlbF8yZF9yZ2JfZHh0MSwgCQkvKiBGZXRjaFRleGVsMkQgKi8KKyAgIE5VTEwsIC8qaW1wb3NzaWJsZSovIAkJLyogRmV0Y2hUZXhlbDNEICovCisgICBOVUxMLCAvKmltcG9zc2libGUqLyAJCS8qIEZldGNoVGV4ZWwxRGYgKi8KKyAgIGZldGNoX3RleGVsXzJkX2ZfcmdiX2R4dDEsIAkJLyogRmV0Y2hUZXhlbDJEZiAqLworICAgTlVMTCwgLyppbXBvc3NpYmxlKi8gCQkvKiBGZXRjaFRleGVsM0RmICovCisgICBOVUxMCQkJCQkvKiBTdG9yZVRleGVsICovCit9OworI2VuZGlmCisKIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2Zvcm1hdCBfbWVzYV90ZXhmb3JtYXRfcmdiYV9keHQxID0gewogICAgTUVTQV9GT1JNQVRfUkdCQV9EWFQxLAkJLyogTWVzYUZvcm1hdCAqLwogICAgR0xfUkdCQSwJCQkJLyogQmFzZUZvcm1hdCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi90ZXhlbnZwcm9ncmFtLmMgYi9zcmMvbWVzYS9tYWluL3RleGVudnByb2dyYW0uYwppbmRleCA2ODc3ZWY5Li43MTNmZjNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3RleGVudnByb2dyYW0uYworKysgYi9zcmMvbWVzYS9tYWluL3RleGVudnByb2dyYW0uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImdsaGVhZGVyLmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCiAjaW5jbHVkZSAiZW51bXMuaCIKKyNpbmNsdWRlICJzaGFkZXIvcHJvZ3JhbS5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX2NhY2hlLmgiCiAjaW5jbHVkZSAic2hhZGVyL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKQEAgLTM2LDYgKzM3LDE2IEBACiAjaW5jbHVkZSAic2hhZGVyL3Byb2dyYW1vcHQuaCIKICNpbmNsdWRlICJ0ZXhlbnZwcm9ncmFtLmgiCiAKKworc3RydWN0IHRleGVudnByb2dfY2FjaGVfaXRlbQoreworICAgR0x1aW50IGhhc2g7CisgICB2b2lkICprZXk7CisgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZGF0YTsKKyAgIHN0cnVjdCB0ZXhlbnZwcm9nX2NhY2hlX2l0ZW0gKm5leHQ7Cit9OworCisKIC8qKgogICogVGhpcyBNQVggaXMgcHJvYmFibHkgYSBiaXQgZ2VuZXJvdXMsIGJ1dCB0aGF0J3MgT0suICBUaGVyZSBjYW4gYmUKICAqIHVwIHRvIGZvdXIgaW5zdHJ1Y3Rpb25zIHBlciB0ZXh0dXJlIHVuaXQgKFRFWCArIDMgZm9yIGNvbWJpbmUpLApAQCAtNTksNiArNzAsNyBAQAogICAgc3RydWN0IHsKICAgICAgIEdMdWludCBlbmFibGVkOjE7CiAgICAgICBHTHVpbnQgc291cmNlX2luZGV4OjM7ICAgLyogb25lIG9mIFRFWFRVUkVfMUQvMkQvM0QvQ1VCRS9SRUNUX0lOREVYICovCisgICAgICBHTHVpbnQgc2hhZG93OjE7CiAgICAgICBHTHVpbnQgU2NhbGVTaGlmdFJHQjoyOwogICAgICAgR0x1aW50IFNjYWxlU2hpZnRBOjI7CiAKQEAgLTIwMSw4ICsyMTMsOCBAQAogCiAgICBmb3IgKGk9MDtpPE1BWF9URVhUVVJFX1VOSVRTO2krKykgewogICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFtpXTsKLQkJCi0gICAgICBpZiAoIXRleFVuaXQtPl9SZWFsbHlFbmFibGVkKQorCisgICAgICBpZiAoIXRleFVuaXQtPl9SZWFsbHlFbmFibGVkIHx8ICF0ZXhVbml0LT5FbmFibGVkKQogICAgICAgICAgY29udGludWU7CiAKICAgICAgIGtleS0+dW5pdFtpXS5lbmFibGVkID0gMTsKQEAgLTIxMCw2ICsyMjIsNyBAQAogCiAgICAgICBrZXktPnVuaXRbaV0uc291cmNlX2luZGV4ID0gCiAJIHRyYW5zbGF0ZV90ZXhfc3JjX2JpdCh0ZXhVbml0LT5fUmVhbGx5RW5hYmxlZCk7CQkKKyAgICAgIGtleS0+dW5pdFtpXS5zaGFkb3cgPSB0ZXhVbml0LT5fQ3VycmVudC0+Q29tcGFyZU1vZGUgPT0gR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkU7CiAKICAgICAgIGtleS0+dW5pdFtpXS5OdW1BcmdzUkdCID0gdGV4VW5pdC0+X0N1cnJlbnRDb21iaW5lLT5fTnVtQXJnc1JHQjsKICAgICAgIGtleS0+dW5pdFtpXS5OdW1BcmdzQSA9IHRleFVuaXQtPl9DdXJyZW50Q29tYmluZS0+X051bUFyZ3NBOwpAQCAtNDc5LDcgKzQ5Miw3IEBACiB7CiAgICBHTHVpbnQgbnIgPSBwLT5wcm9ncmFtLT5CYXNlLk51bUluc3RydWN0aW9ucysrOwogICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSAmcC0+cHJvZ3JhbS0+QmFzZS5JbnN0cnVjdGlvbnNbbnJdOwotICAgICAgCisKICAgIGFzc2VydChuciA8IE1BWF9JTlNUUlVDVElPTlMpOwogCiAgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucyhpbnN0LCAxKTsKQEAgLTk0MCw2ICs5NTMsMTAgQEAKIAkgcC0+c3JjX3RleHR1cmVbdW5pdF0gPSBlbWl0X3RleGxkKCBwLCBPUENPREVfVFhQLAogCQkJCQkgICAgdG1wLCBXUklURU1BU0tfWFlaVywgCiAJCQkJCSAgICB1bml0LCBkaW0sIHRleGNvb3JkICk7CisKKwkgaWYgKHAtPnN0YXRlLT51bml0W3VuaXRdLnNoYWRvdykKKwkgICAgcC0+cHJvZ3JhbS0+QmFzZS5TaGFkb3dTYW1wbGVycyB8PSAxIDw8IHVuaXQ7CisKICAgICAgICAgIHAtPnByb2dyYW0tPkJhc2UuU2FtcGxlcnNVc2VkIHw9ICgxIDw8IHVuaXQpOwogICAgICAgICAgLyogVGhpcyBpZGVudGl0eSBtYXBwaW5nIHNob3VsZCBhbHJlYWR5IGJlIGluIHBsYWNlCiAgICAgICAgICAgKiAoc2VlIF9tZXNhX2luaXRfcHJvZ3JhbV9zdHJ1Y3QoKSkgYnV0IGxldCdzIGJlIHNhZmUuCkBAIC0xMTg0LDExICsxMjAxLDE0IEBACiAgICAvKiBJZiBhIGNvbnZlbnRpb25hbCBmcmFnbWVudCBwcm9ncmFtL3NoYWRlciBpc24ndCBpbiBlZmZlY3QuLi4gKi8KICAgIGlmICghY3R4LT5GcmFnbWVudFByb2dyYW0uX0VuYWJsZWQgJiYKICAgICAgICAoIWN0eC0+U2hhZGVyLkN1cnJlbnRQcm9ncmFtIHx8Ci0gICAgICAgICFjdHgtPlNoYWRlci5DdXJyZW50UHJvZ3JhbS0+RnJhZ21lbnRQcm9ncmFtKSApIHsKKyAgICAgICAgIWN0eC0+U2hhZGVyLkN1cnJlbnRQcm9ncmFtLT5GcmFnbWVudFByb2dyYW0pICkgCisgICB7CisgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqbmV3UHJvZzsKIAotICAgICAgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQKLSAgICAgICAgID0gY3R4LT5GcmFnbWVudFByb2dyYW0uX1RleEVudlByb2dyYW0KLSAgICAgICAgID0gX21lc2FfZ2V0X2ZpeGVkX2Z1bmNfZnJhZ21lbnRfcHJvZ3JhbShjdHgpOworICAgICAgbmV3UHJvZyA9IF9tZXNhX2dldF9maXhlZF9mdW5jX2ZyYWdtZW50X3Byb2dyYW0oY3R4KTsKKworICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LCBuZXdQcm9nKTsKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5fVGV4RW52UHJvZ3JhbSwgbmV3UHJvZyk7CiAgICB9IAogCiAgICAvKiBUZWxsIHRoZSBkcml2ZXIgYWJvdXQgdGhlIGNoYW5nZS4gIENvdWxkIGRlZmluZSBhIG5ldyB0YXJnZXQgZm9yCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL3RleGZvcm1hdC5oIGIvc3JjL21lc2EvbWFpbi90ZXhmb3JtYXQuaAppbmRleCAzYjZkMDU2Li5mMzRiM2I4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3RleGZvcm1hdC5oCisrKyBiL3NyYy9tZXNhL21haW4vdGV4Zm9ybWF0LmgKQEAgLTk4LDYgKzk4LDcgQEAKICAgIE1FU0FfRk9STUFUX1NSR0JBOCwKICAgIE1FU0FfRk9STUFUX1NMOCwKICAgIE1FU0FfRk9STUFUX1NMQTgsCisgICBNRVNBX0ZPUk1BVF9TUkdCX0RYVDEsCiAgICAvKkB9Ki8KICNlbmRpZgogCkBAIC0xNzMsNiArMTc0LDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9mb3JtYXQgX21lc2FfdGV4Zm9ybWF0X3NyZ2JhODsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9mb3JtYXQgX21lc2FfdGV4Zm9ybWF0X3NsODsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9mb3JtYXQgX21lc2FfdGV4Zm9ybWF0X3NsYTg7CitleHRlcm4gY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfZm9ybWF0IF9tZXNhX3RleGZvcm1hdF9zcmdiX2R4dDE7CiAvKkB9Ki8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL3RleGltYWdlLmMgYi9zcmMvbWVzYS9tYWluL3RleGltYWdlLmMKaW5kZXggMzY1NTdmMS4uOTFjNDFmMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi90ZXhpbWFnZS5jCisrKyBiL3NyYy9tZXNhL21haW4vdGV4aW1hZ2UuYwpAQCAtMiw3ICsyLDcgQEAKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKICAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0yMDE3LDcgKzIwMTcsNyBAQAogICAgfQogCiAgICBpZiAoaXNfY29tcHJlc3NlZF9mb3JtYXQoY3R4LCBpbnRlcm5hbEZvcm1hdCkpIHsKLSAgICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgaWYgKCF0YXJnZXRfY2FuX2JlX2NvbXByZXNzZWQoY3R4LCB0YXJnZXQpKSB7CiAgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRU5VTSwKICAgICAgICAgICAgICAgICAgICAgICJnbENvcHlUZXhJbWFnZSVkKHRhcmdldCkiLCBkaW1lbnNpb25zKTsKICAgICAgICAgIHJldHVybiBHTF9UUlVFOwpAQCAtMjIwMCw3ICsyMjAwLDcgQEAKICAgIH0KIAogICAgaWYgKHRleGltYWdlLT5Jc0NvbXByZXNzZWQpIHsKLSAgICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgaWYgKCF0YXJnZXRfY2FuX2JlX2NvbXByZXNzZWQoY3R4LCB0YXJnZXQpKSB7CiAgICAgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRU5VTSwKICAgICAgICAgICAgICAgICAgICAgICJnbENvcHlUZXhTdWJJbWFnZSVkKHRhcmdldCkiLCBkaW1lbnNpb25zKTsKICAgICAgICAgIHJldHVybiBHTF9UUlVFOwpAQCAtMjcxMSw4ICsyNzExLDggQEAKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAgLyogbm8gZXJyb3IsIHNldCB0aGUgdGV4IGltYWdlIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgIF9tZXNhX2luaXRfdGV4aW1hZ2VfZmllbGRzKGN0eCwgdGFyZ2V0LCB0ZXhJbWFnZSwgd2lkdGgsIGhlaWdodCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciwgaW50ZXJuYWxGb3JtYXQpOworICAgICAgICAgX21lc2FfaW5pdF90ZXhpbWFnZV9maWVsZHMoY3R4LCB0YXJnZXQsIHRleEltYWdlLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsIGJvcmRlciwgaW50ZXJuYWxGb3JtYXQpOwogICAgICAgICAgdGV4SW1hZ2UtPlRleEZvcm1hdCA9ICgqY3R4LT5Ecml2ZXIuQ2hvb3NlVGV4dHVyZUZvcm1hdCkoY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsIGZvcm1hdCwgdHlwZSk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL3RleHN0YXRlLmMgYi9zcmMvbWVzYS9tYWluL3RleHN0YXRlLmMKaW5kZXggMjBmOWM0NS4uODZjNTRhZSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi90ZXhzdGF0ZS5jCisrKyBiL3NyYy9tZXNhL21haW4vdGV4c3RhdGUuYwpAQCAtNjA4LDYgKzYwOCwyNCBAQAogICAgICAgICAgX21lc2FfcHJvYmxlbShjdHgsICJpbnZhbGlkIEFscGhhIGNvbWJpbmUgbW9kZSBpbiB1cGRhdGVfdGV4dHVyZV9zdGF0ZSIpOwogCSBicmVhazsKICAgICAgIH0KKyAgIH0KKworICAgLyogRGV0ZXJtaW5lIHdoaWNoIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIGFyZSBhY3R1YWxseSBuZWVkZWQgKi8KKyAgIGlmIChmcHJvZykgeworICAgICAgY29uc3QgR0x1aW50IGNvb3JkTWFzayA9ICgxIDw8IE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTKSAtIDE7CisgICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRDb29yZFVuaXRzCisgICAgICAgICA9IChmcHJvZy0+QmFzZS5JbnB1dHNSZWFkID4+IEZSQUdfQVRUUklCX1RFWDApICYgY29vcmRNYXNrOworICAgfQorICAgZWxzZSB7CisgICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRDb29yZFVuaXRzID0gY3R4LT5UZXh0dXJlLl9FbmFibGVkVW5pdHM7CisgICB9CisKKyAgIC8qIFNldHVwIHRleGdlbiBmb3IgdGhvc2UgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgdGhhdCBhcmUgaW4gdXNlICovCisgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7IHVuaXQrKykgeworICAgICAgc3RydWN0IGdsX3RleHR1cmVfdW5pdCAqdGV4VW5pdCA9ICZjdHgtPlRleHR1cmUuVW5pdFt1bml0XTsKKworICAgICAgaWYgKCEoY3R4LT5UZXh0dXJlLl9FbmFibGVkQ29vcmRVbml0cyAmICgxIDw8IHVuaXQpKSkKKwkgY29udGludWU7CiAKICAgICAgIGlmICh0ZXhVbml0LT5UZXhHZW5FbmFibGVkKSB7CiAJIGlmICh0ZXhVbml0LT5UZXhHZW5FbmFibGVkICYgU19CSVQpIHsKQEAgLTYzMCwxNiArNjQ4LDYgQEAKICAgICAgIGlmIChjdHgtPlRleHR1cmVNYXRyaXhTdGFja1t1bml0XS5Ub3AtPnR5cGUgIT0gTUFUUklYX0lERU5USVRZKQogCSBjdHgtPlRleHR1cmUuX1RleE1hdEVuYWJsZWQgfD0gRU5BQkxFX1RFWE1BVCh1bml0KTsKICAgIH0KLQotICAgLyogRGV0ZXJtaW5lIHdoaWNoIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIGFyZSBhY3R1YWxseSBuZWVkZWQgKi8KLSAgIGlmIChmcHJvZykgewotICAgICAgY29uc3QgR0x1aW50IGNvb3JkTWFzayA9ICgxIDw8IE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTKSAtIDE7Ci0gICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRDb29yZFVuaXRzCi0gICAgICAgICA9IChmcHJvZy0+QmFzZS5JbnB1dHNSZWFkID4+IEZSQUdfQVRUUklCX1RFWDApICYgY29vcmRNYXNrOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRDb29yZFVuaXRzID0gY3R4LT5UZXh0dXJlLl9FbmFibGVkVW5pdHM7Ci0gICB9CiB9CiAKIApAQCAtODIwLDMgKzgyOCwyNyBAQAogICAgfQogI2VuZGlmCiB9CisKKworLyoqCisgKiBVcGRhdGUgdGhlIGRlZmF1bHQgdGV4dHVyZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb250ZXh0IHRvIHJlZmVyZW5jZSB0aG9zZQorICogc3BlY2lmaWVkIGluIHRoZSBzaGFyZWQgc3RhdGUgYW5kIHJlbGVhc2UgdGhvc2UgcmVmZXJlbmNpbmcgdGhlIG9sZCAKKyAqIHNoYXJlZCBzdGF0ZS4KKyAqLwordm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c190ZXh0dXJlKEdMY29udGV4dCAqY3R4KQoreworICAgR0x1aW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRV9VTklUUzsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp0ZXhVbml0ID0gJmN0eC0+VGV4dHVyZS5Vbml0W2ldOworCisgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhVbml0LT5DdXJyZW50MUQsIGN0eC0+U2hhcmVkLT5EZWZhdWx0MUQpOworICAgICAgX21lc2FfcmVmZXJlbmNlX3RleG9iaigmdGV4VW5pdC0+Q3VycmVudDJELCBjdHgtPlNoYXJlZC0+RGVmYXVsdDJEKTsKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleFVuaXQtPkN1cnJlbnQzRCwgY3R4LT5TaGFyZWQtPkRlZmF1bHQzRCk7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhVbml0LT5DdXJyZW50Q3ViZU1hcCwgY3R4LT5TaGFyZWQtPkRlZmF1bHRDdWJlTWFwKTsKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV90ZXhvYmooJnRleFVuaXQtPkN1cnJlbnRSZWN0LCBjdHgtPlNoYXJlZC0+RGVmYXVsdFJlY3QpOworICAgICAgX21lc2FfcmVmZXJlbmNlX3RleG9iaigmdGV4VW5pdC0+Q3VycmVudDFEQXJyYXksIGN0eC0+U2hhcmVkLT5EZWZhdWx0MURBcnJheSk7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfdGV4b2JqKCZ0ZXhVbml0LT5DdXJyZW50MkRBcnJheSwgY3R4LT5TaGFyZWQtPkRlZmF1bHQyREFycmF5KTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vdGV4c3RhdGUuaCBiL3NyYy9tZXNhL21haW4vdGV4c3RhdGUuaAppbmRleCBiNTAwM2Q1Li5hN2Q3MDg4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3RleHN0YXRlLmgKKysrIGIvc3JjL21lc2EvbWFpbi90ZXhzdGF0ZS5oCkBAIC03Myw2ICs3Myw5IEBACiBleHRlcm4gdm9pZCAKIF9tZXNhX2ZyZWVfdGV4dHVyZV9kYXRhKCBHTGNvbnRleHQgKmN0eCApOwogCitleHRlcm4gdm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c190ZXh0dXJlKEdMY29udGV4dCAqY3R4KTsKKwogLypAfSovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi90ZXhzdG9yZS5jIGIvc3JjL21lc2EvbWFpbi90ZXhzdG9yZS5jCmluZGV4IGU4MjFkOWYuLjM5ZjlkMWQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vdGV4c3RvcmUuYworKysgYi9zcmMvbWVzYS9tYWluL3RleHN0b3JlLmMKQEAgLTM4MDIsOCArMzgwMiw4IEBACiB2b2lkCiBfbWVzYV9nZXRfY29tcHJlc3NlZF90ZXhpbWFnZShHTGNvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKmltZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpCiB7CiAgICBHTHVpbnQgc2l6ZTsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWFpbi90ZXhzdG9yZS5oIGIvc3JjL21lc2EvbWFpbi90ZXhzdG9yZS5oCmluZGV4IGM1ODEzZmIuLmM5ZWRmMTQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vdGV4c3RvcmUuaAorKysgYi9zcmMvbWVzYS9tYWluL3RleHN0b3JlLmgKQEAgLTIxNSw4ICsyMTUsOCBAQAogZXh0ZXJuIHZvaWQKIF9tZXNhX2dldF9jb21wcmVzc2VkX3RleGltYWdlKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UpOwogCiBleHRlcm4gY29uc3QgR0x2b2lkICoKIF9tZXNhX3ZhbGlkYXRlX3Bib190ZXhpbWFnZShHTGNvbnRleHQgKmN0eCwgR0x1aW50IGRpbWVuc2lvbnMsCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYWluL3ZhcnJheS5jIGIvc3JjL21lc2EvbWFpbi92YXJyYXkuYwppbmRleCBhNmFhOWMzLi4yMzRiNzEyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9tYWluL3ZhcnJheS5jCisrKyBiL3NyYy9tZXNhL21haW4vdmFycmF5LmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogX21lc2FfVmVydGV4QXR0cmliUG9pbnRlck5WKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyKQogewotICAgY29uc3QgR0xib29sZWFuIG5vcm1hbGl6ZWQgPSBHTF9GQUxTRTsKKyAgIEdMYm9vbGVhbiBub3JtYWxpemVkID0gR0xfRkFMU0U7CiAgICBHTHNpemVpIGVsZW1lbnRTaXplOwogICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOwogICAgQVNTRVJUX09VVFNJREVfQkVHSU5fRU5EKGN0eCk7CkBAIC01MzIsNiArNTMyLDcgQEAKICAgIC8qIGNoZWNrIGZvciB2YWxpZCAndHlwZScgYW5kIGNvbXB1dGUgU3RyaWRlQiByaWdodCBhd2F5ICovCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgIG5vcm1hbGl6ZWQgPSBHTF9UUlVFOwogICAgICAgICAgZWxlbWVudFNpemUgPSBzaXplICogc2l6ZW9mKEdMdWJ5dGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdMX1NIT1JUOgpAQCAtODcwLDE1ICs4NzEsMjEgQEAKICAgIGlmIChNRVNBX1ZFUkJPU0UgJiBWRVJCT1NFX0FQSSkKICAgICAgIF9tZXNhX2RlYnVnKGN0eCwgImdsTG9ja0FycmF5cyAlZCAlZFxuIiwgZmlyc3QsIGNvdW50KTsKIAotICAgaWYgKGZpcnN0ID09IDAgJiYgY291bnQgPiAwICYmCi0gICAgICAgY291bnQgPD0gKEdMaW50KSBjdHgtPkNvbnN0Lk1heEFycmF5TG9ja1NpemUpIHsKLSAgICAgIGN0eC0+QXJyYXkuTG9ja0ZpcnN0ID0gZmlyc3Q7Ci0gICAgICBjdHgtPkFycmF5LkxvY2tDb3VudCA9IGNvdW50OworICAgaWYgKGZpcnN0IDwgMCkgeworICAgICAgX21lc2FfZXJyb3IoIGN0eCwgR0xfSU5WQUxJRF9WQUxVRSwgImdsTG9ja0FycmF5c0VYVChmaXJzdCkiICk7CisgICAgICByZXR1cm47CiAgICB9Ci0gICBlbHNlIHsKLSAgICAgIGN0eC0+QXJyYXkuTG9ja0ZpcnN0ID0gMDsKLSAgICAgIGN0eC0+QXJyYXkuTG9ja0NvdW50ID0gMDsKKyAgIGlmIChjb3VudCA8PSAwKSB7CisgICAgICBfbWVzYV9lcnJvciggY3R4LCBHTF9JTlZBTElEX1ZBTFVFLCAiZ2xMb2NrQXJyYXlzRVhUKGNvdW50KSIgKTsKKyAgICAgIHJldHVybjsKICAgIH0KKyAgIGlmIChjdHgtPkFycmF5LkxvY2tDb3VudCAhPSAwKSB7CisgICAgICBfbWVzYV9lcnJvciggY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgImdsTG9ja0FycmF5c0VYVChyZWVudHJ5KSIgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgY3R4LT5BcnJheS5Mb2NrRmlyc3QgPSBmaXJzdDsKKyAgIGN0eC0+QXJyYXkuTG9ja0NvdW50ID0gY291bnQ7CiAKICAgIGN0eC0+TmV3U3RhdGUgfD0gX05FV19BUlJBWTsKICAgIGN0eC0+QXJyYXkuTmV3U3RhdGUgfD0gX05FV19BUlJBWV9BTEw7CkBAIC04OTcsNiArOTA0LDExIEBACiAgICBpZiAoTUVTQV9WRVJCT1NFICYgVkVSQk9TRV9BUEkpCiAgICAgICBfbWVzYV9kZWJ1ZyhjdHgsICJnbFVubG9ja0FycmF5c1xuIik7CiAKKyAgIGlmIChjdHgtPkFycmF5LkxvY2tDb3VudCA9PSAwKSB7CisgICAgICBfbWVzYV9lcnJvciggY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgImdsVW5sb2NrQXJyYXlzRVhUKHJlZXhpdCkiICk7CisgICAgICByZXR1cm47CisgICB9CisKICAgIGN0eC0+QXJyYXkuTG9ja0ZpcnN0ID0gMDsKICAgIGN0eC0+QXJyYXkuTG9ja0NvdW50ID0gMDsKICAgIGN0eC0+TmV3U3RhdGUgfD0gX05FV19BUlJBWTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vdmFycmF5LmggYi9zcmMvbWVzYS9tYWluL3ZhcnJheS5oCmluZGV4IGY1NTc5NDAuLjk3ZDVjODIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL21haW4vdmFycmF5LmgKKysrIGIvc3JjL21lc2EvbWFpbi92YXJyYXkuaApAQCAtMTUwLDYgKzE1MCwxMSBAQAogCQkJCUdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKiBjb25zdCAqIGluZGljZXMsCiAJCQkJR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUgKTsKIAorZXh0ZXJuIHZvaWQgR0xBUElFTlRSWQorX21lc2FfTG9ja0FycmF5c0VYVChHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CisKK2V4dGVybiB2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VubG9ja0FycmF5c0VYVCggdm9pZCApOwogCiAKIGV4dGVybiB2b2lkIEdMQVBJRU5UUlkKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL21haW4vdmVyc2lvbi5oIGIvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmgKaW5kZXggOTIyOTA3Ny4uODEwMzRhMyAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmgKKysrIGIvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmgKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDcuMQorICogVmVyc2lvbjogIDcuMwogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTI5LDkgKzI5LDkgQEAKIAogLyogTWVzYSB2ZXJzaW9uICovCiAjZGVmaW5lIE1FU0FfTUFKT1IgNwotI2RlZmluZSBNRVNBX01JTk9SIDEKKyNkZWZpbmUgTUVTQV9NSU5PUiAzCiAjZGVmaW5lIE1FU0FfUEFUQ0ggMAotI2RlZmluZSBNRVNBX1ZFUlNJT05fU1RSSU5HICI3LjEiCisjZGVmaW5lIE1FU0FfVkVSU0lPTl9TVFJJTkcgIjcuMy1kZXZlbCIKIAogLyogVG8gbWFrZSB2ZXJzaW9uIGNvbXBhcmlzb24gZWFzeSAqLwogI2RlZmluZSBNRVNBX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9tYXRoL2Rlc2NyaXAubW1zIGIvc3JjL21lc2EvbWF0aC9kZXNjcmlwLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWFhNmViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvbWF0aC9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDQ3IEBACisjIE1ha2VmaWxlIGZvciBjb3JlIGxpYnJhcnkgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCByZXZpc2lvbiA6IDMgT2N0b2JlciAyMDA3CisKKy5maXJzdAorCWRlZmluZSBnbCBbLS0tLmluY2x1ZGUuZ2xdCisJZGVmaW5lIG1hdGggWy0ubWF0aF0KKwlkZWZpbmUgZ2xhcGkgWy0uZ2xhcGldCisJZGVmaW5lIG1haW4gWy0ubWFpbl0KKworLmluY2x1ZGUgWy0tLV1tbXMtY29uZmlnLgorCisjIyMjIyBNQUNST1MgIyMjIyMKKworVlBBVEggPSBSQ1MKKworSU5DRElSID0gWy0tLS5pbmNsdWRlXSxbLS5tYWluXSxbLS5nbGFwaV0KK0xJQkRJUiA9IFstLS0ubGliXQorQ0ZMQUdTID0gL2luY2x1ZGU9KCQoSU5DRElSKSxbXSkvZGVmaW5lPShQVEhSRUFEUz0xKS9uYW1lPShhc19pcyxzaG9ydCkvZmxvYXQ9aWVlZS9pZWVlPWRlbm9ybQorCitTT1VSQ0VTID0gbV9kZWJ1Z19jbGlwLmMgbV9kZWJ1Z19ub3JtLmMgbV9kZWJ1Z194Zm9ybS5jIG1fZXZhbC5jIG1fbWF0cml4LmNcCisJbV90cmFuc2xhdGUuYyBtX3ZlY3Rvci5jIG1feGZvcm0uYworCitPQkpFQ1RTID0gbV9kZWJ1Z19jbGlwLm9iaixtX2RlYnVnX25vcm0ub2JqLG1fZGVidWdfeGZvcm0ub2JqLG1fZXZhbC5vYmosXAorCW1fbWF0cml4Lm9iaixtX3RyYW5zbGF0ZS5vYmosbV92ZWN0b3Iub2JqLG1feGZvcm0ub2JqCisgCisjIyMjIyBSVUxFUyAjIyMjIworCitWRVJTSU9OPU1lc2EgVjMuNAorCisjIyMjIyBUQVJHRVRTICMjIyMjCisjIE1ha2UgdGhlIGxpYnJhcnkKKyQoTElCRElSKSQoR0xfTElCKSA6ICQoT0JKRUNUUykKKyAgQCBsaWJyYXJ5ICQoTElCRElSKSQoR0xfTElCKSAkKE9CSkVDVFMpCisKK2NsZWFuIDoKKwlwdXJnZQorCWRlbGV0ZSAqLm9iajsqCisKK21fZGVidWdfY2xpcC5vYmogOiBtX2RlYnVnX2NsaXAuYworbV9kZWJ1Z19ub3JtLm9iaiA6IG1fZGVidWdfbm9ybS5jCittX2RlYnVnX3hmb3JtLm9iaiA6IG1fZGVidWdfeGZvcm0uYworbV9ldmFsLm9iaiA6IG1fZXZhbC5jCittX21hdHJpeC5vYmogOiBtX21hdHJpeC5jCittX3RyYW5zbGF0ZS5vYmogOiBtX3RyYW5zbGF0ZS5jCittX3ZlY3Rvci5vYmogOiBtX3ZlY3Rvci5jCittX3hmb3JtLm9iaiA6IG1feGZvcm0uYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWF0aC9tX2RlYnVnX3V0aWwuaCBiL3NyYy9tZXNhL21hdGgvbV9kZWJ1Z191dGlsLmgKaW5kZXggNzc2YzI2NC4uN2FiZTZmMiAxMDA2NDQKLS0tIGEvc3JjL21lc2EvbWF0aC9tX2RlYnVnX3V0aWwuaAorKysgYi9zcmMvbWVzYS9tYXRoL21fZGVidWdfdXRpbC5oCkBAIC0xODUsNyArMTg1LDcgQEAKIAogI2VuZGlmCiAKLSNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKQorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQogCiAjZGVmaW5lIHJkdHNjbGwodmFsKSBkbyB7IFwKICAgICAgdW5zaWduZWQgaW50IGEsZDsgXApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvbWF0aC9zb3VyY2VzIGIvc3JjL21lc2EvbWF0aC9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdkY2NjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL21hdGgvc291cmNlcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1FU0FfTUFUSF9TT1VSQ0VTID0gXAotbV9kZWJ1Z19jbGlwLmMgXAotbV9kZWJ1Z19ub3JtLmMgXAotbV9kZWJ1Z194Zm9ybS5jIFwKLW1fZXZhbC5jIFwKLW1fbWF0cml4LmMgXAotbV90cmFuc2xhdGUuYyBcCi1tX3ZlY3Rvci5jIFwKLW1feGZvcm0uYwotCi1NRVNBX01BVEhfSEVBREVSUyA9IFwKLW1fY2xpcF90bXAuaCBcCi1tX2NvcHlfdG1wLmggXAotbV9kZWJ1Zy5oIFwKLW1fZGVidWdfdXRpbC5oIFwKLW1fZG90cHJvZF90bXAuaCBcCi1tX2V2YWwuaCBcCi1tX21hdHJpeC5oIFwKLW1fbm9ybV90bXAuaCBcCi1tX3RyYW5zX3RtcC5oIFwKLW1fdHJhbnNsYXRlLmggXAotbV92ZWN0b3IuaCBcCi1tX3hmb3JtLmggXAotbV94Zm9ybV90bXAuaCBcCi1tYXRobW9kLmgKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9kZXNjcmlwLm1tcyBiL3NyYy9tZXNhL3NoYWRlci9kZXNjcmlwLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFjOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2Evc2hhZGVyL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsOTMgQEAKKyMgTWFrZWZpbGUgZm9yIGNvcmUgbGlicmFyeSBmb3IgVk1TCisjIGNvbnRyaWJ1dGVkIGJ5IEpvdWsgSmFuc2VuICBqb3VrakBocmVtLm5hbm8udHVkZWxmdC5ubAorIyBMYXN0IHJldmlzaW9uIDogMjcgTWF5IDIwMDgKKy5maXJzdAorCWRlZmluZSBnbCBbLS0tLmluY2x1ZGUuZ2xdCisJZGVmaW5lIG1hdGggWy0ubWF0aF0KKwlkZWZpbmUgc3dyYXN0IFstLnN3cmFzdF0KKwlkZWZpbmUgYXJyYXlfY2FjaGUgWy0uYXJyYXlfY2FjaGVdCisJZGVmaW5lIGdsYXBpIFstLmdsYXBpXQorCWRlZmluZSBtYWluIFstLm1haW5dCisJZGVmaW5lIHNoYWRlciBbLS5zaGFkZXJdCisKKy5pbmNsdWRlIFstLS1dbW1zLWNvbmZpZy4KKworIyMjIyMgTUFDUk9TICMjIyMjCisKK1ZQQVRIID0gUkNTCisKK0lOQ0RJUiA9IFstLS0uaW5jbHVkZV0sWy5ncmFtbWFyXSxbLS5tYWluXSxbLS5nbGFwaV0sWy5zbGFuZ10KK0xJQkRJUiA9IFstLS0ubGliXQorQ0ZMQUdTID0gL2luY2x1ZGU9KCQoSU5DRElSKSxbXSkvZGVmaW5lPShQVEhSRUFEUz0xLCJfX2V4dGVuc2lvbl9fPSIpL25hbWU9KGFzX2lzLHNob3J0KS9mbG9hdD1pZWVlL2llZWU9ZGVub3JtCisKK1NPVVJDRVMgPSBcCisJYXRpZnJhZ3NoYWRlci5jIFwKKwlhcmJwcm9ncGFyc2UuYyBcCisJYXJicHJvZ3JhbS5jIFwKKwludmZyYWdwYXJzZS5jIFwKKwludnByb2dyYW0uYyBcCisJbnZ2ZXJ0cGFyc2UuYyBcCisJcHJvZ3JhbS5jIFwKKwlwcm9ncmFtb3B0LmMgXAorCXByb2dfZGVidWcuYyBcCisJcHJvZ19leGVjdXRlLmMgXAorCXByb2dfaW5zdHJ1Y3Rpb24uYyBcCisJcHJvZ19wYXJhbWV0ZXIuYyBcCisJcHJvZ19wcmludC5jIFwKKwlwcm9nX3N0YXRldmFycy5jIFwKKwlzaGFkZXJfYXBpLmMgcHJvZ191bmlmb3JtLmMKKworT0JKRUNUUyA9IFwKKwlhdGlmcmFnc2hhZGVyLm9iaixcCisJYXJicHJvZ3BhcnNlLm9iaixcCisJYXJicHJvZ3JhbS5vYmosXAorCW52ZnJhZ3BhcnNlLm9iaixcCisJbnZwcm9ncmFtLm9iaixcCisJbnZ2ZXJ0cGFyc2Uub2JqLFwKKwlwcm9ncmFtLm9iaixcCisJcHJvZ3JhbW9wdC5vYmosXAorCXByb2dfZGVidWcub2JqLFwKKwlwcm9nX2V4ZWN1dGUub2JqLFwKKwlwcm9nX2luc3RydWN0aW9uLm9iaixcCisJcHJvZ19wYXJhbWV0ZXIub2JqLFwKKwlwcm9nX3ByaW50Lm9iaixcCisJcHJvZ19zdGF0ZXZhcnMub2JqLFwKKwlzaGFkZXJfYXBpLm9iaixwcm9nX3VuaWZvcm0ub2JqCisKKyMjIyMjIFJVTEVTICMjIyMjCisKK1ZFUlNJT049TWVzYSBWMy40CisKKyMjIyMjIFRBUkdFVFMgIyMjIyMKK2FsbCA6IAorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykgJChMSUJESVIpJChHTF9MSUIpCisJc2V0IGRlZiBbLnNsYW5nXQorCSQoTU1TKSQoTU1TUVVBTElGSUVSUykKKwlzZXQgZGVmIFstLmdyYW1tYXJdCisJJChNTVMpJChNTVNRVUFMSUZJRVJTKQorCXNldCBkZWYgWy1dCisKKyMgTWFrZSB0aGUgbGlicmFyeQorJChMSUJESVIpJChHTF9MSUIpIDogJChPQkpFQ1RTKQorICBAIGxpYnJhcnkgJChMSUJESVIpJChHTF9MSUIpICQoT0JKRUNUUykKKworY2xlYW4gOgorCXB1cmdlCisJZGVsZXRlICoub2JqOyoKKworYXRpZnJhZ3NoYWRlci5vYmogOiBhdGlmcmFnc2hhZGVyLmMKK2FyYnByb2dwYXJzZS5vYmogOiBhcmJwcm9ncGFyc2UuYworYXJicHJvZ3JhbS5vYmogOiBhcmJwcm9ncmFtLmMKK252ZnJhZ3BhcnNlLm9iaiA6IG52ZnJhZ3BhcnNlLmMKK252cHJvZ3JhbS5vYmogOiBudnByb2dyYW0uYworbnZ2ZXJ0cGFyc2Uub2JqIDogbnZ2ZXJ0cGFyc2UuYworcHJvZ3JhbS5vYmogOiBwcm9ncmFtLmMKK3Byb2dyYW1vcHQuIG9iaiA6IHByb2dyYW1vcHQuYworcHJvZ19kZWJ1Zy5vYmogOiBwcm9nX2RlYnVnLmMKK3Byb2dfZXhlY3V0ZS5vYmogOiBwcm9nX2V4ZWN1dGUuYworcHJvZ19pbnN0cnVjdGlvbi5vYmogOiBwcm9nX2luc3RydWN0aW9uLmMKK3Byb2dfcGFyYW1ldGVyLm9iaiA6IHByb2dfcGFyYW1ldGVyLmMKK3Byb2dfcHJpbnQub2JqIDogcHJvZ19wcmludC5jCitwcm9nX3N0YXRldmFycy5vYmogOiBwcm9nX3N0YXRldmFycy5jCitzaGFkZXJfYXBpLm9iaiA6IHNoYWRlcl9hcGkuYworcHJvZ191bmlmb3JtLm9iaiA6IHByb2dfdW5pZm9ybS5jCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zaGFkZXIvZ3JhbW1hci9zb3VyY2VzIGIvc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIvc291cmNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiYmZkMy4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9zaGFkZXIvZ3JhbW1hci9zb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NRVNBX1NIQURFUl9HUkFNTUFSX1NPVVJDRVMgPSBcCi1ncmFtbWFyX21lc2EuYwotCi1NRVNBX1NIQURFUl9HUkFNTUFSX0hFQURFUlMgPSBcCi1ncmFtbWFyLmMgXAotZ3JhbW1hci5oIFwKLWdyYW1tYXJfbWVzYS5oIFwKLWdyYW1tYXJfc3luLmgKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9wcm9nX2V4ZWN1dGUuYyBiL3NyYy9tZXNhL3NoYWRlci9wcm9nX2V4ZWN1dGUuYwppbmRleCA1YWZkOWViLi4zMmI2ZmY0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zaGFkZXIvcHJvZ19leGVjdXRlLmMKKysrIGIvc3JjL21lc2Evc2hhZGVyL3Byb2dfZXhlY3V0ZS5jCkBAIC05MCw3ICs5MCw4IEBACiAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1zOwogICAgICAgICAgQVNTRVJUKHNvdXJjZS0+RmlsZSA9PSBQUk9HUkFNX0xPQ0FMX1BBUkFNIHx8CiAgICAgICAgICAgICAgICAgc291cmNlLT5GaWxlID09IFBST0dSQU1fQ09OU1RBTlQgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UtPkZpbGUgPT0gUFJPR1JBTV9TVEFURV9WQVIpOworICAgICAgICAgICAgICAgIHNvdXJjZS0+RmlsZSA9PSBQUk9HUkFNX1NUQVRFX1ZBUiB8fAorICAgICAgICAgICAgICAgIHNvdXJjZS0+RmlsZSA9PSBQUk9HUkFNX1VOSUZPUk0pOwogICAgICAgICAgcGFyYW1zID0gbWFjaGluZS0+Q3VyUHJvZ3JhbS0+UGFyYW1ldGVyczsKICAgICAgICAgIGlmIChyZWcgPCAwIHx8IHJlZyA+PSAoR0xpbnQpcGFyYW1zLT5OdW1QYXJhbWV0ZXJzKQogICAgICAgICAgICAgcmV0dXJuIFplcm9WZWM7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zaGFkZXIvcHJvZ19zdGF0ZXZhcnMuYyBiL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5jCmluZGV4IDgxOWRiMjUuLjk3MWViMjUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5jCisrKyBiL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgICAgICAgQUREXzNWKHZhbHVlLCBwLCBleWVfeik7CiAJICAgICAgIE5PUk1BTElaRV8zRlYodmFsdWUpOwogCSAgICAgICB2YWx1ZVszXSA9IDEuMDsKLSAgICAgICAgICAgIH0JCQkJCQkgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIF9tZXNhX3Byb2JsZW0oY3R4LCAiSW52YWxpZCBsaWdodCBzdGF0ZSBpbiBmZXRjaF9zdGF0ZSIpOwpAQCAtMjM1LDExICsyMzUsMTEgQEAKICAgICAgICAgIH0KICAgICAgIH0KICAgIGNhc2UgU1RBVEVfVEVYRU5WX0NPTE9SOgotICAgICAgewkJCisgICAgICB7CiAgICAgICAgICAvKiBzdGF0ZVsxXSBpcyB0aGUgdGV4dHVyZSB1bml0ICovCiAgICAgICAgICBjb25zdCBHTHVpbnQgdW5pdCA9IChHTHVpbnQpIHN0YXRlWzFdOwogICAgICAgICAgQ09QWV80Vih2YWx1ZSwgY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF0uRW52Q29sb3IpOwotICAgICAgfQkJCQorICAgICAgfQogICAgICAgcmV0dXJuOwogICAgY2FzZSBTVEFURV9GT0dfQ09MT1I6CiAgICAgICBDT1BZXzRWKHZhbHVlLCBjdHgtPkZvZy5Db2xvcik7CkBAIC0zNjksNyArMzY5LDcgQEAKICAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybjsKLQkJCisKICAgIGNhc2UgU1RBVEVfVkVSVEVYX1BST0dSQU06CiAgICAgICB7CiAgICAgICAgICAvKiBzdGF0ZVsxXSA9IHtTVEFURV9FTlYsIFNUQVRFX0xPQ0FMfSAqLwpAQCAtNDY5LDcgKzQ2OSw2IEBACiAgICAgICB9CQkJCQkJICAKIAogCi0KICAgICAgIGNhc2UgU1RBVEVfUFRfU0NBTEU6CiAgICAgICAgICB2YWx1ZVswXSA9IGN0eC0+UGl4ZWwuUmVkU2NhbGU7CiAgICAgICAgICB2YWx1ZVsxXSA9IGN0eC0+UGl4ZWwuR3JlZW5TY2FsZTsKQEAgLTQ4OCw2ICs0ODcsMjAgQEAKICAgICAgIGNhc2UgU1RBVEVfUENNX0JJQVM6CiAgICAgICAgICBDT1BZXzRWKHZhbHVlLCBjdHgtPlBpeGVsLlBvc3RDb2xvck1hdHJpeEJpYXMpOwogICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNUQVRFX1NIQURPV19BTUJJRU5UOgorICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHVuaXQgPSAoaW50KSBzdGF0ZVsyXTsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqCisgICAgICAgICAgICAgICA9IGN0eC0+VGV4dHVyZS5Vbml0W3VuaXRdLl9DdXJyZW50OworICAgICAgICAgICAgaWYgKHRleE9iaikgeworICAgICAgICAgICAgICAgdmFsdWVbMF0gPSB0ZXhPYmotPlNoYWRvd0FtYmllbnQ7CisgICAgICAgICAgICAgICB2YWx1ZVsxXSA9IHRleE9iai0+U2hhZG93QW1iaWVudDsKKyAgICAgICAgICAgICAgIHZhbHVlWzJdID0gdGV4T2JqLT5TaGFkb3dBbWJpZW50OworICAgICAgICAgICAgICAgdmFsdWVbM10gPSB0ZXhPYmotPlNoYWRvd0FtYmllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAvKiB1bmtub3duIHN0YXRlIGluZGV4ZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQKICAgICAgICAgICAqICBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgZHJpdmVyLgpAQCAtNTYyLDYgKzU3NSw3IEBACiAgICBjYXNlIFNUQVRFX0lOVEVSTkFMOgogICAgICAgc3dpdGNoIChzdGF0ZVsxXSkgewogICAgICAgY2FzZSBTVEFURV9URVhSRUNUX1NDQUxFOgorICAgICAgY2FzZSBTVEFURV9TSEFET1dfQU1CSUVOVDoKIAkgcmV0dXJuIF9ORVdfVEVYVFVSRTsKICAgICAgIGNhc2UgU1RBVEVfRk9HX1BBUkFNU19PUFRJTUlaRUQ6CiAJIHJldHVybiBfTkVXX0ZPRzsKQEAgLTc0MCw2ICs3NTQsOSBAQAogICAgY2FzZSBTVEFURV9QQ01fQklBUzoKICAgICAgIGFwcGVuZChkc3QsICJQQ01iaWFzIik7CiAgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfU0hBRE9XX0FNQklFTlQ6CisgICAgICBhcHBlbmQoZHN0LCAiU2hhZG93QW1iaWVudCIpOworICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgOwogICAgfQpAQCAtODkwLDEwICs5MDcsMTAxIEBACiAKICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbUxpc3QtPk51bVBhcmFtZXRlcnM7IGkrKykgewogICAgICAgaWYgKHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5UeXBlID09IFBST0dSQU1fU1RBVEVfVkFSKSB7Ci0gICAgICAgICBfbWVzYV9mZXRjaF9zdGF0ZShjdHgsIAorICAgICAgICAgX21lc2FfZmV0Y2hfc3RhdGUoY3R4LAogCQkJICAgKGdsX3N0YXRlX2luZGV4ICopIHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5TdGF0ZUluZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXSk7CiAgICAgICB9CiAgICB9CiB9CiAKKworLyoqCisgKiBDb3B5IHRoZSAxNiBlbGVtZW50cyBvZiBhIG1hdHJpeCBpbnRvIGZvdXIgY29uc2VjdXRpdmUgcHJvZ3JhbQorICogcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0ICdwb3MnLgorICovCitzdGF0aWMgdm9pZAorbG9hZF9tYXRyaXgoR0xmbG9hdCByZWdpc3RlcnNbXVs0XSwgR0x1aW50IHBvcywgY29uc3QgR0xmbG9hdCBtYXRbMTZdKQoreworICAgR0x1aW50IGk7CisgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICByZWdpc3RlcnNbcG9zICsgaV1bMF0gPSBtYXRbMCArIGldOworICAgICAgcmVnaXN0ZXJzW3BvcyArIGldWzFdID0gbWF0WzQgKyBpXTsKKyAgICAgIHJlZ2lzdGVyc1twb3MgKyBpXVsyXSA9IG1hdFs4ICsgaV07CisgICAgICByZWdpc3RlcnNbcG9zICsgaV1bM10gPSBtYXRbMTIgKyBpXTsKKyAgIH0KK30KKworCisvKioKKyAqIEFzIGFib3ZlLCBidXQgdHJhbnNwb3NlIHRoZSBtYXRyaXguCisgKi8KK3N0YXRpYyB2b2lkCitsb2FkX3RyYW5zcG9zZV9tYXRyaXgoR0xmbG9hdCByZWdpc3RlcnNbXVs0XSwgR0x1aW50IHBvcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0IG1hdFsxNl0pCit7CisgICBNRU1DUFkocmVnaXN0ZXJzW3Bvc10sIG1hdCwgMTYgKiBzaXplb2YoR0xmbG9hdCkpOworfQorCisKKy8qKgorICogTG9hZCBjdXJyZW50IHZlcnRleCBwcm9ncmFtJ3MgcGFyYW1ldGVyIHJlZ2lzdGVycyB3aXRoIHRyYWNrZWQKKyAqIG1hdHJpY2VzIChpZiBOViBwcm9ncmFtKS4gIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIHBlcgorICogZ2xCZWdpbi9nbEVuZCwgbm90IHBlci12ZXJ0ZXguCisgKi8KK3ZvaWQKK19tZXNhX2xvYWRfdHJhY2tlZF9tYXRyaWNlcyhHTGNvbnRleHQgKmN0eCkKK3sKKyAgIEdMdWludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05WX1ZFUlRFWF9QUk9HUkFNX1BBUkFNUyAvIDQ7IGkrKykgeworICAgICAgLyogcG9pbnQgJ21hdCcgYXQgc291cmNlIG1hdHJpeCAqLworICAgICAgR0xtYXRyaXggKm1hdDsKKyAgICAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfTU9ERUxWSUVXKSB7CisgICAgICAgICBtYXQgPSBjdHgtPk1vZGVsdmlld01hdHJpeFN0YWNrLlRvcDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA9PSBHTF9QUk9KRUNUSU9OKSB7CisgICAgICAgICBtYXQgPSBjdHgtPlByb2plY3Rpb25NYXRyaXhTdGFjay5Ub3A7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfVEVYVFVSRSkgeworICAgICAgICAgbWF0ID0gY3R4LT5UZXh0dXJlTWF0cml4U3RhY2tbY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0XS5Ub3A7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfQ09MT1IpIHsKKyAgICAgICAgIG1hdCA9IGN0eC0+Q29sb3JNYXRyaXhTdGFjay5Ub3A7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV09PUdMX01PREVMVklFV19QUk9KRUNUSU9OX05WKSB7CisgICAgICAgICAvKiBYWFggdmVyaWZ5IHRoZSBjb21iaW5lZCBtYXRyaXggaXMgdXAgdG8gZGF0ZSAqLworICAgICAgICAgbWF0ID0gJmN0eC0+X01vZGVsUHJvamVjdE1hdHJpeDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA+PSBHTF9NQVRSSVgwX05WICYmCisgICAgICAgICAgICAgICBjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPD0gR0xfTUFUUklYN19OVikgeworICAgICAgICAgR0x1aW50IG4gPSBjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gLSBHTF9NQVRSSVgwX05WOworICAgICAgICAgQVNTRVJUKG4gPCBNQVhfUFJPR1JBTV9NQVRSSUNFUyk7CisgICAgICAgICBtYXQgPSBjdHgtPlByb2dyYW1NYXRyaXhTdGFja1tuXS5Ub3A7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIG5vIG1hdHJpeCBpcyB0cmFja2VkLCBidXQgd2UgbGVhdmUgdGhlIHJlZ2lzdGVyIHZhbHVlcyBhcy1pcyAqLworICAgICAgICAgYXNzZXJ0KGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA9PSBHTF9OT05FKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBsb2FkIHRoZSBtYXRyaXggdmFsdWVzIGludG8gc2VxdWVudGlhbCByZWdpc3RlcnMgKi8KKyAgICAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhUcmFuc2Zvcm1baV0gPT0gR0xfSURFTlRJVFlfTlYpIHsKKyAgICAgICAgIGxvYWRfbWF0cml4KGN0eC0+VmVydGV4UHJvZ3JhbS5QYXJhbWV0ZXJzLCBpKjQsIG1hdC0+bSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhUcmFuc2Zvcm1baV0gPT0gR0xfSU5WRVJTRV9OVikgeworICAgICAgICAgX21hdGhfbWF0cml4X2FuYWx5c2UobWF0KTsgLyogdXBkYXRlIHRoZSBpbnZlcnNlICovCisgICAgICAgICBBU1NFUlQoIV9tYXRoX21hdHJpeF9pc19kaXJ0eShtYXQpKTsKKyAgICAgICAgIGxvYWRfbWF0cml4KGN0eC0+VmVydGV4UHJvZ3JhbS5QYXJhbWV0ZXJzLCBpKjQsIG1hdC0+aW52KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFRyYW5zZm9ybVtpXSA9PSBHTF9UUkFOU1BPU0VfTlYpIHsKKyAgICAgICAgIGxvYWRfdHJhbnNwb3NlX21hdHJpeChjdHgtPlZlcnRleFByb2dyYW0uUGFyYW1ldGVycywgaSo0LCBtYXQtPm0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBhc3NlcnQoY3R4LT5WZXJ0ZXhQcm9ncmFtLlRyYWNrTWF0cml4VHJhbnNmb3JtW2ldCisgICAgICAgICAgICAgICAgPT0gR0xfSU5WRVJTRV9UUkFOU1BPU0VfTlYpOworICAgICAgICAgX21hdGhfbWF0cml4X2FuYWx5c2UobWF0KTsgLyogdXBkYXRlIHRoZSBpbnZlcnNlICovCisgICAgICAgICBBU1NFUlQoIV9tYXRoX21hdHJpeF9pc19kaXJ0eShtYXQpKTsKKyAgICAgICAgIGxvYWRfdHJhbnNwb3NlX21hdHJpeChjdHgtPlZlcnRleFByb2dyYW0uUGFyYW1ldGVycywgaSo0LCBtYXQtPmludik7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zaGFkZXIvcHJvZ19zdGF0ZXZhcnMuaCBiL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5oCmluZGV4IDBhMWMyMzUuLmQzMDkxMTQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5oCisrKyBiL3NyYy9tZXNhL3NoYWRlci9wcm9nX3N0YXRldmFycy5oCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICA2LjUuMgorICogVmVyc2lvbjogIDcuMQogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTc3LDcgKzc3LDcgQEAKICAgIFNUQVRFX1NQRUNVTEFSLAogICAgU1RBVEVfRU1JU1NJT04sCiAgICBTVEFURV9TSElOSU5FU1MsCi0gICBTVEFURV9IQUxGX1ZFQ1RPUiwJCisgICBTVEFURV9IQUxGX1ZFQ1RPUiwKIAogICAgU1RBVEVfUE9TSVRJT04sCiAgICBTVEFURV9BVFRFTlVBVElPTiwKQEAgLTk0LDcgKzk0LDcgQEAKICAgIFNUQVRFX1RFWEdFTl9PQkpFQ1RfUSwKIAogICAgU1RBVEVfVEVYRU5WX0NPTE9SLAotCQorCiAgICBTVEFURV9ERVBUSF9SQU5HRSwKIAogICAgU1RBVEVfVkVSVEVYX1BST0dSQU0sCkBAIC0xMTUsNiArMTE1LDcgQEAKICAgIFNUQVRFX1BUX0JJQVMsICAgICAgICAgICAgICAgLyoqPCBQaXhlbCB0cmFuc2ZlciBSR0JBIGJpYXMgKi8KICAgIFNUQVRFX1BDTV9TQ0FMRSwgICAgICAgICAgICAgLyoqPCBQb3N0IGNvbG9yIG1hdHJpeCBSR0JBIHNjYWxlICovCiAgICBTVEFURV9QQ01fQklBUywgICAgICAgICAgICAgIC8qKjwgUG9zdCBjb2xvciBtYXRyaXggUkdCQSBiaWFzICovCisgICBTVEFURV9TSEFET1dfQU1CSUVOVCwgICAgICAgIC8qKjwgQVJCX3NoYWRvd19hbWJpZW50IGZhaWwgdmFsdWU7IHRva2VuWzJdIGlzIHRleHR1cmUgdW5pdCBpbmRleCAqLwogICAgU1RBVEVfSU5URVJOQUxfRFJJVkVSCS8qIGZpcnN0IGF2YWlsYWJsZSBzdGF0ZSBpbmRleCBmb3IgZHJpdmVycyAobXVzdCBiZSBsYXN0KSAqLwogfSBnbF9zdGF0ZV9pbmRleDsKIApAQCAtMTMzLDQgKzEzNCw4IEBACiBfbWVzYV9wcm9ncmFtX3N0YXRlX3N0cmluZyhjb25zdCBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtTVEFURV9MRU5HVEhdKTsKIAogCitleHRlcm4gdm9pZAorX21lc2FfbG9hZF90cmFja2VkX21hdHJpY2VzKEdMY29udGV4dCAqY3R4KTsKKworCiAjZW5kaWYgLyogUFJPR19TVEFURVZBUlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc2hhZGVyL3Byb2dfdW5pZm9ybS5jIGIvc3JjL21lc2Evc2hhZGVyL3Byb2dfdW5pZm9ybS5jCmluZGV4IGY1N2RmM2QuLjI1ZDdjMDkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9wcm9nX3VuaWZvcm0uYworKysgYi9zcmMvbWVzYS9zaGFkZXIvcHJvZ191bmlmb3JtLmMKQEAgLTEzNCw4ICsxMzQsOCBAQAogICAgR0xpbnQgbWF4ID0gMDsKICAgIEdMdWludCBpOwogICAgZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgbGlzdC0+TnVtVW5pZm9ybXM7IGkrKykgewotICAgICAgR0x1aW50IGxlbiA9IF9tZXNhX3N0cmxlbihsaXN0LT5Vbmlmb3Jtc1tpXS5OYW1lKTsKLSAgICAgIGlmIChsZW4gPiAoR0x1aW50KW1heCkKKyAgICAgIEdMaW50IGxlbiA9IChHTGludClfbWVzYV9zdHJsZW4obGlzdC0+VW5pZm9ybXNbaV0uTmFtZSk7CisgICAgICBpZiAobGVuID4gbWF4KQogICAgICAgICAgbWF4ID0gbGVuOwogICAgfQogICAgcmV0dXJuIG1heDsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9wcm9ncmFtLmMgYi9zcmMvbWVzYS9zaGFkZXIvcHJvZ3JhbS5jCmluZGV4IGIwM2RkMjQuLjYyNjNmZDIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9wcm9ncmFtLmMKKysrIGIvc3JjL21lc2Evc2hhZGVyL3Byb2dyYW0uYwpAQCAtMTIxLDYgKzEyMSw0MyBAQAogCiAKIC8qKgorICogVXBkYXRlIHRoZSBkZWZhdWx0IHByb2dyYW0gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29udGV4dCB0byByZWZlcmVuY2UgdGhvc2UKKyAqIHNwZWNpZmllZCBpbiB0aGUgc2hhcmVkIHN0YXRlIGFuZCByZWxlYXNlIHRob3NlIHJlZmVyZW5jaW5nIHRoZSBvbGQKKyAqIHNoYXJlZCBzdGF0ZS4KKyAqLwordm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19wcm9ncmFtKEdMY29udGV4dCAqY3R4KQoreworI2lmIEZFQVRVUkVfTlZfdmVydGV4X3Byb2dyYW0gfHwgRkVBVFVSRV9BUkJfdmVydGV4X3Byb2dyYW0KKyAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5TaGFyZWQtPkRlZmF1bHRWZXJ0ZXhQcm9ncmFtKTsKKyAgIGFzc2VydChjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCk7CisjZW5kaWYKKworI2lmIEZFQVRVUkVfTlZfZnJhZ21lbnRfcHJvZ3JhbSB8fCBGRUFUVVJFX0FSQl9mcmFnbWVudF9wcm9ncmFtCisgICBfbWVzYV9yZWZlcmVuY2VfZnJhZ3Byb2coY3R4LCAmY3R4LT5GcmFnbWVudFByb2dyYW0uQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlNoYXJlZC0+RGVmYXVsdEZyYWdtZW50UHJvZ3JhbSk7CisgICBhc3NlcnQoY3R4LT5GcmFnbWVudFByb2dyYW0uQ3VycmVudCk7CisjZW5kaWYKKworICAgLyogWFhYIHByb2JhYmx5IG1vdmUgdGhpcyBzdHVmZiAqLworI2lmIEZFQVRVUkVfQVRJX2ZyYWdtZW50X3NoYWRlcgorICAgaWYgKGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudCkgeworICAgICAgY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50LT5SZWZDb3VudC0tOworICAgICAgaWYgKGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudC0+UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgX21lc2FfZnJlZShjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQpOworICAgICAgfQorICAgfQorICAgY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50ID0gKHN0cnVjdCBhdGlfZnJhZ21lbnRfc2hhZGVyICopIGN0eC0+U2hhcmVkLT5EZWZhdWx0RnJhZ21lbnRTaGFkZXI7CisgICBhc3NlcnQoY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50KTsKKyAgIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudC0+UmVmQ291bnQrKzsKKyNlbmRpZgorfQorCisKKy8qKgogICogU2V0IHRoZSB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSBlcnJvciBzdGF0ZSAocG9zaXRpb24gYW5kIGVycm9yIHN0cmluZykuCiAgKiBUaGlzIGlzIGdlbmVyYWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlcnMuCiAgKi8KQEAgLTIxMSw3ICsyNDgsNyBAQAogX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkKIHsKLSAgIGlmIChwcm9nKSAKKyAgIGlmIChwcm9nKQogICAgICAgcmV0dXJuIF9tZXNhX2luaXRfcHJvZ3JhbV9zdHJ1Y3QoIGN0eCwgJnByb2ctPkJhc2UsIHRhcmdldCwgaWQgKTsKICAgIGVsc2UKICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjI1LDcgKzI2Miw3IEBACiBfbWVzYV9pbml0X3ZlcnRleF9wcm9ncmFtKCBHTGNvbnRleHQgKmN0eCwgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQogewotICAgaWYgKHByb2cpIAorICAgaWYgKHByb2cpCiAgICAgICByZXR1cm4gX21lc2FfaW5pdF9wcm9ncmFtX3N0cnVjdCggY3R4LCAmcHJvZy0+QmFzZSwgdGFyZ2V0LCBpZCApOwogICAgZWxzZQogICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMzgsNyArMjc1LDcgQEAKICAqIGN0eC0+RHJpdmVyLk5ld1Byb2dyYW0uICBNYXkgYmUgb3ZlcnJpZGRlbiAoaWUuIHJlcGxhY2VkKSBieSBhCiAgKiBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBPTyBkZXJpdmlhdGlvbiB3aXRoIGFkZGl0aW9uYWwKICAqIHR5cGVzIG5vdCB1bmRlcnN0b29kIGJ5IHRoaXMgZnVuY3Rpb24uCi0gKiAKKyAqCiAgKiBccGFyYW0gY3R4ICBjb250ZXh0CiAgKiBccGFyYW0gaWQgICBwcm9ncmFtIGlkL251bWJlcgogICogXHBhcmFtIHRhcmdldCAgcHJvZ3JhbSB0YXJnZXQvdHlwZQpAQCAtMjQ3LDE5ICsyODQsMjMgQEAKIHN0cnVjdCBnbF9wcm9ncmFtICoKIF9tZXNhX25ld19wcm9ncmFtKEdMY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpCiB7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZzsKICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICBjYXNlIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQjogLyogPT0gR0xfVkVSVEVYX1BST0dSQU1fTlYgKi8KLSAgICAgIHJldHVybiBfbWVzYV9pbml0X3ZlcnRleF9wcm9ncmFtKGN0eCwgQ0FMTE9DX1NUUlVDVChnbF92ZXJ0ZXhfcHJvZ3JhbSksCisgICAgICBwcm9nID0gX21lc2FfaW5pdF92ZXJ0ZXhfcHJvZ3JhbShjdHgsIENBTExPQ19TVFJVQ1QoZ2xfdmVydGV4X3Byb2dyYW0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBpZCApOworICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlY6CiAgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCOgotICAgICAgcmV0dXJuIF9tZXNhX2luaXRfZnJhZ21lbnRfcHJvZ3JhbShjdHgsCisgICAgICBwcm9nID1fbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMT0NfU1RSVUNUKGdsX2ZyYWdtZW50X3Byb2dyYW0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGlkICk7CisgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICBfbWVzYV9wcm9ibGVtKGN0eCwgImJhZCB0YXJnZXQgaW4gX21lc2FfbmV3X3Byb2dyYW0iKTsKLSAgICAgIHJldHVybiBOVUxMOworICAgICAgcHJvZyA9IE5VTEw7CiAgICB9CisgICByZXR1cm4gcHJvZzsKIH0KIAogCkBAIC0yNzgsNyArMzE5LDcgQEAKIAogICAgaWYgKHByb2cgPT0gJl9tZXNhX0R1bW15UHJvZ3JhbSkKICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgCisKICAgIGlmIChwcm9nLT5TdHJpbmcpCiAgICAgICBfbWVzYV9mcmVlKHByb2ctPlN0cmluZyk7CiAKQEAgLTM0MSwxNSArMzgyLDE3IEBACiAKICAgICAgIC8qX2dsdGhyZWFkX0xPQ0tfTVVURVgoKCpwdHIpLT5NdXRleCk7Ki8KICNpZiAwCi0gICAgICBwcmludGYoIlByb2dyYW0gJXAgJXUgMHgleCAgUmVmY291bnQtLSB0byAlZFxuIiwKLSAgICAgICAgICAgICAqcHRyLCAoKnB0ciktPklkLCAoKnB0ciktPlRhcmdldCwgKCpwdHIpLT5SZWZDb3VudCAtIDEpOworICAgICAgcHJpbnRmKCJQcm9ncmFtICVwIElEPSV1IFRhcmdldD0lcyAgUmVmY291bnQtLSB0byAlZFxuIiwKKyAgICAgICAgICAgICAqcHRyLCAoKnB0ciktPklkLAorICAgICAgICAgICAgICgoKnB0ciktPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIgPyAiVlAiIDogIkZQIiksCisgICAgICAgICAgICAgKCpwdHIpLT5SZWZDb3VudCAtIDEpOwogI2VuZGlmCiAgICAgICBBU1NFUlQoKCpwdHIpLT5SZWZDb3VudCA+IDApOwogICAgICAgKCpwdHIpLT5SZWZDb3VudC0tOwogCiAgICAgICBkZWxldGVGbGFnID0gKCgqcHRyKS0+UmVmQ291bnQgPT0gMCk7CiAgICAgICAvKl9nbHRocmVhZF9VTkxPQ0tfTVVURVgoKCpwdHIpLT5NdXRleCk7Ki8KLSAgICAgIAorCiAgICAgICBpZiAoZGVsZXRlRmxhZykgewogICAgICAgICAgQVNTRVJUKGN0eCk7CiAgICAgICAgICBjdHgtPkRyaXZlci5EZWxldGVQcm9ncmFtKGN0eCwgKnB0cik7CkBAIC0zNjMsOCArNDA2LDEwIEBACiAgICAgICAvKl9nbHRocmVhZF9MT0NLX01VVEVYKHByb2ctPk11dGV4KTsqLwogICAgICAgcHJvZy0+UmVmQ291bnQrKzsKICNpZiAwCi0gICAgICBwcmludGYoIlByb2dyYW0gJXAgJXUgMHgleCAgUmVmY291bnQrKyB0byAlZFxuIiwKLSAgICAgICAgICAgICBwcm9nLCBwcm9nLT5JZCwgcHJvZy0+VGFyZ2V0LCBwcm9nLT5SZWZDb3VudCk7CisgICAgICBwcmludGYoIlByb2dyYW0gJXAgSUQ9JXUgVGFyZ2V0PSVzICBSZWZjb3VudCsrIHRvICVkXG4iLAorICAgICAgICAgICAgIHByb2csIHByb2ctPklkLAorICAgICAgICAgICAgIChwcm9nLT5UYXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCID8gIlZQIiA6ICJGUCIpLAorICAgICAgICAgICAgIHByb2ctPlJlZkNvdW50KTsKICNlbmRpZgogICAgICAgLypfZ2x0aHJlYWRfVU5MT0NLX01VVEVYKHByb2ctPk11dGV4KTsqLwogICAgfQpAQCAtNDAyLDYgKzQ0Nyw3IEBACiAgICBjbG9uZS0+SW5wdXRzUmVhZCA9IHByb2ctPklucHV0c1JlYWQ7CiAgICBjbG9uZS0+T3V0cHV0c1dyaXR0ZW4gPSBwcm9nLT5PdXRwdXRzV3JpdHRlbjsKICAgIGNsb25lLT5TYW1wbGVyc1VzZWQgPSBwcm9nLT5TYW1wbGVyc1VzZWQ7CisgICBjbG9uZS0+U2hhZG93U2FtcGxlcnMgPSBwcm9nLT5TaGFkb3dTYW1wbGVyczsKICAgIG1lbWNweShjbG9uZS0+VGV4dHVyZXNVc2VkLCBwcm9nLT5UZXh0dXJlc1VzZWQsIHNpemVvZihwcm9nLT5UZXh0dXJlc1VzZWQpKTsKIAogICAgaWYgKHByb2ctPlBhcmFtZXRlcnMpCkBAIC00NzEsNyArNTE3LDcgQEAKICAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgewogICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSBwcm9nLT5JbnN0cnVjdGlvbnMgKyBpOwogICAgICAgaWYgKGluc3QtPkJyYW5jaFRhcmdldCA+IDApIHsKLSAgICAgICAgIGlmICgoR0x1aW50KWluc3QtPkJyYW5jaFRhcmdldCA+PSBzdGFydCkgeworICAgICAgICAgaWYgKGluc3QtPkJyYW5jaFRhcmdldCA+PSBzdGFydCkgewogICAgICAgICAgICAgaW5zdC0+QnJhbmNoVGFyZ2V0ICs9IGNvdW50OwogICAgICAgICAgfQogICAgICAgfQpAQCAtNTA0LDYgKzU1MCw1MiBAQAogICAgcmV0dXJuIEdMX1RSVUU7CiB9CiAKKy8qKgorICogRGVsZXRlICdjb3VudCcgaW5zdHJ1Y3Rpb25zIGF0ICdzdGFydCcgaW4gdGhlIGdpdmVuIHByb2dyYW0uCisgKiBBZGp1c3QgYnJhbmNoIHRhcmdldHMgYWNjb3JkaW5nbHkuCisgKi8KK0dMYm9vbGVhbgorX21lc2FfZGVsZXRlX2luc3RydWN0aW9ucyhzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywgR0x1aW50IHN0YXJ0LCBHTHVpbnQgY291bnQpCit7CisgICBjb25zdCBHTHVpbnQgb3JpZ0xlbiA9IHByb2ctPk51bUluc3RydWN0aW9uczsKKyAgIGNvbnN0IEdMdWludCBuZXdMZW4gPSBvcmlnTGVuIC0gY291bnQ7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbmV3SW5zdDsKKyAgIEdMdWludCBpOworCisgICAvKiBhZGp1c3QgYnJhbmNoZXMgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSBwcm9nLT5JbnN0cnVjdGlvbnMgKyBpOworICAgICAgaWYgKGluc3QtPkJyYW5jaFRhcmdldCA+IDApIHsKKyAgICAgICAgIGlmIChpbnN0LT5CcmFuY2hUYXJnZXQgPj0gc3RhcnQpIHsKKyAgICAgICAgICAgIGluc3QtPkJyYW5jaFRhcmdldCAtPSBjb3VudDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogQWxsb2Mgc3RvcmFnZSBmb3IgbmV3IGluc3RydWN0aW9ucyAqLworICAgbmV3SW5zdCA9IF9tZXNhX2FsbG9jX2luc3RydWN0aW9ucyhuZXdMZW4pOworICAgaWYgKCFuZXdJbnN0KSB7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIC8qIENvcHkgJ3N0YXJ0JyBpbnN0cnVjdGlvbnMgaW50byBuZXcgaW5zdHJ1Y3Rpb24gYnVmZmVyICovCisgICBfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhuZXdJbnN0LCBwcm9nLT5JbnN0cnVjdGlvbnMsIHN0YXJ0KTsKKworICAgLyogQ29weSB0aGUgcmVtYWluaW5nL3RhaWwgaW5zdHJ1Y3Rpb25zIHRvIG5ldyBpbnN0IGJ1ZmZlciAqLworICAgX21lc2FfY29weV9pbnN0cnVjdGlvbnMobmV3SW5zdCArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy0+SW5zdHJ1Y3Rpb25zICsgc3RhcnQgKyBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlbiAtIHN0YXJ0KTsKKworICAgLyogZnJlZSBvbGQgaW5zdHJ1Y3Rpb25zICovCisgICBfbWVzYV9mcmVlX2luc3RydWN0aW9ucyhwcm9nLT5JbnN0cnVjdGlvbnMsIG9yaWdMZW4pOworCisgICAvKiBpbnN0YWxsIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIHByb2ctPkluc3RydWN0aW9ucyA9IG5ld0luc3Q7CisgICBwcm9nLT5OdW1JbnN0cnVjdGlvbnMgPSBuZXdMZW47CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCiAKIC8qKgogICogU2VhcmNoIGluc3RydWN0aW9ucyBmb3IgcmVnaXN0ZXJzIHRoYXQgbWF0Y2ggKG9sZEZpbGUsIG9sZEluZGV4KSwKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9wcm9ncmFtLmggYi9zcmMvbWVzYS9zaGFkZXIvcHJvZ3JhbS5oCmluZGV4IGY4YmQ2MzIuLjQ4MTc2MTYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9wcm9ncmFtLmgKKysrIGIvc3JjL21lc2Evc2hhZGVyL3Byb2dyYW0uaApAQCAtNTMsNiArNTMsOSBAQAogX21lc2FfZnJlZV9wcm9ncmFtX2RhdGEoR0xjb250ZXh0ICpjdHgpOwogCiBleHRlcm4gdm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19wcm9ncmFtKEdMY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIHZvaWQKIF9tZXNhX3NldF9wcm9ncmFtX2Vycm9yKEdMY29udGV4dCAqY3R4LCBHTGludCBwb3MsIGNvbnN0IGNoYXIgKnN0cmluZyk7CiAKIGV4dGVybiBjb25zdCBHTHVieXRlICoKQEAgLTYwLDEzICs2MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqbGluZSwgR0xpbnQgKmNvbCk7CiAKIAotZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtICogCi1fbWVzYV9pbml0X3ZlcnRleF9wcm9ncmFtKEdMY29udGV4dCAqY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9nLCAKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9pbml0X3ZlcnRleF9wcm9ncmFtKEdMY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnByb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CiAKLWV4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqIAotX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKEdMY29udGV4dCAqY3R4LCAKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oR0xjb250ZXh0ICpjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKIApAQCAtMTA4LDYgKzExMSw5IEBACiBleHRlcm4gIEdMYm9vbGVhbgogX21lc2FfaW5zZXJ0X2luc3RydWN0aW9ucyhzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywgR0x1aW50IHN0YXJ0LCBHTHVpbnQgY291bnQpOwogCitleHRlcm4gIEdMYm9vbGVhbgorX21lc2FfZGVsZXRlX2luc3RydWN0aW9ucyhzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywgR0x1aW50IHN0YXJ0LCBHTHVpbnQgY291bnQpOworCiBleHRlcm4gc3RydWN0IGdsX3Byb2dyYW0gKgogX21lc2FfY29tYmluZV9wcm9ncmFtcyhHTGNvbnRleHQgKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dBLApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2Rlc2NyaXAubW1zIGIvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWZiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcvZGVzY3JpcC5tbXMKQEAgLTAsMCArMSw2OCBAQAorIyBNYWtlZmlsZSBmb3IgY29yZSBsaWJyYXJ5IGZvciBWTVMKKyMgY29udHJpYnV0ZWQgYnkgSm91ayBKYW5zZW4gIGpvdWtqQGhyZW0ubmFuby50dWRlbGZ0Lm5sCisjIExhc3QgcmV2aXNpb24gOiAzIE9jdG9iZXIgMjAwNworCisuZmlyc3QKKwlkZWZpbmUgZ2wgWy0tLS0uaW5jbHVkZS5nbF0KKwlkZWZpbmUgbWF0aCBbLS0ubWF0aF0KKwlkZWZpbmUgc3dyYXN0IFstLS5zd3Jhc3RdCisJZGVmaW5lIGFycmF5X2NhY2hlIFstLS5hcnJheV9jYWNoZV0KKwlkZWZpbmUgbWFpbiBbLS0ubWFpbl0KKwlkZWZpbmUgZ2xhcGkgWy0tLmdsYXBpXQorCWRlZmluZSBzaGFkZXIgWy0tLnNoYWRlcl0KKworLmluY2x1ZGUgWy0tLS1dbW1zLWNvbmZpZy4KKworIyMjIyMgTUFDUk9TICMjIyMjCisKK1ZQQVRIID0gUkNTCisKK0lOQ0RJUiA9IFstLS0tLmluY2x1ZGVdLFstLS5tYWluXSxbLS0uZ2xhcGldLFstLnNsYW5nXSxbLS5ncmFtbWFyXSxbLV0KK0xJQkRJUiA9IFstLS0tLmxpYl0KK0NGTEFHUyA9IC9pbmNsdWRlPSgkKElOQ0RJUiksW10pL2RlZmluZT0oUFRIUkVBRFM9MSkvbmFtZT0oYXNfaXMsc2hvcnQpL2Zsb2F0PWllZWUvaWVlZT1kZW5vcm0KKworU09VUkNFUyA9IFwKKwlzbGFuZ19jb21waWxlLmMsc2xhbmdfcHJlcHJvY2Vzcy5jCisKK09CSkVDVFMgPSBzbGFuZ19idWlsdGluLm9iaixzbGFuZ19jb2RlZ2VuLm9iaixzbGFuZ19jb21waWxlLm9iaixcCisJc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5vYmosc2xhbmdfY29tcGlsZV9vcGVyYXRpb24ub2JqLFwKKwlzbGFuZ19jb21waWxlX3N0cnVjdC5vYmosc2xhbmdfY29tcGlsZV92YXJpYWJsZS5vYmosc2xhbmdfZW1pdC5vYmosXAorCXNsYW5nX2lyLm9iaixzbGFuZ19sYWJlbC5vYmosc2xhbmdfbGlicmFyeV9ub2lzZS5vYmosc2xhbmdfbGluay5vYmosXAorCXNsYW5nX2xvZy5vYmosc2xhbmdfbWVtLm9iaixzbGFuZ19wcmVwcm9jZXNzLm9iaixzbGFuZ19wcmludC5vYmosXAorCXNsYW5nX3NpbXBsaWZ5Lm9iaixzbGFuZ19zdG9yYWdlLm9iaixzbGFuZ190eXBlaW5mby5vYmosXAorCXNsYW5nX3V0aWxpdHkub2JqLHNsYW5nX3ZhcnRhYmxlLm9iagorCisjIyMjIyBSVUxFUyAjIyMjIworCitWRVJTSU9OPU1lc2EgVjMuNAorCisjIyMjIyBUQVJHRVRTICMjIyMjCisjIE1ha2UgdGhlIGxpYnJhcnkKKyQoTElCRElSKSQoR0xfTElCKSA6ICQoT0JKRUNUUykKKyAgQCBsaWJyYXJ5ICQoTElCRElSKSQoR0xfTElCKSAkKE9CSkVDVFMpCisKK2NsZWFuIDoKKwlwdXJnZQorCWRlbGV0ZSAqLm9iajsqCisKK3NsYW5nX2J1aWx0aW4ub2JqIDogc2xhbmdfYnVpbHRpbi5jCitzbGFuZ19jb2RlZ2VuLm9iaiA6IHNsYW5nX2NvZGVnZW4uYworc2xhbmdfY29tcGlsZS5vYmogOiBzbGFuZ19jb21waWxlLmMKK3NsYW5nX2NvbXBpbGVfZnVuY3Rpb24ub2JqIDogc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5jCitzbGFuZ19jb21waWxlX29wZXJhdGlvbi5vYmogOiBzbGFuZ19jb21waWxlX29wZXJhdGlvbi5jCitzbGFuZ19jb21waWxlX3N0cnVjdC5vYmogOiBzbGFuZ19jb21waWxlX3N0cnVjdC5jCitzbGFuZ19jb21waWxlX3ZhcmlhYmxlLm9iaiA6IHNsYW5nX2NvbXBpbGVfdmFyaWFibGUuYworc2xhbmdfZW1pdC5vYmogOiBzbGFuZ19lbWl0LmMKK3NsYW5nX2lyLm9iaiA6IHNsYW5nX2lyLmMKK3NsYW5nX2xhYmVsLm9iaiA6IHNsYW5nX2xhYmVsLmMKK3NsYW5nX2xpYnJhcnlfbm9pc2Uub2JqIDogc2xhbmdfbGlicmFyeV9ub2lzZS5jCitzbGFuZ19saW5rLm9iaiA6IHNsYW5nX2xpbmsuYworc2xhbmdfbG9nLm9iaiA6IHNsYW5nX2xvZy5jCitzbGFuZ19tZW0ub2JqIDogc2xhbmdfbWVtLmMKK3NsYW5nX3ByZXByb2Nlc3Mub2JqIDogc2xhbmdfcHJlcHJvY2Vzcy5jCitzbGFuZ19wcmludC5vYmogOiBzbGFuZ19wcmludC5jCitzbGFuZ19zaW1wbGlmeS5vYmogOiBzbGFuZ19zaW1wbGlmeS5jCitzbGFuZ19zdG9yYWdlLm9iaiA6IHNsYW5nX3N0b3JhZ2UuYworc2xhbmdfdHlwZWluZm8ub2JqIDogc2xhbmdfdHlwZWluZm8uYworc2xhbmdfdXRpbGl0eS5vYmogOiBzbGFuZ191dGlsaXR5LmMKK3NsYW5nX3ZhcnRhYmxlLm9iaiA6IHNsYW5nX3ZhcnRhYmxlLmMKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5L3NsYW5nX3BwX2RpcmVjdGl2ZXMuc3luIGIvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2xpYnJhcnkvc2xhbmdfcHBfZGlyZWN0aXZlcy5zeW4Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2xpYnJhcnkvc2xhbmdfcHBfZXhwcmVzc2lvbi5zeW4gYi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcvbGlicmFyeS9zbGFuZ19wcF9leHByZXNzaW9uLnN5bgpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zaGFkZXIvc2xhbmcvbGlicmFyeS9zbGFuZ192ZXJzaW9uLnN5biBiL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5L3NsYW5nX3ZlcnNpb24uc3luCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5L3NsYW5nX3ZlcnRleF9idWlsdGluX2djLmggYi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcvbGlicmFyeS9zbGFuZ192ZXJ0ZXhfYnVpbHRpbl9nYy5oCmluZGV4IDYzZDMzYWYuLjFhMDhhNTQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9saWJyYXJ5L3NsYW5nX3ZlcnRleF9idWlsdGluX2djLmgKKysrIGIvc3JjL21lc2Evc2hhZGVyL3NsYW5nL2xpYnJhcnkvc2xhbmdfdmVydGV4X2J1aWx0aW5fZ2MuaApAQCAtMjAsODEgKzIwLDc1IEBACiAwLDIsMiwzLDAsMTIsMSwxMDMsMTA4LDk1LDg0LDEwMSwxMjAsNjcsMTExLDExMSwxMTQsMTAwLDAsMywxOCwxMDMsMTA4LDk1LDc3LDk3LDEyMCw4NCwxMDEsMTIwLDExNiwKIDExNywxMTQsMTAxLDY3LDExMSwxMTEsMTE0LDEwMCwxMTUsMCwwLDAsMiwyLDMsMCw5LDEsMTAzLDEwOCw5NSw3MCwxMTEsMTAzLDcwLDExNCw5NywxMDMsNjcsMTExLAogMTExLDExNCwxMDAsMCwwLDAsMSwwLDAsMTIsMCwxMDIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMTEsMTE0LDEwOSwwLDAsMSw5LDE4LDk1LDk1LDExNCwxMDEsMTE2LAotODYsOTcsMTA4LDAsMTgsMTAzLDEwOCw5NSw3NywxMTEsMTAwLDEwMSwxMDgsODYsMTA1LDEwMSwxMTksODAsMTE0LDExMSwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwKLTc3LDk3LDExNiwxMTQsMTA1LDEyMCwwLDE2LDgsNDgsMCw1NywxOCwxMDMsMTA4LDk1LDg2LDEwMSwxMTQsMTE2LDEwMSwxMjAsMCw1OSwxMjAsMTIwLDEyMCwxMjAsMCwKLTQ4LDE4LDEwMywxMDgsOTUsNzcsMTExLDEwMCwxMDEsMTA4LDg2LDEwNSwxMDEsMTE5LDgwLDExNCwxMTEsMTA2LDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsNzcsOTcsMTE2LAotMTE0LDEwNSwxMjAsMCwxNiwxMCw0OSwwLDU3LDE4LDEwMywxMDgsOTUsODYsMTAxLDExNCwxMTYsMTAxLDEyMCwwLDU5LDEyMSwxMjEsMTIxLDEyMSwwLDQ4LDQ2LDE4LAotMTAzLDEwOCw5NSw3NywxMTEsMTAwLDEwMSwxMDgsODYsMTA1LDEwMSwxMTksODAsMTE0LDExMSwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCw3Nyw5NywxMTYsMTE0LAotMTA1LDEyMCwwLDE2LDEwLDUwLDAsNTcsMTgsMTAzLDEwOCw5NSw4NiwxMDEsMTE0LDExNiwxMDEsMTIwLDAsNTksMTIyLDEyMiwxMjIsMTIyLDAsNDgsNDYsMTgsMTAzLAotMTA4LDk1LDc3LDExMSwxMDAsMTAxLDEwOCw4NiwxMDUsMTAxLDExOSw4MCwxMTQsMTExLDEwNiwxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDc3LDk3LDExNiwxMTQsMTA1LAotMTIwLDAsMTYsMTAsNTEsMCw1NywxOCwxMDMsMTA4LDk1LDg2LDEwMSwxMTQsMTE2LDEwMSwxMjAsMCw1OSwxMTksMTE5LDExOSwxMTksMCw0OCw0NiwyMCwwLDAsMSwwLDAsCi0xMiwwLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw0OSw2OCw3NiwxMTEsMTAwLDAsMSwxLDAsMTYsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLAotOSw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLDEsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDksMTgsCi05OSwxMTEsMTExLDExNCwxMDAsNTIsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTE5LAotMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDQ5LDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwKLTAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTYsMTAxLDEyMCwxMTYsCi0xMTcsMTE0LDEwMSw0OSw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMTYsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEwLDk5LAotMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsOSwxOCwxMTIsCi05OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjEsMCw0OSwKLTIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LDAsMTgsMTA4LDExMSwxMDAsMCwyMCwwLDQsMTE4LDEwMSw5OSw1Miw5NSwxMTYsMTAxLDEyMCwKLTk4LDQ5LDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwwLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDE4LDExMiw5OSwxMTEsMTExLAotMTE0LDEwMCwwLDAsMCwwLDEsMCwwLDEyLDAsMTE2LDEwMSwxMjAsMTE2LDExNywxMTQsMTAxLDQ5LDY4LDgwLDExNCwxMTEsMTA2LDc2LDExMSwxMDAsMCwxLDEsMCwxNiwKLTExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLAotMTIsMSwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLAotNTksMTIwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsNDksMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMTksMCwxOCwxMDgsCi0xMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNDksMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwKLTExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTYsMTAxLDEyMCwxMTYsMTE3LAotMTE0LDEwMSw1MCw2OCw3NiwxMTEsMTAwLDAsMSwxLDAsMTcsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEwLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsCi0xLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCw5LDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLAotNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwxMjEsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTE5LDAsMTgsCi0xMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUwLDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwwLDAsCi0xOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTYsMTAxLDEyMCwxMTYsMTE3LAotMTE0LDEwMSw1MCw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMTcsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDExLDk5LDExMSwKLTExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsOSwxOCwxMTIsOTksCi0xMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMiwKLTAsNDksMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsCi0xMjAsOTgsNTAsMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsMTEyLDk5LDExMSwKLTExMSwxMTQsMTAwLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTYsMTAxLDEyMCwxMTYsMTE3LDExNCwxMDEsNTAsNjgsODAsMTE0LDExMSwxMDYsNzYsMTExLDEwMCwwLDEsMSwwLAotMTcsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMSwxLDAsOSwxMDgsMTExLDEwMCwwLDAsMCwxLDMsMiwKLTAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LAotMTAwLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMiwwLDQ5LDIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LDAsCi0xOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUwLDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwwLAotMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCwwLDEsMCwwLDEyLDAsMTE2LDEwMSwxMjAsMTE2LAotMTE3LDExNCwxMDEsNTEsNjgsNzYsMTExLDEwMCwwLDEsMSwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMSw5OSwxMTEsMTExLDExNCwxMDAsCi0wLDAsMSwxLDAsOSwxMDgsMTExLDEwMCwwLDAsMCwxLDMsMiwwLDAsMTIsMSw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCwwLDAsOSwxOCw5OSwxMTEsMTExLDExNCwxMDAsCi01MiwwLDU5LDEyMCwxMjEsMTIyLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDEyMSwxMjIsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsCi01OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUxLDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LAotOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTYsMTAxLAotMTIwLDExNiwxMTcsMTE0LDEwMSw1MSw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwKLTAsMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsCi05LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDEyMiwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwxMjEsMTIyLDAsMTgsOTksMTExLAotMTExLDExNCwxMDAsMCw1OSwxMTksMCw0OSwyMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwKLTEwMSw5OSw1Miw5NSwxMTYsMTAxLDEyMCw5OCw1MSwxMDAsMCwxOCw5NSw5NSwxMTQsMTAxLDExNiw4Niw5NywxMDgsMCwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsCi0xMTQsMCwwLDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsMCwxLDAsMCwxMiwwLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw2NywxMTcsOTgsMTAxLDc2LAotMTExLDEwMCwwLDEsMSwwLDE5LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMSw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwKLTEwMCwwLDAsMCwxLDMsMiwwLDAsMTIsMSw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCwwLDAsOSwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCw1OSwxMjAsMTIxLDEyMiwwLAotMTgsOTksMTExLDExMSwxMTQsMTAwLDAsMjAsMCw5LDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsCi05OSw1Miw5NSwxMTYsMTAxLDEyMCw5OSwxMTcsOTgsMTAxLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLAotMTE0LDAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCwwLDAsMCwxLDAsMCwxMiwwLDExNSwxMDQsOTcsMTAwLDExMSwxMTksNDksNjgsNzYsMTExLDEwMCwwLDEsMSwKLTAsMjAsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDExLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMSwxLDAsOSwxMDgsMTExLDEwMCwwLDAsMCwxLDMsCi0yLDAsMCwxMiwxLDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCw5LDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDU5LDEyMCwxMjEsMTIyLDAsMTgsOTksMTExLDExMSwKLTExNCwxMDAsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTE5LDAsMTgsMTA4LDExMSwxMDAsMCwyMCwwLDQsMTE4LDEwMSw5OSw1Miw5NSwxMTYsCi0xMDEsMTIwLDk4LDQ5LDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwwLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDE4LDk5LDExMSwKLTExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsMCwxMTUsMTA0LDk3LDEwMCwxMTEsMTE5LDQ5LDY4LDgwLDExNCwxMTEsMTA2LDc2LDExMSwxMDAsMCwxLDEsMCwKLTIwLDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsCi0wLDAsMTIsMSwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwKLTAsNTksMTIwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LDAsNDksMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjIsMCwxOCw5OSwKLTExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMiwwLDIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LDAsMTgsMTA4LDExMSwxMDAsMCwyMCwwLDQsMTE4LAorODYsOTcsMTA4LDAsMTgsMTAzLDEwOCw5NSw4NiwxMDEsMTE0LDExNiwxMDEsMTIwLDAsMTgsMTAzLDEwOCw5NSw3NywxMTEsMTAwLDEwMSwxMDgsODYsMTA1LDEwMSwxMTksCis4MCwxMTQsMTExLDEwNiwxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDc3LDk3LDExNiwxMTQsMTA1LDEyMCw4NCwxMTQsOTcsMTEwLDExNSwxMTIsMTExLDExNSwxMDEsMCw0OCwKKzIwLDAsMCwxLDAsMCwxMiwwLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw0OSw2OCw3NiwxMTEsMTAwLDAsMSwxLDAsMTYsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwKKzExNCwwLDAsMSwxLDAsOSw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLDEsOTksMTExLDExMSwxMTQsMTAwLAorNTIsMCwwLDAsOSwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsCisxMDAsNTIsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDQ5LDEwMCwwLDE4LDk1LDk1LDExNCwKKzEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsCiswLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw0OSw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMTYsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwKKzExNCwwLDAsMSwxLDAsMTAsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLAorMTE0LDEwMCwwLDAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsCisxMTEsMTE0LDEwMCwwLDU5LDEyMSwwLDQ5LDIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LDAsMTgsMTA4LDExMSwxMDAsMCwyMCwwLDQsMTE4LAogMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDQ5LDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LDEwOCwwLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwKLTExNCwwLDAsMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCwwLDEsMCwwLDEyLDAsMTE1LDEwNCw5NywxMDAsMTExLDExOSw1MCw2OCw3NiwxMTEsMTAwLDAsMSwxLAotMCwyMSwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMSwxLDAsMTEsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywKLTIsMCwwLDEyLDEsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTIwLDEyMSwxMjIsMCwxOCw5OSwxMTEsMTExLAotMTE0LDEwMCwwLDIwLDAsOSwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwKLTEwMSwxMjAsOTgsNTAsMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLAotMTExLDExNCwxMDAsNTIsMCwwLDAsMCwxLDAsMCwxMiwwLDExNSwxMDQsOTcsMTAwLDExMSwxMTksNTAsNjgsODAsMTE0LDExMSwxMDYsNzYsMTExLDEwMCwwLDEsMSwwLAotMjEsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMSwxLDAsOSwxMDgsMTExLDEwMCwwLDAsMCwxLDMsMiwKLTAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LAotMTAwLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDExOSwwLDQ5LDIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsCi0xOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjIsMCwyMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCwKKzExNCwwLDAsMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCwwLDEsMCwwLDEyLDAsMTE2LDEwMSwxMjAsMTE2LDExNywxMTQsMTAxLDQ5LDY4LDgwLDExNCwxMTEsCisxMDYsNzYsMTExLDEwMCwwLDEsMSwwLDE2LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksCisxMDgsMTExLDEwMCwwLDAsMCwxLDMsMiwwLDAsMTIsMSwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwKKzAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsNDksMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLAorMTE0LDEwMCwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNDksMTAwLDAsMTgsOTUsOTUsMTE0LAorMTAxLDExNiw4Niw5NywxMDgsMCwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDAsMSwwLDAsMTIsCiswLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw1MCw2OCw3NiwxMTEsMTAwLDAsMSwxLDAsMTcsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEwLAorOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCw5LDE4LAorOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTIwLDEyMSwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwxMjEsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsCisxMDAsNTIsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUwLDEwMCwwLDE4LDk1LDk1LDExNCwKKzEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDAsMSwwLDAsMTIsCiswLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw1MCw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMTcsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwKKzExNCwwLDAsMSwxLDAsMTEsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLAorMTE0LDEwMCwwLDAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIwLDEyMSwwLDE4LAorOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsNDksMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsCiA0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNTAsMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwKLTEwOCwxMDEsMTE0LDAsMCwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDAsMAorMTA4LDEwMSwxMTQsMCwwLDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsMCwxLDAsMCwxMiwwLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw1MCw2OCw4MCwKKzExNCwxMTEsMTA2LDc2LDExMSwxMDAsMCwxLDEsMCwxNywxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMSwxLDAsMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLAorMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLDEsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwKKzU5LDEyMCwxMjEsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsNDksMjAsMCw5LDE4LAorMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNTAsMTAwLDAsCisxOCw5NSw5NSwxMTQsMTAxLDExNiw4Niw5NywxMDgsMCwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwKKzAsMCwxLDAsMCwxMiwwLDExNiwxMDEsMTIwLDExNiwxMTcsMTE0LDEwMSw1MSw2OCw3NiwxMTEsMTAwLDAsMSwxLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsCiswLDAsMSwxLDAsMTEsOTksMTExLDExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDk5LDExMSwxMTEsMTE0LDEwMCw1MiwKKzAsMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTIwLDEyMSwxMjIsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDEyMiwwLDIwLDAsCis5LDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNTEsCisxMDAsMCwxOCw5NSw5NSwxMTQsMTAxLDExNiw4Niw5NywxMDgsMCwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsCis1MiwwLDAsMCwwLDEsMCwwLDEyLDAsMTE2LDEwMSwxMjAsMTE2LDExNywxMTQsMTAxLDUxLDY4LDgwLDExNCwxMTEsMTA2LDc2LDExMSwxMDAsMCwxLDEsMCwxOCwxMTUsCis5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLAorMSwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwxMjEsMTIyLDAsMTgsOTksMTExLDExMSwxMTQsCisxMDAsMCw1OSwxMjAsMTIxLDEyMiwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDExOSwwLDQ5LDIwLDAsOSwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksCisxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUxLDEwMCwwLDE4LDk1LDk1LDExNCwxMDEsMTE2LDg2LDk3LAorMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCwwLDEsMCwwLDEyLDAsMTE2LDEwMSwxMjAsCisxMTYsMTE3LDExNCwxMDEsNjcsMTE3LDk4LDEwMSw3NiwxMTEsMTAwLDAsMSwxLDAsMTksMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDExLDk5LDExMSwKKzExMSwxMTQsMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCw5LDE4LDk5LDExMSwKKzExMSwxMTQsMTAwLDUyLDAsNTksMTIwLDEyMSwxMjIsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCwyMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsNTksMTE5LAorMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk5LDExNyw5OCwxMDEsMCwxOCw5NSw5NSwxMTQsMTAxLDExNiw4Niw5NywKKzEwOCwwLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCwwLDEsMCwwLDEyLDAsMTE1LDEwNCw5NywKKzEwMCwxMTEsMTE5LDQ5LDY4LDc2LDExMSwxMDAsMCwxLDEsMCwyMCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMSwxLDAsMTEsOTksMTExLDExMSwxMTQsMTAwLAorMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLDEsOTksMTExLDExMSwxMTQsMTAwLDUyLDAsMCwwLDksMTgsOTksMTExLDExMSwxMTQsMTAwLAorNTIsMCw1OSwxMjAsMTIxLDEyMiwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDIwLDAsOSwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCw1OSwxMTksMCwxOCwxMDgsCisxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNDksMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwKKzExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCwwLDAsMCwxLDAsMCwxMiwwLDExNSwxMDQsOTcsMTAwLDExMSwxMTksCis0OSw2OCw4MCwxMTQsMTExLDEwNiw3NiwxMTEsMTAwLDAsMSwxLDAsMjAsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDEsMSwwLDEyLDk5LDExMSwxMTEsMTE0LAorMTAwLDAsMCwxLDEsMCw5LDEwOCwxMTEsMTAwLDAsMCwwLDEsMywyLDAsMCwxMiwxLDExMiw5OSwxMTEsMTExLDExNCwxMDAsMCwwLDAsOSwxOCwxMTIsOTksMTExLDExMSwKKzExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMTksMCw0OSwyMCwwLDksMTgsCisxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTIyLDAsMjAsMCw5LDE4LDExMiw5OSwxMTEsMTExLDExNCwKKzEwMCwwLDU5LDExOSwwLDE4LDEwOCwxMTEsMTAwLDAsMjAsMCw0LDExOCwxMDEsOTksNTIsOTUsMTE2LDEwMSwxMjAsOTgsNDksMTAwLDAsMTgsOTUsOTUsMTE0LDEwMSwKKzExNiw4Niw5NywxMDgsMCwwLDE4LDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxOCwxMTIsOTksMTExLDExMSwxMTQsMTAwLDAsMCwwLDAsMSwwLDAsMTIsMCwKKzExNSwxMDQsOTcsMTAwLDExMSwxMTksNTAsNjgsNzYsMTExLDEwMCwwLDEsMSwwLDIxLDExNSw5NywxMDksMTEyLDEwOCwxMDEsMTE0LDAsMCwxLDEsMCwxMSw5OSwxMTEsCisxMTEsMTE0LDEwMCwwLDAsMSwxLDAsOSwxMDgsMTExLDEwMCwwLDAsMCwxLDMsMiwwLDAsMTIsMSw5OSwxMTEsMTExLDExNCwxMDAsNTIsMCwwLDAsOSwxOCw5OSwxMTEsCisxMTEsMTE0LDEwMCw1MiwwLDU5LDEyMCwxMjEsMTIyLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsMjAsMCw5LDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDU5LDExOSwKKzAsMTgsMTA4LDExMSwxMDAsMCwyMCwwLDQsMTE4LDEwMSw5OSw1Miw5NSwxMTYsMTAxLDEyMCw5OCw1MCwxMDAsMCwxOCw5NSw5NSwxMTQsMTAxLDExNiw4Niw5NywxMDgsCiswLDAsMTgsMTE1LDk3LDEwOSwxMTIsMTA4LDEwMSwxMTQsMCwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCw1MiwwLDAsMCwwLDEsMCwwLDEyLDAsMTE1LDEwNCw5NywxMDAsCisxMTEsMTE5LDUwLDY4LDgwLDExNCwxMTEsMTA2LDc2LDExMSwxMDAsMCwxLDEsMCwyMSwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMSwxLDAsMTIsOTksMTExLAorMTExLDExNCwxMDAsMCwwLDEsMSwwLDksMTA4LDExMSwxMDAsMCwwLDAsMSwzLDIsMCwwLDEyLDEsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCw5LDE4LDExMiw5OSwKKzExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMCwxMjEsMCwxOCw5OSwxMTEsMTExLDExNCwxMDAsMCw1OSwxMjAsMTIxLDAsMTgsOTksMTExLDExMSwxMTQsMTAwLDAsNTksMTE5LAorMCw0OSwyMCwwLDksMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMiwwLDE4LDk5LDExMSwxMTEsMTE0LDEwMCwwLDU5LDEyMiwwLDIwLDAsOSwxOCwxMTIsOTksCisxMTEsMTExLDExNCwxMDAsMCw1OSwxMTksMCwxOCwxMDgsMTExLDEwMCwwLDIwLDAsNCwxMTgsMTAxLDk5LDUyLDk1LDExNiwxMDEsMTIwLDk4LDUwLDEwMCwwLDE4LDk1LAorOTUsMTE0LDEwMSwxMTYsODYsOTcsMTA4LDAsMCwxOCwxMTUsOTcsMTA5LDExMiwxMDgsMTAxLDExNCwwLDAsMTgsMTEyLDk5LDExMSwxMTEsMTE0LDEwMCwwLDAsMCwwLDAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3NoYWRlci9zbGFuZy9zb3VyY2VzIGIvc3JjL21lc2Evc2hhZGVyL3NsYW5nL3NvdXJjZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDYxN2YuLjAwMDAwMDAKLS0tIGEvc3JjL21lc2Evc2hhZGVyL3NsYW5nL3NvdXJjZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NRVNBX1NIQURFUl9TTEFOR19TT1VSQ0VTID0gXAotc2xhbmdfYW5hbHlzZS5jIFwKLXNsYW5nX2Fzc2VtYmxlX2Fzc2lnbm1lbnQuYyBcCi1zbGFuZ19hc3NlbWJsZS5jIFwKLXNsYW5nX2Fzc2VtYmxlX2NvbmRpdGlvbmFsLmMgXAotc2xhbmdfYXNzZW1ibGVfY29uc3RydWN0b3IuYyBcCi1zbGFuZ19hc3NlbWJsZV90eXBlaW5mby5jIFwKLXNsYW5nX2NvbXBpbGUuYyBcCi1zbGFuZ19jb21waWxlX2Z1bmN0aW9uLmMgXAotc2xhbmdfY29tcGlsZV9vcGVyYXRpb24uYyBcCi1zbGFuZ19jb21waWxlX3N0cnVjdC5jIFwKLXNsYW5nX2NvbXBpbGVfdmFyaWFibGUuYyBcCi1zbGFuZ19leGVjdXRlLmMgXAotc2xhbmdfZXhlY3V0ZV94ODYuYyBcCi1zbGFuZ19leHBvcnQuYyBcCi1zbGFuZ19saWJyYXJ5X3RleHNhbXBsZS5jIFwKLXNsYW5nX2xpYnJhcnlfbm9pc2UuYyBcCi1zbGFuZ19saW5rLmMgXAotc2xhbmdfcHJlcHJvY2Vzcy5jIFwKLXNsYW5nX3N0b3JhZ2UuYyBcCi1zbGFuZ191dGlsaXR5LmMKLQotTUVTQV9TSEFERVJfU0xBTkdfSEVBREVSUyA9IFwKLXNsYW5nX2FuYWx5c2UuaCBcCi1zbGFuZ19hc3NlbWJsZS5oIFwKLXNsYW5nX2Fzc2VtYmxlX2Fzc2lnbm1lbnQuaCBcCi1zbGFuZ19hc3NlbWJsZV9jb25kaXRpb25hbC5oIFwKLXNsYW5nX2Fzc2VtYmxlX2NvbnN0cnVjdG9yLmggXAotc2xhbmdfYXNzZW1ibGVfdHlwZWluZm8uaCBcCi1zbGFuZ19jb21waWxlLmggXAotc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5oIFwKLXNsYW5nX2NvbXBpbGVfb3BlcmF0aW9uLmggXAotc2xhbmdfY29tcGlsZV9zdHJ1Y3QuaCBcCi1zbGFuZ19jb21waWxlX3ZhcmlhYmxlLmggXAotc2xhbmdfZXhlY3V0ZS5oIFwKLXNsYW5nX2V4cG9ydC5oIFwKLXNsYW5nX2xpYnJhcnlfbm9pc2UuaCBcCi1zbGFuZ19saWJyYXJ5X3RleHNhbXBsZS5oIFwKLXNsYW5nX2xpbmsuaCBcCi1zbGFuZ19tZXNhLmggXAotc2xhbmdfcHJlcHJvY2Vzcy5oIFwKLXNsYW5nX3N0b3JhZ2UuaCBcCi1zbGFuZ191dGlsaXR5LmggXAotdHJhdmVyc2Vfd3JhcC5oCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zaGFkZXIvc291cmNlcyBiL3NyYy9tZXNhL3NoYWRlci9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg3MTg3Li4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL3NoYWRlci9zb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBMaXN0IG9mIHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB1c2VkIGZvciBYLm9yZyB4c2VydmVyIGJ1aWxkCi1NRVNBX1NIQURFUl9TT1VSQ0VTID0gXAotYXJicHJvZ3BhcnNlLmMgXAotYXJicHJvZ3JhbS5jIFwKLWF0aWZyYWdzaGFkZXIuYyBcCi1udmZyYWdwYXJzZS5jIFwKLW52cHJvZ3JhbS5jIFwKLW52dmVydGV4ZWMuYyBcCi1udnZlcnRwYXJzZS5jIFwKLXByb2dyYW0uYyBcCi1wcm9ncmFtb3B0LmMgXAotc2hhZGVyb2JqZWN0cy5jIFwKLXNoYWRlcm9iamVjdHNfM2RsYWJzLmMKLQotTUVTQV9TSEFERVJfSEVBREVSUyA9IFwKLWFyYnByb2dwYXJzZS5oIFwKLWFyYnByb2dyYW0uaCBcCi1hcmJwcm9ncmFtX3N5bi5oIFwKLWF0aWZyYWdzaGFkZXIuaCBcCi1udmZyYWdwYXJzZS5oIFwKLW52cHJvZ3JhbS5oIFwKLW52dmVydGV4ZWMuaCBcCi1udnZlcnRwYXJzZS5oIFwKLXByb2dyYW1vcHQuaCBcCi1wcm9ncmFtLmggXAotcHJvZ3JhbV9pbnN0cnVjdGlvbi5oIFwKLXNoYWRlcm9iamVjdHMuaCBcCi1zaGFkZXJvYmplY3RzXzNkbGFicy5oCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zb3VyY2VzIGIvc3JjL21lc2Evc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIxODQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2Evc291cmNlcwpAQCAtMCwwICsxLDI5NiBAQAorIyMjIExpc3RzIG9mIHNvdXJjZSBmaWxlcywgaW5jbHVkZWQgYnkgTWFrZWZpbGVzCisKK01BSU5fU09VUkNFUyA9IFwKKwltYWluL2FwaV9hcnJheWVsdC5jIFwKKwltYWluL2FwaV9sb29wYmFjay5jIFwKKwltYWluL2FwaV9ub29wLmMgXAorCW1haW4vYXBpX3ZhbGlkYXRlLmMgXAorCW1haW4vYWNjdW0uYyBcCisJbWFpbi9hdHRyaWIuYyBcCisJbWFpbi9hcnJheW9iai5jIFwKKwltYWluL2JsZW5kLmMgXAorCW1haW4vYnVmZmVyb2JqLmMgXAorCW1haW4vYnVmZmVycy5jIFwKKwltYWluL2NsaXAuYyBcCisJbWFpbi9jb2xvcnRhYi5jIFwKKwltYWluL2NvbnRleHQuYyBcCisJbWFpbi9jb252b2x2ZS5jIFwKKwltYWluL2RlYnVnLmMgXAorCW1haW4vZGVwdGguYyBcCisJbWFpbi9kZXB0aHN0ZW5jaWwuYyBcCisJbWFpbi9kbGlzdC5jIFwKKwltYWluL2RyYXdwaXguYyBcCisJbWFpbi9lbmFibGUuYyBcCisJbWFpbi9lbnVtcy5jIFwKKwltYWluL2V2YWwuYyBcCisJbWFpbi9leGVjbWVtLmMgXAorCW1haW4vZXh0ZW5zaW9ucy5jIFwKKwltYWluL2Zib2JqZWN0LmMgXAorCW1haW4vZmVlZGJhY2suYyBcCisJbWFpbi9mb2cuYyBcCisJbWFpbi9mcmFtZWJ1ZmZlci5jIFwKKwltYWluL2dldC5jIFwKKwltYWluL2dldHN0cmluZy5jIFwKKwltYWluL2hhc2guYyBcCisJbWFpbi9oaW50LmMgXAorCW1haW4vaGlzdG9ncmFtLmMgXAorCW1haW4vaW1hZ2UuYyBcCisJbWFpbi9pbXBvcnRzLmMgXAorCW1haW4vbGlnaHQuYyBcCisJbWFpbi9saW5lcy5jIFwKKwltYWluL21hdHJpeC5jIFwKKwltYWluL21pcG1hcC5jIFwKKwltYWluL21tLmMgXAorCW1haW4vcGl4ZWwuYyBcCisJbWFpbi9wb2ludHMuYyBcCisJbWFpbi9wb2x5Z29uLmMgXAorCW1haW4vcXVlcnlvYmouYyBcCisJbWFpbi9yYXN0cG9zLmMgXAorCW1haW4vcmJhZGFwdG9ycy5jIFwKKwltYWluL3JlbmRlcmJ1ZmZlci5jIFwKKwltYWluL3NoYWRlcnMuYyBcCisJbWFpbi9zdGF0ZS5jIFwKKwltYWluL3N0ZW5jaWwuYyBcCisJbWFpbi90ZXhjb21wcmVzcy5jIFwKKwltYWluL3RleGNvbXByZXNzX3MzdGMuYyBcCisJbWFpbi90ZXhjb21wcmVzc19meHQxLmMgXAorCW1haW4vdGV4ZW52cHJvZ3JhbS5jIFwKKwltYWluL3RleGZvcm1hdC5jIFwKKwltYWluL3RleGltYWdlLmMgXAorCW1haW4vdGV4b2JqLmMgXAorCW1haW4vdGV4cmVuZGVyLmMgXAorCW1haW4vdGV4c3RhdGUuYyBcCisJbWFpbi90ZXhzdG9yZS5jIFwKKwltYWluL3ZhcnJheS5jIFwKKwltYWluL3Z0eGZtdC5jCisKK0dMQVBJX1NPVVJDRVMgPSBcCisJbWFpbi9kaXNwYXRjaC5jIFwKKwlnbGFwaS9nbGFwaS5jIFwKKwlnbGFwaS9nbHRocmVhZC5jCisKK01BVEhfU09VUkNFUyA9IFwKKwltYXRoL21fZGVidWdfY2xpcC5jIFwKKwltYXRoL21fZGVidWdfbm9ybS5jIFwKKwltYXRoL21fZGVidWdfeGZvcm0uYyBcCisJbWF0aC9tX2V2YWwuYyBcCisJbWF0aC9tX21hdHJpeC5jIFwKKwltYXRoL21fdHJhbnNsYXRlLmMgXAorCW1hdGgvbV92ZWN0b3IuYyBcCisJbWF0aC9tX3hmb3JtLmMKKworU1dSQVNUX1NPVVJDRVMgPSBcCisJc3dyYXN0L3NfYWFsaW5lLmMgXAorCXN3cmFzdC9zX2FhdHJpYW5nbGUuYyBcCisJc3dyYXN0L3NfYWNjdW0uYyBcCisJc3dyYXN0L3NfYWxwaGEuYyBcCisJc3dyYXN0L3NfYXRpZnJhZ3NoYWRlci5jIFwKKwlzd3Jhc3Qvc19iaXRtYXAuYyBcCisJc3dyYXN0L3NfYmxlbmQuYyBcCisJc3dyYXN0L3NfYmxpdC5jIFwKKwlzd3Jhc3Qvc19idWZmZXJzLmMgXAorCXN3cmFzdC9zX2NvcHlwaXguYyBcCisJc3dyYXN0L3NfY29udGV4dC5jIFwKKwlzd3Jhc3Qvc19kZXB0aC5jIFwKKwlzd3Jhc3Qvc19kcmF3cGl4LmMgXAorCXN3cmFzdC9zX2ZlZWRiYWNrLmMgXAorCXN3cmFzdC9zX2ZvZy5jIFwKKwlzd3Jhc3Qvc19mcmFncHJvZy5jIFwKKwlzd3Jhc3Qvc19pbWFnaW5nLmMgXAorCXN3cmFzdC9zX2xpbmVzLmMgXAorCXN3cmFzdC9zX2xvZ2ljLmMgXAorCXN3cmFzdC9zX21hc2tpbmcuYyBcCisJc3dyYXN0L3NfcG9pbnRzLmMgXAorCXN3cmFzdC9zX3JlYWRwaXguYyBcCisJc3dyYXN0L3Nfc3Bhbi5jIFwKKwlzd3Jhc3Qvc19zdGVuY2lsLmMgXAorCXN3cmFzdC9zX3RleGNvbWJpbmUuYyBcCisJc3dyYXN0L3NfdGV4ZmlsdGVyLmMgXAorCXN3cmFzdC9zX3RleHN0b3JlLmMgXAorCXN3cmFzdC9zX3RyaWFuZ2xlLmMgXAorCXN3cmFzdC9zX3pvb20uYworCitTV1JBU1RfU0VUVVBfU09VUkNFUyA9IFwKKwlzd3Jhc3Rfc2V0dXAvc3NfY29udGV4dC5jIFwKKwlzd3Jhc3Rfc2V0dXAvc3NfdHJpYW5nbGUuYyAKKworVE5MX1NPVVJDRVMgPSBcCisJdG5sL3RfY29udGV4dC5jIFwKKwl0bmwvdF9waXBlbGluZS5jIFwKKwl0bmwvdF9kcmF3LmMgXAorCXRubC90X3ZiX3Byb2dyYW0uYyBcCisJdG5sL3RfdmJfcmVuZGVyLmMgXAorCXRubC90X3ZiX3RleGdlbi5jIFwKKwl0bmwvdF92Yl90ZXhtYXQuYyBcCisJdG5sL3RfdmJfdmVydGV4LmMgXAorCXRubC90X3ZiX2N1bGwuYyBcCisJdG5sL3RfdmJfZm9nLmMgXAorCXRubC90X3ZiX2xpZ2h0LmMgXAorCXRubC90X3ZiX25vcm1hbHMuYyBcCisJdG5sL3RfdmJfcG9pbnRzLmMgXAorCXRubC90X3ZwX2J1aWxkLmMgXAorCXRubC90X3ZlcnRleC5jIFwKKwl0bmwvdF92ZXJ0ZXhfc3NlLmMgXAorCXRubC90X3ZlcnRleF9nZW5lcmljLmMgCisKK1ZCT19TT1VSQ0VTID0gXAorCXZiby92Ym9fY29udGV4dC5jIFwKKwl2Ym8vdmJvX2V4ZWMuYyBcCisJdmJvL3Zib19leGVjX2FwaS5jIFwKKwl2Ym8vdmJvX2V4ZWNfYXJyYXkuYyBcCisJdmJvL3Zib19leGVjX2RyYXcuYyBcCisJdmJvL3Zib19leGVjX2V2YWwuYyBcCisJdmJvL3Zib19yZWJhc2UuYyBcCisJdmJvL3Zib19zcGxpdC5jIFwKKwl2Ym8vdmJvX3NwbGl0X2NvcHkuYyBcCisJdmJvL3Zib19zcGxpdF9pbnBsYWNlLmMgXAorCXZiby92Ym9fc2F2ZS5jIFwKKwl2Ym8vdmJvX3NhdmVfYXBpLmMgXAorCXZiby92Ym9fc2F2ZV9kcmF3LmMgXAorCXZiby92Ym9fc2F2ZV9sb29wYmFjay5jIAorCisKK1NIQURFUl9TT1VSQ0VTID0gXAorCXNoYWRlci9hcmJwcm9ncGFyc2UuYyBcCisJc2hhZGVyL2FyYnByb2dyYW0uYyBcCisJc2hhZGVyL2F0aWZyYWdzaGFkZXIuYyBcCisJc2hhZGVyL2dyYW1tYXIvZ3JhbW1hcl9tZXNhLmMgXAorCXNoYWRlci9udmZyYWdwYXJzZS5jIFwKKwlzaGFkZXIvbnZwcm9ncmFtLmMgXAorCXNoYWRlci9udnZlcnRwYXJzZS5jIFwKKwlzaGFkZXIvcHJvZ3JhbS5jIFwKKwlzaGFkZXIvcHJvZ19kZWJ1Zy5jIFwKKwlzaGFkZXIvcHJvZ19leGVjdXRlLmMgXAorCXNoYWRlci9wcm9nX2luc3RydWN0aW9uLmMgXAorCXNoYWRlci9wcm9nX3BhcmFtZXRlci5jIFwKKwlzaGFkZXIvcHJvZ19wcmludC5jIFwKKwlzaGFkZXIvcHJvZ19zdGF0ZXZhcnMuYyBcCisJc2hhZGVyL3Byb2dfdW5pZm9ybS5jIFwKKwlzaGFkZXIvcHJvZ3JhbW9wdC5jIFwKKwlzaGFkZXIvc2hhZGVyX2FwaS5jIFwKKworU0xBTkdfU09VUkNFUyA9CVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfYnVpbHRpbi5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfY29kZWdlbi5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfY29tcGlsZS5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfY29tcGlsZV9vcGVyYXRpb24uYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX2NvbXBpbGVfc3RydWN0LmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ19jb21waWxlX3ZhcmlhYmxlLmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ19lbWl0LmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ19pci5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfbGFiZWwuYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX2xpYnJhcnlfbm9pc2UuYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX2xpbmsuYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX2xvZy5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfbWVtLmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ19wcmVwcm9jZXNzLmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ19wcmludC5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfc2ltcGxpZnkuYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX3N0b3JhZ2UuYwlcCisJc2hhZGVyL3NsYW5nL3NsYW5nX3R5cGVpbmZvLmMJXAorCXNoYWRlci9zbGFuZy9zbGFuZ192YXJ0YWJsZS5jCVwKKwlzaGFkZXIvc2xhbmcvc2xhbmdfdXRpbGl0eS5jCisKK0FTTV9DX1NPVVJDRVMgPQlcCisJeDg2L2NvbW1vbl94ODYuYyBcCisJeDg2L3g4Ni5jIFwKKwl4ODYvM2Rub3cuYyBcCisJeDg2L3NzZS5jIFwKKwl4ODYvcnRhc20veDg2c3NlLmMgXAorCXNwYXJjL3NwYXJjLmMgXAorCXBwYy9jb21tb25fcHBjLmMgXAorCXg4Ni02NC94ODYtNjQuYworCitYODZfU09VUkNFUyA9CQkJXAorCXg4Ni9jb21tb25feDg2X2FzbS5TCVwKKwl4ODYveDg2X3hmb3JtMi5TCVwKKwl4ODYveDg2X3hmb3JtMy5TCVwKKwl4ODYveDg2X3hmb3JtNC5TCVwKKwl4ODYveDg2X2NsaXB0ZXN0LlMJXAorCXg4Ni9tbXhfYmxlbmQuUwkJXAorCXg4Ni8zZG5vd194Zm9ybTEuUwlcCisJeDg2LzNkbm93X3hmb3JtMi5TCVwKKwl4ODYvM2Rub3dfeGZvcm0zLlMJXAorCXg4Ni8zZG5vd194Zm9ybTQuUwlcCisJeDg2LzNkbm93X25vcm1hbC5TCVwKKwl4ODYvc3NlX3hmb3JtMS5TCVwKKwl4ODYvc3NlX3hmb3JtMi5TCVwKKwl4ODYvc3NlX3hmb3JtMy5TCVwKKwl4ODYvc3NlX3hmb3JtNC5TCVwKKwl4ODYvc3NlX25vcm1hbC5TCVwKKwl4ODYvcmVhZF9yZ2JhX3NwYW5feDg2LlMKKworWDg2X0FQSSA9CQkJXAorCXg4Ni9nbGFwaV94ODYuUworCitYODYtNjRfU09VUkNFUyA9CQlcCisJeDg2LTY0L3hmb3JtNC5TCisKK1g4Ni02NF9BUEkgPQkJCVwKKwl4ODYtNjQvZ2xhcGlfeDg2LTY0LlMKKworU1BBUkNfU09VUkNFUyA9CQkJXAorCXNwYXJjL2NsaXAuUwkJXAorCXNwYXJjL25vcm0uUwkJXAorCXNwYXJjL3hmb3JtLlMKKworU1BBUkNfQVBJID0JCQlcCisJc3BhcmMvZ2xhcGlfc3BhcmMuUworCitDT01NT05fRFJJVkVSX1NPVVJDRVMgPQkJCVwKKwlkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5jCisKKworCisjIyMgQWxsIHRoZSBjb3JlIEMgc291cmNlcworCitNRVNBX1NPVVJDRVMgPSBcCisJJChNQUlOX1NPVVJDRVMpCQlcCisJJChNQVRIX1NPVVJDRVMpCQlcCisJJChWQk9fU09VUkNFUykJCVwKKwkkKFROTF9TT1VSQ0VTKQkJXAorCSQoU0hBREVSX1NPVVJDRVMpCVwKKwkkKFNXUkFTVF9TT1VSQ0VTKQlcCisJJChTV1JBU1RfU0VUVVBfU09VUkNFUykJXAorCSQoQ09NTU9OX0RSSVZFUl9TT1VSQ0VTKSBcCisJJChBU01fQ19TT1VSQ0VTKQlcCisJJChTTEFOR19TT1VSQ0VTKQorCitBTExfU09VUkNFUyA9IFwKKwkkKE1FU0FfU09VUkNFUykJCVwKKwkkKEdMQVBJX1NPVVJDRVMpCVwKKwkkKEFTTV9TT1VSQ0VTKQkJXAorCSQoQ09NTU9OX0RSSVZFUl9TT1VSQ0VTKQorCisKKworIyMjIE9iamVjdCBmaWxlcworCitNRVNBX09CSkVDVFMgPSBcCisJJChNRVNBX1NPVVJDRVM6LmM9Lm8pIFwKKwkkKEFTTV9TT1VSQ0VTOi5TPS5vKQorCitHTEFQSV9PQkpFQ1RTID0gXAorCSQoR0xBUElfU09VUkNFUzouYz0ubykgXAorCSQoQVNNX0FQSTouUz0ubykKKworCitDT01NT05fRFJJVkVSX09CSkVDVFMgPSAkKENPTU1PTl9EUklWRVJfU09VUkNFUzouYz0ubykKKworCisKKyMjIyBJbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREVfRElSUyA9IFwKKwktSSQoVE9QKS9pbmNsdWRlIFwKKwktSSQoVE9QKS9zcmMvbWVzYSBcCisJLUkkKFRPUCkvc3JjL21lc2EvbWFpbiBcCisJLUkkKFRPUCkvc3JjL21lc2EvZ2xhcGkgXAorCS1JJChUT1ApL3NyYy9tZXNhL21hdGggXAorCS1JJChUT1ApL3NyYy9tZXNhL3RubCBcCisJLUkkKFRPUCkvc3JjL21lc2Evc2hhZGVyIFwKKwktSSQoVE9QKS9zcmMvbWVzYS9zaGFkZXIvZ3JhbW1hciBcCisJLUkkKFRPUCkvc3JjL21lc2Evc2hhZGVyL3NsYW5nIFwKKwktSSQoVE9QKS9zcmMvbWVzYS9zd3Jhc3QgXAorCS1JJChUT1ApL3NyYy9tZXNhL3N3cmFzdF9zZXR1cApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L2Rlc2NyaXAubW1zIGIvc3JjL21lc2Evc3dyYXN0L2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjNkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9zd3Jhc3QvZGVzY3JpcC5tbXMKQEAgLTAsMCArMSw4MiBAQAorIyBNYWtlZmlsZSBmb3IgY29yZSBsaWJyYXJ5IGZvciBWTVMKKyMgY29udHJpYnV0ZWQgYnkgSm91ayBKYW5zZW4gIGpvdWtqQGhyZW0ubmFuby50dWRlbGZ0Lm5sCisjIExhc3QgcmV2aXNpb24gOiAzIE9jdG9iZXIgMjAwNworCisuZmlyc3QKKwlkZWZpbmUgZ2wgWy0tLS5pbmNsdWRlLmdsXQorCWRlZmluZSBtYXRoIFstLm1hdGhdCisJZGVmaW5lIHN3cmFzdCBbLS5zd3Jhc3RdCisJZGVmaW5lIGFycmF5X2NhY2hlIFstLmFycmF5X2NhY2hlXQorCWRlZmluZSBnbGFwaSBbLS5nbGFwaV0KKwlkZWZpbmUgbWFpbiBbLS5tYWluXQorCWRlZmluZSBzaGFkZXIgWy0uc2hhZGVyXQorCisuaW5jbHVkZSBbLS0tXW1tcy1jb25maWcuCisKKyMjIyMjIE1BQ1JPUyAjIyMjIworCitWUEFUSCA9IFJDUworCitJTkNESVIgPSBbLS0tLmluY2x1ZGVdLFstLm1haW5dLFstLmdsYXBpXSxbLS5zaGFkZXJdLFstLnNoYWRlci5zbGFuZ10KK0xJQkRJUiA9IFstLS0ubGliXQorQ0ZMQUdTID0gL2luY2x1ZGU9KCQoSU5DRElSKSxbXSkvZGVmaW5lPShQVEhSRUFEUz0xKS9uYW1lPShhc19pcyxzaG9ydCkvZmxvYXQ9aWVlZS9pZWVlPWRlbm9ybQorCitTT1VSQ0VTID0gc19hYWxpbmUuYyBzX2FhdHJpYW5nbGUuYyBzX2FjY3VtLmMgc19hbHBoYS5jIFwKKwlzX2JpdG1hcC5jIHNfYmxlbmQuYyBzX2JsaXQuYyBzX2J1ZmZlcnMuYyBzX2NvbnRleHQuYyBcCisJc19jb3B5cGl4LmMgc19kZXB0aC5jIHNfZnJhZ3Byb2cuYyBcCisgICAgICAgIHNfZHJhd3BpeC5jIHNfZmVlZGJhY2suYyBzX2ZvZy5jIHNfaW1hZ2luZy5jIHNfbGluZXMuYyBzX2xvZ2ljLmMgXAorCXNfbWFza2luZy5jIHNfcG9pbnRzLmMgc19yZWFkcGl4LmMgXAorCXNfc3Bhbi5jIHNfc3RlbmNpbC5jIHNfdGV4c3RvcmUuYyBzX3RleGNvbWJpbmUuYyBzX3RleGZpbHRlci5jIFwKKwlzX3RyaWFuZ2xlLmMgc196b29tLmMgc19hdGlmcmFnc2hhZGVyLmMKKyAKK09CSkVDVFMgPSBzX2FhbGluZS5vYmosc19hYXRyaWFuZ2xlLm9iaixzX2FjY3VtLm9iaixzX2FscGhhLm9iaixcCisJc19iaXRtYXAub2JqLHNfYmxlbmQub2JqLHNfYmxpdC5vYmosc19mcmFncHJvZy5vYmosXAorCXNfYnVmZmVycy5vYmosc19jb250ZXh0Lm9iaixzX2F0aWZyYWdzaGFkZXIub2JqLFwKKwlzX2NvcHlwaXgub2JqLHNfZGVwdGgub2JqLHNfZHJhd3BpeC5vYmosc19mZWVkYmFjay5vYmosc19mb2cub2JqLFwKKwlzX2ltYWdpbmcub2JqLHNfbGluZXMub2JqLHNfbG9naWMub2JqLHNfbWFza2luZy5vYmosXAorCXNfcG9pbnRzLm9iaixzX3JlYWRwaXgub2JqLHNfc3Bhbi5vYmosc19zdGVuY2lsLm9iaixcCisJc190ZXhzdG9yZS5vYmosc190ZXhjb21iaW5lLm9iaixzX3RleGZpbHRlci5vYmosc190cmlhbmdsZS5vYmosXAorCXNfem9vbS5vYmoKKyAKKyMjIyMjIFJVTEVTICMjIyMjCisKK1ZFUlNJT049TWVzYSBWMy40CisKKyMjIyMjIFRBUkdFVFMgIyMjIyMKKyMgTWFrZSB0aGUgbGlicmFyeQorJChMSUJESVIpJChHTF9MSUIpIDogJChPQkpFQ1RTKQorICBAIGxpYnJhcnkgJChMSUJESVIpJChHTF9MSUIpICQoT0JKRUNUUykKKworY2xlYW4gOgorCXB1cmdlCisJZGVsZXRlICoub2JqOyoKKworc19hdGlmcmFnc2hhZGVyLm9iaiA6IHNfYXRpZnJhZ3NoYWRlci5jCitzX2FhbGluZS5vYmogOiBzX2FhbGluZS5jCitzX2FhdHJpYW5nbGUub2JqIDogc19hYXRyaWFuZ2xlLmMKK3NfYWNjdW0ub2JqIDogc19hY2N1bS5jCitzX2FscGhhLm9iaiA6IHNfYWxwaGEuYworc19iaXRtYXAub2JqIDogc19iaXRtYXAuYworc19ibGVuZC5vYmogOiBzX2JsZW5kLmMKK3NfYmxpdC5vYmogOiBzX2JsaXQuYworc19idWZmZXJzLm9iaiA6IHNfYnVmZmVycy5jCitzX2NvbnRleHQub2JqIDogc19jb250ZXh0LmMKK3NfY29weXBpeC5vYmogOiBzX2NvcHlwaXguYworc19kZXB0aC5vYmogOiBzX2RlcHRoLmMKK3NfZHJhd3BpeC5vYmogOiBzX2RyYXdwaXguYworc19mZWVkYmFjay5vYmogOiBzX2ZlZWRiYWNrLmMKK3NfZm9nLm9iaiA6IHNfZm9nLmMKK3NfaW1hZ2luZy5vYmogOiBzX2ltYWdpbmcuYworc19saW5lcy5vYmogOiBzX2xpbmVzLmMKK3NfbG9naWMub2JqIDogc19sb2dpYy5jCitzX21hc2tpbmcub2JqIDogc19tYXNraW5nLmMKK3NfcG9pbnRzLm9iaiA6IHNfcG9pbnRzLmMKK3NfcmVhZHBpeC5vYmogOiBzX3JlYWRwaXguYworc19zcGFuLm9iaiA6IHNfc3Bhbi5jCitzX3N0ZW5jaWwub2JqIDogc19zdGVuY2lsLmMKK3NfdGV4c3RvcmUub2JqIDogc190ZXhzdG9yZS5jCitzX3RleGNvbWJpbmUub2JqIDogc190ZXhjb21iaW5lLmMKK3NfdGV4ZmlsdGVyLm9iaiA6IHNfdGV4ZmlsdGVyLmMKK3NfdHJpYW5nbGUub2JqIDogc190cmlhbmdsZS5jCitzX3pvb20ub2JqIDogc196b29tLmMKK3NfZnJhZ3Byb2cub2JqIDogc19mcmFncHJvZy5jCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19hYWxpbmV0ZW1wLmggYi9zcmMvbWVzYS9zd3Jhc3Qvc19hYWxpbmV0ZW1wLmgKaW5kZXggZTc5MTFmZS4uY2EwODIwMyAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfYWFsaW5ldGVtcC5oCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2FhbGluZXRlbXAuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAKICAgIElOSVRfU1BBTihsaW5lLnNwYW4sIEdMX0xJTkUpOwogICAgbGluZS5zcGFuLmFycmF5TWFzayA9IFNQQU5fWFkgfCBTUEFOX0NPVkVSQUdFOworICAgbGluZS5zcGFuLmZhY2luZyA9IHN3cmFzdC0+UG9pbnRMaW5lRmFjaW5nOwogICAgbGluZS54QWRqID0gbGluZS5keCAvIGxpbmUubGVuICogbGluZS5oYWxmV2lkdGg7CiAgICBsaW5lLnlBZGogPSBsaW5lLmR5IC8gbGluZS5sZW4gKiBsaW5lLmhhbGZXaWR0aDsKIApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfYWF0cml0ZW1wLmggYi9zcmMvbWVzYS9zd3Jhc3Qvc19hYXRyaXRlbXAuaAppbmRleCA0MmQ3NGExLi4wODI3YjNkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc19hYXRyaXRlbXAuaAorKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc19hYXRyaXRlbXAuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41LjMKKyAqIFZlcnNpb246ICA3LjAuMwogICoKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC02NSw3ICs2NSw3IEBACiAgICBHTGZsb2F0IGF0dHJQbGFuZVtGUkFHX0FUVFJJQl9NQVhdWzRdWzRdOwogICAgR0xmbG9hdCB3UGxhbmVbNF07ICAvKiB3aW5bM10gKi8KICNlbmRpZgotICAgR0xmbG9hdCBiZiA9IFNXUkFTVF9DT05URVhUKGN0eCktPl9CYWNrZmFjZVNpZ247CisgICBHTGZsb2F0IGJmID0gU1dSQVNUX0NPTlRFWFQoY3R4KS0+X0JhY2tmYWNlQ3VsbFNpZ247CiAgICAKICAgICh2b2lkKSBzd3Jhc3Q7CiAKQEAgLTEwNCw2ICsxMDQsNyBAQAogICAgbWFqRHggPSB2TWF4LT5hdHRyaWJbRlJBR19BVFRSSUJfV1BPU11bMF0gLSB2TWluLT5hdHRyaWJbRlJBR19BVFRSSUJfV1BPU11bMF07CiAgICBtYWpEeSA9IHZNYXgtPmF0dHJpYltGUkFHX0FUVFJJQl9XUE9TXVsxXSAtIHZNaW4tPmF0dHJpYltGUkFHX0FUVFJJQl9XUE9TXVsxXTsKIAorICAgLyogZnJvbnQvYmFjay1mYWNlIGRldGVybWluYXRpb24gYW5kIGN1bGxsaW5nICovCiAgICB7CiAgICAgICBjb25zdCBHTGZsb2F0IGJvdER4ID0gdk1pZC0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzBdIC0gdk1pbi0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzBdOwogICAgICAgY29uc3QgR0xmbG9hdCBib3REeSA9IHZNaWQtPmF0dHJpYltGUkFHX0FUVFJJQl9XUE9TXVsxXSAtIHZNaW4tPmF0dHJpYltGUkFHX0FUVFJJQl9XUE9TXVsxXTsKQEAgLTExMiw2ICsxMTMsOCBAQAogICAgICAgaWYgKGFyZWEgKiBiZiA8IDAgfHwgYXJlYSA9PSAwIHx8IElTX0lORl9PUl9OQU4oYXJlYSkpCiAJIHJldHVybjsKICAgICAgIGx0b3IgPSAoR0xib29sZWFuKSAoYXJlYSA8IDAuMEYpOworCisgICAgICBzcGFuLmZhY2luZyA9IGFyZWEgKiBzd3Jhc3QtPl9CYWNrZmFjZVNpZ24gPiAwLjBGOwogICAgfQogCiAgICAvKiBQbGFuZSBlcXVhdGlvbiBzZXR1cDoKQEAgLTI4Niw3ICsyODksNyBAQAogICAgICAgICAgfQogCiAgICAgICAgICAvKiBza2lwIGZyYWdtZW50cyB3aXRoIHplcm8gY292ZXJhZ2UgKi8KLSAgICAgICAgIHdoaWxlIChzdGFydFggPj0gMCkgeworICAgICAgICAgd2hpbGUgKHN0YXJ0WCA+IDApIHsKICAgICAgICAgICAgIGNvdmVyYWdlID0gY29tcHV0ZV9jb3ZlcmFnZWYocE1pbiwgcE1heCwgcE1pZCwgc3RhcnRYLCBpeSk7CiAgICAgICAgICAgICBpZiAoY292ZXJhZ2UgPiAwLjBGKQogICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMDAsNiArMzAzLDcgQEAKICAgICAgICAgICAgIC8qIChjeCxjeSkgPSBjZW50ZXIgb2YgZnJhZ21lbnQgKi8KICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgY3ggPSBpeCArIDAuNUYsIGN5ID0gaXkgKyAwLjVGOwogICAgICAgICAgICAgU1dzcGFuYXJyYXlzICphcnJheSA9IHNwYW4uYXJyYXk7CisgICAgICAgICAgICBBU1NFUlQoaXggPj0gMCk7CiAjaWZkZWYgRE9fSU5ERVgKICAgICAgICAgICAgIGFycmF5LT5jb3ZlcmFnZVtpeF0gPSAoR0xmbG9hdCkgY29tcHV0ZV9jb3ZlcmFnZWkocE1pbiwgcE1heCwgcE1pZCwgaXgsIGl5KTsKICNlbHNlCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19hY2N1bS5jIGIvc3JjL21lc2Evc3dyYXN0L3NfYWNjdW0uYwppbmRleCAxM2E0MmZkLi4xZDFjZGYyIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc19hY2N1bS5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2FjY3VtLmMKQEAgLTUyNSw4ICs1MjUsOCBAQAogICAgICAgICAgfQogCiAgICAgICAgICAvKiBzdG9yZSBjb2xvcnMgKi8KLSAgICAgICAgIGZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzWzBdOyBidWZmZXIrKykgewotICAgICAgICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bYnVmZmVyXTsKKyAgICAgICAgIGZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzOyBidWZmZXIrKykgeworICAgICAgICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbYnVmZmVyXTsKICAgICAgICAgICAgIGlmIChtYXNraW5nKSB7CiAgICAgICAgICAgICAgICBfc3dyYXN0X21hc2tfcmdiYV9zcGFuKGN0eCwgcmIsICZzcGFuKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3N3cmFzdC9zX2JsZW5kLmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc19ibGVuZC5jCmluZGV4IDdmZDg5NDUuLjk1YzgzNDMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zX2JsZW5kLmMKKysrIGIvc3JjL21lc2Evc3dyYXN0L3NfYmxlbmQuYwpAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41LjIKKyAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC04ODAsNyArODgwLDggQEAKICAgICAgIH0KICAgIH0KICAgIGVsc2UgewotICAgICAgYmxlbmRfZ2VuZXJhbF9mbG9hdChjdHgsIG4sIG1hc2ssIHJnYmFGLCBkZXN0RiwgY2hhblR5cGUpOworICAgICAgYmxlbmRfZ2VuZXJhbF9mbG9hdChjdHgsIG4sIG1hc2ssIChHTGZsb2F0ICgqKVs0XSkgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoR0xmbG9hdCAoKilbNF0pIGRzdCwgY2hhblR5cGUpOwogICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19ibGl0LmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc19ibGl0LmMKaW5kZXggMGUxMmRmYS4uYmM0YjJhYyAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfYmxpdC5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2JsaXQuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICBzd2l0Y2ggKGJ1ZmZlcikgewogICAgY2FzZSBHTF9DT0xPUl9CVUZGRVJfQklUOgogICAgICAgcmVhZFJiID0gY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JSZWFkQnVmZmVyOwotICAgICAgZHJhd1JiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXTsKKyAgICAgIGRyYXdSYiA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF07CiAgICAgICBjb21wcyA9IDQ7CiAgICAgICBicmVhazsKICAgIGNhc2UgR0xfREVQVEhfQlVGRkVSX0JJVDoKQEAgLTMxOSw3ICszMTksNyBAQAogICAgICAgICAgICAgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEpCiB7CiAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyZWFkUmIgPSBjdHgtPlJlYWRCdWZmZXItPl9Db2xvclJlYWRCdWZmZXI7Ci0gICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpkcmF3UmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdOworICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqZHJhd1JiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXTsKIAogICAgY29uc3QgR0xpbnQgc3JjV2lkdGggPSBBQlMoc3JjWDEgLSBzcmNYMCk7CiAgICBjb25zdCBHTGludCBkc3RXaWR0aCA9IEFCUyhkc3RYMSAtIGRzdFgwKTsKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgc3dpdGNoIChidWZmZXIpIHsKICAgIGNhc2UgR0xfQ09MT1JfQlVGRkVSX0JJVDoKICAgICAgIHJlYWRSYiA9IGN0eC0+UmVhZEJ1ZmZlci0+X0NvbG9yUmVhZEJ1ZmZlcjsKLSAgICAgIGRyYXdSYiA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF07CisgICAgICBkcmF3UmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdOwogICAgICAgY29tcHMgPSA0OwogICAgICAgYnJlYWs7CiAgICBjYXNlIEdMX0RFUFRIX0JVRkZFUl9CSVQ6CkBAIC03NDUsNiArNzQ1LDkgQEAKICAgIH07CiAgICBHTGludCBpOwogCisgICBpZiAoIWN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMpCisgICAgICByZXR1cm47CisKICAgIGlmICghY2xpcF9ibGl0KGN0eCwgJnNyY1gwLCAmc3JjWTAsICZzcmNYMSwgJnNyY1kxLAogICAgICAgICAgICAgICAgICAgJmRzdFgwLCAmZHN0WTAsICZkc3RYMSwgJmRzdFkxKSkgewogICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfYnVmZmVycy5jIGIvc3JjL21lc2Evc3dyYXN0L3NfYnVmZmVycy5jCmluZGV4IGE3MGY0NzQuLjllODdkNmQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zX2J1ZmZlcnMuYworKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc19idWZmZXJzLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4yCisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMjUxLDcgKzI1MSw3IEBACiBjbGVhcl9jb2xvcl9idWZmZXJzKEdMY29udGV4dCAqY3R4KQogewogICAgR0xib29sZWFuIG1hc2tpbmc7Ci0gICBHTHVpbnQgaTsKKyAgIEdMdWludCBidWY7CiAKICAgIGlmIChjdHgtPlZpc3VhbC5yZ2JNb2RlKSB7CiAgICAgICBpZiAoY3R4LT5Db2xvci5Db2xvck1hc2tbMF0gJiYgCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgIH0KICAgIH0KICAgIGVsc2UgewotICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdOworICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdOwogICAgICAgY29uc3QgR0x1aW50IGluZGV4Qml0cyA9ICgxIDw8IHJiLT5JbmRleEJpdHMpIC0gMTsKICAgICAgIGlmICgoY3R4LT5Db2xvci5JbmRleE1hc2sgJiBpbmRleEJpdHMpID09IGluZGV4Qml0cykgewogICAgICAgICAgbWFza2luZyA9IEdMX0ZBTFNFOwpAQCAtMjc1LDggKzI3NSw4IEBACiAgICAgICB9CiAgICB9CiAKLSAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzWzBdOyBpKyspIHsKLSAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVtpXTsKKyAgIGZvciAoYnVmID0gMDsgYnVmIDwgY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgYnVmKyspIHsKKyAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1tidWZdOwogICAgICAgaWYgKGN0eC0+VmlzdWFsLnJnYk1vZGUpIHsKICAgICAgICAgIGlmIChtYXNraW5nKSB7CiAgICAgICAgICAgICBjbGVhcl9yZ2JhX2J1ZmZlcl93aXRoX21hc2tpbmcoY3R4LCByYik7CkBAIC0zMzEsNyArMzMxLDggQEAKIAogICAgLyogZG8gc29mdHdhcmUgY2xlYXJpbmcgaGVyZSAqLwogICAgaWYgKGJ1ZmZlcnMpIHsKLSAgICAgIGlmIChidWZmZXJzICYgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyTWFza1swXSkgeworICAgICAgaWYgKChidWZmZXJzICYgQlVGRkVSX0JJVFNfQ09MT1IpCisgICAgICAgICAgJiYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgPiAwKSkgewogICAgICAgICAgY2xlYXJfY29sb3JfYnVmZmVycyhjdHgpOwogICAgICAgfQogICAgICAgaWYgKGJ1ZmZlcnMgJiBCVUZGRVJfQklUX0RFUFRIKSB7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19jb250ZXh0LmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc19jb250ZXh0LmMKaW5kZXggNGQ5Yjk1Ni4uMmRlYTg5NSAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2NvbnRleHQuYwpAQCAtMiw3ICsyLDcgQEAKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKICAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKICNpbmNsdWRlICJ0ZXhpbWFnZS5oIgogI2luY2x1ZGUgInN3cmFzdC5oIgorI2luY2x1ZGUgInNoYWRlci9wcm9nX3BhcmFtZXRlci5oIgogI2luY2x1ZGUgInNoYWRlci9wcm9nX3N0YXRldmFycy5oIgogI2luY2x1ZGUgInNfYmxlbmQuaCIKICNpbmNsdWRlICJzX2NvbnRleHQuaCIKQEAgLTg3LDcgKzg4LDcgQEAKICAgICAqIE1VTFRJX0RSQVdfQklUIGZsYWcuICBBbHNvIHNldCBpdCBpZiB3ZSdyZSBkcmF3aW5nIHRvIG5vCiAgICAgKiBidWZmZXJzIG9yIHRoZSBSR0JBIG9yIENJIG1hc2sgZGlzYWJsZXMgYWxsIHdyaXRlcy4KICAgICAqLwotICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnNbMF0gIT0gMSkgeworICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnMgIT0gMSkgewogICAgICAgLyogbW9yZSB0aGFuIG9uZSBjb2xvciBidWZmZXIgZGVzaWduYXRlZCBmb3Igd3JpdGluZyAob3IgemVybyBidWZmZXJzKSAqLwogICAgICAgcmFzdGVyTWFzayB8PSBNVUxUSV9EUkFXX0JJVDsKICAgIH0KQEAgLTExNyw4ICsxMTgsOCBAQAogCiAKIC8qKgotICogRXhhbWluZSBwb2x5Y29uIGN1bGxzIHRhdGUgdG8gY29tcHV0ZSB0aGUgX0JhY2tmYWNlU2lnbiBmaWVsZC4KLSAqIF9CYWNrZmFjZVNpZ24gd2lsbCBiZSAwIGlmIG5vIGN1bGxpbmcsIC0xIGlmIGN1bGxpbmcgYmFjay1mYWNlcywKKyAqIEV4YW1pbmUgcG9seWdvbiBjdWxsIHN0YXRlIHRvIGNvbXB1dGUgdGhlIF9CYWNrZmFjZUN1bGxTaWduIGZpZWxkLgorICogX0JhY2tmYWNlQ3VsbFNpZ24gd2lsbCBiZSAwIGlmIG5vIGN1bGxpbmcsIC0xIGlmIGN1bGxpbmcgYmFjay1mYWNlcywKICAqIGFuZCAxIGlmIGN1bGxpbmcgZnJvbnQtZmFjZXMuICBUaGUgUG9seWdvbiBGcm9udEZhY2Ugc3RhdGUgYWxzbwogICogZmFjdG9ycyBpbi4KICAqLwpAQCAtMTI4LDMxICsxMjksMzIgQEAKICAgIEdMZmxvYXQgYmFja2ZhY2Vfc2lnbjsKIAogICAgaWYgKGN0eC0+UG9seWdvbi5DdWxsRmxhZykgewotICAgICAgYmFja2ZhY2Vfc2lnbiA9IDEuMDsKICAgICAgIHN3aXRjaCAoY3R4LT5Qb2x5Z29uLkN1bGxGYWNlTW9kZSkgewogICAgICAgY2FzZSBHTF9CQUNLOgotCSBpZiAoY3R4LT5Qb2x5Z29uLkZyb250RmFjZSA9PSBHTF9DQ1cpCi0JICAgIGJhY2tmYWNlX3NpZ24gPSAtMS4wOworICAgICAgICAgYmFja2ZhY2Vfc2lnbiA9IC0xLjA7CiAJIGJyZWFrOwogICAgICAgY2FzZSBHTF9GUk9OVDoKLQkgaWYgKGN0eC0+UG9seWdvbi5Gcm9udEZhY2UgIT0gR0xfQ0NXKQotCSAgICBiYWNrZmFjZV9zaWduID0gLTEuMDsKKyAgICAgICAgIGJhY2tmYWNlX3NpZ24gPSAxLjA7CiAJIGJyZWFrOwogICAgICAgY2FzZSBHTF9GUk9OVF9BTkRfQkFDSzoKICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCiAgICAgICBkZWZhdWx0OgogCSBiYWNrZmFjZV9zaWduID0gMC4wOwotCSBicmVhazsKICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgYmFja2ZhY2Vfc2lnbiA9IDAuMDsKICAgIH0KIAotICAgU1dSQVNUX0NPTlRFWFQoY3R4KS0+X0JhY2tmYWNlU2lnbiA9IGJhY2tmYWNlX3NpZ247CisgICBTV1JBU1RfQ09OVEVYVChjdHgpLT5fQmFja2ZhY2VDdWxsU2lnbiA9IGJhY2tmYWNlX3NpZ247CisKKyAgIC8qIFRoaXMgaXMgZm9yIGZyb250L2JhY2stZmFjZSBkZXRlcm1pbmF0aW9uLCBidXQgbm90IGZvciBjdWxsaW5nICovCisgICBTV1JBU1RfQ09OVEVYVChjdHgpLT5fQmFja2ZhY2VTaWduCisgICAgICA9IChjdHgtPlBvbHlnb24uRnJvbnRGYWNlID09IEdMX0NXKSA/IC0xLjAgOiAxLjA7CiB9CiAKIAorCiAvKioKICAqIFVwZGF0ZSB0aGUgX1ByZWZlclBpeGVsRm9nIGZpZWxkIHRvIGluZGljYXRlIGlmIHdlIG5lZWQgdG8gY29tcHV0ZQogICogZm9nIGJsZW5kIGZhY3RvcnMgKGZyb20gdGhlIGZvZyBjb29yZHMpIHBlci1mcmFnbWVudC4KQEAgLTUwMCw2ICs1MDIsMTMgQEAKICAgICAgIG5ld19zdGF0ZSA9IH4wOwogICAgfQogCisgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKKyAgICAgIGlmIChmcCAmJiAoZnAtPkJhc2UuUGFyYW1ldGVycy0+U3RhdGVGbGFncyAmIG5ld19zdGF0ZSkpIHsKKyAgICAgICAgIF9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhjdHgsIGZwLT5CYXNlLlBhcmFtZXRlcnMpOworICAgICAgfQorICAgfQorCiAgICBpZiAobmV3X3N0YXRlICYgc3dyYXN0LT5JbnZhbGlkYXRlVHJpYW5nbGVNYXNrKQogICAgICAgc3dyYXN0LT5UcmlhbmdsZSA9IF9zd3Jhc3RfdmFsaWRhdGVfdHJpYW5nbGU7CiAKQEAgLTU5OCw0NCArNjA3LDYgQEAKIH0KIAogCi0vKioKLSAqIFVwZGF0ZSB0aGUgc3dyYXN0LT5fQ29sb3JPdXRwdXRzTWFzayB3aGljaCBpbmRpY2F0ZXMgd2hpY2ggY29sb3IKLSAqIHJlbmRlcmJ1ZmZlcnMgKGFrYSByZW5kZXJ0YXJnZXRzKSBhcmUgYmVpbmcgd3JpdHRlbiB0byBieSB0aGUgY3VycmVudAotICogZnJhZ21lbnQgcHJvZ3JhbS4KLSAqIFdlIGFsc28gdGFrZSBnbERyYXdCdWZmZXJzKCkgaW50byBhY2NvdW50IHRvIHNraXAgb3V0cHV0cyB0aGF0IGFyZQotICogc2V0IHRvIEdMX05PTkUuCi0gKi8KLXN0YXRpYyB2b2lkCi1fc3dyYXN0X3VwZGF0ZV9jb2xvcl9vdXRwdXRzKEdMY29udGV4dCAqY3R4KQotewotICAgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVChjdHgpOwotICAgY29uc3Qgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiA9IGN0eC0+RHJhd0J1ZmZlcjsKLQotICAgc3dyYXN0LT5fQ29sb3JPdXRwdXRzTWFzayA9IDA7Ci0gICBzd3Jhc3QtPl9OdW1Db2xvck91dHB1dHMgPSAwOwotCi0gICBpZiAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQpIHsKLSAgICAgIGNvbnN0IEdMYml0ZmllbGQgb3V0cHV0c1dyaXR0ZW4KLSAgICAgICAgID0gY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQtPkJhc2UuT3V0cHV0c1dyaXR0ZW47Ci0gICAgICBHTHVpbnQgb3V0cHV0OwotICAgICAgZm9yIChvdXRwdXQgPSAwOyBvdXRwdXQgPCBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOyBvdXRwdXQrKykgewotICAgICAgICAgaWYgKChvdXRwdXRzV3JpdHRlbiAmICgxIDw8IChGUkFHX1JFU1VMVF9EQVRBMCArIG91dHB1dCkpKQotICAgICAgICAgICAgICYmIChmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnNbb3V0cHV0XSA+IDApKSB7Ci0gICAgICAgICAgICBzd3Jhc3QtPl9Db2xvck91dHB1dHNNYXNrIHw9ICgxIDw8IG91dHB1dCk7Ci0gICAgICAgICAgICBzd3Jhc3QtPl9OdW1Db2xvck91dHB1dHMgPSBvdXRwdXQgKyAxOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgaWYgKHN3cmFzdC0+X0NvbG9yT3V0cHV0c01hc2sgPT0gMHgwKSB7Ci0gICAgICAvKiBubyBmcmFnbWVudCBwcm9ncmFtLCBvciBmcmFnIHByb2cgZGlkbid0IHdyaXRlIHRvIGdsX0ZyYWdEYXRhW10gKi8KLSAgICAgIGlmIChmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnNbMF0gPiAwKSB7Ci0gICAgICAgICBzd3Jhc3QtPl9Db2xvck91dHB1dHNNYXNrID0gMHgxOwotICAgICAgICAgc3dyYXN0LT5fTnVtQ29sb3JPdXRwdXRzID0gMTsKLSAgICAgIH0KLSAgIH0KLX0KLQotCiB2b2lkCiBfc3dyYXN0X3ZhbGlkYXRlX2Rlcml2ZWQoIEdMY29udGV4dCAqY3R4ICkKIHsKQEAgLTY4NSw5ICs2NTYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05FV19URVhUVVJFKSkKICAgICAgICAgIF9zd3Jhc3RfdXBkYXRlX2FjdGl2ZV9hdHRyaWJzKGN0eCk7CiAKLSAgICAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlICYgKF9ORVdfUFJPR1JBTSB8IF9ORVdfQlVGRkVSUykpCi0gICAgICAgICBfc3dyYXN0X3VwZGF0ZV9jb2xvcl9vdXRwdXRzKGN0eCk7Ci0KICAgICAgIHN3cmFzdC0+TmV3U3RhdGUgPSAwOwogICAgICAgc3dyYXN0LT5TdGF0ZUNoYW5nZXMgPSAwOwogICAgICAgc3dyYXN0LT5JbnZhbGlkYXRlU3RhdGUgPSBfc3dyYXN0X2ludmFsaWRhdGVfc3RhdGU7CkBAIC03NjcsNiArNzM1LDEyIEBACiB9CiAKIHZvaWQKK19zd3Jhc3RfU2V0RmFjaW5nKEdMY29udGV4dCAqY3R4LCBHTHVpbnQgZmFjaW5nKQoreworICAgU1dSQVNUX0NPTlRFWFQoY3R4KS0+UG9pbnRMaW5lRmFjaW5nID0gZmFjaW5nOworfQorCit2b2lkCiBfc3dyYXN0X2FsbG93X3ZlcnRleF9mb2coIEdMY29udGV4dCAqY3R4LCBHTGJvb2xlYW4gdmFsdWUgKQogewogICAgaWYgKFNXUkFTVF9ERUJVRykgewpAQCAtODY5LDYgKzg0Myw4IEBACiAgICB9CiAKICAgIEZSRUUoIHN3cmFzdC0+U3BhbkFycmF5cyApOworICAgaWYgKHN3cmFzdC0+Wm9vbWVkQXJyYXlzKQorICAgICAgRlJFRSggc3dyYXN0LT5ab29tZWRBcnJheXMgKTsKICAgIEZSRUUoIHN3cmFzdC0+VGV4ZWxCdWZmZXIgKTsKICAgIEZSRUUoIHN3cmFzdCApOwogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19jb250ZXh0LmggYi9zcmMvbWVzYS9zd3Jhc3Qvc19jb250ZXh0LmgKaW5kZXggZGFhMDdlMS4uYTUxMWQxYyAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfY29udGV4dC5oCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2NvbnRleHQuaApAQCAtMTI4LDE3ICsxMjgsMTQgQEAKICAgICAqIF9zd3Jhc3RfdmFsaWRhdGVfZGVyaXZlZCgpOgogICAgICovCiAgICBHTGJpdGZpZWxkIF9SYXN0ZXJNYXNrOwotICAgR0xmbG9hdCBfQmFja2ZhY2VTaWduOworICAgR0xmbG9hdCBfQmFja2ZhY2VTaWduOyAgICAgIC8qKiArMSBvciAtMSAqLworICAgR0xmbG9hdCBfQmFja2ZhY2VDdWxsU2lnbjsgIC8qKiArMSwgMCwgb3IgLTEgKi8KICAgIEdMYm9vbGVhbiBfUHJlZmVyUGl4ZWxGb2c7ICAgIC8qIENvbXB1dGUgZm9nIGJsZW5kIGZhY3RvciBwZXIgZnJhZ21lbnQ/ICovCiAgICBHTGJvb2xlYW4gX0FueVRleHR1cmVDb21iaW5lOwogICAgR0xib29sZWFuIF9Gb2dFbmFibGVkOwogICAgR0xib29sZWFuIF9EZWZlcnJlZFRleHR1cmU7CiAgICBHTGVudW0gX0ZvZ01vZGU7ICAvKiBlaXRoZXIgR0xfRk9HX01PREUgb3IgZnJhZ21lbnQgcHJvZ3JhbSdzIGZvZyBtb2RlICovCiAKLSAgIC8qKiBNdWx0aXBsZSByZW5kZXIgdGFyZ2V0cyAqLwotICAgR0xiaXRmaWVsZCBfQ29sb3JPdXRwdXRzTWFzazsKLSAgIEdMdWludCBfTnVtQ29sb3JPdXRwdXRzOwotCiAgICAvKiogTGlzdC9hcnJheSBvZiB0aGUgZnJhZ21lbnQgYXR0cmlidXRlcyB0byBpbnRlcnBvbGF0ZSAqLwogICAgR0x1aW50IF9BY3RpdmVBdHRyaWJzW0ZSQUdfQVRUUklCX01BWF07CiAgICAvKiogU2FtZSBpbmZvLCBidXQgYXMgYSBiaXRtYXNrICovCkBAIC0xNTYsNiArMTUzLDcgQEAKICAgIC8qIFdvcmtpbmcgdmFsdWVzOgogICAgICovCiAgICBHTHVpbnQgU3RpcHBsZUNvdW50ZXI7ICAgIC8qKjwgTGluZSBzdGlwcGxlIGNvdW50ZXIgKi8KKyAgIEdMdWludCBQb2ludExpbmVGYWNpbmc7CiAgICBHTGJpdGZpZWxkIE5ld1N0YXRlOwogICAgR0x1aW50IFN0YXRlQ2hhbmdlczsKICAgIEdMZW51bSBQcmltaXRpdmU7ICAgIC8qIGN1cnJlbnQgcHJpbWl0aXZlIGJlaW5nIGRyYXduIChhbGEgZ2xCZWdpbikgKi8KQEAgLTIwOCw2ICsyMDYsNyBAQAogICAgICogb24gc29tZSBzeXN0ZW1zLgogICAgICovCiAgICBTV3NwYW5hcnJheXMgKlNwYW5BcnJheXM7CisgICBTV3NwYW5hcnJheXMgKlpvb21lZEFycmF5czsgIC8qKjwgRm9yIHBpeGVsIHpvb21pbmcgKi8KIAogICAgLyoqCiAgICAgKiBVc2VkIHRvIGJ1ZmZlciBOIEdMX1BPSU5UUywgaW5zdGVhZCBvZiByZW5kZXJpbmcgb25lIGJ5IG9uZS4KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3N3cmFzdC9zX2NvcHlwaXguYyBiL3NyYy9tZXNhL3N3cmFzdC9zX2NvcHlwaXguYwppbmRleCA3Mzg1YTk5Li5iNWZmYjZhIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc19jb3B5cGl4LmMKKysrIGIvc3JjL21lc2Evc3dyYXN0L3NfY29weXBpeC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICA2LjUuMworICogVmVyc2lvbjogIDcuMQogICoKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC03MSwxMyArNzEsMjAgQEAKICAgIH0KICAgIGVsc2UgewogICAgICAgLyogYWRkIG9uZSBwaXhlbCBvZiBzbG9wIHdoZW4gem9vbWluZywganVzdCB0byBiZSBzYWZlICovCi0gICAgICBpZiAoKHNyY3ggPiBkc3R4ICsgKHdpZHRoICogem9vbVgpICsgMSkgfHwgKHNyY3ggKyB3aWR0aCArIDEgPCBkc3R4KSkgeworICAgICAgaWYgKHNyY3ggPiAoZHN0eCArICgoem9vbVggPiAwLjBGKSA/ICh3aWR0aCAqIHpvb21YICsgMS4wRikgOiAwLjBGKSkpIHsKKyAgICAgICAgIC8qIHNyYyBpcyBjb21wbGV0ZWx5IHJpZ2h0IG9mIGRlc3QgKi8KKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNyY3ggKyB3aWR0aCArIDEuMEYgPCBkc3R4ICsgKCh6b29tWCA+IDAuMEYpID8gMC4wRiA6ICh3aWR0aCAqIHpvb21YKSkpIHsKKyAgICAgICAgIC8qIHNyYyBpcyBjb21wbGV0ZWx5IGxlZnQgb2YgZGVzdCAqLwogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoKHNyY3kgPCBkc3R5KSAmJiAoc3JjeSArIGhlaWdodCA8IGRzdHkgKyAoaGVpZ2h0ICogem9vbVkpKSkgeworICAgICAgICAgLyogc3JjIGlzIGNvbXBsZXRlbHkgYmVsb3cgZGVzdCAqLwogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoKHNyY3kgPiBkc3R5KSAmJiAoc3JjeSArIGhlaWdodCA+IGRzdHkgKyAoaGVpZ2h0ICogem9vbVkpKSkgeworICAgICAgICAgLyogc3JjIGlzIGNvbXBsZXRlbHkgYWJvdmUgZGVzdCAqLwogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgfQogICAgICAgZWxzZSB7CkBAIC04MjMsMTAgKzgzMCwxMCBAQAogICAgfQogCiAgICBpZiAodHlwZSA9PSBHTF9DT0xPUikgewotICAgICAgaWYgKGRzdEZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyc1swXSAhPSAxKQorICAgICAgaWYgKGRzdEZiLT5fTnVtQ29sb3JEcmF3QnVmZmVycyAhPSAxKQogICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOwogICAgICAgc3JjUmIgPSBzcmNGYi0+X0NvbG9yUmVhZEJ1ZmZlcjsKLSAgICAgIGRzdFJiID0gZHN0RmItPl9Db2xvckRyYXdCdWZmZXJzWzBdWzBdOworICAgICAgZHN0UmIgPSBkc3RGYi0+X0NvbG9yRHJhd0J1ZmZlcnNbMF07CiAgICB9CiAgICBlbHNlIGlmICh0eXBlID09IEdMX1NURU5DSUwpIHsKICAgICAgIHNyY1JiID0gc3JjRmItPl9TdGVuY2lsQnVmZmVyOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfZHJhd3BpeC5jIGIvc3JjL21lc2Evc3dyYXN0L3NfZHJhd3BpeC5jCmluZGV4IGQxMTIwZDIuLjcyMzk4ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zX2RyYXdwaXguYworKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc19kcmF3cGl4LmMKQEAgLTUzLDggKzUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscykKIHsKICAgIGNvbnN0IEdMaW50IGltZ1ggPSB4LCBpbWdZID0geTsKLSAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXTsKLSAgIGNvbnN0IEdMZW51bSByYlR5cGUgPSByYi0+RGF0YVR5cGU7CisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF07CisgICBHTGVudW0gcmJUeXBlOwogICAgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVChjdHgpOwogICAgU1dzcGFuIHNwYW47CiAgICBHTGJvb2xlYW4gc2ltcGxlWm9vbTsKQEAgLTYyLDYgKzYyLDExIEBACiAgICBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgdW5wYWNrOwogICAgR0xpbnQgZGVzdFgsIGRlc3RZLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQ7IC8qIHBvc3QgY2xpcHBpbmcgKi8KIAorICAgaWYgKCFyYikKKyAgICAgIHJldHVybiBHTF9UUlVFOyAvKiBuby1vcCAqLworCisgICByYlR5cGUgPSByYi0+RGF0YVR5cGU7CisKICAgIGlmICgoc3dyYXN0LT5fUmFzdGVyTWFzayAmIH5DTElQX0JJVCkgfHwKICAgICAgICBjdHgtPlRleHR1cmUuX0VuYWJsZWRDb29yZFVuaXRzIHx8CiAgICAgICAgdXNlclVucGFjay0+U3dhcEJ5dGVzIHx8CkBAIC02MDgsOCArNjEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfUE9TVF9DT05WT0xVVElPTl9TQ0FMRV9CSUFTKTsKICAgIH0KIAotICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnNbMF0gPiAwICYmCi0gICAgICAgY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXS0+RGF0YVR5cGUgIT0gR0xfRkxPQVQgJiYKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9OdW1Db2xvckRyYXdCdWZmZXJzID4gMCAmJgorICAgICAgIGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF0tPkRhdGFUeXBlICE9IEdMX0ZMT0FUICYmCiAgICAgICAgY3R4LT5Db2xvci5DbGFtcEZyYWdtZW50Q29sb3IgIT0gR0xfRkFMU0UpIHsKICAgICAgIC8qIG5lZWQgdG8gY2xhbXAgY29sb3JzIGJlZm9yZSBhcHBseWluZyBmcmFnbWVudCBvcHMgKi8KICAgICAgIHRyYW5zZmVyT3BzIHw9IElNQUdFX0NMQU1QX0JJVDsKQEAgLTgzNCw5ICs4MzksMTEgQEAKICAgIGlmIChzd3Jhc3QtPk5ld1N0YXRlKQogICAgICAgX3N3cmFzdF92YWxpZGF0ZV9kZXJpdmVkKCBjdHggKTsKIAotICAgcGl4ZWxzID0gX21lc2FfbWFwX2RyYXdwaXhfcGJvKGN0eCwgdW5wYWNrLCBwaXhlbHMpOwotICAgaWYgKCFwaXhlbHMpCi0gICAgICByZXR1cm47CisgICAgcGl4ZWxzID0gX21lc2FfbWFwX2RyYXdwaXhfcGJvKGN0eCwgdW5wYWNrLCBwaXhlbHMpOworICAgIGlmICghcGl4ZWxzKSB7CisgICAgICAgUkVOREVSX0ZJTklTSChzd3Jhc3QsY3R4KTsKKyAgICAgICByZXR1cm47CisgICAgfQogCiAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYOgpAQCAtODczLDExICs4ODAsOSBAQAogICAgICAgLyogZG9uJ3QgcmV0dXJuIHlldCwgY2xlYW4tdXAgKi8KICAgIH0KIAotZW5kOgotCiAgICBSRU5ERVJfRklOSVNIKHN3cmFzdCxjdHgpOwogCi0gICBfbWVzYV91bm1hcF9kcmF3cGl4X3BibyhjdHgsIHVucGFjayk7CisgICBfbWVzYV91bm1hcF9kcmFwaXhfcGJvKGN0eCwgdW5wYWNrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19mcmFncHJvZy5jIGIvc3JjL21lc2Evc3dyYXN0L3NfZnJhZ3Byb2cuYwppbmRleCA4ZWViNDBmLi41MjVjZjlkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc19mcmFncHJvZy5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX2ZyYWdwcm9nLmMKQEAgLTQ0LDcgKzQ0LDggQEAKICAgIFNXY29udGV4dCAqc3dyYXN0ID0gU1dSQVNUX0NPTlRFWFQoY3R4KTsKICAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqID0gY3R4LT5UZXh0dXJlLlVuaXRbdW5pdF0uX0N1cnJlbnQ7CiAKLSAgIGxhbWJkYSA9IENMQU1QKGxhbWJkYSwgdGV4T2JqLT5NaW5Mb2QsIHRleE9iai0+TWF4TG9kKTsKKyAgIGlmICh0ZXhPYmopCisgICAgICBsYW1iZGEgPSBDTEFNUChsYW1iZGEsIHRleE9iai0+TWluTG9kLCB0ZXhPYmotPk1heExvZCk7CiAKICAgIC8qIFhYWCB1c2UgYSBmbG9hdC12YWx1ZWQgVGV4dHVyZVNhbXBsZSByb3V0aW5lIGhlcmUhISEgKi8KICAgIHN3cmFzdC0+VGV4dHVyZVNhbXBsZVt1bml0XShjdHgsIHRleE9iaiwgMSwgKGNvbnN0IEdMZmxvYXQgKCopWzRdKSB0ZXhjb29yZCwKQEAgLTY4LDIwICs2OSwyMyBAQAogewogICAgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVChjdHgpOwogICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmogPSBjdHgtPlRleHR1cmUuVW5pdFt1bml0XS5fQ3VycmVudDsKLSAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWcgPSB0ZXhPYmotPkltYWdlWzBdW3RleE9iai0+QmFzZUxldmVsXTsKLSAgIGNvbnN0IEdMZmxvYXQgdGV4VyA9IChHTGZsb2F0KSB0ZXhJbWctPldpZHRoU2NhbGU7Ci0gICBjb25zdCBHTGZsb2F0IHRleEggPSAoR0xmbG9hdCkgdGV4SW1nLT5IZWlnaHRTY2FsZTsKKyAgIEdMZmxvYXQgbGFtYmRhOwogICAgR0xjaGFuIHJnYmFbNF07CiAKLSAgIEdMZmxvYXQgbGFtYmRhCi0gICAgICA9IF9zd3Jhc3RfY29tcHV0ZV9sYW1iZGEodGV4ZHhbMF0sIHRleGR5WzBdLCAvKiBkcy9keCwgZHMvZHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhkeFsxXSwgdGV4ZHlbMV0sIC8qIGR0L2R4LCBkdC9keSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGR4WzNdLCB0ZXhkeVsyXSwgLyogZHEvZHgsIGRxL2R5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4VywgdGV4SCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZFswXSwgdGV4Y29vcmRbMV0sIHRleGNvb3JkWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMEYgLyB0ZXhjb29yZFszXSkgKyBsb2RCaWFzOworICAgaWYgKHRleE9iaikgeworICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltZyA9IHRleE9iai0+SW1hZ2VbMF1bdGV4T2JqLT5CYXNlTGV2ZWxdOworICAgICAgY29uc3QgR0xmbG9hdCB0ZXhXID0gKEdMZmxvYXQpIHRleEltZy0+V2lkdGhTY2FsZTsKKyAgICAgIGNvbnN0IEdMZmxvYXQgdGV4SCA9IChHTGZsb2F0KSB0ZXhJbWctPkhlaWdodFNjYWxlOwogCi0gICBsYW1iZGEgPSBDTEFNUChsYW1iZGEsIHRleE9iai0+TWluTG9kLCB0ZXhPYmotPk1heExvZCk7CisgICAgICBsYW1iZGEgPSBfc3dyYXN0X2NvbXB1dGVfbGFtYmRhKHRleGR4WzBdLCB0ZXhkeVswXSwgLyogZHMvZHgsIGRzL2R5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGR4WzFdLCB0ZXhkeVsxXSwgLyogZHQvZHgsIGR0L2R5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGR4WzNdLCB0ZXhkeVsyXSwgLyogZHEvZHgsIGRxL2R5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleFcsIHRleEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkWzBdLCB0ZXhjb29yZFsxXSwgdGV4Y29vcmRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMEYgLyB0ZXhjb29yZFszXSkgKyBsb2RCaWFzOworCisgICAgICBsYW1iZGEgPSBDTEFNUChsYW1iZGEsIHRleE9iai0+TWluTG9kLCB0ZXhPYmotPk1heExvZCk7CisgICB9CiAKICAgIHN3cmFzdC0+VGV4dHVyZVNhbXBsZVt1bml0XShjdHgsIHRleE9iaiwgMSwgKGNvbnN0IEdMZmxvYXQgKCopWzRdKSB0ZXhjb29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFtYmRhLCAmcmdiYSk7CkBAIC0xMjQsNyArMTI4LDggQEAKICAgIC8qIGlmIHJ1bm5pbmcgYSBHTFNMIHByb2dyYW0gKG5vdCBBUkJfZnJhZ21lbnRfcHJvZ3JhbSkgKi8KICAgIGlmIChjdHgtPlNoYWRlci5DdXJyZW50UHJvZ3JhbSkgewogICAgICAgLyogU3RvcmUgZnJvbnQvYmFjayBmYWNpbmcgdmFsdWUgaW4gcmVnaXN0ZXIgRk9HQy5ZICovCi0gICAgICBtYWNoaW5lLT5BdHRyaWJzW0ZSQUdfQVRUUklCX0ZPR0NdW2NvbF1bMV0gPSAoR0xmbG9hdCkgY3R4LT5fRmFjaW5nOworICAgICAgbWFjaGluZS0+QXR0cmlic1tGUkFHX0FUVFJJQl9GT0dDXVtjb2xdWzFdID0gMS4wIC0gc3Bhbi0+ZmFjaW5nOworICAgICAgLyogTm90ZSBGT0dDLlpXIGlzIGdsX1BvaW50Q29vcmQgaWYgZHJhd2luZyBhIHNwcml0ZSAqLwogICAgfQogCiAgICBtYWNoaW5lLT5DdXJFbGVtZW50ID0gY29sOwpAQCAtMTcxLDExICsxNzYsMTEgQEAKICAgICAgICAgICAgICAgICAqIE5vdGUgdGhhdCBjb2xvcnMgYmV5b25kIDAgYW5kIDEgd2lsbCBvdmVyd3JpdGUgb3RoZXIKICAgICAgICAgICAgICAgICAqIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgRk9HQywgVEVYMCwgVEVYMSwgZXRjLiAgVGhhdCdzIE9LLgogICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBHTHVpbnQgb3V0cHV0OwotICAgICAgICAgICAgICAgZm9yIChvdXRwdXQgPSAwOyBvdXRwdXQgPCBzd3Jhc3QtPl9OdW1Db2xvck91dHB1dHM7IG91dHB1dCsrKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAob3V0cHV0c1dyaXR0ZW4gJiAoMSA8PCAoRlJBR19SRVNVTFRfREFUQTAgKyBvdXRwdXQpKSkgewotICAgICAgICAgICAgICAgICAgICAgQ09QWV80VihzcGFuLT5hcnJheS0+YXR0cmlic1tGUkFHX0FUVFJJQl9DT0wwK291dHB1dF1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUtPk91dHB1dHNbRlJBR19SRVNVTFRfREFUQTAgKyBvdXRwdXRdKTsKKyAgICAgICAgICAgICAgIEdMdWludCBidWY7CisgICAgICAgICAgICAgICBmb3IgKGJ1ZiA9IDA7IGJ1ZiA8IGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnM7IGJ1ZisrKSB7CisgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0c1dyaXR0ZW4gJiAoMSA8PCAoRlJBR19SRVNVTFRfREFUQTAgKyBidWYpKSkgeworICAgICAgICAgICAgICAgICAgICAgQ09QWV80VihzcGFuLT5hcnJheS0+YXR0cmlic1tGUkFHX0FUVFJJQl9DT0wwICsgYnVmXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZS0+T3V0cHV0c1tGUkFHX1JFU1VMVF9EQVRBMCArIGJ1Zl0pOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfbGluZXRlbXAuaCBiL3NyYy9tZXNhL3N3cmFzdC9zX2xpbmV0ZW1wLmgKaW5kZXggMWFjY2ZjNi4uMWFiZjhkNiAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfbGluZXRlbXAuaAorKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc19saW5ldGVtcC5oCkBAIC0zMDgsNiArMzA4LDkgQEAKICAgIHNwYW4uaW50ZXJwTWFzayA9IGludGVycEZsYWdzOwogICAgc3Bhbi5hcnJheU1hc2sgPSBTUEFOX1hZOwogCisgICBzcGFuLmZhY2luZyA9IHN3cmFzdC0+UG9pbnRMaW5lRmFjaW5nOworCisKICAgIC8qCiAgICAgKiBEcmF3CiAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3N3cmFzdC9zX3BvaW50cy5jIGIvc3JjL21lc2Evc3dyYXN0L3NfcG9pbnRzLmMKaW5kZXggOWY1MmRhOS4uMjI2MzljNSAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfcG9pbnRzLmMKKysrIGIvc3JjL21lc2Evc3dyYXN0L3NfcG9pbnRzLmMKQEAgLTQ2LDYgKzQ2LDM4IEBACiAgICB9IHdoaWxlKDApCiAKIAorCisvKioKKyAqIEdldC9jb21wdXRlIHRoZSBwb2ludCBzaXplLgorICogVGhlIHNpemUgbWF5IGNvbWUgZnJvbSBhIHZlcnRleCBzaGFkZXIsIG9yIGNvbXB1dGVkIHdpdGggYXR0ZW50dWF0aW9uCisgKiBvciBqdXN0IHRoZSBnbFBvaW50U2l6ZSB2YWx1ZS4KKyAqIE11c3QgYWxzbyBjbGFtcCB0byB1c2VyLWRlZmluZWQgcmFuZ2UgYW5kIGltcGxtZW50YXRpb24gbGltaXRzLgorICovCitzdGF0aWMgSU5MSU5FIEdMZmxvYXQKK2dldF9zaXplKGNvbnN0IEdMY29udGV4dCAqY3R4LCBjb25zdCBTV3ZlcnRleCAqdmVydCwgR0xib29sZWFuIHNtb290aGVkKQoreworICAgR0xmbG9hdCBzaXplOworCisgICBpZiAoY3R4LT5Qb2ludC5fQXR0ZW51YXRlZCB8fCBjdHgtPlZlcnRleFByb2dyYW0uUG9pbnRTaXplRW5hYmxlZCkgeworICAgICAgLyogdXNlIHZlcnRleCdzIHBvaW50IHNpemUgKi8KKyAgICAgIHNpemUgPSB2ZXJ0LT5wb2ludFNpemU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIHVzZSBjb25zdGFudCBwb2ludCBzaXplICovCisgICAgICBzaXplID0gY3R4LT5Qb2ludC5TaXplOworICAgfQorICAgLyogYWx3YXlzIGNsYW1wIHRvIHVzZXItc3BlY2lmaWVkIGxpbWl0cyAqLworICAgc2l6ZSA9IENMQU1QKHNpemUsIGN0eC0+UG9pbnQuTWluU2l6ZSwgY3R4LT5Qb2ludC5NYXhTaXplKTsKKyAgIC8qIGNsYW1wIHRvIGltcGxlbWVudGF0aW9uIGxpbWl0cyAqLworICAgaWYgKHNtb290aGVkKQorICAgICAgc2l6ZSA9IENMQU1QKHNpemUsIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplQUEsIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplQUEpOworICAgZWxzZQorICAgICAgc2l6ZSA9IENMQU1QKHNpemUsIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplLCBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZSk7CisKKyAgIHJldHVybiBzaXplOworfQorCisKIC8qKgogICogRHJhdyBhIHBvaW50IHNwcml0ZQogICovCkBAIC02OCwyMyArMTAwLDE0IEBACiAgICAgICBzcGFuLnogPSAoR0x1aW50KSAodmVydC0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzJdICsgMC41Rik7CiAgICBzcGFuLnpTdGVwID0gMDsKIAotICAgLyogY29tcHV0ZSBzaXplICovCi0gICBpZiAoY3R4LT5Qb2ludC5fQXR0ZW51YXRlZCB8fCBjdHgtPlZlcnRleFByb2dyYW0uUG9pbnRTaXplRW5hYmxlZCkgewotICAgICAgLyogdXNlIHZlcnRleCdzIHBvaW50IHNpemUgKi8KLSAgICAgIC8qIGZpcnN0LCBjbGFtcCBhdHRlbnVhdGVkIHNpemUgdG8gdGhlIHVzZXItc3BlY2lmZWQgcmFuZ2UgKi8KLSAgICAgIHNpemUgPSBDTEFNUCh2ZXJ0LT5wb2ludFNpemUsIGN0eC0+UG9pbnQuTWluU2l6ZSwgY3R4LT5Qb2ludC5NYXhTaXplKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgLyogdXNlIGNvbnN0YW50IHBvaW50IHNpemUgKi8KLSAgICAgIHNpemUgPSBjdHgtPlBvaW50LlNpemU7Ci0gICB9Ci0gICAvKiBjbGFtcCB0byBub24tQUEgaW1wbGVtZW50YXRpb24gbGltaXRzICovCi0gICBzaXplID0gQ0xBTVAoc2l6ZSwgY3R4LT5Db25zdC5NaW5Qb2ludFNpemUsIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplKTsKKyAgIHNpemUgPSBnZXRfc2l6ZShjdHgsIHZlcnQsIEdMX0ZBTFNFKTsKIAogICAgLyogc3BhbiBpbml0ICovCiAgICBJTklUX1NQQU4oc3BhbiwgR0xfUE9JTlQpOwogICAgc3Bhbi5pbnRlcnBNYXNrID0gU1BBTl9aIHwgU1BBTl9SR0JBOwogCisgICBzcGFuLmZhY2luZyA9IHN3cmFzdC0+UG9pbnRMaW5lRmFjaW5nOworCiAgICBzcGFuLnJlZCAgID0gQ2hhblRvRml4ZWQodmVydC0+Y29sb3JbMF0pOwogICAgc3Bhbi5ncmVlbiA9IENoYW5Ub0ZpeGVkKHZlcnQtPmNvbG9yWzFdKTsKICAgIHNwYW4uYmx1ZSAgPSBDaGFuVG9GaXhlZCh2ZXJ0LT5jb2xvclsyXSk7CkBAIC0xODYsOSArMjA5LDEwIEBACiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgIC8qIGV2ZW4gc2l6ZSAqLwotICAgICAgICAgeG1pbiA9IChHTGludCkgeCAtIGlSYWRpdXMgKyAxOworICAgICAgICAgLyogMC41MDEgZmFjdG9yIGFsbG93cyBjb25mb3JtYW5jZSB0byBwYXNzICovCisgICAgICAgICB4bWluID0gKEdMaW50KSAoeCArIDAuNTAxKSAtIGlSYWRpdXM7CiAgICAgICAgICB4bWF4ID0geG1pbiArIGlTaXplIC0gMTsKLSAgICAgICAgIHltaW4gPSAoR0xpbnQpIHkgLSBpUmFkaXVzICsgMTsKKyAgICAgICAgIHltaW4gPSAoR0xpbnQpICh5ICsgMC41MDEpIC0gaVJhZGl1czsKICAgICAgICAgIHltYXggPSB5bWluICsgaVNpemUgLSAxOwogICAgICAgfQogCkBAIC0yMzYsMTggKzI2MCw3IEBACiAgICAgICBzcGFuLnogPSAoR0x1aW50KSAodmVydC0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzJdICsgMC41Rik7CiAgICBzcGFuLnpTdGVwID0gMDsKIAotICAgLyogY29tcHV0ZSBzaXplICovCi0gICBpZiAoY3R4LT5Qb2ludC5fQXR0ZW51YXRlZCB8fCBjdHgtPlZlcnRleFByb2dyYW0uUG9pbnRTaXplRW5hYmxlZCkgewotICAgICAgLyogdXNlIHZlcnRleCdzIHBvaW50IHNpemUgKi8KLSAgICAgIC8qIGZpcnN0LCBjbGFtcCBhdHRlbnVhdGVkIHNpemUgdG8gdGhlIHVzZXItc3BlY2lmZWQgcmFuZ2UgKi8KLSAgICAgIHNpemUgPSBDTEFNUCh2ZXJ0LT5wb2ludFNpemUsIGN0eC0+UG9pbnQuTWluU2l6ZSwgY3R4LT5Qb2ludC5NYXhTaXplKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgLyogdXNlIGNvbnN0YW50IHBvaW50IHNpemUgKi8KLSAgICAgIHNpemUgPSBjdHgtPlBvaW50LlNpemU7Ci0gICB9Ci0gICAvKiBjbGFtcCB0byBBQSBpbXBsZW1lbnRhdGlvbiBsaW1pdHMgKi8KLSAgIHNpemUgPSBDTEFNUChzaXplLCBjdHgtPkNvbnN0Lk1pblBvaW50U2l6ZUFBLCBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZUFBKTsKKyAgIHNpemUgPSBnZXRfc2l6ZShjdHgsIHZlcnQsIEdMX1RSVUUpOwogCiAgICAvKiBhbHBoYSBhdHRlbnVhdGlvbiAvIGZhZGUgZmFjdG9yICovCiAgICBpZiAoY3R4LT5NdWx0aXNhbXBsZS5fRW5hYmxlZCkgewpAQCAtMjY5LDYgKzI4Miw4IEBACiAgICBzcGFuLmludGVycE1hc2sgPSBTUEFOX1ogfCBTUEFOX1JHQkE7CiAgICBzcGFuLmFycmF5TWFzayA9IFNQQU5fQ09WRVJBR0UgfCBTUEFOX01BU0s7CiAKKyAgIHNwYW4uZmFjaW5nID0gc3dyYXN0LT5Qb2ludExpbmVGYWNpbmc7CisKICAgIHNwYW4ucmVkICAgPSBDaGFuVG9GaXhlZCh2ZXJ0LT5jb2xvclswXSk7CiAgICBzcGFuLmdyZWVuID0gQ2hhblRvRml4ZWQodmVydC0+Y29sb3JbMV0pOwogICAgc3Bhbi5ibHVlICA9IENoYW5Ub0ZpeGVkKHZlcnQtPmNvbG9yWzJdKTsKQEAgLTM3MCwyMiArMzg1LDEyIEBACiAgICAgICBzcGFuLnogPSAoR0x1aW50KSAodmVydC0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzJdICsgMC41Rik7CiAgICBzcGFuLnpTdGVwID0gMDsKIAotICAgLyogY29tcHV0ZSBzaXplICovCi0gICBpZiAoY3R4LT5Qb2ludC5fQXR0ZW51YXRlZCB8fCBjdHgtPlZlcnRleFByb2dyYW0uUG9pbnRTaXplRW5hYmxlZCkgewotICAgICAgLyogdXNlIHZlcnRleCdzIHBvaW50IHNpemUgKi8KLSAgICAgIC8qIGZpcnN0LCBjbGFtcCBhdHRlbnVhdGVkIHNpemUgdG8gdGhlIHVzZXItc3BlY2lmZWQgcmFuZ2UgKi8KLSAgICAgIHNpemUgPSBDTEFNUCh2ZXJ0LT5wb2ludFNpemUsIGN0eC0+UG9pbnQuTWluU2l6ZSwgY3R4LT5Qb2ludC5NYXhTaXplKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgLyogdXNlIGNvbnN0YW50IHBvaW50IHNpemUgKi8KLSAgICAgIHNpemUgPSBjdHgtPlBvaW50LlNpemU7Ci0gICB9Ci0gICAvKiBjbGFtcCB0byBub24tQUEgaW1wbGVtZW50YXRpb24gbGltaXRzICovCi0gICBzaXplID0gQ0xBTVAoc2l6ZSwgY3R4LT5Db25zdC5NaW5Qb2ludFNpemUsIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplKTsKKyAgIHNpemUgPSBnZXRfc2l6ZShjdHgsIHZlcnQsIEdMX0ZBTFNFKTsKIAogICAgLyogc3BhbiBpbml0ICovCiAgICBJTklUX1NQQU4oc3BhbiwgR0xfUE9JTlQpOwogICAgc3Bhbi5hcnJheU1hc2sgPSBTUEFOX1hZOworICAgc3Bhbi5mYWNpbmcgPSBzd3Jhc3QtPlBvaW50TGluZUZhY2luZzsKIAogICAgaWYgKGNpTW9kZSkgewogICAgICAgc3Bhbi5pbnRlcnBNYXNrID0gU1BBTl9aIHwgU1BBTl9JTkRFWDsKQEAgLTQzNSw5ICs0NDAsMTAgQEAKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICAgLyogZXZlbiBzaXplICovCi0gICAgICAgICB4bWluID0gKEdMaW50KSB4IC0gaVJhZGl1cyArIDE7CisgICAgICAgICAvKiAwLjUwMSBmYWN0b3IgYWxsb3dzIGNvbmZvcm1hbmNlIHRvIHBhc3MgKi8KKyAgICAgICAgIHhtaW4gPSAoR0xpbnQpICh4ICsgMC41MDEpIC0gaVJhZGl1czsKICAgICAgICAgIHhtYXggPSB4bWluICsgaVNpemUgLSAxOwotICAgICAgICAgeW1pbiA9IChHTGludCkgeSAtIGlSYWRpdXMgKyAxOworICAgICAgICAgeW1pbiA9IChHTGludCkgKHkgKyAwLjUwMSkgLSBpUmFkaXVzOwogICAgICAgICAgeW1heCA9IHltaW4gKyBpU2l6ZSAtIDE7CiAgICAgICB9CiAKQEAgLTQ5MSwxNiArNDk3LDIxIEBACiAKICAgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gZmx1c2ggKi8KICAgIGlmIChzcGFuLT5lbmQgPj0gTUFYX1dJRFRIIHx8Ci0gICAgICAgKHN3cmFzdC0+X1Jhc3Rlck1hc2sgJiAoQkxFTkRfQklUIHwgTE9HSUNfT1BfQklUIHwgTUFTS0lOR19CSVQpKSkgewotICAgICAgaWYgKGNpTW9kZSkKLSAgICAgICAgIF9zd3Jhc3Rfd3JpdGVfaW5kZXhfc3BhbihjdHgsIHNwYW4pOwotICAgICAgZWxzZQotICAgICAgICAgX3N3cmFzdF93cml0ZV9yZ2JhX3NwYW4oY3R4LCBzcGFuKTsKLSAgICAgIHNwYW4tPmVuZCA9IDA7CisgICAgICAgKHN3cmFzdC0+X1Jhc3Rlck1hc2sgJiAoQkxFTkRfQklUIHwgTE9HSUNfT1BfQklUIHwgTUFTS0lOR19CSVQpKSB8fAorICAgICAgIHNwYW4tPmZhY2luZyAhPSBzd3Jhc3QtPlBvaW50TGluZUZhY2luZykgeworICAgICAgaWYgKHNwYW4tPmVuZCA+IDApIHsKKyAgICAgICAgIGlmIChjaU1vZGUpCisgICAgICAgICAgICBfc3dyYXN0X3dyaXRlX2luZGV4X3NwYW4oY3R4LCBzcGFuKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9zd3Jhc3Rfd3JpdGVfcmdiYV9zcGFuKGN0eCwgc3Bhbik7CisgICAgICAgICBzcGFuLT5lbmQgPSAwOworICAgICAgfQogICAgfQogCiAgICBjb3VudCA9IHNwYW4tPmVuZDsKIAorICAgc3Bhbi0+ZmFjaW5nID0gc3dyYXN0LT5Qb2ludExpbmVGYWNpbmc7CisKICAgIC8qIGZyYWdtZW50IGF0dHJpYnV0ZXMgKi8KICAgIGlmIChjaU1vZGUpIHsKICAgICAgIHNwYW4tPmFycmF5LT5pbmRleFtjb3VudF0gPSAoR0x1aW50KSB2ZXJ0LT5hdHRyaWJbRlJBR19BVFRSSUJfQ0ldWzBdOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfcmVhZHBpeC5jIGIvc3JjL21lc2Evc3dyYXN0L3NfcmVhZHBpeC5jCmluZGV4IDYxODZmOTIuLjhmYTk1ZGUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zX3JlYWRwaXguYworKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc19yZWFkcGl4LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4zCisgKiBWZXJzaW9uOiAgNy4wLjMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMTI5LDcgKzEyOSw4IEBACiAgICAgICAgICByYi0+R2V0Um93KGN0eCwgcmIsIHdpZHRoLCB4LCB5LCBkZXN0KTsKICAgICAgICAgIC8qIGNvbnZlcnQgcmFuZ2UgZnJvbSAyNC1iaXQgdG8gMzItYml0ICovCiAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgd2lkdGg7IGsrKykgewotICAgICAgICAgICAgZGVzdFtrXSA9IChkZXN0W2tdIDw8IDgpIHwgKGRlc3Rba10gPj4gMjQpOworICAgICAgICAgICAgLyogTm90ZTogcHV0IE1TQnl0ZSBvZiAyNC1iaXQgdmFsdWUgaW50byBMU0J5dGUgKi8KKyAgICAgICAgICAgIGRlc3Rba10gPSAoZGVzdFtrXSA8PCA4KSB8ICgoZGVzdFtrXSA+PiAxNikgJiAweGZmKTsKICAgICAgICAgIH0KICAgICAgIH0KICAgIH0KQEAgLTU2OSwxMyArNTcwLDE0IEBACiAgICAvKiBEbyBhbGwgbmVlZGVkIGNsaXBwaW5nIGhlcmUsIHNvIHRoYXQgd2UgY2FuIGZvcmdldCBhYm91dCBpdCBsYXRlciAqLwogICAgaWYgKCFfbWVzYV9jbGlwX3JlYWRwaXhlbHMoY3R4LCAmeCwgJnksICZ3aWR0aCwgJmhlaWdodCwgJmNsaXBwZWRQYWNraW5nKSkgewogICAgICAgLyogVGhlIFJlYWRQaXhlbHMgcmVnaW9uIGlzIHRvdGFsbHkgb3V0c2lkZSB0aGUgd2luZG93IGJvdW5kcyAqLwotICAgICAgZ290byBlbmQ7CisgICAgICBSRU5ERVJfRklOSVNIKHN3cmFzdCwgY3R4KTsKKyAgICAgIHJldHVybjsKICAgIH0KIAogICAgcGl4ZWxzID0gX21lc2FfbWFwX3JlYWRwaXhfcGJvKGN0eCwgJmNsaXBwZWRQYWNraW5nLCBwaXhlbHMpOwogICAgaWYgKCFwaXhlbHMpCiAgICAgICByZXR1cm47Ci0KKyAgCiAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgY2FzZSBHTF9DT0xPUl9JTkRFWDoKICAgICAgICAgIHJlYWRfaW5kZXhfcGl4ZWxzKGN0eCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdHlwZSwgcGl4ZWxzLApAQCAtNjEyLDggKzYxNCw2IEBACiAgICAgICAgICAvKiBkb24ndCByZXR1cm4geWV0LCBjbGVhbi11cCAqLwogICAgfQogCi0KLWVuZDoKICAgIFJFTkRFUl9GSU5JU0goc3dyYXN0LCBjdHgpOwogCiAgICBfbWVzYV91bm1hcF9yZWFkcGl4X3BibyhjdHgsICZjbGlwcGVkUGFja2luZyk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19zcGFuLmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc19zcGFuLmMKaW5kZXggNDU3ZGM0YS4uMDFiNDkwZiAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3Nfc3Bhbi5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX3NwYW4uYwpAQCAtNjQsOCArNjQsMTEgQEAKICAgICAgIGNvbnN0IEdMZmxvYXQgZGVwdGhNYXggPSBjdHgtPkRyYXdCdWZmZXItPl9EZXB0aE1heEY7CiAgICAgICBpZiAoY3R4LT5EcmF3QnVmZmVyLT5WaXN1YWwuZGVwdGhCaXRzIDw9IDE2KQogICAgICAgICAgc3Bhbi0+eiA9IEZsb2F0VG9GaXhlZChjdHgtPkN1cnJlbnQuUmFzdGVyUG9zWzJdICogZGVwdGhNYXggKyAwLjVGKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHNwYW4tPnogPSAoR0xpbnQpIChjdHgtPkN1cnJlbnQuUmFzdGVyUG9zWzJdICogZGVwdGhNYXggKyAwLjVGKTsKKyAgICAgIGVsc2UgeworICAgICAgICAgR0xmbG9hdCB0bXBmID0gY3R4LT5DdXJyZW50LlJhc3RlclBvc1syXSAqIGRlcHRoTWF4OyAKKyAgICAgICAgIHRtcGYgPSBNSU4yKHRtcGYsIGRlcHRoTWF4KTsKKyAgICAgICAgIHNwYW4tPnogPSAoR0xpbnQpdG1wZjsKKyAgICAgIH0KICAgICAgIHNwYW4tPnpTdGVwID0gMDsKICAgICAgIHNwYW4tPmludGVycE1hc2sgfD0gU1BBTl9aOwogICAgfQpAQCAtNzg5LDYgKzc5Miw3IEBACiAgICBjb25zdCBTV2NvbnRleHQgKnN3cmFzdCA9IFNXUkFTVF9DT05URVhUKGN0eCk7CiAgICBjb25zdCBHTGJpdGZpZWxkIG9yaWdJbnRlcnBNYXNrID0gc3Bhbi0+aW50ZXJwTWFzazsKICAgIGNvbnN0IEdMYml0ZmllbGQgb3JpZ0FycmF5TWFzayA9IHNwYW4tPmFycmF5TWFzazsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPkRyYXdCdWZmZXI7CiAKICAgIEFTU0VSVChzcGFuLT5lbmQgPD0gTUFYX1dJRFRIKTsKICAgIEFTU0VSVChzcGFuLT5wcmltaXRpdmUgPT0gR0xfUE9JTlQgIHx8ICBzcGFuLT5wcmltaXRpdmUgPT0gR0xfTElORSB8fApAQCAtODE1LDcgKzgxOSw3IEBACiAgICB9CiAKICAgIC8qIERlcHRoIGJvdW5kcyB0ZXN0ICovCi0gICBpZiAoY3R4LT5EZXB0aC5Cb3VuZHNUZXN0ICYmIGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLmRlcHRoQml0cyA+IDApIHsKKyAgIGlmIChjdHgtPkRlcHRoLkJvdW5kc1Rlc3QgJiYgZmItPlZpc3VhbC5kZXB0aEJpdHMgPiAwKSB7CiAgICAgICBpZiAoIV9zd3Jhc3RfZGVwdGhfYm91bmRzX3Rlc3QoY3R4LCBzcGFuKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgfQpAQCAtODI3LDEwICs4MzEsMTAgQEAKICAgICAgIEdMdWludCBpOwogICAgICAgZm9yIChpID0gMDsgaSA8IHNwYW4tPmVuZDsgaSsrKSB7CiAgICAgICAgICBpZiAoc3Bhbi0+YXJyYXktPm1hc2tbaV0pIHsKLSAgICAgICAgICAgIGFzc2VydChzcGFuLT5hcnJheS0+eFtpXSA+PSBjdHgtPkRyYXdCdWZmZXItPl9YbWluKTsKLSAgICAgICAgICAgIGFzc2VydChzcGFuLT5hcnJheS0+eFtpXSA8IGN0eC0+RHJhd0J1ZmZlci0+X1htYXgpOwotICAgICAgICAgICAgYXNzZXJ0KHNwYW4tPmFycmF5LT55W2ldID49IGN0eC0+RHJhd0J1ZmZlci0+X1ltaW4pOwotICAgICAgICAgICAgYXNzZXJ0KHNwYW4tPmFycmF5LT55W2ldIDwgY3R4LT5EcmF3QnVmZmVyLT5fWW1heCk7CisgICAgICAgICAgICBhc3NlcnQoc3Bhbi0+YXJyYXktPnhbaV0gPj0gZmItPl9YbWluKTsKKyAgICAgICAgICAgIGFzc2VydChzcGFuLT5hcnJheS0+eFtpXSA8IGZiLT5fWG1heCk7CisgICAgICAgICAgICBhc3NlcnQoc3Bhbi0+YXJyYXktPnlbaV0gPj0gZmItPl9ZbWluKTsKKyAgICAgICAgICAgIGFzc2VydChzcGFuLT5hcnJheS0+eVtpXSA8IGZiLT5fWW1heCk7CiAgICAgICAgICB9CiAgICAgICB9CiAgICB9CkBAIC04NzMsNyArODc3LDcgQEAKICNlbmRpZgogCiAgICAvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgYWZ0ZXIgb2NjbHVzaW9uIHRvIGRvIHRoaXMgdGVzdCAqLwotICAgaWYgKGN0eC0+Q29sb3IuRHJhd0J1ZmZlciA9PSBHTF9OT05FIHx8IGN0eC0+Q29sb3IuSW5kZXhNYXNrID09IDApIHsKKyAgIGlmIChjdHgtPkNvbG9yLkluZGV4TWFzayA9PSAwKSB7CiAgICAgICAvKiB3cml0ZSBubyBwaXhlbHMgKi8KICAgICAgIHNwYW4tPmFycmF5TWFzayA9IG9yaWdBcnJheU1hc2s7CiAgICAgICByZXR1cm47CkBAIC05MDksMjIgKzkxMywyMSBAQAogICAgICogV3JpdGUgdG8gcmVuZGVyYnVmZmVycwogICAgICovCiAgICB7Ci0gICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOwotICAgICAgY29uc3QgR0x1aW50IG91dHB1dCA9IDA7IC8qIG9ubHkgZnJhZyBwcm9ncyBjYW4gd3JpdGUgdG8gb3RoZXIgb3V0cHV0cyAqLwotICAgICAgY29uc3QgR0x1aW50IG51bURyYXdCdWZmZXJzID0gZmItPl9OdW1Db2xvckRyYXdCdWZmZXJzW291dHB1dF07Ci0gICAgICBHTHVpbnQgaW5kZXhTYXZlW01BWF9XSURUSF07CisgICAgICBjb25zdCBHTHVpbnQgbnVtQnVmZmVycyA9IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsKICAgICAgIEdMdWludCBidWY7CiAKLSAgICAgIGlmIChudW1EcmF3QnVmZmVycyA+IDEpIHsKLSAgICAgICAgIC8qIHNhdmUgaW5kZXhlcyBmb3Igc2Vjb25kLCB0aGlyZCByZW5kZXJidWZmZXIgd3JpdGVzICovCi0gICAgICAgICBfbWVzYV9tZW1jcHkoaW5kZXhTYXZlLCBzcGFuLT5hcnJheS0+aW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+ZW5kICogc2l6ZW9mKGluZGV4U2F2ZVswXSkpOwotICAgICAgfQorICAgICAgZm9yIChidWYgPSAwOyBidWYgPCBudW1CdWZmZXJzOyBidWYrKykgeworICAgICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbYnVmXTsKKyAgICAgICAgIEdMdWludCBpbmRleFNhdmVbTUFYX1dJRFRIXTsKIAotICAgICAgZm9yIChidWYgPSAwOyBidWYgPCBmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnNbb3V0cHV0XTsgYnVmKyspIHsKLSAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gZmItPl9Db2xvckRyYXdCdWZmZXJzW291dHB1dF1bYnVmXTsKICAgICAgICAgIEFTU0VSVChyYi0+X0Jhc2VGb3JtYXQgPT0gR0xfQ09MT1JfSU5ERVgpOwogCisgICAgICAgICBpZiAobnVtQnVmZmVycyA+IDEpIHsKKyAgICAgICAgICAgIC8qIHNhdmUgaW5kZXhlcyBmb3Igc2Vjb25kLCB0aGlyZCByZW5kZXJidWZmZXIgd3JpdGVzICovCisgICAgICAgICAgICBfbWVzYV9tZW1jcHkoaW5kZXhTYXZlLCBzcGFuLT5hcnJheS0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+ZW5kICogc2l6ZW9mKGluZGV4U2F2ZVswXSkpOworICAgICAgICAgfQorCiAgICAgICAgICBpZiAoY3R4LT5Db2xvci5JbmRleExvZ2ljT3BFbmFibGVkKSB7CiAgICAgICAgICAgICBfc3dyYXN0X2xvZ2ljb3BfY2lfc3BhbihjdHgsIHJiLCBzcGFuKTsKICAgICAgICAgIH0KQEAgLTk5OSw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgIH0KIAotICAgICAgICAgaWYgKGJ1ZiArIDEgPCBudW1EcmF3QnVmZmVycykgeworICAgICAgICAgaWYgKGJ1ZiArIDEgPCBudW1CdWZmZXJzKSB7CiAgICAgICAgICAgICAvKiByZXN0b3JlIG9yaWdpbmFsIHNwYW4gdmFsdWVzICovCiAgICAgICAgICAgICBfbWVzYV9tZW1jcHkoc3Bhbi0+YXJyYXktPmluZGV4LCBpbmRleFNhdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+ZW5kICogc2l6ZW9mKGluZGV4U2F2ZVswXSkpOwpAQCAtMTExNiw3ICsxMTE5LDcgQEAKIAogLyoqCiAgKiBDb252ZXJ0IHRoZSBzcGFuJ3MgY29sb3IgYXJyYXlzIHRvIHRoZSBnaXZlbiB0eXBlLgotICogVGhlIG9ubHkgd2F5ICdvdXRwdXQnIGNhbiBiZSBncmVhdGVyIHRoYW4gb25lIGlzIHdoZW4gd2UgaGF2ZSBhIGZyYWdtZW50CisgKiBUaGUgb25seSB3YXkgJ291dHB1dCcgY2FuIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGlzIHdoZW4gd2UgaGF2ZSBhIGZyYWdtZW50CiAgKiBwcm9ncmFtIHRoYXQgd3JpdGVzIHRvIGdsX0ZyYWdEYXRhWzFdIG9yIGhpZ2hlci4KICAqIFxwYXJhbSBvdXRwdXQgIHdoaWNoIGZyYWdtZW50IHByb2dyYW0gY29sb3Igb3V0cHV0IGlzIGJlaW5nIHByb2Nlc3NlZAogICovCkBAIC0xMTgwLDggKzExODMsMTAgQEAKICAgICAgIGlmIChzcGFuLT5wcmltaXRpdmUgPT0gR0xfQklUTUFQICYmIHNwYW4tPmFycmF5LT5DaGFuVHlwZSAhPSBHTF9GTE9BVCkgewogICAgICAgICAgY29udmVydF9jb2xvcl90eXBlKHNwYW4sIEdMX0ZMT0FULCAwKTsKICAgICAgIH0KLSAgICAgIGlmIChzcGFuLT5wcmltaXRpdmUgIT0gR0xfUE9JTlQgfHwgY3R4LT5Qb2ludC5Qb2ludFNwcml0ZSkgewotICAgICAgICAgLyogZm9yIHBvaW50cywgd2UgcG9wdWxhdGVkIHRoZSBhcnJheXMgYWxyZWFkeSAqLworICAgICAgaWYgKHNwYW4tPnByaW1pdGl2ZSAhPSBHTF9QT0lOVCB8fAorCSAgKHNwYW4tPmludGVycE1hc2sgJiBTUEFOX1JHQkEpIHx8CisJICBjdHgtPlBvaW50LlBvaW50U3ByaXRlKSB7CisgICAgICAgICAvKiBmb3Igc2luZ2xlLXBpeGVsIHBvaW50cywgd2UgcG9wdWxhdGVkIHRoZSBhcnJheXMgYWxyZWFkeSAqLwogICAgICAgICAgaW50ZXJwb2xhdGVfYWN0aXZlX2F0dHJpYnMoY3R4LCBzcGFuLCB+MCk7CiAgICAgICB9CiAgICAgICBzcGFuLT5hcnJheS0+Q2hhblR5cGUgPSBHTF9GTE9BVDsKQEAgLTEyNDYsNyArMTI1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuX0VuYWJsZWQpOwogICAgY29uc3QgR0xib29sZWFuIHNoYWRlck9yVGV4dHVyZSA9IHNoYWRlciB8fCBjdHgtPlRleHR1cmUuX0VuYWJsZWRVbml0czsKICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBjdHgtPkRyYXdCdWZmZXI7Ci0gICBHTHVpbnQgb3V0cHV0OwogCiAgICAvKgogICAgcHJpbnRmKCIlcygpICBpbnRlcnAgMHgleCAgYXJyYXkgMHgleFxuIiwgX19GVU5DVElPTl9fLApAQCAtMTM5Niw2NyArMTQwMCw2NyBAQAogICAgLyoKICAgICAqIFdyaXRlIHRvIHJlbmRlcmJ1ZmZlcnMKICAgICAqLwotICAgLyogTG9vcCBvdmVyIGNvbG9yIG91dHB1dHMgKEdMX0FSQl9kcmF3X2J1ZmZlcnMpIHdyaXR0ZW4gYnkgZnJhZyBwcm9nICovCi0gICBmb3IgKG91dHB1dCA9IDA7IG91dHB1dCA8IHN3cmFzdC0+X051bUNvbG9yT3V0cHV0czsgb3V0cHV0KyspIHsKLSAgICAgIGlmIChzd3Jhc3QtPl9Db2xvck91dHB1dHNNYXNrICYgKDEgPDwgb3V0cHV0KSkgewotICAgICAgICBjb25zdCBHTHVpbnQgbnVtRHJhd0J1ZmZlcnMgPSBmYi0+X051bUNvbG9yRHJhd0J1ZmZlcnNbb3V0cHV0XTsKLSAgICAgICAgR0xjaGFuIHJnYmFTYXZlW01BWF9XSURUSF1bNF07Ci0gICAgICAgIEdMdWludCBidWY7CisgICB7CisgICAgICBjb25zdCBHTHVpbnQgbnVtQnVmZmVycyA9IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsKKyAgICAgIGNvbnN0IEdMYm9vbGVhbiBtdWx0aUZyYWdPdXRwdXRzID0gbnVtQnVmZmVycyA+IDE7CisgICAgICBHTHVpbnQgYnVmOwogCi0gICAgICAgIEFTU0VSVChudW1EcmF3QnVmZmVycyA+IDApOworICAgICAgZm9yIChidWYgPSAwOyBidWYgPCBudW1CdWZmZXJzOyBidWYrKykgeworICAgICAgICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbYnVmXTsKIAotICAgICAgICBpZiAoZmItPl9Db2xvckRyYXdCdWZmZXJzW291dHB1dF1bMF0tPkRhdGFUeXBlCi0gICAgICAgICAgICAhPSBzcGFuLT5hcnJheS0+Q2hhblR5cGUgfHwgb3V0cHV0ID4gMCkgewotICAgICAgICAgICBjb252ZXJ0X2NvbG9yX3R5cGUoc3BhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLT5fQ29sb3JEcmF3QnVmZmVyc1tvdXRwdXRdWzBdLT5EYXRhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0gICAgICAgIH0KKyAgICAgICAgIC8qIGNvbG9yW2ZyYWdPdXRwdXRdIHdpbGwgYmUgd3JpdHRlbiB0byBidWZmZXJbYnVmXSAqLwogCi0gICAgICAgIGlmIChudW1EcmF3QnVmZmVycyA+IDEpIHsKLSAgICAgICAgICAgLyogc2F2ZSBjb2xvcnMgZm9yIHNlY29uZCwgdGhpcmQgcmVuZGVyYnVmZmVyIHdyaXRlcyAqLwotICAgICAgICAgICBfbWVzYV9tZW1jcHkocmdiYVNhdmUsIHNwYW4tPmFycmF5LT5yZ2JhLAotICAgICAgICAgICAgICAgICAgICAgICAgNCAqIHNwYW4tPmVuZCAqIHNpemVvZihHTGNoYW4pKTsKLSAgICAgICAgfQorICAgICAgICAgaWYgKHJiKSB7CisgICAgICAgICAgICBHTGNoYW4gcmdiYVNhdmVbTUFYX1dJRFRIXVs0XTsKKyAgICAgICAgICAgIGNvbnN0IEdMdWludCBmcmFnT3V0cHV0ID0gbXVsdGlGcmFnT3V0cHV0cyA/IGJ1ZiA6IDA7CiAKLSAgICAgICAgLyogTG9vcCBvdmVyIHJlbmRlcmJ1ZmZlcnMgKGkuZS4gR0xfRlJPTlRfQU5EX0JBQ0spICovCi0gICAgICAgIGZvciAoYnVmID0gMDsgYnVmIDwgbnVtRHJhd0J1ZmZlcnM7IGJ1ZisrKSB7Ci0gICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gZmItPl9Db2xvckRyYXdCdWZmZXJzW291dHB1dF1bYnVmXTsKLSAgICAgICAgICAgQVNTRVJUKHJiLT5fQmFzZUZvcm1hdCA9PSBHTF9SR0JBIHx8IHJiLT5fQmFzZUZvcm1hdCA9PSBHTF9SR0IpOworICAgICAgICAgICAgaWYgKHJiLT5EYXRhVHlwZSAhPSBzcGFuLT5hcnJheS0+Q2hhblR5cGUgfHwgZnJhZ091dHB1dCA+IDApIHsKKyAgICAgICAgICAgICAgIGNvbnZlcnRfY29sb3JfdHlwZShzcGFuLCByYi0+RGF0YVR5cGUsIGZyYWdPdXRwdXQpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgIGlmIChjdHgtPkNvbG9yLl9Mb2dpY09wRW5hYmxlZCkgewotICAgICAgICAgICAgICBfc3dyYXN0X2xvZ2ljb3BfcmdiYV9zcGFuKGN0eCwgcmIsIHNwYW4pOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYgKGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkKSB7Ci0gICAgICAgICAgICAgIF9zd3Jhc3RfYmxlbmRfc3BhbihjdHgsIHJiLCBzcGFuKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtdWx0aUZyYWdPdXRwdXRzICYmIG51bUJ1ZmZlcnMgPiAxKSB7CisgICAgICAgICAgICAgICAvKiBzYXZlIGNvbG9ycyBmb3Igc2Vjb25kLCB0aGlyZCByZW5kZXJidWZmZXIgd3JpdGVzICovCisgICAgICAgICAgICAgICBfbWVzYV9tZW1jcHkocmdiYVNhdmUsIHNwYW4tPmFycmF5LT5yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBzcGFuLT5lbmQgKiBzaXplb2YoR0xjaGFuKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgaWYgKGNvbG9yTWFzayAhPSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgIF9zd3Jhc3RfbWFza19yZ2JhX3NwYW4oY3R4LCByYiwgc3Bhbik7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVChyYi0+X0Jhc2VGb3JtYXQgPT0gR0xfUkdCQSB8fCByYi0+X0Jhc2VGb3JtYXQgPT0gR0xfUkdCKTsKIAotICAgICAgICAgICBpZiAoc3Bhbi0+YXJyYXlNYXNrICYgU1BBTl9YWSkgewotICAgICAgICAgICAgICAvKiBhcnJheSBvZiBwaXhlbCBjb29yZHMgKi8KLSAgICAgICAgICAgICAgQVNTRVJUKHJiLT5QdXRWYWx1ZXMpOwotICAgICAgICAgICAgICByYi0+UHV0VmFsdWVzKGN0eCwgcmIsIHNwYW4tPmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLT5hcnJheS0+eCwgc3Bhbi0+YXJyYXktPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+YXJyYXktPnJnYmEsIHNwYW4tPmFycmF5LT5tYXNrKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCBydW4gb2YgcGl4ZWxzICovCi0gICAgICAgICAgICAgIEFTU0VSVChyYi0+UHV0Um93KTsKLSAgICAgICAgICAgICAgcmItPlB1dFJvdyhjdHgsIHJiLCBzcGFuLT5lbmQsIHNwYW4tPngsIHNwYW4tPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+YXJyYXktPnJnYmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+d3JpdGVBbGwgPyBOVUxMOiBzcGFuLT5hcnJheS0+bWFzayk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdHgtPkNvbG9yLl9Mb2dpY09wRW5hYmxlZCkgeworICAgICAgICAgICAgICAgX3N3cmFzdF9sb2dpY29wX3JnYmFfc3BhbihjdHgsIHJiLCBzcGFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGN0eC0+Q29sb3IuQmxlbmRFbmFibGVkKSB7CisgICAgICAgICAgICAgICBfc3dyYXN0X2JsZW5kX3NwYW4oY3R4LCByYiwgc3Bhbik7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgaWYgKGJ1ZiArIDEgPCBudW1EcmF3QnVmZmVycykgewotICAgICAgICAgICAgICAvKiByZXN0b3JlIG9yaWdpbmFsIHNwYW4gdmFsdWVzICovCi0gICAgICAgICAgICAgIF9tZXNhX21lbWNweShzcGFuLT5hcnJheS0+cmdiYSwgcmdiYVNhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogc3Bhbi0+ZW5kICogc2l6ZW9mKEdMY2hhbikpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogZm9yIGJ1ZiAqLwotICAgICAgfSAvKiBpZiBvdXRwdXQgaXMgd3JpdHRlbiB0byAqLwotICAgfSAvKiBmb3Igb3V0cHV0ICovCisgICAgICAgICAgICBpZiAoY29sb3JNYXNrICE9IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgIF9zd3Jhc3RfbWFza19yZ2JhX3NwYW4oY3R4LCByYiwgc3Bhbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcGFuLT5hcnJheU1hc2sgJiBTUEFOX1hZKSB7CisgICAgICAgICAgICAgICAvKiBhcnJheSBvZiBwaXhlbCBjb29yZHMgKi8KKyAgICAgICAgICAgICAgIEFTU0VSVChyYi0+UHV0VmFsdWVzKTsKKyAgICAgICAgICAgICAgIHJiLT5QdXRWYWx1ZXMoY3R4LCByYiwgc3Bhbi0+ZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLT5hcnJheS0+eCwgc3Bhbi0+YXJyYXktPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4tPmFycmF5LT5yZ2JhLCBzcGFuLT5hcnJheS0+bWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgcnVuIG9mIHBpeGVscyAqLworICAgICAgICAgICAgICAgQVNTRVJUKHJiLT5QdXRSb3cpOworICAgICAgICAgICAgICAgcmItPlB1dFJvdyhjdHgsIHJiLCBzcGFuLT5lbmQsIHNwYW4tPngsIHNwYW4tPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4tPmFycmF5LT5yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLT53cml0ZUFsbCA/IE5VTEw6IHNwYW4tPmFycmF5LT5tYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtdWx0aUZyYWdPdXRwdXRzICYmIG51bUJ1ZmZlcnMgPiAxKSB7CisgICAgICAgICAgICAgICAvKiByZXN0b3JlIG9yaWdpbmFsIHNwYW4gdmFsdWVzICovCisgICAgICAgICAgICAgICBfbWVzYV9tZW1jcHkoc3Bhbi0+YXJyYXktPnJnYmEsIHJnYmFTYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBzcGFuLT5lbmQgKiBzaXplb2YoR0xjaGFuKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIH0gLyogaWYgcmIgKi8KKyAgICAgIH0gLyogZm9yIGJ1ZiAqLworICAgfQogCiBlbmQ6CiAgICAvKiByZXN0b3JlIHRoZXNlIHZhbHVlcyBiZWZvcmUgcmV0dXJuaW5nICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc19zdGVuY2lsLmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc19zdGVuY2lsLmMKaW5kZXggY2RiN2U0Ni4uYzkyNTkyMiAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3Nfc3RlbmNpbC5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX3N0ZW5jaWwuYwpAQCAtOTIzLDYgKzkyMyw4IEBACiAgICAgICBBU1NFUlQocmItPkRhdGFUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOwogICAgICAgX3N3cmFzdF9nZXRfdmFsdWVzKGN0eCwgcmIsIG4sIHgsIHksIHN0ZW5jaWwsIHNpemVvZihHTHVieXRlKSk7CiAKKyAgICAgIF9tZXNhX21lbWNweShvcmlnTWFzaywgbWFzaywgbiAqIHNpemVvZihHTHVieXRlKSk7ICAgICAgICAgIAorCiAgICAgICAodm9pZCkgZG9fc3RlbmNpbF90ZXN0KGN0eCwgZmFjZSwgbiwgc3RlbmNpbCwgbWFzayk7CiAKICAgICAgIGlmIChjdHgtPkRlcHRoLlRlc3QgPT0gR0xfRkFMU0UpIHsKQEAgLTkzMCwxMSArOTMyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sIHN0ZW5jaWwsIG1hc2spOwogICAgICAgfQogICAgICAgZWxzZSB7Ci0gICAgICAgICBfbWVzYV9tZW1jcHkob3JpZ01hc2ssIG1hc2ssIG4gKiBzaXplb2YoR0x1Ynl0ZSkpOworICAgICAgICAgR0x1Ynl0ZSB0bXBNYXNrW01BWF9XSURUSF07IAorICAgICAgICAgX21lc2FfbWVtY3B5KHRtcE1hc2ssIG1hc2ssIG4gKiBzaXplb2YoR0x1Ynl0ZSkpOwogCiAgICAgICAgICBfc3dyYXN0X2RlcHRoX3Rlc3Rfc3BhbihjdHgsIHNwYW4pOwogCi0gICAgICAgICBjb21wdXRlX3Bhc3NfZmFpbF9tYXNrcyhuLCBvcmlnTWFzaywgbWFzaywgcGFzc01hc2ssIGZhaWxNYXNrKTsKKyAgICAgICAgIGNvbXB1dGVfcGFzc19mYWlsX21hc2tzKG4sIHRtcE1hc2ssIG1hc2ssIHBhc3NNYXNrLCBmYWlsTWFzayk7CiAKICAgICAgICAgIGlmIChjdHgtPlN0ZW5jaWwuWkZhaWxGdW5jW2ZhY2VdICE9IEdMX0tFRVApIHsKICAgICAgICAgICAgIGFwcGx5X3N0ZW5jaWxfb3AoY3R4LCBjdHgtPlN0ZW5jaWwuWkZhaWxGdW5jW2ZhY2VdLCBmYWNlLApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfdGV4ZmlsdGVyLmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc190ZXhmaWx0ZXIuYwppbmRleCBiYjBmYzgyLi4xYjQ0ZmRkIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc190ZXhmaWx0ZXIuYworKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc190ZXhmaWx0ZXIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41LjMKKyAqIFZlcnNpb246ICA3LjAuMwogICoKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0yMTMsMTcgKzIxMywxMCBAQAogCiAKIC8qKgotICogQ29tcHV0ZSB0aGUgcmVtYWluZGVyIG9mIGEgZGl2aWRlZCBieSBiLCBidXQgYmUgY2FyZWZ1bCB3aXRoCi0gKiBuZWdhdGl2ZSB2YWx1ZXMgc28gdGhhdCBHTF9SRVBFQVQgbW9kZSB3b3JrcyByaWdodC4KKyAqIElmIEEgaXMgYSBzaWduZWQgaW50ZWdlciwgQSAlIEIgZG9lc24ndCBnaXZlIHRoZSByaWdodCB2YWx1ZSBmb3IgQSA8IDAKKyAqIChpbiB0ZXJtcyBvZiB0ZXh0dXJlIHJlcGVhdCkuICBKdXN0IGNhc3RpbmcgdG8gdW5zaWduZWQgZml4ZXMgdGhhdC4KICAqLwotc3RhdGljIElOTElORSBHTGludAotcmVwZWF0X3JlbWFpbmRlcihHTGludCBhLCBHTGludCBiKQotewotICAgaWYgKGEgPj0gMCkKLSAgICAgIHJldHVybiBhICUgYjsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAoYSArIDEpICUgYiArIGIgLSAxOwotfQorI2RlZmluZSBSRU1BSU5ERVIoQSwgQikgKCh1bnNpZ25lZCkgKEEpICUgKHVuc2lnbmVkKSAoQikpCiAKIAogLyoqCkBAIC0yNDYsOCArMjM5LDggQEAKICAgICAgICAgIEkxID0gKEkwICsgMSkgJiAoU0laRSAtIDEpOwkJCQkJXAogICAgICAgfQkJCQkJCQkJCVwKICAgICAgIGVsc2UgewkJCQkJCQkJXAotICAgICAgICAgSTAgPSByZXBlYXRfcmVtYWluZGVyKElGTE9PUihVKSwgU0laRSk7CQkJXAotICAgICAgICAgSTEgPSByZXBlYXRfcmVtYWluZGVyKEkwICsgMSwgU0laRSk7CQkJCVwKKyAgICAgICAgIEkwID0gUkVNQUlOREVSKElGTE9PUihVKSwgU0laRSk7CQkJCVwKKyAgICAgICAgIEkxID0gUkVNQUlOREVSKEkwICsgMSwgU0laRSk7CQkJCQlcCiAgICAgICB9CQkJCQkJCQkJXAogICAgICAgYnJlYWs7CQkJCQkJCQlcCiAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CQkJCQkJXApAQCAtMzY2LDcgKzM1OSw3IEBACiAgICAgICBpZiAoaW1nLT5fSXNQb3dlck9mVHdvKQkJCQkJCVwKICAgICAgICAgIEkgJj0gKFNJWkUgLSAxKTsJCQkJCQlcCiAgICAgICBlbHNlCQkJCQkJCQlcCi0gICAgICAgICBJID0gcmVwZWF0X3JlbWFpbmRlcihJLCBTSVpFKTsJCQkJCVwKKyAgICAgICAgIEkgPSBSRU1BSU5ERVIoSSwgU0laRSk7CQkJCQlcCiAgICAgICBicmVhazsJCQkJCQkJCVwKICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToJCQkJCQlcCiAgICAgICB7CQkJCQkJCQkJXApAQCAtMTA0Myw3ICsxMDM2LDcgQEAKICAgIEFTU0VSVCh0T2JqLT5XcmFwUyA9PSBHTF9SRVBFQVQpOwogICAgQVNTRVJUKHRPYmotPldyYXBUID09IEdMX1JFUEVBVCk7CiAgICBBU1NFUlQoaW1nLT5Cb3JkZXIgPT0gMCk7Ci0gICBBU1NFUlQoaW1nLT5fQmFzZUZvcm1hdCAhPSBHTF9DT0xPUl9JTkRFWCk7CisgICBBU1NFUlQoaW1nLT5UZXhGb3JtYXQtPkJhc2VGb3JtYXQgIT0gR0xfQ09MT1JfSU5ERVgpOwogICAgQVNTRVJUKGltZy0+X0lzUG93ZXJPZlR3byk7CiAKICAgIENPTVBVVEVfTElORUFSX1JFUEVBVF9URVhFTF9MT0NBVElPTih0ZXhjb29yZFswXSwgdSwgd2lkdGgsICBpMCwgaTEpOwpAQCAtMTE5OCw3ICsxMTkxLDggQEAKICAgICh2b2lkKSBsYW1iZGE7CiAgICBpZiAodE9iai0+V3JhcFMgPT0gR0xfUkVQRUFUICYmCiAgICAgICAgdE9iai0+V3JhcFQgPT0gR0xfUkVQRUFUICYmCi0gICAgICAgaW1hZ2UtPl9Jc1Bvd2VyT2ZUd28pIHsKKyAgICAgICBpbWFnZS0+X0lzUG93ZXJPZlR3byAmJgorICAgICAgIGltYWdlLT5Cb3JkZXIgPT0gMCkgewogICAgICAgZm9yIChpPTA7aTxuO2krKykgewogICAgICAgICAgc2FtcGxlXzJkX2xpbmVhcl9yZXBlYXQoY3R4LCB0T2JqLCBpbWFnZSwgdGV4Y29vcmRzW2ldLCByZ2JhW2ldKTsKICAgICAgIH0KQEAgLTEyMzcsNyArMTIzMSw3IEBACiAgICBBU1NFUlQodE9iai0+V3JhcFM9PUdMX1JFUEVBVCk7CiAgICBBU1NFUlQodE9iai0+V3JhcFQ9PUdMX1JFUEVBVCk7CiAgICBBU1NFUlQoaW1nLT5Cb3JkZXI9PTApOwotICAgQVNTRVJUKGltZy0+X0Jhc2VGb3JtYXQ9PUdMX1JHQik7CisgICBBU1NFUlQoaW1nLT5UZXhGb3JtYXQtPk1lc2FGb3JtYXQ9PU1FU0FfRk9STUFUX1JHQik7CiAgICBBU1NFUlQoaW1nLT5fSXNQb3dlck9mVHdvKTsKIAogICAgZm9yIChrPTA7IGs8bjsgaysrKSB7CkBAIC0xMjc4LDcgKzEyNzIsNyBAQAogICAgQVNTRVJUKHRPYmotPldyYXBTPT1HTF9SRVBFQVQpOwogICAgQVNTRVJUKHRPYmotPldyYXBUPT1HTF9SRVBFQVQpOwogICAgQVNTRVJUKGltZy0+Qm9yZGVyPT0wKTsKLSAgIEFTU0VSVChpbWctPl9CYXNlRm9ybWF0PT1HTF9SR0JBKTsKKyAgIEFTU0VSVChpbWctPlRleEZvcm1hdC0+TWVzYUZvcm1hdD09TUVTQV9GT1JNQVRfUkdCQSk7CiAgICBBU1NFUlQoaW1nLT5fSXNQb3dlck9mVHdvKTsKIAogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpAQCAtMTMwOCw3ICsxMzAyLDcgQEAKICAgIGNvbnN0IEdMYm9vbGVhbiByZXBlYXROb0JvcmRlclBPVCA9ICh0T2JqLT5XcmFwUyA9PSBHTF9SRVBFQVQpCiAgICAgICAmJiAodE9iai0+V3JhcFQgPT0gR0xfUkVQRUFUKQogICAgICAgJiYgKHRJbWctPkJvcmRlciA9PSAwICYmICh0SW1nLT5XaWR0aCA9PSB0SW1nLT5Sb3dTdHJpZGUpKQotICAgICAgJiYgKHRJbWctPl9CYXNlRm9ybWF0ICE9IEdMX0NPTE9SX0lOREVYKQorICAgICAgJiYgKHRJbWctPlRleEZvcm1hdC0+QmFzZUZvcm1hdCAhPSBHTF9DT0xPUl9JTkRFWCkKICAgICAgICYmIHRJbWctPl9Jc1Bvd2VyT2ZUd287CiAKICAgIEFTU0VSVChsYW1iZGEgIT0gTlVMTCk7CkBAIC0xMzIzLDE2ICsxMzE3LDEwIEBACiAgICAgICAgICBpZiAocmVwZWF0Tm9Cb3JkZXJQT1QpIHsKICAgICAgICAgICAgIHN3aXRjaCAodEltZy0+VGV4Rm9ybWF0LT5NZXNhRm9ybWF0KSB7CiAgICAgICAgICAgICBjYXNlIE1FU0FfRk9STUFUX1JHQjoKLSAgICAgICAgICAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCODg4OgotICAgICAgICAgICAgLypjYXNlIE1FU0FfRk9STUFUX0JHUjg4ODoqLwogICAgICAgICAgICAgICAgb3B0X3NhbXBsZV9yZ2JfMmQoY3R4LCB0T2JqLCBtLCB0ZXhjb29yZHMgKyBtaW5TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHJnYmEgKyBtaW5TdGFydCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQToKLSAgICAgICAgICAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQTg4ODg6Ci0gICAgICAgICAgICBjYXNlIE1FU0FfRk9STUFUX0FSR0I4ODg4OgotICAgICAgICAgICAgLypjYXNlIE1FU0FfRk9STUFUX0FCR1I4ODg4OiovCi0gICAgICAgICAgICAvKmNhc2UgTUVTQV9GT1JNQVRfQkdSQTg4ODg6Ki8KIAkgICAgICAgb3B0X3NhbXBsZV9yZ2JhXzJkKGN0eCwgdE9iaiwgbSwgdGV4Y29vcmRzICsgbWluU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgcmdiYSArIG1pblN0YXJ0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM4NiwxNiArMTM3NCwxMCBAQAogICAgICAgICAgaWYgKHJlcGVhdE5vQm9yZGVyUE9UKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRJbWctPlRleEZvcm1hdC0+TWVzYUZvcm1hdCkgewogICAgICAgICAgICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0I6Ci0gICAgICAgICAgICBjYXNlIE1FU0FfRk9STUFUX1JHQjg4ODoKLSAgICAgICAgICAgIC8qY2FzZSBNRVNBX0ZPUk1BVF9CR1I4ODg6Ki8KICAgICAgICAgICAgICAgIG9wdF9zYW1wbGVfcmdiXzJkKGN0eCwgdE9iaiwgbSwgdGV4Y29vcmRzICsgbWFnU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCByZ2JhICsgbWFnU3RhcnQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1FU0FfRk9STUFUX1JHQkE6Ci0gICAgICAgICAgICBjYXNlIE1FU0FfRk9STUFUX1JHQkE4ODg4OgotICAgICAgICAgICAgY2FzZSBNRVNBX0ZPUk1BVF9BUkdCODg4ODoKLSAgICAgICAgICAgIC8qY2FzZSBNRVNBX0ZPUk1BVF9BQkdSODg4ODoqLwotICAgICAgICAgICAgLypjYXNlIE1FU0FfRk9STUFUX0JHUkE4ODg4OiovCiAJICAgICAgIG9wdF9zYW1wbGVfcmdiYV8yZChjdHgsIHRPYmosIG0sIHRleGNvb3JkcyArIG1hZ1N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHJnYmEgKyBtYWdTdGFydCk7CiAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4NzIsOCArMTg1NCwxOSBAQAogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKippbWFnZXM7CiAgICAgICBHTGZsb2F0IG5ld0Nvb3JkWzRdOwotICAgICAgR0xpbnQgbGV2ZWwgPSBuZWFyZXN0X21pcG1hcF9sZXZlbCh0T2JqLCBsYW1iZGFbaV0pOworICAgICAgR0xpbnQgbGV2ZWw7CiAgICAgICBpbWFnZXMgPSBjaG9vc2VfY3ViZV9mYWNlKHRPYmosIHRleGNvb3JkW2ldLCBuZXdDb29yZCk7CisKKyAgICAgIC8qIFhYWCB3ZSBhY3R1YWxseSBuZWVkIHRvIHJlY29tcHV0ZSBsYW1iZGEgaGVyZSBiYXNlZCBvbiB0aGUgbmV3Q29vcmRzLgorICAgICAgICogQnV0IHdlIHdvdWxkIG5lZWQgdGhlIHRleGNvb3JkcyBvZiBhZGphY2VudCBmcmFnbWVudHMgdG8gY29tcHV0ZSB0aGF0CisgICAgICAgKiBwcm9wZXJseSwgYW5kIHdlIGRvbid0IGhhdmUgdGhvc2UgaGVyZS4KKyAgICAgICAqIEZvciBub3csIGRvIGFuIGFwcHJveGltYXRpb246ICBzdWJ0cmFjdGluZyAxIGZyb20gdGhlIGNob3NlbiBtaXBtYXAKKyAgICAgICAqIGxldmVsIHNlZW1zIHRvIHdvcmsgaW4gc29tZSB0ZXN0IGNhc2VzLgorICAgICAgICogVGhlIHNhbWUgYWRqdXN0bWVudCBpcyBkb25lIGluIHRoZSBuZXh0IGZldyBmdW5jdGlvbnMuCisgICAgICAqLworICAgICAgbGV2ZWwgPSBuZWFyZXN0X21pcG1hcF9sZXZlbCh0T2JqLCBsYW1iZGFbaV0pOworICAgICAgbGV2ZWwgPSBNQVgyKGxldmVsIC0gMSwgMCk7CisKICAgICAgIHNhbXBsZV8yZF9uZWFyZXN0KGN0eCwgdE9iaiwgaW1hZ2VzW2xldmVsXSwgbmV3Q29vcmQsIHJnYmFbaV0pOwogICAgfQogfQpAQCAtMTg5MSw2ICsxODg0LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICoqaW1hZ2VzOwogICAgICAgR0xmbG9hdCBuZXdDb29yZFs0XTsKICAgICAgIEdMaW50IGxldmVsID0gbmVhcmVzdF9taXBtYXBfbGV2ZWwodE9iaiwgbGFtYmRhW2ldKTsKKyAgICAgIGxldmVsID0gTUFYMihsZXZlbCAtIDEsIDApOyAvKiBzZWUgY29tbWVudCBhYm92ZSAqLwogICAgICAgaW1hZ2VzID0gY2hvb3NlX2N1YmVfZmFjZSh0T2JqLCB0ZXhjb29yZFtpXSwgbmV3Q29vcmQpOwogICAgICAgc2FtcGxlXzJkX2xpbmVhcihjdHgsIHRPYmosIGltYWdlc1tsZXZlbF0sIG5ld0Nvb3JkLCByZ2JhW2ldKTsKICAgIH0KQEAgLTE5MDksNiArMTkwMyw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqKmltYWdlczsKICAgICAgIEdMZmxvYXQgbmV3Q29vcmRbNF07CiAgICAgICBHTGludCBsZXZlbCA9IGxpbmVhcl9taXBtYXBfbGV2ZWwodE9iaiwgbGFtYmRhW2ldKTsKKyAgICAgIGxldmVsID0gTUFYMihsZXZlbCAtIDEsIDApOyAvKiBzZWUgY29tbWVudCBhYm92ZSAqLwogICAgICAgaW1hZ2VzID0gY2hvb3NlX2N1YmVfZmFjZSh0T2JqLCB0ZXhjb29yZFtpXSwgbmV3Q29vcmQpOwogICAgICAgaWYgKGxldmVsID49IHRPYmotPl9NYXhMZXZlbCkgewogICAgICAgICAgc2FtcGxlXzJkX25lYXJlc3QoY3R4LCB0T2JqLCBpbWFnZXNbdE9iai0+X01heExldmVsXSwKQEAgLTE5MzcsNiArMTkzMiw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqKmltYWdlczsKICAgICAgIEdMZmxvYXQgbmV3Q29vcmRbNF07CiAgICAgICBHTGludCBsZXZlbCA9IGxpbmVhcl9taXBtYXBfbGV2ZWwodE9iaiwgbGFtYmRhW2ldKTsKKyAgICAgIGxldmVsID0gTUFYMihsZXZlbCAtIDEsIDApOyAvKiBzZWUgY29tbWVudCBhYm92ZSAqLwogICAgICAgaW1hZ2VzID0gY2hvb3NlX2N1YmVfZmFjZSh0T2JqLCB0ZXhjb29yZFtpXSwgbmV3Q29vcmQpOwogICAgICAgaWYgKGxldmVsID49IHRPYmotPl9NYXhMZXZlbCkgewogICAgICAgICAgc2FtcGxlXzJkX2xpbmVhcihjdHgsIHRPYmosIGltYWdlc1t0T2JqLT5fTWF4TGV2ZWxdLApAQCAtMjEwMiw3ICsyMDk4LDcgQEAKICAgIEFTU0VSVCh0T2JqLT5XcmFwVCA9PSBHTF9DTEFNUCB8fAogICAgICAgICAgIHRPYmotPldyYXBUID09IEdMX0NMQU1QX1RPX0VER0UgfHwKICAgICAgICAgICB0T2JqLT5XcmFwVCA9PSBHTF9DTEFNUF9UT19CT1JERVIpOwotICAgQVNTRVJUKGltZy0+X0Jhc2VGb3JtYXQgIT0gR0xfQ09MT1JfSU5ERVgpOworICAgQVNTRVJUKGltZy0+VGV4Rm9ybWF0LT5CYXNlRm9ybWF0ICE9IEdMX0NPTE9SX0lOREVYKTsKIAogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgR0xpbnQgcm93LCBjb2w7CkBAIC0yMTM4LDcgKzIxMzQsNyBAQAogICAgQVNTRVJUKHRPYmotPldyYXBUID09IEdMX0NMQU1QIHx8CiAgICAgICAgICAgdE9iai0+V3JhcFQgPT0gR0xfQ0xBTVBfVE9fRURHRSB8fAogICAgICAgICAgIHRPYmotPldyYXBUID09IEdMX0NMQU1QX1RPX0JPUkRFUik7Ci0gICBBU1NFUlQoaW1nLT5fQmFzZUZvcm1hdCAhPSBHTF9DT0xPUl9JTkRFWCk7CisgICBBU1NFUlQoaW1nLT5UZXhGb3JtYXQtPkJhc2VGb3JtYXQgIT0gR0xfQ09MT1JfSU5ERVgpOwogCiAgICAvKiBYWFggbG90cyBvZiBvcHBvcnR1bml0eSBmb3Igb3B0aW1pemF0aW9uIGluIHRoaXMgbG9vcCAqLwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpAQCAtMjg4MCw4ICsyODc2LDggQEAKIAogICAgKHZvaWQpIGxhbWJkYTsKIAotICAgQVNTRVJUKHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF0tPl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCB8fAotICAgICAgICAgIHRPYmotPkltYWdlWzBdW3RPYmotPkJhc2VMZXZlbF0tPl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX1NURU5DSUxfRVhUKTsKKyAgIEFTU0VSVChpbWctPlRleEZvcm1hdC0+QmFzZUZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQgfHwKKyAgICAgICAgICBpbWctPlRleEZvcm1hdC0+QmFzZUZvcm1hdCA9PSBHTF9ERVBUSF9TVEVOQ0lMX0VYVCk7CiAKICAgIEFTU0VSVCh0T2JqLT5UYXJnZXQgPT0gR0xfVEVYVFVSRV8xRCB8fAogICAgICAgICAgIHRPYmotPlRhcmdldCA9PSBHTF9URVhUVVJFXzJEIHx8CkBAIC0zMjQ5LDcgKzMyNDUsNyBAQAogICAgICogR0xfVEVYVFVSRV9DT01QQVJFX1NHSVggPT0gR0xfVFJVRSBidXQgdGhlIGN1cnJlbnQgdGV4dHVyZSBvYmplY3QKICAgICAqIGlzbid0IGEgZGVwdGggdGV4dHVyZS4KICAgICAqLwotICAgaWYgKHRleEltYWdlLT5fQmFzZUZvcm1hdCAhPSBHTF9ERVBUSF9DT01QT05FTlQpIHsKKyAgIGlmICh0ZXhJbWFnZS0+VGV4Rm9ybWF0LT5CYXNlRm9ybWF0ICE9IEdMX0RFUFRIX0NPTVBPTkVOVCkgewogICAgICAgX21lc2FfcHJvYmxlbShjdHgsIkdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYIGVuYWJsZWQgd2l0aCBub24tZGVwdGggdGV4dHVyZSIpOwogICAgICAgcmV0dXJuOwogICAgfQpAQCAtMzM1Miw3ICszMzQ4LDcgQEAKICAgIH0KICAgIGVsc2UgewogICAgICAgY29uc3QgR0xib29sZWFuIG5lZWRMYW1iZGEgPSAoR0xib29sZWFuKSAodC0+TWluRmlsdGVyICE9IHQtPk1hZ0ZpbHRlcik7Ci0gICAgICBjb25zdCBHTGVudW0gZm9ybWF0ID0gdC0+SW1hZ2VbMF1bdC0+QmFzZUxldmVsXS0+X0Jhc2VGb3JtYXQ7CisgICAgICBjb25zdCBHTGVudW0gZm9ybWF0ID0gdC0+SW1hZ2VbMF1bdC0+QmFzZUxldmVsXS0+VGV4Rm9ybWF0LT5CYXNlRm9ybWF0OwogCiAgICAgICBzd2l0Y2ggKHQtPlRhcmdldCkgewogICAgICAgY2FzZSBHTF9URVhUVVJFXzFEOgpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfdGV4c3RvcmUuYyBiL3NyYy9tZXNhL3N3cmFzdC9zX3RleHN0b3JlLmMKaW5kZXggZjVkMDgxZC4uZjNjZTU5MCAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3NfdGV4c3RvcmUuYworKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc190ZXhzdG9yZS5jCkBAIC0zMDUsNyArMzA1LDcgQEAKIAogICAgLyogR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAgKi8KICAgIGlmIChsZXZlbCA9PSB0ZXhPYmotPkJhc2VMZXZlbCAmJiB0ZXhPYmotPkdlbmVyYXRlTWlwbWFwKSB7Ci0gICAgICBfbWVzYV9nZW5lcmF0ZV9taXBtYXAoY3R4LCB0YXJnZXQsIHRleFVuaXQsIHRleE9iaik7CisgICAgICBjdHgtPkRyaXZlci5HZW5lcmF0ZU1pcG1hcChjdHgsIHRhcmdldCwgdGV4T2JqKTsKICAgIH0KIH0KIApAQCAtMzgxLDcgKzM4MSw3IEBACiAKICAgIC8qIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwICovCiAgICBpZiAobGV2ZWwgPT0gdGV4T2JqLT5CYXNlTGV2ZWwgJiYgdGV4T2JqLT5HZW5lcmF0ZU1pcG1hcCkgewotICAgICAgX21lc2FfZ2VuZXJhdGVfbWlwbWFwKGN0eCwgdGFyZ2V0LCB0ZXhVbml0LCB0ZXhPYmopOworICAgICAgY3R4LT5Ecml2ZXIuR2VuZXJhdGVNaXBtYXAoY3R4LCB0YXJnZXQsIHRleE9iaik7CiAgICB9CiB9CiAKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCiAgICAvKiBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcCAqLwogICAgaWYgKGxldmVsID09IHRleE9iai0+QmFzZUxldmVsICYmIHRleE9iai0+R2VuZXJhdGVNaXBtYXApIHsKLSAgICAgIF9tZXNhX2dlbmVyYXRlX21pcG1hcChjdHgsIHRhcmdldCwgdGV4VW5pdCwgdGV4T2JqKTsKKyAgICAgIGN0eC0+RHJpdmVyLkdlbmVyYXRlTWlwbWFwKGN0eCwgdGFyZ2V0LCB0ZXhPYmopOwogICAgfQogfQogCkBAIC01MjYsNyArNTI2LDcgQEAKIAogICAgLyogR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAgKi8KICAgIGlmIChsZXZlbCA9PSB0ZXhPYmotPkJhc2VMZXZlbCAmJiB0ZXhPYmotPkdlbmVyYXRlTWlwbWFwKSB7Ci0gICAgICBfbWVzYV9nZW5lcmF0ZV9taXBtYXAoY3R4LCB0YXJnZXQsIHRleFVuaXQsIHRleE9iaik7CisgICAgICBjdHgtPkRyaXZlci5HZW5lcmF0ZU1pcG1hcChjdHgsIHRhcmdldCwgdGV4T2JqKTsKICAgIH0KIH0KIApAQCAtNTk5LDYgKzU5OSw2IEBACiAKICAgIC8qIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwICovCiAgICBpZiAobGV2ZWwgPT0gdGV4T2JqLT5CYXNlTGV2ZWwgJiYgdGV4T2JqLT5HZW5lcmF0ZU1pcG1hcCkgewotICAgICAgX21lc2FfZ2VuZXJhdGVfbWlwbWFwKGN0eCwgdGFyZ2V0LCB0ZXhVbml0LCB0ZXhPYmopOworICAgICAgY3R4LT5Ecml2ZXIuR2VuZXJhdGVNaXBtYXAoY3R4LCB0YXJnZXQsIHRleE9iaik7CiAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc190cmlhbmdsZS5jIGIvc3JjL21lc2Evc3dyYXN0L3NfdHJpYW5nbGUuYwppbmRleCAwMGNmZjY2Li5mNTg0ZjZlIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Qvc190cmlhbmdsZS5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX3RyaWFuZ2xlLmMKQEAgLTU4LDcgKzU4LDcgQEAKICAgIEdMZmxvYXQgZnkgPSB2Mi0+YXR0cmliW0ZSQUdfQVRUUklCX1dQT1NdWzFdIC0gdjAtPmF0dHJpYltGUkFHX0FUVFJJQl9XUE9TXVsxXTsKICAgIEdMZmxvYXQgYyA9IGV4KmZ5LWV5KmZ4OwogCi0gICBpZiAoYyAqIFNXUkFTVF9DT05URVhUKGN0eCktPl9CYWNrZmFjZVNpZ24gPiAwKQorICAgaWYgKGMgKiBTV1JBU1RfQ09OVEVYVChjdHgpLT5fQmFja2ZhY2VDdWxsU2lnbiA+IDApCiAgICAgICByZXR1cm4gMDsKIAogICAgcmV0dXJuIDE7CkBAIC0xMzAsNyArMTMwLDcgQEAKICNkZWZpbmUgVF9TQ0FMRSB0aGVpZ2h0CiAKICNkZWZpbmUgU0VUVVBfQ09ERQkJCQkJCQlcCi0gICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF1bMF07XAorICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIgPSBjdHgtPkRyYXdCdWZmZXItPl9Db2xvckRyYXdCdWZmZXJzWzBdOwlcCiAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKm9iaiA9IGN0eC0+VGV4dHVyZS5Vbml0WzBdLkN1cnJlbnQyRDsJXAogICAgY29uc3QgR0xpbnQgYiA9IG9iai0+QmFzZUxldmVsOwkJCQkJXAogICAgY29uc3QgR0xmbG9hdCB0d2lkdGggPSAoR0xmbG9hdCkgb2JqLT5JbWFnZVswXVtiXS0+V2lkdGg7CQlcCkBAIC0xMzksOCArMTM5LDcgQEAKICAgIGNvbnN0IEdMY2hhbiAqdGV4dHVyZSA9IChjb25zdCBHTGNoYW4gKikgb2JqLT5JbWFnZVswXVtiXS0+RGF0YTsJXAogICAgY29uc3QgR0xpbnQgc21hc2sgPSBvYmotPkltYWdlWzBdW2JdLT5XaWR0aCAtIDE7CQkJXAogICAgY29uc3QgR0xpbnQgdG1hc2sgPSBvYmotPkltYWdlWzBdW2JdLT5IZWlnaHQgLSAxOwkJCVwKLSAgIGlmICghdGV4dHVyZSkgewkJCQkJCQlcCi0gICAgICAvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8JCQkJCVwKKyAgIGlmICghcmIgfHwgIXRleHR1cmUpIHsJCQkJCQlcCiAgICAgICByZXR1cm47CQkJCQkJCQlcCiAgICB9CiAKQEAgLTE4Miw3ICsxODEsNyBAQAogI2RlZmluZSBUX1NDQUxFIHRoZWlnaHQKIAogI2RlZmluZSBTRVRVUF9DT0RFCQkJCQkJCVwKLSAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiID0gY3R4LT5EcmF3QnVmZmVyLT5fQ29sb3JEcmF3QnVmZmVyc1swXVswXTtcCisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiA9IGN0eC0+RHJhd0J1ZmZlci0+X0NvbG9yRHJhd0J1ZmZlcnNbMF07CVwKICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqb2JqID0gY3R4LT5UZXh0dXJlLlVuaXRbMF0uQ3VycmVudDJEOwlcCiAgICBjb25zdCBHTGludCBiID0gb2JqLT5CYXNlTGV2ZWw7CQkJCQlcCiAgICBjb25zdCBHTGZsb2F0IHR3aWR0aCA9IChHTGZsb2F0KSBvYmotPkltYWdlWzBdW2JdLT5XaWR0aDsJCVwKQEAgLTE5MSw4ICsxOTAsNyBAQAogICAgY29uc3QgR0xjaGFuICp0ZXh0dXJlID0gKGNvbnN0IEdMY2hhbiAqKSBvYmotPkltYWdlWzBdW2JdLT5EYXRhOwlcCiAgICBjb25zdCBHTGludCBzbWFzayA9IG9iai0+SW1hZ2VbMF1bYl0tPldpZHRoIC0gMTsJCQlcCiAgICBjb25zdCBHTGludCB0bWFzayA9IG9iai0+SW1hZ2VbMF1bYl0tPkhlaWdodCAtIDE7CQkJXAotICAgaWYgKCF0ZXh0dXJlKSB7CQkJCQkJCVwKLSAgICAgIC8qIHRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLwkJCQkJXAorICAgaWYgKCFyYiB8fCAhdGV4dHVyZSkgewkJCQkJCVwKICAgICAgIHJldHVybjsJCQkJCQkJCVwKICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0L3NfdHJpdGVtcC5oIGIvc3JjL21lc2Evc3dyYXN0L3NfdHJpdGVtcC5oCmluZGV4IGNkZWQ0YTYuLjhlM2M1YjUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zX3RyaXRlbXAuaAorKysgYi9zcmMvbWVzYS9zd3Jhc3Qvc190cml0ZW1wLmgKQEAgLTIzNCwxOSArMjM0LDE5IEBACiAgICAvKiBjb21wdXRlIGFyZWEsIG9uZU92ZXJBcmVhIGFuZCBwZXJmb3JtIGJhY2tmYWNlIGN1bGxpbmcgKi8KICAgIHsKICAgICAgIGNvbnN0IEdMZmxvYXQgYXJlYSA9IGVNYWouZHggKiBlQm90LmR5IC0gZUJvdC5keCAqIGVNYWouZHk7Ci0gICAgICAvKiBEbyBiYWNrZmFjZSBjdWxsaW5nICovCi0gICAgICBpZiAoYXJlYSAqIGJmIDwgMC4wKQotICAgICAgICAgcmV0dXJuOwogCiAgICAgICBpZiAoSVNfSU5GX09SX05BTihhcmVhKSB8fCBhcmVhID09IDAuMEYpCiAgICAgICAgICByZXR1cm47CiAKKyAgICAgIGlmIChhcmVhICogYmYgKiBzd3Jhc3QtPl9CYWNrZmFjZUN1bGxTaWduIDwgMC4wKQorICAgICAgICAgcmV0dXJuOworCiAgICAgICBvbmVPdmVyQXJlYSA9IDEuMEYgLyBhcmVhOworCisgICAgICAvKiAwID0gZnJvbnQsIDEgPSBiYWNrICovCisgICAgICBzcGFuLmZhY2luZyA9IG9uZU92ZXJBcmVhICogYmYgPiAwLjBGOwogICAgfQogCi0KLSAgIHNwYW4uZmFjaW5nID0gY3R4LT5fRmFjaW5nOyAvKiBmb3IgMi1zaWRlZCBzdGVuY2lsIHRlc3QgKi8KLQogICAgLyogRWRnZSBzZXR1cC4gIEZvciBhIHRyaWFuZ2xlIHN0cmlwIHRoZXNlIGNvdWxkIGJlIHJldXNlZC4uLiAqLwogICAgewogICAgICAgZU1hai5mc3kgPSBGaXhlZENlaWwodk1pbl9meSk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc196b29tLmMgYi9zcmMvbWVzYS9zd3Jhc3Qvc196b29tLmMKaW5kZXggNDhiNGQxZS4uYTQ4ZWFlMSAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3Nfem9vbS5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zX3pvb20uYwpAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41LjIKKyAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0xMzAsOCArMTMwLDggQEAKIHpvb21fc3BhbiggR0xjb250ZXh0ICpjdHgsIEdMaW50IGltZ1gsIEdMaW50IGltZ1ksIGNvbnN0IFNXc3BhbiAqc3BhbiwKICAgICAgICAgICAgY29uc3QgR0x2b2lkICpzcmMsIEdMZW51bSBmb3JtYXQgKQogeworICAgU1djb250ZXh0ICpzd3Jhc3QgPSBTV1JBU1RfQ09OVEVYVChjdHgpOwogICAgU1dzcGFuIHpvb21lZDsKLSAgIFNXc3BhbmFycmF5cyB6b29tZWRfYXJyYXlzOyAgLyogdGhpcyBpcyBiaWchICovCiAgICBHTGludCB4MCwgeDEsIHkwLCB5MTsKICAgIEdMaW50IHpvb21lZFdpZHRoOwogCkBAIC0xNDAsNiArMTQwLDEzIEBACiAgICAgICByZXR1cm47ICAvKiB0b3RhbGx5IGNsaXBwZWQgKi8KICAgIH0KIAorICAgaWYgKCFzd3Jhc3QtPlpvb21lZEFycmF5cykgeworICAgICAgLyogYWxsb2NhdGUgb24gZGVtYW5kICovCisgICAgICBzd3Jhc3QtPlpvb21lZEFycmF5cyA9IChTV3NwYW5hcnJheXMgKikgQ0FMTE9DKHNpemVvZihTV3NwYW5hcnJheXMpKTsKKyAgICAgIGlmICghc3dyYXN0LT5ab29tZWRBcnJheXMpCisgICAgICAgICByZXR1cm47CisgICB9CisKICAgIHpvb21lZFdpZHRoID0geDEgLSB4MDsKICAgIEFTU0VSVCh6b29tZWRXaWR0aCA+IDApOwogICAgQVNTRVJUKHpvb21lZFdpZHRoIDw9IE1BWF9XSURUSCk7CkBAIC0xNTEsMTQgKzE1OCwxNCBAQAogICAgSU5JVF9TUEFOKHpvb21lZCwgR0xfQklUTUFQKTsKICAgIHpvb21lZC54ID0geDA7CiAgICB6b29tZWQuZW5kID0gem9vbWVkV2lkdGg7Ci0gICB6b29tZWQuYXJyYXkgPSAmem9vbWVkX2FycmF5czsKLSAgIHpvb21lZF9hcnJheXMuQ2hhblR5cGUgPSBzcGFuLT5hcnJheS0+Q2hhblR5cGU7Ci0gICBpZiAoem9vbWVkX2FycmF5cy5DaGFuVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKQotICAgICAgem9vbWVkX2FycmF5cy5yZ2JhID0gKEdMY2hhbiAoKilbNF0pIHpvb21lZF9hcnJheXMucmdiYTg7Ci0gICBlbHNlIGlmICh6b29tZWRfYXJyYXlzLkNoYW5UeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKQotICAgICAgem9vbWVkX2FycmF5cy5yZ2JhID0gKEdMY2hhbiAoKilbNF0pIHpvb21lZF9hcnJheXMucmdiYTE2OworICAgem9vbWVkLmFycmF5ID0gc3dyYXN0LT5ab29tZWRBcnJheXM7CisgICB6b29tZWQuYXJyYXktPkNoYW5UeXBlID0gc3Bhbi0+YXJyYXktPkNoYW5UeXBlOworICAgaWYgKHpvb21lZC5hcnJheS0+Q2hhblR5cGUgPT0gR0xfVU5TSUdORURfQllURSkKKyAgICAgIHpvb21lZC5hcnJheS0+cmdiYSA9IChHTGNoYW4gKCopWzRdKSB6b29tZWQuYXJyYXktPnJnYmE4OworICAgZWxzZSBpZiAoem9vbWVkLmFycmF5LT5DaGFuVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCkKKyAgICAgIHpvb21lZC5hcnJheS0+cmdiYSA9IChHTGNoYW4gKCopWzRdKSB6b29tZWQuYXJyYXktPnJnYmExNjsKICAgIGVsc2UKLSAgICAgIHpvb21lZF9hcnJheXMucmdiYSA9IChHTGNoYW4gKCopWzRdKSB6b29tZWRfYXJyYXlzLmF0dHJpYnNbRlJBR19BVFRSSUJfQ09MMF07CisgICAgICB6b29tZWQuYXJyYXktPnJnYmEgPSAoR0xjaGFuICgqKVs0XSkgem9vbWVkLmFycmF5LT5hdHRyaWJzW0ZSQUdfQVRUUklCX0NPTDBdOwogCiAgICBDT1BZXzRWKHpvb21lZC5hdHRyU3RhcnRbRlJBR19BVFRSSUJfV1BPU10sIHNwYW4tPmF0dHJTdGFydFtGUkFHX0FUVFJJQl9XUE9TXSk7CiAgICBDT1BZXzRWKHpvb21lZC5hdHRyU3RlcFhbRlJBR19BVFRSSUJfV1BPU10sIHNwYW4tPmF0dHJTdGVwWFtGUkFHX0FUVFJJQl9XUE9TXSk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc291cmNlcyBiL3NyYy9tZXNhL3N3cmFzdC9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmZkNGNjLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL3N3cmFzdC9zb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyBMaXN0IG9mIHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB1c2VkIGZvciBYLm9yZyB4c2VydmVyIGJ1aWxkCi1NRVNBX1NXUkFTVF9TT1VSQ0VTID0gXAotc19hYWxpbmUuYyBcCi1zX2FhdHJpYW5nbGUuYyBcCi1zX2FjY3VtLmMgXAotc19hbHBoYS5jIFwKLXNfYXJic2hhZGVyLmMgXAotc19hdGlmcmFnc2hhZGVyLmMgXAotc19iaXRtYXAuYyBcCi1zX2JsZW5kLmMgXAotc19ibGl0LmMgXAotc19idWZmZXJzLmMgXAotc19jb250ZXh0LmMgXAotc19jb3B5cGl4LmMgXAotc19kZXB0aC5jIFwKLXNfZHJhd3BpeC5jIFwKLXNfZmVlZGJhY2suYyBcCi1zX2ZvZy5jIFwKLXNfaW1hZ2luZy5jIFwKLXNfbGluZXMuYyBcCi1zX2xvZ2ljLmMgXAotc19tYXNraW5nLmMgXAotc19udmZyYWdwcm9nLmMgXAotc19wb2ludHMuYyBcCi1zX3JlYWRwaXguYyBcCi1zX3NwYW4uYyBcCi1zX3N0ZW5jaWwuYyBcCi1zX3RleGNvbWJpbmUuYyBcCi1zX3RleGZpbHRlci5jIFwKLXNfdGV4c3RvcmUuYyBcCi1zX3RyaWFuZ2xlLmMgXAotc196b29tLmMKLQotTUVTQV9TV1JBU1RfSEVBREVSUyA9IFwKLXNfYWFsaW5lLmggXAotc19hYWxpbmV0ZW1wLmggXAotc19hYXRyaWFuZ2xlLmggXAotc19hYXRyaXRlbXAuaCBcCi1zX2FjY3VtLmggXAotc19hbHBoYS5oIFwKLXNfYXJic2hhZGVyLmggXAotc19hdGlmcmFnc2hhZGVyLmggXAotc19ibGVuZC5oIFwKLXNfY29udGV4dC5oIFwKLXNfZGVwdGguaCBcCi1zX2RyYXdwaXguaCBcCi1zX2ZlZWRiYWNrLmggXAotc19mb2cuaCBcCi1zX2xpbmVzLmggXAotc19saW5ldGVtcC5oIFwKLXNfbG9naWMuaCBcCi1zX21hc2tpbmcuaCBcCi1zX252ZnJhZ3Byb2cuaCBcCi1zX3BvaW50cy5oIFwKLXNfcG9pbnR0ZW1wLmggXAotc19zcGFuLmggXAotc19zcGFudGVtcC5oIFwKLXNfc3RlbmNpbC5oIFwKLXNfdGV4Y29tYmluZS5oIFwKLXNfdGV4ZmlsdGVyLmggXAotc190cmlhbmdsZS5oIFwKLXNfdHJpc3Bhbi5oIFwKLXNfdHJpdGVtcC5oIFwKLXNfem9vbS5oIFwKLXN3cmFzdC5oCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Qvc3dyYXN0LmggYi9zcmMvbWVzYS9zd3Jhc3Qvc3dyYXN0LmgKaW5kZXggODVhMjdmZC4uMDQ3Zjc5OSAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0L3N3cmFzdC5oCisrKyBiL3NyYy9tZXNhL3N3cmFzdC9zd3Jhc3QuaApAQCAtMTQzLDYgKzE0MywxMyBAQAogZXh0ZXJuIHZvaWQKIF9zd3Jhc3RfUmVzZXRMaW5lU3RpcHBsZSggR0xjb250ZXh0ICpjdHggKTsKIAorLyoqCisgKiBJbmRpY2F0ZXMgZnJvbnQvYmFjayBmYWNpbmcgZm9yIHN1YnNlcXVlbnQgcG9pbnRzL2xpbmVzIHdoZW4gZHJhd2luZworICogdW5maWxsZWQgcG9seWdvbnMuICBOZWVkZWQgZm9yIHR3by1zaWRlIHN0ZW5jaWwuCisgKi8KK2V4dGVybiB2b2lkCitfc3dyYXN0X1NldEZhY2luZyhHTGNvbnRleHQgKmN0eCwgR0x1aW50IGZhY2luZyk7CisKIC8qIFRoZXNlIHdpbGwgYWx3YXlzIHJlbmRlciB0aGUgY29ycmVjdCBwb2ludC9saW5lL3RyaWFuZ2xlIGZvciB0aGUKICAqIGN1cnJlbnQgc3RhdGUuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0X3NldHVwL2Rlc2NyaXAubW1zIGIvc3JjL21lc2Evc3dyYXN0X3NldHVwL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZmZkODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvZGVzY3JpcC5tbXMKQEAgLTAsMCArMSw0MiBAQAorIyBNYWtlZmlsZSBmb3IgY29yZSBsaWJyYXJ5IGZvciBWTVMKKyMgY29udHJpYnV0ZWQgYnkgSm91ayBKYW5zZW4gIGpvdWtqQGhyZW0ubmFuby50dWRlbGZ0Lm5sCisjIExhc3QgcmV2aXNpb24gOiAzIE9jdG9iZXIgMjAwNworCisuZmlyc3QKKwlkZWZpbmUgZ2wgWy0tLS5pbmNsdWRlLmdsXQorCWRlZmluZSBtYXRoIFstLm1hdGhdCisJZGVmaW5lIHRubCBbLS50bmxdCisJZGVmaW5lIHZibyBbLS52Ym9dCisJZGVmaW5lIHN3cmFzdCBbLS5zd3Jhc3RdCisJZGVmaW5lIGFycmF5X2NhY2hlIFstLmFycmF5X2NhY2hlXQorCWRlZmluZSBnbGFwaSBbLS5nbGFwaV0KKwlkZWZpbmUgbWFpbiBbLS5tYWluXQorCisuaW5jbHVkZSBbLS0tXW1tcy1jb25maWcuCisKKyMjIyMjIE1BQ1JPUyAjIyMjIworCitWUEFUSCA9IFJDUworCitJTkNESVIgPSBbLS0tLmluY2x1ZGVdLFstLm1haW5dLFstLmdsYXBpXQorTElCRElSID0gWy0tLS5saWJdCitDRkxBR1MgPSAvaW5jbHVkZT0oJChJTkNESVIpLFtdKS9kZWZpbmU9KFBUSFJFQURTPTEpL25hbWU9KGFzX2lzLHNob3J0KS9mbG9hdD1pZWVlL2llZWU9ZGVub3JtCisKK1NPVVJDRVMgPSBzc19jb250ZXh0LmMgc3NfdHJpYW5nbGUuYworCitPQkpFQ1RTID0gIHNzX2NvbnRleHQub2JqLHNzX3RyaWFuZ2xlLm9iagorIyMjIyMgUlVMRVMgIyMjIyMKKworVkVSU0lPTj1NZXNhIFYzLjQKKworIyMjIyMgVEFSR0VUUyAjIyMjIworIyBNYWtlIHRoZSBsaWJyYXJ5CiskKExJQkRJUikkKEdMX0xJQikgOiAkKE9CSkVDVFMpCisgIEAgbGlicmFyeSAkKExJQkRJUikkKEdMX0xJQikgJChPQkpFQ1RTKQorCitjbGVhbiA6CisJcHVyZ2UKKwlkZWxldGUgKi5vYmo7KgorCitzc19jb250ZXh0Lm9iaiA6IHNzX2NvbnRleHQuYworc3NfdHJpYW5nbGUub2JqIDogc3NfdHJpYW5nbGUuYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0X3NldHVwL3NvdXJjZXMgYi9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc291cmNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlMTRiNi4uMDAwMDAwMAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc291cmNlcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1FU0FfU1dSQVNUX1NFVFVQX1NPVVJDRVMgPSBcCi1zc19jb250ZXh0LmMgXAotc3NfdHJpYW5nbGUuYwotCi1NRVNBX1NXUkFTVF9TRVRVUF9IRUFERVJTID0gXAotc3NfY29udGV4dC5oIFwKLXNzX3RyaWFuZ2xlLmggXAotc3NfdHJpdG1wLmggXAotc3NfdmIuaCBcCi1zd3Jhc3Rfc2V0dXAuaApkaWZmIC0tZ2l0IGEvc3JjL21lc2Evc3dyYXN0X3NldHVwL3NzX2NvbnRleHQuYyBiL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc19jb250ZXh0LmMKaW5kZXggZmQ2OTM1ZS4uNGVkODY4ZSAxMDA2NDQKLS0tIGEvc3JjL21lc2Evc3dyYXN0X3NldHVwL3NzX2NvbnRleHQuYworKysgYi9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc3NfY29udGV4dC5jCkBAIC0yMDEsNiArMjAxLDkgQEAKIAogICAgc3dzZXR1cC0+TmV3U3RhdGUgPSAwOwogCisgICAvKiBUaGlzIHdpbGwgY2hhbmdlIGlmIGRyYXdpbmcgdW5maWxsZWQgdHJpcyAqLworICAgX3N3cmFzdF9TZXRGYWNpbmcoY3R4LCAwKTsKKwogICAgX3N3cmFzdF9yZW5kZXJfc3RhcnQoY3R4KTsKIAogICAgLyogSW1wb3J0YW50ICovCmRpZmYgLS1naXQgYS9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc3NfdHJpYW5nbGUuYyBiL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc190cmlhbmdsZS5jCmluZGV4IDlmZWY3YTUuLjU0ZTI0YzQgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc190cmlhbmdsZS5jCisrKyBiL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc190cmlhbmdsZS5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICA2LjEKKyAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC02OCw2ICs2OCw4IEBACiAgICAgICAgICByZXR1cm47CiAgICB9CiAKKyAgIF9zd3Jhc3RfU2V0RmFjaW5nKGN0eCwgZmFjaW5nKTsKKwogICAgaWYgKGN0eC0+TGlnaHQuU2hhZGVNb2RlbCA9PSBHTF9GTEFUKSB7CiAgICAgICBDT1BZX0NIQU40KGNbMF0sIHYwLT5jb2xvcik7CiAgICAgICBDT1BZX0NIQU40KGNbMV0sIHYxLT5jb2xvcik7CkBAIC0xMjcsNiArMTI5LDggQEAKICAgICAgICAgIHJldHVybjsKICAgIH0KIAorICAgX3N3cmFzdF9TZXRGYWNpbmcoY3R4LCBmYWNpbmcpOworCiAgICBpZiAoY3R4LT5MaWdodC5TaGFkZU1vZGVsID09IEdMX0ZMQVQpIHsKICAgICAgIC8qIHNhdmUgY29sb3JzL2luZGV4ZXMgZm9yIHYwLCB2MSB2ZXJ0aWNlcyAqLwogICAgICAgQ09QWV9DSEFONChjWzBdLCB2MC0+Y29sb3IpOwpAQCAtMjkwLDEwICsyOTQsOCBAQAogICAgICAgIGN0eC0+UG9seWdvbi5PZmZzZXRGaWxsKQogICAgICAgaW5kIHw9IFNTX09GRlNFVF9CSVQ7CiAKLSAgIC8qIE5vdGU6IGdsX0Zyb250RmFjaW5nIGxpdmVzIGluIGZyYWdtZW50IGlucHV0IEZPR0MuWSBhdCB0aGlzIHRpbWUgKi8KICAgIGlmICgoY3R4LT5MaWdodC5FbmFibGVkICYmIGN0eC0+TGlnaHQuTW9kZWwuVHdvU2lkZSkgfHwKLSAgICAgICAoY3R4LT5WZXJ0ZXhQcm9ncmFtLl9FbmFibGVkICYmIGN0eC0+VmVydGV4UHJvZ3JhbS5Ud29TaWRlRW5hYmxlZCkgfHwKLSAgICAgICAoY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQgJiYgY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQtPkJhc2UuSW5wdXRzUmVhZCAmICgxIDw8IEZSQUdfQVRUUklCX0ZPR0MpKSkKKyAgICAgICAoY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50ICYmIGN0eC0+VmVydGV4UHJvZ3JhbS5Ud29TaWRlRW5hYmxlZCkpCiAgICAgICBpbmQgfD0gU1NfVFdPU0lERV9CSVQ7CiAKICAgIC8qIFdlIHBpZ2d5YmFjayB0aGUgdHdvLXNpZGVkIHN0ZW5jaWwgZnJvbnQvYmFjayBkZXRlcm1pbmF0aW9uIG9uIHRoZQpAQCAtMzExLDYgKzMxMyw0IEBACiAgICB0bmwtPkRyaXZlci5SZW5kZXIuUXVhZCA9IHF1YWRfdGFiW2luZF07CiAgICB0bmwtPkRyaXZlci5SZW5kZXIuTGluZSA9IHN3c2V0dXBfbGluZTsKICAgIHRubC0+RHJpdmVyLlJlbmRlci5Qb2ludHMgPSBzd3NldHVwX3BvaW50czsKLQotICAgY3R4LT5fRmFjaW5nID0gMDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc190cml0bXAuaCBiL3NyYy9tZXNhL3N3cmFzdF9zZXR1cC9zc190cml0bXAuaAppbmRleCBmNmI3MzhkLi45N2QyZjRhIDEwMDY0NAotLS0gYS9zcmMvbWVzYS9zd3Jhc3Rfc2V0dXAvc3NfdHJpdG1wLmgKKysrIGIvc3JjL21lc2Evc3dyYXN0X3NldHVwL3NzX3RyaXRtcC5oCkBAIC00OSw3ICs0OSw2IEBACiAgICB2WzFdID0gJnZlcnRzW2UxXTsKICAgIHZbMl0gPSAmdmVydHNbZTJdOwogCi0KICAgIGlmIChJTkQgJiAoU1NfVFdPU0lERV9CSVQgfCBTU19PRkZTRVRfQklUIHwgU1NfVU5GSUxMRURfQklUKSkKICAgIHsKICAgICAgIEdMZmxvYXQgZXggPSB2WzBdLT5hdHRyaWJbRlJBR19BVFRSSUJfV1BPU11bMF0gLSB2WzJdLT5hdHRyaWJbRlJBR19BVFRSSUJfV1BPU11bMF07CkBAIC02MSw3ICs2MCw2IEBACiAgICAgICBpZiAoSU5EICYgKFNTX1RXT1NJREVfQklUIHwgU1NfVU5GSUxMRURfQklUKSkKICAgICAgIHsKIAkgZmFjaW5nID0gKGNjIDwgMC4wKSBeIGN0eC0+UG9seWdvbi5fRnJvbnRCaXQ7Ci0gICAgICAgICBjdHgtPl9GYWNpbmcgPSBmYWNpbmc7CiAKIAkgaWYgKElORCAmIFNTX1VORklMTEVEX0JJVCkKIAkgICAgbW9kZSA9IGZhY2luZyA/IGN0eC0+UG9seWdvbi5CYWNrTW9kZSA6IGN0eC0+UG9seWdvbi5Gcm9udE1vZGU7CkBAIC0yMzgsMTQgKzIzNiwxNiBAQAogewogICAgaWYgKElORCAmIFNTX1VORklMTEVEX0JJVCkgewogICAgICAgc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJlROTF9DT05URVhUKGN0eCktPnZiOwotICAgICAgR0x1Ynl0ZSBlZjEgPSBWQi0+RWRnZUZsYWdbdjFdOwotICAgICAgR0x1Ynl0ZSBlZjMgPSBWQi0+RWRnZUZsYWdbdjNdOwotICAgICAgVkItPkVkZ2VGbGFnW3YxXSA9IDA7Ci0gICAgICBUQUcodHJpYW5nbGUpKCBjdHgsIHYwLCB2MSwgdjMgKTsKLSAgICAgIFZCLT5FZGdlRmxhZ1t2MV0gPSBlZjE7Ci0gICAgICBWQi0+RWRnZUZsYWdbdjNdID0gMDsKLSAgICAgIFRBRyh0cmlhbmdsZSkoIGN0eCwgdjEsIHYyLCB2MyApOwotICAgICAgVkItPkVkZ2VGbGFnW3YzXSA9IGVmMzsKKyAgICAgIGlmIChWQi0+RWRnZUZsYWcpIHsgLyogWFhYIHRoaXMgdGVzdCBzaG91bGRuJ3QgYmUgbmVlZGVkIChidWcgMTI2MTQpICovCisgICAgICAgICBHTHVieXRlIGVmMSA9IFZCLT5FZGdlRmxhZ1t2MV07CisgICAgICAgICBHTHVieXRlIGVmMyA9IFZCLT5FZGdlRmxhZ1t2M107CisgICAgICAgICBWQi0+RWRnZUZsYWdbdjFdID0gMDsKKyAgICAgICAgIFRBRyh0cmlhbmdsZSkoIGN0eCwgdjAsIHYxLCB2MyApOworICAgICAgICAgVkItPkVkZ2VGbGFnW3YxXSA9IGVmMTsKKyAgICAgICAgIFZCLT5FZGdlRmxhZ1t2M10gPSAwOworICAgICAgICAgVEFHKHRyaWFuZ2xlKSggY3R4LCB2MSwgdjIsIHYzICk7CisgICAgICAgICBWQi0+RWRnZUZsYWdbdjNdID0gZWYzOworICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgIFRBRyh0cmlhbmdsZSkoIGN0eCwgdjAsIHYxLCB2MyApOwogICAgICAgVEFHKHRyaWFuZ2xlKSggY3R4LCB2MSwgdjIsIHYzICk7CmRpZmYgLS1naXQgYS9zcmMvbWVzYS90bmwvZGVzY3JpcC5tbXMgYi9zcmMvbWVzYS90bmwvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3ZjY3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZXNhL3RubC9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDY3IEBACisjIE1ha2VmaWxlIGZvciBjb3JlIGxpYnJhcnkgZm9yIFZNUworIyBjb250cmlidXRlZCBieSBKb3VrIEphbnNlbiAgam91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmwKKyMgTGFzdCByZXZpc2lvbiA6IDMwIE5vdmVtYmVyIDIwMDcKKworLmZpcnN0CisJZGVmaW5lIGdsIFstLS0uaW5jbHVkZS5nbF0KKwlkZWZpbmUgbWF0aCBbLS5tYXRoXQorCWRlZmluZSB2Ym8gWy0udmJvXQorCWRlZmluZSBzaGFkZXIgWy0uc2hhZGVyXQorCWRlZmluZSBzd3Jhc3QgWy0uc3dyYXN0XQorCWRlZmluZSBhcnJheV9jYWNoZSBbLS5hcnJheV9jYWNoZV0KKwlkZWZpbmUgbWFpbiBbLS5tYWluXQorCWRlZmluZSBnbGFwaSBbLS5nbGFwaV0KKwlkZWZpbmUgdG5sIFstLnRubF0KKworLmluY2x1ZGUgWy0tLV1tbXMtY29uZmlnLgorCisjIyMjIyBNQUNST1MgIyMjIyMKKworVlBBVEggPSBSQ1MKKworSU5DRElSID0gWy0tLS5pbmNsdWRlXSxbLS5tYWluXSxbLS5nbGFwaV0sWy0uc2hhZGVyXSxbLS5zaGFkZXIuc2xhbmddCitMSUJESVIgPSBbLS0tLmxpYl0KK0NGTEFHUyA9IC9pbmNsdWRlPSgkKElOQ0RJUiksW10pL2RlZmluZT0oUFRIUkVBRFM9MSkvbmFtZT0oYXNfaXMsc2hvcnQpL2Zsb2F0PWllZWUvaWVlZT1kZW5vcm0KKworU09VUkNFUyA9IHRfY29udGV4dC5jIHRfZHJhdy5jIFwKKwl0X3BpcGVsaW5lLmMgdF92Yl9mb2cuYyBcCisJdF92Yl9saWdodC5jIHRfdmJfbm9ybWFscy5jIHRfdmJfcG9pbnRzLmMgdF92Yl9wcm9ncmFtLmMgXAorCXRfdmJfcmVuZGVyLmMgdF92Yl90ZXhnZW4uYyB0X3ZiX3RleG1hdC5jIHRfdmJfdmVydGV4LmMgXAorCXRfdmVydGV4LmMgXAorCXRfdmVydGV4X2dlbmVyaWMuYyB0X3ZwX2J1aWxkLmMKKworT0JKRUNUUyA9IHRfY29udGV4dC5vYmosdF9kcmF3Lm9iaixcCisJdF9waXBlbGluZS5vYmosdF92Yl9mb2cub2JqLHRfdmJfbGlnaHQub2JqLHRfdmJfbm9ybWFscy5vYmosXAorCXRfdmJfcG9pbnRzLm9iaix0X3ZiX3Byb2dyYW0ub2JqLHRfdmJfcmVuZGVyLm9iaix0X3ZiX3RleGdlbi5vYmosXAorCXRfdmJfdGV4bWF0Lm9iaix0X3ZiX3ZlcnRleC5vYmosXAorCXRfdmVydGV4Lm9iaix0X3ZlcnRleF9nZW5lcmljLm9iaixcCisJdF92cF9idWlsZC5vYmoKKworIyMjIyMgUlVMRVMgIyMjIyMKKworVkVSU0lPTj1NZXNhIFYzLjQKKworIyMjIyMgVEFSR0VUUyAjIyMjIworIyBNYWtlIHRoZSBsaWJyYXJ5CiskKExJQkRJUikkKEdMX0xJQikgOiAkKE9CSkVDVFMpCisgIEAgbGlicmFyeSAkKExJQkRJUikkKEdMX0xJQikgJChPQkpFQ1RTKQorCitjbGVhbiA6CisJcHVyZ2UKKwlkZWxldGUgKi5vYmo7KgorCit0X2NvbnRleHQub2JqIDogdF9jb250ZXh0LmMKK3RfZHJhdy5vYmogOiB0X2RyYXcuYwordF9waXBlbGluZS5vYmogOiB0X3BpcGVsaW5lLmMKK3RfdmJfZm9nLm9iaiA6IHRfdmJfZm9nLmMKK3RfdmJfbGlnaHQub2JqIDogdF92Yl9saWdodC5jCit0X3ZiX25vcm1hbHMub2JqIDogdF92Yl9ub3JtYWxzLmMKK3RfdmJfcG9pbnRzLm9iaiA6IHRfdmJfcG9pbnRzLmMKK3RfdmJfcHJvZ3JhbS5vYmogOiB0X3ZiX3Byb2dyYW0uYwordF92Yl9yZW5kZXIub2JqIDogdF92Yl9yZW5kZXIuYwordF92Yl90ZXhnZW4ub2JqIDogdF92Yl90ZXhnZW4uYwordF92Yl90ZXhtYXQub2JqIDogdF92Yl90ZXhtYXQuYwordF92Yl92ZXJ0ZXgub2JqIDogdF92Yl92ZXJ0ZXguYwordF92ZXJ0ZXgub2JqIDogdF92ZXJ0ZXguYwordF92ZXJ0ZXhfZ2VuZXJpYy5vYmogOiB0X3ZlcnRleF9nZW5lcmljLmMKK3RfdnBfYnVpbGQub2JqIDogdF92cF9idWlsZC5jCmRpZmYgLS1naXQgYS9zcmMvbWVzYS90bmwvc291cmNlcyBiL3NyYy9tZXNhL3RubC9zb3VyY2VzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg4OGJlLi4wMDAwMDAwCi0tLSBhL3NyYy9tZXNhL3RubC9zb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaXN0IG9mIHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB1c2VkIGZvciBYLm9yZyB4c2VydmVyIGJ1aWxkCi1NRVNBX1ROTF9TT1VSQ0VTID0gXAotdF9jb250ZXh0LmMgXAotdF9waXBlbGluZS5jIFwKLXRfdmJfYXJicHJvZ3JhbS5jIFwKLXRfdmJfYXJicHJvZ3JhbV9zc2UuYyBcCi10X3ZiX2FyYnNoYWRlci5jIFwKLXRfdmJfY3VsbC5jIFwKLXRfdmJfZm9nLmMgXAotdF92Yl9saWdodC5jIFwKLXRfdmJfbm9ybWFscy5jIFwKLXRfdmJfcG9pbnRzLmMgXAotdF92Yl9wcm9ncmFtLmMgXAotdF92Yl9yZW5kZXIuYyBcCi10X3ZiX3RleGdlbi5jIFwKLXRfdmJfdGV4bWF0LmMgXAotdF92Yl92ZXJ0ZXguYyBcCi10X3ZlcnRleC5jIFwKLXRfdmVydGV4X2dlbmVyaWMuYyBcCi10X3ZlcnRleF9zc2UuYyBcCi10X3ZwX2J1aWxkLmMgCi0KLU1FU0FfVE5MX0hFQURFUlMgPSBcCi10X2FycmF5X2FwaS5oIFwKLXRfYXJyYXlfaW1wb3J0LmggXAotdF9jb250ZXh0LmggXAotdF9waXBlbGluZS5oIFwKLXRfdmJfYXJicHJvZ3JhbS5oIFwKLXRfdmJfY2xpcHRtcC5oIFwKLXRfdmJfbGlnaHR0bXAuaCBcCi10X3ZiX3JlbmRlcnRtcC5oIFwKLXRfdmVydGV4LmggXAotdF92cF9idWlsZC5oIFwKLXRubC5oCmRpZmYgLS1naXQgYS9zcmMvbWVzYS90bmwvdF9jb250ZXh0LmMgYi9zcmMvbWVzYS90bmwvdF9jb250ZXh0LmMKaW5kZXggMGFjZTVjMi4uZGQ1OTA5MSAxMDA2NDQKLS0tIGEvc3JjL21lc2EvdG5sL3RfY29udGV4dC5jCisrKyBiL3NyYy9tZXNhL3RubC90X2NvbnRleHQuYwpAQCAtMTA0LDEwICsxMDQsMTAgQEAKICAgIGNvbnN0IHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqdnAgPSBjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQ7CiAgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKIAotICAgaWYgKG5ld19zdGF0ZSAmIChfTkVXX0hJTlQpKSB7CisgICBpZiAobmV3X3N0YXRlICYgKF9ORVdfSElOVCB8IF9ORVdfUFJPR1JBTSkpIHsKICAgICAgIEFTU0VSVCh0bmwtPkFsbG93VmVydGV4Rm9nIHx8IHRubC0+QWxsb3dQaXhlbEZvZyk7Ci0gICAgICB0bmwtPl9Eb1ZlcnRleEZvZyA9ICh0bmwtPkFsbG93VmVydGV4Rm9nICYmIChjdHgtPkhpbnQuRm9nICE9IEdMX05JQ0VTVCkpCi0gICAgICAgICB8fCAhdG5sLT5BbGxvd1BpeGVsRm9nOworICAgICAgdG5sLT5fRG9WZXJ0ZXhGb2cgPSAoKHRubC0+QWxsb3dWZXJ0ZXhGb2cgJiYgKGN0eC0+SGludC5Gb2cgIT0gR0xfTklDRVNUKSkKKyAgICAgICAgIHx8ICF0bmwtPkFsbG93UGl4ZWxGb2cpICYmICFmcDsKICAgIH0KIAogICAgdG5sLT5waXBlbGluZS5uZXdfc3RhdGUgfD0gbmV3X3N0YXRlOwpAQCAtMjAxLDggKzIwMSw4IEBACiB7CiAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwogICAgdG5sLT5BbGxvd1ZlcnRleEZvZyA9IHZhbHVlOwotICAgdG5sLT5fRG9WZXJ0ZXhGb2cgPSAodG5sLT5BbGxvd1ZlcnRleEZvZyAmJiAoY3R4LT5IaW50LkZvZyAhPSBHTF9OSUNFU1QpKQotICAgICAgfHwgIXRubC0+QWxsb3dQaXhlbEZvZzsKKyAgIHRubC0+X0RvVmVydGV4Rm9nID0gKCh0bmwtPkFsbG93VmVydGV4Rm9nICYmIChjdHgtPkhpbnQuRm9nICE9IEdMX05JQ0VTVCkpCisgICAgICB8fCAhdG5sLT5BbGxvd1BpeGVsRm9nKSAmJiAhY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQ7CiAKIH0KIApAQCAtMjExLDcgKzIxMSw3IEBACiB7CiAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwogICAgdG5sLT5BbGxvd1BpeGVsRm9nID0gdmFsdWU7Ci0gICB0bmwtPl9Eb1ZlcnRleEZvZyA9ICh0bmwtPkFsbG93VmVydGV4Rm9nICYmIChjdHgtPkhpbnQuRm9nICE9IEdMX05JQ0VTVCkpCi0gICAgICB8fCAhdG5sLT5BbGxvd1BpeGVsRm9nOworICAgdG5sLT5fRG9WZXJ0ZXhGb2cgPSAoKHRubC0+QWxsb3dWZXJ0ZXhGb2cgJiYgKGN0eC0+SGludC5Gb2cgIT0gR0xfTklDRVNUKSkKKyAgICAgIHx8ICF0bmwtPkFsbG93UGl4ZWxGb2cpICYmICFjdHgtPkZyYWdtZW50UHJvZ3JhbS5fQ3VycmVudDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdG5sL3RfZHJhdy5jIGIvc3JjL21lc2EvdG5sL3RfZHJhdy5jCmluZGV4IGExYTQ2ZjYuLjE3M2RlZmYgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3RubC90X2RyYXcuYworKysgYi9zcmMvbWVzYS90bmwvdF9kcmF3LmMKQEAgLTEsOSArMSw4IEBACi0KIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41CisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMzY4LDcgKzM2Nyw3IEBACiAJCQlfdG5sX2RyYXdfcHJpbXMgKTsKICAgICAgIHJldHVybjsKICAgIH0KLSAgIGVsc2UgaWYgKG1heF9pbmRleCA+PSBtYXgpIHsKKyAgIGVsc2UgaWYgKG1heF9pbmRleCA+IG1heCkgewogICAgICAgLyogVGhlIHNvZnR3YXJlIFROTCBwaXBlbGluZSBoYXMgYSBmaXhlZCBhbW91bnQgb2Ygc3RvcmFnZSBmb3IKICAgICAgICAqIHZlcnRpY2VzIGFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BsaXQgaW5jb21pbmcgZHJhd2luZyBjb21tYW5kcwogICAgICAgICogaWYgdGhleSBleGNlZWQgdGhhdCBsaW1pdC4KZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3RubC90X3BpcGVsaW5lLmMgYi9zcmMvbWVzYS90bmwvdF9waXBlbGluZS5jCmluZGV4IDJhMGVkODguLjM1N2VmMWUgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3RubC90X3BpcGVsaW5lLmMKKysrIGIvc3JjL21lc2EvdG5sL3RfcGlwZWxpbmUuYwpAQCAtMTk5LDExICsxOTksMTEgQEAKICAgICZfdG5sX3ZlcnRleF90cmFuc2Zvcm1fc3RhZ2UsCiAgICAmX3RubF9ub3JtYWxfdHJhbnNmb3JtX3N0YWdlLAogICAgJl90bmxfbGlnaHRpbmdfc3RhZ2UsCi0gICAmX3RubF9mb2dfY29vcmRpbmF0ZV9zdGFnZSwKICAgICZfdG5sX3RleGdlbl9zdGFnZSwKICAgICZfdG5sX3RleHR1cmVfdHJhbnNmb3JtX3N0YWdlLAogICAgJl90bmxfcG9pbnRfYXR0ZW51YXRpb25fc3RhZ2UsCiAgICAmX3RubF92ZXJ0ZXhfcHJvZ3JhbV9zdGFnZSwgCisgICAmX3RubF9mb2dfY29vcmRpbmF0ZV9zdGFnZSwKICAgICZfdG5sX3JlbmRlcl9zdGFnZSwKICAgIE5VTEwgCiB9OwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdG5sL3RfdmJfZm9nLmMgYi9zcmMvbWVzYS90bmwvdF92Yl9mb2cuYwppbmRleCAwMGMwOTc5Li5mM2E3YmQ0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS90bmwvdF92Yl9mb2cuYworKysgYi9zcmMvbWVzYS90bmwvdF92Yl9mb2cuYwpAQCAtNDEsNyArNDEsNiBAQAogCiBzdHJ1Y3QgZm9nX3N0YWdlX2RhdGEgewogICAgR0x2ZWN0b3I0ZiBmb2djb29yZDsJCS8qIGhhcyBhY3R1YWwgc3RvcmFnZSBhbGxvY2F0ZWQgKi8KLSAgIEdMdmVjdG9yNGYgaW5wdXQ7CQkvKiBwb2ludHMgaW50byBWQi0+RXllUHRyIFogdmFsdWVzICovCiB9OwogCiAjZGVmaW5lIEZPR19TVEFHRV9EQVRBKHN0YWdlKSAoKHN0cnVjdCBmb2dfc3RhZ2VfZGF0YSAqKXN0YWdlLT5wcml2YXRlUHRyKQpAQCAtOTEsNyArOTAsOCBAQAogICogZXZhbHVhdGluZyB0aGUgR0xfTElORUFSLCBHTF9FWFAgb3IgR0xfRVhQMiBmb2cgZnVuY3Rpb24uCiAgKiBGb2cgY29vcmRpbmF0ZXMgYXJlIGRpc3RhbmNlcyBmcm9tIHRoZSBleWUgKHR5cGljYWxseSBiZXR3ZWVuIHRoZQogICogbmVhciBhbmQgZmFyIGNsaXAgcGxhbmUgZGlzdGFuY2VzKS4KLSAqIE5vdGUgdGhlIGZvZyAoZXllIFopIGNvb3JkcyBtYXkgYmUgbmVnYXRpdmUgc28gd2UgdXNlIEFCUyh6KSBiZWxvdy4KKyAqIE5vdGUgdGhhdCBmb2djb29yZHMgbWF5IGJlIG5lZ2F0aXZlLCBpZiBleWUgeiBpcyBzb3VyY2UgYWJzb2x1dGUKKyAqIHZhbHVlIG11c3QgYmUgdGFrZW4gZWFybGllci4KICAqIEZvZyBibGVuZCBmYWN0b3JzIGFyZSBpbiB0aGUgcmFuZ2UgWzAsMV0uCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0xNDgsMTEgKzE0OCwxMSBAQAogICAgc3RydWN0IGZvZ19zdGFnZV9kYXRhICpzdG9yZSA9IEZPR19TVEFHRV9EQVRBKHN0YWdlKTsKICAgIEdMdmVjdG9yNGYgKmlucHV0OwogCi0gICBpZiAoIWN0eC0+Rm9nLkVuYWJsZWQgfHwgY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50KQorCisgICBpZiAoIWN0eC0+Rm9nLkVuYWJsZWQpCiAgICAgICByZXR1cm4gR0xfVFJVRTsKIAotCi0gICBpZiAoY3R4LT5Gb2cuRm9nQ29vcmRpbmF0ZVNvdXJjZSA9PSBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpIHsKKyAgIGlmIChjdHgtPkZvZy5Gb2dDb29yZGluYXRlU291cmNlID09IEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCAmJiAhY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50KSB7CiAgICAgICBHTHVpbnQgaTsKICAgICAgIEdMZmxvYXQgKmNvb3JkOwogICAgICAgLyogRm9nIGlzIGNvbXB1dGVkIGZyb20gdmVydGV4IG9yIGZyYWdtZW50IFogdmFsdWVzICovCkBAIC0xNjksMTMgKzE2OSwxMCBAQAogCSAgKi8KIAkgaW5wdXQgPSAmc3RvcmUtPmZvZ2Nvb3JkOwogCi0gICAgICAgICAvKiBOT1RFOiBuZWdhdGUgcGxhbmUgaGVyZSBzbyB3ZSBnZXQgcG9zaXRpdmUgZm9nIGNvb3JkcyEgKi8KLQkgLyogTk9URTI6IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayAodGVzdHMvZm9nIC0gYWxsIGZyYWcgZGVwdGggZm9nCi0JICAgIGNvb3JkcyB3aWxsIGJlIG5lZ2F0aXZlKS4gKi8KLQkgcGxhbmVbMF0gPSAtbVsyXTsKLQkgcGxhbmVbMV0gPSAtbVs2XTsKLQkgcGxhbmVbMl0gPSAtbVsxMF07Ci0JIHBsYW5lWzNdID0gLW1bMTRdOworCSBwbGFuZVswXSA9IG1bMl07CisJIHBsYW5lWzFdID0gbVs2XTsKKwkgcGxhbmVbMl0gPSBtWzEwXTsKKwkgcGxhbmVbM10gPSBtWzE0XTsKIAkgLyogRnVsbCBleWUgY29vcmRzIHdlcmVuJ3QgcmVxdWlyZWQsIGp1c3QgY2FsY3VsYXRlIHRoZQogCSAgKiBleWUgWiB2YWx1ZXMuCiAJICAqLwpAQCAtMTg5LDEyICsxODYsMTIgQEAKIAkgICAgTk9URSBzaG91bGQgYXZvaWQgZ29pbmcgdGhyb3VnaCBhcnJheSB0d2ljZSAqLwogCSBjb29yZCA9IGlucHV0LT5zdGFydDsKIAkgZm9yIChpID0gMDsgaSA8IGlucHV0LT5jb3VudDsgaSsrKSB7Ci0JICAgIGlucHV0LT5kYXRhW2ldWzBdID0gRkFCU0YoKmNvb3JkKTsKKwkgICAgKmNvb3JkID0gRkFCU0YoKmNvb3JkKTsKIAkgICAgU1RSSURFX0YoY29vcmQsIGlucHV0LT5zdHJpZGUpOwogCSB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgIC8qIGZvZyBjb29yZGluYXRlcyA9IGV5ZSBaIGNvb3JkaW5hdGVzICh1c2UgQUJTIGxhdGVyKSAqLworICAgICAgICAgLyogZm9nIGNvb3JkaW5hdGVzID0gZXllIFogY29vcmRpbmF0ZXMgLSBuZWVkIHRvIGNvcHkgZm9yIEFCUyAqLwogCSBpbnB1dCA9ICZzdG9yZS0+Zm9nY29vcmQ7CiAKIAkgaWYgKFZCLT5FeWVQdHItPnNpemUgPCAyKQpAQCAtMjQ5LDcgKzI0Niw2IEBACiAgICAgICByZXR1cm4gR0xfRkFMU0U7CiAKICAgIF9tZXNhX3ZlY3RvcjRmX2FsbG9jKCAmc3RvcmUtPmZvZ2Nvb3JkLCAwLCB0bmwtPnZiLlNpemUsIDMyICk7Ci0gICBfbWVzYV92ZWN0b3I0Zl9pbml0KCAmc3RvcmUtPmlucHV0LCAwLCBOVUxMICk7CiAKICAgIGlmICghaW5pdGVkKQogICAgICAgaW5pdF9zdGF0aWNfZGF0YSgpOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdG5sL3RfdmJfcHJvZ3JhbS5jIGIvc3JjL21lc2EvdG5sL3RfdmJfcHJvZ3JhbS5jCmluZGV4IGM3NzhmNWQuLmY5OTQwMWMgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3RubC90X3ZiX3Byb2dyYW0uYworKysgYi9zcmMvbWVzYS90bmwvdF92Yl9wcm9ncmFtLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQotICogVmVyc2lvbjogIDYuNS4zCisgKiBWZXJzaW9uOiAgNy4xCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTQxLDkgKzQxLDEyOSBAQAogI2luY2x1ZGUgInN3cmFzdC9zX2NvbnRleHQuaCIKICNpbmNsdWRlICJzd3Jhc3Qvc190ZXhmaWx0ZXIuaCIKIAotI2luY2x1ZGUgInRubC5oIgotI2luY2x1ZGUgInRfY29udGV4dC5oIgotI2luY2x1ZGUgInRfcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJ0bmwvdG5sLmgiCisjaW5jbHVkZSAidG5sL3RfY29udGV4dC5oIgorI2luY2x1ZGUgInRubC90X3BpcGVsaW5lLmgiCisKKworCisvKiEKKyAqIFByaXZhdGUgc3RvcmFnZSBmb3IgdGhlIHZlcnRleCBwcm9ncmFtIHBpcGVsaW5lIHN0YWdlLgorICovCitzdHJ1Y3QgdnBfc3RhZ2VfZGF0YSB7CisgICAvKiogVGhlIHJlc3VsdHMgb2YgcnVubmluZyB0aGUgdmVydGV4IHByb2dyYW0gZ28gaW50byB0aGVzZSBhcnJheXMuICovCisgICBHTHZlY3RvcjRmIHJlc3VsdHNbVkVSVF9SRVNVTFRfTUFYXTsKKworICAgR0x2ZWN0b3I0ZiBuZGNDb29yZHM7ICAgICAgICAgICAgICAvKio8IG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkcyAqLworICAgR0x1Ynl0ZSAqY2xpcG1hc2s7ICAgICAgICAgICAgICAgICAvKio8IGNsaXAgZmxhZ3MgKi8KKyAgIEdMdWJ5dGUgb3JtYXNrLCBhbmRtYXNrOyAgICAgICAgICAgLyoqPCBmb3IgY2xpcHBpbmcgKi8KK307CisKKworI2RlZmluZSBWUF9TVEFHRV9EQVRBKHN0YWdlKSAoKHN0cnVjdCB2cF9zdGFnZV9kYXRhICopKHN0YWdlLT5wcml2YXRlUHRyKSkKKworCitzdGF0aWMgdm9pZAordXNlcmNsaXAoIEdMY29udGV4dCAqY3R4LAorICAgICAgICAgIEdMdmVjdG9yNGYgKmNsaXAsCisgICAgICAgICAgR0x1Ynl0ZSAqY2xpcG1hc2ssCisgICAgICAgICAgR0x1Ynl0ZSAqY2xpcG9ybWFzaywKKyAgICAgICAgICBHTHVieXRlICpjbGlwYW5kbWFzayApCit7CisgICBHTHVpbnQgcDsKKworICAgZm9yIChwID0gMDsgcCA8IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsgcCsrKSB7CisgICAgICBpZiAoY3R4LT5UcmFuc2Zvcm0uQ2xpcFBsYW5lc0VuYWJsZWQgJiAoMSA8PCBwKSkgeworCSBHTHVpbnQgbnIsIGk7CisJIGNvbnN0IEdMZmxvYXQgYSA9IGN0eC0+VHJhbnNmb3JtLl9DbGlwVXNlclBsYW5lW3BdWzBdOworCSBjb25zdCBHTGZsb2F0IGIgPSBjdHgtPlRyYW5zZm9ybS5fQ2xpcFVzZXJQbGFuZVtwXVsxXTsKKwkgY29uc3QgR0xmbG9hdCBjID0gY3R4LT5UcmFuc2Zvcm0uX0NsaXBVc2VyUGxhbmVbcF1bMl07CisJIGNvbnN0IEdMZmxvYXQgZCA9IGN0eC0+VHJhbnNmb3JtLl9DbGlwVXNlclBsYW5lW3BdWzNdOworICAgICAgICAgR0xmbG9hdCAqY29vcmQgPSAoR0xmbG9hdCAqKWNsaXAtPmRhdGE7CisgICAgICAgICBHTHVpbnQgc3RyaWRlID0gY2xpcC0+c3RyaWRlOworICAgICAgICAgR0x1aW50IGNvdW50ID0gY2xpcC0+Y291bnQ7CisKKwkgZm9yIChuciA9IDAsIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7CisJICAgIEdMZmxvYXQgZHAgPSAoY29vcmRbMF0gKiBhICsgCisJCQkgIGNvb3JkWzFdICogYiArCisJCQkgIGNvb3JkWzJdICogYyArCisJCQkgIGNvb3JkWzNdICogZCk7CisKKwkgICAgaWYgKGRwIDwgMCkgeworCSAgICAgICBucisrOworCSAgICAgICBjbGlwbWFza1tpXSB8PSBDTElQX1VTRVJfQklUOworCSAgICB9CisKKwkgICAgU1RSSURFX0YoY29vcmQsIHN0cmlkZSk7CisJIH0KKworCSBpZiAobnIgPiAwKSB7CisJICAgICpjbGlwb3JtYXNrIHw9IENMSVBfVVNFUl9CSVQ7CisJICAgIGlmIChuciA9PSBjb3VudCkgeworCSAgICAgICAqY2xpcGFuZG1hc2sgfD0gQ0xJUF9VU0VSX0JJVDsKKwkgICAgICAgcmV0dXJuOworCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0KK30KKworCitzdGF0aWMgR0xib29sZWFuCitkb19uZGNfY2xpcHRlc3QoR0xjb250ZXh0ICpjdHgsIHN0cnVjdCB2cF9zdGFnZV9kYXRhICpzdG9yZSkKK3sKKyAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CisgICBzdHJ1Y3QgdmVydGV4X2J1ZmZlciAqVkIgPSAmdG5sLT52YjsKKyAgIC8qIENsaXB0ZXN0IGFuZCBwZXJzcGVjdGl2ZSBkaXZpZGUuICBDbGlwIGZ1bmN0aW9ucyBtdXN0IGNsZWFyCisgICAgKiB0aGUgY2xpcG1hc2suCisgICAgKi8KKyAgIHN0b3JlLT5vcm1hc2sgPSAwOworICAgc3RvcmUtPmFuZG1hc2sgPSBDTElQX0ZSVVNUVU1fQklUUzsKKworICAgaWYgKHRubC0+TmVlZE5kY0Nvb3JkcykgeworICAgICAgVkItPk5kY1B0ciA9CisgICAgICAgICBfbWVzYV9jbGlwX3RhYltWQi0+Q2xpcFB0ci0+c2l6ZV0oIFZCLT5DbGlwUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm5kY0Nvb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUtPmNsaXBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm9ybWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3JlLT5hbmRtYXNrICk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIFZCLT5OZGNQdHIgPSBOVUxMOworICAgICAgX21lc2FfY2xpcF9ucF90YWJbVkItPkNsaXBQdHItPnNpemVdKCBWQi0+Q2xpcFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUtPmNsaXBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm9ybWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3JlLT5hbmRtYXNrICk7CisgICB9CisKKyAgIGlmIChzdG9yZS0+YW5kbWFzaykgeworICAgICAgLyogQWxsIHZlcnRpY2VzIGFyZSBvdXRzaWRlIHRoZSBmcnVzdHVtICovCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIC8qIFRlc3QgdXNlcmNsaXAgcGxhbmVzLiAgVGhpcyBjb250cmlidXRlcyB0byBWQi0+Q2xpcE1hc2suCisgICAgKi8KKyAgIC8qKiBYWFggTkVXX1NMQU5HIF9FbmFibGVkID8/PyAqLworICAgaWYgKGN0eC0+VHJhbnNmb3JtLkNsaXBQbGFuZXNFbmFibGVkICYmICghY3R4LT5WZXJ0ZXhQcm9ncmFtLl9FbmFibGVkIHx8CisgICAgICBjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudC0+SXNQb3NpdGlvbkludmFyaWFudCkpIHsKKyAgICAgIHVzZXJjbGlwKCBjdHgsCisJCVZCLT5DbGlwUHRyLAorCQlzdG9yZS0+Y2xpcG1hc2ssCisJCSZzdG9yZS0+b3JtYXNrLAorCQkmc3RvcmUtPmFuZG1hc2sgKTsKKworICAgICAgaWYgKHN0b3JlLT5hbmRtYXNrKSB7CisJIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgIH0KKworICAgVkItPkNsaXBBbmRNYXNrID0gc3RvcmUtPmFuZG1hc2s7CisgICBWQi0+Q2xpcE9yTWFzayA9IHN0b3JlLT5vcm1hc2s7CisgICBWQi0+Q2xpcE1hc2sgPSBzdG9yZS0+Y2xpcG1hc2s7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQogCiAKIC8qKgpAQCAtNTIsNyArMTcyLDYgQEAKICAqIHJlYWwgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHN3cmFzdC4gIEl0IHNob3VsZCBwcm9iYWJseSBiZQogICogbW92ZWQgaW50byBtYWluLyBzb21lZGF5LgogICovCi0KIHN0YXRpYyB2b2lkCiB2cF9mZXRjaF90ZXhlbChHTGNvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCB0ZXhjb29yZFs0XSwgR0xmbG9hdCBsYW1iZGEsCiAgICAgICAgICAgICAgICBHTHVpbnQgdW5pdCwgR0xmbG9hdCBjb2xvcls0XSkKQEAgLTg1LDIyICsyMDQsNiBAQAogfQogCiAKLS8qIQotICogUHJpdmF0ZSBzdG9yYWdlIGZvciB0aGUgdmVydGV4IHByb2dyYW0gcGlwZWxpbmUgc3RhZ2UuCi0gKi8KLXN0cnVjdCB2cF9zdGFnZV9kYXRhIHsKLSAgIC8qKiBUaGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBnbyBpbnRvIHRoZXNlIGFycmF5cy4gKi8KLSAgIEdMdmVjdG9yNGYgcmVzdWx0c1tWRVJUX1JFU1VMVF9NQVhdOwotCi0gICBHTHZlY3RvcjRmIG5kY0Nvb3JkczsgICAgICAgICAgICAgIC8qKjwgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRzICovCi0gICBHTHVieXRlICpjbGlwbWFzazsgICAgICAgICAgICAgICAgIC8qKjwgY2xpcCBmbGFncyAqLwotICAgR0x1Ynl0ZSBvcm1hc2ssIGFuZG1hc2s7ICAgICAgICAgICAvKio8IGZvciBjbGlwcGluZyAqLwotfTsKLQotCi0jZGVmaW5lIFZQX1NUQUdFX0RBVEEoc3RhZ2UpICgoc3RydWN0IHZwX3N0YWdlX2RhdGEgKikoc3RhZ2UtPnByaXZhdGVQdHIpKQotCi0KIC8qKgogICogSW5pdGlhbGl6ZSB2aXJ0dWFsIG1hY2hpbmUgc3RhdGUgcHJpb3IgdG8gZXhlY3V0aW5nIHZlcnRleCBwcm9ncmFtLgogICovCkBAIC0xMzksOTYgKzI0Miw1MCBAQAogCiAgICBtYWNoaW5lLT5GZXRjaFRleGVsTG9kID0gdnBfZmV0Y2hfdGV4ZWw7CiAgICBtYWNoaW5lLT5GZXRjaFRleGVsRGVyaXYgPSBOVUxMOyAvKiBub3QgdXNlZCBieSB2ZXJ0ZXggcHJvZ3JhbXMgKi8KKworICAgbWFjaGluZS0+U2FtcGxlcnMgPSBjdHgtPlZlcnRleFByb2dyYW0uX0N1cnJlbnQtPkJhc2UuU2FtcGxlclVuaXRzOwogfQogCiAKIC8qKgotICogQ29weSB0aGUgMTYgZWxlbWVudHMgb2YgYSBtYXRyaXggaW50byBmb3VyIGNvbnNlY3V0aXZlIHByb2dyYW0KLSAqIHJlZ2lzdGVycyBzdGFydGluZyBhdCAncG9zJy4KKyAqIE1hcCB0aGUgdGV4dHVyZSBpbWFnZXMgd2hpY2ggdGhlIHZlcnRleCBwcm9ncmFtIHdpbGwgYWNjZXNzIChpZiBhbnkpLgogICovCiBzdGF0aWMgdm9pZAotbG9hZF9tYXRyaXgoR0xmbG9hdCByZWdpc3RlcnNbXVs0XSwgR0x1aW50IHBvcywgY29uc3QgR0xmbG9hdCBtYXRbMTZdKQorbWFwX3RleHR1cmVzKEdMY29udGV4dCAqY3R4LCBjb25zdCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwKQogewotICAgR0x1aW50IGk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICByZWdpc3RlcnNbcG9zICsgaV1bMF0gPSBtYXRbMCArIGldOwotICAgICAgcmVnaXN0ZXJzW3BvcyArIGldWzFdID0gbWF0WzQgKyBpXTsKLSAgICAgIHJlZ2lzdGVyc1twb3MgKyBpXVsyXSA9IG1hdFs4ICsgaV07Ci0gICAgICByZWdpc3RlcnNbcG9zICsgaV1bM10gPSBtYXRbMTIgKyBpXTsKKyAgIEdMdWludCB1OworCisgICBpZiAoIWN0eC0+RHJpdmVyLk1hcFRleHR1cmUpCisgICAgICByZXR1cm47CisKKyAgIGZvciAodSA9IDA7IHUgPCBjdHgtPkNvbnN0Lk1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzOyB1KyspIHsKKyAgICAgIGlmICh2cC0+QmFzZS5UZXh0dXJlc1VzZWRbdV0pIHsKKyAgICAgICAgIC8qIE5vdGU6IF9DdXJyZW50ICpzaG91bGQqIGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBpbmRpY2F0ZWQKKyAgICAgICAgICAqIGluIFRleHR1cmVzVXNlZFt1XS4KKyAgICAgICAgICAqLworICAgICAgICAgY3R4LT5Ecml2ZXIuTWFwVGV4dHVyZShjdHgsIGN0eC0+VGV4dHVyZS5Vbml0W3VdLl9DdXJyZW50KTsKKyAgICAgIH0KICAgIH0KIH0KIAogCiAvKioKLSAqIEFzIGFib3ZlLCBidXQgdHJhbnNwb3NlIHRoZSBtYXRyaXguCisgKiBVbm1hcCB0aGUgdGV4dHVyZSBpbWFnZXMgd2hpY2ggd2VyZSB1c2VkIGJ5IHRoZSB2ZXJ0ZXggcHJvZ3JhbSAoaWYgYW55KS4KICAqLwogc3RhdGljIHZvaWQKLWxvYWRfdHJhbnNwb3NlX21hdHJpeChHTGZsb2F0IHJlZ2lzdGVyc1tdWzRdLCBHTHVpbnQgcG9zLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgbWF0WzE2XSkKK3VubWFwX3RleHR1cmVzKEdMY29udGV4dCAqY3R4LCBjb25zdCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwKQogewotICAgTUVNQ1BZKHJlZ2lzdGVyc1twb3NdLCBtYXQsIDE2ICogc2l6ZW9mKEdMZmxvYXQpKTsKLX0KKyAgIEdMdWludCB1OwogCisgICBpZiAoIWN0eC0+RHJpdmVyLk1hcFRleHR1cmUpCisgICAgICByZXR1cm47CiAKLS8qKgotICogTG9hZCBjdXJyZW50IHZlcnRleCBwcm9ncmFtJ3MgcGFyYW1ldGVyIHJlZ2lzdGVycyB3aXRoIHRyYWNrZWQKLSAqIG1hdHJpY2VzIChpZiBOViBwcm9ncmFtKS4gIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIHBlcgotICogZ2xCZWdpbi9nbEVuZCwgbm90IHBlci12ZXJ0ZXguCi0gKi8KLXZvaWQKLV9tZXNhX2xvYWRfdHJhY2tlZF9tYXRyaWNlcyhHTGNvbnRleHQgKmN0eCkKLXsKLSAgIEdMdWludCBpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgTUFYX05WX1ZFUlRFWF9QUk9HUkFNX1BBUkFNUyAvIDQ7IGkrKykgewotICAgICAgLyogcG9pbnQgJ21hdCcgYXQgc291cmNlIG1hdHJpeCAqLwotICAgICAgR0xtYXRyaXggKm1hdDsKLSAgICAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfTU9ERUxWSUVXKSB7Ci0gICAgICAgICBtYXQgPSBjdHgtPk1vZGVsdmlld01hdHJpeFN0YWNrLlRvcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA9PSBHTF9QUk9KRUNUSU9OKSB7Ci0gICAgICAgICBtYXQgPSBjdHgtPlByb2plY3Rpb25NYXRyaXhTdGFjay5Ub3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfVEVYVFVSRSkgewotICAgICAgICAgbWF0ID0gY3R4LT5UZXh0dXJlTWF0cml4U3RhY2tbY3R4LT5UZXh0dXJlLkN1cnJlbnRVbml0XS5Ub3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPT0gR0xfQ09MT1IpIHsKLSAgICAgICAgIG1hdCA9IGN0eC0+Q29sb3JNYXRyaXhTdGFjay5Ub3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV09PUdMX01PREVMVklFV19QUk9KRUNUSU9OX05WKSB7Ci0gICAgICAgICAvKiBYWFggdmVyaWZ5IHRoZSBjb21iaW5lZCBtYXRyaXggaXMgdXAgdG8gZGF0ZSAqLwotICAgICAgICAgbWF0ID0gJmN0eC0+X01vZGVsUHJvamVjdE1hdHJpeDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA+PSBHTF9NQVRSSVgwX05WICYmCi0gICAgICAgICAgICAgICBjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gPD0gR0xfTUFUUklYN19OVikgewotICAgICAgICAgR0x1aW50IG4gPSBjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhbaV0gLSBHTF9NQVRSSVgwX05WOwotICAgICAgICAgQVNTRVJUKG4gPCBNQVhfUFJPR1JBTV9NQVRSSUNFUyk7Ci0gICAgICAgICBtYXQgPSBjdHgtPlByb2dyYW1NYXRyaXhTdGFja1tuXS5Ub3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIC8qIG5vIG1hdHJpeCBpcyB0cmFja2VkLCBidXQgd2UgbGVhdmUgdGhlIHJlZ2lzdGVyIHZhbHVlcyBhcy1pcyAqLwotICAgICAgICAgYXNzZXJ0KGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFtpXSA9PSBHTF9OT05FKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBsb2FkIHRoZSBtYXRyaXggdmFsdWVzIGludG8gc2VxdWVudGlhbCByZWdpc3RlcnMgKi8KLSAgICAgIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhUcmFuc2Zvcm1baV0gPT0gR0xfSURFTlRJVFlfTlYpIHsKLSAgICAgICAgIGxvYWRfbWF0cml4KGN0eC0+VmVydGV4UHJvZ3JhbS5QYXJhbWV0ZXJzLCBpKjQsIG1hdC0+bSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdHgtPlZlcnRleFByb2dyYW0uVHJhY2tNYXRyaXhUcmFuc2Zvcm1baV0gPT0gR0xfSU5WRVJTRV9OVikgewotICAgICAgICAgX21hdGhfbWF0cml4X2FuYWx5c2UobWF0KTsgLyogdXBkYXRlIHRoZSBpbnZlcnNlICovCi0gICAgICAgICBBU1NFUlQoIV9tYXRoX21hdHJpeF9pc19kaXJ0eShtYXQpKTsKLSAgICAgICAgIGxvYWRfbWF0cml4KGN0eC0+VmVydGV4UHJvZ3JhbS5QYXJhbWV0ZXJzLCBpKjQsIG1hdC0+aW52KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5UcmFja01hdHJpeFRyYW5zZm9ybVtpXSA9PSBHTF9UUkFOU1BPU0VfTlYpIHsKLSAgICAgICAgIGxvYWRfdHJhbnNwb3NlX21hdHJpeChjdHgtPlZlcnRleFByb2dyYW0uUGFyYW1ldGVycywgaSo0LCBtYXQtPm0pOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBhc3NlcnQoY3R4LT5WZXJ0ZXhQcm9ncmFtLlRyYWNrTWF0cml4VHJhbnNmb3JtW2ldCi0gICAgICAgICAgICAgICAgPT0gR0xfSU5WRVJTRV9UUkFOU1BPU0VfTlYpOwotICAgICAgICAgX21hdGhfbWF0cml4X2FuYWx5c2UobWF0KTsgLyogdXBkYXRlIHRoZSBpbnZlcnNlICovCi0gICAgICAgICBBU1NFUlQoIV9tYXRoX21hdHJpeF9pc19kaXJ0eShtYXQpKTsKLSAgICAgICAgIGxvYWRfdHJhbnNwb3NlX21hdHJpeChjdHgtPlZlcnRleFByb2dyYW0uUGFyYW1ldGVycywgaSo0LCBtYXQtPmludik7CisgICBmb3IgKHUgPSAwOyB1IDwgY3R4LT5Db25zdC5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0czsgdSsrKSB7CisgICAgICBpZiAodnAtPkJhc2UuVGV4dHVyZXNVc2VkW3VdKSB7CisgICAgICAgICAvKiBOb3RlOiBfQ3VycmVudCAqc2hvdWxkKiBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgaW5kaWNhdGVkCisgICAgICAgICAgKiBpbiBUZXh0dXJlc1VzZWRbdV0uCisgICAgICAgICAgKi8KKyAgICAgICAgIGN0eC0+RHJpdmVyLlVubWFwVGV4dHVyZShjdHgsIGN0eC0+VGV4dHVyZS5Vbml0W3VdLl9DdXJyZW50KTsKICAgICAgIH0KICAgIH0KIH0KQEAgLTI1OSw2ICszMTYsNyBAQAogICAgICAgX21lc2FfbG9hZF9zdGF0ZV9wYXJhbWV0ZXJzKGN0eCwgcHJvZ3JhbS0+QmFzZS5QYXJhbWV0ZXJzKTsKICAgIH0KIAorICAgLyogbWFrZSBsaXN0IG9mIG91dHB1dHMgdG8gc2F2ZSBzb21lIHRpbWUgYmVsb3cgKi8KICAgIG51bU91dHB1dHMgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IFZFUlRfUkVTVUxUX01BWDsgaSsrKSB7CiAgICAgICBpZiAocHJvZ3JhbS0+QmFzZS5PdXRwdXRzV3JpdHRlbiAmICgxIDw8IGkpKSB7CkBAIC0yNjYsNiArMzI0LDggQEAKICAgICAgIH0KICAgIH0KIAorICAgbWFwX3RleHR1cmVzKGN0eCwgcHJvZ3JhbSk7CisKICAgIGZvciAoaSA9IDA7IGkgPCBWQi0+Q291bnQ7IGkrKykgewogICAgICAgR0x1aW50IGF0dHI7CiAKQEAgLTMxNyw2ICszNzcsOCBAQAogI2VuZGlmCiAgICB9CiAKKyAgIHVubWFwX3RleHR1cmVzKGN0eCwgcHJvZ3JhbSk7CisKICAgIC8qIEZpeHVwIGZvZyBhbmQgcG9pbnQgc2l6ZSByZXN1bHRzIGlmIG5lZWRlZCAqLwogICAgaWYgKHByb2dyYW0tPklzTlZQcm9ncmFtKSB7CiAgICAgICBpZiAoY3R4LT5Gb2cuRW5hYmxlZCAmJgpAQCAtMzM0LDEyICszOTYsMzkgQEAKICAgICAgIH0KICAgIH0KIAotICAgLyogU2V0dXAgdGhlIFZCIHBvaW50ZXJzIHNvIHRoYXQgdGhlIG5leHQgcGlwZWxpbmUgc3RhZ2VzIGdldAotICAgICogdGhlaXIgZGF0YSBmcm9tIHRoZSByaWdodCBwbGFjZSAodGhlIHByb2dyYW0gb3V0cHV0IGFycmF5cykuCi0gICAgKi8KLSAgIFZCLT5DbGlwUHRyID0gJnN0b3JlLT5yZXN1bHRzW1ZFUlRfUkVTVUxUX0hQT1NdOwotICAgVkItPkNsaXBQdHItPnNpemUgPSA0OwotICAgVkItPkNsaXBQdHItPmNvdW50ID0gVkItPkNvdW50OworICAgaWYgKHByb2dyYW0tPklzUG9zaXRpb25JbnZhcmlhbnQpIHsKKyAgICAgIC8qIFdlIG5lZWQgdGhlIGV4YWN0IHNhbWUgdHJhbnNmb3JtIGFzIGluIHRoZSBmaXhlZCBmdW5jdGlvbiBwYXRoIGhlcmUKKyAgICAgICAqIHRvIGd1YXJhbnRlZSBpbnZhcmlhbmNlLCBkZXBlbmRpbmcgb24gY29tcGlsZXIgb3B0aW1pemF0aW9uIGZsYWdzCisgICAgICAgKiByZXN1bHRzIGNvdWxkIGJlIGRpZmZlcmVudCBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIFZCLT5DbGlwUHRyID0gVHJhbnNmb3JtUmF3KCAmc3RvcmUtPnJlc3VsdHNbMF0sCisJCQkJICAmY3R4LT5fTW9kZWxQcm9qZWN0TWF0cml4LAorCQkJCSAgVkItPkF0dHJpYlB0clswXSApOworCisgICAgICAvKiBEcml2ZXJzIGV4cGVjdCB0aGlzIHRvIGJlIGNsZWFuIHRvIGVsZW1lbnQgNC4uLgorICAgICAgICovCisgICAgICBzd2l0Y2ggKFZCLT5DbGlwUHRyLT5zaXplKSB7CisgICAgICBjYXNlIDE6CisJIC8qIGltcG9zc2libGUgKi8KKyAgICAgIGNhc2UgMjoKKwkgX21lc2FfdmVjdG9yNGZfY2xlYW5fZWxlbSggVkItPkNsaXBQdHIsIFZCLT5Db3VudCwgMiApOworCSAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgMzoKKwkgX21lc2FfdmVjdG9yNGZfY2xlYW5fZWxlbSggVkItPkNsaXBQdHIsIFZCLT5Db3VudCwgMyApOworCSAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgNDoKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIFNldHVwIHRoZSBWQiBwb2ludGVycyBzbyB0aGF0IHRoZSBuZXh0IHBpcGVsaW5lIHN0YWdlcyBnZXQKKyAgICAgICAqIHRoZWlyIGRhdGEgZnJvbSB0aGUgcmlnaHQgcGxhY2UgKHRoZSBwcm9ncmFtIG91dHB1dCBhcnJheXMpLgorICAgICAgICovCisgICAgICBWQi0+Q2xpcFB0ciA9ICZzdG9yZS0+cmVzdWx0c1tWRVJUX1JFU1VMVF9IUE9TXTsKKyAgICAgIFZCLT5DbGlwUHRyLT5zaXplID0gNDsKKyAgICAgIFZCLT5DbGlwUHRyLT5jb3VudCA9IFZCLT5Db3VudDsKKyAgIH0KKwogICAgVkItPkNvbG9yUHRyWzBdID0gJnN0b3JlLT5yZXN1bHRzW1ZFUlRfUkVTVUxUX0NPTDBdOwogICAgVkItPkNvbG9yUHRyWzFdID0gJnN0b3JlLT5yZXN1bHRzW1ZFUlRfUkVTVUxUX0JGQzBdOwogICAgVkItPlNlY29uZGFyeUNvbG9yUHRyWzBdID0gJnN0b3JlLT5yZXN1bHRzW1ZFUlRfUkVTVUxUX0NPTDFdOwpAQCAtMzY1LDQxICs0NTQsMTAgQEAKICAgICAgIH0KICAgIH0KIAotICAgLyogQ2xpcHRlc3QgYW5kIHBlcnNwZWN0aXZlIGRpdmlkZS4gIENsaXAgZnVuY3Rpb25zIG11c3QgY2xlYXIKLSAgICAqIHRoZSBjbGlwbWFzay4KKworICAgLyogUGVyZm9ybSBOREMgYW5kIGNsaXB0ZXN0IG9wZXJhdGlvbnM6CiAgICAgKi8KLSAgIHN0b3JlLT5vcm1hc2sgPSAwOwotICAgc3RvcmUtPmFuZG1hc2sgPSBDTElQX0ZSVVNUVU1fQklUUzsKLQotICAgaWYgKHRubC0+TmVlZE5kY0Nvb3JkcykgewotICAgICAgVkItPk5kY1B0ciA9Ci0gICAgICAgICBfbWVzYV9jbGlwX3RhYltWQi0+Q2xpcFB0ci0+c2l6ZV0oIFZCLT5DbGlwUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm5kY0Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUtPmNsaXBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm9ybWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3JlLT5hbmRtYXNrICk7Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIFZCLT5OZGNQdHIgPSBOVUxMOwotICAgICAgX21lc2FfY2xpcF9ucF90YWJbVkItPkNsaXBQdHItPnNpemVdKCBWQi0+Q2xpcFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUtPmNsaXBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcmUtPm9ybWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3JlLT5hbmRtYXNrICk7Ci0gICB9Ci0KLSAgIGlmIChzdG9yZS0+YW5kbWFzaykgIC8qIEFsbCB2ZXJ0aWNlcyBhcmUgb3V0c2lkZSB0aGUgZnJ1c3R1bSAqLwotICAgICAgcmV0dXJuIEdMX0ZBTFNFOwotCi0KLSAgIC8qIFRoaXMgaXMgd2hlcmUgd2UnZCBkbyBjbGlwIHRlc3RpbmcgYWdhaW5zdCB0aGUgdXNlci1kZWZpbmVkCi0gICAgKiBjbGlwcGluZyBwbGFuZXMsIGJ1dCB0aGV5J3JlIG5vdCBzdXBwb3J0ZWQgYnkgdmVydGV4IHByb2dyYW1zLgotICAgICovCi0KLSAgIFZCLT5DbGlwT3JNYXNrID0gc3RvcmUtPm9ybWFzazsKLSAgIFZCLT5DbGlwTWFzayA9IHN0b3JlLT5jbGlwbWFzazsKLQotICAgcmV0dXJuIEdMX1RSVUU7CisgICByZXR1cm4gZG9fbmRjX2NsaXB0ZXN0KGN0eCwgc3RvcmUpOwogfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3RubC90X3ZlcnRleF9zc2UuYyBiL3NyYy9tZXNhL3RubC90X3ZlcnRleF9zc2UuYwppbmRleCA5NmRlZjI1Li41M2E2ZTU1IDEwMDY0NAotLS0gYS9zcmMvbWVzYS90bmwvdF92ZXJ0ZXhfc3NlLmMKKysrIGIvc3JjL21lc2EvdG5sL3RfdmVydGV4X3NzZS5jCkBAIC0zOSw2ICszOSwxMiBAQAogI2luY2x1ZGUgIng4Ni9jb21tb25feDg2X2FzbS5oIgogCiAKKy8qKgorICogTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZvciBnZW5lcmF0ZWQgU1NFIGZ1bmN0aW9ucworICovCisjZGVmaW5lIE1BWF9TU0VfQ09ERV9TSVpFIDEwMjQKKworCiAjZGVmaW5lIFggICAgMAogI2RlZmluZSBZICAgIDEKICNkZWZpbmUgWiAgICAyCkBAIC02MTksNyArNjI1LDEwIEBACiAgICB4ODZfcG9wKCZwLT5mdW5jLCBjb3VudEVCUCk7CiAgICB4ODZfcmV0KCZwLT5mdW5jKTsKIAorICAgYXNzZXJ0KCF2dHgtPmVtaXQpOwogICAgdnR4LT5lbWl0ID0gKHRubF9lbWl0X2Z1bmMpeDg2X2dldF9mdW5jKCZwLT5mdW5jKTsKKworICAgYXNzZXJ0KCAoY2hhciAqKSBwLT5mdW5jLmNzciAtIChjaGFyICopIHAtPmZ1bmMuc3RvcmUgPD0gTUFYX1NTRV9DT0RFX1NJWkUgKTsKICAgIHJldHVybiBHTF9UUlVFOwogfQogCkBAIC02NDQsNyArNjUzLDEwIEBACiAgICBwLmlkZW50aXR5ID0geDg2X21ha2VfcmVnKGZpbGVfWE1NLCA2KTsKICAgIHAuY2hhbjAgPSB4ODZfbWFrZV9yZWcoZmlsZV9YTU0sIDcpOwogCi0gICB4ODZfaW5pdF9mdW5jKCZwLmZ1bmMpOworICAgaWYgKCF4ODZfaW5pdF9mdW5jX3NpemUoJnAuZnVuYywgTUFYX1NTRV9DT0RFX1NJWkUpKSB7CisgICAgICB2dHgtPmVtaXQgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgfQogCiAgICBpZiAoYnVpbGRfdmVydGV4X2VtaXQoJnApKSB7CiAgICAgICBfdG5sX3JlZ2lzdGVyX2Zhc3RwYXRoKCB2dHgsIEdMX1RSVUUgKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3RubC90X3ZwX2J1aWxkLmMgYi9zcmMvbWVzYS90bmwvdF92cF9idWlsZC5jCmluZGV4IGIzYjYzY2QuLjVlZjBmN2UgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3RubC90X3ZwX2J1aWxkLmMKKysrIGIvc3JjL21lc2EvdG5sL3RfdnBfYnVpbGQuYwpAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgNi41CisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2ICBUdW5nc3RlbiBHcmFwaGljcyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIFR1bmdzdGVuIEdyYXBoaWNzICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTQ0LDkgKzQ0LDEyIEBACiAKICAgIGlmICghY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50IHx8CiAgICAgICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50ID09IGN0eC0+VmVydGV4UHJvZ3JhbS5fVG5sUHJvZ3JhbSkgewotICAgICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50Ci0gICAgICAgICA9IGN0eC0+VmVydGV4UHJvZ3JhbS5fVG5sUHJvZ3JhbQotICAgICAgICAgPSBfbWVzYV9nZXRfZml4ZWRfZnVuY192ZXJ0ZXhfcHJvZ3JhbShjdHgpOworICAgICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpuZXdQcm9nOworCisgICAgICBuZXdQcm9nID0gX21lc2FfZ2V0X2ZpeGVkX2Z1bmNfdmVydGV4X3Byb2dyYW0oY3R4KTsKKworICAgICAgX21lc2FfcmVmZXJlbmNlX3ZlcnRwcm9nKGN0eCwgJmN0eC0+VmVydGV4UHJvZ3JhbS5fVG5sUHJvZ3JhbSwgbmV3UHJvZyk7CisgICAgICBfbWVzYV9yZWZlcmVuY2VfdmVydHByb2coY3R4LCAmY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LCBuZXdQcm9nKTsKICAgIH0KIAogICAgLyogVGVsbCB0aGUgZHJpdmVyIGFib3V0IHRoZSBjaGFuZ2UuICBDb3VsZCBkZWZpbmUgYSBuZXcgdGFyZ2V0IGZvcgpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdG5sL3RubC5oIGIvc3JjL21lc2EvdG5sL3RubC5oCmluZGV4IDRiZGJlZDkuLjRkNjI4YWEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3RubC90bmwuaAorKysgYi9zcmMvbWVzYS90bmwvdG5sLmgKQEAgLTEsOSArMSw4IEBACi0KIC8qCiAgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5Ci0gKiBWZXJzaW9uOiAgMy41CisgKiBWZXJzaW9uOiAgNy4xCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdG5sX2RkL3RfZGRfdHJpdG1wLmggYi9zcmMvbWVzYS90bmxfZGQvdF9kZF90cml0bXAuaAppbmRleCAwYmYzMmZmLi4xYWU3MGY0IDEwMDY0NAotLS0gYS9zcmMvbWVzYS90bmxfZGQvdF9kZF90cml0bXAuaAorKysgYi9zcmMvbWVzYS90bmxfZGQvdF9kZF90cml0bXAuaApAQCAtMTU1LDEwICsxNTUsNiBAQAogICAgICAgewogCSBmYWNpbmcgPSBBUkVBX0lTX0NDVyggY2MgKSBeIGN0eC0+UG9seWdvbi5fRnJvbnRCaXQ7CiAKLSAgICAgICAgIGlmIChET19UV09TVEVOQ0lMICYmIGN0eC0+U3RlbmNpbC5UZXN0VHdvU2lkZSkgewotICAgICAgICAgICAgY3R4LT5fRmFjaW5nID0gZmFjaW5nOyAvKiBtaXhlZCBtb2RlIHJlbmRlcmluZzogZm9yIDItc2lkZWQgc3RlbmNpbCB0ZXN0ICovCi0gICAgICAgICB9Ci0KIAkgaWYgKERPX1VORklMTEVEKSB7CiAJICAgIGlmIChmYWNpbmcpIHsKIAkgICAgICAgbW9kZSA9IGN0eC0+UG9seWdvbi5CYWNrTW9kZTsKQEAgLTI3MSw3ICsyNjcsNyBAQAogCSAgICBHTGZsb2F0IGJjCT0gYiAqIGljOwogCSAgICBpZiAoIGFjIDwgMC4wZiApIGFjID0gLWFjOwogCSAgICBpZiAoIGJjIDwgMC4wZiApIGJjID0gLWJjOwotCSAgICBvZmZzZXQgKz0gTUFYMiggYWMsIGJjICkgKiBjdHgtPlBvbHlnb24uT2Zmc2V0RmFjdG9yOworCSAgICBvZmZzZXQgKz0gTUFYMiggYWMsIGJjICkgKiBjdHgtPlBvbHlnb24uT2Zmc2V0RmFjdG9yIC8gY3R4LT5EcmF3QnVmZmVyLT5fTVJEOwogCSB9CiAJIG9mZnNldCAqPSBjdHgtPkRyYXdCdWZmZXItPl9NUkQgKiAoUkVWRVJTRV9ERVBUSCA/IC0xLjAgOiAxLjApOwogICAgICAgfQpAQCAtMzkzLDcgKzM4OSw3IEBACiAKICNpZiBET19RVUFECiAjaWYgRE9fRlVMTF9RVUFECi1zdGF0aWMgdm9pZCBUQUcocXVhZCkoIEdMY29udGV4dCAqY3R4LAorc3RhdGljIHZvaWQgVEFHKHF1YWRyKSggR0xjb250ZXh0ICpjdHgsCiAJCSAgICAgICBHTHVpbnQgZTAsIEdMdWludCBlMSwgR0x1aW50IGUyLCBHTHVpbnQgZTMgKQogewogICAgc3RydWN0IHZlcnRleF9idWZmZXIgKlZCID0gJlROTF9DT05URVhUKCBjdHggKS0+dmI7CkBAIC00MjEsMTAgKzQxNyw2IEBACiAgICAgICB7CiAJIGZhY2luZyA9IEFSRUFfSVNfQ0NXKCBjYyApIF4gY3R4LT5Qb2x5Z29uLl9Gcm9udEJpdDsKIAotICAgICAgICAgaWYgKERPX1RXT1NURU5DSUwgJiYgY3R4LT5TdGVuY2lsLlRlc3RUd29TaWRlKSB7Ci0gICAgICAgICAgICBjdHgtPl9GYWNpbmcgPSBmYWNpbmc7IC8qIG1peGVkIG1vZGUgcmVuZGVyaW5nOiBmb3IgMi1zaWRlZCBzdGVuY2lsIHRlc3QgKi8KLSAgICAgICAgIH0KLQogCSBpZiAoRE9fVU5GSUxMRUQpIHsKIAkgICAgaWYgKGZhY2luZykgewogCSAgICAgICBtb2RlID0gY3R4LT5Qb2x5Z29uLkJhY2tNb2RlOwpAQCAtNTQ3LDcgKzUzOSw3IEBACiAJICAgIEdMZmxvYXQgYmMJPSBiICogaWM7CiAJICAgIGlmICggYWMgPCAwLjBmICkgYWMgPSAtYWM7CiAJICAgIGlmICggYmMgPCAwLjBmICkgYmMgPSAtYmM7Ci0JICAgIG9mZnNldCArPSBNQVgyKCBhYywgYmMgKSAqIGN0eC0+UG9seWdvbi5PZmZzZXRGYWN0b3I7CisJICAgIG9mZnNldCArPSBNQVgyKCBhYywgYmMgKSAqIGN0eC0+UG9seWdvbi5PZmZzZXRGYWN0b3IgLyBjdHgtPkRyYXdCdWZmZXItPl9NUkQ7CiAJIH0KIAkgb2Zmc2V0ICo9IGN0eC0+RHJhd0J1ZmZlci0+X01SRCAqIChSRVZFUlNFX0RFUFRIID8gLTEuMCA6IDEuMCk7CiAgICAgICB9CkBAIC02ODEsNyArNjczLDcgQEAKICAgIH0KIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBUQUcocXVhZCkoIEdMY29udGV4dCAqY3R4LCBHTHVpbnQgZTAsCitzdGF0aWMgdm9pZCBUQUcocXVhZHIpKCBHTGNvbnRleHQgKmN0eCwgR0x1aW50IGUwLAogCQkgICAgICAgR0x1aW50IGUxLCBHTHVpbnQgZTIsIEdMdWludCBlMyApCiB7CiAgICBpZiAoRE9fVU5GSUxMRUQpIHsKQEAgLTc3Myw3ICs3NjUsNyBAQAogc3RhdGljIHZvaWQgVEFHKGluaXQpKCB2b2lkICkKIHsKICNpZiBET19RVUFECi0gICBUQUJbSU5EXS5xdWFkID0gVEFHKHF1YWQpOworICAgVEFCW0lORF0ucXVhZCA9IFRBRyhxdWFkcik7CiAjZW5kaWYKICNpZiBET19UUkkKICAgIFRBQltJTkRdLnRyaWFuZ2xlID0gVEFHKHRyaWFuZ2xlKTsKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3Ziby9kZXNjcmlwLm1tcyBiL3NyYy9tZXNhL3Ziby9kZXNjcmlwLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmExNmEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lc2EvdmJvL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsNjIgQEAKKyMgTWFrZWZpbGUgZm9yIGNvcmUgbGlicmFyeSBmb3IgVk1TCisjIGNvbnRyaWJ1dGVkIGJ5IEpvdWsgSmFuc2VuICBqb3VrakBocmVtLm5hbm8udHVkZWxmdC5ubAorIyBMYXN0IHJldmlzaW9uIDogMyBPY3RvYmVyIDIwMDcKKworLmZpcnN0CisJZGVmaW5lIGdsIFstLS0uaW5jbHVkZS5nbF0KKwlkZWZpbmUgbWF0aCBbLS5tYXRoXQorCWRlZmluZSB2Ym8gWy0udmJvXQorCWRlZmluZSB0bmwgWy0udG5sXQorCWRlZmluZSBzaGFkZXIgWy0uc2hhZGVyXQorCWRlZmluZSBzd3Jhc3QgWy0uc3dyYXN0XQorCWRlZmluZSBzd3Jhc3Rfc2V0dXAgWy0uc3dyYXN0X3NldHVwXQorCWRlZmluZSBtYWluIFstLm1haW5dCisJZGVmaW5lIGdsYXBpIFstLmdsYXBpXQorCisuaW5jbHVkZSBbLS0tXW1tcy1jb25maWcuCisKKyMjIyMjIE1BQ1JPUyAjIyMjIworCitWUEFUSCA9IFJDUworCitJTkNESVIgPSBbLS0tLmluY2x1ZGVdLFstLm1haW5dLFstLmdsYXBpXSxbLS5zaGFkZXJdLFstLnNoYWRlci5zbGFuZ10KK0xJQkRJUiA9IFstLS0ubGliXQorQ0ZMQUdTID0gL2luY2x1ZGU9KCQoSU5DRElSKSxbXSkvZGVmaW5lPShQVEhSRUFEUz0xKS9uYW1lPShhc19pcyxzaG9ydCkvZmxvYXQ9aWVlZS9pZWVlPWRlbm9ybQorCitTT1VSQ0VTID12Ym9fY29udGV4dC5jLHZib19leGVjLmMsdmJvX2V4ZWNfYXBpLmMsdmJvX2V4ZWNfYXJyYXkuYyxcCisJdmJvX2V4ZWNfZHJhdy5jLHZib19leGVjX2V2YWwuYyx2Ym9fcmViYXNlLmMsdmJvX3NhdmUuYyxcCisJdmJvX3NhdmVfYXBpLmMsdmJvX3NhdmVfZHJhdy5jLHZib19zYXZlX2xvb3BiYWNrLmMsXAorCXZib19zcGxpdC5jLHZib19zcGxpdF9jb3B5LmMsdmJvX3NwbGl0X2lucGxhY2UuYworCitPQkpFQ1RTID12Ym9fY29udGV4dC5vYmosdmJvX2V4ZWMub2JqLHZib19leGVjX2FwaS5vYmosdmJvX2V4ZWNfYXJyYXkub2JqLFwKKwl2Ym9fZXhlY19kcmF3Lm9iaix2Ym9fZXhlY19ldmFsLm9iaix2Ym9fcmViYXNlLm9iaix2Ym9fc2F2ZS5vYmosXAorCXZib19zYXZlX2FwaS5vYmosdmJvX3NhdmVfZHJhdy5vYmosdmJvX3NhdmVfbG9vcGJhY2sub2JqLFwKKwl2Ym9fc3BsaXQub2JqLHZib19zcGxpdF9jb3B5Lm9iaix2Ym9fc3BsaXRfaW5wbGFjZS5vYmoKKworIyMjIyMgUlVMRVMgIyMjIyMKKworVkVSU0lPTj1NZXNhIFYzLjQKKworIyMjIyMgVEFSR0VUUyAjIyMjIworIyBNYWtlIHRoZSBsaWJyYXJ5CiskKExJQkRJUikkKEdMX0xJQikgOiAkKE9CSkVDVFMpCisgIEAgbGlicmFyeSAkKExJQkRJUikkKEdMX0xJQikgJChPQkpFQ1RTKQorCitjbGVhbiA6CisJcHVyZ2UKKwlkZWxldGUgKi5vYmo7KgorCit2Ym9fY29udGV4dC5vYmogOiB2Ym9fY29udGV4dC5jCit2Ym9fZXhlYy5vYmogOiB2Ym9fZXhlYy5jCit2Ym9fZXhlY19hcGkub2JqIDogdmJvX2V4ZWNfYXBpLmMKK3Zib19leGVjX2FycmF5Lm9iaiA6IHZib19leGVjX2FycmF5LmMKK3Zib19leGVjX2RyYXcub2JqIDogdmJvX2V4ZWNfZHJhdy5jCit2Ym9fZXhlY19ldmFsLm9iaiA6IHZib19leGVjX2V2YWwuYwordmJvX3JlYmFzZS5vYmogOiB2Ym9fcmViYXNlLmMKK3Zib19zYXZlLm9iaiA6IHZib19zYXZlLmMKK3Zib19zYXZlX2FwaS5vYmogOiB2Ym9fc2F2ZV9hcGkuYwordmJvX3NhdmVfZHJhdy5vYmogOiB2Ym9fc2F2ZV9kcmF3LmMKK3Zib19zYXZlX2xvb3BiYWNrLm9iaiA6IHZib19zYXZlX2xvb3BiYWNrLmMKK3Zib19zcGxpdC5vYmogOiB2Ym9fc3BsaXQuYwordmJvX3NwbGl0X2NvcHkub2JqIDogdmJvX3NwbGl0X2NvcHkuYwordmJvX3NwbGl0X2lucGxhY2Uub2JqIDogdmJvX3NwbGl0X2lucGxhY2UuYwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdmJvL3Zib19jb250ZXh0LmMgYi9zcmMvbWVzYS92Ym8vdmJvX2NvbnRleHQuYwppbmRleCBkYzdjNTM0Li42OTFiZjViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS92Ym8vdmJvX2NvbnRleHQuYworKysgYi9zcmMvbWVzYS92Ym8vdmJvX2NvbnRleHQuYwpAQCAtMTE0LDYgKzExNCw4IEBACiAgICBzdHJ1Y3QgZ2xfY2xpZW50X2FycmF5ICphcnJheXMgPSB2Ym8tPm1hdF9jdXJydmFsOwogICAgR0x1aW50IGk7CiAKKyAgIEFTU0VSVChOUl9NQVRfQVRUUklCUyA9PSBNQVRfQVRUUklCX01BWCk7CisKICAgIG1lbXNldChhcnJheXMsIDAsIHNpemVvZigqYXJyYXlzKSAqIE5SX01BVF9BVFRSSUJTKTsKIAogICAgLyogU2V0IHVwIGEgY29uc3RhbnQgKFN0cmlkZUIgPT0gMCkgYXJyYXkgZm9yIGVhY2ggY3VycmVudApAQCAtMTM5LDExICsxNDEsNyBAQAogCSBicmVhazsKICAgICAgIH0KIAotICAgICAgaWYgKGkgPCBNQVRfQVRUUklCX01BWCkKLQkgY2wtPlB0ciA9IChjb25zdCB2b2lkICopY3R4LT5MaWdodC5NYXRlcmlhbC5BdHRyaWJbaV07Ci0gICAgICBlbHNlIAotCSBjbC0+UHRyID0gKGNvbnN0IHZvaWQgKiljdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX0dFTkVSSUMwICsgaV07Ci0KKyAgICAgIGNsLT5QdHIgPSAoY29uc3Qgdm9pZCAqKWN0eC0+TGlnaHQuTWF0ZXJpYWwuQXR0cmliW2ldOwogICAgICAgY2wtPlR5cGUgPSBHTF9GTE9BVDsKICAgICAgIGNsLT5TdHJpZGUgPSAwOwogICAgICAgY2wtPlN0cmlkZUIgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EvdmJvL3Zib19zcGxpdF9jb3B5LmMgYi9zcmMvbWVzYS92Ym8vdmJvX3NwbGl0X2NvcHkuYwppbmRleCBlNWM0NDI5Li42ODVjYzBmIDEwMDY0NAotLS0gYS9zcmMvbWVzYS92Ym8vdmJvX3NwbGl0X2NvcHkuYworKysgYi9zcmMvbWVzYS92Ym8vdmJvX3NwbGl0X2NvcHkuYwpAQCAtMTI5LDYgKzEyOSwxMyBAQAogICovCiBzdGF0aWMgR0xib29sZWFuIGNoZWNrX2ZsdXNoKCBzdHJ1Y3QgY29weV9jb250ZXh0ICpjb3B5ICkKIHsKKyAgIEdMZW51bSBtb2RlID0gY29weS0+ZHN0cHJpbVtjb3B5LT5kc3RwcmltX25yXS5tb2RlOyAKKworICAgaWYgKEdMX1RSSUFOR0xFX1NUUklQID09IG1vZGUgJiYKKyAgICAgICBjb3B5LT5kc3RlbHRfbnIgJiAxKSB7IC8qIHNlZSBidWc5OTYyICovCisgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCiAgICBpZiAoY29weS0+ZHN0YnVmX25yICsgNCA+IGNvcHktPmRzdGJ1Zl9zaXplKQogICAgICAgcmV0dXJuIEdMX1RSVUU7CiAKQEAgLTQ1OCw3ICs0NjUsNyBAQAogICAgICAgZHN0LT5TdHJpZGVCID0gY29weS0+dmVydGV4X3NpemU7CiAgICAgICBkc3QtPlB0ciA9IGNvcHktPmRzdGJ1ZiArIG9mZnNldDsKICAgICAgIGRzdC0+RW5hYmxlZCA9IEdMX1RSVUU7Ci0gICAgICBkc3QtPk5vcm1hbGl6ZWQgPSBHTF9UUlVFOworICAgICAgZHN0LT5Ob3JtYWxpemVkID0gc3JjLT5Ob3JtYWxpemVkOyAKICAgICAgIGRzdC0+QnVmZmVyT2JqID0gY3R4LT5BcnJheS5OdWxsQnVmZmVyT2JqOwogICAgICAgZHN0LT5fTWF4RWxlbWVudCA9IGNvcHktPmRzdGJ1Zl9zaXplOyAvKiBtYXkgYmUgbGVzcyEgKi8KIApkaWZmIC0tZ2l0IGEvc3JjL21lc2EveDg2LTY0L01ha2VmaWxlIGIvc3JjL21lc2EveDg2LTY0L01ha2VmaWxlCmluZGV4IGFiNThhYTYuLjljM2U5ZDIgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3g4Ni02NC9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS94ODYtNjQvTWFrZWZpbGUKQEAgLTE5LDcgKzE5LDcgQEAKIGRlZmF1bHQ6IG1hdHlwZXMuaAogCiBjbGVhbjoKLQlybSAtZiBtYXR5cGVzLmgKKwktcm0gLWYgbWF0eXBlcy5oCiAKIAogIyBuZWVkIHNvbWUgc3BlY2lhbCBydWxlcyBoZXJlLCB1bmZvcnR1bmF0ZWx5CmRpZmYgLS1naXQgYS9zcmMvbWVzYS94ODYtNjQveGZvcm00LlMgYi9zcmMvbWVzYS94ODYtNjQveGZvcm00LlMKaW5kZXggNjY3ZWNmNi4uM2Y5YzlkNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EveDg2LTY0L3hmb3JtNC5TCisrKyBiL3NyYy9tZXNhL3g4Ni02NC94Zm9ybTQuUwpAQCAtMSw5ICsxLDggQEAKLQogLyoKICAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKLSAqIFZlcnNpb246ICAzLjUKKyAqIFZlcnNpb246ICA3LjEKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC02Myw3ICs2Miw3IEBACiAKIHA0X2dlbmVyYWxfbG9vcDoKIAotCW1vdmFwcyAoJXJkeCksICV4bW04CQkvKiBveCB8IG95IHwgb3ogfCBvdyAqLworCW1vdnVwcyAoJXJkeCksICV4bW04CQkvKiBveCB8IG95IHwgb3ogfCBvdyAqLwogCXByZWZldGNodyAxNiglcmRpKQogCiAJcHNodWZkICQweDAwLCAleG1tOCwgJXhtbTAJLyogb3ggfCBveCB8IG94IHwgb3ggKi8KQEAgLTE0OCw3ICsxNDcsNyBAQAogCiBwNF8zZF9sb29wOgogCi0JbW92YXBzICglcmR4KSwgJXhtbTgJCS8qIG94IHwgb3kgfCBveiB8IG93ICovCisJbW92dXBzICglcmR4KSwgJXhtbTgJCS8qIG94IHwgb3kgfCBveiB8IG93ICovCiAJcHJlZmV0Y2h3IDE2KCVyZGkpCiAKIAlwc2h1ZmQgJDB4MDAsICV4bW04LCAleG1tMAkvKiBveCB8IG94IHwgb3ggfCBveCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21lc2EveDg2L01ha2VmaWxlIGIvc3JjL21lc2EveDg2L01ha2VmaWxlCmluZGV4IDA5NDgxZGMuLmFhNDlhOTEgMTAwNjQ0Ci0tLSBhL3NyYy9tZXNhL3g4Ni9NYWtlZmlsZQorKysgYi9zcmMvbWVzYS94ODYvTWFrZWZpbGUKQEAgLTE3LDcgKzE3LDcgQEAKIGRlZmF1bHQ6IGdlbl9tYXR5cGVzIG1hdHlwZXMuaAogCiBjbGVhbjoKLQlybSAtZiBtYXR5cGVzLmggZ2VuX21hdHlwZXMKKwktcm0gLWYgbWF0eXBlcy5oIGdlbl9tYXR5cGVzCiAKIAogZ2VuX21hdHlwZXM6IGdlbl9tYXR5cGVzLmMKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3g4Ni9yZWFkX3JnYmFfc3Bhbl94ODYuUyBiL3NyYy9tZXNhL3g4Ni9yZWFkX3JnYmFfc3Bhbl94ODYuUwppbmRleCAzY2JjZDcxLi44MDE0NGI4IDEwMDY0NAotLS0gYS9zcmMvbWVzYS94ODYvcmVhZF9yZ2JhX3NwYW5feDg2LlMKKysrIGIvc3JjL21lc2EveDg2L3JlYWRfcmdiYV9zcGFuX3g4Ni5TCkBAIC0zMywyMCArMzMsNyBAQAogCS5maWxlCSJyZWFkX3JnYmFfc3Bhbl94ODYuUyIKICNpZiAhZGVmaW5lZChfX0RKR1BQX18pICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAvKiB0aGlzIG9uZSBjcmllcyBmb3IgYXNzeW50YXguaCAqLwogLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgotICogUmVwbGFjZSBkYXRhIHNlZ21lbnQgY29uc3RhbnRzIHdpdGggdGV4dC1zZWdtZW50IGluc3RydWN0aW9ucwotCS5zZWN0aW9uCS5yb2RhdGEKLQkuYWxpZ24gMTYKLQkudHlwZQltYXNrLCBAb2JqZWN0Ci0JLnNpemUJbWFzaywgMzIKLW1hc2s6Ci0JLmxvbmcJMHhmZjAwZmYwMAotCS5sb25nCTB4ZmYwMGZmMDAKLQkubG9uZwkweGZmMDBmZjAwCi0JLmxvbmcJMHhmZjAwZmYwMAotCS5sb25nCTB4MDBmZjAwMDAKLQkubG9uZwkweDAwZmYwMDAwCi0JLmxvbmcJMHgwMGZmMDAwMAotCS5sb25nCTB4MDBmZjAwMDAKKyAqIFJlcGxhY2VkIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zLgogICovCiAjZGVmaW5lCUxPQURfTUFTSyhtdmlucyxtMSxtMikgXAogICAgCXB1c2hsCSQweGZmMDBmZjAwIDtcCkBAIC02MSw4ICs0OCw3IEBACiAJbXZpbnMJKCVlc3ApLCBtMgk7XAogCWFkZGwJJDMyLCAlZXNwCiAKLQotLyogSSBpbXBsZW1lbnRlZCB0aGVzZSBhcyBtYWNyb3MgYmVjYXVzZSB0aGUgYXBwZWFyIGluIHF1aXRlIGEgZmV3IHBsYWNlcywKKy8qIEkgaW1wbGVtZW50ZWQgdGhlc2UgYXMgbWFjcm9zIGJlY2F1c2UgdGhleSBhcHBlYXIgaW4gc2V2ZXJhbCBwbGFjZXMsCiAgKiBhbmQgSSd2ZSB0d2Vha2VkIHRoZW0gYSBudW1iZXIgb2YgdGltZXMuICBJIGdvdCB0aXJlZCBvZiBjaGFuZ2luZyBldmVyeQogICogcGxhY2UgdGhleSBhcHBlYXIuIDopCiAgKi8KQEAgLTk5LDExICs4NSw2IEBACiAjaWZkZWYgVVNFX0lOTkVSX0VNTVMKIAllbW1zCiAjZW5kaWYKLS8qIEtldmluIEYuIFF1aW5uIDJuZCBKdWx5IDIwMDYKLSAqIFJlcGxhY2UgZGF0YSBzZWdtZW50IGNvbnN0YW50cyB3aXRoIHRleHQtc2VnbWVudCBpbnN0cnVjdGlvbnMKLQltb3ZxCW1hc2ssICVtbTEKLQltb3ZxCW1hc2srMTYsICVtbTIKLSAqLwogCUxPQURfTUFTSyhtb3ZxLCVtbTEsJW1tMikKIAogCW1vdmwJOCglZXNwKSwgJWVieAkvKiBzb3VyY2UgcG9pbnRlciAqLwpAQCAtMjAxLDExICsxODIsNyBAQAogI2lmZGVmIFVTRV9JTk5FUl9FTU1TCiAJZW1tcwogI2VuZGlmCi0vKiBLZXZpbiBGLiBRdWlubiAybmQgSnVseSAyMDA2Ci0gKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCi0JbW92cQltYXNrLCAlbW0xCi0JbW92cQltYXNrKzE2LCAlbW0yCi0gKi8KKwogCUxPQURfTUFTSyhtb3ZxLCVtbTEsJW1tMikKIAogCW1vdmwJMTYoJWVzcCksICVlYngJLyogc291cmNlIHBvaW50ZXIgKi8KQEAgLTM2NCwxMSArMzQxLDYgQEAKIAlwdXNobAklZXNpCiAJcHVzaGwJJWVieAogCi0vKiBLZXZpbiBGLiBRdWlubiAybmQgSnVseSAyMDA2Ci0gKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCi0JbW92ZHFhCW1hc2ssICV4bW0xCi0JbW92ZHFhCW1hc2srMTYsICV4bW0yCi0gKi8KIAlMT0FEX01BU0sobW92ZHF1LCV4bW0xLCV4bW0yKQogCiAJbW92bAkxMiglZXNwKSwgJWVieAkvKiBzb3VyY2UgcG9pbnRlciAqLwpAQCAtNDYyLDcgKzQzNCw4IEBACiAJamUJLkw0NwogCiAJbW92cQkoJWVieCksICV4bW0wCi0KKwlhZGRsCSQ4LCAlZWJ4CisgICAgICAgIAogCW1vdmRxYQkleG1tMCwgJXhtbTMKIAltb3ZkcWEJJXhtbTAsICV4bW00CiAJYW5kcHMJJXhtbTEsICV4bW0wCkBAIC00NzYsNiArNDQ5LDcgQEAKIAlvcnBzCSV4bW0zLCAleG1tMAogCiAJbW92cQkleG1tMCwgKCVlY3gpCisJYWRkbAkkOCwgJWVjeCAgICAgICAgCiAuTDQ3OgogCiAJdGVzdGwJJDEsICVlZHgKQEAgLTQ5MSw2MCArNDY1LDEyIEBACiAKIAogCi0vKiBLZXZpbiBGLiBRdWlubiAybmQgSnVseSAyMDA2Ci0gKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCi0gKi8KLSNpZiAwCi0JLnNlY3Rpb24JLnJvZGF0YQotCi0JLmFsaWduCTE2Ci1tYXNrXzU2NToKLQkud29yZAkweGY4MDAKLQkud29yZAkweDA3ZTAKLQkud29yZAkweDAwMWYKLQkud29yZAkweDAwMDAKLQotLyogU2V0dGluZyBTQ0FMRV9BREpVU1QgdG8gNSBnaXZlcyBhIHBlcmZlY3QgbWF0Y2ggd2l0aCB0aGUgY2xhc3NpYyBDCi0gKiBpbXBsZW1lbnRhdGlvbiBpbiBNZXNhLiAgU2V0dGluZyBTQ0FMRV9BREpVU1QgdG8gMCBpcyBzbGlnaHRseSBmYXN0ZXIgYnV0Ci0gKiBhdCBhIHNtYWxsIGNvc3QgdG8gYWNjdXJhY3kuCi0gKi8KLQotI2RlZmluZSBTQ0FMRV9BREpVU1QJNQotI2lmIFNDQUxFX0FESlVTVCA9PSA1Ci1wcmVzY2FsZToKLQkud29yZAkweDAwMDEKLQkud29yZAkweDAwMTAKLQkud29yZAkweDAyMDAKLQkud29yZAkweDAwMDAKLQotc2NhbGU6Ci0JLndvcmQJMHgyMGU4CQkvKiAoMHgwMGZmMDAwMCAvIDB4MDAwMDA3YzApICsgMSAqLwotCS53b3JkCTB4NDBjNQkJLyogKDB4MDBmZjAwMDAgLyAweDAwMDAwM2YwKSArIDEgKi8KLQkud29yZAkweDgzOWQJCS8qICgweDAwZmYwMDAwIC8gMHgwMDAwMDFmMCkgKyAxICovCi0JLndvcmQJMHgwMDAwCi0jZWxpZiBTQ0FMRV9BREpVU1QgPT0gMAotcHJlc2NhbGU6Ci0JLndvcmQJMHgwMDAxCi0JLndvcmQJMHgwMDIwCi0JLndvcmQJMHgwODAwCi0JLndvcmQJMHgwMDAwCi0KLXNjYWxlOgotCS53b3JkCTB4MDEwOAkJLyogKDB4MDBmZjAwMDAgLyAweDAwMDBmODAwKSArIDEgKi8KLQkud29yZAkweDAxMDQJCS8qICgweDAwZmYwMDAwIC8gMHgwMDAwZmMwMCkgKyAxICovCi0JLndvcmQJMHgwMTA4CQkvKiAoMHgwMGZmMDAwMCAvIDB4MDAwMGY4MDApICsgMSAqLwotCS53b3JkCTB4MDAwMAotI2Vsc2UKLSNlcnJvciBTQ0FMRV9BREpVU1QgbXVzdCBlaXRoZXIgYmUgNSBvciAwLgotI2VuZGlmCi0KLQotYWxwaGE6CS5sb25nCTB4MDAwMDAwMDAKLQkubG9uZwkweDAwZmYwMDAwCi0jZW5kaWYKLQogI2RlZmluZSBNQVNLXzU2NV9MCTB4MDdlMGY4MDAKICNkZWZpbmUgTUFTS181NjVfSAkweDAwMDAwMDFmCisvKiBTZXR0aW5nIFNDQUxFX0FESlVTVCB0byA1IGdpdmVzIGEgcGVyZmVjdCBtYXRjaCB3aXRoIHRoZQorICogY2xhc3NpYyBDIGltcGxlbWVudGF0aW9uIGluIE1lc2EuICBTZXR0aW5nIFNDQUxFX0FESlVTVAorICogdG8gMCBpcyBzbGlnaHRseSBmYXN0ZXIgYnV0IGF0IGEgc21hbGwgY29zdCB0byBhY2N1cmFjeS4KKyAqLwogI2RlZmluZSBTQ0FMRV9BREpVU1QJNQogI2lmIFNDQUxFX0FESlVTVCA9PSA1CiAjZGVmaW5lIFBSRVNDQUxFX0wgMHgwMDEwMDAwMQpAQCAtNTgxLDIzICs1MDcsMTcgQEAKIAltb3ZsCTgoJWVzcCksICVlZHgJLyogZGVzdGluYXRpb24gcG9pbnRlciAqLwogCW1vdmwJMTIoJWVzcCksICVlY3gJLyogbnVtYmVyIG9mIHBpeGVscyB0byBjb3B5ICovCiAKLS8qIEtldmluIEYuIFF1aW5uIDJuZCBKdWx5IDIwMDYKLSAqIFJlcGxhY2UgZGF0YSBzZWdtZW50IGNvbnN0YW50cyB3aXRoIHRleHQtc2VnbWVudCBpbnN0cnVjdGlvbnMKLQltb3ZxCW1hc2tfNTY1LCAlbW01Ci0JbW92cQlwcmVzY2FsZSwgJW1tNgotCW1vdnEJc2NhbGUsICVtbTcKLSAqLwotIAlwdXNobAlNQVNLXzU2NV9ICi0gCXB1c2hsCU1BU0tfNTY1X0wKKwlwdXNobAkkTUFTS181NjVfSAorCXB1c2hsCSRNQVNLXzU2NV9MCiAJbW92cQkoJWVzcCksICVtbTUKLSAJcHVzaGwJUFJFU0NBTEVfSAotIAlwdXNobAlQUkVTQ0FMRV9MCisJcHVzaGwJJFBSRVNDQUxFX0gKKwlwdXNobAkkUFJFU0NBTEVfTAogCW1vdnEJKCVlc3ApLCAlbW02Ci0gCXB1c2hsCVNDQUxFX0gKLSAJcHVzaGwJU0NBTEVfTAorCXB1c2hsCSRTQ0FMRV9ICisJcHVzaGwJJFNDQUxFX0wKIAltb3ZxCSglZXNwKSwgJW1tNwotIAlwdXNobAlBTFBIQV9ICi0gCXB1c2hsCUFMUEhBX0wKKwlwdXNobAkkQUxQSEFfSAorCXB1c2hsCSRBTFBIQV9MCiAJbW92cQkoJWVzcCksICVtbTMKIAlhZGRsCSQzMiwlZXNwCiAKQEAgLTY0OCwxMSArNTY4LDYgQEAKIAkvKiBBbHdheXMgc2V0IHRoZSBhbHBoYSB2YWx1ZSB0byAweGZmLgogCSAqLwogCi0vKiBLZXZpbiBGLiBRdWlubiAybmQgSnVseSAyMDA2Ci0gKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCi0JcG9yCWFscGhhLCAlbW0wCi0JcG9yCWFscGhhLCAlbW0yCi0gKi8KICAJcG9yICVtbTMsICVtbTAKICAJcG9yICVtbTMsICVtbTIKIApAQCAtNjY1LDggKzU4MCw2IEBACiAJbW92cQklbW0wLCAoJWVkeCkKIAlhZGRsCSQ4LCAlZWR4CiAKLQotCiAJcHNodWZ3CSQweGFhLCAlbW00LCAlbW0wCiAJcHNodWZ3CSQweGZmLCAlbW00LCAlbW0yCiAKQEAgLTY4MSwxMSArNTk0LDYgQEAKIAlwbXVsaHV3CSVtbTcsICVtbTAKIAlwbXVsaHV3CSVtbTcsICVtbTIKIAotLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgotICogUmVwbGFjZSBkYXRhIHNlZ21lbnQgY29uc3RhbnRzIHdpdGggdGV4dC1zZWdtZW50IGluc3RydWN0aW9ucwotCXBvcglhbHBoYSwgJW1tMAotCXBvcglhbHBoYSwgJW1tMgotICovCiAgCXBvciAlbW0zLCAlbW0wCiAgCXBvciAlbW0zLCAlbW0yCiAKQEAgLTcyNCwxMSArNjMyLDYgQEAKIAlwbXVsaHV3CSVtbTcsICVtbTAKIAlwbXVsaHV3CSVtbTcsICVtbTIKIAotLyogS2V2aW4gRi4gUXVpbm4gMm5kIEp1bHkgMjAwNgotICogUmVwbGFjZSBkYXRhIHNlZ21lbnQgY29uc3RhbnRzIHdpdGggdGV4dC1zZWdtZW50IGluc3RydWN0aW9ucwotCXBvcglhbHBoYSwgJW1tMAotCXBvcglhbHBoYSwgJW1tMgotICovCiAgCXBvciAlbW0zLCAlbW0wCiAgCXBvciAlbW0zLCAlbW0yCiAKQEAgLTc1NywxMCArNjYwLDYgQEAKICNlbmRpZgogCXBtdWxodXcJJW1tNywgJW1tMAogCi0vKiBLZXZpbiBGLiBRdWlubiAybmQgSnVseSAyMDA2Ci0gKiBSZXBsYWNlIGRhdGEgc2VnbWVudCBjb25zdGFudHMgd2l0aCB0ZXh0LXNlZ21lbnQgaW5zdHJ1Y3Rpb25zCi0JcG9yCWFscGhhLCAlbW0wCi0gKi8KICAJcG9yICVtbTMsICVtbTAKIAogCXBhY2t1c3diCSVtbTAsICVtbTAKZGlmZiAtLWdpdCBhL3NyYy9tZXNhL3g4Ni9ydGFzbS94ODZzc2UuYyBiL3NyYy9tZXNhL3g4Ni9ydGFzbS94ODZzc2UuYwppbmRleCA1YzRiYWI3Li41YWVkZjViIDEwMDY0NAotLS0gYS9zcmMvbWVzYS94ODYvcnRhc20veDg2c3NlLmMKKysrIGIvc3JjL21lc2EveDg2L3J0YXNtL3g4NnNzZS5jCkBAIC0xMTYyLDExICsxMTYyLDEyIEBACiAgICBwLT5jc3IgPSBwLT5zdG9yZTsKIH0KIAotdm9pZCB4ODZfaW5pdF9mdW5jX3NpemUoIHN0cnVjdCB4ODZfZnVuY3Rpb24gKnAsIHVuc2lnbmVkIGNvZGVfc2l6ZSApCitpbnQgeDg2X2luaXRfZnVuY19zaXplKCBzdHJ1Y3QgeDg2X2Z1bmN0aW9uICpwLCB1bnNpZ25lZCBjb2RlX3NpemUgKQogewogICAgcC0+c2l6ZSA9IGNvZGVfc2l6ZTsKICAgIHAtPnN0b3JlID0gX21lc2FfZXhlY19tYWxsb2MoY29kZV9zaXplKTsKICAgIHAtPmNzciA9IHAtPnN0b3JlOworICAgcmV0dXJuIHAtPnN0b3JlICE9IE5VTEw7CiB9CiAKIHZvaWQgeDg2X3JlbGVhc2VfZnVuYyggc3RydWN0IHg4Nl9mdW5jdGlvbiAqcCApCmRpZmYgLS1naXQgYS9zcmMvbWVzYS94ODYvcnRhc20veDg2c3NlLmggYi9zcmMvbWVzYS94ODYvcnRhc20veDg2c3NlLmgKaW5kZXggYzJhYTQxNi4uZjYyODJmNSAxMDA2NDQKLS0tIGEvc3JjL21lc2EveDg2L3J0YXNtL3g4NnNzZS5oCisrKyBiL3NyYy9tZXNhL3g4Ni9ydGFzbS94ODZzc2UuaApAQCAtODAsNyArODAsNyBAQAogCiAKIHZvaWQgeDg2X2luaXRfZnVuYyggc3RydWN0IHg4Nl9mdW5jdGlvbiAqcCApOwotdm9pZCB4ODZfaW5pdF9mdW5jX3NpemUoIHN0cnVjdCB4ODZfZnVuY3Rpb24gKnAsIHVuc2lnbmVkIGNvZGVfc2l6ZSApOworaW50IHg4Nl9pbml0X2Z1bmNfc2l6ZSggc3RydWN0IHg4Nl9mdW5jdGlvbiAqcCwgdW5zaWduZWQgY29kZV9zaXplICk7CiB2b2lkIHg4Nl9yZWxlYXNlX2Z1bmMoIHN0cnVjdCB4ODZfZnVuY3Rpb24gKnAgKTsKIHZvaWQgKCp4ODZfZ2V0X2Z1bmMoIHN0cnVjdCB4ODZfZnVuY3Rpb24gKnAgKSkoIHZvaWQgKTsKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9WQzYvcHJvZ3MvZ2x1dC9nbHV0LmRzcCBiL3dpbmRvd3MvVkM2L3Byb2dzL2dsdXQvZ2x1dC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2NzY4OQotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvVkM2L3Byb2dzL2dsdXQvZ2x1dC5kc3AKQEAgLTAsMCArMSwzMzMgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZ2x1dCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1nbHV0IC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImdsdXQubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImdsdXQubWFrIiBDRkc9ImdsdXQgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiZ2x1dCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJnbHV0IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJnbHV0IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiR0xVVF9FWFBPUlRTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLi8uLi8uLi8uLi9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX0RMTCIgL0QgIl9VU1JETEwiIC9EICJHTFVUX0VYUE9SVFMiIC9EICJNRVNBIiAvRCAiQlVJTERfR0wzMiIgL0ZEIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIgb3BlbmdsMzIubGliIGdsdTMyLmxpYiB3aW5tbS5saWIgbXN2Y3J0LmxpYiBvbGRuYW1lcy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiJSZWxlYXNlL0dMVVQzMi5ETEwiIC9saWJwYXRoOiIuLi8uLi9tZXNhL1JlbGVhc2UiDQorIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCitTT1VSQ0U9IiQoSW5wdXRQYXRoKSINCitQb3N0QnVpbGRfQ21kcz1pZiBub3QgZXhpc3QgLi5cLi5cLi5cLi5cbGliIG1kIC4uXC4uXC4uXC4uXGxpYgljb3B5IFJlbGVhc2VcR0xVVDMyLkxJQiAuLlwuLlwuLlwuLlxsaWIJY29weSBSZWxlYXNlXEdMVVQzMi5ETEwgLi5cLi5cLi5cLi5cbGliCWlmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgUmVsZWFzZVxHTFVUMzIuRExMIC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zDQorIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImdsdXQgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkdMVVRfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uLy4uLy4uLy4uL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfRExMIiAvRCAiX1VTUkRMTCIgL0QgIkdMVVRfRVhQT1JUUyIgL0QgIk1FU0EiIC9EICJCVUlMRF9HTDMyIiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIgd2lubW0ubGliIG1zdmNydGQubGliIG9sZG5hbWVzLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvcGVuZ2wzMi5saWIgZ2x1MzIubGliIC9ub2xvZ28gL2RsbCAvaW5jcmVtZW50YWw6bm8gL2RlYnVnIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiJEZWJ1Zy9HTFVUMzIuRExMIiAvcGRidHlwZTpzZXB0IC9saWJwYXRoOiIuLi8uLi9tZXNhL0RlYnVnIg0KKyMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sDQorU09VUkNFPSIkKElucHV0UGF0aCkiDQorUG9zdEJ1aWxkX0NtZHM9aWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWIJY29weSBEZWJ1Z1xHTFVUMzIuTElCIC4uXC4uXC4uXC4uXGxpYgljb3B5IERlYnVnXEdMVVQzMi5ETEwgLi5cLi5cLi5cLi5cbGliCWlmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgRGVidWdcR0xVVDMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcw0KKyMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZ2x1dCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJnbHV0IC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0Xzh4MTMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF85eDE1LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfYml0bWFwLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfYndpZHRoLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfY2luZGV4LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfY21hcC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2N1cnNvci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2RpYWxzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZHN0ci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2V2ZW50LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZXh0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZmNiLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZnVsbHNjcm4uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9nYW1lbW9kZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2dldC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2hlbDEwLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfaGVsMTIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9oZWwxOC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2luaXQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9pbnB1dC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2pveS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2tleS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2tleWN0cmwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9rZXl1cC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21lc2EuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9tb2RpZmllci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21yb21hbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X292ZXJsYXkuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9yb21hbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3NoYXBlcy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3NwYWNlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfc3Ryb2tlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfc3dhcC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3N3aWR0aC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RhYmxldC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RlYXBvdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RyMTAuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF90cjI0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfdXRpbC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3ZpZHJlc2l6ZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3dhcnAuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF93aW4uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF93aW5taXNjLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XHdpbjMyX2dseC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl9tZW51LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XHdpbjMyX3V0aWwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfd2lucHJvYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl94MTEuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRiaXRtYXAuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dGludC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0c3Ryb2tlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXR3aW4zMi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxzdHJva2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfZ2x4LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XHdpbjMyX3gxMS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvVkM3L21lc2EvZ2RpL2dkaS52Y3Byb2ogYi93aW5kb3dzL1ZDNy9tZXNhL2dkaS9nZGkudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzc4OTIKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL1ZDNy9tZXNhL2dkaS9nZGkudmNwcm9qCkBAIC0wLDAgKzEsMTk1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ2RpIg0KKwlTY2NQcm9qZWN0TmFtZT0iIg0KKwlTY2NMb2NhbFBhdGg9IiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL2dsYXBpLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3N3cmFzdCwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtHRElfRVhQT1JUUztfRExMO0JVSUxEX0dMMzI7TUVTQV9NSU5XQVJOIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvZ2RpLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im1lc2EubGliIHdpbm1tLmxpYiBtc3ZjcnRkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iRGVidWcvT1BFTkdMMzIuRExMIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi4vbWVzYS9EZWJ1ZyINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcd2luZG93c1xnZGlcbWVzYS5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9PUEVOR0wzMi5wZGIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cRGVidWcvT1BFTkdMMzIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvZ2RpLnRsYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWINCitjb3B5IERlYnVnXE9QRU5HTDMyLkxJQiAuLlwuLlwuLlwuLlxsaWINCitjb3B5IERlYnVnXE9QRU5HTDMyLkRMTCAuLlwuLlwuLlwuLlxsaWINCitpZiBleGlzdCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyBjb3B5IERlYnVnXE9QRU5HTDMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcw0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL21haW4sLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL2dsYXBpLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3N3cmFzdCwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtHRElfRVhQT1JUUztfRExMO0JVSUxEX0dMMzI7TUVTQV9NSU5XQVJOIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL2dkaS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im1lc2EubGliIHdpbm1tLmxpYiBtc3ZjcnQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJSZWxlYXNlL09QRU5HTDMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uL21lc2EvUmVsZWFzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcd2luZG93c1xnZGlcbWVzYS5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9PUEVOR0wzMi5wZGIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cUmVsZWFzZS9PUEVOR0wzMi5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2dkaS50bGIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImlmIG5vdCBleGlzdCAuLlwuLlwuLlwuLlxsaWIgbWQgLi5cLi5cLi5cLi5cbGliDQorY29weSBSZWxlYXNlXE9QRU5HTDMyLkxJQiAuLlwuLlwuLlwuLlxsaWINCitjb3B5IFJlbGVhc2VcT1BFTkdMMzIuRExMIC4uXC4uXC4uXC4uXGxpYg0KK2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgUmVsZWFzZVxPUEVOR0wzMi5ETEwgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXGNvbW1vblxkcml2ZXJmdW5jcy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXHdpbmRvd3NcZ2RpXG1lc2EuZGVmIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXHdpbmRvd3NcZ2RpXHdnbC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXHdpbmRvd3NcZ2RpXHdtZXNhLmMiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1x3aW5kb3dzXGdkaVxjb2xvcnMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1xjb21tb25cZHJpdmVyZnVuY3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1x3aW5kb3dzXGdkaVx3bWVzYWRlZi5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvd2luZG93cy9WQzcvbWVzYS9nbHUvZ2x1LnZjcHJvaiBiL3dpbmRvd3MvVkM3L21lc2EvZ2x1L2dsdS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwNTczMQotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvVkM3L21lc2EvZ2x1L2dsdS52Y3Byb2oKQEAgLTAsMCArMSw3NjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJnbHUiDQorCVNjY1Byb2plY3ROYW1lPSIiDQorCVNjY0xvY2FsUGF0aD0iIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uLy4uLy4uL2luY2x1ZGU7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvaW5jbHVkZTsuLi8uLi8uLi8uLi9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcmZhY2U7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJuYWxzOy4uLy4uLy4uLy4uL3NyYy9nbHUvc2dpL2xpYm51cmJzL251cmJ0ZXNzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7R0xVX0VYUE9SVFM7QlVJTERfR0wzMjtMSUJSQVJZQlVJTEQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvZ2x1LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im1zdmNydC5saWIgd2lubW0ubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9wZW5nbDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iUmVsZWFzZS9HTFUzMi5ETEwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLi9nZGkvUmVsZWFzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGdsdS5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9HTFUzMi5wZGIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cUmVsZWFzZS9HTFUzMi5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2dsdS50bGIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImlmIG5vdCBleGlzdCAuLlwuLlwuLlwuLlxsaWIgbWQgLi5cLi5cLi5cLi5cbGliDQorY29weSBSZWxlYXNlXEdMVTMyLkxJQiAuLlwuLlwuLlwuLlxsaWINCitjb3B5IFJlbGVhc2VcR0xVMzIuRExMIC4uXC4uXC4uXC4uXGxpYg0KK2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgUmVsZWFzZVxHTFUzMi5ETEwgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZTsuLi8uLi8uLi8uLi9zcmMvZ2x1L3NnaS9pbmNsdWRlOy4uLy4uLy4uLy4uL3NyYy9nbHUvc2dpL2xpYm51cmJzL2ludGVyZmFjZTsuLi8uLi8uLi8uLi9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcm5hbHM7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvbGlibnVyYnMvbnVyYnRlc3MiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtHTFVfRVhQT1JUUztCVUlMRF9HTDMyO0xJQlJBUllCVUlMRCINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2dsdS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJtc3ZjcnRkLmxpYiB3aW5tbS5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb3BlbmdsMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJEZWJ1Zy9HTFUzMi5ETEwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLi9nZGkvRGVidWciDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IlRSVUUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxnbHUuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvR0xVMzIucGRiIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL0dMVTMyLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0iVFJVRSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL2dsdS50bGIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImlmIG5vdCBleGlzdCAuLlwuLlwuLlwuLlxsaWIgbWQgLi5cLi5cLi5cLi5cbGliDQorY29weSBEZWJ1Z1xHTFUzMi5MSUIgLi5cLi5cLi5cLi5cbGliDQorY29weSBEZWJ1Z1xHTFUzMi5ETEwgLi5cLi5cLi5cLi5cbGliDQoraWYgZXhpc3QgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MgY29weSBEZWJ1Z1xHTFUzMi5ETEwgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXGRpY3QuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidXRpbFxlcnJvci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXGdlb20uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcZ2x1LmRlZiI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidXRpbFxnbHVlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcbWVtYWxsb2MuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xtZXNoLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxcbWlwbWFwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3Ncbm9ybWFsLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NccHJpb3JpdHlxLWhlYXAuYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xwcmlvcml0eXEuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidXRpbFxwcm9qZWN0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxccXVhZC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ1dGlsXHJlZ2lzdHJ5LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NccmVuZGVyLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3Ncc3dlZXAuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1x0ZXNzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcdGVzc21vbm8uYyI+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYXJjLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmNzb3J0ZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGFyY3Rlc3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhY2tlbmQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhc2ljY3J2ZXZhbC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmFzaWNzdXJmZXZhbC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmV6aWVyYXJjLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJFdmFsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJQYXRjaC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcYmV6aWVyUGF0Y2hNZXNoLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiaW4uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJ1ZnBvb2wuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGNhY2hpbmdldmFsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjb3ZlYW5kdGlsZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjdXJ2ZWxpc3QuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGRhdGFUcmFuc2Zvcm0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGRlZmluZXMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZGVmaW5pdGlvbnMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xkaWN0LWxpc3QuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xkaWN0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXGRpcmVjdGVkTGluZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZGlzcGxheWxpc3QuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGRpc3BsYXltb2RlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xmbGlzdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZmxpc3Rzb3J0ZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xnZW9tLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbGN1cnZldmFsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbGltcG9ydHMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZ2xpbXBvcnRzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbHJlbmRlcmVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbHN1cmZldmFsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxcZ2x1aW50LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGluY2x1ZGVcZ2x1b3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGdyaWRsaW5lLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xncmlkdHJpbXZlcnRleC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZ3JpZHZlcnRleC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xncmlkV3JhcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcaHVsbC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcamFyY2xvYy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNca25vdHZlY3Rvci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWFwZGVzYy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWFwbGlzdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXG1lbWFsbG9jLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcbWVzaC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWVzaGVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG1vbm9DaGFpbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vUG9seVBhcnQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG1vbm90b25pemVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG1vbm9Ucmlhbmd1bGF0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xteWFzc2VydC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbXltYXRoLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xteXNldGptcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcbXlzdGRpby5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xteXN0ZGlvLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxteXN0ZGxpYi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xteXN0ZGxpYi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbXlzdHJpbmcuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xub3JtYWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG51cmJzY29uc3RzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xudXJic3Rlc3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccGFydGl0aW9uWC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xwYXJ0aXRpb25ZLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xwYXRjaC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccGF0Y2hsaXN0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHBvbHlEQkcuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccG9seVV0aWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccHJpbWl0aXZlU3RyZWFtLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NccHJpb3JpdHlxLWhlYXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xwcmlvcml0eXEtc29ydC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHByaW9yaXR5cS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccHdsYXJjLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHF1aWNrc29ydC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccXVpbHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHJlYWRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xyZWN0QmxvY2suaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xyZW5kZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHJlbmRlcmhpbnRzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHNhbXBsZUNvbXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcEJvdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVDb21wUmlnaHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcFRvcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVkTGluZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVNb25vUG9seS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzZWFyY2hUcmVlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzaW1wbGVtYXRoLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzbGljZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHNvcnRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc3ViZGl2aWRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHN3ZWVwLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcdGVzcy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHRlc3Ntb25vLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltbGluZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdHJpbXJlZ2lvbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdHJpbXZlcnRleC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdHJpbXZlcnRwb29sLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0eXBlcy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdWFycmF5LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x2YXJyYXkuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncemxhc3NlcnQuaCI+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iQysrIGZpbGVzIg0KKwkJCUZpbHRlcj0iLmNjIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmMuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmNzb3J0ZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmN0ZXNzLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmFja2VuZC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhc2ljY3J2ZXZhbC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhc2ljc3VyZmV2YWwuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJFdmFsLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcYmV6aWVyUGF0Y2guY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJQYXRjaE1lc2guY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiaW4uY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xidWZwb29sLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcY2FjaGluZ2V2YWwuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjY3cuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjb3ZlYW5kdGlsZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjdXJ2ZS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlbGlzdC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlc3ViLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZGF0YVRyYW5zZm9ybS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZGlyZWN0ZWRMaW5lLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZGlzcGxheWxpc3QuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xmbGlzdC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGZsaXN0c29ydGVyLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcZ2xjdXJ2ZXZhbC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGdsaW50ZXJmYWNlLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcZ2xyZW5kZXJlci5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGdsc3VyZmV2YWwuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXGdyaWRXcmFwLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcaHVsbC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGluY3VydmVldmFsLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcaW5zdXJmZXZhbC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGludGVyc2VjdC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGtub3R2ZWN0b3IuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtYXBkZXNjLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWFwZGVzY3YuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtYXBsaXN0LmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWVzaGVyLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vQ2hhaW4uY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG1vbm9Qb2x5UGFydC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG1vbm90b25pemVyLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vVHJpYW5ndWxhdGlvbi5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG1vbm9Ucmlhbmd1bGF0aW9uQmFja2VuZC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG15Y29kZS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG51cmJzaW50ZXJmYWMuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xudXJic3Rlc3MuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHBhcnRpdGlvblguY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHBhcnRpdGlvblkuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xwYXRjaC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHBhdGNobGlzdC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccG9seURCRy5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccG9seVV0aWwuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHByaW1pdGl2ZVN0cmVhbS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccXVpY2tzb3J0LmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccXVpbHQuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xyZWFkZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcUkVBRE1FIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xyZWN0QmxvY2suY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xyZW5kZXJoaW50cy5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcEJvdC5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcFJpZ2h0LmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVDb21wVG9wLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVkTGluZS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlTW9ub1BvbHkuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHNlYXJjaFRyZWUuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzbGljZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzb3J0ZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzcGxpdGFyY3MuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzdWJkaXZpZGVyLmNjIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdG9iZXppZXIuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltbGluZS5jYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHRyaW1yZWdpb24uY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltdmVydHBvb2wuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x1YXJyYXkuY2MiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x2YXJyYXkuY2MiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIj4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcYWxnLW91dGxpbmUiPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS93aW5kb3dzL1ZDNy9tZXNhL21lc2Euc2xuIGIvd2luZG93cy9WQzcvbWVzYS9tZXNhLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ3NzkwCi0tLSAvZGV2L251bGwKKysrIGIvd2luZG93cy9WQzcvbWVzYS9tZXNhLnNsbgpAQCAtMCwwICsxLDQ3IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnZGkiLCAiZ2RpXGdkaS52Y3Byb2oiLCAie0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9ID0gezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbHUiLCAiZ2x1XGdsdS52Y3Byb2oiLCAiezJFNTBGREFGLTQzMEItNDc1Qi1BRTZCLTYwQjY4RjI4NzVCQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJtZXNhIiwgIm1lc2FcbWVzYS52Y3Byb2oiLCAiezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJvc21lc2EiLCAib3NtZXNhXG9zbWVzYS52Y3Byb2oiLCAiezhENkNENDIzLTM4M0ItNDlFNy04MUJDLUQyMEM3MEIwN0RGNX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9ID0ge0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QTFCMjQ5MDctRTE5Ni00ODI2LUI2QUYtMjY3MjM2MjlCNjMzfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QTFCMjQ5MDctRTE5Ni00ODI2LUI2QUYtMjY3MjM2MjlCNjMzfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyRTUwRkRBRi00MzBCLTQ3NUItQUU2Qi02MEI2OEYyODc1QkF9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MkU1MEZEQUYtNDMwQi00NzVCLUFFNkItNjBCNjhGMjg3NUJBfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsyRTUwRkRBRi00MzBCLTQ3NUItQUU2Qi02MEI2OEYyODc1QkF9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezJFNTBGREFGLTQzMEItNDc1Qi1BRTZCLTYwQjY4RjI4NzVCQX0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjEyMEM5NzQtMjcxNy00NzA5LUI0NEYtRDZFNkQwQTU2NDQ4fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEQ2Q0Q0MjMtMzgzQi00OUU3LTgxQkMtRDIwQzcwQjA3REY1fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezhENkNENDIzLTM4M0ItNDlFNy04MUJDLUQyMEM3MEIwN0RGNX0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OEQ2Q0Q0MjMtMzgzQi00OUU3LTgxQkMtRDIwQzcwQjA3REY1fS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4RDZDRDQyMy0zODNCLTQ5RTctODFCQy1EMjBDNzBCMDdERjV9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUFkZElucykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvVkM3L21lc2EvbWVzYS9tZXNhLnZjcHJvaiBiL3dpbmRvd3MvVkM3L21lc2EvbWVzYS9tZXNhLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY4MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvd2luZG93cy9WQzcvbWVzYS9tZXNhL21lc2EudmNwcm9qCkBAIC0wLDAgKzEsMTIyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Im1lc2EiDQorCVNjY1Byb2plY3ROYW1lPSIiDQorCVNjY0xvY2FsUGF0aD0iIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9abTEwMDAgIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9nbGFwaSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlciwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcsLi4vLi4vLi4vLi4vc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUcsV0lOMzIsX0xJQixfRExMLEJVSUxEX0dMMzIsTUVTQV9NSU5XQVJOIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9tZXNhLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VcbWVzYS5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL1ptMTAwMCAiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9nbGFwaSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlciwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcsLi4vLi4vLi4vLi4vc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUcsV0lOMzIsX0xJQixfRExMLEJVSUxEX0dMMzIsTUVTQV9NSU5XQVJOIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvbWVzYS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWdcbWVzYS5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhY2N1bS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9hcnJheWVsdC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9sb29wYmFjay5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9ub29wLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXBpX3ZhbGlkYXRlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhcmJwcm9ncGFyc2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGFyYnByb2dyYW0uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcnJheW9iai5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcYXRpZnJhZ3NoYWRlci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGF0dHJpYi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGJsZW5kLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYnVmZmVyb2JqLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYnVmZmVycy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNsaXAuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb2xvcnRhYi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbnRleHQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb252b2x2ZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRlYnVnLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZGVwdGguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZXB0aHN0ZW5jaWwuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkaXNwYXRjaC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRsaXN0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZHJhd3BpeC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGVuYWJsZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGVudW1zLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZXZhbC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGV4ZWNtZW0uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxleHRlbnNpb25zLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmJvYmplY3QuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxmZWVkYmFjay5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZvZy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZyYW1lYnVmZmVyLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZ2V0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZ2V0c3RyaW5nLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsdGhyZWFkLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxncmFtbWFyXGdyYW1tYXIuYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hcl9jcnQuYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcZ3JhbW1hclxncmFtbWFyX21lc2EuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxoYXNoLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caGludC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGhpc3RvZ3JhbS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGltYWdlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caW1wb3J0cy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGxpZ2h0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbGluZXMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnX2NsaXAuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnX25vcm0uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnX3hmb3JtLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9ldmFsLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9tYXRyaXguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX3RyYW5zbGF0ZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fdmVjdG9yLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV94Zm9ybS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1hdHJpeC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1pcG1hcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1tLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudmZyYWdwYXJzZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcbnZwcm9ncmFtLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudnZlcnRwYXJzZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHBpeGVsLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccG9pbnRzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccG9seWdvbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19kZWJ1Zy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19leGVjdXRlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX2luc3RydWN0aW9uLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX3BhcmFtZXRlci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19wcmludC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19zdGF0ZXZhcnMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW0uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW1vcHQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxxdWVyeW9iai5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHJhc3Rwb3MuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxyYmFkYXB0b3JzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccmVuZGVyYnVmZmVyLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2FhbGluZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYXRyaWFuZ2xlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2FjY3VtLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2FscGhhLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2F0aWZyYWdzaGFkZXIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYml0bWFwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2JsZW5kLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2JsaXQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYnVmZmVycy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19jb250ZXh0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2NvcHlwaXguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZGVwdGguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZHJhd3BpeC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mZWVkYmFjay5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mb2cuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZnJhZ3Byb2cuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfaW1hZ2luZy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19saW5lcy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19sb2dpYy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19tYXNraW5nLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3BvaW50cy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19yZWFkcGl4LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3NwYW4uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfc3RlbmNpbC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190ZXhjb21iaW5lLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RleGZpbHRlci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190ZXhzdG9yZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190cmlhbmdsZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc196b29tLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzaGFkZXJfYXBpLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cc2hhZGVycy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfYnVpbHRpbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29kZWdlbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9vcGVyYXRpb24uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvbXBpbGVfc3RydWN0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlX3ZhcmlhYmxlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19lbWl0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19pci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGFiZWwuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xpYnJhcnlfbm9pc2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xpbmsuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xvZy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbWVtLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmVwcm9jZXNzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmludC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfc2ltcGxpZnkuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3N0b3JhZ2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3R5cGVpbmZvLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ191dGlsaXR5LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ192YXJ0YWJsZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfY29udGV4dC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdHJpYW5nbGUuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxzdGF0ZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHN0ZW5jaWwuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfY29udGV4dC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF9kcmF3LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3BpcGVsaW5lLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2N1bGwuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfZm9nLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2xpZ2h0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX25vcm1hbHMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfcG9pbnRzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX3Byb2dyYW0uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfcmVuZGVyLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX3RleGdlbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92Yl90ZXhtYXQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfdmVydGV4LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZlcnRleC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92ZXJ0ZXhfZ2VuZXJpYy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92cF9idWlsZC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleGNvbXByZXNzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Y29tcHJlc3NfZnh0MS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleGNvbXByZXNzX3MzdGMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhlbnZwcm9ncmFtLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Zm9ybWF0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4aW1hZ2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhvYmouYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhyZW5kZXIuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhzdGF0ZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleHN0b3JlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdmFycmF5LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fY29udGV4dC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19leGVjX2FwaS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWNfYXJyYXkuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19leGVjX2RyYXcuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19leGVjX2V2YWwuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19yZWJhc2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc2F2ZV9hcGkuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlX2RyYXcuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlX2xvb3BiYWNrLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc3BsaXQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zcGxpdF9jb3B5LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc3BsaXRfaW5wbGFjZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHZzbnByaW50Zi5jIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHZ0eGZtdC5jIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGFycmF5X2NhY2hlXGFjX2NvbnRleHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcYXJyYXlfY2FjaGVcYWNhY2hlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYWNjdW0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcGlfYXJyYXllbHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcGlfZXZhbC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9sb29wYmFjay5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9ub29wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXBpX3ZhbGlkYXRlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhcmJwcm9ncGFyc2UuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGFyYnByb2dyYW0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGFyYnByb2dyYW1fc3luLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhdGlmcmFnc2hhZGVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXR0cmliLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYmxlbmQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxidWZmZXJvYmouaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxidWZmZXJzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cY2xpcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbG9ybWFjLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cY29sb3J0YWIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb25maWcuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb250ZXh0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cY29udm9sdmUuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRlYnVnLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZGVwdGguaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZXB0aHN0ZW5jaWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkbGlzdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRyYXdwaXguaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxlbmFibGUuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxlbnVtcy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGV2YWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxleHRlbnNpb25zLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmJvYmplY3QuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxmZWVkYmFjay5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZvZy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZyYW1lYnVmZmVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZ2V0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpb2Zmc2V0cy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxnbGFwaVxnbGFwaXRhYmxlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpdGVtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGdsaGVhZGVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdscHJvY3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZ2xhcGlcZ2x0aHJlYWQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcZ3JhbW1hclxncmFtbWFyX2NydC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcZ3JhbW1hclxncmFtbWFyX21lc2EuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hcl9zeW4uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxoYXNoLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caGludC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGhpc3RvZ3JhbS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGltYWdlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caW1wb3J0cy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGxpZ2h0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbGluZXMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2NsaXBfdG1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9jb3B5X3RtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fZGVidWcuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnX3V0aWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RvdHByb2RfdG1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9ldmFsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9tYXRyaXguaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX25vcm1fdG1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV90cmFuc190bXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX3RyYW5zbGF0ZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fdmVjdG9yLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV94Zm9ybS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1feGZvcm1fdG1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbWFjcm9zLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbWF0aG1vZC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1hdHJpeC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1tLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbXR5cGVzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudmZyYWdwYXJzZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcbnZwcm9ncmFtLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudnZlcnRleGVjLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudnZlcnRwYXJzZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHBpeGVsLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccG9pbnRzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccG9seWdvbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19kZWJ1Zy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19leGVjdXRlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX2luc3RydWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX3BhcmFtZXRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19wcmludC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19zdGF0ZXZhcnMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW1vcHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxxdWVyeW9iai5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHJhc3Rwb3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxyZW5kZXJidWZmZXIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWFsaW5lLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2FhbGluZXRlbXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWF0cmlhbmdsZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYXRyaXRlbXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWNjdW0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWxwaGEuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYXRpZnJhZ3NoYWRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19ibGVuZC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19jb250ZXh0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2RlcHRoLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2RyYXdwaXguaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZmVlZGJhY2suaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZm9nLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2ZyYWdwcm9nLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2xpbmVzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2xpbmV0ZW1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2xvZ2ljLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX21hc2tpbmcuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfbnZmcmFncHJvZy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19wb2ludHMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfcG9pbnR0ZW1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3NwYW4uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfc3BhbnRlbXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfc3RlbmNpbC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190ZXhjb21iaW5lLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RleGZpbHRlci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190cmlhbmdsZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190cmlzcGFuLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RyaXRlbXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfem9vbS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2hhZGVyX2FwaS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHNoYWRlcnMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxzaW1wbGVfbGlzdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfYnVpbHRpbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29kZWdlbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9vcGVyYXRpb24uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvbXBpbGVfc3RydWN0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlX3ZhcmlhYmxlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19lbWl0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19pci5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGFiZWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xpYnJhcnlfbm9pc2UuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xpbmsuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xvZy5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbWVtLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmVwcm9jZXNzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmludC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfc2ltcGxpZnkuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3N0b3JhZ2UuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3R5cGVpbmZvLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ191dGlsaXR5LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ192YXJ0YWJsZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfY29udGV4dC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdHJpYW5nbGUuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0X3NldHVwXHNzX3RyaXRtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdmIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxzdGF0ZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHN0ZW5jaWwuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHN3cmFzdC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3dyYXN0X3NldHVwLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X2NvbnRleHQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfcGlwZWxpbmUuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfY2xpcHRtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92Yl9saWdodHRtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92Yl9yZW5kZXJ0bXAuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmVydGV4LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZwX2J1aWxkLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Y29tcHJlc3MuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhlbnZwcm9ncmFtLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Zm9ybWF0LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Zm9ybWF0X3RtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleGltYWdlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4b2JqLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4cmVuZGVyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4c3RhdGUuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhzdG9yZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdG5sLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdmFycmF5LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym8uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19hdHRyaWIuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19hdHRyaWJfdG1wLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fY29udGV4dC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWMuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc3BsaXQuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx2ZXJzaW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdnR4Zm10LmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdnR4Zm10X3RtcC5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvd2luZG93cy9WQzcvbWVzYS9vc21lc2Evb3NtZXNhLnZjcHJvaiBiL3dpbmRvd3MvVkM3L21lc2Evb3NtZXNhL29zbWVzYS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZGFkNwotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvVkM3L21lc2Evb3NtZXNhL29zbWVzYS52Y3Byb2oKQEAgLTAsMCArMSwxODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJvc21lc2EiDQorCVNjY1Byb2plY3ROYW1lPSIiDQorCVNjY0xvY2FsUGF0aD0iIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uLy4uLy4uL2luY2x1ZGUsLi4vLi4vLi4vLi4vc3JjL21lc2EsLi4vLi4vLi4vLi4vc3JjL21lc2EvbWFpbiwuLi8uLi8uLi8uLi9zcmMvbWVzYS9nbGFwaSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zd3Jhc3QsLi4vLi4vLi4vLi4vc3JjL21lc2Evc2hhZGVyIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7T1NNRVNBX0VYUE9SVFMiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2Uvb3NtZXNhLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib3BlbmdsMzIubGliIHdpbm1tLmxpYiBtc3ZjcnQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJSZWxlYXNlL09TTUVTQTMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uL2dkaS9SZWxlYXNlIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1xvc21lc2Fcb3NtZXNhLmRlZiINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL09TTUVTQTMyLnBkYiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlL09TTUVTQTMyLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0iVFJVRSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2Uvb3NtZXNhLnRsYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWINCitjb3B5IFJlbGVhc2VcT1NNRVNBMzIuTElCIC4uXC4uXC4uXC4uXGxpYg0KK2NvcHkgUmVsZWFzZVxPU01FU0EzMi5ETEwgLi5cLi5cLi5cLi5cbGliDQoraWYgZXhpc3QgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MgY29weSBSZWxlYXNlXE9TTUVTQTMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcw0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi8uLi8uLi9pbmNsdWRlLC4uLy4uLy4uLy4uL3NyYy9tZXNhLC4uLy4uLy4uLy4uL3NyYy9tZXNhL21haW4sLi4vLi4vLi4vLi4vc3JjL21lc2EvZ2xhcGksLi4vLi4vLi4vLi4vc3JjL21lc2Evc3dyYXN0LC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlciINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO09TTUVTQV9FWFBPUlRTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvb3NtZXNhLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib3BlbmdsMzIubGliIHdpbm1tLmxpYiBtc3ZjcnRkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iRGVidWcvT1NNRVNBMzIuRExMIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi4vZ2RpL0RlYnVnIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1xvc21lc2Fcb3NtZXNhLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL09TTUVTQTMyLnBkYiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Zy9PU01FU0EzMi5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy9vc21lc2EudGxiIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJpZiBub3QgZXhpc3QgLi5cLi5cLi5cLi5cbGliIG1kIC4uXC4uXC4uXC4uXGxpYg0KK2NvcHkgRGVidWdcT1NNRVNBMzIuTElCIC4uXC4uXC4uXC4uXGxpYg0KK2NvcHkgRGVidWdcT1NNRVNBMzIuRExMIC4uXC4uXC4uXC4uXGxpYg0KK2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgRGVidWdcT1NNRVNBMzIuRExMIC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1xjb21tb25cZHJpdmVyZnVuY3MuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1xvc21lc2Fcb3NtZXNhLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcb3NtZXNhXG9zbWVzYS5kZWYiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvVkM3L3Byb2dzL2dsdXQvZ2x1dC52Y3Byb2ogYi93aW5kb3dzL1ZDNy9wcm9ncy9nbHV0L2dsdXQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Mzg3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL1ZDNy9wcm9ncy9nbHV0L2dsdXQudmNwcm9qCkBAIC0wLDAgKzEsMzIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nID0gIldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjAwIg0KKwlOYW1lPSJnbHV0Ig0KKwlTY2NQcm9qZWN0TmFtZT0iIg0KKwlTY2NMb2NhbFBhdGg9IiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfV0lORE9XUztfRExMO19VU1JETEw7R0xVVF9FWFBPUlRTO01FU0E7QlVJTERfR0wzMiINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2dsdXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5tbS5saWIgbXN2Y3J0ZC5saWIgb2xkbmFtZXMubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9wZW5nbDMyLmxpYiBnbHUzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9IkRlYnVnL0dMVVQzMi5ETEwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLi8uLi9tZXNhL0RlYnVnIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvR0xVVDMyLnBkYiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Zy9HTFVUMzIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvZ2x1dC50bGIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImlmIG5vdCBleGlzdCAuLlwuLlwuLlwuLlxsaWIgbWQgLi5cLi5cLi5cLi5cbGliDQorY29weSBEZWJ1Z1xHTFVUMzIuTElCIC4uXC4uXC4uXC4uXGxpYg0KK2NvcHkgRGVidWdcR0xVVDMyLkRMTCAuLlwuLlwuLlwuLlxsaWINCitpZiBleGlzdCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyBjb3B5IERlYnVnXEdMVVQzMi5ETEwgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztfRExMO19VU1JETEw7R0xVVF9FWFBPUlRTO01FU0E7QlVJTERfR0wzMiINCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9nbHV0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib3BlbmdsMzIubGliIGdsdTMyLmxpYiB3aW5tbS5saWIgbXN2Y3J0LmxpYiBvbGRuYW1lcy5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9IlJlbGVhc2UvR0xVVDMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uLy4uL21lc2EvUmVsZWFzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL0dMVVQzMi5wZGIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cUmVsZWFzZS9HTFVUMzIubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS9nbHV0LnRsYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWINCitjb3B5IFJlbGVhc2VcR0xVVDMyLkxJQiAuLlwuLlwuLlwuLlxsaWINCitjb3B5IFJlbGVhc2VcR0xVVDMyLkRMTCAuLlwuLlwuLlwuLlxsaWINCitpZiBleGlzdCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyBjb3B5IFJlbGVhc2VcR0xVVDMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcw0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF84eDEzLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0Xzl4MTUuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfYml0bWFwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2J3aWR0aC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9jaW5kZXguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfY21hcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9jdXJzb3IuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZGlhbHMuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZHN0ci5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9ldmVudC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9leHQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZmNiLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2Z1bGxzY3JuLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2dhbWVtb2RlLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2dldC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9oZWwxMC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9oZWwxMi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9oZWwxOC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9pbml0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2lucHV0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2pveS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9rZXkuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfa2V5Y3RybC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9rZXl1cC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9tZXNhLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21vZGlmaWVyLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21yb21hbi5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9vdmVybGF5LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3JvbWFuLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3NoYXBlcy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9zcGFjZS5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9zdHJva2UuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfc3dhcC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9zd2lkdGguYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfdGFibGV0LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RlYXBvdC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF90cjEwLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RyMjQuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfdXRpbC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF92aWRyZXNpemUuYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfd2FycC5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF93aW4uYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfd2lubWlzYy5jIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfZ2x4LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl9tZW51LmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl91dGlsLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl93aW5wcm9jLmMiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl94MTEuYyI+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dGJpdG1hcC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dGludC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dHN0cm9rZS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dHdpbjMyLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxzdHJva2UuaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XHdpbjMyX2dseC5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfeDExLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIj4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS93aW5kb3dzL1ZDOC9tZXNhL2dkaS9nZGkudmNwcm9qIGIvd2luZG93cy9WQzgvbWVzYS9nZGkvZ2RpLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNlZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvd2luZG93cy9WQzgvbWVzYS9nZGkvZ2RpLnZjcHJvagpAQCAtMCwwICsxLDI2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9ImdkaSINCisJUHJvamVjdEdVSUQ9IntBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvZ2RpLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL2dsYXBpLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3N3cmFzdCwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtHRElfRVhQT1JUUztfRExMO0JVSUxEX0dMMzI7TUVTQV9NSU5XQVJOIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvZ2RpLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJtZXNhLmxpYiBtc3ZjcnRkLmxpYiBnZGkzMi5saWIgdXNlcjMyLmxpYiB3aW5tbS5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9IkRlYnVnL09QRU5HTDMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uL21lc2EvRGVidWciDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9InRydWUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXHdpbmRvd3NcZ2RpXG1lc2EuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvT1BFTkdMMzIucGRiIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL09QRU5HTDMyLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJpZiBub3QgZXhpc3QgLi5cLi5cLi5cLi5cbGliIG1kIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgRGVidWdcT1BFTkdMMzIuTElCIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgRGVidWdcT1BFTkdMMzIuRExMIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgRGVidWdcT1BFTkdMMzIuRExMIC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zJiN4MEQ7JiN4MEE7Ig0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2dkaS50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vbWFpbiwuLi8uLi8uLi8uLi9pbmNsdWRlLC4uLy4uLy4uLy4uL3NyYy9tZXNhLC4uLy4uLy4uLy4uL3NyYy9tZXNhL21haW4sLi4vLi4vLi4vLi4vc3JjL21lc2EvZ2xhcGksLi4vLi4vLi4vLi4vc3JjL21lc2Evc3dyYXN0LC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlciINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztfVVNSRExMO0dESV9FWFBPUlRTO19ETEw7QlVJTERfR0wzMjtNRVNBX01JTldBUk4iDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvZ2RpLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im1lc2EubGliIHdpbm1tLmxpYiBnZGkzMi5saWIgdXNlcjMyLmxpYiBtc3ZjcnQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJSZWxlYXNlL09QRU5HTDMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uL21lc2EvUmVsZWFzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0idHJ1ZSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcd2luZG93c1xnZGlcbWVzYS5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9PUEVOR0wzMi5wZGIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cUmVsZWFzZS9PUEVOR0wzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtjb3B5IFJlbGVhc2VcT1BFTkdMMzIuTElCIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgUmVsZWFzZVxPUEVOR0wzMi5ETEwgLi5cLi5cLi5cLi5cbGliJiN4MEQ7JiN4MEE7aWYgZXhpc3QgLi5cLi5cLi5cLi5ccHJvZ3NcZGVtb3MgY29weSBSZWxlYXNlXE9QRU5HTDMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyYjeDBEOyYjeDBBOyINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXGNvbW1vblxkcml2ZXJmdW5jcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1x3aW5kb3dzXGdkaVxtZXNhLmRlZiINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcd2luZG93c1xnZGlcd2dsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXHdpbmRvd3NcZ2RpXHdtZXNhLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGRyaXZlcnNcd2luZG93c1xnZGlcY29sb3JzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxkcml2ZXJzXGNvbW1vblxkcml2ZXJmdW5jcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5caW5jbHVkZVxHTFx3bWVzYS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZHJpdmVyc1x3aW5kb3dzXGdkaVx3bWVzYWRlZi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvVkM4L21lc2EvZ2x1L2dsdS52Y3Byb2ogYi93aW5kb3dzL1ZDOC9tZXNhL2dsdS9nbHUudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmIwYjkKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL1ZDOC9tZXNhL2dsdS9nbHUudmNwcm9qCkBAIC0wLDAgKzEsMTAyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9ImdsdSINCisJUHJvamVjdEdVSUQ9InsyRTUwRkRBRi00MzBCLTQ3NUItQUU2Qi02MEI2OEYyODc1QkF9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS9nbHUudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uLy4uLy4uL2luY2x1ZGU7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvaW5jbHVkZTsuLi8uLi8uLi8uLi9zcmMvZ2x1L3NnaS9saWJudXJicy9pbnRlcmZhY2U7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJuYWxzOy4uLy4uLy4uLy4uL3NyYy9nbHUvc2dpL2xpYm51cmJzL251cmJ0ZXNzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7R0xVX0VYUE9SVFM7QlVJTERfR0wzMjtMSUJSQVJZQlVJTEQ7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL2dsdS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ibXN2Y3J0LmxpYiB3aW5tbS5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb3BlbmdsMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJSZWxlYXNlL0dMVTMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uL2dkaS9SZWxlYXNlIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJ0cnVlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcZ2x1LmRlZiINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL0dMVTMyLnBkYiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlL0dMVTMyLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJpZiBub3QgZXhpc3QgLi5cLi5cLi5cLi5cbGliIG1kIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgUmVsZWFzZVxHTFUzMi5MSUIgLi5cLi5cLi5cLi5cbGliJiN4MEQ7JiN4MEE7Y29weSBSZWxlYXNlXEdMVTMyLkRMTCAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtpZiBleGlzdCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyBjb3B5IFJlbGVhc2VcR0xVMzIuRExMIC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zJiN4MEQ7JiN4MEE7Ig0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy9nbHUudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi8uLi8uLi9pbmNsdWRlOy4uLy4uLy4uLy4uL3NyYy9nbHUvc2dpL2luY2x1ZGU7Li4vLi4vLi4vLi4vc3JjL2dsdS9zZ2kvbGlibnVyYnMvaW50ZXJmYWNlOy4uLy4uLy4uLy4uL3NyYy9nbHUvc2dpL2xpYm51cmJzL2ludGVybmFsczsuLi8uLi8uLi8uLi9zcmMvZ2x1L3NnaS9saWJudXJicy9udXJidGVzcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0dMVV9FWFBPUlRTO0JVSUxEX0dMMzI7TElCUkFSWUJVSUxEO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2dsdS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6STM4NiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ibXN2Y3J0ZC5saWIgd2lubW0ubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9wZW5nbDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iRGVidWcvR0xVMzIuRExMIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi4vZ2RpL0RlYnVnIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJ0cnVlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcZ2x1LmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL0dMVTMyLnBkYiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Zy9HTFUzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtjb3B5IERlYnVnXEdMVTMyLkxJQiAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtjb3B5IERlYnVnXEdMVTMyLkRMTCAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtpZiBleGlzdCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyBjb3B5IERlYnVnXEdMVTMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyYjeDBEOyYjeDBBOyINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXGRpY3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxcZXJyb3IuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcZ2VvbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcZ2x1LmRlZiINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxcZ2x1ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xtZW1hbGxvYy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xtZXNoLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ1dGlsXG1pcG1hcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xub3JtYWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NccHJpb3JpdHlxLWhlYXAuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xwcmlvcml0eXEuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnV0aWxccHJvamVjdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidXRpbFxxdWFkLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ1dGlsXHJlZ2lzdHJ5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHJlbmRlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xzd2VlcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1x0ZXNzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHRlc3Ntb25vLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmNzb3J0ZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmN0ZXNzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmFja2VuZC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhc2ljY3J2ZXZhbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGJhc2ljc3VyZmV2YWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiZXppZXJhcmMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJFdmFsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcYmV6aWVyUGF0Y2guaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJQYXRjaE1lc2guaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiaW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xidWZwb29sLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcY2FjaGluZ2V2YWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjb3ZlYW5kdGlsZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjdXJ2ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlbGlzdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGRhdGFUcmFuc2Zvcm0uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xkZWZpbmVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xkZWZpbml0aW9ucy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xkaWN0LWxpc3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcZGljdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZGlyZWN0ZWRMaW5lLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZGlzcGxheWxpc3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xkaXNwbGF5bW9kZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGZsaXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZmxpc3Rzb3J0ZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcZ2VvbS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGdsY3VydmV2YWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbGltcG9ydHMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXGdsaW1wb3J0cy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGdscmVuZGVyZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbHN1cmZldmFsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ1dGlsXGdsdWludC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcaW5jbHVkZVxnbHVvcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGdyaWRsaW5lLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcZ3JpZHRyaW12ZXJ0ZXguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xncmlkdmVydGV4LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xncmlkV3JhcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGh1bGwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xqYXJjbG9jLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNca25vdHZlY3Rvci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG1hcGRlc2MuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtYXBsaXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXG1lbWFsbG9jLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXG1lc2guaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtZXNoZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG1vbm9DaGFpbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcbW9ub1BvbHlQYXJ0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbW9ub3Rvbml6ZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG1vbm9Ucmlhbmd1bGF0aW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbXlhc3NlcnQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xteW1hdGguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xteXNldGptcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXG15c3RkaW8uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXG15c3RkaW8uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxteXN0ZGxpYi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcbXlzdGRsaWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xteXN0cmluZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xub3JtYWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xudXJic2NvbnN0cy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG51cmJzdGVzcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccGFydGl0aW9uWC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccGFydGl0aW9uWS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHBhdGNoLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccGF0Y2hsaXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xwb2x5REJHLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xwb2x5VXRpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccHJpbWl0aXZlU3RyZWFtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHByaW9yaXR5cS1oZWFwLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHByaW9yaXR5cS1zb3J0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHByaW9yaXR5cS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHB3bGFyYy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccXVpY2tzb3J0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccXVpbHQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xyZWFkZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHJlY3RCbG9jay5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xyZW5kZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xyZW5kZXJoaW50cy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcEJvdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcFJpZ2h0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVDb21wVG9wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVkTGluZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlTW9ub1BvbHkuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHNlYXJjaFRyZWUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzaW1wbGVtYXRoLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc2xpY2VyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc29ydGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc3ViZGl2aWRlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xzd2VlcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1x0ZXNzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJ0ZXNzXHRlc3Ntb25vLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdHJpbWxpbmUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltcmVnaW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdHJpbXZlcnRleC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHRyaW12ZXJ0cG9vbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHR5cGVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdWFycmF5LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdmFycmF5LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1x6bGFzc2VydC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iQysrIGZpbGVzIg0KKwkJCUZpbHRlcj0iLmNjIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xhcmMuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYXJjc29ydGVyLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGFyY3Rlc3MuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmFja2VuZC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiYXNpY2NydmV2YWwuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYmFzaWNzdXJmZXZhbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxiZXppZXJFdmFsLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGJlemllclBhdGNoLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGJlemllclBhdGNoTWVzaC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xiaW4uY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcYnVmcG9vbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjYWNoaW5nZXZhbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjY3cuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcY292ZWFuZHRpbGVyLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGN1cnZlbGlzdC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xjdXJ2ZXN1Yi5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xkYXRhVHJhbnNmb3JtLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZGlyZWN0ZWRMaW5lLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGRpc3BsYXlsaXN0LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGZsaXN0LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGZsaXN0c29ydGVyLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJmYWNlXGdsY3VydmV2YWwuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcZ2xpbnRlcmZhY2UuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcmZhY2VcZ2xyZW5kZXJlci5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxnbHN1cmZldmFsLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NcZ3JpZFdyYXAuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcaHVsbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxpbmN1cnZlZXZhbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVyZmFjZVxpbnN1cmZldmFsLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXGludGVyc2VjdC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xrbm90dmVjdG9yLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG1hcGRlc2MuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWFwZGVzY3YuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbWFwbGlzdC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtZXNoZXIuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vQ2hhaW4uY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vUG9seVBhcnQuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbW9ub3Rvbml6ZXIuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xtb25vVHJpYW5ndWxhdGlvbi5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xtb25vVHJpYW5ndWxhdGlvbkJhY2tlbmQuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbXljb2RlLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXG51cmJzaW50ZXJmYWMuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcbnVyYnN0ZXNzLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccGFydGl0aW9uWC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHBhcnRpdGlvblkuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccGF0Y2guY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNccGF0Y2hsaXN0LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccG9seURCRy5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHBvbHlVdGlsLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccHJpbWl0aXZlU3RyZWFtLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccXVpY2tzb3J0LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHF1aWx0LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHJlYWRlci5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYnRlc3NcUkVBRE1FIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3NccmVjdEJsb2NrLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHJlbmRlcmhpbnRzLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlQ29tcC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHNhbXBsZUNvbXBCb3QuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVDb21wUmlnaHQuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVDb21wVG9wLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcbnVyYnRlc3Ncc2FtcGxlZExpbmUuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xudXJidGVzc1xzYW1wbGVNb25vUG9seS5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXG51cmJ0ZXNzXHNlYXJjaFRyZWUuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc2xpY2VyLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHNvcnRlci5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1xzcGxpdGFyY3MuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcc3ViZGl2aWRlci5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0b2Jlemllci5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltbGluZS5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x0cmltcmVnaW9uLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlibnVyYnNcaW50ZXJuYWxzXHRyaW12ZXJ0cG9vbC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHVcc2dpXGxpYm51cmJzXGludGVybmFsc1x1YXJyYXkuY2MiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1XHNnaVxsaWJudXJic1xpbnRlcm5hbHNcdmFycmF5LmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdVxzZ2lcbGlidGVzc1xhbGctb3V0bGluZSINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvVkM4L21lc2EvbWVzYS5zbG4gYi93aW5kb3dzL1ZDOC9tZXNhL21lc2Euc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmY0ODgKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL1ZDOC9tZXNhL21lc2Euc2xuCkBAIC0wLDAgKzEsNDYgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDANCisjIFZpc3VhbCBDKysgRXhwcmVzcyAyMDA1DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnZGkiLCAiZ2RpXGdkaS52Y3Byb2oiLCAie0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9ID0gezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbHUiLCAiZ2x1XGdsdS52Y3Byb2oiLCAiezJFNTBGREFGLTQzMEItNDc1Qi1BRTZCLTYwQjY4RjI4NzVCQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9ID0ge0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJtZXNhIiwgIm1lc2FcbWVzYS52Y3Byb2oiLCAiezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAib3NtZXNhIiwgIm9zbWVzYVxvc21lc2EudmNwcm9qIiwgIns4RDZDRDQyMy0zODNCLTQ5RTctODFCQy1EMjBDNzBCMDdERjV9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7QTFCMjQ5MDctRTE5Ni00ODI2LUI2QUYtMjY3MjM2MjlCNjMzfSA9IHtBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtBMUIyNDkwNy1FMTk2LTQ4MjYtQjZBRi0yNjcyMzYyOUI2MzN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0ExQjI0OTA3LUUxOTYtNDgyNi1CNkFGLTI2NzIzNjI5QjYzM30uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QTFCMjQ5MDctRTE5Ni00ODI2LUI2QUYtMjY3MjM2MjlCNjMzfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MkU1MEZEQUYtNDMwQi00NzVCLUFFNkItNjBCNjhGMjg3NUJBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezJFNTBGREFGLTQzMEItNDc1Qi1BRTZCLTYwQjY4RjI4NzVCQX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MkU1MEZEQUYtNDMwQi00NzVCLUFFNkItNjBCNjhGMjg3NUJBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyRTUwRkRBRi00MzBCLTQ3NUItQUU2Qi02MEI2OEYyODc1QkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MjEyMEM5NzQtMjcxNy00NzA5LUI0NEYtRDZFNkQwQTU2NDQ4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezIxMjBDOTc0LTI3MTctNDcwOS1CNDRGLUQ2RTZEMEE1NjQ0OH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezhENkNENDIzLTM4M0ItNDlFNy04MUJDLUQyMEM3MEIwN0RGNX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs4RDZDRDQyMy0zODNCLTQ5RTctODFCQy1EMjBDNzBCMDdERjV9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezhENkNENDIzLTM4M0ItNDlFNy04MUJDLUQyMEM3MEIwN0RGNX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEQ2Q0Q0MjMtMzgzQi00OUU3LTgxQkMtRDIwQzcwQjA3REY1fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvd2luZG93cy9WQzgvbWVzYS9tZXNhL21lc2EudmNwcm9qIGIvd2luZG93cy9WQzgvbWVzYS9tZXNhL21lc2EudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL1ZDOC9tZXNhL21lc2EvbWVzYS52Y3Byb2oKQEAgLTAsMCArMSwxNzYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0ibWVzYSINCisJUHJvamVjdEdVSUQ9InsyMTIwQzk3NC0yNzE3LTQ3MDktQjQ0Ri1ENkU2RDBBNTY0NDh9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvWm0xMDAwICINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uLy4uLy4uL2luY2x1ZGUsLi4vLi4vLi4vLi4vc3JjL21lc2EsLi4vLi4vLi4vLi4vc3JjL21lc2EvZ2xhcGksLi4vLi4vLi4vLi4vc3JjL21lc2EvbWFpbiwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIsLi4vLi4vLi4vLi4vc3JjL21lc2Evc2hhZGVyL3NsYW5nLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlci9ncmFtbWFyIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHLFdJTjMyLF9MSUIsX0RMTCxCVUlMRF9HTDMyLE1FU0FfTUlOV0FSTiINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvbWVzYS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZVxtZXNhLmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL1ptMTAwMCAiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSwuLi8uLi8uLi8uLi9zcmMvbWVzYSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9nbGFwaSwuLi8uLi8uLi8uLi9zcmMvbWVzYS9tYWluLC4uLy4uLy4uLy4uL3NyYy9tZXNhL3NoYWRlciwuLi8uLi8uLi8uLi9zcmMvbWVzYS9zaGFkZXIvc2xhbmcsLi4vLi4vLi4vLi4vc3JjL21lc2Evc2hhZGVyL2dyYW1tYXIiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUcsV0lOMzIsX0xJQixfRExMLEJVSUxEX0dMMzIsTUVTQV9NSU5XQVJOIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvbWVzYS5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnXG1lc2EubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFjY3VtLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9hcnJheWVsdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcGlfbG9vcGJhY2suYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXBpX25vb3AuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXBpX3ZhbGlkYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcYXJicHJvZ3BhcnNlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcYXJicHJvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcnJheW9iai5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGF0aWZyYWdzaGFkZXIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXR0cmliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGJsZW5kLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGJ1ZmZlcm9iai5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxidWZmZXJzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNsaXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cY29sb3J0YWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cY29udGV4dC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb252b2x2ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZWJ1Zy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZXB0aC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkZXB0aHN0ZW5jaWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZGlzcGF0Y2guYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZGxpc3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZHJhd3BpeC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxlbmFibGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZW51bXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZXZhbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxleGVjbWVtLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGV4dGVuc2lvbnMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmJvYmplY3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmVlZGJhY2suYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZm9nLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZyYW1lYnVmZmVyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGdldC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxnZXRzdHJpbmcuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsdGhyZWFkLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcZ3JhbW1hclxncmFtbWFyLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxncmFtbWFyXGdyYW1tYXJfY3J0LmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcZ3JhbW1hclxncmFtbWFyX21lc2EuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caGFzaC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxoaW50LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGhpc3RvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxpbWFnZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxpbXBvcnRzLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbGlnaHQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbGluZXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9kZWJ1Z19jbGlwLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fZGVidWdfbm9ybS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnX3hmb3JtLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fZXZhbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX21hdHJpeC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX3RyYW5zbGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX3ZlY3Rvci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX3hmb3JtLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1hdHJpeC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxtaXBtYXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbW0uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxudmZyYWdwYXJzZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXG52cHJvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXG52dmVydHBhcnNlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHBpeGVsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHBvaW50cy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxwb2x5Z29uLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19kZWJ1Zy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfZXhlY3V0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfaW5zdHJ1Y3Rpb24uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX3BhcmFtZXRlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfcHJpbnQuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfc3RhdGV2YXJzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ191bmlmb3JtLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW1vcHQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccXVlcnlvYmouYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccmFzdHBvcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxyYmFkYXB0b3JzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHJlbmRlcmJ1ZmZlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWFsaW5lLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYXRyaWFuZ2xlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hY2N1bS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWxwaGEuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2F0aWZyYWdzaGFkZXIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2JpdG1hcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYmxlbmQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2JsaXQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2J1ZmZlcnMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2NvbnRleHQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2NvcHlwaXguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2RlcHRoLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19kcmF3cGl4LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mZWVkYmFjay5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZm9nLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mcmFncHJvZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfaW1hZ2luZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfbGluZXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2xvZ2ljLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19tYXNraW5nLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19wb2ludHMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3JlYWRwaXguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3NwYW4uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3N0ZW5jaWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RleGNvbWJpbmUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RleGZpbHRlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfdGV4c3RvcmUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RyaWFuZ2xlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc196b29tLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2hhZGVyX2FwaS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxzaGFkZXJzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfYnVpbHRpbi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvZGVnZW4uYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvbXBpbGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlX2Z1bmN0aW9uLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9vcGVyYXRpb24uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlX3N0cnVjdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvbXBpbGVfdmFyaWFibGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19lbWl0LmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19pci5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGFiZWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19saWJyYXJ5X25vaXNlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGluay5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xvZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX21lbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3ByZXByb2Nlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmludC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfc2ltcGxpZnkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19zdG9yYWdlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfdHlwZWluZm8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ191dGlsaXR5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfdmFydGFibGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdF9zZXR1cFxzc19jb250ZXh0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdHJpYW5nbGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cc3RhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cc3RlbmNpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfY29udGV4dC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfZHJhdy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfcGlwZWxpbmUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2N1bGwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2ZvZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfbGlnaHQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX25vcm1hbHMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX3BvaW50cy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfcHJvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfcmVuZGVyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92Yl90ZXhnZW4uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX3RleG1hdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdmJfdmVydGV4LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92ZXJ0ZXguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZlcnRleF9nZW5lcmljLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92cF9idWlsZC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhjb21wcmVzcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhjb21wcmVzc19meHQxLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleGNvbXByZXNzX3MzdGMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4ZW52cHJvZ3JhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhmb3JtYXQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4aW1hZ2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4b2JqLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleHJlbmRlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhzdGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhzdG9yZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx2YXJyYXkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fY29udGV4dC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19leGVjLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWNfYXBpLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWNfYXJyYXkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fZXhlY19kcmF3LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWNfZXZhbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19yZWJhc2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc2F2ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlX2FwaS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zYXZlX2RyYXcuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc2F2ZV9sb29wYmFjay5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zcGxpdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zcGxpdF9jb3B5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX3NwbGl0X2lucGxhY2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdnNucHJpbnRmLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdnR4Zm10LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYWNjdW0uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYXBpX2FycmF5ZWx0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9ldmFsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGFwaV9sb29wYmFjay5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcGlfbm9vcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxhcGlfdmFsaWRhdGUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhcmJwcm9ncGFyc2UuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhcmJwcm9ncmFtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcYXJicHJvZ3JhbV9zeW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxhdGlmcmFnc2hhZGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGF0dHJpYi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxibGVuZC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxidWZmZXJvYmouaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cYnVmZmVycy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjbGlwLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbG9ybWFjLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbG9ydGFiLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbmZpZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxjb250ZXh0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGNvbnZvbHZlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRkLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRlYnVnLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRlcHRoLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGRlcHRoc3RlbmNpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkbGlzdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxkcmF3cGl4LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGVuYWJsZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxlbnVtcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxldmFsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGV4dGVuc2lvbnMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmJvYmplY3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZmVlZGJhY2suaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cZm9nLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGZyYW1lYnVmZmVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGdldC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZ2xhcGlcZ2xhcGkuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXGdsYXBpXGdsYXBpb2Zmc2V0cy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZ2xhcGlcZ2xhcGl0YWJsZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcZ2xhcGlcZ2xhcGl0ZW1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGdsaGVhZGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxnbGFwaVxnbHByb2NzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxnbGFwaVxnbHRocmVhZC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hcl9jcnQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxncmFtbWFyXGdyYW1tYXJfbWVzYS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXGdyYW1tYXJcZ3JhbW1hcl9zeW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5caGFzaC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxoaW50LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGhpc3RvZ3JhbS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxpbWFnZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxpbXBvcnRzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGxpZ2h0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXGxpbmVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fY2xpcF90bXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV9jb3B5X3RtcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RlYnVnLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fZGVidWdfdXRpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX2RvdHByb2RfdG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fZXZhbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX21hdHJpeC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWF0aFxtX25vcm1fdG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fdHJhbnNfdG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fdHJhbnNsYXRlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1fdmVjdG9yLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1feGZvcm0uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1hdGhcbV94Zm9ybV90bXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbWFjcm9zLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYXRoXG1hdGhtb2QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cbWF0cml4LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG1tLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXG10eXBlcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXG52ZnJhZ3BhcnNlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcbnZwcm9ncmFtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcbnZ2ZXJ0cGFyc2UuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccGl4ZWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccG9pbnRzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHBvbHlnb24uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxwcm9nX2RlYnVnLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19leGVjdXRlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19pbnN0cnVjdGlvbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfcGFyYW1ldGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ19wcmludC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dfc3RhdGV2YXJzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ191bmlmb3JtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJccHJvZ3JhbS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHByb2dyYW1vcHQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccXVlcnlvYmouaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5ccmFzdHBvcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxyYmFkYXB0b3JzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHJlbmRlcmJ1ZmZlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYWFsaW5lLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYWxpbmV0ZW1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYXRyaWFuZ2xlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hYXRyaXRlbXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2FjY3VtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19hbHBoYS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYXRpZnJhZ3NoYWRlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfYmxlbmQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2NvbnRleHQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2RlcHRoLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19kcmF3cGl4LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mZWVkYmFjay5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfZm9nLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19mcmFncHJvZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfbGluZXMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX2xpbmV0ZW1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19sb2dpYy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfbWFza2luZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHNfcG9pbnRzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19wb2ludHRlbXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3NwYW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3NwYW50ZW1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc19zdGVuY2lsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190ZXhjb21iaW5lLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190ZXhmaWx0ZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHN3cmFzdFxzX3RyaWFuZ2xlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190cmlzcGFuLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc190cml0ZW1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rcc196b29tLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2hhZGVyX2FwaS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblxzaGFkZXJzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHNpbXBsZV9saXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfYnVpbHRpbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvZGVnZW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9mdW5jdGlvbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2NvbXBpbGVfb3BlcmF0aW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfY29tcGlsZV9zdHJ1Y3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19jb21waWxlX3ZhcmlhYmxlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfZW1pdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2lyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGFiZWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19saWJyYXJ5X25vaXNlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfbGluay5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX2xvZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX21lbS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3ByZXByb2Nlc3MuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHNoYWRlclxzbGFuZ1xzbGFuZ19wcmludC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3NpbXBsaWZ5LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfc3RvcmFnZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3R5cGVpbmZvLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzaGFkZXJcc2xhbmdcc2xhbmdfdXRpbGl0eS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc2hhZGVyXHNsYW5nXHNsYW5nX3ZhcnRhYmxlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfY29udGV4dC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0X3NldHVwXHNzX3RyaWFuZ2xlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdHJpdG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxzd3Jhc3Rfc2V0dXBcc3NfdmIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cc3RhdGUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cc3RlbmNpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0XHN3cmFzdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2Fcc3dyYXN0X3NldHVwXHN3cmFzdF9zZXR1cC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfY29udGV4dC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfcGlwZWxpbmUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2NsaXB0bXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZiX2xpZ2h0dG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdF92Yl9yZW5kZXJ0bXAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHRubFx0X3ZlcnRleC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdG5sXHRfdnBfYnVpbGQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Y29tcHJlc3MuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4ZW52cHJvZ3JhbS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhmb3JtYXQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4Zm9ybWF0X3RtcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhpbWFnZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx0ZXhvYmouaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXG1haW5cdGV4cmVuZGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleHN0YXRlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHRleHN0b3JlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx0bmxcdG5sLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHZhcnJheS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZiby5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19hdHRyaWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fYXR0cmliX3RtcC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19jb250ZXh0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVx2Ym9cdmJvX2V4ZWMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xtZXNhXHZib1x2Ym9fc2F2ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcdmJvXHZib19zcGxpdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx2ZXJzaW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcbWVzYVxtYWluXHZ0eGZtdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXG1lc2FcbWFpblx2dHhmbXRfdG1wLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvd2luZG93cy9WQzgvcHJvZ3MvZ2x1dC9nbHV0LnZjcHJvaiBiL3dpbmRvd3MvVkM4L3Byb2dzL2dsdXQvZ2x1dC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiMzI2NgotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvVkM4L3Byb2dzL2dsdXQvZ2x1dC52Y3Byb2oKQEAgLTAsMCArMSw0NDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJnbHV0Ig0KKwlQcm9qZWN0R1VJRD0iezAyMzRGMEQyLUM4QTYtNEM0RC05M0U3LTBFMjI0ODA0OUM2N30iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy9nbHV0LnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vLi4vLi4vaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfV0lORE9XUztfRExMO19VU1JETEw7R0xVVF9FWFBPUlRTO01FU0E7QlVJTERfR0wzMjtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9nbHV0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indpbm1tLmxpYiBtc3ZjcnRkLmxpYiBnZGkzMi5saWIgdXNlcjMyLmxpYiBvbGRuYW1lcy5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb3BlbmdsMzIubGliIGdsdTMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iRGVidWcvR0xVVDMyLkRMTCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uLy4uL21lc2EvRGVidWciDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9HTFVUMzIucGRiIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL0dMVVQzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iaWYgbm90IGV4aXN0IC4uXC4uXC4uXC4uXGxpYiBtZCAuLlwuLlwuLlwuLlxsaWImI3gwRDsmI3gwQTtjb3B5IERlYnVnXEdMVVQzMi5MSUIgLi5cLi5cLi5cLi5cbGliJiN4MEQ7JiN4MEE7Y29weSBEZWJ1Z1xHTFVUMzIuRExMIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgRGVidWdcR0xVVDMyLkRMTCAuLlwuLlwuLlwuLlxwcm9nc1xkZW1vcyYjeDBEOyYjeDBBOyINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS9nbHV0LnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi8uLi8uLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO19ETEw7X1VTUkRMTDtHTFVUX0VYUE9SVFM7TUVTQTtCVUlMRF9HTDMyO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9nbHV0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9wZW5nbDMyLmxpYiBnbHUzMi5saWIgdXNlcjMyLmxpYiB3aW5tbS5saWIgZ2RpMzIubGliIG1zdmNydC5saWIgb2xkbmFtZXMubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSJSZWxlYXNlL0dMVVQzMi5ETEwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLi8uLi9tZXNhL1JlbGVhc2UiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9HTFVUMzIucGRiIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXFJlbGVhc2UvR0xVVDMyLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJpZiBub3QgZXhpc3QgLi5cLi5cLi5cLi5cbGliIG1kIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgUmVsZWFzZVxHTFVUMzIuTElCIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2NvcHkgUmVsZWFzZVxHTFVUMzIuRExMIC4uXC4uXC4uXC4uXGxpYiYjeDBEOyYjeDBBO2lmIGV4aXN0IC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zIGNvcHkgUmVsZWFzZVxHTFVUMzIuRExMIC4uXC4uXC4uXC4uXHByb2dzXGRlbW9zJiN4MEQ7JiN4MEE7Ig0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0Xzh4MTMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0Xzl4MTUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2JpdG1hcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfYndpZHRoLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9jaW5kZXguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2NtYXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2N1cnNvci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZGlhbHMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2RzdHIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2V2ZW50LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9leHQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2ZjYi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfZnVsbHNjcm4uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2dhbWVtb2RlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9nZXQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2hlbDEwLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9oZWwxMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfaGVsMTguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2luaXQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2lucHV0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9qb3kuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X2tleS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfa2V5Y3RybC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfa2V5dXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21lc2EuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X21vZGlmaWVyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9tcm9tYW4uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X292ZXJsYXkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3JvbWFuLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9zaGFwZXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3NwYWNlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF9zdHJva2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3N3YXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3N3aWR0aC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfdGFibGV0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF90ZWFwb3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RyMTAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3RyMjQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3V0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0X3ZpZHJlc2l6ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfd2FycC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRfd2luLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dF93aW5taXNjLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfZ2x4LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfbWVudS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XHdpbjMyX3V0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl93aW5wcm9jLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcd2luMzJfeDExLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0Yml0bWFwLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlwuLlxzcmNcZ2x1dFxnbHhcZ2x1dGludC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cLi5cc3JjXGdsdXRcZ2x4XGdsdXRzdHJva2UuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxnbHV0d2luMzIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFxzdHJva2UuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl9nbHguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXC4uXHNyY1xnbHV0XGdseFx3aW4zMl94MTEuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCg==